From 82c1fbdc7bd197dcabcf0262d1d7c7137c3c0d95 Mon Sep 17 00:00:00 2001 From: Bill Jacobs Date: Thu, 26 May 2016 10:37:25 -0700 Subject: [PATCH] Made fixInsertion return the new root This changes RedBlackNode.fixInsertion to return the root of the resulting tree. --- README.md | 2 +- RedBlackNode.jar | Bin 36972 -> 39254 bytes .../btrekkie/red_black_node/RedBlackNode.java | 51 +++++++++++++----- .../github/btrekkie/tree_list/TreeList.java | 7 +-- 4 files changed, 40 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 4d6f181da..b0d001921 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ augmented) size. * Tested in Java 6.0 and 7.0. It might also work in Java 5.0. -# Limitations: +# Limitations * Augmentations that depend on information stored in a node's ancestors are not (easily) supported. For example, augmenting each node with the number of nodes in the left subtree is not (easily and efficiently) supported, because diff --git a/RedBlackNode.jar b/RedBlackNode.jar index 5351b7e7ce68973af6005adcc31aed919255359e..e6a079f0450a28835a8963953b2d53cb705f57d6 100644 GIT binary patch delta 18303 zcmY(qV{m0%v^AWhW81cEcGR)Wj;#~>bZpzUla6iMPEKs6(Xx=N?`Degs0Z&r;uuV9{DB}?>y7(3nTcpDL*ZU0Qvj!a8^np)| zDL(>(HK|7oQDBGw<29b#=b5={81sOE3(9V<|2udm@5YIxB_6|-rz;t+$S;Js^?Bg6 z;U4RX_-}iN_j%o0AFB>;!8ORjFmKO*B%*H+AIvKbPJ`e!R?5Nq7MJnVFMeH1MZ-tf z=cv91HitngJSRm&CPXrhH{Jw$%!L;^ZsJqdGzlv!LN4FtF5Mt;a0Gy{tQ)9OtEf^C z4pwh2a>RzC-2xq15dCF`0c2-8G>E<+ai$F5_+ z&c1gPkeh!H@d)2?8+$sl+{fM`kntU9;FsE6zh3wv5bS`&Fv-6$N}oI%W$xna$=$5{ zZr*o((&`?Bt*8{<3x6&bkuSQZ>bV1D zs1Ar;Lm^hvQtV1F(+@IFufI3c{nlW^Z#6JVDX!^%mDc4`byJ{Mr-s5pRa9oS_4%l`{ItUySZFxiTgac7S<9>jpa25r zci!UZT>Z>rN=NEzVA_q=YP^ON7R*{l?vpAIuR*_QFt?yxBr)N)yNY;BVyb7gSR^IDbCr6WVY^&O7f zLYknLCBz72yZ3^FhdBLxb@UuOcT8L&oR!Y4BR9qAE1UIUmH~}b-aiFoT})(92%@e! z5Sp}0?+v?vhN%_}&Su}O+ckF+Khqtqt zAytBqLMk^3ravSjFN|oe!F@>pz@g?Jj|p$eRx)Zg!HN;e4)P?XsO>*5+S+EtSIZx} zm4B7+Npdec0I#-YHtPpECzam)x~KJEOnpBoWz!XOQSB;@Y#zw@hWuT42`sE^Pr_PZ zXx8}%RxFF^N_6B;I_W4nw;^H@93sUtH8YG4^@6W9c3lW>$%OU0Y1S_4-tW%_m)lLe zaAK!PPnWK|S`SH@S_yAp*H_Ad^Z6<2^pbVF(w zGTct&X+0qXcm#WI#45Kz+(ljMS>~5$n5(>G5a}dWZJLrOs3Tp3kWF(j;Q>unn0%dI zq$G=P?*Z)YAZ;J`+3(Uf;nRgksBn{nmx~GLlA5L1795y;?%y$n)nyQw>q_srb|+n|8bJAov4!fBv6t_$q<3ergp|I zF3UbJp6VKJe{PcLG7^c$D8bQXVL9+1eiZ%qo~nRef>2fz@wtQM)a|E%DHO)9!ICFZPPv^S5dCp(d;SB-dxgXXl}(w>8Jd z>#kKQ4@{X(Rwy0<>!~J+0Y3}KkK;aFm%h7BEOOme>M7~dWxVroto;di(A6aXVJ#jY z!Q2}VZF}ZJvEvM<4$)_tGR0tp&HTiyyLs$miqE>tnd@j{S|QHbCB%VUiOKVNdAw_W zK+X{cEVu^vH(TgyS*p31=v&&p`$JfBWa8_Yg-dnB1QUr2fLS zS%2>;Q8RMAV!lqKuF7zGtjan-2>(^pT>&8bnZ<9F{wtkgk4SBIYiVJLFLop~CSB5$ z2KV)`=*b<>UQpyWChiYLc8I!Zinz`RiwV6Kpha5LQbA?7+U)7yJU0BMXcx7~QRS|IYbuS-sHjw31!zd1xk`hK$GSKTZ}qs3 z&y3Y+IHpFA?yM-{Cf4igLO~%V0$=zWtw_$vwPI0Mx2dNW@xy#Qe0wgk$_^4RcvuAf zlF@Z+JhT8R#U^o!LpH(#=^~(P*ZSm>0(S|*Qt)o#+uhh;2fpT(wFSt@z8*p0=F{Vl?fMtx`gHRha zN=FkJ47Zl&bp-R=(H)IyOQBi8#oOGhzxo;su0!2H!Ys9wJ(zqJ#6Wfrsuu55Y zeP)D|sM6+9kKg4lLwmM4V=!leEn!$8jLGeMC8}TNo% ztw046=rYWp$H1_{NWIR7Q=?#06MB+#fHMvNq9GQ=Q@OkB^njiAv*GxL#sILerWwKD zJATtLyawR$@d^gDdovf$GRA-aArq$?tGq{dbzMO&A_M>DCIqwXf3KP&h+yOyV}llv#n*9vRa+yOp67Jcvk#$X&w0}w#D z$W>vi>%>2|Iw*T;*x1X;VCDi?Tm5nR#xHLTMoNJS^~OQZo34xj?M%9YUt3^`M|VAM z&%EOf)D6KE@H7BrIE#4-RkbiyEM{%irnkpfLaAI=EVHqK@Gps-2a zoGdV)Fju91_pg$PQlq`&Bz7msD##n9_Tm5yJ?L8-I!`)feyG$AX5Ud;270XF4!2}2 z^KnU$Bj`jr8hm$HAbghfo@E0sjI*t$IYbCX5**+6sJ8RqZ)E7lWw|}T8<6(>ZtqxI z>ST{dz>FJ+FAB1;)g3Sva1mAWkt!qO9|ry?o^(yXI7;ZweVIyvOC^yx7Dt0`YrKg76@=hq@$JfH?H7-MM#jJcbEqtpxpD6;%D;kRC$HOYaQg#$h+ z3ERZ67~N_{J37YY;P!b7Dz)W*m)23StS-srG}LWDD#^U!WkE5-Tr+KTcWkkNLf866 zRfl=xrWeiPACxZf{ejIao8Te=O8gsjCs8;Tqwx%l9_!;~Ycq5!W;uUHrdMbV{gmC& zZ^zYT{XuII+nSLm56B7h3L6+}TLPd#0=H?@K?_v7Zbguqw@Z%I)vBWdx(|ke;=TzE zlYX7&E%@tu@m`rnvnw}KY#HUpU(9sg9kZ>_w0$D8xnv$hW)@;Q8!!j$cGhOy%_xNe z?XG+}2dWDNrl*>#t73T)ZevD1zNiqq)Pp8IneYHM%_I<%>U=4^v^$Z@#y0Rj3Pb5e?4!BQsTPZ3HvO3l^SSP=IVngT)JLVNT>3R z=dsn=PNP+x6&+Gl#b>hc!>@p;-^l}qZl)y0$ayjBKj}YlOgeG;x!XvaxB4CShJ_W(rWrN#RWclLgTazZGnFia=Qqd1 z_pJGii4VEMMnVA&`E+(cscZ>}XQAhBl*nD2p7sFl> zlT8_TyiwF0#oiW7Mas^JaM7$Ebz`|ua=95r*tN@9ZD8)*-;X#l$7kI~AQ;r23^>Wh z3l5a1Q{6!DQXEdELwRB)Em18kPbTPlPV>@s1kf9J&=#~*;!+1>7 zxJ+{;N=+uFt}}t|LIKy3v3+%WS#OWsv;rAb3mFxm>L6iD>AKzPAWEUDkiK`yzET;g z5O+v9kf6{%%PPZI@^*XyHaNmwjti}6B4cUtej0AoeUQKl^{Dxyspn*L%*L|WpOVK2 z9LcVDMNCzm;tc4TpwpelwQXpi`d7NiA5dpWHN)`((j^(X9g7(yxHLA>{-tB%*jCvS z=?7DoT(u&r_5@<8v*YYBCNT`UVu0qGJ%t$2?{`Hp3!IuA8QbX$t@+douKziwoV zZ-O1sC?ZgkbWLvj`2ypN^VZjwZP|`xD8g6~_Q=#jlORl_)OEg4Cny+EJ3=XZ#cNdM z2&uSf2N;;f=MEMeUal;t@J7F+Bu;70MyRvqoJfEXXa1lI(fd1;`IQy)JQRvZDcJ6~ z1i4QPvzSfzYqB@^ykvFOTfXu%*0!LWk{X31bVJG4+I&S5z0E!3&}SMUXQK%ENJ zOnE*By>yXw@Y!5@Z(%y5)L#-Apzm4_(Rxbhm_s2`rz%CK?1m4owaG|?qn3NhU<D z6f@u-Ezrfy@3d7bB}dde$HdDW^7U@jwmTMcGn!*me!mMc)svUy0tFikE0k4$@k}q zk9dD&rIfa(ooS#LN1ip|XZlB_QqUA<5H_ztrqlEf|~`R z6c3WfFz89M^eVGArsz-C9h&%4wEr=}KZ0lq=@TSVVZqF#WoE=?c7yx|~mw7=VLmCHYoWMk0_&qra9Suvof(WY!>H4@)37f)x3t-E- zriO*8SgI1G%9vo>DjUw@9un!^x&i@7nX}~3(4`c)gI!g+`OTt7-(#T5UObnw(W7FizG7bxaD5KG6OuKlIl7?=^M6)9X zhjn;08O4iu38IGh4hd(5=|FPSG6Z6+?%jZNyQpe8HnL65`uY!{f3In;e{c6roj-vtGM3c!*?}a8kx5pG z1Y~{w`4MsN0aaB+{k0jcp~mbxK`yhBtaQ_s0P$VGuAsZma|q2ZUuSs;;jyj zw-GB2J=u7)g@*?hWwYQShU#;2uO7k((jS%zMZeeLII$x-tS2#ALA4DB zO{&qyC6zz_YRi%LqVg>yzyl#4MhL($dYFc5hlIDmq<{=BX}-e04co|<$UZv(L}D>f zP`?wG!UFGMu_LAE0tJ7NzG6tmjRG<~Ax5CPv#r2X!hOPBpe2Mr(3IGuBlF9J znjqz-Skmqkzkx3? zjj6<4GKQ8#m@g8tzRXxXiTEPYIQ|L#k7K`X$MU7q&d8%Spx8I}R!C#miQm)3gUh`w zw`?ZDt3N1_b~CCa5=7{@bs|dTtMax_+E~Pkh6+?nVkdey+NDh_<}$|pqUV9M>_Dzp z*ei1Rv_2p{yO6x=#q#5W%flr|U5zPcbCYDXD9D_`S%$X!5>gLc z`x{wvdhimDZ7CsUwiLpRuKS#~*85`M0f>5vtSZ}B%^@^TYX^r@j&RP^G(oZ{SEn3- zhQone@l3E&`kO~&>KNyrlw%;Ed6Lm|8Iy`kt6AXCFp8r?#mEM%Nj_9VsvcaWrUzNP zn)YwrcTb{{@c3`>3^0Xxgu(HQBj5Qj&7E-z8!?xYZ7*3So$?6-A{q(R%rF-Zr3uLx zSbxS2kn`b39TA@<`s`Ecge)HI@Jd}rMVWKeCcp3F+w3y_8Qs1It4;+TH2hHPOL8X9 zO-j0L%#PMN67>{U?1%PZ{USr@w`|1zIacwaxnkUu9a?kG8hC}cpBe_=E2wHVwoa}! zgC==T%O){{RkBnYzoN6x9*Ak&9|{l|h&=L#Q7v?AE?n{`rF(t$(8ah5+3uJFf3%sn zonf!xN>WVk zxT{~MX;n3@B2kHu&!6UpZx8k^&VOy>XATj;->z<4{zBsCWtccv{+T8X{=K+;hg}>a z8sCuer-kF3?$q9Lg!F9OWoi$d*A5-|-^z$RURk$yK)qn7txAC!-Q*SVSAT zlB-`)aA{ZuDZTh?jV{PAZI&i&$0D`z6%4Zyhg|oZ^^Nc6ko9HwDp_l)%Bd7C z7zHBuM!Lx6DcAAbH3>>G*#>1y7_B*)tL$wo*DDZa5&1cSW~L<0*`b*y4Cwdo_CU!~ zA?C9pLY!s-ag?J8qG!dx)CZ@SqTHiW+4opYQ-?|!3`XPv3C^GMchl_6E`Z4qO!k0`p zN}<{d(@bs4V+9-1%JJ0t!g*D8`|9aljk_SV zHJ_+G*zr-937(b$D`zs(v_+qSw;tDYL+BO-TQkyf@AI?OX71zDriVI_CCOOwe7$%Z z9(4-@r#b0sDhFGtf5&HW{JM`1iypC;eX|}824b!+5ohpDL7*QGmk{(nE%RR7r7#=0G1{ydwg9jh3(Q&o3h_#n^`5??iGw zeV*BWt_~jQ-?uZKI!ao{GiY*em+qIBe4Xfx?G)^J#nQswJqa`*H)tw9x9>?eMWDob+}s&! z;CcQ0%UHCFMUEUmQh11IDg6!$f=nRGw#vEtnKMObwY3+$5pMS^aZ6}BT%&_li zW)IrN<0j7<(uk5*6=AyE>zb4EQg5rc(nXdf{d6-t^TPvwGHPDek`e`uYP`gREjCWF$=(tzL$(e_j~;o4NnA=z zpLFG3t>E&yx$=m@Vb#0>j?{^-l1sWsQPwNOcysWZKUSM11isHlVWZU3mfqMgfFCdG z)7y{u3eqIKmMu+9mt+`+?R}+epEXMZeKH;u!BCx;Q(E{x|GjUXQBVK99!h4Y#szS9>czocg5!a;gEwzf5SS1GNDaN(W z*9^;2ad4YyGa_Kawxh-LBHg^Nwj6t-4&$$qGf>kJti*(-a}J57DmM(~R)|}vh&{Mm zL0+kd;ZwOd+;ffy_{FbASUrOtR%LFI%P+;Kd=iQ6mV2s-6Rx%t0z!04;FU69WL8cK z7b%w;#yV$j&^I7+P}Pb|Ij08#>N<1<%WKh4s*XT1ZZ)1i3|I_Rc*1#>V?ZS5)OQUX zI=%%CXj#iOAR4!T|H(!;&YQ(%{7 zH?5-z%XsHMR>$xu(pP#qEv{m*HeqHRyPGtg~t(%P0)vG zHw#ZyjC0gRaq!!BuhR{sPc^IxCH06mbtJXC3ic-!F4a%Hs}f`w923IgzZonmlGI(U|p6B-o&Dre6UF! z+g$$XS|1uz2gClT;QDqOM**btvS-eUfUG%od>|W{NbQeIt3#?oiCg;S1y~XD7lvlv z;6mdUf|tDI944v#n`AhcdVTDDE*q$$#icHn&fAdW-4m3C}MGMU)$etRy<|Q1cWt1TNLDDbeU(5}BnI*i|!jzZdcy1zv&d zD!Zj8UN^TmyVrvFJC#Sv-mdR{%rgP?1I)2GGzQXceIA=OYfyMb(uHXt7}Z<{OkZ&vKUDkM=6LJx~~D*10Q48i#Fx z&%eyCa|J!-YlQxqUh~OsqKtt9ut=P14pCYU=?!nC$z2FWLM|d1$^Dx;$P&sNOIT-b zARSseI}^|vVm%Fg4DfC^_6@gD3>jfZ6xj#kO znUEq1mCHKPi+s|n?PG-(VB09e{3Ip(!Dz1AQYd}ALZ}B%q=eN`09=EU)Bf^R@p@^L zVRRuxxhJRWVyQh$qLFp}Ko>VY=6Mx;(NzLhD9v+~HodqJ{B9WH6(5j_LCEOSj;HKR zkmX~Kry?+J_`#ddaQ^+k%?6l1dZ6Y<+Ov$&prJJ2xZyp_m$NrICVjZo*ZDjeDzY(h zJo;ybY!SwDHaT3Jc6`ey`ik^WIqN5lfdtjz`%Dzo1ruAge&!i_Dx=Lu&st%EXAY)h zE)Dp_&xHQf-!-riznRAVz;&l|w&efJbn^O;%oYVYxb9$kWPGDAYJ1Z8DNORF3^4OE zJw(WIlEdHP6nH1Gz1vS3Hyv|TOnOqsJmX)O{+*1|FxcvaCLnmUD1xMu{DbiyWlhxi zGPE{K`p$S9#!AwXTFWts!SOk0duLtHGk<*WGc@jg^!D}gRM+oyfK?%fotR-2X4ND4dut-ZdMedW{eh`+d{pmh z)R*7RT)?dR$o5We%-$d=(LjO=?NMLakCXk0ZEX1gbz#&bJU6bOgV^T``m&CIO^1c@ zkf%VDL@L~IB%>o_ZYMIzm7sRvs!h|wxY-aWc4`=@^%UVLl^3n>hUr_aG@SOv>037| zU5G2fTQZ7L%zp853PTpmS@*${MJ};#r+mmx+k@?LxkCMjv9b4RY6h>B7gS7=jUH0b zPGoZls>z_5nL>Xjr9<(*_|8E9B@WXTs8=xD7ZCrU(H^s@M<$=c&D!o(lA8lp=JM@fxi02MNOyZMGtXVV4<7nU`6Q<;T z&$je$Pe0m#W4SvB+Q%47eo*ae3^LGK2~pjdQ-AOgS62(f ze#Xt4nWnr^tDj{7P(#uOX@v7@=XWjD^sL0K>Eg%pYrB0? zh3KYNC}xSO0z0XhT)DmYEkCGcdR+EpX8$6c5&KRmR+B3HmCy-7)rs9H8+bzm^2I#n z618Yls|qdz6@$X|mTgr9RX4ba>88CdQW);h{iPo{GBa)73%ra?CtL=WGbccS($Z;J zj?A@krxm>kJx{bY#M^ThDvmC3$zhMWXz=Y`oLq_Cc;oHy{+W;WmM@P@v~#n@>4r+7 zUxLVUEQtlZ!MdO9$g6dGxSuw_iHsY;QLB^n-4bOvO#Eu+sWUQJr41q*(Jg)!&eJxU7&nF4IgU|%b4o%Q@`n{-PYSUe{z3|w$b4!A`BgNgg*Rg_U7a8=rG`=x# zG8sEo5USw^W}O%)3V7k-zVCZgH)J&Uf$D=HKFr$paS$Zfg#7hC3baIdK}viwFfd}t z|E=lxC&tK>Sb_K_%1HWh0WT@X^R_~PA0&$TeyWs=SK6w zP5lev@2{TQF*%a*C4C91fp3NAAe`hV&%KbSwk|NS?-@<*CJc0m6a`isCsVl@uNKEy zO<$LJC?XK7p;&Ojp(k#gm@K#s4T&+924TRuT6{spM3$@{>oK#7^pa5lIg$%UvBw*+ z!C>N^l6s4vQVT2)P7{N^2i0$OSFepo+w{AfMMQflfwX#t)XBa?MDWQOKxl!w%l@LP zcQ#o%8+_`qCLuc!->T@x#}s2^T?nBu@< znUljNw}E=ZKZxSh)CZnyFJAQ*h2e{vnNi) zMa;|3_*s1T2*H$8!Ms#MgSpXOf}_C&H9WWn>gT$ef_`%bCxy#~vzAZmjVq%S4GW6Xxp8WM=ksFplBo9kk0dQ~|D>Ch9#q zR41G*4JR`tGHR1+Y>xwvaZP@zK|`A3D)MAJ_3#x+6XB%|%-F2jGM5x;);hBrd4XW5 z>OB_5YN^nv4CT^|l+P*BS~#$}dCl+9Tem6*_?$oY$SS1Fgu6;B<$C=)S_=Wug_#NI19GaC(hRJ+J(Tf|<$Wrj7`b%Q)4E=z z1xg&wB-yk3(CQQGR7(bPtpeaoMkK8zWu=+dj(b~K;ZkztpfqRjB=2e{1LEjR7V@gI zMHBmkQ^}bQ-&nc&O|UuMYX0(I%skPCYg=)f zr}JN)j?ZLlWx9ByMGC}%Xaj(&e?RKh^%|cbqpnoi(ie8wGf>$5+7ZZSt+OSQuG>Ck zeLCPnAzskt@2z_}OH<47w(tshCcS!HWA4rWd>N7ZotN?2cmYlhLXjqR?wV-hRXVn^ z!OgWQ%Tqqae*eymmNM4S=+@wOl^v1zO_5qnWvIxAjOrFOgUF9FAPE`xHAd_#-2l$g z2n*bq7H>cuTcG2q9wKm{UjkDw$WlgFN(r|I#&w7$K*mh0{LD5+8)+3UaiGwkJE%Zu z9=+|Tx0#@R+2_eV=-?T8RGpM9hGmb_T(f2%Dt9)^@ah-d{sS@pwTW-TMTtW8Hnk*= zxq_G%%9RIOds{?W>vA7|sXD-uXfb!|dt;`ced!J9Q$KU@fgzBkr%2XUiR%UY^CjW< zlm>C%GVmF}0K1pFFUR^9!LPcetlw!)zf<37xU!+pj)>o+<+m}NSXkW6x$ibwT6IyY z{(>p$8g~Y)!d+vhO2CwbxF;aP)Y|VeHCxEU)bcp5F|0Z!58X&)ip&Lx&^7d)nm+KP zJb<5uAuUAj(?4jE&3+)kVd10O1oYCZ5kWUF>P=e3d+*`IsF`NXIr<1y@Z9&DjGgrF z?a=?c&;yrDB#T4nX5D+o`A^<M<47)kZ= z0(bRBdY{c$nQM(dL*5(18$!oME(eGA8dtyJC+Td4z@OaFo%dXy&sN~>7sPi6Er@b* z*HY($JG8+W%upamyrpDh1QF|`j6ap@-re_C4Keo$4$`aJ=ETBPHrB7aIo3+0^Sf$? z*dY|en95|L?_9^ zMX`N>)?Dff)4<-Tikcn!5`7Y%xC@Dzr^U91gb{Xy~d4EXVEl?)V=A87RUsO z#3q39Va|iGbZ#s8I56fvpD;2v=?9)RQ;lO?TWCV=ZfreakxYc@3g(-kxi}-R291%V zZpmr5D=ZO^FA>b9t(>H)&0QyiM$hC;pxGp}^)im*@!8~)IMTE15Ur79dFzgvtu>OJ z4d#kC~c#sZqW3WiT9KU`VpPx1oMjl`RHNC!=Pdk9@1B!YS2Ry^tB2dzk~5 z>-~D04lj6sh;_D};@ON%(FxH^6lGjp5zy;sUb#$OAKHUT^S}1J_jAy8-3ZE_(k&2Kb&1G1M{IV6%HJAjQv@EswxbfQATa#Vos-2w#A`x(Vu1FWTjn^GlB>@S3t$Y!XCn!%%E!d}Lp} zn+2BpRq}V&`EFUIjUA2N!gZd5wc51bf_Z!5fRm^aDcK3W->MQZ7QF6N`gb`;YY%>Y zc6m53#%`YqWgV{1k%kHPuHM7qj40lyt=cC+1<4_MI z$vy1dZ4#%Ucz3C2k^q&@(XflT_Kvhwbr?x3dA zo=J*`y80>LwnuleO?RJIPI(zo_OT)j)U+F@gf!r@To>w9{Yut?6ZF`~7e)um9JFOsF4+Cz&8`4AR$ue1K8zZM{-*Jr0n(6mZ(4+QUYT zy%Yj=Wn$&=Amo6;J>L|r%ENC(BHl@&q=J%{+l^@ZQ&LFkWMy$}s%X+{DTMh<2qh>LjAkb5gd3X$bk1z-9$B02lMFC*t)~+}P}}p|59En|fW|(i z^#Xr_fG7f-;@dz$u$fRn;C)K&9KbYn2?RFqMPPep{B7V3nSO-N zYpVmvcq93oxm_0VIK?X-;C4r-cvlrNM5lBNr0Zw5Npz~WL}RXP9DT2^ZYXF^*o34$ zG5t=$4!r<>!_;^v5RUZ2;!f3Z>C@c=x@_XuRz-6vZfmA-K4p+@WkjLN4V>Xf=v?8X z+wU0vVhpX_Hv%YO-po+N!5q&tug6Oe+c97hu`@Kgo`RUt8T?cI^?P|7e@f4^a_^vW zo;hC6B)e~1fqx#s4UF$FZ`h}6E=wE<+YpY?ykvG^93YcK7W?kK^DPAsr$6}S+{-j0GnJ8~O?mwO;tBDY z%ho%S{x{(0Q!4dO9`3`e_72d(OR4F%ooq)q#EPD zF&|S$dlpM;S1Y%q9V0q;yuZ`e1I&|P*a=B!#yCKMfzw7gcbuRz4z3n1dqaiIA;EAj zPVNes<|8!mEG^r_jmJ;_(vzj$cMm0{jYp50sTt(Xs1WY3!I`P<-S>CD-OuY`VDAh1 zFYJ$HgtWlr{TJoMUkUhxXO8DeRF8vUNZk=ie!wN^(#($6m3|x+L3nx;YpLI*3CU>o z9X&vi3|XuFmq9WfR z_IhD*BEuvWxl9u3gqDJ+mVS~TqqoJAQ`RHevswevUgxV@0V%PyXH-cktx7u}1^#0{ zxVFTV%&`A?J$MEMK1AyGX?QN?&M{V5{;@MO{hFT_%yA4e%Q+UK>z+`;Tr7N|2`7;B zRI(^A(idK%S`=e3o6}*Did@`($v6j0og?i+>`6#$!26$QL>Ee!qJ-wRx}fOn#W@jk zaP`xQNf!x0_Y2rva%WW`Ru(OHXJ{Q`Qn=Tl%x1F26tu3p1*)CE?uMKSyz_20$< zNUP)tI=8ztj5b<;Z|?NB$Ts7O71_Yr=hr(?SI;{#D1}#0&K$-2dy($T?HBIBmTMC6 zI(3i49Mo@jx;A@k&Lf3g^P%a)+erW|EoxNoUSMnn8JZq?Zeg(ts34yy%73w|pBn7) zI4dx*787Zs1WAwUnrM!Sh(h*ss;+cpHg1r!B>bvQ>sOmn0Qx=16kgN97a2HA{&squ zuyh@?38H9_b{@6TCc(zL2U)ZXAR24Y8xKLZ#Nf_{=icsvG3ei~yfvVF7UB=++_LkT zRjtE-_DP|~ijhz**vK1xys$^TXp$hhx9U>p5JZ*P#Aw^wDAy^(E7omywy0DJGD7}X z=Xj{-ir&L5Qf7fftZIX*Rt5f~cUUk>%c7c!>psO1B~$@GwoVk?8QHWvTsi;36pO8F zQ-GzD#{CwQtZEca8kwXNMTG6fQm{`gEx{@7HIc`5$gjr0|6-}(3n?UaOGGamO%TCC z(QazR>y|8*C^ok2Rv<`~r(~yM5Uv_x27uqG07XHt_Y`;*$IRu^{sao*pRrArve&5- z3mB?N$D#aTpL-u#e>cba6E&l1MJd3m4r|(539|M4?wMy6EWJjfsZ{AHJyhzXEqB_G zyyqt|T!gEpEI8G7ZY-368PiVpqD@`GfOvT% zE8Vq8wK5hXi6lwD7y|OB3o=d~fwXVS=0NYuK2Nic76c%pFB7n_BvG zq;h-y^54f7u1%dN6ei7WcPL96t>npDN2rf6N|1E^|4_D4ftlu+d&3AWUb_V5fN?`HXL^jpy|=Yc%FqEt{VT5D)mFgj_7MNe&nJ zdF`*g>QszZYJn6GOkEGtLbr-DPY-O4JxNNs<6PA%wJ*}-)vW|3ne;M?HE3;zV8g(d0)od|(NreoM39@- z6Dmu902opuy5UW{+Fmbpd8vFm*XhU;>Dm2jj)7J{&Y0NRy9Bd~xTGt-W}w+>--W}G zci`ifD}z}UN#hjDQF9eWr}YkfZWv)PZfGXnqnzE_GWVwfw;#?~XFCu||3+0M04EX$ z$#7@9YiSBAEq(D4_Y#dw`P`};71;G=oUFN+0-ON&J_0xuOdW4HpPy21@&Yx5BBWpU zD3NvEK`!BWN#ROlug*^v4Le@=OkDkdVqDk-!2s2ZAc80&g4}Nj(;xU)0LO`+e1C~(pl2$`l6*jd6S3x^{THoF<{8o1<|s#ge+3hg}# z7;rIypfL;Q&$u-u5b7U+BdoeND>Pr31m{MKDcPC5VO{=FOm?9l)7v}56<6e(x{=bPt|^nbW4Y)tZnzfOX~%M%I(&y>gWbWx7j;mw;!5u%7zizCy;-b!~2A60K6k_Z>^# z9XjyZ0!C$S(N4{W{ojQr5)CG+t-0r~QvsPrp&>?Lc@z?JQ+x_+5(;P~G^Mx$G{Lj* z!*rr?HUd%8dpoy;j?C4`3Oobg)Q`z@K@|gZ6vO!^2Agl}=`3sgf-GcCynO7h7JZ|8)!N*dhHme~w=YUoHzqS8%cRY$e zvgPK(sik4}udd3LJA77BJ9|yaT&Im0RyLESdnaeV`I7U6WtGjlv|BMxKbn-Msh+>9 z^Syan^31YCwVXLw>NB=z-ulUuzV|cBt8Sg0nQ9+*+Z>5ka)?iBt`GgSJJ>CB^WUo; z$!b2yt6xmMylA$~q9@yhemsljZq%!v^kU%}AusJY7oVAGJE<)P?lj0(tKIb^bVvA} zX4OsCraShOzg$?+ucMT(@bQgPlI`B9vT*|CDSa#QE%;8iTDCuR`Yp1rEjU5SXT4YI z+iNWE<{!)6%h-3&{=_Ufk@?Qs?A^EBpZ1sS-j>w=0jK1Wtypqy{qJ8j|Jc!c4yJFb zwCjzhd)}YQtq~mOzWUQL<~?uAjBXb%n_YJN!~rI)?1%@4{XZIOzX*>k_G3J2QRrqh zai;4uZ_yBkY4bn7IFY*2X7t{&OlRGPgIYwUJGG_U4a&r1qbDxKd4MQ{|jx zf2XNO@$s)#zr9VDZ{GdqrOTCOr>4$oUHHGb=J(>Muk`I7o)_4zA|9vwH2%k)6VGoK z{ACBV?m6q46c=+dF!ahIx9)+{CW*>wlNa=HZFVh~BT~;_fV!!l3)tG%12*+D)ARC+ zQbl_Wxepl#xPAZA)vOn#!suQu%f-t6y=Ynb%Y&qzeC_ol>UX4ap7lruiSWc_xY!T41#Mz zKT9{B)!<{&FJe+;3isM25uANBd-sKDix-|f6SMt*g|xe(v}nJfhI;Vi z;7`Tt>p=cn_RZtabf9au195;iBa;XN{M?PnciNomfyWnk{BVD9;}lT7gpq*(j2LdDmO@f}=fvgE+Sv2d)o_#=-r9dSd43q69@B|71 z$8q%vit@8klS`15gN{-_-o^|%N&x{_S&*^Pp<0Z0c+U6wQ8~}P{VFu2hsvXgRcZw zL!YS1%zpL$Nu zX`Sjm-Oo}Z*hK*tqOu$~1O^BU3=GJXbz2gm0hqdV6CJ!9*gtPiL~L*{J?o}K6j?AZ zZR@5o*kDjFW9z03G+#(CGwY@};vR4?E9)i*!U!-hJL@KGoJt6AN9#6Vzab?MfP>T& zNKOI)=5F0oL>&kQ?qc26L`moR?*}lOK?!-fB__=MKHklj;!AAOR0Bt}%{9CaK zS-}|D913j}17?I7ObBTZLu9+|#hBAG-=6Nr(y}nM3yGRwrr02B1 ztD;R>(>Y5K7WXBr8oyc7!?(c+B$O?R)!l5^(Fvg zU)w(~`{=jPOJ0M)VG0dz``8?997FVF!}v(YU3{Il-{8%dqiP~GIEJ(E>EjLBDGau+ zf^eMkcNIZLkRh?FWXe!Fp_`+T)+Z)m-#^<<3dLaOctE zrW&5&HM87a44~s`H`mcld$9N;VoL!4$PEsXtqmrY#wY5lWU4A$_lK(Ny_m?rD$cp~ zjJhZ;JSvhSI4`MXZptk5OH*sR)p~6XkM1NTN1bbGCT_11)H zo1gTF8rfFy%kB*NIF7l-GMsI#r9w*_^h;SgzVoLcqM!|Py*zUxCRbcLL*@WyUyDU0 z%n_?(h?sfwb1OZY1DSV9(1W41wY{24fs!(N&1zbaU}x$zoBalf$@f_hHdK-iB}Zye zHIs>pM|WE}__+!O{8nNe=Tt;;hYUXs5Mki5K&+NdmerHW^B73D5z6+c=3PBF*w~)& zUvqID17b&8TWiXS7WW0}^_qv zGQ1IqYt|fru<;K>_3!rx#R7f9^BiSY!{R|;2C)q*u8cuHi-yLtES3Ne&XRXD+5C1` z*WFZsb_ZV07}``b7QC3umsYmS2GV|`_!$wjps}MQ4uph1MJD6Q16ZBMah|zbN3!sf zsZz2%xVP{I<}DytV5LydN1RL*q}sTKWXd2*Hi#SU0)+2qqSy?3<|SUXkCi~wcZ z8uJlKJA98F0W7>Fu`hsC{+>CNK|0f=7*oi%CLe9@DaOm;%UI&Zu)Q>i5_ui^X*5Bm zz|4%pQBe*r<@|>qf+tWYqhy+Cr=%~)jO+8TSF7yR;or3;`Ob%HC_xd#GEPt+&SP=S zhqJPD6f{4Z0wMb}{)%$sBa=YasK5qi{7jqc<=&fZvY z?6yDBb!lbc)|K&i6CFn$*EO6(?W42SX~NUzTiG1NdTddrQDFyp_|!w$duhgAYt=-e zmbQM@6VW{EtH0+0#JhWPJIj-(GUkEcTH!2hiik#(@22Ujyy);NTYtC+<%}F+uo4Uj zf6@_MS2@N3FDw9wqL7-YrBPL7f)4%FWk=Nec7R0hi<8c?kNYRn=aHwANN-IwG3;;- z$G2{f>4DV%y}%fO_C)c%<7N=15z32-eR^$knRg{ja6G?7CC|xERK(X+^Yy)l zBDDf9Bem)p|DA*`3oZbj$evD`R{yKqQ<1o>ZWk%vs$|K8TN3(V(q`VvB=9zk_}9*; zN7rsSycGcObj~QpzUm8BQ7^FJ51M1$!Ub86)b<-|ZR{R>@b+WJb}N7-%@`-!a^WWN zTPQl_U~pRSOmBigsv4J?)K@HLNnO8&f)K{+wWT9 z;e8?js#)sC3eMiheqGku7ETWnkiJp$Py@{iS+`#YnqpEFOk z&lXjhB+i`54jmartqddBeIoK~1+O@4({Ybu!G)l}O{5__O_pOI1J2v!x=x5LoVq=s zg2136o<*~=M>nxe8OBfhX3hQKDlqe38;x%n@A3;nol9g6i&=iJ=C zdZGZKYTs8lA=A-`y2btqQNCCcPF+To-ZuOF5e$Oemlw73!d;VuQt%%9dAAotC2<^{ z+O1ku+Oo3XJRF1OOrNgEvE0_&n#|_!g>O3cOPfKyjUazYMin8pA&Y~VM^G^na}faa zeTx749NI;r=(k8s9;i>~hx1eS( zS5-gx_!dSg1HXY8O9*e@L2k84iw0!?QnoE3%VCb%M!tIMbJ3|V%D$y@W=q|`VEl1Y zH<_W4@;G(UUYwfEZZ3-j1HU6*lIJ=#iHkUsRL>L6auVH^{5rzN7*}Q#=(}04)CK0F zo@dlw(C*0eu@42uQ!8`ksd7@@(|3Ytc1XNuVZeqZW`>8Eg{5s!*3pqy6|6nrmP=pM zqwr)#;uGtxAH9VgM7nNLt-xF6Qd~q&7J3R`_p3qOc|V z+eXYl*HkFk+hb;ggd3xX@H~7LmJ3xvaaBPTeK+ohcNW|HMp@IWJggQtOQ6m-=e9gF zF$WT;)q|0>gOat`5KRR<#tvuzrr_Unr|W+QY9&pu9|)8pWS!m zPC}-h{+sgoNTPJfg+6GNK85DVda@Uq$Y?*4bybC-Y8R@pLEn5`aMyQB(B}*o%^5my(QQAFioSO#vs-I3x0nTlfl+)~z5Uwcz&<=Pe1`fz{@iu&9 z2R!UFw#xP}&8Yd%!68l*y|Tpeul8}fri^--$(8jcOI8xGX zNXl=@s-FCrk=ZRMaYP-ALILU+Uk4xtBk%6;b}VMI`otuOWk5O!(+$#sHjw{d=p#Nv z#e&fvMC~oqtfY)b!^hZtOfx%iwx<5$(Ucs!Kf8+hCezU%L&dS7VA2`!(wX4*=cBo0 zYUmg|a!*9`TI@g-0Eig8Wr;6dp3=-i_y*-z|$zRJ;`h z@+V<)>L5wRrBT;i;-PUW4&!TJb$z_%K^;j(Ew?y%k{S6Ft#|ddug|^CWB3IE5)t}H zE&&Q$wEJ)Ae0JhG}yxW6caK0 zQ_HZMJ@IjbX$&DfY0UmZvcM{Fl;tRfKRRanOi3YK5=>k%0(O|MD@;E7xO30|6w*H` z7<=w>*p4w|KRTgz#8hIHBw&TG!7E?ZX-jA@aZM`5Fa~K_kYYqpQ7Mb`5XwB%V_Dj> zXN0r?2yM=zH9djr3RIrQ9qctzQEqV+4{Tz75Bj<`$ zD?BFlbw4v&tWtP5f|24#=8PVYL=@uz*p#Pf+Z%Cw@ME?8kcB(XW51r>*_+u46p#FX zk-XDw8^&N059)iCzqMGS!KB=E@{YF1m0bA&uXFN~E&~g8V!pMx+U?gO#x*h|zpaVk z7?I@Uu#%fOHwjG}pY|MPWOFQCeGYvAc41Uc!vNh2G=js1_KEk^aw{VP2DVXrB@uSpB zdb8A#SP6+(!FhvAnBqkYS)qqbm}G|qQes|lXaj=ioEea?Mva>zjdQGiiqAz>ny^|# zL&T%Y&CYNUN<@V?iuCf&vF zj?k3tsWM13*~39+F#Pq$hsJ6tP`Jby&jJ3^VkIh}I}@v6s%+r0)EN2z594~8r=uib z`k&-#UkA#jis4vcnPh|M%HId9ISLETTGdOa`!l>qiWXs^_JImgU zCOo*9RhzqHWN7g&&74{Y9aeUEQMCee2W3KcKa4}d&5)1jQ>j4sZ!>kDDBw*%9d38- zn!Eim&96|flVuDc^4oC$+IwgRF>86S8V5rWNbi*1v;(Bp|!<-ppwUmL?{j4U8 zK?hWKecYxEFPN{}x-c~7W6xXBYQy$CQq`lcMd<0#hNf}t;C*QLP7&?s&(WU)gC^vy zQNF)HZc7khu!+h=BS3eHH!3zk$YL7HkoGC>otcMipu`O~WFS!h;6+5v;ArqDrl&S4 z^v)I9kOK2CeE-x_ff%{8D=uEh&K221J0mk~H9WMxqG*H)IeUtnU5&htoHzR>Dw4#u zQ;mgI3OfT$+IR6d|3=5CMy4h5Y*FLOjEYKyPJ{AnzTQHNp7YGeRD|l`hsad;YKgdp z>x#ldZj}~v+g|`%FW!Q9negjN0&PGh!ak@2OTR{01l|OB_m&R^A3Z|66O>W%U&ROK zGw24@3P|&&3c{ zCiKQvDj3nDEXo4$g?rBjC3)Y%R>HxDJYvz5l1zQFoSp#)M=_SD=re^P0!r<^K~B$P zyH}Le7|i<=w{V&<-(fxLcFAt}YEc|_ZEm?7Fs_v^0N9?<&toe7fsA`fFFh~pd1%C{ zlb2*apJ;}Ka(;{gCeXuw9L14Z;D?`~+Mujc=vN{j zQUr6XoT>n{>GegvP`zxd`lwJb3i8V-#Sg9T1kdLG_!rqpk@@db$<&rmxtSZIIB{gY zZBa)DZ3Aww2$bAdC6d#MUhmI%-RMF3H}n2b8uA3|-zn#Qn55C8ljq0_outSc^dFKy zb^&d=j$hSaXf~^;&YYuY4`#7auIKww%m3h~LjjDD^bZlTUD*F@+~pN$?*^8k%Q0j< zPKxUDq}HK1%Z9H?;I*qQh_`msaU@jfTj0`@GsAZL*d%?n$oU;53KYpUZ>(m>L5!r^ zw8t@%cn3fatkd)dFN^`19?~2_OQ1hWiOtypD-eowEcTS)a3dz{Xw2zE`Ope;E z;sfB#i5Ze0wdll75+$@K-*-7yi7h8g^cduvQVAk$D?jM9qxlb%?NZEFC)cdH|F2SS2e4`EbX0_?{}-1&kCHmSb{_<;8s0y z@3girs-BUx$S>_ekIN3g$MiU7f8!4!s!i_2Yov~7fr*Ey z8)bW2>@q6f@|blmQ1Wkv(%BTW2d$2qON`hvO=7hv6o9JAp$NOMG<&BBq=N}enl$P} z&blEjZ!)TJjfzxi<8T4o`-94g^ztOk{2=qY$!3bOIG6bed7`!O30f)4GIz+966;(C zYSz)LXZS1%{>^EdVs&S8UYS@*`!bJGg-bVn_uYR=GMkwxuP-?$(IH1EKqUKHEfans z5721^7&9P}i6;kVlVP;nrIQl;o^5kUuM^i%Nu{7i&QccHjImlVf~Apk0A7_kwp?3A zms{s}@)jPh$E>`-Y@%*SjB}Fb)f0N-L;L5B4dM`UEcttKbDb!tKJ+hJ7FC0okb^As zNXpHP(Cj#ZA8`4wB0AgYc;XC*)10$?A_GXRj;+s`|#BE43 zV+d7pJi+vH9`S9QjqP%wa~`7;GF?brsz^xw=38=&z{5Yt9QM2tOs17ZB!pfOUzie@~d8+reEtwMR~Tgp%*4n^ET2SR6gC=TenbeFFNWk z14fTl@#JNFXJt}zIhi|x&)_;v8(QGh%Df%enb|Kzc*}DRNtv^wJn^GN4TQMwoJ>wz zM7_hU)pax??6q-8xh+8sNs;mMN3ZTPgy@tex;kpORU}+`fJRQ(E(emTADcKd*P})q zxMGLkI84Oisec$HReX#5G6s&xD}cHz06B+Y0-Mo8bm=jBt7N4j4Iv5R2kYvTnH{%R zh5*{nK-YtN4B7mV)VqXsgWkyOL%EZbx*d;Kx~r5r6={D$M8BAUv-K58|Cw>m z+eSa+x{2r8ygw*_B;sAiJJUa60m0XYhO{|<6{KG)Z^maN%Kk*0F!mKVy`|#N0Q#_u zJH%oWx1+!h6v5XuE)0fgjv=ft0_;=U7vADvvqB_<9JuQVW&1CYz?Wd)>@8Vv4NbrW z-FIoaX5t_W3T(o36}*re+E(c`JDa=^N1nsi=3LQHr%Twc3V1Dwywc*(?sO6 zh0JXUp4JhutSM;1YFlxlB4eih@^>%x-}lI`(ao^QRfmBZe6KV%PYuwo9z}JJMU%($ zI45U|6IvSpUaYn`uRPBSu~WKt#FWS1MO~+v)Oj~4cX12dzHqx2TWe0COwZ3ZeB+P_ zF61F}A9jZlh2!6%?o1Qmj3URywag1e&G8>I_c?>D?m~;kHMdFjCi!@f0Q1*Q$1uE{ zy+gRfZX?jSx4#C>u+=5G`rNi+p>r68$8?`2OA*ybRKH&|sQsX)Wqhnl8yJ_GdY>em zyRm;N*v`7IR(R2$17GRHT>rtDFk`^jCE7{DCzv@DfLZGiWz$yil<11Gh+DKq{o^C| z4rW~mQnc6JL%s%%$3LK)8K6~?0DmgwAcB;%IQlV3;J6tcxaiNmh4|X$>Sz9a57B#y zHFfzVLxHpo7JBOpVPAEHdo!8uY1&1xi@)YoudEEQwbHE29hIB3k2mfqg3YTi)*fS* zT{OT$?(YGr&R9NQ{yvp3Q~9WYhq?hj*EPGQqe`$9y`@bvYfZ;`rlu6CoOjm@8-Cle^~f|q)*-d+2=+C@I^VVIL@t-m z1xTDezt7P(iJP!!%XnB!>G!nc=kbk9{t$XeIkQ4i_FwcaTQ}cb1qQKnM_hTQS)-o zZIN_ZlREN#5g_ZF$)}=MsfcE~K)Yw*{zI!y5#6(Le%SvE;Wm&@%}%9i*!0ZqHiu8D z`^PjUamD>m#F^i1X6LsHW$ftd1&Ja#eX`O{d7s5YHaUIL`-RlTx=tM=mE|$iGac=k zrE%voKJDV#bhX7em)1_1X*KSNj82J>MZVRNr3tJ@e86h0LpuE;;T=bdNM7+(3U)=; z!Qq*McU-5GLHSi`TgCgq4Z{KBnBwwzT<3Vpbk&MEQsyssPl@&m=hYdPFj51HJ$ztv0{OYmd5iBq)#xKb65 zB~j!(3#VS=W_7P;>Ro>cmEHpI)?tnBVP!P&>I3WDBVb?Q7o`PEMFaE@x#z~@#-fxJ z@C$C7yXlHq2n%SItHXDYcRoEY7E)FcUh;sLb9cLgF`E~RdZe&vJPa2`$pN*05u z0vL;LvGOUA@(KDFuG+8az2Nu+APMt=k(5Lt$_ob7W_M|&Uwc~u5_xuLR)VFc9e#B4 zQjTqh5g@lhcFrziEKFCPw?42@UJ`JidKt!- z+l;^jr>c8A3G1AdI0@SOVoOnwb~Y;J!owTuKvsAOWE4=8eU;) zkmsc}V#6|NS0cP3JNRfLZ3jCZssqjNnKsb`SL8K&G#hTe7;_BAK!)guM z4X=?VMC%0v;Bv7yGr|P5V#&50{yN*@maUzaaf-eb+xM`@z3S&@_Cf=I0pw3cIgD%* z4Q*2{t@2 zX8=5kb&OOL1pjUYOqLI6wu&w3_TqlRb=26(Hp*2{1?Rz3Qj_Wu2MGw`lIn+uywM;m zweTn_^%wfkQJvbYy^>)PfZ(Cm`U75Z@LX4x!u6G z=AHd2uy?OJQMXUT;f9a8psOBUu(~cyOB`>(J13v@`Q=fIoUkwijW7%&Iy}w=AFu{? zUd7DdSNFf2>XwU>+KBQltPJb2%jINJJ_V@?{aNa_V1k2wc7^m50mS_MAbnl8!*4q$ zk1M!3}t9<$h`E$>TFo{9+ep>1{uH*8BZN+&gBrtWVo%6CwD_bTsW zjI@K8YNes-w{1=Rd#ecW)m^GUvs91LcTCcFES^SAMo`17R`}JrLC4^aaHcrKC^pf? zlKo5hl#&gH9vSvC2QWpZWh)V3bufBM)RLeh|A*!<_&n7qNw5dMelkMw4TG+VX5?%> zu~LcpUJzXDQM+Q+(zHYfJM~RK{q){Bv^P-iT!Kf^FxLA`l|bqP@ePh){(I?S)r7sa zh7o}SS;YK_fgp>68rC%bTIzmK5JLvtMO6~#-kbYpx$})K`gfuoC zcO6{J8s8g`mQK%hWT{m;qn(l7_QBvxaJYD?=<1Lf7xQU4A#}O7vMG6B%W)<3=RY+E z_j^;sIO}2&2RKrQ_2EaH`u>`|7Gq2$V1J|{s3Ml;f7jo^xdeOX$NVc$`O_#>my{ep zY_Vd_2 zat?d-ff|ciG3;0fCl_@?mt_K%7gk*RBgpo^#kO*3VoiKE{O1k4R+a-6q(L`LsB!+A##ZD5 zCZwS>$!oGffrtHj@QPc>M5r?fcn7%lEXrI}PSr7|)V zX}G}-b2QKS#*tir(;PpjQN#%+YMea<{9!CwP&Ej0i11N!@mbVx;!QR_=bV1xIL7d~ zkaCI~BOI&g%2NtlVVn0fwp8$PJep|4pWo7 zW2)iWC0i-A@ZtGX)ii#1ou!hrQ~A|S3nrU*(kD*yZ_NmU9aP%H8RXFmdCs&KIUdDF zs&qDoHcC(oN(AI!@6>S@Iz_B!wy^sMvi=9ZJ<5u(%M}dv()j(=j=A*)TXjST*Vtz` zd&XR&br0YGZ7$Kd&uL)BIHo+zcsF2T-2ekyxG2xopSfzXjke4W7$5U$*aOB@mL**6Ni z#NF!Asn{)oi;#(yDR1L5?#f6Gz5+wqZQc}NH&)--Enp6%XS3JWOFAW$nN69gHmGcr(7 z3(bkoIo9KPZd%GkJkGH|ZgT+L#t&b~;Tx&53p)69v4S~1&L0#)8x76}T1DUhSCvG=8}d#GW^1+=aL2(^Tir?0D*eQ1=Z$Mi#Wqd-#D_GZ+wDVy;%`aW zEBxk5cBCMLzrAzXYob{|i8jcx7W^H9+RC?z*>4q)f3K9kLoArD;uVAb2r|S_jB^y} z+g~g(7=z9u&xa22t@5jJfW(jq?=d(D0^RQW#}B3g&QfY2KtQ%&|Jx7#%k~DP^l8eA!qdCIxjT$TOp`~fZ-LIvP5}h^0Huu^B+tT7DahyQ?(w= zEe%=4CRDe!YS&V=l4;IU*)QAZeZaqce_%eb>3Z(*BvOv8e;agq_P%U-e)hM_AKd=* zKUV_TYbW>ySxBBqm=K5K!6%G?-w0sj9ZUxo72m+HEDtb zh<;QERgSWC@}jMCbNop507(s{RCL_pVr#g=4BheKTFjiv<_hYB(J14y@yw)kPl*`1 znkvI6tnm#n{&j)$^xHBvqcgY7%laKG&EfL;dS&E11U)Uw&C?)jiCUvP?-!s#ojIau zW^G1Hk}H4T3mNrH@}9SgLw?pQK#9v70iRByqIq7@;Sox7LSS%blfDhF%-C_i`nac} zic{pq(`875WTS4EUrP^>IL+Ehl)ZoXcUHxSODLF@h!($a9iFBMW=J75knWfQHPiE3 zjXv6#4I(JSuufGWoCs{8gcyK+fU+$c1{yo@STvLbzslC!x?Z#+V=UnoO*~G-Entehk#vR-qmOy|HRiSQpbB|(Q zWX8>yfMu zLS-Me8dXyM8qsn2utvaOJgv88F*Njn-Xm(3&Uov26XPJksg(lEzVLz*@!2q6MPYvn z6bDB%=I}gTUVjt8N=e=?{`whI&f}r}_r9T^`^kEmF_f0ahmG{e>d4cS ztdl00T9IY5>wz*vl#)hJmWp8>!&{amCMaMGUF?g$)aA*-a!G}aHNSX?48|NnyEffC zB!{Qp!cEW@hhGA^HYv9QUW&aG2G94*lFVaE>`!?McNG>UqQ-9RqV^dP9Zj+K?G8Fq zg&2SV)w|S<)h?pgk8-isR$kcGsU{okiEAB+You)w7{ZG;>>Yy5#`{+3nQCb}Q^$+y zGhOMXrKKZHK)Og|SY0g1_O8ZKji*=XL2J|s)=%G^Pdb1^GU2XiVV;EAX8M$_Ov?m{ z`vMl0xWqx|$|q68RYyKsSX;=FdDi&Z_ycUMu#Lp& z^g1}Ad4jGqfP2%Lo)$q@|2x-sTdx6=zr(TgwkQQbZ~Pcy^(WpO?ND6-rToSOJeT1pGLun5^`;-V zF8sa-Zi1odr;y!opDvHktdF`1I3CUT&BzUi{ZBj_sT?j7_~AK`?0O)V>+41^gkWg- zsj(2&0LN_AIF4W%7dRIdbjGq7(FwGa&qmCS zyQ;I7cHR@DC_D_)eIl3k4+tDr*&{&1O-iUwjJHE2vWx5iwcVg|t$pDE445NlqCrgu1jQs_KX0uS^T-utgu;Ao(_7A~OJ%dG>*al1!qIQ(RLYHu)Kzc~dq)?J~>Y zQ|~LH2L$X>>*oUa(A>aUKHBl{)ZYp~^LVg4@&TCN58yeLCo5p&!F=?N3@!7p}etfq^_tQyD=$l;Ob%4mH! zSoPTmGEx!qR|8Lnm7g97RAhxxg}a_)KU|MQ5-+>;Q_AM|u!9?wJF2p;&fwk{Z(K?p zbY2=k{By#PCfzlaJ#G1ZfVq@J?t%-5YW`*OU6Wd$B)xTWsFLMbYRzHiqj7Bqn{f+$ zXHYTVn&sy;+t2HUmo3ZNT#G>A9hY}fVTNfV=G=Yi{ZWJqZ>w;?w4>O*GQO-70jsiebfd};@#uvQd8{H&V3cYUi_ku zgr2EO*59x^kfLXJvGTc#=$xwbs%fQ(#n=Ae#g1Ax@hLcG5Rj`jV*3TT)&tM7vIEfGbkw4E2XZQ?f)>sb;y<2|+$=%>(IuU`r2iTj$ zxX*RY$$uwj%KCQLK3WjAl?44vpIMT}JDwC;*9fZu>-aTw3952Q|2jnygDdcyFDAHO zEL|@oNZ)fz>t|~SFY)_+=P|$NHuc}j&4h0sGxVlG?Gs=w-1~Q)G0`Bf%mV`gLW}nQ z&ojd9#Q=nVEj*3V%|SxKAw-6y5E!ayGFGDT$YnRM8elQtmrm+q>pL%!H^YqHXfHvzigutEY9FJ5pF4=O>(pVusOFSMZZz$J05S3)}@ny9p z8pMs7VC41D5+G8y(Kvlyc5`XTl=5>b)(SxmBVthA$>(<^mQ|*s!KQ0(?9|X9m@D>w z>;m{A;TD>yDOiHG7n35t?p@L$LXLe`{*4!pXDdr3<=!R_p}{-qUb z(G0*-Sl|KZ;{Qw!vU<+YuyM zPKYEAtC08^!Uq}S0=rNT^@!j~<`+SViu+KAcMeg2*RDrceTqS_WZRCkOn(y&l+;ri z*=z3Z95EK1)p4X7das`gc}7=S?ZV5dkFqNsfk8J`i4H-pBVu94GGoFvp>OqeDh34a zaeOz<3%9T<-}7<2W_Y>A!fUZ=hvmogdV3Vl#!yu2@_zx*5qv2Ke$)FKkKgm|OXhQO z^OxpB4-hlgrQiqqb-4FZ)oGN$Y8P zdG44FUSi}TK1diWV<51xtiHCYfur_7K%h!UlmUpcbhPqikRQ4>FjgQXSM4x#?rh@ql922ZMm}<(Ul%S@>9~$|z>ukiai=DRm zo%Dpna-yPoqjT&9InDkk_lI|AH`6^Po9qrwcxkBrCZ583C%8W#m@$_Dp8k*^pdV;9 zQjolEN{~~YY0Yl@s{pBRzhGGg&9pN*04}V8lGg+seD5xjh7aiWkzPpCu*F=M*0xh% zQD|2bIo^OhhJH;!P|Wt-vQ^LMIKTNue(mS#*$s60@LR~fJ^-S*5H__4a$z9jG8(fg zV3tnTpthS?t}HaLcCp$!7c6;CDQp%u8*$hSWoKT&@-kVJ!BL0k&Gx%I$#6SvF{MOL zkoO7PO-y_S;{vwL{f-w?`|!TIRrrCAf2h&iDHWHop>F}!nzNe1R+Wa6w%_qR)Os{7A_z)O!pCus(^rnauOB-$%(UJ6 zK|j|8pQ8aF54{V#l+Sl_C&hm0IY;qMJ@pgqf|q7R!#$1C5s5fMD$w#rBnSk(Szlac zjr7+3{!p8xr<&7U6OIyF>U|;DIi@gClkQe-(5`NaD{NqMLXzPNwp1)ydD|H=84dR- z@MQ0k9Evx69V-0}ZvDwQ2D16BtM&J|{ewO`pv@Ej{kb+b;QT_h5uJ-uz#ZNmfKh|A zP1NM?i$E;K?cb7VDLl=M-NCVsJ_+9j&NRxfo#ksVksvWfU-^LzcQTw@C2{A6mf!d_ z9xDrA(u|aM>M{m$kDVT35x4v@;kfxhbd78^jI2`?Gr{=Hz2@53-1zfNW^BFv1wuT_ z$zcIK+A=3Cye_>>JRZu(4d2Ol;8yY^^Z2fa+BO~7w$6?8l84)eOg2atRifKpwEd<% zCXY)?*f-E{>le1&kwzE6(RrBk7e)e!H!GmdsGOSh6nrNp)4>^V_|$qLwn?KeQ=_Z7 zc~`e|ZM>DbqZpi%idLenaWDUpEvri%F|+{KEh{IJ7rg8Id-azFEc|}8?oAB9Et|+< zH8S%7_ZJ9~_vud$r1`&LB=TV;wgze&1D9OIQ55&KB9t$X>p`G4(7kr-z8yNs9?96H zUaeQ8RauOT-IpHPe7m7NUWFd5@72p4BHzFmZD&nht6-rN$ZNsO82ZJkx63^&F!lj} zg+;i%T`TR&YYAdy5X7;#L1rZ;pB$jERf@$SFeBOu4;adff&EMM${&lmF`YxuzsVB} z?Y&N5KB>qGK6>)pBws>X_S>}`nEFVwHK6|jsq)5ea%@j9%3tz^pZ{rOCjO_5r7<>$ z@H58a53|m#<6zq@BJO9GwlyT0y2~P-=z#{K2-E!Zjt+^;LBD_hTT2%24cJzXiL9PO^o1lnU9tBxGMW>?kbMqjuxRqMU9wBc0>U{4M&fr_Q z#Y311K67#7aVG_tKoK*;k2^VlrI0EAeRt^3k0rl-CEpUROVoM97Da9z1olFfX|fj# ztUc@SON1YpOs80TZHPCPQvw0H+I^fPT9|LLjR3593uNUb?Nsf$3O|CjvX<)RV0W;v zB8CQQ=JavRwcXWP#jRK*%a>ClI~Lw#~8xNwCdOLVODjPAXyu1uUoZ0 zlP+(ZOB5+mobd^A~U1)>Br0-n0lI@Zk*>NeV2r2r8>KM$E7nfMluj^Whc=4y| zZnGJ(;K)dUBb958tJ{rMU&Mw^d*|6dLgl*MkA7$MXs3!ytp7<47%x0hj5@o< z+Jl1A8npt6AWjiM!7xDnFF6)SmLNu~Zrvtb?RQx}3km{K{uQZI0{QRD7}!9K4OE8b z2lA#Nko<#<-LYoO0|Nm$fdTWztX%!EE40d%=EeTuwTD^3h`AQ&Hu?P9rg>z3M53Q24*EAd~tJuUO)mc z4CF5<))x~O4>$ru`(o+>k$?oC^FWbg?0_Bpj_j*UOkbw3{f`;?ME@%MWIzQ*r{I!&F@B|+j?mUn zzrcZCVDA3`ZX+0)>c6CrU;AUIK(;h=Sl=&en&b5H@PRw2m|!*ird+jOmKVTHC z|A0|}gyv}fSK+^VFvI^Sv>E-YP_G9A%+Ejri?RlirW1huvipw|4LFgCK=RearI9=q z8Er8@Kt7p3K>oL0VV%CfVqV<3ZPG7NCoAJ$`MZ5}ZMgsW&vNKjW1HF;ySh3VyICpA z{l8)HHBh8=AuD5hzwqu~dS7em|GHMgzVw`29Bs@^-IV1Zzp51k1n29H`U>w)h5wWK EKLTDdKL7v# diff --git a/src/com/github/btrekkie/red_black_node/RedBlackNode.java b/src/com/github/btrekkie/red_black_node/RedBlackNode.java index 8393fafeb..1089cf214 100644 --- a/src/com/github/btrekkie/red_black_node/RedBlackNode.java +++ b/src/com/github/btrekkie/red_black_node/RedBlackNode.java @@ -232,10 +232,11 @@ public abstract class RedBlackNode> implements Compara * Performs red-black insertion fixup. To be more precise, this fixes a tree that satisfies all of the requirements * of red-black trees, except that this may be a red child of a red node, and if this is the root, the root may be * red. node.isRed must initially be true. The method performs any rotations by calling rotateLeft() and - * rotateRight(). + * rotateRight(). This method is more efficient than fixInsertion if "augment" is false or augment() might return + * false. * @param augment Whether to set the augmentation information for "node" and its ancestors, by calling augment(). */ - public void fixInsertion(boolean augment) { + public void fixInsertionWithoutGettingRoot(boolean augment) { if (!isRed) { throw new IllegalArgumentException("The node must be red"); } @@ -307,10 +308,35 @@ public abstract class RedBlackNode> implements Compara * Performs red-black insertion fixup. To be more precise, this fixes a tree that satisfies all of the requirements * of red-black trees, except that this may be a red child of a red node, and if this is the root, the root may be * red. node.isRed must initially be true. The method performs any rotations by calling rotateLeft() and - * rotateRight(). + * rotateRight(). This method is more efficient than fixInsertion() if augment() might return false. */ - public void fixInsertion() { - fixInsertion(true); + public void fixInsertionWithoutGettingRoot() { + fixInsertionWithoutGettingRoot(true); + } + + /** + * Performs red-black insertion fixup. To be more precise, this fixes a tree that satisfies all of the requirements + * of red-black trees, except that this may be a red child of a red node, and if this is the root, the root may be + * red. node.isRed must initially be true. The method performs any rotations by calling rotateLeft() and + * rotateRight(). + * @param augment Whether to set the augmentation information for "node" and its ancestors, by calling augment(). + * @return The root of the resulting tree. + */ + public N fixInsertion(boolean augment) { + fixInsertionWithoutGettingRoot(augment); + return root(); + } + + /** + * Performs red-black insertion fixup. To be more precise, this fixes a tree that satisfies all of the requirements + * of red-black trees, except that this may be a red child of a red node, and if this is the root, the root may be + * red. node.isRed must initially be true. The method performs any rotations by calling rotateLeft() and + * rotateRight(). + * @return The root of the resulting tree. + */ + public N fixInsertion() { + fixInsertionWithoutGettingRoot(true); + return root(); } /** Returns a Comparator that compares instances of N using their natural order, as in N.compare. */ @@ -383,8 +409,7 @@ public abstract class RedBlackNode> implements Compara } } newNode.isRed = true; - newNode.fixInsertion(); - return root(); + return newNode.fixInsertion(); } /** @@ -757,9 +782,7 @@ public abstract class RedBlackNode> implements Compara } // Perform insertion fixup - pivot.fixInsertion(); - - return pivot.root(); + return pivot.fixInsertion(); } /** @@ -882,7 +905,7 @@ public abstract class RedBlackNode> implements Compara } last = lastPivot.left; lastParent = lastPivot; - lastPivot.fixInsertion(false); + lastPivot.fixInsertionWithoutGettingRoot(false); } lastPivot = node; node = node.left; @@ -925,7 +948,7 @@ public abstract class RedBlackNode> implements Compara } first = firstPivot.right; firstParent = firstPivot; - firstPivot.fixInsertion(false); + firstPivot.fixInsertionWithoutGettingRoot(false); } firstPivot = node; node = node.right; @@ -964,7 +987,7 @@ public abstract class RedBlackNode> implements Compara } firstPivot.left = leaf; firstPivot.right = leaf; - firstPivot.fixInsertion(false); + firstPivot.fixInsertionWithoutGettingRoot(false); for (first = firstPivot; first.parent != null; first = first.parent) { first.augment(); } @@ -982,7 +1005,7 @@ public abstract class RedBlackNode> implements Compara } lastPivot.left = leaf; lastPivot.right = leaf; - lastPivot.fixInsertion(false); + lastPivot.fixInsertionWithoutGettingRoot(false); for (last = lastPivot; last.parent != null; last = last.parent) { last.augment(); } diff --git a/src/com/github/btrekkie/tree_list/TreeList.java b/src/com/github/btrekkie/tree_list/TreeList.java index b5de0ccbc..dea9bb65c 100644 --- a/src/com/github/btrekkie/tree_list/TreeList.java +++ b/src/com/github/btrekkie/tree_list/TreeList.java @@ -133,10 +133,7 @@ public class TreeList extends AbstractList { newNode.parent = node; } - newNode.fixInsertion(); - while (root.parent != null) { - root = root.parent; - } + root = newNode.fixInsertion(); } @Override @@ -418,7 +415,7 @@ public class TreeList extends AbstractList { } prevNode = newNode; - newNode.fixInsertion(); + root = newNode.fixInsertion(); nextIndex++; haveModified = true; TreeList.this.modCount++;