From aab16e28aa54094b0c9e7c8c24ba494ef4fa6017 Mon Sep 17 00:00:00 2001 From: yubaolee Date: Wed, 16 Dec 2015 22:52:23 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=E7=BB=93?= =?UTF-8?q?=E6=9E=84=EF=BC=8C=E5=AE=8C=E6=88=90=E5=88=86=E7=B1=BB=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CodeSmith/Application.cst | 13 +- CodeSmith/Controller.cst | 2 +- Infrastructure/ObjectHelper.cs | 4 +- OpenAuth.App/CategoryManagerApp.cs | 54 ++++- OpenAuth.App/ModuleElementManagerApp.cs | 2 + OpenAuth.Mvc/AutofacExt.cs | 10 + .../Controllers/CategoryManagerController.cs | 32 ++- OpenAuth.Mvc/Controllers/HomeController.cs | 4 +- OpenAuth.Mvc/Controllers/LoginController.cs | 2 +- .../ModuleElementManagerController.cs | 6 +- .../Controllers/ModuleManagerController.cs | 2 +- .../Controllers/OrgManagerController.cs | 2 +- .../Controllers/RoleManagerController.cs | 2 +- .../Controllers/UserManagerController.cs | 2 +- OpenAuth.Mvc/Views/CategoryManager/Add.cshtml | 225 +++++++++--------- .../Views/CategoryManager/Index.cshtml | 2 +- OpenAuth.Mvc/Web.config | 1 + 建表&初始化数据.sql | Bin 97134 -> 129830 bytes 18 files changed, 223 insertions(+), 142 deletions(-) diff --git a/CodeSmith/Application.cst b/CodeSmith/Application.cst index 0ae0fbb7..c2636ff5 100644 --- a/CodeSmith/Application.cst +++ b/CodeSmith/Application.cst @@ -53,9 +53,14 @@ namespace OpenAuth.App return _repository.Get<%=GetModelName()%>CntInOrgs(GetSubOrgIds(orgId)); } } + + public List<<%=GetModelName()%>> LoadAll() + { + return _repository.Find(null).ToList(); + } /// - /// 加载一个部门及子部门全部<%=GetModelName()%>s + /// 加载一个节点下面的一个或全部<%=GetModelName()%>s /// public dynamic Load(int orgId, int pageindex, int pagesize) { @@ -90,7 +95,7 @@ namespace OpenAuth.App } /// - /// 获取当前组织的所有下级组织 + /// 获取当前节点的所有下级节点 /// private int[] GetSubOrgIds(int orgId) { @@ -114,7 +119,9 @@ namespace OpenAuth.App public void AddOrUpdate(<%=GetModelName()%> model) { - <%=ModuleName%> <%=ModuleName.ToLower()%> = model; + <%=ModuleName%> <%=ModuleName.ToLower()%> = new <%=ModuleName%>(); + model.CopyTo(<%=ModuleName.ToLower()%>); + if (<%=ModuleName.ToLower()%>.Id == 0) { _repository.Add(<%=ModuleName.ToLower()%>); diff --git a/CodeSmith/Controller.cst b/CodeSmith/Controller.cst index b8a51bd5..ce86088b 100644 --- a/CodeSmith/Controller.cst +++ b/CodeSmith/Controller.cst @@ -35,7 +35,7 @@ namespace OpenAuth.Mvc.Controllers public <%=ModuleName%>ManagerController() { - _app = (<%=ModuleName%>ManagerApp)DependencyResolver.Current.GetService(typeof(<%=ModuleName%>ManagerApp)); + _app = AutofacExt.GetFromFac<<%=ModuleName%>ManagerApp>(); } // diff --git a/Infrastructure/ObjectHelper.cs b/Infrastructure/ObjectHelper.cs index 5f038c3b..ce708af6 100644 --- a/Infrastructure/ObjectHelper.cs +++ b/Infrastructure/ObjectHelper.cs @@ -9,7 +9,9 @@ // // Copyright (c) . All rights reserved. // -// 对象COPY/初始化帮助 +// +//对象COPY/初始化帮助,通常是防止从视图中传过来的对象属性为空,这其赋初始值 +// // *********************************************************************** using System; diff --git a/OpenAuth.App/CategoryManagerApp.cs b/OpenAuth.App/CategoryManagerApp.cs index 3cb1b1f1..32e102c1 100644 --- a/OpenAuth.App/CategoryManagerApp.cs +++ b/OpenAuth.App/CategoryManagerApp.cs @@ -1,9 +1,9 @@ - +using System; using OpenAuth.Domain; using OpenAuth.Domain.Interface; -using System; using System.Collections.Generic; using System.Linq; +using Infrastructure; namespace OpenAuth.App { @@ -31,6 +31,11 @@ namespace OpenAuth.App } } + public List LoadAll() + { + return _repository.Find(null).ToList(); + } + /// /// 加载一个部门及子部门全部Categorys /// @@ -45,11 +50,11 @@ namespace OpenAuth.App } else { - Categorys = _repository.LoadInOrgs(pageindex, pagesize,GetSubOrgIds(orgId)); + Categorys = _repository.LoadInOrgs(pageindex, pagesize, GetSubOrgIds(orgId)); total = _repository.GetCategoryCntInOrgs(orgId); } - return new + return new { total = total, list = Categorys, @@ -82,18 +87,53 @@ namespace OpenAuth.App public void AddOrUpdate(Category model) { - Category category = model; + Category category = new Category(); + model.CopyTo(category); if (category.Id == 0) { + ChangeModuleCascade(category); _repository.Add(category); } else { _repository.Update(category); } - } - + #region 私有方法 + + //修改对象的级联ID,生成类似XXX.XXX.X.XX + private void ChangeModuleCascade(Category org) + { + string cascadeId; + int currentCascadeId = 1; //当前结点的级联节点最后一位 + var sameLevels = _repository.Find(o => o.ParentId == org.ParentId && o.Id != org.Id); + foreach (var obj in sameLevels) + { + int objCascadeId = int.Parse(obj.CascadeId.Split('.').Last()); + if (currentCascadeId <= objCascadeId) currentCascadeId = objCascadeId + 1; + } + + if (org.ParentId != 0) + { + var parentOrg = _repository.FindSingle(o => o.Id == org.ParentId); + if (parentOrg != null) + { + cascadeId = parentOrg.CascadeId + "." + currentCascadeId; + } + else + { + throw new Exception("未能找到该组织的父节点信息"); + } + } + else + { + cascadeId = "0." + currentCascadeId; + } + + org.CascadeId = cascadeId; + } + + #endregion 私有方法 } } \ No newline at end of file diff --git a/OpenAuth.App/ModuleElementManagerApp.cs b/OpenAuth.App/ModuleElementManagerApp.cs index 1c4e4820..bea1ff3f 100644 --- a/OpenAuth.App/ModuleElementManagerApp.cs +++ b/OpenAuth.App/ModuleElementManagerApp.cs @@ -38,6 +38,8 @@ namespace OpenAuth.App public void AddOrUpdate(ModuleElement model) { + var newbtn = new ModuleElement(); + model.CopyTo(newbtn); if (model.Id == 0) { _repository.Add(model); diff --git a/OpenAuth.Mvc/AutofacExt.cs b/OpenAuth.Mvc/AutofacExt.cs index 0b74e57d..b018aa6f 100644 --- a/OpenAuth.Mvc/AutofacExt.cs +++ b/OpenAuth.Mvc/AutofacExt.cs @@ -40,6 +40,7 @@ namespace OpenAuth.Mvc builder.RegisterType(); builder.RegisterType(); builder.RegisterType(); + builder.RegisterType(); @@ -63,5 +64,14 @@ namespace OpenAuth.Mvc var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); } + + /// + /// ȡ + /// + /// + public static T GetFromFac() + { + return (T)DependencyResolver.Current.GetService(typeof(T)); + } } } \ No newline at end of file diff --git a/OpenAuth.Mvc/Controllers/CategoryManagerController.cs b/OpenAuth.Mvc/Controllers/CategoryManagerController.cs index f52fffed..7b1f2047 100644 --- a/OpenAuth.Mvc/Controllers/CategoryManagerController.cs +++ b/OpenAuth.Mvc/Controllers/CategoryManagerController.cs @@ -13,7 +13,7 @@ namespace OpenAuth.Mvc.Controllers public CategoryManagerController() { - _app = (CategoryManagerApp)DependencyResolver.Current.GetService(typeof(CategoryManagerApp)); + _app = AutofacExt.GetFromFac(); } // @@ -23,6 +23,28 @@ namespace OpenAuth.Mvc.Controllers return View(); } + /// + /// 加载组织下面的所有用户 + /// + public string Load(int orgId, int pageCurrent = 1, int pageSize = 30) + { + return JsonHelper.Instance.Serialize(_app.Load(orgId, pageCurrent, pageSize)); + } + + public string LoadForTree() + { + var models = _app.LoadAll(); + //添加根节点 + models.Add(new Category + { + Id = 0, + ParentId = -1, + Name = "根结点", + CascadeId = "0" + }); + return JsonHelper.Instance.Serialize(models); + } + public ActionResult Add(int id = 0) { return View(_app.Find(id)); @@ -45,14 +67,6 @@ namespace OpenAuth.Mvc.Controllers return JsonHelper.Instance.Serialize(BjuiResponse); } - /// - /// 加载组织下面的所有用户 - /// - public string Load(int orgId, int pageCurrent = 1, int pageSize = 30) - { - return JsonHelper.Instance.Serialize(_app.Load(orgId, pageCurrent, pageSize)); - } - public string Delete(int Id) { try diff --git a/OpenAuth.Mvc/Controllers/HomeController.cs b/OpenAuth.Mvc/Controllers/HomeController.cs index 32dd00ec..d77a8d3c 100644 --- a/OpenAuth.Mvc/Controllers/HomeController.cs +++ b/OpenAuth.Mvc/Controllers/HomeController.cs @@ -11,8 +11,8 @@ namespace OpenAuth.Mvc.Controllers private ModuleManagerApp _app; public HomeController() - { - _app = (ModuleManagerApp)DependencyResolver.Current.GetService(typeof(ModuleManagerApp)); + { + _app = AutofacExt.GetFromFac(); } public string GetModules(int parentId = 0) diff --git a/OpenAuth.Mvc/Controllers/LoginController.cs b/OpenAuth.Mvc/Controllers/LoginController.cs index 19a3177f..afe96676 100644 --- a/OpenAuth.Mvc/Controllers/LoginController.cs +++ b/OpenAuth.Mvc/Controllers/LoginController.cs @@ -14,7 +14,7 @@ namespace OpenAuth.Mvc.Controllers public LoginController() { - _app = (LoginApp)DependencyResolver.Current.GetService(typeof(LoginApp)); + _app = AutofacExt.GetFromFac(); } // GET: Login public ActionResult Index() diff --git a/OpenAuth.Mvc/Controllers/ModuleElementManagerController.cs b/OpenAuth.Mvc/Controllers/ModuleElementManagerController.cs index e67b1470..de08884c 100644 --- a/OpenAuth.Mvc/Controllers/ModuleElementManagerController.cs +++ b/OpenAuth.Mvc/Controllers/ModuleElementManagerController.cs @@ -32,7 +32,7 @@ namespace OpenAuth.Mvc.Controllers public ModuleElementManagerController() { - _app = (ModuleElementManagerApp) DependencyResolver.Current.GetService(typeof (ModuleElementManagerApp)); + _app = AutofacExt.GetFromFac(); } public ActionResult Index(int id = 0) @@ -46,9 +46,7 @@ namespace OpenAuth.Mvc.Controllers { try { - var newbtn = new ModuleElement(); - button.CopyTo(newbtn); - _app.AddOrUpdate(newbtn); + _app.AddOrUpdate(button); } catch (DbEntityValidationException e) { diff --git a/OpenAuth.Mvc/Controllers/ModuleManagerController.cs b/OpenAuth.Mvc/Controllers/ModuleManagerController.cs index 9715cadf..1b389aad 100644 --- a/OpenAuth.Mvc/Controllers/ModuleManagerController.cs +++ b/OpenAuth.Mvc/Controllers/ModuleManagerController.cs @@ -15,7 +15,7 @@ namespace OpenAuth.Mvc.Controllers public ModuleManagerController() { - _app = (ModuleManagerApp)DependencyResolver.Current.GetService(typeof(ModuleManagerApp)); + _app = AutofacExt.GetFromFac(); } // diff --git a/OpenAuth.Mvc/Controllers/OrgManagerController.cs b/OpenAuth.Mvc/Controllers/OrgManagerController.cs index 8201c7ac..3e05bb26 100644 --- a/OpenAuth.Mvc/Controllers/OrgManagerController.cs +++ b/OpenAuth.Mvc/Controllers/OrgManagerController.cs @@ -13,7 +13,7 @@ namespace OpenAuth.Mvc.Controllers public OrgManagerController() { - _orgApp = (OrgManagerApp)DependencyResolver.Current.GetService(typeof(OrgManagerApp)); + _orgApp = AutofacExt.GetFromFac(); } // diff --git a/OpenAuth.Mvc/Controllers/RoleManagerController.cs b/OpenAuth.Mvc/Controllers/RoleManagerController.cs index 79218a86..ab8fbabb 100644 --- a/OpenAuth.Mvc/Controllers/RoleManagerController.cs +++ b/OpenAuth.Mvc/Controllers/RoleManagerController.cs @@ -13,7 +13,7 @@ namespace OpenAuth.Mvc.Controllers public RoleManagerController() { - _app = (RoleManagerApp)DependencyResolver.Current.GetService(typeof(RoleManagerApp)); + _app = AutofacExt.GetFromFac(); } // diff --git a/OpenAuth.Mvc/Controllers/UserManagerController.cs b/OpenAuth.Mvc/Controllers/UserManagerController.cs index be88fbf8..6a6023e7 100644 --- a/OpenAuth.Mvc/Controllers/UserManagerController.cs +++ b/OpenAuth.Mvc/Controllers/UserManagerController.cs @@ -13,7 +13,7 @@ namespace OpenAuth.Mvc.Controllers public UserManagerController() { - _app = (UserManagerApp)DependencyResolver.Current.GetService(typeof(UserManagerApp)); + _app = AutofacExt.GetFromFac(); } // diff --git a/OpenAuth.Mvc/Views/CategoryManager/Add.cshtml b/OpenAuth.Mvc/Views/CategoryManager/Add.cshtml index 725bf3fb..9e12e6bf 100644 --- a/OpenAuth.Mvc/Views/CategoryManager/Add.cshtml +++ b/OpenAuth.Mvc/Views/CategoryManager/Add.cshtml @@ -1,4 +1,4 @@ -@model OpenAuth.Domain.Category +@model OpenAuth.Domain.Category @{ ViewBag.Title = "Category编辑界面"; Layout = null; @@ -8,67 +8,136 @@
- + + + + + - - - - - - - - + + + - - + + - - + + @if (Model.Id == 0) //添加 + { + + + + + } + else //编辑 + { + + + + } + + @* - - - - - + + - + *@
+ @Html.HiddenFor(m => m.Id) + @Html.HiddenFor(m => m.ParentId) +
- @Html.HiddenFor(m =>m.Id) -
- - -
- +
- - - -
    - + +
    - - + +
    + + +
      +
      + + +
      - - -
      - +
      - +
      @@ -78,66 +147,4 @@
    • - - - \ No newline at end of file + \ No newline at end of file diff --git a/OpenAuth.Mvc/Views/CategoryManager/Index.cshtml b/OpenAuth.Mvc/Views/CategoryManager/Index.cshtml index 45ae8199..7c3d652b 100644 --- a/OpenAuth.Mvc/Views/CategoryManager/Index.cshtml +++ b/OpenAuth.Mvc/Views/CategoryManager/Index.cshtml @@ -118,7 +118,7 @@ }, callback: {onClick: zTreeOnClick} }; - $.getJSON('CategoryManager/LoadModuleWithRoot', function (json) { + $.getJSON('CategoryManager/LoadForTree', function (json) { var zTreeObj = $.fn.zTree.init($('#@_treeId'), setting, json); zTreeObj.expandAll(true); }); diff --git a/OpenAuth.Mvc/Web.config b/OpenAuth.Mvc/Web.config index b16bd95b..75da5de8 100644 --- a/OpenAuth.Mvc/Web.config +++ b/OpenAuth.Mvc/Web.config @@ -47,6 +47,7 @@ service="OpenAuth.Domain.Interface.IRoleRepository,OpenAuth.Domain" /> + diff --git a/建表&初始化数据.sql b/建表&初始化数据.sql index a1e827c767b69f9a118e651746d3d53295f9339a..8dc0777c420443fef71677aa344d829d8d9caa41 100644 GIT binary patch literal 129830 zcmeHQTWnm%c|Jx98z~UTXd4xY4rhVbc1@D<#%itEo{jG^FCu!r}%xOY8xIk<_@)`K;?TgDa3 z!D4V%J%dkM!@b)W{{&v&#&^3IWkdZR4sPN9o!|+4%Q5-0fNys(-VVkYYK^z9o>>V- zF|SH+5`Ra75xknf6{Gk$gI5*&JNMxPc3`Up_ z=5Tj(4c7v*ilLwZxSYq&!+_-kVB#kv&CEK(QLcNqP$Xsf3P*cxogt~OJX~0=DG6~? zarGv6Wms|Rad4#{beT3k8>ZoF$>o$h$FVA|rdPNwLf)+en}AbPGHQ7`4SBeqn>-xD zb8Ja2@{oF95#LlHuNH#Y;Q9l(wSZ6OgBkqT5=>uz5z=j5Nzpp)nT2$o#+{3JHG|)2 z$VlGZNW9lP>jIuz$ImRTd@k{MQF&d3emb8Zv7;~>R!{yMWb`bw4t2_s(o6!+hMK#< z-0=rjPb-SO3B1TXVJ$`6k3z#twD3*{B#m+bT5VhD!RvjEGlx-DFmF;xKl7;q25Zoz z>(JDDeU0>GrH}iW%M?b~1zm4oM$51b`WcJ3tttCK84dw4n34+{C@Ks&<1{`kaYbQKjujS@^E1j?a=S^y6>0b|M_a`O@_!sj8=#73sI_$7Q!OkTisv#|WC_Kcwu zyLDE*n#DK^N?OmWXL2ob80V6jMf~nr$X8Mt=XV{?xP)u3KUhKdNmXUH&SQqxalQOM zkN-7XPpzP5)=)aozMAWJPCX&{deS>#E>O0iDLzNq_u41XTBsXMLa0t-4MUKCckz1y zzdKmrGWe7lp1PKv5MQt1n_b9W`bLyhcX8L*7Kg6`FOA?BpiTJKamAkHr`%L>|CoZz zS>@ww!n4x%3?EFcP*)zqc*N;hCE0J|`%Op$K8H_~@kuG?Fk{ji#|vL8(nen^zKeb; zwS|mXiHu1K68#w+u@YHbSf9p69*vAl`Xd+2DcFQ(I~p0AQtX)G0*y}}a5HgmVd>*{ zK5Yy(ZjAloABKK;`Fl$f2mkT*U}MO(E&apMXLmnpmN>HQcK>j+`1Q|TAGvb&%3$+R z*eCK2OCP`Ug*OHpL*i@thne3!`0w?>#!S?Q_YX&Z^C!P*{Nvj{Ul?pW+3^woaKxy~ zVB<$1V8>T|@Ps~UKJwDdl}j&NS^B$I1{*)^;(Gq^5+e)aSATe+dg~kOpEk-ELvrlY zKfFD5_5S8y^Ozl__76W-KQOYeGT_?EMDGa+-?WyEsnHTsDyF=K-AcbPHCAG(g(*V9 zH=d$ZK}+zz=C@zkxK}(qWy3Q)k1ahTqlWyp8)`3*yI}ohs0~I&hK5;uH#A#D#v(EW zxR2dm2E+pPz?qrYZbv@L?sWrug}1SP#vSzqwg1&`UWQQI4E79Hu}ipz9lvet1a4#e z{^u!U&tlE8yD1|Q2Ay(XvhIr4kmc}Pxhr1oibwW#2V+-UWZEF?iqir(f3WhwGmQ^F zEROznfghuX{It`ErH^m_<<|!rOIpwShok>pdh)I18=qVK_`Co5;TJas8%xQSlz%uA z8|vS__i^LTKHPn4uyNMjR`m~W2eV4Ps$w9F zSjc_7)pOJkL0MOGUPnGWtI+g#tT|zx_rCRM`w9$uob0t1Sz{<%VOdj9l3;xWqq2gH_&n+>+_MSha)9znUue5i_6=S!FY!S}-epDD7ATjtMeh}1)m!76MaWXs@^=to-aq>0 z?pvQ<{MlXq<2`P$q9v$*F@lBbbIrfsedMJ<#f(PlVmgdiKQPDBzM~l2ibV?vr7Ez%8M`Df9L*tgKf7NkIz3Y(inQ{ zt$*10>D#jd%}?#TY=5yf$aZ%)e&HXEXx|lKch2Z0dtXlXjEU|BN!J~I+r(Z$bdO1o z#b}T2XT~l)S*{;OoJ*o&?DevQyY$|Tytl3SYpNg25@sMhVDx)iBbsQR+;4wpKgURC zJxV({5dPlGk2_U8b>C>EFkvvh&UNUwd@_ON$Z-7*X?iQO-#ee8Y60`~IFdKV$jo!1-c?z>&i zG`Y`~JbfzxZj?8j`s<}f`6>72A^)0?Rb{k4xt|*)aoPVZd;hokx8K>?xL1to?5I2* zgvfu-hjyXp;lB-#tvW20H3gUkWu9!aB& z58@nzGCr8c`4C0&mBW%W-`Ep5)j!MQ_-jGq$;QULXBsEoD^3j8C7!~X&PR-WtHc;I zsi{#|fKIh-4F7Oe9AC^OXBEX8D@rzg)bh_)U)h$fe;jphwRWQ@+23yQWP1e0x9}5V zKPbRSRB?|wU%s;Or9C+Ru=V)WUo1U-b?@S5uYdCXQ;ngQfAfW6M5m(q%Z^X=noAeu zU;6FY@+On+jAl@V?MNC5cIgHf)^ahmA>a9?!8qh2I(ct(B6hqof)S$*75(d85Pzt+4Di)i@}Yl1g}^5{OPu z=8kD)Pca6@4Ed~f)hV?{HiF6(a>x{FS4z7|@1Z4W^6?f9w6yAE=av}J+Qg0=>CbE~ z=*RD14TNZO%_T`VF(-Y~>*$?Jrr>?l@x+o#I&sOw0}D&zME-{**Tca{zCM2*m2{Fd z%l!++5y~!kX^N2&1r%Yz+8lqw4!rO^gK#PwN_gS)Zr`C14{fu!A`@{PwnfY1fB2?Q; z#}NC@JXSP|I*Ie}Czo-usz7E1)f1ggsFYJa_F%;y;JR%@o$drXxSv%M-Haevka?`3 zH_y;?ddlic=6OB_&+;JjZox-l&Ov*Re!LY2?|fQ{-HWQ9nhkrL?DZOQN(uKiyXi`k z=1b4RlP=FVEh{?)sj@@#=^*&e#p?Cq0xxm<#y?NspTG7mUn@qW!v%)4b>bghe!6p_ z0Nuo0;Ka7U{liPKdhWQukL{uO8Mzf44X#wPG32j=d-~KS|Km_DILY?S z{gZUW&rja`sCnsy;QHX=Cn*ZzAFjwlzrOs~#y8eKZ49p5n{8Fz`YZE_(*w?hytCtY z{_zk!p<n3Kb`8s+pyJ9Zj zs_WpgD(#M2no(QgBti|9Qt{rZ1xSXO$8Sy22s_ShiH7SQV zepSg1zM9223y=*B%$U!t;r|@QxrFbg6Yidc!^IDoVV#hAY;dOXtmJ}8-itg7r!U) zy93K<88BpRz#T|D$FAPrEV)W^l^r4T4_CAfsl7Jt4F|yoZ+^3O-R>g=ud3w)t~9Tv*dj<(?xm(GuXmB zXg5owgx2?GxBjAO-YvJjG5vKnU^A?v0{U5eb1ZlokWQ;XL+}W#(pL0z6>YKPTe$`VdroD%lcJzA2y7{@>!~Fnu z0E=G5bL*ah^}}a!_HwnXi+}fm4a9M28xb=6A&v;0uV8%cE!bU&&IHd`SL|R^<}jIi z1kOWIaeUu^VD!D#O$8(#a;xvEsDAv%PKyVsZVcorf@E6{A7iXes9IdEo zd(zof>l!nHxr*K)N73{n_S9ufIG@r&XXugwICH{ugNrT*}nMTBx5_H_c zj7XeSK$cv#7n0uwmS-Bn2a_w0Hs{`@{xhFv!>suGTMsa6^Gg*^*3TXW_BVjxy%O`# zM=o@Y={zl*V?$q`BVn*>u>PZO?!IL{?+xpEeEXUGVZ4;q+EUqu2ICHSQg7vx5pHjS z(_dB^k6P7Wb+Y-l=$X`=%noa4ExEO(4omRxwf2*uTG)IiuSyvnm*JBZrU*aw3bi%k zP;>2l1IKI}%Lwh}11TNGUT6JF+^&_@lfntl1M0+&?9ytujJWHSBaI$6m=1H9WTBP( zs56K}Ub@h%l~!+V`XpMnX7S?;4x@gY;4ayVlkZAjPQyCMmoq$3YLRxfL8WyriJ{tV z^@yQg18>nILZe|VBHx%Rwf`pi!+c(1tUboeX(ipr8DsfJ<&3t=lO;_lV>-#0(gVrj zfsDp1p6(+?hJKBd&=Dg|!C_g`*^i(A8YMXf(uc9#~Q>?xKzhTN&syVv>baYv)j-CKZ$ zhK=^t7NAYV-N>HO3e=To*`!Z2>ReTOhGL}|tek0Zmynhpb7IWr@hEf>PHoF?%GxKhdxv4|MdL-?T6;-26>HDNWjEYeT6|Ldn?>g8 zGwuy<+A=qsZDb^^*}4DsKf1JFK95UayKN1uJ-YCdO1!(rdvAH6a{bAP6A*Sg+kVt2HYsu+%CAkH2- ztoCUjKkz($j;n4y`aHeCJcZAOSsv7I8GD?opzv)_1!YFBl&NKY10%^eX?RTQ54DVu z_E7mH75>*z?Zb2b4%DtJpU|#D6se|x-T-BvDCs7}j&{$X4x?RPDe^iYM%;&Cdaczx ztMm6!8Q-awUQ|x|(8odd->BXi-~2h^7DehoB=)A=18Eezd{_0lkUkphRYp#jQ#NzB zU(zUao88@rGT6WB*J7P}XU8Y=#ZKIk@DEp-mx|XTDqmb_&FmkBo@pF>xbndzh}+0#XA|#CDy_xDENo1;+&7?4omiV7XD$VNN4N1!;x)I`0G3U_|+f2TfA`xo8zrQzM=h*>_r>7@T9Sf4%5HWHAw}`E=19Iz<7fK}Nc-NB zna<0`5wwWq<6%iLW#ThW}&M!L1T zzQ>^!KLgUvCXM!#&z8Sy>N|BfUXtuXg#aVXucXNz1NemTZ*A zy34U;Wrf}0{3h}*S)tFTZzV#a^E%SifARXF z?5DWJkF9FcftDicxYkrJRqL0Qu;j8 zsME>j^Mv8%!t1#VtcVpQ_I}*&$>Oyv0>3o4ZJj`>-DO zx_DN%ep1?+v-wH%k?0%GVsDl!EIp;?)k#A`ILAx&)*1gTJ*Bt@ue}QLbg?}pTMp_~ zmA=w3@Ifs&2l+4u`X^lM`oIyyZtR*riKxY)SBZFne6jl7aB>4BYKUHh_=j?aUME{@C z>zaq1S$bW!5ap0w8*{L{ud7oLkEYiZm8fyA;ppv86|4J*TMWf@oqzUXG4>PP;z?^l z|FBc6{t0fe6t&a*!&Y&shuvbzwu}A4Qc+?~u5rW;hRjpmM$FUpynW~~SFDJWTTE$x zO*}t;apiw5#o^$|Uu!~g`-+GsTR!!ci5|s0qY+suij(f^y{b5B!|3V|TVtBfjD*&o zg=InXQ%!lvRle=(JXzz(j41I>?OG92$tT}Q%};tw$kBnC>7TFbH0;{w&tCt}ubB$j zPBoD>073et8=%bP79{JS#M7Y4F{OWw22F<7 z$!a&-#?4m;aaWTT*)IMImrpA##4{zi%X%~*YOm5IG%p4hTTq+<6f5BI8elkmM4-sk zxrAOFm7QCl#arO>RRza!Wd}__-;5|del(~tyv`Y{mi1`N$#%!*Q-JM0o>K*<@3vrD z0bEbxhni@lfHXRcSw9i6+{5c!#;PT6!yROK)-F9Fo(W0`Iu5yc5)hpNWJ$G0gJ$hj zx};OX4V4x&#{kU=;8|CYJsQxoS9v(l9Bn~!9Qx=a=#soYbwp^>Ky%co3^mUgYe91Y zG+9-467Bh;Mw|3Z@|K%5#F=g==us|<#YsD93{a#Nn)C{aGF#%cQv@kV54q7g26~I| zf~a?NtYZ`qoCI$ZmVW8-Y%olU!kIO?q{9X1ZDw=|Es_oy-=NLum+tNzj(UYIp~(G( z+khPHAZG3{n#rge{h-tMoRZm}XlC!Q46lWo60(bc=?dVu4WH7@*2% zwqIJjcgTje-;1q>sYuG~KcChAcV1 z3QFZ^4hN8`vS&n(h>?)ffGYh>pJYLrc2Ckw;T7i3{e&X-gBg2&Rq=q>N~54l`js_M zW)0k5bT~%W=mwIceQhZ*u1Q;N8ju_TRTdqBdTnkXw*cLCM@hv|P#rxT?*EKI8x;v| zN%Bxu<_c=23Xq&U3do%Xt&IY1lb-GCrb)kK*qQaYf#4$Ss-2c^LwlS&JE1HdzxHu^ zfu3HQ8_03*=&QmG2Ir`lbke8%~hn+p7=bA>FNqnx?mLCo3*$`TGR;5618jvIHodS3J!P$Dg zY0zW$-RM4;y*@V()Ot*yHv@S%4%x_zD?hk5JM`kahluy*0T3~e3uwelnP zA}bUhu6EJ0BrV#|HQI#`C1uiz^dlcb&pC~|lVoFbjc({v&V4a3r1v+XA~>`qi=vU)F$kViKAn+tdQ)gGy|Dyp< zy}~?clRfAemEA>jR_sR`YlP(_U?>r?NzkYtdp68GvFF{JytKJ6Z|V%sk8qTFJb~ya zU@BG-BN={BXL!cFKvegd$!q^0ieKTyFbV8mipyW=&KbR9Z}^9-c25mO_M}-Rn>w%IxVnD3!TE ze(XAQ%k@cgYOm8R=TpNoig^Q?Um$uC5T%#NOd&sN%<_P!z0Td-vwov9BqUksr+ZTg zWG5A+a;JjOEh6_P+4uH3cR)+}?4mq1zjPYr8L8SbWv=Be;4Aq9q}3`U>NI|sMc@l; z!}I2>y3G?b>&#zYg=a?^<*p|)GbG!sqF^}%TIG(0Kh}PD-n~H8taB~r{C`S<@chEE zfbS}x)Kkz_%v@)sUoolGA6a0$DQ2yo0$e9lJ>!=U(WP zwdVXGt@`5ygy)?G&1CyZuX7LF=T=kAt4xJm*jWNoW_nCP4=^9wA0MDQn5ISZ&6@2U z^23HSEv*?ySXQI^;~R7b=_Km4p}P$$C|}D!d}L==Q?$rvKI16GqRAv^+ADO$)6vKt>v_eiXV$PE`^N_F zz0jn+LRV0XM-GG{*)NKDO01dmV;?y?ER%Fhe4TQ-b6$3*?0FJ)lq6<1nRWp`9Z_&( z$0+J=KX#O5&S{jH1kLyw^P^7#NxknP@MBFhBTVcVclha*xq#X^#E$ei69T!D zN-nbV+lVI-q~0NCug(SZM9QqIswl&|>`q4bjVX!fgMQ8i!6e-rU7>3zYFZasJOxNr z@WY6PAF-iqkW7+-HYD{bT|jdd`s6%fn#-um7btT7Qfe(2%PtZ<#&<65)wzOR6&W@A zkc;e)xdS*#Y<&c}gi&=yD45w^Bsj+NVF}0hI`i~mgi}a?v#lKpP4z;R+@)Y|OsOd^ z4m6W^JGw#_lxf@d0>PS+ja9&qo=kBdczD_Eh6Z*1w?K}$2dqhorJ8?y^lksDrF4iK!`( zotqf%o>7qW!-t8_n>EGkk3uY)tf87Zd13)o$4z`XiyUZnsW<)jntkLF2FDrP_SMEQl4Kcb zuh|U`3CD+XNcb7+6qxzRtUF3S-|)lv7#}$f$s|k7Wgdx*b;3`3U;<0-Q`HfFV2@ru zc3SND_5w@2K6g}k3D)i=AW2%B2Gm&b#U9-Lc_+QVPgds+dUocDz>u9L8AoB)PXGLc zUSMdi(H$i1ybBXgWX}Q0M@k<5?D#ZjCh3{zI^99k&cPsUlBc;xz@G4o_Hp(PyH8y= z@-b;Y+FqkuNZMH#0!^OM#@q<*y!dDR_ClNPvrTM#6N=i~)Ot=JE1eYS!}E;WqS0xR zO%z?HJ6etApD-hjkt_CSV#QX`pqa$=_8Q$m(w5YuPod2TNKfX`vuC9r8Q(TfrEz@{ zZARD0$h|wLUdHIFD$_#8#98sia|#%#^CJhmUx?akbO%Z8u{N*=E3`=s&kA@(to`UJ z&gp282$(D6ZLM(5lMr|UJkg`{1V$t<5~ zK$2%>_>mc&2ORUR&Wz59^k`E)-?L7Jz0bL)!F-=0(&WSCaJw2*Aj)nQta#;Vf_`K^ zL@6PS%ab5#uQUISOwkzHqM<$sg zpTaI0H(PNzQ%O(Ql4fZqv1dQ`r2UZt_Po=fI~0SiS!dq*$(|WuxCjW}0gMHnB2{TM zF;}{%@QhQdUZrbjYR;0HSVou_Ut(tvMv{vO&m_5O*6A9eM)wPaO8z;yo%tw72cl-3 z+gMdz86wG2)Wi$~rmT!$#sT|=_z@L}&pS}$)eH_Qt1!`qL}I}Msi64hR(d-}BH zw?LIuqwF!l>K;G*{_dd~uMoG_>6T7yD?=d4So1jeotnxIzrTBk#%smxb-INpPtei* zNCcwnxJU|R*Kj}l{ca(eq?_z@-p$dPiq4HN)X$>q7MQYLoLOP)XW&ORQ*_>G(zFvy IlXcYp1OEUkhyVZp delta 4858 zcmb7He@xV67=It-@Ir@Q!I%o>neJrkg0F~hyD>e{m~)N@l{Re*fBz^G5Kto&k#OR# z>t5~AbPmjbnj`ecGo$k`qjJriKW14;v^i_7oVG^T>elmp50LujeZRZyd;8u#pXb;6 zd7k&Vrrr_vdo7+6{=0oX+FpSe-jr#dq%$W=Wob-j)7eaBqi>zL=zRt~XRr)Deb|#; zXUM=?eRrelY^sE!?L??ZE*PysIO|+s;kwhx!}%$^!D2j=IjJ5 z-a%0=V|i>j+f1J=Y!fTxa~>sH7O~ZAE5BAdksn{AaqlPNcfeNTWi{Wpnw?#Z$PpZ`R|$R_)6{-2OjA4LzRl=yG|jOVfSR?G9Ol&$5R)u|&h*gTeQM9F6I zhkK{-wwgX)ag{TAB%P$lcL;5GKHJ0_tDYT`*?;y1&CtMfgX(LmNr)QJPvRf!N;Ew2 z>$}o<&)yjNJ(E30wTSrmYjoy-aq*qbCwIsH5AP(?a|ZCfuDZJx-f&b`(T3Og1wpO6 zBKax)z?p#^G2lhdNT}hV7e`@RD(N_Bw#&EgxIRV2obSQKvLuV4fl^;%-!kxBzH?+M z9tf*eWL&r!;wGjI(Nc1G=8DG3=(0g|@y6TZ@%3aF>o0V`3Ghcb zAUE1@myHcNMDYnr99Xm#9GJZZ=F1|$H)~<8(TXm#uZ1=f@X~c~)&xAb9@hln(4ow6VeEBSjJ8^c!O%K- zG?c*t6Kqc-4bA#;6KCN zmJo1v6$F$M_*)s-fAC~I8pAu(x^5+UHj-HAc2jE7e)xeJHTkZ@;ODRg^)+C{qBkfk zy%w@%`S@wnOavLq7)aYN_XkpK#C$a=u&EAmRES&N3PAo4Ue9h=sKOKJk3;vx0k75d zprPj=#G-o-IMqx9I$?XnH?i|&9RI_5m?E!6$$scBw#`fXfOWsTef`9lq-1$D7Vm~t zC@kCezyv&TP$5|nl1Nq%b1sq2dOhHhWsHJY9Hg%8>7-FqwilLS@DQmd%_~=r!4~nx zVGLIgwQy$i0IzjV!0=6=1=S02*mX!jN`quPc^Fb>5vAdH_BK=c1sRnPj zK^La&C&(#%*IiKz5jg-JogN@G$8KN@y?2f5N}K6aLI0aiqu mCEQUUiloAK6vh&{P#8