From 2b7087c2473572eec774773e06e168decca6f753 Mon Sep 17 00:00:00 2001 From: Pieter van Ginkel Date: Mon, 7 Dec 2015 15:36:05 +0100 Subject: [PATCH 1/2] Replaced git command line usage with NGit. Removed all command line calls for the Git import and replaced with the NGit library to significantly increase the performance. --- Libraries/NGit/ICSharpCode.SharpZipLib.dll | Bin 0 -> 131584 bytes Libraries/NGit/Mono.Security.dll | Bin 0 -> 299520 bytes Libraries/NGit/NGit.dll | Bin 0 -> 973312 bytes Libraries/NGit/NGit.xml | 45097 +++++++++++++++++++ Libraries/NGit/NSch.dll | Bin 0 -> 268288 bytes Libraries/NGit/NSch.xml | 1204 + Libraries/NGit/Sharpen.dll | Bin 0 -> 127488 bytes Vss2Git/AbstractVcsWrapper.cs | 10 +- Vss2Git/GitWrapper.cs | 206 +- Vss2Git/Properties/Resources.Designer.cs | 2 +- Vss2Git/VcsExporter.cs | 19 +- Vss2Git/Vss2Git.csproj | 18 +- Vss2Git/app.config | 24 +- VssPhysicalLib/RecordException.cs | 54 +- VssPhysicalLib/RecordTruncatedException.cs | 70 +- 15 files changed, 46471 insertions(+), 233 deletions(-) create mode 100644 Libraries/NGit/ICSharpCode.SharpZipLib.dll create mode 100644 Libraries/NGit/Mono.Security.dll create mode 100644 Libraries/NGit/NGit.dll create mode 100644 Libraries/NGit/NGit.xml create mode 100644 Libraries/NGit/NSch.dll create mode 100644 Libraries/NGit/NSch.xml create mode 100644 Libraries/NGit/Sharpen.dll diff --git a/Libraries/NGit/ICSharpCode.SharpZipLib.dll b/Libraries/NGit/ICSharpCode.SharpZipLib.dll new file mode 100644 index 0000000000000000000000000000000000000000..6c6a5d4ad83fae361e4fe920e85fbeb292452e95 GIT binary patch literal 131584 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 nZX~fEV`SiF^hd5aI`!kmqB&7M literal 0 HcmV?d00001 diff --git a/Libraries/NGit/NGit.dll b/Libraries/NGit/NGit.dll new file mode 100644 index 0000000000000000000000000000000000000000..8ea8b3d2b52672e52ed36bae51bfb16a5b8f9a07 GIT binary patch literal 973312 zcmd4437lkAdG~+%-dnfU?wOkIsh+)>ffoA7>r&$;(j)pWDuegE(O|DVrv z-LpRDInQ~{bDr~@?eueRa-nlB;_truoclw*`nSt|ANc10(Id@28gU;l-*Lnr4n66P zBcAf?J>7|`JIUppXI(jQ@w2YFD%m%2(WMieYp$BubJfHtXPz^0Wpc@-TZV@#N2Q?8 zI@P%+4TbLDQRhA-EA1W^98n#rI`@qc=VBi^|4ZBxaxc-(Qga6$Zv_Z{`?rgD!Z+Qy zgnI3IxsvLC@0)skYIi+w&ouWE_YM)_@P89aT?c4Z57?w?O7xs@H~&YE!UKpOTypZB!CHhtZXpTFjZ7k*^t z^56aTn}7P=&3jK<`Q7I)8`*uu5&!g~i#{^B=GFB#UA*B5C;avw9&yxd*FF1FZ+XKJ zkNV{uYrZtP_cgD2XZXh-`s7#M_uP;FuyyEFe|+ZOO#J)_8@}?7#p35)`tzs#-Mf$6 z@t42)n{A&w_o~-?@NFM^--~wr)7RIo{pOFJdf6#UUbeNg`I%EM{7Lnm)!PF1bPybJ zuI_?lnRAsD$1Z8Myz}0uaqm!jsNrg*%>~z}wzs)Pr9I|?I2k47H(KkKxOk(B$9Gra zEC)%yKVF?DxKW*Vt~lw2jGvBjlV`a2AVrOCE4XROr1|PD3a6W`djra;7B@e_wSKX} z#WRO$E?RK|I1SZG4N|mlwy(b#|Dn=&v(@iyEeDZqgP;9D7_|!YfJ)oNlfWO{7P~fI z*tG7b(hLk11v4}izZLtX)8K{)qArnX&e3g=djk1jos1?aiqvg=isG%HIBqBomm9&M zaz7reKNYOF5#PAS5URFC2Dch~o(WuVtW$firL)GBAY8ZGJF7w1T$;LTxL2g^VcZj` zdo+R`aj{gcdz42D^TQhjES&Dn#4g_N>IKU3G#_$LI^7LtG=C~(Q)1n%Bk{e#aCvi; zjIFh_VXgg$MuqlW<>FNr(U#$c@!d;@4qE$OSSgP0uDas7t#KIL8;Kpr`d9I~;`FL> zo6QR@seti)!tof;jawYVGmnL=XdEx*8RMa*2LC zsQI8ZPJ4<(v+zh1M6)zu6clD@kti66W}zV8!YsAn8_yQ`y2;UPL)M@1(QY%!YOF8{ zkBbFqVZvLqe@uH0rEvv!9B~9HjzZ(j;aK~~V8)7^u@YyjJg7@)Gb*e5-XSR2M<0TVtxuTIpgJz&aaUZseRb6DY4Ey;k7F09k*?x#Ml8mQ0s?nTmBT`uX>WySp_ zdQ`6-EAKbas$LaV^(RUjMZC-CiQkbaq|D{mKz|S`=lx+n z`QVkh3$GzxFm`X~TlHcW?o&X;_n+8$(e~3kSI5TN+jn@@jg5h~Z}OywjZwF+^L37m zA-6B}m5Z&@_>rXAj*v4Z4~72^!2|It`Fz9c5nFJVFRQhcdZfL0-Ms-lXUr*1wd}5- zvsI_wN8XqMRk8l$&83#UepveUOxy$^_2q%oD;7_EdfZ&$D>IOKV)4|?7;$FR^r;6? z?bUZRI1j779fq{4gBI-3;n3LPITq z(22ZoP)n%$dm*5f(75J1yIKPAhflx0C30Tq<1fYb@mIm2%838qlNA@&N~c0R)0Ct( zG3L4n{wDcrA4^jya|IQ_qgZJ(EE#&0_8MG5tQk{W37umx1UlAqo3SQx`ol(`)Ro_daR$g z7Tt$4N>th>!+mtvpar{TN{MufLwTKio1_x9f0VEqT$|P)m#Yg>oS#-A7pMzT>`d#? zlcWohz~#m$JrSxTd3_>x{o(k&ZXrRg%y5;=Tu{WB8J-fB3u2GSaFmo>5IdToC-InL zHZZ1#K|&2QE~Pv@Aory2<-9&dUEovrd2`rk7g2xEAJd^+Fk8f1zYDKX(|NgwX1bJ) z=o@pLH744y!3@ds81mS^&~s!$C$Bg>DmnM4qvjrUhTJ3Sd(Wf`k%>>v;h}D*Q?>q+ z25}*L;9+Kdlq;_mr16ZFo|IVv21QRjA22x&5D)TgVKkmX!?_{_gmYyI0;h@-Zf~Q9 zFILaiQ6gPh&)lPW<{s5E_Xw8vO#U9^M9w5@L@8;#xpQ6a@{yB|q=XjD5+`ew*l-Em zISXiXv>`)JNNJS%jRb~M7NE)+URl6ITF;gR^c6@`t3ZuYyD1M{&c>-XWaE^zjb+j> zR95x8PvcClOdCjgCE7?~wD5_or)f^~M9N@d0B^3{U1_gimbGDgx-!Rb5k<`<7aV*` zwCa+jfs4aq%bJ(*U%EKV`Il`Jc}v{f_7>u8+D7=_`?_ov@tRhbr$Ox27Evk+8_iZS zv1sTKgl<&51BW8+kY~N|If#A!R6vMdg}40+8J~?NHg<;@O}sCsN$OpZwnFNiNEy|< zD*JxvLH9Iz-2B#uLXWo&(8JoYHwIG}WAHK1W8oM)q_*&5b)sXwQYi@ zwmDXKsGOj6B&gj9l7aeHrL}<{uQbrR_9?v5E(hKBF>6UHu46@mUvL ze95JkZF9!}Z@YUqv!UbN32w@r=$_>+au>Tx+@8^re;?)>jz*!*D>aDciq zW|-Qx;m+UY!D^q$b$$-VoGfsfcM=GmH|}YcGv+i2`lz6BuzC6R?ZNoL<{lK76$hL9 zwr>bl9&BEM0<%hi^U#f*Ogz%^8EefZa*wzR&JV4 z(RsdIl#AL!dyJW7XA^)QP6B+MF^65yJ&u4`g{F~V3+-NNW3O_uPn`iQv||qo1#kz$ zQE~#=hTHXWGKB*GadIM#jjo&!T_M#^=9iW!4Og+8plny%_tZZ`wp6!~jU+(2HIMNY zPx0y_DGQqAWoft>Zj46lV;lKGZ_nXy-at;ONk4yNxA}AkoHPECDyZOVN2d z^ta!x2hOMHMf06}Kl##jSM;L!9{s@i6rJajto8ie+D|`8(5ZYR;iBccXhD<(>X)2C zl&2(Ss0}WhyAFYq%#zC}OyCmO!TMQpDrq;;%E@C7&-9x6&-Az~(`o&go=i#CAD#(w zSKN9$$y!g~XEbWiXIIywdf^sE= z-~UfDHoEq8>ec8~pCCUv@8LYZ zgK=1Fz%+p_@*qbN4nBkbD#!IXQ@~BUF*Lu$l>t?l79cey_NSM;Rzno3KT19_jCo%3Fyy z*Hh);i6{?#mBG&kK-ZyCXKk~&n&(wU8u^hFs@~meoJwp>KwM43l^0FzpC74 z!x5}x2uzPFuzT_ z*k!;~+wgG{M&B9fD;`HkN4<-eSKNA%i-d>W)T@1?H2Lg!v9 z*{4FaY^Ct-b6_XdIFhUAJ#>ZRYH7Qlgj(xYq9nWsafhNomUrhAsH0Z>|9uuXiTm&&@^S$~I(`*DsM|dZO?5?^gG<7R%-cTY|CH)u0Nf z$xjB|&$Eg(i`PJ!QfSDQ@`Mc z=$$(cc*irgOiz6mrx95538YM^xjxxLxf>f5SL#5}tCPL*mXhc2sZQOd^ra5$kw#3t z+lPQd7IL!>feW$_H8;8Vq#^ANlR}j^!fb>huTUA|6v>>zif^CIBG!a2wQZ_ZbVS%M7@mB$MM%dlE_xRzb4eDT;tq-$-&-sCXh=Ou;#PuADzVYLe9H=cpW``>?&2o+tMS)f zXU<)FYpkjhxYXgQ;DQNpG3TW2SyAJz*vJY{hpBj!kXmB-KAd7<-98ESXg!yhbBE`* zZA|6aJE7T1TeenDfNJ#^ven}iF+csH4C&=%*SB2l9=GjQ8^1j*OFddXKWj_T5-xWS z%V^npg`#>>9^q7NKWUCiMscg-5w@w&c(r{TTJ%1MRh?({=NtEy9MN9mf@J?XyUX_$ zY)Pj!fO2EQ3%#{>+b1dO|4)`9ebnZ^5x!Rjf;LghM{7Ds7 zJ??ENI6<^jl70MCJ!a>CnP2%A12l?<>X8wyR*JjuR%O2=zo*@h8y#~DA#O@UB@MAE8D}=lE^Uf6^)?x!C^~r2+IMrQY{<3al6@V!7oJP^o2QUM254K# z0Z-03V6H=;xJ^7x2;#j68+;M?Wwhn$`r5`+`(#{ri<$vt+2?c_^|q zSL#k%!8)FoZC8opi3WtW#m#7365e$3&7)`|@{=KXk=oX=#x+Md5&Es5&;)*HS7Rv$ z(hSSOW7sB=c3vM?BybCX#T)nRzTqawT*EUQH%g6i>xHyEVxUwe(tApzrlD*slr@9B zT!vfgI*JREU$LJi)sHj|Q@{TB#ru(omT<07SDVM0+xD%4a4IK+1UAG@@`k&k!S+vuD!=D%UtI-_U5Vtn)#7= zlJjcIg4O}B>AY1U<;A!vZtAsU_emJ!QYg3%gEEmP=|OpC4@&zCi`VGrLCCcz2u1Wj zyuS|wqCGP7Dj=jv#|b@}DnBnJ!RBJ;!=!H)I-lm_(paxcFkbjIfhAEoJX}Tfl9%w) zya3%vBAXpuJ)m%$(N)`y+6hFUpvPL6HXCIj^u5UJh1d)Z=LH6@)h-pE$CVdwY5#YW_< zwbDo-xt>&hYn;*H?OE9Nk)ltQ?xaNN)_{15Yac@?6i~f?JeZyq$EP<`TZ}`9LzhD` z5VyOmjIDVYxni$@`rRUJxnTucj;f0pgkBFFX!pMGqg{7|`blm?vugEvRG3w($0#<| z#=Z)}uKk$%OA5WB*{@sPe!|V(DKKT~ISeeumNwEjCzoOMA#5R@Invb*@k1cl=}u7F z1wDQajm*2X+0-+3(MPtHSj*UOp?-vZ#QGI^S)#vCrWQ4IwHQWYN!regJ&(3stL@4D z_~MMJ(3gnKdX(ncFg&ec+(k2!`_I@h*~s?2s;^n-&C3l3tyvr$I9AZWp?edtC;)wf zn51{&yW-Sc@Mzi_F+a@wIZ@Il#3X2SKETf+iB;ol8u3^TcF7$yD-GK`&rjaSsI)#~ zG3&wx^+M^EK9!Hq6d|saI$uK8CCHh|rs33su&Vgoo*DmS6I>UUJnZs<7{H(J!MmwH z7g8zO)g0|ijO_TJk5-*GEjNp3THnhkm@cidbNJ;HC{?pY+Dn>^a}$hb#Tjv#WP}ZW zBHa!abpK5Cu~a@mM%J}G0szahiUKK-LH918Wr^uC8MUk`{c+Yl3P`iY%}R=6pGe%% zWSV?GQZe=uF~aVp2Xz|ZO(xpK|-^LKebkp zX1uw+h4K=c9L$or=J`rzB+cx?pR1xwCg_p-Q=B{v-UA6-HZ|Ju3i-+<>yuV6ZVA{F z`XLGuUT;x>V(zlBc<1ZlV0FT*;#*wVM=?BGCs;=0__Wyqd`9aKCUsqVDKHz$eKo}9 z2+0iVcQaM;SPL^u7o+ji=YD(NeO^kX0y)9jX8UaqR=lT;vu&@RngW{Z+J3Ky zr3qX0MG`$Z6@uQ3mqM4k-bFj@G`==j>Dw(ZMy?k9K!wQ7a6d>@Jnqf&{bD?kGVvQ3 zr~Uy%n-j$?m1fz;dI`4qTGvLudk8?+=RlF#9%y^lVh|Y=j`B0lFTezS76GQG-Xh@9 z93O7KqP@F#SL+t&xp_%*i;&wqfZQ;m{;pJbFw=M_P~G_O)VF1VGa-_XeHR}_%Tv_{ z9!j+zkyjgO(ID3%Ro=nWfQG&He+UplozvV|+_I#3q^e#SsCtjcTNf!&%S=l>IX;v3 zG-|#dD@41S(X>)*Zce8nb~a&voTs|1MEHa`x^L2)-tEmPxj*}WjVN+|e30D8WafFu z)suR>%g)rF_bATc6|a72N_I43%yWEaR)1E|LYAKTgeYI>oAR}sc4iMG|9;+kGp4_m zT>bMzn(zvOLd*6@SGp?`s}@jlh&d^v%%Pq7LQ(>Rv@=X z_79JZs%t)@hxm@qi&s47)kZ087RHC>`Yn4gXcd|lZ5!eD8C%Yh zd&~Crg?z8tay-BLwybPFIc=ab^J=>(lc;esRSMes*$3{sPdj16PRHT)#kil5hCdy5 zYMyUDF@<=0ugMuE8zq0jD6@l_RBx{DRf!3P+G6QYyAqeO?m9jiO${4kSmSPEa?QRD zO$wb&!Ov}&3Fm<9KsIU}n7}o8Zf|iTVLYnL9ziJc7TF1z2f0Uxrx2J54mQlJ=d+Y&k9KM9@o7soc@Y}`uhxKr6|%Jr z9VTJK#W(o`%~M;<8sZicZbHlkAYB%OwJ%0%ogZgum6fuv^&XN`=W!;h2y)EvidJ@j zwWT^r<@qO@&?>%?FkP!-oMqQ}v5_o6skfTc25O?iOn#19a_3)~ z)g`bqYbOhz@R~;r_3aHVxUkYbIlN{mft!|w`}9qYVD5l6B|Qe?2utO?U{25l-45|# zas$7~Fh4eoz9eUgxg%-kS@4L0xohOy!jBpxTT3e&U1p9Z*s^MjW@Pr~m_jVx30xG< zDn36K^=O}mIan`Gl{^-%JhO_@+}ZD+PSbC?|MZILrGJcvFRW9XydBJkkKcf8FyMSg zXs8{Et$HLjIl7*&Pq*UmbmP%s8693$7N612(@1x3 zL{r>j>(sJ0oZ|B*D0-Cv5J&bvByS_Kx@;&l_K2v5Qh1in_I}+d8Wh}xz&y1_gUqT+ znJmAC$w$e{=(#Hee&e3;-M*?G--eEi2=UCY8)x2>V6=~-d*|G+3ut}}Su=VEI@9Cr zQ`Vk}n%qI*t+z|Yh>0c<9HDn*?fh5|N3qs!>hm`ZIoV{GYrKP;S|-O97I$wIHCSXm zinM+|w&q93HVxw+AVr*PP&FlkEtKGo5HMP3jK=MUv;8S%VJDs=(c$?^3$n5_wOh(| zy`ZMEb;i%ca~l_CEe6SlC?t70GDX8X7V_ks`s8TDa}QfI8+N`2%I0frJ&-|AYpy4N zd}|@7ls>I@QL3H(%!rebA;%<0Zlg@ivjnceB+mi{&}KoT%p|9aFlIF=PTs>ewVi2> zsDESpT}m6hkUwOB`o8V2so_4&+B5lM%E@Je_Rl@u+S7FGxbw|?dK`Ct(C7YH&mEX} z!5aE+gvn%lv?_iKV4a`x#(s*j7xdsNV_w@Ud93zI!X}-{)W3#_hyzCgqjL_4jkyk} z`*m0+Ougz&o#*6U^^gvXk;aPiJ1qI8UU9F^nGCr*;0gWfyq(AcTb1nna&43AHo0iB zsPiScnAb&}ugk@1K-BrRTnNLc^8>k#lj|399WNJS`_%_dkZZYI*y5tjYPqn8MV$?D zVaJF%C(6alFX}u|u9M_?s$6J4Q74fLy(8+pST3}PsPj&_cFFZkxlWerCvq`XMVf^W{RirM0BLM4h)Qj2;qoJ|Nc<nU>WlDott|$ z(XIEwh1GeM9{i;0G$zwtM`EsGDGrrvF+1+QkCgk->bx$*uNzt7#PZ0Q$R)sqGK@b} zjMTPgCLpNFpG4DI{@O>mx#v)3rTsWJccnQV>E^C5$8m1%DsyZ~5&3+sii1d?iAQ$c zzi(3lr~0$9X^RId8x(!n&&|rdIx8E^lBoY_*;;4070hUT=vkP#iv4$$Fg{o-H7}Yz zRn;HnkM>|Q%)Xr;<2!YRx>(3KcCdNH_BCO=0!OlaG>li`xM(}MSM5HSp2uW*%Ce$w zmr>1io-4CbAzrh-i>U_pe5V4cxYE{-{7HLDfmF+$OQ0L)%h2u886K$eChwF!YiutCoH7L z!Vrd@!--~WYxY#tNK|_@Kd<3$6!$^nVZRnm--nMhm+<4Z4Va`6pTVIzdqBKxu(9(m z6_(=1r>pJ9YHuyTIBC$lwzowmn|u7j;M^m~=N{P6H1{Zd<1MTrO=spUo0fkl+cYR$ z{&LDjqST#@L_zEK$j1iK5AdnR$p`st8i}R#$T-OVe56{(Ap83S*Gg<4@P=N$t3dk% zmb;?WVmK}*A10A2XPXDkI{7hA)O_s<*tkTwonirrB9YMs2VO7NsdBwRu4%b`SFS`ZY{Ae}t~bf`Ub$|O>(jVe z?`E_0fj8rI&9T9pio=r#&T%# zS#S{A2H81{esdoML;`=rvv0*q)QJk!aJa$;GhtKkRs~CE@Y`T#nE++MV{?zdW1IbE z-+`-tUR|{QJ|ozv?mTdoSilFu)mKn`1$`i#kwD=BZ{b_IcY*VPx8NVBZ#D-zOX;qpZ;0vuISz^Mo|k{d#>z$Uw*a4#Ji9+E4x3CUyU^JkLLf8{AxUF_wnve z8%2~f?zFL|O9$7r={or`d1L9c8%L1;Ua|XLJQ$k@V`8c%8=(QwE z8_Xz}3n?taT+aK2*-sEou21R{&EDoSXMOw}FB24L8P7$r_y<}fNbc0BgCO}QHIEE5 zV+O&SYLwjD*u-B?F&LIDK_+Bd-E#gq&6goOtPIhU$)omJOCBj4+k;soz0YjGm3A~{ z$+Zit^%dYI|7y4xO}CT(X}xl7V;m5)-R2*aN(LnXmQ{mr%q~Il7j}+9c>DWnj1Pk3 zH>4+(l{HB{lYjTc9` zCF>|gT;tJ8i#5cRH0=+oDCg-a-|yLA8T4LZ=dJl>tM>h0?cnL0{09kI)V;5tM|OV$ zX`pxC-7Q!q9~EA+nlke{CE96&g!>e1Z42NGvXrbWeB8}rRt|VaaPi2Z9D;cN7Ykvr3^EPaNOUeVkCFh*vRRU{!!d(QZ zFp)^8wF?&KW|dw16Y30|g9m_VEbqB!W%5T_O=z>`p}JCLf7`)~dnyAv4(?bhY0Eu%EFQ-pj!W9z;4@ zGi3Yd&o_Q(%!;r?3O=06@qUliT^$O2q{5D7#kZiK#tfBkFE?ZVWqb zzO+~z_o>sB#{Rnpipl2%mQ%wgK%51LH-_7c7sc+8M2=EdRjD4$+`-4%cC;`M#tsB) z&E9s*arXagnE4B3E7<44S$QxY+tHpGQEKKJ{9tO=rlHrS)JepJMl(0hfiO>-F9=l@ z{U)SSrYOB8sobEiN@3w})oczYwXOX}4MSePUXm8UjI}MxByBEKD zAfEF#Un19NrC!Nb&u`Go0ue4#dH2hFYo+8*`3z6UDz4EC0tr2ug+h);x5K0w3C}fr7&-if|x0A2p*vQwXj*_n_!oyDf9Cr(O*Jj0IH;2X& z$XwZnG8D+UkNjU!(mUFPi;HG2H z?J&BvZkW7{=FRj3KfW$V6D4oY5@{^!jo&uzcrJNMmcrLz2W4GoGCcV!kO=J8wv>WT zhU=)dZ+)9+u4`?5S3`Jg3TLig#de0}S%NbT3$k=NLoeg(m@7_Rh39jshL`2GrV=Kc zbFu>q(iPqe4i_nJlzc;)6L$?>i>SV(7N&>fZ10LJVhtB|9)@r!nO0=i@3F(VOfQj^ z#A(hf06^^Mux-if zG{`F*J7t{qIwVp`H^F*nhmFYoAdKW`Xy+v_QND~4k~Ya-^HXiFFDBo?p-mY*9$^C& zaN}fLM1s+2B(cZ0=9i|b9cLEdQSH(fPJZ9RsN41!+fHC*{te;qt#rEEA$~N2w2M;x zi$g%0ft=nxU_E4G(asBxw|>e*-xa+`){fzj)QAvXLQ>qi-eA171P}72y*i8W2^HDMBH1!yqu9i*M=x=E&z)u9 ziKvD?vy5cY|9!nra<$VW!bIzWTR|Va%<7$uU8;WaF)?jQi!KX8akUGDOcD652Ka5yqWcw;PW3E;##w&`+ z_b4;@p_2SNgn?nd2fU3XT{FnpjZ!j?w>>n*VoV*Xe;?oYbSi;A)86Zf^+FbUOY$vX zS?R#;3pY0IenFKh+T@|=XLKk#R!7%9Vjz9;9geWAroTVSHsx ze|-9uw7Xa{`#AyN;|qGudxyIB5i(k2=u9V-5Kv4ktap6a@2=KqL#suJ$dsG8lJY^R zWqH))MY1ZA(rBm-FLXZ}Cw~i-=`_C)3MJbl^izevx%JZI$;f(G#N_yHO1+golrH9}sz{Y@qy2G<8&gdV&2Dw;amvY$?MD%J^fQh3DX)t*M1Ns~{Zh z%)~0zZElI!Jp=PgR@h~fY@64?3wF_LEyY;N{Am|rzmeVq=f?oLqI#yl%rrD-*B|o=(icfbt9nr%3ZO4-TR|AXov3fj= zdK~mOibk2kmRuxB3OZl-xJ4^P?3bvgRnkk7g5zWdWbuI-LJR_DrI>c7XFdu}y>~BV z_st9$jJdaZK=?@DpoZ#Wf+$!%i%J{u`LaGU%95B=;g#}qm%NiT_w z*ZAXm2p#Ja3XGGiGhpkwLvTm9X7r-KCM7rSx$xPu3{Fun9@uci^{yAs+Kgk8HX5SQ z1NTR6#W#G{2)L#BxSx8r<_!qH|Nqi*1mX4Igyfu)g!KPy8s6qcznanT!*1L6do-l+ zbS8fRKQ7;Eqh7#QL*QWy7$v`jhkA@O$VZwpiz&S(V1m(W0?B_ZurV1vk#8$EFU2c?+!_pDQRXq=;QninwK!@6!1r|m`1yz`2M^^B6g1%nDj{gm(C z3HQ}ocJ4iQz<2&`PlQ*;QOY+?=4Y$6RxSacUAW9LgXNv27fsCYMhdCKbLT z4Gc|AnP>`ndRv-kq0j=D-&-yiGZ+9LKtOST)dUn;`AVOzZ1QO|DtU2KhYqlNWQN{8 zY*_$Ou%s0^j1(wK_)59#a>eYPMK6;+?RNZI)}KD+&I*ShpVz%F;Cq$m*MO<+M*?8p zS{YftuN6INSp9mKVQCN@=@+FOv0{!&x&grJqHEnTXLvj`uEn&SjccLjYF4u}f_SDr zZ%=-ga4+!uUZ7fZLCRiWUrLQcIV|ya?h%9M9t|wHM=YLu#5UgJs~sj2LL79(y~*FJ z3Gf)tnz3Rb%W_iF>Nu^NP{Ky?b89wE<4)Ha_I$+OPfFJaZH=y^_F&$Wuw^J)43X~s z19Yy$;*w*D5wA+6D`U$jPkoWdAlW_;K2G=t6&|+Q0u>uOV(s&X+%5Mwa#3cJ6qK^O zkSy%s^xY*dL@^f-(;KIIqw}+BeSL^?kG~IH`ua;c&RY>$)lheft!HiKQeo?SeN&}A zOnw1}xGAPX6#JnZX6dpEvgwnh-AxtF8LYx5$7eIUnc04Yu%Ym(7VSLsr&eX?u)BjJ8~&nXyMQj==6US+eiSTZ%FR>wJXRkf{R zT1Bg1lqyf%EwofOV|APRoi`kt>>G{B6Mq+?Vq|v*7^+L9FGp#_w9U}UzD;*rFG${s zRW{%U6cC$KVuMTux5V0r%ZQLbGn`k_%{;yitT^jJMVtci~+mBdU&>hf>89{HNpX=_CJD$?exw#+OZzH6` z_=Jaw;~lIiS05^J?Xd~KW1!ce;>ylW3+2LNlU2T1TK`P7u4h^|bf~zxbE>6SGthAT zDb{vQw-j)y1eWK4Vzb;i$AX&-X_8%8c(pU_!|8eAnRTsSQre+nbGUPXk6@ipA}!0X zq;shchxsMlvhaH6IX--u@9^;oM!0rJAT{LkSpNVDtkG@&~_gQG1VtXqxi98wDLzWdUtfz$1WY4Cm5 z0>sZ4WQdY{e*hSixEPGj-gn;si~$~3(_0;$(3_yOrf3!|UTW>^E#UlIqe*Bg+NIL%YEx%0BXBDQGTxGJ z#Z@1&1Pe1xepw^pX91*9R2bwVuOQ|gVdy=Rhw|DQvc6I)vikf`byI3Ld3@ixuGs>` zdsS#MEt;g8fW(!uS3iRArz_mAl`pd1+L?v-(`D5ASyKgu+WF1;0*mFkzXp?_`zs-Z zO)YaWsm+{7#LS6!&zwlo%=!JE^By@{NUw^9^;vAv+|87H#%#_Qj94`1tWel}F2}E8 zJBc;>ZIZ|a3?}B}$*J!s$lGjh22bf5|1aRFO&au?9KYy6@MF(NXvFg}gUg6gT&YT< zVRrI_70+zFJap3xejT+R^9m6r`76jW`y*W5-~CUH)m7s0B*4ax;1M}wWaE}EO!*9K z3P?&svS7?__pPK)%H}6lfVzK+;m8LOB074{s_wtiBvsuVYv7*X3SPjNPfLu-o%{j0 zmxhkBqUSct=SBY0`Zu!H!V&cT7pUhJ!&3JG9C}HHMW|p#43q(0BE?JrX>4)4I}3u| z7mTmy{yny~S;pRobo%%hu7IB+S%Q9vN%l=rMB;`zQ+pVCtl>Kv#VfRrtc_7WFYS?9 zcl#AcYvA9sgatZ|Frs+MT4akxA{{%_X2h1fpC?QhmfIVrG=@4eVJgWiaIzZgw8h4+ z0dy0F%{%#0hCTwxgR@NPDgCh^!SzbL!ePD{b;5x( zZCy#fNjB-P(BOH!gv287dcdASHfjYe3~9ku{~d(Ag+wV4#}h76Ftt5HSABdSx!NVE zLPkN{u^UTp&QcuIO;Amd?69|5Hu)Dd^$&3QI<=ZqcGD@Ia^7=-r?TN zG0`rxCTQi}UYnzUvCr2Svz5lI?XI!(t;fS=IZaLk&hvcu zk(6V1LssJEmgGMr*K}hAmFJWrbu^ni#<1p5M3bjtb$VKN8s!@{rga)w|F=c-*!kEOQ$^ND}H;=`n(dd1_u zW6C(e1z^LRWo{(H#8feGV?-~Rr^w-rQX{DoZn7s&J?b~(#w;u-?CY#y_`8n>>hX|q zzF|?EADhyH)&0MNSiU+otfQT2ujSv{r+LYFvpkk+G#vb zpK>BBlzmKg1;)hHJk;|&Sk#A;VN@Th((mOclu2X5$Ph?g=!MXXf|40L z^Nq3E{IdK`2yTJ9SFpaP3!%N;Ds*Q)*_QC3C--21gVC66 zk7^07|4!~xj-Yk9CkKHjTrH-ppk#Wd?Eg>4z2CP@AMUkft{?YRcDn|hZDk+kTsCHy z2Zwlnc8r&3mx|~l;t7@%SEO@>>&d71b?zORqSze*k^L+y9nbJ0gqSUOCo_SotT|yH z>gL~ZD+)*6#;e5n+jyuVx+=$>kiCd+`vn?>AVS15cTwvKV9d(bezwBP1L5+u&r&$V z=u0o31g(E1s0W9x9a+AGeRDFYJM^czX}XJVN+lMaFr-(jcrB^P_vq2wKnI zG5m3NaG;x)-37b`c+rIwX%qO}efXEk&k1>8Fx!gO$;cAulZ=e-5v|7+!6pn0bnfUY9}T#k&k5&)a3tc*`yW z#KUzx7*Xq*6jkG)T_E~g<00FhV(-$%i##&Suo50hw+lAtKiWO>r&3H)a8>Gkfv+{c zs`y&&_Q+7=y;bvCBZO8n^IL1+Uy;UJv*4dd{c0aKU)#uT(q=1tUbuI+@mXiP+QB|s z63~&Gy;r6fbjCqd=UrZ;I@6iBPs;yaWNaW}OLvxp2e5JZJ=u}QSvO0#e_)0D2M?!gC z>LjnmBb!PrFi+8*tXMZ6Y020&L^93@9&A2xFxfkV4olHn%3(2o3oC>1Qo%s+2xd@5 zn9xw*M(?)cs!Q22vzy(-ULxAE_ERDcE9!@3F+2PlfjvO>WT3nTYXAxsv^=7xw?*z0 z<~GnmV{91D{j+dd0Ztp(dZ^)=mwb?>=e6 zN|qLR7|%gpmST2mi_?Q-T$^Wv$d=DA$?^Coq5rZtemnE5D&`drh~JrcTHs;GSggKR z=4l=r-YfI8w!a$;`{>DRcro}N$n!inS?vhxhZoH1<52+VVGxr!7~r_JLG- zN=<1|$9s56-=N(kw;zm{8**S?XAA6JW$TM`9{^@x%LsbOGiYvgUIW%xS8%U^PDr=9 zYpWdih}X>hsK+J+d85=joxNwxT%g*Xrk`#tjd1&GzQ5&mJ$eqx?7YBQ8K&7r;?}F+ z15N^O^r^EH1q-K;41VvyW8F!M{BSQ4Uc7}@p+7apc31sE1^Y-&WXDpvJx2>wv0b1U z*fp^Shno|uMNo?E-eFf?y|nV8TB+RJHod!Mv(C@!-f(RZ>m~D0UO|}|6fS=42jb_e zU(+2N>0x2*4bogTZtG$uqq6M?G?(Y;9BF{o;y}HbXi`A0$rEtzonLR=%IuMC=$0J18TaTie?RF+^WB!` z!*Egq@Nm5_8X4!n%r-qqQ{LT6X+4GD9d~eVrIZTkenaj$@eThvKVx0WA12qJV>i)w zuSN{JU&ebS^6k7`CO1YMe}G8v{py=@$#;{nQJqX7YMKXb(qVy2zZ#kK}a(Vp<53rI>CX%3W;C zYtwU7;qnB#W^cVbbVm?(?I7I9?rS?7FzNi*4}$)}&kqHX&7$}G}LZ`JWJD#PQ#q@*I9*mfaeYuco_I;275Lf35iGpiiV+p~*+u2>>TZkzKf9PXk)3qAlYu-7GbE$V? zbT3Ml7*Azec7Qop-a7}%E82|K;}X73?Z*$3G_@5!Ow0^giu@of?l>HP)&JgZK37AJ zS>`$?)8_+kvhi~>6CRCz0NRuC)U56_pv}jqd^$6u@~WpMWvYETA5-nqsn}t)*PM*V zY);05Ccsv|RL?o(R6j5KOwV%RCxVfmrxyGil^fe_zBf{^*{Pe^HWn^0ncJ$I zhMW1JcYHgV#XdyBS*#;$n4N``>Dg~@ulF)zMv1H<1M>PX`{qk}vM`sAhlf$Tmw&;G zippUsoOv8N;*2m!!~J<)>|*(vYv(-pE?;5&1l*b(b$vv7s5MAFMd-jO*z|JtzC+D^ z-S^`pq+Ib)RxfKae=a-^Gh3doE3$-hz&;=P?kt8gBbTM^tDC~}x}m%G+qM7aWqXS$ z*QXZ5FtR&=Qj6_zcqX4FgHsWAf3Teoem3R4%+s_)e8pRw;tM!xQ^sGzqE)tsB|~i@ zGOb2uez=z#rFttG5lMMZ>z%+^yI2O~_ciMH z^8PwnLhHYM6~#F3D{8R=wJoc*Q-IL&%mY^V)0oFobVp;uSDT%3grzt0x=)JoLX0`m z3o-jD@-7k2^#x@25{VbZOE%{VtjxSWEFrw)>nmI!lttzI_X>;avU}d|wh@ga-(ERD zBb9tOjY@|Rps(dHwEPg%4PiQqV4e-k>pV>H61$J|xp7YwW6MRJHJRK!j3ZFSKEs~= zu#c^mUAm{m^zLaF-zrI)t6v&-SV%KqZyI!+GD^|Z_mAJ~cAS^7;X zgG0S7rFp&NA|#2jx6}NQhzU30ob8LI11Vb5d1-)Np2=W%z0WI<2^UO4_!+rVek$0a zg~>bwTLY_7^1Yq{Aex*7j2jF_@;8d%4&pCrBG?ctrlLAyhl4kiT3_ykH_~8xXXejj zm57r&`Pjbibgi-A-T>?y9~^eH2;?C74%k%Nk8*`#BjR1Ky{#1>vPTEVIKGq4)V09F z6!KDrj4sNoU4UHj2b!bO-sz<*N3qp4FqZseABO2--hghzUci4I%cl?UOP>x#+%E>= z{JUYEuH&KIN^1L~v%cCNzbZ_wW3Tf-{37l0qyBb@ji=LggZ83xcQrM%9pYAsrcgg6 zkIUICV>kK*|1nhmHPIQbAdj>AJ^qPcBd^ES_jjfq>A0OJ9&_+_`DFFsM9|^!dVBCN zUef*?k8=vcZyGfqq9+rdf%s%TFT!NbLL79~t?@fuEl5;h(Nwg>l21y+ARNh9_^laSUR^HQDYwY&;6p19y`slAL zt%#qD{+b^)fq9eR71}l8^e9VHo5%QA?7o~u{QcQ_q^MXKb>+uVl-3pLzq?a0#@=B)G*wDCB4dwTrNTh90pqoj11##Z=Z3pY>}G?#Ja5Ir8FpNG z^Otz|=%$)0Ug_%~n=G+fY=!n**^R&(ssy_9 zI=gwx%j;~>=pr;cS^y~FEQ*ho_)&HS^zl?DP;A<7hV1T%4W3To9fV=lC;DtFeY(1I zi_0gG{fM~NDUO99Z+H{cMp%U<2a4g; z7nC_lw&T+c?MujBokHp>6vb~TXA%^(PS>(jY8<*df-h#&hq0M#Jx=;aIRUfGQ0SSm zRBj!?lI=!Hj{V74h5tE^4%s!+@|1|dVxe_<9uNBd0%XV2;rUFxO>IDDxvA?+jF?OkZLF^c*q7>qw9)vR$^j^#hX8o8*bFs;?-p>! zZ2TuC2RyCM^|W5@-wx1b3CUo87uo9-7wV=ObgsC&fp0pV`Z2}xL0X)hPs@10=Z6LR z^KZ=Z`$56~YUr>R4)X0eFs4>DjWHia78sM|LsA=F+o&gWkdC6zhAOTcAgR7JRh>b^V>i@k0FT-_s8PUMOMjwF$jbv{aeR? z9l1n?t>#4XpxR0Dpx7aKvNlTPj^gt2G#5$nP~twhGq4}u#|1MeXwh`99-;QOx!<+6 z*SVz1-p1ar^>7?sm6P7BEb;DH`|M5moVSz6_eRe%iV0?X3E8xfb=*q(2p^ilFx_2g zOX&(#T8DzYhYVkf{}#Y91MKo@`{8zOs#0hj2XeHoiu1`sE}43vI>uqRdM$hr-a~8f zIcHH+?U{mLMlP%3Bxaes70_4J3Mh3l%P^J=+8NUJP^!E=B)`-4P_{f=eJM>ZI7aMV zJ9xb-&8PS+`L|s8#Ki=^cxTx61EtQ}t}k5K^KkLhn|yk~vy)0ao(QaO-=g?+ z-DiVbCGMO&k{Rx}WN^30>Fsf?lb~PPw+HMV!Y?f^v^{l?u=1>llShz={in@yd8T7V z82A%x=dmrKZw?&Voc_(q7hbcA;mhAcNXI_gh5Ho1jXh$V*naKuhfT)>Rz&Ozx(w_$ zap$i=XoT{jCQC@rtxSRTyf3K)%a50^(?q%n|CUjC!JU0=lo$VIW)K>U0Ed^ zTgi3##x@`B*bDn8VPJP!Et;V06QHKRuc77|?ybVZpOfi4m5Q}?0it^{KWu?c&QY}= zjfZz5Ue#A^-wJzG&A7vTT#FN`FM{pV#(qa44U)$IFe7H0rO?#fdt{=2ut#f9pFm+5 z(63WDrP!R;)d$jWCAaWjk2kvKQi}uVs8Qxd$&4D~J{%1#8c*G5X%P#9mL84E@ALBZ z1CyKVTzeL<46xBKus5XMW^LI$g=$seIkc)syIIi((?-wct6ugdAJnkkdaP3SbVk&+ zRQCIL`|Ty#(!EHP5bRvpllpflp#!qv?H-p699uQ$NNa2BUBE~GtFOM{CQWW)f9~c` zJZ=|?ABtDZ?Z=#dC|)`D0{gC-gG=!rK-){-2160+6)v6YqriLzFtKZ+|77dNniQd3 zsnO87d|n1)1tl*7T`Ryp=E^xsB{?h@*45HJhUJp$ydUOb*!E~+Fp3YA#yg)T@KA}f zn>o`>z*fiiD21y`Dmk;N8<(}jc6M0gjkr|sPw+S44j2D zw0|c{4;|E>T6~TFdV*im_vc%gJb9S{Z6pURWKxe#<|Il(v$Dj?w|d+}TSH6s1;&4O zNZ}|b$$sE?(o2(#s`FJywa!BBUFFQan6109@2|@ImOCl@eQxjcu#JGTfSE(KM9Fh- zak~6Na44;S_&tLD|6zOtif#KSZZbF*r=NibP#5}n098Q?TYo^dSrjrJ3p*2eF^dMN zj-1iok7dcrDcDL#yM)Dy1~2h=3YbMHpTf&N9G?%TGmOuoj`$~~>}@S+^Jc#|EDu_f z&%=sLs0Zg6%#UN@>Sh&_@O7N zgBljp&u1wu)kuaPv<$7u`s$GKqS`pEgTK2ut%FFNYdhI>dY{nMe|Ap5&p%}s^l-+F zj6w27@tX<3jJMxq?V8LHVTT`W?*Aryey_(hoQL!e`T@)D^%!>56%0`PlPyYf+;C=QZ8n%aRdP zo_C4T%J)*vSGl`zo#mtYoYeRAzs9XOnAJaWPsJ?rUf~|vAYn4wjBQ7!7s9r} zg$+NHWKUF@uIuX)n1oL*2N7W|tB)=!h^Bs}W(yk0wZ!y-@BW@bjS^{2FPAp)x=1RT zZ10!g9GeO#wj&RcN0DsCS+QZX=*hzl#JgXr^0?BEHy|J-44cDQA{&zelh=VuRy?;) zxZ{{^;DysLs1xt$Y&Svn^^ww=2FKY=-ZKHMA*0UBC48?kVNmgc1HbzF8ouury%Dku3q>0AcO-Aj7C1I&3tTqpZGo(1 zqPo#!h)mjxq3sDQg1!T+EC?+xo4fh91Afo?6Q}Dz8V$#u=j2^Cr3;f6i;5D5129lr zdN8#1a;x#gjKag@C0U-nS6f@$?-I|R)}N0#+2Gvt8W&{KEXEOy7zr6FK9`=f@cuqf zx?Mf5Z1VU#F?;_)y#eArAiTOykYd|x-SBz@G$YrH&`6$0;PBMVBq}FQ!d-KwaFho7 zteAv-vWf3k#W-Ph!1R-+bWbOb)(T7lqW|FG6-Ns#B_Hv9+4%EVZcmc`K{9u~tx1ak z5=uLOsO&qQi5+=@2QQ`cV*YO_kYQsD-$iSd$dq*I0fO4;*1VKzB~DqqoA*b&?xu3i={Oa~)H* z8>C9a825h96TD`fK*_ec(p;ec$vu_SHxxWVaGVG82v|xzm$npgsvpy-m(f%yvi>$u zp*yF^QVNiEx|p>YiOh1zH<KuWu3}dM%ZgMQGMkLg`4bc&5*g#`FMX*!5Fj#}#Uv z#fcEiy_n`H*%Z<)ZcCddz00recAf3l0s{AG_vWW@0V)5a7gqUxNNqI-LwnVRy}E(z zn^2lyyn6->HVap?NA~k@<1AI|({qzkV1`-vTgvWZ2gT`(p}DE0g8*amgoyQj|P9Pmslb#Fw4M z@5$rUU(W$Hb6M(|tDIr$c9K+!*W5%!{OH8?kyRX3*r$->PGS?&<bo!agDCkQSDBGL>0KGCj@A6JhWltv-Q95W=&Jgv=B{ny{O;KK8yPF` z?z}T%p!}?wd{y(ATSoYu+xZMInEHV7>7HhZnAP>wn|HfXpReVz;~a`(=d8BJveJg= zZ&z7Z=3@UTZHi=|DYd>JVvp7Op_Sd(=*p>ID}@rVP@walX&Wz$WXl=ay`R*Rq&9}+ze1J+}t{gerVM~(2XI66vutFc3rk=^c^c- zcS1~$Pg})CxuZXBovnODuEyG!D#>p}NshX2q9^a?2th_HE&w*&h9eKfdMQ~C0{%3C zV8?EZWlzLEk>k_Jk-`o#6vnytt6mtMdY;f8`o##oo)yXBt9@N5YGC&r8)!-H;~Q&a-m^ ziMR?erKM}{6&O9hH;_V_UGfIir+5u>FWGsG$iuEUcLfr>`#hsln|+EEe>2QwuuMiY zgKxPV2Z*EY8!a)|^nCTQ-lCuoX>Js<)EAOL;0RJic29I7vN%t5c$1q1Qj)iY*K=~b zP)BqME3d)-qrlTXv8OchU5un#5gC2#8MC9-{w^U7%Zkq^*XTq9I%x3abx zErs-=*U{!QU$tJNr_@|scQRU~ZmU^FzO+wPds+Kx>R4Zz z&9E&eonfgBbKGZ(OFA8P16$p*ryRQpyM{*V>?hiocSj#Rw~bztW-$xw+~WzbcMV6E z)$7T%$~fxkqsfycFxRxV*ViQH$O+NL>dTV1kRa=s4IlIlAZLQkFd>Ycln?pNx5HyQxqlhW7sfy;@J9+^noKjPQeWW$W0 zp+%Nwgx*GwjbdWndPC~d6zc;2A2j0^sM!NFBbY9wHec3=OTrPf`=0ci`ngcIG~^$F4pG}=O*8n>E-=%$1i_<-+dxL z%Kya_6DFlupti}aY+q33CUm-44{yc~!XFovTR)JR^N_mYAk1n|YJE`*wvzF0<>b)A zh4=YG!+VEDZ*g64_G ztZhEaT$dd)+B`YfRtcJqH6gA2Q<`&nWm;=GsFi+?P@7k{{MlqX&er;z7$$wnZJ8!2 zR{4maZ~JX5npb!m3Q7dJbYxY*wjfgqk9?RZ#a6_mlmCixz#ZFS-jg)p9>)J}de-pN zw@6?l413Z{{Y|N~@@1NQx?mwH`rO`zH$3$QasvvIStnH_wg|4JpccdJnXpq_g3Ns? z{k~dUz1zQau=UtRaod)#xMFv&#+%lK#g+a3k+8^_u+IYqWO9QQmr#(+w|nXEQcG#6 zj97ldvgRBw2EW^kPG$({P9oxyP5elkf12cA)IO1E@zaH(cH8lSPR&?QhRt=3rkP$k zlpdBgP6N0uF3cI!VB zey(7Wuj1x6W*Y4WduCq<+bA63O_}8YP4zMEv(P|cRpO?IgxwDwbv2)m$lf8F^mR{5Z?|S1UvnF8r7viXdO5g%%JUY3J=+flVa^ZlXG$}E}Oc)9%7~p z-@o1)>fK3RDNtWaK0+3H0V{S`^30d~6)nOx0&c@;9f>nJj}kk>uzk>a22Otx{Cr#$ z*Qpa6ci@Ms?X4l}rM^F(M;V{CGW-gmCcb@#8%zs3DL2bgKAUB1y~22a;}yB7J&n_R z*$%X_c8CV&Sf!NQ5Pj0R+>sSQ4tj%W46y)j=^M*T8)=+OcKQ8LFY)x~lMa53 zU3{^gGX6yIDK+OdsgZb99Q#FOqw79X#F&R;=s_7@jV*VTr72%6$iH7I%|p+>it-J= zw0!Ptva;E89v)t9W;>Cr_%``I4(dS%x;p9u!wkG*B0v1d9?-OKQG^u^@@4B)#688R036r9xnUaMF2}Xg~HGY z3*Cze66F|l6jTbL}*1I?UQMO;# z^8VCn@nVC&0TigAtrER@Ix8|wE#Zwv(Z@2L7zld(^$a$09 zqyf`u3_6YY&ndoj3DrsOGl1y|E~vJ*u@QS6i$Vu2(&$E1k&x!rx4Hc)_bRNII zh2UvD{$ufUFgE4F>}k5W-__(B%UY$6E?X3H152XUY+Q*dL;Sg$x0 zsXuNrRxPi?S?1CyFPwz7E_o@myX~jA@}_DYWxM@*(N8I5SCI6=c5yhg%KPx8=B~q` zZD@O_YwJ%|)IS)=!m(PaXurp-VM$(I zuP#c4Y%dc;rMd2qg9$?GY`2CRyp?~R`m z#65t_Rr*}Es=2Xa1E;s2%L{21-F=Wq)A|8FmG)VIZ7(y@^itXI*_UcEuuW%&rP4k$ zBXbHX3OvSMKVdLW_ruP?c~R>hpi(bBv^CvvUtg_{SR#`rj0R!rA4#pf^P%o>b6>J_ zHr_0h+cv?-2OyJ6t$$Ks(!11a>2{19Xw}DcFNGE8n7sQ}j7zO|G0L`%(9jr{xRuQ= zo~pT$pK>bKcZ#OVvg<7LaDQQFnO^iH@cQxt;bntTIxL#_8oMVc5kt3& za{f%^sB1AaZE~SKGKnG^&FxbSE`vGJ!)Ug2^9_24wlwLSQ@E=2Bd!Q$9^iE%mXIHo zts4b)#`vqg4$=h%5v+2!wy}-5_E6E)v>eCE5M7;SO?BB3*ElM}GjOjU{A)c}Db2KT zk@crbnZ417mF_i6wyLtguuoYt($!2K*+`3S$xDjNjJV{Sg=B^~YLL!3$^JL<%S_e8 z**D+R$-JU}D6t$=L&-E zv#H@MhSMlmb;H>ZZWhaFgu=?UjTt%P?htq#O0`rAlBx>&^FY;{;se0E!|FC8IAO8} zklt9sCi}g3*nrz7*{e0-tKrFBmtiT4qIo zHTATn&9qZG2M)c`eZ7w+E%Z1fr)BP^38JD5YI$b0_od{$Q+a8Hr_u@{YH}r&YcbTf znNE-aZLU&-bO~R>WjNnx!tE9*yrQm)r8^aq=km2t<%_-@SEP3@+?w&lI?BAul3iKY9N@CrAL1~XRRjLK`(KtP%kjjg>bis=p`xS1@P`x+#0T0zYjHLesr z?G)|Lsr1#qMZD=r;Wcaz2sW|VT7{n+4P1|4*# ztCM$NpSDN4Hf;!l&e2Rz`hu1P-ZE&DpJA(AURJRXy zIIlCTc~wg9g9!I4k5%Aou+5exR*TfDYaYPX;$H#=CR zhfl&qJpNr>zfB;caC)J|O1zewijJo^#bmmYdtI2>d&JUnM4t}yqprzHE{%16tF#{& zea4Bc-#ii%%wfb>_hL>r2!SQLu^C0;{+DX{yooTInTuK1AZRU#9z(q}*0l*xzW0zK z?O$&Lz#P!>ySG_yTCeqH^`_Ng?=-z>E!o?pH?8V=7wAn3zTSQGrX_FhfqK(ox_7zW zv|R38sW&ZPdwcYzC2#L>deaiKF!bPCg|n`O^WM;-)7<|cj9J>{;Klnw1Wt9Cu8cVl zfBO%~!kHmEfaNy$d7VLtKLXqTAPkanIQ(9;3sLdr<6{Wpm3Ixxa_wIZmgUkF!j`~t z!Sb*$0P=eX{$Iw+(P6pQ@~}MRu3;&ZcbEOPT)INo-NOr;tpC5k%e(IymO|Tdyet>C z91Ru1mf+=*<@@N4{|#6!S{|04{%^o?&*fn`u6>vEvRr>G7gp$xye|u3OZw>E%foW= z{{}1AGKq(`K8oXbk6JZwiMdOHk9@DGLHfSx%*&SS*6?z$h4c+3pYbHux=rsh6u+PSJkMs~OY{8+RTlFp-sH1VYUTdv zNPNj;ntxTf;a<7LXM#>Yyvhc^@fe-E)$?9N6wbxon#YC{JjnEFCBoFdj3%AQd?MCt zOQz@((Kh9dI3Vk;3BMD1D{J$DwfSvGN!}{S%UT~jya014{ZDd@)bQpUPL{AgCAL_d zYhoO)>JR!={egyS*dGe_{^+BN^l+W6^HX>Vf@+jwE2q%nI32^BBRxRRvGU6LInWTw z5zh|=#sht^*vZn|%j;%&Ur3{`LYhzx3*CT z5hr>GXO(Tsypt(F9-8w^icBBQ;w^;aHv3Y#7(Au)S%m_0ry12%d*_qU=f58{;2)d~^)YuJ!?Sri3uCSnode!JXLx%t`Ee8QCqt@P{POS+ zx1(?`X|`~_NPWMpw)kV>yLhwIr#mwaB<2Y7)Q;Mtj= z7@fz3^J+*~Hk+R4!P%IaZdQB0OK0}3r``i-W6JyW(@AeoABOiQ=kMuL^4H|4yy`Zm zX4E@K2?tPf_)r_5Yth(4$x@atIqH&L>pY%;&+UUBG1AJt*N}1WcqQ*ElWvw~$&bN% ze;8QmtDyAvNXmTSWwBon%CdwYlx)}_c(ypbH6#`RDxVB|0J{f64ljW?TVStXsGONCX`abVGL&32wxf1FAg-G{l%Eg_D1AAKk zFd3q9pe$-{F&5VGX8#QP>3&jfi4NCG$&JeM1%uJ`v{AGYTM?ywR#pb=3q6mp|3p2e z@0=W<&;ho6oZtu_tnd|wZtMUh4j8TFty~F_rS<-*M0Zdwa}#`bb06v`m*)q1l=>>! zSM6v$&WcKRPWDv?L42Q}!+8dRWlCRa=$#%w*HGZ=tY0Gc@Kv%DGkdP^B6l}OOFC_| zBu`XLUw&kP+>r;lVo`XO&Wh{RK-qdX3J5vD{Y#EO(DYvS8d5-$e74<`4e2Xt4Hvawel5?s8V0O19^j46czT>NpCWe*m_whc{*>sXYiA} z!81s5dZoQW35;7vV8ECaamvnaJ+Pzm&twTUqsqw}l^i35x9Dl(s~n*lT|Qlr8I9yA zMHiFD#&^8<*_=y5WP8Px|SBkzusGHt7x516B+Jqp<5E2*7s1N1+H8&-bD%5w5M^g?rGY|j=}!i!&}!8KDHF~{3h zqHp7x?Z%fTDl>b`p$gfH_#oUJtt<(TCjx5X#XE9LV$B+`dy+Qm{XGa$@#4Sb>C8st z{H%XUeNhB-3&u~CUQu*{RS^B)Q@DquZ!oT8e$_ipL~QN&9ub@;I{wsXO!K$St=*pp z{mZVkg7}yoIJ)*surgqhVC+9juW(InIrGD9@WuQczQ}v>Y^8xWI=z;njg;wgM)Gd@ z9DwCjl0@iNRY9x?398lnvguc)E&BzzI?OhmzQd?pE;j^5oIaOAx7gfRm@gESqK%Vf zjN=QN>%QPipQrThD(;;=a70TxGZ=J@cVZDC{qrq7w^&=5FW}24{<9&KjXS>^(0OiO z80qMWu4c1?$$+yN@c^~E8m>_!o6#^bYT(tD4-X>BS2Cn|PV7(}o{0Tn=|w$wNqaQ@ zr9ao6gyX%h&P!iJaiSE}ZI?DS4+|8Fd$GlRA-7-C?$^p=ZOb3nR+w+nyXr%~me%d@ zCbN2tT1tJ93v?=Nc43NJ{2`RR7_W|=*panCb->JM)34R1bwPk#;g)%O?=R`31I(r6 zkqbsL+4FXxFYf)hXiSxfp9mITcf=j8c`E^QT zTten=GR z=OYW%)pa#f7U8vMy%8zgu8J8}!`h8nD7|R*;^r_PQy8je^F(SA0PyW%!*ZExqBUfT-wBj!2I-{u~PkD`X3-VX0qZv`ETCKMn2;l zPc&G~ELz^pIdZoyKeXrt;t#jGHmWn?C@(mk{R8OYTEf}z#u4Du)Ko%WA`ruA5eIN{ zgDh7bAP+DQ7E4p*rSX;I^I}uTIi+~2oM%q|ol=f0;W6fjE~{af$mIjqb@;mftt0FH zm4NJHFa0hBOD?yasBE11o_JpnhjHfivthgneDZ)=&t|;sq+yw?=)}611~O+aKg^xI zAi^uV_(*K`41CG@Dz~ho*kXjXNAUF#3Jm>Jk=;i0mAip2(Qt;Z zfTEclcOOT}z8sDO3-o{A3`b*zBc&e4Uj7s|2OUSHx}jve#6`S@5aDe5Si`WQLb@v& zQ5ZHx`Iu3AkY8=*F3r?`V$rddLT@_(=!+9wH;~a&~41=Yd*L|f_FTw_J;t6Yj&F9!6 z?qQ|IHAI_b^NH|vgTI(YC=?4;yE%!B`)tFefjTA>)rVLNU>J%p>cD!}HBnCcQ^4T- zhsDsR>EHqf5-%C@w0LGm@<~xZ;A!q3Amr^7q6}`Wns4P|_=rlZ< zy5*%Z6$Xm%FfnXT$MBT%Xva}#D>xDohd7cf`Ax$^dK(c8o8y7YCN0wnuT9?rbH)ZR zjd*6$l;h^gQWSklc>!N{B97yj3T7=CiK%f1?w4+X2>5TDT36zIRdIGvUW2p#K7T6w zwuaNP3Yq({#G~w%LCC_cM=USB9&wr-15;c78}?}Zl^j3nEs6^({Q`2yRl_2?{&yTb)!D4_RMx2@UD6(& z2;)F_hso`owEj@L<>$hzvjk9!7P z`h;LB%O?D4oj5tDb-W0|Y`KI&3AI~;!-XFYfl*h~Y)|7*J6xXp5)lrHeMyD26ww2( zLf@tu>I*&|+IYxj+^WczRMY<;E-)#rEAPgB$}ud5Tmx{l{gj;@8v+L;Dcal+YyD!p zZ>T=p&lXlW`6ewNpwU3vr{BO4tD=|WTY22{fTegDnPLC$DATtU!GfPm`W?yiojh)O zz*5^XJu|Nf)c~3FJCez2vbgC1>ut;Qth^?41!U6iNG7Yv;-&{Ix;ctxZS_5duur2l z8H38?(h#n?mJ3&NmJ3%kBjG`g6kxaSX7SnTV3_g6cROAP}Kx4jXBrA3Z-IsVRhmtk1(*MB$cai`G)gWb{&w=1BV_!*^eyEIP8A z(pTg|9f2vFbG%-hCk*zV^S*EElW|UpZUjYp@>11}pP!fU9H5#pWrg|#nI-zZ)u9Vb z;W>T9#>ob(H@Acn2TC`Qr;7*ZV)DZXxWnEDP~hozj%@u$1A8k%T(rk4~4ywp!A(g$sFnPkI!hHuBNX+fMUgAVZEQ} z^gE&nZgze|c-p|Ya7(E#Ae|@;4lIO2`frlnngHYTWS#{!n3i;KzGfNLShTh0F)~*K z1MtczE`WZs=5D5(NkTZ{L$>2+FsJ@1o%C4VwykQ{XUA~MaT_(!Bs*)uSS8e?^z<&2**=(zo$w}$|ytD8*dfRYF2e}B^r^H zTQ9hjJ|yI4^c9z(rWS!G~ZqTA3Iz70alo3~Q$Q5+H8Z zE7V7M7OV35tT|7@!~@!rUoG*Z^hCW>JKQ!tLlX4}B67QSFdZi%*#?1&8z5REv9(z` zB7dp+PnN{-GybIzl-(4!g?vG5o{5d8|k~C>PgNhFeGf9rix+2?Pl@|@K!vtoNB8d~;fa!cmBJ~*6e#187ogRch@ssiPm}7Cm;q<=#O98vG zy^_f1@Jbt?ZlTE?HO}z^?;DyQutHY-1GR62SZf$ z$ToIr*A=)z@rKYBQ|VW|QRyBDJ&toA_ZHv!r|^~h%<*^cCE;IzPd$e!TgwVBZ7et1_;q1KZ7nrgHBaBsT$wg&*>eNUtXm$-`=E@Gz$F z1^3@}tcgUHLc=sRM@DH~(<=&sOnjRA4fRnbA2mwtM#4G)zA^>psILiSF~lnn%qbvt z5;+0UudF(DeVjg2RMkW&*h2-!38yL*9AO)>3czHH8vkMjS2ddZHrd+a0Z^By+6|Y7 zRzj^NA=#J@0*wL-0u7%Ky#yi`h1z4YEerZE*x5GOZrNum)u#k0na;bpoy7p=u ziG596X()0LK&P9?g&JlhXxPl4O*{NV4H$vTTjkl!wCXrm^0>8Xb~PONV>FL%JzV^> zcB+9~iN=X)JY`U1qqi|Huw9<5S)VLTS?Y`6+Rf?LL|lSuNvvHv;r&^^tfa~z$^f-x zqMdg^4yqHA32`EjL+DL9lT+xoLKRalwt`O$eC9#$nIN&im)Y*tIA~9$a9}vvvI0uuL_V8yo3r;j=!uhG}gL%*^efe!60MRmoVD z&K!xo{ZM1n{2|+Td_7%?Hs_%Xk3+m-cQMvISBFX;19+;{cPWue4lmRf&8FfFq#JKc zyXI8UDEC&@I}I5vb0BpZ_1xc}Y=cG$PLppvioam(6arB>KWBUGlZU>K5Z|I730~)C zKGM*Z+STF0UYF~-N~eiNP4`y_;DJ*&$o@o=7N)ppsGqy$FRUsFlqrP1Np zX6U->z_R;A;=&U<5zeJ2+-_ohRt-~!bI%;Mi!@hwkzY}fVzoyt63MN+Op(y_etiA2 z4lAFAxS=A3T!v;{J*?x~Ssi&Y;x#R(QB&!6h^Etz)}*7>pO*#+P+&%OvB>Ub2yNfi z6$#}=yQ4KvjAmCsZgNMl=6%`w>J_J6xWdAZl&I4wVt=DBIl59#mnS zlMBNjczd9@XBR1M@kPwYx@PCq_AGD;)G}JyWJov)p0tL@lF){7^j!J@ZEXPtl|mOI z2OJ3j8);s1W7;8U6d;J57rcZazb%ftD=`Q$gRbcXV*|R=QSGam8YM_77LXuZ;G4)D z^#IRNV3)*SfZf-h-pBDk617JbPQDIUK4Rs0^II7l1E?R3Ql{5>ulKnUg#M^RkEZVb z@^B@7;dP}xt2-BJ>5x+yLi(OrHNWnPwY#lU+N7kqj@IJBO@>vk%_Ff4RW`dnQ7`rQ zkoNT|k|Cp?dVLBn&wF~9ysShxihxOeu|_KMbX?$&(D0^#z|NL|P#*=Mo`IkyVm+xe zA%FURm^@{$>ZJ|zkgO}1uH^Z%Axs%WYj+!O2Mb#ROn0mKhW|p<>1$Q9*R>)#k-A(* z;4@XJuk`638g%~tX5OuT9*M0*GNJhl4dL&@$OeeF^rsf-dW)0OL_}trh9oRqpymig zC8raUF|AOCEdn_H(kLa;vG}MKZEVV68sFlFd$=5$%&e~c zES}2A8B|E+)|x+73$S@{SkgZL^vU|%eaMDr`9{8^I8@4dANe`_a);LzGj@t*pC4Mc~-= zCe&w$6{da^T(~t$LA5NxtKdp|PD^lA3%H^~vpYyo1VmSnOUuqF-t}*L?-(jOpzd8_ z8&@`(`ESucY&d9^?a`{DE2-i6BY7F1+i~Z@9UW$HGf>He)Ti)8gZ#%#y0v`w_EloW2P-t7(mp6y0=l zI(-Yj>09|pPNoRkfysEYmv3sfz?*%)1N$8I9p8=v_2GCmK~~56dtYWLpM?+azsmMD zhS$Df8~Zk@-A79iZ)quf&;0}VT+&x)@8^O&x3BQ{6?&9B{_>G_dwi)7fAuo)*c;~g zU#{KLCFPe3@vmPdzEX&P%QErRLi`^s6JIOD|JU@9_16pW?_4JT_pM*O{Xbp?KaE0u z^c6?6uUUw{a+&g5h4>qni61M(e{Pxh@k0DqP9-kqiEbwf@h{4$Wf;G*5dWcN;#U>o zKe9}GyAc2VW$IsDh(CWB{7)9*FIy&lst~_>nfNt@`1xhxJB9eGmx-S)#P3-qer+NC zDa*vKE5tuxnfUdE`2Sue{+L4icbADjwh;fVW#W%3#IL{_W$F0ZP>8QB6F*akZ!QzR zu@FD8O#G%o{OV=mk1xdkavAtfD8zqmnfxaf;y<)Z{N_UZ%IuO+=sx3bTMF^-U6Nn> z!w(&fZ$sT-_GS^a*sFOv40C|!Qs$H#GK(HeJleVWBVrI6V!NGXfF1ybYQ9XEJ5RFu zE8=ZH# z`x?_)a3iodtVLRilSe`($(a)SedU*}8%NT{PN_p);JSw;X^g0|G?MEj-kw~b-zb&< ztDU$Z)v9C4>2sj4^eG}U%qc_+5m$0#1XD=z+fL8phj%oiJJ+}P8w>sZn?q4p!hHD< zHd+#bv#ms3kmtIUdUWYSqw-(VDOx#QIv{3{QTw-~qohyEHM zZ)v3dnW)JYF2|fwkN%Ufwbk4AE=833N|yN(mgD|y*Mz|29-w&Jg-)X%0@mOcd_#K! zOHNgk&ekNlZ%nb;LW$_uBw_+Vt(Zl^2FtbM5T{f;!8C9|(! z9mxvAC|4_mVbWb61aYL{0!r&=1K2CKjZ7jo5z%WPDYt6V=~_w5wRD09Rvv0yedu>P zwGBcRCaRL=vJOP^>o1G%rfp%HkCltAU|k2fS@qtg+hFwKua*Tbi6{&rG-J ziJARhLpb-&nVRaIjvuMXV{eby@?&Gy8`>Zj8)Mn^jjG}t?f!X@jbf1)w~I9q&IjyFqrsEB9HMsXJI4z33vbI{vbGE+xm0Ota%^gnZfEgOHmtBM zNv+rqUIRISiOrK^lP#-^4chL-VSqh~O++j?YaaV`S}-|o%}@3)QA|$s?!j!?o~WmD zJSW+oRhO|1;i}RcDcoH%#B&iTZ9vjEm})mOTywmXtraGP<|Ot7IlT9edOtyObz-fj zKjdBUR^O^@YgJ#D&jzFxuFw^(=ci#6M9Y;Wu=eq4IT_QvT&28~|UhJnUwdKm?CzlvAm z8+5xZsJ-@P&{3M))ZS!h+hjz#DLq|~tZsMGhwEjMmwCNR@$yi;tckjt0OT%nLtvi= zCMT;#fggpCneFLy^um_*YB6v%@1ts7!1<8`*iO%)>fTWaaC(#gIjWrg75!za)pQ$F z*zhx=Yq z?^>tdU!#(57b?lP)Zwcq*G08iwwq#jK(~@GX>}vrf7f2u`)y4clgDIe9L}4Xi`vI9 z1=&o~J|;*}W)CISCW*w&0b~Sl?AA!OQ2O_D{@ToiFXe9|@9%&#c;w;l)I7tO0f;<624BWk1ah_i_Cf}-!agxQ%Gh~)= z9Dk}Tdn$|rsoe*KhRa-{YSt39qZmt|IdoHr26uI++Cz=CH8+zes_dovaCyje7pcnv zv5OCxJft+T!5m3r@OFZ%;dEKJ#7JG(lXi?;L8LKV?DrT6vo6!TS23mj-|}#~F^=KyrFe+<`DiX$wNfAP zpqxH~4?MHTk@XNM2gH0AV}`Y83$P-P}g*c5HMBou1MU1Fz|%PmTn$t^vm9vApI zv*eC-WT-=xDmlGLwPb+G%n8kIE&Z~D6?C@W;29!K$bsjYukKnZpEb!%nq8Pn)Jmpa zlPhGS6$q|PB}m~ISeS58Tl@ul(%WrWGdV;0V%_4dJ0UP;;C{A?HJ?lKDNU#dQGeap z018z}Oq*;TzOg`$$Q8Ooy}pcrL~XdBZq|@m@omkHGk5 z57&TMwjM<+Ei1q#`d>DWB0SGd?JWJB_ywF^T;=b>`!!sabPW_!PM%_%1BEdwVe}i8 z!^5Jjzfp=SS%Pv%pi-V{dHl+8f5+X7=g)Az&F2dR<}jWL6x)a4PJ3*-;WyU}LTz1zJ{FIi0K~Z3tI6FbVMq-%!Z%o#J$)_z@iYS<=2L3E}1F_bBgF zOYbDd{(L>^wC0{oc(k}1@Jh*(IBBwN)#A1J2UUv2k+u@8ZFL_BCT`Gal+{u4e!7G3 zoq_c|7_RMRoH8L0mJVS;AcP>8lnw=%1c3@SXyhh=ERC$-=~frZF54j5-g_m8JHWI* zvI&>9cc?E(w5)mez|0U*t(=9G-qE=cPlsy^SeYV)H zffvuVO6dxcSmQAjmrf{4_7R;Rv1Gju(u8L3I%e?J+#-cXy;o7?SgF=YSCJcgs)RLB zb@0zLri9L5B=DmI)>(H>kaEDZ#mBUNd{`gcSE7R*IC~%5#&^3i_>hA8O1b}!(V+Tv zt03FN-SYoHuqCW_2LHr6_g?Ih*yj7b?A)r*qvf-b*DlF-fcB72u-E$n)(i&?73Xs% z+fq9?UU+gPDi#oCDY$Yj0{}^g_gg_sa<)Mfbx)#PYq3Fk|A7(pP2ch^k@1FkT&^jZ^E^RcdI}4u}qf zv1-ZCUJXd~LuAX9AF>NuA-ft#c6DB;-OE-GNYKx$ZR)rMHD4Y67qVikXg=#8oa zwVd}q(7Pb!{gB?(_L}2%?akN-m*5;#xJC_baSp`d`eNbx(M#|V8)14|Vk0JROWap8 zye(xTTdTZUHd1rEm;0*MJGSIhUm1Lapm0bq<26BUQh_79HH52>JbW$iS$I6l$W`O; zNoaT-`lr|a%Yx5+!h4>#5H958;VRS8TbV+h%2dCNmU$23X?+d*Jg>?ObAVbl5)Pqj zk6N_4T(~+b4;KuU-e6E?3I@?p218js{-QafGjvFD@YjRqyK07&i@=JoR{u)t223;M(s2V8 zcsQfEq5-9SRj(VPXk$G1nqC**K<>fU?e)!iWf4f)uWN|kq1WIC5oz>xJ|(1OGM&o}sOn)Cat;*jiIN|3w%IM&jMH=Jjuy9T(e*xUvjbwv&-7iQhVcI9de@fFOL$5D(qclLR@6?~IJKXt zsXU#YM~O*|S!3`OD)6<=W^iaS4|_37mPHNZ3!ivtjF9ZIYr(JOk$K*pPuAp7k8Itd z!>v}Iy{T(FOg-ao>KHG3WL>3T!?|TtmlgUY@C1d1ekmCR2l?%rgoia|CchQ^1kSSc zIZUFhPnLrmuSvdCKw$48p-RbgLNO)<6XBEx1UcT}J=& zWW?sSG2$0DIA0J2TE1P7kO(b>&UIo~d|0}j(566Zz_EnZgvIpl1iA8*xm75V|5|uX zXpa$QZxLmvZUM978)(pU9d-JCviU41nvWx>E;_f6xAzOph=U`S)oW6)KsapgQ zF52`}!nwc)D9dLMm;dgAh<09~EYHyUxk>~KJFp8J{tSn3SvP)AAeH(;%MCkL`?aG-g?P3`bryIVivjHO}HkEBO$C zMS1jUyz6`pilBe&QB5n7iH>MU&5sNh3Cu(^bZ65(K(So+I+NR|Bl$ig6WYa|uSC;hhqrKJ5p2|NDEh#%+wI(dM^|kP z`|azadoK8XyWn9$j_!5W@LZh3lYAIBW{(OFlu|QMCz)XY7*nYw_mud?UDyRE-?1!| z$@xm@kfMNJ1zBL(|FG0y6^%)U=RC&{vu-=9Ght}GACxsLUjh-MXnr5T=>-%RZ4Dt} zD5D`_3n9e&22i65g$ud@!K~Tp;Xysp2y7S6?q_?(~P0+KG=DzN) zZcCzg@g0Z@Ws|>j>t*4%Uh)rohI{SGCTSm$_cNAPGTdF{WlocA&;5YoVVV!(v`N7% zh)r;y(cz2@6SdQOoMN8|gVXGqP9QFRXWRa`XOF z8%60aG_rk)g#TBfy~G26;CL~6TFp4Ug-0t+U&SLqUetNWDPr~ANf9=i>E9_un7f!9 z_^Q^b3+V>pNcc)6G?bE)IVnzGOGp`aK-R}w)o+!E-ia<&zjc~(AJ@`8uBIOmZQ!Ra z`35P+xC>nYo|h8o*9*9Ho`={Ai#_cd{4~BwbVPS2trP4O>ERkm)PO<&vc zFVi6+SNT6j{>=G0Q>v{ibw&O~uIYK4Zzi8Nyv%fI^hCLmeS6}K%Vr%d$iKq1kTk>O zs6XZz)`M2-NI|ieT4`48He#*BH0O2i7huGR-QMJbIe!U&&yK)yihp$<0S=tYs@w<6v?7jGJfu@_}+Iw zbF=q4dZJaT#mQHN^?1m1x37+ua8Vm#?7eN<#C#VgU$<`J<>Pwk{gPjEV3zA?wvs)1DjU3A>KYTyD;HcSYIE>7ah#lCQy<7I=_KheXc+3+Um)LJgs&a z_l1_iXonxn*7Dx=c|cjjgE;eAyu-m2e7dkShzxCz@R`#(=HljXUSNf^?kp9Nys zS&gQsk)o7*g+jz4L!7#Y+~1**+ti!XF5tDh88JiU`5a|1AyuvG-HdF{ z{UNp9W9$VGv`hz`t5~v+vB#(dZ2C*vRzAFQOJu~w`Q4L-ug4Bw+d5ukGk5w7%EM9- zUJ0{Up~D@V{+Ky-MeDDOBzQk*Me8rK_nj+R@5$cJUD5sv-ldy>x47Jr--*QjavVkX zvwkva!$E-bjIFYXwPP;ejJvEdS&kP^o*JQUj;3hEU7d|<-4*pHxd{SDK1l&~ti~rV zdCxaqN@6X&t82H%b=|;wl+=M!SVx-DsRG!)0}W^sTq>MT@i&J!4(y8;jKYIE+4R#8 z0WSMPF>|+i!mCCTHjYU56i@d|(v{OU(S#Sg6ihF^S@~c{&BB<@3y&AyPIS#%e3ROK z89RFPcMpe$DD{zdO}q-1e)gmzn0ffZvXkZ@xQtjk@=ZI*uq8 z8W=j;PA6w&P4vW>Jsz`gH*m-@pgO(1TwQlsGlRl}0F`%d%G*JC1>7Ieaq;4XqbZK0 z0fwBEp=Hx^58DajWMqDg7&e^c%L8i&A0P4J!zq((XJt!1!O!Bg9w5Qo0uoq3ktTek z_&~|LH=uP{YnMkD`FmWTyCH#^3{#FYBi-M|q3L{GEuIyG5R6#)ev)u169~o|7c*>a zE^KaM=OxNc^pV7E^i9d zzjy<2e%X^dB^k!qdi@+=hFvp1;EtdRcav8F9%*X$^BQ@nS+9yA%B7oYCp>aTJ+`5rX` z+t$|>l+52J9R>marblJ)?|Mv>2mirSVleV!$@al7^|{Op$7z_(7Rt8G=p4_k?+kLS@`SQR!UgGa;VN~x zaJ3QK9GSwYhyL#%7th_?{*f3nO z-`Mb4vfp8PR(hK)dV1cvZmR_d3Ig=V`tD3%K#wXp%y8s|$~Ta}7#Oa-a3_JPlRzyi zM150e=df=cmBC$#9!VX)p?1bM+yeK=b#}1X>lFa+P`;}Do;K?sR1N&o@T(_4s`jh? z7VuT4CF}22x9r9NzLt3=bv@8fps7t;R{(_-#sLtqAtu|F0 zs;^rdU#ZabUV8{VX7R5r?XeC;2t6*O1vWtwLT4Iwmkh2zegKOZ>Zwa+C;A}4G~L7N z76M}_xfss5#g&jdOEasIPryQe+$>qLcWB7Zz1sf4;@<&@;q(Xj=q&X5QeRn}?wqEa?wqDl7>8D(O4EmP&`tIV z=VeOxGiT;_rZd17le zW2cdw6BQ>2V<%$I9I-kB_tQ=)>edC6QdT*tr)JHwrK~iXW2LxWsnzGbKBOj*3Bo@m z=-7@S(SA(@P)#nOrq-G~ev4Om1Ry3+vVWH-FnTlzPHC5;2 z%F)wkD{B_U-wUtHj7~O0c4d{@ZhfAet@Qhvw5AiJcu`5IbFc?Y&EA=!rqXobtF@oG zwrM+ytiiOH8cV)M(z1^9wS1Y<0ucNZ?!SXnP4=96$FtOEb~#=BO+xl@g*EhBi8eF(9;&?bBA3J5n@lM> zaCU+X@mfh<%xWO_MkikKCI05V!4EReo%9a=OuwkFxW}rd+2WRj`>0`fa=$N6?l8bn z=>2%BHG&f&v{16@!n#RXtEWcY^UyzSHYNa56w&BY-4&RoK1ES{ z>Y-0{bKsz4w$GLEogL|dO#!rHZA@L3OHUUOQTQ72dhQIznsgKHb359 zhH=8c?1rgpx?KEXVpRTOkXvWJkI;Rw+|+payM2l`nte`IKVr_$NwlJ z$z=hOcjwlCKr&J{CkU0hSU2FPoMKP`oKpW6M9PHsPM+zPvMmCQBf*501zG?9Ynafq z3}O2A5T@8{&)C<1_)2{iQm&o`HQa<|-y!%>(^s)P=_(b+P8^9LmA*qTsSqbC?DyNQ zh-m)NwAsg6WuWpU0w_m`EwIhafjX|rQy8rdglb1%`elFw1R;}Q#ZYML;3P{-^EHRFc;5zm=b%I=G{PVcDiKjLJ~mm!yY6WmJ`~!C7TItyFY#Ph zA+$&1x(A7`M%v($!ENO?aIe>#I~OqI5~oQ_OFK?#i)%;(#0>$6`Q?BZqmuc000P%N z%Kgti|PZ2{hs5JH1m~iDr6+;fD zPjMP`A+KUSVZHHs>X=a7Ssj+yW{I^UK^j-Z`2xG|X7@K4J(_bytIcOOOLGyUDvwwC zbQRSPl?@cL2~M~)5f0Fs$!dPKpojoh_k+<)8r(EM<#}Ig-`)HA{`55*WTdZ$-`3aD z3&kX%w~<3f`+LFq+p>P1MxW~aZQr*W62#Z&?-vdGd!%oJ7UAf0Q0(tw8O8qo71d|` zZOJ5d+`axTN3SmQ_b_wb-@~9~`}-Or{b3@PHG(W-y?s8toyTjFgB~%m0b!P427X;k zpnm3%%h7sTNuyjB_D7}UbdzVHfoWVRP?jDX*wO=cURy9)AFSm)+IlYt=2}k1CfZS> z)jlT{^dU-?ei2Rr@5$$AY#TK;nCHsLxn$HlcOFkfOI5)|VYhI-tqydU0+w%luzK9k zSYfOBK90_(ELgwvH>%5jtww0hq@kff1GYh}E}mpn2@^?HiK!|iFG1sOZ-F*&dVV@R zTd?IkB(_bENBCTC(6MB0_!;-H?mfXoXbUr)wWcyVc|?Q6^vT9#twzZZ?;I*IX~Ekg z+?l?^vm$YvsuLvvcd?yHbos{G3!Fun@5uPIBk`reJ!LGolMC_|N;Y79qdnkuwDJ5I zyuZBy%;LGPd!pc!FSmts9iw1O{-HJbY7qhZZnLJxF3TO`E9_%zt9o&UkAH`O% zkt#jg@OoCQ5SLp^CE?C0qO7Od;kHG;3OOjb)aQ?}jQ1;Ii; z0!p!;tx%%R^kD8eJ2mtUq1WTZ^NW@WN>9vh@brV&iTH2ShMrRX=Zek}Dj5b8+R z^6vz`THVu2{o{B^*T7Cn{bRFNv-)Y4()-dWIyV}*IBp&r-3Ct{c(geqdd!XGwKXGihe7!3vbZqls($pxz6E0T{Wwa|>4B;l zHe}~@AO>-kV}=Q%?he?UPVB&~Q~>9hpoXRw>veFNX&5AXvvN0ksrCe9DY7yvm11yN@&IH!`$|A|G#OA>VYErz^`PdCfmKM zhd8A%^4%kPG#ht%4n@O*$kaNF8<1cO{{;s&c>v2}2wxrKu&j;7P88dAK6MPwN2%<1 z)IPqPK3D}>$7-x@qDj{bVZg_9Oo&_siG+eZ1M?P)RBd1?W1@6H{{UD@0u%i9da{8;4-Z7-n_py9{M~`;ADuWHW z9t^L^ab3HK@E(jAufyW}R&x$CzK)Ec@|uw;*AZy=1QQKy|6T{J)su(O)Nxi7d1u%r z_4$~UpF5 zw!2;TWu%mY?TeM(25-ky9^7mX<|Kw2|xCc57WzM}2gok3Wrf>MUoCi~?aLCX%ye_an zx1(AOJB*bvAdA}=`fHk-mq>+1x179=J_x56F-u}GYS3aWW#DqFt@Qzwu(HfPmTSbW zYs7-4+La6txn&A$h>K#4?5gQHaNL7F@A$wS$Le3O)==*nK}k?}kF7=URFb0pX;l zR*Bvwv3qbhm93R$r$qwKOhE2E}TW4n*ozLKkjH4;) z8Xq)R^XYbzdu(t_C%Z2n_=rhE=BQfm^iW< zn?Xi$_*Ixhh zp5t;Vn<;=^1L%sIUk3-7T-Ct=*W~K%V|DGzYMZo-r%q1lDwDHxGuD)cGC|lCVC~7| zIqLonzM$|d#YHbu$qNa%wcW;GoU8Q0-6f$OW->M5UEI4w^lFkj7$N*Q?N!M`p=%s| zaW8gz?hS^1N`8eduS#B^n%44ivtFivajijvUzrTBNiN%=!CITCA{NbI*5WRcaXV|u z4r><6Wm%zX*WqvqCHi_Ep+nZGOJ?>ICK=T+m2l{xI29V4x?o330adx{QYMq7T_M`s zlF{-*xfupp-f(B<;{{sg+O%w@If<0Ui;RcDatoYj?%kjyV@B9yu3tjbsOQ@2hr|D$ z=%zx0C5DR=a=ThKH!`r-hr!I1HyJ5!&q$dIlj=*+c4R3<^8CQj$g{`;cb%mv_Xsu^ zr~4!TF&XI2Eyi>t!2vlT(&q0<{`61bO^CV0AH+Knj{l_Sal~(k-Fs1%emmic!^V0f zJyV;l5&oK|P28dUwS50G?_4{Tr`NftXA}0DnxCecYap&nX1aeaGu4yb5NFALbB-&C z5~l{q6&9sm8#Ut%ZiW}#C?0nZ%|?sji{jOrjv|&Id)jtJSeHyhkJ#(rYt6&N5?v=4 zdkK`39Uz;m%stmjmv9G@tR;^CkXmv%6g^fi(viT~9<4PR9BdAToXbz4YrW=a?Yw*;ttLjL{YRcl(?UWc<$g4z#j0Q=?TNt9w6y8x*<#qJ ziz~0<=*jSd%Q{fxbrIL3V_QXfm~lH=S3-+n9LAPEBXR3TkK_{i8D~G4YKZf~Zq}ddu|&4yvG)ZQA--HSJRz=xvt5OeZ);2Up1_qE zu^~Auw578-nLLkEn_}!kK%6!pqA~s$a}vN&uD4|GSB+-;65+4p>Y)vTF0CrD?W^a^ z%vIOeWHi{SP!CL=3dDnx2@r3{bVQrIe_)pdU5&m-BfFYCRQ+29Q_6OZ5P@ua27|VQ zRlZjKDO{nNK9;iiDD{;!-K($Yurw-Pvu^zY@NXm&EkWPGT@HIg4z4cej*jareYmHp z6V05F=?BWuBdDLU+H%^r5!+;TfnXWs&D!a?W#cc2y=tr;w7e)p(IXyPJ?5I~d>wPt za%D%OTw9nq-?cOS>ply1VEPF(Gvu?z}LJaQWw!W88==w=^suFic`Yk=Dd&}x|*;I*_sys>f2HI4ap z1)pSX&MNId65fm6!nR~p&-3ujT6UmW>Fs6DBkCxD^6$EuVZT+U$ko+8@zZrigJ<%5 zg4*QW5?kjar#nUO%}BZ;o!ctN`te|;y!VRg?&}J43}1+xM&jfNBnae6`Q>N_aR^S7 z-$}1mT2`I{cA~Mkth0>LCd5KZ?_-Of3r-r3+e=vt&&Y%lj z%RL;IK{wCjlj&|_JL?m|ZCuBRu zL%M*Uar*-MpNwk(VhZ%ntTF1)T!6Kd?~!_c>z*eiTZqGssrCZ?o-|Lge%`nuy2op; znBGHA#K}_x%G~RT43t}a1-|@pn!K1$ajH;n37)f>mEmubOZrR8-F=K#i^cceGn-g(bRSJBMPXnz!~%K@pd3|a)=^w`|I#+Z+( zjf5hwGeLLbxvPi#X7J zElR6b;3bIeu%l5A!a1~I(h$!m-e8Pvvu+s85M~M4G=xP4EVs+A2pwv1|Kw>=J>81R z1rfo)aN@Gq#K0AXQ`wi_K@VaX!+S)-MG`MnP9hpo{VM}2`H`x8zNC(j4g!a6Nf zwREW_fRO==4N~x~ix?P)7XmVQCM7s#J#+Fb1qkA7MUu%JzSm&Yhq2&$OCemPEf=n$ zM#AeZyPT1QYi;ppkcm#0ImtT1aE+K^YmD*k=G@&v5k+F?$SOhD&bC!-68Pw{?i9jC ztM6y5iO#s+(C5SMyR84XynZPZ?xNn$+?{$khb|UkI=}BBBR<*MT_DQ><+*ZVASx>) zFd-4{krS^4w5B*@%SfJkf&@=bjsT*)C=FPX^OIZXT`3=QM5<7LFHGjNRGhNQ(C08a zQX#4WlOiibN;T7_<%LY-I)=GVFakp*Su!cztgb?`x00+rJ6@+uc#y2Pw0pBO)iX&2 zg}*{qre)knKzEQ?*kE`b1yAptpTvnj&Twz#?0fAM(!woCI?Y-?OWGt&yLqdwHE)_M zh2522C2Gj)@64XPSF~HZOMS7Fy*^Y_V*zxQHW>bf(W|(PAV}amSM97uhbOj3rz^U? z{i~$qUr8WX^mugmoGrFe)S_3p`T?e6Mmba{&OoMayDb(B^-?-`|L^mnL z(e+eZk~7NzM{Qy-qP;o7IhAds7=Er6`0OOXJ8Ek-Ep*7^t5ZR zvU+K7xcR;SEBqh$cYP6E4)G=`w~N#n;`b5n#d8tv!&ym0jmfsuTQ+a7e-K6QUa|6n zD<%$srzraLij`kqagN?4XQB&)rQX>L#A3DN>WOL+23;aY|7;Ws_uRA)+D zSJ9QIdx@3VMFNvm;)0ipVMq3US7rZWR(6F3+clxp1;4khw&0F0*mHnOGz-CM<7B-v z+322uM;D8wvPP&lyKFQI7}m}`)LfdVp(Ixi*0lGw8#Jw5-_59D9+{t6cSXB7v-67i znLWEF5fs}klbgy>0_L8oehAw*rM~83867R%%kfpT*juPWYbUEC#Dyq>eI0Q=e-%_58>0i<`j@$%C7s`m>u}nYh9&!b;dOEH z(qenc=2za+#brz5zv0$IuUX|?M7_42M&>^WiVLgKa`v)-7;cAnDp73=|5PUa$2+Q3 z7Ry?jv0(mCTv-Tu821JHUPf=k-3G57f@E#nNL_5kYA*g13;$C3Zhn(jDiuyUFQNal zzV<%zw6T{{O>ZS(u2a$6ei`L4o+&R+^G4E`5Q&*w;W$UES zw&Zs$Q91o{!R5{0Ul35w0VxQm7wD0`UTIL)sNc|hM15;}sec}^T%Ozesmcm=8d;jB zElIP6{as6gQ{i}Ut{1NYur#h_~eAXDl?rqTaE!q%zclRApLXR ziN^vWz{$PZrT)FhJBuZRo+07Sa7t#gvl(JyH|gO$W;XPyAvey^4q0mtvuMh+Mu#g~ z>|hm^ES$AsP7F1%XN%A&Fq5B9_&}8jPu_>mh*~dn-$%NAYx3!tO8S}z$2((h2y2TA zX)k>XEm=Xch}tU9nk71?X=Vb+#Aa>6$ZJWPByJdH-^E6z!BEOv%4!oux0$J$3{{S56 z0)V_*zNv2MK}q}S>yw{gA1S%5!7)4u2TE9zh9T;n9W`_+P9ZzO;gR2E4HGVoWxt21 z6`BtRS=dLDrp*hEO7#s^w71BpFDwCykX(>Mazx)a>e8RmR~x?>qqp6Coy_-z&qCmp z*KIuiUMr(3m^sVI{b`amW}VotFsw}0DOp(cd#FXry&ux#$%YKiH`0>|YB$-2ZEyyF zo!8zbiaEqiDzg?+o#$re65Jn~yEhGnsjo@rnEP4sc4np=<=nYTNTH2ri;gF8H9boy z>5&cIA=M3glgFu(K>mLUl2*NAs6u*Lx$)wQFMH^A-!OFCKqWbN1#r63VvW!J z3ERuqDtrvWF-kA>Mep^55#Jr5+4FKrVK8XT{dD@_MvaAn?zM~kgsE2dVsI?k+I6g& zor1yOnE}GfwHCjb?&0WZr{d^qOp|Mfz2FvoJ;m%RSMeKW!)c;iLzjx0hbm0tb8~>_ zc;K=9kj2|E-z;_3FLEdD6BD>((?ZN4LSVe&yO)xl`r#!nyl(#-jg|(90f-U_9)fEI z=34ysRd2D#>Mg?kga!v%=+GBK|ZVAslt3# z4X>J2!z-K^eAs-tD(Y;>=2PBJ&E`|y&&lS~O2oOo=;^B8m>`Ffd#C`Ktq!YD6p(C2 zX-jV<$QkQ0jl&dQ8r|9*;glE)vuCom)F;~#cR7OxI5}+ z3{}<}96MJT{>f1p@!1U;;HAFMpcT3be{lFte_!DBoWC=t)TMDJ#Baj2#kD^zpxJIOxC+n_ZzRPA2ewkR+pXxa>VqNn!D^8 zX+i)*$u&4z{0*g>%vnY-_by%J?U^1H_1=n!_#|vnU?I*o(+4Rh&rfLj0Yk>qGW@M4 z;#P88H^kruM_{{In@SH6#YBx?M{$IUC=xw^9>Kqk7b;p2t^XF!KgK z5l@kB9j8gM;ku2PhcT&brnf@^2Dd%uEI`<*j41}EHnq5Q#*O?=>^XZjo8MFlKyKQp&1WmFfQt6Q`WV( z&w`U(n~T%dr{XIpU?gJ+miVA{V(c7%eb){m=OizoNg_ch!&p6c>P-{{oCCuBMymcFLM$|7BGiA!<0UAoQaZM<3;k*t08v zadgola$)rB5x8B*R-E?ApJQ=x`ZhpE9l8_jt9{jjUF;U~@+%R3yQ1eRtuLu*r5cJ< zV>j+9%L}hFStb1RHgOB?$5Y`m&K+M7JTD}j3 zJ>UCXtho0xIjy#-rH6j4iHqg2?#@t8{a|{s)#HXI9TBWBN%#eX`;9^@@wL&B(Vy-2 zzPFalAQ6cYw6|N0ZvQ0BK=bq%W~Japx`)L~l@*CW@lBv$51GTNB-ny*JnB5V%Zj%n z2W{PP+5czdLjI3p)<0Fk7yUgNbMHp_LlFYQ*;+9>t_|i76GV2Ka|GH(S;Cdm_iJiD zmp1w52lcs2pFr(5gJ>K2DG0c}uC^|(4EP2GB@(dg@ z+F>J(9a|6IY!REs*z{AL`pk~kXnm}AZ$}q{yrVQRw6PNX6;LBYAKAuM{KD&o4P<6y znNQHKZb?iV3QckLu}o7aa%odqp((XruPH6&hCM<*|MI?yy^CXm#k)6lOwK!YGLY2e z(+jHc@Co7zmMHyus4hcvzmS9~g1?uOqc!J6C(!LHii#YgtFqTu3FO4h0A3lV#!xA~ zUqw4Vb^D_iI`0wE(D0dY3d4B2=V>zkbG@Za)7LOfqm!%CFF_~w?NYs*7pOIr^cyc4 zme-7p#9AzVa1>!&zBI;(qI%6hF?uzryfZRhp>Oc3=?_>}e!T{1rhi4(W@@Auo|x z?jHejVZ3{ea%6?dpjByF zL;tZ(9P4ha_U}h*&3=uQgMSTw(cM_LRb3U;nDD2^yMJtF7F37y$foz*4}U>t_$j#Z zwz$(R&Fsib@qopBp4F{?(ofOCQu=9rV|&M?A@9kpn0ICU>9!p{2N%*Oug}t4&Zb`> zB7I^oIW@Ve4NMDGmt&0yE|e_!ZA9)8R;|)3+}7QtWD|4UNcercJdxB$c+icD*@f^p z;$T$t65+km419EEl{*b@bvK8>T)PFcv5kRfP!zA-Q=eITjYL|BpG@W|5z$r@@=w7y zCxh{&Mwh+UGSP)PT@U^;3y;&!fKH154)u}b8N)p`eB1|dm}nSO`gxvE82s;BTem9W zc13KJCmPQ;9CHSZ(?Ndzc?6H55UcWqp?#iMg1j0MvIY@O^st3G08*y z>W=i|fMGZEn2$^=^~|7{Ja8WhLpR}PnAN6Ig4M5@6AvDwirDaz$ToPeK01TT^eFZ9 zm0pI>FnEXpLTQ7C>LdLE=|O^)xIeJ6gaF+Om;$5zag5q{NyfL6zYA6NRi)Qk_8Q~< z!xR*%wa2jXd9OY0t6r}>q*tb_b|1U4je5EDXMdhZm!A-8F+)l}LiPI}&v5HKnI`R{ zeM-{1L+#K?LHt)bp;vf*b-?tzO~Av+9+BTBM~VDO;9bM)uMZ|6nT>eH-mTD?F;3Ca zcFGNU>i`!(t)$cSl|C4Fnq7RKJe)6wIS``qK7_oF@NqQEJ5$Wdy*27#8S@H9aF7%8 zvO+y7Io)dY)Ge`Bpz_b4e8#@kd&BZGEqZ{cSPF9)(3X+jwWH@Wzl~?$QyL%81)ji5 zef8wPdTDubv2iAQE6;0G;JLzfn&3MkUc{Kk$I)Z5{9R`1tO-DXc(OT^Xjm2@&l@y$ zDA(fP51?BXDCucm3R{v7RcRBhA^}o{Sv}B{HWDQOKgfLkB`)*1CCXUCk)hldR#`*u%)+B-lwe zF?&#f&2P3>I?$wnCR5`F(h%#brQ9V>pJ>EjM^C7c>FETHqy`ulT&D~O>w^`xJ_+l6 zfi@dYX#l7MpF$sraqLQ+lhm@zSlxo+wq7GgP8#(J>nm*F5g z>6wJGs5cR*X7W{fz6IIFx%I({!ks()E7S)*2Pz{3m9lLIDm2%Al=KIEE>SwEh<^{{ z3|D26Qg*$KRCL#Ci1B!ocN~|s6|uHW?2wGa8MbUY0~HjZJCOR9|0d@=4#1^68S^Fc zIIh9+xYe2I@D{1xMSk2XkQg<1k(pv0>eW($Wm`&Of9Y(t{jOU=K zAL$-8q+OoHQJ9xuO;I^{x?xiwE;oi2h{%T0d+b5)fvuL%X?>-27tpn%V{A(b#K(tf z(~GxrALF6g+LD3f-U4gu?3Ttuwe_WJNc@1&V9MrfPIVcN>V%(1P)Fbm9=^@PuRKcl zV~!I3$ShoUDqaJ;`d8}R169L7b(DG#cypj)!>e-8$ZLloD!Z`6-mTBd;A%a}gGcLu zzr3sLSsCo%8Ew5BZpj#pds1j6RikqA{DVC_Yo{#WvQkXIl2qcS)o2C!qreXZQ99?! z5y70IEz(L!K!@;BUr_Z>v0 zyv|y(gle0IbQiMho%9qa*HcUv-q)t=HiYnX+6C#RSo=x6pi0wl1utx1A`8lH;PnI; zqevk7U7x#4=HJxtk%@ZTDjmhW-^=-*4h>;qRVUvT8*i29hxGNYgTo_GwgjmKe0e)#1G{+=qagS#epbp<6Y#Ld%3cdO^IvG*!Gl&o3EtPolZXv zNZVHVm$4fdTPX9myC@UQisxbL_$(j`Ca@;2b9Yuj?aTJ?8V8+gr@3T7)n*|edQT+7 zbn;!1QSo+A0T6eMqpmGjNQ1o3RRAipqgouP9+EOGG`Fbj=<8Pu@5yB4xRSKZ!&(R# z#hTd{N@!bGxScjUt>wp1b+!Vfe}u+Ed{w+G<0Yc*^iSC%Oj*q9e48-`+G9?KW$e_n zrpxO>I%cm9pegk&(K%!ir=-R9t(^(urOuq#C2ZdOVr`JK6zlf(QU>Bqvd+pPsm4vZ zT66zY%dURql1k%t$~e6+J{RO|g*DQ13DhwRgZp;i=87VgP*`TAXkD7yc*;=ANFZF@ zwUG((yM!5VEHkYAnB43H9B|v+#zt>FSp__nV!cLbUVPn3Pud1;yFA854KOkPX3gF8 zC?-VnavAg~q^Q;{+1^ME*IgSmEl;7lJoVdz3{vaE>;Rnco<-&7bt-WqsP2= z*|qpn=wq^Kx9_p{EveHqUm4C>c;P2lCE^RTnjCB3QrW$-vYy4c>BgO%e<>awchpaT zdaI5jHcutrKHt??Z~Mky2&J@RR*Kf5vkqPyJK4_6=*i zY~~NS+x|&Ua4K&uhtKRtf5tmbx%{P7>L6|;Pb4hvpp>$=^f7!6Wyn%=7WvsvlI$&P zHMQ4eUC&4Y3mdB*tmRaWVB=muPm)h$b4fxurdKE%Gw#AOW@ibH=aj!Etz=36og^gv7?0>` z(rQAnw8!RY!&Fk9S&7Pa+)}mc8;^%du9`iiU7uNb)y(+z69`gSS6NZpr}z{UR~Zl{ z+KRzv=-Y+r28yW51Li50^70G9PC1SjEC!;pWpWb&&;AJkbF0Whz)F&z&8X1( z7kS_Q6kb%u*=oexw>=wIJVd9Qr2NDz*iq#t6MY-8Y*Q<*Qf%+fy~opkjIXn&{rz^{ zJhJF z#wXCZm)Vzqz<<&R5ch~CSov{ng3s{a#g;0|;KrD)wH@jcqK4JUnfl!Yt;=i|!0JYG z_mAnbqkh}r&`R+%G1^ZV8=!PEF_nb3{a+?dQ<*>6{ zm***#42h9$=OY7jDGfw(*c}5FyeOb$*G+u4&J_?Npow6K+7Ijz9 zjS?l8`;Gt@!T7f0>@%xy+e8tEISSBE6{y=?-HhZzS5m-zo{zg6XV+MBtLYhx^lV1V z6D%Q=d;YqeG0LA9hs6$|t)?sZDlfJcaRD)Q5lkJ!ew z5Uc6W7z3ICS1(R`K+1V^T-0}&&eaka47ODMyQp!E|i&# zb1yUu%;ie;J(XG7YirLqKphW}uPRvEf_D?c;?O>>!f^37Ajj}_Nrt!3bnysU%wZ-I zF&Y0?g7GbJCqtcsgn(jzj$&}@78XUO+OT_MRx&o&4hG!}M-ug}1LgbRGcG|>C<_tK`dUQN@|~Se z6-3g|_6&wA0t^hyAq*~&k2g%{GZ-?{?IkcY(vtyT2_TJS0D0AsfN-|LY&-IercSI@2_TPq)u$9i=5z_17~#tybImjl6Q4Oqqo zgH2%UeQZMf@GJtt?E`Zohyj7Q5{?i^!WnLJ+nD>XY(qjqLc*DYgqYv^Q`IxiJgb#) zUf=xp(@XozOdr+N)!o(A)z#J8nsSe0(+T&sO52Ec--+(F23H?57K&+c7=`0sH&9aI zcVkS<#=O>kSQi{5OqZzVgK zHqF+sK)_#(gm4yJTC{9g_;2=8lkABEnX%qfJ;kDn>lfUM?|r$9J3CKvbffoK(r|Di zI{^{|51O*wlS7c+MOa_6LSnZJcm7o*aMnMGEk_QF!L_qn$SZ>@KVLP8rP%R6**4C? z==Hqh6R_azjuzhykFSibm=wd2{#qlup7ds9h!?b4V>){S-&??Nwuse~q4buZlPAC& zMe8p&P&^BL$`3f}F%o!>Ffg{E7!JoBSkrYH**D3yzulO&ixu_e z$O5u6Hy9FRg_O z{bg+7DgH9PaD~52EIi9!RxZ5AUsf%=++S8N{HedR7vAPCYZm^(UnUnm>@QObpYfNq z3tzSuSp{7U2{-J05(5pR#^BFp@|-QkLNKOUL|$Gb)z=>!oYcvWzpL;sZ-iYt6a=;9>3+wKRpAZW8RIPQ;$gcq zNZN*jbPrd#^%2sbjo@f>I0fDeP4jII)7R#uZ&|m4gIi9hyrR4QQmAlF+4Y^)vD?jk z*Ie8VPMB2i)2)WrrJLx$Ps)>Yu5*Qy5>W0_bwCVFjl5m7c6-`9X}iUF9IFBeIpG}6 zicy4jp3mz*nbp-2)znEj|6Lq~HaHqxir)2TnZa@#3VRJZ`pkIoySLwFV{P{FCp6+G z&0gsTuNWz)5ob5e-+~oHxJ*QQoA;pmyq)x=4VD38IzYmpy8y&)6xU|p|m&b$F5{iOFsCW8r1+5yw@qV&;`6@7a~895_MFj;m_Lps(W zKM71hd8u;qlU0vGOVzXEV)?$Hk(3^?3bx|cVbjXZ?%%}C?5%(_JoCfZW7FeHaa_s9 zFbWWg=6r@k!i~FU|8tLKQo4V`20+-M6&i;{)pjEsEnHbye5NYT^*d}7004u=m9;cK z?xW;%qSR0O_)Qw0qm=Y$8W^fTh2p^wFjMmZWEql-|j9 zNctdN!*)pLgyuT-J;Sgk{CB>eFLyM0RW1EB-HJLg?y3=jSM&}W zcQ!D#Gf+^nogxjT7c$0)q;f~ys1_nD^e+3Py~Z2XTDBi<(k0v6-YCt+yq|cYM9qzr z=oFssv@&gIZrn{_DxzlRLdOz(7(zenI%gQr9*pL ztF7PNNztEaSIg(*6M3>|(SC-pgp{<|eQ3Mw>lR;!$QR1W*8A+5w_)(F@B7JTdVZlB z_L*Z7@PmzI4%e);BnKQxnT=tdQ1X3uUuU*%Vl4dkt!$GU*oJc*b7B_yH0;);4S4OV z*csV;nSKq(`L{eID zzh$6jBr_Th+H@z$_k>_ue?r5&T}Dv4ZvBPp+#i+NBsRMur;oE+vYj%D%d%-UEltBn z2z1W(^PH%v%ksF)c$X?@uMU~pbu%lJq zq;9<jP}2ycP9Zuut>r>!uyoY<24P}bSt>U zDa*0is6BKk!j0Cvo_ItiuZ^MEDXuJwOX+ICB3EtTZG=KyV^|!>SZ`=T8$VY8=TgPb zj_1ZDv1w3bVe-S=!bF4qU<(s%>0b3lhSL7}hLHBK*jBFl>xYMcjU(nMtY;kNESyA| zsQvZXF}ufRe?66@O5R*}eKgG!W1||q1{~R8P#s3bhRyewzbi0t78Qhmv2x%@u9JgN ztTFpN+UWcTpgV#RzUmw4$A zRwZ|f;JvQ^8p3nW2>IyIxQ7%FS#-{YKG>;D5K2@(*`=)6)feb;OEU)n%k>t}XM z2>}nKM9SKyWtSU!k5jrgknUYpcO3x=^A@L<$LF3;4BioA?!D!*i>Dx1SFhvDrUaYW zohMD8@!HYR>yEYEQ+e)U2dg&w*d2#=??LVZ4>lo{IS^r*>0D0{UW(x)9no!JFCISX*-X-ed0qrpCx# zR!Q%Mt_94h!NhToq~}h$Nek+lf6a5hS8lwgUeEc3AQ`K~kR=pf_tH(_Kdc~}4B>A* zFs)i4i-(No5N2Ces)_G$U)4t{HfAaqLs9k)SQAuh*#i5r8lAe{GjXFgG zRfL3f9>H9zm)WTxNuq$kJDt^|z7LzAvthmTZ9kPFq|8^vtxPT&qieuF@G=2(4QZG( z^7ATz=LlVkSrRUoA>7YCzsLEVD9M>^6ZdS4VeJv-KtsOBBRTNBo=258e$q1D!p-72 zTVX{kLkZ!m`S8)AdGDo~M%bx3S9Poz`zg}Zqu-G3FC6Z$ZqgO(`VKMbGpZ6C*$fNQ zc|i339%mOUC@T|luT`3)xla|3ooT?KlP#I_8UXgwq*=P@QL`seL6Lk`{PKT*!W6xlB35&1F`Tb7en@ zClcLdU$em#x<)W9Q6Ig7io8#BC~DjptKb~N?lFiGkf(~dXlM)7CL^SG14Uk0)SV+u z!@6tLcwy1WmaDr`oWe4+=9cxaUg(hER*+pDox1>_^sjE03w`ikWcO@mrd&T5+D>4yI@^e^ zpzAmVNFUP10<+Xacg{|F+j+yr(&L6VbCgh%=P)%=plLpXaA5b%Gbj9|_w}6n(j%E6 z=N?Q9Gm}Ck`v_2oIi8rLy3aZ{7c9;plnnz=L3EBEt2LOD&W9dSAm;hLr8;|eI03^Q zMumoYeP1*|>Sp?Qk_*?s)KwS;sr7UZ;nCdHWLBJTF@R@AD&qoWqVty`I`V(LI$;?l z+&LekNB8WQuV%)AIy5!T^%sX5Qi4JwUbTL#%)kz73dq8HSJaB#_*- zf}Uh1{MOOAJ<|}*YwC%%-)=mprv0Dj{Z4OH9;r^FV|up~K=K^C4)NBGAPn?WEK%?H#h4G%TK}NIzA|r8ZRV59e z*9*YRQbKGLwq%`}o$YOjf98?%o5!r^I#ZQF3{#A8aG`83wIOT^s7>t`yu{#{?H99^ z>vxbPO<>%?@uStTF4e4fkIy64LMviIKOpp0zxmhTy&T#;)%cZ9N1@-XMO1ud#dv88 zPf25tNgjUC^(EmPZ>^ah==J{R9js1&BkKd?a((p*>Gl(bSd+Qm6vgVFAK|MQ8PFwR zcW#M!d1}*f=5~IH85cxF^=%~iP8-#i zKaTT;LeEZ8qCmIWX)o@>`9TeRNI_le9!HRkPz9}tW|gG?UhB&1bNHOyIUl@z(02GZ z1?QdM9Q#WD{lz{uDw{-}No)IkCp%>zK}587FHtwG46fqgJXLanjDq0UiVJdr>zF>` z;Yu9BtMap1F7v-f${Z~&=me_vEaCZ^kv!>BXp)07O7@UE|5s`gmp!7`n&Aj0s(oV| zd%cMjw$CXX-nqo4lw8(qnv$P}*?x;lDyFBC|Ey;M^RI_6Yfie$QIZ4@arR)upo#8| zX2#jImJ0d?+jm7l7f?|6C}9w;_q1u_v&;K~Hi^mb@IC5H(aGnzPw3~P_WeVskbcs% z&Unn^xLhlJJks#sT5BoSIjF7vM!3g)1zVf!Ag^aLWpO3_guyUfvK_IiqzlHeX$AEe z?Io7l;@=DHkoB44tKrR!vh6*CH)jg zrcV!*dPL~_F9kq>Vj10s6{vGf4CfCS2UGzZ>e04QTD%Dm!#Y%|=`%|`Qz~(iW0O#g zq`$Q_d1PmWz-i%obP;npXT}39-Ck%0;jIG*I^hkp-8Mr?(hY}2t`QKF(C$t6z<3?)8peJcZ6aTg^#m`hUrgfQG$Gjr3Kn1SGwYYC42Scf zg0`%XWphHbz+rGb^?*&j z!K!00A41(r_4yz$*9{eWULS7sQO1%pLr#(P1*9A_thL6`F5s5N3p|6$i60Qv)1HQ~8F*R_w2lXKZTWfLbi_!5?N<)|&ghHu@ zXs@wRqSGB^I#tkpa>9;d)^z*ezO>W{@}c}`=7;pZ!+85$Lz&y?%~mRXWf_ly_*3I< z^QUtHLwO%LlJxBXjnm`w9|Ln9yu-+@!Rkzbj^aU*BQU*k-Vmo}Gd>so1;!Bf6+iSu zSsJ@LdancTy?;i$B$8vpkS^EyX>kIX9TAFp4@o(`_g+I{*hU}pc|oyZy!srDRk!8~ zB@f|M^DBKEV>8}hW;OJ*g`dkpMZN8ED!jiov+(AX3RqXMS!;i7y*ZhHub%-G)cS7- z^Z$X%NeZ?6*g+;YJXyAZ zxI!SI`o-^4-iNI%#0%Vq2MZbHao8r#;yYsddSfe`)2Z!mPMe#L{Y}`2QtofAb6Pb` zsc-5R*cba9EuYg|w`zUiX2hd7J(?)PX)9}_?EPvqUAlrZ1#$@g)!^mnA9`^5pUZMh z={cp)+PYZiK$F2=Ln}Jt-{?^te9$N=^G^%UK4Ikm-~Im?Kk#aa`}dX0oS0}YM1D-f z6Z!(OpM$n&0SOrHTBx0TUkTZTzMN!;U|p+}wc%*og?AD6gps(!e35-bZE`ahZg5(0 zJ^EGp>irFM(5dr}t1kF*LU}FuQTw7F^)dA!5KgkU6Q4d&kTsFgiuY$C%s8iy4B2UB zcws<>OzKv>>}>*8Tm`@V_GRvYr(d~zcyx61nbtf;NA;hNmC7|D4$Gx;QuNlS_h^+D z_YF5oQ_pr2R5B0aUNpo84x3*D(p$XW#L*Vu|LvjSBOtJopJez zE9ut&oZb|mpNroLfl4fAQ7EN}UeD)==&$jSeuEsX87ph7zIZcvQn*ofOD#K(;&B|> zJqxv1wucXFk-tQ0C}m3dDP0_HX>mpS1uM9_F3R6?kRb`eAh6g^u*ItuTkohBPDLdP z9LqG1JPS@7#gAupkMVRbd?ub<7^&N&9*Uoy$OB$2W8DF!XOF2_CC3|~5NQiIe_KoM z0Huj~GfBS*{Ze$RbSU$6$bQ{vBxu-a#3d;jar$+Va~>6aI44Tsc~AwVc-*^9U@j3D zEvLmR92|{CnY%6nVRjEeSO<31_nr;DpSE_kVtW^XGdfNkvacKc#v7vL?A9GnWcL1S zG;Tp>lYWbGCTdMDiVH5VbQ%qsiWW|GltLD znic7jz-If{n)uGO{{UZabjJyMGGV=o`H9BY#OWoxFak`qw<=1X!e`R^4F$Klm>Bi$ zv^Q1=s_O!E^j{cfsyb2qr2)yU$J<$4C%D>V323t>IuxOt8Hbv1?a(a=EF=m8Y zw>~Ez<#;;W*cgf95#aLBnLx>k1vbV(bTB|6p1Rf(J2Jt;X?+IyK0nM?%AG!iF4V%h zw3cO%BXA-co=}?e0OK4K2Ey3_w)|S_PF!7gJ~F%A zs&D#zLD`B+7at(?8GGVKR)sg3y&pp6^r;$z5m(v(v%YYx@L|&S!^~tqmc~-@#n1EO zi9^8WihyYDD9`=orMXcQFU=jz{ab8B{q@qs+e6~nO}$?gn0fx$W+^C|<3PTU{o+yx zSm{`Co!Qw^w2dDDs;=*vF+6JGb$ZhRHZ$Jx1@whPil)Rg+=kNW@@_Za+0iG0S~=`mn|@;rz?*p zzRkb+?Qdm5vpGtzD@JpIgy6Vwd&zKA6vi((8#adVMdV1WA09_}UlhL#HO>AA@Z;U1 z8`(2>F&X;@pytyNwh%ej89Tsz>KR%c=9TTY99XUMRlFgI(4;M$D6*6=J~$s`_!?qm zbiygVhB$TM6;<0j%b30B<&xo!rH;z(fhH|ii;g8?Ulo{KT%qZz(b|& z57YisY1O9>mG;$;AmH!|rPW|5(xUV!Nc3eQa@wqdzEl{B(Uzl7MW>L+0NF-DARKckCYUD|uW>Xx)Y?0zNj}^L*4}^Y* ziY@wz%81QKrS~k7_4e}PBnJ;0Owmo2#vrGlP|^=1(nm%&m*V-BPj{0-X2!ecI6~R8 zfy$k!c4LPytYyz3WUP)|&p4=hjv1;rQGA&c(~&=5HidQH>RQ{7{uofv7u-@1GZ}mf zfLI26+aKTY$9MIZ8hlTWv<_6?o6woX!x`3Qo38sJl-WcHR`z-yiY7UqkQ{{9FM)@? zmgblygnt>Wk*DF7LRMe{6)Hb5N`xzWh|zNFO4*)E#m5^E2)_c;17VAA>k+_`i->1R zvI`CzoNay>FtInoVp`2FaNCawAsdR2wIM_*AWH+L+9(AsOZkA}?9LvhB(2_8>Gwvd zsJLn@=W|i?>*%nxE2?x7T&`@H9+H-!5N;a);w6u~Fx+NHA% zDTkJQcL=O;5ahc?_Eq4t6xp}1jhf?Tpec_F=tTq@RKa#e^;#Fw8L|y)Mn@peueu!) z13Tk9y|j2V27a8`cxGwtP+x;i)~$$3Y){o}J1W)bdDE((z5-~gi{lCJ9f{h;a-1CZ zj>M2FU2SYb3ZtBJCxh<;83r%=lSfpeh+BHw(YoIA7)F??rk9E3)~ex&y4?eMnEbTH zRwZ|KUkt-tB#@+EodKwRl+yW^&o#_lK zJZ@r}>5M>_@n9KzDpe)u3`Ea4_BFq zu8)$MsOf=DX>@QLAPZqRS?bdS{6YY@4unSt=Sxsa#YS^gE3W0m1<1w?isAweBgJ`G zQQQoOT5+wB;v6c)<&}%(Ua9q0z_#7kF%fF0bC||QRO+U3l|ll$@HQ_mR1Srh7t8rf z$2=q+(rYGakLN{rlKJ_`aprT*aE|67d<An@fY8-A9bh2>~bJ6T-r;%zXk#z}AGQWFr zl~rR&9>P~g?N#lu`N=l_R=3Bg7*{a|t|jtfLE3JwAs%z0Nvn@N~YU-&bcY6srdocX0tbAm)r=ELczjnH& zT8EZYuWT*e3U4}bWxHuFL*)x-?7EocT)VLeMfI}(|f3WGq|xYp!T_Y3?` zlP$9s!sc+wt|GBG&t4?1XRP`hyHV19dOx8X>{XJj*OwUf0RmWn-KIx%aJwG(WW9rD zE~k%EAG(?Jb4na!5tnsBxNxh$AWE-7e96iU3$Yw(;94XFi%^KM>$qn5(*JTTRk^DK*HcF33O+AOrNO}~Rcbb$PBCY=T1{?q7@{7vz$f7*ZF$#c8U@h8v_ zE#~$UY>uZw;U$D%xKUeK%hrLg?ZauUCpp3Iu=|F=xcZ-&`&zZ>>FaAVGuPMlUJJ;r z*TlVBQC<&T$_LAs>-0!p#xH4;!OQjHdvM2r%QwA$DKy2Npxa}P0IRsK+=Ex~!@EEX zUafai)=IbjAo7NFwNfHc{6Hs!JzrA(7>TKR3^vrZNyrZUv>~XWL*0Cgd~1l)$XNKc zh4)@Vc_ZNg4`FHHh*z)W-Kx7!F8~+L8;3Z*j^J39RxPV&b{ojw=_AbB>20L_j>=mU zO-o6!4OZsOx&&{aH~Pu#<|Na-gdzUEYU-fpe-hQgL*HfjvKjST0RGu^? zCR$YT@T&CTRT=y>l0&I%8)-3&Q4Y1IcojN>=)0n0r*-pBX%XAG-#oS^O8q^g)q*rL*L(&yb9T)uY@F5^pZNuLhbF^9_P7GLNAYDrg@L`Q8I!hHmAzi)8IN_CuI z@2XVC?0TwrwMfu1{IfUkT}%JS2LJehHFjU9)-~+vh5{RjgIUtBF&k&c)1uj5 zVqh{*Tu5SBZCs%M$az7?%lXeP4E!0XeV| zpJX0CwLdxl*0xm6L4^&y4-aAAU$Fl}u*bVckX5fN#)qJ}mGEi<9X1CYrvT_HjEFfX zH__b2xDS-E$yWP@1$};G^l4634s4@{kSy##j*_si1}*$&G3u#-{D(2iM6(Og$`4Te zIJ!MLzP)0bLN!-x;mHvw+7;EP4CnTT@&FZnLK#BG|iG{maOtL5gJ$OaxjA;+^HxW8SQ zspW6$>iL@)b@m{6>q?!E)z}n$*;)}C_;lj~GuRvlwYVe;BD3UkqDSuU4YYtO$o8Ez;gXCmN2L=vj^-|mh`%!=4#oj`G z&yqk<2ublu9ryKVE#KCA_7Lm8`xOg&LPv;Zsh-p1(MF!)_vCeD~u{&G% z>KYlAO)or)84HWEg%{a#@LO<4_HL3`5(G@2ZI|?wKpC_MgV5%L<^DOPH3!wBH7t97 zp#CiVtkM6V7`zuv`7lPhr!o3K3Ul;C05DZ;z zqOkQ6<-2m$oSp%`l!Y;Q`g<<88PT;pS;%uIe zfC*EDw^E#)KxpI5qQH9dZS!`xH$&H;EX902`*x*9+GGp!Be*iU0Pm)BE5*t>}S zoxgRw>!0Kot)qVEywK*?_t8&+4|^)6fsj4}f@W`_+q2*JXr#d#ctscQ^D)cE8iK%E z2{Wgb<8i}$8K$Q>X#})Eg13<%I8=}O8fqbvFAB;lmF=%T#4;uBYcOV4!J_aT-+crq zD4?0Wm=HO$w+aZM;LIMK>em#d#gHa`jarzW4$>i4IT~ovY*{kmk6szxH0r-y{3-X< zt~uw){9VIezV?ykX$^mJ0=JewMw$H+PkRn;>|vs#&wfJ8cAOqQ0CK3IVOp2qIt4~p zI9%U0RvY@>w<{ff$ZD2Dz+|HVu|_=@?k{fPWH>~(X_77`>YzH z%4z44>r47m0(1l>Daf*0jB<3{?43e_=b!O3^sWzn8J`}lyEgaB7+X91z3Nigw#L0j z+xcR1%qs%JLQm(gt6#TN3;w0eohu(-W~2lkuPpF(N!8Dtp6(dZM|JR*%et^KRjduq zg?>miYR?Cd!*4wbK4XJxS}!4S7oYbxz=>Ut5lTtS$C5joTv}4(=iO@&7F!Y0C0%!V zAU5T!X*!#L8_^u%Of&XDQ|O~(ALF&{M7N0^)JEv3+fk{2QluO1D#u;^)RZl*{CYm{Vs|a$c7D2`Q*xdT=i9Beh9+t%0pxh8;^$=bjuVZRGW7170=U>VvFrJ0@%Mq5;^>)BbrKLcBc z4<$%K&?23@Vh)KyJuhP!$;ESdwef`;@<-i=$v0YhR;haOY1o)M6R0rZqMp@G=aSAP z=>t^+ns<{DJXUuWpoZ-mV-Z3VhEOSQGF{}|QifTXSw6hFt`y!kF=bekv#hvp5=kle znUvrAa|TTMF8vG&bQTdE0(GkjxIZ~;S);vV3b!;pPvwvjL2tB{yt@Hm{{@v*{ z!}6a@`Ce||1VZYOn#n?687mqvM{HMJL|cBitTS+DGdj3FCe_p0h@;eMqbH9Ls!YNE zqv0UrZOd6lg3icYSjr&uL4f{CR)~OdEKF~zOoTKjgI{^G&kz}$eQs>n<`=IvG+3rU7nMG?_ zgQU#2aCv*bt5K)1vn+KE;y-p2Pn6F}>_^*C!ApnMU+mgOoL*z@+&1a=thii}K8$?b z>SBj^ENbCQ-e>1!BFC!RCfyJHGLa}3wbEKVw<&{?Mz#nGG;bMNGhRa3KeqYQ+G$;R zBK28yEOh+!^@8iI8{v9tzTu_ea0L@81E1F{&cDh8x(IKb!9RPofL+ zau^q^C!YF$)jPKw)KMs>)I;VF(hCMH8upGvo@fQO;6ja8(HqI%UGlN{o{L9^)BO%u zIRMp{-h~Jdg)21?>pqBVITZ3f%2)8zx3b#%Az$Mh-~8!UATX~&((M|G3CsaykN zA1N5pXE7)iFPD5|n=e}EGz!T(!u}<(ZeV~;jTT;wZermEex}mX;hJOrTYynL9EtF| z04|FTzs8qGarDXP@Z0=d>!b^)ep~;8;~P`{pu&B4;%0+<;~S>b)Je6wLU--%NZeD7 zB`Ar0J7mFBCBeinldE-YTuNX56XOTz>($U3={5`;psb4AXGiZO#MD-IZ4$4`K17RT z5kDaiV^Q)8Z|#No9?iDZw))_Tdj}PT&|)!wAakvZ^A1_xsy8MFyN zBesTz?YZQ23$}2I4mi0_v!4kkI=V9S&esr=Rj;>`*5}K|>i{*1G!fW~%)s^a^R;2g^D^rXTIAgm7!<0?zy-1gS$yYLr` zLdyl*CkifBx_ScG>R3+ui9Bu5PrUBEr{zVf?-n%SEbDe6F8?_+up+K66r6Bk+iKYi zZyrpG3a*lz3543f+)5vbe(wFjQjBN|EyQ*gI)!F%7?x`b(O$-V!F0XkI^O1VY>%#| z#9@Z^59j_|P6trZ~q~z#m^Ma!8GoogCDP?K~4w0Q{#{$(WHm;*_(=$aJXX8fWX4VyPUdjBb zR|70nrSQ*Hl{uaK>Jp0H^(nUe`}tpeC`fs;j+h)QYJNEl4R(=r_?mj=PMel&Hzpy@&qzhC%oLb%`dC70j z^BN{566HJE9%-Ehto`VS>H}cN;Q{V@pmW?Kjk&jWWU#h;PGv1K$=Kq3jzHdBP zUsDa6s?p*G)iB))Y}@ZqhvFQ`_O(&(y_$wSzAnR1w3+o<`W#-y!(BI)a+Y=6Uy$_j z|Dgb^Y_n%WWKuTL=USe|4M^h~CTj;$ZoTNSb=$fUcep4|?bSTk8yuO~-6_fE`+m-H zMXCnc96j}AQS(c50egR4H1=iQbvpUgZ*{fkjvm_N)?U@4I9BkmXz_5>t9K>1XwMbv zh4VZteLr92aM5xTCH-m%%?v{J0a9m(OkLB`M~LOgu0)M77V<_+llsp|Phsn5 z?_uQb4XEZ`)mW_hgX9AThK=#$)jZM1qo^%vZha;1L&0ChCUTF2|A+F#eXdi<`&K2o z8Cd^m;ptH{6;f)={AVO7a!YHVw5V9|AeGd6`w_3NlytAq?8Ayz8MMboc%Q6w@F97H zR?GWXNn{@-?B(a~VZ+`d`$%;`T4NbDN@qBz$}xA=9_-k61_Fqm2#dSs;@wm3 zuvg%s?tP&C;!y`>nl3UaZfT}!w069EPjaS5P}1rZa$AX?yB2bB5hhy>5MUR!$vxqQ z%y$#pG+tczDPo7+AhcKLF05Fef2uII?>aruN%u)yEtZ6!cg@9v`;j1Ce7xbrclHLN z*hJOq8+qM=HR8!i5?6X3<2&1DS-0-P8j8LvAOp1&t$bfSrUzeI!J}iDiZ+Md-bRJr zL6@OJdlyZ;q@4wExpo%LAw1E(b?~<{HI=mC$_s5&4pBs~}dKT|>s{ z-6j3#J%gRVQwy6T-SLX=D^Dq9R&aro-_l}sNJ;uiAmyc>86~=|H%U7C*vbnlQ=!#} z>^Kwy9j_Qc(yNE@F zfHti^nx*!n>|ZR5-8p z?Xiqg?VPBD{orl@wcrff&$#9rl3k_1< z=C^36e{=!zKi)sQ@vd&g2<$qyf)rHm{Tbva-`!yN3S&Ir42+*^k|qy$Qt9 z6AZiDTGd&-i2Rp$@;&fK8pu!1-omCP=UCqkLhLTqCdWFH981NPdwid@RgN24j(YY^ zU_#vXI2PkvrPLlXD=I<#iUbxm!6mQ6w7^k&^6lDH(PzFMt!4f-dF8u5j!yP=a$az! z^IkEVFt+39Xc9E6{rX}n(XE#z%`a)q*_D6YOd4H5{aO5_PQ_+@PZVRY0L%&adhiM2ujd-7xTFF=~c<+Uv z_=la-um~w;ccw?uCC1HDv{qp3t&^fj3iouJr`u%dCYrguw5Pj66?EA8j(i5q#$ANWs5*QT=XWW3iiR2Lb zjB>(V%O%|J2@fwP+%}r4K_f1j`w`nsIlha?B4s>0mjZ{mG+LuM z^i;!KJ4SOM@>7-qhq+W%Y}&(t4fh$7Dx$fI%5Zj$!f`6R*(-P7azZA8GMYFY4-J+q zDoVwsH>ir%_Ul7g$n`^3X5|P?=OQmVL1>gF%@w z5X4Q=9&ha0%~>H_O-FUkEn?Z=M zGv~L;O%p8ytO{9No(koV+BiNAI*j`H;cY|7LWl__yx^Who4^qxE9Ow{J9s7&G+s83 zOJYP2mI>({ngELabRuahN{i7griJS+(D@jf1~$u!`gOC%&EtkE!Hc`i2e;O2v(2&_ zoh~JR)#VAxHM_%R*)W&XW_{9?k*Uuu)CC4v8(^EL$xeYFr7BwRO$687DH_uY8})Hq z_x`ha!unOy*s^T@t0q60?J#ckS5~U?L-XO2y1E9UR1N>As!jt?z3G$gdRqswu4Vk*ZqYU}2cc_%67T~6D~Zu_!R3~cuMgpHnng?@u|@%>*h*O39w?%<4{wyYnV9cCz>8nV_HIv_|*1{+Z+}-BaUoGNK6Mq?5gGnS37CS9zs;iTSXu8;)T? zZ7Y0ypQSHC{?)FsmTKJhfMqQ&VXS$1wy(olwNL^Wp7>~Gs&u(*S8385k;^Kha+$nz zLFy(BYla| z=CGX^qTH|)mM28vzS20}{=ft|a08DWGC_ishZXpwN>Ja0=Oxkc)PtGJ__ZuS6j8Hj zcYn|!SdiAlu(bmkUq;ofE!ym+liK{YcI?#qj$`MvJ;`f#{(&(5=p6pgBAOzX(8t~f z4NEk~<`9O{lNFth(+x97uI&4-{80mz(Uc{-@N}-BbQI zIaL-pe{DI*%otdY^|Ms=V<<<}JYmg$ID#wt?r^yvkVH7`j1-L74MBiARt+LP_aOF+H&Fcxfs% z&A~7c{FWy45yJ9i+B?1V`FfPnRufC>HPRL8bO2SRGk7Gw`THO6?yWiO4lAuYY_aaJ zse9hAFYJVPXY#j>KlOzj_owwZ@2p~OJ*FYPcAw=4VG&FOZP zUpwHL{ijc8QSLQa>!$C6=gOsH#@h|kN@FUF8S#{c$wVjt|C}sr1Yu%Z57$&S#^%Hk z;ijHJ!w60XS6#_(YsVJ7@7UDc!!xkdIg&q!zhn3#^s(F&&1GF9P?PC$8FF_y65XA` z_w7gu#?d7E@dXd$)ZWF~M^-&QPdWd~dcKw{GHYgQN`z~S!Qg*a4IeSA;SREE=Vudt zp@#P;!;8@kWM3BKE}ExdIVdCaHSMK}IV`Qz(^V;;ikClt=PI=yj<5E$xC`$UW3}0q z`ytPLq9diEmNy?`cqpPKx=b;l{n8r|T(^*^aeWR?dl#z(k4pkuK&n(3sHdd+D zJ10~*RNk#Qs3_!#BWy~`cXQSj9*j)o`*N&*K1CI?oAkp$p4OJy>^8r5F^{@=7`5=C z$x_Bo=Mf=CoP8z_0m|b76x)i+br2)+i>9dMv5669d z$YA4kq6=|efni_pyYBNqWxAY~YTxMc7(l}^eVys@Stt803CeL=4+q&zfJ^JzO7vsm z+DrMup=AV|2t0vm3rvGC`MX2~dgP|1$(INVtVRR4ATH!i%5xe3McAT%>z$f>`Sg}uWV1) zzT~R*s_i!g;UAZZM`@l53`Oj+&aCd0V*}q#W-0>=SLbfTQdhTE!$xQL4NMeVqbh%T zicygEd%R*-#(jRdMANSAUM4FWz8bU95z2}yvMQKzu1)2)Yx_3$g+C&S9=KC2MU*9) zybUdfDjtLylZL_P_qn)Ww>G=-iXquhr(GAp!0_-NYU}%Csw-_iB1nmGj!6Y*xo&11 zk9kr!D(sP4bIfZOFNnLI^n3z>bEli=BI%Vd6o0Z8Fx|@-TmSmoX z=CnA%f-|2-Ev~Pqp;q?#l6#h2M+5V$J6vOE)T5rc2lfPf4P3d^{;)U z9tmfj7XKIQk?^3;P+=h)AH2fV;TtY}#hMiCx0ySb*n(@eb(6~~aU=x-JUG8s6oKf6 z(B!HXQ@BYr*>jkmgB-PRVOgg75$S?BWmi8I!q(p@;u5lL8M&8qVNlNf55q)5>FN0e zRePU9DjYnSdc>U`&d^(fi+MLMSbc>iDTWR*Fv;o2xjoTKaYh$iIiM^_dbK6Y(@lFi zMHTduy4L8Oq(22MbXpxugR-CTF0smd7KkOxD6d&Ku>lij*URvy<_DKBI*{svlT5W> z5QK%6^14k)JzBR(VwcOyTDCVtbNs!k*QP(GBm`cL9dU`u_J3ABtrw(sGX3Wqn=mvn zDT5^h^2CwK>gGy+!kWt$u7pTFSRK#ZX&KC#F<*I;$p=^Z3(6ax`zKFw0i-A;K~KJ@ zAeHt@OZQ1ncj3Y56f{h?&(e9nt5FroYed!YIeHMg5A%oF>_Z?#<8J2jlS*lq;DmNk zTP*JdNKHW6d$L9_h+}n!SOsGD#H5~+B5YCyLjFn!vnb1{$?EGf@Xw0xMry6H8)P^r z%-W*TlkF!?fP=~B?y6aQVi=ht%Ecy?^xq8RmRh}PR-j{ud)4&c31n&NCZo0NpZE;- zqNxnYH0xDHrP}**E2D~CByL9!E&w8X0clM))XUCPCE%>^&_$RWFHX8)v>w&$Eg}0| zAxJ*y?Zu6e+Zi*tp)LC<+7ipV0t#WAtmKjM5faWZRYbq&Fe}?tw{vWztBFT?o902y z&mU1Iu2`4KLFZ9#@~Cph%A=m|QDubksHb>TxwGU^XIqqa4PVr_Tn8$g1J^^I`v(j;@ zTUou8=VBP)UfQ%yFGIEqdJl{>=dL$eS*IRPhDNsA+CaLf)BvU^69R||Gj4gDG^*); zfbYcIYgCz1=6ftYk*wET+^Ed&OwqXc*StNQ>?a8R69oUifB>2WeAeO92A?y-r!@i} zQq^~*+O;Z`vO39LO=dZec@5730#?`#K^C)i?AZD!ha;lHLmz!E=^1O)?8Us~W6UHW z^tHZS5y*8@!Oifm-u=D$Y6v;l0^&(+AQM3bu7Hg<0x;Yc203doYOanOA#r0MyFrxB z6{J)4RKzYj)!q-tn*D^I$b+Uwf_!Y;2fQ~5Z6iEz=bExF^OTevCH=4Pdig4@WuBbs;OqAc93roMvl3%l8@H>&d~$Zcsd$p( z?0}o#Y90F9Om-6ikRLw?i1Vl!aTbh-ytcizJ!LeL59B{fvLkUgH`(Y+Hs^i?%@D7f z*-->tzEUM)DsFh{ia0AUY``e57z`O=?4qsgao);Eamm_zdNWAOt~A}Kxwn2=M6eHV z!Pv>EqQmDWC*n4JYUVNR34Q|R1li}XE>U;8lJCB|$)!2V0T%=rr3gz5UoX;)<&61% z7%wupkJ-M<{o1b~iYTh6LR;r60+rKXlT~` ztI(C*qGpJ=V=NE&ngz5ghwpB$tnIeO*@$!Pr2lmyuDMulu-9~tirTB=_UhVh2;wpA zHT$w}kiz_MuK{nIZ@1fy_x7)H`>@(^GRE6Bx!UcSbCoswrV6t@n3#{)`)S@uW>=aq z{Zo#l{qBG6#jRRxdXKIJlx3NZ!}Y{?+U-fFi=U&X0zPWZ%&x4RySqr|_ffiBoTT5P ztiyNPWRWDA!s@cCE1Yt;S8-$bXo%xa$4Na7)42cH5A?hb@?Br zL-H<@uDyJ^;W_O9&(bA*Jp#mYqKD-9$VvdhFX+l z8fnRoRD6$9=qv%UKOvqgVzTF{wiv1<8Ln+>*$esPC}WZxX5n>@cW)c&U`++nsZM9Y z;FjU*`1GWqPoGAl$^LQw3dmGg(H~EGPd-q%6LC84Y<46V0xHVEdB3ej&p_lkN_Z#z zmlMepyCLhTlgkA01(ZIxjNsWFXmb~MDeYbV1Wcl7^Y6+mXS>bVx?MMWX<-{a_ot+& zRqBWDc91|+^(QM@yNk)7Ji+|G(ZuqC-QfLE_wme!!>EnXjDeSKs?+G~+mE738$$K* z8J6|;h?q8;cg6;Ved@_7-?N)`J4T%TY_LK1$IKcKtSBL>&mOmX43{poxreisx0%=R zm=T2LGMVGXKsBdsX=>Zkfr|?H^@Prz>;^a7`x0zzdrF>I56ElDK5xYuCLeRtVG!oL z!}w2erYniw4e5?nyUe{obav_&$Ce~2Fmdpb;2TCI{%=@P|J+i&MD5usZ*@9AK>L| zad^sCz#AvenYNa(0TRMvvx_^%(`(>Rf%KTr10>zEyfn|YE%e_U)_0Rt@yKn!TaqvD zId_q-qPZ%)5-1rQX|e zSeR9u5`a;YdkYXio2KZQ#F(L(Zl!yu|0vTcgpb)4Ode}u6UYj)4CV(6Bq*0QKsT`- z7Q(=m%`Jy7z3uG+p2A4=02@W_TS5no*aI52fz{1pUG^M@Pi-yN=bDSLK}NTSQ5zeB z@Er<~sJH!JXeNn4OU^L5fwJo}>>c0(FGn_y z)3Q&l@ph6)^$#~Rs~|?&MYcIm*M%RZL+8PG+}YynabYrRkZzOjE~!=~8?`njH6z84 zo1n=?)a0a@j`8UxAUO{Ik&iB9~-nh3wq(^q%UhO*2|_BRb!)cpgUM+zy9z*$G0 zBDMt+GhK6fn0Si}AuR=yunOqZJ2ju#>a}ElTz8;uL#|nQyW=8chq%D4u$Y;?x(zOB zd$4KSEh)H4{UDigj7WDHlh?hVK-?DyT%PE|ybBR|l+Z1JQ&2V@Q+IoS;*ck?x>_{dgf-uped%_F8GuTz;|s?XXy1Qob*N!Wh(ipgD=P zy!g7}O65D>Lw~HeJBYhMYh%m0?@--uN_W|CW5`bR(XCtIve^#^2(Lf1SMf}TP4U1^ zwNAHn?U1LI=iO8bXp73{UC(DYSvVszv4Tr;_VG?r)oGYUUt3??v4-2LLDR9Wt9yEQ z-2t8VYW!?{I*R!#U?79PXLyarZ*<}Af&MgQmg23Lc9#)4+^flna@I-qd(ZW2Z)}Kbw+qm0MYt{N4 zzVJt{Xw2UYS2W6&Xm)nbg`0FHdZ_CAIBtYXv13WSNP59M7vUPXdT_*V3>Z5J4-5s* zTfx{$grt|>m;TSDfR%{gX_;Qzbi+wQ3^AY*Mot2fHt$OG}BA)@jA;Ol)6_UHOM6s1%UfZ8o zZO7Q#kuJdh#fzK4gl!b3MRBDk=f*i8&JI$23;BAw|l{6j*{7@WjNXU9s5q5t#x%(w2U zKF6y*^Q+^|3C$oF7R~q(_=YnEs=wxUV!L*KZj0+1>K7GxtQLau78elG(qIgB6*7{3{<@>@Yg8 zR8BEiHit0~SmU_&|AI9(oHdpPRA}0~1AH6xVjqGS1taM`CJxiW=1D{in;F`*GFh-^(g4SHEl~ZqgU9Qu^ElV7su<+v&5 zzB|X!4Rc~y+^QJBFUEmok#Ly=yKYb`Gxwk#{wdJ5(n->v@uJ1d&v}|dH}0;qAl)0( z%KlC7F58?zySQv~1=dSARY};nKQ72NcXGJa@76-Lxmoe3W0Br;7LL^g3Itxt=FT*|#}9c#4hYjL%fk{}jlI?HJ@M z8C&|ZRQ@>0YSSmKt>jCClVI|GY}9u1kl%N`nyO(j?rR6OO6N#2)EjO;f^F0E*A$W6 zTa%$(p@gxoQl-pEEGCob`ElfsxRL%B$#8Y(+ACmd%{|-n#MwQRUFTDB8(~B8a}|$v zDVaO^(*IUTfuk;17Ml5YK(SrjcQB3*`dv8MAsH(V=`kSx8!LzF0sNcIst7@W zB`{o4%^%SIA6~7a;s01w8Xus)weYPyzR=k*Cc~( z&1=QImR>cS;&hBxm;Fc96DrQ~=4;uYD=vkTJ*RadH${@S@@>A;*?6&Q`qG{eNq1IF zCB+B%bcf>$dFo$0`|-gm)y(S$uht_S7gAa*U#HK?;AMLBE@n$*pbeI|H=zo=!d_SE z^)>c-CuI#@tJk>qZY_)V>AjP3WUo7To!%FZMmQh5-d_J620Qpuy-p9V=ixdK>9ODA zx&)PKwc15v=)C9rsm@B)idykq%OJ+V}B!DO*jI$GW(^YV#t&(=U^Q2a*b>l-vLQ zz-rwN$6LLgk5Q0yonbSYP5oZS=R^U8^#O$>d%FsxZ`VQ)gMn|+1?t&vLc_j6p;;@KLJ$d>}NmD`ktwSwZ4tM12G&L;CzFXrPd zR)@Z2pCW?Rx1`xxK5~CrFQ7b!^uK$MS$^V#A1b6P?vx@9(&1oF>@}mA(945If(1GsSMwJ5O4MxUWRD z?3HwWgrkyOf#95S5FD(qm%@2&84joJmcY@x@PLEhNa;|*hp8*c-liUvBZM3_1eDk7 z)PvxhJPM~1CB0{q@xfGV2*&0J?U$Uk6wVNpUC$+6SIkY%KM)xxiuuD#*-WC3;MqO4 zKox&7NzZEEMd|GHL`x7b=i@EbAda(UP^*OijC5Ala-qm_G>^QL(12+G!`T4%q* z`^vCQ!{8Dhyf^W`XLW*%*FwhZRib6>3XvJ^8OLX8g&WQaKZqrcDbS*Yt8u&ApaSMZqM!VmEp5UlC9waf%K&!4Nd^Xz73h8 z+e3q@=~d4Zyh?`4Q1;p+z?M40EalycKQ=P8QxN(sRuLHAWiJ!$%{Zdb>T(~2caNIS zH(}Sjdtu&LmV`ezbR919ikksepUxaLTSaI3WU;uC_}!_OJ5%jYoe9C#%mA%^!v9R` zOF3DROja-%2UluV0qvCoYa3&Mb=MESqya;v44W*_ahq+J?P)FB^YOw z(|acrn5=b=^qx{nUr&Nch6zZQLs{C_?7hcRAf0=CbvwcNPan#^avEm5`K}}nc07zl~d%Nc0fFh_lxK8%H3u z-UVbHj_pdchcpkhG$u6olm=ti9@x~NU{h@N&8{zXtn%&HE^(wA)uaf~5#yna!hwm|x;m>_fQKnI?9Wzt_skmTE8o@f4!JYXa_*2_EJ zWLnmXJ|{j*b*KN$svk;*+oU>(3A|R#@xPYgIAh`EWUsg86#qPhdi(sG-aw$s3`b~L zW@I?uh3$YOWD~M>=x1~PRl@uHfgX~Flj!~hEQ@nk$K|kM3mgIHK>;di90#=(jgAY4 zx!sG&g}5&CYp|1--GVw*;KQ+#0pFcg(rm2 z$+~XoIzz?_`^-=JviKd*#-)T1PaHw^OdLaA97T*Fc8jgF>t^CBO#jR*wxmT5#K5mP z9j~|Sswv!CbaeFa9?tyvr}dh~uKg=7hl<6UH+8;-Gl4GKY(MF%#pYtnnQW^&riUvy`Ig)o46@28RSDJEKx3RCVv8IPJDHTj8mOvOKtzi-4) zodoK8N0RcO@j|1l_Ok;k*d^`#x0peYZKsO#eXT*R;Ea$dA0=-Kp3W&f!uq1symu;H z5TjbohDvO*bt~^0i_WpiYk0}yw!TSvGN3T_n&SxLkd2`lJ~j?hvIoO5-VM;Uaw>fq zWT|H|cmqj&U8_0<*-e2N#{5{{OmRJS-@cDgOBJ%5+u|Bc+@1~{0TO=tE{%f`M@VlJ zGL^xb^r#N@hw_rB&Uk#J(?D@no~Amf=jEfy0#ztRMc)UvxUalfst~1VO3gU;$zjZ~ z#2}Vis;#_(xXKO-2dyrOdoPq<7uhNvFT|3x@ON-|)W`+V9FdK%TSRMYwM>%q9L-?d z**%pEK?YnVgJSXwCLW1{2EGwQERb*H9a3#r+NV-Al57r1*k~>dgVhWX8Ul;d@5@Qe z5f^XFw~z-?-{6lo^9Z`C5?qBMa)?d)qF3|I$sqCvK9>4QpgVR1%ogASg)naJdU$bq zgTWHU)W+H2nA(^Q$JEB-eN1f(*Oajro$gmP;{IDz+&0x@>vK@JU#3uuV5ZY&S$vXx zon{y)6?GCnUj*kz8O|6@sd2lHYGe;VQiEj~v|9FFwaFWNp3W=(?y56PBE~BH!asDKiRMJ0Ilo9| zPSovU)A+(Ku3CP&xP^%hsEfUNfMJgF^?4ZEJE)Sikl=}5oMU4p?L&@M?Q$s?$E5HF z9aO*=dwz_F>^?@elFl!d3>`h%$C;>?7(w!NB)PG5+-c-HI^qn%1<=FnN76SK-QwOS z0hzv$kFXdL?X}0hJM@>g38<0UR&UPHv~$INQ#@P@?Iq2FbuROtx5xMA z)!+XJ{O5&#QX23^$;4NTn<(j$@$MrFkrw2LKRI%VS6xiCL?1yye2>?+M4d~<4;)1k z3?xp}w^urs(Csp~d@aQ}V+*T{DoI%6%h$XVv8;yMXGQgVj(H3r&cCfDi&wIk$*!ZD zQ8e((^XPrOu8YrD8V3*F6ypAPY1~Y!TUlpasm%C=ezcX*mTP3ie`dkKcsdq6GAy9i zvP=%v6|{qk4%*9d8S-4Cp-C%wk3v#sVmy{+=4=w4#W|Iaa8<9QpEFA3=fj(lI!Jq4 zp)U&h<9CCXA$x&V87!y6x#oDb<(7q8cl5pmsJ-tZp^*P9A6sE4Dkg@Rcqh#ydEK)z-=BQonGpG9p8DPh_yk- zf?1;o3a$tYv8z|Xdk2=^~jD&a9W*-&2zETx!7Tco1#$Mc4JcdsB zSRHB4k0|eE%WUl_C`Egg+C8KbDD9yR^irf#yFcFPQc7p-u5_W@hxM{KIPP0o!>-gZ zj5r;GPsb2C-nW?1Lm!Mc?d2UD3|C7@1F4^u)2NS+rpf!4be01vJM=GnV2I1nzmOPu z|HbRz3NX|5cC!R%g#`VFNBoVz>lE-~q$*-d~f5nno9RyI6X|Mg86^FdqT) zv$@61n|B2B=DMwK)@wy>$+XuY(A*|sL|S6wY-v8tX>2LftuE+5OSp8O8uE{fI?Khl zdsNLzn_XQLN8o)tFyFKbSYXL5dWF5apfjZHV;j%ITUoHG;%t2RarIKo5jCX=wd*OK=_r}2%H)k@4<|B^9;>;@=|*S1YzK>G!v zJYs0`rh^4*xcq1Ec_Og{SN5p;KpI5>6WuWszTrJ;ZfiG7KyZs}Ha-IJorWheFtvs~ zLcOG)enJVi!1CZ%%w=QU!W3Udz@_PFA~nZmm(Y?ZmU{jU2I3{R^jv}8wGVkwY2cL z%@2c`Dna{rV9mo_eh+s`6RJWVkTcA zQQ#t978vzux0?@jRDvO|Fd8H#qd!^r>F&|KB`Mg0OXHF=lvW3qDR=Z%Lbts)QL2XU-#I(7 zW6Xaa-n|VaLtgB(|0;=d+6Ng@(|Yy~WRMK`ugZw+ z9Pa5&hBP>N|9auDe8DZ1zYVGlf#Eh<#UBEVGZAI~r9gv)b&~y5$=L)N1@fx^#A0ES zDl3J~uD!%*QpTwy*ZvGJ$hAN5B6GRcgc;>_a&SQ(03#KoHQOU8=MPn<hT(BGX}o)*7@+bgF!0pD{=uf%cbc$&5xqOhZY`Bl%3q%`wc}8iqCKA z^V;I`TYPRkP{QfE1Rw~1Pmk*0`+DFu?pAwN2M6p~8{Edz=ZUJ>tX-!1CVk=G($Vp_ zubiB)Q^v+TrnW)Tg_&&kG3;fX36oM$4J_fuafv+pfOh3LbSF=mJy()cFk+RH7S7(^ zV*5TdJ8sXlG$l~0Bg}X!7VvJAXl$le;jI0A?S7k@i zSEIMm1`FQCMzFq8&fYh_)JHjL;aC-tSSa1noDz=pTaNn9m27(`wP^#b-jX0ux1~A; zJJCILYNC6x1E>X;06Mow4zBcMxEiluQlIF~#QkAaYuGOv%HeFR`psc^zlqZwz&7uA zUd*uL9BLBRm_3X9VGh5Y@>{iS$oQHLHB_0&(`6^YxUazz{yor`TynBUe%p+rIYGx zq{EW%NG0qtZA3N^5D^i#G&m9g(X`5guHZshA-L;+8blo9hQWPT+#NSm9CdVXL}$j) zcGq#4&2e-_6#w7fIrmk)>U0A7pZ`A}=z8zIyPSLOy=S}Uo@?#>f8ulA*8d|uw+|mu zYYlG7$XMO~3LnbLxIYr&eW&!tJVFd)Cx0AcDccX$^ZlB2k`tMI_-)CoGp7q?tg7x$ zsKs~e*^AMOG|7KfEB)8C+j>7$Teb}m_8}HUM{G1#4QQs{N%d$uw{Eotr;GJgUwKbedX~P!%*{L>F76-x#P`3D9s^0r73ACO3UVEn6Av`peO!U#?-T_BRld5AXbToB0wcdq0VptjtY?Rm9M zAf4o+mV8Z7OBQMON|`gVOYLO^DQQ2)cn(rQv_r7?3@ctF<6oFEAvjVt_cV(yio2TK zwy}fIbxh`YJo#@fg$_+GdCCd#YqvRkES{j1o`wMNe(kwvOC1O{-j1DP)&&39T)TSz zLAki|4 zdi8i@70mZBd6eOeo$6uFZ+Rri`))!piUL?+Uo!{VMoj00WTzU5<5g)-NLJ>J+RO=i zox>kQCyLPr!GX!w=03}o+XFvFxt`Lck)#&n^ z1W)cmSc~QX>RszY&!>_s-zT?E=vNLhNM=W*+*8f^Ro$Gl;IG$`{-b(Fxyr=I)cN?z zxK2=xE-D~nYrbO@{%g2MmB;81oe=ui5Ey+z>k})82CLZYqYrKYj3t8lBbvb!3^@*ZPj$EpcD68)G zSz2n=*ZTEDvMaH}Yq1iVMBBUHqj;HmglKC2LL${Dd>U^-s zzmM;TPZq54xP^Y#Yr0>_gEZ0w&ARNl+TJN0_T zp0AqV={K3$I=SWR&afmenH%&iaNugY+jO=nEyLNZ1|8ym0q@&L<&;={q#aY+#3hvR zI6Pppamdm*YDM6lM*}D9swdc4c!HO_IJ=3@)utY;GkIpmaDS|)+FC1wV&1=e+3X@e z(b!*tY=kgmjvw#@Et=T6o{&kj&woff1WU4%`V==gAL#Sj5B&MM1Al(Xfj=uM{{cWd z>cF4J4*dB)4&3j*JMiaQ5BypFjQc>2o2DbR{qzHTd&~j8opOM0haKQs6=`~^g`rJ>_EM zJo6qZBFpqWXF1`XvyA7mL=&S^y0)NH?1?Fr7_6S?O{qA!e7Yx^Gl;eJIJ)t4;ZMHb zLy-?)mq2IMu^+Wh|7@rCi~i_+}6Xr zrnL7+t=G6KR@z^uoN0mSi!vk+qn*HKhq9m~*Vzn-yAtL&6ReL$Jl%Tc^Wnd!{~0zP zoGgZYCp)!T<5raN)SVhQqr4cw+}lX!TQ`s>`qUSzmFOk*4oXCmV}W>2WA#uLj-r?Z zFjAQunl^`pt$(2_BP|uR7_g&2SY)fJTJwn4+!}0+a1^(=;!=43 zii^460ykm;KAJs95PTJOU506EN!Xe=n%~DPfMd?1<-y3q(6_m%tkKhXS-uj zivESNb1Gg4Y(`#OLSbp@YkVpg(uYpOQ)|JnZi7y~w_85g!vKG(glH7GeDbE%9Kg}Y zj#DcKqG}~MU;HrAsG6Y+-fj6T2*u=4ujUMIPgMhnmIFarrir5gLUj@+E1gx{R1g`} z{KJBcFAAaBB@3{77nlWR6j>DOgAsyFYF8EOz7f}i> zeoILcK3@PC@2a0(*T5$LGM@5nSch@?Q&{0Ah;Z60b7*_Yf_D(waHI;kAH@l@%gFg zBZV?wT?)-zt(dqFS{@cc%PTAn=H6y`C2{A%xh)epD<~-#U9cvw0O<9Wk0?-wbh+)o z`Any+nvq5+q4aDl2C-DB<(4rWeoVw|IlpQ7!XwaQXIjFbHk>8xvSldFksrC9^eNwn zo`sUwD@Fm;?LuI|*F&}+{j4Z?HOiH_%iRlhJFTHPG!9odlmhZdR6_fB~a7vL~n#2_sfy4751a_t-psayWkN_oStwLO-VFm zz*O79MldxuB!U;e{WHqsl-yuJYT?p6MOA_*eKGhGg_Fq%%^~ip8b8n#vUpP2Vrey0 z-z;bt&)L+nvoFIoH9rqC&!z_1v-}1SBHnj{AJ6b-kUt3;n<6-z& zHDofoB*R)vS2>Eeyk`C@aaW^ek9V8rwV?o8mXBl9#xB3Ut0BcrY`kiN+pLD=D{NJw zop0xs7hFkEJhD=8R|A_Nlm^qIWd`8#W#c0%hp{Y3hrJphTDwO6`oy)-dE=ADacmmNPiiyq+(k-Jqhx34n z)C^kp2l_|wkR|+N7Z;GS?vfT(OAIT_41#Xd}NS6}j&3FYoD zAT~ZP7_b@gMLk7J%xzvP(4fGwe(Ma-v(#=DTmNZvH~=QTeInnVt?&DZt-mV7)_);{ z$ztoP#ENN7`#5EewvD& zNd|lw^*zVn*1hE1M0+2G~S8pM6p=)SlzvK6c~h^7v+ad6ng?}9vKyUIa<8Rk*#&U37A9d za+QNZB}c%er45S7*t%FY(w-Odd?& z-zpjxcZGXHO6DgL=)O>F>9EIThFSBWt7)Psl*uq&Ip5;+vtS#a|9^N~-UsPW4ZTh+ zcl9*zwI1@#)+hJPzU!jU=R&lH?mSm>cS_VUR4^nQB^FJS*| zS0}KTr!u!XE%!4g&l8;OKS$LP403Dn$TY@QFt(nV)4{T| z0@zWM4d`{=W-$X8K~uZ`sX(_H_^y8yD%D@vz1sO+p@jwWkCeZyswS3 znNuEDyk!nDWj*&z16$A*{cQC?cD5Sn*JYw?15)AR=bxDVdV!^JLD}M(kLp~y*KnV~ z>1@cG*#}k=b{^jz;&<)Mj%N2OUa01e6A;bZcWkc9_sQe-BzI+0JEJW&-*b0b+?Tvh zwe^)8iVY&&Aup)%~kKtzeXMIY>npf_2nMUT?4bN{n_W%qAM&firWn|G@zl@ z&s-VFxPM&TA3}zlUw1q>hf=gSZiHDJhV_qYgw=HYW?C~sbW+G*)TmjqJ<7g{$j!u?8yGw?{Q$Q%?lCwR zV!pRenB=vld>^V+h{2#w)mmB+NR@C^4PUp&nl9@scRRO_4aYpHt#p)pn@6e>_5e|_ zjZxKx0S++7D|R(4SKy=#a#}mL>5d6o`^q;VSxa6O!MUO}J~s952vihr9W!1{{{Z@~ zLbnJ4d9MDrmb`;mDur%r>f|GmKV^cSgZQu5GS>fxEW+2}c|E*13 zuO3$`*0b??YrN5(g{(LHeWY1$jvTj`cLKf9Gn(mx26a4*;0}$KsKWJE>hHwXYxUC{ z*<5MrP-#E!3a+_WC@1~rWSllFv*CGm4u=+Qxn-A|x5k$^1Ea+yH&S)h;j_5aV+jl@ zObNHo3FC4U8Ev0Gj0U1l!2@DlSJrBl_BNLqOJXp%0Ynu8<&ql*m19$<@|{;`vWq2A zB^K}{K+Fx{0pcy&#l{wIDmF*^-BsITMAw-=a;#>J zkZ0Qp+H4jLR3dmDPA+sFaFq*1bnSjZ5h>cbbt}aCcvST4e;mXTl1akw6sKf-Wp}AR6K0U zgq%OB7FEzE$OzN?sZnj`k63G9L$4bHCH@MOINahs+8k}w_BKZ+s{F}$wpBV?gi3Cz z78t}B-NXFym!0p_e0wE-khRe6giLTOSMu@3)K^%=&El%`%X&qXR&n=(u^pOmPq~Wy z$UH3(bZntPsG1d~s$bdZiI6%d9whUsBl=~mHwt^dLumxNZ$n;-oj<5euD8kexrJ9q z=PkfkO+LWik!EepwsG_o@0a%@z_g=~!DRKz$wtucP`X@6xGd)^CK9KD4kr+7wc4z8 zE~LsjG%_F<613w4AZoc4lqsvzt-k2h8y0Mb#?jF_&(}|AVTJh#Z5s3J*?xd6SCt}X z=e@b?D=mB0roJ9$Uk7jyf2-X2HBAGnu8qv{9->gSvKDH6WK}n;aJjR_eko~VT@C{Z zO=twYRiyYYn45h|u%C-O3LIhjQcvL?@Jvqfc9j^8^FDgsab6@|X!8Suz16tqYCj~8 zD|; zf?U4XeMY!%FiNo;F-i_A*^Uf!2b%NZ?JKMXh6uw_Yfn6} z$5u_FeSiBV)tqmch4EvO=volvtND8UsZ4xsSi#o#;_beNSMGd*ruufdKc`FHPI?lS z8xQBbaCMd;)L2g5DAN`iQw}(^rE(v*TCSl?YW`WAeAuvvjp`VXih<%-{ls0p+3vt* z=&91|MXRlM9B;B?7NQNn>U7=m69GauZfsiOCBp0ANJ?Kv31w7~p;%*dFm<_{>utZ3 znnKHZoHrhY=uGm@JA?9(<>3s90gq#;ok96I;_%+e%21c5E^r7%Fg%btUt(*wkCo$r z5sfYG>LDLa%op>Sfo`xt_#OE}Vb&zEZ6 z<4$b^+!ZY@&u*KW24*(R(1&&0(_yddNrlI~;m}!FE8q1=5e%P#_X^s&L3R1rtn#d| z>bHqf-*FOL6_tf`1|6Rja{Z%5OE{t(;W#9kGVLEii=Qal0U-ZA@2u(RwC(FO#SAGa zhW}Wo*;4xcU@0Yc&>8>A=yd*`w|cu4cfM>7D1@BJ@aR=$|MPKpnc*m1FPcB^{=m#8 z#;zqtmY0{anEa@7H03t zUbJ4xuq3jiLUJt`kev&&i`J0+hJ1Ft^s{>vS@x*3xlrKB-sEJZ8D=@ zx{dhVy+5-lKhHiV5W^fTLH`JM5I~UiqkJXQtWiBwoR6DZ1ccp&6a1v&U}aBf^43^rtZ(w>`fW=o!+da zl7MF=gXcTxT6z-s+-e*Uo!J&FZy(Q&`(b-S(dhiXxL5V*snk1f0JO{a)qwp0-Fn3V z@o%w@l5b{%Lm#raEru9{m2wX63*t<#G?oqzp@%{2Jezh+bJUhuE{J+}9be;t@M{!7;O@EUX4 z*avKQdH2_8Sl_ui;^0H}0m-n5Uvpba`Zg6r>s0CqK3~lPG}*SjBVdduH(C&ciQ)tl-5A-Pq4t=WMP)?sJ z(YOujiF6%(>i+tPyL#*EQ%W1?Qz!AZk3OaRVT?DUPpL#-pCU}8E2f&CnpoGl`Gdvy#)~Boj*PK?&9%|GPead>_srRT)^|5j?Fq%H4hkL0{okG@N z!ze_j(BGG8-J?%sb*vlGr&tp~rJ7hkrMeR>Mk>`j+^LO#yCHo_P3)sjDRIC0lqSWW ztWOEK1AQvABODLwQx26`I}W5ztpZoC6s|h*LaHNAo`$5oq1;)Ktq@=H^6A(!$QO2N zmb<+PyRwxUwltZ$+?>~By&a~No$WMe&4j6H{QUo-oz)pu7ivczt(`nkJ=JH8@=Hn| zmd{)k%*nKISNW5d=VhhkR7**h*U-p&5b*MIM9S-EZ1D9WN!18#QAtBa{ zlAH!)P?87eC+_N}G_$pLI==xn#XY2b*~69Ud8W6A`5Z^M9(!%(E1aZjf0; z+*4~XR;5V(PhKbXLA5!(y~t&#=^+`e`7Yg6JY{~qbbXfT0?u=muyn08RN~slB_!Ee zE}4HzfLrM=-d>nSwX`clflEo0CdGW+7Z28_Xd8AF^*1Y5&kB^&2QbHjLG3abHta3RFPGA_D3sA+IUb=wFXhQ=;>#CoV9efIG(KqK9!jzq z;Mf9J1_@!8xyHBHqI>BBXzL?< z?P7A`{BK2^dLm6%qb1Md_w}Kk^voVjs2<98qks&C5S`;=Wr0 zUvgy8F)GzfI>mjPvG6I-@-UY#$-z`g&zjeWBJ$YSIZzwt0aZ%-Jr2E?o7fksFXF>z z4QkEu6z$D$d6JrI&6MwsZLWaK<^Y)|^U<-VdHEvB-IC$%LH%+W^3nssnGPDt;5=yo zIP=)!FfQ2Jw;>{RXW^@j23?ketCXI-4`62x0oL9Jf$F8BAcG7)gm4dMf6M0!S(^yr zFU3t|=HM(T|_XF-;G=khg9&drKFl-GjM2AlyNM276#qj`LBq|Jk9 z!A8w3Z0b#5Eb}ch10Xv(mX*^=&*59SYQ!Z`RYTW;z-XQj)y8YB@jCYr)tYs``NQg% z+z=`u(`LE+nL3xek^XA`S|D>N&(E+_Hcx+Li}l zpM{i;H`_C*SZY0%jjxGYd!5vHXegC$^`n`72+IkE@m;Gd<@_0V`$$+ z?*n=6e@7;fY+&E-yTJD_2kd))4$!XF(UttZ#p^$h_F?}}3)3ec(_W=$HCAxcf+sLP zdddbdJcO;5JvNJQ=1>}e8XiK8 zud1tPb%7d$BM$p!kc+7nol3UH`l&|B`(rqCccQ^%)6go+=0VY9!(4l%Tzd*O;Ft;o zxn1NiFUwf;Q~PbRnkGJ}4+y7Gqa2(@&H8W_?LLKEUHgNpiDRh^JJy-_7%Q7rJ!fDiia_n$mQqjXXi0oHGTJZ?-6>jgK)e&k{2dprbpR) z>igoj{lVp>uBtK=tY#b(KZFBPjKkgIT~%0*lgj}h`87ecIA`TAkH^_#q?*j~VN@B_ zSS`E$+nkdaj!ODF%4iwNTS-2t>0Km%AYB;{;N^{rSzf$-<*|oWTf5i&8y!7vWp!fr zx{v8;Np;2Ub)V$Pma`_k)wL$t`E*Q#)s+;qz;EL^ocD0`xQ%0Uax}XecwZ6JBYg!k zd(c{3%P9B=_Y8fG=AMXymY=Bn1)G-PzC;3BV8Is__BO*UWUO+#{|RTVb0xnw z%U9#db1zCZE1fIsKs+@pO6VDy*q470Ex(0Vd;afe%UJe&?4l#z%V=v{#`yXU8<+GZ zV8%~V-OXs+IZ@|kAR4I}0#h8fK!c$$dlnMIbH$LCyn#%~WoSz&dwgUU1F7RvQ;RCT zJsJi(?rM^Cey*{urN7|E$m(eL+_@IFp{qHKp8kqY_(7-tZolbovYeS`)*Sk&*ED8J07!{UAFla1~5*atDy^iYp;mT{vLhcANzeRQ%#04 zCs%0Q&;;v2H|DX6Cz_btMjdhb5XftCGb}X_f=r$Zb_TXv>gk0bYW6qmsry7ozd@qM zq3rKqTHVsWZLMYNC*=PvGvBJ8i90W(Q-$V+_h)_c8$J0THoTX{aA9GzL$bKZ@_yl zy%~Q1uc#wJ)7xqlJzWsQ$us=tYWwNhr_S?uNuLekHgL`I=Nc55_WJd?kevN2g_5Fx?{-bK;>#?S#~GQSTi~$Tfh1CG!Xl= z_uk?5JkOunp2w7bSLmMxCTnj^*1y-#Ugv*b4Tj=-e50cy>Ii9K6wwD+{%gO9Fsd?H&@)I$HxT_hIUP>;WZIav|f!;ICa=!8k z7oC4-xvjd{ljo)G+^*UDF&p<3PZ)g5?IN9>PbJ-?<`kO>lhzl;tKFm8;C@0h`(SFD zeK>!-&4jC9>!Y3(%Jw=khk~{AwY8&ODKz>43u^o9A-DbDbs zhM8O*oEl3imf;*IIdL}1~ z(yub%(zC>3AIu+OU7dl8>Nz}eZ=v0wC0A92Z(+nWeGL@m6ia~m59GKJZXaPg2ckWBTG zti+kUuDPlfbtUaRYHr%*4^CYj5|r#s@)^*DVPlVj7; z^1#$!EKR~GvmCJ~J)aDnQAFgcT?fFr@o!ESTs6zP?n&^30|6u^>{}+`I$p*hh0fSb)ONpg_?Q_F2upw@R!&zLxZlzuRq0^#^EGv1wEEG0=UPPMfHhm9 z4O(A{BJjXVTox0&F9BYdhUkI1x_rg}#wLWIHUw}U-nc6a%xp~`2i!zTN?ytM8LFZ= zR>wk}_#Mk5J=StbE zun-bP#Lh^{th2cReTf;K@mjkJhF;3Y(b_t}(s=}v4d$hL!^NnC8X1dJS^6?wc3caQ z5_?JS4}KvWMD^?3&XPz^(tDM69WKQR%4<~PXux+NP@{3P4B6nwNV8Py+(3IY&DkQ4 zg?uah_=w}cM$#ua$VH& zadBHm&H0|KLSIJ@Q7_tP4W$@nJ%Gh9iI^`o3h&_gXa!0Jxz z%Xu$PUUSh*W%A^UF5cGDd*vXa0+rY8qW!_;Ik(=c>e6}D>3!kq;y8JYhUhACxcyhM z2795RAu1MRkYXhD8G)}EO&AWa?X@P-mGrPtnK-hryj?3}QTT&^<$6YT2E?zB-h+PD z6^>GHDMsJn879RJAG65b{EOHeI4?vW;rFl9R%@ni$0wM_-KSA%CRw2t7fW*9G85KG{8EG~hnLWZh)iz#+M1^AX0Lm6$Y<-(%Ks@ipp+0-ARylM$ z)WT_f)dIq8l4eL!;-Ff+P1^{dC}*`3JkSBY8)kht$WX5GROwAl4@70fzk%i~&&?sc!i&hyx=tHsEDDDGZVhmr!D(y`M@vf8=3j zDR8s`ZrGeTV6n9q&up`n!eKN@9&_(XPL2(V+QGDYUv!2jjG z@^dcVj!RL13zd9<9~eJtX;Cdv@)VI@N*aosBpe8{bTkyrlMc!wt*+BN_j=h4IWp7M zh{{;DNw9%ng=&F`k}d85g_1v(-xV4BL41m8*-jgoHrn}LOb54#WpozkA+?0Zi_@2j z){Fec=}kPw#(3;=)?AL3Sb3))$&(PUh3P&yiKZlMGE+rcJl&QBEgeCswGrl%a!fB! z15)2maUGeVxZn z?RAwY6Ks5#by`!YJ0$MJT@_Cy@cA8X_Q_;HaWd5zq-+NG9FDeM=`xa6wVZL?p%j;c z3+^0uvie&= z;k}jB71vLU@Dn~p0xDCrx&~?2;O`3hnXP4$cN@{%nhi|pL=DAV!R)~)CH0QX9UCFq zzYNXBrS?Z501xDMSh1m}s~%N45;NgW9_PySh|y?rQ?zCQd369z`jAXsWgU7P4#S@X zM$Fcy@8?>2Kh}$F!s-K4Tqut7zi_PUgqnSih*Ewfx1@lv~gMqcMf%X+FS?y883{|D2o-qJ_29JA-GJa5P< z^7iC!7I>Pfa08bwDT7Dizkg3Z1~%Bq(4_GUf`M_*=AW>)`jUgPxKXjitO>Z+H)73N zxy$JBP1M?`A2JcX`D@@7kyC zEPlXnpE#PI@6!PH*5k>g7fmkBH6Lg$v9Tmu zJDP+;W4rd!$t6Cxp>FLz=I~WmdvVaFtyf&;Aq@VA3mJxOn%QgmmB6z?|HG%3=RbXQsMOo@pT0Kq=`;CHU$jq>5vg-6&HXK3 z<5bCh^~cL)Q?owMd_Xu^AHv&hWP)h$wvK||v4To-|JG{<1yO&?vv=9|PcQVHy8fE< z0TAN{2?!CL>u!d*m~VUlqHH_X0dIDg**LIVPCi9`hC*ikk49QQd(i zKqfx*CSHKhOv4Xg8coBp8m$?E>s-LoXj^8hJa<**rN*c%3}L4TFVpD+LOy@sr79{nhLWnU6{~KVL;Fw-4hsL#G0O z%5$`jx_Tiwi@jlD8p@yPiy(7D)T)?YKiE_DpOh!k$ADZ+f0AKTvfwT@Sv`M8DXlM` zG>34VT!sPd9tC8KGsCiH5VI(8T%=F)`J?`)&x#0n=KW8v&-x!nCzJK_x&HKL2h;}r zZ_t_K&wBnQ%sa>0zd-MDK z8#jt~{7U2OlG__Wi$4j~E>k^}w*K1Jp)FUroUtXKRp#zzm`*2G&Lr&DXv$mqW9dQ4 zTxr`bcIiJztFRSii^g8Os^H;LG&`v*CZu2^ETfY%SLEdkyzzM!;4jH!U3}E+YC>=B60htmVuA0v znWucPl_5F4XiU`tji^IHA7Qb#8Bs&)dMjn&pl{0(NkYEytBjy}OR3XO%aak&qeT!@PewAe#g%_&oejNf zzBo-?6rFiiH0C^o=dID0(^Q_H7>zkkDMdd8-oF9f+yQ}i(i~`bmww`|er6xaV3-)v zdv`8%HA~7<-{YzJI6K|X``%nCI172-r_`PA;BV(~V7_;&-a8lT@%{FAnl{Bhq(`h~ zAF!lL^!0;0mRz=+ig5QZcXvhECB#>SU6MUXn;8&X+sz#W;_}0|t8(S^QX6HV$JUc% ze3!Ybhc*|obr#m8dTxGT_Hhr0R!Z_?$#-#AeNEhPtE=w&v)PE2Qun)z&c$6JbN>0S zck=zqzE;)E^b9&ojY35Fc))}==-F_TUS@EYyB{INPxUO%4yB|IqQA5=bo|8JtG?~M zPM<(w-&&U++x=)n$XFJTQPlyDQhPb4J4$=xy7MrxfkAy7c7yk;{{d+d&p}^*jL323f*j zv>^so9{-+WDnlvqc5AfPRP8fC;yN?H(U>4sA4M5syfzjHu>8tO76#d5+&4k#?(n_{ zY~%S_*Y+Zpa}25@h+8Jq@k~tTO_K%dXxZ5Pre>l0SCp(ITOHcI$9Rjt)Tyj}NAw#Tve#4~+U`RU2I>QurnSDC|`kB*2JlvhgaT|9=E#A0;ynpBGKymx-pi`E<%DQ<}7xcy}zL=>XAr{vHu zV#`thU9AIq8MS8Mk-wXx0t#|b%}&++89mx>y~_vK9nGrU{4vf_m`r+9wDi;n??sK= zx<$u5d{Gf04ZWafcUj*#n3o)s_jze+QLS_b&m^k=9I=dm$wbl%N4~Cpn~nozEo(b$<~IqzD|ff)w%253jk)}u{(c`EJZTsQXZLYXg5C=U=8-HEFyC=%Kc6@SRAfVzA!7YK zBjPPSVCD8pv-xg#f$Zy9AEgx@a^?VkhdkWzCmBj|sLQei zL*GD{b=%v6`Th?J;@2lM!6`JMD`l{Kv|;<8Jhrn;HtUxK%xg?l<*N1o@5kRK8h1YG zzUcqxc=t6k-~mgBhiC^3aLthfQrbMixW58%10o|HZ?=MvhpTemMjkSl6gn`o%APQ& z=XvBQlrw7v6|BUD_!L+_W)*MWx(JiFsBHF87vt|;kxdIhIFhxFV@V?bvNE$f6`~UX z=$rHBUAg;V=tpdNL?+Y%Ym?n|pH)U@ar7258^j6<=Z>Xf^z|1gi_U>*ZA*0u>80q4 zr2mtTb#Br7f*;{r6O-E{8txnLn+hHz?^&JL-uY?jDRAVFlSG(=%o-~x4$g2KoOw_* z3-xX?8f5-4NK>5E#<#ZV!A4c;trMJW+VC7ml6D@ks6a=#u)XngV12kBLFak^J;x+x$Nau+vC^8{NiK|oeA zw@ex3J?E-vlVHVrOt3atWV}*E4B=Xex^7O;xIUa2o4gkhL^Duwj?zcu=$*Vzf=T;W zhZ?VNiA3YI@LKZMIw1-O4=-8Q^TSdF^%mu&sx4cXcbrODoK;=rBWMxQ;KM7+$*r`q zsaYx59L`P&n|2~dq^oJ2hvUM9@zJSQfEO0tl^`tTGKjivcxaBLTH(N81nS{3qiFfOZawvEw4DJ)CeFs9sqSAg?BCDYO9qFgU9_;mnb0 zyuIS#lg$SBeA@q>w=Z*xSz)sFv4LzSwzeB$w6+(8wVkur0gnd_em1eZprrHer#=6 zJhb#%lws1SL^+e!n28o83I1o9lKW{k#hfQTfd`+Ls!L<`6V-*f`j6D};_aM`Hd-+W zT9r~S5gUC*RTul zkN(;5BX|jfW@k`xQ7}-KpmgRXqVU(4|29Axy?a60oc%Jkj- z>t{9i8-)S=RQ;L2Z$QVMWTd4bMz>dN&!%eIZ>EAk8*Os=hx0CR+8%cy$h(YEi3c zg?2E_LByw-)Bl!6@A!m?V~l7$`ssgKhy;^oVAZ-O>|WtboNIr0BNj(tadF1+)ht@% zJL~uXdZ+ph+`CfNJ7pd2UCHUWw7c^!9rW!buk^ls5WQ3rv&@DIT`o+n^XM3bQo^jr zQd^$LgcZ$L11`*_KU-THT>;h8$}r=Rofi*utq^G+`{%xP!klFQ*zjGYZA+VJhcnYU z*D$C)X>}p9&*xn>&>SsN!FAC(PV-$$k`u1Xj`$1JJ=+9^__~|X(`Wyj$K=nMD;X95h`&34FiUy`fmjO3t;&*(xfYe6&X$@lmJ!yFjTJrmatwA?J| zUzFE10_bCzuB%NbpXH}Z0IJVES2OZjo-CkAPgxl<{p5@*n$OY!|80P);sAzPfMHW%S-T2L zv*VzV0e=R383D0Vj^4gM zvM5?IrvJ1*lJ`%r9;8|E(BJP|#${xREWgN$~Xl$hEY{U0tkxvbw{ z_K1aPa+zI~dDy*Zg;*hmVl^{fEp}fEy1ChnP`aE8ucbFI_T!DxrZHcHX_p}Ya?{_z z*_Q9BYyPd6Ud>0G3L6j#L&;LKbsaCSZBLJYgt1!KHmRat*HFB-piN_Q3X;?K;<$+; zR&#MS%tGd3?;G1NivezgosY#c)8ky1H)?{D#_Xf8@8>doE^o4zYK=Y^`=|9N*{px+nY`+hGm99WE9i!!HbTg|aSkYelbj}L^O8@NU@ zeI5wfw3vtI^Dxt_g>7Tu@6?5`H6SA6`@xpu$cc&Lf4m;G6<3sBjCHa=j>G%@w?;x2 zi8h-ac8RNuVfN$W&GF{a5Rh&B>hWa=0sZu4{d5K+n~m#`0ui%Ev^~*m6l{E!rH9%8 zO`WchZPqj)5y^#_Cq*UuJ##R0+(3AsDSM!C_*|~>0>jFZaL?MQFVJxAV}E@-?7)rn z$-pQ^nEq0URQF=9`as~^Qra|H87!P^Id4Ac|8l)V8&5r6{UKI82t6H@ajp}^JO z!e8>~4`%J?Tvo;_ku!qs7eq&6l-OxAF%AYK+cxGV&$k#BXqv@~S&WO}g6N7_&;##$tD{^d4PwbB$N5su9@(69q$eS!92aC8(i;hHd%VrG#&d`NH!uuZQYG0-^L zFds0i2>4Ma7aCMSv>`1g+BnZGL?@r-a*c5Dc-s4Q*51fKP+D)@1{b3}^}iPGXqNqM z9a5ao<2VUM!VDeU+t9+(bgAi^%8e=TZe&1|P1E@^7#?!opwEv3hTj+r4UI?N$`@eZ zmdT<4!RCX8a}!-3v~P1%V>0MGTb)bo%2Fi{kng%KNEgl@bk3mt*U|oet9=v7GyO!s z59=okNmmNg`ti~LQ7-Y$j^bL`!8la!eV!Z$N%~1&0AV$KDNY_6W=kJ2Ra{R3W}>-+ zQB0Bxl;!SKxM5|Fw4Xg9H7Q<=ykQ^kc-KF)bh^*Xe8G8se&!3#^9@l0XR$@kk{hZ< zkRKtfziz@zVM&|@8e zf2+pelm}$F4wQOW0hZd%{kHt}tgB`L$`a;kiz$~|l z>5J@@7&03m>e<||x!GTsLv!PCmu7RL7`-33?)sDA%5a5Iu-?Kq;4gp#i!|Hb$#nuM zxqbktEQk3_vOv5;NeD0k7Pg53^e$3DKMvx(v*`d`a$0jjwBp=oeMW0u{W|ZPbkP?= zd4H$Axu8~`T;^VNjz%Q@93JtA8gWEcT00@2#bgC;XxsuFU~_ruXUJ0)Q1I%?s^m9v zS+A_M-_h!dnIkLJl^lVz1*;An6`0D~`nrkq_f|EhoeX(r5mr>1QfTrap)`EExYGQi zt#oau^n@1~N?Vahbiwn>Oa$I#S8XPj%}meh`m)eY@1L0#An5EV14+A%I1%qD_` z;$|$cS=xd?_*#Snz#D(Bafu4u$6{5jFKa9tS#G|G>?W`Pi#Vz+E4bd%k8h*yo94q_ zi>W@9RpYoj)i9Kln>DFEwV?Wt6Xyw2eyXngaN9G=56(lSA?-)^xZl<+OUjz?3lq`M zqWu3KU<&OZZHnKi_wWZTqmbSN>z(nnswz0^S!~v3wl*u<3(2_*AugekzVxle4$=3M-&c<^$GNY z`o3A}2VJZ~PL2a|EY$B$7n}9z@w)uCw#%8V^ArGYG`WuaPRI`P*uZD|m0dA5QJzhg z<7Pd*Y8kNMqLuY;B{F6A>1+&)^7}M?N7yNy`lLElAB(5n$wR^+U_bYY{e!>-5c`7AK3VOzj}EKo)q^#N0L=lfgb``m3C6w6aTn{Ep2TXL7;jEp z{d=xwriUU;K4KM4_FOJ#$G&}v%>py=>6~(ILtCZ$4Zd(5?WrIS zd{nw$<9#fSxdQ&{LiScix=$YM!{%yP%3apE)^8JLM=V&}c*RfjH!Fzl`+)gMVVWC?2F7}(BaW?cU*zB_&$#xP}*5%l`=9@5^+{}1B%PLkwPaV*b! z2XsBy^mP7QqXH9Oif6*VVVLNCMfCbFWFsBKVJJnbC=b8j?A%hfFBL>_%&N3ukgptF z3IKPjoj|6h&JjclQ>R8nv}weg!}mi={+_}T_t_4Lrv8pUxYv}Xtd|p`+FBJ68x1s! zaTp?1Y_4qn_Hd4hC>)!Rhht+AAt(-i#_)2nn3rYa>jD+t&gW@X$;*7Qi#) zei+a79G;P^@a26RxC?}1ZVM8ct&p6BNL382zAnoV0gaBjIu=`o5tv;{M<;EkgvL@TcG=Oa5$ z0<*j1cbPxRX!|JRMI$JxUU}Wse;V8oLmEM{Rul#Y1*GG^4mC!a?m}-&jg#;#GTkgn?lh=+80re zS+?YFeKGmV)=oIuUrw&1!tvtVgE13W@c9v^PPYuiHdCF3j(|wfd^{N!jY6n2!@uf3 ziu!A+pSUk7j6tR_lRnL$SW%d`v|gCF2*NxwadBm4TSx~w;xK7rU2|n99@#$%$Tr)1 zN|$YO)aF9^EGlG5`~#m&EgZ_@`+q}u?!zdCJTBwa1!L#gRD(Z@)mFCJLY=UF#wG5m z{ht0f{lc&2+_#e_ikPPOObOi?msIlY%>1mgL1U zVnFHA=KxCYn<`f5shq8wQY0h#OWF2}lb*U94K_&X#TEvd%%8bX=FvX#JMHr-UZ**E z{mo3x-W*l>V0ZOcDOXlqVAh4#`C!MEY)2@hoc{w>IOXH?EBn!_d*4y6@ncfK#+WyqK*+4mhf+TAN&Pfh~l+_-a_n9>N~@L$)kH z=ET;KY6b|0J80C7?*!m%&+?|;cd0NA_LrWV9H>%1RH&bRbvB1a7^C$*Mk;4>LNt7u z^oHgH@oAAUUc#`9whybNFXaJwIo%2NT_tij(9OiM8M~VM%nBiQ%q^|KzpSg3TIMku zywDg0v!9Mc$DcB=BR!vX@f#F<6DkYTnV{jeEheehw_;Sn6+DzrYPG5*J%GrW#WpAuq>8CRbd@t;SKUx^?1Gb>Es8FBPzrq^qby zVoY$3SK$h6aihbNkbA;>QtBgc3@)vj&MYkz-d6VCs=Te}zi~#i#A#38wZJnCR~_fA@+?QQ6pp&>@+Gl{1iDYXBbKW3@1Y@cW&{K z8;KP<@QCZZ+&{X75E0@rj zoFA7f`KnZlaA(u=P)ShfjzZbXgO{)J-Go{m!l&Tc06tk;vE6B5GQ;GG_<~hi`!rc= zZn4er&P@Xx7NW0_zC`I$Z&lag?hlxdhR(SAJs$VCEQogu5O(A4_et9~lV}z&lIuLG zFbcX)MPAnEol$ePt5n(Kimg4XbbVLUn6>9r*=nh`r?C6$vqFan9-@5f$AQZMA_y9l zE%yTton__>vhi#}LcM^#(yKyG-6GHf7e8bvKeUwZ1Fx}>uHN%N+qWpCER7sFEq5S!|ClDVJ9Z{V$(aQoq{`m`@^wbXmTTeEx_Z(VUQj8(H0##-H)+>&Fh2Ga~MHS@f+ zP)_zj78;e@%?xt-7;T^K16kfvVb0lxP<0)pcU^vwR)+~02Qk>{`r4{oOt0bpKU}o^ zg5YWivez_`qaxoVCOuBcx5iOs_1;+ zm2Vo*`C>ErLHZJOR7o1XE_c*VuBvrU^TFCcwc4sUyq#6%NIoVYQD? zjik2mu`Q#IyF`XPh{!Ij=Du7Vc>J3OV_%5=gPNAB4^yA#i5c+kl!&|k!CzY@arfVN zq(jEUM{8SNG|0C4!c`a0Wy@>a#q*YJF*GXc$Qc#`v-i+wZ6&`5vVvM3Wm^&G|HjxW znFt_IR&VVYL<>m(BPIdpvm^k)i3Fe@2Rhdafe-8lvHn~Fs18d2>cX%D@JmaX10K$*d+nY@j{ezFE`X*x|KI(K@Y z)5ynmLU0whNMz8sCRLjdZk=0gf}Ft92ka?xv>li=paX@RQ6t#(QATjI-T32y{pqSr zK(M)5=v>8)OdI=favPJ~4w&?QrGc7UVcfmJ&tMiM{a5O-AvVEtC+HqRZ>R)xS_@-O}#om`>58@sgiB6kY4m)?LbiJo-? zM>bw&Y9(hArC_-h^AgD(>#x+`iLKY_2T|K~OAWynIgcshs0|s1?=tNY;|vi_tGUwU z>csSop$5~S4HOo$s<~6TSPQ4#qqQ-7ql7W*S8f0OLi9lbfD(k`)vD$;*h(1tRneA5 zxSi|QeY6O#8QO%_R(c~H?teB+znm01N97r*@DDp4ddXu~*?_ITgYB$hayTQtONJ`b zFTho>uUL52iAytu+?c+iu)bX*sqo*}Wed@bJg(GO#Ob^3Lv9=z?X49X1r%jl4VWJ@ z32`yzHTT2_$SGTU+Z{z%g@mzH>A?(Lze`H;j$ka<0@&2|+PN`pc=A-KWWyDw?-3~B zjMeh!vaZ{z^U(iY6t76%Ws}kYkCPACTk>K5`H25~)U$Yn^i?$B^sLW7)}M5ZHs{$i z<>+jf=Z6aT0jS?y0Mr2E;^?qrGkbb5dhEjWADz|T$C#oXA7D=Pk#ze)EoXCUadgr- zS=(hB&s7@F*3gm~ZEvfE1y!+u;u>EF@ip=~h5TtF!RL52jG#zhNLojCc9q$wt8a5) zhX%A2R(3`fRojgV+IRx4#)uI(@PC@6^3{SjKNchH)2rE77_5?{s-_bpAHS-`?EiR(CO1A%4HpPpS7? zeoENg?TA9qEz8j{zowL)E$(WwzRi0YOry_Zp&?Kf=knCy~J{$tv2y_a`O zZK2m{$nWuz9k^_Bc@6l>=zTbD>yfc+ch93(t@cAYxkEFX!9(x&g1gwen;)GgjiV=O zuw}C;xM6{XiM_kgeq>?xZ;2LZVYEmiu7|zb`I|9L>~^iDt}3!?oVmMI@rJYFt#ZLG zeD8T%Rxx{6TPb_190cgy*NSx*O%nbT*rh&U`YC zu9ufzZrYcbdbCTKQLbl6w>35ySGODU>EUuzjB(YtnK{v0q?fp>G%UN~F}>K6^d(Cw z@Z7S%3IP;ZL-7ha2Opi6>d`_g$Ra8`S4M;-P6!q)H#J~8tIhKE*GB9|$6YnhENV}j z6P|dDQkQ116?rqftuEfC@>RZsdF&M>pN3n0-MBzb~up&oKmOM`2cO%EV2F1Lm-d~5md}I1_us_m1o4Endv zE%m9AmC5#kiqTTgyjJw7Fn}YRHQWyP73Ok*QtahASqY>BX>Q-#9bUzI=b({A1xkknyGv*rhuec4-cs zT>$X;rXbkLe((-pVKFu1&P~kv-Y7ZZ&MWk|*dG5=5eRs_h-N&cj- zQi7k?m!Qo$k-n|QO*+bK*^?UYxU0r3UFTdcCBOZPyJ|g)HmYa80@|Qk%BUva)6j~# z4rRI;Fue;4XHskFYC64PBRgm}(EdGj#Nz0u!X)KJUw%~gdMPN=}ONNoC zrA-2T{|L#~y&M8*@&C;vp1zJOY^_L+E~hv1a@0z!hUx2hvTJe?%6HSQH8T+fy_{y+ z4NtX{|EaR3Ww<%DUQ!T=U;_|%Fa!TNc%S- ztkPY^cM(-dEysuV^iAX^;*ZJ_`{d2MiEb;4cJnlu(`od_4a_l)y6SMh+mPfB^-kJ8 zB!~NDjc8|^20f_BRawM20woyhEGIuSpag?Z$}+FCmMtqMb4s3jR5Z6`6jpmU-v8;d zIXA!gpq&o|eN~I^v}vrCz6I#6`Vi6+H1yGi#kj7HfqA52Mcte=BN_#HjQu$@;&JOAk&<{RkikF zy}x> zXHwp+DhlPemV8!hvY5VygwA=2-CDySWHA6GSDjB4hY6RR_cL|s(auW0QyW8g9&VO> z603O-dI$Nbn%tLanQ0EWfH1SOY=3{91=`8z)_T=nNIpl2K+pV6(G8ZKzKc#Gmc5Uk z&5O$!riK@Mfd&73K*fUbHO;_sdaF=#A#iC8Xo_wNq{-&NNHvGN(N^u~CAisYxq9R) z8wM5HNMIL^X3@nZNX6U_X*(Fy07fz)(Pva^b0LN14&+nuVNJ8XAMoQnUrmZ75PiTGtv!dLz ziv<&WUxXuTA$=~0wXdb*7j!H6NB(3JA6iz9_E3MKe&Yvb)SSpG6(brxPh@Cd`BWhq z6(bsuBj&#bOP}yzIRxrcSl0Q3x)gEwVsTTISvRzuHwzIaYl>k|*r+#`VV2pgY5D}5pvcHGQh)MLyV{Wm1_&Khb9;)C(3BPqAh z=jZc;i{sI`>j5vCunnBF1Nt!B1_Ut{YV%~uazM4obhSC;gq{Jvm5C)wrcv-pMrs(C zZ{*2$pfA!niqTonx=jv;jY(K68aS?45E~t-Rx%E0GWaYFNa83c1XI~W8Pj}5Yo_^F z9+{4mr*kc~H{wqu-=!jPl8P}(m_n01X3L7vk2S$6ct5~blOJdzU~YsydANDz;7~s$ zyH}iMG0_5m##2U}xY>t>;??AxazrCvXayMI2avq*~xzFv@z?Rg)Qf2)-@ZrABKXQjZ(t5i^xL$fj{NL>o?O zabguQFv_lSPa2+;+8GVg(s7mzu}#ZSc&!*J2N`^I>TG>~TB^GD0cV((OR}Cfm-w7y zIW%CYx%H64@Rl#KFT5WldqlLmq30sy8&5@;XSPMV`2T7A{~P{a#{c@KboLLTFY

zB4*oaBz`Jy#XYqTa&v)aZlq+u{#Dq9-Kp`F(rKnJE zKgLseg>G@wg`8Mb(1^&&tRa0}wDU00=Nvcl&&J2qn$-7x(yz|_m#bv!#6vAD0+61?hECm)0f zRAy-IN65ZuyxcvQ*NXj3wJ5YAC^Ju%tpsK#Tl4!eks~{`C|oB=VQXcGHz*TjZU4%EJs9cDTsM}@=%v2@Nd|Be^Pgr z06rUk3pkF$L`d!HwqkNS%gQLV1z)Y-=WBfIpvK4a4?L;<%t*JqzrDcToN3e^?!07^ z+$91R_6bibL9RiZLrLco(?Qgqg2ez9F}I!x01)t^PMt~T4S~~PwwO*J@CNhujlybc z-Fk#Hq}3+R60T4mE%rCCcJ$8vQ`jgdulq{xvTSY$2zD}aJ%5u@5e zHI8RT)X25vFQHlZetMg@e7icq?|UePH4$?foJ_QY4Qlu6I>S>0N>Rj9rY% zS5p8=h`(5GrFM<*9$7+A6U>vRaTJQ8G|c2DQ~p6*y3JDsqF0 za4gl>7}F~U87AGVz4qn0M`c4)Fb#_s-u+O>f>KVEC>Ce;^(o6`DwRHeA;^qelu=AS zeh*!=nq+g3Y$INAyy3WL+?tgn3%apMpWS^3Mx8{Z}#Bn{Fu=XU$*=M`RQqO ze%_amS5A_+hoV~}gB~?XQG7*{S1_|oBv8e3&C(h(mRd6>;BiL%x*cS^?8gIs4&Fm} z8~A<;@oRLVS>|s}2&=8m3RQHIipd?DCY-?-FF;(lj8=i!7LOWUij!+GyG5lj^87WI$dzQflO8D?eL5Pk(ka@+ha(QFQI1Gd{oQViX)ZcgbFp4lp7= z`>>esfFJJ0xV3w7_PDk2#O}$*A2$)N*gbjKabxky-IH66tHrB!Pp)&Lo>2+v5Dz?u zUt|^WK$&FI>tvM(g1ny5)s9^5-&pOR1Zpng4r7EOr40<(O*@~Hs&G5g$?U3y=v3;x zkJiEL>+z79y_G+~VtNL|s%{ogk8Yk^3j_^QPb)z^&9qH7rvYdDe|Y;2_^7Jv|Cjfs zWo8mGB+MkCB((U*(6IziL=Zbzup}UYfQ49|X28NY5qGVtV8h0`7VN#FuDutm*bCUZ zuDX_Wbyxr2?>YBPA;I0>|MUC&@_~8p-Foi1=bn4+x#ym1ZG-X}q|K^4HOfOYeE^1d zsnWHoOsjH4`x;I6P{pzTDGt!cOSxu;Bq(cY=tMa`$i-FI;e^562xz#ycL`fztKfr@ zH7n(ZO=YZmFCpD9T&6i4&jNM^m^I3g7$3SufmbveSLGDeCVIUn&z95!fh-1Cg^XOI zuJ194^LUA)Ude@zJ2D4s#(D*50Yw@nf>5T8+yzIV^&AoVb|l)@aUZb1B!F(}c#3bF zw>!S#8z<)arDuSypaAH^pbxAJr8?0rJZn3lbHKB%^L%+Op{A<&EW1AQAgCZmWt_j+ z2+e&jeg<+0JdFN1XhE2?S_ICaBC(p`jXr}1!p;RK)%_M+3h(ScJIgXutNsmwn`}`f z4y(1ZJz02`Ws5RchC7)AO2P$h8l$PahX@i3C*^fI){XizbO_`L*MWSXb@ zr8u&ZhT=M>b>=}@pT?B5fOA)1P4A6?KmZLGc}=w=0ulg4pYE(J()sFlVaIMU>xT&y zA1JyD29SMezBqhLQAd?*xdB9r7#uf+L{xkJFz~|}x4Qx#03JYMB4^k@%2@VYpz{*$ zwmyPtE%-2p`7@og2klK!#Wm4@3k})P*R{B`OT zDN^Y!jC7RT|LsR9`C){JO)ovo=as4}u;&qk+y&RJ&_09R>Va%M=G=7AX$Hhh)W3p_tJ}RU(FS;YOqqO@1`#SO$KUdZc88uY9kp# zA4Z8OZmkQ`0|EC1j4{L^5HW_s*--%|vxeF5;L0b)N{3sL%o_2OxKyjCFfxvuBBJsy z=7&vWA&YG3{~ilq(-<_!1K+HrBSUOSEbBI_=VMkFQd8NLI7{i`5)SZnaHS-NLm-#p zBbck@14l0F@FbyApG-O*ul>qYDenhr2kfkVd@rg3{R*hf0`3=vKOH% zoh)Nb67V5C-?)YJPv&VvNo|x{1_71{+HcJ6!eTZJSjNi-)`0>*O1pgCRZ$p*i{s1Zm=XN0@G{&F z$1O|!aWn!~Ngw95GlPi_n|S{ets)-WZ4E9C*o5nDA{YDbiw-#{SD#PMsoRVh|wnyry;Yo)<1=|CxvqM&Wm%xn&(8YUA7iZ78B z(R9c^wC10M+#kd8O+*5uKu$D=!5kHWR&%@i7Q#D6MPY=kB#ml zT`H}lJp&|{&#TP6(F~L(FdY2Lnj-K^&|JS1m)n$5#=!2%VBmi)gPJTUV^DWxFwm3{ zkTv5rG6ubSkqc9^K^;@s9(;9$Z0~OTIuf6$!m1>i=FnO{L8e-wFoR69abW~EMg@k! z-NC>>fdRPxBlppcpzf=~%=KOlFAJB03*?$4H%K1iV0Xu|w$(l#hDC^OwC1(k;2r(q zEzreM{+IZ(QA%zjw!`+ae0SwN%QC%BAwT7YFhIYHcA)L7hBK>oGGWq?ly_R;!^3Fu zBSPK<_@H{Uwhf&M2#Wq=H&YA&S*CXm(#6-J7#~P2+3g41VeqgCYq3#)3WuYGnEMGb z=oxWXXKAS0sEN@DKBR1}l+l!muN^M=*+^NJ6>rw!@HETymI4fK85`h-oQ@B;Yhn;8 zXL)v3+W#j8X-K~Pf?d;ozK6U&BNZI`0nDwsgQ~b45F@oXX$M6qDNZrNZJK&nbZHATYZEI@bpSh{x1tg=KteX~0c^1fb_*8FjKgI36hp z5Fsq;LG38qci**NOf!p0SKy1Q&=9TXcVP`H9j)88p*+5B5<85&t(AIjg0Qix)}NRy z3O*jdix$(|_bd}vRUy93KL7+!yv!5~KlhmVL0(TsScJJvv0 zu+atQw;|k59Yb57?lEmCvv!(_9YcKX0RQ+G3EG%RnLGXs zZD17V89VA4_)=+gjFA`EMk^JtoKZ-8t;ktAjk4p#v`X}lA_Z{0PyFH@D1jMU+Oj+Z z4FxQ!>!_Vr2Kz%}oIb~NgA|9hDo*v&7i5S3afUPa% zw!LYj(rnPG!(MW|$f>IeYEZFU?mQOSOrz5Z=v6tx(6PCp0NUu+Z0_M%I}0w79t3f9 zmVq$hnPYJmi4$9MZ+KBWc?tRFuF{`ol}Rds@9|H82pGF$S&_>-?BN0!Jffyz-7eT6 z#?kUY*t5aLF1&Gqb;^fh_Jmjhs6Lz=9SqmDa_1-08zNRkI>}RUmeGI<**${0jf?qb zFRN;>6}k*Ohp=S;+irwyJvd@;bhjF`2Io@Ki-5_z4H-F}9+U^DD+rNt_Zega|4xpM zIfGMeRaisYvN^@o^Px`iBM4e z@s2JxM~0+}n0`NOj;dpaYTA1W5N)(iGE9(ZKzx3Scs+qxrqg8vjBl4MNZ{^QL9ZRg z3FXm18dS5`HVc8sJ5Y}AiAmG#28y|;@B{lh>8>A zP2hG+P6QA)#IChhJ)U;yjWT%jL;Sy(vx?k2j$>N>X@l&-68 z@(C2z_LvsH83sfUYb%`P;UAG6#Fz=;KlN8IC6fESryydF|M@tgmGx;X*R)RWKl#0J zgdFtHuz_*p6vk0gp6JXlq6wuLMkR$5h7o$Wd|f9rC*2Sgb{_o8fWj$wLLo6lNK6r* znCL+=B*YZ1mDjBXJA_JC%~N@ zY=s5Ab>MxN6}s(2GA%6R^Q;4=3O0KP} zT_o;4)((2`cmu@}_(1n5oFFb4gBlC07?+Flu3yrb^7*h8uePd5Ta-^nAza#uJ#alE z9t|~~j=6y_YQ%MU$WYLK>%846@fwXe!;h9aD2G8H=YBKpiQ@Gka$#f9&JdRUsZh8z z8VI*m*}*U`X-o#iH{c7p^9mw*~1#+0H=n`+Z5j1FzvMuTa z_BeN;KDW-tH&B4p3Ys!F%jBWZM!&rBJ3j4PEp+F1UOr3|ztT7ww9g1sg z7dA4woEe3J(Av>_1ao8fz@YGoG)ZqZf1!ffigkB!i;XUDKErC~)tT5hNn6FGz4hb2H=>DFV7wX}EyoZVVFDS~!vSTSGAwKyk|T#N17QHmL~4 z7Lu;X4zFKlLC@@XleH+2Iqrk;w!s(n&L^!0ZS$@9R-~MUhS_s7AA;6%<473|jZRx` zJl~ugp^){tZ7l@cGnL1LaBfqDvD8X5Q{ny zVlmJ7wxzdoenUCY#kTt?z{b@>MX{@Bd1_)mL#&iLH}g4Omu$iQ${dRBai?j|%erkO zVA`8~CsEi7Yxg=B4a!?6&wzJ?JcHg*^3>e2hcN+pXGy@A#3D z?vWL{&O4{(J0R30?!iLWWxha<-WbE1?RuET0aXLISYw7RhbHVja&TGPc$C!}-3QzAxhY_WGW|ySpO;c3?ot z&hklqlG~91ne*Amo#gdze4WbIEKBWzxnB#I%Su&Q7NH_<5%TZIBVYIu9YGkHva_s6 z?F93>9gR10DQow>1{}q-MSiX06_5$|Th5-pKpl8dZ*Tvj48SU>5-3-0P^F ztvL0k@;=jw!_HFQ53u6b;hj8^XWaG`SOYkY33n+0@?6 zcgC*)uHU6g$UkXEF8zfqWxqS}Z*#Thm~IZz&1G9{k7S55jHJ>S0ON^}uB>7AQKFGwbK(~ov1M2^G>Tz?!a|vAGxWqffd%`1`zyvd zv_syvz%>?x2%dvr)wW`Vi@7<1iywYNxk;Q8M)U!Q9$a1CGvxkTrHgE#0QfP-tjcV- z=Dxi9vew>)vM5Tsd$A(CL|o{{pq;@1GIw9RVY;)*-2?FkyR!w10*y!|Fs=6f4nRr0 ztOav-wTY4jRKVmcl7862;U%Gerh)pyzr4-Pk`sB~6_qdupt$?7Qrn%&hqaChSV?yV zNQI}Ihym)yD7#~QZd;pK*S@F6mTW6l*0XOJO<;uf4#aal@tfY=a->b2(7u zb1Y#@D;?TdvTfxX`W~XwXzvHq(By=2yCc@jDexO>?MFD}=$qBa=~y|d_ajov;T1be z2AgWDXgQV5(`cAIh%721P%-Ku4(|dLB1FYqkc%Be;TIh=Dm=6w^isq{mJoysufpm@ z$HlZfP!NN09UjtL%2hy%U(`x?3T&%@$P@J~gOF+5ept}T4OJ`wZU+=)ewPZ>M1(Ya z8p7#lSkaTXgp$Y*-I@3zxZ}RVArisqJT!QJ;s@)@?b-GMjl*puZt{p|ML3Ypp78}r zbj(M7;&6>mstCQ0Ub1Q0!`V#c#%m3X+*4BD9|vfCEq_vM7uA@IhvA>oDp$;roScF% ziZzGAlEMTEcZx+lpt35$p==g7^Jh>PbCVp=;TxBbQXOufEXGU;%2=n_I5@(u#lSai7y1w_HZ<&NSmrk;Qm$OY?`X7=GmZBTQ24@YAju4-7a$+nEvXtI zzorUKd8m_p9EQ6AcTY4RHD5b#mf`;ajyY=q+pb~|=AzQnDhSPj$&0^#V_W+pPdoF7 zD`Ga(`-!8|)&UMm8ye-+A#5uL2ISV)a1Nh9%Fbv_EbVGq=_pbZ>2G)?URav2%QTjO zqI4;&0G%9@Va3lxR`Wi3DJyHydO0I=&^V|AV^99_ zvac+!bFGA^(XuYF+H-CCj<4Jdz9w@s^RcZQ zy%)#nxVX$Ztfpf!HX&6Q@G=~rhjB34e(VB?r99#-VyrB-^06mLEQJ=$D@(9^>`f9& zDcggYTSymX`PkJGdt^SZEZ5whL0aA~_=)-ud?)F+5Nj6@aI&kueWqKBxi@BRh0_ms z74sG&nbo{F@5-51F4}G%U#m42pK8xW`SM^LoBJYAM-Y~#m|!ytvChje6a$wJL8PGz z%IG(#K8uCvhF5<4I+*$4ho9v-UKDNCVF?dzxJ3pF3}}mCE?b+~g$=Z28wIPs%`k3! zEhuF)+5j7RU>%Nk9@V8<3HcAK_pD3QzJT#q;fzBG{>cHbfwUD+@6CAc#*4D55dxXh zsA~)K8V;+EUr+(R9o$4B5GDjiQ^AQTejMaZK=Nw$ zt{lz&W4SeaGvz0=ou%ICFxC@TxEPEdLfM7j>`o|Xd%MI)Q-~)|L(vAFfcLAwgEMss z4{mgg@#66U03US^fbz3)tHJf_*R|c{g+BEr`A9&0gl~5|VY&yplKZTpmBAR)!xWOm zPokZj14^K=W7zADtT+_X4)u0rAktbD2uEl=!ENBN&A#65*p&|aU39S2SmF9l8BZGj|*&9b~5^+Z2=Yl@+lJyZu4s| zmw}Hnni`JQ(i4_k_l~#r);N{}C=qw4ltT;0L#LP1l9F$Fl*GR!H{`tlD7btv6>EVJ zUQj0ZY%tlxF-NzJfrk*iOP1AaTH0hdSn~a6V8H>y?MXm~_bRGf3CA8#EJhU}pfck9 z8T2)n2jm8KIr&+>mreWem<_CWSb4+OWtEMQz;ASZaM^;&K${0!N7?Z)QUPrAGy}JZ zlp_uL&xPXVJ(KN3WE)ngWg|QO8Ob9Amjf}l@X!2)6pQf@0=40Rq&!SFZXP5irm(`0 zn}RZyGo+_{gA~n+u!U?7h029}jUAL!dt0m5h{j1xas-V_F2*io(r7whEM|1B=9+e) zlxy%MtyP9eemVm2hMy8o%ImS@N1?J4m1C#{gB;UdtYv|IJ>NGPc^669Qa^4ihmt!W z(3vec2$MBA!p2tZivE%hG7R!Huzi&y+?^4nFvS29mW%r5XRh&Q90H?THFTwcXn~GS zRF!Y^u&NpeAIlGjPtqd@Uox6(kHI&+E#70zc0)WYclDKXA9PNvye}@EDZR6ga`7{` z*$bzz=+iiW+t}czL(3~I3LKtt{I;ZgA&@4a87~# z$J$Ql-Kmi)TJv*V&^jC&{70Ggv3X9{=9N=R*KO;#!~3kgYyou+eD_r;uqifrXWVDo zrO-rxNYhfQ1Kl8vMXmN%p8Ti)_QXa7V=>)G?IzZ_rB&`&Q1xpO2*eLhKQ{Uo@eNYnKDoiw$Q1{aTD zW4$V$4wF%FZ}84(Z2RY<0ZpVN0ilsJ6Z2^RPH7qe2Z{WP7l__+tC1Q)#xE241aL*6H?VUc2NF@yxOS}W1Es#?sOQIj z@T`>km;4Ck*b7-}K$}OCHudaAGREP6Lz8wGTYfQr#}9Xl(Xd5sTAdR&H?5ZL0v8{%=e+To^6D3y58>GOJ)^w#(D2=#}xhYdCJV3Na^Uh}l> z4de-+a4b5uDHPWx#pxV{`N>+$v5r~Zy9^*#l?BN-xSct`&jMjnviJZkTL4$&1c@*c zN0}>-Q>vjn$%6-&y}c?724xJ%J+uqrsGGBT8&ITJXjAJTS*vIn4O zQ#E85R^*kTTNd72q{0H6&o%E!8O25vwKvNaGMmOB{H zdBuv8JBXh++j|I~0rzUAw}bjrc_(NsMG3MW3~WNhpJfp;NyyyhEC4T@v*tpl?|imO z!gOB@;JsLsS`x0g5G_2E1;CV&b!J&}auhWBh0nZ-7$s1zCqPQIFx2QL3VMiQB8wI2 zbeP}tL-BgsI8MLL?NS_c3 zh)`;6Y6TmPof*Xst)mct#kKgskW|{JP-{@BRFz}#^v>|facod*Ct&=+)`i!2&_Hti z%P$8jK51sbp2=V>6>e3$`Swk#%*Cmc^C~$(uuW9N;U9=ELi?|u2zIpP6g(i;!3GPd z+#A_oeaCvEEFht{OkF!{*@93%g&BqH<~Mo-w#S4}Ob_OVz0{P9wJc)|-E>!JpVN*) zssk3WqBxN1WeDI3lELrqRV8OdpgrwM7Nzw-Z;Vxn_IEoFgOPwcQyD0AvFg&91^&u@Dr@L&;o|Ah{&hKg($V_rR|5yLQr`7Y)y^i`P2v@X2_WSz@Myn8D`e4iYSl?8_0 zAq-eg#V`TeSr!vsp1%o<>mF=cZGmM2E~Xk>(J(Q;Lx3{|PWEUdk0dWjr_3u>@V+d| ztWSr^;rT`^gS2Rwgc-9O8=SHX6Q06#n9yK~aPTI{QaI3efMR149J&Yz*dAfEPWC7Q zaqh)kKtQfn*RLF5mvW9PlXLotf59qdFYN%Xp{e&0y>Y*G98#{rO|#fgAnx5eh*5qK zKzEh@MQGeR^(#NNY*Bbg9Vv((?p=u2N>~SM0xXHE|DCvg>&H1(p078=9eak_JB;Q; zo%H^S3g~tL?Zf>Ykk^ml9F7GVUHP;J-FpxpLwiP7`Msg+Q1%?@BNP6r0v_js>K@`i zEE#X8st6?A2N)FKQtobW3#|X_ENN^ubV!1TL})qHOj??F5$%ga0a_}@&(ymp&U9g7 zgF;%4L~4xQD_3VH%0U3JM5F za1a_F5!PcHBMQR z)jiUS;7+U@dD`hcoGm3XAWkA`22^dhuDLphx?3wk<=B^IBtTBVpg{Z2DyLHj1dkgB z5g5wD0+7&y5~C&c_DBa)DA`K%5M4!!V!NAKp*1eWVUl= zAc$MdG5-OE20B!L42d7d0ZEUD1oLP^iWi+wTVCed6ZJ?r=5{>9%d|Gx;Xxhvl0y+R z!YMAle<2Rj|HwF8hNjvES78=4y1VB?j@F=a-ovP)lWkE~RoquicI0GD5=?cRqA#@_ zXX;B`#|8QVTb0|bK#jhVtKui~der?04egzY|ySJ8_l26W62rI5QPU9}NS|>7Hii5x_QX zeL=wN<@@67SHHO`P0gMo*tQ!4+gzU^3FnHuUKNX#`3wAcs*G~FDbobvn}5S@d;H}i zU)eD?WB;YsJW{vo@V{Mq-p{u`Q$PKJW8XgM#4#)PzHZ6A)Xu1=4eJK_9)t@3(5(qq!q!MAFkJGo<% z+_WpNx6kT-+%3ER@YZW@?ET~XhLb;Y_nrRepRYRUqJK9Jzirx=KR1sWnG65n$7^PN zn6(bu>%Nz#J-^l5dB>czYHWS9q2`)rRxf?EYNt!~d-eREotdLvyZJ94J^8N>CVaH> z;Ljfza`oi1Rvda>?4w(&n)Y1y=rJSzdC0DR-16>qo1WP4-3b#{U-QAUbC2I8wyN)l z*G7%JF!53Q&lm2r?e;UyZw(HbylBcfar`N7ZT`z1dndL#`{W&m_v^p^Uta&==ohaXzWdxcKUW66 znm+K(^htkx@*mcD*-h7Q{^FF?D*u}9UIq7n0?Zk z&x7yHp6u>+!FikY`(&s38~UF=arO114mqm*qwmA3=Du^yU3c}6Ma#`N#+;r^cZyr4RfXr53UV7E*XXhG! zXuRk9o3`0>)*pWO=9HI?cz)!skClIT`DMpXJ*8^W1y$Zf{kC|!_2~ot`pUc=%B%0( zW6B{1ANAvPcMUkBDbZu#yN{i__vVxC`TFN`-#g{VEuR^8%NKuNId#@MiBnHG;mAbJoD?awgE$4akjqvnBo7Jd-a_s-#=o-_@jP# zaMlmIef767C(fPur^cN>-Rb*Y%O0B5vPJlmODDZmdD^#q-+cAFGcvyn+ViRp4|I=t z>aD+BefE9x%I>ec;+2gKKYF+5!w;Oe%jKg-$QX?A`Widi2ES+G@)__nB`lZbM>j2FEUp?IP9u_ zU3p36i@o-LbG!Dx&f4#dV@}!ffo~go#y9(Z=_$F99_AND&aGj+`CchKD4 z>ham*J^QU$Iyfj(e3 zXu<5y%lBV3wD*xq4;XsX{7WaCG-dFvCtv@;vVQcPxxq9thJ(v?d@*C@-ov)LJa^4T*Dd!p`Rh%C>^ru3zv}!qZaw(CkqbLdjBUC7DewPt=C>!d z?)R&A(UD*8{>sF6@2lSJ*#VP>KfL;c&0qTFx!Buvk-CE(SvPimb8UK2VtSv&Kb=## z*8z`pv@UbzY=6ggdu_A#vMCcL}cP`qzYWXuQSKV|{ zkE^%Ys_zMJB=-H&$k#G|j$OF*^7m)#x!o_j?YwQz<+Ju2@=kl(gLOwOoV|S@yXy30 z`_f1I?>FBb)7QGJqUUG(H8^XAyYca#j_ZHX*@Lcp z?=PuqA~S<`jj0-a=bNuKzIx()nK!)bzEAExa?dC3`*G{f2VB|m(ds$P-+zP>S6@8lhe2n&IcC#O?>{T@$zHqH|9Ei2uz#NL z#+EPFpECKa?{?nx=_dpGKi2=@h2yMkdT;XClJY@oR!>NeuNWG-eAX`IQ~x}v_J|i2 zr7lh$;QexE+nk<tmEF&t`R09lZ2yk|!A*Wz z{m4e2eRFcv$92=}x|XL8Nxm3AHvIXv+eMt?W(>aY#ir&(sg1`^+uParsuhWy9vMGk za`V5p*e$UtI_syyY7aZ0asIK(K0e~mJ8sx&-@Ol-{%RvtU2?tP;1|mB_qbBRD~_@A zF_cCiXiz6{5qJmnnZDj35NN2H1=SZGGo$9v1T>G>E7!}Yb5uRR#Ee=81YJT!16SjI zG}QxEdMb2l?&A=g_0B`dV~f^;@~~!3`FaY;Zp)h9zY&q8P?h@_iU5EDYrwi3ug6k` zPeuVAY(8*%4c9qwED8zFY}^RNs>+ws0Ay%+NF5W%nR5!?bnU^)umRfM&^R~TKIdX6 zI;dvOA{5Gw>Tr&4i7+iLBxNw4(iY7JcG?0LnOYLTi{N=LERfLixmgN`MXuOUat~Z| z91V@O>p&~r7EOgxZQRa{g>6}iK{)|mNU6EleHKO0uYNzk67Lv*0^`FRAHiHFA5cyo zE6-qVi9AEOW@*;lX$RTI?@_#`2?`hM-mIOv!~&AMQ#~>xs}6m{2rOlM2v8sL5cie zTK6SsOkv$|GWj z=skk|MQ`GQrigjR%hL#i`|#C_EB9XD!-gZ1=K;A7ZMh^;EU5a-w6W55UzBtTo8C)x z1Mv0-;?42iL!<&GuSSW1g{h{e-j8la9PeF8NCf8@9PAa~*SKXi;3{#NmtH`{yxX-0`9QSpUg=&A%BWI(xY2y`|$=<_NnErKr*5c&h7B<-*{ zm_E!I=Zy)`16F*s)f4;A7^Zk%Yc)fk475ec5_M%!4WC_Be{`AnFy=h)7;^oQ{jDxo zil9}rl2&l3)1^pO6bIFDmb{u~V3!yenKFmT%zXg?vUiG$%-+O%IP(^MLE}V3q{dqb z4EV$u@!m#U1z0VM3j-x9@$EfILdJQk5BP*9WOSj{=Us|ug!JqZ0szUQc=m{vRC``z z_0+cG{bsA@wus`~lR~WOTkO8Ab@N*7hAmtB%)`lSRhffN1*`=~bG-15qG_OH)UH&b zjutbNSeiUknLQdSFQJtYOscqF5Kwa_Ww*%~1dm;lPt&{`sH|uL$&sI+G1T!41T35@ zsVW`J3kO&(_uN4inCQeDAYi;-G5vsidL+;^WagSH)dtU^P>KpuhEr3dB~JFoQ|uMA zihZrnFns`F^?m@}MtkkdhMG2b z!;tK4xC~;3GgIUT+CPJ;tP_MM$-Lnkc?)Zu3%Yb%4$jQY_<>V|TF6P66R@p}yFzu8 zi|e4sVllAD&*73gKly}Y-hr1fl+o6z(+>`Vahd{on)@Lr%V1~NN^E4+`t-C9LQa+b z$#OpOVS{>l3eYZMO_t(}g5qumdtn$U7ReGw33*1RKxl$tEFp6rDrb2h8-GvM7CT4S zp;BfuQ?+(*J(-jUOaCSwApS;kOrYkRGLJ*li*f|>LwX;lUT_SSVNUKW1cIlW%`8e2 zL6P|p%eok?f2n%)H0~t#%Y4%;n?n69t%7F+$qQZmSt9y==o0KOhy>e17$W1C& z6~{mIAL420Q^;=@`yM9<7~c}>8#q}!Lv#Rp7JqioR4Jg3jMm0 zkA~5?tK=EYUCn1BOcb2<+_e%mKX+X|EO$L$YjZd8VSH_X%2?+@sqz1)PMp%98%8fE z#}k@azxRJ!zo}Z<-UG8T|Nc+#jZ=5*Q0-MG%U;#4b+YW*ob<1gW&dg?J6U#ePI}tO zvZJ-Poh&*Huc9;tUUo$x z4ZpgkVHXwB@T+SYl20KGzq+Pj&lb|~t0>J$I&ZPZ3u*XOl*YhJaww$X7t%N*Bi5m2 z%m8g2y=~m~bT>9fZI4TOuLF{&_jlsek9@11=jFE755%NAS&bde;zsN^^SsZz~M1Gx*6fzau z+txJUR^V3|NXF6J?dTQTeHi8E?%=C$EqSMe=Ov3<_!-FE%11DF8y}4*0|!#?#=F)0 zF(sc>c*VYWj!!$ww2p7w$7&p}oRhhoWkt>!FGYJsu|2pMFv+~%LJg%Al%mB-kUsTU z9F7K=Vp*RpVd4X>1?3SqFN@=HDnKA)nw0?z{3!I1A>4R=881+k@h9MZ9w-V@Rk(00(8%ogyk69-TOFzO>Fll5x; zs$cbv`!fujk(qJ*0t?KiN!t)tkmwyME2wt7twd62otbz3XO z1}Jm2#7LV~1y2%oUxlI?6!Q?O)g-vOsXwTc60(4XGYB=Unui7`kP0YGbq_z-GUl3~ zbs)exg}4jU&&R@7%7GWukxnul6qqfie(s$1Ktm6KIaFoCk`nv$ef`vO7NRr( zqs{)3l)k>s@LW={hc%Y^(jkFLNR%TF^rJH9b_x&2p_~a z$MJ55%;oZGQp7h;vNIonyEtyG2|$v}#|R1JL%1G|fzNZ!w0keb$%@{&`%t2ti2;_} z{qh>;>jQkP%~bIHLB6|9m{W5P@imouSwgVdkD_8b%OX-4=3A*BwZ$KG#UJ(h0n*4l z!9oJL$M6U&x*i(nnqPUs1X@dI!2$~zl6xGHGL_fpD=6wKv?%u+^Ew{+aPE1&r*bdy zky(Vc=bq%Noyqb2DSfYGL!QQa=RFL_@-^i?hc-18$p<1!;JzG07UoEP74@}A^Fm1) zesxVlkP7ASt81DyC29E8HO)&UY53JO4ZEaJ7r&aDh-LPeI9tfQiZ=wj#z!FcI>YI+ ziRUR!Rr!H<%YJ|#j2NmnpuavHu~^#E`cis%h1Ua^RO3tr)UF>;w|+otWQYV;sw0+{BYw3ZG!GqsMh$ zS$1)z4W7SI1ocx4%}j!qf6SpcyB74GNAW)Y-NlF9c=iFT&Y^K}u&^2cql;^~^bWi{n8z3uJK0;}#3xmLsmBgz?j# zuI(yGkJ}lTekiUKC<|GN3F@v6NBL(ky*Xwb6`_f{GoyfgIX(|UgYO?XKo2`<+;k!n zRv2!(YgCNzX-=lVSKzjZq#_?hbQczuEEjVZ>#NxFBX&|hOw?^24|vX0_(|#R4Zwt` z!hG>(HP3~D5~7P;`0s;<1_2Z#MrP{qOgMN+}W583}*4S3E{c%DI+PhsP(M>zIyO9!=>SQm}y{I?m>`EN6# zTVV&EsX>S4Shk(jU*!_+O8~B^IIMO>*RZ;7!s<)H+?Ux%w33BuzZ1`w0sOPIUF7dh z?jQV(g{K4&VdFn_iT&_@DE`y1JiU$a4KNIz^P=h5=4%?H(J0&jsNaC8@-^9f0o91x z#C+W&aT}ShlM$y^!Sc$#(;mh^F&77_v&ldxxWGG#z9PVc9S{B<@CGnQv+(I;Ehp?| zywQbv(TFphR1%7jRik{WM);JS<-9m_2<~*lb68(PK3sSVgPD1r^kjUcERM0LvuHn{ zMyFUQd~>T2{xYrhSZFBn2>o$!V)B^!8@~tRZO1U9j1t&NV>df@;Hzcf%CUG0{SX>DjTTvavUXBg`0S%f(T)N4bWN`LV z{3e3g@9=2N@dMWA@b?YF_(YU@-jad)J4N$XJl&p%%luUhFZLntSxjKn7@At*M=UX< zvs#WHe#FO&2)E|=^us=Doz%~_C^q6rbggs zhhmfoB!W*kvJjS_^+miYB+Gr02f*O*RUkF@PEjalk=(oZ>4MUhC7@-+Di2bZVs&3Q zOV56TY>7zr?|8K4_~Exz5EIFMD-m4~6~#MR(?7o=`|48Y#c*m zV9=>-@L*YXyj=sZMV^l1d5-cA_Ls;_z8rpTfv%BTHKEz!zv`lCuA8k z?tHYt3M~-MO}ia3Y;g1>7`bIWQ>CAf@rq+H9mpqLnT%r_?CdKj1B?T*8W%Ta3fM{G zbVhNDzQFd2zQFM13wXiW8pl`_AXBvYPOT{Y#%!Whn|Kr{-{eNp@k(!khj3f&bHGRb zOI(l1_hB+exOK$Q*6DSC;N>{r@+}f!C}058J^Tq^nsC+1y&G+sNW}W#&y>oiycBTS zy7Xww4me_Ehr+e)=D-Qx>h#S&y;G5>;6Cujn7YEyVG5U1>7_DVpQse+1*gH1-aC+j zATHyKPpo{Ug&0c9IAT*V>m4_=DTaS~N$Bhm$Xtfoo5}58OZGEnu=-cYqKi)gjDN$2>SE zGc=C#GkKXWWl0LS)r+LOHEh#bEX7bUr9QYjT82i7toUDLA7EL=*4>qDxjDd`f$bcyH!?HlNI zd@oV3AgE}01gCzmqmFws#TOo)u zn1?P0H~FMsdzTE4h->tVz@SWlgzcI2i0VurM~NV2*EtcN2po75+CoNX$%u*M-jgvw zwkWw0v9{co_`rFv^aP&wQfP)%%B#_KiQ4+#0nI`A!g_r&5r#+O5f`c*b;-y;5M^xkz< z=9=wr#2;Bk9@Y7!%G$0~eQouIE`1z$#0upRB3MzG>~G3eS0}1LTk40d4@eL&rAGA( z)|z2Qo%#$zhD9gNP6S(VxBI3T!%>iJbqvoH==YfSE*c3@g%8mzn7n#ryOjp^aey$2awXyc$QBV6 zii_pTajy!cA)-KAjmw94olqe21Q6n`1@$x`p~*XLPe=kt01Yw+`%RQq4PwiHkm`y| z1H#>P?$TAX@?gS1ItK}nUe}!QyOnD&c?oa$+#h>U= zl6u{CIKSr&KqN0p$9u!(?J8?~0}<$>&au|@5nCH`Lq}dSj%!k?tJ9B*-{15hC?Mnw zVof#aK8YG{Fkh>1iZW4^sLad)d|nf)vJfY;0ik;hvq24K1Aashg8@VR2^YJ!iUdz1 zpRN^SN^##IZkTT|zLMTXtS^yBEV`}~Rp_0>LWV6yTxBZ zdbql0qGuxEPQzV{R-)%(%557H=h)I1WcRGVr)_;yR{c}ib_}(xo$X=As61y`XWH?< zXd3FX;%MrhIrf4=0vQ+Z^V%*!A@1r128cqerJb<%F52q8rzE7RCt3NwwE;B%1UtoE z$ZIBALg^vs99;Dmg+v+ghT^3O_wrQ0Ls_|ZHMo!azLX7eV=qeg@Fe!rC|~@<@dLts zzI)b9Z^9(u7v3{pIHt+tp!5f!7nSnf21@DDt<7Z@VcKh z?qUtMt%t3FANgr^x8~hxO(*Uh@YhLbgZ%k28f3DG93B2Q1i6xL$Y>?skkRBDeM^4* z01CU1{iN$Tj0#bPwOosE>?d#*$#M~gGuF86A}TuxD{`w5;>ZdHdj(ttgUFGOmxJ>Q zHcp-33P3t=t^N}$(us1J0BEgl{3n)6S0Eq!CsJ0xTev*m33isX43_nv)4x~uBtq-`9gqx@wxe9dp7iquuj802{0`6*( zqR__Ood`q|)aq0kXNy)Y;C?`&EeNYf^eof1G@wLQBO6QZWY(qi=W)9=QaB!l6JoSw z-o4D4$DUbr9!nfLUJsKnfv0yr6Z)v(`i;Aad}5~!QCi0)`4n9GF$JG~uJ7@#)dqC$ zsx`+TYwh&_92+HXMz1XYf?mms6UvY$HfT;LGn~u_ zLW+ZoU`d@|Lb{&|O`3JF)Kfws-IX2i9z)$?Z71w-7|I`ka`lc>@~nE?*%0vFN2+!O z07DB(a7=g^8v1SnnBwrNFNV3Az?Rlklp8?H1yE>upl(&0Rq$m2)+ZKf4M;$$J-8lbQz5Nvy5LjWGCY67O=v}NoFja~pl1L}F$)*C^jU`Ht00bBG3qGmW0 zbmw9E2<52Z#oAUBy@FWm)r72_G0k7fHi~E-wUhLXDl7a-UvD@#F&NrJUcr^F@-;U> z7xGJ5b`so=@s?YQ(v`(RUH?gG+&aVsy}zI{;emBDdc8H%h^Z$Q4!YMMWm6bgSK<7hDtI`BG~$j-h5;D$m7Hk@D99ZdE|CM#-YbtJPfpo0jhX}u-rZQXck zYT=3~(WJUNNE`47;jM=D&i$-VF9g9t_~!_hHJ%Mvuj?)oV^hRGk!!61He@@N5i750I!t&YCLr8H3TCMLjg*A7 ze!7~{2sI%?t5I!F(PsE{=lcuNe}E?-AnOlq8Hf&7EkRXYOOWW{ev2Yy6fBdr_wdG} zbvhck!q}Xca?^DQ*V}@xxTGyn?JdDb^9j!_^zNJJUAI6`u1`?wBRY*0q``6#hQAOM zMgcf0zai)k)LRH*U?H~&t81`2@kV2uR}V?|N(}MF@U<5fD2ZO)3~WoHh9L#W)&a61 z1;~c@kl9)8QTq|QQb=KdKk9lHMqQ#NfHmgn=xA@I7GE^tUPtlWjyP@#6#)t$d_V($ zb289a3gy{-T2Ld?{_#ea1wGlAV%o7s|&x|WBDT02qi?uwbg zCvM1ll#~=(oVBaA`!&+?6hSC zXM|*RpJX+B3;89s?2XVup^4tm%CT|Mjy{%r%b+h*m*@l4RUeepFFk_^`gsGHp&`*= z@(!y_G!)P@ENUkjq@(g99py5uDYwBi!<1_!`l0-OiGGRR-T)K~4G3|1PNMIyN>SP; z`iQc{FKyffBnAux+I9FtVNPKva3GvY0F#O2B5vRh9h69dm9dpW>k`Q#NMnf5=KF<1 zS1Mr!)TEDboXIGl{Ok>krxXxf+&ANvL&Dxr_taF^*;&pHn8<3~??E*_4CAh5`WhC>&&#Nc2}aD0KT0h|%@N-=w@%Nz^mh&xsAZ}W(BRqyD{}>L_G1(u79FZ@F;WO~v8_z{}7N@@! z-%SXAVZHQDP`CU?;OWD|a;D>ZFrG)P7k<78hrYNZ{l{Q4EI$sBrnnr8BC$Dv98(hB zf^-?+=DPL5zc1JJ&vN4CM(`*0lDwx!HeoBN}t(r=UEU9tK4H|oDk>K6*D3>wK6 zG8iRc;VTtsY{FBljY2rb%@gD*MqE<$iPZS^x}H>^$a_JBVyC=D@@g!TE=D%XF*2c( zmjQ!1V+PYb!GkCth<3(Ix~96`=H^7L{5ItMgCq;&a4kzZy+Y}P zHgGy~Ln|ZB;bz)d8qGOg2D(&mVF^czCZl+!u7I!c^hVIuuRxW>sj$Nt5<3=L$AlRN z+eGZ$a#~uTjOXBul1QO0_Zy6xR{@KcAlEC81_J?fc@+IfhPv0IKiM>i0lhMW)!y;;)rbz{zPHz zmc~uSqGj1LgN)H7Gz8Ak(M|}vJ=VR#o3m7<3303! zPBmId_~pu{X<=0o4$*cK({9Ff2N(5A-G$SXr@QbkHV{tR zh3?XSRS37mPrkt`>$S72rPa=|P&`-$9?YVS3@F1jpncctxH}LG;$YmV%f~HbK^p^pb4>gU*7+GnZEF#sFqHW*Y}{83l@QLi6hj(-0c zd~p-3JN!~@-(5I&jJgZwK2dk!+;;0OoLd1B?jN*fpHNSRft~lI1rG2N(qT`H2Eulh zA0?))5SR7<@fN~;OAQ+_rA8WdsJ%ELPdCme4iIyx*4&S%g7(^WvR&U*mU84A{SBlS zwegcGDTTqlMPxih;NBE~PTy5*H3XF$NBg$#&Y zZ+y2EblGbjinBQ zl;ax5DRf9vQVcSveNcrJuhVk4_q{0!xmj=pnMd#XSg%AtMqe%6Lgts5vML5?nKNt` zq{Oy&I&9x*=vfTa-GGw^G#pzxr)%JF1VXKV_`=zjJkAXiF`qj2tkkG6{ zasd=>_sRwNNajL(c$hLNH0tssnF}LO4z9R=*7`UuN23fFPJlL|IFJ&`7Ai6y`IW`{ zbb2F@`UhS(mmE=){~%;xC7~>#DY(cOxqeXzI1G}M0w{{xq`2brK*X{I(wdT#oahXiOgHaH6S33_uWabEL-Y(|W^O-=G5$mK}j7aNt!CB@{h>}a;iV?%QnPxeM zCQkY-;ASv{%TQ4da$I7b)&5iAH$PUlQ#pc2G-FcdY%?zt#q=7(txx2!MGvEN;6ZEx zJiOh`mQL{LP0|(3`$R8EBVR_+hs74uYi@R-Avo4^C(>YW(kG8^1TdTx<@*Zn1g?nu zfL3hu8G=h6;}?tNA`{}iVrW*Ro6~glCoGW74xb6&R9^lx+|Uc*@ZJMAK*>?%VKq~u z@QK17sUv$0;@R2+B{(04&aVdnU+NX*~F<{*A@#mjBJa;XtpG!v^vLiVT6kI2b-#9d@C7F#?tLDW%Ms_MvMZyyk~-iFwdC zP_K~>1$6WTkAm++!8@~H+|<-6{7HB_w2D^6AFSk=V5g&#a^iOhnI{*5%1m)db)HwE z%LtYfWHn>50fUALo-7yc@l9}kZ0VTHT*Prp;x8G8dJB}KkgOQo7sHt+1^MMcB=NOzSM#FM3gjvli)=%ZQ&}0xVf&Y+9Cn0z!VL_%ez(u~cHJ+=4_c^(q ztU8;(@1oV1nsoOS(iu&S8M=_6*+#rU)fK=^vbRR?sTjkP~o1GARwN4&(?&0+3wKI+K!8CTjBvI0~(#%1l~19O~Cb>k^n- zkLAm|d`a&|4pyiFAC;_Df>yY<1G=L6(py?W#c|jL|4ugV*7dSQOfI-Ng$(D24~M%H z&m@Vw#DK%993(L)#O*9&ytOpP!PTZsCT1NKj*fR5Dk##o(z?8=*^0sr(PsJVi@RAq z^-$}O)`iJVaXA(1+AXU2fO*kIn~E!7`5fw8KuzBLs2DyG{faBrjpYTaa94qFTJwgx z%iYVIU4_w>Ih;zPB&(eAMVX5q=pGV1t!NcraC)U`vcB7R@4E}9O0}n)kLO<%e(xQC z?>kE?fps0-S8z0VpCAd;H*XUuI20Uq@4#E!#t9$}dG{53Rjk7`Sw3J z>S%#`U=;!PZp0*uGs2LbqH#MMaqsdAfo>0Pzs5@ZRofnej8%>1 z=%4Lj>7*cAg>g~f~51~Mp8 zTOxw;Q3akNhe2lC3PawAP8cI)qLa9fmEzD~_j5 zP3AT`OC}~!ER#b(+H3oAC;Y@Eb7Vid_`uXf>F*IB5=muWq(}y3IuL-?#PYbGr{xL1 zva>yq!X)6_1Eiby!IHpfEv*Z}wm&bLI_X})q;1o*8lke_!6@$`X}6h1iLz;BTP zaP%r9;!h~s0C-~Hl$1BZP&@JIVW$NPg={~zMx`8+!1%E7lZzxG@&@s(IvVde*1(bO zTy`C=3J*1T zk^|FWUUAo;w70p{x6P*;rHx`(*A~IbKI8iRK9MyGmE-I@c?xq2Y*LId7p!ZavVD|Mi#LL_dQ%lDC)BY#`Op!-rV#onCHh9U?$ZXW&DiBE;tWvPQ zV4@9zsq?!AWj`YLbyu@i*&(7X2D7L1X$&sQ#XgRKT$tcYmv(K~aR-1Sz)W@h1*8`Y zD?1flK@pGqfpau%xaHG zeNIlr2+mL0fut8+k=JrF3PSme3$3W|kM@zFW3TUY#Ffi*T^;DysHb%pcANGG2OgH_ z*soXq3q&I4!IHYOxT<EVL8~sF=2j-5l5bdJ1g%KZOviZnKlM@DwR5%jT!)3NXAs`ROeTe|3x5u@o>8%Uj7^E=_QUs1L8voM&yb^w@d*PY+1wYulQyJhGRP~g=<6(ChH>av#DX_yu&Rko?3ihIp zI0WyAonUguPVAotLSrhVYjsI(P#?tcnxM4(P;rVO=9VceHz0E5Y8}xb4EYEDwd@8wl)e ztyYab30hwu?`pw;$`gY?w@^X|^B9bG$dA3K%nfy>NYP1oZ)j8xchHWT$&Gg?LNW|B zjMNwl>lK_6s3=!A;!p@x2Rf4|A<_`V#dBv~$mdL6xk<^DnO_gl-8fG08hcR!b%OK^xfMj@s z#X++*a@6QC8*j4dW-VjiPcD5LG_oWL$Qq)ey%_w0lfPet0N1&Xq9c~D^_kbu!X@N2 z)NVj)NU2X~$*~^6>m8he9g!}g0eQq6kwfAEd59^;DDLx{%k9u&^VX(~Q^0Wzdl0ZL z%o}w?Mi4jV`aL%P9$fvQvmU=-bdfIzcRc{eHe}yKvVejF8A+(47*kwjD4o#2LMFiv z<(hNRo@YoGq&->3jlrQpZyNT-u_$!?Q;$%knjyzMI7zrNtV8V)blGCAsILQ}aumlx z9$02{Xl2O5kl+?O{uyl^mNmLw$x$}rO_m|ZZp@^eQX%2x-c5pZ;GFUgIdn2*(NmK6 zP4ABo$o1seA`Non%T0u)1(-|Kcbvc31%*EtLfS2ZH~`M$;#syogXxzh zGmMg@P7Fx&Y{^0C%&b(f*Wm>a=pKdwhdDS%USlceQ&?@RZsH9ptL*@u#;Fih26FwS zO5u+m1ODf9EV4FmBk{Z62(g?ZLVhXAYXl+&Fw~ZRwX-bDyOZl@^G{s zV-+`9zt6;>L2z9wQm>`=M;ku(4r zP^t44)YCDTWifd*w1nWelB6qIcq4#Z2tYiOcjY*40^VH;1sGl<#@Yw$EDIKMc~pn; zs5a|Cp2dt0P@JCV4@mSP=U%&W5nAo;40_E`2-0z?^_g`GS)FoxtbO3m%zc=v2Zq{> zly}vAA(^1n{8!APRERi&T}RwBcY+xQynRSOpJ{J8-i`7CbzacD&V=P$mKexkT7*u? z{Sv|6vwkwiy+M-&G+D5_WR$T708gq9)kVU>=fStK%`7v^k~5#9oFcio4e6g(T4Md) zE*!Y)>0QY6Am_rPyKq5TPo}JJ1b23tGQUBYIKB@Ba0JZU*gmce7vx;EK>#Pjn9H&r zfq?5&?onvCtThB&@5f>oonrry1zi-nABEZ8S4gYcCS4a$v6XM1Eqm1LN3J3vFhQ;Q zE)vKfCQ=;lOQj}s?PiuEl4@ocf?Pvo2*<`tC-_MqmqrFk{;n=5#PbFU}xDROpRRFhyVa) zD4@UuI4bQmX-wI+Rg@P3z3+OkB=6nK%ShzqqXaI|H)tg~^zv|(^f7_R*SSC7eL-j} z^9y^&arXhHa4~`haR!1)zzfSW>Dhdyhtb>Wet1Qzd?9P2|3}+<0LXP!_y5oD&Age} zB5PG<)vS?=;VmRmZnHMcZ6|^W3Y=fkx~W#&m5_9VED@z{Wo(7>2+2FF z0nzPNKAF4$g1|zdSz*cgRY6|&Wu}`$P<4sSQ=gCRP_Va+t`9Jot@@n%kw*U%3nHOc zdfWLUGJu~u-XJiIr*a$K$w(@wJUJ!)CwEexcI8Pp{L7d3h|c1s!qk0=C#`v-e>A*m10* zF7cD?P%8{d=Gxu_3+o1m<`6u2jT}_IivdPPEu!l_J`3TmL_Y=ouMEOJlH9nPE6-c% zHLIn~UepG6tT{gOCNkTT)DW_5E|GIAwQ&IbCKu)^);nb15b}On*6&YLtgF*_yD$X? zb?|@5L6*LSGTwEzFxK}8w>s|kc$}YnB~WV zgF8V!zt^If#B{E%UkFIb8z9igj`XV8i+*(oFY@Rqydq-Qunu|jOdRyYA!o0yEMdE0 zG{-)t&`&A}524OzBnxm6H2Rv_0-GW*(8BI{QhLfjZ}(O|^5cLIZz8v76ykiH;6*XV z&dCd0NO2J+dj*fc9YEGnnYb%r_DCEWO?tJHJykn7`fbRD`mFZ$<;~G=%QTY-Gowar zHpcnGIA8=O6nXi2)!3eiyP8nbD{bva`$h`15@cItHm24d4NYRPeLB1Ivl*OC>Z~wf zn}Zd>&O00)&Nu4*9=7nHui$NxfB)ehqwSxj4($WE&lP=L_`4M$bZvH$mKU!);rXzx zrc>NiZ?=psOYU5$OpSJ0d#3`0u&R1arXKE=6tfC@#B{JQ+9wP>bjlUE218|}BlI;d z$;ZKr+*A&(*KN}O?#Oj=PZi8kukC;b>b)oBUh8Y3u!M?c5SD_+VB>>rH59vh%iyx$tCTUy!CnhCUHUTw3E)3WD4A>s1A)&te+yuhf$K0rlOn6D_R|VctN1^M4d+KowR`VuihBBmV}JDy0oBC4%T*H0w*s=2vh^qb}o?Oh17+%K}#uH2mDS+lkBcTYp18 zzN>yT!_-R;jJBotRRO|mqQ$+ZCs#>Y&EyjQgYV}r~9DRzQ=RF0WD-ZFfRWUgUE#RghfP}TPOiX?`Bos&qKLFv^Rulub9A|db z_6~e@RS%%ZGy1EWU=QAp!^9$>zG<^oV@U@q5jbb}&t)Y>Vxs8xEl3KQDS|VxIb=3_ zvoDoY4givvgV-0W`_v!V-`IZ2*rgx(K!0L(#xs4kNzSR5oHLM@O@p|q<-lx76KbF2 zTipK#@qeS1ch(RYdKOy&zBR|+!tW1+$C;Z5AzYj+1{`;HPyvKQHyMwyb}!BDL4wCz zrlYl~@)Oc=v^o~I8Wx!d#q#5Y;DLc=Y6Z<_()0#w&`^>!`SqShW&0Ht2MIBac1kWGULG0XXqpjy%B$#)~!avW^DuFnt6u? z1>xCewaP3h%0x3SR$|edH#5D$o83Its4ZyjVXO&NECYSCAayN2HcGD2mupSLL0qx~ zwowd_E|V(l(FI&0dC~y z8A-H~I(1$UO}vpsWxwt zC6g^24#F!fTU@#uod$`QBJ0I%^Bk4_~G+73D~|! zb)#jbHj>FCYVCK;;~pB19all{I(~I~AN2vZ;n9!P2U)Ti16z)Wkj{Kly{Jyus#El$ zTwSae(x^kO?t6b+qwT)fvPFV`|Q%=^B^py*hTFr7fE^59t!Y@P{ z{cFI7^5Ks(F&e6kpnLKnBnR#NVs(g|IP#denBGHy@KkUyQ8i5+HSSnJyq%Y;`m4*) z6dv%nCnPYL90@)w%GY3HTafaCDmQ;_kRS~-h%t3ylxV?J!S zDDp-3w*l?-M*+=vcHiD&VD{Vmyst@>c8Ef`CD(HZe-&!ejLw|4UMpyYQe#`7>Fynnvdk-Ce75U9BDVg0y zrcjT+(}9D0_6(-7vf)7AQ;m2Jc6~B0j(ZK5fXwbFDqxJHgSeF6pIRL^?p|dzumwkZ z+dL5CJ@H=T9&Mi)D^1ixT5&_{FZ50X91l}-q~;Tu0XX|gn|uTt@7c4ha8yI?N}|V= z?c|R@U4FFcEJLU<&F%!Pn^2<<0GBooq$O~TwBHbCPmf}EI>r6U(`g)-lHS>1loNt; z_$kgQ*t`c`-c@R1nulrD17-3rajSB?bUqNqQTg+S)5d0;`zyPBX!Wq%F2fv8e$yw$ zR)78o@`v0C&Km>2XOzo!XzdLMJ-Tt%`7o9tcF)Kf)M48p?iu~V+HlXvTK3pAou5xA zHhUmvf(FES1HC^N5QF|Rj_w0oKhsz<8I^##t-Y?^@XPPgzSy4HyaKEY8@2Le;v2yc zfaD(L!Ge0$dp(8@an`WCA3eOFrmwMtxuQj~qw4wxp9=!1ASLo}@`?bj$l3uz;UO35 zp#_uYzv}}Z4gy7E=vtyz36Ha&krNriV!ns)Ch9vi!a!eID>xR!VaW7EjZSDsI1Q0u z2jNgziyuo3*Pfo5@q@Jv!bNsQZuboc7oM0D(Lbth*lsCa{s%cPx98MYp#epNQ|NgH z?!gS$-?K6YT5t7A!7Pxe{%dcE@r_3wQf&+ud`DxN8QhVdtOv2y$08+YeT8W`ebadakmf37~T zPAacxHuFW_mc&%Nxl+j zOU5f(qJ6;n3*)OSyJWR+u+x0%^jdlEaZLj+Ot+oK(I zJ7_+{My~JT=vzl{ag=7efydP6ZZka-WtSKJP%6niLqJ7_!0Q% za|*g09Px+HGW4n+=c5lLn3d3&-9KC<5m$x%FGMg|v_~1q530}j zuiyV16qz4pjaoiGXZ=t0N%tK{=wC9Vd#3%xzIsi0*Ko9!W6Dv8(&ZXB(B55^rF%9< z)aGKcwCrP~{QM=bb#T`A^nH&O*iq*V6q{2xyPCn-_ZY<0%&c2(!d!r5e zD0{O))0Y%E)5oRJyjm_N0Tp)oGn${>HxV+0R^g&;yOuogp+* zhQ`a#214$iN*)PUofsYa8Je9clo?1ul6mEcpLI^>Mx0*as44-#llX5r|Hb^L8{2WR zYUlpesw-QouDTqyqKHY4SXxFXeZ774>v<>TGf5QVn%wudpWHvXs&Zo-hgQr}e+P+oS<&4$w(900rR!%H?PDtjba6~3f_ z?b|Tyj+S+!B^rN?`D(^|L}TvbdS;>SnQ`iill?bsU=fWjYc0FdD9whuh#R}|@)2I? zX)V3#_Jfn7Gk>dLjg!^TLs`)y?`lP%cBm`VzHXrM3MW|UdRkdE+J4IKQe$WZ5JM}W z15dd9ptoUxRXfw$53cU7wbf`1c=|6J)72NRxx_}1)ozU+@i)g&!_IuzdXHsz>v@;m zzPxHJO;m4Mp01ooF{9VRhxdu<4PI#)pQs*etoBt-(I+6?G`Y}#@*q-Ma{uZm)F~C+@fJQ&(KcP3UdZMuf&-M$6sbIsPzD$Uh8t7 z17g8GhUH!ML1>LIOruHt*-Pnef#bry9DikFqRk!A++$&Uah6Cd^S4JnN!|agF+l8> zd2O6Mnx9e6nLkFvp7L&HnqNdvN2EKcA7l<(3j-vks)lHH)! zrCTN3QaDG{$G}rJaeh77?K+of)r+jaGU>%bT5XGx`Z3BP`K zbRD?)AHz-861z&u-zaD55>a66C#gu$uowd%!ex~YBrvF3#LV-|l z_Md=jvSw1<93Dn}ZO^|+Y!ES6LlenD0l!HzdyP8phC~3zzz3A^r@mcITiMPn<8hj{?y=MM)$JNP zn(vV_8jWk6Tj))aZ)e__mMp&%iqOt`d1K}l_(g1Z&MqMP7{dBE|4nLbdR{d5c;I9y zI*?zk+bHL9!&;KLS{7Z8w=Zgtc?*wDkflGyHoue!)^)z+ST%RqVl|Z+d5{%0G~Q0t zew){<1pt5Ho7A&o7LL?dUTrYHw?uP~v#QcXfZ~-douO6RG0xn>X&N=c*96U{joy~m znsBV+^#a61{eTbh#2~4`%&3Dzy%=W&zdTW;mQzP2s*OJXP>nnVIb5>l!?p)hZX)Sp zB^ga{JGM{RL#6H#Ed5^G&P$Wpuq|)Eb{kXQ?|h0z_KBc6cM!^+!AR{BiaO1cicbw= z=fd(+V^MBaT^85<@;gPF%Z|Bo<)6UIYuW1y>eaqtmh}HsdbSrkj{GJ3ffA7Q&%u{h z_9-Zt@Ct=*rzRihQ7*qvAxvWL?FYe@T#KcJ4pU=23UI%I*t zju*Bv4x_*#EXwDE~h8>p7f>fZ@e)DNSt&Y#gt zJ_nIyPY|AsK5Q!9H_EVr8F4?9dh5E`xt+X+c=|fYo(I(tTGjcej>;xRSI4?c$Zgco z>|goK|Cv8LD~b%k-P1U~N+VXwpU6*T_GOmW zbqfBOpGHE-b?xF~<8ZfxVtweqc>p<4GchuIZ69-z;v~MIyBTS}l3;5&K6Q)U7hS05 z*Qj;NStc$EHDBKE{t9t0v9RJz)jy=nGx<+;>CBz--x+*g#n)T-)%Fqjg^=fY1EKfx zABs-No$P7+E_t<>zv2eP{6&B`HxStMf_85s~0m2e_$L{+;je+aZift)S=$i`835J8^r$eyB& zSmG&VJT!P1gOI`MmPB={EPIB7))g$1dB?s)6UBAGyIT;yE)rhB#6vHM7zT~)%c9ZO zco?M+YYDJ}i&?cbrS+;3{Tn4}eSYyV4QG$x97!kbz+BqIX6Lg+ADXCU?_>!488~gC zd2uLzjHp_F*tnsN3Cr3`eOWUbryB$mDshUg8L0ABuX3_;hX+=5e&&JIonM63t_9BQ z9n_t@i^5}dHXrj?x^3)Jm`J6)rS4o^u#|2h1f?e*+Xzr<^WdhitcP!)UZ68$$paxQ zyy(_z(5d-49XeFV=1Fv!(uKD*=xcY*Zij(!C|=nF{cVSPZc42?A)ItZl<<6Y#Z!~; zTQOdnA&R#*&GOC#d^F9Tsqx_|KG*Dl@lOU|{L=v#{Y=@{#@P>%V89LO1Lx`IOhz~pJWcYXC8K}8^&>^GL#gL}GP&KJ ziG7~yF6UIkitJhReR_OO8T_NP7V&+tNPI-FK**K++2kG(H(fDuIJLjbAM;No@*l$x z;JXSaygW+3N8m^Z72d|EJK*y#7sY4ruP1pyGRLUFVSpzq^5+Pa^quPK^2*`07{$*1 z99Z|Vf%X7KYaT#GpE@R^0^nM;I%?1vgK^afQR9n67@sUZAS^u?f`i^jA)Dca3xLXQ zGqYk6;`M5j`T1MIuN6 z^saY`Z2e}|1+2WdNW$x!Nvm+gtzPQ&MUv}ggpE4)zs*P~9YO_%VCb8O`LzoXG0*SmPmnu{&fSo_RknX*y&E1HtalyaFO z+c;zSHK591E&@KhVPufR+IKS@@pQ%tefI?|eU5&#xssU^Bt z!G4!D%|(#{&wcrAyV@${H<(PBaahjN6v+09;YusCJ#O))JKfXJ;Txk6bj(q1Z;!^E zb7JR9cJ3E~)zJ6B)4>JoP{?2$4(HL!!X zxzup#a6f_agLZ+fOY+@J02u{tnP(LE_9e`YJxY{Opx~{&CO;cNnnM=9Q6!AmsqUxK z*5kaM0aHL5=ASGw%x`7&>phjS*7u=tej2eu;~e}HD1N~>tBT}i%WgQlCw*h3)j1xH zUE;3N)0>mxXou5Tv!wL9MykX1>8G$N0dDt8 zGGcRn@~UM1^E4yz?&cImOsn--3GXPn)kZ82imER$6dy5LeV!Lb!+H<8+S$CK|+fdGHCDWWR(WS{rD1 z%}xvJ3_6{9D2vSG&I)IE>#tfGv*6r*aO!=;tsaP5H4vVk7j+o8y@Yn`Uz{8_ka^ue zcAD+)bbp;Vz~ z5Gu8}!qWljTA{jvt#j+-f~O&IJT~H;Id+GLLlc$O@mo;Yw@%&?w|8(`h&#`J%|>uj zT9imzmj*T#3WcvC9R)eixu+VQVy9L#<&wD$ELNGRtAk*;oC~m$3s(xx=18@&%Z^ZG z<8>v9Ob$nv#`|$&MrDA93chvemXY>-Ov^NalQWj4N;N3qo009KxyVze+*sqFJX3hM zsEH`u2lwPQ&U%4Uo9oxu6-K=7+O@0v9koUh8Ahxk!uqqnWR)Y-oUw zB}x{Hwk^iqDe3GT&Tv+gw6^BY1)<`w0X^bsrgBb3+b1VY^IOH;3qPdEVww&0$tR~i zZS;XigAUWu+AebzO`8Y(Qfce-!p{B2 ztt-$advc9rTfiX7|0p_vR)gd&}x+a9i zTb&SUw5|=I(bh9V=+f4uA#_6PgoD0@B+(|uqiJ(@K)qwf!sAir9S{Zg-#EVJ{WhQ6 zqpQ%7@0@)y(`BsQIw4HX@tHqjH2XLCH9rlvI=6yqtilU@yg1Ic?XyjQ&=M2*Hm|Dv z1asI|l$m6H)r*O&M<`9eX`eM5U0L^p)t9xl?F@BL+v+DAHykne8Qh)NnHp!~JMJ%A zfucoRb8|wsyzCpAU@@HF2GIDO)&^8v6VWQB{0s>)PbN``+A~4}Z zkoatb88FgbYBN?37?c-@wT}Nv_|+Ix66YlHz4{p<;r?PK$Lt5ymj*1tRNbES;LO{} zlK5>k!y|225(7Ph->goH9C#|?#q9Q-*UmssAsum%R`Ci?0SIo+Gq3M-}B!?!|&txo%ue00&K?} zocYK8*ZPAqQo9y#j~$%((!l4)!I@7Ce2yQS`Qw4l#=)6G1D~S@XI|a^WGUUX|KQB? z6=PvKJT7a^`|t_2iJPio!UUk5P+a;InYmE%N{`|@#C-1CYJ(C}kv6D!8xK*N;xNCX3%90d9$Ze&}%}QDL=1}R_@|Ew(RHEZa zf35j;9;(OlRd&vf8POW+Hr{<7@~^gbvn5JOjSXnoTM^abdNxj^Pf+K$g?01y{jk?o z&mAk8O{;j{EFewYu|ZP)4bq|QdzN}Qr@yW7$%7skDFTfmuwfD_KwnGLKaFKW8C2AsKi0nvYC-?P=j!f|M&bR61K_h+BW=GOMm7qo694M#gJm#uG?+tylo^6Yp0RbCJl>%75?UGGs>@aRu#^W?$SHm2*c$i7h*9<(`ln@N5{ z(432@M3JqkY*iXC*~=IF0%#^%ku6m=2K_e4Q9*3*Y+-NZ_jZhS66w~s{b}Hu^s|!f zHM>%L;V1hmDUM)@SU3REl2J@bDch0Wfvgm9*hB_%}_|HDtk()wfSHa+Lq27-FCE2 zZOgHDM1S!5P!M;0YlE)H9!C?xWZ)krxYe;xLk@1feIv!iIEAma8`VlfCyNU$3}ANU zsC69AqW&B429ePr#Sn&{M8|;Cs)VCXrmc~S8v$8J^`WsZM#bw5=E+pjcmvkfyM~UV z(b$fU)Hr=2n++YhnjXl{;j7V`4n@`da1r(OHXu6A`nu{oUg&H+_+{zf4}fs_BV~*`Y!LU=nAEP^EsQ70DjXN_Q&CaP4Z2bkE8=JvQ8b2ktHcH zK15JuEt%ww^Ef_6)8_UD7hXk7qE^(r zCA4d36h$NW5yAfed8=Q#sBKA($^D&j#VGY|CgUwB>zJTUe2AVI}JKp+HmF zED^Ukri7;lQ19`o7rD4~(j~J}Gjle+f#`kt5Bbn#JT|AUiDl1uJYX$7M)DRF{Rm&8 zmJ+Dg$M`%7m*b|#<@i6D;aaUNChjS;O`#-pw)k`>G}VY_gnyOQ1!Y&pgo`*jpy<-QzKP{B895pl}R4wIlc;5Er;d3yLv zTy$k;kVhhd4(B9;nDe;w@bP!9k*(8_lH)s(@QbtSnP~KW(fS{jZp#4eX z8nyUGHEwNCorbbiyRsd?;GSOU7^AB036@Vb+IyO_c)m)pgu1d$8Dyd&bM_z16QNLX ztj>!T+8j^RR%C0beR(~eNVAqgxTC~AukPjL(Elg*X087mvAepe}_y z-cfy&8Ln9aN?UHc(;9vFY9pJDO0>R62XOQfr>XA4#GvKuvyWUlPWdS--?&)NPpwTYVDiz>zrKbuph{CO5nFWt?0{$~&vdn&JUaG-XiTt6OEG#u5$;B# zFZQr-E!z@1Q)A7s?d=Hb(Ig<&f{s7vm|W%PCm!D$I4BdJ(7tn%;U#;%;iQ?rK%M7# ziWk~%oWF=)Q!EYcJI|$D$!G8W+LX0B~vQ9poW7F*#D_mNvML}r$Zm}P4rdyAtmC+bJV|hY`?-gh5 z{;q<_GHhAc%Ggg}F4FZ}xbpR6nZsa}6#*)Z{Qz9;Ru-qIbyqn3^d3(8YE> z=4Y$PmL&)eLQ9Z{g2y5sJMB2{VK{Mh&uv*w&f5b&^z-L&Tcf)gf<@xQ#McHzZDhC1C&aizDV%*lawq849k$$tg9EN+r#!p#dV+5Ge1ei*FEs5QB2r0k5J<0|CW`<~hn% z(#A1N9u%l2*9*i$u8(*Y?eT7_^oWD)Rk=e4;n3pgWsBZ&b*G61ccJ+NZKLW8<%YUk zby%kKAg1ypl>pS95W!)$fStR?F|5Z8=B3RCzdJtNhu3q>;z7Q=x8?o>eEjp5P>1nY z8psd)Bk z&$4o(&GR|EmO4s&guaZ{-2TZRGG4?vLbTcXlw5lgJR;jE>I5;gmF6D;7&Av=JXkA{ zaJp(FBowcjh7do4*`DEgtQC zh~gTQ4nfvo++jAf1~iqitMc<_c=e!uV;X=kz#oxUTYxBb_8i??!S~8oGh90Tp5UGFNOwt ziVmqxt|sfgoN}kAoS)B6q8$lVN7$L)Kuh_9ArBD0jT;=I6i&9a3Tb5Vm5uXcB=OFm zIZ{2JCEF$js!u(ignCL1Ajf$*GTR6@MCO?$h4XkH-wn~ZR}|yx?^ZIm(09gNP3&;M z?|hB@gheKHUah^p^-y@ZH~qUsTflBR)B2tbCLzw#C2oj*Tr1vr* zPq{?zlk4exx+I}+N=mAtbhw}>bKa!zqD8~)jer7J`k6Pp zm`zBl(p?csXhF2pZ-KR2bKG$2RHm$sa?}^XEq*gi1SBiI$2MABbVvEvBds2=^kf-- zsb~VTfMWd@T|N^y?j_oAo)%g&u84|3Qy9iCo+v1i*{ebMNc+43kD5aU?}Az5u|87$ z9(b&vTVd3_KAJs7K;gV}Qe0fD@g`C^+I}TJ1F~I^+byxHw0xI=A_YWYL;M2gQA!PS z$KQ9lx6{6r&7VZEB!4x`0@aeWGO#c9wb5;nEoXiv;8|thN%;C0zcYrf>wbbr<_`?% z=xfJYNr{qoDt38oSuJ~wni%+gE#IT*brR&Jm(;G4nC_+Rx}uD>E{|&0Dw;d062W5c zr-HepF~-7dyJol+`2iyF#%hRAczLBUJuy+4);>z!FSNTW>ys;-0EvnYKqQ?2}&fDH3wTaG?{b&{zci4Em@5$Y!p>^>oN!+ek z!T8mE|Femio|taN9R|31hW+$vsb|bC&^Cj?1i|f^!@AGhxnn>}(hQZo)*}MmEdm47Doh^qNw~iJjdG_7~c|JS{@2)WU#e*I_(AJ4XTcMe| z)xswiwjkYz?0e2I`ts$Dt`_=`r^?;o>!7r~adw?1GWTb7$(}4H1lKP=CX3&w!m(O> zs4?Kwh0MBg?^yGBiCh-lXP_t7$4IY@fv^C*Vn>>0GTdCD$@gpcDoxA#+) zcD`1A*eo(F5f9zY>c0O7uIM}8Dl<^e`?*|F*7N;-%F@n{%a6f&nxUTYs1Ke^H~7nt ze~l!2mN4UKI=g0mMQ5syE?+lC@zw%;P441gzi@5%K$e_C;D#%9jo{z|WxuO$#A9%I z$YokeZPL})8V_t3PeDdaLbPcwVG=HJtIT@~SBUzMppz|g-g|n4EnSDc1KrplJMCVw1B|A_g5T~@`__cjR zJbN=E6)yU8{+VI7Cr}6J6TV*LeSMj?b0=Ayxo;ltEX|4!ac(Po(d;Y8yieWi_qDW% z2EQ*OnVS1+pskZh{|-*EHir1}4v%Qunhy$io@M>rJIX}xbtu-EMusnC|=-ObSV3iRnyV3pF)-eU2POy zWsjG{8rHYi-c1VY{R`=Bl5rV-WW(h@i=s;`6Q`Gz>?w4S8mEHJkNi%@@Mz?Z!7JRa z6_hMnMjxVg!+YFSeCI0RO?UDa6ua4q6>}t%QRKWb$Vrz2zR5{%AQ@jBMgSWBO7uM1 zyT9SHdw@i+8DuwoCGsjb5^-9Zy-OgZ`G@&o0+NT5sqFX5FG+iYCAQ3dNCo2V>!~Kq z#@JkPp3;4@zBYE>!jI_?6{sg%OaPXu$w?0wf`z8W>N{=##;83Qjk{B8c^4;9S_zU$0LWs)OJo7M+RmO}tJZccO)53)?;}0?4J^+>(`;b_jkPKC zyHd^9Q>ksc7*8S%# z=)TRlllus;Z&2{K#ZZt8_SM5BK5`u1p%$EUiz;oTsO9`&Ovp9q%yZQF4gAjy?d5{j zdr@yTLif2Fp?A_Zj)N`(=-YihV{<9a-YUw_BoLn3bnb!HXCGXrnEW6UdC%mYUDnv1 zi+$ks1glD&^S_32=Uch_Evjz=pgnI-IK7o}sE`^yBB|j`RJS+vQxohAvP*T zEhIvLle2FFEj{7XF&lT4ZT8P86Xt$ZckjS=!6l8ND(uJ zap}i~2kOKyP$;i$F4qF}*Z_t35QYYk`u2rG!*ei(GcRsfoqZ-&p8*JgvIqqP{qw2O z_9qtf<@(75&xTVkh!LTj z@{-;g1vtc^b!(csPM1s;cdliL?Cj%D+*OY3JcP8~K|*m?e`h~K--q~3xHqaqmmZin zU?ww0(#E&HQu2=$#ccj|Y41X(#eO+sa4PvWKpbyh8ZW|>XQivoy0pe;;~c*b^j zwtK0jG&rs2=(j)`FG;(sZ86d3(&&L&9@jFhw;qltggdY@c56q-l~tgfb+Kl zAvd!Ip)om2w0M8|=Cqg@_wh^&8MKIO?4S9UHBOT3!}r^nuM~8mRC@!o-i(gFx5K3; z^_;Mxsq@0_ale)d=xb!}o>I5eU+sEY8ivnx?GWCh3pp&zL9yuA*nzAijr#s9&bFI` zfC}jyN{+kwv6U$9zKx*qwB8{??!WSZbc3#Fk$o$XPOFGHbam1V02D30s$W}oF=y0k zrQlOh&0u5V8w2J|5+NB!4;8&M_l&gl+LW3zh81_;PH@+rBwGcTyGNV6-;B({AfqeUzM`vy$NUrw?9?N@bJ&k2+2N`I!jy7CB5so_g zRnRxRXb$W}Jw0WNyQ(>Vmvzal;eKC81ix5uxN&S2 zVhW^C=butYPq10xcT>Qv;dboRPVVqhodnSgcirz4X!Owi&Mk{B$BVr17)MF;x&vl1 ziX4)aDyB!f{uh`P&s<6v_e*TetUN9HV}hwXJsJG3YF$wm_yh#&onn|D@LQ zcTsz`4R9@|=aCK-e4?YhPK$(AzrQVAIvRQ8e@Lf0e*2NqCo7g?sdxbqVd;CCEFejG&NtAydR!v^quHo8~9G`O>a+M(B zK{(7@OyafGRoAA$6#tkf_WX(#F5dg?3K-YiU^~zD4_%}xr!`wrlIZX=$tB2B6U)Y; z!*%zJbNJCZu^!BMA+NNYBDSVV(`G$v9OVO#M`@e(G`Q6&)lr!L{!+~6qr;U=(P5!h z+L^~_PDh8gsxCDhwhsf`z`zb$!LWC;Ie(%0_@HRw;;6oxX%|J$j+Vb7Nc{8)jk^n()mBuQ4!G(G zVU$Hi&EwR<(VEsJy4Fo}H5t_~`=_pq*1C3I+G1*yau3s74?VWGdUKjcTDCEhEMz{3 z=V}9WVi>yOa9H&{occ}{><+jc_Zi?$7&?OOxs91aP|6pv z-5I;oWV`My08s8_q0kLlom@mz5+LfwrriZBh=1h#rPBMT5`Aojd@X&f$gMt{Lm!H@ zUX*)xmwPrms&8s7yh3`>nqUSY|HMf0^FDwXIlOEW5(E)@iTP(GK$)D=`+CI0T;{YH zL!PVGXo#Gis3_b?Pnz6E@WHVir0aLox8e456XE?wYqD%}#mau0>yGm_wXTbXO_y2r zA;~^)lp2dZEL+~MZ_Qe-?~x3R1|jYWMfvB{bCZP>nSb6s#bZ~}=A%VN+0RiBbx+dT z`p0TheH~Qse_WMSdY|B@;LqaUhJ(2Kmqc5U|3~Ah`ld#~$u`>Xe{uFJK^=DmNjO0; z_Lu!P@q2A!p8c1y^yLlnooT#B<9p&sjvGWmA5_z6*BdzT5dkjXU94WwjmFrA zbbxLYd1Siz^C7yqD4zWjXsGu|RTTI(M5A?8_Ir>> zVYeNTv$H#`v#ht{?N5|8nr9vCU!ZDy$xyvoxLQ6&8d>&h+`Keln z2Kpvh<+17;x}BL9@ex`dttI)r$UD~D!^L;Ec6H>&(lJ)mHKwbrC6D=r#jF{Kxr3N=twlf)fQrl?zB3-u9We}` zMTygOUaARbae7?;!*(6Nxg*#fMsv3>+L6uY^?TtkJ9c^wu6Lj(NaNIDA4Hbp=@6)x z`|{$|-|u&>zJ1=@t&7*qoGwOoU;quK_CzwDK77ygAHaIC<}XHx+IQOxE!{G%&3scM z+S+Iy-vZ~*^)0qAB+4F=OETB85wynunc9s}oa4R|`rR9GYs~~#o`cg1m(PyU;Nh#a zvERzWG4JO=GOah(DkATE7%7IYiflc!zUE3ka8qF)moHDlgJZmBrf9DHwt4ibc!Z1z zMnUZh%IbGK8`i}cw_TMjubG)HNKUMl-al%527V*``oBRQmw=PbolL8Je+{xbQ}-bB zS%sdg(B~AIQ|R*w-K@|T6uL#BzftHL3Vo5#f`{(sl&&Z4*H7VUxVCyuxenEa9=G53 zx5Tv?<{}%;(D~(BWu2T8Fe*A7iV7r(&IzDHwY75s=TL2(y#{}%cHEqRI#gTVInDBC z4`dekLpqwqoktTprX*8~vOcHV8@ z>q2jjvnFA9eULOE`^YMK9IEa7xfSmtOArqg*Mw_5ZDXu+4rLCX4XYp8}&y0XdiV zDS(!Jzvf7-5ft;H#@2>YPOeNt$gSsXThHH(TUI6069y9(TBZPsDJb=Nc?t6z?ze1o z6P^wi%%6^#FVyM!*z6RUt*d{_t0_14_j^8qlOd={L2Dk*qXD{bX#$=m+>Xn&n46|Y zwt&qE=E~6QkRA!|1<}$|i@6b-pRvbi{nEo_zW#6?`7m3x%v}gu8OdnBPf5>b*jl~) z!lY?dv8}DAo|~-l;Eq%8l}vi@-0k=Z^5Dg%tSf?7Y{%o8$KuGbK#ZBm)i#gfxx_Ep z;QOyKeUcmIuG+q~-xAm9z4V*`yRcvZvgtKskAkh|{I!;){uajC`FxW9g~GOSCizDc z*4mh49~C)Bl0g$Nqr3gaH}Ue&+>R=^=C79>lSVyTRfy%9#ND$$9Xo9AGJ%S1q`YUy!da6b)r2-@N_{!DV}k z^k3;m>VpR4Xl0eYpsdNmu?=7->+iu2_mgK^IVi z)M>RY_87Yxp*Q>TlNO{ark}oPLAql4>4AC%>Q_uZJ>$!@wq(Jo)IdNp1-oe`Hxu2p2{E$Tn&$fo&I3QfeNk6J>y(`NbRrj3yWSK=Yl`Aze813%6kHS7tzln%liok z%BBTBKAvs_t{hw(Q11wDL?rpu<*s7b)_k&=ZKX}46w&UW9eQ(KS|xf9E6*LG4Yxxd zqz_*F3dFI8rg&|q$yyZ*%LnP?LCPm0ndG_(Kb|F#U3efC@n}%rG8T&Vn#w$FsDy^3 zPd!%-(IQJ;>zr`mgR;uj9Bj=2onGR@;Pe$*MJ)&8E?U(n1&8=FP?Fn@H$o9a^k)Z` zC@k6hCz}a4JrEdM0~qG8ZvbGWg?5H(I@Jy!C=DcD=Md;RC?x*)5_5KR7;*-512YC9 z#U+V(V>)@{@t&NQR*5i|i!Rr^vGv`-F;dzL?gBbYUco`2OyVjMBaUn8bFU^x{;GitC>1$nV0|0$G=+BA(#^V5HyeRR z$|uf}%984mbVYU=0|71AT8tfv=z@O(IhNG2dzN{MyBt?Y#^_&sI}8uTnd`UoQ|WzM zKR68duKiYf-?!g-?|b%J>-~UVnzsG%L$FOqv*l8!eF9Noti8UT|E1)RDCSi6uL$w; zNq%y!gQNy(E2^*Tdxu>b zHR=b7<|fiNn{Q!in51vZQ_={pB+O5fpEv7TQ`zrT3;TVlGN`a#G%t`bT0|~S)!h6l z2a&Yn6t+@Fz*87k?y(i)sxyHYi>`BeeqSn%z7&1!oooX5SIoC3`n(cJgn8og?dN7M z+Z7kE_yl?T5h}>P*$2RC_Wh8g+4B|pkwOnv=*J2@RH46D=n)G2M4?A3^izc%tI*FB zx>%uqAXHvBqHe*ZLu!-jJEy^!t$B+_=5+dYt8AS6pGy_4@9vj*=x-{y{0;@3n+_?KGCq&UX zXJ5R#_gOx*TrqBb2g>@04c);(bpmJ>dZFnY-p8fn1*}AlkWcdBuPd&(x5Z6hjV~hkS`|lObkr zC6wK!&t=sBUNwNn`0-8y@cDi(v7s<*j9~bukxCC37Q#n@dnYT?q0H`npE$H}3PDjZ zdF5}S9F7dPaN=}eyp30U8{*}axZxm9RJeK*79$-^9d>{3GPl&{XRZAT+N5C1n(Usu zY6O4eE3QggV^>{q1vjGuD3iM`b0R5t;U0tchF7xK7}FW_8XyuxY7){*x}Kno^G*J+ z8%5cZ;6~1^w5C?0=ac>vt8?}TEZyAEF=e$*M32WaT^$**zRRo-bYvEr1i{JJNWH=R zAvr#~Ls?w%luVLFwdK{rTk2NJatu{?S+4Hp%oFtfFpRx0uP+UGzQy9AdFbcEd!o_n z3Ok&7bj5C87X<5tEc8zugf+HH4U>Da(-4d~6~xF;3zjtV8-roNb4vS79B=9l^+dQt zO@lZGDOK|`?*f1b{b$4bqB@?gZ=cgv=UITR!$XPK1BU>h<64)gj@}rRt-3g|yLyhD zYMrN>(Zb^ggNK}}h;{XbAaHyO)x)hUX-uR$$H97i=8>$i%Ik-i0+zQrk5FrUdF@DO zuT7nMn);1z6mYBc=^TEm{OY`s<2J2j(KK;j*aw1d*}lJx-=}FToL(?3V>;k>7QJcB z;V)gDh%7ipMeo;xGLd3;*XlcwzWg{ssh^354`mmWxVI7S><8KL3HfP$oT04JaBVKE zBY!h#@{y#gE7|!H^$Ir+z*{l9I_3iB*9iZ!Zvft~SK#i!yNSnht7&?9 zMZmeKaUFKi{?3Fyl2~izw~JAG5J!uGQ}!kmKi$*o|Xe>!Q_IQ&t08 zkVe?*xA8nN*k-#`CYgOj(T>XPI8Pe*!Q92!I!E2Uo{Onz-zdJ#C2sa$bN_*8miHKv z*)P+Xku;ms<}Nj#0JC2q3hjcs1*o)FK^<}nz|J?W&*m^f-3)0Dd)E5q5j<;!D@$Qd zxFx#BV|_Zvw@{af@^s)S;DiS!c;e)z!cSsA#$83t{ioo4F7Tp>n)_cqvg?2Y_n$ZJ zp8YD|_NwH9$m>lWPCt2~KG8V9PNu8axKYoZN#@yQf*hkgLCz_L_}YZA0(+nS3slTX z=oK#?ZvB`2*2@Odfd;3nLG~bVSJC+V<%s1jwE5YgKK^RBm9ME=wSiVn@K$6}rRa%t z_EqW;^KS7T-8xkJe=SmbePQi2YF9K4iSJJB|E=1)j8EZJ&~RFh=8mB*W_hjGATR{b z{~W1ETof6ZU*!LmMdDiaK04nUB?|*5at@U8Yl6-ES%A_TTab9CC2|Kh?TwSj#L)VP z9YgetK2J#Vcf$tZ2KjSnBL6z$08gA`@AeI!7_}S~Lh9^5`@0=5Ra@Y{bp&S@0l@rO z6f;szr7>coT(1~jH))L7KZ%1GOM~8yL2l3qXm)?+gK_j??!Xq|UqrB0+r!7v#m7v&sMya} zBZ(Wx6caoeT`lyH*u%l((Dqy_kmQqPa8Ss1qX3W%UNt&ppuDYGzp?Q3UYK&fUHO-L z`HO~u%3rByw;Lfx)UkQ@cT6lqXlL_UmWs9K{$cGw#PZadF9XY~sCzUgCsL{P>a}dG zv%%nxexhn7AyOE9Q__u1QGLC?Sf}(c=mFBN)`oRzP4t-H(^Ko_e*)*M;H+f$G-$Kr zBbo3b!k9fWwk*1H<;`p>NIj0!{0{MpO8YWe{ig8?^rzn;D{<>3J&igit z*9wQeC})`Rx?60cFZUa|#P(aZXeasi021I4-RuPFSTC2@0vr)knHg_1?KfVz@R1l=rAZp0fWNxU>Lx&!|M5byq@EM9cExn_J{*L+Qa2(%)*fj~=Q z|7BUxw8a}uE6HhE`CWHnOT$opi?{q*HKwq$I3~J*{QB4V&@tF`NoMJMI3XnAwu8f= zr|;8>-N_WvirP6%A+2|vvlP-=*Lk!;THQKNRY>buXRkt9w>mFXNUK%n^$JN+?z~qa ziME~3Dx_ty^Am-%Fp9Q@^?1|c@!YYb*rAq=)~sLeDTVZAZz-u1Eu>(!6ZlRJOhi7^KrwPWD z*rVLUGUu^{pSM3PwG?Psk|95Da32H5AA$@Qw{YBZvqpg1Ms7{xke608RwVAKJJ#Ct z(zvTyil)O6F9PkPbw6r9kSSYc-@G8Zy#sg`pk?*O;HPK?zs2J{QBh zQCp$x&>U5}Wu4bj=W~YZRC?M+0mOVOedA z85%=l#YVQYT}h(l)a&Du#6||$yEK%xNJuG1N zjk^)%X54X(c|VfuZB*I6|4}tubS{#8Gdk+#K#S6C!c(`sB6G~GRUz>XP}V9S$KYy(k@e{6U7M@%<|1(VnW9V&_((HUx=d@0OxZxhRJoCOPeVm9c@1?xmGbWCvKJ6Uu)A+F?$l@ zO6_kydd7iEojU)38~|wrFnbaZsr}6cQwp;u8{2yqc;nEg1D!ac?vCA4Y;U#<*)ORB zz9^wGYqf(0ZxD}WZevK?L!%t)58!avSjaHxnFb7Swse-TaPHHZJmj)~vu3Tfeg19d zs&QBGfu~g>UH?IS%vvjBCCv_i<^NjPK_7Ov+5wNYFORbK(-S+0-^e*Uce;Fs92dJy zLv}iP_+I6ad_#LIqHlFp`+;&XmR?dv2350Wm~GPP-l%4F44Z&wPVlV0VG9(%N^bzj zE}g@6?95lqaoWzW_23q>iMT{E2n-X-W-eVH)FGfZ1+v zCfNy8(^HKAC?0e&^@R0uHL;8aoAF|G`?XfLQ3~%x#!#~4DVMMJIqYi87a*oNK7eK~ zpdb0i)gF*5HFRoTTcO-QTOTS{ESQjzryd$-Cl=5KnPTdp^yZ_gT{cPiXRTkraq4^#6NX@{F*T&LV>e)7#s{w*H|Oo5uY$m z=}#D)jA1Nf{jVQI@P?Sape`D@$tX4dh8>0)p+T-wfM% z2HV|+V_}PHx7F-@zZd!(FuJntG}i=AY2HXPTL+LM>2xDqV+S!ocq|`t9X&j!8|ECd&wHyA-jijKIW85v$9H>|dd#Vq?Pm zH%18Fq*IBoW^bQ^D|0^Y+j$Wbll_EU^*#-&c$sYT&r>%3g|~#ZkW}1YWX?|MGw$kV z_KT25Pp_46elo3}Y7c8lc4%T!y{!Z_@g&RXPOqKm#o5;=1QDDn!i~1jcmNzkHg|%xFX06UDZRpAY3E1>g)*D4iL4$Q-hvwqa1Vf z-E@Vn>Ba-ip4&`)`@_%_-D&!^Zg2P8%Ye$b#$f;%{!&;^Z3URu76==vf#zPJq6QWI zE&QEp4jt^ocrCx}GoyA#w-OyscK}NEbqx(3!&wH@`rOHCW-!C^8CPE^0zJR6q-V~M zy|w;DpF?$DjE#{_j?7dzHZ*#uMre9z%GN#6SMhpHJLk#T5xasilC;MCE=n`q#@^ZQ z(J(6LUa?MP{lOac#0X~?;xw=gK9@(~CN-uFd_oV{ZE%sF6HMdE**Da|M4#fmOOMfI z>KhQqTrE`;KE^a<>Ty@Ocey*&xNc={7v#h zU?-Zw?Xkh=bYR^zMQxHlTdSM+g?REk^edbN`vND|6c=2()oWv{`VuQQ3z=J-7fvDy z>=TJ~UMxQJ3{JrIsn4C;%TEo0tw}NC@(k#u@LHENPZ>{aG6V%SI-|ZPu>az?zr3D& zBu`+KwdOr+N1$X}PE}T!ku98J;IFe@)no;Z zR2$rL2mOsJF1MVaa94lV;HElW+q(}z=ch5M{~*u7coc7}4H#sJ^*y7tsf&=IzO7)~ zRkek;XN_4k`WwoRX#UOILWnGCN3Zm$vR!O_^}F`eMv9L@cv4u=9uP7X*|VSa>-V_k zTK6F1ZI*s%25dCi54OzhF6Fsiu3&1tN!<@sFP zJX$d|?aKSdg6L@=8>N4Z+ZUbg>W zvgRrnsNS#-@4ITHV>$n78yU|sx3(SBSgUp7euf`mtZ=2iKJuqNztlb8561&;ASmvXj`X81IuGiN^uk zi^cmqPyP?&;BoSL{*MH-pZzC(M{CoKT3qgdSuA)9LRF^uKa;$Pscff(Bz(qiI1uXJ za1b8+JZwBV>%o4%L2bX3_?OsPrMmK;tHpHo7iw?-8te$}iNS#2;g+w#GcJQiJ3Yp} zrjc!=Lp-k$V5%1|4O$s|>hn3$19xf3(h1*Zl1zXFw~dGB$hvXm_;qK#g&U!?DXGQgrU zWa+$b7=k7LH>&jBLYl$KBnwt1xNWWvG&kNTnrk>NhRjaBa3q2lqJ{O*>80&e96btn zZZvqt>JN}8s{eEd(4K}dJqO@N+outdVagER#J7~pd>U;pi<0Y4M~!2;57+b9TSUj; zWxmjHSZ+f+CrehJeUv9lecXj{bowfBS22IVuN15UGikj2;Ksap?K%;=$Hfa$15>)a zp_asz{IX?6%9dd~vZ%|68asSm)Nlgi zcU@h;o<^{g=qBMlsGOFMO^hMfWcUScFO8$we}{;%$;*B%is5FESr(1Ye2OkljGJ+h z7@f4A<8dRu71kpBi{+^zGh=u!3)eWAr2UlUFpQ(pt5E~1I^HH*GEtqwE~H`_9tl8J z{GPIcP;v3k)>h9U9a8>X{%~CghXlGHFZDahNCbI|FK9_RTP%~SmF!N18gT z8T*C9IKK@9jLiOrSRAkB8M3M~zb9l>OJv;)Ot4&A6Ru>RVtPt{{Hqdzk+hLdC*5?3xG0Q6XMdjvOQKE0lw&N+@TaAW6GVpd&`M!nS zLAqab##~{)G#MTIQx9uRyoP?g%I2+ib*z1M-FgY{i1ULEJX}AckD=3i5gq3`l`(=C zJv?28PGIOX8f5y=B1HmC(Tc3qEvXe z6&YVi@X-WKUXgAm2PXade+m;ISlcTclF3C{FU~+;V>H=ScH_21e9&wjw5V%8c5Zp^%p$ccvWCM{xGu8_d2sAm~zpEWUJ>D*AVbY9IYR;+MC ze7a_9m#t0$nDfAfb5_K8O4~xBgb%`u^r%z`EUz!|y`_(D80=-B zF7Ar5^0m}Ui-)IirfqujRedptwVYFKR;iIfWKL)05N|Kz6e^^$VwC=+9Hj`jUqHQb zN%%s3O^Vjqi54MRmPI(va6ekIO?ZRTiYSeXX*Qn!mo^F_%h#*pQ#W%wg~*m2L>_3@ zIOP5qYi$&+*=Hvx4}0xDA=l<)MLRrIkG9x9K0v7jnJJ)q3LGB=eV4QSC1DD{_llmK z0!m!|V5C*r>!|j2Ssid;tH3|y4B%qo<0aMJ^YPN#D75ukhy3};E2}2N&=fOVyY=?+oPxbXkrKp_eo41{`RR=9LX=j=&9N zz0Lzp%L08UKIB&?%eDq!RQ^R_41EwnhU$Bxw<9DD#fSWt&5sZ5UtYu;%T{S;-pcPG z<*>B_eqG=q&QAvCLSU*#x@};5;FJ7~P(yy94M}^=ytFs;)2I@>^PB~94RM_}fsZZp zzn%A>Q9|<@+u+M{-P@Nag2Oifc>Nh{K;`<*W6{BCKsVPq-=~-k=k;mxCX!dXUsz>4 zTdrXp$YsQ=*+s7PaaSEK4*08`Ur~toR-?0GtD0`1l+{oXq5&blpEo0i@{V=x?|D(= z3u&}p^aLf7K5yI4HcE+DOwEn3{NB8_6gZm z$)Rr4P|*1cgwMFEJPT|ZRL4Q5m0WfFl7%sY{^!>b=vH}>?35z?zLLlU6B6(LN7ZPfQSah{hoX7x#ygF z?zt*ndhU*;vH4h$uhra+xzB#$auVkt1A_W2*-scQB(}e7__{dH`6%jA#yBtB7sjgq zU00zoGTuyEX?+#Ynn|luQp?Hi)@7te=eLQwgw60ly-3>s1r)mKM{Wbb^&ZC<4kzvZ zR@`${gX3&T|6l3cKsXiPBDkX@?6U{}kroNoaV={Rnf;Go%>mJcuzrh=htk-wSC6+D zsW2I7;KsMv)kkdCrUwg^ceUGA_+WR39+mDDdMv4CXsB!5=h?@ge_Y9jI+4@6NCT9; zz%i+WVz|od3y<_s#Vi)Cy86Ozay)!~9&SC-SE&tewZ6BX2C!q^N|1pE%v|m>s@A%M zdE}moSaa0e_|bYBPJ4?8wbwtAj(`AtVwVF;jMgiP{CxatIgi>rJDGI!+$Y-#$aHqI zmOE(4>v{U}Qa$Rw^62?T@@Q_y{D$gCs|c%-lb=Ta-e&#IehW&pf5#uWM*BTauFxII z9^yrO=@WrUJXbCC6k>EeJ<1TQtik%~qB@{xxZ(PV<>83aUB@FDq53t?3KXhzUqD}& z(>wJT>~{2+>0ZUdmc5FxB~I^I!lx}JSX8w?YNbb!WEYvkrnmm_I$%>&$)0Ps+S7+i z5%<)qzbY<<)y&KzVx;#$^E(s%?Q&VMV^2(*=OK1-)U zDqXD%XqIhQH(?!P!311Nae1V{c#|&KQJ((DYUG$|E63kYGHe2M*{;cal>rsQftQK3!+B`MShg%KTvwM}~dn@Z@UZusB^Rd?=3$qwM zLcbwXucqzBbG!9QW$jS*XtdT;aRV`4@RCqzeOxQ?&15H6o(3y^3#qjJp@^;2^RWAR zVM*t;ss=Ula2{)1p5-n%o|2x8CfdKG{RbA)?ig$Ed%@T6aQG4V zOGq_+wv(%KD2w}Rm83=zuGZ$};5u(C_SrqClQNJ;>s7))DwIAatlQyt1&fX!|FW=D^ia2ajGas*|FmDlzIk|u^@q#n)si)uac@>j zQ4Ltg03qD7s>lzbipjRA_3a^RXVMXD;!aTW(zp$j>(!iFpIkDrr0_L!QK1}}TspB- zF7=kWt(qzH>iOP) zk77zqjyE4SF>ZT8+A15&J{b4IN`N*mbaz-dC9CtMwnb-n7b`QfG4DE?WH0dkQRFso z$RgejG{-5Mxg<72r|9 zMH{n^N=LArKQq}uxJ9wkku%vWuajKATBK_~7lvn&L)lk69q3IxBr_PRhePo@6y$fp z&1}!E$+I0ZL`8xvaCnuT*ESpG2^@=G9ir9xM%|xBINAs2) zLTfezl8h;dy8Sg~=EOtOA1TjF_TvsFp|SOo%bKT6EHlP_l1y6d2-dI_GCnzNEFEnC7lQ!l} zqWBS$Hb|Q%S6F0U`m4NmFI8&m1Q=n*u$69Wkhe{aMiuh&;9T6m&!#+JznYdY@n<$oNp#v*aYp(!}$y!Cez!f`)tA$@ATTk?;{+$f}&ofznyRK93SI( za7-_nek<>$O96Bu+pQn5j>h?;4Zsv{xx?9KAyhE|i?}UjOF(I-M%g`z4fE3C*_!C| z|8s<<4>u_^pSf9sftXz$so!TvP^OVlNoe?}b;NnuX=%`hNb2|Z=>D%0Px7l+#TOl! zx8Dl|!zt#V*w*YLY8frI1?i)FWJe1XP%hi51>>xB8U;__;za4f6s%c-xq+;~M~Pv( z!gZ9; zOmJ=E`&72aJ+2`q>b2&%u@3XiqB_!}h3wIILKUo}Y08NWgyK0o;*DV8!qmdDvXzF0mwRcW-?x{9+G;N*BKFIQsJCZc>ABOyWYDjAzIO6tZ2Bx%>WOtIh{bLv|@hm^#DH14!%d`3Z z55C*WRVOH8R4AL~3(LM$xb>Lfl^w!HcA0=(8On|`pcAt~iB!lxu`~=mG>s2{)j3M& zF1$w85`zqFt7pHVjt$H-Y%{Wlc()t!VAPCGFpy$ z7!a+z6xh8t!mfYrk2H^P^BbJi)Xe;5b`(z;8{y5s5v|T(HT0z>83uxp?zG`&7)2I{ zyNA1$p$WXz3r|X>pHSOQEbLXPf&JI;KF4D0uvHlI=nG=41^P=@MpL=?m$dIb~)(jSz*I z?E6HibZ&CYM}CscadD({TC+%AceaP2Sv=M_Rm#gyTbo&}Y$X-7 z#_&I}<{p)$@@@A%WQJq57^pF&#Q=l1CQLj0hwaq|J7Wr=4;S#u`2f*1=@8#<_+ayG z&t++>`RJjzDAj#nL~PJ99?5(zMrE`yJLyYSoS4$p861_GQZe#(lr5P=zH3p1GHV1A zCSi$w%9XB5emyLG`_-Um#gEp%vG;moF&UVn(yK{k{($;ZF#<7M%@0K*)}m7dV>`5i z`)#t*dFEI`Bt3e%^XB#RIPeT*o(&v0ZOdPKJLyLowXReUjiOkPuPfC9+^B%jm4<}l zJ{sRlOh{L%1gGZ>-?VYN`$y5vJ9=<;*BO2=xHj9US>yA~ZVsS}*o6^y!r>FqbJTs? z+sqt{7kL8Ze$dM8NCn{21F`^}h>VCYT@rtG%?{AYXYuChf_X#+XPUk%SDLw)pIAvF z&5+x`i90>;$egYX;vqbQ52;RMvIRuDI(I#hOsz9mghX@&B$0rgC_jkAQWz=Lv$ry$ zn$cPp4i1fab_)Sxtavh>$&Lb~amp)!xhWf}rMn2Go<8ekNi2(58LBnLOi{qLi`^Q= zcs3PSa&(pRDo2I$U!BwWsql`E`MdU%HHIHnzu5)T0C~e8h2YW=GlSM*qSWP>!nQKZ zP(eN=OxojoKu^|l+k&1B)AFXf>7D5?sZTsoFMij~T&I@DYfel3_z@qEo@6-MT-PwU zP@|v?pMC9^q`st`ADQ0(t01^A7ye-pD@aqufdpWI&(9@c%Omo03f1ry>ij5m_7qxf z!6oszd$Z<1rTaEL+WSIyyEpL)?ycp0q%77ZT zo}#2}8e5M^PDcf!o;=y2VcO9CSeOeX)MGXGgc6fpiyEvL>6KpU`D3%RHEdAF%iVfb zT)|z2)Ei0VCq~pPkRs|LdJB%izp@v$9wpSgwx%`C1zTloQ#k$%(ehyaz$O2_jo*I! z^iSd9CnbY%;HFrY6wYVRdIkSq$hq>VnGkuW#>((0M;Y7l_I?e`p&XILo4O`SBQVts zrHsvCrE2&Z)pS#+Fjmht(EXu&F)$aSP`ljt#J)L1vnD&lU@6n)nfN}(6@jE&PsHq! zdUjw@j`1DC6T|Ea*H?MsIa~>bAtM1+)n=rbXy0NhrBbg^(TA!URwzw_x=n)(bKeCX zFsc#AL&o?{a{gH$_x5`b*Gl-l-GLKvBM)vvi6#bZ18>52^NM{u>zwNi!~6-x1xueI zcdZ4I`o5cwcN~yc>j3LM)O(gb6tDn@D{>%`xUYvc zW=5BR!?s5_Yh!$t;8M0ybgNA?&`+NkcX9_}tI?WO%}5-o_Jr@c#hi-7VTE8mfJdGgU7ClJ+lI zGrAujD(-vSq1W_o#+TU2jyZIU-FGM~>F8n0Lid(ZfYe0YTlpgbEgtUgDEH%niRZ{B z>5d#x$Sxd^cSHJ8DM{FiMVcCJg+n-4d^N3Tf03=>?rka>osFLD2Nm*8g}{Va$j=q> zE`@XyUR(DgY0k1A5lnrG$b)|2K}t0~;8EjrrqX@4a#y?W(Ie^T%bg^=*8>#Z{yzQh zzE1%&-P?HxZd#j9=K0q?-sv?yOh-Y*+^x$)s~}kZ+PBq$9O9u3n{$oGnW;?4?xL0> zqhVwXt+V%;FfEzW-ZzKoCA_R=pZ5Y{KcTwY`)RqIJKknV(owt3Qwq0)u12`d_9q%x zyB#rgUrR%GKD3HEyjPPn_i<#=h*cuV^*+ZW7Q+R}9gS)|Iw-k8h4h#G^nlm%t2h$Q zavm?*eJo|+L_7T+<7wN$>FK;p4oy!EH}}D@_VA5H1ch%XrjRmpm}VHS+fa!Ka~x!q zf2)ok|I5iaLV0U9x{E9e;5t(4-|WQ1U~37ellx^cDkY0(y2QCanzlBz9O*k)#NkH= zTU$!Wt(xWZQTRSlOK-EL%>6{eLDFqXdIJrJaNKr_M{vV{d81kBp2h5P)Qkg?c6(Cf zY}JUvBJ_Ov-2p!y)!IgT2XCGj!AUKDeM9TDf-Mv|O2j$*V>@heq^~sibKVJIo7I5S z;#u+beGiZ9H8cUq_FzJa6t(te^C$_nw9X0!UD?mE;^>oZKe+SvfA|B3Qa+(M4^oQG ziQ10u6IR2Ea&NKQvVGF$w2;EP^)skS`!%%7xmTr=-WwXOxvw$C)u052p539)9egIf znq5auxNTOi;pXzn+I4PphlTcb;J(2(zs0A|lIK$k>waXxOJcWB$t|Y^NUKeA^((!$ zXin3Abi)w7q@x+l!14(OOxpxcI-2d-gHHE4%8;Qn9PZKKc^WbYwU~oyIb(!{P9s!usXwxE) znLn6C$KAzJ)v&XU_pdzAOuL7T6b01lrYA{;>*T) zH!rG7ac^&~9RNT8DGBSt#V>Qc$|-`^8|iZaG+%#*p?-JMFUIc+j4c3oxdA5WXxa9& zX@9Rbwi!5^7FX#iY3#V0F(%!6l`}@wi0Xb(0kzJzcy#~PBUPMjuy*fJK>Hy2-TfPn zQ%LJ{0qPABAwN?Jy`TvFY$^0vMd;^Bq0cWuKd;b^Rn$?w>`mJ9%R^Lte~8k1NLb*i z?CpXENFe)G+2hzea9?GMg`r8RbpMXhgg2sb2l2ee>CsmRW~8BFlArXIa$1QUk4Acm zJ>_s(y5rB2=Wmn;qW&uYW|&~$ zq6j%G$~D)9k;g^8<(fD2_?ByKcfLi2-_|7Cp-s|PsdDm*KEIk0J|mcLonXcH&<2}N zWPv?H?4ihva{4-F($Q$cWTUu?FMZG2&~UrPb@X_wHe`M*O!tHx#jtvrGtm@l(us1t zc`vG^{Du_u481FhV|e5RIV~Lxm+o+JLv8;ybL_J|o<6H|g15BWQEMI>72?v+Xk9OE zz>un!T?|{k*+~L@#A7HFz0(ky)?00W^8GkPd?Xj#^-)q210tK!UsdJ%0X1Z+Wo(Dz zSrD}VYV254>B`0LQPg5rE;0fO3P3qG^nWM-`;bFtx^ z$##|Jt*Axz{9Xu5;XeyFS1U-quN-?id`czK53F-1kf3dzFCl(*sXmP~=+pQ?!D|+N zE{0F2)Z%NczLJib0CpU292ERez4;fuW+h=|IIGy_e04bBBR>AxO+4T~d$=H(;6hXD zd21`#wUn$&$BZheF%XC~67MX)TH*E9@@jKD6^(KJYakqbjN_j0O*H*;PIE*k*f%$R zrAe7a4~A!SaNPEx2j^ZxA#oaw=F_OO;Z|ywFi$h066T*;%$2oU+Ltn7V?(X$MSZvP zzJaYvv74oJPQJJ;??f0%(szQho^pC5aCwpQawuh$|5_076tu*?djPZJuJ)?bM(OQ-mm(&h;KX(n0;O_YuoysbhM^XHZmx}O;X!+ zr;zV@T5hWysGxPt6F|;uyFQu6Ln&*!K9+xZidoF3eSIyFZZG%lJZ1OGydhX@RQ|j2 zP|pu>ow59O+|8G24VKo~aw9*UXR{Sp1$`n9DHZf3!lZ;G`mg(=Q6kQCEthnt56gn)>*G}C9R1mB@eWqnfy6Dhyck=f57=NP=u??rbnmcFqRv3 zxsAgsrK!4DN&L1gWs%*?ZZ?KDNpBO)oBJC^j0Cn|*pz4f#woANq_~X~j{2<|K~AKg zF{YQHr5)w5LsO1#x)KXfbZqU~#)WzHlpt+VC1Y>XwkcFBJ|OR+`kiGF0QV3hjkW8x zGS37vBPOv4`%pmckxSfsE&B@SEzwFs?8$@b0zYP6IHB}ww$TlqH!}Bf!o*r@2&PA7 zqy&sh{~rO++#Qz7LF3!z6OHt}0vaVSC8ozF8moLIQ8Td}=4RREUOGzT(A+Uhz@#Gt zov0P?VFfzvPiYTUePcuGq@pP9Cb8CQ1+&tRL;<)slqc99^LkBds@AT}hxDDIH%2Vt zShy#wi9suz1XU&J_Q*W;Ts!tz+lSmt)sHekj zQBA!D0xg_Bk5a$r^jO%s;yNry6O>#|TW_whGp&W`=34f4UuBfaX?}UR>t7AqA7Ma! z>C-wOx_=SRXmgO>37Q#+A88(zn;Rgui!P_{5h^&N!GwXriGUg3;Zf*Aa$AGXE~edd z*|LLrQVt~yR5o$>k>43 z;_tJ3iDqSdRER4McR^@UN71TMT5M|hisH+i(;&x`yg+XdU&aC0SEa-*QqNSV7_%6Y z*z)hZXeF>hgnO;6+3f{N#U%NBf)n(cXnIUzp;_BB++3k7kG2 zDR_1i9zFse(wUmwTXsSWktmU!q!0OWI!&HHzCutvdyxEatg`O;p}k_D?c*{R&Umrg zr|2e9`CEH>9GTXK0N8FVWUYJkrbVVTuQx4Mt?Hq?X$5Jm(3_Tq)~w#NhO|!An-;m& zllAr~y**2BpVr%p^`@n)FqtoTaBjVp*w)SbnaQ4q=DI7n5Xrm!A)vQg(&eVUdj|8f zgm(+ZmG&K^GCj>HNqU2s^dMvXgB79q<#O3E;;E9JZs}C|yhCA3B&F@~dc%20!3_G+ z$g%HoQb!TdeKtbncYF`|k2{<t)!n+tGI8T3LJUiHaIl;X$2Ghy(0YC ze9aeM;B+;;J0|*W5vTutA0`a2|ik?gKFNeXc?+DdgH-788!*bsT8VGmaliRf=;mIsTe`oWz zntqB7NTSs4^yJ_i$~bYu`F`U4bfjHqNvqxtA!F=ox$@A{Pytrg6b|WV<+SU?h!Xqr^ei z_wfe$zN2L`?oPvOeat1?ZKHeVuDOqqE`Sx5f2MB~*XC&0#|uTqJJOG0B1FJf$ajj6e~BUgT!aYkxY(Y*K8c&Md=dJUsjqM1 zczAF32Dm;G*cDq%SS?OZrzv=#F_I`^6Q4FqCxf&Uz9O8l13$y|7v9*W?sCQ`()W)* z-`n^$;p_*>n_>};cRxy3(X++9%{Mekx`w^o{YdHBdGPZaAZxL2i2QjNY^~6htrFXA z2FVPa*e)@bW-LY8rd3$nx9D@~bq^xGY5RrNrK=emGui$$RjZN+S+>qTrn7xxpoSt_ zWgk_RGq%R@VOV7>Oc{Q-BHSYND0{`KyOABiYxZ3JbpMsy*sGlZkbv(TKasGD_~m=F z3fDS&BEN4g2**@13^E=#hw(|xw`iO8yuNDlI=zSP!XbQ-H77%L#HJGb7|2ngLa!@C z7qQ~>aB09uxBh@*!ew@rouRW6bmzJ^tpAkG)#{zhX}Oh^EPQ( zsaZ>KTHUaXBF3jb4Z9-yS&H49~_OjUQegu=8@Xr{iQK8 zjiN>7yt}ay<;msh%ODQ8p-gcbPTo%@@dPv|=e^Ci6O=dfkXXrU_g2XSyHv5?Rtr0Q z-bEea$hXe9vwfnz+KCfKJ8Icsj1}N1?M<#9_030g6EOjG$D#5#8i*A8{4V9l_rYz6XWe%#b16YT4^Ue7H-w{}lJAN0 zerecmTnrJGNJsre*l!8%k}*!9k54iBuuf~B`6y1mK+A_)`vaolQV=8}PUMa>v8LH; zZ^U;=Z}d~j{JP5Q6*+8M?jv)bCknyJY8dqi&V106h&#`Md1Klx_FlWW7jq)lfUn(X zv(vVt$EIWeElRX@ldDaYA4{&an{4YGVvuw+U|hMAp31b{&^)uTcB5yBlf1EDgBv$v z`QC7?{VCRX+Z5h&=lAnKXD32>W9~4i0P4lQulf!%lkc@IfYbl7;YvQq#joTU=ZugF zf7uz5F-X#}&uk4Jy4)TQxf0^*wSz}1^;gGx)uj+%em&rcGY(Pa8SC5AX9{r_rZ>wO zO&*m#6BD^N`wCb2^)4n^gx9w@@(J4e4PRfrEPT(g{S?Z}B-z2S$L2`9^Ng6 z_>?3&LVl*Fgi@K+xl56q&qCO{?{pi(qoS~Gh}8YL(yW(_E%+Z zeb)AT>1>3{pP$bc-rwZ&1(veXRT~Y@`}VQaMCe=G$I{oL`&fhFuUU`3Y49@iOiu$h zh5qu&igN93M8_E>2-@Z#5Nw^mT(phAky`7l{C(8u(pY;n$E^#5?`^qGj?E!M==`qs zT{+jokrVB;qS%75F&(>*yKbrkYk*dvdS+7IgpO?9Xxvzsf6Rt3G*KhFHfDV~$w;n| zH}#R~uWkPRxVV%+#|NjWM%?|)6HDAkt`R|A94eOo*C#ozy_o;kA%l;#4X21b$}`k{ zlTE@BsLTayX#;6#bK}HP+X>@rDdx0TL`w9qZf93Yr&K6k0ts!6(;(>7_?!QrD(&mKvaQDadI;+>8*y~wxm+*3a$}1$s)&s<`@LaXA zl72_jw6-~SeRzApUY8Acrl}a=Q*~4_mTVy+nPwvMcPg3u9vZ*AGp4L&M}VQ}Q#9XY zgI`gd5jK9X!;h0>Ul)z9rVXR;76sbo%qo7qukvh%um&>51Fs6U+^i*KW4{=2yBIyY3=0?@lA$?_qJUZfn z>!=B?V@P#^TDAqCMXA!O%*Hjx@G*i%(Fwh>HO?d)V>-uH=T1n)BY%f!WyUM|C^;cz z;WN3Cp zV`30JuQ>!+n_dU;M@JFimUrR_c_-@Vbk=V6#1c8s@Sr-=>HBOwJre~~D^@Gnx|mEx za~p~D$`li8E8MUu%UkvW0a_ver%3$G3|0xc#U}qqcBoz(VOb+RjJHxtN);2imB@v? z?2}Hk$-kI%(rYGtyhS9SUP19#$m8`am&ZZA<1bl7@R!nb}BWZuX!`tqk0i{A`j28IYF&f?V zmiBj*;^zxe+}}$xY(ZlVKexU&S zb~7i&rK-Wl%&FFy;-mYYN>S@9*ZZ&ieOm9o@%I_M|Chh7(EESueb;rYXx-o1>wXIT zonGBf%n;wfbjj$4SS>Qeb*}f`WxDK++SeD(nxpg$3bAm>ZNH|Re=wR**^HA& zm1W#Pa{#|nN=cWk0hTR0QUI}F`?j06^OI=UoZk+0f{2Q0Aq0sHQCd%RrqQAp)MGxz znwyF$OB^UWWN$= z7D(%I@6IsyA(wk|7{aUP1@*x&u7OLbz`~8s)fZ*ud1D&kQZJ3Z_Du7uzBKyUGmWsQ zSB}2+Oe5^-rP0@(X@qsXH2T^zjj*woMqi~gCpb+0r!S4ZN@=)5L~s-OS~)pPzU|>c zr5K)s{lPthRb02wUQ`V6-QjsL4|L;>d1=>lFvL_be*R7K0J}QX`TM+V8xwuGZ?$oa zj^_Dh(jv<%?J!}W3%H6H!k+xU>+%c_-eub1k}0u`>jZiK$@?%u-t;k==Wc3Dd^K#( z`{F3?WwRC^L1m*wWdtB&nfkh`&=~0sLi24$T~e2HM0Hx{BfhxXP_s2izbM{#AES<& zcE&_8{%S%?@eE0UkI1&_vq~&rFS;A?)cSK4{So`4E(uns3-b6<^K;wk3KIuiyuqW| zC7}r9fF9LuqQ_vjqKA!1t|8y{3d;2J7*NPX&tp8qph0k~q>euPP{tn=+_8c^R0lKQ z+C5w&T|SusD^LpZlNp}Yn^?CdO3|-+T%li8YrP6Ld>pjq>+f{-uUdZM;T0iH(mtH^ zwJW#*t4ffK=07`bh};!;1wM0S%7eDvl*lgQlGqtHhkv>hnu-c+oQE@@I*K=;KylG^ z)#B^afxR(dM?3Q1GIG(EJLV#TKEfu^_9Gdi`@CIo3?YyEhl-uQaI`d+E9ntp7fx1< zbJB}bqAfq!9n1K2b2nhS*ww^p(C0Bf29qsS7 zOB3IvW6bP5>1YK62(%N=Y`$}2F_e|n$(kL*ALh4Fcrzj#Ya*@61`(UIdUl+OkG9Sf z@`FW|iAr`niM*0YLC9Pw>pY2=OV)B&YJ=CXvpvMt@W$&sQzHJWPv}Y9SFALG ze=DWD=#LBhHw5jT`|X&|k*StT}wn4kt5qlVYuXAHa7K zw4xkh)aZ}SZ(6c|?g_+wXG$aoOP2nw+7$=aJZX(KSNG0K%T4J@GvdH7YGl52Vaz`- za-t6Pq;0}GAF?EDJSxYpYIp^R@-IGrMd_G*X63&RRqI<0z(wfJFB89Dy1-%k3x$lJ zvV2R(Cpfep1t^7_HaVqt91X4QtTbGW^=lfR*RwKUlu59MW=|B~gs905WP zMMF^y8tc$Rr50aUj3$7q2@=mQA3rcGtQCJF zeT>ucOl`wnHv17zlijsqidOs#ndW;M%ctRe#U$Y7)=;0txz?^RIUQgzt!*CGF5^+n~Y$mfyea;dmA20== zXia_Bv&yYG6*H%v`jm>cJ(nIAii%6cM$QRWMw&sSM7| zpV*5wfeAB^YQFq=c>F)QsGo%Y2{&BpKD?6fs^rvf=X;>=l>GnxLfVQ^&1aZ945V;Y zi`^4IMP$t!b!B(}U#Ou)9@Bl=7ub84-ybqlTMeDLm?g^_h*xeJzQzaFPP>=0 zI80Xvd45G1MH8qXcawcIb&0X*T?05f<{_qVHXCCBf2zQQT?O#zDL8CfCnVW6%Q0AH z&0%Db3ynRxb`sOrROd0G34R$5jhsi;njR) z{4+2A#xK{y>_JLj$btwkGQKWY zkkLlJKh#FSlNA0|$A)|`%gs$K$oXd1Fa`zK303bxDdli<6qZ^#@!Jf{^J~sH-u%k zh6^=bvhBDR_&y+biG^d&xf=#sZ-%jQ+%y3yJ5U_D9L5q44_scctIZ9x%c+4eZj zweF$}KZ9Vob7w`A!1W7u!6mOHFGXSQL|PInSwbTopa8FVL5*|2VTfa;Y@FvlfV_DJ z-W2|m{ZkDv2RGz_156vhk8X=9vB-)cIW)Vc|Mw-{Cj+f-*5TpEYqAME{a}Llrkr^Cn4wdLLTst-Mx@+ zc*t$Nkh?wP-d>2d^Jvn!APr;d@ENDz;lqmtHy;@jxRjRW$<~oPFHa4_0^F2JH~zZH#I z43R+k;|~|kyX~Fy_Rr=goss@2{5||edEp}GB3!iPRfPY*Xh$xaAjTaV$-<5!u`o2c5nC&ZD zq@Kk^Jnu3UR?K>N+t7wj%i75j`gs7js=c(=(5=eXhxrcr~hOs2tC1fVK( z)Iaj{Dx{oVC0lw$xH^9y%Q?cFP@nA|XCnr)nx-lEwZ)$EXeyFy+TWRA*^Is3heout zW0w6(;GZ^85MvTUbv1pS3spH-G_Znto+}sgy+l z+NY8>8&(Dn$oy!Tt{OBgCJM}Kkmx)o921v-5;$UcvT84G8_IjdSoKrGNw%aHxA_3Y zG?XXIFK3-b>$n8FJ|1<1dmd!XMN;|JJdotetcs2e92dlhf6MOEkS5ubm6Q{_j{2Rq zP)9cec%A1I0~e{P^&5`>)3v01h)P=Sr7KCqv~|Ct1KZQT@1G^f3^@)f%utePv0mNNwAh#0!=~$Lhu*BUd)bF6 z=i(F?xwLVkH^Y@uEG?5zztciE2>NQDru^up}4Ovk#HLKEcqAnp7%=6i0htJ^LnV5Amb&aX=Ew zf=uB7UW0j4@=Xb=E8h)J+HGe_@3YK2#R*Y*d&fy!wM!$uvpl#ZK}XB(wd3a(?18 zc7Mv5&M-vf+)~mxfUl&Zu#9zEW25){aFKr%SJAD9Aiu#5t%z49Nkm>5K>&qEwgSR(20e}K4 zI(-<*E#J`sz&@V4!eMu~ZvCNT?Iq@QpsTb=H2>)uB--1^+0_(?CKrM$T#5D5Ox1#B z=pzML&7X}#+x~P%ZB(%s~RHZ3!AvugW+EKbGQrW)>c z&Qv9})@KU_9yaXkh&2C8p0DhgXJ-H-wrfb-zfpW2%+Q(+W67qqxMp(Hf_89yar)Rl z(v&|T-&c!!2TNTbUt)Z%;r(KbTQa!z65G@=gfF~y1;U3H3$HARy{WW*Sco^3BJ7}{ zT;!?XW7oP}Dak=51Dp&T;yl#ofb7(Lq|i)b=Hr`wQ91=?CVYhj=S zFm+yVX*lS}z@5~={Z8ffO!$kcrvAZ>IqMdvL>|c^R2lx=X>Lam?SG{@R`eBAQ92%B zUeWA~5GMuNpJ5q{ht9m-fiON1RzRl*PKi5$oWrWNUyOEer&&lnjd9&QOZh(jzU~?S zp01NdP3$n^Bm)Bcuc|$((sQ6d>En&WDb{&7t(O*`KB0)o*BrCYSe}$JqyX!(uJRlLhc|`PdM_F@(Y8F~BfF8|QhW%`0Nx zhcMDy7kzJ67seeO`*!FMM_(64u8SQUVmEnVTy=(JSx1x#|MW-GyX62zJaevd z$npCs;rF|sXghPuV&P}i&H)|*P?GdwdI`R)xb9U<3secMd1xh06k7W>_3R$bY+xDD zBYhzdZ66B+T>L$Pu*gd>mz_U!TmD^C8`tbU8CW@Dcw%?%nEg@g?Qsz#haBbb-h8mb zcJo0F$IWXUS?pKA_T*W#>s2Dkt|V-%6H)a!bY)?aAKG&c<-HQfr?Bh(?;@yAp1il4y02eTO=?{+0>Wkq!={SE8H$Ve_`5VCUah zxOL{YcjV!BsKeuFE9DAy3<=y8r#n{X0*_tEzH^I=}k)TO7 z_Fm8KC3u{@u7Zc|o}<_4?uGuiNRM52sJy4?)%gvv8OQ50>FD9crza?&qrY)Km{@(a zexjA%+~A$BBr){YMd*`Cp%=&jhNXRSDYS7!9{Lo8TCv=x&U3>yK zb^;yRzhKq8R z>@Dqc4|_`$(}Tw^yrY}d+UR4_c?_Wi z4e8luDtOn!`D0AL=4GC6*CX-}EmT&towrL^AO2HyYP=pv8mtpf)uW@qbF)Mi+Rh)h zNj$}JSoV(I%_I>uh?is`GDjT6_DRK-jd3uODFwMDV%=NPu$BlLRk9l)o~D|-U^hZM zT>{BSKWl|`+!b`SnN%(#k|Ao_2-EH>yFW7cr zfp4#?*xb9Aj0MhYpnz!Gs7XuOR=9g!QUfO4pzKFa%6LK68ZpL)s3==Hf zM-lC`I(2YHd7|f{+bEJ^No<>YYSri2g+b) za7_!srl+&>6?(t;z=)_1qaZ`wydW-WSkX1IA5$Egr|3SFH#u335p#J&o|WCw8Os`d zx~UXZ^mv|m8d;LQ)CVd33!Wq4{&xay4ubko==3Fue2Bv~L)n>_ZEha%mfP z6fNyBx8?h-pAO%7)4;?TC}!}KH8A_D0c}z9pYZn#JWjTo_Wt{U=nC1!QBz0O4MZ6k~(`F=}KDwk(ZYsv-#^FtmdJ8ly-OLZdS7!JFcL&V+;r- zc%@reaKv&9WyeQe-m>Dq&t_w54eNcw&Yt>K^aF?((wg;3IC!F50;6Kcp~h$;h=&=< zKobl;HNRr9TPSvDk7DUthYqeEbxNX^YZx0R2P7H$|Ww>QAz4bgF zZ^8I?r1>wW?H#RIN%jE;S=m?_{`3E0tZaNiG*&)J17xPhm0dP#ZCN?2~0{ zfO;_ex8O2^&wk!Dd9|+OKKrNG0o1gT`m+}9-$0T*o%MU<+z^rV)=6RqU+vO^Wy4{3 zeIMInlvFg_6~USN7B$rkmHN^O$%K3LeLcfFP~4_Qg-v^0cdwr+eRiok-p7-H$d}pD zs2y9P;v$2JL{}W(%yjD~*}#?nD!^zItIJaTbif!?`=%QrY1>6vkJEDM*mncC3W5;7&(d6m5J%40oSM zL1yDMy!N>EI!)`je_uEbm{8#w&<9@Zpp)#Pxtdr*az}dqU;FSh`c1_(XWnf?ileZk`%~uhg6J)W>X=Q;S2H z*bC{sfU=ghc^52~HF!?u7I7;3p4Z&Z)X;|e+VgRaz9`&dML|ipF``k1|9-Yq&waqN zU#f;bBO;+1`7Drd&&~_86{|xL3pT;yIlfmgDh5{N+ZHPAW#A>_Y-^6n=MHEVf^)})3_s;N z*z$o=%?(^4WY3w=fZGrZ2b}4wrEey-k^MV=IVU@(tA*jCYT3IX=9Bd>e=ghWuvOQi zu%5&SO9gT+Lko_^L@hZqLh-|>N@lJDPX;EJO)Q%xl`!n)iDd>tyPKoYegm4!o%i3u z|{(2p4^3NVMR*CTCF}AC;DmtnL1ggB{jM9&++8Ad|1qS2&Fpvw4=p^$= z6qcBJHye%{go@+X9f17_yDytiIzd5mKl7q6ZgBCWQ`KR5x!RkO0ENY1Nd zCo%6trg0fQE)X0qS3cfbrk0yMLAI!h~6AyP3bM|*y8z@um zOU9ZP44Ly1_A>H0WSrRHd!h@g-*jaUY$i+5=*Vw z1j(bs;-&fDD7(DC%ABum2=nSCX-(J`6ZQpUmty0-bhm)#H_2esgmER_w0Q4aRO#pX zV*a=~?3`c*<KZ z>QV-l%F=%p>>L=5hR1eZE*8ZT=DAOsYI7B0p?umPP}b5{Qb|lXKL_cFn?Kx_y_f~( z%;-FxaGcn@7S6ivE3R#`nCunrua4U*E5c*`%q>E(!+pj53^)sqNeoSL=Otu?<{idj zWlKn}C7i0N`8vYL_LkzA5jhPXZGKn>@9MH|K_kI@`-8*%Pf{>Ou2%-_XV4}o@XTB7 z$aMXo#7yAxiCOYg%fdX}`UqsLp5nHB*hKA{S?ZR<)VABOO*@^is?=u#znSy~QS>nX z!^l zbzbvbbB;)2w?93?hB?C#_sa*u;YWlTl~DFz;HLX9ptAjJqZd6gH7e6`<8v+vRwv}x z#;;HZ=kbkTXFnLVi z62$RFhU5Y*2cfyT7paUf@7#$168(~Z85PHQ2e*A%xMKQTga(f;DRY-K+Y`%jXJkkRxviIY zyGdk>801=n&^%f9x5~h*)L$sV!3usK!F}$OY=kGg5ao%5&>X6?RZ6w&W|dk-ahAG4 z42USxBaXl|qJyEb%x=l14O$Z9T_KijFh@iV=Sc+gJ#c3wIilzlQ3GCGcylB$vC*;R zEWW=J5{i&euSq5-q0>{9XJQ0bYjLbhaiuX?4D$Iob&W_FSyBIVj{cG(0+Py;~Wd?wPeZKie zn2i1KN5`8`KpbEH5I?+VA_KED!?Q+h76?(XUW+QgnYuOSl{6=Nj15b9xVKeh6u9_^ zYlw{K)ZGOVvWa;i?p_Q4jZsmX4<(s9C*DEnYlp9W9rVgPD@=|zCdNxMwGk((2?{-5 zN(CX)5e3OE(GoW4sGb}XwU?pYG7rtZts~CHYReCk{_Wy-7Qe6Xdptk)SrEbx!QU72 z{Y==gDW3W#&g^{n&I)npt@^@YXK_0c!^=x)8jcz zw&}u0v-{^hbp38zIhK;E%kFkX)yyI2=E_uau#JnYTIfDg!AVE4=1;WSEd|JxTX&ZN z+NZ#Pbf2Zyj{a8Di|NsZr2R;RBNCA0m+J5H?e$cJUSX;Aw@7W_&$Dp-Ey7Pz`ke}2 z)jnPCSLr?JsP1-)N!Wdk0y_HJGhVRR-!gx?nI~6t>*Fv?ZlQ2_DfG)l=yOYRr^l1QU zxOT--6dALVwH+r>dkc{v?+F1288eI2b;IPeBF~ZE2jz%zh6p$Znu3wgrDv#s$WGIG%AHdfO-bdAo23SHdws1L)C?^wZQpS@vW z26<7`m^X?vTVUB-Wcq(S*RA5~bCJ}!d6;iZJz>qQ@y1oqtZiF;nOXG2uht8ahxOsy zZa5H|7RWR2H-#=Snz=5JhGOQtlUYN| zL536{T67NJ*F@)2OW$Tw>r}nI-CmE@>rM80m|kzT*MlO=-(2X87uMSz5xA3%Xig=? zYAgD@%=gEh{hY8-a1`ubM)kka9H-|ZIhB>!1k(l}A+4K4Yk-?@_#77N{=kq}y~TihRoKN&3uY21 z1WjWv1q{sDC0<=pF2$$7JJA}fay7nmPAKpPxra&xM-AoR3eTHOQZ=zFE4}N}3hj*v zzA@bh>4Y@fR!EySKRX)1__G4|5`S{=$6deteshHU-oQaCbGSbAhcK(Lm#*i00Mrm% zT?rv4Wa|Wi+XVtX_AB54qj(@6TrJmJ))=}Gf?jt(1zqws)X<4Z)4+XyVZEwHDE{a2 z!C2WLt-tEojUK~GSdc;KPg1*tlX=_{>INfGLoo!igc{vaC_!tKY#|}5L?VR^`=IF* zhtyA9+)Cd>0%60oc~XI`oBOq436`Ai?2pvldOmuX#jY@xXQZ|w{T?VWT5rjEzTpml zlFqXkXBGpt)T)qGtq-gMXR$1#x0T9-ot>z5m3HnGs#DiQ2yAghc`WIHqndW7j;NMP z8(h4!K`-qQR$4s3>aB?dePZs1RKzS1tCF(rYrCq_N{-Y)(&vjyLLd22+Ne#dWs*Pf z9-ZDnK)C;Q<-`=VlHn)=@+gT93B7Jc=m637q$41&R$AD89c!6f+I$!S$jy4iRHY-f zX=2DuQ01UU4`|DBg3H#S_6MmheTLDg!k@Ov{WxNX`P0@%$)C2YZWoM|XhhM?KclEv z)3yO7kFH;OkNU_R9&AAjr%GS~kqUk$4IlR9e7t!CZmzYQqYaGXI1;%*gCIV!oj2@= z#mm16-`FbdQ#9IqV|$|u-`I1nv<8YOS9fftt?8v2jZr5b?3CoYfQV4jInkJKeV7RP z~qFzx0?w0gtecIVl4&{u#+u} zxr9^g`MJQxz^eTRmiZdn7&!Q-fnkGc*gkOjM{*xE2PCIlmiwrwhNDT)w|->fEFU91 zqA!2szP-6{smO`G)LaF9;(SJ2n`-8}d)Vf!;YxZL@EV?j<&@6sar7A`sFHn1xEki! zpiSUS40G`ZL2S66+Yhv7&;fge4l-}kwtQ{wL?Y^)7ilQ6HV#cJ3UW|a2Fm=fmpNW4 z^Zp+b73T4&P|rC>%f;1I_MLuzx!Mutm&$nTVraxrvHV+Wm_CvISUwi_==c7=dX^k` z94dysF;nmCriC{%A5AIBj`OhhugTe|cL|@X%~PZtejw8ZQKIY#B(j#>&h?ee0|D_937H)!;Ahhv7;f9eRz6Tf&r;ju z`q5QkbVHaC-r$ivjP4BM{(gPf?*n0}#ddd71$>_Tdb8;gJ`~1 z4rzT{qn5$uuL(=7;&ZE>dee;Vfzy1UfIIqD7i?-n0xo}HiY&ACT6r8R*eeV@<~RxOteK25Kp zZHLgWW*XT1V!m8FfLxeR1T(k!=D6Lc_ugq-&}=_V@mllDxYLM5?M3RNv=^DL4f}^R$M}3m5MVCenIAQ}Da_oJhrd2t81LrR z9G7eXCNt(63s%kq3FiZi2^=4A9=sAou!_k_+@=d>cdvhN@5^~+8lcU${rQ1hp?OGu zk=5s+6sY5c3^}tBZE^+p^QdoE( z!Rv1BnCf$|n;UYj*ve#@iz_Z`&Wtm*1|X;}^d|zLYBK*E;Xegx^l=b6@(C zv*`}lLe!@Nt99dEPZElv)oMw9p?SpuDbEJHd7&rjYoCwVvL5kdlKg2ho)gt*aIjFk z<1nJGVq+krZ##}&F0*kk>tQxY#4Of~PaKI>U#KqFk!zpJ(#*z(#n;pAFh+QSs;1wk zQyb8o4Tc|37CP@jPmI>=#T3Sgj~D7O*cEF53DJXV?es8B^6K-_%UN4mH|>L7_-fv| zS1Vyhf4KngF9^;JT2T<7MspiQUMx#?16e>(;+S<1Jm&21Dlb!8GHQeCV?V^oc*U+l zTSJDUMAG^b>`;R2c$K~{5=*VMiN7Xuwc((LyHeq~&R=pK`YWX>1|2WEpdtwbz z`GRcgY)W)+8TgD}8LqT0D1xWgjyi}h&HGa8urpMh-hSA)zpYcJwm<1IF;=YDL=Ee7t%G6%=g6F?9bP}?Rzk+h2?%%l zoyXsxUTiVIXAdk@>JVNwu>8#)uC?Yy zLZ&qKaR7wSHUP{bjZ4i2f+=GNCPu05UHSpAk`vkd&S;Alca|Nm4JD|Dg-GS>es$x$ z(PM?z4DCZ%8Y!uV(r4OaELBwSNIG|`_3L1*iB3`G3I+icL*?dZHVZu%-s!Y?LHdsu z%labe#lIXt`JA_44(KfTUo#1rJk{tUA4aK`~GbS9+mW~U{Z`0-P%fCY!W8I+KugxA#)A`ZTNXaO3glCa|TKVlF0O=c~MHp>vaOW7zw$={jiaTiFM96mXZzygh$JwmdCusNA z7V#&Y?0P9Z^807gFGz6oinZP*sNWAi(S2YDhXlJBqaPK+7DJHXn%|i7Lhfp8@8-`) zw3DeI>7dGu>F+T}+fLF5LRl^2fF>dVG)Uw|Oem_WtqlX95lIV^<2mV(3{ywBw5O5X zMM3Ga42Q5PZ+;Y(SEF_%c1@a~CaYN6hr+o}^>GsnAyr|e+L8~~)eM(YAa9zarOyiH zn()2y@XIa&#?{bC_7PS6GpuMjPXsON`4xAjixMHVvZ-n}-kh=~X5Td*fdf+VmQ2QR8q&OSZlYsR0Zqfq`tM7q;d*BjX8Xj;7w3#;Cap#0IOCWpYzLNCu_wC zugPG|(S=6s&#Dyx4NfoUQx??UGOTXvbFUOP@$1%3rpste2W>@K?_K-e0x{xRFLNutoK02Jf<2W7;Mp?YxQ(oj4K<; zNJ$kkMOG1)+2RFdR=IEqNST+R;Swu7e|G!rls!^jTKBiM%Ka=CA)GZ4}HsZ-|#)rB-95E*p%yQZy8ws z#r*w01`c2Ex?6cuKIdNsTB6$_oRf@Rl&sdfoHPl;eJ|VXL4ORM@8dLGzWOyqGQXo; zbEJ1C-l%U_kGUxu=6nwPCER|uBnSQw%B#}d=|mXnVa#N=-z^c-u8#&WG|V^LOBcV7 zHy@6M{tWm7pu!QA@$t? zI0yrb>FvIvC>^^Z-=$ee`vT2n&GsB#+C%Z(kBR2$i3#8Rs1vJ1SX|Y!3(2w}5LNW} z+caUK*W-!2$0lYqvV*DIlybI?YvQ$Dmy2bSL&oT`t#UO`8upKdi!!)+lyGPj52eqc zCwU!MPuS>sWOflP%I?`U&wCY8)neB@-j< zD_|TZN4T>d2m0}TJcSqhW~@TlP4ZE@_smX)L+CavNnhsnn>6CwHcE#N(^yV$I!7I} zKBR*pWL^Q=A=V>~6iz~j>giXkf3^55O}Jm68=e@86Aq@RQQYN+X5{$yX-=WB;HNou zF~2E(`ls-h@MGGAuk$O1OIS2Vejg2~Lcm;gWP zF#+oTyj3bc`=rJuFB7-;DAXf0RtCT;E=O~uaqiwqK!KyY(jk1o4Zz|G?h!If|YrAhHECPjXGaA^Gx^L%V*&th)) z--`KWshBtp1L5dnTuun#+_3p2{;qx?kp?&)jf1ZkRc_&^+KM4jMVK;DH@oFs&&wQG42M(C&e!J4!^7X}@26`&(0P?g_ce@B*tCnm&|7cFTo|uLv2{x_ zmHwj*99Sd&guCeUe!#B8lE0q(N$aGeaAx&1n$vxwzIR>1>qC>>x9B5j|AaF5daHl^ z(!buOuNBw57Bc9A+TtW=+yoi$LZl@ zJq~))-y4leI%?6#{J4k!VtT!iKBS2I0z1FXmsi5_6)uOXoNFoP04rxCSwFUHAeK{U zT}$mYI3_$V4Hn=48i(E{9kph1Pv`>7qM%0yHZfS3 zuiQH|I={?>Fr}*x#Xb8(eF2j^&HLSt%$xht=xfs! z#E&>AmcDckUi3-C5~dUyD7nB-c0Jw4(E|Q>9u24Gd4}h)02`~p@L^zlU=HKa0>(+_ zMsl%)FiyF=ycNbYzwuckxw$gkgsA8>`!h-otNlZkw|V%b3QsTNudIEx^W1ScWUp(u zIn#X;d6NXIJmF^R^+MGe_|#S9-h}Kj6iE>Hag9bF()4iVtvB^>M!2_rG2ByC{|DSV zg>p9J<&2bYIKqWhj>GiR-U960$Iu3B z^tk6^?UUCYET{Iv{-H``DGi3p2xI+zZ{C< zFA!k-QwoMdTDdLM_AwtfydM{8N1I<8-qF7u!~2%@vngixbNEweHMkNv(n_MGe7FsHay@0vFc(3kWeb z)H(nkhHjNMS*>9U&_0y~Ci@L5k{YW@y!pSk5RA+ahe6XI|9;2u)W6P;XPWbH>R?ym489m@3XR}7b|;`U={7u*zkRi*{Rrj^eWykSTk>dN@C{fzi~VZ<8;SDEmG!49~sFW$AZXCAnxe zf224kE3c1zQr;T=JvFn+qrdI`J2 z>#p#%NTtBNjzxA9myI(#baScts*@8%SMd3e zSdz43Fk#O1V)Ll06b1KRj-ofxXQ>O*GhtA4+}_uOL8tG8<6F%8wJ9t=Hh(`kEI&W* z<3LC^x-UP7d!eiTp!EhFNTvHBUW+p(EXl$@MMwJLXOa%}aHZ`F|FrXSA6^*l`)-|& z^ujCQz4YWTE2m* z<|)yy*yR==ZA#>q-^d8iudhLkYBa2t{Qv~aH>D_@EvX5v%(3zs@M*s@{5QICHtpVO z?apq(SRz*f7!g|*daiQQvlu>Dh*mNO6Q@o2U69kNy^YlB?PVayXd|2Av7v!bG_>jZ z(un+(;85+}sYm);$W-@Zyyo(RZ0-)XHl)fwjLNx1n%oq^+R_N^gNQ?E-uXCLbDAoN zaPHeeqgvV~Pqqt~vD%%8`tgOlj_QohZeG%9a_6L3r-Kw&NoPu-OX~z*O>nlBP-tzu zwodf?4n#pa!J-e{u1S+kvg!Oattk6RFZiacT33Zrrt*)?Pd3z%D1zsV z@sQb#CQQ+Z(^a(o&4$@?!}u*myLi9UZAg<)2`_tvj-k2ExZ$4G3`U1M(Ux~DA>CqeF^!6 z3)44RZdzTPiLbTR{v^R*_PH2Cs7K0v6?%i0k_ViqwPuM=Pp39q%wPfk=!qp0OK-Gu z3LKgr;zWeE zd$oo^3Fu1PwonT{y|;$UVdhT#&)c(p_<^GLTl?z&bbtLAi{}WCu2l7k@2~#uy;lEQ zY7ed3_N>0#{iDj&Uv)Rdn`aoCO{+?^ucCJM4x=>vO^{x1QABL+46RS>S^v{=RA8T? zfI~kP+|v&S!-A2nLi?-UD;B8l{HvR(!}_t_m~LzRmWzfbaoImHx``A6mxyK`IdJS1 z`JUVz1IPX>e}7oAt)1`B?U!u7CK_v2%BS zB=826?4Jlhp1hAg2)dzO_*K-#|9F81~v@NCu{h3+2u~ z-QS>M?Iyp!bNiooossc3`%okd5>W7=v>DUOhLAEtu0`{@3wfpy0 z5mZ6bEOX*vDt;==xt?ZPv0DT5oK=j@J4H`Q+(jNM66h2! z>GTLv9;*;1LrIBo$zw&Voo`7xJz|o_D#U3>(wpmfq$YOPW_Qx*&A&WWAwB`U@1r@4 zJaO!IpHBhxyDvQIX4SvGaDXa)Up?y!k9r36X|ZtirU>7^fOoHF?A7?k=U8(7KW}FO zCs$SF|Cf5Tc6E1B=}vVgEFA-h&r~OY0NO?rWOIQ*+!GYgh)7U*SQSuHRvR}&1tf~7 zQ9+|Jjteg1zV9M#h~iF*+lUIHj@#&n|L^ad`)cWQaG9BZKIwYz-Syma&pr3tbI(1u zt6|9Q-Pov8YY&x#t(~Au|G}-}z|y)q9p5cmZM~<5&t&1;PGfsMzafq*naGolp~9&j zf--j4-+gruv4YeE6Ml2bA*Geq9gKDZy=*ryswOW$1kk>Zh3OiW`q2l$}+D!grAJw!xILnN;O$ zt88VAc(Q>YR99{aQSK_KTo=-es$3Y%m|?m*HkwW&jygnkp7lN8=JOh-&MRP7Og*v` zT0(+>)tXz~bmgkez7-P6paFEmhWE*A38 zBR}wo5hM|D9zJIW)SQnduk)$|4f8pS37b|2Zr(s(jl^v&)(|YH(NAOZs$G2+M@FYP z-Y3`lI%ghUK9J$%bJPM}^l-d5D}MrSar4p3~J*vWq9RN_=4IXW4Hdm`9eQ<}NnD zhoa_h8OlZ56$ul*biCJ4Ha98NP*UFjK)Ko1;z79cHNC=?Z?tZp0q0UD#~kctG)XGV z+-N^~HoCG%YrO;*I$u`STw9MO>)7*JFIDJQ_>ATb&dz_mt83nkkA{5LEyVN8Q(exL zw6k9#k4*L(o$FO*a=8lnstSTgwZ_NFFnZuw(ZRPHjpn00chZ*R8{QPZneG3oDe?TK zv`*Jp-Y5L~MGt(u!;kb9TMy7SjRlI{D#Iey8aldEXKh_P4zz-cOIrR!%k~O!d*xf*)E?=eN!P z3XY~GNApAlS4tnx3l7eu*UyZ&%d-fo`SfLUw2q{2GBfEwOcrItlpIG+tS_F&Ls|*k zomE#}3#{vFyj)Jj_qvs@nV<7R^%X-{sMi-FQoBsoYK7T+pGCD7P}Yzi>d%tX@!S7@W0I>nYsfI98IG=vy%c!a0DMN$YZU z>K;a6@*0AJz^}%xTN};dWk2uv3uXiz%G|3EIC?+Y8plSBqX#%Xr?g0G|?#rr$`K`x;Gu{%_N?>|6(F`pN3=(%e>BDpq9%w`0My{LxHh z_$jvw3qufAg1w+F=_9Zi+4G~xa31YvW~Mb(AU)bYwb`Tn^PdqFGTJ}?Sv}f6|3asI zmq!cHC(zCxqqe%x#j?v-Vv5prXicePiI zYrMT0=t{LQDwUf1p|wk1PAAqk=BL&)Siwe~vD91&)Af8D*th(QF!68W&n#QJ4pVwu zSb7H3?83&L+DJGA?%bHenKPKPF_MZl@MK>s^k?8~h?)meW86H3Ups;(_2BI9NKz{_ zAEUr$QF;0bfQ1I}!Qhe2Ckajug+6UCBP+|xhY#jeyzHW4cMXK~QY1~v_53a7Z|3*> zP}W%WCY_iV=*ny8`Ea^e?c$WUH>vef<^ay^P~H2mBJf$Rt+~!-Jy$IY#k#GeM;RYx zF!dETh$ffNCn_74=d2`;&83r6mA;=^OsA?s2Nwai$#}#T0rC`s6YTyPA2Qg0xZ42B zfZE2+otuw3777~62|nTQQs9NaeJtU`*znBp9DEoni{>l(VIt{k*-r*r)~%;Dl+6KE zjf2c@pz!=s{x0Va**em^%Om;(f1lzF1F5LMyN{1v_zOa~&lA1yO9|gVddZlQ%VD?C zu{LMS{+v#Ulj9ljfqy9eOT-^%@ok9#`Q$>ya}e~EV1SjJrrGv4`B}HDxgF}tryoKU zkeN6cf0w=;9F&q1$jV$6r@KX$I3#_QJ!k(y_Srl5andZ!-o|@#XO~t>v%ge|>$)j? zjX7Li#_&|>E26S5I7c|A{%R|9B%N*rQ>euZDjVOx0~ueMEGa*)tL zQT5hy01_8S$ZjvuIJ%Njkok(^=~XH(-u`P+;$9(rEuZP@td6+@GdCM8iXPGeHCs#C zx5-W>hcAoP9TSbRZl>pWKP6i7hR_d(0SmUY@bYvIg$@}$;@Ll{&97HgXHhcaA0dzv z;;lC*jp@BiZ<9CskQ3AvmnxnDsrzIkPbYiI6Zt)U?kB9si$<+xAL6<#))UbOZS5w` zlJ9XA_PyUoW$d5X0jD6wGXE5!o5^!O)w!Rap^5vC&#c%r#ZfBT%^Doq=XK>!LwGSc zgk6lT(J>ApKo-$6rk$Ek)7cbtBmOvqn)%)jIGM#3Pb0sWiz z_p{($-F3KhHntAWwUr};|08SgzO>83dVONz%F^WW1=s7WQFVVkXD&|(b>+;bzWils zEq*U>5m<`BF8C}iZXKCL^{E*aYTq;a+oxrSwXgX>Q1;L28UEQe`en(IzxwqJ-8S|q zN;AFM{WV77)@fN=f0OA_xouvZ-~1#$E5(!3CY!{aZ-@dy)VGM5a7z|(*=X&3a;;Q5 z$tn#z=m6YjOp(W0=G)4c?|jP=itb#Oa=H2;*H&P3twG);DmVN5UZ5FOaFl@jb`h-W78c2=PT}>&)9TUU)&8!z;{XbHpvum*4Kjlu zw)KQBO{6d;jn-bfc%G=VcDjP;!p_R3p8%R_)HprtW(=37NBxQ-SRwyyqStme)&obC zo40~2*YJ<{@f17V+D(N2uX6GP@V28^b|ty_0mEAm^TKP2BXdi7>!LL*cR)a&96lbM zGpiXz|4PxbE{ck3v)cJSLQe8_3dh(6SR0ug)$CHLwbO99D{i@{Rjn0m-L!r+?n69f zIn^?Aq?}$2!yVJnpL1H*YI#uLYN8-dzFHFu43`PS)}VC{$6NhG^CtY~@-pdF1wT2Z zqKAf<#EXvpU(S=`BX`ydMZ7sLO*YHD%sQ?YF!b!{B9F#kOyl zU3zCu!7pBNgx^v*n5>Q9fV1y_X};3jqECFus4(#)?B=~&z&JwUPI=c3z>YFs)0eP?&^hh{V0Q)0FX*9Yk4voPS4 zk8#zX?-kw2(DV7?@Xqtx@6PkE8oHrh%lTbs5KYrHtTS@?**6xMR$Ose@4QW6Jtd^> zSd`w&|1k$CtLZ{o&j6{N@2I3)TaR=*0pYd9YbcTnsgu{5(#Q3XN*Zj!VA{IZ^uEXV z7}D83#ZGj7%CAA()jxiZkiQ3FjXlY-C;Qk_wpmTh2CZzp1!OTDfG_#5!1F$Q8hIZ? z-X1&d{8&}zJ2&ZJYpi_pzhNr2#_G)Vg^q5@Lcg!jTx*9g^aFo?y54`N_X(3^bb_I+ z?>#QTbbiEpv^GYD!Vua2fml^O`wL~WS6jU1+JeRSNh;C2bF;7&mPqirNbPBCftYIxU=N0f#e2U11gAI-1%k`;nuJ>KLEJ*jY`vMXVP|SyX*}IS zDE#OKhAg!!FujVPqWxypVvHb*f@8{RI{Sd9=F;D#;$6>A~ZlUAqQ zV9$2Cmw8JlGmbt=nZ6I=#1;ro1mp7q`ynUNh%P0DQ?dk46D$UUtiTsi!qakX72LNV ze;lG^=*9FYUb&a_2DL7iHWij@3-g{gbhhT|^sko2s-S%BBzigxc8}C{j38Y**t(w) zq)9|P?8LvLeGI1zxNn$2D4GI^(J`14z}>%St-~Jfu*Au`)S!Ror@ni54jqNJ=(}AFjhtDB-36uA1JZ@261y?XnV-af0hU+e99z5PaSx9aUb^;W(YZ@<;swBDo(Y;Mw<=7Q$K z^!5k6HT5R7Li2LH{g>X}p|?Nj?TdQ*v)=G7dfv|e*4xkZCLK+4=t$nAsA-Pt?XP-U ztG9>^tmX-NTg01_`d_8a#$A6WCP<`VJV|T6M;N{NITp7WaodSUdbpi4@o+y|v034{ zG$%>Qmf}TYuIrXG&!$TM2#Wz2E~M4Eg0abEQn}Wv>?JChUCPnay~WEKva+-}*)8j$ zeU$Z@tgP2%Wx2jNjy^+qr>Z;@NSD$7rq3{QWGRri_MNFCeIMs1II!_%w(g{m7BZ4g zL*wbYp*v>L_wc~I#`z`0;`b`3+GE}m64fSShs6%ome(r-tyLHndZ#(tz9&ECoTyG%mAz(iFZ38A2ZKhczu3gV{m=$ ze!fRF=ftT@AEuAy6f@8IA@_*WgLzrEfdkEY-Zf5T46<%2P7mZcJ(f#PWi8}ic2B#M zi(1>6ofI}w`EXr?@zkBbhockp59#;lfpz74dK1qE{-@rl6D>pDGn6MV($`w|qz`rG zV;Us5PF!j|j5YQ3L6td?3I5XH1!p&BaofxdBW72AsV zqE*xS^M4gy*41&DE>)yEHN`r^|gW0?Y$R|P6b)5XQR-}C2BSp%&okr z8eGkFK4?K}ug;AYk`LKCLP$}~$#+V66gp)+M)RGDs*$~t%Y3KVc+Ity*sz~#D?|E1 z5F%rA%hpz=aJz0zAKpB!`Ii8)p^JzW=lqKx)W-X-MDq`Mwl2BFmMAf3BX%;Bm zaEQyO_I_kE%=iG$Cq+vho!J&`jg~Ys`;A4>15eC+7snC$favsjv^7lCts9X{v11^TZs()7imfFTRiZ+eai`8$SkG7?JJSp*bVee1ieWYxb zF~b$Jj2X$5EAxm*bn;~2bQvzQWl{blhcVJL?^knAnD6tfGtE> zig3yTkrGIuC)vNur>!Wuf3#$C7JmO|@-aqe(8|D=?XF8lRc@}W$3Hh_Malovm_1cv z_A2$*2$kpB`u$%Sv%!8w<@I6KieCt`iul`Oc5qlO7R33^53Og_R-YG>r;9rm&zsnmN9N#)*aNLnr3AsJ<3 za^{}d*jp6M+$Spdn7m)KtNV_ zbcXo%Y@O00NjkuGG1bROcvgf0IvF5rnrPnvfM@!3PsegYpGVoT3p<-mD_btpw_;;5LFY zqUlF%8k~EqPWcqlkLhcCtdO5xgEh>X*g{)(059x#4mD>b7HXL_Jya_$@7muRB>N-u zq+_~0V1A9dzgqrR!8PT7obuO|EW4@KX~m`|f_WEPsy+;p_m?S5dTwu&en~KK+w^oCR+5SkXmpv{V=^ zj3P(AMLjbr>NiQS8Wrh=PgpmM;^2)~)0|r*)2ST?DW#vx609ac??PoI&~ce^NDxmi zqmVVEna0WMVtPb)w*7SNcR+mXGAtuF{gf35Sonq{d5}A$ zxcxHF>j@LQ@^U_c6kR7cU!6OkRy;o@NwDbBf~nuDALH{N>g#SeD4IinRxw*Nk0_;g zqc&s@RaQzcP*&Zzpq)?@pQq&8ooxg7FC zD^apzj@T8J(=P}*S7HW(L48RM3c?UHy(n=QhmTfT{hN+fot*8x@%~VskEByNThZE| z7=(xQF)E!0_rZfJhg$cRVX4o>sU8Gy+<)l5P@yjRF|gCX)knTr6=`EZ;qq*w&V z`B!ZH<~`7D5NE5wd4y$AZDmx@xI8)6`XXrPsCT(kM3o1P)w_6KdwTECLN0kdA)OT@ zM2OHFaBR13XQ0%a?agrUXTJ4vBulO#+m9SRNo29_V}%qv%EVTn>&~R7u(>AJRxLJO z#0TJ;(OEuTLRqeIu#&5dlkVgwgqP&YZ#P!zQxO!?H>yP{)1eH+CA@CT+SU*ML6V3C zng^y=3tb{0^o=SdOtwzfi=+B#ry0@4T|;@o=X)$$@^K!J09eDXPp)+xpXqxo%JA#@ znHg($>#KwZe0X>`AM&+ccpN>OI-cNok_O#Y+1Y6jThFg>L|8=gTac4&+yaAm9K$9% zm0=0o6U$I$*B5N;O4(tG((HL`YZcSKF!F*Kp8F@kZ6f1F{dNZM{MPgiQ_r*+7Ola9 zQH&O*VU5~+WG)Vs6H|!_wmm9_(KAZBsjC=d+Y{dS5gHuKYJw4?XeTy5d}pie`Dxg# z7oP1_)3S0D56`?Ec=|B#zlNIToKSfV4O+7RR&0ydW7(HJmsA(2?c-D|gmqmunxEURhte3HR$Q*F9D!#0 z>^}bHS(LuC|BxMwpV(8oIeQqfb`T#H**l7$u)7l=5pp_l4b=2X|2A@&9`nF?v@^u% zD($eIflkUAL)r7~P(GLqLN;)WgKB$bs)sL>mC-gImkMoNpQR^UYq1w2_nf2nd40

ob*iJPpA892#{*s*jf12alZ76r0U#-^z+uOZG|ngHeE${uC3p&HqCibEl$I$ z)~2o#8(1`}(!3S6HJO=vO^M zzv?vvm{vj4RQT@o>%k(W=s9#rGf%@(Ct0nb*wb%dke)UFJ+1{_#K((jWuL}C# z?N_z2uV1an3-zlaykCRjM1c1C)xiGy`qfV2x)5e`DSo~ldV7-b=spRd^#i&Qg{~bK zVIwlVm2W>YQVNrEmiNi~%zGU($HIBF7JLNto@;scd7hV%C+4x8JFs%;Di-=G?Rrsg zX?vSdH8Qu1QEhUAuhcXDt=U}>aH!~@`$Wqm@2_uthq88Z!0m7DFFmJ!Ue}y&^Lq1a z%_{%oIn)2?+&*akd82wqk`J(HtYS+YrQ*Ro>&&&ZGe02evUHG0naNxE`A7PRbUQ_a zF%5E+kbaArI(OqO*Vb=7{i@LKA5FxK^Fn}!q&E=TNk|yYv6zB!LINmqs!_8E^774# z`E|vRU8T~!j*W)+-p>P~<1Wc~B=4_?rv6Nn=;dnKc;4P^+$W@Mfzc0cVV|HrXaLmx zO;$wcHkh$yFYGB#HZR?XyjWhIw_^8{SGfISc|UIrf;oQEIj)QOPhk4qp2gAe56jxa z`x()3YLCW_*l)0v6{d}fa}G57UEaN#4_MN6ZD#w-WBa^9QlN;GZ5(W4yLO_o#|ieZ zDnA#ue%PfN(agon+fUK>%WPn+gPZ&1=+m#!jn&rI`5kWE$S;nXTnjVQSjmmC(!y;2 zZ?z+jzn*;h4U(WNubxVGju=1-)K&;()u+>PPn|Q!R&ljl#m~dr*)+CLi(rh3;BB!e_Th=4d+vKS<%A@do+JqZ)aoXGTxi& z<1k|5^gA>axkY0+PQS|sE=~9~%irO-Gv!U}CcY&?&74(wvM zC3${-Wd5Ujkc;y5j#x>T^;4K_Pqp%w-2=MW(pmio87B5Dv(MgP)a2u6i)K?bJ4l|SX6r#6w^QrK|#spfZ&!AFq(*# z-p%~=Vh;!*t|D*AO?$TuSlcOaZP4Kp@ifV^>|7hL+FTnp)wXJ3L z^lZd`O8t^6&hve5M~{rZFEeZW;ckU#&iR`i~h>%4DBJ20j1GB{U|e`fZYtk9y58BWCR6 zr>?NZdi=8JJpV9FT0JsTdN}(j?r6EJ?y8#pIkhhyt z03pVW`wdYB%qG$(>!!!~ED$ypIKr$+O$P>e%_gl)7wiRvm^_C)K&|mNoSz1dD5R43ksTcg_x#2)3YCZn8VwzoM|W#yivO0De6NukWNy; zs5ZfvzsL5z#bL|rzT0Y7uJuPyY7vrCQAI`1u<-La{-5i5X~zTDb_F0o+{R9FtH7C8 zvx59HxotloGyVm-KZvc+XPs$-POwQn#b!&eDKNi0U4}9%gU91f9f%*x;xFhHINtg* zb$3vqBj9${Tj7)|xFt7x`EhcGs?W6#AwK;y8N3!xr+rtiCrj7*Yp?xr^eW=5&+r7j zK?R%zFBmFrx{z?nRGpHlRKCDSG2Y1DLu`eRH69x$r)$>$B`s;-$!ssz#TsOw$c zVgaV&>M2a4(GlbhzmK8*l%|_2$QDmU9!kovw#Q#EAO;*Od@ls3-}fU;ppjl0)CtA( z+Z?>>^~aH<>lhuhd+9zSWajz;K1TpngYxxT&DmY>xWc^`z?s%S^+{GWe7XT8zUZIH zj3Zz4T_V}oYeSCNz1s$b$F`f9d_VDn9`g!|v5-q+F^P zPP+TSS-A_~rQcWi;gpSW(-8))#?Yf__fFM|{Cd0=2>M&apLq*W@_hSRI8naMNX@5J zIyC*A5jS_#wpC8P{dtT3%Dnhe)Vc*xY=?a8c|Fhi2kZI$->Apqd-c%J!!?XV#Qy=; zqoF?)^MjQc-dFH^w&PgQ)uoH>sGp7cBRz~oa`#bWawoZdo>!TR^jUaoRYZ0YDhxyr?t9)sm3 z1Ldwzxt^1fJyU<#R~M`yeT?&GLV-~7^Byh=(LHFR^Q5+Ll)t=S&(ZwlhwYzhD{0&o zlBh%v_64&BWHg)8K9P_6IFw;gvwg?YenD1x;Z{8go!fZ$yy9czIo=ma)cPeqp$lx@ zIfSyG>+!b}N|_J0y=*3@f+_xmtN zu;t?ID7`&`H`%qceoHDgbAQJpT6=D8_V>J4;@s5HmNb`)ik#Pev=5_yAQ7niqaK(g z{+B%qoj>WB@BEpE{N5F#+R75Q{+r+AFZ`I7a@&GBo*{mF z-n~X?lS}if3dYxlcFr^^xDYq}JxP)~2)D04bieSsavhyVCaYMjKmX-?_W3&0CE?x3 z?TXY<1J$tri0MvKg*2YppNT#-Sh;pN`78Obu~DnI&xpia`(=$wp3R4R(RAyQMOykC zg|Zc+`f3H)sIf2CNG|fm=^nQJ*0M0y{2+Uc=L?^4`b(NRR6JgmR~f@ZV`SQt#(smj z8%se>8e_g6HQ-Yhi68ntFbb9EBJUq{N-IyA9{uOd{)=JTf7Y`=68gBPN1;>F0}3eH zv(TyN+19VIhn1`{7T=L)>dLm7Pmx&()A`U2i0-%6hGdB3)!amBYU+%wM&X^RikVtj z+R_=;+o&_K&WJu%6qlcw{EiYXc`bvXGpaBj7@fs^?@M?OJU5PZ(9RcFJChpWz{9mQ z)yCPmdcAckKy;QWCkG37z+`c_l(j+}c8I%H@hLP;C_0YNJTX0M*^jYBC1!fmvtxwH z*G5LC%52~lIM}4f_s7>64=;3lcX2eaWoYI~!leKfI*Uo2Uj{j*+q{%6ADQ_#V(C&f zwQ_|>$*^y!p_>VUL)LUL@`{#2a?`bqEzx9>NZgMXR{oVDY6agkR%|7*pfUMXvw}&y zoWv*-lNCI#!m3!Gm`(H866(1U1LMBX%9S%_+UQwF#DX}N?kh4X*>pepA4~|X-9T!t zk5z1R=2o}&BWhyv>al7^Z?&q%lLLgabX(a8*ark4FWok=m6f7!XT-BPIRawVO3H{~ zjJnj8IyYZtg(OdhRPdx!HcAQQs18SNaUyGNf4gc$8fpo6i;8qn=ygrMMYDM^w{Q37 zfcr$yd5YiN$WVNdjn9eAWHB=4bOa#9)~lCSXRfr-YG9VGz`uby$Z4iqtPIMGrmP#` z+5H_}4*hL~T7P#$ewbTRut&mqdIW-1UoWW@h@NOEX*nydj5B{R+Oy6kt#$V0WBGWj zfV(GpLw87VRf)hHDs)T^XgX*ds_wp2)4iYmzK#diMr!(!*mVy zZ=V|58xH7)Mk$3xtbsMex}fN?WnAX<@IdFI+VsJ1Bw8z0wrpH1zAPoBBKQP z55#m1e;Hq7D0-1Yc`Lc<6?!QFh~X?uWD>$gvM`g$9l9~rL;^m@=OM6Au5X;E)HjaR z@?6?}2<{zAFj_a_L-iN#XrDt}kTZik+5|!$6)dY%++|w2Fu8wVPheVsf zsjuPCwls^(f&%XVX1xUx)$&`I6{A8{qlP>)pOtLy#dZ7F24VxM!w8;mT;aoKwJ(G= z8$c#iCkHSH#!9$7!OfVB8SQ}?P3F??Lr0USt4dKkv3bd&C@yXo&BcMDkSIhF5akcz zAU0Tj47edC{#&*!WUI#;7NaUMvg~#rE0ddJ8zf(D&48nwry};Y?xnX!>Fqvxd$iu} ztGCnicAVZ$=S@dC4g_%duD&~gREf-4h_2w}R4tVtwk61V{N^2@c^?!7BQw@!8X|#W zGr}CsA~QlQ7q?VOTj(2Eo)?h>@{M~ol0fyv)eOX41ta|u?^UR#FCm-4%s3YCWjP;$ z>;it*XZT%NSO%sWm{{z$wYWLX?{fCQ@HXi42tY!v>-G8?N`CRG8UyeWjobf~wg&D{ zPR22E0u$mDT)C*Pk(p;xW!CInV~kRZ-Gz#nW`c&0nJ8L4v1Nl+2xH_lmLWy`w@IjL z5_&nK5|c9t3-c1n+6P1`lQ3RvtXBofOVJyOrHWIX5^UP039WpX0^Ltk@ZRJ2k?!oN z(n$n7uZ}=5KAi=a*}@vyOI@V*uukmPoJ00wUG()X%KYD>uP)A)0n$(x=lZJt-_YI+ z@Y~pSoXFHvwJpj06IA$rh>rzm@c$b=RQHnjpTb8Rahb;dr!m=h+JXaeuib%= zG^jX~Wuv!T`fgY>9$HVXG1hOLE%p?K6I2gji3E#MdHXh!4U5cIJL z1PnkffA12fW)fp^*x14piTz{{U{uE>bzCYwh=ij#I<`5kHO2H0WU#?BnxtdX1NPGB zKGKsZ$NsU>^Kw>FgljPg(xe@?JxK2asib@e(mO$#jn@Z! z+!*7ov{eEThX?rSMV%7qlDLBjqJ2M{Tg<&U^*^ywkU~)frIwrI96EP$lPQgGZ>!8Bh5 zZ!Xx^DARy_nwrx}b9uCH|7-8OrvJ0V>#?_3t14y3k;%!Ic|Ud_wxR4|p80XpcM`{( zF_2I4Jd>jx&850?w!P2*#q%@Hpa_;S)aZVtBQ@5$QgC?`^mI|Mm{YS=-)5UFQ}ZE4%ta-E*JV3!d#u$7~izABoQow>b# zE?Vri=!AbGYP?q)-Ac1)(XyQw+^TQs*JwyGY|ilv=~`cfAx8f@-PxHKZ(5)`4-fl_ zhk><$@Gzd$KV3Rqpf1H{L$6y`$gA$Wv%HGmEALB;W~}$_EU)#hC7}IT8##laF{D24 z<~@%1m-f-2N2fo6S{YNr^^wLzxw2b&4P`4P&@C!>tqdz=yVOv74mUYF6~6B}AKy-5 zR-Ts;Cuj^BYeLI1*aA*O)m_*Yz^CH(!b!+0GQYFDHX?gCS&%j~aJ+nW=x>K#wD+L4 zj+2kF1uDMo?yUNFtkcJ~sruHb`k7Yv)@ZzSIOMYPJj!aFi_g8J1)<}K78-mipLdMy zdn@3i<1bv+)uUhaLb(0uX~%G{k@?aCyFT6?&0 zT(R9IHa={$*nWnR1zm%k5Il(1%o3O$0d#g|m~0#*DJD-7d|1U>8FmB^nu((;sqoHnY_x_pb6#5cE#EiTWb&=1btOUrhpyS z<|QlIE-JTxQqfCX`@syyaa$dZ zFL6k-R^rCfVAKG&)=p$_Z>xRW5$404D#7Q&XWMHIp|kTGz1BMy>JcY*hYTTvFf~4l zKxkcaqwD})?mX!pO0&E*!$UksiIR1&4+++~u%JQUJ&E)y)6-{*L{cVC%wCnYls=me zXE+OGzhB5cyN#JUy_iUeOuqXC#r@WM=P(KUPFx8cC}ujlARqA`#fsPfI2FI zZAv365KxEPBi#g;6Y0y8>%txr_1N@YM55qOU7rgu<=R5xMDiPQnC)45B#FjGW?lo< zYa{8s^#zvLNfbiU5u4!K!m(rl6~(2n#404M+MKS>=jzi12du~MLn&(%EFjbUNQH)3 z-|9AO7*{Byq`P6T_=EFv;LhAsY=u_3#@};QvSea|0k?^0fw1YJEN8g$Q@3gwNM#@o zGI%ui@CD=q?$$uWP}BF+M%}%y%L$brCp=DaLdE5Tu2)41916liF=3;#F@}h5t}UYb zUJl0i$IWTcfjqC^sU1_v4v?CKAI9@7gkxZ0{}e8N7qYp%j;Cy_vVZ7@qpuP6L;hs9 z<8nu23kZdekXdt=WDw=a(yt2P=(o)dPid+yn;4xl@@(An=BNSLL~#T2+q}Fsy7rM* zaUt)3TyqrNKM)?|3-$h;)n$WveqBMn5G8f=_tY>gT%-`L+5#J(&}=iB83fjNr#6%y`}5_ zV60xN!_^ElWk{Fd7jaLm?)>e=0w=`2m)McY>>+?woV~vQY_lYjWe-H52}Yn+B3pGb zD`Y7j&`nv$f{;kCy?m;2vzObK`!Tq~XVJQ7Y@#+%x0?3UCMIT|4?cOB1g?qY+1H9$ zl}w14UXPU=;a>s`;kF?)tcHu((3GzWgEh?8mttmp76=i@Y{mr0H)(+e(1%hecPyRQ zg}QgGy4v^H0SJ|N0K%F+`#@AN{~(A?J}Dk?Y`aL6t`EJ2dxZYR^+>GS$girA-e0ZL zc-Mg}?0U}NbxjS)LzJ05L0`FAH9Z!3Bse{eC-W7jxSLJvxW_8ve0kytT_K1$t>^q7 z0M$eEbHFop_ailFL5yfNayX4y`W~9l@fFoa5EI1MU_fj6Ecz^@(L~;tDx0ehp4a(> zE?%B5I+kei4qC&Qi5jP61CokA3S~aNQ_4I0f)8o}mHBgnW)mppN zyNja+OE(+5t;f*Bv8A=8wNc7Bi;p$6rRfREGB(hamVd1EO3xo^*`ZFZEgl<3Fd0X_ z_cJk5(IYQ#ULHm7i0}7@*!cQ-8$vrZDA(@p6U|>h0HXQDdK5Y@)MLE!A|BB`lZ|__ zLP*xr2kbU}+E$T)cl%uODi2rT1L3dsaMd;t9&{&yDTL?De+m3t`UaIlr?W1Uj~acY z_dupikLG8nAv0c;*h`_W^xf)<_wzHvsx&yN)g1mt$oe}f*Y63=8T903?Ne8Gsxj`U zlC98GOxYH=e3V1JeRxynxWc{^VNDv83crnT>BEW zO^cK&-b4J(#@-xe>(N|W)vYUv-*ro)huDlECJ-927@+ZvuG3l->N}RYi1ur^VuEACM@Nb?c}b$@ja{)|VMDaJ@#y}LXy%pTfJ`#oS$*coV~hE$z}P%Tn*${+=DtdE=KW4|o313EW`l zAGvyZKbR6*zQY*SEw3$~^cxDby3vwEPyIC(>i{S#vqmK<^NTG}R2w!V91^HzLyz5y zYHHPsPoNB=@hUa8WSGaaX=JQ^(;JZza_tvG zAd~A+y6D9d*%r78!<1)i)Rj;nOHxcT;oK3UwA zQdDfnxjt$x%P$bAIw7@MsYgbH@Q*dC)6S-A_35avdYN)ccC2khf?2m_mfFPb=Gl;g zRjj!rYy8Pktv0!Pj3mo7VpGFXMTo&nba9uLO@Vy-L<=NNn4U7PD_Q0SJV&3A&Qh~j8fuxik(qOawboR$ z=J+Uo4ZSM+u+xG0DVl%0W2PtOkKyDy3_;N;O1^spAg=2!1Te7+8EJ<`3T~T5#&Fw| zU4L|=*f2QF_Ab~1r>@lJhPb0Fed{;ZVb4orGmcHfz^Za|^mbkvH5$zO}6{M69x9Q_Vg*clehe4+jx+1STd&twQN>5)0w;iiB zo=~f$d-N)&QOsT%da4k5Af<&MB?7gJp%es8*RsF9u0m zyPWP8vW6yD0wDs|#wONJ)W-JTg1Z~QCjvd-HS_ z4F?OM-L?1_rtwA(S|)3LF&>F1&UzMbMgrrCxFXKiZAbKGFLB!1Q2*=|8XT4_y)N6- z!MJ-Ly#`^T0>$oe)LG(aV2QQGYt4tQ8jXw*A$8b&CYjz);Rnz$FXZoE`N+ZvHXY&> zgnfd)jBjc@9!K13`^HP4WyS?WGq5)&8ZU;+`S!gxr*T_weq!SfeWM1HkJ|?#tG-fS zadMJTrN(Tmv%1mi9EN`h#Hv*8UBeC>aTL9MGEwP!=o9b7C-KHg_X)%(ahRInzuY|A zpV)-4kocYhF($Mrru86-)>(vJ72RCP3sCa{Uo^K^r_Z-Ct}+!`YkwwN4n?K+XS63E zy|Jd;dMA{f94ve@^d79%lS<)x-7ow{f9eW(7&ez*lfu+EX(0{MH+g|g=*y7say3G`OYKwiG z+Drk`TxwPc#t+14RK@~Qzsks2UEM-l>Th4^^(*71mkXm=v5K%_yO((Mm)$qHdf7_e zE!!s3vY}*_V>n&0djPzRy+z5L7XdvT9Kf>KfYUOsfy0Se2&7DV2MP9z_!hS;vM_JD z2}y{{V^Ns7g}D$|vdP=>WS1%Rrf%y3*knKY9Zgt)a}_aayY%TiSUUyjdkV|V0A9wA z4j*i8E#J?NLdnLD`m~dwiJLf(50~>1*5in5)rbOI*n|fboh261oh0^oZ^_JC$cb2& z%_&(LM80Q`O0&eJ+o&c(CT#i{p&&PcQqc7cuWTi97@ZMTBGs`G*!nPwA7dl6;f$@1Ad5-9g*8Xp`1vGHrm+G3eJo-B zLfB>e_49A>+w!3NCXn`$-{z&!AnHrwe#2gG{9<+yadyA;P;q+HJwLk1Fo< zN`{>6XLo-A^}?nU*SxJRzgdbmM=nD}zZUK+O-au)i}~4zNW*{Mg>2!j$@R@E5V>}$ zbGr3Pp7%Yc$54+018v617lEpCHA!=A{WkZIHF*)!-ca++yms&WLW?yW9cb5&S7+Zy z%2N7JO@txayGdIz*pmG;XCk;;Q{SYL^PPX=!FbSq%srv?H>!VIr!&){7_w?VnN^Fj z!UDdW1t7RtfNC(nMqonuyj^1jE?Ka`$P|SwV=aiCbY2{SKd8C>G$@jIQ#)a*D z&0r{u?3Xo)vnYHXkbNEqr&M8tStFCr3xAaedjs|pLQQ3Fwx@JYy&+k#d52n6@m2+_ zua?8Shlk;>$rQf_O$9cW97At8B~+$4%>xs);ip6x8aCCNp{$IACdo2T*ny-|V5m&5 zMgXB)*CMJw)WJr#X!N~G-@C}7){wC_6rxP~i`J`{AXGQf?_jPrwxqF*x#7Edg^^d& zCt6>1=PLZ>SDUXN&6K}+fj^dIUt$;r_fZNe!G}UKh&+i*sOCuoP%4; z*;SDKQO~8^t?Wk(8R01k1AR}Oa@aDvFg+9!h*v#GDwHve<3h@nA7V-+@pkU+-DhI- z>uhlgMP7V*6s>_ppt?;z+yye1JOWCBP+Va?b(H6@P=~f(Lk=&AqkB@u)#4>lavju+ zwBKWtX`M>QaXr;0Um$jPZWLdf(-1=`+@dM>Z(aY9cTJ+v&+@5qANIG)r9l%`LAbJ0 zy!r2{($@@&qGOKD>dQqdsSodEw8IC^zXEf0ZgePWo&~tsrJtp6kHey9ba6EL23v2q z-}5&qZ|>4fx@mkH9$U^%Zlqv%VbC70-%xK~?*j&We^;Wc-ruO+%nop0 zIWNey-p#1${5ue%a(uTQaq>t>9YHVnAY_R*i!R59EGfQ*HY+;U-onH6d*Q?Nd(zN# zFS3zhER*Q-+FLN|j&j9zp?wdD@u1QKL3$#vjMZk&MV3d)c9OoRx{$t8>M~A`hIN8U zwQVii%Vz%t>D2b4Fo923q3}bgVH&-o!&?1!az1%CRvqUY7yJIPKy$J)BrcL?CPvJ1St6+qzV`0B07yC-G8PWQnB2 z1i;XrA#s2n1#y<8Rl*op<^mHb4hVpHI34A=hFeWV6Vq(Hr%Yjt$TU%Hi+FEdArT?q z=2?uAbi`AvQHr9ne1!fULXb(Aa}aM~4}iF(*95kx3D`_P>kwVbwfLrY0c-2`^hT(O z=!X%V{#G4?zXg$K=%)0iz@Ig2B>j=TW^dsDDmue+`*p&bp3ULCpTNg_sOk{RwAeT1Taap_S8%hn2T*u)p;*~ z_@Zf+(SWz{pDCrSqGsPRKj3YB0T`;p$+c9MFQh;3=BdY*ZX@6q7NB*P>>uJI zRPHaH*?JF)t&Y0M(d6*39u^pmEoN4=BvO;CKfhs(v3K-940X+bilOsE7W=GwoW{TK z`9Pl6^zi9&{A3hQ4%Yc2##FVjD%5qA&c4Qzbi7sldOp)1TZ*Ve!J?UmQ|{Xb%4MwX zUGDeDHQbo)FPFLp3cg86<|=6X1D*EC{~M!;2lVI^LzL(p^Xps#8iY0*uIMd|6Q~mx85%~ zH1=Wq5{g*I4Y^BsLaJJK!y9E*_!TUa9NvMCV)Gmz2@%1zAd*0e~^dCAKCfPU}LIi%bSIV zIaBE^+(f%SNU}kGf!B|BK17uJJk*)}P>upEJxO9uGLX~c%hjY0<$sv;J}2vBhra3w zi#>Ld$2Mz}9t9vUaW+JlE3H8ayWJk{fq>9rD zzn=89vEKQJf`NJ9EQkVoZL}lH?S1 z6*^PQ`PGkRm933(9B|bqXFBqB-pX+pBMd)^#ggs&B+PS-R69Bbp>M6&MhoX|^^|m& z)QRtWjG~~3kMjV_T8A7>y{D_*)^eE;qtn)nic|KUOCL=g>FV%tnm!H)AE)c%ZuVj3 zxf#9!O?)D2!o2WL_QDGh287XjtbgNVKY`C?qX29R%n557iZ8CYw8k-<8Dk6>?%D*6 z9ThcE)kSXO_Kt=xDw(gPQz-Yn&KrjR&SIfN*1aUQov)6-&&t+&R<_@}^gb(lqNP4I zlvAJNy}R>#zt@}poApj(P*Eh6HX99cFGJ(x1BR2maDfB1xK$?0o}wXS&Dv1!XL){5 zc}DZl|9`R-D0Sy@b{0qTrQM^2(q-Vzpxxt|O{GJjCL!ZHtuyG!;RUWDwPp)aV zBnp7cRf2GH0!ym&RpNasDUqh>IPJK-GH5?VZ$QDH=F#O7tS_Cn_|=z2*V0#iNH}rh zo_pHC`{Mb306D>VtrWX#&hHl$&;R3Ip@pbkog1HL{_`P7g4L{z#UFLc&vUSU1}QLF zxC+j_Z&$6kwm?ts5C@pKjO2S&OB1&Xl3ZJ@OLJ;+V_Wfjb!Z>VM=-hkky4t^*2Hxd zh>}dE)?l-_U5UK_qhznIaS#sDv??7+xAS8=T3(3FFRj&7wPUcco7S^fQhQl+h)+zb zfi_=_dmk8(JvJ_odu-ghr_EhXmPVlgnEl}`PPY~*@LR#OMJ6B)?@8iS$uwejC4epVMQNto}ogh=XlD%p~1R% zyivxBPr6R^2L9-NA3xelAMZBEg|j%iH)Vay;^GWJB&SPtWBEr_HzSN74XK-hAVILg`k1oE$l8 z`5ig)P&X8!-Ar4IL>y~$n3#bo7Z=Vq zl3ZL!kD?CV_m3*25Q(1#hoJ&=st<;&aUPpZ_NTm^j<0|die>h_Z)l0NV@Q3zp0cYP zeZctRF%k)m;9GarJeChK{FHw90(k1^2VFouJA5m7M)G_`JSEOe#K|$_OusKeX~%5L#dCw%is1|>bSSfBkeNh>SP-1X|>guk;@xa-xd2r&rWMv+mueUnP# zWC?~5^-0rCrcWe>O);}3l7q9a#_Air$<=2*J(PI%OB!sAh zCYd*#0%Pv0I;&e(4`t>5u!MU;mb}IXW0UbdYkg`%%b=SyRo?c=S1^592c3abVma%VQL{ArQ-6WN$>$rC(=p5o?@MY%wE$ zgG`N1MLWjZaSGxCJ%u+r?HqFG#={Oj;_mmDx#wfIKJLuNpS6`ezbhi``IWkRe(KV- zv)l*{ozner=c@!DSlpmTq4PB!Hb;pLe@0!`I{vOFe0oW)t*6mAC=ZLwax^hK^Kp{S zAiRj8RHBWtT>C4$_B)t?uAWE=tIX4R8$6|RtQxPk zRvlA^YMmHv&<_JaUP&K(lEFqQn;rmR!BpL6jgP03qkFv|8&A1t4bA$z;UQ}}6TxEI zVc5{{mqXUpI5Rvqg>aP%tb1q&(pz^Xyb*{%^4HZ2=Qr$TMb|k!+RgYl$XTToiezQg0_7+^!$Cmz;T z>x>xLU}udg;|nW*6W%*< zXZrYTDxl7stvA2y_(~ooT-J++N}}-kio1L37MCf!9}Sp3nZo6yAcqO^0i1fjw$9AD zD#P{O>5E+B5k=@@SpvoxJa^~L2`Z&I_Ih#un zkZ2#P+J#jSf(o;aA^FM-mH>%BQhYH$l0`EX4yT7&=TeaPrP462^}tIQcMkOAa}-|L zT$-Fl^4?4;`6XwxZ*=Wbsi)CI+NJ$sbOU8vFZ@m=K4DHJ&Rn-tbEV{TO0~HY`9*Vv zt?SMWpt7JSY?z6!AYf53U1OPNUw<-jkt^R_po;>(GH7WICoV z@X5rJT>$7fBO&-GPOO}ST!g{~F%ZyT$=Wbe$>n%YpIvhyx*uiUU}YL{YtK%}G8rD* zrw~4QsxcS1h(?O-)+k{Z0>zB!h-M^z*_zM94=?Z#&XB4PCpS+eF55T(Np@7bzUD9} zN$c)(pEMCXytdMAYaAOL82NBbfI%p)sdFR{O=V&ta}W!t?%ezxqHMnKd)$H^@!N#v z+KLMW1yVK~&j8EU4VJ#S>Mmfx(yQt8l}fNJNWGL<2JJn2os}yjZ(^93jPPA$%XhxV zgY9aud<$tSAQyI;saLo|F&pT^V=X0mNNu3@;4JGtwk(~>g6rs^?o*-g6E>HhBs@we zwz3P+B|Kr>_-A8kkMZ!mWKrq9%D1=2(^(2Fu! zs%P-!0(^1$9FnL@Bkc(*zhoq9LmblN`oL!_JuZ`TzfYsUwro1@N}g{DCWeLDYAftq zTPb{9w~sZ}3Iqz-FQ_jh6MoCuWkoO~EV~pA9IHUbDIPv>e~&U0X+!hVb_RhTNdrzqemZ}j6j4u=^o zVnAyxo_T?!Q&&Vz2b#SFXOBan!Z7RxdW5PR78ehohP+vyR13>X=?^u>Mh#ZGs7%np z%~DCU7JiIw%-^m5y7RZ!72E2tOQSABx$J7NSd8Y9mDC-J7nrMv1Vd!h=*56ilRF(! z^_6hyWpHoe^ME6{P%SpjBK`H*#0%$Kh(OX}@;QF6`FMeL-GMh{ToyY&024Xbl%5+I z)9kQye#kpPdYFiV=1HvfU$CVkSPzf%TwyQ9&--cYeaHGSdA^}P*ZvX3_(ag{v)Fi^ z^;zS|l>DG>kyFX$!>YODQu2nS7(EB3lZ&irk78E+0nBgmurW`B>xbl$y%N9B64NQk z#k>I$_xhwak&ov;&sCV4h+>G&SHWwO9=oS``^%j-jPd8x-W zi}>1ZMKrlFD#F8T96y4x!`!W&^|`xoIKaIKIIH!Nxnk=B{~muA_#X@41ApFpuET7A zKlI67eSx%_HQ;2rcvo^Dnxz$6`@<$Sd+1|^=BjI=WkYiXe)`+Be}o#Y+pZ_mE_zUP z$|eJIds%c~6)UPRDR($muBSgzUzbb8*4Z=*OGMFN5G18pr;{ojg#q4=J<2rhqv5;K zk;X)c6boDE@@?Z`J{Pu6qDeLv`j7)BIkVSiSz|m{O&)5$Bc5|k%^IPBu-r@eB*El&d%m8Ks-1(ygrtgG3&i;gV zyGOP2U%ct8av^#iOoag;JK{Rndb~2{l2==&=h`Y=hZgPPyk`SK68;K2&8a3GIa|P7 zGr5v1V(9N>%I1JRLTLCE%83??p^;iT)aO!4SV2H=&Ar?)el zxK^TrDEM*;&L#;fc_f-G%Pw`~rU#QJWC~}xl}Q8qrOHHNBq>$A~shy(+-I-+;7U@CgRb(@*;&FlYLxdkcd+BJw%mT5p zk!~hgaQw4Ci#fwnX}wD@jNJ5cY7SU&YuWerTpHkIg)^vTB)z9rllk#b-5mtxD3-xl_t5Cn z+==Oces)||4LQ&4dF(urP~CT2RxLJA?k`$2D!vVpGAhQgLT$L1yaXU9UU3u2kMyA{ z!7S5IG+Q!~nY+s@*7VTM++-HAc>XA`I8*RBf@sZY>HpN zbC|!^6D}0~oY>#-{5~H_uYU?>QzTNa=NOmLrDp$B_8EjV`OC_eyd^v1Ux-gNPdZNL z&onBNn;}Ru;Tg(AQR91@!--(a=)`6_eR4926RljpiAW+gcNjy6Xctimr0{Yc)zU~M zxK|R8;wF0PPyQ~T_3hN2(YlJ6-KHAkSws6vul@(i5U)cH1`pr&`MXVNa8 zQf+L4I_+RNx*ca0H&JA*VBA@o>*@P7{6Z0I92A#3X&GH_BF+H(0QT@^g{DI{eO736 zi}q&TqR9?o_bO~YkUGUb9ict9EM*Mx%|lVG9Ij|IUwgUeS<#7KbkfO1Cq!5ML`zc5 zd-+H^b~pF%nc{yP1g4lx(7^&;dmt>ef6Ji2_oJ}Y`V&ItaM`a*FHfX7OtvsKXmMY0 zF%37S@2hXR8)PbW@4n&mN}1BulxP1#q=E!R$!V1bcAe>8B;4BVeg@U?8B)53BBa*J zhWPE-5Vs=|a`l|Nj5gSD2)^t@1RAHpcvtOYbNr#;1#v@in{kStQjGN|_TkCn*&nY) zn$X9G@%_v}us2a8YWRLV{L-j;KvdM2mYjYq<^9mcSE|z($ouKb$y3e1RQaXkH3W5; zlOT`nbcctxUJI=Zms{7sl1Ff>E!?K>;3KNUeuO4Yzo^fw%->KzIlY=(v)e&qat;{= ztN0I6gn~4~#pwvYzL0QGtdem**b)28;~S5nnNQOugfMiEXZnG?;_NRd&<*p7&1)Eq z;XO`IQNiZ`${J41_9A9~zOM{S%nN4t*}@r`2g&2ARS>6-ByY7?Dox!d{S#GA`dR%2 zsyFjR+di>#nDDG0TOUF2qIpg#>$uLrgqtzwko~eLU?g!XkQhmzT(y8(vVf7Y-5+mQ zZ{a0#sI?P61aJ*AA`$PH)i+ccvi!JWZau@2d5m(t+V zEr0b|(U0O`%9*?k8VbeAeNxtrkx0jWHo}xS_EQyu3Lh|+i$PNC?RXLQVmf?G$0l_VYl3u_LZ0kH?y$5<= zFw2$}0s}9B0gT~)6pZ067^V+fbhM_vEz!3QT~wtvc|U#8`ir>>+1?+v=#)2P;Xhfl zek>Qlzq{y^M$Xbpj(GDr=LgP*^WDM;cVB6G^ax#ZGeGX|jk5;#NVNY#| z34p=5Tjtx}gc|r*?~D+;PUWciK?Wz}VJ6pIr#Jst9WK$9(~Dqqtjk>Lmy~a3;w)Gm z4-{U@yZbOvsVYG*N9bmqGIJHe49r)FFhesRV_BkYgljS2V($ZbE@jl_T-$2W`M|8@ znds|L$!i%PYl3iXGGvZvRGD1-bD?f@=0FFaSJ8jTNHj>%J^|WtvJ*LE`v!#CS6Oq(@%XMVWSJA> zFrF)6JiEgLmNp`&bUW06_XNbGCF+bC?tVhQ;5mV%(hc+$FSCDD;ddw&s^^&#%zCWQSk#L{OA`^>^?%hSWkl4&gfEadyTwb6{!AYrw8$0S38` z%uXRC<5EoQBA2+_Wj_LhyKUHVKfKuGqzWA1q$6EU3Wh7?IC+)On_b(Ad|8O(dElpN ze|;z_qz8*0hvXq}m8Qhq7>jVOjUgnKr=u=*do$}`EO6y)eaK936>+^C5=LP$jx&Kf zglK0?U!q1no2zPcN!kOhZ`2%|QvUP(SFa5P`v`I7J$ifpX~h#gU3tTK0hY^vazTM1y{bRk@H zhih3Zq!>aZ&Ul*O=5F9B7RzNm21JulbXxT0(xRoeVz6oN%NH%ZEqiY)TKe)c!aub&AG(A;y9)Aj~@mS_KxQoT|Z86nV{7r#IN^ z_mF_3*UX{e(5@lH8Le{^GWxm74TP5dOo%m0SI+urrihTKdlT(7Jw+CbzRofG%76;X zh|RHC>gf@2sPt~ge0H(aZtn#k(YF@US|5r$J;(gDatKDm(5d~wqcF|4Fv(MnmY<4%TUwhVu}R3z>cbYKqfre}-6vGU%{s+HF+f+}*TxBlx-uDW8K zv*>eQU1Vx3?PnbcP24D*RG=|iOAm3RpxQv$HnF7|)k_;#yK!&&)R4wgU5CMbB4=%f zvab-n=Ml#LvD zGOKR2VBjM&_hO`RkzKKr+y!J+iyUuFR`NEMua8N?F_Tk*T0wJ)X>FygJA=O~`I}*H zg0aYnxU%f49wLdAvxmcS(1D6^XsT~TT8WmA6=vQ>dgMs0ICY9JTdB!IxCOS}t{7I( zTG%25J1eu*9820}A9#bcBJdAGxfR0#WiP=L@M_1ICLXnNjYL8JW161iDd2DAEi6&bIh7H>;0v+AFXdQu8DqQ} z25zI*8ZHwt?{E{#y_^TL-^75dF5j>3d$cw(b>ykF|Hs^$z}Z<;`QJ~T=dQgZx#`aB zBm@$cgonPJutU>~N>p|bRL}$vBAXJI2m69(uD1;exB-H=M*c2Q#(f>f6*t_s8OL>0 z$hhl_+l>3DgYWluPCfTNx6?uW&-;EpZ$9b!JWnmBPF0;cb?VfqQ;Rn@M$Th3P{H+` z49m?UmXKS;TD@uIID4nw zq$-{Lyxz0~o&B2LwBDTk54}kbI{RC_X)P-&H9ryr`5~kX+A)o4Zi+h!H_FqTwGVZ% z@L5duSaT}U%#y-MU+vFJetZ<^{>x~7b}0$%oY#h>@$9Pn17Z`yL6*Z|sMeN4t&Oh4 zxC24ay(dXf+*OPxW;Buwvvak7MlD*Y_pdov! zj#A0qO3nby-bx&H3QdjeSZaZaSN`+3PYAF4t3s-MVq>aGCFYu5#eCCGwK})bLWK6S z&BZg#_*9YSD{io)t!I0!KZj?yQr9Ar5P5SyQevD(dQLiP*Z^q#=(aV#bp9d;p|3oA zf7zME9hEl_{tM&Z9f7fM(W>_3^lxs2(Dpmjs@mO~8|{5+M|^H+?^Eijxkm3(dxCSz zdY{@=wlN^vPW@}&DUb&ILwYl~AJLm?-@Z$4s%rb=db46asW&U((|QwdIY1T7iq00v z_R#ID+=B{n?<3*7I6qhU|8CrUm3LopgSecBVFU9q%Y(T6LY`f;!!`)T<2BZ>8K?iU z7b#8LQEZa380PS*b(`(ajKR`><^8V&<_JN&yttqAehISA(PA~v@N~ZR~5UE!g zTS09==KZqR0Zfba+LtEZij~T8nwtlD3k~WOdgT7yLx1i=n3Um?Pi|z2qQTUkAGZEX zzhYI7JF7{x0d}I))_o?6=_a~K5`T$Q>tmReqT40v++D?6?pl0&Z2TUa%hLS9LmjV- zXY>6L^`#WEbnoFjWV1}am$Ez9%UEBH(=P+rwIZ)m$b@Ca31nwNsotP4HVI5w62SSA z@r!gZc1P(ylYew}5@zbIFr>;>p`jRwUxl3=ua9?QK?L*r5QSIo_BeAFAMn?`S6r@P zdMtJH)UYO8lO$!AiLkA8UAP~rHid9tOB{;>5usxw&Q$MT%+({9acGI_p5<5yhJ}x; zE6lZAw0oU2f-Cq=*yQdvdI)HYwx6oO1Zko=9Vu){7pkvTl9kca7~3^(W~ZXBZ!+;g z?SW+{BgNax>=DM6IF{DXw&UZ=R}|oJNAwo1+gOSx6ltLFK`$p7`E?w&MI^vDuUi_5 z^+hk{*4*B+l$x8t0)`?l5q?l(?}Dgh4Y~W92rD^EzasQSVz2gx`NG85G7SFoi;NgG zmKmkx{_Ov!ud1+{AR9NH1OQX=_Bz(J^TTF2;0{}a>jXDH)37op=(n`o7|Tp1CN#U6 zDYpG(R$&B`m8_hP0yM8<)uk;(R}!AK+GfeqszF@h!?Q zKPa8n5uPsTiqqt4g?$dIMbp&lH$Hb5x3F903Zn*vSH_)mm63{V6tw?{y}>AVzLK`u^q_yD zADyG%o|OnUc65~g(_HW(USHwut~R1=Sf6U6L0`5vIC$Tc8c^2`>G^+s-<2{K?z__G z-*Vs8HQ>xz3wrYj>#)LvHFco#u-+wD;^$_6)Vl;rJdc@kFBf4cy(*~ZUM|8CEiVU$ z0h&*`%8`?_jkN{R*bMC>$H(IWX>2ktrjh6{uPikgGrc;=ixf@^q_YG;A~2A9!Cmw0 z0Pf;FzjeCkb1z>c9ZTAw7Q;*t2K0yV;%d6DQ8P<|eFdx3-A|8lca0v4OWn2hEO+;} zXQg`pPXrRt;QJ}-cV3n*y)e;Y3?l>_L=lp0v^ym^ z@ySdl>v>+IXWTiEXo-=E-T->~hG{96g)NS%bGKqOWb!Nq0o4q@X8=HdQpuhIj4;V4 z|H+Zvtk-UVXQ+7&x(*vTSHTqV7hwbWO%#GnnejOs)|e;-k6@4}clLJUPc;+p#!9=F za7NL3C~qCPMCjR8|NIwyeU#>dDCqB0)tmtHxgw8KDIS+ExsXPiZmIM8hW^vKRLRP87O{cM4Vptba8&Ygq-<|DEQiJGHajF8j~ z)>sMVE65v{H%e0tgTk8jtI#fBjA07CW^sYYrs)6^WhOR{);Y6i1-;YEsPkeaOxLH+ zV-SI~>gNTOSw{XGWS}-&+?!$+$TPQDi*;1XMYb<7bX2pO!1_y_8hjmd=NsZYONm?L|r^X*Z1D`7#W-fEPOT*`ZBiUuJ)9Ca^Go#RLi&faPnn78LE^M+#< zZrNh6mZ1!(Ol1E;>*OZCjEy9EAvnQ*bta^xHJ3UmMY94<;e!)Mtqp5|Xi+aF%I<4* zJ8EVC=U}F_{IC=cOw1?hTIskWQcckqKr-ROU~v<;#h}J$RqVi}Dnz!=dqgFDndPxF zgOVHnXmlJ1nC<0O5J(o#bx|kRe_d@dnI}}3)+w%|-OS3oAFlPyl*@0T5{nSe*QVE> zRIcOHo)dE_v6lU|5L5=WliN6WJh+WtMcgM$y@%|={wZ$Dinwgh(Q z?!`UjY0^E4y23V&)Pr&LXMl8%<|CBndQ#*r)nAEv?V|o*@k@AOD5R*3@`KDO|6t;0 zHIF78m4O|z0cRkXz!pzmEpwR6&%nGIqr1MpDvsAD zS1Ba>6ZmsFx92Nvk)6G*_VK^Md)(Wynb!fLR^_&=#kX0s?cU;?e>rKaOiz*ouUTj@ z9~yVmQeGqWUxr!_V0TQlDb&=$500&~ys;NfQgXHElb3H>zRh}S$Kis#t+}lo)37^^ z;LC5UP(Oo{(}VYqwOL}~MX#-x=d6DUeLW3~#1AhqMImUFy2lY@W3<^m0*370i7O%V zG&A$k*moQ<98YBa{&z|^xw}{5L{}x|u_`Km7YODo%UtSuKJeA})HwXJk2mEG_3`ix zCYN;tX`ygIT_{||EEKMCE&TFTl^Mc+{*@VQC5BoSuFTNwA9ksQUzt%0cVVy>*yN&&hFyix=v{>Y8Z)SkrEaiH zb`wTz@FonQim)sdffwg#{oQnz=rnbAhN~;FcgZipsJpgu_G$2W(2}9=EaKUfrV^C6 zF?+Mes8~}d&E83X*{h8qcs?CYU${R5ch7L**}Ify$R|DBn&CHP#2t|Z{+N%`_CwTq z656?%-G9+NNf9->Dnr&3TJNY%r@_Ct^Kl|O2HaQNgp42CeJDs%pcAe`39oZMs<3(V z3(klF=#iucO#5go3A-l(TuRd2j}=kOFck>+%(wj7jD-%j>Dr8Z9eG(#I<-qp8l&7| zViGhOT(^=lqpe)6gT9s-9AnN+XMio;b_st|ygZ-3arI;PC%$?sVY3>(8H;-<`+R1R#;kYU z0DpM7^B*d_Ehirz_?Xkq>SMu~a8j4tCG@TElM2RA&F8>j3(g_3zr2tIJw zu`>BkN$6+HKQCU42RZYPBR>a2+|AJc8eVY|bCfxeZ&otYu+U0nqME<8|0Lt5#pRWi z>`yR&s{L-R*)0R3rMh_=3I?Y6`U4r2K6oI=>R*q0C*4!2C$qZ_{B+Oo_kYm)nR+jE zPt&8^JzWnw5Z`?Wukw|gw41cH5o|ia8({6+G4dt8N@*)r%1QPNCbE+KmhCrPr7q%p zG*Gf1YF&esoytwGA?2`HM(NXak0ITUlny;)RdnVyg^QwNj?HbND$#QZM|V#DT)hYh zVZ%h(pGy{dfIGdE;E98Y0}v!)E~f$!T*KG{7cF|G`wF?JwJ#}3SCxQNw%^76k*>Aq z3Yk~)R<>WV>LX40ndkE$w&SlT>yc%gal0DpWa>B6N)yAe;Eyx8O2{LbCswLC6EYIC zIa9J;MX+Ki2|veXzczUC_-cgBNmRA6xG^m_?wS5JnRKn?42?Td_U9-*g)M;99L#J# z5En^n2NB?vDsJfs!UF6S%3P}tq+n@R!B{FJX?3{@Y7hiVfj)@V1&llqOi~Rl@e<5s zJScSg@nFW1Oo<914L;@t8Rd+XDZQLclS#=_7V}V4Kd<}F49*nA zho;HqvfhSz=oT$p=^CtIhFbf@Q_W;*EH;0R+}J}&W_vB->G6XzfnoAk82Lz1EEn%r zE_hfaXkW}4%jQ)v(6RhQX2IuMwd~Un$dE)KmD*28ntHvrP&MO z-FfbzLbiVRzpRi$r!Nj5`B=#+PNLRo_H zx}F503Z`0ijR;E*CWNuU93%^;`SF!J{$$19M}Cx!+*(g>3rr&n{?I<-6cOMs1(`xp z<;xV5E9LxdOb@{I9cMFa=i39cP=_2!*&}J=BbH<8ZZ9KsuCCFWjQb`cRcGd3Fy_NT zk=?tRxA`L5ufTE_@@I446p)k0I3HRzcWFIl{%(@k;o?)S3fFuDkc;WgBHfU|;cymY zv;=oCD~$7N1tAOq4=P0oM@OfcrKu%2y4g#T5=q>FO1^G#pF2sqj)szJVE9F#N%yC7 zA9Ot)PmLr~b%fgGAk?E~pPT>MF`?-yv1w`$NNd&5gh~{9odJZ!X^yC;ufAWYsHZyfJi%n!3k(x&9 zSN|7zgS%}(M2lmWz=bQ`qI!^5k!@v7UYp?h*_w%~#sjf}D3#k&l(fBWGUr%0kinFN1*8&xZlgbV#(Z`kA$h8Bh$h_6a>NJCeg`EVgR=ph%BK515yi z*~En&PhPW=U%hd+D8kCg^*9=r46dOTx2r0xll={SIcD}(xC@(2IQAR7i$9dM+;jaL zcNA_VY-}G%op+qAHebju_-(pVA!#2*B1Dl0;fBkYZmWY+^!vTV@v_+4&eLY#a z=h%BkF}6k9eS!kkMr-jK{$hHvd)~b7bM?LE1dn`#KGM6WY4?$Ob2rw(lsV{%a^p>X$x~9kEY1PK?-U!PXtu-zs zyx>2zWIpnj^y4`EqpYT1Xod7Ci=q~Su_7FTjECtiBvuxIAxp|49c69qtV23omAlkn zCrNf%POW~{20IsKNzt))A+WGD{RPs(QqC6b5f;PxOf^k92JwpQ8WX%B_jA=)D84QM zyDM&b$|8K*s*-X0T2aws?e!UY-Da=P)a&DTO?(^YV3eF8vmcq2A`Qn{>1M%ACbFlh zpd|O_L-D!BG^?)J1RfB4os}paeBTb z;@k@1zQc<@6YbuyYPhU7WstZTm9A2NTU1YM%Wg^pKAbQ<&FUf`;q-4QJ>9UduIu4v zJvVbZ(BW~%kO08Pg$<)2Kuj3##hZv%$UA=9mh?b$3pc(B2C>VJIeF!o10TM(LjD(E zsl#^bV#dEX3J>ecaqGuu_bDLX5#xeXz+Y;9eFei1H8?pGA|sKwBc7MtV9o4N3Q*MD z!F!)p_|rdy&+x;pL9~TuG5k`#(Jw?-%?rOjVSl6tk0Tsh?VrZP zsl1V2W6{PaE=+NR=EJJGGfB@7jti07NqurN52whD)cfPG37bQ;ufEL3TKX_x2|3)Yvk>GrjO!hq}FK@B-@{fE#`F#oUPLNlVxW$o~U)MB3XJ3 zS-KtGs!4Y{5AgS)bbF6>q=aZX)Z!^{HxLM9lVl%+TVz)P4IFbAL)6mg&tP!WlSBo| z3q}S3Mm4*R>|RikQiwV@H(3|2D!{X*Ewxyq( zm#(>IvK)*}?v_3KBGlW=uGGkcXcZAarst`uAm(O7;d7c155<|Vp6)eL zLOjyNl~KY$x-BO%OAZjYI$qj4jb#1d)|^>E+1t;;;$=InXCF7%$9!_`WqKh|=)c0j=SzWsWl!IY}>Hj{S)Vdn0i4Sa4@1f3R5*Gj7&bPFm zPvUR-P5e-(qlR+ta&^V@XFPNvv~~ODg7sMdrLWEh+-lRPCTUJ^_w1u7E3`>|6D=3a zZXSyH+A2Ku$eweI0@qnrN0U=q;0sD@qkZ88yiWfJtfZ7l1Rb#nzbFvs9~dtm`^kL5`-eMJ$HCF5pWbj@F#e zezqE&7F8Ey&*5XNHa!9~R=&^W3u~j!)kJyg8VIQJC$vC309TeB0*Og1f~ZAn`mdU= z-VxmKq28&cuOM#yJ#Qh}=R;1=+0DJ?%h%X)-FZ(fWA>)m;_CRgaW70;aROuP6E)xC zs90X3{V3T)&UH4WuNy<-)79k8VYu=x%sZI0dTcDN8y{dzr%_uB5dVY#kDsPjg@;Z$Jaj1u>P`udt2OejY0B z?M2WVKD!sVarSuiB;!VVFZ%Z!{+L{&o&3q(`h)a`xaf)e9RxPq%GBGFQTVg?rUubR z3*q988wguzbmJ0yve{&KMu?i!T*#{_doJV^>M{@eEx=mkd9`9we`o@ora!da&5pHA zN<#7$eL+u#@)XX1ZoVR$)(jcVwGpLnzGBtpRWP1r#h8+=f;tR<;#Aez=36aI?bc9K z4){NMfZbp%Ktl5?ggz3ouiBjcj(TjZn2^7<;`sUodD zAMQMgeA4r)$&DMRiYEp9pV$*xOn#ev7iT9OSlqdQ48gT~dSV&wa4nE?vr!!k*ZHU8 z!@v^IhvXf(hVB_{*15M!!8zw&sI2b5q0&k%-Hc>lDCGUVR{idn*RpNa-s`pSPFCbnHZ<{uk(#8@2 zs)zu?wJ+UXlLRnY)9gQ1S_Ny}D05E93iA>+xX&B`05@xr0Klfaua1h>27~}k&20E^ ztUVNyKTrr*s6yCh`Ho}}8y8Mm-(R$UsfsC0{>rr&327sSyp zMD=(mtY%`{<}t3$|tYf@flf58LSf!>1sZdg@EQ+^47AO;EO(6ud{VFJX$N|>0eS~>KR5rp!`~j4>%0eoOA(WU6l`pDw4@? zVMJ)=;^>Z~2kq;JnM!@IQhsndLJEdv$%e95+Vn(?)XG==jWyy3b=I{!1GS)~=L@Cs zUeK%;1)AaO%aOQQPM^ZdXcMZ| zIgnbmT1;8%Lq@Y^FP2*e`P!t0r;rSBQ|^=-WynU}OUu4{w&COT?EA)uY|-Hv238}s z{P!hEwv=t+;c;Xg&OL&GR;;wY>eyQvY3Z^6l(43$_;My+&*UNi#F&JI3l<%->WAJD zN93AD1^Bj*(Yr5YdOk@p5;MII8J`cKtYL?&HGt|wefP(PPa9cp-FkC>{ z>tA?1W-wsbh-j^ zzXC!pRhz6tuFzD{s8o9IO?LYph>=w7)(U@rd$CAwnB2ng8oFvr_QLOE@3OjW3sXXq z@;z|oiE@@%@evgKVA^Ps28^~g(UQzF*STnEs{#STpF=KM($D#Ms+Ur||KjgC^whBG z%0J0?>-c*nVXx;ex5v>MNbkf+=XJgfJ4piDHk;O5Id}kMO7kX~hsg z2jJ1kW=GNiBo4sV`G_ge{;G#LIHPo{jFp2xX+_+81vlSdL#;wLyJ~`Q_k@UrX`|HB zL&*pcPcqz6Bo>2-cwP}5{vo}j6@qb)PjF+Eu0zzSn=8x-NJAyEy~%Kau0pcBLxS)x zrT-wjzud|qi6TXJ?Zca%@sjV!p#K#uY8x%ka%^Me0MSa)em|P9p`gdcdaC65zz<13 z2A^(4RX`amjkN=nr+sZs?u2v3g76O~Dueq8#e?vC?ow+Q@`ek$X{0+y`PnGZMxQQO zwe)C(oA4`VPgQ3VJsn07zUk2!me2CekP_W$B>YOzvA}0dsJa%{!@96cYq$#6ilxVq z6C!3bYQcUP!AbTilZbl0BQ~KboHLMorYB4K@tr^KlmPC*fYB(4~IJ>U48XX>bqhY?>?1?X!8C2jn?kd2tk+I zP%eD~s5W#rGoH z&opva8#47;SGhu53AGhFhwqHjBN(i(>!f=fv2lvap-Oj7uWQA_jV`)R=R2C*MmdVf z{_KL6-cwxbnI0gazgZ6XKcMXph*I}jJ(}CP&(JgOSQ#C~O=ME>b)TtlgX)oijd`$A z+Yrni#N@9%wAFMt^nLCYQou;(v zB&Evca%D@#xpR&dLg7IhG4oS3QE12;hz#M{mH9zG=G*<4AV3$|?mnC9F+LQ%rTZsycP%q(uuOx7A{mwxev}`mvHi+KlGk1&muj_~)D%&<2VKgg8(8gH5 zj_yVqxnKc)nae!jbq4b$2@CvF%b(28Dg3D~ze14am3Q&}NVC!PF0}Q=@+0xjU?kZQ zflBXU2Yp(56b|_~K6k2aL6h$beCrS+&(NFyMxSlr-cnPzG7>d`^qYH+POD^vuBv3# zK{;XA2;=OX?+;Q1W93JyYc*7_2kE$d9p!az(5stYJWH=}N0HeyR9?8;{tI+K_t`{5 zZX%#pe|wJJfS=DzZ*(6-FCf@Bgyi)H(59*JsoDQPPdNLceWk>)ayC&;dXkQ6JeM4K z=?aZI3Q1oD&aM{ihE zW`lsm))~<)cSl<(LF{b?80yY!NM4*LAExQczOM(1%;x|3Y35}CPCh>#qW*HZfUf9+ z*&%dXilB_sLXo=qF?+BoyHLi?$sGir49);cnjqF0JQZN^Z9-6VIH^gK>bCa8s_=J*{)(E z_s({eYz^`gn-8+f=pC%tDr+{{tqkUGuD1_#6>T2mR?*hfzJbO#M>2#DH7B_D@)2kS zxm2`bbcnxvsLRKJG8&=g8SP`wj27$}ZH=Kd7p{C85uP?|tlUZa1a-?06C?WSN)4Uj zNV4i;?Imvg((Tn%mkzf!pue2h@_dPX>z<@v(-&_2(zSZ`9NJhU^}d&~<&saLpNTtS zGnHm72;~Kebuv?wQIZo#z^X8UmB6ToSwI*wB|8D-12CTv*;boFeK6E)zgR@30qN&A zZD{VWq3Pqal)Xe`Ssb*j)5B*adns|~@fN^)9GZCGgJRwE9mB@1N9=dhe&vcu<3{dMM6JzjIfd)1+FUb|Jy+GO*{iF>%44cB?2Kad`77Ofnc5>h8@ zcra>;g8l+bIFl7Has7fPR{JPDmolTxllP}Bo{VW3rw3%Kgl|)U>xA*_6mb!@@o8*qpOV%aUsLDGCYG%{(X4e%@nwbn*on z*KXJLeuU^Lrvpv38y0(a(MUI{*W6*l#F*bdp7Z~ywdNlw$4qns#Fs($NlGs(X#9IwI6D`n;IFEA1ncNL8ddv8DImy*-`^`>Cr4xPjFBFkGv>pg5HWiz z1RZxJbGGhye{UXm%)g5*qxo0;Y3|j|pc}f9*rMH=#()&?oY#6PBK@w80dOvVpk0Zn zh8UW_Oiwv37zHoF%m*g7Y+W?7bJ2+8mMA(aUisK~livF);iP+;P@wkGL5xBFZ?O5Z zqhNFd&t(a3(=W^E>`l;W#PW0Q7PeTsFCj&22U5E)wO84Fc3-B~@pPwHyG+APKR(AR zYbDlOap#33XfH#Bs?*$W10q+)SJJoh0=vJRNHcyJ#;T~6zEcH8)!YHg%sdAyxsUp{ z_BGvNhd34lOwV~p7bkmckV|0pHdz!s-~{*8qGox(SyAiVyl9<@L>p}so+;PyqJW7z zF9uTfZQ6f*+<6i2zQRXufz=GBcc_N@t$8%FOjil0p&r@8A(9OTh7XO0sb%5gY?9tA zx4{}@;*CI?3iSEs9syx47ScvTtk=%`?$V(3L(*O`&NQRxM}T0_O#I1iIrhZ zP@P@8A-rZUR|5P8UdwYmdn+n3yONJke3r?+HEBPJj?h(N>YeN&xjy7W^pZWsKIWQL z-ZQ;pVDWM&Xg#)L?|=sEBw4o2Qe_X;v{%LgsLXl5QuJ@sm925)W+6O;TM8k}9SN#N zAK_#k!b9!bfx{;9P7u)ir%h>QkxGgpl+(A<*8`W%{69oX$D?O{{*hf_vvDlSK1wpba%Jwx^oxyWBZ=Ya6q>cSBUgAo=eNBW z6~i)vo!YhJA0MG@kAaNbS3tFO5>0vr^eo={W*`X9zMD-mJENV}))xS8k>#j9f&&+z z%s`74^cHB{NKi%V`p7`*J!3R)gLd@D&*rpVj$RLP@7LT^GBna}(|+6{BW5#q7`3g; zp`m9S7a4PQ!JH{@r=wQI`N8xm!$K2Sp()(ZQ@Ws>} z?UMEex|%x zC-ESUlb-Eyw2S@~)cCJblEvljtM#PEPhhq+#|Y_b;OpI83NCkFW2s8r*Xr5+44k2R zhrPan0p0z3dwn+NQoFCSSM1;_-PiLggxRo83qq zqiJ1l3lv2#xOHqc`xFkI#7zrpOZE{hNp>@t)|<(V;A)a45?2=uUO> zO^xrHJOf82I%?FA*l`_J0=|VXBqS7L-dn3b&+IH`T zYT^yFP#gTkV!f5T@Iq7N)w!EOLp5gZLO0I!ZS%Wn=4!&3Y&3p1g0t^a3|H~}3whX9 z`!G+oXRT}GFl+7=R7l5JgXO5WYYq*|QPYBdFDZ<} z)5-G@>4drW=EE=Xpr+MgBy;tjYJ z)l9;fn|q7c@VDs79cl>cWd9WHPM+4=QDlos#YB@A_69x&8*f91@4nH(Wh==(Qgp22 z`X&Og*~>>MV*;D5xTCbqWm#ZPTw)cGmUkS971HsJF!(f%iO&;a(nW0}am2SFAYCkjFi_p(M#)S%T4K z-7AIUp};;mYeRk_l#TO5o}#)XHy`kDYPim_vV$8c8qDXRuSL>>`kt!x=1_R&9z7&q zZdH9Czc~G8V@6CrZ>FeHe!o0J0M+O!$(8FMWxG#4W!s|FeGADg9F=hJgVBE#L`G@sRujuRcqRIjGx*)i za=640WYjyORMX!Rw!f)oNq*U);{+!Fk$z^pT4S23NJV~@lmu?~TNS6pJmR}Hho3{f z8Ov9?>S_)q4j^$*K%#Sfi5}?pEv_C$cJH?UO8?v((M`_$QkcnlT7#Z;djIa`M^WDK zPPcEP9b6;_n@u!~S_`wQX9x|>oN-Hi6$Yu$>dy3Qw9GE|Sdpi+YJ8Ie4uV8}J%X5F zGVmpo^>^MT9d&HBgjUG7*?nlFwSO&Z^TL_OO7>s{U+zl@P=Wak?`GJVM9246cQ2J4 zJ8!t1V%TZj!eIS62(@qLb9+?H?`j*14t<~<&apm`t-)%udGO*l(HVU`*HFcDS;;&l zSNb(Tnks)|`&$&T2Z@Rm2h&WZRz+ zrydr|6E6|~KXLnYdVRgpPHv0SH|RyH{x|A{J&!k804&~g9NVb){nVDF^vy)%lUyw? z0=`FZDSZpS>FZ#7&NnrogF*IbEeDu#rw{PSSjA?vkBsT=pa^WZrd4lzP?$n*ZYyqn z(j}~{d-vuF6!YKqsOFIgk$4hMe=A8jLT3hza%5qtDy)hy0lc+%5&(jq|{qlY7Uy`ks^!qrOY5?@H+# zG(Aq@VAs%1(l^?-c-1Cg0S{Q&JIDYHFt3{1mnrVudWiKF64iq_fu?O2aug5R{zK_E)PwqKtc%PYm9+B~y3$mxN`HN_m zV|Pt#-jq{#WDh>RYPQC++mGRDAw;fX@Tu|aM)1y_X+U~aJR+W*ULbg%c=m(^f`fa- zhXofD4`)jty~`BiY@&w1hZX~G2)f4iFxrD7+xO`;zYYWu#l~ShiK6=(|MWXR=%$YV z*Y4LGsm*QXV0wnWZ)n44ZEj2cp@lHt=jGpuJU{<%T~B}$cZ9$!Vw-P{XY;P$KrN0W zHG2|O4oSE2>MDA_=5Y5$hK%cr|GlT~(=8TE`+~izvDoZg8@&tJtODi-P}e)>&iGhA z9@>NSlR-%6kDf>!_W-54G^)KNXWUT>`YjQ{8{4~T`YUnI{Kg7zJ6Ae<5%L`yxd-YG zP0?5WNdBit_CO?CsuH$5mph!CR(3yU|B}yJ6q~!XUTh`1ZW&)UxZy zkXOg=izN4LLJ4DDMwQ+3C-ZD|Hg{P3SOxI;UXU4EvTVt^^qq{zv8Cxh@R+(^V=0GM zIPAvXsKx|;`-H#NS~bIO)C@W#SWSOzuZVutsJ#g2+xt)r=!TJHOAIUnO|-(pusMet z6T&NNy7adKgBK^Hf@1LRJXqY%=#;x+%^Y3LA?rE?j%Poy>Ilr)-j^_DZhi`Y~HmtcsYL?`E%YFMPKJ#eDDYS9U8*bBnm%)Kbc5LsLlUL zX8bM*z}4>yfXC)~iiX+kBwZV)#+9@NDn%+AU-pvkdQ=Dh$!(LK1@65&$!2ecXt^KTnH9C?2i9oSX3x+XxdC8Ig)rzs-ujJ<+)uoIz}B6!1X-~uS=aqa>B3BrAx ziQl_v@J=UnQn=Hpcx4m2TjrCp#y0PI4xm`Y``34%T(?_3TBjg*W`{u>t}m2Y>?p*m zak90s^)#JZJ+n15%P$b&BKt3BcBayJuR?K(cW%i%;ff~#cyqYo2}^M%awc%32qdxm zLMPYy6)toVo%sGp620p^(XeO(haJ&fpNN`7!CR9^vdJdzL!(t|gmDRny4#ASU9TND zCSIs|wNkihgga2J*3+*NSoTF3cwTW03!NrGC2^gi?z;h`FQ{jxDxh!V#7mb1x3pB7 z8kGw9b0h$yv2TGrL<;v`5r`5}9=ur%R5C<+wI`nl-MDblr<~4(7OnQ~%$j+q?R49< zS<&u&N&6;1*|}arT6YiF#U@hf(wMHpToU~{S+uVzs`g`3D0<-h_6ron#z{|)jqRad z@C(evV6>i-uk3c)O-Z%hy+{bly=#$jJEcRS;iIA@Z-Y<7Ft(YKP0o#Gdwk>v;v+dz z`JO%|`;kA|GxBS3`a`C9;H{15{PZ6+_}^2Mv8b}Fbno)V(k+}j;~EH9<>2D)U$8S5OdcQb$DMi%RMc#wHj$HQ1YJw> z2)2`yC%HEc)mqH;aw&&@hT0z_oQXr&cuU|W-2QWBR`j8$yb14hsp*R+ux&UncU8n zT~L)>!t7~jZ1`tChw|2!C$=n2TE`}6P*eiPzuB>bQq~!)>gKNX%Q~wJUuyqS6%ger z`JyHktU$ir^|rqSmlJ*b86p)!#8oORjo5|_g(TK)F_kWY=S$!xMyDBI!a%Jtv3cEC z*=VGJA&~kvSMmtrVSxf~zGC8HBW*~;h6>kBgv6mfRU1|zd2FC}_Lg=6)r@Sg!DR)& zQ`B~G7kEInW`hrHR-r+97|UYX`~PN8KgsCJi8b$k^vES|ady2#%$QF*F-u%on4Y6} zS?r^z=2<<^1VXb`#}PTwNMcm9#VVV|7KNeF&6Z%n{&m=h2lR3FmH;P@aNgti`0(8=UAQ8R zk2+Hd0UGq)>qXjdX57=Q-JmfTx9=it;FHGJb-yR!YlbfE$!eN8n0+nWxpkjEInO=C z#?Vbm76sNNUW~jTe*%rj#?(zcwkEld&CjsL?tF~$)!}{>|=Nszy<3ytcneJ(rU$O zXojdQ@jTup zmiB#rHO|m~XfP&Fy=emNHJJfhu+eO{i24r5f6CwEYfFTw^_!KT!6(tMmnZPTFZc75 zBTn>3XR7V+og~sakI`SCmlf)vzXOaDLsbUuR}mUWKvUC~a=Am631g1pC;T zKiP)rytxMSi*rq4er#;+nuym7Z?;|xeIJ_+BG3gW<5^3;N6v72w|(jN$f>x4s)IQF z9=TuK8L=<@>Hw0OE3sb}ij1(Zr|j|Fuh7jd&kW3aUnMy1DAGu>IPaCBpVEO3F&@(S z8Y%KtgiVfVN>W(*b$&*sKTgVNbj2bD116G*JO9e>PM+W3$r;d`=bWKQN^ufWOI^Lu zs3B)gmf8m+gy&6K zNE>h0s%yE8({&v+5J0V+l6lnHRSWnA_kKYKSG@B5n^Fdqy5HjAYftI2&a(Do1N=a? z$$a?R9CZM3fd-T>`v^{K#31~LhXvtg8d8{)OcI;&<81F6Mb19<{;0mc2|fX)*7ffO z=0iynr{5xizDc^@5l-dqJ;I4D)Mv-?-;GMk@?X_ONzlDp={ou?Wp^ucoE`+iw428W zK=ZJq*@A=U-JFJ=7s>2F)2k9?-{&2H8j;(}QA5oBkaF5}+w0lAN=Xd`MdjB_4*5n9 z^^~rHvyjm_>=3HrCm3OYSL?dPF8D%4s#=lPrsmu#hy z2Es#nfeGP$M%&iAae4^l)73OpUl6mxzpbhmm+(G65F7%H^x~U`!k~N2t@V)S5RDXQ zs+XcqQx^1tK20r(1mAFK4HvFYbOgcfCvo;qBsch%E)|2&zsG|sG9Z;t zNpy=l3druEnIYO?`tESx+rK#d4pkGgP?ESK00lDImc3bhQFH?mXrUGzFzI(J?(ErE zG`rsykfi$qJxbjl>M`E^5szrHpKQXDjeD|jPnPVFELkX74h`h0kI^JMHUAJ9b$?C~eH(~CcM9y` z-vp;AmuG~JWAjk7R+hrsYJM6+@-L(@-2XxvtI}UcV>SH?X{-VMLK3u%XQynlZ|JM_eNnMG7?o)Fu5iaQEw-=Aj36lxQX^_BLq^!~_h zEFP+MscSXdR#c-b=Z6PH=^2A}x-JWQ8-nJ$4;$O3h=~4^fTDrHNd$tcOc4A(W(gG= zYS<)DEy@^DJbyVohkpMhkgQkN<1MqRFL{qYBfwMMGsF9N@!Zo8M!LThGD-UV&{F#x zR*60g+;gp+vL7gz;h@F|SC8vG(rnwm@X-an9{1Ixe_8ZZ3az+BX&1=Cmdo!Q1O0?$V#55KY7E;OH!ZUljeJr*! zQx&_W2^j}l?g_t&i#BYQ@!*ubOX=`oT*}M>FYVyin3E#D;6%=;_!|1~|s${mYUsQG5Z@(c961a*pLul0ld1OB!C+9T~HrRgI z%14S7c5A&hV;-$20r?&m!?TUaF3iP@jNTq56MuiV8tWA7)@1e(=wfYj+4VVHtc|ws zv?0~&^W{z#Rxjo(tNlQG{I|D9aok{E{(m=a1nX}fH@_#>_`r}kMMLJoFk}?{HxHTK zn0ef7dE2B>_m06agBFcBvNvW_(Ep#tgSF=Wc0A0hqxJSc|Nl|7F7nMdx}N^u?Bih% zzG)+2nBx)os8#;LSkQ**YVAn&80CmF%9@P?rkS|&hhC4Ccds_jcuw!7zyu52uiU5e z)zPV!<$bw2I{%tMI_ETLu`g9bp)Z{`%u8c6&)eb_%^`pCw)iRIktXQz6!!fE`)3Mf z3|T76M1#r#$JIOp+OF41X%Cm7)r0%C=Mp~;IBYvHx+%Ch}bkGFHaZhkgH{xes zgw5AE`(pPu>Z3+3)J}HJ%e+JvAU-aK$Rtq99wuzCt8R>D+}1thc0e3i0;?RIao@(a zk}F=a&fSdm%f5@UM>VT^*`vL(DGD=N)8K4)_TCU=9z%x1Ip*%p0tYYMeo6h)v(mAH zm#B^0)@iGZQ)*7=D2y-_G*(}4W4VVtqMZj4UfM^07eP#!IjUGDX8Wn1wYA2y1bwCq}b;&g__+``e3 zZLSd%|5z5<>Ls)l=ea%)%*xuW|G{;_>EoCb`U&&v1Xn6c@3zBM^0P5qUlsCv9rRcnI)H!G2PbHo+cpO9cNM^YMBx4MFA4k2YEC!0wye6M zo`0@vFtFVVKf>J64*H{HE>cVn$%R_NPV8zt_?<$3w)K0wV%zx`7MMA=$4M3Caf#xR z^FwTYE(L&X-A#aD{-jX3>}!O`$)@U< zy%|%hk!B62aH<^^lbqbh-a%k?f2|q4paAL~GKQvMZWtP^+gbda88EYq*W1S^>ve`6 z6{uv-=5=guGTAGMw3)|bvQ0;+&iJh7?_~Pr(fnx+@b#&OZy~JBpM)v>J1zvEz5Vvl`6q&!?X-ue2^=nY4?^L(6tS zG`-Y@hJVzv7ZXKorCPG(`=KOTOfvh>xhKKT)JkfJB6Yv^^t z2^??cPgBRn%e$)x4!W2m`Ul_#UCc_tA?tyS`(?c_d4$qe&{!n2IVrIij zR|&95>;*~%wU5rnsuwDK&H0phk(EjJP%O3^ zi-YL&Dc~&SjAYzVE!&@?6VT^$58>CAPY)4S0~2hZ*UnPKjbwJ9Z~_-dtpFw*L2 zcvhRuYDWmqN45~^7*_+voIQLNC^!+}rUC+D!^N8*eKnN|=NGwpq4nqx-hMaXa>t=T z(MO2@ky!R&HATJItS^X3A=ELcr_Z;x>s`%5`}sVW_hVrm)Z}5Eskx1{X@njKUN8{` zqz#3{YH`&?y0JQjpQ|^$Dl!JEMe*n~N9aP8E7?;uia`6bTA`F%2eSnG9Is}|pyi`R zm;Y7`aCVJlAepf`!Tda|ZXpjGEo5EKnz8RIW(dWZb;6GVUhPj%cbqxRYf1w8O<8N= z*nFW*Erfbg)2&UDd9svnp;(4ECuK6OFQ zZjZbu+IK&nmefC-cZn`>`rd~I(iAT8?NDERcQizXDxHlyWd0yNS?L_k?-oPV)@;ha zn70g78&o<;%Q=Z0$U4&JkePl0XoaTF16LA%MIAZbRgq*;DYUQ}*~e0xKG)N+>Wijd z$q&`OiJ+c&t6rY7QGmfNz#5tDUvsrrxG>6AJ95Lmr$}hl~O*l;%B@6?c01z*O>-m6TMvQ_2FCiZ>n7cJf?q_{AMf zXxaP04>uVf5Sk7L*Cg00TZrz^ZbqoTsZZ6)53pL(7;znjgMZ<4pBZY2<>RDIbp+3T zpP!UWfnO)6@iB%+GkdQ!Q5ePQK^ZSMv-c64q_^@5LEcDu#On)QkarpQK2q2(8LWA^2 z()zptNiBOdiCoZ96BKIHIyJ%HQ7_u+#7$iWHDj1mx@s5#UJryW1E(}F_r&$QetueA z{iw13Sf^c+{W=mx5@V|+XRZ%sI1W|P2l1dGkPBAg1EDY+@&+GnZBB5;@)25rrW2oo zB1jI?3`qj}^WcNI!?i!~Nym`K>Ftf`CXQh`CmU{+IFy~s4(D^e>%%W9W>e^<;>aeL3|U% zCg1@<*=P2F)`0+-#bf0rmu>vfYlY{)z14~{L0=?MeX3q>RCWTWhcGd+zfqOv(YIDG z1*A!M6A8T)0t;7V4%u7PFj(tT>#nGES|tCO3yuoGnao=*Aytp=yMx1`F^yYv*gZ~G z8daJLBYCZ9Lod(#PR>LsH=V~MGgfPI_WO%!sswH6eYMOTB;wQ)29%BZK-=Jvii4R1 z_VKZCXdY!Oyf^r8F=GL$UVnH-tr>6gLAd(?x4^0djq%vbLfqsU9GECsK&idlZ~OA6E~(=TT^ml7}u0y4-^&n!``5-&C}o&vIsS4j2QI1 zP{4Alpiaf+-F*PvJs-)Lf1>H4@v+hIvBer2FVrV!S9YqI3-rv8rWOOpO$+g%zAP}d zq_H>*I%d_z;>Hr29~(c#nKJzqMTbg5y);Z0wrN~ayVX3IoieU9@-`?!NTuRFvLzS4&0)eZ z8q5g|U+-#N8*G70W)%-`2}yImuX`T|{2-2IcT%BZy!1HRY);8;Q&fI)=)s!Vot+yT z+1G^ivz4P^U0g)xWuY+6%j#%SE0!e~#dy(G=dgaFTrc=IpX00?r9lQ)Dwn-CJ5nld zL3oG$Rq&MRuY-4Z5uUf_;|us{7#8cO!;T?da-i;E<;;^_ZN$3OoX#9-rgPm1vcKZP z5@2$DzHmW?Orlo<&*Wp*b(Au`5V=h85zd%a6w=zJ6`s@~*=2k)Qz4xm9TGOP#e|sy zD%R~pn2)8?J-yFg&1|W_AYC67z^v?nk*dca@1rElHU2fs7qFg{i}UF7O3`n|u_Oi-L zF;Y>#9!a_<`na3ZxQnw_@G#euAY?``Vf{Kj0tHp7?K_Ac!R?I3eH>j(evPGq*6%6D)WdaHf!T zBIuiiH6ZzN{-^3CI}K`Iml}AVs=K#1Rez7TP**jwgF9Y zT-*^oHp-PY>GfapD8vw00tU{fzgfjXM&7iON8veeggG5d81j?-!E8_YadUCLv7hq zE6w~e*7ia4;=@=o9M%uS`PWTCA_6@{p8!I;FFkc=seK^AO&Tmx#EKrE~Ijv+(@!g`cX>tHZ4ahAg`;06W5~% znQ?5NnxoT~NwCkApgQ7%u>YTg;j#G(Hsdf&{0hGB5(^u4N`t@KiOr+ahmg+0N%Tt+ zxz0@~GEF)P@_6n@aN&f@4;{oLIi-gjtH>DjKS|jrZ|O=Zs^VJsE-)N!REBJVC7_=K z4ewWo^c1o{{Hp4x(tZOB=v5?Jz)>b(1Jaf#kkqPEK;`frDm9!Xs^}4l?x*U3M1fAV zIXDyY=XI-*FSJ9gkKG8DM>=+vtIi<+8Z?}adJYSPVyiR2x@8d?xiXdHv+QE$1nY7s$_Vx|6MSuuv54F~3Og7s= zV_j`@>rpWJF?f=d!M$gK4+Fg@?nv5?}tWFJSaimi}dpnB3eLyQkNoE%zb8A_h5 zD>0PKqh(C+2Db;^d_K6H+mj6!8yrK-C93Mcm|%jJtx%soo>1VAKJZK`GLGpyfQm7h z9E4xGN91WeVs(ZDQ_05kW9eZUD$p~mB*TUM42sCu5gy_Y{488LXUcs(e1!B#;tQZ? z^H4#y7eBF`knA231jZp5i2cqYU$Znxw!4=|d`rBq$Q#ACE-S!Lyz?c?Ub4-MLcH)W zSzvaS`o!tSfu3Hg=|!{tL*nrqZIrbeKs4vcG)!Ku^uilB!bHzH;GE|gPj;SbJQOXX z;}Un2#}ex>ozkN*ba=+UayWiIEAU+vKX(?WwNGJp+mg%`#6u&(lJN}0L(!At>ibmJ zIPEAA98HcB6^DWs zio~5bz~w1!Y_uhPbe1g9nGus*ggCton|S+3dNr^R|jnvPtJM(9t$GWg?c) zcd^~&y4~uVY75PG^#VIFAqNqEBMMSRP1WXROHs-0w(-DOQSP?1N!=Y<=59TEG-Gs> zw7-=TJ|^!+&?4O<`2m}iIX1Gz+W}4;Z+k`Gd`0fPnPJXWz{E}3a?~?r5HN?M(Y{+&QFgh3PXF$JyI>xoQh*nCwM3@$4Q&vM`P` zp6lX)aYv#3D`)c2#(?9*$yQxmL=W~(uxxC9pXS}60w>Rl+rNTly2tQA`<{Y9iPGBo zcPo>8*YM6xRe1Yl&=Yz*rR{mwXReYCnfrsZ#V)62ryC4U=7ugq(_bg5F=VzbP;8ie zlogrd1IpGpja*eT!tPOjh<`cpH8aEI*q)Nr?V1AZ+v2Vr_8<{pC(p6+1Pa))Y+@%i zPBeyBZ{hYwU@L!kwkn*#uC$nQQGH2XP#N6sP*0CQ@wi@^O1FnQwr>{5B+2zSH=YC} z8ydSBBLzQWs@4oGC`dCaQJ=B*EY+St#z9`b(x!zlw2{+4x0cNhDK%=7vO^M*@V@Bh z{J|n~V;jD}i$C3Ed>Vh^@vPg-M;p4*Xs*ydp~+uw-aryWyw*gmzEgHc>aj{N3X(`t zui0U3?Umo-MiRT?xgW@Ud`5Jzyn8=A=6<1&6ZD#-zqejBKA>~5*vUpucbfh?5=^lT zay(B>3?}Ha3E5FZ`@hN87BO?|cr-F951+`pe;_h@yC|Ix6_kC@$-Z+OAL<`Owwaew zPrw~ZP@o(wB_2?2-j+jnY|E|qcR@L$5vQE8 z=M#!Kl&*AGC9-1i8rQliR(su+Sf*^|0IfT%;MPO;#0zm}kHik6qdbKg*jYD$^|NjU zQ4OI!$UYQWMOkCZnSFvFT_mN34sC-x-awGP=O%9=bsNq=tq06-PyyLHLYqE-4^gHX z#bOnZy*I?(e}1e2vUgjor0`85#7g!N1*lApJ;)iIQ*(aytCD@xGGN?YncQ@S)Agr7 z4!J{jf*N-buKFh%u-8G;e=5+m#(~1$N7!OM#EtY%bC38a`%Un>q$~Q!4Up!?84bHw zu}3~@&b`E`1NH_}ZN9fS(fQuuY#{BWJT>s%@~La~7H1>UU}}Os0|KI9CTSbm=-s^T zaGr3cBHF8UbUW_glfch`p?>nZJx$RP2KAtz$1a>CCPeD{#%PgPL2Ft53Zpv{FYKimA9*h~>_7U9IJ3%7_7h(@LECN*o4{;}6)qMhZm*(#%} z>`#h-yewVlHk%92Ce5|pu9k*Y{2$WB9i?nfGKFAFHpOFPH;a3pL;js8x2d)(pp-J) z{#0#$4Xa1oI|skvwP^K0(IMjN>d|`xcG5xP5xu5m-qrBibSnWBhui)WeKTBj@c+X*H{&d#ypdY^HbCcG zr&p3Wu&8A*N!kfN%+Ny5J>1#^ZAOurz&XLeB-wfxYg;Y^#ZhYiTJB#ujy@D!|DZ)$x;w5^qw{0;r!J6YmI1YuDb_9~s$@s2*>v5|u=Jg}3;PQA zZ@bHk-J;-nmM2}|YC^S<)DrI!b}s0SCTY4;K_o{K3tcaaR%s-%~nZdCnnnK?gIp2*q;-z1fhbdrf@ z6x~&o-0QJLc`vr*>zUQxqi5Vv18edVhD##sQxuThsYvGg8ky|oHO;Ro-!2A{>T>Q_ zMw;V3cRH`t>}K=?&`#NJ2ihxgW|uwpBC?omb^!Yx2@sE?I(|m>iMmg%Q7IPk$XhuFlv4|f4_9m$d!wh__%uAqO*Tjc(26E-eKaw zrg-Gccp1vN_&mmy8`Q_P)aaf_7X|)4PAU7@80#o>o?qW`G{wlh&S}3+_W{j}<87=! zOv>Zlu_f@sdqa?U@YP6SpU17~bqm$76+bflT-A+(3B-$Zl$DjkH8_|hg!|7<Oq}`BB#d@jXFP^=My+2T z9kg>QsIkg8$Vp3sDnEX`04=cY@H6?f=uf3ZHouAw{;9dh`bB*)gYZtWzoRg&BvU`L zcXB@-^okgq%nX-CP23ssT7eiya3R+`NIEeG z^rKpUaJw^Ps0B!Fs-;Ye1-0Hj&wwcfu99q3=pcYjBfS+vtmj<&>*p$f*II!mN!K&wDBEOc##K;riV zrr*}U;zlHGIs1I|RL1PHoKBVmI$2tv6P4|BA~m(qi3JtuV6I4YHl|vCDm0HbA-mP7Jl~Ys2AH8hv4=t z-j*s+bsS!5_R~rzFZ<)x%6}oip#?<3E>(;qNzrarcUkCl-6$h2N~%Uf{QYec)Q1Slw*M2 zq-&@n*F1agyj^*mPL?#5IGtEfkxrz!;$~-%r4ugvDzNh}snXLX~w(-zM2d^vDo ziXqP~Ue_Z;pXhl`iRyK`lar{PA9HO*O}Hm>2x&12oAq@Y{S$uECt?-J?b-;gY=I?JvUvxc+x> zk#4_3DPQLAUG&os&-|b0^BaVHhre8Brno%(S0P+B%CH&go=!S^u<}m5oJ;LZ1Np8 zZ=$;~UTMxggPpHkRh0cIF@yJ3c2!r*zJ{LNRb3f(R9*;O6+-ukv;822UDeegVBgqi zV^?***%k%ts;0lBZ>&_;QyoIN&vkw!B61qKl{9b<_Cr~iwI@VenhY)53_VjGPc^ZV zb@CNC5u%8A7znXX`fxqU-E;IMKhCoYHoe~F7^D)A^3TF|zw8xvbIS}!+P{W3Ph{M5HDq^-Wv}P0nz2F{%D6pY$S$=T_e<@7>Fu^QI_SYs zWnX+_h*$nMgX#GyE1A7T8{;DF4Wmi_hN<2zKs`z@d*&n`gzg$R(^>hg)zZ)$&&nkT zji#2?N=70h2mMUWGEu5(Dm@b*`!W@)-5^n!rpF~Jk*CBn6RIjEQ<(tPo7I(eLuliS zaXK`z=7RK6s_nv=qS*^rbHSQJvnMN-38QB09McT8jfcWbordc&9QNmt#_LC-HHVHS ztO?#l!!gtMTSsDpU}LylT9JMSK&(*QGd;zt3KoWHMiQRQ{tMc0(j_j(8H~fjMo5VM8@LO8UY^x3F#>)|ITA~+N*&U?_ zvrJJ$rEM@>sw` zwi~VmGh+WOB>5HrA`PMN4XDX)(=oM-Dg0Qb&?RPB+&Y5Zsr7iEa;(8L)k`Ml5=v{o zmg&r!j5YCDtO_{=uf^w9(+Uo(1m>h4OHcXQ>KMDmu#E$f(s80eAxOl?rfzN zsWgmvnk2$5MSD@)gK}6j_cp|9CqlPO&uwIvvkPdX$(f8wS5UC@#Z=0|)GtT^ABDmd z6RghX$%2aMwTJkBn70MNJKRxXT$Jogr^`U;Q6L+dKj;+&X-;}YV}=1{DcT>HL2lB> zEhavFATjCwx-tf{DbIbBA=OtOp})F}!EAY-`P^9Sv#DO6X?{Ek__x{Ex21h<&x{0X z8VSr*`YIS5xDFR#G8U?~N241AmK^L$48c1YcrV-&UOwMW?zwm;(bGAuT_j|NPfT!q)SxO<7cXJ=4M_hNrPQ}37h`$P188Sjv~ zvSl9=pw{uceS){VHC555bx7r^t1-OE&LR`s&4peu8Rg_Ya>F5-7;b&Ezzc%yi~;{R zDb_6AYIG_CUIivzq}g0CUq>%e+fP57w~)XPv4V4KjPcbuepQ}6l5~|08j{jP?jPSd z9}Heq&xQ=CO6PJubnA1a!_~R}4{L7%AlFgddtc2yt;HIRH6t(J_9nGGl5EQ?LNLao z%^Iu?E!bv>Y0dOVV~zR_eS0j+Vic2wK!OPn;03b;93TrMY%dEuk^o^1ge_r9Vg-T& zgd`*{dD-)L-|v4;)$QA(k(YcijJj^ssr}U1>Qoi`=tKCmX!vjm?R$XRTdacR{RX$% zWd;?rF6r-`S6UVwBA2t87mc53v+;TJF2r zT7KDo+&Qlv&=}sOa*HBGco)4?`*2e~juW&3#IWE3){fc7ECZ4Gxj?S2+RIvI+ ztB2C}bLzck^E*(=q4<#|h51n*ZC><*w>x9uEuz@u+AkC3-eM>$M~Uj_XuMwXq1}RV z%p-m^kC@IgHEi%7N2Y++6@HD^bj}Ik{2VB&WJS_x^EBiQqgi%EMBbO+W40gs47AX7 z@X$v!y)FLrE;FbHi^Z!W7Ow#qV`YJoUGsMl+cp5lJ)$)LGer2PZGF6%d|itV-Kx8{ zxKE#btR|Ntcck}G7Ovsp+;PvGA{iN$=0iP&Vd5Jev|yOFsU3bMM>=d6+m&7dNW$1& zfOq+6btN_2)LFieOKtLTe3bFk$SgLFDs{1Vjg!U4d&AoI{@tI`=MJODB(s`ch&E$c z%qQYFefb|wtKTA2LtHh4kaPmUMrr5@w~k~h?49h6bSrjc+%7pXl@1UELFf&;)5K`A znS9?4C#nb*PE-YtMyKaDB$ppB)y~@SvrwU*S3Arpqtw}vUPW^%@573l-lK+P_hErs zTD}isEAD6Rim`O_2C`vOb8n2!a4YH00xwN?F3e7}acc*ApsT4^=?-ZbxW3yv?6>8k zkID0E3`%dhnt{r&^&{DL4&A?52=rF9q?4>RMi{q8o&ovmkjtA1tFkxa4p02kP!iIo z;$I^Ap=gNz)jACA7sOm{yZN1V)ymbF$y@gC_n0-@vS2re{v{(jX*woHwPyJU_gkj8 zG2k-5tC;=i`)%JRUV*8~{+ykDJE^LVK2qqpUB9WpGJgOPw){S13_yEV)&ZABz@E5^ zIfih6i8;B760YV~_HN0a`cLs2`P)uhqY(eQki9yH*-^e3Ir#q9BN@-9`W~8})lcxc z#Da5zPuG3EOF0Aje@Ew+D|d*JTh2a2c`^{l{`miUo!I40P5_Dyn3J3AeRToMe{Lvqttj#`Jq7_mo2yc z;}a5!iwQn1a!8W=Cpr@PJcP}#ay)cf+6Qgnncq&Ld+uN_i^(=OCh~RLc)!8cET*wM zm$|*kYmpJVn%U^;zP;y;l^s1RJG&`QXc!Xvl*qq?$aSMj5iUS{}t zTF8nGH_U^*Y(Cmyv3R))>b_qdSprOLfR6t>Z6ynH>Ss%(%o~19+_05DXdjLm&)KvrG7q>emXBG z7FHQUvz-?*c$Ip0%?BX#F?@5P)-c0);FBpU=(25NCMER)t z`Si{&>oFjM!b#Zy?h8LuB@vqY51<&=LK@@kHzGO&rF;W zx+8$}0_6`a%0Im+@?w&6E)BTWj;svB3-rOeBTMYwOFsB7bVDWqo;_19P>O<1#95AI zmdW%C$z%6R9$|h08H<|`pMakQ2cztiNPrY>jsm{MC7+@BIoipXH2Dc*;%}dro=wM; z&RiLoeRP}_Y{cK*lcyw;{kHXqx|>62uoLi?1jRnfCJzz1S5(hSKd zlEgoH>>S{AWMks~jy9eCCMoV;2qWoyu*ba8EBD!o)F4KA%9k&$l{jMu{Gi5#CavZ_Z{m;c7&1F1bsNEIU#a(e-t-IpT*3SH0ua2UbhXg8pFAvf# z<(*a8IZZ%7K(f2yY=2fC1vw5fV+=*n?ANQLF z3qA7k--8z_>5<0bHIFzJPU}oQ0x$IH*L`6uy3-FJ@gj0NV!R{{#-B0&q6LykV?G{R zZsl9i#Um!{hA)!$>z4PC>imsG^Zl8S(ci%V8P!52KrKqHeO4qT(2htla{PRAVNNzb z>YTjyzim!b(j(2u>mPAWoG-+&mB97mJ}2qdQL^(H`H46qXEi$Cup~xDu#ApUg`Uh+ zSMnx)-=eYT>^k#O5-Kl&dZoXpcfrCQ7LssZV*BW&1lNx#(uukvZ0P(_PH>m?4fQ-& z+|8lHpL*01^;%6RayS(EPKxxipS~+(vXkVUUr;-p&hO2SKv8X{Ibjs*#s|Qs+#Qh5 zWWUI;-uIKVrtwLPJol-mjqfX@7UoYXxoAYYv0jwypY)An)L@BUA-g5^_M5*En8!U$ z>@vI?*im^iIW+8WwvsW)mr(`7{&IfAD?5{CQO>(KpMuQt%K(=;D!;`$4tHv0-QlmSw zlzSIT$ys(rE?j=L27aYKN{l}f(KWIjUWJtt3k0{#zKI0dXZ&oHBHl{GvcB{U{476v zO&eeP6k6|Md@XE}6%m}{j>ypvQ$gkL(q@5pfc~s4`eb|oE8sEYeY`|Vb zo8ZwV|2{_t;XRT;;`VFnYO##*-1hI_Hn#r){M(#nXt$;_d%I??Cw+%zF4_;|zb&I~ zY4c|Q?^tkTu$B5QrFOPnbdt=;PghBg#6NzQR-RwhJC}dFlJb!C z()W@t=N~_-=F0eU7J7C5JnuPA9*CdM7d%JhgDfi1-=td;H965NKi{-g^s^(qNGW7_ zm9iKzFwT-EpN669?LOWHlYN?s^^6!oF0`lPv~r|B;ET;+ZRXhb!$yDEBTN65l*(@+ zKFCoJ9}17j{+d#F5hnd>lGBT+d~oUJW7uXe(Otrq?!(vBQe2SN)h~PCj&9nczpMD$ z#^2BIC%f6^3b{CrX*XUCS3X9$=6u;#`F)Mh=KheZ%NmEyP5wTamAjbCdc|{)S8!-> zdp)M1i(NQZt$D!iiiMJ6wtBNI{Uq&Oo0~%E z(9yjo2$^sqg?iy()$%3A zQY;2%`sxMz>OauS?)myrYLriAw67`+9Y6VN;^bF!9pRPmBjMyx!tZdLd?Hm99iwtX z;C3<0!}NkjS1RAdkrg!jo_>z0MFzdjda#5s|m@PMI>rP!6Yn%&pwiOI#AlXbBT z2RK3gPPL)aUYdX#*|qb$np0Xjv~1);ywm#9EpWZy)@l|!2f~OqFfg#;q2BC|(6$-X z^bJ}CA0_MHs?A@bvjeNrkLjz+Z*vguNk0kX+FVtwY({3NtgWtHR>!@6-vGESe03FKv>d;_mn03mLNSY`t`DqH) z>Krm3sKLR3!OO}UFX7)2KVknn0Dg-<85uYK8UN^HU;1&HIDE%I>2}LMuxz*jOv!{S z8<@D}3J7=Mz=gKvE-b7${Elyj+yCT$bFpnLto#;~Yb_UBw#CLKSAJV+k+%c2irWQl zmneak^(*L*kJ^?mv$`~)W>{d}w_N7SZ58_-*4;i58Br}a%sZc85n1$#q~E0A+%5WP z%uh&h|Jjhz!9m=Q$6Qc6U7KK+fDCdHNl3Z=BL5w}u@4V)A~x{5mEV!>#uwxXiziCI zU&yc;xpKAL#xQsR4%Pz~q<7J>wSL2>kQPVmwX8zdSuo zDR}x`Cc@C^REmp0Nf3SpDz(z76a-@|?7QrzC*NaeHbW#LT@bza0{@KiyNop$<0XSX zn>fH(lQsdol0fO^^NbmL>Bv)2rLVvb+0YKvN7!pvXC^oR(AA_>dv5b${!+N@*=2n3 zonNvwZ!4DPIl<(#OsDVy{2U|}DxigFYi((-FEx_1vKlLH4T^*-4dTCQ`!5?EJN;_- zOJ{|CjjWBnO1@|ME3I^6%X>Sr%c*c)8G@c;&&^(;p+!hjxuTowS;5yk=YLLcfuSo+ zcJN>IK74^@b*1_@MbdYdP)OGmo#`JESL(8#rR@Go#2)EIO4G5TB(}dZ`BBPxm&#hv zwSIN?`W1K}cUL|ODk4+Mmq4miX+?KP>pmw9t!q{1`U}Xtw4-xHmt|Ex+YcCCHgZ+( z`c++|cax6w;+*s@TC2Mvbr$3~wB_Au3nIvsjD>maEV%svZE7%{!TvkOC0?}=)D^0Y zDy~xfN{FcAIS*KpTvkp7BM*2vb^e;qkA`_e@0r)|GlIQNpUj6hrN_>1aauKJJjYwC zl}A9{;&XM&Y};2P&uvI(7`oxkqw)X*5eER7uD zzR47~ypg4yYwUMf=SB9ryz^rF1|~#o0`5lY|ketO7!rtb%F<*`DV^g30HV?uf%t<0{H7Yj8@2r{I93K9M(d{3XLPoFUk z%yg!59j#pIFoV6_1HHZ3*Xeyage2)q__L}_b#Uu@u@0)}w#D-ZWzw^!pf;`_=;uyv z4w|W~xMo7TyL+=Tb$NwJ-=&proBUE3)h(Zfm$+Vpoi}-}jca<9NP%}G{f3;LIaV(X z2qwDWx*+=0S{S%`U^Qp34KW1$;J|8UvRnw?b8koG59u>jlF#$QzNvxfW)vj!O#V5` zIZ15_F^FvUH?0XZ#nawX?KSoKDT-LhPpJ}e>O9e4H#jzImqS^R9@#_W(89=G^YYa= zare2q_j(Kmmvq|6Zfx-wBwFN~Vhk)A252CmLtmpql4H_0YesROUS@|F2Dz+X9ky#& z1~2HdN11ekb?{ssSeboI7-5dMu(Oi;_7dvPLw$K@X&zdUhc56?$H2dXUv|?wIEa`tcs?v z$`cr6dfhqyT5*7DZ<1G(g6TF9l578>{z z%E9nO@;&_PN z+JV%dCBIbXbtO~m0Pg*Q^S9MIPOFk=n1ie8Zf)LOEm?=OD;Azu?@iw;fdX0!{pQ!X zx#puYIYF5pFnVTLJ5H-{X0_wgz6uL5dP90?Z>OIy#Paz{zLVbWq4d=Xh!KDe188Gz zyUSl(?=8N#-s=YwK{I3te}nFSs_xM4w$scjyd>u^!B`x{hWoUeZ8u4A-AgWN+{MC* zq6X3m$j<_hq~n(X_q zoXS%O2O`J25qu1;8CYY+*5QXK$jeReH?P8#<(1ILa+JHRF0Zy4xV zlRiNqUQt*N9fptVrDWsdl)2?04GfCqKSHF^8<{_=3Hs$x8Cri&_D{6wUg+CWW11UQ z5G+~H#7>?>RO?WL{zPSAR}I&`!xma{07?n8@Z;+8C}m2kS(biMpIh?Jf{?H*{RC-) zRF!^80aK2;F4AiY>BF)KoA6+F$q-@GjGL}-J{wq`{UwuCxsgtD>~@@<1ldH5q+>c~ zDg#W6 zOy8}AHo!xYq8}I8>Bqr~1}+*JSoz?W@Zyox0~e?7RFH?P2L~<;k`0lj z9BV|*qD5ZJ2-zI=kpjIpLli9aZOVDc$i)MfxQ4n~g{&^hNTlQ?eS?xNX_a(IENNgc zU1da?VOb@`$Hzl7^S?G83kNqJAK7WX!$9#2MmJ;jYgEP0Z}C(47V`oJUZtIx?+T

zg2|ee>&Gwf_7ca zAGWjnja0>7M%)(u;AZyUa~f0d%=^Rv8?RAF4A9u-6C>MvBQb$(Dj3)%xurXNkKf;9 zx(fSyZvhA&<{kYc!M?3)Pv`ea{toho;lbj5oL~LXwavfCZ_?5DkVK4|!KrMFf9Bsr zNt<8hNq>KC(#R}XF5P`jmXX_u-@8cs&BVWSk@$+g5RNPMnlTQ%ZB(vCjmS2F)XBmDhW-OKd!dq%61S4<`?n}As8PCJ$e%Ui#FxcIAD{TrdN3+P; z>^(qX_N=)-L;k#1ycI_FAofB|6ZWqe=z7J^`S(R!j2VKJOs349&DzDIIab15+#p8O z!-@jo>6ky8{^N8%r8ClB6zkyW)d=B$W5-kp2WdmxAU9QsTgU9tb>)sZ^I|lZ`Nx7X z8*D|*cAOSSp{B}3pe&}=@yA-1H|f0XMt1ITPr8$a=DrtmPYBZ`&GUMGuS2%$@ICfb zxz<#4;qp94m+zv*!Vk9*4ZAO!B29W@&+cU!Lr_T0eE;Dq&}G`C#QwJMsq#ULmj;gf z`eRtFuKo4Gy832$QoBhoLYGG+h$8Eod|dfY2-@jSlVl|l zFS&3pzaKQ*_4Lmu9q)h-QFB2&WY#(>v;6A`@fuij94A6kG=?|IDYHK@Gc+frQ<|w{vVJ`w=`VmW{kHIDDlqXIz%|<7!pnl$V`z z!B73!{inY`GXs-Wb|N=;q&3pdULJ-fTb6-@-P@3CSH$3E%4^jWjr~{IU)`4_D!&^v z;Gm@JF_LZn*MhcppWE&p9Z?$DjNmt-7DzPA5u>L z>CfB08j;F>&;WTK7e=-x>EjWvb#O66FBx3aVVNEARmPt8FUrx)mIa$1!p5H7(5P2p zXRQ_6)s={7gHN2DO0PU+_Z)`>^l zl$TSXob#5#wHTq4Ra*N#U)1o~h``c8Hc{5^*gXAk@HE0<{@MvD1wL6Fr?pBd|4uKj zF8y$DUJ#(3v?A9d?jis0T7Ih_dnsLlKBYg!@A8q2{VD9G#3rhZ_4=i~5%Wy&W28BO zf};s57O4;k!9*KHfAZ`qyUI}E-u@`q^khGzC6)iBJqcH({H)39X%ln7 zBz0FBqL&(4)0k=b?VTHXS46{_Me=CMw$Ak>iv&=9{WC&Q$|}Gw-TVzIhU?f| z+stun@O8vschdA>2eazi3C2l}G=j0br$5cf1$(yrANmBIW1q zzz|*@X(|G3R^aT*LOnNdm85;yAX${KtM$UB=oN1nGt?h5oH6M1S}LyG%aY(?$Sw#& zSZ)R@e$;EY?XV-j8b6}J>tlmI>kU@fg70&9#in?Q$Lm`1@|G9UeAe0SEOI)pe+Y}H&g-9^&Uq1SqQ0ak{S()W-?I|h zs4_Y$OQ~Z0rCwB5WtqM(Q>vV9OS4TEGhtcVu4?tMke?iCh3C(6Xbwe(u?ayRHuMMV zuxZhIYBu2$`w|1zb;eLuJJaf(TdbpDU>6!Da<fVdCnwk|2qs}WV(t578X%FsG-nP!lAcJqW@0Tv-Sz#t)UC>#N(xd$L zx>zS~W4kf1C;fSvx3qV8 z|C-i)|59=F$HgXRZw(E4H?;)SAA%ciLGBvH$ERyeuQxDk(0L1^|A?B`7nEO=4%T!h|FuD4IfyfML%QkNWu;a9*TY{A0ng5>3g+L<*F5A4q((`$- ztEG`0{BCK+3?;}8f2dLYp-~;Dg;;(KGoqIl>R{6(cyBy89A7xM-q*u39My)ii)hSX zmmySTSYdZ+x>P~7)f^Y?3lAiji|hob%3M=u-9T^l5*WR=krVA|W94_m&der@!%=9` z9k>uZ1Npi?MTVC@mYxvP(+N)?J3qR9iyz&kl|GR+tPM%JKe2z9+^DRs2B-Xb(2iPr{8K_pxwAW*NWtv4Vu=2rSeG6gSTRf~A?O=rj?}g9&rfR!TlKz(2Ub{({o!ivfo1UK3W&$bTUvFTLnB-A z+Yc|XJ!-1#SX=2BiR)YZ&iUDyU%(O7_E(J3a?ER}qR9mSM3$cLJc56~*hHDAGu2%; z(E0g4X1Y4l_i1gRnw-H20DogFnDbvDA;w&G-7651mYkU<)ouuKkgp1)YyNBe*q(;# zuZNtzt6*!6Wbf_Nf0^HNt#T_5YoWyqPO02IpWNFX!G zWvZvspyCU$| z9!@V$TQTm@_Gy$!A1m>lCqbe>BWHfEn%NT(M&%q%LAJr*(}m3x9?7~v*Ip=@<7O`8$<>Z!4EGc zY7F^sLqCDP36)qC(Vgv&bEYiMQf}LNkQb>jnU?&dMXMqjgW(-~7b8&dPe=Lt6o7+0 zU6oxjruEV=qgsDJ>{@%W{1$E_fW!;@VePj(-yZiF;ms0|5-18~Pq#n)vW0Oq@?u*=8iOecTM^v`}E0l2A^!owYC6!rqm;X%=l^L)MYx+D4>Mkfv|Y z!j9}oC`t2wLeOcM)0ohQKP5VEul7EF!DvtCyb@abqMm1~)1^NOb3x_kG4M*c#u^X)okJjdW^Jax0rfPfa>E^hg>A0yxJ5%_DGLg?9|kt1LZEK*uen z%VXkhwa*_27W#OhLk$^JY_`p@d~w70s37EBr&v)(;xc8{{%H+qWgmRnQ@#8P^YSgd zv+`6i@|G;Cy@D{tmER>P-9+a?0g^e-$5|IPrLcosIou(Az`o>hmunQ=}B+nhyjDCMJ2<@VM(*k)3F0CMR^j9;+pEi zd}?v;VAH}p8wSHKvR8udAeOlFjUrPoRKByfSi~Dz5l>-};Z)pnskil`IpWGN#+`si zz}W}!&DN?zPj7Y>@Ly2LLihK`KBa3=zKXUQijh2&*GqOH+apQG_GYL6!0{8XV}n z6sl-3w?paCl>Xd&`445^h3(FNlNK``vg^o3{AG5XdvWmL@~X zdeiNoGBtU6@5ow2bS1*Ewezi1Gb_XbF=Z?pS)qdwW-U`4e~76}ZkJY}9L8veOl7=^ z-ka{E0F#ykc^yjEI1#*u+j!j**buyhKJ>VA9#L;w5M?cm)oj`6MmhPVgqnI{O&zB- znCbhOvE~_FxbwQ=de`mxPtDx^){$JAeDom?Ys`L&wtmIOyS)hX_6uk!etQ=GV(iJB z3LF>W_pe{t|H^5(GJ7 zGS<-hl3W0FkOUtLNmgu-xJa&w)oVJhnFt_X0t9R7AbT1sHosqCJj@?3PfaWBvb8PP zR~Rg(};8wu-y5wvZHw`zrv#gJ)F%-FA`W~D12VkL^_caYSkzz z8+YJ%Q?3Wvc9OMY8{12?M=@Yla3dvQuFLYX&ZQKo$uuX=QClLT{n93TA)tZW2F8qE7CFs0j)9{RK2H zbzyb0Jeu=OGY!sX|7x&I8TF)XE& zEqg$hWMG*1;ep|Sp*;Q@=fU2-%10?P&MpJ6r&Htp9Y%ZoO8>2t9Kzg#)KYFxs%)pF zc*u>+u`P=cba1IhRXzr61%$^%Y~)tm`i~nj*M50PtCm+b32iP{`U<{oYK z6CWE{Q%&D*nrm67ylwN5O~5`yd*l1Xh(tEM5~nU#e-KP}6q16X&ti zgrYuhLFJi@3IgU*(Yg4(S#r*N@t#v#?;+qm6>aUBh$DbR+%dq`&3BpL$~J27d)Y1- zxfJKCD>OzNI9$d5N@;O;f@79C{xycj9J73Qa>uN;F?`j3(-^8H|Mf9kRT#rn`53kj zAMEazE#H;Ly-(zf`2=3Dhv;6p|Drx3rIcHT<7{803t+If=itN49m z0bX+CONq04Ed3;XX@rf$o^-k7Z`{mB7(o=~RY_+gL3}YA&k?r*21f0qndnb-rMp-? zkFkUcDZ#*tC0y(J?u%)Y?~g6I5q6{_TGyzR=GqrQ+a=qSxW@_tf1;dWlx&RF= zjTtWNu;m|iU7i?iEt2`LKqp@-$b4Utpudaths<|`pKKF`A_TvdEVrB$>uHe%_Sj95 z%SU$f8+Fs6>tCaN8&>w|l9`_Ld6Y?OOhS;#d;xAH?qJI7LR8z>Wl_a>&!Q?$;NN;* zwE0@Zi{A84B}OkI6EW7(aXUEaefZ~H2kJ<+BtP>BM{nKPj$)I1z0m)b*er>+WD-Q+ zDa*3`l6dXk!7l&lc3uh3?<>%`74~Wu=NpaK^CmOT`1B6lWpu9cE9x^6pbgOl1jGXz z!;G`(`5(~lPEy`YO3Ugc=BUI~FlNtH`DGhFEUJhTZBcx^&x^Gz0C4cgqCy@dPA4Rk zxa9!M8d|bKv_v)Zk;wWIEyztpnZtVVoqR+lZ~nW+nEQE*xCiU%8HcTT7pg_GB8Mc62JA5I@Hq zJeGJVhiYNb@3#@>VS=UJkWT^z+GCN<%c;PPx-hxMLJ+xQA(%)@yvS{ZfJ^KY4OgBa zme`Sw+E3rSq!ip7#LEVBw^`{bqN`6;+UL(hkt ze2d;p(&#^F^*I&2k>qY7xt4T#LjQ2Q52MPk6BPRAYoRwtVFe$ihZZFfMZcx1l6ANG z+P~!bzT}JG^`EN#3-emPLWNAWMn}6Cae%uYdONVm*%cVxZN$4D`Z+}e5%1se-)G-6 zwEU}-Q8*0Yv8@~5?R^j{U6-S(uXZ;~Nr(IIm-J@`DtIZ2uv*r8<~vfB>_Av=IDFyM zXR{glIE$bM8F1n86HMjg?@{BVMU<196RdfVn~l7cW?vhx9=T4z`?zWLVg=qxU_gOy z>aE$4RmoJJtj=D!A}0BX()`-e1Z5x$K}lqGW?n2!-c`Vk*%g! z7SM2dvC8N13v|Ao#2lbR9XZn0onCEKn?IWoqU}`Il|DtpawXR~uS}mxP|v=n6@w(k z7LE$gY_8EZF2Og? z6ieK$Z^t^5|uFvx`OSVNtr04I;^Fz^FhP6TDnG-Z-tzvWAnwW)05A!yhoB+NO zJMBX)kr-2zw$}5MACX#j7&v}3ij9}Hjoje!UXDrT(A@Nu`&6uCa{YEn9i|x?SpMJu z%JEYEEev6Db{krzUb_sA4@QVJ4?_JvqQbS7-n&S8Z%AkK0#4)%TbwZ6jWEkYc)LKK zr)mi8QO)yL(~C3dBiCY&<&7cCYK`sY?@Ins{)+PY3mC+Uh`XC##4-C%@V~-0`&XryA;WP^3|1{_@M$%k$tkY4oW?Zmt#xi>UP@T zoBF=xYqtH{DeJ7|&Gx{}u@>1<%7@JjpV1z;Y-Ah*fb4-_%hjj9$9(pgOp$VNEO!Vi zg80AUN7v};m(Ra3FrGi|Nq>hX+&-@eSrUvQ$cf}vp$H~$=%bGmMx>z0sYA>A-B5)9 zjiHLGl?ygka&7sv4F^vruNWG`ySh zzybw=fH28Q99%gxI52W6hkyqjU=g!Kh3+k@Qvkh+E`C4sSigM!H9vrRZ}q`hF-$=q z{lH2y1u5$~gbR z!J^^|SFm7|LI_%F`{KI$?zu1VCDD<5V9Cp#-eJo_x~bO1pBw&luJ7y|>9#$PWL|8* zH$S=Oxzl$`%-;FK)th((>DuQKd#<7M+Kr7@L5uE_K~+~l%QKm!(>eclYC7jUI&D3D zQ}vzs-^8Vx;Ziu7Rz3~CF|(}gX+pD>k37*1!*rbf55eg?(Xt*+0)7U-wS9g|glxoR zF!fv3{*+~3TA4Ji?BXm;SK5%yNM0Iwa*r}Jx6 zN@M)v$SB_yoXyD6#`|e@N4^n-(6`~Lq;q{AuS%0k?*P4o*{UEBV)K?Uot>_mDIz*) zE5nsgG#zv5O@D%avr(W*d?;gj6CVgrysei$Q}IdTL+4ajMKQgZ#MSATpnJ}2kJd0i|V;YwCU$kjW|L~pb2OD1}zK^KkJ07q> zu+^qtCl3We9A#l3(o}bw8lPKibSYJGizD^r6cI()gwd=E=L;z1$6} z8{cn_iKIl8aia3fE%auftL9^nY{u9@DgWG_hf+HBww1fElwIwm%vdQa+w)M$#qBW* zOBru31=>ej*0$%Nl#T5%3ro?Q7J6jLMq_h(9!lBT9<#6%Aw!{*|3Ood#@_Zkl=A%c zm|`h|jIOY#Rm#Z0q%qT;fgo1X0Ks~B^ zn01^zi(<`p<((a8{sFKJgBSj==P;SFTS>W3Q6q_^RCW_VHly8p3H+t#z!UF(H`i5i zIPJ_o0?Ko4f2uilaMpp< zDmxVGpK9E-+~b@7pSEcHIFsT2MSiyiPVz6t#&xZ=baf+1sz;7AYIjdpo6~81cddT3 zd2G*I*4$d#o7VT%juL%$ZFH;vQ=T!P@(G~I^|V<&QY+U3;Kow*NZM#l*N+~k9jRu@ z=%3|=eQ)76t2G5sZl>ka*UvA=u(LWnQ=1&!md?#gTH#h+$X%*V-d&^gtahSSZ*Hre zsBNuHrH$HXTYNd4Qo%oRdcHgX2+b2r`ScCcRm{I{>c3LLiR!&+{osvb6B@42T540J z>()`nx^?9#>%*4v=}q(H(>GGrRW8n|hNC>4mGf++>fYK(2OOUq&kodHG&kK~*vHC+ zc;#q>6soN6xM!j^t6uM$n3!t-e%mqT>QLhp9XXVaO->#s@c|Btv)u>s8uIVZR6jj z8d)y`QqCNve5{%=#kG35>R{ywhbvWQXJ^#5ZRv><)6LPb@aag`++C|?&3*OS{%Z4B zaRi#6H!0<`UMtU%wqO*B`IwjbBV<+bqPY*9Om|MtkeuzU)h5-WSZVWQTAuPGmXy*M z_&G+X-khGW1-dtF9-NzSWoI%F{|KPsGG>wQ0Bl?%pt8u1wY@rcYF7u2ES#>P*}A+RQX#S!-Asw5oBcJQ?G1 zsJ*PZ0zjQl3S_CPm~5gt8&WNpr`*y==Vo^?(V_IC`Ys={2<3EiJ#;GMP7U+RO}_IY z4zdjZBx228alhci{`s8?hvUU&IpcO3uL$7*m znmK5ctL2kG8|`Y;YU>$r;+SJ)q>1@pGfDd!>1?erb80^*&P=rpw`k^UNC(FRu+g$R z^&PKIq%5zA=BSE{)OI??mX6FYpj6>_4IbQ4YmV|=&Lhgi0G1vhc4sR?m^9HZlaKD54~0i~=uMQ^Rq(<9S$#&w%T zhyzW8sEs+$ff{5ggL~b^`Z>geWn&E*Jux$<8BxS-)tTev?3j2>eVy?!hTZc(svs#% zfXa?(P)`tpS+MM}me3Ft=1clEFy%n)ZvTkQ3vDa6z-*vS0t>1IV2y5}SeDto`j`+= zMILNI`U=I73WWk88vvB8piCe>vp!6;4Y1o9tk*;7g1jdc8#!Dle3R6e&&V>lr>2kQN_LL0PIEZv-W@+>(s##CAKdF_a>VAsz&_HIxn*7qN(M&4)9hb7&Qmuhy(> zJ64-GUYp!E*L0+hxF7f{h_2*v3QeunC&B5uEjrK>DoK8=24S$529o3r@pP-dIEN0% z?2FN|G*~GIYEyAcLMCS3xT>dv5+?t&Rkg5$O^>MvU-7ZYko^-ZIw;#cr=SSXvXOy7=sSae{wXFzPQ&*CWD0)gA+EB$EAI8-Qo_jJ}| zJaT-U;amNWxVk%?I39D(5H8fJBoU?YdK-Y~539TYxTo5jIJU381Ig>u!DfRQh#5{O zMaxi9*{O17iE#<1tBtI-U9g*&8kYL0W+8~VU6f2Y*AT9u1*(S-m-jtlAJVstzwX%^j%2PJ+yxw$yIyNRtXYQ_n z_0^dIC1D*Oo&`+`SdD@v$TI7tIs*r6rz*C*=R%f<>jxp!HScP^6f?y|-Whs(*hs&H#4u>t(OP!sShfD#S|dF$ee_s!Z+bG0pd>U$ zqSRzIh$GNw84T9Fz?U1!z_^{Fd+#-B+JE1;KALPVJwbIPU0^ zSu3P9Xcl6f(0!mb%mOAkL^y>mc)fJNBejX@98w%nQdA^Xvsfeqt%q{VoC@%nH@S8X zGCGm2dj$EkE+lABs4?bU;ykyBx4TO7Z5EUGohFTq~GPUPcqX}y6M3D7a9Ismi znUN)<)G6NIN;P2YP|Z-08WuF%(O^n#VXEf*O)LD2p*)wG`&EL#3ZeVxcHj; zt68?EHWn8H#m*8_My9M9DqLPdOF$Q8B1Vo7gwQO#NDTuW;YR$O@GI4n> z2Z62%#tTrFwxQY5?J-jqsv#a^!_;H^ttEABuVoMgQ#qLk9`Ts2NN?<8`Lswnkb%%KDb9>*<0mpJe4g zjDXU#vaDIN0K##Bq#CWbU?kXK4I2&Zixo{b_h2o65NOUL4v%_9P|T8io?~Jtbsr1C zC2(d(L_W~p88pWN_NcL}aJrVuLB32BI&SS8z+U zaRihZll|@B^u4vwqaG0~av4$W_2r7Y>+z$x${uw1h0vxx?~oA%j#vZSBHUOZK6p;? zmfi;Yh)|pIA_W#!o%J_T`Mkgz&jEEg9(DyM+ayjVq4-8=s6J$EMVM74wqGWh^Fp=S zB(QVaw5K{Fsk1g2CJXbEe+NrYM7=^cqLJF>C>o;6=T6VwbPQ7(ic1}l(?ad7+?)C` zmU#;h))Z@+kA+a7Wq>S(HG5MZ85NP5jcQ^3L)D{4YYou1RS+@?QP&AG7cbNEEX;6z zVA*HX0tz<6%)&NE#I$sN7pB={D(^Y-C?!Sg%y>>VcOpml(U<}cg*%c2x(HEN=)xGZ z4M>}1gQRSAnF#xPV3aVxTp_UnOoNW16P95pit$?Xx=@xY#!}+Mdk>lohbneq^sR~8 zMExeH$OyB?O}XA!c330E#|(NwnTKFwX`|XW<#NwsDP3lH%R;Zw_#U+)^x3hv69FGb zpU>MX{WjmFn8Z3XWed@*Zeh9jXsYj~hqN+VFBO+}Nfg%lF%A>1-GUh?uSv8uw3nqV ziSuY0WK!{5@h@$pKmi2VR-$9Lng68^LZN--EG!+Fz?VQU{7X#~IrpX2)|&%08C-l; z_ss-bY_YLsj|sDxvNvQSU1*ik^Qm)rtk6}<-I^vLv8tDes$M&3x{h%{SvV(@4_xvl zc5W^dLkh%SNyjz{T_Npo#@>ra zU<{NdtF;qp+(|kxSFbZrquVVq-#BV`G_a?#v7@PN%_&^29!*P*dgtl1ED+B#qrRJu^8`Wu%Kr zK@|H@ay)e-L)0`|zt~h1@`_V`AD!tXms*Yl*L*pa)?p)}oHZ6Gr?Jp)p(C)qetO*2i)GlDRY7TS8`RI|p0Zd*CU znc8~l(6Q<4IqVfu!D5BBO&-Oe9#IdPzcP5iY@^b!J=OXt37gZH_pLXwN2oohVW&*! zB*ilvuEV&~qje@~RSDZ=1Hii`_^fhE~t1|Y7iJJ7n(e2T$ zj3L9L&IQ^&C+n>dZ(IH6WGPP?gcEE)N|ST5sQ3`goL$TDAlo-Jny0k5wIvzPL|@O- z#oo8aVpywFVVq*r0q9bb9my%P!-31=^yg@GrY(~|lox*hv*|L!(+;+=JT^6D>J;e) zCc3wv4!4*w!ehQCS13D}$Am?3!_GH5G3GLN`x-L6$taWi2p~tOlbC-Tq>N>Uj|i7* zeXg)?ESXgx$On57tFhu>kn?EmInu2C+F3xgH1CjY3Ly#%WM0cP+jOQhv@UA4-O;V=(z5rd#oW;dC@$Iqp zXlIRGyT?_*lyW@g@^@#B9gnMunG94n^8Hx5u}7Tqan)hGHg@B&&4%{x9#^EYaixu)RJ$@Jmyt#;Kbvag~o~4 zi$@(Lbc@GTv=okW=C_?xLXJcyr}i1Q#xrntx=0-hNhU-|2NEL&UZ1V>seDqpa`Zu z#&85$kNwE@J>>(NL+(G`+>O(SHp!yrLY{Hx%u5TA8x$)XDs-bgsW8df+-V>L!iuMmw_^Fy{I{U4gelja4jZZ3!h|22 zNle0N9Ho+5O5#4cvGQO%i5un0ml@n#qqcnx(+^Vgz9}S$ozdB1ROSy-;n-&WkwH!} zUeO_AODrPRwR6XzZM*I?D`3o?SJ_H)kwZLy1eTguN#1JZJH3N?~uI`P)&ql~c>S!Mzcz-eU4+MXK5_)tL5jB#qVQ8pEJq6LbY zDA;mEm~9&KH5;upEsfh7Qq-_pZIDLE>>jLXrcKmWs}<{}4~V|z*0c_4C`p|i&$drz zY`L*ER4D~dhHq*no$@4Ft4{`?{+mp#wmV3+z;9XQn5LW?oZP^L^XC+nr&Az~*{tkC z7^AP!(dj0;H*@IEs!}v(bYm;dI^dKDp;=b_jV0|ML~ZR*itdM>j#*)%Gq-3edLO(L ziw8a)Q6Ao^bQdtLHlw%W-{1oq;iO94 z1?2kjDI8Oe&DD=@tOxr5gcz{^Ib%))9ciq#Ml z@Ug~GRI_?(TU{6w(%`JPsoEwwQhET)%ry%h8k0;UkBQFxU@R=Sxbqto^H8ePCFuEn z>^HU1aW?~)z9b?)t5_8h+ra!cYv=BYPqRB*^iXy+&0NJt$MZCbm3MMf;>=roV=3R- z!LW3UC528K_Il*wa?BPJEqJf3_~&^Wbq z4vS7>w;b(NfKCBW=Y|uOSUzH@;G=XNX>Up=F9YqWxAx=13f)s}94Bj@db8g?1Io6QPqFwk9LdmcZcZJNe#&Tk2pFs#VH;)}=m{EC(g@Sps z+h=lUi2=370$6c=Rv$`Z+HgoYV{ycUu>q~EHMZpoGHJYo>W1Xf#&^zXg4n@!ZfRc> zVpGy)xMQtH13|vWrnMWS&O8s?2@}Psu#F$)9cLGhj=TAxs36GM_|Z%Wc{AlXM1=Vcy|PjOafhX7X4zhCR*M-tRk$9kEEor?S{k0+^kVl^+dFsS2;17R zd6M8kANNEnV_PCIW<#tDhP50Vb{(Q3&@IzVEWL27@@P30Dz+rHRl{#>!i;TG5)OhV zTp_2)ZK086Ws)H)t{rRoxG>&AD;( z#nIvtaU`pGS+wUdp(R$)md}NjR$qhjL4;*cRP+`ZBtwzfU7b7#*5_-%wo`GTAua-$ zNzNp9XP@~%m|c$JN)p?hWwwn=TSL{hwp8$CCdGl>=|Wy6I74(!FBWFmtBt(aAz;m+ zVF8d#Cj}UNwn4xJk81GS+J_8;)S@BM3@jW;G-KCb^Kzy8x>nj&wj8C{EpLJOcN+{_ zyLq~{d7X9{9>m?XEC+}?YUY6$XXG~6N_x_KT;f>ZqfL~1x=d$d;`GxKI}uLD>XWeM zy(tt}M_k6y-bB2jBwLmA2dGJ-=EDcuMq*=U#^6Ch&ro{SfgQV%HnKh2pNvp2W5+H{ zoEasBjVztjA+3xwQAjKuM@S3~nxp1(Z{na(8!X=-JTKWMm?Nt*xoj&tVPlO(^;A5; zsEKg~mz6i+T)x!=2Bb@1oc}FSim}bbN>J6tG}o8$v7LiI$wNrYdy(dt>A{98Ho$-_ zf3Z^Im(I0E35$;eHmx%ckx4m$3fsTVC!@Pf!gntWNkuVXqi0}6j%RFgYCkSy4q3F&Gy@C} zyPdXQ=cQCKlrL?Sn)vMAf45*#p(XnoJ6^=d-Y}Xc=et4p0N!A^obd~wxNoEHeRa@g z+l=X4yOoZ$S}i~eC{I|l*K2UQYBQ5+X&clrA~%+Dmoavaa90?YPk@_QMsx47GFwhD zEt**>tbk{juc;|i*Z2ZvJ_;Qzo{1(!f*j(*37v$7=a{3TnOVgd`!_Ijjw@vn`7xgBMYLc*i1HR zoyy^D_H$({imh76;yl{C)}UJ+`2+E3zE2imhYDj=n1X4ze2np6u(N5}O!t1UWTT+! z9^WT1Rrz44Cf})!JunuHnb=CBN>Bus$nxnYF(1=)RGnOX4xgq#hxIcyf&7>uNsNXC z2O$bEAg!-4mnh~KFIot{k_^J8DU1TEkhm1tZCG-h-vy13BNl^uN3$xKa1`&4rd%h` zg+djSdJ<=j@e?q=@jCX;t*EG+anNC=yk%4+pbZ@VHO0ORTv-Y$JESnmiDR)eCmMM^ ztyhLErgGrZj1HXbvAv4vCUYF93Es(h8Vf=KX|^S1jP?tpSGYf<1uvfv3JBMtOEC|p ze{qE=jxWc5Jx1euPYr)zdSe@_VIO>tV#N)0L_~BZs@f-xv-vHP8oJju5jW9tBwkDp zXlOnImRd5%?0lfOR77<+dRXIz#AdVoTe5!{5=CXtH0{WXP+PrhT59cy-ENK@+%`TAC1>&s#J=vRz7`-<=Ad;0YJN$#dK{_TCzrKw4U7F4XMe%0M6qryBN#{4<1X)9BWOK|UM90Xg%P<9Z36`&)jFagLvmjK? zSvh5T8(NJTGo1FbcpEe%zzd-Q$2SV+9cgcK)u?$%=MRI7cX;+tigl?5#oNglG3pZg zHw@OT2`x;rGmBNfX=TIQ?1pB#!93DL@uqZd%9Lky z9He-LJ6Z&~r-2{=aE?8@K(r0^jNp!t6izLTXN!~~v$n}kc4kaIWRkbzIVaE|uYhUh zw1B8m=6X!vYd4HiB}bx^kRzdKFoL&fj^!DoC_}3X6&l-%)-4f&;zE;zKYpCelS)_) zu+Oso!c6GG8)G%fW@$zg!jL;*Fm|F#Lqx(rG&^yDQ0cC!LW)IPRSnjcN4UC27)H~f zaq8$Pws=q2L5{dyWNWnxd*W&n^~*u6^04A!b{336~Rkx1O>8w!!vtVhOyNn$PDREW-DZ!AP!Lsj+Z2}ZT)XFRN_nrxa$ zg4_u6y`&;GV%SC-;mRsbk=JH1f0>yX=FEWvj>_xC82Ji>n+#fvhx$;NOl-}?fp~V@ zWY>sGKtXz0FfB0uF4{`OO^tnx*Ckmq^+;c|-0!LqbAnw<$`(>c(pCnT24oYHG&?1e zqX*}XU`1wAnfYyHgM@e6Y`?|1={MY|#=L{qwOV8Qv`);37{gMw z1>=+B+AWRh?6FY+(HOteO#~Q{UuE^VnJO~mcVJH@0Wnt;Em9SCI6 zD4sTu5KrfjIfJ}P4%Pf=F*va;6e7|QwpSJ_YCVY90*D2d@%&Ov0H9KymdKE&Y`1VDDG-`v7mq_r;*Qa4{&b`6%t)^}qVrvn^H#FyoJxu=IghtORPVM5Tcb&@<$$J^ds{O)J{1I{;L8x#nrqzWq~Aap z!Idyv3)li=5^cUg8Q1&l%SJ#r<7-fhkV-Y-h_u?pG`}{Y$mRqHLK-Upw+&ITM>@$7 z#>F!o2kd4B`N(54P!{vS5~OZyfC#b=h)n2A!0DaSYNUm|DL3kjWm!7G1)Wx5@DjG| zMc1j0nJTHPcOXGIDD?|8pt^K2kx8nz0&>(gJxr6IOX=3%pyjre5mxI#90!`a4jtOB z6&mPsOWF%dwTv)|&z!)F^oG{pYQv?Mt}F?SLPz$Sfas*pb<6?=4K zNRG+}tlSKFQfKA@>YFve&^iuLww3luKwwi^jwu;t36H>-rinv5aEBGEbhgUIL#$8N z#E^6ADUeidn7H2gMHQhvtZH!Dk`U-maDoM)PIIXqX90MJZo0{H+J!V>O!9gT)b2`6 zsm|M&$DF5mQS@r36fKgR4~Wx(xZq+oUv!#*DD)Sy(xbScZ z=zFILh`>4hX+^d4^o5O+OkBIuq{TfjizDehexoUFJoZ&6*FlePO|DV@(XBCb4vadb zeJCBkk0cB5JYqp2`)N?6+b6($6`melry-);1s(=JixL8p)AG*91sH+1(2L=pq553 zg3pWgbM2A^ijy}0RZ?9DiA?yuidC4^str>w4oFYRmtMwRAiGedJXuIq~eP7%Jo?dJ0t|>_#dw z4{*kPM_mWs&?@#qH7La5ZFxXPlv03g34WrE^)|V$RbmdcNSQ4;5f37}Sj#TY(UuW( z@dW32xi-Qt(+UZ}{uwN!CChez>E1WRWpr4Y9iGf~{E++TCXUlR72;6tTT-2oEj>R$ z%wB_;Ac9w{Tq3dsCAsMro!E@t_=svk1^QXYDJw~$TDVyNFzzm=zZGCB$b%oHPaFnVP&VN+Yq3l4&{ z!2qP?I9=Z=wTGVO5L_V&NNxr?Qfr=+Mf`f(S-Ii*>s8vlwct{*>6Wdo{%ZD3s#UjZ z<{KGZM@-Ho7hQA9lk~TEySa6^U~;;?WYSBNakfuqhH;|{WEybT6H2~_3diGBhZ)62 z58C>=u8`)vGOHL3vShbLM^B)TCn`VOI-DP|cW~quiFGnxm?cSW)Tdnjk9iS3jWS8j z)9gSu>{dT$f{uH;SRJdUJk2h+V?3WFOiU(e(OXY$yso5&MG%t_iB*JistnH$Kh8BR zU+8$uK)Yh22Q4iUqYWFZto*QnZQ5tL!xaA`xi4kh7Y291IuRp+D@X~bum`8hpV+k( z`k=T21r(t%^fms2R=7`=Q#Trsb`N zS82n=74_Wz)Y=|uv;M0#SHvI3RD~56%ApydpXUr=VZm9=d6(3eCc~Fy2lj6ZGDYUx z;8401N1;G#B2*bLLrS(-T}@{Vqi5!9Fxv8hV%)Or#WqDXz@=U(w&DV2<1A${x1)w@ zhld+8Q36J3(!!ULhC-3mj+(!;x$pi}ZFIRon{8%RO}OZRm22dH ze>9lUpqB&Nbr9!*F9I27Ap9EdqfB#rKDXRJMX;;j?lPHsFJU~ER^+H=V>Qa>WEy0B8F0tvsC<)7D59&ZA?j-~cBrNG5UR3-}-Mssfy#igi44!MfPO3y0{0^4r^s z*Z*TLP6qf%m`Aa~ zlhIaWfHj0z*k`Xn88(@>{CRUh-RX}ErTZF)xsmxxKE-o{e!CHsg)rAjHL+8UB}O0c zT9%*46;Smn#9M=_rtrZsOCJu~&3SpIBgY+Pk?a7wOWp$^Tt3D}Oc>Y3ZzyFSjwa?! zWRZE9CO5?kw#pTnEE`OIb$DAwDY1flQ%3{~PSe&gG zXB%HG?Z!5-!4+;d6F=9kYW&vXh)@f$^m;HRkIQlMdYYWa?#K_ywd`L7bcfx=gLI&8 zFp!;7U8|55I_EVMiwKB)P64^M5ge1tIL5H0O}gjf^jNKGYog0&KAYFviNGZGjGQnAjr2u-*oB!i0sBNHiK5nm20i7-CIXuAe4rG5OtSs5LHasMdGutnuh=AV4^6mb3b2 zz!gXf0U-cmxsedkK@Jo)~(0TwpM zRU(Q#{m;$4R+yB14MEG$+k!k8*-;J|r#PQPM%4>;nw{m4PSG=xxz9kCuKBI&_|Dj= z)KR~vUe~V0gm`?|Qd$%dlLXStZFaAHE4FOWjzXs};E(E`lK#mon0femJXbhD5RVRM zN$Ac}gNu>&(TYAN$9g;5qI3Dm%IlC@4?b%vPwv_~k<0k^?k8=$e&dbT-+05*6xE%~ z@bAMf>rAdZlO+3J-kE&8xg@y~dpSd$38M1DuH52@e*W-q zlDwAqJv?mrQPOT8Y;gSY&S!Etzj}xBmHerwr}0Xy+AkQA?RTD!y9x6yb8;uYdi2** z1oIAh_!j|N}ivmp2$;QLg=KvlKc7B+xH70R7yUm6#h!dxAV|H7Y92b4hvq`4C;4$g>UmG{8bWGcDS2}a_r5&zu{`vJ5b8<3Nl1BDB!5fjd;G0P z{yBt7$+Bm}HeVbozf$th!I=7=A=Hy>dQL3m=^<1~_CGhm zec=T$^zA(KA<)m~ZOIEg)RVlL(2MvhC2tRLrKF?ksYA&oLf*>>mZ0+XBu|))FC}jwX&?bU=l$9wWn_k%I+*WVFC$vZvNldL7=t-3eFm6F%x zq5FO<=BT|lhN>Tkp@05h3=RIShlY|r{ypdhf2HK_`B!b}Nv{1!lC0sclzi;tF~^2a z#?-eH(unsYKOp2i|LCVYbtw5KLTcYolKyd=g%jV6aPK3eI);+!_mbo}{FRa)YpUy+y%|pqLM7WFc(3A4e zzC3g+550ttFuN!DAfY$&*OPoD4?UcxcHJ4_t{~*JZgUZ}PZHCSu$(33(m0JoE>L;_N@|R=96O0GE? z+p;qc{X_`$B;O|F{rEv1*MBUI^A&`AKAslhdXgDJ-pf~p)Kc^MwF|MetK0me)I zose2e{_%Kh>9cw6-cx^ykhlJ;gg(h%DfwO=_d`Oyl2@LHJ-UgIx9Yih=4TO1@I}QihV@bV;CVKSRjd@+Ly6cPRNRA#drn*;w!1JoM5$^zJ;= z`JxE7D};uUw-fqFeI=jgU(Mx;FD%5|WHBcTFIKAUtdS(z*&M*nrwgD)i=d_6J53=s22Ha_d}T<;)8xvmc| zyOaN!JY+GWg_u9Lm}eDYzGX4D7h=9`F@aDdD(5dPhN-jv6!Tq+`LROGUs-!zMU402 zHee zlEhUJ!GIt^RD|z;Z{6-$^m*RzednA#zjOb6tGcSXs=B(Wx_6hW9HQG%SV?q1;~9dS z*A?ZYDmIh`7T2FMP%h%nMjqP9xq^72;ooHB;cih1-LkF`_Mb4cSUfcmvt@_t%KRcUTRJQtwvc*-ZS`Ue`$5pCZqdeSBKZU}-WU6D$ z^^C{4j;dl)b10nCuT?2wwXo)k@}sM?v=&Irm!X)mx3b<8<%X-Yww8FfZiIbACGm%O z1nYt*m2Oh_Tn*$nw}ST8Z<5olP&nrDlxz;5!b+Rn)8}N>)Le$Cf zc)8>!C>`=BJwVL9q!4e@e~ zdR7%1%5YI;sxpN7Sx<dEj$Wl@r!{tBfdT^C)Q& z&!s#{x}3`sFuAbl4Xc7EepQ;#0xL(9WK~+w+t$6Jlv1S)EwKjr#+FHFO!uO{wo zkNLR&X|2jNYnAmMQTn>dYAYs6%vIJ|6GWNqD(kI@qP(X{ZF=8&N|e2>&jxFfD7mh( z(Rx;t^RBYVnkvPC@SCrwdau^C<(?{J0;IZgJzeZY7A%C+gG5V|fy6u46x_Pj@K! zZSKcBA#-+&PCd!?L@0@_67m!hpTer-P(e?+C>33$kf(~As}2-X&MBTuo73D>l}9`& zo|>ZE;rbNyG?Vmn(|Bwu=jn}>o;d7$AsYBFgdMFi##ujQeKtj^tNY~C=Fbn#h%%sv{$7jE%nS1C8kPaTIPA(KNfj^-3|4w zXRi3XuSyy3O3xdj9Cwvfo&}=(?Z&g(^QM13%C2CdGyYlYS>)&To~DXTYdwoi9aCih zt@EsuP_5ih>pZK)r>83S!)J{s!`yh*dDe^aq^oT3Y!qd(Dnn_bXNSZ*M-_sy%Rdh( zTnS|@{#e=Vk0FISRI#D#@nh+R4yn?`yV-La+Qxf=R|4iD*HVbMCs)! z2RxTVdDvABdag*CV^BEnHXZW(A<8qVbn$-TxhBdySNYU)UGlyR%6k0S^r?pe++**A z#lK|w%;OJmPjblh`H~fs;c+NGN~jZ_{Ni)jRZe;eNj#V|(0IP}6cwL*P)w-PqM$aZ z@(`W&ln8K-bc=?1lz#N21;!$V+HRRp6#gaS397sJj8UIW-ef3z-+57ews{MB@0FNec6|zY`%0)~svPka@(vJXa~|dX z0N-JcXgoXNGZg)25`7Qlcl_B@-1~@xf~ZOf?_-j89~AyQPG!8KGv{0py?@@2PAh&{!8fpxU_TD8* zUscB8srYVD9@bD#(Kv4(iD!Z;Ha+EiKzyFpP|wmN?{GQ$3{{Bcdfy3hD|iPA|7<9W zMft#0=6RQka$J=cXn}XN#QY-^&P8|MTi*3SuFn_UP>Z}+g`PO?+ z{Ug---XH!EYJ>MDIahBDHPW}$dqvXou*N*nx83`v>D6HUDanQCHn@3xQ_KxpP5w9 zH(XNqkQ+~`Zv^s1G*OjgD&l)o&i=eA^?apNneHl4-*}1VHC0CXqQ0j?TtElQw}Q_fX=?~0P@ zD!2MpN_r|n;q>_I4Br|l`I=DpR}RYiqSSMh8on)3hK)6pOK`pPnK_>|{d z)v#;%4v5bP*Qb{6koZhepL%v}-$@PK5>uS3Q`dL#U!ku2E7Ttns+5NE*>!z?NiJ@2m3lr; znCr7ss>AGhKEEhVsSdLn`XXVj8@Icm8vByOr#TePa`$m%d>Uo|Qf0hC1RK6PXC*vMO)UG2a9^yIsWO zy^#Ma-!l?(G8F!m@PFf*CTEYTQpA7CH&a4ox}m=J&5}?J-B7>!7D}jWH`H&wMUuk4 z8p@`NzIP;^hgGTNzv^2h%EUa%8c|+WC7u5CZItp^uOPT;+!E15viCl3@Al z4<&^Mq43Y9Wc!??@VF`!tyKFr3H2kCOZZz%#q3Msb6tJjrIL0qflEH2sEKD4m9`TS z`1z}tDnw=Nd6Nq*Qz z-B4L}6Upfj^|7h8-4ZbqopgQb+jodhd~DOs9wZ8{Qt@vsW!r=0?C}+Z9Qy%D;g4=S zIrh*59_3zx!mSedwMQjzpP5k1wBHh?zN%^9<;*tC-N0sSp|iEAJ9?zZc()o z5_MaD@uhhq;Tm8R_a$1!}f!h9Z`S^PM<@(g~SI@`SE53Tt&|f1T=QLjl zv*J9N8v3*Hahjd+M*BcRe;rYr@kaYVV}C=5xr7_4iNBdBRb8d2zqQ0%*HxPN+usy( zzd$p8r<-E#7ii({D)F>(L$&nx6s4moc&7Fb$j7D87YhF-Lm4c}{jPF{f0*QSm?}24 z^*<`{JgM>$QRjfSv$4M?0t1^f>`=8Cnb#)6A{@K*U|Dwe6 znH#FRe~N_4b(MSlFH3s9b3^s@FBRnvRfbbv|GQEec1b7Z0sa;FVtjR=aC%+~+~;43 z*`XvVtjba-YoTCGG>@`bd}_L(2Kjf3(m<8&0|pIb^ZRZi2h{$8TASH-3m{R1RD zoirYsruc{E=N5Obt4#GjE-^o#p$Y}3`=1kKj4Dg*8UAUaOjX6E8UC4~yzMG8{j((I zEl{|&^q`mhuS%&NRG*5$+5RP>9C4L7{x$izHO1!~=J?l1F1}KqbeiYiASHheinlb! z{HA}alur^YR?_J${|DkzRTZ0-`FH2%dv`r3{2NXy{QE^|rHT#ZfG8bZWu^aPiMgl7 zGnQ8SzmTglM3v#R)_+2LMyrxe8~nMVOjczgZT6oQWv(hcXsiFcDDSzUKJfn~Ww;Xx z|I%rvKagaVNutl8n3bBH{*Wj?s4^`0p+6A{@{K=v{(h3Luc4U!@S?vz@}5MeU7w5op`u)Lm3)Dh zB-CH7QYf%AX+Gh7kEl5pc3uZoO8F$JVnbOgJ|$eA;(_f+F{G!8D%*m^1G^;VMsBF$ zfdfhW?AaCy|B|Ux;4{g^J?fKA<)HA@c~F%eR3mUglnJWXR6p=7(nB=WRT>9=O5*`Wk~yBYT%Rsb*k`Tl(>G8vnXmh1*XIE!9O{57=Yzuo4MjQXDh~x3C(p+@ zPN_olaG<&PTvWw|(n1uwtaH8o6Szyx9-p-y8|W)ad?(LSP`C{iLMZu4 z6Q9>y<-NdkQC7Li>cA{H*B4N@W|j%93A~!jZRZy#{Iltk!1847d#||4=YbW;+&_EL z9G}C1RidP*;-l$i^5m=c~|){@Ui&3s!DF~*T5H|yzTn@8u(IDxE>1s28PZDj)~8H*XMlTg!mj+ zpJAa3fv?5qoa=KT@J%w`J+G?|o*9Eh3Iw18%bA#MDi|zYfXgShpG}Qm_?fgE9J2pXpZR;2jd`uqwI1 zDnXttPonSgD4oRTcU3T24t6cTEjN^I$|o60UrA4jDw{$zpm5%Afx>yu4Q2%giqcpW zn{E#dk$CQO4|ap5Xn#mkV(19jc*hdNR1OKn%)%+?Xc@R~O)x zJJt1hHn_V0_Y!l|2P5C$K8bmWD%*mr@KxTTp(Phg1l*SZSSsb(qaxUhok`!JN^oX*`Rh9;QqI{^za9S4hi}H!9EDr_? z@)i6FiaGnrU|5tNU1d!$SwdaaP&RD{mMqA%E?)&x8myGY3^!)6pm02^LmvbyN~m(` zvnjMQSgjzpraG$Bf|4alTUFYJb_Hw6*?Va`{X%?O)BRceKf1@9N-YgO8ZP6Qt)$nE`iH=eJ84~owX zRnqDE;G?1>S2U$jF?c%oxF}^+84~^>I7*Z(S2-ITBPnd5icLQTW0LpoP|R53$KV7h z)qzk<`|^aIk(@rJp*Dqlp(zsc^QzQ>GE;mOt1^ZBp;@AAQ)M`mS0vPaH&i$@Ta@or zX&*`q&5=-6C6lk=ls`0Ad=gb@A1WA{UyysPbSS3&q=puVa=R)^!-YfdNG{r|vLak8 z^q%+(Qe}0hSZIyp{ZUochf9Pu$l0HQ!oN+SlA#Yoc}xxL-eYisC3pv*f_1P4v7&<0-PpvG;p1e?8NAR9@p;Vkxh-TD z;`Tny^~nqc3-Nx)>8jXNBb2WYKmEM|h0p$oCo7a(h_B9KRcxviDkwf%Rmo@73KcHI zJ-{*7r*^2AD8H)G-P0gc8r!~;=x-?ev#C)itq_lm?OU9jHV;*ha}`sifYmLOA!)7x zg@0uty+XA_X_7~&D@vCLEBq4tu(&s8aA^$m5Doc^FnDQiHeM*>%8QCg~E z(=(x0MCqVP8+tx8AJ-kbF`@7;nWlyoi_b{)scgNh%4Ah;wO$FmE1_O@L%kYWDW$qd z6`Nj%!Zl&7hH3-ly+VA?-3P_A?s=hglGCFaYEoo=XtO9M^C;UyIprz~Lp!B3eu833 zV@c?sC{|TRSsMC8l!C6ZEcB@;S+4SK=rd6|xytg;7orStl@*~cMS0RyR)&s<@`|gh z3LTZ4z6*t~#ckGmp=08+&GlIm`bK=dgTh@scAbU36XgOFv$N>^&_$_Hfm@yOc|Y`f zA-*%FLgC+@$i~oLqC{O~Q|N{$)m&wB$d|&QYP-soP*9Y1s_c(!357-JtjZxMkrZy- z_d+pOXGm^@O5uueII%;<>qJDKSPTph0noUAvWvZ)K;pGy~%NmbOzVOPF zamd%&s1qt7yk6p2sG;g56bx?^Wmz6&vnU($C|gAtUdF`3p|*>%H;>N_Q7Yx}`B0Q& zd3<(D3V(ybInAPi;k}|6_R3LlViPN;6qb;2qcJ|RBEpl~R>=@vdIN_i+|Op+e{ zR+Q>cE}|crOqIhw%C%?&#kB6~;Y;Gv8H%Y<8R08(u6|JXH!>kB>`CRiIs%G0S60}U zdh=XC{cwW#Oi-UX)D#N$>QkX`J;Ymr;X>jwM-}XC4yTB+JdaX1mFxUwRT|S>;akLq z-M9C~2ys)0pr?N#Si!xC|F2Obkz!^xO%BccIuc zE&P`F^n$`=*v^_BUWPTCBpL$6tgO8r-Y)5R3=02h`Q8cd5uXXJ&*Jc2iTOEKSsMOG zd}c!7vmZ%V8a^aGZ$UAou_Am#N^Bhz{^cgD3?CPt{ZPyk(8};v;`5FAbg)*1b0y7J z)rXaD<>~}(GofnIn()t}q`S)6@Glao5fsj88(J4WC)c7a6#gaChVWJK=?sPI>KNJv zh0D3G`lQmHaHufXx}i|GS1&*Z!ik0Xx{q~zz6ci+pBJH+oE{68F3i2wZ1tH>C&FnG zYLO~$(zoF%5^4(+Q=dWLS^tqOB}&X;L?8qp_aCNCI!M23p8Qc! zd;%pGe|Qrx@`NZqxk`!1LOeU-Y0Fj8BWnxuGrmFtP=T9lmdB_k0ewXC?@7x zBcB%Lp1*=B-F>%3juf_|SewvLji4Ntvp0sqW5{}*8j)O4a-f(w{F;$dqTC0C%doPQ z6*())NL7Yfw?}>!Wr8ZVT8$%D<$6tn!atiDNB$I_`Rel!e6ESIT$M+yCXpMWY*XcN zC{_`!tDmcKztubv5ap~YW2_dDuqb#TNm4k@Y8lBVN{T8^S*;=kig2GvInjzJhb1nEi*n zBdz4@@2Y~4YvfKj*Lo;h@z=;VAaa+)^L(;Vy8G^nWQ)SP7TM>J@BT=aBHS(xYdkhR z5V;rW!A{*gN*@XJ8x(T|ABYSPC6MJP4@DjnrGzRg>5<3?QEEal`}7`(j1;A%t2`PR zC277Jig_*=8HtI)UyCrxAJn1S=M4pm(=0M@LJTNpWGD(zGstgN_i99FDE>)^0 z#v(6BJV#Y&OyeTc#D{J-@#H3qk4!HTLusU{V$;OP%SE`aONYY068R=Y=1QpBpqLTt zq{u>18oJ7}k;PJ~o!oeyk1Q|3{ow$Or%JvTBJYXMDD`1wt;91kkFrseWl*@KJZrra z*(%BgRj{rX*(J&@RbH^BM)pdYk3iwyWSSoNOwN8rl@r$V$Po#3MMKr08Ifb+6RKrG zov>y{z89auP)v{XTI7c!-1k;gpJbXFIV+`F4T>41yrW7}S6LkSNqo9M;p^3!mPUS& zm>-5R3V)Zp%ObxP;TrxdEK{mG5-&(DUV*|toAxCBU4-u!Z|6~Nh_XhNnby8UD$3=& zQ@Gm}K0LNPJ#PYf329^fk|T&gcvpC;xP=M&pWE^^f8b?djpP7-Q>8|q?WPEl^TF({m`g>)^kYf+BzJia@_KO0J~qL_lA zZuc6czbBZ_D4YMKWDWkOPwJ4oN_On|dgw8{X>^`JM8#@~rY_p;!I9Wc<8j z{JdoRykz_`=umy48NLk4-+<^tyq)+HSO|-3=fI-iWu@H^-*$jq24uamGE?;yU`6P6 zDDMVuv9n{_8*%!xV;?H_3Nz>cILVGuE;t#y22KGzjX7KfC4#eIpJ-yzl?(cj&MRPp zKn8`Insg^Aizv$|ZxLEl6KsZe9_oP&z!qR@u&uH)I2-962)0Al+OZkiS#+Orv~rqq zk#d9bpz@URnlh!iiKl|HuCl$dpYjpqWaT{NCgpMEuS$Ol6K@G+EoF{!q;i&Wv2vsG zfbxX$iZZ#Si8rdeP1#i0QQ2SlsPbv$eC0OfA?3HqKa|O>%z17V=ERzVeqT;3M>$ma zsB(<*8Rb;vY~=#wyUI<%4B7|sbv&Z{N_j?kNqJovY|Z`|lniovNLSvjY%R>9ZpuL* z$3F_>dNV=o=af^FuP7HN7b{mOKTz&fexf|A%vJuZ{9Bpa#+<*rvcB?e<#6R_<%`NU zlpB?~%FD{Y9VXsl%3GCL%KFOI$}Y-}l}DAQl$VwGNQ;zL7;J{}DgqV@MyUko_eH6q zvNl)|?Y<2-+xGkCh@KOB6RZ@>i7ipCP_EVEd>y$SZBzSz@=N6@VHRBgTLiP{it@TL z($?t3m1)8#)c|K8eGNfQXDj8SLW`b|;}%T-@#Yde2XcQ?yB)`u6YB^1eHM)dSK#<~ zko(W)LGCYSDCdG}aQrRskT*)J!40t2fm`u5PsUyB@1@1yA$(n7h0vn4AjiK!=#}%b zy+!p8l)Lo!M#c7;O+L~ay&}i+7rEq_Z0er9M6M7ucX88%Z_pRF&`5> zJ2qMvrHSAMT+f%lc?drPd@~fK*TBWF*MZAH&Np+j+8-(pC=V-hl|L$fQ+l#7vPJj^ zxG9uHAA)a!dxcT@1NJnB{bKw58|`$CK`<62_V;J zPA}KzC&kW*O#nIm6JUb`6RruE3!C>>8{MMQu(^J6J&7OxXM7f&)%bo9#*cIQIeeiU zqP_`EdBpQy7&@0jIgtG-fqq{qy$(_&mEKUktz53$B#hEdko%8)LUTQLB-|bQ0k+>) zldgl4&~J0SnQf=j1D!FKo0v|I2rY_%4Y9ZO50Kl5r;BN)L6FA{g+LxJlvO`sX1PVtNPW0Sga{5i3i$^}Z!AM4B1Uaj1&+^76j`HRq8hdPP>=HEEJEHQ&B zcQfOwp5R&dnQ>iI$9YleugA@JE~?`@6W<0*^KrlRQ@$wu+5_M5$seVwUbL+}9D6Xg1LAIRN$7uiqrU-*gM1y*l=Z;EN#=f- zhU0T#SHw8veXs^>=RR;oY~#oK;$G@w@;h6(NV!J26XbLrRsO0B^kqGrsGqsN*dY5= z1-W0Y19E@ePWAsaUVcH3PX%uvJuicSWQ*QZeTi}d7=iu)I2&IZ;rg@=?^^PGtpoOX zJ=UMgIfIsh_a#SZ4LB@0P3jl-Q~P00gYKj^Tpnj_Pw~>eAw;{t{mO%&ALF1el*g3c2;=!{@&M7Xl$;os1GBZ- zoUdak&UH8UodGCcuFq$%qID1aegXNsS3o{5){&?e^irwu_~*jzmWuJN&`UePXE5`> zUucs_C*GizblGImX_HAObofn8HU0M+SVK4ldkJ^~T!DDL1v#H*mFJXKl-5vlJgm$w zH1UcX}o6~oPvOUQ0IO*#QoBI{+{|gq*jwL+A@nuj7$o0Jx z*daNCDv6y*HNo{oqI3ty&jFp}IKEMedcyhT@pB4hruslHR@Aw_S~LiDY3L7uGvGHt z`7+3JWM=$*ckGRaIi8xd8k~XoA|AgkEb66=u$epLINqAWb>Mc-_i?^n2UR~ROxJ$e zjOSC3j-?~mKT2zrTfi9z?~L>Ih;GxD;578>r$7#u|4}@*6|<-?$mQf*-$t-|Lg#V* zAdsI2n604meZ33F<9sJP_xrP&~=f8C4`2Q`VGz;;}#{8d|zqIsu#?}9kN3^6dr@&-_K{ET^MHlu}0#eeo~9C}ly9=POE$VPluO`~1u8ZL*yv zg2%N>7hL zKT|4$W`Ro(&s!kJ^Dejm_G)3KJjbS$GOVbqs=Q5kJ3iLyoS&b2>y=8T^$0)PHsKnV ziqam9_ZWC*srY>=@+4NzO69}~D@zM4z3vuOfz9o*rm}&u1vn1zJ`WBkltD8`Mi*Xu5JX*b4e8VFqmg+m^E)?@id;AFcp-oV`W4AN&mG z;eL%2!nL5!L(0Kl716BM^RH8O*PMUzEt8*T6Gnoc0!_1F)}`vFM~6x9D%MR5XK1 zOfdamIboD4gWFTms2a%QnYu#rJXk4;dLVW@f6v0M6wQgv7G}_5ko(p5gqgHSc~JEe z%G1ho%0HC8i6(rKvY7G~VJ7kX*bHALHB`HmFiqAo_`ZB|y1kT*<4ut6d%%|X3~_HT z8+=$8&&T1X*e@r><7ehcu`}o_$m4=@;4Z{-8T=@k_CLxgO3|l@4kP|_kjw8jWkVtE z!{8Z=PuHlvRk>IBsW3{(llVGV5?__FUNYg0-ncC0d2pQT4X@+y{jQ|i<-is=-nl8) zuXz6M5%OG=tokab9qIDc+LR%ynKINnU+Zd zodbucV25Xgb?u%Z!1iqu>deW#o=8vWPO*$Ht$Ne4YejfE=yM*`B zM@o*T1HyB-o=8vLa6J)@=Ows4-5joC%v>KYB~In?%GP?B9m@}!+mX5dM5!q3$ID0M zxt7b7?`xAa-BUn5|CI73oy-jQpGeP+)zWyJ>(NBwapslHeg7?urzgny?}_s`{`|bK z3VKI`TUS1do&pbn)0K0C&U{@O&4bPD-n5e_Eri`J5T&<4&d*BadgXSZDgT}*Z__Tb zW1ong9Xp}?PW?^$FzGvsbe+@ie<9E9h7>n(5#j^~}P+6jAc zg`C)4g${&PgK9}d^Og+K#G;|(kn|>-@|9Ku~ZaFi5|1QY!Gpo!nqs{`U9*ZV4mgOa+rryw#Iq5pXv^ltcd3~wI2t0 zob&=%7dk)xw6B;Z>lj>qE1)x-_#FP9<4u!wx>*&{=@7y%s+cb0{6k)hOEEs?=cSX- zo%R)~6u*zweHs5>rczF`m?-Jb}VZa=OaFk@2n3s z6+KGrmG^*Lex@AEy!ZmdE9+2|qcjl5TY^KtJHZD*PWQtgKR=EHxgQv-oGgsebg(bx z8|Q(Xj(3EJALMqt5#;vsfpRa%{w7@(eXja(Q1YR+i4XI+uV7s`Pr96Sw}0mIzvnL} zRs!L9{^Ay8ma?(XtL5R9aTTu%^SGDO;iPXG{P_8S$6c(yD&ewYYn9uT2b9N@Un_rA zI{l{SRa1@$$`oZ(d8^Q(`XHazjHfJWsd{^GZRP)!?o0~2#_cGRih*CC+<0D{uVWN8 z&zGfxT>lz?M=M*@SnYPoPGD(w-ptewo<}=>FRlaTqZ`iQ^k+~f@G{~z`;^dMqW$xE zdO&9mR{lphNjVGr6XE8AzFVC6xhO4zoe%bU_PZrb>vw9A`Ulq)Ef(5}Gun6Mkam>fyTl2UcrO|Sb_oKb9+$K8S z+>?0X<3v;M(q*0`e^r~R&gbyvy5y^p9cuxb+jR$!=T*Cd8JOSdCw>+UmE*X72~D_a zRSoM_&5p&y59^@<qzeKP6ne{h0a8C|!Wg?b^`#haIIqaonzE z;bFq`JARP+3BC{fiSw3&&Bu8?wixD3>%lIH@x{X+r{g0qKK~fidDMUJTX5FBopkYd zWC8ADUr0RJv2Qg#-jDHh_3YRcv2h=Gi|B{yQ5_$pk=Z|#K~xARVx|ear)E!RC1DgKxoZ2`&YBeR-|=ZCCCCIX|C)JYG4X`WfX#kgxOKV66<( zz88Vq-!9GY(nE{5U%>c7#vK?RB0b#h&2y=jM&UT$Po4%V+BvaVAm69VbEieK#kS~O z_1moWCm>&!uhr)Ka=qexGTi?1y+f3E8~$@1SO6>v7QW3HuQ>C=7@tAsa^Z4%5`IHq zbNb#DJv;WEa;x$ap>rRI&qwgQGhcs`ua2?5)!)0=#9tod@fDXlw?}U0+#V~-@eJBk z+w?bwQ2$z2MZYe7Y3gUnm38Cqtn--rPK``F2O%EbN5ktKwPD}57yEC(b$WiD*X4Y2 zyJ?z<{j{QI$M)%QzF%-WpTXwvX8klO<<}SXN$6Y;&WJzSjo21lRhyQW{3n2eGOh~!}DxU$bBi~cS z&W_DkZpwW<$on|V_yPSe?35Z&8AlZZ55eYrRlMJf&+{2& znKd$KJlGWB-vD#K0C&NzR>GoBz$annf_#7e4dmy)EYzO|rpIk!=EQT9*{Q9iAFUAY+K z_Ot@5hIN#T)mZnr@ZbebQv$D**T+b3-s)6Ixz?RDHVBIY2bCh_zG!QmF7mriE z0P;9@wsMhjjq(HK0p)S!8Rd0lp*1F+a?0vpbDa0hwMJi|{Ac_dRNp4dj-3-?-}*WZ z=cgiIFXWG(OHyjYpT{bQo)fFCY@lqX>?Vx5;rqbmc5C8s_7OSzCoCO5qW^^-m-max zmxUemzJ~b?iKiyzg6ohjt`D1WJx;;q>wZrB&AR+L=*~K{nU}EW29AG_g?Dn0AKs4| zUeD>Ws36GaO%rBNZ;avbFaa=W;ybn1I#qtOcry;KHVSTuunZZhR` z5ae(t!G%T5exK}GQMz?A>ruKLtb}np&kOLrS)LbQ@;t)~_;J6=_W|d)!<+rms59c3 zZKqK$kndY&z7F><%!}~#i9!Dw@jVNksr7IFm!R{wbru+?ogG`KT&>(G#Cszkk2ep4 z9Pcr(KZLzqS1f&3oIMexzu z7F`oY>H1cpowcJx+f2Fn!M!+N0kA5QnW^?WV6;vKZ52C8{vDjoC=~>`U7B&SGcLhAl^jQX&EfGh=DU@* zL1){HU$71eo9kIia917Ee^jq)(MZ^w?{UiKl>A&*vu@na>|=B64Eh9qANrE1(N26l zw{EhmE6+lF7hwnSoWlLnEDb-a?%lC#(D^(CK14Y96$RN&2m2I4Jx06X=lIdEi`tkM zm+Rq_r`NqclW?5N;S~+P5d0qTEf(9H_d;E>o__`B-z@&|ah=&;jD4CIH}UzM{%j}w zxO@%>O@HXA7p3oE2kNEK&tL-VYmM*)!+I74cHucV$)XgH`-@T_w^v@zDhEHF&#qL@ zd5(w@j~Dx5Jl7U}yswS-HSzOx4s6bkIga;_MFH2fWZb9 zZB_083&1|8{0!vsJE{B;EP>+}KyC-7-Z}ZoqNn#8e`nwO8?f1LiR$kOQ)%!4jwh8K zQ$8ugeFfz6Z3nG}nEwMg{5Rm`{8{wGK|b#6|Hu0WuxI4i-?|od{f0TQ4azObkCcan z9b>s5uY;UXUJ|1IgR|{q3VzJ>IGG9wqf`py_EQdQ($INN1kZ7>dEa&>$mwpPYzK0` zkppu2yQ$qrn4{;<(evlT%=z)$qQ~b5JI3A=#-AUY^$pW6#r0kA8=2B`pmw7C}qOtac5nyPGbCg{2s-1obP7|mlOM4ng4U6N0qge zcPYCohX}F$D)kiWaZ+w+G!FV*jlJ|N*sU?%djKaj#&{2W1-6rqT3?v*b<*DiHuqm9 zzs`FkQR02oTn@ain(6F2=XC(937$*4nD-et|9;pe-`LlP_$ubv7qJ(%)g&i&Ncp95 z1md-t+*~ex`2B+8OfC;5mk*QQBVpdq<6J&$^ZO`FE*F0jbASD#kyqb?@lyH2oF42G z0cV5t!HKwzEy3>a&jx#gUBSWNz2Hc&KR6D22z(A44^Brup9klFQ$ed?CLQ|H)CUtE z_Ibn3-!w|UgIw-ree<97JYCO^Z~7j=JXTYDF$b*Q6!SrHU$yl;BU_)}@qd)izM3?| z7a-u*1pZyYindMtg-9p393Kju0RDS_q|;Bv={t(@^4%TFC(NQUAkWKYDw`>LDj!tF zlrxlXDc30X2%YtQi@t?HfWopB>}$;Q0*Xc2q){uFOz2RJH)Q zpXdO-h;rj`56}PH1G`DnoERPF_;O-CWuh=s-rwAT^qBZeeL3FLDVHotg&&tgHDwFs zJwl9g_56>(=5#)#oUUA`T&>)u+z0Y=v8g9sDtvoEP3u2*9_~&@Z-6AqJRctgIe*Ul#7Wp3FYgQDak^>e&VAN-KP!{Ed`mPQ=j#s^&C}1WhP}Oc zPV9Z<7Ud4*9wE*TPD1=gK`vJ_uFur=pQ-IXlT7>1B-8$}FAVLJ*Edc3&m`0SGs(33 zOfv00lT3f`@A~K5f1P^c)JLcOm~jr)?{NM2`NPx`TwnBOP0+rbdhySC_#N``X>;sz z*BpRYY7+EkF<&_iJl8yazvF)IEUwr7Q-)s&<#;I zkn5+JN5Z%m_F$aP^iSqKI0}9r$54+-JM&I>{>1(6a0~1of1T?I)(=iIy>tvL3i3P< zuMhHb_vsdybXAULlJ$eBR|(1zO7k6oG`$a|>HYxh*U<7X;~uOd!T&JQtZ1HBcFkHwlwFR)-os7_zagD=Cy^m--2^+{88`?@Hy~pgr5m=J$M!5=V+(iI`w!F z^kwkd0B!*HgS%U1(a5vdU(?E*uURW&w|4C)jm2^9*Pj6gwL-lB`8>0QCfscJ|1ExL zdfbWc-?V>3yN5ro!+Z`Vsa*hUhWOLKqu|Z$t7EJ$bgn-`K%QST`(>PYMT>?*ztPG| z?}0pi+5z(QH1lG3uS>#tb$-lCNA>t`;5W^^bWQAzv5`OVc`|7%IKDZ`6Xf)AJ!skb zpLPb##c_TvU9Q|F%%pwb_~x1Pg)oE8gLk$@I|uIut)C4Oz;3WhgS`-cRglZK4%iR+ z&HW$7CD8e~`J(v6(#A_q!;ky@o6nO)UrD@KbVhke=|9Kk&!S{y8D%A9O=SaRdu1Qx zNac9tbmb!DCgnk8uJRY<@5;!pCLKkU<&;^%OzI2r{pvxG=g-~*`F&!}XMfHA6ClqY zaX+^d$78TpffL(cz6IQgdDIVX3isdRnf-r==kxy>kC_*ohj2G=d@s(I?>yQO$m>x@ z!N*|F1G(O2-jPXf!sh(kT#qctPxm`azL@oTn{@vU|6%{XdM0@qp%Kad}-}(i}{fT*BG)?CFui!lgp66$p z_eo8XDr-mUB*jQ%5jvz~Az#jH0l`@@gl$KiP~&c_f5XVD0d z_s=}8HqRULeEL|}%t@+G0jH+M=Ur#O=6$9-e>}KQ7I`ijCMnA*YYOA#=)4DH=H;An zv~}LW*82$lGZMnBX=_ofOXj*Y1bP1Jk8Jba??2};ocRrBJ+l@3OEhqvTkt+BY+k2* z6)e>b-&zBCKgN5aoA+8Ov_t-2R|WSd56ST~{ho$-|BKfxLzmglOUcTj;G&9VpFYno z^7k~@kH5oFs-2S#CqH;k5Ao*B54S(ApH4oUc{-CHtiK_CK5p`l>j!&oyC{tW7lISO zcfcv?=gdbq@f?G`5Bd5*kN*aqNRN-VDqrE_SjSY>QZ^T&{{eYC?8G+^_Vsr0@ciA4 z>j*zu^qd%fpXoZz=genLfX?G%-q+i&HSSkp+?BS^)9>z z1@bubX8#Pj1pPy_lm9+%{(q~-zb9}V@x|W*v~)jre4U}z@BAE%at3*v@*2qZ&jQ;_ zKA8NyHD*OSnLfkuKkvf4*&#Ep!u90YM%a&W)%X`xE>yA}&yRU7>)Ag3J*8zh&iBDB z!Zh;!Vd_~TI2V50zL&Lk+Nm?&i1|+Ov*;f1Px$fuC6sOUL-BWPoPN`MSIs%zG1g1N z4Frp1JMmid9LBfYpK(035D(WkUY9iMux4I;F4DpEpXbL+{CF=B{on%ln{-F%Q;q*5 z$o@YG(Xaf;<%93?2s5aw@;>DdZ}HwhCTxD+ zs1f*1yG&}M?5Z5Bd{P)Co>!dS0sGNmb2^>%6Q1Xr-XWFNL1%7N^7;weJg>^+br$As zIUfH`$Upmyqd3m>`@i=emZW0?%8S>X`F+LH;&1B3A4p$~zfFB@0&+bt^#k+s7(ej+ zwl#GAE`+mwXuda?6XSk@=cl^hIJ1v(pmKx|`!mq*a6RPr#+k1}=k~D#@TZ38ORu?27otfH#uRew42$ z-x9|A#ou6e?P%s-nb*|z-!MAA57)J0y#Gmt&fhgD1ujJYxdP*u8%Y_|7Ir8*gSvs- z-kkZX{;*ddJ;T6Dc+Pd&@yBSN{QUV8^fvDIsm%U__d8+VEXH3I-F=c~AOF5in5QR; zJ_ZxeZh76JI&5y&w}XQtQECRZ3FCW7IcC2+ua~l4Hgqnx&LH>Gy_Dv;9P5R!xgHHu zj#E1GZLh-S@VtKiInMtU>|@}2Ajh{wxfeVI{Zl=j3!a1hBX|}38{~akK?`$Gs8`Os zp_%uJUl;z)T$!AlSPjHoCdaSe8}iF~A>Y6GJ+bth`2F1MuQ&Z#dQKYEM>sxi_KTYP zJnvWG{ka*?o67O1?t6^hv`$!&mV zo7xXr2VU&IVdEcE=PtU_{fPTU3 zlZ)y;Iqds|{%uZ_B7TfnK%W1+0H(lh6L#LW#dly}^ElO6ck2lILzG)*kmsj(zGD*N zGW+%MJ*yKu&t%>&>d_hd72tOyKij-BBIDhf_ z)D8Cf&N;DO%KpmxmBWPDu@PYWz0mAfOl(u$A0S>cF2?;;^_j}~Ab$tW>=&}=d)0qd z@;-_*v`@YtpGW#Hik=;_Q5X0*qJZ$<=W)I_=Y03jycZV#-kfuu+8VwQ=zK>mwF~Me zp8HCJW_*MC{4v%MVLS6d!{E>F)rD5 zK>q{%nz_Ga(NWlsbcvTc-|xD1$%*m(jmi4~IQ$j(Jqi8=a{UZp?7A4=6XfgvY4iAX zeIM7TliseKlvjZWzMxb$93-|6jKAyu#mi;PXyHcqTum&&IwOepmmHw_|LN z@~HBR@`}<%AIp9z!uWm+=X*&tq4W2WcpT5`lg(iBe0dJY=i~b^kJrufMEt$D_i%hw zd8ZwrUu7Hj8-5S5Lj}tnr@OH(o?o5wIp1I6{n^L5n*H_MKkq_3$GYNq3gmI| zY21IN;r??9b@qvFcyC4NMO~PLwwoCCJ}-`Uafa&8y$-G5s%xGy6+)9LmQNO}sUf<~suB`zwX-L7E@O ze)M~s?&NBz7{V)?4zxGuJWe|#jJGrXZtAsrur3ds`KQvKpY3@4;_-1V>Jh&uIIug~JdSg@ z4F+#<^NaZ*)E|By)2uT%>!H|Jj4>q7&({??`-S6vHy{7sx^o?Pe8TnfZN$g-!Q~*^ zX1`c`{fO@$d_S&<^z(7EpAhfU++@egmA_NL@0r~E+=+Z4{$ILdp0tCxpR*nAakE{) zwVm+jKjGKR)y;Eq?;e?S3OYYGUlGRNYpa^fI=;7}d;{e1!!n_nml@s6q-TR0Z+zTV zn8%oyM{WvoJ-kbZ_mjYB$r-doZ0zgO<42U=E1mlLH|*A^FV6RJa?p29>xuPBA-+2V z&gvPjN3!3rXHM)n(Q{(cm9HvaSH7WqTe(#Ep3o^bhnVlgIGVo)VXlXtw!#nJpP=uQ zzbOM~o2-{s)>gJta-Yh_pH{xEJfQqld0kl;eHZ&@D(_GZP{x!~m2;KvDAy~w59D|b zD|rr)?ShzdV^&bsQ?^$2P(G-9NjYD+TZ#WxBk}P6mf`qHDyu8oD0?U$R!&g9s$8es zqx@d!En?#3|H#4dS60?iHc|5b%;4kQl@BQSzfiC~OZkqH|7Qd1A1QN{e<}UwTlhGC zGmBYX$^Scm?PkimmHm|Cl}nXdl}DA{VkSI);doW8coe#%M8x0E}S-zfi77Ak4N->Ph>?5!N5 zoTYqMxm)>_@}japDUDCrT-jCmfO5KWo$@PXVrdh;yz+Ksd*uk_ROP$M!%F@}5|;;+ zF-%fcSGHC5Rz9M9TKSrCp>n(OQ{~S}D{A5|uB@(XuNp2FO?)ZJI?C3{Udo}$G0LgRxyn__UCNJ@7nKQ>%z4t4cPM))M=Pf& z7b>?YKT-aqyrwK%*~D8-*;Ls}`M7e5a*=YQ@}TmV@`5seIRq}};>ya(mdf7Bhm{kQ z)0A_R%aq%d`<17Z7nS}h=6r>e>B{=b*2-SWp~_Lpmz49BE0i0R`;{k^-m2z&C6$$w z&6Pcr4=JBfE>ga)Jfu9U4Bl$uEubu`tggI6*L)-DcdTC zE1y)ps(eqmQ+Z5zT6t0VhmxwB^M#dVl+~1VmF<;1l#eN&R?bo$RGv^?Q2wP1WN3LQ zODn4@>nocpJ1P4phbjM~oTQwoT%r6>c~W^*8NAJ$KSfzy*-ZJca*=Yg@<*j7(}XXi zEU#>$?5rHEoTgl&{6P7Y@)xC5!^B%u*+7}2?4=x~oT6N;+@kzUc~<$CGJj1Ie+^}0 zhqkMeQl3(7^xt;*xd^Ga`RO{cPsvXgSKa-8xNey;pg z>8oerE3a&!?4x{0xk|Z1nXCL;nOa}tQPx+sR(4m8Q%+UBqui_fRT*et;!9OFQg%^3 zsC-&EPq|U~h4P9rsiBFllCqJqt8%b%ta7^YZRJMg0p%&B-N?k7u56>cPdPz3SNXnj zxAF_+X(hjt!R@L@W5ZjOO_Vvx!OF49Im#8vP0EwXpOx2@sZC7$)s&5tE3mG`=WnZa z59M&>Smg}mYUL-&3(CZ%CjN5D+m)@A-IN2Ak1EG0XDJsdS1LCsk0~!I6PlUx6;s}- zY@*Co4pNR$j#oaTd`0<&FpXA%YkQ{2_d>RT8)5J5iGA=`*E|R=nNM^a`f=#3d!^AS zuwAdH=vD7B-)noa7uKtGaJhQvJdQK3D$TmCdGC#NZ*xA5IXRH$yUhQ6FyEKqeP*4Y z^ZIOe%?j*?nY43ZG_o-eI-A~h7@NqvaR&G*$qCBO%stmVef3wbT?%pga3H#!` z$&?0O1s{0?-(WbCN<9CR)f@khM#=L}Y!84RbByu@CC_8A&huAUz5O&7`fR(P^%&Cp zMxTP#F>ocgrw^Ae>;Z-|?>D@AFyGgV89YHBILjkhA0QNUt4=q*uUD!W*@wN6m$1kAN>Xl{xDYQ}i1GHZ4y|91x zhN(mvAD>2_!M@>5q<&(LFY+twkS~c|6Z@&)W!MFM*hQc=)yM2P>_f(;{IH9|E>w== zdy0y|j>0~X$FATjOe@mk$8W{ImK;`I>|jOs7xWd!moM2KE9t2Td#TvFC`*o)q@8Lv zf&KqccK7jJjqd}%?{m(59`@9>w)I(U)!J4qq9OFKv?!*gMw3;;Fp84VqL|uh)~MKO zt*}VnVG=^Ln8eygWhNO*_Wc?rAsWIEe%F0n*V)ee_uD^vyRh;s?(x&KL`4qbx%nJbe-E5~VihKaD@ zRK6O@FOa8+9FG^t)5UI&3*;H1)8iF#gt+7kRlZz259RNd$>I*QUwaL_LY^&(JzfM) zpM2@@0{FFoljtJx7UY+~Tk=_FQhkTP539H4(Ny0Pa| z`~kQWT_Q$-W8_6D8UFkxEuR;Oq_dQZarth6cqitUNAH^gU-fjl^T$E?Pd())f?MQ7 zRT%#KW;)pC@#Ww)kF&us9?u1TSUIaD9@XR=6SFT?m`k;i@%Jl>olT0KrT(?!xqDo^8anaE}Dg8Vjl8GI>+;%|X{ z;BD-E;496`L?innj87Hq?9ajHn^Og>67c8OXndxLSoZfApC(e+G`<-kll=$8+hm5w z_jtCMArjB0`T|o`{g;b8_5kpB^9s@Gak@F3e=FFpjf8lc%oKA+QF-O_%}kLpnmiuk zSBgCLB=8O9m0};dL7M_@kyi>>Md7bOyMaBQeH%M=EXD6-=dxFW=R$o|>`Hbj>=)Gf z`~>(E)E^An3040q;9tQb(f5fua2q%sUBc_%l_K+B&hhv$Xs--iE(T73r=!dnA{oY2 z&5zT;&zM()!=3KFvJqiAQ zY|a<^(B)z}{Qum{6QkhnqAIWA-}X4F1PlBC6PTfo-cm z)Uivz;nuyPmAw|@_rlQ|)vw&oS}LL^ksk#QwhG1V?8m`pSw%wq+N|o&v)~kKx!8to z(B1(19;~C%~QN3XyoRDqkc{f&Vc}L^?YJrgM^Yzu3<1!~O*A*Al=} zAby;E8hE<3Mzmf+{W%*v8$Q{6iaic|gSB3ql}7PN;9ISSh5FT4)&FVWMb;*f#l8|; zU~Lu^=pv!K+}a{CFQxqJ!E3B1MGd-0(j4RojBt0-_~x?fi4%Se1QFy7=D#%j~rpwi!0DnzQ5fd=6d48?ERvX zeFDmlv>V0M@Du|a-|_m}Bnr{~fZJg`h>=ZVBf9`R-EI;)*ek)a?Ds_@do4Hz+|J&F z@q^+N`&o=16p=Gkd;Wl3;5qgOVmMiQ2fP5B$^Hfe1h|K~WmHWCfzKQJB(9aBqZZv?kUQ@ervIQv#~y|E3v1o9Vi zd>6RTv9yiscfe)R(zdhd_}|h#V}A(oCd<+~JT7r;E%{c}KfiVa;y&qUQ`ldDTfkZD zAHgx;Joazk>9(UCX8#3Fm2kOY0o4}(`;9Vi9GlJ$1GGYPrRWRs)lQ(Mveohz4_@m8 zX*C!x5~qPTfQ{Q!oaXOiPOuh>_6y1n)6}o#ss3L8`92w@&0tRfKkI~PdF+|suVlDZ z!R6`vH(dK2P4ype!nLG4s_#v#ueX-Y-Vbh(y|pU#r{E8q-dd-}txlwtc{`Q=4C3E7 zKCO_g_Af26uQq%k#gAfreYMOxm5ao2_BQtK;Gdno+Cg@}G8G7!_XYdl(TC`} zRQYvc7+4R8)pF29VhqLyXiL$4Z8CU?GeE0C*Bi+7`&aIAE9-y;Rjl`~S-WPSR0 z_#D-~Qi^{A^+m{3tqomo{0wdZA4fwcGGHkVNY#Sx$9&#CPS7$Qpz^f7PSEn$v_4PJ zO4)S2JVD#ccA&lpIYHaYR_DLUt?Y1!`@muq)gQ-BWRCzp>rBw*vM)eisBL3U1xLt> zw7qB=?*-t)=psB`S|BHCg{xKl?s!eoUP4p;x`2zdPtor7?-K1e+FgGqYjO?tkH=%O zmVu`E|5m_ct<&SifXlQE57P9+z;Wd#0U25~dob81FW2^Z+!k=THheARp9b-8>q>1R z`y6&Q`vP`8`%?C5b|$-;ox`qU-^y-g7qE}B%h~zss6W;0T6Qh?+kh*zW9&oVj({0m z+s9A9zk2*R*e9>*ivNuH;0o_}UZu@OyVrBB(k7wZ{qI#;F6UGIS80pcRDYJXnoad* zX`9)!{mjyKqTTg1OWVV7sxM1Zzg7b4o1pq;YN>3hZ>E;Xrut@T^U!X6Gqrq=^}w0h zKF+85W^1i%YHzl7WhJ#o^=E5$pxx=s)(X*;LY*)64b0YRC@z*?K_0$Am9G@)de%UQ z=c3ES0}vk)c(ryI?e^~)?dyN}Cp0bpX9QlOIUBJ*S|yavaIV#A(dFVX@IS_N+8Ga1 zoX(eWwdrhiy?TM2tF2{kf&3EZMs2gli{wq(?;ei~oU56SP<<-DK;EpWU#C#pJ9RyL zk({Tcd)#E*s%=CU;q~uDa)B24DCYC^>b$Py>m{gfOklTb!Q%sO?~1GK>6k#cB#(c7 z^KFQ?NVt{2J^=QChhzQj@|drUM7!geuZ`#Ssl9ydLN>LxNSnl__U_Ws*i`>wZ8n?Q zU#wk&cIW?MZ9c^{IUU}z2wbdnpo>Hxc&NNv8(yV4TqM>Q$_3i+P0D^P1mY#mQmx=I za$oc^t>AIxauE-n9ayMUvqyk)0*kbi%@iLCo*!7MO?*PxuU(4eS7{smL!ORattD40 zyW_D&tHQY3|25jQf5o%We(h=~?~`k^+t|6_7O<)f+B4^Y^8>qm7x-?Ei#Y!dEdRN- zl3l>{Z3WMT`fAzgdTn9ggIcr4rGXD=kxycK+VhZK9$2moMZ5hk*V53H&LN0zfOrm> z@86Vbd)R7wuqkk@*3MSv1J!}+w792L{gpy3-_Hkb&{8~pHE^R==JA_>k7(OGekbrz zt(C3ThgSnPX`LP)418Q0Rio;s`$4Y;Zq~M;X?<=9+@iIjX@9oBep*X@M&6D-*771U}O>KWKlywaal3_sMRb4n7&!?Q{NRIv(hbkArxOr~I^k z)t3eS1L`}3{h|JwL0h$x)PIfo^PCpE6{km|{ye9}v8g}LX(QRxpXanRHudK@Er(6* zJ*O=u^Zxz0uIZ)zcANV9oTk3+@18H2LC0byB74UGOaIRLEE)N zv|mvE4lRXE`8%{}Xm|Q|XgNLdcWU`P@^@-0(eC=VQ+tf!e0^)DrhXkjtU?2D&@OEw`$dS44th~@eEDnGt1ih}+ zq2c}?crrNbc~!m$-V9aid!2SG`!n#Ez&fpr{S7!H=nbs~P1AE#&~B{`?H7MR+$Z1E z+S%!_ez$?MUcmkdbw1Mq&Oy85@us#I-JtodROfqdYCG8N!{I9?L2qh@sk}A-;&*~O zJzf^{mX^7lreDP$2x`zeJ+27ar$xS~;w3n}6+!#8WREum9ndm7elqA?Ef4M2)cD*P z)Tottyez1xYxz_02Z9cDIT6}_KIo$^pABx2A9tDVZ+)!2g7vxE$B(r)sebI=13@2a z@35)9Pqg>hRNoQp5S!{dqJ4yR$MXoc*I{ zSA$M;wRbbPE~rDx-+}$*`@0?5s8^KBMLxve4*F5M4(;~$C+%i5&5z8$pR{7MUr_%~ zYE^9N|4FTuP5nQqHL|IHC$)Aq_2*<)|7ibvQaeR)yg$1?=%g0?D)sjaSpNfpU^qp*KKU9AW?Y1APtJ-0H znzVd%o9YYI_hP;~UZHv;n)*8}I8^`Ag%m1vwwp56(M`; z>Q^Sz`g{sJBe=J|noajpBJ{%^&kl~zN4-w@+6*;+`sh>Gq2Muree_vuy8q(SZ$?vp z=LGxo)f}hk?Wb3>sek?SIyUvMpWe!*{`J#Ov8jJCdTbr_M|pN|jGn@#{teJ)vZ;Rq z^qbk#zk&K^Oaw#|73P{h-IU1t;j=cw7)XL=S#L^^fW+ z2~N___IPdZaD57zuE#$bJVMX)cuVlvdVweZnc#EuHng9Q*Ur~F+3LPnsyts0+l}L) zWr1G|K3`8}tNUa-!E@R3!4Z&ONap8n&ev<%^t{da`tUcYzNJ|ID7_k8Bpw29a7O9F z_h6il??&tU(KJ181drC+DXx70`93*TKgIrp9r>0j@17rw)icq4yxzAjc&wg>u7oci zz+39UL)PYT|c|y zfmgxvV8Pvv1)mDOsH?sqU>Pz=KZWJ}S~55|oM z{!G^!*=qir44kgFv(6zw)8R|7maw*lHlZ30`1N*Q41@n4hU9v%kW4rk=)D z_icUhNn|LJ=;uIAUBAy?_K ze(E31ubFx>`z*+hku&u)bc2=(o^H?7GdWK4bC#~YCa%sWra`<#&eE$mem!_<$Sl2% zt**Z)i+89!-$q7H|SO9dY$rf^#eWPH|lLY;y3Akd*VAo z=IGIls(q@jK4h+boyP}5Zq^s0{hB^Yjn6H5@p~%YuZ6Ld)bbw(ZVkCbPkvvyQj7tA z88Tl_L(}sA1Goka&j&#KWXP@h98RfC_kVT;=e-uIb8lb z@LcdlHXU!~>9ro02Hvh8X8!{D!MzshCp|tDoUccIfbDDlKwO60sgGo<=m-OhdjJhj(K{S=$_CoA>X&!IS!-vRNN zy-M|L_M7Y~HtkPJ^=9@v5Wlh4{rbKysQk7I)bew`ev zLY+U|uNQJWBpbf=-s=H<+gB>TQpAB~e+G_`<$BV$RQ@OMbh}*7WLsA&uhk3Lk>D7)PCv*V1WpBau+IfI zS?l!Z?^Jz7Vlud2uL`}8oeh4r*LuB`JrDeHuMK+Aamp_Q@9MQtKa6(w_m6aq&rXQ9 z_j*Kc$2e`j4mgkMzoL(76tB|F?^S*7@zEwd3|%SI`rFZKlRn(z-+Mi#r?dS~zY)4w zFJ-Ic-3Wa`uV<_K7k!*9dNbOse~X^<1NC3O2A)R=-J*A}!@Je)1mU+>95h_(QbP+UE`sq=i<;BeK^J|#bhXdS?Du*8ao61 zte%JF{jAz^k1uQWXtX=twR#QOFWmO)*lv3V*=~Q@ z*>3xtY`6Weld3(xaN8e>cIRiUp3HH#y@_nMy)3rd-h8&(ULo6UuZr!qr@nUEy*||H zbsTrwQ(wDP{d3!EXS?lnvfcKAf1!N0y(G5V-gtEP^rdm!Z7-YcwwK3t+bd?f?QLYc z?d@Q@?Y)ccZm*f+ZhObrZhNQLZhK+B()76PC9>W2QrT{MSE0Mx%i*}&UOwAxuaxb! zSH*VQ+s<~|Yh=6aeTnXF?>NWZ_QY>J=U*h-Z7+%KwwJcH3)byY2mn?ru+Z()76PMYG-ZhO^!FQrT{MnQXVcJht23N_2O7 zWgK_gQ(xuvt`D_rx4lNT+g=;nZSNG@Z7()r>~Cfws(;2w%5*f+v{Yz?M41UI=Z{PbN=NEJbujV-k#qG z+vgU!t84py3wtu=Hwb!OV3(fhDZf5+m!5}q&u?GXOWAZk?{&S3P51L&*BjaAWUBMu z*Y$QbUEh3Nmw)2)XmmgCbv>3n4)SB<>v{^C?ytSBXOsE(_I3SRH0@vKIIruS9H-~^ zcI#oMXuN3uxLeOA^Yf&;^?WwmBSzz&YSk>}o7uuSfnx)BggNuh-+)lTy|FiM@L2-xR0km-p&fWS;)L z`sROB+@1e>_3dbPf4Wx>5gNq(+JGGRwc^md`T(+^=O6rfBAcFnct=-Xi&g6%J^!#@ zuVT~l4hQsuYk_ZB@Jy;ocb@fO*l7o+L?eSBbx{uH|2_z2=}gnptop#9pX znE$EX%yBinM?*i=-_ccjMdCAz|5rbbt~ZW@e+d1rz69O@?H=#{=?{ARg#4dggKiKs z9-ryz&03gJp{93y;ODxORDaSaIR6g)QqMwDenaR{y_l`?8$!R;>pb~J*bjQON#*~5 z_y*@^U0B`yi48lcXQBN(e}B=7*))HD)n6oQ6R%U_)v4F9Gr(g4JM~8P)foR>|BF3` z4UhD~^!T+q*=gt^QOYi)I4?iH>j&Aiy!@fZI#^!N^7MzEhAt9op}bH2q0b@n^Xz}< zt0`Z57UO^F)o6G5{!>?9-tC?rf9iE;dOm%4*q?ecx>D?g@}t8}=_jc?`l2vlYz|cA z%f$x}pB82r?d(s%Sz!Uj9YHEi%i{s3m$BC4+^|sN1&{N>dK=AXcY73RbfDem5q$GcJ|mGV=z65jNa1)V$Ftem^=f|kj54+ZUJ~Xrc6hujEZW!;LiLA1d}UZa zqut{N!(xoOUKCf)<8BD+Z^VTv7l~-d-xM~$s6y8piQo-kamJ`H%1;JI$U#OnI|W=F zHpr+$7YX%z&{nYes-jvxCPMtT-~^+SJq?{`M21s)v%uTK1{*0J?+hDiw4>pAG{pCW zod&PZQ+@g9(~Vekkyrt4k;9EFwtC*U#2Ievjih|FewE2HjGQPmZ!ga<)K>tz&+pDK z)YkxE`gwUf!>H~<<>PKp=PPF#b?h_Q&Ft}P^_4$0y;IrJN6rEJpnNQQ5ql(i6+4~% zA9gOfT-1Tz4?EMSW;cRA4ofy#*`HxN*@%r+?UjoTjGt|!vmYA`UyBVp+qi+u?>n7s z+=h0yuV)(tXj)&|Ain}l%kKf_9Ai7$uhH^3(%6S?(0b*n>w_bWW_CYti#*qW&cL7F zOaixoqx-7^vift=@Y%5q7>&Ko+X}UA;yb2V-eG?*Vs)jWUk2 z?*sefXhZh*)<4=vLi@3NRQMPpJzm9ifPZjUiK*q?!8!p9mFLnwX{JT!cqp}tn8 z^8W!355K@rUk6k3SM8tA2_J7HvuXdGYNWAy-3Z&y@Kj^I#}|c9Fe=zF5T9jVWNc$6 zVg5zNL60vApJ;Tl&&K?Vjj+?G{S@$&@QaN+_C@GRj0$!-_?+-GWBBQmpNa8HjSTip z7@ut1f~NVA6+Xo%<#-{)@9K4#u^HWM>;a3|k_K06=>_yY{v5nz5M!UyPgkNVQ zo~7!q6wT1T=fZC=QrMq>Uk%SS)K|Au{2Oo`cs|H|Joq@cihUaRCvY8G&Hqkt zEBkzi{|!FH9t)Peq5X5H{R!Yea0>fka2Pn7eL1)fxPYAnjs;h-uLZ}0>)7i3lO%8} zTivfe6MTyO>L7UE5*#~{+P@ykj{&E!=Ydnf+3dT(7lYMTztngYfz!cN>{Z|^z;)~j za2B|g{RsFP@G16Ya4tCZT&hpKe{c&ph5ah?7H8B5|gX`Fh z5HAI{vX6it1fODm3$6gio=5GU1U~{!VT(END`enob`ba}Z~uNN20_=j*|9*>r!p z&?sc9`_t(Wg~lUj+Fs3zC^DY*xXD^!yzKEE5yeKM$MYgej8D*XzPBu*)cD>LZ?aYy zzkA}VBUT&1X*50G!}M*4c+f~h*BjbgSf0VTXzI_?5f2%)9`A@)XE>KqdAgrpX~ePV z{&uA?3hnN1DvgOfyurxucwWRt<7$tatVfKSJ)RfwsBx#qP1Yu3xySP&9y1>DxXIdV zJnHehh$oC1kDILj7&|Cgo-y)!#J3uS=t@xw z^&O4aYE*fAGU8dI^fFcdI$WQP$mfh>Z1uc=5&43VHkIOUK>6Uv7md~Iy{f;FFBw_W zC|+?Ie19nNWn&*2-p{yMoe%6Z+St+TPIdzLyvUtKY=$Zi-^T#2b!v@~?DN>^Y;}EV zTx6}0$DRQ3Ns+sZQuZ`(gxqCpW@mw?K)jZH9s3|#y+4})@snge-+9gW^m5f7cf4OS zI?*)VE97fN_7y7Lpj~I!(_UFg)*VpI^Z~ zS#JzyTl3WUNWD?W_JP+#?lm^Dhk;|m_8ME*Dd0~68jM=@WN=4--#Eyo=a2nH8=Ic5 z^c(OB9gLTI|J`pyqT%=omY;Qzej~%|0g;BHuTnvnYNK_;}<&qlR6C@ehp5nN(i|xHIyQQGoVq>ijp~{?K^P z<9{MQGB$f05Y=Mr@VMCi#0ZZ9@zQAdnabdlHu_4kYV)Y!*X^(RFA*GQgC?Y{)^ zYV&_a2Aawbi~7vi=ka+_Ul@C?R{0H@dhh+BsIQEJ=pykRcuLgQ#%~;N!}vFbc@5>C zK!0aMvc-JZA4Pp{Y(y7{F!1cCAC1gwDL)2$ebh;#5DnL>!SkYiGd81(#M$8ds7@pJ zI+b4})bZ85QNJ4_*^?mNBL6gU+3J4m{ZW4!o!3+TEQtH$UqvxEM%X{u3(R2A13qj zrIE6eP4~wmW$rxHp8GwsDA|dw6qiH!&!VDazxmi7zMkAi4)qwGHZkV7xc~L`SS+93o564O$&}65-U@LW_?13c@+5mPcz>T+GI$a7SAADv zf1lYhj$I0F>XR*t(KH@2oNHwDU6_x{Q*)ndWh44aLH*B>8H-i?OF{j=Ugol?|2N12 zHuXPORa*4OS`LY)6ws)&cz1!Q~Z8D2Z?d8e&Y-;azSt>1E>~UwGm9o?0zx$NRw58O)uc3UZd_ca1cGu?zWHXwk_ki<& zOk76!({5Aavr4A0uK|w^}hAN(^g59W@mGD-QkGHq zOToK+Psup;mFOCoLgxMJR+)x&w~t$8CYr7<9`J3I)#xH|EtGHeZIg%DH-SI(JtsrT zReNsv=VcnY-e`dMck+3e!~OvLyYG29pZ#C(wBQ%yagYD@ZI_vARekk_id)ey%RcMK z>iq@y9-2&Y4e^lZSLA&5F>qA$PFadB7s|2GwQ{e=L!w`kZ531>t&h89C%X{V^enks z#;vFL2`HZ&{iaM~{{qgEdt@mZuAigdlG`}0mcI<=ZCOyM%9jguesym2URi@K5)s2y zdB5Dp@u1t)`|j_^V;raVPxr}V8>oD5h>wllC&fl`G&nVSzwATi`FB9Zquud8AWuWn z^@7ak1M&)Vy+P~ador7?){oe*CRz6|P4A6R|1jVCvYDO7KF(gjmXA>WqhOzWU&f-# z#k1gf(eKMD_G{>aGV)QCUnKT}mqvdehd-vgPJ9HuFZz(&@i@iR{9YB^ERV6({Miuw zv2-@8c)9oj;$x!^%Q*Bp@fnmK8~ur#$o?9AMCP*9_r;!w{#35!@+Tl(6a7C~!~O$2 zJMc5Pmu=nw*Po-?aX&<(O=3Gk3Wh&Dp#W`#RQ0d7X7WPVXOD4 zz5+LU{6qA2vXgxeEN?$Ve=iHSsQN2~@*mMBWdrkkygJ`%O zwGfVyAm02e#p(WtFw?hDdjSxi(N~x|(0+~HSJBLNwh!V%!!^@+PUY7dXsMeuXumcH z;#pFf;(3ZI&ki=tG&Eel07pp2%wenVDP7&yF$+A-?Hgd$ut!7wyuN|vtuIi0lfeu7 z2ARcZzjg(9Y2Q$@jjg`#bYI^v)7h@_;rpEs_sMW`DjL2g34X9|xS7RX1BUNonT;>1 ze0P7_+mtUUyX$vvGYn1J=k(C9_=g^-qf&I*8_P5{+C&o;CMU^iSf1&%E`DnkUzSr?u-+^WYy53NJt8bjS z*Aw60H{NXL@+y9)?+~-*RaIZP2+4=%-TR(y2Ja-(_dw1tN22{&KZqagd!`A=@aGSS z2m9m*Gne84!@)7&m7IS8_>902=4Osh1FvFstzPviHZ#{_o8%@~M}2^?v*aDD3iPq=?=e!-4|xbiV_z%XzG*x5zXJBl60R@d7X zL3|>aufLsd-idaX*YnL{G%c^a`<-tdL(~4KZ@*Dy?rT`Tpz#=ER(-=XmxYi?xI_>MJO$%4jftQlQL`7~Zoo=xL5*32Rc^?vf0z_Df{o5m}}On*a_ zFA_iF_>40%c4K|o-{6FPespE;9@Qci^*aPlV>)%9E?xFsu=U>M6yVxv17l{OjPw6+=+(&Ui z_m|Vn4vwD=@tp8VM>Nm}l_0(P!ctgZA zGnV}fdn8+Z|4YTw(KJ3qQ2sTKEBa-c2R*Ltmt}tL@s57kW+xi1H$wd_@>x~xhyZx>+oqg0_b^p^RbIplpxc&%n<;DXlUM^065BJM8 zgWsk4Pl00tZZb33p?3-KzkYMfQZ&_nyx%-?-yzB$0P$1(ZZm5?WJCF!@P%dvTYc}N z$;vlHGsV^OcY!gB%q!4-Z77s~)>&+3b9^+oMJ_QbKB9c}y}aLomzb#^E5rA+&J`ju z=5Djt<3Ta^nkk1>++F{Q%!!|%MJCjDUQCf$$X4GqJTGRsxxJO*3&G=JR+w#QT7K_{ zDK_IiQ*oMqP1XbESssrMTxDM5af!3W%~xz3FI9NTjq0QbyYe&quD5pz3xHI!c@A2kn?10Dyb%1ve`nYZto%(AbrKicyU z&k5gTR-x++< zrlQNSy^Oy9G3TP!;qt4S)n?=|mA_7W5BZfbPnyYScX@xx9EYamwM9N<&PUVr%jaXB zGWVcq`Q80Wz4E|2puRV9S>i-MoaP}+U2=GMq+w5%iLGXJqFPMwb z^#+aicC(D*pFliSZa4R^zh)ofe06--9JAf*I8Nj73&g*S*84dT1Aip!F&Yajm<)gqx>>gA6NFD?p6Zp27fnF!h00+g^ zo14+);w*4vtlv!iN#&P|(cl5G`^|gEe7^avxe4u#_q%2dnvO>Y$G&T3|E$VWe01!4 z=4Lc}KNaem68XMa%f1dgwb%RRK~H{@^}Z=jc9*{-_Mn-9E*G~!{$;Trm}P8re`b2@ zAv5Wh?)*8iADZcCzqSJM?}%+Sb3O4UtJ%!+cwWRu=Di*l#I~4a9_J8IT9Np|Ra<|oY4I=kC{H1>pCuP3*7c9<*Ph>FG2Nd*Uy|cA6dNa?uRaw=?#XIpUA*`dj2b z=0uO1tbfc5kLN`QE7#-L0Nq;bag$|O&-AdgUh#N$tZBXLF?>(j`me_YmTh&Q-TN^C zR`j3V{smYGXm|S;V2$v^_s0fUV?1uM0v{cCtaf$~`T{FoQoKJ{ z3`n&OqKiZ__^JLES{bH_!}TL@lXa1GADhl+Ct5Y^nGg>dFwtsb=Yiq(p{$V>m0!$W zhIY3P6Rj#Vjc zd*n~E3VY;FvnqPzPqS)!pr`%V>B0%(V7< zJY&F2s}=3X-@mw^?<^~|m+C*9FT?V6{ean4F50hkf^Qj+Z56Y%Ww5@3MQHc*Hd)tL zqtHcSd@7#LTlrxs4)2pdzE56jt!B?+SF^8Y*Rkn%=31+nt(O0l1Fp5gBB(y~e48t{I&r%TTWjzAOGHB z4M5ZOX7_+wtTeP=+Yk8>a)Fh@KEhtiR`+97yo~)N#PUe;#Fdv0 zTw&Ev6-t2d(*N_T3Y+^Z0;MVI4*{2 z^|`3HDy#S`ik}1Jlj5GR#M$IjuuoQ7i`kcfQ{t+v=yNE3HTa^qC#~X<6?UF-xhMta#XWCjvDbkM;_^crTAR`EJ!BmJm#qC{?MaAV68n%&e3BH9dB;jiQSl;iD~x}A+lScT|yVgJ)6b;{7 zhx{Mo-nFXO+rWLCMr#Lq54ba~(P~4}@oLbZMoU~k{ZZS$-h85`w_T$E)_-`PpQhMAPxcnS+|F zuv8WIYw1wmd4mpGN$gqRGI`KSW9Nb+z&Y%N?8R*L{n8XDU&dD7FID+9Xn4*U^3Mg& znV{Npr}vOmil*tEG3bzW1Wo;0BtNp?la-KPZ`^mEs;|Y0M*B7DUyGH@rv9~9X>96W zi6~s5A>x~X@CAgE_3Enj5zgFZWRG(D>&m#}|pEaBv!=A`a z25*J<4s^XS7JRP!pB0Ip$gDTg(QQ_9I*nI0IK%nEO1zAGGrHYc$i5SO)Y{BmiRF)3 zDN|K`k$4=uebBd7C%Rlb1Fkl|w-TpOecQl02mN5>vR?ydI2~3S8lDdU?;iA%H7Y~p zuM>^n-;7_aTC_X=f482(Pg1(``*&*x+AnDQ{NI`2-OQ%( zlXm2l6sP%V*~#c4@i&f#ZEs@-uT(K1S9)fp~-*Xp0<`@7Ip9quD>Rli5Zo=R-E+o9g|ODUk#1G>p63 z$ANYRnzl!S;|JQgR9;YioL!8j`E_=DoPC(%wEc{?JJ~e8@pj~O)Ia4h@$q&tx?ZR8 zO0biz$LZB+yb|p8Tr!Q{WA=-Tn@<*P*GuXU7k-x1s&q-_z~)(bV55 z@u%CJ6xYsx@t6@m!Va6O>ho*#zTF5riA~GX2s@QM8pm&hoyEQgoGM4y6=c31H^Lr# zv#QVCe~qv&LHjl5diXtBXfKPs4a(=mC);`KSHSmx3)#ED%j3_oH?lvzP(8nNmR*M~ z7wUJ$*2JG}JGW5(Rs3(?Id(F-NF0Lr?BMh4;(00#_ovXK?PKh3z!mW+cKUpZ|B3Nb zdo{XTgx|03mt17;<9I*tWAT&hjs=uI7@cMp-lkk{j08U&KgC|h9*v%A*PzSAc<>AH zm)jj=KL5OQ+8{n_vZ?==Uen0ql{Cqo$-H5)`UWj&=w*~e+Xm|cDuvehz_-ui_ zz<#KQZ{zmr?f*f2o$+~HR?B;5{OxRi$afHrkayTsSpI0hNpK8!JGCd&_x=Bgzr#Mv zPLG1;NfQ>@B43S9iI{}Ww}-OT`AbN`B72<2kqLL&)7k2LHYDLL`xcKQ6BgUWXm@+F z#BN15Xn#U~HaJV{f<>ymO7Zc9(7%Mc?JAEG67I3v(e8NMYj>dQb(;RAw!Bl7ugCSh zGk%$!NjA=U0N%GqD6|jXrQ$~&8jt1nar8Qo3i0z3mfJOpRot&l0f!_M+lSF5&gI|; zd7s_E&H;~4xX*T$sQeP=W{xM4h5EhCNf1xv_!5YxCzRM(?EAoFvc%5g{B_`2c8OiX z-okEU?*OMl{_wl8JyFlDMz0eeg69X8*sT9t#NIh3-N~%x*S5wXSc`wD}FK7*Bze*UZ3!wTVF^PxC(p=_Rn2j9kaBp znVq;)^}pVr{+8RZ%V>P){`FdW6kFZD-j}e}&SV!u{qHBNv#Z#v!4a~;u4SwDfj>^D zu$$Rx`r71r`$x2&pTAmfM;EI0KG!xvyeMJ4oxt7&E={Pkli6+HhY~i}8RP)5TD7;q zp36=Gt9T*%QgA7FHTxFu`h<;kHG37f3j93UoqrG8AE4ds&%<^H+K=zgex2~Jol&Iv z>&M@d`yt^`J9#--op1e`u*q&DJA>A!{yk>5bA0QCYWaE0{^MT`T7l)YvmyUf!ee%v z$5!HI`ww;s#6uFQ?cid{SMHtoq&<;+F*qi%#+LU{d@6dYeSodrr|gX1W;e5ELEI;w zvrn>f!D9lSvv;hd^2!N`&)XaBS8mYefxk}JZa;!{$LA$`3);`$$9u_cWK(-D*>Mk0 zefy#Og^4fQ+2{tL>dQ=g#ZF(X;;{b&=Opg5+t!dzfJ+lzvy&bq{|>%2@pU_wZ9k~y zcb(meZqOpZZL-epWDf*S4yv>NM7#Zc!;XE3`ZE&Z5%LXtB$?lrd&5p=)BAF7*w>@o z^1JO@JU-y;whKIdIq^++!pZ^>$b})#t|!QR7G&nrfSzhk$t&x82qiSO8AEtQ`D zJ`PS`tM?^-PTXgwdHhG>e!G>O4*B}vckPqxnP3MTwvOt%3EUCTXeY7r!JmL9vX_H> z@;y77{Sf$B=RJEadlNWxaFe~AU8C{`zi)T4Uj`2xe9%s>K>C9bHNJzk!DiZn3l2qD+-PY}cTRL;yH-@F#ZZ z29;lLsNWl!GWb(_hsV8CWHc|Uq z;P|OUerMN^@%}*B;P33n$5gyQ%f|M;vnQhAdKuUU`MGHL{dMpokiVJpE5QT7wdi`| zKj6KI$KCxKKEIqD@x6T%j&UR^~QJL zkRgBDpP}jeFLKB~_KzG-fm_^hLxcm#D&L+Aj*wcHseR2kiTUpFzZ>_P>iBwZqUM~! zcnR)*hYr!5q$gGTC1O6*H*|<}>$9jni|sdQf9ty5z6J zA&&kOP9ML29pVK3%W>#>Lyb>$Xo$0!t=h|u=;cH{t;(+u&qMzw4e8}v$=(T`0-lGa z<)=l4I{6&`2;x3)1)JV~4|R61sl8CAmE8*Y*%4umRYUDj|HGUCXt(|_=lp*;gYt3u zt{M{NY(>}Ww7i5nbri?`-!P=N^A}t7|7LK+Gv4+hoc?IHy$C0X<1{@HP8yr0C&HP_ zZo}z~aEjTqyhS+M*xx{WZ(^j=%vRGI6&~e?tyFB`wgKQcfpVP*sYkZ336S=B$ce2g=bP32>p z`D`j5>y&O&`EGw=oeDIq&sPnJbq=E4<-5N#|2e9k$`5e1qv7`|a6AS$pOE=@aDa21 z^J#e>;EZ~n%G3HV&?#oq`WNSHM!V<7an3Pxkr)8uS2-lk8UBJQUnGWtA0INvxe)F4 zKi-*)cKaXi%tgE7k>HfFss9O1(01?iCpgh)cl}LphO?=E3C?)5yZ$FQQ~p(c2HI^u z!O2Ct+n-@hE!rKA)11R>8jsVQ#2u=9rNH028FHF40ZrxWhMewXqWzlszE7$g z?&On&`hM510mGeY_UB-qJi}>b{|xR3IKw%`rteRm;bgpm{nf6A{?`vV!%lE@np4cC=j*3A z?d*>r9s%)V`zZe_a2YspKlx{l=b(#(Rsp{sH*}hleL%&FL@0PnV1`qU_6s^*yWH7} zZouQ~F@cvmIqy<_4CGgbUg2zG4+ftxbh?xJ9>vFkM-I(&USX$!#|^#GIfQn%cQc$L zXm@#^;haL#@;7nl3@5Eg)#tA7vz%Nujqfa{_MnQp*N0{~d(rOo!P(AXw0nJVwiEjS z)koJ?vz?34yu1&++L?>?Yh}>ioS`{RA(_|D9A_ii?Qf2=)l+_aV2)GE`BeUT=R34J zz1KV1A=N%PGU0k>n8yW!Z*Wr3excrX7%Ov~0`?Z@Pu|cQojvU5!T-eHht6A z_EkLLy`^6AXr8xhd^DRyeTaEA9p|?0CYAQ=f`bM4x8pjp0l0I*L!bwGCo%2 z-TArD$willPMH2#_ClwMP1jc!I>*>_eRZLe)1u0k2z$L+{}wun+2P<+xzH&?yVpk- zI**{;{w{QC&~E$rP956qf4(CQtNPvR)r*|d(C+s0PA7%qbo_Fclg_5?*J5Wro0jLr zPUI)5z9JC|{d;@pVyBdy2!40y5~t#biu<)gus_lV-|cK;p9gWDyu0iCLG8~z9@=fS z|I!B+ID06cm*)a!#HXr0_xzy1G12bwUEqvD`*HvH@z4S%olW&Eb#mC${!%BOP5Z~C z&MLIK{4aGXI8Oar>eR5QzCx#tP4yKz2ia6#q4PD`t*_AO;5gM+=mfXo_z0?Rxf92x z`j$H**;LuRT!P36}(+rCoe>GK@>TBaM^pO|N#&0GTIIXT*E(kuo2GxglfkC(U+)yMX}s4v&1kAGA!)sn zbj({{rIXL5`ZhYN*;L;~=P;Y<+xUN6-FsXW<KHO0cRqLeiAH7ZGdgn0=IlN6JZO3RW$PNrm3C{$KdYLrw|c&W(Vd1hwe zDF1ywGtWHFUe4awi=6gT$N2k26v-uMXL)Xr%hBtldGLFSiP#{wq5mf>2AB9hFHibe zw5RPyV#G!{>TB8 zAt!R2evfa+8El%qx8%1j$$v{ecuD?Vx%HC#x8>yDME_L(#n89q474-9_sg5uRR29W zs72({@2g+LdvXTaS^o~mS!iedJ0R~vJL^NGdAzY&fOh)#%C%^x{}1IRwA23~+5ZpGpVR*#ISB3a z|B)Pprv4v`I4mcj>HiUMytC6$Vw7hEM0yZt*qjCkC*4LwQ1DodeQCa%4 zV}Ad3?NK?=$NyYgE0_A%KjKr_(<<_v?b&B?S2Rt3V8mx~8roUDb@CcEjpw*r%%<@i zmuuNHp5t=(Sy7+rT^(^;UWRt+)yoIjRPPJ<1e@x8AxE4O?VaJSGWW*P8 z4f{>_{S-ueDF>aW=@;G-@s%9QuEO{UImgFaBEFV4plN(TSAQdyp`GRXtz5~b>G@Xv z;gbAs{P|48-*OVVTB3UY$~kPxcPX!My`Q1|*$6-7AiAm(^%tPXe^Y<%X>h+zgsO}u zV|_EyRMOE-eUDOtcG_R5g#IJiSL1kpi0GeczR_2_WtI9(<7tX{TR5-J-FS^fbWUy@D}hgAMXUi`)Jzp-vDR& zxDtF`k8O`10S}EF((Zcjn8;!6{sDYLWPH2-08fuhXt(P*cpqov=yrDj=S7ZfcQ0^J zWRmhcPOq~)N>W~=>Bse@6yg==DnFXO@ye%c`u^~ErO_w9B67U)FU31ie1f7&ez1J# z_gEV_L5Xq+dnJk|E79y%Vg1Qhla(ZNRVNx>vND5B^E+8t#?Hg_Az3M6)B2FC>}At< zla&TGEstd7rcR>&s!p_iB`cY1T0Rq%HE6j0i0ku2rG(?OyslH~*tEV~ue7jfdEKBS z_)&dYo;ND#Y+8P)N)elu-!$bUo0i{AN|>A4)AF04WV31c%~IC0X??s^*@mX=*P_np z%4=xa-_Eq|P!9O`$H=>sR&=%WF5IsX?4GO0{-Qr|Gp$&k=PF@nuSDMioU7~&5OJ?W z-vgYhoa`*@d=GH0;+BQ;CGkGGSJk;n1lrku%u~|IE_#33JmqmTjW1N0rxg46Xh5b? zfu`yC)wo-cRZ%}zItuG6eE(co#{QPw#Qv2XtI>Gz`mH=)u?@8HFT~s23zTTGOy4VC zpro+rd*ln0bh0GYuK;s_5^7RC`X2TICCWm(#Pawza)C0EEYbI)?@?0GxzZIyV!Zb# zdpJ(tlfFl(W7GGe?@>D2q8`nUipWJuSM+HYJukgji9&m&@i3mweY2EhKKb?TEM*0n zeqUW6Udj35d4WLpQYFhn;}_2hoB=0ZL7oWlU~n2+{6Bvkcpdw0@P2KnG9ysr=i>L8 zukO24i3lRo`vUG)u1C}O`}MtF$wfQA??;t`KJigqALZ>&wf}E0f2Q6_knl~RPRmT3G>C@DQeyjr61KcTEb)AE?t z_X%Y`+KcbkhWE89b!?ixr<7(kEsv)Zsi&ytm1uc9r6jOvc|4^wpy7El7(YD!rnFJq zH5teMloHen+q-74BiMI>MScQ%F&LhwQ_|5ieenHrB@?|~%7yqteVXK_%fGqK8?3Xsl3deUzYzBn&$5deT$T{XlMJk zQGrj=iTURe_fwy7Z&E_pTVVWu1#eO!*rnh=_hu!Ly&D{_ZdR^C(|9*qTa?>& zTPyNA_IKF6L}_E60oS`r z6#HtLUw?5t8eQe*zmei&(ABOh*l8T^4Tk3rm2CC^@J_izDQ72Oe4A3s9*6C>DJR+2 zbKD(H(|;>Fg1rd5Q{JXzpsQW<{-c+bRqPcIpDw?wyv%+E9ItLy_Oo9=mnxsLUqip5 zw4kf}XnotEL|jAt)B3wZNo0S3`8$+J>>6;Od#94YZov3XC5wF$<7LVk_8%B8Q=Ub` z{ZO0WdF8&llp-=;KYdjRxmNT~>syKSsuGT_mS}$OR^rfJxLH%Q->qb$3nlS>&-<-% zWj}hoWJ3Hd>ow&kG}W7Fy{-gB(DJ4Ci&iLk?7JX8*j=IQWiJ8OgHJ|MzBr$l*119n z>f7Pf@*B!YHhmxDO(nXYi04YHu>G4#4jTUd0p2OUsXW2nj($tYXTOEst88LdV*7o{ z1vb6kbe~cZMfE>}c(8k)65gMDf?dx3k=r+-y{>=2XCPl1K;!pphWFF;-KT`GuLi^S zj+JmWy)Sj2QcC9KvrqX4?Oe~^r+5a6dd~K2pAw2b?TUkXC!v0VPrSMBJIYOHuO#N@ z#o%|9c|Kk(S1J$qI9`2US;MCN+XqTqbVq+Z`+cB94-)=CqT^w&l7jZ)_cnvwUS$qj z9RJjV^VoF0=2gnrRNt#)#)x`Vo#=ectE@tMT{SR01Nwca)N-7Tr$1CS4Ho&i(lLk+ zhj==E;<2g|9iJXjmJJng=lJiiQi87PM90sEmDpj_A02-mQ4)re>G=6$B`Tgw$H$*2 zb!<95{#1z`L2)|%ty6*$$aK72uf($Hc)LL5=bdZLKuO8#4f ze^9c=Qhp%#)_x}yeH_I@!JdFqN*=nZ6P>S|QWBCVJ^YH7R*$=lrTkDM35yca!oCn)a_x_G?n=d|ce`XGNYM z>aUb&efULbrS{S%@Li85pZi6bNO3%We5c>9%0jeP`W&vGEZ16;y*^&6wJH(GG~PR5 zya)T8SMtzaDIAXHUe*3mcChLDJAW(XY`Wj@Z{-5FzZcrq_WN6jo=EkCzwUQY(XSJ( z@_P{6)UT78zo-vTnOns9zoI6xb0Hq=R@HUrDnD^Q{m@8N z{fI4oFMXnP^@Nj;zi&&8oh<4(_gh+OBHD}hpALz#)D`F|zo()88Mmbtvp0iBL%b55 zE4>Du5M`^eH;Q^ye*3|xQGse2dZqLccve&wwFnK*f1$gnWj9g&32?Bxr|M;&1lNP> z(7E_L+1*h+RcX4&&y{|I_(!2vtDD&WVt%-)-%RzCVo@(#UB~Xmwr5cLNN_#GTiDU; zpqUiUokj5iG~B-l=L1Wl!quo-sQz%seW8Zw41e^;1*W={LarSW*4ey?0Wat}hK#n|-`JYLL1tgW_|c{qCs2YRFvS zTxltIx;{irVy^_h9W_)fXXk?}!9nvVe;9+Vl+WGy)sVC6R{wYpvLeu*OtE1x7 z&Y7Y;{l4p>;?+2GmER$#_ifZ@H46>r+vqWBF`B+ddM0X|8h5v7Ux?>ptx-v8B^u8E zA-|LVcvYG&;$9c6-xE}Tuv^?uFeED3u|KVk9sZ$Mte+hg=QpDvKMd=w#`B%FsFe2h zt&s26e`34;Ltoc!Wvf_!u5UN}ey&$%VLj)1*JL$=$4lo6lhqvd10%)nb+TH_w!q!N z2iaYrzS4iP+G&B9UidyXxE|vEXlMRU=Kibw6F5H<?8Z5|h=5 zXj)!D5YO^)SpOT<%7r+;C7Pd8)CM-q&nar^Jrt+;IYm9mrujEjty@HKnt#*O6KtA) zX=)3bmS37GFQ$B&pJ{4nmTS!&`^%BSg_t?p&h z^xmq<_fwpv_ck?@P1Adu8q22Xy-iJfK;%2qdxyFZ4bS7l@}1iMPE}flaen?ZLk&SY z^CLrzMmzH(L+$^d$fx-+vwwz~h^F~5r~e#vD%zPJbJaX_q4YiUx1|4EHT)sbzEC<3 z&h4M6K7pq5;g#icMTejAQIH}qf7zCMP$DAw0|)Soe4?Yasauim4EJuK=~yZT{# zks6jmPGD!Co$bvcH3z+3N`?6L{)^NtXs7?hY8kbcsJ|?A_9LR66VFmJ(bXJZq86ib zrEKhPi7GuR@^huf**WZI*ip+VzL~urP4jb4|0QY@+Kbz(S$eh_u|njN1Kkg(v)Ob! z{D8U;P4j=I^?i>|Mw36bV!gxkUJ*?KSPk`U+ zpQARf5^)+|MdYJu$>YLRe)PV^CFopf2*lz0r)nFz%5OaQ^#QM_lQxQc`u|$*$XC>2^m=Iq z#P<%^p*FI`{CIc3PIbm6s(%N>s|V~-SCD!8RIWClX?^^4K)EVyruyRhl}7_!SNCrb z&Xt~p_Wuspqt?7Y-UvP#@P@icBVE5_Gi`2FJH2jCa)97e%~KdJXc24t!T_ z@$ndN=a)pB`kw?2L(}%*rhy04Bs3k*rVp%CXQNk32ccdcqf*Udi|^kAx+~QZHa+i9 zsaCR&K>oF!N;Rnj$BXwzp4Z=3GuYyId;Y)=)FL0ByShr`-@Q~WX7W?y!0}rb?FH`MC@#^es%^ zWaFe7vP;y1`@Ofp@mKUowE~?leGb2$!06Me{wl@0L%c_Hlez*;{f9^Yq!ys7r90qy zT)J^aEo0O6{ES+|&Vu+??lbD_-J)JKUcak%H>-K<g)cW!j6dI-H9uQy~xpHuC(M0~v@{(rF|`fqi`Ug3OcIn;YH`d@Y7KJx#- zo%~%|8T(~$QFJG**2gbJ`)e)iVA%fditeo0Z&UjZApebMS-Tlc(^v1-wcCAsAX?W} zp`HD^tu?V}e;%l%z9Z_<@~Vjr)YhP#|Hp)A#ccY2Oo+CZP5+Mx(T=d`|1lxj2{!#d zCPYhoSJZdL7oyEZ!}EbK{!Dj>mctg?gGHUYYPD?f`&`tyn|7AHW31TTch>^m>lkmm z+Fgr9SNVziPcq%1S_NCw%XIh9W*-pwxl;F+;rrC?p4tj@zSJ8$OYNl{C-e3`Olv_G zO5-8!9u%fURf_gxeNecz482~O0`b5>*JuUoOmHx`oGrGOJ;1-Svmt)%pldbv`#2uF z{&T~i2(9J=;VQq*+r{=dQfp=hfzN>TDjL7||8d%&NG*yj&cAON)K6<*_lEq8LH#x3 zAmxkswPaAV7RwgPdu+c!S~~k!zBvDj(KfOBLHp@?jCK&6FAWAS8#Gvpt`_z3rIF}Z zEft+BC4+AnG(;=+Qh#E9xO~tsE&N0B6o@Yw6tB%--vq9AkI`vA$pq=$KS(9o+y$;VndtHA*ejwy$v6WJBevqu?uzP{e zxKp$O_8{JyF}sz6IM))DE(jfP>xFX(!mZ;GObyS`+(OY=6BbeJsZ3 zb-jY^uh(=ouAlBnS~$BB67VZ7N2Ok|Yx!vOWas8kh+x-W`n+8p7 z_kZB?gVNef*E?@+x41smDduLa>(P$oQ5t!R7Dtw@eg)pI6*EiALOb_Q&C=Gf#qnl? zHcP8x)BPs1wN|$HzVsUPRxRrjoPJ4MPx@E8T|0z6?V{On$Rop_~xpZ`C7`S)Sjkqu{ImMQW72zbFWtS8BVVxw&(FN_iJUJ zlZU|cj*odrbJvk)!tqdQ%p+Pj8s29N@p|_oS~|yX1W$)}F`Jg>a&0f#E7A4c<(hO% z)GNgQuiqB4TuWt7gZ8(@tk4d!y>npu5R%klBDm?yMb zz7la~{r^AhPBi_#*2Mguwhmq8w*>loCT6X6(+QDZ<@XRcUVTc-WaomPk9k_#&wc`2 z5|gjBpmU|C!SMYaE#_;{p6Zvytk+V|)PGgX|FoNZd?cnwTZhh-PD6Y6|FstNjcD)1 z`y=50*IE)=Twg!0Z`Lw=To;s z;rX<|RoVsi6-&hTG`*VrGsRzo{1G7^Y7u{+d4GFIOGnf4Ug|!i>3@oNt|ay+OWlXH z{b<@B%~ET$Khcywaq!1lY^%sW?TW~dq}vDAY2|2&-v>@OE8@+G z&XxYYvi~%zWHGA&sxsER8Jf)9vOT_Yhq8?0`F@Z+^of26mgnAUx3rd_9H@7i{Bm7h4D`zZ7et&;r?j3?0jr`E_Wl*w=uh4Y`zKmXLi z*zZGrFyxOwJKL8(wWQ0u*T;wDKeafQs7Lu*{9CmOAFqiytJQWAaj)xzU84Rut%wX*kP{Jf_7QT`E(pVvazUt#=$7R~+*;}^69w)<64|1T|#9R%Jf|D~m~uK@?T z|JIhVhl1nPzqM8DWQ_l#ZDOZm{2%QQ`$6y-cbnG8UJw2&xJ_$j@51=Mn%hm|KY;On zHJkk@IM97ji(sDw$Ez2$SoV30|EEo2Yr94KKMlTdiu11*IM6NWS?s|Wm-HNVGR9qc z0edROU3xM5RyH~8g{vMjv z&v;eVFZlRku%cIV#_>z^|4>~&h+ZlE1@+f;*Y!Xd>q#weJp56psfV-0|3CZ1T6(%7 z;_yD7a&f%v(d*Ewr4aBscc5;nBEC}U1Fi>$p;t?@;Qt?Iz;PUphIk3`r!v4Q$VG)?beIZ)r_<2~U)`g=ZpJN!z$*2gc!2J1~4PQQ!R->$l(lWG0! zs_X3cUlZ$ZH$9wv47^kBrbn}X#&~xzmjo zAl}_QK##I1zX`k&ydMqU`veCM8K@U{L>%773%&|G?h3N92abR37(Es3bzK4OKV-08 zcO}&e1rHxGRBvV*a6UI0taqU}9sdp0XQG||Zx7Wo(794ytUpw*4W|Bt#}65%+acuP z7$2^eb|+5+rwxhMV?#UQw+$Jom-iwsf%yC(iMrgIERL5~4oT8y__%4%cs=$i5r^xq z(*?$Q^bPtUb{YCcz4RK&7yI9WAyf1ww%EUI z9x_$e`-u2@Nw{RlG(8%fE7AULx}L>82=!JDnXc!tKLh_3d$XPvBiiRnC&8}`nWfjE z;d{j3cZbZ@vN_p}4}Jqd4!@9izt zqu5i~N$mOHdmv)K=V1EGC3yO5p7-UdDc@e=kM?EUP6>^k-_b~F1F+dYED_a{4) z?S2#9Z!~nV9>?~8gWXwr8oN6<5WJ8b4n6~3#g1ifV&A~7V9#aOupeZfWUpa|B+&T& z2c9}KOHX3c`;W8q{b*MvX_F- zxU=;cWImtB)_0<*-kO+f{UExk6P-^k)%8T|zZ0ELF4NQ4bUyi@UW#_cpQ9h}@nb`C z^g1*>-}uzf<$5F9>k{vuEf~5&m&VZee}e7nYI%j8#C`$B`~1*ceHB~$o(hJp)C0zL zwR$s~zE8VWm&aj$ z{QkYQdNf(4?@_PSC$R&UiuHM|p2hiMyz%NVs z^Vl@K`T7fFp5A=DgyS^5`TAZqO>e$_g!5^7^Yx=_n%-yiI(8ULKU`nX|3%aEd^mKy zesyxk^c@{qpkL?X-C>1#HoDpsy%*kxEkCCpM0;Ihz{iIc>5XKb-sknO6rA7uz2WEe zH4}xaT{l7gH$$J-n|yqF=tjNtIuVEOOJRJo9(z6cVes!mx9H)Mg!856z->df>S^d) zX)8F`{i42(eak|)-Ztz-z0AkTuoAtAy$AB`VcYbm8>qf;*J0cB6tvfM030@~RL>;K zv^+}n6=Yr>rFsR&X?c|DwQO1*rFskJ)AA_QubnLV^GdWlUeOcL&ic1Q-%D}VVd(#i zdxze@{(_xxBer+_#$LsC?-S3*?9lhKgTTSi{sbD{_X?ga@6h8?X?m|l@6=n^@!&qg z%JjG?BEDX_Y8u>s1x`o9`zzskS;DYg`nstiUhSF+`ANfG)yvWF{SU17svb6t#y1~) z-LT!dJB=*9w>@oGxn9722;#Gby{?DeB;vW!li<6C?a^nmi@@`TRp>?Rm%&-X-q4?) zF7ln<=Ue*cXy^C&mfnb_{r9qAZ|UVXi+p%K;cfW;`mlX^#ta+}Z*Sk$Aqan7|Eng8 z?@M>shWs<`4tKlE^nIOHD^xkM*7V#opF8plN%)e%RZ3Ihwu)(`VQ_x;;~j zhvLtJ!_ifp#Q!t;40~4(xkbctrFf`c0?t5F{)a;k=xfN*QxLCrSL#)0njeSdO8pNX z?;ZBO-gTC!N5A*#VF&d@w6neXP|rf=N^d~D&xRe+8z}Cg`^OLIE$nw8-sV1}2hA4s zswMh8AJS9NG`^YEM|v~bE7ANtqPuSu`Cfh>*%3XQP4oMRp3bKEeMH~HrulnB-%obY z^M^amR`&8eBcIHo={+^Hbgdfve(OxC$9r66~ zab3S1$Lpf=i{pBCv~zxOT#ul*G7|Dzl;e6LI|cj&IDe!J@lUA`0J z%4Vn^=>A#{C%eS8etdw;7-8I&*XpKFV1 z)Z=^{6!)E;!|n$A!*{y;pxbk({|}&jqWhFSiA~=}Kcz2Ze+uz+5HBIS=zU_R^n>iL zA$~2yv*uF&KZ83B`%$kYE9b$1?w|A~wrjtbzMph^9`$drW67?o!1WMsLs$6?1b^J? zC%rCH=-|C;T_P23^&O#@C`RTR{E&1oc1e)uLzIBb+b&4jvZQqOW2910ECi zhhB!xl{&o(SBbm+sb?*s_BuEvu2pYcEL_!zruVGAE{jaldsdHHBJ6c_f&5_iS^YY+ zGyb#sEHoWoZt*{>7jb?f=AYBc+1G<_i94qsx}^O%y$U>TQg>s7IikdjIKJY^o<2``J`aGUTN=KY4#78LQAV z{qd?~6meXMQixXwnYj~|JX4bL)>?<^n1 z=!$lhk7C54o%yL58EhJlZWOR-Ji2j^P2d#|rVpD$}qnu6S z_ZSUi*F5;WoKrkT8@f=u~fA;t3Vw9kr`4eoMWYc&<4ELinKWMxmMhKh68)A$`Q@vl~LW~TK)B4oa zXk=5pZbsB{-+JAQL^jpyX6#2h+m~*}A+$68ZbluNj`z;Rbu%uYY57RQLybWzM15!Z z^f1!U^!}I@rKgd}rt$SOO4u~MUdCH!=l9slsJSFR%m~V*@l$?pBZ5uyr?-*7rs?Tz zWTKtvf&9lrduMuj8?oqo=^I$SU558I(pQRjq4X0twQCdct7HK};y=vDK^ICz5KkN)XDs_a8sC@T zX~Rbv1wNiNe6-OgPsE-1GuHU!Nnxk|u|_n;3#DdgpD}!_k?Q05;7=}TKhF3PO~=10 zhmYgw_4)@K5buXcYWEdj`2Kghue!`J;6LS#_(<^I@_0jjN{r9z68CGY9iD6?uu~x3 z=ALM*U{3)T44>Fu|5h;E-(r+tyxR2u=3i$tq1Q{Rz?+9(XOurJ>iaPg%Z{&K_{x7l@=2N@^Trk{;d;L#=%ZH~LPhs4dpHqzuXlH&;HA>KQy))50)u{A| z?;AeVXhg&LL%KMAy2+?{R`f@||Le4yj7D^|MB|xme7j!6o%+*_pV7|pm~LD^!}$V? zFW7yv5mJETmuS2<8!ORH`FD*+^_B4dnJWw2iJq^(9ZbMjc?J;_|lDLv{$0>-C?*3 zY5Hh1^t6 zj*-o#{^lBM*t9${jZJLoKhr2jJIgoISXCs(S1r-{n`wk?pz+f3%QSM(>!rJK{>?Xj zKs)1~Z~TgO#y{U^GRF8gN3ye)@r@woQW{y*T_ZT;C6!}j5#YP6&S)Ugh zD=v%YT^29BEdGX%8@YM&KqKuZ!;2Tw;W=#r8K|U1DUi z#r*@R^1a4hw)mbitFq<@5L+ zFlyLhe9<8f7;S8Ezi4IDGGpWx-|;?Zq_D+!{|bK4SjQIQUDy2~qmeDfyRLhV(fI{x zFTSTy?|#$>Lp$St)JUf|AMZYDe1dky|ESS`E|l(t^}{vzQTSkks8=Yh0QU@CVZ^eZ zLO*8Yus48D4PRx{uwO>6HvVAm0dH`xF#@(yy#wecjac>(aP#n|jg4q$Jo$!%e_sC! z5btK@8>JZcx-O!hZI284#jiJ-G4AXy3ym7Iv;8PETB*H6^$LwmFXH@?sQq(B+)Khv z|IZtVXfNkKZydfPzR{>dJM}jj8QZ8H)!%3oz3f|mlhK6Em-P2xuN?Y<(Ol}=-;2h1 zA72c9(Fl13<5Dlkx8t`NiDda~f;hi^*+}PjABbNW|FW?T?Hn(c8VzV?e5J;ZmpN>Q zs9z|Jg!ZBFrA8wAI`DbFSBz!sJJ4lDDcYGoyN!crr~Ymur;O_DgZ!xY-9|0@Ft&f) zn6!)H_241#Zy0f}l79e?j^ArU>?Z#S?iu=yk;is@ApEY8SWa;ZJTd-&k;M+hc%`w4 zEv~0bj{m@DU`J!T+GzFheiuMPmm09C%B-%X|p!tY4kXH9kHX(8-kE5$(M$v3_lf_cNQ(`BJwkNh*tXn?d`j zeoyeo?g3^j+RN|b?QBjW^Y*W^nSplt>ufIZalG2uT*K{Y|00{kY_a`5ceQLDV2l4} z$E%9j!WP@>>onC&f0xF)V=+7r7O$B9Z2pzr=SjXIGNN^!yPY zVkW##rsuP|nzPxnp`PD}u4Vz7_J>`~gbzf1t~3YY-OR3LHhVERa6~urEi{e4+lcOF z4VvyJ=shCTY$o&j>qE_jRlfa)n&oWTpNE?AK@oTAK^*Pef6&8hX5;^VM)WYFs<9q^ z|7AS5(o5rg4#qdg=wYUONWS`h`2YNfp5|dRy>GwX-OKz8O~==1BYK(56jw^1eWJU! zX&=J+N*TCS?QKSoU2kIj-sTK4f4}c4a~Yey-*=Un^pR*^C?A0Q+eTb%W}=<#dAPX- z?QCzu&1TA%>LCB#5#gqN7~7*u{I4<7*^Lly=+?(E8 z$C@qd6o_vg5ogKVt)q?c8@m8 z*=N|&CvK?k9FL4Pf5y18{6?EH#+~^!+6+Q_C7RyRW)z#IH_=RD)AWroi`X>% znt$WX=vvXgSEA`3Z>F$m`p26K(bWG;Yl8V8$LHKGjvrIZ95%fVGR1txC;z<>DP{@U zIi8wf{J%_fXJOvmE2O(j+mS5mU_*>?z=2$PYR$>g7rqA`U)* zcHXZD_3Np>r5s;_c9#ECa|7C$KU2+@ed3|YH1jPVe?212tU*^xG`{Jky8-L-{h!m# z1U60obhD04(?8u@_66nB^v^KM*)+Zxrv0UeJL8#QhN7MRW|{-g&iH4V6VbGNj8|ux z>F6rIWBFqK++sfFlmGLGTg-B_^L+m-)BP2Vhu#l4%Ur>x_e0J$qfdx1HeEi~51?JI$!CsekJ4PVT95V|I z=Tq4K9J3ki^gqXJ^YPJuIp(BqMf=s#dB~4f=bBsD&FNzOm}i!=|HbuTp4oz?`R7TP zXX=fjJ-KVb-DVj2pmY?`d?rc zp!20jFWi5Tu)y4jcIq!M8_+a=2S7aT2hrZ^N`(A}f)<&nWPablB6Au$2Cm1|yBC== z*mS(G$jl-0_pcY3>(SKT(1bT|Y!lUNbXqx^R;0tJHd@D@*C#>(H@vSgtlkt6b@oKJF;p5fvW9C60UkqMphW$+A zqvf&MT*jvPwc4yj=Snp=zSZU_c0Icloi8=wcvqWOp6QsM_3qVXl#k~ptTwaI@V+ZJ z)1T7!3A2QK0=6gh?kCJTwAUq$w?}n-!aT{Q1H<=lKp!s>I&1Oa`#g9WgKVh@E;;eA4^fkDfS!|ZFzXKN~Y&B<} z6LDJqwj{h{w)q&|UuxRtu{}O-ye*-`T!r?!{(|CyP3@%jxIGz*h!fGin*UX3FEJr zjqEgx?=Ua0XJdSa8TuFXp86w;B5{^}h=9Uo%tL&$1V?x3eF=DDr7} z)h4`VZu0RT32&K|KE86~duH~3RR0vT@9y@RdF&SOn2}zyg#90QUT3elpKX6c`E_I- zzt`L$`Q!2mfp{{suV7yTP8<25+2Z5bBR?`vcB1@EaDI08$RlPOyYotT{w?fC`|e$i$5J1@(xxGcZsvixr^%Wt|Y zU-HN0B{|~{M0ZSY_scv9y;2g_D=MRom|1Lbz2b?HHD(Q4T%UMi*Oy5$`?fN7J^2 zy{_+X6wlNDWL8`uoGXdzO%bDhHd}o>XwvprL-psu1`q4XTYPxz@; z9NJlbG%Lf$M*}qLcsG$x_h-B@O1FZ#<9J+cGsJidD~heogzJ%`3@eo_>Ib_`E0g^W zI1#*pT@9`pWm-}w)%yhFmKDPO2IH1h#Qp_*c$96museM$o{zu6vU^Z_;m<||TCr>s z<3U!Mk3SoArL~OR3*uFyx>zOXTqznIY_<8szZex_h4!TSNf_^HrJ!@AThQICVxRaI zqqX`F<2@587FNy{!Xi=YE;q zRvqQL@?kuQ?yIb3G~B-dZW?u!mD5|)%a>jP|2FDs>s2xzzg=xX5dPr%@(`bCc38YG z?i}PhaeALzhv|4XygmK~_8)FFVtucR>V;bu(5GEgFWd^bN{r{Ui|U12acHlL+F#RN zkLq7z&B3^HKkqfxVsy1j9FJES*H|mqzd`@??mkup+kI4$^wE8+X7-iftq|{Zwdmj3 z-(TC_--x;JzP!;L?gRP3?!N8u_{%&Ed^DgVJ{KH0x}P-|>z{T}y?#~-+Uufv1Grwb z|9y~u#c0P~f2u#Iy+5kgVd`&?HS3b`$5?lv>GwOTYmBu9UFEkH>c@^AY?X!M`s8{R zoam0VQm!FyX75E;`RxP;LcFMth&$_BtW}1l>kG-FV=d`gY|rPb!>lA9&(eokwdh=F z;U{8w#9MZx$j_A?1|JQGw@TTo&?BsUeJQ>d_CN7zf^~u|#+zV{v^@QM$1}=GMAP)% zI(n3q8YSXYey?JGW2^_zUVff>jJ1v}t{+|u9%E(p7x~WhpCqdsoh!YK?Z;cE&{Th= zd%UF%z;rNrSaQ0d7YB|M9V>hRZ>7Qs7u<3kwqV*CQzPDT}rgx%M zfnJZEGx|C!Y@qM-PO=g%b0xY^^4=;*509Q?HLyoQy@yBNV5LQi_JvXk__5KGtqW}N z{+Xx1L4znR{M_hNYc~5f$S)Z^&06N;J)>{3YJBpmN6)aDeEjL?TdWx|R8O>T9DS>m z?c?7^-)^}F#A?}}erbT74H*^hva1}wF*+4Jvgj|AST%`${l;-`ASW4g>F$AF?vpQ5b*NTER}l z_`_Bn`zG)Ui8)pi`wq;1#F9o(fAcZ_5ld&&^{Yp%a5h~Zden+$XG8w|Lzi0%*pGqN z#4NX#ve$uMPF!KFU~dQSO3by2*kXIR2P}`I{>Ok1Ca$!~*kXAfOMKjdg(a4k|9jBB zDRFhX4}pL6F<)=8YO%eu|5$B(iKgGT-xz2=O7utejLEa2ecXG@vsU@&j(E(N4OTPS z>pBX@Ki%CMEq5Y~H~Dk1JT_Y4>>`dQuy5mdI(r^C5%QO@mx2?$3&{RQ?O&bPH91YlP zrJ$=_UqbxCRa>l0Xy^R%1*?24)u-Rj3)UfaQJpw`c)@B$ua( z>uc4RQmX;uw7>j(%nmDPJWVex@7-1udot8Zbnmv3*tEXvwq~;j!SQr=h-b5p!SUE+ zW4D!uuJW4&?Y|kb+bUwu0iPOEZk1C$Uq30g)=d!o7fOa7{J#t0cCs*yUmN?nwcN*D z#=c>dqP?yecZ>e_S(WTN*bVGeIR1TB3tN1@D17WbOHQHb6~}k2>OL!sEymv$;&E(R zANN_QY%x925TEViVPoI6ve?f+{K8fHEqNl3&nZweaHOD9rJ;;3cXSaJ}!Rm zRn}ItSE71V)?Ob+k3DD|^YO5;)mAGy7w?amHughn(L_iYZZHi$Tz>X zF0j{ve;oU@)p9%KzX<+)?6+1*x^TW!0d|f1!OHaU3BQxp8ur@|m&cv5+R!w=gT|e< z_TC}dSNVzgef78|E8{Mze-ZMd#{Fbf&LIaji0S#sik(aD%WgnB$J0Mq&1gQJhW07* zME>K_PjldX$_YPP;hDnKt^#b|Y!#z(rS0s{1r&b|Jb7HRmBc;*KCd@h8SHv++PGh= zA~d{j4m^9@Z&oeZ`G0eZ)x41E{R{DWcZ;>^9%0%(EJ5o|i2a@(`f)h;^!a@#YOV0-?5WM?}I4ga7267I(z*V&G` zSHyFrd%?xyWIHaKyaGI}vubZ*KLg%1PP1#5QhWnA(XHEY50J~ip|);EJw$#JT<Gq%>@u{ozIp5(kBGRlzw+4E zplSYY@%PxtXea*)d)g)WSJ>%jdcLn_+!gjRpLpH4KsyiZeD68PE@q48b&g*fWVf>E zd(K_#&X4+zr;BZ&o#oxdjzYux3UGfKY$u|tC0gIR+Iz{auf7ud+phNh^dQqS8uxn?aYtfb}gF5=Sk{q zS3E)aS3`cF`)XTWLmmXK2fP1|Oux6Q?IiXnh<8g0w;R!3iPqO^>{fKOMC;=<_Q|!P zy;q|3H^OdV)A}1}hd)X6ld-=@yZmX&r{mp7TYpB_IsS>XgV41656h8uGTQ5++AC4}q3!ibuwI;f-zD|p?Rl5fi?<)X zq+Yzen(I;fcsmbG<3B7XaQ$lk@4go6!$>=^Kuq6iiQfM`(w@OyR{;0pUOUpxVvFP5 zndV4)4chAx$FCccM%tVHNA3TCdXvr3b_Lq&vcD1g&(U@bdkA=^Jlbwx&%$`3-NIgs z@kG0gy$a)F?4UwgKE)UxV~4Td#rRk|j$McGv33%>8RO&Z+3bHXKF-c$Yu}3TCD|+3 z-M~BLBs-7Y7vtmY680F3kGIR&PuvX84|kqmA7U4R)4_G@nUG(elx#P%7lGddyPu=! zc^JGO9K&7*u1ZR=Q`mGqI?+yN)A{H`dp>(J`e9#;D>^4uveg~U4Mgv-8b09?0`mcC0p#zk0sq;*K82=s$CYu zXPT+D^gOvQxZa&=$Fi?uXP~{Vo50^DrP>EKQhp}Jr`Tbe$zuCf@19~8v6n*pygtR= z%lw4dB+KY4(L3luz5E>2|?RGQFQ+x*c66Ouz4=0n_bDG<@F?+9$eiwj0=f z--++%-E6m@o&D9#_TpWly|cZTVLyy^wih$(HE7yjbsj&%E=D`o`)1lLKE4=yi=FtY zs7LYD@~w6%o37X0W*4KW|IuS_yF&(iI;(a!cZ-9AC}T+<;x zX#5>^D?1b14Xp3R{#_4&dyl`<4rf0Fz7{;3T@2nS-(@GU-vS>?%CL*k)e@}_^X&cT zTnLhR4{x3Tl?Zxxe`07Io5S*A zJD=Tz^CQdN$UX}`8nDDJWB;8F&)1H>*Dl{9#tZMq{2tz4GyXpNU$oa13|`bZ+qNrc z{?q+HOYI1Bu5=B=b3&KeQ`ke%57=3pKMwt1`~Koa@crW-Zg(^EU+>PbSG*zWJJX+I zSE6bD<&4je&8)INu%^>3y7QQLk~)T@@Fp#Erext+uwg3h(?N7MZt ze_JcH{)qcS{OqUgBDR=+&&liUHng*UFR+!pBA>>yW_+O? zhW1KyJ#K@Y&8F*d8|>9=+8%7M{}1gf{|)Wy3%##rgIz@Vu7xl^Jpmi+a`pq@|Bc^Z z*RubQ-NfDq4s>s@+t@q6^G0p3L-vXB!vCYd#p9oE?@wI+-Z_4=o%RmJh4+pxw&$Xq z<+at$Leui9cW<>TDWBhuv(-MqrtxmITiMj#R(tk-tdHN@*g3w$ej82oyyLgqwH&AU zx5JKom-1=;?XXkWH2-$kC1`4YSl(d=9T54>@ySj*icQBSJMAPk9iQy9XQS!(q{`T7 zm$GSpT4q_Ip z`}^H?Hk~9;mQ0*ndF$SW<<(?gPsI3p{+tTXrcrSEBv*TlNVyZC~HAi>gI_uB4q5+aHLt z`+)1+d+o#zsUGdm_u4ZKQT`B&@3RkmL>A|V@I7Q(sv(btc()1r?9k81so;JS-m%ww zPR<0ESo`f-_Wj^s_q%pb9mR9m``OQchfR3b&O1i&&ER_Xdv@({^2?b2o*h-+5#K4l zXIGpMc7Cr1?1-<0Y5hAIaKJu^cJ|+ub{ku~pUo3cX$O5H@@adqdP1eW;#*3rs_iH?oex#pacufMcy0YVk)JCSo`UBy46mK=J$Wm5TIUb#Wj~N# z0hd^Z?9h|sH_#v1*{8_wqYv9B*q@+}*!pRTe~GTKXR{l@>n40`@BNA5zkxH|pV&b^ zlm7v4m{4oCoFUt%CF#WppV^_!wY6Y04}kAsl+{sOLijPkiXY4g>@jdaQ0l(Or**9bRU+w+u z46vE}o888K7~CcKcYDOT2-^+Qs5KZ%URM+!%xsL-vF4#3>>AL&G{o{Yz*=?ep^LzQ* zu0T82L)z@T|3uumes|H{gwB;t!g!`9U$hhb0wA6%{Q^E3AbD1>FM#JHyFA%$iU%|a zck;BcgTTRVKToVb#lyi1ll?qxX!sr;cv-UBb0I*)>G!`X+25me7IwZ5*V)q#P4RlS z;)(NdU9#dii1xa^g?e8ls~%kz?Y*v_!QX)^*t9>=JT+|EA8DQjHvPX*_q4ES`>%Wc zW}k(6P05BwR;a%A6P%wUo1O%A7+6ZNJX!45r;6>N?MYNAe<;L*!E4xwU=eRd=SsJO z^%UEas)_t6zXjm$l0BX}cBk85f0J^B2ZHeD^%w8^>5~%V$GX@O?$Mri6J`p=o{13AoBrOL5nBoPXh-CiZLKopQLR zmAxP1*LZZ3=J#QYU*id3e*sQ(_whuto51JwKAs#jU5~#v%hKu^6-{*IIw&joZ!K6(UaK8I+RbS%j|g zi})G--J*r%t@ilX9gnJiiOqb37BT_e69dA0G?f4+E!m z7tWU+h5QqKlRPWfdEka_H+X8;7b{`^<$t3mB$V=tAYS61>d9hn#`aS@o6xz^OW@v- zQ$20y_0kUTaeJC4q=#tl{9dMc!qLw2hSNNW=qkS}&cN~0#A%+eo+2OKhYn73r+MPo zvFubf-JhT4$z&%&ybbbKu<8E)G*1ybmD`uI7lMN!{~NS3zBJEiv~xa{=4qvTK7X3- z(R<E?~h(d^)qy|Mlrka_WX_}d85akv{AqtI>q?nWnNf_i7LMTE^9ZAw93LzvR zgb>2_SsX9nJE7ms%FGq+e>~Aj|!prB*v; zn!l7HJ_R0Tcy@gW|~ixS{slly}WMa*5tz}KV*M}wF6n?71sO~ zsqz7qnTz(Tk05{VG#+48B1?Gp zDhByQ-OjZZv?Lw^d}+7ythLAqF7NZLB}Z$y^snbzOOdP86bOG+xAUzXt+jlDx(#@I zx4~BSu_52o?E-5%a+P`*dzz=sD zX0<$Chll^S1%ABS#g^MfvpmlcR$pX!o+GRpWO<$=tQE}kJV#iYnCW?ru*?&*zJ#LZ zIl^kgOwV(K)tQ-|=LoAZg_m}@%o>9%>5sA|vYh7cqpbPNl>R7dIWwg{%G%CM>5sD9 z6UiP*f0WgdnbIF+oq;UrU18-TQ~SNN+ZEPeWNNSGWn5|9n-+eI^>~VWMYl25TI5=T z#;;dfJD6#_dbQQ{ByCTvLF3b_t!y*2b7TK_6V`+YZ9 zS0YRJ8>~evr~R=Tt?emt)%_-GcssN|uK(|Hqj|Hnllc;`PxIDONq#l+nD)fF|H$fo zvsKMZ{mad1{jH9_0Oj(1+s)SM6fV!c+1k!b-_PA*Wu2z=ll=#Fztw7rOwaqk?$uTY zWci+Wx-~8(yy`yPsz#>%7w${9$~uJlRQDOyNMw=UZmmX6#A+aaO}pQ2z0dp%@L|9o zGOt0NZGDU^_3sXA2l6bX|F7(r?sr%Pr|a})sUF`#d))mlYcq2h@TuMBS{*uSxx}Am zbw!rvX~4a@-)Bulmi4y#txe3-U)*oy=4pM> ze%)`iL|zrU2jchZe!rD{hL%hEHC7X3v9HF;MV9uY#>!)+_qoQZV5ar08fzspy{`{h z1!so&9oYR}R_n7;?OAA5BTIShUYmAXDIwib0x)wkH{+a*=sAuuj z%-nS)^f$mDgkK_K3zY8@-IrOLQJ#o>1^jaN=dJINW&HhuwGCOy{{?Fgg;x~+1~PnlehxT~OTFE>J`E9FRZykQR`X}(wJvLh7kj372t!m^|iqd=6nt?3O?|thoWa*#Z zx0WC$Vq-yHyB;4{W`Wk9h*bl3>hYnKgS;xH^V@Sg%}npZHfswr^>5p(?7n0#^>5p(cFfejZL{*3>HXPeEoP?o z=L_pqWJ>?s9y_efET{VMb+W#F4)zc2@m-R40B8wI(7<`TuIoXQuK8{mfMUzgpXwsr-Mn+zPUn z%KulZB{P-xuU2PdDv$9!ez#f<(BX+E_xRJ=jV$8@!)`uM%WDl9FBou9;d0d|l z>wjPadpP%WqOeyN9T zS0K}Uy=!|o_GDzbulM~Po;^Q>xAyRDhz!3(hQ9ym>mEUpb$);BaghBXhL`rFnY|5} z%J<3KX7+C6grfL4c9V;=Jqg?|`LV|#_CJs*{A10V+ode0@Q2ys)55o~=Ob6CfmmKg z*ysE+%-^3qjB zWM9q!N7>C;PWH95J2O*x9Al3~rt;1?ptW7ia{9mWW9`MvWY4koN@lX>SUYPtrBC)8 zYd2#idychRAd~*a`N!HFh_QTUH#y#}Vb=CE%|F4;zF6xc`;W{&$!>{E&%-fKPCifl zz1ng4A?yG5ZkKc8l zjm|&Iz73h|AD`dFUPAKN63~BZeph<~^UJ_@05=|i;@IUl)7ZMXow_XhbqmTv|5 zb#6C%0rM}waKDiK1hJZaF`P&Dd)TXyDSbGfVQ)p|`j=l|yCZdawebeu!}_paY!ALv zGwc@^YA&&tFb5!Cm*3CcfK2f}2cCPG4nINN19G!xg`GQ!;x7XZ%nIAQocKlHQsC`Z z5>xpMu$zq0JY8)9`MpgB+3lD=0Y0tCd3FKwm&oVa!>pr!+;f;+!CZoTi4B3_w<_a8;PUKC?Nun3=Rew> zPT{$K9c{mkEaf}e-h@o`;h3JI?Q!FDdaD%a8)H9>EaAu6E0HDqSbOU=so}4)TVJbL z!e4Kq^0Ry1WsgkZik|cA^~jXo=$`l5yO8Dmtg*8v zg!UKb*VxUG$)0gNAFwN!_4BRn`7l4PM27wzXKv4hNxm@wYlKaM>D^0_@9vllae2>d|L#r9g}_%0p)aeF&5jQ=3LXL~+jXHC@hCh&fl zpISU=w`A7oz1(w&-4*!;wLA~bbDB@tmB{daRy$#S-Sa7XMGC*!^J)7}3Xk98ugQAG zZhHgjS1kv_{c$~)+H)sSdPQK*7T^`k6~KAsGJ6yAILN;Pypx%}&st_@-AM8E_gSC! zTxPdsrthnswL3HG@2fuV`K&#Z`9jeDP0#1-@ytgLgZ&5K8s@7&eo4pW_HyPMfPe3~ z+|Hg%>1nRl>v=nmnZD0@!7gRi-)DW^^96ex^TAK(_Txo+CbRy3)6aXpXfI{f-=}%K zR@m<%Q+;|N=OueL@^pOvPiykBZQrERm+@Gw-3obz>hd7$cbrgbpN1^;f2BPbxi+rX zk5BBi(%!`UZXCX6>Xoo3PSN_R)Q6CtjpiELyqS0h@HxHK*cHq_BfnK%J+#+5c0meX)@!3ZkvR|2t8Z_z7clo=Udyb%XByvYlf5T}OMAU*kDpHIQT=(( zp2Mu`&rQAFvzIed{dwQsz^v=fO}*Z?cQf~c^a69U-S{@rHwgHqUYqR`kfnS-u)DHc z=eN4ohxTA%EblvdePox;*72o&ePjN#9h^ zm)-jZy94uVJ_?T0MEa}CZ zk;qhE*JZ|>k2yZ2Z#cV{NuTNDKc@A=|9`v!{eABYCvP$FcF12%My4}|`Agu_d)ITa z9w+(Nz+cxp!0F8V3vj_f2RI9u^?ut~z3V##Phxl;Uo~*9K^FTPIJc$nFsFfYPYSQg zZ0IaZ;{%;%(zuaRo5I7K#?JZ_UYBV*o732Fwx{qg$8~;8;f<#6)L)|QCHvN8`i`H* zfpa*r)VC&19x}Jry$^D>KcnL(V)(rRaO0&R59r<0X_LYi^ls)R@2!v_qVykjb85&Y{lBDZDQ8FlRmTEOi`&zr6S1&bKM@jb^U%X9~BkpX>O`$eyBW zp+5IM!Z|91C-y$dX_vxNdmrs|OW~QlTRG(^e0T5ToZ%__Q126*ohkfe?^B#{&+7Ex zd^gy)qIUF`q{{w~uE# z9bTaD`h4hy-e)^4Um_j_@jva|)!B|bUEK)$P4DhbhnKZn>R(T%a|&P4u%}aroQN%e z@Ofr$XAJYxzyUBsh9BHV0`(j2b9JiI;`es$rtpg7h0X$wzxp<ZFgi(l$ImlnUj^FoSzquJlt5aBOVcwJ_HXE*XJ^(okA6qGsEN}Zos z>KouJU@T53&tI^7%adGhH~c?*LCAXi78F!CIT$|?(|mZrK<8}cFW`AR(4o@lhAi#z zxlSQ6mB$GM=Q<;ir>k7he_Fx$&T@`_9B`gF*xA6`o_PmzSKyzs2Roft(evn!e1S6` zxk?QM?p$!8vz+CZp?rv=5)}Sg;B}cpowm$VfO`~Na)$khL}uRkFfUblBO z1rwbQ)8scezarPh{a;}Hv0#$ZbPbh<=I06~J8g*#vVV#*nB~nuURyBL8IL?e9Rs|k zV4Aa*!&CmMon6e7zuTNSuc3Z}@;B2Nzn0QF8RBm$fDsh2LHWJI$$p)}Q-1Gs@{y}l zmpo|S3hs3JuG8`=)fM79=3Hk!a;-u6o$IuGgXD!EKg_(_DMgm&H_y2gnV#R*1@oMl z$a4Suz0TbAI(|aw`{(0@_d4sC_5F2l-rRWynacY>kncpUrt)~$8P81lU*ybTru;wREJmK7^!?tO3LbI(AjbK1`}&VLP2QyZwubt2n7P=Q ziY)d#?kpw7`QRaiPdXcz^?ImdE^&5nc(QkiW4=Z9lf6$nIm~45Qm5Spl9Rp9Ii<{G z?{a4xGCi*&3YR+-ZnV#oM&QxZ4o-a8wk?DEf-TNiyQDivZ z)egpgg)5!a%y&R~j=9R&$$WetX#WaVIk}s3`qP!>UWKnZE132FK@TkaxAP@3**CcG zO-H?}!zW@7fxc$u2B!%!jK6{V)Z5_XlAQbdx1G_*v(z&nzqs&iXD;*A6?(k-wzG*@ z-a$#LJ)>CIBzp*^{|@I9v;@(fiA`eqkycKRbz`}kz;ht6X{{J|;sh{B%)4Eue~T4w$Ku>tT-X1koY>lPhe#?wDIlaXmWy|ULXXUSyhIio-0^g!-eKRGM65ud}n;d9~=;Ieu@Il0@3^?BLMqMw}I$hGnF zK;Ee6XJ_>nB)=56ef`}|!4Bf9fminW#cBJU=0t27@XJR5e@}AFe$lVa>K};b0&g^b zcUJErUIg5t=y#|2kHpUaw=Pm{>z|3A2R^wd=8k4g0H0nIcPn>md2Re{;Lb&+yY&~% za6TEhH*of^A(s|qxZ_f|vMAGae#CyqZsXr|eCaP5xKAR>{eBJH)yRoh?jHSovfVAj{Jv(pS%2vGR39f5WxJOmi@t{L z^~luTOe<>W&P0~`dk%D){HfzpdUwFz6P$od;aBE1a(kul{G!J0Xyimp-#7F~k>yTh zeh}>QEX%E7ru%j+cR8}yW4VwR{1O?o9%H#fR6SrBU%+uw8`L{z2hm#jw8g zWRdNT=JpcUKC(UXV2()wnp382sI)5^_B;bwhWyO%NFg!1Fu@hRM_&++ai z=4zCm;M$F~K1u&Xw`mF&WS!`?OyO32+Pb5W<^O;G;m);n{3^8t^sUQm=XP+2e*`|U z(&azfGn-?n#0GSmOxws$8o(|x1u-MPfE*dO|Pp7!n%<{H@Fob9xC4|P-RZSS^9 z;TLk+yPc6|seeL$d0L;-+~FzQxlaf8W@Kt_?#nsdU4jhfcdyp}$I{7N%lsac{|{N6 z+#SqkfIU6>&x}%v-0l8zI*`JYCHL{<6;ycMQuP0{)@TPMl8q!oLIDvhU^Y24+3qKcVjx?jGjjVSII3-!X3K;S~Ne2;aT$Sa%HbF5r^B z*SJfVe@DK~-Oa4iuk2gpHg7@cAE07tc;5-G$|ctKe~s-s$!(1+&-+HVGcuLu#J)GW zbC9Y2P47F!-9q720Q%wOS1nrh@V?L-yMlO3Fi~16yNJkWx1X|bSl2jo!Cl; zhwqP#7<`Xe<8Dsj9>ov1J6ebG;^K$g&BqZR4B@MrEp*2muX$DMSm5)EA8{L>K=O{j z!;2qvJ0MS2J%L9TKjw~Rc`@)c#f#mF6Dj<8z&VW{cW1UGt^#gf{|R?J^EBX%=9BK8 zlSw|8`J#UiFJvCgyo9-Ndy>}zPbz-Wop~DZtH9HWpLWM|AbtoooD|4AU zhxrfSS;foT6)AjQ@pJBW=EP-6JzD&{dqyXU-yp8-f5EL}Ht$gCsp1#isd*%C1oDmM zOYZ11G_Q&UFu$w@p33Zk{Q2USxIJ8zkpuikurkTV0KZoJN|H}Sel5vo1HV)JMv}{c ze+k}9@=)MOS#Krza^Nk+80=C0uK_!(H0eBo|Fu2O~>Q<=c(Oe#+c_`s5{ z+;+?lJ^<}a$=7Zr^Wh->viMu~eq?EHcDf6ZseQSm-cENZa&27C-&M(X?x)Op|N9u= zJ;?BV++;nT_}+ET(&@u~13X^`xHa=*!0qdQ@1BAz>HXk#jBo)mwYR5~{NRp9u8r&U zozqKpxtX1{eu{q<@JYzEak}s3N4J1kpSQ~_`O#g1oKW=r!_RJZ7qpM>)86fNPT}(G z-R{=2Nlxc+e{*Zj(M=1sVRo^f8^E-`#ju3?Ewz<+(8H54SP%MbIAgDf!cF zNsR4Hr{X`|>TWvxDn<1#=FMQH`e1nXF;jiW@Sb6&`jF`*n5jM-;B8{2`jG9#yOVyZ z@7Z1^Grb>;yn~qO{cyb2%=A75UPoqnADVi@nRR`?ueh04lftu#5B4@QQ++?w+rv!t z{cta*hqhnno?W&d60N0SxZRIUNrup9=MXkJwK4hQ1k7{^HD=)V%@o5*rer8E)uW>PP z`;3^XDml)}E+MXf^}A^$$9rA-5$A(^P1XtCF6Ij0*(E1>yGu!aDe(M~le|U!i9d$? z{;T9?k#100J)>Lfq5zLJ0+dGoy@PHJkQH6*Y?o+^i#JFLxm2SGPZh_3P!0W7g}Rcb{D7eSj?E zxgzg(WJ>Spvx~gOgLHg(eto@`$aFt(Nmk!v{Wu-c>vdpplJ)rFE3?=usMPUc{seN( z0GcztDueGi`W1VFQ7-E%{k-AGl>SNm`gxluz9Ri)-cDxHU*@$tSL?5hzY6IUv@Y{T zA}18-AK-04hW~TB8$PG+H^|FBkIF;0H@$(^GFO0oO%JS0+BY1yq~Ez-v-5R$vF|*u z5weumd0q=-DWCJa}45f00*k0hRxqke|RD=KYiTLEwd1!@Mh)p9G%TZ@4#=c_nbp0hf4l zkyphw0MG0rXz%j~??ION;b^b<5VQ~H zhr8-u?#=xt+xxas3;JE|EoE*{FQy*rcZKH;BYEE;T7IQB8o5e2AYYj~#v3msiUMH+#dcM13*ZKbh)PGwb{x-(Z@TGlt}kL;g-} zaEq6H6*2AK-Rk8s(|u{TdU?c(%HvkA6dC^i6yk3*Z}rTvI)0UEo(1FMez$tfk*BLx zz~%LC^*S)?^_&8;+M9z+`7ujx^A;gX`ONS(FjM)=@Yaqa{bz%|Mx`^n_%&#+qVk&Q zH9#hPxur9`T$1zmQM0@}X8JyAjyICI81x-iI>(!t68}`-q1RG+GeEx4yvy5;oKW;V z>|LI^j?$<57Vh$zFwckZg~#0GwPAh?*n#+ik>US{VZQ|aKfs&G^2=B0^1I7h$-Ioi z|A0*SIj8h4uiUR!2b@4wH>N0#>cKCc3q(w_+WHgovc0lK}s z-`mA}46IjKnfH55uBY@)V(!4)k-3t&8}mfwzRU}lE1B0aU(Easvb2x)dwWQZ?c>d* zHQtyBlzssAO$Ua`3%^80OW-?8A4qaX;D41aNOBSI^3q4Vc^F^%v&G(R$Wk7Qy$6x0 zJmC9Q?{P{`k^aTr5@yo>r1uOn>0jzSn->2$Z&eDf%Y4q;K;dHpz@ETd?(JZ{5O^c- zPbuLw$0q9hl0EA(mwOG7rF@?Ea*=5~883Xn%f5li=ZZn_e_N$5cx{*;1Af2sMXxV% zmAVSj`=oS*=T4&VHv+$3y2?8lS@b8oe3E1N|4{mhmwRIv{tw_T$P#|FS3z z%bOh9lhOZGZ!of?zsAeGDb#mh|2MoY$f9q(S3z>t_irzIN~q84|8K7iv$p?`{%?AP z$P)i8Zz#+4c=d?>8@#E^b0B={{%?B=nD0e?$6Lw#Fz^xmH+ox$F@3ln-&-t=bzO7L$53IXprC9|08cO^CaLo{kM1%nQsT4-~VH;hFPx{J=FgbZ*>Yk-hZpN zix~6sQvYq<(iy4tZ1dJ5Q+={BKlfJ7)N<&rK>sWKKlipU>+|Vv_22I8L8knj+~y0f z@^&2_zVCwY3$woRn$M#6bU*VBuO0Iikms2@yi#VJ-;et5@J2K1{BH06wO7ro^Y>l< zZ@jh40n9I^x!-zQna_av((eA>dgg3OPjjs7J8yUjHz@nTTQrB{x_sQSAHDS{d`Q{P zo_Qz9zk&2#>i>(E&#e2i!2HEqa+j9F|3fv<@9!_(dgeFbdy3=Ae(|#Bk~|aSCzt)| zbQ6BRf zKcG1gYYpsKhTn#{18`YA!!KaYXCA{m2sqC){JG4%VLavlFK50OC31@aHqX!u%>T&7Tc_8?wxw4Sy#x+`m!--_z>&4^jT#h4|-} zng09*ny0IoP#<=?_59Vy^gZllWm$gK!&*+`u}NhI_+yY0F{*#rel;`MlkG2H?v$JON&N+Yi3>k)5{wBU72b z-~R=f%A=+%@ZCpr_}cglH|Xbokl&X17T8bg(&8Y$FY^wF|7clLe+aW4k2Y-4%pb%2 zJKB@u&tX0h)-%fL<@igP_5Es3mF4&wnA^eo^itU&e#=KG{fve&^Ex;$M|iSDL<|J0%o$ml|K?$^dIZrhD`cZ`LX^24o~`z_g6EM{^R}4 z%v7Fj{9Vjco+tRbnJN7f{l-s{eN>(&`X?e&dgWOs`h7_r*X5a2ezHG?ISkj0*E{$yn7ueem-*tXump@_w$hgs>vcoQi~X~a#r_h%FUisVBOCVf^Pbo7 z<@xmU^O5Cyq<;PgWQpJ3pNyP{>HmKkSzhKZB1U~zmY4fYUeNj^e7T>COyiI1%Pail zFQ&>X{ME>bnEwCwY2^d_t;~A;a$5O7U#+10>HN$rALQpCuZo=m`3=lUzkuYJ{`jm) z->ps6U+K3-rt>#7y3()SH=2)y|0uH@zpCjJe9|~@}d5Q)v57^`a6&lF`eH{ zHo<__-&XMfWESNBmAz+kD>k%ekC#Y zUnBfYEPoc{Kb4R08?Mv(ss6<(M))}?oLzC5-x)a()Autpt+>LkU~X}dKA(4mKbm z+Z4XGVzNJyc^1egRovun*r3B#sRh6r&71r^$Z($`%&(_{Jm+oF_X6sh;&({lYb$Q{ zE1327B$Fzp`ZJlYpQZ0toa!%Srt$Dp-+hPlQTa~wTQgTcf7A@Z=QAfDy*%LY%x^O< zX8weEEAvifcO&UnjVXRtW|~h-^@lTCAlKiD%rcNo7r<}H3p<_^HkkG#ci$4vd>t;zSR+0#0F$lW0Q+l~skjCsL( zWS@jzflTe;CG~Fg-$JJP{#^5FKkI!Rp7@@M+x$G_L~I1;TbVo4AB`;i^X>jr!LV<7#SMtAuekR|=O{tjeG z|8C#>Kb}9;%q< z4`tT#g(VgD`a79#0e!10YWx)+h54CaKIHF2mj54F;BVccS2T`z-XD)F@t^mXq{V;1U!4~JMPF^h z{3?q7l7BEV*}L$-m;5#Iz*$nyVIula{<56dGq;B~(PGKFtE;0=E_azfGn zSFQJt{UQv1$bdKfuE-Sr*Z~`S^GnJhiw{PF=``_(&idbROWZ-V=L27Kp#hb-^!_x`_;W&H5H z{|kjTNdNc#9%jO9~%9e(xaexuW?Qgpw>9)An-SPZ|%Z~U#6&r(x>Ck@!+J3BEvz8{|* z{)gWdIT0iMu^^v$8H9JtSTLCR6=qNdzeL76z|{j{K`M7T(+DPGcqzYlFb-MDFCJ7Q zOa9}*U8G-;zIZS%g*%;T2KT0L^?;0EMGAL1Gn3O_l`&@n%x?zN3)FWyf2(3!!M=wF z91u9jVo!r02bt>IiUAFRO~?sMztfr7LH74LK5_MchCv=O)xUKE4h;Gu%lN->FqFc_ zeunfm4zPl$9AD43J{n*L&40x5hRrCrUmLiFS)VWedVm|W`-S8$!hG-N0e&!tS=ljF zZ(x&PJ2HH)0es-VgMzGI(Z1M8z`?+#L33m&&!$0JWU;SlkjLRmA^hP3n*|lf@PCxR zM-R*i7BF85eA2)}g0{brJ>!6znJt0^%#)c5_KM3(%v44zBjo2{0? zIu1|g_m2raM3(Ys6*MulJ&Bm!2;Oi+pTQzV&+pJ{1pRFgugt{`r-R|;A;n-6pUxqFS7JQb%>oQLd zcBOF5z>Y!dY>NNFWTmb@yi?E_S<1Il&^v|KWp)ZGkm-K+#RKz#Q7Q6`W?nEBnZ~1^ zf_wpTZF~~!7h9QU2CJE`1g;01+fb)p8@~;>Y35nM7G}M_{AWg&pyEI+r}fnD2X+m1 zG0(mn*2@Rw2OS!bd`G3`!eBD6GtUjO z9n^>W*_RADFK9>1=Ml~eijhhG6(AqV;eUttfq8x~nOTq5^MD^4D+dw-hG2c z21}Xs|E=_Icxli&(DAF(k7aPb!Jx~6waE0oG&4sBrA@Vbmg)xaYcfU$mm`yXYqBm6 zCZ_PJL$3&SASYrp{~8mR&B#8zKKjYAV}icSqd?zbM~?{>Fnw;IB0BO z=1_bsUq5JkuoSrp?{9v8(1f7P!DPRde>v#JVCo^nSHt)Efq7G~R2b6xIs2wS9jfJI z|GLa6!3oGzzCR4QIVeC*#OVJqrv^ir_5Wl3I%sMzk(vG;g8b%`zgK{>8&(G+nQsAm1G74q%6t#-n$Fe1BIau| z;eNl$>R@dOH>;c;>`37wDsKz24BgsA+c%wN#$ZJV_2=F6q=LcEGlm1-bt19me<|5PgAvagvALO>7 z@F!#Z2ZG!ah&uuw*Xn^_{z(+S3-Ilg4+JyY5-%y&_pd$_xF-|$19>mt+uVc9 zeAKy52RELj<i*ZEJw116a7<^dkH=$~ zOM?!`qHkI75^_T6|KDj}e_61Sc`0zG`p*WhFncj31v5;H^?O!(NkiH^Z6}%p%pnleHUHORm*!D1R8rK=UK$8tMy}gQtcQ|36+# z_ute(v!NDaytsOb^*qCRma+ef=$dL3x*6&Wr)QG?aUAZwi-~u_*hZJ{J5c9!{p-MT@!yT|ILpnwsZ-cMX*ZV`5$Z2XgrH*p+Yre8Z#lU&#K#OEBHI8U|x>t(VwPXTmoJnulTdkfZS~ zLAj|)2d2j-|9H}0^pJlnSs$cchFDA7hqyE0}9;BRgJa7MJ=pXeZD= zu0BTBy@Hcq%`yFF2j=*zE{oeO+$Se^S2~Q@^6zQ1Ncm zFLYu(|6Bf)4}ndYtG@jaXp%d`89Za z5m#f8O?BbdR9@mz{e%92(?6E=q;p&?x`g7T`^S`oC)Y^UvuL>ES#K-2Yfirx!Y8Dq z7uwO5{i(lz`2qLq(jQCxKLx`X>QoM225Vzl|0&p>#@RmThyId0L!B83NBM$&F5)kC zMDs84sXj`6#5Gh;)h3_eLvTjx`Ffk39L=)cBwt~YoR~2 zH=+OS7#_y)uy>)$s|xkU)pT@CHILJia&9$Ehl{DGEAbn{7&le^8@F%bQu_<%B5~Xo z))N{p8SEcV)*lH^%$zM@@c3cm1O@C_TQiU z1q^4X`P}}IE93GQ`$t*)VSNbOGhss|P+wfVhOVjBqnn}LK{r#qk8VA+1>G>-HsrYa zKFwd`(4X*gNOz&UIK0e1!P zNSx;(CeK4MlJgL$7t-z@&FLPCZa6NLeEmItGg*)7ir0qI6ZaQbYtZ#R>TbjNSxkvb z?GiA)Cx*IC&;{?x^Z<0>yiF$3)d%^Ki1`c8OMv3uZ$~X{!8@`#wncdt0M6dJpYsO{j2d6 z_e&F4-z0PmHIFJSew-CL)1UYGR`5_P!DrH7PJ0k%o2{qQE*O@*9l~PBkK%OzAHGM zgj>nHCgP45M0QI37FWhO>G}+{iQ^x3BgLco3g_^#-o}*ZlY0CahyMy)8JEI(#9I_! z+DCDt{=!n8QTG^ZAC2TVH6PBX>2m*u(>l6QW>`(Cx_#ZvWrGGHoeWGU}K4(M8y4e0$#@VZhft95HD)#@+99P$4I8#mCXZXG4b0Xnnyd1Uj zPqstsB8GJw^pC0kY?rJH7#uFHqWLMmSm!g&<8@Qr8?mb{Iju8@&i~STXt|(kg$vT$k zSkRXG{v!33^u&}f^#ihg0QXd2zaKs)nP=7I-}@>q(L?c`oD{>J3gO%Cg=h<&?qW6ybL`p3L`qMdT-+rR!x(t%tMJ z`aPHZjZZk2s z`%5co$c|{ZxADE&dz=!>r}n);#Qm%OYhmwNmj|u8!98cJhuYhiinhB_-ck3_YsqeL z8=)T9*Seka!|S0PdHiv*j6*h4`Vvp{x;Sn!l!toa>QJ_8B*!~}-wSc&ISEhVaH3D1 zue=BHoFCdTz zao+bc)o;8m-JkVFUFqLw9WJI`ypi-tKQWNwQNI&Y=P}DTUfkjAFa3|K(@B3JdJfhclF9XiNvSzl#zVTrM}C1LE|Zd*K^}a^79n86O?}FPx~=2e%?ZM z|6Lw|x&K`h^;ni+wWAqWqiu9AUii zJv}FxAFtze`?t}JtM||~)yL?$e?RulPqdsV{k_B0<^Nah{;T2km#_WFWuEi| z=HF0DxE%J!5{_I$y~pF>`nW%1sz&I-z9Q=-d5pt_?$a!Pj?;~XPqzb}8>VBb%{)$s zh8KTvUt;~MSwHE6bF#ee5RD(T^S`z4|93iXa6V<;P5nXm-pcz+?F>9`9M8nn+Z>O^ zC*mJVzV8xG#0g$^w}E8@(Kc@A? zRX*D#`#!|*JuHWpeJeUI2KQd@yhY~61stvwuluL_$5k=QrCpHt;*vk?Gvj%+a6d`L zH3K+4?I*yw(Q#A`(e-E~o={>I?=agJ~96`%Br9PWWe`@;EH4d;vMt(@1` z`#H+G%Yz*LU+BiwVsuTl1YKw!Sx$Q6+>e^cb1E|bqj7bd!<&l2%X=QamlA$CrziF4 z3N9yk@1$KJJLAdmzm#LTzscvkU|!DaW8zACw}SKW8mCL`44ezVb|yo;iT-dd0A2Y0 zg4=m=rJmI7FYOTNF_Lb zdNA+r>`yN98+pI#vmWZV;QnUT--!Jw9h2>beHrvO6rD2=j@J9Q5`B`6oD*q^@x$=s zzxVnbJr_fD;&GsiPowkygIQlLyR?oIQ_=Mt(I?@eEdDazr}bJn$8PZXhrLD>c(*Qpv3CyVSL&s>qL;?SaPFoz)gQ^nwzPG+y6tVr&#xo8uug=osU+Qf z%VphM+;H7b+7WT39K~MQ|C9U)SMc+a@)P+Nn149GgZ+EBzDNEB`-kg>QGXhLhVd#n z9T_i3{TEmKqps`&iofhDP&vnw;}4P7<%*ucY=^iKUgWaxD(+dl&)J?`@jpMp3z*3@ zl7P4++!Hx|zf7|CWMo6NXaBvJ z_mLz%xuITZ4@F;8F7agCMeUNDbCL6~rs{<0XC%)F$-bVPTc_t0=jUbezF3Bm{p)>) zga3QseXD)TO*J0R-DRkAIRC`3pTy--fNorsuw2@AIZq(tIC1Z&qH>n;y_}zw=Oz1j z5}(|#Jf-~h7p|`Ob@|J45IbqSACB*2{7>yX{7(?i=c2BK>;BS@#`ycOaJ{L5%Z=7Q z$n=3TPSJCwtX;&Qz<;@-?m<8b(nkM|qsTz;5dT`b>Ih(i?BjVqc_o<#{JEeSNp8P!f%Ra~o&d0v}O|_ckvQIxVH#``iZ4k7eHg`e`gT zn9uXMLwV2NYj#)tcJ+)&n zZsL73>1VT8E-vYbDRE`~F0R-ka&aY{x>)>0kGS$ZM`N~Q-wgj(gK{HT&gmRihoRh5 ztyz!cpIn3G@rYc;UGn@wrg{SRP_w>{oW8KwDdi~PdvG`zPe?fO55Hfb_XEZktpD7b zsh^Q>!m^Jl`!n=i9z0XruQ8JAKvKT4Pa-VipGr<=FuPLkWWIb6`(GS!uVj|z{-53G zd{^e_`*RI-EvF;eYu-^Jf^idfFjVIwG zUeuL%vTh=-e5dvxm#4IkGG3!}Wq(%RYd#^HRU0U6A@Bu9OG4hLZPO-k6e{z!T< zpAh{LUg`naFYEMX@?5XH2hn~`;?egZ@#H!?v61BTe8!UZH%K{3dmwg7{gd@vi7)-> z-|dH2bNSSj57966Tb}b99FOXop*BWX>=*gpW!V>q#^280H^~01)W4{mvTiKzxAZUK zZbo|zwWSWbC0sOpS?7}cUd`t)W!-8k>WizL=)%4Qud|9Ci6^ea7Z&~E|5xMf;e6EP zM$e5#IT|mTuE?YQQ9V()KD@ZSk5=Q$Z^#SU6}Xrxs(0LW&Ka~pDCW~x552Je17`ChpC^6 z@_MZQa_>xdeo^eF_b<-vnwiW;RL{Qc2-h#8_GR$7M6wIM7s36mINKZM|Nqv$ecNLy zNjGYL^!uvA`T0cspBtsiG290}7Q?}Kn8$Z@G3g8M&!{V0R8KVCiJTtopFn?Bhn;ol zkLvrY;bcFO`kA;omD82ybMttrU$P!3us6VxmFci3{C@OmzXDeTJlFY4aG^846*m|Z!SAnQ~z zo)wmTaB-zPq#jB>=@&dawt~9v5!vB4+ zzvNF`nP}3+MH*zlQ(ye39gfKG&|HHkX^cmvp`m?8Wgz*#C(gpJDjD{plP}T#+2kRk2=)SC?GU+xPe^BdJHu zGsw6?&Sykf@=N|PHG|t3YA<0v!_Pk&PFTuGI2vBwm*Xc={gHALH#(kv6YhN1_3Ilh zH!4?CEt{|XGZghR@O>bU6Qy5?GCkjz`j(%stgnl`-*b73tN5I-WMLh?}ePpu7`31?yshBB5$4+ zPwrt1p9ekvc(T8zcG=+jSi<*_-n;O7bJ<5}!TP0skPGL#*k8tT(oZ z`lo+zJZcBQ4(1N%!a5M1UydigJ14#2eFf2bBj|foi5K1*A>Xme`lhtE5}xuGS8{Iz z*=MMKJ+AGIE3)5IWPgTQ!};jQ_R6_G8Ry9U*I{#Yd_z&Xa6bpn(V{ApM-o zL#aGMy<)exGXCEfx$lkq<-1H+j~`FvC-p_*3Cnva1rChGke+^`Q^dYLh z&!Zbx|3=qTAE681$MU^H(mzVON*v1X!t?slPKWKegqQUfS~m{wKbHC;`Xs!hE3TwZ z;}^JZ0pCj*w?g~J-wnt-UGzocMfpN52ho=v-(bCBuc=<)bpFZlE@M~9b8N(4h?W)TT zu{XVZ;k$Osr^)Mp8Oe1($rpu}aco#`lObGk>NW5K37ih^n6c`Ghu#+-#5TH7moLzWCk*NpMQ?|Wo_ zQs&)_`cS^vptT%00YSMAB`6 z=X?$I7`ov)jMO_RH>oEd;kuffzYY5r=?69}(&YvF0PKFv?w{;7e1zn8LKq$H47Qj0 z(eV4zAsntJ%f~R^#IDR&q}^WnnAQvTVpnQ6uKI91v721!|H63+=`obpBlBu<4OPN= zq`w!I{b>1~jacfB+>;lwltU%!lm6gB<`L{(#jf->G=DJEc=ng^>l9|0=gmPj)B<$l zs`4FO4)A|v>`(j6an*K-_BYiz=_p?V!t%UCa!dtANB@kB25 zU-}*KPao%p=V#Nyhwaz~PKVyZxOx}aR1feuMta_1e=F%pdnC`ZE~b7Zj9*uH@t5@j zX)ow~k1O#Pd!*cH|1QqY#Y{dIu~YWabrOu~|PC7*9>pZcNGh zNG{A1F`nGl7gJJ?Y28IQ{2of)kAo_;J|kJKazDAuk7Qm)^&+m$!}=lZAN;R9uK)b~ zepTj?^d7~P+z%z|k@fphJ0ahn%DAa6mhV&dEsu^5WIQ6Sp`zdGlAgWe$$pC1FD!OT z`yl5RC0}xmNAAfJPIsXkaefuHQ!<~S`Le7>hWGJE`!Dl-2`}R%apk*daV1@;j}Di& z+>W9oz<(!DjclYNn=YPaL>G$mw`aKH2{}h&b8$3vIVW}^2uCy*!+AonG zi{)gf6S=&k9OSu1S<;hpGO|7->v=LBismP}ek=C=gVPmP`e7LdMB_>Q5|_?jM9znUIB_wXE>*dgwe=gE$!E9D}tgpYFcy{Id_ zYEDP=T-;BmYpC8>9&yzlT~m!lf4EPG%Zb9l|FClS=r~UNMGwU{Bk}hhC&_uKk(|yb zbm6-_bmQtebWL>w%VoWn+C5lb;c#?spQ-3xzYP9vHvE3}4vsJ1XA;NNeeC}PyVTyv z{;Rl#dYmJz5~;Vt1r2HME-Re!#$K7 z?w9@eOS>KYj)uxL#`Dwg`!P8;CiC8Cyt@2lz9irGNIesOStpd|EB+GxPtHeO{?Ypn zqI^Ixjr-E$hx1cOr_p~E4(^TqoAIUmC4G7B|Jlx{-F30lEBRjv*e787r`$I`946)&Au2{aCa5s=T$L9_v6bvMD}w-JLEl+bzm9C$@?wsO0+!o$E~>>#chWS_kgf}I>YyD zk?<^BRWCluve-v5;IyBA@6xNrHt)EE8Vs%SaOx+K-pu>M8INm8D4A4+%+ z+d-@7J)`*>eCLGo5JQQ7G`yrI>%3x*)HiuwqUno$WQU<%=X9l=jE294%WX8?XC?28 zq2zs#@tepeb9qPgP=7Dyu)_0bvfsEryXCz){R1keX>6D5<4OA|>54vaX*_DEXnZM; zy7b68*!`Ex(_;2 zefobDzMgs)^}zY9zm-lswH@b$S;_cY_?(N3^M7D_gfmKLTp{h$zTL3>mhzNv@*c~* zoN`Z}%oijbdGCc~zg*sDm+g>qM)ZD#`_ocC_br!mPjF8G>ydgP^KfzvwdYNG52OB+ zAN{{Bx;(=FAC-9jGxBg9T)r!l_v-|;KhMzhD6Y!bzpi$7D9dGiU^uhX_p!*bz8O#6M^=|U z=@-WFJvi&%pyw#hc|7Zv@4gZ!m+vuS>PD7}EBBMM+eLcPIj*L0_;ml6O6R@9$-0XluKKn0Wf7!3^#r{$+3wd8l_~(tJkMa>yC%vT^#$)J8zD-5% zcZO>Bww7nA&D<{jx8awgy(X6vd>4!DNG7LKFPV;LOW&sEBs$5d9TS{ z>E{jgF2|RCU*02WXXHDM-5Yd1!}okM$NL;z=@;T`r>RaU)!{Re|Ia7i_1}i$IN4W( z`>OaJ(0b^~{|wjVZzk`@k@u0@@OxI;ABm}-*gnaJ%x{F{9ugTpOZla{aPKUiOA~+D z2PS=R&XmvBNd1v~?we!Db0ySH#&{nu^rwCV_DR|PD2x3vE|z{r!cjSjK4_Qv(fEYy z5{7mV^_!|5%SEr$6Nz^Yz8{8?_k!{T<4cZr2)c%9!7T5qw6DUVm)>t9xlSuA&+|X? z{>RTpvmK&GSnQSO678q<*N?Shy|fPw^I2xu2a)F~qxsw z&sWYphW9^7KEz(R4^;XsdQM;`x99ZU8j9Kpd5`}(pUd`N$oZSNiP|mc*DqnY?Bhv) zayk27$L>w+%Kz^j#`DjU*p+@o#^p0Oyts5Py`h#>>h$C47#>H=;c)UkNWGbh{)T!G zUHE<*Ji-{r_3?y+~)6C-ZZX z_eI({3MbT1@c(dMW_##;gL7QmZ^?W18q1^a&ztNo?Z=Ey zsh-zW|D+$5_h%!mV!nBhx0EfU+L$r$8l@eFG_kc-W8X^#gw>GPV)b0@_h@Pmx-x1Y^UT;>b=zG zlUd#|;z~PA`=c>+Hrp?HdNR}d2H#6XSlZpF|NgkHc!jM0cigXr@2>g(HpK0Z^3YCU zu}|z5mU0t)GQPQh(;*JW`4XPW8O|s1cv|k~kLvxa;WEC|^=t3%FGMdrhrQ+U9rVSV z?>oPudMf)4)L(|*v({od;Xa!@U)qO|{r7M`-(Erb#FhFe{bPE2FXJ*p74bNxuJ&G@ zueeb?(qG7PmGx|K>G{aKFs4TG^OE;t8qbr({Q|!ef%ccniN<+`5^4_wa({tubasgw5Osy&71oJggp@+!Hf1p;GCz_Ul9(8yp2DC@e+E3-oNIv zL`1*SP<{g4^Ysjwa30p}ai8f7Gq2xw66wtKG#p3%=QvU1?>W@-w*0w>=3@VlpO=z} z;Dw%s*f2hC3my| z`;WpNzdyTv|95!=FJI!G1aZzt?2kXj@Ha%UFDcTw4(+`yo%5$tf1o@v{}jCE9Oi>> zk&E+3B0S>UlhFUReER?0o%qhD7;gxkm-qktE~hA$e_xKpy}kAKYX5KRi`Z8Y?f2S$ z@p32D3EyV^HaTB+hWBW&+zCBme%!L0>+g-o$8i!7`!)i_KG4`aZvRizC;B__9Lr9=lb&=4dYe8#!L0TMW5neDrP-`+fYB3%N0p}b7u87gEhLzwS1kVm6jxEJ$Mq4yD*3l!f+5cXSOxP*Nn z_x+WJr(r)Q%%jnK?*(p8%riv)F3JfXZ^?v@&m>>{|Wi|6|uen_Zcw% zRg%U~L&SbU!}`^b|DVHIe~v}W|3y13?ky7I-iCYz3rGDu?}E=^a`7EUiCm7L`6LnL z1;<0oyq^Dx$?M12fCK!o8VTPlSCDZV@hFE_e~nhH}A+a2H}c z1uw!c<_TiF$@%(t3%PiYP=rh97rY3k;D!0y!YRTb&N&PFB7M0Y=%3jAS@roN-Zv0( z;ji#V=n;Iw^b!7wcI>bABqGv9%xB)#E?vZYy^QI4oy{W@(hI+PSdH_F3N#nr1?1na zfqN{OxrT7}TKsOR34YH;hu=+=-h5xRVK{H1|22p_9qQY4!HafS@FE|@dyOLf1d8(T z_XzJ<;yH(g;rS~M?}=f!xV*mpcv{i%j)eD8$@t!FeR&h*fzMNvH{ahB;Sv4X516j} z+$QY*qJR87FQ}JabAQYcg?$^wD@4fKFuuNh66^Nje1wC1BSJqvUkY)+@!56Uj}+~=kc)m>%)`b0C@;4XxrzG4I7^Jj ze#Y^c7?+89?(`=OpF-YeSl`cf9Zcm~{9cpEoBOoHeGcMWy13_6oOcoLn~C>k#kx61 zxZerW>uqwO=PPDUCf;cOue?Gwv+#=V*GeP=?TPm{#du4k)1^@~J`#yUy@D6!m3Y5b zL*(`)vIO-vJohi$i*>X0XpifM_XN>jk$)n;1&a1Y@M66~e5Wmy=~MB(5NJOlcsv@~ z=ZvLO&`4jz|Sa1I)`(pks?2CCS?-${_ z!I*AB&jH56_drDa(Y&F1vHvIZiTB0Cxvpuf{etfRVE#4?M?+qmhZ6n53Ffa%iZDFo z7!L8i@7vPv|5h&c1H^o>;kf1tHlD3Nms9n(=^@4!_1{gtkM_j=ju^j*^C{vzZ!y2; z=W8YMkhzn|Pv~CA`Mr(sz9Bn@3*%3;_bt1xMIpoI(sHK0G3WO?i2IS@{0}p)zYj$0 zPl)>o^jGYsiFGbf_fizI^}WKkvb6g8G{?tWU=-C>QC~7tKd7gmZRiF68{4*Lt~#udw$|yvTRa--~|X zNE*#=iSTuKu})uqPG0C2?aaI7I%wE!{-e9P)<{l2jmmLsu#!u^$q zkc;sb=fyeIdh_&nULJ(~VPiSZ=e6SfI5>~M#x2sD^D@6-_{F&F74lZtesx7`jVSKZ znU3Y1-;V_MA243?X1>PP`DC&rfrbO_3z|g{?mOB@QKT1)8<@F_>)!S2sUn@Y9_5WY zQ4fT-G958+LMStJ+6le6z508 z__86t0P{5*zth*yd?|)gjB~`f4Sp{`{W+GE%pRoAr#w8uKY?QWB=TL1W5s>(V*Jz) z#rwHp9x3hx5Z}k+^{@W@L;n3>g`{A(g}sLE{;E%Whpzr!F)^PM_ihRl>oo$!{hask z9?KtaoFd$d_rAosj41Dazb`5izJChuS>t-P80VkT(f&l7YpH+#t%%7be7_CugS*Pp zUwrRbq`Rpp?~l?kzxlamh3v$1YAD~!a`wje_rTYE#r>O6D z#5(j>_`~1Fl*!}CyxhHw7wOV491VFfj^^VA8Skfo@5FiVcnW-*Jt61mQ6CSXkIUiS zMm#?t=EG*F--@Ad2kRm@4ix*X4Z|zs|AYW10wx|J%J*;&Cs6~4D0VF6Xymv%A^%DhjnW_pD4^o9Tm;ReQu(?;p?3B^-{?Bxt4ml zsK+9F|1CcN!!P{h_cFr1GOq84a<&$Eah^u3zl!fJigTdiz69Zpr(gX&`Fvfwo)_i! zzqK#UyEk+v?!^=R6K_}Q$E9zRi+W5R((kIGV`_%%)dsE`OeuL0lU_*0po?DCy#Q0L=8^`){aHV&6eICflhfD;2 z$-v8T!}pfB9L}ZV{OJGIUc+(L|EqCQ!*Gdn5LFltF(2T3efY(DG~&E4pWnfK>3DCA z;Ke%jUwQam2CFYB5#xN}udw$vJ;FcXzqlv0dn2Cie7pqr+We*7!h4x$zJj4lwlY-6 zZj_7hlsIqkPrPVnc)gHFL;kP%E8bg!`5{Z!`g9cSr-&DCpJXx`!!Op=`FG~wyd9Re z@n|mOV*Om``>Zifk8jYvH`{p5QT_FFCvrKesz7Ovg;k;km7b@Pv5dCy$6CU3^ z7(VXbf1aBV_xg%){XrHl`OP`Lr>CQp>RZyrXD`#lAT|uON{oSZ~F; zx|pXn^yfR&_gDFU>TkHdF3N)_mty})@P9>_i1(I7`yl#XQO|ron9d3nDNGSeRhd#W+;=X=wCkY3hZa9!~$*~Fu-F0oB74{C9!>?~``q1Hez<8A*CcpAsi{ zdP!f9VUj1f_a)s)0O?9*kRD_vc?X`8(rhw_EF+(iRp2I-d=1AMz9GAbC%Hs=DVM=* z1w7Y@yK%|+QEN2_}?7< zH;4bt;eSi19SM|Nlt8JM6ef)$i$E47Z6zC}Lu8ZWtK9^c444d<0+<508E`Y;ZYfur zFC8aGz|Aq~0y!>qCq+^zDFgnhbcIwyXdg?r$WwTp!K0IJ5mR`qm6|IbNe)V!d1qyW)LXG2A1X!qv4B&Qb|e^Zwo+y> z2c8sVjbul*enCj3`a=21g`%WVEY+GKHbS&RY>U_hu{YuX#G#185l17AWBC4LKZefw znG7q{P{c^}7x1@<8mSJR2q(OqKLS5Qjl}T9N<5sg(kqbLs+`ZV zjFn6$!woU2n?m1;vDUaL1w#m_2A;mPWCuJQ{dEKU1$hndtu*eKFY)T0L_)sv^iVp3 z9t$sTr7s|LzYy&8(>zfp18=JaC~a5JbbO|cm_^7iFE`}}X6~lcAky81&fw1{i1d^M z^}h|`zX8VszZJqk!|MrrKj04|AAtM<;D3Vn%?5w38{*XjI87D|{*|D;Y{WibzZJOG zLwx&bBGpq_glvLzivf33zY~+YDf}278rY z?u9r5F&uF)AWfHR;4jsa40?VA^Z>pmgyR&-)4(3}e;uH&#*fr}Kp-F8lsLvie8FBd zgr@_zhx}FFA4te==3y*9Mwmsie0J9J@>Al)@hTveW9ce{_ZINHJe!iw!9CTp1L8A8 zeW8|5CM2SVq`3}XmHfjiQl;hWM)S6$7|h#y50$Snd%WEHH;Gi!rx4QLJ4vGXKgj!u zO7nkWpCqY2gzqcwcy-fILPEXc6sqqhZM;g$`#SG1h03d;JlunF9}0XmxI5=9X+(Hv z{TcXKr1~TC@0t25;CJ57)I4zihj${Dr(_myXMH-Bzicdj`HJcZGlKR7i1F%Xm=$_Y zDMWYi%-{J_;?>*Wf9#ZJ>aH1t?4H8YkJjUrEL|g2JJ9o+d8FD7@J4g)A2WyW{V*j{ z<>Ad#dx3c;%P@udGs5hdIuLkMpG@^rCXZCV0X(AGX?Q&>!EjW(310-5Z+7k?Q}ar7 zD2rFT4{r}jwUYD>)c;B~UY!Hs+UPTr)$8N-UF4RogsfIGC11Fez69m|O}emjeC`vk zp85pt1ezKu?FRi#)KF<3pe1A)4 zDRaG{QWVpdDc%2!kXN=tHMCu&`gl0%lsGVN<`=JCfO^o*Z?wh@%IU;Dqcwj55Bj89 zN17f(HQc|$MEJV_-afEZYsh+V-`_7*N&)>y}quwFvI82x4SPoxeIaINIR@I?C zv|Ola73{WFLwcSD|Bm~CIpbB8w~vwPN6=3G;>YXZAAYr1PW+gDd(+_bS_II3m52YheY~pi zmPqEbcvh}+r}2L5z%+A=hc!cJUo!KFfRwXSdBl(=laKLdV#%#{)eR}tenKFDbSv@*2lB>R;sb+?@bYp->kTb$OQuC?dKN%?Hf}hf<#@dLDONs9 zwQ0=VD_bsibK&wzm5&F6you_F>FcEO{?vuFr`4(}mJc^pZikw=Gkd+wJrKQFc;7eo zR;!_%_}JW$@bc_PX!)*Iz11p^4+3*n;49Stv>$->1JFD`rKf<(lmN6h9MfYs`5ELe z4r2KpI*!Lv>NA|Y1o>Cy!-@12tsldQ6`-?zI1%~zC#-Jw3yfC>#DM>Rlfc|9(3JFr z`VacpILAAXqkrIVIT-SHUf@htP9g#aC`*Bl0iKSx5(14ZzWw~;)%&1lSKtdZ0n8US zPu{NXXjy~(WuiI`b`LJ-GSwW=*U7Sr<{;pq z9?9q~9o@yN!@>#l1H7JgYLt!U`Dk9C^7O8eu7LX{YK?TC;bF~ih%fD5{{%j91`lu2 zj6xQlO0@*@w}SD``e*9sKtg_)QHAnajCZVLIR(B96jX=qcsqP0$PM%9Im%zMa^GpD zs^R^tIZKBTW-nR)J80%h)dSkm)iYtl$I6GjCL4G!jkSjM$Cauzwuch7yF7nB4}QVY zYcgOP2uGIgh2+lglqLzVQZ3dT0rU+%rMV0k7(5!oHJW@fiI8%u8gdF&iA%LLq#E6Q z2RJX-lza*1Fy5Db1wK01K{F7-bsO5L*T65IR?fnorY2#3Ylr=04Qc8FH;xC#tL*`| z2lIBO64Jd7@MG1sGA-{-)SH@Nz(f1Z`Z<~}qnLS(^ff~}dA>^hx0C0>Dp;lJsL^=S z@u;JQ&hC%s0$4mQ=$x=T1(4<-uT%?h{0EIF+Oq`A(z&2LBf2x9ed8N@oxxtUY9!pg ztA>wP;#F@5&!?Vl8eae1HGDkH+tE&qJW#JUng^gcZ!b%=ZUo1Z1jomu2*!(FYTU?& zFn;vXJQ3kSjK=UqWB9@}ydR3ja7JVJqRHWrFfP8uu$8UHzlz1M*HbwVE8jFPheBNw65x4;4$S;@(`>@ylTBziztTZ`0M|fx zX@9xZ#*x{puyI1nCO?9?R?Q~&5uYI50?dN=S+n?MlPchIf!701?OP$v0NfAqxq!uh z5s1{kR>1#?`Xsd94R9>D_X9iy=0lMmj`%s?QIL-Z9Hn#Aay|AkPls&M66EiK`*wiT z-x$DBK$?y;UfjNmmX{k>Ew8t{96IaWSiE5#sHOeTiFsV!&)*&89w_(L()!(Yet?$N zZ!b-Nmd}%oOg>_M7?W44VJMGAc^t~0X=wkqaDE(`dti7x&>voJD%EicZU4X0jl+4; zI5t0l{)M?O4J&8u=pegi8XEs0;V;x8s9z!B#Y~PpA)OcBj#tLc{a*pB?GumS@=w&Cc*keM5si=*)t+uErWdP7g0#I!nn*W zqJZhQ@G3<2B`myj9MKxw%aOc&sZ{-NK3t)ttKdg;721!(=s2;2<$tAGfmnt5YEfSu z#{aq22lPSzs-^vC)fm-;&*!Spow*4wH`YuJ<5uJyOn5n(EH7D0h{K{J`69HJU+I$M zy-?4as7dlPdqP|+`M9IoB1hEA(OK_g!rMhBlVI?_T6JOOBg|ah$Z7vxt(u$gd~rqp zV0{Ga*Di81NoDTbOfms&)yeXHKtq%}`V)!kT}kpWkTR4RJpOpAL=!&lO*G--nq-qH5l}8#r=z}F!o!)3;mk+<1t!5@uT|>; zlMey2Yzj==06S}HG2aSI-UI%ZR`DwFh4EK(A^Ka0_6yN|36uALD}i{vmzdD@VsPsc zljY!Et5z^`C`TrvAU~?cRA9I&On7@yh32)0b%^n7yymm`Ii~YV48N*NXZfn?`1q|5 z=i5#SkH3?`$8$~!PnTq-?^Ua0lW!nArmd4rLIG`6a~+mT9S`?7Z4-#+y(RX@KPP-$ zW4Qbo$mazzA{EpSX0UHUf~Y zXVP}Z2h1me`{tH2wFe+RflHlqJfB>2yga$0KfIoQ9^;0*JBB-6Jqh~CVmwgp&CppN zpbL+s{ee;U?s8iG19T<8*R>1K#Q|PzXVlFB`N8%9x^=+cY8R;~0X^gOM%`&xzi0yX zcZ2+krUAMw42?Q^d*(5)KMVK^pywFiL%?%@b?u_j-)HJbSt1jb#bNjoF+Rx{AEVBP z`D@e#fj@cejk-;UGeCX}_{o5009yh^0(Jz9X|GE3G~azdKHq(b>HL!A&yOJI^*dch zcaQfr&PM;!b?*SLbx7B_05%4s^Y2IPvvqX+7TPH`uCG+h(S5!yjM`W8bxDA|913(? zZ@%sr@ckVMk&kEfwp42_)%GIf_jdWZ7hoRfkgqdY3FCUevauWJo@N0{a7tO2Xl0v%mq9tC z?Y##)FUN(5<`_R~#5$BeM@-T#gHsB1%U`1Zswppb=BED|O~`;aYf~ED_f%_Bo(|Tg zJl(8KxqsHCy#Ca&deGUdPDk6Lo@RVL5926I?flMVses;&|rA7z_X!#MPucLmz3GUe+iwV3~PnE%f) zzg}W^R6Q-%u->EP>!jv-UJvqEyI^l>&CK_$Kcywfgd7H>`#*Qq=gD-P57xgB^H{&{ ztj}ZP3M!|1hi`Dfba#>HdhJlNG$yZ9)8wKxglySxSn4v3#^bQmAFv6m6Z3WDJn0*l zx4f{;lZs&7iLL`r0CT&fo7%~MHoBWyKZb5^^z-^>ujlnXNxBW~Z1atddMaK4K{bhl(i=OA7AK3-r+PTSHPv-}fst4Nl zVE#X9@1dvl4(2HgH}&*Dy&iAubA8@y|0bxX8*{f3kggx^=;_Vs?Iu7Pua$tbeo>_1 zn%2`5!{v(MsbS@yWr_!;kB6SxA7SRkaAi-vKk473MxxJF+fk>9)*8ohH0E~wR`ft?J@!sB^Mm-i_i8rQ zr+lnW1<0qdasumV7|ue}XGA^mYB-Bep1g*ld7jMcJug47KP2=1Ay4M%$NLFqeHykW z6{xpF=ojrA<42g)V!Ks`;dzeXM-}wcxaocas{wb zHC1i{p4et@#@izYGu}?Ukbi;k=*?}8X1u?3LcOL+9oT;--39HtqJ0Nk4|YTQyq!Iq z?rui&pYBW1`OP2c&s1#y?MFN?eBMki>>D7)tF*s&-fl#5drZ$T^gr5+&u`+{ye(>b z9NJ67@FZh+(otVFVm{g{FvIZ`j#Fy&oUdT@t*2Qb+K)1RM?*8>)%m+%{V5|>`WWK6#i0FW+Chm(_)> z7iH;Ga~{4lX*-1PMOItp58aQ>1KyC`TcP{oeX@tj1;7u?Ze(H_2_cqxIxE^pHB3;+nygLlr?Jzx`2Zdoj zSb*iAfb~b6W_n9}e&EgaKX>#jkodkwfkekQUG@};a)aa25-bZRJ7(oG1bCWr4|m1+klmmvPOIWN=)ARm@)v4n zz^6Hozks&T&b$k_&|kvv*ARYQgy;VYTT><($MNQ-67J`*{4LeGV1C7` zgF)ZBxv>Am(AAue<6X^py>d0@^(v2*>o6@p$Kb4=thj^yA?jqs6ETosyt)9e?`M;h zWq?hf9LYs6Ui!?9rH6%=JEn(+IbYxKFz4$V-WZ-ZT(<}?r~9_40|U(Ies4HnRx$1O z1I%fAwiNgla4w?Q#%NC8@-0)0SdNY6^mfkOV9v`=fH~h6HZuJOKu-6E*A9%75+Hoe zdcF?Y&p#UTB@QtWF&V?1j^WN`@=CP;<%KBEH|Ohg`7A!wY6-?KpV^0XMvP~LIiDX_ zu=K4OQ)SNQomD8WLisawGlZ{vAM_i5KkkcE>9{FfQ;YuBq2A{hj+YpYI+i}rKUvWH zgZaM&FPG*P*e@a4Tk!H%f#ueL$zgvCk;lKEzmo;6Ppc0&q1*-0mC2j=xuJe{CU@3* zSnz(#+k%(-0JLvJ3_}dC;PH+|j6+O(gS`GEqn>07UVr$0DfCwse0@2Z`8Q&II@(J| zdjTwbC+1~a@ba9^(xXz%w&3MCALaQd&qp~wpA)6Vq22=2TY!2CnY{hN5|o#qobO-L zaN+tN#<$rQ^KL#ggZXt0m7DH`MQj{_*^)RG$!f4#)49yCrX5-7RT(^;JF4JvTpe zJOKSOqC5=sCTSl+IR88z&D>Ru;r9CZ$Dw^!Hg2dI;07nmz_i% zJHz7@zAg~2((%f*!g!UAQ|^GdJGgh&J6iGb=48don~N1M*DhAPT)Sd8_&8^fog3rn z_?w>VTzuBuikAlu)Z>kM;?=33|Ml5;)d;9L2jdAq^K+3b9c_SLRtM|-=lHsx^SPn& zb}*lGZl(zx$M}HxUf_eyO~!QR7;!F5c>uRZt~?i}^7@mh+y#3>p#P%hwthU9sXPNd zOdGE*{~q+8&s5YPm?vp7m8O8O?xVB=bk=7oP7EVW=()WC=Oay?zPlWs%usiUk#l>ttWRQ0;%O^O0qKpE$O>wa@ z1<)RF9$=}qSXlx%$SwfO6F-LrG?=q=rA zYznM?2OO_2u%hF`;oS?Y0)VIPVh}?Bf3YpFqT@ko9tk|f!+^G6FCLKU;p<5SRwsZT z3-Yyqoizn4eT)#F?|^@=S%K9v#QTUh0MkG|4-n2J$~-+CWPU!w0rSb4&3lY+K4bqv zYOe(MyDP9gxlZQFu$D`e?eDkMQ@#5Hl)^y-WCq$ zP^{=};rmC{S{1N$Zx^&zXT{Go)micLOfGUSsFxQ;y2#w!bC&)vU$x@v1+M5$HE?(4 z20ngN4cxu8f%jikIDWJ@@b=!pz}tIQ)bEP=-B6z+>T^UrZp_}5k#$!5+)%X4G49Pd zB7Tm_9o@UjJUs4j%^}^#cbB=j2bz1Jxd)o_b9k-K#H&9-J?m5If%adh)iBPv(Y!|f z1>|tfQ+W+IM0GOo`W~+uX3=?!H|q69z22zTTjuAcTnv01R*vfg4cJ6= zW$6a{U~D}N&V|W*JYi&dE7dT>X!Iu<{fS0@+%R3;FT>qwJh4`8tam;qN235&C`xyx&0h zeo3rE+bvt@7pH*!jEZ=5I^cw5@oFd_okvD8IX_R=&)HB049#9F!1qhp@H5ub;GLAuo2K!tupZQBvl4JZ>?f_ zVZGFF!vy-nF|`JITj^=QJ@N1!5MUa}+k^QL!14N818&6;8}add0h))&d_AiW z?b$ct?W27o-aZy$J6wY1eBT=O4N+eS>Zw3;2h?AI@@y>6RcJn$#WzZ=Li1Xb*P^~! zl-HrW4&`-k?DKZVu@P@K`93|&o6x=!hT93_@f_=yOC#>C0``|XRhRYuH4p8WMc)tfmW^dhtNIVB0hVC4h zyGrP%`20Q^^*W(Et`V8Yfi%T`k=Nnkd}`xsoM=8{;yF%S& zE7X@mAlH*R<*K41I<=LVj`UYgg2bp&Nrpq#2U=k|3Fr;e zDL|{3X|?Gz_+QKDW9DNW_@yVE^)zjr812vK5Jp`Y9mc2|qoWvgXLKy19*lZ38o+1} zqeey}7>!{xj?vYOCNjE#(PTzb8O>lcm(hGi4>4NEXc41jK%oSh(X?_mqiHqPjHXo_ zldNWvL?)?alE+L^$0Se9XnH<3qq*GQoN90}ry7QsQw^h-#GOgTGD!xLWHX7m1uI1s z)V{R^wI9YL5loU{akw4S1t!mB^bnIjx1hQ9yTzUMP^vAvIp|3ugE2Ia<RI@|e+= z%v80a`gK-Ro1+!g6U`(sRxHJse639&oL z{;LM2(?B(t8>mf#fok?P(DdOdK#Ow=nl2G$&l{Q zLN=k2>L%3R+9rEIl5ah^7t}Iqs;$cU7W}WZrhbiW+5${Hn$lcOZF=|}sMk$dIyXHI z{|lPZkeqBv>!Z01D_1rbOk^_2rmhbRG#K?|G{EM^J~|R)^AxDjhUUmzn+eu>5@z!Y zNFr=#I}>d~V|~)b-~_o3|MjH8_N%_|-8xylG|eLKs_me|1v3S@nau7>2FUU%bim|7minFJoTFvB% zOum81%b28sNp3JnmHiikAs6h&0b3+bk|r0J$>Nz-a`#IYQ=gkMoSni0}AbPD_WLrw2Jru%4BQmo%@XTG~+4lWnMJVH+BrqBb-;J5v2)J5t{Rm^_HdjUd;P?2a_1xs2vBdWg{iMo%(Y$Y>Fx6^vSUqCSr8L{p=# z6ZPw9C+gSpPSmg8J5j$9JF_@;W^wFH<*A)n4tAy~e6lmu@H?~flG!0$s2#Nnb*t-g z6T;@wh1wa`g_hXDE>v4l7uxq#bfsaw0Tg`i%6#w2eDBJ9?@Bei>`MJ2-DvGoyU}{B z>vn7mzZSEkll@H$n8ecq_7*+U&1JH>@yC=b&f7Tb&ekbHFx|J zsKIdzP;19YK$|)G0d?w5!{gDNYMa!ZYV+<+!{ghXwujYVswa;btz%TzgW8YiLG4HP zp!Q>WQ2TK`X!uw6VCAF-Ee{)d(DIqwgO<*0zId;q$hE6bt6aDO&qFCqPr@zk-pJ6`Zd?xx#@d@*Z@>%Ya z=5x@ez~`#ZU7v?OKlr@xv6|X)YP+djrVjJ{)Ysj2obM#xslL;FXZfD-z2y7Scc9v; z(}zzFm>w~G!}J}~v#0N!erWpf>BZA)r+1vubH>OSzB3|bq|VqeW6z8;Gwgyqf;@v} z1kDZ#4~hxe5_BNwM9_txn?cn<-vzx6`grDqnUOQE&m_UxVDsRn!S=xp!99Zq1iJ>0 z3!W9cF*rMTZ*W2I+29Mow}KxBKM$5>S!(>7 zqpR@?<9Op_<20ku7;ao@%rO=l%Z-)BYU8)YI^)mA-;J+~YKT6>5MmQzAJQ(Qb4ZU6 zrx53mAt4`yxP^QkGB)I!5buy_AweOtL&8E9g~Wuc3`q>x7?K*YBP2UyZ^)sL;~|A1 z7eZ=6o`smt9ymLH_UYMAX8%0<#q3wJ&E_%DC@ci(j;itkc zgH}g7^g~3yv+gxZuhH z?ZN>I-51VZxN6~^g%=lAEUa4i!@{2zY9cHm+C+4Y7#i_)gja-LL{P-yi1iWMBlbp| zh`1f`dxSpH5ZNm7oycz@*GBG*yd0@6>b+>xBELn6i*gs0ExNvlM0JSzDC(=I8Bt54 zRz&TJ+8=c(s%7-Y(caN3qtl}IMIVd49sMx+MYQQ+!(zL|?H0Q)p0Ie|;)=!JEq=b( zbV>Uq{gw<~GJMIzB|b}nm&7kgS+Z?O&XRAJv{>rAbokQGmd;wbd};jBq^0|oURnD4 z(pO6x$25y+71JlCf6U;Rk7GPz7RRiKNs8GLlM{0&=6p<5%!8Q6F+ax`Vq3&^jD0`$ zi`Z{sePU+^M*W zao6G=$C<8hUNLmVuoa#wX0BMhV$X^*EAFj$w!&s*-<4mloW3$_<i&m{$wRP3e zRfVfAuDZ7BmsRR&!|LX%omP9T4p<$&ddcdz)k&+Fb6W>kzFwrA1Br!a3Y2wPn#KfbCg^9l=+O8eBHfZgFwaeG;S$k$}#oD`T ze_N}pvsl-3U9WW?tV>(><2tML9oCOuKV$ve^=a#$t$($?(T0{A`fm7Q!`B-oZ3x;h zdqen!hVePhVRh>dX@*KW+%cyVLR#-|&lO^r4++thp0 zm`y&LVm4)Oy0l4?+$OnOvRm@FHYiH=rsGTczuG^WiGkxd2odr8D?7X(~!OkZ;f7bR@VuED!L+V$D4uXat`6}&5ESHiB8UAuPW?K-)u zXxG(UuXeS~>Xh|P)(2UiWqp<9mld6rkaaNYa@OOl*I6yI9kYjJf0^x>Ju`b@_Ok4? z*{Rvvvv+0ZW*^NymtB!vll?H8>^9roXm^X<9d>uy{m$Nuonw+~mD?=0WA6L8BXY;* z`sD`YM&vHbP08Jso1L4V`&(}Fyf%5Rc@y$N^J4Ng=jG;AAHCmq|Aze)`%MnCJkb6?mjk^H^gS^7z>EX)4n!Q-df@7Tn+J3UJ00wP zu+PE42jdRzJ7{z0qeC8tW*ypg=-i=ehwdISKiuiC)8Qe9KRX;~U zQGG#&f{zNS3LK7gJ?3)k{bR$9eR0g=*oF_W17OCy!q_UVXgTi9RO=o)~%JixcBcOg!O#BIZQuiJd3*pSXC!^knCg&L`hL z>3%ZsWcJDLPc}N$?bNtaQ%=o1m3r#IDfx7h(``=oKRx>NjMEXPSDfB{~pmcv12C;*8?_;*-UfiYtpPE{we3aUt-+{0mDi zBwWb2aQs5~g&P;{UU+=r*@ZtYm|iqoYC%=<+b?BZs=4&^Qs>eUrGBLer75KcO7EA} zmHtxty43FS*Ow<>o_aa(a>(U{mt!w)x?FMj(dAc{^<_3?_GO*Q-Y*+lHl@tJ%vd(B zEV686*`~7WvSVdu%Wjv|mi~a>8`(X-Q~L5^|9A|uFtq0cKyipd)L3c{`C6G>(-SHmClu4 zS5B&&R%xu9R~c2gqB5~EwQ^_WfyxV&Rh6$Ro7`x9qu-4$Z_K!{@W!Sahi_EexPPPW z#=mc9Z`#~!e{<^1H8)S)ym0g0&EIdD-)erV<1MFK@7)@GYwRt*TgF@Aw~}uiymjVQ z*{$oh?%b-o_4BQsw?Do;<@Uiw!=Ri9Ojs|u)!s#;N%T(zxgch#Y) z;;Qm0a>w+J;f~FnZg=|L8Fc64J7e#Bb7$(Es5{HYLR+RcmU@Yns+{s~J)AP0f;;eKjRDHuu}y?|6T}eb@V++#hq_=YGWf zjrVWguf6}%{TKH&4<Bnr4b}R`h=W?yK2u#Uy$=~BW#)U z4f!`*bu7u#h$8!wrg9*0l&6!S%3QKV356LYeS^ytW|*FU!vF)3r#Jn%{SDv6m5>w@ zcqbhzIA?GaNRu{k$z!({JHUam-?EePf zHjv*1JOw8?XgKzuy^mnFPkA>$>hITpI#?0#1*G8)0i^yd2DAYAN|e(#vZ=ci#59x( zeg9-%p2yucv}ca;HgFPv>TeD_4M!W4_e30s@=h>;r{SeH5^icypWdGXPs2R{km?cX z_BLDxi&NAeJ)Cr<=^*&$aKe$w-_sIeY){B*id5SI&o8}dTlVZ-0&?|+-_!k)eI*)r~_~c`g6qbfa$>dAr9@p-GA)B@ef!A$^rA)U{1@)LO>c$;U7ntm_l13!y1tW zs1>v*bZyBLs0}d#+8f#ziDZL`3~dXgyWwVRiR@uC7wpO;htWJ}fn;)!*n;UHpfa>S zc0iM*7C?8)ErI6At%2^9+XCG$w+DJq?f|q(?gaFX+y!WfrW?>pn(ja^YkC4L)AR;f zuIU5xn&w@g*ERis-qs8NTBUgpXpLqd(C^@yUzvQb849#c^8wHwH6H@~N%Jw#F52Nh zyJ|lH+D$tW!r5K>8T@x-w1;*yNO}U5NiXdeKznPy1p1D43{WTSIH2!p$Ag`|KxHyO zI|2SX1C^l;O$0hrI~nMQS}&l{+9^PnXr}^Qs`Uf9OzRKSTo(w`LN^0wOWjPMZFIAM zw$+6IZKs<9)Ik>tw1aLw&~CbLpzrDy0_~@Z1lnI01^x~I3U{vS7Q_GdfWr4abxVPc z(8Yq}6QDA2(=CVpBZ11~3*8E!6HQkE4Kj@f8fKaRG}?46{jXmSG+dtqbb)>o&;*MV zpotb+fUdPj1G?T~8_*3F+kvK8>;$^iA`|E~i!7k&7Q2D&u*dpeHSk0)1(54Crf%6A(gTc>?}RmZ#vq3{)nH)kc@}76%kw~+ zSQZ1dw!8?mndK#*c9xfcHn%JXYH4*9sE5@xpi`|Xf%;nA1bW-*HqbeSJD_teP?>}p z?g0%m)Bs&*cmVPUpfXuxcnJTafI_Yr9s!LpJOLVO_#WiT7>zUh0FvcE;Y~loPw;;Q zqyM&f2LBbie-TIGs3_3ymH~Apec^DP&0`U&|8Zlm`hfn+vWNS2aBk^&=*J>&p6PR@~1a-G~G zkI6Igf=H67WRRLk9i;BkyV5}ELur&WR+=RFN4q8W@(4CM>-%Km(EEg z(lzP6^po_P^jb2J4RSNNt=vWKE%%dM<&pB&vZp*+!e&j3qy+2; z*dI_6@HpUgfK6blz^#F!rhh%%Yx?HtSEk>d{@x7N8FObGo^g4`of#%UhM;vp+L^X9 zyU*-9bMMS^GZTU*&+?m7Jh#`} z&*zSxTRr#5T)WV=p&x~Q8agS|H#8`8SLm(Ky3psLgXVoaZ_hk=zSaC@^SjR+A;dw=t0pQ(Tk(AqAx`EUi{wT5sQ~DUb}eP z;;1DTmY6JUzqIGlw57Y2>SLzG%#Lx4b&A~;n;%;c``NOk%T_N-TGn!Thvj3JPg*{8 z`O@XvmS-+6T7G+Z?Q%_=Wn8bgPvf4(jao5o#ex+}S6p6Exk6sqedU8yb*r3L4_iHY z_1CKx#mBGtFkwq#Mq*x~)!M;p$E};SE_~gRb*t9Zu6u9&@bx>_lZ_)c9^QC*qw}U= zny$n!-6MTndTDyg?H#uF-ac{rjO}x_uil=tee3qD?fKh}Z9ljD z;f_~3+U>O7Rk!PxUCpv4Wj)LKDSPUk{d)p)!gF@zw90kQJ(gRR`yjVZo?qU~ypp^Q zd)@bX?v2~Kc5mU{pZC7ntKVm{@3Vbg`#R_M%^#6JHs2?Ib^f>c`u(x{FYaG*ApgMW z1NRO*KJfIwivw;4#~z$?(D&fXgYynX9o%(r&>{Cj(+({^wEj@^;gyHiA0B#S;gJrZ3pN&{7wj%LSa7!BYQfQCg~zrXzj*xn$-iU$wk$d%ex|F4xyw-*|oN^}OrvROa4z_vXNxAK(1!=ER$^H`QCiZ%w|n z?ADrF>u-&@z3sMr)wH|mcX!|Y{chiCV@-IC#r@v*S3Ve6yQH?P_UXeH4_kbD^4rWu zdmlY`{O9AMUT|-`#SNf;THNr4v&t4ldGH35#iTG8ZdrEzPJw=*^N$Mj3#-3^Z)jT{ z+NDCjVCbnK8p~e$v_xw;?6Q`aSgH~9TZPbm`5lRL5hY!eLsQIoX;1jFret`*Tb z|GoS%jKug)CNLqvpI&bV=lb{$hE#8Ua2NU;{ePA3T=B*d{GopDhm(FVDu=O_89a@k zy41;GlJfA`vKbnjppTqM7JYPaAzk+8B zJY(S*2hZ2=jEBbqo(b@L1J6WwCc)!FrjV)d_`(xF{Nc+c)1j{jA#>oF3r{FK^T;gt z!bvPy4$le_M^?hK8v4F9B%Z7zYsm)aSCZh_2y_!X$?&9-Eo3W6gRh~a!-x~^?SxtF zQFsdAxkYZ0+wfGua|fQg@Z5u^8lD<>?!)uw|1kD0aFS(po#&0nuI{du#z*5c0zHkQ z2tLYs^i$l?$jr#Bpz=jVWLFo0VPr&PW^~0PiAQB+qw;=sDY5GsEj*}fPmT} zEUPmj4!WzZ;*7fE$m(cQDwbHQ$b5hQ|2g;G$gJkG^{JC_UiaMd_@Dp#oSS?m`K#oA zB%e(lPd=CYU2-}3d#KbuCjXrLQ}V^+U!Ye>;hMrs;RxZn!nK9#2{%B)o?N)G@HK^- z3r{0Fop4Lx8HHySZY_LW;cE-eB78&P>kH2&Jg4xDg>Nc67g~2);qJm+h36H%y)auS z73K)@gfijzg-YQJVWqGHHC!s(Q`jh+C7gpYzL48Ts=_M^uO_^<@S4Kw2z&{m@J9YV zSa_iDgZzDK;VsbJw-nx9c&PBB{Jw+mFyWnqA0zxY;U^1^6n={E?+WiO{7m7e3qMPE z58=IqN1@ffQ26D-FBKl+@2~Lt5yGz$KFZ&Z@%z6MK2G>gh5uOi4Z%) z{-N-Xg?}h;yKw@l^5d;$6k(6~DbWTPzjl2=m47Dy|k+ife=y z@OPcxD&f1~OkP}kQL$e9p5pfs8vNblw@GLhTg5HHHlb78DV{IhSKKWQiZ6ka85c*z z31P2zp}1eXSp2@?ON%dqzj=A_`-`tEzM}XleqU33b@8=?*Aag`;SGd05`M7wVDX0t z|F-z1;tvzvOn6K2M~ZJHyp8Y>;q8PUCA@?1FyWp2{V~Fi6Mq-sCkQ`Td<0(Vk>b1g z`|k)pP5fsFKg-|u@cZ84qs5;myr1v^!Y>d$RQzD^!-QYt?=KgBsrVS-SNQu8et(s} zALaMg;mm%c_@9cOAp9oblZ4+Q{9f^Q;n#k*_+N^DRQwb8wm&8OS@FLW|2yH&37>| zedfDnzH?@FrZh7@GY2nOo>}B?W#;tE^32lAch9_V=0$}1%=gT+XIe9_pLyNPgEJ4z zym{t_XMTk6)|t1=JT&vRnID^Z=gf~2-bMHc{{HOD&%lSiXXfV!kIwvunfDTYp71_` zD8UWMuLnx;q%`&wiB1oSDttxqiBS5Kv~(-ECeWyzG_VH1^sw_WCsTU>f_OH1^Ik z_Ty>n5qpPb=#e9_&*N)j4=$v!i)rkY*T#CUPGhgVHjeG}Y3yA`W1qkBhS=wu(%4t0 zv9C#EPfufCo5sHX#`v~pJvp}Wmrss)pG#w(Ph;Qsm9eyXbL_#nH1?Be>@RPQ^$Jh@ z?Vl2CCdt{S=?Tro*{6N-eU_D+OY_d9c@L#|52blu^NiTuOP?9v`yZbf=Vk6WvG;FE zV?Uh6ek6^(HH|&%ScJ82NMo-%7F&Kp8hgNE>hlA~VxNB`Eq!Ymdnm2gf9@TD}26nl+a5~wQnw*YCoND3*lD6QNk(0i;jG7=W_Dc&K1HJ z2oD!db)K8t*ZJkbCp!Ddm*4kz;m_}T>NEa|@VA7|lm2`QJwWSo*6yR-V&O#ZxyhS) z4-_BkJzRLS`#HkLiC;@?>f@-fA7bS zp4z)qSh{$raR0@xxZxcad&&J5Zz29wH{8_vzh`c0{UPBgH(cERBYvMo9^<9{sl5k^ zr}nNSAHM$!gkEyTOD`uce(9NO-qd4`$ba!mznggdnls(a zularcD|^ZFU-@6J`Ri94wY*zj)k`|BI#uYr>Jp*HdVK}`dYC>x_sI9Z`bzS4b*~`^f`8{MKvV@#Y^TJkA>5N_f$cZ+XSu%pbqycdq^8 zw_GY5ee11+Ub6VsQ-#I1ej#bRt(Pc&=WUk?fBcsH3Q16Q6&pouCtUvVmYk&8l zE7u-$9kuLqo2KQ_kp8@8{gGSZhY6ri;s4%BwLT%`?OzumPsQ62GVD-xsL!ylWqSWN+s2M;^NF@khSpn#UjMDI`DplcnoF_wq}ud-eLc zpJE(@&%ONP#m67{T;U&ns&V~|?`~fIXt#0wSHJrb>GRhwzk71c^1FM<(YIbn?s@mK zzw*)U0rRhW@KWJ*4_+q!@j{Py@4=gS|I-O?pf3*>ZvN>v9AST7^9?_9 z6j&)19{QQTN&fL?_mf-RbE$Cch5h7Z?`d3n?S(fSdF(xp7e4czk6r)y)~&$G8;+d$ z{wv9qpSw)xUGrG)QsKt`@Gt?Gc=YLorAIFnj=y*N=<)Y<2)*R^dmkpfc;pMOx&N7e z``#FtY@~!XdB`+e}_dYa+FS}Iu%l9oFDZK1d;YIH|Rk-hcw-PQV zpLqXo9sR`nKSj8u@SPv%C2#-0slwa&{p<%WQST^qddZuA;cEp%gK75qA_dIR+-B*%}zjUc^ z^0CYOK3@3Z1B*wrcmMUTe1SfnDimqA_@O4_d>(z7ux7Vj`{|D~umAK%K3DkkM_ziv zr$2Hlzpp*^X!rF5aMOd26JCGpp$Ff1?7Khu#$&CI-t)BY{^-3=YkjnreEg%Gqr!1Z zAL|_bIO#Wk>{8+5AH7Wa;li6gc7@+wa@~g?C+`aH{sMFPICD@ey!-$7)X^J$?Q(L% zuPq+A;n%M4+e_Z|YnKXd`?Zf3Ki|6L%Rc>)V&V0_ekJ+x-?&V;lKd0l`cFJS*=2s8 zcEj!ig(p4un=^!`-0-&FJi_ndlWuC=Y;*o)zxBLpzwEdE*C&1A{kJlYmwD%>juu|_ zh9iIWsr}^gr@(o?y*Kk6zkO@rj^BR&kuS3MU-f@oe$wY#oui*`Z4*9E{0iZp2)%1Q z`+IvcpZ&duuKVoo-F)M}|NUO_?|=Umes8|a>o z|M?FtC-?s0!-ap`yu$C}{J!DHF7K%S(UZUJ(e6>!0+@W)m8AG5doy2r;9H;kX!o_p zZfd=r@Wx}m${t*P!_$G|TL^#mbfy41C?b!tc|0Zf~aep<7wIE6I`1Tq->I zGmA$wr$;{1OMc@s51w3p_br9r_{=@*?aRsRUtA#+k`JJ3`T%ybXW(M}Ern}|Uq|4) z51O10pvxH-zlv}Z;VFc#Cj2YH&B>F{=NvD54e_TDo{l}>76RXoz2;VKRd^=xuf=xu zb%bXnj}*S1@NDAWNSn_gd>hXm=eZMvlY~=*+X%N4?jYPrxQj2!ekZ3Zzl%^p|36FK z9ATbNCM*yZ38!hR!te8wzn?inSRyR*j+Nw3kE{~bc<&1c>x3%#HNpnr9>Q6|y@Yd| z34I}Lyom5(!uJsBgzqIZ==&z2Nxc@KP1quA6Ltt4!hMAEgl@8Pw1-uypB%q&Kzf(( z62g!$O8)doV@|(Kh+iP^?>m+Utx322Z<3Y8&iGiX+f7QFo5S{nPGj6|t#01eZjLK0 zE95IG`)NjLwBK*8?zV@Gafh$7c+zSw4H~WX@CB3hr2V}o@&(n-{q2}N+ZeUi+q;8N zXFM40&rUjBo=L8n`@JWVxj}!cvz=7w3ol!13`gxDZCA&`PJes7t@kCf-NB}wZ-vTp zgI=#QjxBp8e@Ej+e>_r)X>8aIkJP7LP`~}|q%;{1=GK=Ml7&vU%|x}6dW_ZYx+|Bs z`_5eA#PK`wsS~&7QzviBr%s*9r|!5dsSVrha(_JBw^wE<7N^p0wJ#?13M1QX4BNx{ ziIXQ2uY20(fJ)s?|9tk8Ju=_f+Ol@(`k0xrg;t%tM)&-&kXh<>W30cgCqim%IM^Px zM+P*Hq4-9Bx83fxTgjUJ)Ee6%wle4|5xY>GY&N@%(P+7`3#8O5bhSZG z>L>0#9_#dhBF)FbVAyMnE#?#CZ8#h!)n239^_=iv0J!?qVZMIy&Xam$t~3Sw`l;J* zqs&_adfNyG)_#buwTGiYztU>=#~OH*4mY;jiu#&s1WKjTM0~y7Z}hCr#%_xhp?oyy zj@cZ8A>e91_1o?O>O6Y;ZO7Hb*Htnx#SWd~&AkkgngXLX}e&?PRvJUarq+6_aXdAx4+W>x-3@ z#ZVAa>*ea|(mmz*kUe+0yuN;}zE+t#lhr+tdEk-t@@%P^RZf#>#CuX&TU$C8-jWun z7qNe7W@V*TUN6nnD)+>q*-EucI_9^r0iaq7jV3F>`%dH)&Q_>0fAcJ1u*w zu=wau5q(%;hiCcErz@2{ySLxyX1OZ^Fmrp?5LrK;tyc5tWw1F|CCfTH9EgfWVr+Xa zD-|sW3v5F+YH|=5?qKf<4b3y#Mx$%{yX{0(ojy62yqa;Memw(Yh0 zBiI;;ChRqatt?}<(L6t$Q*FOw((X4wxQ#vStf?sgPv=4MWK!+)I^71n-gh!y6TMu3 zEM_yERmo2#Ek#(*H+kYX+{xx>JY>5Is3U=!rtayZX>n}Ju*ubPLHw~+1nM-ymopao zZps*vyG|yh-ezZeGMJ2<$YrB5;E8($4rVav=fKh-ENq7Cp}E0uIN2Q^Y|DC4z6fmO zwhOyLICHcz7^h&7wN&XhX$#==wgh1LLO3guTsEaH1`kJ+RaOaUAUF z>SVmSwcPH3krP#Iw??!3<92B{Z0s)q662WbiRI2{1ZqFn%F1A_3#;7Uo@Keuw{y5< zWpH*dbcQd*O#ZZn!xLHm)_C;L1S^x5!v8dPva0Lt3uoaCr!qPtSnuk7f84m3U>(7GCL^#er3(!<0f3)t!71GntXfSp2tJcn&jK&`2M-mAUz-|mu7*nr zVRo~ZZ}fY@_AR3a>HKA=&{&@wTViRDkV9)=hP={LR>~jc*(0wPi%vrnyX_<<4bMRy zMpKREGGfI<=-fB?Lf@7xMFUpC^Fj&jp`}C;L_C(YzU=G8;b5{mT`#~f^ea5LE*6gs zziqfsFrF;61?#aUs5DD#>>>lklCwK7m80E8QzX}(Tp^`;x6v2_Ua zk2puqTW1jl=Rm%eJ(Z|z_hD*RB!?L~@pNLN3*^JI){$rvqp2BTuqQ0fOXhYa{qwez zBG=AwT5%>1SkfD2)pJ6`sXM(5;0i`{d*4&TMBG&SY-8UZ6n8xubT70+${S|~Ooqt5 z4LE&Cu=YIDB)Zs2LS(w3SSzg_+D+3?j@@p%wm0C_l|D$b4ZE(N@a9Ei<3`takn`R) z87tjUva(cVV10n2VAch(3C+1xQV^*w(6Mbko=G5;z9>h4KFlY)cXh8ek znRJJ&bqDZZh|x&Ts1>aL;JRJ1qfppd-9z$0YGm;)I2udqNnTbqZx`lPYlou1N&2An ztf#$NNN3OGGL{;BiEf5>U1^dwV>*){P)=vo?>>I=2@3G7&%x`-+hB_6u5h(Qz%29$ zHG+whi<0&%7Fi13n&+9ATxtQJ*HEN`L8P<4X#=w&^gvAZ zjtV+~PNSP;AkMNO!V6*98~bUh+;3&|7Agy?X~{z8;zqwCHW=GeF!aM~`P~DEbN!+q3@d`JKr*Uu(15gK@xVqk3dwYc zAsrglOF|BPAC9vLs10@p>QRbJ7DI}R}7B^BAuV3?H!#2#>R>~F}ewi`pR1w$pD7_8fDFB?8ZBnb2uO?l06(dUmpfoEEPywKN!vLWz^4q$G7-pUo4Pi8P&YFo~i2pvQ%6hXEEViWW_bWTxNMTl3merE{%- zaHW9_%!vS37^8jyS$n!>R8kl-EatM^VndG`0h3C5N}tif-7bNA+yD%u1T%1s^Q6a; zdak&B^5m%`*W%foL7XEt9qS*)G0krx)I-Gl#Rp1|2A`m)e)}o!7?dM7LH(_P_tEH~ zM9x4jY6I(SuDvYhyr#z0yONFL&`-cgAQtRS;5jt-`YA>iRyjMgtuZDWrS(5dY15I$f9xjEywhZ77OU@g`M57=X1FZm0H@+ zGez@z#Fi$2kFzxhk@XX|AJ4Dg?Eqf}{U}J-XzP=HUjiqrB`lCpXt;&uC~jY=sRDqz z1fVxVnAUb=h48FQMQUC4d6;YTv2B1wL`2;pl^B<#bh>#YoYUG=UapUKU>aI(j~nRi z8`4+7V+>R1$O${^ur9e|Y~H&kEHm{2W%!IL+gLuyfSOuKI%#IEbE~G)9AV*Wsn}6f z0`>E^ih~z5B_mh7I?N>?@H?Sa7Bz7b)mMKTMCgg!=ug~roOK=VR3U$zi{atw`Oa=s zX@o4%B`jk$?=7(#?LJFr?CPOB*&>}vRa&;g7Z7jOhMfz{34(sfl#}(7w_y(PWo0uR zPficIfHRn3p;}*Ctyb<$BlYJuE;MeRPTrv;;0!MpBlWrc?Y&O_DzCa7KK#)8@4gE( z>$=S)bgzc!0~AWJyRE67OhI22ySUjAKM_mjt7F6cXTVjWqKcK~nZewvD>%FR1Rr zEA$X|g)i#)R2}BQtf@J^qkb2*(nHgA@^)$-&Xu*ajUsV~bm1(NlYGFYEj7umOCmYU ziB@AIY|xs*Eh#xTR#{ETgKoODJNGk;{Ntu|mqJo}=@9;_G3+@QnWgwlr`wI$zBdCy z88DY4zPZ8fet4(`s>twqqE-hJbo(i)k6BawMeM;yn5zVlNS~csj`&TGP_x9E+h^#G`G64uvD4LS3Con!kVNN!W*q~A-*;l z?c}1lVZg&0jmw%_Z#UbW3#rvB06}8SNn1ntVA%3BX2K>Gq(tqNi|g8~H8eTcVI-jEl*+L`2N!D@!+56z7a0rWRdT?V zb@Fx$r>W3azvH&Mp*)y**xETGKzxH{AvbF8RBSzhRXPt|oUL%s$fdq0o(|aJ^mx3R zKAEfyMu?)eOs59}yTS@J59g&ALFTz*iSa6}!?zZ3!r1sPxVzH(-&GdF0n@2+nLZrMt*eQvWS>CN z^*&bH!wVg3rw0J-jysc3!lts#IaR%W;x_!H4rGbL3cTFOyY5cor%s__u=$wlcHkI= zP5V{bt=8~iegYq^)9kWro#ClUaQRmQhdXhpXzm_dUa}4>P&(t<%~xya1g3^efK4o+)2!Hz(r=bJlK7J%M-x(hQ&- z9}|%U%)2o?Kk4=M@4fx_-L>IlG+u7>(RU54x4{&fO{%F%t~TVm?+{Zgg;v+<92`o0 zt+U(C6I0MjZt3x)!*Fx{s*g^!dtfFa?3}s-Ha|9SpblVD1^vNx1+Y(^KQhh$NIFn3 z-`;94VTYd}Ck2LVHUKdSt~MR!v32mh^%JLVV;72<3Gc;zJdROXIyh-$9T-d6iR#u9 zKqLZ@%2MFUiEJlD4F{}Je_TZfVFPhpfvaN z$g=9jEF8+k;p!@NPcXErWiuUD$v%1fF6qffxe3TpSr6!Fx}xNouhqc}OkDvkyxjFg z84qS^4Y3BU+NjDL7CZ$U*0QP&Oy0~I-YfByiU)3U4y7hKZ78U=h*w2Ioa}Dwj>b}W znjbCi#8+s#mgL~WIqr6wQ|zEXb!FOgT_G-M2T-W&3^0*n4H3W7Y08!jSw>qmmg|_= zm9r5!bC>7s$mtKp-oZI{-10YN4~5xrR6N0S25LA|3T>9&CCf+jGKnh3M~a>4GAXV7 zgYGPP`jDuGKhAKtzt$0}?K5lG8RIW9J)2T)6j&lK(C6M^TAI|^%6br(xy;hdqRHzN zvmBBRg*wSPaFawaLgE-O!$S14`G;79NfEBr{|UkKm;)ApT&K zNne)cNtvM*(-vX_SE-BjVif(pvSRDE@j{Vxm?ocS2bmmfEt1z<1+26jTirh=SGv&X z4<`7ITh*Kyl?}YqxPL!abE)0fI$ZB0I_5!N)yn3|t(d)C>JueQ10$|^Q@buKr7NeH z`?ieFDhWGk^-SxS&Jw%5%8T6a z8&&XuDGzipnrd?I2~-X&ma4<>+rk4TEU-{)FmGy4p2dYxHa=z=5{@Fmu#*V~#>M2) z89R=rs#vQWgYG$X*x*db!^9eU4|RYKk5YHcRb4GmOj9c`a!jb(bD5nS2FXgxrcKWk z(MCI6I!hRKFuQgzw=D0c)8R8zNu4azzgTFhMDbOTolzW|VcG^~{#^LtaLM8-6TUdWJ7LzY@^Z-e0hEi<{9F(JhDLb*lA|EJP2l#mh`o%hHu zmbMe*KIcxY`mxKJrCd>t-@IEgr>tYKD$6jyOE z%Z-cn0PO}cAhS)D0)3rdz|k#_LxAzCxaHOcgPh-Ng|l7FoZIOE9hYP3X)RZpm+k9- z&{Mrkl>W52+e32@%XqSEOFJI*hc#OmIfwhf*ME>pM6T2H6P^GtOrz?{$f<^)y8;wO zj%f~M2?s|z%Avx;EqJ#|ySv@}2#uBq+u63oRH^0U=yXQgPvR?QrSMK5fY@BV!YLh! zm_|5`dVIIri?S&+4B+KiW>6Tg>gU=h?ea$ubbi4c<_&n`>PW7XI31Y=snqFP5cR;! zX1WtYJ%UoAh{t9Jz>09@NC;{ZZ%2>&Fz1H@bS4p*3Yi22Yv#zEbA7hcHLP1yw7+Bm z!a2k)FU}dU)p~=AWKRwg7C4TeR4_6wH%iNv<;guYv#E8PF;vbD*~Q~>y%GBMZfBEo zK(d|%Av*~&klKN8RxoBk*_Glv=`3eU%l%0&Unx9(Yz|G0Pv7X6;Syw`RGy-xdy*#RuE9J{HVg8|``yZ}@R96>eq41-%`HG7~m z+@AChL$aK(Mya7AUvf2{Ro-7SSIQcL#*1NzOWEQ!3onmJAcxxGgM=#s9-G2{k@3rq zzdG2G4jQWiHUXZWwnraSDylnnDhnEsv&Y6R$YOO;N8s*hbSDS}s3=Y*+8O~uy;J$u z&n1VnY*Q+?gF3RL5=OmJ#qTbYvMRiEbAXezZ9g2w;V{CYM3&2%nx2mgkQf;7XIm2M zE4{udopA6y=2O6C4U=Kpf));Kh7nG?jqW}0Bk&v>mHDJH;t1%%aL{vs)S{7xw8ZK5 z#ZW|SgTY{wU)EW-erFRn9wmDxlD(73-l=5owq)=25l5GsvOYQzP$HEk?jD%>! zpd__H+B|dyw**H)+{#BivzEwVFIjAlrFoi@CwdtafhAoPgq>(2^eDU`*Lv1~)ua_` zExe;P5W*UcM-mLoQ7~AwWigiOX^%EJPdiJ=0(`0---XxJdt|ATBI-H#hx3>qw7^n~i6nB{wor0onP?{*3&Ze~Q$}qW0 zn+~e6qm0yP(W^%H7o5seiu(qCgj;p;8A>*)GDB>OMe>FQ zb}ll$YCma2N6P6I)rXD_UE2#$XV^iT1ZzhZV2+Qg)@B1I)E=sD)8ZseH(r2Y=s$l$ z|A|e%U|$CypI`#MRGD5$W3zf|Wn@1jm(%xGMp>MKbW(_C6KF)af1$(aKjB%!c0o?gAcq+~;y;Af%p`+xz4*kRjCR)_hwPImM4r%NIOVC(I~8$XUlJQll%No^FL zSRIP3OvISl%yzeuGo4wE@XbPiXOr^sTJ2oDT3eUiqqM$WI+t{z&+=8pw`n}++3DI8 zcaI?7ZPrdI7~|%aON*7cy0>yqX=$UJlt<0RZrjkagP#Go%pXe54sb+m7+f3e^*w|F z&K?-8I`p{%kKoW^LdXV{Qs){5wUGw~$Ku*-7C|l1lvV%(!Esw4JAbVf{CxIc+}YaS z*yZTE43;u;v0pj9qcw`x8hB32j~~$s&__T}`9#_)n-h(VX%T+|SrF9V)q|UZ#?5aW zH&GimzoAJ~b1-D~Hw;Mia|1^k(dB$lE=SN5>f-GWJ~J#Or0+~(o9?O`l5(XoYsA`y zl9Yy)rEy;>Tw_Zxm^xIK!DsV0QUt5#a0Bvj7ovVJ;b3riLrNuS+@PN)w&PlsYuxndRZ^RLxCO%tgJN_<2;=9Q+3irZIBU` z(C5&ztRJ!UQ4*Vz$4-Uw`Kz4XxAX3+D@n+kT`#T7oj#bmUS3|sKj=W+`O3n=p*$S! z4piHyme&vFEpqrDedmFiXIIzHEG(^_J(yqJm|b3--&i`-gT=XnRo6;$XAb6_DW9vC zmKIle#vvBR^^?wT&mUYDX&*6*_`XO8hUNLJk{Ln(kg>ls-PLpx8&K?$_u9|%bBZQ zI<3Elp2(HePAf6hv-$E;t;D#iIDnP7f#LA;;OlZ}xvnACiB?aqF3snAGHeX)w4OFd_)@y64TriO@UMtm3=hF@* z`5f#3YfSJ#=%}pBm+!p_)KFJXFmW3zmAM1ZxVFBrQZC=SRsoa46_v%6Qf)(< z{&Y!~fq<;6CLD@o0hGxyu9W}G!|d2)(u+&8y@Yyr&g?@-%>{x>@#t>gCFk z*sys3WUdBwELYQ}$V=lwP1^QZj|?0g9mGxsc#3VEOP?++(IIBITt84HzHVdX%*yK7 z6(2YosI;+EORB62ld=kdnLVf3)l85liX}8;8$VPI%V2{}=5alxYS>dTX`md6>fTIR zgFqXfyZ zJ888?TR}R5MM$4s6nk=@fyxMt>vR)TL&0OMn81?yc2iD7r8%w2iTlA!SZ+UK`R+@zjSsU^3_@r3U z*$!7B4Vq(4QzK=M64du?&ohzIH25x<2kD<7xy)xpq^$O)n(4#kZ`2m<3VdYJX-Ox1<6MHOnPpE8iUqdj)=i;>V7Lsoy4B%SISgJJrzWf?Is7HAD@cra z&c&^jr3OZpApG-iJ3;Hq3D~s0M$S9jdCZiMVk6C!%u*8g#hk;qf|$4+={O!W9E$9f znzHEG`nqgme?4u&3yd)gKjJm#w|Be+?tmJbIaDt4NozBK?bQi3IuOL0WF4`t(W-2% z;Ef3H%^^ovUvgz{bG?b%X-tK(D%V#|1vMMEZJ76)r$=!JC{R?+DWF)s+&JIXG2$)q zZR{>H*3+~GD<)a*Et}at+J*e}R#x5ZnhL_S9}=fu| zc7mwL*n9T3)xLmcVvtOLnQg*I*6h(v<3z$~v26z}&7vg1pvk5^R?Li+MkBPaEhH&gu8jQo6|OFENb+JYWyz zZtzT31!lo}LVP3bjGherkr+uboUg)6QsGDkswR8Qfga}Dkl7=Eht=0~Cx`_}Y2_TW zc3}Z6+_uDJF1!&UMYTVebX&7pa1QoK&1*gh%#~lw*OcWCSZVK?YHmCLwV;qR zYieF}7D=Gwt|Lumu}gE|ADUj22KEaoh<^Hj7dU5SuAI20FB$8cAJDHL_X&(DyWqdw zG54XMNwu9o+9KMHSXM1w;}Ic3ZB9dm76}`2e!^zv9Gcy*66$OJ+mm)PfctdG-$^S1 z(NE9o5)a6c)j)L`H03#)&M`Od=q47Kc{tJ3;I@wTo=sy53zA=y_`>q~D&*RKr1~;N z^b6a=0poGXGo{0K^k>8>6z9zg>XSc|geFXnYWLDAP+;%1HzE85w8}1Ru)@by|7r`}jTRH&6rKwD*>8xAsASkE^D);bH zX`x5gtc!br3S*#17P_4IFoy=)XPON`7wn8CMFV%%fQYY^Cq)n8@O0YUHlX*UCI25u zJZxWffO+kx37;GrpKQ@si1C&;n0N5xugayKIx{*vpQM*C zB{JG$Eg7Cq4fB>_$0qF_dRC@d>|e5n<|`TBzq++GV$lJ;wvl1|c_HpiZ0CXcT+Tm3 z`m7$~H`dF?LtC{0?#t%#9hhHdGW5j#^50x3pG}rl5kP|+6~87} zFcWb`RfCa%A0ygK8dOV8k(Q(Fz`|}ZkvqxAJ)U8b@wG6gQAn8iEip}0f+4QR4O4h8 zpG-@miY+aV8R1}~KctBUmgEmLKM35Q=yz@4y*8ns-`;aw>6X|5`jNfe8J;hhG;l8{>P!V_aGatG{Byzk1O!vl@Fx4rJV8G4_ zA84KYd^KKHzR1}=U0vMGZnvP;)v_xic6SqxFm|EQntZZ?AC^st4V>48q4SCZP3M!r z1_C8YN0x8YhUV{cI)@>{&`N@AUoX{a62i*!fH|r;os^X3Ud*>pr_Czw_M=N@<6MKjDc3g#>&Glg3wlpjrM`$oik@l(jj*4eH@ zq4hK;kWw{4r_(2tR@Z|U1=!x33@kBK*_qnaikUGQYYK=1t0{jGO%<`_aZ7bX(9P*x9xkdT1(9H7_8iylF=cX4x%* zP!JTi@MLwYua?YqMz$AnAe>I|s!I!TF6E`k2Ge~<@vd2*eaHPvnAX(f*=#g-xD9aE z_;3LOH({8d4vT45u>-N*R0as<8+|C#%yEFB&fK48wLvPlk#JRD-%i`@N}L4^`Xw2F z5hKqv8Ne!?Zu5*VpDnYH=(=aqU`b;mO_nr?Xs+#wXY{7|%bgD-vug1oW-w#8**QiM zyTm!mccVZot>-RoPSPuzHJEghD;~sz1`s^L9Yml-c8QH`!r**+)MT&NUBNPEW3)#0 z!oP#9l0cAB(gxs5%pglYo)Yf#48_Qc#F)%9%1Y|y{+7GftYM3Gyv|xQbTfh9(3VBR z^#mtkzLRPEN6Y#8rfxgAPf~Oczll#K4-R^T27euGaqaL`18Vw`G4 zx5@Bhr}0|Ghyk6@7(+n(nxe{usIuv?T*cvWS5LX*9#vH?=GtQ(HQ`rweXoHot>02! zE~(lfS>`y;upPSNmUM#|kD62=RkT~dtt3r(VQ1u4X_bks>NEl8m}ymVxlC5p($(^( zA7JlgjcX@PJ#VDg%=X@se7WbqM_Bn(-(u$UtISdCDt*i4Pd~uhtXWo8r)JfeaAIZy zLDgo8EPv*39q-=|BAsxJk$G=wzei6_S7T%;s+jH*#IDyN6<$RxH*r=v08^-{R<#Y- zLt6Dzhevk6CsD}=-s&cUes|yg1V=<Z;C+!9~&fKVV zb(1jM7i+9Fi_F;qD2%B~^n0ewDKPepZf1dQ%4a4i&+8D^@>D<3<>OG^$F)6 zl94nhj6moU>jvr{aYQ86#Qw1ArefhYo|s4=VB50v!CP}}aMOTo#Mk%aW*+1cVt==zS(%{k4XtR{f6h!*#mjWu$lA+?*7W|>a+Wh zz1>yKR9&9uHJ+X^2Q^em=n(Tv<5BD3;2#a^m86B6pW)Y@V&Gl=yCm z`@-N%q5v-3GA#z_!0NOyB4e3a^ml+e8 zD887T5f^I08ZmT`Y3HJ5BgA%7sGouaT7dbPIT{njd%we{Q47G-sKk3QOiLe-LvgL4_VySBZ8p)!lwQ?-GnTzE+$rXfy-!|n61 z*U~a#5(MWrmQ_n;s7ov)umIe0s0?Nx#7i+U zn>3QmWK&k564bR-^7yRcI0pkdUPO$?OKFakkz>COi&p5-S?o+(!V-R)u$0w$*nhcp zWe-A&t*N|TV>7QUm9RMZZHHr6`ettz%cMRof?(KfPLOKaPOin^s|Ojh&tat=s?cnW z93E$Uy2@wy9L{{nY5Y@H7uQS6us3EBm28!^DRQvKQ4Tzr{Tn65A0!u(Q6HPN&%+tb z!XGi+Y&uGWNjl<}*K6qN0ZdghE0k$aWmP!0 zjwB0iSe7oL)VgoNWiXvS#P1AjM;o4n_4LQ=@5zga|8jvoZ?N$%RMvITT=^`nIdXRj za*n*k4AH?ebpZmClich}o60F^VcBBxm9b8Xek-DE^^!X95c=o_oh#pqGZwl6^JS{a zS2Zz*Q{0)>aMZ$KNdhrsua&f9i5MDbbKK77@fznns%3LT;Y5u0c+!i(5cwpfMyt}o z=~TX<%4qdK(`;ff7ea{K){`T8@`G4!-#1{Q-ReBbV8e3u{e8ZLz!v%tkqEVW@|)f! zX3QclYs1;~-N0h*gwNVw*Fad>BSSw%{;ITNlrPtetAgYPlZZ9J4PG`Fe&mW;JzZIl z%iFy;ux;SL7#wb(>Gjo(8a`R|WjtS@Zd;%nGk|scuzsf{i(U!It|i@8_%T-l=2ZyF zYBS|&-0Jz@!+vtXRWsob?walZ?cO|29(2_z@;h6paVIEFZ|!pWIz*!Ga7OP zu*K(S*gy#17u{^B6+}0@C+M>YWyXnWyQs*oC78-WX%sC(0&ufjrmbk@QMFWuO=Fxx za()D4bE3e`VDJ{bU9%owY}nLnB-FBB_ZIUk+bI@Bv!F`sG4sTef1LdG=45)nk|5tb zw?dTX&Qv#+@sV^nWDX3+?hBus=;B;p?QnfC`$n>eKojM^6f2{6uv1)%O}J^(@WpU_ z%yd>qz7Wn=WnY`KA!_e}C!wZnk;z!58@c&#CK2~6Gikao*FYNvsGGNmlan;9>EUS~ zqER`{Q3cD5`bvX>5ErIoAodtbXOYxxA&gMRwZP}Kftz%xX1aFMhX8?7H)QY{*QAEw ziqK{QbY7s^o3zLct*5M^jFfI2zaQ&<2d@|VsEdIdmnQ6VK*GCh-C$Z(6e4D3aNDk~ zW>Ivm0UYV;7=eLF)8Q%_gVls@9_eJ8Y55rj9PBnqew%^3?s7UKts+1$1d-<8!!ezq zuE?I?o-o#qvV!TIX-u=67&|UUZdNUAZTY6S5uz0y(#yDA!VT5Vs30Pa^I8YbHJ5=Y zZG;{*Ewm4Fz}APHA{6=;jx1Mzll8@Mo7u#Dex|3wQt32UDo#NZG7%u1{byox5t(X#tngKK3;8a zo9;(ucwL_9Zjl^=HTTGq;rCRsR>y^X8JCCpa{R?3ous+OtOZYJoPO5o3rq4055HV+ zBqweoPBLMDq`CV?VrTVCWi2}c0-7)5@joA)HeYdkp51Ajh}@a2f(U{~N>$K)xz3q5 zUhC%y>MP|kjU;^(NxJ|7Ze9cX6Lw#R0pqmMA$lWj=vSbDAk3rzTHtKi# zCYTk)4XY>9t*m#XiAAuz1R`W^SyBWjQ)xXZ4>G{X^+45 zPl~6~h4C_RhrSzClUri&5{F|pkMLU6@TEyCe1gf=fzHBCCipl9krJcm|VZaI_btsiBaxxWUn@;GNX6UH2bMm zc@TS>Ywed9K9*$X7IRRJUz=kHD%ESmFOsUdSIid~HsIXa5R-bqU< z^q#&oUy#OE`?*IArl7M@THs^d-t&kQ#mKMv!k%f8;E26|y`v(0q|74;b{3~(6F%*n zvfQxz=xJPGl#^b=mPrq%i@&3HS`JV;;hd`VK?8@mwN=69(*Vio>LocmGA+*PSYNUy z!|`o>2v8gZgl}Y;9fU^Vv2a6)55RM#KEdZ3+ILlLV56R8NwTl}g$)&f(57WbAN?y2 zLa(;u>gpqMSV3cH69}!GvG(CNSvqzldA-3^R zdM||}1nDHuQCkE!)kgv)Wd$E>P*g3P-kDGQ6c4BGP9yTr4bWAM702UK#@arJ#VkFo z&d`2)K1>6USO#NdWxUB;vfawdeRZl!p*w-NUz#XjL;$BhsA+;52<#GSn)0H_raDfAT}4L*q=_Wru9l83d8avEIx`wm&NnhSf#$|1 zGb$W&tZki#*Ff~^4VmYRF}qg59Qvr>I#K0={bdBRDzs`X;FedyofSogjkF%d3gqb! zCi!;sXuKCpLqhd3aZ1fDqN&&XRj?M#gccb|7#z>Iat= zm@+YHz+U*Wc26^z(@Yvx0AAfJw}E9*iu^u)DAd#Tk*H3&T(Iq;hA~6;w6kUoj)t`D z8Fw_WXk?>|dcsZkiGN*ZfCyneLul;~!UVw*Bz!sypr?}4GB)Lr-SUYcL$X6|Zd676 zkJCe1{Czq@O2D=7Vn*Vwb0|c(T*8;h*=@YP{V2<`wvc5_yb|$!tUo*s3eF#(+4FCLlmV=2u8`l?Rl6RWKzLEkHjTZqcTJVdQ#h*KBzQ{il2CAa9DAUu$#PB~vorz`^F*4#1H z$C2WeE9c!7B0~$i*@#&#hZ%7JH05Ed<~wHF0gq{SIA!1ILD3PYuowl+w$$3TePANO zi_u0zApvq|*MaZ`z1x^1>x7sTGP1P-eq= zN;(X)YPRF7Fw+d#zidmK5oeEjI(wS55+az^h;<+=iN$9Jt$pzAF8G{CUF`s8nb5|7Dl3QT4RD9I+>4Xket=4=DmB#Pc$w7O3EsAQ@5J>8hLY1fnY`t!giMq)VDDl=>yk9%nwU4kJd zMc_@G|IV~Du!YX(Rs-{43XM*GzKzuzJEDE1)SHBR501Tjs2e{5(=J%lv=ZK9d)!{C z#}%PFFb)odS=#STgZgKhUw5_gvoMR1_`|cLIa=x{;8MYS$zvMyx3nP8@NfSbY@2|} zv7oS_OeraKO}my1DT^ove*<{T7_n@o zRsdpF6uXLHms6;rHHjdp$^vQArzc+Q$}OhjWBPQn&*`zWOJAbGTGn`aLF~bH;t-yw z84V;qIbW)t50U+Wgl`|y&UaW7@g*yyQ}#r!NT>3ND*XTH=a=k)tr#~S=yD%3PlmWI z!BO{oN#qpQ%>bZYl@Wy1h*8fCui^dVhXf^B*{mp+lDALVBYP@MxudFi zQ+w2;2ah^F2*QKhF+JO8k^8p}r3wo8+N39sTN`W{1XG@}h#s;C+zOzuXE1F*X|Zqu z+2U~xf^RB3L}MTIa=J1|7#g^SfU-rxIPQ_ghydMk7EBZIs?D=(E16Jbn2GYbLtq$U zMq*6F1~_!2wW~i{9ll={8ESB+d=tQs{Li1k6d}TrcBX^gsLB@<&?DIQ5M*5eCaZG^ zcL(7M;xH?_MwYVr0$!^#4dpr(-`3EL9d_>~_k}S1-U~L$8=OElr#Q=|TaK!*Gr>`9 z!rTEpKG}V)W6hF&cx1C}JHT{(cocB)A!}pXnM3hy-`G}YD937e412yUJ+7=!YCiWu z#Q$^!^@YlQO7eUm~8ku2Fx<~P*8DO{zVF=MJrqVwwA-k-{5E^CoPBwKgU3ZrV zAA37aHf+<%DZw-0-fX{`>||;UL-<*m7#Ei= z4Gp2$uHitp7cD%-znd5VZDMonB74XM8B*0xtWdX|;)giiYeT4YY^p1w!*m34qC{W5 zyrOP+cAOV&w_6<&Ae{44bL(?li##`M>WjrRua59g03{C0*mtzD71@eKE5s(lX6*atK@+0uo1X_^^IZ%8KNt-EINW7?62+sK$ccD6oPIDwXi z=uii1J$GQ7QraaQqHZzIHoUD5YLqR3J1H9>iQ1z>b>xXqj~B9d zAA&MK3hxlzF&$1oGbpN)y=F3&PwYPEYi^m({>rgmk>EnBXnA!(6lL7N#H712)Sd~) zfDAfti#B_$P4E*xy3~T7CbnU#=+A&x$z)nF7PO26V`y z6|1%6Y`L;{x|WVp>nj$vR`R?3&T>&@S!eQf=_VgrLR~?tXWQllON?#SYxoHt4anL( z+mPC2+$gcX@jHPh0>aMXes4ERSdoo{8ESG2gN>XiS=h$P(9hWt&K=IKtd}>qS`+@I zQsvUQsD!4E<$26F*4^C20^y1QABMY%$k5}oOfmBw@uxf!if*6Kp1zJRhGLxlLqAG5eL==&@-k8O}kaF z51^#)@zhyPcAD+Mc={|Qwwpaw8dZ?4#InYOy*o?t?g3n@_e(>_Qn)wZsHdmx*Gj^| zdiBunY_a1MWI36Ogz-*lE9bJ|BIZ=ifg0BN4CX|~LG5<-D2+2cKDh?%G%%GCVos_X z3k!Vqo|;$+&KoL1k1h>d7c98L-dN(-kYN6h2Rgz&7mMJ;?O*!Z8tLQ}R1B(^W?GAb zp{turn>pv+X<#84k|H%#Jx!)udEo6JVO#MFb7^*b5!Dv#l-F55NvryftrDglM>2!~ z+7;vB%`$?6ZE9Mqr&I1LX>Qv8yfBhx>J~db9*!)lGwJox>@2KCxZBngX?V(-J5+{P zMPag3dgpxZDmao?Vj3RdepCN0eYUpFbBHpXO=Ib{bZK0p zWia8|ld~|@gFWWfbScuc!ps1X|Y`or5YEeyT}e0 z4kx>*V4$q9IM$sIw;nMFyPxfhz=;B%CD%A*3_r9a5CXY*g~?E7wLXT!l$eT$wekM4 zSz^>Y0@AARxGD9k742U>08jAR^5mSt>Q?JHA#kUqfCzR?2)Vkj^y@Bz&2 z-qq0rNL@4~aq4v1*(OhWK1N$Y|LB|oYanI$PHPBjVZ>4ee)$%FWD&tBAczP3>YPog zu>p77mYY^*4Ac{6kHMN2srsiS!MuZh5P98m8VZK$Xfnifurkpdjm&Q+c-U6v@2#Jn zU)S}=g2FIrVl6r9IfEnzwl3qu@wM#{oL7@dwZ6)?#TQB|oPLmmff~)!#D4l^3q|`R z++ZeT7Hu+c^6&@z9fXl3ZkzDa{!4m|TG#L$ePNT*(T)LXXMHfpGw%uJM8AY~YRB33 zG<0AwHDr;6MxT0qrJ7~Ljo`|5=^J$KTif)UT(Hai#&x=>VS0kW+H(%)+5+L$7G^)h z9MXBpE5;GBRNTko10JPAAJJfcyhED5nn|h!Orxj?(!SQ*|Ap>7ew?Lg3dy@EH8HqQSKnICT-s`zcbV<$u5KQK@^EJaTfz(EqhU*r1^_<7oInxVl?C8) zAUia*ZvM-j7h9PhgzLkaAT4}+Y-VBbdv+n8NSx849bu_SAQd=!H(auv< z0uLmNTDptJlwf`va)OPe!B>%mK282e&ddfJf>|x=*{*G9vi!7Rnsh>KeM<9|mrH9- zFGZ2<-RT)c-%nFbLv62;%ec~9e>z|9aC^Cqrrr}| zUk%*kKOdAFARwm)wSk6`r#>T-M!eK`Ck`#w_&G|Po1{B2jG`RZr_}jMNXave#@y53tQEj%&i3N_lG&v*XtS*iA%pn! zhBAi`!8-1=WOY2ML>asL;F2L-PDRZ1 z0nV?3EJya8dw!Q=5pi5=M?uzC%&G)Ih66k7QTiCC$6jymF~E$Hk2z>0)g9a=Fut<& zHg@^0>98{}7aEOLN$hv^|f z*9Mu226d2s?f@Dn6_I}+AojEjFMTO zPvS=NCGLXdNP?f4UJiG-??Tst7=hl~_3pvg*91MssCZ2njApybDSE3fekTa4j*4Zc zwu!ZYr;my`^*h6rZ{{Q@R*aGtK4W4k@~|)Ki{%yEhvmup{KkdGS?)|oSw3-?fg98( z7M(8~+09^*PHlcdW{{qZ#Yg&e&k$*++UQ;*sAJWu+0BaSK@k6x^ns+fbj%M?#pK8# z3jDkeTg<54-4e4mwhyvcj-6(obzg4HbW>`d495Tq5chy-jFlIsZb!mFJqDP;n#HY5 zNXFr2mT6n+?r?(dpQ}ZEP$tswNeA5vV|+_Xp8`kk7xLoJ^B5v_1$Z({V0a>ChKiww zhzYTUSo?4Z`V*aOr-J<=Kuiyaf&)46G|g29Np(MK^F*asWaBbY7x#*E@ZqyCvCDz& zvUzds4E6a);)#UAO5OPB1MO1WD@{f-aJNlnmr;b}G^N+t4io{lsO1r>X)ObWaQyKL z&yK-h&TML#6fpxN12WF^4%{gZXU7LZg|t%yU-b(vbt`2J|AVONFnG@NEJD`4HO(mG z;|=iY`PS-H@{M&AWac^&INmh@mrN8Ru^IlXf!EaHA@BL8caT_Won4V8|AIsYN{lvv zWrd4Ga??!}DGW`JI}c^r9tp7D(q#CYal4H=6W7v8xQQFj2Tri?^@&(u2^((MTmc8g zR4B4)E~{zNY2`u+w;z+vBof2X;#j98Bb6@V!Cav}&e7O|;ZqjjSwV%`8Q6jeO`2ej zH`u|c0BWZ8b{r1*Hj`mONZJ6dIw!F(Obf|cer94i%m7Jm`OvGf3if;|>uNh^6U70( zbX4d}!@d(1c1B3A%g<#be0sP#Jf9*N)Fu*4hJ!b7C=VE z1G!Un9qCu>(Nz6rDW_HPTFfVH$A{Ziy@t&m=R>)-PnUBBD$Zl_&eHJ%skspJp+=|* zbTY@R0(8*mk$5oGq=NO-5V_Tcc7<*SN+zK=DZgMtXR`Rz4@yKnU$S)A)w7Yan5-U+TA}s|GJ2tw+$T+S1tDyD)dmqu;WC z0=ULE1=*p4q3q!104&162D6VK?V?Fp9Wr!UFgOK{}Q+ zmBA&@@h%#7Q`GryVq@+m0;9#5xypdE!RAJkjVAVzq2zn0mG<+0TY`a3pMA1y>ZBH@ zDZ(8y3tnXRH+a9{Zq3XPx{sfnpA4E`V6IY|w_q!6WGn8~#$-IOZ~OYyS#eP~x8m8m z43-5!hdbV(|7s9(VlcaD!}w}(0?lr9TE%*;s_-6kNp=z2<$UZI$Jl%v?F)vu)A-ic ztB^3cFVCUww~JXU&bRyOcj+Uhs9xs6#y&M3+!mrv-2AGL+s1=aD3P@FJ-aFOg*;0~ zBQEP{=@1T}uTNaDt%YizpoDud@nw2~!W~wMqXX#8C-|W;O04+eORxG4|IUfNKN&Ed zTbQ6+T=h5MQz`Bixdj1gYhUxX4?AjnYK3o3#k!xQ_anCmE$7vZ%AWUIz zpo&bb6G0wKKm3P58m64v;&m27pHFL~-wcHIxlG?qpyESol)N;KA3TSn>?pDH{|-u$ z7Srm+`8(giaCFr(mbng}lR`Zn`i5t0Q=YO}4zI{1{A9>{r-5_{U%^Fm;ZkcT_7D=o zwLHiim3|eEZaiqsv=TqyzKgPSa{|&B43N8rX4t=A_e+EWCy2t*Kx_RWTss4ZH0{AE z#BqbUVw7DMqoUVdKWXl7?`mXBoRZj<E`1yrsdOo+Qw(lYI=$} z%%yJgggAeFs$u&^>%Knb9WP2-v8;OF4P4p?G0#e;uzAV#f0Ue(yf(RL>hBV)|gDmU_W_yU{r zKTMfTr#Z1H|Oi(am@x5qOeg+UOu46*~Je z($zR3ik4|@7<;8FQ+8Db$Y7cmrZ=YnMPkE>!}seYZYmd1)-(D=Ny9-W-sF+NZe1wE zzIfm{OLKI2X|M-}3@G@8X5oqx%Lv=gS=W4y&fr*@s}lH@2+TGOh1jZ}C3-%0i~{s# zatK*LC9fW(7!*oz8dTJWDG}9Z_b(Xnz|6sMpnY>85{eX6#j#o3_ms~vkIXsOCD_xW z`nB)D5%;t3IB3a@9e}s*(S<0*Dp2*bGwjihdwA*UndWLW5k<1TW#$CCStNMxA*jgM z?AKzrwpi%bF7lio_}BmZ#>>E*uf|eAnJ~DhXsBU!zv^B`NAm}1MUMCI(E37P<*kAY_0Q2H_R-NR#s(J|87!D@4nCxaer3|&{hPK?;kceps zAA#|kVQTGRkE8vPu-Roa=89{GLZd|zEoQ8Mj|cad<~@W=O=fpHz~8WQ`Pp_CN7nfvz|Qj#nL5V_uZ=rHGR1 z>A@CV^CzuedekHKH?5(4jP9A)r@N!1iY}caU~9?h8gAa4O02J)ohNyEl`DuncMaBz zs1=@GO)Jl@SMd7et`A&fDPHGbV@)~6&aF9Dx0Xl*uWzhZ^gTD+F=PNs^bu-(=8|JD ze6C(MSExeTKy_}-GD@>JmTrj63mGGzirp{_to;UOKAQ~~1^hFFcR(H}7?F~N*)UOB z*~&@S7476efb7mPXvfB|!#38DEtZ~5qur_{uwU&le-}9+MqcE?$uv%d-Kkj)zaWltFhG|XaOFQ=uS$Qi2Xa>{;jM%R{>GX>jhYh1>=W5r6F#oBDoqYoRdbty zK8gx2B9J%baM*O(V1Dy~N<=-OkcC$c<6)%1X7yl%Rf6N^i?@BI4z+p~h#e z#=P(*&tx^wMmwN7xvPIS zzGDMB93vPs4@G!dq z-oWVMx88#Nz(y5(IY$!uAcwG8J_Y#KjvCwTK(5mh?)fTNbD%jqEsYh*>;1Fv!p?cXpM3;0}bngl_a3NI@2b)L21axmHSN zbV^tO)@=nn`$jn=mX|?v$~T0}1%BoRrQfx6zM&vj7vg?D&Dz4fR9ohz8Sc>CSg}K* zVBocSj6rQH{baX!p1)xt!8zeGAfewuLnx!3dGyJ%SI5npT)ouik{4{>9sjzPq+0Nhk1=iIDjQ6J0&H;;M`V64&xsWnu9KUM1L5rGZ#pj$wrzUMiVNC zw+Df%)NsT6psgza>??6*sC3j0nsT>ceULY7C*g~T11wv1O* z_w{z-gin5(3!ulHMt8&{TN6M9h zkiACN3hbHieWb9vB(T6wn0JvMbV6Qt;BbWI@3-4R>~TD1871BZ@i(`^UKg@>pBkBC z1)yVoIeU6X`xCBisGhF(a)rwcv1_}9TuN@hJ^eO%e<0}hnHw1+WFz#b7~-+a^`_+? z2kH(vQJEp*XgApjKo`H*v))6RsnUfV6HiBI;Qj^O(CC7r%q;98Kx}B<)>e{JhQszxPjyH&LX*p;<+cX_1jsNtP*zv}9Y39BW7p$+3Bv zaE6vIa+tZ26Aov_GaQk0oPd;-*okE$A9jI$$cKE$hh4yn`h(kbffU#PHIM>XU;}hN z6vzT8&=x6>1+st_$O2omzu)tm^S*Od5@aBlCpLwmV@Y0z{s`9>pn(G{F4bnsT^psQO zX}hS?-iETK7Si)HRYd}Jz}#>W1(X-1fT{5d09}lp##?i0+`9sAa=pUhDAHl|qC&lh zbx3qoENlVVC<<3@U*aHKc(*ODgk2MC*z)>yI|~R>CXND5-%-wUO;DRFg0P&~y|fQ> zpFYZLK2%uocx1bV!U=~1I6!BOZ7B7aS>*!n=~apmt!(;qDgb@2bnir89Nd|aB0;q4 zc4~BD^yD}<(tfSbuB%ShmC2@;ko1vs4w&_#yG83ow(A|sJDXsd8$0%Xi4mC5kCm@U zrvIeVU%uN(_wJNRNp9npmO{Mq&h8AaDW_YpLWU@q{gPchhticiO=&D6bREz{RORs* z6#dvcxYVW;!3l^$obNJ!ULX9G6Y&u;%U8G{bm1=OB(A~1Qp$31M&%^8?x^g znv#-#F9loY!2sa&rt(BR(3}fVKJZTL(b%4R?LwX7W;OQK0=jjS(Sh~W8V+_`6OAA& z`g3zVzVgSXczx>yEUSiex&_e0bX-ut9-TWSK!~Y?^4a7OdM)QwqwdB82U&i4!(8Lb zJttRQcM}H~l1S=y*Lu23Tnh(;R5A-54pIRD>2^q^two~fsxJwnu0U-Do+Jc}56|TT zkekMtC};LX6lmfyGc+av6mZ1Uzww zE_!36jJBYr`>Gag`!sh6-{ysB$b!9NueVrpltc4zn4qurxw0%3aQDHh@=9hM8f;dU zez$F|Q0kz~iRV2-?6p@EHn6pJlwgZQMvIW(n!wXpeKS9MeWf%jE4G0p#wqVmRv-=5byJLax;ooTTcgGv z&_L}K_bJ5~_(h;iLXl`>9U_4tZ*6`d$TsbtZa>wQc-5c9csJ=z)gb@le&;;?lr411^yT*;~5lo<;K*?S(NBJir{oh8t?XSd|cDiaG}6u*vrXg5)>NV4 z6If>YQa5p3P&v<9C+*R~BCMi2F>pe5EiAxL{YfpIYtd0n>SDuSQ(GPvp~uSro6(D3 z(_ugQROAk(7v)I`Jn3|imknYOhC$`ocU`zc@d3;30}og88qcucp6B^eFS`ZNO$XLp zycLJn8{f9e5D%v_tLt9_?v_{DyK&-sV|hV=FwtD94Z*;;mAOlK)ZN4w)H(-@=Qo01 zZfCg8G=~3~8lKX9v8+HsXZ=z>4CxCd@HTjPy3j_Rr(Y9DV^`NCJ6!df@uYDG$T^&v zCmd0d5H-o`K?CryKta<_O1YQ)-;O*OaTt(kta!Y^R3&OT_K2mNMvUQCQ(2A&Tugus>h(*?w^sfO-W z@-tV)i3@30yrZ`js|CU48q?L^JQ0pW*%?%uW-YEo1gk*rHd>|6jb8QHv(iE5Qwbw; z)-SHZ<2xr=AiS~2rFMQ6CX$ur(-9fwk* zT%gh>K@kVdiVVBqwG|SZxUpYnWNjIrS}i>H#&R4+-~txjf=eGvhWqj)Jdh7v=Whdg zUAuKE=n6Z54PLu&dVEr8{B&jaJ#~RMlx|){D2VG(*I;^p7M-qARIu+gm~TYaEF_2x z>nFo4>lwQtNhjwwYDFsNW*71TlO-qsPFQrk;gIw+3L4zJChEkk&L{myq*-IB|8(Xg zv?Zy3P+$_nQ9#Faoo=tg;M6y7=#4HX_>&+_=~?DiOq1?L>&@5Z*O$4(XeG9kt|c)P z+)2&8u9ZP5VU3XhBE|M{%L66c1-_<)1Y#X_W9Edv%McFR>-hW4hSLkv9z+77hX>y( zH;r@Ki2(D!93W!okl0{WMz6{1CC4SYD#0^^#E={#aqco#pffx&;(m)OYfJS+t-Q22aAUPs(0SYZbE!+)sL0N-$EK zie@+&PdRtO(Vd+CvfLsf2zW z4mVIY_N9L0<#@Hun5^|`L}XWKy-V&wC1YD%4O~6@_3;UwF5uGBiSyo(6t!MqDldr$iLlE@F7$ z^!9SFm+YC94IURkg?9CJkND-|IJv7@V%ZX`Kw?nb^p(UFkZoE%zl1Et;lv^AHJ9>! zB-MOL{oAkpMNg40(~G1QF<)MW=@dgkZW1@D*YdnrZA|G*N;c_B7SX#(S%LMfkvW6V z5%HM}i_;qLuGn9s?(}p-^vI*cASCWht=%@CZ@|o^#v&)JOjoHr&}I5;OfG=mKw|NW z00AzHlT?lI7jDcgu3cRXel2+4V7k&%`{peaulNo_pQc5h-Y496MZA}o6(6Hz>P=sw z>o9TTzC1s-F&m1FmF3_UV3-0ukH+7Vi1o8b4Ws4vq-!c($GhD&BiIKXv%A*Fv z4|LJfoYy#d!9-Ut`tDsnBGE1Nvw2hzwn(2i4?OtDEu@Bbp4$t8{hXM>7bPA^sb6sw zupg(`!119$g?wRHArh#+CIH^x4*$5Y9Y!tA;^`_wSUGI<)>@`5k;KHf&=k?>L%lQz zGh^Cg7?T`A8TC%^2PdjeR1M4J66nycYoo=5@>L5J}pYWaQgM;{JAk6OS|r6q8pq-aVFYE zha%XJvm4$zc4;F;j{udp9|us1BO!&SJabd-vf)P=%(EgTA$26Y{v^hR6Gul1WZay- z6~}ED1KL06q$g|a1B_}Mri_Ol-u0}{q~~SBfruT%G0RAaV@GWo^A-U2;|K+7?S z_-ln7xX}#_V6lMyGM#Y>OK)JII-P>!q6oy}>l4$sR3OX76Es++V#F#wYdAW>sSu9C zsY8rz)rPDmY1WCwOR^zcTjzw@L0nui15@DsebdgtE z{gYX+2q2G?;-RX-OQ<+SSKOGJzeSZjT#z_fE}f}o`}dN9@nmw!A+?|Q+8GXTut!pCSJ5;b>UnASd|7oYgNeb@nx(cvY7L zVhze{mx$;i+Oq<2QlQ~_bj4+|k_4qA080j$M%lzMdn#nht=;NKl+)8D*ZIuMq~z3Z zs%<$APff5*z;YbuC#OZsXuR z-WqY!x4d+#oh<}Vj)1<;h1MJvny;JXDv$V(+vIRtgoTBEF}|-1l_Uc0BJKgH1!O~O z`L;Lu{hZ;oGww)6fsyV!r{NkP;MEMekjJ_E3|B9ehLk;-$&!KB4)GW&ce&>WQp6eP z$}R4F;lvtGVHFY+pQsms(Q6z8Ex1?JAy;*b;^8a$Wljr0itHI#$Ps$j@df5Q9{G!8 z(RoQM@t4-}c2J+zBWk{!*{z@01H2(CG-yp!(Y6=4V@>CS?kvKn&{h07=hkF&vcu(8 z7w=|Gn#(?z3E^g@92cJ%_4Gr!*@S2PGS+=_)cnAJdaJROh0V@8*+g=0%bnMDxy3W% zf&8_*85HlH^kpFfUF{i-pKSQe$g& zwQq@_gmJ?oEN&_f7^9o#A;Sl_hMMAgxK_$$N1_InW;jCfPZ`W+)%V8?{ZCST!LpkE zVy^(mo;$}#FxxkC%qLkADPf-#zBw@caVpT{mf}QKRjWR#Cyh1svaQ=do2@15a z+CD-Md{r^9#%&6U5A@&lj%sE?H09d$6>Zf^N!WqFh(P%T_2Kd|P8P4kw2Ob!|ZVPlB zA_@txwsYYsj~Jh9F2p@pN|m8~3G67{*V~b;Fo(}(cm!fVU~A-crQH56j;E&qpo;3q ztYOtqH4>-DJt!)EiJKz%4OmJ{yuz~zx4b}-XeZmnkZA$v{FL-V;PrIDa}xx_NK2^3 zM6=-)SdtkUt_9^IL!ALve|(ZU-m8|pbR%wi66c&=@yZ;KyGPchxr{_xQh?3^y;}{I zibfnNSctI&j$zcvZFNzJ6IsY){vsjPGmA0(JSwVjoR?qG8kIZ+$C#jLk*r>y3qx-1x8ycx$^Rdsg-ub*%$PROXSNBa9Eqny)sej zOx9Rmhk(=LV8A7r)3LJ`w7x`->PLD04Q(}dvO{RA21A6+G4xwAOLouA|1K&Gn74PC zn>_L;WkFS5Kg)0E;1_$B{4tBDL<)Lk-b#pd*g!@SQ3ni->6uv4yjm=D9e4^MKA}hC zg5yOf(QG^M#e=OfcS2#eDkTx_kOP{*wnCiaR~Meb6OYGL1wAI2h=M>{m#E8eUuod( zEpe^e5(fGhqMN#emem7*F`P~HPI86_?_@9-DX3CI10kV_Kxh=n(RnAZVvNs+6Ok#- zpXcd6PA+&`L>F=H(iQA(ZTjg^kL1_fZ;y?Ax%bI=fT?r6@2`!G_RC(;g*m;6bJ(}U z_?-nJSZ2&Ez9!|MJZ2>i<;K5^H$zbews?S{sKx5lKul;Jv%Ir`sIs+&+>C3XC=HB4 z%M;vHQ{RIvc9poJvZS#3>>D($k>4g!!kt{APZ^Da6u7)FE+wj(rFNuc^KDvwwrQGBib1EXr!eoaO)`5MlO_l! zzgdq?XD9K!=?x*&3K@}en_+Dh>Q9}wwnCf?id9Q_u=GTe8rr%|Z9}yuqm|%;+TMmK zq%46*zXU_we!i=-L|>l9>=RbQP-kN_-#5fTzNb?7(NytZq>Sj?`W-Zcj`va(EZv^(HY^i_D8xU!y$L2v^2 zirSttmoHu5X>*Jew^jsv7r12Q3p$qE+3o9GH3vqK_z(|&>kr@&F`=|<*_}mY0w(r4 zt@1;@po1B-D};Q#Jsw8lnq2N#>4kl}F*=Ek!V63wEJ;SGr)9c2dfJce@gc*}aik8f z8qL440)?k!atq@Jw;_|+MX0}xtODe4s(ReubwWge3hg)cH2*F zBb+W1{FPJ@Ogo+xT)BvLH%_5l9t$ljH_U1iCDWC9H~pEVJfC=Z9=E@Fwhpj*Eh6>Y z3@x>RHb3}RM1^UDWz5Bw6k_(4O^fZ%futFD(){5PXtviZ+l^6&DnB{T>m1MVnAmMN z4h}G-BQ?gAv8l;VPhCBA`D+vC89DH_DQ5KiS&o~{uHEJS6RM5hYE^>S2wV})K{KsE z%i)GF#K1bp%~{$MpNLp!*pxsOL03w7MCCQqR9mu53(`f$F^`y7!jvBEQusRAOKjbg zSiabdZ3Ld9?}FO_oIpiz#1~hXFqByHqc|4MT?$(Y8gUV1D3{~FNb1YCXkX zJULGXDcg^~w9rqvIn9-Plb;?9qd=|Z0g)V#pmB~!OyA@coQ;)@^6>m#(P^vK@o%)e?xe*FCX_0c~%J~YhoJ8!z0zvMJ znQ0F$RhQ|DD}pmZAlyX&dT0SkXXqzPE<0g~w`AuW#|%A9_Kxd*c#D;axqJ|qAZyMW zn85=MGq763rN34GgWVf+sKb}_{n>P7QVqZbDQMa`LlQlT^-&{NO$;;yuBSIO0;h|- zQTuH!B^G6@kNWOfT>V>fl|rWG(kS}F+vi8ADu;jy&IvLDyO!OT?POwj=3}$3adEkk zXH8KMg$V@Qq#YnldYH#x(rOCerlU&G_>wuIT2wNWF~GK;EoNf@5HHz)3ygok=AfwE zs9K^dl8KCNI5z_tx7s?CWf+Ejp#+aTwGhC6pz!5Uu&UgV}2a0ocB>@{vjK7_FJ$5YHMySBk$5k)>EEH^D;LqMS zx*oJ@Toza}Z7eN4WW`}KD)<--@gZySGvT4sVnlDU{p_uupGEcDl@HohKiyaY+{&=+ zxF(kyUuUP6Dx<)JvJgRAz*(gip_9&rDmZ%dlEWh~Lt*vmHR{H<$xB@2jSgiR3OWTL z{rddc%H_pt*HJp$wpyi)PDzr3<_0#(i5WF8)?6Ve7c{Un2L^3eh%{#5w8I`*kM)aH zWhfwPRi)9(Vj-gS@F}@4Kbrkc9a569@#T;LU%h(b_197H6tsB?0d!r)rH5f>i{7(x z4R$`)>LCfm@WfhNL5JlDV|7E}f;DUXT!pJj2CqxCz0lKu*WNBhL9wV`?ImB#2rs<1 zaa)|`#YT`U0}cQ5f?I;x6jD?qB+Il{7dw#Uqy(zYZnR05^gYH56XWIyQ7LW{G2*GnJFCjhP3RZ@lm#I5v z0zTD4%t~rDbW$ILHI#S{i9VH86?!&Qv^;+q7Qrwe45hYIspud!CE_*ZYr627Asjp? z^+OXth}p9W$5Ek0KK;OyAixhQV#21%E=(^i!1r-}i#dae4;8Bn+tv|ZEG{IQ^2f2` zMGwPlPIzGTD>at{L+xHAJvV62j zD6JjP)XH!j9HGfu@uyb2alWlP7@S(8o=Y8aV8>RsnM4m)mT&0K&w!MbW_#&d5oaXA z%3F0sF0EVgMD-k`j^e3|$u&Lu^3Ykqko9cc-1Ob`(Q7N38R3CaOy1IFCiWW42*CEi zSsCjP0_|zif~1VL*F15XHX4ZBs}PmqC)t?~Uh ze<~AO5=MoREb}1^C+H9#jAu45Q{8J&N*Latw&5`^IBS(461^08!JVZVo z#yGvWc43)@MzM z8$!-WL?rB(^PJ)hBUFD8PCPjJ(_OR-OSr?tiOzYgTJidYpo0Q5z$ap3%WjDsk4p+Z z^V%sW5t~txTj*;P$_FoteXGO-<$|A&+c-U1j|c%~jdQ|z1V*;q#fkz|#Lk7x$Kpx6 zBsY_*gMz3#Z$y%A62bM)S26w6^agBY){wG-EYbpkx(fk3Vd^as{X?>{BZ>+2BbNvs z=%eNiANh}(`8+BCb#fmye=+TUw2@9Am3-8SJ!J4v^TNian*5_ocgN6wq};r!{?P^p z0^X8!7{GuDp=%+p{Xm(+S^0mYNP+uH3wj2F(prxbjwWy?aBNavysHd-MxW*URgEbR zTBO_=o48GC)iQPeo#mXSE=sj5HJ76wLUD=={kkV^gsDc+qspi?TP+6%)1FuD(sW-y zI$|e*B5GESbAgcOs`MAz%&3jE`O_PmV}ak`HIwVOW{3^l#3i+s$V+^KUD=eTq{ayUNGbTh3a77LsEbuw2JKeYl)K+1>j zTMJg<`o^_XA%uF!zHF>IySU`t{SuX_wz|HteBG$fF(3EdgNJVw(d zBnMo`eyA``uFT!lGVy$$Kr=-M?dd00;2vBUw^XtP2~3oa}f@aWAFa>A@% zz71L8LU1gi;vynkUqjbZC3>M6j5g9MB;VI)yNL4E<@jlysknG{>RhVC9gjypbaq=* zN1hRt&7cOSDU&AgIF3u-ED*FLz@nt;%tl;Px0qdS8F|;l zRVvW{@;aow$dDzrV28vDB~HVG_jq@osl2W97~Ru!n;4WRH6|B10gq%>ih)xKr%_|j zQNeZr=)H)Ll1d3IA#G^5m*c&et9iUQqGT5)eSSt2WPoppcXuX)#9Efm;Al#YA|Tc; zBofrh=zdCsaO&x;<@#oL8xK=d!i)#A8$=}*uNQmK?c8RPrq-`u>ng%1IiMa%7HXz? zSh1x0azzPNe%&W~Vqp2+Pe{>=>!WU@#aY?h(PghqxrkXKuKa0jGhf2+!pPP+8m5(x zTcdcwNuIE|0Rky1D6S2{e>*2Ap?lq9hNEk1)0`dLl9t{wo8t3k|6XK(eL0-C6lZly z)tq-+yt#2RYL9`SY7)SEm(47Br%v{V-8qYzML54lMItNK9jHr;R*61hBf_N)l9)Cy3GQ)(Db42|Ruib?f*t ztjbAnKVE?$-<3jTtCcToA#0kRyf{-9NFS<_R7o93g&m}>rzBwTS)0F=UA!}ou1)1G z%T|S>o6xd&(T_EZFoz02{(QiLT+hF>;zy1gXP-rYC|FpB6SwX!gU3&F6w6Q1fJ#Ec z>!Yoq%;mhBk;UAkcgs>Bqj+tv-#PBa(h}z~1lZzd3$(FNNcnN@Zh1wDsAIDRp7=)OylTpPzAO zD__y|?xm}0n_gb|>V@-aldvAP4@<0s#(h*C06pH^}eG5oIrRdrZp=I3kV$2V0hbhH;^ZRysKwa(BajyrMjc9 ztm4JW7H5Tf2j61on)iAmqznvi%vHc*EvL=1xMOJldx{Zu^e$md;K*_m{9 za3_1$)#*i*&jJo`3cv?p%~76>*Ca8ha7rr`1A5luqjXcD58}e%8QOCXQ=3R<{k(K~ zi3cCM`w!BOmwZM7Yq#!t=qQ9BNh4YT5;m6e^~VXOvL4a#ba;(-!8qQcKvpbnq=uRE zBiW72I>jCR!IrJ6T&N2jk7&jGwR?vd&fA$09LqKT7GajyZAF#F?Z?RP1x*#84m>r= z6mY;p;@}V&b^#)#z?hxRQ=w2O^U3hV?d)LQdfP%4tnhT4`W}*Wq9k>V5wS4DMr?_& zI(gUVDnm;&O&sA|Szw0GR8R7>FNb5)#X*3GP9>2nckq~4pGViZ!OPpq>q8?w1T18f zLM67$b>3MuH8l}rAgevMq5Djy%?6kqB zl~iYz&5Ky$b7S|h-CFAa({tYGB6~|*>rhshzZyP57vPmS;+>FNxw-n%LFWmH&=sbD;kZ46e#ZUdZHaC+6FRcZRd|3Z8lh`V#ES03k6Ht5o z3^YNxhneXpFJxi4&(iZf=U4=8#5rUl9zCULW*rEN?=@ZxI-zV2$r^(F5XYZV!En)9Ev495%OiC}JUP~-f*ji>_N5f^H=#P{I8IQGiimt5%4GPmhr(0Z# zHl6LbjIz%n8uT?WWD#$+cccNe;igRM0TTmOKp&PAP=(^{X^t^LMF(oKT7^ z-_KH}u8V4)Jt<<`dR2Cx(txc};>-Ad}rUjd(jn2*|_klxp39+B%P^5NdR)4J1Ut-b2t`m5GkE#6OQ=OVi1E^0cFGhfyz^6~1z3?A zGR#%E1PT}pMJkHtp-k8q`}u|wu|WB6*;EJcBfxMm zOP4Pr9PR@nPY@gK6_?gPUDZ}0zS0_3(j+|9x?iHaU9l$jg{n&kzah{^WX(~qcx@`Q z1)*v#F&&t*pvY3S+~)YUx2hOYTez{D+>IIriYfTDdx~%OzpJ1WQ@aG$UYroza2s2O z{c1n1)0=m!K(9!b+)YqBjjdh)w1lxS&NuYyZaejWvZl4s9)^Gr(cKid$|;15D#)H2 z^JykA>jn-kzCKAr^2Ue*gga!8`npYnFN(7c33wHS-DW#lGgZY?1!NB;QgfRN0)k`m z#-Nqk-PSoTM}w`7*S_P``OWDQxJ;~FS~$_%4w1W{h~hG+OGqZPa+leXcj*|bF0LC( zi7P@Km0(!Yuc7i-#dZ<#9Y8_((N^DuJ&Zr=`S(?B2Q2DHlVY3^=;G&wSht1$NHi^|8^ zJeTIg^?IJ+x%&1vr>sw3nwsPuBr4_tjX2xW#rMA_xkdS0X&W&G=;LSz&z5+Z-n$KV z)y?0&dOZG~h`*nXzpusL*PAeEH!FDoT+RbZ-;}r7PY(|@w;TG8?FL;uV5M{K_`>CK zx&2(;n!rV}?ziAqEj;}d1@Nwd(2J&&1#jVTt4byU zOd9cImgx?&fZ>f9r-pN_Q~c+dHImj~ zByi*ec~q_pB@QbuL~_m8y4UzLYqy&?aTIm1zZr{vXWQH1xR6q@g|6pYn(Q@gXujws z!dbSDB^=%_5rMWKjm2~13r{nKTW2=k{F4K@eYHG6{f9IFq)iSw2cTsq=Haz18XIA%u^UH%( z)JUJkLMI!57~C5nRuXpJM72GdiI&1GeEc-$KUCn%79|%uE6SvDuT)RjrHwfb=P5Jz ztPOX}Tm#-%&g)c!xu%(po(DTDxJCeD6{E>ujYFq84H(m)rxB)Cxo{4i9~l-h*znH! z`~u2C53n@r%beLio#K(oSZAfhdeQ&ns7&96yTWbhbAS^psfN|n1jrUxAQX#pdT*eZXnpT$Lje=j z7+gw%o$Z`xeG2Dh&8A!t5SI%Dq%X>86+7*EURvXDOOS=}GITw~fXR8TC?n-tu~|J? z1TK!SWFZ1(j6i0NAjBO+*i2h3mp+2b*m^7?_%K%GWc*uIDe5ia`K+Qhfiw5*Na>!lg;e{7ct`W__mEUh$-3$LC<*)kC+zJK^s6 zX{63s^et=6o#V~j<^|_`iXkt8V0g! zVDAV@Hm*;^Ex-4(2Z-<=KKq%qo=wI!kt?=C%5MV z&t0Ddn+oQ%Dl(xX(!BC=gqNq`WD?K01R;{vvVuvKW2aFLXko}eQ@#K0<|3dw^ILKk zsYh{es$Q!>yIFDHR@oh-S-Q`aNr>*;iRPMehT6Le(ql8(Xet!xl9+r9k0dRyG65T^ zh714^s5w?yo*)}i9OiXZ!vAP*X(n zE1ZDi16-i{q4$Eob59`~K6L(~KIS1T7G|AX!f%*g_+`7~&*Jj>x1qGe6Oqeyld2R* z9nli}1!VlT&{(><7IqJ(P~E;`F1NH`8IUPKmr)+oOE@bR=dcrS)nfl4_{Melx3Tjj zZY;z`CXi0F_vzb2Nm}(vBpHar{AzO7gJG}|hap`03tqi0wM(8EvhC8_`JhXI@}*0_ zVyuv$GwL7E+#;1O1n&a4N%6-e5HVc|;J^X?qiGlMj77XWHV_o=`WhpIuj17WPlzVQhS02ub%XT4%%db& zg%(Lb_*JbMgkZA$0`4y-IKPXLM+I0&?~}Lg5|YO(Ay}j7xkN2u9Be{Mu-QGQSw#3a z{!b@kO9bHn+QDF+NgZ9EU4%Q&4b+~m$|7wt-r?s3%p9oVL*Bo^WM0lYHHLEpJ0DU3 zyTL0VL3;{kIqNFGGRG_qLxP(bzzNGyVe*EX3och-=L#?#vnzM1 zvx|-pTm=M{utq>ZpC}DYG9PgFtOVC5QhRLMVm1`mXotB*ZxF_~OH1|eF@lhkr6^}; zE3OoooiECowbewAz)(B~rjuj5P#FC|+grRGZXy*!NcDERS^WUhJI}3z_gubg&OH^% zwxv{g$Qo|YH3a}yy#JQ%0-C+O@;3gW^d@yahCm}aZW1cDfZx8329}FA6tK$EaYeBj zuF$?WTV7O^4zQf%y)rB-z9i};IN`^_&JO3Z_9UYxfP7vQ)kwlztD}Qq2{fa88BaAt z&1g3e7t};{GlBr_#D;|strpl>uef|UmH2PD2W#c(u!F4^c0IAbI1N<9;Q`8};95Hu zOvfy~Ffji3&PC$J+LHT~1uiD0<`y>s;+Poc+*a2XVRi1nRX~Z>7Ec88K#S4(^deUU z$=|s|(hvB;W{Jn-f(4gLQNOO4i#va&1MN*mo6GF|OKXB&x$x5n8-?DJldc6F7x|fD z)&4?@;#c+oPe1>{cLRV(A8BZpG3E|12pl?H5YtVjI(JmrD8VtXlNe&)sf|=rvNK=^ zTu2@ch@a@K-#|fZ90SyL-84@q~gTzGD{P`6Y)cP4bz`oYS>s4 z?&Ol=*cmISTo5hfm5j9Tu9q?>nZq;Qy6zQh;|V`p@Yl>-L*3%8S3065nY&PyNB4ne zblPK~H(+x*VN6_bSYZWnS0rD|BsR-Ffib^^%*x-;maSh8fEbrtz>%z9ml#yYFj5vd zQu`od!aQm}s4O}K7HA!D{{*T8+E$f6J=yB_o0%Fp(~peFoK`WCjtV?59>)W8HRHgeb z7n_n0m?rr%x^+9;PRWUtdj94N_E)ukTcdlP>su3%nD9X>e(DcO#{9W_cWVOHXI>$@ zwKc&j3`5hhH3_OPH;)I(1G;_+EitC6t!2viyM%Go&PXonUtvSSD50%swY}wCRn`;) zf9vkcVTcOs?+s=d*~RtBm9)_W5EgqCZySMy2cf3#L}APaefU-*Z{3u>OS{gcngtVuUwT)Tn3dJ5V_v|f3hm7a$R^-9e9{GvVK)8xul@Fk zGpAlX`I*nYacuOp&wTdSYonk0?6J>{o_YP)tEY~Sjh#CA+0iqv9{-&%w6PJ^&gPY% zyiM0GSqw2K>D8;~a5#Ds8hp)+#)>PxaQrjPv(F|Y@amnXRM4$n};{S^lok9gyx&k8F&{=34s*xyDgt4otnlWL)Vnp<@K><@D7hP zlUyEe77tx>*^?`-8~hZaSgi*7=?Y(i>k> zYl}DQga|#Kc};UA5`G6}6o|QBkIwn1P++|PYBnOeaQGKBHCTb0N$?L`Cl|_U*s(WY z-J5N{l~<6C;(i~P@~h*^IAtaLjIVQ_1=tO~og4F)QAI+q-5OET`1*OA1yOR~yr(#& z3FM4D8+I%`L)LRRE@0}-WCVkeEL$$MrD4=ff^Cdw8*1Q95Dhz>^xi5Jf6hlP8 z6c=sQ;3%Aj?)C6Zz(nlScvH5?zo)7~`^*yJRm~jhP}XpANrH1ZYz|z0#ZH>N0TkL? zTp^c?2KL!S6dxvni&>DC^Ps2LmzgqfMFu>DTa}~Cr$dVdm2FZOIZcNJF1F_d1&a$9 zYr@$|$fHG=O+1^^IunG zS3s7j3XN9IbePW9FpyWkqFFXMjukxFaBKQb*XTGWEklP1%rgy*H+uHJId6w`IW*>B zo&hViIuQHT%JhMe=@_$xCT646KtOR80sC2nrS-g{==#Pjufv!~35+u3nzYIgBjZiq zou7MXiF}FFtE{siCEK=N#k4w*d=2+*hduSUd$k*n>7MlrGKyn^KsnClk&vZ|g zPI~1RPrvf$Xn}y-4*^PLmJ4djnhJDGLg`llDc+vKl_sawJJ<_qHpo#N_guj>8Bz-f z@2Ca`IB)8CD-5rBNE$rVEnUD$A~2RDwgPzQ-9=nVLOzU`4v&&XC8>X*wFDIQW-6VA zFv9WAExZawa7hu4V5A$k!Cp-+JTdEKu->{8h*yfkJryv_J@>4Nu)2 z2VUIXC|DM4RBs=am@BKZ$X%cqc_kPFATO~2LP1_#ngQ+=lYi=ll-nrJNp`W$V}YK! zwHa^Ghy*E*jYnL36k@f=$wJ3mCXkia zIjDu=zF6)!D@-@U@>_L-IXA8>ubMI!JX$;#pJBB|LB<0Ht6s3c9Zk8nhzJcbzm@H& z?=?)YTFfT(z)yTzJ`b%1oi5C9((6sU+Z)G^vv;EdT5`I{&)hwr_TA!^rD>NgGL!-6 zenI;g#WKgawdP{+Bw`igJumM^!~q2uvTudQmLQhH+7D+ukH322wJqJ385u@LZybO9 z7=CKifr*u*Q`st5K}AE;9>G8~^DweF-{*<0gAJLvv~yk5qQ>dpMAh*YLdEmV=xuQF zRPnu5P-b%EpOS3#V zO-(!^rN!K*r|sz#1r=(%R)DP{OS%X83-uipB=A<4tukRN9Co0R97<;IV)NS_Eso%k z!y=UXk=Fe#@6ZCiIzKzZu*dTP53$pF+K;>ZJ%UlvyR;G!*FP~>R6TT$S}<}^2Iv!F%jlBsY_Rc*3!LGNx|8~_*${Lx+%_FDmS6H4s7efipgZ~NY=S`0 z1QP=;n8~Y!WADSI$RyZN14D~({EZVXhLFK@-~u6|&%JFZn1}=atHVI-_U-38Nvg9e z#nUJW9&$cH#w0$RYyhO6d=uGT#q15mINDpd+LufW!wH4gfoW4&eCz7vJenv|yV7#l zrE;>DtS8gx&iw$mbpZXkw|C1@^+4I#q7-s#4GZr@rP5qkTYP{}c)2{CTo7y$jyPfi zUV%M8C%`0?ty#BIEKAS{6)keW_N)#j^5+Rn$2K{6-i@n_d+ye))peYkO97D%-OXY5 zI8sUs$H97Cm|mW~7JPa)0nRI^(d&7(X))e>sgoXtRr=+1C0xPC zLtpE_M$vk9@>n6c9i?A?Sqns{o!Es5vfTy`cnj>a8j1-muTzMdV`Bza9#oZ)RFO%n4O0r#vvw+nQ*G^XZ;hnh zt&wbjTA2-h*-IwP1rLsgG2WIwA=UNs{CabKJy9ENNNbigX_#qrYU=W&Ei0+Va|ag$ zRq~^NYA)Yo(L-=VsEQ|G!MAr(khjn<=o9hl8}pd7Hes08UfW8;UsG$9EDwkL(+Zj^ zP(HxxVgF*NeJm-fXUp+RTKw`>6su;mV+-U1WiSq;R`m-kW?5qLiLF^>9ULuE+Du$t z5Fsk0KC{X+1JhjMbt_z#Ic%d50ApnJVJ3q!H@;l>QeOHSYvLuTOJ}a~gjAEyOf~uZ z6kq3gdn%ryYJ4-QiHD?`cwLGD5%uQFnh0e?Urk07bo@~m(c?&5;NzlQawBzmn2Q{q zdO2tlT;$7N;!7FlWlUuvG(G&9=Eczl^AOMS;x5$SvW4p|M)>9ualb`qmhW-CztJ?? zzu7cTV)e&o>H(>H7fHb#r@7NKk7L1UOVh}ncSw7ud9-PEyhDBdor%Bi#NS^b2QN1? zSDLY=*?XoLZO%87hIbrkuEpP*@%IL)SnY6f#WqA4>_GU|5ZX=+988s#aSF;sc#3~ zBh+EJuXHQ=s*z`9KY2d$e`b zeqc=_9cvo7^_RjQk{HLvSY9y}e?r2J!Cv6G8^1Rr7v^o^OkH7qx-r%jZw}2+w>`Z9 zWGz<6IM~Hb68mjxX%5@gG_8*^%NgpGIJz|z@5Sh~W$5ekju)pQ>Nv?i;q(;0t{Hf? zYx{Y897;LFVB(#fTGu+cSBRMdYHt#c9-Y6r=FV|I|E>+1!0&0gV&3)-v`NX4IlFARb70k<)5gZ*gs<~*9-9CqcMBiG3h3Z3?J(VoXl z@DLGsD%3h=_Ze<1jL$s-LSc?$0~)V=?M)_D(kESo34e@n*2+9Jpt+InBO5LuiT>JO{35WA|kX z1-}6G&I$Nzm!kt;?Y%;oGt~9DX0XpWb=*07IRmb5^MrHfUVVkHgfzp=Q(e5Fy2m5! zP?wf%MQpDoZXk-bBL4AyKV8SJbh9US9kBM=BfJqcI5gpC8bSc{MQ_=Y1Vm~ zn6Hw0CR!o&#hQAFz5gXrZE0(}Uu&Atno~-bBXzzEU8U6zD_wg1q%eGgf8y|E)~K$` z;AwH$HR5vZINHR2$AHhf&F7&|gF`QqDjv;TVpI0TzQpaOfI;`vJWas5@L}%ei5lOh z7Q&D#eVJLd{}-6mv+SLIT)TIUx|hs*x%nD-Cz!iajdR@QI5gS(I*>FQwql&XN`X<|WnS<@q5oaJ=CJkl zQ-=7NgIVhkSF@$WQ0kLeqK}sfW_)IIOAp9%G)wn+%S|KM(t1B{HwzpV+ByqQ)j1M} z|6}zg_D#;JdB%BlKjL}L9J}w1#EKjV>>YIH*yiz7{>L?ya!MuTwPQtI>{2_L=}OkQgeYC~G8KG>`Y!o?K6k)06%lv98#4doI(n1tq6fu8=4BjqGc} zh;u2dn;k5ri#*#`ZH_0!AbQoeLO5s4yJT5W!&DAlm zf933sP%lTkV$S5L{{PoM*mV{hhzzykNb@Fte~mhuPfIPw2uaN^@arhg@!#j^$xZ%d z+jp5?|2xuroq2rl7@55tpCU(d;3U1SoMg=J0aw1lge^3C#9d;#X3uXR_5F@=-vMFD zIWo7i+U&R^pSABdn3s3x*-Oo{&0xndpn9( zNSrWu$+jwweT-ID`A_(KC3=x5t~YIdNZzho$@}EP>Kz;(PU-q0EfQAjTVj~S;N=IK z>gq}i4xI$Xl)saIIS)qyJ>O#s!5tPZ)HSGa%;%ny)bF>UQK&T>(Vj^{^3cuWl^aNI ztT{UTeKqn=($e|nE98gwKKx)#p_G5+!%`nm+X4Gyza|-*{9yCU=9nxslxOcK9LfZJ zf@eFtHGdrg<9l&ys_i6iHySfJ9wTcG_Gh>B<;h84<0cTJ)Tgv^Ip!Lu1EP;L?x_L1 z!laPBYl?Y>n|S(5j6!N~j8QGc+~0(AQXk^K!S;PXdhC2cC;U3n~BN9bT1}eeCko=qmveo z1xB;%cr)00jPb~cEFn7?7UQ{dl%(qZqEErIBo}M$BkZrlcnN)>JvwTg7kZ_{g5u62 z%(PgikIMsp?0b{evYuaK_Fgv60r`TIEaj`zZaIGy?=Vjxf7Nf-uS$l_#40T%7p<%r z`iw)T3CWd@#mAwvZuP$dD~$$QCkW3mLM7i;MyJY1agpla}B`nA-za7`fPS5_~f*cG-@M zcI7;?Ego>5<@A&Ll0T5U;M`Bld}^D-6ms_5?jCER_BnNRu1V@3kGOk3J@t_C!c#(4 zw$>~2_&b#R29WW2G}o-z_M_m~Z}25X6A#HL5#PqG2G;E2)I8be8@+t9d^?t_PpZmSf{UrPCQ_S@%wDGHOs$T%xei0e`8`Swt_Q7vL+r9(G_`5*KGpxlY`S(R&=-0^C z{U=ntN$KuCW4=Ib-G5tS*ok{qSWh|lW}mW?v^T!?Tmo`01EI}6b!Td<@~fkE?9shf znSXVGXeEOBCL-tlhDo+TzZ^0r5-a2Bn+LzQoW< zHGB=xGWUjB=&kV;-_Jyul%WPsJ)D9y`_7Qld6Awq2e#0(XHpO6F1Htz3JS>_ab=xc zxy0FzGIuY)%gUk35x*@rweLmhRcCYB`q371G_%a^muWTV`cn_r#|;jQ(#j2Ts%4cY z8SFR(u4;BXM?K9`SE#w;BGpz-#kbtJ7OacFOLNeWda|m41D1w#Z^_Y;li6a9ysa4DYYDwX4vBjPxf4?R4!I4 z#Q8`i=N{om9N!!gi|0-gvJ5eXC)I2SS-Ix5H|ub|HH-|3=COXMk5r=o-+8n@kEe-s zj?@{c@d#M^RrL(hj4G*BayNY|P31BiVYep1x9^hA{WiLXaq37tMD7>&ziIARIq2LO zM;J}wcQJ~iITEc_?NIQ}&pX3+%h<&M_SjnbG!f2-@wy9Kx8`waOQ+dxHc9zl!#!7{ zo(0NT-vVn1Y(Dc0f9tGuHj7SY_W5Q2bV!eqBb@^}k{V03+<}g#+8qZ^O6ya%lDULa zZuX*w{Tb!^x!P*NkT5LYFXvYIHCF!c)?Chz5jsXcVRIGa7&tJ>y8xZdCXnK4pH8n46bX+7_i2RV#|YK zbosprWM;!)$sJva*i6~%GPRPjw}Xym*OwXNNou-KewA+dexlpyLZ-X>j+kR_x6hk> z{kdwM?0-o|rBQ*I4qGO%MmIC<+&=xF)ZV-ul}hk>9Dm(k5127@gG1Kfpr(n%y1K;z z&UD82_aQ0JyRL`Qx|BSVgH#qy$@dg1Ua`nTgt5{;F1&PB_hxVE`h?2nnVPG^vTJZd zlZ+y96Ek{HjMkqo)^*44Ds_gm?JjtQ-t{f}%@c`@$C(##gyWhE$~Xbk$k7C437-zB zm%NPr9fnzdXrs1^RdBy$ZxCw@^QPUqKg#l-0@06wcF$7PI7YQE1CSR0A_45zgH@UW z2){xFUj^X4&R}Mk0w-~SE@>e7Evn@dd30};`*LKvG?Tx}wz>my`ZkL6;~0Z97rl<* z=(C7PZ@?@v>^EM3MO*~1{k_TWZ_sf;K=wz3kz}G8*JMYZWfOc6C1O|N8K$|$H?R;{ z)1%~jlvZ?wVcUd*jJcX;%&{JuX_)m%2Hv^`J1pC5AE&fRljhKa)G32s{SEqkl9676 zv6X;|u;;1y8_d!%#;qai>x}+b2!-FI=FgYD4qktOu|6!{OXRbcN13Bns4vF{uE!bLO;aR?>raGXd}#elhm2TmdLg~0sj7s?vjQ@4~t zqPZ+lzwNtj4E}{>hz&hlKew!i7$4AbzeO3-s&Z-$ccaSD4XK@a#&?-6H)^w|ZnI`r zmPjX@a4>jW##NEdlx3hsF<@};cI*m~ht5?&e0D^B*r;Ct0^gDqL~-JbkFi7gj9fDA z{n*NEG>>OpFO%Og-S;d#1p(nyp>ZEJ^k5C0X8#tY=z$v7j;GC)jv10039ogvZD2&j zO$kSlyNpD_DEe(vpYCQeQSETP=AiS_ClxSZhm3PfDPSc7JJ{#^wDmsoTjbE-qj{L? zGk}d09Fl3X56v^bfgt&fvcqz>i7fB{$n&g{UT`Y94<(V4*S<&4CN_eHKW#1ZF#;8ff3? z7){Pgv&+4~93RZpb$_r9F&9wB>olSEBoZU_H$YH z(OxN9-)oN2=Hp#`F`qAPp3mQghJOm$u({smxuc9Sl|a8rn{S~K`a@X=DVaKHdL%KnqW}H{7q{DFwx(Ud=Pfv>l^W z_qQcelyi5u@8-ZR(l+~A+zfHNO%03N_)^umQ>sv3! zcDb=vfR&^S;!an?9zz+z7}b8Ea2|yhZT4u|`!X0s!6)%x&T_aVBW@a}fEM_8U-A*o z6>5?_=>|pFLG$IhV>F~BZjk$V3FxnQA@_kSy4ZV}QM|*Rb1xi;U97_Yo9?ppht-ue zJs0)9L(P`!>VIX^_dC@6k=qOxT{*E=+8J{uKhNr>(Ret%`E(cWZg55{J6vKorTOe- zaypa3gy97^|4v~4MzmGaFH)!U0uF573(Qs;^}s2+G{vBDc*>cqBK{d_^@i^v;D;c@ z#Y3!KwnHr?zxjloe#@x}vNd^Z;U(I|wYHcfpHr+!ILsaRpxz5XV#nHo=F)Tqtz%M| zl12)-wst4uSthI*? zaEn*%rb=C9iqgm6sjYFx!qxBwe6{nuPHxMjied1$_)|_ue1xn06NyvObgKa-A!hJ+ z#@8_p!nwa5`7U&^$_v6_XB2DpX>@ZP$B@W%`Ox*}B3z%8s+0E`_~yjH zi3J~sgTatJqwZ6-(v7LBkCD727xxOich~gunM;7 z!v*QU@csoZ;CCEte^(Rxxcydn?JV=Xr(!Y9H1Y}bgd;jhwVOQ^uW9Dk%rlUaIqq`} z#K1?mg2^}Vjm`*jz=6cAx+i%^0i61j>eZ|0!Zg?DRIMZRSo~|A)M#~z-e|tk#kk$4 zPn{1~5&jZO)E&pn20mT_hhUUA@N!T{zluTPP~FjKZY=p)Lk1eOJ!k26n);-=rQD7Q zXDKK#c@EjGYx+vN*J=6bF7|$IRQM#+7v$z_0!MEIt~efFV_t{MME%(FB5 zO;%`6%<*Q&zl1e4Keq}VkOsJt9ydFJ%)ojaI!m1RRM|Os6!a}m^m*eRWeHu;1F_$p z%A*c2Om3}FR|d_ZY2F%eY~n$APB91WLH9d!pQBs3dvq{!r!%*he7k-sfs3`^C@|0; zVII^3ej`R_Sj|n5v@mg=OEzUUh3&afx;^locDYmQIEY|Dux zcJjcLt0ZR1{Bj}{C(>u!=KL0SU7&vJZC*+}K*~0?M`?IH6*Y5oqtOERtt}I`P zFY&U5S@&Iqe|L0JdF4_m7rjMi=zdThbSDjd^%S$lZK}kj{FspMC>^1AKB zUEE-A7jB*&F1e*uu+O&{s}N<+@6dlSvRX%HprPg5q3&+Yk=;&cj=l}md7C+?d2&wb zexct*K36-}X$*Q;vB>8i!W)8R^PpL}lS!p)Gdn{rn#NCMQR+Djth*VFByvbe{z63w%>s z>hqS=Fw_ekB8YLTJswWE$%w@h(Z5ngdTRZZCu3fp7z1yq)v6Yy;*=0nt8&97?r8G8 zu1VIhndcaGvpJ$o>S^)Wu;kvy)6LOLcW+hAVb)zSc{ARZ4xBS#($#Y$DF>!ZXm4C; z*PL-JuYdF?Uf*UUR|ECZAHd&+pf<6qFY)WKNm7YLXm5(Tmxmr{o*usa1VsK!;&{>uq4rwH@bt( zxpQ4#cSp(%wk_18bxd4Vt%HN337=W_gK}th(z2d>Nb^+kLh^=c#-;S)RM%^Oqolo- zGy83J-Y4O#K1qCPQzSOu6sLM zb%Qn|canRz*`kdXzbQRP4aBpZ6D+xps!dYzb&flnSnUzCg!59(;ppW2Qo^`zv9^`fDxC8_)2y zc~|D4kFny9Ae7k8>|gDNYnHrMtl2YXsNWH#rKjpz`Z#WI>_PKebroAIL}wqA+kR9_ zbj7;j^8Q?QT7jU@y!hehH_v#L$JEof|J{#yByg6IsEJG*Jss3oNg-v7tu>(|f5P(O z0W}-?yQJo0@KnV_@&U%G>ymRsVtB}P0H@)jLPycsX}Y;jw`DQO3i4{z`X2)#Q-?nY zjjzz0yH@^3X{&jBSm&;jwRCF*X|aZSwS-=gSZ@!#NnP@tyibU`zI_CK_oOchlBggmpm&oxvd zo*YM7)0(lawhHlE?Q9=jA9@R1?4{-Iw#)phJY~XKa^7+QmGfk;;12p0v!hMR+U=Y3 zFU4yfw~mC@;5haviHhU%7+gTrL0#X|^QXGoH%}>%J;WXU88!Gkc!3w6xLSOqEG{lM zR@xeTXdZFnwPx_y|8K{!nmun7Pql{YE3|RtHS^}wtpSidoKF-9BV7r>IEP5w|V?cX0*y(9N65BZf|UIlb^*f-E>yP zOO?A(zgz8di4}tmK25PLyKrvnN2=fJx-_;g?&4?m?XLVvtjG3>!krnf9-|Wie>%zYd$p-+LltYYKYkI z>Co<>eM$I>@Lg=JJ5c1#q3=SGv4+|NDRS z%C$fJ-k1LHKR)(}zx$W}?V#EHFTefHSDt+BZ~kD%p^-g6KqL%wVF26sc z+;MX5J~VRwe;SOu_eUl0{##l0{$D>9DK;|l{#zyW``;;ndq2y1-g}ncFHrt8zwcdd zn||-rtmZx2qbu+Igo59FZ7}lPH%s9DYc*zqEHv`nf5z|8@_T{bzoU!4o;ALIo?klj z{=|Sk=Q1)nmSv*XSLo>9l<&XEk^kP$Mt<)nS^e+-GQafX_jhNO_@;^&3C-U78U6YF zcS^+kVC46{Py6%CIID1c@bOa1-<^7x-mHL+!p##5DKaRE^S?~{>cPjXUd;I>vKQKay@;mZ}uG}9!k`er71UdiE0r~q5O+7i- zPYXZT&Gh`B2iFOc z|Io<2e>&K|uM6i~2{u1Gl70BWFZg8=KPc1m!N=*n89w+N3CDrEzsrmt{Bf!OgTKhQ z5B@es7PY-lOMSfG+6N#1rR?JmC+NyQFH02#=Gq?q^Wh%8_i9@M1%CKv{jc}mDt-9j zpRh0X*Kz#|mga~5ius~u+Tn9QY0lFRe-iDwn6~<(x*P8OltBRmKYE`PxH8z!-=l;5 zboSnVmo<$1=qDrh{)cTlAKg7@@_&ysgKhhFH`_;cvy*r4Yz8B{M;_bZ&;DJ__7b^$ zH~-tVbN8MjI|l}L@7{i-@!z%`N1Bm)KizR;K&hQawwXVEcJJQ7*Y4eq92so;I2reE ze}MuoG~4(`#oM-xJT~$eiIHRX$Ejf32u1iyH3Me!f210bOZ-?Hk>A|eY~wGLHivg? z-+6ckJv0xQEOLLhMYi_>e{Rn0mOZ?k{M#cxgCS-l#xSsd+sJiLSA~&#e?wOv-ASR5 zdp|egdw(3!KW9R=9p16G*+zW+|B;;}^5@>q_pmF0M?%|nZri?dIrPiJm3GAU7$0~$g{hfM{;F$H_b0ah(Pm}A%?J@Cck?wn*5(x=hbaH z_s7&c`$#j`zklbE?YsBy-@WU|BmC@VTDCvBfB&O=^0S|DZ3l#C@)03v+oP`z9{EH= z=o8KEUvmEb^(UHruMT#6f_eDY5lsPp_wPEg{jk4#jtE4+_5R&QaygdSp9= z`Tzd?k7aty`The(cGP&bhFF0)jR1Rql#JU4AlJzK`&n|fCfzE@?iMC*&FcCy?*6;%9l zzcKVz39)RPhM4&9N5F714MrY|*4ZNf$iP^q*XjSK%xM<>s{qZv;>@Xq_)85hWDQ3B z)gvDRWFC3JKmQN^3#fX;ZU4wN|7`bb~?vdv2sY!r+r1=y7-1E=h2)!fcDLHbU z?YAvAzH_}@jN-)nbgvVA|EG+G#+;a+=EUSIead+up#jw_xl_*PH2k>$QH!ya2ZL?S z@c-(cd)E7@N8ObMa z&%RM`DLcWo23Sb{4!vZvkZJef{fB{G7R0!b?_}JL!#lR^+!-))iw=Pg_8r+V7%5?9 z+c~&3va~xYyagU4U>8h^7ViC=iM$0)NsR8O80Gu_+3|kBpYMI#MRA+*@!lWt=Y!P% zVJHiUjF;K^6qC$HcK(AsV1$u-f4Y0OxMbwKy{4|1g73X$y?+|eXpX10|DQkp5C7Gr z^#JOB7qIg0b~a)Uf2if(Wu1Q#t0np$#B%RrjhFSWX~pR}dNr z3!9LY5=GO8|0VwZEqegeJn|S*k-riBlW6^?Gz&ZP(>;JS<@o=uhTMSAZn3q$C1Q7p zNGf;lr(m%i!d@jG|6BI_|DYh{qKTjR_x>Yv`2Hg~hmY9SzJRz0^7Tjqf_`M@VL0DF z9FOgEtA3){2G>jIU?UO)G0GG>E0K@fyC2Op{7YhXyJQBOpnn@}|JxYtPZ`mpM;@V> zn4vvDE5S!co(pLB>BtZMRZPxLM_wxt_y5R<5B_xIIoe|IQP(e+q{Dz79hAJYn*Qtt zhyqfma)g~IQQrMauMR+; zZ*$DscjmDER=5nwfN`^qz{aEC|Ku@%>E{R!99n{CbKu_pHFEFYvn7F7Kio9?_h)Qu zll#r1^jazbX`{;fKTF#2sDmb74E^7WY#{M0A?(Yx-LQ)OA5~Z3-0JVHCK5&5B@-Ro z=B^#N|1qg1zrQ3sf{gtWC-UCUphdX}<)@)h5=9w-pT%0(j?I4Tk(~$b|8kDwV|?1V z`@if$|17$FFQE+R9uUv}iRCXXfoQg6EEB!=$TngLjNJb?=xF5qHw{1bh}^*=h}20H z?td(JgWyT`CVWM>#TRxp6H>HrAMO{eHt-d8>OTmhBOiC1-#u5T4sy~bfL->&`;MIX zhza&qkHGLI zPi=$m{ZTYK!K#o+-piJM|NY)6s=S&^|&-!e0fn1ZH?w3S<_gs+6pU2;y z`1k%}{{7w`Q!R{&*zW#YyPH6f_s`L)xbptFZEPUp4!BSMBa!F${ZGb-2=AYEyqPiA z`5a$SvvjuS;k zlzH#Rb`at1{$JNd?*Dbx_SeA4ZsPfW7Wr||_8$kF{#^l%`vw4;5(#87wh#Uy{$7tw z^q2AX@8j<;{QHBs`0Lz_{NPsnz2n~>#-{th`-boTMg0ATNIe&Se>46D*81T4hCg^A z{=O4`BlUy-Z1{(tiob8g-zfXT(-A%&e<$K^l=|UUBmCdQ-w)z%)cnIgiSVDs-+vZ= ze;j{*5`X{Lzdwq4eiSwTC`$dvZSej(bsE37x<}lS+8O8n@8RTK4}L@3B$NyD_p)7l zK?tegyMI<|NEH43?*wJK_vbD*RM@J1L9P-&Z<8^>r`-R={!;fZBtGxI87uz}+0H+R z)<^FD1AyTO-hZ=vn#*1NdW*RBkG%J1wpyf{k=J2e>qkmq0H#&H*Q8`5CWTCp@BiiN zePFE4t~<|HuL|CyC>~Wmif-DeB83As9^(i{u)!m|DKhki?2-s4Si!q6qT|M?*0j5E zH=SUKY~H_m^{VPU)E;#tyuuPKVF_!oghzO{tfjS}1&JQfD|#0sEYUla6_(1Q?pa%l zS6Itz_VfLo`+HSnG6S!Ezx%uY@44rmbMCq4-b-YmVz~gG?^Kfticnb@xxRCKVF1sO`Yxrd??l$aO|2>;^*t)$ zAa9quYk=l5KSd0|OVRcW6bche&a-1cseYKp{DfR*mu% z6i6oyulQ^}&6-bFdeqNl^>e159US}w?YSkn&A;8`JU5t0FK61SR+~yYSG$}=)M=+F z)iL5giz=D;95NC0J1s?*KI#YKBgXA%nhtrd>pfuEQ}TFv}}dL&dohTuHOr`hIFq%&Wg&gqFg11IwmF%lc{ef_YMXKSAn&1ELtJCttjU zE%QT3CbjBrvuJ<)VDjcAeO`JgdlJ-N#w%d5e-*599F-Dj4v*B2jOK{uV$TRhwJrNLX-!f`3e_Dx-=mehim}kCm(WsTX%Ah{k4SUex$jjO&G_SpY z^gfn*krXtAOzbQHaeC43vfrTE!R(+g-@}q8r6`CWoux#)7>OE|G)`&)-iB@)ZYOy4 zNkrE~0?+`VZG0+=rkK_s?==Oc2lb|11B2s(Wqu?>1}6ZBGr!YgaByHuIa9*=0nQvO zJg3nyFY)i0;TMAWGhV79tt3B`S{@C}-VhiJ*J|#op?_6QblSmz7hn97!+CFArjpe8 zGQTyU)3i&niGE^{aA6_r+gWXg;RQ<slQyh7xrU8w6n=A~Hi5fS;$@3gd!-IyOi#|ICb#a@^$mec3FbmL#DiRk&F>!>%RhQJ5 znN0?`J~eSiQa;Ed)xG|9(8Kcp!Y#k7N?eRe1VYy@5T>S67v*8TOKV{;Wzg~u-BgAW zI1RJ9x*F$~t+<%kzhZ81H4_D*6D(%wIWxANOjmm4-|8WSoBEQ(->&D(Bq8>m8O^BJ z%$VmYr~;+^xXMt`!}$;)kE6Lh0|ht>MuMy=njIV}0Ap3@7J=};cQdOg#i{>84K%q;F!>3Qjg;UlRS&7SFK0Uj%H`(ZYGow83R`i(v89u zQKuMHWvSB#Elgg?k^PEL2dD#a3)PWL{fZLf7B?ldT(MFiFbt$ZiI&if4@SIoFv=-n zh;Ip#u85^rc<&9QE2|k?6c+e+g*c{-p5Lugg~gowrAD9<6Y`@ewG@N@ZdF`F0Ffo9 zq`NJ!+0#^KNOJ(@A6N5t88s0@D5-90>WU?B3m?RBme#G3V ziDK<@$dX%le*ypfV(2KsS!E1I<4_sx5MD{2+emrtk30{>>mckUz|%O~pEI4tVJK{| zKXD#F*En2U-H%^iziRTu4ZtB!l)n)jfcQvlcVB{NP=rr^=RvH*b#dZsK$jA)xS_G0PQcqU2+{t zL-W>=#`y}uGcRRuoD7N;^ilm{>CdxZzyj{okQ8#!Vsl}Loa+0fXyT=`mk}Q%YT=@5 zd5&s)9CKO(BEtu@5(9486Xfx95e(c=NN5>O7#3w_^;0>9qSISF?otS%(8i^RPpnu| zYFrY6`%|rWAZ@hCUE>-Qf&|w}1~K>r~8uAfUfaZ$GQ8h_|u@|NX6BaJ(%@I@5V#1a`9 zEe{S_E)~~-CX2kKpXup_iT)g{y$~u#w6W(!!SmR?NYz_fhpFDmJ?L9{3S|L|=(Nae zZ3pDDh(J*ohxJQZkg}+Lc{q3HmF@*nYr|t^Or3wnbfdN-nCQ9kXtb4~?5s3a8;`a6 z#iCbjn>s4i`PDJCZL5a+kWq(}MmitGb>4*RRER*?5c{uv*;M1pD)Om|Y!;x|%Vt{J>pn{M$S+e0rcU4&L`LIO0^#u9JW@Q%HlMW)ZBw`YCcRm@HXh+ z0>>P)dV|WqRv1CyM5Le<_zA+Ax)>!xm(;W;Ik_kvBhBq*DXYr3pvyF9dk-juo@?uJ zBV$g{T;a2oK?BsbF{*Qg5=cYAYN!QOG`MD8u;76T>=X$GYG@k`)fPxtYlhW<#`bF7 zf)4eEwY$dTc0|D06HPkGi=ng_uch$R7tLKN6?je}(}A*5eIJD>QJx(d*BXKbr$(th zyvWy_TyEmcHHpGYxDB#h$(q+!A!{|CdO@!_8HELBXdZEXM`E>5ItO|O1%=`ti3Pv~ zcfx)@kLYPdG@+^j^EJ0exe-uifFXv^++T=&mRYozVC8~0Si;*_F+D*0-RpJ%Er5lW zsSMy+6t!{l23`Q-)+p}lE2~FqFXDe>gy7T%45lBDv3do`z}+IwnY+tDKJ7oC74QKq zf)8A0;-KuhLu9vC1NF-)PxTg`X`Xgjf7mzDe9Y(cfFV|0a_uFhrEZ%{Ob5B6IZ0r2 zTJ%QEsRbM|QF>l#7B3UclmL>%y5d$8z%7ueg} zi_iVvu(x`AZKqe1E#*R_<5X&?E z(uxlBRB*E+#`@6&!O3C#p{&cQ_sG%4NFqSsiIrJ{QLi+BC{HZEdD6gc#%w@?V3A3M z2t>-htw_25?@Tvx!w$nFeXkJn^*U`Y5k$fHM~ z_9|Xek9&iKm{H**9YaAcs_@jcyBF}{`<~Yf)q;y)rwQU>45Fi~vy0yL)RpRA>!5zn zH`eRvMT^qSrRdK^r*J!#)Tip>MJDWHqOp%lg29tSlb$4+gcm&nrVE26^%v-$a9~EC z#9@V|BlgQU_iqh(O%IIohsKX*pyIR`mOlB3zIaTKF+;?$to@l;q7Z;o`y)6ID_KR4 zhquCW=CJ_eD4KXr53pVrX$PZtzWG5y2}9~|9GuA^6pM;Mdm^m4L|Lt%Os(>uC{mGc z1eSsFpr#6PXrdDAtMzCQG`>$PmK>`e>CN{?o;s6CWLz_Vub{&)xBCcqs@tmXnGq5N zCj(LwK(S)p%p@&$d$N;}j%np$*19Si5teP`M1cx*7_=uv$$^(=4y`3@_xKLZKpve3 zCh^nf2_Bhd3eM`+)uQI(Eo!QzFk!*;JM{VVIchc?14rYVbj-;K z9M&#>SwTgrp@B>zl}R;I>tA5-LP^&RqDO9Ue6+4d>+hm+{u)tgUsV)RG^HMz$_bpMbPw9 zGOiRv-zC-xkWYop%!Fc{bNakjkfzV`t*!$O>W$86IbAp5$-`lFTqmY7d?NRtI~O0U zeJz^vPPSEegFx*bVM1%ieRU1!&4&ku1SoW%0F*i$ler!5msn)C(z8|edZB1*YgCVe zfjCmN(#FvWse?RFj#NxBA!==+@f1A>zH1E8{V{?bfyiM>(R!3kFX?NoP)b7-Hyx5q zcRY@>>Gq%mkr+c->}T+?{vsAiZW_DktpSBb5%k@KNxiw=Uh;v|LB z^dc21RC`3Kb(Lu|>TXh=?NkDF!>qV9m1B47Wx?re$CxX#fYwxoZX&ln_B$;3s@D(& zM4-cpqIxaLse*l&2LgqboY9o2cvaWXNY@cu7D>gJ;!{j1okN*fXB3zhrkb=~w)Q*> z6c`OsNQIwfWu@V#$LS(980RNQY<{9u<}#Jt(j_ zQ&)7s6CfakUiTW|JmJDrEPR-QOdwtftri*5Lt0LRF`)W{w`xSA-selsp#oD+0zQ&O zqPlb&6pR)q@kq_IFhN8z)1WK^umKYc2g}?}yjwZLD%Ubtf{eA!sq1Rr6s@A! zwQnWw^QL;`5(Tp`RE8#k<(DxY@VY_kyh@&KLp=r~C}urxfvIg}^X)v>)&*1WOEg~@ zFe)KE!q`X*lh0Zgl?@&dM+-a9q{|9YqzeiSVize}m*iuTMc4&(mLC_RGw{2ZNqC7& zX`E{%1VGYg?ls$JEoIeMJS#cr(&SAeEwx$mokQP^YqY z0{C}aEv+W8sAa{diXbh8QNG_U{U+H#T)dv5ia@N;*NX+W7WI(WQ@dor>(R!E5=~yz zN=WM(zR06A0-N(OOcx6SzXQZzS`)GnE~x&0?f8Ff(A54K zuomUrT2k0o)(W=Oi`g+e3?on{DHZ958YM5e51CH3matSawzZZ9SC2EFr#t9Ide~B` zT_OtMCs*fzVPlEoiVA(oW5&v~$XlO~P$82byF6jmYLAr+vHY-X^LG^tw~)SZXVF#n zx0amo-rTooXOUXbpyu6Y186=Z3dzI+h-rPIX)#nrW)RCSB25G|1Q0>3WmA}$ArCGM zwbVQ`QPH6(fj>40J!{jTM#O8W1^^+J9a`YKnyGG9kG6LPB8X9(qrs;Fg3v7CVJgvDqzrukRGOz1L`R$% zRoOG667|q3%fBqp*r7qMf5MxY?Lv=TJR0XBt=*OBTMyypr;;? zT@Z@-bE{B8vUIFx2hOMkWqt(8C7kuQfP}Rm)ueY1IEw>JQQ)N2PW;vs=*$j+Qb&4+ zYA3LWJl)HRq`Fr-q?I_;5fgM;ibC~MVFd8)R7il%OEycnA5roWW=`f^cG3uQGP0D> z72q*V$zme0IHRLXxxyrso~P;?S6NWI#ggh8 zvckpg1L0@wJ6dHmEqa%)zXc(x?+PpAs(lyAUR+04*S^cT23=j-vKo60no}xRiLUv= z%p*O-k7iIk#(JwhmIfxUSz<_JZ`tOexGG;V(s~67!EgZI2!1*5Dkq;GdY8k;%#FEzZSFM6Ghm;L5 zgLYXe_T=XWyH4)^^3o=}&1cBU`c2feR zw)kV)EFyUdCE8Fa;t!FMtd$a%OzBb_f;@B<08~E!B7gN4-uC3L8YnS6VVTWOv0DiMm^q@s5OoZ2XZ&km#MT@;2jgXG3cw~)hz;wkL=%*#9{U>8oJ}*tze=Y)M5LVjHTX5P&tpOtqaEyMzR zdm-u}IdLIJAjf3P)@;3IVb0;SMQI)2s^_SkqO`MOlmxyiF7(Vs2Vw5S&{GQUX3&a#gZwceR|xv z0hRU=)eZo)lMK$=g)3Cc{dp)RCq@zb3wlO0tq08`j)HA0>a|ZB8H6{a4vqKxBl*og z!r+pvl~gJ(j}u*R{&yIJ=vEGRdIL6gLYYA8CIq-Lzm{5l6Zz^DNZ>-r(a~{$1k{*==j4Vj=V)jsM@3%+Ut#Sb1Zwm(YWD0v^o9^^fYSXQ znZ;gVWERqiD|(TOV($14c*th>ok=&gMk9&C0})*wkPKeeyQ z*g^)bBCOWQY5h1BE@57?R&2?Uv$K{N(oIjU+KYKd8vKm2_T#{f#}S^-`-1tRfNVoy zisUNXLx*IjKW2NERr;XM*>@bWU{t3YB;%faM^%3MY>7*zBtowq2?xlEcwCQ{^>`Sa zw$=EBlqm(;4Ku3Qouacr5e3PFSHXe$vS&DxkMt0JL#oqapv%nr!!B#*Pwkk3L%v)ML} z&c&P&%?^w%SF*Yg>0->C-C=~j;C7zf5zW02qr_-!*#hw-?Jt7&_q`sMoLj&4c+TzKPH=AkL!jFyE>kLkdb!tQ z9_y0z0vY6*?fK0&H?to{OKi_G z`|-fP-Wuw;8=AS!4by_!tu$@q7!wX=Ngr`+OZtc-Tik)Q8|uy44K;OcIN6#+%BV*q z4EM@(@6#E=#5s_R9`o@q=ufiQJDi-5wm!~2HgUZ}B)kOO$BOHdV;uKw$91H)BT^b_ z93-Q@BXcUIa@_UKCIW`(1j09YEY4xMMkmec(SIQ*! znp34}9|R;m5F}i02Nj@eG_ zr;50ZC{WXEpLgN{uKR!u@NEkq9Yt<8G!K%jvVtB_f{H(=$7v6#xr3$*wfpiqrH80* zdn$k)=K{=~GQ8$qRq(6UBh@}qYIF!6RZ0a47FT1UPemjf*8VQ5eMr$FMzeS5OgpsE zLanR5t3C!EBJ6YRVXd#tDKM*kC#!y6JvS#(TK$e5-;eMM&xVUJ%w5)$a_%w(lfh*e zcs6%iG;#hBJy?!1Zufe!_A}D>K@U%qvf9rhqUJ7iUxoEaym0WDw&~98!Ar*(2SV!O^)rNfmN zlGl-SUe|(p^aLS?#f0XM2%blT-}8qvE%s@az?-S9@kn8`5mBf8#04HVd7D3;7j?W> z)bVGEBEmu>@K&h#mr0=N&reZe`>`Hpcy#udrMKCB+dk8Cc1)2wh`S^6656u)SEISF zMrN-fk-EjN5)N?K4m}R>C>B;SU8xluLEql2GM6Cr5u?EpVQEC*D zP?f<#5(MJ}iSC3mT%b)Z4f9H9Xf}_oQL`sGRu@3EgP|v)b{bvS1wT#ihh^}i!qNev zkC#Sp$$CcG9QlTIqulstL`DFv6a{%A$rd)mfFXOnjm~FnXc(pasl*yMlj?%7h!#;b zArq$Q^S4Q(rprlgaz=;E-!_3TO%+*@WcqWr>JFT9mCusGWLzhUFnd6O>!}GRwyEKd zv#k;iI%AU6BqMp{DSZMX%x3TxN$C_cd*wsDzDe-Jr{k5>d4s78?Gm`k1i1L8WvRT0 zHILOU30;tKv7s<$sX)xw3B@SwKsqnrt-5XDb4-}l8B<9EZk!@q6~cGMlr_i885gfR z-T+?s4J-Pv-SgLhytLkQ$a+R~xZ=qQlRBD;swP(j>dwU40x+1M26X)j_tRy!Y~UP+ z_5=)qFuJ+|CGt2^aMew3DgTDR1R95Q94G5^3JD&96q$I2fE#{by@e|eOkl7h9rNwZ z9#7qb*ah`La}u1CU8&G9V;RDOnOGdN2S&+<_REg8H}mSCfTmL0@pJ9A2gY}{N7C(i zN!uCUilCJM0dnW+0?BqNKfUF(H{5%dH618h-2)2AIvhzttg79|J)AqoJ>EOVU1g#i zXS_Q_b%S&`gbNf0sW@P8^5Y7wee6n4;qTn0;y@6YiAmtO6^Ce`pErNUOoZZR##l%b z{>$vu&eBQv|i*E`i%!RiTvFNmeSajMDi%}#MI=J^! z-`!KIJH}(=s7?p%w)hq3l>a0ib=dTw0i&Pux0kBB37=jJeDy=dfjm9sXPVl;9*%ZSvC5?|11*K!9 zR|a6#N4z#A($YC!BAd>6PZz3J1fFXeyVId~x}zdAFOvyE$0oDwi@3rM_BFle(OJEM zYTS~)QyBTGmxT{R7_nr{RBd|E){;siJup}-A;}K2IPhh95tpYUodr7KGGFe2%eY-r zMy_E=!_8+qS4kt(!qUVeZ3qgYY)MOIoy*BhypAeV9_d_S{OQH{V%Xhi=1ZV7)B_;f zB~c#J0;;KF&oHQgKBx=^S1QVfGs)`FEAbtZQj$^uXi0Kp+vE@$UlLS9RP0Fh=!jVZ z#08J8^g%P#{C8r>yd{YM$Y_`~t!v;VK!COF(`phbxa1c1)I9jAMCXX{*tmfb?{V&> zlZ`}clqiISPMqe_xt$N(+cEz6rdz1qZSswy(mMBgC~%hw&5Ul57?~@On@@8Km8b~j z5pV~93EZ^QC9*1zGD>VY;q4dGPn7^@s{K6r;OBIl>E$ow`77gUchobQ z?x;s?cN24)n9g-Kse)VK@lpr|TtnB5FX_7zqJDN(+s3A9TbXyatLM8rps?#XTtd@I z!AdsL>^&V3#gj8W%@b~V1L$!M# zPjVo>59Z$o&0e~P(yLh3`i}mUkN?}`sQ$bEEPM(_KLeblU}z3)4ae>O_P-0qjvxJ5 z376=XPB3FlUfY^!?U5+(NLD}W${*pJ6w!+Ak>H=*BSpHvpBPXkms<<^8EP*J;k)bz z62d#rqgvPPPC38hdB(@d*r8&TWOy6}uX8?*eTVb}@`{c8-Q$pzA^JdmY4ebGGxI&= zvCy5u<IVscYcLs;i=Vhu_mqEpo^pjF$L<+&ln{x< zP~?0{A~}&5I@GOuCMuy9ADX&%o9>r(Odz@)Q=D!`MkD^9Q_d-OzkVn249eQbnW~zJL#a++3x1HZ*MG49w)Yc5e5w7HU zTu}r_?4n=YYlgythUiU!o|lvXVq3`>h{cC{>o!D*sRPB~K*rQsV7Tk&Dr*YJRksMR zi|}O^A|gVRDkeTq3*g=699#k6b`GrDVSL}coxGDJP#3$l)9M~kV@fP*5F3elOPKmf zew*@TO{P5dPUB+%gBE(T0Bag>ug*@bV@aI_2_o43o)X6SjKGr-c=Fl6lYtLA9oXIZ zOkj7X13QZj>>wem$hNa6tT{WTUSc)EtwD#UshV_oUaZdcp$P|uXSWMZ?x5K_Y^o$9 zX&z}0Fl`=19gh!ag2-eKq3GEiF7>R|R+k%db_aOO8Mu3c7oXJxlP=;UUPJR1J8GdK z%C0AiQY_pR)a3U&5X^G<4awkb{p zoW?YNJ9{#z!D$ykF~L21T1?1o#g90gj)Ar%qR<2DF>lU4(Vi`H2O@i7@4WIDYdGtU zNc__fIx8wycD7BGe?~Tx>NTE0h^fcPV9g$t-1(tNr+`A0aOhMNy#%W!FP-8XUu~0) zvu%?Y?DEr!pJwzdPk=5RP7uEabF&K=1{i@T9vJPjSUoWytB^cIk|t8w1h~oqflRvcJgjQD}?Mg{pZq@9YuaoYW2sK(Fv> z;R#kJfhiKV1Zr@&RW8Q1VW8p~f|J;ifnnBIkW<7{}(>Ts)7;p>;-ia4?KL@<1;6xi_%qp!YS(1g9uQqU+1o~SXC6gjFtkF&lMl$ zz)MJ4|6=t*VJj;()k5JNF?pTC%=e%C>Ao)(24uC`SNMzX{9l`XYtMIn(*57h{Ca=+ zoiG0Jm0$f2oi|_p@a6yh$-lic`N{ZK|K=|TH~-fgp8T6_W2?Wid-1Ox{k#9?5B{6# zw)5X^pZ!-Ge&fc`|F>9w?f<-R=YtRWzwysM_^0o@_>KR2@qa!4um7i?{_+3vM&G}h z`_b(Wul>up@9z5a|NPFBgj? zsGqc!{eykw)ez^(_*kjL5%EQKm@-Q)uPF&@^tqO{uTUUvZTU zsFWR+OiruUct2K@GTy3Gh*TLU6^oilXZ07c3)I&9)g>kuO!!O1GL#6V_6?bm$(OW( zer?N0{g|g z^A=IPBzX%;nP{GxziLo{t4ib|Wi(5Dd|G{3{}ysDUcB)dE};#&<&($5V_k_cB@gV& zZk35=ntW?`7%Sq^W&W?PHHCDur8Wz!tbag$H=&H#&Iil92YFG3?KQoW%wV6;x-0db?; zKU6|zfk(N&(qAl<1_sr)^pKD4q8cUYGFa>v8Vq1i2O125ASD&fsqsZ5Z@Q-X0UffI zrtg+X>j&c~&5D(Nj^9W7{nki{Gw8?0#)!>Vwr+fEsG#}P2Ne4O_F*N?w%31-&1R!; zz^EdC8D2l6h|QEZFbEZg9O`8GY`EC}OyFkDDjT4Q>N?|JW4}-in;npLTx}IP6xLHi zpCunp$2@xy^y5f;S<;zUBE0h}lg>YQzU zs#GEfdzG_I=xQ8DAK}i!TtnOd7Rzcuzv-4)G*YyYrXqw~_O56NA=R(ExiDIy0>Pv- z1YJOpI7VT1G6474jA50k(2L7RC33k)dioqEd?0X{dP-kCHnwp&>uiT}ZkGFtBg^1P zwHOqp-zZl=i6Q64>JqvH$OPM)j2}x}(;z%yXP5DF39T4IJR2g3(00fjz}fZm5kpxm zQq`knz=8VHon)a<$JL=IjPzsJ07E-KwGTIz%2=Obdn!J$Pq||<XnnJ z;5R2;IyLe7YhOR%8ce+OkJn-1rPp4bc>T{$z4Xd!6Q`z5Onm*VH{Lk$+NlZt-uU)s z-+ZQZ-+1HoZ%({&>dlG2IC1LKi8m&`dE(U6>o32_J#r$pwX1&a06|~{^nVTGOyS3k zih%g42P+o^h%PT~?<@S)SKmAlt=#|08()9v>r*Fw8^=GBgHqo-b>gL$bweGU|6{4R z&mfR6LSBG8YY5hMtsV?-bF4Gj888TsBG<2gX0p3hB9o|hjT-NHRyk7tJ`@tt^xg=l zRR^!$V}L0+h(OY~O~9;xY+x}S7+b*Gguc*6&gCy~eBxMXt%x$e+E*hdur90rfV`l& zLPI%)gj5TLD<{OeD2m8E06;`Bg`6s%VIel8w+P9ZAtIkiZj!)<7NaN;nEHXtk?bRi%3b)@cQ73%?c2BfMAUBul6LjN>$bPELlM*6SMCK zY1qZ0=XpJ6#uE5Ul*USHpkD4`P3JweVQK_SAn(#GdV1MT~)u?A9&;VG<+$#gb!*D*NyoO z%E6QZ#L!&_YTL)WD>BZ{33svC*A67&RzZJZSm3tQyo7z{Ww)5$y&o z{DdG+GQ@vA;Q|~w<_0dw)ip%A5Xh|SgP#f&Bsps)Tl01ZrW!H_Qeue2Ab3+5ltiLT z*y|C%Sb#yNd8{bW3)IrUSjf~Ow>&qJbf0sPfy5pTWu$Iw*``wa{FXIIAY$_<9^#e? z;0Hg2<1YA97ZN-Nee`^+=Q%#+XgcLczv@*!-DhZ9OG;7<3aV`K&XdEPx3B@EsNdHu zPSiBKiqBhsSojb8g$NDZZx;6x@Wr~Oo=jutfKfk(B@{M~j!_W}8#$3s0%_Vg(zLJc zD{ZFG=3bFGC?PAFxEPgc76$VHJ%QE?d)DF0$VohHs#F`J!3^$wuRPQ6-c9Qf=EU`tOth%t)o}nvR=6z}%*R9FmawuiKkVIg~V4QsiMec>r1efn# zdy$GQ{C;VXJSV9u|4=18!s%@BOh6R?v8Q2#l1uZeRVYzZ>{k)nfZQ#Ss8Mwt z`Tt1iQXQ{4*1_U1IX`pt1CaYR=?~!lYtRjYV$_4SgHk^Nxx) zDfPF1qu7Qc<_Q(B4!|$xT=Dd~lb|j~gl|=3CjfEMcjazrX?kUCcEV*%x%1g;+Tss#Eob(tS(PTWth20gr1F@ndDpSnQzM?a!1( z7!YKA4_SnBl_5A_|I8T2Z6iKN@d0Qb__j_`sq+^$H0f%G4!1D z(`mUKLp~M_yNB#{DsIP+|2aQ9emZAv$B_R;KQH-t+0QF}p4XGxG4yoKXPxTo-T)x0 zY)~A=)(pdfaf%o%F-Z7eGH4{K{UX4}U^W_@)EvJ4IIG_SbGRsjjxx@IbIMIbc0tPx z_LPpR@Ry}e!*jFxC8Ony9&)Nc^un?r!o{y$jSTSNG~DYFSga*yXJl4C6<^r*I1&+V zJ84}TH&LHZo3H zhIGAP4Z;}k(}fvnD=yU9TP5(KIKj5QwZ~w5$t+SS_dzgn>N|V9o~2Ff$(9fDXMUm* zbP)e26}7_+!3nPKbeX$CzT*;&U79K#bDmpya%X~qbcMxM6X*Jwb!6wuxaa{c4j`0a zIWwB)`2y6JH5c!QcZ@tBh_x0cO~&S!E5vx>28!r;<+h4N*PV$U;&?th@;vf*8kh`4 zOU8^uZj+=MYO_D0qLXR_$JIt!J4D{=``4G&Fk1KfPjp+5MVs2~-WA>b%-l#dk9bOCSWqT09;sakdP zhWKL&tM1(|p`pHC;&4Bn%qHD;GTEiUzWG9LUqhk3+)wQ_W#i~6su>o-2eaLRPW`wh zOpdIzbfJK*$RGscX2T7;8*R!$kS4)OU9A z8j3W}T&j`Ms7{AelBb?(rF>qcmU^EQOF|d}(Rrar0pI&ENJu=DEwf^I%)<3x?rGJT z)VFjHKmdGPM=FFebcIkN5cQqH#ua0MlAznZKL$Z3pTIsDzQmDwj~U3(rCI-f{{d*iOkaBaJo20=@BCg``*Z^}^_*Qv7v} zlz(Y8rVmP5ohwb`MK8ZiZdO)rY`I-1CSoBvZ(vkM-YY`5u|qQ*x{$FjmRFy(tf=5K zb;)7$9D^;v-Z@1N7C)1~ON;Q%YqDI~6wTvmCxc8SiuqR`GgMh-5Z>@lm;*u?E5|v1 zi4aZ>WVJ*XH3(TQ4id-(CB{3}cc{DYfS(5Vc*#Ohc;rybYhGLHN zVfQ%|P%1PaM++`z?d_)Kq_Vb?#UlnBw{Gy~X`0#FeP$P~`2#It<&9P~SrbpS`7uR^Q{ac2@NmIci5)Q-Gk?=W@DWKda8psWwES zy{gU3CfDhlp?1#V9+252Ns#Ja@vxNPz-0t=DDq|JfvE4cQ4~ukShuTVmsKD2%TixC z@?}8nHvQrF*ox`!@+8@cqxuEbmC|3-%FfU~f#m za>@5oB~F@K(sUKsR~6Twil9yCV7ceT@`%MBn3I+e$|hQDy7929Y+%Z(^!$Yfn4ziE z3>06QM-I2Z&PMZL9^!^G2gEHy3(P!i=77}B$5=WfA#+}#mzB8cteH`1E!VLIYupi% zqiZb{QM{V4!*PufM#s=j3WCVvsAqe?hF_7_!F=h2BkH8$;&>!hOsExy+P}y6B~ul@ zs)SluT0wK}E5S)nguCajsOPKiRYoNX%wN}_1SRQupj2c5Q5DR+r~^Gqj*h?=!voB{ zB0Rpr2mVp_a_A0ku!vm&-=Iaz7Iurh!E|;b+h~TmJ1Jpy7n!a=QFlv!zk7|9Ca|L2 zHuK)i6(OK0SA^)fjV#bR!6_|9z#B=@IOHcPASN_hGVc3m?DtfD3+2W&AW;GC1Bn_m z_CF^DfC#f=Cn?L}kpjKLvp0#ji2WP#CF2HiLBz~iZDW6rRW|nb^cKA;EC(L$r8rD$ zXg9ZXs1=8)oOpKQh#acgk>AYKR$K%UUWdzg=WfsFYk!1g1q*=XVWAHPKhrIm^BL^Q z{fKivvI&Bn=PS;WyNhF5E{*ca{Y1|iNAvG~dPahGf4s^W)G)u3!~qPQ6!-9QT@UA8 z)V1dZ*`!ZGxX44Z#&OQvy`_gi< z3u>@>$qx0>1*k18y}*qrrnbPA+Nx(QRQimWKPWx#W{bGl!vdtFS!)|DN+uVB4Kjl~ zo4+*xQ!0%lfWyW(rbi9UvOP~bo$7>io7#OzK2)xLn&svSSD9SG*$Y%QB$S-lr)yM3 zhI9RO0Ec=HLR7Q*DU!H^Q`TjNGxy2|s>RmE0@>L|op*_KG}VtrG%l5M*^tXtBpY(W zBMT{7M;T`g1y_Sp8ChLHB*WFXhN*zAVqxhy0!*Lo0b1#lL^h#U*fC+?2pN$@p?>6* z7XyK3Y@&hfRWv@C#(FYw#KsPkTfa~&z7S21RY{pU0JpGv2s!pLdRu6h^mF1Re1TW_ z7gA?X~=Z6SdAOb-Fe9?bk?-4 z7ZtZgMdSKfIE?zZdQasc9h@VV;;^)++YCpOW=b)g7%G#J@3k7jV}{W$zG%qief&gD`q5A!8IveW(^-QHpJCDofffa4s9;6 zLJI4>0Z`C~u%Iy{8;ux~&7p0jb!@ZTE^oM^Vxm9U4mRcy9IBz+9O$u&=8#4!bi6sF zCd9MxM9L!Opv@tZkSJbK1UnowdpbxhB{86~%n4p|2pJrUTCFgMRnFapo@5Q*Ap%gl5~bNOGE& zu3B3Nwe$^mlh25F=+Vo(-jFgQo+bND=qHAmzdN?Q+z_B8QkIhg3FkY)5XWShGF?+(7 zmRxBWX$1=25T52v3!#+nJ5>5vi2ZEodF{jIqMLYvE)LU#*bOXKv|JnDoU|3e0~5C9 zPi?@1iM@ab^JnXV;Z5&WkjDfuob*MGL^lnZ zn_6GbY5jO=LmC%`HxG;VIjLG2x8;ET>}VGj98qnlhmhz9H0CQn z%3X&}i)>JrHTOr1ji_#A=L|f`&qJm)sZD`tof}-I0Iub6?T-+81d zIQNI5+1#nqd>Czg>hGs4vpU=0tB(1^A>3;6Bx3G$hwWwARc2=npt%>;pc8cwHT3f3 zI+-r>0VoiB(J9K}ML~-}2z#<2SC=HZ@7NauzsYeMp)T zCze-qnYW-gcYxnQ0~G1B2@D0fL`PIZ5OmTal~;sibR)_iQ*^|JJOlXHg8nqEqYnI} zSCsxh{ZlIpvOI2@qwIjpq^yFoCb~Jr=tPp}Up_*et^1G^X)^rJako%($s|zHQ1nlL zj2tzyZeHS+qf7iE4X()`#FvS%d8m09F|F6u;a_A@<4*CE1Azv0pd zR6ggB&rNo&*-Xg`f8E8Ly)a{rNp}VDiiFAxKAKmSSq#FJ4YbBK!S0*)L_2|lAG|dn zETP`xL(_KHgsV+PdjT_X@0oMruOTZ5VsDO;dySHyv`6<|sw@hwm}!)e>AfNXq3RQL z>(xwkb+eA9k+kTcD|Bb%3#p^i!y)3nXc&R)pdK=a(38>Nms_yNw{v_VXjjFZL;_fZ zmFkRtXsOmbQ+`y59%C6Xx?vNeMm0;{dPT2qMGeRYE1860I3#y@od3!f&hA*-$RFiX z^BPsxYzAH98EBmx-868~J^vQkn&xQ@GgHE>c_wS#!BVSvv7BkIk|qbexk8j~I;5_3 zsLK}4P7g%g$p>cw7~7K&hU^82kc&;s1JZr4d6zRD`~l;zLp}nl&2xhn)5ImR)%uBj zQEPBrC<`GIC^Y^kdrQkqsPV8pD)t*OXOC!ITDiCjf5noINuZU9HG$$ql>o~n(V zq{Mxnj!gN4K=S)GaB$`7ck(gz# zy-KS)E`wvuwE@Elh>w6h_bgmh!pA}bZr7Q%a+|9mRLRzLenyz-dlFiiZjv<(XZTET zcSrr*!NKRG@cglzlF9*!H0F$V)|1}_O>z%u50BxceAo`>{M|FkF^6mCv`BHvLWARd z@Zf23v}6vPZfMe6z%YG5{qvNb)+ax0#754?B^+v%lWDumo=lwJ>y$A4RPpS=+Y(3T zK@hdh11-w6A~rY)RL)1l&V&3Nh@0ZuUZL~w)1(rbS>EbAjHqF*Xa#$VgSoZsgYs0Q z?CLq!-&BYif4anU&F$cs@O`;8Oa`aVi?eAosj)GjNH>h9eFg`k<;JaB^vEFExI9O? zbp>D~Gk`aAT6Hm^Gh&P!(@%@6z^zfTfRJjdd?W9SKJ5kBkC}h+0!&Y7v->N}1lSQT zWsD9BO8N{gw<3Q%JRH$)v> z33AKl2QJXdf~_*DljY2ueeW}xhw5Zpxl=}ZiQ;UObOLShgV4AkEc!l>jG^sR#4;Hd z8e-aqAN3R^_>%k2gqF(UBf7}IJ;=c4@-}>m+GoRk4V{NND7A5n6CfV)EmG5Y!2Dp@ zM_PnUpJFK^L|5hw@OSI{j(IPQYT&f8*04P0a1Dm}$7ZsSk6WUqFer`J>izhZSHcWT zJEzYaXtYM57J6!!i6oE0PFOub zXy!mid1{z$%Jq73G0*gx87AawK3{sCn@ISHj%ittH9T$)V;)rf2$J6TN>;y}H8xR( z)=ySLIvSglEyPcHKRH-Pf>Xu|0Z< zD9UJQDAXA=4RL)MJ!H~awhmHP3zahn8(3!DQ4Q=K<7EmxEK(pqGo1H{zfnO*i}ttR zR903hN#GGrP%n$pw>I$uZ9VcfF)x6dY(l{m-&#v0siumuhoh=W$C6SgWF$b*r0CC0 z5)WFNpx_LZ_3oxYqFKsP^pJG{nRyb1WT0JSK+8fH_-@^ zXpfpQD3u*&n*{B!LpA1X7GVD<7C7oLp*6_qH z0pKRxYqu#eZUClLO?AH1mhUt6bOBduO2Z$**LvBwJS8+g+rcwJp~Lz01G$$pS9D0+ zQP!H;EMgInvlh!4;mqIck|<=mQP_lsXItuMrd8yUGN~^7ZV5V}l$yK!Bbmi@Xmlj@ zUkju%8D?5$iwjYzxDbH=yOp;kv&eD+W}=jc$&oj3nabUS#LS3UD2CzJ#1(*9q*St2 zRRWZ#3od;O3kNkf#V#EC&&V==7eB4#RgO$+y{v`t*2}5o%LSH;zhBzG+GhmkB_Si) zIvWy8swow$`TVn)YZw|KYzs!kJ@@0dp40})^sl!{bH4(TAgJi_#`}bAEnzegz*HJ| znWh$!Epy=Di&T;qEI`H2Wo-7kFBvj6^t5D)BA9_YMb%89wJa>4S>i_Iis_!bPKOkR zWQV+3$-b6BOIQqoPHXpOWfLE24=AbZlwP~$Y;g`4WDgWb>t!Q+tlnzLdMPKs^ayqo z#sW)Bv10b@J_92NHSvNkoY42zd4gwG@?afK^M1oY>N5nk-j{G8AcU^XZ9>6d_Aq5~ zG9{&erdu}klM$b%*6=OB5eX2+MF7DoLOmbC8rj5ho^xXHgW#}aqD>A1us-{!1P1*tEuLWQ4UVFh5GzNnW`g3PcPl@20OCy?8d?dqI*?DC3kCm5bC8WQ+ zL1exc3^jppm~)aqlb4rNnc6G)V&F$ok8IOYI_V#~X{~cv3+oDKoiDGm)eMMc**g~7 ze~a7dwLk06UU}{1*Z<0!=l@tUJXBndy4G#BW@UBqxUC_CROf!018GZG6j4~geW}7qrbwfWaDF7u%1C0d4xzd!vS^= z^r9ZzaF*B3eeqP!8QCNcl4}4!Z4|y4(KhM*Im9AfU_a2?nAs0%@t9Bf0L~ouERQTB zWh(Jh6KlE6X5Kp$H&U zr01qC;r@bWUcUT98$EQBoOgUQ-pVT+Wreqz>HYy4x)HGl9gTlP{rc_T&6;mWq^Nxj zf{PYJ&HXh4Nm{4Yb)&h$n2pG0ymdQ#+B;c=+1!`x5l{EtH*t z)hJen5mt<>QrR<6V**CKoG`^>tSb`2KsY)N*hfSJE7zTx9JT)Sgd7pRB1e{GdKt;K zgapJ$J!*$~G<>9Dl`cehhAJ~fmXEcslhvP;KA(`=>lk?%SyO6O|1?fjM83|UDd&Tz z2?0P|iyhCrQO6#aR0q1En(aQ6+uCH;lqrAIh6<@pS`L}aI(Hy-9Dw*Bb)6I^YDPX9 zn@{3fg}Hf?=54}7OohB?;ZpKcDVyeAjSuK}&)+H(jNL>b%GfiiOtpr=)+<_5`Csvs zF09PuoYs;8ez+pQ%!f_i1snKAbVNP&Tcxy+irg8pM++Lc#1b=O%!Hu8$r|fmXoG_g z5$Hk?Y$>?;Ho>^=c%#B(+wq&vQ{g&%9x`S>Dea)GB5O0-;U7%x&SUf-o`Y~eN^NPg zzE3JfRE2y&%{jwTS3OC|6v|n&dhE!?W^?2KPu!9|wh^WZZ*xTsL?JTjB=MjpxLkFJ z9EGKk!W!pHH)pmpql8w}W~ovvZOm+k@2a6&NwrEZ{duR43?4BL5RYKmSJBKtd=p|r z^~A4kOD~OP@GWs36v;ARlqQmE4!7};mB1thlKP%GFX2`{s^W8EW?4RliX%+k(p87B z2%scs11-L8^pJ-mD)H?ovPqD6NBx{; zz=8u2lq=RJoRsF6ax1*c4SK_ACpBDNxT0>T#nj~oCCM%@1_?0PlD*DU7TtJ*Oc z>#!6e$PfpBcchG9X#j_Oj67QI2HcA1?~{D5GOB7OPv@M}^rRERu|i(zu#--&5_}J% zi^oMYpF0HPWEPFB$4QDMb`;gLq~gKArqRK^0ZkklFGzq%mLiy;S-B$6ugcX(VxBYa zK={NY?GVkGd51ZgcDZr)YF#>oCfpF^8Ah6uy{Q>$sX_CviXzzE-0od3Vvq08JzQfPP616Q@Hz5&nx#V{TC*(l0ne1l2yLy5% ze5}?Uvtd)#=nB1;Kdhls&Gbic$dlTx!v{{*Vt6x$mDBEVj*;r)W^FEr&i617-KPz#htvo|3-0;Hi8PT@)S@ zGlmcQo!teXU%tJa(27cgP1-0?sX?6OPwK2WLLREgR(mM_5`vJI>(Cz3f)zGXyhT#v z3w+1e;g3_2mDtj|$s$q*>}wLZfy1GCnbSS}{bB|&AVDVvMSuE;mljNnL$H7707#;- z@QFrxdj6!O)zj~(vl$KFlOiHG5YOo_ptQ?pID8-)RQrHzpfc@U`fBe|XXx!&mfq?) z5g;Tl?&4G%cMT@1kM=Isb-Zxa-UWLMlaKZ;gK1aqGepPsE>)?$YlQLK-o-DEEwu-E zpaUigX?^NH7O(XzEzLz$18fS4W9;%`+e6kqBsI$NyS7n;TNMetZteS&sS0mXe%rXb z6Jt8sxJ`ycJ2swo48QkDG?Z<>0Ygn*Wzfl4rI$!M-_qCjt_+n`nlK_D z3XGX_{@6wg*!p(m!LK6XU{}=Ai8>M(`^Wc@&4PI6>n|8cx)M zNe-t)YdoAzU*3V!zWN)|R)*M350V2bf%*rR^YDN_w@=eB@#psGZPKB-Hb#Irp(77W zU~X%gCZb-6Ee4Tc$~kJ}%+ms7Wvz*TyBfD=tHK1ibIie3)n1>WrP`PfU-3-KiYvW( z%0$;(lOpac6+zT2%IA>S@2W9sf$>6HL!avtN5o3(@LYlB*rLL3{AD)7{U@AMvVb7O zl`L8qvP)l4jAnBS!O#{qhN*d2mm3PXf}~n24h*E10l zs?A;#?#y1>0W%ITD&C4Dg6uy`YVa-^npZgL82KRYg2jY`wpHRPNgCA#S%svFkv-8< zLG9DMbz9*aSM0HjH1@fqzMyCG1UOeDcPsFM&C)n`d>->Ow~ZD(XnGBB!WHllI?z60 z&XPyX((jZsID|h-ycMAHX~c=OZlr5IllM|@7$^ty1MRE7W1wk?J-6X=;uT-1w!LZe zf@alZ-}6@`I_Cw^cyfa;RJgTh6rF$cPqfgqqE;lON{{*VYLjObYUJ6mto?*m_VAT< zk~z1hG6iXWEU_$ZO^q#hKd_y%aUje~RTfvM%9da@*=CX&)pJPJyPR&Y4-d&1EHB_$ z-oQC_NR>wwC28*;~Jawy2Vaa#v;)@bVhJTrY4hk|BV@?pKs-m`^2ErrP@ z{Yjri1La%@f$6GF?`7G9t50Xu7V%)U0#cH15&$hyUU>rrN@|kyR}0=_-fK$_aU_K4 zmpa+4gwxOJGypStmC0gGxJP@w91+YibSiW7dC7ZTpsUstkoyBZc3ehdA<}H74ELv* zz+&Gj@sG2qVw+`r_39x}Nw}_dQax)(AeUob@JIme9tbfal#6~n$n}za$_5)NWA%ch z4WI&QUo2ue2fkG@02Uil$>S0&S+?|m%Tvc&H&ru+fR6^->_8f9vje?d?QN;%gq?P{ z&z6J}8td_;5tJL!w3o1EVN|8UxoDCf6=a;{(Z8s5N>?pHU1>DsQr~5}dqH`0a<|O6 zT%4uMB?f3O3VflQeG9P-o^?{|LmIm8x$*2v>A9IPzLeHA1r=towwY_6lmcpYC;Y{z zR!K|)ZVPzzMLWe>^##I&V@%@rjr=R%mVa63o|PsvF3>eq!6X_OXyCUFc%_hf>O@o~ zfeX@H5<6jvOh2P5J-gsYHX-DJWc7b0K8jVeXy?ImV~*y>3f+tEYk z9CgcBAZ$TR5C z&tsdBmz}dW?PV`HmIjA@^~ZsG6uG4*fRW3^Z1#${%RW^xk0Np&jHWj>W(VMiLVE@c zvwMSG`&FR>hSo_xr=;Fvktr;&ba05lOVvfN>8vzHdx(IvOQ~w=0tdYSP6h>f!z7Vw zgIVK;905wX+qi0#zSI5576N}DC!-$X8V<6?5r(1O5aUuYH1eAuj`!i2e`$RtC7Hc0 z+6VtaE_4%bdfuXinY}biS1N-L+@;L3v#3E2E*uv+=!8*f4*3%bq-N)>6coD;+)((X^SC&OXc?i|O>k z98kM+RFI&PWDZA`IH=@8x7kJE;p{^kd6ZQA>>~D0Ib4_PmxL?&6}6{%TJ*tgD0=`5 z@Jj!G5ap|;R=q6(-j|TiI$Qxus?nT>G)|wp|7j`H^cckgHIf%*U!tsP>SFkT1iK;P zQO{heShQ7vgtLd6Wt4808iw_|zeL%YT#k?ByD|hPV)^V=>5;m0_P95zvb2hYWxdN3 zQ4XWbCV?qxq>4xca+Q(Vu-^x zIsHQFy4gn^^Me%nHwAw}~o8ZMRM@P_!2GqX9X;wV*y7l1Za8&2} zq;sO{%rz)ktelZXGkrP+`jOuCgVHj>W@u#ahW1jRUwa9oZ~W;5b6GRn+ID>;)PVC6 zRWgz&)VF!X);UzEg?;K>GblmNP4`>LHPa*Tm?jc*dO(oO5-3C3WfVyA1t`qaQKNwz zAZgS_dRnd`*IzF&fm}$&_1l(B=5&B6YPlQP>|=C8B`(_LP^Mvh>CW-8&L640uSGv! zq22hA#D&`Xkg&%p4_OC?RfxPr7P*4E@uO#Raz=u{>{A+S!RHRQc;PXptAep(fPQ^| zbx=0@wzQ};dG_t-V%9bxEASAp;W?imGly+(KgsFcV|KkQm(;+z3tUxEox~jI{`d99 zMBsg)2={*rQ9clyxCeR|<_g2PrQh66emeTvcYf1X`A&Rp05{~K%jfna$zpELXRQJg zXP?`{FAv8V-IIHuO_Rb6Pm2MH9EVs*$eP;|D8##K;@b^&F%T! zo-sUG8L`1TuCi8Y07p#Wc+^WIGEb+Y#2d$%I_Z=R!2$ND=Tj@N-?uTz2fDur2)$1i z20%X$0wf>pG7utg!TJY~8;~F!1^9<39I+Dixym3hOmmz+p(P!Y?bG(5#!tLt)c6T5 z_jltb>IJ?SsqVTTRovpEuFi*On+bf6!N}P~V8?y3I?KdH^Nse+;?~l-Z0>k8KZGly zc(SpO%|1{JNJ)rQq^v9_eJYXy%ezt8Qd-aTy|^fbMsW@MaD|kc;H=7+vYXYU9{vzlQg`T`gZga1a zCq+pLX>ZROA0kt#6fSy~f6XRqjTgMftH$6)_x|J1O)_v?AV=;Kk5>Ok1h)QDBJdfL zx!F6e@!M`7P>=Uh=hpbCma?kvvTBG9n{`VT5F0-gS6~@)dE_NAO2@)hzax4ja|RaD zzMr1^(r8CmavKhV380nGr14RV?#4%M(dBW@4`v842C~}EQN#b8e!C%Ox3jq`I>Lq` zzAL6&`#B?}_H*rCvOBu^=SI|@nF!Q==8w2EsPS_)XtMrvi$p);$5K02oQRJ3(^Df; z5r(-WRjn@8eg-V4%578SOmoCoh=b7Xh#t7jqz)wiX@wJ!kc{a!>D+;mKvZP3LA%vj zBRzM?%gSjEhA;fi-5)c6DIeVUr5aoNM9?BZ;}eQYuDGeL@v}-^x5h7_I;v&t%xV16 zZT*#w!7BewNi0qkY5XiTrSZ!YJ8MwLF9BWSlfX*gP|Vf=*sSp@&IW?wvR(`Z{fZc1 zDCEZo#d+vB6@HA{H3D&;s-0)%qutj+*5 z7`X-kKUS0_eAYC90?n5MkQs+d$A$1Ii=A*s9oKV|@80G1DsnIKaHTA3Ax^< zf!Pvue2}Fz-!Y)2YW*V=oq$%4a8m=&O3pII9kBbTqS|F;Vtv0Rw{gZ$@(|mnNLt2w zf9Q1S7p}6WgKxrr9_tJW>DV8KI>fXZ;ls+J>P6ubnzXp0o?RsAGI~eT6wdOYB8Hqu4u}oPrLTzb@X3G3ch0kuF2${&JoL z!CzUT%y1>f%q=>cFaot;3LG`;u=2#cc#(v7xL7BJt&;&FfhMD=L@qj~IKmVZMmX9) zsM@Lq0}+IkoDi@x!OsJFLWW}u6qo2A#Eh$+&|%R@MuHDNQ8}t!y};84qy`4>_ zFQ_j%y8_{HNX3FyMjR1}Qe6rJ?(8B6XG|_N>bnz)Fw)tP(6+OSVcy-UvU>Y%J|ikP&<<2!~1u{E~Fa;iwtLmtb^OyQ3h%PDZNOKCR}gNEVkR^>NQ9Q|qk0 zm$C&fBqMISWY%#^mtG=C{QG|*^1F=dX4SVO3Tv-#*7&vlQn|lZ%0Pc=l!jxb1I;1! z`KS#&L*v&PQPm|wrLzYT7~_OcxN1I{p@x$LeO9N~5z=9Lp##RV`77Bx$aE>I7w`|2 z4gTt++949ClYmI=tG{VjA(mWHdOlRl-kPBm!(u1y%SdMRP0#gadkUHCDmA4&e0D7ICJT zVuoQ)rhT!DHQo;QDz$d*bgqDhSSw{6iAl2V_cmK^+rhwsYNL14jCM6Kvd%)*!6r_U z53-`7g7R2o+Vn9(T%{{SHZ3EGepn`#!nN`#DGwggxx$;l?5apJ+p+bLKea^Kxw5sC zHac|37)foBim-iv*Oi>6UBQ@;`Rg=w#^4*Sr#fm|G(X(WmnxEUeb*Q@Qr}%sJACMz z>`Ad^BXLX=Zc~B{rlMZci;Q^5#4z04JulS>r3Jqr3pN0jM}SLa+?~v0RQQ6F-`P0FlfVD5Un)thI+dv<%_< zVpP+MCfqURT9_E{-(4sZ`}S!~yOBse_CkQ|OyOq`F%P|hyb2LK5XhpX?Z@MEy=@P` z9@~uwjacChj^Ja8H6Mf6Y53?BTtrNudok-?$$Wo!@i(AD8h+_VEti+qG|jb)N)}#1 zcuE%uABCZJMfRxrU*JO=o!85)+0rK3ANF3owFSdF={8LC zIP^iQKbtZy60 zCh5qL^~+FK9RLF4A@Y!V?IhsXPwgZD$Jh-a#tt>7@{Doa2B%xz#(iF(4yp5Fx);;1{5UvYDIMfPiDJT=rZEu9T&ubxb85W61OUkD#1)qkp0M3>1Erfh?-LC z+@U=K%HvZ$q20Ohr4$jD*ipGiDAHejSBi+*FXMilUux7e{?3B%F{zT;N6;yW#v$T( ze%1!4-R;GleTC0+Ip@Tmo_OOgU-|lpKYHogfBgC>w$Gk=<+Zm?ymh}bWh6V15Oq* zK4?mJN?s^Pv+fx|sr#zFok3i_+kIIDO2yhe<=+(J)p<@uo@6j3k(zZwJJUiEA3CLL zDmH|p`6&K&X#>PlvKsV&y)M2)Vw@;WSw9%LM=q2h!m6R>Ek4~-RtD-gV^+F21`L5o zhvJFHi}7NoSvSZ-LYnOmf7COOMKWBYaxMV@F9mBOmM)*9CGl*AcG89&?zS!eelsf z7$=ZJ0wKxo|ElL>6_H$G$iXu`J@xgfUcGwt>ecJ&s{YS;?ulsNUsDW~Nj6e(C62_D zlqsqR-)}RQ%W9U=BNss?1x-6p#HyJZCYHoN*$R0?3r~^MW)$eM{nX5fkWyvRiS&+a z|1D7Mo28)t)~TT#Px3U=L~W`e#X6JG=xb7AnAP`hYgW&Le(B{jj^?1Bd6t9*8FNAk zzxu@Un2#10(;4UkL%*jL%w|HX{ykJ>&xrkd0kRPO`t{K7VWA#*^;zaAwl;0t zXJ+T?$y&s5Yt|Fc5TAvdvia?Cwv*&4HjB5BY=4;9c`(BvSvGW?q!)qg-*Rj_|wSC-rdnBFS8i^Mn_e4hg`XwwXW;9UwZRK^7X zIennOkr0;5rca~*Wol|ugukG`O9pE>;TShr4&Wi<3(jVe)Z&eAIE~7^Bho$43?Cow zOUWk|7!ECSbRrg%(CjRoSHCuHdLTxmUHcC-;6pa3#Tj490B|WFRx9H$x!6YGI0o1L zL*wfHL-i5(i*Z=l`Mv$Dl}5`Z)qI(?grvUZcF&$4u3|MqkZGbe-rMp6-|o;7Sc$CR zf(HL&lc3?)$cktwQM?(UCoFg9$#+(`tPnQh^r5^@c4wVyUud7+-$y@lTr0#F|*`yF7SKwAE!zDAXYeM{b`&Cj;M11ml1_ zGE9K*V2*eW+MXL0CpJcfW&2+X!7+!XHXy4x+?;aa8x!qtHwQw45j_>B2llpp(xf!+ zOYxvz&+V{hojr6M`DA3xrj1N%k0@pw%(Tg7-DEv%r6ZjEZipC=n)Qe{0?3N|ey66%+4`*(^JAfydNhiP&eSbO|^B>Oad?M*GA+-bn zbD7QY_Uto*pP`>jv%HX_E@rmBu(|6rq3WRMtOGr$;|_6AC{M5z;S;&3BU6V_A_-xv zwI%anF7KVZYsCeA6bL(`UWs6)-7KZ%(xX_tONecb{XXeVO0JniHWwUtIZ5b&QK#0a z^P^zTt3-=A25)kig&iU4u{mW0sdW4!Ovjjv;PqCI-tC0{*q+{Qel@wb*Gg1b!IFQ2 z+g2QGgjrQFNXngA8dN3~84t{=WTqM&V(Uj4NYUrjfv44`w=(?Mz=fW4*BA|6)5L)w zb!Az_O+3B}6Jk-M+YRnY5zCklZgCdIsE<1S@yRD;=YVzDQAQIj7Rrcuf6Lo50Fs&E z{VP;&TT~~}?yJt4ITnfg{e7$&^3EX18PgdJd?HxLZ?r={9PduZn=P7vFfwuT3CGis zIR==w|7wjuG{~?TfJ-$~a%=NU(lGDw(~RxUCl;&kX?CUB?oBQ@-}9DnAMwjWC!g}| z>ixbngHdUsfW6Zx8BW_nShcG)sN8;?rk9&c%qATOFqjhP3`Ido-_mek|9dR|&59#R z8jR&`aV+&lmWovNGQh3bwmldy+Q~XFL?x5PL#h18zvZV6bW2;*Ss5Z^Hs=%Ukl3R! z>DJWfjgX@Od(*vjhWeFXT6S6`kQG96Kjha~=Z3R#FoG2l=iZM=%lMCJB}xDLxA zy!{2IG3eR!&fi$T#+?&Y;gm50`_(KYKkD2>xz8|b**%(@2+26za6D?uLD?0W_5?T=P{!PbglQx{~ByBvHQ8ZuFww zRzB_K7oK(Q$(-Z!QqEmi=&o<|+RH0xzI$U0MDoofjoO{0nUB)^N}8@efBJM1ciQV4 z$$YoBeEN-La%-=RbG~>b-{~$pxAW7S+xd|&nqNvb(z*PV%|@pk|1jA)69mOD&?l_f zU)}qHpb``-%cZbTDk!Ce%f+u!trwD3p;j!FYV|^+UTZc>)wop;!=P3VONB6L z1g&zTQj4plO4uw^!l==zB~erhgQQt#mdn*vwGu>yq#PAWty;5HEEnRSQZAIrNl>jO zVUn~eVYS?-1;uhbuGVX{TGA+jN+T|m<5nXm){2!RDMmpY$IZAIlq!{S5;sc`NR%s; zRw)VMq#nmnqtUE~NnENHgF>TNiyDQv)+C!c?s~lx7K@EmlX9aljGDDZH4bZWvsfz! zg;uLdc(c_^s`YYGDV7SAN}*71CN+rrD#U$7bWM6+Q}%yJ*{PhHQeR--Cr9TyaQw%; zX#H|`ZDg-mTIqFfY~;3oGoRbuy}CsUtj=Fe;>}(=-I~9W^j6y&>b)DIz;W2QH0`w; zn`ttaU)_kiJv!lBe%RaT?E22-7dAWTW-mFjmTb~{I}^>j)V-dpooQ67Q8_MG3UE&X z!+#^Ubl}+4>+N-NYPZ_4b@rV5;Lp=m58eJKcYfsE=eR$S&bikYy1m6t=Tg*ObB1G* z%r`q7gZSrn$m7^P;Q#2!S>kUxx4l1^2({7Oy-G`sWCqkUp+*S8F z_ZQqNxGuVv-DUh2xu3_a&qoKp{D&j=oI7Ct;s5u|=iEX5eM}a>-y**pxkj!>K5f@= z33;x$mg`!g=L~9z*oe>#;v<)mu8Yrqet+e#7Im=D;4CohQm}|iFfEuSQQjY?^z*K`077@ Uns!Gh<0RR91 literal 0 HcmV?d00001 diff --git a/Libraries/NGit/NGit.xml b/Libraries/NGit/NGit.xml new file mode 100644 index 0000000..a587235 --- /dev/null +++ b/Libraries/NGit/NGit.xml @@ -0,0 +1,45097 @@ + + + + NGit + + + +

+ A prefix abbreviation of an + ObjectId + . +

+ Sometimes Git produces abbreviated SHA-1 strings, using sufficient leading + digits from the ObjectId name to still be unique within the repository the + string was generated from. These ids are likely to be unique for a useful + period of time, especially if they contain at least 6-10 hex digits. +

+ This class converts the hex string into a binary form, to make it more + efficient for matching against an object. +

+ + + Test a string of characters to verify it is a hex format. + + Test a string of characters to verify it is a hex format. +

+ If true the string can be parsed with + FromString(string) + . + + the string to test. + true if the string can converted into an AbbreviatedObjectId. + + +

Convert an AbbreviatedObjectId from hex characters (US-ASCII). + Convert an AbbreviatedObjectId from hex characters (US-ASCII). + the US-ASCII buffer to read from. + position to read the first character from. + + one past the last position to read (end-offset is + the length of the string). + + the converted object id. +
+ + + Convert an AbbreviatedObjectId from an + AnyObjectId + . +

+ This method copies over all bits of the Id, and is therefore complete + (see + IsComplete() + ). +

+ + the + ObjectId + to convert from. + + the converted object id. +
+ + Convert an AbbreviatedObjectId from hex characters. + Convert an AbbreviatedObjectId from hex characters. + the string to read from. Must be <= 40 characters. + the converted object id. + + + Number of half-bytes used by this id. + Number of half-bytes used by this id. + + + + a complete ObjectId; null if + IsComplete() + is false + + + + Compares this abbreviation to a full object id. + Compares this abbreviation to a full object id. + the other object id. + + <0 if this abbreviation names an object that is less than + other; 0 if this abbreviation exactly matches the + first + Length() + digits of other.name(); + >0 if this abbreviation names an object that is after + other. + + + + Compare this abbreviation to a network-byte-order ObjectId. + Compare this abbreviation to a network-byte-order ObjectId. + array containing the other ObjectId in network byte order. + + position within + bs + to start the compare at. At least + 20 bytes, starting at this position are required. + + + <0 if this abbreviation names an object that is less than + other; 0 if this abbreviation exactly matches the + first + Length() + digits of other.name(); + >0 if this abbreviation names an object that is after + other. + + + + Compare this abbreviation to a network-byte-order ObjectId. + Compare this abbreviation to a network-byte-order ObjectId. + array containing the other ObjectId in network byte order. + + position within + bs + to start the compare at. At least 5 + ints, starting at this position are required. + + + <0 if this abbreviation names an object that is less than + other; 0 if this abbreviation exactly matches the + first + Length() + digits of other.name(); + >0 if this abbreviation names an object that is after + other. + + + + number of hex digits appearing in this id + + + true if this ObjectId is actually a complete id. + + + value for a fan-out style map, only valid of length >= 2. + + + string form of the abbreviation, in lower case hexadecimal. + + + A (possibly mutable) SHA-1 abstraction. + + A (possibly mutable) SHA-1 abstraction. +

+ If this is an instance of + MutableObjectId + the concept of equality + with this instance can alter at any time, if this instance is modified to + represent a different object name. + + + +

Compare to object identifier byte sequences for equality. + Compare to object identifier byte sequences for equality. + the first identifier to compare. Must not be null. + the second identifier to compare. Must not be null. + true if the two identifiers are the same. +
+ + Get any byte from the ObjectId. + + Get any byte from the ObjectId. + Callers hard-coding + getByte(0) + should instead use the much faster + special case variant + FirstByte() + . + + + index of the byte to obtain from the raw form of the ObjectId. + Must be in range [0, + Constants.OBJECT_ID_LENGTH + ). + + + the value of the requested byte at + index + . Returned values + are unsigned and thus are in the range [0,255] rather than the + signed byte range of [-128, 127]. + + + index + is less than 0, equal to + Constants.OBJECT_ID_LENGTH + , or greater than + Constants.OBJECT_ID_LENGTH + . + + + + Compare this ObjectId to another and obtain a sort ordering. + Compare this ObjectId to another and obtain a sort ordering. + the other id to compare to. Must not be null. + + < 0 if this id comes before other; 0 if this id is equal to + other; > 0 if this id comes after other. + + + + Compare this ObjectId to a network-byte-order ObjectId. + Compare this ObjectId to a network-byte-order ObjectId. + array containing the other ObjectId in network byte order. + + position within + bs + to start the compare at. At least + 20 bytes, starting at this position are required. + + + a negative integer, zero, or a positive integer as this object is + less than, equal to, or greater than the specified object. + + + + Compare this ObjectId to a network-byte-order ObjectId. + Compare this ObjectId to a network-byte-order ObjectId. + array containing the other ObjectId in network byte order. + + position within + bs + to start the compare at. At least 5 + integers, starting at this position are required. + + + a negative integer, zero, or a positive integer as this object is + less than, equal to, or greater than the specified object. + + + + Tests if this ObjectId starts with the given abbreviation. + Tests if this ObjectId starts with the given abbreviation. + the abbreviation. + true if this ObjectId begins with the abbreviation; else false. + + + Determine if this ObjectId has exactly the same value as another. + Determine if this ObjectId has exactly the same value as another. + the other id to compare to. May be null. + true only if both ObjectIds have identical bits. + + + Copy this ObjectId to an output writer in raw binary. + Copy this ObjectId to an output writer in raw binary. + the buffer to copy to. Must be in big endian order. + + + Copy this ObjectId to a byte array. + Copy this ObjectId to a byte array. + the buffer to copy to. + the offset within b to write at. + + + Copy this ObjectId to an int array. + Copy this ObjectId to an int array. + the buffer to copy to. + the offset within b to write at. + + + Copy this ObjectId to an output writer in raw binary. + Copy this ObjectId to an output writer in raw binary. + the stream to write to. + the stream writing failed. + + + + + + Copy this ObjectId to an output writer in hex format. + Copy this ObjectId to an output writer in hex format. + the stream to copy to. + the stream writing failed. + + + Copy this ObjectId to a byte array in hex format. + Copy this ObjectId to a byte array in hex format. + the buffer to copy to. + the offset within b to write at. + + + Copy this ObjectId to a ByteBuffer in hex format. + Copy this ObjectId to a ByteBuffer in hex format. + the buffer to copy to. + + + Copy this ObjectId to an output writer in hex format. + Copy this ObjectId to an output writer in hex format. + the stream to copy to. + the stream writing failed. + + + Copy this ObjectId to an output writer in hex format. + Copy this ObjectId to an output writer in hex format. + + temporary char array to buffer construct into before writing. + Must be at least large enough to hold 2 digits for each byte + of object id (40 characters or larger). + + the stream to copy to. + the stream writing failed. + + + Copy this ObjectId to a StringBuilder in hex format. + Copy this ObjectId to a StringBuilder in hex format. + + temporary char array to buffer construct into before writing. + Must be at least large enough to hold 2 digits for each byte + of object id (40 characters or larger). + + the string to append onto. + + + string form of the SHA-1, in lower case hexadecimal. + + + Return an abbreviation (prefix) of this object SHA-1. + + Return an abbreviation (prefix) of this object SHA-1. +

+ This implementation does not guarantee uniqueness. Callers should + instead use + ObjectReader.Abbreviate(AnyObjectId, int) + + to obtain a + unique abbreviation within the scope of a particular object database. + + length of the abbreviated string. + SHA-1 abbreviation. + + +

Obtain an immutable copy of this current object name value. + + Obtain an immutable copy of this current object name value. +

+ Only returns this if this instance is an unsubclassed + instance of + ObjectId + ; otherwise a new instance is returned + holding the same value. +

+ This method is useful to shed any additional memory that may be tied to + the subclass, yet retain the unique identity of the object id for future + lookups within maps and repositories. + + an immutable copy, using the smallest memory footprint possible. + + +

Obtain an immutable copy of this current object name value. + + Obtain an immutable copy of this current object name value. +

+ See + Copy() + if this is a possibly subclassed (but + immutable) identity and the application needs a lightweight identity + only reference. + + + an immutable copy. May be this if this is already + an immutable instance. + + + +

Get the first 8 bits of the ObjectId. + + Get the first 8 bits of the ObjectId. + This is a faster version of + getByte(0) + . + + + a discriminator usable for a fan-out style map. Returned values + are unsigned and thus are in the range [0,255] rather than the + signed byte range of [-128, 127]. + +
+ + string form of the SHA-1, in lower case hexadecimal. + + + Queue to open objects asynchronously. + + Queue to open objects asynchronously. + A queue may perform background decompression of objects and supply them + (possibly out-of-order) to the application. + + + + Asynchronous operation handle. + + Asynchronous operation handle. + Callers that start an asynchronous operation are supplied with a handle that + may be used to attempt cancellation of the operation if the caller does not + wish to continue. + + + + Cancels the running task. + + Cancels the running task. + Attempts to cancel execution of this task. This attempt will fail if the + task has already completed, already been cancelled, or could not be + cancelled for some other reason. If successful, and this task has not + started when cancel is called, this task should never run. If the task + has already started, then the mayInterruptIfRunning parameter determines + whether the thread executing this task should be interrupted in an + attempt to stop the task. + + + true if the thread executing this task should be interrupted; + otherwise, in-progress tasks are allowed to complete + + + false if the task could not be cancelled, typically because it + has already completed normally; true otherwise + + + + Release resources used by the operation, including cancellation. + Release resources used by the operation, including cancellation. + + + Position this queue onto the next available result. + + Position this queue onto the next available result. + Even if this method returns true, + AsyncObjectLoaderQueue<T>.Open() + + may still throw + NGit.Errors.MissingObjectException + + if the underlying object database was + concurrently modified and the current object is no longer available. + + + true if there is a result available; false if the queue has + finished its input iteration. + + + the object does not exist. If the implementation is retaining + the application's objects + AsyncObjectLoaderQueue<T>.GetCurrent() + + will be the + current object that is missing. There may be more results + still available, so the caller should continue invoking next + to examine another result. + + the object store cannot be accessed. + + + + the current object, null if the implementation lost track. + Implementations may for performance reasons discard the caller's + ObjectId and provider their own through + AsyncObjectLoaderQueue<T>.GetObjectId() + + . + + + + the ObjectId of the current object. Never null. + + + Obtain a loader to read the object. + + Obtain a loader to read the object. + This method can only be invoked once per result + Due to race conditions with a concurrent modification of the underlying + object database, an object may be unavailable when this method is + invoked, even though next returned successfully. + + the ObjectLoader to read this object. Never null. + + the object does not exist. If the implementation is retaining + the application's objects + AsyncObjectLoaderQueue<T>.GetCurrent() + + will be the + current object that is missing. There may be more results + still available, so the caller should continue invoking next + to examine another result. + + the object store cannot be accessed. + + + Queue to examine object sizes asynchronously. + + Queue to examine object sizes asynchronously. + A queue may perform background lookup of object sizes and supply them + (possibly out-of-order) to the application. + + + + Position this queue onto the next available result. + Position this queue onto the next available result. + + true if there is a result available; false if the queue has + finished its input iteration. + + + the object does not exist. If the implementation is retaining + the application's objects + AsyncObjectSizeQueue<T>.GetCurrent() + + will be the + current object that is missing. There may be more results + still available, so the caller should continue invoking next + to examine another result. + + the object store cannot be accessed. + + + + the current object, null if the implementation lost track. + Implementations may for performance reasons discard the caller's + ObjectId and provider their own through + AsyncObjectSizeQueue<T>.GetObjectId() + + . + + + + the ObjectId of the current object. Never null. + + + the size of the current object. + + + Base builder to customize repository construction. + + Base builder to customize repository construction. +

+ Repository implementations may subclass this builder in order to add custom + repository detection methods. + + RepositoryBuilder + NGit.Storage.File.FileRepositoryBuilder + + + + + + +

Directories limiting the search for a Git repository. + Directories limiting the search for a Git repository. +
+ + True only if the caller wants to force bare behavior. + True only if the caller wants to force bare behavior. + + + True if the caller requires the repository to exist. + True if the caller requires the repository to exist. + + + Configuration file of target repository, lazily loaded if required. + Configuration file of target repository, lazily loaded if required. + + + Set the file system abstraction needed by this repository. + Set the file system abstraction needed by this repository. + the abstraction. + + + this + (for chaining calls). + + + + the file system abstraction, or null if not set. + + + Set the Git directory storing the repository metadata. + + Set the Git directory storing the repository metadata. +

+ The meta directory stores the objects, references, and meta files like + MERGE_HEAD + , or the index file. If + null + the path is + assumed to be + workTree/.git + . + + + GIT_DIR + , the repository meta directory. + + + + this + (for chaining calls). + + + + the meta data directory; null if not set. + + +

Set the directory storing the repository's objects. + Set the directory storing the repository's objects. + + GIT_OBJECT_DIRECTORY + , the directory where the + repository's object files are stored. + + + + this + (for chaining calls). + +
+ + the object directory; null if not set. + + + Add an alternate object directory to the search list. + + Add an alternate object directory to the search list. +

+ This setting handles one alternate directory at a time, and is provided + to support + GIT_ALTERNATE_OBJECT_DIRECTORIES + . + + another objects directory to search after the standard one. + + + this + (for chaining calls). + + + +

Add alternate object directories to the search list. + + Add alternate object directories to the search list. +

+ This setting handles several alternate directories at once, and is + provided to support + GIT_ALTERNATE_OBJECT_DIRECTORIES + . + + + other object directories to search after the standard one. The + collection's contents is copied to an internal list. + + + + this + (for chaining calls). + + + +

Add alternate object directories to the search list. + + Add alternate object directories to the search list. +

+ This setting handles several alternate directories at once, and is + provided to support + GIT_ALTERNATE_OBJECT_DIRECTORIES + . + + + other object directories to search after the standard one. The + array's contents is copied to an internal list. + + + + this + (for chaining calls). + + + + ordered array of alternate directories; null if non were set. + + +

Force the repository to be treated as bare (have no working directory). + + Force the repository to be treated as bare (have no working directory). +

+ If bare the working directory aspects of the repository won't be + configured, and will not be accessible. + + + + this + (for chaining calls). + + + + + true if this repository was forced bare by + BaseRepositoryBuilder<B, R>.SetBare() + + . + + + +

Require the repository to exist before it can be opened. + Require the repository to exist before it can be opened. + + true if it must exist; false if it can be missing and created + after being built. + + + + this + (for chaining calls). + +
+ + true if the repository must exist before being opened. + + + Set the top level directory of the working files. + Set the top level directory of the working files. + + GIT_WORK_TREE + , the working directory of the checkout. + + + + this + (for chaining calls). + + + + the work tree directory, or null if not set. + + + Set the local index file that is caching checked out file status. + + Set the local index file that is caching checked out file status. +

+ The location of the index file tracking the status information for each + checked out file in + workTree + . This may be null to assume the + default + gitDiir/index + . + + + GIT_INDEX_FILE + , the index file location. + + + + this + (for chaining calls). + + + + the index file location, or null if not set. + + +

Read standard Git environment variables and configure from those. + + Read standard Git environment variables and configure from those. +

+ This method tries to read the standard Git environment variables, such as + GIT_DIR + and + GIT_WORK_TREE + to configure this builder + instance. If an environment variable is set, it overrides the value + already set in this builder. + + + + this + (for chaining calls). + + + +

Read standard Git environment variables and configure from those. + + Read standard Git environment variables and configure from those. +

+ This method tries to read the standard Git environment variables, such as + GIT_DIR + and + GIT_WORK_TREE + to configure this builder + instance. If a property is already set in the builder, the environment + variable is not used. + + the SystemReader abstraction to access the environment. + + + this + (for chaining calls). + + + +

Add a ceiling directory to the search limit list. + + Add a ceiling directory to the search limit list. +

+ This setting handles one ceiling directory at a time, and is provided to + support + GIT_CEILING_DIRECTORIES + . + + a path to stop searching at; its parent will not be searched. + + + this + (for chaining calls). + + + +

Add ceiling directories to the search list. + + Add ceiling directories to the search list. +

+ This setting handles several ceiling directories at once, and is provided + to support + GIT_CEILING_DIRECTORIES + . + + + directory paths to stop searching at. The collection's + contents is copied to an internal list. + + + + this + (for chaining calls). + + + +

Add ceiling directories to the search list. + + Add ceiling directories to the search list. +

+ This setting handles several ceiling directories at once, and is provided + to support + GIT_CEILING_DIRECTORIES + . + + + directory paths to stop searching at. The array's contents is + copied to an internal list. + + + + this + (for chaining calls). + + + +

+ Configure + GIT_DIR + by searching up the file system. +

+ Starts from the current working directory of the JVM and scans up through + the directory tree until a Git repository is found. Success can be + determined by checking for + getGitDir() != null + . +

+ The search can be limited to specific spaces of the local filesystem by + BaseRepositoryBuilder<B, R>.AddCeilingDirectory(Sharpen.FilePath) + + , or inheriting the list through a + prior call to + BaseRepositoryBuilder<B, R>.ReadEnvironment() + + . +

+ + + this + (for chaining calls). + +
+ + + Configure + GIT_DIR + by searching up the file system. +

+ Starts from the supplied directory path and scans up through the parent + directory tree until a Git repository is found. Success can be determined + by checking for + getGitDir() != null + . +

+ The search can be limited to specific spaces of the local filesystem by + BaseRepositoryBuilder<B, R>.AddCeilingDirectory(Sharpen.FilePath) + + , or inheriting the list through a + prior call to + BaseRepositoryBuilder<B, R>.ReadEnvironment() + + . +

+ directory to begin searching in. + + + this + (for chaining calls). + +
+ + Guess and populate all parameters not already defined. + + Guess and populate all parameters not already defined. +

+ If an option was not set, the setup method will try to default the option + based on other options. If insufficient information is available, an + exception is thrown to the caller. + + + + this + + + insufficient parameters were set, or some parameters are + incompatible with one another. + + + the repository could not be accessed to configure the rest of + the builder's parameters. + + + +

Create a repository matching the configuration in this builder. + + Create a repository matching the configuration in this builder. +

+ If an option was not set, the build method will try to default the option + based on other options. If insufficient information is available, an + exception is thrown to the caller. + + a repository matching this configuration. + insufficient parameters were set. + + the repository could not be accessed to configure the rest of + the builder's parameters. + + + +

+ Require either + gitDir + or + workTree + to be set. + +
+ + Perform standard gitDir initialization. + Perform standard gitDir initialization. + the repository could not be accessed + + + Perform standard work-tree initialization. + + Perform standard work-tree initialization. +

+ This is a method typically invoked inside of + BaseRepositoryBuilder<B, R>.Setup() + + , near the + end after the repository has been identified and its configuration is + available for inspection. + + the repository configuration could not be read. + + + +

Configure the internal implementation details of the repository. + Configure the internal implementation details of the repository. + the repository could not be accessed +
+ + Get the cached repository configuration, loading if not yet available. + Get the cached repository configuration, loading if not yet available. + the configuration of the repository. + the configuration is not available, or is badly formed. + + + + Parse and load the repository specific configuration. + + Parse and load the repository specific configuration. +

+ The default implementation reads + gitDir/config + , or returns an + empty configuration if gitDir was not set. + + the repository's configuration. + the configuration is not available. + + + + + + + the configured FS, or + NGit.Util.FS.DETECTED + . + + + + + + this + + + + +

Configuration file based on the blobs stored in the repository. + + Configuration file based on the blobs stored in the repository. + This implementation currently only provides reading support, and is primarily + useful for supporting the + .gitmodules + file. + +
+ + + Git style + .config + , + .gitconfig + , + .gitmodules + file. + + + + the change listeners + + + Immutable current state of the configuration data. + + Immutable current state of the configuration data. +

+ This state is copy-on-write. It should always contain an immutable list + of the configuration keys/values. + + + +

Magic value indicating a missing entry. + + Magic value indicating a missing entry. +

+ This value is tested for reference equality in some contexts, so we + must ensure it is a special copy of the empty string. It also must + be treated like the empty string. + + + +

Create a configuration with no default fallback. + Create a configuration with no default fallback. +
+ + Create an empty configuration with a fallback for missing keys. + Create an empty configuration with a fallback for missing keys. + + the base configuration to be consulted when a key is missing + from this configuration instance. + + + + Escape the value before saving + the value to escape + the escaped value + + + Obtain an integer value from the configuration. + Obtain an integer value from the configuration. + section the key is grouped within. + name of the key to get. + default value to return if no value was present. + an integer value from the configuration, or defaultValue. + + + Obtain an integer value from the configuration. + Obtain an integer value from the configuration. + section the key is grouped within. + subsection name, such a remote or branch name. + name of the key to get. + default value to return if no value was present. + an integer value from the configuration, or defaultValue. + + + Obtain an integer value from the configuration. + Obtain an integer value from the configuration. + section the key is grouped within. + name of the key to get. + default value to return if no value was present. + an integer value from the configuration, or defaultValue. + + + Obtain an integer value from the configuration. + Obtain an integer value from the configuration. + section the key is grouped within. + subsection name, such a remote or branch name. + name of the key to get. + default value to return if no value was present. + an integer value from the configuration, or defaultValue. + + + Get a boolean value from the git config + section the key is grouped within. + name of the key to get. + default value to return if no value was present. + + true if any value or defaultValue is true, false for missing or + explicit false + + + + Get a boolean value from the git config + section the key is grouped within. + subsection name, such a remote or branch name. + name of the key to get. + default value to return if no value was present. + + true if any value or defaultValue is true, false for missing or + explicit false + + + + Parse an enumeration from the configuration. + Parse an enumeration from the configuration. + section the key is grouped within. + subsection name, such a remote or branch name. + name of the key to get. + default value to return if no value was present. + + the selected enumeration value, or + defaultValue + . + + + + Parse an enumeration from the configuration. + Parse an enumeration from the configuration. + + all possible values in the enumeration which should be + recognized. Typically + EnumType.values() + . + + section the key is grouped within. + subsection name, such a remote or branch name. + name of the key to get. + default value to return if no value was present. + + the selected enumeration value, or + defaultValue + . + + + + Get string value + the section + the subsection for the value + the key name + a String value from git config. + + + + Get a list of string values +

+ If this instance was created with a base, the base's values are returned + first (if any). +

+ + Get a list of string values +

+ If this instance was created with a base, the base's values are returned + first (if any). + + the section + the subsection for the value + the key name + array of zero or more values from the configuration. + + + section to search for. + + set of all subsections of specified section within this + configuration and its base configuration; may be empty if no + subsection exists. The set's iterator returns sections in the + order they are declared by the configuration starting from this + instance and progressing through the base. + + + + + the sections defined in this + Config + . The set's iterator + returns sections in the order they are declared by the + configuration starting from this instance and progressing through + the base. + + + + the section + the list of names defined for this section + + + the section + the subsection + the list of names defined for this subsection + + +

Obtain a handle to a parsed set of configuration values. + Obtain a handle to a parsed set of configuration values. + + parser which can create the model if it is not already + available in this configuration file. The parser is also used + as the key into a cache and must obey the hashCode and equals + contract in order to reuse a parsed model. + + the parsed object instance, which is cached inside this config. +
+ + Remove a cached configuration object. + + Remove a cached configuration object. +

+ If the associated configuration object has not yet been cached, this + method has no effect. + + parser used to obtain the configuration object. + Get<T>(SectionParser<T>) + + +

Adds a listener to be notified about changes. + + Adds a listener to be notified about changes. +

+ Clients are supposed to remove the listeners after they are done with + them using the + NGit.Events.ListenerHandle.Remove() + + method + + the listener + the handle to the registered listener + + +

Determine whether to issue change events for transient changes. + + Determine whether to issue change events for transient changes. +

+ If true is returned (which is the default behavior), + FireConfigChangedEvent() + will be called upon each change. +

+ Subclasses that override this to return false are + responsible for issuing + FireConfigChangedEvent() + calls + themselves. + + + + +

Notifies the listeners +
+ + Add or modify a configuration value. + + Add or modify a configuration value. The parameters will result in a + configuration entry like this. +
+            [section "subsection"]
+            name = value
+            
+
+ section name, e.g "branch" + optional subsection value, e.g. a branch name + parameter name, e.g. "filemode" + parameter value +
+ + Add or modify a configuration value. + + Add or modify a configuration value. The parameters will result in a + configuration entry like this. +
+            [section "subsection"]
+            name = value
+            
+
+ section name, e.g "branch" + optional subsection value, e.g. a branch name + parameter name, e.g. "filemode" + parameter value +
+ + Add or modify a configuration value. + + Add or modify a configuration value. The parameters will result in a + configuration entry like this. +
+            [section "subsection"]
+            name = value
+            
+
+ section name, e.g "branch" + optional subsection value, e.g. a branch name + parameter name, e.g. "filemode" + parameter value +
+ + Add or modify a configuration value. + + Add or modify a configuration value. The parameters will result in a + configuration entry like this. +
+            [section "subsection"]
+            name = value
+            
+
+ section name, e.g "branch" + optional subsection value, e.g. a branch name + parameter name, e.g. "filemode" + parameter value +
+ + Add or modify a configuration value. + + Add or modify a configuration value. The parameters will result in a + configuration entry like this. +
+            [section "subsection"]
+            name = value
+            
+
+ section name, e.g "branch" + optional subsection value, e.g. a branch name + parameter name, e.g. "filemode" + parameter value, e.g. "true" +
+ + Remove a configuration value. + Remove a configuration value. + section name, e.g "branch" + optional subsection value, e.g. a branch name + parameter name, e.g. "filemode" + + + Remove all configuration values under a single section. + Remove all configuration values under a single section. + section name, e.g "branch" + optional subsection value, e.g. a branch name + + + Set a configuration value. + + Set a configuration value. +
+            [section "subsection"]
+            name = value
+            
+
+ section name, e.g "branch" + optional subsection value, e.g. a branch name + parameter name, e.g. "filemode" + list of zero or more values for this key. +
+ + this configuration, formatted as a Git style text file. + + + Clear this configuration and reset to the contents of the parsed string. + + Clear this configuration and reset to the contents of the parsed string. + + Git style text file listing configuration properties. + + the text supplied is not formatted correctly. No changes were + made to + this + . + + + + Clear the configuration file + + + + + + + + + + + + Parses a section of the configuration into an application model object. + + Parses a section of the configuration into an application model object. +

+ Instances must implement hashCode and equals such that model objects can + be cached by using the + SectionParser + as a key of a HashMap. +

+ As the + SectionParser + itself is used as the key of the internal + HashMap applications should be careful to ensure the SectionParser key + does not retain unnecessary application state which may cause memory to + be held longer than expected. + + + +

Create a model object from a configuration. + Create a model object from a configuration. + the configuration to read values from. + the application model instance. +
+ + Parse a configuration from a byte array. + Parse a configuration from a byte array. + the base configuration file + the byte array, should be UTF-8 encoded text. + the byte array is not a valid configuration format. + + + + Load a configuration file from a blob. + Load a configuration file from a blob. + the base configuration file + the repository + the object identifier + the blob cannot be read from the repository. + + the blob is not a valid configuration format. + + + + + + + + + + + + + + Load a configuration file from a blob stored in a specific commit. + Load a configuration file from a blob stored in a specific commit. + the base configuration file + the repository containing the objects. + the tree (or commit) that contains the object + the path within the tree + the path does not exist in the commit's tree. + + the tree and/or blob cannot be accessed. + the blob is not a valid configuration format. + + + + + + + + + + + + + + Mutable builder to construct a commit recording the state of a project. + + Mutable builder to construct a commit recording the state of a project. + Applications should use this object when they need to manually construct a + commit and want precise control over its fields. For a higher level interface + see + NGit.Api.CommitCommand + . + To read a commit object, construct a + NGit.Revwalk.RevWalk + and obtain a + NGit.Revwalk.RevCommit + instance by calling + NGit.Revwalk.RevWalk.ParseCommit(AnyObjectId) + + . + + + + Initialize an empty commit. + Initialize an empty commit. + + + Set the parent of this commit. + Set the parent of this commit. + the single parent for the commit. + + + Set the parents of this commit. + Set the parents of this commit. + + the first parent of this commit. Typically this is the current + value of the + HEAD + reference and is thus the current + branch's position in history. + + + the second parent of this merge commit. Usually this is the + branch being merged into the current branch. + + + + Set the parents of this commit. + Set the parents of this commit. + the entire list of parents for this commit. + + + Set the parents of this commit. + Set the parents of this commit. + the entire list of parents for this commit. + + + Add a parent onto the end of the parent list. + Add a parent onto the end of the parent list. + new parent to add onto the end of the current parent list. + + + + Set the encoding for the commit information + + the encoding name. See + Sharpen.Extensions.GetEncoding(string) + + . + + + + Set the encoding for the commit information + the encoding to use. + + + Format this builder's state as a commit object. + Format this builder's state as a commit object. + + this object in the canonical commit format, suitable for storage + in a repository. + + + the encoding specified by + Encoding() + is not + supported by this Java runtime. + + + + Format this builder's state as a commit object. + Format this builder's state as a commit object. + + this object in the canonical commit format, suitable for storage + in a repository. + + + the encoding specified by + Encoding() + is not + supported by this Java runtime. + + + + id of the root tree listing this commit's snapshot. + Set the tree id for this commit object + the tree identity. + + + the author of this commit (who wrote it). + Set the author (name, email address, and date) of who wrote the commit. + Set the author (name, email address, and date) of who wrote the commit. + the new author. Should not be null. + + + the committer and commit time for this object. + Set the committer and commit time for this object + the committer information. Should not be null. + + + the ancestors of this commit. Never null. + + + the complete commit message. + Set the commit message. + Set the commit message. + the commit message. Should not be null. + + + the encoding that should be used for the commit message text. + + + + Constants for use with the Configuration classes: section names, + configuration keys + + + + The "core" section + + + The "branch" section + + + The "remote" section + + + The "diff" section + + + The "dfs" section + + + The "user" section + + + The "gerrit" section + + + The "workflow" section + + + The "submodule" section + + + The "gc" section + + + The "pack" section + + + The "algorithm" key + + + The "autocrlf" key + + + The "bare" key + + + The "excludesfile" key + + + The "filemode" key + + + The "logallrefupdates" key + + + The "repositoryformatversion" key + + + The "worktree" key + + + The "blockLimit" key + + + The "blockSize" key + + + The "readAheadLimit" key + + + The "readAheadThreads" key + + + The "deltaBaseCacheLimit" key + + + The "streamFileThreshold" key + + + The "remote" key + + + The "merge" key + + + The "rebase" key + + + The "url" key + + + The "autosetupmerge" key + + + The "autosetuprebase" key + + + The "name" key + + + The "email" key + + + + The "false" key (used to configure + CONFIG_KEY_AUTOSETUPMERGE + + + + + + The "true" key (used to configure + CONFIG_KEY_AUTOSETUPMERGE + + + + + + The "always" key (used to configure + CONFIG_KEY_AUTOSETUPREBASE + and + CONFIG_KEY_AUTOSETUPMERGE + + + + + The "never" key (used to configure + CONFIG_KEY_AUTOSETUPREBASE + + + + + + The "local" key (used to configure + CONFIG_KEY_AUTOSETUPREBASE + + + + + The "createchangeid" key + + + The "defaultsourceref" key + + + The "path" key + + + The "update" key + + + The "compression" key + + + The "indexversion" key + + + The "precomposeunicode" key + + + The "pruneexpire" key + + + Misc. + Misc. constants used throughout JGit. + + + A Git object hash is 160 bits, i.e. + + A Git object hash is 160 bits, i.e. 20 bytes. +

+ Changing this assumption is not going to be as easy as changing this + declaration. + + + +

+ A Git object can be expressed as a 40 character string of hexadecimal + digits. + + + A Git object can be expressed as a 40 character string of hexadecimal + digits. + + OBJECT_ID_LENGTH +
+ + An unknown or invalid object type code. + An unknown or invalid object type code. + + + In-pack object type: extended types. + + In-pack object type: extended types. +

+ This header code is reserved for future expansion. It is currently + undefined/unsupported. + + + +

In-pack object type: commit. + + In-pack object type: commit. +

+ Indicates the associated object is a commit. +

+ This constant is fixed and is defined by the Git packfile format. + + TYPE_COMMIT + + +

In-pack object type: tree. + + In-pack object type: tree. +

+ Indicates the associated object is a tree. +

+ This constant is fixed and is defined by the Git packfile format. + + TYPE_BLOB + + +

In-pack object type: blob. + + In-pack object type: blob. +

+ Indicates the associated object is a blob. +

+ This constant is fixed and is defined by the Git packfile format. + + TYPE_BLOB + + +

In-pack object type: annotated tag. + + In-pack object type: annotated tag. +

+ Indicates the associated object is an annotated tag. +

+ This constant is fixed and is defined by the Git packfile format. + + TYPE_TAG + + +

In-pack object type: reserved for future use. + In-pack object type: reserved for future use. +
+ + + In-pack object type: offset delta +

+ Objects stored with this type actually have a different type which must + be obtained from their delta base object. +

+ + In-pack object type: offset delta +

+ Objects stored with this type actually have a different type which must + be obtained from their delta base object. Delta objects store only the + changes needed to apply to the base object in order to recover the + original object. +

+ An offset delta uses a negative offset from the start of this object to + refer to its delta base. The base object must exist in this packfile + (even in the case of a thin pack). +

+ This constant is fixed and is defined by the Git packfile format. + + + +

+ In-pack object type: reference delta +

+ Objects stored with this type actually have a different type which must + be obtained from their delta base object. +

+ + In-pack object type: reference delta +

+ Objects stored with this type actually have a different type which must + be obtained from their delta base object. Delta objects store only the + changes needed to apply to the base object in order to recover the + original object. +

+ A reference delta uses a full object id (hash) to reference the delta + base. The base object is allowed to be omitted from the packfile, but + only in the case of a thin pack being transferred over the network. +

+ This constant is fixed and is defined by the Git packfile format. + + + +

Hash function used natively by Git for all objects. + Hash function used natively by Git for all objects. +
+ + Special name for the "HEAD" symbolic-ref. + Special name for the "HEAD" symbolic-ref. + + + Special name for the "FETCH_HEAD" symbolic-ref. + Special name for the "FETCH_HEAD" symbolic-ref. + + + Text string that identifies an object as a commit. + + Text string that identifies an object as a commit. +

+ Commits connect trees into a string of project histories, where each + commit is an assertion that the best way to continue is to use this other + tree (set of files). + + + +

Text string that identifies an object as a blob. + + Text string that identifies an object as a blob. +

+ Blobs store whole file revisions. They are used for any user file, as + well as for symlinks. Blobs form the bulk of any project's storage space. + + + +

Text string that identifies an object as a tree. + + Text string that identifies an object as a tree. +

+ Trees attach object ids (hashes) to names and file modes. The normal use + for a tree is to store a version of a directory and its contents. + + + +

Text string that identifies an object as an annotated tag. + + Text string that identifies an object as an annotated tag. +

+ Annotated tags store a pointer to any other object, and an additional + message. It is most commonly used to record a stable release of the + project. + + + +

+ Pack file signature that occurs at file header - identifies file as Git + packfile formatted. + + + Pack file signature that occurs at file header - identifies file as Git + packfile formatted. +

+ This constant is fixed and is defined by the Git packfile format. + + + +

Native character encoding for commit messages, file names... + Native character encoding for commit messages, file names... +
+ + Native character encoding for commit messages, file names... + Native character encoding for commit messages, file names... + + + Default main branch name + + + Default stash branch name + + + Prefix for branch refs + + + Prefix for remotes refs + + + Prefix for tag refs + + + Prefix for notes refs + + + Standard notes ref + + + Prefix for any ref + + + Standard stash ref + + + Logs folder name + + + Info refs folder + + + Packed refs file + + + The environment variable that contains the system user name + + + The environment variable that contains the author's name + + + The environment variable that contains the author's email + + + The environment variable that contains the commiter's name + + + The environment variable that contains the commiter's email + + + + The environment variable that limits how close to the root of the file + systems JGit will traverse when looking for a repository root. + + + The environment variable that limits how close to the root of the file + systems JGit will traverse when looking for a repository root. + + + + + The environment variable that tells us which directory is the ".git" + directory + + + + + The environment variable that tells us which directory is the working + directory. + + + The environment variable that tells us which directory is the working + directory. + + + + The environment variable that tells us which file holds the Git index. + The environment variable that tells us which file holds the Git index. + + + The environment variable that tells us where objects are stored + + + + The environment variable that tells us where to look for objects, besides + the default objects directory. + + + The environment variable that tells us where to look for objects, besides + the default objects directory. + + + + Default value for the user name if no other information is available + + + Beginning of the common "Signed-off-by: " commit message line + + + A gitignore file name + + + Default remote name used by clone, push and fetch operations + + + Default name for the Git repository directory + + + Default name for the Git repository configuration + + + A bare repository typically ends with this string + + + Name of the ignore file + + + Name of the submodules file + + + Create a new digest function for objects. + Create a new digest function for objects. + a new digest object. + + this Java virtual machine does not support the required hash + function. Very unlikely given that JGit uses a hash function + that is in the Java reference specification. + + + + Convert an OBJ_* type constant to a TYPE_* type constant. + Convert an OBJ_* type constant to a TYPE_* type constant. + the type code, from a pack representation. + the canonical string name of this type. + + + Convert an OBJ_* type constant to an ASCII encoded string constant. + + Convert an OBJ_* type constant to an ASCII encoded string constant. +

+ The ASCII encoded string is often the canonical representation of + the type within a loose object header, or within a tag header. + + the type code, from a pack representation. + the canonical ASCII encoded name of this type. + + +

Parse an encoded type string into a type constant. + Parse an encoded type string into a type constant. + + object id this type string came from; may be null if that is + not known at the time the parse is occurring. + + string version of the type code. + + character immediately following the type string. Usually ' ' + (space) or '\n' (line feed). + + + position within typeString where the parse + should start. Updated with the new position (just past + endMark when the parse is successful. + + + a type code constant (one of + OBJ_BLOB + , + OBJ_COMMIT + , + OBJ_TAG + , + OBJ_TREE + . + + there is no valid type identified by typeString. + +
+ + Convert an integer into its decimal representation. + Convert an integer into its decimal representation. + the integer to convert. + + a decimal representation of the input integer. The returned array + is the smallest array that will hold the value. + + + + Convert a string to US-ASCII encoding. + Convert a string to US-ASCII encoding. + + the string to convert. Must not contain any characters over + 127 (outside of 7-bit ASCII). + + + a byte array of the same length as the input string, holding the + same characters, in the same order. + + + the input string contains one or more characters outside of + the 7-bit ASCII character space. + + + + Convert a string to a byte array in the standard character encoding. + Convert a string to a byte array in the standard character encoding. + the string to convert. May contain any Unicode characters. + + a byte array representing the requested string, encoded using the + default character encoding (UTF-8). + + CHARACTER_ENCODING + + + name of the file containing the commit msg for a merge commit + + + name of the file containing the IDs of the parents of a merge commit + + + name of the file containing the ID of a cherry pick commit in case of conflicts + + + + name of the file containing the commit msg for a squash commit + + + + name of the ref ORIG_HEAD used by certain commands to store the original + value of HEAD + + + + objectid for the empty blob + + + This class keeps git repository core parameters. + This class keeps git repository core parameters. + + + + Key for + Config.Get<T>(SectionParser<T>) + + . + + + + The compression level to use when storing loose objects + + + the preferred pack index file format; 0 for oldest possible. + + + whether to log all refUpdates + + + path of excludesfile + + + + Permissible values for + core.autocrlf + . + + + + Constants describing various file modes recognized by GIT. + + Constants describing various file modes recognized by GIT. +

+ GIT uses a subset of the available UNIX file permission bits. The + FileMode class provides access to constants defining the modes + actually used by GIT. + + + +

Mask to apply to a file mode to obtain its type bits. + Mask to apply to a file mode to obtain its type bits. + TYPE_TREE + TYPE_SYMLINK + TYPE_FILE + TYPE_GITLINK + TYPE_MISSING +
+ + + Bit pattern for + TYPE_MASK + matching + TREE + . + + + + + Bit pattern for + TYPE_MASK + matching + SYMLINK + . + + + + + Bit pattern for + TYPE_MASK + matching + REGULAR_FILE + . + + + + + Bit pattern for + TYPE_MASK + matching + GITLINK + . + + + + + Bit pattern for + TYPE_MASK + matching + MISSING + . + + + + Mode indicating an entry is a tree (aka directory). + Mode indicating an entry is a tree (aka directory). + + + Mode indicating an entry is a symbolic link. + Mode indicating an entry is a symbolic link. + + + Mode indicating an entry is a non-executable file. + Mode indicating an entry is a non-executable file. + + + Mode indicating an entry is an executable file. + Mode indicating an entry is an executable file. + + + Mode indicating an entry is a submodule commit in another repository. + Mode indicating an entry is a submodule commit in another repository. + + + Mode indicating an entry is missing during parallel walks. + Mode indicating an entry is missing during parallel walks. + + + Convert a set of mode bits into a FileMode enumerated value. + Convert a set of mode bits into a FileMode enumerated value. + the mode bits the caller has somehow obtained. + the FileMode instance that represents the given bits. + + + + Test a file mode for equality with this + FileMode + object. + + + true if the mode bits represent the same mode as this object + + + Copy this mode as a sequence of octal US-ASCII bytes. + + Copy this mode as a sequence of octal US-ASCII bytes. +

+ The mode is copied as a sequence of octal digits using the US-ASCII + character encoding. The sequence does not use a leading '0' prefix to + indicate octal notation. This method is suitable for generation of a mode + string within a GIT tree object. + + stream to copy the mode to. + the stream encountered an error during the copy. + + + +

Copy this mode as a sequence of octal US-ASCII bytes. + + Copy this mode as a sequence of octal US-ASCII bytes. + The mode is copied as a sequence of octal digits using the US-ASCII + character encoding. The sequence does not use a leading '0' prefix to + indicate octal notation. This method is suitable for generation of a mode + string within a GIT tree object. + + buffer to copy the mode to. + + position within + buf + for first digit. + +
+ + + the number of bytes written by + CopyTo(Sharpen.OutputStream) + . + + + + Get the object type that should appear for this type of mode. + + Get the object type that should appear for this type of mode. +

+ See the object type constants in + Constants + . + + one of the well known object type constants. + + +

Format this mode as an octal string (for debugging only). + Format this mode as an octal string (for debugging only). +
+ + The mode bits as an integer. + + + + A representation of a file (blob) object in a + Tree + . + + + + This class represents an entry in a tree, like a blob or another tree. + This class represents an entry in a tree, like a blob or another tree. + + + Construct a named tree entry. + Construct a named tree entry. + + + + + + parent of this tree. + + + Delete this entry. + Delete this entry. + + + Detach this entry from it's parent. + Detach this entry from it's parent. + + + the repository owning this entry. + + + the raw byte name of this entry. + + + the name of this entry. + + + Rename this entry. + Rename this entry. + The new name + System.IO.IOException + + + Rename this entry. + Rename this entry. + The new name + System.IO.IOException + + + true if this entry is new or modified since being loaded. + + + Mark this entry as modified. + Mark this entry as modified. + + + SHA-1 of this tree entry (null for new unhashed entries) + + + Set (update) the SHA-1 of this entry. + + Set (update) the SHA-1 of this entry. Invalidates the id's of all + entries above this entry as they will have to be recomputed. + + SHA-1 for this entry. + + + repository relative name of this entry + + + + repository relative name of the entry + FIXME better encoding + + + + Helper for accessing tree/blob methods. + Helper for accessing tree/blob methods. + + '/' for Tree entries and NUL for non-treeish objects. + + + mode (type of object) + + + Constructor for a File (blob) object. + Constructor for a File (blob) object. + + The + Tree + holding this object (or null) + + the SHA-1 of the blob (or null for a yet unhashed file) + raw object name in the parent tree + true if the executable flag is set + + + true if this file is executable + + + set/reset the executable flag + + + + an + ObjectLoader + that will return the data + + System.IO.IOException + + + A representation of the Git index. + + A representation of the Git index. + The index points to the objects currently checked out or in the process of + being prepared for committing or objects involved in an unfinished merge. + The abstract format is:
path stage flags statdata SHA-1 +
    +
  • Path is the relative path in the workdir
  • +
  • stage is 0 (normally), but when + merging 1 is the common ancestor version, 2 is 'our' version and 3 is 'their' + version. A fully resolved merge only contains stage 0.
  • +
  • flags is the object type and information of validity
  • +
  • statdata is the size of this object and some other file system specifics, + some of it ignored by JGit
  • +
  • SHA-1 represents the content of the references object
  • +
+ An index can also contain a tree cache which we ignore for now. We drop the + tree cache when writing the index. +
+
+ + Stage 0 represents merged entries. + Stage 0 represents merged entries. + + + Construct a Git index representation. + Construct a Git index representation. + + + + true if we have modified the index in memory since reading it from disk + + + Reread index data from disk if the index file has been changed + System.IO.IOException + + + Add the content of a file to the index. + Add the content of a file to the index. + workdir + the file + a new or updated index entry for the path represented by f + System.IO.IOException + + + Add the content of a file to the index. + Add the content of a file to the index. + workdir + the file + content of the file + a new or updated index entry for the path represented by f + System.IO.IOException + + + Remove a path from the index. + Remove a path from the index. + workdir + the file whose path shall be removed. + true if such a path was found (and thus removed) + System.IO.IOException + + + Read the cache file into memory. + Read the cache file into memory. + System.IO.IOException + + + Write content of index to disk. + Write content of index to disk. + System.IO.IOException + + + + + + Read a Tree recursively into the index + The tree to read + System.IO.IOException + + + + + + Add tree entry to index + tree entry + new or modified index entry + System.IO.IOException + + + Check out content of the content represented by the index + workdir + System.IO.IOException + + + Check out content of the specified index entry + workdir + index entry + System.IO.IOException + + + Construct and write tree out of index. + Construct and write tree out of index. + SHA-1 of the constructed tree + System.IO.IOException + + + + Return the members of the index sorted by the unsigned byte + values of the path names. + + + Return the members of the index sorted by the unsigned byte + values of the path names. + Small beware: Unaccounted for are unmerged entries. You may want + to abort if members with stage != 0 are found if you are doing + any updating operations. All stages will be found after one another + here later. Currently only one stage per name is returned. + + The index entries sorted + + + Look up an entry with the specified path. + Look up an entry with the specified path. + + index entry for the path or null if not in index. + Sharpen.UnsupportedEncodingException + + + + The repository holding this index. + + + An index entry + + + + + + + + + + Update this index entry with stat and SHA-1 information if it looks + like the file has been modified in the workdir. + + + Update this index entry with stat and SHA-1 information if it looks + like the file has been modified in the workdir. + + file in work dir + true if a change occurred + System.IO.IOException + + + + Update this index entry with stat and SHA-1 information if it looks + like the file has been modified in the workdir. + + + Update this index entry with stat and SHA-1 information if it looks + like the file has been modified in the workdir. + + file in work dir + the new content of the file + true if a change occurred + System.IO.IOException + + + + Check if an entry's content is different from the cache, + File status information is used and status is same we + consider the file identical to the state in the working + directory. + + + Check if an entry's content is different from the cache, + File status information is used and status is same we + consider the file identical to the state in the working + directory. Native git uses more stat fields than we + have accessible in Java. + + working directory to compare content with + true if content is most likely different. + + + + Check if an entry's content is different from the cache, + File status information is used and status is same we + consider the file identical to the state in the working + directory. + + + Check if an entry's content is different from the cache, + File status information is used and status is same we + consider the file identical to the state in the working + directory. Native git uses more stat fields than we + have accessible in Java. + + working directory to compare content with + + True if the actual file content + should be checked if modification time differs. + + true if content is most likely different. + + + Returns the stages in which the entry's file is recorded in the index. + + Returns the stages in which the entry's file is recorded in the index. + The stages are bit-encoded: bit N is set if the file is present + in stage N. In particular, the N-th bit will be set if this entry + itself is in stage N (see getStage()). + + flags denoting stages + GetStage() + + + path name for this entry + + + path name for this entry as byte array, hopefully UTF-8 encoded + + + SHA-1 of the entry managed by this index + + + the stage this entry is in + + + size of disk object + + + true if this entry shall be assumed valid + + + true if this entry should be checked for changes + + + Set whether to always assume this entry valid + true to ignore changes + + + Set whether this entry must be checked + + + + Return raw file mode bits. + + Return raw file mode bits. See + FileMode + + file mode bits + + + + + + + + + A tree entry representing a gitlink entry used for submodules. + + A tree entry representing a gitlink entry used for submodules. + Note. Java cannot really handle these as file system objects. + + + + + Construct a + GitlinkTreeEntry + with the specified name and SHA-1 in + the specified parent + + + + + + + + Compares the index, a tree, and the working directory Ignored files are not + taken into account. + + + Compares the index, a tree, and the working directory Ignored files are not + taken into account. The following information is retrieved: +
    +
  • added files
  • +
  • changed files
  • +
  • removed files
  • +
  • missing files
  • +
  • modified files
  • +
  • conflicting files
  • +
  • untracked files
  • +
  • files with assume-unchanged flag
  • +
+
+
+ + Construct an IndexDiff + + + symbolic name e.g. HEAD + An EmptyTreeIterator is used if revstr cannot be resolved. + + iterator for working directory + System.IO.IOException + + + Construct an Indexdiff + + tree id. If null, an EmptyTreeIterator is used. + iterator for working directory + System.IO.IOException + + + Sets a filter. + + Sets a filter. Can be used e.g. for restricting the tree walk to a set of + files. + + + + + Run the diff operation. + + Run the diff operation. Until this is called, all lists will be empty. + Use + Diff(ProgressMonitor, int, int, string) + + if a progress + monitor is required. + + if anything is different between index, tree, and workdir + System.IO.IOException + + + Run the diff operation. + + Run the diff operation. Until this is called, all lists will be empty. +

+ The operation may be aborted by the progress monitor. In that event it + will report what was found before the cancel operation was detected. + Callers should ignore the result if monitor.isCancelled() is true. If a + progress monitor is not needed, callers should use + Diff() + instead. Progress reporting is crude and approximate and only intended + for informing the user. + + for reporting progress, may be null + number or estimated files in the working tree + number of estimated entries in the cache + + if anything is different between index, tree, and workdir + System.IO.IOException + + + list of files added to the index, not in the tree + + + list of files changed from tree to index + + + list of files removed from index, but in tree + + + list of files in index, but not filesystem + + + list of files modified on disk relative to the index + + + list of files that are not ignored, and not in the index. + + + list of files that are in conflict + + +

The method returns the list of ignored files and folders. + + The method returns the list of ignored files and folders. Only the root + folder of an ignored folder hierarchy is reported. If a/b/c is listed in + the .gitignore then you should not expect a/b/c/d/e/f to be reported + here. Only a/b/c will be reported. Furthermore only ignored files / + folders are returned that are NOT in the index. + + list of files / folders that are ignored +
+ + list of files with the flag assume-unchanged + + + list of folders containing only untracked files/folders + + + Get the file mode of the given path in the index + + file mode + + + Selects interesting tree entries during walking. + + Selects interesting tree entries during walking. +

+ This is an abstract interface. Applications may implement a subclass, or use + one of the predefined implementations already available within this package. +

+ Unless specifically noted otherwise a TreeFilter implementation is not thread + safe and may not be shared by different TreeWalk instances at the same time. + This restriction allows TreeFilter implementations to cache state within + their instances during + Include(NGit.Treewalk.TreeWalk) + if it is beneficial to + their implementation. Deep clones created by + Clone() + may be used to + construct a thread-safe copy of an existing filter. +

+ Path filters: +

    +
  • Matching pathname: + PathFilter +
  • +
+

+ Difference filters: +

    +
  • Only select differences: + ANY_DIFF + .
  • +
+

+ Boolean modifiers: +

    +
  • AND: + AndTreeFilter +
  • +
  • OR: + OrTreeFilter +
  • +
  • NOT: + NotTreeFilter +
  • +
+
+
+ + Selects all tree entries. + Selects all tree entries. + + + Selects only tree entries which differ between at least 2 trees. + + Selects only tree entries which differ between at least 2 trees. +

+ This filter also prevents a TreeWalk from recursing into a subtree if all + parent trees have the identical subtree at the same path. This + dramatically improves walk performance as only the changed subtrees are + entered into. +

+ If this filter is applied to a walker with only one tree it behaves like + ALL + , or as though the walker was matching a virtual empty tree + against the single tree it was actually given. Applications may wish to + treat such a difference as "all names added". +

+ When comparing + NGit.Treewalk.WorkingTreeIterator + and + NGit.Dircache.DirCacheIterator + applications should use + IndexDiffFilter + . + + + +

Create a new filter that does the opposite of this filter. + Create a new filter that does the opposite of this filter. + a new filter that includes tree entries this filter rejects. +
+ + Determine if the current entry is interesting to report. + + Determine if the current entry is interesting to report. +

+ This method is consulted for subtree entries even if + NGit.Treewalk.TreeWalk.Recursive() + + is enabled. The consultation allows the + filter to bypass subtree recursion on a case-by-case basis, even when + recursion is enabled at the application level. + + the walker the filter needs to examine. + + true if the current entry should be seen by the application; + false to hide the entry. + + + an object the filter needs to consult to determine its answer + does not exist in the Git repository the walker is operating + on. Filtering this current walker entry is impossible without + the object. + + + an object the filter needed to consult was not of the + expected object type. This usually indicates a corrupt + repository, as an object link is referencing the wrong type. + + + a loose object or pack file could not be read to obtain data + necessary for the filter to make its decision. + + + +

+ Does this tree filter require a recursive walk to match everything? +

+ If this tree filter is matching on full entry path names and its pattern + is looking for a '/' then the filter would require a recursive TreeWalk + to accurately make its decisions. +

+ + Does this tree filter require a recursive walk to match everything? +

+ If this tree filter is matching on full entry path names and its pattern + is looking for a '/' then the filter would require a recursive TreeWalk + to accurately make its decisions. The walker is not required to enable + recursive behavior for any particular filter, this is only a hint. + + + true if the filter would like to have the walker recurse into + subtrees to make sure it matches everything correctly; false if + the filter does not require entering subtrees. + + + +

Clone this tree filter, including its parameters. + + Clone this tree filter, including its parameters. +

+ This is a deep clone. If this filter embeds objects or other filters it + must also clone those, to ensure the instances do not share mutable data. + + another copy of this filter, suitable for another thread. + + + + + + + +

Creates zlib based inflaters as necessary for object decompression. + Creates zlib based inflaters as necessary for object decompression. +
+ + Obtain an Inflater for decompression. + + Obtain an Inflater for decompression. +

+ Inflaters obtained through this cache should be returned (if possible) by + Release(ICSharpCode.SharpZipLib.Zip.Compression.Inflater) + + to avoid garbage collection and reallocation. + + an available inflater. Never null. + + +

Release an inflater previously obtained from this cache. + Release an inflater previously obtained from this cache. + + the inflater to return. May be null, in which case this method + does nothing. + +
+ + A mutable SHA-1 abstraction. + A mutable SHA-1 abstraction. + + + Empty constructor. + Empty constructor. Initialize object with default (zeros) value. + + + Copying constructor. + Copying constructor. + original entry, to copy id from + + + Set any byte in the id. + Set any byte in the id. + + index of the byte to set in the raw form of the ObjectId. Must + be in range [0, + Constants.OBJECT_ID_LENGTH + ). + + + the value of the specified byte at + index + . Values are + unsigned and thus are in the range [0,255] rather than the + signed byte range of [-128, 127]. + + + index + is less than 0, equal to + Constants.OBJECT_ID_LENGTH + , or greater than + Constants.OBJECT_ID_LENGTH + . + + + + + Make this id match + ObjectId.ZeroId() + . + + + + Copy an ObjectId into this mutable buffer. + Copy an ObjectId into this mutable buffer. + the source id to copy from. + + + Convert an ObjectId from raw binary representation. + Convert an ObjectId from raw binary representation. + + the raw byte buffer to read from. At least 20 bytes must be + available within this byte array. + + + + Convert an ObjectId from raw binary representation. + Convert an ObjectId from raw binary representation. + + the raw byte buffer to read from. At least 20 bytes after p + must be available within this byte array. + + position to read the first byte of data from. + + + Convert an ObjectId from binary representation expressed in integers. + Convert an ObjectId from binary representation expressed in integers. + + the raw int buffer to read from. At least 5 integers must be + available within this integers array. + + + + Convert an ObjectId from binary representation expressed in integers. + Convert an ObjectId from binary representation expressed in integers. + + the raw int buffer to read from. At least 5 integers after p + must be available within this integers array. + + position to read the first integer of data from. + + + Convert an ObjectId from hex characters (US-ASCII). + Convert an ObjectId from hex characters (US-ASCII). + + the US-ASCII buffer to read from. At least 40 bytes after + offset must be available within this byte array. + + position to read the first character from. + + + Convert an ObjectId from hex characters. + Convert an ObjectId from hex characters. + the string to read from. Must be 40 characters long. + + + A NullProgressMonitor does not report progress anywhere. + A NullProgressMonitor does not report progress anywhere. + + + A progress reporting interface. + A progress reporting interface. + + + Constant indicating the total work units cannot be predicted. + Constant indicating the total work units cannot be predicted. + + + Advise the monitor of the total number of subtasks. + + Advise the monitor of the total number of subtasks. +

+ This should be invoked at most once per progress monitor interface. + + + the total number of tasks the caller will need to complete + their processing. + + + +

Begin processing a single task. + Begin processing a single task. + + title to describe the task. Callers should publish these as + stable string constants that implementations could match + against for translation support. + + + total number of work units the application will perform; + UNKNOWN + if it cannot be predicted in advance. + +
+ + Denote that some work units have been completed. + + Denote that some work units have been completed. +

+ This is an incremental update; if invoked once per work unit the correct + value for our argument is 1, to indicate a single unit of + work has been finished by the caller. + + the number of work units completed since the last call. + + +

Finish the current task, so the next can begin. + Finish the current task, so the next can begin. +
+ + Check for user task cancellation. + Check for user task cancellation. + true if the user asked the process to stop working. + + + Immutable instance of a null progress monitor. + Immutable instance of a null progress monitor. + + + Verifies that an object is formatted correctly. + + Verifies that an object is formatted correctly. +

+ Verifications made by this class only check that the fields of an object are + formatted correctly. The ObjectId checksum of the object is not verified, and + connectivity links between objects are also not verified. Its assumed that + the caller can provide both of these validations on its own. +

+ Instances of this class are not thread safe, but they may be reused to + perform multiple object validations. + + + +

Header "tree " +
+ + Header "parent " + + + Header "author " + + + Header "committer " + + + Header "encoding " + + + Header "object " + + + Header "type " + + + Header "tag " + + + Header "tagger " + + + Check an object for parsing errors. + Check an object for parsing errors. + + type of the object. Must be a valid object type code in + Constants + . + + + the raw data which comprises the object. This should be in the + canonical format (that is the format used to generate the + ObjectId of the object). The array is never modified. + + if an error is identified. + + + Check a commit for errors. + Check a commit for errors. + the commit data. The array is never modified. + if any error was detected. + + + Check an annotated tag for errors. + Check an annotated tag for errors. + the tag data. The array is never modified. + if any error was detected. + + + Check a canonical formatted tree for errors. + Check a canonical formatted tree for errors. + the raw tree data. The array is never modified. + if any error was detected. + + + Check a blob for errors. + Check a blob for errors. + the blob data. The array is never modified. + if any error was detected. + + + Abstraction of arbitrary object storage. + + Abstraction of arbitrary object storage. +

+ An object database stores one or more Git objects, indexed by their unique + ObjectId + . + + + +

Initialize a new database instance for access. + Initialize a new database instance for access. +
+ + Does this database exist yet? + + true if this database is already created; false if the caller + should invoke + Create() + to create this database location. + + + + Initialize a new object database at this location. + Initialize a new object database at this location. + the database could not be created. + + + + Create a new + ObjectInserter + to insert new objects. +

+ The returned inserter is not itself thread-safe, but multiple concurrent + inserter instances created from the same + ObjectDatabase + must be + thread-safe. +

+ writer the caller can use to create objects in this database. +
+ + + Create a new + ObjectReader + to read existing objects. +

+ The returned reader is not itself thread-safe, but multiple concurrent + reader instances created from the same + ObjectDatabase + must be + thread-safe. +

+ reader the caller can use to load objects from this database. +
+ + Close any resources held by this database. + Close any resources held by this database. + + + + Does the requested object exist in this database? +

+ This is a one-shot call interface which may be faster than allocating a + NewReader() + to perform the lookup. +

+ identity of the object to test for existence of. + true if the specified object is stored in this database. + the object store cannot be accessed. +
+ + Open an object from this database. + + Open an object from this database. +

+ This is a one-shot call interface which may be faster than allocating a + NewReader() + to perform the lookup. + + identity of the object to open. + + a + ObjectLoader + for accessing the object. + + the object does not exist. + the object store cannot be accessed. + + +

Open an object from this database. + + Open an object from this database. +

+ This is a one-shot call interface which may be faster than allocating a + NewReader() + to perform the lookup. + + identity of the object to open. + + hint about the type of object being requested; + ObjectReader.OBJ_ANY + if the object type is not known, + or does not matter to the caller. + + + a + ObjectLoader + for accessing the object. + + the object does not exist. + + typeHint was not OBJ_ANY, and the object's actual type does + not match typeHint. + + the object store cannot be accessed. + + +

Create a new cached database instance over this database. + + Create a new cached database instance over this database. This instance might + optimize queries by caching some information about database. So some modifications + done after instance creation might fail to be noticed. + + new cached database instance +
+ + A SHA-1 abstraction. + A SHA-1 abstraction. + + + Test a string of characters to verify it is a hex format. + + Test a string of characters to verify it is a hex format. +

+ If true the string can be parsed with + FromString(string) + . + + the string to test. + true if the string can converted into an ObjectId. + + +

Convert an ObjectId into a hex string representation. + Convert an ObjectId into a hex string representation. + the id to convert. May be null. + the hex string conversion of this id's content. +
+ + Compare to object identifier byte sequences for equality. + Compare to object identifier byte sequences for equality. + + the first buffer to compare against. Must have at least 20 + bytes from position ai through the end of the buffer. + + first offset within firstBuffer to begin testing. + + the second buffer to compare against. Must have at least 2 + bytes from position bi through the end of the buffer. + + first offset within secondBuffer to begin testing. + true if the two identifiers are the same. + + + Convert an ObjectId from raw binary representation. + Convert an ObjectId from raw binary representation. + + the raw byte buffer to read from. At least 20 bytes must be + available within this byte array. + + the converted object id. + + + Convert an ObjectId from raw binary representation. + Convert an ObjectId from raw binary representation. + + the raw byte buffer to read from. At least 20 bytes after p + must be available within this byte array. + + position to read the first byte of data from. + the converted object id. + + + Convert an ObjectId from raw binary representation. + Convert an ObjectId from raw binary representation. + + the raw integers buffer to read from. At least 5 integers must + be available within this int array. + + the converted object id. + + + Convert an ObjectId from raw binary representation. + Convert an ObjectId from raw binary representation. + + the raw integers buffer to read from. At least 5 integers + after p must be available within this int array. + + position to read the first integer of data from. + the converted object id. + + + Convert an ObjectId from hex characters (US-ASCII). + Convert an ObjectId from hex characters (US-ASCII). + + the US-ASCII buffer to read from. At least 40 bytes after + offset must be available within this byte array. + + position to read the first character from. + the converted object id. + + + Convert an ObjectId from hex characters. + Convert an ObjectId from hex characters. + the string to read from. Must be 40 characters long. + the converted object id. + + + Initialize this instance by copying another existing ObjectId. + + Initialize this instance by copying another existing ObjectId. +

+ This constructor is mostly useful for subclasses who want to extend an + ObjectId with more properties, but initialize from an existing ObjectId + instance acquired by other means. + + another already parsed ObjectId to copy the value out of. + + + + + + + + +

Get the special all-null ObjectId. + Get the special all-null ObjectId. + the all-null ObjectId, often used to stand-in for no object. +
+ + + A + Ref + that points directly at an + ObjectId + . + + + + + Pairing of a name and the + ObjectId + it currently has. +

+ A ref in Git is (more or less) a variable that holds a single object + identifier. The object identifier can be any valid Git object (blob, tree, + commit, annotated tag, ...). +

+ The ref name has the attributes of the ref that was asked for as well as the + ref it was resolved to for symbolic refs plus the object id it points to and + (for tags) the peeled target object id, i.e. the tag resolved recursively + until a non-tag object is referenced. +

+
+ + What this ref is called within the repository. + What this ref is called within the repository. + name of this ref. + + + Test if this reference is a symbolic reference. + + Test if this reference is a symbolic reference. +

+ A symbolic reference does not have its own + ObjectId + value, but + instead points to another + Ref + in the same database and always + uses that other reference's value as its own. + + + true if this is a symbolic reference; false if this reference + contains its own ObjectId. + + + +

+ Traverse target references until + IsSymbolic() + is false. +

+ If + IsSymbolic() + is false, returns + this + . +

+ If + IsSymbolic() + is true, this method recursively traverses + GetTarget() + until + IsSymbolic() + returns false. +

+ This method is effectively +

+            return isSymbolic() ? getTarget().getLeaf() : this;
+            
+
+ the reference that actually stores the ObjectId value. +
+ + + Get the reference this reference points to, or + this + . +

+ If + IsSymbolic() + is true this method returns the reference it + directly names, which might not be the leaf reference, but could be + another symbolic reference. +

+ If this is a leaf level reference that contains its own ObjectId,this + method returns + this + . +

+ + the target reference, or + this + . + +
+ + Cached value of this ref. + Cached value of this ref. + the value of this ref at the last time we read it. + + + Cached value of ref^{} (the ref peeled to commit). + Cached value of ref^{} (the ref peeled to commit). + + if this ref is an annotated tag the id of the commit (or tree or + blob) that the annotated tag refers to; null if this ref does not + refer to an annotated tag. + + + + whether the Ref represents a peeled tag + + + + How was this ref obtained? +

+ The current storage model of a Ref may influence how the ref must be + updated or deleted from the repository. +

+ + How was this ref obtained? +

+ The current storage model of a Ref may influence how the ref must be + updated or deleted from the repository. + + type of ref. + + +

Create a new ref pairing. + Create a new ref pairing. + method used to store this ref. + name of this ref. + + current value of the ref. May be null to indicate a ref that + does not exist yet. + +
+ + Any reference whose peeled value is not yet known. + Any reference whose peeled value is not yet known. + + + Create a new ref pairing. + Create a new ref pairing. + method used to store this ref. + name of this ref. + + current value of the ref. May be null to indicate a ref + that does not exist yet. + + + + An annotated tag whose peeled object has been cached. + An annotated tag whose peeled object has been cached. + + + Create a new ref pairing. + Create a new ref pairing. + method used to store this ref. + name of this ref. + current value of the ref. + + the first non-tag object that tag + id + points to. + + + + A reference to a non-tag object coming from a cached source. + A reference to a non-tag object coming from a cached source. + + + Create a new ref pairing. + Create a new ref pairing. + method used to store this ref. + name of this ref. + + current value of the ref. May be null to indicate a ref + that does not exist yet. + + + + + Fast, efficient map specifically for + ObjectId + subclasses. +

+ This map provides an efficient translation from any ObjectId instance to a + cached subclass of ObjectId that has the same value. +

+ If object instances are stored in only one map, + ObjectIdOwnerMap<V> + is a + more efficient implementation. +

+
+ + Create an empty map. + Create an empty map. + + + Remove all entries from this map. + Remove all entries from this map. + + + Lookup an existing mapping. + Lookup an existing mapping. + the object identifier to find. + the instance mapped to toFind, or null if no mapping exists. + + + Returns true if this map contains the specified object. + Returns true if this map contains the specified object. + object to find. + true if the mapping exists for this object; false otherwise. + + + Store an object for future lookup. + + Store an object for future lookup. +

+ An existing mapping for must not be in this map. Callers must + first call + ObjectIdSubclassMap<V>.Get(AnyObjectId) + + to verify there is no current + mapping prior to adding a new mapping, or use + ObjectIdSubclassMap<V>.AddIfAbsent<Q>(ObjectId) + + . + + the object to store. + + +

Store an object for future lookup. + + Store an object for future lookup. +

+ Stores + newValue + , but only if there is not already an object for + the same object name. Callers can tell if the value is new by checking + the return value with reference equality: +

+            V obj = ...;
+            boolean wasNew = map.addIfAbsent(obj) == obj;
+            
+
+ the object to store. + + + newValue + if stored, or the prior value already stored and + that would have been returned had the caller used + get(newValue) + first. + +
+ + number of objects in map + + + + true if + ObjectIdSubclassMap<V>.Size() + is 0. + + + + + Inserts objects into an existing + ObjectDatabase + . +

+ An inserter is not thread-safe. Individual threads should each obtain their + own unique inserter instance, or must arrange for locking at a higher level + to ensure the inserter is in use by no more than one thread at a time. +

+ Objects written by an inserter may not be immediately visible for reading + after the insert method completes. Callers must invoke either + Release() + or + Flush() + prior to updating references or + otherwise making the returned ObjectIds visible to other code. +

+
+ + Digest to compute the name of an object. + Digest to compute the name of an object. + + + Temporary working buffer for streaming data through. + Temporary working buffer for streaming data through. + + + Create a new inserter for a database. + Create a new inserter for a database. + + + Obtain a temporary buffer for use by the ObjectInserter or its subclass. + + + Obtain a temporary buffer for use by the ObjectInserter or its subclass. +

+ This buffer is supplied by the ObjectInserter base class to itself and + its subclasses for the purposes of pulling data from a supplied + InputStream, passing it through a Deflater, or formatting the canonical + format of a small object like a small tree or commit. +

+ This buffer IS NOT for translation such as auto-CRLF or content + filtering and must not be used for such purposes. +

+ The returned buffer is small, around a few KiBs, and the size may change + between versions of JGit. Callers using this buffer must always check the + length of the returned array to ascertain how much space was provided. +

+ There is a single buffer for each ObjectInserter, repeated calls to this + method will (usually) always return the same buffer. If the caller needs + more than one buffer, or needs a buffer of a larger size, it must manage + that buffer on its own. +

+ The buffer is usually on first demand for a buffer. + + a temporary byte array for use by the caller. + + + digest to help compute an ObjectId + + +

Compute the name of an object, without inserting it. + Compute the name of an object, without inserting it. + type code of the object to store. + complete content of the object. + the name of the object. +
+ + Compute the name of an object, without inserting it. + Compute the name of an object, without inserting it. + type code of the object to store. + complete content of the object. + + first position within + data + . + + + number of bytes to copy from + data + . + + the name of the object. + + + Compute the name of an object, without inserting it. + Compute the name of an object, without inserting it. + type code of the object to store. + + number of bytes to scan from + in + . + + + stream providing the object content. The caller is responsible + for closing the stream. + + the name of the object. + the source stream could not be read. + + + Compute the ObjectId for the given tree without inserting it. + Compute the ObjectId for the given tree without inserting it. + + the computed ObjectId + + + Insert a single tree into the store, returning its unique name. + Insert a single tree into the store, returning its unique name. + the formatter containing the proposed tree's data. + the name of the tree object. + the object could not be stored. + + + Insert a single commit into the store, returning its unique name. + Insert a single commit into the store, returning its unique name. + the builder containing the proposed commit's data. + the name of the commit object. + the object could not be stored. + + + Insert a single annotated tag into the store, returning its unique name. + + Insert a single annotated tag into the store, returning its unique name. + + the builder containing the proposed tag's data. + the name of the tag object. + the object could not be stored. + + + Insert a single object into the store, returning its unique name. + Insert a single object into the store, returning its unique name. + type code of the object to store. + complete content of the object. + the name of the object. + the object could not be stored. + + + Insert a single object into the store, returning its unique name. + Insert a single object into the store, returning its unique name. + type code of the object to store. + complete content of the object. + + first position within + data + . + + + number of bytes to copy from + data + . + + the name of the object. + the object could not be stored. + + + Insert a single object into the store, returning its unique name. + Insert a single object into the store, returning its unique name. + type code of the object to store. + + number of bytes to copy from + in + . + + + stream providing the object content. The caller is responsible + for closing the stream. + + the name of the object. + + the object could not be stored, or the source stream could + not be read. + + + + Initialize a parser to read from a pack formatted stream. + Initialize a parser to read from a pack formatted stream. + + the input stream. The stream is not closed by the parser, and + must instead be closed by the caller once parsing is complete. + + the pack parser. + + the parser instance, which can be configured and then used to + parse objects into the ObjectDatabase. + + + + Make all inserted objects visible. + + Make all inserted objects visible. +

+ The flush may take some period of time to make the objects available to + other threads. + + + the flush could not be completed; objects inserted thus far + are in an indeterminate state. + + + +

Release any resources used by this inserter. + + Release any resources used by this inserter. +

+ An inserter that has been released can be used again, but may need to be + released after the subsequent usage. + + + +

An inserter that can be used for formatting and id generation only. + An inserter that can be used for formatting and id generation only. +
+ + + + + + + + + + + Wraps a delegate ObjectInserter. + Wraps a delegate ObjectInserter. + + + delegate ObjectInserter to handle all processing. + + + + + + + + + + + + + + + + + + + + + Base class for a set of loaders for different representations of Git objects. + + + Base class for a set of loaders for different representations of Git objects. + New loaders are constructed for every object. + + + + + Git in pack object type, see + Constants + . + + + + size of object in bytes + + + + true if this object is too large to obtain as a byte array. + Objects over a certain threshold should be accessed only by their + OpenStream() + to prevent overflowing the JVM heap. + + + + Obtain a copy of the bytes of this object. + + Obtain a copy of the bytes of this object. +

+ Unlike + GetCachedBytes() + this method returns an array that might + be modified by the caller. + + the bytes of this object. + + if the object won't fit into a byte array, because + IsLarge() + returns true. Callers should use + OpenStream() + instead to access the contents. + + + +

Obtain a copy of the bytes of this object. + + Obtain a copy of the bytes of this object. + If the object size is less than or equal to + sizeLimit + this method + will provide it as a byte array, even if + IsLarge() + is true. This + utility is useful for application code that absolutely must have the + object as a single contiguous byte array in memory. + Unlike + GetCachedBytes(int) + this method returns an array that + might be modified by the caller. + + + maximum number of bytes to return. If the object is larger + than this limit, + NGit.Errors.LargeObjectException + will be thrown. + + the bytes of this object. + + if the object is bigger than + sizeLimit + , or if + System.OutOfMemoryException + occurs during allocation of the + result array. Callers should use + OpenStream() + instead to access the contents. + + the object is large, and it no longer exists. + + the object store cannot be accessed. +
+ + Obtain a reference to the (possibly cached) bytes of this object. + + Obtain a reference to the (possibly cached) bytes of this object. +

+ This method offers direct access to the internal caches, potentially + saving on data copies between the internal cache and higher level code. + Callers who receive this reference must not modify its contents. + Changes (if made) will affect the cache but not the repository itself. + + the cached bytes of this object. Do not modify it. + + if the object won't fit into a byte array, because + IsLarge() + returns true. Callers should use + OpenStream() + instead to access the contents. + + + +

Obtain a reference to the (possibly cached) bytes of this object. + + Obtain a reference to the (possibly cached) bytes of this object. + If the object size is less than or equal to + sizeLimit + this method + will provide it as a byte array, even if + IsLarge() + is true. This + utility is useful for application code that absolutely must have the + object as a single contiguous byte array in memory. + This method offers direct access to the internal caches, potentially + saving on data copies between the internal cache and higher level code. + Callers who receive this reference must not modify its contents. + Changes (if made) will affect the cache but not the repository itself. + + + maximum number of bytes to return. If the object size is + larger than this limit and + IsLarge() + is true, + NGit.Errors.LargeObjectException + will be thrown. + + the cached bytes of this object. Do not modify it. + + if the object is bigger than + sizeLimit + , or if + System.OutOfMemoryException + occurs during allocation of the + result array. Callers should use + OpenStream() + instead to access the contents. + + the object is large, and it no longer exists. + + the object store cannot be accessed. +
+ + Obtain an input stream to read this object's data. + Obtain an input stream to read this object's data. + + a stream of this object's data. Caller must close the stream when + through with it. The returned stream is buffered with a + reasonable buffer size. + + the object no longer exists. + + the object store cannot be accessed. + + + Copy this object to the output stream. + + Copy this object to the output stream. +

+ For some object store implementations, this method may be more efficient + than reading from + OpenStream() + into a temporary byte array, then + writing to the destination stream. +

+ The default implementation of this method is to copy with a temporary + byte array for large objects, or to pass through the cached byte array + for small objects. + + + stream to receive the complete copy of this object's data. + Caller is responsible for flushing or closing this stream + after this method returns. + + the object no longer exists. + + + the object store cannot be accessed, or the stream cannot be + written to. + + + +

Simple loader around the cached byte array. + + Simple loader around the cached byte array. +

+ ObjectReader implementations can use this stream type when the object's + content is small enough to be accessed as a single byte array. + + + +

Construct a small object loader. + Construct a small object loader. + type of the object. + + the object's data array. This array will be returned as-is + for the + GetCachedBytes() + method. + +
+ + + Reads an + ObjectDatabase + for a single thread. +

+ Readers that can support efficient reuse of pack encoded objects should also + implement the companion interface + NGit.Storage.Pack.ObjectReuseAsIs + . +

+
+ + Type hint indicating the caller doesn't know the type. + Type hint indicating the caller doesn't know the type. + + + Construct a new reader from the same data. + + Construct a new reader from the same data. +

+ Applications can use this method to build a new reader from the same data + source, but for an different thread. + + a brand new reader, using the same data source. + + +

Obtain a unique abbreviation (prefix) of an object SHA-1. + + Obtain a unique abbreviation (prefix) of an object SHA-1. + This method uses a reasonable default for the minimum length. Callers who + don't care about the minimum length should prefer this method. + The returned abbreviation would expand back to the argument ObjectId when + passed to + Resolve(AbbreviatedObjectId) + , assuming no new objects + are added to this repository between calls. + + object identity that needs to be abbreviated. + SHA-1 abbreviation. + the object store cannot be read. +
+ + Obtain a unique abbreviation (prefix) of an object SHA-1. + + Obtain a unique abbreviation (prefix) of an object SHA-1. + The returned abbreviation would expand back to the argument ObjectId when + passed to + Resolve(AbbreviatedObjectId) + , assuming no new objects + are added to this repository between calls. + The default implementation of this method abbreviates the id to the + minimum length, then resolves it to see if there are multiple results. + When multiple results are found, the length is extended by 1 and resolve + is tried again. + + object identity that needs to be abbreviated. + + minimum length of the abbreviated string. Must be in the range + [2, + Constants#OBJECT_ID_STRING_LENGTH + ]. + + + SHA-1 abbreviation. If no matching objects exist in the + repository, the abbreviation will match the minimum length. + + the object store cannot be read. + + + Resolve an abbreviated ObjectId to its full form. + + Resolve an abbreviated ObjectId to its full form. + This method searches for an ObjectId that begins with the abbreviation, + and returns at least some matching candidates. + If the returned collection is empty, no objects start with this + abbreviation. The abbreviation doesn't belong to this repository, or the + repository lacks the necessary objects to complete it. + If the collection contains exactly one member, the abbreviation is + (currently) unique within this database. There is a reasonably high + probability that the returned id is what was previously abbreviated. + If the collection contains 2 or more members, the abbreviation is not + unique. In this case the implementation is only required to return at + least 2 candidates to signal the abbreviation has conflicts. User + friendly implementations should return as many candidates as reasonably + possible, as the caller may be able to disambiguate further based on + context. However since databases can be very large (e.g. 10 million + objects) returning 625,000 candidates for the abbreviation "0" is simply + unreasonable, so implementors should draw the line at around 256 matches. + + + abbreviated id to resolve to a complete identity. The + abbreviation must have a length of at least 2. + + candidates that begin with the abbreviated identity. + the object store cannot be read. + + + Does the requested object exist in this database? + identity of the object to test for existence of. + true if the specified object is stored in this database. + the object store cannot be accessed. + + + Does the requested object exist in this database? + identity of the object to test for existence of. + + hint about the type of object being requested; + OBJ_ANY + if the object type is not known, or does not + matter to the caller. + + true if the specified object is stored in this database. + + typeHint was not OBJ_ANY, and the object's actual type does + not match typeHint. + + the object store cannot be accessed. + + + Open an object from this database. + Open an object from this database. + identity of the object to open. + + a + ObjectLoader + for accessing the object. + + the object does not exist. + the object store cannot be accessed. + + + Open an object from this database. + Open an object from this database. + identity of the object to open. + + hint about the type of object being requested; + OBJ_ANY + if the object type is not known, or does not + matter to the caller. + + + a + ObjectLoader + for accessing the object. + + the object does not exist. + + typeHint was not OBJ_ANY, and the object's actual type does + not match typeHint. + + the object store cannot be accessed. + + + Asynchronous object opening. + Asynchronous object opening. + + objects to open from the object store. The supplied collection + must not be modified until the queue has finished. + + + if true missing objects are reported by calling failure with a + MissingObjectException. This may be more expensive for the + implementation to guarantee. If false the implementation may + choose to report MissingObjectException, or silently skip over + the object with no warning. + + queue to read the objects from. + + + Get only the size of an object. + + Get only the size of an object. +

+ The default implementation of this method opens an ObjectLoader. + Databases are encouraged to override this if a faster access method is + available to them. + + identity of the object to open. + + hint about the type of object being requested; + OBJ_ANY + if the object type is not known, or does not + matter to the caller. + + size of object in bytes. + the object does not exist. + + typeHint was not OBJ_ANY, and the object's actual type does + not match typeHint. + + the object store cannot be accessed. + + +

Asynchronous object size lookup. + Asynchronous object size lookup. + + objects to get the size of from the object store. The supplied + collection must not be modified until the queue has finished. + + + if true missing objects are reported by calling failure with a + MissingObjectException. This may be more expensive for the + implementation to guarantee. If false the implementation may + choose to report MissingObjectException, or silently skip over + the object with no warning. + + queue to read object sizes from. +
+ + + Advice from a + NGit.Revwalk.RevWalk + that a walk is starting from these roots. + + the revision pool that is using this reader. + + starting points of the revision walk. The starting points have + their headers parsed, but might be missing bodies. + + the reader cannot initialize itself to support the walk. + + + + + Advice from an + NGit.Revwalk.ObjectWalk + that trees will be traversed. + + the object pool that is using this reader. + the first commit whose root tree will be read. + the last commit whose root tree will be read. + the reader cannot initialize itself to support the walk. + + + + Advice from that a walk is over. + Advice from that a walk is over. + + + Release any resources used by this reader. + + Release any resources used by this reader. +

+ A reader that has been released can be used again, but may need to be + released after the subsequent usage. + + + + + + + + + + + + + + +

+ Stream of data coming from an object loaded by + ObjectLoader + . + +
+ + + Git object type, see + Constants + . + + + + total size of object in bytes + + + Simple stream around the cached byte array created by a loader. + + Simple stream around the cached byte array created by a loader. +

+ ObjectLoader implementations can use this stream type when the object's + content is small enough to be accessed as a single byte array, but the + application has still requested it in stream format. + + + +

Create the stream from an existing loader's cached bytes. + Create the stream from an existing loader's cached bytes. + the loader. +
+ + Create the stream from an existing byte array and type. + Create the stream from an existing byte array and type. + the type constant for the object. + the fully inflated content of the object. + + + Simple filter stream around another stream. + + Simple filter stream around another stream. +

+ ObjectLoader implementations can use this stream type when the object's + content is available from a standard InputStream. + + + +

Create a filter stream for an object. + Create a filter stream for an object. + the type of the object. + total size of the object, in bytes. + + stream the object's raw data is available from. This + stream should be buffered with some reasonable amount of + buffering. + +
+ + + + + + + + + + + + + + + + + + + + A combination of a person identity and time in Git. + + A combination of a person identity and time in Git. + Git combines Name + email + time + time zone to specify who wrote or + committed something. + + + + Creates new PersonIdent from config info in repository, with current time. + + + Creates new PersonIdent from config info in repository, with current time. + This new PersonIdent gets the info from the default committer as available + from the configuration. + + + + + + Copy a + PersonIdent + . + + + Original + PersonIdent + + + + + Construct a new + PersonIdent + with current time. + + + + + + Copy a PersonIdent, but alter the clone's time stamp + + original + PersonIdent + + local time + time zone + + + + Copy a + PersonIdent + , but alter the clone's time stamp + + + original + PersonIdent + + local time + + + Construct a PersonIdent from simple data + + + local time stamp + time zone + + + Copy a PersonIdent, but alter the clone's time stamp + + original + PersonIdent + + local time stamp + time zone + + + + Construct a + PersonIdent + + + + local time stamp + time zone + + + Name of person + + + email address of person + + + timestamp + + + this person's declared time zone; null if time zone is unknown. + + + + this person's declared time zone as minutes east of UTC. If the + timezone is to the west of UTC it is negative. + + + + Format for Git storage. + Format for Git storage. + a string in the git author format + + + + Location where a + Ref + is stored. + + + + The ref does not exist yet, updating it may create it. + + The ref does not exist yet, updating it may create it. +

+ Creation is likely to choose + LOOSE + storage. + + + +

The ref is stored in a file by itself. + + The ref is stored in a file by itself. +

+ Updating this ref affects only this ref. + + + +

The ref is stored in the packed-refs file, with others. + + The ref is stored in the packed-refs file, with others. +

+ Updating this ref requires rewriting the file, with perhaps many + other refs being included at the same time. + + + +

+ The ref is both + LOOSE + and + PACKED + . +

+ Updating this ref requires only updating the loose file, but deletion + requires updating both the loose file and the packed refs file. +

+
+ + The ref came from a network advertisement and storage is unknown. + + The ref came from a network advertisement and storage is unknown. +

+ This ref cannot be updated without Git-aware support on the remote + side, as Git-aware code consolidate the remote refs and reported them + to this process. + + + + true if this storage has a loose file. + + + true if this storage is inside the packed file. + + +

Util for sorting (or comparing) Ref instances by name. + + Util for sorting (or comparing) Ref instances by name. +

+ Useful for command line tools or writing out refs to file. + + + +

Singleton instance of RefComparator +
+ + Sorts the collection of refs, returning a new collection. + Sorts the collection of refs, returning a new collection. + collection to be sorted + sorted collection of refs + + + Compare a reference to a name. + Compare a reference to a name. + the reference instance. + the name to compare to. + standard Comparator result of < 0, 0, > 0. + + + Compare two references by name. + Compare two references by name. + the reference instance. + the other reference instance. + standard Comparator result of < 0, 0, > 0. + + + + Abstraction of name to + ObjectId + mapping. +

+ A reference database stores a mapping of reference names to + ObjectId + . + Every + Repository + has a single reference database, mapping names to + the tips of the object graph contained by the + ObjectDatabase + . +

+
+ + + Maximum number of times a + SymbolicRef + can be traversed. +

+ If the reference is nested deeper than this depth, the implementation + should either fail, or at least claim the reference does not exist. +

+
+ + Order of prefixes to search when using non-absolute references. + + Order of prefixes to search when using non-absolute references. +

+ The implementation's + GetRef(string) + method must take this search + space into consideration when locating a reference by name. The first + entry in the path is always + "" + , ensuring that absolute references + are resolved without further mangling. + + + +

+ Magic value for + GetRefs(string) + to return all references. + +
+ + Initialize a new reference database at this location. + Initialize a new reference database at this location. + the database could not be created. + + + Close any resources held by this database. + Close any resources held by this database. + + + Determine if a proposed reference name overlaps with an existing one. + + Determine if a proposed reference name overlaps with an existing one. +

+ Reference names use '/' as a component separator, and may be stored in a + hierarchical storage such as a directory on the local filesystem. +

+ If the reference "refs/heads/foo" exists then "refs/heads/foo/bar" must + not exist, as a reference cannot have a value and also be a container for + other references at the same time. +

+ If the reference "refs/heads/foo/bar" exists than the reference + "refs/heads/foo" cannot exist, for the same reason. + + proposed name. + + true if the name overlaps with an existing reference; false if + using this name right now would be safe. + + the database could not be read to check for conflicts. + + + +

Create a new update command to create, modify or delete a reference. + Create a new update command to create, modify or delete a reference. + the name of the reference. + + if + true + and + name + is currently a + SymbolicRef + , the update will replace it with an + ObjectIdRef + . Otherwise, the update will recursively + traverse + SymbolicRef + s and operate on the leaf + ObjectIdRef + . + + a new update for the requested name; never null. + the reference space cannot be accessed. +
+ + Create a new update command to rename a reference. + Create a new update command to rename a reference. + name of reference to rename from + name of reference to rename to + an update command that knows how to rename a branch to another. + the reference space cannot be accessed. + + + Create a new batch update to attempt on this database. + + Create a new batch update to attempt on this database. +

+ The default implementation performs a sequential update of each command. + + a new batch update object. + + +

Read a single reference. + + Read a single reference. +

+ Aside from taking advantage of + SEARCH_PATH + , this method may be + able to more quickly resolve a single reference name than obtaining the + complete namespace by + getRefs(ALL).get(name) + . + + + the name of the reference. May be a short name which must be + searched for using the standard + SEARCH_PATH + . + + + the reference (if it exists); else + null + . + + the reference space cannot be accessed. + + +

Get a section of the reference namespace. + Get a section of the reference namespace. + + prefix to search the namespace with; must end with + / + . + If the empty string ( + ALL + ), obtain a complete snapshot + of all references. + + + modifiable map that is a complete snapshot of the current + reference namespace, with + prefix + removed from the start + of each key. The map can be an unsorted map. + + the reference space cannot be accessed. +
+ + Get the additional reference-like entities from the repository. + + Get the additional reference-like entities from the repository. +

+ The result list includes non-ref items such as MERGE_HEAD and + FETCH_RESULT cast to be refs. The names of these refs are not returned by + getRefs(ALL) but are accepted by + GetRef(string) + + a list of additional refs + the reference space cannot be accessed. + + +

Peel a possibly unpeeled reference by traversing the annotated tags. + + Peel a possibly unpeeled reference by traversing the annotated tags. +

+ If the reference cannot be peeled (as it does not refer to an annotated + tag) the peeled id stays null, but + Ref.IsPeeled() + will be true. +

+ Implementors should check + Ref.IsPeeled() + before performing any + additional work effort. + + The reference to peel + + + ref + if + ref.isPeeled() + is true; otherwise a new + Ref object representing the same data as Ref, but isPeeled() will + be true and getPeeledObjectId() will contain the peeled object + (or null). + + the reference space or object space cannot be accessed. + + + +

Triggers a refresh of all internal data structures. + + Triggers a refresh of all internal data structures. +

+ In case the RefDatabase implementation has internal caches this method + will trigger that all these caches are cleared. +

+ Implementors should overwrite this method if they use any kind of caches. + + + +

A RefUpdate combination for renaming a reference. + + A RefUpdate combination for renaming a reference. +

+ If the source reference is currently pointed to by + HEAD + , then the + HEAD symbolic reference is updated to point to the new destination. + + + +

Update operation to read and delete the source reference. + Update operation to read and delete the source reference. +
+ + Update operation to create/overwrite the destination reference. + Update operation to create/overwrite the destination reference. + + + Initialize a new rename operation. + Initialize a new rename operation. + operation to read and delete the source. + operation to create (or overwrite) the destination. + + + identity of the user making the change in the reflog. + + + Set the identity of the user appearing in the reflog. + + Set the identity of the user appearing in the reflog. +

+ The timestamp portion of the identity is ignored. A new identity with the + current timestamp will be created automatically when the rename occurs + and the log record is written. + + + identity of the user. If null the identity will be + automatically determined based on the repository + configuration. + + + +

Get the message to include in the reflog. + Get the message to include in the reflog. + + message the caller wants to include in the reflog; null if the + rename should not be logged. + +
+ + Set the message to include in the reflog. + Set the message to include in the reflog. + the message to describe this change. + + + Don't record this rename in the ref's associated reflog. + Don't record this rename in the ref's associated reflog. + + + result of rename operation + + + the result of the new ref update + System.IO.IOException + + + the result of the rename operation. + System.IO.IOException + + + + true if the + Constants#HEAD + reference needs to be linked + to the new destination name. + + + the current value of + HEAD + cannot be read. + + + + Creates, updates or deletes any reference. + Creates, updates or deletes any reference. + + + New value the caller wants this ref to have. + New value the caller wants this ref to have. + + + Does this specification ask for forced updated (rewind/reset)? + + + Identity to record action as within the reflog. + Identity to record action as within the reflog. + + + Message the caller wants included in the reflog. + Message the caller wants included in the reflog. + + + + Should the Result value be appended to + refLogMessage + . + + + + Old value of the ref, obtained after we lock it. + Old value of the ref, obtained after we lock it. + + + + If non-null, the value + oldValue + must have to continue. + + + + Result of the update operation. + Result of the update operation. + + + + Is this RefUpdate detaching a symbolic ref? + We need this info since this.ref will normally be peeled of in case of + detaching a symbolic ref (HEAD for example). + + + Is this RefUpdate detaching a symbolic ref? + We need this info since this.ref will normally be peeled of in case of + detaching a symbolic ref (HEAD for example). + Without this flag we cannot decide whether the ref has to be updated or + not in case when it was a symbolic ref and the newValue == oldValue. + + + + Construct a new update operation for the reference. + + Construct a new update operation for the reference. +

+ ref.getObjectId() + will be used to seed + GetOldObjectId() + , + which callers can use as part of their own update logic. + + the reference that will be updated by this operation. + + + the reference database this update modifies. + + + the repository storing the database's objects. + + +

Try to acquire the lock on the reference. + + Try to acquire the lock on the reference. +

+ If the locking was successful the implementor must set the current + identity value by calling + SetOldObjectId(ObjectId) + . + + + true if the lock should be taken against the leaf level + reference; false if it should be taken exactly against the + current reference. + + + true if the lock was acquired and the reference is likely + protected from concurrent modification; false if it failed. + + + the lock couldn't be taken due to an unexpected storage + failure, and not because of a concurrent update. + + + +

+ Releases the lock taken by + TryLock(bool) + if it succeeded. + +
+ + + + + result + + System.IO.IOException + + + + + + result + + System.IO.IOException + + + + + + Result.NEW + on success. + + System.IO.IOException + + + Get the name of the ref this update will operate on. + Get the name of the ref this update will operate on. + name of underlying ref. + + + the reference this update will create or modify. + + + Get the new value the ref will be (or was) updated to. + Get the new value the ref will be (or was) updated to. + new value. Null if the caller has not configured it. + + + Tells this RefUpdate that it is actually detaching a symbolic ref. + Tells this RefUpdate that it is actually detaching a symbolic ref. + + + Set the new value the ref will update to. + Set the new value the ref will update to. + the new value. + + + + the expected value of the ref after the lock is taken, but before + update occurs. Null to avoid the compare and swap test. Use + ObjectId.ZeroId() + to indicate expectation of a + non-existant ref. + + + + + the expected value of the ref after the lock is taken, but + before update occurs. Null to avoid the compare and swap test. + Use + ObjectId.ZeroId() + to indicate expectation of a + non-existant ref. + + + + Check if this update wants to forcefully change the ref. + Check if this update wants to forcefully change the ref. + true if this update should ignore merge tests. + + + Set if this update wants to forcefully change the ref. + Set if this update wants to forcefully change the ref. + true if this update should ignore merge tests. + + + identity of the user making the change in the reflog. + + + Set the identity of the user appearing in the reflog. + + Set the identity of the user appearing in the reflog. +

+ The timestamp portion of the identity is ignored. A new identity with the + current timestamp will be created automatically when the update occurs + and the log record is written. + + + identity of the user. If null the identity will be + automatically determined based on the repository + configuration. + + + +

Get the message to include in the reflog. + Get the message to include in the reflog. + + message the caller wants to include in the reflog; null if the + update should not be logged. + +
+ + + + true + if the ref log message should show the result. + + + + Set the message to include in the reflog. + Set the message to include in the reflog. + + the message to describe this change. It may be null if + appendStatus is null in order not to append to the reflog + + + true if the status of the ref change (fast-forward or + forced-update) should be appended to the user supplied + message. + + + + Don't record this update in the ref's associated reflog. + Don't record this update in the ref's associated reflog. + + + The old value of the ref, prior to the update being attempted. + + The old value of the ref, prior to the update being attempted. +

+ This value may differ before and after the update method. Initially it is + populated with the value of the ref before the lock is taken, but the old + value may change if someone else modified the ref between the time we + last read it and when the ref was locked for update. + + + the value of the ref prior to the update being attempted; null if + the updated has not been attempted yet. + + + +

Set the old value of the ref. + Set the old value of the ref. + the old value. +
+ + Get the status of this update. + + Get the status of this update. +

+ The same value that was previously returned from an update method. + + the status of the update. + + +

Force the ref to take the new value. + + Force the ref to take the new value. +

+ This is just a convenient helper for setting the force flag, and as such + the merge test is performed. + + the result status of the update. + an unexpected IO error occurred while writing changes. + + + +

Gracefully update the ref to the new value. + + Gracefully update the ref to the new value. +

+ Merge test will be performed according to + IsForceUpdate() + . +

+ This is the same as: +

+            return update(new RevWalk(getRepository()));
+            
+
+ the result status of the update. + an unexpected IO error occurred while writing changes. + +
+ + Gracefully update the ref to the new value. + + Gracefully update the ref to the new value. +

+ Merge test will be performed according to + IsForceUpdate() + . + + + a RevWalk instance this update command can borrow to perform + the merge test. The walk will be reset to perform the test. + + the result status of the update. + an unexpected IO error occurred while writing changes. + + + +

Delete the ref. + + Delete the ref. +

+ This is the same as: +

+            return delete(new RevWalk(getRepository()));
+            
+
+ the result status of the delete. + System.IO.IOException +
+ + Delete the ref. + Delete the ref. + + a RevWalk instance this delete command can borrow to perform + the merge test. The walk will be reset to perform the test. + + the result status of the delete. + System.IO.IOException + + + Replace this reference with a symbolic reference to another reference. + + Replace this reference with a symbolic reference to another reference. +

+ This exact reference (not its traversed leaf) is replaced with a symbolic + reference to the requested name. + + + name of the new target for this reference. The new target name + must be absolute, so it must begin with + refs/ + . + + + + Result.NEW + or + Result.FORCED + on success. + + System.IO.IOException + + + + + + + + +

Status of an update request. + Status of an update request. +
+ + Handle the abstraction of storing a ref update. + + Handle the abstraction of storing a ref update. This is because both + updating and deleting of a ref have merge testing in common. + + + + + + + + + + + + + + Writes out refs to the + Constants.INFO_REFS + and + Constants.PACKED_REFS + files. + This class is abstract as the writing of the files must be handled by the + caller. This is because it is used by transport classes as well. + + + + + the complete set of references. This should have been computed + by applying updates to the advertised refs already discovered. + + + + + the complete set of references. This should have been computed + by applying updates to the advertised refs already discovered. + + + + + the complete set of references. This should have been computed + by applying updates to the advertised refs already discovered. + + + + + Rebuild the + Constants.INFO_REFS + . +

+ This method rebuilds the contents of the + Constants.INFO_REFS + file + to match the passed list of references. +

+ + writing is not supported, or attempting to write the file + failed, possibly due to permissions or remote disk full, etc. + +
+ + + Rebuild the + Constants.PACKED_REFS + file. +

+ This method rebuilds the contents of the + Constants.PACKED_REFS + file to match the passed list of references, including only those refs + that have a storage type of + RefStorage.PACKED + . +

+ + writing is not supported, or attempting to write the file + failed, possibly due to permissions or remote disk full, etc. + +
+ + + Handles actual writing of ref files to the git repository, which may + differ slightly depending on the destination and transport. + + + Handles actual writing of ref files to the git repository, which may + differ slightly depending on the destination and transport. + + path to ref file. + byte content of file to be written. + System.IO.IOException + + + Represents a Git repository. + + Represents a Git repository. +

+ A repository holds all objects and refs used for managing source code (could + be any type of file, but source code is what SCM's are typically used for). +

+ This class is thread-safe. + + + + the global listener list observing all events in this JVM. + + +

Metadata directory holding the repository's critical files. + Metadata directory holding the repository's critical files. +
+ + File abstraction used to resolve paths. + File abstraction used to resolve paths. + + + If not bare, the top level directory of the working files. + If not bare, the top level directory of the working files. + + + If not bare, the index file caching the working file states. + If not bare, the index file caching the working file states. + + + Initialize a new repository instance. + Initialize a new repository instance. + options to configure the repository. + + + Fire an event to all registered listeners. + + Fire an event to all registered listeners. +

+ The source repository of the event is automatically set to this + repository, before the event is delivered to any listeners. + + the event to deliver. + + +

Create a new Git repository. + + Create a new Git repository. +

+ Repository with working tree is created using this method. This method is + the same as + create(false) + . + + System.IO.IOException + Create(bool) + + +

+ Create a new Git repository initializing the necessary files and + directories. + + + Create a new Git repository initializing the necessary files and + directories. + + + if true, a bare repository (a repository without a working + directory) is created. + + in case of IO problem +
+ + + a new inserter to create objects in + ObjectDatabase() + + + + + + a new reader to read objects from + ObjectDatabase() + + + + + the configuration of this repository + + + + + true if the specified object is stored in this repo or any of the + known shared repositories. + + + + Open an object from this repository. + + Open an object from this repository. +

+ This is a one-shot call interface which may be faster than allocating a + NewObjectReader() + to perform the lookup. + + identity of the object to open. + + a + ObjectLoader + for accessing the object. + + the object does not exist. + the object store cannot be accessed. + + +

Open an object from this repository. + + Open an object from this repository. +

+ This is a one-shot call interface which may be faster than allocating a + NewObjectReader() + to perform the lookup. + + identity of the object to open. + + hint about the type of object being requested; + ObjectReader.OBJ_ANY + if the object type is not known, + or does not matter to the caller. + + + a + ObjectLoader + for accessing the object. + + the object does not exist. + + typeHint was not OBJ_ANY, and the object's actual type does + not match typeHint. + + the object store cannot be accessed. + + +

Create a command to update, create or delete a ref in this repository. + Create a command to update, create or delete a ref in this repository. + name of the ref the caller wants to modify. + + an update command. The caller must finish populating this command + and then invoke one of the update methods to actually make a + change. + + + a symbolic ref was passed in and could not be resolved back + to the base ref, as the symbolic ref could not be read. + +
+ + Create a command to update, create or delete a ref in this repository. + Create a command to update, create or delete a ref in this repository. + name of the ref the caller wants to modify. + true to create a detached head + + an update command. The caller must finish populating this command + and then invoke one of the update methods to actually make a + change. + + + a symbolic ref was passed in and could not be resolved back + to the base ref, as the symbolic ref could not be read. + + + + Create a command to rename a ref in this repository + name of ref to rename from + name of ref to rename to + an update command that knows how to rename a branch to another. + the rename could not be performed. + + + Parse a git revision string and return an object id. + + Parse a git revision string and return an object id. + Combinations of these operators are supported: +
    +
  • HEAD, MERGE_HEAD, FETCH_HEAD
  • +
  • SHA-1: a complete or abbreviated SHA-1
  • +
  • refs/...: a complete reference name
  • +
  • short-name: a short reference name under + refs/heads + , + refs/tags + , or + refs/remotes + namespace
  • +
  • tag-NN-gABBREV: output from describe, parsed by treating + ABBREV + as an abbreviated SHA-1.
  • +
  • id^: first parent of commit id, this is the same + as + id^1 +
  • +
  • id^0: ensure id is a commit
  • +
  • id^n: n-th parent of commit id
  • +
  • id~n: n-th historical ancestor of id, by first + parent. + id~3 + is equivalent to + id^1^1^1 + or + id^^^ + .
  • +
  • id:path: Lookup path under tree named by id
  • +
  • id^{commit}: ensure id is a commit
  • +
  • id^{tree}: ensure id is a tree
  • +
  • id^{tag}: ensure id is a tag
  • +
  • id^{blob}: ensure id is a blob
  • +
+

+ The following operators are specified by Git conventions, but are not + supported by this method: +

    +
  • ref@{n}: n-th version of ref as given by its reflog
  • +
  • ref@{time}: value of ref at the designated time
  • +
+
+ A git object references expression + an ObjectId or null if revstr can't be resolved to any ObjectId + + revstr + contains an abbreviated ObjectId and this + repository contains more than one object which match to the + input abbreviation. + + + the id parsed does not meet the type required to finish + applying the operators in the expression. + + + the expression is not supported by this implementation, or + does not meet the standard syntax. + + on serious errors +
+ + + Simplify an expression, but unlike + Resolve(string) + it will not + resolve a branch passed or resulting from the expression, such as @{-}. + Thus this method can be used to process an expression to a method that + expects a branch or revision id. + + + object id or ref name from resolved expression + NGit.Errors.AmbiguousObjectException + + System.IO.IOException + + + + + + + + + + + + + + + + + + + + + + + Increment the use counter by one, requiring a matched + Close() + . + + + + Decrement the use count, and maybe close resources. + Decrement the use count, and maybe close resources. + + + + Invoked when the use count drops to zero during + Close() + . +

+ The default implementation closes the object and ref databases. +

+
+ + + Get the name of the reference that + HEAD + points to. +

+ This is essentially the same as doing: +

+            return getRef(Constants.HEAD).getTarget().getName()
+            
+ Except when HEAD is detached, in which case this method returns the + current ObjectId in hexadecimal string format. +
+ + name of current branch (for example + refs/heads/master + ) or + an ObjectId in hex format if the current branch is detached. + + System.IO.IOException +
+ + + Get the short name of the current branch that + HEAD + points to. +

+ This is essentially the same as + GetFullBranch() + , except the + leading prefix + refs/heads/ + is removed from the reference before + it is returned to the caller. +

+ + name of current branch (for example + master + ), or an + ObjectId in hex format if the current branch is detached. + + System.IO.IOException +
+ + + Objects known to exist but not expressed by + GetAllRefs() + . +

+ When a repository borrows objects from another repository, it can + advertise that it safely has that other repository's references, without + exposing any other details about the other repository. This may help + a client trying to push changes avoid pushing more than it needs to. +

+ unmodifiable collection of other known objects. +
+ + Get a ref by name. + Get a ref by name. + + the name of the ref to lookup. May be a short-hand form, e.g. + "master" which is is automatically expanded to + "refs/heads/master" if "refs/heads/master" already exists. + + the Ref with the given name, or null if it does not exist + System.IO.IOException + + + mutable map of all known refs (heads, tags, remotes). + + + + mutable map of all tags; key is short tag name ("v1.0") and value + of the entry contains the ref with the full tag name + ("refs/tags/v1.0"). + + + + Peel a possibly unpeeled reference to an annotated tag. + + Peel a possibly unpeeled reference to an annotated tag. +

+ If the ref cannot be peeled (as it does not refer to an annotated tag) + the peeled id stays null, but + Ref.IsPeeled() + will be true. + + The ref to peel + + ref if ref.isPeeled() is true; else a + new Ref object representing the same data as Ref, but isPeeled() + will be true and getPeeledObjectId will contain the peeled object + (or null). + + + + a map with all objects referenced by a peeled ref. + + + the index file location + + if this is bare, which implies it has no working directory. + See + IsBare() + . + + + +

Create a new in-core index representation and read an index from disk. + + Create a new in-core index representation and read an index from disk. +

+ The new index will be read before it is returned to the caller. Read + failures are reported as exceptions and therefore prevent the method from + returning a partially populated index. + + + a cache representing the contents of the specified index file (if + it exists) or an empty cache if the file does not exist. + + + if this is bare, which implies it has no working directory. + See + IsBare() + . + + the index file is present but could not be read. + + + the index file is using a format or extension that this + library does not support. + + + +

Create a new in-core index representation, lock it, and read from disk. + + Create a new in-core index representation, lock it, and read from disk. +

+ The new index will be locked and then read before it is returned to the + caller. Read failures are reported as exceptions and therefore prevent + the method from returning a partially populated index. + + + a cache representing the contents of the specified index file (if + it exists) or an empty cache if the file does not exist. + + + if this is bare, which implies it has no working directory. + See + IsBare() + . + + + the index file is present but could not be read, or the lock + could not be obtained. + + + the index file is using a format or extension that this + library does not support. + + + + an important state + + +

Check validity of a ref name. + + Check validity of a ref name. It must not contain character that has + a special meaning in a Git object reference expression. Some other + dangerous characters are also excluded. + For portability reasons '\' is excluded + + + true if refName is a valid ref name +
+ + Strip work dir and return normalized repository path. + Strip work dir and return normalized repository path. + Work dir + File whose path shall be stripped of its workdir + + normalized repository relative path or the empty + string if the file is not relative to the work directory. + + + + Force a scan for changed refs. + Force a scan for changed refs. + System.IO.IOException + + + Notify that the index changed + + + + a more user friendly ref name + + + + + a + NGit.Storage.File.ReflogReader + for the supplied refname, or null if the + named ref does not exist. + + the ref could not be accessed. + + + Return the information stored in the file $GIT_DIR/MERGE_MSG. + + Return the information stored in the file $GIT_DIR/MERGE_MSG. In this + file operations triggering a merge will store a template for the commit + message of the merge commit. + + + a String containing the content of the MERGE_MSG file or + null + if this file doesn't exist + + System.IO.IOException + + if this is bare, which implies it has no working directory. + See + IsBare() + . + + + + Write new content to the file $GIT_DIR/MERGE_MSG. + + Write new content to the file $GIT_DIR/MERGE_MSG. In this file operations + triggering a merge will store a template for the commit message of the + merge commit. If null is specified as message the file will + be deleted. + + + the message which should be written or null to + delete the file + + System.IO.IOException + + + Return the information stored in the file $GIT_DIR/MERGE_HEAD. + + Return the information stored in the file $GIT_DIR/MERGE_HEAD. In this + file operations triggering a merge will store the IDs of all heads which + should be merged together with HEAD. + + + a list of commits which IDs are listed in the MERGE_HEAD file or + null + if this file doesn't exist. Also if the file exists + but is empty + null + will be returned + + System.IO.IOException + + if this is bare, which implies it has no working directory. + See + IsBare() + . + + + + Write new merge-heads into $GIT_DIR/MERGE_HEAD. + + Write new merge-heads into $GIT_DIR/MERGE_HEAD. In this file operations + triggering a merge will store the IDs of all heads which should be merged + together with HEAD. If null is specified as list of commits + the file will be deleted + + + a list of commits which IDs should be written to + $GIT_DIR/MERGE_HEAD or null to delete the file + + System.IO.IOException + + + Return the information stored in the file $GIT_DIR/CHERRY_PICK_HEAD. + Return the information stored in the file $GIT_DIR/CHERRY_PICK_HEAD. + + object id from CHERRY_PICK_HEAD file or + null + if this file + doesn't exist. Also if the file exists but is empty + null + will be returned + + System.IO.IOException + + if this is bare, which implies it has no working directory. + See + IsBare() + . + + + + Write cherry pick commit into $GIT_DIR/CHERRY_PICK_HEAD. + + Write cherry pick commit into $GIT_DIR/CHERRY_PICK_HEAD. This is used in + case of conflicts to store the cherry which was tried to be picked. + + + an object id of the cherry commit or null to + delete the file + + System.IO.IOException + + + Write original HEAD commit into $GIT_DIR/ORIG_HEAD. + Write original HEAD commit into $GIT_DIR/ORIG_HEAD. + + an object id of the original HEAD commit or null + to delete the file + + System.IO.IOException + + + Return the information stored in the file $GIT_DIR/ORIG_HEAD. + Return the information stored in the file $GIT_DIR/ORIG_HEAD. + + object id from ORIG_HEAD file or + null + if this file + doesn't exist. Also if the file exists but is empty + null + will be returned + + System.IO.IOException + + if this is bare, which implies it has no working directory. + See + IsBare() + . + + + + Return the information stored in the file $GIT_DIR/SQUASH_MSG. + + Return the information stored in the file $GIT_DIR/SQUASH_MSG. In this + file operations triggering a squashed merge will store a template for the + commit message of the squash commit. + + + a String containing the content of the SQUASH_MSG file or + null + if this file doesn't exist + + System.IO.IOException + + if this is bare, which implies it has no working directory. + See + IsBare() + . + + + + Write new content to the file $GIT_DIR/SQUASH_MSG. + + Write new content to the file $GIT_DIR/SQUASH_MSG. In this file + operations triggering a squashed merge will store a template for the + commit message of the squash commit. If null is specified as + message the file will be deleted. + + + the message which should be written or null to + delete the file + + System.IO.IOException + + + + + + + + + Read a file from the git directory. + Read a file from the git directory. + + the raw contents or null if the file doesn't exist or is empty + System.IO.IOException + + + Write the given heads to a file in the git directory. + Write the given heads to a file in the git directory. + + a list of object ids to write or null if the file should be + deleted. + + + System.IO.FileNotFoundException + + System.IO.IOException + + + listeners observing only events on this repository. + + + local metadata directory; null if repository isn't local. + + + the object database which stores this repository's data. + + + the reference database which stores the reference namespace. + + + the used file system abstraction + + + true if this is bare, which implies it has no working directory. + + + + the root directory of the working tree, where files are checked + out for viewing and editing. + + + if this is bare, which implies it has no working directory. + See + IsBare() + . + + + + + Receives + IndexChangedEvent + s. + + + + A listener can register for event delivery. + A listener can register for event delivery. + + + Invoked when any change is made to the index. + Invoked when any change is made to the index. + information about the changes. + + + + Base class to support constructing a + Repository + . +

+ Applications must set one of + BaseRepositoryBuilder<B, R>.SetGitDir(Sharpen.FilePath) + + or + BaseRepositoryBuilder<B, R>.SetWorkTree(Sharpen.FilePath) + + , or use + BaseRepositoryBuilder<B, R>.ReadEnvironment() + + or + BaseRepositoryBuilder<B, R>.FindGitDir() + + in order to configure the minimum property set + necessary to open a repository. +

+ Single repository applications trying to be compatible with other Git + implementations are encouraged to use a model such as: +

+            new RepositoryBuilder() //
+            .setGitDir(gitDirArgument) // --git-dir if supplied, no-op if null
+            .readEnviroment() // scan environment GIT_* variables
+            .findGitDir() // scan up the file system tree
+            .build()
+            
+
+ NGit.Storage.File.FileRepositoryBuilder + +
+ + + Cache of active + Repository + instances. + + + + Open an existing repository, reusing a cached instance if possible. + + Open an existing repository, reusing a cached instance if possible. +

+ When done with the repository, the caller must call + Repository.Close() + to decrement the repository's usage counter. + + + where the local repository is. Typically a + FileKey + . + + the repository instance requested; caller must close when done. + + the repository could not be read (likely its core.version + property is not supported). + + there is no repository at the given location. + + + +

Open a repository, reusing a cached instance if possible. + + Open a repository, reusing a cached instance if possible. +

+ When done with the repository, the caller must call + Repository.Close() + to decrement the repository's usage counter. + + + where the local repository is. Typically a + FileKey + . + + + If true, and the repository is not found, throws + RepositoryNotFoundException + . If false, a repository instance + is created and registered anyway. + + the repository instance requested; caller must close when done. + + the repository could not be read (likely its core.version + property is not supported). + + + There is no repository at the given location, only thrown if + mustExist + is true. + + + +

Register one repository into the cache. + + Register one repository into the cache. +

+ During registration the cache automatically increments the usage counter, + permitting it to retain the reference. A + FileKey + for the + repository's + Repository.Directory() + is used to index the + repository in the cache. +

+ If another repository already is registered in the cache at this + location, the other instance is closed. + + repository to register. + + +

Remove a repository from the cache. + + Remove a repository from the cache. +

+ Removes a repository from the cache, if it is still registered here, + permitting it to close. + + repository to unregister. + + +

Unregister all repositories from the cache. + Unregister all repositories from the cache. +
+ + + + + + Abstract hash key for + RepositoryCache + entries. +

+ A Key instance should be lightweight, and implement hashCode() and + equals() such that two Key instances are equal if they represent the same + Repository location. +

+
+ + + Called by + RepositoryCache.Open(Key) + if it doesn't exist yet. +

+ If a repository does not exist yet in the cache, the cache will call + this method to acquire a handle to it. +

+ + true if the repository must exist in order to be opened; + false if a new non-existent repository is permitted to be + created (the caller is responsible for calling create). + + the new repository instance. + + the repository could not be read (likely its core.version + property is not supported). + + + There is no repository at the given location, only thrown + if + mustExist + is true. + +
+ + Location of a Repository, using the standard java.io.File API. + Location of a Repository, using the standard java.io.File API. + + + Obtain a pointer to an exact location on disk. + + Obtain a pointer to an exact location on disk. +

+ No guessing is performed, the given location is exactly the GIT_DIR + directory of the repository. + + location where the repository database is. + + the file system abstraction which will be necessary to + perform certain file system operations. + + a key for the given directory. + Lenient(Sharpen.FilePath, NGit.Util.FS) + + + +

Obtain a pointer to a location on disk. + + Obtain a pointer to a location on disk. +

+ The method performs some basic guessing to locate the repository. + Searched paths are: +

    +
  1. + directory + // assume exact match
  2. +
  3. + directory + + "/.git" // assume working directory
  4. +
  5. + directory + + ".git" // assume bare
  6. +
+
+ location where the repository database might be. + + the file system abstraction which will be necessary to + perform certain file system operations. + + a key for the given directory. + Exact(Sharpen.FilePath, NGit.Util.FS) + +
+ + exact location of the repository. + + the file system abstraction which will be necessary to + perform certain file system operations. + + + + location supplied to the constructor. + + + + + + Guess if a directory contains a Git repository. + + Guess if a directory contains a Git repository. +

+ This method guesses by looking for the existence of some key files + and directories. + + the location of the directory to examine. + + the file system abstraction which will be necessary to + perform certain file system operations. + + + true if the directory "looks like" a Git repository; false if + it doesn't look enough like a Git directory to really be a + Git directory. + + + +

Guess the proper path for a Git repository. + + Guess the proper path for a Git repository. +

+ The method performs some basic guessing to locate the repository. + Searched paths are: +

    +
  1. + directory + // assume exact match
  2. +
  3. + directory + + "/.git" // assume working directory
  4. +
  5. + directory + + ".git" // assume bare
  6. +
+
+ location to guess from. Several permutations are tried. + + the file system abstraction which will be necessary to + perform certain file system operations. + + + the actual directory location if a better match is found; + null if there is no suitable match. + +
+ + + Important state of the repository that affects what can and cannot bed + done. + + + Important state of the repository that affects what can and cannot bed + done. This is things like unhandled conflicted merges and unfinished rebase. + The granularity and set of states are somewhat arbitrary. The methods + on the state are the only supported means of deciding what to do. + + + + Has no work tree and cannot be used for normal editing. + Has no work tree and cannot be used for normal editing. + + + A safe state for working normally + + + An unfinished merge. + An unfinished merge. Must resolve or reset before continuing normally + + + An merge where all conflicts have been resolved. + + An merge where all conflicts have been resolved. The index does not + contain any unmerged paths. + + + + An unfinished cherry-pick. + An unfinished cherry-pick. Must resolve or reset before continuing normally + + + + A cherry-pick where all conflicts have been resolved. + + A cherry-pick where all conflicts have been resolved. The index does not + contain any unmerged paths. + + + + An unfinished rebase or am. + An unfinished rebase or am. Must resolve, skip or abort before normal work can take place + + + + An unfinished rebase. + An unfinished rebase. Must resolve, skip or abort before normal work can take place + + + + An unfinished apply. + An unfinished apply. Must resolve, skip or abort before normal work can take place + + + + An unfinished rebase with merge. + An unfinished rebase with merge. Must resolve, skip or abort before normal work can take place + + + + An unfinished interactive rebase. + An unfinished interactive rebase. Must resolve, skip or abort before normal work can take place + + + + Bisecting being done. + Bisecting being done. Normal work may continue but is discouraged + + + true if changing HEAD is sane. + + + true if we can commit + + + true if reset to another HEAD is considered SAFE + + + true if amending is considered SAFE + + + a human readable description of the state. + + + Persistent configuration that can be stored and loaded from a location. + Persistent configuration that can be stored and loaded from a location. + + + Create a configuration with no default fallback. + Create a configuration with no default fallback. + + + Create an empty configuration with a fallback for missing keys. + Create an empty configuration with a fallback for missing keys. + + the base configuration to be consulted when a key is missing + from this configuration instance. + + + + Load the configuration from the persistent store. + + Load the configuration from the persistent store. +

+ If the configuration does not exist, this configuration is cleared, and + thus behaves the same as though the backing store exists, but is empty. + + the configuration could not be read (but does exist). + + the configuration is not properly formatted. + + + +

Save the configuration to the persistent store. + Save the configuration to the persistent store. + the configuration could not be written. +
+ + + A reference that indirectly points at another + Ref + . +

+ A symbolic reference always derives its current value from the target + reference. +

+
+ + Create a new ref pairing. + Create a new ref pairing. + name of this ref. + the ref we reference and derive our value from. + + + A tree entry representing a symbolic link. + + A tree entry representing a symbolic link. + Note. Java cannot really handle these as file system objects. + + + + + Construct a + SymlinkTreeEntry + with the specified name and SHA-1 in + the specified parent + + + + + + + Mutable builder to construct an annotated tag recording a project state. + + + Mutable builder to construct an annotated tag recording a project state. + Applications should use this object when they need to manually construct a + tag and want precise control over its fields. + To read a tag object, construct a + NGit.Revwalk.RevWalk + and obtain a + NGit.Revwalk.RevTag + instance by calling + NGit.Revwalk.RevWalk.ParseTag(AnyObjectId) + + . + + + + the type of object this tag refers to. + + + the object this tag refers to. + + + Set the object this tag refers to, and its type. + Set the object this tag refers to, and its type. + the object. + + the type of + obj + . Must be a valid type code. + + + + Set the object this tag refers to, and infer its type. + Set the object this tag refers to, and infer its type. + the object the tag will refer to. + + + + short name of the tag (no + refs/tags/ + prefix). + + + + Set the name of this tag. + Set the name of this tag. + + new short name of the tag. This short name should not start + with + refs/ + as typically a tag is stored under the + reference derived from + "refs/tags/" + getTag() + . + + + + creator of this tag. May be null. + + + Set the creator of this tag. + Set the creator of this tag. + the creator. May be null. + + + the complete commit message. + + + Set the tag's message. + Set the tag's message. + the tag's message. + + + Format this builder's state as an annotated tag object. + Format this builder's state as an annotated tag object. + + this object in the canonical annotated tag format, suitable for + storage in a repository. + + + + Format this builder's state as an annotated tag object. + Format this builder's state as an annotated tag object. + + this object in the canonical annotated tag format, suitable for + storage in a repository. + + + + A simple progress reporter printing on a stream. + A simple progress reporter printing on a stream. + + + ProgressMonitor that batches update events. + ProgressMonitor that batches update events. + + + Set an optional delay before the first output. + Set an optional delay before the first output. + + how long to wait before output. If 0 output begins on the + first + Update(int) + call. + + + time unit of + time + . + + + + Update the progress monitor if the total work isn't known, + name of the task. + number of units already completed. + + + Finish the progress monitor when the total wasn't known in advance. + Finish the progress monitor when the total wasn't known in advance. + name of the task. + total number of units processed. + + + Update the progress monitor when the total is known in advance. + Update the progress monitor when the total is known in advance. + name of the task. + number of units already completed. + estimated number of units to process. + + workCurr * 100 / workTotal + . + + + + Finish the progress monitor when the total is known in advance. + Finish the progress monitor when the total is known in advance. + name of the task. + total number of units processed. + estimated number of units to process. + + workCurr * 100 / workTotal + . + + + + Title of the current task. + Title of the current task. + + + + Number of work units, or + ProgressMonitor.UNKNOWN + . + + + + True when timer expires and output should occur on next update. + True when timer expires and output should occur on next update. + + + Scheduled timer, supporting cancellation if task ends early. + Scheduled timer, supporting cancellation if task ends early. + + + True if the task has displayed anything. + True if the task has displayed anything. + + + Number of work units already completed. + Number of work units already completed. + + + + Percentage of + totalWork + that is done. + + + + Initialize a new progress monitor. + Initialize a new progress monitor. + + + Initialize a new progress monitor. + Initialize a new progress monitor. + the stream to receive messages on. + + + + Wrapper around the general + ProgressMonitor + to make it thread safe. + Updates to the underlying ProgressMonitor are made only from the thread that + allocated this wrapper. Callers are responsible for ensuring the allocating + thread uses + PollForUpdates() + or + WaitForCompletion() + to + update the underlying ProgressMonitor. + Only + Update(int) + , + IsCancelled() + , and + EndWorker() + may be invoked from a worker thread. All other methods of the ProgressMonitor + interface can only be called from the thread that allocates this wrapper. + + + + Wrap a ProgressMonitor to be thread safe. + Wrap a ProgressMonitor to be thread safe. + the underlying monitor to receive events. + + + Notify the monitor a worker is starting. + Notify the monitor a worker is starting. + + + Notify the monitor of workers starting. + Notify the monitor of workers starting. + the number of worker threads that are starting. + + + Notify the monitor a worker is finished. + Notify the monitor a worker is finished. + + + Non-blocking poll for pending updates. + + Non-blocking poll for pending updates. + This method can only be invoked by the same thread that allocated this + ThreadSafeProgressMonior. + + + + Process pending updates and wait for workers to finish. + + Process pending updates and wait for workers to finish. + This method can only be invoked by the same thread that allocated this + ThreadSafeProgressMonior. + + + if the main thread is interrupted while waiting for + completion of workers. + + + + The standard "transfer", "fetch" and "receive" configuration parameters. + + The standard "transfer", "fetch" and "receive" configuration parameters. + + + + + Key for + Config.Get<T>(SectionParser<T>) + + . + + + + strictly verify received objects? + + + A representation of a Git tree entry. + A representation of a Git tree entry. A Tree is a directory in Git. + + + Compare two names represented as bytes. + + Compare two names represented as bytes. Since git treats names of trees and + blobs differently we have one parameter that represents a '/' for trees. For + other objects the value should be NUL. The names are compare by their positive + byte value (0..255). + A blob and a tree with the same name will not compare equal. + + name + name + '/' if a is a tree, else NUL + '/' if b is a tree, else NUL + < 0 if a is sorted before b, 0 if they are the same, else b + + + Constructor for a new Tree + The repository that owns the Tree. + + + Construct a Tree object with known content and hash value + + + + System.IO.IOException + + + Construct a new Tree under another Tree + + + + + Construct a Tree with a known SHA-1 under another tree. + + Construct a Tree with a known SHA-1 under another tree. Data is not yet + specified and will have to be loaded on demand. + + + + + + + true if this Tree is the top level Tree. + + + true of the data of this Tree is loaded + + + Forget the in-memory data for this tree. + Forget the in-memory data for this tree. + + + Adds a new or existing file with the specified name to this tree. + + Adds a new or existing file with the specified name to this tree. + Trees are added if necessary as the name may contain '/':s. + + Name + + a + FileTreeEntry + for the added file. + + System.IO.IOException + + + Adds a new or existing file with the specified name to this tree. + + Adds a new or existing file with the specified name to this tree. + Trees are added if necessary as the name may contain '/':s. + + an array containing the name + when the name starts in the tree. + + a + FileTreeEntry + for the added file. + + System.IO.IOException + + + Adds a new or existing Tree with the specified name to this tree. + + Adds a new or existing Tree with the specified name to this tree. + Trees are added if necessary as the name may contain '/':s. + + Name + + a + FileTreeEntry + for the added tree. + + System.IO.IOException + + + Adds a new or existing Tree with the specified name to this tree. + + Adds a new or existing Tree with the specified name to this tree. + Trees are added if necessary as the name may contain '/':s. + + an array containing the name + when the name starts in the tree. + + a + FileTreeEntry + for the added tree. + + System.IO.IOException + + + Add the specified tree entry to this tree. + Add the specified tree entry to this tree. + + System.IO.IOException + + + number of members in this tree + System.IO.IOException + + + Return all members of the tree sorted in Git order. + + Return all members of the tree sorted in Git order. + Entries are sorted by the numerical unsigned byte + values with (sub)trees having an implicit '/'. An + example of a tree with three entries. a:b is an + actual file name here. +

+ 100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 a.b + 040000 tree 4277b6e69d25e5efa77c455340557b384a4c018a a + 100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 a:b + + all entries in this Tree, sorted. + System.IO.IOException + + + + + + to the tree. + + true if a tree with the specified path can be found under this + tree. + + System.IO.IOException + + + of the non-tree entry. + + true if a blob, symlink, or gitlink with the specified name + can be found under this tree. + + System.IO.IOException + + + + + + + + + blob name + + a + TreeEntry + representing an object with the specified + relative path. + + System.IO.IOException + + + Tree Name + a Tree with the name s or null + System.IO.IOException + + + + + + + + + +

Format this Tree in canonical format. + Format this Tree in canonical format. + canonical encoding of the tree object. + the tree cannot be loaded, or its not in a writable state. + +
+ + The standard "user" configuration parameters. + The standard "user" configuration parameters. + + + + Key for + Config.Get<T>(SectionParser<T>) + + . + + + + + the author name as defined in the git variables and + configurations. If no name could be found, try to use the system + user name instead. + + + + + the committer name as defined in the git variables and + configurations. If no name could be found, try to use the system + user name instead. + + + + + the author email as defined in git variables and + configurations. If no email could be found, try to + propose one default with the user name and the + host name. + + + + + the committer email as defined in git variables and + configurations. If no email could be found, try to + propose one default with the user name and the + host name. + + + + + true if the author name was not explicitly configured but + constructed from information the system has about the logged on + user + + + + + true if the author email was not explicitly configured but + constructed from information the system has about the logged on + user + + + + + true if the committer name was not explicitly configured but + constructed from information the system has about the logged on + user + + + + + true if the author email was not explicitly configured but + constructed from information the system has about the logged on + user + + + + + try to get user name of the logged on user from the operating + system + + + + + try to construct email for logged on user using system + information + + + + + A class used to execute a + Add + command. It has setters for all + supported options and arguments of this command and a + Call() + method + to finally execute the command. Each instance of this class should only be + used for one invocation of the command (means: one call to + Call() + ) + +
Git documentation about Add + + + + Common superclass of all commands in the package + org.eclipse.jgit.api +

+ This class ensures that all commands fulfill the + Sharpen.Callable<V> + interface. + It also has a property + GitCommand<T>.repo + holding a reference to the git + NGit.Repository + this command should work with. +

+ Finally this class stores a state telling whether it is allowed to call + GitCommand<T>.Call() + on this instance. Instances of + GitCommand<T> + can only be + used for one single successful call to + GitCommand<T>.Call() + . Afterwards this + instance may not be used anymore to set/modify any properties or to call + GitCommand<T>.Call() + again. This is achieved by setting the + GitCommand<T>.callable + property to false after the successful execution of + GitCommand<T>.Call() + and to + check the state (by calling + GitCommand<T>.CheckCallable() + ) before setting of + properties and inside + GitCommand<T>.Call() + . +

+
+ + The repository this command is working with + + + + a state which tells whether it is allowed to call + GitCommand<T>.Call() + on this + instance. + + + + Creates a new command which interacts with a single repository + + the + NGit.Repository + this command should interact with + + + + + the + NGit.Repository + this command is interacting with + + + + + Set's the state which tells whether it is allowed to call + GitCommand<T>.Call() + on this instance. + GitCommand<T>.CheckCallable() + will throw an exception when + called and this property is set to + false + + + if true it is allowed to call + GitCommand<T>.Call() + on + this instance. + + + + + Checks that the property + GitCommand<T>.callable + is + true + . If not then + an + System.InvalidOperationException + is thrown + + + when this method is called and the property + GitCommand<T>.callable + is + false + + + + Executes the command + T a result. Each command has its own return type + or subclass thereof when an error occurs + + + + + + + + File to add content from. Also a leading directory name (e.g. + dir to add dir/file1 and dir/file2) can be given to add all + files in the directory, recursively. Fileglobs (e.g. *.c) are + not yet supported. + + + + this + + + + Allow clients to provide their own implementation of a FileTreeIterator + + + + this + + + + + Executes the + Add + command. Each instance of this class should only + be used for one invocation of the command. Don't call this method twice + on an instance. + + the DirCache after Add + + + + + + If set to true, the command only matches + filepattern + against already tracked files in the index rather than the + working tree. That means that it will never stage new files, + but that it will stage modified new contents of tracked files + and that it will remove files from the index if the + corresponding files in the working tree have been removed. + In contrast to the git command line a + filepattern + must + exist also if update is set to true as there is no + concept of a working directory here. + + + + this + + + + is the parameter update is set + + + + A class used to execute a + Commit + command. It has setters for all + supported options and arguments of this command and a + Call() + method + to finally execute the command. + + Git documentation about Commit + + + parents this commit should have. + + parents this commit should have. The current HEAD will be in this list + and also all commits mentioned in .git/MERGE_HEAD + + + + + + + + Executes the + commit + command with all the options and parameters + collected by the setter methods of this class. Each instance of this + class should only be used for one invocation of the command (means: one + call to + Call() + ) + + + a + NGit.Revwalk.RevCommit + object representing the successful commit. + + when called on a git repo without a HEAD reference + + when called without specifying a commit message + + when the current index contained unmerged paths (conflicts) + + + when HEAD or branch ref is updated concurrently by someone + else + + when repository is not in the right state for committing + + + + + + + + + + + + Look an entry's path up in the list of paths specified by the --only/ -o + option + In case the complete (file) path (e.g. + + + Look an entry's path up in the list of paths specified by the --only/ -o + option + In case the complete (file) path (e.g. "d1/d2/f1") cannot be found in + only, lookup is also tried with (parent) directory paths + (e.g. "d1/d2" and "d1"). + + entry's path + the item's index in only; -1 if no item matches + + + Sets default values for not explicitly specified options. + + Sets default values for not explicitly specified options. Then validates + that all required data has been provided. + + the state of the repository we are working on + if the commit message has not been specified + + + + + the commit message used for the + commit + + + + this + + + + the commit message used for the commit + + + + Sets the committer for this + commit + . If no committer is explicitly + specified because this method is never called or called with + null + value then the committer will be deduced from config info in repository, + with current time. + + + the committer used for the + commit + + + + this + + + + + Sets the committer for this + commit + . If no committer is explicitly + specified because this method is never called then the committer will be + deduced from config info in repository, with current time. + + + the name of the committer used for the + commit + + + the email of the committer used for the + commit + + + + this + + + + + the committer used for the + commit + . If no committer was + specified + null + is returned and the default + NGit.PersonIdent + of this repo is used during execution of the + command + + + + + Sets the author for this + commit + . If no author is explicitly + specified because this method is never called or called with + null + value then the author will be set to the committer or to the original + author when amending. + + + the author used for the + commit + + + + this + + + + + Sets the author for this + commit + . If no author is explicitly + specified because this method is never called then the author will be set + to the committer or to the original author when amending. + + + the name of the author used for the + commit + + + the email of the author used for the + commit + + + + this + + + + + the author used for the + commit + . If no author was + specified + null + is returned and the default + NGit.PersonIdent + of this repo is used during execution of the + command + + + + + If set to true the Commit command automatically stages files that have + been modified and deleted, but new files not known by the repository are + not affected. + + + If set to true the Commit command automatically stages files that have + been modified and deleted, but new files not known by the repository are + not affected. This corresponds to the parameter -a on the command line. + + + + + this + + in case of an illegal combination of arguments/ options + + + + Used to amend the tip of the current branch. + + Used to amend the tip of the current branch. If set to true, the previous + commit will be amended. This is equivalent to --amend on the command + line. + + + + + this + + + + + Commit dedicated path only + This method can be called several times to add multiple paths. + + + Commit dedicated path only + This method can be called several times to add multiple paths. Full file + paths are supported as well as directory paths; in the latter case this + commits all files/ directories below the specified path. + + path to commit + + + this + + + + + If set to true a change id will be inserted into the commit message + An existing change id is not replaced. + + + If set to true a change id will be inserted into the commit message + An existing change id is not replaced. An initial change id (I000...) + will be replaced by the change id. + + + + + this + + + + Override the message written to the reflog + + + + this + + + + Any index record update. + + Any index record update. +

+ Applications should subclass and provide their own implementation for the + Apply(DirCacheEntry) + method. The editor will invoke apply once + for each record in the index which matches the path name. If there are + multiple records (for example in stages 1, 2 and 3), the edit instance + will be called multiple times, once for each stage. + + + +

+ Updates a + DirCache + by supplying discrete edit commands. +

+ An editor updates a DirCache by taking a list of + PathEdit + commands + and executing them against the entries of the destination cache to produce a + new cache. This edit style allows applications to insert a few commands and + then have the editor compute the proper entry indexes necessary to perform an + efficient in-order update of the index records. This can be easier to use + than + DirCacheBuilder + . +

+

+ DirCacheBuilder +
+ + + Generic update/editing support for + DirCache + . +

+ The different update strategies extend this class to provide their own unique + services to applications. +

+
+ + + The cache instance this editor updates during + Finish() + . + + + + + Entry table this builder will eventually replace into + cache + . +

+ Use + FastAdd(DirCacheEntry) + or + FastKeep(int, int) + to + make additions to this table. The table is automatically expanded if it + is too small for a new addition. +

+ Typically the entries in here are sorted by their path names, just like + they are in the DirCache instance. +

+
+ + + Total number of valid entries in + entries + . + + + + Construct a new editor. + Construct a new editor. + the cache this editor will eventually update. + + estimated number of entries the editor will have upon + completion. This sizes the initial entry table. + + + + + the cache we will update on + Finish() + . + + + + Append one entry into the resulting entry list. + + Append one entry into the resulting entry list. +

+ The entry is placed at the end of the entry list. The caller is + responsible for making sure the final table is correctly sorted. +

+ The + entries + table is automatically expanded if there is + insufficient space for the new addition. + + the new entry to add. + + +

Add a range of existing entries from the destination cache. + + Add a range of existing entries from the destination cache. +

+ The entries are placed at the end of the entry list, preserving their + current order. The caller is responsible for making sure the final table + is correctly sorted. +

+ This method copies from the destination cache, which has not yet been + updated with this editor's new table. So all offsets into the destination + cache are not affected by any updates that may be currently taking place + in this editor. +

+ The + entries + table is automatically expanded if there is + insufficient space for the new additions. + + first entry to copy from the destination cache. + number of entries to copy. + + +

+ Finish this builder and update the destination + DirCache + . +

+ When this method completes this builder instance is no longer usable by + the calling application. A new builder must be created to make additional + changes to the index entries. +

+ After completion the DirCache returned by + GetDirCache() + will + contain all modifications. +

+ Note to implementors: Make sure + entries + is fully sorted + then invoke + Replace() + to update the DirCache with the new table. +

+
+ + + Update the DirCache with the contents of + entries + . +

+ This method should be invoked only during an implementation of + Finish() + , and only after + entries + is sorted. +

+
+ + Finish, write, commit this change, and release the index lock. + + Finish, write, commit this change, and release the index lock. +

+ If this method fails (returns false) the lock is still released. +

+ This is a utility method for applications as the finish-write-commit + pattern is very common after using a builder to update entries. + + + true if the commit was successful and the file contains the new + data; false if the commit failed and the file remains with the + old data. + + the lock is not held. + + the output file could not be created. The caller no longer + holds the lock. + + + +

Construct a new editor. + Construct a new editor. + the cache this editor will eventually update. + + estimated number of entries the editor will have upon + completion. This sizes the initial entry table. + +
+ + Append one edit command to the list of commands to be applied. + + Append one edit command to the list of commands to be applied. +

+ Edit commands may be added in any order chosen by the application. They + are automatically rearranged by the builder to provide the most efficient + update possible. + + another edit command. + + + + + +

Any index record update. + + Any index record update. +

+ Applications should subclass and provide their own implementation for the + Apply(DirCacheEntry) + method. The editor will invoke apply once + for each record in the index which matches the path name. If there are + multiple records (for example in stages 1, 2 and 3), the edit instance + will be called multiple times, once for each stage. + + + +

Create a new update command by path name. + Create a new update command by path name. + path of the file within the repository. +
+ + Create a new update command for an existing entry instance. + Create a new update command for an existing entry instance. + + entry instance to match path of. Only the path of this + entry is actually considered during command evaluation. + + + + Apply the update to a single cache entry matching the path. + + Apply the update to a single cache entry matching the path. +

+ After apply is invoked the entry is added to the output table, and + will be included in the new index. + + + the entry being processed. All fields are zeroed out if + the path is a new path in the index. + + + +

Deletes a single file entry from the index. + + Deletes a single file entry from the index. +

+ This deletion command removes only a single file at the given location, + but removes multiple stages (if present) for that path. To remove a + complete subtree use + DeleteTree + instead. + + DeleteTree + + +

Create a new deletion command by path name. + Create a new deletion command by path name. + path of the file within the repository. +
+ + Create a new deletion command for an existing entry instance. + Create a new deletion command for an existing entry instance. + + entry instance to remove. Only the path of this entry is + actually considered during command evaluation. + + + + Recursively deletes all paths under a subtree. + + Recursively deletes all paths under a subtree. +

+ This deletion command is more generic than + DeletePath + as it can + remove all records which appear recursively under the same subtree. + Multiple stages are removed (if present) for any deleted entry. +

+ This command will not remove a single file entry. To remove a single file + use + DeletePath + . + + DeletePath + + +

Create a new tree deletion command by path name. + Create a new tree deletion command by path name. + + path of the subtree within the repository. If the path + does not end with "/" a "/" is implicitly added to ensure + only the subtree's contents are matched by the command. + The special case "" (not "/"!) deletes all entries. + +
+ + Offers a "GitPorcelain"-like API to interact with a git repository. + + Offers a "GitPorcelain"-like API to interact with a git repository. +

+ The GitPorcelain commands are described in the <a href= + "http://www.kernel.org/pub/software/scm/git/docs/git.html#_high_level_commands_porcelain" + >Git Documentation</a>. +

+ This class only offers methods to construct so-called command classes. Each + GitPorcelain command is represented by one command class.
+ Example: this class offers a + commit() + method returning an instance of + the + CommitCommand + class. The + CommitCommand + class has setters + for all the arguments and options. The + CommitCommand + class also has a + call + method to actually execute the commit. The following code show's + how to do a simple commit: +

+            Git git = new Git(myRepo);
+            git.commit().setMessage("Fix393").setAuthor(developerIdent).call();
+            
+ All mandatory parameters for commands have to be specified in the methods of + this class, the optional parameters have to be specified by the + setter-methods of the Command class. +

+ This class is intended to be used internally (e.g. by JGit tests) or by + external components (EGit, third-party tools) when they need exactly the + functionality of a GitPorcelain command. There are use-cases where this class + is not optimal and where you should use the more low-level JGit classes. The + methods in this class may for example offer too much functionality or they + offer the functionality with the wrong arguments. + + + +

The git repository this class is interacting with +
+ + + the repository to open. May be either the GIT_DIR, or the + working tree directory that contains + .git + . + + + a + Git + object for the existing git repository + + System.IO.IOException + + + + the repository to open. May be either the GIT_DIR, or the + working tree directory that contains + .git + . + + filesystem abstraction to use when accessing the repository. + + a + Git + object for the existing git repository + + System.IO.IOException + + + + the git repository this class is interacting with. + null + is not allowed + + + a + Git + object for the existing git repository + + + + + Returns a command object to execute a + clone + command + + Git documentation about clone + + a + CloneCommand + used to collect all optional parameters + and to finally execute the + clone + command + + + + + Returns a command object to execute a + init + command + + Git documentation about init + + a + InitCommand + used to collect all optional parameters and + to finally execute the + init + command + + + + + Constructs a new + Git + object which can interact with the specified + git repository. All command classes returned by methods of this class + will always interact with this git repository. + + + the git repository this class is interacting with. + null + is not allowed + + + + + Returns a command object to execute a + Commit + command + + Git documentation about Commit + + a + CommitCommand + used to collect all optional parameters + and to finally execute the + Commit + command + + + + + Returns a command object to execute a + Log + command + + Git documentation about Log + + a + LogCommand + used to collect all optional parameters and + to finally execute the + Log + command + + + + + Returns a command object to execute a + Merge + command + + Git documentation about Merge + + a + MergeCommand + used to collect all optional parameters + and to finally execute the + Merge + command + + + + + Returns a command object to execute a + Pull + command + + + a + PullCommand + + + + Returns a command object used to create branches + + a + CreateBranchCommand + + + + Returns a command object used to delete branches + + a + DeleteBranchCommand + + + + Returns a command object used to list branches + + a + ListBranchCommand + + + + Returns a command object used to list tags + + a + ListTagCommand + + + + Returns a command object used to rename branches + + a + RenameBranchCommand + + + + + Returns a command object to execute a + Add + command + + Git documentation about Add + + a + AddCommand + used to collect all optional parameters and + to finally execute the + Add + command + + + + + Returns a command object to execute a + Tag + command + + Git documentation about Tag + + a + TagCommand + used to collect all optional parameters and + to finally execute the + Tag + command + + + + + Returns a command object to execute a + Fetch + command + + Git documentation about Fetch + + a + FetchCommand + used to collect all optional parameters + and to finally execute the + Fetch + command + + + + + Returns a command object to execute a + Push + command + + Git documentation about Push + + a + PushCommand + used to collect all optional parameters and + to finally execute the + Push + command + + + + + Returns a command object to execute a + cherry-pick + command + + Git documentation about cherry-pick + + a + CherryPickCommand + used to collect all optional + parameters and to finally execute the + cherry-pick + command + + + + + Returns a command object to execute a + revert + command + + Git documentation about reverting changes + + a + RevertCommand + used to collect all optional parameters + and to finally execute the + cherry-pick + command + + + + + Returns a command object to execute a + Rebase + command + + Git documentation about rebase + + a + RebaseCommand + used to collect all optional parameters + and to finally execute the + rebase + command + + + + + Returns a command object to execute a + rm + command + + Git documentation about rm + + a + RmCommand + used to collect all optional parameters and + to finally execute the + rm + command + + + + + Returns a command object to execute a + checkout + command + + Git documentation about checkout + + a + CheckoutCommand + used to collect all optional parameters + and to finally execute the + checkout + command + + + + + Returns a command object to execute a + reset + command + + Git documentation about reset + + a + ResetCommand + used to collect all optional parameters + and to finally execute the + reset + command + + + + + Returns a command object to execute a + status + command + + Git documentation about status + + a + StatusCommand + used to collect all optional parameters + and to finally execute the + status + command + + + + Returns a command to add notes to an object + + a + AddNoteCommand + + + + Returns a command to remove notes on an object + + a + RemoveNoteCommand + + + + Returns a command to list all notes + + a + ListNotesCommand + + + + Returns a command to show notes on an object + + a + ShowNoteCommand + + + + + Returns a command object to execute a + ls-remote + command + + Git documentation about ls-remote + + a + LsRemoteCommand + used to collect all optional parameters + and to finally execute the + status + command + + + + + Returns a command object to execute a + clean + command + + Git documentation about Clean + + a + CleanCommand + used to collect all optional parameters + and to finally execute the + clean + command + + + + + Returns a command object to execute a + blame + command + + Git documentation about Blame + + a + BlameCommand + used to collect all optional parameters + and to finally execute the + blame + command + + + + + Returns a command object to execute a + reflog + command + + Git documentation about reflog + + a + ReflogCommand + used to collect all optional parameters + and to finally execute the + reflog + command + + + + + Returns a command object to execute a + diff + command + + Git documentation about diff + + a + DiffCommand + used to collect all optional parameters and + to finally execute the + diff + command + + + + Returns a command object used to delete tags + + a + DeleteTagCommand + + + + + Returns a command object to execute a + submodule add + command + + + a + SubmoduleAddCommand + used to add a new submodule to a + parent repository + + + + + Returns a command object to execute a + submodule init + command + + + a + SubmoduleInitCommand + used to initialize the + repository's config with settings from the .gitmodules file in + the working tree + + + + + Returns a command object to execute a + submodule status + command + + + a + SubmoduleStatusCommand + used to report the status of a + repository's configured submodules + + + + + Returns a command object to execute a + submodule sync + command + + + a + SubmoduleSyncCommand + used to update the URL of a + submodule from the parent repository's .gitmodules file + + + + + Returns a command object to execute a + submodule update + command + + + a + SubmoduleUpdateCommand + used to update the submodules in + a repository to the configured revision + + + + Returns a command object used to list stashed commits + + a + StashListCommand + + + + Returns a command object used to create a stashed commit + + a + StashCreateCommand + + 2.0 + + + Returns a command object used to apply a stashed commit + + a + StashApplyCommand + + 2.0 + + + Returns a command object used to drop a stashed commit + + a + StashDropCommand + + 2.0 + + + + Returns a command object to execute a + apply + command + + Git documentation about apply + + a + ApplyCommand + used to collect all optional parameters + and to finally execute the + apply + command + + 2.0 + + + the git repository this class is interacting with + + + + A class used to execute a + Log + command. It has setters for all + supported options and arguments of this command and a + Call() + method + to finally execute the command. Each instance of this class should only be + used for one invocation of the command (means: one call to + Call() + ) +

+ This is currently a very basic implementation which takes only one starting + revision as option. + TODO: add more options (revision ranges, sorting, ...) +

+ Git documentation about Log +
+ + + + + + Executes the + Log + command with all the options and parameters + collected by the setter methods (e.g. + Add(NGit.AnyObjectId) + , + Not(NGit.AnyObjectId) + , ..) of this class. Each instance of this class + should only be used for one invocation of the command. Don't call this + method twice on an instance. + + an iteration over RevCommits + of the references ref cannot be resolved + + + + + Mark a commit to start graph traversal from. + Mark a commit to start graph traversal from. + NGit.Revwalk.RevWalk.MarkStart(NGit.Revwalk.RevCommit) + + + + + this + + + the commit supplied is not available from the object + database. This usually indicates the supplied commit is + invalid, but the reference was constructed during an earlier + invocation to + NGit.Revwalk.RevWalk.LookupCommit(NGit.AnyObjectId) + + . + + + the object was not parsed yet and it was discovered during + parsing that it is not actually a commit. This usually + indicates the caller supplied a non-commit SHA-1 to + NGit.Revwalk.RevWalk.LookupCommit(NGit.AnyObjectId) + + . + + + a low-level exception of JGit has occurred. The original + exception can be retrieved by calling + System.Exception.InnerException() + . Expect only + IOException's + to be wrapped. Subclasses of + System.IO.IOException + (e.g. + NGit.Errors.MissingObjectException + + ) are + typically not wrapped here but thrown as original exception + + + + + Same as + --not start + , or + ^start + + + + + this + + + the commit supplied is not available from the object + database. This usually indicates the supplied commit is + invalid, but the reference was constructed during an earlier + invocation to + NGit.Revwalk.RevWalk.LookupCommit(NGit.AnyObjectId) + + . + + + the object was not parsed yet and it was discovered during + parsing that it is not actually a commit. This usually + indicates the caller supplied a non-commit SHA-1 to + NGit.Revwalk.RevWalk.LookupCommit(NGit.AnyObjectId) + + . + + + a low-level exception of JGit has occurred. The original + exception can be retrieved by calling + System.Exception.InnerException() + . Expect only + IOException's + to be wrapped. Subclasses of + System.IO.IOException + (e.g. + NGit.Errors.MissingObjectException + + ) are + typically not wrapped here but thrown as original exception + + + + + Adds the range + since..until + + + + + + this + + + the commit supplied is not available from the object + database. This usually indicates the supplied commit is + invalid, but the reference was constructed during an earlier + invocation to + NGit.Revwalk.RevWalk.LookupCommit(NGit.AnyObjectId) + + . + + + the object was not parsed yet and it was discovered during + parsing that it is not actually a commit. This usually + indicates the caller supplied a non-commit SHA-1 to + NGit.Revwalk.RevWalk.LookupCommit(NGit.AnyObjectId) + + . + + + a low-level exception of JGit has occurred. The original + exception can be retrieved by calling + System.Exception.InnerException() + . Expect only + IOException's + to be wrapped. Subclasses of + System.IO.IOException + (e.g. + NGit.Errors.MissingObjectException + + ) are + typically not wrapped here but thrown as original exception + + + + Add all refs as commits to start the graph traversal from. + Add all refs as commits to start the graph traversal from. + Add(NGit.AnyObjectId) + + + this + + the references could not be accessed + + + Show only commits that affect any of the specified paths. + + Show only commits that affect any of the specified paths. The path must + either name a file or a directory exactly. Note that regex expressions or + wildcards are not supported. + + a path is relative to the top level of the repository + + + this + + + + Skip the number of commits before starting to show the commit output. + Skip the number of commits before starting to show the commit output. + the number of commits to skip + + + this + + + + Limit the number of commits to output. + Limit the number of commits to output. + the limit + + + this + + + + + + + + + + A class used to execute a + Merge + command. It has setters for all + supported options and arguments of this command and a + Call() + method + to finally execute the command. Each instance of this class should only be + used for one invocation of the command (means: one call to + Call() + ) + + Git documentation about Merge + + + + + + + Executes the + Merge + command with all the options and parameters + collected by the setter methods (e.g. + Include(NGit.Ref) + ) of this + class. Each instance of this class should only be used for one invocation + of the command. Don't call this method twice on an instance. + + the result of the merge + + + + + + + + + + + + + + + the + NGit.Merge.MergeStrategy + to be used + + + + this + + + + a reference to a commit which is merged with the current head + + + + this + + + + the Id of a commit which is merged with the current head + + + this + + + + a name given to the commit + the Id of a commit which is merged with the current head + + + this + + + + + If true, will prepare the next commit in working tree and + index as if a real merge happened, but do not make the commit or move the + HEAD. + + + If true, will prepare the next commit in working tree and + index as if a real merge happened, but do not make the commit or move the + HEAD. Otherwise, perform the merge and commit the result. +

+ In case the merge was successful but this flag was set to + true a + MergeCommandResult + with status + MergeStatus.MERGED_SQUASHED + or + MergeStatus.FAST_FORWARD_SQUASHED + is returned. + + whether to squash commits or not + + + this + + 2.0 + + +

+ A class used to execute a + Tag + command. It has setters for all + supported options and arguments of this command and a + Call() + method + to finally execute the command. + + Git documentation about Tag +
+ + + + + + Executes the + tag + command with all the options and parameters + collected by the setter methods of this class. Each instance of this + class should only be used for one invocation of the command (means: one + call to + Call() + ) + + + a + NGit.Ref + a ref pointing to a tag + + when called on a git repo without a HEAD reference + + 2.0 + + + + + + Sets default values for not explicitly specified options. + + Sets default values for not explicitly specified options. Then validates + that all required data has been provided. + + the state of the repository we are working on + if the tag name is null or invalid + + if the tag is signed (not supported yet) + + + + + the tag name used for the + tag + + + + this + + + + the tag name used for the tag + + + the tag message used for the tag + + + + the tag message used for the + tag + + + + this + + + + whether the tag is signed + + + If set to true the Tag command creates a signed tag object. + + If set to true the Tag command creates a signed tag object. This + corresponds to the parameter -s on the command line. + + + + + this + + + + Sets the tagger of the tag. + + Sets the tagger of the tag. If the tagger is null, a PersonIdent will be + created from the info in the repository. + + + + + this + + + + the tagger of the tag + + + the object id of the tag + + + Sets the object id of the tag. + + Sets the object id of the tag. If the object id is null, the commit + pointed to from HEAD will be used. + + + + + this + + + + is this a force update + + + If set to true the Tag command may replace an existing tag object. + + If set to true the Tag command may replace an existing tag object. This + corresponds to the parameter -f on the command line. + + + + + this + + + + + Exception thrown when a command can't succeed because of unresolved + conflicts. + + + Exception thrown when a command can't succeed because of unresolved + conflicts. + + + + + Superclass of all exceptions thrown by the API classes in + org.eclipse.jgit.api + + + + Translate internal exception to API exception + list of conflicting paths + + a + NGit.Errors.CheckoutConflictException + + exception + + + + all the paths where unresolved conflicts have been detected + + + Adds a new conflicting path + + + + this + + + + + Exception thrown when a command wants to update a ref but failed because + another process is accessing (or even also updating) the ref. + + + Exception thrown when a command wants to update a ref but failed because + another process is accessing (or even also updating) the ref. + + NGit.RefUpdate.Result.LOCK_FAILURE + + + + + + + + + + + + + + + + the + NGit.Ref + which was tried to by updated + + + + + the result which was returned by + NGit.RefUpdate.Update() + and + which caused this error + + + + + Exception thrown when a merge command was called without specifying the + proper amount/type of merge heads. + + + Exception thrown when a merge command was called without specifying the + proper amount/type of merge heads. E.g. a non-octopus merge strategy was + confronted with more than one head to be merged into HEAD. Another + case would be if a merge was called without including any head. + + + + + + + + Exception thrown when a tag command was called with an invalid tag name (or + null), such as bad~tag. + + + Exception thrown when a tag command was called with an invalid tag name (or + null), such as bad~tag. + + + + + + + + Exception thrown when during command execution a low-level exception from the + JGit library is thrown. + + + Exception thrown when during command execution a low-level exception from the + JGit library is thrown. Also when certain low-level error situations are + reported by JGit through return codes this Exception will be thrown. +

+ During command execution a lot of exceptions may be thrown. Some of them + represent error situations which can be handled specifically by the caller of + the command. But a lot of exceptions are so low-level that is is unlikely + that the caller of the command can handle them effectively. The huge number + of these low-level exceptions which are thrown by the commands lead to a + complicated and wide interface of the commands. Callers of the API have to + deal with a lot of exceptions they don't understand. +

+ To overcome this situation this class was introduced. Commands will wrap all + exceptions they declare as low-level in their context into an instance of + this class. Callers of the commands have to deal with one type of low-level + exceptions. Callers will always get access to the original exception (if + available) by calling + #getCause() + . + + + +

Construct an exception for low-level internal exceptions + + +
+ + Construct an exception for low-level internal exceptions + + + + + Exception thrown when the options given to a command don't include a + file pattern which is mandatory for processing. + + + Exception thrown when the options given to a command don't include a + file pattern which is mandatory for processing. + + + + + + + + + + + + Exception thrown when a command expected the + HEAD + reference to exist + but couldn't find such a reference + + + + + + + + + + + + Exception thrown when the options given to a command don't include a + specification of a message text (e.g. + + + Exception thrown when the options given to a command don't include a + specification of a message text (e.g. a commit was called without explicitly + specifying a commit message (or other options telling where to take the + message from. + + + + + + + + + + + + Exception thrown when the state of the repository doesn't allow the execution + of a certain command. + + + Exception thrown when the state of the repository doesn't allow the execution + of a certain command. E.g. when a CommitCommand should be executed on a + repository with unresolved conflicts this exception will be thrown. + + + + + + + + + + + Keeps track of diff related configuration options. + Keeps track of diff related configuration options. + + + + Key for + NGit.Config.Get<T>(NGit.Config.SectionParser<T>) + + . + + + + true if the prefix "a/" and "b/" should be suppressed. + + + true if rename detection is enabled by default. + + + type of rename detection to perform. + + + limit on number of paths to perform inexact rename detection. + + + + Permissible values for + diff.renames + . + + + + A value class representing a change to a file + + + Magical SHA1 used for file adds or deletes + + + Magical file name used for file adds or deletes. + Magical file name used for file adds or deletes. + + + Create an empty DiffEntry + + + Convert the TreeWalk into DiffEntry headers. + Convert the TreeWalk into DiffEntry headers. + the TreeWalk to walk through. Must have exactly two trees. + headers describing the changed files. + the repository cannot be accessed. + When given TreeWalk doesn't have exactly two trees. + + + + + Convert the TreeWalk into DiffEntry headers, depending on + includeTrees + it will add tree objects into result or not. + + + the TreeWalk to walk through. Must have exactly two trees and + when + includeTrees + parameter is + true + it can't + be recursive. + + include tree object's. + headers describing the changed files. + the repository cannot be accessed. + + when + includeTrees + is true and given TreeWalk is + recursive. Or when given TreeWalk doesn't have exactly two + trees + + + + Breaks apart a DiffEntry into two entries, one DELETE and one ADD. + Breaks apart a DiffEntry into two entries, one DELETE and one ADD. + the DiffEntry to break apart. + + a list containing two entries. Calling + GetChangeType() + on the first entry will return ChangeType.DELETE. Calling it on + the second entry will return ChangeType.ADD. + + + + File name of the old (pre-image). + File name of the old (pre-image). + + + File name of the new (post-image). + File name of the new (post-image). + + + Old mode of the file, if described by the patch, else null. + Old mode of the file, if described by the patch, else null. + + + New mode of the file, if described by the patch, else null. + New mode of the file, if described by the patch, else null. + + + General type of change indicated by the patch. + General type of change indicated by the patch. + + + + Similarity score if + changeType + is a copy or rename. + + + + ObjectId listed on the index line for the old (pre-image) + + + ObjectId listed on the index line for the new (post-image) + + + Get the old name associated with this file. + + Get the old name associated with this file. +

+ The meaning of the old name can differ depending on the semantic meaning + of this patch: +

    +
  • file add: always /dev/null
  • +
  • file modify: always + GetNewPath() +
  • +
  • file delete: always the file being deleted
  • +
  • file copy: source file the copy originates from
  • +
  • file rename: source file the rename originates from
  • +
+
+ old name for this file. +
+ + Get the new name associated with this file. + + Get the new name associated with this file. +

+ The meaning of the new name can differ depending on the semantic meaning + of this patch: +

    +
  • file add: always the file being created
  • +
  • file modify: always + GetOldPath() +
  • +
  • file delete: always /dev/null
  • +
  • file copy: destination file the copy ends up at
  • +
  • file rename: destination file the rename ends up at
  • +
+
+ new name for this file. +
+ + Get the path associated with this file. + Get the path associated with this file. + which path to obtain. + name for this file. + + + the old file mode, if described in the patch + + + the new file mode, if described in the patch + + + Get the mode associated with this file. + Get the mode associated with this file. + which mode to obtain. + the mode. + + + + the type of change this patch makes on + GetNewPath() + + + + + + similarity score between + GetOldPath() + and + GetNewPath() + if + GetChangeType() + is + ChangeType.COPY + or + ChangeType.RENAME + . + + + + Get the old object id from the index. + Get the old object id from the index. + the object id; null if there is no index line + + + Get the new object id from the index. + Get the new object id from the index. + the object id; null if there is no index line + + + Get the object id. + Get the object id. + the side of the id to get. + the object id; null if there is no index line + + + General type of change a single file-level patch describes. + General type of change a single file-level patch describes. + + + Specify the old or new side for more generalized access. + Specify the old or new side for more generalized access. + + + Format a Git style patch script. + Format a Git style patch script. + + + Magic return content indicating it is empty or no content present. + Magic return content indicating it is empty or no content present. + + + Magic return indicating the content is binary. + Magic return indicating the content is binary. + + + Create a new formatter with a default level of context. + Create a new formatter with a default level of context. + + the stream the formatter will write line data to. This stream + should have buffering arranged by the caller, as many small + writes are performed to it. + + + + the stream we are outputting data to. + + + Set the repository the formatter can load object contents from. + + Set the repository the formatter can load object contents from. + Once a repository has been set, the formatter must be released to ensure + the internal ObjectReader is able to release its resources. + + source repository holding referenced objects. + + + Change the number of lines of context to display. + Change the number of lines of context to display. + + number of lines of context to see before the first + modification and after the last modification within a hunk of + the modified file. + + + + Change the number of digits to show in an ObjectId. + Change the number of digits to show in an ObjectId. + number of digits to show in an ObjectId. + + + Set the algorithm that constructs difference output. + Set the algorithm that constructs difference output. + the algorithm to produce text file differences. + HistogramDiff + + + Set the line equivalence function for text file differences. + Set the line equivalence function for text file differences. + + The equivalence function used to determine if two lines of + text are identical. The function can be changed to ignore + various types of whitespace. + + RawTextComparator.DEFAULT + RawTextComparator.WS_IGNORE_ALL + RawTextComparator.WS_IGNORE_CHANGE + + RawTextComparator.WS_IGNORE_LEADING + + RawTextComparator.WS_IGNORE_TRAILING + + + + Set maximum file size for text files. + + Set maximum file size for text files. + Files larger than this size will be treated as though they are binary and + not text. Default is + #DEFAULT_BINARY_FILE_THRESHOLD + . + + + the limit, in bytes. Files larger than this size will be + assumed to be binary, even if they aren't. + + + + Set the prefix applied in front of old file paths. + Set the prefix applied in front of old file paths. + + the prefix in front of old paths. Typically this is the + standard string + "a/" + , but may be any prefix desired by + the caller. Must not be null. Use the empty string to have no + prefix at all. + + + + Get the prefix applied in front of old file paths. + Get the prefix applied in front of old file paths. + the prefix + 2.0 + + + Set the prefix applied in front of new file paths. + Set the prefix applied in front of new file paths. + + the prefix in front of new paths. Typically this is the + standard string + "b/" + , but may be any prefix desired by + the caller. Must not be null. Use the empty string to have no + prefix at all. + + + + Get the prefix applied in front of new file paths. + Get the prefix applied in front of new file paths. + the prefix + 2.0 + + + true if rename detection is enabled. + + + Enable or disable rename detection. + + Enable or disable rename detection. + Before enabling rename detection the repository must be set with + SetRepository(NGit.Repository) + . Once enabled the detector can be + configured away from its defaults by obtaining the instance directly from + GetRenameDetector() + and invoking configuration. + + if rename detection should be enabled. + + + the rename detector if rename detection is enabled. + + + Set the progress monitor for long running rename detection. + Set the progress monitor for long running rename detection. + progress monitor to receive rename detection status through. + + + Set the filter to produce only specific paths. + + Set the filter to produce only specific paths. + If the filter is an instance of + NGit.Revwalk.FollowFilter + , the filter path + will be updated during successive scan or format invocations. The updated + path can be obtained from + GetPathFilter() + . + + the tree filter to apply. + + + the current path filter. + + + Flush the underlying output stream of this formatter. + Flush the underlying output stream of this formatter. + the stream's own flush method threw an exception. + + + + Release the internal ObjectReader state. + Release the internal ObjectReader state. + + + Determine the differences between two trees. + + Determine the differences between two trees. + No output is created, instead only the file paths that are different are + returned. Callers may choose to format these paths themselves, or convert + them into + NGit.Patch.FileHeader + instances with a complete edit list by + calling + ToFileHeader(DiffEntry) + . + + the old (or previous) side. + the new (or updated) side. + the paths that are different. + trees cannot be read or file contents cannot be read. + + + + Determine the differences between two trees. + + Determine the differences between two trees. + No output is created, instead only the file paths that are different are + returned. Callers may choose to format these paths themselves, or convert + them into + NGit.Patch.FileHeader + instances with a complete edit list by + calling + ToFileHeader(DiffEntry) + . + + the old (or previous) side. + the new (or updated) side. + the paths that are different. + trees cannot be read or file contents cannot be read. + + + + Determine the differences between two trees. + + Determine the differences between two trees. + No output is created, instead only the file paths that are different are + returned. Callers may choose to format these paths themselves, or convert + them into + NGit.Patch.FileHeader + instances with a complete edit list by + calling + ToFileHeader(DiffEntry) + . + + the old (or previous) side. + the new (or updated) side. + the paths that are different. + trees cannot be read or file contents cannot be read. + + + + + + + Format the differences between two trees. + + Format the differences between two trees. + The patch is expressed as instructions to modify + a + to make it + b + . + + the old (or previous) side. + the new (or updated) side. + + trees cannot be read, file contents cannot be read, or the + patch cannot be output. + + + + Format the differences between two trees. + + Format the differences between two trees. + The patch is expressed as instructions to modify + a + to make it + b + . + + the old (or previous) side. + the new (or updated) side. + + trees cannot be read, file contents cannot be read, or the + patch cannot be output. + + + + Format the differences between two trees. + + Format the differences between two trees. + The patch is expressed as instructions to modify + a + to make it + b + . + + the old (or previous) side. + the new (or updated) side. + + trees cannot be read, file contents cannot be read, or the + patch cannot be output. + + + + Format a patch script from a list of difference entries. + + Format a patch script from a list of difference entries. Requires + Scan(NGit.Treewalk.AbstractTreeIterator, NGit.Treewalk.AbstractTreeIterator) + to have been + called first. + + entries describing the affected files. + + a file's content cannot be read, or the output stream cannot + be written to. + + + + Format a patch script for one file entry. + Format a patch script for one file entry. + the entry to be formatted. + + a file's content cannot be read, or the output stream cannot + be written to. + + + + + + + Format a patch script, reusing a previously parsed FileHeader. + + Format a patch script, reusing a previously parsed FileHeader. +

+ This formatter is primarily useful for editing an existing patch script + to increase or reduce the number of lines of context within the script. + All header lines are reused as-is from the supplied FileHeader. + + existing file header containing the header lines to copy. + + text source for the pre-image version of the content. This + must match the content of + DiffEntry.GetOldId() + . + + + text source for the post-image version of the content. This + must match the content of + DiffEntry.GetNewId() + . + + writing to the supplied stream failed. + + +

Formats a list of edits in unified diff format + some differences which have been calculated between A and B + the text A which was compared + the text B which was compared + System.IO.IOException +
+ + Output a line of context (unmodified line). + Output a line of context (unmodified line). + RawText for accessing raw data + the line number within text + System.IO.IOException + + + Output an added line. + Output an added line. + RawText for accessing raw data + the line number within text + System.IO.IOException + + + Output a removed line + RawText for accessing raw data + the line number within text + System.IO.IOException + + + Output a hunk header + within first source + within first source + within second source + within second source + System.IO.IOException + + + + + + Write a standard patch script line. + Write a standard patch script line. + prefix before the line, typically '-', '+', ' '. + the text object to obtain the line from. + line number to output. + the stream threw an exception while writing to it. + + + + + Creates a + NGit.Patch.FileHeader + representing the given + DiffEntry +

+ This method does not use the OutputStream associated with this + DiffFormatter instance. It is therefore safe to instantiate this + DiffFormatter instance with a + NGit.Util.IO.DisabledOutputStream + if this method + is the only one that will be used. +

+ the DiffEntry to create the FileHeader for + + a FileHeader representing the DiffEntry. The FileHeader's buffer + will contain only the header of the diff output. It will also + contain one + NGit.Patch.HunkHeader + . + + + the stream threw an exception while writing to it, or one of + the blobs referenced by the DiffEntry could not be read. + + one of the blobs referenced by the DiffEntry is corrupt. + + one of the blobs referenced by the DiffEntry is missing. + +
+ + + + + + + + + + + + + the stream the formatter will write line data to + the DiffEntry to create the FileHeader for + writing to the supplied stream failed. + + + + + + A modified region detected between two versions of roughly the same content. + + + A modified region detected between two versions of roughly the same content. +

+ An edit covers the modified region only. It does not cover a common region. +

+ Regions should be specified using 0 based notation, so add 1 to the start and + end marks for line numbers in a file. +

+ An edit where beginA == endA && beginB < endB is an insert edit, + that is sequence B inserted the elements in region + [beginB, endB) at beginA. +

+ An edit where beginA < endA && beginB == endB is a delete edit, + that is sequence B has removed the elements between + [beginA, endA). +

+ An edit where beginA < endA && beginB < endB is a replace edit, + that is sequence B has replaced the range of elements between + [beginA, endA) with those found in [beginB, endB). + + + +

Create a new empty edit. + Create a new empty edit. + beginA: start and end of region in sequence A; 0 based. + beginB: start and end of region in sequence B; 0 based. +
+ + Create a new edit. + Create a new edit. + beginA: start of region in sequence A; 0 based. + endA: end of region in sequence A; must be >= as. + beginB: start of region in sequence B; 0 based. + endB: end of region in sequence B; must be >= bs. + + + the type of this region + + + true if the edit is empty (lengths of both a and b is zero). + + + start point in sequence A. + + + end point in sequence A. + + + start point in sequence B. + + + end point in sequence B. + + + length of the region in A. + + + length of the region in B. + + + Construct a new edit representing the region before cut. + Construct a new edit representing the region before cut. + + the cut point. The beginning A and B points are used as the + end points of the returned edit. + + + an edit representing the slice of + this + edit that occurs + before + cut + starts. + + + + Construct a new edit representing the region after cut. + Construct a new edit representing the region after cut. + + the cut point. The ending A and B points are used as the + starting points of the returned edit. + + + an edit representing the slice of + this + edit that occurs + after + cut + ends. + + + + + Increase + GetEndA() + by 1. + + + + + Increase + GetEndB() + by 1. + + + + Swap A and B, so the edit goes the other direction. + Swap A and B, so the edit goes the other direction. + + + Type of edit + + + + Specialized list of + Edit + s in a document. + + + + Construct an edit list containing a single edit. + Construct an edit list containing a single edit. + the edit to return in the list. + + list containing only + edit + . + + + + Create a new, empty edit list. + Create a new, empty edit list. + + + Create an empty edit list with the specified capacity. + Create an empty edit list with the specified capacity. + + the initial capacity of the edit list. If additional edits are + added to the list, it will be grown to support them. + + + + + Diff algorithm, based on "An O(ND) Difference Algorithm and its Variations", + by Eugene Myers. + + + Diff algorithm, based on "An O(ND) Difference Algorithm and its Variations", + by Eugene Myers. +

+ The basic idea is to put the line numbers of text A as columns ("x") and the + lines of text B as rows ("y"). Now you try to find the shortest "edit path" + from the upper left corner to the lower right corner, where you can always go + horizontally or vertically, but diagonally from (x,y) to (x+1,y+1) only if + line x in text A is identical to line y in text B. +

+ Myers' fundamental concept is the "furthest reaching D-path on diagonal k": a + D-path is an edit path starting at the upper left corner and containing + exactly D non-diagonal elements ("differences"). The furthest reaching D-path + on diagonal k is the one that contains the most (diagonal) elements which + ends on diagonal k (where k = y - x). +

+ Example: +

+            H E L L O   W O R L D
+            ____
+            L     \___
+            O         \___
+            W             \________
+            
+

+ Since every D-path has exactly D horizontal or vertical elements, it can only + end on the diagonals -D, -D+2, ..., D-2, D. +

+ Since every furthest reaching D-path contains at least one furthest reaching + (D-1)-path (except for D=0), we can construct them recursively. +

+ Since we are really interested in the shortest edit path, we can start + looking for a 0-path, then a 1-path, and so on, until we find a path that + ends in the lower right corner. +

+ To save space, we do not need to store all paths (which has quadratic space + requirements), but generate the D-paths simultaneously from both sides. When + the ends meet, we will have found "the middle" of the path. From the end + points of that diagonal part, we can generate the rest recursively. +

+ This only requires linear space. +

+ The overall (runtime) complexity is: +

+            O(N * D^2 + 2 * N/2 * (D/2)^2 + 4 * N/4 * (D/4)^2 + ...)
+            = O(N * D^2 * 5 / 4) = O(N * D^2),
+            
+

+ (With each step, we have to find the middle parts of twice as many regions as + before, but the regions (as well as the D) are halved.) +

+ So the overall runtime complexity stays the same with linear space, albeit + with a larger constant factor. + + + +

Singleton instance of MyersDiff. + Singleton instance of MyersDiff. +
+ + + The list of edits found during the last call to + MyersDiff<S>.CalculateEdits(Edit) + + + + + Comparison function for sequences. + Comparison function for sequences. + + + The first text to be compared. + The first text to be compared. Referred to as "Text A" in the comments + + + The second text to be compared. + The second text to be compared. Referred to as "Text B" in the comments + + + Entrypoint into the algorithm this class is all about. + + Entrypoint into the algorithm this class is all about. This method triggers that the + differences between A and B are calculated in form of a list of edits. + + portion of the sequences to examine. + + + Calculates the differences between a given part of A against another given part of B + + start of the part of A which should be compared (0<=beginA<sizeof(A)) + + end of the part of A which should be compared (beginA<=endA<sizeof(A)) + + start of the part of B which should be compared (0<=beginB<sizeof(B)) + + end of the part of B which should be compared (beginB<=endB<sizeof(B)) + + + + two filenames specifying the contents to be diffed + + + Compares two sequences primarily based upon hash codes. + Compares two sequences primarily based upon hash codes. + + + + Compares two + Sequence + s to create an + EditList + of changes. +

+ An algorithm's + diff + method must be callable from concurrent threads + without data collisions. This permits some algorithms to use a singleton + pattern, with concurrent invocations using the same singleton. Other + algorithms may support parameterization, in which case the caller can create + a unique instance per thread. +

+
+ + + the diff algorithm for which an implementation should be + returned + + an implementation of the specified diff algorithm + + + Compare two sequences and identify a list of edits between them. + Compare two sequences and identify a list of edits between them. + the comparator supplying the element equivalence function. + + the first (also known as old or pre-image) sequence. Edits + returned by this algorithm will reference indexes using the + 'A' side: + Edit.GetBeginA() + , + Edit.GetEndA() + . + + + the second (also known as new or post-image) sequence. Edits + returned by this algorithm will reference indexes using the + 'B' side: + Edit.GetBeginB() + , + Edit.GetEndB() + . + + + a modifiable edit list comparing the two sequences. If empty, the + sequences are identical according to + cmp + 's rules. The + result list is never null. + + + + Compare two sequences and identify a list of edits between them. + + Compare two sequences and identify a list of edits between them. + This method should be invoked only after the two sequences have been + proven to have no common starting or ending elements. The expected + elimination of common starting and ending elements is automatically + performed by the + Diff<S>(SequenceComparator<S>, Sequence, Sequence) + + method, which invokes this method using + Subsequence<S> + s. + + the comparator supplying the element equivalence function. + + the first (also known as old or pre-image) sequence. Edits + returned by this algorithm will reference indexes using the + 'A' side: + Edit.GetBeginA() + , + Edit.GetEndA() + . + + + the second (also known as new or post-image) sequence. Edits + returned by this algorithm will reference indexes using the + 'B' side: + Edit.GetBeginB() + , + Edit.GetEndB() + . + + a modifiable edit list comparing the two sequences. + + + Supported diff algorithm + + + Compare two sequences and identify a list of edits between them. + + Compare two sequences and identify a list of edits between them. + This method should be invoked only after the two sequences have been + proven to have no common starting or ending elements. The expected + elimination of common starting and ending elements is automatically + performed by the + DiffAlgorithm.Diff<S>(SequenceComparator<S>, Sequence, Sequence) + + method, which invokes this method using + Subsequence<S> + s. + + result list to append the region's edits onto. + the comparator supplying the element equivalence function. + + the first (also known as old or pre-image) sequence. Edits + returned by this algorithm will reference indexes using the + 'A' side: + Edit.GetBeginA() + , + Edit.GetEndA() + . + + + the second (also known as new or post-image) sequence. Edits + returned by this algorithm will reference indexes using the + 'B' side: + Edit.GetBeginB() + , + Edit.GetEndB() + . + + the region being compared within the two sequences. + + + + A class to help bisecting the sequences a and b to find minimal + edit paths. + + + A class to help bisecting the sequences a and b to find minimal + edit paths. + As the arrays are reused for space efficiency, you will need one + instance per thread. + The entry function is the calculate() method. + + + + A Sequence supporting UNIX formatted text in byte[] format. + + A Sequence supporting UNIX formatted text in byte[] format. +

+ Elements of the sequence are the lines of the file, as delimited by the UNIX + newline character ('\n'). The file content is treated as 8 bit binary text, + with no assumptions or requirements on character encoding. +

+ Note that the first line of the file is element 0, as defined by the Sequence + interface API. Traditionally in a text editor a patch file the first line is + line number 1. Callers may need to subtract 1 prior to invoking methods if + they are converting from "line number" to "element index". + + + +

Arbitrary sequence of elements. + + Arbitrary sequence of elements. +

+ A sequence of elements is defined to contain elements in the index range + [0, + Size() + ), like a standard Java List implementation. + Unlike a List, the members of the sequence are not directly obtainable. +

+ Implementations of Sequence are primarily intended for use in content + difference detection algorithms, to produce an + EditList + of + Edit + instances describing how two Sequence instances differ. +

+ To be compared against another Sequence of the same type, a supporting + SequenceComparator<S> + must also be supplied. + + + + total number of items in the sequence. + + +

+ Number of bytes to check for heuristics in + IsBinary(byte[]) + + +
+ + A Rawtext of length 0 + + + The file content for this sequence. + The file content for this sequence. + + + + Map of line number to starting position within + content + . + + + + Create a new sequence from an existing content byte array. + + Create a new sequence from an existing content byte array. +

+ The entire array (indexes 0 through length-1) is used as the content. + + + the content array. The array is never modified, so passing + through cached arrays is safe. + + + +

Create a new sequence from a file. + + Create a new sequence from a file. +

+ The entire file contents are used. + + the text file. + if Exceptions occur while reading the file + + + + total number of items in the sequence. + + +

Write a specific line to the output stream, without its trailing LF. + + Write a specific line to the output stream, without its trailing LF. +

+ The specified line is copied as-is, with no character encoding + translation performed. +

+ If the specified line ends with an LF ('\n'), the LF is not + copied. It is up to the caller to write the LF, if desired, between + output lines. + + stream to copy the line data onto. + + index of the line to extract. Note this is 0-based, so line + number 1 is actually index 0. + + the stream write operation failed. + + +

Determine if the file ends with a LF ('\n'). + Determine if the file ends with a LF ('\n'). + true if the last line has an LF; false otherwise. +
+ + Get the text for a single line. + Get the text for a single line. + + index of the line to extract. Note this is 0-based, so line + number 1 is actually index 0. + + the text for the line, without a trailing LF. + + + Get the text for a region of lines. + Get the text for a region of lines. + + index of the first line to extract. Note this is 0-based, so + line number 1 is actually index 0. + + index of one past the last line to extract. + + if true the trailing LF ('\n') of the last returned line is + dropped, if present. + + + the text for lines + [begin, end) + . + + + + Decode a region of the text into a String. + + Decode a region of the text into a String. + The default implementation of this method tries to guess the character + set by considering UTF-8, the platform default, and falling back on + ISO-8859-1 if neither of those can correctly decode the region given. + + first byte of the content to decode. + one past the last byte of the content to decode. + + the region + [start, end) + decoded as a String. + + + + + Determine heuristically whether a byte array represents binary (as + opposed to text) content. + + + Determine heuristically whether a byte array represents binary (as + opposed to text) content. + + the raw file content. + true if raw is likely to be a binary file, false otherwise + + + + Determine heuristically whether the bytes contained in a stream + represents binary (as opposed to text) content. + + + Determine heuristically whether the bytes contained in a stream + represents binary (as opposed to text) content. + Note: Do not further use this stream after having called this method! The + stream may not be fully read and will be left at an unknown position + after consuming an unknown number of bytes. The caller is responsible for + closing the stream. + + input stream containing the raw file content. + true if raw is likely to be a binary file, false otherwise + if input stream could not be read + + + + Determine heuristically whether a byte array represents binary (as + opposed to text) content. + + + Determine heuristically whether a byte array represents binary (as + opposed to text) content. + + the raw file content. + + number of bytes in + raw + to evaluate. This should be + raw.length + unless + raw + was over-allocated by + the caller. + + true if raw is likely to be a binary file, false otherwise + + + Get the line delimiter for the first line. + Get the line delimiter for the first line. + 2.0 + the line delimiter or null + + + Detect and resolve object renames. + Detect and resolve object renames. + + + Similarity score required to pair an add/delete as a rename. + Similarity score required to pair an add/delete as a rename. + + + Similarity score required to keep modified file pairs together. + + Similarity score required to keep modified file pairs together. Any + modified file pairs with a similarity score below this will be broken + apart. + + + + Limit in the number of files to consider for renames. + Limit in the number of files to consider for renames. + + + Set if the number of adds or deletes was over the limit. + Set if the number of adds or deletes was over the limit. + + + Create a new rename detector for the given repository + the repository to use for rename detection + + + + minimum score required to pair an add/delete as a rename. The + score ranges are within the bounds of (0, 100). + + + + Set the minimum score required to pair an add/delete as a rename. + + Set the minimum score required to pair an add/delete as a rename. +

+ When comparing two files together their score must be greater than or + equal to the rename score for them to be considered a rename match. The + score is computed based on content similarity, so a score of 60 implies + that approximately 60% of the bytes in the files are identical. + + new rename score, must be within [0, 100]. + the score was not within [0, 100]. + + + + the similarity score required to keep modified file pairs + together. Any modify pairs that score below this will be broken + apart into separate add/deletes. Values less than or equal to + zero indicate that no modifies will be broken apart. Values over + 100 cause all modify pairs to be broken. + + + + + the similarity score required to keep modified file pairs + together. Any modify pairs that score below this will be + broken apart into separate add/deletes. Values less than or + equal to zero indicate that no modifies will be broken apart. + Values over 100 cause all modify pairs to be broken. + + + + limit on number of paths to perform inexact rename detection. + + +

Set the limit on the number of files to perform inexact rename detection. + + + Set the limit on the number of files to perform inexact rename detection. +

+ The rename detector has to build a square matrix of the rename limit on + each side, then perform that many file compares to determine similarity. + If 1000 files are added, and 1000 files are deleted, a 1000*1000 matrix + must be allocated, and 1,000,000 file compares may need to be performed. + + new file limit. + + +

Check if the detector is over the rename limit. + + Check if the detector is over the rename limit. +

+ This method can be invoked either before or after + getEntries + has + been used to perform rename detection. + + + true if the detector has more file additions or removals than the + rename limit is currently set to. In such configurations the + detector will skip expensive computation. + + + +

Add entries to be considered for rename detection. + Add entries to be considered for rename detection. + one or more entries to add. + + if + getEntries + was already invoked. + +
+ + Add an entry to be considered for rename detection. + Add an entry to be considered for rename detection. + to add. + + if + getEntries + was already invoked. + + + + Detect renames in the current file set. + + Detect renames in the current file set. +

+ This convenience function runs without a progress monitor. + + + an unmodifiable list of + DiffEntry + s representing all files + that have been changed. + + file contents cannot be read from the repository. + + + +

Detect renames in the current file set. + Detect renames in the current file set. + report progress during the detection phases. + + an unmodifiable list of + DiffEntry + s representing all files + that have been changed. + + file contents cannot be read from the repository. + +
+ + Detect renames in the current file set. + Detect renames in the current file set. + reader to obtain objects from the repository with. + report progress during the detection phases. + + an unmodifiable list of + DiffEntry + s representing all files + that have been changed. + + file contents cannot be read from the repository. + + + + Detect renames in the current file set. + Detect renames in the current file set. + reader to obtain objects from the repository with. + report progress during the detection phases. + + an unmodifiable list of + DiffEntry + s representing all files + that have been changed. + + file contents cannot be read from the repository. + + + + Reset this rename detector for another rename detection pass. + Reset this rename detector for another rename detection pass. + + + + + + + + + + + + + Find the best match by file path for a given DiffEntry from a list of + DiffEntrys. + + + Find the best match by file path for a given DiffEntry from a list of + DiffEntrys. The returned DiffEntry will be of the same type as <src>. If + no DiffEntry can be found that has the same type, this method will return + null. + + the DiffEntry to try to find a match for + a list of DiffEntrys to search through + the DiffEntry from <list> who's file path best matches <src> + + + Index structure of lines/blocks in one file. + + Index structure of lines/blocks in one file. +

+ This structure can be used to compute an approximation of the similarity + between two files. The index is used by + SimilarityRenameDetector + to + compute scores between files. +

+ To save space in memory, this index uses a space efficient encoding which + will not exceed 1 MiB per instance. The index starts out at a smaller size + (closer to 2 KiB), but may grow as more distinct blocks within the scanned + file are discovered. + + + +

Shift to apply before storing a key. + + Shift to apply before storing a key. +

+ Within the 64 bit table record space, we leave the highest bit unset so + all values are positive. The lower 32 bits to count bytes. + + + +

Maximum value of the count field, also mask to extract the count. + Maximum value of the count field, also mask to extract the count. +
+ + + A special + TableFullException + used in place of OutOfMemoryError. + + + + Total size of the file we hashed into the structure. + Total size of the file we hashed into the structure. + + + + Number of non-zero entries in + idHash + . + + + + + idSize + that triggers + idHash + to double in size. + + + + Pairings of content keys and counters. + + Pairings of content keys and counters. +

+ Slots in the table are actually two ints wedged into a single long. The + upper 32 bits stores the content key, and the remaining lower bits stores + the number of bytes associated with that key. Empty slots are denoted by + 0, which cannot occur because the count cannot be 0. Values can only be + positive, which we enforce during key addition. + + + +

+ idHash.length == 1 << idHashBits + . + +
+ + + + + + + + + + + + + + Sort the internal table so it can be used for efficient scoring. + + Sort the internal table so it can be used for efficient scoring. +

+ Once sorted, additional lines/blocks cannot be added to the index. + + + + + + + + + + + + +

Number of bits we need to express an index into src or dst list. + + Number of bits we need to express an index into src or dst list. +

+ This must be 28, giving us a limit of 2^28 entries in either list, which + is an insane limit of 536,870,912 file names being considered in a single + rename pass. The other 8 bits are used to store the score, while staying + under 127 so the long doesn't go negative. + + + +

All sources to consider for copies or renames. + + All sources to consider for copies or renames. +

+ A source is typically a + ChangeType.DELETE + change, but could be + another type when trying to perform copy detection concurrently with + rename detection. + + + +

All destinations to consider looking for a rename. + + All destinations to consider looking for a rename. +

+ A destination is typically an + ChangeType.ADD + , as the name has + just come into existence, and we want to discover where its initial + content came from. + + + +

Matrix of all examined file pairs, and their scores. + + Matrix of all examined file pairs, and their scores. +

+ The upper 8 bits of each long stores the score, but the score is bounded + to be in the range (0, 128] so that the highest bit is never set, and all + entries are therefore positive. +

+ List indexes to an element of + srcs + and + dsts + are encoded + as the lower two groups of 28 bits, respectively, but the encoding is + inverted, so that 0 is expressed as + (1 << 28) - 1 + . This sorts + lower list indices later in the matrix, giving precedence to files whose + names sort earlier in the tree. + + + +

Score a pair must exceed to be considered a rename. + Score a pair must exceed to be considered a rename. +
+ + + Set if any + TableFullException + occurs. + + + + + + + + + + + + + + + + + Support for the Git dircache (aka index file). + + Support for the Git dircache (aka index file). +

+ The index file keeps track of which objects are currently checked out in the + working directory, and the last modified time of those working files. Changes + in the working directory can be detected by comparing the modification times + to the cached modification time within the index file. +

+ Index files are also used during merges, where the merge happens within the + index file first, and the working directory is updated as a post-merge step. + Conflicts are stored in the index file to allow tool (and human) based + resolutions to be easily performed. + + + +

Create a new empty index which is never stored on disk. + Create a new empty index which is never stored on disk. + + an empty cache which has no backing store file. The cache may not + be read or written, but it may be queried and updated (in + memory). + +
+ + Create a new in-core index representation and read an index from disk. + + Create a new in-core index representation and read an index from disk. +

+ The new index will be read before it is returned to the caller. Read + failures are reported as exceptions and therefore prevent the method from + returning a partially populated index. + + repository containing the index to read + + a cache representing the contents of the specified index file (if + it exists) or an empty cache if the file does not exist. + + the index file is present but could not be read. + + + the index file is using a format or extension that this + library does not support. + + + +

Create a new in-core index representation and read an index from disk. + + Create a new in-core index representation and read an index from disk. +

+ The new index will be read before it is returned to the caller. Read + failures are reported as exceptions and therefore prevent the method from + returning a partially populated index. + + location of the index file on disk. + + the file system abstraction which will be necessary to perform + certain file system operations. + + + a cache representing the contents of the specified index file (if + it exists) or an empty cache if the file does not exist. + + the index file is present but could not be read. + + + the index file is using a format or extension that this + library does not support. + + + +

Create a new in-core index representation, lock it, and read from disk. + + Create a new in-core index representation, lock it, and read from disk. +

+ The new index will be locked and then read before it is returned to the + caller. Read failures are reported as exceptions and therefore prevent + the method from returning a partially populated index. On read failure, + the lock is released. + + location of the index file on disk. + + the file system abstraction which will be necessary to perform + certain file system operations. + + + a cache representing the contents of the specified index file (if + it exists) or an empty cache if the file does not exist. + + + the index file is present but could not be read, or the lock + could not be obtained. + + + the index file is using a format or extension that this + library does not support. + + + +

Create a new in-core index representation, lock it, and read from disk. + + Create a new in-core index representation, lock it, and read from disk. +

+ The new index will be locked and then read before it is returned to the + caller. Read failures are reported as exceptions and therefore prevent + the method from returning a partially populated index. On read failure, + the lock is released. + + repository containing the index to lock and read + listener to be informed when DirCache is committed + + + a cache representing the contents of the specified index file (if + it exists) or an empty cache if the file does not exist. + + + the index file is present but could not be read, or the lock + could not be obtained. + + + the index file is using a format or extension that this + library does not support. + + 2.0 + + +

Create a new in-core index representation, lock it, and read from disk. + + Create a new in-core index representation, lock it, and read from disk. +

+ The new index will be locked and then read before it is returned to the + caller. Read failures are reported as exceptions and therefore prevent + the method from returning a partially populated index. On read failure, + the lock is released. + + location of the index file on disk. + + the file system abstraction which will be necessary to perform + certain file system operations. + + listener to be informed when DirCache is committed + + + a cache representing the contents of the specified index file (if + it exists) or an empty cache if the file does not exist. + + + the index file is present but could not be read, or the lock + could not be obtained. + + + the index file is using a format or extension that this + library does not support. + + + +

Location of the current version of the index file. + Location of the current version of the index file. +
+ + Individual file index entries, sorted by path name. + Individual file index entries, sorted by path name. + + + + Number of positions within + sortedEntries + that are valid. + + + + Cache tree for this index; null if the cache tree is not available. + Cache tree for this index; null if the cache tree is not available. + + + Our active lock (if we hold it); null if we don't have it locked. + Our active lock (if we hold it); null if we don't have it locked. + + + file system abstraction + + + Keep track of whether the index has changed or not + + + index checksum when index was read from disk + + + index checksum when index was written to disk + + + listener to be informed on commit + + + Repository containing this index + + + Create a new in-core index representation. + + Create a new in-core index representation. +

+ The new index will be empty. Callers may wish to read from the on disk + file first with + Read() + . + + location of the index file on disk. + + the file system abstraction which will be necessary to perform + certain file system operations. + + + +

Create a new builder to update this cache. + + Create a new builder to update this cache. +

+ Callers should add all entries to the builder, then use + DirCacheBuilder.Finish() + to update this instance. + + a new builder instance for this cache. + + +

Create a new editor to recreate this cache. + + Create a new editor to recreate this cache. +

+ Callers should add commands to the editor, then use + DirCacheEditor.Finish() + to update this instance. + + a new builder instance for this cache. + + +

Read the index from disk, if it has changed on disk. + + Read the index from disk, if it has changed on disk. +

+ This method tries to avoid loading the index if it has not changed since + the last time we consulted it. A missing index file will be treated as + though it were present but had no file entries in it. + + + the index file is present but could not be read. This + DirCache instance may not be populated correctly. + + + the index file is using a format or extension that this + library does not support. + + + + true if the memory state differs from the index file + System.IO.IOException + + +

Empty this index, removing all entries. + Empty this index, removing all entries. +
+ + + + + + + + + + + + Try to establish an update lock on the cache file. + Try to establish an update lock on the cache file. + + true if the lock is now held by the caller; false if it is held + by someone else. + + + the output file could not be created. The caller does not + hold the lock. + + + + Write the entry records from memory to disk. + + Write the entry records from memory to disk. +

+ The cache must be locked first by calling + Lock() + and receiving + true as the return value. Applications are encouraged to lock the index, + then invoke + Read() + to ensure the in-memory data is current, + prior to updating the in-memory entries. +

+ Once written the lock is closed and must be either committed with + Commit() + or rolled back with + Unlock() + . + + + the output file could not be created. The caller no longer + holds the lock. + + + + + + +

Commit this change and release the lock. + + Commit this change and release the lock. +

+ If this method fails (returns false) the lock is still released. + + + true if the commit was successful and the file contains the new + data; false if the commit failed and the file remains with the + old data. + + the lock is not held. + + +

Unlock this file and abort this change. + + Unlock this file and abort this change. +

+ The temporary file (if created) is deleted before returning. + + + +

Locate the position a path's entry is at in the index. + + Locate the position a path's entry is at in the index. +

+ If there is at least one entry in the index for this path the position of + the lowest stage is returned. Subsequent stages can be identified by + testing consecutive entries until the path differs. +

+ If no path matches the entry -(position+1) is returned, where position is + the location it would have gone within the index. + + the path to search for. + + if >= 0 then the return value is the position of the entry in the + index; pass to + GetEntry(int) + to obtain the entry + information. If < 0 the entry does not exist in the index. + + + +

Determine the next index position past all entries with the same name. + + Determine the next index position past all entries with the same name. +

+ As index entries are sorted by path name, then stage number, this method + advances the supplied position to the first position in the index whose + path name does not match the path name of the supplied position's entry. + + entry position of the path that should be skipped. + position of the next entry whose path is after the input. + + +

Total number of file entries stored in the index. + + Total number of file entries stored in the index. +

+ This count includes unmerged stages for a file entry if the file is + currently conflicted in a merge. This means the total number of entries + in the index may be up to 3 times larger than the number of files in the + working directory. +

+ Note that this value counts only files. + + number of entries available. + GetEntry(int) + + +

Get a specific entry. + Get a specific entry. + position of the entry to get. + the entry at position i. +
+ + Get a specific entry. + Get a specific entry. + the path to search for. + the entry for the given path. + + + Recursively get all entries within a subtree. + Recursively get all entries within a subtree. + the subtree path to get all entries within. + all entries recursively contained within the subtree. + + + Obtain (or build) the current cache tree structure. + + Obtain (or build) the current cache tree structure. +

+ This method can optionally recreate the cache tree, without flushing the + tree objects themselves to disk. + + + if true and the cache tree is not present in the index it will + be generated and returned to the caller. + + + the cache tree; null if there is no current cache tree available + and build was false. + + + +

Write all index trees to the object store, returning the root tree. + Write all index trees to the object store, returning the root tree. + + the writer to use when serializing to the store. The caller is + responsible for flushing the inserter before trying to use the + returned tree identity. + + identity for the root tree. + + one or more paths contain higher-order stages (stage > 0), + which cannot be stored in a tree object. + + + one or more paths contain an invalid mode which should never + appear in a tree object. + + an unexpected error occurred writing to the object store. + +
+ + Tells whether this index contains unmerged paths. + Tells whether this index contains unmerged paths. + + + true + if this index contains unmerged paths. Means: at + least one entry is of a stage different from 0. + false + will be returned if all entries are of stage 0. + + + + Update any smudged entries with information from the working tree. + Update any smudged entries with information from the working tree. + System.IO.IOException + + + + Iterate and update a + DirCache + as part of a TreeWalk. +

+ Like + DirCacheIterator + this iterator allows a DirCache to be used in + parallel with other sorts of iterators in a TreeWalk. However any entry which + appears in the source DirCache and which is skipped by the TreeFilter is + automatically copied into + DirCacheBuilder + , thus retaining it in the + newly updated index. +

+ This iterator is suitable for update processes, or even a simple delete + algorithm. For example deleting a path: +

+            final DirCache dirc = db.lockDirCache();
+            final DirCacheBuilder edit = dirc.builder();
+            final TreeWalk walk = new TreeWalk(db);
+            walk.reset();
+            walk.setRecursive(true);
+            walk.setFilter(PathFilter.create("name/to/remove"));
+            walk.addTree(new DirCacheBuildIterator(edit));
+            while (walk.next())
+            ; // do nothing on a match as we want to remove matches
+            edit.commit();
+            
+
+
+ + + Iterate a + DirCache + as part of a TreeWalk. +

+ This is an iterator to adapt a loaded DirCache instance (such as + read from an existing .git/index file) to the tree structure + used by a TreeWalk, making it possible for applications to walk + over any combination of tree objects already in the object database, index + files, or working directories. +

+ NGit.Treewalk.TreeWalk +
+ + Walks a Git tree (directory) in Git sort order. + + Walks a Git tree (directory) in Git sort order. +

+ A new iterator instance should be positioned on the first entry, or at eof. + Data for the first entry (if not at eof) should be available immediately. +

+ Implementors must walk a tree in the Git sort order, which has the following + odd sorting: +

    +
  1. A.c
  2. +
  3. A/c
  4. +
  5. A0c
  6. +
+

+ In the second item, A is the name of a subtree and + c is a file within that subtree. The other two items are files + in the root level tree. + + CanonicalTreeParser + + +

+ Default size for the + path + buffer. + +
+ + A dummy object id buffer that matches the zero ObjectId. + A dummy object id buffer that matches the zero ObjectId. + + + Iterator for the parent tree; null if we are the root iterator. + Iterator for the parent tree; null if we are the root iterator. + + + The iterator this current entry is path equal to. + The iterator this current entry is path equal to. + + + Number of entries we moved forward to force a D/F conflict match. + Number of entries we moved forward to force a D/F conflict match. + NameConflictTreeWalk + + + Mode bits for the current entry. + + Mode bits for the current entry. +

+ A numerical value from FileMode is usually faster for an iterator to + obtain from its data source so this is the preferred representation. + + NGit.FileMode + + +

Path buffer for the current entry. + + Path buffer for the current entry. +

+ This buffer is pre-allocated at the start of walking and is shared from + parent iterators down into their subtree iterators. The sharing allows + the current entry to always be a full path from the root, while each + subtree only needs to populate the part that is under their control. + + + +

+ Position within + path + this iterator starts writing at. +

+ This is the first offset in + path + that this iterator must + populate during + Next(int) + . At the root level (when + parent + is null) this is 0. For a subtree iterator the index before this position + should have the value '/'. +

+
+ + Total length of the current entry's complete path from the root. + + Total length of the current entry's complete path from the root. +

+ This is the number of bytes within + path + that pertain to the + current entry. Values at this index through the end of the array are + garbage and may be randomly populated from prior entries. + + + +

Create a new iterator with no parent. + Create a new iterator with no parent. +
+ + Create a new iterator with no parent and a prefix. + + Create a new iterator with no parent and a prefix. +

+ The prefix path supplied is inserted in front of all paths generated by + this iterator. It is intended to be used when an iterator is being + created for a subsection of an overall repository and needs to be + combined with other iterators that are created to run over the entire + repository namespace. + + + position of this iterator in the repository tree. The value + may be null or the empty string to indicate the prefix is the + root of the repository. A trailing slash ('/') is + automatically appended if the prefix does not end in '/'. + + + +

Create a new iterator with no parent and a prefix. + + Create a new iterator with no parent and a prefix. +

+ The prefix path supplied is inserted in front of all paths generated by + this iterator. It is intended to be used when an iterator is being + created for a subsection of an overall repository and needs to be + combined with other iterators that are created to run over the entire + repository namespace. + + + position of this iterator in the repository tree. The value + may be null or the empty array to indicate the prefix is the + root of the repository. A trailing slash ('/') is + automatically appended if the prefix does not end in '/'. + + + +

Create an iterator for a subtree of an existing iterator. + Create an iterator for a subtree of an existing iterator. + parent tree iterator. +
+ + Create an iterator for a subtree of an existing iterator. + + Create an iterator for a subtree of an existing iterator. +

+ The caller is responsible for setting up the path of the child iterator. + + parent tree iterator. + + path array to be used by the child iterator. This path must + contain the path from the top of the walk to the first child + and must end with a '/'. + + + position within childPath where the child can + insert its data. The value at + childPath[childPathOffset-1] must be '/'. + + + +

Grow the path buffer larger. + Grow the path buffer larger. + + number of live bytes in the path buffer. This many bytes will + be moved into the larger buffer. + +
+ + + Ensure that path is capable to hold at least + capacity + bytes + + the amount of bytes to hold + the amount of live bytes in path buffer + + + Set path buffer capacity to the specified size + the new size + the amount of bytes to copy + + + Compare the path of this current entry to another iterator's entry. + Compare the path of this current entry to another iterator's entry. + the other iterator to compare the path against. + + -1 if this entry sorts first; 0 if the entries are equal; 1 if + p's entry sorts first. + + + + Compare the path of this current entry to a raw buffer. + Compare the path of this current entry to a raw buffer. + the raw path buffer. + position to start reading the raw buffer. + one past the end of the raw buffer (length is end - pos). + the mode of the path. + + -1 if this entry sorts first; 0 if the entries are equal; 1 if + p's entry sorts first. + + + + Check if the current entry of both iterators has the same id. + + Check if the current entry of both iterators has the same id. +

+ This method is faster than + EntryObjectId() + as it does not + require copying the bytes out of the buffers. A direct + IdBuffer() + compare operation is performed. + + the other iterator to test against. + true if both iterators have the same object id; false otherwise. + + +

Obtain the ObjectId for the current entry. + Obtain the ObjectId for the current entry. + buffer to copy the object id into. +
+ + the internal buffer holding the current path. + + + + length of the path in + GetEntryPathBuffer() + . + + + + Get the current entry's path hash code. + + Get the current entry's path hash code. +

+ This method computes a hash code on the fly for this path, the hash is + suitable to cluster objects that may have similar paths together. + + path hash code; any integer may be returned. + + +

Create a new iterator for the current entry's subtree. + + Create a new iterator for the current entry's subtree. +

+ The parent reference of the iterator must be this, + otherwise the caller would not be able to exit out of the subtree + iterator correctly and return to continue walking this. + + reader to load the tree data from. + a new parser that walks over the current subtree. + + the current entry is not actually a tree and cannot be parsed + as though it were a tree. + + a loose object or pack file could not be read. + + + +

Create a new iterator as though the current entry were a subtree. + Create a new iterator as though the current entry were a subtree. + a new empty tree iterator. +
+ + Create a new iterator for the current entry's subtree. + + Create a new iterator for the current entry's subtree. +

+ The parent reference of the iterator must be this, otherwise + the caller would not be able to exit out of the subtree iterator + correctly and return to continue walking this. + + reader to load the tree data from. + temporary ObjectId buffer for use by this method. + a new parser that walks over the current subtree. + + the current entry is not actually a tree and cannot be parsed + as though it were a tree. + + a loose object or pack file could not be read. + + + +

Position this iterator on the first entry. + + Position this iterator on the first entry. + The default implementation of this method uses + back(1) + until + first() + is true. This is most likely not the most efficient + method of repositioning the iterator to its first entry, so subclasses + are strongly encouraged to override the method. + + the tree is invalid. +
+ + Move to next entry, populating this iterator with the entry data. + + Move to next entry, populating this iterator with the entry data. +

+ The delta indicates how many moves forward should occur. The most common + delta is 1 to move to the next entry. +

+ Implementations must populate the following members: +

    +
  • + mode +
  • +
  • + path + (from + pathOffset + to + pathLen + )
  • +
  • + pathLen +
  • +
+ as well as any implementation dependent information necessary to + accurately return data from + IdBuffer() + and + IdOffset() + when demanded. +
+ + number of entries to move the iterator by. Must be a positive, + non-zero integer. + + the tree is invalid. +
+ + Move to prior entry, populating this iterator with the entry data. + + Move to prior entry, populating this iterator with the entry data. +

+ The delta indicates how many moves backward should occur.The most common + delta is 1 to move to the prior entry. +

+ Implementations must populate the following members: +

    +
  • + mode +
  • +
  • + path + (from + pathOffset + to + pathLen + )
  • +
  • + pathLen +
  • +
+ as well as any implementation dependent information necessary to + accurately return data from + IdBuffer() + and + IdOffset() + when demanded. +
+ + number of entries to move the iterator by. Must be a positive, + non-zero integer. + + the tree is invalid. +
+ + Advance to the next tree entry, populating this iterator with its data. + + Advance to the next tree entry, populating this iterator with its data. +

+ This method behaves like seek(1) but is called by + TreeWalk + only if a + NGit.Treewalk.Filter.TreeFilter + was used and ruled out the + current entry from the results. In such cases this tree iterator may + perform special behavior. + + the tree is invalid. + + +

Indicates to the iterator that no more entries will be read. + + Indicates to the iterator that no more entries will be read. +

+ This is only invoked by TreeWalk when the iteration is aborted early due + to a + NGit.Errors.StopWalkException + being thrown from + within a TreeFilter. + + + +

+ JGit internal API for use by + NGit.Dircache.DirCacheCheckout + + + start of name component part within + GetEntryPathBuffer() + + 2.0 +
+ + + Get the name component of the current entry path into the provided + buffer. + + + Get the name component of the current entry path into the provided + buffer. + + + the buffer to get the name into, it is assumed that buffer can + hold the name + + the offset of the name in the buffer + NameLength() + + + true if the entry has a valid ObjectId. + + + Get the object id of the current entry. + Get the object id of the current entry. + an object id for the current entry. + + + the file mode of the current entry. + + + the file mode of the current entry as bits + + + path of the current entry, as a string. + + + Get the byte array buffer object IDs must be copied out of. + + Get the byte array buffer object IDs must be copied out of. +

+ The id buffer contains the bytes necessary to construct an ObjectId for + the current entry of this iterator. The buffer can be the same buffer for + all entries, or it can be a unique buffer per-entry. Implementations are + encouraged to expose their private buffer whenever possible to reduce + garbage generation and copying costs. + + byte array the implementation stores object IDs within. + EntryObjectId() + + +

+ Get the position within + IdBuffer() + of this entry's ObjectId. + + + offset into the array returned by + IdBuffer() + where the + ObjectId must be copied out of. + +
+ + + Is this tree iterator positioned on its first entry? +

+ An iterator is positioned on the first entry if back(1) + would be an invalid request as there is no entry before the current one. +

+ + Is this tree iterator positioned on its first entry? +

+ An iterator is positioned on the first entry if back(1) + would be an invalid request as there is no entry before the current one. +

+ An empty iterator (one with no entries) will be + first() && eof(). + + true if the iterator is positioned on the first entry. + + +

+ Is this tree iterator at its EOF point (no more entries)? +

+ An iterator is at EOF if there is no current entry. +

+ + Is this tree iterator at its EOF point (no more entries)? +

+ An iterator is at EOF if there is no current entry. + + true if we have walked all entries and have none left. + + + the length of the name component of the path for the current entry + + +

The cache this iterator was created to walk. + The cache this iterator was created to walk. +
+ + The tree this iterator is walking. + The tree this iterator is walking. + + + First position in this tree. + First position in this tree. + + + Last position in this tree. + Last position in this tree. + + + + Special buffer to hold the ObjectId of + currentSubtree + . + + + + + Index of entry within + cache + . + + + + + Next subtree to consider within + tree + . + + + + + The current file entry from + cache + . + + + + + The subtree containing + currentEntry + if this is first entry. + + + + Create a new iterator for an already loaded DirCache instance. + + Create a new iterator for an already loaded DirCache instance. +

+ The iterator implementation may copy part of the cache's data during + construction, so the cache must be read in prior to creating the + iterator. + + the cache to walk. It must be already loaded into memory. + + + + + + +

Get the DirCacheEntry for the current file. + Get the DirCacheEntry for the current file. + + the current cache entry, if this iterator is positioned on a + non-tree. + +
+ + Create a new iterator for an already loaded DirCache instance. + + Create a new iterator for an already loaded DirCache instance. +

+ The iterator implementation may copy part of the cache's data during + construction, so the cache must be read in prior to creating the + iterator. + + + the cache builder for the cache to walk. The cache must be + already loaded into memory. + + + + + + + + + + +

+ Updates a + DirCache + by adding individual + DirCacheEntry + s. +

+ A builder always starts from a clean slate and appends in every single + DirCacheEntry which the final updated index must have to reflect + its new content. +

+ For maximum performance applications should add entries in path name order. + Adding entries out of order is permitted, however a final sorting pass will + be implicitly performed during + Finish() + to correct any out-of-order + entries. Duplicate detection is also delayed until the sorting is complete. +

+ DirCacheEditor +
+ + Construct a new builder. + Construct a new builder. + the cache this builder will eventually update. + + estimated number of entries the builder will have upon + completion. This sizes the initial entry table. + + + + Append one entry into the resulting entry list. + + Append one entry into the resulting entry list. +

+ The entry is placed at the end of the entry list. If the entry causes the + list to now be incorrectly sorted a final sorting phase will be + automatically enabled within + Finish() + . +

+ The internal entry table is automatically expanded if there is + insufficient space for the new addition. + + the new entry to add. + If the FileMode of the entry was not set by the caller. + + + +

Add a range of existing entries from the destination cache. + + Add a range of existing entries from the destination cache. +

+ The entries are placed at the end of the entry list. If any of the + entries causes the list to now be incorrectly sorted a final sorting + phase will be automatically enabled within + Finish() + . +

+ This method copies from the destination cache, which has not yet been + updated with this editor's new table. So all offsets into the destination + cache are not affected by any updates that may be currently taking place + in this editor. +

+ The internal entry table is automatically expanded if there is + insufficient space for the new additions. + + first entry to copy from the destination cache. + number of entries to copy. + + +

Recursively add an entire tree into this builder. + + Recursively add an entire tree into this builder. +

+ If pathPrefix is "a/b" and the tree contains file "c" then the resulting + DirCacheEntry will have the path "a/b/c". +

+ All entries are inserted at stage 0, therefore assuming that the + application will not insert any other paths with the same pathPrefix. + + + UTF-8 encoded prefix to mount the tree's entries at. If the + path does not end with '/' one will be automatically inserted + as necessary. + + stage of the entries when adding them. + + reader the tree(s) will be read from during recursive + traversal. This must be the same repository that the resulting + DirCache would be written out to (or used in) otherwise the + caller is simply asking for deferred MissingObjectExceptions. + Caller is responsible for releasing this reader when done. + + + the tree to recursively add. This tree's contents will appear + under pathPrefix. The ObjectId must be that of a + tree; the caller is responsible for dereferencing a tag or + commit (if necessary). + + a tree cannot be read to iterate through its entries. + + + +

This class handles checking out one or two trees merging with the index. + + This class handles checking out one or two trees merging with the index. + +
+ + a list of updated paths and objectIds + + + a list of conflicts created by this checkout + + + + a list of paths (relative to the start of the working tree) of + files which couldn't be deleted during last call to + Checkout() + . + Checkout() + detected that these + files should be deleted but the deletion in the filesystem failed + (e.g. because a file was locked). To have a consistent state of + the working tree these files have to be deleted by the callers of + DirCacheCheckout + . + + + + a list of all files removed by this checkout + + + + Constructs a DirCacheCeckout for merging and checking out two trees (HEAD + and mergeCommitTree) and the index. + + + Constructs a DirCacheCeckout for merging and checking out two trees (HEAD + and mergeCommitTree) and the index. + + the repository in which we do the checkout + the id of the tree of the head commit + the (already locked) Dircache for this repo + the id of the tree we want to fast-forward to + an iterator over the repositories Working Tree + System.IO.IOException + + + + Constructs a DirCacheCeckout for merging and checking out two trees (HEAD + and mergeCommitTree) and the index. + + + Constructs a DirCacheCeckout for merging and checking out two trees (HEAD + and mergeCommitTree) and the index. As iterator over the working tree + this constructor creates a standard + NGit.Treewalk.FileTreeIterator + + the repository in which we do the checkout + the id of the tree of the head commit + the (already locked) Dircache for this repo + the id of the tree we want to fast-forward to + System.IO.IOException + + + + Constructs a DirCacheCeckout for checking out one tree, merging with the + index. + + + Constructs a DirCacheCeckout for checking out one tree, merging with the + index. + + the repository in which we do the checkout + the (already locked) Dircache for this repo + the id of the tree we want to fast-forward to + an iterator over the repositories Working Tree + System.IO.IOException + + + + Constructs a DirCacheCeckout for checking out one tree, merging with the + index. + + + Constructs a DirCacheCeckout for checking out one tree, merging with the + index. As iterator over the working tree this constructor creates a + standard + NGit.Treewalk.FileTreeIterator + + the repository in which we do the checkout + the (already locked) Dircache for this repo + the id of the tree of the + System.IO.IOException + + + Scan head, index and merge tree. + + Scan head, index and merge tree. Used during normal checkout or merge + operations. + + NGit.Errors.CorruptObjectException + + System.IO.IOException + + + + + + + + Scan index and merge tree (no HEAD). + + Scan index and merge tree (no HEAD). Used e.g. for initial checkout when + there is no head yet. + + NGit.Errors.MissingObjectException + + NGit.Errors.IncorrectObjectTypeException + + NGit.Errors.CorruptObjectException + + System.IO.IOException + + + + Processing an entry in the context of + PrescanOneTree() + when only + one tree is given + + the tree to merge + the index + the working tree + System.IO.IOException + + + Execute this checkout + + false if this method could not delete all the files + which should be deleted (e.g. because of of the files was + locked). In this case + GetToBeDeleted() + lists the files + which should be tried to be deleted outside of this method. + Although false is returned the checkout was + successful and the working tree was updated for all other files. + true is returned when no such problem occurred + + System.IO.IOException + + + + + + + + + + + Compares whether two pairs of ObjectId and FileMode are equal. + Compares whether two pairs of ObjectId and FileMode are equal. + + + + + + true if FileModes and ObjectIds are equal. + false otherwise + + + + Here the main work is done. + + Here the main work is done. This method is called for each existing path + in head, index and merge. This method decides what to do with the + corresponding index entry: keep it, update it, remove it or mark a + conflict. + + the entry for the head + the entry for the merge + the entry for the index + the file in the working tree + System.IO.IOException + + + A conflict is detected - add the three different stages to the index + the path of the conflicting entry + the previous index entry + the first tree you want to merge (the HEAD) + the second tree you want to merge + + + + If true, will scan first to see if it's possible to check + out, otherwise throw + NGit.Errors.CheckoutConflictException + + . If + false, it will silently deal with the problem. + + + + + + This method implements how to handle conflicts when + failOnConflict + is false + + NGit.Errors.CheckoutConflictException + + + + + + + + + Updates the file in the working tree with content and mode from an entry + in the index. + + + Updates the file in the working tree with content and mode from an entry + in the index. The new content is first written to a new temporary file in + the same directory as the real file. Then that new file is renamed to the + final filename. Use this method only for checkout of a single entry. + Otherwise use + checkoutEntry(Repository, File f, DirCacheEntry, ObjectReader) + instead which allows to reuse one + ObjectReader + for multiple + entries. +

+ TODO: this method works directly on File IO, we may need another + abstraction (like WorkingTreeIterator). This way we could tell e.g. + Eclipse that Files in the workspace got changed + + + + the file to be modified. The parent directory for this file + has to exist already + + the entry containing new mode and content + System.IO.IOException + + +

+ Updates the file in the working tree with content and mode from an entry + in the index. + + + Updates the file in the working tree with content and mode from an entry + in the index. The new content is first written to a new temporary file in + the same directory as the real file. Then that new file is renamed to the + final filename. +

+ TODO: this method works directly on File IO, we may need another + abstraction (like WorkingTreeIterator). This way we could tell e.g. + Eclipse that Files in the workspace got changed + + + + the file to be modified. The parent directory for this file + has to exist already + + the entry containing new mode and content + object reader to use for checkout + System.IO.IOException + + +

+ A single file (or stage of a file) in a + DirCache + . +

+ An entry represents exactly one stage of a file. If a file path is unmerged + then multiple DirCacheEntry instances may appear for the same path name. +

+
+ + The standard (fully merged) stage for an entry. + The standard (fully merged) stage for an entry. + + + The base tree revision for an entry. + The base tree revision for an entry. + + + The first tree revision (usually called "ours"). + The first tree revision (usually called "ours"). + + + The second tree revision (usually called "theirs"). + The second tree revision (usually called "theirs"). + + + + Mask applied to data in + P_FLAGS + to get the name length. + + + + In-core flag signaling that the entry should be considered as modified. + In-core flag signaling that the entry should be considered as modified. + + + (Possibly shared) header information storage. + (Possibly shared) header information storage. + + + + First location within + info + where our header starts. + + + + Our encoded path name, from the root of the repository. + Our encoded path name, from the root of the repository. + + + Flags which are never stored to disk. + Flags which are never stored to disk. + + + + + + Create an empty entry at stage 0. + Create an empty entry at stage 0. + name of the cache entry. + + If the path starts or ends with "/", or contains "//" either + "\0". These sequences are not permitted in a git tree object + or DirCache file. + + + + Create an empty entry at the specified stage. + Create an empty entry at the specified stage. + name of the cache entry. + the stage index of the new entry. + + If the path starts or ends with "/", or contains "//" either + "\0". These sequences are not permitted in a git tree object + or DirCache file. Or if + stage + is outside of the + range 0..3, inclusive. + + + + Create an empty entry at stage 0. + Create an empty entry at stage 0. + name of the cache entry, in the standard encoding. + + If the path starts or ends with "/", or contains "//" either + "\0". These sequences are not permitted in a git tree object + or DirCache file. + + + + Create an empty entry at the specified stage. + Create an empty entry at the specified stage. + name of the cache entry, in the standard encoding. + the stage index of the new entry. + + If the path starts or ends with "/", or contains "//" either + "\0". These sequences are not permitted in a git tree object + or DirCache file. Or if + stage + is outside of the + range 0..3, inclusive. + + + + + + + + Is it possible for this entry to be accidentally assumed clean? +

+ The "racy git" problem happens when a work file can be updated faster + than the filesystem records file modification timestamps. +

+ + Is it possible for this entry to be accidentally assumed clean? +

+ The "racy git" problem happens when a work file can be updated faster + than the filesystem records file modification timestamps. It is possible + for an application to edit a work file, update the index, then edit it + again before the filesystem will give the work file a new modification + timestamp. This method tests to see if file was written out at the same + time as the index. + + seconds component of the index's last modified time. + nanoseconds component of the index's last modified time. + true if extra careful checks should be used. + + +

Force this entry to no longer match its working tree file. + + Force this entry to no longer match its working tree file. +

+ This avoids the "racy git" problem by making this index entry no longer + match the file in the working directory. Later git will be forced to + compare the file content to ensure the file matches the working tree. + + + +

Returns whether this entry is in the fully-merged stage (0). + Returns whether this entry is in the fully-merged stage (0). + true if this entry is merged +
+ + Get the cached creation time of this file, in milliseconds. + Get the cached creation time of this file, in milliseconds. + + cached creation time of this file, in milliseconds since the + Java epoch (midnight Jan 1, 1970 UTC). + + + + Set the cached creation time of this file, using milliseconds. + Set the cached creation time of this file, using milliseconds. + new cached creation time of the file, in milliseconds. + + + Set the cached size (in bytes) of this file. + Set the cached size (in bytes) of this file. + + new cached size of the file, as bytes. If the file is larger + than 2G, cast it to (int) before calling this method. + + + + Set the cached size (in bytes) of this file. + Set the cached size (in bytes) of this file. + new cached size of the file, as bytes. + + + Obtain the ObjectId for the entry. + + Obtain the ObjectId for the entry. +

+ Using this method to compare ObjectId values between entries is + inefficient as it causes memory allocation. + + object identifier for the entry. + + +

Set the ObjectId for the entry. + Set the ObjectId for the entry. + + new object identifier for the entry. May be + NGit.ObjectId.ZeroId() + to remove the current identifier. + +
+ + Set the ObjectId for the entry from the raw binary representation. + Set the ObjectId for the entry from the raw binary representation. + + the raw byte buffer to read from. At least 20 bytes after p + must be available within this byte array. + + position to read the first byte of data from. + + + Use for debugging only ! + + + Copy the ObjectId and other meta fields from an existing entry. + + Copy the ObjectId and other meta fields from an existing entry. +

+ This method copies everything except the path from one entry to another, + supporting renaming. + + the entry to copy ObjectId and meta fields from. + + +

Copy the ObjectId and other meta fields from an existing entry. + + Copy the ObjectId and other meta fields from an existing entry. +

+ This method copies everything except the path and possibly stage from one + entry to another, supporting renaming. + + the entry to copy ObjectId and meta fields from. + if true, the stage attribute will not be copied + + +

+ Check whether this entry has been smudged or not +

+ If a blob has length 0 we know his id see + NGit.Constants.EMPTY_BLOB_ID + . If an entry + has length 0 and an ID different from the one for empty blob we know this + entry was smudged. +

+ + true if the entry is smudged, false + otherwise + +
+ + + Is this entry always thought to be unmodified? +

+ Most entries in the index do not have this flag set. +

+ + Is this entry always thought to be unmodified? +

+ Most entries in the index do not have this flag set. Users may however + set them on if the file system stat() costs are too high on this working + directory, such as on NFS or SMB volumes. + + true if we must assume the entry is unmodified. +

Set the assume valid flag for this entry, + + true to ignore apparent modifications; false to look at last + modified to detect file modifications. + +
+ + true if this entry should be checked for changes + Set whether this entry must be checked for changes + + + + Get the stage of this entry. + + Get the stage of this entry. +

+ Entries have one of 4 possible stages: 0-3. + + the stage of this entry. + + +

Returns whether this entry should be skipped from the working tree. + Returns whether this entry should be skipped from the working tree. + true if this entry should be skipepd. +
+ + Returns whether this entry is intent to be added to the Index. + Returns whether this entry is intent to be added to the Index. + true if this entry is intent to add. + + + + Obtain the raw + NGit.FileMode + bits for this entry. + + mode bits for the entry. + NGit.FileMode.FromBits(int) + + + + Obtain the + NGit.FileMode + for this entry. + + the file mode singleton for this entry. + Set the file mode for this entry. + Set the file mode for this entry. + the new mode constant. + + If + mode + is + NGit.FileMode.MISSING + , + NGit.FileMode.TREE + , or any other type code not permitted + in a tree object. + + + + Get the cached last modification date of this file, in milliseconds. + + Get the cached last modification date of this file, in milliseconds. +

+ One of the indicators that the file has been modified by an application + changing the working tree is if the last modification time for the file + differs from the time stored in this entry. + + + last modification time of this file, in milliseconds since the + Java epoch (midnight Jan 1, 1970 UTC). + +

Set the cached last modification date of this file, using milliseconds. + Set the cached last modification date of this file, using milliseconds. + new cached modification date of the file, in milliseconds. +
+ + Get the cached size (mod 4 GB) (in bytes) of this file. + + Get the cached size (mod 4 GB) (in bytes) of this file. +

+ One of the indicators that the file has been modified by an application + changing the working tree is if the size of the file (in bytes) differs + from the size stored in this entry. +

+ Note that this is the length of the file in the working directory, which + may differ from the size of the decompressed blob if work tree filters + are being used, such as LF<->CRLF conversion. +

+ Note also that for very large files, this is the size of the on-disk file + truncated to 32 bits, i.e. modulo 4294967296. If that value is larger + than 2GB, it will appear negative. + + cached size of the working directory file, in bytes. + + +

Get the entry's complete path. + + Get the entry's complete path. +

+ This method is not very efficient and is primarily meant for debugging + and final output generation. Applications should try to avoid calling it, + and if invoked do so only once per interesting entry, where the name is + absolutely required for correct function. + + + complete path of the entry, from the root of the repository. If + the entry is in a subtree there will be at least one '/' in the + returned string. + + + + true if the entry contains extended flags. + + +

+ Single tree record from the 'TREE' + DirCache + extension. +

+ A valid cache tree record contains the object id of a tree object and the + total number of + DirCacheEntry + instances (counted recursively) from + the DirCache contained within the tree. This information facilitates faster + traversal of the index and quicker generation of tree objects prior to + creating a new commit. +

+ An invalid cache tree record indicates a known subtree whose file entries + have changed in ways that cause the tree to no longer have a known object id. + Invalid cache tree records must be revalidated prior to use. +

+
+ + Tree this tree resides in; null if we are the root. + Tree this tree resides in; null if we are the root. + + + Name of this tree within its parent. + Name of this tree within its parent. + + + + Number of + DirCacheEntry + records that belong to this tree. + + + + Unique SHA-1 of this tree; null if invalid. + Unique SHA-1 of this tree; null if invalid. + + + + Child trees, if any, sorted by + encodedName + . + + + + + Number of valid children in + children + . + + + + + + + Determine if this cache is currently valid. + + Determine if this cache is currently valid. +

+ A valid cache tree knows how many + DirCacheEntry + instances from + the parent + DirCache + reside within this tree (recursively + enumerated). It also knows the object id of the tree, as the tree should + be readily available from the repository's object database. + + + true if this tree is knows key details about itself; false if the + tree needs to be regenerated. + + + +

Get the number of entries this tree spans within the DirCache. + + Get the number of entries this tree spans within the DirCache. +

+ If this tree is not valid (see + IsValid() + ) this method's return + value is always strictly negative (less than 0) but is otherwise an + undefined result. + + total number of entries (recursively) contained within this tree. + + +

Get the number of cached subtrees contained within this tree. + Get the number of cached subtrees contained within this tree. + number of child trees available through this tree. +
+ + Get the i-th child cache tree. + Get the i-th child cache tree. + index of the child to obtain. + the child tree. + + + Get the tree's name within its parent. + + Get the tree's name within its parent. +

+ This method is not very efficient and is primarily meant for debugging + and final output generation. Applications should try to avoid calling it, + and if invoked do so only once per interesting entry, where the name is + absolutely required for correct function. + + name of the tree. This does not contain any '/' characters. + + +

Get the tree's path within the repository. + + Get the tree's path within the repository. +

+ This method is not very efficient and is primarily meant for debugging + and final output generation. Applications should try to avoid calling it, + and if invoked do so only once per interesting entry, where the name is + absolutely required for correct function. + + + path of the tree, relative to the repository root. If this is not + the root tree the path ends with '/'. The root tree's path string + is the empty string (""). + + + +

Write (if necessary) this tree to the object store. + Write (if necessary) this tree to the object store. + the complete cache from DirCache. + + first position of cache that is a member of this + tree. The path of cache[cacheIdx].path for the + range [0,pathOff-1) matches the complete path of + this tree, from the root of the repository. + + + number of bytes of cache[cacheIdx].path that + matches this tree's path. The value at array position + cache[cacheIdx].path[pathOff-1] is always '/' if + pathOff is > 0. + + the writer to use when serializing to the store. + identity of this tree. + + one or more paths contain higher-order stages (stage > 0), + which cannot be stored in a tree object. + + an unexpected error occurred writing to the object store. + +
+ + + + + + Update (if necessary) this tree's entrySpan. + Update (if necessary) this tree's entrySpan. + the complete cache from DirCache. + + number of entries in cache that are valid for + iteration. + + + first position of cache that is a member of this + tree. The path of cache[cacheIdx].path for the + range [0,pathOff-1) matches the complete path of + this tree, from the root of the repository. + + + number of bytes of cache[cacheIdx].path that + matches this tree's path. The value at array position + cache[cacheIdx].path[pathOff-1] is always '/' if + pathOff is > 0. + + + + + An + NGit.AbbreviatedObjectId + cannot be extended. + + + + Construct a MissingObjectException for the specified object id. + + Construct a MissingObjectException for the specified object id. Expected + type is reported to simplify tracking down the problem. + + SHA-1 + the candidate matches returned by the ObjectReader. + + + the AbbreviatedObjectId that has more than one result. + + + the matching candidates (or at least a subset of them). + + + Exception thrown if a conflict occurs during a merge checkout. + Exception thrown if a conflict occurs during a merge checkout. + + + Construct a CheckoutConflictException for the specified file + + + + Construct a CheckoutConflictException for the specified set of files + + + + An exception detailing multiple reasons for failure. + An exception detailing multiple reasons for failure. + + + Constructs an exception detailing many potential reasons for failure. + Constructs an exception detailing many potential reasons for failure. + Two or more exceptions that may have been the problem. + + + Get the complete list of reasons why this failure happened. + Get the complete list of reasons why this failure happened. + unmodifiable collection of all possible reasons. + + + Indicates a text string is not a valid Git style configuration. + Indicates a text string is not a valid Git style configuration. + + + Construct an invalid configuration error. + Construct an invalid configuration error. + why the configuration is invalid. + + + Construct an invalid configuration error. + Construct an invalid configuration error. + why the configuration is invalid. + root cause of the error. + + + Exception thrown when an object cannot be read from Git. + Exception thrown when an object cannot be read from Git. + + + + Construct a CorruptObjectException for reporting a problem specified + object id + + + + + + + Construct a CorruptObjectException for reporting a problem specified + object id + + + + + + + Construct a CorruptObjectException for reporting a problem not associated + with a specific object id. + + + Construct a CorruptObjectException for reporting a problem not associated + with a specific object id. + + + + + Attempt to add an entry to a tree that already exists. + Attempt to add an entry to a tree that already exists. + + + + Construct an EntryExistsException when the specified name already + exists in a tree. + + + Construct an EntryExistsException when the specified name already + exists in a tree. + + workdir relative file name + + + + An exception thrown when a gitlink entry is found and cannot be + handled. + + + An exception thrown when a gitlink entry is found and cannot be + handled. + + + + Construct a GitlinksNotSupportedException for the specified link + name of link in tree or workdir + + + An inconsistency with respect to handling different object types. + + An inconsistency with respect to handling different object types. + This most likely signals a programming error rather than a corrupt + object database. + + + + Construct and IncorrectObjectTypeException for the specified object id. + + Construct and IncorrectObjectTypeException for the specified object id. + Provide the type to make it easier to track down the problem. + + SHA-1 + object type + + + Construct and IncorrectObjectTypeException for the specified object id. + + Construct and IncorrectObjectTypeException for the specified object id. + Provide the type to make it easier to track down the problem. + + SHA-1 + object type + + + Cannot write a modified index. + + Cannot write a modified index. This is a serious error that users need to be + made aware of. + + + + Constructs an IndexWriteException with the default message. + Constructs an IndexWriteException with the default message. + + + Constructs an IndexWriteException with the specified detail message. + Constructs an IndexWriteException with the specified detail message. + message + + + Constructs an IndexWriteException with the specified detail message. + Constructs an IndexWriteException with the specified detail message. + message + root cause exception + + + Thrown when an invalid object id is passed in as an argument. + Thrown when an invalid object id is passed in as an argument. + + + Create exception with bytes of the invalid object id. + Create exception with bytes of the invalid object id. + containing the invalid id. + in the byte array where the error occurred. + of the sequence of invalid bytes. + + + Thrown when a pattern passed in an argument was wrong. + Thrown when a pattern passed in an argument was wrong. + + + explains what was wrong with the pattern. + the invalid pattern. + + + the invalid pattern. + + + An object is too big to load into memory as a single byte array. + An object is too big to load into memory as a single byte array. + + + Create a large object exception, where the object isn't known. + Create a large object exception, where the object isn't known. + + + Create a large object exception, naming the object that is too big. + Create a large object exception, naming the object that is too big. + + identity of the object that is too big to be loaded as a byte + array in this JVM. + + + + identity of the object that is too large; may be null. + + + either the hex encoded name of the object, or 'unknown object'. + + + Set the identity of the object, if its not already set. + Set the identity of the object, if its not already set. + the id of the object that is too large to process. + + + An error caused by the JVM being out of heap space. + An error caused by the JVM being out of heap space. + + + Construct a wrapper around the original OutOfMemoryError. + Construct a wrapper around the original OutOfMemoryError. + the original root cause. + + + Object size exceeds JVM limit of 2 GiB per byte array. + Object size exceeds JVM limit of 2 GiB per byte array. + + + Object size exceeds the caller's upper limit. + Object size exceeds the caller's upper limit. + + + Construct an exception for a particular size being exceeded. + Construct an exception for a particular size being exceeded. + the limit the caller imposed on the object. + the actual size of the object. + + + An expected object is missing. + An expected object is missing. + + + Construct a MissingObjectException for the specified object id. + + Construct a MissingObjectException for the specified object id. + Expected type is reported to simplify tracking down the problem. + + SHA-1 + object type + + + Construct a MissingObjectException for the specified object id. + + Construct a MissingObjectException for the specified object id. + Expected type is reported to simplify tracking down the problem. + + SHA-1 + object type + + + Construct a MissingObjectException for the specified object id. + + Construct a MissingObjectException for the specified object id. Expected + type is reported to simplify tracking down the problem. + + SHA-1 + object type + + + the ObjectId that was not found. + + + + Thrown when a pattern contains a character group which is open to the right + side or a character class which is open to the right side. + + + Thrown when a pattern contains a character group which is open to the right + side or a character class which is open to the right side. + + + + the position of the [ character which has no ] character. + + the unclosed bracket. + the missing closing bracket. + the invalid pattern. + + + + Indicates a + NGit.Repository + has no working directory, and is thus bare. + + + + Creates an exception indicating there is no work tree for a repository. + Creates an exception indicating there is no work tree for a repository. + + + Cannot store an object in the object database. + + Cannot store an object in the object database. This is a serious + error that users need to be made aware of. + + + + Constructs an ObjectWritingException with the specified detail message. + Constructs an ObjectWritingException with the specified detail message. + message + + + Constructs an ObjectWritingException with the specified detail message. + Constructs an ObjectWritingException with the specified detail message. + message + root cause exception + + + Thrown when a PackFile previously failed and is known to be unusable + + + Construct a pack invalid error. + Construct a pack invalid error. + path of the invalid pack file. + + + Construct a pack invalid error. + Construct a pack invalid error. + path of the invalid pack file. + + + Thrown when a PackFile no longer matches the PackIndex. + Thrown when a PackFile no longer matches the PackIndex. + + + Construct a pack modification error. + Construct a pack modification error. + description of the type of error. + + + + Indicates a checked exception was thrown inside of + NGit.Revwalk.RevWalk + . +

+ Usually this exception is thrown from the Iterator created around a RevWalk + instance, as the Iterator API does not allow checked exceptions to be thrown + from hasNext() or next(). The + System.Exception.InnerException() + of this exception + is the original checked exception that we really wanted to throw back to the + application for handling and recovery. +

+
+ + Create a new walk exception an original cause. + Create a new walk exception an original cause. + the checked exception that describes why the walk failed. + + + + This signals a revision or object reference was not + properly formatted. + + + This signals a revision or object reference was not + properly formatted. + + + + + Construct a RevisionSyntaxException indicating a syntax problem with a + revision (or object) string. + + + Construct a RevisionSyntaxException indicating a syntax problem with a + revision (or object) string. + + The problematic revision string + + + + Construct a RevisionSyntaxException indicating a syntax problem with a + revision (or object) string. + + + Construct a RevisionSyntaxException indicating a syntax problem with a + revision (or object) string. + + a specific reason + The problematic revision string + + + Stops the driver loop of walker and finish with current results. + Stops the driver loop of walker and finish with current results. + NGit.Revwalk.Filter.RevFilter + + + Singleton instance for throwing within a filter. + Singleton instance for throwing within a filter. + + + A previously selected representation is no longer available. + A previously selected representation is no longer available. + + + Construct an error for an object. + Construct an error for an object. + the object whose current representation is no longer present. + + + + An exception thrown when a symlink entry is found and cannot be + handled. + + + An exception thrown when a symlink entry is found and cannot be + handled. + + + + Construct a SymlinksNotSupportedException for the specified link + name of link in tree or workdir + + + Common base class for all translation bundle related exceptions. + Common base class for all translation bundle related exceptions. + + + + To construct an instance of + TranslationBundleException + + exception message + bundle class for which the exception occurred + locale for which the exception occurred + + original exception that caused this exception. Usually thrown + from the + Sharpen.ResourceBundle + class. + + + + bundle class for which the exception occurred + + + locale for which the exception occurred + + + + This exception will be thrown when a translation bundle loading + fails. + + + This exception will be thrown when a translation bundle loading + fails. + + + + + Construct a + TranslationBundleLoadingException + for the specified + bundle class and locale. + + the bundle class for which the loading failed + the locale for which the loading failed + + the original exception thrown from the + Sharpen.ResourceBundle.GetBundle(string, System.Globalization.CultureInfo) + method. + + + + + This exception will be thrown when a translation string for a translation + bundle and locale is missing. + + + This exception will be thrown when a translation string for a translation + bundle and locale is missing. + + + + + Construct a + TranslationStringMissingException + for the specified + bundle class, locale and translation key + + the bundle class for which a translation string was missing + + the locale for which a translation string was missing + the key of the missing translation string + + the original exception thrown from the + Sharpen.ResourceBundle.GetString(string) + + method. + + + + the key of the missing translation string + + + Indicates one or more paths in a DirCache have non-zero stages present. + Indicates one or more paths in a DirCache have non-zero stages present. + + + Create a new unmerged path exception. + Create a new unmerged path exception. + the first non-zero stage of the unmerged path. + + + the first non-zero stage of the unmerged path + + + Describes a change to one or more keys in the configuration. + Describes a change to one or more keys in the configuration. + + + Describes a modification made to a repository. + Describes a modification made to a repository. + + + Set the repository this event occurred on. + + Set the repository this event occurred on. +

+ This method should only be invoked once on each event object, and is + automatically set by + NGit.Repository.FireEvent(RepositoryEvent<T>) + + . + + the repository. + + + the repository that was changed. + + + type of listener this event dispatches to. + + +

Dispatch this event to the given listener. + Dispatch this event to the given listener. + listener that wants this event. +
+ + + Receives + ConfigChangedEvent + s. + + + + Invoked when any change is made to the configuration. + Invoked when any change is made to the configuration. + information about the changes. + + + Describes a change to one or more paths in the index file. + Describes a change to one or more paths in the index file. + + + + Tracks a previously registered + RepositoryListener + . + + + + Remove the listener and stop receiving events. + Remove the listener and stop receiving events. + + + + Manages a thread-safe list of + RepositoryListener + s. + + + + Register an IndexChangedListener. + Register an IndexChangedListener. + the listener implementation. + handle to later remove the listener. + + + Register a RefsChangedListener. + Register a RefsChangedListener. + the listener implementation. + handle to later remove the listener. + + + Register a ConfigChangedListener. + Register a ConfigChangedListener. + the listener implementation. + handle to later remove the listener. + + + Add a listener to the list. + Add a listener to the list. + type of listener being registered. + the listener instance. + a handle to later remove the registration, if desired. + + + Dispatch an event to all interested listeners. + + Dispatch an event to all interested listeners. +

+ Listeners are selected by the type of listener the event delivers to. + + the event to deliver. + + +

Describes a change to one or more references of a repository. + Describes a change to one or more references of a repository. +
+ + + Receives + RefsChangedEvent + s. + + + + Invoked when any reference changes. + Invoked when any reference changes. + information about the changes. + + + the character which decides which heads are returned. + a list of heads based on the input. + + + + a list of + Head + s which will not be modified. + + + + This class can be used to match filenames against fnmatch like patterns. + + + This class can be used to match filenames against fnmatch like patterns. It + is not thread save. +

+ Supported are the wildcard characters * and ? and groups with: +

    +
  • characters e.g. [abc]
  • +
  • ranges e.g. [a-z]
  • +
  • the following character classes +
      +
    • [:alnum:]
    • +
    • [:alpha:]
    • +
    • [:blank:]
    • +
    • [:cntrl:]
    • +
    • [:digit:]
    • +
    • [:graph:]
    • +
    • [:lower:]
    • +
    • [:print:]
    • +
    • [:punct:]
    • +
    • [:space:]
    • +
    • [:upper:]
    • +
    • [:word:]
    • +
    • [:xdigit:]
    • +
    + e. g. [[:xdigit:]]
  • +
+
+
+ + + { + ExtendStringToMatchByOneCharacter(char) + + needs a list for the + new heads, allocating a new array would be bad for the performance, as + the method gets called very often. + + + + must be a list which will never be modified. + + + must be a list which will never be modified. + + a list which will be cloned and then used as current head + list. + + + + must contain a pattern which fnmatch would accept. + + if this parameter isn't null then this character will not + match at wildcards(* and ? are wildcards). + + if the patternString contains a invalid fnmatch pattern. + + + + + A Copy Constructor which creates a new + FileNameMatcher + with the + same state and reset point like other. + + + another + FileNameMatcher + instance. + + + + + + + + + + + + + + extends the string which is matched against the patterns of + this class. + + + + Resets this matcher to it's state right after construction. + Resets this matcher to it's state right after construction. + + + + a + FileNameMatcher + instance which uses the same pattern + like this matcher, but has the current state of this matcher as + reset and start point. + + + + true, if the string currently being matched does match. + + + + false, if the string being matched will not match when the string + gets extended. + + + + + + + the character to test + returns true if the character matches a pattern. + + + + Don't call this constructor, use + INSTANCE + + + + Represents a bundle of ignore rules inherited from a base directory. + + Represents a bundle of ignore rules inherited from a base directory. + This class is not thread safe, it maintains state about the last match. + + + + The rules that have been parsed into this node. + The rules that have been parsed into this node. + + + Create an empty ignore node with no rules. + Create an empty ignore node with no rules. + + + Create an ignore node with given rules. + Create an ignore node with given rules. + list of rules. + + + Parse files according to gitignore standards. + Parse files according to gitignore standards. + + input stream holding the standard ignore format. The caller is + responsible for closing the stream. + + Error thrown when reading an ignore file. + + + + list of all ignore rules held by this node. + + + Determine if an entry path matches an ignore rule. + Determine if an entry path matches an ignore rule. + + the path to test. The path must be relative to this ignore + node's own repository path, and in repository path format + (uses '/' and not '\'). + + true if the target item is a directory. + status of the path. + + + + Result from + IsIgnored(string, bool) + . + + + + + A single ignore rule corresponding to one line in a .gitignore or + ignore file. + + + A single ignore rule corresponding to one line in a .gitignore or + ignore file. Parses the ignore pattern + Inspiration from: Ferry Huberts + + + + Create a new ignore rule with the given pattern. + + Create a new ignore rule with the given pattern. Assumes that + the pattern is already trimmed. + + + Base pattern for the ignore rule. This pattern will + be parsed to generate rule parameters. + + + + Remove leading/trailing characters as needed. + + Remove leading/trailing characters as needed. Set up + rule variables for later matching. + + + + True if the pattern is just a file name and not a path + + + True if the pattern should match directories only + + + True if the pattern had a "!" in front of it + + + The blob pattern to be used as a matcher + + + Returns true if a match was made. + + Returns true if a match was made. +
+ This function does NOT return the actual ignore status of the + target! Please consult + GetResult() + for the ignore status. The actual + ignore status may be true or false depending on whether this rule is + an ignore rule or a negation rule. +
+ Name pattern of the file, relative to the base directory of this rule + + Whether the target file is a directory or not + + True if a match was made. This does not necessarily mean that + the target is ignored. Call + getResult() + for the result. + +
+ + + If a call to isMatch(String, boolean) was previously + made, this will return whether or not the target was ignored. + + + If a call to isMatch(String, boolean) was previously + made, this will return whether or not the target was ignored. Otherwise + this just indicates whether the rule is non-negation or negation. + + True if the target is to be ignored, false otherwise. + + + + Provides the merge algorithm which does a three-way merge on content provided + as RawText. + + + Provides the merge algorithm which does a three-way merge on content provided + as RawText. By default + NGit.Diff.HistogramDiff + is used as diff algorithm. + + + + + Creates a new MergeAlgorithm which uses + NGit.Diff.HistogramDiff + as diff + algorithm + + + + Creates a new MergeAlgorithm + the diff algorithm used by this merge + + + Does the three way merge between a common base and two sequences. + Does the three way merge between a common base and two sequences. + comparison method for this execution. + the common base sequence + the first sequence to be merged + the second sequence to be merged + the resulting content + + + Helper method which returns the next Edit for an Iterator over Edits. + + Helper method which returns the next Edit for an Iterator over Edits. + When there are no more edits left this method will return the constant + END_EDIT. + + the iterator for which the next edit should be returned + + the next edit from the iterator or END_EDIT if there no more + edits + + + + One chunk from a merge result. + + One chunk from a merge result. Each chunk contains a range from a + single sequence. In case of conflicts multiple chunks are reported for one + conflict. The conflictState tells when conflicts start and end. + + + + Creates a new empty MergeChunk + + determines to which sequence this chunks belongs to. Same as + in + MergeResult<S>.Add(int, int, int, ConflictState) + + + + the first element from the specified sequence which should be + included in the merge result. Indexes start with 0. + + + specifies the end of the range to be added. The element this + index points to is the first element which not added to the + merge result. All elements between begin (including begin) and + this element are added. + + + the state of this chunk. See + ConflictState + + + + + the index of the sequence to which sequence this chunks belongs + to. Same as in + MergeResult<S>.Add(int, int, int, ConflictState) + + + + + + the first element from the specified sequence which should be + included in the merge result. Indexes start with 0. + + + + + the end of the range of this chunk. The element this index + points to is the first element which not added to the merge + result. All elements between begin (including begin) and this + element are added. + + + + + the state of this chunk. See + ConflictState + + + + A state telling whether a MergeChunk belongs to a conflict or not. + + A state telling whether a MergeChunk belongs to a conflict or not. The + first chunk of a conflict is reported with a special state to be able to + distinguish the border between two consecutive conflicts + + + + A class to convert merge results into a Git conformant textual presentation + + + + + Formats the results of a merge of + NGit.Diff.RawText + objects in a Git + conformant way. This method also assumes that the + NGit.Diff.RawText + objects + being merged are line oriented files which use LF as delimiter. This + method will also use LF to separate chunks and conflict metadata, + therefore it fits only to texts that are LF-separated lines. + + the outputstream where to write the textual presentation + the merge result which should be presented + + When a conflict is reported each conflicting range will get a + name. This name is following the "<<<<<<< " or ">>>>>>> " + conflict markers. The names for the sequences are given in + this list + + + the name of the characterSet used when writing conflict + metadata + + System.IO.IOException + + + + Formats the results of a merge of exactly two + NGit.Diff.RawText + objects in + a Git conformant way. This convenience method accepts the names for the + three sequences (base and the two merged sequences) as explicit + parameters and doesn't require the caller to specify a List + + + the + Sharpen.OutputStream + where to write the textual + presentation + + the merge result which should be presented + the name ranges from the base should get + the name ranges from ours should get + the name ranges from theirs should get + + the name of the characterSet used when writing conflict + metadata + + System.IO.IOException + + + + The result of merging a number of + NGit.Diff.Sequence + objects. These sequences + have one common predecessor sequence. The result of a merge is a list of + MergeChunks. Each MergeChunk contains either a range (a subsequence) from + one of the merged sequences, a range from the common predecessor or a + conflicting range from one of the merged sequences. A conflict will be + reported as multiple chunks, one for each conflicting range. The first chunk + for a conflict is marked specially to distinguish the border between two + consecutive conflicts. +

+ This class does not know anything about how to present the merge result to + the end-user. MergeFormatters have to be used to construct something human + readable. +

+
+ + Creates a new empty MergeResult + + contains the common predecessor sequence at position 0 + followed by the merged sequences. This list should not be + modified anymore during the lifetime of this + MergeResult<S> + . + + + + + Adds a new range from one of the merged sequences or from the common + predecessor. + + + Adds a new range from one of the merged sequences or from the common + predecessor. This method can add conflicting and non-conflicting ranges + controlled by the conflictState parameter + + + determines from which sequence this range comes. An index of + x specifies the x+1 element in the list of sequences + specified to the constructor + + + the first element from the specified sequence which should be + included in the merge result. Indexes start with 0. + + + specifies the end of the range to be added. The element this + index points to is the first element which not added to the + merge result. All elements between begin (including begin) and + this element are added. + + + when set to NO_CONLICT a non-conflicting range is added. + This will end implicitly all open conflicts added before. + + + + + Returns the common predecessor sequence and the merged sequence in one + list. + + + Returns the common predecessor sequence and the merged sequence in one + list. The common predecessor is is the first element in the list + + + the common predecessor at position 0 followed by the merged + sequences. + + + + + an iterator over the MergeChunks. The iterator does not support + the remove operation + + + + true if this merge result contains conflicts + + + A method of combining two or more trees together to form an output tree. + + + A method of combining two or more trees together to form an output tree. +

+ Different strategies may employ different techniques for deciding which paths + (and ObjectIds) to carry from the input trees into the final output tree. + + + +

Simple strategy that sets the output tree to the first input tree. + Simple strategy that sets the output tree to the first input tree. +
+ + Simple strategy that sets the output tree to the second input tree. + Simple strategy that sets the output tree to the second input tree. + + + Simple strategy to merge paths, without simultaneous edits. + Simple strategy to merge paths, without simultaneous edits. + + + Simple strategy to merge paths. + Simple strategy to merge paths. It tries to merge also contents. Multiple merge bases are not supported + + + + Register a merge strategy so it can later be obtained by name. + Register a merge strategy so it can later be obtained by name. + the strategy to register. + a strategy by the same name has already been registered. + + + + Register a merge strategy so it can later be obtained by name. + Register a merge strategy so it can later be obtained by name. + name the strategy can be looked up under. + the strategy to register. + a strategy by the same name has already been registered. + + + + Locate a strategy by name. + Locate a strategy by name. + name of the strategy to locate. + the strategy instance; null if no strategy matches the name. + + + Get all registered strategies. + Get all registered strategies. + + the registered strategy instances. No inherit order is returned; + the caller may modify (and/or sort) the returned array if + necessary to obtain a reasonable ordering. + + + + default name of this strategy implementation. + + + Create a new merge instance. + Create a new merge instance. + + repository database the merger will read from, and eventually + write results back to. + + the new merge instance which implements this strategy. + + + Create a new merge instance. + Create a new merge instance. + + repository database the merger will read from, and eventually + write results back to. + + + the merge will happen in memory, working folder will not be + modified, in case of a non-trivial merge that requires manual + resolution, the merger will fail. + + the new merge instance which implements this strategy. + + + + Instance of a specific + MergeStrategy + for a single + NGit.Repository + . + + + + The repository this merger operates on. + The repository this merger operates on. + + + + Reader to support + walk + and other object loading. + + + + A RevWalk for computing merge bases, or listing incoming commits. + A RevWalk for computing merge bases, or listing incoming commits. + + + The original objects supplied in the merge; this can be any tree-ish. + The original objects supplied in the merge; this can be any tree-ish. + + + + If + sourceObjects + [i] is a commit, this is the commit. + + + + + The trees matching every entry in + sourceObjects + . + + + + Create a new merge instance for a repository. + Create a new merge instance for a repository. + the repository this merger will read and write data on. + + + the repository this merger operates on. + + + + an object writer to create objects in + GetRepository() + . + If no inserter has been set on this instance, one will be created + and returned by all future calls. + + + + Set the inserter this merger will use to create objects. + + Set the inserter this merger will use to create objects. +

+ If an inserter was already set on this instance (such as by a prior set, + or a prior call to + GetObjectInserter() + ), the prior inserter will + be released first. + + + the inserter instance to use. Must be associated with the + repository instance returned by + GetRepository() + . + + + +

Merge together two or more tree-ish objects. + + Merge together two or more tree-ish objects. +

+ Any tree-ish may be supplied as inputs. Commits and/or tags pointing at + trees or commits may be passed as input objects. + + + source trees to be combined together. The merge base is not + included in this set. + + + true if the merge was completed without conflicts; false if the + merge strategy cannot handle this merge or there were conflicts + preventing it from automatically resolving all paths. + + + one of the input objects is not a commit, but the strategy + requires it to be a commit. + + + one or more sources could not be read, or outputs could not + be written to the Repository. + + + +

Create an iterator to walk the merge base of two commits. + Create an iterator to walk the merge base of two commits. + + index of the first commit in + sourceObjects + . + + + index of the second commit in + sourceObjects + . + + the new iterator + one of the input objects is not a commit. + + objects are missing or multiple merge bases were found. + +
+ + Return the merge base of two commits. + Return the merge base of two commits. + + index of the first commit in + sourceObjects + . + + + index of the second commit in + sourceObjects + . + + the merge base of two commits + one of the input objects is not a commit. + + objects are missing or multiple merge bases were found. + + + + Open an iterator over a tree. + Open an iterator over a tree. + the tree to scan; must be a tree (not a treeish). + an iterator for the tree. + the input object is not a tree. + + the tree object is not found or cannot be read. + + + + Execute the merge. + + Execute the merge. +

+ This method is called from + Merge(NGit.AnyObjectId[]) + after the + sourceObjects + , + sourceCommits + and + sourceTrees + have been populated. + + + true if the merge was completed without conflicts; false if the + merge strategy cannot handle this merge or there were conflicts + preventing it from automatically resolving all paths. + + + one of the input objects is not a commit, but the strategy + requires it to be a commit. + + + one or more sources could not be read, or outputs could not + be written to the Repository. + + + + + resulting tree, if + Merge(NGit.AnyObjectId[]) + returned true. + + + +

A three-way merger performing a content-merge if necessary +
+ + A merge of 2 trees, using a common base ancestor tree. + A merge of 2 trees, using a common base ancestor tree. + + + Create a new merge instance for a repository. + Create a new merge instance for a repository. + the repository this merger will read and write data on. + + + Create a new merge instance for a repository. + Create a new merge instance for a repository. + the repository this merger will read and write data on. + perform the merge in core with no working folder involved + + + Set the common ancestor tree. + Set the common ancestor tree. + + common base treeish; null to automatically compute the common + base from the input commits during + Merge(NGit.AnyObjectId[]) + . + + the object is not a treeish. + + the object does not exist. + the object could not be read. + + + + + + Create an iterator to walk the merge base. + Create an iterator to walk the merge base. + + an iterator over the caller-specified merge base, or the natural + merge base of the two input commits. + + System.IO.IOException + + + + + + + + + + + + + + + + + + + + Reverts the worktree after an unsuccessful merge. + + Reverts the worktree after an unsuccessful merge. We know that for all + modified files the old content was in the old index and the index + contained only stage 0. In case if inCore operation just clear + the history of modified files. + + System.IO.IOException + NGit.Errors.CorruptObjectException + + NGit.Errors.NoWorkTreeException + + + + adds a new path with the specified stage to the index builder + + + + + + the entry which was added to the index + + + + adds a entry to the index builder which is a copy of the specified + DirCacheEntry + + the entry which should be copied + the entry which was added to the index + + + Processes one path and tries to merge. + + Processes one path and tries to merge. This method will do all do all + trivial (not content) merges and will also detect if a merge will fail. + The merge will fail when one of the following is true +
    +
  • the index entry does not match the entry in ours. When merging one + branch into the current HEAD, ours will point to HEAD and theirs will + point to the other branch. It is assumed that the index matches the HEAD + because it will only not match HEAD if it was populated before the merge + operation. But the merge commit should not accidentally contain + modifications done before the merge. Check the <a href= + "http://www.kernel.org/pub/software/scm/git/docs/git-read-tree.html#_3_way_merge" + >git read-tree</a> documentation for further explanations.
  • +
  • A conflict was detected and the working-tree file is dirty. When a + conflict is detected the content-merge algorithm will try to write a + merged version into the working-tree. If the file is dirty we would + override unsaved data.
  • +
+
+ the common base for ours and theirs + + the ours side of the merge. When merging a branch into the + HEAD ours will point to HEAD + + + the theirs side of the merge. When merging a branch into the + current HEAD theirs will point to the branch which is merged + into HEAD. + + the index entry + the file in the working tree + + false if the merge will fail because the index entry + didn't match ours or the working-dir file was dirty and a + conflict occurred + + NGit.Errors.MissingObjectException + + NGit.Errors.IncorrectObjectTypeException + + NGit.Errors.CorruptObjectException + + System.IO.IOException +
+ + Does the content merge. + + Does the content merge. The three texts base, ours and theirs are + specified with + NGit.Treewalk.CanonicalTreeParser + . If any of the parsers is + specified as null then an empty text will be used instead. + + + + + the result of the content merge + System.IO.IOException + + + Updates the index after a content merge has happened. + + Updates the index after a content merge has happened. If no conflict has + occurred this includes persisting the merged content to the object + database. In case of conflicts this method takes care to write the + correct stages to the index. + + + + + + + System.IO.FileNotFoundException + + System.IO.IOException + + + Writes merged file content to the working tree. + + Writes merged file content to the working tree. In case + inCore + is set and we don't have a working tree the content is written to a + temporary file + + the result of the content merge + the file to which the merged content was written + System.IO.FileNotFoundException + + System.IO.IOException + + + Try to merge filemodes. + + Try to merge filemodes. If only ours or theirs have changed the mode + (compared to base) we choose that one. If ours and theirs have equal + modes return that one. If also that is not the case the modes are not + mergeable. Return + NGit.FileMode.MISSING + int that case. + + filemode found in BASE + filemode found in OURS + filemode found in THEIRS + + the merged filemode or + NGit.FileMode.MISSING + in case of a + conflict + + + + + + + + the names of the commits as they would appear in conflict + markers + + + + + the names of the commits as they would appear in conflict + markers. + + + + + the paths with conflicts. This is a subset of the files listed + by + GetModifiedFiles() + + + + + the paths of files which have been modified by this merge. A + file will be modified if a content-merge works on this path or if + the merge algorithm decides to take the theirs-version. This is a + superset of the files listed by + GetUnmergedPaths() + . + + + + + a map which maps the paths of files which have to be checked out + because the merge created new fully-merged content for this file + into the index. This means: the merge wrote a new stage 0 entry + for this path. + + + + the mergeResults + + + + lists paths causing this merge to fail (not stopped because of a + conflict). null is returned if this merge didn't + fail. + + + + Returns whether this merge failed (i.e. + + Returns whether this merge failed (i.e. not stopped because of a + conflict) + + + true if a failure occurred, false + otherwise + + + + Sets the DirCache which shall be used by this merger. + + Sets the DirCache which shall be used by this merger. If the DirCache is + not set explicitly this merger will implicitly get and lock a default + DirCache. If the DirCache is explicitly set the caller is responsible to + lock it in advance. Finally the merger will call + NGit.Dircache.DirCache.Commit() + which requires that the DirCache is locked. If + the + MergeImpl() + returns without throwing an exception the lock + will be released. In case of exceptions the caller is responsible to + release the lock. + + the DirCache to set + + + Sets the WorkingTreeIterator to be used by this merger. + + Sets the WorkingTreeIterator to be used by this merger. If no + WorkingTreeIterator is set this merger will ignore the working tree and + fail if a content merge is necessary. +

+ TODO: enhance WorkingTreeIterator to support write operations. Then this + merger will be able to merge with a different working tree abstraction. + + the workingTreeIt to set + + +

+ If the merge fails (means: not stopped because of unresolved conflicts) + this enum is used to explain why it failed + +
+ + Trivial merge strategy to make the resulting tree exactly match an input. + + + Trivial merge strategy to make the resulting tree exactly match an input. +

+ This strategy can be used to cauterize an entire side branch of history, by + setting the output tree to one of the inputs, and ignoring any of the paths + of the other inputs. + + + +

Create a new merge strategy to select a specific input tree. + Create a new merge strategy to select a specific input tree. + name of this strategy. + the position of the input tree to accept as the result. +
+ + + + + A three-way merge strategy performing a content-merge if necessary + + + A merge strategy to merge 2 trees, using a common base ancestor tree. + A merge strategy to merge 2 trees, using a common base ancestor tree. + + + Merges two commits together in-memory, ignoring any working directory. + + Merges two commits together in-memory, ignoring any working directory. +

+ The strategy chooses a path from one of the two input trees if the path is + unchanged in the other relative to their common merge base tree. This is a + trivial 3-way merge (at the file path level only). +

+ Modifications of the same file path (content and/or file mode) by both input + trees will cause a merge conflict, as this strategy does not attempt to merge + file contents. + + + +

Create a new instance of the strategy. + Create a new instance of the strategy. +
+ + + + + + + + Global cache of translation bundles. + + Global cache of translation bundles. +

+ Every translation bundle will be cached here when it gets loaded for the + first time from a thread. Another lookup for the same translation bundle + (same locale and type) from the same or a different thread will return the + cached one. +

+ Note that NLS instances maintain per-thread Map of loaded translation + bundles. Once a thread accesses a translation bundle it will keep reference + to it and will not call + LookupBundle<T>(System.Globalization.CultureInfo, System.Type<T>) + + again for the + same translation bundle as long as its locale doesn't change. + + + +

Looks up for a translation bundle in the global cache. + + Looks up for a translation bundle in the global cache. If found returns + the cached bundle. If not found creates a new instance puts it into the + cache and returns it. + + the preferred locale + required bundle type + an instance of the required bundle type + + TranslationBundleLoadingException + see + TranslationBundle.Load(System.Globalization.CultureInfo) + + + + TranslationStringMissingException + see + TranslationBundle.Load(System.Globalization.CultureInfo) + + +
+ + + The purpose of this class is to provide NLS (National Language Support) + configurable per thread. + + + The purpose of this class is to provide NLS (National Language Support) + configurable per thread. +

+ The + SetLocale(System.Globalization.CultureInfo) + + method is used to configure locale for the + calling thread. The locale setting is thread inheritable. This means that a + child thread will have the same locale setting as its creator thread until it + changes it explicitly. +

+ Example of usage: +

+            NLS.setLocale(Locale.GERMAN);
+            TransportText t = NLS.getBundleFor(TransportText.class);
+            
+
+
+ + The root locale constant. + The root locale constant. It is defined here because the Locale.ROOT is not defined in Java 5 + + + + Sets the locale for the calling thread. + + Sets the locale for the calling thread. +

+ The + GetBundleFor<T>(System.Type<T>) + + method will honor this setting if if it + is supported by the provided resource bundle property files. Otherwise, + it will use a fall back locale as described in the + TranslationBundle + + the preferred locale + + +

Sets the JVM default locale as the locale for the calling thread. + + Sets the JVM default locale as the locale for the calling thread. +

+ Semantically this is equivalent to NLS.setLocale(Locale.getDefault()). + + + +

Returns an instance of the translation bundle of the required type. + + Returns an instance of the translation bundle of the required type. All + public String fields of the bundle instance will get their values + injected as described in the + TranslationBundle + . + + required bundle type + an instance of the required bundle type + + TranslationBundleLoadingException + see + NGit.Errors.TranslationBundleLoadingException + + + + TranslationStringMissingException + see + NGit.Errors.TranslationStringMissingException + + +
+ + + Base class for all translation bundles that provides injection of translated + texts into public String fields. + + + Base class for all translation bundles that provides injection of translated + texts into public String fields. +

+ The usage pattern is shown with the following example. First define a new + translation bundle: +

+            public class TransportText extends TranslationBundle {
+            public static TransportText get() {
+            return NLS.getBundleFor(TransportText.class);
+            }
+            public String repositoryNotFound;
+            public String transportError;
+            }
+            
+ Second, define one or more resource bundle property files. +
+            TransportText_en_US.properties:
+            repositoryNotFound=repository {0} not found
+            transportError=unknown error talking to {0}
+            TransportText_de.properties:
+            repositoryNotFound=repository {0} nicht gefunden
+            transportError=unbekannter Fehler w√§hrend der Kommunikation mit {0}
+            ...
+            
+ Then make use of it: +
+            NLS.setLocale(Locale.GERMAN); // or skip this call to stick to the JVM default locale
+            ...
+            throw new TransportException(uri, TransportText.get().transportError);
+            
+ The translated text is automatically injected into the public String fields + according to the locale set with + NLS.SetLocale(System.Globalization.CultureInfo) + + . However, the + NLS.SetLocale(System.Globalization.CultureInfo) + + method defines only prefered locale which will + be honored only if it is supported by the provided resource bundle property + files. Basically, this class will use + Sharpen.ResourceBundle.GetBundle(string, System.Globalization.CultureInfo) + method to load a resource + bundle. See the documentation of this method for a detailed explanation of + resource bundle loading strategy. After a bundle is created the + EffectiveLocale() + method can be used to determine whether the + bundle really corresponds to the requested locale or is a fallback. +

+ To load a String from a resource bundle property file this class uses the + Sharpen.ResourceBundle.GetString(string) + + . This method can throw the + Sharpen.MissingResourceException + and this class is not making any effort to + catch and/or translate this exception. +

+ To define a concrete translation bundle one has to: +

    +
  • extend this class
  • +
  • define a public static get() method like in the example above
  • +
  • define public static String fields for each text message
  • +
  • make sure the translation bundle class provide public no arg constructor
  • +
  • provide one or more resource bundle property files in the same package + where the translation bundle class resides
  • +
+
+
+ + + the locale locale used for loading the resource bundle from which + the field values were taken + + + + the resource bundle on which this translation bundle is based + + + Injects locale specific text in all instance fields of this instance. + + Injects locale specific text in all instance fields of this instance. + Only public instance fields of type String are considered. +

+ The name of this (sub)class plus the given locale parameter + define the resource bundle to be loaded. In other words the + this.getClass().getName() is used as the + baseName parameter in the + Sharpen.ResourceBundle.GetBundle(string, System.Globalization.CultureInfo) + parameter to load the + resource bundle. +

+ + defines the locale to be used when loading the resource bundle + + + TranslationBundleLoadingException + see + NGit.Errors.TranslationBundleLoadingException + + + + TranslationStringMissingException + see + NGit.Errors.TranslationStringMissingException + + + + + +

Part of a "GIT binary patch" to describe the pre-image or post-image +
+ + + Offset within + file + .buf to the "literal" or "delta " line. + + + + + Position 1 past the end of this hunk within + file + 's buf. + + + + Type of the data meaning. + Type of the data meaning. + + + Inflated length of the data. + Inflated length of the data. + + + header for the file this hunk applies to + + + the byte array holding this hunk's patch script. + + + + offset the start of this hunk in + GetBuffer() + . + + + + + offset one past the end of the hunk in + GetBuffer() + . + + + + type of this binary hunk + + + inflated size of this hunk's data + + + Type of information stored in a binary hunk. + Type of information stored in a binary hunk. + + + A file in the Git "diff --cc" or "diff --combined" format. + + A file in the Git "diff --cc" or "diff --combined" format. +

+ A combined diff shows an n-way comparison between two or more ancestors and + the final revision. Its primary function is to perform code reviews on a + merge which introduces changes not in any ancestor. + + + +

Patch header describing an action for a single file path. + Patch header describing an action for a single file path. +
+ + Buffer holding the patch data for this file. + Buffer holding the patch data for this file. + + + + Offset within + buf + to the "diff ..." line. + + + + + Position 1 past the end of this file within + buf + . + + + + Type of patch used to modify this file + + + The hunks of this file + + + + If + patchType + is + PatchType.GIT_BINARY + , the new image + + + + + If + patchType + is + PatchType.GIT_BINARY + , the old image + + + + Constructs a new FileHeader + buffer holding the diff header for this file + the edits for this file + the type of patch used to modify this file + + + the byte array holding this file's patch script. + + + + offset the start of this file's script in + GetBuffer() + . + + + + offset one past the end of the file script. + + + Convert the patch script for this file into a string. + + Convert the patch script for this file into a string. +

+ The default character encoding ( + NGit.Constants.CHARSET + ) is assumed for + both the old and new files. + + the patch script, as a Unicode string. + + +

Convert the patch script for this file into a string. + Convert the patch script for this file into a string. + hint character set to decode the old lines with. + hint character set to decode the new lines with. + the patch script, as a Unicode string. +
+ + style of patch used to modify this file + + + true if this patch modifies metadata about a file + + + hunks altering this file; in order of appearance in patch + + + + if a + PatchType.GIT_BINARY + , the new-image delta/literal + + + + + if a + PatchType.GIT_BINARY + , the old-image delta/literal + + + + a list describing the content edits performed on this file. + + + Parse a "diff --git" or "diff --cc" line. + Parse a "diff --git" or "diff --cc" line. + first character after the "diff --git " or "diff --cc " part. + one past the last position to parse. + first character after the LF at the end of the line; -1 on error. + + + Determine if this is a patch hunk header. + Determine if this is a patch hunk header. + the buffer to scan + first position in the buffer to evaluate + + last position to consider; usually the end of the buffer ( + buf.length) or the first position on the next + line. This is only used to avoid very long runs of '@' from + killing the scan loop. + + + the number of "ancestor revisions" in the hunk header. A + traditional two-way diff ("@@ -...") returns 1; a combined diff + for a 3 way-merge returns 3. If this is not a hunk header, 0 is + returned instead. + + + + Type of patch used by this file. + Type of patch used by this file. + + + number of ancestor revisions mentioned in this diff. + + + get the file mode of the first parent. + + + Get the file mode of the nth ancestor + the ancestor to get the mode of + the mode of the requested ancestor. + + + get the object id of the first parent. + + + Get the ObjectId of the nth ancestor + the ancestor to get the object id of + the id of the requested ancestor. + + + Convert the patch script for this file into a string. + Convert the patch script for this file into a string. + + optional array to suggest the character set to use when + decoding each file's line. If supplied the array must have a + length of + GetParentCount() + + 1 + representing the old revision character sets and the new + revision character set. + + the patch script, as a Unicode string. + + + Hunk header for a hunk appearing in a "diff --cc" style patch. + Hunk header for a hunk appearing in a "diff --cc" style patch. + + + Hunk header describing the layout of a single block of lines + + + + Offset within + file + .buf to the "@@ -" line. + + + + + Position 1 past the end of this hunk within + file + 's buf. + + + + First line number in the post-image file where the hunk starts + + + Total number of post-image lines this hunk covers (context + inserted) + + + Total number of lines of context appearing in this hunk + + + header for the file this hunk applies to + + + the byte array holding this hunk's patch script. + + + + offset the start of this hunk in + GetBuffer() + . + + + + + offset one past the end of the hunk in + GetBuffer() + . + + + + information about the old image mentioned in this hunk. + + + first line number in the post-image file where the hunk starts + + + Total number of post-image lines this hunk covers + + + total number of lines of context appearing in this hunk + + + a list describing the content edits performed within the hunk. + + + + + + Details about an old image of the file. + Details about an old image of the file. + + + First line number the hunk starts on in this file. + First line number the hunk starts on in this file. + + + Total number of lines this hunk covers in this file. + Total number of lines this hunk covers in this file. + + + Number of lines deleted by the post-image from this file. + Number of lines deleted by the post-image from this file. + + + Number of lines added by the post-image not in this file. + Number of lines added by the post-image not in this file. + + + first line number the hunk starts on in this file. + + + total number of lines this hunk covers in this file. + + + number of lines deleted by the post-image from this file. + + + number of lines added by the post-image not in this file. + + + object id of the pre-image file. + + + Get the OldImage data related to the nth ancestor + the ancestor to get the old image data of + image data of the requested ancestor. + + + + + + An error in a patch script + + + the severity of the error. + + + a message describing the error. + + + the byte buffer holding the patch script. + + + + byte offset within + GetBuffer() + where the error is + + + + line of the patch script the error appears on. + + + Classification of an error. + Classification of an error. + + + + A parsed collection of + FileHeader + s from a unified diff patch file + + + + The files, in the order they were parsed out of the input. + The files, in the order they were parsed out of the input. + + + Formatting errors, if any were identified. + Formatting errors, if any were identified. + + + Create an empty patch. + Create an empty patch. + + + Add a single file to this patch. + + Add a single file to this patch. +

+ Typically files should be added by parsing the text through one of this + class's parse methods. + + the header of the file. + + + list of files described in the patch, in occurrence order. + + +

Add a formatting error to this patch script. + Add a formatting error to this patch script. + the error description. +
+ + collection of formatting errors, if any. + + + Parse a patch received from an InputStream. + + Parse a patch received from an InputStream. +

+ Multiple parse calls on the same instance will concatenate the patch + data, but each parse input must start with a valid file header (don't + split a single file across parse calls). + + + the stream to read the patch data from. The stream is read + until EOF is reached. + + there was an error reading from the input stream. + + + + + + +

Parse a patch stored in a byte[]. + + Parse a patch stored in a byte[]. +

+ Multiple parse calls on the same instance will concatenate the patch + data, but each parse input must start with a valid file header (don't + split a single file across parse calls). + + the buffer to parse. + starting position to parse from. + + 1 past the last position to end parsing. The total length to + be parsed is end - ptr. + + + +

Basic commit graph renderer for graphical user interfaces. + + Basic commit graph renderer for graphical user interfaces. +

+ Lanes are drawn as columns left-to-right in the graph, and the commit short + message is drawn to the right of the lane lines for this cell. It is assumed + that the commits are being drawn as rows of some sort of table. +

+ Client applications can subclass this implementation to provide the necessary + drawing primitives required to display a commit graph. Most of the graph + layout is handled by this class, allowing applications to implement only a + handful of primitive stubs. +

+ This class is suitable for us within an AWT TableCellRenderer or within a SWT + PaintListener registered on a Table instance. It is meant to rubber stamp the + graphics necessary for one row of a plotted commit list. +

+ Subclasses should call + AbstractPlotRenderer<TLane, TColor>.PaintCommit(PlotCommit<L>, int) + + after they have + otherwise configured their instance to draw one commit into the current + location. +

+ All drawing methods assume the coordinate space for the current commit's cell + starts at (upper left corner is) 0,0. If this is not true (like say in SWT) + the implementation must perform the cell offset computations within the + various draw methods. + + + +

Paint one commit using the underlying graphics library. + Paint one commit using the underlying graphics library. + the commit to render in this cell. Must not be null. + total height (in pixels) of this cell. +
+ + Draw a decoration for the Ref ref at x,y + left + top + A peeled ref + width of label in pixels + + + Obtain the color reference used to paint this lane. + + Obtain the color reference used to paint this lane. +

+ Colors returned by this method will be passed to the other drawing + primitives, so the color returned should be application specific. +

+ If a null lane is supplied the return value must still be acceptable to a + drawing method. Usually this means the implementation should return a + default color. + + the current lane. May be null. + graphics specific color reference. Must be a valid color. + + +

Draw a single line within this cell. + Draw a single line within this cell. + the color to use while drawing the line. + starting X coordinate, 0 based. + starting Y coordinate, 0 based. + ending X coordinate, 0 based. + ending Y coordinate, 0 based. + number of pixels wide for the line. Always at least 1. +
+ + Draw a single commit dot. + + Draw a single commit dot. +

+ Usually the commit dot is a filled oval in blue, then a drawn oval in + black, using the same coordinates for both operations. + + upper left of the oval's bounding box. + upper left of the oval's bounding box. + width of the oval's bounding box. + height of the oval's bounding box. + + +

Draw a single boundary commit (aka uninteresting commit) dot. + + Draw a single boundary commit (aka uninteresting commit) dot. +

+ Usually a boundary commit dot is a light gray oval with a white center. + + upper left of the oval's bounding box. + upper left of the oval's bounding box. + width of the oval's bounding box. + height of the oval's bounding box. + + +

Draw a single line of text. + + Draw a single line of text. +

+ The font and colors used to render the text are left up to the + implementation. + + the text to draw. Does not contain LFs. + + first pixel from the left that the text can be drawn at. + Character data must not appear before this position. + + + pixel coordinate of the centerline of the text. + Implementations must adjust this coordinate to account for the + way their implementation handles font rendering. + + + +

A commit reference to a commit in the DAG. + A commit reference to a commit in the DAG. + PlotCommitList<L> +
+ + A commit reference to a commit in the DAG. + A commit reference to a commit in the DAG. + + + Base object type accessed during revision walking. + Base object type accessed during revision walking. + + + + Type of entry stored in the + ObjectIdOwnerMap<V> + . + + + + + Type of entry stored in the + ObjectIdOwnerMap<V> + . + + + + Initialize this entry with a specific ObjectId. + Initialize this entry with a specific ObjectId. + the id the entry represents. + + + + + + + + + + + + + Test to see if the flag has been set on this object. + Test to see if the flag has been set on this object. + the flag to test. + true if the flag has been added to this object; false if not. + + + Test to see if any flag in the set has been set on this object. + Test to see if any flag in the set has been set on this object. + the flags to test. + + true if any flag in the set has been added to this object; false + if not. + + + + Test to see if all flags in the set have been set on this object. + Test to see if all flags in the set have been set on this object. + the flags to test. + + true if all flags of the set have been added to this object; + false if some or none have been added. + + + + Add a flag to this object. + + Add a flag to this object. +

+ If the flag is already set on this object then the method has no effect. + + the flag to mark on this object, for later testing. + + +

Add a set of flags to this object. + Add a set of flags to this object. + the set of flags to mark on this object, for later testing. +
+ + Remove a flag from this object. + + Remove a flag from this object. +

+ If the flag is not set on this object then the method has no effect. + + the flag to remove from this object. + + +

Remove a set of flags from this object. + Remove a set of flags from this object. + the flag to remove from this object. +
+ + buffer to append a debug description of core RevFlags onto. + + + Get Git object type. + + Get Git object type. See + NGit.Constants + . + + object type + + + Get the name of this object. + Get the name of this object. + unique hash of this object. + + + Parse a commit from its canonical format. + + Parse a commit from its canonical format. + This method constructs a temporary revision pool, parses the commit as + supplied, and returns it to the caller. Since the commit was built inside + of a private revision pool its parent pointers will be initialized, but + will not have their headers loaded. + Applications are discouraged from using this API. Callers usually need + more than one commit. Use + RevWalk.ParseCommit(NGit.AnyObjectId) + + to + obtain a RevCommit from an existing repository. + + the canonical formatted commit to be parsed. + + the parsed commit, in an isolated revision pool that is not + available to the caller. + + + + Parse a commit from its canonical format. + + Parse a commit from its canonical format. + This method inserts the commit directly into the caller supplied revision + pool, making it appear as though the commit exists in the repository, + even if it doesn't. The repository under the pool is not affected. + + + the revision pool to allocate the commit within. The commit's + tree and parent pointers will be obtained from this pool. + + the canonical formatted commit to be parsed. + + the parsed commit, in an isolated revision pool that is not + available to the caller. + + + + Create a new commit reference. + Create a new commit reference. + object name for the commit. + + + + + + + + + + + + + Carry a RevFlag set on this commit to its parents. + + Carry a RevFlag set on this commit to its parents. +

+ If this commit is parsed, has parents, and has the supplied flag set on + it we automatically add it to the parents, grand-parents, and so on until + an unparsed commit or a commit with no parents is discovered. This + permits applications to force a flag through the history chain when + necessary. + + the single flag value to carry back onto parents. + + +

Get the nth parent from this commit's parent list. + Get the nth parent from this commit's parent list. + + parent index to obtain. Must be in the range 0 through + ParentCount() + -1. + + the specified parent. + an invalid parent index was specified. + +
+ + Parse the author identity from the raw buffer. + + Parse the author identity from the raw buffer. +

+ This method parses and returns the content of the author line, after + taking the commit's character set into account and decoding the author + name and email address. This method is fairly expensive and produces a + new PersonIdent instance on each invocation. Callers should invoke this + method only if they are certain they will be outputting the result, and + should cache the return value for as long as necessary to use all + information from it. +

+ RevFilter implementations should try to use + NGit.Util.RawParseUtils + to scan + the + RawBuffer() + instead, as this will allow faster evaluation + of commits. + + + identity of the author (name, email) and the time the commit was + made by the author; null if no author line was found. + + + +

Parse the committer identity from the raw buffer. + + Parse the committer identity from the raw buffer. +

+ This method parses and returns the content of the committer line, after + taking the commit's character set into account and decoding the committer + name and email address. This method is fairly expensive and produces a + new PersonIdent instance on each invocation. Callers should invoke this + method only if they are certain they will be outputting the result, and + should cache the return value for as long as necessary to use all + information from it. +

+ RevFilter implementations should try to use + NGit.Util.RawParseUtils + to scan + the + RawBuffer() + instead, as this will allow faster evaluation + of commits. + + + identity of the committer (name, email) and the time the commit + was made by the committer; null if no committer line was found. + + + +

Parse the complete commit message and decode it to a string. + + Parse the complete commit message and decode it to a string. +

+ This method parses and returns the message portion of the commit buffer, + after taking the commit's character set into account and decoding the + buffer using that character set. This method is a fairly expensive + operation and produces a new string on each invocation. + + decoded commit message as a string. Never null. + + +

Parse the commit message and return the first "line" of it. + + Parse the commit message and return the first "line" of it. +

+ The first line is everything up to the first pair of LFs. This is the + "oneline" format, suitable for output in a single line display. +

+ This method parses and returns the message portion of the commit buffer, + after taking the commit's character set into account and decoding the + buffer using that character set. This method is a fairly expensive + operation and produces a new string on each invocation. + + + decoded commit message as a string. Never null. The returned + string does not contain any LFs, even if the first paragraph + spanned multiple lines. Embedded LFs are converted to spaces. + + + +

Parse the footer lines (e.g. + + Parse the footer lines (e.g. "Signed-off-by") for machine processing. +

+ This method splits all of the footer lines out of the last paragraph of + the commit message, providing each line as a key-value pair, ordered by + the order of the line's appearance in the commit message itself. +

+ A footer line's key must match the pattern + ^[A-Za-z0-9-]+: + , while + the value is free-form, but must not contain an LF. Very common keys seen + in the wild are: +

    +
  • + Signed-off-by + (agrees to Developer Certificate of Origin)
  • +
  • + Acked-by + (thinks change looks sane in context)
  • +
  • + Reported-by + (originally found the issue this change fixes)
  • +
  • + Tested-by + (validated change fixes the issue for them)
  • +
  • + CC + , + Cc + (copy on all email related to this change)
  • +
  • + Bug + (link to project's bug tracking system)
  • +
+
+ ordered list of footer lines; empty list if no footers found. +
+ + Get the values of all footer lines with the given key. + Get the values of all footer lines with the given key. + footer key to find values of, case insensitive. + + values of footers with key of + keyName + , ordered by their + order of appearance. Duplicates may be returned if the same + footer appeared more than once. Empty list if no footers appear + with the specified key, or there are no footers at all. + + GetFooterLines() + + + Get the values of all footer lines with the given key. + Get the values of all footer lines with the given key. + footer key to find values of, case insensitive. + + values of footers with key of + keyName + , ordered by their + order of appearance. Duplicates may be returned if the same + footer appeared more than once. Empty list if no footers appear + with the specified key, or there are no footers at all. + + GetFooterLines() + + + Reset this commit to allow another RevWalk with the same instances. + + Reset this commit to allow another RevWalk with the same instances. +

+ Subclasses must call super.reset() to ensure the + basic information can be correctly cleared out. + + + +

Time from the "committer " line of the buffer. + Time from the "committer " line of the buffer. + time, expressed as seconds since the epoch. +
+ + Get a reference to this commit's tree. + Get a reference to this commit's tree. + tree of this commit. + + + Get the number of parent commits listed in this commit. + Get the number of parent commits listed in this commit. + number of parents; always a positive value but can be 0. + + + Obtain an array of all parents (NOTE - THIS IS NOT A COPY). + + Obtain an array of all parents (NOTE - THIS IS NOT A COPY). +

+ This method is exposed only to provide very fast, efficient access to + this commit's parent list. Applications relying on this list should be + very careful to ensure they do not modify its contents during their use + of it. + + the array of parents. + + +

Obtain the raw unparsed commit body (NOTE - THIS IS NOT A COPY). + + Obtain the raw unparsed commit body (NOTE - THIS IS NOT A COPY). +

+ This method is exposed only to provide very fast, efficient access to + this commit's message buffer within a RevFilter. Applications relying on + this buffer should be very careful to ensure they do not modify its + contents during their use of it. + + + the raw unparsed commit body. This is NOT A COPY. + Altering the contents of this buffer may alter the walker's + knowledge of this commit, and the results it produces. + + + +

Determine the encoding of the commit message buffer. + + Determine the encoding of the commit message buffer. +

+ Locates the "encoding" header (if present) and then returns the proper + character set to apply to this buffer to evaluate its contents as + character data. +

+ If no encoding header is present, + NGit.Constants.CHARSET + is assumed. + + + the preferred encoding of + RawBuffer() + . + + + +

Create a new commit. + Create a new commit. + the identity of this commit. +
+ + Get the number of child commits listed in this commit. + Get the number of child commits listed in this commit. + number of children; always a positive value but can be 0. + + + Get the nth child from this commit's child list. + Get the nth child from this commit's child list. + + child index to obtain. Must be in the range 0 through + PlotCommit<L>.GetChildCount() + -1. + + the specified child. + an invalid child index was specified. + + + + Determine if the given commit is a child (descendant) of this commit. + Determine if the given commit is a child (descendant) of this commit. + the commit to test. + true if the given commit built on top of this commit. + + + Get the number of refs for this commit. + Get the number of refs for this commit. + number of refs; always a positive value but can be 0. + + + Get the nth Ref from this commit's ref list. + Get the nth Ref from this commit's ref list. + + ref index to obtain. Must be in the range 0 through + PlotCommit<L>.GetRefCount() + -1. + + the specified ref. + an invalid ref index was specified. + + + + Obtain the lane this commit has been plotted into. + Obtain the lane this commit has been plotted into. + the assigned lane for this commit. + + + + An ordered list of + PlotCommit<L> + subclasses. +

+ Commits are allocated into lanes as they enter the list, based upon their + connections between descendant (child) commits and ancestor (parent) commits. +

+ The source of the list must be a + PlotWalk + and + NGit.Revwalk.RevCommitList<E>.FillTo(int) + + must be used to populate the list. +

+
+ + + An ordered list of + RevCommit + subclasses. + + + + + An ordered list of + RevObject + subclasses. + + + + Items stored in this list. + + Items stored in this list. +

+ If + RevObjectListBlock.shift + = 0 this block holds the list elements; otherwise + it holds pointers to other + RevObjectListBlock + instances which use a shift that + is + RevObjectList<E>.BLOCK_SHIFT + smaller. + + + +

Current number of elements in the list. + Current number of elements in the list. +
+ + Create an empty object list. + Create an empty object list. + + + Apply a flag to all commits matching the specified filter. + + Apply a flag to all commits matching the specified filter. +

+ Same as applyFlag(matching, flag, 0, size()), but without + the incremental behavior. + + + the filter to test commits with. If the filter includes a + commit it will have the flag set; if the filter does not + include the commit the flag will be unset. + + + the flag to apply (or remove). Applications are responsible + for allocating this flag from the source RevWalk. + + + revision filter needed to read additional objects, but an + error occurred while reading the pack files or loose objects + of the repository. + + + revision filter needed to read additional objects, but an + object was not of the correct type. Repository corruption may + have occurred. + + + revision filter needed to read additional objects, but an + object that should be present was not found. Repository + corruption may have occurred. + + + +

Apply a flag to all commits matching the specified filter. + + Apply a flag to all commits matching the specified filter. +

+ This version allows incremental testing and application, such as from a + background thread that needs to periodically halt processing and send + updates to the UI. + + + the filter to test commits with. If the filter includes a + commit it will have the flag set; if the filter does not + include the commit the flag will be unset. + + + the flag to apply (or remove). Applications are responsible + for allocating this flag from the source RevWalk. + + + first commit within the list to begin testing at, inclusive. + Must not be negative, but may be beyond the end of the list. + + + last commit within the list to end testing at, exclusive. If + smaller than or equal to rangeBegin then no + commits will be tested. + + + revision filter needed to read additional objects, but an + error occurred while reading the pack files or loose objects + of the repository. + + + revision filter needed to read additional objects, but an + object was not of the correct type. Repository corruption may + have occurred. + + + revision filter needed to read additional objects, but an + object that should be present was not found. Repository + corruption may have occurred. + + + +

Remove the given flag from all commits. + + Remove the given flag from all commits. +

+ Same as clearFlag(flag, 0, size()), but without the + incremental behavior. + + + the flag to remove. Applications are responsible for + allocating this flag from the source RevWalk. + + + +

Remove the given flag from all commits. + + Remove the given flag from all commits. +

+ This method is actually implemented in terms of: + applyFlag(RevFilter.NONE, flag, rangeBegin, rangeEnd). + + + the flag to remove. Applications are responsible for + allocating this flag from the source RevWalk. + + + first commit within the list to begin testing at, inclusive. + Must not be negative, but may be beyond the end of the list. + + + last commit within the list to end testing at, exclusive. If + smaller than or equal to rangeBegin then no + commits will be tested. + + + +

Find the next commit that has the given flag set. + Find the next commit that has the given flag set. + the flag to test commits against. + + first commit index to test at. Applications may wish to begin + at 0, to test the first commit in the list. + + + index of the first commit at or after index begin + that has the specified flag set on it; -1 if no match is found. + +
+ + Find the next commit that has the given flag set. + Find the next commit that has the given flag set. + the flag to test commits against. + + first commit index to test at. Applications may wish to begin + at size()-1, to test the last commit in the + list. + + + index of the first commit at or before index begin + that has the specified flag set on it; -1 if no match is found. + + + + Set the revision walker this list populates itself from. + Set the revision walker this list populates itself from. + the walker to populate from. + RevCommitList<E>.FillTo(int) + + + Is this list still pending more items? + + true if + RevCommitList<E>.FillTo(int) + might be able to extend the list + size when called. + + + + Ensure this list contains at least a specified number of commits. + + Ensure this list contains at least a specified number of commits. +

+ The revision walker specified by + RevCommitList<E>.Source(RevWalk) + + is pumped until + the given number of commits are contained in this list. If there are + fewer total commits available from the walk then the method will return + early. Callers can test the final size of the list by + RevObjectList<E>.Count() + to + determine if the high water mark specified was met. + + + number of commits the caller wants this list to contain when + the fill operation is complete. + + + see + RevWalk.Next() + + + see + RevWalk.Next() + + + see + RevWalk.Next() + + + +

Ensures all commits until the given commit are loaded. + + Ensures all commits until the given commit are loaded. The revision + walker specified by + RevCommitList<E>.Source(RevWalk) + + is pumped until the + specified commit is loaded. Callers can test the final size of the list + by + RevObjectList<E>.Count() + to determine if the high water mark specified was met. +

+ + + commit the caller wants this list to contain when the fill + operation is complete. + + + maximum number of commits the caller wants this list to + contain when the fill operation is complete. If highMark is 0 + the walk is pumped until the specified commit or the end of + the walk is reached. + + + see + RevWalk.Next() + + + see + RevWalk.Next() + + + see + RevWalk.Next() + + + +

Optional callback invoked when commits enter the list by fillTo. + + Optional callback invoked when commits enter the list by fillTo. +

+ This method is only called during + RevCommitList<E>.FillTo(int) + . + + the list position this object will appear at. + the object being added (or set) into the list. + + +

Find the set of lanes passing through a commit's row. + + Find the set of lanes passing through a commit's row. +

+ Lanes passing through a commit are lanes that the commit is not directly + on, but that need to travel through this commit to connect a descendant + (child) commit to an ancestor (parent) commit. Typically these lanes will + be drawn as lines in the passed commit's box, and the passed commit won't + appear to be connected to those lines. +

+ This method modifies the passed collection by adding the lanes in any + order. + + the commit the caller needs to get the lanes from. + collection to add the passing lanes into. + + +

+ when connecting a plotcommit to the child make sure that you will not be + located on a lane on which a passed commit is located on. + + + when connecting a plotcommit to the child make sure that you will not be + located on a lane on which a passed commit is located on. Otherwise we + would have to draw a line through a commit. + + + + +
+ + a new Lane appropriate for this particular PlotList. + + + + Return colors and other reusable information to the plotter when a lane + is no longer needed. + + + Return colors and other reusable information to the plotter when a lane + is no longer needed. + + + + + A line space within the graph. + + A line space within the graph. +

+ Commits are strung onto a lane. For many UIs a lane represents a column. + + + +

Logical location of this lane within the graphing plane. + Logical location of this lane within the graphing plane. + location of this lane, 0 through the maximum number of lanes. +
+ + Specialized RevWalk for visualization of a commit graph. + Specialized RevWalk for visualization of a commit graph. + + + Walks a commit graph and produces the matching commits in order. + + Walks a commit graph and produces the matching commits in order. +

+ A RevWalk instance can only be used once to generate results. Running a + second time requires creating a new RevWalk instance, or invoking + Reset() + before starting again. Resetting an existing instance may be + faster for some applications as commit body parsing can be avoided on the + later invocations. +

+ RevWalk instances are not thread-safe. Applications must either restrict + usage of a RevWalk instance to a single thread, or implement their own + synchronization at a higher level. +

+ Multiple simultaneous RevWalk instances per + NGit.Repository + are permitted, + even from concurrent threads. Equality of + RevCommit + s from two + different RevWalk instances is never true, even if their + NGit.ObjectId + s + are equal (and thus they describe the same commit). +

+ The offered iterator is over the list of RevCommits described by the + configuration of this instance. Applications should restrict themselves to + using either the provided Iterator or + Next() + , but never use both on + the same RevWalk at the same time. The Iterator may buffer RevCommits, while + Next() + does not. + + + +

Set on objects whose important header data has been loaded. + + Set on objects whose important header data has been loaded. +

+ For a RevCommit this indicates we have pulled apart the tree and parent + references from the raw bytes available in the repository and translated + those to our own local RevTree and RevCommit instances. The raw buffer is + also available for message and other header filtering. +

+ For a RevTag this indicates we have pulled part the tag references to + find out who the tag refers to, and what that object's type is. + + + +

+ Set on RevCommit instances added to our + pending + queue. +

+ We use this flag to avoid adding the same commit instance twice to our + queue, especially if we reached it by more than one path. +

+
+ + Set on RevCommit instances the caller does not want output. + + Set on RevCommit instances the caller does not want output. +

+ We flag commits as uninteresting if the caller does not want commits + reachable from a commit given to + MarkUninteresting(RevCommit) + . + This flag is always carried into the commit's parents and is a key part + of the "rev-list B --not A" feature; A is marked UNINTERESTING. + + + +

Set on a RevCommit that can collapse out of the history. + + Set on a RevCommit that can collapse out of the history. +

+ If the + treeFilter + concluded that this commit matches his + parents' for all of the paths that the filter is interested in then we + mark the commit REWRITE. Later we can rewrite the parents of a REWRITE + child to remove chains of REWRITE commits before we produce the child to + the application. + + RewriteGenerator + + +

Temporary mark for use within generators or filters. + + Temporary mark for use within generators or filters. +

+ This mark is only for local use within a single scope. If someone sets + the mark they must unset it before any other code can see the mark. + + + +

+ Temporary mark for use within + TopoSortGenerator + . +

+ This mark indicates the commit could not produce when it wanted to, as at + least one child was behind it. Commits with this flag are delayed until + all children have been output first. +

+
+ + Number of flag bits we keep internal for our own use. + Number of flag bits we keep internal for our own use. See above flags. + + + Exists ONLY to support legacy Tag and Commit objects. + Exists ONLY to support legacy Tag and Commit objects. + + + Create a new revision walker for a given repository. + Create a new revision walker for a given repository. + + the repository the walker will obtain data from. An + ObjectReader will be created by the walker, and must be + released by the caller. + + + + Create a new revision walker for a given repository. + Create a new revision walker for a given repository. + + the reader the walker will obtain data from. The reader should + be released by the caller when the walker is no longer + required. + + + + the reader this walker is using to load objects. + + + Release any resources used by this walker's reader. + + Release any resources used by this walker's reader. +

+ A walker that has been released can be used again, but may need to be + released after the subsequent usage. + + + +

Mark a commit to start graph traversal from. + + Mark a commit to start graph traversal from. +

+ Callers are encouraged to use + ParseCommit(NGit.AnyObjectId) + to obtain + the commit reference, rather than + LookupCommit(NGit.AnyObjectId) + , as + this method requires the commit to be parsed before it can be added as a + root for the traversal. +

+ The method will automatically parse an unparsed commit, but error + handling may be more difficult for the application to explain why a + RevCommit is not actually a commit. The object pool of this walker would + also be 'poisoned' by the non-commit RevCommit. + + + the commit to start traversing from. The commit passed must be + from this same revision walker. + + + the commit supplied is not available from the object + database. This usually indicates the supplied commit is + invalid, but the reference was constructed during an earlier + invocation to + LookupCommit(NGit.AnyObjectId) + . + + + the object was not parsed yet and it was discovered during + parsing that it is not actually a commit. This usually + indicates the caller supplied a non-commit SHA-1 to + LookupCommit(NGit.AnyObjectId) + . + + a pack file or loose object could not be read. + + + +

Mark commits to start graph traversal from. + Mark commits to start graph traversal from. + + commits to start traversing from. The commits passed must be + from this same revision walker. + + + one of the commits supplied is not available from the object + database. This usually indicates the supplied commit is + invalid, but the reference was constructed during an earlier + invocation to + LookupCommit(NGit.AnyObjectId) + . + + + the object was not parsed yet and it was discovered during + parsing that it is not actually a commit. This usually + indicates the caller supplied a non-commit SHA-1 to + LookupCommit(NGit.AnyObjectId) + . + + a pack file or loose object could not be read. + +
+ + Mark a commit to not produce in the output. + + Mark a commit to not produce in the output. +

+ Uninteresting commits denote not just themselves but also their entire + ancestry chain, back until the merge base of an uninteresting commit and + an otherwise interesting commit. +

+ Callers are encouraged to use + ParseCommit(NGit.AnyObjectId) + to obtain + the commit reference, rather than + LookupCommit(NGit.AnyObjectId) + , as + this method requires the commit to be parsed before it can be added as a + root for the traversal. +

+ The method will automatically parse an unparsed commit, but error + handling may be more difficult for the application to explain why a + RevCommit is not actually a commit. The object pool of this walker would + also be 'poisoned' by the non-commit RevCommit. + + + the commit to start traversing from. The commit passed must be + from this same revision walker. + + + the commit supplied is not available from the object + database. This usually indicates the supplied commit is + invalid, but the reference was constructed during an earlier + invocation to + LookupCommit(NGit.AnyObjectId) + . + + + the object was not parsed yet and it was discovered during + parsing that it is not actually a commit. This usually + indicates the caller supplied a non-commit SHA-1 to + LookupCommit(NGit.AnyObjectId) + . + + a pack file or loose object could not be read. + + + +

Determine if a commit is reachable from another commit. + + Determine if a commit is reachable from another commit. +

+ A commit base is an ancestor of tip if we + can find a path of commits that leads from tip and ends at + base. +

+ This utility function resets the walker, inserts the two supplied + commits, and then executes a walk until an answer can be obtained. + Currently allocated RevFlags that have been added to RevCommit instances + will be retained through the reset. + + commit the caller thinks is reachable from tip. + + commit to start iteration from, and which is most likely a + descendant (child) of base. + + + true if there is a path directly from tip to + base (and thus base is fully merged + into tip); false otherwise. + + + one or or more of the next commit's parents are not available + from the object database, but were thought to be candidates + for traversal. This usually indicates a broken link. + + + one or or more of the next commit's parents are not actually + commit objects. + + a pack file or loose object could not be read. + + + +

Pop the next most recent commit. + Pop the next most recent commit. + next most recent commit; null if traversal is over. + + one or or more of the next commit's parents are not available + from the object database, but were thought to be candidates + for traversal. This usually indicates a broken link. + + + one or or more of the next commit's parents are not actually + commit objects. + + a pack file or loose object could not be read. + +
+ + Obtain the sort types applied to the commits returned. + Obtain the sort types applied to the commits returned. + + the sorting strategies employed. At least one strategy is always + used, but that strategy may be + RevSort.NONE + . + + + + Check whether the provided sorting strategy is enabled. + Check whether the provided sorting strategy is enabled. + a sorting strategy to look for. + true if this strategy is enabled, false otherwise + + + Select a single sorting strategy for the returned commits. + + Select a single sorting strategy for the returned commits. +

+ Disables all sorting strategies, then enables only the single strategy + supplied by the caller. + + a sorting strategy to enable. + + +

Add or remove a sorting strategy for the returned commits. + + Add or remove a sorting strategy for the returned commits. +

+ Multiple strategies can be applied at once, in which case some strategies + may take precedence over others. As an example, + RevSort.TOPO + must + take precedence over + RevSort.COMMIT_TIME_DESC + , otherwise it + cannot enforce its ordering. + + a sorting strategy to enable or disable. + + true if this strategy should be used, false if it should be + removed. + + + +

Get the currently configured commit filter. + Get the currently configured commit filter. + the current filter. Never null as a filter is always needed. +
+ + Set the commit filter for this walker. + + Set the commit filter for this walker. +

+ Multiple filters may be combined by constructing an arbitrary tree of + AndRevFilter or OrRevFilter instances to + describe the boolean expression required by the application. Custom + filter implementations may also be constructed by applications. +

+ Note that filters are not thread-safe and may not be shared by concurrent + RevWalk instances. Every RevWalk must be supplied its own unique filter, + unless the filter implementation specifically states it is (and always + will be) thread-safe. Callers may use + NGit.Revwalk.Filter.RevFilter.Clone() + + to create + a unique filter tree for this RevWalk instance. + + + the new filter. If null the special + NGit.Revwalk.Filter.RevFilter.ALL + filter will be used instead, as it matches every commit. + + NGit.Revwalk.Filter.AndRevFilter + + NGit.Revwalk.Filter.OrRevFilter + + +

Get the tree filter used to simplify commits by modified paths. + Get the tree filter used to simplify commits by modified paths. + + the current filter. Never null as a filter is always needed. If + no filter is being applied + NGit.Treewalk.Filter.TreeFilter.ALL + + is returned. + +
+ + Set the tree filter used to simplify commits by modified paths. + + Set the tree filter used to simplify commits by modified paths. +

+ If null or + NGit.Treewalk.Filter.TreeFilter.ALL + + the path limiter is removed. Commits + will not be simplified. +

+ If non-null and not + NGit.Treewalk.Filter.TreeFilter.ALL + + then the tree filter will be + installed and commits will have their ancestry simplified to hide commits + that do not contain tree entries matched by the filter. +

+ Usually callers should be inserting a filter graph including + NGit.Treewalk.Filter.TreeFilter.ANY_DIFF + + along with one or more + NGit.Treewalk.Filter.PathFilter + instances. + + + new filter. If null the special + NGit.Treewalk.Filter.TreeFilter.ALL + + filter + will be used instead, as it matches everything. + + NGit.Treewalk.Filter.PathFilter + + +

+ Should the body of a commit or tag be retained after parsing its headers? +

+ Usually the body is always retained, but some application code might not + care and would prefer to discard the body of a commit as early as + possible, to reduce memory usage. +

+ + Should the body of a commit or tag be retained after parsing its headers? +

+ Usually the body is always retained, but some application code might not + care and would prefer to discard the body of a commit as early as + possible, to reduce memory usage. + + true if the body should be retained; false it is discarded. + + +

Set whether or not the body of a commit or tag is retained. + + Set whether or not the body of a commit or tag is retained. +

+ If a body of a commit or tag is not retained, the application must + call + ParseBody(RevObject) + before the body can be safely + accessed through the type specific access methods. + + true to retain bodies; false to discard them early. + + +

Locate a reference to a blob without loading it. + + Locate a reference to a blob without loading it. +

+ The blob may or may not exist in the repository. It is impossible to tell + from this method's return value. + + name of the blob object. + reference to the blob object. Never null. + + +

Locate a reference to a tree without loading it. + + Locate a reference to a tree without loading it. +

+ The tree may or may not exist in the repository. It is impossible to tell + from this method's return value. + + name of the tree object. + reference to the tree object. Never null. + + +

Locate a reference to a commit without loading it. + + Locate a reference to a commit without loading it. +

+ The commit may or may not exist in the repository. It is impossible to + tell from this method's return value. +

+ See + ParseHeaders(RevObject) + and + ParseBody(RevObject) + for loading contents. + + name of the commit object. + reference to the commit object. Never null. + + +

Locate a reference to a tag without loading it. + + Locate a reference to a tag without loading it. +

+ The tag may or may not exist in the repository. It is impossible to tell + from this method's return value. + + name of the tag object. + reference to the tag object. Never null. + + +

Locate a reference to any object without loading it. + + Locate a reference to any object without loading it. +

+ The object may or may not exist in the repository. It is impossible to + tell from this method's return value. + + name of the object. + type of the object. Must be a valid Git object type. + reference to the object. Never null. + + +

Locate an object that was previously allocated in this walk. + Locate an object that was previously allocated in this walk. + name of the object. + + reference to the object if it has been previously located; + otherwise null. + +
+ + Locate a reference to a commit and immediately parse its content. + + Locate a reference to a commit and immediately parse its content. +

+ Unlike + LookupCommit(NGit.AnyObjectId) + this method only returns + successfully if the commit object exists, is verified to be a commit, and + was parsed without error. + + name of the commit object. + reference to the commit object. Never null. + the supplied commit does not exist. + + the supplied id is not a commit or an annotated tag. + + a pack file or loose object could not be read. + + + +

Locate a reference to a tree. + + Locate a reference to a tree. +

+ This method only returns successfully if the tree object exists, is + verified to be a tree. + + + name of the tree object, or a commit or annotated tag that may + reference a tree. + + reference to the tree object. Never null. + the supplied tree does not exist. + + the supplied id is not a tree, a commit or an annotated tag. + + a pack file or loose object could not be read. + + + +

Locate a reference to an annotated tag and immediately parse its content. + + + Locate a reference to an annotated tag and immediately parse its content. +

+ Unlike + LookupTag(NGit.AnyObjectId) + this method only returns + successfully if the tag object exists, is verified to be a tag, and was + parsed without error. + + name of the tag object. + reference to the tag object. Never null. + the supplied tag does not exist. + + the supplied id is not a tag or an annotated tag. + + a pack file or loose object could not be read. + + + +

Locate a reference to any object and immediately parse its headers. + + Locate a reference to any object and immediately parse its headers. +

+ This method only returns successfully if the object exists and was parsed + without error. Parsing an object can be expensive as the type must be + determined. For blobs this may mean the blob content was unpacked + unnecessarily, and thrown away. + + name of the object. + reference to the object. Never null. + the supplied does not exist. + + a pack file or loose object could not be read. + + + + + + + + + + + + + + + + + + + + +

Asynchronous object parsing. + Asynchronous object parsing. + + objects to open from the object store. The supplied collection + must not be modified until the queue has finished. + + + if true missing objects are reported by calling failure with a + MissingObjectException. This may be more expensive for the + implementation to guarantee. If false the implementation may + choose to report MissingObjectException, or silently skip over + the object with no warning. + + queue to read the objects from. +
+ + Ensure the object's critical headers have been parsed. + + Ensure the object's critical headers have been parsed. +

+ This method only returns successfully if the object exists and was parsed + without error. + + the object the caller needs to be parsed. + the supplied does not exist. + + a pack file or loose object could not be read. + + + +

Ensure the object's full body content is available. + + Ensure the object's full body content is available. +

+ This method only returns successfully if the object exists and was parsed + without error. + + the object the caller needs to be parsed. + the supplied does not exist. + + a pack file or loose object could not be read. + + + +

Peel back annotated tags until a non-tag object is found. + Peel back annotated tags until a non-tag object is found. + the starting object. + + If + obj + is not an annotated tag, + obj + . Otherwise + the first non-tag object that + obj + references. The + returned object's headers have been parsed. + + a referenced object cannot be found. + + a pack file or loose object could not be read. + +
+ + Create a new flag for application use during walking. + + Create a new flag for application use during walking. +

+ Applications are only assured to be able to create 24 unique flags on any + given revision walker instance. Any flags beyond 24 are offered only if + the implementation has extra free space within its internal storage. + + description of the flag, primarily useful for debugging. + newly constructed flag instance. + too many flags have been reserved on this revision walker. + + + +

Automatically carry a flag from a child commit to its parents. + + Automatically carry a flag from a child commit to its parents. +

+ A carried flag is copied from the child commit onto its parents when the + child commit is popped from the lowest level of walk's internal graph. + + the flag to carry onto parents, if set on a descendant. + + +

Automatically carry flags from a child commit to its parents. + + Automatically carry flags from a child commit to its parents. +

+ A carried flag is copied from the child commit onto its parents when the + child commit is popped from the lowest level of walk's internal graph. + + the flags to carry onto parents, if set on a descendant. + + +

Allow a flag to be recycled for a different use. + + Allow a flag to be recycled for a different use. +

+ Recycled flags always come back as a different Java object instance when + assigned again by + NewFlag(string) + . +

+ If the flag was previously being carried, the carrying request is + removed. Disposing of a carried flag while a traversal is in progress has + an undefined behavior. + + the to recycle. + + +

Resets internal state and allows this instance to be used again. + + Resets internal state and allows this instance to be used again. +

+ Unlike + Dispose() + previously acquired RevObject (and RevCommit) + instances are not invalidated. RevFlag instances are not invalidated, but + are removed from all RevObjects. + + + +

Resets internal state and allows this instance to be used again. + + Resets internal state and allows this instance to be used again. +

+ Unlike + Dispose() + previously acquired RevObject (and RevCommit) + instances are not invalidated. RevFlag instances are not invalidated, but + are removed from all RevObjects. + + + application flags that should not be cleared from + existing commit objects. + + + +

Resets internal state and allows this instance to be used again. + + Resets internal state and allows this instance to be used again. +

+ Unlike + Dispose() + previously acquired RevObject (and RevCommit) + instances are not invalidated. RevFlag instances are not invalidated, but + are removed from all RevObjects. + + + application flags that should not be cleared from + existing commit objects. + + + +

Resets internal state and allows this instance to be used again. + + Resets internal state and allows this instance to be used again. +

+ Unlike + Dispose() + previously acquired RevObject (and RevCommit) + instances are not invalidated. RevFlag instances are not invalidated, but + are removed from all RevObjects. + + + application flags that should not be cleared from + existing commit objects. + + + +

Dispose all internal state and invalidate all RevObject instances. + + Dispose all internal state and invalidate all RevObject instances. +

+ All RevObject (and thus RevCommit, etc.) instances previously acquired + from this RevWalk are invalidated by a dispose call. Applications must + not retain or use RevObject instances obtained prior to the dispose call. + All RevFlag instances are also invalidated, and must not be reused. + + + +

Returns an Iterator over the commits of this walker. + + Returns an Iterator over the commits of this walker. +

+ The returned iterator is only useful for one walk. If this RevWalk gets + reset a new iterator must be obtained to walk over the new results. +

+ Applications must not use both the Iterator and the + Next() + API + at the same time. Pick one API and use that for the entire walk. +

+ If a checked exception is thrown during the walk (see + Next() + ) + it is rethrown from the Iterator as a + NGit.Errors.RevWalkException + . + + an iterator over this walker's commits. + NGit.Errors.RevWalkException + + +

Throws an exception if we have started producing output. + Throws an exception if we have started producing output. +
+ + + Create and return an + ObjectWalk + using the same objects. +

+ Prior to using this method, the caller must reset this RevWalk to clean + any flags that were used during the last traversal. +

+ The returned ObjectWalk uses the same ObjectReader, internal object pool, + and free RevFlags. Once the ObjectWalk is created, this RevWalk should + not be used anymore. +

+ a new walk, using the exact same object pool. +
+ + Construct a new unparsed commit for the given object. + Construct a new unparsed commit for the given object. + the object this walker requires a commit reference for. + a new unparsed reference for the object. + + + Queue to lookup and parse objects asynchronously. + + Queue to lookup and parse objects asynchronously. + A queue may perform background lookup of objects and supply them (possibly + out-of-order) to the application. + + + + Obtain the next object. + Obtain the next object. + the object; null if there are no more objects remaining. + + the object does not exist. There may be more objects + remaining in the iteration, the application should call + Next() + again. + + the object store cannot be accessed. + + + + + + + + Create a new revision walker for a given repository. + Create a new revision walker for a given repository. + the repository the walker will obtain data from. + + + Add additional refs to the walk + additional refs + System.IO.IOException + + + + + + + + Produces commits for RevWalk to return to applications. + + Produces commits for RevWalk to return to applications. +

+ Implementations of this basic class provide the real work behind RevWalk. + Conceptually a Generator is an iterator or a queue, it returns commits until + there are no more relevant. Generators may be piped/stacked together to + create a more complex set of operations. + + PendingGenerator + StartGenerator + + +

Commits are sorted by commit date and time, descending. + Commits are sorted by commit date and time, descending. +
+ + + Output may have + RevWalk.REWRITE + marked on it. + + + + + Output needs + RewriteGenerator + . + + + + Topological ordering is enforced (all children before parents). + Topological ordering is enforced (all children before parents). + + + + Output may have + RevWalk.UNINTERESTING + marked on it. + + + + Connect the supplied queue to this generator's own free list (if any). + Connect the supplied queue to this generator's own free list (if any). + another FIFO queue that wants to share our queue's free list. + + + Obtain flags describing the output behavior of this generator. + Obtain flags describing the output behavior of this generator. + + one or more of the constants declared in this class, describing + how this generator produces its results. + + + + Return the next commit to the application, or the next generator. + Return the next commit to the application, or the next generator. + next available commit; null if no more are to be returned. + NGit.Errors.MissingObjectException + + NGit.Errors.IncorrectObjectTypeException + + System.IO.IOException + + + Current output flags set for this generator instance. + Current output flags set for this generator instance. + + + Add a commit to the queue. + + Add a commit to the queue. +

+ This method always adds the commit, even if it is already in the queue or + previously was in the queue but has already been removed. To control + queue admission use + Add(RevCommit, RevFlag) + . + + commit to add. + + +

Add a commit if it does not have a flag set yet, then set the flag. + + Add a commit if it does not have a flag set yet, then set the flag. +

+ This method permits the application to test if the commit has the given + flag; if it does not already have the flag than the commit is added to + the queue and the flag is set. This later will prevent the commit from + being added twice. + + commit to add. + flag that controls admission to the queue. + + +

Add a commit's parents if one does not have a flag set yet. + + Add a commit's parents if one does not have a flag set yet. +

+ This method permits the application to test if the commit has the given + flag; if it does not already have the flag than the commit is added to + the queue and the flag is set. This later will prevent the commit from + being added twice. + + commit whose parents should be added. + flag that controls admission to the queue. + + +

Remove the first commit from the queue. + Remove the first commit from the queue. + the first commit of this queue. +
+ + Remove all entries from this queue. + Remove all entries from this queue. + + + Create an empty queue. + Create an empty queue. + + + Next block in our chain of blocks; null if we are the last. + Next block in our chain of blocks; null if we are the last. + + + Our table of queued objects. + Our table of queued objects. + + + + Next valid entry in + objects + . + + + + + Next free entry in + objects + for addition at. + + + + Create an empty revision queue. + Create an empty revision queue. + + + + + + + + Reconfigure this queue to share the same free list as another. + + Reconfigure this queue to share the same free list as another. +

+ Multiple revision queues can be connected to the same free list, making + it less expensive for applications to shuttle commits between them. This + method arranges for the receiver to take from / return to the same free + list as the supplied queue. +

+ Free lists are not thread-safe. Applications must ensure that all queues + sharing the same free list are doing so from only a single thread. + + the other queue we will steal entries from. + + +

Next block in our chain of blocks; null if we are the last. + Next block in our chain of blocks; null if we are the last. +
+ + Our table of queued commits. + Our table of queued commits. + + + + Next valid entry in + commits + . + + + + + Next free entry in + commits + for addition at. + + + + + + + + + + + + + + A queue of commits sorted by commit time order. + A queue of commits sorted by commit time order. + + + Create an empty date queue. + Create an empty date queue. + + + + + + + + Peek at the next commit, without removing it. + Peek at the next commit, without removing it. + the next available commit; null if there are no commits left. + + + + Delays commits to be at least + PendingGenerator.OVER_SCAN + late. +

+ This helps to "fix up" weird corner cases resulting from clock skew, by + slowing down what we produce to the caller we get a better chance to ensure + PendingGenerator reached back far enough in the graph to correctly mark + commits + RevWalk.UNINTERESTING + if necessary. +

+ This generator should appear before + FixUninterestingGenerator + if the + lower level + pending + isn't already fully buffered. +

+
+ + + + + + + A queue of commits in FIFO order. + A queue of commits in FIFO order. + + + Create an empty FIFO queue. + Create an empty FIFO queue. + + + + + + + + Insert the commit pointer at the front of the queue. + Insert the commit pointer at the front of the queue. + the commit to insert into the queue. + + + + Filters out commits marked + RevWalk.UNINTERESTING + . +

+ This generator is only in front of another generator that has fully buffered + commits, such that we are called only after the + PendingGenerator + has + exhausted its input queue and given up. It skips over any uninteresting + commits that may have leaked out of the PendingGenerator due to clock skew + being detected in the commit objects. +

+
+ + + + + + + Updates the internal path filter to follow copy/renames. + + Updates the internal path filter to follow copy/renames. +

+ This is a special filter that performs + AND(path, ANY_DIFF) + , but also + triggers rename detection so that the path node is updated to include a prior + file name as the RevWalk traverses history. + The renames found will be reported to a + RenameCallback + if one is set. +

+ Results with this filter are unpredictable if the path being followed is a + subdirectory. + + + +

Create a new tree filter for a user supplied path. + + Create a new tree filter for a user supplied path. +

+ Path strings are relative to the root of the repository. If the user's + input should be assumed relative to a subdirectory of the repository the + caller must prepend the subdirectory's path prior to creating the filter. +

+ Path strings use '/' to delimit directories on all platforms. + + + the path to filter on. Must not be the empty string. All + trailing '/' characters will be trimmed before string's length + is checked or is used as part of the constructed filter. + + a new filter for the requested path. + the path supplied was the empty string. + + + + the path this filter matches. + + + + + + + + + the callback to which renames are reported, or null + if none + + + +

Sets the callback to which renames shall be reported. + Sets the callback to which renames shall be reported. + the callback to use +
+ + + Case insensitive key for a + FooterLine + . + + + + + Standard + Signed-off-by + + + + + + Standard + Acked-by + + + + + + Standard + CC + + + + + Create a key for a specific footer line. + Create a key for a specific footer line. + name of the footer line. + + + name of this footer line. + + + Single line at the end of a message, such as a "Signed-off-by: someone". + + + Single line at the end of a message, such as a "Signed-off-by: someone". +

+ These footer lines tend to be used to represent additional information about + a commit, like the path it followed through reviewers before finally being + accepted into the project's main repository as an immutable commit. + + RevCommit.GetFooterLines() + + + key to test this line's key name against. + + true if + key.getName().equalsIgnorecase(getKey()) + . + + + + + key name of this footer; that is the text before the ":" on the + line footer's line. The text is decoded according to the commit's + specified (or assumed) character encoding. + + + + + value of this footer; that is the text after the ":" and any + leading whitespace has been skipped. May be the empty string if + the footer has no value (line ended with ":"). The text is + decoded according to the commit's specified (or assumed) + character encoding. + + + +

Extract the email address (if present) from the footer. + + Extract the email address (if present) from the footer. +

+ If there is an email address looking string inside of angle brackets + (e.g. "<a@b>"), the return value is the part extracted from inside the + brackets. If no brackets are found, then + GetValue() + is returned + if the value contains an '@' sign. Otherwise, null. + + email address appearing in the value of this footer, or null. + + +

A queue of commits in LIFO order. + A queue of commits in LIFO order. +
+ + Create an empty LIFO queue. + Create an empty LIFO queue. + + + + + + + + Computes the merge base(s) of the starting commits. + + Computes the merge base(s) of the starting commits. +

+ This generator is selected if the RevFilter is only + NGit.Revwalk.Filter.RevFilter.MERGE_BASE + + . +

+ To compute the merge base we assign a temporary flag to each of the starting + commits. The maximum number of starting commits is bounded by the number of + free flags available in the RevWalk when the generator is initialized. These + flags will be automatically released on the next reset of the RevWalk, but + not until then, as they are assigned to commits throughout the history. +

+ Several internal flags are reused here for a different purpose, but this + should not have any impact as this generator should be run alone, and without + any other generators wrapped around it. + + + + + + + + +

Specialized subclass of RevWalk to include trees, blobs and tags. + + Specialized subclass of RevWalk to include trees, blobs and tags. +

+ Unlike RevWalk this subclass is able to remember starting roots that include + annotated tags, or arbitrary trees or blobs. Once commit generation is + complete and all commits have been popped by the application, individual + annotated tag, tree and blob objects can be popped through the additional + method + NextObject() + . +

+ Tree and blob objects reachable from interesting commits are automatically + scheduled for inclusion in the results of + NextObject() + , returning + each object exactly once. Objects are sorted and returned according to the + the commits that reference them and the order they appear within a tree. + Ordering can be affected by changing the + RevSort + used to order the + commits that are returned first. + + + +

+ Indicates a non-RevCommit is in + pendingObjects + . +

+ We can safely reuse + RevWalk.REWRITE + here for the same value as it + is only set on RevCommit and + pendingObjects + never has RevCommit + instances inserted into it. +

+
+ + Create a new revision and object walker for a given repository. + Create a new revision and object walker for a given repository. + the repository the walker will obtain data from. + + + Create a new revision and object walker for a given repository. + Create a new revision and object walker for a given repository. + + the reader the walker will obtain data from. The reader should + be released by the caller when the walker is no longer + required. + + + + Mark an object or commit to start graph traversal from. + + Mark an object or commit to start graph traversal from. +

+ Callers are encouraged to use + RevWalk.ParseAny(NGit.AnyObjectId) + + instead of + RevWalk.LookupAny(NGit.AnyObjectId, int) + + , as this method + requires the object to be parsed before it can be added as a root for the + traversal. +

+ The method will automatically parse an unparsed object, but error + handling may be more difficult for the application to explain why a + RevObject is not actually valid. The object pool of this walker would + also be 'poisoned' by the invalid RevObject. +

+ This method will automatically call + RevWalk.MarkStart(RevCommit) + if passed RevCommit instance, or a RevTag that directly (or indirectly) + references a RevCommit. + + + the object to start traversing from. The object passed must be + from this same revision walker. + + + the object supplied is not available from the object + database. This usually indicates the supplied object is + invalid, but the reference was constructed during an earlier + invocation to + RevWalk.LookupAny(NGit.AnyObjectId, int) + + . + + + the object was not parsed yet and it was discovered during + parsing that it is not actually the type of the instance + passed in. This usually indicates the caller used the wrong + type in a + RevWalk.LookupAny(NGit.AnyObjectId, int) + + call. + + a pack file or loose object could not be read. + + + +

Mark an object to not produce in the output. + + Mark an object to not produce in the output. +

+ Uninteresting objects denote not just themselves but also their entire + reachable chain, back until the merge base of an uninteresting commit and + an otherwise interesting commit. +

+ Callers are encouraged to use + RevWalk.ParseAny(NGit.AnyObjectId) + + instead of + RevWalk.LookupAny(NGit.AnyObjectId, int) + + , as this method + requires the object to be parsed before it can be added as a root for the + traversal. +

+ The method will automatically parse an unparsed object, but error + handling may be more difficult for the application to explain why a + RevObject is not actually valid. The object pool of this walker would + also be 'poisoned' by the invalid RevObject. +

+ This method will automatically call + RevWalk.MarkStart(RevCommit) + if passed RevCommit instance, or a RevTag that directly (or indirectly) + references a RevCommit. + + the object to start traversing from. The object passed must be + + the object supplied is not available from the object + database. This usually indicates the supplied object is + invalid, but the reference was constructed during an earlier + invocation to + RevWalk.LookupAny(NGit.AnyObjectId, int) + + . + + + the object was not parsed yet and it was discovered during + parsing that it is not actually the type of the instance + passed in. This usually indicates the caller used the wrong + type in a + RevWalk.LookupAny(NGit.AnyObjectId, int) + + call. + + a pack file or loose object could not be read. + + + + + + + + +

Pop the next most recent object. + Pop the next most recent object. + next most recent object; null if traversal is over. + + one or or more of the next objects are not available from the + object database, but were thought to be candidates for + traversal. This usually indicates a broken link. + + + one or or more of the objects in a tree do not match the type + indicated. + + a pack file or loose object could not be read. + +
+ + + + + + + Verify all interesting objects are available, and reachable. + + Verify all interesting objects are available, and reachable. +

+ Callers should populate starting points and ending points with + MarkStart(RevObject) + and + MarkUninteresting(RevObject) + and then use this method to verify all objects between those two points + exist in the repository and are readable. +

+ This method returns successfully if everything is connected; it throws an + exception if there is a connectivity problem. The exception message + provides some detail about the connectivity failure. + + + one or or more of the next objects are not available from the + object database, but were thought to be candidates for + traversal. This usually indicates a broken link. + + + one or or more of the objects in a tree do not match the type + indicated. + + a pack file or loose object could not be read. + + + +

Get the current object's complete path. + + Get the current object's complete path. +

+ This method is not very efficient and is primarily meant for debugging + and final output generation. Applications should try to avoid calling it, + and if invoked do so only once per interesting entry, where the name is + absolutely required for correct function. + + + complete path of the current entry, from the root of the + repository. If the current entry is in a subtree there will be at + least one '/' in the returned string. Null if the current entry + has no path, such as for annotated tags or root level trees. + + + +

Get the current object's path hash code. + + Get the current object's path hash code. +

+ This method computes a hash code on the fly for this path, the hash is + suitable to cluster objects that may have similar paths together. + + path hash code; any integer may be returned. + + + the internal buffer holding the current path. + + + + length of the path in + GetPathBuffer() + . + + + + + + + + + + + + + + +

Parent tree visit that entered this tree, null if root tree. + Parent tree visit that entered this tree, null if root tree. +
+ + The RevTree currently being iterated through. + The RevTree currently being iterated through. + + + + Canonical encoding of the tree named by + obj + . + + + + + Index of next entry to parse in + buf + . + + + + + Start of the current name entry in + buf + . + + + + + One past end of name, + nameEnd - namePtr + is the length. + + + + Number of bytes in the path leading up to this tree. + Number of bytes in the path leading up to this tree. + + + Default (and first pass) RevCommit Generator implementation for RevWalk. + + + Default (and first pass) RevCommit Generator implementation for RevWalk. +

+ This generator starts from a set of one or more commits and process them in + descending (newest to oldest) commit time order. Commits automatically cause + their parents to be enqueued for further processing, allowing the entire + commit graph to be walked. A + NGit.Revwalk.Filter.RevFilter + may be used to select a subset + of the commits and return them to the caller. + + + +

Number of additional commits to scan after we think we are done. + + Number of additional commits to scan after we think we are done. +

+ This small buffer of commits is scanned to ensure we didn't miss anything + as a result of clock skew when the commits were made. We need to set our + constant to 1 additional commit due to the use of a pre-increment + operator when accessing the value. + + + +

+ A commit near the end of time, to initialize + last + with. + +
+ + + Last commit produced to the caller from + Next() + . + + + + Number of commits we have remaining in our over-scan allotment. + + Number of commits we have remaining in our over-scan allotment. +

+ Only relevant if there are + UNINTERESTING + commits in the + pending + queue. + + + + + + + + +

A binary file, or a symbolic link. + A binary file, or a symbolic link. +
+ + Create a new blob reference. + Create a new blob reference. + object name for the blob. + + + + + + + + + + + + + + Application level mark bit for + RevObject + s. +

+ To create a flag use + RevWalk.NewFlag(string) + . +

+
+ + + Uninteresting by + RevWalk.MarkUninteresting(RevCommit) + + . +

+ We flag commits as uninteresting if the caller does not want commits + reachable from a commit to + RevWalk.MarkUninteresting(RevCommit) + + . + This flag is always carried into the commit's parents and is a key part + of the "rev-list B --not A" feature; A is marked UNINTERESTING. +

+ This is a static flag. Its RevWalk is not available. +

+
+ + Get the revision walk instance this flag was created from. + Get the revision walk instance this flag was created from. + the walker this flag was allocated out of, and belongs to. + + + + Multiple application level mark bits for + RevObject + s. + + RevFlag + + + Create an empty set of flags. + Create an empty set of flags. + + + Create a set of flags, copied from an existing set. + Create a set of flags, copied from an existing set. + the set to copy flags from. + + + Create a set of flags, copied from an existing collection. + Create a set of flags, copied from an existing collection. + the collection to copy flags from. + + + One level of contents, either an intermediate level or a leaf level. + One level of contents, either an intermediate level or a leaf level. + + + An annotated tag. + An annotated tag. + + + Parse an annotated tag from its canonical format. + + Parse an annotated tag from its canonical format. + This method constructs a temporary revision pool, parses the tag as + supplied, and returns it to the caller. Since the tag was built inside of + a private revision pool its object pointer will be initialized, but will + not have its headers loaded. + Applications are discouraged from using this API. Callers usually need + more than one object. Use + RevWalk.ParseTag(NGit.AnyObjectId) + + to obtain + a RevTag from an existing repository. + + the canonical formatted tag to be parsed. + + the parsed tag, in an isolated revision pool that is not + available to the caller. + + the tag contains a malformed header that cannot be handled. + + + + Parse an annotated tag from its canonical format. + + Parse an annotated tag from its canonical format. + This method inserts the tag directly into the caller supplied revision + pool, making it appear as though the tag exists in the repository, even + if it doesn't. The repository under the pool is not affected. + + + the revision pool to allocate the tag within. The tag's object + pointer will be obtained from this pool. + + the canonical formatted tag to be parsed. + + the parsed tag, in an isolated revision pool that is not + available to the caller. + + the tag contains a malformed header that cannot be handled. + + + + Create a new tag reference. + Create a new tag reference. + object name for the tag. + + + + + + + + + + + + + + + + Parse the tagger identity from the raw buffer. + + Parse the tagger identity from the raw buffer. +

+ This method parses and returns the content of the tagger line, after + taking the tag's character set into account and decoding the tagger + name and email address. This method is fairly expensive and produces a + new PersonIdent instance on each invocation. Callers should invoke this + method only if they are certain they will be outputting the result, and + should cache the return value for as long as necessary to use all + information from it. + + + identity of the tagger (name, email) and the time the tag + was made by the tagger; null if no tagger line was found. + + + +

Parse the complete tag message and decode it to a string. + + Parse the complete tag message and decode it to a string. +

+ This method parses and returns the message portion of the tag buffer, + after taking the tag's character set into account and decoding the buffer + using that character set. This method is a fairly expensive operation and + produces a new string on each invocation. + + decoded tag message as a string. Never null. + + +

Parse the tag message and return the first "line" of it. + + Parse the tag message and return the first "line" of it. +

+ The first line is everything up to the first pair of LFs. This is the + "oneline" format, suitable for output in a single line display. +

+ This method parses and returns the message portion of the tag buffer, + after taking the tag's character set into account and decoding the buffer + using that character set. This method is a fairly expensive operation and + produces a new string on each invocation. + + + decoded tag message as a string. Never null. The returned string + does not contain any LFs, even if the first paragraph spanned + multiple lines. Embedded LFs are converted to spaces. + + + +

Get a reference to the object this tag was placed on. + Get a reference to the object this tag was placed on. + object this tag refers to. +
+ + Get the name of this tag, from the tag header. + Get the name of this tag, from the tag header. + name of the tag, according to the tag header. + + + A reference to a tree of subtrees/files. + A reference to a tree of subtrees/files. + + + Create a new tree reference. + Create a new tree reference. + object name for the tree. + + + + + + + + + + + + + Replaces a RevCommit's parents until not colored with REWRITE. + + Replaces a RevCommit's parents until not colored with REWRITE. +

+ Before a RevCommit is returned to the caller its parents are updated to + create a dense DAG. Instead of reporting the actual parents as recorded when + the commit was created the returned commit will reflect the next closest + commit that matched the revision walker's filters. +

+ This generator is the second phase of a path limited revision walk and + assumes it is receiving RevCommits from + RewriteTreeFilter + , + after they have been fully buffered by + AbstractRevQueue + . The full + buffering is necessary to allow the simple loop used within our own + Rewrite(RevCommit) + to pull completely through a strand of + RevWalk.REWRITE + colored commits and come up with a simplification + that makes the DAG dense. Not fully buffering the commits first would cause + this loop to abort early, due to commits not being parsed and colored + correctly. + + RewriteTreeFilter + + +

+ For + Cleanup(RevCommit[]) + to remove duplicate parents. + +
+ + + + + + + First phase of a path limited revision walk. + + First phase of a path limited revision walk. +

+ This filter is ANDed to evaluate after all other filters and ties the + configured + NGit.Treewalk.Filter.TreeFilter + into the revision walking process. +

+ Each commit is differenced concurrently against all of its parents to look + for tree entries that are interesting to the TreeFilter. If none are found + the commit is colored with + RevWalk.REWRITE + , allowing a later pass + implemented by + RewriteGenerator + to remove those colored commits from + the DAG. + + RewriteGenerator + + +

Selects interesting revisions during walking. + + Selects interesting revisions during walking. +

+ This is an abstract interface. Applications may implement a subclass, or use + one of the predefined implementations already available within this package. + Filters may be chained together using AndRevFilter and + OrRevFilter to create complex boolean expressions. +

+ Applications should install the filter on a RevWalk by + NGit.Revwalk.RevWalk.SetRevFilter(RevFilter) + + prior to starting traversal. +

+ Unless specifically noted otherwise a RevFilter implementation is not thread + safe and may not be shared by different RevWalk instances at the same time. + This restriction allows RevFilter implementations to cache state within their + instances during + Include(NGit.Revwalk.RevWalk, NGit.Revwalk.RevCommit) + + if it is beneficial to + their implementation. Deep clones created by + Clone() + may be used to + construct a thread-safe copy of an existing filter. +

+ Message filters: +

    +
  • Author name/email: + AuthorRevFilter +
  • +
  • Committer name/email: + CommitterRevFilter +
  • +
  • Message body: + MessageRevFilter +
  • +
+

+ Merge filters: +

    +
  • Skip all merges: + NO_MERGES + .
  • +
+

+ Boolean modifiers: +

    +
  • AND: + AndRevFilter +
  • +
  • OR: + OrRevFilter +
  • +
  • NOT: + NotRevFilter +
  • +
+
+
+ + Default filter that always returns true (thread safe). + Default filter that always returns true (thread safe). + + + Default filter that always returns false (thread safe). + Default filter that always returns false (thread safe). + + + Excludes commits with more than one parent (thread safe). + Excludes commits with more than one parent (thread safe). + + + Selects only merge bases of the starting points (thread safe). + + Selects only merge bases of the starting points (thread safe). +

+ This is a special case filter that cannot be combined with any other + filter. Its include method always throws an exception as context + information beyond the arguments is necessary to determine if the + supplied commit is a merge base. + + + +

Create a new filter that does the opposite of this filter. + Create a new filter that does the opposite of this filter. + a new filter that includes commits this filter rejects. +
+ + true if the filter needs the commit body to be parsed. + + + Determine if the supplied commit should be included in results. + Determine if the supplied commit should be included in results. + the active walker this filter is being invoked from within. + + the commit currently being tested. The commit has been parsed + and its body is available for inspection only if the filter + returns true from + RequiresCommitBody() + . + + + true to include this commit in the results; false to have this + commit be omitted entirely from the results. + + + the filter knows for certain that no additional commits can + ever match, and the current commit doesn't match either. The + walk is halted and no more results are provided. + + + an object the filter needs to consult to determine its answer + does not exist in the Git repository the walker is operating + on. Filtering this commit is impossible without the object. + + + an object the filter needed to consult was not of the + expected object type. This usually indicates a corrupt + repository, as an object link is referencing the wrong type. + + + a loose object or pack file could not be read to obtain data + necessary for the filter to make its decision. + + + + Clone this revision filter, including its parameters. + + Clone this revision filter, including its parameters. +

+ This is a deep clone. If this filter embeds objects or other filters it + must also clone those, to ensure the instances do not share mutable data. + + another copy of this filter, suitable for another thread. + + + + + + + + + + + + + + +

Initial RevWalk generator that bootstraps a new walk. + + Initial RevWalk generator that bootstraps a new walk. +

+ Initially RevWalk starts with this generator as its chosen implementation. + The first request for a RevCommit from the RevWalk instance calls to our + Next() + method, and we replace ourselves with the best Generator + implementation available based upon the current RevWalk configuration. + + + + + + + + +

Sorts commits in topological order. + Sorts commits in topological order. +
+ + Create a new sorter and completely spin the generator. + + Create a new sorter and completely spin the generator. +

+ When the constructor completes the supplied generator will have no + commits remaining, as all of the commits will be held inside of this + generator's internal buffer. + + generator to pull all commits out of, and into this buffer. + NGit.Errors.MissingObjectException + + NGit.Errors.IncorrectObjectTypeException + + System.IO.IOException + + + + + + + +

Includes a commit only if all subfilters include the same commit. + + Includes a commit only if all subfilters include the same commit. +

+ Classic shortcut behavior is used, so evaluation of the + RevFilter.Include(NGit.Revwalk.RevWalk, NGit.Revwalk.RevCommit) + + method stops as soon as a false + result is obtained. Applications can improve filtering performance by placing + faster filters that are more likely to reject a result earlier in the list. + + + +

Create a filter with two filters, both of which must match. + Create a filter with two filters, both of which must match. + first filter to test. + second filter to test. + a filter that must match both input filters. +
+ + Create a filter around many filters, all of which must match. + Create a filter around many filters, all of which must match. + + list of filters to match against. Must contain at least 2 + filters. + + a filter that must match all input filters. + + + Create a filter around many filters, all of which must match. + Create a filter around many filters, all of which must match. + + list of filters to match against. Must contain at least 2 + filters. + + a filter that must match all input filters. + + + + + + + + + + + + + Matches only commits whose author name matches the pattern. + Matches only commits whose author name matches the pattern. + + + Create a new author filter. + + Create a new author filter. +

+ An optimized substring search may be automatically selected if the + pattern does not contain any regular expression meta-characters. +

+ The search is performed using a case-insensitive comparison. The + character encoding of the commit message itself is not respected. The + filter matches on raw UTF-8 byte sequences. + + regular expression pattern to match. + + a new filter that matches the given expression against the author + name and address of a commit. + + + +

Abstract filter that searches text using extended regular expressions. + Abstract filter that searches text using extended regular expressions. +
+ + Encode a string pattern for faster matching on byte arrays. + + Encode a string pattern for faster matching on byte arrays. +

+ Force the characters to our funny UTF-8 only convention that we use on + raw buffers. This avoids needing to perform character set decodes on the + individual commit buffers. + + + original pattern string supplied by the user or the + application. + + + same pattern, but re-encoded to match our funny raw UTF-8 + character sequence + NGit.Util.RawCharSequence + . + + + +

Construct a new pattern matching filter. + Construct a new pattern matching filter. + + text of the pattern. Callers may want to surround their + pattern with ".*" on either end to allow matching in the + middle of the string. + + + should .* be wrapped around the pattern of ^ and $ are + missing? Most users will want this set. + + + should + ForceToRaw(string) + be applied to the pattern + before compiling it? + + + flags from + Sharpen.Pattern + to control how matching performs. + +
+ + Get the pattern this filter uses. + Get the pattern this filter uses. + the pattern this filter is applying to candidate strings. + + + + + + + + Obtain the raw text to match against. + Obtain the raw text to match against. + current commit being evaluated. + sequence for the commit's content that we need to match on. + + + Abstract filter that searches text using only substring search. + Abstract filter that searches text using only substring search. + + + Can this string be safely handled by a substring filter? + the pattern text proposed by the user. + + true if a substring filter can perform this pattern match; false + if + PatternMatchRevFilter + must be used instead. + + + + Construct a new matching filter. + Construct a new matching filter. + + text to locate. This should be a safe string as described by + the + Safe(string) + as regular expression meta + characters are treated as literals. + + + + + + + + + Obtain the raw text to match against. + Obtain the raw text to match against. + current commit being evaluated. + sequence for the commit's content that we need to match on. + + + Selects commits based upon the commit time field. + Selects commits based upon the commit time field. + + + Create a new filter to select commits before a given date/time. + Create a new filter to select commits before a given date/time. + the point in time to cut on. + a new filter to select commits on or before ts. + + + Create a new filter to select commits before a given date/time. + Create a new filter to select commits before a given date/time. + the point in time to cut on, in milliseconds + a new filter to select commits on or before ts. + + + Create a new filter to select commits after a given date/time. + Create a new filter to select commits after a given date/time. + the point in time to cut on. + a new filter to select commits on or after ts. + + + Create a new filter to select commits after a given date/time. + Create a new filter to select commits after a given date/time. + the point in time to cut on, in milliseconds. + a new filter to select commits on or after ts. + + + + Create a new filter to select commits after or equal a given date/time since + and before or equal a given date/time until. + + + Create a new filter to select commits after or equal a given date/time since + and before or equal a given date/time until. + + the point in time to cut on. + the point in time to cut off. + a new filter to select commits between the given date/times. + + + + Create a new filter to select commits after or equal a given date/time since + and before or equal a given date/time until. + + + Create a new filter to select commits after or equal a given date/time since + and before or equal a given date/time until. + + the point in time to cut on, in milliseconds. + the point in time to cut off, in millisconds. + a new filter to select commits between the given date/times. + + + + + + + + + + + + + + + + + + + + + Matches only commits whose committer name matches the pattern. + Matches only commits whose committer name matches the pattern. + + + Create a new committer filter. + + Create a new committer filter. +

+ An optimized substring search may be automatically selected if the + pattern does not contain any regular expression meta-characters. +

+ The search is performed using a case-insensitive comparison. The + character encoding of the commit message itself is not respected. The + filter matches on raw UTF-8 byte sequences. + + regular expression pattern to match. + + a new filter that matches the given expression against the author + name and address of a commit. + + + +

Matches only commits whose message matches the pattern. + Matches only commits whose message matches the pattern. +
+ + Create a message filter. + + Create a message filter. +

+ An optimized substring search may be automatically selected if the + pattern does not contain any regular expression meta-characters. +

+ The search is performed using a case-insensitive comparison. The + character encoding of the commit message itself is not respected. The + filter matches on raw UTF-8 byte sequences. + + regular expression pattern to match. + + a new filter that matches the given expression against the + message body of the commit. + + + +

Includes a commit only if the subfilter does not include the commit. + Includes a commit only if the subfilter does not include the commit. +
+ + Create a filter that negates the result of another filter. + Create a filter that negates the result of another filter. + filter to negate. + a filter that does the reverse of a. + + + + + + + + Includes a commit if any subfilters include the same commit. + + Includes a commit if any subfilters include the same commit. +

+ Classic shortcut behavior is used, so evaluation of the + RevFilter.Include(NGit.Revwalk.RevWalk, NGit.Revwalk.RevCommit) + + method stops as soon as a true + result is obtained. Applications can improve filtering performance by placing + faster filters that are more likely to accept a result earlier in the list. + + + +

Create a filter with two filters, one of which must match. + Create a filter with two filters, one of which must match. + first filter to test. + second filter to test. + a filter that must match at least one input filter. +
+ + Create a filter around many filters, one of which must match. + Create a filter around many filters, one of which must match. + + list of filters to match against. Must contain at least 2 + filters. + + a filter that must match at least one input filter. + + + Create a filter around many filters, one of which must match. + Create a filter around many filters, one of which must match. + + list of filters to match against. Must contain at least 2 + filters. + + a filter that must match at least one input filter. + + + + + + + + + + + + + Matches only commits with some/all RevFlags already set. + Matches only commits with some/all RevFlags already set. + + + Create a new filter that tests for a single flag. + Create a new filter that tests for a single flag. + the flag to test. + filter that selects only commits with flag a. + + + Create a new filter that tests all flags in a set. + Create a new filter that tests all flags in a set. + set of flags to test. + filter that selects only commits with all flags in a. + + + Create a new filter that tests all flags in a set. + Create a new filter that tests all flags in a set. + set of flags to test. + filter that selects only commits with all flags in a. + + + Create a new filter that tests for any flag in a set. + Create a new filter that tests for any flag in a set. + set of flags to test. + filter that selects only commits with any flag in a. + + + Create a new filter that tests for any flag in a set. + Create a new filter that tests for any flag in a set. + set of flags to test. + filter that selects only commits with any flag in a. + + + + + + + + + + + + + + A + ByteWindow + with an underlying byte array for storage. + + + + A window of data currently stored within a cache. + + A window of data currently stored within a cache. +

+ All bytes in the window can be assumed to be "immediately available", that is + they are very likely already in memory, unless the operating system's memory + is very low and has paged part of this process out to disk. Therefore copying + bytes from a window is very inexpensive. + + + +

Copy bytes from the window to a caller supplied buffer. + Copy bytes from the window to a caller supplied buffer. + offset within the file to start copying from. + destination buffer to copy into. + offset within dstbuf to start copying into. + + number of bytes to copy. This value may exceed the number of + bytes remaining in the window starting at offset + pos. + + + number of bytes actually copied; this may be less than + cnt if cnt exceeded the number of + bytes available. + +
+ + Copy bytes from the window to a caller supplied buffer. + Copy bytes from the window to a caller supplied buffer. + offset within the window to start copying from. + destination buffer to copy into. + offset within dstbuf to start copying into. + + number of bytes to copy. This value may exceed the number of + bytes remaining in the window starting at offset + pos. + + + number of bytes actually copied; this may be less than + cnt if cnt exceeded the number of + bytes available. + + + + + + + + + + + + + + + + + + + + + + + A window for accessing git packs using a + Sharpen.ByteBuffer + for storage. + + ByteWindow + + + + + + + + + + The cached instance of an + ObjectDirectory + . +

+ This class caches the list of loose objects in memory, so the file system is + not queried with stat calls. +

+
+ + + Does the requested object exist in this database? +

+ Alternates (if present) are searched automatically. +

+ + Does the requested object exist in this database? +

+ Alternates (if present) are searched automatically. + + identity of the object to test for existence of. + + true if the specified object is stored in this database, or any + of the alternate databases. + + + +

Compute the location of a loose object file. + Compute the location of a loose object file. + identity of the loose object to map to the directory. + location of the object, if it were to exist as a loose object. +
+ + + + + Open an object from this database. + + Open an object from this database. +

+ Alternates (if present) are searched automatically. + + temporary working space associated with the calling thread. + identity of the object to open. + + a + NGit.ObjectLoader + for accessing the data of the named + object, or null if the object does not exist. + + System.IO.IOException + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ The set that contains unpacked objects identifiers, it is created when + the cached instance is created. + + + The set that contains unpacked objects identifiers, it is created when + the cached instance is created. + +
+ + The constructor + the wrapped database + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The configuration file that is stored in the file of the file system. + The configuration file that is stored in the file of the file system. + + + Create a configuration with no default fallback. + Create a configuration with no default fallback. + the location of the configuration file on the file system + + + the file system abstraction which will be necessary to perform + certain file system operations. + + + + The constructor + the base configuration file + the location of the configuration file on the file system + + + the file system abstraction which will be necessary to perform + certain file system operations. + + + + location of the configuration file on disk + + + Load the configuration as a Git text style configuration file. + + Load the configuration as a Git text style configuration file. +

+ If the file does not exist, this configuration is cleared, and thus + behaves the same as though the file exists, but is empty. + + the file could not be read (but does exist). + + the file is not a properly formatted configuration file. + + + +

Save the configuration as a Git text style configuration file. + + Save the configuration as a Git text style configuration file. +

+ Warning: Although this method uses the traditional Git file + locking approach to protect against concurrent writes of the + configuration file, it does not ensure that the file has not been + modified since the last read, which means updates performed by other + objects accessing the same backing file may be lost. + + the file could not be written. + + + + returns true if the currently loaded configuration file is older + than the file on disk + + + +

Represents a Git repository. + + Represents a Git repository. A repository holds all objects and refs used for + managing source code (could by any type of file, but source code is what + SCM's are typically used for). + In Git terms all data is stored in GIT_DIR, typically a directory called + .git. A work tree is maintained unless the repository is a bare repository. + Typically the .git directory is located at the root of the work dir. +
    +
  • GIT_DIR +
      +
    • objects/ - objects
    • +
    • refs/ - tags and heads
    • +
    • config - configuration
    • +
    • info/ - more configurations
    • +
    +
  • +
+

+ This class is thread-safe. +

+ This implementation only handles a subtly undocumented subset of git features. + + + +

Construct a representation of a Git repository. + + Construct a representation of a Git repository. +

+ The work tree, object directory, alternate object directories and index + file locations are deduced from the given git directory and the default + rules by running + FileRepositoryBuilder + . This constructor is the + same as saying: +

+            new FileRepositoryBuilder().setGitDir(gitDir).build()
+            
+
+ GIT_DIR (the location of the repository metadata). + + the repository appears to already exist but cannot be + accessed. + + FileRepositoryBuilder +
+ + + A convenience API for + FileRepository(Sharpen.FilePath) + . + + GIT_DIR (the location of the repository metadata). + + the repository appears to already exist but cannot be + accessed. + + FileRepositoryBuilder + + + Create a repository using the local file system. + Create a repository using the local file system. + description of the repository's important paths. + + the user configuration file or repository configuration file + cannot be accessed. + + + + + + + + + + + + + + Create a new Git repository initializing the necessary files and + directories. + + + Create a new Git repository initializing the necessary files and + directories. + + if true, a bare repository is created. + in case of IO problem + + + the configuration of this repository + + + + Objects known to exist but not expressed by + NGit.Repository.GetAllRefs() + . +

+ When a repository borrows objects from another repository, it can + advertise that it safely has that other repository's references, without + exposing any other details about the other repository. This may help + a client trying to push changes avoid pushing more than it needs to. +

+ unmodifiable collection of other known objects. +
+ + Add a single existing pack to the list of available pack files. + Add a single existing pack to the list of available pack files. + path of the pack file to open. + path of the corresponding index file. + + index file could not be opened, read, or is not recognized as + a Git pack file index. + + + + + + + Detect index changes. + Detect index changes. + + + + + a + ReflogReader + for the supplied refname, or null if the + named ref does not exist. + + the ref could not be accessed. + + + the directory containing the objects owned by this repository. + + + the object database which stores this repository's data. + + + the reference database which stores the reference namespace. + + + + Constructs a + FileRepository + . +

+ Applications must set one of + NGit.BaseRepositoryBuilder<B, R>.SetGitDir(Sharpen.FilePath) + + or + NGit.BaseRepositoryBuilder<B, R>.SetWorkTree(Sharpen.FilePath) + + , or use + NGit.BaseRepositoryBuilder<B, R>.ReadEnvironment() + + or + NGit.BaseRepositoryBuilder<B, R>.FindGitDir() + + in order to configure the minimum property set + necessary to open a repository. +

+ Single repository applications trying to be compatible with other Git + implementations are encouraged to use a model such as: +

+            new FileRepositoryBuilder() //
+            .setGitDir(gitDirArgument) // --git-dir if supplied, no-op if null
+            .readEnviroment() // scan environment GIT_* variables
+            .findGitDir() // scan up the file system tree
+            .build()
+            
+
+
+ + Create a repository matching the configuration in this builder. + + Create a repository matching the configuration in this builder. +

+ If an option was not set, the build method will try to default the option + based on other options. If insufficient information is available, an + exception is thrown to the caller. + + a repository matching this configuration. + insufficient parameters were set. + + the repository could not be accessed to configure the rest of + the builder's parameters. + + + + + + + + + + + + + + + + + + + + + +

Inflates a delta in an incremental way. + + Inflates a delta in an incremental way. +

+ Implementations must provide a means to access a stream for the base object. + This stream may be accessed multiple times, in order to randomly position it + to match the copy instructions. A + DeltaStream + performs an efficient + skip by only moving through the delta stream, making restarts of stacked + deltas reasonably efficient. + + + +

Stream to read from the base object. + Stream to read from the base object. +
+ + + Current position within + baseStream + . + + + + + If + curcmd == CMD_COPY + , position the base has to be at. + + + + Total number of bytes in this current command. + Total number of bytes in this current command. + + + Construct a delta application stream, reading instructions. + Construct a delta application stream, reading instructions. + the stream to read delta instructions from. + + the delta instruction stream cannot be read, or is + inconsistent with the the base object information. + + + + Open the base stream. + + Open the base stream. +

+ The + DeltaStream + may close and reopen the base stream multiple + times if copy instructions use offsets out of order. This can occur if a + large block in the file was moved from near the top, to near the bottom. + In such cases the reopened stream is skipped to the target offset, so + skip(long) + should be as efficient as possible. + + + stream to read from the base object. This stream should not be + buffered (or should be only minimally buffered), and does not + need to support mark/reset. + + the base object cannot be opened for reading. + + + + length of the base object, in bytes. + the length of the base cannot be determined. + + + + total size of this stream, in bytes. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ An object representation + PackWriter + can consider for packing. + +
+ + + Special unknown value for + GetWeight() + . + + + + Stored in pack format, as a delta to another object. + Stored in pack format, as a delta to another object. + + + Stored in pack format, without delta. + Stored in pack format, without delta. + + + Only available after inflating to canonical format. + Only available after inflating to canonical format. + + + + relative size of this object's packed form. The special value + WEIGHT_UNKNOWN + can be returned to indicate the + implementation doesn't know, or cannot supply the weight up + front. + + + + + the storage format type, which must be one of + PACK_DELTA + , + PACK_WHOLE + , or + FORMAT_OTHER + . + + + + + identity of the object this delta applies to in order to recover + the original object content. This method should only be called if + GetFormat() + returned + PACK_DELTA + . + + + + + whether the current representation of the object has had delta + compression attempted on it. + + + + + NGit.Storage.Pack.ObjectToPack + for + ObjectDirectory + . + + + + + Per-object state used by + PackWriter + . +

+ PackWriter + uses this class to track the things it needs to include in + the newly generated pack file, and how to efficiently obtain the raw data for + each object as they are written to the output stream. +

+
+ + Description of an object stored in a pack file, including offset. + + Description of an object stored in a pack file, including offset. +

+ When objects are stored in packs Git needs the ObjectId and the offset + (starting position of the object data) to perform random-access reads of + objects from the pack. This extension of ObjectId includes the offset. + + + +

Create a new structure to remember information about an object. + Create a new structure to remember information about an object. + the identity of the object the new instance tracks. +
+ + + offset in pack when object has been already written, or 0 if it + has not been written yet + + + + Set the offset in pack when object has been written to. + Set the offset in pack when object has been written to. + offset where written object starts + + + the 32 bit CRC checksum for the packed data. + + + Record the 32 bit CRC checksum for the packed data. + Record the 32 bit CRC checksum for the packed data. + + checksum of all packed data (including object type code, + inflated length and delta base reference) as computed by + Sharpen.CRC32 + . + + + + Other object being packed that this will delta against. + Other object being packed that this will delta against. + + + + Bit field, from bit 0 to bit 31: +
    +
  • 1 bit: wantWrite
  • +
  • 1 bit: canReuseAsIs
  • +
  • 1 bit: doNotDelta
  • +
  • 1 bit: edgeObject
  • +
  • 1 bit: deltaAttempted
  • +
  • 3 bits: type
  • +
  • 4 bits: subclass flags (if any)
  • +
  • --
  • +
  • 20 bits: deltaDepth
  • +
+
+
+ + Hash of the object's tree path. + Hash of the object's tree path. + + + If present, deflated delta instruction stream for this object. + If present, deflated delta instruction stream for this object. + + + Construct for the specified object id. + Construct for the specified object id. + object id of object for packing + real type code of the object, not its in-pack type. + + + Construct for the specified object. + Construct for the specified object. + + identity of the object that will be packed. The object's + parsed status is undefined here. Implementers must not rely on + the object being parsed. + + + + + delta base object id if object is going to be packed in delta + representation; null otherwise - if going to be packed as a + whole object. + + + + + delta base object to pack if object is going to be packed in + delta representation and delta is specified as object to + pack; null otherwise - if going to be packed as a whole + object or delta base is specified only as id. + + + + Set delta base for the object. + + Set delta base for the object. Delta base set by this method is used + by + PackWriter + to write object - determines its representation + in a created pack. + + + delta base object or null if object should be packed as a + whole object. + + + + + true if object is going to be written as delta; false + otherwise. + + + + Check if object is already written in a pack. + + Check if object is already written in a pack. This information is + used to achieve delta-base precedence in a pack file. + + true if object is already written; false otherwise. + + + the type of this object. + + + + true if an existing representation was selected to be reused + as-is into the pack stream. + + + + Forget the reuse information previously stored. + + Forget the reuse information previously stored. +

+ Implementations may subclass this method, but they must also invoke the + super version with + super.clearReuseAsIs() + to ensure the flag is + properly cleared for the writer. + + + + the extended flags on this object, in the range [0x0, 0xf]. + + +

Determine if a particular extended flag bit has been set. + + Determine if a particular extended flag bit has been set. + This implementation may be faster than calling + GetExtendedFlags() + and testing the result. + + the flag mask to test, must be between 0x0 and 0xf. + true if any of the bits matching the mask are non-zero. +
+ + Set an extended flag bit. + + Set an extended flag bit. + This implementation is more efficient than getting the extended flags, + adding the bit, and setting them all back. + + the bits to set, must be between 0x0 and 0xf. + + + Clear an extended flag bit. + + Clear an extended flag bit. + This implementation is more efficient than getting the extended flags, + removing the bit, and setting them all back. + + the bits to clear, must be between 0x0 and 0xf. + + + Set the extended flags used by the subclass. + + Set the extended flags used by the subclass. + Subclass implementations may store up to 4 bits of information inside of + the internal flags field already used by the base ObjectToPack instance. + + + additional flag bits to store in the flags field. Due to space + constraints only values [0x0, 0xf] are permitted. + + + + Remember a specific representation for reuse at a later time. + + Remember a specific representation for reuse at a later time. +

+ Implementers should remember the representation chosen, so it can be + reused at a later time. + PackWriter + may invoke this method + multiple times for the same object, each time saving the current best + representation found. + + the object representation. + + +

Pack to reuse compressed data from, otherwise null. + Pack to reuse compressed data from, otherwise null. +
+ + + Offset of the object's header in + pack + . + + + + Length of the data section of the object. + Length of the data section of the object. + + + Git style file locking and replacement. + + Git style file locking and replacement. +

+ To modify a ref file Git tries to use an atomic update approach: we write the + new data into a brand new file, then rename it in place over the old name. + This way we can just delete the temporary file if anything goes wrong, and + nothing has been damaged. To coordinate access from multiple processes at + once Git tries to atomically create the new temporary file under a well-known + name. + + + +

Unlock the given file. + + Unlock the given file. +

+ This method can be used for recovering from a thrown + NGit.Errors.LockFailedException + . This method does not validate that the lock + is or is not currently held before attempting to unlock it. + + + true if unlocked, false if unlocking failed + + +

Get the lock file corresponding to the given file. + Get the lock file corresponding to the given file. + + lock file +
+ + Filter to skip over active lock files when listing a directory. + Filter to skip over active lock files when listing a directory. + + + Create a new lock for any file. + Create a new lock for any file. + the file that will be locked. + + the file system abstraction which will be necessary to perform + certain file system operations. + + + + Try to establish the lock. + Try to establish the lock. + + true if the lock is now held by the caller; false if it is held + by someone else. + + + the temporary output file could not be created. The caller + does not hold the lock. + + + + Try to establish the lock for appending. + Try to establish the lock for appending. + + true if the lock is now held by the caller; false if it is held + by someone else. + + + the temporary output file could not be created. The caller + does not hold the lock. + + + + Copy the current file content into the temporary file. + + Copy the current file content into the temporary file. +

+ This method saves the current file content by inserting it into the + temporary file, so that the caller can safely append rather than replace + the primary file. +

+ This method does nothing if the current file does not exist, or exists + but is empty. + + + the temporary file could not be written, or a read error + occurred while reading from the current file. The lock is + released before throwing the underlying IO exception to the + caller. + + + the temporary file could not be written. The lock is released + before throwing the underlying exception to the caller. + + + +

Write an ObjectId and LF to the temporary file. + Write an ObjectId and LF to the temporary file. + + the id to store in the file. The id will be written in hex, + followed by a sole LF. + + + the temporary file could not be written. The lock is released + before throwing the underlying IO exception to the caller. + + + the temporary file could not be written. The lock is released + before throwing the underlying exception to the caller. + +
+ + Write arbitrary data to the temporary file. + Write arbitrary data to the temporary file. + + the bytes to store in the temporary file. No additional bytes + are added, so if the file must end with an LF it must appear + at the end of the byte array. + + + the temporary file could not be written. The lock is released + before throwing the underlying IO exception to the caller. + + + the temporary file could not be written. The lock is released + before throwing the underlying exception to the caller. + + + + Obtain the direct output stream for this lock. + + Obtain the direct output stream for this lock. +

+ The stream may only be accessed once, and only after + Lock() + has + been successfully invoked and returned true. Callers must close the + stream prior to calling + Commit() + to commit the change. + + a stream to write to the new file. The stream is unbuffered. + + +

+ Request that + Commit() + remember modification time. +

+ This is an alias for + setNeedSnapshot(true) + . +

+ true if the commit method must remember the modification time. +
+ + + Request that + Commit() + remember the + FileSnapshot + . + + true if the commit method must remember the FileSnapshot. + + + + Request that + Commit() + force dirty data to the drive. + + true if dirty data should be forced to the drive. + + + Wait until the lock file information differs from the old file. + + Wait until the lock file information differs from the old file. +

+ This method tests the last modification date. If both are the same, this + method sleeps until it can force the new lock file's modification date to + be later than the target file. + + + the thread was interrupted before the last modified date of + the lock file was different from the last modified date of + the target file. + + + +

Commit this change and release the lock. + + Commit this change and release the lock. +

+ If this method fails (returns false) the lock is still released. + + + true if the commit was successful and the file contains the new + data; false if the commit failed and the file remains with the + old data. + + the lock is not held. + + +

Get the modification time of the output file when it was committed. + Get the modification time of the output file when it was committed. + modification time of the lock file right before we committed it. +
+ + + get the + FileSnapshot + just before commit. + + + + + Update the commit snapshot + GetCommitSnapshot() + before commit. +

+ This may be necessary if you need time stamp before commit occurs, e.g + while writing the index. +

+
+ + Unlock this file and abort this change. + + Unlock this file and abort this change. +

+ The temporary file (if created) is deleted before returning. + + + + + + + + + + + + + + + +

+ Traditional file system based + NGit.ObjectDatabase + . +

+ This is the classical object database representation for a Git repository, + where objects are stored loose by hashing them into directories by their + NGit.ObjectId + , or are stored in compressed containers known as + PackFile + s. +

+ Optionally an object database can reference one or more alternates; other + ObjectDatabase instances that are searched in addition to the current + database. +

+ Databases are divided into two halves: a half that is considered to be fast + to search (the + PackFile + s), and a half that is considered to be slow + to search (loose objects). When alternates are present the fast half is fully + searched (recursively through all alternates) before the slow half is + considered. +

+
+ + Maximum number of candidates offered as resolutions of abbreviation. + Maximum number of candidates offered as resolutions of abbreviation. + + + Initialize a reference to an on-disk object directory. + Initialize a reference to an on-disk object directory. + configuration this directory consults for write settings. + the location of the objects directory. + a list of alternate object directories + + the file system abstraction which will be necessary to perform + certain file system operations. + + an alternate object cannot be opened. + + + the location of the objects directory. + + + + + + Compute the location of a loose object file. + Compute the location of a loose object file. + identity of the loose object to map to the directory. + location of the object, if it were to exist as a loose object. + + + + unmodifiable collection of all known pack files local to this + directory. Most recent packs are presented first. Packs most + likely to contain more recent objects appear before packs + containing objects referenced by commits further back in the + history of the repository. + + + + + + + + + + Add a single existing pack to the list of available pack files. + Add a single existing pack to the list of available pack files. + path of the pack file to open. + path of the corresponding index file. + the pack that was opened and added to the database. + + index file could not be opened, read, or is not recognized as + a Git pack file index. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + State just before reading the pack directory. + State just before reading the pack directory. + + + + All known packs, sorted by + PackFile.SORT + . + + + + + Creates loose objects in a + ObjectDirectory + . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A Git version 2 pack file representation. + + A Git version 2 pack file representation. A pack file contains Git objects in + delta packed format yielding high compression of lots of object where some + objects are similar. + + + + Sorts PackFiles to be most recently created to least recently created. + Sorts PackFiles to be most recently created to least recently created. + + + + Serializes reads performed against + fd + . + + + + Objects we have tried to read, and discovered to be corrupt. + + Objects we have tried to read, and discovered to be corrupt. +

+ The list is allocated after the first corruption is found, and filled in + as more entries are discovered. Typically this list is never used, as + pack files do not usually contain corrupt objects. + + + +

Construct a reader for an existing, pre-indexed packfile. + Construct a reader for an existing, pre-indexed packfile. + path of the .idx file listing the contents. + path of the .pack file holding the data. +
+ + + + + the File object which locates this pack on disk. + + + the index for this pack file. + System.IO.IOException + + + + name extracted from + pack-*.pack + pattern. + + + + Determine if an object is contained within the pack file. + + Determine if an object is contained within the pack file. +

+ For performance reasons only the index file is searched; the main pack + content is ignored entirely. + + the object to look for. Must not be null. + true if the object is in this pack; false otherwise. + the index file cannot be loaded into memory. + + + +

Determines whether a .keep file exists for this pack file. + Determines whether a .keep file exists for this pack file. + true if a .keep file exist. +
+ + Get an object from this pack. + Get an object from this pack. + temporary working space associated with the calling thread. + the object to obtain from the pack. Must not be null. + + the object loader for the requested object if it is contained in + this pack; null if the object was not found. + + the pack file or the index could not be read. + + + + + + + Close the resources utilized by this repository + + + + Provide iterator over entries in associated pack index, that should also + exist in this pack file. + + + Provide iterator over entries in associated pack index, that should also + exist in this pack file. Objects returned by such iterator are mutable + during iteration. +

+ Iterator returns objects in SHA-1 lexicographical order. + + iterator over entries of associated pack index + PackIndex.Iterator() + + +

Obtain the total number of objects available in this pack. + + Obtain the total number of objects available in this pack. This method + relies on pack index, giving number of effectively available objects. + + number of objects in index of this pack, likewise in this pack + the index file cannot be loaded into memory. + +
+ + + Search for object id with the specified start offset in associated pack + (reverse) index. + + + Search for object id with the specified start offset in associated pack + (reverse) index. + + start offset of object to find + object id for this offset, or null if no object was found + the index file cannot be loaded into memory. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Child that applies onto this object. + Child that applies onto this object. + + + Offset of the delta object. + Offset of the delta object. + + + Size of the inflated delta stream. + Size of the inflated delta stream. + + + Total size of the delta's pack entry header (including base). + Total size of the delta's pack entry header (including base). + + + Offset of the base object this delta applies onto. + Offset of the base object this delta applies onto. + + + + Access path to locate objects by + NGit.ObjectId + in a + PackFile + . +

+ Indexes are strictly redundant information in that we can rebuild all of the + data held in the index file from the on disk representation of the pack file + itself, but it is faster to access for random requests because data is stored + by ObjectId. +

+
+ + Open an existing pack .idx file for reading. + + Open an existing pack .idx file for reading. +

+ The format of the file will be automatically detected and a proper access + implementation for that format will be constructed and returned to the + caller. The file may or may not be held open by the returned instance. + + existing pack .idx to read. + access implementation for the requested file. + the file does not exist. + + the file exists but could not be read due to security errors, + unrecognized data version, or unexpected data corruption. + + + +

Read an existing pack index file from a buffered stream. + + Read an existing pack index file from a buffered stream. +

+ The format of the file will be automatically detected and a proper access + implementation for that format will be constructed and returned to the + caller. The file may or may not be held open by the returned instance. + + + stream to read the index file from. The stream must be + buffered as some small IOs are performed against the stream. + The caller is responsible for closing the stream. + + a copy of the index in-memory. + the stream cannot be read. + the stream does not contain a valid pack index. + + + +

Footer checksum applied on the bottom of the pack file. + Footer checksum applied on the bottom of the pack file. +
+ + Determine if an object is contained within the pack file. + Determine if an object is contained within the pack file. + the object to look for. Must not be null. + true if the object is listed in this index; false otherwise. + + + Provide iterator that gives access to index entries. + + Provide iterator that gives access to index entries. Note, that iterator + returns reference to mutable object, the same reference in each call - + for performance reason. If client needs immutable objects, it must copy + returned object on its own. +

+ Iterator returns objects in SHA-1 lexicographical order. + + iterator over pack index entries + + +

Obtain the total number of objects described by this index. + Obtain the total number of objects described by this index. + + number of objects in this index, and likewise in the associated + pack that this index was generated from. + +
+ + Obtain the total number of objects needing 64 bit offsets. + Obtain the total number of objects needing 64 bit offsets. + + number of objects in this index using a 64 bit offset; that is an + object positioned after the 2 GB position within the file. + + + + + Get ObjectId for the n-th object entry returned by + Iterator() + . +

+ This method is a constant-time replacement for the following loop: +

+            Iterator<MutableEntry> eItr = index.iterator();
+            int curPosition = 0;
+            while (eItr.hasNext() && curPosition++ < nthPosition)
+            eItr.next();
+            ObjectId result = eItr.next().toObjectId();
+            
+
+ + position within the traversal of + Iterator() + that the + caller needs the object for. The first returned + MutableEntry + is 0, the second is 1, etc. + + the ObjectId for the corresponding entry. +
+ + + Get ObjectId for the n-th object entry returned by + Iterator() + . +

+ This method is a constant-time replacement for the following loop: +

+            Iterator<MutableEntry> eItr = index.iterator();
+            int curPosition = 0;
+            while (eItr.hasNext() && curPosition++ < nthPosition)
+            eItr.next();
+            ObjectId result = eItr.next().toObjectId();
+            
+
+ + unsigned 32 bit position within the traversal of + Iterator() + that the caller needs the object for. The + first returned + MutableEntry + is 0, the second is 1, + etc. Positions past 2**31-1 are negative, but still valid. + + the ObjectId for the corresponding entry. +
+ + Locate the file offset position for the requested object. + Locate the file offset position for the requested object. + name of the object to locate within the pack. + + offset of the object's header and compressed content; -1 if the + object does not exist in this index and is thus not stored in the + associated pack. + + + + + Retrieve stored CRC32 checksum of the requested object raw-data + (including header). + + + Retrieve stored CRC32 checksum of the requested object raw-data + (including header). + + id of object to look for + CRC32 checksum of specified object (at 32 less significant bits) + when requested ObjectId was not found in this index + + when this index doesn't support CRC32 checksum + + + + Check whether this index supports (has) CRC32 checksums for objects. + Check whether this index supports (has) CRC32 checksums for objects. + true if CRC32 is stored, false otherwise + + + Find objects matching the prefix abbreviation. + Find objects matching the prefix abbreviation. + + set to add any located ObjectIds to. This is an output + parameter. + + prefix to search for. + + maximum number of results to return. At most this many + ObjectIds should be added to matches before returning. + + the index cannot be read. + + + + Represent mutable entry of pack index consisting of object id and offset + in pack (both mutable). + + + Represent mutable entry of pack index consisting of object id and offset + in pack (both mutable). + + + + Returns offset for this index object entry + offset of this object in a pack file + + + hex string describing the object id of this entry. + + + a copy of the object id. + + + a complete copy of this entry, that won't modify + + + + Implementation must update + returnedNumber + before returning + element. + + + + + + + + + + + Support for the pack index v2 format. + Support for the pack index v2 format. + + + 256 arrays of contiguous object names. + 256 arrays of contiguous object names. + + + + 256 arrays of the 32 bit offset data, matching + names + . + + + + + 256 arrays of the CRC-32 of objects, matching + names + . + + + + 64 bit offset table. + 64 bit offset table. + + + + + + + + + + + + + Creates a table of contents to support random access by + PackFile + . +

+ Pack index files (the .idx suffix in a pack file pair) + provides random access to any object in the pack by associating an ObjectId + to the byte offset within the pack where the object's data can be read. +

+
+ + Magic constant indicating post-version 1 format. + Magic constant indicating post-version 1 format. + + + Create a new writer for the oldest (most widely understood) format. + + Create a new writer for the oldest (most widely understood) format. +

+ This method selects an index format that can accurate describe the + supplied objects and that will be the most compatible format with older + Git implementations. +

+ Index version 1 is widely recognized by all Git implementations, but + index version 2 (and later) is not as well recognized as it was + introduced more than a year later. Index version 1 can only be used if + the resulting pack file is under 4 gigabytes in size; packs larger than + that limit must use index version 2. + + + the stream the index data will be written to. If not already + buffered it will be automatically wrapped in a buffered + stream. Callers are always responsible for closing the stream. + + + the objects the caller needs to store in the index. Entries + will be examined until a format can be conclusively selected. + + + a new writer to output an index file of the requested format to + the supplied stream. + + + no recognized pack index version can support the supplied + objects. This is likely a bug in the implementation. + + + +

Create a new writer instance for a specific index format version. + Create a new writer instance for a specific index format version. + + the stream the index data will be written to. If not already + buffered it will be automatically wrapped in a buffered + stream. Callers are always responsible for closing the stream. + + + index format version number required by the caller. Exactly + this formatted version will be written. + + + a new writer to output an index file of the requested format to + the supplied stream. + + + the version requested is not supported by this + implementation. + +
+ + The index data stream we are responsible for creating. + The index data stream we are responsible for creating. + + + A temporary buffer for use during IO to {link #out}. + A temporary buffer for use during IO to {link #out}. + + + The entries this writer must pack. + The entries this writer must pack. + + + SHA-1 checksum for the entire pack data. + SHA-1 checksum for the entire pack data. + + + Create a new writer instance. + Create a new writer instance. + + the stream this instance outputs to. If not already buffered + it will be automatically wrapped in a buffered stream. + + + + Write all object entries to the index stream. + + Write all object entries to the index stream. +

+ After writing the stream passed to the factory is flushed but remains + open. Callers are always responsible for closing the output stream. + + + sorted list of objects to store in the index. The caller must + have previously sorted the list using + NGit.Transport.PackedObjectInfo + 's + native + System.IComparable<T> + implementation. + + + checksum signature of the entire pack data content. This is + traditionally the last 20 bytes of the pack file's own stream. + + + an error occurred while writing to the output stream, or this + index format cannot store the object data supplied. + + + +

+ Writes the index file to + @out + . +

+ Implementations should go something like: +

+            writeFanOutTable();
+            for (final PackedObjectInfo po : entries)
+            writeOneEntry(po);
+            writeChecksumFooter();
+            
+

+ Where the logic for writeOneEntry is specific to the index + format in use. Additional headers/footers may be used if necessary and + the + entries + collection may be iterated over more than once if + necessary. Implementors therefore have complete control over the data. +

+ + an error occurred while writing to the output stream, or this + index format cannot store the object data supplied. + +
+ + Output the version 2 (and later) TOC header, with version number. + + Output the version 2 (and later) TOC header, with version number. +

+ Post version 1 all index files start with a TOC header that makes the + file an invalid version 1 file, and then includes the version number. + This header is necessary to recognize a version 1 from a version 2 + formatted index. + + version number of this index format being written. + an error occurred while writing to the output stream. + + + +

Output the standard 256 entry first-level fan-out table. + + Output the standard 256 entry first-level fan-out table. +

+ The fan-out table is 4 KB in size, holding 256 32-bit unsigned integer + counts. Each count represents the number of objects within this index + whose + NGit.AnyObjectId.FirstByte() + matches the count's position in the + fan-out table. + + an error occurred while writing to the output stream. + + + +

Output the standard two-checksum index footer. + + Output the standard two-checksum index footer. +

+ The standard footer contains two checksums (20 byte SHA-1 values): +

    +
  1. Pack data checksum - taken from the last 20 bytes of the pack file.
  2. +
  3. Index data checksum - checksum of all index bytes written, including + the pack data checksum above.
  4. +
+
+ an error occurred while writing to the output stream. + +
+ + Creates the version 1 (old style) pack table of contents files. + Creates the version 1 (old style) pack table of contents files. + PackIndexWriter + PackIndexV1 + + + + + + Creates the version 2 pack table of contents files. + Creates the version 2 pack table of contents files. + PackIndexWriter + PackIndexV2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + Keeps track of a + PackFile + 's associated .keep file. + + + + Create a new lock for a pack file. + Create a new lock for a pack file. + location of the pack-*.pack file. + the filesystem abstraction used by the repository. + + + Create the pack-*.keep file, with the given message. + Create the pack-*.keep file, with the given message. + message to store in the file. + true if the keep file was successfully written; false otherwise. + the keep file could not be written. + + + Remove the .keep file that holds this pack in place. + Remove the .keep file that holds this pack in place. + if deletion of .keep file failed + + + +

+ Reverse index for forward pack index. +

+ +

+ Reverse index for forward pack index. Provides operations based on offset + instead of object id. Such offset-based reverse lookups are performed in + O(log n) time. + + PackIndex + PackFile + + +

Index we were created from, and that has our ObjectId data. + Index we were created from, and that has our ObjectId data. +
+ + (offset31, truly) Offsets accommodating in 31 bits. + (offset31, truly) Offsets accommodating in 31 bits. + + + Offsets not accommodating in 31 bits. + Offsets not accommodating in 31 bits. + + + + Position of the corresponding + offsets32 + in + index + . + + + + + Position of the corresponding + offsets64 + in + index + . + + + + + Create reverse index from straight/forward pack index, by indexing all + its entries. + + + Create reverse index from straight/forward pack index, by indexing all + its entries. + + forward index - entries to (reverse) index. + + + + Search for object id with the specified start offset in this pack + (reverse) index. + + + Search for object id with the specified start offset in this pack + (reverse) index. + + start offset of object to find. + object id for this offset, or null if no object was found. + + + + Search for the next offset to the specified offset in this pack (reverse) + index. + + + Search for the next offset to the specified offset in this pack (reverse) + index. + + + start offset of previous object (must be valid-existing + offset). + + + maximum offset in a pack (returned when there is no next + offset). + + + offset of the next object in a pack or maxOffset if provided + offset was the last one. + + when there is no object with the provided offset. + + + + + Traditional file system based + NGit.RefDatabase + . +

+ This is the classical reference database representation for a Git repository. + References are stored in two formats: loose, and packed. +

+ Loose references are stored as individual files within the + refs/ + directory. The file name matches the reference name and the file contents is + the current + NGit.ObjectId + in string form. +

+ Packed references are stored in a single text file named + packed-refs + . + In the packed format, each reference is stored on its own line. This file + reduces the number of files needed for large reference spaces, reducing the + overall size of a Git repository on disk. +

+
+ + Magic string denoting the start of a symbolic reference file. + Magic string denoting the start of a symbolic reference file. + + + Magic string denoting the header of a packed-refs file. + Magic string denoting the header of a packed-refs file. + + + If in the header, denotes the file has peeled data. + If in the header, denotes the file has peeled data. + + + The names of the additional refs supported by this class + + + Immutable sorted list of loose references. + + Immutable sorted list of loose references. +

+ Symbolic references in this collection are stored unresolved, that is + their target appears to be a new reference with no ObjectId. These are + converted into resolved references during a get operation, ensuring the + live value is always returned. + + + +

Immutable sorted list of packed references. + Immutable sorted list of packed references. +
+ + Number of modifications made to this database. + + Number of modifications made to this database. +

+ This counter is incremented when a change is made, or detected from the + filesystem during a read operation. + + + +

+ Last + modCnt + that we sent to listeners. +

+ This value is compared to + modCnt + , and a notification is sent to + the listeners only when it differs. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Adds a set of refs to the set of packed-refs. + + Adds a set of refs to the set of packed-refs. Only non-symbolic refs are + added. If a ref with the given name already existed in packed-refs it is + updated with the new value. Each loose ref which was added to the + packed-ref file is deleted. If a given ref can't be locked it will not be + added to the pack file. + + the refs to be added. Must be fully qualified. + System.IO.IOException + + + Make sure a ref is peeled and has the Storage PACKED. + + Make sure a ref is peeled and has the Storage PACKED. If the given ref + has this attributes simply return it. Otherwise create a new peeled + NGit.ObjectIdRef + where Storage is set to PACKED. + + + a ref for Storage PACKED having the same name, id, peeledId as f + NGit.Errors.MissingObjectException + + System.IO.IOException + + + + + + + + + + + + + + + + + + + + + + + + + + + If the parent should fire listeners, fires them. + If the parent should fire listeners, fires them. + + + Create a reference update to write a temporary reference. + Create a reference update to write a temporary reference. + an update for a new temporary reference. + a temporary name cannot be allocated. + + + Locate the file on disk for a single reference name. + Locate the file on disk for a single reference name. + + name of the ref, relative to the Git repository top level + directory (so typically starts with refs/). + + the loose file location. + + + + + + + + + + Specialized variant of an ArrayList to support a + RefDatabase + . +

+ This list is a hybrid of a Map<String,Ref> and of a List<Ref>. It + tracks reference instances by name by keeping them sorted and performing + binary search to locate an entry. Lookup time is O(log N), but addition and + removal is O(N + log N) due to the list expansion or contraction costs. +

+ This list type is copy-on-write. Mutation methods return a new copy of the + list, leaving + this + unmodified. As a result we cannot easily implement + the + System.Collections.IList<E> + interface contract. +

+
+ + an empty unmodifiable reference list. + + + Initialize this list to use the same backing array as another list. + Initialize this list to use the same backing array as another list. + the source list. + + + + this cast as an immutable, standard + System.Collections.IList<E> + . + + + + number of items in this list. + + + true if the size of this list is 0. + + + Locate an entry by name. + Locate an entry by name. + the name of the reference to find. + + the index the reference is at. If the entry is not present + returns a negative value. The insertion position for the given + name can be computed from + -(index + 1) + . + + + + Determine if a reference is present. + Determine if a reference is present. + name of the reference to find. + true if the reference is present; false if it is not. + + + Get a reference object by name. + Get a reference object by name. + the name of the reference. + the reference object; null if it does not exist in this list. + + + Get the reference at a particular index. + Get the reference at a particular index. + + the index to obtain. Must be + 0 <= idx < size() + . + + the reference value, never null. + + + + Obtain a builder initialized with the first + n + elements. +

+ Copies the first + n + elements from this list into a new builder, + which can be used by the caller to add additional elements. +

+ the number of elements to copy. + + a new builder with the first + n + elements already added. + +
+ + Obtain a new copy of the list after changing one element. + + Obtain a new copy of the list after changing one element. +

+ This list instance is not affected by the replacement. Because this + method copies the entire list, it runs in O(N) time. + + index of the element to change. + the new value, must not be null. + + copy of this list, after replacing + idx + with + ref + . + + + +

Add an item at a specific index. + + Add an item at a specific index. +

+ This list instance is not affected by the addition. Because this method + copies the entire list, it runs in O(N) time. + + + position to add the item at. If negative the method assumes it + was a direct return value from + RefList<T>.Find(string) + and will + adjust it to the correct position. + + the new reference to insert. + + copy of this list, after making space for and adding + ref + . + + + +

Remove an item at a specific index. + + Remove an item at a specific index. +

+ This list instance is not affected by the addition. Because this method + copies the entire list, it runs in O(N) time. + + position to remove the item from. + + copy of this list, after making removing the item at + idx + . + + + +

Store a reference, adding or replacing as necessary. + + Store a reference, adding or replacing as necessary. +

+ This list instance is not affected by the store. The correct position is + determined, and the item is added if missing, or replaced if existing. + Because this method copies the entire list, it runs in O(N + log N) time. + + the reference to store. + copy of this list, after performing the addition or replacement. + + +

+ Rename any reference stored by + RefDirectory + . +

+ This class works by first renaming the source reference to a temporary name, + then renaming the temporary name to the final destination reference. +

+ This strategy permits switching a reference like + refs/heads/foo + , + which is a file, to + refs/heads/foo/bar + , which is stored inside a + directory that happens to match the source name. +

+
+ + The value of the source reference at the start of the rename. + + The value of the source reference at the start of the rename. +

+ At the end of the rename the destination reference must have this same + value, otherwise we have a concurrent update and the rename must fail + without making any changes. + + + +

True if HEAD must be moved to the destination reference. + True if HEAD must be moved to the destination reference. +
+ + + A reference we backup + objId + into during the rename. + + + + + + + + Updates any reference stored by + RefDirectory + . + + + + + + + + + + + + + + + + Utility for reading reflog entries + + + + + + + Get the last entry in the reflog + the latest reflog entry, or null if no log + System.IO.IOException + + + all reflog entries in reverse order + System.IO.IOException + + + + Get specific entry in the reflog relative to the last entry which is + considered entry zero. + + + Get specific entry in the reflog relative to the last entry which is + considered entry zero. + + + reflog entry or null if not found + System.IO.IOException + + + max number of entries to read + all reflog entries in reverse order + System.IO.IOException + + + Loose object loader. + Loose object loader. This class loads an object not stored in a pack. + + + Parse an object from the unpacked object format. + Parse an object from the unpacked object format. + complete contents of the compressed object. + + expected ObjectId of the object, used only for error reporting + in exceptions. + + loader to read the inflated contents. + the object cannot be parsed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Remembers objects that are currently unpacked. + Remembers objects that are currently unpacked. + + + + Caches slices of a + PackFile + in memory for faster read access. +

+ The WindowCache serves as a Java based "buffer cache", loading segments of a + PackFile into the JVM heap prior to use. As JGit often wants to do reads of + only tiny slices of a file, the WindowCache tries to smooth out these tiny + reads into larger block-sized IO operations. +

+ Whenever a cache miss occurs, + Load(PackFile, long) + is invoked by + exactly one thread for the given (PackFile,position) key tuple. + This is ensured by an array of locks, with the tuple hashed to a lock + instance. +

+ During a miss, older entries are evicted from the cache so long as + IsFull() + returns true. +

+ Its too expensive during object access to be 100% accurate with a least + recently used (LRU) algorithm. Strictly ordering every read is a lot of + overhead that typically doesn't yield a corresponding benefit to the + application. +

+ This cache implements a loose LRU policy by randomly picking a window + comprised of roughly 10% of the cache, and evicting the oldest accessed entry + within that window. +

+ Entities created by the cache are held under SoftReferences, permitting the + Java runtime's garbage collector to evict entries when heap memory gets low. + Most JREs implement a loose least recently used algorithm for this eviction. +

+ The internal hash table does not expand at runtime, instead it is fixed in + size at cache creation time. The internal lock table used to gate load + invocations is also fixed in size. +

+ The key tuple is passed through to methods as a pair of parameters rather + than as a single Object, thus reducing the transient memory allocations of + callers. It is more efficient to avoid the allocation, as we can't be 100% + sure that a JIT would be able to stack-allocate a key tuple. +

+ This cache has an implementation rule such that: +

    +
  • + Load(PackFile, long) + is invoked by at most one thread at a time + for a given (PackFile,position) tuple.
  • +
  • For every load() invocation there is exactly one + CreateRef(PackFile, long, ByteWindow) + + invocation to wrap a + SoftReference around the cached entity.
  • +
  • For every Reference created by createRef() there will be + exactly one call to + Clear(Ref) + to cleanup any resources associated + with the (now expired) cached entity.
  • +
+

+ Therefore, it is safe to perform resource accounting increments during the + Load(PackFile, long) + or + CreateRef(PackFile, long, ByteWindow) + + methods, and matching + decrements during + Clear(Ref) + . Implementors may need to override + CreateRef(PackFile, long, ByteWindow) + + in order to embed additional + accounting information into an implementation specific + Ref + subclass, + as the cached entity may have already been evicted by the JRE's garbage + collector. +

+ To maintain higher concurrency workloads, during eviction only one thread + performs the eviction work, while other threads can continue to insert new + objects in parallel. This means that the cache can be temporarily over limit, + especially if the nominated eviction thread is being starved relative to the + other threads. +

+
+ + Modify the configuration of the window cache. + + Modify the configuration of the window cache. +

+ The new configuration is applied immediately. If the new limits are + smaller than what what is currently cached, older entries will be purged + as soon as possible to allow the cache to meet the new limit. + + maximum number of bytes to hold within this instance. + + number of bytes per window within the cache. + true to enable use of mmap when creating windows. + number of bytes to hold in the delta base cache. + + + +

Modify the configuration of the window cache. + + Modify the configuration of the window cache. +

+ The new configuration is applied immediately. If the new limits are + smaller than what what is currently cached, older entries will be purged + as soon as possible to allow the cache to meet the new limit. + + the new window cache configuration. + + the cache configuration contains one or more invalid + settings, usually too low of a limit. + + + + + + +

ReferenceQueue to cleanup released and garbage collected windows. + ReferenceQueue to cleanup released and garbage collected windows. +
+ + + Number of entries in + table + . + + + + Access clock for loose LRU. + Access clock for loose LRU. + + + Hash bucket directory; entries are chained below. + Hash bucket directory; entries are chained below. + + + Locks to prevent concurrent loads for same (PackFile,position). + Locks to prevent concurrent loads for same (PackFile,position). + + + Lock to elect the eviction thread after a load occurs. + Lock to elect the eviction thread after a load occurs. + + + + Number of + table + buckets to scan for an eviction window. + + + + + + + Lookup a cached object, creating and loading it if it doesn't exist. + Lookup a cached object, creating and loading it if it doesn't exist. + the pack that "contains" the cached object. + offset within pack of the object. + the object reference. + + the object reference was not in the cache and could not be + obtained by + Load(PackFile, long) + . + + + + Clear every entry from the cache. + + Clear every entry from the cache. +

+ This is a last-ditch effort to clear out the cache, such as before it + gets replaced by another cache that is configured differently. This + method tries to force every cached entry through + Clear(Ref) + to + ensure that resources are correctly accounted for and cleaned up by the + subclass. A concurrent reader loading entries while this method is + running may cause resource accounting failures. + + + +

Clear all entries related to a single file. + + Clear all entries related to a single file. +

+ Typically this method is invoked during + PackFile.Close() + , when we + know the pack is never going to be useful to us again (for example, it no + longer exists on disk). A concurrent reader loading an entry from this + same pack may cause the pack to become stuck in the cache anyway. + + the file to purge all entries of. + + +

Next entry in the hash table's chain list. + Next entry in the hash table's chain list. +
+ + The referenced object. + The referenced object. + + + Marked true when ref.get() returns null and the ref is dead. + + Marked true when ref.get() returns null and the ref is dead. +

+ A true here indicates that the ref is no longer accessible, and that + we therefore need to eventually purge this Entry object out of the + bucket's chain. + + + +

A soft reference wrapped around a cached object. + A soft reference wrapped around a cached object. +
+ + + Configuration parameters for + WindowCache + . + + + + 1024 (number of bytes in one kibibyte/kilobyte) + + + + 1024 + KB + (number of bytes in one mebibyte/megabyte) + + + + Create a default configuration. + Create a default configuration. + + + + maximum number of streams to open at a time. Open packs count + against the process limits. Default is 128. + + + + + maximum number of streams to open at a time. Open packs count + against the process limits + + + + + maximum number bytes of heap memory to dedicate to caching pack + file data. Default is 10 MB. + + + + + maximum number bytes of heap memory to dedicate to caching + pack file data. + + + + + size in bytes of a single window mapped or read in from the pack + file. Default is 8 KB. + + + + size in bytes of a single window read in from the pack file. + + + + + true enables use of Java NIO virtual memory mapping for windows; + false reads entire window into a byte[] with standard read calls. + Default false. + + + + + true enables use of Java NIO virtual memory mapping for + windows; false reads entire window into a byte[] with standard + read calls. + + + + + maximum number of bytes to cache in + DeltaBaseCache + for inflated, recently accessed objects, without delta chains. + Default 10 MB. + + + + + maximum number of bytes to cache in + DeltaBaseCache + for inflated, recently accessed + objects, without delta chains. + + + + the size threshold beyond which objects must be streamed. + + + + new byte limit for objects that must be streamed. Objects + smaller than this size can be obtained as a contiguous byte + array, while objects bigger than this size require using an + NGit.ObjectStream + . + + + + Update properties by setting fields from the configuration. + + Update properties by setting fields from the configuration. +

+ If a property is not defined in the configuration, then it is left + unmodified. + + configuration to read properties from. + + +

Active handle to a ByteWindow. + Active handle to a ByteWindow. +
+ + + Extension of + NGit.ObjectReader + that supports reusing objects in packs. +

+ ObjectReader + implementations may also optionally implement this + interface to support + PackWriter + with a means of copying an object + that is already in pack encoding format directly into the output stream, + without incurring decompression and recompression overheads. +

+
+ + + Allocate a new + PackWriter + state structure for an object. +

+ PackWriter + allocates these objects to keep track of the + per-object state, and how to load the objects efficiently into the + generated stream. Implementers may subclass this type with additional + object state, such as to remember what file and offset contains the + object's pack encoded data. +

+ + identity of the object that will be packed. The object's + parsed status is undefined here. Implementers must not rely on + the object being parsed. + + a new instance for this object. +
+ + Select the best object representation for a packer. + + Select the best object representation for a packer. +

+ Implementations should iterate through all available representations of + an object, and pass them in turn to the PackWriter though + PackWriter.Select(ObjectToPack, StoredObjectRepresentation) + + so + the writer can select the most suitable representation to reuse into the + output stream. +

+ If the implementation returns CachedPack from + GetCachedPacks() + , + it must consider the representation of any object that is stored in any + of the offered CachedPacks. PackWriter relies on this behavior to prune + duplicate objects out of the pack stream when it selects a CachedPack and + the object was also reached through the thin-pack enumeration. +

+ The implementation may choose to consider multiple objects at once on + concurrent threads, but must evaluate all representations of an object + within the same thread. + + the packer that will write the object in the near future. + + progress monitor, implementation should update the monitor + once for each item in the iteration when selection is done. + + the objects that are being packed. + + there is no representation available for the object, as it is + no longer in the repository. Packing will abort. + + the repository cannot be accessed. Packing will abort. + + + +

Write objects to the pack stream in roughly the order given. + + Write objects to the pack stream in roughly the order given. + PackWriter + invokes this method to write out one or more objects, + in approximately the order specified by the iteration over the list. A + simple implementation of this method would just iterate the list and + output each object: +
+            for (ObjectToPack obj : list)
+            out.writeObject(obj)
+            
+ However more sophisticated implementors may try to perform some (small) + reordering to access objects that are stored close to each other at + roughly the same time. Implementations may choose to write objects out of + order, but this may increase pack file size due to using a larger header + format to reach a delta base that is later in the stream. It may also + reduce data locality for the reader, slowing down data access. + Invoking + PackOutputStream.WriteObject(ObjectToPack) + + will cause + CopyObjectAsIs(PackOutputStream, ObjectToPack, bool) + + to be + invoked recursively on + this + if the current object is scheduled + for reuse. +
+ the stream to write each object to. + + the list of objects to write. Objects should be written in + approximately this order. Implementors may resort the list + elements in-place during writing if desired. + + + the stream cannot be written to, or one or more required + objects cannot be accessed from the object database. + +
+ + Output a previously selected representation. + + Output a previously selected representation. +

+ PackWriter + invokes this method only if a representation + previously given to it by + selectObjectRepresentation + was chosen + for reuse into the output stream. The + otp + argument is an instance + created by this reader's own + newObjectToPack + , and the + representation data saved within it also originated from this reader. +

+ Implementors must write the object header before copying the raw data to + the output stream. The typical implementation is like: +

+            MyToPack mtp = (MyToPack) otp;
+            byte[] raw;
+            if (validate)
+            raw = validate(mtp); // throw SORNAE here, if at all
+            else
+            raw = readFast(mtp);
+            out.writeHeader(mtp, mtp.inflatedSize);
+            out.write(raw);
+            
+
+ stream the object should be written to. + the object's saved representation information. + + if true the representation must be validated and not be + corrupt before being reused. If false, validation may be + skipped as it will be performed elsewhere in the processing + pipeline. + + + the previously selected representation is no longer + available. If thrown before + out.writeHeader + the pack + writer will try to find another representation, and write + that one instead. If throw after + out.writeHeader + , + packing will abort. + + + the stream's write method threw an exception. Packing will + abort. + +
+ + Obtain the available cached packs. + + Obtain the available cached packs. +

+ A cached pack has known starting points and may be sent entirely as-is, + with almost no effort on the sender's part. + + the available cached packs. + + the cached packs cannot be listed from the repository. + Callers may choose to ignore this and continue as-if there + were no cached packs. + + + +

Append an entire pack's contents onto the output stream. + + Append an entire pack's contents onto the output stream. +

+ The entire pack, excluding its header and trailing footer is sent. + + stream to append the pack onto. + the cached pack to send. + + if true the representation must be validated and not be + corrupt before being reused. If false, validation may be + skipped as it will be performed elsewhere in the processing + pipeline. + + the pack cannot be read, or stream did not accept a write. + + + +

Temporary buffer large enough for at least one raw object id. + Temporary buffer large enough for at least one raw object id. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Copy bytes from the window to a caller supplied buffer. + Copy bytes from the window to a caller supplied buffer. + the file the desired window is stored within. + position within the file to read from. + destination buffer to copy into. + offset within dstbuf to start copying into. + + number of bytes to copy. This value may exceed the number of + bytes remaining in the window starting at offset + pos. + + + number of bytes actually copied; this may be less than + cnt if cnt exceeded the number of bytes + available. + + + this cursor does not match the provider or id and the proper + window could not be acquired through the provider's cache. + + + + + + + + + + + Inflate a region of the pack starting at + position + . + + the file the desired window is stored within. + position within the file to read from. + + destination buffer the inflater should output decompressed + data to. + + current offset within dstbuf to inflate into. + + updated dstoff based on the number of bytes + successfully inflated into dstbuf. + + + this cursor does not match the provider or id and the proper + window could not be acquired through the provider's cache. + + + the inflater encountered an invalid chunk of data. Data + stream corruption is likely. + + + + + + + + + + Release the current window cursor. + Release the current window cursor. + + + Recreate a stream from a base stream and a GIT pack delta. + + Recreate a stream from a base stream and a GIT pack delta. +

+ This entire class is heavily cribbed from patch-delta.c in the + GIT project. The original delta patching code was written by Nicolas Pitre + (<nico@cam.org>). + + + +

Length of the base object in the delta stream. + Length of the base object in the delta stream. + the delta stream, or at least the header of it. + the base object's size. +
+ + Length of the resulting object in the delta stream. + Length of the resulting object in the delta stream. + the delta stream, or at least the header of it. + the resulting object's size. + + + + Apply the changes defined by delta to the data in base, yielding a new + array of bytes. + + + Apply the changes defined by delta to the data in base, yielding a new + array of bytes. + + some byte representing an object of some kind. + + a git pack delta defining the transform from one version to + another. + + patched base + + + + Apply the changes defined by delta to the data in base, yielding a new + array of bytes. + + + Apply the changes defined by delta to the data in base, yielding a new + array of bytes. + + some byte representing an object of some kind. + + a git pack delta defining the transform from one version to + another. + + + array to store the result into. If null the result will be + allocated and returned. + + + either + result + , or the result array allocated. + + + + Format this delta as a human readable string. + Format this delta as a human readable string. + the delta instruction sequence to format. + the formatted delta. + + + Format this delta as a human readable string. + Format this delta as a human readable string. + the delta instruction sequence to format. + + true if the header (base size and result size) should be + included in the formatting. + + the formatted delta. + + + + Encodes an instruction stream for + BinaryDelta + . + + + + Maximum number of bytes to be copied in pack v2 format. + + Maximum number of bytes to be copied in pack v2 format. +

+ Historical limitations have this at 64k, even though current delta + decoders recognize larger copy instructions. + + + +

Maximum number of bytes used by a copy instruction. + Maximum number of bytes used by a copy instruction. +
+ + Maximum length that an an insert command can encode at once. + Maximum length that an an insert command can encode at once. + + + Create an encoder with no upper bound on the instruction stream size. + Create an encoder with no upper bound on the instruction stream size. + buffer to store the instructions written. + size of the base object, in bytes. + + size of the resulting object, after applying this instruction + stream to the base object, in bytes. + + + the output buffer cannot store the instruction stream's + header with the size fields. + + + + Create an encoder with an upper limit on the instruction size. + Create an encoder with an upper limit on the instruction size. + buffer to store the instructions written. + size of the base object, in bytes. + + size of the resulting object, after applying this instruction + stream to the base object, in bytes. + + + maximum number of bytes to write to the out buffer declaring + the stream is over limit and should be discarded. May be 0 to + specify an infinite limit. + + + the output buffer cannot store the instruction stream's + header with the size fields. + + + + + + + current size of the delta stream, in bytes. + + + Insert a literal string of text, in UTF-8 encoding. + Insert a literal string of text, in UTF-8 encoding. + the string to insert. + + true if the insert fits within the limit; false if the insert + would cause the instruction stream to exceed the limit. + + the instruction buffer can't store the instructions. + + + + Insert a literal binary sequence. + Insert a literal binary sequence. + the binary to insert. + + true if the insert fits within the limit; false if the insert + would cause the instruction stream to exceed the limit. + + the instruction buffer can't store the instructions. + + + + Insert a literal binary sequence. + Insert a literal binary sequence. + the binary to insert. + + offset within + text + to start copying from. + + number of bytes to insert. + + true if the insert fits within the limit; false if the insert + would cause the instruction stream to exceed the limit. + + the instruction buffer can't store the instructions. + + + + Create a copy instruction to copy from the base object. + Create a copy instruction to copy from the base object. + + position in the base object to copy from. This is absolute, + from the beginning of the base. + + number of bytes to copy. + + true if the copy fits within the limit; false if the copy + would cause the instruction stream to exceed the limit. + + the instruction buffer cannot store the instructions. + + + + Index of blocks in a source file. + + Index of blocks in a source file. +

+ The index can be passed a result buffer, and output an instruction sequence + that transforms the source buffer used by the index into the result buffer. + The instruction sequence can be executed by + BinaryDelta + or + DeltaStream + to recreate the result buffer. +

+ An index stores the entire contents of the source buffer, but also a table of + block identities mapped to locations where the block appears in the source + buffer. The mapping table uses 12 bytes for every 16 bytes of source buffer, + and is therefore ~75% of the source buffer size. The overall index is ~1.75x + the size of the source buffer. This relationship holds for any JVM, as only a + constant number of objects are allocated per index. Callers can use the + method + GetIndexSize() + to obtain a reasonably accurate estimate of + the complete heap space used by this index. +

+ A + DeltaIndex + is thread-safe. Concurrent threads can use the same + index to encode delta instructions for different result buffers. + + + +

Number of bytes in a block. + Number of bytes in a block. +
+ + Maximum number of positions to consider for a given content hash. + + Maximum number of positions to consider for a given content hash. +

+ All positions with the same content hash are stored into a single chain. + The chain size is capped to ensure delta encoding stays linear time at + O(len_src + len_dst) rather than quadratic at O(len_src * len_dst). + + + +

Estimate the size of an index for a given source. + + Estimate the size of an index for a given source. +

+ This is roughly a worst-case estimate. The actual index may be smaller. + + length of the source, in bytes. + + estimated size. Approximately + 1.75 * sourceLength + . + + + +

Original source file that we indexed. + Original source file that we indexed. +
+ + + Pointers into the + entries + table, indexed by block hash. +

+ A block hash is masked with + tableMask + to become the array index + of this table. The value stored here is the first index within + entries + that starts the consecutive list of blocks with that + same masked hash. If there are no matching blocks, 0 is stored instead. +

+ Note that this table is always a power of 2 in size, to support fast + normalization of a block hash into an array index. +

+
+ + + Pairs of block hash value and + src + offsets. +

+ The very first entry in this table at index 0 is always empty, this is to + allow fast evaluation when + table + has no values under any given + slot. Remaining entries are pairs of integers, with the upper 32 bits + holding the block hash and the lower 32 bits holding the source offset. +

+
+ + + Mask to make block hashes into an array index for + table + . + + + + Construct an index from the source file. + Construct an index from the source file. + + the source file's raw contents. The buffer will be held by the + index instance to facilitate matching, and therefore must not + be modified by the caller. + + + + size of the source buffer this index has scanned. + + + Get an estimate of the memory required by this index. + Get an estimate of the memory required by this index. + + an approximation of the number of bytes used by this index in + memory. The size includes the cached source buffer size from + GetSourceSize() + , as well as a rough approximation of JVM + object overheads. + + + + Generate a delta sequence to recreate the result buffer. + + Generate a delta sequence to recreate the result buffer. +

+ There is no limit on the size of the delta sequence created. This is the + same as + encode(out, res, 0) + . + + + stream to receive the delta instructions that can transform + this index's source buffer into + res + . This stream + should be buffered, as instructions are written directly to it + in small bursts. + + + the desired result buffer. The generated instructions will + recreate this buffer when applied to the source buffer stored + within this index. + + the output stream refused to write the instructions. + + + +

Generate a delta sequence to recreate the result buffer. + Generate a delta sequence to recreate the result buffer. + + stream to receive the delta instructions that can transform + this index's source buffer into + res + . This stream + should be buffered, as instructions are written directly to it + in small bursts. If the caller might need to discard the + instructions (such as when deltaSizeLimit would be exceeded) + the caller is responsible for discarding or rewinding the + stream when this method returns false. + + + the desired result buffer. The generated instructions will + recreate this buffer when applied to the source buffer stored + within this index. + + + maximum number of bytes that the delta instructions can + occupy. If the generated instructions would be longer than + this amount, this method returns false. If 0, there is no + limit on the length of delta created. + + + true if the delta is smaller than deltaSizeLimit; false if the + encoder aborted because the encoded delta instructions would be + longer than deltaSizeLimit bytes. + + the output stream refused to write the instructions. + +
+ + + + + + Supports + DeltaIndex + by performing a partial scan of the content. + + + + + + + Maximum number of bytes to admit to the window at once. + Maximum number of bytes to admit to the window at once. + + + Maximum depth we should create for any delta chain. + Maximum depth we should create for any delta chain. + + + Amount of memory we have loaded right now. + Amount of memory we have loaded right now. + + + + Position of + res + within + window + array. + + + + Maximum delta chain depth the current object can have. + + Maximum delta chain depth the current object can have. +

+ This can be smaller than + maxDepth + . + + + +

Window entry of the object we are currently considering. + Window entry of the object we are currently considering. +
+ + + If we have a delta for + res + , this is the shortest found yet. + + + + + If we have + bestDelta + , the window position it was created by. + + + + Used to compress cached deltas. + Used to compress cached deltas. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Complete contents of this object. + Complete contents of this object. Lazily loaded. + + + Index of this object's content, to encode other deltas. + Index of this object's content, to encode other deltas. Lazily loaded. + + + current delta chain depth of this object. + + + type of the object in this window entry. + + + estimated unpacked size of the object, in bytes . + + + true if there is no object stored in this entry. + + + + Configuration used by a + PackWriter + when constructing the stream. + A configuration may be modified once created, but should not be modified + while it is being used by a PackWriter. If a configuration is not modified it + is safe to share the same configuration instance between multiple concurrent + threads executing different PackWriters. + + + + + Default value of deltas reuse option: + + + SetReuseDeltas(bool) + + + + Default value of objects reuse option: + + + SetReuseObjects(bool) + + + + Default value of delta compress option: + + + SetDeltaCompress(bool) + + + + Default value of delta base as offset option: + + + SetDeltaBaseAsOffset(bool) + + + + Default value of maximum delta chain depth: + + + SetMaxDeltaDepth(int) + + + + Default window size during packing: + + + SetDeltaSearchWindowSize(int) + + + + Default big file threshold: + + + SetBigFileThreshold(int) + + + + Default delta cache size: + + + SetDeltaCacheSize(long) + + + + Default delta cache limit: + + + SetDeltaCacheLimit(int) + + + + Default index version: + + + SetIndexVersion(int) + + + Create a default configuration. + Create a default configuration. + + + Create a configuration honoring the repository's settings. + Create a configuration honoring the repository's settings. + + the repository to read settings from. The repository is not + retained by the new configuration, instead its settings are + copied during the constructor. + + + + + Create a configuration honoring settings in a + NGit.Config + . + + + the source to read settings from. The source is not retained + by the new configuration, instead its settings are copied + during the constructor. + + + + Copy an existing configuration to a new instance. + Copy an existing configuration to a new instance. + the source configuration to copy from. + + + Check whether to reuse deltas existing in repository. + + Check whether to reuse deltas existing in repository. + Default setting: + #DEFAULT_REUSE_DELTAS + + true if object is configured to reuse deltas; false otherwise. + + + Set reuse deltas configuration option for the writer. + + Set reuse deltas configuration option for the writer. + When enabled, writer will search for delta representation of object in + repository and use it if possible. Normally, only deltas with base to + another object existing in set of objects to pack will be used. The + exception however is thin-packs where the base object may exist on the + other side. + When raw delta data is directly copied from a pack file, its checksum is + computed to verify the data is not corrupt. + Default setting: + #DEFAULT_REUSE_DELTAS + + boolean indicating whether or not try to reuse deltas. + + + Checks whether to reuse existing objects representation in repository. + + Checks whether to reuse existing objects representation in repository. + Default setting: + #DEFAULT_REUSE_OBJECTS + + + true if writer is configured to reuse objects representation from + pack; false otherwise. + + + + Set reuse objects configuration option for the writer. + + Set reuse objects configuration option for the writer. + If enabled, writer searches for compressed representation in a pack file. + If possible, compressed data is directly copied from such a pack file. + Data checksum is verified. + Default setting: + #DEFAULT_REUSE_OBJECTS + + + boolean indicating whether or not writer should reuse existing + objects representation. + + + + True if writer can use offsets to point to a delta base. + + True if writer can use offsets to point to a delta base. + If true the writer may choose to use an offset to point to a delta base + in the same pack, this is a newer style of reference that saves space. + False if the writer has to use the older (and more compatible style) of + storing the full ObjectId of the delta base. + Default setting: + #DEFAULT_DELTA_BASE_AS_OFFSET + + + true if delta base is stored as an offset; false if it is stored + as an ObjectId. + + + + Set writer delta base format. + + Set writer delta base format. + Delta base can be written as an offset in a pack file (new approach + reducing file size) or as an object id (legacy approach, compatible with + old readers). + Default setting: + #DEFAULT_DELTA_BASE_AS_OFFSET + + + boolean indicating whether delta base can be stored as an + offset. + + + + Check whether the writer will create new deltas on the fly. + + Check whether the writer will create new deltas on the fly. + Default setting: + #DEFAULT_DELTA_COMPRESS + + + true if the writer will create a new delta when either + IsReuseDeltas() + is false, or no suitable delta is + available for reuse. + + + + Set whether or not the writer will create new deltas on the fly. + + Set whether or not the writer will create new deltas on the fly. + Default setting: + #DEFAULT_DELTA_COMPRESS + + + true to create deltas when + IsReuseDeltas() + is false, + or when a suitable delta isn't available for reuse. Set to + false to write whole objects instead. + + + + Get maximum depth of delta chain set up for the writer. + + Get maximum depth of delta chain set up for the writer. + Generated chains are not longer than this value. + Default setting: + #DEFAULT_MAX_DELTA_DEPTH + + maximum delta chain depth. + + + Set up maximum depth of delta chain for the writer. + + Set up maximum depth of delta chain for the writer. + Generated chains are not longer than this value. Too low value causes low + compression level, while too big makes unpacking (reading) longer. + Default setting: + #DEFAULT_MAX_DELTA_DEPTH + + maximum delta chain depth. + + + Get the number of objects to try when looking for a delta base. + + Get the number of objects to try when looking for a delta base. + This limit is per thread, if 4 threads are used the actual memory used + will be 4 times this value. + Default setting: + #DEFAULT_DELTA_SEARCH_WINDOW_SIZE + + the object count to be searched. + + + Set the number of objects considered when searching for a delta base. + + Set the number of objects considered when searching for a delta base. + Default setting: + #DEFAULT_DELTA_SEARCH_WINDOW_SIZE + + number of objects to search at once. Must be at least 2. + + + + Get maximum number of bytes to put into the delta search window. + + Get maximum number of bytes to put into the delta search window. + Default setting is 0, for an unlimited amount of memory usage. Actual + memory used is the lower limit of either this setting, or the sum of + space used by at most + GetDeltaSearchWindowSize() + objects. + This limit is per thread, if 4 threads are used the actual memory limit + will be 4 times this value. + + the memory limit. + + + Set the maximum number of bytes to put into the delta search window. + + Set the maximum number of bytes to put into the delta search window. + Default setting is 0, for an unlimited amount of memory usage. If the + memory limit is reached before + GetDeltaSearchWindowSize() + the + window size is temporarily lowered. + + Maximum number of bytes to load at once, 0 for unlimited. + + + + Get the size of the in-memory delta cache. + + Get the size of the in-memory delta cache. + This limit is for the entire writer, even if multiple threads are used. + Default setting: + #DEFAULT_DELTA_CACHE_SIZE + + + maximum number of bytes worth of delta data to cache in memory. + If 0 the cache is infinite in size (up to the JVM heap limit + anyway). A very tiny size such as 1 indicates the cache is + effectively disabled. + + + + Set the maximum number of bytes of delta data to cache. + + Set the maximum number of bytes of delta data to cache. + During delta search, up to this many bytes worth of small or hard to + compute deltas will be stored in memory. This cache speeds up writing by + allowing the cached entry to simply be dumped to the output stream. + Default setting: + #DEFAULT_DELTA_CACHE_SIZE + + + number of bytes to cache. Set to 0 to enable an infinite + cache, set to 1 (an impossible size for any delta) to disable + the cache. + + + + Maximum size in bytes of a delta to cache. + + Maximum size in bytes of a delta to cache. + Default setting: + #DEFAULT_DELTA_CACHE_LIMIT + + maximum size (in bytes) of a delta that should be cached. + + + Set the maximum size of a delta that should be cached. + + Set the maximum size of a delta that should be cached. + During delta search, any delta smaller than this size will be cached, up + to the + GetDeltaCacheSize() + maximum limit. This speeds up writing + by allowing these cached deltas to be output as-is. + Default setting: + #DEFAULT_DELTA_CACHE_LIMIT + + maximum size (in bytes) of a delta to be cached. + + + Get the maximum file size that will be delta compressed. + + Get the maximum file size that will be delta compressed. + Files bigger than this setting will not be delta compressed, as they are + more than likely already highly compressed binary data files that do not + delta compress well, such as MPEG videos. + Default setting: + #DEFAULT_BIG_FILE_THRESHOLD + + the configured big file threshold. + + + Set the maximum file size that should be considered for deltas. + + Set the maximum file size that should be considered for deltas. + Default setting: + #DEFAULT_BIG_FILE_THRESHOLD + + the limit, in bytes. + + + Get the compression level applied to objects in the pack. + + Get the compression level applied to objects in the pack. + Default setting: + java.util.zip.Deflater#DEFAULT_COMPRESSION + + + current compression level, see + ICSharpCode.SharpZipLib.Zip.Compression.Deflater + + . + + + + Set the compression level applied to objects in the pack. + + Set the compression level applied to objects in the pack. + Default setting: + java.util.zip.Deflater#DEFAULT_COMPRESSION + + + compression level, must be a valid level recognized by the + ICSharpCode.SharpZipLib.Zip.Compression.Deflater + + class. + + + + Get the number of threads used during delta compression. + + Get the number of threads used during delta compression. + Default setting: 0 (auto-detect processors) + + + number of threads used for delta compression. 0 will auto-detect + the threads to the number of available processors. + + + + Set the number of threads to use for delta compression. + + Set the number of threads to use for delta compression. + During delta compression, if there are enough objects to be considered + the writer will start up concurrent threads and allow them to compress + different sections of the repository concurrently. + An application thread pool can be set by + SetExecutor(Sharpen.Executor) + . + If not set a temporary pool will be created by the writer, and torn down + automatically when compression is over. + Default setting: 0 (auto-detect processors) + + + number of threads to use. If <= 0 the number of available + processors for this JVM is used. + + + + the preferred thread pool to execute delta search on. + + + Set the executor to use when using threads. + + Set the executor to use when using threads. + During delta compression if the executor is non-null jobs will be queued + up on it to perform delta compression in parallel. Aside from setting the + executor, the caller must set + SetThreads(int) + to enable threaded + delta search. + + + executor to use for threads. Set to null to create a temporary + executor just for the writer. + + + + Get the pack index file format version this instance creates. + + Get the pack index file format version this instance creates. + Default setting: + #DEFAULT_INDEX_VERSION + + + the index version, the special version 0 designates the oldest + (most compatible) format available for the objects. + + NGit.Storage.File.PackIndexWriter + + + + Set the pack index file format version this instance will create. + + Set the pack index file format version this instance will create. + Default setting: + #DEFAULT_INDEX_VERSION + + + the version to write. The special version 0 designates the + oldest (most compatible) format available for the objects. + + NGit.Storage.File.PackIndexWriter + + + + Update properties by setting fields from the configuration. + + Update properties by setting fields from the configuration. + If a property's corresponding variable is not defined in the supplied + configuration, then it is left unmodified. + + configuration to read properties from. + + + + Custom output stream to support + PackWriter + . + + + + Initialize a pack output stream. + + Initialize a pack output stream. +

+ This constructor is exposed to support debugging the JGit library only. + Application or storage level code should not create a PackOutputStream, + instead use + PackWriter + , and let the writer create the stream. + + monitor to update on object output progress. + target stream to receive all object contents. + packer that is going to perform the output. + + + + + + + + + + + + + + +

Write one object. + + Write one object. + If the object was already written, this method does nothing and returns + quickly. This case occurs whenever an object was written out of order in + order to ensure the delta base occurred before the object that needs it. + + the object to write. + + the object cannot be read from the object reader, or the + output stream is no longer accepting output. Caller must + examine the type of exception and possibly its message to + distinguish between these cases. + +
+ + Commits the object header onto the stream. + + Commits the object header onto the stream. +

+ Once the header has been written, the object representation must be fully + output, or packing must abort abnormally. + + the object to pack. Header information is obtained. + + number of bytes of the inflated content. For an object that is + in whole object format, this is the same as the object size. + For an object that is in a delta format, this is the size of + the inflated delta instruction stream. + + the underlying stream refused to accept the header. + + + + a temporary buffer writers can use to copy data with. + + + total number of bytes written since stream start. + + + obtain the current CRC32 register. + + +

Reinitialize the CRC32 register for a new region. + Reinitialize the CRC32 register for a new region. +
+ + obtain the current SHA-1 digest. + + + +

+ PackWriter class is responsible for generating pack files from specified set + of objects from repository. +

+ +

+ PackWriter class is responsible for generating pack files from specified set + of objects from repository. This implementation produce pack files in format + version 2. +

+ Source of objects may be specified in two ways: +

    +
  • (usually) by providing sets of interesting and uninteresting objects in + repository - all interesting objects and their ancestors except uninteresting + objects and their ancestors will be included in pack, or
  • +
  • by providing iterator of + NGit.Revwalk.RevObject + specifying exact list and + order of objects in pack
  • +
+ Typical usage consists of creating instance intended for some pack, + configuring options, preparing the list of objects by calling + PreparePack(Sharpen.Iterator<E>) + + or + PreparePack(NGit.ProgressMonitor, System.Collections.Generic.ICollection<E>, System.Collections.Generic.ICollection<E>) + + , and finally + producing the stream with + WritePack(NGit.ProgressMonitor, NGit.ProgressMonitor, Sharpen.OutputStream) + . +

+ Class provide set of configurable options and + NGit.ProgressMonitor + support, as operations may take a long time for big repositories. Deltas + searching algorithm is NOT IMPLEMENTED yet - this implementation + relies only on deltas and objects reuse. +

+ This class is not thread safe, it is intended to be used in one thread, with + one instance per created pack. Subsequent calls to writePack result in + undefined behavior. + + + + all allocated, non-released PackWriters instances. + + +

+ reader + recast to the reuse interface, if it supports it. + +
+ + Create writer for specified repository. + + Create writer for specified repository. +

+ Objects for packing are specified in + PreparePack(Sharpen.Iterator<E>) + + or + PreparePack(NGit.ProgressMonitor, System.Collections.Generic.ICollection<E>, System.Collections.Generic.ICollection<E>) + + . + + repository where objects are stored. + + +

Create a writer to load objects from the specified reader. + + Create a writer to load objects from the specified reader. +

+ Objects for packing are specified in + PreparePack(Sharpen.Iterator<E>) + + or + PreparePack(NGit.ProgressMonitor, System.Collections.Generic.ICollection<E>, System.Collections.Generic.ICollection<E>) + + . + + reader to read from the repository with. + + +

Create writer for specified repository. + + Create writer for specified repository. +

+ Objects for packing are specified in + PreparePack(Sharpen.Iterator<E>) + + or + PreparePack(NGit.ProgressMonitor, System.Collections.Generic.ICollection<E>, System.Collections.Generic.ICollection<E>) + + . + + repository where objects are stored. + reader to read from the repository with. + + +

Create writer with a specified configuration. + + Create writer with a specified configuration. +

+ Objects for packing are specified in + PreparePack(Sharpen.Iterator<E>) + + or + PreparePack(NGit.ProgressMonitor, System.Collections.Generic.ICollection<E>, System.Collections.Generic.ICollection<E>) + + . + + configuration for the pack writer. + reader to read from the repository with. + + +

+ Check whether writer can store delta base as an offset (new style + reducing pack size) or should store it as an object id (legacy style, + compatible with old readers). + + + Check whether writer can store delta base as an offset (new style + reducing pack size) or should store it as an object id (legacy style, + compatible with old readers). + Default setting: + PackConfig#DEFAULT_DELTA_BASE_AS_OFFSET + + + true if delta base is stored as an offset; false if it is stored + as an object id. + +
+ + Set writer delta base format. + + Set writer delta base format. Delta base can be written as an offset in a + pack file (new approach reducing file size) or as an object id (legacy + approach, compatible with old readers). + Default setting: + PackConfig#DEFAULT_DELTA_BASE_AS_OFFSET + + + boolean indicating whether delta base can be stored as an + offset. + + + + Check if the writer will reuse commits that are already stored as deltas. + + Check if the writer will reuse commits that are already stored as deltas. + + + true if the writer would reuse commits stored as deltas, assuming + delta reuse is already enabled. + + + + Set the writer to reuse existing delta versions of commits. + Set the writer to reuse existing delta versions of commits. + + if true, the writer will reuse any commits stored as deltas. + By default the writer does not reuse delta commits. + + + + Check if the writer validates objects before copying them. + Check if the writer validates objects before copying them. + + true if validation is enabled; false if the reader will handle + object validation as a side-effect of it consuming the output. + + + + Enable (or disable) object validation during packing. + Enable (or disable) object validation during packing. + + if true the pack writer will validate an object before it is + put into the output. This additional validation work may be + necessary to avoid propagating corruption from one local pack + file to another local pack file. + + + + true if this writer is producing a thin pack. + + + + a boolean indicating whether writer may pack objects with + delta base object not within set of objects to pack, but + belonging to party repository (uninteresting/boundary) as + determined by set; this kind of pack is used only for + transport; true - to produce thin pack, false - otherwise. + + + + true to reuse cached packs. If true index creation isn't available. + + + + if set to true and a cached pack is present, it will be + appended onto the end of a thin-pack, reducing the amount of + working set space and CPU used by PackWriter. Enabling this + feature prevents PackWriter from creating an index for the + newly created pack, so its only suitable for writing to a + network client, where the client will make the index. + + + + + true to ignore objects that are uninteresting and also not found + on local disk; false to throw a + NGit.Errors.MissingObjectException + + out of + PreparePack(NGit.ProgressMonitor, System.Collections.Generic.ICollection<E>, System.Collections.Generic.ICollection<E>) + + if an + uninteresting object is not in the source repository. By default, + true, permitting gracefully ignoring of uninteresting objects. + + + + + true if writer should ignore non existing uninteresting + objects during construction set of objects to pack; false + otherwise - non existing uninteresting objects may cause + NGit.Errors.MissingObjectException + + + + + Set the tag targets that should be hoisted earlier during packing. + + Set the tag targets that should be hoisted earlier during packing. +

+ Callers may put objects into this set before invoking any of the + preparePack methods to influence where an annotated tag's target is + stored within the resulting pack. Typically these will be clustered + together, and hoisted earlier in the file even if they are ancient + revisions, allowing readers to find tag targets with better locality. + + objects that annotated tags point at. + + +

Configure this pack for a shallow clone. + Configure this pack for a shallow clone. + maximum depth to traverse the commit graph + + objects which used to be shallow on the client, but are being + extended as part of this fetch + +
+ + Returns objects number in a pack file that was created by this writer. + Returns objects number in a pack file that was created by this writer. + number of objects in pack. + a cached pack cannot supply its object count. + + + + Add a pack index whose contents should be excluded from the result. + Add a pack index whose contents should be excluded from the result. + objects in this index will not be in the output pack. + + + Prepare the list of objects to be written to the pack stream. + + Prepare the list of objects to be written to the pack stream. +

+ Iterator exactly determines which objects are included in a pack + and order they appear in pack (except that objects order by type is not + needed at input). This order should conform general rules of ordering + objects in git - by recency and path (type and delta-base first is + internally secured) and responsibility for guaranteeing this order is on + a caller side. Iterator must return each id of object to write exactly + once. + + + iterator of object to store in a pack; order of objects within + each type is important, ordering by type is not needed; + allowed types for objects are + NGit.Constants.OBJ_COMMIT + , + NGit.Constants.OBJ_TREE + , + NGit.Constants.OBJ_BLOB + and + NGit.Constants.OBJ_TAG + ; objects returned by iterator may be + later reused by caller as object id and type are internally + copied in each iteration. + + when some I/O problem occur during reading objects. + + + +

Prepare the list of objects to be written to the pack stream. + + Prepare the list of objects to be written to the pack stream. +

+ Basing on these 2 sets, another set of objects to put in a pack file is + created: this set consists of all objects reachable (ancestors) from + interesting objects, except uninteresting objects and their ancestors. + This method uses class + NGit.Revwalk.ObjectWalk + extensively to find out that + appropriate set of output objects and their optimal order in output pack. + Order is consistent with general git in-pack rules: sort by object type, + recency, path and delta-base first. + + progress during object enumeration. + + collection of objects to be marked as interesting (start + points of graph traversal). + + + collection of objects to be marked as uninteresting (end + points of graph traversal). + + when some I/O problem occur during reading objects. + + + +

Prepare the list of objects to be written to the pack stream. + + Prepare the list of objects to be written to the pack stream. +

+ Basing on these 2 sets, another set of objects to put in a pack file is + created: this set consists of all objects reachable (ancestors) from + interesting objects, except uninteresting objects and their ancestors. + This method uses class + NGit.Revwalk.ObjectWalk + extensively to find out that + appropriate set of output objects and their optimal order in output pack. + Order is consistent with general git in-pack rules: sort by object type, + recency, path and delta-base first. + + progress during object enumeration. + ObjectWalk to perform enumeration. + + collection of objects to be marked as interesting (start + points of graph traversal). + + + collection of objects to be marked as uninteresting (end + points of graph traversal). + + when some I/O problem occur during reading objects. + + + +

Determine if the pack file will contain the requested object. + Determine if the pack file will contain the requested object. + the object to test the existence of. + true if the object will appear in the output pack file. + a cached pack cannot be examined. +
+ + Lookup the ObjectToPack object for a given ObjectId. + Lookup the ObjectToPack object for a given ObjectId. + the object to find in the pack. + the object we are packing, or null. + + + + Computes SHA-1 of lexicographically sorted objects ids written in this + pack, as used to name a pack file in repository. + + + Computes SHA-1 of lexicographically sorted objects ids written in this + pack, as used to name a pack file in repository. + + ObjectId representing SHA-1 name of a pack that was created. + + + Create an index file to match the pack file just written. + + Create an index file to match the pack file just written. +

+ This method can only be invoked after + WritePack(NGit.ProgressMonitor, NGit.ProgressMonitor, Sharpen.OutputStream) + has + been invoked and completed successfully. Writing a corresponding index is + an optional feature that not all pack users may require. + + + output for the index data. Caller is responsible for closing + this stream. + + the index data could not be written to the supplied stream. + + + +

Write the prepared pack to the supplied stream. + + Write the prepared pack to the supplied stream. +

+ At first, this method collects and sorts objects to pack, then deltas + search is performed if set up accordingly, finally pack stream is + written. +

+ All reused objects data checksum (Adler32/CRC32) is computed and + validated against existing checksum. + + progress monitor to report object compression work. + + progress monitor to report the number of objects written. + + + output stream of pack data. The stream should be buffered by + the caller. The caller is responsible for closing the stream. + + + an error occurred reading a local object's data to include in + the pack, or writing compressed object data to the output + stream. + + + + + description of what this PackWriter did in order to create the + final pack stream. The object is only available to callers after + WritePack(NGit.ProgressMonitor, NGit.ProgressMonitor, Sharpen.OutputStream) + + + + snapshot of the current state of this PackWriter. + + +

Release all resources used by this writer. + Release all resources used by this writer. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Include one object to the output file. + + Include one object to the output file. +

+ Objects are written in the order they are added. If the same object is + added twice, it may be written twice, creating a larger than necessary + file. + + the object to add. + the object is an unsupported type. + + + +

Select an object representation for this writer. + + Select an object representation for this writer. +

+ An + NGit.ObjectReader + implementation should invoke this method once for + each representation available for an object, to allow the writer to find + the most suitable one for the output. + + the object being packed. + the next available representation from the repository. + + +

Summary of how PackWriter created the pack. + Summary of how PackWriter created the pack. +
+ + + unmodifiable collection of objects to be included in the + pack. May be null if the pack was hand-crafted in a unit + test. + + + + + unmodifiable collection of objects that should be excluded + from the pack, as the peer that will receive the pack already + has these objects. + + + + + unmodifiable collection of the cached packs that were reused + in the output, if any were selected for reuse. + + + + + number of objects in the output pack that went through the + delta search process in order to find a potential delta base. + + + + + number of objects in the output pack that went through delta + base search and found a suitable base. This is a subset of + GetDeltaSearchNonEdgeObjects() + . + + + + + total number of objects output. This total includes the value + of + GetTotalDeltas() + . + + + + + total number of deltas output. This may be lower than the + actual number of deltas if a cached pack was reused. + + + + + number of objects whose existing representation was reused in + the output. This count includes + GetReusedDeltas() + . + + + + + number of deltas whose existing representation was reused in + the output, as their base object was also output or was + assumed present for a thin pack. This may be lower than the + actual number of reused deltas if a cached pack was reused. + + + + + total number of bytes written. This size includes the pack + header, trailer, thin pack, and reused cached pack(s). + + + + + size of the thin pack in bytes, if a thin pack was generated. + A thin pack is created when the client already has objects + and some deltas are created against those objects, or if a + cached pack is being used and some deltas will reference + objects in the cached pack. This size does not include the + pack header or trailer. + + + + object type code, e.g. OBJ_COMMIT or OBJ_TREE. + information about this type of object in the pack. + + + true if the resulting pack file was a shallow pack. + + + depth (in commits) the pack includes if shallow. + + + + time in milliseconds spent enumerating the objects that need + to be included in the output. This time includes any restarts + that occur when a cached pack is selected for reuse. + + + + + time in milliseconds spent matching existing representations + against objects that will be transmitted, or that the client + can be assumed to already have. + + + + + time in milliseconds spent finding the sizes of all objects + that will enter the delta compression search window. The + sizes need to be known to better match similar objects + together and improve delta compression ratios. + + + + + time in milliseconds spent on delta compression. This is + observed wall-clock time and does not accurately track CPU + time used when multiple threads were used to perform the + delta compression. + + + + + time in milliseconds spent writing the pack output, from + start of header until end of trailer. The transfer speed can + be approximated by dividing + GetTotalBytes() + by this + value. + + + + total time spent processing this pack. + + + + get the average output speed in terms of bytes-per-second. + getTotalBytes() / (getTimeWriting() / 1000.0) + . + + + + formatted message string for display to clients. + + + Statistics about a single class of object. + Statistics about a single class of object. + + + + total number of objects output. This total includes the + value of + GetDeltas() + . + + + + + total number of deltas output. This may be lower than the + actual number of deltas if a cached pack was reused. + + + + + number of objects whose existing representation was + reused in the output. This count includes + GetReusedDeltas() + . + + + + + number of deltas whose existing representation was reused + in the output, as their base object was also output or + was assumed present for a thin pack. This may be lower + than the actual number of reused deltas if a cached pack + was reused. + + + + + total number of bytes written. This size includes the + object headers as well as the compressed data. This size + also includes all of + GetDeltaBytes() + . + + + + + number of delta bytes written. This size includes the + object headers for the delta objects. + + + + Estimated size of a single ObjectToPack instance. + Estimated size of a single ObjectToPack instance. + + + Possible states that a PackWriter can be in. + Possible states that a PackWriter can be in. + + + Summary of the current state of a PackWriter. + Summary of the current state of a PackWriter. + + + the PackConfig used to build the writer. + + + the current phase of the writer. + + + an estimate of the total memory used by the writer. + + + Parses raw Git trees from the canonical semi-text/semi-binary format. + Parses raw Git trees from the canonical semi-text/semi-binary format. + + + + First offset within + raw + of the prior entry. + + + + + First offset within + raw + of the current entry's data. + + + + Offset one past the current entry (first byte of next entry). + Offset one past the current entry (first byte of next entry). + + + Create a new parser. + Create a new parser. + + + Create a new parser for a tree appearing in a subset of a repository. + Create a new parser for a tree appearing in a subset of a repository. + + position of this iterator in the repository tree. The value + may be null or the empty array to indicate the prefix is the + root of the repository. A trailing slash ('/') is + automatically appended if the prefix does not end in '/'. + + reader to load the tree data from. + + identity of the tree being parsed; used only in exception + messages if data corruption is found. + + the object supplied is not available from the repository. + + + the object supplied as an argument is not actually a tree and + cannot be parsed as though it were a tree. + + a loose object or pack file could not be read. + + + + the parent of this tree parser + + + + Reset this parser to walk through the given tree data. + Reset this parser to walk through the given tree data. + the raw tree content. + + + Reset this parser to walk through the given tree. + Reset this parser to walk through the given tree. + reader to use during repository access. + + identity of the tree being parsed; used only in exception + messages if data corruption is found. + + the root level parser. + the object supplied is not available from the repository. + + + the object supplied as an argument is not actually a tree and + cannot be parsed as though it were a tree. + + a loose object or pack file could not be read. + + + + this iterator, or its parent, if the tree is at eof. + + + Reset this parser to walk through the given tree. + Reset this parser to walk through the given tree. + reader to use during repository access. + + identity of the tree being parsed; used only in exception + messages if data corruption is found. + + the object supplied is not available from the repository. + + + the object supplied as an argument is not actually a tree and + cannot be parsed as though it were a tree. + + a loose object or pack file could not be read. + + + + + + + + Back door to quickly create a subtree iterator for any subtree. + + Back door to quickly create a subtree iterator for any subtree. +

+ Don't use this unless you are ObjectWalk. The method is meant to be + called only once the current entry has been identified as a tree and its + identity has been converted into an ObjectId. + + reader to load the tree data from. + ObjectId of the tree to open. + a new parser that walks over the current subtree. + a loose object or pack file could not be read. + + + + + + + +

Iterator over an empty tree (a directory with no files). + Iterator over an empty tree (a directory with no files). +
+ + Create a new iterator with no parent. + Create a new iterator with no parent. + + + Create an iterator for a subtree of an existing iterator. + + Create an iterator for a subtree of an existing iterator. +

+ The caller is responsible for setting up the path of the child iterator. + + parent tree iterator. + + path array to be used by the child iterator. This path must + contain the path from the top of the walk to the first child + and must end with a '/'. + + + position within childPath where the child can + insert its data. The value at + childPath[childPathOffset-1] must be '/'. + + + + + + + + + + + + + +

Working directory iterator for standard Java IO. + + Working directory iterator for standard Java IO. +

+ This iterator uses the standard java.io package to read the + specified working directory as part of a + TreeWalk + . + + + +

+ Walks a working directory tree as part of a + TreeWalk + . +

+ Most applications will want to use the standard implementation of this + iterator, + FileTreeIterator + , as that does all IO through the standard + java.io package. Plugins for a Java based IDE may however wish + to create their own implementations of this class to allow traversal of the + IDE's project space, as well as benefit from any caching the IDE may have. +

+ FileTreeIterator +
+ + Size we perform file IO in if we have to read and hash a file. + Size we perform file IO in if we have to read and hash a file. + + + + Maximum size of files which may be read fully into memory for performance + reasons. + + + Maximum size of files which may be read fully into memory for performance + reasons. + + + + + An empty entry array, suitable for + Init(Entry[]) + . + + + + Inherited state of this iterator, describing working tree, etc. + Inherited state of this iterator, describing working tree, etc. + + + + The + IdBuffer() + for the current entry. + + + + + Index within + entries + that + contentId + came from. + + + + List of entries obtained from the subclass. + List of entries obtained from the subclass. + + + + Total number of entries in + entries + that are valid. + + + + + Current position within + entries + . + + + + If there is a .gitignore file present, the parsed rules from it. + If there is a .gitignore file present, the parsed rules from it. + + + Repository that is the root level being iterated over + + + + Cached canonical length, initialized from + IdBuffer() + + + + + + The offset of the content id in + IdBuffer() + + + + + Cached value of isEntryIgnored(). + + Cached value of isEntryIgnored(). 0 if not ignored, 1 if ignored, -1 if + the value is not yet cached. + + + + Create a new iterator with no parent. + Create a new iterator with no parent. + working tree options to be used + + + Create a new iterator with no parent and a prefix. + + Create a new iterator with no parent and a prefix. +

+ The prefix path supplied is inserted in front of all paths generated by + this iterator. It is intended to be used when an iterator is being + created for a subsection of an overall repository and needs to be + combined with other iterators that are created to run over the entire + repository namespace. + + + position of this iterator in the repository tree. The value + may be null or the empty string to indicate the prefix is the + root of the repository. A trailing slash ('/') is + automatically appended if the prefix does not end in '/'. + + working tree options to be used + + +

Create an iterator for a subtree of an existing iterator. + Create an iterator for a subtree of an existing iterator. + parent tree iterator. +
+ + Initialize this iterator for the root level of a repository. + + Initialize this iterator for the root level of a repository. +

+ This method should only be invoked after calling + Init(Entry[]) + , + and only for the root iterator. + + the repository. + + +

+ Define the matching + NGit.Dircache.DirCacheIterator + , to optimize ObjectIds. + Once the DirCacheIterator has been set this iterator must only be + advanced by the TreeWalk that is supplied, as it assumes that itself and + the corresponding DirCacheIterator are positioned on the same file path + whenever + IdBuffer() + is invoked. + + the walk that will be advancing this iterator. + + index of the matching + NGit.Dircache.DirCacheIterator + . + +
+ + Get submodule id for given entry. + Get submodule id for given entry. + + non-null submodule id + + + + Get submodule id using the repository at the location of the entry + relative to the directory. + + + Get submodule id using the repository at the location of the entry + relative to the directory. + + + + non-null submodule id + + + + + + + + + + + + Returns the working tree options used by this iterator. + Returns the working tree options used by this iterator. + working tree options + + + + + + + + + Get the raw byte length of this entry. + Get the raw byte length of this entry. + size of this file, in bytes. + + + Get the filtered input length of this entry + size of the content, in bytes + System.IO.IOException + + + Get the last modified time of this entry. + Get the last modified time of this entry. + + last modified time of this file, in milliseconds since the epoch + (Jan 1, 1970 UTC). + + + + Obtain an input stream to read the file content. + + Obtain an input stream to read the file content. +

+ Efficient implementations are not required. The caller will usually + obtain the stream only once per entry, if at all. +

+ The input stream should not use buffering if the implementation can avoid + it. The caller will buffer as necessary to perform efficient block IO + operations. +

+ The caller will close the stream once complete. + + a stream to read from the file. + the file could not be opened for reading. + + + +

Determine if the current entry path is ignored by an ignore rule. + Determine if the current entry path is ignored by an ignore rule. + true if the entry was ignored by an ignore rule file. + a relevant ignore rule file exists but cannot be read. + +
+ + Determine if the entry path is ignored by an ignore rule. + Determine if the entry path is ignored by an ignore rule. + the length of the path in the path buffer. + true if the entry is ignored by an ignore rule. + a relevant ignore rule file exists but cannot be read. + + + + + + + Constructor helper. + Constructor helper. + + files in the subtree of the work tree this iterator operates + on + + + + Obtain the current entry from this iterator. + Obtain the current entry from this iterator. + the currently selected entry. + + + Is the file mode of the current entry different than the given raw mode? + + + true if different, false otherwise + + + + Compare the metadata (mode, length, modification-timestamp) of the + current entry and a + NGit.Dircache.DirCacheEntry + + + the + NGit.Dircache.DirCacheEntry + to compare with + + + a + MetadataDiff + which tells whether and how the entries + metadata differ + + + + + Checks whether this entry differs from a given entry from the + NGit.Dircache.DirCache + . + File status information is used and if status is same we consider the + file identical to the state in the working directory. Native git uses + more stat fields than we have accessible in Java. + + the entry from the dircache we want to compare against + + True if the actual file content should be checked if + modification time differs. + + true if content is most likely different. + + + + Get the file mode to use for the current entry when it is to be updated + in the index. + + + Get the file mode to use for the current entry when it is to be updated + in the index. + + + NGit.Dircache.DirCacheIterator + positioned at the same entry as this + iterator or null if no + NGit.Dircache.DirCacheIterator + is available + at this iterator's current entry + + index file mode + + + Compares the entries content with the content in the filesystem. + + Compares the entries content with the content in the filesystem. + Unsmudges the entry when it is detected that it is clean. + + the entry to be checked + + true if the content matches, false + otherwise + + + + + + + + + + + The result of a metadata-comparison between the current entry and a + DirCacheEntry + + + + A single entry within a working directory tree. + A single entry within a working directory tree. + + + Get the type of this entry. + + Get the type of this entry. +

+ Note: Efficient implementation required. +

+ The implementation of this method must be efficient. If a subclass + needs to compute the value they should cache the reference within an + instance member instead. + + + a file mode constant from + NGit.FileMode + . + + + +

Get the byte length of this entry. + + Get the byte length of this entry. +

+ Note: Efficient implementation required. +

+ The implementation of this method must be efficient. If a subclass + needs to compute the value they should cache the reference within an + instance member instead. + + size of this file, in bytes. + + +

Get the last modified time of this entry. + + Get the last modified time of this entry. +

+ Note: Efficient implementation required. +

+ The implementation of this method must be efficient. If a subclass + needs to compute the value they should cache the reference within an + instance member instead. + + time since the epoch (in ms) of the last change. + + +

Get the name of this entry within its directory. + + Get the name of this entry within its directory. +

+ Efficient implementations are not required. The caller will obtain + the name only once and cache it once obtained. + + name of the entry. + + +

Obtain an input stream to read the file content. + + Obtain an input stream to read the file content. +

+ Efficient implementations are not required. The caller will usually + obtain the stream only once per entry, if at all. +

+ The input stream should not use buffering if the implementation can + avoid it. The caller will buffer as necessary to perform efficient + block IO operations. +

+ The caller will close the stream once complete. + + a stream to read from the file. + the file could not be opened for reading. + + + +

Magic type indicating we know rules exist, but they aren't loaded. + Magic type indicating we know rules exist, but they aren't loaded. +
+ + + + + Magic type indicating there may be rules for the top level. + Magic type indicating there may be rules for the top level. + + + + + + + + + + Options used to process the working tree. + Options used to process the working tree. + + + File name character encoder. + File name character encoder. + + + + Digest computer for + WorkingTreeIterator.contentId + computations. + + + + + Buffer used to perform + WorkingTreeIterator.contentId + computations. + + + + TreeWalk with a (supposedly) matching DirCacheIterator. + TreeWalk with a (supposedly) matching DirCacheIterator. + + + + Position of the matching + NGit.Dircache.DirCacheIterator + . + + + + the starting directory. + + the starting directory. This directory should correspond to the root of + the repository. + + + + + the file system abstraction which will be necessary to perform certain + file system operations. + + + the file system abstraction which will be necessary to perform certain + file system operations. + + + + Create a new iterator to traverse the work tree and its children. + Create a new iterator to traverse the work tree and its children. + the repository whose working tree will be scanned. + + + Create a new iterator to traverse the given directory and its children. + Create a new iterator to traverse the given directory and its children. + + the starting directory. This directory should correspond to + the root of the repository. + + + the file system abstraction which will be necessary to perform + certain file system operations. + + working tree options to be used + + + Create a new iterator to traverse a subdirectory. + Create a new iterator to traverse a subdirectory. + the parent iterator we were created from. + + the file system abstraction which will be necessary to perform + certain file system operations. + + + the subdirectory. This should be a directory contained within + the parent directory. + + + + + + + + The root directory of this iterator + + + + The location of the working file. This is the same as + + new + File(getDirectory(), getEntryPath()) + + but may be faster by + reusing an internal File instance. + + + + Wrapper for a standard Java IO file + + + + + + Get the underlying file of this entry. + Get the underlying file of this entry. + the underlying file of this entry + + + Specialized TreeWalk to detect directory-file (D/F) name conflicts. + + Specialized TreeWalk to detect directory-file (D/F) name conflicts. +

+ Due to the way a Git tree is organized the standard + TreeWalk + won't + easily find a D/F conflict when merging two or more trees together. In the + standard TreeWalk the file will be returned first, and then much later the + directory will be returned. This makes it impossible for the application to + efficiently detect and handle the conflict. +

+ Using this walk implementation causes the directory to report earlier than + usual, at the same time as the non-directory entry. This permits the + application to handle the D/F conflict in a single step. The directory is + returned only once, so it does not get returned later in the iteration. +

+ When a D/F conflict is detected + TreeWalk.IsSubtree() + will return true + and + TreeWalk.EnterSubtree() + will recurse into the subtree, no matter + which iterator originally supplied the subtree. +

+ Because conflicted directories report early, using this walk implementation + to populate a + NGit.Dircache.DirCacheBuilder + may cause the automatic resorting to + run and fix the entry ordering. +

+ This walk implementation requires more CPU to implement a look-ahead and a + look-behind to merge a D/F pair together, or to skip a previously reported + directory. In typical Git repositories the look-ahead cost is 0 and the + look-behind doesn't trigger, as users tend not to create trees which contain + both "foo" as a directory and "foo.c" as a file. +

+ In the worst-case however several thousand look-ahead steps per walk step may + be necessary, making the overhead quite significant. Since this worst-case + should never happen this walk implementation has made the time/space tradeoff + in favor of more-time/less-space, as that better suits the typical case. + + + +

+ Walks one or more + AbstractTreeIterator + s in parallel. +

+ This class can perform n-way differences across as many trees as necessary. +

+ Each tree added must have the same root as existing trees in the walk. +

+ A TreeWalk instance can only be used once to generate results. Running a + second time requires creating a new TreeWalk instance, or invoking + Reset() + and adding new trees before starting again. Resetting an + existing instance may be faster for some applications as some internal + buffers may be recycled. +

+ TreeWalk instances are not thread-safe. Applications must either restrict + usage of a TreeWalk instance to a single thread, or implement their own + synchronization at a higher level. +

+ Multiple simultaneous TreeWalk instances per + NGit.Repository + are + permitted, even from concurrent threads. +

+
+ + Open a tree walk and filter to exactly one path. + + Open a tree walk and filter to exactly one path. +

+ The returned tree walk is already positioned on the requested path, so + the caller should not need to invoke + Next() + unless they are + looking for a possible directory/file name conflict. + + the reader the walker will obtain tree data from. + single path to advance the tree walk instance into. + one or more trees to walk through, all with the same root. + + a new tree walk configured for exactly this one path; null if no + path was found in any of the trees. + + reading a pack file or loose object failed. + + + an tree object could not be read as its data stream did not + appear to be a tree, or could not be inflated. + + an object we expected to be a tree was not a tree. + + a tree object was not found. + + + +

Open a tree walk and filter to exactly one path. + + Open a tree walk and filter to exactly one path. +

+ The returned tree walk is already positioned on the requested path, so + the caller should not need to invoke + Next() + unless they are + looking for a possible directory/file name conflict. + + repository to read tree object data from. + single path to advance the tree walk instance into. + one or more trees to walk through, all with the same root. + + a new tree walk configured for exactly this one path; null if no + path was found in any of the trees. + + reading a pack file or loose object failed. + + + an tree object could not be read as its data stream did not + appear to be a tree, or could not be inflated. + + an object we expected to be a tree was not a tree. + + a tree object was not found. + + + +

Open a tree walk and filter to exactly one path. + + Open a tree walk and filter to exactly one path. +

+ The returned tree walk is already positioned on the requested path, so + the caller should not need to invoke + Next() + unless they are + looking for a possible directory/file name conflict. + + repository to read tree object data from. + single path to advance the tree walk instance into. + the single tree to walk through. + + a new tree walk configured for exactly this one path; null if no + path was found in any of the trees. + + reading a pack file or loose object failed. + + + an tree object could not be read as its data stream did not + appear to be a tree, or could not be inflated. + + an object we expected to be a tree was not a tree. + + a tree object was not found. + + + +

Create a new tree walker for a given repository. + Create a new tree walker for a given repository. + the repository the walker will obtain data from. +
+ + Create a new tree walker for a given repository. + Create a new tree walker for a given repository. + the reader the walker will obtain tree data from. + + + Release any resources used by this walker's reader. + + Release any resources used by this walker's reader. +

+ A walker that has been released can be used again, but may need to be + released after the subsequent usage. + + + +

Reset this walker so new tree iterators can be added to it. + Reset this walker so new tree iterators can be added to it. +
+ + Reset this walker to run over a single existing tree. + Reset this walker to run over a single existing tree. + + the tree we need to parse. The walker will execute over this + single tree if the reset is successful. + + the given tree object does not exist in this repository. + + + the given object id does not denote a tree, but instead names + some other non-tree type of object. Note that commits are not + trees, even if they are sometimes called a "tree-ish". + + + the object claimed to be a tree, but its contents did not + appear to be a tree. The repository may have data corruption. + + a loose object or pack file could not be read. + + + + Reset this walker to run over a set of existing trees. + Reset this walker to run over a set of existing trees. + + the trees we need to parse. The walker will execute over this + many parallel trees if the reset is successful. + + the given tree object does not exist in this repository. + + + the given object id does not denote a tree, but instead names + some other non-tree type of object. Note that commits are not + trees, even if they are sometimes called a "tree-ish". + + + the object claimed to be a tree, but its contents did not + appear to be a tree. The repository may have data corruption. + + a loose object or pack file could not be read. + + + + Add an already existing tree object for walking. + + Add an already existing tree object for walking. +

+ The position of this tree is returned to the caller, in case the caller + has lost track of the order they added the trees into the walker. +

+ The tree must have the same root as existing trees in the walk. + + identity of the tree object the caller wants walked. + position of this tree within the walker. + the given tree object does not exist in this repository. + + + the given object id does not denote a tree, but instead names + some other non-tree type of object. Note that commits are not + trees, even if they are sometimes called a "tree-ish". + + + the object claimed to be a tree, but its contents did not + appear to be a tree. The repository may have data corruption. + + a loose object or pack file could not be read. + + + +

Add an already created tree iterator for walking. + + Add an already created tree iterator for walking. +

+ The position of this tree is returned to the caller, in case the caller + has lost track of the order they added the trees into the walker. +

+ The tree which the iterator operates on must have the same root as + existing trees in the walk. + + + an iterator to walk over. The iterator should be new, with no + parent, and should still be positioned before the first entry. + The tree which the iterator operates on must have the same root + as other trees in the walk. + + position of this tree within the walker. + + the iterator was unable to obtain its first entry, due to + possible data corruption within the backing data store. + + + +

Advance this walker to the next relevant entry. + Advance this walker to the next relevant entry. + + true if there is an entry available; false if all entries have + been walked and the walk of this set of tree iterators is over. + + + Recursive() + was enabled, a subtree was found, but + the subtree object does not exist in this repository. The + repository may be missing objects. + + + Recursive() + was enabled, a subtree was found, and + the subtree id does not denote a tree, but instead names some + other non-tree type of object. The repository may have data + corruption. + + + the contents of a tree did not appear to be a tree. The + repository may have data corruption. + + a loose object or pack file could not be read. + +
+ + Obtain the tree iterator for the current entry. + + Obtain the tree iterator for the current entry. +

+ Entering into (or exiting out of) a subtree causes the current tree + iterator instance to be changed for the nth tree. This allows the tree + iterators to manage only one list of items, with the diving handled by + recursive trees. + + tree to obtain the current iterator of. + type of the tree iterator expected by the caller. + + r the current iterator of the requested type; null if the tree + has no entry to match the current path. + + + +

+ Obtain the raw + NGit.FileMode + bits for the current entry. +

+ Every added tree supplies mode bits, even if the tree does not contain + the current entry. In the latter case + NGit.FileMode.MISSING + 's mode + bits (0) are returned. +

+ tree to obtain the mode bits from. + mode bits for the current entry of the nth tree. + NGit.FileMode.FromBits(int) +
+ + + Obtain the + NGit.FileMode + for the current entry. +

+ Every added tree supplies a mode, even if the tree does not contain the + current entry. In the latter case + NGit.FileMode.MISSING + is returned. +

+ tree to obtain the mode from. + mode for the current entry of the nth tree. +
+ + Obtain the ObjectId for the current entry. + + Obtain the ObjectId for the current entry. +

+ Using this method to compare ObjectId values between trees of this walker + is very inefficient. Applications should try to use + IdEqual(int, int) + or + GetObjectId(NGit.MutableObjectId, int) + + whenever possible. +

+ Every tree supplies an object id, even if the tree does not contain the + current entry. In the latter case + NGit.ObjectId.ZeroId() + is returned. + + tree to obtain the object identifier from. + object identifier for the current tree entry. + GetObjectId(NGit.MutableObjectId, int) + + IdEqual(int, int) + + +

Obtain the ObjectId for the current entry. + + Obtain the ObjectId for the current entry. +

+ Every tree supplies an object id, even if the tree does not contain the + current entry. In the latter case + NGit.ObjectId.ZeroId() + is supplied. +

+ Applications should try to use + IdEqual(int, int) + when possible + as it avoids conversion overheads. + + buffer to copy the object id into. + tree to obtain the object identifier from. + IdEqual(int, int) + + +

Compare two tree's current ObjectId values for equality. + Compare two tree's current ObjectId values for equality. + first tree to compare the object id from. + second tree to compare the object id from. + + result of + getObjectId(nthA).equals(getObjectId(nthB)). + + GetObjectId(int) +
+ + The path length of the current entry. + + + Test if the supplied path matches the current entry's path. + + Test if the supplied path matches the current entry's path. +

+ This method tests that the supplied path is exactly equal to the current + entry, or is one of its parent directories. It is faster to use this + method then to use + PathString() + to first create a String + object, then test startsWith or some other type of string + match function. + + + path buffer to test. Callers should ensure the path does not + end with '/' prior to invocation. + + number of bytes from buf to test. + + < 0 if p is before the current path; 0 if p matches the current + path; 1 if the current path is past p and p will never match + again on this tree walk. + + + +

+ Test if the supplied path matches (being suffix of) the current entry's + path. + + + Test if the supplied path matches (being suffix of) the current entry's + path. +

+ This method tests that the supplied path is exactly equal to the current + entry, or is relative to one of entry's parent directories. It is faster + to use this method then to use + PathString() + to first create + a String object, then test endsWith or some other type of + string match function. + + path buffer to test. + number of bytes from buf to test. + + true if p is suffix of the current path; + false if otherwise + + + +

Enter into the current subtree. + + Enter into the current subtree. +

+ If the current entry is a subtree this method arranges for its children + to be returned before the next sibling following the subtree is returned. + + + a subtree was found, but the subtree object does not exist in + this repository. The repository may be missing objects. + + + a subtree was found, and the subtree id does not denote a + tree, but instead names some other non-tree type of object. + The repository may have data corruption. + + + the contents of a tree did not appear to be a tree. The + repository may have data corruption. + + a loose object or pack file could not be read. + + + + + + + + + + + + + + + + + the reader this walker is using to load objects. + + +

Get the currently configured filter. + Get the currently configured filter. + the current filter. Never null as a filter is always needed. + Set the tree entry filter for this walker. + + Set the tree entry filter for this walker. +

+ Multiple filters may be combined by constructing an arbitrary tree of + AndTreeFilter or OrTreeFilter instances to + describe the boolean expression required by the application. Custom + filter implementations may also be constructed by applications. +

+ Note that filters are not thread-safe and may not be shared by concurrent + TreeWalk instances. Every TreeWalk must be supplied its own unique + filter, unless the filter implementation specifically states it is (and + always will be) thread-safe. Callers may use + NGit.Treewalk.Filter.TreeFilter.Clone() + + to create a unique filter tree for this TreeWalk instance. + + + the new filter. If null the special + NGit.Treewalk.Filter.TreeFilter.ALL + + filter will be used instead, as it matches every entry. + + NGit.Treewalk.Filter.AndTreeFilter + + NGit.Treewalk.Filter.OrTreeFilter + + + +

+ Is this walker automatically entering into subtrees? +

+ If the walker is recursive then the caller will not see a subtree node + and instead will only receive file nodes in all relevant subtrees. +

+ + Is this walker automatically entering into subtrees? +

+ If the walker is recursive then the caller will not see a subtree node + and instead will only receive file nodes in all relevant subtrees. + + true if automatically entering subtrees is enabled. +

Set the walker to enter (or not enter) subtrees automatically. + + Set the walker to enter (or not enter) subtrees automatically. +

+ If recursive mode is enabled the walker will hide subtree nodes from the + calling application and will produce only file level nodes. If a tree + (directory) is deleted then all of the file level nodes will appear to be + deleted, recursively, through as many levels as necessary to account for + all entries. + + true to skip subtree nodes and only obtain files nodes. + + +

+ Does this walker return a tree entry after it exits the subtree? +

+ If post order traversal is enabled then the walker will return a subtree + after it has returned the last entry within that subtree. +

+ + Does this walker return a tree entry after it exits the subtree? +

+ If post order traversal is enabled then the walker will return a subtree + after it has returned the last entry within that subtree. This may cause + a subtree to be seen by the application twice if + Recursive() + is false, as the application will see it once, call + EnterSubtree() + , and then see it again as it leaves the subtree. +

+ If an application does not enable + Recursive() + and it does not + call + EnterSubtree() + then the tree is returned only once as none + of the children were processed. + + true if subtrees are returned after entries within the subtree. +

Set the walker to return trees after their children. + Set the walker to return trees after their children. + true to get trees after their children. + PostOrderTraversal() +
+ + Get the number of trees known to this walker. + Get the number of trees known to this walker. + the total number of trees this walker is iterating over. + + + Get the current entry's name within its parent tree. + + Get the current entry's name within its parent tree. +

+ This method is not very efficient and is primarily meant for debugging + and final output generation. Applications should try to avoid calling it, + and if invoked do so only once per interesting entry, where the name is + absolutely required for correct function. + + + name of the current entry within the parent tree (or directory). + The name never includes a '/'. + + + +

Get the current entry's complete path. + + Get the current entry's complete path. +

+ This method is not very efficient and is primarily meant for debugging + and final output generation. Applications should try to avoid calling it, + and if invoked do so only once per interesting entry, where the name is + absolutely required for correct function. + + + complete path of the current entry, from the root of the + repository. If the current entry is in a subtree there will be at + least one '/' in the returned string. + + + +

Get the current entry's complete path as a UTF-8 byte array. + Get the current entry's complete path as a UTF-8 byte array. + + complete path of the current entry, from the root of the + repository. If the current entry is in a subtree there will be at + least one '/' in the returned string. + +
+ + Get the current subtree depth of this walker. + Get the current subtree depth of this walker. + the current subtree depth of this walker. + + + + Is the current entry a subtree? +

+ This method is faster then testing the raw mode bits of all trees to see + if any of them are a subtree. +

+ + Is the current entry a subtree? +

+ This method is faster then testing the raw mode bits of all trees to see + if any of them are a subtree. If at least one is a subtree then this + method will return true. + + + true if + EnterSubtree() + will work on the current node. + + + +

Is the current entry a subtree returned after its children? + + true if the current node is a tree that has been returned after + its children were already processed. + + PostOrderTraversal() +
+ + Create a new tree walker for a given repository. + Create a new tree walker for a given repository. + the repository the walker will obtain data from. + + + Create a new tree walker for a given repository. + Create a new tree walker for a given repository. + the reader the walker will obtain tree data from. + + + + + + + + + + + + + + + + + + True if the current entry is covered by a directory/file conflict. + + True if the current entry is covered by a directory/file conflict. + This means that for some prefix of the current entry's path, this walk + has detected a directory/file conflict. Also true if the current entry + itself is a directory/file conflict. + Example: If this TreeWalk points to foo/bar/a.txt and this method returns + true then you know that either for path foo or for path foo/bar files and + folders were detected. + + + true if the current entry is covered by a + directory/file conflict, false otherwise + + + + + Options used by the + WorkingTreeIterator + . + + + + + Key for + NGit.Config.Get<T>(NGit.Config.SectionParser<T>) + + . + + + + true if the execute bit on working files should be trusted. + + + how automatic CRLF conversion has been configured. + + + Includes a tree entry only if all subfilters include the same tree entry. + + + Includes a tree entry only if all subfilters include the same tree entry. +

+ Classic shortcut behavior is used, so evaluation of the + TreeFilter.Include(NGit.Treewalk.TreeWalk) + + method stops as soon as a false result + is obtained. Applications can improve filtering performance by placing faster + filters that are more likely to reject a result earlier in the list. + + + +

Create a filter with two filters, both of which must match. + Create a filter with two filters, both of which must match. + first filter to test. + second filter to test. + a filter that must match both input filters. +
+ + Create a filter around many filters, all of which must match. + Create a filter around many filters, all of which must match. + + list of filters to match against. Must contain at least 2 + filters. + + a filter that must match all input filters. + + + Create a filter around many filters, all of which must match. + Create a filter around many filters, all of which must match. + + list of filters to match against. Must contain at least 2 + filters. + + a filter that must match all input filters. + + + + + + + + + + + + + + Skip + NGit.Treewalk.WorkingTreeIterator + entries that appear in gitignore files. + + + + Construct a filter to ignore paths known to a particular iterator. + Construct a filter to ignore paths known to a particular iterator. + index of the workdir tree in the tree walk + + + + + + + + Includes an entry only if the subfilter does not include the entry. + Includes an entry only if the subfilter does not include the entry. + + + Create a filter that negates the result of another filter. + Create a filter that negates the result of another filter. + filter to negate. + a filter that does the reverse of a. + + + + + + + + Includes a tree entry if any subfilters include the same tree entry. + + Includes a tree entry if any subfilters include the same tree entry. +

+ Classic shortcut behavior is used, so evaluation of the + TreeFilter.Include(NGit.Treewalk.TreeWalk) + + method stops as soon as a true result is + obtained. Applications can improve filtering performance by placing faster + filters that are more likely to accept a result earlier in the list. + + + +

Create a filter with two filters, one of which must match. + Create a filter with two filters, one of which must match. + first filter to test. + second filter to test. + a filter that must match at least one input filter. +
+ + Create a filter around many filters, one of which must match. + Create a filter around many filters, one of which must match. + + list of filters to match against. Must contain at least 2 + filters. + + a filter that must match at least one input filter. + + + Create a filter around many filters, one of which must match. + Create a filter around many filters, one of which must match. + + list of filters to match against. Must contain at least 2 + filters. + + a filter that must match at least one input filter. + + + + + + + + + + + + + Includes tree entries only if they match the configured path. + + Includes tree entries only if they match the configured path. +

+ Applications should use + PathFilterGroup + to connect these into a tree + filter graph, as the group supports breaking out of traversal once it is + known the path can never match. + + + +

Create a new tree filter for a user supplied path. + + Create a new tree filter for a user supplied path. +

+ Path strings are relative to the root of the repository. If the user's + input should be assumed relative to a subdirectory of the repository the + caller must prepend the subdirectory's path prior to creating the filter. +

+ Path strings use '/' to delimit directories on all platforms. + + + the path to filter on. Must not be the empty string. All + trailing '/' characters will be trimmed before string's length + is checked or is used as part of the constructed filter. + + a new filter for the requested path. + the path supplied was the empty string. + + + + the path this filter matches. + + + The walk to check against. + + + true + if the path length of this filter matches the length + of the current path of the supplied TreeWalk. + + + +

Includes tree entries only if they match one or more configured paths. + + Includes tree entries only if they match one or more configured paths. +

+ Operates like + PathFilter + but causes the walk to abort as soon as the + tree can no longer match any of the paths within the group. This may bypass + the boolean logic of a higher level AND or OR group, but does improve + performance for the common case of examining one or more modified paths. +

+ This filter is effectively an OR group around paths, with the early abort + feature described above. + + + +

Create a collection of path filters from Java strings. + + Create a collection of path filters from Java strings. +

+ Path strings are relative to the root of the repository. If the user's + input should be assumed relative to a subdirectory of the repository the + caller must prepend the subdirectory's path prior to creating the filter. +

+ Path strings use '/' to delimit directories on all platforms. +

+ Paths may appear in any order within the collection. Sorting may be done + internally when the group is constructed if doing so will improve path + matching performance. + + the paths to test against. Must have at least one entry. + a new filter for the list of paths supplied. + + +

Create a collection of path filters from Java strings. + + Create a collection of path filters from Java strings. +

+ Path strings are relative to the root of the repository. If the user's + input should be assumed relative to a subdirectory of the repository the + caller must prepend the subdirectory's path prior to creating the filter. +

+ Path strings use '/' to delimit directories on all platforms. +

+ Paths may appear in any order. Sorting may be done internally when the + group is constructed if doing so will improve path matching performance. + + the paths to test against. Must have at least one entry. + a new filter for the paths supplied. + + +

Create a collection of path filters. + + Create a collection of path filters. +

+ Paths may appear in any order within the collection. Sorting may be done + internally when the group is constructed if doing so will improve path + matching performance. + + the paths to test against. Must have at least one entry. + a new filter for the list of paths supplied. + + +

Includes tree entries only if they match the configured path. + Includes tree entries only if they match the configured path. +
+ + Create a new tree filter for a user supplied path. + + Create a new tree filter for a user supplied path. +

+ Path strings use '/' to delimit directories on all platforms. + + the path (suffix) to filter on. Must not be the empty string. + a new filter for the requested path. + the path supplied was the empty string. + + + + + + + + +

+ To be used in combination with a DirCacheIterator: includes only tree entries + for which 'skipWorkTree' flag is not set. + + + To be used in combination with a DirCacheIterator: includes only tree entries + for which 'skipWorkTree' flag is not set. + +
+ + Index of DirCacheIterator to work on. + Index of DirCacheIterator to work on. + + + Create a filter to work on the specified DirCacheIterator. + Create a filter to work on the specified DirCacheIterator. + + index of DirCacheIterator to work on. If the index does not + refer to a DirCacheIterator, the filter will include all + entries. + + + + Encodes and decodes to and from Base64 notation. + + Encodes and decodes to and from Base64 notation. +

+ I am placing this code in the Public Domain. Do with it as you will. This + software comes with no guarantees or warranties but with plenty of + well-wishing instead! Please visit <a + href="http://iharder.net/base64">http://iharder.net/base64</a> periodically + to check for updates or to contribute improvements. + + Robert Harder + rob@iharder.net + 2.1, stripped to minimum feature set used by JGit. + + +

The equals sign (=) as a byte. + The equals sign (=) as a byte. +
+ + Indicates equals sign in encoding. + Indicates equals sign in encoding. + + + Indicates white space in encoding. + Indicates white space in encoding. + + + Indicates an invalid byte during decoding. + Indicates an invalid byte during decoding. + + + Preferred encoding. + Preferred encoding. + + + The 64 valid Base64 values. + The 64 valid Base64 values. + + + + Translates a Base64 value to either its 6-bit reconstruction value or a + negative number indicating some other meaning. + + + Translates a Base64 value to either its 6-bit reconstruction value or a + negative number indicating some other meaning. The table is only 7 bits + wide, as the 8th bit is discarded during decoding. + + + + Defeats instantiation. + Defeats instantiation. + + + + Encodes up to three bytes of the array source and writes the + resulting four Base64 bytes to destination. + + + Encodes up to three bytes of the array source and writes the + resulting four Base64 bytes to destination. The source and + destination arrays can be manipulated anywhere along their length by + specifying srcOffset and destOffset. This method + does not check to make sure your arrays are large enough to accommodate + srcOffset + 3 for the source array or + destOffset + 4 for the destination array. The + actual number of significant bytes in your array is given by + numSigBytes. + + the array to convert + the index where conversion begins + the number of significant bytes in your array + the array to hold the conversion + the index where output will be put + + + Encodes a byte array into Base64 notation. + Encodes a byte array into Base64 notation. + The data to convert + encoded base64 representation of source. + + + Encodes a byte array into Base64 notation. + Encodes a byte array into Base64 notation. + The data to convert + Offset in array where conversion should begin + Length of data to convert + encoded base64 representation of source. + + + + Decodes four bytes from array source and writes the resulting + bytes (up to three of them) to destination. + + + Decodes four bytes from array source and writes the resulting + bytes (up to three of them) to destination. The source and + destination arrays can be manipulated anywhere along their length by + specifying srcOffset and destOffset. This method + does not check to make sure your arrays are large enough to accommodate + srcOffset + 4 for the source array or + destOffset + 3 for the destination array. This + method returns the actual number of bytes that were converted from the + Base64 encoding. + + the array to convert + the index where conversion begins + the array to hold the conversion + the index where output will be put + the number of decoded bytes converted + + + Low-level decoding ASCII characters from a byte array. + Low-level decoding ASCII characters from a byte array. + The Base64 encoded data + The offset of where to begin decoding + The length of characters to decode + decoded data + the input is not a valid Base64 sequence. + + + + Decodes data from Base64 notation. + Decodes data from Base64 notation. + the string to decode + the decoded data + + + Abstract authenticator which remembers prior authentications. + Abstract authenticator which remembers prior authentications. + + + Add a cached authentication for future use. + Add a cached authentication for future use. + the information we should remember. + + + Prompt for and request authentication from the end-user. + Prompt for and request authentication from the end-user. + + the authentication data; null if the user canceled the request + and does not want to continue. + + + + Authentication data to remember and reuse. + Authentication data to remember and reuse. + + + Create a new cached authentication. + Create a new cached authentication. + system this is for. + port number of the service. + username at the service. + password at the service. + + + + Utilities for creating and working with Change-Id's, like the one used by + Gerrit Code Review. + + + Utilities for creating and working with Change-Id's, like the one used by + Gerrit Code Review. +

+ A Change-Id is a SHA-1 computed from the content of a commit, in a similar + fashion to how the commit id is computed. Unlike the commit id a Change-Id is + retained in the commit and subsequent revised commits in the footer of the + commit text. + + + +

Compute a Change-Id. + Compute a Change-Id. + The id of the tree that would be committed + parent id of previous commit or null + + the + NGit.PersonIdent + for the presumed author and time + + + the + NGit.PersonIdent + for the presumed committer and time + + The commit message + + the change id SHA1 string (without the 'I') or null if the + message is not complete enough + + System.IO.IOException +
+ + Find the right place to insert a Change-Id and return it. + + Find the right place to insert a Change-Id and return it. +

+ The Change-Id is inserted before the first footer line but after a Bug + line. + + + + a commit message with an inserted Change-Id line + + +

Find the right place to insert a Change-Id and return it. + + Find the right place to insert a Change-Id and return it. +

+ If no Change-Id is found the Change-Id is inserted before + the first footer line but after a Bug line. + If Change-Id is found and replaceExisting is set to false, + the message is unchanged. + If Change-Id is found and replaceExisting is set to true, + the Change-Id is replaced with + changeId + . + + + + + a commit message with an inserted Change-Id line + + +

Abstraction to support various file system operations not in Java. + Abstraction to support various file system operations not in Java. +
+ + The auto-detected implementation selected for this operating system and JRE. + + The auto-detected implementation selected for this operating system and JRE. + + + + Auto-detect the appropriate file system abstraction. + Auto-detect the appropriate file system abstraction. + detected file system abstraction + + + + Auto-detect the appropriate file system abstraction, taking into account + the presence of a Cygwin installation on the system. + + + Auto-detect the appropriate file system abstraction, taking into account + the presence of a Cygwin installation on the system. Using jgit in + combination with Cygwin requires a more elaborate (and possibly slower) + resolution of file system paths. + + +
    +
  • Boolean.TRUE to assume that Cygwin is used in + combination with jgit
  • +
  • Boolean.FALSE to assume that Cygwin is + not used with jgit
  • +
  • null to auto-detect whether a Cygwin + installation is present on the system and in this case assume + that Cygwin is used
  • +
+ Note: this parameter is only relevant on Windows. + + detected file system abstraction +
+ + Constructs a file system abstraction. + Constructs a file system abstraction. + + + Initialize this FS using another's current settings. + Initialize this FS using another's current settings. + the source FS to copy from. + + + a new instance of the same type of FS. + + + Does this operating system and JRE support the execute flag on files? + + true if this implementation can provide reasonably accurate + executable bit information; false otherwise. + + + + Is this file system case sensitive + true if this implementation is case sensitive + + + Determine if the file is executable (or not). + + Determine if the file is executable (or not). +

+ Not all platforms and JREs support executable flags on files. If the + feature is unsupported this method will always return false. + + abstract path to test. + true if the file is believed to be executable by the user. + + +

Set a file to be executable by the user. + + Set a file to be executable by the user. +

+ Not all platforms and JREs support executable flags on files. If the + feature is unsupported this method will always return false and no + changes will be made to the file specified. + + path to modify the executable status of. + true to enable execution; false to disable it. + true if the change succeeded; false otherwise. + + +

Resolve this file to its actual path name that the JRE can use. + + Resolve this file to its actual path name that the JRE can use. +

+ This method can be relatively expensive. Computing a translation may + require forking an external process per path name translated. Callers + should try to minimize the number of translations necessary by caching + the results. +

+ Not all platforms and JREs require path name translation. Currently only + Cygwin on Win32 require translation for Cygwin based paths. + + directory relative to which the path name is. + path name to translate. + + the translated path. new File(dir,name) if this + platform does not require path name translation. + + + +

Determine the user's home directory (location where preferences are). + + Determine the user's home directory (location where preferences are). +

+ This method can be expensive on the first invocation if path name + translation is required. Subsequent invocations return a cached result. +

+ Not all platforms and JREs require path name translation. Currently only + Cygwin on Win32 requires translation of the Cygwin HOME directory. + + the user's home directory; null if the user does not have one. + + +

Set the user's home directory location. + Set the user's home directory location. + + the location of the user's preferences; null if there is no + home directory for the current user. + + + + this + . + +
+ + Does this file system have problems with atomic renames? + true if the caller should retry a failed rename of a lock file. + + + Determine the user's home directory (location where preferences are). + Determine the user's home directory (location where preferences are). + the user's home directory; null if the user does not have one. + + + Searches the given path to see if it contains one of the given files. + + Searches the given path to see if it contains one of the given files. + Returns the first it finds. Returns null if not found or if path is null. + + List of paths to search separated by File.pathSeparator + Files to search for in the given path + the first match found, or null + + + Execute a command and return a single line of output as a String + Working directory for the command + as component array + + the one-line output of the command + + + the $prefix directory C Git would use. + + + the $prefix directory C Git would use. + + + Set the $prefix directory C Git uses. + Set the $prefix directory C Git uses. + the directory. Null if C Git is not installed. + + + this + + + + Initialize a ProcesssBuilder to run a command using the system shell. + Initialize a ProcesssBuilder to run a command using the system shell. + + command to execute. This string should originate from the + end-user, and thus is platform specific. + + + arguments to pass to command. These should be protected from + shell evaluation. + + + a partially completed process builder. Caller should finish + populating directory, environment, and then start the process. + + + + A more efficient List<Integer> using a primitive integer array. + A more efficient List<Integer> using a primitive integer array. + + + Create an empty list with a default capacity. + Create an empty list with a default capacity. + + + Create an empty list with the specified capacity. + Create an empty list with the specified capacity. + number of entries the list can initially hold. + + + number of entries in this list + + + + index to read, must be in the range [0, + Size() + ). + + the number at the specified index + the index outside the valid range + + + + Empty this list + + + Add an entry to the end of the list. + Add an entry to the end of the list. + the number to add. + + + Assign an entry in the list. + Assign an entry in the list. + + index to set, must be in the range [0, + Size() + ). + + value to store at the position. + + + Pad the list with entries. + Pad the list with entries. + + index position to stop filling at. 0 inserts no filler. 1 + ensures the list has a size of 1, adding val if + the list is currently empty. + + value to insert into padded positions. + + + A more efficient List<Long> using a primitive long array. + A more efficient List<Long> using a primitive long array. + + + Create an empty list with a default capacity. + Create an empty list with a default capacity. + + + Create an empty list with the specified capacity. + Create an empty list with the specified capacity. + number of entries the list can initially hold. + + + number of entries in this list + + + + index to read, must be in the range [0, + Size() + ). + + the number at the specified index + the index outside the valid range + + + + Determine if an entry appears in this collection. + Determine if an entry appears in this collection. + the value to search for. + + true of + value + appears in this list. + + + + Empty this list + + + Add an entry to the end of the list. + Add an entry to the end of the list. + the number to add. + + + Assign an entry in the list. + Assign an entry in the list. + + index to set, must be in the range [0, + Size() + ). + + value to store at the position. + + + Pad the list with entries. + Pad the list with entries. + + index position to stop filling at. 0 inserts no filler. 1 + ensures the list has a size of 1, adding val if + the list is currently empty. + + value to insert into padded positions. + + + Sort the list of longs according to their natural ordering. + Sort the list of longs according to their natural ordering. + + + A boxed integer that can be modified. + A boxed integer that can be modified. + + + Current value of this boxed value. + Current value of this boxed value. + + + Conversion utilities for network byte order handling. + Conversion utilities for network byte order handling. + + + Compare a 32 bit unsigned integer stored in a 32 bit signed integer. + + Compare a 32 bit unsigned integer stored in a 32 bit signed integer. +

+ This function performs an unsigned compare operation, even though Java + does not natively support unsigned integer values. Negative numbers are + treated as larger than positive ones. + + the first value to compare. + the second value to compare. + < 0 if a < b; 0 if a == b; > 0 if a > b. + + +

Convert sequence of 2 bytes (network byte order) into unsigned value. + Convert sequence of 2 bytes (network byte order) into unsigned value. + buffer to acquire the 2 bytes of data from. + + position within the buffer to begin reading from. This + position and the next byte after it (for a total of 2 bytes) + will be read. + + unsigned integer value that matches the 16 bits read. +
+ + Convert sequence of 4 bytes (network byte order) into signed value. + Convert sequence of 4 bytes (network byte order) into signed value. + buffer to acquire the 4 bytes of data from. + + position within the buffer to begin reading from. This + position and the next 3 bytes after it (for a total of 4 + bytes) will be read. + + signed integer value that matches the 32 bits read. + + + Convert sequence of 4 bytes (network byte order) into unsigned value. + Convert sequence of 4 bytes (network byte order) into unsigned value. + buffer to acquire the 4 bytes of data from. + + position within the buffer to begin reading from. This + position and the next 3 bytes after it (for a total of 4 + bytes) will be read. + + unsigned integer value that matches the 32 bits read. + + + Convert sequence of 8 bytes (network byte order) into unsigned value. + Convert sequence of 8 bytes (network byte order) into unsigned value. + buffer to acquire the 8 bytes of data from. + + position within the buffer to begin reading from. This + position and the next 7 bytes after it (for a total of 8 + bytes) will be read. + + unsigned integer value that matches the 64 bits read. + + + Write a 16 bit integer as a sequence of 2 bytes (network byte order). + Write a 16 bit integer as a sequence of 2 bytes (network byte order). + buffer to write the 2 bytes of data into. + + position within the buffer to begin writing to. This position + and the next byte after it (for a total of 2 bytes) will be + replaced. + + the value to write. + + + Write a 32 bit integer as a sequence of 4 bytes (network byte order). + Write a 32 bit integer as a sequence of 4 bytes (network byte order). + buffer to write the 4 bytes of data into. + + position within the buffer to begin writing to. This position + and the next 3 bytes after it (for a total of 4 bytes) will be + replaced. + + the value to write. + + + Write a 64 bit integer as a sequence of 8 bytes (network byte order). + Write a 64 bit integer as a sequence of 8 bytes (network byte order). + buffer to write the 48bytes of data into. + + position within the buffer to begin writing to. This position + and the next 7 bytes after it (for a total of 8 bytes) will be + replaced. + + the value to write. + + + Utility functions related to quoted string handling. + Utility functions related to quoted string handling. + + + Quoting style that obeys the rules Git applies to file names + + + Quoting style used by the Bourne shell. + + Quoting style used by the Bourne shell. +

+ Quotes are unconditionally inserted during + Quote(string) + . This + protects shell meta-characters like $ or ~ from + being recognized as special. + + + +

Bourne style, but permits ~user at the start of the string. + + Bourne style, but permits ~user at the start of the string. + +
+ + Quote an input string by the quoting rules. + + Quote an input string by the quoting rules. +

+ If the input string does not require any quoting, the same String + reference is returned to the caller. +

+ Otherwise a quoted string is returned, including the opening and closing + quotation marks at the start and end of the string. If the style does not + permit raw Unicode characters then the string will first be encoded in + UTF-8, with unprintable sequences possibly escaped by the rules. + + any non-null Unicode string. + a quoted string. See above for details. + + +

Clean a previously quoted input, decoding the result via UTF-8. + + Clean a previously quoted input, decoding the result via UTF-8. +

+ This method must match quote such that: +

+            a.equals(dequote(quote(a)));
+            
+ is true for any a. +
+ a Unicode string to remove quoting from. + the cleaned string. + Dequote(byte[], int, int) +
+ + Decode a previously quoted input, scanning a UTF-8 encoded buffer. + + Decode a previously quoted input, scanning a UTF-8 encoded buffer. +

+ This method must match quote such that: +

+            a.equals(dequote(Constants.encode(quote(a))));
+            
+ is true for any a. +

+ This method removes any opening/closing quotation marks added by + Quote(string) + . + + the input buffer to parse. + first position within in to scan. + one position past in in to scan. + the cleaned string. + + +

Quoting style used by the Bourne shell. + + Quoting style used by the Bourne shell. +

+ Quotes are unconditionally inserted during + Quote(string) + . This + protects shell meta-characters like $ or ~ from + being recognized as special. + + + +

Bourne style, but permits ~user at the start of the string. + + Bourne style, but permits ~user at the start of the string. + +
+ + Quoting style that obeys the rules Git applies to file names + + + A rough character sequence around a raw byte buffer. + + A rough character sequence around a raw byte buffer. +

+ Characters are assumed to be 8-bit US-ASCII. + + + +

A zero-length character sequence. + A zero-length character sequence. +
+ + Create a rough character sequence around the raw byte buffer. + Create a rough character sequence around the raw byte buffer. + buffer to scan. + starting position for the sequence. + ending position for the sequence. + + + + Utility class for character functions on raw bytes +

+ Characters are assumed to be 8-bit US-ASCII. +

+ + Utility class for character functions on raw bytes +

+ Characters are assumed to be 8-bit US-ASCII. + + + +

Determine if an 8-bit US-ASCII encoded character is represents whitespace + + the 8-bit US-ASCII encoded character + true if c represents a whitespace character in 8-bit US-ASCII +
+ + + Returns the new end point for the byte array passed in after trimming any + trailing whitespace characters, as determined by the isWhitespace() + function. + + + Returns the new end point for the byte array passed in after trimming any + trailing whitespace characters, as determined by the isWhitespace() + function. start and end are assumed to be within the bounds of raw. + + the byte array containing the portion to trim whitespace for + the start of the section of bytes + the end of the section of bytes + the new end point + + + + Returns the new start point for the byte array passed in after trimming + any leading whitespace characters, as determined by the isWhitespace() + function. + + + Returns the new start point for the byte array passed in after trimming + any leading whitespace characters, as determined by the isWhitespace() + function. start and end are assumed to be within the bounds of raw. + + the byte array containing the portion to trim whitespace for + the start of the section of bytes + the end of the section of bytes + the new start point + + + Handy utility functions to parse raw object contents. + Handy utility functions to parse raw object contents. + + + UTF-8 charset constant. + UTF-8 charset constant. + + + Determine if b[ptr] matches src. + Determine if b[ptr] matches src. + the buffer to scan. + first position within b, this should match src[0]. + the buffer to test for equality with b. + ptr + src.length if b[ptr..src.length] == src; else -1. + + + Format a base 10 numeric into a temporary buffer. + + Format a base 10 numeric into a temporary buffer. +

+ Formatting is performed backwards. The method starts at offset + o-1 and ends at o-1-digits, where + digits is the number of positions necessary to store the + base 10 value. +

+ The argument and return values from this method make it easy to chain + writing, for example: +

+            final byte[] tmp = new byte[64];
+            int ptr = tmp.length;
+            tmp[--ptr] = '\n';
+            ptr = RawParseUtils.formatBase10(tmp, ptr, 32);
+            tmp[--ptr] = ' ';
+            ptr = RawParseUtils.formatBase10(tmp, ptr, 18);
+            tmp[--ptr] = 0;
+            final String str = new String(tmp, ptr, tmp.length - ptr);
+            
+
+ buffer to write into. + + one offset past the location where writing will begin; writing + proceeds towards lower index values. + + the value to store. + + the new offset value o. This is the position of + the last byte written. Additional writing should start at one + position earlier. + +
+ + Parse a base 10 numeric from a sequence of ASCII digits into an int. + + Parse a base 10 numeric from a sequence of ASCII digits into an int. +

+ Digit sequences can begin with an optional run of spaces before the + sequence, and may start with a '+' or a '-' to indicate sign position. + Any other characters will cause the method to stop and return the current + result to the caller. + + buffer to scan. + position within buffer to start parsing digits at. + + optional location to return the new ptr value through. If null + the ptr value will be discarded. + + + the value at this location; 0 if the location is not a valid + numeric. + + + +

Parse a base 10 numeric from a sequence of ASCII digits into a long. + + Parse a base 10 numeric from a sequence of ASCII digits into a long. +

+ Digit sequences can begin with an optional run of spaces before the + sequence, and may start with a '+' or a '-' to indicate sign position. + Any other characters will cause the method to stop and return the current + result to the caller. + + buffer to scan. + position within buffer to start parsing digits at. + + optional location to return the new ptr value through. If null + the ptr value will be discarded. + + + the value at this location; 0 if the location is not a valid + numeric. + + + +

Parse 4 character base 16 (hex) formatted string to unsigned integer. + + Parse 4 character base 16 (hex) formatted string to unsigned integer. +

+ The number is read in network byte order, that is, most significant + nybble first. + + + buffer to parse digits from; positions + [p, p+4) + will + be parsed. + + first position within the buffer to parse. + the integer value. + if the string is not hex formatted. + + + +

Parse 8 character base 16 (hex) formatted string to unsigned integer. + + Parse 8 character base 16 (hex) formatted string to unsigned integer. +

+ The number is read in network byte order, that is, most significant + nybble first. + + + buffer to parse digits from; positions + [p, p+8) + will + be parsed. + + first position within the buffer to parse. + the integer value. + if the string is not hex formatted. + + + +

Parse a single hex digit to its numeric value (0-15). + Parse a single hex digit to its numeric value (0-15). + hex character to parse. + numeric value, in the range 0-15. + if the input digit is not a valid hex digit. + +
+ + Parse a Git style timezone string. + + Parse a Git style timezone string. +

+ The sequence "-0315" will be parsed as the numeric value -195, as the + lower two positions count minutes, not 100ths of an hour. + + buffer to scan. + position within buffer to start parsing digits at. + the timezone at this location, expressed in minutes. + + +

Locate the first position after a given character. + Locate the first position after a given character. + buffer to scan. + position within buffer to start looking for chrA at. + character to find. + new position just after chrA. +
+ + Locate the first position after the next LF. + + Locate the first position after the next LF. +

+ This method stops on the first '\n' it finds. + + buffer to scan. + position within buffer to start looking for LF at. + new position just after the first LF found. + + +

Locate the first position after either the given character or LF. + + Locate the first position after either the given character or LF. +

+ This method stops on the first match it finds from either chrA or '\n'. + + buffer to scan. + position within buffer to start looking for chrA or LF at. + character to find. + new position just after the first chrA or LF to be found. + + +

Locate the first position before a given character. + Locate the first position before a given character. + buffer to scan. + position within buffer to start looking for chrA at. + character to find. + new position just before chrA, -1 for not found +
+ + Locate the first position before the previous LF. + + Locate the first position before the previous LF. +

+ This method stops on the first '\n' it finds. + + buffer to scan. + position within buffer to start looking for LF at. + new position just before the first LF found, -1 for not found + + +

Locate the previous position before either the given character or LF. + + Locate the previous position before either the given character or LF. +

+ This method stops on the first match it finds from either chrA or '\n'. + + buffer to scan. + position within buffer to start looking for chrA or LF at. + character to find. + + new position just before the first chrA or LF to be found, -1 for + not found + + + +

Index the region between [ptr, end) to find line starts. + + Index the region between [ptr, end) to find line starts. +

+ The returned list is 1 indexed. Index 0 contains + int.MinValue + to pad the list out. +

+ Using a 1 indexed list means that line numbers can be directly accessed + from the list, so list.get(1) (aka get line 1) returns + ptr. +

+ The last element (index map.size()-1) always contains + end. + + buffer to scan. + + position within the buffer corresponding to the first byte of + line 1. + + 1 past the end of the content within buf. + a line map indexing the start position of each line. + + +

Locate the "author " header line data. + Locate the "author " header line data. + buffer to scan. + + position in buffer to start the scan at. Most callers should + pass 0 to ensure the scan starts from the beginning of the + commit buffer and does not accidentally look at message body. + + + position just after the space in "author ", so the first + character of the author's name. If no author header can be + located -1 is returned. + +
+ + Locate the "committer " header line data. + Locate the "committer " header line data. + buffer to scan. + + position in buffer to start the scan at. Most callers should + pass 0 to ensure the scan starts from the beginning of the + commit buffer and does not accidentally look at message body. + + + position just after the space in "committer ", so the first + character of the committer's name. If no committer header can be + located -1 is returned. + + + + Locate the "tagger " header line data. + Locate the "tagger " header line data. + buffer to scan. + + position in buffer to start the scan at. Most callers should + pass 0 to ensure the scan starts from the beginning of the tag + buffer and does not accidentally look at message body. + + + position just after the space in "tagger ", so the first + character of the tagger's name. If no tagger header can be + located -1 is returned. + + + + Locate the "encoding " header line. + Locate the "encoding " header line. + buffer to scan. + + position in buffer to start the scan at. Most callers should + pass 0 to ensure the scan starts from the beginning of the + buffer and does not accidentally look at the message body. + + + position just after the space in "encoding ", so the first + character of the encoding's name. If no encoding header can be + located -1 is returned (and UTF-8 should be assumed). + + + + Parse the "encoding " header into a character set reference. + + Parse the "encoding " header into a character set reference. +

+ Locates the "encoding " header (if present) by first calling + Encoding(byte[], int) + and then returns the proper character set + to apply to this buffer to evaluate its contents as character data. +

+ If no encoding header is present, + NGit.Constants.CHARSET + is assumed. + + buffer to scan. + the Java character set representation. Never null. + + +

Parse a name string (e.g. + + Parse a name string (e.g. author, committer, tagger) into a PersonIdent. +

+ Leading spaces won't be trimmed from the string, i.e. will show up in the + parsed name afterwards. + + the string to parse a name from. + + the parsed identity or null in case the identity could not be + parsed. + + + +

Parse a name line (e.g. + + Parse a name line (e.g. author, committer, tagger) into a PersonIdent. +

+ When passing in a value for nameB callers should use the + return value of + Author(byte[], int) + or + Committer(byte[], int) + , as these methods provide the proper + position within the buffer. + + the buffer to parse character data from. + + first position of the identity information. This should be the + first position after the space which delimits the header field + name (e.g. "author" or "committer") from the rest of the + identity line. + + + the parsed identity or null in case the identity could not be + parsed. + + + +

Parse a name data (e.g. + + Parse a name data (e.g. as within a reflog) into a PersonIdent. +

+ When passing in a value for nameB callers should use the + return value of + Author(byte[], int) + or + Committer(byte[], int) + , as these methods provide the proper + position within the buffer. + + the buffer to parse character data from. + + first position of the identity information. This should be the + first position after the space which delimits the header field + name (e.g. "author" or "committer") from the rest of the + identity line. + + the parsed identity. Never null. + + +

Locate the end of a footer line key string. + + Locate the end of a footer line key string. +

+ If the region at + raw[ptr] + matches + ^[A-Za-z0-9-]+: + (e.g. + "Signed-off-by: A. U. Thor\n") then this method returns the position of + the first ':'. +

+ If the region at + raw[ptr] + does not match + ^[A-Za-z0-9-]+: + then this method returns -1. + + buffer to scan. + first position within raw to consider as a footer line key. + + position of the ':' which terminates the footer line key if this + is otherwise a valid footer line key; otherwise -1. + + + +

Decode a buffer under UTF-8, if possible. + + Decode a buffer under UTF-8, if possible. + If the byte stream cannot be decoded that way, the platform default is tried + and if that too fails, the fail-safe ISO-8859-1 encoding is tried. + + buffer to pull raw bytes from. + + a string representation of the range [start,end), + after decoding the region through the specified character set. + +
+ + Decode a buffer under UTF-8, if possible. + + Decode a buffer under UTF-8, if possible. + If the byte stream cannot be decoded that way, the platform default is + tried and if that too fails, the fail-safe ISO-8859-1 encoding is tried. + + buffer to pull raw bytes from. + start position in buffer + + one position past the last location within the buffer to take + data from. + + + a string representation of the range [start,end), + after decoding the region through the specified character set. + + + + Decode a buffer under the specified character set if possible. + + Decode a buffer under the specified character set if possible. + If the byte stream cannot be decoded that way, the platform default is tried + and if that too fails, the fail-safe ISO-8859-1 encoding is tried. + + character set to use when decoding the buffer. + buffer to pull raw bytes from. + + a string representation of the range [start,end), + after decoding the region through the specified character set. + + + + Decode a region of the buffer under the specified character set if possible. + + + Decode a region of the buffer under the specified character set if possible. + If the byte stream cannot be decoded that way, the platform default is tried + and if that too fails, the fail-safe ISO-8859-1 encoding is tried. + + character set to use when decoding the buffer. + buffer to pull raw bytes from. + first position within the buffer to take data from. + + one position past the last location within the buffer to take + data from. + + + a string representation of the range [start,end), + after decoding the region through the specified character set. + + + + + Decode a region of the buffer under the specified character set if + possible. + + + Decode a region of the buffer under the specified character set if + possible. + If the byte stream cannot be decoded that way, the platform default is + tried and if that too fails, an exception is thrown. + + character set to use when decoding the buffer. + buffer to pull raw bytes from. + first position within the buffer to take data from. + + one position past the last location within the buffer to take + data from. + + + a string representation of the range [start,end), + after decoding the region through the specified character set. + + the input is not in any of the tested character sets. + + + + Decode a region of the buffer under the ISO-8859-1 encoding. + + Decode a region of the buffer under the ISO-8859-1 encoding. + Each byte is treated as a single character in the 8859-1 character + encoding, performing a raw binary->char conversion. + + buffer to pull raw bytes from. + first position within the buffer to take data from. + + one position past the last location within the buffer to take + data from. + + a string representation of the range [start,end). + + + + + + Locate the position of the commit message body. + Locate the position of the commit message body. + buffer to scan. + + position in buffer to start the scan at. Most callers should + pass 0 to ensure the scan starts from the beginning of the + commit buffer. + + position of the user's message buffer. + + + Locate the position of the tag message body. + Locate the position of the tag message body. + buffer to scan. + + position in buffer to start the scan at. Most callers should + pass 0 to ensure the scan starts from the beginning of the tag + buffer. + + position of the user's message buffer. + + + Locate the end of a paragraph. + + Locate the end of a paragraph. +

+ A paragraph is ended by two consecutive LF bytes. + + buffer to scan. + + position in buffer to start the scan at. Most callers will + want to pass the first position of the commit message (as + found by + CommitMessage(byte[], int) + . + + + position of the LF at the end of the paragraph; + b.length if no paragraph end could be located. + + + +

Searches text using only substring search. + + Searches text using only substring search. +

+ Instances are thread-safe. Multiple concurrent threads may perform matches on + different character sequences at the same time. + + + +

Construct a new substring pattern. + Construct a new substring pattern. + + text to locate. This should be a literal string, as no + meta-characters are supported by this implementation. The + string may not be the empty string. + +
+ + Match a character sequence against this pattern. + Match a character sequence against this pattern. + + the sequence to match. Must not be null but the length of the + sequence is permitted to be 0. + + + offset within rcs of the first occurrence of this + pattern; -1 if this pattern does not appear at any position of + rcs. + + + + Get the literal pattern string this instance searches for. + Get the literal pattern string this instance searches for. + the pattern string given to our constructor. + + + Builder to facilitate fast construction of an immutable RefList. + Builder to facilitate fast construction of an immutable RefList. + + + Create an empty list ready for items to be added. + Create an empty list ready for items to be added. + + + Create an empty list with at least the specified capacity. + Create an empty list with at least the specified capacity. + the new capacity. + + + number of items in this builder's internal collection. + + + Get the reference at a particular index. + Get the reference at a particular index. + + the index to obtain. Must be + 0 <= idx < size() + . + + the reference value, never null. + + + Remove an item at a specific index. + Remove an item at a specific index. + position to remove the item from. + + + Add the reference to the end of the array. + + Add the reference to the end of the array. +

+ References must be added in sort order, or the array must be sorted + after additions are complete using + Builder<T>.Sort() + . + + + + +

Add all items from a source array. + + Add all items from a source array. +

+ References must be added in sort order, or the array must be sorted + after additions are complete using + Builder<T>.Sort() + . + + the source array. + + position within + src + to start copying from. + + + number of items to copy from + src + . + + + +

Replace a single existing element. + Replace a single existing element. + index, must have already been added previously. + the new reference. +
+ + Sort the list's backing array in-place. + Sort the list's backing array in-place. + + + an unmodifiable list using this collection's backing array. + + + + Specialized Map to present a + RefDatabase + namespace. +

+ Although not declared as a + Sharpen.SortedMap<K, V> + , iterators from this + map's projections always return references in + NGit.RefComparator + ordering. + The map's internal representation is a sorted array of + NGit.Ref + objects, + which means lookup and replacement is O(log N), while insertion and removal + can be as expensive as O(N + log N) while the list expands or contracts. + Since this is not a general map implementation, all entries must be keyed by + the reference name. +

+ This class is really intended as a helper for + RefDatabase + , which + needs to perform a merge-join of three sorted + RefList<T> + s in order to + present the unified namespace of the packed-refs file, the loose refs/ + directory tree, and the resolved form of any symbolic references. +

+
+ + Prefix denoting the reference subspace this map contains. + + Prefix denoting the reference subspace this map contains. +

+ All reference names in this map must start with this prefix. If the + prefix is not the empty string, it must end with a '/'. + + + +

Immutable collection of the packed references at construction time. + Immutable collection of the packed references at construction time. +
+ + Immutable collection of the loose references at construction time. + + Immutable collection of the loose references at construction time. +

+ If an entry appears here and in + packed + , this entry must take + precedence, as its more current. Symbolic references in this collection + are typically unresolved, so they only tell us who their target is, but + not the current value of the target. + + + +

Immutable collection of resolved symbolic references. + + Immutable collection of resolved symbolic references. +

+ This collection contains only the symbolic references we were able to + resolve at map construction time. Other loose references must be read + from + loose + . Every entry in this list must be matched by an entry + in + loose + , otherwise it might be omitted by the map. + + + +

Construct an empty map with a small initial capacity. + Construct an empty map with a small initial capacity. +
+ + Construct a map to merge 3 collections together. + Construct a map to merge 3 collections together. + + prefix used to slice the lists down. Only references whose + names start with this prefix will appear to reside in the map. + Must not be null, use + "" + (the empty string) to select + all list items. + + + items from the packed reference list, this is the last list + searched. + + + items from the loose reference list, this list overrides + packed + if a name appears in both. + + + resolved symbolic references. This list overrides the prior + list + loose + , if an item appears in both. Items in this + list must also appear in + loose + . + + + + Miscellaneous string comparison utility methods. + Miscellaneous string comparison utility methods. + + + Convert the input to lowercase. + + Convert the input to lowercase. +

+ This method does not honor the JVM locale, but instead always behaves as + though it is in the US-ASCII locale. Only characters in the range 'A' + through 'Z' are converted. All other characters are left as-is, even if + they otherwise would have a lowercase character equivalent. + + the input character. + lowercase version of the input. + + +

Convert the input string to lower case, according to the "C" locale. + + Convert the input string to lower case, according to the "C" locale. +

+ This method does not honor the JVM locale, but instead always behaves as + though it is in the US-ASCII locale. Only characters in the range 'A' + through 'Z' are converted, all other characters are left as-is, even if + they otherwise would have a lowercase character equivalent. + + the input string. Must not be null. + + a copy of the input string, after converting characters in the + range 'A'..'Z' to 'a'..'z'. + + + +

Test if two strings are equal, ignoring case. + + Test if two strings are equal, ignoring case. +

+ This method does not honor the JVM locale, but instead always behaves as + though it is in the US-ASCII locale. + + first string to compare. + second string to compare. + true if a equals b + + +

Compare two strings, ignoring case. + + Compare two strings, ignoring case. +

+ This method does not honor the JVM locale, but instead always behaves as + though it is in the US-ASCII locale. + + first string to compare. + second string to compare. + + negative, zero or positive if a sorts before, is equal to, or + sorts after b. + + 2.0 + + +

Compare two strings, honoring case. + + Compare two strings, honoring case. +

+ This method does not honor the JVM locale, but instead always behaves as + though it is in the US-ASCII locale. + + first string to compare. + second string to compare. + + negative, zero or positive if a sorts before, is equal to, or + sorts after b. + + 2.0 + + +

Parse a string as a standard Git boolean value. + + Parse a string as a standard Git boolean value. See + ToBooleanOrNull(string) + . + + the string to parse. + + the boolean interpretation of + value + . + + + if + value + is not recognized as one of the standard + boolean names. + +
+ + Parse a string as a standard Git boolean value. + + Parse a string as a standard Git boolean value. +

+ The terms + yes + , + true + , + 1 + , + on + can all be + used to mean + true + . +

+ The terms + no + , + false + , + 0 + , + off + can all be + used to mean + false + . +

+ Comparisons ignore case, via + EqualsIgnoreCase(string, string) + . + + the string to parse. + + the boolean interpretation of + value + or null in case the + string does not represent a boolean value + + + +

Join a collection of Strings together using the specified separator. + Join a collection of Strings together using the specified separator. + Strings to join + used to join + a String with all the joined parts +
+ + + Join a collection of Strings together using the specified separator and a + lastSeparator which is used for joining the second last and the last + part. + + + Join a collection of Strings together using the specified separator and a + lastSeparator which is used for joining the second last and the last + part. + + Strings to join + separator used to join all but the two last elements + separator to use for joining the last two elements + a String with all the joined parts + + + Test if a string is empty or null. + Test if a string is empty or null. + the string to check + true if the string is null or empty + + + Interface to read values from the system. + + Interface to read values from the system. +

+ When writing unit tests, extending this interface with a custom class + permits to simulate an access to a system variable or property and + permits to control the user's global configuration. + + + + the live instance to read system properties. + + + the new instance to use when accessing properties. + + +

Gets the hostname of the local host. + + Gets the hostname of the local host. If no hostname can be found, the + hostname is set to the default value "localhost". + + the canonical hostname +
+ + system variable to read + value of the system variable + + + of the system property to read + value of the system property + + + a config with values not found directly in the returned config + + + the file system abstraction which will be necessary to perform + certain file system operations. + + the git configuration found in the user home + + + + a config with values not found directly in the returned + config. Null is a reasonable value here. + + + the file system abstraction which will be necessary to perform + certain file system operations. + + + the gitonfig configuration found in the system-wide "etc" + directory + + + + the current system time + + + TODO + the local time zone + + + system time zone, possibly mocked for testing + 1.2 + + + the locale to use + 1.2 + + + Returns a simple date format instance as specified by the given pattern. + + Returns a simple date format instance as specified by the given pattern. + + + the pattern as defined in + Sharpen.SimpleDateFormat.SimpleDateFormat(string) + + + the simple date format + 2.0 + + + Returns a date/time format instance for the given styles. + Returns a date/time format instance for the given styles. + + the date style as specified in + Sharpen.DateFormat.GetDateTimeInstance(int, int) + + + + the time style as specified in + Sharpen.DateFormat.GetDateTimeInstance(int, int) + + + the date format + 2.0 + + + true if we are running on a Windows. + + + true if we are running on Mac OS X + + + A fully buffered output stream. + + A fully buffered output stream. +

+ Subclasses determine the behavior when the in-memory buffer capacity has been + exceeded and additional bytes are still being received for output. + + + +

Default limit for in-core storage. + Default limit for in-core storage. +
+ + Chain of data, if we are still completely in-core; otherwise null. + Chain of data, if we are still completely in-core; otherwise null. + + + Maximum number of bytes we will permit storing in memory. + + Maximum number of bytes we will permit storing in memory. +

+ When this limit is reached the data will be shifted to a file on disk, + preventing the JVM heap from growing out of control. + + + +

+ If + inCoreLimit + has been reached, remainder goes here. + +
+ + Create a new empty temporary buffer. + Create a new empty temporary buffer. + + maximum number of bytes to store in memory before entering the + overflow output path. + + + + + + + + + + Dumps the entire buffer into the overflow stream, and flushes it. + Dumps the entire buffer into the overflow stream, and flushes it. + + the overflow stream cannot be started, or the buffer contents + cannot be written to it, or it failed to flush. + + + + Copy all bytes remaining on the input stream into this buffer. + Copy all bytes remaining on the input stream into this buffer. + the stream to read from, until EOF is reached. + + an error occurred reading from the input stream, or while + writing to a local temporary file. + + + + Obtain the length (in bytes) of the buffer. + + Obtain the length (in bytes) of the buffer. +

+ The length is only accurate after + Close() + has been invoked. + + total length of the buffer, in bytes. + + +

Convert this buffer's contents into a contiguous byte array. + + Convert this buffer's contents into a contiguous byte array. +

+ The buffer is only complete after + Close() + has been invoked. + + + the complete byte array; length matches + Length() + . + + an error occurred reading from a local temporary file + + the buffer cannot fit in memory + + +

Send this buffer to an output stream. + + Send this buffer to an output stream. +

+ This method may only be invoked after + Close() + has completed + normally, to ensure all data is completely transferred. + + stream to send this buffer's complete content to. + + if not null progress updates are sent here. Caller should + initialize the task and the number of work units to + Length() + /1024. + + + an error occurred reading from a temporary file on the local + system, or writing to the output stream. + + + +

Open an input stream to read from the buffered data. + + Open an input stream to read from the buffered data. +

+ This method may only be invoked after + Close() + has completed + normally, to ensure all data is completely transferred. + + + a stream to read from the buffer. The caller must close the + stream when it is no longer useful. + + an error occurred opening the temporary file. + + + +

Reset this buffer for reuse, purging all buffered content. + Reset this buffer for reuse, purging all buffered content. +
+ + Open the overflow output stream, so the remaining output can be stored. + Open the overflow output stream, so the remaining output can be stored. + + the output stream to receive the buffered content, followed by + the remaining output. + + the buffer cannot create the overflow stream. + + + + + + + + + + + + + Clear this buffer so it has no data, and cannot be used again. + Clear this buffer so it has no data, and cannot be used again. + + + A fully buffered output stream using local disk storage for large data. + + A fully buffered output stream using local disk storage for large data. +

+ Initially this output stream buffers to memory and is therefore similar + to ByteArrayOutputStream, but it shifts to using an on disk temporary + file if the output gets too large. +

+ The content of this buffered stream may be sent to another OutputStream + only after this stream has been properly closed by + TemporaryBuffer.Close() + . + + + +

Directory to store the temporary file under. + Directory to store the temporary file under. +
+ + Location of our temporary file if we are on disk; otherwise null. + + Location of our temporary file if we are on disk; otherwise null. +

+ If we exceeded the + TemporaryBuffer.inCoreLimit + we nulled out + TemporaryBuffer.blocks + and created this file instead. All output goes here through + TemporaryBuffer.overflow + . + + + +

Create a new temporary buffer. + Create a new temporary buffer. +
+ + Create a new temporary buffer, limiting memory usage. + Create a new temporary buffer, limiting memory usage. + + maximum number of bytes to store in memory. Storage beyond + this limit will use the local file. + + + + Create a new temporary buffer, limiting memory usage. + Create a new temporary buffer, limiting memory usage. + + if the buffer has to spill over into a temporary file, the + directory where the file should be saved. If null the + system default temporary directory (for example /tmp) will + be used instead. + + + + Create a new temporary buffer, limiting memory usage. + Create a new temporary buffer, limiting memory usage. + + if the buffer has to spill over into a temporary file, the + directory where the file should be saved. If null the + system default temporary directory (for example /tmp) will + be used instead. + + + maximum number of bytes to store in memory. Storage beyond + this limit will use the local file. + + + + + + + + + + + + + + + + A temporary buffer that will never exceed its in-memory limit. + + A temporary buffer that will never exceed its in-memory limit. +

+ If the in-memory limit is reached an IOException is thrown, rather than + attempting to spool to local disk. + + + +

Create a new heap buffer with a maximum storage limit. + Create a new heap buffer with a maximum storage limit. + + maximum number of bytes that can be stored in this buffer. + Storing beyond this many will cause an IOException to be + thrown during write. + +
+ + + + + + + + + + + + + + An OutputStream which always throws IllegalStateExeption during write. + An OutputStream which always throws IllegalStateExeption during write. + + + The canonical instance which always throws IllegalStateException. + The canonical instance which always throws IllegalStateException. + + + + + + An input stream which canonicalizes EOLs bytes on the fly to '\n'. + + An input stream which canonicalizes EOLs bytes on the fly to '\n'. + Optionally, a binary check on the first 8000 bytes is performed + and in case of binary files, canonicalization is turned off + (for the complete file). + + + + Creates a new InputStream, wrapping the specified stream + raw input stream + whether binaries should be detected + 2.0 + + + + + + + + + + + + + + + Triggers an interrupt on the calling thread if it doesn't complete a block. + + + Triggers an interrupt on the calling thread if it doesn't complete a block. +

+ Classes can use this to trip an alarm interrupting the calling thread if it + doesn't complete a block within the specified timeout. Typical calling + pattern is: +

+            private InterruptTimer myTimer = ...;
+            void foo() {
+            try {
+            myTimer.begin(timeout);
+            // work
+            } finally {
+            myTimer.end();
+            }
+            }
+            
+

+ An InterruptTimer is not recursive. To implement recursive timers, + independent InterruptTimer instances are required. A single InterruptTimer + may be shared between objects which won't recursively call each other. +

+ Each InterruptTimer spawns one background thread to sleep the specified time + and interrupt the thread which called + Begin(int) + . It is up to the + caller to ensure that the operations within the work block between the + matched begin and end calls tests the interrupt flag (most IO operations do). +

+ To terminate the background thread, use + Terminate() + . If the + application fails to terminate the thread, it will (eventually) terminate + itself when the InterruptTimer instance is garbage collected. + + TimeoutInputStream + + +

Create a new timer with a default thread name. + Create a new timer with a default thread name. +
+ + Create a new timer to signal on interrupt on the caller. + + Create a new timer to signal on interrupt on the caller. +

+ The timer thread is created in the calling thread's ThreadGroup. + + name of the timer thread. + + +

Arm the interrupt timer before entering a blocking operation. + Arm the interrupt timer before entering a blocking operation. + + number of milliseconds before the interrupt should trigger. + Must be > 0. + +
+ + Disable the interrupt timer, as the operation is complete. + Disable the interrupt timer, as the operation is complete. + + + Shutdown the timer thread, and wait for it to terminate. + Shutdown the timer thread, and wait for it to terminate. + + + Combines messages from an OutputStream (hopefully in UTF-8) and a Writer. + + + Combines messages from an OutputStream (hopefully in UTF-8) and a Writer. +

+ This class is primarily meant for + NGit.Transport.BaseConnection + in contexts where a + standard error stream from a command execution, as well as messages from a + side-band channel, need to be combined together into a buffer to represent + the complete set of messages from a remote repository. +

+ Writes made to the writer are re-encoded as UTF-8 and interleaved into the + buffer that + GetRawStream() + also writes to. +

+ ToString() + returns all written data, after converting it to a String + under the assumption of UTF-8 encoding. +

+ Internally + NGit.Util.RawParseUtils.Decode(byte[]) + + is used by + toString() + tries to work out a reasonably correct character set for the raw data. + + + +

Create an empty writer. + Create an empty writer. +
+ + + + + + the underlying byte stream that character writes to this writer + drop into. Writes to this stream should should be in UTF-8. + + + + + + + + + + string version of all buffered data. + + + Thread to copy from an input stream to an output stream. + Thread to copy from an input stream to an output stream. + + + Create a thread to copy data from an input stream to an output stream. + Create a thread to copy data from an input stream to an output stream. + + stream to copy from. The thread terminates when this stream + reaches EOF. The thread closes this stream before it exits. + + + stream to copy into. The destination stream is automatically + closed when the thread terminates. + + + + Request the thread to flush the output stream as soon as possible. + + Request the thread to flush the output stream as soon as possible. +

+ This is an asynchronous request to the thread. The actual flush will + happen at some future point in time, when the thread wakes up to process + the request. + + + +

Request that the thread terminate, and wait for it. + + Request that the thread terminate, and wait for it. +

+ This method signals to the copy thread that it should stop as soon as + there is no more IO occurring. + + the calling thread was interrupted. + + +

Input stream that copies data read to another output stream. + + Input stream that copies data read to another output stream. + This stream is primarily useful with a + NGit.Util.TemporaryBuffer + , where any + data read or skipped by the caller is also duplicated into the temporary + buffer. Later the temporary buffer can then be used instead of the original + source stream. + During close this stream copies any remaining data from the source stream + into the destination stream. + +
+ + Initialize a tee input stream. + Initialize a tee input stream. + source stream to consume. + + destination to copy the source to as it is consumed. Typically + this is a + NGit.Util.TemporaryBuffer + . + + + + + + + + + + + + + + + + InputStream with a configurable timeout. + InputStream with a configurable timeout. + + + Wrap an input stream with a timeout on all read operations. + Wrap an input stream with a timeout on all read operations. + + base input stream (to read from). The stream must be + interruptible (most socket streams are). + + timer to manage the timeouts during reads. + + + number of milliseconds before aborting a read. + + + number of milliseconds before aborting a read. Must be > 0. + + + + + + + + + + + + + + + + OutputStream with a configurable timeout. + OutputStream with a configurable timeout. + + + Wrap an output stream with a timeout on all write operations. + Wrap an output stream with a timeout on all write operations. + + base input stream (to write to). The stream must be + interruptible (most socket streams are). + + timer to manage the timeouts during writes. + + + number of milliseconds before aborting a write. + + + number of milliseconds before aborting a write. Must be > 0. + + + + + + + + + + + + + + + + + + + An InputStream which reads from one or more InputStreams. + + An InputStream which reads from one or more InputStreams. +

+ This stream may enter into an EOF state, returning -1 from any of the read + methods, and then later successfully read additional bytes if a new + InputStream is added after reaching EOF. +

+ Currently this stream does not support the mark/reset APIs. If mark and later + reset functionality is needed the caller should wrap this stream with a + Sharpen.BufferedInputStream + . + + + +

Create an empty InputStream that is currently at EOF state. + Create an empty InputStream that is currently at EOF state. +
+ + Create an InputStream that is a union of the individual streams. + + Create an InputStream that is a union of the individual streams. +

+ As each stream reaches EOF, it will be automatically closed before bytes + from the next stream are read. + + streams to be pushed onto this stream. + + + + + +

Add the given InputStream onto the end of the stream queue. + + Add the given InputStream onto the end of the stream queue. +

+ When the stream reaches EOF it will be automatically closed. + + the stream to add; must not be null. + + +

Returns true if there are no more InputStreams in the stream queue. + + Returns true if there are no more InputStreams in the stream queue. +

+ If this method returns + true + then all read methods will signal EOF + by returning -1, until another InputStream has been pushed into the queue + with + Add(Sharpen.InputStream) + . + + true if there are no more streams to read from. + + + + + + + + + + + + + + + + + + + + +

Indicates a local repository does not exist. + Indicates a local repository does not exist. +
+ + Indicates a protocol error has occurred while fetching/pushing objects. + Indicates a protocol error has occurred while fetching/pushing objects. + + + + Constructs an TransportException with the specified detail message + prefixed with provided URI. + + + Constructs an TransportException with the specified detail message + prefixed with provided URI. + + URI used for transport + message + + + + Constructs an TransportException with the specified detail message + prefixed with provided URI. + + + Constructs an TransportException with the specified detail message + prefixed with provided URI. + + URI used for transport + message + root cause exception + + + Constructs an TransportException with the specified detail message. + Constructs an TransportException with the specified detail message. + message + + + Constructs an TransportException with the specified detail message. + Constructs an TransportException with the specified detail message. + message + root cause exception + + + Constructs an exception indicating a local repository does not exist. + Constructs an exception indicating a local repository does not exist. + description of the repository not found, usually file path. + + + + Constructs an exception indicating a local repository does not exist. + Constructs an exception indicating a local repository does not exist. + description of the repository not found, usually file path. + + why the repository does not exist. + + + Constructs an exception indicating a local repository does not exist. + Constructs an exception indicating a local repository does not exist. + description of the repository not found, usually file path. + + + + Constructs an exception indicating a local repository does not exist. + Constructs an exception indicating a local repository does not exist. + description of the repository not found, usually file path. + + why the repository does not exist. + + + + This URI like construct used for referencing Git archives over the net, as + well as locally stored archives. + + + This URI like construct used for referencing Git archives over the net, as + well as locally stored archives. It is similar to RFC 2396 URI's, but also + support SCP and the malformed file://<path> syntax (as opposed to the correct + file:<path> syntax. + + + + + Part of a pattern which matches the scheme part (git, http, ...) of an + URI. + + + Part of a pattern which matches the scheme part (git, http, ...) of an + URI. Defines one capturing group containing the scheme without the + trailing colon and slashes + + + + Part of a pattern which matches the optional user/password part (e.g. + + Part of a pattern which matches the optional user/password part (e.g. + root:pwd@ in git://root:pwd@host.xyz/a.git) of URIs. Defines two + capturing groups: the first containing the user and the second containing + the password + + + + Part of a pattern which matches the host part of URIs. + + Part of a pattern which matches the host part of URIs. Defines one + capturing group containing the host name. + + + + Part of a pattern which matches the optional port part of URIs. + + Part of a pattern which matches the optional port part of URIs. Defines + one capturing group containing the port without the preceding colon. + + + + Part of a pattern which matches the ~username part (e.g. + + Part of a pattern which matches the ~username part (e.g. /~root in + git://host.xyz/~root/a.git) of URIs. Defines no capturing group. + + + + Part of a pattern which matches the optional drive letter in paths (e.g. + + + Part of a pattern which matches the optional drive letter in paths (e.g. + D: in file:///D:/a.txt). Defines no capturing group. + + + + Part of a pattern which matches a relative path. + + Part of a pattern which matches a relative path. Relative paths don't + start with slash or drive letters. Defines no capturing group. + + + + Part of a pattern which matches a relative or absolute path. + + Part of a pattern which matches a relative or absolute path. Defines no + capturing group. + + + + + A pattern matching standard URI:
+ scheme "://" user_password? hostname? portnumber? path +
+
+ + A pattern matching the reference to a local file. + + A pattern matching the reference to a local file. This may be an absolute + path (maybe even containing windows drive-letters) or a relative path. + + + + + A pattern matching a URI for the scheme 'file' which has only ':/' as + separator between scheme and path. + + + A pattern matching a URI for the scheme 'file' which has only ':/' as + separator between scheme and path. Standard file URIs have '://' as + separator, but java.io.File.toURI() constructs those URIs. + + + + A pattern matching a SCP URI's of the form user@host:path/to/repo.git + + + A pattern matching a SCP URI's of the form user@host:/path/to/repo.git + + + + Parse and construct an + URIish + from a string + + + Sharpen.URISyntaxException + + + + + + Escape unprintable characters optionally URI-reserved characters + The Java String to encode (may contain any character) + true to escape URI reserved characters + encode any non-ASCII characters + a URI-encoded string + + + Construct a URIish from a standard URL. + Construct a URIish from a standard URL. + the source URL to convert from. + + + Create an empty, non-configured URI. + Create an empty, non-configured URI. + + + true if this URI references a repository on another system. + + + host name part or null + + + Return a new URI matching this one, but with a different host. + Return a new URI matching this one, but with a different host. + the new value for host. + a new URI with the updated value. + + + protocol name or null for local references + + + Return a new URI matching this one, but with a different scheme. + Return a new URI matching this one, but with a different scheme. + the new value for scheme. + a new URI with the updated value. + + + path name component + + + path name component + + + Return a new URI matching this one, but with a different path. + Return a new URI matching this one, but with a different path. + the new value for path. + a new URI with the updated value. + + + Return a new URI matching this one, but with a different (raw) path. + Return a new URI matching this one, but with a different (raw) path. + the new value for path. + a new URI with the updated value. + Sharpen.URISyntaxException + + + user name requested for transfer or null + + + Return a new URI matching this one, but with a different user. + Return a new URI matching this one, but with a different user. + the new value for user. + a new URI with the updated value. + + + password requested for transfer or null + + + Return a new URI matching this one, but with a different password. + Return a new URI matching this one, but with a different password. + the new value for password. + a new URI with the updated value. + + + port number requested for transfer or -1 if not explicit + + + Return a new URI matching this one, but with a different port. + Return a new URI matching this one, but with a different port. + the new value for port. + a new URI with the updated value. + + + Obtain the string form of the URI, with the password included. + Obtain the string form of the URI, with the password included. + the URI, including its password field, if any. + + + the URI as an ASCII string. Password is not included. + + + + the URI including password, formatted with only ASCII characters + such that it will be valid for use over the network. + + + + Get the "humanish" part of the path. + + Get the "humanish" part of the path. Some examples of a 'humanish' part + for a full path: + + + + + + + + + + + + + + + + + + + + + + +
PathHumanish part
/path/to/repo.gitrepo
/path/to/repo.git/
/path/to/repo/.git
/path/to/repo/
/path//toan empty string
+
+ + the "humanish" part of the path. May be an empty string. Never + null + . + + + if it's impossible to determine a humanish part, or path is + null + or empty + + GetPath() +
+ + + Encapsulates the result of a + MergeCommand + . + + + + the object the head points at after the merge + + the common base which was used to produce a content-merge. May + be null if the merge-result was produced without + computing a common base + + all the commits which have been merged together + the status the merge resulted in + + the used + NGit.Merge.MergeStrategy + + + merge results as returned by + NGit.Merge.ResolveMerger.GetMergeResults() + + + 2.0 + + + the object the head points at after the merge + + the common base which was used to produce a content-merge. May + be null if the merge-result was produced without + computing a common base + + all the commits which have been merged together + the status the merge resulted in + + the used + NGit.Merge.MergeStrategy + + + merge results as returned by + NGit.Merge.ResolveMerger.GetMergeResults() + + + a user friendly description of the merge result + + + the object the head points at after the merge + + the common base which was used to produce a content-merge. May + be null if the merge-result was produced without + computing a common base + + all the commits which have been merged together + the status the merge resulted in + + the used + NGit.Merge.MergeStrategy + + + merge results as returned by + NGit.Merge.ResolveMerger.GetMergeResults() + + + + list of paths causing this merge to fail as returned by + NGit.Merge.ResolveMerger.GetFailingPaths() + + + a user friendly description of the merge result + + + the object the head points at after the merge + + + the status the merge resulted in + + + all the commits which have been merged together + + + + base the common base which was used to produce a content-merge. + May be null if the merge-result was produced without + computing a common base + + + + the conflicts to set + + + + the conflicts to set + + + + + + + + Returns information about the conflicts which occurred during a + MergeCommand + . The returned value maps the path of a conflicting + file to a two-dimensional int-array of line-numbers telling where in the + file conflict markers for which merged commit can be found. +

+ If the returned value contains a mapping "path"->[x][y]=z then this means +

    +
  • the file with path "path" contains conflicts
  • +
  • if y < "number of merged commits": for conflict number x in this file + the chunk which was copied from commit number y starts on line number z. + All numberings and line numbers start with 0.
  • +
  • if y == "number of merged commits": the first non-conflicting line + after conflict number x starts at line number z
  • +
+

+ Example code how to parse this data: +

 MergeResult m=...;
+            Map<String, int[][]> allConflicts = m.getConflicts();
+            for (String path : allConflicts.keySet()) {
+            int[][] c = allConflicts.get(path);
+            System.out.println("Conflicts in file " + path);
+            for (int i = 0; i < c.length; ++i) {
+            System.out.println("  Conflict #" + i);
+            for (int j = 0; j < (c[i].length) - 1; ++j) {
+            if (c[i][j] >= 0)
+            System.out.println("    Chunk for "
+            + m.getMergedCommits()[j] + " starts on line #"
+            + c[i][j]);
+            }
+            }
+            }
+
+ the conflicts or null if no conflict occurred +
+ + + Returns a list of paths causing this merge to fail as returned by + NGit.Merge.ResolveMerger.GetFailingPaths() + + + + the list of paths causing this merge to fail or null + if no failure occurred + + + + whether the status indicates a successful result + + + + Simple Map<long,Object> helper for + PackParser + . + + + + Number of entries currently in the map. + Number of entries currently in the map. + + + + Next + LongMap<V>.size + to trigger a + LongMap<V>.Grow() + . + + + + Input/Output utilities + + + Read an entire local file into memory as a byte array. + Read an entire local file into memory as a byte array. + location of the file to read. + complete contents of the requested local file. + the file does not exist. + the file exists, but its contents cannot be read. + + + + Read at most limit bytes from the local file into memory as a byte array. + + Read at most limit bytes from the local file into memory as a byte array. + + location of the file to read. + + maximum number of bytes to read, if the file is larger than + only the first limit number of bytes are returned + + + complete contents of the requested local file. If the contents + exceeds the limit, then only the limit is returned. + + the file does not exist. + the file exists, but its contents cannot be read. + + + + Read an entire local file into memory as a byte array. + Read an entire local file into memory as a byte array. + location of the file to read. + + maximum number of bytes to read, if the file is larger than + this limit an IOException is thrown. + + complete contents of the requested local file. + the file does not exist. + the file exists, but its contents cannot be read. + + + + Read an entire input stream into memory as a ByteBuffer. + + Read an entire input stream into memory as a ByteBuffer. + Note: The stream is read to its end and is not usable after calling this + method. The caller is responsible for closing the stream. + + input stream to be read. + + a hint on the approximate number of bytes contained in the + stream, used to allocate temporary buffers more efficiently + + + complete contents of the input stream. The ByteBuffer always has + a writable backing array, with + position() == 0 + and + limit() + equal to the actual length read. Callers may rely + on obtaining the underlying array for efficient data access. If + sizeHint + was too large, the array may be over-allocated, + resulting in + limit() < array().length + . + + there was an error reading from the stream. + + + + Read the entire byte array into memory, or throw an exception. + Read the entire byte array into memory, or throw an exception. + input stream to read the data from. + buffer that must be fully populated, [off, off+len). + position within the buffer to start writing to. + number of bytes that must be read. + the stream ended before dst was fully populated. + + there was an error reading from the stream. + + + + Read the entire byte array into memory, unless input is shorter + input stream to read the data from. + buffer that must be fully populated, [off, off+len). + position within the buffer to start writing to. + number of bytes in buffer or stream, whichever is shortest + there was an error reading from the stream. + + + + Skip an entire region of an input stream. + + Skip an entire region of an input stream. +

+ The input stream's position is moved forward by the number of requested + bytes, discarding them from the input. This method does not return until + the exact number of bytes requested has been skipped. + + the stream to skip bytes from. + total number of bytes to be discarded. Must be >= 0. + + the stream ended before the requested number of bytes were + skipped. + + there was an error reading from the stream. + + + +

Divides the given string into lines. + Divides the given string into lines. + the string to read + the string divided into lines + 2.0 +
+ + A remembered remote repository, including URLs and RefSpecs. + + A remembered remote repository, including URLs and RefSpecs. +

+ A remote configuration remembers one or more URLs for a frequently accessed + remote repository as well as zero or more fetch and push specifications + describing how refs should be transferred between this repository and the + remote repository. + + + +

+ Default value for + UploadPack() + if not specified. + +
+ + + Default value for + ReceivePack() + if not specified. + + + + + Parse all remote blocks in an existing configuration file, looking for + remotes configuration. + + + Parse all remote blocks in an existing configuration file, looking for + remotes configuration. + + + the existing configuration to get the remote settings from. + The configuration must already be loaded into memory. + + + all remotes configurations existing in provided repository + configuration. Returned configurations are ordered + lexicographically by names. + + one of the URIs within the remote's configuration is invalid. + + + + Parse a remote block from an existing configuration file. + + Parse a remote block from an existing configuration file. +

+ This constructor succeeds even if the requested remote is not defined + within the supplied configuration file. If that occurs then there will be + no URIs and no ref specifications known to the new instance. + + + the existing configuration to get the remote settings from. + The configuration must already be loaded into memory. + + subsection key indicating the name of this remote. + one of the URIs within the remote's configuration is invalid. + + + +

Update this remote's definition within the configuration. + Update this remote's definition within the configuration. + the configuration file to store ourselves into. +
+ + Add a new URI to the end of the list of URIs. + Add a new URI to the end of the list of URIs. + the new URI to add to this remote. + true if the URI was added; false if it already exists. + + + Remove a URI from the list of URIs. + Remove a URI from the list of URIs. + the URI to remove from this remote. + true if the URI was added; false if it already exists. + + + Add a new push-only URI to the end of the list of URIs. + Add a new push-only URI to the end of the list of URIs. + the new URI to add to this remote. + true if the URI was added; false if it already exists. + + + Remove a push-only URI from the list of URIs. + Remove a push-only URI from the list of URIs. + the URI to remove from this remote. + true if the URI was added; false if it already exists. + + + Add a new fetch RefSpec to this remote. + Add a new fetch RefSpec to this remote. + the new specification to add. + true if the specification was added; false if it already exists. + + + Remove a fetch RefSpec from this remote. + Remove a fetch RefSpec from this remote. + the specification to remove. + true if the specification existed and was removed. + + + Add a new push RefSpec to this remote. + Add a new push RefSpec to this remote. + the new specification to add. + true if the specification was added; false if it already exists. + + + Remove a push RefSpec from this remote. + Remove a push RefSpec from this remote. + the specification to remove. + true if the specification existed and was removed. + + + Get the local name this remote configuration is recognized as. + Get the local name this remote configuration is recognized as. + name assigned by the user to this configuration block. + Set the local name this remote configuration is recognized as. + Set the local name this remote configuration is recognized as. + the new name of this remote. + + + Get all configured URIs under this remote. + Get all configured URIs under this remote. + the set of URIs known to this remote. + + + Get all configured push-only URIs under this remote. + Get all configured push-only URIs under this remote. + the set of URIs known to this remote. + + + Remembered specifications for fetching from a repository. + Remembered specifications for fetching from a repository. + set of specs used by default when fetching. + Override existing fetch specifications with new ones. + Override existing fetch specifications with new ones. + + list of fetch specifications to set. List is copied, it can be + modified after this call. + + + + Override existing push specifications with new ones. + Override existing push specifications with new ones. + + list of push specifications to set. List is copied, it can be + modified after this call. + + Remembered specifications for pushing to a repository. + Remembered specifications for pushing to a repository. + set of specs used by default when pushing. + + + Override for the location of 'git-upload-pack' on the remote system. + + Override for the location of 'git-upload-pack' on the remote system. +

+ This value is only useful for an SSH style connection, where Git is + asking the remote system to execute a program that provides the necessary + network protocol. + + + location of 'git-upload-pack' on the remote system. If no + location has been configured the default of 'git-upload-pack' is + returned instead. + + + +

Override for the location of 'git-receive-pack' on the remote system. + + Override for the location of 'git-receive-pack' on the remote system. +

+ This value is only useful for an SSH style connection, where Git is + asking the remote system to execute a program that provides the necessary + network protocol. + + + location of 'git-receive-pack' on the remote system. If no + location has been configured the default of 'git-receive-pack' is + returned instead. + + + +

Get the description of how annotated tags should be treated during fetch. + + Get the description of how annotated tags should be treated during fetch. + + option indicating the behavior of annotated tags in fetch. + Set the description of how annotated tags should be treated on fetch. + Set the description of how annotated tags should be treated on fetch. + method to use when handling annotated tags. +
+ + + true if pushing to the remote automatically deletes remote refs + which don't exist on the source side. + + Set the mirror flag to automatically delete remote refs. + Set the mirror flag to automatically delete remote refs. + true to automatically delete remote refs during push. + + + timeout (in seconds) before aborting an IO operation. + Set the timeout before willing to abort an IO call. + Set the timeout before willing to abort an IO call. + + number of seconds to wait (with no data transfer occurring) + before aborting an IO read or write operation with this + remote. A timeout of 0 will block indefinitely. + + + + Describes how refs in one repository copy into another repository. + + Describes how refs in one repository copy into another repository. +

+ A ref specification provides matching support and limited rules to rewrite a + reference in one repository to another reference in another repository. + + + +

+ Suffix for wildcard ref spec component, that indicate matching all refs + with specified prefix. + + + Suffix for wildcard ref spec component, that indicate matching all refs + with specified prefix. + +
+ + Check whether provided string is a wildcard ref spec component. + Check whether provided string is a wildcard ref spec component. + ref spec component - string to test. Can be null. + true if provided string is a wildcard ref spec component. + + + Does this specification ask for forced updated (rewind/reset)? + + + Is this specification actually a wildcard match? + + + Name of the ref(s) we would copy from. + Name of the ref(s) we would copy from. + + + Name of the ref(s) we would copy into. + Name of the ref(s) we would copy into. + + + Construct an empty RefSpec. + + Construct an empty RefSpec. +

+ A newly created empty RefSpec is not suitable for use in most + applications, as at least one field must be set to match a source name. + + + +

Parse a ref specification for use during transport operations. + + Parse a ref specification for use during transport operations. +

+ Specifications are typically one of the following forms: +

    +
  • refs/head/master
  • +
  • refs/head/master:refs/remotes/origin/master
  • +
  • refs/head/*:refs/remotes/origin/*
  • +
  • +refs/head/master
  • +
  • +refs/head/master:refs/remotes/origin/master
  • +
  • +refs/head/*:refs/remotes/origin/*
  • +
  • :refs/head/master
  • +
+
+ string describing the specification. + the specification is invalid. +
+ + Check if this specification wants to forcefully update the destination. + Check if this specification wants to forcefully update the destination. + true if this specification asks for updates without merge tests. + + + Create a new RefSpec with a different force update setting. + Create a new RefSpec with a different force update setting. + new value for force update in the returned instance. + a new RefSpec with force update as specified. + + + Check if this specification is actually a wildcard pattern. + + Check if this specification is actually a wildcard pattern. +

+ If this is a wildcard pattern then the source and destination names + returned by + GetSource() + and + GetDestination() + will not + be actual ref names, but instead will be patterns. + + true if this specification could match more than one ref. + + +

Get the source ref description. + + Get the source ref description. +

+ During a fetch this is the name of the ref on the remote repository we + are fetching from. During a push this is the name of the ref on the local + repository we are pushing out from. + + name (or wildcard pattern) to match the source ref. + + +

Create a new RefSpec with a different source name setting. + Create a new RefSpec with a different source name setting. + new value for source in the returned instance. + a new RefSpec with source as specified. + + There is already a destination configured, and the wildcard + status of the existing destination disagrees with the + wildcard status of the new source. + +
+ + Get the destination ref description. + + Get the destination ref description. +

+ During a fetch this is the local tracking branch that will be updated + with the new ObjectId after fetching is complete. During a push this is + the remote ref that will be updated by the remote's receive-pack process. +

+ If null during a fetch no tracking branch should be updated and the + ObjectId should be stored transiently in order to prepare a merge. +

+ If null during a push, use + GetSource() + instead. + + name (or wildcard) pattern to match the destination ref. + + +

Create a new RefSpec with a different destination name setting. + Create a new RefSpec with a different destination name setting. + new value for destination in the returned instance. + a new RefSpec with destination as specified. + + There is already a source configured, and the wildcard status + of the existing source disagrees with the wildcard status of + the new destination. + +
+ + Create a new RefSpec with a different source/destination name setting. + Create a new RefSpec with a different source/destination name setting. + new value for source in the returned instance. + new value for destination in the returned instance. + a new RefSpec with destination as specified. + + The wildcard status of the new source disagrees with the + wildcard status of the new destination. + + + + Does this specification's source description match the ref name? + ref name that should be tested. + true if the names match; false otherwise. + + + Does this specification's source description match the ref? + ref whose name should be tested. + true if the names match; false otherwise. + + + Does this specification's destination description match the ref name? + ref name that should be tested. + true if the names match; false otherwise. + + + Does this specification's destination description match the ref? + ref whose name should be tested. + true if the names match; false otherwise. + + + Expand this specification to exactly match a ref name. + + Expand this specification to exactly match a ref name. +

+ Callers must first verify the passed ref name matches this specification, + otherwise expansion results may be unpredictable. + + + a ref name that matched our source specification. Could be a + wildcard also. + + + a new specification expanded from provided ref name. Result + specification is wildcard if and only if provided ref name is + wildcard. + + + +

Expand this specification to exactly match a ref. + + Expand this specification to exactly match a ref. +

+ Callers must first verify the passed ref matches this specification, + otherwise expansion results may be unpredictable. + + + a ref that matched our source specification. Could be a + wildcard also. + + + a new specification expanded from provided ref name. Result + specification is wildcard if and only if provided ref name is + wildcard. + + + +

Expand this specification to exactly match a ref name. + + Expand this specification to exactly match a ref name. +

+ Callers must first verify the passed ref name matches this specification, + otherwise expansion results may be unpredictable. + + + a ref name that matched our destination specification. Could + be a wildcard also. + + + a new specification expanded from provided ref name. Result + specification is wildcard if and only if provided ref name is + wildcard. + + + +

Expand this specification to exactly match a ref. + + Expand this specification to exactly match a ref. +

+ Callers must first verify the passed ref matches this specification, + otherwise expansion results may be unpredictable. + + a ref that matched our destination specification. + + a new specification expanded from provided ref name. Result + specification is wildcard if and only if provided ref name is + wildcard. + + + +

Specification of annotated tag behavior during fetch. + Specification of annotated tag behavior during fetch. +
+ + Automatically follow tags if we fetch the thing they point at. + + Automatically follow tags if we fetch the thing they point at. +

+ This is the default behavior and tries to balance the benefit of having + an annotated tag against the cost of possibly objects that are only on + branches we care nothing about. Annotated tags are fetched only if we can + prove that we already have (or will have when the fetch completes) the + object the annotated tag peels (dereferences) to. + + + +

Never fetch tags, even if we have the thing it points at. + + Never fetch tags, even if we have the thing it points at. +

+ This option must be requested by the user and always avoids fetching + annotated tags. It is most useful if the location you are fetching from + publishes annotated tags, but you are not interested in the tags and only + want their branches. + + + +

Always fetch tags, even if we do not have the thing it points at. + + Always fetch tags, even if we do not have the thing it points at. +

+ Unlike + AUTO_FOLLOW + the tag is always obtained. This may cause + hundreds of megabytes of objects to be fetched if the receiving + repository does not yet have the necessary dependencies. + + + +

Get the command line/configuration file text for this value. + Get the command line/configuration file text for this value. + text that appears in the configuration file to activate this. +
+ + Convert a command line/configuration file text into a value instance. + Convert a command line/configuration file text into a value instance. + the configuration file text value. + the option that matches the passed parameter. + + + Base helper class for implementing operations connections. + Base helper class for implementing operations connections. + BasePackConnection + BaseFetchConnection + + + Represent connection for operation on a remote repository. + + Represent connection for operation on a remote repository. +

+ Currently all operations on remote repository (fetch and push) provide + information about remote refs. Every connection is able to be closed and + should be closed - this is a connection client responsibility. + + Transport + + +

+ Get the complete map of refs advertised as available for fetching or + pushing. + + + Get the complete map of refs advertised as available for fetching or + pushing. + + + available/advertised refs: map of refname to ref. Never null. Not + modifiable. The collection can be empty if the remote side has no + refs (it is an empty/newly created repository). + +
+ + + Get the complete list of refs advertised as available for fetching or + pushing. + + + Get the complete list of refs advertised as available for fetching or + pushing. +

+ The returned refs may appear in any order. If the caller needs these to + be sorted, they should be copied into a new array or List and then sorted + by the caller as necessary. + + + available/advertised refs. Never null. Not modifiable. The + collection can be empty if the remote side has no refs (it is an + empty/newly created repository). + + + +

Get a single advertised ref by name. + + Get a single advertised ref by name. +

+ The name supplied should be valid ref name. To get a peeled value for a + ref (aka refs/tags/v1.0^{}) use the base name (without + the ^{} suffix) and look at the peeled object id. + + name of the ref to obtain. + the requested ref; null if the remote did not advertise this ref. + + +

Close any resources used by this connection. + + Close any resources used by this connection. +

+ If the remote repository is contacted by a network socket this method + must close that network socket, disconnecting the two peers. If the + remote repository is actually local (same system) this method must close + any open file handles used to read the "remote" repository. +

+ If additional messages were produced by the remote peer, these should + still be retained in the connection instance for + GetMessages() + . + + + +

Get the additional messages, if any, returned by the remote process. + + Get the additional messages, if any, returned by the remote process. +

+ These messages are most likely informational or error messages, sent by + the remote peer, to help the end-user correct any problems that may have + prevented the operation from completing successfully. Application UIs + should try to show these in an appropriate context. +

+ The message buffer is available after + Close() + has been called. + Prior to closing the connection, the message buffer may be empty. + + + the messages returned by the remote, most likely terminated by a + newline (LF) character. The empty string is returned if the + remote produced no additional messages. + + + +

Denote the list of refs available on the remote repository. + + Denote the list of refs available on the remote repository. +

+ Implementors should invoke this method once they have obtained the refs + that are available from the remote repository. + + + the complete list of refs the remote has to offer. This map + will be wrapped in an unmodifiable way to protect it, but it + does not get copied. + + + +

Helper method for ensuring one-operation per connection. + + Helper method for ensuring one-operation per connection. Check whether + operation was already marked as started, and mark it as started. + + if operation was already marked as started. + +
+ + Get the writer that buffers messages from the remote side. + Get the writer that buffers messages from the remote side. + writer to store messages from the remote. + + + Set the writer that buffers messages from the remote side. + Set the writer that buffers messages from the remote side. + + the writer that messages will be delivered to. The writer's + toString() + method should be overridden to return the + complete contents. + + + + Lists known refs from the remote and copies objects of selected refs. + + Lists known refs from the remote and copies objects of selected refs. +

+ A fetch connection typically connects to the git-upload-pack + service running where the remote repository is stored. This provides a + one-way object transfer service to copy objects from the remote repository + into this local repository. +

+ Instances of a FetchConnection must be created by a + Transport + that + implements a specific object transfer protocol that both sides of the + connection understand. +

+ FetchConnection instances are not thread safe and may be accessed by only one + thread at a time. + + Transport + + +

Fetch objects we don't have but that are reachable from advertised refs. + + + Fetch objects we don't have but that are reachable from advertised refs. +

+ Only one call per connection is allowed. Subsequent calls will result in + NGit.Errors.TransportException + . +

+ Implementations are free to use network connections as necessary to + efficiently (for both client and server) transfer objects from the remote + repository into this repository. When possible implementations should + avoid replacing/overwriting/duplicating an object already available in + the local destination repository. Locally available objects and packs + should always be preferred over remotely available objects and packs. + Transport.IsFetchThin() + should be honored if applicable. + + + progress monitor to inform the end-user about the amount of + work completed, or to indicate cancellation. Implementations + should poll the monitor at regular intervals to look for + cancellation requests from the user. + + + one or more refs advertised by this connection that the caller + wants to store locally. + + + additional objects known to exist in the destination + repository, especially if they aren't yet reachable by the ref + database. Connections should take this set as an addition to + what is reachable through all Refs, not in replace of it. + + + objects could not be copied due to a network failure, + protocol error, or error on remote side, or connection was + already used for fetch. + + + +

+ Did the last + Fetch(NGit.ProgressMonitor, System.Collections.Generic.ICollection<E>, System.Collections.Generic.ICollection<E>) + + get tags? +

+ Some Git aware transports are able to implicitly grab an annotated tag if + TagOpt.AUTO_FOLLOW + or + TagOpt.FETCH_TAGS + was selected and + the object the tag peels to (references) was transferred as part of the + last + Fetch(NGit.ProgressMonitor, System.Collections.Generic.ICollection<E>, System.Collections.Generic.ICollection<E>) + + call. If it is + possible for such tags to have been included in the transfer this method + returns true, allowing the caller to attempt tag discovery. +

+ By returning only true/false (and not the actual list of tags obtained) + the transport itself does not need to be aware of whether or not tags + were included in the transfer. +

+ + true if the last fetch call implicitly included tag objects; + false if tags were not implicitly obtained. + +
+ + + Did the last + Fetch(NGit.ProgressMonitor, System.Collections.Generic.ICollection<E>, System.Collections.Generic.ICollection<E>) + + validate + graph? +

+ Some transports walk the object graph on the client side, with the client + looking for what objects it is missing and requesting them individually + from the remote peer. By virtue of completing the fetch call the client + implicitly tested the object connectivity, as every object in the graph + was either already local or was requested successfully from the peer. In + such transports this method returns true. +

+ Some transports assume the remote peer knows the Git object graph and is + able to supply a fully connected graph to the client (although it may + only be transferring the parts the client does not yet have). Its faster + to assume such remote peers are well behaved and send the correct + response to the client. In such transports this method returns false. +

+ + true if the last fetch had to perform a connectivity check on the + client side in order to succeed; false if the last fetch assumed + the remote peer supplied a complete graph. + +
+ + Set the lock message used when holding a pack out of garbage collection. + + + Set the lock message used when holding a pack out of garbage collection. +

+ Callers that set a lock message must ensure they call + GetPackLocks() + after + Fetch(NGit.ProgressMonitor, System.Collections.Generic.ICollection<E>, System.Collections.Generic.ICollection<E>) + + , even if an exception + was thrown, and release the locks that are held. + + message to use when holding a pack in place. + + +

+ All locks created by the last + Fetch(NGit.ProgressMonitor, System.Collections.Generic.ICollection<E>, System.Collections.Generic.ICollection<E>) + + call. + + + collection (possibly empty) of locks created by the last call to + fetch. The caller must release these after refs are updated in + order to safely permit garbage collection. + +
+ + Base helper class for fetch connection implementations. + + Base helper class for fetch connection implementations. Provides some common + typical structures and methods used during fetch connection. +

+ Implementors of fetch over pack-based protocols should consider using + BasePackFetchConnection + instead. + + + + + + +

+ Default implementation of + FetchConnection.DidFetchIncludeTags() + + - + returning false. + +
+ + + Implementation of + Fetch(NGit.ProgressMonitor, System.Collections.Generic.ICollection<E>, System.Collections.Generic.ICollection<E>) + + without checking for multiple fetch. + + + as in + Fetch(NGit.ProgressMonitor, System.Collections.Generic.ICollection<E>, System.Collections.Generic.ICollection<E>) + + + + as in + Fetch(NGit.ProgressMonitor, System.Collections.Generic.ICollection<E>, System.Collections.Generic.ICollection<E>) + + + + as in + Fetch(NGit.ProgressMonitor, System.Collections.Generic.ICollection<E>, System.Collections.Generic.ICollection<E>) + + + + as in + Fetch(NGit.ProgressMonitor, System.Collections.Generic.ICollection<E>, System.Collections.Generic.ICollection<E>) + + , but + implementation doesn't have to care about multiple + Fetch(NGit.ProgressMonitor, System.Collections.Generic.ICollection<E>, System.Collections.Generic.ICollection<E>) + + calls, as it + is checked in this class. + + + + Read Git style pkt-line formatting from an input stream. + + Read Git style pkt-line formatting from an input stream. +

+ This class is not thread safe and may issue multiple reads to the underlying + stream for each method call made. +

+ This class performs no buffering on its own. This makes it suitable to + interleave reads performed by this class with reads performed directly + against the underlying InputStream. + + + +

+ Magic return from + ReadString() + when a flush packet is found. + +
+ + Create a new packet line reader. + Create a new packet line reader. + the input stream to consume. + + + + + + Read a single UTF-8 encoded string packet from the input stream. + + Read a single UTF-8 encoded string packet from the input stream. +

+ If the string ends with an LF, it will be removed before returning the + value to the caller. If this automatic trimming behavior is not desired, + use + ReadStringRaw() + instead. + + + the string. + END + if the string was the magic flush + packet. + + the stream cannot be read. + + +

Read a single UTF-8 encoded string packet from the input stream. + + Read a single UTF-8 encoded string packet from the input stream. +

+ Unlike + ReadString() + a trailing LF will be retained. + + + the string. + END + if the string was the magic flush + packet. + + the stream cannot be read. + + + + + +

Unmultiplexes the data portion of a side-band channel. + + Unmultiplexes the data portion of a side-band channel. +

+ Reading from this input stream obtains data from channel 1, which is + typically the bulk data stream. +

+ Channel 2 is transparently unpacked and "scraped" to update a progress + monitor. The scraping is performed behind the scenes as part of any of the + read methods offered by this stream. +

+ Channel 3 results in an exception being thrown, as the remote side has issued + an unrecoverable error. + + SideBandOutputStream + + + + + + + + + + + + + + + + + + + + +

Multiplexes data and progress messages. + + Multiplexes data and progress messages. +

+ This stream is buffered at packet sizes, so the caller doesn't need to wrap + it in yet another buffered stream. + + 2.0 + + +

Channel used for pack data. + Channel used for pack data. +
+ + Channel used for progress messages. + Channel used for progress messages. + + + Channel used for error messages. + Channel used for error messages. + + + Default buffer size for a small amount of data. + Default buffer size for a small amount of data. + + + Maximum buffer size for a single packet of sideband data. + Maximum buffer size for a single packet of sideband data. + + + + Number of bytes in + buffer + that are valid data. +

+ Initialized to + HDR_SIZE + if there is no application data in the + buffer, as the packet header always appears at the start of the buffer. +

+
+ + Create a new stream to write side band packets. + Create a new stream to write side band packets. + + channel number to prefix all packets with, so the remote side + can demultiplex the stream and get back the original data. + Must be in the range [0, 255]. + + + maximum size of a data packet within the stream. The remote + side needs to agree to the packet size to prevent buffer + overflows. Must be in the range [HDR_SIZE + 1, MAX_BUF). + + + stream that the packets are written onto. This stream should + be attached to a SideBandInputStream on the remote side. + + + + + + + + + + + + + + + + + + + Write Git style pkt-line formatting to an output stream. + + Write Git style pkt-line formatting to an output stream. +

+ This class is not thread safe and may issue multiple writes to the underlying + stream for each method call made. +

+ This class performs no buffering on its own. This makes it suitable to + interleave writes performed by this class with writes performed directly + against the underlying OutputStream. + + + +

Create a new packet line writer. + Create a new packet line writer. + stream. +
+ + + Set the flush behavior during + End() + . + + + if true, a flush-pkt written during + End() + also + flushes the underlying stream. + + + + Write a UTF-8 encoded string as a single length-delimited packet. + Write a UTF-8 encoded string as a single length-delimited packet. + string to write. + + the packet could not be written, the stream is corrupted as + the packet may have been only partially written. + + + + Write a binary packet to the stream. + Write a binary packet to the stream. + + the packet to write; the length of the packet is equal to the + size of the byte array. + + + the packet could not be written, the stream is corrupted as + the packet may have been only partially written. + + + + Write a packet end marker, sometimes referred to as a flush command. + + Write a packet end marker, sometimes referred to as a flush command. +

+ Technically this is a magical packet type which can be detected + separately from an empty string or an empty packet. +

+ Implicitly performs a flush on the underlying OutputStream to ensure the + peer will receive all data written thus far. + + + the end marker could not be written, the stream is corrupted + as the end marker may have been only partially written. + + + +

Flush the underlying OutputStream. + + Flush the underlying OutputStream. +

+ Performs a flush on the underlying OutputStream to ensure the peer will + receive all data written thus far. + + the underlying stream failed to flush. + + +

Connects two Git repositories together and copies objects between them. + + Connects two Git repositories together and copies objects between them. +

+ A transport can be used for either fetching (copying objects into the + caller's repository from the remote repository) or pushing (copying objects + into the remote repository from the caller's repository). Each transport + implementation is responsible for the details associated with establishing + the network connection(s) necessary for the copy, as well as actually + shuffling data back and forth. +

+ Transport instances and the connections they create are not thread-safe. + Callers must ensure a transport is accessed by only one thread at a time. + + + +

+ Default setting for + fetchThin + option. + +
+ + + Default setting for + pushThin + option. + + + + Register a TransportProtocol instance for use during open. + + Register a TransportProtocol instance for use during open. +

+ Protocol definitions are held by WeakReference, allowing them to be + garbage collected when the calling application drops all strongly held + references to the TransportProtocol. Therefore applications should use a + singleton pattern as described in + TransportProtocol + 's class + documentation to ensure their protocol does not get disabled by garbage + collection earlier than expected. +

+ The new protocol is registered in front of all earlier protocols, giving + it higher priority than the built-in protocol definitions. + + the protocol definition. Must not be null. + + +

Unregister a TransportProtocol instance. + + Unregister a TransportProtocol instance. +

+ Unregistering a protocol usually isn't necessary, as protocols are held + by weak references and will automatically clear when they are garbage + collected by the JVM. Matching is handled by reference equality, so the + exact reference given to + Register(TransportProtocol) + must be + used. + + the exact object previously given to register. + + +

Obtain a copy of the registered protocols. + Obtain a copy of the registered protocols. + an immutable copy of the currently registered protocols. +
+ + Open a new transport instance to connect two repositories. + + Open a new transport instance to connect two repositories. +

+ This method assumes + Operation.FETCH + . + + existing local repository. + + location of the remote repository - may be URI or remote + configuration name. + + + the new transport instance. Never null. In case of multiple URIs + in remote configuration, only the first is chosen. + + + the location is not a remote defined in the configuration + file and is not a well-formed URL. + + the protocol specified is not supported. + + the transport cannot open this URI. + + + +

Open a new transport instance to connect two repositories. + Open a new transport instance to connect two repositories. + existing local repository. + + location of the remote repository - may be URI or remote + configuration name. + + + planned use of the returned Transport; the URI may differ + based on the type of connection desired. + + + the new transport instance. Never null. In case of multiple URIs + in remote configuration, only the first is chosen. + + + the location is not a remote defined in the configuration + file and is not a well-formed URL. + + the protocol specified is not supported. + + the transport cannot open this URI. + +
+ + Open new transport instances to connect two repositories. + + Open new transport instances to connect two repositories. +

+ This method assumes + Operation.FETCH + . + + existing local repository. + + location of the remote repository - may be URI or remote + configuration name. + + + the list of new transport instances for every URI in remote + configuration. + + + the location is not a remote defined in the configuration + file and is not a well-formed URL. + + the protocol specified is not supported. + + the transport cannot open this URI. + + + +

Open new transport instances to connect two repositories. + Open new transport instances to connect two repositories. + existing local repository. + + location of the remote repository - may be URI or remote + configuration name. + + + planned use of the returned Transport; the URI may differ + based on the type of connection desired. + + + the list of new transport instances for every URI in remote + configuration. + + + the location is not a remote defined in the configuration + file and is not a well-formed URL. + + the protocol specified is not supported. + + the transport cannot open this URI. + +
+ + Open a new transport instance to connect two repositories. + + Open a new transport instance to connect two repositories. +

+ This method assumes + Operation.FETCH + . + + existing local repository. + + configuration describing how to connect to the remote + repository. + + + the new transport instance. Never null. In case of multiple URIs + in remote configuration, only the first is chosen. + + the protocol specified is not supported. + + the transport cannot open this URI. + + + if provided remote configuration doesn't have any URI + associated. + + + +

Open a new transport instance to connect two repositories. + Open a new transport instance to connect two repositories. + existing local repository. + + configuration describing how to connect to the remote + repository. + + + planned use of the returned Transport; the URI may differ + based on the type of connection desired. + + + the new transport instance. Never null. In case of multiple URIs + in remote configuration, only the first is chosen. + + the protocol specified is not supported. + + the transport cannot open this URI. + + + if provided remote configuration doesn't have any URI + associated. + +
+ + Open new transport instances to connect two repositories. + + Open new transport instances to connect two repositories. +

+ This method assumes + Operation.FETCH + . + + existing local repository. + + configuration describing how to connect to the remote + repository. + + + the list of new transport instances for every URI in remote + configuration. + + the protocol specified is not supported. + + the transport cannot open this URI. + + + +

Open new transport instances to connect two repositories. + Open new transport instances to connect two repositories. + existing local repository. + + configuration describing how to connect to the remote + repository. + + + planned use of the returned Transport; the URI may differ + based on the type of connection desired. + + + the list of new transport instances for every URI in remote + configuration. + + the protocol specified is not supported. + + the transport cannot open this URI. + +
+ + Open a new transport instance to connect two repositories. + Open a new transport instance to connect two repositories. + existing local repository. + location of the remote repository. + the new transport instance. Never null. + the protocol specified is not supported. + + the transport cannot open this URI. + + + + Open a new transport instance to connect two repositories. + Open a new transport instance to connect two repositories. + existing local repository. + location of the remote repository. + + name of the remote, if the remote as configured in + local + ; otherwise null. + + the new transport instance. Never null. + the protocol specified is not supported. + + the transport cannot open this URI. + + + + Open a new transport with no local repository. + Open a new transport with no local repository. + + new Transport instance + System.NotSupportedException + NGit.Errors.TransportException + + + + Convert push remote refs update specification from + RefSpec + form + to + RemoteRefUpdate + . Conversion expands wildcards by matching + source part to local refs. expectedOldObjectId in RemoteRefUpdate is + always set as null. Tracking branch is configured if RefSpec destination + matches source of any fetch ref spec for this transport remote + configuration. + + local database. + collection of RefSpec to convert. + + fetch specifications used for finding localtracking refs. May + be null or empty collection. + + + collection of set up + RemoteRefUpdate + . + + + when problem occurred during conversion or specification set + up: most probably, missing objects or refs. + + + + Specification for fetch or push operations, to fetch or push all tags. + + Specification for fetch or push operations, to fetch or push all tags. + Acts as --tags. + + + + Specification for push operation, to push all refs under refs/heads. + + Specification for push operation, to push all refs under refs/heads. Acts + as --all. + + + + The repository this transport fetches into, or pushes out of. + The repository this transport fetches into, or pushes out of. + + + The URI used to create this transport. + The URI used to create this transport. + + + Name of the upload pack program, if it must be executed. + Name of the upload pack program, if it must be executed. + + + Specifications to apply during fetch. + Specifications to apply during fetch. + + + + How + Fetch(NGit.ProgressMonitor, System.Collections.Generic.ICollection<E>) + should handle tags. +

+ We default to + TagOpt.NO_TAGS + so as to avoid fetching annotated + tags during one-shot fetches used for later merges. This prevents + dragging down tags from repositories that we do not have established + tracking branches for. If we do not track the source repository, we most + likely do not care about any tags it publishes. +

+
+ + Should fetch request thin-pack if remote repository can produce it. + Should fetch request thin-pack if remote repository can produce it. + + + Name of the receive pack program, if it must be executed. + Name of the receive pack program, if it must be executed. + + + Specifications to apply during push. + Specifications to apply during push. + + + Should push produce thin-pack when sending objects to remote repository. + + Should push produce thin-pack when sending objects to remote repository. + + + + Should push just check for operation result, not really push. + Should push just check for operation result, not really push. + + + Should an incoming (fetch) transfer validate objects? + + + Should refs no longer on the source be pruned from the destination? + + + Timeout in seconds to wait before aborting an IO read or write. + Timeout in seconds to wait before aborting an IO read or write. + + + Pack configuration used by this transport to make pack file. + Pack configuration used by this transport to make pack file. + + + Assists with authentication the connection. + Assists with authentication the connection. + + + Create a new transport instance. + Create a new transport instance. + + the repository this instance will fetch into, or push out of. + This must be the repository passed to + Open(NGit.Repository, URIish) + . + + + the URI used to access the remote repository. This must be the + URI passed to + Open(NGit.Repository, URIish) + . + + + + Create a minimal transport instance not tied to a single repository. + Create a minimal transport instance not tied to a single repository. + + + + Get the URI this transport connects to. + + Get the URI this transport connects to. +

+ Each transport instance connects to at most one URI at any point in time. + + the URI describing the location of the remote repository. + + +

Get the name of the remote executable providing upload-pack service. + Get the name of the remote executable providing upload-pack service. + typically "git-upload-pack". +
+ + Set the name of the remote executable providing upload-pack services. + Set the name of the remote executable providing upload-pack services. + name of the executable. + + + Get the description of how annotated tags should be treated during fetch. + + Get the description of how annotated tags should be treated during fetch. + + option indicating the behavior of annotated tags in fetch. + + + Set the description of how annotated tags should be treated on fetch. + Set the description of how annotated tags should be treated on fetch. + method to use when handling annotated tags. + + + + Default setting is: + DEFAULT_FETCH_THIN + + + true if fetch should request thin-pack when possible; false + otherwise + + PackTransport + + + Set the thin-pack preference for fetch operation. + + Set the thin-pack preference for fetch operation. Default setting is: + DEFAULT_FETCH_THIN + + + true when fetch should request thin-pack when possible; false + when it shouldn't + + PackTransport + + + + true if fetch will verify received objects are formatted + correctly. Validating objects requires more CPU time on the + client side of the connection. + + + + + true to enable checking received objects; false to assume all + received objects are valid. + + + + + Default setting is: + RemoteConfig.DEFAULT_RECEIVE_PACK + + + remote executable providing receive-pack service for pack + transports. + + PackTransport + + + Set remote executable providing receive-pack service for pack transports. + + + Set remote executable providing receive-pack service for pack transports. + Default setting is: + RemoteConfig.DEFAULT_RECEIVE_PACK + + remote executable, if null or empty default one is set; + + + + + Default setting is: + #DEFAULT_PUSH_THIN + + true if push should produce thin-pack in pack transports + PackTransport + + + Set thin-pack preference for push operation. + + Set thin-pack preference for push operation. Default setting is: + #DEFAULT_PUSH_THIN + + + true when push should produce thin-pack in pack transports; + false when it shouldn't + + PackTransport + + + + true if destination refs should be removed if they no longer + exist at the source repository. + + + + Set whether or not to remove refs which no longer exist in the source. + + Set whether or not to remove refs which no longer exist in the source. +

+ If true, refs at the destination repository (local for fetch, remote for + push) are deleted if they no longer exist on the source side (remote for + fetch, local for push). +

+ False by default, as this may cause data to become unreachable, and + eventually be deleted on the next GC. + + true to remove refs that no longer exist. + + +

Apply provided remote configuration on this transport. + Apply provided remote configuration on this transport. + configuration to apply on this transport. +
+ + + true if push operation should just check for possible result and + not really update remote refs, false otherwise - when push should + act normally. + + + + Set dry run option for push operation. + Set dry run option for push operation. + + true if push operation should just check for possible result + and not really update remote refs, false otherwise - when push + should act normally. + + + + timeout (in seconds) before aborting an IO operation. + + + Set the timeout before willing to abort an IO call. + Set the timeout before willing to abort an IO call. + + number of seconds to wait (with no data transfer occurring) + before aborting an IO read or write operation with this + remote. + + + + Get the configuration used by the pack generator to make packs. + + Get the configuration used by the pack generator to make packs. + If + SetPackConfig(NGit.Storage.Pack.PackConfig) + + was previously given null a new + PackConfig is created on demand by this method using the source + repository's settings. + + the pack configuration. Never null. + + + Set the configuration used by the pack generator. + Set the configuration used by the pack generator. + + configuration controlling packing parameters. If null the + source repository's settings will be used. + + + + A credentials provider to assist with authentication connections.. + A credentials provider to assist with authentication connections.. + the credentials provider, or null if there is none + + + + The configured credentials provider. + The configured credentials provider. + + the credentials provider, or null if no credentials provider is + associated with this transport. + + + + Fetch objects and refs from the remote repository to the local one. + + Fetch objects and refs from the remote repository to the local one. +

+ This is a utility function providing standard fetch behavior. Local + tracking refs associated with the remote repository are automatically + updated if this transport was created from a + RemoteConfig + with + fetch RefSpecs defined. + + + progress monitor to inform the user about our processing + activity. Must not be null. Use + NGit.NullProgressMonitor + if + progress updates are not interesting or necessary. + + + specification of refs to fetch locally. May be null or the + empty collection to use the specifications from the + RemoteConfig. Source for each RefSpec can't be null. + + information describing the tracking refs updated. + + this transport implementation does not support fetching + objects. + + + the remote connection could not be established or object + copying (if necessary) failed or update specification was + incorrect. + + + +

Push objects and refs from the local repository to the remote one. + + Push objects and refs from the local repository to the remote one. +

+ This is a utility function providing standard push behavior. It updates + remote refs and send there necessary objects according to remote ref + update specification. After successful remote ref update, associated + locally stored tracking branch is updated if set up accordingly. Detailed + operation result is provided after execution. +

+ For setting up remote ref update specification from ref spec, see helper + method + FindRemoteRefUpdatesFor(System.Collections.Generic.ICollection<E>) + + , predefined refspecs + ( + REFSPEC_TAGS + , + REFSPEC_PUSH_ALL + ) or consider using + directly + RemoteRefUpdate + for more possibilities. +

+ When + IsDryRun() + is true, result of this operation is just + estimation of real operation result, no real action is performed. + + RemoteRefUpdate + + progress monitor to inform the user about our processing + activity. Must not be null. Use + NGit.NullProgressMonitor + if + progress updates are not interesting or necessary. + + + specification of refs to push. May be null or the empty + collection to use the specifications from the RemoteConfig + converted by + FindRemoteRefUpdatesFor(System.Collections.Generic.ICollection<E>) + + . No + more than 1 RemoteRefUpdate with the same remoteName is + allowed. These objects are modified during this call. + + + information about results of remote refs updates, tracking refs + updates and refs advertised by remote repository. + + + this transport implementation does not support pushing + objects. + + + the remote connection could not be established or object + copying (if necessary) failed at I/O or protocol level or + update specification was incorrect. + + + +

+ Convert push remote refs update specification from + RefSpec + form + to + RemoteRefUpdate + . Conversion expands wildcards by matching + source part to local refs. expectedOldObjectId in RemoteRefUpdate is + always set as null. Tracking branch is configured if RefSpec destination + matches source of any fetch ref spec for this transport remote + configuration. +

+ Conversion is performed for context of this transport (database, fetch + specifications). +

+ collection of RefSpec to convert. + + collection of set up + RemoteRefUpdate + . + + + when problem occurred during conversion or specification set + up: most probably, missing objects or refs. + +
+ + Begins a new connection for fetching from the remote repository. + Begins a new connection for fetching from the remote repository. + a fresh connection to fetch from the remote repository. + the implementation does not support fetching. + + the remote connection could not be established. + + + + Begins a new connection for pushing into the remote repository. + Begins a new connection for pushing into the remote repository. + a fresh connection to push into the remote repository. + the implementation does not support pushing. + + the remote connection could not be established + + + + Close any resources used by this transport. + + Close any resources used by this transport. +

+ If the remote repository is contacted by a network socket this method + must close that network socket, disconnecting the two peers. If the + remote repository is actually local (same system) this method must close + any open file handles used to read the "remote" repository. + + + +

Type of operation a Transport is being opened for. + Type of operation a Transport is being opened for. +
+ + Represent request and status of a remote ref update. + + Represent request and status of a remote ref update. Specification is + provided by client, while status is handled by + PushProcess + class, + being read-only for client. +

+ Client can create instances of this class directly, basing on user + specification and advertised refs ( + Connection + or through + Transport + helper methods. Apply this specification on remote + repository using + Transport.Push(NGit.ProgressMonitor, System.Collections.Generic.ICollection<E>) + + method. + + + +

Construct remote ref update request by providing an update specification. + + + Construct remote ref update request by providing an update specification. + Object is created with default + Status.NOT_ATTEMPTED + status and no + message. + + local repository to push from. + + source revision - any string resolvable by + NGit.Repository.Resolve(string) + . This resolves to the new + object that the caller want remote ref to be after update. Use + null or + NGit.ObjectId.ZeroId() + string for delete request. + + + full name of a remote ref to update, e.g. "refs/heads/master" + (no wildcard, no short name). + + + true when caller want remote ref to be updated regardless + whether it is fast-forward update (old object is ancestor of + new object). + + + optional full name of a local stored tracking branch, to + update after push, e.g. "refs/remotes/zawir/dirty" (no + wildcard, no short name); null if no local tracking branch + should be updated. + + + optional object id that caller is expecting, requiring to be + advertised by remote side before update; update will take + place ONLY if remote side advertise exactly this expected id; + null if caller doesn't care what object id remote side + advertise. Use + NGit.ObjectId.ZeroId() + when expecting no + remote ref with this name. + + + when I/O error occurred during creating + TrackingRefUpdate + for local tracking branch or srcRef + can't be resolved to any object. + + if some required parameter was null +
+ + Construct remote ref update request by providing an update specification. + + + Construct remote ref update request by providing an update specification. + Object is created with default + Status.NOT_ATTEMPTED + status and no + message. + + local repository to push from. + source revision. Use null to delete. + + full name of a remote ref to update, e.g. "refs/heads/master" + (no wildcard, no short name). + + + true when caller want remote ref to be updated regardless + whether it is fast-forward update (old object is ancestor of + new object). + + + optional full name of a local stored tracking branch, to + update after push, e.g. "refs/remotes/zawir/dirty" (no + wildcard, no short name); null if no local tracking branch + should be updated. + + + optional object id that caller is expecting, requiring to be + advertised by remote side before update; update will take + place ONLY if remote side advertise exactly this expected id; + null if caller doesn't care what object id remote side + advertise. Use + NGit.ObjectId.ZeroId() + when expecting no + remote ref with this name. + + + when I/O error occurred during creating + TrackingRefUpdate + for local tracking branch or srcRef + can't be resolved to any object. + + if some required parameter was null + + + Construct remote ref update request by providing an update specification. + + + Construct remote ref update request by providing an update specification. + Object is created with default + Status.NOT_ATTEMPTED + status and no + message. + + local repository to push from. + + source revision to label srcId with. If null srcId.name() will + be used instead. + + + The new object that the caller wants remote ref to be after + update. Use null or + NGit.ObjectId.ZeroId() + for delete + request. + + + full name of a remote ref to update, e.g. "refs/heads/master" + (no wildcard, no short name). + + + true when caller want remote ref to be updated regardless + whether it is fast-forward update (old object is ancestor of + new object). + + + optional full name of a local stored tracking branch, to + update after push, e.g. "refs/remotes/zawir/dirty" (no + wildcard, no short name); null if no local tracking branch + should be updated. + + + optional object id that caller is expecting, requiring to be + advertised by remote side before update; update will take + place ONLY if remote side advertise exactly this expected id; + null if caller doesn't care what object id remote side + advertise. Use + NGit.ObjectId.ZeroId() + when expecting no + remote ref with this name. + + + when I/O error occurred during creating + TrackingRefUpdate + for local tracking branch or srcRef + can't be resolved to any object. + + if some required parameter was null + + + + Create a new instance of this object basing on existing instance for + configuration. + + + Create a new instance of this object basing on existing instance for + configuration. State (like + GetMessage() + , + GetStatus() + ) + of base object is not shared. Expected old object id is set up from + scratch, as this constructor may be used for 2-stage push: first one + being dry run, second one being actual push. + + configuration base. + new expected object id value. + + when I/O error occurred during creating + TrackingRefUpdate + for local tracking branch or srcRef + of base object no longer can be resolved to any object. + + + + + expectedOldObjectId required to be advertised by remote side, as + set in constructor; may be null. + + + + + true if some object is required to be advertised by remote side, + as set in constructor; false otherwise. + + + + newObjectId for remote ref, as set in constructor. + + + true if this update is deleting update; false otherwise. + + + name of remote ref to update, as set in constructor. + + + local tracking branch update if localName was set in constructor. + + + + source revision as specified by user (in constructor), could be + any string parseable by + NGit.Repository.Resolve(string) + ; can + be null if specified that way in constructor - this stands for + delete request. + + + + + true if user specified a local tracking branch for remote update; + false otherwise. + + + + + true if this update is forced regardless of old remote ref + object; false otherwise. + + + + status of remote ref update operation. + + + Check whether update was fast-forward. + + Check whether update was fast-forward. Note that this result is + meaningful only after successful update (when status is + Status.OK + ). + + true if update was fast-forward; false otherwise. + + + + message describing reasons of status when needed/possible; may be + null. + + + + Update locally stored tracking branch with the new object. + Update locally stored tracking branch with the new object. + walker used for checking update properties. + when I/O error occurred during update + + + Represent current status of a remote ref update. + Represent current status of a remote ref update. + + + Final status after a successful fetch from a remote repository. + Final status after a successful fetch from a remote repository. + Transport.Fetch(NGit.ProgressMonitor, System.Collections.Generic.ICollection<E>) + + + + Class holding result of operation on remote repository. + + Class holding result of operation on remote repository. This includes refs + advertised by remote repo and local tracking refs updates. + + + + Get the URI this result came from. + + Get the URI this result came from. +

+ Each transport instance connects to at most one URI at any point in time. + + the URI describing the location of the remote repository. + + +

Get the complete list of refs advertised by the remote. + + Get the complete list of refs advertised by the remote. +

+ The returned refs may appear in any order. If the caller needs these to + be sorted, they should be copied into a new array or List and then sorted + by the caller as necessary. + + + available/advertised refs. Never null. Not modifiable. The + collection can be empty if the remote side has no refs (it is an + empty/newly created repository). + + + +

Get a single advertised ref by name. + + Get a single advertised ref by name. +

+ The name supplied should be valid ref name. To get a peeled value for a + ref (aka refs/tags/v1.0^{}) use the base name (without + the ^{} suffix) and look at the peeled object id. + + name of the ref to obtain. + the requested ref; null if the remote did not advertise this ref. + + +

Get the status of all local tracking refs that were updated. + Get the status of all local tracking refs that were updated. + + unmodifiable collection of local updates. Never null. Empty if + there were no local tracking refs updated. + +
+ + Get the status for a specific local tracking ref update. + Get the status for a specific local tracking ref update. + name of the local ref (e.g. "refs/remotes/origin/master"). + + + status of the local ref; null if this local ref was not touched + during this operation. + + + + Get the additional messages, if any, returned by the remote process. + + Get the additional messages, if any, returned by the remote process. +

+ These messages are most likely informational or error messages, sent by + the remote peer, to help the end-user correct any problems that may have + prevented the operation from completing successfully. Application UIs + should try to show these in an appropriate context. + + + the messages returned by the remote, most likely terminated by a + newline (LF) character. The empty string is returned if the + remote produced no additional messages. + + + +

Result of push operation to the remote repository. + + Result of push operation to the remote repository. Holding information of + OperationResult + and remote refs updates status. + + Transport.Push(NGit.ProgressMonitor, System.Collections.Generic.ICollection<E>) + +
+ + Get status of remote refs updates. + + Get status of remote refs updates. Together with + OperationResult.GetAdvertisedRefs() + + it provides full description/status of each + ref update. +

+ Returned collection is not sorted in any order. + + collection of remote refs updates + + +

Get status of specific remote ref update by remote ref name. + + Get status of specific remote ref update by remote ref name. Together + with + OperationResult.GetAdvertisedRef(string) + + it provide full description/status + of this ref update. + + remote ref name + status of remote ref update +
+ + Lists known refs from the remote and sends objects to the remote. + + Lists known refs from the remote and sends objects to the remote. +

+ A push connection typically connects to the git-receive-pack + service running where the remote repository is stored. This provides a + one-way object transfer service to copy objects from the local repository + into the remote repository, as well as a way to modify the refs stored by the + remote repository. +

+ Instances of a PushConnection must be created by a + Transport + that + implements a specific object transfer protocol that both sides of the + connection understand. +

+ PushConnection instances are not thread safe and may be accessed by only one + thread at a time. + + Transport + + +

Pushes to the remote repository basing on provided specification. + + Pushes to the remote repository basing on provided specification. This + possibly result in update/creation/deletion of refs on remote repository + and sending objects that remote repository need to have a consistent + objects graph from new refs. +

+

+ Only one call per connection is allowed. Subsequent calls will result in + NGit.Errors.TransportException + . +

+ Implementation may use local repository to send a minimum set of objects + needed by remote repository in efficient way. + Transport.IsPushThin() + should be honored if applicable. + refUpdates should be filled with information about status of each update. + + + progress monitor to update the end-user about the amount of + work completed, or to indicate cancellation. Implementors + should poll the monitor at regular intervals to look for + cancellation requests from the user. + + + map of remote refnames to remote refs update + specifications/statuses. Can't be empty. This indicate what + refs caller want to update on remote side. Only refs updates + with + Status.NOT_ATTEMPTED + should passed. + Implementation must ensure that and appropriate status with + optional message should be set during call. No refUpdate with + Status.AWAITING_REPORT + or + Status.NOT_ATTEMPTED + can be leaved by implementation after return from this call. + + + objects could not be copied due to a network failure, + critical protocol error, or error on remote side, or + connection was already used for push - new connection must be + created. Non-critical errors concerning only isolated refs + should be placed in refUpdates. + + + +

Update of a locally stored tracking branch. + Update of a locally stored tracking branch. +
+ + Get the name of the remote ref. + + Get the name of the remote ref. +

+ Usually this is of the form "refs/heads/master". + + the name used within the remote repository. + + +

Get the name of the local tracking ref. + + Get the name of the local tracking ref. +

+ Usually this is of the form "refs/remotes/origin/master". + + the name used within this local repository. + + +

Get the new value the ref will be (or was) updated to. + Get the new value the ref will be (or was) updated to. + new value. Null if the caller has not configured it. +
+ + The old value of the ref, prior to the update being attempted. + + The old value of the ref, prior to the update being attempted. +

+ This value may differ before and after the update method. Initially it is + populated with the value of the ref before the lock is taken, but the old + value may change if someone else modified the ref between the time we + last read it and when the ref was locked for update. + + the value of the ref prior to the update being attempted. + + +

Get the status of this update. + Get the status of this update. + the status of the update. +
+ + + A command being processed by + BaseReceivePack + . +

+ This command instance roughly translates to the server side representation of + the + RemoteRefUpdate + created by the client. +

+
+ + Filter a list of commands according to result. + Filter a list of commands according to result. + commands to filter. + desired status to filter by. + + a copy of the command list containing only those commands with + the desired status. + + 2.0 + + + + Create a new command for + BaseReceivePack + . + + + the old object id; must not be null. Use + NGit.ObjectId.ZeroId() + to indicate a ref creation. + + + the new object id; must not be null. Use + NGit.ObjectId.ZeroId() + to indicate a ref deletion. + + name of the ref being affected. + + + + Create a new command for + BaseReceivePack + . + + + the old object id; must not be null. Use + NGit.ObjectId.ZeroId() + to indicate a ref creation. + + + the new object id; must not be null. Use + NGit.ObjectId.ZeroId() + to indicate a ref deletion. + + name of the ref being affected. + type of the command. + 2.0 + + + the old value the client thinks the ref has. + + + the requested new value for this ref. + + + the name of the ref being updated. + + + + the type of this command; see + Type + . + + + + the ref, if this was advertised by the connection. + + + the current status code of this command. + + + the message associated with a failure status. + + + Set the status of this command. + Set the status of this command. + the new status code for this command. + + + Set the status of this command. + Set the status of this command. + new status code for this command. + optional message explaining the new status. + + + Update the type of this command by checking for fast-forward. + + Update the type of this command by checking for fast-forward. +

+ If the command's current type is UPDATE, a merge test will be performed + using the supplied RevWalk to determine if + GetOldId() + is fully + merged into + GetNewId() + . If some commits are not merged the + update type is changed to + Type.UPDATE_NONFASTFORWARD + . + + + an instance to perform the merge test with. The caller must + allocate and release this object. + + + either oldId or newId is not accessible in the repository + used by the RevWalk. This usually indicates data corruption, + and the command cannot be processed. + + + +

Execute this command during a receive-pack session. + + Execute this command during a receive-pack session. +

+ Sets the status of the command as a side effect. + + receive-pack session. + 2.0 + + +

Set the result of this command. + Set the result of this command. + the new result code for this command. +
+ + Type of operation requested. + Type of operation requested. + + + Result of the update command. + Result of the update command. + + + + + + Transport we will fetch over. + Transport we will fetch over. + + + List of things we want to fetch from the remote repository. + List of things we want to fetch from the remote repository. + + + Set of refs we will actually wind up asking to obtain. + Set of refs we will actually wind up asking to obtain. + + + Objects we know we have locally. + Objects we know we have locally. + + + Updates to local tracking branches (if any). + Updates to local tracking branches (if any). + + + Records to be recorded into FETCH_HEAD. + Records to be recorded into FETCH_HEAD. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Class performing push operation on remote repository. + Class performing push operation on remote repository. + Transport.Push(NGit.ProgressMonitor, System.Collections.Generic.ICollection<E>) + + + + + Task name for + NGit.ProgressMonitor + used during opening connection. + + + + Transport used to perform this operation. + Transport used to perform this operation. + + + Push operation connection created to perform this operation + + + Refs to update on remote side. + Refs to update on remote side. + + + Revision walker for checking some updates properties. + Revision walker for checking some updates properties. + + + Create process for specified transport and refs updates specification. + Create process for specified transport and refs updates specification. + + transport between remote and local repository, used to create + connection. + + specification of refs updates (and local tracking branches). + + NGit.Errors.TransportException + + + + Perform push operation between local and remote repository - set remote + refs appropriately, send needed objects and update local tracking refs. + + + Perform push operation between local and remote repository - set remote + refs appropriately, send needed objects and update local tracking refs. +

+ When + Transport.IsDryRun() + is true, result of this operation is + just estimation of real operation result, no real action is performed. + + progress monitor used for feedback about operation. + result of push operation with complete status description. + when push operation is not supported by provided transport. + + + when some error occurred during operation, like I/O, protocol + error, or local database consistency error. + + + + + + +

Base helper class for pack-based operations implementations. + + Base helper class for pack-based operations implementations. Provides partial + implementation of pack-protocol - refs advertising and capabilities support, + and some other helper methods. + + BasePackFetchConnection + BasePackPushConnection +
+ + The repository this transport fetches into, or pushes out of. + The repository this transport fetches into, or pushes out of. + + + Remote repository location. + Remote repository location. + + + + A transport connected to + uri + . + + + + Low-level input stream, if a timeout was configured. + Low-level input stream, if a timeout was configured. + + + Low-level output stream, if a timeout was configured. + Low-level output stream, if a timeout was configured. + + + + Timer to manage + timeoutIn + and + timeoutOut + . + + + + Input stream reading from the remote. + Input stream reading from the remote. + + + Output stream sending to the remote. + Output stream sending to the remote. + + + + Packet line decoder around + @in + . + + + + + Packet line encoder around + @out + . + + + + + Send + PacketLineOut.End() + before closing + @out + ? + + + + True if this is a stateless RPC connection. + True if this is a stateless RPC connection. + + + Capability tokens advertised by the remote side. + Capability tokens advertised by the remote side. + + + Extra objects the remote has, but which aren't offered as refs. + Extra objects the remote has, but which aren't offered as refs. + + + Configure this connection with the directional pipes. + Configure this connection with the directional pipes. + + input stream to receive data from the peer. Caller must ensure + the input is buffered, otherwise read performance may suffer. + + + output stream to transmit data to the peer. Caller must ensure + the output is buffered, otherwise write performance may + suffer. + + + + Reads the advertised references through the initialized stream. + + Reads the advertised references through the initialized stream. +

+ Subclass implementations may call this method only after setting up the + input and output streams with + Init(Sharpen.InputStream, Sharpen.OutputStream) + + . +

+ If any errors occur, this connection is automatically closed by invoking + Close() + and the exception is wrapped (if necessary) and thrown + as a + NGit.Errors.TransportException + . + + the reference list could not be scanned. + + + + + + +

Create an exception to indicate problems finding a remote repository. + + Create an exception to indicate problems finding a remote repository. The + caller is expected to throw the returned exception. + Subclasses may override this method to provide better diagnostics. + + + a TransportException saying a repository cannot be found and + possibly why. + +
+ + Tell the peer we are disconnecting, if it cares to know. + Tell the peer we are disconnecting, if it cares to know. + + + Marker interface an object transport using Git pack transfers. + + Marker interface an object transport using Git pack transfers. +

+ Implementations of PackTransport setup connections and move objects back and + forth by creating pack files on the source side and indexing them on the + receiving side. + + BasePackFetchConnection + BasePackPushConnection + + +

Contains a message from the remote repository indicating a problem. + + Contains a message from the remote repository indicating a problem. +

+ Some remote repositories may send customized error messages describing why + they cannot be accessed. These messages are wrapped up in this exception and + thrown to the caller of the transport operation. + + + +

Constructs a RemoteRepositoryException for a message. + Constructs a RemoteRepositoryException for a message. + URI used for transport + + message, exactly as supplied by the remote repository. May + contain LFs (newlines) if the remote formatted it that way. + +
+ + Indicates a remote repository does not exist. + Indicates a remote repository does not exist. + + + Constructs an exception indicating a repository does not exist. + Constructs an exception indicating a repository does not exist. + URI used for transport + message + + + Indicates a protocol error has occurred while fetching/pushing objects. + Indicates a protocol error has occurred while fetching/pushing objects. + + + + Constructs an PackProtocolException with the specified detail message + prefixed with provided URI. + + + Constructs an PackProtocolException with the specified detail message + prefixed with provided URI. + + URI used for transport + message + + + + Constructs an PackProtocolException with the specified detail message + prefixed with provided URI. + + + Constructs an PackProtocolException with the specified detail message + prefixed with provided URI. + + URI used for transport + message + root cause exception + + + Constructs an PackProtocolException with the specified detail message. + Constructs an PackProtocolException with the specified detail message. + message + + + Constructs an PackProtocolException with the specified detail message. + Constructs an PackProtocolException with the specified detail message. + message + root cause exception + + + Indicates a base/common object was required, but is not found. + Indicates a base/common object was required, but is not found. + + + Constructs a MissingBundlePrerequisiteException for a set of objects. + Constructs a MissingBundlePrerequisiteException for a set of objects. + URI used for transport + + the Map of the base/common object(s) we don't have. Keys are + ids of the missing objects and values are short descriptions. + + + + Fetch implementation using the native Git pack transfer service. + + Fetch implementation using the native Git pack transfer service. +

+ This is the canonical implementation for transferring objects from the remote + repository to the local repository by talking to the 'git-upload-pack' + service. Objects are packed on the remote side into a pack file and then sent + down the pipe to us. +

+ This connection requires only a bi-directional pipe or socket, and thus is + easily wrapped up into a local process pipe, anonymous TCP socket, or a + command executed through an SSH tunnel. +

+ If + BasePackConnection.statelessRPC + is + true + , this connection + can be tunneled over a request-response style RPC system like HTTP. The RPC + call boundary is determined by this class switching from writing to the + OutputStream to reading from the InputStream. +

+ Concrete implementations should just call + BasePackConnection.Init(Sharpen.InputStream, Sharpen.OutputStream) + + and + BasePackConnection.ReadAdvertisedRefs() + + methods in constructor or before any use. They + should also handle resources releasing in + Close() + method if needed. + + + +

Maximum number of 'have' lines to send before giving up. + + Maximum number of 'have' lines to send before giving up. +

+ During + Negotiate(NGit.ProgressMonitor) + we send at most this many + commits to the remote peer as 'have' lines without an ACK response before + we give up. + + + +

Amount of data the client sends before starting to read. + + Amount of data the client sends before starting to read. +

+ Any output stream given to the client must be able to buffer this many + bytes before the client will stop writing and start reading from the + input stream. If the output stream blocks before this many bytes are in + the send queue, the system will deadlock. + + + +

Include tags if we are also including the referenced objects. + Include tags if we are also including the referenced objects. + 2.0 +
+ + Mutli-ACK support for improved negotiation. + Mutli-ACK support for improved negotiation. + 2.0 + + + Mutli-ACK detailed support for improved negotiation. + Mutli-ACK detailed support for improved negotiation. + 2.0 + + + The client supports packs with deltas but not their bases. + The client supports packs with deltas but not their bases. + 2.0 + + + The client supports using the side-band for progress messages. + The client supports using the side-band for progress messages. + 2.0 + + + The client supports using the 64K side-band for progress messages. + The client supports using the 64K side-band for progress messages. + 2.0 + + + The client supports packs with OFS deltas. + The client supports packs with OFS deltas. + 2.0 + + + The client supports shallow fetches. + The client supports shallow fetches. + 2.0 + + + The client does not want progress messages and will ignore them. + The client does not want progress messages and will ignore them. + 2.0 + + + The client supports receiving a pack before it has sent "done". + The client supports receiving a pack before it has sent "done". + 2.0 + + + All commits that are immediately reachable by a local ref. + All commits that are immediately reachable by a local ref. + + + Marks an object as having all its dependencies. + Marks an object as having all its dependencies. + + + Marks a commit known to both sides of the connection. + Marks a commit known to both sides of the connection. + + + + Like + COMMON + but means its also in + pckState + . + + + + Marks a commit listed in the advertised refs. + Marks a commit listed in the advertised refs. + + + + RPC state, if + BasePackConnection.statelessRPC + is true. + + + + Create a new connection to fetch using the native git transport. + Create a new connection to fetch using the native git transport. + the transport. + + + + + + Execute common ancestor negotiation and fetch the objects. + Execute common ancestor negotiation and fetch the objects. + progress monitor to receive status updates. + the advertised remote references the caller wants to fetch. + + additional objects to assume that already exist locally. This + will be added to the set of objects reachable from the + destination repository's references. + + if any exception occurs. + + + + + + + + + + + + + + + + + + + + + + + + + + Notification event delivered just before the pack is received from the + network. + + + Notification event delivered just before the pack is received from the + network. This event can be used by RPC such as + TransportHttp + to + disable its request magic and ensure the pack stream is read correctly. + + 2.0 + + + Push implementation using the native Git pack transfer service. + + Push implementation using the native Git pack transfer service. +

+ This is the canonical implementation for transferring objects to the remote + repository from the local repository by talking to the 'git-receive-pack' + service. Objects are packed on the local side into a pack file and then sent + to the remote repository. +

+ This connection requires only a bi-directional pipe or socket, and thus is + easily wrapped up into a local process pipe, anonymous TCP socket, or a + command executed through an SSH tunnel. +

+ This implementation honors + Transport.IsPushThin() + option. +

+ Concrete implementations should just call + BasePackConnection.Init(Sharpen.InputStream, Sharpen.OutputStream) + + and + BasePackConnection.ReadAdvertisedRefs() + + methods in constructor or before any use. They + should also handle resources releasing in + BasePackConnection.Close() + method if needed. + + + +

The client expects a status report after the server processes the pack. + The client expects a status report after the server processes the pack. + 2.0 +
+ + The server supports deleting refs. + The server supports deleting refs. + 2.0 + + + The server supports packs with OFS deltas. + The server supports packs with OFS deltas. + 2.0 + + + The client supports using the 64K side-band for progress messages. + The client supports using the 64K side-band for progress messages. + 2.0 + + + Time in milliseconds spent transferring the pack data. + Time in milliseconds spent transferring the pack data. + + + Create a new connection to push using the native git transport. + Create a new connection to push using the native git transport. + the transport. + + + + + + Push one or more objects and update the remote repository. + Push one or more objects and update the remote repository. + progress monitor to receive status updates. + update commands to be applied to the remote repository. + if any exception occurs. + + + + + + + + + + + + + + + Fetch connection for bundle based classes. + + Fetch connection for bundle based classes. It used by + instances of + TransportBundle + + + + + + + + + + + + + + + + + + + + + + + Marker interface for transports that supports fetching from a git bundle + (sneaker-net object transport). + + + Marker interface for transports that supports fetching from a git bundle + (sneaker-net object transport). +

+ Push support for a bundle is complex, as one does not have a peer to + communicate with to decide what the peer already knows. So push is not + supported by the bundle transport. + + + +

Bundle signature +
+ + Creates a Git bundle file, for sneaker-net transport to another system. + + Creates a Git bundle file, for sneaker-net transport to another system. +

+ Bundles generated by this class can be later read in from a file URI using + the bundle transport, or from an application controlled buffer by the more + generic + TransportBundleStream + . +

+ Applications creating bundles need to call one or more include + calls to reflect which objects should be available as refs in the bundle for + the other side to fetch. At least one include is required to create a valid + bundle file, and duplicate names are not permitted. +

+ Optional assume calls can be made to declare commits which the + recipient must have in order to fetch from the bundle file. Objects reachable + from these assumed commits can be used as delta bases in order to reduce the + overall bundle size. + + + +

Create a writer for a bundle. + Create a writer for a bundle. + repository where objects are stored. +
+ + Set the configuration used by the pack generator. + Set the configuration used by the pack generator. + + configuration controlling packing parameters. If null the + source repository's settings will be used. + + + + Include an object (and everything reachable from it) in the bundle. + Include an object (and everything reachable from it) in the bundle. + + name the recipient can discover this object as from the + bundle's list of advertised refs . The name must be a valid + ref format and must not have already been included in this + bundle writer. + + object to pack. Multiple refs may point to the same object. + + + Include a single ref (a name/object pair) in the bundle. + + Include a single ref (a name/object pair) in the bundle. +

+ This is a utility function for: + include(r.getName(), r.getObjectId()). + + the ref to include. + + +

Assume a commit is available on the recipient's side. + + Assume a commit is available on the recipient's side. +

+ In order to fetch from a bundle the recipient must have any assumed + commit. Each assumed commit is explicitly recorded in the bundle header + to permit the recipient to validate it has these objects. + + + the commit to assume being available. This commit should be + parsed and not disposed in order to maximize the amount of + debugging information available in the bundle stream. + + + +

Generate and write the bundle to the output stream. + + Generate and write the bundle to the output stream. +

+ This method can only be called once per BundleWriter instance. + + progress monitor to report bundle writing status to. + + the stream the bundle is written to. The stream should be + buffered by the caller. The caller is responsible for closing + the stream. + + + an error occurred reading a local object's data to include in + the bundle, or writing compressed object data to the output + stream. + + + +

The base class for transports that use HTTP as underlying protocol. + + The base class for transports that use HTTP as underlying protocol. This class + allows customizing HTTP connection settings. + +
+ + Create a new transport instance. + Create a new transport instance. + + the repository this instance will fetch into, or push out of. + This must be the repository passed to + Transport.Open(NGit.Repository, URIish) + + . + + + the URI used to access the remote repository. This must be the + URI passed to + Transport.Open(NGit.Repository, URIish) + + . + + + + Create a minimal HTTP transport instance not tied to a single repository. + + Create a minimal HTTP transport instance not tied to a single repository. + + + + + + Hook invoked by + ReceivePack + after all updates are executed. +

+ The hook is called after all commands have been processed. Only commands with + a status of + Result.OK + are passed into the hook. To get + all commands within the hook, see + BaseReceivePack.GetAllCommands() + . +

+ Any post-receive hook implementation should not update the status of a + command, as the command has already completed or failed, and the status has + already been returned to the client. +

+ Hooks should execute quickly, as they block the server and the client from + completing the connection. +

+
+ + A simple no-op hook. + A simple no-op hook. + + + Invoked after all commands are executed and status has been returned. + Invoked after all commands are executed and status has been returned. + + the process handling the current receive. Hooks may obtain + details about the destination repository through this handle. + + + unmodifiable set of successfully completed commands. May be + the empty set. + + + + + Hook invoked by + ReceivePack + before any updates are executed. +

+ The hook is called with any commands that are deemed valid after parsing them + from the client and applying the standard receive configuration options to + them: +

    +
  • receive.denyDenyDeletes
  • +
  • receive.denyNonFastForwards
  • +
+ This means the hook will not receive a non-fast-forward update command if + denyNonFastForwards is set to true in the configuration file. To get all + commands within the hook, see + BaseReceivePack.GetAllCommands() + . +

+ As the hook is invoked prior to the commands being executed, the hook may + choose to block any command by setting its result status with + ReceiveCommand.SetResult(Result) + . +

+ The hook may also choose to perform the command itself (or merely pretend + that it has performed the command), by setting the result status to + Result.OK + . +

+ Hooks should run quickly, as they block the caller thread and the client + process from completing. +

+ Hooks may send optional messages back to the client via methods on + ReceivePack + . Implementors should be aware that not all network + transports support this output, so some (or all) messages may simply be + discarded. These messages should be advisory only. +

+
+ + A simple no-op hook. + A simple no-op hook. + + + Invoked just before commands are executed. + + Invoked just before commands are executed. +

+ See the class description for how this method can impact execution. + + + the process handling the current receive. Hooks may obtain + details about the destination repository through this handle. + + + unmodifiable set of valid commands still pending execution. + May be the empty set. + + + +

Implements the server side of a push connection, receiving objects. + Implements the server side of a push connection, receiving objects. +
+ + Base implementation of the side of a push connection that receives objects. + + + Base implementation of the side of a push connection that receives objects. +

+ Contains high-level operations for initializing and closing streams, + advertising refs, reading commands, and receiving and applying a pack. + Subclasses compose these operations into full service implementations. + + + +

Database we write the stored objects into. + Database we write the stored objects into. +
+ + + Revision traversal support over + db + . + + + + + Is the client connection a bi-directional socket or pipe? +

+ If true, this class assumes it can perform multiple read and write cycles + with the client over the input and output streams. +

+ + Is the client connection a bi-directional socket or pipe? +

+ If true, this class assumes it can perform multiple read and write cycles + with the client over the input and output streams. This matches the + functionality available with a standard TCP/IP connection, or a local + operating system or in-memory pipe. +

+ If false, this class runs in a read everything then output results mode, + making it suitable for single round-trip systems RPCs such as HTTP. + + + +

Expecting data after the pack footer +
+ + Should an incoming transfer validate objects? + + + Should an incoming transfer permit create requests? + + + Should an incoming transfer permit delete requests? + + + Should an incoming transfer permit non-fast-forward requests? + + + Identity to record action as within the reflog. + Identity to record action as within the reflog. + + + Hook used while advertising the refs to the client. + Hook used while advertising the refs to the client. + + + Filter used while advertising the refs to the client. + Filter used while advertising the refs to the client. + + + Timeout in seconds to wait for client interaction. + Timeout in seconds to wait for client interaction. + + + + Timer to manage + timeout + . + + + + Raw input stream. + Raw input stream. + + + Raw output stream. + Raw output stream. + + + Optional message output stream. + Optional message output stream. + + + + Packet line input stream around + rawIn + . + + + + + Packet line output stream around + rawOut + . + + + + The refs we advertised as existing at the start of the connection. + The refs we advertised as existing at the start of the connection. + + + All SHA-1s shown to the client, which can be possible edges. + All SHA-1s shown to the client, which can be possible edges. + + + Capabilities requested by the client. + Capabilities requested by the client. + + + + If + BasePackPushConnection.CAPABILITY_SIDE_BAND_64K + + is enabled. + + + + Lock around the received pack file, while updating refs. + Lock around the received pack file, while updating refs. + + + Git object size limit + + + Create a new pack receive for an open repository. + Create a new pack receive for an open repository. + the destination repository. + + + the process name used for pack lock messages. + + + the repository this receive completes into. + + + the RevWalk instance used by this connection. + + + Get refs which were advertised to the client. + Get refs which were advertised to the client. + + all refs which were advertised to the client, or null if + SetAdvertisedRefs(System.Collections.Generic.IDictionary<K, V>, System.Collections.Generic.ICollection<E>) + + has not been called yet. + + + + Set the refs advertised by this ReceivePack. + + Set the refs advertised by this ReceivePack. +

+ Intended to be called from a + PreReceiveHook + . + + + explicit set of references to claim as advertised by this + ReceivePack instance. This overrides any references that + may exist in the source repository. The map is passed + to the configured + GetRefFilter() + . If null, assumes + all refs were advertised. + + + explicit set of additional haves to claim as advertised. If + null, assumes the default set of additional haves from the + repository. + + + +

Get objects advertised to the client. + Get objects advertised to the client. + + the set of objects advertised to the as present in this repository, + or null if + SetAdvertisedRefs(System.Collections.Generic.IDictionary<K, V>, System.Collections.Generic.ICollection<E>) + + has not been called + yet. + +
+ + + true if this instance will validate all referenced, but not + supplied by the client, objects are reachable from another + reference. + + + + Validate all referenced but not supplied objects are reachable. + + Validate all referenced but not supplied objects are reachable. +

+ If enabled, this instance will verify that references to objects not + contained within the received pack are already reachable through at least + one other reference displayed as part of + GetAdvertisedRefs() + . +

+ This feature is useful when the application doesn't trust the client to + not provide a forged SHA-1 reference to an object, in an attempt to + access parts of the DAG that they aren't allowed to see and which have + been hidden from them via the configured + AdvertiseRefsHook + or + RefFilter + . +

+ Enabling this feature may imply at least some, if not all, of the same + functionality performed by + SetCheckReceivedObjects(bool) + . + Applications are encouraged to enable both features, if desired. + + + true + to enable the additional check. + + + + + true if this class expects a bi-directional pipe opened between + the client and itself. The default is true. + + + + + if true, this class will assume the socket is a fully + bidirectional pipe between the two peers and takes advantage + of that by first transmitting the known refs, then waiting to + read commands. If false, this class assumes it must read the + commands before writing output and does not perform the + initial advertising. + + + + true if there is data expected after the pack footer. + + + true if there is additional data in InputStream after pack. + + + + true if this instance will verify received objects are formatted + correctly. Validating objects requires more CPU time on this side + of the connection. + + + + + true to enable checking received objects; false to assume all + received objects are valid. + + + + true if the client can request refs to be created. + + + true to permit create ref commands to be processed. + + + true if the client can request refs to be deleted. + + + true to permit delete ref commands to be processed. + + + + true if the client can request non-fast-forward updates of a ref, + possibly making objects unreachable. + + + + + true to permit the client to ask for non-fast-forward updates + of an existing ref. + + + + identity of the user making the changes in the reflog. + + +

Set the identity of the user appearing in the affected reflogs. + + Set the identity of the user appearing in the affected reflogs. +

+ The timestamp portion of the identity is ignored. A new identity with the + current timestamp will be created automatically when the updates occur + and the log records are written. + + + identity of the user. If null the identity will be + automatically determined based on the repository + configuration. + + + + the hook used while advertising the refs to the client + + + the filter used while advertising the refs to the client + + +

Set the hook used while advertising the refs to the client. + + Set the hook used while advertising the refs to the client. +

+ If the + AdvertiseRefsHook + chooses to call + SetAdvertisedRefs(System.Collections.Generic.IDictionary<K, V>, System.Collections.Generic.ICollection<E>) + + , only refs set by this hook + and selected by the + RefFilter + will be shown to the client. + Clients may still attempt to create or update a reference not advertised by + the configured + AdvertiseRefsHook + . These attempts should be rejected + by a matching + PreReceiveHook + . + + the hook; may be null to show all refs. + + +

Set the filter used while advertising the refs to the client. + + Set the filter used while advertising the refs to the client. +

+ Only refs allowed by this filter will be shown to the client. + The filter is run against the refs specified by the + AdvertiseRefsHook + (if applicable). + + the filter; may be null to show all refs. + + + timeout (in seconds) before aborting an IO operation. + + +

Set the timeout before willing to abort an IO call. + Set the timeout before willing to abort an IO call. + + number of seconds to wait (with no data transfer occurring) + before aborting an IO read or write operation with the + connected client. + +
+ + Set the maximum allowed Git object size. + + Set the maximum allowed Git object size. +

+ If an object is larger than the given size the pack-parsing will throw an + exception aborting the receive-pack operation. + + the Git object size limit. If zero then there is not limit. + + +

Check whether the client expects a side-band stream. + Check whether the client expects a side-band stream. + + true if the client has advertised a side-band capability, false + otherwise. + + + if the client's request has not yet been read from the wire, so + we do not know if they expect side-band. Note that the client + may have already written the request, it just has not been + read. + + +
+ + all of the command received by the current request. + + + Send an error message to the client. + + Send an error message to the client. +

+ If any error messages are sent before the references are advertised to + the client, the errors will be sent instead of the advertisement and the + receive operation will be aborted. All clients should receive and display + such early stage errors. +

+ If the reference advertisements have already been sent, messages are sent + in a side channel. If the client doesn't support receiving messages, the + message will be discarded, with no other indication to the caller or to + the client. +

+ PreReceiveHook + s should always try to use + ReceiveCommand.SetResult(Result, string) + + with a result status of + Result.REJECTED_OTHER_REASON + to indicate any reasons for + rejecting an update. Messages attached to a command are much more likely + to be returned to the client. + + + string describing the problem identified by the hook. The + string must not end with an LF, and must not contain an LF. + + + +

Send a message to the client, if it supports receiving them. + + Send a message to the client, if it supports receiving them. +

+ If the client doesn't support receiving messages, the message will be + discarded, with no other indication to the caller or to the client. + + + string describing the problem identified by the hook. The + string must not end with an LF, and must not contain an LF. + + + + an underlying stream for sending messages to the client. + + + true if any commands to be executed have been read. + + + true if an error occurred that should be advertised. + + +

Initialize the instance with the given streams. + Initialize the instance with the given streams. + + raw input to read client commands and pack data from. Caller + must ensure the input is buffered, otherwise read performance + may suffer. + + + response back to the Git network client. Caller must ensure + the output is buffered, otherwise write performance may + suffer. + + + secondary "notice" channel to send additional messages out + through. When run over SSH this should be tied back to the + standard error channel of the command execution. For most + other network connections this should be null. + +
+ + advertised refs, or the default if not explicitly advertised. + + + Receive a pack from the stream and check connectivity if necessary. + Receive a pack from the stream and check connectivity if necessary. + an error occurred during unpacking or connectivity checking. + + + + Unlock the pack written by this object. + Unlock the pack written by this object. + the pack could not be unlocked. + + + Generate an advertisement of available refs and capabilities. + Generate an advertisement of available refs and capabilities. + the advertisement formatter. + the formatter failed to write an advertisement. + + the hook denied advertisement. + + + + Receive a list of commands from the input. + Receive a list of commands from the input. + System.IO.IOException + + + Enable capabilities based on a previously read capabilities line. + Enable capabilities based on a previously read capabilities line. + + + Check if the peer requested a capability. + Check if the peer requested a capability. + protocol name identifying the capability. + true if the peer requested the capability to be enabled. + + + true if a pack is expected based on the list of commands. + + + Receive a pack from the input and store it in the repository. + Receive a pack from the input and store it in the repository. + an error occurred reading or indexing the pack. + + + + + + + Validate the command list. + Validate the command list. + + + Filter the list of commands according to result. + Filter the list of commands according to result. + desired status to filter by. + + a copy of the command list containing only those commands with the + desired status. + + + + Execute commands to update references. + Execute commands to update references. + + + Send a status report. + Send a status report. + + true if this report is for a Git client, false if it is for an + end-user. + + + an error that occurred during unpacking, or + null + + the reporter for sending the status strings. + an error occurred writing the status report. + + + + Close and flush (if necessary) the underlying streams. + Close and flush (if necessary) the underlying streams. + System.IO.IOException + + + Release any resources used by this object. + Release any resources used by this object. + the pack could not be unlocked. + + + Data in the first line of a request, the line itself plus capabilities. + Data in the first line of a request, the line itself plus capabilities. + + + Parse the first line of a receive-pack request. + Parse the first line of a receive-pack request. + line from the client. + + + non-capabilities part of the line. + + + capabilities parsed from the line. + + + Configuration for receive operations. + Configuration for receive operations. + + + + Output stream that wraps the current + BaseReceivePack.msgOut + . +

+ We don't want to expose + BaseReceivePack.msgOut + directly because it can change + several times over the course of a session. +

+
+ + Interface for reporting status messages. + Interface for reporting status messages. + + + + + + Hook to validate the update commands before execution. + Hook to validate the update commands before execution. + + + Hook to report on the commands after execution. + Hook to report on the commands after execution. + + + + If + BasePackPushConnection.CAPABILITY_REPORT_STATUS + + is enabled. + + + + Create a new pack receive for an open repository. + Create a new pack receive for an open repository. + the destination repository. + + + the hook invoked before updates occur. + + + Set the hook which is invoked prior to commands being executed. + + Set the hook which is invoked prior to commands being executed. +

+ Only valid commands (those which have no obvious errors according to the + received input and this instance's configuration) are passed into the + hook. The hook may mark a command with a result of any value other than + Result.NOT_ATTEMPTED + to block its execution. +

+ The hook may be called with an empty command collection if the current + set is completely invalid. + + the hook instance; may be null to disable the hook. + + + the hook invoked after updates occur. + + +

Set the hook which is invoked after commands are executed. + + Set the hook which is invoked after commands are executed. +

+ Only successful commands (type is + Result.OK + ) are passed into the + hook. The hook may be called with an empty command collection if the + current set all resulted in an error. + + the hook instance; may be null to disable the hook. + + + + if true this class will report command failures as warning + messages before sending the command results. This is usually + not necessary, but may help buggy Git clients that discard the + errors when all branches fail. + + + +

Execute the receive task on the socket. + Execute the receive task on the socket. + + raw input to read client commands and pack data from. Caller + must ensure the input is buffered, otherwise read performance + may suffer. + + + response back to the Git network client. Caller must ensure + the output is buffered, otherwise write performance may + suffer. + + + secondary "notice" channel to send additional messages out + through. When run over SSH this should be tied back to the + standard error channel of the command execution. For most + other network connections this should be null. + + System.IO.IOException +
+ + + + + + + + + + + + + + Filters the list of refs that are advertised to the client. + + Filters the list of refs that are advertised to the client. +

+ The filter is called by + ReceivePack + and + UploadPack + to ensure + that the refs are filtered before they are advertised to the client. +

+ This can be used by applications to control visibility of certain refs based + on a custom set of rules. + + + +

The default filter, allows all refs to be shown. + The default filter, allows all refs to be shown. +
+ + + Filters a + Map + of refs before it is advertised to the client. + + the refs which this method need to consider. + the filtered map of refs. + + + + Support for the start of + UploadPack + and + ReceivePack + . + + + + Initialize this advertiser with a repository for peeling tags. + Initialize this advertiser with a repository for peeling tags. + the repository to read from. + + + Toggle tag peeling. + + Toggle tag peeling. +

+

+ This method must be invoked prior to any of the following: +

    +
  • + Send(System.Collections.Generic.IDictionary<K, V>) +
  • +
+
+ + true to show the dereferenced value of a tag as the special + ref $tag^{} ; false to omit it from the output. + +
+ + Add one protocol capability to the initial advertisement. + + Add one protocol capability to the initial advertisement. +

+ This method must be invoked prior to any of the following: +

    +
  • + Send(System.Collections.Generic.IDictionary<K, V>) +
  • +
  • + AdvertiseHave(NGit.AnyObjectId)
  • +
+
+ + the name of a single protocol capability supported by the + caller. The set of capabilities are sent to the client in the + advertisement, allowing the client to later selectively enable + features it recognizes. + +
+ + Format an advertisement for the supplied refs. + Format an advertisement for the supplied refs. + + zero or more refs to format for the client. The collection is + sorted before display if necessary, and therefore may appear + in any order. + + set of ObjectIds that were advertised to the client. + + the underlying output stream failed to write out an + advertisement record. + + + + + Advertise one object is available using the magic + .have + . +

+ The magic + .have + advertisement is not available for fetching by a + client, but can be used by a client when considering a delta base + candidate before transferring data in a push. Within the record created + by this method the ref name is simply the invalid string + .have + . +

+ identity of the object that is assumed to exist. + + the underlying output stream failed to write out an + advertisement record. + +
+ + true if no advertisements have been sent yet. + + + + + + + + + Advertise one object under a specific name. + + Advertise one object under a specific name. +

+ If the advertised object is a tag, this method does not advertise the + peeled version of it. + + the object to advertise. + + name of the reference to advertise the object as, can be any + string not including the NUL byte. + + + the underlying output stream failed to write out an + advertisement record. + + + +

Write a single advertisement line. + Write a single advertisement line. + + the advertisement line to be written. The line always ends + with LF. Never null or the empty string. + + + the underlying output stream failed to write out an + advertisement record. + +
+ + Mark the end of the advertisements. + Mark the end of the advertisements. + + the underlying output stream failed to write out an + advertisement record. + + + + + Advertiser which frames lines in a + PacketLineOut + format. + + + + Create a new advertiser for the supplied stream. + Create a new advertiser for the supplied stream. + the output stream. + + + + + + + + + Write progress messages out to the sideband channel. + Write progress messages out to the sideband channel. + + + The base class for transports based on TCP sockets. + + The base class for transports based on TCP sockets. This class + holds settings common for all TCP based transports. + + + + Create a new transport instance. + Create a new transport instance. + + the repository this instance will fetch into, or push out of. + This must be the repository passed to + Transport.Open(NGit.Repository, URIish) + + . + + + the URI used to access the remote repository. This must be the + URI passed to + Transport.Open(NGit.Repository, URIish) + + . + + + + + + + + + + + Describes a way to connect to another Git repository. + + Describes a way to connect to another Git repository. +

+ Implementations of this class are typically immutable singletons held by + static class members, for example: +

+            package com.example.my_transport;
+            class MyTransport extends Transport {
+            public static final TransportProtocol PROTO = new TransportProtocol() {
+            public String getName() {
+            return "My Protocol";
+            }
+            };
+            }
+            
+

+ Applications may register additional protocols for use by JGit by calling + Transport.Register(TransportProtocol) + + . Because that API holds onto + the protocol object by a WeakReference, applications must ensure their own + ClassLoader retains the TransportProtocol for the life of the application. + Using a static singleton pattern as above will ensure the protocol is valid + so long as the ClassLoader that defines it remains valid. +

+ Applications may automatically register additional protocols by filling in + the names of their TransportProtocol defining classes using the services file + META-INF/services/org.eclipse.jgit.transport.Transport + . For each + class name listed in the services file, any static fields of type + TransportProtocol + will be automatically registered. For the above + example the string + com.example.my_transport.MyTransport + should be + listed in the file, as that is the name of the class that defines the static + PROTO singleton. + + + + text name of the protocol suitable for display to a user. + + + immutable set of schemes supported by this protocol. + + + immutable set of URIishFields that must be filled in. + + + immutable set of URIishFields that may be filled in. + + + if a port is supported, the default port, else -1. + + +

Determine if this protocol can handle a particular URI. + + Determine if this protocol can handle a particular URI. +

+ Implementations should try to avoid looking at the local filesystem, but + may look at implementation specific configuration options in the remote + block of + local.getConfig() + using + remoteName + if the name + is non-null. +

+ The default implementation of this method matches the scheme against + GetSchemes() + , required fields against + GetRequiredFields() + , and optional fields against + GetOptionalFields() + , returning true only if all of the fields + match the specification. + + address of the Git repository; never null. + true if this protocol can handle this URI; false otherwise. + + +

Determine if this protocol can handle a particular URI. + + Determine if this protocol can handle a particular URI. +

+ Implementations should try to avoid looking at the local filesystem, but + may look at implementation specific configuration options in the remote + block of + local.getConfig() + using + remoteName + if the name + is non-null. +

+ The default implementation of this method matches the scheme against + GetSchemes() + , required fields against + GetRequiredFields() + , and optional fields against + GetOptionalFields() + , returning true only if all of the fields + match the specification. + + address of the Git repository; never null. + + the local repository that will communicate with the other Git + repository. May be null if the caller is only asking about a + specific URI and does not have a local Repository. + + + name of the remote, if the remote as configured in + local + ; otherwise null. + + true if this protocol can handle this URI; false otherwise. + + +

Open a Transport instance to the other repository. + + Open a Transport instance to the other repository. +

+ Implementations should avoid making remote connections until an operation + on the returned Transport is invoked, however they may fail fast here if + they know a connection is impossible, such as when using the local + filesystem and the target path does not exist. +

+ Implementations may access implementation-specific configuration options + within + local.getConfig() + using the remote block named by the + remoteName + , if the name is non-null. + + address of the Git repository. + + the local repository that will communicate with the other Git + repository. + + + name of the remote, if the remote as configured in + local + ; otherwise null. + + the transport. + this protocol does not support the URI. + + the transport cannot open this URI. + + + +

Open a new transport instance to the remote repository. + + Open a new transport instance to the remote repository. Use default + configuration instead of reading from configuration files. + + + new Transport + System.NotSupportedException + NGit.Errors.TransportException +
+ + + Fields within a + URIish + that a transport uses. + + + + + + + + Single shot fetch from a streamed Git bundle. + + Single shot fetch from a streamed Git bundle. +

+ The bundle is read from an unbuffered input stream, which limits the + transport to opening at most one FetchConnection before needing to recreate + the transport instance. + + + +

Create a new transport to fetch objects from a streamed bundle. + + Create a new transport to fetch objects from a streamed bundle. +

+ The stream can be unbuffered (buffering is automatically provided + internally to smooth out short reads) and unpositionable (the stream is + read from only once, sequentially). +

+ When the FetchConnection or the this instance is closed the supplied + input stream is also automatically closed. This frees callers from + needing to keep track of the supplied stream. + + repository the fetched objects will be loaded into. + + symbolic name of the source of the stream. The URI can + reference a non-existent resource. It is used only for + exception reporting. + + the stream to read the bundle from. + + + + + + + + +

Implements the server side of a fetch connection, transmitting objects. + Implements the server side of a fetch connection, transmitting objects. +
+ + Database we read the objects from. + Database we read the objects from. + + + + Revision traversal support over + db + . + + + + Configuration to pass into the PackWriter. + Configuration to pass into the PackWriter. + + + Timeout in seconds to wait for client interaction. + Timeout in seconds to wait for client interaction. + + + + Is the client connection a bi-directional socket or pipe? +

+ If true, this class assumes it can perform multiple read and write cycles + with the client over the input and output streams. +

+ + Is the client connection a bi-directional socket or pipe? +

+ If true, this class assumes it can perform multiple read and write cycles + with the client over the input and output streams. This matches the + functionality available with a standard TCP/IP connection, or a local + operating system or in-memory pipe. +

+ If false, this class runs in a read everything then output results mode, + making it suitable for single round-trip systems RPCs such as HTTP. + + + +

+ Timer to manage + timeout + . + +
+ + The refs we advertised as existing at the start of the connection. + The refs we advertised as existing at the start of the connection. + + + Hook used while advertising the refs to the client. + Hook used while advertising the refs to the client. + + + Filter used while advertising the refs to the client. + Filter used while advertising the refs to the client. + + + Hook handling the various upload phases. + Hook handling the various upload phases. + + + Capabilities requested by the client. + Capabilities requested by the client. + + + Raw ObjectIds the client has asked for, before validating them. + Raw ObjectIds the client has asked for, before validating them. + + + Objects the client wants to obtain. + Objects the client wants to obtain. + + + Objects on both sides, these don't have to be sent. + Objects on both sides, these don't have to be sent. + + + Shallow commits the client already has. + Shallow commits the client already has. + + + Shallow commits on the client which are now becoming unshallow + + + Desired depth from the client on a shallow request. + Desired depth from the client on a shallow request. + + + Commit time of the oldest common commit, in seconds. + Commit time of the oldest common commit, in seconds. + + + + null if + commonBase + should be examined again. + + + + Objects we sent in our advertisement list, clients can ask for these. + Objects we sent in our advertisement list, clients can ask for these. + + + Marked on objects the client has asked us to give them. + Marked on objects the client has asked us to give them. + + + Marked on objects both we and the client have. + Marked on objects both we and the client have. + + + + Marked on objects in + commonBase + . + + + + Objects where we found a path from the want list to a common base. + Objects where we found a path from the want list to a common base. + + + Create a new pack upload for an open repository. + Create a new pack upload for an open repository. + the source repository. + + + the repository this upload is reading from. + + + the RevWalk instance used by this connection. + + + Get refs which were advertised to the client. + Get refs which were advertised to the client. + + all refs which were advertised to the client, or null if + SetAdvertisedRefs(System.Collections.Generic.IDictionary<K, V>) + + has not been called yet. + + + + Set the refs advertised by this UploadPack. + + Set the refs advertised by this UploadPack. +

+ Intended to be called from a + PreUploadHook + . + + + explicit set of references to claim as advertised by this + UploadPack instance. This overrides any references that + may exist in the source repository. The map is passed + to the configured + GetRefFilter() + . If null, assumes + all refs were advertised. + + + + timeout (in seconds) before aborting an IO operation. + + +

Set the timeout before willing to abort an IO call. + Set the timeout before willing to abort an IO call. + + number of seconds to wait (with no data transfer occurring) + before aborting an IO read or write operation with the + connected client. + +
+ + + true if this class expects a bi-directional pipe opened between + the client and itself. The default is true. + + + + + if true, this class will assume the socket is a fully + bidirectional pipe between the two peers and takes advantage + of that by first transmitting the known refs, then waiting to + read commands. If false, this class assumes it must read the + commands before writing output and does not perform the + initial advertising. + + + + policy used by the service to validate client requests. + + + + the policy used to enforce validation of a client's want list. + By default the policy is + RequestPolicy.ADVERTISED + , + which is the Git default requiring clients to only ask for an + object that a reference directly points to. This may be relaxed + to + RequestPolicy.REACHABLE_COMMIT + when callers + have + SetBiDirectionalPipe(bool) + set to false. + + + + the hook used while advertising the refs to the client + + + the filter used while advertising the refs to the client + + + Set the hook used while advertising the refs to the client. + + Set the hook used while advertising the refs to the client. +

+ If the + AdvertiseRefsHook + chooses to call + SetAdvertisedRefs(System.Collections.Generic.IDictionary<K, V>) + + , only refs set by this hook and + selected by the + RefFilter + will be shown to the client. + + the hook; may be null to show all refs. + + +

Set the filter used while advertising the refs to the client. + + Set the filter used while advertising the refs to the client. +

+ Only refs allowed by this filter will be sent to the client. + The filter is run against the refs specified by the + AdvertiseRefsHook + (if applicable). + + the filter; may be null to show all refs. + + + the configured upload hook. + + +

Set the hook that controls how this instance will behave. + Set the hook that controls how this instance will behave. + the hook; if null no special actions are taken. +
+ + Set the configuration used by the pack generator. + Set the configuration used by the pack generator. + + configuration controlling packing parameters. If null the + source repository's settings will be used. + + + + the configured logger. + + + Set the logger. + Set the logger. + the logger instance. If null, no logging occurs. + + + Check whether the client expects a side-band stream. + Check whether the client expects a side-band stream. + + true if the client has advertised a side-band capability, false + otherwise. + + + if the client's request has not yet been read from the wire, so + we do not know if they expect side-band. Note that the client + may have already written the request, it just has not been + read. + + + + + Execute the upload task on the socket. + Execute the upload task on the socket. + + raw input to read client commands from. Caller must ensure the + input is buffered, otherwise read performance may suffer. + + + response back to the Git network client, to write the pack + data onto. Caller must ensure the output is buffered, + otherwise write performance may suffer. + + + secondary "notice" channel to send additional messages out + through. When run over SSH this should be tied back to the + standard error channel of the command execution. For most + other network connections this should be null. + + System.IO.IOException + + + Get the PackWriter's statistics if a pack was sent to the client. + Get the PackWriter's statistics if a pack was sent to the client. + + statistics about pack output, if a pack was sent. Null if no pack + was sent, such as during the negotation phase of a smart HTTP + connection, or if the client was already up-to-date. + + + + + + + + + + Generate an advertisement of available refs and capabilities. + Generate an advertisement of available refs and capabilities. + the advertisement formatter. + the formatter failed to write an advertisement. + + the hook denied advertisement. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Policy the server uses to validate client requests + + + Data in the first line of a request, the line itself plus options. + Data in the first line of a request, the line itself plus options. + + + Parse the first line of a receive-pack request. + Parse the first line of a receive-pack request. + line from the client. + + + non-capabilities part of the line. + + + options parsed from the line. + + + Generic fetch support for dumb transport protocols. + + Generic fetch support for dumb transport protocols. +

+ Since there are no Git-specific smarts on the remote side of the connection + the client side must determine which objects it needs to copy in order to + completely fetch the requested refs and their history. The generic walk + support in this class parses each individual object (once it has been copied + to the local repository) and examines the list of objects that must also be + copied to create a complete history. Objects which are already available + locally are retained (and not copied), saving bandwidth for incremental + fetches. Pack files are copied from the remote repository only as a last + resort, as the entire pack must be copied locally in order to access any + single object. +

+ This fetch connection does not actually perform the object data transfer. + Instead it delegates the transfer to a + WalkRemoteObjectDatabase + , + which knows how to read individual files from the remote repository and + supply the data as a standard Java InputStream. + + WalkRemoteObjectDatabase + + +

The repository this transport fetches into, or pushes out of. + The repository this transport fetches into, or pushes out of. +
+ + If not null the validator for received objects. + If not null the validator for received objects. + + + List of all remote repositories we may need to get objects out of. + + List of all remote repositories we may need to get objects out of. +

+ The first repository in the list is the one we were asked to fetch from; + the remaining repositories point to the alternate locations we can fetch + objects through. + + + +

+ Most recently used item in + remotes + . + +
+ + Objects whose direct dependents we know we have (or will have). + Objects whose direct dependents we know we have (or will have). + + + + Objects that have already entered + workQueue + . + + + + + Commits that have already entered + localCommitQueue + . + + + + Commits already reachable from all local refs. + Commits already reachable from all local refs. + + + Objects we need to copy from the remote repository. + Objects we need to copy from the remote repository. + + + Databases we have not yet obtained the list of packs from. + Databases we have not yet obtained the list of packs from. + + + Databases we have not yet obtained the alternates from. + Databases we have not yet obtained the alternates from. + + + Packs we have discovered, but have not yet fetched locally. + Packs we have discovered, but have not yet fetched locally. + + + + Packs whose indexes we have looked at in + unfetchedPacks + . +

+ We try to avoid getting duplicate copies of the same pack through + multiple alternates by only looking at packs whose names are not yet in + this collection. +

+
+ + Errors received while trying to obtain an object. + + Errors received while trying to obtain an object. +

+ If the fetch winds up failing because we cannot locate a specific object + then we need to report all errors related to that object back to the + caller as there may be cascading failures. + + + +

+ Inserter to write objects onto + local + . + +
+ + + Inserter to read objects from + local + . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Transfers object data through a dumb transport. + + Transfers object data through a dumb transport. +

+ Implementations are responsible for resolving path names relative to the + objects/ subdirectory of a single remote Git repository or + naked object database and make the content available as a Java input stream + for reading during fetch. The actual object traversal logic to determine the + names of files to retrieve is handled through the generic, protocol + independent + WalkFetchConnection + . + + + +

Obtain the list of available packs (if any). + + Obtain the list of available packs (if any). +

+ Pack names should be the file name in the packs directory, that is + pack-035760ab452d6eebd123add421f253ce7682355a.pack. Index + names should not be included in the returned collection. + + list of pack names; null or empty list if none are available. + + The connection is unable to read the remote repository's list + of available pack files. + + + +

Obtain alternate connections to alternate object databases (if any). + + Obtain alternate connections to alternate object databases (if any). +

+ Alternates are typically read from the file + INFO_ALTERNATES + or + INFO_HTTP_ALTERNATES + . The content of each line must be resolved + by the implementation and a new database reference should be returned to + represent the additional location. +

+ Alternates may reuse the same network connection handle, however the + fetch connection will + Close() + each created alternate. + + + list of additional object databases the caller could fetch from; + null or empty list if none are configured. + + + The connection is unable to read the remote repository's list + of configured alternates. + + + +

Open a single file for reading. + + Open a single file for reading. +

+ Implementors should make every attempt possible to ensure + System.IO.FileNotFoundException + is used when the remote object does not + exist. However when fetching over HTTP some misconfigured servers may + generate a 200 OK status message (rather than a 404 Not Found) with an + HTML formatted message explaining the requested resource does not exist. + Callers such as + WalkFetchConnection + are prepared to handle this + by validating the content received, and assuming content that fails to + match its hash is an incorrectly phrased FileNotFoundException. + + + location of the file to read, relative to this objects + directory (e.g. + cb/95df6ab7ae9e57571511ef451cf33767c26dd2 or + pack/pack-035760ab452d6eebd123add421f253ce7682355a.pack). + + a stream to read from the file. Never null. + the requested file does not exist at the given location. + + + The connection is unable to read the remote's file, and the + failure occurred prior to being able to determine if the file + exists, or after it was determined to exist but before the + stream could be created. + + + +

+ Create a new connection for a discovered alternate object database +

+ This method is typically called by + ReadAlternates(string) + when + subclasses us the generic alternate parsing logic for their + implementation of + GetAlternates() + . +

+ + the location of the new alternate, relative to the current + object database. + + + a new database connection that can read from the specified + alternate. + + + The database connection cannot be established with the + alternate, such as if the alternate location does not + actually exist and the connection's constructor attempts to + verify that. + +
+ + Close any resources used by this connection. + + Close any resources used by this connection. +

+ If the remote repository is contacted by a network socket this method + must close that network socket, disconnecting the two peers. If the + remote repository is actually local (same system) this method must close + any open file handles used to read the "remote" repository. + + + +

Delete a file from the object database. + + Delete a file from the object database. +

+ Path may start with ../ to request deletion of a file that + resides in the repository itself. +

+ When possible empty directories must be removed, up to but not including + the current object database directory itself. +

+ This method does not support deletion of directories. + + + name of the item to be removed, relative to the current object + database. + + deletion is not supported, or deletion failed. + + + +

Open a remote file for writing. + + Open a remote file for writing. +

+ Path may start with ../ to request writing of a file that + resides in the repository itself. +

+ The requested path may or may not exist. If the path already exists as a + file the file should be truncated and completely replaced. +

+ This method creates any missing parent directories, if necessary. + + + name of the file to write, relative to the current object + database. + + + stream to write into this file. Caller must close the stream to + complete the write request. The stream is not buffered and each + write may cause a network request/response so callers should + buffer to smooth out small writes. + + + (optional) progress monitor to post write completion to during + the stream's close method. + + (optional) task name to display during the close method. + + + writing is not supported, or attempting to write the file + failed, possibly due to permissions or remote disk full, etc. + + + +

Atomically write a remote file. + + Atomically write a remote file. +

+ This method attempts to perform as atomic of an update as it can, + reducing (or eliminating) the time that clients might be able to see + partial file content. This method is not suitable for very large + transfers as the complete content must be passed as an argument. +

+ Path may start with ../ to request writing of a file that + resides in the repository itself. +

+ The requested path may or may not exist. If the path already exists as a + file the file should be truncated and completely replaced. +

+ This method creates any missing parent directories, if necessary. + + + name of the file to write, relative to the current object + database. + + complete new content of the file. + + writing is not supported, or attempting to write the file + failed, possibly due to permissions or remote disk full, etc. + + + +

Delete a loose ref from the remote repository. + Delete a loose ref from the remote repository. + + name of the ref within the ref space, for example + refs/heads/pu. + + deletion is not supported, or deletion failed. + +
+ + Delete a reflog from the remote repository. + Delete a reflog from the remote repository. + + name of the ref within the ref space, for example + refs/heads/pu. + + deletion is not supported, or deletion failed. + + + + Overwrite (or create) a loose ref in the remote repository. + + Overwrite (or create) a loose ref in the remote repository. +

+ This method creates any missing parent directories, if necessary. + + + name of the ref within the ref space, for example + refs/heads/pu. + + new value to store in this ref. Must not be null. + + writing is not supported, or attempting to write the file + failed, possibly due to permissions or remote disk full, etc. + + + +

+ Rebuild the + INFO_PACKS + for dumb transport clients. +

+ This method rebuilds the contents of the + INFO_PACKS + file to + match the passed list of pack names. +

+ + names of available pack files, in the order they should appear + in the file. Valid pack name strings are of the form + pack-035760ab452d6eebd123add421f253ce7682355a.pack. + + + writing is not supported, or attempting to write the file + failed, possibly due to permissions or remote disk full, etc. + +
+ + Open a buffered reader around a file. + + Open a buffered reader around a file. +

+ This is shorthand for calling + Open(string) + and then wrapping it + in a reader suitable for line oriented files like the alternates list. + + a stream to read from the file. Never null. + + location of the file to read, relative to this objects + directory (e.g. info/packs). + + the requested file does not exist at the given location. + + + The connection is unable to read the remote's file, and the + failure occurred prior to being able to determine if the file + exists, or after it was determined to exist but before the + stream could be created. + + + +

Read a standard Git alternates file to discover other object databases. + + Read a standard Git alternates file to discover other object databases. +

+ This method is suitable for reading the standard formats of the + alternates file, such as found in objects/info/alternates + or objects/info/http-alternates within a Git repository. +

+ Alternates appear one per line, with paths expressed relative to this + object database. + + + location of the alternate file to read, relative to this + object database (e.g. info/alternates). + + + the list of discovered alternates. Empty list if the file exists, + but no entries were discovered. + + the requested file does not exist at the given location. + + + The connection is unable to read the remote's file, and the + failure occurred prior to being able to determine if the file + exists, or after it was determined to exist but before the + stream could be created. + + + +

Read a standard Git packed-refs file to discover known references. + Read a standard Git packed-refs file to discover known references. + + return collection of references. Any existing entries will be + replaced if they are found in the packed-refs file. + + an error occurred reading from the packed refs file. + +
+ + + + + Create a new stream of unknown length. + Create a new stream of unknown length. + + stream containing the file data. This stream will be + closed by the caller when reading is complete. + + + + Create a new stream of known length. + Create a new stream of known length. + + stream containing the file data. This stream will be + closed by the caller when reading is complete. + + + total number of bytes available for reading through + i. + + + + + + + Marker interface for an object transport walking transport. + + Marker interface for an object transport walking transport. +

+ Implementations of WalkTransport transfer individual objects one at a time + from the loose objects directory, or entire packs if the source side does not + have the object as a loose object. +

+ WalkTransports are not as efficient as + PackTransport + instances, but + can be useful in situations where a pack transport is not acceptable. + + WalkFetchConnection + + +

Generic push support for dumb transport protocols. + + Generic push support for dumb transport protocols. +

+ Since there are no Git-specific smarts on the remote side of the connection + the client side must handle everything on its own. The generic push support + requires being able to delete, create and overwrite files on the remote side, + as well as create any missing directories (if necessary). Typically this can + be handled through an FTP style protocol. +

+ Objects not on the remote side are uploaded as pack files, using one pack + file per invocation. This simplifies the implementation as only two data + files need to be written to the remote repository. +

+ Push support supplied by this class is not multiuser safe. Concurrent pushes + to the same repository may yield an inconsistent reference database which may + confuse fetch clients. +

+ A single push is concurrently safe with multiple fetch requests, due to the + careful order of operations used to update the repository. Clients fetching + may receive transient failures due to short reads on certain files if the + protocol does not support atomic file replacement. + + WalkRemoteObjectDatabase + + +

The repository this transport pushes out of. + The repository this transport pushes out of. +
+ + Location of the remote repository we are writing to. + Location of the remote repository we are writing to. + + + Database connection to the remote repository. + Database connection to the remote repository. + + + The configured transport we were constructed by. + The configured transport we were constructed by. + + + Packs already known to reside in the remote repository. + + Packs already known to reside in the remote repository. +

+ This is a LinkedHashMap to maintain the original order. + + + +

Complete listing of refs the remote will have after our push. + Complete listing of refs the remote will have after our push. +
+ + Updates which require altering the packed-refs file to complete. + + Updates which require altering the packed-refs file to complete. +

+ If this collection is non-empty then any refs listed in + newRefs + with a storage class of + NGit.RefStorage.PACKED + will be written. + + + + + + + + + + + + + + + +

Basic daemon for the anonymous git:// transport protocol. + Basic daemon for the anonymous git:// transport protocol. +
+ + 9418: IANA assigned port number for Git. + 9418: IANA assigned port number for Git. + + + Configure a daemon to listen on any available network port. + Configure a daemon to listen on any available network port. + + + Configure a new daemon for the specified network address. + Configure a new daemon for the specified network address. + + address to listen for connections on. If null, any available + port will be chosen on all network interfaces. + + + + the address connections are received on. + + + Lookup a supported service so it can be reconfigured. + Lookup a supported service so it can be reconfigured. + + name of the service; e.g. "receive-pack"/"git-receive-pack" or + "upload-pack"/"git-upload-pack". + + + the service; null if this daemon implementation doesn't support + the requested service type. + + + + timeout (in seconds) before aborting an IO operation. + + + Set the timeout before willing to abort an IO call. + Set the timeout before willing to abort an IO call. + + number of seconds to wait (with no data transfer occurring) + before aborting an IO read or write operation with the + connected client. + + + + configuration controlling packing, may be null. + + + Set the configuration used by the pack generator. + Set the configuration used by the pack generator. + + configuration controlling packing parameters. If null the + source repository's settings will be used. + + + + Set the resolver used to locate a repository by name. + Set the resolver used to locate a repository by name. + the resolver instance. + + + Set the factory to construct and configure per-request UploadPack. + Set the factory to construct and configure per-request UploadPack. + the factory. If null upload-pack is disabled. + + + Set the factory to construct and configure per-request ReceivePack. + Set the factory to construct and configure per-request ReceivePack. + the factory. If null receive-pack is disabled. + + + Start this daemon on a background thread. + Start this daemon on a background thread. + the server socket could not be opened. + the daemon is already running. + + + + true if this daemon is receiving connections. + + + Stop this daemon. + Stop this daemon. + + + + + + + Create and configure + NGit.Transport.UploadPack + service instance. + + + + A factory disabling the UploadPack service for all repositories. + A factory disabling the UploadPack service for all repositories. + + + Create and configure a new UploadPack instance for a repository. + Create and configure a new UploadPack instance for a repository. + + current request, in case information from the request may help + configure the UploadPack instance. + + the repository the upload would read from. + the newly configured UploadPack instance, must not be null. + + this factory refuses to create the instance because it is not + allowed on the target repository, by any user. + + + this factory refuses to create the instance for this HTTP + request and repository, such as due to a permission error. + + + + + + + + + + + + + + Create and configure + NGit.Transport.ReceivePack + service instance. + + + + A factory disabling the ReceivePack service for all repositories + + + Create and configure a new ReceivePack instance for a repository. + Create and configure a new ReceivePack instance for a repository. + + current request, in case information from the request may help + configure the ReceivePack instance. + + the repository the receive would write into. + the newly configured ReceivePack instance, must not be null. + + this factory refuses to create the instance because it is not + allowed on the target repository, by any user. + + + this factory refuses to create the instance for this HTTP + request and repository, such as due to a permission error. + + + + + + + + + + + + + + A service exposed by + Daemon + over anonymous git://. + + + + is this service enabled for invocation? + + + true to allow this service to be used; false to deny it. + + + can this service be configured in the repository config file? + + + + true to permit repositories to override this service's enabled + state with the daemon.servicename config setting. + + + + name of the command requested by clients. + + + Determine if this service can handle the requested command. + Determine if this service can handle the requested command. + input line from the client. + true if this command can accept the given command line. + + + + + + + + + + + + + + + + + + + + + + + + Active network client of + Daemon + . + + + + the daemon which spawned this client. + + + Internet address of the remote client. + + + input stream to read from the connected client. + + + output stream to send data to the connected client. + + + + + + + + Simple configuration parser for the OpenSSH ~/.ssh/config file. + + Simple configuration parser for the OpenSSH ~/.ssh/config file. +

+ Since JSch does not (currently) have the ability to parse an OpenSSH + configuration file this is a simple parser to read that file and make the + critical options available to + SshSessionFactory + . + + + +

IANA assigned port number for SSH. + IANA assigned port number for SSH. +
+ + Obtain the user's configuration data. + + Obtain the user's configuration data. +

+ The configuration file is always returned to the caller, even if no file + exists in the user's home directory at the time the call was made. Lookup + requests are cached and are automatically updated if the user modifies + the configuration file since the last time it was cached. + + + the file system abstraction which will be necessary to + perform certain file system operations. + + a caching reader of the user's configuration file. + + +

The user's home directory, as key files may be relative to here. + The user's home directory, as key files may be relative to here. +
+ + The .ssh/config file we read and monitor for updates. + The .ssh/config file we read and monitor for updates. + + + + Modification time of + configFile + when + hosts + loaded. + + + + Cached entries read out of the configuration file. + Cached entries read out of the configuration file. + + + Locate the configuration for a specific host request. + Locate the configuration for a specific host request. + + the name the user has supplied to the SSH tool. This may be a + real host name, or it may just be a "Host" block in the + configuration file. + + r configuration for the requested name. Never null. + + + + + + Configuration of one "Host" block in the configuration file. + + Configuration of one "Host" block in the configuration file. +

+ If returned from + OpenSshConfig.Lookup(string) + some or all of the + properties may not be populated. The properties which are not populated + should be defaulted by the caller. +

+ When returned from + OpenSshConfig.Lookup(string) + any wildcard + entries which appear later in the configuration file will have been + already merged into this block. + + + + + the value StrictHostKeyChecking property, the valid values + are "yes" (unknown hosts are not accepted), "no" (unknown + hosts are always accepted), and "ask" (user should be asked + before accepting the host) + + + + the real IP address or host name to connect to; never null. + + + the real port number to connect to; never 0. + + + + path of the private key file to use for authentication; null + if the caller should use default authentication strategies. + + + + the real user name to connect as; never null. + + + + the preferred authentication methods, separated by commas if + more than one authentication method is preferred. + + + + + true if batch (non-interactive) mode is preferred for this + host connection. + + + +

Transport through a git-daemon waiting for anonymous TCP connections. + + Transport through a git-daemon waiting for anonymous TCP connections. +

+ This transport supports the git:// protocol, usually run on + the IANA registered port 9418. It is a popular means for distributing open + source projects, as there are no authentication or authorization overheads. + + + + + + + + + + + + + + + + + + + + + + + + +

Transport over HTTP and FTP protocols. + + Transport over HTTP and FTP protocols. +

+ If the transport is using HTTP and the remote HTTP service is Git-aware + (speaks the "smart-http protocol") this client will automatically take + advantage of the additional Git-specific HTTP extensions. If the remote + service does not support these extensions, the client will degrade to direct + file fetching. +

+ If the remote (server side) repository does not have the specialized Git + support, object files are retrieved directly through standard HTTP GET (or + binary FTP GET) requests. This make it easy to serve a Git repository through + a standard web host provider that does not offer specific support for Git. + + WalkFetchConnection + + + + + +

Create a minimal HTTP transport with default configuration values. + Create a minimal HTTP transport with default configuration values. + + System.NotSupportedException +
+ + Toggle whether or not smart HTTP transport should be used. + + Toggle whether or not smart HTTP transport should be used. +

+ This flag exists primarily to support backwards compatibility testing + within a testing framework, there is no need to modify it in most + applications. + + + if + true + (default), smart HTTP is enabled. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Basic service for sending and receiving HTTP requests. + Basic service for sending and receiving HTTP requests. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + State required to speak multiple HTTP requests with the remote. + + State required to speak multiple HTTP requests with the remote. +

+ A service wrapper provides a normal looking InputStream and OutputStream + pair which are connected via HTTP to the named remote service. Writing to + the OutputStream is buffered until either the buffer overflows, or + reading from the InputStream occurs. If overflow occurs HTTP/1.1 and its + chunked transfer encoding is used to stream the request data to the + remote service. If the entire request fits in the memory buffer, the + older HTTP/1.0 standard and a fixed content length is used instead. +

+ It is an error to attempt to read without there being outstanding data + ready for transmission on the OutputStream. +

+ No state is preserved between write-read request pairs. The caller is + responsible for replaying state vector information as part of the request + data written to the OutputStream. Any session HTTP cookies may or may not + be preserved between requests, it is left up to the JVM's implementation + of the HTTP client. + + + +

Keep opening send-receive pairs to the given URI. + Keep opening send-receive pairs to the given URI. + +
+ + Service for maintaining a single long-poll connection. + Service for maintaining a single long-poll connection. + + + + + + Only open one send-receive request. + Only open one send-receive request. + + + + Extra utilities to support usage of HTTP. + Extra utilities to support usage of HTTP. + + + + The + GET + HTTP method. + + + + + The + POST + HTTP method. + + + + + The + Cache-Control + header. + + + + + The + Pragma + header. + + + + + The + User-Agent + header. + + + + + The + Date + header. + + + + + The + Expires + header. + + + + + The + ETag + header. + + + + + The + If-None-Match + header. + + + + + The + Last-Modified + header. + + + + + The + If-Modified-Since + header. + + + + + The + Accept + header. + + + + + The + Content-Type + header. + + + + + The + Content-Length + header. + + + + + The + Content-Encoding + header. + + + + + The + Content-Range + header. + + + + + The + Accept-Ranges + header. + + + + + The + If-Range + header. + + + + + The + Range + header. + + + + + The + Accept-Encoding + header. + + + + + The + gzip + encoding value for + HDR_ACCEPT_ENCODING + . + + + + + The standard + text/plain + MIME type. + + + + + The + Authorization + header. + + + + + The + WWW-Authenticate + header. + + + + URL encode a value string into an output buffer. + URL encode a value string into an output buffer. + the output buffer. + value which must be encoded to protected special characters. + + + Get the HTTP response code from the request. + + Get the HTTP response code from the request. +

+ Roughly the same as c.getResponseCode() but the + ConnectException is translated to be more understandable. + + connection the code should be obtained from. + + r HTTP status code, usually 200 to indicate success. See + Sharpen.HttpURLConnection + for other defined constants. + + communications error prevented obtaining the response code. + + + +

Determine the proxy server (if any) needed to obtain a URL. + Determine the proxy server (if any) needed to obtain a URL. + proxy support for the caller. + location of the server caller wants to talk to. + proxy to communicate with the supplied URL. + + the proxy could not be computed as the supplied URL could not + be read. This failure should never occur. + +
+ + Transport to access a local directory as though it were a remote peer. + + Transport to access a local directory as though it were a remote peer. +

+ This transport is suitable for use on the local system, where the caller has + direct read or write access to the "remote" repository. +

+ By default this transport works by spawning a helper thread within the same + JVM, and processes the data transfer using a shared memory buffer between the + calling thread and the helper thread. This is a pure-Java implementation + which does not require forking an external process. +

+ However, during + OpenFetch() + , if the Transport has configured + Transport.GetOptionUploadPack() + to be anything other than + "git-upload-pack" or "git upload-pack", this + implementation will fork and execute the external process, using an operating + system pipe to transfer data. +

+ Similarly, during + OpenPush() + , if the Transport has configured + Transport.GetOptionReceivePack() + to be anything other than + "git-receive-pack" or "git receive-pack", this + implementation will fork and execute the external process, using an operating + system pipe to transfer data. + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Loads known hosts and private keys from $HOME/.ssh. + + Loads known hosts and private keys from $HOME/.ssh. +

+ This is the default implementation used by JGit and provides most of the + compatibility necessary to match OpenSSH, a popular implementation of SSH + used by C Git. +

+ If user interactivity is required by SSH (e.g. to obtain a password), the + connection will immediately fail. + + + +

+ The base session factory that loads known hosts and private keys from + $HOME/.ssh. + + + The base session factory that loads known hosts and private keys from + $HOME/.ssh. +

+ This is the default implementation used by JGit and provides most of the + compatibility necessary to match OpenSSH, a popular implementation of SSH + used by C Git. +

+ The factory does not provide UI behavior. Override the method + Configure(Host, NSch.Session) + to supply appropriate + NSch.UserInfo + to the session. + + + +

Creates and destroys SSH connections to a remote system. + + Creates and destroys SSH connections to a remote system. +

+ Different implementations of the session factory may be used to control + communicating with the end-user as well as reading their personal SSH + configuration settings, such as known hosts and private keys. +

+ A + RemoteSession + must be returned to the factory that created it. + Callers are encouraged to retain the SshSessionFactory for the duration of + the period they are using the Session. + + + +

Get the currently configured JVM-wide factory. + + Get the currently configured JVM-wide factory. +

+ A factory is always available. By default the factory will read from the + user's $HOME/.ssh and assume OpenSSH compatibility. + + factory the current factory for this JVM. + + +

Change the JVM-wide factory to a different implementation. + Change the JVM-wide factory to a different implementation. + + factory for future sessions to be created through. If null the + default factory will be restored.s + +
+ + Open (or reuse) a session to a host. + + Open (or reuse) a session to a host. +

+ A reasonable UserInfo that can interact with the end-user (if necessary) + is installed on the returned session by this method. +

+ The caller must connect the session by invoking connect() + if it has not already been connected. + + URI information about the remote host + provider to support authentication, may be null. + + + the file system abstraction which will be necessary to + perform certain file system operations. + + Timeout value, in milliseconds. + a session that can contact the remote host. + the session could not be created. + + + +

Close (or recycle) a session to a host. + Close (or recycle) a session to a host. + + a session previously obtained from this factory's + GetSession(URIish, CredentialsProvider, NGit.Util.FS, int) + + method. + +
+ + + + + + + + Create a new remote session for the requested address. + Create a new remote session for the requested address. + host configuration + login to authenticate as. + server name to connect to. + port number of the SSH daemon (typically 22). + + the file system abstraction which will be necessary to + perform certain file system operations. + + new session instance, but otherwise unconfigured. + the session could not be created. + + + + Provide additional configuration for the session based on the host + information. + + + Provide additional configuration for the session based on the host + information. This method could be used to supply + NSch.UserInfo + . + + host configuration + session to configure + + + Obtain the JSch used to create new sessions. + Obtain the JSch used to create new sessions. + host configuration + + the file system abstraction which will be necessary to + perform certain file system operations. + + the JSch instance to use. + the user configuration could not be created. + + + + + the file system abstraction which will be necessary to + perform certain file system operations. + + the new default JSch implementation. + known host keys cannot be loaded. + + + + + + The base class for transports that use SSH protocol. + + The base class for transports that use SSH protocol. This class allows + customizing SSH connection settings. + + + + The open SSH session + + + Create a new transport instance. + Create a new transport instance. + + the repository this instance will fetch into, or push out of. + This must be the repository passed to + Transport.Open(NGit.Repository, URIish) + + . + + + the URI used to access the remote repository. This must be the + URI passed to + Transport.Open(NGit.Repository, URIish) + + . + + + + + Set SSH session factory instead of the default one for this instance of + the transport. + + + Set SSH session factory instead of the default one for this instance of + the transport. + + a factory to set, must not be null + if session has been already created. + + + + the SSH session factory that will be used for creating SSH sessions + + + Get the default SSH session + a remote session + in case of error with opening SSH session + + + + Transport through an SSH tunnel. + + Transport through an SSH tunnel. +

+ The SSH transport requires the remote side to have Git installed, as the + transport logs into the remote system and executes a Git helper program on + the remote side to read (or write) the remote repository's files. +

+ This transport does not support direct SCP style of copying files, as it + assumes there are Git specific smarts on the remote side to perform object + enumeration, save file modification and hook execution. + + + + + + + + + + + + + + + + + + +

Create a remote "session" for executing remote commands. + + Create a remote "session" for executing remote commands. +

+ Clients should subclass RemoteSession to create an alternate way for JGit to + execute remote commands. (The client application may already have this + functionality available.) Note that this class is just a factory for creating + remote processes. If the application already has a persistent connection to + the remote machine, RemoteSession may do nothing more than return a new + RemoteProcess when exec is called. + + + +

Generate a new remote process to execute the given command. + + Generate a new remote process to execute the given command. This function + should also start execution and may need to create the streams prior to + execution. + + command to execute + timeout value, in seconds, for command execution + a new remote process + + may be thrown in several cases. For example, on problems + opening input or output streams or on problems connecting or + communicating with the remote host. For the latter two cases, + a TransportException may be thrown (a subclass of + IOException). + +
+ + Disconnect the remote session + + + + + + + + + + + + Transport over the non-Git aware SFTP (SSH based FTP) protocol. + + Transport over the non-Git aware SFTP (SSH based FTP) protocol. +

+ The SFTP transport does not require any specialized Git support on the remote + (server side) repository. Object files are retrieved directly through secure + shell's FTP protocol, making it possible to copy objects from a remote + repository that is available over SSH, but whose remote host does not have + Git installed. +

+ Unlike the HTTP variant (see + TransportHttp + ) we rely upon being able + to list files in directories, as the SFTP protocol supports this function. By + listing files through SFTP we can avoid needing to have current + objects/info/packs or info/refs files on the + remote repository and access the data directly, much as Git itself would. +

+ Concurrent pushing over this transport is not supported. Multiple concurrent + push operations may cause confusion in the repository state. + + WalkFetchConnection + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ Supplies the content of a file for + DiffFormatter + . +

+ A content source is not thread-safe. Sources may contain state, including + information about the last ObjectLoader they returned. Callers must be + careful to ensure there is no more than one ObjectLoader pending on any + source, at any time. +

+
+ + Construct a content source for an ObjectReader. + Construct a content source for an ObjectReader. + the reader to obtain blobs from. + a source wrapping the reader. + + + Construct a content source for a working directory. + + Construct a content source for a working directory. + If the iterator is a + NGit.Treewalk.FileTreeIterator + an optimized version is + used that doesn't require seeking through a TreeWalk. + + the iterator to obtain source files through. + a content source wrapping the iterator. + + + Determine the size of the object. + Determine the size of the object. + the path of the file, relative to the root of the repository. + blob id of the file, if known. + the size in bytes. + the file cannot be accessed. + + + Open the object. + Open the object. + the path of the file, relative to the root of the repository. + blob id of the file, if known. + + a loader that can supply the content of the file. The loader must + be used before another loader can be obtained from this same + source. + + the file cannot be accessed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A pair of sources to access the old and new sides of a DiffEntry. + A pair of sources to access the old and new sides of a DiffEntry. + + + Construct a pair of sources. + Construct a pair of sources. + source to read the old side of a DiffEntry. + source to read the new side of a DiffEntry. + + + Determine the size of the object. + Determine the size of the object. + which side of the entry to read (OLD or NEW). + the entry to examine. + the size in bytes. + the file cannot be accessed. + + + Open the object. + Open the object. + which side of the entry to read (OLD or NEW). + the entry to examine. + + a loader that can supply the content of the file. The loader + must be used before another loader can be obtained from this + same source. + + the file cannot be accessed. + + + + Wraps a + Sequence + to assign hash codes to elements. +

+ This sequence acts as a proxy for the real sequence, caching element hash + codes so they don't need to be recomputed each time. Sequences of this type + must be used with a + HashedSequenceComparator<S> + . +

+ To construct an instance of this type use + HashedSequencePair<S> + . +

+
+ + + Wrap another comparator for use with + HashedSequence<S> + . +

+ This comparator acts as a proxy for the real comparator, evaluating the + cached hash code before testing the underlying comparator's equality. + Comparators of this type must be used with a + HashedSequence<S> + . +

+ To construct an instance of this type use + HashedSequencePair<S> + . +

+
+ + + Equivalence function for a + Sequence + compared by difference algorithm. +

+ Difference algorithms can use a comparator to compare portions of two + sequences and discover the minimal edits required to transform from one + sequence to the other sequence. +

+ Indexes within a sequence are zero-based. +

+
+ + Compare two items to determine if they are equivalent. + + Compare two items to determine if they are equivalent. + It is permissible to compare sequence + a + with itself (by passing + a + again in position + b + ). + + the first sequence. + + item of + ai + to compare. + + the second sequence. + + item of + bi + to compare. + + + true if the two items are identical according to this function's + equivalence rule. + + + + Get a hash value for an item in a sequence. + + Get a hash value for an item in a sequence. + If two items are equal according to this comparator's + SequenceComparator<S>.Equals(Sequence, int, Sequence, int) + + method, then this hash + method must produce the same integer result for both items. + It is not required for two items to have different hash values if they + are are unequal according to the + equals() + method. + + the sequence. + the item to obtain the hash for. + hash the hash value. + + + Modify the edit to remove common leading and trailing items. + + Modify the edit to remove common leading and trailing items. + The supplied edit + e + is reduced in size by moving the beginning A + and B points so the edit does not cover any items that are in common + between the two sequences. The ending A and B points are also shifted to + remove common items from the end of the region. + + the first sequence. + the second sequence. + the edit to start with and update. + + + e + if it was updated in-place, otherwise a new edit + containing the reduced region. + + + + + Wraps two + Sequence + instances to cache their element hash codes. +

+ This pair wraps two sequences that contain cached hash codes for the input + sequences. +

+
+ + Construct a pair to provide fast hash codes. + Construct a pair to provide fast hash codes. + the base comparator for the sequence elements. + the A sequence. + the B sequence. + + + obtain a comparator that uses the cached hash codes. + + + wrapper around A that includes cached hash codes. + + + wrapper around B that includes cached hash codes. + + + An extended form of Bram Cohen's patience diff algorithm. + + An extended form of Bram Cohen's patience diff algorithm. +

+ This implementation was derived by using the 4 rules that are outlined in + Bram Cohen's blog, + and then was further extended to support low-occurrence common elements. +

+ The basic idea of the algorithm is to create a histogram of occurrences for + each element of sequence A. Each element of sequence B is then considered in + turn. If the element also exists in sequence A, and has a lower occurrence + count, the positions are considered as a candidate for the longest common + subsequence (LCS). After scanning of B is complete the LCS that has the + lowest number of occurrences is chosen as a split point. The region is split + around the LCS, and the algorithm is recursively applied to the sections + before and after the LCS. +

+ By always selecting a LCS position with the lowest occurrence count, this + algorithm behaves exactly like Bram Cohen's patience diff whenever there is a + unique common element available between the two sequences. When no unique + elements exist, the lowest occurrence element is chosen instead. This offers + more readable diffs than simply falling back on the standard Myers' O(ND) + algorithm would produce. +

+ To prevent the algorithm from having an O(N^2) running time, an upper limit + on the number of unique elements in a histogram bucket is configured by + SetMaxChainLength(int) + . If sequence A has more than this many + elements that hash into the same hash bucket, the algorithm passes the region + to + SetFallbackAlgorithm(DiffAlgorithm) + + . If no fallback algorithm is + configured, the region is emitted as a replace edit. +

+ During scanning of sequence B, any element of A that occurs more than + SetMaxChainLength(int) + times is never considered for an LCS match + position, even if it is common between the two sequences. This limits the + number of locations in sequence A that must be considered to find the LCS, + and helps maintain a lower running time bound. +

+ So long as + SetMaxChainLength(int) + is a small constant (such as 64), + the algorithm runs in O(N * D) time, where N is the sum of the input lengths + and D is the number of edits in the resulting EditList. If the supplied + SequenceComparator<S> + has a good hash function, this implementation + typically out-performs + MyersDiff<S> + , even though its theoretical running + time is the same. +

+ This implementation has an internal limitation that prevents it from handling + sequences with more than 268,435,456 (2^28) elements. + + + +

Algorithm to use when there are too many element occurrences. + Algorithm to use when there are too many element occurrences. +
+ + Maximum number of positions to consider for a given element hash. + + Maximum number of positions to consider for a given element hash. + All elements with the same hash are stored into a single chain. The chain + size is capped to ensure search is linear time at O(len_A + len_B) rather + than quadratic at O(len_A * len_B). + + + + Set the algorithm used when there are too many element occurrences. + Set the algorithm used when there are too many element occurrences. + + the secondary algorithm. If null the region will be denoted as + a single REPLACE block. + + + + Maximum number of positions to consider for a given element hash. + + Maximum number of positions to consider for a given element hash. + All elements with the same hash are stored into a single chain. The chain + size is capped to ensure search is linear time at O(len_A + len_B) rather + than quadratic at O(len_A * len_B). + + new maximum length. + + + Result edits we have determined that must be made to convert a to b. + Result edits we have determined that must be made to convert a to b. + + + + Support + HistogramDiff + by computing occurrence counts of elements. +

+ Each element in the range being considered is put into a hash table, tracking + the number of times that distinct element appears in the sequence. Once all + elements have been inserted from sequence A, each element of sequence B is + probed in the hash table and the longest common subsequence with the lowest + occurrence count in A is used as the result. +

+
+ + + Keyed by + HistogramDiffIndex<S>.Hash(HashedSequence<S>, int) + + for + HistogramDiffIndex<S>.recs + index. + + + + + Number of low bits to discard from a key to index + HistogramDiffIndex<S>.table + . + + + + Describes a unique element in sequence A. + + Describes a unique element in sequence A. + The records in this table are actually 3-tuples of: +
    +
  • index of next record in this table that has same hash code
  • +
  • index of first element in this occurrence chain
  • +
  • occurrence count for this element (length of locs list)
  • +
+ The occurrence count is capped at + HistogramDiffIndex<S>.MAX_CNT + , as the field is only + a few bits wide. Elements that occur more frequently will have their + count capped. +
+
+ + + Number of elements in + HistogramDiffIndex<S>.recs + ; also is the unique element count. + + + + + For + ptr + , + next[ptr - ptrShift] + has subsequent index. + For the sequence element + ptr + , the value stored at location + next[ptr - ptrShift] + is the next occurrence of the exact same + element in the sequence. + Chains always run from the lowest index to the largest index. Therefore + the array will store + next[1] = 2 + , but never + next[2] = 1 + . + This allows a chain to terminate with + 0 + , as + 0 + would never + be a valid next element. + The array is sized to be + region.getLengthA() + and element indexes + are converted to array indexes by subtracting + HistogramDiffIndex<S>.ptrShift + , which is + just a cached version of + region.beginA + . + + + + + For element + ptr + in A, index of the record in + HistogramDiffIndex<S>.recs + array. + The record at + recs[recIdx[ptr - ptrShift]] + is the record + describing all occurrences of the element appearing in sequence A at + position + ptr + . The record is needed to get the occurrence count of + the element, or to locate all other occurrences of that element within + sequence A. This index provides constant-time access to the record, and + avoids needing to scan the hash chain. + + + + + Value to subtract from element indexes to key + HistogramDiffIndex<S>.next + array. + + + + + Equivalence function for + RawText + . + + + + No special treatment. + No special treatment. + + + Ignores all whitespace. + Ignores all whitespace. + + + Ignores leading whitespace. + Ignores leading whitespace. + + + Ignores trailing whitespace. + Ignores trailing whitespace. + + + Ignores whitespace occurring between non-whitespace characters. + Ignores whitespace occurring between non-whitespace characters. + + + Compute a hash code for a region. + Compute a hash code for a region. + the raw file content. + first byte of the region to hash. + 1 past the last byte of the region. + hash code for the region [ptr, end) of raw. + + + + Wraps a + Sequence + to have a narrower range of elements. +

+ This sequence acts as a proxy for the real sequence, translating element + indexes on the fly by adding + begin + to them. Sequences of this type + must be used with a + SubsequenceComparator<S> + . +

+
+ + Construct a subsequence around the A region/base sequence. + Construct a subsequence around the A region/base sequence. + the A sequence. + + the region of + a + to create a subsequence around. + + + subsequence of + base + as described by A in + region + . + + + + Construct a subsequence around the B region/base sequence. + Construct a subsequence around the B region/base sequence. + the B sequence. + + the region of + b + to create a subsequence around. + + + subsequence of + base + as described by B in + region + . + + + + Adjust the Edit to reflect positions in the base sequence. + Adjust the Edit to reflect positions in the base sequence. + + edit to adjust in-place. Prior to invocation the indexes are + in terms of the two subsequences; after invocation the indexes + are in terms of the base sequences. + + the A sequence. + the B sequence. + + + Adjust the Edits to reflect positions in the base sequence. + Adjust the Edits to reflect positions in the base sequence. + + edits to adjust in-place. Prior to invocation the indexes are + in terms of the two subsequences; after invocation the indexes + are in terms of the base sequences. + + the A sequence. + the B sequence. + + always + edits + (as the list was updated in-place). + + + + Construct a subset of another sequence. + + Construct a subset of another sequence. + The size of the subsequence will be + end - begin + . + + the real sequence. + + First element index of + base + that will be part of this + new subsequence. The element at + begin + will be this + sequence's element 0. + + + One past the last element index of + base + that will be + part of this new subsequence. + + + + + Wrap another comparator for use with + Subsequence<S> + . +

+ This comparator acts as a proxy for the real comparator, translating element + indexes on the fly by adding the subsequence's begin offset to them. + Comparators of this type must be used with a + Subsequence<S> + . +

+
+ + Construct a comparator wrapping another comparator. + Construct a comparator wrapping another comparator. + the real comparator. + + + + A class used to execute a + Fetch + command. It has setters for all + supported options and arguments of this command and a + Call() + method + to finally execute the command. + + Git documentation about Fetch + + + + Base class for commands that use a + NGit.Transport.Transport + during execution. +

+ This class provides standard configuration of a transport for options such as + a + NGit.Transport.CredentialsProvider + + , a timeout, and a + TransportConfigCallback + . +

+
+ + Configured credentials provider + + + Configured transport timeout + + + Configured callback for transport configuration + + + + + + + the + NGit.Transport.CredentialsProvider + + to use + + + + this + + + + the timeout used for the transport step + + + this + + + + + if set, the callback will be invoked after the + NGit.Transport.Transport + has created, but before the + NGit.Transport.Transport + is used. The callback can use this + opportunity to set additional type-specific configuration on + the + NGit.Transport.Transport + instance. + + + + this + + + + + + this + + + + + + Configure transport with credentials provider, timeout, and config + callback + + + + + this + + + + + Configure a child command with the current configuration set in + this + command + + + + + this + + + + + + + + Executes the + fetch + command with all the options and parameters + collected by the setter methods of this class. Each instance of this + class should only be used for one invocation of the command (means: one + call to + Call() + ) + + + a + NGit.Transport.FetchResult + object representing the successful fetch + result + + when called with an invalid remote uri + + when an error occurs during transport + + + + + The remote (uri or name) used for the fetch operation. + + The remote (uri or name) used for the fetch operation. If no remote is + set, the default value of Constants.DEFAULT_REMOTE_NAME will + be used. + + NGit.Constants.DEFAULT_REMOTE_NAME + + + + + this + + + + the remote used for the remote operation + + + the timeout used for the fetch operation + + + whether to check received objects checked for validity + + + If set to true, objects received will be checked for validity + + + + this + + + + whether or not to remove refs which no longer exist in the source + + + If set to true, refs are removed which no longer exist in the source + + + + this + + + + the progress monitor for the fetch operation + + + The progress monitor associated with the fetch operation. + + The progress monitor associated with the fetch operation. By default, + this is set to NullProgressMonitor + + NGit.NullProgressMonitor + + + + this + + + + the ref specs + + + The ref specs to be used in the fetch operation + + + + this + + + + The ref specs to be used in the fetch operation + + + + this + + + + the dry run preference for the fetch operation + + + Sets whether the fetch operation should be a dry run + + + + this + + + + the thin-pack preference for fetch operation + + + Sets the thin-pack preference for fetch operation. + + Sets the thin-pack preference for fetch operation. + Default setting is Transport.DEFAULT_FETCH_THIN + + + + + this + + + + Sets the specification of annotated tag behavior during fetch + + + + this + + + + Indicates a ReceivePack failure while scanning the pack stream. + Indicates a ReceivePack failure while scanning the pack stream. + + + Creates an exception with a root cause. + Creates an exception with a root cause. + the root cause of the unpacking failure. + + + Exception thrown when a fetch command was called with an invalid remote + + + message describing the invalid remote. + + + message describing the invalid remote. + why the remote is invalid. + + + + A class used to execute a + Push + command. It has setters for all + supported options and arguments of this command and a + Call() + method + to finally execute the command. + + Git documentation about Push + + + + + + + Executes the + push + command with all the options and parameters + collected by the setter methods of this class. Each instance of this + class should only be used for one invocation of the command (means: one + call to + Call() + ) + + + an iteration over + NGit.Transport.PushResult + objects + + when called with an invalid remote uri + + when an error occurs with the transport + + NGit.Api.Errors.GitAPIException + + + + The remote (uri or name) used for the push operation. + + The remote (uri or name) used for the push operation. If no remote is + set, the default value of Constants.DEFAULT_REMOTE_NAME will + be used. + + NGit.Constants.DEFAULT_REMOTE_NAME + + + + + this + + + + the remote used for the remote operation + + + The remote executable providing receive-pack service for pack transports. + + + The remote executable providing receive-pack service for pack transports. + If no receive-pack is set, the default value of + RemoteConfig.DEFAULT_RECEIVE_PACK will be used. + + NGit.Transport.RemoteConfig.DEFAULT_RECEIVE_PACK + + + + + this + + + + the receive-pack used for the remote operation + + + the timeout used for the push operation + + + the progress monitor for the push operation + + + The progress monitor associated with the push operation. + + The progress monitor associated with the push operation. By default, this + is set to NullProgressMonitor + + NGit.NullProgressMonitor + + + + this + + + + the ref specs + + + The ref specs to be used in the push operation + + + + this + + + + The ref specs to be used in the push operation + + + + this + + + + Push all branches under refs/heads/*. + Push all branches under refs/heads/*. + {code this} + + + Push all tags under refs/tags/*. + Push all tags under refs/tags/*. + {code this} + + + Add a reference to push. + Add a reference to push. + the source reference. The remote name will match. + + + this + . + + + + Add a reference to push. + Add a reference to push. + any reference name, or a reference specification. + + + this + . + + the reference name cannot be resolved. + + + + the dry run preference for the push operation + + + Sets whether the push operation should be a dry run + + + + this + + + + the thin-pack preference for push operation + + + Sets the thin-pack preference for push operation. + + Sets the thin-pack preference for push operation. + Default setting is Transport.DEFAULT_PUSH_THIN + + + + + this + + + + the force preference for push operation + + + Sets the force preference for push operation. + Sets the force preference for push operation. + + + + this + + + + The Pull command + Git documentation about Pull + + + + + + a progress monitor + this instance + + + + Executes the + Pull + command with all the options and parameters + collected by the setter methods (e.g. + SetProgressMonitor(NGit.ProgressMonitor) + + ) of this class. Each + instance of this class should only be used for one invocation of the + command. Don't call this method twice on an instance. + + the result of the pull + NGit.Api.Errors.WrongRepositoryStateException + + NGit.Api.Errors.InvalidConfigurationException + + NGit.Api.Errors.DetachedHeadException + + NGit.Api.Errors.InvalidRemoteException + + NGit.Api.Errors.CanceledException + + NGit.Api.Errors.RefNotFoundException + + NGit.Api.Errors.NoHeadException + + NGit.Api.Errors.TransportException + + NGit.Api.Errors.GitAPIException + + + + + Encapsulates the result of a + PullCommand + + + + the fetch result, or null + + + the merge result, or null + + + the rebase result, or null + + + + the name of the remote configuration from which fetch was tried, + or null + + + + whether the pull was successful + + + Used to create a local branch. + Used to create a local branch. + Git documentation about Branch + + + + + + + when trying to create (without force) a branch with a name + that already exists + + if the start point can not be found + + + if the provided name is null or otherwise + invalid + + the newly created branch + + + + + + + + + + + + the name of the new branch + this instance + + + + if true and the branch with the given name + already exists, the start-point of an existing branch will be + set to a new start-point; if false, the existing branch will + not be changed + + this instance + + + + corresponds to the start-point option; if null, + the current HEAD will be used + + this instance + + + + corresponds to the start-point option; if null, + the current HEAD will be used + + this instance + + + + corresponds to the --track/--no-track/--set-upstream options; + may be null + + this instance + + + + The modes available for setting up the upstream configuration + (corresponding to the --set-upstream, --track, --no-track options + + + + Used to delete one or several branches. + + Used to delete one or several branches. + The result of + Call() + is a list with the (full) names of the deleted + branches. + Note that we don't have a setter corresponding to the -r option; remote + tracking branches are simply deleted just like local branches. + + Git documentation about Branch + + + + + + + when trying to delete a branch which has not been merged into + the currently checked out branch without force + + NGit.Api.Errors.CannotDeleteCurrentBranchException + + the list with the (full) names of the deleted branches + + + + + the names of the branches to delete; if not set, this will do + nothing; invalid branch names will simply be ignored + + this instance + + + + true corresponds to the -D option, + false to the -d option (default)
+ if false a check will be performed whether the + branch to be deleted is already merged into the current branch + and deletion will be refused in this case + + this instance +
+ + Used to obtain a list of branches. + Used to obtain a list of branches. + Git documentation about Branch + + + + + + + + + + optional: corresponds to the -r/-a options; by default, only + local branches will be listed + + this instance + + + + The modes available for listing branches (corresponding to the -r and -a + options) + + + + Used to rename branches. + Used to rename branches. + Git documentation about Branch + + + + + + + if the old branch can not be found (branch with provided old + name does not exist or old name resolves to a tag) + + + if the provided new name is null or otherwise + invalid + + if a branch with the new name already exists + + + if rename is tried without specifying the old name and HEAD + is detached + + + + + the new name + this instance + + + + the name of the branch to rename; if not set, the currently + checked out branch (if any) will be renamed + + this instance + + + Support class to populate user authentication data on a connection. + + Support class to populate user authentication data on a connection. +

+ Instances of an HttpAuthMethod are not thread-safe, as some implementations + may need to maintain per-connection state information. + + + +

No authentication is configured. + No authentication is configured. +
+ + Handle an authentication failure and possibly return a new response. + Handle an authentication failure and possibly return a new response. + the connection that failed. + new authentication method to try. + + + Update this method with the credentials from the URIish. + Update this method with the credentials from the URIish. + the URI used to create the connection. + + the credentials provider, or null. If provided, + credentials in the URI + are ignored. + + + true if the authentication method is able to provide + authorization for the given URI + + + + Update this method with the given username and password pair. + Update this method with the given username and password pair. + + + + + Update connection properties based on this authentication method. + Update connection properties based on this authentication method. + + System.IO.IOException + + + Performs no user authentication. + Performs no user authentication. + + + + + + Performs HTTP basic authentication (plaintext username/password). + Performs HTTP basic authentication (plaintext username/password). + + + + + + Performs HTTP digest authentication. + Performs HTTP digest authentication. + + + + + + + Exception thrown when a command expected a non-detached + HEAD + reference + + + + The default constructor with a default message + + + + + + + + + + Exception thrown when an operation was canceled + + + + + + Thrown when trying to delete a branch which is currently checked out + + + the message + + + Exception thrown when a command fails due to an invalid configuration + + + + + + + + + + Exception thrown when an invalid Ref name was encountered + + + + + + + + + + Thrown when branch deletion fails due to unmerged data + + + The default constructor with a default message + + + + Thrown when trying to create a + NGit.Ref + with the same name as an existing + one + + + + + + + Thrown when a Ref can not be resolved + + + + + + + A class used to execute a + cherry-pick + command. It has setters for all + supported options and arguments of this command and a + Call() + method + to finally execute the command. Each instance of this class should only be + used for one invocation of the command (means: one call to + Call() + ) + + Git documentation about cherry-pick + + + + + + + Executes the + Cherry-Pick + command with all the options and + parameters collected by the setter methods (e.g. + Include(NGit.Ref) + of + this class. Each instance of this class should only be used for one + invocation of the command. Don't call this method twice on an instance. + + the result of the cherry-pick + NGit.Api.Errors.GitAPIException + + NGit.Api.Errors.WrongRepositoryStateException + + NGit.Api.Errors.ConcurrentRefUpdateException + + NGit.Api.Errors.UnmergedPathsException + + NGit.Api.Errors.NoMessageException + + NGit.Api.Errors.NoHeadException + + + + + a reference to a commit which is cherry-picked to the current + head + + + + this + + + + the Id of a commit which is cherry-picked to the current head + + + + this + + + + a name given to the commit + the Id of a commit which is cherry-picked to the current head + + + + this + + + + + the name that should be used in the "OURS" place for conflict + markers + + + + this + + + + The commit to be cherry-pick'ed did not have exactly one parent + + + + + + + + + + Mutable formatter to construct a single tree object. + + Mutable formatter to construct a single tree object. + This formatter does not process subtrees. Callers must handle creating each + subtree on their own. + To maintain good performance for bulk operations, this formatter does not + validate its input. Callers are responsible for ensuring the resulting tree + object is correctly well formed by writing entries in the correct order. + + + + Compute the size of a tree entry record. + + Compute the size of a tree entry record. + This method can be used to estimate the correct size of a tree prior to + allocating a formatter. Getting the size correct at allocation time + ensures the internal buffer is sized correctly, reducing copying. + + the mode the entry will have. + the length of the name, in bytes. + the length of the record. + + + Create an empty formatter with a default buffer size. + Create an empty formatter with a default buffer size. + + + Create an empty formatter with the specified buffer size. + Create an empty formatter with the specified buffer size. + + estimated size of the tree, in bytes. Callers can use + EntrySize(FileMode, int) + to estimate the size of each + entry in advance of allocating the formatter. + + + + + Add a link to a submodule commit, mode is + FileMode.GITLINK + . + + name of the entry. + the ObjectId to store in this entry. + + + + Add a subtree, mode is + FileMode.TREE + . + + name of the entry. + the ObjectId to store in this entry. + + + + Add a regular file, mode is + FileMode.REGULAR_FILE + . + + name of the entry. + the ObjectId to store in this entry. + + + Append any entry to the tree. + Append any entry to the tree. + name of the entry. + + mode describing the treatment of + id + . + + the ObjectId to store in this entry. + + + Append any entry to the tree. + Append any entry to the tree. + + name of the entry. The name should be UTF-8 encoded, but file + name encoding is not a well defined concept in Git. + + + mode describing the treatment of + id + . + + the ObjectId to store in this entry. + + + Append any entry to the tree. + Append any entry to the tree. + + buffer holding the name of the entry. The name should be UTF-8 + encoded, but file name encoding is not a well defined concept + in Git. + + + first position within + nameBuf + of the name data. + + + number of bytes from + nameBuf + to use as the name. + + + mode describing the treatment of + id + . + + the ObjectId to store in this entry. + + + Append any entry to the tree. + Append any entry to the tree. + + buffer holding the name of the entry. The name should be UTF-8 + encoded, but file name encoding is not a well defined concept + in Git. + + + first position within + nameBuf + of the name data. + + + number of bytes from + nameBuf + to use as the name. + + + mode describing the treatment of + id + . + + buffer holding the raw ObjectId of the entry. + + first position within + idBuf + to copy the id from. + + + + + + + Insert this tree and obtain its ObjectId. + Insert this tree and obtain its ObjectId. + the inserter to store the tree. + computed ObjectId of the tree + the tree could not be stored. + + + Compute the ObjectId for this tree + + ObjectId for this tree + + + Copy this formatter's buffer into a byte array. + + Copy this formatter's buffer into a byte array. + This method is not efficient, as it needs to create a copy of the + internal buffer in order to supply an array of the correct size to the + caller. If the buffer is just to pass to an ObjectInserter, consider + using + ObjectInserter.Insert(TreeFormatter) + + instead. + + a copy of this formatter's buffer. + + + Formatter for constructing the commit message for a merge commit. + + Formatter for constructing the commit message for a merge commit. +

+ The format should be the same as C Git does it, for compatibility. + + + +

Construct the merge commit message. + Construct the merge commit message. + the refs which will be merged + the branch ref which will be merged into + merge commit message +
+ + Add section with conflicting paths to merge message. + Add section with conflicting paths to merge message. + the original merge message + the paths with conflicts + merge message with conflicting paths added + + + + A credential requested from a + CredentialsProvider + . + Most users should work with the specialized subclasses: +
    +
  • + Username + for usernames
  • +
  • + Password + for passwords
  • +
  • + StringType + for other general string information
  • +
  • + CharArrayType + for other general secret information
  • +
+ This class is not thread-safe. Applications should construct their own + instance for each use, as the value is held within the CredentialItem object. +
+
+ + Initialize a prompt. + Initialize a prompt. + + prompt to display to the user alongside of the input field. + Should be sufficient text to indicate what to supply for this + item. + + + true if the value should be masked from displaying during + input. This should be true for passwords and other secrets, + false for names and other public data. + + + + prompt to display to the user. + + + true if the value should be masked when entered. + + + Clear the stored value, destroying it as much as possible. + Clear the stored value, destroying it as much as possible. + + + An item whose value is stored as a string. + + An item whose value is stored as a string. + When working with secret data, consider + CharArrayType + instead, as + the internal members of the array can be cleared, reducing the chances + that the password is left in memory after authentication is completed. + + + + Initialize a prompt for a single string. + Initialize a prompt for a single string. + + prompt to display to the user alongside of the input + field. Should be sufficient text to indicate what to + supply for this item. + + + true if the value should be masked from displaying during + input. This should be true for passwords and other + secrets, false for names and other public data. + + + + the current value + + + + + + An item whose value is stored as a char[] and is therefore clearable. + An item whose value is stored as a char[] and is therefore clearable. + + + Initialize a prompt for a secure value stored in a character array. + Initialize a prompt for a secure value stored in a character array. + + prompt to display to the user alongside of the input + field. Should be sufficient text to indicate what to + supply for this item. + + + true if the value should be masked from displaying during + input. This should be true for passwords and other + secrets, false for names and other public data. + + + + Destroys the current value, clearing the internal array. + Destroys the current value, clearing the internal array. + + + Get the current value. + + Get the current value. + The returned array will be cleared out when + Clear() + is + called. Callers that need the array elements to survive should delay + invoking + clear() + until the value is no longer necessary. + + + the current value array. The actual internal array is + returned, reducing the number of copies present in memory. + + + + Set the new value, clearing the old value array. + Set the new value, clearing the old value array. + if not null, the array is copied. + + + Set the new value, clearing the old value array. + Set the new value, clearing the old value array. + the new internal array. The array is NOT copied. + + + An item whose value is a boolean choice, presented as Yes/No. + An item whose value is a boolean choice, presented as Yes/No. + + + Initialize a prompt for a single boolean answer. + Initialize a prompt for a single boolean answer. + + prompt to display to the user alongside of the input + field. Should be sufficient text to indicate what to + supply for this item. + + + + the current value + + + Set the new value. + Set the new value. + + + + An advice message presented to the user, with no response required. + An advice message presented to the user, with no response required. + + + Initialize an informational message. + Initialize an informational message. + message to display to the user. + + + Prompt for a username, which is not masked on input. + Prompt for a username, which is not masked on input. + + + Initialize a new username item, with a default username prompt. + Initialize a new username item, with a default username prompt. + + + Prompt for a password, which is masked on input. + Prompt for a password, which is masked on input. + + + Initialize a new password item, with a default password prompt. + Initialize a new password item, with a default password prompt. + + + Initialize a new password item, with given prompt. + Initialize a new password item, with given prompt. + prompt message + + + Provide credentials for use in connecting to Git repositories. + + Provide credentials for use in connecting to Git repositories. + Implementors are strongly encouraged to support at least the minimal + Username + and + Password + items. + More sophisticated implementors may implement additional types, such as + StringType + . + CredentialItems are usually presented in bulk, allowing implementors to + combine them into a single UI widget and streamline the authentication + process for an end-user. + + UsernamePasswordCredentialsProvider + + + + the default credentials provider, or null. + + + Set the default credentials provider. + Set the default credentials provider. + the new default provider, may be null to select no default. + + + Check if the provider is interactive with the end-user. + + Check if the provider is interactive with the end-user. + An interactive provider may try to open a dialog box, or prompt for input + on the terminal, and will wait for a user response. A non-interactive + provider will either populate CredentialItems, or fail. + + + + true + if the provider is interactive with the end-user. + + + + + Check if the provider can supply the necessary + CredentialItem + s. + + the items the application requires to complete authentication. + + + + true + if this + CredentialsProvider + supports all of + the items supplied. + + + + Ask for the credential items to be populated. + Ask for the credential items to be populated. + the URI of the remote resource that needs authentication. + the items the application requires to complete authentication. + + + + true + if the request was successful and values were + supplied; + false + if the user canceled the request and did + not supply all requested values. + + if one of the items supplied is not supported. + + + + Ask for the credential items to be populated. + Ask for the credential items to be populated. + the URI of the remote resource that needs authentication. + the items the application requires to complete authentication. + + + + true + if the request was successful and values were + supplied; + false + if the user canceled the request and did + not supply all requested values. + + if one of the items supplied is not supported. + + + + Reset the credentials provider for the given URI + + + + + A JSch + NSch.UserInfo + adapter for a + CredentialsProvider + . + + + + Wrap a CredentialsProvider to make it suitable for use with JSch. + Wrap a CredentialsProvider to make it suitable for use with JSch. + the JSch session this UserInfo will support authentication on. + + the provider that will perform the authentication. + + + + + Simple + CredentialsProvider + that always uses the same information. + + + + Initialize the provider with a single username and password. + Initialize the provider with a single username and password. + + + + + Initialize the provider with a single username and password. + Initialize the provider with a single username and password. + + + + + + + + Destroy the saved username and password.. + Destroy the saved username and password.. + + + + An exception thrown when a + NGit.Transport.CredentialItem + is requested from a + NGit.Transport.CredentialsProvider + + which is not supported by this provider. + + + + + Constructs an UnsupportedCredentialItem with the specified detail message + prefixed with provided URI. + + + Constructs an UnsupportedCredentialItem with the specified detail message + prefixed with provided URI. + + URI used for transport + message + + + + Key for + NGit.Config.Get<T>(NGit.Config.SectionParser<T>) + + . + + + + A note tree holding only note subtrees, each named using a 2 digit hex name. + + + A note tree holding only note subtrees, each named using a 2 digit hex name. + The fanout buckets/trees contain on average 256 subtrees, naming the subtrees + by a slice of the ObjectId contained within them, from "00" through "ff". + Each fanout bucket has a + InMemoryNoteBucket.prefixLen + that defines how many digits it + skips in an ObjectId before it gets to the digits matching + table + . + The root tree has + prefixLen == 0 + , and thus does not skip any digits. + For ObjectId "c0ffee...", the note (if it exists) will be stored within the + bucket + table[0xc0] + . + The first level tree has + prefixLen == 2 + , and thus skips the first two + digits. For the same example "c0ffee..." object, its note would be found + within the + table[0xff] + bucket (as first 2 digits "c0" are skipped). + Each subtree is loaded on-demand, reducing startup latency for reads that + only need to examine a few objects. However, due to the rather uniform + distribution of the SHA-1 hash that is used for ObjectIds, accessing 256 + objects is very likely to load all of the subtrees into memory. + A FanoutBucket must be parsed from a tree object by + NoteParser + . + + + + A note bucket that has been loaded into the process. + A note bucket that has been loaded into the process. + + + A tree that stores note objects. + A tree that stores note objects. + FanoutBucket + LeafBucket + + + + + + + + + + + + + + + + + + Number of leading digits that leads to this bucket in the note path. + + Number of leading digits that leads to this bucket in the note path. + This is counted in terms of hex digits, not raw bytes. Each bucket level + is typically 2 higher than its parent, placing about 256 items in each + level of the tree. + + + + Chain of non-note tree entries found at this path in the tree. + + Chain of non-note tree entries found at this path in the tree. + During parsing of a note tree into the in-memory representation, + NoteParser + keeps track of all non-note tree entries and stores + them here as a sorted linked list. That list can be merged back with the + note data that is held by the subclass, allowing the tree to be + recreated. + + + + Fan-out table similar to the PackIndex structure. + + Fan-out table similar to the PackIndex structure. + Notes for an object are stored within the sub-bucket that is held here as + table[ objectId.getByte( prefixLen / 2 ) ] + . If the slot is null + there are no notes with that prefix. + + + + + Number of non-null slots in + table + . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A note tree holding only notes, with no subtrees. + + A note tree holding only notes, with no subtrees. + The leaf bucket contains on average less than 256 notes, all of whom share + the same leading prefix. If a notes branch has less than 256 notes, the top + level tree of the branch should be a LeafBucket. Once a notes branch has more + than 256 notes, the root should be a + FanoutBucket + and the LeafBucket + will appear only as a cell of a FanoutBucket. + Entries within the LeafBucket are stored sorted by ObjectId, and lookup is + performed using binary search. As the entry list should contain fewer than + 256 elements, the average number of compares to find an element should be + less than 8 due to the O(log N) lookup behavior. + A LeafBucket must be parsed from a tree object by + NoteParser + . + + + + All note blobs in this bucket, sorted sequentially. + All note blobs in this bucket, sorted sequentially. + + + + Number of items in + notes + . + + + + + + + + + + + + + A tree entry found in a note branch that isn't a valid note. + A tree entry found in a note branch that isn't a valid note. + + + Name of the entry in the tree, in raw format. + Name of the entry in the tree, in raw format. + + + Mode of the entry as parsed from the tree. + Mode of the entry as parsed from the tree. + + + The next non-note entry in the same tree, as defined by tree order. + The next non-note entry in the same tree, as defined by tree order. + + + In-memory representation of a single note attached to one object. + In-memory representation of a single note attached to one object. + + + + A Git note about the object referenced by + noteOn + . + + the object that has a note attached to it. + the actual note data contained in this note + + + the note content + + + Index of notes from a note branch. + + Index of notes from a note branch. + This class is not thread-safe, and relies on an + NGit.ObjectReader + that it + borrows/shares with the caller. The reader can be used during any call, and + is not released by this class. The caller should arrange for releasing the + shared + ObjectReader + at the proper times. + + + + Construct a new empty note map. + Construct a new empty note map. + an empty note map. + + + + Shorten the note ref name by trimming off the + NGit.Constants.R_NOTES + prefix if it exists. + + + a more user friendly note name + + + Load a collection of notes from a branch. + Load a collection of notes from a branch. + + reader to scan the note branch with. This reader may be + retained by the NoteMap for the life of the map in order to + support lazy loading of entries. + + the revision of the note branch to read. + the note map read from the commit. + the repository cannot be accessed through the reader. + + a tree object is corrupt and cannot be read. + + a tree object wasn't actually a tree. + + a reference tree object doesn't exist. + + + + Load a collection of notes from a tree. + Load a collection of notes from a tree. + + reader to scan the note branch with. This reader may be + retained by the NoteMap for the life of the map in order to + support lazy loading of entries. + + the note tree to read. + the note map read from the tree. + the repository cannot be accessed through the reader. + + a tree object is corrupt and cannot be read. + + a tree object wasn't actually a tree. + + a reference tree object doesn't exist. + + + + Load a collection of notes from a tree. + Load a collection of notes from a tree. + + reader to scan the note branch with. This reader may be + retained by the NoteMap for the life of the map in order to + support lazy loading of entries. + + the note tree to read. + the note map read from the tree. + the repository cannot be accessed through the reader. + + a tree object is corrupt and cannot be read. + + a tree object wasn't actually a tree. + + a reference tree object doesn't exist. + + + + Construct a new note map from an existing note bucket. + Construct a new note map from an existing note bucket. + the root bucket of this note map + + reader to scan the note branch with. This reader may be + retained by the NoteMap for the life of the map in order to + support lazy loading of entries. + + the note map built from the note bucket + + + Borrowed reader to access the repository. + Borrowed reader to access the repository. + + + All of the notes that have been loaded. + All of the notes that have been loaded. + + + + an iterator that iterates over notes of this NoteMap. Non note + entries are ignored by this iterator. + + + + Lookup a note for a specific ObjectId. + Lookup a note for a specific ObjectId. + the object to look for. + the note's blob ObjectId, or null if no note exists. + a portion of the note space is not accessible. + + + + Lookup a note for a specific ObjectId. + Lookup a note for a specific ObjectId. + the object to look for. + the note for the given object id, or null if no note exists. + a portion of the note space is not accessible. + + + + Determine if a note exists for the specified ObjectId. + Determine if a note exists for the specified ObjectId. + the object to look for. + true if a note exists; false if there is no note. + a portion of the note space is not accessible. + + + + Open and return the content of an object's note. + + Open and return the content of an object's note. + This method assumes the note is fairly small and can be accessed + efficiently. Larger notes should be accessed by streaming: +
+            ObjectId dataId = thisMap.get(id);
+            if (dataId != null)
+            reader.open(dataId).openStream();
+            
+
+ object to lookup the note of. + + maximum number of bytes to return. If the note data size is + larger than this limit, LargeObjectException will be thrown. + + + if a note is defined for + id + , the note content. If no note + is defined, null. + + + the note data is larger than + sizeLimit + . + + the note's blob does not exist in the repository. + + the note's blob cannot be read from the repository + +
+ + Attach (or remove) a note on an object. + + Attach (or remove) a note on an object. + If no note exists, a new note is stored. If a note already exists for the + given object, it is replaced (or removed). + This method only updates the map in memory. + If the caller wants to attach a UTF-8 encoded string message to an + object, + Set(NGit.AnyObjectId, string, NGit.ObjectInserter) + + is a convenient + way to encode and update a note in one step. + + + the object to attach the note to. This same ObjectId can later + be used as an argument to + Get(NGit.AnyObjectId) + or + GetCachedBytes(NGit.AnyObjectId, int) + + to read back the + noteData + . + + + data to associate with the note. This must be the ObjectId of + a blob that already exists in the repository. If null the note + will be deleted, if present. + + a portion of the note space is not accessible. + + + + Attach a note to an object. + + Attach a note to an object. + If no note exists, a new note is stored. If a note already exists for the + given object, it is replaced (or removed). + + + the object to attach the note to. This same ObjectId can later + be used as an argument to + Get(NGit.AnyObjectId) + or + GetCachedBytes(NGit.AnyObjectId, int) + + to read back the + noteData + . + + + text to store in the note. The text will be UTF-8 encoded when + stored in the repository. If null the note will be deleted, if + the empty string a note with the empty string will be stored. + + + inserter to write the encoded + noteData + out as a blob. + The caller must ensure the inserter is flushed before the + updated note map is made available for reading. + + the note data could not be stored in the repository. + + + + Remove a note from an object. + + Remove a note from an object. + If no note exists, no action is performed. + This method only updates the map in memory. + + the object to remove the note from. + a portion of the note space is not accessible. + + + + Write this note map as a tree. + Write this note map as a tree. + + inserter to use when writing trees to the object database. + Caller is responsible for flushing the inserter before trying + to read the objects, or exposing them through a reference. + + the top level tree. + a tree could not be written. + + + the root note bucket + + + + + + + + + Custom tree parser to select note bucket type and load it. + Custom tree parser to select note bucket type and load it. + + + + Parse a tree object into a + NoteBucket + instance. + The type of note tree is automatically detected by examining the items + within the tree, and allocating the proper storage type based on the + first note-like entry encountered. Since the method parses by guessing + the type on the first element, malformed note trees can be read as the + wrong type of tree. + This method is not recursive, it parses the one tree given to it and + returns the bucket. If there are subtrees for note storage, they are + setup as lazy pointers that will be resolved at a later time. + + + common hex digits that all notes within this tree share. The + root tree has + prefix.length() == 0 + , the first-level + subtrees should be + prefix.length()==2 + , etc. + + the tree to read from the repository. + reader to access the tree object. + bucket to holding the notes of the specified tree. + + treeId + cannot be accessed. + + + + + + + + + A class used to execute a + Rebase + command. It has setters for all + supported options and arguments of this command and a + Call() + method + to finally execute the command. Each instance of this class should only be + used for one invocation of the command (means: one call to + Call() + ) +

+

+ Git documentation about Rebase +
+ + The name of the "rebase-merge" folder + + + The name of the "stopped-sha" file + + + + + + + Executes the + Rebase + command with all the options and parameters + collected by the setter methods of this class. Each instance of this + class should only be used for one invocation of the command. Don't call + this method twice on an instance. + + an object describing the result of this command + NGit.Api.Errors.GitAPIException + + NGit.Api.Errors.WrongRepositoryStateException + + NGit.Api.Errors.NoHeadException + + NGit.Api.Errors.RefNotFoundException + + + + + + + + + + + the commit if we had to do a commit, otherwise null + NGit.Api.Errors.GitAPIException + + System.IO.IOException + + + + + + + + + + Removes the number of lines given in the parameter from the + git-rebase-todo file but preserves comments and other lines + that can not be parsed as steps + + + System.IO.IOException + + + + + + + checks if we can fast-forward and returns the new head if it is possible + + + the new head, or null + System.IO.IOException + NGit.Api.Errors.GitAPIException + + + + + + + + + + + + + + + + + + + + + + + + + + the upstream commit + + + this + + + + id of the upstream commit + + + this + + + + the upstream branch + + + this + + NGit.Api.Errors.RefNotFoundException + + + + Optionally override the name of the upstream. + + Optionally override the name of the upstream. If this is used, it has to + come after any + SetUpstream(NGit.Revwalk.RevCommit) + + call. + + the name which will be used to refer to upstream in conflicts + + + + this + + + + the operation to perform + + + this + + + + a progress monitor + this instance + + + The available operations + + + + The result of a + RebaseCommand + execution + + + + + Create RebaseResult with status + Status.STOPPED + + current commit + + + + Create RebaseResult with status + Status.FAILED + + list of paths causing this rebase to fail + + + the overall status + + + + the current commit if status is + Status.STOPPED + , otherwise + null + + + + + the list of paths causing this rebase to fail (see + NGit.Merge.ResolveMerger.GetFailingPaths() + + for details) if status is + Status.FAILED + , otherwise null + + + + + A class used to execute a + Rm + command. It has setters for all + supported options and arguments of this command and a + Call() + method + to finally execute the command. Each instance of this class should only be + used for one invocation of the command (means: one call to + Call() + ) + + Git documentation about Rm + + + + + + File to remove. + + + this + + + + + Executes the + Rm + command. Each instance of this class should only + be used for one invocation of the command. Don't call this method twice + on an instance. + + the DirCache after Rm + + + + + Checkout a branch to the working tree. + + Checkout a branch to the working tree. +

+ Examples (git is a + Git + instance): +

+ Check out an existing branch: +

+            git.checkout().setName("feature").call();
+            
+

+ Check out paths from the index: +

+            git.checkout().addPath("file1.txt").addPath("file2.txt").call();
+            
+

+ Check out a path from a commit: +

+            git.checkout().setStartPoint("HEAD&circ;").addPath("file1.txt").call();
+            
+

+ Create a new branch and check it out: +

+            git.checkout().setCreateBranch(true).setName("newbranch").call();
+            
+

+ Create a new tracking branch for a remote branch and check it out: +

+            git.checkout().setCreateBranch(true).setName("stable")
+            .setUpstreamMode(SetupUpstreamMode.SET_UPSTREAM)
+            .setStartPoint("origin/stable").call();
+            
+
+ Git documentation about Checkout +
+ + + + + + when trying to create (without force) a branch with a name + that already exists + + if the start point or branch can not be found + + + if the provided name is null or otherwise + invalid + + if the checkout results in a conflict + + the newly created branch + + + + Add a single path to the list of paths to check out. + + Add a single path to the list of paths to check out. To check out all + paths, use + SetAllPaths(bool) + . +

+ If this option is set, neither the + SetCreateBranch(bool) + nor + SetName(string) + option is considered. In other words, these + options are exclusive. + + path to update in the working tree and index + + + this + + + +

Set whether to checkout all paths. + + Set whether to checkout all paths. +

+ This options should be used when you want to do a path checkout on the + entire repository and so calling + AddPath(string) + is not possible + since empty paths are not allowed. +

+ If this option is set, neither the + SetCreateBranch(bool) + nor + SetName(string) + option is considered. In other words, these + options are exclusive. + + + true to checkout all paths, false + otherwise + + + + this + + 2.0 + + +

Checkout paths into index and working directory + this instance + System.IO.IOException + NGit.Api.Errors.RefNotFoundException + +
+ + + + + + + + + + + Specify the name of the branch or commit to check out, or the new branch + name. + + + Specify the name of the branch or commit to check out, or the new branch + name. +

+ When only checking out paths and not switching branches, use + SetStartPoint(string) + or + SetStartPoint(NGit.Revwalk.RevCommit) + + to + specify from which branch or commit to check out files. +

+ When + SetCreateBranch(bool) + is set to true, use + this method to set the name of the new branch to create and + SetStartPoint(string) + or + SetStartPoint(NGit.Revwalk.RevCommit) + + to + specify the start point of the branch. + + the name of the branch or commit + this instance + + +

Specify whether to create a new branch. + + Specify whether to create a new branch. +

+ If true is used, the name of the new branch must be set + using + SetName(string) + . The commit at which to start the new + branch can be set using + SetStartPoint(string) + or + SetStartPoint(NGit.Revwalk.RevCommit) + + ; if not specified, HEAD is used. Also + see + SetUpstreamMode(SetupUpstreamMode) + + for setting up branch tracking. + + + if true a branch will be created as part of the + checkout and set to the specified start point + + this instance + + +

Specify to force the ref update in case of a branch switch. + Specify to force the ref update in case of a branch switch. + + if true and the branch with the given name + already exists, the start-point of an existing branch will be + set to a new start-point; if false, the existing branch will + not be changed + + this instance +
+ + Set the name of the commit that should be checked out. + + Set the name of the commit that should be checked out. +

+ When checking out files and this is not specified or null, + the index is used. +

+ When creating a new branch, this will be used as the start point. If not + specified or null, the current HEAD is used. + + commit name to check out + this instance + + +

Set the commit that should be checked out. + + Set the commit that should be checked out. +

+ When creating a new branch, this will be used as the start point. If not + specified or null, the current HEAD is used. +

+ When checking out files and this is not specified or null, + the index is used. + + commit to check out + this instance + + +

+ When creating a branch with + SetCreateBranch(bool) + , this can + be used to configure branch tracking. + + + corresponds to the --track/--no-track options; may be + null + + this instance +
+ + the result, never null + + + Create an empty git repository or reinitalize an existing one + Git documentation about init + + + + Executes the + Init + command. + + + the newly created + Git + object with associated repository + + + + + The optional directory associated with the init operation. + + The optional directory associated with the init operation. If no + directory is set, we'll use the current directory + + the directory to init to + this instance + + + whether the repository is bare or not + this instance + + + File Utilities + + + + Option to delete given + File + + + + + Option to recursively delete given + File + + + + Option to retry deletion if not successful + + + Option to skip deletion if file doesn't exist + + + Option not to throw exceptions when a deletion finally doesn't succeed. + Option not to throw exceptions when a deletion finally doesn't succeed. + 2.0 + + + Delete file or empty folder + + File + to be deleted + + + if deletion of + f + fails. This may occur if + f + didn't exist when the method was called. This can therefore + cause IOExceptions during race conditions when multiple + concurrent threads all try to delete the same file. + + + + Delete file or folder + + File + to be deleted + + + deletion options, + RECURSIVE + for recursive deletion of + a subtree, + RETRY + to retry when deletion failed. + Retrying may help if the underlying file system doesn't allow + deletion of files being read by another thread. + + + if deletion of + f + fails. This may occur if + f + didn't exist when the method was called. This can therefore + cause IOExceptions during race conditions when multiple + concurrent threads all try to delete the same file. This + exception is not thrown when IGNORE_ERRORS is set. + + + + Creates the directory named by this abstract pathname. + Creates the directory named by this abstract pathname. + directory to be created + + if creation of + d + fails. This may occur if + d + did exist when the method was called. This can therefore + cause IOExceptions during race conditions when multiple + concurrent threads all try to create the same directory. + + + + Creates the directory named by this abstract pathname. + Creates the directory named by this abstract pathname. + directory to be created + + if + true + skip creation of the given directory if it + already exists in the file system + + + if creation of + d + fails. This may occur if + d + did exist when the method was called. This can therefore + cause IOExceptions during race conditions when multiple + concurrent threads all try to create the same directory. + + + + + Creates the directory named by this abstract pathname, including any + necessary but nonexistent parent directories. + + + Creates the directory named by this abstract pathname, including any + necessary but nonexistent parent directories. Note that if this operation + fails it may have succeeded in creating some of the necessary parent + directories. + + directory to be created + + if creation of + d + fails. This may occur if + d + did exist when the method was called. This can therefore + cause IOExceptions during race conditions when multiple + concurrent threads all try to create the same directory. + + + + + Creates the directory named by this abstract pathname, including any + necessary but nonexistent parent directories. + + + Creates the directory named by this abstract pathname, including any + necessary but nonexistent parent directories. Note that if this operation + fails it may have succeeded in creating some of the necessary parent + directories. + + directory to be created + + if + true + skip creation of the given directory if it + already exists in the file system + + + if creation of + d + fails. This may occur if + d + did exist when the method was called. This can therefore + cause IOExceptions during race conditions when multiple + concurrent threads all try to create the same directory. + + + + + Atomically creates a new, empty file named by this abstract pathname if + and only if a file with this name does not yet exist. + + + Atomically creates a new, empty file named by this abstract pathname if + and only if a file with this name does not yet exist. The check for the + existence of the file and the creation of the file if it does not exist + are a single operation that is atomic with respect to all other + filesystem activities that might affect the file. +

+ Note: this method should not be used for file-locking, as the resulting + protocol cannot be made to work reliably. The + Sharpen.FileLock + facility + should be used instead. + + the file to be created + if the named file already exists or if an I/O error occurred + + + +

+ A performance optimized variant of + TreeFilter.ANY_DIFF + which should + be used when among the walked trees there is a + NGit.Dircache.DirCacheIterator + and a + NGit.Treewalk.WorkingTreeIterator + . Please see the documentation of + TreeFilter.ANY_DIFF + for a basic description of the semantics. +

+ This filter tries to avoid computing content ids of the files in the + working-tree. In contrast to + TreeFilter.ANY_DIFF + this filter takes + care to first compare the entry from the + NGit.Dircache.DirCacheIterator + with the + entries from all other iterators besides the + NGit.Treewalk.WorkingTreeIterator + . + Since all those entries have fast access to content ids that is very fast. If + a difference is detected in this step this filter decides to include that + path before even looking at the working-tree entry. +

+ If no difference is found then we have to compare index and working-tree as + the last step. By making use of + NGit.Treewalk.WorkingTreeIterator.IsModified(NGit.Dircache.DirCacheEntry, bool) + + we can avoid the computation of the content id if the file is not dirty. +

+ Instances of this filter should not be used for multiple + NGit.Treewalk.TreeWalk + s. + Always construct a new instance of this filter for each TreeWalk. +

+
+ + Creates a new instance of this filter. + + Creates a new instance of this filter. Do not use an instance of this + filter in multiple treewalks. + + + the index of the + NGit.Dircache.DirCacheIterator + in the associated + treewalk + + + the index of the + NGit.Treewalk.WorkingTreeIterator + in the associated + treewalk + + + + Creates a new instance of this filter. + + Creates a new instance of this filter. Do not use an instance of this + filter in multiple treewalks. + + + the index of the + NGit.Dircache.DirCacheIterator + in the associated + treewalk + + + the index of the + NGit.Treewalk.WorkingTreeIterator + in the associated + treewalk + + + true if the filter should skip working tree files that are + declared as ignored by the standard exclude mechanisms.. + + + + + + + + + + Copy all entries which are still in untrackedParentFolders and which + belong to a path this treewalk has left into untrackedFolders. + + + Copy all entries which are still in untrackedParentFolders and which + belong to a path this treewalk has left into untrackedFolders. It is sure + that we will not find any tracked files underneath these paths. Therefore + these paths definitely belong to untracked folders. + + the current path of the treewalk + + + The method returns the list of ignored files and folders. + + The method returns the list of ignored files and folders. Only the root + folder of an ignored folder hierarchy is reported. If a/b/c is listed in + the .gitignore then you should not expect a/b/c/d/e/f to be reported + here. Only a/b/c will be reported. Furthermore only ignored files / + folders are returned that are NOT in the index. + + ignored paths + + + + all paths of folders which contain only untracked files/folders. + If on the associated treewalk postorder traversal was turned on + (see + NGit.Treewalk.TreeWalk.PostOrderTraversal(bool) + + ) then an + empty list will be returned. + + + + Thrown when branch deletion fails due to unmerged data + + + The default constructor with a default message + + + The default constructor with a default message + original exception + + + Caches when a file was last read, making it possible to detect future edits. + + + Caches when a file was last read, making it possible to detect future edits. +

+ This object tracks the last modified time of a file. Later during an + invocation of + IsModified(Sharpen.FilePath) + the object will return true if the + file may have been modified and should be re-read from disk. +

+ A snapshot does not "live update" when the underlying filesystem changes. + Callers must poll for updates by periodically invoking + IsModified(Sharpen.FilePath) + . +

+ To work around the "racy git" problem (where a file may be modified multiple + times within the granularity of the filesystem modification clock) this class + may return true from isModified(File) if the last modification time of the + file is less than 3 seconds ago. + + + +

A FileSnapshot that is considered to always be modified. + + A FileSnapshot that is considered to always be modified. +

+ This instance is useful for application code that wants to lazily read a + file, but only after + IsModified(Sharpen.FilePath) + gets invoked. The returned + snapshot contains only invalid status information. + + + +

A FileSnapshot that is clean if the file does not exist. + + A FileSnapshot that is clean if the file does not exist. +

+ This instance is useful if the application wants to consider a missing + file to be clean. + IsModified(Sharpen.FilePath) + will return false if the file + path does not exist. + + + +

Record a snapshot for a specific file path. + + Record a snapshot for a specific file path. +

+ This method should be invoked before the file is accessed. + + + the path to later remember. The path's current status + information is saved. + + the snapshot. + + +

+ Record a snapshot for a file for which the last modification time is + already known. + + + Record a snapshot for a file for which the last modification time is + already known. +

+ This method should be invoked before the file is accessed. + + the last modification time of the file + the snapshot. + + +

Last observed modification time of the path. + Last observed modification time of the path. +
+ + Last wall-clock time the path was read. + Last wall-clock time the path was read. + + + + True once + lastRead + is far later than + lastModified + . + + + + time of last snapshot update + + + Check if the path may have been modified since the snapshot was saved. + Check if the path may have been modified since the snapshot was saved. + the path the snapshot describes. + true if the path needs to be read again. + + + Update this snapshot when the content hasn't changed. + + Update this snapshot when the content hasn't changed. +

+ If the caller gets true from + IsModified(Sharpen.FilePath) + , re-reads the + content, discovers the content is identical, and + Equals(FileSnapshot) + is true, it can use + SetClean(FileSnapshot) + to make a future + IsModified(Sharpen.FilePath) + return false. The logic goes something like + this: +

+            if (snapshot.isModified(path)) {
+            FileSnapshot other = FileSnapshot.save(path);
+            Content newContent = ...;
+            if (oldContent.equals(newContent) && snapshot.equals(other))
+            snapshot.setClean(other);
+            }
+            
+
+ the other snapshot. +
+ + Compare two snapshots to see if they cache the same information. + Compare two snapshots to see if they cache the same information. + the other snapshot. + true if the two snapshots share the same information. + + + + Encapsulates the result of a + CheckoutCommand + + + + + The + Status.ERROR + result; + + + + + The + Status.NOT_TRIED + result; + + + + Create a new fail result. + + Create a new fail result. If status is + Status.CONFLICTS + , + fileList is a list of conflicting files, if status is + Status.NONDELETED + , fileList is a list of not deleted + files. All other values ignore fileList. To create a result + for + Status.OK + , see + CheckoutResult(System.Collections.Generic.IList<E>, System.Collections.Generic.IList<E>) + + . + + the failure status + + the list of files to store, status has to be either + Status.CONFLICTS + or + Status.NONDELETED + . + + + + Create a new OK result with modified and removed files. + Create a new OK result with modified and removed files. + the modified files + the removed files. + + + the status + + + + the list of files that created a checkout conflict, or an empty + list if + GetStatus() + is not + Status.CONFLICTS + ; + + + + + the list of files that could not be deleted during checkout, or + an empty list if + GetStatus() + is not + Status.NONDELETED + ; + + + + + the list of files that where modified during checkout, or an + empty list if + GetStatus() + is not + Status.OK + + + + + the list of files that where removed during checkout, or an empty + list if + GetStatus() + is not + Status.OK + + + + The status + + + + A class used to execute a + revert + command. It has setters for all + supported options and arguments of this command and a + Call() + method + to finally execute the command. Each instance of this class should only be + used for one invocation of the command (means: one call to + Call() + ) + + Git documentation about revert + + + + + + + Executes the + revert + command with all the options and parameters + collected by the setter methods (e.g. + Include(NGit.Ref) + of this + class. Each instance of this class should only be used for one invocation + of the command. Don't call this method twice on an instance. + + + on success the + NGit.Revwalk.RevCommit + pointed to by the new HEAD is + returned. If a failure occurred during revert null + is returned. The list of successfully reverted + NGit.Ref + 's can + be obtained by calling + GetRevertedRefs() + + NGit.Api.Errors.GitAPIException + + NGit.Api.Errors.WrongRepositoryStateException + + NGit.Api.Errors.ConcurrentRefUpdateException + + NGit.Api.Errors.UnmergedPathsException + + NGit.Api.Errors.NoMessageException + + + + + a reference to a commit which is reverted into the current + head + + + + this + + + + the Id of a commit which is reverted into the current head + + + this + + + + a name given to the commit + the Id of a commit which is reverted into the current head + + + this + + + + + the list of successfully reverted + NGit.Ref + 's. Never + null but maybe an empty list if no commit was + successfully cherry-picked + + + + + the result of the merge failure, null if no merge + failure occurred during the revert + + + + the unmerged paths, will be null if no merge conflicts + + + + Default implementation of the + NoteMerger + . +

+ If ours and theirs are both non-null, which means they are either both edits + or both adds, then this merger will simply join the content of ours and + theirs (in that order) and return that as the merge result. +

+ If one or ours/theirs is non-null and the other one is null then the non-null + value is returned as the merge result. This means that an edit/delete + conflict is resolved by keeping the edit version. +

+ If both ours and theirs are null then the result of the merge is also null. +

+
+ + Three-way note merge operation. + + Three-way note merge operation. +

+ This operation takes three versions of a note: base, ours and theirs, + performs the three-way merge and returns the merge result. + + + +

Merges the conflicting note changes. + + Merges the conflicting note changes. +

+ base, ours and their are all notes on the same object. + + version of the Note + version of the Note + version of the Note + the object reader that must be used to read Git objects + the object inserter that must be used to insert Git objects + + the merge result + + in case there was a merge conflict which this note merger + couldn't resolve + + + in case the reader or the inserter would throw an IOException + the implementor will most likely want to propagate it as it + can't do much to recover from it + + + + + + + +

Three-way note tree merge. + + Three-way note tree merge. +

+ Direct implementation of NoteMap merger without using + NGit.Treewalk.TreeWalk + and + NGit.Treewalk.AbstractTreeIterator + + + + +

+ Constructs a NoteMapMerger with custom + NoteMerger + and custom + NGit.Merge.MergeStrategy + . + + Git repository + note merger for merging conflicting changes on a note + merge strategy for merging non-note entries +
+ + + Constructs a NoteMapMerger with + DefaultNoteMerger + as the merger + for notes and the + NGit.Merge.MergeStrategy.RESOLVE + as the strategy for + resolving conflicts on non-notes + + Git repository + + + Performs the merge. + Performs the merge. + base version of the note tree + ours version of the note tree + theirs version of the note tree + merge result as a new NoteMap + System.IO.IOException + + + + This method is called only when it is known that there is some difference + between base, ours and theirs. + + + This method is called only when it is known that there is some difference + between base, ours and theirs. + + + + + + merge result as an InMemoryBucket + System.IO.IOException + + + + + + + + + + + + + + + + + + + + This exception will be thrown from the + NoteMerger + when a conflict on + Notes content is found during merge. + + + + + Construct a NotesMergeConflictException for the specified base, ours and + theirs note versions. + + + Construct a NotesMergeConflictException for the specified base, ours and + theirs note versions. + + note version + note version + note version + + + + Constructs a NotesMergeConflictException for the specified base, ours and + theirs versions of the root note tree. + + + Constructs a NotesMergeConflictException for the specified base, ours and + theirs versions of the root note tree. + + version of the root note tree + version of the root note tree + version of the root note tree + + + The standard "transfer", "fetch" and "receive" configuration parameters. + + The standard "transfer", "fetch" and "receive" configuration parameters. + + + + + Key for + NGit.Config.Get<T>(NGit.Config.SectionParser<T>) + + . + + + + strictly verify received objects? + + + + Parses a pack stream and imports it for an + NGit.ObjectInserter + . +

+ Applications can acquire an instance of a parser from ObjectInserter's + NGit.ObjectInserter.NewPackParser(Sharpen.InputStream) + + method. +

+ Implementations of + NGit.ObjectInserter + should subclass this type and + provide their own logic for the various + on*() + event methods declared + to be abstract. +

+
+ + Size of the internal stream buffer. + Size of the internal stream buffer. + + + Object database used for loading existing objects. + Object database used for loading existing objects. + + + + Position in the input stream of + buf[0] + . + + + + Every object contained within the incoming pack. + + Every object contained within the incoming pack. +

+ This is a subset of + entries + , as thin packs can add additional + objects to + entries + by copying already existing objects from the + repository onto the end of the thin pack to make it self-contained. + + + +

Objects referenced by their name from deltas, that aren't in this pack. + + Objects referenced by their name from deltas, that aren't in this pack. +

+ This is the set of objects that were copied onto the end of this pack to + make it complete. These objects were not transmitted by the remote peer, + but instead were assumed to already exist in the local repository. + + + +

Blobs whose contents need to be double-checked after indexing. + Blobs whose contents need to be double-checked after indexing. +
+ + Message to protect the pack data from garbage collection. + Message to protect the pack data from garbage collection. + + + Git object size limit + + + Initialize a pack parser. + Initialize a pack parser. + database the parser will write its objects into. + the stream the parser will read. + + + true if a thin pack (missing base objects) is permitted. + + + Configure this index pack instance to allow a thin pack. + + Configure this index pack instance to allow a thin pack. +

+ Thin packs are sometimes used during network transfers to allow a delta + to be sent without a base object. Such packs are not permitted on disk. + + true to enable a thin pack. + + +

Configure this index pack instance to keep track of new objects. + + Configure this index pack instance to keep track of new objects. +

+ By default an index pack doesn't save the new objects that were created + when it was instantiated. Setting this flag to + true + allows the + caller to use + GetNewObjectIds() + to retrieve that list. + + + true + to enable keeping track of new objects. + + + +

+ Configure this index pack instance to keep track of the objects assumed + for delta bases. + + + Configure this index pack instance to keep track of the objects assumed + for delta bases. +

+ By default an index pack doesn't save the objects that were used as delta + bases. Setting this flag to + true + will allow the caller to use + GetBaseObjectIds() + to retrieve that list. + + + true + to enable keeping track of delta bases. + + + + true if the EOF should be read from the input after the footer. + + +

Ensure EOF is read from the input stream after the footer. + Ensure EOF is read from the input stream after the footer. + true if the EOF should be read; false if it is not checked. +
+ + true if there is data expected after the pack footer. + + + + true if there is additional data in InputStream after pack. + This requires the InputStream to support the mark and reset + functions. + + + + the new objects that were sent by the user + + + set of objects the incoming pack assumed for delta purposes + + + Configure the checker used to validate received objects. + + Configure the checker used to validate received objects. +

+ Usually object checking isn't necessary, as Git implementations only + create valid objects in pack files. However, additional checking may be + useful if processing data from an untrusted source. + + the checker instance; null to disable object checking. + + +

Configure the checker used to validate received objects. + + Configure the checker used to validate received objects. +

+ Usually object checking isn't necessary, as Git implementations only + create valid objects in pack files. However, additional checking may be + useful if processing data from an untrusted source. +

+ This is shorthand for: +

+            setObjectChecker(on ? new ObjectChecker() : null);
+            
+
+ true to enable the default checker; false to disable it. +
+ + the message to record with the pack lock. + + + Set the lock message for the incoming pack data. + Set the lock message for the incoming pack data. + + if not null, the message to associate with the incoming data + while it is locked to prevent garbage collection. + + + + Set the maximum allowed Git object size. + + Set the maximum allowed Git object size. +

+ If an object is larger than the given size the pack-parsing will throw an + exception aborting the parsing. + + the Git object size limit. If zero then there is not limit. + + +

Get the number of objects in the stream. + + Get the number of objects in the stream. +

+ The object count is only available after + Parse(NGit.ProgressMonitor) + has returned. The count may have been increased if the stream was a thin + pack, and missing bases objects were appending onto it by the subclass. + + number of objects parsed out of the stream. + + +

Get the information about the requested object. + + Get the information about the requested object. +

+ The object information is only available after + Parse(NGit.ProgressMonitor) + has returned. + + + index of the object in the stream. Must be between 0 and + GetObjectCount() + -1. + + the object information. + + +

Get all of the objects, sorted by their name. + + Get all of the objects, sorted by their name. +

+ The object information is only available after + Parse(NGit.ProgressMonitor) + has returned. +

+ To maintain lower memory usage and good runtime performance, this method + sorts the objects in-place and therefore impacts the ordering presented + by + GetObject(int) + . + + comparison function, if null objects are stored by ObjectId. + sorted list of objects in this pack stream. + + +

Parse the pack stream. + Parse the pack stream. + + callback to provide progress feedback during parsing. If null, + NGit.NullProgressMonitor + will be used. + + + the pack lock, if one was requested by setting + SetLockMessage(string) + . + + the stream is malformed, or contains corrupt objects. + +
+ + Parse the pack stream. + Parse the pack stream. + + receives progress feedback during the initial receiving + objects phase. If null, + NGit.NullProgressMonitor + will be + used. + + receives progress feedback during the resolving objects phase. + + + the pack lock, if one was requested by setting + SetLockMessage(string) + . + + the stream is malformed, or contains corrupt objects. + + + + + + + + + + + + + + + + Read the header of the current object. + + Read the header of the current object. +

+ After the header has been parsed, this method automatically invokes + OnObjectHeader(Source, byte[], int, int) + + to allow the + implementation to update its internal checksums for the bytes read. +

+ When this method returns the database will be positioned on the first + byte of the deflated data stream. + + the info object to populate. + + + info + , after populating. + + the size cannot be read. + + + + + + + + + + + + + + + + + + + + + + + + current position of the input stream being parsed. + + + + + + + + + + + + + + + + + + a temporary byte array for use by the caller. + + +

Construct a PackedObjectInfo instance for this parser. + Construct a PackedObjectInfo instance for this parser. + identity of the object to be tracked. + + if the object was previously an unresolved delta, this is the + delta object that was tracking it. Otherwise null. + + + if the object was previously an unresolved delta, this is the + ObjectId of the base of the delta. The base may be outside of + the pack stream if the stream was a thin-pack. + + info object containing this object's data. +
+ + Store bytes received from the raw stream. + + Store bytes received from the raw stream. +

+ This method is invoked during + Parse(NGit.ProgressMonitor) + as data is + consumed from the incoming stream. Implementors may use this event to + archive the raw incoming stream to the destination repository in large + chunks, without paying attention to object boundaries. +

+ The only component of the pack not supplied to this method is the last 20 + bytes of the pack that comprise the trailing SHA-1 checksum. Those are + passed to + OnPackFooter(byte[]) + . + + buffer to copy data out of. + first offset within the buffer that is valid. + number of bytes in the buffer that are valid. + the stream cannot be archived. + + +

Store (and/or checksum) an object header. + + Store (and/or checksum) an object header. +

+ Invoked after any of the + onBegin() + events. The entire header is + supplied in a single invocation, before any object data is supplied. + + where the data came from + buffer to read data from. + first offset within buffer that is valid. + number of bytes in buffer that are valid. + the stream cannot be archived. + + +

Store (and/or checksum) a portion of an object's data. + + Store (and/or checksum) a portion of an object's data. +

+ This method may be invoked multiple times per object, depending on the + size of the object, the size of the parser's internal read buffer, and + the alignment of the object relative to the read buffer. +

+ Invoked after + OnObjectHeader(Source, byte[], int, int) + + . + + where the data came from + buffer to read data from. + first offset within buffer that is valid. + number of bytes in buffer that are valid. + the stream cannot be archived. + + +

Invoked for commits, trees, tags, and small blobs. + Invoked for commits, trees, tags, and small blobs. + the object info, populated. + the type of the object. + inflated data for the object. + the object cannot be archived. +
+ + Provide the implementation with the original stream's pack header. + Provide the implementation with the original stream's pack header. + number of objects expected in the stream. + the implementation refuses to work with this many objects. + + + + Provide the implementation with the original stream's pack footer. + Provide the implementation with the original stream's pack footer. + + the trailing 20 bytes of the pack, this is a SHA-1 checksum of + all of the pack data. + + the stream cannot be archived. + + + Provide the implementation with a base that was outside of the pack. + + Provide the implementation with a base that was outside of the pack. +

+ This event only occurs on a thin pack for base objects that were outside + of the pack and came from the local repository. Usually an implementation + uses this event to compress the base and append it onto the end of the + pack, so the pack stays self-contained. + + type of the base object. + complete content of the base object. + + packed object information for this base. Implementors must + populate the CRC and offset members if returning true. + + + true if the + info + should be included in the object list + returned by + GetSortedObjectList(System.Collections.Generic.IComparer<T>) + + , false if it + should not be included. + + the base could not be included into the pack. + + + +

Event indicating a thin pack has been completely processed. + + Event indicating a thin pack has been completely processed. +

+ This event is invoked only if a thin pack has delta references to objects + external from the pack. The event is called after all of those deltas + have been resolved. + + the pack cannot be archived. + + +

Reposition the database to re-read a previously stored object. + + Reposition the database to re-read a previously stored object. +

+ If the database is computing CRC-32 checksums for object data, it should + reset its internal CRC instance during this method call. + + + the object position to begin reading from. This is from + NewInfo(NGit.AnyObjectId, UnresolvedDelta, NGit.ObjectId) + + . + + object to populate with type and size. + + the + info + object. + + the database cannot reposition to this location. + + + +

Reposition the database to re-read a previously stored object. + + Reposition the database to re-read a previously stored object. +

+ If the database is computing CRC-32 checksums for object data, it should + reset its internal CRC instance during this method call. + + + the object position to begin reading from. This is an instance + previously returned by + OnEndDelta() + . + + object to populate with type and size. + + the + info + object. + + the database cannot reposition to this location. + + + +

Read from the database's current position into the buffer. + Read from the database's current position into the buffer. + the buffer to copy read data into. + + position within + dst + to start copying data into. + + + ideal target number of bytes to read. Actual read length may + be shorter. + + number of bytes stored. + the database cannot be accessed. +
+ + Check the current CRC matches the expected value. + + Check the current CRC matches the expected value. +

+ This method is invoked when an object is read back in from the database + and its data is used during delta resolution. The CRC is validated after + the object has been fully read, allowing the parser to verify there was + no silent data corruption. +

+ Implementations are free to ignore this check by always returning true if + they are performing other data integrity validations at a lower level. + + + the prior CRC that was recorded during the first scan of the + object from the pack stream. + + true if the CRC matches; false if it does not. + + +

Event notifying the start of an object stored whole (not as a delta). + Event notifying the start of an object stored whole (not as a delta). + position of this object in the incoming stream. + + type of the object; one of + NGit.Constants.OBJ_COMMIT + , + NGit.Constants.OBJ_TREE + , + NGit.Constants.OBJ_BLOB + , or + NGit.Constants.OBJ_TAG + . + + + size of the object when fully inflated. The size stored within + the pack may be larger or smaller, and is not yet known. + + the object cannot be recorded. +
+ + Event notifying the the current object. + Event notifying the the current object. + object information. + the object cannot be recorded. + + + Event notifying start of a delta referencing its base by offset. + Event notifying start of a delta referencing its base by offset. + position of this object in the incoming stream. + + + position of the base object in the incoming stream. The base + must be before the delta, therefore + + baseStreamPosition + < deltaStreamPosition + + . This is not the position + returned by a prior end object event. + + + size of the delta when fully inflated. The size stored within + the pack may be larger or smaller, and is not yet known. + + the object cannot be recorded. + + + Event notifying start of a delta referencing its base by ObjectId. + Event notifying start of a delta referencing its base by ObjectId. + position of this object in the incoming stream. + + + name of the base object. This object may be later in the + stream, or might not appear at all in the stream (in the case + of a thin-pack). + + + size of the delta when fully inflated. The size stored within + the pack may be larger or smaller, and is not yet known. + + the object cannot be recorded. + + + Event notifying the the current object. + Event notifying the the current object. + + object information that must be populated with at least the + offset. + + the object cannot be recorded. + + + + + + + + + + + + Location data is being obtained from. + Location data is being obtained from. + + + Type and size information about an object in the database buffer. + Type and size information about an object in the database buffer. + + + The type of the object. + The type of the object. + + + The inflated size of the object. + The inflated size of the object. + + + Information about an unresolved delta in this pack stream. + Information about an unresolved delta in this pack stream. + + + offset within the input stream. + + + the CRC-32 checksum of the stored delta data. + + + the CRC-32 checksum of the stored delta data. + + + + + + + + + + + + + + + + + + + Consumes a pack stream and stores as a pack file in + ObjectDirectory + . +

+ To obtain an instance of a parser, applications should use + NGit.ObjectInserter.NewPackParser(Sharpen.InputStream) + + . +

+
+ + CRC-32 computation for objects that are appended onto the pack. + CRC-32 computation for objects that are appended onto the pack. + + + + Running SHA-1 of any base objects appended after + origEnd + . + + + + Preferred format version of the pack-*.idx file to generate. + Preferred format version of the pack-*.idx file to generate. + + + If true, pack with 0 objects will be stored. + If true, pack with 0 objects will be stored. Usually these are deleted. + + + Path of the temporary file holding the pack data. + Path of the temporary file holding the pack data. + + + + Path of the index created for the pack, to find objects quickly at read + time. + + + Path of the index created for the pack, to find objects quickly at read + time. + + + + + Read/write handle to + tmpPack + while it is being parsed. + + + + Length of the original pack stream, before missing bases were appended. + Length of the original pack stream, before missing bases were appended. + + + + The original checksum of data up to + origEnd + . + + + + Current end of the pack file. + Current end of the pack file. + + + Checksum of the entire pack file. + Checksum of the entire pack file. + + + Compresses delta bases when completing a thin pack. + Compresses delta bases when completing a thin pack. + + + The pack that was created, if parsing was successful. + The pack that was created, if parsing was successful. + + + Set the pack index file format version this instance will create. + Set the pack index file format version this instance will create. + + the version to write. The special version 0 designates the + oldest (most compatible) format available for the objects. + + PackIndexWriter + + + Configure this index pack instance to keep an empty pack. + + Configure this index pack instance to keep an empty pack. +

+ By default an empty pack (a pack with no objects) is not kept, as doi so + is completely pointless. With no objects in the pack there is no d stored + by it, so the pack is unnecessary. + + true to enable keeping an empty pack. + + +

+ Get the imported + PackFile + . +

+ This method is supplied only to support testing; applications shouldn't + be using it directly to access the imported data. +

+ the imported PackFile, if parsing was successful. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Iterates through an open object list. + + Iterates through an open object list. +

+ A cached object list should be constructed by enumerating from a single + stable commit back to the beginning of the project, using an ObjectWalk: +

+            ObjectWalk walk = new ObjectWalk(repository);
+            walk.markStart(walk.parseCommit(listName));
+            RevCommit commit;
+            while ((commit = walk.next()) != null)
+            list.addCommit(commit);
+            RevObject object;
+            while ((object == walk.nextObject()) != null)
+            list.addObject(object, walk.getPathHasCode());
+            
+

+ NGit.Storage.Pack.PackWriter + relies on the list covering a single commit, and going all + the way back to the root. If a list contains multiple starting commits the + PackWriter will include all of those objects, even if the client did not ask + for them, or should not have been given the objects. + + + +

Initialize the list iterator. + Initialize the list iterator. + + the revision pool the iterator will use when allocating the + returned objects. + +
+ + Lookup an object from the revision pool. + Lookup an object from the revision pool. + the object to allocate. + + the type of the object. The type must be accurate, as it is + used to allocate the proper RevObject instance. + + the object. + + + Pop the next most recent commit. + + Pop the next most recent commit. +

+ Commits should be returned in descending commit time order, or in + topological order. Either ordering is acceptable for a list to use. + + next most recent commit; null if traversal is over. + the list cannot be read. + + +

Pop the next most recent object. + + Pop the next most recent object. +

+ Only RevTree and RevBlob may be returned from this method, as these are + the only non-commit types reachable from a RevCommit. Lists may return + the objects clustered by type, or clustered by order of first-discovery + when walking from the most recent to the oldest commit. + + the next object. Null at the end of the list. + the list cannot be read. + + +

Get the current object's path hash code. + + Get the current object's path hash code. +

+ The path hash code should be cached from the ObjectWalk. + + path hash code; any integer may be returned. + + +

Release the resources associated with this iterator. + Release the resources associated with this iterator. +
+ + Clone a repository into a new working directory + Git documentation about Clone + + + Create clone command with no repository set + + + + Executes the + Clone + command. + + + the newly created + Git + object with associated repository + + NGit.Api.Errors.InvalidRemoteException + + NGit.Api.Errors.TransportException + + NGit.Api.Errors.GitAPIException + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + the uri to clone from + this instance + + + The optional directory associated with the clone operation. + + The optional directory associated with the clone operation. If the + directory isn't set, a name associated with the source uri will be used. + + NGit.Transport.URIish.GetHumanishName() + + the directory to clone to + this instance + + + whether the cloned repository is bare or not + this instance + + + + The remote name used to keep track of the upstream repository for the + clone operation. + + + The remote name used to keep track of the upstream repository for the + clone operation. If no remote name is set, the default value of + Constants.DEFAULT_REMOTE_NAME will be used. + + NGit.Constants.DEFAULT_REMOTE_NAME + + name that keeps track of the upstream repository + this instance + + + the initial branch to check out when cloning the repository + this instance + + + The progress monitor associated with the clone operation. + + The progress monitor associated with the clone operation. By default, + this is set to NullProgressMonitor + + NGit.NullProgressMonitor + + + + this + + + + + true when all branches have to be fetched (indicates wildcard + in created fetch refspec), false otherwise. + + + + this + + + + + true to initialize and update submodules. Ignored when + SetBare(bool) + is set to true. + + + + this + + + + + collection of branches to clone. Ignored when allSelected is + true. + + + + this + + + + + if set to true no branch will be checked out + after the clone. This enhances performance of the clone + command when there is no need for a checked out branch. + + + + this + + + + + + + + + + + + + Describes a pack file + ObjectReuseAsIs + can append onto a stream. + + + + Objects that start this pack. + + Objects that start this pack. +

+ All objects reachable from the tips are contained within this pack. If + PackWriter + is going to include everything reachable from all of + these objects, this cached pack is eligible to be appended directly onto + the output pack stream. + + the tip objects that describe this pack. + + +

Get the number of objects in this pack. + Get the number of objects in this pack. + the total object count for the pack. + if the object count cannot be read. +
+ + Get the number of delta objects stored in this pack. + + Get the number of delta objects stored in this pack. +

+ This is an optional method, not every cached pack storage system knows + the precise number of deltas stored within the pack. This number must be + smaller than + GetObjectCount() + as deltas are not supposed to span + across pack files. +

+ This method must be fast, if the only way to determine delta counts is to + scan the pack file's contents one object at a time, implementors should + return 0 and avoid the high cost of the scan. + + + the number of deltas; 0 if the number is not known or there are + no deltas. + + if the delta count cannot be read. + + +

Determine if this pack contains the object representation given. + + Determine if this pack contains the object representation given. +

+ PackWriter uses this method during the finding sources phase to prune + away any objects from the leading thin-pack that already appear within + this pack and should not be sent twice. +

+ Implementors are strongly encouraged to rely on looking at + rep + only and using its internal state to decide if this object is within this + pack. Implementors should ensure a representation from this cached pack + is tested as part of + ObjectReuseAsIs.SelectObjectRepresentation(PackWriter, NGit.ProgressMonitor, Sharpen.Iterable<T>) + + , ensuring this method would eventually return true if the object would + be included by this cached pack. + + the object being packed. Can be used as an ObjectId. + + representation from the + ObjectReuseAsIs + instance that + originally supplied this CachedPack. + + true if this pack contains this object. + + + + + + + + + + + + + + +

+ Logs activity that occurred within + UploadPack + . +

+ Implementors of the interface are responsible for associating the current + thread to a particular connection, if they need to also include connection + information. One method is to use a + Sharpen.ThreadLocal<T> + to remember + the connection information before invoking UploadPack. +

+
+ + A simple no-op logger. + A simple no-op logger. + + + Notice to the logger after a pack has been sent. + Notice to the logger after a pack has been sent. + the statistics after sending a pack to the client. + + + Default resolver serving from the local filesystem. + Default resolver serving from the local filesystem. + + + + Locate a Git + NGit.Repository + by name from the URL. + + + + Resolver configured to open nothing. + Resolver configured to open nothing. + + + + Locate and open a reference to a + NGit.Repository + . +

+ The caller is responsible for closing the returned Repository. +

+ + the current request, may be used to inspect session state + including cookies or user authentication. + + name of the repository, as parsed out of the URL. + the opened repository instance, never null. + + the repository does not exist or the name is incorrectly + formatted as a repository name. + + + the repository may exist, but HTTP access is not allowed + without authentication, i.e. this corresponds to an HTTP 401 + Unauthorized. + + + the repository may exist, but HTTP access is not allowed on the + target repository, for the current user. + + + the repository may exist, but HTTP access is not allowed for + the current request. The exception message contains a detailed + message that should be shown to the user. + + + +
+ + + + + Initialize an empty file based resolver. + Initialize an empty file based resolver. + + + Create a new resolver for the given path. + Create a new resolver for the given path. + the base path all repositories are rooted under. + + if true, exports all repositories, ignoring the check for the + git-daemon-export-ok + files. + + + + + + + + + false if git-daemon-export-ok is required to export + a repository; true if git-daemon-export-ok is + ignored. + + FileResolver<C>.SetExportAll(bool) + + + + Set whether or not to export all repositories. + + Set whether or not to export all repositories. +

+ If false (the default), repositories must have a + git-daemon-export-ok file to be accessed through this + daemon. +

+ If true, all repositories are available through the daemon, whether or + not git-daemon-export-ok exists. + + + + +

Add a single repository to the set that is exported by this daemon. + + Add a single repository to the set that is exported by this daemon. +

+ The existence (or lack-thereof) of git-daemon-export-ok is + ignored by this method. The repository is always published. + + name the repository will be published under. + the repository instance. + + +

Recursively export all Git repositories within a directory. + Recursively export all Git repositories within a directory. + + the directory to export. This directory must not itself be a + git repository, but any directory below it which has a file + named git-daemon-export-ok will be published. + +
+ + Check if this repository can be served. + + Check if this repository can be served. +

+ The default implementation of this method returns true only if either + FileResolver<C>.IsExportAll() + is true, or the + git-daemon-export-ok + file + is present in the repository's directory. + + the current HTTP request. + name of the repository, as present in the URL. + the opened repository instance. + true if the repository is accessible; false if not. + + the repository could not be accessed, the caller will claim + the repository does not exist. + + + +

Indicates the request service is not authorized for current user. + Indicates the request service is not authorized for current user. +
+ + Indicates the request service is not available. + Indicates the request service is not available. + + + Indicates the request service is not enabled on a repository. + Indicates the request service is not enabled on a repository. + + + Indicates the request service is not available. + Indicates the request service is not available. + + + + A class used to execute a + Reset + command. It has setters for all + supported options and arguments of this command and a + Call() + method + to finally execute the command. Each instance of this class should only be + used for one invocation of the command (means: one call to + Call() + ) + + Git documentation about Reset + + + + + + + Executes the + Reset + command. Each instance of this class should + only be used for one invocation of the command. Don't call this method + twice on an instance. + + the Ref after reset + NGit.Api.Errors.GitAPIException + + + + + the ref to reset to + this instance + + + the mode of the reset command + this instance + + + the file to add + this instance + + + + + + + + + + + + + + + + Kind of reset + + + Random access list that allocates entries in blocks. + + Random access list that allocates entries in blocks. +

+ Unlike + System.Collections.ArrayList<E> + + , this type does not need to reallocate the + internal array in order to expand the capacity of the list. Access to any + element is constant time, but requires two array lookups instead of one. +

+ To handle common usages, + BlockList<T>.AddItem(object) + and + BlockList<T>.Iterator() + use + internal code paths to amortize out the second array lookup, making addition + and simple iteration closer to one array operation per element processed. +

+ Similar to + ArrayList + , adding or removing from any position except the + end of the list requires O(N) time to copy all elements between the + modification point and the end of the list. Applications are strongly + encouraged to not use this access pattern with this list implementation. + + + +

Initialize an empty list. + Initialize an empty list. +
+ + Initialize an empty list with an expected capacity. + Initialize an empty list with an expected capacity. + number of elements expected to be in the list. + + + Quickly append all elements of another BlockList. + Quickly append all elements of another BlockList. + the list to copy elements from. + + + Quickly append all elements from an array. + Quickly append all elements from an array. + the source array. + first index to copy. + number of elements to copy. + + + + Fast, efficient map for + ObjectId + subclasses in only one map. +

+ To use this map type, applications must have their entry value type extend + from + Entry + , which itself extends from ObjectId. +

+ Object instances may only be stored in ONE ObjectIdOwnerMap. This + restriction exists because the map stores internal map state within each + object instance. If an instance is be placed in another ObjectIdOwnerMap it + could corrupt one or both map's internal state. +

+ If an object instance must be in more than one map, applications may use + ObjectIdOwnerMap for one of the maps, and + ObjectIdSubclassMap<V> + for the + other map(s). It is encouraged to use ObjectIdOwnerMap for the map that is + accessed most often, as this implementation runs faster than the more general + ObjectIdSubclassMap implementation. +

+
+ + Size of the initial directory, will grow as necessary. + Size of the initial directory, will grow as necessary. + + + Number of bits in a segment's index. + Number of bits in a segment's index. Segments are 2^11 in size. + + + Top level directory of the segments. + + Top level directory of the segments. +

+ The low + ObjectIdOwnerMap<V>.bits + of the SHA-1 are used to select the segment from + this directory. Each segment is constant sized at 2^SEGMENT_BITS. + + + +

Total number of objects in this map. + Total number of objects in this map. +
+ + + The map doubles in capacity when + ObjectIdOwnerMap<V>.size + reaches this target. + + + + + Number of low bits used to form the index into + ObjectIdOwnerMap<V>.directory + . + + + + + Low bit mask to index into + ObjectIdOwnerMap<V>.directory + , + 2^bits-1 + . + + + + Create an empty map. + Create an empty map. + + + Remove all entries from this map. + Remove all entries from this map. + + + Lookup an existing mapping. + Lookup an existing mapping. + the object identifier to find. + the instance mapped to toFind, or null if no mapping exists. + + + Returns true if this map contains the specified object. + Returns true if this map contains the specified object. + object to find. + true if the mapping exists for this object; false otherwise. + + + Store an object for future lookup. + + Store an object for future lookup. +

+ An existing mapping for must not be in this map. Callers must + first call + ObjectIdOwnerMap<V>.Get(AnyObjectId) + + to verify there is no current + mapping prior to adding a new mapping, or use + ObjectIdOwnerMap<V>.AddIfAbsent<Q>(Entry) + + . + + the object to store. + + +

Store an object for future lookup. + + Store an object for future lookup. +

+ Stores + newValue + , but only if there is not already an object for + the same object name. Callers can tell if the value is new by checking + the return value with reference equality: +

+            V obj = ...;
+            boolean wasNew = map.addIfAbsent(obj) == obj;
+            
+
+ the object to store. + + + newValue + if stored, or the prior value already stored and + that would have been returned had the caller used + get(newValue) + first. + +
+ + number of objects in this map. + + + + true if + ObjectIdOwnerMap<V>.Size() + is 0. + + + + Run remote commands using Jsch. + + Run remote commands using Jsch. +

+ This class is the default session implementation using Jsch. Note that + JschConfigSessionFactory + is used to create the actual session passed + to the constructor. + + + +

+ Create a new session object by passing the real Jsch session and the URI + information. + + + Create a new session object by passing the real Jsch session and the URI + information. + + the real Jsch session created elsewhere. + the URI information for the remote connection +
+ + + + + + A kludge to allow + TransportSftp + to get an Sftp channel from Jsch. + Ideally, this method would be generic, which would require implementing + generic Sftp channel operations in the RemoteSession class. + + a channel suitable for Sftp operations. + on problems getting the channel. + + + Implementation of Process for running a single command using Jsch. + + Implementation of Process for running a single command using Jsch. +

+ Uses the Jsch session to do actual command execution and manage the + execution. + + + +

+ Opens a channel on the session ("sock") for executing the given + command, opens streams, and starts command execution. + + + Opens a channel on the session ("sock") for executing the given + command, opens streams, and starts command execution. + + the command to execute + the timeout value, in seconds, for the command. + + on problems opening a channel or connecting to the remote + host + + on problems opening streams +
+ + + + + + + + + + + + + + + Encapsulates the result of a + CherryPickCommand + . + + + + commit the head points at after this cherry-pick + list of successfully cherry-picked Ref's + + + + + list of paths causing this cherry-pick to fail (see + NGit.Merge.ResolveMerger.GetFailingPaths() + + for details) + + + + + A CherryPickResult with status + CherryPickStatus.CONFLICTING + + + + the status this cherry-pick resulted in + + + + the commit the head points at after this cherry-pick, + null if + GetStatus() + is not + CherryPickStatus.OK + + + + + the list of successfully cherry-picked Ref's, + null if + GetStatus() + is not + CherryPickStatus.OK + + + + + the list of paths causing this cherry-pick to fail (see + NGit.Merge.ResolveMerger.GetFailingPaths() + + for details), + null if + GetStatus() + is not + CherryPickStatus.FAILED + + + + The cherry-pick status + + + + A class telling where the working-tree, the index and the current HEAD differ + from each other. + + + A class telling where the working-tree, the index and the current HEAD differ + from each other. Collections are exposed containing the paths of the modified + files. E.g. to find out which files are dirty in the working tree (modified + but not added) you would inspect the collection returned by + GetModified() + . +

+ The same path can be returned by multiple getters. E.g. if a modification has + been added to the index and afterwards the corresponding working tree file is + again modified this path will be returned by + GetModified() + and + GetChanged() + + + + + + + + true if no differences exist between the working-tree, the index, + and the current HEAD, false if differences do exist + + + + + list of files added to the index, not in HEAD (e.g. what you get + if you call 'git add ...' on a newly created file) + + + + + list of files changed from HEAD to index (e.g. what you get if + you modify an existing file and call 'git add ...' on it) + + + + + list of files removed from index, but in HEAD (e.g. what you get + if you call 'git rm ...' on a existing file) + + + + + list of files in index, but not filesystem (e.g. what you get if + you call 'rm ...' on a existing file) + + + + + list of files modified on disk relative to the index (e.g. what + you get if you modify an existing file without adding it to the + index) + + + + + list of files that are not ignored, and not in the index. (e.g. + what you get if you create a new file without adding it to the + index) + + + + + list of files that are in conflict. (e.g what you get if you + modify file that was modified by someone else in the meantime) + + + +

+ A class used to execute a + Status + command. It has setters for all + supported options and arguments of this command and a + Call() + method + to finally execute the command. Each instance of this class should only be + used for one invocation of the command (means: one call to + Call() + ) + + Git documentation about Status +
+ + + + + + Executes the + Status + command with all the options and parameters + collected by the setter methods of this class. Each instance of this + class should only be used for one invocation of the command. Don't call + this method twice on an instance. + + + a + Status + object telling about each path where working + tree, index or HEAD differ from each other. + + + + + + + To set the + NGit.Treewalk.WorkingTreeIterator + which should be used. If this + method is not called a standard + NGit.Treewalk.FileTreeIterator + is used. + + a working tree iterator + + + this + + + + + Hook invoked by + UploadPack + before during critical phases. +

+ If any hook function throws + ServiceMayNotContinueException + then + processing stops immediately and the exception is thrown up the call stack. + Most phases of UploadPack will try to report the exception's message text to + the end-user over the client's protocol connection. +

+
+ + A simple no-op hook. + A simple no-op hook. + + + Invoked before negotiation round is started. + Invoked before negotiation round is started. + the upload pack instance handling the connection. + the list of wanted objects. + number of objects the client has offered. + abort; the message will be sent to the user. + + + + + Invoked after a negotiation round is completed. + Invoked after a negotiation round is completed. + the upload pack instance handling the connection. + the list of wanted objects. + + number of objects this round found to be common. In a smart + HTTP transaction this includes the objects that were + previously found to be common. + + + number of objects in this round the local repository does not + have, but that were offered as potential common bases. + + + true if a pack is ready to be sent (the commit graph was + successfully cut). + + abort; the message will be sent to the user. + + + + + Invoked just before a pack will be sent to the client. + Invoked just before a pack will be sent to the client. + the upload pack instance handling the connection. + + the list of wanted objects. These may be RevObject or + RevCommit if the processed parsed them. Implementors should + not rely on the values being parsed. + + + the list of common objects. Empty on an initial clone request. + These may be RevObject or RevCommit if the processed parsed + them. Implementors should not rely on the values being parsed. + + abort; the message will be sent to the user. + + + + + + + + + + + + + + Indicates UploadPack may not continue execution. + Indicates UploadPack may not continue execution. + + + Indicates a transport service may not continue execution. + Indicates a transport service may not continue execution. + 2.0 + + + Initialize with no message. + Initialize with no message. + + + + a message explaining why it cannot continue. This message may + be shown to an end-user. + + + + true if the message was already output to the client. + + + Mark this message has being sent to the client. + Mark this message has being sent to the client. + + + Initialize with no message. + Initialize with no message. + + + + a message explaining why it cannot continue. This message may + be shown to an end-user. + + + + Add object notes. + Add object notes. + Git documentation about Notes + + + + + + + + + Sets the object id of object you want a note on. + + Sets the object id of object you want a note on. If the object already + has a note, the existing note will be replaced. + + + + + this + + + + the notes message used when adding a note + + + this + + + + + + + + the ref to read notes from. Note, the default value of + NGit.Constants.R_NOTES_COMMITS + will be used if nothing is + set + + + + this + + NGit.Constants.R_NOTES_COMMITS + + + List object notes. + List object notes. + Git documentation about Notes + + + + + + the requested notes + + + + + the ref to read notes from. Note, the default value of + NGit.Constants.R_NOTES_COMMITS + will be used if nothing is + set + + + + this + + NGit.Constants.R_NOTES_COMMITS + + + Remove object notes. + Remove object notes. + Git documentation about Notes + + + + + + + + + Sets the object id of object you want to remove a note + + + + this + + + + + + + + the ref to read notes from. Note, the default value of + NGit.Constants.R_NOTES_COMMITS + will be used if nothing is + set + + + + this + + NGit.Constants.R_NOTES_COMMITS + + + Show an object note. + Show an object note. + Git documentation about Notes + + + + + + + + + Sets the object id of object you want a note on + + + + this + + + + + the ref to read notes from. Note, the default value of + NGit.Constants.R_NOTES_COMMITS + will be used if nothing is + set + + + + this + + NGit.Constants.R_NOTES_COMMITS + + + The ls-remote command + Git documentation about ls-remote + + + + + + The remote (uri or name) used for the fetch operation. + + The remote (uri or name) used for the fetch operation. If no remote is + set, the default value of Constants.DEFAULT_REMOTE_NAME will + be used. + + NGit.Constants.DEFAULT_REMOTE_NAME + + + + + this + + + + Include refs/heads in references results + + + + this + + + + Include refs/tags in references results + + + + this + + + + The full path of git-upload-pack on the remote host + + + + this + + + + + Executes the + LsRemote + command with all the options and parameters + collected by the setter methods (e.g. + SetHeads(bool) + ) of this + class. Each instance of this class should only be used for one invocation + of the command. Don't call this method twice on an instance. + + a collection of references in the remote repository + when called with an invalid remote uri + + for errors that occurs during transport + + + + + + Formatter to format timestamps relative to the current time using time units + in the format defined by + git log --relative-date + . + + + + + System.DateTime + to format + + + age of given + System.DateTime + compared to now formatted in the same + relative format as returned by + git log --relative-date + + + + + Blame command for building a + NGit.Blame.BlameResult + for a file path. + + + + + + + Set file path + + this command + + + Set diff algorithm + + this command + + + Set raw text comparator + + this command + + + Set start commit id + + this command + + + Enable (or disable) following file renames. + + Enable (or disable) following file renames. +

+ If true renames are followed using the standard FollowFilter behavior + used by RevWalk (which matches + git log --follow + in the C + implementation). This is not the same as copy/move detection as + implemented by the C implementation's of + git blame -M -C + . + + enable following. + + + this + + + +

Configure the command to compute reverse blame (history of deletes). + Configure the command to compute reverse blame (history of deletes). + + oldest commit to traverse from. The result file will be loaded + from this commit's tree. + + + most recent commit to stop traversal at. Usually an active + branch tip, tag, or HEAD. + + + + this + + the repository cannot be read. +
+ + Configure the generator to compute reverse blame (history of deletes). + Configure the generator to compute reverse blame (history of deletes). + + oldest commit to traverse from. The result file will be loaded + from this commit's tree. + + + most recent commits to stop traversal at. Usually an active + branch tip, tag, or HEAD. + + + + this + + the repository cannot be read. + + + + Generate a list of lines with information about when the lines were + introduced into the file path. + + + Generate a list of lines with information about when the lines were + introduced into the file path. + + list of lines + + + + Remove untracked files from the working tree + Git documentation about Clean + + + + + + + Executes the + clean + command with all the options and parameters + collected by the setter methods of this class. Each instance of this + class should only be used for one invocation of the command (means: one + call to + Call() + ) + + a set of strings representing each file cleaned. + NGit.Api.Errors.GitAPIException + + NGit.Errors.NoWorkTreeException + + + + If paths are set, only these paths are affected by the cleaning. + If paths are set, only these paths are affected by the cleaning. + the paths to set + + + this + + + + If dryRun is set, the paths in question will not actually be deleted. + If dryRun is set, the paths in question will not actually be deleted. + whether to do a dry run or not + + + this + + + + Generate author information for lines based on a provided file. + + Generate author information for lines based on a provided file. +

+ Applications that want a simple one-shot computation of blame for a file + should use + ComputeBlameResult() + to prepare the entire result in one + method call. This may block for significant time as the history of the + repository must be traversed until information is gathered for every line. +

+ Applications that want more incremental update behavior may use either the + raw + Next() + streaming approach supported by this class, or construct + a + BlameResult + using + BlameResult.Create(BlameGenerator) + + and + incrementally construct the result with + BlameResult.ComputeNext() + . +

+ This class is not thread-safe. +

+ An instance of BlameGenerator can only be used once. To blame multiple files + the application must create a new BlameGenerator. +

+ During blame processing there are two files involved: +

    +
  • result - The file whose lines are being examined. This is the revision + the user is trying to view blame/annotation information alongside of.
  • +
  • source - The file that was blamed with supplying one or more lines of + data into result. The source may be a different file path (due to copy or + rename). Source line numbers may differ from result line numbers due to lines + being added/removed in intermediate revisions.
  • +
+

+ The blame algorithm is implemented by initially assigning responsibility for + all lines of the result to the starting commit. A difference against the + commit's ancestor is computed, and responsibility is passed to the ancestor + commit for any lines that are common. The starting commit is blamed only for + the lines that do not appear in the ancestor, if any. The loop repeats using + the ancestor, until there are no more lines to acquire information on, or the + file's creation point is discovered in history. + + + +

Revision pool used to acquire commits from. + Revision pool used to acquire commits from. +
+ + Indicates the commit has already been processed. + Indicates the commit has already been processed. + + + Potential candidates, sorted by commit time descending. + Potential candidates, sorted by commit time descending. + + + Number of lines that still need to be discovered. + Number of lines that still need to be discovered. + + + Blame is currently assigned to this source. + Blame is currently assigned to this source. + + + + Create a blame generator for the repository and path (relative to + repository) + + repository to access revision data from. + + initial path of the file to start scanning (relative to the + repository). + + + + repository being scanned for revision history. + + + path file path being processed. + + + Difference algorithm to use when comparing revisions. + Difference algorithm to use when comparing revisions. + + + + this + + + + Text comparator to use when comparing revisions. + Text comparator to use when comparing revisions. + + + + this + + + + Enable (or disable) following file renames, on by default. + + Enable (or disable) following file renames, on by default. +

+ If true renames are followed using the standard FollowFilter behavior + used by RevWalk (which matches + git log --follow + in the C + implementation). This is not the same as copy/move detection as + implemented by the C implementation's of + git blame -M -C + . + + enable following. + + + this + + + +

+ Obtain the RenameDetector if + setFollowFileRenames(true) + . + + + the rename detector, allowing the application to configure its + settings for rename score and breaking behavior. + +
+ + Push a candidate blob onto the generator's traversal stack. + + Push a candidate blob onto the generator's traversal stack. +

+ Candidates should be pushed in history order from oldest-to-newest. + Applications should push the starting commit first, then the index + revision (if the index is interesting), and finally the working tree + copy (if the working tree is interesting). + + description of the blob revision, such as "Working Tree". + + contents of the file. + + + this + + the repository cannot be read. + + +

Push a candidate blob onto the generator's traversal stack. + + Push a candidate blob onto the generator's traversal stack. +

+ Candidates should be pushed in history order from oldest-to-newest. + Applications should push the starting commit first, then the index + revision (if the index is interesting), and finally the working tree copy + (if the working tree is interesting). + + description of the blob revision, such as "Working Tree". + + contents of the file. + + + this + + the repository cannot be read. + + +

Push a candidate object onto the generator's traversal stack. + + Push a candidate object onto the generator's traversal stack. +

+ Candidates should be pushed in history order from oldest-to-newest. + Applications should push the starting commit first, then the index + revision (if the index is interesting), and finally the working tree copy + (if the working tree is interesting). + + description of the blob revision, such as "Working Tree". + + may be a commit or a blob. + + + this + + the repository cannot be read. + + +

Configure the generator to compute reverse blame (history of deletes). + + Configure the generator to compute reverse blame (history of deletes). +

+ This method is expensive as it immediately runs a RevWalk over the + history spanning the expression + start..end + (end being more recent + than start) and then performs the equivalent operation as + Push(string, NGit.AnyObjectId) + to begin blame traversal from the + commit named by + start + walking forwards through history until + end + blaming line deletions. +

+ A reverse blame may produce multiple sources for the same result line, + each of these is a descendant commit that removed the line, typically + this occurs when the same deletion appears in multiple side branches such + as due to a cherry-pick. Applications relying on reverse should use + BlameResult + as it filters these duplicate sources and only + remembers the first (oldest) deletion. + + + oldest commit to traverse from. The result file will be loaded + from this commit's tree. + + + most recent commit to stop traversal at. Usually an active + branch tip, tag, or HEAD. + + + + this + + the repository cannot be read. + + +

Configure the generator to compute reverse blame (history of deletes). + + Configure the generator to compute reverse blame (history of deletes). +

+ This method is expensive as it immediately runs a RevWalk over the + history spanning the expression + start..end + (end being more recent + than start) and then performs the equivalent operation as + Push(string, NGit.AnyObjectId) + to begin blame traversal from the + commit named by + start + walking forwards through history until + end + blaming line deletions. +

+ A reverse blame may produce multiple sources for the same result line, + each of these is a descendant commit that removed the line, typically + this occurs when the same deletion appears in multiple side branches such + as due to a cherry-pick. Applications relying on reverse should use + BlameResult + as it filters these duplicate sources and only + remembers the first (oldest) deletion. + + + oldest commit to traverse from. The result file will be loaded + from this commit's tree. + + + most recent commits to stop traversal at. Usually an active + branch tip, tag, or HEAD. + + + + this + + the repository cannot be read. + + +

Execute the generator in a blocking fashion until all data is ready. + Execute the generator in a blocking fashion until all data is ready. + the complete result. Null if no file exists for the given path. + the repository cannot be read. +
+ + Step the blame algorithm one iteration. + Step the blame algorithm one iteration. + + true if the generator has found a region's source. The getSource + and + GetResultStart() + , + GetResultEnd() + methods + can be used to inspect the region found. False if there are no + more regions to describe. + + repository cannot be read. + + + + + + + + + + + + + + + + + + Get the revision blamed for the current region. + + Get the revision blamed for the current region. +

+ The source commit may be null if the line was blamed to an uncommitted + revision, such as the working tree copy, or during a reverse blame if the + line survives to the end revision (e.g. the branch tip). + + current revision being blamed. + + + current author being blamed. + + + current committer being blamed. + + + path of the file being blamed. + + + + rename score if a rename occurred in + GetSourceCommit() + . + + + + + first line of the source data that has been blamed for the + current region. This is line number of where the region was added + during + GetSourceCommit() + in file + GetSourcePath() + . + + + + + one past the range of the source data that has been blamed for + the current region. This is line number of where the region was + added during + GetSourceCommit() + in file + GetSourcePath() + . + + + + + first line of the result that + GetSourceCommit() + has been + blamed for providing. Line numbers use 0 based indexing. + + + + + one past the range of the result that + GetSourceCommit() + has been blamed for providing. Line numbers use 0 based indexing. + Because a source cannot be blamed for an empty region of the + result, + GetResultEnd() + is always at least one larger + than + GetResultStart() + . + + + + + number of lines in the current region being blamed to + GetSourceCommit() + . This is always the value of the + expression + getResultEnd() - getResultStart() + , but also + getSourceEnd() - getSourceStart() + . + + + + + complete contents of the source file blamed for the current + output region. This is the contents of + GetSourcePath() + within + GetSourceCommit() + . The source contents is + temporarily available as an artifact of the blame algorithm. Most + applications will want the result contents for display to users. + + + + + complete file contents of the result file blame is annotating. + This value is accessible only after being configured and only + immediately before the first call to + Next() + . Returns + null if the path does not exist. + + repository cannot be read. + + Next() + has already been invoked. + + + +

Release the current blame session. + Release the current blame session. +
+ + + + + + + + Collects line annotations for inspection by applications. + + Collects line annotations for inspection by applications. +

+ A result is usually updated incrementally as the BlameGenerator digs back + further through history. Applications that want to lay annotations down text + to the original source file in a viewer may find the BlameResult structure an + easy way to acquire the information, at the expense of keeping tables in + memory tracking every line of the result file. +

+ This class is not thread-safe. +

+ During blame processing there are two files involved: +

    +
  • result - The file whose lines are being examined. This is the revision + the user is trying to view blame/annotation information alongside of.
  • +
  • source - The file that was blamed with supplying one or more lines of + data into result. The source may be a different file path (due to copy or + rename). Source line numbers may differ from result line numbers due to lines + being added/removed in intermediate revisions.
  • +
+
+
+ + Construct a new BlameResult for a generator. + Construct a new BlameResult for a generator. + the generator the result will consume records from. + + the new result object. null if the generator cannot find the path + it starts from. + + the repository cannot be read. + + + Warning: these are actually 1-based. + Warning: these are actually 1-based. + + + path of the file this result annotates. + + + contents of the result file, available for display. + + + + Throw away the + GetResultContents() + . + + + + Check if the given result line has been annotated yet. + Check if the given result line has been annotated yet. + line to read data of, 0 based. + true if the data has been annotated, false otherwise. + + + Check if the given result line has been annotated yet. + Check if the given result line has been annotated yet. + first index to examine. + last index to examine. + true if the data has been annotated, false otherwise. + + + Get the commit that provided the specified line of the result. + + Get the commit that provided the specified line of the result. +

+ The source commit may be null if the line was blamed to an uncommitted + revision, such as the working tree copy, or during a reverse blame if the + line survives to the end revision (e.g. the branch tip). + + line to read data of, 0 based. + + commit that provided line + idx + . May be null. + + + +

Get the author that provided the specified line of the result. + Get the author that provided the specified line of the result. + line to read data of, 0 based. + + author that provided line + idx + . May be null. + +
+ + Get the committer that provided the specified line of the result. + Get the committer that provided the specified line of the result. + line to read data of, 0 based. + + committer that provided line + idx + . May be null. + + + + Get the file path that provided the specified line of the result. + Get the file path that provided the specified line of the result. + line to read data of, 0 based. + + source file path that provided line + idx + . + + + + Get the corresponding line number in the source file. + Get the corresponding line number in the source file. + line to read data of, 0 based. + matching line number in the source file. + + + Compute all pending information. + Compute all pending information. + the repository cannot be read. + + + Compute the next available segment and return the first index. + + Compute the next available segment and return the first index. +

+ Computes one segment and returns to the caller the first index that is + available. After return the caller can also inspect + LastLength() + to determine how many lines of the result were computed. + + index that is now available. -1 if no more are available. + the repository cannot be read. + + + + length of the last segment found by + ComputeNext() + . + + + +

Compute until the entire range has been populated. + Compute until the entire range has been populated. + first index to examine. + last index to examine. + the repository cannot be read. +
+ + A source that may have supplied some (or all) of the result file. + + A source that may have supplied some (or all) of the result file. +

+ Candidates are kept in a queue by BlameGenerator, allowing the generator to + perform a parallel search down the parents of any merges that are discovered + during the history traversal. Each candidate retains a + regionList + describing sections of the result file the candidate has taken responsibility + for either directly or indirectly through its history. Actual blame from this + region list will be assigned to the candidate when its ancestor commit(s) are + themselves converted into Candidate objects and the ancestor's candidate uses + TakeBlame(NGit.Diff.EditList, Candidate) + + to accept responsibility for sections + of the result. + + + +

Next candidate in the candidate queue. + Next candidate in the candidate queue. +
+ + Commit being considered (or blamed, depending on state). + Commit being considered (or blamed, depending on state). + + + + Path of the candidate file in + sourceCommit + . + + + + + Unique name of the candidate blob in + sourceCommit + . + + + + + Complete contents of the file in + sourceCommit + . + + + + Chain of regions this candidate may be blamed for. + + Chain of regions this candidate may be blamed for. +

+ This list is always kept sorted by resultStart order, making it simple to + merge-join with the sorted EditList during blame assignment. + + + +

Score assigned to the rename to this candidate. + + Score assigned to the rename to this candidate. +

+ Consider the history "A<-B<-C". If the result file S in C was renamed to + R in B, the rename score for this rename will be held in this field by + the candidate object for B. By storing the score with B, the application + can see what the rename score was as it makes the transition from C/S to + B/R. This may seem backwards since it was C that performed the rename, + but the application doesn't learn about path R until B. + + + + + + +

Special candidate type used for reverse blame. + + Special candidate type used for reverse blame. +

+ Reverse blame inverts the commit history graph to follow from a commit to + its descendant children, rather than the normal history direction of + child to parent. These types require a + ReverseCommit + which keeps + children pointers, allowing reverse navigation of history. + + + +

Candidate loaded from a file source, and not a commit. + + Candidate loaded from a file source, and not a commit. +

+ The + Candidate.sourceCommit + field is always null on this type of + candidate. Instead history traversal follows the single + parent + field to discover the next Candidate. Often this is a normal Candidate + type that has a valid sourceCommit. + + + +

Next candidate to pass blame onto. + + Next candidate to pass blame onto. +

+ When computing the differences that this candidate introduced to the + file content, the parent's sourceText is used as the base. + + + +

Author name to refer to this blob with. + Author name to refer to this blob with. +
+ + Region of the result that still needs to be computed. + + Region of the result that still needs to be computed. +

+ Regions are held in a singly-linked-list by + Candidate + using the + Candidate.regionList + field. The list is kept in sorted order by + resultStart + . + + + +

Next entry in the region linked list. + Next entry in the region linked list. +
+ + First position of this region in the result file blame is computing. + First position of this region in the result file blame is computing. + + + + First position in the + Candidate + that owns this Region. + + + + Length of the region, always >= 1. + Length of the region, always >= 1. + + + Copy the entire result region, but at a new source position. + Copy the entire result region, but at a new source position. + the new source position. + the same result region, but offset for a new source. + + + Split the region, assigning a new source position to the first half. + Split the region, assigning a new source position to the first half. + the new source position. + length of the new region. + the first half of the region, at the new source. + + + + Edit this region to remove the first + d + elements. + + number of elements to remove from the start of this region. + + + + + + + + A DiffFormatter used to calculate the patch-id of the diff. + A DiffFormatter used to calculate the patch-id of the diff. + + + Initialize a formatter to compute a patch id. + Initialize a formatter to compute a patch id. + + + Should be called after having called one of the format methods + the patch id calculated for the provided diff. + + + + + + + + + An OutputStream which ignores everything written to it. + An OutputStream which ignores everything written to it. + + + The canonical instance. + The canonical instance. + + + Used to delete one or several tags. + + Used to delete one or several tags. + The result of + Call() + is a list with the (full) names of the deleted + tags. + + Git documentation about Tag + + + + + + the list with the full names of the deleted tags + + + + + the names of the tags to delete; if not set, this will do + nothing; invalid tag names will simply be ignored + + this instance + + + Show changes between commits, commit and working tree, etc. + Show changes between commits, commit and working tree, etc. + Git documentation about diff + + + + + + + Executes the + Diff + command with all the options and parameters + collected by the setter methods (e.g. + SetCached(bool) + of this + class. Each instance of this class should only be used for one invocation + of the command. Don't call this method twice on an instance. + + a DiffEntry for each path which is different + + + + whether to view the changes you staged for the next commit + this instance + + + parameter, used to limit the diff to the named path + this instance + + + the previous state + this instance + + + the updated state + this instance + + + whether to return only names and status of changed files + + this instance + + + the stream to write line data + this instance + + + Set number of context lines instead of the usual three. + Set number of context lines instead of the usual three. + the number of context lines + this instance + + + Set the given source prefix instead of "a/". + Set the given source prefix instead of "a/". + the prefix + this instance + + + Set the given destination prefix instead of "b/". + Set the given destination prefix instead of "b/". + the prefix + this instance + + + The progress monitor associated with the diff operation. + + The progress monitor associated with the diff operation. By default, this + is set to NullProgressMonitor + + NGit.NullProgressMonitor + a progress monitor + this instance + + + Used to obtain a list of tags. + Used to obtain a list of tags. + Git documentation about Tag + + + + + + the tags available + + + + The reflog command + Git documentation about reflog + + + + + + The ref used for the reflog operation. + + The ref used for the reflog operation. If no ref is set, the default + value of HEAD will be used. + + + + + this + + + + Run the reflog command + NGit.Api.Errors.GitAPIException + + NGit.Api.Errors.InvalidRefNameException + + + + Command class to list the stashed commits in a repository. + Command class to list the stashed commits in a repository. + Git documentation about Stash + + + Create a new stash list command + + + + + + + + A class used to execute a submodule add command. + + A class used to execute a submodule add command. + This will clone the configured submodule, register the submodule in the + .gitmodules file and the repository config file, and also add the submodule + and .gitmodules file to the index. + + Git documentation about submodules + + + + + + Set repository-relative path of submodule + + this command + + + Set URI to clone submodule from + + this command + + + The progress monitor associated with the clone operation. + + The progress monitor associated with the clone operation. By default, + this is set to NullProgressMonitor + + NGit.NullProgressMonitor + + this command + + + Is the configured already a submodule in the index? + true if submodule exists in index, false otherwise + System.IO.IOException + + + + + + A class used to execute a submodule init command. + + A class used to execute a submodule init command. + This will copy the 'url' and 'update' fields from the working tree + .gitmodules file to a repository's config file for each submodule not + currently present in the repository's config file. + + Git documentation about submodules + + + + + + Add repository-relative submodule path to initialize + + this command + + + + + + A class used to execute a submodule status command. + A class used to execute a submodule status command. + Git documentation about submodules + + + + + + Add repository-relative submodule path to limit status reporting to + + this command + + + + + + + + + + A class used to execute a submodule sync command. + + A class used to execute a submodule sync command. + This will set the remote URL in a submodule's repository to the current value + in the .gitmodules file. + + Git documentation about submodules + + + + + + Add repository-relative submodule path to synchronize + + this command + + + Get branch that HEAD currently points to + + shortened branch name, null on failures + System.IO.IOException + + + + + + A class used to execute a submodule update command. + A class used to execute a submodule update command. + Git documentation about submodules + + + + + + The progress monitor associated with the clone operation. + + The progress monitor associated with the clone operation. By default, + this is set to NullProgressMonitor + + NGit.NullProgressMonitor + + this command + + + Add repository-relative submodule path to initialize + + this command + + + Execute the SubmoduleUpdateCommand command. + Execute the SubmoduleUpdateCommand command. + a collection of updated submodule paths + NGit.Api.Errors.ConcurrentRefUpdateException + + NGit.Api.Errors.CheckoutConflictException + + NGit.Api.Errors.InvalidMergeHeadsException + + NGit.Api.Errors.InvalidConfigurationException + + NGit.Api.Errors.NoHeadException + + NGit.Api.Errors.NoMessageException + + NGit.Api.Errors.RefNotFoundException + + NGit.Api.Errors.WrongRepositoryStateException + + NGit.Api.Errors.GitAPIException + + + + + Receives a callback allowing type-specific configuration to be set + on the Transport instance after it's been created. + + + Receives a callback allowing type-specific configuration to be set + on the Transport instance after it's been created. +

+ This allows consumers of the JGit command API to perform custom + configuration that would be difficult anticipate and expose on the + API command builders. +

+ For instance, if a client needs to replace the SshSessionFactorys + on any SSHTransport used (eg to control available SSH identities), + they can set the TransportConfigCallback on the JGit API command - + once the transport has been created by the command, the callback + will be invoked and passed the transport instance, which the + client can then inspect and configure as necessary. + + + +

Add any additional transport-specific configuration required. + Add any additional transport-specific configuration required. + +
+ + Parsed information about a checkout. + Parsed information about a checkout. + + + the name of the branch before checkout + + + the name of the branch after checkout + + + Parsed reflog entry + + + the commit id before the change + + + the commit id after the change + + + user performing the change + + + textual description of the change + + + + a + CheckoutEntry + with parsed information about a branch + switch, or null if the entry is not a checkout + + + + Status class containing the type, path, and commit id of the submodule. + Status class containing the type, path, and commit id of the submodule. + + + Create submodule status + + + + + + Create submodule status + + + + + + + type + + + path + + + index object id + + + HEAD object id + + + Enumeration of different statuses that a submodule can be in + + + Walker that visits all submodule entries found in a tree + + + + Create a generator to walk over the submodule entries currently in the + index + The + .gitmodules + file is read from the index. + + + generator over submodule index entries + System.IO.IOException + + + + Create a generator and advance it to the submodule entry at the given + path + + + + the root of a tree containing both a submodule at the given path + and .gitmodules at the root. + + + generator at given path, null if no submodule at given path + System.IO.IOException + + + + Create a generator and advance it to the submodule entry at the given + path + + + + the root of a tree containing both a submodule at the given path + and .gitmodules at the root. + + + generator at given path, null if no submodule at given path + System.IO.IOException + + + Get submodule directory + + + directory + + + Get submodule repository + + + repository or null if repository doesn't exist + System.IO.IOException + + + Get submodule repository at path + + + repository or null if repository doesn't exist + System.IO.IOException + + + Resolve submodule repository URL. + + Resolve submodule repository URL. +

+ This handles relative URLs that are typically specified in the + '.gitmodules' file by resolving them against the remote URL of the parent + repository. +

+ Relative URLs will be resolved against the parent repository's working + directory if the parent repository has no configured remote URL. + + parent repository + absolute or relative URL of the submodule repository + resolved URL + System.IO.IOException + + +

Create submodule generator + + System.IO.IOException +
+ + Set the config used by this walk. + + Set the config used by this walk. + This method need only be called if constructing a walk manually instead of + with one of the static factory methods above. + + .gitmodules config object + this generator + + + + Set the tree used by this walk for finding + .gitmodules + . +

+ The root tree is not read until the first submodule is encountered by the + walk. +

+ This method need only be called if constructing a walk manually instead of + with one of the static factory methods above. +

+ tree containing .gitmodules + this generator +
+ + + Set the tree used by this walk for finding + .gitmodules + . +

+ The root tree is not read until the first submodule is encountered by the + walk. +

+ This method need only be called if constructing a walk manually instead of + with one of the static factory methods above. +

+ ID of a tree containing .gitmodules + this generator + System.IO.IOException +
+ + + Load the config for this walk from + .gitmodules + . +

+ Uses the root tree if + SetRootTree(NGit.Treewalk.AbstractTreeIterator) + + was + previously called, otherwise uses the working tree. +

+ If no submodule config is found, loads an empty config. +

+ this generator + if an error occurred, or if the repository is bare + + NGit.Errors.ConfigInvalidException + +
+ + + + + + Set tree filter + + this generator + + + Set the tree iterator used for finding submodule entries + + this generator + NGit.Errors.CorruptObjectException + + + + Set the tree used for finding submodule entries + + this generator + System.IO.IOException + NGit.Errors.IncorrectObjectTypeException + + NGit.Errors.MissingObjectException + + + + Reset generator and start new submodule walk + this generator + + + Get directory that will be the root of the submodule's local repository + submodule repository directory + + + Advance to next submodule in the index tree. + + Advance to next submodule in the index tree. + The object id and path of the next entry can be obtained by calling + GetObjectId() + and + GetPath() + . + + true if entry found, false otherwise + System.IO.IOException + + + Get path of current submodule entry + path + + + Get object id of current submodule entry + object id + + + Get the configured path for current entry. + + Get the configured path for current entry. This will be the value from + the .gitmodules file in the current repository's working tree. + + configured path + NGit.Errors.ConfigInvalidException + + System.IO.IOException + + + Get the configured remote URL for current entry. + + Get the configured remote URL for current entry. This will be the value + from the repository's config. + + configured URL + NGit.Errors.ConfigInvalidException + + System.IO.IOException + + + Get the configured remote URL for current entry. + + Get the configured remote URL for current entry. This will be the value + from the .gitmodules file in the current repository's working tree. + + configured URL + NGit.Errors.ConfigInvalidException + + System.IO.IOException + + + Get the configured update field for current entry. + + Get the configured update field for current entry. This will be the value + from the repository's config. + + update value + NGit.Errors.ConfigInvalidException + + System.IO.IOException + + + Get the configured update field for current entry. + + Get the configured update field for current entry. This will be the value + from the .gitmodules file in the current repository's working tree. + + update value + NGit.Errors.ConfigInvalidException + + System.IO.IOException + + + Get repository for current submodule entry + repository or null if non-existent + System.IO.IOException + + + Get commit id that HEAD points to in the current submodule's repository + object id of HEAD reference + System.IO.IOException + + + Get ref that HEAD points to in the current submodule's repository + ref name, null on failures + System.IO.IOException + + + Get the resolved remote URL for the current submodule. + + Get the resolved remote URL for the current submodule. +

+ This method resolves the value of + GetModulesUrl() + to an absolute + URL + + resolved remote URL + System.IO.IOException + NGit.Errors.ConfigInvalidException + + + +

Release any resources used by this walker's reader. + Release any resources used by this walker's reader. +
+ + Only produce commits which are below a specified depth. + Only produce commits which are below a specified depth. + DepthWalk + + + + Commits which used to be shallow in the client, but which are + being extended as part of this fetch. + + + Commits which used to be shallow in the client, but which are + being extended as part of this fetch. These commits should be + returned to the caller as UNINTERESTING so that their blobs/trees + can be marked appropriately in the pack writer. + + + + + Commits which the normal framework has marked as UNINTERESTING, + but which we now care about again. + + + Commits which the normal framework has marked as UNINTERESTING, + but which we now care about again. This happens if a client is + extending a shallow checkout to become deeper--the new commits at + the bottom of the graph need to be sent, even though they are + below other commits which the client already has. + + + + + Parent generator + NGit.Errors.MissingObjectException + + NGit.Errors.IncorrectObjectTypeException + + System.IO.IOException + + + + + + + + Interface for revision walkers that perform depth filtering. + Interface for revision walkers that perform depth filtering. + + + Depth to filter to. + + + flag marking commits that should become unshallow. + + + flag marking commits that are interesting again. + + + RevCommit with a depth (in commits) from a root. + RevCommit with a depth (in commits) from a root. + + + Depth of this commit in the graph, via shortest path. + Depth of this commit in the graph, via shortest path. + + + depth of this commit, as found by the shortest path. + + + Initialize a new commit. + Initialize a new commit. + object name for the commit. + + + Subclass of RevWalk that performs depth filtering. + Subclass of RevWalk that performs depth filtering. + + + Repository to walk + Maximum depth to return + + + ObjectReader to use + Maximum depth to return + + + Mark a root commit (i.e., one whose depth should be considered 0.) + Commit to mark + System.IO.IOException + NGit.Errors.IncorrectObjectTypeException + + NGit.Errors.MissingObjectException + + + + Subclass of ObjectWalk that performs depth filtering. + Subclass of ObjectWalk that performs depth filtering. + + + Repository to walk + Maximum depth to return + + + Object Reader + Maximum depth to return + + + Mark a root commit (i.e., one whose depth should be considered 0.) + Commit to mark + System.IO.IOException + NGit.Errors.IncorrectObjectTypeException + + NGit.Errors.MissingObjectException + + + + + Mark an element which used to be shallow in the client, but which + should now be considered a full commit. + + + Mark an element which used to be shallow in the client, but which + should now be considered a full commit. Any ancestors of this commit + should be included in the walk, even if they are the ancestor of an + uninteresting commit. + + Commit to mark + NGit.Errors.MissingObjectException + + NGit.Errors.IncorrectObjectTypeException + + System.IO.IOException + + + + An instance of this class can be used in conjunction with a + FollowFilter + . Whenever a rename has been detected during a revision + walk, it will be reported here. + + FollowFilter.SetRenameCallback(RenameCallback) + + + + + Called whenever a diff was found that is actually a rename or copy of a + file. + + + Called whenever a diff was found that is actually a rename or copy of a + file. + + the entry representing the rename/copy + + + + Utility methods for + RevWalk + . + + + + + Count the number of commits that are reachable from start + until a commit that is reachable from end is encountered. + + + Count the number of commits that are reachable from start + until a commit that is reachable from end is encountered. In + other words, count the number of commits that are in start, + but not in end. +

+ Note that this method calls + RevWalk.Reset() + at the beginning. + Also note that the existing rev filter on the walk is left as-is, so be + sure to set the right rev filter before calling this method. + + the rev walk to use + the commit to start counting from + + the commit where counting should end, or null if counting + should be done until there are no more commits + + the number of commits + NGit.Errors.MissingObjectException + + NGit.Errors.IncorrectObjectTypeException + + System.IO.IOException + + +

+ Find commits that are reachable from start until a commit + that is reachable from end is encountered. + + + Find commits that are reachable from start until a commit + that is reachable from end is encountered. In other words, + Find of commits that are in start, but not in + end. +

+ Note that this method calls + RevWalk.Reset() + at the beginning. + Also note that the existing rev filter on the walk is left as-is, so be + sure to set the right rev filter before calling this method. + + the rev walk to use + the commit to start counting from + + the commit where counting should end, or null if counting + should be done until there are no more commits + + the commits found + NGit.Errors.MissingObjectException + + NGit.Errors.IncorrectObjectTypeException + + System.IO.IOException + + +

+ Find the list of branches a given commit is reachable from when following + parent.s +

+ Note that this method calls + RevWalk.Reset() + at the beginning. +

+ In order to improve performance this method assumes clock skew among + committers is never larger than 24 hours. +

+ the commit we are looking at + The RevWalk to be used. + the set of branches we want to see reachability from + the list of branches a given commit is reachable from + NGit.Errors.MissingObjectException + + NGit.Errors.IncorrectObjectTypeException + + System.IO.IOException +
+ + An OutputStream that expands LF to CRLF. + + An OutputStream that expands LF to CRLF. +

+ Existing CRLF are not expanded to CRCRLF, but retained as is. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Counts the number of bytes written. + Counts the number of bytes written. +
+ + Initialize a new counting stream. + Initialize a new counting stream. + stream to output all writes to. + + + current number of bytes written. + + + + + + + + + + + + + + + + A BufferedOutputStream that throws an error if the final flush fails on + close. + + + A BufferedOutputStream that throws an error if the final flush fails on + close. +

+ Java's BufferedOutputStream swallows errors that occur when the output stream + tries to write the final bytes to the output during close. This may result in + corrupted files without notice. + + + + Sharpen.BufferedOutputStream.BufferedOutputStream(Sharpen.OutputStream) + underlying output stream + + + Sharpen.BufferedOutputStream.BufferedOutputStream(Sharpen.OutputStream, int) + underlying output stream + buffer size + + + + + +

Limits the number of commits output. + Limits the number of commits output. +
+ + Create a new max count filter. + Create a new max count filter. + the limit + a new filter + + + + + + + + + Filter that includes commits after a configured number are skipped. + Filter that includes commits after a configured number are skipped. + + + Create a new skip filter. + Create a new skip filter. + the number of commits to skip + a new filter + + + + + + + + + An exception occurring when a file cannot be locked + + + Construct a CannotLockException for the given file and message + file that could not be locked + exception message + + + Construct a CannotLockException for the given file + file that could not be locked + + + Get the file that could not be locked + file + + + JGit encountered a case that it knows it cannot yet handle. + JGit encountered a case that it knows it cannot yet handle. + + + + Construct a NotSupportedException for some issue JGit cannot + yet handle. + + + Construct a NotSupportedException for some issue JGit cannot + yet handle. + + message describing the issue + + + Construct a NotSupportedException for some issue JGit cannot yet handle. + + Construct a NotSupportedException for some issue JGit cannot yet handle. + + message describing the issue + a lower level implementation specific issue. + + + Thrown when PackParser finds an object larger than a predefined limit + + + + Construct a too large object in pack exception when the exact size of the + too large object is not available. + + + Construct a too large object in pack exception when the exact size of the + too large object is not available. This will be used when we find out + that a delta sequence is already larger than the maxObjectSizeLimit but + don't want to inflate the delta just to find out the exact size of the + resulting object. + + the maximum object size limit + + + + Construct a too large object in pack exception when the exact size of the + too large object is known. + + + Construct a too large object in pack exception when the exact size of the + too large object is known. + + + + + + + PostReceiveHook + that delegates to a list of other hooks. +

+ Hooks are run in the order passed to the constructor. +

+
+ + Create a new hook chaining the given hooks together. + Create a new hook chaining the given hooks together. + hooks to execute, in order. + a new hook chain of the given hooks. + + + + PreReceiveHook + that delegates to a list of other hooks. +

+ Hooks are run in the order passed to the constructor. +

+
+ + Create a new hook chaining the given hooks together. + Create a new hook chaining the given hooks together. + hooks to execute, in order. + a new hook chain of the given hooks. + + + + PreUploadHook + that delegates to a list of other hooks. +

+ Hooks are run in the order passed to the constructor. If running a method on + one hook throws an exception, execution of remaining hook methods is aborted. +

+
+ + Create a new hook chaining the given hooks together. + Create a new hook chaining the given hooks together. + hooks to execute, in order. + a new hook chain of the given hooks. + + + + + + + + + + + + UploadPack has already reported an error to the client. + UploadPack has already reported an error to the client. + + + Initialize a new exception. + Initialize a new exception. + root cause. + + + + UploadPackLogger + that delegates to a list of other loggers. +

+ loggers are run in the order passed to the constructor. +

+
+ + Create a new logger chaining the given loggers together. + Create a new logger chaining the given loggers together. + loggers to execute, in order. + a new logger chain of the given loggers. + + + + + + + + + + + + + + + + + + Branch section of a Git configuration file. + Branch section of a Git configuration file. + + + + Create a new branch config, which will read configuration from config + about specified branch. + + + Create a new branch config, which will read configuration from config + about specified branch. + + the config to read from + the short branch name of the section to read + + + + the full tracking branch name or null if it could + not be determined + + + + + the full remote-tracking branch name or + null + if it could + not be determined. If you also want local tracked branches use + GetTrackingBranch() + instead. + + + + Finds the tracked remote tracking branch + Remote name + + merge Ref of the local branch tracking the remote tracking + branch + + full remote tracking branch name or null + + + Status of a branch's relation to its remote-tracking branch. + Status of a branch's relation to its remote-tracking branch. + + + + Compute the tracking status for the branchName in + repository. + + + Compute the tracking status for the branchName in + repository. + + the git repository to compute the status from + the local branch + the tracking status, or null if it is not known + System.IO.IOException + + + full remote-tracking branch name + + + + number of commits that the local branch is ahead of the + remote-tracking branch + + + + + number of commits that the local branch is behind of the + remote-tracking branch + + + + + Implementation of + AdvertiseRefsHook + that advertises the same refs for + upload-pack and receive-pack. + + 2.0 + + + Hook to allow callers to take over advertising refs to the client. + Hook to allow callers to take over advertising refs to the client. + 2.0 + + + A simple hook that advertises the default refs. + + A simple hook that advertises the default refs. +

+ The method implementations do nothing to preserve the default behavior; see + UploadPack.SetAdvertisedRefs(System.Collections.Generic.IDictionary<K, V>) + + and + BaseReceivePack.SetAdvertisedRefs(System.Collections.Generic.IDictionary<K, V>, System.Collections.Generic.ICollection<E>) + + . + + + +

Advertise refs for upload-pack. + Advertise refs for upload-pack. + + instance on which to call + UploadPack.SetAdvertisedRefs(System.Collections.Generic.IDictionary<K, V>) + + if necessary. + + abort; the message will be sent to the user. + + +
+ + Advertise refs for receive-pack. + Advertise refs for receive-pack. + + instance on which to call + BaseReceivePack.SetAdvertisedRefs(System.Collections.Generic.IDictionary<K, V>, System.Collections.Generic.ICollection<E>) + + if necessary. + + abort; the message will be sent to the user. + + + + + + + + + + + Get the refs to advertise. + Get the refs to advertise. + repository instance. + open rev walk on the repository. + set of refs to advertise. + abort; the message will be sent to the user. + + + + + Get the additional haves to advertise. + Get the additional haves to advertise. + repository instance. + open rev walk on the repository. + + set of additional haves; see + BaseReceivePack.GetAdvertisedObjects() + + . + + abort; the message will be sent to the user. + + + + + + AdvertiseRefsHook + that delegates to a list of other hooks. +

+ Hooks are run in the order passed to the constructor. A hook may inspect or + modify the results of the previous hooks in the chain by calling + UploadPack.GetAdvertisedRefs() + , or + BaseReceivePack.GetAdvertisedRefs() + + or + BaseReceivePack.GetAdvertisedObjects() + + . +

+
+ + Create a new hook chaining the given hooks together. + Create a new hook chaining the given hooks together. + hooks to execute, in order. + a new hook chain of the given hooks. + + + + + + + + + Apply a patch to files and/or to the index. + Apply a patch to files and/or to the index. + Git documentation about apply + 2.0 + + + Constructs the command if the patch is to be applied to the index. + Constructs the command if the patch is to be applied to the index. + + + + the patch to apply + this instance + + + + Executes the + ApplyCommand + command with all the options and + parameters collected by the setter methods (e.g. + SetPatch(Sharpen.InputStream) + of this class. Each instance of this class + should only be used for one invocation of the command. Don't call this + method twice on an instance. + + + an + ApplyResult + object representing the command result + + NGit.Api.Errors.GitAPIException + + NGit.Api.Errors.PatchFormatException + + NGit.Api.Errors.PatchApplyException + + + + + + + + + System.IO.IOException + NGit.Api.Errors.PatchApplyException + + + + + Encapsulates the result of a + ApplyCommand + + 2.0 + + + an updated file + this instance + + + updated files + + + Command class to apply a stashed commit. + Command class to apply a stashed commit. + Git documentation about Stash + 2.0 + + + Create command to apply the changes of a stashed commit + + + + + Set the stash reference to apply +

+ This will default to apply the latest stashed commit (stash@{0}) if + unspecified +

+ + + + this + +
+ + Would unstashing overwrite local changes? + + + + + + true if unstash conflict, false otherwise + + + + + + + + + + + + + + + Apply the changes in a stashed commit to the working directory and index + + id of stashed commit that was applied + NGit.Api.Errors.GitAPIException + + NGit.Api.Errors.WrongRepositoryStateException + + + + + Stash diff filter that looks for differences in the first three trees + which must be the stash head tree, stash index tree, and stash working + directory tree in any order. + + + Stash diff filter that looks for differences in the first three trees + which must be the stash head tree, stash index tree, and stash working + directory tree in any order. + + + + + Command class to stash changes in the working directory and index in a + commit. + + + Command class to stash changes in the working directory and index in a + commit. + + Git documentation about Stash + 2.0 + + + Create a command to stash changes in the working directory and index + + + + + Set the message used when committing index changes +

+ The message will be formatted with the current branch, abbreviated commit + id, and short commit message when used. +

+ + Set the message used when committing index changes +

+ The message will be formatted with the current branch, abbreviated commit + id, and short commit message when used. + + + + + this + + + +

+ Set the message used when committing working directory changes +

+ The message will be formatted with the current branch, abbreviated commit + id, and short commit message when used. +

+ + Set the message used when committing working directory changes +

+ The message will be formatted with the current branch, abbreviated commit + id, and short commit message when used. + + + + + this + + + +

Set the person to use as the author and committer in the commits made + + + + this + +
+ + + Set the reference to update with the stashed commit id +

+ This value defaults to + NGit.Constants.R_STASH +

+ + + + this + +
+ + + + + + + + + + + + Stash the contents on the working directory and index in separate commits + and reset to the current HEAD commit. + + + Stash the contents on the working directory and index in separate commits + and reset to the current HEAD commit. + + stashed commit or null if no changes to stash + NGit.Api.Errors.GitAPIException + + + + + A utility for formatting dates according to the Git log.date formats plus + extensions. + + + A utility for formatting dates according to the Git log.date formats plus + extensions. +

+ The enum + Format + defines the available types. + + + +

Create a new Git oriented date formatter + +
+ + + Format committer, author or tagger ident according to this formatter's + specification. + + + Format committer, author or tagger ident according to this formatter's + specification. + + + formatted version of date, time and time zone + + + Git and JGit formats + + + Exception thrown when applying a patch fails + 2.0 + + + + + + + + + + Exception thrown when applying a patch fails due to an invalid format + 2.0 + + + + + + all the errors where unresolved conflicts have been detected + + + Indicates that a client request has not yet been read from the wire. + Indicates that a client request has not yet been read from the wire. + 2.0 + + + Initialize with no message. + Initialize with no message. + + + + a message explaining the state. This message should not + be shown to an end-user. + + + + Translation bundle for JGit core + + + an instance of this translation bundle + + + + A line in a Git + Config + file. + + + + The text content before entry. + The text content before entry. + + + The section name for the entry. + The section name for the entry. + + + Subsection name. + Subsection name. + + + The key name. + The key name. + + + The value. + The value. + + + The text content after entry. + The text content after entry. + + + Command class to delete a stashed commit reference + Git documentation about Stash + 2.0 + + + + + + Set the stash reference to drop (0-based). + + Set the stash reference to drop (0-based). +

+ This will default to drop the latest stashed commit (stash@{0}) if + unspecified + + + + + this + + + +

Set wheter drop all stashed commits + + true to drop all stashed commits, false to drop only the + stashed commit set via calling + SetStashRef(int) + + + + this + +
+ + + + + + + + + Drop the configured entry from the stash reflog and return value of the + stash reference after the drop occurs + + commit id of stash reference or null if no more stashed changes + NGit.Api.Errors.GitAPIException + + + + Utility for writing reflog entries + 2.0 + + + Get the ref name to be used for when locking a ref's log for rewriting + + name of the ref, relative to the Git repository top level + directory (so typically starts with refs/). + + the name of the ref's lock ref + + + Create write for repository + + + + Create write for repository + + + true to write to disk all entries logged, false to respect the + repository's config and current log file status + + + + Get repository that reflog is being written for + file repository + + + Create the log directories + System.IO.IOException + this writer + + + Locate the log file on disk for a single reference name. + Locate the log file on disk for a single reference name. + + name of the ref, relative to the Git repository top level + directory (so typically starts with refs/). + + the log file location. + + + + Write the given + ReflogEntry + entry to the ref's log + + + + this writer + System.IO.IOException + + + Write the given entry information to the ref's log + + + + + + this writer + System.IO.IOException + + + Write the given ref update to the ref's log + + + + this writer + System.IO.IOException + + + + + + Thrown when JGit detects and refuses to use an invalid path + 2.0 + + + + + + Batch of reference updates to be applied to a repository. + + Batch of reference updates to be applied to a repository. +

+ The batch update is primarily useful in the transport code, where a client or + server is making changes to more than one reference at a time. + + + +

Commands to apply during this batch. + Commands to apply during this batch. +
+ + Does the caller permit a forced update on a reference? + + + Identity to record action as within the reflog. + Identity to record action as within the reflog. + + + Message the caller wants included in the reflog. + Message the caller wants included in the reflog. + + + + Should the result value be appended to + refLogMessage + . + + + + Initialize a new batch update. + Initialize a new batch update. + the reference database of the repository to be updated. + + + + true if the batch update will permit a non-fast-forward update to + an existing reference. + + + + Set if this update wants to permit a forced update. + Set if this update wants to permit a forced update. + true if this update batch should ignore merge tests. + + + this + . + + + + identity of the user making the change in the reflog. + + + Set the identity of the user appearing in the reflog. + + Set the identity of the user appearing in the reflog. +

+ The timestamp portion of the identity is ignored. A new identity with the + current timestamp will be created automatically when the update occurs + and the log record is written. + + + identity of the user. If null the identity will be + automatically determined based on the repository + configuration. + + + + this + . + + + +

Get the message to include in the reflog. + Get the message to include in the reflog. + + message the caller wants to include in the reflog; null if the + update should not be logged. + +
+ + + + true + if the ref log message should show the result. + + + + Set the message to include in the reflog. + Set the message to include in the reflog. + + the message to describe this change. It may be null if + appendStatus is null in order not to append to the reflog + + + true if the status of the ref change (fast-forward or + forced-update) should be appended to the user supplied + message. + + + + this + . + + + + Don't record this update in the ref's associated reflog. + Don't record this update in the ref's associated reflog. + + + this + . + + + + + true if log has been disabled by + DisableRefLog() + . + + + + commands this update will process. + + + Add a single command to this batch update. + Add a single command to this batch update. + the command to add, must not be null. + + + this + . + + + + Add commands to this batch update. + Add commands to this batch update. + the commands to add, must not be null. + + + this + . + + + + Add commands to this batch update. + Add commands to this batch update. + the commands to add, must not be null. + + + this + . + + + + Execute this batch update. + + Execute this batch update. +

+ The default implementation of this method performs a sequential reference + update over each reference. + + + a RevWalk to parse tags in case the storage system wants to + store them pre-peeled, a common performance optimization. + + progress monitor to receive update status on. + + the database is unable to accept the update. Individual + command status must be tested to determine if there is a + partial failure, or a total failure. + + + +

Create a new RefUpdate copying the batch settings. + Create a new RefUpdate copying the batch settings. + specific command the update should be created to copy. + a single reference update command. + + the reference database cannot make a new update object for + the given reference. + +
+ + Exception thrown when transport operation failed + + + message describing the transport failure. + + + message describing the transport exception. + why the transport failed. + + + Formatter for constructing the commit message for a squashed commit. + + Formatter for constructing the commit message for a squashed commit. +

+ The format should be the same as C Git does it, for compatibility. + + + +

Create a new squash message formatter. + Create a new squash message formatter. +
+ + Construct the squashed commit message. + Construct the squashed commit message. + the squashed commits + the target branch + squashed commit message + + + + A garbage collector for git + FileRepository + . Instances of this class + are not thread-safe. Don't use the same instance from multiple threads. + This class started as a copy of DfsGarbageCollector from Shawn O. Pearce + adapted to FileRepositories. + + + + + the refs which existed during the last call to + Repack() + . This is + needed during + Prune(System.Collections.Generic.ICollection<E>) + + where we can optimize by looking at the + difference between the current refs and the refs which existed during + last + Repack() + . + + + + Holds the starting time of the last repack() execution. + + Holds the starting time of the last repack() execution. This is needed in + prune() to inspect only those reflog entries which have been added since + last repack(). + + + + Creates a new garbage collector with default values. + + Creates a new garbage collector with default values. An expirationTime of + two weeks and null as progress monitor will be used. + + the repo to work on + + + + Runs a garbage collector on a + FileRepository + . It will +
    +
  • pack loose references into packed-refs
  • +
  • repack all reachable objects into new pack files and delete the old + pack files
  • +
  • prune all loose objects which are now reachable by packs
  • +
+
+ + the collection of + PackFile + 's which are newly created + + System.IO.IOException + + If the configuration parameter "gc.pruneexpire" couldn't be + parsed + +
+ + Delete old pack files. + + Delete old pack files. What is 'old' is defined by specifying a set of + old pack files and a set of new pack files. Each pack file contained in + old pack files but not contained in new pack files will be deleted. + + + + + true if we should ignore the fact that a certain + pack files or index files couldn't be deleted. + false if an exception should be thrown in such + cases + + + if a pack file couldn't be deleted and + ignoreErrors is set to false + + + + + Like "git prune-packed" this method tries to prune all loose objects + which can be found in packs. + + + Like "git prune-packed" this method tries to prune all loose objects + which can be found in packs. If certain objects can't be pruned (e.g. + because the filesystem delete operation fails) this is silently ignored. + + System.IO.IOException + + + + Like "git prune" this method tries to prune all loose objects which are + unreferenced. + + + Like "git prune" this method tries to prune all loose objects which are + unreferenced. If certain objects can't be pruned (e.g. because the + filesystem delete operation fails) this is silently ignored. + + a set of objects which should explicitly not be pruned + + System.IO.IOException + + If the configuration parameter "gc.pruneexpire" couldn't be + parsed + + + + + Remove all entries from a map which key is the id of an object referenced + by the given ObjectWalk + + + + NGit.Errors.MissingObjectException + + NGit.Errors.IncorrectObjectTypeException + + System.IO.IOException + + + Packs all non-symbolic, loose refs into packed-refs. + Packs all non-symbolic, loose refs into packed-refs. + System.IO.IOException + + + + Packs all objects which reachable from any of the heads into one pack + file. + + + Packs all objects which reachable from any of the heads into one pack + file. Additionally all objects which are not reachable from any head but + which are reachable from any of the other refs (e.g. tags), special refs + (e.g. FETCH_HEAD) or index are packed into a separate pack file. Objects + included in pack files which have a .keep file associated are never + repacked. All old pack files which existed before are deleted. + + a collection of the newly created pack files + + when during reading of refs, index, packfiles, objects, + reflog-entries or during writing to the packfiles + System.IO.IOException + occurs + + + + the ref which log should be inspected + only reflog entries not older then this time are processed + + the + NGit.ObjectId + s contained in the reflog + + System.IO.IOException + + + Returns a map of all refs and additional refs (e.g. + + Returns a map of all refs and additional refs (e.g. FETCH_HEAD, + MERGE_HEAD, ...) + + a map where names of refs point to ref objects + System.IO.IOException + + + + Return a list of those objects in the index which differ from whats in + HEAD + + a set of ObjectIds of changed objects in the index + System.IO.IOException + NGit.Errors.CorruptObjectException + + NGit.Errors.NoWorkTreeException + + + + + + + Returns the number of objects stored in pack files. + + Returns the number of objects stored in pack files. If an object is + contained in multiple pack files it is counted as often as it occurs. + + the number of objects stored in pack files + System.IO.IOException + + + Set the progress monitor used for garbage collection methods. + Set the progress monitor used for garbage collection methods. + + this + + + + During gc() or prune() each unreferenced, loose object which has been + created or modified in the last expireAgeMillis milliseconds + will not be pruned. + + + During gc() or prune() each unreferenced, loose object which has been + created or modified in the last expireAgeMillis milliseconds + will not be pruned. Only older objects may be pruned. If set to 0 then + every object is a candidate for pruning. + + minimal age of objects to be pruned in milliseconds. + + + + + During gc() or prune() each unreferenced, loose object which has been + created or modified after or at expire will not be pruned. + + + During gc() or prune() each unreferenced, loose object which has been + created or modified after or at expire will not be pruned. + Only older objects may be pruned. If set to null then every object is a + candidate for pruning. + + + instant in time which defines object expiration + objects with modification time before this instant are expired + objects with modification time newer or equal to this instant + are not expired + + + + + A class holding statistical data for a FileRepository regarding how many + objects are stored as loose or packed objects + + + + The number of objects stored in pack files. + + The number of objects stored in pack files. If the same object is + stored in multiple pack files then it is counted as often as it + occurs in pack files. + + + + The number of pack files + + + The number of objects stored as loose objects. + The number of objects stored as loose objects. + + + The sum of the sizes of all files used to persist loose objects. + The sum of the sizes of all files used to persist loose objects. + + + The sum of the sizes of all pack files. + The sum of the sizes of all pack files. + + + The number of loose refs. + The number of loose refs. + + + The number of refs stored in pack files. + The number of refs stored in pack files. + + + + Parses strings with time and date specifications into + System.DateTime + . + When git needs to parse strings specified by the user this parser can be + used. One example is the parsing of the config parameter gc.pruneexpire. The + parser can handle only subset of what native gits approxidate parser + understands. + + + + The Date representing never. + + The Date representing never. Though this is a concrete value, most + callers are adviced to avoid depending on the actual value. + + + + + Parses a string into a + System.DateTime + . Since this parser also supports + relative formats (e.g. "yesterday") the caller can specify the reference + date. These types of strings can be parsed: +
    +
  • "never"
  • +
  • "now"
  • +
  • "yesterday"
  • +
  • "(x) years|months|weeks|days|hours|minutes|seconds ago"
    + Multiple specs can be combined like in "2 weeks 3 days ago". Instead of + ' ' one can use '.' to seperate the words
  • +
  • "yyyy-MM-dd HH:mm:ss Z" (ISO)
  • +
  • "EEE, dd MMM yyyy HH:mm:ss Z" (RFC)
  • +
  • "yyyy-MM-dd"
  • +
  • "yyyy.MM.dd"
  • +
  • "MM/dd/yyyy",
  • +
  • "dd.MM.yyyy"
  • +
  • "EEE MMM dd HH:mm:ss yyyy Z" (DEFAULT)
  • +
  • "EEE MMM dd HH:mm:ss yyyy" (LOCAL)
  • +
+
+ the string to be parsed + + the base date which is used for the calculation of relative + formats. E.g. if baseDate is "25.8.2012" then parsing of the + string "1 week ago" would result in a date corresponding to + "18.8.2012". This is used when a JGit command calls this + parser often but wants a consistent starting point for calls.
+ If set to null then the current time will be used + instead. + + + the parsed + System.DateTime + + if the given dateStr was not recognized +
+ + + + + + A convenient base class which provides empty method bodies for all + ProgressMonitor methods. + + + A convenient base class which provides empty method bodies for all + ProgressMonitor methods. +

+ Could be used in scenarios when only some of the progress notifications are + important and others can be ignored. + + + + diff --git a/Libraries/NGit/NSch.dll b/Libraries/NGit/NSch.dll new file mode 100644 index 0000000000000000000000000000000000000000..4bb0dd2200b46ecfd8cca379b40d2e635d10657c GIT binary patch literal 268288 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

j@_1nJZ&crMszS8aTZ(8yuJwtV%L0E5UG) zlWYl*Z=){>j&sP2!*F8-z7aQ*9z1~8Q1AdY1ka_Z2QV2*J>1!=Ek|q};U4$L4|V!M zFrdXVEd_=Pp|1zD4_M`jEovHsPVY>@hdcTwNk`SsCiwCM^%HAgbu&37opu?zvsRJ9 zkxrGY5NAu7%p43(?%m#$ui_k{`G1{d_Fy=r;r!oiyTA6UaNeX}E6aZqlz$Tb%K^L^i5#lPJg*lr( zTb`eU&!pi33ZB&jjzRRsG+JFHT7BB`{v`KYhz`X6n|EQ?zi`)DXyR29Yv5{v9-?1L zH++3z4Vv4vbzQA6fRh;6fWQmg@4-HqoEGrIa^aPpW)3Fv-@U3#ho8O9uJnL-K@Jb z6L+fcWZSPeSegx?b8%;65IP@1*T6Z`hYMdYzU@rF3Ydx8V!lFxA<*ZCav z_feSQ_{{tk^wG`Bwos4G6^gvlB0K-2_s8?j&9op!Ql#YL^HHGPVKB_K%Yuq|O56yKTx?rFn*%R;ZW?D~pNt z0}(wc&2!V>9WSS>&=O-m07HcZw*ZH~Be?pR*u||VMXjZ^!hz&AYisamwC5=lLGUQs zWXZkV!=3t59g+~28#L{$sAAjFdsdqF8^m3A%#DLPSP!hF__y{wT=r>&Hd6AaN*zMg zH|CA!fC6mjl?5IyEW&22*8UA#R83(_lq+WpggGYQ>P${yU{xFG^c$J(_y%$@=)@gY zLZh5{L+U(3LVcR#&y~b|+tx?gKcfL814mSABcQ~yNL$DIKq&8ZO6>lK)YP+S>R~u} zUKS^7BaS^oh(h_DXR2Vz*a4egEy`RlfIWv7R)J;F;#myYg@bG?p;wcQOoyT8n}AFh zKFLC>LdFq+(z+V(X~*jsJ=3RP6f~Oaux}Y=ZEZA}%r$QBE@>v#Mwd@wLY7TnMryRj zpkM_&Y6tB*9RZf}9fu+D-wV!%57$LQ!!@?TaM6VugfgoET_rh(BJ_}NrisO84MS7M z4{Z{x8j5UHr}LiE?slSG#p9`H+-A`3FVei{%V2Y25r|Kq$7Wv+@!G*fKI}kB29}^%_GJ%M@$8=>2t5nLx!IU z=|5Q9D{?t)k}tfhJI7|j!O~vQ718ojn6v1WiqVzO^1q`wz%8NWn$}wNg-S|4%Nb`3RY@XsnD6ypBtC_;>;fUE zjHWohk@AnR_8&uGiIiWYT;dmLQ1d&8T>(FaSWLyy!v|zJc81XRt;k}oqta~Vj48y|#D;4#sM=3gDXv*%tF)FXUFw_g9DM?Q+>LO$f%hwqFmCdW&BSV-QanYW z8o@yDk|0m`V>p~gb>9IfN^Wn|7SU5ars~HD_NnUWI%gAU2hWp|h7!3oO*I-8RqhVo zS0jh0AsL;L4{>l*vX)p74yP$C`49j~y7eQeWF{+R|XKp2LzVlu< zY3FeTwo9f)rbcOFaZ`P2axxrUNj6PmNk~Sm>UVrTT_f52CQrWo3c{AJZ3a0G63fl( z+Ha}ecrtC*(xLNf)T~``$!etC(f7G>&spsgLF1#79%_FLwI7xU10O@4A&hB%N^o5T zO+u{}q34I!nAP_}o^SD*7%PCMk15vx@RyX{!UJIDzm|=T%gZ zG>LBBFY4Z`qNRa;ekshaky;f$)4r(7q?H)8u3Z8ogM?mFk_Z63P2@e{(W-Vt&2bbS zjv(<1NPKssZ#6RGiikW!`e?(^5!rNH(stc)U43k>Hiq{iVUD?>*crUKnk$&vSaXKk zdF2actT|zCGqo{Y*eh2sV?0J1c!H^oh12X_3?0qSTX44E`6W-pNwo3KuQM{z8wL4B zumeP0V@GOALa>MD98%kA=iHgjZdI^`vVI4~iy2+9!tb>i)*GJg$A`J72S;ZvY>JrU z{dMh6APwte%}xnOPQ6*VQ^JlX;yFg=p(hipF4v|K!}~_PF4bK?!!kG&)~8`4gl|Y8e?1BmqfAUd;18hZ|;My7A;Pz zZSwpzSuh_&|5uE(?*0drnK!i`4%u>}W`4|OcU<1rIv3(Fb9Kz2TYqn!x@+#5tGNEO zJhO9OXogq|M_#!deuRYyk4*BlyXMGES}Un}?yecnJ$qR08FKGnhn?I>^4VSM$xKqu zeEu#fF3oaZba`&)XgQbP37n~W$K@g<*8Z^~W?dzp3YFjv*z}yg41)fn^^-09Z7fo% z`Ps+MUYTRi)Md_b(c77)G|%5P=J%W$z$*Lb=)PI&0}z;dN^|Y5s}4&*4B>(j4PXD1 z*%guqScetO{ULONv#j|#2YPorpI*=>+*t{cg0m?iaL;h`wjExwccFP+xT}?yXb~kz zKKP7Mq4*=a#~nUO#hfoNFxLyXNhu^lQY+MptQu`^xDdS?-22~#&w)^>U9ul6wlQ15 zU``fRRkI9~H6T~EvIPW#ui8a1f*I$wOT}`fywtjkq;3;f;g*=ibp+$XWhi2?FwJG+ zAGA|*RoBzWpX?&e`q>}jJb?>K_XRmnQ5Bfa;FcUO`}l18+Zr~8-g@na=gnt%#oFJ< zHCh*{v0>kvo6_mPjfQVHZa!@^&s{LvZDNWQV;uXiD7J`rc?8E$Feo@r2S2Ckz1|< z^9y5b$Oh0Z?`u9`kn9n%;lMSyDAyp{2S`cyD2ekG2u&vHHboKMdL#|wo*v@;b*x@R}2<| zhAWF?_e_(bN+}foSwZ9LY7J|YLH~EWkdPHY@P5(;5I|oZMmB>)QXRvmgJcGT{Gi4a zn#6wK5!&<)wdpcNqiS4MK4gC79&S8haUWK3cTt*voq^Y+^<&V+vBf8oV)?j!OmHCl z@NrFH$noA}v?L7_+pi3j4F+63F=jZkS}xwVsC*_$GQ2xp%(|>xJflLOaLoi&4ZC*I zii;1gluj42WoCjQ#eIn_NT*xo%9K%yws1D{35P!m9Vl`GcYWav8_&nAXFvaE**ak>GD!d0`G^q96;Fv8yN)RMDdzH<*>|6g&reDPt zm!RW+p4LcZP9r%m!!>84ixpqK*f}`mEpdt`ivA^`7svw7xR^9z`@PiR<5_?ostc07pM@xHt7D=c)cMWX$fKH@W zH;14>0Bpj*siBknG9FZko}8IEy>qPM09W)I{0fhH{?N$gsQZsBbaHvH&?LL5)>l{k^awSNp4GE#O)C7!>uT6)cF*r;ywf{|J z;b$-)8!M`9_X94u)&Y7~<*una{(~Bm+x#vz1+2GCvIG< zy~RBjQVKJufRQ_wkUtu<@e}JHb@$)tESe2c_$hVFG!USwG^m`vzVlkWcE`>GAh<;j zu0Y`U2eyvuw{t7;G}M&J&QskOHFLV?>4(+5CK?-$#=P#lo&O$`?e%BN7fq`t@0S2+b1;J=^Dw zaNh47`9iq%Syj|)llwdbe@v1?`xn%#UAOy0u;D~5 z+7T~&)q)p3!o%o{Ma@(foAJUoJ?g7NQM1*>V2>vF{4Q~yrmx+{2qVq3U#qF+gb9jB zP~9&Paj-buJ!H?B?$_-(+x_46oa_FJJ?FdsVbAs5f8k{1!QzJQx9xjl_q+CNR=Pj% zmumM;e;Mh<4^YzPXt(GuW8JF1jCaTVWo>uTUiONx*=+STYBw{rr@JjN&BpxidLl6P ze7YWm{xkI8mfdIa)V@nTdIA0ASOfUbQ_{xN!Q?IOS*D)y7!cT4esom3G5@qDL7`LL0$ThAh}o zPMBb=eWm4L@=5S+(n0-dQMUn*s)bvwYfiXFHnEyHvfEN*gk{LU-)LzfCkc4vl=vmh zrexyeyWHG*!|s2>UVIe)^Srxyt+ktw{tbX8?&&wTwY2ANDS5H5=LnyGpdldB@|UOWx$X=4?4! z{^!8zLCavZ+hC>NRl!OLj{++z=V-8k!T}@HD654PB!dk17_VlAFmT2(@L2Kcxdto! zt_oI4cobM!IY)!lG2_+$O;|0*tDiSm>33DIQo^Ia%E~z!td1G47LE^IEezq+!cT@* zXv?8j`dt;Ql<+99vT}|Ft7FEi|C_K{j#s~6u+s0UV5Njdft8hWG+3>GSEBpI2R9lD z8828)??tbA!+h`H^lohy_N8oa($Le#Rls*Utbm{q&v#=_NL+9V)Cbu<-IL=Z>Mdx>E3GA zZ;`dhLafMGZf0n@~ z(2f8fryX|#pO+p6ABC(6K1#Ss_$cX-;bS!(SNOO*sX6o3;W>lsxN$&WXQPeBLvnml zMsmDinKX1WJ&$|(T@KS_l4E{M?oPuw@TKUIg8(<+kL5lZe1_@oOPK&K({#s%q1b~q-_whz4dL+6Kt5+Hjpf~50Bp7PukJXxDsq;pjSQx5RWt_dFz_K%sIHmm)8Hpg4YFxPpVb@L%WNyVe_ z=)A@&7-0-qAf^>~bmxF#({&>4NOWqG^{DU)utcyxMc_J?J+G!vY?A7;{ zE8;nut$j5*EQQVA#ei3iTBhR(!{1O{J^daLhU|U; zG2K_e36N>aFs`CtV-0l}oTrSmI<8LHSUIjvWpVXj23Pg&xO!04_4Ip0IKPp|6j$|; z!dV{)ob?{yY#HV{zmvjQ#Sg)G7*{=d8Hn!|SKmOP0j9T20aJYsa8+$cz&H%UBjD;i zfZ>}}S5Lo3gyCC=Okt>x6o&dpV5s*1L(4GN`Mnf|Dt-ut!?@~gcq@qx$5jhmHLm_9 zWdykXo8YSN0j{cDanq5kuYwaG8?NRe^u5t{L__TYOJjwo>33s}TtH3j5}u#=)Pf3OrzhSOc>{#l!m-B zgq)Cu{1zeLmT*Eoey(+%r|QDo8VXm1D}}43mBLluO5v*2!cmxv!2_AYIi2Z>{?lOf zT`v1P23WmQ0H~#1`fUmaR==gtMjHA%3a#8|X(!XrcX{YZ<@nb7rVD5rS=_A*$jxhug)4PGf+O}K57CTpJP471; zRlrZ}eFXeebmupT8*0#-Q?BuQ#IqjyeLaF7k=Q1k1yP`Q#)Bx&>?*JeR|Yl`biams zzbiP8S2)eFf-F(zb(*!Fp+O4+zZ<5h&X=?=)S`|A79UPw@d1^(YFH@sQDC9y!(k!m z`xC10Z)tD;gQSU_1W9P^bAnAiy7K0W?7JE(mn-uoT^8(j+&^}o4EiE;D@)NtS_EyC zSL%F4pb#v*obMgIoKv#pyos!7IbTl7De8_ro$Hi4|74 z(x@bB?s91-8#^ndtLKXtOEhF->MHPIY(BY)jf#xjDtll57V&K;er} z`N(s#cPTBvAY1sXG+TOGvZNsl+vwrEiDeR^yFoG6`I7fuG`JYOYfTjWxBB0ZiCkmf zwu#*IzHKA9nSH(yl^8DUU_TToTKo9b%vG7;d*bSaa8srS3@*y_Z-?SltWkDW?`au6 z6r;IfIkCPfPp}qf?DGvYT|9#+((Plp=G3yFdY*;F`kfU_(aZ+Q#$>eIXr6j&dAhlk zpOZyY#0uGB3d=ndp@Ea9`qcOi@0^ie{@RtW;Qv zm7N%|k%9ZoVQ{-@()(lrg6*?%O1M*jqtqw7Bhdk`NX{f`BYbRRJ2a^#oq=(?P+ zTcd<%4v)B76L-H44rO=#KEj~nci&0NN4pc}L)K#kdaP3JRtYyHJrdlkn4`gMSl|BsxOry( z&nPcm(Dt~?8lTX2>tV7$isIeRVyycgCrILt(TvCOG|ntbOeB;U;K zq#sib9ERamRhC$!*%Z=r9&br96@F3`Hats^i8jE0?sVFqa&!Gpvb!AW=yQ}LymL=a zeyRUyzVq02HsqRH$>W~-(Em)DuF?N&`fe5X|04aK?mUeKVN=9xXl#!cpB7mPFR7<= zOJikhzABtQ5U8-irbA|bw>cVw20QCII$(G_84@Oq+i7b~ql_EhamkTn8d=;JZs9#k zm@>G?!7t=p1oGAst3On?VD zs76ZCJ~n@N&gUov>!$66wpnAwJq_e7*A)$ZKuc|L06NG-ZmyzZo^0kytY40nw1G1r zVdYRsIJGt`+(yk6jy`M z?Bw0JaV$q|;cD%q_I#+lf~>JP8Ty7i9)h`lu6P>;Xp39IXg`C|&fL50qdi3ew`F<1b~mgssw9oBz}^)*k@9_wz>9uF+yk6a_*ZA{<`k+Q(Ih$5t_ z;G`G>YEle@*Y(3^MKhPV?a-gVKb3}uYUE+)0-e)WPzDsu;T5!Y>wKP~4$HmU~EUoCjx1$=Zo%J=ciwB`gT3Ta-H-| zxYzCd7152>k5qX0$Y{e{78;a&`=D&o)#`i8W7Czk%8FZe+PKlqBlR_1``+Weetys% z({t+kD1H3`(P>}p<0yUon?c#8>(jUT8uWY09=Evm%eFA=?CtyMbFBFvb>9q$+5N9# zY2D8yuOqGVkk4=z#10Ndysa04bZ&0S`af8!mAiM6oJg6zmO2lRKv%%Jzfi0+I{2+C z_P?Zhd-|R3JdglJ%|9NL{djQp;~|5OM(3gWI5bhm^VP6-bnuGv#!+-qG|8=ohG~RrPGS}vlg^V7$01xg43pW@}Y>I>bhn0(K42r{*DPAGmAJv-Zj5DKgwOQ>ypwGeIMnYXq!rg#60I^vx|w^Hm}%=d^KVNZ=0j(Ov-ZCarX}zH zt@qt0fPnoU*y~ok79{W|I@pD;YPE9?bE|)+k_0X5UH0DRJ`EWY=k#dwzoWq1RBO(t z2NP1~N8U``#RPv@+>AioxgCofuY2N z%Kg9QR|~iLsnuvbeJ&Z@$@R2^8q4*xa?+|@b)W`SjYybrPc=!%k9(@^bfN?ku3*;X z%?jdmdWjnlxHgod6`@aZzxCiMp9TIt%Vg9I-4EyEJCLS7MFf~)kL3say`E*zfAH77 zpE9>!#1C9a%N+TmC`FBlIO42XT=LGB4HUUr-c~Poz4&ulQ1MPIUB9!h&s@cqg|&i# zN#_ij00MuSo2i5IrJOP?<$791R-g}KfjpF(&0SYtHB#QV6P%vKkckHDxIyP@H|(m$ z#pzxB9|Du&^flJEJndB9;E>U;@b_B&+E91kI(yAXd3I^EOtw;yLisE%ajMbKr~MU@ z;G;|kS1*NUdHQC+GheTSC%5_5%D8*1=2}~5IVKuH3$AP1&jr)_Yn8@<2F~IRG;*C2 zg(yjl@p`Lb@dbmBSr55>5YntzP_BCeRJ#9{0HOKg2`)G|9`OAb1KR$5ety~m`9$hi z-9R=M!bo;BlGkFwVLW74$sYmFu4XNhz~$GDKU{uWGbz;A|4)Xpv1xP!saLPt@LMCq zGOhFm{Lsxrjwm;1foD@8nGMHl8Z;@{F2oB3@8E(yLYU&3+Gm7$O{A&zH4j@lUAP(= zFjVXvlp4j$rXjetdYW?F+oaRS#|72DEaE2W{xRVQHi#q&XC~DuK$a@jz=faQT5-xHKX>ghp&=p#H1@%*R26G&1cBoxH zWitAA62DhPMw{~gCpxOxrx|cQ2beZh`~RhmK^mJIPF-7^e~P^stn75GK$xA8pF93D zay?yGV3mY3yXLN)-h`b9-`}HQ^4h8=>MIj$(l+6TtLTz~qNBx=nH3|Z>d`lzsBXi5 z45wJ}D5Jxl>c-zkrRF#cpg9f)X!O5Jx_HiMGQ;#y;m}Wcuug~Bu5PfhJkKGp=i6%U zrkIyCmK#gm8@e2!QcVDkc+^#HZc z#63xIjSaVP)h8s$3-G|WXF^?1!dkA=g8$hee}ncjBdna^XC_ct2->l!zG_eC`*E87 zU(xC@jOTnho?GGK^hHnrmjsi;a4htY8C)W9=;!|GPZ?-6Yv=5h(>wRm?IXp`?A$NkKgnuAvtv7_qz3|$VaW>ERvW)9 zYJbjH)Od4pdx@sP6>o(R3S8hIE5=O1y4K=4P$$*J9FW2 zm-4;};;Iq4lA6Xk?VDcOAJxahRIiO7S8H@2h+{1E>SJ)Ogn4~Au8kNSaR+pN{v$Yp zBh$Lu4ws8fPF@?rClG;~mD>=4*Fzb?G!ubXK#}RBd^*tb&@Rc*xaxJR%ymv#PA-m4 zE1)LFM_TwTn>Se@-dlt-)=^Bzfvz6SMXg&rO+5f7uEDBhT~ za{74T!W+c&kK3AS@i9^J&g0ZH+j*+D@6S~@wc3_zL6o5CfU1~2WXe<|TckrML?_Y> z#*uv{__LxL!SXDQ3y65q8x&1LVd-6mXz5++F&%ES5BpZ7=<`IDrIX0@v_l(KA*1*w zRZ*w$)aqmr|GoN-%1ch z_vPzz`a*S}XR1swt<=_3o#Of&?`9blv8GhLV2Tx%H>Oz$k-46>noB{lm%g!#PoU6v zCxX&weL+Z|3uo0A?^zm2H<&2aNss^kRac{2$#>YxHu(9(t%*8p`Vq-UCH|!EY4XRC zAo>OV?$RGPa2E;gB7v@Ax{Cx_Gu%Z2se$zm)s+<2e#tFQxnX_i=B^ zN*kv=dDF}3X^J`YRZ`4hpJtl5dLieFXuOo%dupYe zGp2gEQvkz8K!Z9n`ZUU{Hv+yF0nYCO%8vrZ2Km}gR_0p81d-G6Lei|thY>D1xp%}b zbdferjmt3=q&7rR<#rgZovVeuBlwg$0v9Z6 z6O(QtcO2nTkVHZ+w&4+_FugtBtVpP|!EAp>Sj75TE$ag#orY4&Y|waD`y3OdEyJP! ztaR1(E#$<(OH#O0n79UcM05|qBy(F+V~(`%L*r^C)R-k)WSK@GcuxwNOe`{_%9J`` zBkBY+JCf=(Ue{*2Ben|F9AXU~u$ddfCTl9YUpEF5LaKj^4 z2uHT>H_4CaA}nja01T@5MU)0%ZsM%qfT+KqG?_f}`kwJT7h4{?4Kslq1`8F3etGus zgKRqu^6hEMV7FpgCCC>Wyr>_8#9HvFE&1-lGa_*A_>ICFM0mJfoI37}LAQ1MPd@0I zdV+Ok)cgLerO8uF@uX3XZ4xF3uj!W{ye6R|{H%fXUPbt`UDuAxU-HsXAbQe<=ghp?fqiqQE1N#G0$Djw0E=_MmUV5Pn?!}2(GdxKEbK0|f=zd`#6MXLn)xa{vc!gYxv zL*o|r#IOj}_B|6)Gmw0n0Ll9O_!Ws$Io9yUu{>Fjjyiw>*l9M4l>qE)Ri z#>-)C!HX|0#!F#!!HXpLdVv=$K;_z#*EPJJKFW)T63dE3y(=(TVwfzM+h4EROMXAs zNG@(qIRN!&+w1Ox)aDelT9^HOjN?qzUDd+KIQE@I6wCFsrP|v4n-VRe(wu`TmOz(R zjeYwUNJ`s`8aZhq80j=Y@%Bf=2#=UGky)u>$KQ+eNNPn(t0DqBsz`B*z+6cLrwUd6 z1f5-*>Fmg^>NvgS>YPDuVPr?@V78T4Ye{RZJoYwJLK8lIcn8^!9O|I%o)k$h*Ty{4 z4jm)L@Uu3ygjT;?8((UiHa24~VIz+vq6X?A(eQXAU*qBxQ|;?AY)(l)Dp?`~t(*u{U;Prb;Th2~ zmR>j`Um69@*Y~swoL%j<)@&t*A)~ixbjP%&!wIKRvw@-PwiuB*@hX(T*TOB9Ni0OA&R=ty{?Ej^jaEoj8FiM4T zb6=eQmjX$-T}!pF*!JYT63%Q?rk;(G5j&2m7XAJ6mtX#u(#o~8yp>k}s7O9W{@wY` zIqv)0*Z5x#8TtTXew4nt&dx(=8u8Rixwkob*U!eI&m_H4bP%rHHJ-sx>_DF!v*A zg#&94Pd)=+mMemBBGTZVpbok}rN;|AiX4qQpx24g3G2QCINvzd0sCFtsQliju=8F7 zZ6oK4VLy8bv(&~!gwygVSU7EcRL^|nXY=AwYzv|?AfWyLDT@jjB!tl$@>9#nVIyvK zbPlGFaOD9W4P<%H4ej4WXeis!fZwBOe6kf)Tg@Ypb~J*o1nY5cU}1h%c~9`u5nVZ^ z(?qn4HT7gbFU=u^l#b-O470$k1@Wj%3gg>`6e|Ka3h$|M@Rda340vQH%f~&cy1>I> zKR&^_5hFD}3PG~CQHM-llZ(4>7)J!c`ccvu9kat}^Z6Nigt)>fglADTzU#YL4r0Z^ zHqzDeqzA()N_?(P!#Ce_e97i#{%~4_Kb%u;h12j^I2y(mag>70OO|EgT9($zF#~G= zaE5wjILK!LuYPs1wbiml(Iw`a(gTp zHlxch6(T1mgmsfS^`)1f61S#pYQk9LMCUexd}aBe^{_n}MM%*nCl4fTUbRD=p)uh@ z^d8hxIPkndqv5pY*JB6^g*3=yDvFydg<-6YpiVI?Skr)Ivrf<)+@tiG9TloX6A#(f;2nF@C+@XUx znbe0?MtRJQ3sVGb@{7Ajr1Nl#@I}NBl?c$~bU@n(2WE5IN&u^H(OScSnaGiosdtQb zR8pFQchq#;yZ~iO-E7Fu^ms6;^qHm**R;m*EI#bv9RJo>Yl?791GEoCU_D>DTX$-{ z!T=(i-3L?VRaggM#ePuv9dIK-2kgzuQb}lj1_})md-?Hle7HcChq9JL*5f4qSbi+O zpdjGS!K^!7t>$5X@!i0OJ6HAUC2VZVRXKsijm~@^hmOJ65B)Oz5q6XKXK8^AFLZ%M zHOgJ)fsX@v=R9PfEE7?|Wz1+?>G;Hc5*e#+gM^k>sDSN{wBXh@e@hMJNXrSd zFGn;7yM6m+Yr&;RI4C#zICv+Ko^%pc<-@5%(H^A26E34MINGDR9YwD8dWv3gXOi3? zMcvw}6ghxSQO;bKVn;fyM+SC>?3V>1Ex29If0^E7&F|&dpRc9}uV~iYmo(AcxgZL+ z^$J7Q2<~X(b34gC&MMM4o3<6}pb7RGE*Co_)H8;}IsDStvF! zCO`7e(x}8=YH;#jVsP>}KjJAv5Fcr9^1lP)#E)rv`H`pIgFE}N$bU8r%3S0@Ny?A> zfAHYd1}FcsFtsq0pWnFoBmV-yG#)oN`8Rsp$;Th`>-APF^?uc@+|e>0}amjAA@n^=l6F0$UjdojrTA(`LFi4d*wOF0aqdh#!Ja~=4 z$^QZjb-}pvVfbVGiv-g+`w;%ff2&~H-P_(z_qgwCaPofxCggbxauM|wzhlhYW`tjC>*@lPwT|NAl zdEAXS66bP{`<@>D_kcU`d&{fA!(Zg#Uk%);Ki>ZTSP%aY5C8MPsSE0ddf<;TFBDAU zy$nu$-t2KF%^&$s6HMd#7@YoJ!#MK$Jv`Jme+=6ZhCIZ%L&A~Y+y5U0KmN$GyI@-X zTY)?Bd;96#(%fR-J9PtJ?;}d{NDq2zwOY;eZ^G>oHvZ~uR&hkrK@{|z2@uRj0i zaUbj9{{pxpKhxun^2`)W<4!+G|Mf7A{^xplj`!dr3{L*HU>yBB<;eIGhKG26gOmS$ zkGnU&XL;QB^YH%+d=`x4)pWRwlX>EgcrFZOCf)?&$m8UT?n_|!BVHkxZodx#XIzZm z+yBo3%^&$oiQq^1FBMF?8&r5w9`}(3C;z)JPW(aR&N%Bmc%i|`zY4~wKTbU-{~rtw z@oIyU|2Y_^{)CM?c@}u^xWUPPlgFKW{LwyDFpZBhIQhSVapd>*|I{~s3|j!>^gr(d zcjR~49eI|*@JD>0U|OG#19#;2_J{Kf5BYm|_^x zcxQt%zkh;Z-dG=)5B|u1oM0LsW^nSq3ggr__5=Kpf3aX1?_+TC-{o=7^582x_ymKK z|DQ09{I-XOY4XRk@?aeOUk=>Se|O;gk*85GjSnz5<9`Ik(Z9Dpoa5o|=Hb86<8FEI z6Fm4R5B~?i9r>jVgQh&w3=i>QgHxV!VI2LBHtytE=D}+WPW~5Rs0+rO55ph%7YU~E z-UcWCZ60@Tdq3UdzORS>Ti}lT-u}PN!yf^@35MzN=jgvmlj44~2Onf`%JUSAqknII zc!-C;r-%P~kGr=&ImP2X#>4+Pa7TWo#~)~nf;CmRH{BOcI z`uFz#M|k-AdHC=1xaWBAl^%SOhyN$wvtXp|__PP*r_T5z9)_7}@DpJ>@_76IBjL^; z`6~s}{m*9Lj()uLVYcBRe^(FxNg#~Y`Q!~ZF8M}CIkkM===X}pWU zncoXxochml;E()C!8AVH;N*WD#;I@K{{L_fe_s#(Jsx*&e$Vu{PxSEr0Njz^_V9RR z%ZIyD|5=~u$NJD6hCj;RB$&pl3{LqUg>m%n?f>U`_?>vjf0f7G_TVRa@X-b*|3@&6 z{FI45$}?RsjdwCQ`Ok-O^zXz&{$|5Ne5k?6|1ylDf9ioh@*F0Z#>)*({yRMG-u#~7 zaUbvD{|9hKes6s{(8C`Ez6plu^5^K^(KFqT5g*Mn*x;1s85l?Z-v0kk5C3i+{u@2+ zUVZ-2<385I|5xCS{7jEO$}>|ijXV7${V#@b^gq|bbG!#1VQ})l4ddwFDM!YiFg(Qj z8=U+Pc-%X9@UuMleg-H1FEEs!x@Uh&y$cS4dM3_(Z@S~2tMy5D8uqiokIsv2ggENR;+>ud^35YL;*<^6vtk(Dur7Qn( zkNoWaUHS1c!1};=SiY|Ocz8JS&xX4z|E$*d*+0ATBQuWtm2h|EuV|H@{f{d@2BVJr z55j#DjO1&UUXQ}KNka^gi{;Av^O?zZ#JE_VEDN?nwh7jU7)*DVau~LUp)jLiSax$^ znqW?Zxg2IQ%=<8WhWsl(vU?5n>@_xMuVG%ihWYXukn+B`gb03&oAEIYM-MC;=AZdy zo>_)nVW{gpVP?ZDhj|dj=K~Id!~7K1z$zai@j;P3DA5PK^ZYy<;-h?}Feo42NSIk_ zryrtlWpU(jWOC$k%E&1v%E_{F%F8J;r`%X}5J3#{Lc=rCobgyGOI$u3mOZ=9T~Wjj zma$pJ`6Abu-!Ee^?XP5GBhsDgJ>=o{lV>fRDgZ`Y#Pr$f`If(Vt zq4Ei~9a)6q&$zKSU7rkAAO~LQ5E?emhp#z%DLD(caXyr2K|)S?bH3r~JJnHETw*~6 zB#PAdVN}=?o%y9-Ay*`ID1IjnivA^>ttBulSa8qeu`GitGZ0m_^3TU+?x;8`f5`ys zV%7_(OwRZOOshM+{iV#3#Lg0Q3?3L|L zs8rcnmk}KUb;l)Cw z%=zrEbJZz14*{wdA#syUMo>Jrq~4G$16hUuId_U|W4n=caU+XLqUcfE%ka-o&2MIy zWz}9*OZm8+iG58{EhuxzoV5B_>>wz$JxO0_SJEbkkfxWY>Tr2R3tdF;>M8KoNfiEC zP6qy-oKR3*_jaA1SmB&SrO4PXN6bvl6@G>)`n9z0L`C~eEi#s}W*y_NYZNC@Qi5M_ zDrvn(gyLTlVfX*82qlyN#oJbbPQNC>EogE76(t-Y^~z1zR4*z{PD0RhXAz|^s~SDK zQ$O7H72M0LxzW54Xad_&5D|hnzD1P> zRdG7bK$gXFSgFc`XM*X)JRt)c5*Wc1W_W@FJeaVvKLv-RkhFt(2qU^nmu?WDbplu& z{}Wcd4z}ftTb$6#aV$>gHA6U@aw~`3Vs8vRw3dvj5e#c&p={pkG!nT+Z-jGo`gGD< zeeykp)jG&?2hLvaL<##}eW$6dIJbNV;?lPYgo1_AL#zuH89PP&;fl}bnS0{pCdoG9 zj@;Yc56}WHb3efTXdo%l?)AU-JLjw5?u#=Rhd;T3Rv?LUa^*;sm0|~yXTg@+X!y>P zj&)b*Y68rYFnwS)z$}LO45l;8I+z(SIH+9>gSi*xIG7({ESM8uM!`G;(+%b_m^m=- z!Q{cLhM5fWJj?)?n_(JZzJ>|GoDQ=u%vPA*FxSE?g82(fG0X)p(_mhMse!p0W*N-) zFhQ78V8*~~f$0hJXP84^K7@(DoCi|}^AgM;nA>5FhWR^84$MlJNia{t^naXHMMFb~3Xg}D@FHq5&)VVG4gwJ^`YRKnZ@ zb0o}HFc~nX!R!O`I7}~?YhV__d;(Jh^Cy@Fm{(zjz}y9MEX+S)0x&1T><#k>Oc~6T zF!NzPfawTxF3ePz7h!gXxeewhm~UaSVa|k^2=f$7UzqD*4u|<1rVGqPFbBcB2{Rn# zKA0rTPcZq&LB20Todf$E*i&FnfxQj(HrQ3Lt6<*(`xe+uu$y524ffw)XTr{eeFp3^ zV2_7A9`+NkpMYHsyBzj)u&;xC80^Dfe+v6k*qvZ^f_)+E3t>-(JstMzuwREg6!uWq z_rSgfb~Ef|*gwGj0d^YfG}wQH{YThiVULCVDC|dJ?*@A}*jK^63ihF}4~6{^?2lka zVMk$~5Bq%B2f{uO_RFwehCLYeVAyxSz616#u#bWL57_^J-2rw7*k{2$3-*4n_k;Zm z>}O#2hut6cjj(Tooq(Ny{a4t3g&l((gMBgVi($`%JrnlZu-}F~0`>^l55Rr^_VKWf zhy4reUtn`4Ya~o5%q*B(nEhcYV3xq7!;FK8!z_R)gsF$AhWP`GA7(F@9x(G@3SbU^ z83?l!#zqV$!iGBb;04*RmdE zBC!(3<1~;3EtiO6eizMrIwo4~}qWNeLZE7_DEh zoHq7dg@fFXP2P~g_SKArHTfAj&ei#x^O($xg|I_6qkdX_l2jTV-V&e-kF}d3{y3dM zWYt`B!}Ho~$}1fXJ?k`TA~*^PM;7a$4im+ZwACmtWJq?-pu@*44f*M=Mptv>L&gu= z%SMCFhT|2j_vEqApcYOBxDC8A4pHSV@t;+7Bh zHlvWz!q^73ld|{0jzg`8bR%~Kl_W|`U*vc$Y7lJoqG=1YN{t80kh^|(&V_rXIWvEP zQ44CAtGb#Q5ElD>f+_+1=Kgv;=Ex<9eD4ZsmMy_z- zn5nI0&E)0ww{!`Gt>Vb~db@cdoHHWpR5?bT2+7)vnQUyw%ScB#Gmh)an|2*bI8ZnM zb9vaB$+&SJO@2B~S4Fj#N`!{N_>up0Mst{QbL$-=k2>|vsdWuWUE^#KxKPVb)68SX zuy>n8*U z-VR1}Oonw0Ps%gg)Gez@x@Z}ygWh)Gh3$NjbtwhxY)4ttFL2dh)V<26#lI?kEk2n< z>z`kzbuR(X{(}q3@-r?9XCR=+Z4SO@6%sk4;7||S6ckyL3k~g3Dih5b>>Y~_r@F8= zUbm(A2$K4I55DY$S@*DOh&>8!>%}`|M_l5QhD~Y>tLvk47L;XPr1$PPeIj=1_I(o- zZyZiqlh(q?TT`>?hhD1}eULRzt1ZjNz9HS(C}_)eCar zdllbXRnUsgoE5U7^KvmUGY2n?D3@I9WwWpw>pfhp;q0wqoBypJ`zo(N)59~i)yPy5 zXvaoB$iC1un2*HMv(*4?_vfVH#JyvDP8_JktjTyTYxA#ur)f9wf5DORQ8uQ}Uv4;0 z;hxDLW()jTcD9w{Ghb+ZH~`om2;kWkOv5kT{4&fhw8JlRhhNrj{IY-Jm-8R~I{b$} z(M(=Gc3>71bi^-Weo^x)+~HTW!>{-^ew}{f*ZDvEb@>l}_;88SjDjfljEqnyGn2*1 zB4e>owYlbp;}qnVXMXwSN4t1=+m(sy*l;|>fMRlLESr%zoGu(-%>x@2HUjL zUf3tF4Lfa@?KT91Ssghm7N2uvO>80T&M>7gaTt8sm9@JgVebz!3uXyS3g!}+O)&4k zcz-*l%QTrD(_%VIqZEd5kA#^8lY-ds;q6;q1;24ZtSq_+Bz_P`z!;ah<2L=iE_z4VW#FCwVQ=Nb)+@Mc-Jufpk>k z*Ap*D-l#b@(z4^%NhQGilQ=gsMt@=klI)4tZXl1iSr>$LXp6 zLmB6ajM0BxM!vgoy#q=S?_pLm)e?y&`au!;0tn0x22{sTdD!@w(`NNs9OoJX>JrpX zdDioc3jE`-j)|+x>eJz_6^6@fUFG@BRm{{|K#t=!OfrMp7hBL-7~I;8c%~aauY#>+ zT{r5ya z2N{ZdeeiXv^`vphamUQ+wa_Hyg8BK$WT4U{(>JYg24+0V1C4WFsm29>MpoX&701{u z)U*T%EYtD##hqhS`G(^eaOg8yOspu8Oq~4X^{xu?8yIJxv(js>#Yqu3e}XF3_b97~tbqeH|yNH#MHbM<&6c{>Qzdk~(9k@)`5I#R+X{0iG$ zQ}^FZ7pFMSGc8o7d<1e#DI@mt>(J^1jV8KC_N7gAXWOB!Oq-Hv`f9voA|P|(T!>EG zZ+ai%0p0s(CaalRF>Q~&&Nb-7t!8S{+=EW3P<@aJTY~nchP^Gppkhcx9#1upZDnAjAgo=36dr>20f;8M3d^^PzpfruZVFQDXol;6w1ZJfw4Z5-lFwSDJTB3VqtC>eq?zxZ-P8TB2(mdeEB zC|Wj_;`vm^2&PH#+o6Avy7DXikNCIgf0&L@2m48`WYYZ|&bBxRa+wDn-);Fu<@nk0 zgI!PhwT8oBrPT}a+4#2OglodWkYI8flEl5&gjkGbms|FHmB91Zn-<@r^|M(Rb(u(K zz@=bl6%yP|RJH~~T9!Q1<(aHGbT~YwxJWLuywHS8a8X$ZT4pSs^J6R->+U*T++HZ@ zCaRodIgVf%?K%tw5L#A$Vt^Bh<>u9=4Q0=FJsBs*$6D9$^T!WyJn7e34(!HVFU0Ac zk8ZjVVUo{_t_9kd;P97Qekl8CCpwYCqiZtmtZN-S@uC|_w;PVzjjmh6xw?*8&2&vX z&rnb`39afKbk-WyEnn!2u6Rr(wzVeuFNJ%-8!n(efHL#-TqR>}?t!s(2-DW=SDkJK zH<1X9(Eu8}?s_m!d_96{d78T-)XIg1=nkTCG%l`36m)zVc4gJBID_>Apb;-`5VvL_ z5xv&2=2|FI#qnt)6w5dhDPlBLpljM!%G~teHZ?i53{1C4+M(O`8jAblhc9TDZf8g=Uf?>J}0^Vn!U17)`$(l=D_h z{p0{R6bwj7qlV&Zm0QRl@o6fv{CG%0Hl#z#q=S1nOgiAhz|WG^BbF>Hv1Hk$B}*Oj zH95}ZIFCyNTLEonhH^=lO&vV z2EDEL3KkfKasBWf*V*7Ds_A;5%N$#`*E7LZAZ;KstT|Izv&ohaebpr%LM76MTj;fh3pt@Y7rz$ zyK5Ni?T9!il6n~#i>6*-UQ2Wad)Ha zEo6Ni99A=-owyYa2t*>9xQzq_WuL{p48JZX18F$}i7z3omh%m`ikv%ni=6ZpIf=BD zv&NBAYq?eIrrRm@n+RYv6S`uP@QCfo9nt!|x_$jJR4|c-&%0i^--4^iy_2`dO>dE# zNL#s4ow0~tsxx%P=Q(v3l{%Za13sv@d!{w6a4T--w8k$oof;WUYy7)QoGMsn-n8C^TvmKJn2~sIdE28C=J##lJDxsIi}!#reYm8T@!ypE)tg_Vyju`Zyh?)bgxPFJ|-JX+z+b>(S@?on)XNH z=}lRV2+lq9REgASJx=P>S}v_cq92>-P3MC*RNks<)1awCjt4t4ti2RzTOq6I0VJDz zk9lh*3??Qa>BJ_u>NaG_zML+Sp1t&1=J|c_73je!3s&JH_mZ;w+`uzjjcp^aj@wj3j6_*D9;Wy zZFUJ2Y^I|gL1AH{lYQyl$DnuE4qsIH#KQ<;`Y{`8n_SuHA6b-mgx;3KrNbn)zy(*p z`4f+dSJPv#lH@k!ftP-)ClQ@WU#J7?J|*!u!|?gxhH{=C(8iJQWIwALp4GIKF@K1d zRqs6@12H@Cgv5a6SxE$~!rM}vc3LXs<7ua@O%v_3wbAa>PBFELx)N!^yeRCPrt8Ia zlqc3-bW`G{`kcvk%yoHQ=39H3q*KH3{EiYBo1C!9k( z0qOB)HSLL9CdVMx1|8dqjw5P5o+r89#FDic^2H>{5BY}fi_%F>B<=JNr5NAoWmn13 z63H_80-xMVh)J5*8-z3dL2XezS*I+#wDf|*p)C~ico*bl|tF?t;ojlK}@8zOxD!f^A-AuJ4xwK0=w44ew$@N=Svy?zHRb?3H z&~jQUgOp1%)n^#!&~m!V5J_UTh|(TNt0XyuzUy%`WVy_@%<2s*y&4I(#2N}Lgl^Xc(i?}<1OXPNAx1g;(6M# z90p6YxoXC^8~_w9`@=#%?w2#l%sUw?nSV{lADxqlWlmVt#8o2wyW@av`alv~7AzQS zR>1hJ$fUe5%O{ec2#ZxU?Q`LE4fA(#?Fq%}nAWG|S~z4o(@D;GAxs&*;CgwU+E`DF zw{fYnHkQSNEG~}845kf;1k z2by=u4;1GIo!hv$mMBY=o{l8)14Uf=gT+o_UverWLEMp1#7noHns`?^?QC!m{v5dva34@lj z8`N3;VmxD|o@iaa@_iu&?#r|!P9A&BiWBSBE-z2P7w;bJc|$lTEj`n#upF<#%CTHq zt3nbBsm@xF*hr#PjTof=FiR4-=;&%p{PGzako~E;4(d9rTd6Fni{HkEgjYl9%%rt? z-J7L#CeZ0%J~1y;-pypAg`b3jt7J_Pw5sbKSN-7HUK|{(ownhnpDm*Zl1=MW->JU1 z-mJotC%b-EY=Y!yQD}Giyyu2a@%u$2bde4kC~hd$u4v$BfLfJa8H%*G)&Y)6N9Xwp z*w_(Z5mFpG1l>#`UQJUsHr7)Ai**+@cFez4V=)c4V~s_lv+x0wH6nf=g_CuesPxdB zQ%m1e)$-xnt+pdtt1Uj>vtoc7c~?b)nFe?+v*y_q+_c9!t1E99L*w@ zw}W>qv!RQL>;FrA<+se<=gEE3U7;7;$O`COI<2R~0`)Q_2JNBj{BmXibjv+a>c1D$XTyT@S}u;tj~VmBfp#5ItdVbt!Kro{2BD^#;{? z&~o6rIKoN$;?ib5ree84eVY&(MuW05(Gd6$LzgeU*lwj`Trg{ae!5xWAHPTB#If9( zQSKKo9Ay$T7|U&_mnWerui#aCj1~`&T|{dFnGmvGZxLk85SSxD+9CT4j?$)Oo2G-OZ(sBg()JN`d);mMEUJ!AYJ{bQ zJ|fqrgS2qrihq^pq@GWtb|TQdr5(pO3B!zb7?3r&VtmgdyqYc<2h&?N)69F|4Wz$>6PgsIa9(F-k;#uQ| z2YM=_eU=yms$W$yM|LOUf(6}B9gk?eSu}!0pq>&-cbqdRz4_F@`1ye`%{Coi^@&VN z)StF0+sbfC!1&89h72tHl?AL4I-=5Au7GMXa6O2HYh&DJ03Je8Hi*S^ucE>oLkC;9 z>o*0r1c(6I=GZ>k)BMp%6LjKd5< zS0l$!6kM>2j3PgPC%OUGleeY7Q(laO;obH_i#9Zam7Z2OufmRUAohH+Cq&i#kS*u< z=(cToA$gdfxngkAriW=WrslN?x`Crwff>t9G_%t^YU;U?xox_lk_O!mVHD1Ha^&Cn zrp(T$L@GOCL+9*GTFDTC9QtE7I8X`Nq=yREMn1;x$9^`rYaLthhozs??*d#mfyX`8 z{`eP|4%B~$!5DKNq=oy%?_v-r%0^tH5SRSm%{CY5Z+9$5iz5zIcp9S}e_WE%j!81$ zQcb|bVJ1F~A)3%kr2M5<=U29FVCkeE0eE%DM5Nj!q^i@|rf~fRIHEsW@WrH4e5<4) zj(sysPsTwnys^S6tC~Xy9Y*(ZaK}*iVP*n7nHHEa);sTX@-inG3f5zf4LSN4J5BFj zMHIuRA9|%VBqcza2_D~~(!Hf%`FW=%m%5YJy3|djs@SJvdU2k z*aZC*mnYcR6}xNhY-P)tBsg{_t2~Q1>V6S$>^N@3$}uT2RsGQ z6bX@;7L-E8cC!$UKS@V5s4vS5VI4_*up($Sk;&!e0gF47~Wfkwl<{8;X@zmzKwhZT^_2_!zcQ7Q1oV|~JzL?06ae1L; zTQZ7}CMIn=pz6`^USr#XV)R4?YfFQ!I}Hec54WsFeA3ZJ*A{tc(~-I|GNa z@@MD;d-4R!l)WLUn#-WTrfV{pb&z_eN|CwdCtdH@qP4ef-AJ7w%*`Za%{8unLsD?3 zg^;U3SMf4w8#-WvY1f>W2?ett2B&1OsiG{)4ENA-#0fn&zO3tN?Ec?lXV3)m#PtnG%GuFbyfb z{#f3)gVcO>Ns(TQ`tU0rI3}>nbMmsD~N9E;ILmRe>yp(3chMM4_$fABFnhZAR zHv(PMrq<(-CwT;Ll42wxMNfsCU?G|nj6a0}l_@%AX%IXmOEsrSJ8~pp?ME{e?}qp$ z1mUZQE_^zgZeJL1{SRC!P}S*=*mUAG_{4xD%7h17vKY*H=3w+J4fcPjL{~CS$5A+E zgHv`!%>mq)rW?NzRh8pzH>W!wxBI{(f!d(^7Ut?dZUN;(@C8D z!@uJpI$j>4&)~MQ-*|{d@DO#LFxbJ&nNB=|cX*njr1{Lm*hcj+Z4uwBokkQ z7-N5{H3}C74B6G45uvv|iVs>Orhy#~ryu$sw@Fk1)&!XX2hIkR9L%awD3vSNrw?w| zA}y_@|8KTl$?4&(?N{g>Td+>EQw7#iv6)Bv^)zj^s;Es%F6AmY_bt+yh?OWYcF_`2 zpA@iY045QnQVaRB^d)4ineTnnvhvjzHDn>Ltn^Xz7R)XziDbu4gO1S#x6YC*Y!GER z%}REfO1BUW;66PO?tfgS6io}x)8UAP&0=fO$0+s^k)(X*&^m0}XRt9!HhS%POe_9U z)hnr8RsCl|tC^8H!I$jN9Yh;U7o$4_HyL~gH$&%EojQXS7MIgy=x3@~C+#F6GF;EZ z%P}h+)wycZxgc|%Sil&~_g5FQ18E~|&tI3;C=7$xT@T$wDTPkIBNTd`Z1z0ao}Ndh zA>%He7r_&WWrnkHJi|l%gsi|o41~FysLDy};*X@cUx zMGMp>zG)~MZv~7doza9tRl{3JBofZ3Lf0Ywt4wmMs<3cTT+nE;99Ime^cqQ%a`hzC zsIXK%(}cjt9-&8WmI}8EPgciWhCJ<8JgXAB3RX3Bmp(&x>C<(WK54kg z+Z?RK0|N5VD5bE%>1hqP;xk={hD=<^+N%9QsD3iS&&bDJt@t1$D#KT>NhX<%`^iz>{1Q~DziPqcp0ElkTSfVhEW?>%KGqvzG;|9&(ADJMUkS%$Bb|$#;|E} zw*v|b_1E^71WF?DXF2NT=}LOO8of8CTE!m=pr3YpIlpl-JY)_z5;CWV`rUm^IAJ6g zE7j4HurtA&GLCWy<=`w)KQ0H24(OK?h-Fm710_{Ga{RH30VRMPDhmCP0R!v;^I?0kasplI zlLHJRZDHga6rLosz{uADQ1mTAJ1d%=8`7+>Kuy`6^@);Q@8=`xbmacBp=d0Ds< zv@_1OgfN`FL;zaFCJvc}bexi$X)z3i)03Q=wD1@u|Fq;JQvM|80j!*0l22PJ@O*MN z+IIXo4v^jZKZ7`LNU478kL0M?OgV`wt<6!hg~=E2CWg+C-zs2rr`1eFdddp!bm7Ye z?Y{n4Z`>$*q)L{8YX5jP1c}4bir)m0FwWXY%Q@Cn=G$ho(MnxvW;C(h{g6q)j_ik3 z`@~8w0E3=za2J~Q$BJ7~S3y$rT96cd7bK+|oCxFq*q_V^F08w@+%0D6=Z+N<6)ley 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 b_1|AM2FkghRmVzXxWDZ7{<{9ZQW*IEzf1`t literal 0 HcmV?d00001 diff --git a/Libraries/NGit/NSch.xml b/Libraries/NGit/NSch.xml new file mode 100644 index 0000000..29c0627 --- /dev/null +++ b/Libraries/NGit/NSch.xml @@ -0,0 +1,1204 @@ + + + + NSch + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Enable the agent forwarding. + Enable the agent forwarding. + +
+ + Enable the X11 forwarding. + Enable the X11 forwarding. + + 6.3.1. Requesting X11 Forwarding + + + SetEnv(string, string) + SetEnv(byte[], byte[]) + + + Set the environment variable. + + Set the environment variable. + If name and value are needed to be passed + to the remote in your faivorite encoding,use + SetEnv(byte[], byte[]) + . + + A name for environment variable. + A value for environment variable. + 6.4 Environment Variable Passing + + + Set the environment variable. + Set the environment variable. + A name of environment variable. + A value of environment variable. + SetEnv(string, string) + 6.4 Environment Variable Passing + + + Allocate a Pseudo-Terminal. + Allocate a Pseudo-Terminal. + + 6.2. Requesting a Pseudo-Terminal + + + Set the terminal mode. + Set the terminal mode. + + + + Change the window dimension interactively. + Change the window dimension interactively. + terminal width, columns + terminal height, rows + terminal width, pixels + terminal height, pixels + 6.7. Window Dimension Change Message + + + Set the terminal type. + + Set the terminal type. + This method is not effective after Channel#connect(). + + terminal type(for example, "vt100") + SetPtyType(string, int, int, int, int) + + + + Set the terminal type. + + Set the terminal type. + This method is not effective after Channel#connect(). + + terminal type(for example, "vt100") + terminal width, columns + terminal height, rows + terminal width, pixels + terminal height, pixels + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This method will check if the given string can be expanded to the + unique string. + + + This method will check if the given string can be expanded to the + unique string. If it can be expanded to mutiple files, SftpException + will be thrown. + + the returned string is unquoted. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Returns the total number of bytes input so far. + Returns the total number of bytes input so far. + + + Returns the total number of bytes output so far. + Returns the total number of bytes output so far. + + + + + + + + + + + + + + + + + + Returns the total number of bytes input so far. + Returns the total number of bytes input so far. + + + Returns the total number of bytes output so far. + Returns the total number of bytes output so far. + + + + + + + + + + + + diff --git a/Libraries/NGit/Sharpen.dll b/Libraries/NGit/Sharpen.dll new file mode 100644 index 0000000000000000000000000000000000000000..ec3b6d7079f126295f988c5e9a3f96ebdaaae8a7 GIT binary patch literal 127488 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 +4E;c$5zi=$ghqSE)*GNlJw-{+3_=H zR@aKmn;##~7cZ=yFN|L(6wh3k7#&+%J5PCWtr(r3oQTeyIXial+}PM;F}eU=e;&Lp z3$Lg3`~81{+`m=idZOh|sQv`6f2(-?1&H<|@!t&M_jcU<34VWk`2C4o_}dn`Tvy%|@Vd_%yz4~jhb5(wwW%wObeBfNYQ%~&vlhcXaPlit+N zc4{R4i^-=(Vg-!;)qkf(!WZ68RHAJ@bS!tU&yxOH`xC3@&*vu!6X(WIED^f!cw#9z zpg(=fNd6B`^J%0`4PNcj@v#5*uaq8%bNk%Xxm^NzpTu?Fsq?l+hw0ZjgTE`4!v|45&)HlwWD|2NKO2H?P5fC>|>_A`8FaQ|0? znrHvV55iw(zo+S^?{LBwiL@W%dybAT$(V=3K(M7RPt;alLzTf@_$KPW_^q!l++$!Y z;jYnV-Fi%emn}Yu(3flLd{)8tXKsX_583$hp(=KQoAwpX4$%Cdet`Rve?JxsB%uQ5esA)}GWbsh{r?;T{}%>9 BqFw+1 literal 0 HcmV?d00001 diff --git a/Vss2Git/AbstractVcsWrapper.cs b/Vss2Git/AbstractVcsWrapper.cs index 6816daa..c5b8e95 100644 --- a/Vss2Git/AbstractVcsWrapper.cs +++ b/Vss2Git/AbstractVcsWrapper.cs @@ -259,17 +259,21 @@ public int Execute(ProcessStartInfo startInfo, out string stdout, out string std } public virtual string QuoteRelativePath(string path) + { + return Quote(RelativePath(path)); + } + + public virtual string RelativePath(string path) { if (path.StartsWith(outputDirectory)) { path = path.Substring(outputDirectory.Length); if (path.StartsWith("\\") || path.StartsWith("/")) - { path = path.Substring(1); - } } - return Quote(path); + return path; } + /// /// Puts quotes around a command-line argument if it includes whitespace /// or quotes. diff --git a/Vss2Git/GitWrapper.cs b/Vss2Git/GitWrapper.cs index 03f286c..8ac7530 100755 --- a/Vss2Git/GitWrapper.cs +++ b/Vss2Git/GitWrapper.cs @@ -21,6 +21,9 @@ using System.Text; using System.Text.RegularExpressions; using System.Threading; +using NGit; +using NGit.Api; +using NGit.Dircache; namespace Hpdi.Vss2Git { @@ -31,11 +34,11 @@ namespace Hpdi.Vss2Git class GitWrapper : AbstractVcsWrapper { public static readonly string gitMetaDir = ".git"; - public static readonly string gitExecutable = "git"; private List addQueue = new List(); private List deleteQueue = new List(); private List dirDeleteQueue = new List(); + private Git git; private Encoding commitEncoding = Encoding.UTF8; @@ -54,15 +57,15 @@ public bool ForceAnnotatedTags public GitWrapper(string outputDirectory, Logger logger, Encoding commitEncoding, bool forceAnnotatedTags) - : base(outputDirectory, logger, gitExecutable, gitMetaDir) + : base(outputDirectory, logger, null, gitMetaDir) { this.commitEncoding = commitEncoding; this.forceAnnotatedTags = forceAnnotatedTags; } - public override string QuoteRelativePath(string path) + public override string RelativePath(string path) { - return base.QuoteRelativePath(path).Replace('\\', '/'); // cygwin git compatibility + return base.RelativePath(path).Replace('\\', '/'); // cygwin git compatibility } public override void Init(bool resetRepo) @@ -72,7 +75,7 @@ public override void Init(bool resetRepo) DeleteDirectory(GetOutputDirectory()); Thread.Sleep(0); Directory.CreateDirectory(GetOutputDirectory()); - VcsExec("init"); + git = Git.Init().SetDirectory(GetOutputDirectory()).Call(); } } @@ -91,33 +94,20 @@ public override bool Add(string path) return true; } - private bool DoAdd(string paths) - { - var startInfo = GetStartInfo("add --" + paths); - - // add fails if there are no files (directories don't count) - bool result = ExecuteUnless(startInfo, "did not match any files"); - if (result) SetNeedsCommit(); - return result; - } - private bool DoAdds() { - bool rc = false; - string paths = ""; + if (addQueue.Count == 0) + return false; + + var add = git.Add(); foreach (string path in addQueue) { - if (paths.Length > 8000) - { - rc |= DoAdd(paths); - paths = ""; - } - paths += " " + QuoteRelativePath(path); + add.AddFilepattern(RelativePath(path)); } addQueue.Clear(); - if (paths.Length > 1) - rc |= DoAdd(paths); - return rc; + add.Call(); + SetNeedsCommit(); + return true; } public override bool AddDir(string path) @@ -134,12 +124,9 @@ public override bool NeedsCommit() public override bool AddAll() { - var startInfo = GetStartInfo("add -A"); - - // add fails if there are no files (directories don't count) - bool result = ExecuteUnless(startInfo, "did not match any files"); - if (result) SetNeedsCommit(); - return result; + git.Add().AddFilepattern(".").Call(); + SetNeedsCommit(); + return true; } public override void RemoveFile(string path) @@ -148,28 +135,23 @@ public override void RemoveFile(string path) SetNeedsCommit(); } - private void DoDelete(string paths) + private bool DoDeletes() { - VcsExec("rm -r -f --" + paths); // is always recursive - } + if (deleteQueue.Count == 0) + return false; - private void DoDeletes() - { - string paths = ""; + var delete = git.Rm(); foreach (string path in deleteQueue) { - if (paths.Length > 8000) - { - DoDelete(paths); - paths = ""; - } - paths += " " + QuoteRelativePath(path); + delete.AddFilepattern(RelativePath(path)); } deleteQueue.Clear(); - if (paths.Length > 1) - DoDelete(paths); + delete.Call(); + SetNeedsCommit(); CleanupEmptyDirs(); + return true; } + private void CleanupEmptyDirs() { foreach (string dir in dirDeleteQueue) @@ -194,7 +176,8 @@ public override void RemoveEmptyDir(string path) public override void Move(string sourcePath, string destPath) { - VcsExec("mv -- " + QuoteRelativePath(sourcePath) + " " + QuoteRelativePath(destPath)); + git.Rm().AddFilepattern(RelativePath(sourcePath)).Call(); + git.Add().AddFilepattern(RelativePath(destPath)).Call(); SetNeedsCommit(); } @@ -206,123 +189,54 @@ public override void MoveEmptyDir(string sourcePath, string destPath) public override bool DoCommit(string authorName, string authorEmail, string comment, DateTime localTime) { - TempFile commentFile; - - var args = "commit"; - AddComment(comment, ref args, out commentFile); - - using (commentFile) - { - var startInfo = GetStartInfo(args); - startInfo.EnvironmentVariables["GIT_AUTHOR_NAME"] = authorName; - startInfo.EnvironmentVariables["GIT_AUTHOR_EMAIL"] = authorEmail; - startInfo.EnvironmentVariables["GIT_AUTHOR_DATE"] = GetUtcTimeString(localTime); - - // also setting the committer is supposedly useful for converting to Mercurial - startInfo.EnvironmentVariables["GIT_COMMITTER_NAME"] = authorName; - startInfo.EnvironmentVariables["GIT_COMMITTER_EMAIL"] = authorEmail; - startInfo.EnvironmentVariables["GIT_COMMITTER_DATE"] = GetUtcTimeString(localTime); - - // ignore empty commits, since they are non-trivial to detect - // (e.g. when renaming a directory) - return ExecuteUnless(startInfo, "nothing to commit"); - } - } - - public override void Tag(string name, string taggerName, string taggerEmail, string comment, DateTime localTime) - { - TempFile commentFile; + var status = git.Status().Call(); - var args = "tag"; - // tools like Mercurial's git converter only import annotated tags - // remark: annotated tags are created with the git -a option, - // see e.g. http://learn.github.com/p/tagging.html - if (forceAnnotatedTags) + if (status.IsClean()) { - args += " -a"; + Console.WriteLine("Skipping empty commit"); + return false; } - AddComment(comment, ref args, out commentFile); - // tag names are not quoted because they cannot contain whitespace or quotes - args += " -- " + name; - - using (commentFile) - { - var startInfo = GetStartInfo(args); - startInfo.EnvironmentVariables["GIT_COMMITTER_NAME"] = taggerName; - startInfo.EnvironmentVariables["GIT_COMMITTER_EMAIL"] = taggerEmail; - startInfo.EnvironmentVariables["GIT_COMMITTER_DATE"] = GetUtcTimeString(localTime); + var person = new PersonIdent(authorName, authorEmail, localTime, TimeZoneInfo.Local); - ExecuteUnless(startInfo, null); - } - } + git.Commit() + .SetMessage(comment) + .SetAuthor(person) + .SetCommitter(person) + .Call(); - private void SetConfig(string name, string value) - { - VcsExec("config " + name + " " + Quote(value)); + return true; } - private void AddComment(string comment, ref string args, out TempFile tempFile) + public override void Tag(string name, string taggerName, string taggerEmail, string comment, DateTime localTime) { - tempFile = null; - if (!string.IsNullOrEmpty(comment)) - { - // need to use a temporary file to specify the comment when not - // using the system default code page or it contains newlines - if (commitEncoding.CodePage != Encoding.Default.CodePage || comment.IndexOf('\n') >= 0) - { - Logger.WriteLine("Generating temp file for comment: {0}", comment); - tempFile = new TempFile(); - tempFile.Write(comment, commitEncoding); - - // temporary path might contain spaces (e.g. "Documents and Settings") - args += " -F " + Quote(tempFile.Name); - } - else - { - args += " -m " + Quote(comment); - } - } - else - { - args += " --allow-empty-message --no-edit -m \"\""; - } + git.Tag() + .SetMessage(comment) + .SetTagger(new PersonIdent(taggerName, taggerEmail, localTime, TimeZoneInfo.Local)) + .SetName(name) + .Call(); } - private static string GetUtcTimeString(DateTime localTime) + private void SetConfig(string name, string value) { - // convert local time to UTC based on whether DST was in effect at the time - var utcTime = TimeZoneInfo.ConvertTimeToUtc(localTime); - - // format time according to ISO 8601 (avoiding locale-dependent month/day names) - return utcTime.ToString("yyyy'-'MM'-'dd HH':'mm':'ss +0000"); + int pos = name.IndexOf('.'); + string section = name.Substring(0, pos); + name = name.Substring(pos + 1); + git.GetRepository().GetConfig().SetString(section, null, name, value); } - private static Regex lastCommitTimestampRegex = new Regex("^Date:\\s*(\\S+)", RegexOptions.Multiline); - public override DateTime? GetLastCommit() { - if (Directory.Exists(Path.Combine(GetOutputDirectory(), gitMetaDir)) && FindExecutable()) + if (git == null) + return null; + + foreach (var commit in git.Log().SetMaxCount(1).Call()) { - try { - var startInfo = GetStartInfo("log -n 1 --date=raw"); - string stdout, stderr; - int exitCode = Execute(startInfo, out stdout, out stderr); - if (exitCode == 0) - { - var m = lastCommitTimestampRegex.Match(stdout); - if (m.Success) - { - long unixTimeStamp = long.Parse(m.Groups[1].Value); - DateTime dt = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc); - dt = dt.AddSeconds(unixTimeStamp).ToLocalTime(); - return dt; - } - } - } catch (Exception ) - { - } + long unixTimeStamp = commit.CommitTime; + DateTime dt = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc); + return dt.AddSeconds(unixTimeStamp).ToLocalTime(); } + return null; } diff --git a/Vss2Git/Properties/Resources.Designer.cs b/Vss2Git/Properties/Resources.Designer.cs index 9bf49ab..0f0e5d2 100755 --- a/Vss2Git/Properties/Resources.Designer.cs +++ b/Vss2Git/Properties/Resources.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.225 +// Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/Vss2Git/VcsExporter.cs b/Vss2Git/VcsExporter.cs index e5520e4..95420fb 100644 --- a/Vss2Git/VcsExporter.cs +++ b/Vss2Git/VcsExporter.cs @@ -118,16 +118,19 @@ public void ExportToVcs(string repoPath, DateTime? continueAfter) string vcs = vcsWrapper.GetVcs(); - while (!vcsWrapper.FindExecutable()) + if (vcs != null) { - var button = MessageBox.Show(vcs + " not found in PATH. " + - "If you need to modify your PATH variable, please " + - "restart the program for the changes to take effect.", - "Error", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error); - if (button == DialogResult.Cancel) + while (!vcsWrapper.FindExecutable()) { - workQueue.Abort(); - return; + var button = MessageBox.Show(vcs + " not found in PATH. " + + "If you need to modify your PATH variable, please " + + "restart the program for the changes to take effect.", + "Error", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error); + if (button == DialogResult.Cancel) + { + workQueue.Abort(); + return; + } } } diff --git a/Vss2Git/Vss2Git.csproj b/Vss2Git/Vss2Git.csproj index f0505f4..a5dcd12 100755 --- a/Vss2Git/Vss2Git.csproj +++ b/Vss2Git/Vss2Git.csproj @@ -10,7 +10,7 @@ Properties Hpdi.Vss2Git Vss2Git - v3.5 + v4.0 512 Vss2Git.ico @@ -32,6 +32,7 @@ false false true + true @@ -53,6 +54,21 @@ AllRules.ruleset + + ..\Libraries\NGit\ICSharpCode.SharpZipLib.dll + + + ..\Libraries\NGit\Mono.Security.dll + + + ..\Libraries\NGit\NGit.dll + + + ..\Libraries\NGit\NSch.dll + + + ..\Libraries\NGit\Sharpen.dll + 3.5 diff --git a/Vss2Git/app.config b/Vss2Git/app.config index 9aeb387..4508274 100755 --- a/Vss2Git/app.config +++ b/Vss2Git/app.config @@ -1,23 +1,23 @@ - + - -
+ +
- + $ - + - + localhost @@ -41,13 +41,13 @@ git - + - + - + True @@ -65,14 +65,14 @@ True - + - + False - + diff --git a/VssPhysicalLib/RecordException.cs b/VssPhysicalLib/RecordException.cs index a30690e..a901607 100755 --- a/VssPhysicalLib/RecordException.cs +++ b/VssPhysicalLib/RecordException.cs @@ -11,30 +11,30 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */ - -using System; - -namespace Hpdi.VssPhysicalLib -{ - /// - /// Base class for exceptions thrown when an invalid record is read. - /// - /// Trevor Robinson - public class RecordException : Exception - { - public RecordException() - { - } - - public RecordException(string message) - : base(message) - { - } - - public RecordException(string message, Exception innerException) - : base(message, innerException) - { - } - } -} + */ + +using System; + +namespace Hpdi.VssPhysicalLib +{ + /// + /// Base class for exceptions thrown when an invalid record is read. + /// + /// Trevor Robinson + public class RecordException : Exception + { + public RecordException() + { + } + + public RecordException(string message) + : base(message) + { + } + + public RecordException(string message, Exception innerException) + : base(message, innerException) + { + } + } +} diff --git a/VssPhysicalLib/RecordTruncatedException.cs b/VssPhysicalLib/RecordTruncatedException.cs index 3f30bef..5b3ca36 100755 --- a/VssPhysicalLib/RecordTruncatedException.cs +++ b/VssPhysicalLib/RecordTruncatedException.cs @@ -1,35 +1,35 @@ -/* Copyright 2009 HPDI, LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -using System; - -namespace Hpdi.VssPhysicalLib -{ - /// - /// Exception thrown when a truncated record is found. - /// - /// Trevor Robinson - public class RecordTruncatedException : RecordException - { - public RecordTruncatedException() - { - } - - public RecordTruncatedException(string message) - : base(message) - { - } - } -} +/* Copyright 2009 HPDI, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; + +namespace Hpdi.VssPhysicalLib +{ + /// + /// Exception thrown when a truncated record is found. + /// + /// Trevor Robinson + public class RecordTruncatedException : RecordException + { + public RecordTruncatedException() + { + } + + public RecordTruncatedException(string message) + : base(message) + { + } + } +} From 458b7392e4b0e44e5d736b49e9d035feb042aa81 Mon Sep 17 00:00:00 2001 From: Pieter van Ginkel Date: Mon, 7 Dec 2015 17:58:31 +0100 Subject: [PATCH 2/2] Fix tracking of changes. All changes are now correctly checked, including edits that don't modify the file. This prevents us from having to do a status to verify whether we would create an empty commit. This now builds a project of 6000 files with 5000 commits under 10 minutes. --- Vss2Git/AbstractVcsWrapper.cs | 2 +- Vss2Git/GitWrapper.cs | 30 ++++++++++++++--------- Vss2Git/MainForm.Designer.cs | 2 ++ Vss2Git/MainForm.resx | 20 ++++++++-------- Vss2Git/VcsExporter.cs | 45 ++++++++++++++++++++++++++++++++--- 5 files changed, 74 insertions(+), 25 deletions(-) diff --git a/Vss2Git/AbstractVcsWrapper.cs b/Vss2Git/AbstractVcsWrapper.cs index c5b8e95..ad6bafa 100644 --- a/Vss2Git/AbstractVcsWrapper.cs +++ b/Vss2Git/AbstractVcsWrapper.cs @@ -371,7 +371,7 @@ public virtual bool NeedsCommit() return needsCommit; } - public void SetNeedsCommit() + public virtual void SetNeedsCommit() { needsCommit = true; } diff --git a/Vss2Git/GitWrapper.cs b/Vss2Git/GitWrapper.cs index 8ac7530..0d25036 100755 --- a/Vss2Git/GitWrapper.cs +++ b/Vss2Git/GitWrapper.cs @@ -18,6 +18,7 @@ using System.ComponentModel; using System.Diagnostics; using System.IO; +using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading; @@ -106,7 +107,7 @@ private bool DoAdds() } addQueue.Clear(); add.Call(); - SetNeedsCommit(); + base.SetNeedsCommit(); return true; } @@ -124,15 +125,14 @@ public override bool NeedsCommit() public override bool AddAll() { - git.Add().AddFilepattern(".").Call(); - SetNeedsCommit(); + // git.Add().AddFilepattern(".").Call(); + // base.SetNeedsCommit(); return true; } public override void RemoveFile(string path) { deleteQueue.Add(path); - SetNeedsCommit(); } private bool DoDeletes() @@ -147,8 +147,8 @@ private bool DoDeletes() } deleteQueue.Clear(); delete.Call(); - SetNeedsCommit(); CleanupEmptyDirs(); + base.SetNeedsCommit(); return true; } @@ -166,7 +166,6 @@ public override void RemoveDir(string path, bool recursive) { deleteQueue.Add(path); // is always recursive dirDeleteQueue.Add(path); - SetNeedsCommit(); } public override void RemoveEmptyDir(string path) @@ -178,7 +177,7 @@ public override void Move(string sourcePath, string destPath) { git.Rm().AddFilepattern(RelativePath(sourcePath)).Call(); git.Add().AddFilepattern(RelativePath(destPath)).Call(); - SetNeedsCommit(); + base.SetNeedsCommit(); } public override void MoveEmptyDir(string sourcePath, string destPath) @@ -187,15 +186,24 @@ public override void MoveEmptyDir(string sourcePath, string destPath) Directory.Move(sourcePath, destPath); } + public override void SetNeedsCommit() + { + // Suppress explicit calls. + } + public override bool DoCommit(string authorName, string authorEmail, string comment, DateTime localTime) { +#if false + // enable this when you find empty commits or uncommitted changes; this will throw on that commit + var status = git.Status().Call(); if (status.IsClean()) - { - Console.WriteLine("Skipping empty commit"); - return false; - } + throw new InvalidOperationException("Expected changes"); + + if (status.GetModified().Count > 0 || status.GetMissing().Count > 0 || status.GetUntracked().Count > 0 || status.GetConflicting().Count > 0) + throw new InvalidOperationException("Have modified, missing, untracked or conflicting files"); +#endif var person = new PersonIdent(authorName, authorEmail, localTime, TimeZoneInfo.Local); diff --git a/Vss2Git/MainForm.Designer.cs b/Vss2Git/MainForm.Designer.cs index c092b4e..b253c7f 100755 --- a/Vss2Git/MainForm.Designer.cs +++ b/Vss2Git/MainForm.Designer.cs @@ -129,6 +129,7 @@ private void InitializeComponent() // // vssDirButton // + this.vssDirButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.vssDirButton.Image = ((System.Drawing.Image)(resources.GetObject("vssDirButton.Image"))); this.vssDirButton.Location = new System.Drawing.Point(531, 17); this.vssDirButton.Name = "vssDirButton"; @@ -308,6 +309,7 @@ private void InitializeComponent() // // outDirButton // + this.outDirButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.outDirButton.Image = ((System.Drawing.Image)(resources.GetObject("outDirButton.Image"))); this.outDirButton.Location = new System.Drawing.Point(531, 17); this.outDirButton.Name = "outDirButton"; diff --git a/Vss2Git/MainForm.resx b/Vss2Git/MainForm.resx index 191e9bb..fd64d16 100755 --- a/Vss2Git/MainForm.resx +++ b/Vss2Git/MainForm.resx @@ -112,12 +112,12 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAYRJREFUOE+t @@ -130,10 +130,10 @@ 9vvBYB0GAON8RJ2AjZv6ozVYhvEF1jp/zGyOXvoAAAAASUVORK5CYII= - + 17, 17 - + 132, 17 @@ -160,19 +160,19 @@ 9vvBYB0GAON8RJ2AjZv6ozVYhvEF1jp/zGyOXvoAAAAASUVORK5CYII= - + 241, 17 - + 404, 17 - + 569, 17 - + 746, 17 - + 924, 17 diff --git a/Vss2Git/VcsExporter.cs b/Vss2Git/VcsExporter.cs index 95420fb..6aa89fc 100644 --- a/Vss2Git/VcsExporter.cs +++ b/Vss2Git/VcsExporter.cs @@ -99,7 +99,7 @@ public VcsExporter(WorkQueue workQueue, Logger logger, public void ExportToVcs(string repoPath, DateTime? continueAfter) { this.continueAfter = continueAfter; - workQueue.AddLast(delegate(object work) + workQueue.AddLast(delegate (object work) { var stopwatch = Stopwatch.StartNew(); @@ -929,7 +929,8 @@ private bool WriteRevisionTo(string physical, int version, string destPath) // propagate exceptions here (e.g. disk full) to abort/retry/ignore using (contents) { - WriteStream(contents, destPath); + if (!WriteStream(contents, destPath)) + return false; } // try to use the first revision (for this branch) as the create time, @@ -950,15 +951,53 @@ private bool WriteRevisionTo(string physical, int version, string destPath) return true; } - private void WriteStream(Stream inputStream, string path) + private bool WriteStream(Stream inputStream, string path) { Directory.CreateDirectory(Path.GetDirectoryName(path)); + // check whether the new contents actually differs from what's on disk + + if (File.Exists(path) && inputStream.Length == new FileInfo(path).Length) + { + using (var outputStream = File.OpenRead(path)) + { + byte[] inBuffer = new byte[4096]; + byte[] outBuffer = new byte[4096]; + + bool differs = false; + + while (!differs) + { + int read = inputStream.Read(inBuffer, 0, inBuffer.Length); + if (read <= 0) + break; + + outputStream.Read(outBuffer, 0, outBuffer.Length); + + for (int i = 0; i < read; i++) + { + if (inBuffer[i] != outBuffer[i]) + { + differs = true; + break; + } + } + } + + if (!differs) + return false; + + inputStream.Seek(0, SeekOrigin.Begin); + } + } + using (var outputStream = new FileStream( path, FileMode.Create, FileAccess.Write, FileShare.None)) { streamCopier.Copy(inputStream, outputStream); } + + return true; } private delegate void RenameDelegate(string sourcePath, string destPath);