From 7a283bf233ea89c6636bf052e05646e5c2119f7c Mon Sep 17 00:00:00 2001 From: Rob Kennedy Date: Thu, 11 Feb 2021 15:09:25 -0500 Subject: [PATCH 1/2] added additional models to support common shared models across applications. --- src/Assets/logo.ico | Bin 16958 -> 16958 bytes src/Assets/logo.png | Bin 33007 -> 32757 bytes src/Security/MicroRoleModel.cs | 40 + src/Security/MicroUserModel.cs | 69 + src/Security/MinimalRoleModel.cs | 60 + src/Security/MinimalUserModel.cs | 47 + src/Security/Queries/RoleQueryFilterModel.cs | 33 + src/Security/Queries/UserQueryFilterModel.cs | 39 + src/Security/RoleModel.cs | 63 + src/Security/UserModel.cs | 74 + src/Shared/CreatedUpdaterModelBase.cs | 47 + src/Shared/DeleteResultModelBase.cs | 34 + src/Shared/DisplayValuePair.cs | 36 + src/Shared/ErrorModel.cs | 87 ++ src/Shared/ErrorResponseModel.cs | 42 + src/Shared/LanguageModel.cs | 34 + src/Shared/MicroCreatedUpdaterModelBase.cs | 47 + src/Shared/MinimalLanguageModel.cs | 45 + src/Shared/MinimalTimeZoneModel.cs | 38 + .../Queries/PaginatedQueryRequestModel.cs | 86 ++ .../Queries/PaginatedQueryResultModel.cs | 40 + src/Shared/TenantDetailModel.cs | 64 + src/Shared/TimeZoneModel.cs | 49 + src/Talegen.Common.Models.csproj | 11 +- src/Talegen.Common.Models.xml | 1295 +++++++++++++++++ 25 files changed, 2378 insertions(+), 2 deletions(-) create mode 100644 src/Security/MicroRoleModel.cs create mode 100644 src/Security/MicroUserModel.cs create mode 100644 src/Security/MinimalRoleModel.cs create mode 100644 src/Security/MinimalUserModel.cs create mode 100644 src/Security/Queries/RoleQueryFilterModel.cs create mode 100644 src/Security/Queries/UserQueryFilterModel.cs create mode 100644 src/Security/RoleModel.cs create mode 100644 src/Security/UserModel.cs create mode 100644 src/Shared/CreatedUpdaterModelBase.cs create mode 100644 src/Shared/DeleteResultModelBase.cs create mode 100644 src/Shared/DisplayValuePair.cs create mode 100644 src/Shared/ErrorModel.cs create mode 100644 src/Shared/ErrorResponseModel.cs create mode 100644 src/Shared/LanguageModel.cs create mode 100644 src/Shared/MicroCreatedUpdaterModelBase.cs create mode 100644 src/Shared/MinimalLanguageModel.cs create mode 100644 src/Shared/MinimalTimeZoneModel.cs create mode 100644 src/Shared/Queries/PaginatedQueryRequestModel.cs create mode 100644 src/Shared/Queries/PaginatedQueryResultModel.cs create mode 100644 src/Shared/TenantDetailModel.cs create mode 100644 src/Shared/TimeZoneModel.cs create mode 100644 src/Talegen.Common.Models.xml diff --git a/src/Assets/logo.ico b/src/Assets/logo.ico index 207046a6d40b6f23d8ff58c15fa907a390695eec..def3bbef6dbb459858b9869d96784bbdafe23d46 100644 GIT binary patch literal 16958 zcmeHOX^a&`7kw;Y4PTbl{7V0(1C6x+QUeK%=^ku15)hz{7_R@ALKGDZMQ2 z^puKdb2s`WckWQ`o;{TQ{r8l?SMKk>6VhUljEoH0zI{6_Uc8u=ELlQ(_wJ>6HEJuavQ31*NZAMRyJ!q+033+c>LrfO!4-^=bF+-C7J?V(Nkg z6ny^q2;Qo$p*C&k?w^0!Aawk*w{F$eqlzcusPpVCTWq*$1l)C8ozhTG`}glxVItzG z^XF4g>6=0?-96Z}DTR+8uf$RL7vH=|!RF1Q)}@M#GAOH)^XJcdYIn6R8aHlCcU;Dq z@TpUt+FjK(p+g5MD=4s3Rr#k(oM_Bl;HP}{nT|dU9Xiyg?d5uyK7G0t6NyQ0zwKMs z^o0v8T$z7)X{oQa7yRS750sab*!0cH%F>Q?GDo*?ixw?xcp_4ml4A6ZR_gfpT?xMa zdIbM4kD(^-QUoSrhfkjtDq8oQJ9qkSdr>bpZrre8B9gs%v+uTt-U)maWM`Ay{y95# z#Dodl9Of&_vSrI+=703)Q5n(-XDnSBv#$9UFWUM4_FK%Dxyrn?a^=dH`JX&_GLrxD z}ty;Bw*FmRFon*Mma7k{i)-LthR*3@!SXlD=kA&23 zzVXdJb}e*NfvMTM3>67&E0#|Rg;U*6w;JL-uC z`}XZ4tZ%&50c^j7galViJhaAvh7CQ}LFkoNsF-aBA!_@J^n6~YCA{`pRNRElohkq9 zSy9aOe(2C4YR2oOXmx;h-V1l}V|V`egF-LA997q(H{P)Nj3|e@6MsA_FDjz+@4lm8 z_wKfN0pmQ<(s@mTJSKAY?p>Nadp5Oh-P%?URjO2>&Rmzvd0unt^G?5YkH^E?UwuXK z{O-cG5${5X-@Al9eJJb4AL)L1c|>tH{&MC*_A7+BkK;o4-;kTUUOLWeu~WQ`ft~zs z2=k$Q?%!A&h50=$=6Z1xul(IGp5$lG_&@UdKFMtui|$_9zbGw@a<*-wbhbs(*;k1$ z()z%^^u(AcqKY2d(tGz{l=SKoPulHYxo zZhrYC&Cy}@?}aMF+%HOfxj*Jz4xeq*AQN%f^CkubLUdMdi88$zdRo{ zXIo<9#*JPft$g5?#<;;3UZ@=R#rQAoA-1J**e|S#6MxiWkZllA-sz4!nQPaouo3Yh zo+k$l8sx}Zt^#eAILVv9JZq1x&gV6DZZS2HXmk!*l4I6B@ za)f__h7TX^nY*Y9*a>ce`blP7olZ_^&^3+UVIeC2qHEVY`Mp(q_*ILpUKOym`=(8s zjJcx@s#U8-7cN||Vabs!?xU(6UgGGp*xP`p{I7rdsV_|Y?v0N>mes2a!=4pwYI+|v zYE&hT96;L#*oUJOigE?KFC({q4*M>}GrxE24a>5Q$0$FX zA7auKYuIpNqK$uEC}dmbn%05k|5W>n}ZE%FDsEPSZ4z#ob|98=yRKWt;2RIpzx_|i+hb-nt*2NtZ%9|>vSe(M`E zb>2Lks`6%%pzfD>MQ)w8bGc+G})M~IF;o)rdzl-Q$3R9xgKWE;neHy>2lqpk;e1N6wJG=V+`>x|5Y~IwbzpnIq3w@pV<2mXH^Gt~Shwvlfy}^Yr z(lS@Cw$-J;jCMc6`^*#hoI$s4-KZh^uA4MzLcMzRBJA~Fnzhda zUn2Hjoy4vG!*=h-d! zUAky-an^JgpAAh)N|K9MVJH5J7A>;;PdYv2H2A0%K0Zqp0WKw=ZKh70O5iA$*M)1= ztVtVO{D~5*<-?f7_M8q!O{-nIHf>SPY3lf|;IqSO*=TX>Te`_i_Pa*Ike{QTR9$uW zlP6C$!bN+@XKPjdiM%E@*{2seqfCfx1DzZ@cFa?|3oLQRIpB1cy;i?xiyHCSZE>zt z??386D=Kk z`#SMzpXu<1m z_znM&S}t0=fB*iK{Z!=-e5}o2BSpgz&yg2p+yv*`>ej96858FNy?h6EkiYLUv031Q z#kYq-bo}uQYo)GTyGGR)YcAL#UIgtsKlc%@_{tskP^Ns)j literal 16958 zcmeHO2Y6J~x(!{L6tQr@f}lw6y$Glj=>(9HMgmDFi4aI3v`CRi5fD&ndL;x1i4f^k zswfDEpcDZG1r11V|6A*y+2I%lx$iy8z4yJ%w>W3^oH?`CU)I0(J`*RWT=>_bg%kdN z!ReJ&PEJobIXS%opvx%?V83bQt2;Rn|AUqbpRpo0UgrVw+K~^(0(KO{u`uvBPz)#m zJOMljaClDx&)8AgeqBwz;i%3;6g(QZx>}eLu!amx4Po# z+*Bq8dmo=WYf3P#XS~pcyf1Tv-}NXv;F5o;<>XCY8-F|E%@|}((%&YxO`IFvK^?-&g8dT~W8P+Xg*|@r=lLi)ouYb!sCx5q2^`&2z2GYAt)hqaXbKV2s z{TN654t^i=%h-YOKs#`(j8kI=!wp>y8{ap)`5A(FMHt@ncTV2S$udAr-qp}&csFj* zv~K5FL7k^94Xu7A7MvO9v7Yz+ZFrlb@xS5Ur(KP!xL+rrEzkmJ1TcrFAr%0AKgU9y zWIWPG9JkSiN5z6QzjN|7{x*6}f9K@=GWzIm#wf>CA872>rIB0O>;bD*j;)y$*FTr~ z+i?87;{*KL*0_fIxd1(Z&VaFliHBFv_aZ=@q~=l^IBv$PshQ;XFgwuSj29E2<^VO1_Axd|K>iOx{u}@IZd>Cz zzH2bx4Y&cl0NSAq@G8LkV$5+oMk5`?0y!ExFy>9mj}yj=$#3Qn^PBgu`kVJQycv7+ zH{-m1f&BTJjrMInEalx!YnF#pxS?8Z(KN%2N5(#R$Mw%ED?%#B+NrH1(YIiBPCSG^ zYrt@Tb{GJ-0zH6^Kr5gLU~+;Q$-FeNKt8`03&!6$d7Ik(0zS`sRs^a5HGn!m1E9(1 z0j+{oOlW>IVc=u78s_dex5+zN-^(K(ht-iCkzTStZLAzf3zMWlMYC(bgZ!)C!1qi9 z!hld95by(x9h`CgCeRY#m^eO;^##D_V=n1l0K#eK9@^#fVmLa$4Pd_50x92FG!02Q`z<5 zA^hiJ9CLt~z;qxSpbf?VBLF|3KR_FF1zH2m0Aqs+IHwJs21)`}8}K!`bG}M_V?C(~ z)bZ@vp!d=#Ju{Y%eEFCA`Rk;-mj{-W)DdN2hX?bW*Cu#BCI?o&BkQKN)|yYdS#1;n z{(BRHK_3=JK#=t~iED#I~1$+SypeN7~cpYdA)CQ;r^smVU`n?E1{$+|5 zDO7IusGja=;qB9whm^ZTt&WAy;`=)xKZ`-5i)f8vPA3m8Cc9&OWy6fN*?zO~<28u` zi^`ARY?qB6IIB)r-{<+Fo=&nWX1Lw|miP~@ErWVm>c1`j$$d6J-%|&s0`&g`fH`2* zLod8$3@{Jc0WE-r0CkM9O--b~sfoqPJ^$=en^I>ETRr*J&l7zL+|k;tb;{;*^vNfa zo5->e&ns7QW4s<(6)xKr^s#9H_*nTV|3Ss%%7s(1b)Ku{y1tLt;hZRYc@pM|j+{hNYw!#xb=p#XJ|{vQY!{?0gW54;AjCe#6#2aItuXD*RB zqs#22!=8~SYB}@PC%+^N$g6zR*Qm|g7rDsFQB_sDn8&FBW#q)Jcxd_%TW&bupER&I z_@9=oAGs=D=24tyepx-Cu^ihRA=fXRmrFk!kfS4Riwxe^U>tp^tTqxy~3Ui5hk(7M#dEd2mt57+Y1A*z2+S+OMSS zUluB>#y3>okw0VM$79exI@C6e z|AEEi^7(HOC#iDo@MgJr^=CP`I|cUWg!>kd1>I=#{Fo2ahTR`moBfXe!!TCnIsI*T zzm4<3fDgc!cLV5ma_{w&K@Mrwrxp5V7G9LFVFN-nfnctOm%?~@jg?Kn9 zcW>X&_jq5&{B`|9ePfO@&iw%6Z`M0kfV_JEU4RZiYk+=d+}8)F|IGc0fT;n`;QR@U zJBwqdF0Bb~CP&tP0DiBiu5nDu1ItO)*@MtAchxcWtqiUD`}|c$3S)lT58Ns!XL9Gg z_9l*yUrry;&tE*TSLZ+p&{*1x{1YCCf8|eYBX8EX{y;y#1u*_LyxX9Ude5xs1E>0_$f`A0bP zKkdnR{{s5jJwIZnqny~8D0lDNlpDYPBuCcG!CIgRIOo+mNbdZMBmRAC>wm^Ld2_DM z{O$!%-7Mx=ge{AZ}O(UIp1NflQ;FA`OcUx1(X1a z0fh~J&c}8}57ha{+9_|SU&$rI?rYGV_@D9bh<^;~#0uoe zS8L~h^KH3z_l}(YJWVpj)l$u5{bT+o4=x4W>x2CNQtx^F(m6StISuxBEIa>M{~YkA zubJD{7&p3B9sQL7Y8&(W1)wZI-cJMcH+j?F=k~;iZwI6-W8kae-u^j$nrd+>#UgvwK_NL0_xjita zE~c8wxd+CPt^Zd3ecRQzf^iz&));4QlQ(1B@HY8PZL`L?@wee!0Pp7q@@Df#&hASI zet>`4NL#Hl{F(p8Cdalcw#7fjpE9(p#1AN}dPaZ8c@;*?_{h(v_Uk=wUb!H9uog}Y zD65}YjQKxfBE~&0K9}cF{2OAdCdSFzXxfW7XKvHqjB%rDjPb_-QFaoih+I zQC8={i&;YuFR8=I%HD(k%q`Ypj#2KR`49j9im{p+W_X+2Hk$U&@TR}XJr9uEj$Bs$ zdrkaX_@|Gy#lO)%>fEY#>MH*u>*p$e#>8sG_}TrLa*z3c?~Z)EaUSLol_b_9x2Uh- z?`Y`#>hTSr4e8K{TY3+k>)O&@|8wSl-*z=GW31NPW{g{N+h{rct(u0T@wMShf0MW2 zo(t!S-{lWKQN!4_FZNaaW3Drw*$%Cms`*RbAKkQA7~}g_gz3I6>nZb}`#ekhox2(*&-iE+=Z+J|vGB>$DaiE%S;ag^JRV%*A^KF{WD&K>f%*FWVtsflvk zHs3RQ9k(XDmG-folOM;v44RjSJx%%)7xp^ z9_-)I&m22*pL&*vb+7L?+qk!ZYhqCU znJ27q*M9jP^X2Pu=8Fv3gwHbe^&04g;j2f~407gNk+$JnF`+-|Ku|45{2x}o9_4RC z^Pxv8f95XRs`2$~V?%6zy2xGo)=lrIJQ(lW7TEeW%xJHD%#&kVWAwV?JK|OM7$@W% z3)@(E>pT(npf0A5u7PJD6E!!^9o{5yd=?f|(-D71xotEpTgySxn%@uQY<%1qx_7WA zVL0{#HtO1!H{yKpV8&$d$LAjOe-_63FdcWq-AeC~=Y~JI9?qPpyjFzR*1zO>VC6(R z*ZLY0Tqo>X5~6eaWg~2Ln_O7~na5V%#@8|KdGIXY4LN&o4San~@5leH{d`*M#qtp^ zs(vIm&VTYZdiFs5dL+R|T#(HlvHCUUuxzQrvDXPMjNh-;exQB2{|CR)PG6>nW8LzT zBo8X7xo_pnSYYh4uBC-kl-)7@x(2*^`=;JUwc+!Xm>c%Tn&?SgBPaTlz&=o2TmI*m z|3m-C|9|c0hnYe7+vD@tmKen3O)5zo4=13j4)h1tWTp+*xcpQ42-=^jGJnhAJ z;oi>1nVnVt?qF}nw5z|I!G5Wq?wztu%%umKD_vdb1yM+1J6?>{r$wFs77b=4K*i*jQ7K6Qz3&uRcy|mbe=YP&&|6#8UfBO6T zFEi!pFJ~p*yP$Gqo&Mp_I<095_C9ju{_Ux~D|D{2ab_p@`eW5_Lx%g>d*b~i1+|aQ zIk*qBBKQ?>jL>_T>zE7Q?Mu_W)!2S{B!Tk*)PG;g`rjV^e;D7KH!}R=Jafy1dzAv!1dkitVPPLnSxW9XP-wN3>w>xs8fX)GzAiuZH z>nq>ER*Wlchz;)h?O!n-Yo*F+pLnk#cs^QP60r`94XQ1^J?=mM`Ahig+M|HxG<{3I zGal&kt3RKW9}aJ@^&!W(ug~0P<6g%ZtY1Ej@KnuUe8=}Mf<2C2a$-lK+C(qJf0xf4 z!~WMe)XBQgP~;7CH1pkNa(MMLxt8_4+LHAz7WMD%;GgJQ*zUtL)iUyD&ND_&?n+U8 z&^*W9@0Fj9>$A-a>yXOKugab-KzVFF&=o5ALSf}+P?~GbvCXG=x5Fc7z3%pp40rj2CX!W{Lk$FSk_K!qt|lHpYnDY zJSX;(EB1WhwfFAbm7k97kUa@QF@GpwTNB~?IB!V6bM=JLO=L*#CepVFJ1 ze@@x@!(LPW$d&sSY}@8zO@r~!-`t~R<1^ePe$QZkc#wR5XuaINaYg%?8{EI(KGzbz zr`6Zo&*uF2?19z4ncq@dxxdK0qd3nzy6%ak#(;BDz>AU)+E5mTw36vVUze%=tz_(g z<}$EHBk9$q2J8Qy*2tfHH_UW~mfzMj3GKnT%+9Dm%9DF|w@}MXKIcrqK48+ArV=04PG$^yT>{;kiEsA? z;@YvEcy((iBl|Uz_x+noV4qrlI)Cn2?2Pua&wYxk_R}WJ1=BcJIk{^Ip5u1MvyI{! zBjm+BkPF}L(zxceT<@RSy;OC9n!@$1jdLzZ!tVx>f~rVtXfydRsEv&GZ7IY0G!)M+ z^}xHn#=BdG+R~>@WyR3cN5=P##r>fTWt1;{9jEoOprnkfDv4uS%7TzLWYVCP z;@7*ecy=Xc8*kT+b)|3Hs?xW0MH$$wrc4Xg{W>NpoAKj*N zJ)Uzu9P5=E&%-Og4wwtM<&{suTgaiz_w|{+A%5k;cls=E!^{qtD-@OpXkIKhC*n60 zO9HST7E(tdMz)e^Lt9IzXH)TYhL1bd!*5#==N;<6$5qAk&1#7I`ZC(L!=V{t`oFhf zWqj*Rt5Ue%@s~94&EoIxZe9OXxiFWR`+PR}3FaqXt(hg4&K)(BF&{c3M>o!wweP(q zNtiRJR^od8P9_PQ6GqmSg~6?4ieD>xPB&D}jBhsp``OaBO(hxBqrSZ3-|fJ(kuGD? z6F+RaE-j90{J*?G>$1{E+n(p{i4Q>T=h0_WKS1YAIxr&FXP({f4|WSoL$>il3=elu1_E3u{J$%j`z+@=`a7SgmZj3 zVm)hb;&4M*?&{uUI`%!CH3uS)4>72R3Ep{Bzmr4j$)eD<5%Vlv z-yUS~x7jgnxg-iY#x+>7e@XlfrIsuXepRM|a}eex-p&o6WA^x_j=fn6IbBIyTE8TL zu8nRko<4lhn&pwNf1EUz&shI$T3kP;EY8RH3@#y{yhH}pm081DN|-lu+BP>~PP=!e ze%DjZuI;MGFqfuRCk1r>WLfm|;MGg!@;UUsWlQugojGr4eVO9hK*IVr6~A7M@po6u zXVz&OXRJY_4}9IfV`Z5+rr*Wo(bGol+LX>`vH$jMeay&O@e8NU3GwZ+*4w%MWw-X# zrC+C-;@+Va<|fsV)3s!jcbl{GCi_Jpwq3TbOXah-|H!srW?0!d;X%%U13E-u5ANo| zsR3)&r$u+nO!v6veARv&_kZI^ sbCEaA$0H6rvYW@}?ZFt{_gLvT$X!QBD`4ekU87J^%FA6x^$ z&*Xjge!qRr-TUnQ+;i@^_m4Xd^sHH3tE;=Jy874EwIbA2R`tWF>^45aeLS~ zBB@bOL?t{NAy69_oXHesVP!AIa@gF?!enJ8#-byr!mHva4YRaT@N$M}d8ukcy=8hwRNjo^h zn1r}_xuCqff=oaVH=htd5XAe8iJzCBmxqs^hZn@f#|IV!f&l=gzkOJc+?>tK!J0C1 zf8&MxCB|Y2hdY9Kc--CHx!nc09h@zA_&^{K4=+CtKR*|eg3HCz9uD!~vUg$qdkZo! z7pSw9Bizctp6Pds5K{+NxEKqvr+*H?&hf8i?OpyRCZxc4JRpudeB8Xhhx7-b8T2nY zM^|UtKbV_Ad0@6MJD5G(1xd^I7p6_vku{L{YJ+5N@B z1upA`9LC=S@=vKh2!@a z{`LS&1_FnPu^BdG;I z{~amPip?N!$iF2vgM!T+ob4b;9az~xEMPp2_7*Hme`yvh?O^NRjAV@LoxnfdSCp1k zcXlwhvPD+7Xv#llQk0bz;sXf@aUsX}M|V|Jz>4-RaELt=rYIxEf*dQim6aJ-h+j}p z5F#kVB@E#Oa{Zn{To7{*lnV$m6*lKJ<>xblf&Tuyj04p5w^jar{?7?&<^V;u@n78o z!1#rQA^botfPkPWmmmaS$^|kL;^h(+GB=0tnE?R&0A#oSFiEhQvlY@uKy3f9)!)4` z``s%TKv)1^X37PH3i5K9!vFv-VF9Qx7XSzWnF|1cAOSuh7N*~3@w*vhmmt37dFNIW#3(`bLoEJwWosq= zmsFmEWPyURQUGZo0X{xiVUQf}b7`QA96x|hPF7e(K$PdVCqh2J^yk%|jqv=>x&5gO z1*_lOJ^#j23+D6}ccwpF0vH1QQ<%`-6AEU=^0(Vo|IDQRBjx?sth*%)skZ;gMEjG> z#lalz4snJ_Ss-=&ZznR(zv{dh%-PEAzdG*-afTq*7nrk)7z@^X7kvmE~XZbAkK=w|^!oegWi!g9rn;Abdb%0Yc6` zVKbNzmmtjCRLIQC9ApNC{aw`mR8)ds{=a3_-R{O1<;zlYzyRT2os$8RbGGUtK_gZQ|B z0!SZc3Wb_+ne&?SLwI4le0)O4wfz5TasO{9>E8~954kZgFj0EWa2C|z0c+CX_%=x&?g!y@q1=5Ft zc#+6kKu8!Q41$^=aftbEi~il3!~ZH||BaOX5W_!gpZ|UfxhMa9`ByLi`Qxu}0?ZzX zO`MUzf+Q4U01Ao&tD=mQw#Scs!v`K(({uNCE+Lfe?i`6ieU9#7%+jIu()BrW)LlZD zU3FDCvXON?hDuJju7Q;7J(113i-$Mg8`)YF6KV<+Q=fQdZHb1=r=@uhi?yF#UEeX1 zJgz+M0Ht?<_S_!bFoOCORja+PBpw{AI=@TUOJWcXJb1(g`lIN_fwTRt&lW)z&S(qB z;vE^{H(k1k{30WNv=)z4k6t?wCDeeujSCY@-wI5;_5!&xG1BPgvN$3b7deCZn; zjB2|**WVc{z!S6_3BaX%*0)8DeyU$>rf5C&>7ncHRE%5~nRurRFKrTbgs)KIy+oY6e_@%{uhdV6O3`G&V%X9%gwlMSVDI=`#!A|Gh7 zn75Fa$MVdV#kJlztHl=2iISI3ot>N%$6Gf06T;elt>Wo5yOph>+-{E-`7pod(0Veo zEF?6L#G~f2`K`)^(Dh&*L?i5Il1i0Rbv&i-pfUJ?i-U=&BL~IrXjzJzukG}^2xW?n zZK1LMtzd?@?+@|7J0yP^0dss~$q#4^cODlD?pE^+PHt?eK>PU_YnO118cU5Ib#`fn z=ycYs+H^MGZCbs4B9L-EM~6EeT`c)8l_Y#*7|Gcj&dSQ6T5a{dXs}N+BbPJlU#L&v{NxPoKez%0NXW-xEbu-|uNR zQ^^d(FvrgBN`{m&C83*Ea*@I7(?KpjZbZ2an*h>*blg1pSy~N=D+e{Nvn9OGqnjIT zeOWd>YUE*VrPj%X6ZEmWgum6m&-A}JmJdyx-k+@D??N)el^jLgWKLwm-`*68yO(B@;^mTh6@b%iUm+tP}* z>ZpirNjeuV;x8&B{`Nel*!|sqzy(++D&0 z_qxs=nH|iowcMT0IZQnOSEuhevGB!LnGrTpLazNc@ipL#8Kpbnyl<;mN(_RrKi zWX)2o2cRNNl~5^(+m0feHGTH&X07|-;s?~G)~0951Q-}837Mjv&q2=Xjt!nQaN?o6 z+iQAzRf%8A=uOTWk)DCEFG@eUZ&)UzNcj7C-CotsQmzlYe@bspsMYDam`ps02tUP5 zOL-l5u(h=nPiAGWLu|NKl&0W+SM z&Xqv}GD!;Go8b$~(6Y_$@8--WL~I*M@`%X~r3wyJGf7KJ(<3csd94m3r>35D_~|?M zZ)oseQlk-HG}ulO)WmZ{+z;|SrMUI$zU5FoN>$bkYP&g63d@`}J3C867h`Ad%V8t! zqJzbT5zuaqxad}y%0{8I>eX5kidCqW4xybb%Zn8h{Thbnlp#^%ZDIlrH%>?mAu!tD; zjwIzpifc6G%1bTEAqRR#mL=N=mq_k%b5t-`3VdZ&So@7UQVsm#OGvR3Vuaa(GCKu} za~ru1U^F4UeYVKoFP=`+I~a#$eS6C)4}O}J48g#{N~1u;GQ4@C(clON2&U(t&(Cv+wCC7oI>i z=I^ z1`4M^>3q;o>0#)2p$ZooJaNly-4iK{lFRC8I?y*_Ie-iCfF|f9=w`bp>lxZv1Q{Fn ztmVo08$MS__lY1J>V+m(mr$EjNVZ4BV{E(yjjgi<_aznXPr}Ih8r-xU$algV-gMzr zx?I+n#m#x|JRLl2{SC&yT<`7ejR7>Q7?$*jQs?0BjXg+NFyz42e&r^y*U*mJ>+?=7H zbS^txbiO|~w?W5}hyUT|jLCLPHj1)#(9>?V8fIO@YA1=sZ1Z*T$=LjYRsw6j-R8ji z!GlewxjMVV%o_JYqh{q(-{9r48gzQWrhTieXD>_0TYWCacA}hjr^?)FnZk$|RqG@_ z&fBP+HrX#U0aHSeq;CkHD6D-$B!rtKG&D58^%J!Um8+t9l9dHeOUXXno%2>$u>l=jW}_Bb1tmWgT)hwjLJ(nELlBiGNmTAAgYc60I2TLZsq1!tPM;T0DBf7l0`qA^H z#s6NM;35AbLrT-ztDi%QCo`|GAEvO&W*EIq{&;F4Rn0w8phiZa|0$xOEOd0A~xb&p)3>Mwn4#@r8wL{74&xNxSj{|6NI7(lY zRlhLLA3`=mj5FFz+=*&$Z+~`oeaI%_BwS?L6WOvT`b8cJh4#P2;pWD;^SQshm}v2I z;nb}(iKH|^!kA*W{U0rcs6UPpsLa+q21`wOx?kEMdA3|2a_C8 z^%4sjLRpCCrXeGf?v15id#%vyez=K#|J4FT&?q25xm3}SSq=#vI)kxlUBXF-i94X! zBi4gc&tC}yk%yccuz#%bzxT`V>=Bi|k-zo&)?T*vQV8!~;O&0`y4glD*8e9s{hxt# zFBj_mtYm*lC*5~uz6mM+X+Q0wr_dqTHhSJ;H$Ns z*-%X(+Zk!!Ywo;USzmUSO$BGyR{7V}qFY^)KbdLWXBu*V2S?C|tp(^3fdy><(a*y} zl{DbB$g^qxGXx2}xKDDSTGn^k)11#719ltVGt#CLrTG-2ZD*@Bw#N#Jk#lRJOdm)i z;`WTkef^{0>bpE7*cy+ezqVTKem~KCfor|!BM22LEmqH|O=Rtr6L;R6@0&WNDbaHk zthH~AEbE~F*roE&gW)W#-eX9V#$&9S%`8p%xqtRKH@6P8u5s0I`0ceQx-9_9XGacj zeel37hV4d=n;R$k+9BVe-S8cAQ&s*Y7r*Msw6Q-QP7x&1djBzy^JR%lo_yTz?S(L) zVK^hI$k^|-l%P#{wwlDk;B-;xE_&Tpqw3?t+iMaF{_^sAip}8mi&>9vu@ca=2lw+m z8~CuHrkGSAL%Gl9mxc0i;9a!aFCkH9JyduPdC_MdwQL%ITsFsTW!PEyW2B9?YWQa> zIJ648&Nh;a;2Q%koAtvjqeq)uZH#IsHDM8AqM{xU8F?1tr3~%nbIm%p*wW-)SHhWZ zDS4WWuhgm!d#ZkVL>Y$7EH&>n-A$A)n1UUdM%n`I&bGB^cui2f5xg4^hh&oZLMa|L zVV6y&!eQ^(5QR9SGuYsVTI&Qd*Ab#ojKw`^Ox*>@+ZZAjCNmRBh! zOKJm5O;s(Fvx%sAlf=4R%f}xbSiao`e7QWpcVZCvSqZ`8C-3{cZ%DJooM~`^mQMJq z5snno@9cKejn?hc!D8-;P(;5C?D9vK^}67O#T97eQCiSt=dJj}&=@5OKDEE&^iCdu zV>H}h!+6eV+Uu`=Qq8om`=4&Ar0wQ&_F^&mbnNcwqc2|tgfy#*Eq9JGUTuAB_eYFq z3}kqd>0{kHN!xFJW8Q9f!kXyHA#;UGL3!MCBt!rwujA2!qhr0>kj(}z$wDf-#6CRR z?)7e*W6A0N;(gd^G49*KHv;L^WCCK?3nq^$GdJcC-K7X52{`sXHT6n!^_7Zw9-Xvo`D-v#d>}Aq#M+lQ_Czu?b%SJkO8MVy+qlMeg-1}sy-~oJj}j&tTJg76zM>Ewp{@Uth*b)vy<0V)lTPNC z_eZW!Yna@+Qvxt>cisX&4BROfkJ=HIg3?kO#ywNT{TU|mqDU>vFM+$v3jJy{k1bIl zOJsZ5zb0{aU)&gjgyik32jHuOIlR7tU4p8UD{gM-u4F=_z^OUxPVp=K&u7IC*oG6W zBxvQ|J3V{YF-L>wx@_&7HZGmo0Y+RY(T>mpbn_4!Ic_K?GL>s7G{CydHgUfjk7l$+ zx|tUI%X)&w-iav}X_h8G>-}3SBCGqAwX@x5(1b-_+{DUY=Y-2LI}LDy=SS5A(?X-S zvG>8wB+8XkNFL)WRPhmvWrD!PRB1*8MAQ=x)mY-DQnc2@-zA$zuSRi{UUiP7FQn~Y z)%gP(qldRcm2e*`3(Fqqy7RYmkXG*y%<>}_A{6fEXx`tGCFZTF?{<*qW#^?{u9>AV zW%`~&Nh9Wa-|K3cmv$3xU;VPn4U1zqJ){@)NQ!7fxki0(B(FWcK)pPf4HR4tC4Lu5 zVr_yzmq=7%s|=x+U`T&7HoPal`6ViF&(Z?N!^No2F(`&0dntA7~?@&N4%tTkb4xU~-If-F!4K_ksn!wil8UcuA%E)QPK?E5oq$l+aJIKH2 zyfc@qP=^SpeHxy5b)M+>lWKhh0?MBL^m?2*;O@J~p*kE6!20ZkXzrOnX?NZIP$!9g zwlB1Rg$S6g4QKOBuRz;yFO}W*!q4?viplxz+n#62K!C_=v0wiZTRL2^SR-KA@@%yi zi%_)3<;w$i-~$gFFB~7GxHYddrFar3gg8mqW>OD%?$-NEa;af7YyXMPo;pwsTVP`l_PN|%xpD!sL~Sw&EhV^?RXqnM z^A*SM3r?wcT)O7Ri-r-MUGi{_70%nwCLoGaTgfa+`1Ivs$J@2bpWo9xzn!`I8wq~p zT_$>n+A8>!kCilpd*;UV2x_C{zpx~7driGm6gFRrNhN~wVdtZ zu@{I@X*^31igRs4>@bSs8y57V?1URvYpAUy8a+&~c-vgGsfL2i<6XbN8_AtSwUS!8r{wg3YfCZU%huXYZzFO__?uNp?$ zsmcuUZ0P(hQx7D3Wz~!jg>;8!5(5od*Kk2)_5A4GD^pQw|fbN$@}71T9i`PDJD*?S+fM{@EAKA4ZMxUKjbncfT9@`SMgm-SA{m zT!dYB-1b@Qk3H5DF}_Z0?C9``!0+1KGc?k86pk&fcJkU`k#xEIXqA5W)sn@=V?bpI5K6+JHCYV z#ZQ`}BiF|L@dpUvX-}E82=$WrN_3zB#ACv4Fpy`vXD|t{npA8s!F4bjpC#aSl65mv zV>SM!l=E4nztQvY@VK$b)RP`uu=6_hJ)Zi23$B3EoJE&VmEt^A=QF$(-;W>VeeY<0 zmGQLEl(%BCuk5(m%OrfQe`c$E?ajdFGalE>qp`bT@p1EumUi#c&>gPGoF>}|1INfz z9ues!hjxWgccXF6c7nt_8HxdenPB6hJ&PgXzDKBZU4EIiN3ZX%lu+(Qs+jz;JP6a* zjGAlfOcb>fmp28|+(*TqmOn6-u$*AmP;@_7eR+cv69c-OweQVXsd}lb&OT_vre?%w zEs96Ac<(_|I{jpVey!dI86P#W5iv1e57(EysErs`T9~A#-R)ft(M>knsBpv}lVeN} z#g1ho9lriDi{9~758lrG0yVw#)Cl8~V<;XKH@S(qfyz?M&tLsye)zTflJ9qFMnP>J z8+!EF!|9)Ow>%PJeQTzdryCt32DELy#x;_k=lj4)#~U8(ZV$#JfhuWvVqn?g8D;=T z7W$bX@X<*A`#bFy;{p5}p^Y~iHoLag@l3?8EfBAhxG5eep6^NIy3p+eU?7iNzVsUB zI~IF3EyqZ&8&-llUHZIl2qya>|PsD1(6Ki;!-c{hz1XOrV2-U&TKLzI{6 z6iWu~&)-3UN{i?a$S8Qx-YgM&K@JPOH4_boew~=PmA&K5uVc8tmlQHYJZ?0q7&mw9 zeMr6uHe$@~15I{to(0eA80-6n#MJU|AhzS}sO_X@3D8PxgWEXCfc#e6RkGa-GrKnh z2Z8l+rI~b33O}yMBY%FeHEam|EKff8y&TRK9U)>hMNLy(T_!c~U}NLGy`)amLFUgn zClXThTuahX-#zlShmvMJAc=dSC`M^4>SBLsx?U&zXPO*tSeTJs8w7Jd$1=4#%7iXI zEtTZub&WiUTdQw6zZQ=`AmqRX|+22Pz2q8<|o`n&Rp-t zogt2sbu0R8e+l#I^Vd!iC$I1C^c|sy$q>$|NpYJHy|Nlf2~W)c3Qo*TMe#xN0{jWY z=xY7uGreM$mTMsEyYK_z`{Qe2BHHv8xqACiubk!xNh;7T5V7PBOvOSBez4o1SC^r0 zP{5+CnrEuFH~fLejEuGc3>U1&8Zaumj^04NQDfzi3X6RQk-29w+Kd;*K%jKv&;n+a zo#Pq&b9 zjr4`U2%EBQPlE2A$ljz!Jwg8J_vDo%2!Ye4V@1xYjoyL{;*gSp;ysJ|<4+^5dTvV5 zp=$=S37iC1QBFSxCwwj+vPw!wm-+H&)iUa+Pm#Xte@Q`!mvvL_8>UG-0#6XXg$tCu zPB1z8)t^Ab;coAL5ET~uU!)_5F07Rthri(8|KkP^efk32;2I^7(s zkp!B=D}hGB2n`Er)Fa^?BtyIIwL^!Ntq}+qY5BT z1O=&iS%*7oPd0~?9NKS%>IYbL=;cHvXk~8+C^$=H#aaEVJz$w%EbiDxJ%C-6I;&-MMqMK z^+|Ed&sK-MU+dh{W7clH(!f-ABH*b|dLk4w_yWT?K;xJmmRqW0Tw3Ow_9Xjar#9ju z%UL;F-f8gqXvNCC>itt4ZbRtz0wY|FW0H3-JXC6n^xnQ^{Pcl(dFNvyDJ^a3I0o9? zzU@3~SJ<<#zPUH;vIP0G2v@>+p&$j!pLx|I4DL1;z*46?VhUScOCI-${#V?zrkLbN% zUz+RTtyS9HOgO|Sc@Rpz|Jm$Vht%mz%eFx30IjjnPLOJ(UO2zUkT8FpkTJ7PU02yJ z5bePj0b<5XvPiYpX@M$)h8HuMx>w@!lw6J1PwUL4NVr8~U;W|iFxRLxlQ~!6%H5&6 zb0XzR#pP3k^97oHVwtup=X^FBg@a&xBw$AxG%&T2Wufs-FTNtS^7T!RD?i1j#7AND za=c3fbG4xzcvK7mI6}%RJG3AjHH<5v2YaD`nb>>2m~xtxNzWRMpZ0WQ#a$e4bc`CT z#$%2l_4V?hJ66K4iP4)XnTUl=v@3JBP8&k}vl^GPGfZ%|CBvd8dwg^F`t#w=Gu?;i zgjDH|4?Bm3Vxo5S9KJ`WGqjq24Cuyc9CSji)S$OQ_H$i8G}pwmi8<80ZY4g z1G=>Z1K3Be1l1a+Ya@ocNK=Z#9Yg7i=JKhfi-T6xp;Y>@$fMB4Cg$uzEg8Gpx8!>? zG1%NeQp8hkKW`OyWZV5l2V7$wuB)aIA;KerGj~4bitLd=zna-*OY3|%V39E?metiA zk{YSyI-X4sMlS26qg=w*}o z>h&cUL@xWl$W?BD;=RX2r>~ZaOD)#OT#xg5rHi2zIil!0cn{c{u3s+wi+WyHy61 z+yR0gpAWqp-%BzcB{O0)eq4wxePw96Yf>6ns+4`G$~=+~WJm!2wRJ3BO;Pdua$qvo zRo{&xCHAe?2loZ`#&0RJPc-aBD!LQQvw4hKUXPB_kH#@{L9u;&-HRR~CQEhHfZ5Wi z@sCqX&aS*W`LAr+fLsQfgTY#om#166xx*agSL*8VLO%%aU^4C7=yc0|K>3H9>qbd( z(P;yXtr}jP-FI(_WpXCjtuwH=lJj#IF>MfYel#>7b?N))arMeLtXryl$iTUp%pyy)c04jL)R6~boXJ!wahMFztd(`3q1l%Tz4a{-y_6XgF%?C| zQ47l)96FLRowJSG(j{M4)4j@Fqa#4*%znl?^0}!YO(iLGuT8R^EIE$kVHb$u^E$Kq ztU!af0sG(iWDvhfG@hF7YHThwc}(b>A7igtZi6U`ktu2tSpM(?w}eSDJy#2$E{d9MA=dSyeL@=5CJDd8-m+NT9pSNBnz{1kQ z9KBk!S?}-y4y{$oll9L4$d`u)71Ikc=MMpWQe}G!b4qw{^i}Vj>S<1G-L-frfxeki z1JJ&PQ}*m%aSXN!(|Diu+5-ik-}EDtD(D;3d&SA*~ekIS% z@x}8pVIFHigQ@Y!ixl3zZRa!B-Ds*zVV_^InKjuC@p$XG*Js;)Ey-cxBNUZIgb3g3 za<>kjGe;x9eQCwF@sX8|K=f_QlP@87coN42PYtMKxP+o#yCj_qOA52qVz%90U)Ur- zm=;-x=x24V=;-7sd^W7d6bi$PU+|7Lo;(jo?p5o#;%SoPt5eCd}XSKLV(d1%#v@Y(tP5J>%N1p}AWAH0LNEbVT zr@dx-&B%RF6#h%tJdE9!1$|+-$JF(rkwZoJtu*&XWN7WbQFY9by)B74@t{{R@uefifDj&J; zoN~n(1IxpfOjmze=N^SVmmxagCF)4PcUvHfZVsC?yAsh7%%s)nKQizQyHh|0G*(f8 z)d3-19c{#<3}v_9?{3{cN(Gb2p;^N7)&Z$`KL9UN-bJDM->0gus36lLu=7?$_T*CvceT(Y730^8sw5=sJO)vW2`(|`g z=^ho`)kN&g6Pn)q5 zZ!AUp<{EOz`0{_rOFIjO6jE3l&{M6eaPC){=@ zWSMV)nI`y9f9pn&Jiiw=ntFi(%x%wNP=HT2+}$CL$?m?rr-hpg>wL|2WpIm-*z&aL zvT|7TQH6fZ23#@Np+!f#I4s^^c(du$$O^&H%wOmf#mrr>KlGor>Ih&DZUW~I9j_&w zf-eys(D2gFZ@scB^lB4aK)pvry(js8#!H6g55Ol?OTHI|r6{7tZ9X+HB~v2MBc*I) zib_%d9<<{KV=bi#fsXHjOiUWn+jc*gPhn4G5Le}D_UY+y@|B+Jy?m+}`)<#bJ&3Gw+aDIbLuZo zNtOtMA7b9c3=<0nx#U9#qb#~Y3BUyzZ4dA8sGj~rjjdC79i?Nwx{m@Tp|SG$ZX{;v z^@}q%-2Ay3CYy>*z%K3Hdd5{3^-IgR*+pb#3x4*Xuls%ia5CQb|d zG{Xt~1}V_#?X@9On?aLDSjU)WSoP45dHwR|2|u7`0#9n8Hpu^&hf!j+grSI@UChm; z+}-sd^6VBUIUv6re2I6SX^R4>rea z-7nu%fm4o*!paY(-&|gBio1I67hb(l;L8;U7*7vZ4>8~2e5=KCA|lqv``0TU?CbFCg99wm#v)E+ zEZQG8`FA7pBw-z?pFJL99nRSr;Ww^1+V+>YicT?h0z*x2mvk0!ObPI3QT#4%dCEj8 zl#=XPN(qjzp?s0{G^;!Kdk%|?zEjU;HGU={a|(`ZKU-9=Dv_R4bD_eE)mS;uRUF1f6cig!I%!g0S0x5E#op%rq&l`XN(XB(1)aCQ_tlvyDNM^nNT z6J`xG5D}Gy8!8awo+eP24Ac0U%{+dhdL4Gc&rRqg{`fRP_nzn^k+oirs}b)c>TcS>gsEG#W8*)qwC3B9g*z>?XfJL8T}^I?8Cyy?}w+qfH*!7oqu;c9ZX-da{Z z7^U4mdV59eP4ait11m-*9hVEHo^a}gSj2aGp_R}{5gFWr8Sj9dy6x|C!n?ur^G$}s zf#8Bq@2J~n4eo`Vyxt9=flg1vP!Ro&KWk9w0X_}&UnZga4NlxaY)8RqaSuPIe^T_l zI^)9|IbH8(m1)`qdfG6#wgMcT^I<#duyzlXxSup+;vPrgseX$|`lGP0#80wM$K54v z<=hV!fM`cL(Y4*YVm_aUhZ{@3Euz?CAHDB3ciR+!gz>)PJ>9#+yK=pv8+chlGspWt zSHdjU>wPGF!W*=;43m%J{Z&qR0ij;#p-D2BTas!?O-(=09A0HdS(dy+p0sit)P>{Y zo?sK6$i;kkTZ_X}EfYa%h3OSWNH5d0ectMop2zZljyyDf@FHt`Gr9TfVssb4w~Xtc z{)_4wDBkR$_H4peIW>@*C>{!VzBFIgtDd%c|K^vM1>3lBDZg0Dn~dPOK1n*1=xFRE zUr!xdA1^q|vv)6E*>^vFs-VEzZA6aJIzZ;OG%N%*3Wv5O8`g`j6VuX{axbgbg)&O=r}DePh>+kP znS(?!8Blmv_Tq`tR@vKwDyl;&-=r)1@Gakd>t~`p_a|T9476X{3#-|vF6IqR+iSK? zEj04=za#ekEljj3xVxEOhJK0+b<-r z6$XM#lWf;yXg+!GzY>l0+iH|Q8`?abFj2I9=dL-pOYUmy9orIQKj!kpLvVXUsaGeC zP~iE7mjVtB4rY)0XEb_p5|Vz}W{dt4V@z~!>h`U45c=;tVq`)Ve0vOl>U+G}liRlR z5hr3^G>g{t02uxCAhO7Oa9H!Uhi~GWdKSMB&9m5o!o74H@73Zh$x(YJ@W1)E`%)@+=ISjeOCgoc>-g7IHTP$XUvO_=dFHlwUK1JNR6oewTe6>BD-Bc#?M0P(2M(X*{z%Q zY)@ivl6p19dq%a}ZtD{{99};_P*|bpo1Ni8O36aPuXb{dG2Vye$W+~ufif2myP1(x zfwy8mAB--bWA?!L2y9tfYF~B}wKVkwv<09VhVQ4Gyw4*g@YWo^WS+3?XTC3Vcgeq)+YaCE;!jrCvci1V~?dRVH6Gau3?HZJU^|kPDZEo!L-m$n+dJq zyn95akke1AgERYey-(nJ?*{Tul8s{e>I)B1CkD1mBWdJ>EZ)89Y+9%pVwp5FW^O`9 zRJQ38AVe*hxML$Je{M)RJ4MvAhDR9~1IU18 z@~R;YvBCY0QUaM@W+?R%5UcPfv1tkuQcObyRx-?49NTp-K&1%`< zOWwmdeBg?ZXLmyj)!KR4du7p!ZUT}XPH6zZ=F<$X0F|b8$;}3b|4+gROI6}S3X77b z&#nfLkt~Ix*N;d|%pTC_&X;jF?T)wKU-1Xf>oi;!z;Qp}tjTia#O2+5zqz#G$Ri#A z_@4B$6%!^)B|JAQKTs`@VC?B!bcVH9zGzte#4i*4#au~MWBYraD`g^vi1W8y!HJQ& zOPVVpJYj=pCY=ilZ!BpiUxn|Q$vE5|KGwIBdhWl)_@mTn3Ik!za(+zt^ax+GFXm6Caq*;Ip$cG?Oqw; z8ySP$nr?p+5^~pXMRp}J2j>|gulGgWFoTFaY?=7#nC_at9 zXVlT3-AF#!^5H@k_P-OYpt5)$kTQW4mY#jS-|7LP)0w_*0Z?!@GGY82vZ=`0qz!AB z@-?zAg7(V7Z#=$YHqaob*&hXHY8Q5U%FH^6;D}H~u~_kkuu;+Gu$e9|S+f$|Z1$zo zTwfal+>bd+etcwY%_t)`&aR#U!H4QyZ2CSog;L&>t=f34Dw*wUn>$O{2~whmQySnTI&XaMUhm)Slp zw*9#YSj*}GWW? zXarjxs$Wz&y$w9$K;OkP>cph5(6}MIs`XkHfERUugsCtk6mU`muC?}mC|Q0_cfEn^ z$DqIwODG~^ME93lj0{Wm*n8D)(XKM{Zr}M8sY;{ckw)>f>)Yv7e$z?IprrDD`{eGJ zh$nzOcZ0P3)XxY2m{336r1=4mA6@90kaQ-a*UIi))P?SBziB447b)L;RV_-@d$`=@ zVH%0!{_wdE)ElpU_1HOL8k?eI5Y>Ue)wT%kFq9`!gsnU9s)e86{?a`%R?(IygnV`E zW!j0l?zd(e{zJ@_3d94pL0>5VG6#9f)Eigx`in}raeLAeWl5(mJ<8n|$ZXGg zjj2!G+8G>#r~Vd$bzzYdb6*CLsaUfm zyLleVfDM6LW{^v$Hc4m$RwvpFCTI&ir(GUEWs+na08)~LyqUJ}`bGNWe4cNgBY=TH z)6n+SNLN8ljM&nKAq~xZ+>rjm^BYf@yxvdq9^3sgr;+np3oT0iU^?nAOG)BA#x39U zK~zo^4!<%ght<_kZpWlqRZB?Y7#yjDy4|*4eYQ+35qu}c6x;nZGY5f4@JSc<{osK6 z;p5r|jc#`wcmpr0+uo0v)~YBhEUeEl4lJ%a6A@cYd6Sxwk^$$}mgKxnKiYo;k$=?6 zY?TpQ6kZlesC?%FTCE2jn!VGC;`tRM*NKs085lx%+ba2*K!u?o$Htp{O}n8)lnh_T zGTYHF$SMmky;OwLnu4{h4Uj&?tebr^Mcj73h4aMk8a&>0Pu}L@iXOq++39dNJu;6& z!}%H~M6}yQ$?;1j>Mbot>!6PiHAaK@Li>IECeKe8tsPgURrqf9(UWfY#8rX~{UP<$ zFJ!o}cHUqKyU4;0sJ4Q`R=_yI_h_Wb272+8J9dGt8SLi1ccP1rBH`wz$bRu`T=#9k zt7NA{s8lf?s^8TaXehP$&HQf7W(>hZh63{s|9Ca&R2mw+^RQ3`I#ZMgjm9)Qxl<`*6zw z!2Qzf%ptF|6gZ!|PfQSBRW(oA7L>6EuafR?R;#-}O-&KsQUu`0*X_#eGtumkZ?v>J zyN0{XEL06b>%$1KR8fKnF8n^y2%{iEICBG~k7yT$Q(UM#Aa6urr8XjY)@9!wydhjF zFAJ^vuG8S1*o2zf%xjyY{(y%4#va!1s3C_~~>- zvd66>#7wkOxq)KE^oGe{3@zn#a&n9rOKo@t4JiSg-VTbPkYh))i08?pisFjR&8wzH z68pQ&9_9=)5d*`rQrguWbzc<6y*pjOa9#T;J;s-5Y1K>hp; zgP&7TXsB;q4vRgF*HfKb2?NT$Hy;-ZuTf4U;LlXvekcrxbr1VC09@a6Fglo3+$K5$ zuI%WNe?V&*Va^(>Gem76L5(zA{-NoQ#dgEn9vb;_VkDo0rs=cs@blrP-5;pD_%sbw z0?B&0Rn$tPOYKmO+mmg-NLI`gI&Je*Jv{1bi;VCRM*o$NM{{M-5<2iwZiNuy9q)uO z(zy~O!`J)XMriytjA&fcy&u(ZXsBQb`3CDe4%~Zn$D_F4$@Ql8(a7VRj3eX`#mNU{ z-l_hb>hj1=!ff|@Woesxv#V>qm9WinPCK8*=A-t!j(o*Z;qj$mLXCF{FRI&>=VSNN zq8aYg!;j-}^B)*FJGwEdr7*PhDoNMw;7QXOgjIsfUgCn(UM`E z`)AwZ^JAGb_L+qrlvM|W4d|O&QcKq=1Ov(^m)5?YYQH#hlkNy_YG6i*>#I_w2h{jm z<;v<$4-a)8YAuA^-7Mj)Nx;27Bl7&{#ZHtxpa+bwaGGr0^Z6!mzE!m)tEDP zv07R(S^*pEuiszcU%q|*CGVTKPGJDy0awqtw(gJdDYH?f!bsdATl~ZU< z`2o^_6Z@r*7Pp%)&jmRC>m!M+XT>?pw*c}+Bb*|F$v6XOb~J7OtDOiSIiD)Ot4aDt z8~2uI`wqP8)>CDod#mtJ+{E#b=0?}9SIjXTeKXa&(=Dt~1?-^g-Kc%*|5npkMn(0# zZJ0({x=W?IJEXfy7)n68yFt1UDd`4jq=xPm7)p?ChOR*x-t+sf_0C%J`K%LrpR@OK zU)ST5c)X~hARqIy=RFzbgUILZg;mN`{H>-^F+SL_0+yI) z3DRnK#nX9xUNQA@gz1kvHoG@8vzU&tkXn+-4?$VH-(QTIQoiK1-cHVNlyKI3*rG^V8at}?XPbSv+javHXl zs;MT2U4{ywgXgrl3EvoTu2Lo$Fo+^~sBGrjeJsB)au3Vhy)Y+)F2uw(S%1Q?`_qk2 zSiKa|n*B8`-{=uTZ#$G8nR&i=c~WFHtId%#^9S$S{q)hkzbIEJ&;G=71IGeds}}co zZGul*aDqih!Fi$+mXn_L@RSeW`RN<`0aE-GU78WP9LZMsS|^o&R^$R@;b5-Nhu~M9 zr2Hrw)~f7&N>oIW7cZOgLJJl?7&RPORU!Ec8QBuCZC;T@yn|h@#ZX%4E8?AC;$Ti~ zzQ5KJ|7Bo^s9kR4gU8|p#Fzxx3WCuc^(Z-U0K_l(*6hZ|B~j~3gPa&^joDhrH}};F zR`8dwV$L7_cpCu^!Wz7Mg>llyobN~8?~uzUO{AnPBJFJIS|bgcKZ7Llo$6!nOg{Mm zRYh!_XLcU2+)aCbiukEK79lIc3Br+kas}e!#~tjh=FMOHr6|y{>eB~F{ZU}#?HrZC zJdBWp-_%6t)vif3XL;{!HKlY|voW)7Dmg$gn4FR2g&-P8uCa-=39I6Qm%v^A3`_RgvPYIeEKR&H zB4m@GLCK_umn?ndh^eWnp86iB0QQb9aP~1NQ>2K{BXpkAWwyfEQvGjL$6n*9Od3qM zl(q4kFF&e|`PV}LvTTUgHpN0GQxOePTvX&^_2Xk0ie|Ij0;6&|>vAm5&C$YyhGdW1 zsqlisdW6xS<{WnWP3jN#=&elp(;lgs^!&ms3>k}lzsmh^)h_ipb$>j@e`ofFEq-jb zHPU1u!JVLleFERBCVc3hk~m_HnN%im08HU_bG;PM;5nnOLrzMWY~R6?pwHr}upd6P ziu;>grg~k>qF*bFIhsTzri6%sS@0DZBdZ!adnP34?1`?{I=HgQWlFzASk7e=V?0G zvg}Ci>2hDXPaqcMbcT~<`1yw7j5VFm1%^%tfGlc`rO;`wj?ukG=u**z_i(vBp{vr& z&F}nqdF9S@r2ofq&$sgR7-f7%FKJN@6>^>7je06sYrL04LW7rO&y{S2qqVI2#N%PtmgSUd2r|a^Y0ZqU9ywobj{9Xj{W9#B#zO|l z7Y$Sr1M;h6JCMwJvo(&2pUXeqWdQ}`3k#Bxn$3%DBx}_DC<=>VXwVn%yIypTY zP{T|_3W0xqV%H-3m(g|mg83%PUkn9d`>ZCiuM>t}8FCAX(UfTXv2&$szHc4XJh9JN zOFU||q%8PaAc-Eo{z@;I!7ux}>;A={V89iJon54SNliePH_%7zbopkYZH2ae3 z{7MKzuUh>P8(ApSi9I$!OjS1S!PavZwzXaMP&{(&&!YW>Po1D%SIKe3(jQ5u0uhB2|cBa`dbi0Y~JOF(N7(s@vk{#d0;X{xEfU4}E0 z>sV$#^Y;zpV0yz+gtor0u-*lg8`8PG-EfK^`m>N-IepQAqF{8i!XtPKpI)W@%_t8N zgu1ZmNWCbls=dW1nQ_y{JSx)98$Zovo~bGlWn8-}TVLAI(4NsRSIbtfJkHK{hWGO1 zP0^#g0~s{%0aOSG6Y^dZ*_Le4375y(EQS$$-!0J&0}(1V<27f1LTx4)btHpwP~#cr zObI$E_c?~eduS!hL%vI5)w~)>-;mjYr)r(zKCsNwM0KI#FJ!39K)ME$(iY$12hM03 zl67sWG)F4Q7u=o&rq|7keLtXwZ`YmEv0u2-^tf^%Ctg&Ixx`(S)UR8Q_3)i}W6}I! z)DaKbIsEViWs^uL;f8=$3lo25j0-EG4p-OO@|IvXr-W{41H&?2V{|CU0OpTEV%Q z1+h`SJ~WPF-v9{O$u-81|Kct)aax_mt~CJ)X;qzO!NI{*A);%5YlL63zefefc}h}e zdvclD2pM{`pHwR2+!8kzooB2dUl7G8xzRUxYt}9I{KRh`>NMjv&GV(&D#T|v2v$NF z3Q8n-aR`2~z1R4(8^6K_dG%+5T|mA1#}nwI`^c^_l@X1P&M)8!^jG-GX1jv&)Fd~i zhSkJDpjs}urok&L3bUJu{9q0ohGv{^YsnL*XlaZMad9%~@2IJ%t3p?gBwv%@w>5b+ zRZM5lW8x0;_7U5fL)ce1C$Nqz86q=xzASEhM+NeGP=6AAiQfwo04hiBFlNbLkVJW0 z9DRc8^~O!8$hY=s{%1E4q95SuIKhXitMRyc+kLjyaYqCWpbsxjGOd#bT_tJw_6ZAW zL|AbCMRH>xBZ5>^2H~AW=&JV*6vhP#SYl7~GlU%U`~3JXF3KSy#-Tul?}s3@VK($?)m+DSpb}YZ2jH~yu@N~92$Xon`xg^Emm|ww$DYttLc%4!@NA0D#~WK+;iK z0f1W~Cp}cWOkk!9aY;>k-`0|XWX;sR1v*|*>8IH5(?IG!Z!a&QlB1?yOULgIyJ{b7 zYiCSt&jxUJhvcfN&l}pPFfiE1Yiq}Wp=}$E26*pktrg`6-MS){wAm~-+3LXynef^y zc1!Pm>d75ja&hs}QIrkjzioH48Cef2qu#!!D^i{#obW)NSzgMbX{9TeFe7)Ww+Kn1 zR)+0Xj~$9oQG9GR^4h7yAN2IpCzUSNS)ku-G|$#c0CnE|>R;fP;pkyiOsoQ;QKLn! zo?VXR?0h@5{76V_#_fL{fU8#hL-ym@(a|_QjpVvGIoMo2Kdcy=JPYr0LC!DXV~h}a zea$*TdrY_|X8gHD+=xX@qL%U-c&G1@i|%6|o1#R{Yy(o5Ry*hN-CaJZNO$AInLMg3 zad|2;3zbd&E6S(~kJTt0=Q0uc>9lq)_kNGye<7`hJI2rc;fO$W>iqffF%xQ7L3Mu^n#C z_C8dvSrVCcUP$OJvbDou%2oC%7fh-J)_Clc8>^mPZ?cy|$(bJ$rK>I0ioLs?zC@ zCGIX9PppM*nH1_NUm5O?RL!k-(yfpE0ADxxMoIA9cj9D#K{|N)-;{0`MTOgp-AUrbmbt2OSCHGag|@hjduDZ-jvGSx*U%r|+#iRn9V3c2L~=BS%L zF~N&FM@*;>h0+XQ<;fwsDfm#T5zm{QkvWqH6iQuIWEdb{iXD|5CIrxwGCNXGjO+1~ z$77J>&&%&JJDyCd*PaP+m7VV=G%t1)S^03T`^Ej@SNZQbA~v@dRfTXPlFB8 zQFYJv?H&3UF5-(Era<9Z3@R;4@S5yuTcKWlBbn%ZC3T)F`Q-Erz`|H0?@ikb35Yq4 zDE)juMO0!h{AuMtJoCT2Y(vY4AO+;|ceKpaC=C|g$09T~Ns}=wL}S9Hd2Tw75+at>zhmBO++FbFFq5ihHx~5z63gDq`R&I4w4aYA-}m zVl3~OT{Sn$D+~mzlh{yTir?ukH!^vjO(~tu^cs=z52$9Rz^J@F6Ta*5^?&-cJGsoo zUYutNTsHSHnnccM=|CNY3v>h&oVCDth&tP_ zm90#f*(JE*25ik*r8XuFZy1pp!)>9k(Zhhr84n*cUgKYTXDacMBii?F#o#HzTVlns;m={%!@)SMB*^FmK zVr~-pzK^|i&nQhdewaB45wz=iK-jR%_9b_c3H6?Jv1L`o1WTE685^HEpTA7L*{WR$ z$f&8(T}E#}`A@0@e4|Z@icN8aQjOt*B5~BoA-F+?1(NV_@RWQ9U`n$=uuP&!0fKK6 zxl97Ftmd4Rb;_y!pHxSbiX@Z6>vQOwsMUQxQV0s{bDVHwLWP&g%SJENe(ATU04A6> zc#@ChQV9|Eg;Kwx*WyM&W^GLoqS*5;v5d8-&DAJ6OfyJxj$OOkO{dIN-L3`T zCh8OT{(AQVIrYSvKi3RyOsQ{RPNp~q63tc!T- z8AZ6pgCGxB`#MJ5O?z|&@M`N(7hVEInn9%bCxCyi>W2I=sA2rcpRqHuBQ=u$w;X%R zvV3)FXglYp=o2}fWhY$YJSOIvelx4;e!y~N{F8v(@VnSCQjs;i@FPv!>6OIEDp|Yh zYdNonWm{xyTO9Yi4SOg(zOKBlHp|Aum~%JFPDS6z`_vi_ERzwF?nPhaK|cyU<~(mX zZjAr1pTp!nz>~YSa0CAz_LJb6{`(^b2+aAKaGin27<|9XT%cd{F5ywjogU#z+=^Z} znctL1dB`YW0PO4Qc)v?A#K-&0P+Do%B>qMzwrRfV8o46ji%U5E&@1cbzR96AHgu0t zFN(V7m#)KQ*E(vRLo4L(Cd*a)jpNIB3zBL+-MDSazD(LMYk!IGmAQ?<*Jm0A+x&+%l#%j0&0@l``0Ncaq34~~ ziP3t2H(7C>!k}E&WH+(lm@nb+(wlXDO$M~$EGrhBi9Vx!CI%tT*Z<;qYIKD2!jEJ_ z`l14U@yu;3{&;Jf`4aTXiEs6Y23N`#|L3!0#)4S~r;g5=ZRO*uzFYI}dOlhemL=41XhD0Ou-26F)U#lMR zX0?GT#`XQuxsE1+RjMirD1HT=EQ=E)ExS4x zNP5B=*7oJRMB_P6$Nx&tu0^Nw`pC?%0G~2>&+@4cZ_zrd zb&BO)Ge>|Byv>_~{UVXdV%g!`9S~q@dp9XbE$UN0q^*NPO;lQWz-suz!@L3cd$Wu# zvq2qs+8J-wxW~)4nB=uPYjy(_6vct(Qnz0 zT9-wxR>k=CceQ0@s-KE5>HR>Tzsu?QKARg{@GikmyG3i^UXF%bZv67vxiLJ}>jiCZ zygBN>8L`I`;S20&wDkWm&s&j_Jz#VQTLFbxbxT9rt^Noi)b{f7@_H<>;985&MLviw z-Xz*griQwX{)l!`?h`}WbM=qVCr_-de06CoGJBir9x^||YU}Fn$fR#&+$W7fmMdPU zhQT`ueU!ev3522S0we^};NVfEh^%NCs4()``{upOjc&_5AlDBVfBPwfK`LoU{(Sz>~ zol}msG>kv<5;UkuhdtOa>N8<=eIL2V2@-PQr4)3N@>eX$8b`=wqO=Ig{W&Rgaoy1$ zCtIY7Km2gB^85SzyW*W+mcCnN_fXtU>62tyV6O9s)&fk1_2^5qVm1Pqn=VH@yYfyo zd@aenRxVQw1%tb}1qC!Uq0Sq97V|~!uO+KpoJN~%q$8CDh2~m7Al(7VB*-VozsxDd ztLgf0kFto|K|8@_TvB(YsqZWyq!y_we1XvQ@a>SQ>_aX&-Ky0QWc{tVYL9pF;no1J z&a$*<4=uY1fI%;V1C#!^cs;-nQ%djOsSVHmm*;F#))zp#0BF%=sPT_i!*Uw3+Y3%iRw+ zW>bMxUYZ=`PmkuZP8r;Bm1lq?5%%7~lRzb)qEZ9u-!ohnu1t?J7ADQZHD4w^VBkrH zEg9+!z-~?XV0Y1<3vsj$`!}PbvE(aQD;F|nBQ&|Qj{6BQkI#R?`z3Gxkro$I;>)gF zeYj!=s@tD$jnz}V(t9YG^A0{0L31p^X@m{yK zGegmnO4m#y`S8mH({%O1s(<;f?%CmDn1>0Eym;|`RcSwbh<&r4(i zc~yJ+a!L}wB2K>+WYvE35#=8__Q2$~-&)`c_HOB{I6$ZByr4Br0$4F;UtYF$Xai`a z2u4EAe0F_oiVVi47G7VXsDl&$zw4Z$bwuqafXVLS){Q|Cfu45|*+B1IWrJ}vL$S}A zqlaY{^)c9;n(i!lzavDx>4C-kYHxRq4LM`-up>dUc;FO!%0v^(i5Y5bjp5v&X_b*S ziq=qk!N3jWI9*03M;2%zRIH48k96N(I=GA+6qHe6z~!=;AZ#&~GWda{BN!#b z?V|Hqjaawa9vwZJlRlZy2_!u*vheP9BjZPFDiA~{w*sYlmN3@`K4i9{vwE!q)pH}t zlSnc_vx1<%g%(mWb%1E=mn_5c6W$J*TDY7RU_oG#kEv7?d}2UGBI!OVE!+{0eW5Bn zuVZJaEMNcY*bd@`J!WzY-G5Zl$x|#~f#-PJ_DwF%!_eaLzTin-~ecT_D*w1HP z4l9A;%?(Q1ZlvtVf6A3ER6Im`uT!Z9C@sq9q=N$&C;#{Ia)nnypn7goSGv+mYakR{ zh2SDR5nf<KNpMz?PmO%%fWp*9v<)vMCDk+?_64z~`%ZXlTi$Z*)eZeQ@Wh*}y~!x4<639> zmy~Fv>2k@-)Zp6jglwk}j`9sJHVj{Z+RE=P?OsKt$Kf5jSR`Xm=lFJ=y=srUr1V_S zyv9BAwvZ)<*Gy7P@|@dsTnTf^#m>R+m6$G(HQJlIk?`vio2lW7=A6xI6L&_X&Q5|p=`)weXaRteYY}8u)=m= zAGJwU9+>^i`1J=38W8MAT|D@{dm8u+@T=7#>|+xWr%MO5&wv%dB6<4BLOWOPOU*}VI)F2XYYj1g@$fA z3D{qTXShp0M$l~leqToY-C-22BPm3Tpuk@%e?0*@bozdH$YVEZW4+RHp^arsC?*}Y zcp@(K#5>=vx{b0|R30T=9ZAKmEEL+}*dez!@pud$P>!C{k=CG0x^1xkTLh~cAM?|| z+K_D5r;{yJ^4`fRU3^Miw%HWLKlRK;UKr|YO&d;?9HaspGU+929o|N{RntFsMxf7| z28Ol905Z0&t%mn>Zu}TH{e1PX-8s5F3t2R^19sB;W#2Eb*DE2w%G>eRL@ej0p9cm> zQx$D3!Yi8tBVSTW_On_}76vrRFmW_ebaf`F-wz44rX4$N2my)-rQe4i@u+lI4(*wVGp4i4WW{aBYrFm&+hRR z&^7H2uTo z-k%_>Nh*%jujdDR6u%71tpu(NyX7XVcDAXw#6(rB4CYXM-}UlXT`iJ6gqU_M`*@ne zjI>ShS63Hq$W}l^Bny)_VBh5sY`gi5}QRL5M~HxJG$a&J!qvQrt=IvtQW_`&jbn8>V>9?!DNtbgOC#BYL&ta!q;91v}K;Y4x|7vGKU@psUVGg)cjiHoyA)h0!5%P}(WQvX^hi0XA=lqBy_dW>m#IG(!!Jls z4=D+`ZE*C4JB3MvIjO8ao-P5b(&OBFUGBz+vda+FF zuM5L6)aM7%3Ni{7$d2aW58~=|1A_&Jfw(-A@P7Qib?+0fl5Q13NwyAqJ!WNg8tuYg6L^yA8S7XBu(yxqn@;QS_j;e?cZwj*x<2ApwEp(lV!N#*b6poxA{z z64;I-@H+;x?gI0a$JPw=R{#`_A{>tNnmn@1s!tCUnQ+&qnT=vT7%Vfg>;rE}7k#lC$IlFfA0vrLk|Qb3fkPyrKGo@eRnq)1^`&and~e zHVpFcOu+zez6^}qH=tmVW$v{CQTe_$p^*Qi>45rh<{#=@1BSzrT(ePtIpp;PcWwhC zeGyXKKo+}RQdsAYrcaD+4z?3O!NI-*_D(ETS)(~1VBP1B{0rDg!FH4OkB2-OUrRMTMC#NT+O{a0cnE6Bc z_mF%0`Wnfim8m6eoGF9vwucUu{7lMGuM*^B{_TR>TnjQ-80=7KEQxe2?nKO|XG<)o z9aD`T{}KPam$$ihGtJ$`8-}@yIXQ_J#0lQ9=zuTyBO0v<>g5>;O=1AWr1KvtsIyYV zq!Uv?@I@c$vZyDCAG=9+KPnM8{-|Hb_C6tzQbbEi3ISDk&{G;jX(j>W_+AAD)fFL8 z^6HsiICK7K>w<*9f^h5Zy$Z|i_S8c;i95sGy!5MWw=`IKN6XfFF*o^SOmOgGAe6E< z!9EDOb=`5H{#fMpLZkSyfUeD5`*R19UlA9(yb)qZ zB2fnCz8+8SB%s5>eITCh?Ka*z`Nog^&!yJxO|tX;O^ZVW1b1Q9_b4*3#bmjc4Cc!6 z=@;M&(~HM>o;R!@y&{pDDU$sORAd7NPyq*O_wU#7V8lB(QLr!^b}e@A&g&9V$x9+K z`T))LFqR(J98O;3K;nR{R9+4*!KBkik>!uWJ~H~DJKzG!VWC#0B%*bH#&!iOT?+#8?lvUvych^AOL`J9h zGJ^0|a5$0L!v5?nASJjuXaDqBRK|O6dIu7 zrmx`*U*@oLJq$>eAvP|nsXgE2nxu3V9vwnkIh;dF{;b6L&0FU`+O(B&8MdBrqu$37 z5+@*utj!|?9;gj0xa-xl4-0|wH$3sPkFCB-CdJ0?Wq)uft-Z1<0Htz0uX0Ns{D^SK z_-W)#dyrn#p^cSC6m3^Z56lv)_T{6x=lO{R*PQsz0%s=S+)~y*=E_UaR zExPuK>`GiC^CLM&{$fHU-{Ih(o+}6OnOOPr0rl)G#0ciR>1jw1@crMgSb@9uU}I;% zOZ@T;$*8BVZvqf3TM$2vC6v4<(M&Namn zuRgi5F*)kg27n%`k9MLR^(Cr)D`y;-iSO~%yCOifB=pI*X9=MxC^&f|AwgkL-(&aV zxAL(`NkcDEw6kqKJLuFHrkV0EvZln^>-3vE-W~&NNh+FoH?12oYaTkQA8Fr+qE7XRDJD}1f8eJi z;pM|xzIJ!1F@7AR=dz3j52xrJ-?`pb*JD-a;=qyr4ZaJ^i5lmJ*QHfV|MmhliDOk{7hFAlaKv@{$tc@&{zj7P`1{luDB#am;epTzM6#%^ZNfJ| zkNmzsj2^L{nG_2ZevY_rTwOvw_|;X1Uuj)R92?Di`#b!8*(vUbxxT3?Nx*JH*&nOz zZbH|&mT=`d?LPhs>zZWoQ=K+t9f=+I!ymJ`Fgaz5dlXK~Mb8KCHF4%r+X6?mXuKuH zs!|l;t3xcYs@B#Dsj%7cqn$RTz%t~A(-o-^f%MN0$8}$KioYg3_*_ptH{m71iU%Gz zl8W!bJ5dCElrUWn(LEG5f;u#qb|ov(`EZF^D>~ZOwc^A2c86x%60$KNIxLo$EAYW8ShH_sHyinvKio`$fFmV1YVKpv(r*6pM_@9{DO5 z@|H0SUd@e>(*PAZ8WowXocG?}b;3o@MK%EYED|10F}YiV^)FwR=S*IhJ=^VC1tRP( zMuvS|($2*xaCW(bMYYwzi9LkfS!y)_?4=c4=Jq{EvzWI<)pQbb=}mGrKjTT0CFRF| z7FrwE(|ja13*YgLZfHb!+HXp+VaMl3}wqGp=VsdS5k`M0iyyw>#$bMq+_gEwWDP;FOLurd) z)<(1qaOs=UV(stG=>pCseG#=Ao0|F%a$2=wVRV?eq5&h^OTSfj4#tk?CsMtyu;Iy- zPD?JB17?VUT&kizsfQbgdc^#2_%jhm!=YWXeCi^e^J%z$FG%#8G-VnJO|MV-Qhx;k zq0@Y}VU0M)G7;TeAb}*u&Aq~myxL#Jqn5L&d{f7Zf#ImffxyilyN&;j=maG`W4ruk z`)jm2C1Oj~tHGN_IE(X5nMQAxCgG4Jr1F^R1BM<1sHm!w9cu`qUq@U6a@cJ-AtzQ# zdjqzXDnzT47*}=E0_A>eAf7>WG&hnROL)CQ%FeB$bv##pY6Lpb$cYZG5-cs;Z$C5zJ^P&v2oS=f z<=+9lPE^_#X}*wU2eYam&5l;{OC!zb7@jS>kL&VzZLEFpfUV%Cn3 zccr#-a#C;*z};~om(<61Vx`~5WHV|>K*0w6COXw}^EMsn?Z|a43XGRVz4#_jCjsPU za+!4v<*~@w3;V)|=dSiv03brp%`%09I1cU-0yNGj2CQ@!$$x-eKNqk$b@BUf@s~Rb zr=eG1*xLflDOO{}t;Pwmcx~}&3>vcbMeXvlZ_8Or-7p5dI++MA=$krJO`ALIY+81$~6JB{S132z$33U5RC9s zvSwq}6;|dD3p=t`-=}9uL zM`skZp30HWp<4}3m^^SL<7W+@JapyH2vw22Ddczj0^#WSU7SGPdOfKsM(krksuE6n zASIR$CiYc-kP~ET$yQKpRt1_`iJD~ylbHycho01Qerov)}s{~u@SVorv(?e_s0yui(_&F2bP zub2JW;WSXXDasdc@=RFEd=pm(_}T; z{}BCl?)a8zV52k5Nb7J~{+m($m`=;Fdg^PVS8B6Q+J~+Qvw-k((@K;#1G=|cX5v2$1?Ob@KJ&+ zHO#J8*_#sPS>jw)#zp%9{;x8{HT(<(2owu_fYT2%!V*R6-p#vFJy3lPw2dE3rpefD zC)*tc0~bxLo?+%Mycb`TKBDQ@4Twhm_pHKTN# zUovYvHMjo4JB$sLMzdo@*@cjASEl;~J=>3Y(+GiiJ4@krfvz_Q5Y()NvAw~!k zAc{q8cbC9i0|bp%lga0&qv?g~q}xIqm!IFOJ_0CG7~&eq(hZge-h~}-5FCp2-;KsQIR{ihJH4X<<9GG_F-zUyT3TV@KBdno$oo+)8&fG?2 zOMBoA+(=RwG2u;)F0^t+Oarhvl`wc;wqFH_L-aZT!b1PCtn}Ov%cU7yjU%dz_1vc4 zL(E6KNW7>G=f(y!lPE9)4*gtcVv|l0S%Qw{cZh=Ywp5`GrL)^!Eg0G{ssaz9UVT`d zCmVqHYxFP#vgb)9yCXpG32M(My!bW1recsVWig1FJ~j-}^3M$8lgN_PK^XioJmOzO zlonLX0GyAQ@i?T6)ZAw;$)PY>{8no2dI`(kz)`rTWcW`aB=z^nuOqHGQP-DZ0r{ah zrZ|hpTizG`cg9cRC}*;P!6bk3sBa!;g1sNk`F}JgU%Yati-zuTAH%}|KSfzJnOZ5c Gum1;Ae(8k( literal 33007 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 diff --git a/src/Security/MicroRoleModel.cs b/src/Security/MicroRoleModel.cs new file mode 100644 index 0000000..ca2f030 --- /dev/null +++ b/src/Security/MicroRoleModel.cs @@ -0,0 +1,40 @@ +/* + * + * (c) Copyright Talegen, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +namespace Talegen.Common.Models.Security +{ + using System; + using System.ComponentModel.DataAnnotations; + + /// + /// This class contains the bare minimum properties to represent a role in the interface. + /// + public class MicroRoleModel + { + /// + /// Gets or sets the role identifier. + /// + /// The role identifier. + public Guid RoleId { get; set; } + + /// + /// Gets or sets the name. + /// + /// The name. + [Required] + public string Name { get; set; } + } +} \ No newline at end of file diff --git a/src/Security/MicroUserModel.cs b/src/Security/MicroUserModel.cs new file mode 100644 index 0000000..31a19eb --- /dev/null +++ b/src/Security/MicroUserModel.cs @@ -0,0 +1,69 @@ +/* + * + * (c) Copyright Talegen, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +namespace Talegen.Common.Models.Security +{ + using System; + using System.ComponentModel.DataAnnotations; + + /// + /// This class contains the bare minimum properties to represent a user in the interface. + /// + public class MicroUserModel + { + /// + /// Gets or sets the unique identity of the user. + /// + public Guid UserId { get; set; } + + /// + /// Gets or sets the user's e-mail address. + /// + [StringLength(100)] + public string Email { get; set; } + + /// + /// Gets or sets the first name. + /// + /// The first name. + [StringLength(100)] + public string FirstName { get; set; } + + /// + /// Gets or sets the last name. + /// + /// The last name. + [StringLength(100)] + public string LastName { get; set; } + + /// + /// Gets the user full name. + /// + public string FullName + { + get + { + return $"{this.FirstName} {this.LastName}".Trim(); + } + } + + /// + /// Gets or sets the user name of the user. + /// + [StringLength(100)] + public string UserName { get; set; } + } +} \ No newline at end of file diff --git a/src/Security/MinimalRoleModel.cs b/src/Security/MinimalRoleModel.cs new file mode 100644 index 0000000..05f418f --- /dev/null +++ b/src/Security/MinimalRoleModel.cs @@ -0,0 +1,60 @@ +/* + * + * (c) Copyright Talegen, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +namespace Talegen.Common.Models.Security +{ + using Newtonsoft.Json; + using Newtonsoft.Json.Converters; + + /// + /// Contains an enumerated list of role types. + /// + [JsonConverter(typeof(StringEnumConverter))] + public enum RoleTypes + { + /// + /// System Roles Cannot be Deleted. + /// + System, + + /// + /// User Defined Roles. + /// + Defined + } + + /// + /// This class represents a minimal representation of a security role. + /// + public class MinimalRoleModel : MicroRoleModel + { + /// + /// Gets or sets the role description. + /// + public string Description { get; set; } + + /// + /// Gets or sets the type of the role. + /// + /// The type of the role. + public RoleTypes RoleType { get; set; } + + /// + /// Gets or sets a value indicating whether the role is a system role and cannot be deleted. + /// + public bool Deleteable { get; set; } + } +} \ No newline at end of file diff --git a/src/Security/MinimalUserModel.cs b/src/Security/MinimalUserModel.cs new file mode 100644 index 0000000..b48db65 --- /dev/null +++ b/src/Security/MinimalUserModel.cs @@ -0,0 +1,47 @@ +/* + * + * (c) Copyright Talegen, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +namespace Talegen.Common.Models.Security +{ + using System; + + /// + /// This class represents a user that is assigned to a role. It is a stripped down version of the user and returns only essential information related to the + /// user for role associations. + /// + public class MinimalUserModel : MicroUserModel + { + /// + /// Gets or sets the user's desired language. + /// + public string Locale { get; set; } + + /// + /// Gets or sets the user's time zone. + /// + public string TimeZone { get; set; } + + /// + /// Gets a value indicating whether the user is locked. + /// + public bool Locked => this.LockExpirationDate.HasValue; + + /// + /// Gets or sets the lock expiration date. + /// + public DateTime? LockExpirationDate { get; set; } + } +} \ No newline at end of file diff --git a/src/Security/Queries/RoleQueryFilterModel.cs b/src/Security/Queries/RoleQueryFilterModel.cs new file mode 100644 index 0000000..809a9ae --- /dev/null +++ b/src/Security/Queries/RoleQueryFilterModel.cs @@ -0,0 +1,33 @@ +/* + * + * (c) Copyright Talegen, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +namespace Talegen.Common.Models.Security.Queries +{ + using Talegen.Common.Models.Shared.Queries; + + /// + /// This class defines the administration role query filter model. + /// + /// + public class RoleQueryFilterModel : PaginatedQueryRequestModel + { + /// + /// Gets or sets the search text. + /// + /// The search text. + public string SearchText { get; set; } + } +} \ No newline at end of file diff --git a/src/Security/Queries/UserQueryFilterModel.cs b/src/Security/Queries/UserQueryFilterModel.cs new file mode 100644 index 0000000..a45bcc4 --- /dev/null +++ b/src/Security/Queries/UserQueryFilterModel.cs @@ -0,0 +1,39 @@ +/* + * + * (c) Copyright Talegen, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +namespace Talegen.Common.Models.Security.Queries +{ + using Talegen.Common.Models.Shared.Queries; + + /// + /// This class defines the administration user query filter model. + /// + /// + public class UserQueryFilterModel : PaginatedQueryRequestModel + { + /// + /// Gets or sets the search text. + /// + /// The search text. + public string SearchText { get; set; } + + /// + /// Gets or sets a value indicating whether the search filter should show only active users. + /// + /// true if only active; otherwise, false and return all users. + public bool OnlyActive { get; set; } = true; + } +} \ No newline at end of file diff --git a/src/Security/RoleModel.cs b/src/Security/RoleModel.cs new file mode 100644 index 0000000..943296d --- /dev/null +++ b/src/Security/RoleModel.cs @@ -0,0 +1,63 @@ +/* + * + * (c) Copyright Talegen, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +namespace Talegen.Common.Models.Security +{ + using System; + using System.Collections.Generic; + + /// + /// This model class represents a security role within the application. + /// + public class RoleModel : MinimalRoleModel + { + /// + /// Gets or sets the record created date time. + /// + public DateTime CreatedDate { get; set; } + + /// + /// Gets or sets the user model for the creating user. + /// + public MicroUserModel CreatedBy { get; set; } + + /// + /// Gets or sets the record last updated date time. + /// + public DateTime? UpdatedDate { get; set; } + + /// + /// Gets or sets the user model for the updating user. + /// + public MicroUserModel UpdatedBy { get; set; } + + /// + /// Gets or sets a value indicating whether the role is automatically added to users when they are synchronized via the application subscription Redis channel. + /// + public bool Default { get; set; } + + /// + /// Gets or sets a list of user models assigned to this role. + /// + public List Users { get; set; } = new List(); + + /// + /// Gets or sets the claims assigned to the role. + /// + /// The claims assigned to the role. + public Dictionary Claims { get; set; } = new Dictionary(); + } +} \ No newline at end of file diff --git a/src/Security/UserModel.cs b/src/Security/UserModel.cs new file mode 100644 index 0000000..5f374fb --- /dev/null +++ b/src/Security/UserModel.cs @@ -0,0 +1,74 @@ +/* + * + * (c) Copyright Talegen, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +namespace Talegen.Common.Models.Security +{ + using System; + using System.Collections.Generic; + + /// + /// This class represents a security user within the application. + /// + public class UserModel : MinimalUserModel + { + /// + /// Gets or sets the date time when the account was created. + /// + public DateTime CreatedDate { get; set; } + + /// + /// Gets or sets the user model for the creator user. + /// + public MinimalUserModel CreatedBy { get; set; } + + /// + /// Gets or sets the date time when the account was last updated. + /// + public DateTime? UpdatedDate { get; set; } + + /// + /// Gets or sets the user model for the updating user. + /// + public MinimalUserModel UpdatedBy { get; set; } + + /// + /// Gets or sets the user notes. + /// + public string Notes { get; set; } + + /// + /// Gets or sets a value indicating whether the user account is active. + /// + public bool Active { get; set; } + + /// + /// Gets or sets a value indicating whether the user can be deleted. Typically set to true if the user model matches the current user. The current user + /// cannot delete themselves. + /// + public bool Deletable { get; set; } + + /// + /// Gets or sets a list of associated roles. + /// + public List Roles { get; set; } = new List(); + + /// + /// Gets or sets the claims. + /// + /// The claims. + public Dictionary Claims { get; set; } = new Dictionary(); + } +} \ No newline at end of file diff --git a/src/Shared/CreatedUpdaterModelBase.cs b/src/Shared/CreatedUpdaterModelBase.cs new file mode 100644 index 0000000..feb78c7 --- /dev/null +++ b/src/Shared/CreatedUpdaterModelBase.cs @@ -0,0 +1,47 @@ +/* + * + * (c) Copyright Talegen, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +namespace Talegen.Common.Shared +{ + using System; + using Talegen.Common.Models.Security; + + /// + /// This class contains basic created and updater properties for model records. + /// + public abstract class CreatedUpdaterModelBase + { + /// + /// Gets or sets the record created date time. + /// + public DateTime CreatedDate { get; set; } + + /// + /// Gets or sets the record creator model object. + /// + public MicroUserModel CreatedBy { get; set; } + + /// + /// Gets or sets the record last updated date time. + /// + public DateTime? UpdatedDate { get; set; } + + /// + /// Gets or sets the record updater model object. + /// + public MicroUserModel UpdatedBy { get; set; } + } +} \ No newline at end of file diff --git a/src/Shared/DeleteResultModelBase.cs b/src/Shared/DeleteResultModelBase.cs new file mode 100644 index 0000000..483d275 --- /dev/null +++ b/src/Shared/DeleteResultModelBase.cs @@ -0,0 +1,34 @@ +/* + * + * (c) Copyright Talegen, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +namespace Talegen.Common.Models.Shared +{ + /// + /// This abstract class defines common model properties to return during a delete action within the application. + /// + public abstract class DeleteResultModelBase + { + /// + /// Gets or sets the identity of the record that was deleted. + /// + public long Id { get; set; } + + /// + /// Gets or sets a value indicating whether the value was successful. + /// + public bool Successful { get; set; } + } +} \ No newline at end of file diff --git a/src/Shared/DisplayValuePair.cs b/src/Shared/DisplayValuePair.cs new file mode 100644 index 0000000..f0372d6 --- /dev/null +++ b/src/Shared/DisplayValuePair.cs @@ -0,0 +1,36 @@ +/* + * + * (c) Copyright Talegen, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +namespace Talegen.Common.Models.Shared +{ + /// + /// This class represents a base for displaying a name value pair combination. + /// + /// Contains the display data type. + /// Contains the value data type. + public abstract class DisplayValuePair + { + /// + /// Gets or sets the pair display value. + /// + public TDisplay Display { get; set; } + + /// + /// Gets or sets the pair value. + /// + public TValue Value { get; set; } + } +} \ No newline at end of file diff --git a/src/Shared/ErrorModel.cs b/src/Shared/ErrorModel.cs new file mode 100644 index 0000000..44099e1 --- /dev/null +++ b/src/Shared/ErrorModel.cs @@ -0,0 +1,87 @@ +/* + * + * (c) Copyright Talegen, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +namespace Talegen.Common.Models.Shared +{ + using System; + using Talegen.Common.Core.Errors; + + /// + /// This class represents an error message within the class. + /// + public class ErrorModel : IErrorMessage + { + /// + /// Initializes a new instance of the class. + /// + public ErrorModel() + : this(string.Empty, ErrorType.Warning, DateTime.UtcNow, string.Empty) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// Contains the error message text. + /// Contains the error message type. + /// Contains the date time when the error was created. + /// Contains an error stack trace message. + /// Contains the property name for validation errors. + public ErrorModel(string message, ErrorType type, DateTime eventDate, string stackTrace, string propertyName = "") + { + this.Message = message; + this.ErrorType = type; + this.PropertyName = propertyName; + this.StackTrace = stackTrace; + this.EventDate = eventDate; + } + + /// + /// Gets or sets the message error type. + /// + public ErrorCategory ErrorCategory { get; set; } + + /// + /// Gets or sets a suggested error code. + /// + public int SuggestedErrorCode { get; set; } + + /// + /// Gets or sets the error message type. + /// + public ErrorType ErrorType { get; set; } + + /// + /// Gets or sets the error message text. + /// + public string Message { get; set; } + + /// + /// Gets or sets a related property name. + /// + public string PropertyName { get; set; } + + /// + /// Gets or sets the date time when the error was generated. + /// + public DateTime EventDate { get; set; } + + /// + /// Gets or sets the error stack trace generated if any. + /// + public string StackTrace { get; set; } + } +} \ No newline at end of file diff --git a/src/Shared/ErrorResponseModel.cs b/src/Shared/ErrorResponseModel.cs new file mode 100644 index 0000000..fc706c3 --- /dev/null +++ b/src/Shared/ErrorResponseModel.cs @@ -0,0 +1,42 @@ +/* + * + * (c) Copyright Talegen, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +namespace Talegen.Common.Models.Shared +{ + using System.Collections.Generic; + + /// + /// This class is used as the Error Response Model from an application. + /// + public class ErrorResponseModel + { + /// + /// Gets the error messages. + /// + public List Messages { get; } = new List(); + + /// + /// Gets or sets the failed ids. + /// + public List FailedIds { get; set; } = new List(); + + /// + /// Gets or sets a value indicating whether this instance has unhandled exception. + /// + /// true if this instance has unhandled exception; otherwise, false. + public bool HasUnhandledException { get; set; } + } +} \ No newline at end of file diff --git a/src/Shared/LanguageModel.cs b/src/Shared/LanguageModel.cs new file mode 100644 index 0000000..1b948a5 --- /dev/null +++ b/src/Shared/LanguageModel.cs @@ -0,0 +1,34 @@ +/* + * + * (c) Copyright Talegen, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +namespace Talegen.Common.Models.Shared +{ + /// + /// This class represents a supported language definition within an application. + /// + public class LanguageModel : MinimalLanguageModel + { + /// + /// Gets or sets a value indicating whether if the language is the default for identity server. + /// + public bool Default { get; set; } + + /// + /// Gets or sets a value indicating whether if the language is active and available. + /// + public bool Active { get; set; } + } +} \ No newline at end of file diff --git a/src/Shared/MicroCreatedUpdaterModelBase.cs b/src/Shared/MicroCreatedUpdaterModelBase.cs new file mode 100644 index 0000000..2883015 --- /dev/null +++ b/src/Shared/MicroCreatedUpdaterModelBase.cs @@ -0,0 +1,47 @@ +/* + * + * (c) Copyright Talegen, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +namespace Talegen.Common.Models.Shared +{ + using System; + using Talegen.Common.Models.Security; + + /// + /// This class contains basic created and updater properties for model records. + /// + public abstract class MicroCreatedUpdaterModelBase + { + /// + /// Gets or sets the record created date time. + /// + public DateTime CreatedDate { get; set; } + + /// + /// Gets or sets the record creator model object. + /// + public MicroUserModel CreatedBy { get; set; } + + /// + /// Gets or sets the record last updated date time. + /// + public DateTime? UpdatedDate { get; set; } + + /// + /// Gets or sets the record updater model object. + /// + public MicroUserModel UpdatedBy { get; set; } + } +} \ No newline at end of file diff --git a/src/Shared/MinimalLanguageModel.cs b/src/Shared/MinimalLanguageModel.cs new file mode 100644 index 0000000..9b043d8 --- /dev/null +++ b/src/Shared/MinimalLanguageModel.cs @@ -0,0 +1,45 @@ +/* + * + * (c) Copyright Talegen, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +namespace Talegen.Common.Models.Shared +{ + using System.ComponentModel.DataAnnotations; + + /// + /// This class represents a minimal representation of a language within an application. + /// + public class MinimalLanguageModel + { + /// + /// Gets or sets the unique language locale code. + /// + [Required] + [MaxLength(5)] + public string LanguageCode { get; set; } + + /// + /// Gets or sets the name of the language. + /// + [Required] + public string Name { get; set; } + + /// + /// Gets or sets a value indicating whether [available locale]. + /// + /// true if [available locale]; otherwise, false. + public bool AvailableLocale { get; set; } + } +} \ No newline at end of file diff --git a/src/Shared/MinimalTimeZoneModel.cs b/src/Shared/MinimalTimeZoneModel.cs new file mode 100644 index 0000000..72a87d1 --- /dev/null +++ b/src/Shared/MinimalTimeZoneModel.cs @@ -0,0 +1,38 @@ +/* + * + * (c) Copyright Talegen, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +namespace Talegen.Common.Models.Shared +{ + using System.ComponentModel.DataAnnotations; + + /// + /// This class represents a minimal set of time zone model information for an application. + /// + public class MinimalTimeZoneModel + { + /// + /// Gets or sets the time zone identity value. + /// + [MaxLength(100)] + public string TimeZoneId { get; set; } + + /// + /// Gets or sets the time zone short name. + /// + [MaxLength(200)] + public string ShortName { get; set; } + } +} \ No newline at end of file diff --git a/src/Shared/Queries/PaginatedQueryRequestModel.cs b/src/Shared/Queries/PaginatedQueryRequestModel.cs new file mode 100644 index 0000000..07e3105 --- /dev/null +++ b/src/Shared/Queries/PaginatedQueryRequestModel.cs @@ -0,0 +1,86 @@ +/* + * + * (c) Copyright Talegen, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +namespace Talegen.Common.Models.Shared.Queries +{ + using System; + using Newtonsoft.Json; + using Newtonsoft.Json.Converters; + + /// + /// Contains an enumerated list of sort directions. + /// + [JsonConverter(typeof(StringEnumConverter))] + public enum SortDirection + { + /// + /// Ascending sort. + /// + Ascending, + + /// + /// Descending sort. + /// + Descending + } + + /// + /// This class contains parameters passed to the query for filtering. + /// + public class PaginatedQueryRequestModel + { + /// + /// Initializes a new instance of the class. + /// + public PaginatedQueryRequestModel() + : this(25) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// Contains the maximum page size. + /// Contains an optional current page number. + public PaginatedQueryRequestModel(int maxPageSize, int currentPage = 1) + { + this.Page = currentPage; + this.Limit = maxPageSize; + this.Sort = Array.Empty(); + this.Dir = Array.Empty(); + } + + /// + /// Gets or sets current page number. + /// + public int Page { get; set; } + + /// + /// Gets or sets the result limit. + /// + public int Limit { get; set; } + + /// + /// Gets or sets the name of the column to sort by. + /// + public string[] Sort { get; set; } + + /// + /// Gets or sets the sort direction. + /// + public SortDirection[] Dir { get; set; } + } +} \ No newline at end of file diff --git a/src/Shared/Queries/PaginatedQueryResultModel.cs b/src/Shared/Queries/PaginatedQueryResultModel.cs new file mode 100644 index 0000000..bdcaf9a --- /dev/null +++ b/src/Shared/Queries/PaginatedQueryResultModel.cs @@ -0,0 +1,40 @@ +/* + * + * (c) Copyright Talegen, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +namespace Talegen.Common.Models.Shared.Queries +{ + using System.Collections.Generic; + + /// + /// This class defines the basic query result model for the paginated query. + /// + /// The type of the query result. + public class PaginatedQueryResultModel + where TQueryModel : class + { + /// + /// Gets or sets the total records. + /// + /// The total records. + public int TotalCount { get; set; } + + /// + /// Gets or sets the results of the model query. + /// + /// The results. + public List Results { get; set; } + } +} \ No newline at end of file diff --git a/src/Shared/TenantDetailModel.cs b/src/Shared/TenantDetailModel.cs new file mode 100644 index 0000000..d75c5f1 --- /dev/null +++ b/src/Shared/TenantDetailModel.cs @@ -0,0 +1,64 @@ +/* + * + * (c) Copyright Talegen, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +namespace Vasont.Publisher.Models.Common +{ + /// + /// This class represents the basic tenant information needed for the web application. + /// + public class TenantDetailModel + { + /// + /// Gets or sets the domain key. + /// + public string DomainKey { get; set; } + + /// + /// Gets or sets the tenant name. + /// + public string Name { get; set; } + + /// + /// Gets or sets the support information about the Tenant. + /// + public string SupportInfo { get; set; } + + /// + /// Gets or sets the support contact e-mail address for the Tenant. + /// + public string SupportEmail { get; set; } + + /// + /// Gets or sets the default language to use for the tenant application. + /// + public string DefaultLanguage { get; set; } + + /// + /// Gets or sets the server's session timeout in minutes. + /// + public int SessionTimeout { get; set; } + + /// + /// Gets or sets the copyright of the tenant application. + /// + public string Copyright { get; set; } + + /// + /// Gets or sets the version of the tenant application. + /// + public string Version { get; set; } + } +} \ No newline at end of file diff --git a/src/Shared/TimeZoneModel.cs b/src/Shared/TimeZoneModel.cs new file mode 100644 index 0000000..076fd4f --- /dev/null +++ b/src/Shared/TimeZoneModel.cs @@ -0,0 +1,49 @@ +/* + * + * (c) Copyright Talegen, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +namespace Talegen.Common.Models.Shared +{ + using System.ComponentModel.DataAnnotations; + + /// + /// This class represents a timezone model within an application. + /// + /// + public class TimeZoneModel : MinimalTimeZoneModel + { + /// + /// Gets or sets the long name of the time zone. + /// + [MaxLength(300)] + public string LongName { get; set; } + + /// + /// Gets or sets the numeric time offset. + /// + [Required] + public double Offset { get; set; } + + /// + /// Gets or sets a value indicating whether if this is the default time zone. + /// + public bool Default { get; set; } + + /// + /// Gets or sets a value indicating whether the time zone is active. + /// + public bool Active { get; set; } + } +} \ No newline at end of file diff --git a/src/Talegen.Common.Models.csproj b/src/Talegen.Common.Models.csproj index 3a7368f..955016d 100644 --- a/src/Talegen.Common.Models.csproj +++ b/src/Talegen.Common.Models.csproj @@ -12,14 +12,21 @@ logo.png https://github.com/Talegen/Talegen.Common.Models git - CRM - Initial code release + Models + Added additional shared models to be used across applications. Assets\logo.ico false + 1.0.1 + + + + D:\Projects\Talegen\GitHub\Talegen.Common.Models\src\Talegen.Common.Models.xml + + diff --git a/src/Talegen.Common.Models.xml b/src/Talegen.Common.Models.xml new file mode 100644 index 0000000..c534d9b --- /dev/null +++ b/src/Talegen.Common.Models.xml @@ -0,0 +1,1295 @@ + + + + + Talegen.Common.Models + + + + + Contains a static set of common default values. + + + + + The default language code. English. + + + + + The default time zone offset. + + + + + Available common titles. + + + + + Contains an enumerated list of address types. + + + + + A home address. + + + + + A work address. + + + + + A business address. + + + + + Other type of address. + + + + + Contains an enumerated list of commerce address types + + + + + The billing address. + + + + + The mailing address. + + + + + This class represents the basic postal address for an entity. + + + + + Gets or sets the primary address street. + + The primary address street. + + + + Gets or sets the secondary address street. + + The secondary address street. + + + + Gets or sets the address city. + + The address city. + + + + Gets or sets the address state/region. + + The state of the address state/region. + + + + Gets or sets the address postal/zip code. + + The state of the address postal/zip code. + + + + Gets or sets the address country. + + The address country. + + + + Gets or sets the type. + + The type. + + + + Gets or sets the type of the commerce. + + The type of the commerce. + + + + Gets or sets a value indicating whether this is primary. + + true if primary; otherwise, false. + + + + This class represents a contact record. + + + + + Gets or sets the identifier. + + The identifier. + + + + Gets or sets the name of the primary contact name. + + The name of the primary contact name. + + + + Gets or sets the company. + + The company. + + + + Gets or sets the phone numbers. + + The phone numbers. + + + + Gets or sets the email addresses. + + The email addresses. + + + + Gets or sets the job title. + + The job title. + + + + Gets or sets the website. + + The website. + + + + Gets or sets the instant messenger. + + The instant messenger. + + + + Gets or sets the notes. + + The notes. + + + + Gets or sets a value indicating whether this is primary. + + true if primary; otherwise, false. + + + + This class represents a minimum company contact record. + + + + + Gets or sets the identifier. + + The identifier. + + + + Gets or sets the name. + + The name. + + + + Gets or sets the website. + + The website. + + + + Gets or sets the phone. + + The phone. + + + + Gets or sets the email. + + The email. + + + + Gets or sets the location. + + The location. + + + + Gets or sets a value indicating whether this is primary. + + true if primary; otherwise, false. + + + + Contains an enumerated list of gender types. + + + + + No gender specified. + + + + + Male gender. + + + + + Female gender. + + + + + Non-biological identity. + + + + + Contains an extended set of contact details. + + + + + + Gets or sets the customer identifier. + + The customer identifier. + + + + Gets or sets the nickname. + + The nickname. + + + + Gets or sets the office. + + The office. + + + + Gets or sets the profession. + + The profession. + + + + Gets or sets the name of the manager. + + The name of the manager. + + + + Gets or sets the name of the assistant. + + The name of the assistant. + + + + Gets or sets the name of the spouse partner. + + The name of the spouse partner. + + + + Gets or sets the children. + + The children. + + + + Gets or sets the birthday. + + The birthday. + + + + Gets or sets the anniversary. + + The anniversary. + + + + Gets or sets the gender. + + The gender. + + + + Gets or sets the language. + + The language. + + + + Gets or sets the time zone. + + The time zone. + + + + Gets or sets the tags. + + The tags. + + + + This class implements the minimum properties for a contact name. + + + + + Gets or sets the name of the sir. + + The name of the sir. + + + + Gets or sets the first name. + + The first name. + + + + Gets or sets the name of the middle. + + The name of the middle. + + + + Gets or sets the last name. + + The last name. + + + + Gets or sets the suffix title of the name name. + + The suffix title of the name. + + + + Gets or sets the display name. + + The display name. + + + + Gets or sets a value indicating whether this is primary. + + true if primary; otherwise, false. + + + + Contains an enumerated list of phone types. + + + + + Personal e-mail address + + + + + Work e-mail address + + + + + Support contact e-mail address + + + + + Other e-mail address + + + + + This class represents a contact e-mail address. + + + + + Gets or sets the name. + + The name. + + + + Gets or sets the email address. + + The email address. + + + + Gets or sets the type. + + The type. + + + + Converts to string. + + A that represents this instance. + + + + This class represents the bare minimum of a geographic location. + + + + + Gets or sets the latitude. + + The latitude. + + + + Gets or sets the longitude. + + The longitude. + + + + This interface defines the minimum implementation of a geographic location class. + + + + + Gets or sets the latitude. + + The latitude. + + + + Gets or sets the longitude. + + The longitude. + + + + This class represents an address location with associated geographical information and identity. + + + + + + + Gets or sets the identifier. + + The identifier. + + + + Gets or sets the latitude. + + The latitude. + + + + Gets or sets the longitude. + + The longitude. + + + + Contains an enumerated list of phone types. + + + + + Personal phone number + + + + + Mobile phone number + + + + + Work phone number + + + + + A fax number. + + + + + Other phone number + + + + + This class represents a minimum definition of a phone number. + + + + + Gets or sets the country code. + + The country code. + + + + Gets or sets the number. + + The number. + + + + Gets or sets the extension. + + The extension. + + + + Gets or sets the type. + + The type. + + + + Contains a minimal definition of a category. + + + + + Gets or sets the identifier. + + The identifier. + + + + Gets or sets the parent identifier. + + The parent identifier. + + + + Gets or sets the name. + + The name. + + + + Gets or sets the description. + + The description. + + + + Gets or sets a value indicating whether this is primary. + + true if primary; otherwise, false. + + + + This class represents a tag + + + + + Gets or sets the identifier. + + The identifier. + + + + Gets or sets the tag. + + The tag. + + + + This class contains the bare minimum properties to represent a role in the interface. + + + + + Gets or sets the role identifier. + + The role identifier. + + + + Gets or sets the name. + + The name. + + + + This class contains the bare minimum properties to represent a user in the interface. + + + + + Gets or sets the unique identity of the user. + + + + + Gets or sets the user's e-mail address. + + + + + Gets or sets the first name. + + The first name. + + + + Gets or sets the last name. + + The last name. + + + + Gets the user full name. + + + + + Gets or sets the user name of the user. + + + + + Contains an enumerated list of role types. + + + + + System Roles Cannot be Deleted. + + + + + User Defined Roles. + + + + + This class represents a minimal representation of a security role. + + + + + Gets or sets the role description. + + + + + Gets or sets the type of the role. + + The type of the role. + + + + Gets or sets a value indicating whether the role is a system role and cannot be deleted. + + + + + This class represents a user that is assigned to a role. It is a stripped down version of the user and returns only essential information related to the + user for role associations. + + + + + Gets or sets the user's desired language. + + + + + Gets or sets the user's time zone. + + + + + Gets a value indicating whether the user is locked. + + + + + Gets or sets the lock expiration date. + + + + + This class defines the administration role query filter model. + + + + + + Gets or sets the search text. + + The search text. + + + + This class defines the administration user query filter model. + + + + + + Gets or sets the search text. + + The search text. + + + + Gets or sets a value indicating whether the search filter should show only active users. + + true if only active; otherwise, false and return all users. + + + + This model class represents a security role within the application. + + + + + Gets or sets the record created date time. + + + + + Gets or sets the user model for the creating user. + + + + + Gets or sets the record last updated date time. + + + + + Gets or sets the user model for the updating user. + + + + + Gets or sets a value indicating whether the role is automatically added to users when they are synchronized via the application subscription Redis channel. + + + + + Gets or sets a list of user models assigned to this role. + + + + + Gets or sets the claims assigned to the role. + + The claims assigned to the role. + + + + This class represents a security user within the application. + + + + + Gets or sets the date time when the account was created. + + + + + Gets or sets the user model for the creator user. + + + + + Gets or sets the date time when the account was last updated. + + + + + Gets or sets the user model for the updating user. + + + + + Gets or sets the user notes. + + + + + Gets or sets a value indicating whether the user account is active. + + + + + Gets or sets a value indicating whether the user can be deleted. Typically set to true if the user model matches the current user. The current user + cannot delete themselves. + + + + + Gets or sets a list of associated roles. + + + + + Gets or sets the claims. + + The claims. + + + + This abstract class defines common model properties to return during a delete action within the application. + + + + + Gets or sets the identity of the record that was deleted. + + + + + Gets or sets a value indicating whether the value was successful. + + + + + This class represents a base for displaying a name value pair combination. + + Contains the display data type. + Contains the value data type. + + + + Gets or sets the pair display value. + + + + + Gets or sets the pair value. + + + + + This class represents an error message within the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Contains the error message text. + Contains the error message type. + Contains the date time when the error was created. + Contains an error stack trace message. + Contains the property name for validation errors. + + + + Gets or sets the message error type. + + + + + Gets or sets a suggested error code. + + + + + Gets or sets the error message type. + + + + + Gets or sets the error message text. + + + + + Gets or sets a related property name. + + + + + Gets or sets the date time when the error was generated. + + + + + Gets or sets the error stack trace generated if any. + + + + + This class is used as the Error Response Model from an application. + + + + + Gets the error messages. + + + + + Gets or sets the failed ids. + + + + + Gets or sets a value indicating whether this instance has unhandled exception. + + true if this instance has unhandled exception; otherwise, false. + + + + This class represents a supported language definition within an application. + + + + + Gets or sets a value indicating whether if the language is the default for identity server. + + + + + Gets or sets a value indicating whether if the language is active and available. + + + + + This class contains basic created and updater properties for model records. + + + + + Gets or sets the record created date time. + + + + + Gets or sets the record creator model object. + + + + + Gets or sets the record last updated date time. + + + + + Gets or sets the record updater model object. + + + + + This class represents a minimal representation of a language within an application. + + + + + Gets or sets the unique language locale code. + + + + + Gets or sets the name of the language. + + + + + Gets or sets a value indicating whether [available locale]. + + true if [available locale]; otherwise, false. + + + + This class represents a minimal set of time zone model information for an application. + + + + + Gets or sets the time zone identity value. + + + + + Gets or sets the time zone short name. + + + + + Contains an enumerated list of sort directions. + + + + + Ascending sort. + + + + + Descending sort. + + + + + This class contains parameters passed to the query for filtering. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Contains the maximum page size. + Contains an optional current page number. + + + + Gets or sets current page number. + + + + + Gets or sets the result limit. + + + + + Gets or sets the name of the column to sort by. + + + + + Gets or sets the sort direction. + + + + + This class defines the basic query result model for the paginated query. + + The type of the query result. + + + + Gets or sets the total records. + + The total records. + + + + Gets or sets the results of the model query. + + The results. + + + + This class represents a timezone model within an application. + + + + + + Gets or sets the long name of the time zone. + + + + + Gets or sets the numeric time offset. + + + + + Gets or sets a value indicating whether if this is the default time zone. + + + + + Gets or sets a value indicating whether the time zone is active. + + + + + This class represents a date range of a start date time and end date time. + + + + + + Gets or sets the start date. + + The start date. + + + + Gets or sets the end date. + + The end date. + + + + Includes the specified value. + + The value. + + + + + + Includes the specified range. + + The range. + + + + + + This interface class is used to implement a range class. + + Contains the type of data for the range. + + + + Gets or sets the start. + + The start. + + + + Gets or sets the end. + + The end. + + + + Includes the specified value. + + The value. + + + + + Includes the specified range. + + The range. + + + + + This class contains basic created and updater properties for model records. + + + + + Gets or sets the record created date time. + + + + + Gets or sets the record creator model object. + + + + + Gets or sets the record last updated date time. + + + + + Gets or sets the record updater model object. + + + + + This class represents the basic tenant information needed for the web application. + + + + + Gets or sets the domain key. + + + + + Gets or sets the tenant name. + + + + + Gets or sets the support information about the Tenant. + + + + + Gets or sets the support contact e-mail address for the Tenant. + + + + + Gets or sets the default language to use for the tenant application. + + + + + Gets or sets the server's session timeout in minutes. + + + + + Gets or sets the copyright of the tenant application. + + + + + Gets or sets the version of the tenant application. + + + + \ No newline at end of file From 88ba2088589382d4c0abe9e4b7ee346905ca7081 Mon Sep 17 00:00:00 2001 From: Rob Kennedy Date: Mon, 15 Feb 2021 23:46:57 -0500 Subject: [PATCH 2/2] updated version information --- src/Talegen.Common.Models.csproj | 3 ++- src/Talegen.Common.Models.xml | 17 +---------------- 2 files changed, 3 insertions(+), 17 deletions(-) diff --git a/src/Talegen.Common.Models.csproj b/src/Talegen.Common.Models.csproj index 955016d..04539e1 100644 --- a/src/Talegen.Common.Models.csproj +++ b/src/Talegen.Common.Models.csproj @@ -16,7 +16,8 @@ Added additional shared models to be used across applications. Assets\logo.ico false - 1.0.1 + 1.0.1.0 + en diff --git a/src/Talegen.Common.Models.xml b/src/Talegen.Common.Models.xml index c534d9b..39de743 100644 --- a/src/Talegen.Common.Models.xml +++ b/src/Talegen.Common.Models.xml @@ -1,19 +1,4 @@ - Talegen.Common.Models @@ -1292,4 +1277,4 @@ - \ No newline at end of file +