hadoop-common-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From d...@apache.org
Subject svn commit: r632035 [2/3] - in /hadoop/core/trunk: ./ conf/ docs/ src/docs/src/documentation/content/xdocs/ src/java/org/apache/hadoop/dfs/ src/java/org/apache/hadoop/mapred/ src/java/org/apache/hadoop/net/ src/test/org/apache/hadoop/dfs/ src/test/org/...
Date Thu, 28 Feb 2008 16:04:47 GMT
Modified: hadoop/core/trunk/docs/hdfs_design.pdf
URL: http://svn.apache.org/viewvc/hadoop/core/trunk/docs/hdfs_design.pdf?rev=632035&r1=632034&r2=632035&view=diff
==============================================================================
--- hadoop/core/trunk/docs/hdfs_design.pdf (original)
+++ hadoop/core/trunk/docs/hdfs_design.pdf Thu Feb 28 08:04:34 2008
@@ -511,10 +511,10 @@
 >>
 endobj
 90 0 obj
-<< /Length 1502 /Filter [ /ASCII85Decode /FlateDecode ]
+<< /Length 1597 /Filter [ /ASCII85Decode /FlateDecode ]
  >>
 stream
-Gatm;hfGPN&:X@\_..A[+U3S(n'/DmD*"4ogA%f;K7F+^#DbtrWUI%ZK!D_h7H\::aWs.RXnLNJp=J>5nblndf-9]Vr;C'/?2@34]jBaV-m"uKj)FBU@I-STd`&DJa6CD(mI1c9Z+j""D`kVbD#@#;nZlcsnD&]RP;o+YfI("0_@I-q@QE:&*"Ac4le%7Cn'H<oho1'&J+2mD;>f6gd+(6gB&f_"))T_*O(RiWJQ_?M<8&lF=aDp*<t1_si;Mm\IWE51`JGZanJQQgD"+'JrNM?r+?VroeW1n=8@BoE/S2N"[Ur/Hk#n;&.C6q6F!eH;\$ao:_E@kn[""p8C<f^`F%t#e2CGMT/;.hARfTe_k>(W'J)tNmUX`m%)sM*oY+C_9^u\g8PgshTJXY&qOJ4J17Sn:8?%KBE8Y5Vo#a0ek`5Lr>1c3@QFPnqj,s3Z-l!=u_\mjA"3Cs)/%(QP_M7d#*jn>eD>K`n0/)Y>f"p`lr2K*op#mG5""GLC>Q[AGO-kLYE1(HNk!^A^!7WLb$7MlXLFNQc'FAfc64*.9u<ecRj&[gL5Y8uBI1+h^6+hsD('OSWH>ZYO<f-oW/dp08$k0&'"8%c<u_JS57cBo/54^)H^7`Z_u--#sm>SdM06j3bN9%LYO.Sq!CQ]Sc944#;nPF5C((Yief,l1-Ll59q9N+3IQ<ok7"77>:c2cauF$$j^.e.\q)XLukqInVRl=Ao<cXV:4c1)[)(<$.E`Sf4!9D@.,*j$M$'1[TIY]A4n32S\5^7BV2ffb,c#+cMA!gK%F5Xr7pf`l@r>!#l.i2iYQ00P!MjQ^G99U&6^1-+V%@cFd/'-kaHXZ>\R5,%ep]*do<i<6@VX@1JW]nq_#GK1<4*@?Tn$0P^,O$:W6M+Zh`9@_0:lpQ-G1Ab^r1?t.Eagm)@"!MKF=-Osr]:5qR"1?V(,dL-!D9!bU4EMp/l.7G^8qNB2j]lT`E5ZN;WZ[GD+&%e!6>6-Q
 i^*U2D(ntGA`S3EJ<b>=4!S\%N$s962/YX@$>)/QU@"U%F55r1fF3\jH:U&]E8DB7O(bASZ*J)*I+D(jJj80/KjM3.;"Uk^jf$^]\[O!fM>Doq[iKmhNL#rQ2^#BiMh+9+%n9Ad_LK,C/qRf^h>hsT\dNk&E7sA7Om0kiD(>OeXh95Bub^sCn6X`u\Y3sJrV6ig1Yboo(T73.`\q4U,E_/mAonrI<<1f(1^Wi69b"RRLEL7SY8'!X?BNh5hFaABfLA%36&HC=N:`NtL1YLht+*nkj\f#i-SEGLN*da%Q6Za?C93El8B5Kfbc2;.&5P=W7NRtGjJ$eom==:Z!^1V370/"ZHRp//JZDBA60Q*K[\\qPJ4Ph[gdnEu9LV(>.EZ=hD1Bh)eC#>Hm$O+H"_f1OoD\C$"`!p1GO4UYG_-@ub-W-L(GEfbA7Xl`%S9ai6<cbSSQcm=KcIO!P]+-heeutgpk7QXZZbQ,X4ulZqAhi/Ea;S7pq$+BJ%/1:C)"gK~>
+Gatm;968iG&AII3i0_a<1eI3\j^uP5RSG5%D;Ene+;,qS!=8r1V)lB*9Bq(^"D0^DNlO$Y'"e&.I_46\gb+'40"rn];T%sY`B"DoP%>O/:"&S-/rd1[M,U,cfe%Y[4J!$&hi9p@Sd+LC-I^B(C)*i0'e.kUrPpfC:\&bmIZot/#p3ua76'NMO%-$7=W4(Bfs]t&2e`g,Dol9IM1>-@HGKu(2nfQ$Ya0FoS_`$YbUteYBk*KjFSBNO08B/r/bt<@J+^T`VKn9cko"^cXl,h*ID8?F'H\L.jsN_3jm/]?N\ULc>.Z(2qlGhA[,'^)\PV(s>@D`7[*QKLD-jFl_<HsfD@g"*Q,jZ:.]HV*'b'p4F)Q<H^[nVBZ0LBs([3].:nNhq^m/.DO>V"50Kj&aV.=@CXi01]VI@W4Vtb-`$mDU[5VCWkg9=T_Qk"M`UPMDTULm=nNbPH^6B:UZ5==iU/!2q;NV5ln%%ZEW-PYoc#R4pZ,[B17WgB1MAKqnH(16OoJRTbe3b:Enl6UiKl8m#h4\Qt?:=(`iGhXaZ7lj:XYZ7!J59[B-PRGeqp.WNN6)q,3@gB1J]JPW()@VGs:(<QGSGS10W<r#FVKa*bb;1K\+XYN/dL\F7_Sl3kSEj[X>GtX->1&d_fE<b#jGF[9p`?g<b#TkFJ:]l#'["-n;DCPtMfTj^];Ah#FbkhkZ_rBW8^L\%ZQ<NYAsGaB`oE<DLc'c]eTha>M60UV`:hQK*3b'8md=1EpKX^Y@dXFQ8q.]>d$7]1_8m)';0IUBV?'/;\Et39A`&FM[@gIso70O[>FVKlE&L``c^.J<0<+jg<Ad\7<bL9'1L:^83GRdUYsN=V_uMMiIOZ)<m@f7bNHmpOo0FlgJXE6[`@1G)Tqk0@i?EXA!ekZCamZJsig\miW.Dfj>_Qqu<JN:K^B4gN-VNe7S<kP*.]/`sT2aNUK.hFBM],Ni;0&TI%J54@U1)^HO++NmW:OtH;J7Q
 tcBs)[>&PD.d\>^V*.4Y>C>(Gp%K6]:6X1Y+!#%DSRC?S!2/5>S]Cg6]oB&i5X_jpqGKhMNr<Xm("LGAQ\r,<:`,uRX$n/7_:N3AGU3B;PY+D?:T$nR2:fAO2ELe21!!>mG1U\l!+t(\YaK[O]dWEX3Q:+R_AD(N]O>'e53B<1fA!;:$WG6J8^biA$k]q3!=5B/>;.9GkKsq-S.fjo45US?@iG@]=,dR&Nm&dk@GE]R^FKpGF!L0l#-on0J'ON5DFe.mejOf7J<rYZa":k:XJ)'ZD37NcT;#@s9m$@+KMsrZW;6mPt'ajORZGpU2[F6A1h;G!C3Jhg*ln-_'?<#9(im%kfS5]c>5VIo'?J/7(Y/ZMg(d>oNJpkCjaXTi!7_B^Qf-kh65L6#CAMIG_[$7k?[[u9jjg)W]bq>?BQ`7B<kNk>s:V[G3Gc(T(o&A^4X+b7o?R9T<b1I9FQLcLD#06PQ3Y/NY(Z[U`<p(l\Ts^p_7imQ-YK&pM7f>G@EDAc^Xg=7ni*M;9UT!pmIoX.!-HbN39`=*LkZmI(%`@))cJG*-%m<l[[!n.&3KH8BS^"#2$ICLNlseDFd2L^k[:a&Y*VU*)pE\A~>
 endstream
 endobj
 91 0 obj
@@ -538,90 +538,107 @@
 /MediaBox [ 0 0 612 792 ]
 /Resources 3 0 R
 /Contents 90 0 R
+/Annots 93 0 R
 >>
 endobj
 93 0 obj
-<< /Length 2473 /Filter [ /ASCII85Decode /FlateDecode ]
+[
+94 0 R
+]
+endobj
+94 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 90.0 164.775 170.304 152.775 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (cluster_setup.html#Hadoop+Rack+Awareness)
+/S /URI >>
+/H /I
+>>
+endobj
+95 0 obj
+<< /Length 2421 /Filter [ /ASCII85Decode /FlateDecode ]
  >>
 stream
-Gatm=9on$e&A@P9n1aqV7c,<T.;?(^$D^8*$hVg5JX.^RLa5$G[*JBsG9gDDN'uB;&-O^]XX)3)R<eCYIWL#1mf)A7NP!o[s'K\BLH2C`MVp8rqsQ1*-Y:"*XgD34DuR7lF7B:W&"/2jIru^5>S$gS?edWY;\&_H=,/.jO$ugJ]!#.a5LX(Cb)A:*i?cCRSuI&4hUV14-`4<6fp@FflhdeP:[YT7'Qo>:PcBl=Am4B1jjRtZ'kf7\^;F0NT'\VA$80L+5FA37=fOX]A(SM3r`S(W2T*=+=YO<XMWt*t]PT=nG)NfXWgZsg=13-Nc9\^\V$50]&D.Ro&<%ui"5m=VFY9.abB;Eo#&c5Nd,:f<0lQ\_,.lP\nfTHpVA1$H+>\[9`P:=?AW&,#%C30;(s.rmRD?q[;4qlsAZFI`)M1^oghD>$HE[#BLOOf&0O\So_=a3PJWN/k)XJ!R68cgmS/Q`+$1;SknKGS@\Mq-E>1Q%$N>\Too=?A)q!1h?KYhq;ZB(F/%TA]?UYE7M>90jr&e"d'"\o509:KGN[1Y]1n>sTU8HQ77ptbDrhVLD?Sqj(Cnk<".($7q./_KF$ed+X59QUMB[]nYZPN:"mj_/5-,7#8BBkWU;]N0!\2K+APaCPDJ5Tohfqr^FrU2ZhnqDqADi<NJ3rjgnBX/Ri>>$D<V)T_7km2<6^KW6O0R2POFp3<=U)%gaS/MsgOS;l&oX%1AAZ`SC;(J7al(D>nM$#V1j@b+\j^(,?V$rOi<Eg<@Bpi)BQgfu>U'cg4SU_,a.nae%R5)!0KGb>BLHGC=TJY5F\q-')i7;nsgrXisLgp60(Y\G\AKc%LB,0"1u_<m5NY!q4+30C<&RuJ1&:2.K!.uhDY:`%JEO?Zg&LM6qG.\lCOi2_dShU#EL\MN_-1.2a)`!Hr,+mVi(&MGTnc-m6X!NM!k,R28Q;_K]S)cUWn!LOuu$F#W%V<5ibP-&mfL,R5^C2D*Nf?^(
 (P"ej;Ae14,ED-FHqpp[.kR:9580e[G=Fg<U1JEeLLl\"&$UKG^ArfB0+W(C`@O)MmW48p#fj,GAk5+.gF9H[r,erV@ZLsq/-4agZTF<H+l,7:*hSc.i-PfpA1;)@3$ApaE:A6=[`ASM9#E?=9R2OJD=*V8h15I6:,ijZUlXA=<a;.\k+:7DiSGL(&gN_7E"oWsFI<?/<]ACA*(ogH_s."FV-VBLAeF2nTjcCNC%Z>sa*7NpJ50["e0u?^qk(i@:E%M#40e<&Q6=Nln2:d/0%[3m'l)Gbhl(eMt3gA"/C;RBl:<2'[$B#%*?l3R7-Y%**Rk1nh#?9L+=Y6;;@+@i(Dgj%:%\gt-+^(c_nkq5md6>EgTi'#u']`"U5i7*3b^"GVYTOlC]WrT"Qm[2EE`bB>AMDt9rj+nNT.A@CYmr1)NN;ScbSNb-eIZ$p^qAN??Hoh%J3X[PGXPqZFOBG_SjjI$(mq:Wb!\HF1fg-\0B7RtA54Q@g6p2r*SnU5L``j?"N1j'BLWo8r.GN]<4`iB(MV<A!Z$LS8<Z5pkT)=pa'i;YOJ8(2/4tPW']$R8NYT7GB3q#HpABU5Cg+!rDJ'W<^I+".!Tjr7A!!1Na<V6$]Gq"V_(%m&JgX`h$G=V]5GHa&QrF_G-5ZV;@:AHKkEaqZZ8`V41ipZ(Uh-uZ0mo!#S/KRN#2L<m<r4o(&n"rPf$'aO+^!KRjQ/!tA3pbmbMZqKZ"3Lt]mp5g$XBg0s1R[5K%*j?h,/`.i#<(8m7"s[[fCkq**.p"05LW:\HSgDRh\OU5DV.@)>I$#@k<TG?m[D<1u0.bX_M#NTZF6Z*1r&27`m;I;c\UjX>FUY%KTaWeX@J=R9fM,(5sl,",Rog1ZNAVM1D;mfi%NoRA.E[nWjVpD+PT::m^B?L>qq'UA!f?c;`:nfZYm[/gBJu'=6&-0Vj^TVV,!\?YfrNqq1sfW*UICK(LrrU/T--Vtmp"@oM7qTdJ#DN0,
 i>%c,9qjU@Ojc^2r8Z\?f0E-]%c!5hT&I^qf&o3D"MNdHiU+R]H+OuEotkA>,$Xp^jLmPAt"DpirRHC9s][,b*F5qX:OOL`r7<gJ\f*W?Sq,Z0Co&'sFOAcO!7-Y`bo.hSpgreQUk`W"X1'uj_)@b2=Voc:0**WI-9Plb_"7FR6JM-A4'KJYc#_4>AiHi[I:0A#r$iZC(7Cd*7O@0L'Tf(864En#:,"SX+3q^>X.N]:A$HE2]&KM#Z<&#*SLK._;[PT3:\aO<->@!(>;;EJp`/Nk1:>p&Go>r\5D'=mg?B3X'+Y^\c^5Q0Oh,Gna3pi"6!5l^HQ!C!D'>E5`8@:%T%hI>!ImbH,"r:9sW1gin&FS#*dqbGll#Ue4a`!gD<Mh;T>lL0HN9;?Hk^nC'8a+RgLmRbUHFstEk)9U/2h.bt2:->XJJ;;,0*Cp1;^/IJ459A)jY2$%[c3LJocsqhD4=l6#)mk@,erM"f'6aBV9"GLk~>
+Gatm=9p='b&A@P9Qm5R]nFoFnK"qRg73L9cas!7,`g17:f[_2"]52qEg7IiEgQoJcMFo0\`g42C^OG"@H#n?*me5r3Q+P_c^V=*O%WaO*'Z#9OYlF=<+SD,f6lR^9gT*QAhE:Ubk9f]5l1J-0iPtQKd;<mb$su$aO1RE$)+H/tK$A/?q>6TBfpCh]lnE8JlsVR4Br)!ZA\FQSjLjSj>2JZnqY$RSR6=;\EA-SiX`N1&>&LrQ2#)k/I)XJHM%"(l@Tm;Rf<dkS@qE*@Q50FOGF%Xfbs.]Phe(.=4psjC"`KKNXd]7%jX%)dFEjd05-5O)0iQUgeY6rZ7g55jVZfEP]m9Z<oF($>)KrF3!;m&u6a9Gs3_pIr'J0Q?%BfR<o1%?@,3)s]G3#t]VI_>IhO%_d26WJNa(/C(67DbTeWm7!P\BB6IEZB+P;6c-p0)/\%TPrL!LUR9$kYBUSVYlir-?,b(7ulZr`\6nhnQk=\aqoo8$V-CW!F+RJ[Jm,k_sTmduYk#%)B0&rFSff2f"\RPr65tE4i!?6/M09_;![k*3pcT"n7(.n:T$4NVFdUUh+X0:,:l8=M+Q<DstZnR!#M_ZXjRapTi]$RZNVR73OH3*`4u?gIr]5U)'2a=H[6<d-;[Qbj;9\d"TnJYD'nTS:Z*fPZWmC)^ecF-UY]^\Ot6\HoN8Y2l@"I[BmMS,A9J@7f7Y5''BV>"'In9"21AX&LV6@q,Wfe7Cs!c4tl??QGkAdNe=@?6C<H]KE?<4`ar;8Xj(r>nd`]sY`A0q>3n56rUrNk'YZ.9rugnK;$ncYo&kVe@9POOY_F*Fp!QG1L<<ufcChej&4rZ/'-:CFf%9J.2m5\q8JQ/=6RW0f-iT8G(_`fR=Kl/@5a]5s?sM3u'bZk_*'$RBC2_/>@@:/U9ps"14g%$"KM>A-Ae14,E@_0lFmI!tF9X-5eBeY*=Fg<U1JEMDLl\"RKci\lZc=8>+rErQJeYV8>#\b
 X,jj`&>H^a#V]qdXJGcE7AF#^oXX`!@'YrWn*)E#8e4n__otk1=:klYNe3VL!e`jf$UY+_'i6\5O3&=L%oaWVk9a7l@OT\umWZLT>M:c8D"!g1'Rr^`;FWGC*Vulp>7t(%sQFbr#f8t8+l@7)B\Ik[ZNns0.l#OWLgmFp(4O0=6^hb5B28TZ%(qM*1EVg9bXQ7,%M-[*h\E>YIQqZ%)<uktD:3)HETnF=b'<U[!FPJrL@;3Os(^?Ggd28D6+\R"SWQY4e=Y6;:i3'D:'X2C4MoN$$0ejq(<C8Yjo,"MR4;SpTr'Nd,,QdTI'Z\G8e\QhWf^NXQPA!>D#jTG:F%<_K`nSI^2TYEr,UN;a"a'#JBB*aN(ImB6&7,a[]\`$^bun[E+:;43,-\T)BFZ^lUPr=abd</J6pE4Z<h-mbE?I+o-PCXfb\"/@Sm_UEFBL^-@Ybd6,E5QL`.h<m>rGSVb,"L:/.'d&-@HTU)d\>]_n9@h73?\HdU3bX2fLBJ7Gi)eO=&"(59W.YQKtt@fUB_8+iidHF,[XaaN["]&dJOt`rJE08s,b)M&)u^_+=N\>2*Ob9ph;Qo[AJIWCO^-<Ze@$\2g>.))%,<D"3[UH/eoUURB8t\tdto^B[pDN,uhXr!='h[;AH@St\Y#jLtAdcKf95kiI-l"PF-PXebs0l+mGd.uiDaTO$J;$kKI/`0[q5IW$4o&mmkC!7^*G3_eA1:s/V4Uqt6qJQ*OtBdA43XSC4cF7f1+BqYPrDS>**7V"DTmeKIY'b[Rqd*$M:d(69djEf&:EY,QjFEnisbc%_(]7!HX$E[B.f`PfC+I1'2%C!8d$@9oh[$)ZD4We^iUH>Sge4&$6/81VCc4;75Tl_tb`tHj;0=!7>Mh6`;!,oqb*3"P>2GTuFaBb_>[\RD3?On;-brCZE0mF2Yb+!C*b_bYb1\bc`ZjU-1T%q0Oe):GGNCKM_?JKPfnK$\]!*&OOmeON>);K@t8c&
 qHn!g[jSNa0t+'S4anfS_[:LL?u(RLtm?&&C81J,0ra1LMU?!Dp=VSOO;TOB.`FjKOHFf'Cc];*5F/62&"`4WaW[Bo26'2p?QNA9X7i_Iq-p(Pm@NWiLeWTOZAZN#NUK/rr$JB6m%B5"@hbee[uI8-luDB@bBUiRVHbL%'FZ?^NoO2]NB='e?X7rOTqJ-[g(64bH4(j\s/9?@o<%'t4!Gq`q$>c@gNoTn>\SY(toT-#$npk_+[Xg>]W7Fn&JlHas"C-&4j?qf48gOoKlk+ePD$pFR2:PX4(mq4BOl-B59_*:0S2a-EcPFJ1?8pNTQ3Ch_SrJqPFrW-3!&H0E3L*93bE0CETfP.;Z73*GWh!KmhNKYM7^!N<NT&[c<C'8c`]KSTuJCZZZBHKuNH,h;aWiP`bZXr@,A&99'_q>K&6PAU0Og>A+rr=1_`rH~>
 endstream
 endobj
-94 0 obj
+96 0 obj
 << /Type /Page
 /Parent 1 0 R
 /MediaBox [ 0 0 612 792 ]
 /Resources 3 0 R
-/Contents 93 0 R
+/Contents 95 0 R
 >>
 endobj
-95 0 obj
+97 0 obj
 << /Length 2603 /Filter [ /ASCII85Decode /FlateDecode ]
  >>
 stream
 Gau0FgN)%,&:O:SkV8KF(u@jGc$&)'SR1+(1OWs5!0N@rRNtu8[&^t1MAL7u!fYp1PB"U8KZftC4aRt:ou"b(LPro#][[L@5$k<ra'HZ(%0)+1nb4t.S2gL?d+.:<[u9R-Mmp1Cb4FSUL[BfMc>qm9\*@Qp^(\-;lChJ]n`jOY?a&>]m4tkoG^k')N[dq)=d'8BJ][G+WOSVs38PXph\BJj(KdTp3H`>3&#R[n-]Op8,D+J]Ulm!%N*#&WK(!$Lr`hVa3&*3k45jRZ7Z%6h[QS"[kO!,6Jng\A_:69P=87k5p![V&%.It3l8n6RXA;cBgpEqF19"r`$A=\;)&MLMoSEqIEOI7FNoH6923)pI2$.3?\(e1ic'&Cb\QggL9L<A49TEIX7<5-DK%Z9qFsaO8UHe\/nV;&<Ee,e@LQlpI09OY6'#glA0aK9*Cbq5S[U@C:*`U,b2<2b-8VJo@Aa2?XiJD'+ks0KEj3GMV>U!h6`-A\&&nTBP.p5/+EO_Nla^c%'#H`o-=e%HUa<^*W^,6h.6TbNmlBo,qd<b2UK=t4%0O>\Z"e@8U3t-EH^B;=)_hfhQPWXN_ph?\]>&^.*L!0juA3O_R-&T*;n#'eSi1%_2T+>XR_RF+CrrsWc(;k4<gbPoMQPdoIBQAHQQDC[k:QNn:0K'5,T%O+\Nsk<0I9bmsT"Ys[Qs)3onaRDF*tFKg]Qm'P$@Uh%f=l.jXo).]*F4Q$3/!+9BA$OiYGQpl]-C</=\`:l77Q#0iqkoCW)&oSS>A2(<gsB[O_YXkF#J9=[+7PIS\9Zs`/s7GjMt_Wg4LW%9'rLeNRu3UJ0\<ue8F?C+AfFj8+.;Qo:qG28m67Td,G<9`?RflAJ>OtEFRDe`10H.X6:GO+QFc`V,0@u-JR9C&Qs/J1K.srBJeR5!r:lag&7PHIPtC68u>JkZV@a)CMqN4qZ]PoeW_"fWQe)cQ9uK1X#dI$EnKi-qR%S*!>2JsW0<)
 EKski59TR7Acu-BgBq7f8Gkd[Dg'V.qgZ0U5'+.4F1a%[mZ7Y>\Uht74=pn7S>A"2J8eP1<l-`&M@"LuVNen1NP"H89V$3u<dE"JZT/R+\KS*1ObYQ8CKH'MH9EIlsfK>W)T=GZjG'"UZ_b]KH)::eaO$lot=LDiX?7a(>L:._;U>3tT?iV=d>)YR@]J)NZ(O[(edZ-DtI5B6OS-g/[UCo`*+&8X8=VMKFb*,r:/)/P>Z0(Ct,.j.35_;ZV@TQ;2`IMNUKIQPm6A'e/HbOMkLJ)-MiId0LKtHM^"8mNVduAB[8njYK\TfskD_@GdJ4(4KD^R@H/sZMD&]UO51Kgl;@]Pfp-pcBmgSdS<UG*%kcb<6n]n`mV`<YHFZ9`E.-Y4>XQ?n+N[8Fj"%&IT8YOf["Yo'UQanB,%K[4/IT-93$@^ON2<&_9Db/.^gTI@YAUhs&SI"*cCkcpp@&K3ZYV.lKnD1Ep$@di'AOE7FI!V?9[:'ZDW9O)Lm(bNrXjR?F@*&LuR'9h4G9kKC"!K@5]^HHE:E&Z'9SB*]j<0XJi<iT=h#D)5hJZPpBpJ.#XZp4jKmaR[7P(H.b,:)]MRR,OU(bAQ)/4%QtSt0#@+^0!"JH3D-$5PIK2Vjr1+jt\[/R6D@HY($'UJVA)"Tq-$>F)P9Aao`J+P;JQ.Z=*l.0u"B1aSRH:S9R>2<;ui6%U6/g'5B_h&_(?AX*@7Z_J6MH@DMC(C]32RBN._&#g['KU3O'G!Dh2W>Pq0,\p^h7&4-W-=)4na0Wb^)G`WqU%`.YWM)W*@df8fm(c%&D\-%>C`>&g=`>4bQP\KOc:O0G.kc!$8_S(H-W0c4U>7T0Q)5L,Q;'6Ko"GcBnVe7d,L52Iq/PE4EBLm:9C4C`oM\1%kj7_6=8)F1bf?a(A"DD0YEK<6T\@@(Sud0R%24E?c/%,MGOmBuJ61s)"f&!`5W:Ol*4Ikk6?6ueIJ/uNb'6q6akJjL9*nt]Z<\
 \s^4\kK'5PG+c^4GR,SJU?93G2hGaudM[@QS*n.R2:+h26;)T$7Rm9gnp6)`&YYG,@qc?.uIWS=\>]68E;3PUjZ$360TEGrd7P&ha:NiuG]D7Vb*51>[)d;X;GL[t_J`/VdR?XA/p]D;"9f3J]brZq3/"i2"g)a;0s&FZdbKGJ2>.9;l7F>qOSCK1#>S']?b>uhtQ'&s&>'V!U]l<pp;9@FPK!FkV9iN.7ZIGM39\$.RclJE'?KN87eA,F.E6X8Y1PT;?tYLWt4!YT_UcH[+Aq3c.>WN*B_[hJfqKI@<-T`B=M('$!QAP('FOOYYnlBH5d3jKsD>I+!VbQ@@rAY(M:">(HE.G>F:#5<g0o'C6B1X!nKKGBT%Elq"f1]18<KJR!K05s%'XT=V2c8pf1Ya+:^.po2Emm2s?[V>T)^Sg8(]uE,s\8Ps8471^d!30+NDU0&q&,Ht\GA/iC#Jos!A3*MtM3C?@s'<[+Npbd7me;Z0Y!ZUihT!2,2Y=B.)Bn1P?0o'rl6g"nr\hfT+FrHbQ%f:*f+SXt%q=`ZP-ed]5OugVn%-V#)UN=+=#H4*1qr-Wp"ZU*m`@&!Wk;=U%[ttrC,]i#Q=p]S+eEB8N55B"]!TQ=~>
 endstream
 endobj
-96 0 obj
+98 0 obj
 << /Type /Page
 /Parent 1 0 R
 /MediaBox [ 0 0 612 792 ]
 /Resources 3 0 R
-/Contents 95 0 R
+/Contents 97 0 R
 >>
 endobj
-97 0 obj
+99 0 obj
 << /Length 2385 /Filter [ /ASCII85Decode /FlateDecode ]
  >>
 stream
 GatU5gQL;L%"7$:n7+MC<@(f"^85\Th+k/qcLdgt""hn9B-gCu-%#RaKl.YKP?rGoR3YGY,(TjSi.1^lbJVAeLG'1pjoBm\GXu,\h*b*Crrup3o4.!>:?)'g`AbDa59@OeH2.4bgiu#1p9K0eL\G'Kj))e[6f3aU@.R95rd*03MY"#0O8cB6]1c7jXI"'VDRa#=EkhObB;4`,rfek=e$#k4[ESI>$h'EPhm8W:^P$d4o4:ejp*A2S=.=[t00cSog87V!]@AUcMH7f%44ADgIYp)@G(bO_kGCu[kRHu,Nos71cq<NRAb@kuMOaL)_kB0;>+>&Spu<aYPTjVNAWpDSfXdXf#4W[=0BiEla-J[t-=D8cNK/Bs=`Fg^c0HA(BlIR-<,o%n!PR;]oQ,".l4$f]k2:;`Se8=OmYY]q#>R=lFGVG==%3srk!k\Z\'quIVst1T2LALt:!066H.IkJB[=lNPA#k5n3ES[oUd(-NBAS[?+ktIk:I[4N@]`0L?0q%G%Z_-%)AetDMI2S6s+eW*IWQi6/mR(IhbncqIU.^9P'!><]oDbCTn:]Z,V;K<-k>MF,<\m-/*JpeVPaG,(d)^Ve,DrS'fJtk\Olj(&u^%h-*\aJl:Qb^aJ5sH.i<)iIp#dr#g+)(!k-[0H24fPTXe8YTn*-gQ`NUq!n6ZcUK=1J)MW(@jMk6DOCR'if^;YH?iNQ,deAaf;5<SX]4G)f<R`Hmn0"]>,&D0!^kl+V*#>7KJI#p-4>ChL1asKE2\eum-Z8L<9>+'C.hgdM@lUZKtu3Qp8R2_<7r.>jQd_qFtlP*Kt'M[/-N0@2e$eWGg2:S@Crh:>h%G]`qT^(]R(W!`?1(0OlTqCi8i"l<DFLg974rf3/nYc)?TJhZ.c@ERM`?j)+hNE^/Wd4j*m21GA`a=V7HlJBAT^,36pGuPV2<f'>9#A^#.(@c63j?]`)9s+qs[E[%iTDXj6cnnbc*M)"^EU9P6fXUQ#,
 Rm!?*G*dls/<jFb"ot`-AK!"2=BeToUcnot2\\LiX2bcat81BLV]B"'7LgD*Db/3;&)\$1J(jm#L'+iQV"b%@M;*\uk9hAd>0793S;sUK6gA'C0_"W?k,J(3a(lk)Zd#(3<)Um7HS7LK7Ffha\gHfi=So_i(:L)R'=lE';\+6#1=6PhO:'\&5,l!si=h8$0JDFF6I1t$U"Lb;m6o+nFk(Ip%\8%GIo,Wd>\r^K`,4JiAHiV$d/Lm3Fm6'QFMZTW-4*sE'(nkoUb96MbY%6bV^<e=$)1[MVW3lp;9*/C83S1?9k=JG^/QU'j.'+<OrY&Mhk.J5[E.hqod.@u0^pB/?*2B9+kkKrSLaKE'mJj#;(P9J?(b<K[SuP3/Pji/<hEeDNONE%mbnRdt%c,I8h*DKUhnlO#5B_Xo]8XpP???^kDEZq:+<4+#`dT&^)[V[[.USphOem]W\d.jjDZO9O",),@&cbj&*''_dWR2C4,d+negc/+E>h;PZ'Z`6cZ`HMC$OVLnDgE5LQ$CLbAjXtncH/49cAs0e21<"CTK?@'`3)0A;!D`*Dddsul=o"Gi[6JQ\f$,u&=/eE2<6b%\_s-d]5%"le<RD,\V)4UgL4o4ZgTnN,7"6"\/FVc%thJ:5_=p+"5OP9]6,q;KP7Uq<R]?4DIJ1Rj6UMa0n5=o;kj'nqt<TNDKA9b1uJpjNdnlR1@gGNk0TSgM^S_qGgn]']5(GM2'"M#5)=ml''b2$>:'',)jQ!s,Ra!:9<[pu`u(\]IX!0[@O`Y;XW$![*X=+;8q6buMbB.T&1_TXGKD^pkM'C<\fj`;4/0[#QC4D0n9%4p5[k%RneN/+Ha:,ogX@iS2Jt4uniGF3YY5dCJ-1K"L%SIuBJ"!/.[V2R0QZJc%B["1YO$X82gB%d9=g[:6\$ljKsrU_qnh3i,J7RQ`(;`MLu;#GiPht+9mspDp8"<2dd7<7OjJR\NVTnK]n/)2ro-jbrCPhpXm1
 Z"mm[C6%p2pP==@7S8Ctp3?5Pc\N5;VXq:7aKMW&.TCM)>W<%[FVI91'V.S$'ndH^s%/tr-BReIRj$l<d5M4Lo"G`X*5`G&KD`M'VE_s4C=Ur#(T0S]7q(f:PRBH>Js8oB;6Y3l202W^:m[^g2ETqP2gkAR$!E2%8VGRu0j(i%Lj;j-Hdm%eX^6TA4$AO@M)!<P:K\qrO&c_%)CF*[9N%!,2:%=.YUFffZZ@.J+oKkkZN^J=*EjZ1?%NI`^ZP'.j1lmmBH=1#I1ZbNUG+#bW*MKj15pBfBnELr)=o%]??5X^7+$IQ%\]eFQV.,6'K5W7GsI4(MjRV,G6;uuj1rQnbL^?`e^C.<GMHiQ$Sf:S0X*M5I9Y0MeQ1^C]PhHGtuiG=M):u:KIN,&FM^B]6odf~>
 endstream
 endobj
-98 0 obj
+100 0 obj
 << /Type /Page
 /Parent 1 0 R
 /MediaBox [ 0 0 612 792 ]
 /Resources 3 0 R
-/Contents 97 0 R
+/Contents 99 0 R
 >>
 endobj
-99 0 obj
+101 0 obj
 << /Length 2471 /Filter [ /ASCII85Decode /FlateDecode ]
  >>
 stream
 Gat%%9lo&I&A@sBka9Z6#ert((+4*c:=HR[ch,TX!)nu40hF&!BTM`M];.i7QNUiC1<p.>!URk][h$j1rRIhCX7'-KC'T7'>ce)DXKjC0s-'hiHl[nQ9@A']`TlFIc`<NO-\QKV$M=2,gN3U7"KVFe<A;W(i*WuTc:fIK"j-&D?N'iBWh3\6@?ic<g:bk^(e3!4epOIm%R!YPbtf9mIoEuD6-225$sK*dHSfklGnW#s2k.cEk\G#6:=s:-[2Wuebl)a.s6Io/Gg2E!Irf;G]iL-X9Qaalr;4/qgRu#f>KCF>p8dU2/)(Ck=/o;1f3X?OjWHNGM_Z'-T%3`m:"kDojr<:4:d_2:Fu?oJVWB+qWHhuuBr,R+1G&fk&Z*>kgHA'+iR>j)@JNB$]1UqQFh5"]g+oS0@Ea>Nf?`_b4:1s%Di+(0FJ&:c:Clt']IZKeq#epoK,@FD5l;lG]S#Km#h5J2hVOq0gU<7kT1+TPZlBp13-k5c2ETM@nM4CR=YY4/%e0(CF>4pI',JV+SKf(()C(m$^9YTN[@J'YDW9TZ[o)jN\PZD3/4o'n[BTQ4X5bmDEDUn]7MYaN*_65SLpSk%CMT#=d^h].(>2*07T?+hL;[O><)=eDTbn>YU]E:!ZW@pFMnB%':7.q^3g%rU2JD>u%4!GCiB]FQ.j-DPoN"QM"g7kWQW8f,Yf3u1CR)cOX?)/s7d9g0A%ThnL\K/q&>@A(l]&eBY'JLd$3M;BJ=?.tI3V?m%+gmB5BL)HSEbW*k+,L0'Q^h#Qm^M!C$H"G@NSU*K@#P%/ER8^3GiMHT1MI\!-'D_d_.<.@Ar9*c&)rlf4htal#fQf_4$'dF>UI7.14g8_csHKIJjRi//:erKIfgf;6qN.b<1rAm$SPJbL>sj-e`-D4aLM$->aVd++!F-k2b;A#+@SKEVHLL1+pbQiYnR#JDdIM.r3@;hf(b?6hSsA5aH(Tnq<iL.*O+S#]sN`Esr*1m"5O
 &>#hM5*dIMEM4E.&4%LiFaWKP>qV[3^W5Xr?o[`[$Yu/iG7X%HbV-B+:/04mIUFk9PAmqTlDNsWj693Wr-$V!bps>`'T4M$5X[4bpFu3,9H4QWO^efQ<Wu0iHAOUtT^`'cYOhg^\hXO)73!gX%4XLc21;`g6kU9nR`3^dQ1lqh@MkbC$,4sT/;lT?8cNs&%@N\cJ#!e_LY9AQY0A&<)Pomsfd<nFO)N7aVa$j0mC2E2/)V=+P<l,t4h`KBE9]k@4QE"i]FeUO]iOCbckS!G@#_7<pQEpNs)<'=u,B,$+>Kr\5b\)Sdj;]H7->lu`XJI5/#cW7<Ws2Xl,(r8Ikbpli!<GoVNWIOZUBF66_O,)CBW2^Q+u"`>\>dIA:==r^@.]q8cD$\B%>;o@,t9(+m0_FD8]*<c&0%qu0LmZZ5/^q^:6;(1jgpNCF`6S'#UIW1!liU4n<"EieH5?`dmFKc^g3_=F0r7N62DRErS]GSb>l2XicH!^\)HQ=f,Fe?%P'i[0^ZPoDcuL.gL<gf(=P7gDK"A+q<JJrU2(gL*>k?G_7.RSSdj&YoSR0]C>Mo0&HRVk:W6]e(6$DlHT#oV'q-+IHIhN'k)0;FD\>>WNQ`JQ!GM:H5d?+2UHE*rOAAqYrVb7skWXTiT80>9O$HfJP5*C*.lj<^N0SpC9MsT#L^W3-dgWp_en&-FNJ($J[F,jr@(`lAK\AsIGuZjr01nKHO$OmMcd,lR-mb63Hq2nYkCf]]i6`?AeA*i01eU9YTO6:+.qd'_^DLt#*N(GP]A6gVJHDGM1_!mEE,bPoH?p7s^Wi\.%eNA$3>$O9Q<i;U[g)F@48]41(63i-",Z'];L4:<]X`6Jn6:t8$^dm4ErXt9Li04#/u$*86D)SUeCO]]RhNq$JGn#n&!%O(R=g&1:ZK,&OR@.MDm_8L6cD>0.2[J%0oI`r$^(/EkU_>uY1&6_JA5==pa!ht">7cV.R#U(H3CU'lT#36=3&
 &5M&gjXoX:%0XNl6E%uY,\ZQZD,HG5Q3qn9*mj!V?>^AQ%MX]DiBNEMB*pk.SPRkbOtV*)mc7m+*M7!,@H]3350]ni8Zi-;Kr0n9Ju#9=&McE=]AL3)A_POt^5Ff\4&F9Ec3-5ITR*d!;5o=>%&^)EO%`_qVLWd9O!nCQHA?@F=B\1Nk$498$JM(4;H%UV7;5GY6hQ<m%YL(<L)e?*J:2.uZ\5",IT/oJQ'4#iah`U3+cAk&hQ,n%h]KD#_K27`A)F10B##augl.+OJN+(9LJiUhB5b5(l#aij:.]:h7_9V/qQjoAkd*%tjJ?_"'4g1@cj_"tM>C%[jlTYI6a8_\baBeO;3UTb2u:9G72j<l&L38F_/pBj8%U9K-\s!=!H;4aTIpY7Gs62md_,(Y!0E:Q<&#;(/s+WG^S8,Su-%B!&;"Sjkm_`J:`\%Q+<`cpXhq=s#OFj9H31kqkJDnM*_@;ge<E+[Zse)`>QmQZV!HKt~>
 endstream
 endobj
-100 0 obj
+102 0 obj
 << /Type /Page
 /Parent 1 0 R
 /MediaBox [ 0 0 612 792 ]
 /Resources 3 0 R
-/Contents 99 0 R
+/Contents 101 0 R
 >>
 endobj
-101 0 obj
+103 0 obj
 << /Length 2738 /Filter [ /ASCII85Decode /FlateDecode ]
  >>
 stream
 Gat=.hfIO3%Xu`2TuV=gX6@%RI7r>>DYIc:Egt;GB!1kn9=2[;/8@a*WUI#TaHA)>-5G^t8]Hud&GQ6Q!3(?n](tIPk-#`]fu).>2]L*9S0U\aG80eD5D3A(Ao[#_mVHh@EV&_N"hp>6&Xn/q+$4oOh`U:D][J>@rqk!F1(N*XMk$\toC$mQYQM(?_;@<rJs39[L#@7uD>?pVoPIg,_+msC,g`j0P+!1O]m1VLCYea1J"3Fo(J9Is)biph@:<t&TCK."P[o&"5:IJTLY$3[+e+c6keXF`$CS^EhfTZ[+DWP9Y#m2"Os>1l;Ps0#,mmWr5:t5!&(VZdoJ8Fnlr5"^"+C19oDPFG%fm3c?e_jJfMLBRc46T*c];CsBX-l-8NiruNaIma%(fg7]"Lia>,M'\[bM.D(VAN,#7[.h.%[ou&a^q!;K`oRqInK_pEPQRDR\X5n?BlJc.a&6^8(?1!L2,gAL5:=Snf5uU0^O-1d0^jDDmo3Z+DtP/8n*F.G=+3#2=WfenoOTiIY"r11B[][;8nEDSQFg!*GBU?^LnjQ-lBaS!g/c&;+HHOo1t,ejnQeK17KPmN-4fGQ3K5.iIK#:1Lj#cHj=SOpX0D!GOt>VVqkAn\FF[@pP#t-h5Da%tB*,nh2!TIru=>#GTfW=".I\+4qp'9OIk@8sWpn@O=H7Rq\p2/]u/;W?a"d7)cY0WT/b$4eW(7YoESV@,T$6&KlSo1CMG<+%4!s;4kWf8\Q`lEKIbOPb(Mee2^`IUT4*Olc9!tb1Dg']KHgFXS6O"_LQ)^n6V22NF3Hb!p:tsLUZ+HV&-et@LFa*=im16FDj!3)ai'Fgs#s8s3Xe>e2XH\QjMmNZ]H2*=p+eVGEL2n];C_Eeh12/AI3`^)@TKM"6u'u\4QKJ($ERP,0EeB2$XCaEuiammg`XB86J=V6FVKrDF)itZ_"s.MFN?&ngm./ESsP^G-_78^k(#(BL!c$giu0F1MklkJ2eI
 44BRi9qF,0[U&.1\C*CC"7@IZRTeVud%Yh<S=S?<j]P;ZM]A[9Zh<<oKg/?Ted$!>?<LkbQbs\#lMh&TW^$(Oa+&"ZI'XUOm@M!*,9kn?B0gYKo>WgJ5BK$,oKg%3WWCEmVqt]Vb1_9TZn_8C)m`RMNPBLK$AZ<s,3B`JJKrC):!)jks5_RNYKX?))XOb`->,-+<,6A]YUr9!?cb.E0I3RABD%lf17;f#<,6WQ^1ZB.Sn;:R$%Bns1MYH"Y[@dlQm[i`$mE3[-_!1YgLPBXEs'4HI65a$]>^A&<8=H<5pFQHtJ?r^6!SSh,i?k/<d@*WP,!4SKZSba(gb<S*Q@'9U<:cAYFP2etH7cH32J9j"L<\)7E_H&/etRnRP)-gbGQ^2($WG$0?01(]q4kXSZ83]"$$Iu(dCD7gP&.#;8Ub+>%oMpR$s&?6LQ0Bgm-qnHF+Z"`<:N,!pr[Z\[Fg@/Zq'H(+q3G>+.c7DS)3u"2.qio:Y`laLRi,uCQ3.Rd`Duaq3D5sp-A%!$IRa-d-DEi`0W6/J?WZ]#_hQt+(RgFBH1Zh#(rI2Is"5n]YFull@\-oco;3Vq+9[mDAK.qMt8nN2_J*WB*"M=]$UZ9n*J`9hf=?ub@l=I9+fQL6l<L,SCg8(Wm48"[W`6h7V2*!WZNR_9JgmI%jRD;4r!h>qU:@Tl/O-jrE6i&fUf<18B,9HZ>3+%n,_eF%_X/JbKm1h)P8OPRAecH_TI9](<cc-#F"\Z-q%u)/d;#lr:KW3&k'hX9lF-LRm&g"k\Ue6F-((/Q.*.;\O!Kmi8M2o/hV@^T'kGD5boh_ap<[)UbQE9?3(e.onObO3AFH<``kTaH!gC@oA)XQ:9D`Op$/qZ&>cNO`+LFiOfbkfA'+U[hEmu'\8hIXIe<]/HOY`760tI?AE$GLK#!5]gP`DC`V9-[9C5k6rd30q7Xl(`Nf$9@O9T+&E0bJ:-9'oE3n20Q'FDQ&Srh%T!I2>ONJF
 H:Y')?D*E6&3`f6!Q/jKpCo1VK)077L)%2;d?mu)=qkH/u%9euV1Ubp72pVkal*in`f9GmVqN>kXXl=8YU+(gR3@N<cbbo=,s#&8,X2H8hSP:a=MeNLq5X@r#][nN-E*ckV9H]L&&@/$$t[.2<u<[l<$j([)j&kL1070s(P"]iA3"B+GB:;l.CQ3Z-u2Y?jHVu#-U(`Ofdrg=IE2tPrL&BFG-6lutj^mQ(Y>7_6<QjZ$`GgSOT]j0O6%ntjuVe;KJHCR=.G+&^"gHiDrH3eZn/b93aL?U%%DXTlM2rtij)R:(B,qMc"2p')5+s5*ml\L7Dr)UlI93*co.gU.i<fl?ae0^D(BW4*$d\eP>N2:22ot"82lX>aK0Emnj6S)M+J'_epDUO9P[QfV/@Q,295G*H2g/D1PfpS%ZO&M<)cAu^"T[&g4K0jZ2!IY2<jPTC$"@4Bi%IUka,-OK8X\b#iq$'p>le#"KK`5Qar)V=V,qGd-!8bX59%ctcK+Eb+-fCjV7Ip.9E;I?!5i@FrT5Hp,VpMC<_1ql="6Aqu9`j8=C!6>"BDVJsr;;"k?#b>_G^>5C1O4/Ankuh+-_6uq7oGt'iEGRs9+A-6WdF^1Pd(\i.,[6#0'nP5:9_!ajX_FsHl*ARkO&0I!B#Q[3%das)"VG]6`Uk^=Tji^'3-kZ-2(n3a8NIip?,<2H0IG[&3^Qk)OBFRUYN71@oXM?grliQf_KC9\88\F*X8OU2&^NajNkJXBCPm*5Z_sZ~>
 endstream
 endobj
-102 0 obj
+104 0 obj
 << /Type /Page
 /Parent 1 0 R
 /MediaBox [ 0 0 612 792 ]
 /Resources 3 0 R
-/Contents 101 0 R
-/Annots 103 0 R
+/Contents 103 0 R
+/Annots 105 0 R
 >>
 endobj
-103 0 obj
+105 0 obj
 [
-104 0 R
+106 0 R
 ]
 endobj
-104 0 obj
+106 0 obj
 << /Type /Annot
 /Subtype /Link
 /Rect [ 90.0 311.613 133.656 299.613 ]
@@ -632,44 +649,44 @@
 /H /I
 >>
 endobj
-105 0 obj
+107 0 obj
 << /Length 2576 /Filter [ /ASCII85Decode /FlateDecode ]
  >>
 stream
 Gatm>968iG&AJ$Cka9Z60EJn7F5jc*BA,pm[lq)]5SPJ`_M:`]EW#:;I.'s`82a2^*YH6jMf1iHMgkDJoA0#_5<!t2J=l:K6Antcch$)(j49i@D;/[:j_Y@4g"uXIo57SOn/-AQ9QspV$bqC7lKLEAiaTL<!Xo!Yd"MIT+.0anc47^;[c>q3ee85U(=u?k\[-%"X%YT\Vp4$Bhs_P;kP^CjSCiGnHkSEm\2L\4juM8qq<!+!A>R#ng^68rl#5YXE>KE@Wq,.l*6MflG2I-8hE:fD>D0m0rUL!o3*H9!TBEFT-UTFmF*FGe/g[[S?nJ=[^"-lbFY!*gfK>\>^5]J2UYOu,$,H3bX20-iNXrV`VZsU/q$N.K>e%3-Tc#2He^dWd_rYZ2Ym$V0o$Zd)0(&!c,#],,2mE2qc/3%(16T"*,!JMB<iN/Ma,tbQAc"Yde8h:m.KD[7b4E7;[9eYh?`GW@?X^!<NdVrG*T`V,f=c()$0./-jr#8_*j`s<945J\"T?<X852L&eH=E;`?-.nSrP9lC-sp7i_<[<T.=%a<)q\d+5,hrp`NA1,R,RT4MsM+>4);<;cm:b+3UU=:K<o*`h>e4LU0)kZrW2$"5XeK6>O?SeIh8."A<^_"(01?h8!Z0J,Gk=,T?aT2dj[!^g,K(^=V<Q]GGD>#Oo@_V/^*d6Qk`KbRaY9!ct#9JD"crPA>NhZ$<nHF+(Jl9CH=RkF?f=Q'`tsgP1&=$\NuP7<t?E%%41rQ(AuYdS,UGkI:YA&c9^er;6XF3'KdQ\Xne2KbKfoT!D0r@g\]^M<[P[2J_Naca2\TI+l:edCDJP+b=E"o,gpd<IDS;:[sWB:Po'Q[<M#!"dFcMG'@A^PDkFj>>2]W/bPaI=QipR&0Tqh]T.lnLI3HIb]3RBWSIo47\P;1HqYND3t?I?n6-T,jIP2ADt':7X`a!rJCDUkLeTC]BVX$+XPFc\HE8(oI,>(,pH@[J3>PnE&[/@
 :U?.Z\)%Y?gC:QU1:cDaZcpaYdG]6'S6g*L?dO%_[1E-SYD#F2VpZeZ(Vp*903`+uKr3[qqS6KJ.G6V,S!njG/"COTO,hogeUe)jtRPp9$6Rlm@2mJZ^[Z%Uq%\mU;A$L!<2d@u^.b)^M<?X>`Mcfr6ra'/t:)PP;"QGla5^7g<.0Hft.g014mlXgg(9ih7CJ<a56>Ro$`crYX$['T"D0_q^oo`5HRd+(f>2^#hQ5$[KkI9_ue(9^^"H[bM5X),-rJA_'M;2#^?L,@.!T^b4Z!A_XQaBgr]E\%S`dB(m*J[_KadiH]6<alF6JCj`;)EEq_u2<Vd%G9X\897@!]M)K/fUY=mu%%><2eIE:cnQfN3p$0Qh-p7$D"m8F.`M<;M!LBe3uWo2JY]\`Tmi1hS`A0`*$57>Z"":[Z:s^6D;O)'uDV=MlWu>1Hld2JCTubNb]h:n5:9AONURTaZ-oRc\E`BiNi$Y>puZJ1\ZdMD1WOLIfBup+lKk$eV5SB5QP\t4nQ9ASMHD$j$OWLrl[;nNV'dIK;!uUB812;Ted5HZ*$"?,MV32l@o\GLM=#/Yjf*_0BkMW3qh*JfC#dA7i4J<oDYba7&G!.e'JI&,mj=#*e[TRJ8B60$l;dVc*;XNBS#i$N%lh(<2(kZE,:<eZ<dLD5t0bMl5&ZKJ<!8TWMl:B]IT9I33#YfJN_BqF0sI*WCi%t'4FJ=")g2C`84tSkkEACr'd'S>n"ZlSVR=[gWu\?;WK:?$qs0*iBVYP;>C2%8]fdm.YkhhapRUjga^#6pnjMM7>Oo5&tUHt[-R5JHW8n7WfZ?49&n';?,id?_oiqO6o+!D@C'ec5/+RO-u@2qI`$Z\EV'PV9-VTCSG3-fRUBG>j5)6Mf3NtS*5QG':b?:q&clME;^mCI]a:BTb1Ssp"$U=fEXlX>r`"c`&hi9Y)icc+i;r!;+u7Eh)1icRnL@9K7UTSc@"_)R0fL^kouiG)OMlLR'Ij
 J'&BCL@/g*<%`2V6jKA&Q-%;mt3lK:dWHtrK.a_1[_*#A6P08[iKX4SiLV=Kt_)Z<8R_$c`mYYF]P'95:gR7FYL7GdXY$NmsRG&pk>fm(TY\?diQg7cF`SC@B>GG/GHg_,Y<F0_R1)$12U\!Uc:23/'B&i['qoqKsc'C/*eH_f-k"1?h?P`5^.A-Z0m,M2W[E%A_&TCQegZE?0F$7/>40WOLs5"u[1Ggbj.#$)5u`o*f`9rB5PV9aQ*^b)N5C9Iq(*e'[Ms+HkQJ_C\g'4*rM5O[GPWH4q7\j64F?@NFP&F'M(8&9Y:,[JGlpUhJlH:a1_Y/G-<b0,_4ei]MUhb_[eTlrRG>X=E5JQcjkk$6ua5323<K]n][Xml9M_%K#t^7ZR'*pU49nb1bol=%?Om"^.i=3)N5DopX[&KTm=/9rl3jR-cD];RJKd.],/@gM^]8EdZkc>V+%>hp7F*AV_=i-/i3fY&gWp>Ru^B_ZWj('rf;nTuEM+@FK2"G!`7rO\*=CCqYKW:0PKE;B8S/B]--T(1];gk-ujcVOANHKj;a[3L`oNU3+FJ0D2+9@,jZH_\?u!:Nt_!d8BJmU'Y]La<~>
 endstream
 endobj
