From eebaffdfce91e230e923094b45ab2e499d44617c Mon Sep 17 00:00:00 2001 From: Sanaz Taheri Boshrooyeh <35961250+staheri14@users.noreply.github.com> Date: Thu, 4 Aug 2022 16:35:16 -0700 Subject: [PATCH] chore(Rln-relay): Tutorial on how to run rln-chat2 in on-chain mode (#1044) * initial draft of the tutorial * WIP: explaining test scenarios * revises the intro * sample text output and further instructions and refinement * renames the prerequisite file * adds a link to the prerequisite tutorial * explains how to reuse rln credentials * adds more revisions on the variable names * fixes the file name * revises the intro * minor rewording * adds a section header * makes the waku-rln-relay name consistent in case * fixes the contract address * revises the description * renames client in the sample test * proof read and spell check * disambiguates ethereum and goerli accounts * reorganizes the text * adds image folder * adds fig caption and some description * fixes a wrong case * removes commented parts * revises the overview * more clarification on the spam protection * addresses editorial comments * fixes the contract address * fixes a typo --- .../imgs/rln-relay-chat2-overview.png | Bin 0 -> 69040 bytes docs/tutorial/onchain-rln-relay-chat2.md | 242 ++++++++++++++++++ ...-running-on-chain-spam-protected-chat2.md} | 0 3 files changed, 242 insertions(+) create mode 100644 docs/tutorial/imgs/rln-relay-chat2-overview.png create mode 100644 docs/tutorial/onchain-rln-relay-chat2.md rename docs/tutorial/{Pre-requisites of running a Waku node.md => pre-requisites-of-running-on-chain-spam-protected-chat2.md} (100%) diff --git a/docs/tutorial/imgs/rln-relay-chat2-overview.png b/docs/tutorial/imgs/rln-relay-chat2-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..5208963ce2b8635b627a6949bb3d82738aeed5ee GIT binary patch literal 69040 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

HF62%cJq8S+>$RMado){ zOmhCP5@X3o-z7@@2|U;YM% zgEc(aneUS#rKgdU6wMF&_#69;<3*$L8+l@Cn4ErMM$jg*G>#OT;LN2d1?xu6j}ZEs z;6a?sK|^bxVW+^~LO2gDcJGufgYLJ{7)!Ia^){?zk2$!+s)bfMyQ6mC37|PqAzZNa zsM=Y|nGOXEcXFQQ+W%C5H&>bzwyNiRdrNWHzJQt4FRY7u_2IFwTz)kVGPBI1kwcl0 zevDyBBeHb}FZUX46aUrpW9u=g=WKV_NVr%Zwp6KwDNmZkgG8RptNf?1KC^?wq*OVb zDFJC(*pZ-C6o4C3$VVB!luR;CN2lS)ukeKQhv~8$x9eQ7 z|4&zQCAsFQziryQwSJ|_?Nur)ToQ!0__42 z*`$QKkjHrj8#E)ml{m~ymOCZSH`Y(pEIy3dXG|>ddP50DM8T9{F0Z5GzqWiqM-xzv z3$ZhF`;;5^1{XLa&HLZ@Hg$hFmM^Lq_GVqDHyHZ z2kbwOYAzGn>;CE#S#Zx_CyQfzCyNCNTNNav5^xfEwp_=8=R@6iq`DW zIt&eK+aw~eZ;@x)@NEBb^{p!U+fMX1lRaX2wn-(w0^$_oT-O20@>k;~WP}&#*E#_& z4~?anqS&O2s&a>>w(j<^?Qm%Y}npfZAO&;8y_9+$GSiFN5Dr+{3cjS8ig8wyL zxbUPjppTe7`qzd&4UC(}DNs?R5+YAEG1HxA6JFNvrzuG$C$42*LF4lcBv3cKBWqOo zw>lJWky5VD!YpoEETKneBz>2^_i3K8p*)U*)`BO+<~P70Ij(fkgMW0gVMBD+<+zndr{_P(x|7(+ytRadYV3g)i0;TdSh40Eyii_ z?{}XrHts%9kc~ZiF+rNW@r&tIpY~IWyLb05rm92)M)+4wRGW(9K1Tq2=u`y_13gs~ zfqgNtc+xM?0(}^V#3m-kfCf?TQvKp)aiI2KH+f5~I8cq}YicoaJyS-P4ZGD}Exf__ z<50o8xV61W960B&mqYv}SJf39x>g6zuQa!Mu`}OIE+YVj+Mg5csuf+OAm#5i1MJ5{ zU9JQx?gJ(8O;hP2<=fi&nSRWo0=9s1E|)T{SfP7C&k9hHiPtgG>)yW)s|2Rjs1a~M zDV!mww$V{MS;72!U2Lq&r!a|x+#n^!JF zwVg&UxMpuWdD|{c*SV<{UE@knr%l`p3~%5ASgKpuj*)l7?}ltZ)*N-no-*B1-`=Bu zHh3&N-T2zE?g@_=>$#Xm8w%2|GFSREBT0U49o%yI8}Z#>FF5G0(;tEWXk#mj!U@Rd|Ab17I7I6f7*czdsKQo( z(k;+jVT_veNJM6feywMK|4{82=EWlp`Q!`zj^uvHc#b=yA|Jzj?k;epQ_&A@D;yP4TI*ZqbWbq>z9^Tp=>(eFGajBFzIR8+$iZ7ZT1+gYujS0XZ!B0hKbjpOdNBLH*Z;-M_1HRL5#2D)S(Wr)vu7 zouux%f_8t27_+&j-1woyEf0dF2> zAVb0wzDdb$I!vyAKC8X7v|DDHJUtGS$O(=CjYDcz{r+ddt5UrnE_Eh8v-)bHW zYdlyZ(^&$7cnwTtBh)L}7M#OG1nRvQN@a)`JJ^X<5~=%=pYb|iRY zzel9FQ^)h9AE9!AVD7(fZFTp$1wHTY4Mni^L34P;jHak=VE_Y0uesL|Me0%pVIL& z$+JZbdbi$W7r)(EHlF=`cWv9&js8{7Cy=EfH{wx_zFYcg!fQG<2A5*DToMMBKWE%( zLLhHsZ?d3HSeQH`RC8O{myzBubE*gcA=j2ty1U+6B@nRzyxM*G#g<3&Q8vil&j!f} zMt345AT(UHlxRfNd#krFv$ysd4%jM=Xu}Q<&c;MJf408+s4d_&=^K~2Zt^aQAX;_NSOw=S7R{78^Z~2bHPu7 zvbiT8pGM9K$9!s)`S8tREx7SNG2_RKYaoAQR@s#VHGI`5#Ytt1&QAXGd*OM6)g8S7go3SgOlk|O7HtpKVCNfL7a>#;kN%`heAt1&?ne4HY00gRXMbkU55lOM9$f%`U z-;z5jxE{XI6#E3sqe^=%U!J=)i#`1x0|e`n-?^B#GJC$5tLi?mqM<4&(*_Outx>N$ zxNsas7$2HbKg_STZUOW}W<|@30spmjLZbdyQ_dyXMm1F_@1Z_nfYEGAb@}IBdW$5F z_^ecNWqv!kaBSYP1-0ku)sLufQ11)*ED@E(&e<+jdyAjSquJeER#! z``cy4+h3~T@26kj68L$8bqhm=cK10r5eQ^T7aWbes|L^)j%Y3cl~$HBtX5HvKFfPQ z6E-t~eS{3E8fr`mQ~N}l9I zM7^S+XO7g!;r#bToi}@@V^E~&@TRHeVT<*sMv_IkzFvcVGMDYZ=vB? z)h=Z|i3D4*rS5-mh6xTHXEfzTYhsqF%N~kD_IK%G!-jXm&+cauUONq6n_JEqoSdP7 zLET4eW>fqq*CEU7JF94|V6V;#<*Qp&Z({u#_`?e6l63TpkfZtjp9{YI-t?l3*^K*4 zL|tDkLL@FIURE(5YCAMk!`=W-Cmo995a$@`kJ^z`26rz$}ky5^?SqjSbj zc7f2B06-eRrd5n5ekJlLV?eR+u?vYPTvzQIHd6Sec_~CZK)iCv9G(K`g#I}>Hqy6X z2}v6b_NIi$NfyM8nqGa1r-9^8+`Qd;x%B?ehv@RTO(EycY#TAXcQxKN0@AW&%zD;P zrd7LMtJZDuHeK~i)|jX&iCaB$p+9EW&xdN=7Knd3hkV!qm{@U&2=7lnKbkae3NnlS zj9C^VXsL`H%%=B%J)LmUBux)-vvt`A!a#*{ zQFLVT0b_cma)kU~?30II-u_(leUp@n@}}gY;iGF}!LX+?CLBSC2sBdw{(oL7+jA<$ z-oSkfps3699{H@Rssp(TOsN8HuCMsYHll9>o)$kZ0rgF?UPA|N-;1}{3t+sw@|;j_ zQQK0(m#ZnNQ$7~;R@(shO{POFCSU8#5_U58v`i8(s8*WYC;32dFrT6#>#v>GPFW%j zbBBa(fM$d=B$Fr5){WPjG8|PEE}Po~xs`rP_zA>Mffjvc8*w}qwURDuT3<|qSVoVW znf7u49cj^n%A+qkB~C0;aEYOdVd1?@AmkcQ_<~8d{suv*Qaa`dYM~G5RfSDf^|Q@L z8Qw-w_>unQiz2JWL)I&5$!Ck-t@je1GmZ+%a{1l1f zjVE&l&@7yQ08Jzi`-YPC=A&6$YsWfQq$e8?{+E=gwT2Sq_Pfe3jo(U$w@>8&czUd5 z^?JEjp)8zDMy5xww_&;kh1Gi^a#0U>F+yk+zE?vkM;QL%V;+3vTC3K@5jb1aUsqL_ zx`5QLu;aM!MCH0)9I~+3LwVBoCw6104eX~7{gcq$oPR6GJJ31Y=TnxO&B5=z4+?Rn z>a&=e3ETFlKiQd6l}4ZUlt^3H(MMa&)9?nJpsP-d72Eg2Q!c-%|3Y-R!O`C4E*Dzg z)oh7^Na|wSRGqg>*Z69Bi^S}BJl?fd;2E*oy^i_@y1(v0VxP+^kucs?Hw!|=JBj$D z`7OPMPq2u_O$&p_Sf_fG60B-~0E>t7P#QWSYI3j^f?#MDgPZYTY7Ez3x@5lZMLhW( z&xzG0vO|6A=#=$ou=t{ZH4ETi^#Bsd+V1Y?h_rRWnaPZC0#5w z@xyjN{qsKYyk0!bk+GYVgP<2-h z-$+Tn_I)I$Gii7r!1yNMe=RsQ^bW}fa#m$RmKXbl0@}d+3)p5BMVwu+47x@Wt5HtW z_vH9xg8Ud=yPmCV%U3+9ex>0}TS8Fkusl|aupjG;i?4pJtq_xVbFCnE^;eiDJkP_zSAM1S(%B8 zB^Go@FXOpg@ePY*xLaq$sPJnP6`z!0FoVc!OPeS$P9MvMh{>shFLwV`kLpI%5C4OT zx;|k;mt+cG{`S3`5YN=$^XQs=)=yTogc|}gOjTBHm3t}G+~R*U{-R+g;-u#mF*WGl z^^(04U0$rAtPS-^$`IB(f2FrB+v}*z-lbJe)VnL;_Zp3J-mjw$4d>IL{I)U5m3Lx#qe{HW$v13_ER&jYk5`(L_|c zgqd+D#XI2lH@6PD65dUXIz<^+6hIKU4E8#Q1Q8ev8Yp(=HtQR{`Qdrvg-)-2Jo^Ah zQ*6yg;^Os_A^Vtds7FFmvS;d3Y7Ql5L$J1kc{B^mmk%i*;(A^7-_5)p$F9my%(pq% zB`t|R3zBb4OaRq^5bwvEv7~>Yo9Meb&!Jkgg-XSR>sox*t z(|E$F?li4O#_59ghua2SpPIfC{>@diOh>XRp;k?wUiSB}8 z(Ca;66k{(IrG(`hAX}X5?besK?C7h(z9OTh+LnJCvO};ikDOtc!Y>ggFo<@hKy;_4 z40DGbsk6+Rey;D3S#F2XQ%T&F7Jfn*!Y)>dcCch_cR~6^dU5kkbFZ^r{{=|6+ZE|z zZK-DR(i5APQ3_yt$>ZGEqmHbvPc1Iq2JhZE+~u4APk^5V;~OqI=U&_mJeoB!ELIWa z2~e+;BA6-Z~@RQ5qH}6X!l3P+uh0mizK6$QZwJqFviMN4Ik@z`3Y{%8a zTV~~hH^*EuTlCq_G~n*nRIbd7;YJ2BMm`S01HD{sH2p>&^LCd1e5|gIKbqC*a~6xP z#nrULe+V+Tj0J95dSAlswTgGsZwQ>^;Ja_$EybQp-yDA3u55dWFzg5Hga)xmqSMs1 zKd8GaTNyLfVH+@;CXMaZuL1P)GkS~g%>7zp8VNt9cMEv51u%>M97{OZwPT}5l{!lt4I zMW{11lvzG-?)6QPe0B1xcNVXrTsDBhkBsxeM=bq;#FuYDHlZXY31>N$pV9gzBjQx> zgzmiRBF(gT$ndsXisp!T)9NKC*KVxwGJGs+ig=PhXXoSt<-|&(OP|{x`$AFE?_s>j?6W_52w8HIGICxtrX+_d4!z@S zmnzC-W{=5FUa~A9NS^-es4n-%hw38kew_v&@p-7l)_V`e{Sg`%nbY&i10kvna^{`4q{%To3zN${O4ISWd6Ld+Vjkr~S&MumW&xI5yA zz!`e99`4@N_lI08gz3=zI;E9y0N^y@C!zE0yy+MS|I;x4{{F!z#IKLLLs-{8Ex$iR zlt|+EN#OB1D&3b^iWEK%q$>V8+ev`^r{ZT>*S|iRN*Y+~^r3b5n>;B6r!%L)ESfoC z?@0CU$_K}?xv1;i_A~t0n>{5B+3GE|mO$=3O_yiK&xO?vixH%srCIamU!rMyCrTZe zlr3MZ-Jifd)kFa$DT0lnRM9jD+L6*J(7QjDze%P=b~GjImq$0kiMqZmTt{mP>Luz; zb08w{eN5pdPG+vi+s3V3zsZu}oLi!{>sY@FHAkw)0r93*O&bH@^{vK5Bz&sBH=etD zM}Ja2HLT68X$WG?)v*M7i|6U;f(N0IWS!NxkIQdia_{a@nd`Rv*7bv|%M)4g1!!(@ ztJ5EkXl+ox4`-ITgp32nSb9xbzPPhG({154eQuB6ZrV?wM8r|7ts~bcc?#wq{Bn=U z=c596Hz?bDkKWl(F{hD}v>3ddeYG+3jrzk6bpzlx+$dM!y_H9pAIalS`S*}u?QOzwfY=qGv7zD|vkX0i!$IU%8t+r

k`m6Af|HOxp9T|QrKg>%A4q4-c;6s)r@%#E`lQ}FY zQKUsT^+u~a9h`B%v8LAVW+Zh0M!lq2wNZZ=VoCdw=9rPs!@HH?7sQ@*Ao$Ol(5R4x zG{CoN&xfQ$dW65neFAKQRO`KZnXoX|#Qrj~qYs~jvrf59bWiuE46#}znBW)EC3tGR zzi@o+`GJyG%b#FXlDJkfh`T}<@Mz~G>CjKdsd5jeLgF00nez~I2v1h=2?#XWH@XCP zlUWG`z=}SC$juoRUYgmIQ0D?w9T|Etcag!erniZ=L-^``k-*-e{pi6B${;Qsy<%a8fGs-*lEk}DezT~iMrx&war14ERI_df`R10|-ACWxSWdt56yw;1ZI=GY!SEnNq*;`gZjsMz@SeTWC}YAd&7TxeroiCL&|L?rp@~779cW;l^&EWiRk584;Oj zMGToeHQ;^M2jud+cYk+h*=4Kmg(yO%ya~&o$?WdZJ{IMR*ihsETCW^pPAtN+cs6O$ zBpC*C=f*o;^OSz#1cAO^YwJObIRm95TScpEW#0bf7F#+SZvDm8Fx!^FJJ|~E_t;O} z_@NyshdZ5S_F#U5x_p5soOGv4;ngm7c(^dQ@PSydPx3Q44J8AQ$l6$9W_)d8K(?7K zoQ%sd$qz7@$-iT2f4q-{*$6kWj68CW;I(7oG#4w>>8l-v(y^$1wq;s4Kc2KUkdf21 z|G2Jmc}qZp?=@gwOehVNghnFi@u0!^jg1Yx0)Yx+hVS>I>L43*g}j2~nJ6#f)nxCt z&hNS}etA}JPilE2{1^4*ED=JQo|fiC15W^V)?C#%mdIFG*_wL z0Z0XK-YK);(xTJl?`_q`zj;2ywzRyN-^u?Ll3XyJ-pM0r3tV9cAvB2wHGX6CigN?M zs?k3$A7*Y)S_a7g!x}=YXnQfbjW%>B=D8_;L>gj^TL#M3CWadr+IMFC;Ofy3lIRXxo*&roV+E; z=`%@)IU^e5rPIxhhXBRUn5`1)^SjAV-g?VAOpY{ck%7dmU%z;nI3duROmsxalqWo^ zDsw}Ms4r8cx1- z3c4voJqoyuBwejin_T~YUI5*M#$h_g!?bmzw*4-SS6rjj+JAW?q2DLb-0%J7TfmR0 zl?QBPpgW%hl*^pe!nC>7Ow}qX?+XzGoHhq}^bzVhJT@JMn?YKFP-}Fw>=z82EOaB~ zi3k@rad$7&as?L;DuXkL|J9zTCD~=ISy0-~By)i&Z6Z`vf;w@ctx0u3=oirKCybUH z<(v5_ng?uu%{htRS1hUhAo*_SvZg&!?xUmqFt$5(PiJKjuui=7udO%zQk(V#M&?Nk z_y#Ke{hIJ^5+KTxRl}L-XW23&Y$#Ent?OIz3id-N`FUrjy4G#|z)xj}UJ>`g&1$ITL2uCk$Zic%zSIy30NY3J6?P8X{1xW5ZG{pY(Pk zw|TK*>QYBW2=8()ICKv9uwk_jPGxg8bF&NQW74%avRl5CNYz2yDK63&%QPF~uQ+AdDKD-c+lS8Mem&0F@*H-kaz2<&K`7l?P`ksBQ_5e@@GKqhH9t%-_ZwUG*1!-swRi#)k%BSaZD3YY|QvmlQanQz_d zYzhL9W}KQ~!*rY|r{|uzpawm@l61{OA;v|9~Ta5(IF3@gO>_qy5s<1+~?YQs2!Qa_b%9UgKGNi5i87nvhOW*xd$XHBfUC|tYrE}M{%J1gFteY zPt_qj!-!mxzCs_eAW)npfkkk{cl32nRF0Di;4@dWp#}H>HgJBM1U`04kn_&34T z!91V$n>~|c&x!W!8Wa)YPJ4PODp zx|GYbe^2mxyqYH+tk>BGU)nb67gyaDK@NPxIYwS)Wa?Ddbg0EgSv+=$Y?Qk#S8OY!=Q2C)m zJnCIgO6+xDl|xE(BCWf{H+uxq8=(r+z$0rS9#MfC#Es`^vdLI@$>z8PtoOO!Z;G8` zM!sy>m)2xcokAKy2gWxxLkBq@ z1mJho6J<>-6M>$WCil%EXS>0|u!?;-o9ZAD$ak z>8rebXz6l(MVce!RznueFv6>b;i$d0ymj9?poOUkVLoV^NWw!U++<|Ma3XELYD6s6 z66odvcT?&R%Oz)!U*3R|kjm}AW$29=O?3^q244$lpe(`kdGTbR5;=au8hBHN-0TGR zFP!IN3axw}H4=430w@91L7e6f^~PKjt5}zgDj!q!_E0*Rv*!P>^p#<8HBHmV;<~uI zyE_T)?g4^_8+Uhi*WezU;7(XvgNHzH_uvHQJ3Qa}n`_y#b7rQiyQ{1AgS0>t;o`iT z+-#&8OejY&HOQqQTAl;tTNws+$H^&>A;MTcLiZy)Xd(d<5(*LA4a*;wK|ifrivis# z^!#SFldu(V5MRTQ%Fkf6UC8&GgqxfTUyr&r)!%H_n-6&lw|T}#=idw^aO4JFo` zVo>_AaFTw4J^@-#QV6WDAV%Z_ON)ReKjL7=^OI()aH#_H!Mz zv*bXZuC_3z<<(3=#WJAy6(($I;wLvC+l~^RuI7g|1ix{<{VUQk{%Dxrs8j3Tk9P3` zJniA`9>R2&BaPz!ev>fZqL==+kKM*wfKKQ)f(*#)tX)`jo$)-jP0j|3 z%0COf$}QuN#m!V>qA%3p%~wj}KD#SSq?o->MHsH!gbS{W{9JlmfVARL4O~z*vwiya zPVMZzn7w13u37sbFK_lGFmTDIR#Wa4-b36SMHi{~<)|-Q!o3O}TuSmNU!qjzWh0_K zOEwfL>cvaFoXcnqWzs{eB<2v_kyjkNs>tOappw}MSQOG=?9|pW;!P<9#Q9^QW_7I%gUHl`H=jPv>MUE69WXfIvC9HY}Xp}nHLR^A5 z&48g80adv^WIL)|2CDAVpGNj&r+w|>^$403!K_)76wOG}r5c!_ooHT$W{D6K+@5gf zHhB0Hxhio(%Enli{UAz#tnKeHKf`-S6p>v*7t(@Eo@qGRH@Tr{XF@&t^oaV~^|bjz zvp>mkTZ~7*3oSo!_HD`)jT`Fq!VrWkg#1G~CR}BoITVA(-s%hvLBIw7Ek5tQMt@)$ z!w+wUc4^qxQ=gT@Md#sc&*UPxoS;)0_3U);pH0dJJd=W-Ly9B6+4~)(l9tJZ=Igss zB#|ru-VwtM%orpewyNbxSFW_n5Hp#^?9Hya>MZ(8X9||r} zU*0q$IkH5FbD%sTxzN0G)ilGM$4-|Ku~%uSB0BSd;wyeM=s#7tVsdE|9_~R)Wh7f` zM2cT#)&?hb^&lXoNdx{a3ws%>>4D?cC)+htOADdD`W>dH!DPc` z8=T2~`Z(ASYDMhFU@4wt$|`Ys9VRJ;`YbhX@1q;ve^|XI1EM^YVcll3>=YnDOk(VZ z$-=vVa)%lc0Y zsgZ@~5eCsizKZ3nw6rkl@(S$3=Kj?E^%P6Ah^|b(ia-|hh?euW;COZ8k0qoOf`ZIVVl{;YBZTBZQSn=^l(gUj| z_=%pfB#LOam_jn5fhA3qPQrm=7H$~7zyyVi#;aj-7%XygpPO>UAnBK&MGdG6F(aUp zOi52WpWprj1jIXy>E}jy5n!f+0Y-(Vs{WhYhEAT}=iw-)e*lT^M(_`$NpAX32w~Jn zT<&PM$fLyEPDaSmTFzP9~3`zu@3m!5ryuHsX3cmt&-|# zJX7K=$j4F6s;IH*VDC7hrzwcC_{Pq`M2b!wz83C_HThhsqFY^0p4uDyYfqzQsK76Y zo+klZt&LwYeD3vL&ocQR+Xgb{&83DaP80*&DpjXCAOp5^F} zc^gbLoI3!D>?3D=K0rtR!r25U=%2Iyxt1%?2~cp7y`s4zV|4{>@Sn2-M6h*?Df=%TFm zs))GD8U(UK@h4<${OxPr07fd(su1&czW3rA$y{8&Y%?fuvMdtQ{3wpO*56dCVTg^N zJbhk$eyd{Z7!8S;#bp{o_`UeyAkzP1&CAJk z4536$buV_hD80o&6>4$+h50#z&cGFdiw+ucp23yijr%B&I2AgD0#w zilzQzwZFg<7YBz_BzF(Ptb0)K{+NzEpnGTRU)u-&|Aaq2taiv1?ds=?csHtV7FJ<< zV^q#=Ql)Ufm(1a6bI>V$#T>SEv$fXzATM~HcC7!$Db|`u07tMePeu|LQziV#Ih*`% zeN~W}Iq-Fk^cS;kjSl1Rdhf9|)6|o-tc=I2D8GA50@D}Vke*wNu1ar1C7OKC_rdkR zr?WOqS(}%~TQ2JV+!AiJAQ~VR;~%*;+M+%;CjZj))o}beFNcX4H3b2(6@-h6i$O>_ zUbz%6#$S^RrU~X3du5oQ{U4sbCdZ8*fY797;}t-Kf?WZ6=VG5Cb&b5kT{6=;ic78)rJc_o^bNZ_qKb`6P$CCpD z6U@OAMWPyXHgkyp@1lZE!~10*+g~{6TNYgnGB{Orbc=MzICFdrz`& z5AjOK^T$KIyXA(sA-bKckUx@8Z!u^4rvBez$GU zkKb3?1oxcgdf%+(x!tx?D#^ba6y&xt?tTBBS>Am$`^RK|DZ0D=$>H61NIH#<)rTy6;NjlF7qo+~DKmVM*0Kjl{rF zc|pMah3N^?Qf;!y44T@VH9$9m>ISH4ZgVCw-|!~i<(^~km@Szld_d(mTkm@BaKj4a z&MYv{ILLiCQ;=SSBUva0Wfg5ibrpb+#Xk3`&EYc*#~&+ay-GKIq;CZ(ENU=fxQ^qW ziFG(3f_C@Tys<^axKznHk0>*jbpEKJ-ZD#dh*%UutW} zEC!AxT2DXQT+^=QxH%fPRov5{lRv->?Trh%{$tQ4+vZW&z6LC0usStj!U|0aBY0hg zC$qTC&CNO47|a9?ci^JK`Ve4|;VQvkOj)CVhdn@6T!Rx!PKi}dn~2ZOYg+W*=0osq z@KsQkc9m9NN1K!2xN_j`f>t>^5xSSfhUa)qw1CR-cm+{#DPTjZDnjysEOzDQM_e{(xc z>+yO(?@cd2kxsWAr-SN@nWvGMzZQJ{!0I};OD z7Rb6pYLnul`pk8xeq&fQz@tAq!L2NlW+CRN!#yOPkwGO9n9;+}Y5eVFS?_%Dd;25NY`EW zPP+&Adw{@$<9x!vb-+@`5d1J)$d%%Ta6L^BLVK&4Gay)_`sCi=8>hv3WmU58QZ6Muh%yALJh&v(C@ zo8Jelmw+UBX`{X8<9^=JOP!5wiNa9WQibi5t;Ymy?e`D8pZx5!%=ThlzT0FrUyrt~ z$zG$xAR`Nu!}lhXgmJr9YihN=EO-kC0-#6z(*mj=MbHHr3k)L23}5Z#^hev82eBuh zDc{}#$Z@H>mB_?zJ0&*JuM>L-QiN}!^smQ7zuSn55sTL&VIiTX0~&AQ2tirj0QD{^P8SATvJ?yWNld;)D0={x> z#t$NU&3xL^R+$8I)iZ;D!OFzDk=N&haNOq!^4j<~2IC$ZmINZ|M-Rm)?%cN5UNUOo zHj_C7TX>_Dt;5UJ+|>}%9#u448M{|**Hd4EQ34>VErZNVW+c*3<}l-7)BZ=X?mWgy z32P1=>19V{#dx^I#)LqF`T@oXQ2ti?RrlGTZzp1m7PdiWGEW%)2}LxD5vsnDnq1^= z$-Mb8SWLD*f|W;)6Gh@RWIPJnOG44i%nT<8LU5$jriXH|JwTbK1fpr6A6CIEF6tAa zwm^|jlKm(|OlU==Cp5$sx(&*b=T!bl))`O!`-RtbY~32eBO!Y3pl9ZVh<7jlT@)qX ziPdhn`(`U!v@(m)m;2FZIYEgy;di+12q0JPuqM!;a@)S;-z5l-Ue#rr!kzzQwbJC- z=BUH}p#t$bf`BUntNRZiy)ME(b}f#`yq^Q;vU`VWCf@QRpp*XW`d5aAjnL+({?RWW z=G8KLn4Axg_m*AqOV4Mq=oe<*XIJiM_uXMa;v`WeE!nh-fj#nM{%7c|(lmmQw?!bZ z^p|bL>He18Q~5`mdC#%RZk0*NDzvDcQk1N;XpnaZhn5x!deCjH$tL8Yl6cy#VCf{} zu}>`So46|l$=_5U0PifA%E@2Ul3)jHax3%*~1}4Q-I}^)=CM&>QGv%M9 z={Z>XdYU@A)%P;4$Dt-Wzso4|L2K|wDG)lA_SWh@AVzL?9;Pu0aHpIH z*DFyl!bvdMawOGaX${&7ks9ekwcS*xT0u(YQ%8k0^mz`wCnykHu4Cz@0PkkBpTHap ze6N3x#Sn1X8FbP*;J*k*>67p~kRZ{HB`H%BkGJlo;ftkoDjd6PNs2}7$KWzMnbZ6Y z@*!7=%%py@UG_g&T*wx3W!dt-aL4!1H5_>mS zug!rJj%!p!yb5WnriF%akz)IrvWYgOVXF&IKqWD(d&iFv!|!2`=5?E8&`hD*N^T$ z4t#%13m&)z2o-ExiyU~j7W`>Fw|kp1B`y&y*3qOtL4#2c=oV)W+js%Evxs4k;Zq@m z#zd^yly-Cskqf9ICTp>NbUCE4k%oLA@JEY*QyfZwHzgI*tPqqSCS1dNAD+a8ixf zJ6&F6i3Q#nZFZEBvPW>74 zY*2uY%tzavoG%&>IT3gMl}P_4&4W2Q_GSKV-@J@;QcQqX3c0D82A+`st6NBSY zeIF-nC97`L*&voq3yqE zGQu(8^X`Gus34Ufb{n-Vv8qCcitJ51&?y%z{51es2M+38!8o}->&4H2kwRW~4GT2y zVekw*cmQV#K>!HVP=Pmkhjnoz6_j8_XY&0ufLUOw7wmD7RwvIANfbvUk*?_bTY-VG zVe(R7-+itR@*x^K1}`S4=v%BDvxunqNQibMmHncSu`~n>{mbbha80gzw05YOv!-3; z2XJp{U8NEQY80UWz|QhS!ZpYxL{?AUaKkLeqIYB=1h(=-bBv!Zn5s0+DLYwt;Qv-2 z1Aio*I1(K;6O1a!MaIKCc$d%bNLFrFTvCEmdd9FE#~S!!wS>IKL2>dEI&=1TF0089 z#UK80VnTSvKYa)W(Hw%ZJqgV;OM(iFhzMQ6eY2$6!aA(r7+P6UTnWS$m0itUH9jkm zr_(0D7AO3UlH|aQFwvIQl2?xD$3XX#eo4r-ZA3L@_hM8`MgLRv&RCsa;EKYe(52s> z==m|E=a*b1@z-|Vy~+G5GpXQjsc7b)8z&P2b_X3z>L$ShU0^%Lkjq$}?FKQg2(sbt z3h(J5=NJQy)5^YnjHPkMAsgcs7yT{$BJNETjPghe_V(-@8p}&FfljY*KEeM5b(B$? zd0k_7Ygg;cpv-p7K&6OJaf1SGW@Y_cE;U!^mj9rP^^M&1I2;8_-3ZL~>!JG@k+4#)2Jl;g zovG9P$gMsU5*^+xmkCt#2WNi$O28Lj=CTxK;e7HnWg&z4mj}>C9mOmSQ(o}OPw~gW z$1d%Y;2<}_a!IozmXGc~lK-;t@XSHTW|!!)iw9pH_!bZcZZF#853Pa-q3ZS|+*UFQ zS9ut=NPY8Pgj3S8l9F41G2ZI0#<3%1u63bMO{G^I#vI_6J@s5HH#Ju2xt~}H=X?>? zW;b|l8|0Byq1!6<JPqx$`Sor@Qit& z>t$!h;w?%6ZAin;YmUVmJ?h4)x$}QNJ@!ASPJa)s8y*3)C@0H4)njaWm3rzc1CpJD z5({n)O$Oa!$kz|QvG1Q(){e?QyWC0W_DKORJ1ige9QnjV?V|8^uq%m>Ta?uIMOh7* zN(wmjGbi+L6qg|B(A|a_6hq9hT|aVBAHZHqh)LJ_TZB7;>5YL5g+oz7I$zdq+z@IQ zEV6B|VkDRVDg4s}Mha`0aw>D*zPjB__fF@wG)i2cx#rQf`Vh(id&Z?~-*Z+r*HFpu z&lRn1xnPI3U#`Z~SV)j#5=mlc*=h9JI1C2Poe$$^PudaKe? zrsdIQJdcsQrxDi;yNx#lc75B>pma_wc^Ew&Rks*LgjY5kr~N%Ej9d)qv|NlvbfiZ) zSOP`J0);WQD6E$brbT_^sR$p+8CdT>{tiRJPO?l79Y&!?t>jcGVTixb zl8ywG_iai*aESzTT<8dG(anQGQ@)a25Mq&X6458dJFJO$GOHyy(~U+S_3ElBJ-JTg=pz z#?sS+93;0wmR_efP$Bpz`Gg5oq&XR*RV7>!3^Sye3tzbm5srgkP;*z>9NA;oM#h2K zSkfUWP3izs*j3zjgiZz=>)eEfJFMZo`DlE4w)KgQ6A3uG1Cv1IE-%5o{;~`-=4LxJ z(}zF)2;0-e63r5QXRr57A_|W4_0QqWibq>V^@E3Hh+%Lr*^0D))G~cCGkz!Ds@yV) zDO39gJ%7rz$VdWZ&CI_A9EAZx8tQ+0_pUQe|1#LMCry4Q#1V`*C@O=*3{uR9Dk=L8nyL|PhUY(3qe3sOyIzzSe7Hr=}1B4BSf2Xlza zfWzC+CL<<;px!^Nr0h6%dldqznOc86{;0U zJg0bgCFND+5T%I}xI7qhd;Ylc8kiHzw3wJd8J_y<(8KH2H_T^+#GRzqz-6v}ruQEP zZqvF(1m2QO%^G1(X0!Oj&==ct{V@rrSyc6HTnk^?ILAzX|C`l^SW(B?Qz6+K91DFu zc|Rz6A*SPm&kPeW^YeZ>Ky7d@3xhfvuR*MPSP*2uOIIx$Ops z7rvl^@S>l(~lw?#50}uHW{)9OI+@i(0TXpMt<yesD^Q7rColgJ%(@--nNUqHTNO3<(bZ~Q|!KTi95}j<>xAx?HqoZ zz6!DN`sS}%twberfL!ZVnNfFIwg)5a?OatnU<9mPY1~AU9rw+Bf~PWvEF2@HpEaF8 z^TVgWizyx6;;REnhp&%LOC}2|Gty%I|9@3qrGsz?BC$1wZ+@_OP0_|UK-GrY?~@(E zV-E3QOa~c=!M*Bq5okf^7H@Unp&~awkH5{Ax>XAe+5N02hfb+Hs2pu;89UWk$K7(6 z%bt{iYY*5D#31>Y_qZDB&VAxJUVJ{!X2fJH^!TxfKjH7c-%NWkPEe-`=8A-=<6Aq? zZvkg-GPhlq_m#WG0WV)JUX;H#FQiamHonKG<+AzUCvxb3CNs~#*S=0Hmbo|5KfXz5 z0+M}6b*!5Whm>|_R&=~}bAWh*dq{0oM>yIA!dMVz`vCW3>>^ARSohBs_Sg*-c0tP> zVkl}r_(;ZAZuZ_T&;8VRq))ctqx$*XRuex8rm%i@n^$M=DdIL`qS{t(j57!(to58-S**MHU35IfbpJ90kEfLc!l09GnfO?i@YYBGmnkJImkEh(N09Zzm9oIiAgd5D?Kq(S2S zsOAqOrt*4kmcq^pe)OvB{5d)p=I$EqxjgeN7+GCtHw&Mey?3=(oLtz^_Su!fI?(z1 zqhs+R^7}3}2U>F>Vi?K$A#oUUgFs6M5&Rmk{JUFd{xORqX^*dt1+|fK96|Paee6Z5^ZkO7r3o~c27W+XP z6ha6bhrVthq1HmN&FAn5Rh5+h&6gBWhgzjV^n|HLbG>@#R&AR92*9Ta;QU)FD}?al zvSL0`kpowiO?s>yA!CU6UZ@#eg}{g`aU#2MpxgMSjCUQUNT2(uu1(aJ5Fbgi!({kG z8gW1p;xT>1ArrB^zv#o)Y)ljd1ZRm9;pc z*2)v6rsojxb}FU)WQ|y*D1f)!3*JoF75^(Y!xtmQL6KA$tI2_?GE#^LLV^*1U98cw zI%`dhJLn=;HBJQ=Ncss<;^AEE@kpi@Y%coP2*`z8Q`;N1`7KM~i}>UvZ(hTom$Ta7 z*ni??riaB4`jQZ=B`B63L=>|l$q&Y`Wc|LmA^BkmVMVu6RY0;OB%xP=7CYecKsdY4n;PPh5Y#QH$<>5L(xpBHaR>sOd7t@kcZ> z!x<%spUVWjbuh4wijYO1WSKmhX>|h#Ja7?S)qiz6nkxf_+*L(yacDv*ZgvN#MdQaP z4S^CUFx#G-_*)2SR5qPSyA>FjHXVR(Jh^21?6}t10tl7Y(p#6y36f;qDkc-O|FdeRv*^bWy!=^w}hkwx8-hs#Y2Z0JVxr|TVS_A=?Ilg;7c z8{_&&_homQF>=LJ-mg+cXRrO=96jE0-MO!CPM4cbc}@?%$sk`JOw-$w-Gmq{|G~z_ zuC-tKU9OxXgO&~N;dw$mPO~2#DE6u5_Vlv!S~^~Q4~>7-WZWwrf?6S!&gHtVboK1q zVz-P%N$z(6ZS85oL=_q5zk6LGjI1-JkwGaQL?DP&F}TR>cBqD2m-5;8cQ&G|Se{I} z8xue<++^UmS<@ri)DP|%Aa8}W@UYU;5D^mW6|zvTSu!M%DbdCQL27lfDu8zh)GP+; z<)QNiSsI$J%#$&jS--P8OMdpH>z?eCiiP0)JzN`WWqmkPGr16o_MpThP_6>HN!!qD z{dMOI9)Ni*3O?H)17HDB3;hjGy-ZA2iBMZgK>@j6kZ!)s(Rg?ud>w9X1~As_I{!he z0_%PcxQWR_3wU4czB>tWM*SIZm-DIxs(t1grcg`9GkpRIt!PS)xWL8xNU8>U4T8E$ zAp3r9rW8_eO&TM*R8%!k=Y!D)yZn(c;KZvAC*{nP~c zmx_pAk&<5#4vVgnaBpPGM@8U%ECQRj|C2p)_0>G;5sR8gYbeRG%M7K$V7c8KxMHfNd!o@?d@ibeZH`J z@g)``oK|0GsFQjE`I6((rbJJ{NwCy}PZ^Q&O9N!ZCixU`%3l!_(BoJ>=;CkTU(WS^ zb+Bjt#ZYke9U(guu!eSOECD8v2q*-kT_#xD3hg))5XVg>=#N1aNKc{&N&;b2Xcx^u ziT3kQ3~mu=yWtF$quQM>TNF$yRuh}tW{SZ&?_S*Tjn56075|K?7`PAx=v)PfI^~BO zh{(U!u#({nkXp%TN;)A6+d?!jF=7HL1s~AXwnR|!YXKdYx|E+40GL38A+px$MT!v< zf~iMqCR*J18KZbe1+@a{?hla=_v4Li(;;2=z96C8>;{k0<$VkcXmt(S{OEPLE$!h0 z{+gXVPCc&Wf|#-M4M%{4IX4uItXQr4UYkU=K4pe%2hoL#`5I9f3C5WOyoJwZ2tf)Z zgqWVAsDm^0z9$`~^#p zKWFpU8&Ga&4-(_z_`cZ{Lr2#>Twa2t06;;|UgKdQOgPjCqu^%YdUkNX@XSk;efaIr zz`)LrH&1oDbz2vVj)UXHUb)ia0a`&UqzZ<8W59%GvX?@X9bhrz|>mY$o zO}8|6X#sgv2nQf{tr#&x%EB<}Fg(S`V{_02vxTIFtUCDsk;Qg>rnjHj-eA^3CHX1& zdXLJh-(&AMg@G=q3L;hETMUqPxs8612=bTvMf{fu%Ych7R+xSY0 zft{p)s7KABPxy+s$u|B0=kYfTM1%*$+^?b7=zB^8r(D%)Yeb)1OT2IuQvzqyIOC1ZaLv=`6sy%kTh2vzy+ zQ)`|L(>Oy zM*e{tK%pObUsYAMIP-m(FrnjljwLy?wJxZj#wdyzh%r8TEc>d}mw$e|z3*ry6rJZ* z`Eo)<$luZ875=;li-1m}D{veS$PoQkyBn08be4L$8&CYURes&=eJwX7ui^yq0Ajbx z-Z;Q~bqy4;AO>I$ZwKpY;Lt>d#e>AaY`3>7`yS}j9q(l*-5G_fXDW{@^5-9K{}!tE z%v{CXz66m0W?4c^nQ1vhkvNhJ#)|7c)S^&}{y0LrMWqN*XmvxIAH(%b_#CC_&ez<~VAc-p6WlVG=I zz$#&#s?YLw-DgU+Z=Ong3#oXqTE(S^@37Q+S6?39wb3nK$o*Zzx*m@xiTQb{!MqfQ z9N>Q@w|boE3-#+Y0lHsANpPWd1{NaaeZ-F4&i5Bv{}uS_{Nb@(M1|2Rl}modjE}1g zSmEQV9j=rl7MSnQDH4@X!pMd06#|O^zzysy8q@zSl*seYXyT#=h9^y6jK4nasru_{ zJC$#g*(Msw^{l?&i6We!>;I7fkMhCTXpHe$JW5nhKusTBKC-zHe|M`DJ^Jy--$1wC z8O4}1He9>edLDk?8DO7?(LLUsp-9!Eost5MnT|7s&}lFwNa<+Ad{XqLP=GC^4RE8N z;4nZb7ug+~LUF)W$n^N!E)D6{==D+mR#^QYM`2W{L2DEVTSO836P1|n6u?I^IN_lP z7%I5}VEvi8&%#)R1M#g6YfNYi5T??frShqT3T^8?%s0|kiPy!pdjLJ#Ld4?Z+rjCXl1dAAtDZ)_ZTQ z_fM$9^=+&nSceHXsBMVPRY2v~1MyTSWx@Y$im-YId#dcg(S=qqWAHiHuUlwo!r68c zFuRv1k_fK|V*@Tru~De)ot=la82KSSGD9j8RE;s6HK2Pnen?iP{=Q=YyB zz!oS9OwGZ3G5^*uLS}yLVJtub7msLz1&-2XTu7Q`e}wozz2G(Yx>V91*3Y_YUr1`8MgeK;t3tBP8@r>_A&p_w4~t2GI; zbXxLqm*;swz+)wV^Zg%hmVv9ml5}q@RW=Qq2ZAxsl2!7r+Pv)cvvm*|++sidIwgDe z1&j@uZ4M+Yno<}*$){f|%J@b51r?+ZTqi3Ut*4LBgagS|rJJUSn*k7U4+jK+fMD(L zeMFc;J_-^$?qCbzNgM?9NlXFBLPv{HVCLi4_F!+8ZK^% z>0DexPPT!;`XnSCl6x5e9V&!|4ZmwNS(BN@Za^eX&lS+V7VkNvClQu_Yqa^rl*@|8 zW*8+t*bqOG9v41t-1X#l}*LV^Srn7 zS9F2~h7U7`z7EJQF$fEN!@LU16&ae3*o_$agj5uSzh?TnNrChO+^$fc=SmQ!V1>|% zga{phYe>sb2}3K=p8V=J7t(i}poODI{rMYqrLYKxLu0 z&nni1w1w*KO4Mk7qzu4~!^WQlaJ|7d6MJ);#yXs=xvvSO&TF0SlqBV<1qsp7edoCJ zpMK9!_a;uTzu9Y-GsMl$rpeIe!YbID-R}+gI@;@e6OX4_RA6NW4(CVA83B@4G3_t= zP%w5hdVhy3$-n;H0&$==Wt!&;1Uw7Wq23#fLM?e(4;-m+lfigh;OLv!sKs1R4Tca+ za>@;mOXP2l_3fkCa(-4j*O$*(SXjWKRiHpFLj+3Bqva-N{R`Y$@DcFgDAcjFXfT4) zF25A4>A2v~1lL1wqsM`3&B+h`dR%)=cCzC6^CmHut$la9+syB)+mR0sclXt>#QPmG zs^9L3ebc`q?rQWG8HaF)LuHCJC5MfrNjMROQ4kBd(8ORT9AU|Z1(5?ofn~EHpn)(c zU z;+y-5eH$F^3KWI}Wgj}T|0wSePVsY`q+#Agf9v7HD_kwQG-zqGzz-Edn8Ld zx-y$2*~-3yYXyNDUrahg%tdSaNphDckewMLBV+C@$C|T8=+gRr1{d%CBF;OFLYCZr zVYTzq<}RZDrM0~(egb7TU~K|p-jm)a=UUtL%ZpDdCyAm%noy_2qv0Eyx=@IPmk_En zMI0D_xx=x-eB!K?D`*|X+Es&KK!NpP$Q5vcaq5=Wy3~rp+`l##y4pGGVLV2Ot1871pjAi#?k8H zT52a1qdgK1{{Y^wxbkQuRic@>xpj2I@E?tFi^|$hO?1a-A>XidCR&0QW=MHPIf^E; zNtCbdp`cKUWwpuVX)fJf?8k7Wq$>Shdb@RSIVBD(qT!8HOo~jy_Tdn+LQEd z?^YcD>wN^G#f%V1K&P8K9xu2{K_J9DeN@qdNmPp~dWTX^C0Sg$~^S6@K zwl!K19yucS<3zH=(B5XZ1UpV3MyAhIIu2FwyeASU(66dR0GLogq{&q@XcRQP5C$Bl zY2fUPO25#XA~(ZMBWe6RjAGcT7p-`k$j@k^TsdiSH1>sQas5 zlSrci^-3;S+Rhzb237-dfxOm7Lo-d{eMG=Sxl((@s9U9lL>pOJ_N93NqMPrvjbzYd zx7KJ;qD!(lO>R4aU-ERC_nMSjD`;abO<@LBLyLScuEXmGK|jnYX{3uW9nY#lxYe`@ zQ%%n4cZj~U+Aolaz|7hSpR?mwcSL}6TNAF$Ln>$+h|Fq zk<~KEL za@D<%Rr@t0x7&)PV^i=mWdXituwBs#q`k?0g>OvTmQ=EJoIrTSqcF_m%+G;nptoGL z8rep5Y%#{lTpAJyx)97yA;f7+lVBSx`PK0l* zunWFAS*YX&>T`Eq0+Gr4dXP38`bEGxS2@2^L2?2{v>z9?8hJ5wdni`&13`ova#=l5 zkeUgicwZJ!L`q(+)@A2mK*3|7V16lhI}Nqc7kHBp<_Nq`a*bm6oqL;5XkGT6Qo#Zj z&U+k$hl8mQx~F!APavf}uVUK`jYp7$=IV)lmHg22k65fam^1v8QVorcoRn0#cmXK7 zTt>5o#*^qG;lM7es1$5t%mRGr1^7q|a=KrHd^m>uo3sR9KvGdCQehL>+!?Zfv#pqb z4uQ1{em8BVHhpkBd`6J1^x~Y8&fW}iSakHv?7Lp;FEL?)xY+~>=y{A0XF%&7Su&(6 zN(nx3pk#{|?(a8zjxMQb&6;m1H^N}OH5XivDr~!y)et0uvA{!*S52R|; zLR#TY^}%E3mL8<96~TdDKj!-g5+XwTz=TB&g-HN4-+E;^5c&dqC_I`(EYyR5(MtN1X zTyHwSk+6x))V7b!B$<`rr&DK0I6n>SDS_sY=@Gz}7alX$n z<6$x?hA*b;Nc()P0YCNX6HIJB7npBAQ53;0w2xusB0yRzgldx(COdy!5$g7KQyNMU z*^b(T&-W0{BkB3!npjF8ID|f|W3Pr~$}9=C)oBth%~~}WzI!49&9*2mCG;nm;2}ZH zoD}-GehX-(K~D)a;zLYxl(THxKtGlv&ggu1H~x~h-d80rQ6-dtVl8`UN>kP==(@%Ym&fj7%p zd*j^8ktT(p+rLWGRp7adgoeN|FJ>pdaUAs1L5@!YR@^fkN_Nm zDF8AdaDyKMBD4zcj2|Y$B=`3@2%5ex@ZW0uVqm4d3GhPcFo&B?zI>l*q=b%guE`E{t0#brs;lq9aCfl`;-rWWutna@7L$699iV z?QRE)@-Cbo3eqIXNWp?1Q!}B6ZB&t7(iaG&-XRv%3o+*KHT|Pz<)NPwx}Y54FgMzH zgsdPU#M6g>`%rUd>AGA0`>IPZP@lW*o z^#X=Qv;QmWr0teO5fl+>JccSmZGgR`jI-ke2+x%=L_zJiS92~)BZ7FGLoo*=r-u|NkG_W|=k=#T?9 zxEi=Nc8&?GW9y}$`YE#nqU05pg=ACQ-0ZX(ZJQc_Tww*10#4*%!#;g|qmd!^Kbh)e zcL%+5VU7Q74-*hivv&~m@4q2%&;df3Y=)C0tW z2Sjkyt-obT*J~KyLEwm_nxwzC-@u3g@732gq9a6CENDA~nFOdV9FrNO{f$Q*PjzO; zAetg$1A#UMrdhg5W_r9DzcxS=k=r9uCO$01amH}DHf(r~f zX!FtjtNyO5jCPG|Z1Qf0gortK{m@ow1WC;(v(O`k6~sLDZwXppM49&`-KjeK3Q&S5 z$>R*~BXMX1gqlOkEj2h$$3?J0`pXZwxyRW(LbgX;z)A?h2sZI-y+Z zYNu?)q%1N3srEGR2wSdl+J#h@IEaWS&ZIGOD7s3`|8H(Uk1#a=o9GM;Yhpp_fMKD* zG_lX&od>(a^YuVBROlbbxBm^V$pMF-K*g;{V+T;g{YX8l2m?d_I4t!a)Eu)vcB>g| z3MhI%0!2E0tZ!ff84EV*hdijQb3CFNXa>Y6B{@)m`Cl}E0cJMie^5)}zeF}a)b=ii cBg!BCKit!&^da81mH`MnUHx3vIVCg!0A%E)D*ylh literal 0 HcmV?d00001 diff --git a/docs/tutorial/onchain-rln-relay-chat2.md b/docs/tutorial/onchain-rln-relay-chat2.md new file mode 100644 index 000000000..458b49516 --- /dev/null +++ b/docs/tutorial/onchain-rln-relay-chat2.md @@ -0,0 +1,242 @@ +# Spam-protected chat2 application with on-chain group management + +This document is a tutorial on how to run the chat2 application in the spam-protected mode using the Waku-RLN-Relay protocol and with dynamic/on-chain group management. +In the on-chain/dynamic group management, the state of the group members i.e., their identity commitment keys is moderated via a membership smart contract deployed on the Goerli network which is one of the Ethereum testnets. +Members can be dynamically added to the group and the group size can grow up to 2^20 members. +This differs from the prior test scenarios in which the RLN group was static and the set of members' keys was hardcoded and fixed. + + +## Prerequisites +To complete this tutorial, you will need 1) an account with at least `0.001` ethers on the Goerli testnet and 2) a hosted node on the Goerli testnet. +In case you are not familiar with either of these two steps, you may follow the following tutorial to fulfill the [prerequisites of running on-chain spam-protected chat2](./pre-requisites-of-running-on-chain-spam-protected-chat2.md). +Note that the required `0.001` ethers correspond to the registration fee, +however, you still need to have more funds in your account to cover the cost of the transaction gas fee. + + + +## Overview +Figure 1 provides an overview of the interaction of the chat2 clients with the test fleets and the membership contract. +At a high level, when a chat2 client is run with Waku-RLN-Relay mounted in on-chain mode, it creates RLN credential (i.e., an identity key and an identity commitment key) and +sends a transaction to the membership contract to register the corresponding membership identity commitment key. +This transaction will also transfer `0.001` Ethers to the contract as membership fee. +This amount plus the transaction fee will be deducted from the supplied Goerli account. +Once the transaction is mined and the registration is successful, the registered credential will get displayed on the console of your chat2 client. +You may copy the displayed RLN credential and reuse them for the future execution of the chat2 application. +Proper instructions in this regard is provided in the following [section](#how-to-reuse-rln-credential). +If you choose not to reuse the same credential, then for each execution, a new registration will take place and more funds will get deducted from your Goerli account. +Under the hood, the chat2 client constantly listens to the membership contract and keeps itself updated with the latest state of the group. + +In the following test setting, the chat2 clients are to be connected to the Waku test fleets as their first hop. +The test fleets will act as routers and are also set to run Waku-RLN-Relay over the same pubsub topic and content topic as chat2 clients i.e., the default pubsub topic of `/waku/2/default-waku/proto` and the content topic of `/toy-chat/2/luzhou/proto`. +Spam messages published on the said combination of topics will be caught by the test fleet nodes and will not be routed. +Note that spam protection does not rely on the presence of the test fleets. +In fact, all the chat2 clients are also capable of catching and dropping spam messages if they receive any. +You can test it by connecting two chat2 clients (running Waku-RLN-Relay) directly to each others and see they can spot each others' spam activities. + + ![](./imgs/rln-relay-chat2-overview.png) + Figure 1. + +# Set up +## Build chat2 +First, build chat2 with the RLN flag set to true. + +``` +make chat2 RLN=true +``` + +## Set up a chat2 client + +Run the following command to set up your chat2 client. + +``` +./build/chat2 --fleet:test --content-topic:/toy-chat/2/luzhou/proto --rln-relay:true --rln-relay-dynamic:true --eth-mem-contract-address:0x4252105670fe33d2947e8ead304969849e64f2a6 --eth-account-address:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx --eth-account-privatekey:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx --eth-client-address:xxxx --ports-shift=1 + +``` + +In this command +- the `--fleet:test` indicates that the chat2 app gets connected to the test fleets. +- the `toy-chat/2/luzhou/proto` passed to the `content-topic` option indicates the content topic on which the chat2 application is going to run. +- the `rln-relay` flag is set to `true` to enable the Waku-RLN-Relay protocol for spam protection. +- the `--rln-relay-dynamic` flag is set to `true` to enable the on-chain mode of Waku-RLN-Relay protocol with dynamic group management. +- the `--eth-mem-contract-address` option gets the address of the membership contract. + The current address of the contract is `0x4252105670fe33d2947e8ead304969849e64f2a6`. + You may check the state of the contract on the [Goerli testnet](https://goerli.etherscan.io/address/0x4252105670fe33d2947e8ead304969849e64f2a6). +- the `eth-account-address` option is for your account address on the Goerli testnet. + It is a hex string of length 40 (not sensitive to the `0x` prefix). +- the `eth-account-privatekey` option is for your account private key on the Goerli testnet. + It is made up of 64 hex characters (not sensitive to the `0x` prefix). +- the `eth-client-address` should be assigned with the address of the hosted node on the Goerli testnet. + You need to replace the `xxxx` with the actual node's address. + +For the last three config options i.e., `eth-account-address`, `eth-account-privatekey`, and `eth-client-address`, if you do not know how to obtain those, you may use the following tutorial on the [prerequisites of running on-chain spam-protected chat2](./pre-requisites-of-running-on-chain-spam-protected-chat2.md). + +You may set up more than one chat client, +just make sure that you increment the `--ports-shift` value for each new client you set up e.g., `--ports-shift=2`. + +Once you run the command, you are asked to choose your nickname: +``` +Choose a nickname >> Alice +``` + +then you will see a couple of other messages related to setting up the connections of your chat app, +the content may differ on your screen though: +``` +Connecting to test fleet using DNS discovery... +Discovered and connecting to @[16Uiu2HAkvWiyFsgRhuJEb9JfjYxEkoHLgnUQmr1N5mKWnYjxYRVm, 16Uiu2HAmPLe7Mzm8TsYUubgCAW1aJoeFScxrLj8ppHFivPo97bUZ, 16Uiu2HAmJb2e28qLXxT5kZxVUUoJt72EMzNGXB47Rxx5hw3q4YjS] +Listening on + /ip4/75.157.120.249/tcp/60001/p2p/16Uiu2HAmQXuZmbjFWGagthwVsPFrc5ZrZ9c53qdUA45TWoZaokQn +Store enabled, but no store nodes configured. Choosing one at random from discovered peers +Connecting to storenode: 16Uiu2HAkvWiyFsgRhuJEb9JfjYxEkoHLgnUQmr1N5mKWnYjxYRVm +``` +You will also see some historical messages being fetched, again the content may be different on your end: + +``` + Bob: hi + Bob: hi + Alice: spam1 + Alice: hiiii + Alice: hello + Bob: hi + Bob: hi + Alice: hi + b: hi + h: hi +... +``` +Next, you see the following message: +``` +rln-relay preparation is in progress ... +``` +At this phase, your RLN credential are getting created and a transaction is being sent to the membership smart contract. +It will take some time for the transaction to be finalized. +Once finalized, the registered RLN identity key, the RLN identity commitment key, and the index of the registered credential will be displayed as given below. +The RLN identity key is not shown in the figure (replaced by a string of `x`s) for security reasons. +But, you will see your RLN identity key. + +``` +your membership index is: 63 +your RLN identity key is: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +your RLN identity commitment key is: 6c6598126ba10d1b70100893b76d7f8d7343eeb8f5ecfd48371b421c5aa6f012 +``` + +Finally, the chat prompt `>>` will appear which means your chat2 client is ready. +Once you type a chat line and hit enter, you will see a message that indicates the epoch at which the message is sent e.g., + +``` +>> Hi +--rln epoch: 165886530 + Alice: Hi +``` +The numerical value `165886530` indicates the epoch of the message `Hi`. +You will see a different value than `165886530` on your screen. +If two messages sent by the same chat2 client happen to have the same RLN epoch value, then one of them will be detected as spam and won't be routed (by test fleets in this test setting). +At the time of this tutorial, the epoch duration is set to `10` seconds. +You can inspect the current epoch value by checking the following [constant variable](https://github.com/status-im/nim-waku/blob/21cac6d491a6d995a7a8ba84c85fecc7817b3d8b/waku/v2/protocol/waku_rln_relay/waku_rln_relay_types.nim#L119) in the nim-waku codebase. +Thus, if you send two messages less than `10` seconds apart, they are likely to get the same `rln epoch` values. + +After sending a chat message, you may experience some delay before the next chat prompt appears. +The reason is that under the hood a zero-knowledge proof is being generated and attached to your message. + + +Try to spam the network by violating the message rate limit i.e., +sending more than one message per epoch. +Your messages will be routed via test fleets that are running in spam-protected mode over the same content topic i.e., `/toy-chat/2/luzhou/proto` as your chat client. +Your spam activity will be detected by them and your message will not reach the rest of the chat clients. +You can check this by running a second chat user and verifying that spam messages are not displayed as they are filtered by the test fleets. +A sample test scenario is illustrated in the [Sample test output section](#sample-test-output). + +Once you are done with the test, make sure you close all the chat2 clients by typing the `/exit` command. +``` +>> /exit +quitting... +``` + +## How to reuse RLN credential + +You may reuse your old RLN credential using `rln-relay-membership-index`, `rln-relay-id` and `rln-relay-id-commitment` options. +For instance, if the previously generated credential are +``` +your membership index is: 63 +your rln identity key is: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +your rln identity commitment key is: 6c6598126ba10d1b70100893b76d7f8d7343eeb8f5ecfd48371b421c5aa6f012 +``` +Then, the execution command will look like this (inspect the last three config options): +``` +./build/chat2 --fleet:test --content-topic:/toy-chat/2/luzhou/proto --rln-relay:true --rln-relay-dynamic:true --eth-mem-contract-address:0x4252105670fe33d2947e8ead304969849e64f2a6 --eth-account-address:your_eth_account --eth-account-privatekey:your_eth_private_key --eth-client-address:your_goerli_node --ports-shift=1 --rln-relay-membership-index:63 --rln-relay-id:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx --rln-relay-id-commitment:6c6598126ba10d1b70100893b76d7f8d7343eeb8f5ecfd48371b421c5aa6f012 + +``` + +# Sample test output +In this section, a sample test of running two chat clients is provided. +Note that the values used for `eth-account-address`, `eth-account-privatekey`, and `eth-client-address` in the following code snippets are junk and not valid. + +The two chat clients namely `Alice` and `Bob` are connected to the test fleets. +`Alice` sends 4 messages i.e., `message1`, `message2`, `message3`, and `message4`. +However, only three of them reach `Bob`. +This is because the two messages `message2` and `message3` have identical RLN epoch values, so, one of them gets discarded by the test fleets as a spam message. +The test fleets do not relay `message3` further, hence `Bob` never receives it. +You can check this fact by looking at `Bob`'s console, where `message3` is missing. + + +**Alice** +``` +./build/chat2 --fleet:test --content-topic:/toy-chat/2/luzhou/proto --rln-relay:true --rln-relay-dynamic:true --eth-mem-contract-address:0x4252105670fe33d2947e8ead304969849e64f2a6 --eth-account-address:0x1234567890123456789012345678901234567890 --eth-account-privatekey:0x1234567890123456789012345678901234567890123456789012345678901234 --eth-client-address:wss://goerli.infura.io/ws/v3/12345678901234567890123456789012 --ports-shift=1 + +Choose a nickname >> Alice +Welcome, Alice! +Connecting to test fleet using DNS discovery... +Discovered and connecting to @[16Uiu2HAkvWiyFsgRhuJEb9JfjYxEkoHLgnUQmr1N5mKWnYjxYRVm, 16Uiu2HAmPLe7Mzm8TsYUubgCAW1aJoeFScxrLj8ppHFivPo97bUZ, 16Uiu2HAmJb2e28qLXxT5kZxVUUoJt72EMzNGXB47Rxx5hw3q4YjS] +Listening on + /ip4/75.157.120.249/tcp/60001/p2p/16Uiu2HAmH7XbkcdbA1CCs91r93HuwZHSdXppCNvJTDVvgGhuxyuG +Store enabled, but no store nodes configured. Choosing one at random from discovered peers +Connecting to storenode: 16Uiu2HAkvWiyFsgRhuJEb9JfjYxEkoHLgnUQmr1N5mKWnYjxYRVm + Bob: hi + Bob: hi + Alice: spam1 + Alice: hiiii + Alice: hello + Bob: hi + Bob: hi + Alice: hi + b: hi + h: hi +rln-relay preparation is in progress ... +your membership index is: 66 +your rln identity key is: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +your rln identity commitment key is: bd093cbf14fb933d53f596c33f98b3df83b7e9f7a1906cf4355fac712077cb28 +>> message1 +--rln epoch: 165886591 + Alice: message1 +>> message2 +--rln epoch: 165886592 + Alice: message2 +>> message3 +--rln epoch: 165886592 + Alice: message3 +>> message4 +--rln epoch: 165886593 + Alice: message4 +>> +``` + +**Bob** +``` +./build/chat2 --fleet:test --content-topic:/toy-chat/2/luzhou/proto --rln-relay:true --rln-relay-dynamic:true --eth-mem-contract-address:0x4252105670fe33d2947e8ead304969849e64f2a6 --eth-account-address:0x1234567890123456789012345678901234567890 --eth-account-privatekey:0x1234567890123456789012345678901234567890123456789012345678901234 --eth-client-address:wss://goerli.infura.io/ws/v3/12345678901234567890123456789012 --ports-shift=2 + +Choose a nickname >> Bob +Welcome, Bob! +Connecting to test fleet using DNS discovery... +Discovered and connecting to @[16Uiu2HAkvWiyFsgRhuJEb9JfjYxEkoHLgnUQmr1N5mKWnYjxYRVm, 16Uiu2HAmPLe7Mzm8TsYUubgCAW1aJoeFScxrLj8ppHFivPo97bUZ, 16Uiu2HAmJb2e28qLXxT5kZxVUUoJt72EMzNGXB47Rxx5hw3q4YjS] +Listening on + /ip4/75.157.120.249/tcp/60002/p2p/16Uiu2HAmE7fPUWGJ7UFJ3p2a3RNiEtEvAWhpfUStcCDmVGhm4h4Z +Store enabled, but no store nodes configured. Choosing one at random from discovered peers +Connecting to storenode: 16Uiu2HAkvWiyFsgRhuJEb9JfjYxEkoHLgnUQmr1N5mKWnYjxYRVm +rln-relay preparation is in progress ... +your membership index is: 65 +your rln identity key is: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +your rln identity commitment key is: d4961a7681521730bc7f9ade185c632b94b70624b2e87e21a97c07b83353f306 +>> Alice: message1 +>> Alice: message2 +>> Alice: message4 +>> +``` \ No newline at end of file diff --git a/docs/tutorial/Pre-requisites of running a Waku node.md b/docs/tutorial/pre-requisites-of-running-on-chain-spam-protected-chat2.md similarity index 100% rename from docs/tutorial/Pre-requisites of running a Waku node.md rename to docs/tutorial/pre-requisites-of-running-on-chain-spam-protected-chat2.md