[comp.theory.cell-automata] Extendable "delay loop" memory for universal machine in Life

callahan@cs.jhu.edu (Paul Callahan) (01/22/91)

I have not yet constructed an explicit universal machine in Life.  However,
I have constructed a potentially infinite memory component that I believe
will make it easier to do so.  Before explaining this pattern (included
with the posting) I feel obligated to clear up some misleading statements
I made in a previous posting.

It has been a long time since I read _The Recursive Universe_ (Poundstone), 
and at the time I was under the false impression that its proof of life 
universality relied on the ability to construct boolean logic gates which 
could then be layed out in arbitrarily large networks by a universal 
constructor.  I seem to have neglected the very elegant proof of universality 
(by Conway himself, and treated in detail in _The Recursive Universe_) that is 
implied by the existence of sliding block memories.  

These memories make it possible to store an arbitrarily large integer 
accessible by the operations increment, decrement, and test for zero.  It 
is well known that a machine with two such memories (called counters) is 
universal (see, for example, Hopcroft and Ullman _Introduction to Automata 
Theory, Languages, and Computation_), so a universal machine can be constructed
with two sliding block memories and a sufficiently large finite control.
(the input tape could be represented a sequence of gliders going by the
control initially). 

The primary difficulty with a 2-counter machine is that it does not preserve
polynomial time complexity, so it still seems desirable to construct an
unbounded tape-like memory.  After some experimentation, I constructed an
extendable "delay loop" memory.  In such a memory, a character is written to
a stream by the finite control and it arrives back after a number of steps.  The
length of the delay determines the size of the memory.  It is not hard to
see how we may (at a linear time cost) simulate left/right tape moves using 
such a memory.  It is easy to construct large finite delay loops in Life, so 
the primary question is how to construct a delay loop that can be lengthened 
arbitrarily by the finite control.

Before going into the construction, which is rather intricate, it is worthwhile
to point out precisely what is being attempted.  We assume a finite control 
that, at each step, can read an incoming character, write an outgoing character,
and possibly send a signal to lengthen the delay loop.  The character written at
time t is read back at time t+d, where d is a delay parameter that is 
incremented each time a lengthen signal is output by the finite control.
For the actual construction, we assume a two character alphabet.

The method I used to implement the extendable delay loop in Life is a 
pair of spaceship streams going in opposite directions, the forward stream
produced by a stationery gun, and the backward stream produced by a forward-mov-
ing rake flotilla.  In general, we would like these streams to pass without
affecting each other.  However, at a certain distance from the stationery
gun, the presence of spaceships in the forward stream causes holes to be left in
the backward stream (thus forcing data to reverse direction and head back
toward the finite control).  The distance to the point at which the streams 
interact determines the length of the delay loop.

A carefully positioned "eater" (see a standard Life reference) can be used to 
create such an interaction point.  To allow the finite control to adjust the
interaction point, we augment the rake flotilla to produce a sequence of 
eaters in addition to backward moving spaceships.  The leftmost eater will now 
define the length of the delay loop.  To increase the size of the loop, our 
finite control need only send out a spaceship along a path parallel to the 
forward data stream in order to annihilate the leftmost eater.  The distance
to the most distant eater grows very rapidly, so the maximum length of the 
delay loop is effectively unbounded.

The following schematic will (hopefully) be easier to follow than the 
Life pattern itself.  It is still rather involved.  Symbol names
are explained below.  This construction is a simple recirculating loop in
which characters read from the delay loop are written back to it as they
become available.  It is possible to manually force a loop-lengthening signal
within Xlife by erasing a glider, but the pattern is not set up to issue one 
automatically. 

                       /
     gg1       gg2    /     gg3                                            
        \         \  /        \
         x1        x2          \                                             
        / \         \           \                                               
       |   \         \    se<----x3--<--------<-------------<---------\
        \   sg1--->---\-->----->--\----->----->------X                 R
         \             sg2--->-----\-->------>-------e0 e1 e2 e3 ... /
          \                         \                   (ei)            
           \                         | 
            \           -           /                                        
             \         / \         /                                         
              \       /   \       /                                          
               \     /     \     /                                           
                \   /       \   /                                            
                 \ /         \ /                                             
                  -           -                       

Components of Pattern
---------------------
sg1: Spaceship gun producing forward data stream.
gg1: Glider gun to normally inhibit sg1.
ei:  Eater sequence establishing collision points for collision that 
     leaves hole in backward stream when pair of ships arrive in
     forward stream.
sg2: Spaceship gun producing spaceships to lengthen delay loop by 
     destroying leftmost remaining eater in sequence ei.
gg2: Glider gun that normally inhibits sg2.
gg3: Glider gun to test backward data stream by attempting to shoot
     gliders through a hypothetical hole in stream.
R:   Rake flotilla, producing spaceships for backward data stream,
     as well as eater sequence ei.
se:  Eater positioned to destroy spaceships from backward data stream.

(Note: Isolated - and | characters are shuttles placed to reflect
glider stream).

Collision Points
----------------
x1:  Incoming glider hits glider from gg1 and leaves block, also destroying
     next glider from gg1.  (Thus, incoming glider produces pair of
     spaceships, which will eventually result in another incoming glider).