-106 0 obj
+108 0 obj
 << /Type /Page
 /Parent 1 0 R
 /MediaBox [ 0 0 612 792 ]
 /Resources 3 0 R
-/Contents 105 0 R
+/Contents 107 0 R
 >>
 endobj
-107 0 obj
+109 0 obj
 << /Length 1512 /Filter [ /ASCII85Decode /FlateDecode ]
  >>
 stream
 GasaphfGPN&:X@\_;f\#:.?AAj=St?pZ%s\-D'HhgZ^+/N-^"Z+l^[phrXUTL;]:4a-,-+\)2YH.mEA[^[*oZD5_N+s%f-:-*@o9+agSgrVh@;N4=H-B]2'jIc#O#di`BikGPf`JO;TQg1MA61NMH83k\r5P0ddc^3'@%QV&hBU\)`*c3LQEoo<,<][4N/.A"Mk@rertA0K%,gpb&smHhRhJp9U9T'cao$#+&TfG`$#I'O)3XF/VI]5t"VfSQU:QW63;W2b)F_-M")C4hM,kY[VY'(,bMVNgn0NS$qMOlmBJLf.(U,LWV1UG4!5'\`QDAB\PJcuZ5k`[!nEDhI:&jEH.YJ[keJ1lCMFm7E`d-NSLmO!9_!=JX;fM)U%2"?2;U2m_W/]DG*Ok]eYSW6ZGr;BY'B<?W%A+et-S`i,%>RIC99Ued)CE9&1kWl3?$$r0JIB%N'.7`6<W9cC-&AMAjt2ha8MA0l.RVQ7M9C<^rOn`%n"pNC\bLp1qN])oK3QqF3W?G`ag(!^0-eS&40"g47H(&"lUE8*2r2)VM'hQJ6nSDKG\ML"lJi'N@DjIt!!WN_!$W];3DF6#u%?]\Dn@?&FP#bCL]m@aX$O[FPdi\$lHnjuNg4s13#6@@RF6jm<G8.Pde,6<'?7+FG=jZ+<&3DY5\+>JeOM8E:@M@D-+8.a,hfH7X`ccnRC(*I/jUnu)SD':RU?]29_7/DAocsM&I.[B!'">u>Zj?`]76sX0XX=]Ro8^T$];K.1/'7ZeYCM'F)O,HX.5gDS%Y0E0Gk<T,LFXFI!#ZDkH9^2,,=POZC7ddeF/L,%U`nrB>jbUU3cnSu]9(d#ng>&\IBQ<]B<N3&0W3cnsHq-*G`T%jAR24@mJO6YS"L)SP[H>/Qi?pHbN"SN#O&>mW=U,r)\m[,8l?)TYUHE![+DDctg1'"ofZ'H"C.0GK4G(#C]O0H!<nfe/4VHK-e\YFJA$tQFbcj&Rd:dk'm0bN
 Yh"91(g1Q4GUuDA\:%,LCloHV#_B6e9h>'E.`VoEp5eRJS<Ne;R(:nH6ouC[d4Mn78QE6XC2!WDoY;BV^1Qhq2H%QXrI5hb0S.10D&;CU@Ku=(#V8HOSOr-qUK`g7ba>l8A4eBJn+.W.=3I*oHEat+ggMP57V2g32iOL('+1>!q@[jBnh@@#[/O.DF!:\tOK6]V?Kd^`(l\VIs<3-;8$V@u5LgE@%5#C/*"!)Qf$?Yij5eS6&1NZhLJ:H93$EXYuS$JF2j>f<Cp"=\Wn%r\HF!@"-e;O2kL;"Qpm1nK1k2)Y@D;E;P?E]q=dpEHZrVL$]9cK-HT]u$eg:Pm,/e(L\7b\Fa'fVa/C3caoQ4LZhW>e,8%l/kIGgNHM)c]SP=N<B'L_F6>i3d)3%:O_G#Q&bg&6[NMb5`1:74^]od/`SR@GpJh:c>\CTA_Y$O*rh<[0l`Q$g>7o>W8*Q,K&?s[`d[CIT2^q%<p-Ik?^#Gg@[@UbkbYr0=nK*Zkg'rce\47anm/V.`.A~>
 endstream
 endobj
