From 72bc7f7358b88540c41559b171890da48150b3b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 3 Jun 2019 14:49:46 +0300 Subject: [PATCH] Edit mvc tutorial part II for the latest template --- docs/en/Tutorials/AspNetCore-Mvc/Part-I.md | 2 +- docs/en/Tutorials/AspNetCore-Mvc/Part-II.md | 56 ++++++++---------- .../images/bookstore-add-create-dialog-v2.png | Bin 0 -> 3164 bytes .../images/bookstore-add-create-dialog.png | Bin 8437 -> 0 bytes 4 files changed, 26 insertions(+), 32 deletions(-) create mode 100644 docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-add-create-dialog-v2.png delete mode 100644 docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-add-create-dialog.png diff --git a/docs/en/Tutorials/AspNetCore-Mvc/Part-I.md b/docs/en/Tutorials/AspNetCore-Mvc/Part-I.md index 84626eba61..afc4e6515b 100644 --- a/docs/en/Tutorials/AspNetCore-Mvc/Part-I.md +++ b/docs/en/Tutorials/AspNetCore-Mvc/Part-I.md @@ -118,7 +118,7 @@ PM> Update-Database #### Add Sample Data -`Update-Database` command created the `Books` table in the database. Open your database and enter a few sample rows, so you can show them on the page: +`Update-Database` command created the `AppBooks` table in the database. Open your database and enter a few sample rows, so you can show them on the page: ![bookstore-books-table](images/bookstore-books-table.png) diff --git a/docs/en/Tutorials/AspNetCore-Mvc/Part-II.md b/docs/en/Tutorials/AspNetCore-Mvc/Part-II.md index 9ed30338fa..180133d713 100644 --- a/docs/en/Tutorials/AspNetCore-Mvc/Part-II.md +++ b/docs/en/Tutorials/AspNetCore-Mvc/Part-II.md @@ -20,7 +20,7 @@ In this section, you will learn how to create a new modal dialog form to create Create a new razor page, named `CreateModal.cshtml` under the `Pages/Books` folder of the `Acme.BookStore.Web` project: -![bookstore-add-create-dialog](images/bookstore-add-create-dialog.png) +![bookstore-add-create-dialog](images/bookstore-add-create-dialog-v2.png) ##### CreateModal.cshtml.cs @@ -138,12 +138,12 @@ Create a new razor page, named `EditModal.cshtml` under the `Pages/Books` folder Open the `EditModal.cshtml.cs` file (`EditModalModel` class) and replace with the following code: -````C# +````csharp using System; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; -namespace Acme.BookStore.Pages.Books +namespace Acme.BookStore.Web.Pages.Books { public class EditModalModel : BookStorePageModelBase { @@ -153,7 +153,7 @@ namespace Acme.BookStore.Pages.Books [BindProperty] public CreateUpdateBookDto Book { get; set; } - + private readonly IBookAppService _bookAppService; public EditModalModel(IBookAppService bookAppService) @@ -180,38 +180,26 @@ namespace Acme.BookStore.Pages.Books * Mapped `BookDto` (received from the `BookAppService.GetAsync`) to `CreateUpdateBookDto` in the `GetAsync` method. * The `OnPostAsync` simply uses `BookAppService.UpdateAsync` to update the entity. -#### CreateUpdateBookDto +#### BookDto to CreateUpdateBookDto Mapping -In order to perform `BookDto` to `CreateUpdateBookDto` object mapping, change the `CreateUpdateBookDto` class as shown below: +In order to perform `BookDto` to `CreateUpdateBookDto` object mapping, open the `BookStoreWebAutoMapperProfile.cs` in the `Acme.BookStore.Web` project and change it as shown below: -````C# -using System; -using System.ComponentModel.DataAnnotations; -using Volo.Abp.AutoMapper; +````csharp +using AutoMapper; -namespace Acme.BookStore +namespace Acme.BookStore.Web { - [AutoMapTo(typeof(Book))] - [AutoMapFrom(typeof(BookDto))] - public class CreateUpdateBookDto + public class BookStoreWebAutoMapperProfile : Profile { - [Required] - [StringLength(128)] - public string Name { get; set; } - - [Required] - public BookType Type { get; set; } = BookType.Undefined; - - [Required] - public DateTime PublishDate { get; set; } - - [Required] - public float Price { get; set; } + public BookStoreWebAutoMapperProfile() + { + CreateMap(); + } } } ```` -* Just added the `[AutoMapFrom(typeof(BookDto))]` attribute to create the mapping. +* Just added `CreateMap();` as the mapping definition. #### EditModal.cshtml @@ -219,8 +207,8 @@ Replace `EditModal.cshtml` content with the following content: ````html @page -@inherits Acme.BookStore.Pages.BookStorePageBase -@using Acme.BookStore.Pages.Books +@inherits Acme.BookStore.Web.Pages.BookStorePageBase +@using Acme.BookStore.Web.Pages.Books @using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal @model EditModalModel @{ @@ -231,7 +219,7 @@ Replace `EditModal.cshtml` content with the following content: - + @@ -240,7 +228,7 @@ Replace `EditModal.cshtml` content with the following content: This page is very similar to the `CreateModal.cshtml` except; -* It includes an `abp-input` for the `Id` property to store id of the editing book. +* It includes an `abp-input` for the `Id` property to store id of the editing book (which is a hidden input). * It uses `Books/EditModal` as the post URL and *Update* text as the modal header. #### Add "Actions" Dropdown to the Table @@ -420,6 +408,12 @@ $(function () { }); ```` +Open the `en.json` in the `Acme.BookStore.Domain.Shared` project and add the following line: + +````json +"BookDeletionConfirmationMessage": "Are you sure to delete the book {0}?" +```` + Run the application and try to delete a book. ### Next Part diff --git a/docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-add-create-dialog-v2.png b/docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-add-create-dialog-v2.png new file mode 100644 index 0000000000000000000000000000000000000000..fcadfd7a826e7f8f489e0ff4f4fa961dfd956c7e GIT binary patch literal 3164 zcmV-i45RajP) zZ%iBK9ml^;$U+KPlfnWK(dbbEIhSQqO;TyeA~^~px`bB8ZEadrNhK#u@Q|7yORLOY zL}Q>%vq)Yrzesv75=~mG#aJuh))X2`Q6p`E)7FmqV)N%}T7DZ9CSS$}8K8#vw zyEFB2;l{tdl=E6q=DEL3&CY(iq$8ZeW2aT@9@QlC98J?S&GEdQ=6E^GsQE=+6ZA>q zSfvPYW@aXqL&xE*%9|5AH=WqIX~~8L0Fe0>w~-Mj05CU6QWF4=oo?YznJtvZ&Nxb) zlFJO4=NP~S03JIdFoNWw0FRyHWpmMG)rp{Q5@<1@5CQD`(`e{r@6U4q{O8W^5p!#T zXZF6m?mL-rd-ggQ+5rHpQ_>cTb6Xmt4S+o0Guj+xK$*%NEl`Z`y4AV>TY-bm8QoUy zIkE%NJMre|WP}*xi3=8w_4w=I)LIeFJ0@q+epr(G*2>b#*1*(DQ$u z3cXynAuBV7{^mhXEdNRGwP#*Dn|%8)pR%%#06?{rzejhpfV%%#7XLwzp;pI+J;h>8}k==!8{B z8nw8bcpcjZ133`EO zk)Rj!zKnWr&~w{#R`&kEv`s5IAoq<>>hF(W>t}1EsCOe z=FFL>_q9L!>T!Md!``nSQ=8ZS`i1Ph-`k+rA5GoQ-T%wQc1#tOLKu)?CP8lXkjA~s zN@jz5I^1lnI@`{rb%*4PMKx-b?W&a|gfA=Uii<0h4IY|-tIW@Hx!;g^j^TL06`Bwp zVpLkt(j?7*$4(N$my@(;apkhXL)MElHz2qy81R9uRpdljYFS6eAQ06^0f1m*zzC}R zo+Sz4%gWNv(JPt_u0b7SjNbmiWZgBqKu9%`5Wc)Du@?1`4KCjllq_(ns1)uFMM*N> z;$|z%F^m9UWE?IhtXxQ1I7tX!HkNpfUg>P`;CeB5+JutkP1Bmuj95k$bCWQ@F|=S4 zYWo?I5WbA)E@y06v%v{^LU&puJh7162!dW9S|sQN1MJ-^Jq7{+AaRkPA9S5FmOO!a zI!@^yKA$|@_U~mI3}Ioc5iJ5Zdh}>i`=LXJ&YnFBfXGqj=tYbB3$s5Rik{JvJgu#+ z2upP}*V)+#fXGq*=w-e5mp6CrFU(F;XFIIr-rZx##z7TtH80W9j9U5_*}V0i1FVwH+_6y4n|i zvi6-&Q+rCUOvQ0i2+rEo)m#jhtmaqq{BH3`@T;wn;kuC|hnyPzF;x99t8PTQ(N(^M z@lOgR@w4EbAata~Ydzxtl9A&v&$0K-@5gaCe5pct^U+%!33@HqT9q^TZj|p>bK4v9 z;RjPPeX_ofFWAv*%_|0g$&>YcJYYFtdanck;2$zvL3?8%129(8IscI1$|&af1Mqd; zhjqI}P%g8Y4`g2W;C^XIzBZCz6$rt<4b9kh`+;8@S$NlBX`mrwHP`JrmlJF);t~L` zJ=pl&ox-N@kAU{Ze4l%wip?tq1h;s8TiKm`8=*R<<-W0wv0%4f~{4Uczp!t)xL7ut$BX8xU*Z) zUs?0Lp1P4a;~u8$4&Va-gm*m}EsAF~*X^phd)E*YP5Jh7V?&1KP~mPocL00q#jf(= zS$4Zc=!^IW;SQ#f+jkB10cg&Af}iO^(3ckX7iPcx<87zhL-U2GaLjWo^i7=Tn3M_? zax!-V(GuNe+CB>aKtW~+HZoSzImPUs0F>W~vKgB3MbwMpuflgec<0p}d%A~rAIkIJ z61$KaQbh~TBg60d^QyN4$SfIq@On1@bP4x`eOd&K)3w^#)~cMzcSEDsz3D!-u$TEJ zB&5w;_+YpTK=*{e=09HmL~1(JA=9V)C}KJ<0Xov+{=)3GxsmZUP_LDvDn}Jr$|UYO z8Y9Cy>xcI+WwVVNh0w*Zp3uua8bCrJmR^|(oslChgD5IQGK)n32-Mx0WLQ&saPM5O zqd8(9Ju>ab)9)}@bC&Iy#mdZHu(c{@UX%0v!@8S3$L8Vgc-Oot)#d5{-YJ=E?FL4s z{W*E(%K=~ylg}jXTH6SZjJJ(N89tylweFhT2SC{|+`DjK*PX^Zj7Hq|{cm%;| zeez^|0EqgJm!Tga;ZJSp(Mz7r&&swYDa5D*>gl6LkIujE5~RACyMFz8R-?4wE(qyH zFL7}(LJSi7OGLsdKrdQcJlC&ZU+Ezb7KL8sXaYe;`)I-w4*5Sof?gnTk)RjW&fXSoAq>AMrBph(!-Z3lvgVKd+apF^LFKc?zy<69oo(D19QG% zCwa>}r};;TXc32gM>_+2FxZ8xJsHI7U=$CJo#uFt>Y#QOF~YTiUiK~um6esfy}dOx zHJ^O)$>z4E{q$vzrJ}=%@J9#BJQs8Y0C+CXI|JP7Xki3NqO?w%Bq!#c zG~)?(pnWz$lBkdot{rp~7XgT(c=hVlhK7b%LY#W(z}J;8#t(`LDF#IaqwSP(R%ita z-+&Cr13t}0S!$J>GROlyC2r9)ZFPJ52LW@F6IR*^XSg`zn}Rp^JOu#S8Q@_d&1iEd zr zwG=3eOR~s3N7LSgHnC>WQCv(YL;xEO{xsu9ruacI#k}sgP(`I)$7K(o9PAx5!rc-U z+dOtFoRSk(Wf7xegF~SodXMo2*FL5y=BO{>@6*hl(E1}QQg+p_blclY+8!*~z zECkgk*f>T#862$5=5zRLLKCQGZ7mGP3$7xqI%RP=`{}u7&NLzT%tGZ1@WH5^RO_c+=v@DZX_ebI3$zTy_oh1>E{0@6i>9=0BNuQ0000~2oebH?qL%oxCVEJ;0}ui4Pk-BS=`;-&%W>X z)j3sv{Z+fOU0u^NJ>5_DeLeS1n5wc24kiUA00200vQp~s-#Peq8XXaSoCvSJ003%0 zPU?fESH@wcy%V8M+A-BNbuREPEt*7CR4SdT~P+jkkEOEq$;HD$@TbTA($4 z6f~(w06C6g(KgvQP)eojqKrn;+MHaWr8GfsB))LA%h@ex4Htz2Fhvh?zS^4k)Rz)~ za0tGmA~p2U32eYtYH-Zfba>8^tnki%#5H=Ob5w}!@!ooVa1h;ulf-057Y_)G>(=kp zMJbn#)ars4g3luP_V)MdBB!8GwOJF+gtYkKh!@+ma`ANS-@X0OjnpF|5?ruBsHre^ znriYY@vojg$6Nx=H1gG~_qLwY+2on(8Qsqb03h@#{jm~?phnaO;1DD+hd9uUY-0RT zljag<+5Fz*^_$Ly5v{~AdXfqyRP5DG1Rz*Kk;iDLmmb7-*B*0x@b23Bn87oY+?+%7 zz5mogtLkms8yQnf{&a{%ol+`ypM?VYO*9o0S}E^xzwZKZpF!_J-=4KqwIn z{vC&lCff&}JgBhV z9hqYn0|5wnKQybJZ~Y^jxsbfAE(z6}o^mGw6qt7a=s<;L`DqvuP5vW#I#_@Bc+A+cn?QAw z4_N=OuSy%}$`V^-WMTPBLoP*%Ohu<26c6xhHdPxieUFBf{`ooO%5ibRDq-Ta}+t=PI+CxlAz@M#irQe%}mv3=H+}0ApZDxH?#F{ z_Q0S~^hLkO9GZKJ2k|^Le^+de4-;bIDP_#t{g{pT#7+R}{V+tZ_<{HC;c1#2je~>Y zt7zUWRpg1ErgyT7_w9OO`IVpTR?@BZ$oq>~|DI*T6Mcx?vCi{e4az3Kc_tka5_X== zO3+~tzl|4w%M!kjVy`25x3ZQ#yuo>@feTS)?TDIW`4Hm`mXo zrH$oop1GKpB^wTYSjhyne#0ArwV6tKFjwZyBDr zF#%$8r~ALW-3iI2w?T2oNef5RcS`N|& z0R-`zULf}MWDNLfkNB4l{Q_%`hTWhfVvp1&%@FZsCflk*k)Fz+WXKL^N8u&gd^gMX z)0ydqNmX3_7h%~w#bNkr{Uvts15AyPSv6GIud<9##Xg-T>UBO^-Lztj9V0=ZOXH}}iWPs6D^_WXf_u3@ffwKO#kW@~zO z-JVv^#B@9SZl50Sqvqu(dtgWu44A9zVfa{PIUISncV3j(v!*E}eORRI8SlMaS`0m? z;mscpEX533Jq~jvf510-OGujg{gwS=lDYsDms5t-v^}Ixo;~`Uo_z}(4BL8V;aml> zt072Ik1n3pk^l55;A}Rd!R=QMm(cf>M7DkQWQDrezgQg}iz>UqE#ljKk+zCZ_!tVi z?@b_q5+SfkaF& zoDr$KeaNPh0s2B;Ve?P?+SlH}hC*QeAI7^bBrpz#e7Qc9M;2K@E$Z4Yrw!&C?bC%^ z>6ugCxid48s^%~A8Q;T3GKB-4@0a%-$=#L8)B`l#cLS?~3!EH`<~b|J5{*u=Us7)uAoa>Gf4`D?W+>1ZivaKiphC99T$q_^LgnM` zLtW~UY^5$i?+JGm2g+TOb8~ag&Vp9tW*$7<+=f%Q-cUsC@zTR}aGvSLW$E5BWco$oqpz6*V+BwI2 z4ipPWgo^0xMt2}ulil3eoMm=yJYBK9q-2jk$7xh?mXCaAJA6j8*u&|d8fZOe2wiZ& zC>-lP>89L9oczRPGl2lzc0)t*FR+Oq@mIEFJ3LjTQ$Ul-R`xdr(TjXR@9O5{JqcT7 zxtBHXaub(oJljAIdqZo(Xrkv!T}lR$eWmMC0#m+)>Ei zii>E5jY0N5GtWNshZ!jgNe6kc$`Nngyirn8LK)(!*c#6%^2D0ev!NurK=)J~{)-c> zHdt+JXK&B;DVo_kY#jciKj`%sEb`(%M7X=VOaC;Jk&zK?84RTuB52w!fE5URxYU1n z+r%^5MyLqWYgDQ%*4tzNBh1rrXUoh?P1(chOG`_4w;&sBk#l3YvHB^#oc`&&`)Jxk z(pd;|tB$Hl16!Fk<0G~9zm8#Ev4kTa`xmJqW~)v&C#yXb6%{-d!-Kj)BA1t!9>;lx&7M zWW1w}uY?xZM^6u(?MYg!rRg!V=@>r`_@b2b_hJyKPYcSD;v`^uA5*MQ?Ggs7KW;Ph z(oJfRv@Sk{=GzS^J#|z`&T%@nCPE%TWAb~h-{YF}+EsqIT$<1eG(=X)3C}n7hn&cn zbn%C|ott`ld#_3$LncG%r7r}vaXk&^&Tp3=U^#JVL9p(VyxQhMiVB3T&&Ou6+}|-X zLZ;NAeAbq8{8OG47{XATS^BsUo~x~NM-p}^HVx7HiN$f4*RrR{8}Rb|jq;( zH(aJQj$C3=V~M(FAQ>$!&ZmSenqkGK9`oe^4QI{SL;`sWN)(B~*cP0E3yqZ~^UNi-I6!Wo0EhosW)= zj)B2TfKr4)6YC|#C!pH@{-3}genH98%?X`}3c8tS_tn6AbUR*ReT+!?6R6j5)ZN|P z*vPM2}*F7B%98bIKs18*O4m2|IXUHjnfE5(74~zrgB36&5h^MjuOx9ouiv0m)u1zYtV)t~GAYrWzH--}63x_cq|1s5xNbvG zKuj7gPqTx13V%a5b9wfFFGvYs?-Kp^Wg1{`14D()?e4;GnXGP*^{1WRA}rgh$8{A7 zg%%7Me@$JrAp<~fwFVg&-9DCDVBR=j6ga#tp`aa=1mv<#V9gBg#|2DOLz&o$Zou~Z zFM%6l@4n|DmXcnp&JsK|NrVYDtt;u$kH$DR^JsJ{-%K%p!DD<2N|U6j`!I$q-F6@M zJyf-OBLAI=nY5BzkmZBguMi+FB;2F%n(5r&>yP@H%lE4xADtCWu=2R3(5Ocawc5Ry}O=T@`Fw;zQ8N|S||$3*4pn# z{hi|Q%;MD4ngn|FQvChAOv?5gDwiayoJB>xG=f8%oekQD3Mz3gFT^SaXbCh#b?)8pwl&+Qxe zalypebcI2{WtlOtbhH4PvQqke(?oK>n^M1%!|XjRnXhcAw1rpd+!?@jo)>2EyPDU# z^`U-?yHWMlH>y@sqK~E*cRLNw!{CPabLF*9KXn-M>?54eq&;iCe-0lc+t?q$$s5NN zgf0}AV4t~fhm4Wur7t4WdDpFbF2+V-eNT3C&Jeg2rHoJOXf=*1Y3|_RUp={GFDxLs z1)tOYR%dJ#Mqb;m+k>DMtNbK%7?|+*INPDGN%DDqllL^-ARR@tU|wNFiPPe9UR5jS z#(it3U!s_(koB3}U&4Hb0{ih2-S)9s_Dh*W?%#`w`&aRDt# zPWk*|`%D}#%vj?rG*H~-;xhJhj)mipWQU);d5#Ku0=(>OkT+h*+WumD)TSGfk5MEG zUmfgZ=A9+?dO3A*2uX00WVfz3oiwupcy$&_C&w*r-n6m>Mb@DFXD9OSunKbT^o$cE zotlZPl4TYF@n36#@Bf@l3q~t2efNY}s{2yf*CHs%O{HrrR zj~4m{m2DSC-8c&ir8*oqt0ySDtho~6+_s@CI+d(rGntTqMW1t1f@5yIluU!)^e5w= zwL2XCerOIfO^P2cXn^Dr7pbxy@AoTGz>nHcrP>On%OP#uOnGW5XXki+#rIrITh{7n zN4=BFe`;_tR#Vyr{azdD=*-N|&reReoo&b&3fph5*Np{2{vOS>9lSowooqKr3JD|n z(&|1IcICt#jR(f?7GOYKk0_a72p1Kfm#T!Og4>vrjWCRA>!!CAtzTS(A%q@l2iGG3 zAoTee)^Jh$wt`|qC$l%wPhX}@`8yo`6$wDx-{0Q`5*;1ghRU=(;Sjw&VFBlsob;G6 zNVil=ABUwoXa6a36&hk5&pkaDiJBTpegx;4FoEP-Q~3^uApU2DFT+qnBBIVFLb?%i zR_Tftb#~vms9gOQad6l#5{%CU@8lY78D$=ZSU{|gOW$>TMRcx6oHNGezl=j7g73ir zkNZ8#_e=Ela?{JTQo7+^5X3udmf@&JDjhHX&Cgwvb4+IF5}yCM@^gO;r`2;BtN*ra zaN;8Y&~O(>$=k1$7mBfkL(c zDHmp{h9`R|9kJF}!gchl(~z0N&^sYH+q)OAIdnkTS>SU`W!1a`T89A-8fGR*1wWiv}LlURgf5S;{4*c^d6Z(l665e8_TM@g>v4gwLgP*W93B4)@#7O)-|A ze%8t|kX1L}A6cYb#L@t&quuK|`cMP{jtLUP?frgTlmlb9+j$Vx^?#P<|K&5?0x7fI>2@wwIb_2+fo&3CFWQ#~}b`%JAbM-A?}om{_3 z08!R6%DwooK^<;uiMQ0^Zs_l`-1D5$(@caR4`0;H6y^PL;*IxxPJ#~=j{XYQv2j)R zSCANsDj%cAn#64$G{Pf`ckwI7{fe5ki?mCm z9lZ|Q>NsD&Scj;QkD<(R9YX9swbpISWQ8;$P);O&C z1q$y)VaRlFEA&iBkGFU}<@677Dk&Esa6sPk|3pLeoj0#Xpvr63iax}Jm7T^?p-Xx% zIWZ5_NSY#BXT^mTYG?K#mX)f{{lr@~T$H$u^NmW^zK8!mz>?T(a{S7>4W%N6aj99O zEpfhL?2k|JI^s@paLVP868KwYzc5{K8o5it9F-{SVG+cf^k;g_PS)%#DlxJw12zk_bTdF3n2cNgi)7V%|uYKQGwA2vV9ZlQQfP^1KJ77 zM@YcJtj|MFJPv9C6`@oFplWPfWzgZU2!?xSNI+74Urjg(mErrx<)s1EH}LI7~l<|vE|Kd%U2RJn}Ky0-s; zN>eBbNVSS0j!Fo`WN9Dx+QFW5#A-Q=b0Vee5!>!MbBT=n?&V{+YkMmR?Q$rXuNvN0 zn>A9f?J@xXt7f3FZvS$^&5M=ZBNXV^<>kdgA>haOkl@WSQl5$FVy@94&=^aCurheN zN_>7S)M3qZTKC*0dM7=u=KgU~R4MZnm6&dsyz2dIY%cV9OpMe0wgIbA@(tjs>}By9 zFUWu$q5Km}LCfg@-IH+`f%?ypf!kAh>%X__x=m8Z(V;@2d=IN@{`}Ty8z6z`0}@>^1$77?CbcuZNT1#MU|_afe?xah?~v?`qX*#btIup8#kM1NY}Zn zM(1AJ-`D@n1g~@HHn8}4Y>tz)k3ozTeK5j^e`a1rUy6x}I+2vl3aTvFt{e|hGtW$gnyRo|6E z9HbLqyOYVQ;L3-a(t9eQ>u$;Yt?LZT>|miZ`k@QI-N0nuEdf?!koDgmmGAv=ffd$g zf==z!4-;-|GU*LpucDG0>Si{f5f^JldpwYz9=6YAR2e8B*BNi0?!X8jp0A>UlP!D+ zvu8-UOG4kz?eqd3#QY&kG7$~zvVP<PY#9m-Wrf7}D9N#OND!ETDSl$%vxy z0Mk{qrb>DSmZEDswNSXaF79Xfwmh3Hg4L4SvtpnSFX`}Zg}_GI?po8RRjBcWwonWz zC{m)H3S4R!myq>~nplEAT^azzC20sSg71QSj@ovf{N=Wx$sc`JmZ&s{Pve6plJXM$ zq2-r#8WKg*DmxBtXd+bX*x5?f$A07r98zp^is3>R{zrL-XOHb!dt^8OAgQB$sPK#H z2GUh;G>TNy0Dwlw*pCAazVWnf_l)5fjZ|}c)mxs5v23$5T{bKlERoQ!&7?j|HL2e&$$ z1gkhd->m!xhzY%{97+}$Jd)3qKl@@F~%sq88jgluZogqRI(r||Oer83JT z(583w#_1@-uLF$1U}^1?j-H)-4+6wZ%QupDHZn1&P!%rJP%cs|>l(Q6;42i}*sl4p zlCjF5%JRdPxkix(}yEg>mWjuvW!;hy}dmjUthRcsGRj)$gCeb-=?W`8GK%RauL|s zG-p>T<9g*j5LWFE$=gBdR`7wLG>w+ZU9&l}V}cOi#6qNUYWgp^;C}BGrm{7A$R9yDI6f-U}_%p+ln!aa17Cu{Xl(7Af74ITJjPxPZi zTgz&V%AR&{HW7i4ayUBLM5s&f^f>-uGEneTqW-ZtJ+2tL;E6G=%0Uwm5qV- z1!#z2YyV__K4K_ry8r+H