From 8baa2139f77d69dcc9a3ee90676c142631bec829 Mon Sep 17 00:00:00 2001 From: w-yuki Date: Thu, 10 Sep 2026 17:10:54 +0900 Subject: [PATCH] no message --- .classpath | 41 ++++++ .gitignore | 2 + .project | 37 +++++ .settings/.jsdtscope | 13 ++ .settings/org.eclipse.core.resources.prefs | 6 + .settings/org.eclipse.jdt.core.prefs | 11 ++ .settings/org.eclipse.wst.common.component | 10 ++ ....eclipse.wst.common.project.facet.core.xml | 7 + ...rg.eclipse.wst.jsdt.ui.superType.container | 1 + .../org.eclipse.wst.jsdt.ui.superType.name | 1 + .settings/org.eclipse.wst.validation.prefs | 2 + pom.xml | 3 +- .../model/SearchConditionDepartment.java | 1 + .../app/domain/service/DeleteDepartment.java | 6 + .../app/domain/service/SearchDepartment.java | 17 ++- .../service/impl/DeleteDepartmentImpl.java | 34 +++++ .../service/impl/RegisterDepartmentImpl.java | 35 +++++ .../service/impl/SearchDepartmentImpl.java | 14 +- .../DeleteDepartmentController.java | 123 ++++++++++++++++ .../InsertDepartmentInputController.java | 92 ++++++++++++ .../SelectDepartmentController.java | 136 ++++++++++++++++++ .../PageReturnAttributeKeyword.java | 5 + .../TransitionTargetPageNameKeyword.java | 21 ++- .../form/InsertDepartmentForm.java | 110 ++++++++++++++ .../form/SearchConditionDepartmentForm.java | 53 +++++++ src/main/resources/application.properties | 2 +- .../templates/insertDepartmentInput.html | 67 +++++++++ src/main/resources/templates/menu.html | 15 +- .../resources/templates/selectDepartment.html | 114 +++++++++++++++ src/main/webapp/NewFile.html | 10 ++ src/main/webapp/insertDepartmentInput.html | 10 ++ src/main/webapp/selectDepartment.html | 114 +++++++++++++++ src/main/webapp/selectDepartment2.html | 10 ++ テスト仕様書/~$単体テスト仕様書.xlsx | Bin 0 -> 165 bytes .../~$【管理者】メニュー機能-詳細設計書.xlsx | Bin 0 -> 165 bytes .../~$【管理者】社員情報登録機能-詳細設計書.xlsx | Bin 0 -> 165 bytes ...¡理者】部署情報検索更新削除機能-詳細設計書.xlsx | Bin 0 -> 165 bytes 設計書/~$テーブル定義書.xlsm | Bin 0 -> 165 bytes 設計書/~$基本設計書.xlsx | Bin 0 -> 165 bytes 設計書/基本設計書.xlsx | Bin 189378 -> 179388 bytes 40 files changed, 1104 insertions(+), 19 deletions(-) create mode 100644 .classpath create mode 100644 .gitignore create mode 100644 .project create mode 100644 .settings/.jsdtscope create mode 100644 .settings/org.eclipse.core.resources.prefs create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 .settings/org.eclipse.wst.common.component create mode 100644 .settings/org.eclipse.wst.common.project.facet.core.xml create mode 100644 .settings/org.eclipse.wst.jsdt.ui.superType.container create mode 100644 .settings/org.eclipse.wst.jsdt.ui.superType.name create mode 100644 .settings/org.eclipse.wst.validation.prefs create mode 100644 src/main/java/com/example/rhizome/app/domain/service/DeleteDepartment.java create mode 100644 src/main/java/com/example/rhizome/app/domain/service/impl/DeleteDepartmentImpl.java create mode 100644 src/main/java/com/example/rhizome/app/domain/service/impl/RegisterDepartmentImpl.java create mode 100644 src/main/java/com/example/rhizome/app/presentation/controller/DeleteDepartmentController.java create mode 100644 src/main/java/com/example/rhizome/app/presentation/controller/InsertDepartmentInputController.java create mode 100644 src/main/java/com/example/rhizome/app/presentation/controller/SelectDepartmentController.java create mode 100644 src/main/java/com/example/rhizome/app/presentation/form/InsertDepartmentForm.java create mode 100644 src/main/java/com/example/rhizome/app/presentation/form/SearchConditionDepartmentForm.java create mode 100644 src/main/resources/templates/insertDepartmentInput.html create mode 100644 src/main/resources/templates/selectDepartment.html create mode 100644 src/main/webapp/NewFile.html create mode 100644 src/main/webapp/insertDepartmentInput.html create mode 100644 src/main/webapp/selectDepartment.html create mode 100644 src/main/webapp/selectDepartment2.html create mode 100644 テスト仕様書/~$単体テスト仕様書.xlsx create mode 100644 設計書/~$【管理者】メニュー機能-詳細設計書.xlsx create mode 100644 設計書/~$【管理者】社員情報登録機能-詳細設計書.xlsx create mode 100644 設計書/~$【管理者】部署情報検索更新削除機能-詳細設計書.xlsx create mode 100644 設計書/~$テーブル定義書.xlsm create mode 100644 設計書/~$基本設計書.xlsx diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..3122b27 --- /dev/null +++ b/.classpath @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0f63015 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/target/ +/bin/ diff --git a/.project b/.project new file mode 100644 index 0000000..ce8bde7 --- /dev/null +++ b/.project @@ -0,0 +1,37 @@ + + + EM-Spring + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.wst.jsdt.core.jsNature + + diff --git a/.settings/.jsdtscope b/.settings/.jsdtscope new file mode 100644 index 0000000..1ef54ab --- /dev/null +++ b/.settings/.jsdtscope @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..29abf99 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,6 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 +encoding//src/test/java=UTF-8 +encoding//src/test/resources=UTF-8 +encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..f9e3458 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.methodParameters=generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=17 +org.eclipse.jdt.core.compiler.compliance=17 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=17 diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component new file mode 100644 index 0000000..36e6ccc --- /dev/null +++ b/.settings/org.eclipse.wst.common.component @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/.settings/org.eclipse.wst.common.project.facet.core.xml b/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000..36d3a1f --- /dev/null +++ b/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/.settings/org.eclipse.wst.jsdt.ui.superType.container b/.settings/org.eclipse.wst.jsdt.ui.superType.container new file mode 100644 index 0000000..3bd5d0a --- /dev/null +++ b/.settings/org.eclipse.wst.jsdt.ui.superType.container @@ -0,0 +1 @@ +org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/.settings/org.eclipse.wst.jsdt.ui.superType.name b/.settings/org.eclipse.wst.jsdt.ui.superType.name new file mode 100644 index 0000000..05bd71b --- /dev/null +++ b/.settings/org.eclipse.wst.jsdt.ui.superType.name @@ -0,0 +1 @@ +Window \ No newline at end of file diff --git a/.settings/org.eclipse.wst.validation.prefs b/.settings/org.eclipse.wst.validation.prefs new file mode 100644 index 0000000..04cad8c --- /dev/null +++ b/.settings/org.eclipse.wst.validation.prefs @@ -0,0 +1,2 @@ +disabled=06target +eclipse.preferences.version=1 diff --git a/pom.xml b/pom.xml index 24be8c6..2d0b73e 100644 --- a/pom.xml +++ b/pom.xml @@ -15,8 +15,9 @@ war EM-Spring Demo project for Spring Boot - + 17 + 1.18.34 diff --git a/src/main/java/com/example/rhizome/app/domain/model/SearchConditionDepartment.java b/src/main/java/com/example/rhizome/app/domain/model/SearchConditionDepartment.java index 1e365eb..ac3333f 100644 --- a/src/main/java/com/example/rhizome/app/domain/model/SearchConditionDepartment.java +++ b/src/main/java/com/example/rhizome/app/domain/model/SearchConditionDepartment.java @@ -5,6 +5,7 @@ import lombok.Getter; /** * 部署情報の検索要件を表現するモデルクラスです。 + *画面の検索条件を受け取る */ @Getter @AllArgsConstructor diff --git a/src/main/java/com/example/rhizome/app/domain/service/DeleteDepartment.java b/src/main/java/com/example/rhizome/app/domain/service/DeleteDepartment.java new file mode 100644 index 0000000..19081e4 --- /dev/null +++ b/src/main/java/com/example/rhizome/app/domain/service/DeleteDepartment.java @@ -0,0 +1,6 @@ +package com.example.rhizome.app.domain.service; + +public interface DeleteDepartment { + void deleteDepartment(Integer idDepartment); + +} diff --git a/src/main/java/com/example/rhizome/app/domain/service/SearchDepartment.java b/src/main/java/com/example/rhizome/app/domain/service/SearchDepartment.java index 572dcee..807c699 100644 --- a/src/main/java/com/example/rhizome/app/domain/service/SearchDepartment.java +++ b/src/main/java/com/example/rhizome/app/domain/service/SearchDepartment.java @@ -1,14 +1,21 @@ +//サービス + package com.example.rhizome.app.domain.service; +import java.util.List; + import com.example.rhizome.app.domain.model.Department; import com.example.rhizome.app.domain.model.SearchConditionDepartment; -import java.util.List; - public interface SearchDepartment { - List selectAll(); - + List selectAll(); //DBから全取得 + List searchBy(SearchConditionDepartment searchConditionDepartment); - List searchByWithLike(SearchConditionDepartment searchConditionDepartment); + List searchByWithLike(SearchConditionDepartment searchConditionDepartment); //条件検索 + + } + + +//controller→SeachDepartment→Repository→DB \ No newline at end of file diff --git a/src/main/java/com/example/rhizome/app/domain/service/impl/DeleteDepartmentImpl.java b/src/main/java/com/example/rhizome/app/domain/service/impl/DeleteDepartmentImpl.java new file mode 100644 index 0000000..5e1d84d --- /dev/null +++ b/src/main/java/com/example/rhizome/app/domain/service/impl/DeleteDepartmentImpl.java @@ -0,0 +1,34 @@ +package com.example.rhizome.app.domain.service.impl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.example.rhizome.app.domain.service.DeleteDepartment; +import com.example.rhizome.app.infra.repository.DepartmentRepository; + +/** + * Employee レコード削除関連の機能を持つサービス + */ +@Service +@Transactional +public class DeleteDepartmentImpl implements DeleteDepartment { + + DepartmentRepository departmentRepository; + + @Autowired + public DeleteDepartmentImpl(DepartmentRepository departmentRepository) { + this.departmentRepository = departmentRepository; + } + + + /** + * idEmployee を元に employee データを削除 + * + * @param idEmployee 削除対象のidEmployee + */ + public void deleteDepartment(Integer idDepartment) { + departmentRepository.deleteById(idDepartment); + } + +} diff --git a/src/main/java/com/example/rhizome/app/domain/service/impl/RegisterDepartmentImpl.java b/src/main/java/com/example/rhizome/app/domain/service/impl/RegisterDepartmentImpl.java new file mode 100644 index 0000000..088da0a --- /dev/null +++ b/src/main/java/com/example/rhizome/app/domain/service/impl/RegisterDepartmentImpl.java @@ -0,0 +1,35 @@ +package com.example.rhizome.app.domain.service.impl; + + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.example.rhizome.app.domain.model.Department; +import com.example.rhizome.app.domain.service.RegisterDepartment; +import com.example.rhizome.app.infra.entity.DepartmentEntity; +import com.example.rhizome.app.infra.repository.DepartmentRepository; + +/** + * Employee テーブルの登録系の機能を集約させるサービスクラスです。 + */ +@Service +@Transactional +public class RegisterDepartmentImpl implements RegisterDepartment { + + DepartmentRepository departmentRepository; + + @Autowired + public RegisterDepartmentImpl(DepartmentRepository DepartmentRepository) { + this.departmentRepository = DepartmentRepository; + } + + /** + * employee インスタンスの内容を登録する + * + * @param employee 登録対象のデータ + */ + public void registerDepartment(Department department) { + departmentRepository.save(DepartmentEntity.convertFrom(department)); + } +} diff --git a/src/main/java/com/example/rhizome/app/domain/service/impl/SearchDepartmentImpl.java b/src/main/java/com/example/rhizome/app/domain/service/impl/SearchDepartmentImpl.java index feb6b37..02572d8 100644 --- a/src/main/java/com/example/rhizome/app/domain/service/impl/SearchDepartmentImpl.java +++ b/src/main/java/com/example/rhizome/app/domain/service/impl/SearchDepartmentImpl.java @@ -1,17 +1,18 @@ package com.example.rhizome.app.domain.service.impl; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + import com.example.rhizome.app.domain.model.Department; import com.example.rhizome.app.domain.model.SearchConditionDepartment; import com.example.rhizome.app.domain.service.SearchDepartment; import com.example.rhizome.app.infra.entity.DepartmentEntity; import com.example.rhizome.app.infra.repository.DepartmentRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.jpa.domain.Specification; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; /** * 部署情報検索系の機能を集約させるサービスクラスです。 @@ -42,6 +43,7 @@ public class SearchDepartmentImpl implements SearchDepartment { } /** + *seachBy完全一致検索用メソッド * searchConditionDepartment の情報を元に Department のレコードを取得 * * @param searchConditionDepartment 検索条件 diff --git a/src/main/java/com/example/rhizome/app/presentation/controller/DeleteDepartmentController.java b/src/main/java/com/example/rhizome/app/presentation/controller/DeleteDepartmentController.java new file mode 100644 index 0000000..ab2798e --- /dev/null +++ b/src/main/java/com/example/rhizome/app/presentation/controller/DeleteDepartmentController.java @@ -0,0 +1,123 @@ +package com.example.rhizome.app.presentation.controller; + + +import static com.example.rhizome.app.presentation.controller.pageproperty.TransitionTargetPageNameKeyword.*; + +import java.util.Objects; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.servlet.http.HttpSession; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import com.example.rhizome.aop.aspect.PermissionCheck; +import com.example.rhizome.aop.aspect.SessionCheck; +import com.example.rhizome.app.domain.model.LoginUser; +import com.example.rhizome.app.domain.service.DeleteDepartment; +import com.example.rhizome.app.domain.service.SearchDepartment; +import com.example.rhizome.app.presentation.controller.pageproperty.PageReturnAttributeKeyword; +import com.example.rhizome.app.presentation.controller.pageproperty.SessionKeyword; +import com.example.rhizome.app.presentation.controller.pageproperty.TransitionTargetPageNameKeyword; +import com.example.rhizome.app.presentation.form.DepartmentForm; +import com.example.rhizome.app.presentation.form.LoginUserForm; +import com.example.rhizome.app.presentation.form.MessageForm; + +/** + * 削除処理のコントロータ + */ +@Controller +public class DeleteDepartmentController { + + // ログ出力用インスタンス + private final static Logger LOGGER = Logger.getLogger(DeleteDepartmentController.class.getName()); + + // エラーメッセージ用の定数フィールド + private final static String SEVERE_ERROR_MESSAGE = "エラーが発生しました!"; + + HttpSession httpSession; + DeleteDepartment deleteDepartment; + SearchDepartment searchDepartment; + + @Autowired + public DeleteDepartmentController(DeleteDepartment deleteDepartment, SearchDepartment searchDepartment, HttpSession httpSession) { + this.httpSession = httpSession; + this.deleteDepartment = deleteDepartment; + this.searchDepartment = searchDepartment; + } + + /** + * 削除処理のコントローラ + * + * @param idEmployee 削除対象のemployeeId + * @param model ビューにデータを渡すためのコンテナ + * @return 遷移先の画面 + */ + @PermissionCheck + @SessionCheck + @RequestMapping(value = DELETE_DEPARTMENT, method = RequestMethod.POST) + public String deleteDepartment(@RequestParam("idDepartment") Integer idDepartment, Model model) { + + try { + // 部署一覧を取得し、画面に返す用のクラスに詰め替える + // 作成した部署一覧をセット + model.addAttribute( + PageReturnAttributeKeyword.DEPARTMENT_FORM_LIST, + DepartmentForm.convertFrom(searchDepartment.selectAll()) + ); + + // 削除処理実施 + deleteExec( + model, + idDepartment, + LoginUserForm.convertTo((LoginUserForm) httpSession.getAttribute(SessionKeyword.LOGIN_USER))); + + // 検索画面に遷移 + return "forward:" + TransitionTargetPageNameKeyword.SELECT_DEPARTMENT_INFO_FORM_EMPTY; + + } catch (Exception e) { + // ログイン情報の破棄 + httpSession.invalidate(); + + e.printStackTrace(); + // エラーログ出力 + LOGGER.log(Level.SEVERE, SEVERE_ERROR_MESSAGE, e); + // エラー画面遷移 + return TransitionTargetPageNameKeyword.ERROR_HTML; + } + } + + /** + * 削除処理実施 + * + * @param model ビューにデータを渡すためのコンテナ + * @param idEmployee 削除対象のemployeeId + * @param loginUser ログインユーザー情報 + */ + private void deleteExec(Model model, Integer idDepartment, LoginUser loginUser) { + + final String DELETE_TARGET_ID_CAN_NOT_DELETE = "ログイン者自身は削除出来ません。"; + final String DELETE_COMPLETE = "削除しました。"; + + // ログインしている人が、削除対象かチェック + if (Objects.equals(loginUser.getIdDepartment(), idDepartment)) { + // 削除対象だった場合 + // エラーメッセージをセット + model.addAttribute(PageReturnAttributeKeyword.MESSAGE_ERROR, new MessageForm(DELETE_TARGET_ID_CAN_NOT_DELETE)); + // 検索画面に遷移 + return; + } + + // 削除を実施 + deleteDepartment.deleteDepartment(idDepartment); + + // 削除完了したメッセージをセット + model.addAttribute(PageReturnAttributeKeyword.MESSAGE_INFO, new MessageForm(DELETE_COMPLETE)); + + } +} diff --git a/src/main/java/com/example/rhizome/app/presentation/controller/InsertDepartmentInputController.java b/src/main/java/com/example/rhizome/app/presentation/controller/InsertDepartmentInputController.java new file mode 100644 index 0000000..cb6cdf5 --- /dev/null +++ b/src/main/java/com/example/rhizome/app/presentation/controller/InsertDepartmentInputController.java @@ -0,0 +1,92 @@ +package com.example.rhizome.app.presentation.controller; + +import static com.example.rhizome.app.presentation.controller.pageproperty.TransitionTargetPageNameKeyword.*; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.servlet.http.HttpSession; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import com.example.rhizome.aop.aspect.PermissionCheck; +import com.example.rhizome.aop.aspect.SessionCheck; +import com.example.rhizome.app.domain.service.RegisterDepartment; +import com.example.rhizome.app.domain.service.SearchDepartment; +import com.example.rhizome.app.presentation.controller.pageproperty.PageReturnAttributeKeyword; +import com.example.rhizome.app.presentation.controller.pageproperty.TransitionTargetPageNameKeyword; +import com.example.rhizome.app.presentation.form.InsertDepartmentForm; + +/** + * 登録画面表示用コントローラ + * 部署登録画面を表示するだけ + */ +@Controller +public class InsertDepartmentInputController { + + // ログ出力用インスタンス + private final static Logger LOGGER = Logger.getLogger(InsertDepartmentInputController.class.getName()); + + // エラーメッセージ用の定数フィールド + private final static String SEVERE_ERROR_MESSAGE = "エラーが発生しました!"; + + HttpSession httpSession; + RegisterDepartment registerDepartment; + SearchDepartment searchDepartment; + + @Autowired + public InsertDepartmentInputController(HttpSession httpSession, RegisterDepartment registerDepartment, SearchDepartment searchDepartment) { + this.httpSession = httpSession; + this.registerDepartment = registerDepartment; + this.searchDepartment = searchDepartment; + } + + @ModelAttribute + public InsertDepartmentForm insertDepartmentForm() { + return new InsertDepartmentForm(); + } + + + /** + * 登録画面表示処理 + * + * @param insertDepartmentForm 登録画面のフォーム + * @param model ビューにデータを渡すためのコンテナ + * @return 遷移先の画面 + */ + @SessionCheck + @PermissionCheck + @RequestMapping(value = INSERT_DEPARTMENT_INPUT, method = RequestMethod.POST) + public String insertInput(InsertDepartmentForm insertDepartmentForm, Model model) { + + try { + // 部署コードリストを作成し、画面に返す値としてセット + //model.addAttribute(PageReturnAttributeKeyword.DEPARTMENT_FORM_LIST, DepartmentForm.convertFrom(searchDepartment.selectAll())); + + // パラメータをセット + model.addAttribute(PageReturnAttributeKeyword.INSERT_DEPARTMENT_FORM, insertDepartmentForm); + + // 登録画面に遷移 + return TransitionTargetPageNameKeyword.INSERT_DEPARTMENT_INPUT_HTML; + + } catch (Exception e) { + // ログイン情報の破棄 + httpSession.invalidate(); + + e.printStackTrace(); + + // エラーログ出力 + LOGGER.log(Level.SEVERE, SEVERE_ERROR_MESSAGE, e); + // エラー画面遷移 + return TransitionTargetPageNameKeyword.ERROR_HTML; + } + } +} + + + diff --git a/src/main/java/com/example/rhizome/app/presentation/controller/SelectDepartmentController.java b/src/main/java/com/example/rhizome/app/presentation/controller/SelectDepartmentController.java new file mode 100644 index 0000000..43b8ff7 --- /dev/null +++ b/src/main/java/com/example/rhizome/app/presentation/controller/SelectDepartmentController.java @@ -0,0 +1,136 @@ +package com.example.rhizome.app.presentation.controller; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.servlet.http.HttpSession; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import com.example.rhizome.aop.aspect.PermissionCheck; +import com.example.rhizome.aop.aspect.SessionCheck; +import com.example.rhizome.app.domain.service.SearchDepartment; +import com.example.rhizome.app.presentation.controller.pageproperty.PageReturnAttributeKeyword; +import com.example.rhizome.app.presentation.controller.pageproperty.TransitionTargetPageNameKeyword; +import com.example.rhizome.app.presentation.form.DepartmentForm; +import com.example.rhizome.app.presentation.form.SearchConditionDepartmentForm; + +/** + * 部署検索画面用コントローラ リスト全件表示、検索表示、更新、削除が可能 + */ +@Controller +public class SelectDepartmentController { + + // ログ出力用インスタンス + private final static Logger LOGGER = Logger.getLogger(SelectDepartmentController.class.getName()); + // エラーメッセージ用の定数フィールド + private final static String SEVERE_ERROR_MESSAGE = "エラーが発生しました!"; + + HttpSession httpSession; + SearchDepartment searchDepartment; + + + @Autowired + public SelectDepartmentController(HttpSession httpSession, SearchDepartment searchDepartment) { + this.httpSession = httpSession; + this.searchDepartment = searchDepartment; + } + + @ModelAttribute + public SearchConditionDepartmentForm searchConditionDepartmentForm() { + return new SearchConditionDepartmentForm(); + } + + /** + * 部署検索画面表示処理コントローラ + * + * @param searchConditionDepartmentForm 検索画面のフォーム + * @param model ビューにデータを渡すためのコンテナ + * @return 遷移先の画面 + */ + @PermissionCheck + @SessionCheck + @RequestMapping(value = TransitionTargetPageNameKeyword.SELECT_DEPARTMENT_INFO, method = RequestMethod.POST) + public String select(SearchConditionDepartmentForm searchConditionDepartmentForm, Model model) { + + try { + + // 部署一覧を取得し、画面に返す用のクラスに詰め替える + // 作成した部署一覧をセット + model.addAttribute( + PageReturnAttributeKeyword.DEPARTMENT_FORM_LIST, + DepartmentForm.convertFrom(searchDepartment.selectAll()) //部署一覧をDBから取得→List + //DepartmentをDepartmentFormという型に変換 + //model.Attributet(PageReturnAttributeKeyword.DEPARTMENT_FORM_LIST,変換した部署一覧) + //DBから部署一覧を取得して + //画面表示用のDepartmentFormに変換して + //departmentFormListという名前で画面に渡す + ); + + // 検索条件を元に検索を実施 + // 取得した EmployeeInfo( employee + department )の情報を画面に返す用の型に詰め替えてセット + model.addAttribute(PageReturnAttributeKeyword.DEPARTMENT_INFO_FORM_LIST, + DepartmentForm.convertFrom( + searchDepartment.searchByWithLike( + SearchConditionDepartmentForm.convertTo(searchConditionDepartmentForm)))); + //SearchConditionDepartmentForm…画面から送られた検索条件 + //model.Attributet(PageReturnAttributeKeyword.DEPARTMENT_INFO_FORM_LIST,変換済み検索結果) + //画面で入力された検索条件を検索用オブジェクトに変換して + //その条件で部署を検索して + //検索結果を画面表示用のDepartmentFormに変換して、 + //departmentInfoFormListという名前でHTMLに渡している + + // 検索ページに遷移 + return TransitionTargetPageNameKeyword.SELECT_DEPARTMENT_HTML; + + + } catch (Exception e) { + // ログイン情報の破棄 + httpSession.invalidate(); + + e.printStackTrace(); + + // エラーログ出力 + LOGGER.log(Level.SEVERE, SEVERE_ERROR_MESSAGE, e); + // エラー画面遷移 + return TransitionTargetPageNameKeyword.ERROR_HTML; + } + + } + + /** + * 社員検索画面表示処理コントローラ + * 検索条件無しの状態を作るため、空の検索条件で検索した結果を画面に返す + * + * @param model ビューにデータを渡すためのコンテナ + * @return 遷移先の画面 + */ + @PermissionCheck + @SessionCheck + @RequestMapping(value = TransitionTargetPageNameKeyword.SELECT_DEPARTMENT_INFO_FORM_EMPTY, method = RequestMethod.POST) + public String select(Model model) { + + // 部署一覧を取得し、画面に返す用のクラスに詰め替える + // 作成した部署一覧をセット + model.addAttribute( + PageReturnAttributeKeyword.DEPARTMENT_FORM_LIST, + DepartmentForm.convertFrom(searchDepartment.selectAll()) + ); + + // 検索条件を元に検索を実施 + model.addAttribute(PageReturnAttributeKeyword.DEPARTMENT_INFO_FORM_LIST,DepartmentForm.convertFrom( + searchDepartment.searchByWithLike( + SearchConditionDepartmentForm.convertTo(searchConditionDepartmentForm() + + + )))); + + // 検索ページに遷移 + return TransitionTargetPageNameKeyword.SELECT_DEPARTMENT_HTML; + } +} diff --git a/src/main/java/com/example/rhizome/app/presentation/controller/pageproperty/PageReturnAttributeKeyword.java b/src/main/java/com/example/rhizome/app/presentation/controller/pageproperty/PageReturnAttributeKeyword.java index 5e9ec04..601d969 100644 --- a/src/main/java/com/example/rhizome/app/presentation/controller/pageproperty/PageReturnAttributeKeyword.java +++ b/src/main/java/com/example/rhizome/app/presentation/controller/pageproperty/PageReturnAttributeKeyword.java @@ -2,6 +2,7 @@ package com.example.rhizome.app.presentation.controller.pageproperty; /** * Servlet から Servlet に返却する際に使用する文字列を管理するクラス + * モデルに渡すキー名を定数化 */ public class PageReturnAttributeKeyword { @@ -9,10 +10,14 @@ public class PageReturnAttributeKeyword { public static final String MESSAGE_INFO = "messageInfo"; public static final String DEPARTMENT_FORM_LIST = "departmentFormList"; + public static final String DEPARTMENT_INFO_FORM_LIST = "departmentInfoFormList"; public static final String UPDATE_EMPLOYEE_INFO_FORM = "updateEmployeeInfoForm"; public static final String INSERT_EMPLOYEE_FORM = "insertEmployeeForm"; public static final String LOGIN_INFO_FORM = "loginInfoForm"; public static final String UPDATE_PERSONAL_EMPLOYEE_USER_FORM = "updatePersonalEmployeeUserForm"; public static final String EMPLOYEE_INFO_FORM_LIST = "employeeInfoFormList"; + public static final String INSERT_DEPARTMENT_INPUT = "insertDepartmentInput"; + public static final String INSERT_DEPARTMENT_FORM = "insertDepartmentForm"; + public static final String INSERT_DEPARTMENT_INPUT_HTML = "insertDepartmentInputHtml"; } diff --git a/src/main/java/com/example/rhizome/app/presentation/controller/pageproperty/TransitionTargetPageNameKeyword.java b/src/main/java/com/example/rhizome/app/presentation/controller/pageproperty/TransitionTargetPageNameKeyword.java index 90ded96..27f179e 100644 --- a/src/main/java/com/example/rhizome/app/presentation/controller/pageproperty/TransitionTargetPageNameKeyword.java +++ b/src/main/java/com/example/rhizome/app/presentation/controller/pageproperty/TransitionTargetPageNameKeyword.java @@ -4,6 +4,7 @@ import java.util.Set; /** * システムで利用しているJSPのリスト + * 画面用(URL)用の定数、行き先管理 */ public class TransitionTargetPageNameKeyword { @@ -14,13 +15,16 @@ public class TransitionTargetPageNameKeyword { public static final String UPDATE_PERSONAL_EMPLOYEE_INPUT_HTML = "updatePersonalEmployeeInput"; public static final String UPDATE_PERSONAL_RESULT_HTML = "updatePersonalEmployeeResult"; - // 管理者向け + // 管理者向け(View名) public static final String MENU_HTML = "menu"; public static final String SELECT_EMPLOYEE_HTML = "selectEmployee"; + public static final String SELECT_DEPARTMENT_HTML = "selectDepartment"; public static final String INSERT_EMPLOYEE_INPUT_HTML = "insertEmployeeInput"; public static final String INSERT_EMPLOYEE_CONFIRM_HTML = "insertEmployeeConfirm"; public static final String INSERT_EMPLOYEE_RESULT_HTML = "insertEmployeeResult"; public static final String UPDATE_EMPLOYEE_INPUT_HTML = "updateEmployeeInput"; + public static final String INSERT_DEPARTMENT_INPUT_HTML = "insertDepartmentInput"; + public static final String DELET_DEPARTMENT_HTML = "deleteDepartment"; public static final String ERROR_HTML = "error"; @@ -34,17 +38,21 @@ public class TransitionTargetPageNameKeyword { // 一般向け(Controller) public static final String PERSONAL_UPDATE_RESULT = "/updatePersonalEmployeeResult"; - // 管理者向け(Controller) + // 管理者向け(Controller)(ブラウザから呼ばれるURL) public static final String DELETE_EMPLOYEE = "/deleteEmployee"; public static final String INSERT_EMPLOYEE_INPUT = "/insertEmployeeInput"; public static final String INSERT_EMPLOYEE_CONFIRM = "/insertEmployeeConfirm"; public static final String INSERT_EMPLOYEE = "/insertEmployee"; public static final String SHOW_MENU = "/showMenu"; public static final String SELECT_EMPLOYEE_INFO = "/selectEmployeeInfo"; + public static final String SELECT_DEPARTMENT_INFO = "/selectDepartmentInfo"; public static final String SELECT_EMPLOYEE_INFO_FORM_EMPTY = "/selectAll"; + public static final String SELECT_DEPARTMENT_INFO_FORM_EMPTY = "/selectDepartmentAll"; public static final String SHOW_UPDATE_EMPLOYEE = "/showUpdateEmployee"; public static final String UPDATE_EMPLOYEE_RESULT = "/updateEmployeeResult"; - + public static final String INSERT_DEPARTMENT_INPUT = "/insertDepartmentInput"; + public static final String DELETE_DEPARTMENT = "/deleteDepartment"; + // Department // HTML // Controller @@ -63,6 +71,7 @@ public class TransitionTargetPageNameKeyword { LOGOUT, DO_LOGIN, DELETE_EMPLOYEE, + DELETE_DEPARTMENT, INSERT_EMPLOYEE_INPUT, INSERT_EMPLOYEE_CONFIRM, INSERT_EMPLOYEE, @@ -70,7 +79,11 @@ public class TransitionTargetPageNameKeyword { SELECT_EMPLOYEE_INFO, SELECT_EMPLOYEE_INFO_FORM_EMPTY, SHOW_UPDATE_EMPLOYEE, - UPDATE_EMPLOYEE_RESULT + UPDATE_EMPLOYEE_RESULT, + SELECT_DEPARTMENT_INFO, + SELECT_DEPARTMENT_INFO_FORM_EMPTY, + INSERT_DEPARTMENT_INPUT + ); } diff --git a/src/main/java/com/example/rhizome/app/presentation/form/InsertDepartmentForm.java b/src/main/java/com/example/rhizome/app/presentation/form/InsertDepartmentForm.java new file mode 100644 index 0000000..7c2d95e --- /dev/null +++ b/src/main/java/com/example/rhizome/app/presentation/form/InsertDepartmentForm.java @@ -0,0 +1,110 @@ +package com.example.rhizome.app.presentation.form; + +import java.util.ArrayList; +import java.util.List; + +import com.example.rhizome.app.domain.model.Department; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 画面から渡ってきた登録内容をまとめ、再度画面に表示する為のクラス + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class InsertDepartmentForm { + + /** + * 部署ID + */ + private Integer idDepartment; + + /** + * 部署名 + */ + private String nmDepartment; + + + /** + * パスワードのValidation + * チェック対象にエラーが有った場合エラーリストに文言を追加する + * + * @param password 登録対象のパスワード + * @param passwordConfirm 登録対象のパスワード再入力 + * @param error エラーリスト + */ + private static void checkPassword(String password, String passwordConfirm, List error) { + final String PASSWORD_NULL_BLANK = "パスワード が未入力です。"; + final String PASSWORD_CONFIRM_NULL_BLANK = "パスワード確認用 が未入力です。"; + final String PASSWORD_MISMATCH = "パスワード と パスワード確認用 が一致しません。"; + + if (isNullOrBlank(password)) { + error.add(PASSWORD_NULL_BLANK); + return; + } + if (isNullOrBlank(passwordConfirm)) { + error.add(PASSWORD_CONFIRM_NULL_BLANK); + return; + } + + if (!password.equals(passwordConfirm)) { + error.add(PASSWORD_MISMATCH); + } + } + + /** + * 仮引数を null or 空 判定する + * + * @param str 判定対象の文字列 + * @return true:null or 空 false:null or 空 では無い + */ + private static boolean isNullOrBlank(String str) { + if (null == str) { + return true; + } + + return str.isBlank(); + } + + /** + * 画面から渡ってきた登録内容をまとめ、ビジネスモデルに変換 + * + * @param insertEmployeeForm 画面から渡ってきた登録内容 + * @return ビジネスモデルのインスタンス + */ + public static Department convertTo(InsertDepartmentForm insertDepartmentForm) { + return new Department( + + insertDepartmentForm.getIdDepartment(), + insertDepartmentForm.getNmDepartment() + ); + } + + /** + * 登録データのValidationを行う + * + * @return エラーが有った場合はエラー文言、無ければ空のリストが返る + */ + public List validateParameter() { + final String DEPARTMENT_NAME_NULL_BLANK = "部署名"; //入力エラーになったときに返す項目 + final String DEPARTMENT_ID_NULL_BLANK = "所属部署"; + + List error = new ArrayList<>(); + + if (isNullOrBlank(nmDepartment)) { + error.add(DEPARTMENT_NAME_NULL_BLANK); + } + + + if (idDepartment == null) { + error.add(DEPARTMENT_ID_NULL_BLANK); + } + + return error; + + } + +} diff --git a/src/main/java/com/example/rhizome/app/presentation/form/SearchConditionDepartmentForm.java b/src/main/java/com/example/rhizome/app/presentation/form/SearchConditionDepartmentForm.java new file mode 100644 index 0000000..96eed52 --- /dev/null +++ b/src/main/java/com/example/rhizome/app/presentation/form/SearchConditionDepartmentForm.java @@ -0,0 +1,53 @@ +package com.example.rhizome.app.presentation.form; + +import com.example.rhizome.app.domain.model.SearchConditionDepartment; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 画面から渡ってきた検索条件をまとめ、再度画面に表示する為のクラス + */ +@Data +@AllArgsConstructor //全フィールドを初期化するコンストラクタ生成 +@NoArgsConstructor //デフォルトコントラスタを自動生成 +public class SearchConditionDepartmentForm { + + /** + * 部署ID + */ + private Integer idDepartment; + /** + * 部署名 + */ + private String nmDepartment; + + /** + * business (サービス)層の SearchConditionEmployee クラスから画面用(presentation 層)の SearchConditionEmployeeForm に + * 変換します。 + * + * @param searchConditionEmployee business 層の SearchConditionEmployee インスタンス + * @return 画面用(presentation 層)の SearchConditionEmployeeForm インスタンス + */ + public static SearchConditionDepartmentForm convertFrom(SearchConditionDepartment searchConditionDepartment) { + return new SearchConditionDepartmentForm( + searchConditionDepartment.getIdDepartment(), + searchConditionDepartment.getNmDepartment() + ); + } + + /** + * 画面用(presentation 層)の SearchConditionEmployeeForm クラスから business 層の SearchConditionEmployee クラスに + * 変換します。 + * + * @param searchConditionEmployeeForm 画面用(presentation 層)の SearchConditionEmployeeForm インスタンス + * @return business 層の SearchConditionEmployee インスタンス + */ + public static SearchConditionDepartment convertTo(SearchConditionDepartmentForm searchConditionDepartmentForm) { + return new SearchConditionDepartment( + searchConditionDepartmentForm.getIdDepartment(), + searchConditionDepartmentForm.getNmDepartment() + ); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 88b15aa..6eca8cd 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,3 +1,3 @@ -spring.datasource.url=jdbc:mysql://localhost:3306/rezodb +spring.datasource.url=jdbc:mysql://localhost:3306/springdb spring.datasource.username=rezouser spring.datasource.password=Rezo_0000 diff --git a/src/main/resources/templates/insertDepartmentInput.html b/src/main/resources/templates/insertDepartmentInput.html new file mode 100644 index 0000000..f9a6b0d --- /dev/null +++ b/src/main/resources/templates/insertDepartmentInput.html @@ -0,0 +1,67 @@ + + + + + + + + + + + + 部署登録 + + + +

