From 2abfb1d0a7dfb3ee5e31c2fd87e31497678de421 Mon Sep 17 00:00:00 2001 From: Abhishek Gill Date: Mon, 6 Feb 2023 16:00:23 +0530 Subject: [PATCH 01/12] [KOGITO-8167] Adding event state timeout (#248) --- .../images/core/event-state-timeouts.svg | 1 + .../images/core/timeout-switch-wokflow-ui.png | Bin 49122 -> 55700 bytes .../pages/core/timeouts-support.adoc | 99 +++++++++++++++++- ...erless-workflow-specification-support.adoc | 5 +- 4 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 modules/serverless-logic/assets/images/core/event-state-timeouts.svg diff --git a/modules/serverless-logic/assets/images/core/event-state-timeouts.svg b/modules/serverless-logic/assets/images/core/event-state-timeouts.svg new file mode 100644 index 00000000..dc7c5ef8 --- /dev/null +++ b/modules/serverless-logic/assets/images/core/event-state-timeouts.svg @@ -0,0 +1 @@ +StartEndPrintStartMessageWaitForEventPrintExitMessage \ No newline at end of file diff --git a/modules/serverless-logic/assets/images/core/timeout-switch-wokflow-ui.png b/modules/serverless-logic/assets/images/core/timeout-switch-wokflow-ui.png index 2ed8bdd2d08619f53dd5728bc2f5091b57d64f2f..e2e63cddfbd659a8e520e1af5bf188f2da0ee6d6 100644 GIT binary patch literal 55700 zcmd42Wn7zG*FA`PaCc~d;!vF6QlMyC+&xg-HMqOGYbmb5-Q8N;-K`}!!*k#By#M(; zGauglB`3-6IIjI)Ae>cXl&!G=l-z+S!<~I+-|{nb|s7*g0RocZtBjP{YVc ziL1J2ovyh#tNvOZy1GaoDS~3lqQp&mvF8&FgizGd+*+|~R(C)h&pK1eX*I=g2*jnn z;1{9MQlQSF(!~Y+FY8B$2}e{ioWZVM>vq`F=+2Tn#A+j zLlL^6No$T5z{YNZ6rwv#AyzF?d`a}veYhEd-8vK+^YZO+8V|GTUg(63iC1Q}(v zP9GFGal#bV0M`S(0j&vVzNh>vl{k$c84sd=rzr603Dt`lVfMCQ;r?p8%U!7obohNG0d;3Cr`8<-*D5|W6UMq3fBvVgDg*}O$5u&}3J zK9zudgl)zW&`aW2(L49rq?xsD9zXG3EDoG^EbS5`Z}MW&lJS&|b~6;j z7+ftah+f`QTUt*H_fX(Vel4%U5CCIn=*4|5C`?&S_kOwa!QBzf9cU-WT*}^|=WoTC zXe)B;T_SS2LS;p*K0Cr*7n<$N9Uq!A=kmS(yA`7MIw6*dxnTV zvDqr(c4>nuMm;3VmHL`PA-5;lk}5oQ8MzM1M6Q8s?X#EI%eMut9UCpa-n%qBwjaA; zS!iUPYI6re>A`(dW3ProokCenhO|2g7VE7PdS2Q6X=5SrUx%Xc(I8L#Lp!1-`@O%c zSCgeXfqv76?ioCGilMe(0jF_`2L^I$n{XPh^%LC=YoZg#skuQFx{Rsh*JbGTUHy># zk|jlW*;!1Aq>WQz-#l4}(+U)kxO;v3yU6PUp`eDqCy_Zj%E85S#5BL#Ro=hfY_0X~ z5%p(>3`QN4pCZs}BtoyAl&c+Fo%bl2jSdQ`)9&`%o*GPrSD^db7*ToR-X_{ECqoXU zxnuXwiS{t=Zd`Ux$li^nfG)e$(HP;!5q1X?^cdQF599|7V0PqCRGt$6VC1;KwbO@{ ze%*)r+j^3^ZCKLK9RpQSXS&3MFC>P%uVu|d!0?dr$o=09ST>Mrj~+<1ZsUD5AJ{4L zqIN(71XDPPXbnwmc*{YHz$~xAZO8gBRbXrV7x+w#r{Q@m2-i#H*pYLbT>Da26y&@) zkjQ5}x^4DR{?^v)9!p0{o~aP)CxdEh~MPOIzC zO2pll->vKEJ&_v*(EcM-yB&{*8s&nDn7Sva){!NP0aefCSZMqx3-{(x@>NN9f=1j=kV~<)xS6QWwUO&OGg!Yag)oz23#Kd z9Z|kVaN5WeMWmr~`|1c~@Ibt~KHAS1?rs%^1N!XQ%nW?1UG>o9P;Q|2kvlYI>_ zRr8>M3hkT_GMLD2HuxhVtumR&*)-=@8zB)eUU2db)1;}4Ej^I8YA^OuTz6V@L?d2- zP%)<)bGuEpu&Vp3vH z3D4N@nLX@*YxQqe8UA(Ye}c!808$e}P0eYK)Swg|r3G{DyoVFtDb`E{t;N0_%ajBug_;ZE!GRd9Sf^hmqVam* z`rZVWc8|5c?fhM{QorkPu+1Qb+B1fhDG{ z4Ae8leskeKFake@BR$7UakN?sV7xLy&?M~9Yn`iY`b8>YzJWmr-WpwPeY6Mb}Xv@+`VrBA$C2i&Rea2fU6)V#|{7BZ;k-7i-mVwdg4?1ZSgK)GU%O z%8H_^immKx18B(6XJyB$!=dg0;-VIN@seH4j0VPY1==7N;TqhITw3qU>AViWt0f>8 zoA7e?Yw+p3FMAeLH{Cg%ut+}b?(L-{m+tF-pTQkN$C6h-c`oeaah-FeI#TG-biMVg ztnnU;1(<)udbn8j?o5Z5o_;aLOuj^Bq4_6j`8$dW+JDUDa-mx6N3T+1QZb1b3s~AY8k!2&F5$hshT0Lo zqEx@^du0_9$X?4quKT-WW*~CJ^dP+Y4d1NC4c&45*q%&*)Y9Ci2%1+n-sqPiXNCSt zs1Ev&m1yV$u`?OXp|jya_ABV)>pMMZxW5%M z`g_YM&Ft-$ykaUQ&L$paMVBTcqA58LpPEc5&bNfU16Sg1PQLz5Ri5uKeQAnP%<3vVCIBOOMg z;OUbTEcc5H%%Ie0<^>;Kwhbkf%+Zm||MQbN&1+CE21=r`WsV{67G3bT*&9V(1Mn{U zU5qUt2og3h{{7I_0IyGwpJ~(Qnq#e5pHo${$Llv$lewcq&`XJLA$k(YwjQR;3BMX(4fN z`*!YNyrjN){;^Q9U=2p(Q7F-JHayy_3y?bmlPJefh=pAUuUG7`tf`iD#57Et*^tav z=d&we0e$s84HU%T`slRdf{JOj*V?1Zw9Ga*OrKkW0A|uW$3uB_(R4yq_lM8YyZ75@ z)?RdWU0y^WH|6*9`VSp>X{MeSR0^R?ndqAR4Tn-EpZ_xtRkF$U3tpwj8}Mm6P_tg7 zy8S}IfpgC-T63%6c(sn!17r3&Lz9?&0(jD!A9g}w3?p5es&2QULmpsI3M@R+3GZLUu<_3mNvUE z5Y4?eyMXkP2$|zoVm2>Rey)z3V)exhcCa&?d|Goa?>c2SD)lJGA5|Y}OX(P?R8}%G z+lS>to%fe^zae~|vWBVhgg3Q%jm94`~Us?L+#? z%MLAKH9GRyP+09q3GUk88tAo!m}nX5T4}adOl#QEj1g8|(-B+u1IQ)#Hfn{*_Alpt z*ELHJyWi6}1CyTN+k;QF+tMyNGkRsH6nA$Rxzaic(rSneKqTxfkIc9zx1S~~NwiXQ z7l(*qpE4o)wuN~qI+!ue?UDarz4>2XI)k?iPx}XkjBBZ2zNIPqG@>T4Ho?{sn!>3_ z85K{wd~UKe2Q4YACr&oc=#glgTw$D#gH1hXR*?pD_!9MReZ0{0fFV?WMmtz*@v_O5 z?|IhX-4|OenJE)uBt8u)jSiO!-0ajU$UzO;m!1T-C?|9Nke?yvj{dk|-^>!92>)SX z2&>1o`#|%p1>{PozheY#=WE%Df?Cdd5QDP4C<~R9i${#CdqH;C%J9HVq^Qh*09*`l z&3WZaWGMM)_YX$zoU?(X3d5IKiAf+M#?)Xi%jyv1%-9+M40%Ey+&U~ua z!RLL}t2IHRNaM{K%A_@|FLg&)O({da0&?^Uj+?YfM$Gm~*{}OgzG=0V5`Qy+>)v!| zW9F5|AQ?{9aNSusNR79{pwj_ejjPprRLWr~iCEzmPKkz}1IpKj9gBAK{`oI0s)`w5 z40=~Hy9bI*h2J-b5rZ28IZ_Jkr49k45rfromsOAl&u&>)`0$Acw^+NVsH4I%%(c|{ zaf}FtSXn*@a!g+5zO+;{@3?zEMe6?I^Ute`T$yC~?ehv7s}Dw!lv$hV=kaif>{}1| z!rneKN90N~390CDk6h~5CR=ZRMT?>G;fw`$q;E?CW^rWqq!B6Ime7Jczu!#jlP^p` zO_BcN5oU*NvxNfbr!B+5!G-#Ea50%glR!4Lp|UfC>YgJ{Ukj*vx1hupbgpon?Z66Ze=;sgy6*KIo0 z5qUO6%LP9&9|h}2UBz`gI8ipUWG5)EZ`BdL@J-cAtZ*F1hetIZ6Lmi9eiOMj=4Iyk z%t5T{QmCXa#QHrqh2K5gq(Urx{dCDbsZsaUCcba6+g-x2|V!{RAurLns!* zjvR2H>khDi%e?e#^KlR-8uq6XbCFfuK1CXJ{55uul-4zqa|#jEb#KQ^GrsGn_>@W`IF zV1;xvYX!09wz~l+9Y^I_jSy>G3x*cy`iKdnGb5=Gt)z470~!+$lKyttO(#^H+CL`Z zonWN=adVdhHmdOC<~}9JzOTb_-21?i(ig<(C4^)*`E~upkg<^JbLEyLCNhG!MWQNO zvv4xH?WF0whTY}iT%u;q4&sG=r&zXg!DJFi>9o?QSq~&YbSI zQd5dpnR^Twe5SDlfdQA~qJC*3260DnJ3~~d+i8jFtzCfxlYZZjaP*Gy#1%7VhLLoH z{Xkq@mE!{qVP$`Lkq&+qv#{Ultz#XI^C-V&Ixz`fe{6O5h-&mwFWEFqh|#ud8=~ik z4kQ8(`cnF)v(KS%3{L!Jy!d#Q@uHh$0o=Y~`v-M>)p%__iGw}!ngjl{e%ET<33j7B z!7_sN>zEKjO1_}g>|VuUsNeE?MnS*Z3mmDqWTk_^X>&IF7MEY$nm1UhcbZV^5VDz` z|PP3%u7TcMbOaziv=Xy6=dRK78g6j#Fp?o z=6eTIS4%%=k7q5Jb!HpkIbsgkZPdkRtg@C%zaXd zxd2pUv9e^hC9JK_Uf27k_XgRe)Uraphp)F!STAn<0h<{Kkn=z3KHZkQj)x}tnEsmV z{dwhao7hBCXiO*N_gZ&c@#etp2*Y7Uc*g8{ufJ2H^`*)NS1k9@c$F(z}=Y&Wo z1&@tb_9Lq&?!JO)F-Qqr;9t5utB<-r_aGPdCkCO~+6~~36LR?hFMyFjOl8DC3ijq8SUf5-+bW`V z0Tz!Fq>wH=DGN>NlIA$t)Y25d?P&wCNS14LwMpZc9|&th#2a%%6i?hVFY~FLb~Of8 z=zdNoi|W91AeH_45Tqq!j86OW3+>ex8h)Ys)AbxB*IGNg&&*+y@Ln2P1-{gh>j`o~ zf2U*djTqk3`ws$WQJMsnx~!0aPT8F!rP5NzVyz2j`eA}UVtLu4nH{Ig$cb)P4NOxe zx^1Me1pR&X${+ej+^?w%N|fKVJ<)Mu0KwE>kQ)@S*Q#4$IYsq{f})k8u4=rtd|O<$ zfSRtzJ^mpH#zguiIG)?}EXNK^TY5_SyYz{~kY9nE_bd-n9vEq>{z?-&D2*N;#+N2S zL@{#&ug|l_fKwu4)okcqn&fh*4pIo>4!@O}&PSLHmJF@pM!Roe2{wsS`mUoP zbVnSIbzHO$cX{?dRE@(CM-54T5vLj0OLSw`%H&PZ0&DrIcvX4ayf)jYNDQdC?hL5u z>RQrT;jB9IL%SZ~3cq2lqI9P?V=9Y!U{*>pnHLX!lMuJ144zzm%NS29+4u9y1#$Hm zeU!hjEeQlSwA$rW`OX4mCxeXw|z4 zlexWRwiPu^x=)LmNE$zT$r1xO&?f7@^ z&gc*Mqew2qHy0w3Gtk?pvy^xcl!rn}2PxEe-65G-h0~!eUG?Uhq}s1NglsIeGe@q{ z@*yDMk)%qM$8-?8K6vQ58|xH2l|-^=$3F47AwLgKbyXNYH?5iO0k1UugFX$+Rk$!b zQ2HX7Oj0O(wg8)BdCQ1y^CF|r|6S#>xH?*~zVu_Y{ZM*a-c)9&$@DH{@N(}U-Mtb< zJKKp89B9SHNqyu_`BVf1P2B~>mQI|D~mI zaJrJju>Wsb_kTqb?x$~I|B~lX*uO-=%9Ii#-#MgMcU)*Zm!Mz{b-6x7m z&z9f$1W1y?E_(-AkyKZr#4(}?LO`ZCvzIzn`{ID=fhgVoN%})LH7)H|xnzXi9I)2g z*Nh(2uTG9P=pUHa^1lQw7E(kEZ}h&b!Ue#=Cke&*RupXGe$KKjc;}+@{_VMvQA(7z zseh&%ek~fl2 zbKkXrCh*kKWdx04;D4Q6&{Fvt+w%;VSAHBZu>9+$FDL@KTiSUHS+V~csL!T_KnVk% zt9&_o3h0{@t^LL~`FHk$pl|A2^n!ROgJ8qM@+Hp5adIX`YFF9xvpY0>uSlpil$#Fa zjgH*Kej65Hhbh0gD2*0$q%hKULL~BZ@!n^WKPf%2M^9HOeCU-Kt9TqdR(kc@OSEoJ zWsJw8BKsb;T1mN3f8V?@Nu%TWh48oy{Nj%mapzT8!dYXHV{}SxPkHQ>&Eb%-b?-8- zj9Za%t*i9GSz>0x@~hg$*-h7IvlhPbduY;7mmndM)0}*u-i*~ED%4i*@$^jL z-3gV2`yuHusG@mV{9`e)+z0b->W_=tw=)ti={C-QE#av<;Du+fb34z$(p_)EY2e)! zRT(Vvh_Nx2W43Yi_epV={8+1C#OxQ8>)uGu{Fz0(y14!L3<^=%ID03P>+cbXfyYOJ zDX^h#eD{Z;PxMOd2Q2qWnE-yhh$bBz7bM9VGZY)a)(aanX{pt+% zb6`+n`<*l!*a3b>_?l_KjVXJ+)%Vq}oa!!kUPgaA1GDp@(leHs@;+Dut9`UlJh6HI z<=)wAlgIY>7=58FI@YcuEEcvx3~BA24f@B)Z^Y!;E%&3*1AE2Fw;1NLV`RX(53W*k?T@IsJ_AS2;Z^s`?Oqoj={s*2H!7FKV;IsFi(;Z$_so^7 z_R;CA2%%ZP@;~S@47T1kBA@y_HTmut^&iZ+yd33gdP!$|y3=)CMzAxGHImMBFF%5^ zpFhIDPE743A575+-%*IJvEyXA^HO>L^oNgT1-(Gd*+V~_ju$U^FBX%Kv_1= zUVZxPblmFQd}+@8P%@k;CWD7$>dzmk(z-m6m)2D>oQ1=!s)RGEl9x-^90c5+dy7yF zF8f9)b~R_XFF2!Sh;qd*?q)l=1nNC5e?sl`UeJ`Yadldmdf&Wr(HuIJFnB$32DYD9 z&mGTr*jfCXkcN9_U9wed03bu7VL}>=s=G4O8P>8Q<{7BrCCh@HZcQFod&fFyZErDj zY1+3|?WI+Nhz6JM#uq80Tz`mj?B!3iPI<6bENbY+Db?T2C}}OkLu@?S`m4Jd9V2#< zlVuV?hWHPOvB~xoGG(=C>{fd!AQPzV4P2(ZqNd91@FhNf7`@aJjs0kM95+Pim?gEr&m?){5JF}Laj;9M9&^M1iF~j5w0!3% zcJ_D4;F~YG3D-~nMY_<-6`P2bj)JWrHu!=5dQ}>5NQ|I$!#n*FP0I$(wi05W zGcf3pwsi2mk>Gk*0qCTj?Y=NRrZuibv(hKcDOrwkF$6y@uZ;CtW_p;4!&;KC)qTe3 z`9gz1lF(m&AeE?Fwh=*OSJV?s25bMGf%A1_5Lv&NkJ2ZzBfG5>RPS6J>K8`cieWKW zN+gY=_W-vaqa)tW4--kx&}jD83}+E)=GcdR|KU-=WV({_X7sel9Hr_E`Q;q ztf8ze?`w8yU!AZm+;%UqixS!t1}05W0q4_@*(%F}Epn`P>cnh^elM9choclO7AD}` zC=;tmPmo%aCjP*@Mgqw;SuS0d_4}h_<8$wy@NPVf-)(X`PF$}pVn3#}Oa#wu<#~*` z>vz<1K9j#i3|Zly&^g(}HosS|eLQtOpg$*H!@J*^eN7$lQY$nKddS*KsdYw@Nb5@B ziyWr5i^C#ryksxK{mvF)!KrIxytShA%3fsu)dJM8X6pzTK8j-+TXp9}vKybCo%V78aBwsyC0+@V#*`%&RSDP+A?SlMEQ zf!TiP7@alBMa1m5EoIR?G#_R z9ukNx-+`W$71Hl{mHBb+y2e&;H3=10zO|f1@gl&eYvPe=8{STCEg^4gLuzuO+W)9- z*QH+H6WQIwaRn^c9*Rq`GDILVR}0$ReoA54P`ayeYA$g3kTd>k{OLQIGCOLa$3}jZ z=L`q=V+t4e!8FH{As%9TA)`vM^D+I#{pE#E)B2*D@gOR{)(v=LuCP^$eCxPTuaQXV zVZrx>T!rfUNvug2(YnXfSQlSUO($V0Z$P`X1u-lkHYrkvmv&SPd?Mgtl2?}pc6r@+ z<{bOy_L|*dim}5@y5Vh45Ml@y*JkJm>+&KDI&P+>?h+C%dCh}HpN@e$rvvZ$sVeDM zon1#3FJ6XAZ8HcP0bfGt)W3_k-6I6J!O5cBkmj@AlZZ^eVgKkAf{028)kBHKsF(`4 z`|N_IQ0wlbX?fp-9ckX__&u^-A=HP^t?{PO$lH?SQJqW)Jhf?QbG7La2kE)oPSvjq zv{6u~e5R}nOx9R?$quoDbf>>#K??3!XAN2K`Itq8!tkfIxs=b;hP(Z?aO*)cvKlFw zvYySstePw9)bK!`ZY)lUfM}O1M)a(;3kCU{nKi>*ZJ+wqHVco;qNW1T-DA-AQP_Kyw0-}Bu( zNgC2xkN8p!D<0wRSJo=@n?qka+x%mNsJv^_!*(t_?@J$jP)`G?J6fp= z048L1vN0LhDYu<5yeBr<8QItL5Kl9*R> zHVbMY>=IMv0&2?$x!7yIcSdMoOm%|p`pvIq_6V~n46|x@AlsY?x6~F{sLYX@cRMUq zC#sbg8|XGO_TTx+XMc@-Z5+^Yg{>7&7)W1ZYAhvMe;%yi>M_1mQ$GULK&0K9QXdb< zcyF65v=Q1Om~N3!qWwPcBx~Tc4TRAYGvgkDaN38)3SA?KCa)B)AGP@BI-WMPC4Y-W zA`SZLR{Fbj@mgD%a-MibQg(jMA;5w!A=Y2BxYA|z^;c8t5UFBq{4>Pa$KmTK$R$tf z{xFlGyD$y6eQ5TZ!}$}^99!6aLYiy{Um%0}UV@K0$^^?B#5Hm)iSE(sL%kxry50pB z@yYF$0uv7RVUT2So9uX?;M|eHp74fS0K1nr{z8<6=0mywO-jh4h6A+M`gab_=hV85 zv09_79MW$hpCWIvteH6WOg^wM#XYeGpVkIDy-J5ip;qe`eg%9j;Ad`J?ib-s$Q+VN z@fG-4mYSn{y0@|+th?NGdXb*plx@rpY?(!#)#(Q|{^s<*vt~#)1JY^}0!R^Xb-#J= zSkoBB#_o|fsr>VS+>rT3{QP_J{Rr1DCDGl zkqykROuwrBP{6tw#NXP{6vA9`Zu(G@5`_VD7vhof5CiLyp=oKEg6=F8oAZY_Q)uvT zaPC9Ppj{2OgJ%|0YQybUb{rlfnAc1fpUmtepllA!Z@Z-^lKIsIv(`ye@kR|>qkeHUKE}jy1NHc+2~>pL{8i}1>4x>`r8xCmk+!Im6o;Mlt2H&{0MYSX#J zz7<36Ob2god6a6UquJLh*Q&ZY%;_|!QKmVvDVu&Id{Hm`bc87r6KS?c3$7{Q*_1F% za3C1Oz^ra&Y{eI66iyJH-JR5fVP#osvqySMdDN)^`*)hk*MGx@&lFKB>iqZ>exGN$ zE?k;8PS5>t=%>(pVylEGkY(LHu0I|&fTfk&FROR<-h0Meb2nh_VLn0Vl9XQI^4hy; zAW}mM1FD#kb%IeA>veRidDPW2hmjK!M+$4;W9II_V@frNnT8x*Prt6)x2iW?RWEG? zKfw0kRxFp$(6#S7AItrqeC!a@cDu&_jxD!^cqqc9d0))+DXOytN{;TL)iGfz-@@gb z(&1uXfmJcx?-5}`6`1k+j*?x2HN<%t-=`%Z>2a---rpZXaArb`Q&Wvo^VL@DNt+`z zJNx`t!{$7Lx7X78umoU2CYT);vGGTavd`S>Z|*FS8%_u$t=fyt+{ufY(0hxB>VB3O z#H9qTSHjWM2c7XWMH`JIxj47E(COLg$))OOIPBnJ$=USEUG2Y>Igh-XmRvNIZ7xYs zYzaRD+i2RlzddR~HHH$5*WGQC*$0!ITfpxwsJ7U3nOTA`YvVd0#^2<0tWnM+jFeN* z?ew-C#f`KvBeVRoct0du1Gia_OEF{UOE_Ye$YP(M?qWMAU*8FP-_MxqYpP4Rc8EC0 zy``Q^<TD zeD6bi2mIEsOXjn3nqTik#~g{vU!?;_z=w8c@?m_W&rBK@&jm#*G>Onq8_#%^6>u_rY~!4$=@W!`v6&&1 zmN{vdnqgf`l;LxU->NtJdF4*?)02amuQ_6(!6seaMA@nf$UvyG0FIQG!7re7;hq{U zFrap)U+bvFuct>`b1-;F57NwWzq?BUmsp5ezKW>+o^ytfUN}^Uotvfl#3+kf+ab%H z|M`k&Y!q1{UmP$7np+?_&$Ude$NRX3O@?+)evkQ}j?Ik{M1Y9IPFV6r;oG`{i;ccf zy2H_|!uKapGBZ$R5pqZTC{|&AYJ#ueK&hCoj=_&~V@HOtA9ia-cB|Y?HDUvQU9JK{ zN=;bUD2%RD?0%fV6?XAkVN}A@0V;Bi=#0!8sgT5!P%+LyS3cztj<^{P{mSo90dTr1 zx<_6{;(kQBE>UATFj`2s?|#y!S5R9JBgkLNKVHge=KnVO`=%vq9%13&hu9VO73-A0 zjMv>Kd?&2*9GX6=&sH!v->&P?H)mmeU*rVG5ES5+8)``Gv%hD8uV-bmsxf`RFMLj&F{b@-HBt;0qsiLS>68)-wt&PFQt-m!Y)s~qck z^283+nd#_*@hmz94UVh5B$gw=U9W_by1SHS_zn!;O0E3+jOEI3I0 zpD(fEosNBhJ$sCL@mqXV#={dgn+VfQ|F{im{z*^^s?wo3cn16xCw-wz$ax;1u1b$L`iwHa}b z#pep3t+7$|lzQs7>$2H%e`KoD#wyjB!!+f+kIPN9D>WElx*dYP=P3?ZN;T^X>2WWo z;1a@bTas5=&(HQr$|)eT=Y9h+A;_K71w5sCP!0xz=6C@E@9wtTuKvO%8IQeQQ_~7%k}QJ2Oy?c<0%c)r<@Ug}lUu>h;aFhKNFK!p%z8I@4fWO7p&WjszLDBZ*(a zcs5eJnB8c0(p^5ke)D>vW9hHw^GGBMbg0pxZi=#1*wgm0W(hnpa;WNBerz$l;M2s3 zms;$0wnKP{lxrMDDeJmW{bdr~J{-A=8PMNpNacfRmMFEnPuXR7fwZJov zPc?5oZF|>+28u9*;2HO_T6eEn>JPH{e__xO%CW}T=k(@S+FSv}hGEx`EoLegk1O%O z5-RH>b8T?xLJ6hTtQ{oWk4pSXU4(0(y<|ERdlQn*k%&F= zB@si@>`^e}A@NXxdNhDdl2!lER*gcQuqa4EH)tST?$>hJ=H}k7WS2PclNIEuNrxq& z;!MW#31-EF6ad~gI1)PSlM~5miU5q=lzChgz!`kwADI=&s@vQ?G-|IaM!yCy!vqi>zoeBDjJeJ)%xiU`WJcCZ9R z`mh>W)Lk6s#7?9NIe3=)Or2E;i#M3(8+9ThLHuFhnce(4S_TsPSVAB{K9#J3su>Ew z#bRzi?~eYOu9N^tT-NoL|bHpTSKG<)b2!m*-zg5U~P?u1*WJJGkLlS z>PZs(7_H0^UvtwsA=;40)+E;&R{AU-)Edk3#5=-YqZTB((C9xbz%Tim6RzqMg^is< zpT=xa+rbVjoWY1JN_?9Bx3e$9&T40|2@)w60Wp0EchF4>q(%TprIZ7g`I(?8csaaZ z(X$b2ck6d;$@Q_k-Zq*Ip7hVYkw3Xk%s$FwL>uF4%B~g&LyZkEktL|&{GZV@Yl`o1h)Q)BH2gi!=xdw1jb9Xu{}7rOmAp~^8}IW} zNvF&$j?{vGN7&01^8WJjb@e)+rbbroOs@C9;A8CjNwVp>!S2(MGfS!miW~ZNxxTeC zRQ5$V@zHeMMK2Vh>?e3EMc;6sW6VzTo67S|BXDjrl*R=l*EbW&ygTj^{kGbUh>F7- z;mWqt#u~D?lNeTG9R#tHj5?7K@o}N`Slh8TGo3NK^Z4_9CTe=y;QsP2`{D*yynS0J z#R@tzy{|gL*$Q8Xa_P-zTL`Qi;iD@O=Vl$=q3f+|D=Xy?GgPE+IbTmM9J4#QD>W+2 zN7q5(=9sAAIc4GL^1HsG3dOeL^ws#yA!HLUD16Q0rF1M;00Q2CCe6Q{8lF?kRB*d` z$%kNkHeOD`@;Kbpdz(RGr9W3@xx~!3{<`KlAGu8`RKie zSB6nMa*Xl^MZcmZn48MC>l2%QLTZ@dC;8{D$rvyrUq(XM2|ZirikzqXxY>mqvj%>Z zYATT0@&9#c{(;Ah8MOMmX#sKokC6)gNVz@^2D~~fZH|6p74aFee<8D1<3kw_g6@+A z05zj*^t6+N*S7=k`-C?kyO3vXO8m+FtQmL%QxrjhQJv-u*)sKTcscR#siO?Xepa?VA|M4M(@1f zkYw??;JwQNwA8r3kXS*lf3xdNGX-hVm<6to3JB+jhHnPl+s{W{=qYlE}or&R)~9jHb8o>XaedM3u*jupAb*5p2=({l-v$I z;P6;AKK-J22=1|uB2ZiyJ3pvJ%DtR%6XkNSgr$F+j1|_K`@SBNg3)IhHTgO(8gYC(8)S!kB|4hbZc?|`h6(a(=MEH(gEv0~Q2v?q?s z#+%Z{{k#8GdZS@Lo+RH%90Qjvi+VyU-KlP2H%edr=1`Q9RL+;h%Q!tfA0ur z(Y;;%sO}&}(nctKYi~e0q^)DRA$`D*0i#kfizv2EQ+R}9kF2jq>~OY^c17$fU!)!R zD50?8Osas3IQlbaIn&fB~A`r^wu!tKlDOL3hDg;z@ z&eL8v^*y3vY$S=v5_8+xayFkj;PU(`ExLW-S4Viyy<3P3@BT2irf_eLd_gGguD}5f zmDwrUj!h!K>Dw#wSI9jv9G|XXS|NS^$7T{D-XnCqC-MUHpc2q01K{;G=S33*R>u5o zJmjYhE_Jop3l;$0K~|LN)vquZ{eME$iLd2#D|F&|7#>%X7U3*rSpwPyd3O@{{lwT> zXoJ=4E;j2KSJH?N^Q>O6Z&zqr&i40ry_+MIMVET5lu!Upaf>VgMgVz}hF)X$rwoLT zqRT_*ROWctB)ubr+noHEP|q%@`wiSqr{DBin~LS*7=O|j7LK)-G*jtb z2YF5-J^2q2i;%)e;D%?r-Wj>Ch!<-vL@N_L*d@DWW_n&~r2A(EQ*u|i*x^m)_%&G_ z`tN=-0!_lEJEL0^JdAKgT&u%2Z|UCIDN0aa&*5Q zx3pEC!+-TslcSA#?&q-eFS`fReywJ^sD2;tpItCqTQtgw(Z!abH`_{PpriWH zAv^(@)|U>v{}%P7q+(dra8cM&AANxyDudg8I{eNn0mBCJxdQ*u1jU;~@_zY$B@}w8 zMGf)`nvCKvLq~mGB>k)yfXjL={Hq}QLI0m&i`L1D8B?U~-{i$DN3JS&nOx%LAouW~$Rn;Of@(uiqEz8Ia+HK@k$2Q*o2%m;I88_oLjHKsY>#T@> z@#2RfQflBlay8YPk4%m0wnq!uQH<8meSCVtlUovwyqa@W!8VLf)k@`~d?c?Wbjvp5 zYz1(m1)VCSK^DhYMaABTbYSYMs27xiO8QE~{)x-0&^QCu1u(OMG+ zJ?v29OD%0cMA+wV2;$f*&PTFXtnY&esZnWYXo{e^=dM1!@5TJY0z?Vs51u{m6WUhR zJj`9$M}&Y}ZpHdO(bI(YQs5TkO-umiNqWO6T=ZXo9dMP#oqS;879K&nek<$+ZVk zb+)?)5+fQjo#b;vub>Yh%D)E_3}$KCf9_mle!eVN3mSL=;v&NkU#`B3h_}s9_Vr)0 z+|A{`R&P7Vb`79Eqy10+G(pY&RigeX!#SkNyJZ&S-Qkz^xNG{G zODT#!YH3muF>8{_0mM&L5(sPm~j?#03P5c$n;0ZtR@M@|+~ouFgGK zAke+0Pij}pJ7`O#ngS+lWK-XTo`DVq7wYrX+W^bb#pe~r6bgkN|K2uREF`F<Wya7d*b-5^m2cBOm27KgN5MxMs|z3sx9 zqDvEIKScUyzBGiz9qu)T@4fK&Rv{lq-2>B6$sm^cn&kqeJ(VTK%WDxaYWV>K#sS<~0tve^ zS34RvYm|}+Rzz53d;0AbxL>}QI0cAw5L7pQn|BFx0&%}9u?&FStGYY&jbJjPW>Bkl zPc~l_8D>3i*Q48~z~7kUI*U-2`EXv1!sd#CJ{P55u$20(S(5XBUsdu3Gs3NnQ9C)X z$YMf9o_iy=08jCH(;uoK&BowUQ_CO*(gZ z(hy2au}xurFGqB|!=GDkbFW+znBUZ4P^`4$xh?;k8Fq{h5NXZncC3}%B zll*7L)4brl*u!mor56z3tELxj@SeMZYcfw{o$tUKkeuTedU; zNxfH9xQuelC6QFw(c>{|vgi3T#JHII7rP-y2>jyZ-^FM@@JXMb)ts1$_ijg+14})g zbQGIW@0a4L^JIJj?R2{N%DL^{O9-&@J9ILf`l)qU{w@|j+mC=EGaDN#lw@^WFKR^I zKS{u+Lh98s3>JD5@BtzbU*Pc#{?0q=di-_LEp9ZvT8r3|=efuVK8G-gfDvMRik413 zyf}Ww`2EM=+cc-La?7<-s^fHV`~J>_VJSuHpRetLFu$v2gdni(a7NqNNbI>B9>QoW z1O!gGDu-toM)Ew#8KerN1^i^7YY#ZhQRYss&s%PqH>Y-+y6Eea7Aifq*N2_kChgZ! zdg^YG+dHB7Y7#uqiG^K{52Hn&uf_feqG7%TuOK*aBh58NgL;wE&Y0tSiajK8w1%bJwsr6IBNd@kt-dGh#$T1KEDj@EP5gg;nNDF zbTECx!_LK`M{jnhyYz&GUk@z{#oL^ONGyE(%sXmd>G$Qx_J?=D`?hs}#(4<0#! zjA<_hBxD(=uQcjmoLJfh1MU(#wvaTq1PTptnfqJXg)Dq-Aw*TXNR&oS4vAcqpS^Dl z=9(LY`^k3@$vmJu&6iqsFd@`7k-({I1BYbqZC z=sTUa^F0D0fUm2OW?Yz^-&{I#{73k>4IOy~S~nH+SG0eTt~_9@-Ix7V`aaRAb>-a2 zJ3v)jqj0|B$a%4I^wU^VaXd_Dh!aGFmINCFfeCuBTFi!26bErfayNE|2Xbd&RvL3w zYG6h~Y&XazQp5P-_u{}$mnHs|_;YX%4SYk{!YxSp&UjW;f>9Ac`#!ImXStp%pzauQ z^mXEXF4tjnf#4rGh*o$FivfqQ$sBj9of@dQI!^9Aw66Rr1rJ5~RAAoy0;ER9>f@(Bi2i=|!-(BgEk1V33}8(=_@J_; z3Jv%vXz`W*nWj2DcUv7@>$O`)%ulMsA;ew@4@saa2EwB9+9e>#aoOR!YiW^oM&VH| zXU?UH;18K?fbtw28cLYur2gVBSPvWSW|az0Xl&b{Y7Z;LgMjpk6;DMc9a1etiBuq~ zMgBp+K_q|ZU`K2(mufvzoT?B(evDkJUDv}7SY&?~U|FlQj~{!0j6*>S6%>D@PBj8KV2kEbh-fgqc?iONx72> zRcJc8y?&;D-%8YocG?Q|@jb&1Q;$OB(88$$RYw`YIj+KZ^ki5rv`L_D&hZEkTb0(+ zmKSq0TZsrM(@=a1yi98J$#)w(gx1C5A>nZ|4IFwc3K&+u2Pez(o)a9U7k+u5`_}Cgq8zo9&4_bx%2)< znG2&#vNw|gNOKV?EgYHcS7T46NojL4Wlj7j>LMpF5G8~q(AJBQW0O+U^K5b@E+n-; zF%3VltcSL&HZ!2PtA}%cN&ilVI6w`jF7_su0aup+on^_P&EZ@&SYLCEJ|*tA_}zH& zkMca#{)R`_&cY2)6UWlMSmIV6Cg)lI%LWya;h}XRjs#1kmN$L@zs(obW$tviHsxF^()&BI45U^PQlk>(Np z3zTiD9)>-?hCal#SoESpBv8fYlG@wFc%(ZF4$x)sv-gysK-KyqTYrF=%SluB?JKF} z@MPGxi>0Lq=20hedtiYiox2wUjN44Zx5elvmiJ|I z=88AHdV3MT18}Ey5NHP47A>Lfq(E{gr}bCG$ShsK%s-k_+13NcCZhMV2UH;^+4KxY zAYRjm@=lj>1JYfI?0%ubQpn-mRvE8qi|vj&I)<5F)CPLSNanHz?};f77CP+j1r_UD*JHnsFp412q{M9iG45R^3d|+&eelR@@#eDcyS%? z*^s#0BZquoTfFrK4bL?RDxbY_^*bp8bv)y_Y}V+-uSA7OWT1KF8s;vHs5ftL;ZOG< zP#c5wp{4sERx}uIChEh3D%2&6k^vlYz;5ewbB6Ju#zZgF@?ieI15Gz)E8pm=Y{!~%g_L8QcU*kMElTe+V7nv^iqqvRpA6K&vneQ)C9;_{yU)FT#*%%M`!0NqgGq* z5q4xH_tnJwE51t>R@-Pkb!HDU=DP`mGPKb1VZPu-%~ULhSZA z>_x_TLJmY}hl&`@cF*RWX$QwO7^X1@yrmMKnj$G5Ddz@ic&R0NQSO2fRk(k)*6Z#o zpOTSdrrGU{P=jxofCne<@N1t6V@BhzwN9ZUzs;aWEh5v*C__6}R+;Kszg7xA0*+3$ zzrB^GNr*fpZMgwuwN*kq~Puv3(`o9uk#xyPc80ATM(K(}jVKkgN^K0s^eXAjpueYup!B~mZ^kyJ__&F~*0aDTRfY>f$Gbqdw z`Ou#8%r$;>l){5#uivt?G$JQ$ZgD{(2;zLhYzIlO6^8}t!mT6Ap;+ETmOjK+Qe)WQ zM|;9$H~0KW2AX|LL5aWPO+e0VcL+yD#03MNgXkim2Lzk2xsiOyvt0U2Tkh(WkdTiyUlUhI6ATsm zx4ueP*w{Jki}y5|!NZ=CF*zS`sr%UcfH=GRW#=+QxNsgL`#+M8?deqae;WPkL6ra% z_&+xNzaHNx;i3L9s6M|<`ilPVb@TZhZ9FB~zuSw$sgTQ({+GaS$y7?T3Jn_CgY>^2 ze1B?~A{`qyaTMEfO-(Fr&{8eV;6R!Es zu|G!Dyh74)X%FUpDI)6E`4$T0ny;OeWeKW#3TfhX7|jiw97pxxY<=P(XD53n(5-|X z3A)|n`=`JC6Jl1CA7i`7|ErS-b>YANe~v6c^uGioBPat%|3f?+oe#@*+n{+nCQ{ueD}1fMWN{=Un%bV0!VRi29`>Ub9ebI+4Av zzr(*d{hvwvf8o<_e**|H&{w&MUZ?!s{|@C{>ituj6nH5@`fW0{*x=)bcQ{_|aQts#de3wfBXxVfP8P)gSELytzn$6{T` zzo~{N=*d9zP(Fjm=F36h2P_VhIIv;Ge~T5@sa?GsSlmf%7UVcfm(V`EnY^s6q~V9^ z>s93P!Zxg#Xgz>gof5INeO;O%%2=eYlj$8PHhSv!mtu`1_pe%IT^#02%o0eFp zz^w4yc-|W2wki<~XI`&Y&Z4?4gC!Egt<_vIaBR^-3@`TQUQURiS`u8YS6O0TZ-lO5 z9Cs5p`goNQUNAXBij%h2R;)H_CUO7muwS+fDzO(Pon{k*n_6sdM)(46Li;#lJ5xkK zKB~pe3ahB+GEpK7*gmWVLJtro8(E_)VfFuO`Rt%F_-ZahA3l!A%l9SnyD^wJWl{?E zhH}%Z(R33)Yn5>q7~us?OC~O3#GB5*IS}^S>I_CQkuAscsl)k2+OO;Od>M$Kg*Ds) zeQqWue{CX`cpMCcc1TC79wF4m{MeT#C0lbVX_mnU3o@D}pn!QBXET&FdI4=m5zWqPt6+wa<^ z+sWSD2+)`B-M9}8I*@OE^RVp~_PE;21wK#kyNpfqq!A@4D;H-nwa@0Uy}M;Ng7#_x zA8tI@s$5JUfI>snR=~hx5>%CHdkKgiF~$p6^#ZoG-i?r-zfyHrM(xkYRSSBw{)@3T z*G9vX!BwmnWX^dEK<%TcB4fYY$>!f>joR?b1PL@1>E~-SoUDd{o1{4IBxvJ4oe^#( zcK<=XuHKBO)w$`3Hd@I*ookb!0dm@lXB81030oq~H4PZx@~N)kc2iRQmD%vxA?9zg zRa_rDKXTrr?G*XpNy!oNcDreA`C0AAdOq+|4j!hD*hGwXcxNE~`{-?HP2z>WcL1(x=#_;z?eq~%PT9s=OoEH8fNe1KLd!6r z0eM83D~(ZbGKjAfy?n=DjE$Bv{jh}`aKOK`aTCJQlTQG#HKWBzLOJClKI}=qVDCxb z8D!VZ-Ohy6AYwt{uifA{4oWO!L6%Gh>8_DFEsXrpECB019q^CXsvGyO-M>@Ogs<2H zlUUTm!xZF47Q)M2sTgWFS7KAxu2#E~N?m4Oh}_dm*Ks%1$bu;|EPaE2nV>v3H#+hD zg>uKNV&b1!tlx8VhrEtkoG3%^D1@WZ3^e#|)?p5^Sub*mKUsW*bw>vmT)aBkSVG;=>W%Tl zT7Oam3caYY)++DjrJsoqep`;+e|p4i!35D0?G4lv9gnsoAlsEBpD);P|Tzbht#df z$Lsf((%nwE!ye3Ds;Pn7UQ7)K+8jNsR}rJh4(CvwXLaM9vP0+3&o?w3kIem}yhL8* z7H%t9lXBVK$#cRct0WtmY_D_S)p;Ayr6FmKf=-Mhd3QV1R@Y>R@1gi^HoFGRbVNYS zq1IuU`z`JEdP;;g8zJI%TZAc2X8dh0#TFl*?ep`H)MADK=AK_9gO{L0wp!)e_f*`K zdNQ|+hwX(!@9oO&FO7+I#R{WtC*l}1A?f&o0mF>q_rXSU(C65lB1sL8$|(K(-Kt^s zdh`Z|^&FK+r9Yy6fLD4siu$Z!rll8$%X9Wz<(qRcAS5m)=Uh)lH)c*RSmGb~NZ~0~ z5qo-l_F+Gw9J;%^k1O?8vP(MqwuG?0XPPb!v}M8+m0r`<&Vq@f67qKC0v zuLc{6lh5jP5)TKDc+}URCdc6-6$E1*`CWgL4a1$tueRUvh-ml#pC*XRe+1_m=eNvW z!$HQaS}}tf5g{TBh1Z=g4LasMDOsWLl7L${yF;HjiyMSNkEY*%A2U^*7z9D*grFA& z29w`xS)kcgUj_amo}NEuEIvGpxz?^Q)Qa;CAas&KzQm+Jc-qTRbv}{z4b_OUWJbqf zMa6IQD}P+^Q0?lCAd`f`qALLMw8CP_=sxrj$JB-c)!zyc&Dx&77iEH5@yG08#>_Ne ztehC%srw$oX zQ~xrB7)AX6UZmPp%F+o|uM#UAr96%a^VF`G{#Sc`#YkEvS&9{8S5+Mu=a{i1$TJ#rgr70nb*H3mgdA0 z3|_@@HhPY*8>NiSX$Pz9Wr3pb`+l1^4tTWg^H-R zmZ=CONm=7*ZDF={c|VpeQWYCp>@~T6+N{4k0T%dE{DdQ4bdrV=aQX(7HVnPfAZxbN zwe6Pj1Qf3IbizQkc1JY4|#nLZrnAJ=uU&c zX`8D64ZCPxw!@-camJT?g}xd1{#($Y@yJKOL&;6ZXxE(!{b{33(qRz>d8A>S4o#0D zNT>Ux`ChSp8FFVU9eR?5!p3iK2&x9>rwJoGm+ZLED>VX_o3Q_j)R61qGR(#m>R`h^ zUk?U@CE#9^S1*2eu~!Z+QcLqnt7ERP^J3zzoZWD~e3oE^u=HCn<903SdTrlA%mSLj zY&`Xh<$w-3^*kghiUYwhb8TuvQb3DfrZS%e21SwODQSx5Gdb6j52MJAQX;5O+J|4G z84Ua6{w%gjD$$KH8tz=7Etbi0u24vrKek3NP*pdry>vx5Bby_`Gg#Uz+X7dBN$MZNj<|#SiT*W=rT8K|awK+eT*_ z?MYsz6u+)v|FQVtuBVjCjvr%(9Tiu(q#H$F*L#S)0^wk_tYOiW#}#Z+Q?e{C-Td&y znY>*eSklA|;R`h5euT`yW9r)p%*{4B)~^P6x>@S24b$8#@!-uL>Jz88C%Y5{c$Cw4 zU88IoUvwE{m3ay{bgiV0Vk_uB>TYCy8EhOP(<%WqkX0cN)^=UlZeG9I-~JwQVVTZv zht6sWW635Ky%aOic4WlKEOVI}>$6n#4BJ%wz_w?~%+3`A&D6&TT-fU8*B}s<-mk|=6hwW>K^<@B$_v+r~Kls zCmm!zF~!&pkY`2)Gu7W2fDIQD0sNTQ@k5ldMR~>8KLqbTn@9Z28 zdxoVV!L^V!yMaM2ZRS@yK@W~PIRS!Kdp7M|h9sp+Y0Upww>t+akx+rucYCsv{Fuz| zZY6e3jt8DlctrsgqNJ%JYhYjx+^%-}kr0dvZ8NvMExw4z-gmi0(8^Vx>Ld^mayc32 zd=Svr&I3D3mrHn|VIjz{P`s3XdD|B~WVz+s@m($HoGVh(;cj5si}1;v9WkFJ=h7fa zEcs>V_Bc_4O#sH_=LV~Ks@><_s@s5Z?anbycurdk!rO+~^YVK`<#%izGYSDv=)hPUKU3Ruz17p{ z*F~)ozfBs(?0dpDou%KIZCFu>1f5(2$}3c`m7}x1Yq|$rcWCPb>VrcI@H99q^b7XV z&D6Xpil&3C^W0L;p}Xl=S-7y zb%&_A5t(pKi3wl+cdyCZzC#kr zt{275zbvr+4>eYQ6$&@IAX3Z zZ%0*e{P+#YcnsE$l;2%+D}gUSfwX0oOX)E3_W^d{Ct#*qSI~rezC>#)pTMrW4NtqY zkZ(T4mmQLSCak|}jX_Q?txLvlf0MTL=|ucR4qfaO>wj7%pW3_Pejss!LYfjN1JRb0 zidg^U$oOy;A*xwBLW6Q9?l+*ZSij`q5B4Xt;vjp+{l_Kr;mmHgeL#9B_G)Ij+IyGC zjj@CJlz{;UjPC2Y+29B|x;*9}`VSUhrIn+Se_b(Wdu}CBZS~D1LhF`~0`?)#Buug4 zcq0y0WL5t6JA(iX1lHOjR|bD84GNUDj<)mBH}qiffj1M@#9nedNnRfX{J&1>Q2 z_L^w*+u4UoyTO{1F>rNGFx!6H_mmNi6b#JtfJSEud!ic%mNhlh>fYcsFL$cyxYzJa z7DC!&4my;zEV=qFYP(a)Y+n;-Cv&60?iA7X39L&Iiaduwc85n&>JZ(pbidHQ*d~v5JLjIds*3#E87bFee~8ZDqewT-Ci@GkXJ-%$ z4{fIbMe+uNP5BlhZlzz}Vm;ViSMppdPjo$h&f2Oa5TZ=@1<-V%kf|-0KYHBat>hYN znH^8w-Ocf-oIU&Ugnf!?fp5c)M@T4doH0r`w$zNw1cx`^4aY*!hhY!7MRMERPw;0? z#{vh8>*8P45xAFbpql<9hsg*|o;T_tHaSVMKJ2RiuoL>8&=Za8l=Y>UaXDhP9Q1bw zj$ek4KMg_Q4vcCMjRA5(Lf|v0#G$0#Vri4|Wohf{l__b;nwIJd{^T8AMQ2xTC_+*`R- zU*}o)oiWb+X7|QHMSsmtp(#aD}LeT3z@* z((iTQTe7I5sab-{MAsA-osRIqNbOieBaXeNHA$2Rp=>l?1`DkEQ1{+n2a$TA1xYW? z&txov?Q9_RA$xnN1>L|qf3iZ<(iew7m#vQWhx;H-M@6!QABT~OBP74;M~2zuHZJJz zlu)y#KJ+stn>;}wlVx07F|HVb2tE?#s%Qq$zEOOzs=S+F8k403AnL+QB-@)>Fv1aLl(CN#pS4l%S8pYk+Qwd@X^`C--_UMxryrcT;4Rt4j&&(JWp;7 z*%6dvCe!;WKJNX4Gl{1HQSI}|BPzUijr2EvjfeQC2M+IAJ2Lu<7mnxQwoy127d#mPEXg?Eyp`oVMu!& ziOX#HB`>>YI?V#W#g=+sW5H8B1>pQ~U0VFu%u$Jzo$pQcw7hu_v_S+Tm?5)ybpFf6 z-jzL8a&V}_7q;64=pIX4`r@`7SihABbeeF-_=gv3yoI09wL13tY5Yu3tnmnJvrAr_ zwc8K~jBuMVttpbjJwz#^IE}ZAs@Ocnq&Ku4Y9g(#NnmJZVO`AjFP?mNsXYsfJ3>Jn zI2Rb<(6^1vea7Ocy?nNk#Y&N8&XU-W6X=%@JXh>=ZT#p_q*q&R3Vf{liezYTeDntlllQo0{8?T}xF>Ijp$;8RfFeP7$CV}Bkd-|%~pL9qzA89UiU z@+%_7{^n)(2LGPvjAZS4tPr(QJkq)gAG)~^TxYSwYP6;s$dRwz_)JQX(LDIM5P=U~ z_d$1*mN;b|f8vZD?g|uw@E?=!+69ZL{t$i0ElEWlF}$0fpukeA9BS`ZmJ=Qv zOolF|f6Dfs88u`g8y2p}A*OQ_;D<7WZXQl+7KV3MY_MIXH1Q)UO!i(%B2oxQYZKSVz@>| zYLo3VY-(j{x3WslzIya_$=Qq(355TdbU{Yx#pxRGi4qTwl%t-rA1Jnl{DT4rO@-kq zlsD=Xvk0mG8&wKuekU#Fs8mOxl`*HI9ubHoA*Jktl7oB}naz0qj^t^I+u?`bSC_== zejYn$i~rN1IaPalJknvM*Zpr>7PY~-Vd8|M_YV|&55oJvQ)H02{`qXICU{>lYECtt z3 z96rJwQYt=VjGCmARr>WOu*7+Zu{2>{_*2wOa=y(F1h>`eBZ5oT62%{Mqu}G1D2%Ux zQ`mOfjsRj}F6(Wti&>~>l|~j4#*@%Chx9-aX1C`V21nr@*fY}tGeZbd*z1KPWJ*g0 zHy9=J`;tXnHpfB1zB2erb{`oiCt18bdQ|!)8>Nq8=^L$=$W&@PR~V3pZ{~)@@2~EU zTbrFMQ=N~rdgZTlCW-%6t3tlTi?YfpeCvT4r|7!b9ttZ}DTZG6Y3$o9&rQtoxuKk) zHmp<-`Un(RjX4Q`YN3xcH%E86Av6y|&}7O}e`#)&4!^fdX@AAMyrg9>5aI*wmLe!Y zo1Z!B|^R_F$o zQ-g&)jvHR9qhSIbj>n$Y2~%9O(G8X;Qq;=R`%Q@eYmqKRVui>d2;oy5@V;n^V}dCT zKe?V-(y$|n<3o>6on(vxRkU@>yK`HwOrsn{BvVfub zZ@&&>{Qk-V`1x5ltx*`_Hx>V^Z>o{-X_A#s3Gl_`=+hM#&F)n) zD?6P|v5dxnen#g`0<=m%PQ>mARehbp2v~(5)0o60jo}!rI0pbUoa~K)vX?n0Yde9xDZR;@-3&aFz5{ggiCKY}OxqehhqO*LU|+R|C+d@of^AfQ$LrHqJ0F}-{Gnc1|UaCuj%;oq-^~^szq+6!b_@3fjOIb^I z{j1&sznVL>3B3al6|Yau_hcvCH&in2fH!d@1<#hD`IKKmsFw^M?lBnW6TC_=j=c-_J!OwT-`8}GkRGm%mi-XT zBi~0mjUgDeyJMe6i0RQ(Vv|9(8X$O*F#(7#HYAHW|EqC#p{fvmtDVW{=N$liOS{KQ zVKc*bVIq!I>tI1ZU;V?33*yHo@0}#9$=>Ecb`HuQz0<(2mvgYy6e8E>_n7kg(tWTS zdlLZxX)*`5&n*TK?W{cdiGK9aSN-Hs8uTRA8l|$xQRFLrNy&2ev!^2|NfQb*bNV$( zofCcogimJ_E_g57(h2fG?0UrJjubS^BhkDbyX(ojM@GAxjA0Nraj5`1E@wI^!B~^=jP|s|R>Mj^M3xTrBox2M0uF9#b+(#IMk&4n z;)4m1uPNMDR(H50?ar{@>pec%5~rP^Y>V-G?*3+lVQx9Al8t_SaQCg;WQ&yij5ZyA z8ZT2gUZv)`wLX)-E-d$GWSj(q;;=9GpkgrHzY=$|F}auZ9D}O=o>@5}qt(TgV$@h} zz&L#MyDvN<`gmV%bkXYda*io8Mt^YaE^fMLvoXQ?6T}~{hCEPIjCpDfY{ziR&;PR1 zrND*zZDEQ(@$CjK0d+JnCAcL$i9EnCZzVtR@g&wYVJiDzIQy<*8CUU}F{T`pv)K~Vc^DQt)$hN4&l>28U**NfK1aZCp< z=MtVGq!FfSK`JSrA^$O*<|GP{9h||K*J!4Zm$bG=(ub}!LY*5tbasV??Fa*^p#DeK zGjjxi1Hf2H?7xByq|L#0e^z-ou2*EwI;L58O4$A)4z5_#utC4VL>pTAS}bC)}@;hbKbl1AbNMVN6|E$ zP;zh@#@S{IkShP6O*iT_bqSVNN{x%vV)xkRisA|*!`;}9NvZoJwQ&5B z&VPe-Kr{xvBub3`fxZsF+#;o;gGT1%^3HT97LfSEDg2ZF96)7cjhMizoWo5q&7I?>>b|>S+M>~gXd`ZYA5eXvSXwbLjR0%S;%W{)yC&*F!M zS85XGsl@gUH;%wqX4B!9$$!^cq)|CA20!W~(+4Os*I*GrAnLEXZ3ZEwy&yq~pi*5v z65msy?#Ht0YhmtXq??*rIch*hp_|)u2R6qoaa};*dnQ|dB<*jokqAay%5ahHKU8~~t&yWhF`3-7ce)Z=?Ss&pj(J;JxcNtbcNVN{ z5jyM%v2u}qxFZ#0>+mF9ky9_8$(~g20V4ibhC%Y9;!IdohHE+UXyeUK(Iahg`o=WkoZr>B}aeSOhyWH8UskcZa)%)iUy=`8pLCpoc{wWts2+ z87JeEIVX5M5ECmN-j#rr9}Rm@WRm%&t zg(7Oi+qRX2+xxEO-f)vY$E0wjT%~^cjuhwNCS!z7@W#uYr!)5E9aNia8=l2N?A<0^{cbs+DTKNSPMC*)YH} zdkee!eG_qjo?JM3?+1T?blNX(Mcz zlTZ(lR0cZQh2cY2_dPn`{1MBKV>qkoh4e!^YDHJL@RC`bgXer%Qq%KJ05?)dyX)Qi z=AtX_hu@n9h*)p*#$d6_YW>SoIH@|z%*-vkpp}o?xL~t%tyfr9w z_?f;_hS%!|AH5{zzM=S((aP#{&OAHWGDwOdzpo%F%&@9O%pI>Jf*w7PvHxm3>iHe^ zLSSsLFE6$YV?;AWj_e|*xWU+X4TQ?Ve3bvVig)oE2%Eys1e*S0?J)#_NojwdhUp{b z;^mtm^{Nv)x{d7d^H&5RUN6lZ1;aU`2FKUCFdT0Jdeet!67}xw=>T_7T64O00nP0$bL!+AyRby)60S6B(1BX#_xLU( zotT1y#fV3B+M7aGYx$=_hEneK`+v+Ix!zb(CR+LBFx$BUMk^Tsw4geheYNB59KRPv;+u>mDY}vPL=17<;lt?O%{VWH+F9+s`Ty&7TFeDd_w{8K z(=j|eJejL_9BBtUIVovwi8{CxI5;>RwmK$aBzYt!G$vF5TqNn&RPv4oeQ_GmucTxh zcJ7xiG7wN-$0Kj@+oujQg<#z;Wk`kA|azm%QWbI zZfnG^V(BUu)ca3TYGk&{FE5tLZ)Qeon19psO%l}id(_4{`pV6;-XF5(n$XK#b1%w{ z4|)0ebmjUx+Q)rKUd|1MNqgv?iJ+>h>HP+u%)DDYx=N(dP~C+^z3Syhd`f1t9wfB~ z;H|@nOUJQxLoi&w(|Q4(o1wuDCoycocPl1_ z#A}zQRc=uhe82T{jE=3CXd)-uo5KZ_^i8 zbGzNYmJsKt`(rc?k@;6_`i|Y^Zp@FWeghCot?V+ZO1nAN4Z&9Ud(;TWy(1fWQixiL z<1C7FcBDFk895&xG%~Fw3B*l{5w}iln#;4;FU7M$#7q&FUxoQYHLPpkp{NTs$;lUp z;;(85+2w`d%SGCL>KsB4{NJZ$bya%u3$ap^C&ol9`QNG{Xv@+-5-M!<$^qn&^rb+* zL{7URD{MZ@J|8;$yD6;;bT}oP`SG+uD>nVxNezWMyp8j`qg2h?30H;U5d5W+$R{Q& zVT7hoYr>Gc!Nwjpg-HGZBh3=(9tg-b27VxC5H+7=m!w)jp0Vqlj^Ez0(K$TrckwT2 zUVLoO;!LPo{(%`?JeUpM`ZF^X$2^l_yAi;d7dL4+M&!08Yj1hSY1csWc-3h8Vp{44 z#vSm&z9q-IIG40++rT!0TtO%QTNemoIns+UG2PcK9$PX!_%j2c-OL->Xd5aPRe$_% zo||#unNBcrLl1D4**KGzRD9&9_TM8-sgaS#_vK9fIHo04D5THEB{m4a+w9+@RcDn* zF>D>U#O|%n@W39aB6lgR8g6g|Txq^wydTT&#F?fmaoi2<2EDA1?Fbm$B9cUkD+CaYoZe6D$!x;Nq1Ydj7bRirho`n{ipr;8}y=oTih_0!JN}X z<97upZm*cs(Ttv9nOkDJC%4NfLXoz#hgGJ|PG6guL$40AFGy1WS6htnKgTqDTn~Cc zi(~WLHHItWj8QG2ITw~h38M6h#f$_}lybV;oibKNjqy;9mmgxuz~B~p3x`?vPWy$Q zZ1z>OI_U29f-`K%wsIdS44x(z+PzDDa#M|)=9RO$yy0mN+)SaD+s~{hqcJ-Zn?|mi z^rlE`fCBuzSt-0k!; zjV^kE)4JfX?gY%6`j?D(L z^M_D$Q8NF{>MjFr`vtwg;6uU6qfN$jp8JDl$*Dc{ANTL=8n&btSD5_sA9x--7{{{Q zbwWQ0HJ@%1aUO4B9l??%xkuln=Wdk;ork__`Kc!&RlqN_blOZ8$C|GOjw2WJ3`zhe(l>c7 z_OaF>x66%yBbw|RpxvK(ETUuktU{RXKujgajzRw^rgJF|kL`imY-=^l#G!b2rLgjfK!#m+yE(#}H3a-WnpI5O=yjsvPiZw`(hFa=&g`V~-*TnXhAN z>A&AjcdXYH(SIuTH`&mP44v1U@|N99JuV^iXf-4kRI)wJmqdHr(AlmME!{}fT)ss# zWcV2r#n*X}JO`DvcrjB8qcC!n8N+W%&GNxw4y(?e1dYr|KL@N+l5`+sw$w7dL5!3$ zo4z0N{t-7p2u>PQrePAgnu97Ob_LK^|_1ZROH@dr`X|d+eC*g~z&SCo1 z3J&=p{fSDzA@XVuCb8GhyumCL&j{FLZ&xs)0rI_$-K{gsU4~r)mOD|*Zhf|mxwm(c z;}Svu(?6*mp$A|8Qgr||3QBSauoI!11;sv5ZV@}gKbzto;-BXkHQ@|A5UJ}KybzN1 zBTz0m%)}kaUhN?I#Y+`8S)B|Stf61F?Q3`9t2vSR{d)>}Vn$N&+I#pvYrVAX7 zcXCH|cGpz5%@hE{02RRb0?IRU5`?5O`HrD)+sL_qlG_W^*GGGslcdS8;)P%%CkiEH z_)l-O_=LEBYO`ufYnzGtb$^$mwl$A`I_l6z@7Yv#(em9{I5i#HQ2 za#;%H@DNtLQO|lc8WurEZ)&2<^*1`i+}gux@%kZg+MUDL0oLuEZKc|8F~{7d5StxZ zFSYyg@7=ju^%Cj)zXg;unFDj$pc7Y+H+u`=U1g;O+>i+N9G>as2LB#BSr1%! zG#lb-2)-hy7X5(4|2~?=%+5u3Jg8pAr(x`u{RSY+=~7Q+e-f0uXCevu zoyH1hDI7lYmQ!RsBiKSmAS=r)uOE<9@`$S>n1BPRykS%$ z@dwr9`AP$G!tC=!|M}>5wcyN|@u<A@h5T9%^xht8aaUw z&{$qBU&(P8O0L?=Rx!(ZuHhMAk|1eYn2%jalQ&xL%uWNo{Esq;*` zQ32;wg}MhZ0c3c`H+6JR>&bRUK*eYorck>6r7R_9=!V?w^H(sChndWC*ErHw3!|?O zHSsee<&R>oI~n%=Zj36o>Z1LCei8M>I|5^&BU7s4Xl#D-tNk2rlO6er3h_gkz2V+K zhduo4lEWXW88Av)3il1OH5gx|yea-|yd9rir$7U#8zf?}Z7CPp_oXQ)?kPkKhHsNH zWEc2_cQLIfieVwUIWpO+@Sive)ZYwj@Lo0!$%Bryb4x`}CXZZ(4 z9Ee|0T6oMQRxct)E(+SRgLEM z!+w9O>4<47*P|Wt^4uI3O_E1C5f6Wq5~Y~Hfs!-KcF^Pn)-_U^k@BWhX;=1 zJ&`iRMe|}LecOVQ7!XnwgW%wRL#_J$zb+*G7Xkin**;`s?_pK_l*;Xn(;XK8L=cHa!pNH)amx>C;hJz!C2w16_L~m+0eGWzOr) zn1VXa{(31GQ%ErxOk9jFqIM3DN!lDpn!bwI=9u5kMK*EeN&hro&5ni|T#*A}vPc=V zncJH(lc@IHWC5#J`=U~F2eBr?4qceD2`itDQPX^&xF3`o;OEbn;ZBkc%CmsH-6!yL zv+6$tyVaE?UVmWsbUxE0B#4D&4HOZWOyI=X*|=U1w0vJB+ewvC&9#DDYcDqxZiwDH zgIQR-rhIE961M!gM8~2#RZVtcshIBv`YO^AdGxT9__&IT&}0>OT3zl4-;}`Z&+PY_z(OiaHx#_b;{a2D;QDR@3dTNd0u{|soi{XGWuauQ|<4!z&^Sw zbqc9-T!pcGp2b?sFflhQ8y1NO`p8ajR%`0!7-ScPS+b0W29U&VOhGHtYsYroeo6Mtz3eojXIO|GFKetji-FELjbKlf*N$7Ph) z1UzG&8Juicx+~FP%~w^yMbBi)hW1i*kL9%jA&MzPxm4TLu-?O`OGKS<{lA94#EV0x z^f#8l>-w@6IoZBZE|y41MuW0vkgspNjWru-YNm!Bbq*6e>52C>ap#iV`Y&TVb{q;4 z|CsVweHKJl?v9zK1IbR2jT|gDCGiN0xfeN_sri(K%9{r{ouErTLkx^7*had&rjcPJWn zXx!c1-5P5g8h7``9U6DH#@*fB3OMY&-~Hb2#*G{2{5k)sqAV&i*UVgVK4VP1X9wE{ zTD`Yhqa$*gp(a!g7l7q4%#wIa_lq7Du+uVPBr%4JGNQp%ecA~C>$o_K{TF=KFS4T_ z9k3O3Hu$w=KzTVTfY|OQ3vz$gb@kxarySPZKi2p{5av!71^2B;H9oPQAKLLFGyYf7 z`0jtj5FD8Uqk3Zr%xOkhwZHYv;71l-!}+i1@tq<>@f;%%a#2VZAPc<8>&KVrS`>mI zc{lzKVd#8zHFM}M$hC5#i3s)~u?f#M5C_K%MiE%r*fJ?Th7 zXs2$3O0CCzq!)VKT=-91{JU!JMDahQqqAhB_D)LW@BhxozhC*scKiLW`C|BdkdwfRwllf5`>9e)xD_nY9!h3E;|!{Q z@WzXNLgHbp_3;q=OGI|c0@Y&ge*Qr$zZ#I%K2u4iz~L1NQG0VI^^XSi+TcY3=1Z1G zB2EXM(l1%D6@QRBbynKa8~I`#0i5T9 z4`(UM{MWi#9Hmmj1&tm%Apx>0C`soNS@OJnD>$21YKxq6{uPu-uZ)!2E4_OO^uQaA z^o26<^H?o)mB0~c)lU`Jga5o(R-b*Iv1+RVysY|{^1d(BG8PB zf%b^+q0PTwB0VaFp?iw#JykstOy#N6onsWJ@QpX7_1MdmqwDs|l~2Ya`in^PW{>3rWD%m51K1FQr+GLr<^#FxuHCq0$T0ex8J&| z45oBEj*qiG@snG zH}nWyef@uW1-#Kw-5vx`>tOlHljUSWCQBP`y00IzzcY_4E+7bwM-XiqFIwWk4FVJb zJ{lOJ>xZ_oWE3P@t~KitYT|lqz1U8DUZM*Ji;OGYJegk^vFTqr=O=P_o{4u~eTM_# zG~p+c0DDUf-epGH*%l`JJD?nz2!KJ6ghk>){U94O{z@ zB`L2Su(@0c9C0ALJSgflIxNc^i`qC7?&<5jTN$x6#^mmpV7&|BwT9opJRGQ8=M|Y4;cC5L>w75b|vEEf5_BbaAgWTm4Qh$CI32Jsc9au?9+9oHyR=D912A#-}kuShlxL219@tY5Q!a9!*jB!|vW_PV$66U7R6` z1OG=hiG&`GLNq~o&4CC<0%~K3)#cWxY+uN>GU{qzOZ>#Cy1suU{xkiv-1nPYts|C$*j!NfD|C$tzJux8g-tn$>=HYz)4G*dB&z#* zJy?EymdH7nn4GVnmD_3RT0$=olK4zxYBcp*@t5D3E@UdUFaKu5hC?43`<5)}RFc3_d~Hfdl*1MyD~ziB4pF2zKj2F_FqD zW!S?hBVP7TBQyTYSvqf+TeKA#s#3@a1HfdasKVVdqFn)TC$?x7XQd1fo6IPZ^)U5q z1k3`jmW7AB1VrMDf|0_S`Q}@hohg`32aR$yZV3EWs)W?%xwW+4qXP0&u{~XJUS>S{ z_cl`Jqe;}-jV$Lwmt=1T3ZiH88u--Xp0}IrQ~bKD3erec?L5&*^`W!3Wuu8Sx*-cw z^W8%rF8J!zL%HG0%z=;ofavu{7F<=w-3K=I6jn>9yi8Y+V$|To(H2t<33#V=O?ga0j)3MgG$Po|LjP%U(T3vN@9X1h8420rRm>T{4odJ`QCh#q-0=NRo zN%QrN>K7G#a@x0L~2ZS_HQ^WZFXM`3hfrE+d2o+ThWFX379UDIJp7D;8io zg#Kfkw|k(#Ijt3dV*B(bSBgW2?SUHL>0AAnQ+MYB0~0-CzDCde;(H z*+2wMLq z97PR6+T!3ugy*JXv{11~qmxg~ctSo>qRwiqN(U)`6Z~eyZ;AUg!K~hpFMZYR<*Jm< zfKfPlD8MGP2wdV0#*HwxlLfkv746$^)}AI)9}YJ@7)Fviygym6cC&W+k8AjyPku~} zE20J+8$JuwECZFbnbB~>{a=bDcv<}1ynSw8cgm{jjDf3nSs2oLzc9}5b#i_%razTh z{9)(biK#VuU{M3vmB2VSR-j_7Q&o)eN69H0r}NqHhSMFqpmdq^X3v4Ms7dxsinCwr zCm{BOODMUZP{i9STaJt)YRq-m!4$uL%`8G$R>P5kqMEr(z|e8Te&Rfuq>D`#qH=tn zCYdz1WHIo-+@6uJn)a83YI;l?sTEN6I4{d#4ZJEH_Vs&@l>YT8kKEVW$EQ+Fz(ZAQV{sPs zu2$4mASHLw;KQcBp~AVm%2gP}!3vp|w$_1Xg49s0*@IH=IjnOUr;BIrsh4#Ym@VY> zdwLbTo_}^xPG`3gh-tp$>C|(>^0^c#L49=fOSFkh{vi4td&dgqfaovf#Q>ct0`nMM zlHg$z#(a(2bff)PL;#<2^(V6U!KGS-1|hLXVcC5uN+dbu3-PIe8~49~mp?r#=J=km zAul){BOqlVn`ki`nqvLMIG;Hd(@{)Uf!L(Ned1i95F=Nr-6up8iu%;pr^SPu0FHK& z=`FJg91F$GgHn0H-Eb~}X{PB2vN(rlqS`m(=2R|&W%vACJRWToXT6_naVqDxD}8l) zZQ$JL>SOUd5}ie}Cp}#O1_W=rRI@~d!^r{%fvBC%#D+?=Q<+c>lU{+N!Qi^mh_#rG z0LvuPR*Im!lxv8=7V(AKy+*}{+J|NVoxo1+p9dJ zLpAw2O(v8&oc@(rx$#h=7=R~nS5%L`_Cj@=LPYX%L;1s>HG#^^y&<)Y0o+y2hvbS-E~2LaEas z@r{P1v;83V7W2`7x15q0Rc_$W0>pCGUrG0~r&y`>%wJt&(i zM!%ovEuN|jU2J98`KI}Bj+RMv>%6U5Xf$^Rxl+9@29ft?p|HQOCpqz%?D>5 zKE2Ekadt%mc=EH_A?+Af$Ns58LuD;iQQ6qLX89&AzNFRqld77F5tB)pe?6NLLUv1% z_-@G)KfCeCVNi6#UOQAG;>%V_Gl;1Sq>3$})H(TIUf1jR@Z;!xs~IXc@F$T3KPHJ}FxlMa zSy1soa3##%S};9=S7H}Sj&BK$Z?C!EQ|Hp+i=!A3@E-PA>p!(9`oa4qRT_)eA4LqJV2M;fCNjNu`fm>Oxt(ymxDxdoSVXrPpmnD5rGEjWaK&Bg=7x}K_EId`Q$(eiE6b#1rZOUchCIXm(?!h0P~FZafMmCYoG z?%g|$wT~eh3-&)w=hy3EnQFWo%$@1FSzS$XP)u(q&|bpy^)-NDe0yfe64dG$a0$^r zZ%$+V%`h;IGe){VZ)zPVPW9QmL3|&EQ8%0rjulc$R`;F}BLn`hTD3Ll`G>$UWkeIv z1e1Q3bUkg)m*>~GY7Lx-7wqr79ilX_y48$wYX@CR>7|Ov()_c92Fa0h$YhlDz`#$WkfX=3oFjt&h3 zu|`Ks5Pon`e6E#G^MiX<5Gccv$v9tQa6Y3X!GbVf#;DGa#)j^l@cSbD9-n5+!5KjjUBc^C&|oOq#@l8NFl0Zyq$*ncnabM9 zoL#13gOI_R!uA&~iBDhF@Ai98-*|RFIkef*EW<(@>J(nsKydTE@bBJsV1?cnN;BUy zTdR&-Ztx^4m*DKB;@AaNu9o6*z1!e=bDonc29>St@)M@+qZ$cLH0j1Iu_(Tbh$p(R zT+z=5y8l+`3#5FzgPB|c&FVhb2FLE8L$sysW)q=eEmSl}roqT+Lwx${IDhteoNvie z2+OaOn)Oentjf&K(oYV7Y_Kg^x(n|qii3>P$F1;?Qd~S0kAro^7~ACHevB5Ha|qI{ zru&WFI+H$JS!yJ$A5_o>pD&JmW?gaxA`6Ic=f%T+ULoFb4&s@j4P?{i7ML9&zHt=` zpnv3I;KK`cRr3JF)E~&Lf`sa1Z(;8@P*WCr*S-vqWj;d-ik7P%SF=%ydYUsZ)UA1< zdw&_+3JS!Dtay)L^2W=28zgp0?HS~R)lX7{VsdBUer^=HgARIoLnpZT;BsZ^UoV-7 zE0J9G{<+717nZ>qA6XqkJo2as=B3`(;0rfrnJ2wm zx}>S|0qxOFMr{X51bQv@+ki#5=1vc$J*juh@GGjG%gi9?@1p(OFJw;{^6x=~b*1y$ z6_61FVlm}^wf3i8OAf@N+)^L?LM_XoPx-;rh0<;bGm!EoxiuSrbNaMEVX(l2zS$DB z#Zgavw|v{O2G~kP-VwaZAxD-q#l137L|bC2bpWDs60Qs|ZN3l2xiH@>6gaBVrH(0= z{NRFgV;skutQmOa#=sQ!uvt(E6nghU@SOWKeQlk}{J?~GraL~IM z{^D9#0Yla797^AaQ|HDdfq2&X&im;^Demv9%q(DTe-L_j^DWoQH6rb6iH+G>$*hL= z6*`p&Qk~@hVlQff)B-N^?*3(L%6#zrfYYt~toriJDmS-xH&6X!}m}459 zmG%hR6oOox5u!vaGM>lZPK@%0F+FFV-_C0zT4*E%c@q?dst&f&m?ypR`3V(oqR^egK0HPS!~Hy z#!Y8ph&4KwgZn{Gy9VsK9FxUP4g6HCHt0}xTK0#PpGiDyqRmkX|B7b}j)31Jguz6PX6m!J1n0Xb+xRmeM-{~uy- z^ZzO_*xo6nSi*ef6d52yV3x2)JNRef$B1ZJC-*1IKeqglrYqx^Nf3${nq>HC%PBK zror1O@%6Ud!H;PK#nYi&Y47Dp^5CY3MVDJv+9g?E9yZ^|LeLuREQX6q-9HV7`5K2lsNX?oZ!tYi+n;%hpb7tz(Vr z(iHry!VWG4e6|CBscv_4FRc(_$G>6_!8J!bIGA(0NDLUU>YxENY))qtEa|OjG0|Zj z>*)WUEOT`0jeYnIOt13y%TioY3hEhqQ7#Ef6Di5p;LjzY1Kf2>vxXzu@dKpz`U4g9 zueIkY*$7i%JCUlS0s8#h+;UUwPmLjjt_su|c&^*|wfJJIp*m3^Bc4tYAAYV5HJZ}N0bCf$ zFk4oR;h)Lp;Pb5RNLNY|%>$VrbuGooFC*T~^<1h!@`q1Riyl7W$+j)*X5$Ym4Gv~R z!1dO8D_ABT=QCImJEJ|-c69i9zfc#b@r`1f>92~uNoF$1KK^^26ThaTGA`y14fjFB zs#(*sLs^sgs(Nn<(oGEHN(b+Cg8;7VvsJoovj)2)69?ngG2WhHk6)jxQq69Xq8=Z( z4Hn_1op@xCJ{6M#2?Ol@_z=!QrI(<}u>sziV(R)6tHvB~3Evaa6(Z@(_Ls=-TIC zXj8Xkn}X!v9J`zi_`G1xmA=RTz;{k}X6HnK-xd2WWFcaHCYP{^y)F*S{}wQobj%8~ zU6hZHT{T>ERN2qDuEq$gwV;#IHohuT#JSy5UTWa0+K)8Yd_}Y5db^M!Gra}eL8&_4 z>d5-wYgnlapms(UIwMm5EGnIcN+^lG18Fwn$({8U02P7K?Fq+VaS^bPdI_L^GXxEwyFwm5*I@d*YF-Q#^V zZ*oqd5yVAGo16=V)!2Fm-xQhmG9l>^u<%Nri47cV*QE{ z1IA6+A_Hq5cdkgO_Is48Zu_u)F(Sc6PX8GR!tg7Ta*cRTa#R{mpkA~H^i7=sYwM17 z11rOe-&h67r<^^S1KR4E!ONpWWhz}5Z=Jw2j4p)y&$~WTe5^ih`&olM66&LcWm5D`1VO_Eq&JTy zC&QbTROVJM4G;s%zhy{{g#VHljot6c#tM z`x!hPyqPm#mf62@P))A3D0XKe!ofC5U3R*nb*EYg(mWLB%(CQ)IUrI;xnD#WgCSs^ z1LSh%7J8#4cq=-R=D|=79!XGkS@tmIf5Y}c&i$XUeetIB99pJt|r zm7+3kT{QDRl1n@ly~C|#gtUow1Z@84+!;G41t3f`FRrZn4Eifg0R-6B0z}AqAUnp8 zb$mHpi~#sKV7_9kUD2bktS9|fda=HhoB0o`Cz@oRTyEZ(o{YS2h1oq1RP0kovvcS6 z(cE)bzE^lG^ z^CGp@nmKu$z>&V!S*IArpWxSh*!^`fnm2X-$3}4DD>tkwG}%oWlO+9OD5>#i0`r#4 z4x=eg8UD!9lzxw54FiNZ2WhLdeSYjJC|lJVrDE>cW#(ypn2WO*@DRR-w}WmwRO_3C z4>L=pAm#fBg91__R<=mVP7ZIN^X?5YcL|4Ohc~k8QZ@@@ubh8hU@H*KqiYE<=fzX% z)sPsgL}G`<1{O4g6ZQTaRjGrLo4T1p4%s`{RuWY|X@)V3e6>$vwX zd+#u)bZbX3IwI_wte}0(VpbQr%G5`6_WSRfb!i6^S86KvA=3_ZIjzIrPeQgwr6w>C zmgQo6UfL;Zs7pB?sjXS34A?j$*gl&zX@_64rh%;0J^O69VYAU>t35fxJb}Rwa~(HD1CI z>`9nN%ouaXUCClK)$iejCew!Iwa0@Rw*$tjxLL1|c1dnwPy2D`7AqiJm$a!!3}if% zZ8V#^QZLSYKGPu8%6cu?`XX~PnULH~aefXMGnds=*NrUbHnU$A_0_jgZ76KtZFZV; zzsNd}z+7Bj>zO&rR-!G{)kVQB;7NcFk@=n?;>-adFY(=~(4&MFh?1umfU`~;?7>W}Vj!hc zp58qVCDVH1(fC;zpCct5v>nO|7&{HuozLzD5bfG$$?TMQB6O8B?T2>C&(Q&C%8eNdI)5i!) zglDr+W!Wm~{MJ+S!&IBS76bjX$%;|mTMz@%zgo&eZ{`$Y*gj+oB^~8(m^0vOy4fJ& z0Np)1o7>^Em9S8FT}12{-Hj$Or8Jv;jM<>7wIU@j75p(D*9*Sr*mB{_R zQ$NTkVG8`1VA(;k@MT`ojLD~fiNmd{HM-V@g~n3&oIi&by|z~O3EJPrkH$)*@VkOM zGNp(?4%Lv`iogRnkepm?RVMe99?+WU!K&R*`m3R*I-}G9IvE`i>L2acyfCY^m7)k) z3R+%ZO>ty3or@4%_UT5fMZ00)q_*oA4S$DNR>;4Auj`*r>c+&}WNj?ScGoJL#>8QG zCh%Xb?SbVi$nPcNEqAyQ-+IzAUoCva$9}y2{Dl54xR83^S{nZK@CSN#hB#ca%nSXT%PjB&-j)jI30TNS#v~SI^&1MgRY(z6;kc zU?zfLZ4#{-m#)xA_+@M)7g2w=S_li(2|YQ{3nl*fMtnh7Z5Dm;-`B_g4psbngY7>Z zcVEU398ZmQ#>wa%aLN#p}Bk7xtqA5$g5gi>I=mhM?4y zjhzoUvxeK~O!zKL|MVgt;3dFBB>oGvEBqU^dmvtmmBE7i_rD1LzX86a|IrH~u6%Xy z-x2=A&{~rIJKoSFqE&VogENA$haF)ef4c|%NlN|lwR0@QLt})8vA^$JS~l>X|MEA$ z76$d1uKCaC2}8%x{g=1=n+uHoySYMG=u{h=&XaF-IC{n>!3XTxwVG+DGC4dwRJwGf z-XXyhyn%{WuL^2t@Fp02o3I+Fyhiirn7`GNAngbLkL{tz#X1Dz_!^1+^P_ZxoNl$h z6lqu+iQgU)Ig_Smb)N@wVbNy-PKxw%tfc-PgB_B`SH0PP0m~7(#r0EULT)AV|1zOS zJjYEA{(nsr?s3!AlvEasqXgl~7va&)wDw0YbuGXvPdQP`X;9E?WLLg@GnVCyJLe%j z4@RWHee>n@Nu=%Z-5bf-$1L{1y5ZpyQO<0MwS-oC{r9mKy&d z*q*63HeziY4AZ9#-8W6U*y9-xeZ=UK3XC z&xjxnmlLkcqb~742eWF1`}TQuG|h!qr7SPXsu`t^=~`{v@=nB zjj2Hab>`8MxLtw5nEl~Fgfsp!8l`ndnO2u7e4UYYG3(`qQ)ct3r)f7J`%5tQtd9~} zn=iWV>&IX?JDV!xxS>;Mu1>uiuNP=X4&mqlJ}M{UJz%?9apKyEG?33#zyBxt=vge} z)%{1K`{s-y#yR*v$ zq|kv4Sja!~?>6{?zX%IMlam+5{q{b59D+nO>OE)#*6`;zJ0Y5wyXWxnIoIE=rM2S4 zmkC-hvJsZ6lwRmG>Ovhp+8f*kuvbjnPUAjJ$kAt{M&G9Lnp0%N_QzRyDd)Mt@d|Q$ zr?O{=)sFkaQ(KPn_J=w-i$Njh*crz~`M7xHpvpgEHMC;KsTN^A`bW?qYe9yQciAM0 z{9<*Vj~On?X>y&%gqj-xV8HX%4WMmmr{Ib%xa!P{JU1BijW$2S^Sjq4bO8yV0ACZ(H1$`HdK>Mgvo{dTQPaG*c4& zr3C0A$ha_I!aW=n74b^6RP_N1 zWLA2xL^cfv-(_?>rA%c=CJ^`D5ne0)3Bvy1j9ub~7a4u(cnQp^%;)-9y*EY5*iP0U zKhg%P%Gj1OVHUJ>k7paf-^682-v5XJueST zEA|`OJIvUvmSwC+>vxwpGoY-ySvBoHpz+a0+EVBg}_6V(b9JaI%03~Wlc4NQ}}5JlW*B9 z6!muCtyZboJ$*2MG*}hq9e8Z-KbXAt@z#>)FEL23Ie3Dh?uW@zYpz-Wn^*}M`(PRQ zXwO~PB?kY3iU&B8JM`PtAWTyA!2^P?R#`(DHoNB6`ZG@u5)3XncbadM_*$G9=iVA= z)ZQR_f-JwLJ&C$|MQaSlHRRW8NDnP|LCdJ2|GM2zz?tp_59vkqV)DJDiLGS!tz>tF z{^=Vm6%@*9s}H+U&G^{G98a^!bdbV9);gQerT_0rweKB(|B_JuiuBVW5XB2h!KE!t zTJ7lhP5@YA%gI91_K6wFe~J>0fP+VYC8{35-UswMN1#wC@yaZqG8-s<%c)`ENh`WJ z#oh%c*!M3^kNE;VL_|Y_2vnZ6*#|!P;L$=MgU#QD76}Uc=x~#>dV07MDk^lQv2;^t z#{I%*6a@Q^hQBy<(9Pam0NU3+7<&ak3eX*Q#b!bEuQ$!#VD6mceXG3e(E$3s$uhh_ zb1uYtUal60y)mEElqU>ctS<2?S@7>>mxE<2q5{|9q!V`szf<@@-;P9Essx88^@2KW zmLREH)Yn75o+nQ{9xnjYWzDZAbWQRc_d7m-7J87b>ej|%G4n~x*2i{)Hz!m{l+kFM zO}pLiXvlEwrR=LyrI>z!@n;xlzR1gx)V~(WRTtrm&0flh3Td8)b2#4eP0q8 z?{BTH#y$`ByBcP3tVLFB5Vd^yn5?C*D)KpF{c78ky!^aBg^(5oc)&M>`ho7)0+%2& z*CQrN>sN4!5@J|eaWM$Wi}zHYcl;gQ;K?YdwCqxNtW8yrNiA>yH%vkI}P03UC;d%%^$leH0#RYH)y{ zgKMSdWEmPcI0Ty14R?(Z#*7<+Ub?aV<8GCs8dy2!PF1$TpVubo7JaIfwcUD;k2cAh zQTD@qcP~e`E6gS=8e_`$ac$pC!-3ZJa+sLJdK4X(M4CF4&k5~awvpyi1XOySgb(WA zxMw(yc~ow`+DQI(8sJNtZA-q|&V&BbnKoYU8i@!Er-6?Z&QCZt0E`@dh*Y%6dL@iY zd#CqmLs(?A?~;dK6o|2jk@XHY?*d4^%ty|Liw>F@(A9!5%=tKA>o*`3iQPkQbeX?a zLv@MoD>dkP3+Ynj?1bHdQ{IjfV)|T>I(qTyyOjqA^h!o=4<82u&6lJA^(h}Q-XSs@ z&e)qg*x=xsUq1p@xSK=dP~5($SV<1lXZl&9h#}nbJ zqFkMCGr^g~7&FAz#=1={CqdI#sr`rO;5$m_VVP%@q&PtLqpKC(u{`!eVw(emjf+d- zs>Y_bix!VuT)xolx?Mdx>pp``)Bb#@?i7oahWwV!8d5ddwl2DP-FKu#lHohMvA@1= zE(v_*OXhdx^DW2TBE7KQN9`~n@5Aahq*cHLtVAy88R+p2bSl$?Y|INU<8moa+%j*< zYm8`yhFIx}Ge0~hKMhu!%;jF&L_No)2|gALyhSv!VWB0Jvy3*H4j&!1P6(!P?CR~` z65v4CXEjD@)+0G;;yrPkkG)o}%UK-AcjCXWlvj_VGBY{s9f=(#?T_DzW;wm{UiWH} zx}9(Jmmd2p&4k_##W*sSZxtoEQ{P+f*Igy>;5U2EI(2{ZQjyw8&?oT6( zsu&6S)D}nQu`Q)c2#Zez6=Gnn10UP>*zZaHQF5UyuH zE>It|-_s^M<`_&q@_7I!c>D2VC_1KxjtG@9UXt2t=X_Hg*$Df)G6gqiLpqd0Z&!fS zj8&haW&4J_%1U+?oe%E2Wg={@d*tI4;ucrIAA*b7w04&L#ZZc?!#is;Mkm$s&=(~4 zmIPpvji3YHiY(h8=(lxo*y^xcqa{0u-WWHDWQ>R0Bf01H#c;I{eywq3S~hzt1E!%) z_n{9u*%E1>{w#NzL0LYohx+FsiI!ZL0j<%N)5=(cFLufppQZTG-(9t)p&iImkelDW z)DKQj(c-Pqx*J?sceEC@lOF3Z8j3;g#+2^UZ=^(X0xcF#{eJ1z=LDX1nzfXQWI1Mv zln{KUWFkq220?8_#v16f4Q*vN1`{Yp_nY1M>lB1;ilAKKtyXImG14}}#f$sdXHI2( zBRIxhVhld68B}BiCkRQ1zy48HL=BhDN!(*Zkb2Raq)-S=s*2(Y| zp0e6{bk#jEC|->n>)F-qh6j~ZwqaZ3896BOaJD8RWr^3A7f%~$|DjHtW)wX_GO0u_ z0XKL#_s{nWdR>m>^#@5rf{9>S08l!v1@4E0XFt7n=;5FZsUltA3cS&s@g!ZzavSCB zN3`pnj_(w!%exB%Sx|Eg&m^eFPj@efU5TnMXXGG9_@oM=yETV(j|P~yaPyb`=@RK` z1H#l?st;c=q=~uZFAohOV8of-@4W*#Ic&Cu3$1V5D z+Kjq>22sR>;2bU|YV`t}3D1X0D$AT44`?U{(VCXj7j5&qq!&TQ+25RfXN}*j| z!$h`TkL_y?dYlKilqsU^Z-G*M5s+#`cqt3j2C92J@%8A4vjk$4F^S|#?CNOHytYg^ zNIub;RCV12kg+lNvV2{CHp9E4HhKry5F55-LIdotEUeADU_RzQ!Mvwm9HPA4&~^%o zZtsg-0ixl)=e!E7iK2C7J>mz4U%E5xH$zo&4wI*j|YkLqpGcq__r_^o|G^2?wHK3+2 z?C2H=cTx0*NnTivd}%rwuK@53ZHabWlxZVkv>_Lg@p(klvJ}ag?~?~-0hKl@?ICg* z?hd5>LA`64It^r5b7PbS$jB<=E|+xGN!jA*kcpp*OJ;>~vwQeM6v18)Okmvs$xd|Y z6>l4oJ6{1+^(<+fAF)D9A-=3uLcYMfJel3*8NPl;mN>SI8sTnlbga{`h;URvWO?)J0%)>tB00qMTE{v$_AidKxXL|CY<+=8W4qICxgG zEC-w9)b!Dvt`Bez4gST0wjQh6WM6?!!}ln@UM?fOTs6)!v5cu}@Qy5{M=c3z6K`s4 zB9f8I5yef3REjcpRI#Y;&=pp^*3Xz85k7F$HMdM+2CV4Vnvt69qp;}u4z73AtglO6 z{rCD#bT2szYy2MY;Y$0Z0vXI9$gf#=#q?-K4dscc^|p*m@%9cY-4e^rgcy`fur{getKC{e2^E4 z`@w=V|NOg2OSda`bJL4idP;pk3VgC!9sTc z-0aj`U|>E~JWugEZUB1}``GvJCH^bB=@b~E$3po$$HXCBq8jHZL`0qE<&NZ;=4Iy5 zr|l9DvhR~Q6?7gxpD&y(5B_fcJf&O@Yz~3o_lpfBX9BNohtxrN1CEwZ8Dp_~RH)5C zWl^UxCpPJX5)u;5Gmo~-`qs4~5B-pz~c}McfOoc}nva@yXX2tFux< z<~27Idu{uKt|l!qLwno6wpEoS5S-~w=VZ{jnV&pZpIR;FLSi5KAG|hV)zInN`Fc{~ zHQAc3_CwL=>(F)T{k2{~s{L``zm^O*Gj>Q;YDAQG{h0tT%gl5}+P9_4%&<(FByLN5 z&mlD)1H;Uk1buwrznyS$J6jrF^W&)Q_+7@Py{KHapYAOyRuh9W?!2F6g>9byK^s!#i3~FbiZkk#Yl#^0z`Eyn$a_ z@J55Uf4Ko3dJZHQ>d5JMsVU0hSvUZ}g9;rXp}eTuK_hc^<^hmH0M-`f6@&M;h$~>i zif;!3YPPxxJ$vWz$`El=Y(D%JW-j)|;?^{F&}{+yfs0Zi6E9|6H`FDz&4tR*k3r0V zmN-b6)$iIrcMfYI`-HQQmIKj^A+a-Ytbbkw^c>hlfb3TU4dt+hy$ln3X7==8VF-+U zuzW&zISK`6@^Kv>%$lp5ah&I9lL8zu0%0O>61zxEtmon#4sKI?}q)OtPqAa!S;X<8vAy(z|4c2$aleer? zn2z69IZ?0Na<@Z(d2z(SAc74XU58m`5AROL{Ay_V%)Q_B5pcyYR@USMOY(Sd`2&CY z#}?0~vhA&O@8U$>pEg~G$7eVS;ov7I+5rvWgp{<=0q2sXE<+MysE6Hij&KXI)R-x^ zl4OYS7C9d-cZRl@ob9z|4|xKO0j$kSN`;_p^#Irn*fregPB~&oH+jbNUZhv~8ruVQ zwM?!aROwYW4#!&<^6BEQR5hjpm^*c6CWCfHZ+Z0Wke&Nu+scEkY1WUfW5gt!F{!(F z&nE?*qDw-aoQ3lf7e$d7_-?*j30cRKKlJG!5l_XF+EtX4lq993Cg^~A7r;}H-oDO6k-f#-)<~jsUd5-hkEXc3^P>E4faZg({xQ)~wqyyO z?ecPE?q;{Da#epU;}wGY9WNU4qdT3;zQ?Rm0eERwHKjd8m)oI)@5PW3ZzP$0^tDKHC(+ntVNJK6V zOx6VHb6svPLdP#!G#;FL$&eS+XZV>P2;~K+;p>2)H0}E7QR&KJuHAA!?;MOBeT5$I zN^~qY3pIkp@ph1o3@ok7(yaq6*k(hNR+Q%Pcpe9HK9 zecE!jiB0dm7Lr1h>vM(6pT4z#Qy7gi*=i{GQ@xsrgo(rbf#!15gPm4n^6oL5=m`_1 zKHu?_BXP@nw0HTJ& zO7yl!M2Q+K!Xo-dqDJo}dhcZyOY{;Y2v$P0AbLsEwGk~68=^1EMhzmOghiBR^T{*w z&GSEe&u`b9x#!&Hx@Yb)*Icjjem8;ZGY;=*)r}MBqgb1dm@zrSNVb?CL4BRR*Y@<0 z>SymU<=h{|v!f7c?!^H;mmm8xEYr&{QaRsj&fy4mp}1pQj-#rtj3=%qV`hda%{aFX z;!PR#e)ou2P+ADayoZ^sTV>?>#pdjGYA%bw5JB7*D!J>X;r-KqZ>$r(HW#UEao7`) zj0Gq16;o(1z_o8gP){`MF^rk9J7?eHZP^0*!-J+SF;Z)r!Q8Ic3@GHimKh*?qH#13 zYo?dg*~;jzP>Ml{U*2=wl2O{gBm?W2TMdx7pmltMZc{2Xws1Vu9wyU$0AN{`*~Mhi zMugm?DNc_F&=LRz|Vf22`%beI8v$DNPPYs7}HFt!xePvH#FS zq+563b=U;(_BS-a#RtbzHBS}=EhG1dJ~t*aqB$C4&3YpJf?iy@SJY-ak zg5+~I^th6P>K3#3AE)|0)m(FFt#w*650b1|+#c!tY}>x+C7C*Wr#)>6IAwcvQYMrV!4rb`_*OhSu|vGcaeH9_$LYHv-G6vTCs*r%&#K=veLR9gtkS6ea=de zYo}D`W#}`=!3{N-wYwsgKnpNtGi@Pb|@I zRKvf=wIE(!{iK2ycXdG1Yh2DDzNX7@%Zm5DT0w}|+r$m7fMZ#FrXsrdF3Aby=T-Fd z*>|VzE#V@%7@+c)4jRQYqQr0np|LUR9l0{=ZHP5AIl!&h)5gyu9R{g(UzKfeya-7At zo^;mXcl)v)B5s^q-f@c^f~t`UtLMo`3HRHjXfN&=x#1TBIk4IT(AN^iW`L<>B&%YR?a3mmJxM+9O9$o#PPc)c@NXa`pVuHM{>NU2}rcQC;GX2e;nux6;c6q`#sG4#2M7hk<8d&n9WzoD>NTM*@xR0D8?!*OdfS(C1^Mn zV@f7{ri=dI|YK7qZd z7nE)$imbkc1DGfeleb-~Y-be)h&P@$TQN4Rp2p9qFN!{eY#OD{wS_#Kow1WFuL!&( zDf`eDv1_Qj^NKsAST{SnAh~Z#YXI@seZG^wM-J|K!3&4bs{Vi%v#k`ZFAh48K|36p zpw|pKn0a?BPJ}Y7mshSy5a0hNydK?@bHQoIZu^*GcPj4dCbsI@1<0p8Pe?yjZ*&i1 z7TYmkcK%68xF2P;;F1FUjLd=D%Mx^ z$jAU*6E!BKJZUR{O_+{6xmIqeL%4*IwDO?pFQ`4K$BdD&QjJ9xjmfQB5sFONT5Npj zffo@t5^O}t#-{Qinb%lKI+&O|bUL;rQ93b2PiMR_49VY6;5ZLR>7@n8yc{42#g!e0 zxAztRX^svJ!mQe%HJ-c|JI1+Nvyex7T&Sd7^hYY(*$oq%SMm~9(m+doLcP>*>V1uq zlTu?4=3CoJ)xxy~9&#V>UX`Z+Y-aEJeP{4`x~NmZ;hx79m8M1aobgbP|NSg=(#)pV zNsZ(%y33S%KaK_~ZA%pUNH~_29XWIJ(3NwexT^vB7L6E#aqjrz3BkI~7%zBuhvO>#`_x(_O z>xdpM4!}c~t zx|O#P$dlOc8wO1g`OC*n*}Yfkr>E^*6?F4}1iN?1cFzp$%3yGR8ovUe;@MJ*DrrCYJP18mhmyzj>k(iQZgZp_j^Q%p0mr69PFx8t3pYjeCAXr z(XaqlG*bo(s>Jbme1CT%P1kE)l>;q@LQLNAjpx-ro#ljpNZr$l>%);I6vcQ~`W&hB z{N#(c5qJ`ocr-I;atTYiguwgtS)#alGLGK$mgJXEm?VGV4xx&~DiTe9Td@O`UIvHq+5qR2LHL7dM zG*>gz^3>5#Yh#sGnK7_Xw$JRdG|~0tl8tyZS7J9?HZe_iF%LnpT>sPB^#DqZ8Y1-K z83sr^^`dBcWE3T=x=oCphA}NzsixYa+kQQxN|X8u#yB(Pav{j6#ONOMy;?v3xns0O z)lyRtvZGI}A;K0?=cvXntX`3tpGDPMWEm%g(1~4O_h>X_v-5cNF$Y1BPR)Ksf)k}9 zAO#58X50VyeD*^{cAFyR5WtuVi~DIpWxPEJ(#P?eXVmfuSLExJP7I&93($D#7Z^G3 z%5|leuM8AvL_@X{XP%r5YKkc<#EkibF5M0l-C2?eU>UvPJ#^ zej4knzP^#>qQ}_JbXwo=z~SRU%FZG9AXEWvhAJq9^K+sT(zzJh%H29a;$i7lVAe&= zCZ(&dWDRL(67*e-me=bF1f+3%f(c6X@69Wc4d1ho`)TM0y!_s8 zJI*y8Qo9te^UsH)*k{_sSytBY)~UCZ_gUAQ%sJ(WM%kk>ixT>>?)ub{;<~z4I9?;3 z-RJk=MRg{&5{_T~f77^(`(*PONxW@SmMp%nVP`je##(XQUR}Bj`WjpC_6AUJ3#zj1 zjt(@EE)1Yn6wo(B(L!wK#u=pT&|?woTEqKa`i9vLR0az5Z=LPif78>QSwqyYh=FUd zFSWg2%r@F&hppl7NGuEMYO-itCYE&5UK4j495C=AiLpl4+N21~dANKRb(oHOv=z+g zJ7bm;7@Na~E zOg|G0}xz=Gzv_G0pPJ|rsN8b%RboYp7vQ=4Qc z=;rN0t0rOcx(gX$@WRt)eSGl#kpfj@2#_;Y(@HhyT{xAf?>a(4!u$p2YW$ovSRzFb2aO9c^c)lfA`AX z{2%`EH$$i(l;)yu;Lu-J)n8T)KT{GC*p~fG_;LT2@Dt>s>;|8n;x(e_TyGoRMl}#9* zATqcz0USHy{{shJEP*^$+duPOSq-FzgGLqR7dGfGLI~1*$KI=AG{2Wn#%cjqi5mS- z@!OE#*s>G+p5Fvy^1c6IApLTN>H6ANqW6|9!~uc6e$sG%8IGdRH(i#ls!5lR3EF+n z3EF*x^9x?g!Its+rK8GHh1iJp+pLq|f}1OL>Sr{ Ldg}G6_K*Gp8eEl* literal 49122 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 diff --git a/modules/serverless-logic/pages/core/timeouts-support.adoc b/modules/serverless-logic/pages/core/timeouts-support.adoc index 3edee331..7a2f6b22 100644 --- a/modules/serverless-logic/pages/core/timeouts-support.adoc +++ b/modules/serverless-logic/pages/core/timeouts-support.adoc @@ -97,6 +97,80 @@ See more details about this state on the link:{spec_doc_url}#switch-date[Serverl } ---- +=== Event state timeout + +The `event` state is used to wait for one or more events to be received by the workflow and then continue the execution. +If the event state is a starting state, a new workflow instance is created. + +[NOTE] +==== +The event state is not supported as a starting state if the `exclusive` flag is set to `false`, therefore timeout is not supported in this case. +==== + +The `timeouts` property is used for this state to configure the maximum time the workflow should wait for the defined events to arrive. + +If this time is exceeded and the events are not received, the workflow moves to the state defined in the transition property or ends the workflow instance without performing any actions in case of an end state. + +You can see this in the <>. + +For more information about event state timeout, see link:{spec_doc_url}#event-timeout-definition[Serverless Workflow specification]. + +[#event-state] +.Example of event state with timeout +[source,json] +---- +{ + "name": "WaitForEvent", + "type": "event", + "onEvents": [ + { + "eventRefs": [ + "event1" + ], + "eventDataFilter": { + "data": "${ \"The event1 was received.\" }", + "toStateData": "${ .exitMessage }" + }, + "actions": [ + { + "name": "printAfterEvent1", + "functionRef": { + "refName": "systemOut", + "arguments": { + "message": "${\"event-state-timeouts: \" + $WORKFLOW.instanceId + \" executing actions for event1.\"}" + } + } + } + ] + }, + { + "eventRefs": [ + "event2" + ], + "eventDataFilter": { + "data": "${ \"The event2 was received.\" }", + "toStateData": "${ .exitMessage }" + }, + "actions": [ + { + "name": "printAfterEvent2", + "functionRef": { + "refName": "systemOut", + "arguments": { + "message": "${\"event-state-timeouts: \" + $WORKFLOW.instanceId + \" executing actions for event2.\"}" + } + } + } + ] + } + ], + "timeouts": { + "eventTimeout": "PT30S" + }, + "transition": "PrintExitMessage" +} +---- + === Deploying a timed-based workflow In order to deploy a workflow that contains timeouts or any other timer-based action, it is necessary to have Job Service running in your environment, which is an external service responsible to control the workflows timers, see the <> for more information. @@ -225,6 +299,17 @@ If none of the events arrive before the timeout is overdue, the workflow then mo .Switch timeout workflow image::core/switch-state-timeouts.svg[] +=== Event workflow + +The event example is similar to the switch one but once the execution reaches the state, it waits for one of the configured events, `event1` or `event2`, to arrive, see the <>. + +If none of the configured events arrive before the timeout is overdue, the workflow execution moves to the next state defined in the corresponding `transition` property, skipping the events that were not received in time together with actions configured for them. + +If one of the events arrives before the timeout is overdue, the workflow then moves to the state defined in `transition`, executing the corresponding event that has arrived in the state definition together with actions defined for it. + +.Event timeout workflow +image::core/event-state-timeouts.svg[] + === Running the example To run the example you must have access to a kubernetes cluster running with Knative configured. @@ -369,6 +454,18 @@ curl -X 'POST' \ -d '{}' ---- +* Event + +.Creating an event workflow with timeout +[source, shell] +---- +curl -X 'POST' \ +'http://timeouts-showcase.default.10.105.86.217.sslip.io/event_state_timeouts' \ +-H 'accept: */*' \ +-H 'Content-Type: application/json' \ +-d '{}' +---- + * Checking whether the workflow instance was created .Getting the created workflow instance @@ -400,4 +497,4 @@ As you can see there are no active workflow instances, indicating the timeout wa * xref:eventing/working-with-callbacks.adoc[Callback state in {context}] -include::../../pages/_common-content/report-issue.adoc[] \ No newline at end of file +include::../../pages/_common-content/report-issue.adoc[] diff --git a/modules/serverless-logic/pages/getting-started/cncf-serverless-workflow-specification-support.adoc b/modules/serverless-logic/pages/getting-started/cncf-serverless-workflow-specification-support.adoc index 61d24775..490cef2e 100644 --- a/modules/serverless-logic/pages/getting-started/cncf-serverless-workflow-specification-support.adoc +++ b/modules/serverless-logic/pages/getting-started/cncf-serverless-workflow-specification-support.adoc @@ -231,7 +231,10 @@ Alternatively, you can use xref:serverless-logic:core/understanding-workflow-err [[timeouts]] == Timeouts -{product_name} has limited support for the Timeouts feature, which covers only *Callback* and *Switch* states with events. +{product_name} has limited support for the timeouts feature, which covers only *Callback*, *Switch*, and *Event* states. + +For start event state the `exclusive` property is not supported if set to `false`, therefore the timeout is not supported for the event state when starting a workflow. + Other states will be included in future releases. For more information about timeouts, see xref:serverless-logic:core/timeouts-support.adoc[Timeouts on events for {context}]. From 33f17f79a1ed0de25aebb375dd07a9b93d08a61e Mon Sep 17 00:00:00 2001 From: Abhishek Gill Date: Mon, 6 Feb 2023 16:09:33 +0530 Subject: [PATCH 02/12] [KOGITO-8141][KOGITO-8309] - Enhancing Knative Eventing guide with info about local testing (#260) --- antora.yml | 1 + ...-produce-events-with-knative-eventing.adoc | 46 +++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/antora.yml b/antora.yml index d826a0b6..60b20d6c 100644 --- a/antora.yml +++ b/antora.yml @@ -35,6 +35,7 @@ asciidoc: https://github.com/serverlessworkflow/specification/blob/0.8.x/specification.md cloud_events_url: 'https://cloudevents.io/' cloud_events_sdk_url: 'https://github.com/cloudevents/sdk-java' + cloud_events_git_url: https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents open_api_spec_url: 'https://spec.openapis.org/oas/v3.1.0.html' quarkus_openapi_gen_url: 'https://github.com/quarkiverse/quarkus-openapi-generator' kie_tools_releases_page_url: 'https://github.com/kiegroup/kie-tools/releases' diff --git a/modules/serverless-logic/pages/eventing/consume-produce-events-with-knative-eventing.adoc b/modules/serverless-logic/pages/eventing/consume-produce-events-with-knative-eventing.adoc index fb2d050a..3abb8bf5 100644 --- a/modules/serverless-logic/pages/eventing/consume-produce-events-with-knative-eventing.adoc +++ b/modules/serverless-logic/pages/eventing/consume-produce-events-with-knative-eventing.adoc @@ -154,8 +154,54 @@ The following table lists the configuration property related to Knative sink gen |`default` |This property indicates the name of the default Knative broker that is deployed in the Kubernetes namespace. This broker is used as the reference to create the Knative triggers, which are responsible to delegate the events that the workflow service consumes. +| `mp.messaging.incoming.kogito_incoming_stream.path` +| `/` (root path) +|This property indicates the HTTP path where the workflow application will listen for the CloudEvents in the default incoming channel. + +| `mp.messaging.incoming..path` +| `/` (root path) +| This property indicates the HTTP path where the workflow application will listen for the CloudEvents in the specific given channel name. The channel name is the event `type` as defined in the Serverless Workflow events definition. + |=== +[[proc-manually-sending-events-to-an-http-endpoint]] +== Manually sending events to an HTTP endpoint + +You can send HTTP CloudEvents to the workflow application endpoint by using any tool that's capable to produce HTTP requests. The only requirement is that the request conforms to the link:{cloud_events_git_url}/spec.md#message[CloudEvents specification]. + +For example, with the help of `curl`, you can send an event to the workflow using the following command: + +.Sending a CloudEvent over HTTP using the structured format. +[source,shell] +---- +curl -X POST \ + -H 'Content-Type: application/cloudevents+json' \ + -d '{"datacontenttype": "application/json", "specversion":"1.0","id":"41495513-a9ef-4a81-8479-21bb14db61f0","source":"/local/curl","type":"kogito.serverless.loanbroker.aggregated.quotes.response","data": { "amount": 300000, "term": 30, "credit": { "score": 700, "history": 15 }, "quotes": [{ "bankId": "Bank1", "rate": 12.2 }, {"bankId": "Bank2", "rate": 10}] } } ' \ +http://localhost:8080 +---- + +In this example we are using the link:{cloud_events_git_url}/bindings/http-protocol-binding.md#32-structured-content-mode[CloudEvents structured format], which includes every event information within the request payload. Note the header `Content-Type` being `application/cloudevents+json`. + +Alternatively, you can use the link:{cloud_events_git_url}/bindings/http-protocol-binding.md#31-binary-content-mode[CloudEvents binary format], which includes the event metadata in the HTTP header. For example, using the same event as before: + +.Sending a CloudEvent over HTTP using the binary format. +[source,shell] +---- +curl -X POST -i \ + -H 'Content-Type: application/json' \ + -H 'ce-specversion: 1.0' \ + -H 'ce-id: 41495513-a9ef-4a81-8479-21bb14db61f0' \ + -H 'ce-source: /local/curl' \ + -H 'ce-type: kogito.serverless.loanbroker.aggregated.quotes.response' \ + -d '{ "amount": 300000, "term": 30, "credit": { "score": 700, "history": 15 }, "quotes": [{ "bankId": "Bank1", "rate": 12.2 }, {"bankId": "Bank2", "rate": 10}] }' \ +http://localhost:8080/ +---- + +You can use this tool to test your {product_name} application locally and verify if the events are being consumed correctly by the workflow. + +For more information about testing incoming and outgoing CloudEvents over HTTP, see xref:testing-and-troubleshooting/mocking-http-cloudevents-with-wiremock.adoc[Mocking HTTP CloudEvents sink using WireMock]. + + [[proc-generating-kn-objects-build-time]] == Generating Knative objects during build time From 6cb5c4bd587a47ec1565e744fb6f14e73761bfe8 Mon Sep 17 00:00:00 2001 From: Abhishek Gill Date: Mon, 6 Feb 2023 16:10:44 +0530 Subject: [PATCH 03/12] [KOGITO-8304] - Document the usage of all-in-one jobs-service image (#261) --- modules/serverless-logic/pages/core/timeouts-support.adoc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/serverless-logic/pages/core/timeouts-support.adoc b/modules/serverless-logic/pages/core/timeouts-support.adoc index 7a2f6b22..ede58edb 100644 --- a/modules/serverless-logic/pages/core/timeouts-support.adoc +++ b/modules/serverless-logic/pages/core/timeouts-support.adoc @@ -3,6 +3,9 @@ // Metadata: :description: Using timeouts in {context} :keywords: kogito, workflow, serverless, timeout, timer, expiration +// links +:jobs_service_image_url: https://quay.io/repository/kiegroup/kogito-jobs-service-allinone +:jobs_service_image_usage_url: https://github.com/kiegroup/kogito-images#jobs-services-all-in-one When you define a state in a serverless workflow, you can use the `timeouts` property to configure the maximum time to complete this state. When that time is overdue, the state is considered timed-out, and the engine continues the execution from this state. The execution flow depends on the state type, for instance, @@ -210,6 +213,11 @@ The example shows how to run PostgreSQL as a Kubernetes deployment, but you can ==== Ephemeral Alternatively, there is an in-memory database support that does not require any external database configuration, it can be used for testing and development purposes, but it is not recommended for production, since all jobs are lost upon a service restart or failure. +==== +[NOTE] +==== +The job service link:{jobs_service_image_url}[image] is equipped with the PostgreSQL and Ephemeral (InMemory) options that can be switched using the `JOBS_SERVICE_PERSISTENCE`. If not set, it defaults to the `ephemeral` option. For more information about the job service, the container image can be found link:{jobs_service_image_usage_url}(here). +==== === Job Service communication [NOTE] From 361dc3e4c959f299dd7527ff59bf21db23b68418 Mon Sep 17 00:00:00 2001 From: Abhishek Gill Date: Mon, 6 Feb 2023 16:46:59 +0530 Subject: [PATCH 04/12] [KOGITO-7676] Adding Postgres DB migration guide (#277) --- modules/ROOT/nav.adoc | 1 + .../postgresql-flyway-migration.adoc | 101 ++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 modules/serverless-logic/pages/persistence/postgresql-flyway-migration.adoc diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index 6d142cd5..ab715680 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -51,6 +51,7 @@ //**** xref:serverless-logic:testing-and-troubleshooting/development-tools-for-troubleshooting.adoc[Development tools for troubleshooting] *** Persistence **** xref:serverless-logic:persistence/persistence-with-postgresql.adoc[Running a workflow service using PostgreSQL] +**** xref:serverless-logic:persistence/postgresql-flyway-migration.adoc[Migrate your PostgreSQL database] //**** xref:serverless-logic:persistence/workflow-database-for-db-admins.adoc[Workflows database for DB admins] // **** xref:serverless-logic:persistence/data-consistency.adoc[Data consistency] *** Cloud diff --git a/modules/serverless-logic/pages/persistence/postgresql-flyway-migration.adoc b/modules/serverless-logic/pages/persistence/postgresql-flyway-migration.adoc new file mode 100644 index 00000000..85fb4f0d --- /dev/null +++ b/modules/serverless-logic/pages/persistence/postgresql-flyway-migration.adoc @@ -0,0 +1,101 @@ += Migrating Your PostgreSQL Database with a Kogito upgrade +:flyway_install_url: https://flywaydb.org/download/community +:flyway_migrate_existing_url: https://flywaydb.org/documentation/learnmore/existing +:kogito_ddl_script_url: https://repo1.maven.org/maven2/org/kie/kogito/kogito-ddl +:flyway_url: https://flywaydb.org/ +:flyway_baseline_migration_url: https://documentation.red-gate.com/fd/baseline-migrations-184127465.html + +Kogito provides an out-of-the-box way to manage your database schema changes with each upgrade. It uses link:{flyway_url}[Flyway] to achieve this functionality. + +When you upgrade your Kogito version, by default it will pick up the latest changes available from Kogito and apply them automatically. + +NOTE: This feature is currently available only for `kogito-addons-quarkus-persistence-postgresql` extension. + +== How to migrate + +=== Migrate using Flyway Config + +* Kogito provides a default mechanism for migrating your database while updating the Kogito version using the following `Flyway` properties (default value is `false`): ++ +-- +[source,console] +---- +quarkus.flyway.migrate-at-start=true +---- +-- +This will create a schema history table `flyway_schema_history` in your database to track the version of each database, recording in it every versioned migration file applied to build that version. + +=== Migrate using Flyway CLI +If you want to migrate manually you can use the Flyway migration CLI tool. + +* Download Flyway migration command-line tool from the link:{flyway_install_url}[Download Flyway Community Edition] website. +* Add the following properties in the `/conf/flyway.conf` file: ++ +-- +[source,console] +---- +flyway.url=jdbc:postgresql://localhost:5432/foobardb +flyway.user=foo +flyway.password=bar +---- +-- +* You can specify these options with commands as well. The Flyway CLI will prompt for the username and password if they are missing in the configuration. ++ +-- +[source,console] +---- +$ flyway migrate -url=jdbc:postgresql://localhost:5432/foobardb -user=foo -password=bar +---- +-- +* Download the Kogito DDL zip from link:{kogito_ddl_script_url}[this link], choose the correct version, extract the files and use the scripts from the `postgresql` folder. +* You can specify the location of the SQL files that need to be migrated using the `flyway.locations` option. For example, ++ +-- +[source,console] +---- +flyway.locations=classpath:com.mycomp.migration,database/migrations,filesystem:/sql-migrations,s3:migrationsBucket,gcs:migrationsBucket +---- +-- + +=== Manually executing scripts +You can use the provided SQL scripts in the zip file to migrate the database by executing them one by one. + +* You can find the Kogito DDL scripts by visiting link:{kogito_ddl_script_url}[this link]. +* Download the zip file of the scripts from the needed version for the Kogito upgrade. +* Extract the files. +* Execute the `sql` files from `postgresql` folder. ++ +-- +[source,console] +---- +> psql -H host -U username -d database_name -a -f create_table.sql +---- +-- + +== Baseline migration +In order to apply migrations to an existing schema. It is necessary to establish the baseline from where Flyway should start executing new migrations. That means, in case your schema already contains a structure and from now on, new changes provided by Kogito should be applied via Flyway integration. In Flyway terms, only migrations above `baselineVersion` will then be applied. +Using below properties you can initialize flyway schema table. + +=== Baseline using Quarkus Configuration: +-- +[source,console] +---- +quarkus.flyway.baseline-on-migrate=true +quarkus.flyway.baseline-version=1.32.0 +---- +-- +=== Baseline using Flyway CLI: +-- +[source,console] +---- +$ flyway -baselineOnMigrate="true" -baselineVersion="1.32.0" migrate +---- +-- + +NOTE: Be careful when enabling this feature as it removes the safety net which ensures that Flyway does not migrate the wrong database in case of a configuration mistake. + +=== More details on Flyway migrations +* link:{flyway_baseline_migration_url}[Baseline Migrations Documentation]. +* link:{flyway_migrate_existing_url}[Existing Database Setup Documentation]. + +include::../../pages/_common-content/report-issue.adoc[] From 447628605dcb95eef5a4530481f7f69f45796491 Mon Sep 17 00:00:00 2001 From: Abhishek Gill Date: Mon, 6 Feb 2023 17:39:05 +0530 Subject: [PATCH 05/12] [KOGITO-7282] - [KSW-Guides] Deploying on Kubernetes Clusters (#267) --- antora.yml | 6 +- modules/ROOT/nav.adoc | 3 +- ...build-workflow-image-with-quarkus-cli.adoc | 4 +- .../build-workflow-images-with-kn-cli.adoc | 1 - .../_create_namespace_and_deploy_info.adoc | 40 ++ ...eploy_workflow_application_requisites.adoc | 8 + .../pages/cloud/common/_prerequisites.adoc | 15 + .../cloud/common/_proc_deploy_sw_kn_cli.adoc | 44 +++ .../cloud/common/_proc_deploy_sw_kubectl.adoc | 141 +++++++ .../common/_verify_if_swf_is_deployed.adoc | 42 +++ .../deploying-on-kubernetes-cluster.adoc | 1 - .../pages/cloud/deploying-on-kubernetes.adoc | 166 ++++++++ .../pages/cloud/deploying-on-minikube.adoc | 357 ++---------------- .../pages/core/timeouts-support.adoc | 1 - .../tooling/kn-plugin-workflow-overview.adoc | 12 +- 15 files changed, 507 insertions(+), 334 deletions(-) delete mode 100644 modules/serverless-logic/pages/cloud/build-workflow-images-with-kn-cli.adoc create mode 100644 modules/serverless-logic/pages/cloud/common/_create_namespace_and_deploy_info.adoc create mode 100644 modules/serverless-logic/pages/cloud/common/_deploy_workflow_application_requisites.adoc create mode 100644 modules/serverless-logic/pages/cloud/common/_prerequisites.adoc create mode 100644 modules/serverless-logic/pages/cloud/common/_proc_deploy_sw_kn_cli.adoc create mode 100644 modules/serverless-logic/pages/cloud/common/_proc_deploy_sw_kubectl.adoc create mode 100644 modules/serverless-logic/pages/cloud/common/_verify_if_swf_is_deployed.adoc delete mode 100644 modules/serverless-logic/pages/cloud/deploying-on-kubernetes-cluster.adoc create mode 100644 modules/serverless-logic/pages/cloud/deploying-on-kubernetes.adoc diff --git a/antora.yml b/antora.yml index 60b20d6c..dbdec3fb 100644 --- a/antora.yml +++ b/antora.yml @@ -8,17 +8,17 @@ asciidoc: attributes: product_name: OpenShift Serverless Logic context: OpenShift Serverless Logic - kogito_version_redhat: 1.30.0.Final-redhat-00001 + kogito_version_redhat: 1.32.0.Final-redhat-00003 quarkus_platform: com.redhat.quarkus.platform kogito_sw_ga: >- org.kie.kogito:kogito-quarkus-serverless-workflow - quarkus_version: 2.7.6.Final-redhat-00006 + quarkus_version: 2.13.5.Final-redhat-00003 java_min_version: 11+ maven_min_version: 3.8.1 graalvm_min_version: 21.3.0 spec_version: 0.8 vscode_version: 1.66.0 - kn_cli_version: 0.25.0 + kn_cli_version: 0.26.0 kie_tools_node_min_version: 16.13.2 kie_tools_pnpm_min_version: 7.0.0 kie_tools_golang_min_version: 1.19 diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index ab715680..1e143c71 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -56,10 +56,9 @@ // **** xref:serverless-logic:persistence/data-consistency.adoc[Data consistency] *** Cloud **** xref:serverless-logic:cloud/build-workflow-image-with-quarkus-cli.adoc[Building workflow images using Quarkus CLI] -// **** xref:serverless-logic:cloud/build-workflow-images-with-kn-cli.adoc[Building Workflow Images locally with KN CLI] // **** xref:serverless-logic:cloud/build-workflow-images-with-tekton.adoc[Building Workflow Images with Tekton Pipelines] **** xref:serverless-logic:cloud/deploying-on-minikube.adoc[Deploying your {context} application on Minikube] -// **** xref:serverless-logic:cloud/deploying-on-kubernetes-cluster.adoc[Deploying on Kubernetes Clusters] +**** xref:serverless-logic:cloud/deploying-on-kubernetes.adoc[Deploying your {context} application on Kubernetes] // **** xref:serverless-logic:cloud/versioning-workflows-in-knative.adoc[Versioning workflows in Knative] **** xref:serverless-logic:cloud/kubernetes-service-discovery.adoc[Kubernetes service discovery in {context}] *** Integrations diff --git a/modules/serverless-logic/pages/cloud/build-workflow-image-with-quarkus-cli.adoc b/modules/serverless-logic/pages/cloud/build-workflow-image-with-quarkus-cli.adoc index f85da74f..4b49c060 100644 --- a/modules/serverless-logic/pages/cloud/build-workflow-image-with-quarkus-cli.adoc +++ b/modules/serverless-logic/pages/cloud/build-workflow-image-with-quarkus-cli.adoc @@ -68,7 +68,7 @@ After installing the required tooling, you can start building your workflow appl .Prerequisites * You have created a Quarkus project. * Quarkus CLI is installed. -For more information about installing the Quarkus CLI, see link:https://quarkus.io/guides/cli-tooling#installing-the-cli[Installing the Quarkus CLI]. +For more information about installing the Quarkus CLI, see link:{quarkus_cli_url}#installing-the-cli[Installing the Quarkus CLI]. .Procedure . In a command terminal, navigate to your Quarkus project. @@ -264,5 +264,7 @@ Example response:: * xref:serverless-logic:cloud/deploying-on-minikube.adoc[Deploying your {context} application on Minikube] //* xref:serverless-logic:cloud/deploying-on-kubernetes-cluster.adoc[Deploying your Serverless Workflow application on Kubernetes] Guide not available in DP1 +* xref:cloud/deploying-on-kubernetes.adoc[Deploying your {context} application on Kubernetes] + include::../../pages/_common-content/report-issue.adoc[] diff --git a/modules/serverless-logic/pages/cloud/build-workflow-images-with-kn-cli.adoc b/modules/serverless-logic/pages/cloud/build-workflow-images-with-kn-cli.adoc deleted file mode 100644 index e026ad3c..00000000 --- a/modules/serverless-logic/pages/cloud/build-workflow-images-with-kn-cli.adoc +++ /dev/null @@ -1 +0,0 @@ -//= Building Workflow Images locally with KN CLI \ No newline at end of file diff --git a/modules/serverless-logic/pages/cloud/common/_create_namespace_and_deploy_info.adoc b/modules/serverless-logic/pages/cloud/common/_create_namespace_and_deploy_info.adoc new file mode 100644 index 00000000..126954b0 --- /dev/null +++ b/modules/serverless-logic/pages/cloud/common/_create_namespace_and_deploy_info.adoc @@ -0,0 +1,40 @@ + +-- +.Create namespace +[source,shell] +---- +kubectl create namespace serverless-workflow-greeting-quarkus +---- +-- + +. Set the Kubernetes context to the newly created namespace using the following command: ++ +-- +.Set Kubernetes context to a namespace +[source,shell] +---- +kubectl config set-context --current --namespace=serverless-workflow-greeting-quarkus +---- + +After setting the context, all kubectl commands will use the selected namespace. + +You can use the following command to verify the current namespace: + +.Verify the current namespace +[source,shell] +---- +kubectl config view --minify -o jsonpath='{..namespace}' +---- +-- + +. Deploy your {context} application {deploy_application}. ++ +-- +The next step is to deploy your workflow application and execute it. +You can read the further sections on the different procedures to deploy your {context} application. + +[NOTE] +==== +You can use the native image due to the faster startup. + +For more information about installing the workflow application, see xref:cloud/build-workflow-image-with-quarkus-cli.adoc[Building workflow images using Quarkus CLI] document. +==== +-- diff --git a/modules/serverless-logic/pages/cloud/common/_deploy_workflow_application_requisites.adoc b/modules/serverless-logic/pages/cloud/common/_deploy_workflow_application_requisites.adoc new file mode 100644 index 00000000..50c3c60f --- /dev/null +++ b/modules/serverless-logic/pages/cloud/common/_deploy_workflow_application_requisites.adoc @@ -0,0 +1,8 @@ +.Prerequisites +* {cluster_kind}. +* Knative is ready. + +For more information, see {knative_procedure}. +* Knative CLI is installed. +* (Optional) Quarkus CLI is installed. + +For more information, see link:{quarkus_cli_url}[Building Quarkus Apps with Quarkus command line interface (CLI)]. +* {context} application container is ready. diff --git a/modules/serverless-logic/pages/cloud/common/_prerequisites.adoc b/modules/serverless-logic/pages/cloud/common/_prerequisites.adoc new file mode 100644 index 00000000..50c3f5d6 --- /dev/null +++ b/modules/serverless-logic/pages/cloud/common/_prerequisites.adoc @@ -0,0 +1,15 @@ +:kn_cli_url: https://knative.dev/docs/client/install-kn/ + +.Prerequisites +* Your {context} application is ready to use. + +For more information about building the application container, see xref:cloud/build-workflow-image-with-quarkus-cli.adoc[Building workflow images using Quarkus CLI]. + +* {environment_prereq} +* `kubectl` {kubectl_prereq} +* Knative CLI is installed. + +For more information, see link:{kn_cli_url}[Install the Knative CLI]. +* Knative workflow CLI is installed. + +For more information see xref:tooling/kn-plugin-workflow-overview.adoc[Serverless Workflow plug-in for Knative CLI]. +* (Optional) Quarkus CLI is installed. + +For more information, see link:{quarkus_cli_url}[Building Quarkus Apps with Quarkus command line interface (CLI)]. + diff --git a/modules/serverless-logic/pages/cloud/common/_proc_deploy_sw_kn_cli.adoc b/modules/serverless-logic/pages/cloud/common/_proc_deploy_sw_kn_cli.adoc new file mode 100644 index 00000000..c00b3aa4 --- /dev/null +++ b/modules/serverless-logic/pages/cloud/common/_proc_deploy_sw_kn_cli.adoc @@ -0,0 +1,44 @@ +[[proc-deploy-sw-application-knative-cli]] +=== Deploying your workflow application using Knative CLI + +Once you have pushed your workflow application into the {registry} registry, you can use the command-line tools, such +as Knative CLI or `kubectl` to initiate the deployment process. + +.Prerequisites +* Workflow application is installed. +* Knative CLI is installed. + +For more information, see link:{kn_cli_url}[Install the Knative CLI]. + +.Procedure +. In a command terminal, execute the following command to deploy your workflow application using Knative CLI: ++ +-- +.Example of deploying workflow application using Knative CLI +[source,shell,subs="attributes+"] +---- +kn service create hello \ + --image={k8s_registry}/serverless-workflow-greeting-quarkus:1.0 \ + --pull-policy=IfNotPresent \ + --port 8080 +---- + +.Example output +[source,shell] +---- +Creating service 'hello' in namespace 'serverless-workflow-greeting-quarkus': + + 0.066s The Route is still working to reflect the latest desired specification. + 0.099s ... + 0.322s Configuration "hello" is waiting for a Revision to become ready. + 4.885s ... + 5.061s Ingress has not yet been reconciled. + 5.322s Waiting for load balancer to be ready + 5.460s Ready to serve. + +Service 'hello' created to latest revision 'hello-00001' is available at URL: +http://hello.serverless-workflow-greeting-quarkus.10.103.94.37.sslip.io +---- +-- + +// verify deployed swf +include::_verify_if_swf_is_deployed.adoc[] diff --git a/modules/serverless-logic/pages/cloud/common/_proc_deploy_sw_kubectl.adoc b/modules/serverless-logic/pages/cloud/common/_proc_deploy_sw_kubectl.adoc new file mode 100644 index 00000000..ed665e4b --- /dev/null +++ b/modules/serverless-logic/pages/cloud/common/_proc_deploy_sw_kubectl.adoc @@ -0,0 +1,141 @@ +[[proc-deploy-sw-application-kubectl]] +=== Deploying your workflow application using `kubectl` + +You can also use `kubectl` command-line interface and plain Kubernetes objects to deploy your workflow application. + +And, instead of creating `knative` `yaml|json` descriptors, you can leverage the Quarkus Kubernetes extension and +Kogito Knative add-on to generate the descriptors. + +.Prerequisites +* Kogito Workflow application ready to use. +* `kubectl` command-line tool is installed. +* (Optional) Quarkus CLI is installed + +For more information about installing the Quarkus CLI, see link:{quarkus_cli_url}#installing-the-cli[Installing the Quarkus CLI]. + +.Procedure +. Add the Quarkus extensions to generate `knative` `yaml|json` descriptors. ++ +-- +To use the Quarkus Kubernetes extension and Kogito Knative add-on, ensure that the following dependencies are available in the `pom.xml` file and Gradle: + +[tabs] +==== +pom.xml:: ++ +[source,xml] +---- + + org.kie.kogito + kogito-addons-quarkus-knative-eventing + + + io.quarkus + quarkus-kubernetes + +---- +Gradle:: ++ +[source,shell,subs="attributes+"] +---- +quarkus-kubernetes 'io.quarkus:quarkus-kubernetes:{quarkus_version}' +quarkus-kubernetes 'org.kie.kogito:kogito-addons-quarkus-knative-eventing:{page-component-version}' +---- +==== +-- + +. To generate the `knative` `yaml|json` descriptors, set the following properties in the `application.properties` +file of your workflow application: ++ +-- +.System properties to generate knative descriptors +[source,shell,subs="attributes+"] +---- +quarkus.kubernetes.deployment-target=knative +quarkus.knative.name=greeting-quarkus-kubectl +---- +-- + +. Build your workflow application. ++ +-- +Once you have built your application, you can find the generated descriptors files in the `target/kubernetes` directory: + +* `knative.json` +* `knative.yml` + +Following is an example of the generated files: + +.Knative descriptor example for a workflow application +[source,yaml,subs="attributes+"] +---- +--- +apiVersion: serving.knative.dev/v1 +kind: Service +metadata: + annotations: + app.quarkus.io/commit-id: 06c3fe8e2dfc42e2211cbcc41224f5a3d6bd1f26 + app.quarkus.io/build-timestamp: 2022-06-23 - 23:53:38 +0000 + labels: + app.kubernetes.io/name: greeting-quarkus-kubectl + name: greeting-quarkus-kubectl +spec: + template: + metadata: + labels: + app.kubernetes.io/name: greeting-quarkus-kubectl + spec: + containerConcurrency: 0 + containers: + - image: {k8s_registry}/serverless-workflow-greeting-quarkus:1.0-native + livenessProbe: + failureThreshold: 3 + httpGet: + path: /q/health/live + port: null + scheme: HTTP + initialDelaySeconds: 0 + periodSeconds: 30 + successThreshold: 1 + timeoutSeconds: 10 + name: greeting-quarkus-kubectl + ports: + - containerPort: 8080 + name: http1 + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /q/health/ready + port: null + scheme: HTTP + initialDelaySeconds: 0 + periodSeconds: 30 + successThreshold: 1 + timeoutSeconds: 10 +---- + +[NOTE] +==== +Once the files are generated, you might be required to add the `imagePullPolicy` manually before deploying the workflow application. +==== + +[WARNING] +==== +Some system properties are not working properly due to a bug in the `Decorate API`. For more information about the bug, see the link:https://github.com/quarkusio/quarkus/issues/23832[Quarkus issue]. + +There is a small bug on the `Decorate API` where some system properties are not taking effect, for more information take a look at this link:https://github.com/quarkusio/quarkus/issues/23832[Quarkus issue]. After the file generation, you might be required to add the `imagePullPolicy` manually before deploying it. +==== +-- + +. Enter the following command to deploy the workflow application using `kubectl`: ++ +-- +.Deploy the workflow application using `kubectl` +[source,shell] +---- +kubectl apply -f target/kubernetes/knative.yml +---- +-- + +// verify deployed swf +include::_verify_if_swf_is_deployed.adoc[] + diff --git a/modules/serverless-logic/pages/cloud/common/_verify_if_swf_is_deployed.adoc b/modules/serverless-logic/pages/cloud/common/_verify_if_swf_is_deployed.adoc new file mode 100644 index 00000000..7192d01e --- /dev/null +++ b/modules/serverless-logic/pages/cloud/common/_verify_if_swf_is_deployed.adoc @@ -0,0 +1,42 @@ +Verify if the workflow application is deployed correctly: +-- +[tabs] +==== +On kubectl:: ++ +[source,shell] +---- +kubectl get services.serving.knative.dev greeting-quarkus-cli +---- +On Knative CLI:: ++ +[source,shell] +---- +kn service list greeting-quarkus-cli +---- +==== +-- + +-- +.Example output +[source,shell] +---- +NAME URL LATEST AGE CONDITIONS READY REASON +greeting-quarkus-cli http://greeting-quarkus-cli.serverless-workflow-greeting-quarkus.10.103.94.37.sslip.io greeting-quarkus-cli-00001 7m6s 3 OK / 3 True +---- +-- + +.Use the URL in the output to send request to your workflow application. +-- +.Example request +[source,shell] +---- +curl -X POST -H 'Content-Type:application/json' -H 'Accept:application/json' -d '{"name": "John", "language": "English"}' http://hello.serverless-workflow-greeting-quarkus.10.103.94.37.sslip.io/jsongreet +---- + +.Example response +[source,json] +---- +{"id":"0f77abce-837e-4bd2-b4f1-a0e5e0265fcb","workflowdata":{"name":"John","language":"English","greeting":"Hello from JSON Workflow, "}} +---- +-- \ No newline at end of file diff --git a/modules/serverless-logic/pages/cloud/deploying-on-kubernetes-cluster.adoc b/modules/serverless-logic/pages/cloud/deploying-on-kubernetes-cluster.adoc deleted file mode 100644 index 478089c1..00000000 --- a/modules/serverless-logic/pages/cloud/deploying-on-kubernetes-cluster.adoc +++ /dev/null @@ -1 +0,0 @@ -//= Deploying on Kubernetes Clusters \ No newline at end of file diff --git a/modules/serverless-logic/pages/cloud/deploying-on-kubernetes.adoc b/modules/serverless-logic/pages/cloud/deploying-on-kubernetes.adoc new file mode 100644 index 00000000..8925427c --- /dev/null +++ b/modules/serverless-logic/pages/cloud/deploying-on-kubernetes.adoc @@ -0,0 +1,166 @@ += Deploying your Serverless Workflow application on Kubernetes +:description: Deploying Serverless Application on Kubernetes +:keywords: kogito, workflow, quarkus, serverless, kn, kubectl +:table-caption: Data Set +// envs for common content +:environment_prereq: Kubernetes Cluster is available +:kubectl_prereq: command-line tool is installed +:cluster_kind: Kubernetes with Knative is ready +:knative_procedure: <> +:deploy_application: on Kubernetes +:k8s_registry: quay.io/mynamespace +:registry: target +:container_push: Property to whether or not push images +// links +:knative_kubernetes_url: https://knative.dev/docs/install/ +:verify_knative_url: https://knative.dev/docs/serving/knative-kubernetes-services/#before-you-begin +:quay_io_url: https://quay.io/ +:k8s_pull_secret_url: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ +:knative_domain_dns_url: https://knative.dev/docs/install/operator/knative-with-operators/#configure-dns +:quarkus_k8s_deploy_url: https://github.com/quarkusio/quarkus/issues/26385 + + +This document describes how to deploy a {context} application using a Kubernetes cluster, along with a procedure to run the Knative platform. + +// shared pre req +include::common/_prerequisites.adoc[subs=quotes+] + + +Before proceeding further, make sure that you have access to the Kubernetes cluster with Knative available. + +[[proc-verify-knative-kubernetes]] +== Verifying Knative availability on Kubernetes + +To make sure Knative is available, it can be checked with the commands below: + +.Verify if Knative is available +[source,shell] +---- +kubectl get services -n knative-serving +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +activator-service ClusterIP 10.97.110.167 9090/TCP,8008/TCP,80/TCP,81/TCP,443/TCP 44m +autoscaler ClusterIP 10.98.64.78 9090/TCP,8008/TCP,8080/TCP 44m +autoscaler-bucket-00-of-01 ClusterIP 10.111.19.134 8080/TCP 44m +controller ClusterIP 10.98.150.141 9090/TCP,8008/TCP 44m +default-domain-service ClusterIP 10.106.202.150 80/TCP 43m +domainmapping-webhook ClusterIP 10.102.87.208 9090/TCP,8008/TCP,443/TCP 44m +net-kourier-controller ClusterIP 10.100.120.208 18000/TCP 43m +webhook ClusterIP 10.108.153.180 9090/TCP,8008/TCP,443/TCP 44m +---- + +For more information on how to figure out if Knative is installed please refer to this link:{verify_knative_url}[link]. +If not, follow the installation steps described in the Knative link:{knative_kubernetes_url}[documentation]. + + +[[proc-deploy-sw-application-kubernetes]] +== Deploying your workflow application on Kubernetes + +Once Knative is ready, you can initiate the process of deploying your {context} application on Kubernetes. + + +// shared app req +include::common/_deploy_workflow_application_requisites.adoc[] + +[IMPORTANT] +==== +By default, Kubernetes does not have any registry installed. You can check with the administrator if a private registry is available. Otherwise, you can publish the Application Container image on the link:{quay_io_url}[Quay.io], or on any other registry of your preference. + +If the registry requires authentication you need to create a Pull Secret with the registry credentials, for more +information please take a look in this link:{k8s_pull_secret_url}[link]. +==== + +.Procedure +. Create `serverless-workflow-greeting-quarkus` namespace using the following command: ++ +include::common/_create_namespace_and_deploy_info.adoc[] + +In the following procedures, you can find two examples of deploying your workflow application, including: + +* <> +* <> +* <> + + +[IMPORTANT] +==== +For this tutorial, we use the `default-domain` provided by Knative that configures *Knative Serving* to use +the Magic DNS for naming resolution, for more details please check the Knative link:{knative_domain_dns_url}[documentation]. +==== + +// deploy with kn-cli +include::common/_proc_deploy_sw_kn_cli.adoc[] + +// deploy with kubectl +include::common/_proc_deploy_sw_kubectl.adoc[] + +[[proc-deploy-sw-application-quarkus-cli]] +=== Deploying your workflow application using Quarkus CLI + + +.Prerequisites +* Workflow application is installed. +* Quarkus CLI is installed. + +For more information, see link:{quarkus_cli_url}[Building Quarkus Apps with Quarkus command line interface (CLI)]. + + +.Procedure +. Add the Quarkus extensions to deploy the `knative` service ++ +-- +You can add the Kubernetes and the Kogito Knative extensions to your project with the Quarkus CLI: + +.Add kubernetes and Kogito knative extensions to the project with Quarkus CLI +[source,shell] +---- +quarkus extension add kubernetes +quarkus extension add kogito-addons-quarkus-knative-eventing +---- +-- +. To deploy your workflow application using Quarkus CLI, set the following system properties in `application.properties` file: ++ +-- +.Required system properties +[source,properties] +---- +quarkus.knative.name=greeting-quarkus-cli <1> +quarkus.kubernetes.deployment-target=knative <2> +quarkus.kubernetes.deploy=true <3> +quarkus.container-image.push=true <4> +quarkus.container-image.group=kiegroup <5> +quarkus.container-image.registry=quay.io <6> +quarkus.container-image.tag=1.0-SNAPSHOT <7> + +---- + +<1> Property to set the Knative service name +<2> Property to set the target deployment type +<3> Property to set whether or not deploy on an active Kubernetes cluster +<4> {container_push} +<5> Property to define which registry group/namespace the built image belongs to +<6> Property to define to which registry the built image will be pushed to +<7> Sets the built Container image tag + +[IMPORTANT] +==== +This feature works with Quarkus 2.10.2.Final or later. For more information, see +link:{quarkus_k8s_deploy_url}[link]. +==== +-- + +.Build and Deploy your workflow application +[source,shell] +---- +quarkus build -- -Pcontainer -DskipTests \ + -Dquarkus.container-image.push=true \ + -Dquarkus.container-image.registry=quay.io \ + -Dquarkus.container-image.group=kiegroup \ + -Dquarkus.container-image.tag=1.0-SNAPSHOT +---- + +Note that the maven profile activated is named as `container`, which provides the needed system properties to build the +target container image. + +// verify deployed swf +include::common/_verify_if_swf_is_deployed.adoc[] + +include::../../pages/_common-content/report-issue.adoc[] \ No newline at end of file diff --git a/modules/serverless-logic/pages/cloud/deploying-on-minikube.adoc b/modules/serverless-logic/pages/cloud/deploying-on-minikube.adoc index 4d3bb3dd..f92cc46d 100644 --- a/modules/serverless-logic/pages/cloud/deploying-on-minikube.adoc +++ b/modules/serverless-logic/pages/cloud/deploying-on-minikube.adoc @@ -1,13 +1,21 @@ = Deploying your {context} application on Minikube - :compat-mode!: // Metadata: :description: Deploying Serverless Application on Minikube :keywords: kogito, workflow, quarkus, serverless, kn, kubectl, minikube :table-caption: Data Set +// envs for common content +:environment_prereq: Minikube is installed +:kubectl_prereq: command-line tool is installed. Otherwise, Minikube handles it. +:cluster_kind: Minikube is installed +:knative_procedure: <> +:deploy_application: using the Minikube registry +:k8s_registry: dev.local/kogito +:registry: Minikube's +:container_push: Property to whether or not push images. When using Minikube's remote Docker daemon to avoid image validation + // links :minikube_url: https://minikube.sigs.k8s.io -:kn_cli_url: https://knative.dev/docs/client/install-kn/ :kn_cli_quickstart_plugin_url: https://knative.dev/docs/install/quickstart-install/#install-the-knative-cli :knative_on_minikube_step_by_step_url: https://redhat-developer-demos.github.io/knative-tutorial/knative-tutorial/setup/minikube.html :knative_issue_url: https://github.com/knative/serving/issues/6101 @@ -17,16 +25,8 @@ This document describes how to deploy your workflow application using a local Ku For more information about Minikube and related system requirements, see link:{minikube_url}/docs/start/[Getting started with Minikube] documentation. -.Prerequisites -* Your workflow application is ready to use. + -For more information about building the application container, see xref:serverless-logic:cloud/build-workflow-image-with-quarkus-cli.adoc[Building workflow images using Quarkus CLI]. - -* Minikube is installed. -* `kubectl` command-line tool is installed. Otherwise, Minikube handles it. -* Knative CLI is installed. + -For more information, see link:{kn_cli_url}[Install the Knative CLI]. -* Knative workflow CLI is installed. For more information see xref:serverless-logic:tooling/kn-plugin-workflow-overview.adoc[Serverless Workflow plug-in for Knative CLI]. -* (Optional) Quarkus CLI is installed. For more information, see link:{quarkus_cli_url}[Building Quarkus Apps with Quarkus command line interface (CLI)]. +// shared pre req +include::common/_prerequisites.adoc[] To deploy your workflow application on Minikube, you need to install Knative on Minikube. However, first you need to ensure that Minikube is installed correctly. @@ -123,13 +123,9 @@ To follow the manual process of installing Knative on Minikube, see link:{knativ Once you install Knative on Minikube, you can initiate the process of deploying your workflow application on Minikube. -.Prerequisites -* Minikube is installed. -* Knative CLI is installed. + -For more information, see <>. -* (Optional) Quarkus CLI is installed. + -For more information, see link:{quarkus_cli_url}[Building Quarkus Apps with Quarkus command line interface (CLI)]. -* {context} application container is ready. +// shared app req +include::common/_deploy_workflow_application_requisites.adoc[] + .Procedure . In a command terminal, enter the following command to configure Docker to use the in-cluster Docker daemon: @@ -203,279 +199,22 @@ Status: . After starting the Minikube tunnel, create `serverless-workflow-greeting-quarkus` namespace using the following command: + --- -.Create namespace -[source,shell] ----- -kubectl create namespace serverless-workflow-greeting-quarkus ----- --- - -. Set the context to the newly created namespace using the following command: -+ --- -.Set context to a namespace -[source,shell] ----- -kubectl config set-context --current --namespace=serverless-workflow-greeting-quarkus ----- - -After setting the context, all Minikube commands use the created namespace. You can use the following command to verify the current namespace: - -.Verify the current namespace -[source,shell] ----- -kubectl config view --minify -o jsonpath='{..namespace}' ----- --- - -. Deploy your workflow application using the Minikube registry. -+ --- -The next step is to deploy your workflow application to execute it. -You can see the further sections for different procedures to deploy your workflow application. - -[NOTE] -==== -You can use the native image due to the faster startup. + -For more information about installing the workflow application, see xref:serverless-logic:cloud/build-workflow-image-with-quarkus-cli.adoc[Building workflow images using Quarkus CLI] document. -==== --- +include::common/_create_namespace_and_deploy_info.adoc[] In the following procedures, you can find two examples of deploying your workflow application, including: -* Using Knative CLI (`kn`) -* Using `kubectl` command-line tool - -[[proc-deploy-sw-application-knative-cli]] -=== Deploying your workflow application using Knative CLI - -Once you have installed your workflow application into the Minikube registry, you can use the command-line tools, such as Knative CLI or `kubectl` to initiate the deployment process. - -.Prerequisites -* Workflow application is installed. -* Knative CLI is installed. + -For more information, see link:{kn_cli_url}[Install the Knative CLI]. - -.Procedure -. In a command terminal, execute the following command to deploy your workflow application using Knative CLI: -+ --- -.Example of deploying workflow application using Knative CLI -[source,shell] ----- -kn service create hello \ - --image=dev.local/kogito/serverless-workflow-greeting-quarkus:1.0 \ - --pull-policy=IfNotPresent \ - --port 8080 ----- - -.Example output -[source,shell] ----- -Creating service 'hello' in namespace 'serverless-workflow-greeting-quarkus': - - 0.066s The Route is still working to reflect the latest desired specification. - 0.099s ... - 0.322s Configuration "hello" is waiting for a Revision to become ready. - 4.885s ... - 5.061s Ingress has not yet been reconciled. - 5.322s Waiting for load balancer to be ready - 5.460s Ready to serve. - -Service 'hello' created to latest revision 'hello-00001' is available at URL: -http://hello.serverless-workflow-greeting-quarkus.10.103.94.37.sslip.io ----- --- - -. Use the URL in the output to send request to your workflow application. -+ --- -.Example request -[source,shell] ----- -curl -X POST -H 'Content-Type:application/json' -H 'Accept:application/json' -d '{"name": "John", "language": "English"}' http://hello.serverless-workflow-greeting-quarkus.10.103.94.37.sslip.io/jsongreet ----- - -.Example response -[source,json] ----- -{"id":"0f77abce-837e-4bd2-b4f1-a0e5e0265fcb","workflowdata":{"name":"John","language":"English","greeting":"Hello from JSON Workflow, "}} ----- --- - [[proc-deploy-sw-application-kubectl]] === Deploying your workflow application using `kubectl` +* <> +* <> +* <> -You can also use `kubectl` command-line interface and plain Kubernetes objects to deploy your workflow application. + -And, instead of creating `knative` `yaml|json` descriptors, you can leverage the Quarkus Kubernetes extension and Kogito Knative add-on to generate the descriptors. -.Prerequisites -* Workflow application is installed. -* `kubectl` command-line tool is installed. -* (Optional) Quarkus CLI is installed + -For more information about installing the Quarkus CLI, see link:https://quarkus.io/guides/cli-tooling#installing-the-cli[Installing the Quarkus CLI]. +// deploy with kn-cli +include::common/_proc_deploy_sw_kn_cli.adoc[] -.Procedure -. Add the Quarkus extensions to generate `knative` `yaml|json` descriptors. -+ --- -To use the Quarkus Kubernetes extension and Kogito Knative add-on, ensure that the following dependencies are available in `pom.xml` file and Gradle: - -[tabs] -==== -pom.xml:: -+ -[source,xml] ----- - - org.kie.kogito - kogito-addons-quarkus-knative-eventing - - - io.quarkus - quarkus-kubernetes - ----- -Gradle:: -+ -[source,shell,subs="attributes+"] ----- -quarkus-kubernetes 'io.quarkus:quarkus-kubernetes:{quarkus_version}' -quarkus-kubernetes 'org.kie.kogito:kogito-addons-quarkus-knative-eventing:{page-component-version}' ----- -==== --- - -. To generate the `knative` `yaml|json` descriptors, set the following properties in the `application.properties` file of your workflow application: -+ --- -.System properties to generate knative descriptors -[source,shell,subs="attributes+"] ----- -quarkus.kubernetes.deployment-target=knative -quarkus.knative.name=greeting-quarkus-kubectl ----- --- - -. Build your workflow application. -+ --- -Once you have built your application, you can find the generated descriptors files in the `target/kubernetes` directory: - -* `knative.json` -* `knative.yml` - -Following is an example of the generated files: - -.Knative descriptor example for a workflow application -[source,yaml] ----- ---- -apiVersion: serving.knative.dev/v1 -kind: Service -metadata: - annotations: - app.quarkus.io/commit-id: 06c3fe8e2dfc42e2211cbcc41224f5a3d6bd1f26 - app.quarkus.io/build-timestamp: 2022-06-23 - 23:53:38 +0000 - labels: - app.kubernetes.io/name: greeting-quarkus-kubectl - name: greeting-quarkus-kubectl -spec: - template: - metadata: - labels: - app.kubernetes.io/name: greeting-quarkus-kubectl - spec: - containerConcurrency: 0 - containers: - - image: dev.local/kogito/serverless-workflow-greeting-quarkus:1.0-native - livenessProbe: - failureThreshold: 3 - httpGet: - path: /q/health/live - port: null - scheme: HTTP - initialDelaySeconds: 0 - periodSeconds: 30 - successThreshold: 1 - timeoutSeconds: 10 - name: greeting-quarkus-kubectl - ports: - - containerPort: 8080 - name: http1 - protocol: TCP - readinessProbe: - failureThreshold: 3 - httpGet: - path: /q/health/ready - port: null - scheme: HTTP - initialDelaySeconds: 0 - periodSeconds: 30 - successThreshold: 1 - timeoutSeconds: 10 ----- - -[NOTE] -==== -Once the files are generated, you might be required to add the `imagePullPolicy` manually before deploying the workflow application. -==== - -[WARNING] -==== -Some of the system properties are not working properly due to a bug in decorate API. For more information about the bug, see link:https://github.com/quarkusio/quarkus/issues/23832[Quarkus issue]. - -There is a small bug on the 'Decorate API' where some system properties are not taking effect, for more information take a look at this link:https://github.com/quarkusio/quarkus/issues/23832[Quarkus issue]. After the file generation, you might be required to add the `imagePullPolicy` manually before deploying it. -==== --- - -. Enter the following command to deploy the workflow application using `kubectl`: -+ --- -.Deploy the workflow application using `kubectl` -[source,shell] ----- -kubectl apply -f target/kubernetes/knative.yml ----- --- - -. Verify if the workflow application is deployed correctly using the following command: -+ --- -[tabs] -==== -On kubectl:: -+ -[source,shell] ----- -kubectl get services.serving.knative.dev greeting-quarkus-kubectl ----- -On Knative CLI:: -+ -[source,shell] ----- -kn service list ----- -==== - -.Example output -[source,shell] ----- -NAME URL LATESTCREATED LATESTREADY READY REASON -greeting-quarkus-kubectl http://greeting-quarkus-kubectl.serverless-workflow-greeting-quarkus.10.103.94.37.sslip.io greeting-quarkus-kubectl-00001 greeting-quarkus-kubectl-00001 True ----- --- - -. Access the workflow application using the listed URL in the output. -+ --- -.Access workflow application -[source,shell] ----- -curl -X POST -H 'Content-Type:application/json' -H 'Accept:application/json' -d '{"name": "John", "language": "English"}' http://greeting-quarkus-kubectl.serverless-workflow-greeting-quarkus.10.103.94.37.sslip.io/jsongreet ----- --- +// deploy with kubectl +include::common/_proc_deploy_sw_kubectl.adoc[] [[proc-deploy-sw-application-quarkus-cli]] === Deploying your workflow application using Quarkus CLI @@ -484,7 +223,6 @@ curl -X POST -H 'Content-Type:application/json' -H 'Accept:application/json' -d * Workflow application is installed. * Quarkus CLI is installed. + For more information, see link:{quarkus_cli_url}[Building Quarkus Apps with Quarkus command line interface (CLI)]. -* You have completed the steps in link:#proc-deploy-sw-application-kubectl[Deploying your workflow application using `kubectl`] .Procedure . Add the Quarkus extensions to deploy the `knative` service @@ -511,9 +249,10 @@ quarkus.kubernetes.deploy=true <3> quarkus.container-image.push=false <4> ---- -<1> Property for the Knative resource name -<2> Property to set whether or not deploy on an active Kubernetes cluster -<3> Property to whether or not push images when using Minikube's remove Docker daemon to avoid image validation +<1> Property to set the Knative service name +<2> Property to set the target deployment type +<3> Property to set whether or not deploy on an active Kubernetes cluster +<4> {container_push} [IMPORTANT] ==== @@ -522,41 +261,21 @@ link:{quarkus_k8s_deploy_url}[link]. ==== -- -. Verify if your workflow application is deployed correctly: -+ --- -[tabs] -==== -On kubectl:: -+ -[source,shell] ----- -kubectl get services.serving.knative.dev greeting-quarkus-cli ----- -On Knative CLI:: -+ +.Build and Deploy your workflow application [source,shell] ---- -kn service list greeting-quarkus-cli +quarkus build -- -Pcontainer -DskipTests \ + -Dquarkus.container-image.push=false \ + -Dquarkus.container-image.registry=quay.io \ + -Dquarkus.container-image.group=kiegroup \ + -Dquarkus.container-image.tag=1.0-SNAPSHOT ---- -==== -.Example output -[source,shell] ----- -NAME URL LATEST AGE CONDITIONS READY REASON -greeting-quarkus-cli http://greeting-quarkus-cli.serverless-workflow-greeting-quarkus.10.103.94.37.sslip.io greeting-quarkus-cli-00001 7m6s 3 OK / 3 True ----- --- +Note that the maven profile activated is named as `container`, which provides the needed system properties to build the +target container image. + +// verify deployed swf +include::common/_verify_if_swf_is_deployed.adoc[] -. You can access your workflow application using the listed URL in the output. -+ --- -.Access your workflow application -[source,shell] ----- -curl -X POST -H 'Content-Type:application/json' -H 'Accept:application/json' -d '{"name": "John", "language": "English"}' http://greeting-quarkus-cli.serverless-workflow-greeting-quarkus.10.103.94.37.sslip.io/jsongreet.37.sslip.io/jsongreet ----- --- include::../../pages/_common-content/report-issue.adoc[] diff --git a/modules/serverless-logic/pages/core/timeouts-support.adoc b/modules/serverless-logic/pages/core/timeouts-support.adoc index ede58edb..07d5f286 100644 --- a/modules/serverless-logic/pages/core/timeouts-support.adoc +++ b/modules/serverless-logic/pages/core/timeouts-support.adoc @@ -213,7 +213,6 @@ The example shows how to run PostgreSQL as a Kubernetes deployment, but you can ==== Ephemeral Alternatively, there is an in-memory database support that does not require any external database configuration, it can be used for testing and development purposes, but it is not recommended for production, since all jobs are lost upon a service restart or failure. -==== [NOTE] ==== The job service link:{jobs_service_image_url}[image] is equipped with the PostgreSQL and Ephemeral (InMemory) options that can be switched using the `JOBS_SERVICE_PERSISTENCE`. If not set, it defaults to the `ephemeral` option. For more information about the job service, the container image can be found link:{jobs_service_image_usage_url}(here). diff --git a/modules/serverless-logic/pages/tooling/kn-plugin-workflow-overview.adoc b/modules/serverless-logic/pages/tooling/kn-plugin-workflow-overview.adoc index 49fbfac7..4fb6aa4d 100644 --- a/modules/serverless-logic/pages/tooling/kn-plugin-workflow-overview.adoc +++ b/modules/serverless-logic/pages/tooling/kn-plugin-workflow-overview.adoc @@ -20,7 +20,7 @@ This document describes how you can install and use the `kn-plugin-workflow` plu [[proc-install-sw-plugin-kn-cli]] == Installing the {context} plug-in for Knative CLI -You can use the {context} plug-in to set up your local workflow project quickly using Knative CLI. +You can use the {context} plug-in to set up your local workflow project quickly using Knative CLI. .Prerequisites * link:{java_install_url}[Java] {java_min_version} is installed. @@ -38,12 +38,12 @@ You can use the {context} plug-in to set up your local workflow project quickly * Install `kn workflow` command as a plug-in of the Knative CLI using the following steps: .. Install the Knative CLI. For installation instructions, see link:{kn_cli_install_url}[Installing kn] documentation in GitHub. .. Copy the `kn-workflow` binary to a directory in your `PATH`, such as `/usr/local/bin` and ensure that the file name is `kn-workflow`. -.. On Mac, add ownership to the root user as follows: +.. On Mac, add execution permission as follows: + `chmod +x /usr/local/bin/kn-workflow` + [WARNING] -==== +==== Some systems might block the application to run due to Apple enforcing policies. To fix this problem, check the *Security & Privacy* section in the *System Preferences* -> *General* tab to approve the application to run. For more information, see link:{apple_support_url}[Apple support article: Open a Mac app from an unidentified developer]. ==== .. Run the following command to verify that `kn-workflow` plug-in is installed successfully: @@ -132,7 +132,7 @@ kn workflow create --extension quarkus-jsonp,quarkus-smallrye-openapi You can add multiple extensions using the comma-separated names of the extensions in the previous command. [NOTE] -==== +==== When you run the `create` command for the first time, it might take a while due to the necessity of downloading the required dependencies for the Quarkus project. ==== -- @@ -140,7 +140,7 @@ When you run the `create` command for the first time, it might take a while due [[proc-build-sw-project-kn-cli]] == Building a workflow project using Knative CLI -After creating your workflow project, you can use the `build` command with `kn workflow` to build your workflow project in your current directory and to generate a container image. +After creating your workflow project, you can use the `build` command with `kn workflow` to build your workflow project in your current directory and to generate a container image. The process of building your workflow project produces a `knative.yml` file in the `./target/kubernetes` folder. If your workflow contains events, then the building process also generates a `kogito.yml` file. @@ -241,7 +241,7 @@ Before using the `--push` option, ensure that you have access to your registry. Using Docker:: + -- -The process of building your workflow project using Docker is straightforward and also a default approach. +The process of building your workflow project using Docker is straightforward and also a default approach. When using Docker, you can automatically push the container image to the respective registry by using the `--push` option as shown in the following command: From 570663843cc11b0f54b5eecf23e90ec4116dc1c6 Mon Sep 17 00:00:00 2001 From: Abhishek Gill Date: Mon, 6 Feb 2023 17:47:46 +0530 Subject: [PATCH 06/12] [KOGITO-8314] [KSW-Guides] Using Serverless Operator to deploy workflow applications on Kubernetes --- antora.yml | 7 + modules/ROOT/nav.adoc | 2 + ...ith-serverless-operator-on-kubernetes.adoc | 193 ++++++++++++++++++ .../pages/cloud/deploying-on-minikube.adoc | 1 - 4 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 modules/serverless-logic/pages/cloud/build-and-deploy-with-serverless-operator-on-kubernetes.adoc diff --git a/antora.yml b/antora.yml index dbdec3fb..a5817030 100644 --- a/antora.yml +++ b/antora.yml @@ -24,6 +24,7 @@ asciidoc: kie_tools_golang_min_version: 1.19 docker_min_version: 20.10.7 docker_compose_min_version: 1.27.2 + operator_version: main kogito_devservices_imagename: registry.redhat.io/openshift-serverless-1-tech-preview/logic-data-index-ephemeral-rhel8:1.24.0-11 kogito_examples_repository_url: 'https://github.com/kiegroup/kogito-examples' kogito_sw_examples_url: https://github.com/kiegroup/kogito-examples/tree/1.30.x/serverless-workflow-examples @@ -67,3 +68,9 @@ asciidoc: openshift_application_data_services_service_account_url: https://console.redhat.com/application-services/service-accounts openshift_application_data_services_service_registry_url: https://console.redhat.com/application-services/service-registry openshift_application_data_services_apache_kafka_url: https://console.redhat.com/application-services/streams/kafkas + camel_url: https://camel.apache.org/ + # must align this version + camel_extensions_url: https://camel.apache.org/camel-quarkus/2.14.x/reference/extensions + kaoto_url: https://marketplace.visualstudio.com/items?itemName=redhat.vscode-kaoto + + minikube_url: https://minikube.sigs.k8s.io diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index 1e143c71..a32a4bb6 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -61,6 +61,8 @@ **** xref:serverless-logic:cloud/deploying-on-kubernetes.adoc[Deploying your {context} application on Kubernetes] // **** xref:serverless-logic:cloud/versioning-workflows-in-knative.adoc[Versioning workflows in Knative] **** xref:serverless-logic:cloud/kubernetes-service-discovery.adoc[Kubernetes service discovery in {context}] +**** xref:cloud/build-and-deploy-with-serverless-operator-on-kubernetes.adoc[Buiding and deploying a {context} application on Kubernetes using the {product_name} Serverless Operator] + *** Integrations **** xref:serverless-logic:integrations/expose-metrics-to-prometheus.adoc[Exposing the workflow base metrics to Prometheus] // **** xref:serverless-logic:integrations/camel-k-integration.adoc[Integrating with Camel-K] diff --git a/modules/serverless-logic/pages/cloud/build-and-deploy-with-serverless-operator-on-kubernetes.adoc b/modules/serverless-logic/pages/cloud/build-and-deploy-with-serverless-operator-on-kubernetes.adoc new file mode 100644 index 00000000..c5303bf4 --- /dev/null +++ b/modules/serverless-logic/pages/cloud/build-and-deploy-with-serverless-operator-on-kubernetes.adoc @@ -0,0 +1,193 @@ += Building and deploying a {context} application on Kubenetes using the {product_name} Serverless Operator +:compat-mode!: +// Metadata: +:description: Build and deploy using the Kogito Serverless Workflow Operator a serverless workflow application +:keywords: kogito, workflow, serverless, operator, kubernetes, minikube, openshift +// links +:kogito_serverless_operator_url: https://github.com/kiegroup/kogito-serverless-operator/ +:kogito_greeting_example_url: https://github.com/kiegroup/kogito-examples/tree/stable/serverless-workflow-examples/serverless-workflow-greeting-quarkus +:kaniko_issue_url: https://github.com/GoogleContainerTools/kaniko/issues/2201 + +This document describes how to build and deploy your workflow application using a Kubernetes cluster with the link:{kogito_serverless_operator_url}[{product_name} Serverless Operator]. If you don't have any cluster operational, link:{minikube_url}[Minikube] commands are given throughout the guide. + +Using the {product_name} Serverless Operator, you will be able to build and deploy a {product_name} {context} application only by having a workflow definition. + +If you already have a container built and pushed to a container registry and you want to deploy it on the Kubernetes cluster, then you can do it without the operator following the guide xref:cloud/deploying-on-kubernetes.adoc[Deploying your {context} application on Kubernetes]. + +The link:{kogito_serverless_operator_url}[{product_name} Serverless Operator] is currently in Alpha version, is under active development and is at the moment supporting {context} definitions that are using: + +* Functions +* States + - Switch including dataConditions + - Inject including data with a transition +* Operations including Actions containing functionRef with arguments +* KeepActive +* AutoRetries +* ExpressionsLang (jq or jsonpath) + +.Prerequisites +* A workflow definition. +* A Kubernetes cluster with admin privileges ++If you haven't got one prepare, you can use a local link:{minikube_url}[Minikube] instance. +* `kubectl` command-line tool is installed. ++Otherwise, Minikube provides it. + +== Prepare a Minikube instance + +[source,shell,subs="attributes+"] +---- +minikube start --cpus 4 --memory 4096 --addons registry --addons metrics-server --insecure-registry "10.0.0.0/24" --insecure-registry "localhost:5000" +---- + +[NOTE] +==== +To speed up the build time, you can increase CPUs and memory options so that you minikube instance will have more resources. For example, use `--cpus 12 --memory 16384`. +==== + +[TIP] +==== +If it does not work with the default driver, as known as `docker`, you can try to start with the `podman` driver as follows: +==== + +.Start minikube with podman driver +[source,shell,subs="attributes+"] +---- +minikube start [...] --driver podman +---- + + +[IMPORTANT] +==== +There are some issues with the `crio` container runtime and Kaniko that the operator is using. Reference: link:{kaniko_issue_url}[ISSUE-2201] +==== + +== Setup {product_name} Serverless Operator + +In order to have an up-and-running instance of the {product_name} Serverless Operator you can use the following command: + +.Install {product_name} Serverless Operator on Kubernetes +[source,shell,subs="attributes+"] +---- +kubectl create -f https://raw.githubusercontent.com/kiegroup/kogito-serverless-operator/{operator_version}F/operator.yaml +---- + +You can follow, then, the deployment of the {product_name} Serverless Operator: + +.Watch the {product_name} Serverless Operator pod +[source,shell,subs="attributes+"] +---- +kubectl get pod -n kogito-serverless-operator-system --watch +---- + +You can also follow the operator’s log: + +.Watch the {product_name} Serverless Operator pod logs +[source,shell,subs="attributes+"] +---- +kubectl logs deployment/kogito-serverless-operator-controller-manager -n kogito-serverless-operator-system -f +---- + +Once the operator is running, it will watch for new custom resources (CR) so that you can prepare your environment to be ready to build a new {context} application based on the definitions you will send to the operator. + +== Preparing for the build + +You should follow these steps to create a container that you can deploy as a service on Kubernetes. + +=== Create a namespace for the building phase + +Let's create a new namespace that will hold all the resources that we (or the operator) will create (pods, deployments, services, secretes, config map, and Custom Resources) in this guide. + +.Create a namespace for the application to build & run in +[source,bash,subs="attributes+"] +---- +kubectl create namespace kogito-workflows +---- + +=== Create a secret for the container registry authentication +.Create a secret for the container registry authentication +[source,bash,subs="attributes+"] +---- +kubectl create secret docker-registry regcred --docker-server= --docker-username= --docker-password= --docker-email= -n kogito-workflows +---- + +or you can directly import your local docker config into your the Kubernetes cluster: + +.Create a secret for the container registry authentication based on local docker config +[source,bash,subs="attributes+"] +---- +kubectl create secret generic regcred --from-file=.dockerconfigjson=${HOME}/.docker/config.json --type=kubernetes.io/dockerconfigjson -n kogito-workflows +---- + +=== Create a {product_name} Serverless Platform containing the configuration (i.e. registry address, secret) for building your workflows + +The {product_name} Serverless Platform CR is the resource used to control the behavior of the {product_name} Serverless Operator. +It defines the behavior of all Custom Resources (Workflow and Build) in the given namespace. + +Since the {product_name} Serverless Operator is installed in global mode, you will need to specify a {product_name} Serverless Platform CR in each namespace where you want the operator to be executed. +You can find a basic {product_name} Serverless Platform CR example in the `config/samples` folder that you can simply apply to configure your operator. + +.Create a {product_name} Serverless Platform CR +[source,bash,subs="attributes+"] +---- +kubectl apply -f https://raw.githubusercontent.com/kiegroup/kogito-serverless-operator/{operator_version}/config/samples/sw.kogito_v1alpha08_kogitoserverlessplatform.yaml -n kogito-workflows +---- + +Note: In this Custom Resource, spec.platform.registry.secret is the name of the secret you created just before. + +[TIP] +==== +You can also update "on-the-fly" the {product_name} Serverless Platform CR registry field with this command (change ) + +.Create a {product_name} Serverless Platform CR with a specific registry +[source,bash,subs="attributes+"] +---- +curl https://raw.githubusercontent.com/kiegroup/kogito-serverless-operator/{operator_version}/config/samples/sw.kogito_v1alpha08_kogitoserverlessplatform.yaml | sed "s|address: .*|address: " | kubectl apply -f - +---- + +In order to retrieve the Cluster IP address of Minikube's internal registry to configure your platform, you can use the following command: + +.Retrieve Minikube registry internal IP +[source,bash,subs="attributes+"] +---- +kubectl get svc registry -n kube-system -ojsonpath='{.spec.clusterIP}' +---- +==== + +== Build and deploy your {context} application + +You can now send your {product_name} {context} Custom Resource to the operator which includes the {context} definition. + +You can find a basic {product_name} {context} Custom Resource in the `config/samples` folder that is defining the link:{kogito_greeting_example_url}[{product_name} {context} Greeting example]. + +[source,bash,subs="attributes+"] +---- +kubectl apply -f https://raw.githubusercontent.com/kiegroup/kogito-serverless-operator/{operator_version}/config/samples/sw.kogito_v1alpha08_kogitoserverlessworkflow.yaml -n kogito-workflows +---- +You can check the logs of the build of your workflow via: + +.Get the {product_name} {context} application pod logs +[source,bash,subs="attributes+"] +---- +kubectl logs kogito-greeting-builder -n kogito-workflows +---- + +The final pushed image must be printed into the logs at the end of the build. + +== Check the {product_name} {context} application is running +In order to check that the {product_name} {context} Greeting application is up and running, you can try to perform a test HTTP call, from the greeting pod. + +.Check the greeting application is running +[source,bash,subs="attributes+"] +---- +kubectl patch svc greeting -n kogito-workflows -p '{"spec": {"type": "NodePort"}}' +GREETING_SVC=$(minikube service greeting -n kogito-workflows --url) +curl -X POST -H 'Content-Type:application/json' -H 'Accept:application/json' -d '{"name": "John", "language": "English"}' $GREETING_SVC/greeting +---- + +If everything is working well you should receive a response like this: + +.Response from the greeting application +[source,json,subs="attributes+"] +---- +{"id":"b5fbfaa3-b125-4e6c-9311-fe5a3577efdd","workflowdata":{"name":"John","language":"English","greeting":"Hello from JSON Workflow, "}} +---- \ No newline at end of file diff --git a/modules/serverless-logic/pages/cloud/deploying-on-minikube.adoc b/modules/serverless-logic/pages/cloud/deploying-on-minikube.adoc index f92cc46d..0c724014 100644 --- a/modules/serverless-logic/pages/cloud/deploying-on-minikube.adoc +++ b/modules/serverless-logic/pages/cloud/deploying-on-minikube.adoc @@ -15,7 +15,6 @@ :container_push: Property to whether or not push images. When using Minikube's remote Docker daemon to avoid image validation // links -:minikube_url: https://minikube.sigs.k8s.io :kn_cli_quickstart_plugin_url: https://knative.dev/docs/install/quickstart-install/#install-the-knative-cli :knative_on_minikube_step_by_step_url: https://redhat-developer-demos.github.io/knative-tutorial/knative-tutorial/setup/minikube.html :knative_issue_url: https://github.com/knative/serving/issues/6101 From c0a7c0a942780c6779f328fbf02ef88ce9f46936 Mon Sep 17 00:00:00 2001 From: Abhishek Gill Date: Mon, 6 Feb 2023 17:52:25 +0530 Subject: [PATCH 07/12] [KOGITO-8250]-Working with Open API callbacks (#285) --- antora.yml | 1 + modules/ROOT/nav.adoc | 1 + .../images/eventing/openapi-callback.png | Bin 0 -> 20987 bytes .../working-with-openapi-callbacks.adoc | 128 ++++++++++++++++++ 4 files changed, 130 insertions(+) create mode 100644 modules/serverless-logic/assets/images/eventing/openapi-callback.png create mode 100644 modules/serverless-logic/pages/eventing/working-with-openapi-callbacks.adoc diff --git a/antora.yml b/antora.yml index a5817030..8f757fd1 100644 --- a/antora.yml +++ b/antora.yml @@ -49,6 +49,7 @@ asciidoc: maven_install: 'https://maven.apache.org/install.html' docker_install: 'https://docs.docker.com/engine/install/' podman_install: 'https://docs.podman.io/en/latest/' + open_api_swagger_spec_url: https://swagger.io/docs/specification kubectl_install: 'https://kubernetes.io/docs/tasks/tools/install-kubectl' java_install_url: 'https://www.java.com/en/download/help/download_options.html' maven_install_url: 'https://maven.apache.org/install.html' diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index a32a4bb6..77a20ada 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -39,6 +39,7 @@ **** xref:serverless-logic:eventing/consume-produce-events-with-knative-eventing.adoc[Consuming and producing events on Knative Eventing] **** xref:serverless-logic:eventing/event-correlation-with-workflows.adoc[Event correlation in {context}] **** xref:serverless-logic:eventing/working-with-callbacks.adoc[Callback state in {context}] +**** xref:serverless-logic:eventing/working-with-openapi-callbacks.adoc[OpenAPI Callback in {context}] *** Security **** xref:serverless-logic:security/authention-support-for-openapi-services.adoc[Authentication for OpenAPI services in {context}] **** xref:serverless-logic:security/orchestrating-third-party-services-with-oauth2.adoc[Orchestration of third-party services using OAuth 2.0 authentication in {context}] diff --git a/modules/serverless-logic/assets/images/eventing/openapi-callback.png b/modules/serverless-logic/assets/images/eventing/openapi-callback.png new file mode 100644 index 0000000000000000000000000000000000000000..72ed06d68db0f87607fceeeca22a3a3318eeccf9 GIT binary patch literal 20987 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 Date: Mon, 6 Feb 2023 17:58:22 +0530 Subject: [PATCH 08/12] Minor fixes --- antora.yml | 2 +- .../cloud/common/_proc_deploy_sw_kubectl.adoc | 2 +- .../pages/cloud/deploying-on-kubernetes.adoc | 4 ++-- .../postgresql-flyway-migration.adoc | 16 ++++++++-------- supplemental_ui/img/favicon.ico | Bin 0 -> 7292 bytes supplemental_ui/partials/head-meta.hbs | 4 +--- 6 files changed, 13 insertions(+), 15 deletions(-) create mode 100644 supplemental_ui/img/favicon.ico diff --git a/antora.yml b/antora.yml index 8f757fd1..fa07e049 100644 --- a/antora.yml +++ b/antora.yml @@ -27,7 +27,7 @@ asciidoc: operator_version: main kogito_devservices_imagename: registry.redhat.io/openshift-serverless-1-tech-preview/logic-data-index-ephemeral-rhel8:1.24.0-11 kogito_examples_repository_url: 'https://github.com/kiegroup/kogito-examples' - kogito_sw_examples_url: https://github.com/kiegroup/kogito-examples/tree/1.30.x/serverless-workflow-examples + kogito_sw_examples_url: https://github.com/kiegroup/kogito-examples/tree/1.32.x/serverless-workflow-examples kogito_examples_url: 'https://github.com/kiegroup/kogito-examples.git' kogito_apps_url: https://github.com/kiegroup/kogito-apps/tree/main quarkus_cli_url: 'https://quarkus.io/guides/cli-tooling' diff --git a/modules/serverless-logic/pages/cloud/common/_proc_deploy_sw_kubectl.adoc b/modules/serverless-logic/pages/cloud/common/_proc_deploy_sw_kubectl.adoc index ed665e4b..dc639033 100644 --- a/modules/serverless-logic/pages/cloud/common/_proc_deploy_sw_kubectl.adoc +++ b/modules/serverless-logic/pages/cloud/common/_proc_deploy_sw_kubectl.adoc @@ -6,7 +6,7 @@ And, instead of creating `knative` `yaml|json` descriptors, you can leverage the Kogito Knative add-on to generate the descriptors. .Prerequisites -* Kogito Workflow application ready to use. +* Workflow application ready to use. * `kubectl` command-line tool is installed. * (Optional) Quarkus CLI is installed + For more information about installing the Quarkus CLI, see link:{quarkus_cli_url}#installing-the-cli[Installing the Quarkus CLI]. diff --git a/modules/serverless-logic/pages/cloud/deploying-on-kubernetes.adoc b/modules/serverless-logic/pages/cloud/deploying-on-kubernetes.adoc index 8925427c..c5fdcaec 100644 --- a/modules/serverless-logic/pages/cloud/deploying-on-kubernetes.adoc +++ b/modules/serverless-logic/pages/cloud/deploying-on-kubernetes.adoc @@ -1,4 +1,4 @@ -= Deploying your Serverless Workflow application on Kubernetes += Deploying your {context} application on Kubernetes :description: Deploying Serverless Application on Kubernetes :keywords: kogito, workflow, quarkus, serverless, kn, kubectl :table-caption: Data Set @@ -163,4 +163,4 @@ target container image. // verify deployed swf include::common/_verify_if_swf_is_deployed.adoc[] -include::../../pages/_common-content/report-issue.adoc[] \ No newline at end of file +include::../../pages/_common-content/report-issue.adoc[] diff --git a/modules/serverless-logic/pages/persistence/postgresql-flyway-migration.adoc b/modules/serverless-logic/pages/persistence/postgresql-flyway-migration.adoc index 85fb4f0d..c3513ce6 100644 --- a/modules/serverless-logic/pages/persistence/postgresql-flyway-migration.adoc +++ b/modules/serverless-logic/pages/persistence/postgresql-flyway-migration.adoc @@ -1,13 +1,13 @@ -= Migrating Your PostgreSQL Database with a Kogito upgrade += Migrating Your PostgreSQL Database with a {context} upgrade :flyway_install_url: https://flywaydb.org/download/community :flyway_migrate_existing_url: https://flywaydb.org/documentation/learnmore/existing :kogito_ddl_script_url: https://repo1.maven.org/maven2/org/kie/kogito/kogito-ddl :flyway_url: https://flywaydb.org/ :flyway_baseline_migration_url: https://documentation.red-gate.com/fd/baseline-migrations-184127465.html -Kogito provides an out-of-the-box way to manage your database schema changes with each upgrade. It uses link:{flyway_url}[Flyway] to achieve this functionality. +{context} provides an out-of-the-box way to manage your database schema changes with each upgrade. It uses link:{flyway_url}[Flyway] to achieve this functionality. -When you upgrade your Kogito version, by default it will pick up the latest changes available from Kogito and apply them automatically. +When you upgrade your {context} version, by default it will pick up the latest changes available from {context} and apply them automatically. NOTE: This feature is currently available only for `kogito-addons-quarkus-persistence-postgresql` extension. @@ -15,7 +15,7 @@ NOTE: This feature is currently available only for `kogito-addons-quarkus-persis === Migrate using Flyway Config -* Kogito provides a default mechanism for migrating your database while updating the Kogito version using the following `Flyway` properties (default value is `false`): +* {context} provides a default mechanism for migrating your database while updating the {context} version using the following `Flyway` properties (default value is `false`): + -- [source,console] @@ -47,7 +47,7 @@ flyway.password=bar $ flyway migrate -url=jdbc:postgresql://localhost:5432/foobardb -user=foo -password=bar ---- -- -* Download the Kogito DDL zip from link:{kogito_ddl_script_url}[this link], choose the correct version, extract the files and use the scripts from the `postgresql` folder. +* Download the {context} DDL zip from link:{kogito_ddl_script_url}[this link], choose the correct version, extract the files and use the scripts from the `postgresql` folder. * You can specify the location of the SQL files that need to be migrated using the `flyway.locations` option. For example, + -- @@ -60,8 +60,8 @@ flyway.locations=classpath:com.mycomp.migration,database/migrations,filesystem:/ === Manually executing scripts You can use the provided SQL scripts in the zip file to migrate the database by executing them one by one. -* You can find the Kogito DDL scripts by visiting link:{kogito_ddl_script_url}[this link]. -* Download the zip file of the scripts from the needed version for the Kogito upgrade. +* You can find the {context} DDL scripts by visiting link:{kogito_ddl_script_url}[this link]. +* Download the zip file of the scripts from the needed version for the {context} upgrade. * Extract the files. * Execute the `sql` files from `postgresql` folder. + @@ -73,7 +73,7 @@ You can use the provided SQL scripts in the zip file to migrate the database by -- == Baseline migration -In order to apply migrations to an existing schema. It is necessary to establish the baseline from where Flyway should start executing new migrations. That means, in case your schema already contains a structure and from now on, new changes provided by Kogito should be applied via Flyway integration. In Flyway terms, only migrations above `baselineVersion` will then be applied. +In order to apply migrations to an existing schema. It is necessary to establish the baseline from where Flyway should start executing new migrations. That means, in case your schema already contains a structure and from now on, new changes provided by {context} should be applied via Flyway integration. In Flyway terms, only migrations above `baselineVersion` will then be applied. Using below properties you can initialize flyway schema table. === Baseline using Quarkus Configuration: diff --git a/supplemental_ui/img/favicon.ico b/supplemental_ui/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..dc51642ff6f9773f044b7b95b53fae67cb4371b7 GIT binary patch literal 7292 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 literal 0 HcmV?d00001 diff --git a/supplemental_ui/partials/head-meta.hbs b/supplemental_ui/partials/head-meta.hbs index f0baa60f..c067962a 100644 --- a/supplemental_ui/partials/head-meta.hbs +++ b/supplemental_ui/partials/head-meta.hbs @@ -2,6 +2,4 @@ - + From d76c5625d697c36e9a786ba941d0c1a3ff868702 Mon Sep 17 00:00:00 2001 From: Abhishek Gill Date: Thu, 9 Feb 2023 14:41:50 +0530 Subject: [PATCH 09/12] Incorporating PR comments --- antora.yml | 2 +- modules/ROOT/nav.adoc | 3 +- ...ith-serverless-operator-on-kubernetes.adoc | 58 ++++++++++--------- 3 files changed, 33 insertions(+), 30 deletions(-) diff --git a/antora.yml b/antora.yml index fa07e049..a1250d1d 100644 --- a/antora.yml +++ b/antora.yml @@ -24,7 +24,7 @@ asciidoc: kie_tools_golang_min_version: 1.19 docker_min_version: 20.10.7 docker_compose_min_version: 1.27.2 - operator_version: main + operator_version: 1.32.0 kogito_devservices_imagename: registry.redhat.io/openshift-serverless-1-tech-preview/logic-data-index-ephemeral-rhel8:1.24.0-11 kogito_examples_repository_url: 'https://github.com/kiegroup/kogito-examples' kogito_sw_examples_url: https://github.com/kiegroup/kogito-examples/tree/1.32.x/serverless-workflow-examples diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index 77a20ada..a22267b1 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -62,7 +62,8 @@ **** xref:serverless-logic:cloud/deploying-on-kubernetes.adoc[Deploying your {context} application on Kubernetes] // **** xref:serverless-logic:cloud/versioning-workflows-in-knative.adoc[Versioning workflows in Knative] **** xref:serverless-logic:cloud/kubernetes-service-discovery.adoc[Kubernetes service discovery in {context}] -**** xref:cloud/build-and-deploy-with-serverless-operator-on-kubernetes.adoc[Buiding and deploying a {context} application on Kubernetes using the {product_name} Serverless Operator] +**** xref:serverless-logic:cloud/build-and-deploy-with-serverless-operator-on-kubernetes.adoc[Buiding and deploying a {context} application on Kubernetes using the {product_name} Serverless Operator] + *** Integrations **** xref:serverless-logic:integrations/expose-metrics-to-prometheus.adoc[Exposing the workflow base metrics to Prometheus] diff --git a/modules/serverless-logic/pages/cloud/build-and-deploy-with-serverless-operator-on-kubernetes.adoc b/modules/serverless-logic/pages/cloud/build-and-deploy-with-serverless-operator-on-kubernetes.adoc index c5303bf4..a04b165d 100644 --- a/modules/serverless-logic/pages/cloud/build-and-deploy-with-serverless-operator-on-kubernetes.adoc +++ b/modules/serverless-logic/pages/cloud/build-and-deploy-with-serverless-operator-on-kubernetes.adoc @@ -1,20 +1,24 @@ -= Building and deploying a {context} application on Kubenetes using the {product_name} Serverless Operator += (Community Only) = Building and deploying a {context} application on Kubernetes using the {product_name} Operator :compat-mode!: // Metadata: -:description: Build and deploy using the Kogito Serverless Workflow Operator a serverless workflow application +:description: Build and deploy using the OpenShift Serverless Logic Operator a OpenShift Serverless Logic application :keywords: kogito, workflow, serverless, operator, kubernetes, minikube, openshift // links :kogito_serverless_operator_url: https://github.com/kiegroup/kogito-serverless-operator/ :kogito_greeting_example_url: https://github.com/kiegroup/kogito-examples/tree/stable/serverless-workflow-examples/serverless-workflow-greeting-quarkus :kaniko_issue_url: https://github.com/GoogleContainerTools/kaniko/issues/2201 +[NOTE] +==== +This feature is meant for a quick preview on community repositories, and it's not part of the developer preview. +==== This document describes how to build and deploy your workflow application using a Kubernetes cluster with the link:{kogito_serverless_operator_url}[{product_name} Serverless Operator]. If you don't have any cluster operational, link:{minikube_url}[Minikube] commands are given throughout the guide. -Using the {product_name} Serverless Operator, you will be able to build and deploy a {product_name} {context} application only by having a workflow definition. +Using the {product_name} Operator, you will be able to build and deploy a {product_name} application only by having a workflow definition. If you already have a container built and pushed to a container registry and you want to deploy it on the Kubernetes cluster, then you can do it without the operator following the guide xref:cloud/deploying-on-kubernetes.adoc[Deploying your {context} application on Kubernetes]. -The link:{kogito_serverless_operator_url}[{product_name} Serverless Operator] is currently in Alpha version, is under active development and is at the moment supporting {context} definitions that are using: +The link:{kogito_serverless_operator_url}[{product_name} Operator] is currently in Alpha version, is under active development and is at the moment supporting {context} definitions that are using: * Functions * States @@ -27,10 +31,8 @@ The link:{kogito_serverless_operator_url}[{product_name} Serverless Operator] is .Prerequisites * A workflow definition. -* A Kubernetes cluster with admin privileges -+If you haven't got one prepare, you can use a local link:{minikube_url}[Minikube] instance. -* `kubectl` command-line tool is installed. -+Otherwise, Minikube provides it. +* A Kubernetes cluster with admin privileges. If you haven't got one prepare, you can use a local link:{minikube_url}[Minikube] instance. +* `kubectl` command-line tool is installed. Otherwise, Minikube provides it. == Prepare a Minikube instance @@ -61,19 +63,19 @@ minikube start [...] --driver podman There are some issues with the `crio` container runtime and Kaniko that the operator is using. Reference: link:{kaniko_issue_url}[ISSUE-2201] ==== -== Setup {product_name} Serverless Operator +== Setup {product_name} Operator -In order to have an up-and-running instance of the {product_name} Serverless Operator you can use the following command: +In order to have an up-and-running instance of the {product_name} Operator you can use the following command: -.Install {product_name} Serverless Operator on Kubernetes +.Install {product_name} Operator on Kubernetes [source,shell,subs="attributes+"] ---- -kubectl create -f https://raw.githubusercontent.com/kiegroup/kogito-serverless-operator/{operator_version}F/operator.yaml +kubectl create -f https://raw.githubusercontent.com/kiegroup/kogito-serverless-operator/{operator_version}/operator.yaml ---- -You can follow, then, the deployment of the {product_name} Serverless Operator: +You can follow, then, the deployment of the {product_name} Operator: -.Watch the {product_name} Serverless Operator pod +.Watch the {product_name} Operator pod [source,shell,subs="attributes+"] ---- kubectl get pod -n kogito-serverless-operator-system --watch @@ -81,7 +83,7 @@ kubectl get pod -n kogito-serverless-operator-system --watch You can also follow the operator’s log: -.Watch the {product_name} Serverless Operator pod logs +.Watch the {product_name} Operator pod logs [source,shell,subs="attributes+"] ---- kubectl logs deployment/kogito-serverless-operator-controller-manager -n kogito-serverless-operator-system -f @@ -110,7 +112,7 @@ kubectl create namespace kogito-workflows kubectl create secret docker-registry regcred --docker-server= --docker-username= --docker-password= --docker-email= -n kogito-workflows ---- -or you can directly import your local docker config into your the Kubernetes cluster: +or you can directly import your local docker config into your Kubernetes cluster: .Create a secret for the container registry authentication based on local docker config [source,bash,subs="attributes+"] @@ -118,15 +120,15 @@ or you can directly import your local docker config into your the Kubernetes clu kubectl create secret generic regcred --from-file=.dockerconfigjson=${HOME}/.docker/config.json --type=kubernetes.io/dockerconfigjson -n kogito-workflows ---- -=== Create a {product_name} Serverless Platform containing the configuration (i.e. registry address, secret) for building your workflows +=== Create a {product_name} Platform containing the configuration (i.e. registry address, secret) for building your workflows -The {product_name} Serverless Platform CR is the resource used to control the behavior of the {product_name} Serverless Operator. +The {product_name} Platform CR is the resource used to control the behavior of the {product_name} Operator. It defines the behavior of all Custom Resources (Workflow and Build) in the given namespace. -Since the {product_name} Serverless Operator is installed in global mode, you will need to specify a {product_name} Serverless Platform CR in each namespace where you want the operator to be executed. +Since the {product_name} Operator is installed in global mode, you will need to specify a {product_name} Platform CR in each namespace where you want the operator to be executed. You can find a basic {product_name} Serverless Platform CR example in the `config/samples` folder that you can simply apply to configure your operator. -.Create a {product_name} Serverless Platform CR +.Create a {product_name} Platform CR [source,bash,subs="attributes+"] ---- kubectl apply -f https://raw.githubusercontent.com/kiegroup/kogito-serverless-operator/{operator_version}/config/samples/sw.kogito_v1alpha08_kogitoserverlessplatform.yaml -n kogito-workflows @@ -136,9 +138,9 @@ Note: In this Custom Resource, spec.platform.registry.secret is the name of the [TIP] ==== -You can also update "on-the-fly" the {product_name} Serverless Platform CR registry field with this command (change ) +You can also update "on-the-fly" the {product_name} Platform CR registry field with this command (change ) -.Create a {product_name} Serverless Platform CR with a specific registry +.Create a {product_name} Platform CR with a specific registry [source,bash,subs="attributes+"] ---- curl https://raw.githubusercontent.com/kiegroup/kogito-serverless-operator/{operator_version}/config/samples/sw.kogito_v1alpha08_kogitoserverlessplatform.yaml | sed "s|address: .*|address: " | kubectl apply -f - @@ -155,9 +157,9 @@ kubectl get svc registry -n kube-system -ojsonpath='{.spec.clusterIP}' == Build and deploy your {context} application -You can now send your {product_name} {context} Custom Resource to the operator which includes the {context} definition. +You can now send your {product_name} Custom Resource to the operator which includes the {context} definition. -You can find a basic {product_name} {context} Custom Resource in the `config/samples` folder that is defining the link:{kogito_greeting_example_url}[{product_name} {context} Greeting example]. +You can find a basic {product_name} Platform CR example in the `config/samples` folder that you can simply apply to configure your operator. [source,bash,subs="attributes+"] ---- @@ -165,7 +167,7 @@ kubectl apply -f https://raw.githubusercontent.com/kiegroup/kogito-serverless-op ---- You can check the logs of the build of your workflow via: -.Get the {product_name} {context} application pod logs +.Get the {product_name} application pod logs [source,bash,subs="attributes+"] ---- kubectl logs kogito-greeting-builder -n kogito-workflows @@ -173,8 +175,8 @@ kubectl logs kogito-greeting-builder -n kogito-workflows The final pushed image must be printed into the logs at the end of the build. -== Check the {product_name} {context} application is running -In order to check that the {product_name} {context} Greeting application is up and running, you can try to perform a test HTTP call, from the greeting pod. +== Check the {product_name} application is running +In order to check that the {product_name} Greeting application is up and running, you can try to perform a test HTTP call, from the greeting pod. .Check the greeting application is running [source,bash,subs="attributes+"] @@ -190,4 +192,4 @@ If everything is working well you should receive a response like this: [source,json,subs="attributes+"] ---- {"id":"b5fbfaa3-b125-4e6c-9311-fe5a3577efdd","workflowdata":{"name":"John","language":"English","greeting":"Hello from JSON Workflow, "}} ----- \ No newline at end of file +---- From 8f8c115c746cf2149f26e7e47292af76e6e38295 Mon Sep 17 00:00:00 2001 From: Ricardo Zanini <1538000+ricardozanini@users.noreply.github.com> Date: Fri, 10 Feb 2023 09:08:28 -0300 Subject: [PATCH 10/12] add a note that the operator is community only --- ...ld-and-deploy-with-serverless-operator-on-kubernetes.adoc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/serverless-logic/pages/cloud/build-and-deploy-with-serverless-operator-on-kubernetes.adoc b/modules/serverless-logic/pages/cloud/build-and-deploy-with-serverless-operator-on-kubernetes.adoc index a04b165d..80eed2c6 100644 --- a/modules/serverless-logic/pages/cloud/build-and-deploy-with-serverless-operator-on-kubernetes.adoc +++ b/modules/serverless-logic/pages/cloud/build-and-deploy-with-serverless-operator-on-kubernetes.adoc @@ -12,6 +12,11 @@ ==== This feature is meant for a quick preview on community repositories, and it's not part of the developer preview. ==== +[NOTE] +==== +This feature is meant for a quick preview on community repositories, and it's not part of the developer preview. +==== + This document describes how to build and deploy your workflow application using a Kubernetes cluster with the link:{kogito_serverless_operator_url}[{product_name} Serverless Operator]. If you don't have any cluster operational, link:{minikube_url}[Minikube] commands are given throughout the guide. Using the {product_name} Operator, you will be able to build and deploy a {product_name} application only by having a workflow definition. From e2f49802f202edc60bc2c0c6e8040e3858228bbe Mon Sep 17 00:00:00 2001 From: Abhishek Kumar <19465051+akumar074@users.noreply.github.com> Date: Fri, 10 Feb 2023 17:44:02 +0530 Subject: [PATCH 11/12] Operator version fixed --- antora.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/antora.yml b/antora.yml index a1250d1d..e50fe4b4 100644 --- a/antora.yml +++ b/antora.yml @@ -24,7 +24,7 @@ asciidoc: kie_tools_golang_min_version: 1.19 docker_min_version: 20.10.7 docker_compose_min_version: 1.27.2 - operator_version: 1.32.0 + operator_version: v1.32.0 kogito_devservices_imagename: registry.redhat.io/openshift-serverless-1-tech-preview/logic-data-index-ephemeral-rhel8:1.24.0-11 kogito_examples_repository_url: 'https://github.com/kiegroup/kogito-examples' kogito_sw_examples_url: https://github.com/kiegroup/kogito-examples/tree/1.32.x/serverless-workflow-examples From 872386de1bc69ed71175eac0702d3a220efd1236 Mon Sep 17 00:00:00 2001 From: Abhishek Gill Date: Fri, 10 Feb 2023 20:23:25 +0530 Subject: [PATCH 12/12] Incorporating PR comments --- ...build-and-deploy-with-serverless-operator-on-kubernetes.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/serverless-logic/pages/cloud/build-and-deploy-with-serverless-operator-on-kubernetes.adoc b/modules/serverless-logic/pages/cloud/build-and-deploy-with-serverless-operator-on-kubernetes.adoc index 80eed2c6..02aaa3b8 100644 --- a/modules/serverless-logic/pages/cloud/build-and-deploy-with-serverless-operator-on-kubernetes.adoc +++ b/modules/serverless-logic/pages/cloud/build-and-deploy-with-serverless-operator-on-kubernetes.adoc @@ -17,7 +17,7 @@ This feature is meant for a quick preview on community repositories, and it's no This feature is meant for a quick preview on community repositories, and it's not part of the developer preview. ==== -This document describes how to build and deploy your workflow application using a Kubernetes cluster with the link:{kogito_serverless_operator_url}[{product_name} Serverless Operator]. If you don't have any cluster operational, link:{minikube_url}[Minikube] commands are given throughout the guide. +This document describes how to build and deploy your workflow application using a Kubernetes cluster with the link:{kogito_serverless_operator_url}[{product_name} Operator]. If you don't have any cluster operational, link:{minikube_url}[Minikube] commands are given throughout the guide. Using the {product_name} Operator, you will be able to build and deploy a {product_name} application only by having a workflow definition.