From 81c1b96590f8978bea73ee19fca9e45008ea6cfb Mon Sep 17 00:00:00 2001
From: lwh <2679599887@qq.com>
Date: Sun, 30 Apr 2023 00:36:12 +0800
Subject: [PATCH] =?UTF-8?q?fix:=20=E6=B7=BB=E5=8A=A0=E6=B5=B7=E6=8A=A5?=
=?UTF-8?q?=E7=AE=A1=E7=90=86=EF=BC=8C=E4=BF=AE=E6=94=B9=E5=90=8E=E5=8F=B0?=
=?UTF-8?q?=E7=BB=86=E8=8A=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/admin/controller/Banner/Banner.php | 2 +-
app/admin/controller/Poster/Poster.php | 110 ++++++++++++++++++
.../Subject.php} | 9 +-
.../Teacher.php | 9 +-
.../controller/TeachersStrength/Subject.php | 43 +++++++
.../Teachers.php | 6 +-
app/api/controller/subject/subject.php | 64 ----------
app/common/model/Banner/Banner.php | 6 +-
app/common/model/Poster/Poster.php | 95 +++++++++++++++
.../Subject.php} | 19 +--
.../Teacher.php | 25 ++--
.../excel/师资力量/授课科目导入模板 (1).xlsx | Bin 0 -> 9030 bytes
public/excel/师资力量/教师导入模板.xlsx | Bin 0 -> 9186 bytes
13 files changed, 295 insertions(+), 93 deletions(-)
create mode 100644 app/admin/controller/Poster/Poster.php
rename app/admin/controller/{Teachers_strength/subject.php => TeachersStrength/Subject.php} (94%)
rename app/admin/controller/{Teachers_strength => TeachersStrength}/Teacher.php (93%)
create mode 100644 app/api/controller/TeachersStrength/Subject.php
rename app/api/controller/{Teachers => TeachersStrength}/Teachers.php (91%)
delete mode 100644 app/api/controller/subject/subject.php
create mode 100644 app/common/model/Poster/Poster.php
rename app/common/model/{Teachers_strength/subject.php => TeachersStrength/Subject.php} (89%)
rename app/common/model/{Teachers_strength => TeachersStrength}/Teacher.php (87%)
create mode 100644 public/excel/师资力量/授课科目导入模板 (1).xlsx
create mode 100644 public/excel/师资力量/教师导入模板.xlsx
diff --git a/app/admin/controller/Banner/Banner.php b/app/admin/controller/Banner/Banner.php
index 423af54..b56729b 100644
--- a/app/admin/controller/Banner/Banner.php
+++ b/app/admin/controller/Banner/Banner.php
@@ -22,7 +22,7 @@ class Banner extends BaseController
*/
public function getBannerList(Request $request): array
{
- $con = Tool::getOptionalQuery(['banner_location', '='],);
+ $con = Tool::getOptionalQuery();
$query = ModelBanner::where($con)
->field([
diff --git a/app/admin/controller/Poster/Poster.php b/app/admin/controller/Poster/Poster.php
new file mode 100644
index 0000000..94c2450
--- /dev/null
+++ b/app/admin/controller/Poster/Poster.php
@@ -0,0 +1,110 @@
+param();
+ $con = Tool::getOptionalQuery(['poster_location', '='],);
+
+ $query = ModelPoster::where($con)
+ ->field([
+ 'poster_id',
+ 'poster_guid',
+ 'poster_location',
+ 'poster_img',
+ 'poster_title',
+ 'poster_describe',
+ 'poster_sort'
+ ])
+ ->order('poster_update_time', 'desc');
+
+ return msg("获取海报列表成功!", $query);
+ }
+
+ /**
+ * 编辑海报
+ */
+ public function editPoster(Request $request): array
+ {
+ $params = $request->param();
+ $this->validate($params, [
+ 'poster_location|位置' => 'require',
+ 'poster_img|图片' => 'require',
+ 'poster_title|标题' => 'require',
+ 'poster_describe|描述' => 'require',
+ 'poster_sort|排序' => 'require'
+ ]);
+ $model = ModelPoster::where('poster_guid', $params['poster_guid'])->find();
+ if (!$model) throwErrorMsg("该海报不存在", 1);
+ $model->allowField([
+ 'poster_update_user_guid',
+ 'poster_location',
+ 'poster_img',
+ 'poster_title',
+ 'poster_describe',
+ 'poster_sort'
+ ])->save($params);
+ return msg('编辑成功!');
+ }
+
+ /**
+ * 添加海报
+ */
+ public function addPoster(Request $request): array
+ {
+ $params = $request->param();
+ $this->validate($params, [
+ 'poster_location|位置' => 'require',
+ 'poster_img|图片' => 'require',
+ 'poster_title|标题' => 'require',
+ 'poster_describe|描述' => 'require',
+ 'poster_sort|排序' => 'require'
+ ]);
+ $model = ModelPoster::create($params, [
+ 'poster_guid',
+ 'poster_create_user_guid',
+ 'poster_update_user_guid',
+ 'poster_location',
+ 'poster_img',
+ 'poster_title',
+ 'poster_describe',
+ 'poster_sort'
+ ]);
+ return msg('添加成功!');
+ }
+
+ /**
+ * 删除海报
+ */
+ public function deletePoster(Request $request): array
+ {
+ $params = $request->param();
+ $this->validate($params, [
+ 'poster_guid' => 'require',
+ ]);
+ $poster = ModelPoster::where([
+ 'poster_guid' => explode(',', $params['poster_guid'])
+ ])->select();
+ $poster->delete();
+ return msg('删除成功!');
+ }
+}
diff --git a/app/admin/controller/Teachers_strength/subject.php b/app/admin/controller/TeachersStrength/Subject.php
similarity index 94%
rename from app/admin/controller/Teachers_strength/subject.php
rename to app/admin/controller/TeachersStrength/Subject.php
index f7bf169..f3ce24c 100644
--- a/app/admin/controller/Teachers_strength/subject.php
+++ b/app/admin/controller/TeachersStrength/Subject.php
@@ -1,9 +1,9 @@
param();
- $data = array_values(ModelSubject::EXCELFIELD);
+ $data = [
+ array_values(ModelSubject::EXCELFIELD),
+ ['管理组', '1']
+ ];
$excel = (new Excel())->exporTsheet($data);
$excel->save('授课科目导入模板.xlsx');
}
diff --git a/app/admin/controller/Teachers_strength/Teacher.php b/app/admin/controller/TeachersStrength/Teacher.php
similarity index 93%
rename from app/admin/controller/Teachers_strength/Teacher.php
rename to app/admin/controller/TeachersStrength/Teacher.php
index 1de1d8e..aacab41 100644
--- a/app/admin/controller/Teachers_strength/Teacher.php
+++ b/app/admin/controller/TeachersStrength/Teacher.php
@@ -1,9 +1,9 @@
param();
- $data = array_values(ModelTeacher::EXCELFIELD);
+ $data = [
+ array_values(ModelTeacher::EXCELFIELD),
+ ['管理组', '黎老师', '执行董事', '毕业于西南交大建筑与设计学院 高考美术教育13年', "1"]
+ ];
$excel = (new Excel())->exporTsheet($data);
$excel->save('教师导入模板.xlsx');
}
diff --git a/app/api/controller/TeachersStrength/Subject.php b/app/api/controller/TeachersStrength/Subject.php
new file mode 100644
index 0000000..f73a2b3
--- /dev/null
+++ b/app/api/controller/TeachersStrength/Subject.php
@@ -0,0 +1,43 @@
+param();
+ $con = [];
+
+ $query = ModelSubject::where($con)
+ ->field([
+ 'subject_id',
+ 'subject_guid',
+ 'subject_name',
+ 'subject_sort'
+ ])
+ ->order('subject_sort', 'asc');
+
+ return msg(0, "获取授课科目列表成功!", [
+ 'data' => $query,
+ 'count' => count($query)
+ ]);
+ }
+
+}
diff --git a/app/api/controller/Teachers/Teachers.php b/app/api/controller/TeachersStrength/Teachers.php
similarity index 91%
rename from app/api/controller/Teachers/Teachers.php
rename to app/api/controller/TeachersStrength/Teachers.php
index 2a19e29..1d9c06d 100644
--- a/app/api/controller/Teachers/Teachers.php
+++ b/app/api/controller/TeachersStrength/Teachers.php
@@ -1,9 +1,9 @@
param();
$con = [];
- $con = Tool::getOptionalQuery(['teacher_name', 'LIKE'], ['teacher_position', '='], ['subject_guid', '='],);
+ $con = Tool::getOptionalQuery(['teacher_name', 'LIKE'], ['subject_guid', '='],);
$query = ModelTeachers::where($con)
->field([
diff --git a/app/api/controller/subject/subject.php b/app/api/controller/subject/subject.php
deleted file mode 100644
index 730c2a9..0000000
--- a/app/api/controller/subject/subject.php
+++ /dev/null
@@ -1,64 +0,0 @@
-param();
- $con = [];
-
- $con = Tool::getOptionalQuery(['subject_name', 'LIKE'], ['subject_sort', '='],);
-
- $query = ModelSubject::where($con)
- ->field([
- 'subject_id',
- 'subject_guid',
- 'subject_name',
- 'subject_sort'
- ])
- ->order('subject_sort', 'asc');
-
-
-
- return msg("获取授课科目列表成功!", $query);
- }
-
- /**
- * 获取授课科目详情
- */
- public function getSubjectInfo(Request $request): array
- {
- $params = $request->param();
-
- $this->validate($params, ['subject_guid' => 'require']);
-
- $find = ModelSubject::field([
- 'subject_id',
- 'subject_guid',
- 'subject_name',
- 'subject_sort'
- ])
- ->where('subject_guid', $params['subject_guid'])
- ->find();
-
- return msg(0, '获取授课科目详情成功!', ['data' => $find]);
- }
-}
diff --git a/app/common/model/Banner/Banner.php b/app/common/model/Banner/Banner.php
index 25cf7b5..be4df8f 100644
--- a/app/common/model/Banner/Banner.php
+++ b/app/common/model/Banner/Banner.php
@@ -50,7 +50,7 @@ class Banner extends BaseModel
*/
public static function onBeforeInsert(self $model): void
{
- Tool::sortInsertProc(self::class, $model->banner_order, ['banner_location' => $model->banner_location]);
+ Tool::sortInsertProc(self::class, $model->banner_order);
$model->completeCreateField();
}
@@ -59,7 +59,7 @@ class Banner extends BaseModel
*/
public static function onBeforeUpdate(self $model): void
{
- Tool::sortEditProc(self::class, $model->banner_guid, $model->banner_order, ['banner_location' => $model->banner_location]);
+ Tool::sortEditProc(self::class, $model->banner_guid, $model->banner_order);
$model->completeUpdateField();
}
@@ -68,7 +68,7 @@ class Banner extends BaseModel
*/
public static function onBeforeDelete(self $model): void
{
- Tool::sortDeleteProc(self::class, $model->banner_guid, ["banner_location"]);
+ Tool::sortDeleteProc(self::class, $model->banner_guid);
$model->completeDeleteField();
}
}
diff --git a/app/common/model/Poster/Poster.php b/app/common/model/Poster/Poster.php
new file mode 100644
index 0000000..142c436
--- /dev/null
+++ b/app/common/model/Poster/Poster.php
@@ -0,0 +1,95 @@
+ "int",
+
+ "poster_guid" => "string",
+
+ "poster_location" => "string",
+
+ "poster_img" => "string",
+
+ "poster_title" => "string",
+
+ "poster_describe" => "string",
+
+ "poster_sort" => "string",
+
+ "poster_create_time" => "datetime",
+
+ "poster_create_user_guid" => "string",
+
+ "poster_update_time" => "datetime",
+
+ "poster_update_user_guid" => "string",
+
+ "poster_delete_time" => "datetime",
+
+ "poster_delete_user_guid" => "string",
+
+ ];
+ // 设置json类型字段
+ protected $json = [''];
+ // 开启自动写入时间戳字段
+ protected $autoWriteTimestamp = 'datetime';
+ // 创建时间
+ protected $createTime = 'poster_create_time';
+ // 修改时间
+ protected $updateTime = 'poster_update_time';
+
+
+
+ //排序字段
+ public $order_field = 'poster_sort';
+
+ /**
+ * 新增前
+ */
+ public static function onBeforeInsert(self $model): void
+ {
+ Validate::unique(self::class, $model->subject_guid, $model->getData(), [
+ 'poster_location' => '海报位置',
+ ]);
+ Tool::sortInsertProc(self::class, $model->poster_sort);
+ $model->completeCreateField();
+ }
+
+ /**
+ * 更新前
+ */
+ public static function onBeforeUpdate(self $model): void
+ {
+ Tool::sortEditProc(self::class, $model->poster_guid, $model->poster_sort);
+ $model->completeUpdateField();
+ }
+
+ /**
+ * 删除前
+ */
+ public static function onBeforeDelete(self $model): void
+ {
+ Tool::sortDeleteProc(self::class, $model->poster_guid);
+ $model->completeDeleteField();
+ }
+}
diff --git a/app/common/model/Teachers_strength/subject.php b/app/common/model/TeachersStrength/Subject.php
similarity index 89%
rename from app/common/model/Teachers_strength/subject.php
rename to app/common/model/TeachersStrength/Subject.php
index 2eb4861..d6af7c1 100644
--- a/app/common/model/Teachers_strength/subject.php
+++ b/app/common/model/TeachersStrength/Subject.php
@@ -1,6 +1,6 @@
'排序',
];
-//排序字段
-public $order_field = 'subject_sort';
+ //排序字段
+ public $order_field = 'subject_sort';
/**
* 新增前
@@ -68,10 +68,12 @@ public $order_field = 'subject_sort';
public static function onBeforeInsert(self $model): void
{
// self::checkRepeatData($model);
+ Validate::unique(self::class, $model->subject_guid, $model->getData(), [
+ 'subject_name' => '科目名字',
+ ]);
Tool::sortInsertProc(
self::class,
$model->subject_sort,
-
);
$model->completeCreateField();
}
@@ -81,13 +83,14 @@ public $order_field = 'subject_sort';
*/
public static function onBeforeUpdate(self $model): void
{
-
- // self::checkRepeatData($model);
+ Validate::unique(self::class, $model->subject_guid, $model->getData(), [
+ 'subject_name' => '科目名字',
+ ]);
Tool::sortEditProc(
self::class,
$model->subject_guid,
$model->subject_sort,
-
+
);
$model->completeUpdateField();
}
@@ -141,7 +144,7 @@ public $order_field = 'subject_sort';
foreach ($data as $line => $value) {
try {
$model = self::importExcelInit($value);
- $msg[] = "{$line} 新增成功!
";
+ $msg[] = "{$line} {$value->subject_name}新增成功!
";
} catch (\Throwable $th) {
$msg[] = "{$line} {$th->getMessage()}
";
}
diff --git a/app/common/model/Teachers_strength/Teacher.php b/app/common/model/TeachersStrength/Teacher.php
similarity index 87%
rename from app/common/model/Teachers_strength/Teacher.php
rename to app/common/model/TeachersStrength/Teacher.php
index ac7cabc..0d34e33 100644
--- a/app/common/model/Teachers_strength/Teacher.php
+++ b/app/common/model/TeachersStrength/Teacher.php
@@ -1,6 +1,6 @@
'授教科目',
'teacher_name' => '教师名称',
'teacher_position' => '教师职位',
- 'teacher_img' => '教师图片',
- 'subject_guid' => '授课科目',
'teacher_intro' => '教师简介',
'teacher_order' => '教师排序',
];
@@ -117,6 +117,7 @@ class Teacher extends BaseModel
public static function exportExcel($select)
{
$data = [[
+ '授教科目',
'教师名称',
'教师职位',
'教师图片',
@@ -126,6 +127,7 @@ class Teacher extends BaseModel
]];
foreach ($select as $key => $val) {
$data[] = [
+ $val['subject_name'],
$val['teacher_name'],
$val['teacher_position'],
Excel::ExportImgFiled($val['teacher_img']),
@@ -159,7 +161,7 @@ class Teacher extends BaseModel
foreach ($data as $line => $value) {
try {
$model = self::importExcelInit($value);
- $msg[] = "{$line} 新增成功!
";
+ $msg[] = "{$line} 【{$model->subject_name}】{$model->teacher_name}新增成功!
";
} catch (\Throwable $th) {
$msg[] = "{$line} {$th->getMessage()}
";
}
@@ -177,19 +179,26 @@ class Teacher extends BaseModel
*/
public static function importExcelInit($value)
{
+ $subject_name = $value['subject_name'];
$teacher_name = $value['teacher_name'];
$teacher_position = $value['teacher_position'];
- $teacher_img = $value['teacher_img'];
- $subject_guid = $value['subject_guid'];
$teacher_intro = $value['teacher_intro'];
$teacher_order = $value['teacher_order'];
- return self::create([
+
+ // 授教科目
+ $subject = ModelSubject::where('subject_name',$subject_name)->find();
+ if(!$subject) throwErrorMsg($subject_name . " 授教科目不存在!");
+ else $subject_guid = $subject->subject_guid;
+
+ $model = self::create([
'teacher_name' => $teacher_name,
'teacher_position' => $teacher_position,
- 'teacher_img' => $teacher_img,
'subject_guid' => $subject_guid,
'teacher_intro' => $teacher_intro,
'teacher_order' => $teacher_order,
]);
+
+ $model['subject_name'] = $subject->subject_name;
+ return $model;
}
}
diff --git a/public/excel/师资力量/授课科目导入模板 (1).xlsx b/public/excel/师资力量/授课科目导入模板 (1).xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..895eaefc5e79d59d2963cf5c93abe963fdb4addb
GIT binary patch
literal 9030
zcmaJ{1ymf%(nf-Nf(3VXcX!v|1b1hV;IPP|!Gi>M0)*fpI0Ov@cXxujhkr@lHQxPS
zpEEOiW~#cTzv`;)sc%)}p`Rf_Jhm{URguT*9}NNg!_3iC#l_Ldm01NWh6%m_|4U4c
zN06T#5&}X13IYQC?_$PIPE4Nmb{TP^a?q@}A(ufO@H6$+k)T9{i0oCVz1$ysgLh-F
zmhrI<9#(>p_&7n_P8;@^0->odhf5k=F5@pfuZiNS6*a5y$aD|cgot8zpe=nI7U
X)&RqKskH?46ujQ*X;H;EqIf)K6qzIl)TJ z%B33g`TM*!@L6TZW=R^J6zO}5es#XOpZ>=3Ufc>I76XVt>4?6-@EvHEjYV3Gio8EQ zSr4@{c6hQZ0HPzbaT8*Uc>9JvaYeB6TWe_NWNmz9jmuI{duA69TjoYQPak)h=!4d= zrXgV6ZP=B}dFC+6C*jiaMwhY~rLJ3Hmg}$}<4aTjN5d<-jh7?-9X28U(_fIt+|3+5 z)O46u@xw#i4UD-NOn#1)JuO?M$nG;o^{hv;nkx`#$2kQ++h#FuCgozTO|YZ6^*K^i z&(RiniQQ=oha_-{e_9BD4ObZ{cEXl6vfUSd=9i-;Iq)Ybh+FI4Sh?DIWuy4e@rW8p!Ok?vpYPzjJ6hULpfT>146S70PDlE7 zyqs#~IzL~O1?lc_F6!LNYfdNn$Vq(v>R5M+Y%>*`rJY3Emm@|yEofuDOoW<^kglIK z3F4Rx)mS5B*j#jv+DwSaI) 1~Q%Y^)Sm213b?-|(e4%KY z7N=1FxDCf`!SiAYfTF4Lct0_@dL(KrwTQC3I3mMygnusKD$1(;aobqtP_!@Od^@Bg z#ZS3Tj=`C&8_w<+?*E_NkLxISb_1-;?aiO8qgs+@ngOs75OMgw^UI%Nzl48H*?k>l z$2l&{R otmtzo+~mc>x)0T7694VX#5WH%RY-8 z{V>!QKo*r=SUL0!)`g5*74CriC@lWuM3@Abzt6+c8oAr~ED)3 4XJk2gij<6gi2vH(QR7sJP a zsM}7^F<|frvz^9LcXvup%iZM$wr!lPVrtjTyY_u1q|p)_IDRG5&VNdkCyX!z?5(lw zJJhO{f4PFXKc`I9%TOvBku(1!fzm59`R)jR!ot^kupK}4D|hnI`H*}49N-An?0AsU z=Rxj+j>j=9CL5meyW!cKdp|kBFa@4D#t=scpS-jV92!ulKqE&a!rO^b?Z_ivrW=T1 zkx;DYxHM|BAYafbQ;bxQ$smN|bN!T0;w}1kqfN1AFp3&;w=C_k7)V|pGyNZaT&th` zxK3CL`yNC56L7aZa@ $tu{A}UC!FbbdUA}j;i=R0aMMZMdUyAR z7oE+DbR?2F>+WK&FY=?%{r#67$|L(gY00ZtDT!RYb$G%fcmR8-GbJ^-a|>1{y1FF{ zYM?v9P9`GZayhSsc>}6*w1<|+F%7g~)`Eu_VX#S|6~Y$2@jApMk0l|K9Ey|pDV??_ zPbAP~)8thbp^=Yv_m@c1p4w&|C{1=Gxt@!KSRRuDb^>~W*c6)lt*gY?=lch$Kc?N@ z-UP`DscsWV5-P|mvgMOg$6`miTR-zleYb;L;ci#$f#b$QKjsxi&?qAV|4lBK`1xka zF<&MvK~fySDhLb3@5P5oh2D1kD@lE2x+8!Hu5>eNT$SCRJ>(7cdp~ILW;(Z9qI78{ zH5xv~yf-gg4J8hathu{X)j|n}c^FKDW7XkRqb@$v0S}$I#n1S!AbaQ+eBV9qSt!B@ z;^%OZ(0vBVObvhj+K_rae5w7tA`7b~tX!jd2|3<_!HfmwkGhSc3cLDd`{}O!c*{$P zPlh44Xvy1z0+E*pW?xUR&nv`QKMXJGz0T3vIQcrYAxRrbSC0RD&Nh9BUw6h+nZ^{F z({jC#qq#m9#cDoGw0VetPu34zUd(em6&aa8pQKU;_)Lpf6$@4Dy~vW`DMy@0VLo*D zbEcIht5A7sTY 8^jypPl@|f_vKu5 z6MHQr5)g-coRTjz>cxCpZ1FzvYkxeME*d`a&7Nn(1me7I+8(|We`G?$-Vgd|^F{9$ z%;p$PN6%IGQ)3vIsHh`HROf6tC-I0*oJTLHoHRmvXdpkzFDRH`xA`V~3`V(CPna>g z?np0JVC6=zak@3$Z^^GzhkH&sfts9yg2J8@3K7XkP5+<^{mn}iF;OG0TJ}>5Wc$%a zSx9$)fjrfV)epJVNaVBb7o3a*K7}CM;5Bj%6L#l-_Io}J(Ja;^r!`}`Aiuy}UVD4? z4eTwBorrfPu$Dcn@?!6k^)hmGsPr0WWj-TsmXi=|zoPr1dT>{olGsY38DV@UtS)&- z?F92lXp-n?#a-JdpS@t;IY$gtlLnz=31^rmWfpP-N~?(lMHI$ke6y7#?51^)SH3f! z^F74`BuZ>{C2@%gdKH>^pTrVvm(9+ixolNpY ; zl9Fd#xr3#aI*{KG^+f3vZ>KO<-s_c@Ys=$( 6%Lq 5@Ndy&27 zmeDR+eFjXQl*-FT23};(xi<$cFl0=3j@Isf^tZRgecx~qEk1{eX~c@lB_Ag01gO;~ za!1|w^KRH7oPll_JH7Mc4^V%|77#euclVG1-8krc(6HI?n|qm9R}Y)lGJzH<*MpA| zWYGs=rrjIbHE1YK#_TTNa1%|^>#t9wUutnFaFKr#P4M6eo#lI4M9%DK54_J)_Ss5S zqm#~MdCl1O4&(mtL)acfWa{UTf}wdc95&h<>LmCAhgZ)pj**})ZKpQzttqa*)5tgD zIA?vvpH21hk73(jX`Is&bZi5bS)-e~n0wn^C7)Q#!Q7Qlh!K82_xUP3?U>B)LF~b5 zdDb^waMI?>P|M-4CEDCibe7&;H=sT}dm+N47uDpNrR7*rR_4Rb!8OidGl74;7X%{& zgxp7Dlky(R);B-T{P5Ig?Zj?xhT2ZY7~g2hVs)HMtOvIbGcJ@)!Ka5<80e?W1PyO7 zF+^c$URFinVF-T@t1&ky#KD2L3n0gTXS3oL5t74gt*5uGn8Z1SL>f;C8aOL3(giwM zT+ MXN1atVQDl)j#y^s;r_srzAM)2wT+p{dS3-sDR-XQNX->0(#zg3LTM ziLS*0ikcmkTc6UR6ppC1XlLHi4y&rr>SMOlG1gZ+nA+IvR`FZ32xYRLxG0++Q+tMG z>)4~OrW?T9Sgcb);qyjocxJDfjNO!*xxTc!oFcjP`K{`?PWU~5iKb^retYxA#f7QV zoIac?zBS%zv?S>+FWhA<;#(B{zFecio6De1DWDfRy)%2fzbN+@DI;?3rC=-4u8CX& zMZqg0h=B@w$ItG}0fFxi2?*jJ0zD)`-3-w^eR;O|_Mshz-B&6JR3#n|C>e^|XLYJE z2}Wy~xtej^@rQ@s3E=hj%7~ul{4k?{_)6Z)uEs*nY(bti&R|)Cp=wr*fnf%|>W4=2 z<6Xze#ZO2{#0^SG#EyWk6H+W9p(pT+zF&5uZid-#L2EI1Kp|_i$efc1veg=!*cpO6 z2aO+6njcuREIFC0#3wQPOmNbfhVaBB;uwQLB&P5fUk7HV&!uiF2z%%hctAP%tW5c- zwXUS$U85l!I`#$ul%EL(f?(MAJ|ly_xmoBXV`WYTm}ozd&kGU))0` z+OXuW0iB%gR=Bck&!sHiw%|->1RMyHa$-+j%#fSu$t?qVTLMs3rtKu}8s4d3%}8IU z1gCY7*1fg9X;$@Lx?pT15818JC+ri7Qjz9a=L>pQ^03agxy%hbfY*scug(y*%_${_ zW^vh!3zgoK@cL}^>?;{Z$Bj%NfMeUQ*bRyIip7N*`6JT0(ldD#hEa?Pi-{3kcik{Z z1C6@LB8YagPQEMb9LQ_z#4W3UO>S!0a7y8@)nE<@dqkFY&S2?HtA^_F7&u5|ajji`@NAYd4< zMN?ZnE(9B6Y21@wql<=H@%?yR?Sr(gB}xU3gd~a+&N)B> ;3dfFF#gP*Sgnyt7sji`{FX6z+4aAkoOgJ zyaXExW{TW~OTpOn$SD<7cN(6KFH)*-gg4DbC4}-q{JY0u(7AU_@6VHg0}1b$roE_s zea0$b5D%_?#04wp3+^fe&AQ^Mh4tNf-`NO%FUl=>Pl)f~C;5bDWB$T;!q?Yt>4d|r zL`WsXFR!VrYx=npQOxf)w#NMDQ}4i^16S?WJ;X}>_o+|;W _CFsuMO&1nivI~yl+Rz7 zkk~EuB8QZWif=(IZJq7sp-w(yNtb>h)j9nu?p*S(abutAfiGgp7{`+^nTNV!`7eb% zz8?yw-*LsjXC!QBjN-Ojt+5{+tdCuiyREEYYGe9ZnorVaDSmI^^LM&f1$q>+t4VIl zEbv`VEe$CzMN38uL)KCb%bsI^Ok)cYbm#RA5F`7fi?)a#L?O3BB*+q{cLB2AMQ 3l*&0{;^A0QRKoT= zr_!N-63?BE28<6Zz`GJX&mFhws_JV(2x1sFMMziS`p!q@Zj`AgmPp5sT1o|lcmW|h z9lPgt^9B>2uVVET@PaMAy0wYN8$AIu9EjE|BSV!npLut^a 3(%fgYx#E1{t|>q23j38xpF#54gkPtw7c00hEOaw+_L!}s}KGM{;WiHuoZukC7O z?CK4ML>gw>R=xl6UEf-YL~txsh)Ss?Y5uqBWd!8c;&eKzGq?{&Vtf|avZqF+MDL^F z*_^Vw`buhJsxgiW +v>9iJtlx zvn9F7WGt6xIIpuVaFQy8+@8N=6Z};7!zf8nTIUSNs(h5>H1GvrAIN3LTjZU%)*`t4 z!S-^NoV(%Wl3nuEvBwTQ%s9&}kEbd8VOyKO`8xmL==TfvADai61@;_t{Lv`l^&jvp z+$=rvY--%yJs7KVHFX`u3&~#RfAK2AV}D(+%TKt3@6~Kn4So2-vpI9@lVz*CW%A(m z0HAIC$8bo|-Efr3HU6D$b+FPR$>B3q|71~n+)W9o#2r21v&c7d55H BNuERHT5NB}aXv(dMj_pB zN5{m*-8KPcWKlnN_;3d!o5I3MpfNV5Lpb9&*?!2R{v@uTvRWiZ^6t1KGr2p`pnX`& zDxRuIo^r&hf;2I_Myl6yq@rvu!~r5pZ}(6j`|3%LtKS^*ZrIA{gq5?D<9)@wKnwC~ z PB70f(fWU%%}FFLI^P?LvFI6?P^CXX5R$RA;mg2G z46rVbwa^-?9~_%tq$G7AZ>WN`xq%6+NE?XUFuMQQIV&g%`NC$lXPd5DY!0|-Y(j|p z9x!Q3gmFWNGz5*40|(OmR7F#fx;Z+mnsf3nQfWY~=UKTg3JlK!!F?s4MQa8Gat$ca zO~>G19Lyt4ZQmBts0wsRlahndhR|mrhoWI9e=Z-OsjZwjyh=>uY?W^D3QBFGsogR6 zeE2LBr-rD9AkK68f&$3Vf%=`q!?(-IvA;?Na1oZ(+19Kd-lvoR=*IQww~6*Ew5o`| zI
-L;x>(S=4}%WTH(L}vurOu-%w&6tX1)O_3J=3nFXDCfTbe~x8O9so-lkq} zrZ4%JeZgNKF=Q=_X$o>v4H9web#GBU^6}JO2$Cslo`8O%;neZ$%a0S2+hE|PK;kSD zMVx_;+Av!fKW&2b$c~1JNESb*WD&2hDLIg<*+Ipj|3s=gi%3OL;OinC$omVdGfzm< zwWDL{?$EMeYM%IacKUUVxC}SDSga_ZPu_GZ`ne=5Ebn(0H=%(;54o_iatlTjN&S!% z^@#Zm{Z?m&)E<2$;t0y@!E2GRv8|5wxDmaY0U5qv%G})t3bvlE_2f4~oUdhEP8dIU z{Qp?~r}+7AaBdvs;_icCYy`uJ2fl*i_qW*JC-WcZ+H|rYcOL?qfg`@oqtUEV8HU~2 zQ{~ GfH?IXc;ZclyX#!L5hX19J hP6~vMvk dHXymy16EL zVX-$9K%%e1-soe6_9z*;7N(q)Uk#=mGw^rt`o??lMd~4cO+zk9i5Vw3`Q}U;XD82x zgWG)Nyz!($TzstSY6*^W6fm>#$Uy0dJ30W&9RRO2-Z+`N8a&2(dE$T)6f0)vB~?pj zz8<@}lW~->(TaHq#VYjpMH|Oia%RxcMJBBglxSd7x-8%Rb?d`jGqM!DZ3Lyn_~Jy_ z>vL^LC9i^oG7I8_cPE)xDZ%O;o^YIc&{ZQxH#RIfaBV@Qgp*~mv;s~sRgm In=q^kaZI0f}{7lXA%WA2*C|m>r?HUXUbeURb-fI*=qOSxTu P*o06zlM91yTHH#w)b1GvqA$9ci-n;va-2hq9Vx}vPutj&n>Tn#5K1im6lp{1>w zG1F&bCCMUqNb(pO!*yjMNr4okR4Brk4`%YjD=t?|d384?t56B`@7U4sl65u}uKJzq zB%YmTl4Z#3DfFO=(%3=7b53Ml9265oHlN2$!v0(k!4?!%0+a-7Ikvh&=xjba8tAz$ zx;!1K?5v?Z??>DpTHaz5oAoW-Sv+rvt7~OwI&D8S<+_7ak%xrB{I$^h=D?qN2J9RN zNC*<}IgapO{q(zoew^2ech45SFSIGP?V~;WU zyFD6vY=5Kq|7q_j(f=s?+aC4b)&4{KKZWQii~W~22t1|#H2Mdp{Z#!a`}&tU8kjNs zOZ`tS_J0lfkz@Sb9tUmn>_3d-<8c4oCI3W8lHhL%>gkI<&18>uexqdfceVe@Yft-m zx}*84pE5A3`EUE1r#(Ea&;8W{37A8D?BUO9-TwmXpJSJS`=$B^f%VTB@|42*%cA4o z)&3&1p1$(a-OOJd6ukUp_wTU%ua|x#iGR084@ds?@T2mdl<_~`{3&VtsQcS%_5Y>& Y7lo`M5A!QnF~I-JfCJ0X5 0tA9 kDMeZ7&OpJ3zAvmd%6D6pq_u|Tj|N!T3OrC$vumqJl}x)B__fCo{I?> z2#6a52ng}-Vmj8=w9Xdh>CyZWpbQuRSH4b=a}6e;fH $n-(bCfywVii<@n)Vy>KTaHDIam8&rc)sGl?a3k13jod94Dc4m(Yr2q( z#O61f&*2%{-)u0|b&ze3K>+lD)k>_BPFUoVpnVMC;`?-}wQQmBsHA^lsC1(Tuvo7R zYrTo+)o12JsU)!G*zh}6{@T)KBK<@&+-7op>{ E5imZ zL2+Ba4Y3%OX@(^~kW#>caT=Z7CVNJfM#CbYn0lfv`WYwxmUJ3NT?;&~Xz5eN(nmZV z+{}D2Pp6qd&)SLuAIt_HVn;t|{{HANt?qz) @`%0NsYqmI6h8TYB!Ksi;r!!i@RuT$03~@+-ab3HGamvbo2>SYT3jg@<1_^ zeVg?HdsBq&d_E3BjN{}`sGPpSHMf@qdCggaouTrWVe8tUvN82p%>rE8_C8hlT!_6Q zO9X9=@*;@ag@&Ol*>2Tu()v!oV66R-M6DrUFT{k%h;xY)yiy7v=tHuBfydR-grFWz zIO)3|o3d4C(|lWUFVkgg=;p%U*LHYRc`z61!{ BQ zwLmY_FNt72)&Y0#!*|9z$8ix|_$u~kTq)EsCLx?HIZQXhSOFX)pIEWr_fJ#{WA98p zt}Xi-U1~wlS9TWC1(q9a(xmd1p%uxjGsCR6(5IJ=mwv4wjNomytGINs2z+D1`QX({ zd<1au bz&* 4*@%}fDPgl1yC#E_U&1@oppjqOB9R^&Pi*EyO$zh68fJgHKCt)XT~|T? zEF-Hs)f$r5V-*pIl9N-W-9Vbxd7gGwD5W4aAVJR#^+o;g=C^3)52h+ITg$W|wT**t zCRXihz!Z1oR4B=$y?tn?y^>jjVrfWJ(Zn zJJ;Y%obIP}i5V|_ALTxy?N+MC(F63TmXP~vQ(VqD oJzbyB4aw5$fsoY5V;rYfm;2P1t9_HCupcB$A3Cm;ul3 zak|HmhCRw#ltRN^_;#3<*ukn41<7bxT8 cDW`_dJ3m1&w}?45OD8c~ z;PNNWEP<{9*DN|MH>eEKQp(EmL}^ 3m=FzbZ>oR`Szu^=2mW~)-m zq_KJ}gK$lf6I2y*_{POOu;$mjfqR;D5`kL|=*_7{L0arHNi~AXKyOhm#U!dRh9t+q zv8Jbjgb2OdpO)8&94_Yl0NH|s#G5t?pS8+e0lhqU6YR!rPJs`SShz9J{d(V=rRJB? z#E#~t?~b&-q*4+i@mKOBq&6M|NRXt)hn(wR3=MG;Fnp741XTK}ASv~M-~lfJl&4Fk z3`x3~FXh6B@ZH=Pvw8RhrN m(lUUxmm#FfsD)E59!1Jx$Edyc*BK8i>*UK?u0b9yNRl De$91zIe%p3|8IaQ(>dh9`a3pC0Xh#DT9LZ >9V+4FLH1}~R4!}IL)1bx$4t@r7+hpglN-h~5^(U@Q?lrHoBa(^JSg6H9(rJv;3 z!bep2I!Z(+M`HsL=NQtSDbR+5jL4=PwFgnr=ncG&Bh=3fXq=TY4nu=Rc$;u16}}U4 z(2tpmPWm|hx&_8i+gLgqKv(QWIJ6RQ)`Dl0s?O}8ezse>A9``L-BtTqLiPIV+SEXl znP4RPFBhZObq|@asj#Dx$n& ^Tq*UnOY>S- zQ khtT7BQ49V%CQBg~sO&jXk zXfmZw(s;{>1@?fb+62|_IgB~Nl@wi7-*O?pg|;3LY99@Il9b0Y?n-x8WSAEBWiW a={w~$5!IIlsIs>HEV`Mq5 D>pPu;_Pk0(2xNjO_=IdY zIHveOpimYvswZ{OZ?5vtaZ0&0;#KXyUB?yTz>fA>lB93fKIhcH5Y0PYve4wa7XUE) z*NK>QnQXkf9ypcwGa2Ho*L5g;J$?2#EG(Ed(YBd?h9v5O8}&0t3Zx}yr01xSYBW-a zHNkF`;p6Unplp#pye~ %dnI(YfbU6h0!eepAIWjeET6sH&aElz(88EdZ}f4pqF2 zKFXdn4?G5<(n=4<|Hf%@s{=piwquw>vL}xvjd%(eE-I@MuUHPT8o^*dXqlqd^yiX+ zcy(M 8ksG|I|U zB{3^l7*{((hcJ7zmk>#;qy5kEW}k|VlOI;H*(M2iz2`$#?gB``bwK4k23T>$(8aje zeftLB=e5W4N=+uF#WiRaO6eLWhHo l5~=A9)I^&bGc8Y;UXyV{+A1>X~uXk58`5 z#Zo{E#_r?mVe7TWq4FA@jCoj}!@IL4F_6$$fX?5-{PX1nS7)I@=XoFJBnt!t_j_Hl zvv)B!uzT5oO=&JfVyV3I5?%Ac;P8d$Eq{;xiB!w#tE*F<#2W$ !uAw3ixm^!u%x)kZ}@m9|*XkXi&i97xJE@_MJ1Y(XU51nC#k_c=Tkexh|a_D(&tL zJI*||S!)~)8jmQg<{w8-z=va+)hH+~v(_EbyZCF){Zgkza`RyQF0&RK+k6(O(`S3e z>kcZsEX**{8ZW~I7vNE}88BESgZQoO>ojp4;SW6B8h_% pE!93NnQnS6yo;-E0MBioLI{-T$Aa@U901T!?2qheH5MhH^p$No@W*QmHpEda zx7+61O1gw&KRJVDdYly!(K%cAJ><%|Zzm{FissONq8Ug;dN}$Vv=0=T+!T;M@ 1MsoqnYzhz7O> zZf4gBr-ln}?u&^9aK2x-f8m|AN}&EM@MOF)?~(d`+O%b){b r-5NN=>wF1HfrSZ+=X>npyp< z-_ XRG|li&5ufK%&3s?hSV8$(QT^+RhO#_ z&>5-eXi6W>Y;N_*c`g|S(ppSimj0Mf07Esi>ep0I_vUCWQY$BRcTpLg+pi&H(qp4* zDCsLBPUt|slfO_4ez2z{?;nxe*}Ap0r7ba_3MP%|h%p{7j=#?hwp|bT7KU{o(JbY1 z<=Z3T=ZZ*W!xZDi&o)6o1DkX8z5`}YSE7+P|ARKrP`QOwlOvtCPudYScFdEHlTe_; zM?_~2_8raxP^(eL)k Y}cBwHg%c@j5!zHVj9s(a}V1%)zf>{1@4~`outA zh}xJG=!xhIi83dtjcSqP^=puj^q;Sqf#F=3H_;L?QzAmq!y-aaW6#$q5qiGBQ%D+* zmc6jsQAP~FdIY8)j|oC(_Gt*=TCHi+9Cogy(yoZ|XNF887P@M|X_Nt7^i ;gxxO0lTy1Zhmnwc$aI821$r3>$vkvKwO+(CD`Zq`QdeZ*|_yd zg44a1!3g~hgSC}5 &+Th$;Ve>nLR0~C{N#`}oF2N3`x7~^k6x|YXZ88S?Lde{GE9PU*yyIEq z0K;)jZ%YPS0ka_kCMicfj#O?qHKy*U9t5nVR6kt^)TQ6Ud5xA0e1jIZZS1|pMkXFi z!W*>a&n#pCP2a`hFS=#iSTh*`0c@r^8Tz9jN=1iL??8$4&THn|P?1X+480tgy4<_w zP`mk5RlL(-$Vxpyc>lE`Kn$9R$zFV2mZEBum>!$J9$f*J@?`Lb>@GVR{s)eTZ%xtK z%TVfF1G}{XZL-Q3xjo_WCIJe#12o*;qxRe6bv2Vb;1NbT{jsL%2pHwxPc{@ji>e#J zm7@y@!$W*ee0t7=VkjACuH)S7|L5x*-dTELtl4us6g(Ms LDVt3V{g1_7t zq>_18QC?H$So^KKW1O 9yG>|tlM5e4#I(Em_$?)p4kd&OEA_Zd{ zDW-A(B$tBUotAtr+-ko*o(>%fxy`lihYf1dRPzGZF*HLi82~L9Ye3{1(rbn$_ZtJ} zV_aY1?uhyWJdUa)W5Fi8crkfzZXzjpgN^wJgaof{NKI-7+2Y^~?l-q5ynZC#KfexK zcir^k$#^{^gLvydlF6_7I$Q=?*S;lEa=6`pyguv!_-ZFB@-4qBl^rx_7D36Q>Y>=V zye00sUP|AVJqq`_7&=2(5+#j!d{damRS+B3C-63#fRL1PQ6Oc5@$pD4kEXa+vw-x1 z>H}L2(U<6nss_Ke5v4Sf@hEg7y-{3OyiVVbcvJ6LBOudbH ;X&IBpB0S-~4LOGD_!$jJ9g7wVK=gg5 z9GpHOn(1vu+JHyW8%$p!VS|E+ZbV!O-j7VGMhqgDGaGI{IkX6Ahl`vuY1~^q& C zJ*fwkD#!Yrlh9E+Ls}q?k_*0s6a@MbNPISG-{IB;1&gzM?StPXV@yp)E4v$FEMU|J zp-oJTH1kKs{mtt2(ovt&krdA@V*% CPsakBhFRig+9kMY;gF2hS-k_rbrCg4Ck2wL=_S&z=vuv4ch%yI z8U?03bHs9FL0xG}P$*{mnsSnBsN(i(u)wG&Ox|Tq$l%3~E9OG(-JS|isY+hftb~R- zDoOs~y=fR_`grdo>H{aUi(OxC!xd{NPS6<<=}t$n@&|L+sQXQmCJ|Y16>mNNtNwW$ zzc8g|4q#k1j(_I!*8aec)tsZyEpEO2{mN&vt9c@}#&^r+3D+l1KdIhK(%-Q=>p>oM zc6u3Xa1D=tzjWN)I?TwoV5Z~>hZAi0jAiIx *(l2Q`6K;ivpnA{E4y?Twm%o6?)n7mg4 zzXisYkVxE54c_xmmxU*Yf9^%o10i&Io-4TDo{ty);< atH-ANuhyALCcI0lHeSgThWy9^CgRi7=9s8 z4GK!?Zmnv}k{{&blq`ZD3R7l7%n4wumrk)MNy@9 vF^<&(2E_5W#& zl<3fLe^oJ0&K&_Ed&YX>`9S!q5UXotW%jH7DlaVy!hqP8dX1N|ls^O#;;)6AD?-}` zy3%B6G#BWZPec3YR;Yy(nNeW1H9V9$v$>mxdIN@+$AXFz2`$md{6VayV#o2!ovDym z$P!Ftnoqa`e^lASqi(;9*Im^OpIlo&xCLX;w`$Zr%LPLX0-UVuB1P2S^Skd^r|=F? z&WBR!5RHN+W_vl+>nG#c`gl0*`K_X^UjAOcHKc gyoy%V+h~v0eVy-C1?fSFE&c3e-i(x*M!z_f+@J-*1aMZl0DnTFYHwlre~lBGzQ= zr;;3BCKrovAqTG>ksoWDrJUv9sYqWYuADUYmnBMoTMM`idqC@rl~u{!$jbZVT*2>5 zR2xds=?>;ms9}EYxw9RJ7sBA+9N%pnc!rLgB!WuI3~AtmH3O0qLw;;(cGyrS_iM`F zg^*+o-|$ULY k7?8niE;Xq EFIjBb)+-eRurM2;6IfZE)s+b)Dfm}EW%x5x4&~f zTzK2A7GEy$&EJv91=&PxJhka5*TFC6+#NC;$3seoOYiV<3^)__u}*yjN86MF@P7(& z(L@dGm-%Q{kaS*lJ)Ckv&DG7}5#!1kssZ~Y1-39LViN!Kn+-*@xg;k#M%%T`=BvVV z(TTd9(Q}-`J(Dgk?3jk2m8HFbrTr%*7i$AMt(SN&iyM*wVL%DIB5m)<(_m7x)(O+m zUNtBtUIU%H>|{Pq$nZVB%%IQ);r9tk73Vy->3F(tgB77N3n3AjT$(EVbfF3? @7nW1v-wodHJ|AE^Qt-drR7%?n?Fj}$Qe%D*U z5(-s$i)D7ln@!*EB-h_@%c-;eFgzz%ou2`Xp$%G+wei#z+k;Ogu%tsdV)lHZIDron zMiNPBw7!%t-iMfg6plCJNna9g)%Kb;xBgal4J5W9kqH4aL2XOwdeGWj2<#$*FkNh4 zsvnV`+#D!|Wh&$Hun0S}?IL;_{Be;F?LEJYeX;kpRfipr+7{UHQ2$Ng)!9g8Pc6m8 zAoRh=$~KL_yhq8;rHl6H`VQ*Wv#v8e)_ZU{Nnj9^U+dd%e*U#*o}B{(421uDrosJJ zKmG3D-?_J!l=Hj2Q2p`GEW{rX^G~C%Q_zdfZ=+3r>ii0s|7GkYCV#gVV=wJ*pCJ6x z-s_JLUW9+!Bm2ABe?Ccg4bf|c{V#36^OXM6=pTIhYxUR6@L%c(&t&Fb>VNXY|LdV& z=+EEn<)O{M{zHboJnp}{ oub^}2`GWx>CC5Pqh2UwZhnNcg|N`scG-K>SkugE#x<40+9*{be!k?`nVXXs?I- zdN=b|2mH^g!t;>-4%`14^b3FeyS;cg?6-&i!Djz+