-108 0 obj
+110 0 obj
 << /Type /Page
 /Parent 1 0 R
 /MediaBox [ 0 0 612 792 ]
 /Resources 3 0 R
-/Contents 107 0 R
-/Annots 109 0 R
+/Contents 109 0 R
+/Annots 111 0 R
 >>
 endobj
-109 0 obj
+111 0 obj
 [
-110 0 R
-111 0 R
+112 0 R
+113 0 R
 ]
 endobj
-110 0 obj
+112 0 obj
 << /Type /Annot
 /Subtype /Link
 /Rect [ 173.664 455.613 400.956 443.613 ]
@@ -680,7 +697,7 @@
 /H /I
 >>
 endobj
-111 0 obj
+113 0 obj
 << /Type /Annot
 /Subtype /Link
 /Rect [ 186.984 434.413 433.956 422.413 ]
@@ -691,325 +708,325 @@
 /H /I
 >>
 endobj
-113 0 obj
+115 0 obj
 <<
  /Title (\376\377\0\61\0\40\0\111\0\156\0\164\0\162\0\157\0\144\0\165\0\143\0\164\0\151\0\157\0\156)
- /Parent 112 0 R
- /Next 114 0 R
+ /Parent 114 0 R
+ /Next 116 0 R
  /A 9 0 R
 >> endobj