+ 部署登録    +
+ ログイン者名: + +
+

+
+ +
+ +
+ + + + + + + + + + + + + + +
部署ID + +
部署名 + +
+ +
+
+メニューに戻る + + \ No newline at end of file diff --git a/src/main/resources/templates/menu.html b/src/main/resources/templates/menu.html index 6d0ee4a..1983d82 100644 --- a/src/main/resources/templates/menu.html +++ b/src/main/resources/templates/menu.html @@ -27,6 +27,17 @@ 登録済みのユーザ一覧表示と
更新、削除を行います。 + + 部署検索 + + 登録済みの部署一覧表示と
更新、削除を行います。 + + + + 部署登録 + + 部署の新規登録を行います。
+ 社員登録 @@ -59,13 +70,13 @@ function selectDepartmentSubmit() { const form = document.createElement('form'); form.setAttribute('method', 'post'); - form.setAttribute('action', 'selectDepartment'); + form.setAttribute('action', 'selectDepartmentInfo'); // 動的送信用のHidden // 動的にFormを作成する場合は何かしら送信しないと、正しく動作しない const inputField = document.createElement("input"); inputField.setAttribute("type", "hidden"); - inputField.setAttribute("value", "selectDepartment"); + inputField.setAttribute("value", "selectDepartmentInfo"); form.appendChild(inputField); diff --git a/src/main/resources/templates/selectDepartment.html b/src/main/resources/templates/selectDepartment.html new file mode 100644 index 0000000..5358cea --- /dev/null +++ b/src/main/resources/templates/selectDepartment.html @@ -0,0 +1,114 @@ + + + + + + + + + + + + 検索 + + + +

+ 検索条件入力    +
+ ログイン者名: + +
+

+
+ +
+ +
+ + + + + + + + + + + + + +
部署ID + +
部署名 + +
+ + + +
+
+
+メニューに戻る +
+

検索結果

+
+ + + +
+ + + + + + + + + + + + + + + + + +
部署ID部署名操作
+ +
+ + +
+ +
+ + +
+
+
+ + + 検索結果はありません。 + + + + + \ No newline at end of file diff --git a/src/main/webapp/NewFile.html b/src/main/webapp/NewFile.html new file mode 100644 index 0000000..2571001 --- /dev/null +++ b/src/main/webapp/NewFile.html @@ -0,0 +1,10 @@ + + + + +Insert title here + + + + + \ No newline at end of file diff --git a/src/main/webapp/insertDepartmentInput.html b/src/main/webapp/insertDepartmentInput.html new file mode 100644 index 0000000..2571001 --- /dev/null +++ b/src/main/webapp/insertDepartmentInput.html @@ -0,0 +1,10 @@ + + + + +Insert title here + + + + + \ No newline at end of file diff --git a/src/main/webapp/selectDepartment.html b/src/main/webapp/selectDepartment.html new file mode 100644 index 0000000..5358cea --- /dev/null +++ b/src/main/webapp/selectDepartment.html @@ -0,0 +1,114 @@ + + + + + + + + + + + + 検索 + + + +

+ 検索条件入力    +
+ ログイン者名: + +
+

+
+ +
+ +
+ + + + + + + + + + + + + +
部署ID + +
部署名 + +
+ + + +
+
+
+メニューに戻る +
+

検索結果

+
+ + + +
+ + + + + + + + + + + + + + + + + +
部署ID部署名操作
+ +
+ + +
+ +
+ + +
+
+
+ + + 検索結果はありません。 + + + + + \ No newline at end of file diff --git a/src/main/webapp/selectDepartment2.html b/src/main/webapp/selectDepartment2.html new file mode 100644 index 0000000..2571001 --- /dev/null +++ b/src/main/webapp/selectDepartment2.html @@ -0,0 +1,10 @@ + + + + +Insert title here + + + + + \ No newline at end of file diff --git a/テスト仕様書/~$単体テスト仕様書.xlsx b/テスト仕様書/~$単体テスト仕様書.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..48e6e0d567573d6064ac6928a16d86acb166f690 GIT binary patch literal 165 lcmd;_oHuof!gRNe6$+#PRtCkq7ZVg1P6wB^C@|0(0sxdS6l4GZ literal 0 HcmV?d00001 diff --git a/設計書/~$【管理者】メニュー機能-詳細設計書.xlsx b/設計書/~$【管理者】メニュー機能-詳細設計書.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..48e6e0d567573d6064ac6928a16d86acb166f690 GIT binary patch literal 165 lcmd;_oHuof!gRNe6$+#PRtCkq7ZVg1P6wB^C@|0(0sxdS6l4GZ literal 0 HcmV?d00001 diff --git a/設計書/~$【管理者】社員情報登録機能-詳細設計書.xlsx b/設計書/~$【管理者】社員情報登録機能-詳細設計書.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..48e6e0d567573d6064ac6928a16d86acb166f690 GIT binary patch literal 165 lcmd;_oHuof!gRNe6$+#PRtCkq7ZVg1P6wB^C@|0(0sxdS6l4GZ literal 0 HcmV?d00001 diff --git a/設計書/~$【管理者】部署情報検索更新削除機能-詳細設計書.xlsx b/設計書/~$【管理者】部署情報検索更新削除機能-詳細設計書.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..48e6e0d567573d6064ac6928a16d86acb166f690 GIT binary patch literal 165 lcmd;_oHuof!gRNe6$+#PRtCkq7ZVg1P6wB^C@|0(0sxdS6l4GZ literal 0 HcmV?d00001 diff --git a/設計書/~$テーブル定義書.xlsm b/設計書/~$テーブル定義書.xlsm new file mode 100644 index 0000000000000000000000000000000000000000..48e6e0d567573d6064ac6928a16d86acb166f690 GIT binary patch literal 165 lcmd;_oHuof!gRNe6$+#PRtCkq7ZVg1P6wB^C@|0(0sxdS6l4GZ literal 0 HcmV?d00001 diff --git a/設計書/~$基本設計書.xlsx b/設計書/~$基本設計書.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..48e6e0d567573d6064ac6928a16d86acb166f690 GIT binary patch literal 165 lcmd;_oHuof!gRNe6$+#PRtCkq7ZVg1P6wB^C@|0(0sxdS6l4GZ literal 0 HcmV?d00001 diff --git a/設計書/基本設計書.xlsx b/設計書/基本設計書.xlsx index 1a921a7447cb456d519f6c604b910d30d5d8c5e1..6eef10dbe0f01470f79aeaccb5dfcb566716d10e 100644 GIT binary patch delta 36523 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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 Gp!|P%ke46; delta 46731 zcmb@u1y~%xvNnuca19XLU4py2B)AjYEw~Org1cLSyIXK~x1hn@U4#5fj{f(aE8ltU z!){M?ZO=^2TW?p@%=Xf9kI>csrcxKS<`&Tc0&v~L1uKFE13N+i0|ULl+^m^g?LJ!> z+Syq#y4hIQs_WY=sbB(<8@vtqQ)?u38C({I>?yI7rU{Gai%!r*O3qfR9jiY=jfOws7^VEb{(YHsOgV7_s?^_Xz2Sk3|_OBge!t<=!vpt4|q@8@hCO?ybD#|>i1nvFc8!O~JDy}+3t0jqr z36@2UfLLMZH>ac`(W+f1{2FEG4L~LCQobMknA3BM2bYLz)g3v;#PvFMOb6 z7$&*v6)k=jAzq^-qSk$Wn28udlNw=J%V&=Xld)xT78+7Sp+Yn!m96ytN*Qmir<1DZ zo6)HK36FAeU{49minD@lsB_~(lfnK?dCBC;89%L`PxDDnQ`Yq7*r=ZE=_Vz*g zZ(A_2Nh9!h8+_|Kki&hF9pr!u0ow%uPAmbE*}DdK!q2vEVPa3>YJQbWue{`39y4X^ z>>hh6k{r|sjfNu|fU$xFPJ^M$umrr#u8bJ;V`NEaMP2?4+dtlR4hK0sd2n`jFqV@V?qUooS9oR76yl9H8i+LF(XU9Ub>zc%%j2L*2#mXkjg{?z57$3+l0bxjKb+8ZXl z&n9HiMDBx)oOJf?#!BK&eYhI$AMe&nZkAX1KGR1dBB42Ec$=#b;2^y@q$mCo!r%HO z3vK*beo%qcIih`QIk#dauW0|aATOA;6^sG!RyfN{hj!1atZm@7JLHOznTP!z9N;gb z9Y2pM@PcEjd1T&GSSF6mX zri2=x=&aR*dXd5*>Am|fbG2c~$Rz|L>b||}fDE;h;X}aFE_k}qu+Y}J`g}eqed!{k zDllL?impQvHHWD-3sJm|(Cyuxd{(UZ0nwB@QCGF_-DA@@9sVKkW_UO-g0D(bcino8 zAtxMeagTuAQ*!kd8O1Y*$wTt{HS+hXNZaek8_vX=`MflmX&E6|EJU8RvN;s}sA^5l zvLQLb&-}}BqAa5__(&-w-BL)ZJsJ(EsS1j+Lry#0`%;f}JMIK60|hNKh6fo5={(nc zg{a`aHH`*T`I*##x$+P9za!ArmE#%>Lp4POaCU1Z$62odD2B_TNGjzF>4h|8;$B}2 zbN8;QAZG|DxT*kWnG6zaCXLd5Xmva?Eq~f1tOi?sgEF4C1W4Gjzajmh_DkL;B+x6H5I@tG9|?aE;a~Dx=SQD;xcRF1&s=a9zJe?CBknq5{AHb>#Ys= zccx77j6$|Gv0v6f>eYtT8fwOdr|e8kkQp4<8q8P6LkMV3nlrD%Ib^yCJ+;Nw2~O5F zKo>MFu{kSh=#m*yBp?Q1%Y!>laz#f7~RWw)=1)Tk>>Cenr)&f=pSF{GZOnp7-F1Njd8`5|}yxB1? z8YSPM)z27GKV-GW4evQRoni>iQ;N+mIbB^3Ey^SEXRkozxqTqc?uP5PeS-pIM%QZ? zYb3pR$K&XKz(4HKjZ_p#I<~kw83^@st2{`e7s0|%RuUS-#~SM_6+FlmJUXEpaK<{* z4iD{vEoqh-p)2hopGRld6qb0o;J?}IG?p4XNiGn7un+!9SZBFp@&XP9_VNPC+%GSs zOR{#qR4`%BD$rXB(P>osT$TVQbDpX5aDJxUr^p`C(5WDEIGL}ciR9UaAw3XPRun4p zU?L(A99}6O(|i!ij~$O4p9IPDR#XM8^~d>N-mM6bDOo1ZN?uN6PLUlI{?{gL~$03;t$wY;- zBgmJ^%RR<8vw(L4%X_)ZCBNG$srWs^$H~j(fFZWMGP%zxmFbtlSF2X{Q%Jjy+*Sq# zCi@@Fw%yGDcx+toaQ0G$YuVC6BawUU!dHthPyF*4pu>@ikn#U36Sx2Qqqm zLo#ad@cdmfJh;Db^^mrI9W`CDTA;qFSmE8fzI+ZR+kP7~#1ffc z^p3utODoc$;oYVicOST8IGGyVrw_kt-|?FDal1u2T)o>oYz2n~77fwdwvK(3-g}su%uNdsr2XdowbD2B$wEtDK%zl%W){ zu99`8Yv{upy4Mb{@^thqNv?ot$@>iSc4^r^E>pYTCzJL0X%pii#iHalBZ)_h6eA&J zl#6MBWr1WtU;$}?Ve!TS-vZVG#{$KIXdi5ULP`5-EmQTd^QW*Xidw0h&~-~*`DdLJ zaEElHFRMdDkgk5)XL_wR7kQ7gpNy4BM*BokM+4dL5iI}?+$n3e+y!f?n)PVYX_B(= zp!Cb;>++%z?Uc7Hb|%IF2`Ol5UnP>|BkcNyzIpaS-ubjnE?A(5;gr@Qqi>wgrJ;^5z)P9qfN;P_HLlUQM6u90D^KOemBU2s@ge|7=B>-HU;x`)LJ(sotWFYg$gsJ;>U zFWJ8U1^fs0Lvcfph=fKrNolBeb)l;zR@Mg8QP49QIKvOiYUp=CV5lWm_5`p~(z6;Q zzz@r5n01L@sHIlU1k_Q|a~RZ-mAVA{jI3NlQ{(Njl&oL8N1oZ2&JSaojH@2zyV`>J zf%7it{p5K`uF^-7NBXXAOT2!KPfa;USY( zJ;x!hQtbAm%wG$5E*usdm4(v3`QRt{%EX-|?1tofQK9KE0^0rvOnkb;?38_mKGl5A zB|;9C)?NWs< zwUc)~?IwTj+rOA9hqlHDdUMDDFOvAQ97@)u8lk44AHuURv$8UTZib=E*k?@8bn}A# z3Qlaw`37ZAv}xaDtz*!T16glhXr8%gpV@K1yGElUJ}kt4!aAz!i2R_pu0IudTT>uu5X4G2*D5J2$9_W2RX( z=B&LNSNm1>zCP&q5ZrRyQAEAR52Qh}EWC!Ee@M0;smz*9((iw|G*;@fF1!u| z>Ec=NExk$V1t?8MzG~^i;nxO8E3&|jp0(&)h@ZFMb%AtWMZ zIiFx}Juol*S(H+NwYP6Y+_YyNwIG7Th-wfig=;YWEj~_4N(jLMN9)s7O>UV z0=;pLqzQtJi?+(6K^E;~X=g0c$kz!H(^hIBflJW9Ed)jJ10XkCKaB7e0V13% z9PQjQAOMvwMr&9V_SO&%mL$Rp&QdR4M>Ck_FpJP2{1bX*u!wTb46mC!+GO-ZX4)t9 zYnnMT2J^7Q5@m-@R(fAl#72Odk?n0+aKI3Wn4Aa?NQknu|HS$#Bm(foB9L8&<94qczS z&y^*n1)fly7W;hHhBr!c{$(lDs++(1(h@68P+Ol6rD4f-o7b@SDyus2=2`bUB3Qu{xTldPY9BI=w_nRb zHu}fSfFbdpn}G~ws_!a%9q(y9Gjg2(p33U?^ZBeGyI(=w5n>M$qudS19`?lU9_tWiI63xsF^*JCdS z1F4?(;8#qlfs{L0xv}i0PF%1xES8=jKK{#8MI7=Sb}Y0!L>-7R$?Cp+pz=RwLorNm z+w;im{@vjU!R3_{5we3|e(R#o0`QOdTe>W5XT0m&cV0176i5PY!v<@$*C4+3D|Oc$ zs>Pg5EAi7X!c4dya1?Gke>UZdBcT@KODuz3g+?rtF8*j@uKn;hL?h1OOltkfamq(aMF*m-5=w2-@I@3SNR`~{QFEcCrjGhpX1b@+n*mYZtL}?e$(>q}XCV z+1g#J)$rrB{=7TeBx-*gyj0ZVAY9sBijq7Ix%kn(w6CaT$L=%XMo)Nsvo!wA%kA>$ zGEMO5P|)Xcr~T!u`Mb~MxIVw<#rbMtMqiwmyi(W^i8#z!D;?(U&^g-#EpE5k7%god;Pvza zpxU1cR$tE5^`G}g$Di+d+kvMvruOIU@l(B*-Q~lVCeO>uW=?%RH*NQRrWM}6!%WINg|I%-Are399=QS*LU^$fxhxhUsj;TH+!n%Gv1+;O7NU!>F1g;>VFmpF*DZmU z^LeJfqG$m!b|PoT_tMm1I#h;Jp;}9L#uGp=;8eHO_35O0afImEq)^`Ar&d6tC6k|O z7+UFK_@|$iP$e#88g=hFi;v+F=W=eifn5Wu&~dw!Or}IokFU zf_AX>m&(11f;(EwjLH_7B!iQV#;yR>Wd{%Ij|q~M#r%G%X&9vkQC67C*Pwxf%Ye_- zc^DDa_e7kopC)$qYt`2$zb~I<8U~ye?p8RFQcp(qHx&#@fA3Xwhrr z(XEKr@47^a&RagG;?q^ik0SrDm;rDlxKJrAW=L7MlIAUk#Q#&L2>SE=T1j-CP3ZT& zTKSkM4sn?!Od1>I+**0XQ@TyJq_lb(rNw+H_p~lZlzn9&yGzR5vrFY5^6W}{UG+lOw8>v0xR>b0#8SAySGTUIHz~R1;BmgIomQRK?O!R(XYUQ zlxcPYj48ib5&|ilDgP@H$N^MVzi<+a0Zdl^5t26p=+%CuB=`f^)&55$u)(-R#4Kt? z<$a$b2Jv#(O|1~;lFM22jN1BqBjEALI83b(7m}-4OpV6+G9#q%b2voOnvS>VVu4*(XctEjU)gW6l~GE@XcVIxYWaT-Vm_YWQZAIu0T!ZTvuu|%9rE@ja& zs_(Op*vH#s-?2iRPp)J!H0tY%j-bIe;@Gi9TuiQIu{4_PtBiO(`=>={V4CsOqOf?5 z_T_DLp6{U=(F@{MI#g3*hhSn72h-NT` zT@Xb^tr1)Q+_t6?*P|2Bi5JH%VKp-Qwwy)RsHM*<0vsQML&ADw{%tjjiP1=3dW0~3 z9EXI>$l}|2mSfTaf;Pat=Pz)8I(Ea6R$UMtr+m;V0`jfCvFQR|DM40HaX$%_LGFuq zL<@X#2g4PSh-NW{ND(oO<~9b`6j6(2H-=mgaf#;N0%IY=3fZ_#k>Z|XPVh&Hk3)J& z%t4B;L5lB25_BHjhZ#DD8M=ot?C1-KK*N8}@zq*x0eD-(VrDeammBdBzlP(h%_}J4 z3cNo0aJ(PS^c`ZRBcYwVh~EsLxTkL-6ndq4fK$Lj$8TW*Z>GLF5$j5!OeubT7<>R@ z4G1ST8h~OA93gfbfT#{ACAJ!XsSZ3M_8b5=l%PfLg&^J5F#>m>rNVzhEg$&xQ+;B0 z1auE9u;T{OhW@uWftbR5Jl&q19g;!)dC`FOog^>yPwn>Py4)WW3*xh$yI>c<+0Oj;*pqZBkl zaV_;EmlgWY$>#r`Yp4jMeC~i+9sDTXcPsSOy)Ni#6okK}M?yyA18hm1OAMnZ67`1*a&eH}~dmxhM!7%7P8N$lZe+gk=u7aVw=@_>%L4=LHW*{hL3}CCyX1kaY6xVI}_>*?I z=dC~oNYrwjEZ(wO?!Bd}zCGDUms)KOb0h^$8OK79&OrTn@K=%Hj|h3nIO6U)nc7v% zUkEtk5T(5whn>)(_-XY@{Qm;|Tf3Okw-x&F7 zv~5 zE|!J-Vsw2jfrTPZbW8IY{N;&^+99J>f?HWL7ZvO6Nmo7K2Eq-5U~glVn{|R$S@WHb z_|1xLI>x@ItAoPUDd-}qz+d~kYp){otLVA59LRmjsHLn?2U~ZtVRT6t41(|C4}5;F z@U6V3480A{bh#&rPFj`Ymj6rPGmhCz$M1c_I1!BU?(c~V_~%R(hfIFT=+)KI9Q(5= z?2n`CJSC2zTyfO8oBwMF|F;PK@vinX|zYEj#wd?3(9 ziv^u-wPIiec%3HRuXE$E6~qaS4p83^wgn{C{}EAInwfW(#jOxZZZc@hbA4ophzU;>aHfliXyYdVbjA zM_pDW)Z~|R&C98%YPK(K+;7L&c_ux)qWJMY*G~YbfcitbZyHPiAswKTYoIl{;_Qm; z{W0uy5=Ug3ya}1O-9I(%rpsCqfPv9Aq(0CSeApzs}q5YydHmG}%-#8;QL1`>FI=Vg_lt zsnl8$8)@FDZ%)MSuIH7WByvzE%f0=f1Fx8fykZi({OUEgS2Xrsm0f?7uMy7>{MB`8 ze_RLuD$aH^zj0jAWvhby%gmkAO&|6o_DR@F8T+Z92U!nfHM3?gR;T9vZ=Lw4PG8W_ zeOroPKx&T>k{0|+Y==^WGo~qIUVh7#)D2@WEqF!jhO&z@rY+=7e#_1fT+Z4z1dF)} zk}|QQ2Rm5<5)?n$2{AoC1oNNiqX0wPRj`5c{-md0_R24a4{^(zAMJa(U+7tsj~L(8 z*gE_z{{GM0(rZJV#iT?BVR0EU@(PR6D=Y(luyTLJ3Pdd~s;NK9KUhJ600O97{($x7 z6|9@TgB3UrN)iGbe>IA`iH;yRVosNfZn*{G@7dLR%9o8iLh8SX6vSm9w%;By3aE*l zfPlxy`t1xN(UH$9pIY=m)Dk-dUiIsL^pCH45UpNYh(9gVpBBdFPqJn+KnAuz;3)#h( zn_S4j<~PC~u9ISGuY`yJUKt($;ukks^DD#8UbT~dlz(X74pR0&xPbh23!AC-%pe?yzOn7%~uxtjl%_q~71oxor2dqK6x zimudXbJ!mbdP)eW8K2ySr(+cT<|o?~JMkGG;Erioeg9d(`1Do1|404&s;&b6(?b4f zq5rfXswZE1O1uJQwgm$0#b?ez0hB$Xuiq^vAouj0blvagzl_BPnUPBYe=U{%7tU-2 z1$p~d7X<&R0A02S$gyJ~^G{8$Q}K^_7ksh1=IvxMG z7S;y|$7+-n+KBJ_ahcG_^*kq4!8@;Gp z;C{GpGcUVIU3G~(F6QI<9685FC{)zC6LTj}G4Axd_3SQS-ZLjhu2=IYJc_%rdwmWo zP&daH3)&gKbk}Wklhe|w!kzp)b(>RS>^!yKu5w225|G+pA5KehY}q-dEPOq-zLTzA zaQY^D6b{>;oxhuWdF_d-c#e{V%<(Cs=+*?Ghs-?!H_^|-rTs7$FNN=4o`yGgKHfP7 z{I8?fNI*zS8O@H^20%%A+g=#@#DdloG9%w(OX`ZznI^R&c12muiPjc!^`uyI(Hin7 zPwyLo#9ReI>C(}Io;(kMVfD!ndaUs_iLzgYIYKtRTmy$X`OMmpmOI5 z_q&D=%oCD)JLSeC)5O|-Nk*5~-iGOMrn#n}7&&3yF}RYWrbuM?6@qr)5ou?nazVeV zBzgcvFl8XzLG1{++PU_zkl`1gOdi?)?uUG(vv=1|3;)#8^^07dT^3|!^y-beAr*>) zw@lSM`lG(0OklgrF7I!Ya9RiLyT@WRk+E>>I9l3n$#Et`-(T&rJca=n^e zl3C@S_ws1IZ)r=M4Jyj}LG>H^xoHk#RQ5?DSa@o$A)qno9n#@KR{fa+N1!W|Enw4X@7|?cO|y$08LQQmLfgLN@Y?9g!ZPYz?xwPXvo67?KQf|2D7u z>5J)4c2KHoD)L0Ikq^$};5pK!Hd7n@riR7S$cA~#NFd$o68R0hwc9^!)@Oata(luE z?LiDXV`uoxt|ub;K&mPHg;tIS9hrkiZw($`cT3B4@-jwJs9eW4h$EvXOiE+t8NXZI zs=GFqGfKLObvPPZ6l_c0O||8c=zWKY+b(N%s~@Dyh<(Z7?_)XtP{X|xO|n_1)5)K= z@W4%oV9ov8-&{YQ?TjKnd+^T5%hW4`=27#c3O+`PBKiY-&z2r(dCq=_7*%e+KR6aJ z9WIT>aR&DFlk0bhfXjB?2nS(^-jD0|kC``B3?XLyiBsK>sro!9CQc)o$br^!T)42_ z+3i~G>o;V3s&~G0*ip-A+xwchp@r_89L?iTE+5L$ zzj=M&(nXOGUO#H}r!sq}_%SymyuL2?;>=6^t_|Se<+df{_lSFdqh$XwxtT)++b`LPkdUapcpcf3WXGYEv8Z&W zP)Yh|>E2lF(XPc^q38X4Fgmx|a=*9zGfcgr{Q;!cD=Q^TC86QXUFs|r#t*g(J_yDO z=0Iadt3$ORS(KOoBx?N&{R_hig9@X}ea(Z-1I)wC{mgMDF((PLy~VbU>L(JRTBT9b zp?amG)1gMCQ8S=^N=Ijuo`_$D?%`~;XwjO;%g!P+B{(x^GTEDscBD8%n$04oYYJjs z|88;9EGg@o`aa&?{IEUzBe?4#qQAzIlW^n&x)ULXPWY2P(DpDkx*lX!le2lhjdMAC zx{K33#-umGTnQUym-@I%;VE>4k`%%|BtzApq@TKr;VPxSKbBvD|AKy%3XWNL`i17yV1UChH z1V04B1b+>d2<{7}40b`2M>{52l+3*xA84Hb65~6dI;B6PLk&t#q(eJn89n#Khxg(_x(rgT+*BJ3f7w@E&k91|6rlG7~N4ls6 zuNhijy5w6&N`sNc02VWhzI4U6juM*8CK0hIS4;O;;JfOYyOr+Bv)t*LyY{9T-6@Wd zK>79z)ADFgL&ipQU_*z_*Gd;gvA2#iUCCi+eL9iMJAMHyyYKpR;>A!mCIu1CyN=d# zx?O)tdwq4FO1$fL$fmLq{T%!en_(paNsL|0Sqw=mEjTq;E4UujhRl*|QFumpMtnwe zMv_g4O^i*1O@d9hHq1QK9A#2~l=KU{2M|Zh1s@tm%nhF!N6Z6X97oKHyFC1ufV|!j zEs$(mJK!kR2j7z503q22{|=Wb{+i?{HAe(96o1sdYBKy*??y$TPqL}ISF3CEH{jkzrFULuR4Qbbz)?@YijMRX{dmHSudn96ZVrOC`;xwUDAuXYLUu#GU$OZ5z z@G0mi$SGJ>Fjgp52v!(?6}IlT;cnyi2xZ48Tmr?toZ;-Iu-4#MTDPfh4mtJSjA-@Yy$tK zs>J29*Jwa#q&N`?zH1HPnIZ#CCxF7h)8&mB-n(w{*M{Ms*wu>auth)8?# z6{R@Q?WUMn3(L zcY#qxuiif(Js>$C!z0Ec#UsHZOC??uXM@fiX|RU@WW@!Qlds~C;QRwp&!JJ;tsbNB z+m$>%#@|1uk!G1bPIgOl&X1y5PEqZw3XJ$_T|cSTJK}w0P#)l+mA>e2|hwjQf5q^&gdYE?Z1& zcBF!T-IDI9+$IN_#k)qrX_vrgH$Q1CDIF4WHyHAs;cy7M&Jf;Nh@C!#$L*JKAaYt8 zjvdGQqpB=hf>~W8%eDPfGrxq)h+(?Nvh|U{E>Uz|X&O>;#5*wDB`J?RmuaK9Y-tOC zlVDLOvFSsf46<){nJJll+6V0vQ5f)}Ng+q;pW#C9t1KlZ#(KU*h;XE7!(^C3il!eU zk+U`Gh=_clCxyMVfd8_pdG;K?HQ`TeS2d z=7bBK>C?B>$X0o8+AB?eycIZSExpjUl5ZIbTKozo`lX7MW>OE8W?9PJG9ay>;-T%~ zG1h+OOfVR*IDiDEW?sV?4sgZOfno;ztf(*>3=9cG574iR9G%>)O&nhf z^dsFRyQNuNfT;52%Lm_V0?JELnZ$R)7WCRyzT|M0IBzE~VHiGQqv@%{%9J8|ORwH? zS$EvDB^f|+eCnNep%l{l&2+>Y^n)y9_bhlr-r{Js%KU=2{W9a!hmp_Q$u6Y}uv)%G z>?f?>A}gZUyXi^6yIHQh{(0T7YzP0XVnKP-$=Z8fYhUkha-jlnKDeh-ZcjaIVgiF- z!mrcix{ZwpLM&##Ps7FV#=j7H7raQG1vPW|F}687xAgjDWmH-kOZTbn%U9;UZRF2W z2fej0Wi`s477+}q7?fjEH$i1SUea*S7sd!8j=!wnJDH=>X_)mOXwY-afH_+}z4poK zo_!UaGChP#jNxoPNC+wPA8UtszC^=rs9!xH6Ryq9546n0$|&{ z&%pS>^*O)ui>d4R$mn?D>iphX%G(sQhJE4l2snLw+^M+|xZaL1U37TQc^t$vC$QX6 zAir@O#Cbe!w}`nhne?Xnt$0*{`2 z!svI>>4e>eMe9(v9-Z>%^?BYW5`4L`Ti^Zue0_2Zth7FzHWT@{-QIlPD@rlN-Jxxe z?KIv=J^bU~L6FzueP*4F3_9qU?7NDJjei`H2p(tkA?bfUtz?ayf0x0SN#dJl!wkiNd|#N*JlRyow1b9Hhl@85J*uMl=B)tS`srK=GS_?7*)Q*1OFGT{3&Az+d=~MLljY!A-Q@vQDarl;tHD;EcEJz4)y0PG&iE^Y zyS)6?FJjsF(Ha2kr}xCls6AscJO^NYo3=kz6JSFTUW^9kp}}DwTH2j|(WrpskVesp z_WN6z732$Cl9V_^G;=@9xniGP&YpWy$7EzEARUiYv125>$)@7^77$8`i4w#h`yEgA zjn*6b`ueMkN++EOj_zhV=};zU2;; zI_FEZe`YLXORA^(!`@H4juRdi++XG{ZhF8)OlMoGAzI{0f`A9~ZIu4)EPVQw}D9U@Vwe=0Z4PTRps<-dQTPpK5X zG`W3mn8%>kXZhRQnehROvcF5;e=udOd!fh_&$T{psd7=t)!WDq+fiXHhmgLq<-1LE zLex3L3gFAE#gnR_F@gQYF>vR|{_<{``u2opyNQB`&S*jVC z8Wj)-2)M}+ha(9n;e zcY)4h%08f=Q!1}cvKJiIej)uWyK5;XNbkSi1NRWpEuMYUOOzV;Wz0pW`wMJ_JL(N5 zl435!_NFK!C#L8fdy%Lq7$RvuoSw6N2rV!{(qZzp%%dkJhKlVCs(m>wg2?9EEtgRk zI5q0IXi7(99hh>t5Ckgz;GVQM==`n&{b<$b(HQ96OLN(-Yq>@1lKj4VB>m6+^_p!9 zvX#PXX=QgEgQk#BPoUM4$UWG3WX7X=v1rB#jA=N^DcBrQ)wH!TR?1y)v>h#asj5K6 z4vSqNQK&=&QFgPCbIriB%i`V+f0=Y2u9aNERmR|{>d1)_J$fw zbWCKb`Kj^C5LS4`pG?;mya%JR=z?Gx!)Ka}8FAL#WWH+j)rty7TX3`~y@{~^`pv27 z*by2(s#(H*&M8&7cFdtyU2@DRR_O#uM(E@Ksqpl^X&x_Iyop>;ypsN%1|f^Oj=^)} zuNMtMcvq5>+F$!P+Mp$7^YM;B-N@T5LnZk-SXB@H(`WqrxOMvsL7p0U`(I~WObDmx z>;jF0R8j)aZoi z`Py~_Qfkua2ZLE6EqmyrLP*%=cw>C8jF9)b*bU+?x0j_2Dqpp+Wi7u0o{>fsH$?_M zG={M?aALZwBuOkqiB|7noxf&&oc6h9jdi_8bN==t)SIA%I0SkHHf}OYM7dVS1<5Jy zJrBf9nVP~eLWa6hJAga|F!)HK_G3D8FS=G5PZ24%m`nSUzDY6AFWOC!U=_zL4~6F_ zfau(49OvgvJK%qIiuE-ef@hi_<5PMoLjobG`de>ozaL#fwQwz1L)IimWz2jG5OxVM zmI!)YZg}sKBwAQMJq3cFuUkTR3_ez}PmP2yYc-YIDynrAOqqSO2ZE=pZjCKEI*Wnm zt_qIFC2_&rEy=4Nr;|mcxHAdKJgLwd*^IDP`!o7`jG^pOdjlH|XzC3i!z`bTzcmEA zHiS@F3)csPHKd9^(k-3w$I?*mZIUi;lV?;y6;b2t6H@I5kWeG8k$R7i9&030dNFuA zUS?A19L{!O2uzmt0-^>`yk)vJ8@%N>A^faSI!HI%c=2r^b@1}rj*|q&liPbx-~4wi zk6B9U258S56n19!9or<}PaLeSg8kW0ARFr*{U+A}cMiL--sNrd8+MefB_TE??ddY? zOQdNJ_w!CD&Y&^nZlaY=Sj!f<@OHGDWS!l^>GWtS7(}=k0y$^Jri>f(1(g!%XQnNS z3^nOpI87Wsmm5kWT&EpLOu7Ai&0F>$GCp^i1Q{pd-x=0T=uTJaFSodPI1s>dGTJ(V zo8EsZ5aLj+cUTS$;~U1Yj;891R%bU!-0t7{L5`pCwWr@X@tVql$}b|4XCr5{`kLIv zkE-QF-8AKD7uaKm&!50P!!Jd@-*K*E9WI3Ju_J^l{^gV3Sm7jic07kVps?UI(qze1^!9H7N9LWjGNx5T_Ix)v4W6}z9dTF z9mcmcgs3wvH84E}H4TaHR`+wQiO2IiU{TEEOle1^#6n!YkZmqj2lEEK*BH?$MFP`_ z`2fL-!@P_Skgph#2Q7-Xa^2;2e3#r)neg~L12m-lt}OmyO*O4r3WQn8vyO` zu3ZPtsIy%@or1Q)unN~2$IO_!a5#LuB*KTh7q_}mR=K|dxMC?-86i;aZw1@x>>*}c zrF^H+4n%g(FlBI_AAfmAe%lR)apYf&iVnF}w9Qy0mU)0lgPRmJ$yrVmlSEN8haaWP z2%r$lEH?4QPTbyXPi|8alcJA?p^-CNDDp>J8ZRc6gV&W0Uv75xZfjWF=3V+|AMY*S zWP18co)qU?hJ~FADdkSyW?m**cv9U~^H`610}iC2E5_y8sjkMj7<1?8DFB-T{bb5$ zcnG7%8=U!_QRn3!a%hj^pqscv)A>CUBbaKBjTHMN{2^^>LG{5pgRnbPDO7ADUwK0! z-x%*-33)dSWP>(!1=mYYdId{_t|r^r1>f{t`gI{ZIf+~}(M`C)SNYG8WP_}Um6D{S z2TC%j&SECvS@7T|MNhd~MbdeG$E_n`CtX!Tpw?8|i$W#&G(h0Rae5&CV2g&ZgsORQ zVg|2~a}~l&vTB4tO&Usoz)jjngqW=f4;zE{yYAFqEAod{BzQ#z0$m<5v^EJCm^Miq ziw9;B6+HwF0PYJ02JQ<71G<6F?XPPGZNMFsBt^i=$KLIOIsqmc(x&qAV6-3^4h$L` z9Srhy2pzW*Z``Y|{3qWRq z|KpIE5PusE?wbku5BYURRFyd_@*`b(?cF8^_Fi| z5A+0Ux$eaMnAZv$2^!ps1`W*I=e`nZ4Dft=|i18}X>ZVA?zE4&9F1!17iUB~}OD z0mA5jewYt{gSAKIhJCL=#wq92+{Z=QWs8&z(_ZYH)a1>G9L#X1PyfZ3yt%B z^G^s__NHB|_nOIREoJ>XEK{gbBpr{6Su)?taOPFWT68A24E44(2uu3qL^F{=*Fq3_ z6_eL7hIjoGO8e%5>*SEd^N0@a+WY1x>6dK#&O7LU25qQOBGGVi0CJA#W*d>4o zu%9RgbdU^XkB;A>Gz)XV?uv+hqJ$WENila=%7(g8lr+*I(%piJq=0lR5D}!MrP)Y#cL)NabW2Nj zckKNx^m(3h&OPUed+xcvKkn!CkLli4+xZtA|Imxs{goEZp z03*&H@4mEdSY6Jtv)GD)q)8dbRvF4{0Kx7-is+8FE#_Iyf>Tig6`p0#iBjy@Y+L}V zB592gdRSfjvb)&IL&+9MH?aIb$JZ>ztti-a#9qin&l<#I^E{x}`^FRF{d#W{8@%3W zl#2N4i9q-J*{<{ZUX&GbvEGf?fCU!_c==NuBJI-uADJadBU`sK*=ma!DTt&2w|#Mx|fXJ=zz5;p&k}!DZ_#R$#7ME zAG)m3)Kq#O`K0IKh1p|*ALNI#eYEmm2U&f-{c*zSo7K4Nc#Lk#@I$?TBse}bBAd#V z?qxO{GX9CLq6`#edV|~nCOd_2ykP`z#31l3Dc`W1s_*!2O>2vA88dl7ijX+NmuVmw z>Y;rv37Z@c-|52JOL)lvZ_jqy5{ zt2Sdlr89LOvXdhF`-y?%EhLQ_)G#vZFR75>8kf+vZzYI_DOmW$--I6zessX8{@jz+ z^nDrlgl%$+bw{cqvG;B4ix$uK@Wx;&+iM<;)(rvp?wE->j3}+6(Tbw?&OFNQ zW|YMJYy{qI!-W@o)(DM^lAo+vuOLWl_rQ-1U-04c`*gaGiCyxJM~fln*zb@9l)tS( zWZN1e@>AwK}fj$6IgWvA%$b&m#0GUc?4N$u)RaYQ0 zh847CqsfQ^v3WWKQg_`G0lagy#FEoEv1^R2D1KmU086aDR?B08?8{+y_d>4swrZOU z9!%xcfy^j;>FszXFlG4FGgxQ*g;jZj{%k3F0bdC+dn{-N^Cx1Pm*M9`Km;&S9C&mw z!>`YFzE9-Fz?;fsr4t;u1JP4IwmIyrVoHf_=cEfKTG+MPFj z14sL`_iEm>eP90jm^>}dGVq!u%1qhUWi6qTI8%(^MObg;Ft99UiKBMuKTjeZLwe?A zeDb|%>RA_XmkX|GqG#8uPCRCCtf#G< zOoNG_glB#LKq9#bi}xa1{OiWjj9~^vE*zN^HZh-Lf~vlGJfzZR4m~qgVCXV4M--c# ztnz=FwP25vS&^x*=+^!aJE5)-49&5F@$gKINMRY0`${LC>I1{HYGd}o%j&Ydb%rie z8f~=(s&Pu|-ojepwXebL(t{RNq6c+T&LJ#9YSIL1x+C{VTaVkl98*PSzXz264;ZDa#y@els!L6*twr=Gt zh>?^$4n!NM=MRb!99*y=g@HMy_rQg$cc{M_m`f53dT`=IJcGXzzw7qpqFi!fs zEI+bQxl}dcgEn(tBaycP6KEK+`S;Ig?~2a>?uN6Y+16^IUj>H1Qp~p>(#dk60p`04 zr)?gvHlg|8Bc`MABZr9hHb&!a`zN)~hax~SFe$R@arEdFn`cmd%!~G!^@&)JpIM)Y zux?4@l2G!Bltw^IH7(n2=NW@pKafnb_dOyPqeYc6schL3FCcDt%#J+E12DHp_T8xz z7$rjla9Xn~#?5<>KQ_bE&g`;xSHvyQcyQ3VHzPGj?O6arN|A# zV!2LeodcE0(>v8mkjvOO(YkoU1ef^|CvxWzMykX8fGRb=LlpT$JXeWXTd_Set7dTf zDjsg?o8&Df+^GkbFWNr_-5|DsF?c;((9f#LI2cLv;}7QJO(p6J2Oe7tA(N~_mxeg0 zHW<3$rTdP%S;$qRh~er6nY)-VwM~`%3&--yO}VG)?EysIRL)adW@O^MSZJ#x}r<0Db&9i^Z#B4(hg^INsC2`ph=qa7AxpX7BwLFtl&Vk25*(=l-Q(%{1x z5VU_pr>bXyC>G}i)Xh8l!;5VbN#AIg9ZcfdsklnU=UYI%bW!DFl((-YvT~~maTfh| z`J{)>nk8z12YdAxV*BaD9J@G6E>PNi=&aQ{Pf3nyCYYRQw#JsN)07p~0B5z*m#SJp zc+I@KzcG2xwuk^Awtqq`X++&1Fo=P_t8WOX+ZWCgw=V+F11}d`v3t8#Gy%-(-We^D z!)YrN6-q(NV*rQd=>bFc*+&$Z+2`<(M_Rj|#nA-##ERj!+7*zaykGhSES>1KZwCoZ z46VO*f5~5>WY|N^Atb-ojL{&=ze^noTi9cgCZCZ?H|;+Me=uHjnfEH7CPVq$2(u&k zYA&FmH=F}-Kcc?cH^zECzVj5;|J|5n++rj38O&_3YDbl5VBOnQj3XM`$)wqT8>`)D zflMl5K`WWtyJ$rD>p&LfX?U!_5NFB&18jB>X3oK$+`{6tMY<_gT*E(Yy6P6;V_YDt zxc8d&+&Elm$@s{0*Ks&+#h_9tW_f~#7x#Xzpu=tUsMBp1qw}~G6pk*a zS(WFAM23>Z^B|*;rHA@ah7)OyrFtdbv}}9k6;kZ#7k%Ptrm{&ihe?FXpi6-uS)ymG zRcieS#N##d-}5*eh;e7v>$NL$^%AufDm-5VSbA2oTn3tmNt3Y0VYd)o3a?hkYShh-8TsSV9G;Q)mvtG=|3?9(EswawLsj^xOB*qy$#%|%ff9}Wnl^DpD zJ40k}QYM#}GnAalnpHAT)N}F8 z5itFelWf-K>d4lQ6Ir&rG`G9GqA*U&If1NQ`06<0+PkOyZu)#a$Yka4`DXEt2f!sa z)7(wlI+u1c_jG-&(r|(u+o(M9g%pNXqSz>_McEsQlM!Pz{65&P=Uh%M!{^iZeD1#S zg*aUvIUKZPe5!vydB)vsUP(!EakLf1X5KZAG7Sz zGq6uMt}S`2x5`_(#}|e@C->yc33=t4ZNpS0Dhmtzv6xD!9=9z;2J-)gfu%aS9XZl{m$@(^#NDL^9?{2Gu zUj})-IN8HERYLG)Kb*;WGq6a902ivWB4UFnY4T6o&lDDk>6ChKx{_*dX1uO9{y?9{ z0rOUR>WzN$qvP(xD(|4x6S~4K?76;}0ozdX_6G@gr!TNk&rpv_^WJznY_-{)w-rrz4IflJ!QU5^GF z4)oS|x!tVR@mspSyw3KHj4L0w;rfcos13hQi&}ZKU)k31{<9UM%0^?#(@I`F0f-T+ zvL$Wu9X7FSilqqc0LE)n}sgDzbvOz5{BITib}D5x&;mQg*d(p zR!5z&tRbf;PAsI@&eEOzA|N;>IAOp38jh$EU@mka*W}Dsig>9YWOGYX3Bs6{DhQLD zEMH&A2;#RS(<5n;-C&aGGa>?KS`s|n)>Bw3GM!8%#y%Bx2!@w^nh zMvej>7chz7Y)>VbQEurtsU2NDa0>Ag9YjAxhHXyvML(!m*@iA%IF5`{ZvmZ4hMVj>J2IO_HRgPM~ajdG;0rRZCcIQ)<_45QcZ-_njr#>v(sir@f)_(8Ufyn z_y_mH9!xu0C;(1C($^;n0fyeY=9%sIuDZF~**Zp!UncXL^N9n7r|hPu&kRMq^Pf$p zJ|EZcnki(OPrm)dk1t7lkhg9-V52SbQ=tOM_`|NN#K&z3QHQVUr0naUVd_l7!VT4( zi=}QMPMk2R4P*=wK(W7!VD7tRQb2x`)zu05vo(VwuNWvcP>k)0MHSo`op(mq9A$GR z8YY`3Frw4^aP)qZlS5(SU8)$@*sVg?RYm{(6w(teFYEBzPbLkMFYx=!^_#*M-Z|Lv z4)RCw_L>`3kHUP$Q?R?sre9*E>ci#R>&$X4p8Y5a)%oF*Jpn{cE8@Ue{GDVod1I5+ zkg2Fp5^Z1(KXbbeRd^cVqc!CMTDvS!0PAI|J*7>iV6D7;=sZgMM$oX0BIR5&QIaBS z<;(gD8Ex04KaKLg#Vc-yD&fjCY-6M?Sz<4Z?wMwO? zF~?Q@`^v=R?w&`g$>jLnSZ6S`$AKNE0@93S!w{LFBCxD-Li-$Xjkc zRhpM<%7a~n#RFQWhe#EB=ncvNqSD`cd}NUq@+I@=7!5O`oM-S&Z^-fTChUyaEj6gv zm(J%d_<=R{Y0mYkoc~+*+mZ>UV}Ux zAX#tUECq65H9p3CYS`UJvle1Cf5xCJs7D16?dvgSZA#n4Y-Fg!jt()VKLP?;E(1GK ztB$n$`ZS|jS2$UYrXL2!OwO|4sPymS$^BIJSCoF(+hyb(#~?uM5_;8^%qIcIePu{g z?>yglF8E7f+bkz&eZUx-swte|YEUY%C&zeM5ihnHdw{Z59g&i+lLN{{vqqL&aS+Bz zF7Ck?Z{?Ud53scpZc#2rzuU@5y(HbFZ5K_BFD_Q%OU3Gaw$@<0H!c5eNGRi})l@c1 zua<>D!oVPxpF z>14NQFxGGyOF9vKo{svm>0ObSjD2Y9jvz}4X7$g?x|%(q z7vZ){umc&&e&6MGavqF-G$?arqz!Qw-V-zcJyhXO35w^Um~e zz9qrli7|&wK2w=nU$r%BZ7g$VERtOZ_Ju;ca{?cyu=Hu0yB5wfwW9>t^Nbyc5#>63 zn4PIw$Z;v`{7};vtX~~E>)G+O9k|r8}rhl3HZ~rytpvT^p!#fB%Xsyl?L58Rxcf)^;m5~JRC1jzU`iXio^|`s%ai(Qjvz_F2Ts+Jb7NhYIx9}B- zzH%YTWOG;?XpV(_I3DchP5~D2#pkvhza}xD0%g(C+$kR!^6L8r6(kXSO(5REbIBMa zuyK?V3!HB4e(-8Mu%+nB!ENMVF_e@WV(Jv>X}5jEze9wW#Ndo9BmmZ(K3~lQ!Ue(i zCf}PKwv_swon*A*?*b?XL!#aTac^4cAl~e&H0_NWMj!j0V4QkVRRH%Pq|BNm;1~5N z&$GxkaA0xCiG7D*Q=-a<%_oT@l5=ee2jyI93|}!IldDazw%sfYuNPwvkz6sDq9ima zvfyPN;-%{C-ZdUrh+@PQ^{v^EbYiv^b#Y`;7d1=9RSy!lJdNk1b_;MfY50W1K=(C5 zI6@H9LJPfjntlT?2Nc#ILI@$s8j#lskyP}gvsV@lno3TUUA{-cAh6B@ z>UDsysK?L;o8|-qhYD_o)r4Lxo|cb5jkEDZt=HcgVQIKb`_850TcdjhqH-n!Y2+`w zW+2uGZew=w13LoUp*7eLLnPPr5=;eo(o)1|jh^k=hWd+kz#yna9C5i<9NJ*lQtz{0 zG$NDL1phPoe?}hoU#9f*$K*%uO?ImtSQX(Mi)cri;%>DC>^Q;~CVE@ip#x0=a5(meZR{XW)^e3&{gghs! z)KJIUB&D2Xl#s;p<{b(Qjd^5Vh0BG_i>c(Ro=fLvELF%Wyb~d~=jhK&h?ggdxM3?N zW&Gc}QJ*{Nru&ENd_0(JUr|0FneMngqugvK8NgOZv>JlN<7D;S z3iaMj(nE$p`dgTEl}o6t-G*%~(0+`jbW5!97e4oM%+oHta;<<5x16wh<*J{rr%0$1 zKF(yNJf@81&Ukua75u1(CC`KZ=JgrpndqkPTo0c$2bxzntd^pA(FRNQ#w{tgYsfj# z8jb?QPwx`oRDoxlZviphY?&W>-o~Vuw&AvRFzN_%@LRo1*#o*JhcdkJ5 zZ^dvf*JhE2X>y@TcQj)?bNTxHb#QxwdVl$w(PnaP`X|F{;q z9ag`7kM)cD#nso9KCyFZz|#|cJUP}Za&f%9+}=~Z1K-=5ZEmiwy&8+NvrX|jGlg#~ z^^_~a&#pShnsLP7$9Bq#%iqE|o4w8zPmT`b>}G)GtCxZoF9faQPKSC96l5Ny=&5xjfmkzeQBUa(>w=l3eiG~D6!S_NTC$tWzU6s! zJQl7@J(ud;eJ=22O>oE7Xc9;k4e$yADS%Jn+*vW+TWfRS-5(V5#QlJ~k7$nIfO`+g z4NOYD!mmOe+@VpAxb>OB9I*^Z*SFvSAB}zlcy>TnkQvV(j zE&XvD(^~&6l2QF}JJXN;*rZwpPL_Bqi`dmy59hD?|MYC8){daUI2a5%G3*6 zXGi^3@R#8KlbEBHp$hm=JW#m39_TJrc=EN8qj1ef zZv^~h-3`kps2Y>rg#CfkuZ~EL^>tpDw)qp2IveOXn11!=B|SFKd1*T2uNgP$v#o-Jm^Pcu;D#G;hohn+_#v4S4B8G8I-aeB0shUK(kzWYauXq$5CBLv&I^5C z6Ldc8r9LZ)q+yTnW*`mq%30hmG`qHtf<*^oP==8uZR$U>6aSnlvTdt1E=`ZnTs>>4 z%5Q;|mG~pJbdUeYR)AlO<@pn1s`9}JZ})V8#1EB}Dpo?mBZXUEE9*v`?~hO5Te%_8UoPeF9 zNv^WNM-!_rbBR|_T{7GH3X`0ppr&M@H4;;wqoB5Ar4@>q$Wc&NvN8B2EHC$jHSbMM zC8egix+<^m=gt}{8+G1e-UF7AqhCe|8u7y!!Mm_^~S{Hu&ybYZw1ktgwvSc96LGob~nrdW)tym$miJ`j`& zmokH*4@6tY@G$D(vA@-lvVvj{#9GK!Fbd*PzE!|4AS_^v=ciJlcewGf;gE^$od=#Z zeLPcB;Bs(IQ{Z+mQ*+>Pa87d|Ecm7m?VYqhe5S`JK{sE~W~H6ploF}DAibiG?|Z-# z{rQYSO7?A1pKnR@)d75i%}H?AC@PaBC>F9lo1$8#Aw8fbezG;kz-!H+8cx|D;Lzh6v9vCad3gsPmW1(0HD%`1j!HR;v+u%3PLWGUHlC)Q9s)ms3PH z=o$5=Z|_W?uH{6tX$RKxqLtzlm5*= zxmJE-joR?Uy8dDHihu8E)aDy#rsevpbKV#>r$>z-UUhb;8JU(WdOz6hbS|`D{&44^ z(%Yv}j!@)*NDJwTI}>;|Z=Iz)pf?6+-+gBDuQ!XO-9TRsWmMeT6i+%DjLLL9evm|o zekX`uanC&po0SSk3V%>Wl=7gQ=zSmf!ci2p3uKN0O)*)^3;tQHPJg|DJc&(HwSq_m zejF0{1DyX38-KgPb15zxb{paUsUz6hY-ee4&`;G(SNjd9@e;FNbJuTHuT?>$ zMwpc)#SIl0cx549L90h-6IdlB1Qi+ZU6nJBZJp*)e0PL&&;g?0Ow;SW2HM00*o6d% zus!icrmIL)Co>h$+exE~(U+zh)V)HZ8zhkGXU@FriSs)1QGSWG?s|hz;{PHRd+yLE z99GKTR|(0>Yb-K;#lprA83%kii?rg%F!D6_6FBX`StFYsMq)=sY~90ix`B8L2_A+7 z{GPWYQi@RGfdmW53Wf>%t+zN*vb5#VItL`z{tbH02KH~}t2^L~MhmP`HJ7Lgg4|*lH zjSTwqacfcE5jG}fo^Av!12)D%0t1a(p!-Zzdx4L?f>&|2C&eR7#yx)2?Q{KcR?Bgw zC5J8sZjx@$f8~)i?V3mKzwwv|@(BMs9`oD(gvVPyVvVh}%d20^Mq~$MRlrU}H>&kM zGmuwn&Mf@mDf7KwtRyls{y-otbGv9-1Q3ik$t1&wrCrx10ysugPCH~@D)U$~>ExyF zIx<6Lp??(KGSNnV1h?>5f?8h_BlpV=MhDzip`e|T4tU~^kPdj^FOd#-1NcXz0|5RF zl}|`SToCDQaePUYPeer2eipgT@K>6iIFJK@z*vH3UO3Q9sooWFo%MhvTk-N(w4f3al5nP!Oi?O5jhq<9!ZAyC^3D`g%CEfHhnQ`-s zBLG2ZQhb}V+9({9WHH0mK3lvBj!71?;IMi<#3NjXJ`^zYy=A_uIATy1JuYHbYo42+ z7(1`~H#Zadp){Ufl~!b%_{Po?yWNF(^TQ1Hb%yxC;1A0Z{6o{)X8ozPp?acXe!ORm zhld>3DWYI?8cY>Y%3QR7rel|yD~b@f_n$KXS`MO9zuKN5My{!%w4!OL^YFE)hrUn1 z`EhGMbb43NfuEN_ih6q4n$P<|2gJm0B;a&XcM=2pIZJwyd^q`5&G!<%59-bts%t)1S6^XdiZGz*RB#3eUI|rw})7p zzhn=l+erV5_E7bg>>=Rav?pSgi9a!&)8ZmNM7f8i8vrKP?Bzv`-X!~ znAV-1j8G}?_sRf`Ad_Shk&g{~7R>JsdNaVls1Jr&0Wj_TeQ*T^y#FA$D*OF@a9zVy zfUm(-Ytk)p6ENymz|zehdH8{%zY8s^VoSp97jeS<&q{7YNUhS zC@>egZ*)b`-)H&ZC#9R7IFZ*`F9;0nKXMLUtl*Z9(UaVRL5s_dX8`?5RL!-={<`_K zZCdAojx!nd!*RIO38BmbAr_A+X!HmQ14pIEq3i=;7RoPa1PR_}*0fFiEUkC`*-)dx z@6rBM8x5|rA@c@P-(^QY@~}tN8?a6>{q~o_Cgt*PVe?1ielefJOxXDgD4b1 z8X#}^y0}ls{Co`sn04i1AOD)+VlsObGk&S!{ZjKb!n`ipTB z4z<0mzpk_BuQlS=sz0f}ew1I^cmKKk0;|G$un-#nFZKkYdhdfc{Hs#zhg-n#6-6%g zma3J3wI-OWi=)R7>_ro)li%S;&p}Y#8zZ50{3CMrg0Lj!)AIz}?B!*ghJz#EQ} zCsK!UJa_&e!ACn4T^ub{#g4iF=7qbT^%mY$exb8UmK{|H@7Bjnl^!;d+R0*riAo)0 zu`NrTTn`u50~{PaA;p))6LOn;dHm?1FLVAf#{{ztj*%giqPmvX=8Xe^8e#urvD4ct z%HAgP13R8LDX`eXOYlp_M&RP|BCanLI241Op2DcX1AE{Xoxt_@GJe{UUK&BhICBkC z)xf1LZ@IXWzJEGB2NLt-n~Om^$9i>o&uX}OSL4~V z)Kx=QiPyeU@_Tb-Nt~hyScA>P*RLC!6&_8~)XPuxmSs`xil2FTILB)*NN;tXtu~u9 zSuD?=?|I@614ni5?X%z44H2lZ5?{k=U^5jZHD0_OfN@pd*rRu2!YmEfj3C< zv`ES~Age1vAtZ!UzX0a;T(hqj0>fT7cO(3HMA)tSY$MaIc#9}p&9$eks zuOc7{{9K;wb(1V;Pf}hPvyofaEyVLs{1rX^t2f?{K>~dtpBiRv%|AC6x&0s#?SUjI z(VI867LSc~*oZ63pb<3kuQeD6G!=CW6}233$lRah=EM;D|6s~c^(I*z^sQTCxyJC9 zAc-F&iS zOKCz7%75Sw_{pH7#&FjU2Gx?~G}ukS=U?^+Sga;zKp*`RNmW(G|4MQtCnxH^iu@bJ zS8sk3S%78TT>2-7ze)`3P)xrlBfmy5ExjI5QqqME6gezj=$7M8k+}lW)6G&qk!8D+ zLj-<`9N*U8&!yZwTRL!MY!`;(OgddPZTBek@SAS+bmx(&=%w~#Vee$P_SM-_k7UED zXP5rjuGU}HJk@Fjdx9SGrG_e{93>tE!_6*ifjF(GviOG~@5$A5_$!4~%9QJ`n(7sH zVNdY8XU@Fr2z0L9ABUoq{4~YEjCjWoqHN#f^Vw6*2I)H0q^eTX{|FcZKK@(y{JnE<970x4P? z)sJJhF)-+vXpr5E18aqZs#7YTb#mADDLBHccY47dZQo7~T#nD*$yy_!;n9fuARt2i zGcSPu6rq2U4)7n6)mGZ=-j@Yc z&|;GA>?%!$ae3;2~wR zw@=>3-`H9aFKRc4Dy$+Oh&Y-R?ZwsCXY7PepmQ&i+IP=pTpqqQqm=Mzxd%y=sqB-j ztp^?+i49v`!Nmtga2eYHTSyJQq&I(16rf!?b_+6#z9>Ie%cMO!oe%E|%^5r|-qFkN z__miCg-`_NJnb7@FLX!4%i-8H8jhEzfr}bAmcy(pIkd+LPT>|ZV&2pjO+02mJpoO> z5sh*33a9g#^FTu4k+HgCZQaxM=0oBZpl5YQR<$7;sBOu8FV61kxpO+CDw?a2eq@YZ zrpnvC2UL_u7Ju@71oPK%rh8%PYmi_2)XHWQVDI8PBI;~jBo_B>-6>~sv!W9>!ScQQ zu&b`xd-bX0NKB^T#6y<|9;uDs0)5H|_cA&`KV*-v;v3tpO*{gM=AMLc1_AN_q{iz# z%qj-KmmAr#V44i%JhQAIh;fziPX6qpXP3gcxa`5M%dosDEJWUQdW6{>QPfu zA|yUW6|=3;95ct=WUNz*O$8X?eKD1JO7UbV4Suw4ywBA)mQibZzZJk84>>$G2TtSY zeHswng(CQJAuEiY4u9@7gs)TqVk6b;!qqwO41GKvnQLdfPZWWGqa-ZhgW#)#CWnxS zR{ns1Mtn|19CDv$4-GVQzS}g2*0kLy^56_fMD)4-Pjuk2@z*{`C2#MN(}Oc`kg0?` zbI#~y7^jj9{3y|rE<|_2-auJ1&|Q)5>U}zl1H)Gg61|T?L>_Qk+^59?LeOG?KV%GU zuR#!j!15sP4LBnMT@E2b`XPXhN24My4#`2vB?Bjf+@V1XA>q1W5cd&hKtxX?_+SaT z(A@+dr2j(suMq}*hq5nK6K>j|iiV_*cmSknC#@}Qvu=^NZuG;D3$sKMV2D>&QWfuPOgE!odF;<-bN4_&0d|Yn1;QVc`D_%)iSr@IO`H?^6D2gu(jj|GCZm zJkvGhJCea~A;k`#oN4xj=vh9u3{W-TKCzt!{2Ny@it^Tn)>ZATxqwA*D<=cSyFcq-)V zxGy`yQ!U-Y2vI}4!Gt(!u4j z$aXXN(znLWX$J8$YTpwmYoGL4omyN2n7`c8E${U0Wfmip?FghBh3r3{Da8lC@FQN- zV~|n#2sVwa60nZZEsyYRUo)B%DhKg3q3eGqUevXcVc;~(Xt-uzVhj2F-4l<&`0=u$ z5-4UI>G;*RmF=Z^C@LL#QY3JV`Nh9Icxm{u1|9 zYl3Zucd?Y4KoD*)G4xw#3vdfk-?x0pwXSnMEeaz%4H0*GvAQVWz2Egdxi1Qy%v7Br zOt_>K&6shzDNZwvmc$g%ytJYza?on)W|P{`(5A1d=k-|;g0|^f-Q{?>7CQ+kY}^V}=Ea-&th8W z{opk5i)-^;1Io~49a3Oub@5TieK?FV<4Q9co+P}EirX!QdPVnzliJfY&?9PNXBhVt zHkU&(y|_sfq&Zl1Oz@1+WHiPJyj9talTW@Ce}im~zvLpbr}ToiXEr9OYS;aA#TwLR<*l!HzlxQlF6loAPM4q#;j+rWY;}W^GYeuhQu%Kfi;>R z`l6-?$P4iI%>3XbviD!`;wA$BjTZ%kDB%&osRisN%dgdWFA|8vJoO(JX4CkJZOR#hX^#gc9O5(krG(@dZfDD8esB z(t9Va8AtGWwnc^`&SA)w()Zm;3g_!wZq#9i2fpt}O^&Des#;bLIGb-S4;R1gHj|}> zkC!X&D2Y4HK_MBb2<7l5BG_$pi+wRPDuedbDZn&CJ0swPM-#tt_x6oaY($xx51@%) zj3&+S41((WhA4I9tS+WzL?Ebrl<^UN+oHL7C_yBjCY8S>dMgSHf<4c*An_Sb!0QB2 zv{#pelCa#5qX8}3eWETa&a#kr)~8@KUG$13swH1_pOUfaE7}LI4jMCi;&!bEG;l&4 z-QoxS%+R0SrZpa)hY|HI|a|A*`U zaJh+&FC3!2V!nhSJBD7prv_oaQJoSEp+Kyr(t-f^<($rxh}Fr@Ahh(=XJHUR#3+y3 z7}e9E;DorCYVZM+TcO|sD7&j67;%RokhSXOUe<11!?*b>;j&0XN<(T00Jk2XvO z{b=8Y>4lnpA?5st{&sJxt$ck+^xz>vW7Lv88`O`rOP~U5-{!#gh=$)Zl)bAt(+*ZD z6CB{DWscgbXmu~)m{6ewO<%6OYxTq~eOx@@_HbyPDrwnva#+OFDKyZ4+d z-!4Vgh#l>7=A@%4EHC=$d2XpbJ@6HiFusPfN2_X8HyPmJt6opc(B2v}2UO)Wyko2TZ5jLZyyTr0(N2$wJD-i^A6t0Z)2~pa z6r3{$t4OOy6RGUW_y^x#&4|-J%AW=xwYiX9X-ytcooQySq7n>06UB;n%rh_a>6UxbW^*iKh{{kww>Nt0c+bYsLo$DWr@!wvPjWCS#_P^Kd$bf%G(dEszf z^j8zpfs-~B@i=8McywP8bj=BA`0!{Fu|Bi3(Q-;wT<|&sv5mIC$6}-X`NdKvi}D;r zNfJ-a7tcpVMp~P743d%?JTATt)~jc4Mi(_Vovxn`3wU~84l_6E#ZwApel<4W1XDav zWCWBFtZXjc;}8qqP)^Q}d?tpEJ1+^5L(7$*mBUsG;GtQul|WsSPPN<4NE%p{aj2+` zqOh@LkWKW^9cU66JN!;1y8FH3s67C4?=~X+YmM9ZA5d~7$=sNy*2_I+ET8YKA1(Fu z&32fPh+XvDq!Qj#m0oi770C}$FB4k_-1mC#94@`zpb}*jsdGIz3RYvEvY-C)F@uwo zlgg{q_4|Dfqs3#FFR1k%VdaTL?Zp1)4n<8LNGVb_n}vnk0Fnw(>dSR^`=h6B7Z*!g z#&P^`y_rilw}X?VEj#bajBwz5Ct%j=?cYV7>pNo@4%6#~>9d?(Ke=_F5>$6sfX?jUs$xDNB zl6vS?(P}*_*-lVzJ@lw(wUISpCuqAKdR4UA%!<-NOgI;W|DqkM<}sQ97qYD&N~gUw z2DQu*YSRc57=c{yxFy{wsY++8Rk^eCE`+S$5B8RL`)oDk?{=@)&=q5kZfL5zJK&1R zFcvhb&!o$kV3%&5Y|-o=>GT+ZExLe^&IEja6N1UGG05fmMMZRXQbprYll7wHdlgY2 zI<4cWsn!Vn@AVyy^e5=+myrLPz!e+*D*Jltj|(jt{3ETTH`u`)da6~*9#zarbO~}H zkSL74#V-NhWBGy{tlbP$nK)SqxV++I>BOv>iAGf+B%}W}4AR zJQoWR-Bh~8Igar};!Ncg*-_yYxk`z(3U>Ub^Qc{Bkqta+@q>VMHHYi78b@#jN~ps)|OX&d9&+hO8^G z_mVB0M>(F84UYsPA49R;=#=BDRc>%40NsmKDIzYcetj(`!52_YMW$;xC9dTJ-*X|w zs$9!Sa89qZI<(Sx>^DG39-=B>WRhNiooQ{B{n8D8hcx-f&vxkORq|6j9G8Z)Z&UV0 zO|bp-{9u0V-kE3H&z7beOGb}fl2Rv}!_UX+Q}yKqn9sju2OT>DV;;hLJ72zW^qjYb zl^cF?cPJFFjQIV2;bq|{!de#=X}_s!{OPg7RR#5HH+JYwm13LVfZJrIY4U30)?mq_ zm$S~#br{d>>UjzX2~Dm??jNH%ILcGHbbfW70%*=;y!yi5xPHuaOrjLcDTHBVDA>l` z$^DY^G4D?9?{#=*i*|iOqL9GYO-h1>>96T8-6}O{vk^VUNM^TVHTrgR@*=?rdUo9O z6!gQ!VqNe!!OYmTBVPaUcF74Z=!rTuvZU3IfO0pP>WIr?CAxBTi2?^@?nT} zdW^&dzLzvXe_|+zlHZ(3gc~yr@Tbc&p$2S-HAQ-6RQajx^x*`_M!eDOSvHsrjf@l zKg&#`N6J+IfAx<0KYCTc?E>Zkh6472)c7kHf!M`JG(bURBa+jTL==?rLE2xS&|LO> z`{>BFMDN8q(Q-utZ?>+IVD@jZmsylYCw^$8JdeT-S5qqnJLayj4h6}lDX2BTJd+!iXYhP1L6m&UiQA`hIA^N=7f^a&nQ9mK!&RFCYz1BzNjNdFGR zl7y1Fk~bw;C9x${CEkzy-?}wiaeW9%@p}BY%uMzqDgFo%!-M%5;SDlP@n2iBM=D{# zqWHM}=3c?CM_!Nk^S;b%OOdy)pOAB zb*pEFMG2xYn@CvCIEf%#8_s&!ra`TXeZq6Ud z7QE~mzDN|Lb7T3s|M^z09Z(um2dqDG-7%?m1KT)bzf3(GTW%Yv))q5vg2C($7QhpP zlbTMDF}>~WjHcG)p-B!R7lZi2K^NSr)LENm>!M7<{ZEeHU1wXxPVT5Rz6eJSoaVV- zxHZL!^K@&z|JxaN_{oWD=2KE=VM`CjRNr?)xhrc!N8A0`ANq`Px{Ze+U!)(HfQ*1( zPx|wkfa{lQg0RHvmd>n4lx(w%D3PIMOy-pem6jj!^6EsU1)rj6SwFOilFauy3A-Jk z=}5>9q3-DBhmS9`x2dw0p>BN0y+;;Kr;tW)CvJoV@Eoa6s% z@5=w7{QCa5n6E~dv5hdwGGyP05VCJsiZ7FrU8O;?B?eJriwrKZuUWGjd!b~DvS&*v ziYO9Na$lq8x%KV!-2cGyy04iZu5-@&d_HIUT<4tY^SaJkbb`q|;9v)9IP2#&qK@V} zWg`5E>Y{Ic={b|3H|Vr^pRr+nyK6DTm@|W!I3WRC-qIB(u~$NU-w&BI@aRUlhrY@~ z4o#FpdxBEWg3k`v>Qi65w>Lj#cuL1T`0^0JVv-WxLQm^Q&=7DZvA$v`eG8;EGbwOg zuxoOg=u*iglKP;FAFRIOX2~C;&aO6CqZnedP4ifqhBi(cXmpgpGLeZ4xq$ksz>BE*; zsJc7S{F_Z|w+M6VtL&VnoLn_6hc}OBPBeXf63^gUA+vbDFOb9jbi8I8*E`8h$7ubu zGTUdb`Ma)sShcN*?DWs2H6)5gxATlMi+9L(F1~wOrR_CnWctnp0=hA_%M@{TfrrX?h+m z(hr%mnJQ+p6(4;vA$Q~!M;Tu+y>{kJO^g!O=u1Zs;YX7y{@Bp#cMjfG$ct9b$|n~Z zS{sEs7GGQ0rXfqFCvV*F-zF29ZM!N`e69pe&M##%F5w@n2aW zb`nTiPFH`bax8VX#)2(#wcoB6+7j;gzT`GJny)r9=2!}b-!1}|r%Dt)F+$8L^I*5P zZ+WZWj@=@I5984Mveef}F}3cd!!)qQ#ceso9EGE1NB|Zgp<qpW}G<*AbO`1(;ES#|DryRT}sM5nncAN z9Rva^CVM(Q3&^a>put-?7x3vrME1-{DGja!w=HW{W<4usL4JMNy||ZpgABYOVNTA+ z<7+haC_-YfJ1Ay7y`*QMVgVw=IQ4d!YUm3xK5Se?Utl#Kyjv9#PmnzrpU*?l-xumA z{7;aWUQ*}*N)i4OB(5|WZoP2^wWn4il2wbM);f+4&IFZgJ}B*OD62m*6e`l6Y0l_8 zJ&nCm6X3$;zvox#?#$fP|3SO|{5LZ*pq56p7@nTP7@&B1Ung9)?r{B(TGVXumnr!XQ}$!{9@ zPx(P7!!DU5_z; z)yOhf*ef^f5z6J|mSyR4F3d2o`~CGF*QllwgQ6j?kISd~3+3coa#L^PrmVcc)|;y> zXWxZIEq#%YXSczL7qN?yzL#{*y^oq;o6Im&u4ewZUS{C^F$sSDFic~-JlGOnR?|zS zwF{GX>1q=^%`Zj{$JYY)tSwi_uzTz_NPnF7;KSXOow|1A`0cFsUU<$-k_RsvnV1Xc z00@E4uLjj2ZVwb0n+5Pv5eD2LGT2uBRkg6Gu{(_T%dfA4J>Gxb?u;ajRm9G7Ebz!DP`|3pW;#l)_7!Tnc_&dhKz8)%#;+RN=4|Z*UMsibT?4jsJ_DV-2Bo7!%lgP3}Na8?_~rUg%Ex3-G?YJ zM?_y(wZ{as#!b=P+>zR1tK00@Fk_{Wyqg{D>4_2C#5%~hzw3mt*&w1Dw#$`w{!S;& zq*jb5eOtXTJl)c%;X8zkOz2D(g%4#UM69c;T#ZWZWsRzOnMcrd2(Q$1u_qH4X9(Oh zsXOU6^ZFuWb7KQKI><%&ZKJEM<ZAYo8K%NQBtO!hFqN=3>Q~C_|Mt$WzOQ-~ z9c>YQm}i1l2qsQfwC)%zF=*x&3@p_rsffzaKc^Gp6l_wi6iN}IPfN+6nPVM)M5=Mh z!DJPA33QA{5`^DQ`7~<=tQJTq`TiU-^5}jNZ35E``}i7z0jE4|s5+_ya^%e;(boOO zmehHV;xrg1tc{de3I5#4Q$INh6UAK~Ock%Ej(U?{n#_KZEj(?vm?hC z^d+%!0s+ycqssv^u{Y#PspgmFcbRkP*yDq6uMgz5h`;$OZaDv;TESZu%5#<)W@@-c z@JkBfr3IZE0TkIT4M0)RZCqhenuV-Afezd$1|$fUz4#$@R#kl=KA`9ZU_S!)uMbPA zGF(PC^c++!va*lAczL8&eDWd=rHsCD@-_Q~HXveU{90Q)a#l9Zs-0sp1S=k%Wa-ov zJs-F*BRjU4p%o5iKRn4$WA{b^U!BxI$BTO8eB{lTfS0iEH`$FZi?oi_U2`KNJ&A{9 zk~;}yMri8|r3b}@nB2KM-IVoEOtqWRsn*J=v1ih<_h#NtJw88gxN>3fYryV1PoIJz z%?Qh+>=@aw9orGLl@QX6FRFB@UpFFe40<x{?kwSyls&2m?^cU)ii5GtqS7M-gd3Js-_jLIxEpVm?{^;q|= zX_3oLr2&6U+9gvUw`O z*N%9FDGYe_2#t5tu3N|%k(0zl7XQa?ov(V{x-)JTu@~N+ff-n&vVa-aFS* z4}I0jTJ}lVp0>nL=j`7l@)HQv`$tN~aN9Nw%^iYY{WPYRA{>40c_<|VmZG@8E%Cq4 zito(bFHh$X3FxQ}RItwQ>ho&utQ(k*f7f%7yS6EWIPz3A!AkR5rH0NF-{o6E(ECo7 zI5o{Wc>{FAM!ju&u#3cX8wNjIyI8I0+c5(3Q@Q{(=f6SUys7Q+{=#(QiOGD%*tHfb zQh(D4jaG**4b?tjx&3J06f+S|!*xPrK#ZUG^^`R(qrx7zUmPIu?t|4`nW@^1ZOJ% zdccGhT&V!WFurpfup($L{}Ez>hyK4^^$4)C0^r50#EpM_4S4`xDZyZeeoKeJ?jT8@ z)H%V#8UTeUwHg*KKtud)F@K`+xkzekY*g~#-5P)uV-#M6w}GVTDg22Gk)hx~hbll4 zU^xLMQ~?5le{$6Ct0(I0GuDH=)c_lXXO9z@vj9=m0ER-fhox4>!N7dz22`kqlDf{5 z7`z2Qx=P5^IZlb#vIW~}05+1lFC1j70Yrcyd+>M-AV8tspriN62IPCxW?&VLxw3eWG z9aIGLWsp<{RkRx-Bm{)z7F7|)^-O#aZAV-yix}>)on^sJr3T(fUQsf z{7C`54gtVY7YIb@eGu{||6YCSf?sfaJ(Py3ggnagWJn6n{a?}CkXnk%nG;Ycq{PUB zT9klQ(XZqHD8Rk%cmA{PxME7(Ilv^SBf0lqMg0l$uG?!O(6AEfE@