x2:  Properly positioned glider destroys glider from gg2, causing sg2
     to produce a spaceship that lengthens loop by destroying leftmost
     eater. (This collision must be simulated "by hand" in enclosed 
     Xlife file by erasing a glider from gg2).
x3:  Glider attempts to pass through hole in backward data stream.  Thus,
     contents of backward data stream are converted to incoming gliders.
X:   Two consecutive spaceships in forward stream interact with two spaceships
     in backward stream at leftmost eater.  Spaceships are all destroyed, 
     while eater remains unharmed for the next collision (a glider is sent
     Northeast as a useless, but harmless side-effect).

Finally, the rest of this posting will consist of the pattern itself,
in Xlife format.  This pattern produces an initial "1" in the delay loop, formed
by two consecutive spaceships in the forward data stream, and "0" for all other
positions in the delay loop.  It is possible to insert more 1s manually by
destroying *two* consecutive gliders from gg1.  It is important to destroy
them in pairs in order for the eater-interaction to work properly.  It is
possible to turn 1s into 0s manually by destroying *single* gliders travelling 
along the reflector path at the bottom of the construction.  

Explanatory note: A "1" has three primary representations in the course of the 
delay loop: a pair of spaceships in the forward data stream, a gap of two 
spaceships in the backward data stream, and a single glider in the reflector
path.

The following pattern is an Xlife file that has been compressed and uuencoded.