-114 0 obj
+116 0 obj
 <<
  /Title (\376\377\0\62\0\40\0\101\0\163\0\163\0\165\0\155\0\160\0\164\0\151\0\157\0\156\0\163\0\40\0\141\0\156\0\144\0\40\0\107\0\157\0\141\0\154\0\163)
- /Parent 112 0 R
- /First 115 0 R
- /Last 120 0 R
- /Prev 113 0 R
- /Next 121 0 R
+ /Parent 114 0 R
+ /First 117 0 R
+ /Last 122 0 R
+ /Prev 115 0 R
+ /Next 123 0 R
  /Count -6
  /A 11 0 R
 >> endobj
-115 0 obj
+117 0 obj
 <<
  /Title (\376\377\0\62\0\56\0\61\0\40\0\110\0\141\0\162\0\144\0\167\0\141\0\162\0\145\0\40\0\106\0\141\0\151\0\154\0\165\0\162\0\145)
- /Parent 114 0 R
- /Next 116 0 R
+ /Parent 116 0 R
+ /Next 118 0 R
  /A 13 0 R
 >> endobj
-116 0 obj
+118 0 obj
 <<
  /Title (\376\377\0\62\0\56\0\62\0\40\0\123\0\164\0\162\0\145\0\141\0\155\0\151\0\156\0\147\0\40\0\104\0\141\0\164\0\141\0\40\0\101\0\143\0\143\0\145\0\163\0\163)
- /Parent 114 0 R
- /Prev 115 0 R
- /Next 117 0 R
+ /Parent 116 0 R
+ /Prev 117 0 R
+ /Next 119 0 R
  /A 15 0 R
 >> endobj
-117 0 obj
+119 0 obj
 <<
  /Title (\376\377\0\62\0\56\0\63\0\40\0\114\0\141\0\162\0\147\0\145\0\40\0\104\0\141\0\164\0\141\0\40\0\123\0\145\0\164\0\163)
- /Parent 114 0 R
- /Prev 116 0 R
- /Next 118 0 R
+ /Parent 116 0 R
+ /Prev 118 0 R
+ /Next 120 0 R
  /A 17 0 R
 >> endobj
-118 0 obj
+120 0 obj
 <<
  /Title (\376\377\0\62\0\56\0\64\0\40\0\123\0\151\0\155\0\160\0\154\0\145\0\40\0\103\0\157\0\150\0\145\0\162\0\145\0\156\0\143\0\171\0\40\0\115\0\157\0\144\0\145\0\154)
- /Parent 114 0 R
- /Prev 117 0 R
- /Next 119 0 R
+ /Parent 116 0 R
+ /Prev 119 0 R
+ /Next 121 0 R
  /A 19 0 R
 >> endobj
-119 0 obj
+121 0 obj
 <<
  /Title (\376\377\0\62\0\56\0\65\0\40\40\34\0\115\0\157\0\166\0\151\0\156\0\147\0\40\0\103\0\157\0\155\0\160\0\165\0\164\0\141\0\164\0\151\0\157\0\156\0\40\0\151\0\163\0\40\0\103\0\150\0\145\0\141\0\160\0\145\0\162\0\40\0\164\0\150\0\141\0\156\0\40\0\115\0\157\0\166\0\151\0\156\0\147\0\40\0\104\0\141\0\164\0\141\40\35)
- /Parent 114 0 R
- /Prev 118 0 R
- /Next 120 0 R
+ /Parent 116 0 R
+ /Prev 120 0 R
+ /Next 122 0 R
  /A 21 0 R
 >> endobj
-120 0 obj
+122 0 obj
 <<
  /Title (\376\377\0\62\0\56\0\66\0\40\0\120\0\157\0\162\0\164\0\141\0\142\0\151\0\154\0\151\0\164\0\171\0\40\0\101\0\143\0\162\0\157\0\163\0\163\0\40\0\110\0\145\0\164\0\145\0\162\0\157\0\147\0\145\0\156\0\145\0\157\0\165\0\163\0\40\0\110\0\141\0\162\0\144\0\167\0\141\0\162\0\145\0\40\0\141\0\156\0\144\0\40\0\123\0\157\0\146\0\164\0\167\0\141\0\162\0\145\0\40\0\120\0\154\0\141\0\164\0\146\0\157\0\162\0\155\0\163)
- /Parent 114 0 R
- /Prev 119 0 R
+ /Parent 116 0 R
+ /Prev 121 0 R
  /A 23 0 R
 >> endobj
-121 0 obj
+123 0 obj
 <<
  /Title (\376\377\0\63\0\40\0\116\0\141\0\155\0\145\0\156\0\157\0\144\0\145\0\40\0\141\0\156\0\144\0\40\0\104\0\141\0\164\0\141\0\156\0\157\0\144\0\145\0\163)
- /Parent 112 0 R
- /Prev 114 0 R
- /Next 122 0 R
+ /Parent 114 0 R
+ /Prev 116 0 R
+ /Next 124 0 R
  /A 25 0 R
 >> endobj
-122 0 obj
+124 0 obj
 <<
  /Title (\376\377\0\64\0\40\0\124\0\150\0\145\0\40\0\106\0\151\0\154\0\145\0\40\0\123\0\171\0\163\0\164\0\145\0\155\0\40\0\116\0\141\0\155\0\145\0\163\0\160\0\141\0\143\0\145)
- /Parent 112 0 R
- /Prev 121 0 R
- /Next 123 0 R
+ /Parent 114 0 R
+ /Prev 123 0 R
+ /Next 125 0 R
  /A 27 0 R
 >> endobj
-123 0 obj
+125 0 obj
 <<
  /Title (\376\377\0\65\0\40\0\104\0\141\0\164\0\141\0\40\0\122\0\145\0\160\0\154\0\151\0\143\0\141\0\164\0\151\0\157\0\156)
- /Parent 112 0 R
- /First 124 0 R
- /Last 126 0 R
- /Prev 122 0 R
- /Next 127 0 R
+ /Parent 114 0 R
+ /First 126 0 R
+ /Last 128 0 R
+ /Prev 124 0 R
+ /Next 129 0 R
  /Count -3
  /A 29 0 R
 >> endobj
-124 0 obj
+126 0 obj
 <<
  /Title (\376\377\0\65\0\56\0\61\0\40\0\122\0\145\0\160\0\154\0\151\0\143\0\141\0\40\0\120\0\154\0\141\0\143\0\145\0\155\0\145\0\156\0\164\0\72\0\40\0\124\0\150\0\145\0\40\0\106\0\151\0\162\0\163\0\164\0\40\0\102\0\141\0\142\0\171\0\40\0\123\0\164\0\145\0\160\0\163)
- /Parent 123 0 R
- /Next 125 0 R
+ /Parent 125 0 R
+ /Next 127 0 R
  /A 31 0 R
 >> endobj
-125 0 obj
+127 0 obj
 <<
  /Title (\376\377\0\65\0\56\0\62\0\40\0\122\0\145\0\160\0\154\0\151\0\143\0\141\0\40\0\123\0\145\0\154\0\145\0\143\0\164\0\151\0\157\0\156)
- /Parent 123 0 R
- /Prev 124 0 R
- /Next 126 0 R
+ /Parent 125 0 R
+ /Prev 126 0 R
+ /Next 128 0 R
  /A 33 0 R
 >> endobj
-126 0 obj
+128 0 obj
 <<
  /Title (\376\377\0\65\0\56\0\63\0\40\0\123\0\141\0\146\0\145\0\115\0\157\0\144\0\145)
- /Parent 123 0 R
- /Prev 125 0 R
+ /Parent 125 0 R
+ /Prev 127 0 R
  /A 35 0 R
 >> endobj
-127 0 obj
+129 0 obj
 <<
  /Title (\376\377\0\66\0\40\0\124\0\150\0\145\0\40\0\120\0\145\0\162\0\163\0\151\0\163\0\164\0\145\0\156\0\143\0\145\0\40\0\157\0\146\0\40\0\106\0\151\0\154\0\145\0\40\0\123\0\171\0\163\0\164\0\145\0\155\0\40\0\115\0\145\0\164\0\141\0\144\0\141\0\164\0\141)
- /Parent 112 0 R
- /Prev 123 0 R
- /Next 128 0 R
+ /Parent 114 0 R
+ /Prev 125 0 R
+ /Next 130 0 R
  /A 37 0 R
 >> endobj
-128 0 obj
+130 0 obj
 <<
  /Title (\376\377\0\67\0\40\0\124\0\150\0\145\0\40\0\103\0\157\0\155\0\155\0\165\0\156\0\151\0\143\0\141\0\164\0\151\0\157\0\156\0\40\0\120\0\162\0\157\0\164\0\157\0\143\0\157\0\154\0\163)
- /Parent 112 0 R
- /Prev 127 0 R
- /Next 129 0 R
+ /Parent 114 0 R
+ /Prev 129 0 R
+ /Next 131 0 R
  /A 39 0 R
 >> endobj
-129 0 obj
+131 0 obj
 <<
  /Title (\376\377\0\70\0\40\0\122\0\157\0\142\0\165\0\163\0\164\0\156\0\145\0\163\0\163)
- /Parent 112 0 R
- /First 130 0 R
- /Last 134 0 R
- /Prev 128 0 R
- /Next 135 0 R
+ /Parent 114 0 R
+ /First 132 0 R
+ /Last 136 0 R
+ /Prev 130 0 R
+ /Next 137 0 R
  /Count -5
  /A 41 0 R
 >> endobj
-130 0 obj
+132 0 obj
 <<
  /Title (\376\377\0\70\0\56\0\61\0\40\0\104\0\141\0\164\0\141\0\40\0\104\0\151\0\163\0\153\0\40\0\106\0\141\0\151\0\154\0\165\0\162\0\145\0\54\0\40\0\110\0\145\0\141\0\162\0\164\0\142\0\145\0\141\0\164\0\163\0\40\0\141\0\156\0\144\0\40\0\122\0\145\0\55\0\122\0\145\0\160\0\154\0\151\0\143\0\141\0\164\0\151\0\157\0\156)
- /Parent 129 0 R
- /Next 131 0 R
+ /Parent 131 0 R
+ /Next 133 0 R
  /A 43 0 R
 >> endobj
-131 0 obj
+133 0 obj
 <<
  /Title (\376\377\0\70\0\56\0\62\0\40\0\103\0\154\0\165\0\163\0\164\0\145\0\162\0\40\0\122\0\145\0\142\0\141\0\154\0\141\0\156\0\143\0\151\0\156\0\147)
- /Parent 129 0 R
- /Prev 130 0 R
- /Next 132 0 R
+ /Parent 131 0 R
+ /Prev 132 0 R
+ /Next 134 0 R
  /A 45 0 R
 >> endobj
-132 0 obj
+134 0 obj
 <<
  /Title (\376\377\0\70\0\56\0\63\0\40\0\104\0\141\0\164\0\141\0\40\0\111\0\156\0\164\0\145\0\147\0\162\0\151\0\164\0\171)
- /Parent 129 0 R
- /Prev 131 0 R
- /Next 133 0 R
+ /Parent 131 0 R
+ /Prev 133 0 R
+ /Next 135 0 R
  /A 47 0 R
 >> endobj
-133 0 obj
+135 0 obj
 <<
  /Title (\376\377\0\70\0\56\0\64\0\40\0\115\0\145\0\164\0\141\0\144\0\141\0\164\0\141\0\40\0\104\0\151\0\163\0\153\0\40\0\106\0\141\0\151\0\154\0\165\0\162\0\145)
- /Parent 129 0 R
- /Prev 132 0 R
- /Next 134 0 R
+ /Parent 131 0 R
+ /Prev 134 0 R
+ /Next 136 0 R
  /A 52 0 R
 >> endobj
-134 0 obj
+136 0 obj
 <<
  /Title (\376\377\0\70\0\56\0\65\0\40\0\123\0\156\0\141\0\160\0\163\0\150\0\157\0\164\0\163)
- /Parent 129 0 R
- /Prev 133 0 R
+ /Parent 131 0 R
+ /Prev 135 0 R
  /A 54 0 R
 >> endobj
-135 0 obj
+137 0 obj
 <<
  /Title (\376\377\0\71\0\40\0\104\0\141\0\164\0\141\0\40\0\117\0\162\0\147\0\141\0\156\0\151\0\172\0\141\0\164\0\151\0\157\0\156)
- /Parent 112 0 R
- /First 136 0 R
- /Last 138 0 R
- /Prev 129 0 R
- /Next 139 0 R
+ /Parent 114 0 R
+ /First 138 0 R
+ /Last 140 0 R
+ /Prev 131 0 R
+ /Next 141 0 R
  /Count -3
  /A 56 0 R
 >> endobj
-136 0 obj
+138 0 obj
 <<
  /Title (\376\377\0\71\0\56\0\61\0\40\0\104\0\141\0\164\0\141\0\40\0\102\0\154\0\157\0\143\0\153\0\163)
- /Parent 135 0 R
- /Next 137 0 R
+ /Parent 137 0 R
+ /Next 139 0 R
  /A 58 0 R
 >> endobj
-137 0 obj
+139 0 obj
 <<
  /Title (\376\377\0\71\0\56\0\62\0\40\0\123\0\164\0\141\0\147\0\151\0\156\0\147)
- /Parent 135 0 R
- /Prev 136 0 R
- /Next 138 0 R
+ /Parent 137 0 R
+ /Prev 138 0 R
+ /Next 140 0 R
  /A 60 0 R
 >> endobj
-138 0 obj
+140 0 obj
 <<
  /Title (\376\377\0\71\0\56\0\63\0\40\0\122\0\145\0\160\0\154\0\151\0\143\0\141\0\164\0\151\0\157\0\156\0\40\0\120\0\151\0\160\0\145\0\154\0\151\0\156\0\151\0\156\0\147)
- /Parent 135 0 R
- /Prev 137 0 R
+ /Parent 137 0 R
+ /Prev 139 0 R
  /A 62 0 R
 >> endobj
-139 0 obj
+141 0 obj
 <<
  /Title (\376\377\0\61\0\60\0\40\0\101\0\143\0\143\0\145\0\163\0\163\0\151\0\142\0\151\0\154\0\151\0\164\0\171)
- /Parent 112 0 R
- /First 140 0 R
- /Last 142 0 R
- /Prev 135 0 R
- /Next 143 0 R
+ /Parent 114 0 R
+ /First 142 0 R
+ /Last 144 0 R
+ /Prev 137 0 R
+ /Next 145 0 R
  /Count -3
  /A 64 0 R
 >> endobj
-140 0 obj
+142 0 obj
 <<
  /Title (\376\377\0\61\0\60\0\56\0\61\0\40\0\104\0\106\0\123\0\123\0\150\0\145\0\154\0\154)
- /Parent 139 0 R
- /Next 141 0 R
+ /Parent 141 0 R
+ /Next 143 0 R
  /A 66 0 R
 >> endobj
-141 0 obj
+143 0 obj
 <<
  /Title (\376\377\0\61\0\60\0\56\0\62\0\40\0\104\0\106\0\123\0\101\0\144\0\155\0\151\0\156)
- /Parent 139 0 R
- /Prev 140 0 R
- /Next 142 0 R
+ /Parent 141 0 R
+ /Prev 142 0 R
+ /Next 144 0 R
  /A 68 0 R
 >> endobj
-142 0 obj
+144 0 obj
 <<
  /Title (\376\377\0\61\0\60\0\56\0\63\0\40\0\102\0\162\0\157\0\167\0\163\0\145\0\162\0\40\0\111\0\156\0\164\0\145\0\162\0\146\0\141\0\143\0\145)
- /Parent 139 0 R
- /Prev 141 0 R
+ /Parent 141 0 R
+ /Prev 143 0 R
  /A 70 0 R
 >> endobj
-143 0 obj
+145 0 obj
 <<
  /Title (\376\377\0\61\0\61\0\40\0\123\0\160\0\141\0\143\0\145\0\40\0\122\0\145\0\143\0\154\0\141\0\155\0\141\0\164\0\151\0\157\0\156)
- /Parent 112 0 R
- /First 144 0 R
- /Last 145 0 R
- /Prev 139 0 R
- /Next 146 0 R
+ /Parent 114 0 R
+ /First 146 0 R
+ /Last 147 0 R
+ /Prev 141 0 R
+ /Next 148 0 R
  /Count -2
  /A 72 0 R
 >> endobj
-144 0 obj
+146 0 obj
 <<
  /Title (\376\377\0\61\0\61\0\56\0\61\0\40\0\106\0\151\0\154\0\145\0\40\0\104\0\145\0\154\0\145\0\164\0\145\0\163\0\40\0\141\0\156\0\144\0\40\0\125\0\156\0\144\0\145\0\154\0\145\0\164\0\145\0\163)
- /Parent 143 0 R
- /Next 145 0 R
+ /Parent 145 0 R
+ /Next 147 0 R
  /A 74 0 R
 >> endobj
-145 0 obj
+147 0 obj
 <<
  /Title (\376\377\0\61\0\61\0\56\0\62\0\40\0\104\0\145\0\143\0\162\0\145\0\141\0\163\0\145\0\40\0\122\0\145\0\160\0\154\0\151\0\143\0\141\0\164\0\151\0\157\0\156\0\40\0\106\0\141\0\143\0\164\0\157\0\162)
- /Parent 143 0 R
- /Prev 144 0 R
+ /Parent 145 0 R
+ /Prev 146 0 R
  /A 76 0 R
 >> endobj
-146 0 obj
+148 0 obj
 <<
  /Title (\376\377\0\61\0\62\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163)
- /Parent 112 0 R
- /Prev 143 0 R
+ /Parent 114 0 R
+ /Prev 145 0 R
  /A 78 0 R
 >> endobj
-147 0 obj
+149 0 obj
 << /Type /Font
 /Subtype /Type1
 /Name /F3
 /BaseFont /Helvetica-Bold
 /Encoding /WinAnsiEncoding >>
 endobj