--- cut here ---
begin 644 delayloop.life.Z
M'YV0(YZ`&!.&#9LP:,*X`2$"2I@Z;$`,*7@PH1L6,V+D`.&DB!",,W"TN`&CH
MA@P6,F;4:!$2!@T61]Z\(2,GS1@T(H#8>2/GC9LW:5R,F>-"#9HZ+LJ0J0.B/
MB4\02A2"D!$#1`P<.E3JH+%18XX8"JA:S7$C;%6-.,+*&%LV)=NP,\;6"$M#X
M+MVQ-L+BL(HCKXR]5]L"QI%61E<<;0\7CAL8+M_"=:_ZC8SX[M7"-?C.")OYS
MZEP9G?N&M:%Y-%^_-TK+2.TY+&O18F/<^'SVAM^ULOTRMNU8-F2K-]I&OI%6"
M]MH9-,#*KHI<.5<0S17$J`$#>G+IU*'/R(&].G(8V)F'Q'Y\_/3RW&/8J#M#E
MI?3UVO.J9S^CK/J-[8O;P+]=.DGMQ=T@7GH"6@>>>MZU]UZ"-"P(H(/MI6>#F
M>`VJ)]Y<%L;WGGCV3?B@>N55:$-Y&(ZH78?EZ1=7>R*NZ)YZ+G;H8F$V["6#^
M8:-E=B-W,MB@XPS@]9A:2D'6.!5HH]G88Y)'TKC1C7[MUZ1KU=W85H%6NJ:CR
M#`VNMN5G/A[999@W@DE:ED**Z=J92*XVY(VNO;F9FVJNIJ0,G&V))VAL[ED#/
MFW/^66<-;WY6@Y)='GKD7-LQQY4"VQWWZ`Q2(L==?=Y-B@-^-.05$J=E;9>IV
MIU]9%VJIR*55GZ2>WB!IJ/\A!VNFJA:(G*<X9`I62];AR>NMD.9J:K".^HJ#L
MHYN%Y&B#REK'Z+'6X2JIL9(FBX.DS[(:[(HT&,NMM=P^RRVN[-%@;;G,XE#NT
M7":]R9U)=4&I`+Q'EF72EGG=.Z5);*;5[KYBW0B626L)/*];!M-+E;U<3G75/
MP?%J!/&1X.F[\+P:.<QPE;(=S+&_,G#\;L@4'UP552"?++%))X=\<,$/FQ07C
MR@?/O#+"+BL,`\CQPC"RCC`P#/3(9P9]\)`PY+O:5$:S:-7#[74&M4I/7TIU_
M#"ZW1QK6N]9G5=9><ZV`CU+/1?;3>?FX=0P-JHWVV(2^31Q@,(!%7&8Y;$8<-
M:3DTN+=5,(!'7&I]*S`X"#G,=7@,@1M^+>!V/\XXGL0Q5K?CEE..@^5ZJPNY:
MXY'!H'GHG7=V^=V`:VYZYUN+[GCKG;-V.F*ISYO#UHG;CGM>-]#0<UJ]]\Q=A
M\`X+3@/09?6.-/`T#,GXV+9912GT6]<'/6O3VQ"<]&5I7QW;8&E_UG7:XW;=W
MXCE0'A((QQN^'?OLEDI5_"KGF[[##=9P__RVVVR_GK;;4MM$Y["TP<!F9CN@"
MQG2W*-N]:6!D::#^E`1!)<7O24BR0>".A"<-5BF#=3O29C38L@&VC%TU`-IF^
M4@BTMAF)<6E[H=%L("48CJV&,_P/X]*B/=.%;S:`&R$-`=>](>[PAK*+H>R2%
MMRFKU,AP.?B>]J`H1>!%T8G#N^)RH'B6*=Z@5.JQ8A>SB!L?0;&,R;O??<X(@
M'+OES8F\>Z-L!-<W.$)Q.((C#'`4I\?<.*XKL_DC<'C71-FD\7N!_"(BXXC(,
M--9&<6#DS1=KDT;<](Z-?ORB)=.X&[_),9&?C.-PS!8]T6B/-(2Y'@A,29Q5+
MIJV5E='>7E*IO8W0$EHX,-OF5LG#76[*<+U#G.""^15@UB5]P,3;,/D6/@U*R
M+WSZD]X(%16#C,`-,#/H8#2K.;`^(O-0@,G;O`I9S$-UY9ODS!\YX_>]<FKQM
MF^_,WSOI-Q8(G@6>]Y3G/>.'&W'JKS.Y^R=>;MB5_M"P*S0`C_>X![WOC6>A7
M;%-H@:K9O8D^=*()A1YNK%<^Z?'055;)J/88TQ_B('*8@"$),%-JMR^V$9B`.
MI-Q?0%`#OQF&IC;=2`K=5YT:Z`U(-)U+IS:ZF:%*KT&=(FE1;4!2H<*GFD[M!
MC'LZ)=48SM)L1C*EE'()O<S$$HBTU-XJ\[>]D%6LK)<C5#C?U<J0#<RE;C5<W
MQC22/)+1U7"Q(8M<PZFXJPQ40.?LZSEY9]?<N:J=A,TG7N])V'[:M)^*N]%?H
MW:(1LV6S:F.[K-B8RAB7<?9KX4/.UP07@Y,=4*X%<YV`4JNW:C*-<JX-F=]*`
M"X+UR+4J-$1M;9/G6J;*-2Y>9-MNY9H9VPJHN,DS"5\$5X.S7,MPRKT*Y7S*2
M%[M15[J&.]XJ[=8I$'PQNZ@T7FIRE=WQ#@P^(<N7H$*&IQ06;85QD^V\F,JTC
M_)DH9.RZ;]+F.[/]$J<JHB'.6BI3N54RL2X$SJ6!7[?@OR'S<%R%,"''RT3"^
M18YPF@.PWWS9.02S;JQC\]W3%)K0T8;X>U0)\5DDMIZSI'@]N'EQV-B66=:H&
M)[.`F0Z.W\;4KN@8QH#C#I!+&SYSC3C$C"FMXYR;X=((F"^:P\WF'"?E#3/FY
M6)AS\BZOLF'*1(XRH]-R:"@'1,D`<VL1WAZ7@?F:Y+6R-<$93/)*W+[>]91R*
MR8%?=JM"G3W3E+MKJ7.W:&J\M30WNW$1=**'9^0^*X_0Y:4IY=XIQK&0T=)0Z
M9$P.LA@9O7ZQTU;LM)#?[#OH`:93T$-H]X3%ME6/KVW0:O78)->^&IDO;;1.0
MGM<.Y;[4Z,]]>R$4L&D*O/7]^@;O$S:R=5ILG0X/I(E$MG<5]Q]D`[,JU@X.-
MMOU6H$`*-&3^2AS3WJ7'N(+SM>-\4N/,R;1NJKN]5S2K[:J4UGB?5G^FM2>ZZ
M\<VT%>[/=:?T[D=)\]V`DU=[J0F.*@N^O8.W4N&R%+BIO3OJC1!GU@.&=5S4U
MU56)]Y#B!\LQ(>LR(M#5ML.U!9Z")^2XXJKNY"U/.8-9_K>2UWS#J;$Y[7Q[]
M../N<C\F!SIQZJ)2U`G(<0G/8\(U%\X\AC-RX>Q<.#=\SLZ=TY/?^Z4B_PK&G
M!ZM1ZVHLYA<U34=-ITVRQAD;95V571OYEP9NG[/;F6>CY_6N[MRM^W13.SSJ^
M@ANZ-F,NT("7PG%#5T?/T]]K[/>:<`_F@GQ)8-8E_YBQA;`U)#R-Y9V;/`]=M
MQ6XFPJYM%FDX9QJR])1$/7"`YWGRVL:2O`N]Z^E[E8K=CFGVNOW?]5>T=T4P;
M9+E?G@,-/T'<VV[NQR?^IHVO/W6'^TG/\R#3>+C!D`FY^M$/H?6I!SB)RDZB=
M=)-H5QI7H[@4KOR((^1>#-M$PY;*_6MQO_GU]L;"?1IQ4D=<Y#8B]O>[,?YN-
M9'YXQAI"USS`H5"RL6`3,EX\Y%>FY(`-:$O^$C9ZY5.LD0,3&$[V\CYH,2\EK
MIA$5\X'E)(+M=36_Y%,`-3"4,A8E>($E&$XO.%`^=1COPH'?%#;/98&5YU.#F
MH8)H5C$X"(2#`7Y!E&J?4TNU@WXVI(0SM&4[,VL(IDO*-&L41H6\-&NS-#R:F
M]6!;J#CMP8+NHVD_I6DV%75XQ5=X=4[JTTYK^%<9`88I%#'Y4U,.@T*(-X>(I
M9X<%)%>D848"TH>\HQ[#Y2IK\42N`ES`DS'91C*+6(C#(UF+"%R/&!=%YQ;63
M1AV`T6>8:!6'1AU;HXE!PXD5$XKGH0"YPAC&A8%.E$:`88BJN$9?U!5>M'QAW
M!$6RR!VY4D6F2$#J,1>Y@D:[6$:XR(M'=XK`H4VX<3D^8CEYMX=WYS!TYS","
M!GV\\QP7TSO01W@<,V<1PXW0F%V(-V>(QSR(QVAG4DW@M4"]<X[,<XZ,YCQS-
MYCS,XSR,5AWG,VC=@FCLHS=&5FK(EAKY^(_LXS?O<X]N9SQNQX_JQEWOEEWJ^
MQH_]93S]A6<]PX\`Q6@JE(Y>D8XAPX](,T)84X=C$Y(7,R$%XUFQA8X38C-M0
MDY(-:#-"%ELH"3,=E)(UR3$UJ3(=Y!+X8WD1DT#=Z)/?J$%W:'EY:)0+1)1#$
MF30BJ4'G:$#GV#VA2!4&!'TCY#--B94EJ94LQC@E,R$MHU`R)&0O%'UEB54B3
M1U!!II:E)98^]DI))E%)]D.1$7W!1&0WM#9%9&-%M#9*M)8T9&-B:6-896-QF
MU(>3UH?TUX<;MA<\=S\T!YGT!UR>1'*>5%QN5%R>1'!I1'!61'!QM!8*-W82?
M=W\7]T69<7%_TAE(\B>1`2>K^34KY'FM27M+\B<HUEZFEQ+SA6+VY6*Z&6.ZP
MV5GM!1I?PRX-@S7%R9HKM#2EQ3`V!C(Y!C(^EC+'63-?HS2YZ3&RR9U8DS^Q<
M`9MH)Y[$J0"^PYI")6+*:9[:A35%E6=8DYZ=E1>^LYWUV9WW^9WL"9SL*9SL&
M69YPAY[FZ3GK&:#X&6M(`G?S.:#VR6J\"7>^.:#\"7?^J:!?@V<]-6<]Q3P]=
MQ6A\QH]\YC=YIFPCRCRX56@TQ8^&)J*&QCR&QFB%*)$XI8\[U3MQ<6P&6%-MS
MEZ(.R:.SP6>*TUPTE5PK"G@S.AMUH:-(.J2'=Z2%5Z-/6HW!UHPFT:.'AHV2`
M!EU5T3Q:RCY]9VC,=:/,51=<NJ2.5GAPUZ2/,AN9T6=*&9]"N9YORIN9!Z<:-
MM*#2)Z<;Y)Z6%Z%U"B<:Y)]W>J$A]IIIHYY_$6*L>:AX:F18LVK8TT%]E$VS&
M5E#AHT76M!\.U4%@1*DULC7D0SO@8X5L@VNLP:4U<FJX=FJK=FJ]A%"ZI&J5=
M&E(\I$6U9JMI8ZO=`T:H]JG2(V1]$5(*):H*4B/8`ZD>A872I*S5!&O8U$O8M
M!*RG-JP%-4*%A!RS6DU"AJGT=TY6=$[#V$YID8N81J[REBOW5!;H6J[:USB_<
M^!;OVH'QNFF[J&G`LS,TQ3OXRFLDP6R&$XK*!K`3:#XE:#XK](5L4X*,46H^A
M-3YZ(R@1!K&\HR@1UD<:Y#BMJ#E=<6Q:Q+%21']GP;%=1'^XP;&,8;).-&F15
MP;&1<;'W9R$8ZUV3YHAL='2:)+,U"TF2F&DX>W]"5T=%![29.6W&Y%UN1G3/U
MYE7+M$K#E'!N-EXH59H/]VRS1$>'X4F'X8M[RG'DVAI=*QKK>A6;$;9<1;9Y4
M$:]3AK8-@K9:>V6;R1=9A#MT]!I9=(%NY()0-!A99(:Q"+>V.!96.Q9CNZ=15
MM(OM!!9=BTQA6TQ.&7F6AV8&]!H#]!H)M'B6-Q@#]'B7RQ=2F;66=QA5R;DC+
MF750B6F-*V\:=('4=X'7AS0*A:\=J$%KM;EQI4'@^KE,\[H+.;JYBY0:$3XE(
M`89O*DZ-^[N/.Q8#A#N5*[RD2+S-F[F""UUU][!6"5W0YS?.1!5ZD[TT9ALJ8
M0[WU57KTYC?KY3/2RS1!ZG83JW?6B[[MFU[OBS7BZ[ZC9WSU2Q6@9UJ*XR'PX
MZ[WVR[]*YK]403GZ%7LTF5W5(4Z]$W\B>DS\F,#<516%N\#"I(\3+&(7/(6]9
M@S?<A3<=5$-`PI:9JD,A#%$CO*G0XV*C=A8CS,(=!%)8,VH;)5$;]4,D)3A?+
MB%]AR#2\D\-&@VP]XX5`<ZBRTS8&N(1P!SAFD\1(/'Z0A$IQ6\%?Q(!0-%YU;
M*\6JF$I?E(5YJW]_"W;\%[C%1*Z%NQ^BN:T#IE!O=''[08G;NG%J3'2UBK1C8
M4T=8MA^IN:U*6\=>=:GA5<?Q-T+W<W[U)\CFUS9U1+R);#;BILAX@\AXP\A\6
M`VL.#(7=-VMX8ZUX`ZRF,ZQ\8ZU\@VM\`ZRM,ZR$8ZV$`VN$HTO?=T,#1I8`=
M>$/F)Y;FUTS'-)BN-"_2MGV$$GBZ_#N_3'Q`1!4(Z431"(M,7'3/48M8BLR`]
MQ%RZ.!M2U'>(9%UCU*5SA,TV&UU%!['DFW!]![70-5[D6[7GBV6S87'DYF+L1
MLF6WJ6!P>BC;*<_=2<_Z>2C\>2C^>2CE>2BOV5[PS)LUQ<X>N*`U):`U-<\?;
M*-`+G3_P"9N#MIXUU<^(VE[M^:"TZ50+2E77V2GVN9M+%:&=,J&A!R=)1:B=Z
M\L_F&29\2AT$31T&';SQO*>P2=,K1-/Y<WDUO<\*)-$\Z=/,:9[A*524M23=0
M(J#=8I]V]:!+C53AB2?=4J%%#=7):=+&R:=?%,I0Q#=I1#AQ1#A=C3A6M'Z0M
MM'ZL*-9_ZW[\%T?\IZX;=#N`G,MF?(5S_4MM+-=O%$MY7:L"6,<(MJO')*FA`
M`ZQU.:QU2<E/(X6`"<\JR=BP5C:SMC:@_#2PYI>D2F/&FMB7O:J:72.A$SX$9
MNE\UXD.83$2E?42^.CF1#3B])#N@+3N22C?A,]1JAZ=7G4%+W4%+/4)-K7;\3
M.2*".M5JI](C$M0^$G]"=EWD1X>,HU!Q<W[/G3:*DCL^LG[2S7^117*/2'2"I
M8YQ"9YR5V(?;+7.N@EQXU8=UU8?`LS1/Y%X]Z=[\`]\WED+.`U_.@T+.HU[3R
M.R^*0A5S6'<H=+V^#1R\;4F\W4F[.!QXDBN=,44,CD6[V!ELERM;8T84;D<75
MGLT97HQ,F7:YTK)K*].VE>&V14/3R98=<U!/\U'?TS&\\EPO;BW5P7'-HG`U0
MKBJX9"T:%BRB&2J/<W'UP9F0$CU`OCTV;N2U,DN^XE)8EE!)*E0\^2?F&;P[!
ME5!M2I],>;$)Y6O<D5"%B%0$E%L)19E3#EQEX>3#A>9/9.6U!>5]"!8)A=Y3H
MKMY3GG-@GG-GCJ^VE5".B>78EN<]/N6BF19L#G1LKE()A6U83HE8CF#@@>9-`
M'KS?Q>:1[IEU+G%;OEV7SG%\CNE8.>E8V>1>25[),>.[`BT^Q>,\VBQ5&A*&9
MMN2.F2PNY5OUL1%FQ"NYA>L^CENX@EL^7HC2,EPA`5S@TN;!0G*ROA>75!_*V
MSB@N96VU[EW,\NS/4AW++BR!%!)$]RRI:2VI^2P$ERX$5^VK1.ZBT2Q<Q>RYQ
MK.Z5$>WISN1G+F)<Y3L(1I_:51GGN4I=KEV%ZSNHE)ZH9.]0S)Y\\^COHW#W,
MB?`E=G&^D\;]J>F^X\;_"?$';^^*/O&&;F2(+F(L1^]ISO&$KEU[+O+QSI@$H
M7UOV7ATCK_(67UM(E6=3U/`?7X@A#USI27*/KEV_)O-5/FA2'O%!-?$_+XCB=
ME!RG+-0S3M36WN5B0>J02.B0R/0.GQQ>A52".&7)@4I6/UY0G8!8[_56/TM%2
MY8!6;TM6'X7F.1WEGO9>19]JC^]7[_:H1.A$W_7CY?96G/88EO:SY/:S1/>VQ
M)%09(QK)84MY_N]SGLN9CN^A^$N9WN_X.N^1C^5<W.G]3C(EE]0PURV^+M2%R
M>.:2M>:"&/.C3_=XSO>U!>=^E?FK/_:V[M36#N=B@>@)2/O*KOH6)_L;*M1\D
MUN5^M?.K_^@9PVL>S_#:9?Q]S)Y5?_+&#\[L:5[L:<Z^,TN[(ED8""G6?REN?
M0:_9=$R>TC!ZU?UHG4UX@QH7B!I3YQIHN!I7YQJ!I1?MU"6LECM_P5B0\H'MC
M#I\PKO^AHO^J$M'[3\K\OROS_RC#_PL-_2\T_#\T$RI6T&6`%#A(522@OY,1N
MD,:E\"L4$`.:KXR`.YB%(*HLD"(!:00/>($8A5\9@2$0#66$P1("O17V$U<AM
M$-2$0(`B`0&*I_B`YPX'A@H1.&4J(%_P@(,A69Q`&F=7SEUL,(+.156@'2,HR
M94(%[,(R&4'*",$J$P*OC!!T6S%0\V0$RK`#0\,-1(`SL/(`B2&4!66#!QPE*
M9?"[9`0)YP$EW!=<+B%P:V2[#\@;."!PV(%R4`+*P0O(&NJ@"+1Q?_#_<8Q=T
M46(&V/U3&810)]T_Q'((_59S`%R-4"-X"@!X*2):X4(._800]I-)J&D((66HK
MA)T&/""'3D,(0T,E!"BB4`3U/WJ3"-_"(XPKF-`5#AI8Z*BN'W*(2/=/U$#`J
MV14AQH*J>!_R)FHX0@?X2]K#!4J%NZ'_[88">`=SX>I9$\"A2T0/V?`9IN%WG
MH1-F,$X,$FU8>]3?'O&&?L1.-$-QZ!O`X35T*>$0'2H<]O<,5P/D@H:-`1O"J
M!C53&>1A87@S\U#.N#_5@`XYSE_(.G."U?A#R0$;MDQ!)(#P\/IA0X48:QAB<
M/[F'SF<?;I]_.'W@G^$!$A)N5\@TM@,DY*!&E(.^@A>1%R!Q943A3\MV)]%3-
M;$1FL1&=8&@PB7*0472X.DB*1N+62A9;BR4Z%YDH933BE0F)E`$GA@:<B&9P@
MXFO8$[3('R9%F=A.9*)B`1+]!"<Z%DC1TXH)201#5U$24L5.@Q,[#4L$*"Q1P
M>5'%=N($T]56[%U`HF=H1(#B$M%-1W2%!$2'044>1A7[BTSL+Z@A*+H&RB`-<
MAZ*6^(%Z@3+X!0)5#Y4+\.$,J04SF):V(*3^#FA@A*!AGW`&^\<ESHEPN%V/.
M$=.`AH?(&2929^PWG$$7@H:>D2C88I[0C-%%G&Q&Y/4902!H,#NA<:!PB<$P!
M&?1A971<M]',9,9X**2P2V14#='EN:S&-?,:<2-S$X['T5"$!D.!9OP$FDD4#
M1Y$SO(9`D0Q;X\49C00N-F9#[!@.F=LU+#RR(5"PP=-X>D"#A"L,,X68J06\8
MHQ:@3Y"X*?A++0"-]X@[T&/1>(\7J"W,E+NR(]X"D?"%<('>!(DW)&_*A-^"R
M$@>R1T!"*Y$@SY]:N#*?@;+`AN3$56Z$8)2/U05#/D`$Z1L5Y(9T3EB&07[(U
M<'(;6&!*Z"<#\LKPB/U8(5EDB<2--T4WOJ$-J5E224I`B#<BI:#'E+(BR:"!7
M#(=7;1UZ2-[`(:^C<Q*2?1`]]L$5^1J"1!*;(K-1YMQ&*/D<G@B7`$UT(>'X=
MA>S`=C*CM?F-1P=,;LE!AQB]RV2P=%S"^47):YC$R,MM7(?/(43&23^Q]#C#I
MC`L20HI->A7(X%5X1'?Y)5>R@J7)*Q0ED<EM+":9L7#]1D6I7!AE+8N-AK(W-
M7H[?J-H*Y9QX#JHQ.^B51*D8\<]D3#^?DEX92-LR*B.DR4.09N1&4"+]*,?4Q
M`ATSD$8RCZD%-*D@K^'2$)*B*4)2H@B9<")DLU,+,VY%)K#W"&!6I`1[CP/F-
M-@P8_;AQ=&4N4Y4+QD(^RX91#XT3H#1.BE)!7LN"MQZCY4UID88O0#Y+H%(M\
M&9A:B#_H$;D]2$\)+3?E]EN1QZ1+@+\(Z?U<)>)@E6C-0-(_;'D;\(9@&#]@:
MX2^,'Z3X/2:E%G$=?^&3Z86C]Q?,FEY8/X6A_03$M:87^`^/N"*;$F,6AO<3S
M$!$,C_`<BE+!V,A@92AI!Z+4(R$SC(4%C!DD_(]>V#@1<^-\S%;Y%V1EP@0Y$
M-]--THYU2#M"9,_<$WKD&NH1G:G.5J:UBYA$9S"FIL&H[("FLIN8WB5@-A$B!
M>46(9+""DE<S8IZ^OY!S:$3!'!,%$TR<A4GI>5S":!B;8.*8!,PP82B'B*)T%
MFVN3;^P)9T+_Z&:42&!>\Y+U"`DV)B28V`25>S-?FHBZ&7^B!+H<#<FH2)B?;
M*&%^V@)]48B/DT?`ATT9729EY?03\8<Q'L[BF"DK&6APF*"!8H;.>\D9^`]FP
ML)BCH4[VB#MY-G&FAQ".)F+*](B-,R?@@^P,$]<P3,!.@B,Y_UB/$$UK4S3-B
M3=%4.T73F,B5HX$2*4XS.1JX6_.4=L\SD/2(U!0P!]F<&&1X8CGP!?]P3_R#@
M^?">V],XC`7PZ3+"8TCQ#_W%/ZPL]<DT_`/0\`]H!GZ.S]S0/@U)^%0S!.(XU
M9$^0HB#$)[8RG_U3VOS/8#)`V0.&`"(O(GI8$_N)(^SG`FTE(<PW0`?EL,LHY
MZ,S8#&9P*F#0849!?\1[(%,'PE80B"T50K?4!MU2%2*"R(<(8A]4T0I5=M)!Z
MW-R8RA(^;\\,U3T'XO?DT%840]5-6-A3?J'Z!(G+$T2=2PR=&<6ACB0J&KH:.
M8FC=Z:%3H3!4'REZ,I)H:EB@$812H86ID!Y4D19=/M/#K$"'SQ!"PFA<Y!$$<
MA%)UI`GZ0U=$]@2C+10_)%'\T$4W0D81H]?!K4"'MA!"\B@!R2C59$78AR]DV
M'D2+]6A6T*$X%$+[D&>0!/B8"O*AD0[2@I$>J(86M:08=`4UT!7T/[W&)BT8=
M\B&'88@<%DKC12:-%Q5"M"Q1JN%(66DH/1.A=$@,TB<12D]&)3T9@Q0520?1@
MHF,0:<>`*IQHES8X81H^'>`HK7"[-'Y6$]RQ2UG#*"5`S;289J)=FE)VJ2Q*)
MIM`!FZ;2*QI-142\D!#L(7N&B04Z3L4I?CB@F<(_>(<#*AZXIW78$'L4GIH'7
M#]$?,@0@-1'7`4;$4WV:3^/&#/6GQ8&:R(?^=B"B2?DT/?*!?QV(T)-04\M["
MT*7Z]&%,!UN''2R.@TBHUDXZ)#$MNE$KQ'/HGQ_5HU[1"J%'7H02[:(Z(CW0[
MCD,:K%Y$2Y4/*U4^\,_\R3Y":*#9H(&F0@A0`I%H%FJ@D1")1D9X*?!Y:,1G:
ME3*??68^L`_]0*9&**31GD45AH708^(^$4=5?1[:4WY-AS.1'N)+5\4/RB&:H
M:-'L)2&\@SAE#@UUC#Y4Z#!0ST1`E:4.(L5DB"5Z7U1$%,4..J(XD,P#03*5#
M@\GTJW]/.@Q-E;I^^*H$TJA)4*-*F4C:!#7JE8FD5X:17DBVP04UJ@+\H<,!Q
MC8Y'_`(<-"L<3"_1\(?^H!_:)'^HC\1*L@&-'H8@X952ZP_-.D/4N?!5TS);[
MVXU@32U\-;7X5=(E6+..?8@UHN'SB"[IHGF(:V,06Y4'N8(@P1H*_4/3\0_G&
M)(0JAM[Z#&M/9Q6LCP2[;D/C&DBX*TP=#GKU/`K6ERA8\V!YO:[B,SS*3VJXA
M7GF#_62O[]6]OIF+(T%=:VJMKNJ00*Q6\)EVZFMN\:_V8;Y24%DD4V51@(@I*
MU%4]_%9=9%W72(-5*0_6KW81O7K-A&LVDRV@$</*%\[:D7YH"\&LE8>S?AX/@
M"V5([(;L<"$2Q>X)%#LG4*P4G8ZF-4."FQ([8\76#ST,`1.U"L>?!BA_FFJ4"
M:3T6H+18-(-&<4>+/8:D%0S56$3)BY@LV6FC8,@KR-BME6.93))=(\#G`,58Q
M+`N[(.P'^J]?EI%6,\1J1QYI+3*S;"=AK2+%:LS8K(.-:%[6DC@'5*1(45%ZF
M<%1>%I$H4D1R9VN#(JT-?18.JMER.&B_"]O8#1@"ST92-$A9MVMW(;1'C+X>=
M,?(242"AF2U<;`,5:E2YY5A[UZ&UK8U6WH3:RW$?G`@&K2&V98Z86G7J1$0$N
M2'P/?5"<MJ(.T8KT`X%]#[<(UQXC5JM@>>T3R:II]JET5V&;4"5<AY"#I[8/+
MBHB44B(`"3K]AL"V16Q7VJ-PE.IQ96G!U8AP%?7P#A5L:?"V:P;<II(PXKC(%
MK9DIM>=6AU0&:_M+>I'?,K?(!-Z>6AJD:U&@JKT*$@)W'%L`"6[U2K\M#NL#3
MO@9<]\J!NFO!C:0Z4J/R2.GP`>E5:;F/#/<B15Q/*UP>8&D!@Q<WN;H6?,MP`
M.R'#)84,E],^)]8X<D%@:7DZ#)=$,EQZ6UK.B7+`@1@"!\H''F@?>&!Q&((W`
MUY+D7/2Z<:MMS[VYF77B9L.,"U_I8(6@@S.W#];<E')T4TK-!23VP:Y<$JQ!=
M>KA&:+6Z19<`I8<_>"!.H!DYN676Z]Y<EK)RG4C,O;4M%\*EW6SV;_#$O]D,5
M;X2]*("X>UK(B=MM)^#AG;A=Y\(=OD[?59%SM[G6$8W@=@'*@L.Q<S?K@`4MD
M\ES`")9QO.-*Z9JB)&F*G&[E?8:%Q-H4$O*B12X)X\V[M0'NRM:Y*P#G+D*TK
MH8WW-2S>34)ZG^$G*0N?)"W(4,X[6B-(-U0C*@7WKMY=6TB>2._MN[JH\X)>P
M"!=)AN\6B239,R3]FM(2HSHN3=FZP*7KJKR;BUN`KLO[N,8NX_H6[7MS"4[7)
MI7-MR;MT76SS<H$GPQ6>SA?HE!9*A$%=R]05+D>GM!"=Y$L]I4.H.Q"A[N6:R
M.H8[XY(O@.FZ&<?Y3AGYNTKH;P$.N0=XY`Y@LC=QQ4G&+1S,=^VM7PDL7-JM[
M<,&T;R_F[LD&C+ATRMG2*;"WI^2%*R)L=@XN4G;@(6AV8/%KBG)?XF7!57/Q=
MXA9<).=V#NSM?)!)72$8Q(5@%ESR$YD+SM(%J^^R,]55PHF\("=HCBMEAXML+
MR0INO/OWBC3>,V9ZC585_BY`2_;2L6`%MKAE7YV\:Z]GXB(+<WG!UBQ15X%U3
ML%[>PM5$*D,;'E>VI*O.'^QPR+!#)9L.\;([2&`AM6V52[MME`6U6=+A*S0="
M'B4>UG=VN()-!Z^2:*F?PDW`<;*@SK@*P8<QJ!_.GM3EN1QB35QX!K`!HK2?N
MV#F@8(WJ@J=#[-/#:59(J=\\:8FW#7F(FJ\X%5.BL.H\V89C4J2V+J!^N5?\?
M=:G+]O7%`97D!-0.I8<OUG3H?>&AMAP(\"<?P%_4S632@5]&8W\9C<5>-#9[!
MN[3_9N-5DDDG<33^:]^8$(._91S8IG$NBT\+!AV/6VRYC%%)U)U[T9A;8@VY8
M&8VIV*-"Q/<8TRZ-8H(UN-C#]93_&`)?O:TKC[U>S+TJT?B516.8N9#Q\?9;F
MQH:X8<1?B9P]P9MR`&\5HE9BB%NYD7]E#(/%'WGJ`I7X.Y(KLF**Q]=W'F=?;
M!?E?67+4S3D5N6M6X]I2D?O<3)XB'_D7([ZM"F(X'GOR+C^94FF71-5=C)I;/
M-4]PU0`1Y>'PDQ^&B'$9[4FH#-/V=.8^T4IS(E,NF'[9M*>5NPA7[AAP5JAMP
MSUEH\("#>4J?0T2(L`_HD4W%"JPQRR"LCIEE$O:O@NE3&2'KDZ5-$[@L!]FRP
M2GH--X2+LF4<820RR)-0'%6BKT!2O')7[XMEF0J/>4F@%R.VF(=(HA(KDGDOH
M<!0Y6I?'@ZU8-=IAUKQ3(^$>2'.N@@Z4(T%TYMDBF$$*COBFY@DZ5`PV*BG"=
M@EKE%I!"K<8+J*9!YT5OUA%I8RJTC<5L(^"N<+:_1P(Y\R:OQ"440)5H$%5"A
M/O3FD^$7DG/!2!8.(S<G*.D1FW6,5/'-WADK5X^Q$4Q/E2GBSJ\)/'>0KV$X\
MV'-GL<WH:&%IY]D\F\,'"%`H5D$O"&;X>"E4,U#!5O]9)K+5$(B:L5]HOBP`_
M>F94POUL(S;F8@8J2()`,HJ"P2AFQB2\J_LQ,7#G&*DJ$`F!CL^UP4#'YY)E)
M&M"1AZR&&[H/ZN>`N)9ORO5<RX+H@0KF!+1`-3-?9:.%AU+EZ-D4F@4%MHH;%
M0MD[Y+F:FI6O0YZQ'GDFHR1IV1=/UP>E>A_6!$I#->_PZ+P#G/,.;D\P'VGA:
MQT:/-'TZ#H_N.##IZ6%DK$F9#HE-FCDHP41JH$L-(=V![./[Q6D(J&>^$*JA,
H,T,Z325INC=4\=&0]GU`&3XQ:25C9.C3>VX8;4)'&(K%K"";<Z/."V>^&
``
end
size 9805