-148 0 obj
+150 0 obj
 << /Type /Font
 /Subtype /Type1
 /Name /F5
 /BaseFont /Times-Roman
 /Encoding /WinAnsiEncoding >>
 endobj
-149 0 obj
+151 0 obj
 << /Type /Font
 /Subtype /Type1
 /Name /F6
 /BaseFont /Times-Italic
 /Encoding /WinAnsiEncoding >>
 endobj
-150 0 obj
+152 0 obj
 << /Type /Font
 /Subtype /Type1
 /Name /F1
 /BaseFont /Helvetica
 /Encoding /WinAnsiEncoding >>
 endobj
-151 0 obj
+153 0 obj
 << /Type /Font
 /Subtype /Type1
 /Name /F9
 /BaseFont /Courier
 /Encoding /WinAnsiEncoding >>
 endobj
-152 0 obj
+154 0 obj
 << /Type /Font
 /Subtype /Type1
 /Name /F2
 /BaseFont /Helvetica-Oblique
 /Encoding /WinAnsiEncoding >>
 endobj
-153 0 obj
+155 0 obj
 << /Type /Font
 /Subtype /Type1
 /Name /F7
@@ -1019,18 +1036,18 @@
 1 0 obj
 << /Type /Pages
 /Count 14
-/Kids [6 0 R 49 0 R 80 0 R 84 0 R 87 0 R 89 0 R 92 0 R 94 0 R 96 0 R 98 0 R 100 0 R 102 0 R 106 0 R 108 0 R ] >>
+/Kids [6 0 R 49 0 R 80 0 R 84 0 R 87 0 R 89 0 R 92 0 R 96 0 R 98 0 R 100 0 R 102 0 R 104 0 R 108 0 R 110 0 R ] >>
 endobj
 2 0 obj
 << /Type /Catalog
 /Pages 1 0 R
- /Outlines 112 0 R
+ /Outlines 114 0 R
  /PageMode /UseOutlines
  >>
 endobj
 3 0 obj
 << 
-/Font << /F3 147 0 R /F5 148 0 R /F1 150 0 R /F6 149 0 R /F9 151 0 R /F2 152 0 R /F7 153 0 R >> 
+/Font << /F3 149 0 R /F5 150 0 R /F1 152 0 R /F6 151 0 R /F9 153 0 R /F2 154 0 R /F7 155 0 R >> 
 /ProcSet [ /PDF /ImageC /Text ] /XObject <</Im1 86 0 R 
 /Im2 91 0 R 
  >>
@@ -1111,221 +1128,221 @@
 33 0 obj
 <<
 /S /GoTo
-/D [94 0 R /XYZ 85.0 423.8 null]
+/D [96 0 R /XYZ 85.0 441.0 null]
 >>
 endobj
 35 0 obj
 <<
 /S /GoTo
-/D [94 0 R /XYZ 85.0 319.747 null]
+/D [96 0 R /XYZ 85.0 336.947 null]
 >>
 endobj
 37 0 obj
 <<
 /S /GoTo
-/D [94 0 R /XYZ 85.0 149.694 null]
+/D [96 0 R /XYZ 85.0 166.894 null]
 >>
 endobj
 39 0 obj
 <<
 /S /GoTo
-/D [96 0 R /XYZ 85.0 291.8 null]
+/D [98 0 R /XYZ 85.0 291.8 null]
 >>
 endobj
 41 0 obj
 <<
 /S /GoTo
-/D [96 0 R /XYZ 85.0 173.466 null]
+/D [98 0 R /XYZ 85.0 173.466 null]
 >>
 endobj
 43 0 obj
 <<
 /S /GoTo
-/D [98 0 R /XYZ 85.0 624.6 null]
+/D [100 0 R /XYZ 85.0 624.6 null]
 >>
 endobj
 45 0 obj
 <<
 /S /GoTo
-/D [98 0 R /XYZ 85.0 454.547 null]
+/D [100 0 R /XYZ 85.0 454.547 null]
 >>
 endobj
 47 0 obj
 <<
 /S /GoTo
-/D [98 0 R /XYZ 85.0 350.494 null]
+/D [100 0 R /XYZ 85.0 350.494 null]
 >>
 endobj
 52 0 obj
 <<
 /S /GoTo
-/D [98 0 R /XYZ 85.0 206.841 null]
+/D [100 0 R /XYZ 85.0 206.841 null]
 >>
 endobj
 54 0 obj
 <<
 /S /GoTo
-/D [100 0 R /XYZ 85.0 524.2 null]
+/D [102 0 R /XYZ 85.0 524.2 null]
 >>
 endobj
 56 0 obj
 <<
 /S /GoTo
-/D [100 0 R /XYZ 85.0 446.547 null]
+/D [102 0 R /XYZ 85.0 446.547 null]
 >>
 endobj
 58 0 obj
 <<
 /S /GoTo
-/D [100 0 R /XYZ 85.0 415.413 null]
+/D [102 0 R /XYZ 85.0 415.413 null]
 >>
 endobj
 60 0 obj
 <<
 /S /GoTo
-/D [100 0 R /XYZ 85.0 298.16 null]
+/D [102 0 R /XYZ 85.0 298.16 null]
 >>
 endobj
 62 0 obj
 <<
 /S /GoTo
-/D [102 0 R /XYZ 85.0 550.6 null]
+/D [104 0 R /XYZ 85.0 550.6 null]
 >>
 endobj
 64 0 obj
 <<
 /S /GoTo
-/D [102 0 R /XYZ 85.0 354.147 null]
+/D [104 0 R /XYZ 85.0 354.147 null]
 >>
 endobj
 66 0 obj
 <<
 /S /GoTo
-/D [102 0 R /XYZ 85.0 262.213 null]
+/D [104 0 R /XYZ 85.0 262.213 null]
 >>
 endobj
 68 0 obj
 <<
 /S /GoTo
-/D [106 0 R /XYZ 85.0 572.85 null]
+/D [108 0 R /XYZ 85.0 572.85 null]
 >>
 endobj
 70 0 obj
 <<
 /S /GoTo
-/D [106 0 R /XYZ 85.0 402.947 null]
+/D [108 0 R /XYZ 85.0 402.947 null]
 >>
 endobj
 72 0 obj
 <<
 /S /GoTo
-/D [106 0 R /XYZ 85.0 325.294 null]
+/D [108 0 R /XYZ 85.0 325.294 null]
 >>
 endobj
 74 0 obj
 <<
 /S /GoTo
-/D [106 0 R /XYZ 85.0 294.16 null]
+/D [108 0 R /XYZ 85.0 294.16 null]
 >>
 endobj
 76 0 obj
 <<
 /S /GoTo
-/D [108 0 R /XYZ 85.0 589.0 null]
+/D [110 0 R /XYZ 85.0 589.0 null]
 >>
 endobj
 78 0 obj
 <<
 /S /GoTo
-/D [108 0 R /XYZ 85.0 484.947 null]
+/D [110 0 R /XYZ 85.0 484.947 null]
 >>
 endobj
-112 0 obj
+114 0 obj
 <<
- /First 113 0 R
- /Last 146 0 R
+ /First 115 0 R
+ /Last 148 0 R
 >> endobj
 xref
-0 154
+0 156
 0000000000 65535 f 
-0000087230 00000 n 
-0000087384 00000 n 
-0000087477 00000 n 
+0000087509 00000 n 
+0000087664 00000 n 
+0000087757 00000 n 
 0000000015 00000 n 
 0000000071 00000 n 
 0000001520 00000 n 
 0000001640 00000 n 
 0000001798 00000 n 
-0000087670 00000 n 
+0000087950 00000 n 
 0000001933 00000 n 
-0000087733 00000 n 
+0000088013 00000 n 
 0000002068 00000 n 
-0000087799 00000 n 
+0000088079 00000 n 
 0000002203 00000 n 
-0000087865 00000 n 
+0000088145 00000 n 
 0000002340 00000 n 
-0000087931 00000 n 
+0000088211 00000 n 
 0000002477 00000 n 
-0000087997 00000 n 
+0000088277 00000 n 
 0000002614 00000 n 
-0000088061 00000 n 
+0000088341 00000 n 
 0000002751 00000 n 
-0000088127 00000 n 
+0000088407 00000 n 
 0000002888 00000 n 
-0000088193 00000 n 
+0000088473 00000 n 
 0000003025 00000 n 
-0000088259 00000 n 
+0000088539 00000 n 
 0000003161 00000 n 
-0000088325 00000 n 
+0000088605 00000 n 
 0000003298 00000 n 
-0000088389 00000 n 
+0000088669 00000 n 
 0000003435 00000 n 
-0000088455 00000 n 
+0000088735 00000 n 
 0000003572 00000 n 
-0000088519 00000 n 
+0000088799 00000 n 
 0000003708 00000 n 
-0000088585 00000 n 
+0000088865 00000 n 
 0000003845 00000 n 
-0000088651 00000 n 
+0000088931 00000 n 
 0000003982 00000 n 
-0000088715 00000 n 
+0000088995 00000 n 
 0000004119 00000 n 
-0000088781 00000 n 
+0000089061 00000 n 
 0000004255 00000 n 
-0000088845 00000 n 
+0000089126 00000 n 
 0000004392 00000 n 
-0000088911 00000 n 
+0000089193 00000 n 
 0000004529 00000 n 
 0000005587 00000 n 
 0000005710 00000 n 
 0000005828 00000 n 
-0000088977 00000 n 
+0000089260 00000 n 
 0000005961 00000 n 
-0000089043 00000 n 
+0000089327 00000 n 
 0000006094 00000 n 
-0000089108 00000 n 
+0000089392 00000 n 
 0000006227 00000 n 
-0000089175 00000 n 
+0000089459 00000 n 
 0000006360 00000 n 
-0000089242 00000 n 
+0000089526 00000 n 
 0000006493 00000 n 
-0000089308 00000 n 
+0000089592 00000 n 
 0000006626 00000 n 
-0000089373 00000 n 
+0000089657 00000 n 
 0000006759 00000 n 
-0000089440 00000 n 
+0000089724 00000 n 
 0000006891 00000 n 
-0000089507 00000 n 
+0000089791 00000 n 
 0000007024 00000 n 
-0000089573 00000 n 
+0000089857 00000 n 
 0000007157 00000 n 
-0000089640 00000 n 
+0000089924 00000 n 
 0000007290 00000 n 
-0000089707 00000 n 
+0000089991 00000 n 
 0000007423 00000 n 
-0000089773 00000 n 
+0000090057 00000 n 
 0000007555 00000 n 
-0000089838 00000 n 
+0000090122 00000 n 
 0000007688 00000 n 
 0000009991 00000 n 
 0000010114 00000 n 
@@ -1338,75 +1355,77 @@
 0000036380 00000 n 
 0000038126 00000 n 
 0000038234 00000 n 
-0000039829 00000 n 
-0000059188 00000 n 
-0000059296 00000 n 
-0000061862 00000 n 
-0000061970 00000 n 
-0000064666 00000 n 
-0000064774 00000 n 
-0000067252 00000 n 
-0000067360 00000 n 
-0000069924 00000 n 
-0000070033 00000 n 
-0000072865 00000 n 
-0000072991 00000 n 
-0000073020 00000 n 
-0000073219 00000 n 
-0000075889 00000 n 
-0000075999 00000 n 
-0000077605 00000 n 
-0000077731 00000 n 
-0000077768 00000 n 
-0000077970 00000 n 
-0000089905 00000 n 
-0000078175 00000 n 
-0000078341 00000 n 
-0000078617 00000 n 
-0000078817 00000 n 
-0000079061 00000 n 
-0000079269 00000 n 
-0000079519 00000 n 
-0000079921 00000 n 
-0000080404 00000 n 
-0000080644 00000 n 
-0000080901 00000 n 
-0000081148 00000 n 
-0000081481 00000 n 
-0000081702 00000 n 
-0000081855 00000 n 
-0000082194 00000 n 
-0000082464 00000 n 
-0000082676 00000 n 
-0000083062 00000 n 
-0000083295 00000 n 
-0000083498 00000 n 
-0000083742 00000 n 
-0000083901 00000 n 
-0000084154 00000 n 
-0000084324 00000 n 
-0000084486 00000 n 
-0000084722 00000 n 
-0000084957 00000 n 
-0000085115 00000 n 
-0000085288 00000 n 
-0000085499 00000 n 
-0000085757 00000 n 
-0000086020 00000 n 
-0000086290 00000 n 
-0000086450 00000 n 
-0000086564 00000 n 
-0000086675 00000 n 
-0000086787 00000 n 
-0000086896 00000 n 
-0000087003 00000 n 
-0000087120 00000 n 
+0000039924 00000 n 
+0000059283 00000 n 
+0000059406 00000 n 
+0000059433 00000 n 
+0000059624 00000 n 
+0000062138 00000 n 
+0000062246 00000 n 
+0000064942 00000 n 
+0000065050 00000 n 
+0000067528 00000 n 
+0000067637 00000 n 
+0000070202 00000 n 
+0000070312 00000 n 
+0000073144 00000 n 
+0000073270 00000 n 
+0000073299 00000 n 
+0000073498 00000 n 
+0000076168 00000 n 
+0000076278 00000 n 
+0000077884 00000 n 
+0000078010 00000 n 
+0000078047 00000 n 
+0000078249 00000 n 
+0000090189 00000 n 
+0000078454 00000 n 
+0000078620 00000 n 
+0000078896 00000 n 
+0000079096 00000 n 
+0000079340 00000 n 
+0000079548 00000 n 
+0000079798 00000 n 
+0000080200 00000 n 
+0000080683 00000 n 
+0000080923 00000 n 
+0000081180 00000 n 
+0000081427 00000 n 
+0000081760 00000 n 
+0000081981 00000 n 
+0000082134 00000 n 
+0000082473 00000 n 
+0000082743 00000 n 
+0000082955 00000 n 
+0000083341 00000 n 
+0000083574 00000 n 
+0000083777 00000 n 
+0000084021 00000 n 
+0000084180 00000 n 
+0000084433 00000 n 
+0000084603 00000 n 
+0000084765 00000 n 
+0000085001 00000 n 
+0000085236 00000 n 
+0000085394 00000 n 
+0000085567 00000 n 
+0000085778 00000 n 
+0000086036 00000 n 
+0000086299 00000 n 
+0000086569 00000 n 
+0000086729 00000 n 
+0000086843 00000 n 
+0000086954 00000 n 
+0000087066 00000 n 
+0000087175 00000 n 
+0000087282 00000 n 
+0000087399 00000 n 
 trailer
 <<
-/Size 154
+/Size 156
 /Root 2 0 R
 /Info 4 0 R
 >>
 startxref
-89959
+90243
 %%EOF

Modified: hadoop/core/trunk/src/docs/src/documentation/content/xdocs/cluster_setup.xml
URL: http://svn.apache.org/viewvc/hadoop/core/trunk/src/docs/src/documentation/content/xdocs/cluster_setup.xml?rev=632035&r1=632034&r2=632035&view=diff
==============================================================================
--- hadoop/core/trunk/src/docs/src/documentation/content/xdocs/cluster_setup.xml (original)
+++ hadoop/core/trunk/src/docs/src/documentation/content/xdocs/cluster_setup.xml Thu Feb 28 08:04:34 2008
@@ -403,6 +403,28 @@
     </section>
     
     <section>
+      <title>Hadoop Rack Awareness</title>
+      <p>The HDFS and the Map-Reduce components are rack-aware.</p>
+      <p>The <code>NameNode</code> and the <code>JobTracker</code> obtains the
+      <code>rack id</code> of the slaves in the cluster by invoking an API 
+      <a href="ext:api/org/apache/hadoop/net/dnstoswitchmapping/resolve
+      ">resolve</a> in an administrator configured
+      module. The API resolves the slave's DNS name (also IP address) to a 
+      rack id. What module to use can be configured using the configuration
+      item <code>topology.node.switch.mapping.impl</code>. The default 
+      implementation of the same runs a script/command configured using 
+      <code>topology.script.file.name</code>. If topology.script.file.name is
+      not set, the rack id <code>/default-rack</code> is returned for any 
+      passed IP address. The additional configuration in the Map-Reduce
+      part is <code>mapred.cache.task.levels</code> which determines the number
+      of levels (in the network topology) of caches. So, for example, if it is
+      the default value of 2, two levels of caches will be constructed - 
+      one for hosts (host -> task mapping) and another for racks 
+      (rack -> task mapping).
+      </p>
+    </section>
+    
+    <section>
       <title>Hadoop Startup</title>
       
       <p>To start a Hadoop cluster you will need to start both the HDFS and 

Modified: hadoop/core/trunk/src/docs/src/documentation/content/xdocs/hdfs_design.xml
URL: http://svn.apache.org/viewvc/hadoop/core/trunk/src/docs/src/documentation/content/xdocs/hdfs_design.xml?rev=632035&r1=632034&r2=632035&view=diff
==============================================================================
--- hadoop/core/trunk/src/docs/src/documentation/content/xdocs/hdfs_design.xml (original)
+++ hadoop/core/trunk/src/docs/src/documentation/content/xdocs/hdfs_design.xml Thu Feb 28 08:04:34 2008
@@ -136,7 +136,7 @@
         Large HDFS instances run on a cluster of computers that commonly spread across many racks. Communication between two nodes in different racks has to go through switches. In most cases, network bandwidth between machines in the same rack is greater than network bandwidth between machines in different racks.  
         </p>
         <p>
-        At startup time, each Datanode determines the rack it belongs to and notifies the Namenode of its rack id upon registration. HDFS provides <acronym title="Application Programming Interface">API</acronym>s to facilitate pluggable modules that can be used to determine the rack id of a machine. A simple but non-optimal policy is to place replicas on unique racks. This prevents losing data when an entire rack fails and allows use of bandwidth from multiple racks when reading data. This policy evenly distributes replicas in the cluster which makes it easy to balance load on component failure. However, this policy increases the cost of writes because a write needs to transfer blocks to multiple racks. 
+        The NameNode determines the rack id each DataNode belongs to via the process outlined in <a href="cluster_setup.html#Hadoop+Rack+Awareness">Rack Awareness</a>. A simple but non-optimal policy is to place replicas on unique racks. This prevents losing data when an entire rack fails and allows use of bandwidth from multiple racks when reading data. This policy evenly distributes replicas in the cluster which makes it easy to balance load on component failure. However, this policy increases the cost of writes because a write needs to transfer blocks to multiple racks. 
         </p>
         <p>
         For the common case, when the replication factor is three, HDFS&#x2019;s placement policy is to put one replica on one node in the local rack, another on a different node in the local rack, and the last on a different node in a different rack. This policy cuts the inter-rack write traffic which generally improves write performance. The chance of rack failure is far less than that of node failure; this policy does not impact data reliability and availability guarantees. However, it does reduce the aggregate network bandwidth used when reading data since a block is placed in only two unique racks rather than three. With this policy, the replicas of a file do not evenly distribute across the racks. One third of replicas are on one node, two thirds of replicas are on one rack, and the other third are evenly distributed across the remaining racks. This policy improves write performance without compromising data reliability or read performance.

Modified: hadoop/core/trunk/src/docs/src/documentation/content/xdocs/site.xml
URL: http://svn.apache.org/viewvc/hadoop/core/trunk/src/docs/src/documentation/content/xdocs/site.xml?rev=632035&r1=632034&r2=632035&view=diff
==============================================================================
--- hadoop/core/trunk/src/docs/src/documentation/content/xdocs/site.xml (original)
+++ hadoop/core/trunk/src/docs/src/documentation/content/xdocs/site.xml Thu Feb 28 08:04:34 2008
@@ -193,6 +193,11 @@
                 <package-summary href="package-summary.html" />
               </pipes>
             </mapred>
+            <net href="net/">
+              <dnstoswitchmapping href="DNSToSwitchMapping.html">
+              <resolve href="#resolve(java.util.List)" />
+              </dnstoswitchmapping>
+            </net>
             <streaming href="streaming/">
               <package-summary href="package-summary.html" />
             </streaming>

Modified: hadoop/core/trunk/src/java/org/apache/hadoop/dfs/DataNode.java
URL: http://svn.apache.org/viewvc/hadoop/core/trunk/src/java/org/apache/hadoop/dfs/DataNode.java?rev=632035&r1=632034&r2=632035&view=diff
==============================================================================
--- hadoop/core/trunk/src/java/org/apache/hadoop/dfs/DataNode.java (original)
+++ hadoop/core/trunk/src/java/org/apache/hadoop/dfs/DataNode.java Thu Feb 28 08:04:34 2008
@@ -26,12 +26,10 @@
 import org.apache.hadoop.conf.*;
 import org.apache.hadoop.net.DNS;
 import org.apache.hadoop.net.NetUtils;
-import org.apache.hadoop.net.NodeBase;
 import org.apache.hadoop.util.*;
 import org.apache.hadoop.util.DiskChecker.DiskErrorException;
 import org.apache.hadoop.util.DiskChecker.DiskOutOfSpaceException;
 import org.apache.hadoop.mapred.StatusHttpServer;
-import org.apache.hadoop.net.NetworkTopology;
 import org.apache.hadoop.dfs.BlockCommand;
 import org.apache.hadoop.dfs.DatanodeProtocol;
 import org.apache.hadoop.dfs.FSDatasetInterface.MetaDataInputStream;
@@ -90,7 +88,7 @@
   DatanodeProtocol namenode = null;
   FSDatasetInterface data = null;
   DatanodeRegistration dnRegistration = null;
-  private String networkLoc;
+
   volatile boolean shouldRun = true;
   private LinkedList<Block> receivedBlockList = new LinkedList<Block>();
   private LinkedList<String> delHints = new LinkedList<String>();
@@ -102,15 +100,18 @@
   long lastBlockReport = 0;
   boolean resetBlockReportTime = true;
   long initialBlockReportDelay = BLOCKREPORT_INITIAL_DELAY * 1000L;
+  boolean mustReportBlocks = false;
   long lastHeartbeat = 0;
   long heartBeatInterval;
   private DataStorage storage = null;
   private StatusHttpServer infoServer = null;
   private DataNodeMetrics myMetrics;
   private static InetSocketAddress nameNodeAddr;
+  private InetSocketAddress selfAddr;
   private static DataNode datanodeObject = null;
   private Thread dataNodeThread = null;
   String machineName;
+  private static String dnThreadName;
   int defaultBytesPerChecksum = 512;
   private int socketTimeout;
   
@@ -181,9 +182,14 @@
                      AbstractList<File> dataDirs
                      ) throws IOException {
     // use configured nameserver & interface to get local hostname
-    machineName = DNS.getDefaultHost(
+    if (conf.get("slave.host.name") != null) {
+      machineName = conf.get("slave.host.name");   
+    }
+    if (machineName == null) {
+      machineName = DNS.getDefaultHost(
                                      conf.get("dfs.datanode.dns.interface","default"),
                                      conf.get("dfs.datanode.dns.nameserver","default"));
+    }
     InetSocketAddress nameNodeAddr = NetUtils.createSocketAddr(
                                      conf.get("fs.default.name", "local"));
     
@@ -246,6 +252,8 @@
     ss.setReceiveBufferSize(DEFAULT_DATA_SOCKET_SIZE); 
     // adjust machine name with the actual port
     tmpPort = ss.getLocalPort();
+    selfAddr = new InetSocketAddress(ss.getInetAddress().getHostAddress(),
+                                     tmpPort);
     this.dnRegistration.setName(machineName + ":" + tmpPort);
     LOG.info("Opened server at " + tmpPort);
       
@@ -304,12 +312,6 @@
     this.infoServer.start();
     // adjust info port
     this.dnRegistration.setInfoPort(this.infoServer.getPort());
-    // get network location
-    this.networkLoc = conf.get("dfs.datanode.rack");
-    if (networkLoc == null)  // exec network script or set the default rack
-      networkLoc = getNetworkLoc(conf);
-    // register datanode
-    register();
     myMetrics = new DataNodeMetrics(conf, dnRegistration.getStorageID());
   }
 
@@ -356,6 +358,10 @@
   public InetSocketAddress getNameNodeAddr() {
     return nameNodeAddr;
   }
+  
+  public InetSocketAddress getSelfAddr() {
+    return selfAddr;
+  }
     
   DataNodeMetrics getMetrics() {
     return myMetrics;
@@ -418,7 +424,7 @@
       try {
         // reset name to machineName. Mainly for web interface.
         dnRegistration.name = machineName + ":" + dnRegistration.getPort();
-        dnRegistration = namenode.register(dnRegistration, networkLoc);
+        dnRegistration = namenode.register(dnRegistration);
         break;
       } catch(SocketTimeoutException e) {  // namenode is busy
         LOG.info("Problem connecting to server: " + getNameNodeAddr());
@@ -632,12 +638,14 @@
         }
 
         // send block report
-        if (startTime - lastBlockReport > blockReportInterval) {
+        if (mustReportBlocks || 
+            startTime - lastBlockReport > blockReportInterval) {
           //
           // Send latest blockinfo report if timer has expired.
           // Get back a list of local block(s) that are obsolete
           // and can be safely GC'ed.
           //
+          mustReportBlocks = false;
           long brStartTime = now();
           Block[] bReport = data.getBlockReport();
           DatanodeCommand cmd = namenode.blockReport(dnRegistration,
@@ -739,6 +747,16 @@
       // start distributed upgrade here
       processDistributedUpgradeCommand((UpgradeCommand)cmd);
       break;
+    case DatanodeProtocol.DNA_BLOCKREPORT:
+      try {
+        if (initialBlockReportDelay != 0) {
+          //sleep for a random time upto the heartbeat interval 
+          //before sending the block report
+          Thread.sleep((long)(new Random().nextDouble() * heartBeatInterval));
+        }
+        mustReportBlocks = true;
+      } catch (InterruptedException ie) {}
+      return false;
     default:
       LOG.warn("Unknown DatanodeCommand action: " + cmd.getAction());
     }
@@ -2447,32 +2465,49 @@
     LOG.info(dnRegistration + ":Finishing DataNode in: "+data);
   }
     
-  /** Start datanode daemon.
+  /** Start a single datanode daemon and wait for it to finish.
+   *  If this thread is specifically interrupted, it will stop waiting.
    */
-  public static DataNode run(Configuration conf) throws IOException {
-    String[] dataDirs = conf.getStrings("dfs.data.dir");
-    DataNode dn = makeInstance(dataDirs, conf);
+  static void runDatanodeDaemon(DataNode dn) throws IOException {
     if (dn != null) {
-      dn.dataNodeThread = new Thread(dn, "DataNode: [" +
-                                  StringUtils.arrayToString(dataDirs) + "]");
+      //register datanode
+      dn.register();
+      dn.dataNodeThread = new Thread(dn, dnThreadName);
       dn.dataNodeThread.setDaemon(true); // needed for JUnit testing
       dn.dataNodeThread.start();
     }
-    return dn;
   }
 
-  /** Start a single datanode daemon and wait for it to finish.
-   *  If this thread is specifically interrupted, it will stop waiting.
+  /** Instantiate a single datanode object. This must be run by invoking
+   *  {@link DataNode#runDatanodeDaemon(DataNode)} subsequently. 
    */
-  static DataNode createDataNode(String args[],
-                                 Configuration conf) throws IOException {
+  static DataNode instantiateDataNode(String args[],
+                                      Configuration conf) throws IOException {
     if (conf == null)
       conf = new Configuration();
     if (!parseArguments(args, conf)) {
       printUsage();
       return null;
     }
-    return run(conf);
+    if (conf.get("dfs.network.script") != null) {
+      LOG.error("This configuration for rack identification is not supported" +
+          " anymore. RackID resolution is handled by the NameNode.");
+      System.exit(-1);
+    }
+    String[] dataDirs = conf.getStrings("dfs.data.dir");
+    dnThreadName = "DataNode: [" +
+                        StringUtils.arrayToString(dataDirs) + "]";
+    return makeInstance(dataDirs, conf);
+  }
+
+  /** Instantiate & Start a single datanode daemon and wait for it to finish.
+   *  If this thread is specifically interrupted, it will stop waiting.
+   */
+  static DataNode createDataNode(String args[],
+                                 Configuration conf) throws IOException {
+    DataNode dn = instantiateDataNode(args, conf);
+    runDatanodeDaemon(dn);
+    return dn;
   }
 
   void join() {
@@ -2524,7 +2559,6 @@
   
   private static void printUsage() {
     System.err.println("Usage: java DataNode");
-    System.err.println("           [-r, --rack <network location>] |");
     System.err.println("           [-rollback]");
   }
 
@@ -2537,15 +2571,12 @@
                                         Configuration conf) {
     int argsLen = (args == null) ? 0 : args.length;
     StartupOption startOpt = StartupOption.REGULAR;
-    String networkLoc = null;
     for(int i=0; i < argsLen; i++) {
       String cmd = args[i];
       if ("-r".equalsIgnoreCase(cmd) || "--rack".equalsIgnoreCase(cmd)) {
-        if (i==args.length-1)
-          return false;
-        networkLoc = args[++i];
-        if (networkLoc.startsWith("-"))
-          return false;
+        LOG.error("-r, --rack arguments are not supported anymore. RackID " +
+            "resolution is handled by the NameNode.");
+        System.exit(-1);
       } else if ("-rollback".equalsIgnoreCase(cmd)) {
         startOpt = StartupOption.ROLLBACK;
       } else if ("-regular".equalsIgnoreCase(cmd)) {
@@ -2553,8 +2584,6 @@
       } else
         return false;
     }
-    if (networkLoc != null)
-      conf.set("dfs.datanode.rack", NodeBase.normalize(networkLoc));
     setStartupOption(conf, startOpt);
     return true;
   }
@@ -2568,76 +2597,6 @@
                                           StartupOption.REGULAR.toString()));
   }
 
-  /* Get the network location by running a script configured in conf */
-  private static String getNetworkLoc(Configuration conf) 
-    throws IOException {
-    String locScript = conf.get("dfs.network.script");
-    if (locScript == null) 
-      return NetworkTopology.DEFAULT_RACK;
-
-    LOG.info("Starting to run script to get datanode network location");
-    Process p = Runtime.getRuntime().exec(locScript);
-    StringBuffer networkLoc = new StringBuffer();
-    final BufferedReader inR = new BufferedReader(
-                                                  new InputStreamReader(p.getInputStream()));
-    final BufferedReader errR = new BufferedReader(
-                                                   new InputStreamReader(p.getErrorStream()));
-
-    // read & log any error messages from the running script
-    Thread errThread = new Thread() {
-        @Override
-        public void start() {
-          try {
-            String errLine = errR.readLine();
-            while(errLine != null) {
-              LOG.warn("Network script error: "+errLine);
-              errLine = errR.readLine();
-            }
-          } catch(IOException e) {
-                    
-          }
-        }
-      };
-    try {
-      errThread.start();
-            
-      // fetch output from the process
-      String line = inR.readLine();
-      while(line != null) {
-        networkLoc.append(line);
-        line = inR.readLine();
-      }
-      try {
-        // wait for the process to finish
-        int returnVal = p.waitFor();
-        // check the exit code
-        if (returnVal != 0) {
-          throw new IOException("Process exits with nonzero status: "+locScript);
-        }
-      } catch (InterruptedException e) {
-        throw new IOException(e.getMessage());
-      } finally {
-        try {
-          // make sure that the error thread exits
-          errThread.join();
-        } catch (InterruptedException je) {
-          LOG.warn(StringUtils.stringifyException(je));
-        }
-      }
-    } finally {
-      // close in & error streams
-      try {
-        inR.close();
-      } catch (IOException ine) {
-        throw ine;
-      } finally {
-        errR.close();
-      }
-    }
-
-    return networkLoc.toString();
-  }
-  
   /**
    * This methods  arranges for the data node to send the block report at the next heartbeat.
    */

Modified: hadoop/core/trunk/src/java/org/apache/hadoop/dfs/DatanodeDescriptor.java
URL: http://svn.apache.org/viewvc/hadoop/core/trunk/src/java/org/apache/hadoop/dfs/DatanodeDescriptor.java?rev=632035&r1=632034&r2=632035&view=diff
==============================================================================
--- hadoop/core/trunk/src/java/org/apache/hadoop/dfs/DatanodeDescriptor.java (original)
+++ hadoop/core/trunk/src/java/org/apache/hadoop/dfs/DatanodeDescriptor.java Thu Feb 28 08:04:34 2008
@@ -47,6 +47,7 @@
   List<Block> replicateBlocks;
   List<DatanodeDescriptor[]> replicateTargetSets;
   Set<Block> invalidateBlocks;
+  boolean processedBlockReport = false;
   
   /** Default constructor */
   public DatanodeDescriptor() {
@@ -258,6 +259,21 @@
     synchronized (invalidateBlocks) {
       return invalidateBlocks.size();
     }
+  }
+  
+  /**
+   * Set the bit signifying that the first block report from this datanode has been 
+   * processed
+   */
+  void setBlockReportProcessed(boolean val) {
+    processedBlockReport = val;
+  }
+  
+  /**
+   * Have we processed any block report from this datanode yet
+   */
+  boolean getBlockReportProcessed() {
+    return processedBlockReport;
   }
 
   /**

Modified: hadoop/core/trunk/src/java/org/apache/hadoop/dfs/DatanodeInfo.java
URL: http://svn.apache.org/viewvc/hadoop/core/trunk/src/java/org/apache/hadoop/dfs/DatanodeInfo.java?rev=632035&r1=632034&r2=632035&view=diff
==============================================================================
--- hadoop/core/trunk/src/java/org/apache/hadoop/dfs/DatanodeInfo.java (original)
+++ hadoop/core/trunk/src/java/org/apache/hadoop/dfs/DatanodeInfo.java Thu Feb 28 08:04:34 2008
@@ -44,7 +44,7 @@
   protected long remaining;
   protected long lastUpdate;
   protected int xceiverCount;
-  private String location = NetworkTopology.DEFAULT_RACK;
+  private String location = NetworkTopology.UNRESOLVED;
 
   /** HostName as suplied by the datanode during registration as its 
    * name. Namenode uses datanode IP address as the name.
@@ -125,10 +125,10 @@
   }
 
   /** rack name **/
-  public String getNetworkLocation() {return location;}
+  public synchronized String getNetworkLocation() {return location;}
     
   /** Sets the rack name */
-  void setNetworkLocation(String location) {
+  public synchronized void setNetworkLocation(String location) {
     this.location = NodeBase.normalize(location);
   }
   
@@ -147,7 +147,8 @@
     long r = getRemaining();
     long u = getDfsUsed();
     buffer.append("Name: "+name+"\n");
-    if (!NetworkTopology.DEFAULT_RACK.equals(location)) {
+    if (!NetworkTopology.UNRESOLVED.equals(location) && 
+        !NetworkTopology.DEFAULT_RACK.equals(location)) {
       buffer.append("Rack: "+location+"\n");
     }
     if (isDecommissioned()) {
@@ -172,7 +173,8 @@
     long r = getRemaining();
     long u = getDfsUsed();
     buffer.append(name);
-    if (!NetworkTopology.DEFAULT_RACK.equals(location)) {
+    if (!NetworkTopology.UNRESOLVED.equals(location) &&
+        !NetworkTopology.DEFAULT_RACK.equals(location)) {
       buffer.append(" "+location);
     }
     if (isDecommissioned()) {

Modified: hadoop/core/trunk/src/java/org/apache/hadoop/dfs/DatanodeProtocol.java
URL: http://svn.apache.org/viewvc/hadoop/core/trunk/src/java/org/apache/hadoop/dfs/DatanodeProtocol.java?rev=632035&r1=632034&r2=632035&view=diff
==============================================================================
--- hadoop/core/trunk/src/java/org/apache/hadoop/dfs/DatanodeProtocol.java (original)
+++ hadoop/core/trunk/src/java/org/apache/hadoop/dfs/DatanodeProtocol.java Thu Feb 28 08:04:34 2008
@@ -31,10 +31,12 @@
  **********************************************************************/
 interface DatanodeProtocol extends VersionedProtocol {
   /*
+   * 12: removed the rack ID from registration;
+   * 12: added DNA_BLOCKREPORT
    * 11 : reportBadBlocks() is added.
    * 11 Block reports as long[]
    */
-  public static final long versionID = 11L;
+  public static final long versionID = 12L;
   
   // error code
   final static int NOTIFY = 0;
@@ -51,19 +53,19 @@
   final static int DNA_SHUTDOWN = 3;   // shutdown node
   final static int DNA_REGISTER = 4;   // re-register
   final static int DNA_FINALIZE = 5;   // finalize previous upgrade
+  final static int DNA_BLOCKREPORT = 6;   // request a block report
 
   /** 
    * Register Datanode.
    *
    * @see org.apache.hadoop.dfs.DataNode#register()
-   * @see org.apache.hadoop.dfs.FSNamesystem#registerDatanode(DatanodeRegistration, String)
+   * @see org.apache.hadoop.dfs.FSNamesystem#registerDatanode(DatanodeRegistration)
    * 
    * @return updated {@link org.apache.hadoop.dfs.DatanodeRegistration}, which contains 
    * new storageID if the datanode did not have one and
    * registration ID for further communication.
    */
-  public DatanodeRegistration register(DatanodeRegistration registration,
-                                       String networkLocation
+  public DatanodeRegistration register(DatanodeRegistration registration
                                        ) throws IOException;
   /**
    * sendHeartbeat() tells the NameNode that the DataNode is still

Modified: hadoop/core/trunk/src/java/org/apache/hadoop/dfs/FSNamesystem.java
URL: http://svn.apache.org/viewvc/hadoop/core/trunk/src/java/org/apache/hadoop/dfs/FSNamesystem.java?rev=632035&r1=632034&r2=632035&view=diff
==============================================================================
--- hadoop/core/trunk/src/java/org/apache/hadoop/dfs/FSNamesystem.java (original)
+++ hadoop/core/trunk/src/java/org/apache/hadoop/dfs/FSNamesystem.java Thu Feb 28 08:04:34 2008
@@ -27,8 +27,10 @@
 import org.apache.hadoop.util.*;
 import org.apache.hadoop.mapred.StatusHttpServer;
 import org.apache.hadoop.metrics.util.MBeanUtil;
+import org.apache.hadoop.net.DNSToSwitchMapping;
 import org.apache.hadoop.net.NetUtils;
 import org.apache.hadoop.net.NetworkTopology;
+import org.apache.hadoop.net.ScriptBasedMapping;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.fs.permission.*;
 import org.apache.hadoop.ipc.Server;
@@ -42,6 +44,7 @@
 import java.net.InetSocketAddress;
 import java.util.*;
 import java.util.Map.Entry;
+import java.util.concurrent.LinkedBlockingQueue;
 import java.text.SimpleDateFormat;
 
 import javax.management.NotCompliantMBeanException;
@@ -175,6 +178,8 @@
   Daemon lmthread = null;   // LeaseMonitor thread
   Daemon smmthread = null;  // SafeModeMonitor thread
   Daemon replthread = null;  // Replication thread
+  Daemon resthread = null; //ResolutionMonitor thread
+  
   volatile boolean fsRunning = true;
   long systemStart = 0;
 
@@ -208,6 +213,10 @@
     
   // datanode networktoplogy
   NetworkTopology clusterMap = new NetworkTopology();
+  private DNSToSwitchMapping dnsToSwitchMapping;
+  private LinkedBlockingQueue<DatanodeDescriptor> resolutionQueue = 
+    new LinkedBlockingQueue <DatanodeDescriptor>();
+  
   // for block replicas placement
   ReplicationTargetChooser replicator;
 
@@ -271,9 +280,11 @@
     this.hbthread = new Daemon(new HeartbeatMonitor());
     this.lmthread = new Daemon(new LeaseMonitor());
     this.replthread = new Daemon(new ReplicationMonitor());
+    this.resthread = new Daemon(new ResolutionMonitor());
     hbthread.start();
     lmthread.start();
     replthread.start();
+    resthread.start();
     
     this.registerMBean(); // register the MBean for the FSNamesystemStutus
 
@@ -283,6 +294,10 @@
     this.dnthread = new Daemon(new DecommissionedMonitor());
     dnthread.start();
 
+    this.dnsToSwitchMapping = (DNSToSwitchMapping)ReflectionUtils.newInstance(
+        conf.getClass("topology.node.switch.mapping.impl", ScriptBasedMapping.class,
+            DNSToSwitchMapping.class), conf);
+
     String infoAddr = 
       NetUtils.getServerAddress(conf, "dfs.info.bindAddress", 
                                 "dfs.info.port", "dfs.http.address");
@@ -419,6 +434,7 @@
       if (infoServer != null) infoServer.stop();
       if (hbthread != null) hbthread.interrupt();
       if (replthread != null) replthread.interrupt();
+      if (resthread != null) resthread.interrupt();
       if (dnthread != null) dnthread.interrupt();
       if (smmthread != null) smmthread.interrupt();
     } catch (InterruptedException ie) {
@@ -1835,6 +1851,72 @@
     return dir.getListing(src);
   }
 
+  public void addToResolutionQueue(DatanodeDescriptor d) {
+    while (!resolutionQueue.add(d)) {
+      LOG.warn("Couldn't add to the Resolution queue now. Will " +
+               "try again");
+      try {
+        Thread.sleep(2000);
+      } catch (InterruptedException ie) {}
+    }
+  }
+  
+  private class ResolutionMonitor implements Runnable {
+    public void run() {
+      try {
+        while (fsRunning) {
+          int size;
+          if((size = resolutionQueue.size()) == 0) {
+            Thread.sleep(2000);
+            continue;
+          }
+          List <DatanodeDescriptor> datanodes = 
+            new ArrayList<DatanodeDescriptor>(size);
+          resolutionQueue.drainTo(datanodes);
+          List<String> dnHosts = new ArrayList<String>(size);
+          for (DatanodeDescriptor d : datanodes) {
+            dnHosts.add(d.getName());
+          }
+          List<String> rName = dnsToSwitchMapping.resolve(dnHosts);
+          if (rName == null) {
+            continue;
+          }
+          int i = 0;
+          for (String m : rName) {
+            DatanodeDescriptor d = datanodes.get(i++); 
+            d.setNetworkLocation(m);
+            clusterMap.add(d);
+          }
+        }
+      } catch (Exception e) {
+        FSNamesystem.LOG.error(StringUtils.stringifyException(e));
+      }
+    }
+  }
+  
+  /**
+   * Has the block report of the datanode represented by nodeReg been processed
+   * yet.
+   * @param nodeReg
+   * @return true or false
+   */
+  public synchronized boolean blockReportProcessed(DatanodeRegistration nodeReg)
+  throws IOException {
+    return getDatanode(nodeReg).getBlockReportProcessed();
+  }
+  
+  /**
+   * Has the datanode been resolved to a switch/rack
+   */
+  public synchronized boolean isResolved(DatanodeRegistration dnReg) {
+    try {
+      return !getDatanode(dnReg).getNetworkLocation()
+            .equals(NetworkTopology.UNRESOLVED);
+    } catch (IOException ie) {
+      return false;
+    }
+  }
+    
   /////////////////////////////////////////////////////////
   //
   // These methods are called by datanodes
@@ -1863,8 +1945,7 @@
    * 
    * @see DataNode#register()
    */
-  public synchronized void registerDatanode(DatanodeRegistration nodeReg,
-                                            String networkLocation
+  public synchronized void registerDatanode(DatanodeRegistration nodeReg
                                             ) throws IOException {
 
     if (!verifyNodeRegistration(nodeReg)) {
@@ -1931,9 +2012,9 @@
       // update cluster map
       clusterMap.remove(nodeS);
       nodeS.updateRegInfo(nodeReg);
-      nodeS.setNetworkLocation(networkLocation);
-      clusterMap.add(nodeS);
       nodeS.setHostName(hostName);
+      nodeS.setNetworkLocation(NetworkTopology.UNRESOLVED);
+      addToResolutionQueue(nodeS);
         
       // also treat the registration message as a heartbeat
       synchronized(heartbeats) {
@@ -1958,9 +2039,9 @@
     }
     // register new datanode
     DatanodeDescriptor nodeDescr 
-      = new DatanodeDescriptor(nodeReg, networkLocation, hostName);
+      = new DatanodeDescriptor(nodeReg, NetworkTopology.UNRESOLVED, hostName);
     unprotectedAddDatanode(nodeDescr);
-    clusterMap.add(nodeDescr);
+    addToResolutionQueue(nodeDescr);
       
     // also treat the registration message as a heartbeat
     synchronized(heartbeats) {
@@ -2406,6 +2487,10 @@
       setDatanodeDead(node);
       throw new DisallowedDatanodeException(node);
     }
+    
+    if (node.getNetworkLocation().equals(NetworkTopology.UNRESOLVED)) {
+      return null; //drop the block report if the dn hasn't been resolved
+    }
 
     //
     // Modify the (block-->datanode) map, according to the difference
@@ -2455,6 +2540,7 @@
       }
     }
     NameNode.getNameNodeMetrics().blockReport.inc((int) (now() - startTime));
+    node.setBlockReportProcessed(true);
     return obsolete.toArray(new Block[obsolete.size()]);
   }
 

Modified: hadoop/core/trunk/src/java/org/apache/hadoop/dfs/NameNode.java
URL: http://svn.apache.org/viewvc/hadoop/core/trunk/src/java/org/apache/hadoop/dfs/NameNode.java?rev=632035&r1=632034&r2=632035&view=diff
==============================================================================
--- hadoop/core/trunk/src/java/org/apache/hadoop/dfs/NameNode.java (original)
+++ hadoop/core/trunk/src/java/org/apache/hadoop/dfs/NameNode.java Thu Feb 28 08:04:34 2008
@@ -544,11 +544,10 @@
   ////////////////////////////////////////////////////////////////
   /** 
    */
-  public DatanodeRegistration register(DatanodeRegistration nodeReg,
-                                       String networkLocation
+  public DatanodeRegistration register(DatanodeRegistration nodeReg
                                        ) throws IOException {
     verifyVersion(nodeReg.getVersion());
-    namesystem.registerDatanode(nodeReg, networkLocation);
+    namesystem.registerDatanode(nodeReg);
       
     return nodeReg;
   }
@@ -578,6 +577,18 @@
       // request block report from the datanode
       assert(xferResults[0] == null && deleteList[0] == null);
       return new DatanodeCommand(DatanodeProtocol.DNA_REGISTER);
+    }
+    //
+    // If the datanode has (just) been resolved and we haven't ever processed 
+    // a block report from it yet, ask for one now.
+    //
+    if (!namesystem.blockReportProcessed(nodeReg)) {
+      // If we never processed a block report from this datanode, we shouldn't
+      // have any work for that as well
+      assert(xferResults[0] == null && deleteList[0] == null);
+      if (namesystem.isResolved(nodeReg)) {
+        return new DatanodeCommand(DatanodeProtocol.DNA_BLOCKREPORT);
+      }
     }
         
     //



Mime
View raw message