From 5c586a1a95b5239a9da616836d614f18a551672a Mon Sep 17 00:00:00 2001 From: mrleehj <470349233@qq.com> Date: Mon, 31 Aug 2026 13:16:46 +0800 Subject: [PATCH] feat: add article and production modules --- backend/.gitignore | 2 + backend/plugin/article/Install.php | 59 + .../adminapi/controller/ArticleController.php | 231 +++ .../controller/CategoryController.php | 127 ++ .../adminapi/controller/ContentController.php | 183 ++ .../app/adminapi/controller/TagController.php | 127 ++ .../article/app/api/controller/.gitkeep | 0 backend/plugin/article/app/dao/.gitkeep | 0 .../plugin/article/app/dao/CategoryDao.php | 40 + backend/plugin/article/app/dao/ContentDao.php | 26 + backend/plugin/article/app/dao/TagDao.php | 40 + backend/plugin/article/app/model/.gitkeep | 0 .../plugin/article/app/model/BaseModel.php | 37 + backend/plugin/article/app/model/Category.php | 41 + backend/plugin/article/app/model/Content.php | 93 + backend/plugin/article/app/model/Tag.php | 41 + .../article/app/schema/request/.gitkeep | 0 .../article/app/schema/response/.gitkeep | 0 .../plugin/article/app/service/admin/.gitkeep | 0 .../app/service/admin/CategoryService.php | 16 + .../app/service/admin/ContentService.php | 129 ++ .../article/app/service/admin/TagService.php | 16 + .../plugin/article/app/service/api/.gitkeep | 0 backend/plugin/article/app/validate/.gitkeep | 0 .../article/app/validate/CategoryValidate.php | 45 + .../article/app/validate/ContentValidate.php | 93 + .../article/app/validate/TagValidate.php | 46 + backend/plugin/article/config/app.php | 9 + backend/plugin/article/config/info.php | 20 + backend/plugin/article/config/installed.php | 4 + backend/plugin/article/config/route.php | 87 + backend/plugin/article/config/translation.php | 7 + backend/plugin/article/public/cover.png | Bin 0 -> 636622 bytes backend/plugin/article/public/icon.png | Bin 0 -> 267659 bytes .../resource/database/migrations/.gitkeep | 0 ...026_07_25_000001_create_article_tables.php | 94 + ...ter_article_content_add_publish_fields.php | 93 + .../article/resource/database/seeds/.gitkeep | 0 .../plugin/article/resource/menu/admin.php | 46 + .../plugin/article/resource/menu/frontend.php | 9 + backend/plugin/article/resource/menu/web.php | 9 + .../article/resource/template/admin/.gitkeep | 0 .../resource/template/admin/api/index.ts | 118 ++ .../resource/template/admin/lang/en/en.json | 136 ++ .../template/admin/lang/en/index.json | 8 + .../template/admin/lang/zh-cn/index.json | 8 + .../template/admin/lang/zh-cn/zh.json | 136 ++ .../resource/template/admin/routes/index.ts | 59 + .../admin/views/article/category/index.vue | 26 + .../views/article/category/schemas/index.tsx | 189 ++ .../admin/views/article/content/index.vue | 26 + .../views/article/content/schemas/index.tsx | 544 ++++++ .../admin/views/article/index/index.vue | 147 ++ .../admin/views/article/recycle/index.vue | 59 + .../views/article/recycle/schemas/index.tsx | 65 + .../admin/views/article/tag/index.vue | 26 + .../admin/views/article/tag/schemas/index.tsx | 169 ++ .../template/admin/views/index/index.vue | 147 ++ .../article/resource/template/web/.gitkeep | 0 backend/plugin/produce/Install.php | 59 + .../ExceptionAnalysisController.php | 32 + .../controller/ExceptionRecordController.php | 102 + .../controller/ExceptionSettingController.php | 94 + .../HardwareFaultDescriptionController.php | 91 + .../controller/MaterialCategoryController.php | 65 + .../controller/MaterialController.php | 96 + .../adminapi/controller/ProcessController.php | 115 ++ .../controller/ProcessStepController.php | 115 ++ .../controller/ProduceConfigController.php | 60 + .../adminapi/controller/ProduceController.php | 82 + .../controller/ProductRecordController.php | 120 ++ .../controller/RepairRecordController.php | 140 ++ .../controller/RepairSettingController.php | 65 + .../controller/ScanDataController.php | 120 ++ .../controller/SpecificRuleController.php | 115 ++ .../controller/StatusTransitionController.php | 115 ++ .../controller/StepRelationController.php | 115 ++ .../controller/StepStatusController.php | 115 ++ .../controller/TransitionLogController.php | 59 + .../controller/WorkStatisticsController.php | 64 + .../produce/app/api/controller/.gitkeep | 0 .../api/controller/DataEntryController.php | 1698 +++++++++++++++++ .../appapi/controller/DataEntryController.php | 227 +++ backend/plugin/produce/app/dao/.gitkeep | 0 .../produce/app/dao/ExceptionRecordDao.php | 72 + .../produce/app/dao/ExceptionSettingDao.php | 69 + .../app/dao/HardwareFaultDescriptionDao.php | 21 + .../produce/app/dao/MaterialCategoryDao.php | 21 + .../plugin/produce/app/dao/MaterialDao.php | 54 + backend/plugin/produce/app/dao/ProcessDao.php | 42 + .../plugin/produce/app/dao/ProcessStepDao.php | 35 + .../produce/app/dao/ProduceConfigDao.php | 62 + .../produce/app/dao/ProductRecordDao.php | 76 + .../produce/app/dao/RepairRecordDao.php | 21 + .../produce/app/dao/RepairSettingDao.php | 68 + .../plugin/produce/app/dao/ScanDataDao.php | 76 + .../produce/app/dao/SpecificRuleDao.php | 70 + .../produce/app/dao/StatusTransitionDao.php | 115 ++ .../produce/app/dao/StepRelationDao.php | 69 + .../plugin/produce/app/dao/StepStatusDao.php | 35 + .../produce/app/dao/TransitionLogDao.php | 65 + backend/plugin/produce/app/model/.gitkeep | 0 .../plugin/produce/app/model/BaseModel.php | 37 + .../produce/app/model/ExceptionRecord.php | 81 + .../produce/app/model/ExceptionSetting.php | 50 + .../app/model/HardwareFaultDescription.php | 39 + backend/plugin/produce/app/model/Material.php | 42 + .../produce/app/model/MaterialCategory.php | 38 + backend/plugin/produce/app/model/Process.php | 46 + .../plugin/produce/app/model/ProcessStep.php | 55 + .../produce/app/model/ProduceConfig.php | 39 + .../produce/app/model/ProductRecord.php | 82 + .../plugin/produce/app/model/RepairRecord.php | 160 ++ .../produce/app/model/RepairSetting.php | 50 + backend/plugin/produce/app/model/ScanData.php | 88 + .../plugin/produce/app/model/SpecificRule.php | 47 + .../produce/app/model/StatusTransition.php | 64 + .../plugin/produce/app/model/StepRelation.php | 51 + .../plugin/produce/app/model/StepStatus.php | 50 + .../produce/app/model/TransitionLog.php | 72 + .../produce/app/schema/request/.gitkeep | 0 .../produce/app/schema/response/.gitkeep | 0 .../plugin/produce/app/service/admin/.gitkeep | 0 .../admin/ExceptionAnalysisService.php | 85 + .../service/admin/ExceptionRecordService.php | 16 + .../service/admin/ExceptionSettingService.php | 16 + .../admin/HardwareFaultDescriptionService.php | 84 + .../service/admin/MaterialCategoryService.php | 16 + .../app/service/admin/MaterialService.php | 86 + .../app/service/admin/ProcessService.php | 16 + .../app/service/admin/ProcessStepService.php | 16 + .../service/admin/ProduceConfigService.php | 26 + .../service/admin/ProductRecordService.php | 16 + .../app/service/admin/RepairRecordService.php | 121 ++ .../service/admin/RepairSettingService.php | 16 + .../app/service/admin/ScanDataService.php | 16 + .../app/service/admin/SpecificRuleService.php | 16 + .../service/admin/StatusTransitionService.php | 16 + .../app/service/admin/StepRelationService.php | 16 + .../app/service/admin/StepStatusService.php | 16 + .../service/admin/TransitionLogService.php | 16 + .../service/admin/WorkStatisticsService.php | 215 +++ .../plugin/produce/app/service/api/.gitkeep | 0 backend/plugin/produce/app/validate/.gitkeep | 0 .../app/validate/ExceptionRecordValidate.php | 66 + .../app/validate/ExceptionSettingValidate.php | 43 + .../HardwareFaultDescriptionValidate.php | 34 + .../app/validate/MaterialCategoryValidate.php | 25 + .../produce/app/validate/MaterialValidate.php | 32 + .../app/validate/ProcessStepValidate.php | 63 + .../produce/app/validate/ProcessValidate.php | 43 + .../app/validate/ProductRecordValidate.php | 51 + .../app/validate/RepairRecordValidate.php | 49 + .../app/validate/RepairSettingValidate.php | 43 + .../produce/app/validate/ScanDataValidate.php | 49 + .../app/validate/SpecificRuleValidate.php | 47 + .../app/validate/StatusTransitionValidate.php | 103 + .../app/validate/StepRelationValidate.php | 86 + .../app/validate/StepStatusValidate.php | 59 + backend/plugin/produce/config/app.php | 9 + backend/plugin/produce/config/info.php | 20 + backend/plugin/produce/config/installed.php | 4 + backend/plugin/produce/config/middleware.php | 19 + backend/plugin/produce/config/route.php | 126 ++ backend/plugin/produce/config/translation.php | 7 + .../produce/produce-replication-plan.md | 1044 ++++++++++ backend/plugin/produce/public/cover.png | Bin 0 -> 375457 bytes backend/plugin/produce/public/icon.png | Bin 0 -> 29219 bytes .../resource/database/migrations/.gitkeep | 0 ..._30_000001_create_produce_basic_tables.php | 144 ++ ...02_create_produce_transition_log_table.php | 51 + ...te_produce_config_and_scan_data_tables.php | 94 + ...01_create_produce_product_record_table.php | 49 + ..._fields_to_produce_specific_rule_table.php | 53 + ...000001_create_produce_exception_tables.php | 136 ++ ..._000001_create_produce_material_tables.php | 51 + ...reate_produce_repair_management_tables.php | 92 + ...dd_exception_snapshot_to_repair_record.php | 50 + ...16_000001_align_produce_repair_setting.php | 85 + ..._fault_responsibility_to_repair_record.php | 42 + ..._category_ids_to_produce_repair_record.php | 27 + ...dd_quantity_to_produce_scan_data_table.php | 26 + ...01_add_images_to_produce_repair_record.php | 26 + .../produce/resource/database/seeds/.gitkeep | 0 .../database/seeds/ProduceDemoDataSeeder.php | 630 ++++++ .../plugin/produce/resource/menu/admin.php | 178 ++ .../plugin/produce/resource/menu/frontend.php | 9 + backend/plugin/produce/resource/menu/web.php | 98 + .../produce/resource/template/admin/.gitkeep | 0 .../resource/template/admin/api/index.ts | 519 +++++ .../resource/template/admin/api/statistics.ts | 50 + .../resource/template/admin/lang/en/en.json | 217 +++ .../template/admin/lang/zh-cn/zh.json | 217 +++ .../resource/template/admin/menu/admin.php | 134 ++ .../resource/template/admin/routes/index.ts | 215 +++ .../admin/views/produce/config/index.vue | 52 + .../produce/config/modules/basic-setting.vue | 175 ++ .../config/modules/erp-integration.vue | 207 ++ .../produce/config/modules/specific-rule.vue | 324 ++++ .../produce/config/modules/step-rule.vue | 237 +++ .../produce/exception/analysis/index.vue | 228 +++ .../views/produce/exception/data/index.vue | 22 + .../produce/exception/data/schemas/index.tsx | 127 ++ .../views/produce/exception/setting/index.vue | 22 + .../exception/setting/schemas/index.tsx | 100 + .../views/produce/material-category/index.vue | 24 + .../material-category/schemas/index.tsx | 42 + .../admin/views/produce/material/index.vue | 49 + .../views/produce/material/schemas/index.tsx | 50 + .../views/produce/process-step/index.vue | 26 + .../produce/process-step/schemas/index.tsx | 185 ++ .../admin/views/produce/process/index.vue | 26 + .../views/produce/process/schemas/index.tsx | 154 ++ .../views/produce/product-record/index.vue | 22 + .../produce/product-record/schemas/index.tsx | 249 +++ .../hardware-fault-description/index.vue | 49 + .../schemas/index.tsx | 135 ++ .../produce/repair/repair-data/index.vue | 22 + .../repair/repair-data/schemas/index.tsx | 490 +++++ .../produce/repair/repair-setting/index.vue | 22 + .../repair/repair-setting/schemas/index.tsx | 100 + .../admin/views/produce/scan-data/index.vue | 22 + .../views/produce/scan-data/schemas/index.tsx | 254 +++ .../views/produce/statistics/daily/index.vue | 310 +++ .../produce/statistics/monthly/index.vue | 290 +++ .../views/produce/status-transition/index.vue | 26 + .../status-transition/schemas/index.tsx | 290 +++ .../views/produce/step-relation/index.vue | 26 + .../produce/step-relation/schemas/index.tsx | 218 +++ .../admin/views/produce/step-status/index.vue | 26 + .../produce/step-status/schemas/index.tsx | 227 +++ .../views/produce/transition-log/index.vue | 26 + .../produce/transition-log/schemas/index.tsx | 277 +++ .../produce/resource/template/web/.gitkeep | 0 .../resource/template/web/api/data-entry.ts | 167 ++ .../resource/template/web/api/exception.ts | 143 ++ .../resource/template/web/api/query.ts | 54 + .../components/MachineEntryPanel.vue | 549 ++++++ .../data-entry/components/OrderEntryPanel.vue | 610 ++++++ .../data-entry/components/entry-panel.css | 340 ++++ .../template/web/pages/data-entry/index.vue | 1026 ++++++++++ .../template/web/pages/exception/index.vue | 150 ++ .../template/web/pages/query/index.vue | 179 ++ .../template/web/pages/repair/index.vue | 105 + .../template/web/pages/repair/tasks.vue | 51 + .../resource/template/web/pages/routes.ts | 42 + frontend/admin/.gitignore | 1 - .../admin/src/apps/article - 副本/.gitkeep | 0 .../src/apps/article - 副本/api/index.ts | 88 + .../src/apps/article - 副本/lang/en/en.json | 60 + .../apps/article - 副本/lang/en/index.json | 8 + .../apps/article - 副本/lang/zh-cn/index.json | 8 + .../apps/article - 副本/lang/zh-cn/zh.json | 108 ++ .../src/apps/article - 副本/routes/index.ts | 59 + .../views/article/category/index.vue | 26 + .../views/article/category/schemas/index.tsx | 164 ++ .../views/article/content/index.vue | 26 + .../views/article/content/schemas/index.tsx | 212 ++ .../views/article/index/index.vue | 147 ++ .../views/article/recycle/index.vue | 26 + .../views/article/recycle/schemas/index.tsx | 65 + .../views/article/tag/index.vue | 26 + .../views/article/tag/schemas/index.tsx | 164 ++ .../apps/article - 副本/views/index/index.vue | 147 ++ frontend/admin/src/apps/article/.gitkeep | 0 frontend/admin/src/apps/article/api/index.ts | 118 ++ .../admin/src/apps/article/lang/en/en.json | 136 ++ .../admin/src/apps/article/lang/en/index.json | 8 + .../src/apps/article/lang/zh-cn/index.json | 8 + .../admin/src/apps/article/lang/zh-cn/zh.json | 136 ++ .../admin/src/apps/article/routes/index.ts | 59 + .../article/views/article/category/index.vue | 26 + .../views/article/category/schemas/index.tsx | 189 ++ .../article/views/article/content/index.vue | 26 + .../views/article/content/schemas/index.tsx | 544 ++++++ .../article/views/article/index/index.vue | 147 ++ .../article/views/article/recycle/index.vue | 59 + .../views/article/recycle/schemas/index.tsx | 65 + .../apps/article/views/article/tag/index.vue | 26 + .../views/article/tag/schemas/index.tsx | 169 ++ .../src/apps/article/views/index/index.vue | 147 ++ frontend/admin/src/apps/produce/.gitkeep | 0 frontend/admin/src/apps/produce/api/index.ts | 519 +++++ .../admin/src/apps/produce/api/statistics.ts | 50 + .../admin/src/apps/produce/lang/en/en.json | 217 +++ .../admin/src/apps/produce/lang/zh-cn/zh.json | 217 +++ .../admin/src/apps/produce/menu/admin.php | 134 ++ .../admin/src/apps/produce/routes/index.ts | 215 +++ .../produce/views/produce/config/index.vue | 52 + .../produce/config/modules/basic-setting.vue | 175 ++ .../config/modules/erp-integration.vue | 207 ++ .../produce/config/modules/specific-rule.vue | 324 ++++ .../produce/config/modules/step-rule.vue | 237 +++ .../produce/exception-analysis/index.vue | 228 +++ .../views/produce/exception-data/index.vue | 22 + .../produce/exception-data/schemas/index.tsx | 187 ++ .../views/produce/exception-setting/index.vue | 22 + .../exception-setting/schemas/index.tsx | 100 + .../produce/exception/analysis/index.vue | 228 +++ .../views/produce/exception/data/index.vue | 22 + .../produce/exception/data/schemas/index.tsx | 127 ++ .../views/produce/exception/setting/index.vue | 22 + .../exception/setting/schemas/index.tsx | 100 + .../views/produce/material-category/index.vue | 24 + .../material-category/schemas/index.tsx | 42 + .../produce/views/produce/material/index.vue | 49 + .../views/produce/material/schemas/index.tsx | 50 + .../views/produce/process-step/index.vue | 26 + .../produce/process-step/schemas/index.tsx | 185 ++ .../produce/views/produce/process/index.vue | 26 + .../views/produce/process/schemas/index.tsx | 154 ++ .../views/produce/product-record/index.vue | 22 + .../produce/product-record/schemas/index.tsx | 249 +++ .../hardware-fault-description/index.vue | 49 + .../schemas/index.tsx | 135 ++ .../produce/repair/repair-data/index.vue | 22 + .../repair/repair-data/schemas/index.tsx | 490 +++++ .../produce/repair/repair-setting/index.vue | 22 + .../repair/repair-setting/schemas/index.tsx | 100 + .../produce/views/produce/scan-data/index.vue | 22 + .../views/produce/scan-data/schemas/index.tsx | 254 +++ .../views/produce/statistics/daily/index.vue | 310 +++ .../produce/statistics/monthly/index.vue | 290 +++ .../views/produce/status-transition/index.vue | 26 + .../status-transition/schemas/index.tsx | 290 +++ .../views/produce/step-relation/index.vue | 26 + .../produce/step-relation/schemas/index.tsx | 218 +++ .../views/produce/step-status/index.vue | 26 + .../produce/step-status/schemas/index.tsx | 227 +++ .../views/produce/transition-log/index.vue | 26 + .../produce/transition-log/schemas/index.tsx | 277 +++ frontend/admin/src/apps/test01/api/index.ts | 18 + .../admin/src/apps/test01/lang/en/en.json | 8 + .../admin/src/apps/test01/lang/zh-cn/zh.json | 8 + 334 files changed, 34419 insertions(+), 1 deletion(-) create mode 100644 backend/plugin/article/Install.php create mode 100644 backend/plugin/article/app/adminapi/controller/ArticleController.php create mode 100644 backend/plugin/article/app/adminapi/controller/CategoryController.php create mode 100644 backend/plugin/article/app/adminapi/controller/ContentController.php create mode 100644 backend/plugin/article/app/adminapi/controller/TagController.php create mode 100644 backend/plugin/article/app/api/controller/.gitkeep create mode 100644 backend/plugin/article/app/dao/.gitkeep create mode 100644 backend/plugin/article/app/dao/CategoryDao.php create mode 100644 backend/plugin/article/app/dao/ContentDao.php create mode 100644 backend/plugin/article/app/dao/TagDao.php create mode 100644 backend/plugin/article/app/model/.gitkeep create mode 100644 backend/plugin/article/app/model/BaseModel.php create mode 100644 backend/plugin/article/app/model/Category.php create mode 100644 backend/plugin/article/app/model/Content.php create mode 100644 backend/plugin/article/app/model/Tag.php create mode 100644 backend/plugin/article/app/schema/request/.gitkeep create mode 100644 backend/plugin/article/app/schema/response/.gitkeep create mode 100644 backend/plugin/article/app/service/admin/.gitkeep create mode 100644 backend/plugin/article/app/service/admin/CategoryService.php create mode 100644 backend/plugin/article/app/service/admin/ContentService.php create mode 100644 backend/plugin/article/app/service/admin/TagService.php create mode 100644 backend/plugin/article/app/service/api/.gitkeep create mode 100644 backend/plugin/article/app/validate/.gitkeep create mode 100644 backend/plugin/article/app/validate/CategoryValidate.php create mode 100644 backend/plugin/article/app/validate/ContentValidate.php create mode 100644 backend/plugin/article/app/validate/TagValidate.php create mode 100644 backend/plugin/article/config/app.php create mode 100644 backend/plugin/article/config/info.php create mode 100644 backend/plugin/article/config/installed.php create mode 100644 backend/plugin/article/config/route.php create mode 100644 backend/plugin/article/config/translation.php create mode 100644 backend/plugin/article/public/cover.png create mode 100644 backend/plugin/article/public/icon.png create mode 100644 backend/plugin/article/resource/database/migrations/.gitkeep create mode 100644 backend/plugin/article/resource/database/migrations/2026_07_25_000001_create_article_tables.php create mode 100644 backend/plugin/article/resource/database/migrations/2026_07_26_000002_alter_article_content_add_publish_fields.php create mode 100644 backend/plugin/article/resource/database/seeds/.gitkeep create mode 100644 backend/plugin/article/resource/menu/admin.php create mode 100644 backend/plugin/article/resource/menu/frontend.php create mode 100644 backend/plugin/article/resource/menu/web.php create mode 100644 backend/plugin/article/resource/template/admin/.gitkeep create mode 100644 backend/plugin/article/resource/template/admin/api/index.ts create mode 100644 backend/plugin/article/resource/template/admin/lang/en/en.json create mode 100644 backend/plugin/article/resource/template/admin/lang/en/index.json create mode 100644 backend/plugin/article/resource/template/admin/lang/zh-cn/index.json create mode 100644 backend/plugin/article/resource/template/admin/lang/zh-cn/zh.json create mode 100644 backend/plugin/article/resource/template/admin/routes/index.ts create mode 100644 backend/plugin/article/resource/template/admin/views/article/category/index.vue create mode 100644 backend/plugin/article/resource/template/admin/views/article/category/schemas/index.tsx create mode 100644 backend/plugin/article/resource/template/admin/views/article/content/index.vue create mode 100644 backend/plugin/article/resource/template/admin/views/article/content/schemas/index.tsx create mode 100644 backend/plugin/article/resource/template/admin/views/article/index/index.vue create mode 100644 backend/plugin/article/resource/template/admin/views/article/recycle/index.vue create mode 100644 backend/plugin/article/resource/template/admin/views/article/recycle/schemas/index.tsx create mode 100644 backend/plugin/article/resource/template/admin/views/article/tag/index.vue create mode 100644 backend/plugin/article/resource/template/admin/views/article/tag/schemas/index.tsx create mode 100644 backend/plugin/article/resource/template/admin/views/index/index.vue create mode 100644 backend/plugin/article/resource/template/web/.gitkeep create mode 100644 backend/plugin/produce/Install.php create mode 100644 backend/plugin/produce/app/adminapi/controller/ExceptionAnalysisController.php create mode 100644 backend/plugin/produce/app/adminapi/controller/ExceptionRecordController.php create mode 100644 backend/plugin/produce/app/adminapi/controller/ExceptionSettingController.php create mode 100644 backend/plugin/produce/app/adminapi/controller/HardwareFaultDescriptionController.php create mode 100644 backend/plugin/produce/app/adminapi/controller/MaterialCategoryController.php create mode 100644 backend/plugin/produce/app/adminapi/controller/MaterialController.php create mode 100644 backend/plugin/produce/app/adminapi/controller/ProcessController.php create mode 100644 backend/plugin/produce/app/adminapi/controller/ProcessStepController.php create mode 100644 backend/plugin/produce/app/adminapi/controller/ProduceConfigController.php create mode 100644 backend/plugin/produce/app/adminapi/controller/ProduceController.php create mode 100644 backend/plugin/produce/app/adminapi/controller/ProductRecordController.php create mode 100644 backend/plugin/produce/app/adminapi/controller/RepairRecordController.php create mode 100644 backend/plugin/produce/app/adminapi/controller/RepairSettingController.php create mode 100644 backend/plugin/produce/app/adminapi/controller/ScanDataController.php create mode 100644 backend/plugin/produce/app/adminapi/controller/SpecificRuleController.php create mode 100644 backend/plugin/produce/app/adminapi/controller/StatusTransitionController.php create mode 100644 backend/plugin/produce/app/adminapi/controller/StepRelationController.php create mode 100644 backend/plugin/produce/app/adminapi/controller/StepStatusController.php create mode 100644 backend/plugin/produce/app/adminapi/controller/TransitionLogController.php create mode 100644 backend/plugin/produce/app/adminapi/controller/WorkStatisticsController.php create mode 100644 backend/plugin/produce/app/api/controller/.gitkeep create mode 100644 backend/plugin/produce/app/api/controller/DataEntryController.php create mode 100644 backend/plugin/produce/app/appapi/controller/DataEntryController.php create mode 100644 backend/plugin/produce/app/dao/.gitkeep create mode 100644 backend/plugin/produce/app/dao/ExceptionRecordDao.php create mode 100644 backend/plugin/produce/app/dao/ExceptionSettingDao.php create mode 100644 backend/plugin/produce/app/dao/HardwareFaultDescriptionDao.php create mode 100644 backend/plugin/produce/app/dao/MaterialCategoryDao.php create mode 100644 backend/plugin/produce/app/dao/MaterialDao.php create mode 100644 backend/plugin/produce/app/dao/ProcessDao.php create mode 100644 backend/plugin/produce/app/dao/ProcessStepDao.php create mode 100644 backend/plugin/produce/app/dao/ProduceConfigDao.php create mode 100644 backend/plugin/produce/app/dao/ProductRecordDao.php create mode 100644 backend/plugin/produce/app/dao/RepairRecordDao.php create mode 100644 backend/plugin/produce/app/dao/RepairSettingDao.php create mode 100644 backend/plugin/produce/app/dao/ScanDataDao.php create mode 100644 backend/plugin/produce/app/dao/SpecificRuleDao.php create mode 100644 backend/plugin/produce/app/dao/StatusTransitionDao.php create mode 100644 backend/plugin/produce/app/dao/StepRelationDao.php create mode 100644 backend/plugin/produce/app/dao/StepStatusDao.php create mode 100644 backend/plugin/produce/app/dao/TransitionLogDao.php create mode 100644 backend/plugin/produce/app/model/.gitkeep create mode 100644 backend/plugin/produce/app/model/BaseModel.php create mode 100644 backend/plugin/produce/app/model/ExceptionRecord.php create mode 100644 backend/plugin/produce/app/model/ExceptionSetting.php create mode 100644 backend/plugin/produce/app/model/HardwareFaultDescription.php create mode 100644 backend/plugin/produce/app/model/Material.php create mode 100644 backend/plugin/produce/app/model/MaterialCategory.php create mode 100644 backend/plugin/produce/app/model/Process.php create mode 100644 backend/plugin/produce/app/model/ProcessStep.php create mode 100644 backend/plugin/produce/app/model/ProduceConfig.php create mode 100644 backend/plugin/produce/app/model/ProductRecord.php create mode 100644 backend/plugin/produce/app/model/RepairRecord.php create mode 100644 backend/plugin/produce/app/model/RepairSetting.php create mode 100644 backend/plugin/produce/app/model/ScanData.php create mode 100644 backend/plugin/produce/app/model/SpecificRule.php create mode 100644 backend/plugin/produce/app/model/StatusTransition.php create mode 100644 backend/plugin/produce/app/model/StepRelation.php create mode 100644 backend/plugin/produce/app/model/StepStatus.php create mode 100644 backend/plugin/produce/app/model/TransitionLog.php create mode 100644 backend/plugin/produce/app/schema/request/.gitkeep create mode 100644 backend/plugin/produce/app/schema/response/.gitkeep create mode 100644 backend/plugin/produce/app/service/admin/.gitkeep create mode 100644 backend/plugin/produce/app/service/admin/ExceptionAnalysisService.php create mode 100644 backend/plugin/produce/app/service/admin/ExceptionRecordService.php create mode 100644 backend/plugin/produce/app/service/admin/ExceptionSettingService.php create mode 100644 backend/plugin/produce/app/service/admin/HardwareFaultDescriptionService.php create mode 100644 backend/plugin/produce/app/service/admin/MaterialCategoryService.php create mode 100644 backend/plugin/produce/app/service/admin/MaterialService.php create mode 100644 backend/plugin/produce/app/service/admin/ProcessService.php create mode 100644 backend/plugin/produce/app/service/admin/ProcessStepService.php create mode 100644 backend/plugin/produce/app/service/admin/ProduceConfigService.php create mode 100644 backend/plugin/produce/app/service/admin/ProductRecordService.php create mode 100644 backend/plugin/produce/app/service/admin/RepairRecordService.php create mode 100644 backend/plugin/produce/app/service/admin/RepairSettingService.php create mode 100644 backend/plugin/produce/app/service/admin/ScanDataService.php create mode 100644 backend/plugin/produce/app/service/admin/SpecificRuleService.php create mode 100644 backend/plugin/produce/app/service/admin/StatusTransitionService.php create mode 100644 backend/plugin/produce/app/service/admin/StepRelationService.php create mode 100644 backend/plugin/produce/app/service/admin/StepStatusService.php create mode 100644 backend/plugin/produce/app/service/admin/TransitionLogService.php create mode 100644 backend/plugin/produce/app/service/admin/WorkStatisticsService.php create mode 100644 backend/plugin/produce/app/service/api/.gitkeep create mode 100644 backend/plugin/produce/app/validate/.gitkeep create mode 100644 backend/plugin/produce/app/validate/ExceptionRecordValidate.php create mode 100644 backend/plugin/produce/app/validate/ExceptionSettingValidate.php create mode 100644 backend/plugin/produce/app/validate/HardwareFaultDescriptionValidate.php create mode 100644 backend/plugin/produce/app/validate/MaterialCategoryValidate.php create mode 100644 backend/plugin/produce/app/validate/MaterialValidate.php create mode 100644 backend/plugin/produce/app/validate/ProcessStepValidate.php create mode 100644 backend/plugin/produce/app/validate/ProcessValidate.php create mode 100644 backend/plugin/produce/app/validate/ProductRecordValidate.php create mode 100644 backend/plugin/produce/app/validate/RepairRecordValidate.php create mode 100644 backend/plugin/produce/app/validate/RepairSettingValidate.php create mode 100644 backend/plugin/produce/app/validate/ScanDataValidate.php create mode 100644 backend/plugin/produce/app/validate/SpecificRuleValidate.php create mode 100644 backend/plugin/produce/app/validate/StatusTransitionValidate.php create mode 100644 backend/plugin/produce/app/validate/StepRelationValidate.php create mode 100644 backend/plugin/produce/app/validate/StepStatusValidate.php create mode 100644 backend/plugin/produce/config/app.php create mode 100644 backend/plugin/produce/config/info.php create mode 100644 backend/plugin/produce/config/installed.php create mode 100644 backend/plugin/produce/config/middleware.php create mode 100644 backend/plugin/produce/config/route.php create mode 100644 backend/plugin/produce/config/translation.php create mode 100644 backend/plugin/produce/produce-replication-plan.md create mode 100644 backend/plugin/produce/public/cover.png create mode 100644 backend/plugin/produce/public/icon.png create mode 100644 backend/plugin/produce/resource/database/migrations/.gitkeep create mode 100644 backend/plugin/produce/resource/database/migrations/2026_07_30_000001_create_produce_basic_tables.php create mode 100644 backend/plugin/produce/resource/database/migrations/2026_07_31_000002_create_produce_transition_log_table.php create mode 100644 backend/plugin/produce/resource/database/migrations/2026_07_31_000003_create_produce_config_and_scan_data_tables.php create mode 100644 backend/plugin/produce/resource/database/migrations/2026_08_06_000001_create_produce_product_record_table.php create mode 100644 backend/plugin/produce/resource/database/migrations/2026_08_07_000001_add_mode_fields_to_produce_specific_rule_table.php create mode 100644 backend/plugin/produce/resource/database/migrations/2026_08_12_000001_create_produce_exception_tables.php create mode 100644 backend/plugin/produce/resource/database/migrations/2026_08_13_000001_create_produce_material_tables.php create mode 100644 backend/plugin/produce/resource/database/migrations/2026_08_14_000001_create_produce_repair_management_tables.php create mode 100644 backend/plugin/produce/resource/database/migrations/2026_08_15_000001_add_exception_snapshot_to_repair_record.php create mode 100644 backend/plugin/produce/resource/database/migrations/2026_08_16_000001_align_produce_repair_setting.php create mode 100644 backend/plugin/produce/resource/database/migrations/2026_08_17_000001_add_operation_fault_responsibility_to_repair_record.php create mode 100644 backend/plugin/produce/resource/database/migrations/2026_08_18_000001_add_category_ids_to_produce_repair_record.php create mode 100644 backend/plugin/produce/resource/database/migrations/2026_08_22_000001_add_quantity_to_produce_scan_data_table.php create mode 100644 backend/plugin/produce/resource/database/migrations/2026_08_30_000001_add_images_to_produce_repair_record.php create mode 100644 backend/plugin/produce/resource/database/seeds/.gitkeep create mode 100644 backend/plugin/produce/resource/database/seeds/ProduceDemoDataSeeder.php create mode 100644 backend/plugin/produce/resource/menu/admin.php create mode 100644 backend/plugin/produce/resource/menu/frontend.php create mode 100644 backend/plugin/produce/resource/menu/web.php create mode 100644 backend/plugin/produce/resource/template/admin/.gitkeep create mode 100644 backend/plugin/produce/resource/template/admin/api/index.ts create mode 100644 backend/plugin/produce/resource/template/admin/api/statistics.ts create mode 100644 backend/plugin/produce/resource/template/admin/lang/en/en.json create mode 100644 backend/plugin/produce/resource/template/admin/lang/zh-cn/zh.json create mode 100644 backend/plugin/produce/resource/template/admin/menu/admin.php create mode 100644 backend/plugin/produce/resource/template/admin/routes/index.ts create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/config/index.vue create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/config/modules/basic-setting.vue create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/config/modules/erp-integration.vue create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/config/modules/specific-rule.vue create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/config/modules/step-rule.vue create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/exception/analysis/index.vue create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/exception/data/index.vue create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/exception/data/schemas/index.tsx create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/exception/setting/index.vue create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/exception/setting/schemas/index.tsx create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/material-category/index.vue create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/material-category/schemas/index.tsx create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/material/index.vue create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/material/schemas/index.tsx create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/process-step/index.vue create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/process-step/schemas/index.tsx create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/process/index.vue create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/process/schemas/index.tsx create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/product-record/index.vue create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/product-record/schemas/index.tsx create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/repair/hardware-fault-description/index.vue create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/repair/hardware-fault-description/schemas/index.tsx create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/repair/repair-data/index.vue create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/repair/repair-data/schemas/index.tsx create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/repair/repair-setting/index.vue create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/repair/repair-setting/schemas/index.tsx create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/scan-data/index.vue create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/scan-data/schemas/index.tsx create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/statistics/daily/index.vue create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/statistics/monthly/index.vue create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/status-transition/index.vue create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/status-transition/schemas/index.tsx create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/step-relation/index.vue create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/step-relation/schemas/index.tsx create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/step-status/index.vue create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/step-status/schemas/index.tsx create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/transition-log/index.vue create mode 100644 backend/plugin/produce/resource/template/admin/views/produce/transition-log/schemas/index.tsx create mode 100644 backend/plugin/produce/resource/template/web/.gitkeep create mode 100644 backend/plugin/produce/resource/template/web/api/data-entry.ts create mode 100644 backend/plugin/produce/resource/template/web/api/exception.ts create mode 100644 backend/plugin/produce/resource/template/web/api/query.ts create mode 100644 backend/plugin/produce/resource/template/web/pages/data-entry/components/MachineEntryPanel.vue create mode 100644 backend/plugin/produce/resource/template/web/pages/data-entry/components/OrderEntryPanel.vue create mode 100644 backend/plugin/produce/resource/template/web/pages/data-entry/components/entry-panel.css create mode 100644 backend/plugin/produce/resource/template/web/pages/data-entry/index.vue create mode 100644 backend/plugin/produce/resource/template/web/pages/exception/index.vue create mode 100644 backend/plugin/produce/resource/template/web/pages/query/index.vue create mode 100644 backend/plugin/produce/resource/template/web/pages/repair/index.vue create mode 100644 backend/plugin/produce/resource/template/web/pages/repair/tasks.vue create mode 100644 backend/plugin/produce/resource/template/web/pages/routes.ts create mode 100644 frontend/admin/src/apps/article - 副本/.gitkeep create mode 100644 frontend/admin/src/apps/article - 副本/api/index.ts create mode 100644 frontend/admin/src/apps/article - 副本/lang/en/en.json create mode 100644 frontend/admin/src/apps/article - 副本/lang/en/index.json create mode 100644 frontend/admin/src/apps/article - 副本/lang/zh-cn/index.json create mode 100644 frontend/admin/src/apps/article - 副本/lang/zh-cn/zh.json create mode 100644 frontend/admin/src/apps/article - 副本/routes/index.ts create mode 100644 frontend/admin/src/apps/article - 副本/views/article/category/index.vue create mode 100644 frontend/admin/src/apps/article - 副本/views/article/category/schemas/index.tsx create mode 100644 frontend/admin/src/apps/article - 副本/views/article/content/index.vue create mode 100644 frontend/admin/src/apps/article - 副本/views/article/content/schemas/index.tsx create mode 100644 frontend/admin/src/apps/article - 副本/views/article/index/index.vue create mode 100644 frontend/admin/src/apps/article - 副本/views/article/recycle/index.vue create mode 100644 frontend/admin/src/apps/article - 副本/views/article/recycle/schemas/index.tsx create mode 100644 frontend/admin/src/apps/article - 副本/views/article/tag/index.vue create mode 100644 frontend/admin/src/apps/article - 副本/views/article/tag/schemas/index.tsx create mode 100644 frontend/admin/src/apps/article - 副本/views/index/index.vue create mode 100644 frontend/admin/src/apps/article/.gitkeep create mode 100644 frontend/admin/src/apps/article/api/index.ts create mode 100644 frontend/admin/src/apps/article/lang/en/en.json create mode 100644 frontend/admin/src/apps/article/lang/en/index.json create mode 100644 frontend/admin/src/apps/article/lang/zh-cn/index.json create mode 100644 frontend/admin/src/apps/article/lang/zh-cn/zh.json create mode 100644 frontend/admin/src/apps/article/routes/index.ts create mode 100644 frontend/admin/src/apps/article/views/article/category/index.vue create mode 100644 frontend/admin/src/apps/article/views/article/category/schemas/index.tsx create mode 100644 frontend/admin/src/apps/article/views/article/content/index.vue create mode 100644 frontend/admin/src/apps/article/views/article/content/schemas/index.tsx create mode 100644 frontend/admin/src/apps/article/views/article/index/index.vue create mode 100644 frontend/admin/src/apps/article/views/article/recycle/index.vue create mode 100644 frontend/admin/src/apps/article/views/article/recycle/schemas/index.tsx create mode 100644 frontend/admin/src/apps/article/views/article/tag/index.vue create mode 100644 frontend/admin/src/apps/article/views/article/tag/schemas/index.tsx create mode 100644 frontend/admin/src/apps/article/views/index/index.vue create mode 100644 frontend/admin/src/apps/produce/.gitkeep create mode 100644 frontend/admin/src/apps/produce/api/index.ts create mode 100644 frontend/admin/src/apps/produce/api/statistics.ts create mode 100644 frontend/admin/src/apps/produce/lang/en/en.json create mode 100644 frontend/admin/src/apps/produce/lang/zh-cn/zh.json create mode 100644 frontend/admin/src/apps/produce/menu/admin.php create mode 100644 frontend/admin/src/apps/produce/routes/index.ts create mode 100644 frontend/admin/src/apps/produce/views/produce/config/index.vue create mode 100644 frontend/admin/src/apps/produce/views/produce/config/modules/basic-setting.vue create mode 100644 frontend/admin/src/apps/produce/views/produce/config/modules/erp-integration.vue create mode 100644 frontend/admin/src/apps/produce/views/produce/config/modules/specific-rule.vue create mode 100644 frontend/admin/src/apps/produce/views/produce/config/modules/step-rule.vue create mode 100644 frontend/admin/src/apps/produce/views/produce/exception-analysis/index.vue create mode 100644 frontend/admin/src/apps/produce/views/produce/exception-data/index.vue create mode 100644 frontend/admin/src/apps/produce/views/produce/exception-data/schemas/index.tsx create mode 100644 frontend/admin/src/apps/produce/views/produce/exception-setting/index.vue create mode 100644 frontend/admin/src/apps/produce/views/produce/exception-setting/schemas/index.tsx create mode 100644 frontend/admin/src/apps/produce/views/produce/exception/analysis/index.vue create mode 100644 frontend/admin/src/apps/produce/views/produce/exception/data/index.vue create mode 100644 frontend/admin/src/apps/produce/views/produce/exception/data/schemas/index.tsx create mode 100644 frontend/admin/src/apps/produce/views/produce/exception/setting/index.vue create mode 100644 frontend/admin/src/apps/produce/views/produce/exception/setting/schemas/index.tsx create mode 100644 frontend/admin/src/apps/produce/views/produce/material-category/index.vue create mode 100644 frontend/admin/src/apps/produce/views/produce/material-category/schemas/index.tsx create mode 100644 frontend/admin/src/apps/produce/views/produce/material/index.vue create mode 100644 frontend/admin/src/apps/produce/views/produce/material/schemas/index.tsx create mode 100644 frontend/admin/src/apps/produce/views/produce/process-step/index.vue create mode 100644 frontend/admin/src/apps/produce/views/produce/process-step/schemas/index.tsx create mode 100644 frontend/admin/src/apps/produce/views/produce/process/index.vue create mode 100644 frontend/admin/src/apps/produce/views/produce/process/schemas/index.tsx create mode 100644 frontend/admin/src/apps/produce/views/produce/product-record/index.vue create mode 100644 frontend/admin/src/apps/produce/views/produce/product-record/schemas/index.tsx create mode 100644 frontend/admin/src/apps/produce/views/produce/repair/hardware-fault-description/index.vue create mode 100644 frontend/admin/src/apps/produce/views/produce/repair/hardware-fault-description/schemas/index.tsx create mode 100644 frontend/admin/src/apps/produce/views/produce/repair/repair-data/index.vue create mode 100644 frontend/admin/src/apps/produce/views/produce/repair/repair-data/schemas/index.tsx create mode 100644 frontend/admin/src/apps/produce/views/produce/repair/repair-setting/index.vue create mode 100644 frontend/admin/src/apps/produce/views/produce/repair/repair-setting/schemas/index.tsx create mode 100644 frontend/admin/src/apps/produce/views/produce/scan-data/index.vue create mode 100644 frontend/admin/src/apps/produce/views/produce/scan-data/schemas/index.tsx create mode 100644 frontend/admin/src/apps/produce/views/produce/statistics/daily/index.vue create mode 100644 frontend/admin/src/apps/produce/views/produce/statistics/monthly/index.vue create mode 100644 frontend/admin/src/apps/produce/views/produce/status-transition/index.vue create mode 100644 frontend/admin/src/apps/produce/views/produce/status-transition/schemas/index.tsx create mode 100644 frontend/admin/src/apps/produce/views/produce/step-relation/index.vue create mode 100644 frontend/admin/src/apps/produce/views/produce/step-relation/schemas/index.tsx create mode 100644 frontend/admin/src/apps/produce/views/produce/step-status/index.vue create mode 100644 frontend/admin/src/apps/produce/views/produce/step-status/schemas/index.tsx create mode 100644 frontend/admin/src/apps/produce/views/produce/transition-log/index.vue create mode 100644 frontend/admin/src/apps/produce/views/produce/transition-log/schemas/index.tsx create mode 100644 frontend/admin/src/apps/test01/api/index.ts create mode 100644 frontend/admin/src/apps/test01/lang/en/en.json create mode 100644 frontend/admin/src/apps/test01/lang/zh-cn/zh.json diff --git a/backend/.gitignore b/backend/.gitignore index 5dca95d..7321ec3 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -21,6 +21,8 @@ public/* plugin/* !plugin/example/ !plugin/demo/ +!plugin/produce/ +!plugin/article/ diff --git a/backend/plugin/article/Install.php b/backend/plugin/article/Install.php new file mode 100644 index 0000000..caa51ac --- /dev/null +++ b/backend/plugin/article/Install.php @@ -0,0 +1,59 @@ +importPluginMenus() - 导入菜单 + * - $this->importTemplates() - 复制模板 + * - $this->uninstallPluginMenus() - 卸载菜单 + */ +class Install extends BasePluginInstall +{ + /** + * 安装前回调 + */ + protected function beforeInstall(string $version): void + { + $this->output(" 🔄 Running beforeInstall...\n"); + } + + /** + * 安装后回调 - 按需导入菜单和模板 + */ + protected function afterInstall(string $version): void + { + $this->output(" 🔄 Running afterInstall...\n"); + + // 导入菜单 + $this->importPluginMenus(); + + // 复制模板资源 + $this->importTemplates(); + } + + /** + * 卸载前回调 + */ + protected function beforeUninstall(string $version): void + { + $this->output(" 🔄 Running beforeUninstall...\n"); + } + + /** + * 卸载后回调 - 清理菜单 + */ + protected function afterUninstall(string $version): void + { + $this->output(" 🔄 Running afterUninstall...\n"); + // 卸载菜单 + $this->uninstallPluginMenus(); + } +} diff --git a/backend/plugin/article/app/adminapi/controller/ArticleController.php b/backend/plugin/article/app/adminapi/controller/ArticleController.php new file mode 100644 index 0000000..d15f982 --- /dev/null +++ b/backend/plugin/article/app/adminapi/controller/ArticleController.php @@ -0,0 +1,231 @@ +currentUser = $currentUser; + } + + #[OA\Get( + path: '/article/legacy/index', + summary: '旧版内容列表示例', + tags: ['article-legacy'] + )] + #[DataResponse(description: '获取成功')] + #[Permission(code: 'article:legacy:index', description: '旧版内容列表示例')] + public function index(Request $request): Response + { + return Json::success('获取成功', [ + [ + 'title' => '欢迎使用文章管理插件', + 'category' => '默认分类', + 'tags' => '插件, 演示', + 'status' => '已发布', + 'updated_at' => '2026-07-25 17:50:00', + ], + ]); + } + + #[OA\Get( + path: '/article/legacy/category', + summary: '旧版内容分类列表示例', + tags: ['article-legacy'] + )] + #[DataResponse(description: '获取成功')] + #[Permission(code: 'article:legacy:category', description: '旧版内容分类列表示例')] + public function category(Request $request): Response + { + return Json::success('获取成功', [ + [ + 'name' => '默认分类', + 'slug' => 'default-category', + 'article_count' => 1, + 'sort' => 100, + 'updated_at' => '2026-07-25 17:50:00', + ], + ]); + } + + #[OA\Get( + path: '/article/legacy/tag', + summary: '旧版标签列表示例', + tags: ['article-legacy'] + )] + #[DataResponse(description: '获取成功')] + #[Permission(code: 'article:legacy:tag', description: '旧版标签列表示例')] + public function tag(Request $request): Response + { + return Json::success('获取成功', [ + [ + 'name' => '插件演示', + 'slug' => 'plugin-demo', + 'article_count' => 1, + 'heat' => 88, + 'updated_at' => '2026-07-25 17:50:00', + ], + ]); + } + + #[OA\Get( + path: '/article/recycle', + summary: '内容回收站列表', + tags: ['article-legacy'] + )] + #[DataResponse(description: '获取成功')] + #[Permission(code: 'article:recycle:index', description: '内容回收站权限')] + public function recycle(Request $request): Response + { + $keyword = trim((string) $request->input('LIKE_title', '')); + + $items = Content::query() + ->onlyTrashed() + ->with(['category']) + ->when($keyword !== '', function ($query) use ($keyword) { + $query->where('title', 'like', "%{$keyword}%"); + }) + ->orderByDesc('deleted_at') + ->get(); + + $operatorIds = $items->pluck('updated_by') + ->filter(static fn($id) => !empty($id)) + ->unique() + ->values() + ->all(); + + $operators = empty($operatorIds) + ? collect() + : Admin::query()->whereIn('id', $operatorIds)->get(['id', 'real_name']); + + $operatorMap = $operators->pluck('real_name', 'id'); + + $rows = $items->map(function (Content $item) use ($operatorMap) { + $deletedAt = $item->deleted_at; + return [ + 'id' => $item->id, + 'title' => $item->title, + 'category' => $item->category?->name ?? '', + 'deleted_by' => $operatorMap[$item->updated_by] ?? '', + 'deleted_at' => $deletedAt ? date('Y-m-d H:i:s', (int) $deletedAt) : '', + 'expire_at' => $deletedAt ? date('Y-m-d H:i:s', (int) $deletedAt + 30 * 24 * 60 * 60) : '', + ]; + })->values()->all(); + + return Json::success('获取成功', $rows); + } + + #[OA\Put( + path: '/article/recycle/{id}/restore', + summary: '恢复内容', + tags: ['article-legacy'] + )] + #[SimpleResponse(description: '恢复成功')] + #[Permission(code: 'article:recycle:restore', description: '恢复回收站内容')] + public function restore(Request $request): Response + { + try { + $id = $request->route?->param('id') ?: $request->input('id'); + $item = Content::withTrashed()->find($id); + if (!$item) { + return Json::fail('内容不存在'); + } + $item->restore(); + return Json::success('恢复成功'); + } catch (\Throwable $e) { + return Json::fail($e->getMessage()); + } + } + + #[OA\Delete( + path: '/article/recycle/{id}', + summary: '彻底删除内容', + tags: ['article-legacy'] + )] + #[SimpleResponse(description: '删除成功')] + #[Permission(code: 'article:recycle:delete', description: '彻底删除回收站内容')] + public function destroyRecycle(Request $request): Response + { + try { + $id = $request->route?->param('id') ?: $request->input('id'); + $item = Content::withTrashed()->find($id); + if (!$item) { + return Json::fail('内容不存在'); + } + $item->forceDelete(); + return Json::success('删除成功'); + } catch (\Throwable $e) { + return Json::fail($e->getMessage()); + } + } + + #[OA\Post( + path: '/article/legacy/create', + summary: '旧版创建示例', + tags: ['article-legacy'] + )] + #[SimpleResponse(description: '创建成功')] + #[Permission(code: 'article:legacy:create', description: '旧版创建示例')] + public function create(Request $request): Response + { + return Json::success('创建成功'); + } + + #[OA\Get( + path: '/article/legacy/info', + summary: '旧版详情示例', + tags: ['article-legacy'] + )] + #[DataResponse(description: '获取成功')] + #[Permission(code: 'article:legacy:info', description: '旧版详情示例')] + public function info(Request $request): Response + { + return Json::success('获取成功', []); + } + + #[OA\Post( + path: '/article/legacy/update', + summary: '旧版更新示例', + tags: ['article-legacy'] + )] + #[SimpleResponse(description: '更新成功')] + #[Permission(code: 'article:legacy:update', description: '旧版更新示例')] + public function update(Request $request): Response + { + return Json::success('更新成功'); + } + + #[OA\Post( + path: '/article/legacy/delete', + summary: '旧版删除示例', + tags: ['article-legacy'] + )] + #[SimpleResponse(description: '删除成功')] + #[Permission(code: 'article:legacy:delete', description: '旧版删除示例')] + public function delete(Request $request): Response + { + return Json::success('删除成功'); + } +} diff --git a/backend/plugin/article/app/adminapi/controller/CategoryController.php b/backend/plugin/article/app/adminapi/controller/CategoryController.php new file mode 100644 index 0000000..b1fdc7e --- /dev/null +++ b/backend/plugin/article/app/adminapi/controller/CategoryController.php @@ -0,0 +1,127 @@ +service = $service; + $this->validate = $validate; + } + + #[OA\Get( + path: '/article/category', + summary: '内容分类列表', + tags: ['article-category'] + )] + #[Permission(code: 'article:category:list', description: '内容分类列表')] + #[PageResponse(schema: [], example: [])] + public function index(Request $request): \support\Response + { + return parent::index($request); + } + + #[OA\Get( + path: '/article/category/{id}', + summary: '内容分类详情', + tags: ['article-category'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'article:category:read', description: '内容分类详情')] + #[SimpleResponse(schema: [], example: [])] + public function show(Request $request): \support\Response + { + return parent::show($request); + } + + #[OA\Post( + path: '/article/category', + summary: '创建内容分类', + tags: ['article-category'] + )] + #[Permission(code: 'article:category:create', description: '创建内容分类')] + #[SimpleResponse(schema: [], example: [])] + public function store(Request $request): \support\Response + { + return parent::store($request); + } + + #[OA\Put( + path: '/article/category/{id}', + summary: '更新内容分类', + tags: ['article-category'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'article:category:update', description: '更新内容分类')] + #[SimpleResponse(schema: [], example: [])] + public function update(Request $request): \support\Response + { + return parent::update($request); + } + + #[OA\Post( + path: '/article/category/export', + summary: '导出内容分类', + tags: ['article-category'] + )] + #[Permission(code: 'article:category:list', description: '导出内容分类')] + #[SimpleResponse(schema: [], example: [])] + public function export(Request $request): \support\Response + { + return parent::export($request); + } + + #[OA\Delete( + path: '/article/category/{id}', + summary: '删除内容分类', + tags: ['article-category'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'article:category:delete', description: '删除内容分类')] + #[SimpleResponse(schema: [], example: [])] + public function destroy(Request $request): \support\Response + { + return parent::destroy($request); + } + + #[OA\Delete( + path: '/article/category', + summary: '批量删除内容分类', + tags: ['article-category'], + x: [SchemaConstants::X_SCHEMA_REQUEST => BatchDeleteRequest::class] + )] + #[Permission(code: 'article:category:delete', description: '批量删除内容分类')] + #[SimpleResponse(schema: [], example: [])] + public function batchDelete(Request $request): \support\Response + { + return parent::destroy($request); + } +} diff --git a/backend/plugin/article/app/adminapi/controller/ContentController.php b/backend/plugin/article/app/adminapi/controller/ContentController.php new file mode 100644 index 0000000..f88797e --- /dev/null +++ b/backend/plugin/article/app/adminapi/controller/ContentController.php @@ -0,0 +1,183 @@ +service = $service; + $this->validate = $validate; + $this->currentUser = Container::make(CurrentUser::class); + } + + #[OA\Get( + path: '/article/index', + summary: '内容中心列表', + tags: ['article-content'] + )] + #[Permission(code: 'article:list', description: '内容中心列表')] + #[PageResponse(schema: [], example: [])] + public function index(Request $request): \support\Response + { + return parent::index($request); + } + + #[OA\Get( + path: '/article/index/{id}', + summary: '内容中心详情', + tags: ['article-content'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'article:read', description: '内容中心详情')] + #[SimpleResponse(schema: [], example: [])] + public function show(Request $request): \support\Response + { + return parent::show($request); + } + + #[OA\Post( + path: '/article/index', + summary: '创建内容', + tags: ['article-content'] + )] + #[Permission(code: 'article:create', description: '创建内容')] + #[SimpleResponse(schema: [], example: [])] + public function store(Request $request): \support\Response + { + return parent::store($request); + } + + #[OA\Put( + path: '/article/index/{id}', + summary: '更新内容', + tags: ['article-content'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'article:update', description: '更新内容')] + #[SimpleResponse(schema: [], example: [])] + public function update(Request $request): \support\Response + { + return parent::update($request); + } + + #[OA\Post( + path: '/article/index/export', + summary: '导出内容', + tags: ['article-content'] + )] + #[Permission(code: 'article:list', description: '导出内容')] + #[SimpleResponse(schema: [], example: [])] + public function export(Request $request): \support\Response + { + return parent::export($request); + } + + protected function selectInput(Request $request, ?array $config = null): array + { + $result = parent::selectInput($request, $config); + if (empty($result[4])) { + $result[4] = 'published_at desc,id desc'; + } + return $result; + } + + protected function insertInput(Request $request): array + { + return $this->inputFilter($request->all(), ['tag_ids']); + } + + #[OA\Delete( + path: '/article/index/{id}', + summary: '删除内容', + tags: ['article-content'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'article:delete', description: '删除内容')] + #[SimpleResponse(schema: [], example: [])] + public function destroy(Request $request): \support\Response + { + return $this->deleteContents($request); + } + + #[OA\Delete( + path: '/article/index', + summary: '批量删除内容', + tags: ['article-content'], + x: [SchemaConstants::X_SCHEMA_REQUEST => BatchDeleteRequest::class] + )] + #[Permission(code: 'article:delete', description: '批量删除内容')] + #[SimpleResponse(schema: [], example: [])] + public function batchDelete(Request $request): \support\Response + { + return $this->deleteContents($request); + } + + protected function deleteContents(Request $request): \support\Response + { + try { + $ids = $this->getDeleteIds($request); + if (empty($ids)) { + throw new \Exception('删除参数不能为空'); + } + + $result = $this->service->transaction(function () use ($ids) { + $data = is_array($ids) ? $ids : explode(',', $ids); + $deletedIds = []; + $currentUserId = $this->currentUser->id(); + foreach ($data as $id) { + $item = Content::query()->find($id); + if (!$item) { + continue; + } + + if ($currentUserId && $item->isFillable('updated_by')) { + $item->setAttribute('updated_by', $currentUserId); + $item->save(); + } + + $item->delete(); + $deletedIds[] = $item->id; + } + return $deletedIds; + }); + + return Json::success('ok', $result); + } catch (\Throwable $e) { + return Json::fail($e->getMessage()); + } + } +} diff --git a/backend/plugin/article/app/adminapi/controller/TagController.php b/backend/plugin/article/app/adminapi/controller/TagController.php new file mode 100644 index 0000000..7584ec2 --- /dev/null +++ b/backend/plugin/article/app/adminapi/controller/TagController.php @@ -0,0 +1,127 @@ +service = $service; + $this->validate = $validate; + } + + #[OA\Get( + path: '/article/tag', + summary: '标签管理列表', + tags: ['article-tag'] + )] + #[Permission(code: 'article:tag:list', description: '标签管理列表')] + #[PageResponse(schema: [], example: [])] + public function index(Request $request): \support\Response + { + return parent::index($request); + } + + #[OA\Get( + path: '/article/tag/{id}', + summary: '标签详情', + tags: ['article-tag'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'article:tag:read', description: '标签详情')] + #[SimpleResponse(schema: [], example: [])] + public function show(Request $request): \support\Response + { + return parent::show($request); + } + + #[OA\Post( + path: '/article/tag', + summary: '创建标签', + tags: ['article-tag'] + )] + #[Permission(code: 'article:tag:create', description: '创建标签')] + #[SimpleResponse(schema: [], example: [])] + public function store(Request $request): \support\Response + { + return parent::store($request); + } + + #[OA\Put( + path: '/article/tag/{id}', + summary: '更新标签', + tags: ['article-tag'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'article:tag:update', description: '更新标签')] + #[SimpleResponse(schema: [], example: [])] + public function update(Request $request): \support\Response + { + return parent::update($request); + } + + #[OA\Post( + path: '/article/tag/export', + summary: '导出标签', + tags: ['article-tag'] + )] + #[Permission(code: 'article:tag:list', description: '导出标签')] + #[SimpleResponse(schema: [], example: [])] + public function export(Request $request): \support\Response + { + return parent::export($request); + } + + #[OA\Delete( + path: '/article/tag/{id}', + summary: '删除标签', + tags: ['article-tag'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'article:tag:delete', description: '删除标签')] + #[SimpleResponse(schema: [], example: [])] + public function destroy(Request $request): \support\Response + { + return parent::destroy($request); + } + + #[OA\Delete( + path: '/article/tag', + summary: '批量删除标签', + tags: ['article-tag'], + x: [SchemaConstants::X_SCHEMA_REQUEST => BatchDeleteRequest::class] + )] + #[Permission(code: 'article:tag:delete', description: '批量删除标签')] + #[SimpleResponse(schema: [], example: [])] + public function batchDelete(Request $request): \support\Response + { + return parent::destroy($request); + } +} diff --git a/backend/plugin/article/app/api/controller/.gitkeep b/backend/plugin/article/app/api/controller/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/backend/plugin/article/app/dao/.gitkeep b/backend/plugin/article/app/dao/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/backend/plugin/article/app/dao/CategoryDao.php b/backend/plugin/article/app/dao/CategoryDao.php new file mode 100644 index 0000000..e48fa4c --- /dev/null +++ b/backend/plugin/article/app/dao/CategoryDao.php @@ -0,0 +1,40 @@ +withCount(['contents as article_count']); + } + + return $query; + } +} diff --git a/backend/plugin/article/app/dao/ContentDao.php b/backend/plugin/article/app/dao/ContentDao.php new file mode 100644 index 0000000..5c35f4c --- /dev/null +++ b/backend/plugin/article/app/dao/ContentDao.php @@ -0,0 +1,26 @@ +withCount(['contents as article_count']); + } + + return $query; + } +} diff --git a/backend/plugin/article/app/model/.gitkeep b/backend/plugin/article/app/model/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/backend/plugin/article/app/model/BaseModel.php b/backend/plugin/article/app/model/BaseModel.php new file mode 100644 index 0000000..aff93b4 --- /dev/null +++ b/backend/plugin/article/app/model/BaseModel.php @@ -0,0 +1,37 @@ +hasOne(Admin::class, 'id', 'created_by')->select('id', 'real_name as created_name'); + } + + public function updateds(): HasOne + { + return $this->hasOne(Admin::class, 'id', 'updated_by')->select('id', 'real_name as updated_name'); + } + + public function getCreatedNameAttribute(): string + { + return $this->createds?->created_name ?? ''; + } + + public function getUpdatedNameAttribute(): string + { + return $this->updateds?->updated_name ?? ''; + } +} diff --git a/backend/plugin/article/app/model/Category.php b/backend/plugin/article/app/model/Category.php new file mode 100644 index 0000000..f5582a6 --- /dev/null +++ b/backend/plugin/article/app/model/Category.php @@ -0,0 +1,41 @@ + 'integer', + 'sort' => 'integer', + 'enabled' => 'integer', + 'created_at' => 'integer', + 'updated_at' => 'integer', + 'deleted_at' => 'integer', + ]; + + public function contents(): HasMany + { + return $this->hasMany(Content::class, 'category_id', 'id'); + } +} diff --git a/backend/plugin/article/app/model/Content.php b/backend/plugin/article/app/model/Content.php new file mode 100644 index 0000000..2b383fe --- /dev/null +++ b/backend/plugin/article/app/model/Content.php @@ -0,0 +1,93 @@ + 'integer', + 'visibility' => 'integer', + 'status' => 'integer', + 'is_top' => 'integer', + 'is_recommend' => 'integer', + 'allow_comment' => 'integer', + 'sort' => 'integer', + 'view_count' => 'integer', + 'like_count' => 'integer', + 'comment_count' => 'integer', + 'favorite_count' => 'integer', + 'published_at' => 'integer', + 'offline_at' => 'integer', + 'created_at' => 'integer', + 'updated_at' => 'integer', + 'deleted_at' => 'integer', + ]; + + protected $appends = ['tag_names', 'tag_ids', 'category_name', 'created_date', 'updated_date', 'created_name', 'updated_name']; + + public function category(): BelongsTo + { + return $this->belongsTo(Category::class, 'category_id', 'id'); + } + + public function tags(): BelongsToMany + { + return $this->belongsToMany(Tag::class, 'article_content_tag', 'content_id', 'tag_id'); + } + + public function getCategoryNameAttribute(): string + { + return $this->category?->name ?? ''; + } + + public function getTagNamesAttribute(): string + { + return $this->tags->pluck('name')->implode('、'); + } + + public function getTagIdsAttribute(): array + { + return $this->tags->pluck('id')->map(static fn($id) => is_numeric($id) ? (int)$id : $id)->values()->all(); + } +} diff --git a/backend/plugin/article/app/model/Tag.php b/backend/plugin/article/app/model/Tag.php new file mode 100644 index 0000000..d9e3301 --- /dev/null +++ b/backend/plugin/article/app/model/Tag.php @@ -0,0 +1,41 @@ + 'integer', + 'heat' => 'integer', + 'enabled' => 'integer', + 'created_at' => 'integer', + 'updated_at' => 'integer', + 'deleted_at' => 'integer', + ]; + + public function contents(): BelongsToMany + { + return $this->belongsToMany(Content::class, 'article_content_tag', 'tag_id', 'content_id'); + } +} diff --git a/backend/plugin/article/app/schema/request/.gitkeep b/backend/plugin/article/app/schema/request/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/backend/plugin/article/app/schema/response/.gitkeep b/backend/plugin/article/app/schema/response/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/backend/plugin/article/app/service/admin/.gitkeep b/backend/plugin/article/app/service/admin/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/backend/plugin/article/app/service/admin/CategoryService.php b/backend/plugin/article/app/service/admin/CategoryService.php new file mode 100644 index 0000000..ee3eb11 --- /dev/null +++ b/backend/plugin/article/app/service/admin/CategoryService.php @@ -0,0 +1,16 @@ +dao = $dao; + } +} diff --git a/backend/plugin/article/app/service/admin/ContentService.php b/backend/plugin/article/app/service/admin/ContentService.php new file mode 100644 index 0000000..9ec9049 --- /dev/null +++ b/backend/plugin/article/app/service/admin/ContentService.php @@ -0,0 +1,129 @@ +dao = $dao; + } + + public function save(array $data): ?\plugin\article\app\model\Content + { + try { + return $this->transaction(function () use ($data) { + $payload = $this->normalizePayload($data); + $tagIds = $payload['tag_ids'] ?? []; + unset($payload['tag_ids']); + + $model = new Content(); + PropertyCopier::copyProperties((object) $payload, $model); + $model->save(); + + $this->syncTags($model, $tagIds); + + return $model->refresh()?->load(['category', 'tags', 'createds', 'updateds']); + }); + } catch (\Throwable $e) { + throw new AdminException($e->getMessage()); + } + } + + public function update($id, $data): void + { + try { + $this->transaction(function () use ($id, $data) { + $model = $this->dao->get($id); + if (!$model) { + throw new AdminException('内容不存在'); + } + + $payload = $this->normalizePayload($data, false); + $tagIds = $payload['tag_ids'] ?? null; + unset($payload['tag_ids']); + + PropertyCopier::copyProperties((object) $payload, $model); + $model->save(); + + if ($tagIds !== null) { + $this->syncTags($model, $tagIds); + } + }); + } catch (\Throwable $e) { + throw new AdminException($e->getMessage()); + } + } + + protected function normalizePayload(array $data, bool $isCreate = true): array + { + $payload = $data; + + $payload['content_type'] = $payload['content_type'] ?? 'article'; + $payload['channel'] = $payload['channel'] ?? 'official'; + $payload['visibility'] = isset($payload['visibility']) ? (int) $payload['visibility'] : 1; + $payload['source'] = $payload['source'] ?? 'original'; + $payload['status'] = isset($payload['status']) ? (int) $payload['status'] : 0; + $payload['is_top'] = isset($payload['is_top']) ? (int) $payload['is_top'] : 0; + $payload['is_recommend'] = isset($payload['is_recommend']) ? (int) $payload['is_recommend'] : 0; + $payload['allow_comment'] = isset($payload['allow_comment']) ? (int) $payload['allow_comment'] : 1; + $payload['sort'] = isset($payload['sort']) ? (int) $payload['sort'] : 100; + $payload['view_count'] = isset($payload['view_count']) ? (int) $payload['view_count'] : 0; + $payload['like_count'] = isset($payload['like_count']) ? (int) $payload['like_count'] : 0; + $payload['comment_count'] = isset($payload['comment_count']) ? (int) $payload['comment_count'] : 0; + $payload['favorite_count'] = isset($payload['favorite_count']) ? (int) $payload['favorite_count'] : 0; + $payload['category_id'] = isset($payload['category_id']) ? (int) $payload['category_id'] : 0; + + if (!empty($payload['slug'])) { + $payload['slug'] = trim((string) $payload['slug']); + } elseif ($isCreate && !empty($payload['title'])) { + $payload['slug'] = Str::slug((string) $payload['title']); + } + + if (array_key_exists('tag_ids', $payload)) { + $payload['tag_ids'] = collect($payload['tag_ids'] ?? []) + ->filter(static fn($id) => $id !== null && $id !== '' && $id !== 0 && $id !== '0') + ->map(static fn($id) => (int) $id) + ->unique() + ->values() + ->all(); + } + + return $payload; + } + + protected function syncTags(Content $model, array $tagIds): void + { + $tableName = $model->tags()->getTable(); + + Db::table($tableName)->where('content_id', $model->id)->delete(); + + if (empty($tagIds)) { + return; + } + + $now = time(); + $rows = []; + foreach ($tagIds as $tagId) { + $rows[] = [ + 'id' => (string) Snowflake::generate(), + 'content_id' => $model->id, + 'tag_id' => (int) $tagId, + 'created_at' => $now, + ]; + } + + Db::table($tableName)->insert($rows); + } +} diff --git a/backend/plugin/article/app/service/admin/TagService.php b/backend/plugin/article/app/service/admin/TagService.php new file mode 100644 index 0000000..979476f --- /dev/null +++ b/backend/plugin/article/app/service/admin/TagService.php @@ -0,0 +1,16 @@ +dao = $dao; + } +} diff --git a/backend/plugin/article/app/service/api/.gitkeep b/backend/plugin/article/app/service/api/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/backend/plugin/article/app/validate/.gitkeep b/backend/plugin/article/app/validate/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/backend/plugin/article/app/validate/CategoryValidate.php b/backend/plugin/article/app/validate/CategoryValidate.php new file mode 100644 index 0000000..1067b26 --- /dev/null +++ b/backend/plugin/article/app/validate/CategoryValidate.php @@ -0,0 +1,45 @@ +route?->param('id'); + + return [ + 'name' => ['required', 'max:100', Rule::unique(Category::class, 'name')->ignore($id, 'id')], + 'slug' => ['nullable', 'max:100', Rule::unique(Category::class, 'slug')->ignore($id, 'id')], + 'parent_id' => ['nullable', 'integer'], + 'sort' => ['nullable', 'integer', 'min:0'], + 'enabled' => ['nullable', 'integer', 'in:0,1'], + 'description' => ['nullable', 'max:65535'], + ]; + } + + protected array $message = [ + 'name.required' => '分类名称不能为空', + 'name.max' => '分类名称不能超过100个字符', + 'name.unique' => '分类名称已存在', + 'slug.max' => '分类标识不能超过100个字符', + 'slug.unique' => '分类标识已存在', + 'parent_id.integer' => '父级分类格式不正确', + 'sort.integer' => '排序必须为整数', + 'sort.min' => '排序不能小于0', + 'enabled.integer' => '状态格式不正确', + 'enabled.in' => '状态值不正确', + 'description.max' => '分类描述内容过长', + ]; + + protected array $scene = [ + 'store' => ['name', 'slug', 'parent_id', 'sort', 'enabled', 'description'], + 'update' => ['name', 'slug', 'parent_id', 'sort', 'enabled', 'description'], + ]; +} diff --git a/backend/plugin/article/app/validate/ContentValidate.php b/backend/plugin/article/app/validate/ContentValidate.php new file mode 100644 index 0000000..0efdaf3 --- /dev/null +++ b/backend/plugin/article/app/validate/ContentValidate.php @@ -0,0 +1,93 @@ +route?->param('id'); + + return [ + 'title' => ['required', 'max:200', Rule::unique(Content::class, 'title')->ignore($id, 'id')], + 'content_type' => ['nullable', 'max:50'], + 'slug' => ['nullable', 'max:200', Rule::unique(Content::class, 'slug')->ignore($id, 'id')], + 'category_id' => ['required', 'integer'], + 'channel' => ['nullable', 'max:100'], + 'visibility' => ['nullable', 'integer', 'in:1,2,3'], + 'author' => ['nullable', 'max:100'], + 'source' => ['nullable', 'max:100'], + 'cover' => ['nullable', 'max:255'], + 'seo_keywords' => ['nullable', 'max:255'], + 'seo_title' => ['nullable', 'max:200'], + 'seo_description' => ['nullable', 'max:500'], + 'summary' => ['nullable', 'max:500'], + 'content' => ['nullable'], + 'status' => ['nullable', 'integer', 'in:0,1,2'], + 'is_top' => ['nullable', 'integer', 'in:0,1'], + 'is_recommend' => ['nullable', 'integer', 'in:0,1'], + 'allow_comment' => ['nullable', 'integer', 'in:0,1'], + 'sort' => ['nullable', 'integer', 'min:0'], + 'view_count' => ['nullable', 'integer', 'min:0'], + 'like_count' => ['nullable', 'integer', 'min:0'], + 'comment_count' => ['nullable', 'integer', 'min:0'], + 'favorite_count' => ['nullable', 'integer', 'min:0'], + 'published_at' => ['nullable', 'integer'], + 'offline_at' => ['nullable', 'integer'], + 'tag_ids' => ['nullable', 'array'], + ]; + } + + protected array $message = [ + 'title.required' => '文章标题不能为空', + 'title.max' => '文章标题不能超过200个字符', + 'title.unique' => '文章标题已存在', + 'content_type.max' => '内容类型不能超过50个字符', + 'slug.max' => '文章标识不能超过200个字符', + 'slug.unique' => '文章标识已存在', + 'category_id.required' => '请选择内容分类', + 'category_id.integer' => '内容分类格式不正确', + 'channel.max' => '所属频道不能超过100个字符', + 'visibility.integer' => '可见范围格式不正确', + 'visibility.in' => '可见范围值不正确', + 'author.max' => '作者不能超过100个字符', + 'source.max' => '内容来源不能超过100个字符', + 'cover.max' => '封面地址不能超过255个字符', + 'seo_keywords.max' => 'SEO关键词不能超过255个字符', + 'seo_title.max' => 'SEO标题不能超过200个字符', + 'seo_description.max' => 'SEO描述不能超过500个字符', + 'summary.max' => '摘要不能超过500个字符', + 'status.integer' => '状态格式不正确', + 'status.in' => '状态值不正确', + 'is_top.integer' => '置顶状态格式不正确', + 'is_top.in' => '置顶状态值不正确', + 'is_recommend.integer' => '推荐状态格式不正确', + 'is_recommend.in' => '推荐状态值不正确', + 'allow_comment.integer' => '评论设置格式不正确', + 'allow_comment.in' => '评论设置值不正确', + 'sort.integer' => '排序必须为整数', + 'sort.min' => '排序不能小于0', + 'view_count.integer' => '浏览量必须为整数', + 'view_count.min' => '浏览量不能小于0', + 'like_count.integer' => '点赞量必须为整数', + 'like_count.min' => '点赞量不能小于0', + 'comment_count.integer' => '评论量必须为整数', + 'comment_count.min' => '评论量不能小于0', + 'favorite_count.integer' => '收藏量必须为整数', + 'favorite_count.min' => '收藏量不能小于0', + 'published_at.integer' => '发布时间格式不正确', + 'offline_at.integer' => '下线时间格式不正确', + 'tag_ids.array' => '标签数据格式不正确', + ]; + + protected array $scene = [ + 'store' => ['title', 'content_type', 'slug', 'category_id', 'channel', 'visibility', 'author', 'source', 'cover', 'seo_keywords', 'seo_title', 'seo_description', 'summary', 'content', 'status', 'is_top', 'is_recommend', 'allow_comment', 'sort', 'view_count', 'like_count', 'comment_count', 'favorite_count', 'published_at', 'offline_at', 'tag_ids'], + 'update' => ['title', 'content_type', 'slug', 'category_id', 'channel', 'visibility', 'author', 'source', 'cover', 'seo_keywords', 'seo_title', 'seo_description', 'summary', 'content', 'status', 'is_top', 'is_recommend', 'allow_comment', 'sort', 'view_count', 'like_count', 'comment_count', 'favorite_count', 'published_at', 'offline_at', 'tag_ids'], + ]; +} diff --git a/backend/plugin/article/app/validate/TagValidate.php b/backend/plugin/article/app/validate/TagValidate.php new file mode 100644 index 0000000..5fcc70a --- /dev/null +++ b/backend/plugin/article/app/validate/TagValidate.php @@ -0,0 +1,46 @@ +route?->param('id'); + + return [ + 'name' => ['required', 'max:100', Rule::unique(Tag::class, 'name')->ignore($id, 'id')], + 'slug' => ['nullable', 'max:100', Rule::unique(Tag::class, 'slug')->ignore($id, 'id')], + 'sort' => ['nullable', 'integer', 'min:0'], + 'heat' => ['nullable', 'integer', 'min:0'], + 'enabled' => ['nullable', 'integer', 'in:0,1'], + 'description' => ['nullable', 'max:65535'], + ]; + } + + protected array $message = [ + 'name.required' => '标签名称不能为空', + 'name.max' => '标签名称不能超过100个字符', + 'name.unique' => '标签名称已存在', + 'slug.max' => '标签标识不能超过100个字符', + 'slug.unique' => '标签标识已存在', + 'sort.integer' => '排序必须为整数', + 'sort.min' => '排序不能小于0', + 'heat.integer' => '热度必须为整数', + 'heat.min' => '热度不能小于0', + 'enabled.integer' => '状态格式不正确', + 'enabled.in' => '状态值不正确', + 'description.max' => '标签描述内容过长', + ]; + + protected array $scene = [ + 'store' => ['name', 'slug', 'sort', 'heat', 'enabled', 'description'], + 'update' => ['name', 'slug', 'sort', 'heat', 'enabled', 'description'], + ]; +} diff --git a/backend/plugin/article/config/app.php b/backend/plugin/article/config/app.php new file mode 100644 index 0000000..a2a027c --- /dev/null +++ b/backend/plugin/article/config/app.php @@ -0,0 +1,9 @@ + true, + 'debug' => true, + 'controller_suffix' => 'Controller', + 'controller_reuse' => false, + 'version' => '1.0.0', +]; diff --git a/backend/plugin/article/config/info.php b/backend/plugin/article/config/info.php new file mode 100644 index 0000000..7f3cf83 --- /dev/null +++ b/backend/plugin/article/config/info.php @@ -0,0 +1,20 @@ + 'article', + 'identifier' => 'article', + 'type' => 'madong:plugin', + 'version' => '1.0.0', + 'description' => '', + 'author' => 'mrlee', + 'author_email' => '', + 'website' => '', + 'uninstall' => [ + 'drop_tables' => false, + 'remove_dependencies' => false, + ], + ]; diff --git a/backend/plugin/article/config/installed.php b/backend/plugin/article/config/installed.php new file mode 100644 index 0000000..306dc4c --- /dev/null +++ b/backend/plugin/article/config/installed.php @@ -0,0 +1,4 @@ + '1.0.0', + 'installed_at' => '2026-07-26 13:45:43', +); \ No newline at end of file diff --git a/backend/plugin/article/config/route.php b/backend/plugin/article/config/route.php new file mode 100644 index 0000000..375431f --- /dev/null +++ b/backend/plugin/article/config/route.php @@ -0,0 +1,87 @@ +registerRoute([ + 'route_prefix' => '/article/openapi', + 'register_route' => true, + 'openapi_doc' => [ + 'scan_path' => [ + base_path('plugin/article/app/api'), + ], + 'modify' => function (OA\OpenApi $openapi) { + $openapi->info->title = '文章管理 API'; + $openapi->info->version = '1.0.0'; + $openapi->servers = [ + new OA\Server( + [ + 'url' => '/api', + 'description' => request()->host(), + ] + ), + ]; + /** @phpstan-ignore-next-line */ + if (!$openapi->components instanceof OA\Components) { + $openapi->components = new OA\Components([]); + } + $openapi->components->securitySchemes = [ + new OA\SecurityScheme([ + 'securityScheme' => 'api_key', + 'type' => 'apiKey', + 'name' => config('core.jwt.app.token_name', 'Authorization'), + 'in' => 'header', + ]), + ]; + }, + ], + ]); +}); + +/** + * 注册 AdminAPI 路由 + */ +Route::group('/adminapi', function () { + Swagger::create()->registerRoute([ + 'route_prefix' => '/article/openapi', + 'register_route' => true, + 'openapi_doc' => [ + 'scan_path' => [ + base_path('plugin/article/app/adminapi'), + ], + 'modify' => function (OA\OpenApi $openapi) { + $openapi->info->title = '文章管理 API'; + $openapi->info->version = '1.0.0'; + $openapi->servers = [ + new OA\Server( + [ + 'url' => '/adminapi', + 'description' => request()->host(), + ] + ), + ]; + /** @phpstan-ignore-next-line */ + if (!$openapi->components instanceof OA\Components) { + $openapi->components = new OA\Components([]); + } + $openapi->components->securitySchemes = [ + new OA\SecurityScheme([ + 'securityScheme' => 'api_key', + 'type' => 'apiKey', + 'name' => config('core.jwt.app.token_name', 'Authorization'), + 'in' => 'header', + ]), + ]; + }, + ], + ]); +}); diff --git a/backend/plugin/article/config/translation.php b/backend/plugin/article/config/translation.php new file mode 100644 index 0000000..50507b7 --- /dev/null +++ b/backend/plugin/article/config/translation.php @@ -0,0 +1,7 @@ + config('app.lang'), + 'fallback_locale' => ['zh_CN', 'en'], + 'path' => base_path() . '/plugin/article/resource/translations', +]; diff --git a/backend/plugin/article/public/cover.png b/backend/plugin/article/public/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..566f7d2bca19671dc0d0b66d9b3254d37d56e1c3 GIT binary patch literal 636622 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%0Ds<*_r9?{1TKo;pYlxTzfM?zZ-sD_#= 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 !Tv8yOE1I80zGjWG@AIk%L0MP$JAFX z1*Uub_nbfVW56efzG*}xvS2IeovgrNx(pll`7#_PHvPlnCARIq2K z3B4{alw~o@cloi;zrUhSHm|%VVth(d|00G=xR}so zUi)N~Ip}4`1|a9yL#;e|u;EhR>^qXC9iqQt`sXKio!<4R>Z{|UOYg2K3Jg33$XM+DE`9+54iM|1bnzIMPza)TcB`STv5UpT)gS2O*w*t)`B@)UpXKXB@gID zHDKu&-xndLbGR6OKd3z8rOkV5%+nT+@yqca%H6`xy?OCqK>{A`MTrtZSv*Sq(fB~* ztKF6DdpwR;WQ8QXOgsH5_=6|^D*V#BQ-$%m-2xOhn3Vfc@Fs(u{O-{xaRLRJ%r8+l zbP2s?h*O=;m_m!GX&F|^3_~rV_Rh|Y8r%Vl`~(T`6=rMRLb16XD$W)po}8Dq6ta2| zg`(oPx}11u*&&g?VFU1i1!0CGY~Ulg#QKjRgJ4Noq-+zRRWh_pZj)&_QJ5nQqVYUC ze0p>|^LC<`!80SwlJF6S#r_7@rBfOCT17sM8wRm!mFgUYAWqA|Russ06q*re1@JD9 zwr|PaNT8HTpv`6$nti$itPX8YnKYZ}q#MFZI(y_;ySP0k^MMq&jGzL(m=Lm<{#G`2 zGurZ-7Gkw{aXMysod~BT^MOx!BR5XNdT~=ul@m@(4qLlB314xl`Ps8)MWa;T_{xm0 zLutS0p-__*526)YylRiZYUi@g+~o>e>>RQD*Nm6*4o`jy%GB#*6e*GWm7>)u435Bd z_jr4wS1>yt|k7-Ze%KqUJaB4fQPyc7z)lZ&z9KZE&Jgcuzvmog~#IfFJ z(kzh=WNuy;@MI4oY-H?#uF|B?hD2=MYL`vB9d-L~7F_ z0iTWv&ju#>G1WwEG-2POAyI{lm!QUCu&l}ZZTs5>R~0ntvdz)7W8abgWQVn%eGmICCqSKfiNV%MoT zkoDs!thc@Z;y{VXp{5+I0t10M6$njTo8EFFT$7$J58?@e#y-xEgHN9v-^@-~?|xy7 zO}RXpbt7ZdIM9+P>Kpguzi27)T-E>P#ZxwtE)t(Qvb)(DaZ{M(=j=ayc08@AqAmKW>Y}W9pvFf_Nnzm@g+i2v?DpQy{IQd(;&1{VQI8K)EHs6M z?|S+7RQ9#&u2%ovK!%mITy9M;MOL4GvWA}9~xAV?mw^tnq% zL#GrYv-LR?I&8yT^CvN5Hcw$^Qwp9k%~>xe_!o&|Vl-E3o@?Dy(pxwg$ZOzmpkcnj z)f4J67o;<6QEK#zbq2h>slDN$nx0m&3#?S)_@vndNA38E*^oEtDAg@1ZYG#_&C)~u z_h;oL9|%pXE0OUh*u@qXP-k$A?brf^df8km8c>Ui7QG)vYKk2up6ZoPa{&nq9L?NwUx`zY6}#&y{WEmB8q&}M(F+NyT; zCB#A&Lr^*dF{wqlh(77l@4X&I`~})Ad#2*`>+33|U1|T46;}tA0<7vV@A3f?G??zK zYF{weI#-b}MFIOxaSoLhRc-Z-%V!z2t@FjO0F@$It!9FEF{$!R)t-i*f{Vab6P%rt z4}ZN|HNGB;%S9}rmUOU<0)ARVUa!2JWaX1nr2;&a#1@H#!|-KrAqfYVyrAkKA(3CE z909hUa%#;vHrP$XLrg}#xX@NW85iV>&91VR+aew&277DX>ct_-4_1WO?oCy!G``K8 zV@%xm>vGMp#f3)_z8?<(ti}~F;g2$MP^ggLjo%PV{y#1N!Vg&Mm)|4z)4HwD7Iwm| z5?D`wgOy7VbgSBg#%UT+ltLFllGSu(%#9Or_tf5_lo;HJw7j7b2d+hGJ27oaKN)Uz z)ylN65YB^pMQ6qbAP;Ei-aDo}+7uDBKDqCti(}Q1=4btlhBMEem7Sm6P}sNf#*XHC zO;>%?0TJTakiTR7!1D8BcjuQRg#TQ1i5C0gjjFx<8AU(rXdbnnnoqnCfAaCBl#jHx z_7o<)EbrNzahe;L0jb;KuL#KfJP!~0+E4ix{>nV_@4sRk@jg%=omAr05k5hK%foA5 z3M!L|Zas*|Xxf|-|Lc$Y<6FauoJPG#nl=ofc^j_A_+aJuYC6_n~#<>=hS5BtZMdxHI+ogUq9*&knY?&8kXjbrQQ62%aDJT?m z)=qv+VuTNYck_nDUFJHaxB*oygSue*m+`tu^tyE|lq=im>#y`}i>*}d&MRk913~zJ z4cb-9ov|Y<_O_REtblo{Cfrmssb`xZp7Z|*th1pFW$9# z%-eEf;4YzS{iELf>A@#DFRj- zPpOh&q=n90%cRkgQMMa{h18uON^YEx`lRxzM}*fDj5ce5)eBcF1x`|aB*qD@wXXW< zqm{qDxcTw^_D@Q^FDp}YZq8K~Prtcy_EzPYRne(3L5--%MS&&{qFw<%7EMyRj)rIrT_<_%4rIYgu4`c{4Ej z+tTB=R?Ppv+*7$BWhy&8B<9Yir6QNw<9^OZsFSEM;p}@P zoGlFX{yw*x2{|4U8OUyZ!BsbQ3`4D{yNW~#P}De4&DKeqXVK_jsiDgu>B(4L`U8F3 z*iCP^p~uS*j?r~Wu!IL3nrblcYf;xJg{8d#pl*075NG6o5lE^9e(YS!JTjYYQ&#J1#}NH6ZLck!)J2nZn|!VKY>1#uJA_!@wvVvAzcI*QK(NQKq!2_=De&7Hx zRYJFXZUT|^NVXi65JJq~@VYSkLD=%keALQrOrRrlT@d5;Q7Du`XD`KY0LFwh$b0{d zJH?Ec0kKpV+CBtse26RLWHDfM!6eVH$UK=~j>ZkMZ}#ZO7!Th?nf|SZUWB;MH=gT5 zZ4_y)&y(D{+kgIy>+#_DS8g|D7b#bsAso~;UeHd*L}!wJf~h0ghjf&jM-IylNjy^v z0P?*YtL>KFx9|bje)Y(-izc@2ovjzzSO zS2?HnTnQf3y1V#~KO6&pU$|Reg->6`2cLL6SD=5)zI|zB{63F>@vgyYzw(sciaNjk zinU*QA8e=?#8=H>;h@me^He`oy-9QLAOE(dKX%U1UMv38>Bp)!f5tOcdmN?uBIbsC zy{GEH4S>T9RIYy#`)fqXa4i;?ruzPVa=!dVY(aDViy9W!sBDq=(;v^``Uk)*gTldy zzspzlzX3aqB-M|no@Ny>Lk45PJ%0y0px6E5cZUlv#_Q5o$;10AMuUGH;C@N+Pyj6N z_WXKt%GhuS@Zrq(IQ3QVKpPmAngZ|SU2*A*{#ku&!&L%fFIu)*7cC@5Al|ZJ7nv9q z(}iL@j)v#qVENjt3~lVBN1GrrTL@PxWn)U-5@BiYIi?p1MVfL9i*O>*5zg0<;%%lS`GRH zZ6vR(*DI(^nQFg50`e%iu;Ho-VF9w49d(F~2VHhhjJhCsv8V!sG5W-1qq&p(^3J?49m0(Rqp{-s z3J;-?6|NOPD!phcls7b>e_hf%DLf4EXgR+NJf}D zoolRX#Umxm!XY6Ft`;xzH&n5kJrB(XmXnTxQk#+hHA=wDbH%&G33|EYl)tI+Wt9)} z;M8xwJ$*XbGDtg64Ov}Sd`Gxcq%J7$o+~8iLb91A3F-pm9zi--SI6sS6^AGH6etjh z28R(^7}NZbHmB2EC#DuDd8W?!6rn3tYZ$di^@!@4VTsjo>L_e=F-`#f0$3N7{0u!e zg#7WK%Vpi)%ifb8@$M%}Mwac|9e6I_Ul#&f;#YmJgrMW zsxO+bpQ>oPS;UMl*jrh*Jz!*@B2r)1;~$tJO83r#uFy&WIT>C4_w|w+j%EDy{}Qa* z_@=>Qmizx5t_vYH)NQM)SeNw0721gnaOM1G!k{`6qjT5pq8jz@U29ga&MkVe)LDh7 z;l)q>)9}r{Z+`b033&U(s}noA*iR->x1`9OxwpD=hnj});)?AH;=XBo+;p%xCAt0J z^H*2?-1;guCH_@xdHCAKfzHTy!HFBOhS_d{eRPO>+@!=6CU#|kGgM8z+eEsn%6RrDIY_}rs{@igRI9BfWoT*Z&?pe%N_t`pve0(XedRkBF0P3AEDo(bW0-OocBBJ_)GY zK4OnLP#v*z3$Zln2BZGDAyK8@gje7hO^6NbS3>HdZo_^i5 zL5ZkL6B1&W(=cEmcwsa!Kyxp2e{ z)#cwqyjGGP;6Fsoyw;8GGP~o>f-|;ocOIq-(M_%=gofuT5AOA1lAzXMSX|D;zk!YG zL_Nxjquu7M)68#Vfi4|w8)DBkHB#{TO*-Ps1O~Q{R%95S8&08g=ZuUtDSiX!G#zd*p9NR@aPuz4aT{ z`$4=*FAshfKeD3WRqT0Wps2C#Ug5v8@&bv#x6RfgeldZVqJSzN3YP-sQVU_W2*|pIfa+4^Z4Q`2AV8=uxa=#pm}p7Y;rqJR;HK%wtBwM!R<) z=C*v%%jGHe9+zIa@Og8}y{5LLdk2qQnz%MNwxIk%UAUw!!Zlo@a0Rt_0l6JC{+z{p zlQu6D7Vy^PO#pfnLDxBuIhJTa-bBM>%}t{wk28N>2enqmRJ1EF_OLq2FvJ`Xuq7Z_ zV@6)B(m>2Kc*3zR7}6r>lp{|?$@7OC=unokgOzvP(Z*VLRf4U9dyOqzW4bx%r(8-L z(KJB%PD%1Ktlj+Oc%{LOZXWbD=1lmUEz}KhtOn2Gb$Rx(-W-HhafzH$Xw&g09s5$YJdR*9qYX6<>>f`jZ&uw9=i=IC6$i~q zET&Y#L+S$0BFuv)O@O7Qt34aI#sQSK4QKrm7eaNHAWn15Og59(NKgo^j#%CEjp`Y5 zZ00%%c(f=_>C07~Rq(8PtGD`god0WL>&SE4wt(laei&k#p>OYe{_TMMR5 z(Kt$Jl-2$`4AHvf6L>VWzCm0I-DIsxG&Y$yiuP`%e}foe4u7BS_P;~N3n@4Kg%lA< zFS~N;fA9bP_~3UJin=arI@te3SNGm6=YdnPH=bI??y2kk;`z^Q(QVc%7k*0pVDRpD z7sCHo>uM!q7eBF%j_znq5q0cNdLKCR*%nvVs6+4CrJcJBze8;?1r>wLm^(qJt$A-3 zzQ1{6zS=(^d0~W)bISU=@W9XNM@guzTG?KatWU0NJp4uW%;enH*Ep}^pfYqUCtZ>P;>^JY;9)EZG+t0ldqY6dK%t2~uA@ze-OlZB|-Q@a;wz5lQ zZ)5MYZF$>vp>50P#Al5uTQ21JZ3z$ZEuZ5UiRLQQzQedq@d2-09fj!E^%QIBTmns` zh6nqZ0Oo+e1A4hHr@;nh|JlP%HpE5|TEIo|u&<}K)qRfC(>K`VwM z1v+$%&c#h@Ny3b!;H_E%vyZyLq|Tjb7Ys0IW8vCjrF}gLmbfTjFALDkYy%e`OajvvE z7%yGtg_MNoS9pHVd3yX^t0hiG2e6gGkL#QN z$?f4V!#XeFahyCv$%`;U2a&&yU~=d2v_px`N(jg& zpkh(bu=S+b1#qHOIGIzCtt`w0F8s7S+l+2vEd~qGbjpBo_9+pE3!A8Nzc0qdzO%f% zppEXN%kGWboAaNh!n*Uh0-NXqx|4Y9qp3V}AHCFfGk1lF_0$P~R@G=B^3lsD}amYZDcNsY+f8eg5bM^1@wh&SO zp%~dCi(dWk`91YuEJ1sGckdC6x*&Ob)Oq=CDBa;nTlWHkAX(ow*f!Yh71%|X7;^!dJAg3E<9sw;`K6)n67bI(0=GmjLI32nUyMFRH11Yxf)|ibbDDhgY z<+<2)gVnNenqxTuvRra-Pt`SxXL}~#+A4QA_nL>;S+JVUW^;{m#1lP1K=40$KU2)d zO=$yQZ$`_KdXWj59`EZ6oi%d4@hbN?^&G~*NAYC)(ilroMQ$+Pu(l{zrEeCfFpw#O z8bs}45==?xx*lWR^f#Yv#AMjI+39YyG{8fu<}k%-cak7AbU_@9lrEs*ijhYLML#>v zOpmX50K$D%tdL8vqYL8d!tezW^E{y3nQ&?09t}}DLybdF-F?|zU>SuN&Jtp(nay(6 zvsOZ?26JLYD5~f_kbU<*@GqZzw{>Rn)|#zPyaq4xU=A3lSeP~RHme%xSql~qW3DoW z-Nnt~On*{>VcVi^~Jk z4>jEn&Cc>25qi*o!8(b8wwOkOcx03^dtS4|3Ahl?fTqI}YnV29;Uvh+M0tprI-~E{ zAIibPirqkb1E6=8m@uz)VyQJMhp2{K&Oj@n&=|)E{(jHx2kkWvt*39K_((6`xVJlH zOR`qO{o}!R@d0PU0=BEqk5wLN%c;2d?tS?mzx{RP^|uw9-+tlP^a_9dxhZ8!iYV~P z>v?~-`*}nMbj2wDGxzr0gIfa576=AolM_?{0|M*MSIRo?IUTQfp=b&&48pvQ_}~e$ z=I&F?(AO2;;%3w5K}7?}SA55===6G$!|HsUPkVBu@^fa4Y_Tiucq%8N9TEoOi4yPh z4C9@^kpZCG-_()vxN`H;yRjW9_pT1c3NPGit{Obi8sq5T#|L^Z`IOHB50(I3Q%Z)n zi)(Ew=xW4CRQNom0d^9wEakyAuz$ubqan45hQxYA@=aAdZD zf2^5rps9_TF#I~zOf3nuf7_7hi@?LnrfNXV1{eLlVyczfTawE@uJQmVX{pkV8Yr>v zWp+SOFhDND%0dcfd3v$uIyI@T!LZpVu4g3xI!;=HeZAmv&d_quVByuv4QF&@cYuGv^SbF!cEF1hBH?zKz*G5OZ{o?RDFoV2%d)W2;tLyJySGT-gcILq2YAm6$C#Ei=N&*H`l~b6PmmjAEDi~G&TfuTl%xQNj5@bC1VXJC?ST( zy2BUVZMzrv#W~}GwMg+rZDM>-JBIBq2vXUkU$Lha@-R*{@O-G& z#M&KKsteF%s~OrHH~ZjE&!C`ZK@)z`a{z1{&r7=Ine*eYuz+Ww&bUbN`zwyZ; zUHf2VQkSZz%<7pz(Exd#d@?{ z^7f1V%l~$@*TXpeOf0e{7QQ}NnyTgu<|-=4mGSM+k!FDWJd(}0uYcUzx)GLqqJ zyqJzD6(Aigyn%(X_{-`Jekots9N3mrcI5)dkvaIyD0A@2z^f}UDfd=gIM{Zd=DPUE z2(a-EgUv&_`@P3JVg3i6%OF*5rnHf^6vqIun`cgfCl(e%ENyU!g&>0R%`z3Wq75+3 zRuowrc-C+o<*v-3TUbY@k7ethTV}+EJjrTyUWi#h;UBEjAJu55IdOcv_!PoLX~``c z0qITc4zMtn7@8d^r^9%j=4KhAg)XI7)f3b#9(#L)juP?NJMIuVSz;74WhBjo27rMx z0f9$wNPq=mL9~1kKtJIIl#5|>KA_b|d&*kZ3yR(HF&91SXr4RQM8Z0bpocf{r5g)+ z=s+P7{BWek4*B>WNpwaiET~yWJhO^~9A-z5fsg|C0KKPwwJz!Ry72gvYlqLgTr)Fz zMtu*6DF40Ch$^&PnLBsh(kvisr4`2r_Hlu;s8z(lh3$oz0N6cal~aXhb0;OmEUIOv zP+_MkfB*dV3g(voe@+1yXLFnG*VA!@IYYWxSs~435Q8}_BTw+)o zO4yEO7Er*Zl*+6v3GSJfN2VbxOLWU^m%Mzk0i8Ihfm|#sZ8m#A3p|GmAtlXL!xHY% zY2o`YSmnW*H|(&P;oTy^ZhIPbes|!7dP~#3ktO5X`u_cL_V1QDzl1AXvqg4@sh~0D z;w&plbzm_Tko1Ju*CPsFkBRln(#$AIK2^(^mu0C(@(EzCZeFXM-00q#Kka8Skf7P~ zU+O?@V8S&j!eZ38#D((NsqV@AT-3gPHJ8WP4O7#qO3kmzhhwpRiRa&4Tk_!iyO*(G z8o6Sw9J=!Q<+Xk2G zc6@s9`PtcvzIoz^l=V5aUf7sM-DWmaL`HqReZ7&%%H=$c#l&EmzE67n2zvO>Q|l{^ z=kNV}A(G^v6z=|gPtuDy|CT_{uYIwjx$9P)zw;mVG-t>C|Cx*3D%sz>BMF}CqD;K$ zZJJiQ?e}6^PRZ~5{vvi$QMmA4PkL8;`Hxr9?v12uX?}e0@nfL0UcQ)nbB;o=513x% zxgFJjO5D;Dhpn5&V3H@s**95qoe7?Bp|M#;sF(_|R)Zp;MQIaXnoos@1?;Soo(SmR zv)Q>)+nlNO)EQ`MhF|Nhp8g7AaF2uC2%pJB@B%r*wh1albm=hDe3n4`yHSM)8R8UC zOHwom2l>iyRFQ8143`!Oeg-I|5_nn-Nq}1uN^`SEV{u|J9+PHyt&dUrSY`tlT`~9wG~sRDuA!(nk}!c0VA{5+@9@o*X5x0^O@%- zYd+0q07HLwu7w4}ov=7rGe3baIYbj7B|}!;I-sdVfObL?W{G=xci@wM%Ucd?dG&PB z;j3GhYpl?)o!?lu!fobUrK4!Br_r? zUq)L}zW=tDHSe2g)4ad$|5;bQb?Gu2dw*^>(UVz#pjI$)0K>25Ns0R>hW=guj|-4y zJ~x0Q793S*auo=e^bZ-9fFgsa3!4$#@Eo!Gw2M8IZm1i^x%G9Z*c1%I!n_=ifT^9u zJ0#=G)>1>u5bB3Q6*N1S12CK-BIe?((A+DVQl@ev^T!<0`hUCitGa8jvd)=~S6lA> z+)Fk8?m@hnK^^AAq`Gf{;DGa?z5jjs?#w~2n!~9FX9u{;T7%R%-sRFlKgNAsrSjDJ zb@AbTeRofk{R=1%E6~jxKuD@$x<6wU(eK_pd5-Dsw+tF!?wmuxXFlnHI zr_v4CmT|!Z_Yf`iGmc02(?11%xGI2xoxJn7y8l+o`^g6nZ^icSWLRQ-FTcz>0!0Y~ zbbxo6y5WMgg=(Q8ZUkQd3aCLgRuy$wg6~Lrsq;vwK4?48RA00zx_Nf3B(uBl4seRo zyTzH5Fj=hVH03aDJ%yQ(1cv&S6pS=I7_v!#G#o3RRE@BC>`+9()OI7V`VJCFNxe|# zDIcta*s7zxancbOXqzTWQOjZ08K`c^8WpcT8Lk0vW@s7<;R6nQ17`su=A*843SMd+ z>gsGEW;deu391{U<4Q}0@ByryDj<^_YB-in_GJ#I1}JEPEx4SvH1-11Vv%<70bc_! z39`ME2p4k=fX;TB<7!(a5UnNerWZIW790C4TgNdf;>}XIQ^!``q~Bjh3gY0|o(PNKPASNu8o_VD|4V2|~DW^!~M zPls_E1_0vteyfzfkJcl4Rs*rl4ne{eb%7`~ou%}Is@2X0@*lF?Zj$AzQ&G%QmA{1a zCkcc8{_S1IEr7V>_U-Lc^H2o&!G#y+EHR*bUx-=i2iLUr)Dg9eHi$d*bK&=6 z!vzu(itHY9Xe_0!<^i_3A8X%&IPG+PY~=1*c1(f**0!e=CrZ*B+W;S@&L*#$tWo;% zR_7t`1RG1#&{}@fw z;!M**9Q6#ES|1Svc5A$4?VSuQ?5!lItCZ;iB+Okj{>A|45U*NBa*#9q;}I#%ub*H0 z>fq_|hdnQ1d$WrC-&B>2s6TWFxU@WG|LJp`Wsh#V1bq3*kkPl}!w1V>u1rm7nfSlU zZDj$o7Y`5oTJPv6Q{>S|5t3e)^2Uq5&(Z$?7L)O9JV_6*^tR{EAg zHE*h34$jI*sjpWSjb^Ssv*u99c*yyR_A#jJ)$upCT8fg&K>TaWoi{5(PMt^^{Iw$D zQ3lR!W*xjC5MGS=2~`Ni3VRey;uxvlZfUz))riKYxOa@j9s_nBKPENr7z`O~x;46c zmB*Y*F_&VmNT0AHnc~!9S&L7c(x+#R=M;|nk#@GAW5^~a7y=@(;2)saL}XuNtS^B! zll+N|PAn#!gP$Q0CjcxQVynZQY6k=*;PBvv!vG=FUF{L&VkI3z_3z{mB@l7bp z3Rs@#l9uJUW;X?lD>3Zi+}aX(1L1BE8DzxjJPJjMm8RATT9`^*f738h(o7O2^4w;G zLP9k{pg}^-5(Fq(hsB6(ttN~<;gYOqv^-}+U1F>lq1U(4wR8|5-7E$yGaOLi2s)KO zCk1pNoqkFxmi_W&0lI`MCF<~U>q%ugAZkzXRh^LPZhn4^_Bdh&W?Mk)?mU*O zR)?SpM`Sq)>E(WQ2?mHpkQ(f<>w)i>SBr>G>Y!mU!0Ahkgngskm#Y}I;ua$zNDD8- zSj_b%g7nOaifP)H89eXhx|HEP<5Y;t@qoO9E`6J(kEvt0glS?ET6%WUTW)*rW2CXH zuk#5F-3jSJHv@rxD|7h|q<2<19l*io{Lvb!)W-f(VwZKr_0X1=!96<^YNJ4u|F zP1%$vGmXKq)?_0rQ2cmxL-4_B>%)pDFTeD@&cWPY;p&8*KS!rHWuJanP+1cu*>hlH zfV1!JB#xF&mta>o>8C$BJ{ml3Q{7EkRhDsjLriMvt+cA~Uv}KPoW|O16nEcYC&!PY>;=Ack!v6zQ!Tw0>xdBE!r?DmV9fUjP)! ziI}5)^ACmePtgP^A6g=scogX*2#rTM;)sj!gcElkOFAONS&DkV(b(GO-;?HE{tx03 z|0=jLI^cZ8El z0k(Q0R!hQ&#lWf$?^No@){N zc@|_kI*E~CU}FP`sc?;5DL~5+Ct)Z7>vi3;rb@+NzqSubFX%vQNhHpa#)F@xB8qbq zNa2cMC(yD1)Ev{vdW@jaL;h@-#Zypg91{!X(N)hf8Mc#5RWc2ylP0bI<3i|0a^=fO zz{&h=AqbOQ6mSluk${EDnvqiBbg(E30|93M% zxPr8J0U0Bolb_85bRc1g8-m!`cKkYXWVf0=vEJNE8(;#O>{SwO(vVt~ z>+nFKNQ9DIoZ{}-w*4`K+efSJe7`EWi&u1^^qgDVVnDD2Mo&Q6gaB?bFV((FX%VH) zr%jYj3-=dr{HbzmDb&axF&NDfzhbZm$HZ3| zG_3x2}nvBWwx-?3c|K{piG7uV{b<*(i{ab&5!I)%9XCMt-RRPN_>0iwJ z_U`TL=Vjp44+umR4h zfU@$}FsN{Tm>LFZ4}&7&QcTKceVvJ-C#wceFstuGlzUy+xlr`v&D5VUrUR=#Z<5R{ z&*)>W9IV{);Vs3ZhuqW~v2j(xA{MuZ|NZFPVB(}9Q=Va|$-)4cxi zldFn)F2=}@sjeIlWwCvXfUWfg7MgyEag1K>%paVku10_6l(b80)qia`Z_Atun+z zVJ9(-LCJymis7UZ5@Sk4s$sJ&qNph_mog`6@-$(Zlv#2G z$(6CBC)o(EwiN_T^wtef<%+GsZmSZ8PmpB1Za{$gpvs`)0=Afx5;+RZO-ZYvobXd) z7QM(XKOQ`SW{$$whT}TBx8ZUOIdB4mOU#^42Yi6I;$f^K9{ikxg&I~g?B5SL7|yCCW7{d&q+Gh46@ zeK=N|!!$ROHdlz*QmQG4@mQ<9$_Ul4i_;wgYcic%(3k}@TC2pN*HxVpjZ}MwRr6;D znI{?^9BjIE7d?7wIKL(;9Izhuu*URo%`d}U{!j;cYEM$%f+Bh|_sB<0Uc$vs%=(I~ z)rUhiO!XyiIdEjhhcs5k>J5vc12RI2DrkdE<8QJ}M|-@$)tY-*{){O-7P0gE0iQT| zP7VozC87x4gNXj|;rRH|0T1q8UaENXuV;9|ubCmAt?qx5==?{_t*q54WxgMO{3LBM zJB)efP1dsR0pwQ|^!UEuCl2@y@*lWgsIEViQ^@zref$tXjzr|k`&NebJCFb2w!!%6 zc<|ue*pD*&k0*H)|I2-^-;);)def>MCqzpLFg92a)iXUMDlG2t)n* z5fgkiWakmxSo$a%5Frg6Lss1EWwO>Nr16XCcsrOU>QIFfVh~}8j*Gj8@ErwmlR|}R zI}>&lG2{VA*Z15Q=E0dlc( z7b*s0i$$Kf-|rAT!TXZ3X8E}60x>-BfcP*XLmNp&-;IyoK zf9!xm>(!<`v6uV&&R1>*6Lmvb&>Yb99bIK|+`b)dGUsG6#LzG#M0xEFUZn)VNObls zE$?KAb)adWPxzn$zlrq_j{y4ztBdO}m}4QXfYUqkk>NU6X)VELB7}6?^@2_$Jt`GE z(Tn>><qzD|S{mqYUT$nL8!zZ_?= z{Fhn19c~)!EA-(Ss1@im#8Rw-^dnp8=>-IcTc$fx-JKf+VyxE%rP2y)WtuROAl$S> zA~c^4L9O!H4W%-SV~n@{BaHOnb0}0$PAPofZ^gE$1gu7SgGLhZ6)GDT$o_b6-^~A- z|7XATdOV995w??EW-mpRgKbk@E*fWcO{N#ejOaxMKpVjfa`3y|Qj@b0!A|EcizHWS znzifW@sM4884D6bi=KOckch+Xa~>`q-~7Xz;thE<#7IebgH6P$o<%$6TG|W+Dtrv# zx?Uq!m#r@cUPNIzInj8u)D$gnhM2;=*pjr9zyvIi*jiuK#3U7sG~h|1zS>Budw3+i zL>@E@TpQ!AiUFm%Q2~-0t#}?Jt2UJ)v`7r}`r03FN+<(R&?FjAeR%pMHWZzAYCakV z1G1ghq3WwW&-3R^;Bap^A3VvE8ntQ%8%D|#=sNTa@Ru#kQFK|#oWG=BSU{&2wFx2au8)sCEqR6N7p*z8_{l0h zyfdk9C1YtrDEa>Q(%|kBwq7Pb`M;kiYpRE5KGjC&tuem#C~j;z@zdS!3MyV){>6?a zy%ewZI3K)A^}*M}r$Ld}@nMzg!TMXH!9_dqh4uU^(-6S zxm-S$b^6!XS0VisjQYXYM>&u0E)Te`5(g&KFCwJ3X+IYyZw}l%gq{B&J3F1Qk z-7a?o1vN42qB52@kN!d3-my7FlrXKvFPsz*rrfDCYRAl?>W z31fEUouId@_cC2gbdV8AotGL22TAgb6?{a*RNl&;S&vRfbA|TMH{LffShIXpH=9 z=kiHTFThet*_aW<%XLViGqX;0tyts_C6BP_!qQp3T`CM|@lx>EOcg+@F?h^DI$x`k zVP{lZ2Y_G7_nnrt&q^{GCE%trZ(E20J(C+PIrPg`&=CTu3DRXgLpl}45oY<~Lp5dzGx21n<=g^O z<;q>SVKi;}{nOX4g3ao7oIrf=ttHKS;o%=mo#qV?Q`apUljjjhvFt`Z#}cjy%`OfH zV|&C_VX>@?uQ27fCBSaloL9y_Ygm!OmV9Eat548u8qW`? zA!s~+wT=SVM>bLdX`$J9pmt4eoQ`;=EGYl~Xgc?}q|g5U2SG!$1&HRM6`&ZB$4pG; ziVzJ?g-XmsElH_7;MDAnZtn&T3_RpnRJ63zw9=&}NV#l^6T&MT-e!ZTr!~+fC2ytF7TG7$Mj5f36I6{7of(5JviiFS?-D3|~ zMZy>3ZdJqv6F3qtrXI&}469jxE?Z&qa-roxS(gusa)*2@yFDQTHEG_WjDVV)zzH9x zk*3a;g|&CfPmOBB?`|gpOh)T>o*xM*t0^5_>`&WZx)9wz2PQ_Vq(5XaWU;WY|FdP^ zD{oeP<##Qgm__N#zPV-htgrFvp%_n(JiV@)-Kf*Gvpox(ls!eisW{5LH>>1r}CglxJy=ZWxzqZvek2$;!%f+`F2 zc`QE<9JKV$gVV*4G;)}|TYGh9RH;Y5Xes)O#cloDlD2mq`u8o*q_4(pqT4dZ)76$a zreWL&Tpd-W;^)Cl+;KLL*-a@O-7t)oTI;~EUkN{j3lLJZtxT$kiD#_AVTA{H3ZNdP z)`J##Dkw=(HU4T%h4z>Uq~(CPsHZP)EkpvY`{k2>ws;>D$I%8$Y4|@huv8JaYJ@lz z(b&;QGsICeJv?aU4$2KW%bkJNcaI?ee+tYsg&3pY31L`J@MgnBC}uJj7EVx6n-54; z-6T08-+ALkgQcuzpwFgVYgLh}u@q&Q&@BrvI1U^^V45WMHJYNx%{_rQO+_>mQXh`Y z4_@8?jOud^8i$TRkPU^ICBB-q?K&sh51RTc1YpR&2awV$-B-W;d#M+%L?YC53Bu89 z*L^G!{9`-EdH(__v=K-@ppacI%Z{;_6CU@09E`K(k3)s(1eZH406q_-kNyqdB~d?u zSA*Obew<2ht=Blfu<6BeI!-xR#%aI+k0ZGbMpjXQ=f)W~8y=PwHtVbe^c#f1^1EEL z0>!~K0~c8+m9*7SgEs+cpjoaJBYBWb@|X3HXf48(s}>3x2}dl7o+a3CB0xk!VB!rI zS^&QyF2@Qd2O5}3Xv1-;8Em&SI2~9pOPx^!s2FE(R&H>g<=U%Ic&KbE{z6zZFfEp; zXs_(4(od2#4b2fEFfBU_R@7C(6{zQf4~M7>Y3Nk`q{a#hHTZ`BpKA~d>5Ma_;oQ#2_);kpVggxZ zof1*)I|7$6X-|Wu=&>xS)N9qjWu+5=QXk=?Xt=HQ(mWJyWoKUA+7HqzSOo*DkI0H* zQTi@J1YkydVBvx8nxg^sJ{ZhV3dGS+YhL?6E2tg%XmwO8kTTB57j{QR=X==!hzJy& z2os^wB5*Ft7>0%jfP{I@$_E?pNQ9Uv6(Sm-_9!s-U(8}S@D39MJR21$qT*7Kpr37z z+8<#m-3l6|2Kv{ysTS51x`xfg#h&ZTK6GTK|Ora94Da?YjPgaB~ zo`Fta*lsvs~cE`c5&hWF)YHU>(zm_6KX0v8E|+F?MfA#mbn$Smrr zKar10#iz+gpc$ELLAXLd12PnCS6S%Shknh47{W!#eZeGfhK-=kvXA4?q+%+Sx*VPy zl;!^7LjYb(!kLJdiNJPl{j0H+!1L1n@@cn)vbRA;bNnt;S6v;0^v@nEb;e*#B^y>F`kFRbMZ^AU3zKjZe|&k zQojkt$_*u#Q7>3BI|iJ&=Ebc{T96qu0i5K*!C(GB2~9*tAeex6CpP#a#mrk_8%=w8x#uV%@i>mun%NvZ zI}F7mCApylsv#VK-U@z|2YwO+IBBA2I?zc=lQ9x@?E{Pm=?u8E6eBfm&o>13o%-us z79fg!Lal$8JGSTzgz^WNfULox!o!oZqvJEa!(mPaASw>E2r)Di37~(wAj>T{N`gl= zP>&ImWuee1B)R$jT79rTmcbwWZ-sMs%f;vqhe#8cY$}RCE#jP+!;m!KsxScbC`la9 zD3oeBSb0%iZZg_SG`V~BUc4zYt-7%uwQ<{!V>xHJiEhu4L?t6(>{IodfJ{Vv=Ywgc zgETLh5DNYV@YmBz9MLZE$!hLu4ZL6r&iaRM#N92EriuVQDa2pEu3MbrXY8L&P86X`;B zH!xr#oXcD>T5z3ISiOdAT^@{crIuR%A)0nHdmk<1oqd3}W$k^3%nOOY+`9r~F_x|&@n`}Wy0v{q$Q|5DS^B)n>?^8QS91dv=ZHdUTpz)rMVDUH68>eCC!iDKgI zKfG0h$_2rQ*^^KTy54c5(sK(I$;_oOKu3($fGZZGwB7b{DuEkO-@(E)XQ)Rm4_D7u zpJ?^WXv@5n!fTyR+m>;Mz4T2&Qk5x)!9(Gvwvm&t;y^fums~)LVGNtfDo&WT3~~AHNT3m0#Tq`h6uh9tO7r2obgKL zk3n_W=YkuBX1BW~Q8@eXIvi)_7JjM$BGSy}4LYF7SipJ!gNjxU<-%L(7_~;orKa6P zK`lU`Q4|a#wI3m;Nz22X;N?13XDGj2U);Z=|KiI2PsaVA6@itDyESrNcOO9DP~m38aEMwP z9Ir_@P)DO`Icqe~Xah$nS#eeg0_9g%eHxitalv;VMIM%6g1t&R5TCewook+bE`r*K zC6_C#Kn4I5gF+(OC1BAf^&)e-ExvV~Z4?62n^26zllYFy{w}f^1BL+_J5)^`HeGgw z6>azuJw+yKXrMvFcm+~Z_yn9Q7pIsJGqZ)@w(ehHxW_x)mBn&uF=}Hb^aQp@5fsp4 z&xOG{1{_pOxKe!7wBwJpzK39$vnFE^JlyL`d3i zf>;B!i;?XCVBmq)M5KZEH)zlK8=1y^bHAzzIn%UYpiGz)o(hr7x(pKc0# zclNSJ#)!^)@uB*Nwtc+CWqG&9lc*){(cDVw*rvwNfal;E?ee1c%ZADi%UPEfTiA6g z1p>@S?vE)4P~CS5e%{#*uari|=Y<$T>p)OWnkj5!)u9QSoaa}Yj<)(-I>l?P8oxDn zs^H+wJ{yi@4uJp;xzhX%yX5u?EJ9=gFO=GCFL zg63cJiwCqU>$pHrL~m7k!fKrcgaQJ z`1`wN07DeM0v4@oX?Zl(-Hut0u`@VGvSb=+9R>wm4L}qft_P$QC>Hp4z0fz&-$}1% z@=(W+2$Z9N&9&5Oi~{5ZhOP#C*DSZL3LWF3sLJWWH9g441tqq3u)gfH^F)IPr}753 zvxT3zY}snsRcYeCuuVcN+GCvaP5WYK(YSifcf=Uomf^#@QFSzl2q?1GQfy8-@A|z) zu+7rrT5$0<&XS6on{&GW?&HDn%My&EG#_T+KSfdiZP-JL3J)%>|8<0{%=ZW=f2}VyvJR zxy}@|wQ6uPXatfG^y+1b`K?NyrnK?2ZO?C2jorC)r1e^6+82VWZGbuDc$*tR{UX!k zbGz)HLx##ND|;kCnt$00_#=Om1`{~;MI;y&k!I>dZ)Vngz?#U4kr=ee#`FmA1o1^6 zAjmn^(27#`RUqgzT)ONx!UanW=%Cvb2cxtcvWN=61;tj5;47eKi5LXgrM`|?51?PT zV|1vX6y&6lTqHsV*N3->z0FK2lqNZM6QW_j>n9CtoC3ta_wC%6mj?(#1QwZ-7GZ~K z?uKUaq*UJ%Zzn4-P@a`=tOSZ3Id}!f({6ubmFocKB>VoipBhpNQ?D&%{P{;u zTff80?Gs~xBf9MqUKZ&-i)Y^WE(N{2%gfw%YmL4qK|wM1QJMNf%)Q55 z0$*0fmy7x5F7KS!`@>I0qcJUJF)O+d6T#!uW;_N^*5zg9Vol2YGV|ZQ+cV$3F(mS1 zCf;XV;GggsT7Fv^;BGRuaHfFF4ZK-Tkp0l{ZX@2ZQT3igzj*dbxse9=j^1r z>Naw=J$Im~%HPJCtV;3ecZg}*JG$7l^oM%xyzhu$-}b_`j1i;nzP60*6UMvS@9{@p zwxvv*P2uwFT|0THUr)ShYmFJdJ96m6#Iv_Ni_W-udxznb61`OtKe($^JWOzRHNmTP z_v%om6%7K8*`p@yS{dh6MMb5$(bHHWZ#)`XqN;kGv*%MwJDM^WAaxJ$;Ev5K?6+6B zx!SoJgZcWw6zp_zb7kKQZ(vJ#6`IWZc?ClgSa%Hv$MWI_DXvu^l0C*?<)HpHGj>`# zpkH}5^El2U&%ln0y^+GVE3f+8xFs-IGn2?3zLB=aFM&J!c`3)b!*Lvg`C8}PKImpp z@ye}M^vXd?3EcLd%kpiD`K5Tzf@n=TUB7V!h7{h=Q=zzQ^JdX6k_G5G!ay(o*I;KYlB4q98vpVh?cLX=Cwq_nHVoJ(wZ=0sNuN!0{dVQbj)^%y zLyNgS8quGYpPBge^fxIQ{v(qG=SAh7S7(d(LtiV|E**m*;{yXf-MCOr+vCOXy zwJn|b>TK=O`Dj=DR9oIlGh4wB<=^VFwa>Rtbk)90{_@L^&gc30X~bk&!MM{gOLJpm z2;bC0HM8<;4K*~>GatO0>oZlPqTp3o13IjSzxO#r z2aDQbXa?s6xlAw=oNv#jaMzox$oc7dlEzIk0l_r2?5-X1H;&9xrE_gSaZwH<-66l0@KPZ?Wa+nzmYQ?3t?#zdUj6QY(( zyXkC*3kmtmsmIDgZ)!#amosjpOw4`!vwufn|A~mN0P<~)%~y1w{rJX5&w30h^*rU+ zU{|AFnb_f&@aPuT(k|iVf?QJaBotG^nO9ZGt5wBMHD#{u`z4_Z3G9d3;1uH{M${zB zqgS`Zx_?M_xKk_`c=pZH1hs{6H`mtRNf7M8+iPXLFs{5)k$JycHA`cKz9)Z@!R4ERd3B5y8=%um!Nc2K7Pe4luedfNpjkl~XQd=m|?o z0N1CBcRj+VpLet9(8c;gt_KhGJ6%^U)r^j`F!>W*8OisyPpta>dr9#4R<-}fEbu+{ zAMO|({Vi?ZUs?MmG830-`~r-AUa6;d&+k3N=bS0wyjo~gY}S|QDbJjSSBMLgL3`aZ zZY51uzV?Uj=&m2$y~xbWjG0i6yjRMTCU}(n<@(sRrKm3_+Ja9`w57beo8zK9outf+ zDLvY5#oMcvru5AOSjSz+#b+q4aJgjz0kM<>jl;rkD;{+q&>l}P-xNaDdw%=LZaw2wjs$Fl2T|lztMheZ$z0YiQcWOe0BGCQVO37m#gT_Ct z;PBOr#Rc?g{WppEhM`j$iYn2lL|&WJ>M6bU0aY^r9hPSwb|G0Hkk*N42AAF59TJEqHR8`5tjQSaNik%W2{)(*7vkMY) zQpTF5|9pGK{Fz|;JFx1nefYp$1i}@c#f(SI%yt>8bLMJC!6RONRh52*_e$vw+J|Nw z9j8lRnh>Baa9bIFRym)LBbZu9Sp4Uj(kM8jdfB!Fs-di`ES9ZZ~36l1L@mtB32?~{FcT$<& zN!5HbNuft{_9O>~Pi0jdO^8GahK3@$ya%>;sEWpu$5#@p1RRw$Pi&nwPg$wpoz5u( z@HN&m+#~2?mwK-w#HjV+x#wvM7 zx;`LZ7pyFvuHdNRbZ$xGP65-FB_2kHnIz=COPM(~N1N6GbTepZPJ z`*ugyPQFLVHM82v(po>o(sH-XXHhFJ7>$`QPUn;KUFz*8q@kXLE=yBJy$fgCp?BX% zMpoCe{``6RY|6b6!JFY<-`?H+>y-BwK)k-Tb|Izq{(t_Oyx%^|kr=>f?7QW)EO5>_ zbdOz|;WIVe+}1xgclYeblsI-gde`E%nvAw2(w=)?{Q#c*>Z)%o^17ksB#ZKE%}AVT z(Rj4rB=~Urt&#tY{&xNHSEFf{`+0efe$4^`ux-hw6@=R7%ocP|`Z&N&tI2nK)G6yt zZWKcTf4)N3YPFD}KB8~%92ydLv~;%GCf=LQh{W1VBO@h4E0zuvn=wkwU8idWd#*jniR{Zk zT9XY!2>sgaUlS@Z`fAR~7Fk^TrQuup^xzEJe_q~zt1&`c>AHIO^yDB{S}gx2_p7%R zJ@ML}gz;xHT*E~Pm!Du3K~d?Rv8&{?6IwatSo+P)aXDjEL`7v-lm{!Br9ZTJmuqk` z@8u+Rcf$Q!MV0d06uz^nQZ}ZmFj#h0%U3Lol!faB_M7`o-M7CuG(>)=pYHU zu>Qud>paoGX50+0*=25#!AX`@?a2dg&iz`ldBCdxkFsG-0zWV|XQiWpqAu5S1MbI< zr&wm>sZ(NeEbaD-s~V5$e|xk3 z3HQ|vch@*Ry0rM1QV^K0eO(Y>3_ew%X=3mb$f?62`7>wVtP0qQmEHF|ff#hkw*5c8 zZDWtxlAKOXjJ-?b`L?|SgDm&gnv9sQlW!UYZ_oMOefM^``_0F!3+wOy{(gV&-|hVg zH%3QC``Z@hWc_m=*H?e&Nd5P{wq0K?CWBd#I`+t~t-mX&xpT?qdeWk`gZ@;`qH)Tb z_t@v>GS1I6mlw14T~QK#s7^SYvq6*GyX82W+iAjd-QNj?da0ox9#Z* z)83#6x!3kG64CdT*A`Q_G$?q{*17c5Ti=!BrJSGURm`0w=2Ys*`<>M(7aRwJCB?eE zo_DTUlLKN8X?hF^lQTC2jtkDI61OwEjhGBuckIv*OFv`dt{ZAvDdCjplMk))dAZ$M z*92Wgi?%U(YZ`Jj(AeTojyE+~L``56i<8gN<%FQcm%=s>({HGWWVXV(*>|#StT?L`B>`-*`1nK~z-^9#%ZGDsfhKi9@}H6IR&y zS&qjrO{D{=e(t@Y>S5Qw>MhBptMyh!j0dd}zw(Hrzky!3I2qs`^7Pk+{UYiojl^(6WQsU(7^ohsKa}P@~3>herCrDDIwX9g*uV*Y+eGu4XDAV^7Tc-3S)&=-7i*S$_g|TaZHuWbJsUH+xcFz-S62=vfBCWU zXz=z- zg3%IejQOD#wEE^yv%s_GWA7bOM}3|2)!X(jGHR1-ZCgn9VmLAKHs8BJRxL*=RO7nVwLK5DhfnZr?dCr@R>;f0%?;Dd6 zJvuqwu)l$*(xq^XXANv#0@-!W&9%z4YuGssoS=jI)^=BKRuc#H3)fQu-PK(=o73)) z6l;nV%az?-g43WLaW3N|M|uqp1@L79`;#q(`O{+7ddxniRvs!CNHNDNCSR;QT1bd^ zyB~LW^)P9_soBQ_f)t&1f*C!Si|26IKtI~OJ$mtkZ%PA9l$^=g#uWmdW zbI*F7GBs1;meh9EfyH-xguMoS;=vSyGbL4E?eo>>yD7)*6Yu+Xd<#xdlRS`QFnYo; zq%3mPlU3ko_sPvb0ZW39wTDOf^g?h**DxpQMEnK)3MiGHr5G+&5ox-+DM_b>E4h3H zmp|1eMqA3m7EV3Rk`;qH4sI-WA>s7>{HIzi%OkINQrbskPc101l=_a7Zl_iexF&M^(v-wZFd8Hkj@`YSqHB_mf~(d#kO7;(zYhw*9}SIN)wH{?@smD zr}(+|>23`;fIEQS0#-V{d3q{hJx`Fg+S*g#7OY2Ra4u9{xgmRL59V7+khZ$KGR#Sl zB}2C#O)fVd>|sscE(Z^HYVYXV^mk|4-f@*KH@7WBw}F!RPRztrJrK!nFZ2P!R^Q)0 zclQve*NuYd_r8bq;7By{<`~#^L3IZdU4p;n?A!-Y4IkLB7-(jc4vY4IK&OLTl%>4 z{cp9M?J?i@P&tM0t=3wiC?u7cWxoUE3!CnoN;wJn8x zb$%SxIs5GYYXRQ>;&ab?B6e~-^Zlvo+riE@k!jtOLS*L?!Cg+}p+^DvlRa1q+k-=C z!ICwPOke;XSy0iIaPYOT5 zF7?{H{7zV0ESKlJ65)A_YrlB_oTk!;QaD|$$^1axNk`=XHjd+ID`=U!I1i3x9jm8V z_p#5t-FX7rDR$KdxBV#r%9#aAu9@xp>w=lVA@S{))A`CH@qG?yJ|E`(T)eUsv=To( z?;Pe#E;NS5Da@xAD4hibFW>g*6Z$D0uI&Z8=as{)E?*{1)Ci7#krX#h(u4ggg+HIb zFRcu%mp}J@c_!uCwdH<*SWz!c|1$)hPgS^)Rjt!(_lQ-+nxCg?(3uw(Fa@fTayeR0 ze#<+p&<=scyy4k9R({D2Wc{=Y%jw3F&Fbz3bxM%Ul>NNYQSeu9){l7=GmNvi1OKBI z|Hr;y{ZqunLe2ZlIFAAD;iO^lxe_@QAwbWD=5kgz(S)LWD(n{4;9!qZAeRaBW&2d5 zh?-o50}AZEQcWo!suI|^t>s=4YKsO(Be`Mxap6c{rxp}D<4~e=WS|H$Et1n*kc?#7 z8bKv2lTVh>WT6Bmxjo!OjA5V%EI#;xG+($VIS68*kQO6=gSx}y0ECNUN6&gBn9}je zpnb)FqV9~loqmn#b`@3v0@u$CP^tThuXiI}W7KT?x%BQ%j!$C}}iKpzB&L6p5lc7ez%$p#sso<`YNtUw@(t?DdN zQ%H1rdj-0fQFHuI?C0Ac_a;D2ycAi6A7KB~@>!@1 zC53O=a~DUjD|$$?Nwz7DJgiz@MTy2{LU`avEX41S?6mwx>8AfD_s= z#X;h8xxraYmgP>;4I2Sb7&xCT)6r_;RzZmZRa}&eNyWnuLAZb(7#2t*)q&CZoE~g? z9%J5LeT0h8vZEVtP#6@1NFQN*XNygRphYll-!L6Tu!AP#1>+8X%2<5XB+!rdvI~!$H%`5gHv0X%VD^2g)L|K!=d#>yH!X zfyVm|?(-n5I~9R2gpyI@`9O-@WhA}Dum$MgH2x;yaHv>1356bIN#Py9?J3-p?g*j= z0h9sBK&hk(t7QlIIW)wbq85X%T8#P@HT#>mY}V05VkIkw!3c8TU}(6Bf%=m`zrU|^ z#bHGe@YwRofPcR8x{K$uhT#GQ`Q;ElVPKt*h96870fA_!bd)?#EK;E4=J5+}alZR1 zJezJZH!ft|>dMLdDV=j`{8`uDv{odoj<><_MpasLWZLDz6JI=;TO2K%i#&G!g|4PG z;lOjJEzIH}!KJ-sxBvLVtl}znPgli*nv)H|Q)FyqRkg$M>Q-nIXy_k#pkoCC`w28R z1v#&*09gRTI&cZRmgPI*-TU|2vN3Iauj^(nyBYSLJ)w9n_x4%Ky;u&&M%G$#a9h2cbXr}Jc^8XyEkbPMK8`>^0vgeB65pMgS#hS`R3!yIe<_sU@RQ|E!efU3n#?;n z%{JbgWyTyQcw+oa8nha!mFoCXlg0io<%aj!??hQR(Gesin*A-v;QMQk?d$56Jq0os6gdt8ug4IR3{I6ndUI#n?SCyQNfQi8JMz0HZ0tyo|Nkzd_ z2nICiJv$sV9AAH7_^CRegKgY|*Hoa=WgxBUI7CEvoC-x-71>B&4!{*o2j>SGz!-4) zh^PZn#x1up=lDEl%*F!EtUnoT*b3zFj%B%C^W&f4e#-6!j&PxdNU86(D6)dk5RUQo zha5S54j%QvH#3yu%ge7neUz^N$d7UD*BlnmzL4va>sj3gaM0}H_C8AsEKJkN-GwF9 z&3ag%_d1b1Z#y=<5I(a&YiY48C9i1;`F=?5dhFB3q}Ikm9vN&c4=sq|0^#Yx6q6sx3kB@OW+H#i9Y>HjDi?!cM?Fw0md zK1%DLNgWJ^wENErSyHqslF@fET?Q2Ol7Cja1F_jq1EGVAzdYNig9#$maT*Q|Xo`QS z4xsZzA}a)BGj7wSaIlj9z82{mW1su{mvrx8gYFlfil1J9ggJC{o@zd*BHklnPl37Y zvhm3FMfD}m&Kp%C&&6#!K0{z$OsR!Y{kcsLQA^?6Pn50-&7Rl_r1Uw$!>`t3_?y$@ z@X;Kqvg$`@8H{|KH)4d1^jj;Q1MLe)bXZ8+xBmCve}N)rQLyd{Tx08IRy2O%@Sdk| zxP1BQZaW&8__(e;fp8o|knq!QMq|p6%@$it?9;zD$()M1{PU*fpPGj*6=phVJ%_p~l3JHvJnAxg+J!2yaB+X&XvuN! z;G$+vYo)o>ysM`x>m0sAa)U)oD*Z(m`uB$l5lT+wN6BR8AWy%Mn1&{_19@(IULHz; zLKA4rq0IDLV14S_+4n3rl&&`Mj;RKk* zq0u28-Le*n>th3{?I9Bj6tiyAnFuriFRp`vuxe_&Ih|mV+;_XLC^BU`&Cy@h(Wjt(bUGPBr143Z{{ z3M1XF!#t6O0&8(=^}8CR_oX>7QTo%GpVTbseg_8>|MjNyyw_0CED`z5382uQ6n8t) zqhBC_Jd$*$z0bd{o1TpBvkZfU)!&qsgeN}pPX<&&hNtQfNS>y46*?uOQzwZz$m&^M#n)l2%ts&>Ljczvk38P z6kGxe4*O9QNMG3Y;KUagowv5;8WilaHP@4XNL~Tr65H=z2+U!7&h?|+o5za0VNNZl zM$(eLGuE8=BC*l4(bK=++z1?+Yf~3a{)U&^s+zK~m>Q|-^d7A;x^s+k{e@Qw`+Ix; z^XY%8-wLZTvOn*w$+!e*^KW-N+9E`n9I(AcGdX|~MQ?IL&$4?=q%*mp1u&ZB=L+8= z(PE(^WzL~jOWa)-(g4*|KIjJYPfuURzSM^rK#J$V>!Zby>>e2~2e)vIx! zADYwjyL9`ZI=oT%;y`U)$PzgEiOpViJa-!6+?wn~O z>w@X6b0#m4sU92aX^??ZRNV@@*2D8b`hWgj`DeR`t^C<{6tH@tn4~BOxv!Nr4>EM% zaBUxsGEblbh>99f7S-Y_qiJ4iL;191e?T6!zFt!4`m-0$J-O2t#;F zk2W>EbZggaDFfgQF^5-x<_n}uX+x#XKxsKka22h62U4h=$`m4BM}H~s)D41Vh0$Em z;dnc`&2xCvc)jy}*6KITcYH4SSt6XbC^In@tXuOn8-IyvLqsR}dwjLMuq*mv(ia}j z+qV~Hs2863)bSoastTKk;tofBR!_&ddCay1tG^n_a2Dk-Dl=Zp)?`#WG)`75rR^KZ zC^|k;8cb~*sVU#v6{nzd@G3h>^tIDtDDIn!lu*a6|V|RYk4crOsd`dY)ZA=bq zhn;b(n~ll~rHiR}G}vCo! z!Hz!wi0_bA1hTKJ^16S32qXsN`cST!CMV#aV%^+Rdy3R@k+(F6QXc*FjexW@Z zIwb~9syYyev;)>L_Dhh|8RTk*YDiFIL2zgW;Gjr*=mU+yGx*1H2Pm=A6pf0=; z5so7PeWn9$*Hvh40ugR6q2eXbloza!0}`$C;{sp@OPUl`qK~|wS}MIR9rAWiK#&cX6^!`VW0m2Wl)%uCew5`qv~mr#`K$jb7=R9 zfB?T7KoikKK}3SP42f4#?L0m!@+aIvOtFC6)P)9t`sGGrfw@NsHi}{np%<$H0D1gn zuK8@Z9Uzl~sL^tShz7@09j_Oo%%CRq(HdkiaJebML6#=AjuzBM6y&usr-B^ULDVyB zwiD12l?*zVR;;xHeA?P)akK;CaB@+oG_=5s5uyeHRAvj6dBU`86iU8R_Q84GK}nTT zsjW;zxSh+gJxD{#3u-rcydPi(rA46#gX%y%6yJ_{(G9HKhR3BHnXq&!oq^qVX(`mYi{c{33r7nQ{Qvw7)<3C3381pXt zb?>-MPTUtuHRiw1k?4)WoK7Kc(=F0*n`=;BQ#N8yk8K}+Y8H8o@;rL`VeroW*)aqo zw~x2JPxBq=6iM1n(iYfK4efX@iI2Z;CzW}j^ZKub#9qfGEHSUzz zN^I+jygQzj<&-%xx7W&F4z!>`C;hfo1j@PBCxhe z8GWH}d0W>C6F^sdqJm?#v2qT6v$xfvo(AXo!NkK~a|GJj3NgR~sdBbBCg9H_(%rdCCI}bk)<)n^TA~t+$YL!ApNb4^W+5Ym zKpM;7gCsi_|X={!a@q%R9lEL!bWQVYkWrJiZ{JJTz>Bd#EMK@m4S#&?!%lUd-8vqX zt2n+K++%^DJw6P<9P}-F@Od!@r=n`kl_F81AnGfiG@nHkU8MRF*72_hMcr@&I%sXH z=q?P2M!g1i3qjHc8z6H{J$?05+#A3SxB4LqoTY-GdE00FiKHAAzwGY4 z#Q6}`Ue>*@Pk>g(>T>nc^HFsruj$X}7v4253+U6EpSKJ5eLtGWvy#1x{eJ3Q`?l~f zVdT3etOcrN?7!j1GvC3R%Ri5vTYEoI*n43Oh(?Wf+bq>*<&{&ThhI!2sj@|cI$M;# z8#y5Dj(#g2lK9JH`8FhW#o;0n47D)Q#ck=>I!r3zAQeX_LNSmKU=%kL9SkNg7*xr! zWvaz%GL={o1k9kYpvc1DJ+=<}VvZT3GI{LUqt=V>6BShxNjIvN8TTzLju8mkUn*5U zj43$>x?oPEbmNAe`fEa@)VItPofdK51VOr$|9#cA>*vFUwSBj~bo_>j=tUa>5hi zVWgKuggWN-;vioZS%R8nT5p2ZpZMQ&%=R7M&hR!(w*8=-b>1Gd)>g!UCw>M!u+5s( z_#FhW0rvNWevSv@nJ$r@+vUbYlyR_+*6oGD>;aN@7Zrg52y2uVe%10|I-;IM#Vz|&Wel2W@ipcJboNnp8OJ^sEk;7p zqzCZF>rfD`vsWKNj4Q*WClH`c_f61RJbpRP>cEVc$}pQ`s^RIT21~r=+uV!krWQy9 zGw&b_x`{h;^+$l(I0&LD*RZl~_<{7iSxZD8zL(U;0YMwz?v#Xw;{Y29aElGU?KYp~ z;d*6uHV(6vq?J~x!5QOsa^Xb4%ki*D7q_WD`;zo=ls}{9-k&Fq{r85y8P~=(4cW#dSB>fkZnNVZ=y9ih&Qp35^Rtb4QPu95(NDk zTyu$n08bV`JsDJyHs$-FiuRSriLisU6XV?;-&YH|ZfZ#@&C;mt%cN%ErIe|c%9q=3 zV@-DDNGqY+n@xZD-F99v1GZr5MmWB3=XVzo}>}7p;v9w zmL8`hoj<~Yh2h`?7OpNU&kij;1}-C|43q$*aTg*`A_lacdS4S~Z!hk#@G2G-U84bz z@hV%S#ix19I$IDfeIOc&T$f4SbeR+c_Q0StG=yA;Fr<<-j7ALtMJk%z+NHr^7`Qp< zwTFy@dk8e=Sp>w<6EqtJVcxS|B9^b1froy#D}4E}<&*Zj z8KhKUr^>zN46UcovAYhUX~%~7LG~99wqoe||0?fku6+7v{IvGhYY#itl`B9^-GWYq z0L(UX1_o{1XrFtr`3#jVLSi8_8{p8k(hB(R;2}AVNV_CrNPmjh~!U+5oRQ-qWdSMo5OG!|-iFMSqfXEWj ztOB*g{pyQzrP2>dBF#4lFeidqQEvZ_rnir0djB8)vokdp)uxfFqg~((i5V-UTB8xE zVL4?kvRGl8gE%S2MQ1cuxyaQlAs107S6f3mr>0zNx^g|`9A-{QeayR4JBi=3-|hCj zoj<#sXnVb$&&TEcep3@&;BhDu3%0AVD7ZB#9jM9_==5m_p1f8`uETLjHhur3k{W2F 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

    14y4ba=xpMBZh{_fBG_|L!h zqo04CPdwf2?&zCz3K10=LKOZyW5Z5tZSNbjN@kG;(AIR#<+{vy6F!b8rz}91;=f$^ zz7sfkqq>a1rQ)?S2G$|`xQ|cfb_QnT8&)iJq0C~1K$db(gq64x^8~Xf2TSrffhw}T z7YSXOLUBR)O6mTw#pxF?sh{W9Dtk(uJpXouaP6kWEy*%SgQtm6P=^ipnZq$HxwBsq z^>=w9^=-A2WhC`Y`c(YoO0G4oCz>oPgiIBBZ9qbITYALTqU{3li7cC)wiESrgQJco6 zCt$Z;&kf{^P=q@HgwzN6Kqs`>)z#_x7Hxd&2LSsZ|O zgMpCH%uED01_UMv-6Bc_WF2jvkXOxyff&k~I#zCm5N{y`rZAcm;-L9!K zx-VzyVt}8Xi>$vWqbVUOV7rN7mcO@!rcaevYa?B|0N5e+-UqR@X5{VYU229C@a1pv zr+?`a|M-pX{OUJu`N-3>$J%zM_YQ2(2qnk{aGS2%u!I@X!nF&gzc7d+RyTXTBmIIG zb+K2tR=&R;axZ?}Q)gV2TuvTR`V@+yGxeX9ydGyjb9zjdh<{R)v$E#&nYcg;LOti* zZqqE;^UhB*jW(*GcyBv!PB=WPwfu)kyE&ct+Zt5ApluY8j$bj8tUW(aVH7&eJCLsr zg8@i;Wpzy9$V#SbYXohK)d86LCf2-(`pU(Jl8+~L`5NZ^`T0?XD!dU)ZE`a6P)cHp zBmA&J-tu_K*bOoN@pf>x8OO5y*qQZ$iB_o;QUcq_@5;uoi)a+R`E)q94@I*Q&hmDo z6&#u0#^7@{UUFH<%{_9d;veaH3bvzYS3MG2`Dy~dp!4V_aqa%tGY>Gek-h@=G}*^H#2-{9+(X21al*KQwnh&0Qx~qU(eC%FZ~x8DKKrBp^xapteEpyM&euMA z#|LTY2n0yb%S`$P=N^?8&&jrd8tR^lW>$$N)BGa<8q*y*brjW)1N>oT8rl-Hiux&; zeiLGXWjhnof!+boYm5?Qj`&MhUUnwCBmj&dgV_A*Xyj-_r^rEA<2Jw>;A=PI9sl}w zf9@T>`uT6(ZucL*<#s!|`U&vbE<{(H94`j~6egEgtZq+oOsE#87zLj*9z1rWzPmhr z(RKKjZ!y^>4DWG|N z0u_}5Jn%#;`35^sEN>~_=|irE!4qdMK8H&Vficno$+v~5ELA44k;&Ps9%gCe6_r7d zyn}dUFUiv)7Is{H^629(m+{RwFEt3vIA|K#yM^uLY3-EeZ1bJ9T)CNEldqcVd8;ts z?ZHBOR|PHzRF>Alrv;By2OV>-(9CDUqfa6l5hb6B?-LrkIC*}uml6v!7kHl2VokC@ zmqy$QIZhFw<(rlJAHuZtkR=F;TPY`%tSrWLKC=euu&l8(gXFiGFNr(Jc>^$oeJKLR z`~qI^JWU(Uo-ET}Vz%{s#g54pJwYDo-|RX$Fh zS@0fvIb&vpQTI9aiFLk40pMn|jI4)-ACipTP{>K99OeWf$hfCr`gSO?TSi1E8CgS; z^)Y~GHmg3y=xnWRTZ4w!X~bzjzyI9r&%f(8{_dOJ`T1|&(POVUZI6r-)fzFRp;M3e zD2F7BC3ggxbs~LAt1wAyMc@DcAOJ~3K~&O;1XwmZ7!80kjh;KppyWrcH_@WF-hngP z!e00IwnL^;--?5?rUWeCEYHUPUqGP0nsj2`g)IB!)R|;lQ(j|p}D@LlAD15U>)ZQyJXv`qU3<++F%ZBF((mtC14N2J|Bt=?L4EWc+m`U~LLk#9k}{>nEp7E&)<$G5Xt9I)5> z!?3{TB&=Psm=nwe=7NBKeUtXnPE77W?w@nD4$sMlXV0XZ7M5(%-BW4l9tWFm;Q1yo z1%od-C2lcTl%Xg<;tBMuM6$VSY5>3^kH0K@;8S1z$_wwi;k_UF5B}J9K8nY~@z~^g zHb|pIPEQIc?l@+;8z<&Q#ifO30UTZAjK?h03Egu2{7#30dHlhoBq3L%LvDe0US*XJuz<|2*)4-=I$7*@C&37qqk>nZ~l zSvc|T5>u<0gfFF%`$v%2F{i+{CJ?a-j9r>`U~1R{3%8wobA~>G_0v0ls6iH;5QD$9 zxq=Kb*E*N0g1f~)Yd}tz)SX9QJWNvV7R5ANB32)bgICs|MV3?!!m+RbO4bmllY%Q} zi#e_A*dwi4P-qc66B?@v3#bfxA1zheyarO_Uc7{fft(XA89j>@USNFsgTBJT6DN|& zC4R|jz%$1**BuC^DIirS5qUTJjX3A6MNWw=)kSN{-J#>N>spRTqGVV(ZCBbV0B?&4 zYiIAM%)rn&Ywh*+%vsan$@x8)7F8`I!|;`+^W~xC8W`_EWqyvuU0-KW7D}H& zV4v%Eyw(qGryWj7JeK`JD0l<#Hr=*?>>g`pB2K$!_piI|eCDe!{q#To@XgJ){@cI& zJy&;e4^YS?5tSCSAoXc*=_Gqg$+Rsm zT{F8Fq`Nc4&V|H?cLsj01@)Wr$UUkZ7Dd-8jubeTe3UM+>GO@|YD%743Pp)w{#8NI zfo#0F$PZnPx5qX1>tzb;SH3PYl=v(r@1~nkEp{Q+RPZb};{f)4t!3+zXeJM3rHxDo ztpO4z@?w03k;^1^OWWmM2<$LKGolg)E1>+7YC%;RiO4^ryMGi0F$jH+i{TgT7IBeENZQ5Q^L0< zzhdCo+G7LC)N`OMl5cnS?hVX?4~G*MIg4_BJj`=YhLM6TOF4uA+a>W|m(4@8uW(gp z+!G0_0EO3QVPD^%C;+xlMDVWl(w>Bww*eFLHQ_2nhRYx#+i}27z!m&l0a`@a$0l6! z8fe=`e&cb5{k)s9wU%VZQ2^)%8 zXgievn5ogi(1=WwA;AyA*yb>jx)YtFrbK4HBF4D`ro4o)O|W7Hjoc1_Yv590~_!F?RTGj@S|`2(9gg9SHJd6Ts`@RPFL3eVH?x{Pr(_`t+!_ww|&T9 zEe!mM<4#gsHOi7L2R6OrSnd+u4w!Kn9ixW!N<33CmEu+}y!euGq^t#|!)X>r`>`xy z|0>O-=hZ!%B@d=6|B#N6EF^3&uctHQDX;28m#5nbS?>T#^kv5@E<$FRXYI(sEG|D( z6j*|4$9D)A4RL@kU+9cdIV%axms(9{CMqUy4&xH6mZsxulUCwiuaPU_g%(S@+eb)h z7pOW|{<|KNZ#7Rm<9#K?qdaD@oA?(WefA|$j1_Z{&P!7O6y;ARn zWz;ZC&}El_#dSO|!w6U=89Xb4ubkAk%Qx})RD8vU+gJIT!F!L!6zFyKi{TImPk85? z*00K_DoZ?*cj`Pq*==W01^`Qb42C&y~8QvaAAO^JANLV;IcVP`!PXM_n^(3&B?HMWK&~Sv> zJV}(EZC?v^rA{Y`7LhzbV`kt7+-bCd>~u5)sI`Vj_GI`j2r~{v+ua7wnePAzJE48y z#oM2I*GK>9KY!0xUg&q8c;*4n$Cg!8JeRQJ)G@}O8n3(}F|0`=%)B6jq#U2(Bs3>i z?&+a&EXO{ovFCI%sciig`KpzDMy&aDIO_ZH z`3blIZ_plKWE+vmwGsKAqAYh)cBbys?h4SZK6{9Wb++lJ+9@~XmC93D)7j~t80>g9AMV;QQ)4C zjffej=ie~q8WJ+VYw2m<=`qWQ%G@6?%Rcl__6RT!3xwWMT0@X``Bpi%%#kIhlP~g7 z97UW2Qdi1Zx!5S>Y~(Gh1eru{^&~oGO8GK$)v4FYPxjk1oqH>ebWf9v{@_ zpMUme-u{6{@8Ylg#qar!N8986cJ*c_x1^epFpr24pvl}q8(q-p1k!nup|YC+%{{I* zeSP7^J(uahT3-cd+M?-uWLP3%fDnkGVek${8Bzimo=opO=OWYX1J5x9P^}w?LE}JX zo@~tqPB6QXKyK(a!e_qr&7b_G_y5G(-v7m$JACY^j=Lwjvh51v25Fy$U&SaPL?_D$ z)hl&Mfp*0}eMu|VQ{tWC#3ekfS&N%-#Z(@J%MKyVFG21U48=KfM-L(}QIN?-xkx6Y zVg=21&l&OcI;87jJntxN-BjVd1Qb2I*YfPA=HfzcwM+_1)?{RhlAL11cgd7pTn1jr zn5(p?Yt<64+_3W5_0GdKh6GaTN12@1e33tgN61X!nXaKAz#X8;TD%*36pwdSRKX3z?kgZj1jTHc9i<3xor%=cLW>Lvl?2Ues=M=RzG~;r=Nf zVjMp%HnR9>_Oz2^wG)|@{x&Hqfio5Z%@*Q1U&}gBOPo<|SxHj^d#O6n*m=H|kutwS z!BMX=+XMeod7KOa4UGgw zm(zPBh>SiW;XJjW8Q&wMk%yJ*e0Enw=7dnNC=eS7V^j!5ioG-t6~G5UQc()1j>J3q zjD6>bgbCAqp&_Yv(wfPPF9RLT)K6?*eVIS^j$ixffA;>*e`B<#pYHup;SOkBf@pR% zXW%Eemk1ThvI=|;{sgU`VV^Uwgp^lO=laRRqEIV>9`HMs9eW>#^E7WR2^b^hp-kls zD{_iZbbg)5fwf~t+L#$K{h)io~kuA?{3$1R|wlI@uCfAqb|dLu^ASyGt}K zdDIMwT)uX!JYD5s7E}xm_1eoX<3d))uV&)Lg&VjqA|(cvesGSn)7f5z&RoEy;gbN< zZ4iYTbl`hR^*uS*NCQ6@77^`UeO`(TIfAs|r|sACr7-rfU25|z1He%eeed3F! zx4h#+KlPUPefC?%$G@%H9p1Tvn}!Z_0h?s-DzrOI%1>NqiQo7_9TFCDZil+e^&;dP za@`R~S0cm(Rv7PJL&UR3`6a9>4wY04EVv$MQ|eVMZRHnk9rSvo1>PlHqSTt5hIDCBYov2(^X|7h z3(u_Un;8l+NzBl_(UYWRcuZpE1UY{jAqEIUTd`5^Nvu#nwA8@kPSre_5{_8} zyiM8ftoUI9bmo^G&^|xZ`3^4M*8da!>oq1-&J=3_V%CRxs9c}DahM$k&v~F?dDa8- zt9Tf5R+EJ~M8cF81bWkyjzM5kv(tv{{%bz<<*)z4H@)xXhX4J4{_p*%XIv&+!HWQB z`Vk2d%_0!c1=3n{Z~(RMOzUQ!1~ghE%Aj_IK;=?}RX)bpJl<`A15+&$W}6nyq7y`< zNQj&VCM5ZJ2%`<>r;|V^v|;LIfOQ$62jXvk?eybs{q?v0i}!xz=KA_o&)i-=a)PP1 zz)N0v@o#9%4y&$i?+DFxqCChUp8I`vmlnY@(W^bATIuevk(tJJhm&7*iGbz?@ zvEbS(UUhe1lZg%3(ja>U$fPinE*@ZT9N@VH0st`B(2608=^Ox0JRHdo50cdxHaNK=1=i>kunm+MzRz|W?*9_}$L+p;f*zQZX+vcZoe_M1MewWjfa_{_5pe&&}x_H%E4&$BOgd;E#p?W)6I zcL1_M9yIo|=jCwqeVrkb;>p#G`e5Q6wqy$NRNvOyo$xOU&4u|-D!+7>!+p=xfJn@l zvbKJ5H>-M&qf3O?FDZ%3=$bBCB!fd{we6ps86YF+kl~JJFt{K!8WE)lo#`tVuq-yY z&!R(cH`oDCsf*_Cuc$ZduM(sz+SH82o~sSV*>DvP3+xD2-xeJ$pJa9%*8cN)UviCU zx4AizBtT)P&b`Kprz}&H846vs6qWfzilMYM=LDRyWP#u0+L8~@61F2X4}akydyokX zm133tj2yQ#L>=G;fb-LOszeockjyAUZPjJY?BT&OB9??5&sU7WrYPGfEX58k3s=Tg z78tCeI_s3;6YZaL2JEeTrs~Rhe~oYvL~seW$Ob3xxQ8<*MOs2@m>KoaB4q#ZkPOMVY z^aZz}4nf^$D)x})n9FIIXb}V^L?)R8^ zz-z-NYKg+g1d`?Dp;<5b{)$V%gIYz6kd7CqJSWSXSFfh(&sDb7vh%a%zZ&X`xheD=1(w~J6fanl6({=rukd1qn<^MlP>dPGzYoI87Vzlu>z zh|Q!zXQ2yHaphc;B2jb!nseTr4Ddfk3|<;q5U5mwSpWyqSqB;9QHPA`?S(-YlrBDV zr*`#1!^zoI(})*%7*fH%Dl=8^u4W01G%<;+6v&LCWm2vN=GZ`{2Qa-6ZhWOSRY`rw z)P{ts$`z;}?Hs$b?}Sn6TIa^@z#>}G<%!C@Ol%A}q+H7?E3|Z+S1G=eOhV?Ze=oL9 zF~3#%L>@1eLDqTJqXwIW3*xrO&6$rClbK>~N~Vif`bfhNU%2lD0$a&SA(g4!SL;J| zfCk)SOhT+(_opiU=XkutWx}^~0*KZjVgu~nc;uNcyzt!5{Nl&H^|Jl#*MHxi{6qI1 zW0WEWVa<|oGqR8l>6v!I+WT+~gl--HOSioPvN)1FY|X7qx78Plz-t0FqWi6cfxTj! zF-7IkX#mz}pt}6Df@lWxM(d!c&pi9$PrT(_Z+_Qreg5Umo_w|VNQhtpL+As*)pkwb z=D`Wh+-iH)Gg7f)nOWF*^XyY8<5t~1GeMwu;kq&Dt)7|}5FM+TKzHgL)5kSuvSx^J zVsH^asZ_zJ`;=0VMsVoAy3dbNzV>4H3d?@vb{yE~&I+%s3%m{Y3uROrYE(0sM6nLU zj(Nyoj^j9EKC$zeEmE4hzyIKCq0a@?0C-Aq+(OKgM%1*rP)brRcDG$xv zM4APaj6EMoj-+Cy0GP*VM)5Tz9+wVW47hZV^qU^!8-g?B223DN7_O$>LHaC7b0BQ( zRb;{Ll`aFX%sjQp_9B#h}rs~}&j zjF2r#NQDJ#X4@qmr08|EM;Ifs2L`&r>o;eS7SQadjQ-l7lAcezwtX zf_@y&d5)d6iyCn@nQL@?AMPq%f0|4uHa_>eD68zS`O$g`u#zw{7bEDw;pes6TjITd z6NGF-yU#{p3nzf<7<0Br<>JlRX9 z5X?LDQ?A{hmSERHR_Vts+zz}WxIu`V9fzbJ^HAxXBS56A(qi>;Oc!_JdAf_!64iP( zKY7kk3@9gaP|LXd!g;h{e&u{DOX{c!2p6%~4!r(n@%_SQ2+WZ4l%R<2D2+5z?-;2% zpM<{2Y;4>fd-WGz`r1Ev`>(#-`~UPqf9}t`?#a!Dp$S@ym~{Iu*(XAnePXAQp$NdB z%s51WT#Fwq@DeaK?!r#H=(B&qP}0)x={OM8iV1iH77Lj#^)3l!Fk>_J4iMk!{MZ+s z`-i{qzIVR&H@`I=y?WI%r#n}`HS7*fCuqmscXXR=lbAq&!bHN0X(4*CTuI99fgbh!fz*LuV_$pnG@Y z)GD+Ly)LKj_Yo`s`wExlPWiTYn3rReP@Lr_FrB^H4_fU~ol=}>YA9AYVn*~#iAYd3 zK^SRRYJ$3ewk8I1nJUt4Fjt(iHZVCEN9@}v6`D*KQR1evq&mPS*D4~jE7q-LFXWA` z+OiA2BOMx~*G^hc*JY}vvO=#6MPx#+483`g4UM~y?3bA2{Zt-v$ zquwU4MRJ599ZgYVSi=VLcnZ9urv_z7$v`l*LZ|77BfCUuAo96~QrDL}9951no9LO{ zU>2+!U{8tLa%U5;@f3kmwtDU>?~fkBKTt z_eeH`k$%o;^e+N+y%=6ALPY|C(h5vGC+6d!7L+~gn1Jq%0ClL7K;zWefaryX$u@K@i8=+f1XY77BmizirdM(@NV5P)+OQ8H9E|t?9d62wU-C}^>2UqAO8Hi z-tyj$_p2xFJoeN}14A3^F0jE2<3^_wqVR^%uDpT6((r{TAyzpQjs>}BXNsjjASA8? zPA&c-q%yvs&-DNJcBLzFx@%U{K}Na95}fl~uV&bQ&ZJIYgA8`UsiWU`9_{EIb`4&+ zf`DE=n8{H0#|HMZ^?S-^G8GpK_w2;B1Kcd*9hJ>J0F!e@4!1&=esRGvfyK$XI}*Sp zcE3RBm>IB(oz=VdGpv^+znJfJ(K`k_vEHlL>>K511(z=UA1V|zvsg9RO?aE5wNA*i zN~o*VF}rbk`4^WT1H)xcqmi%yo73Y!AE{iMdpIaSx1|jL9vhFfP!vzeNu5RZox*`q z&xPPw0NZ32L6#kKmxAjM)y%ffO#$eK1#_9g4ZQL%Qt6GDmX|=^LQG6J8a#hEPLBnf zf>Jw~2OBy#Ff4r_1=#@%PhSv*qQ>KJkElSP5q@qsHHnF7W#-;iN=T1)`VKf4Pm}+y zoernJx0DRc!y9e|+Dsmt$gLKIc{RWeY*8mcS+WEfA05fB*i+$7ff|x;^R_lHh0)K_ zsu}vRpOkm9GhkRCX!M_C$xPodg%^6!brKwtMrIunB`q*l!GznwXZ$I~?~C{?AN%TQ zS8!;5Ckb_k8@ZN8A7K*Z#tv{PtIw-5Ofz+qq*Q^E9L$ zN2BGLlw)K~DHnAlLaIA;#7RDD zF0$Wf)a@~d7!64%ir<3XYO6!``j0w{rZdF#PwrfW25@2-B@TwtjyIU zxuW)%QdJA%gc9JmPGnjJ(tZOKhfd@CLK-K&fB}tR8YcI28b}x`IdBR!0$TzfiJto` z?Ww?W?!rNPi2K|z(sFYzTtWl;7=7p@oWxUTVg%e3?h=BPA2C8BN!2GmUngMjQ$gWW zG>kd`lX88R_m4f|MbyMJu3I0coAL4suujO#2Cuvwiv-u_GCpP)z@Wi^2VfUEaB_GL zcYzMBg+D?7v(Lc1dGx>%X{Yj`F#-(kqK5Azlk$UwStWPC(>j>PgeZYFJa55oAO#NB z=ovd@%E}R8_W^=M)j$_Z?C{lk98jCwNrX5N;q`R^QA62HLtf4>JcrIB8=|+Z5htt) zm2avn=5IYcZX!h6LRfi5Il7BffK&q@cIgCm0St9Sfs&3|&V|C2m33>wb~nN>T6hJl zyXN*+Ei1|d--xxpbMBn?-n^N~JSKyJfHEX9iGbh)6riHC zL)mS$UC-0~^#9U7m0fD1)mAB5wgaLzDk{<{lM1#X6f!6YnIt*h>6~w`c>9NlSZnQX zIGLjMelpKJXOFRB#fmv%m1y6^paqRsoQm%iOhR;O1mu($E>jWjkL*Pf?wIlh5&#M` z-KN3ybL&4$lTK18;@PEZ+DAWq@BjWwzx~^v{M?N*m-N=#k8e(*2h>$)I-wn<;|S7h z@MJPw;3pexJScYwh_IQa+jZ9=i8bU`TwY@EuuF2!_Hs7KnzuC-yPNr%bwUP$w2BIP za8w`^)>5zA)vsN-boO<3z2J>^JxiuDKlkf@@}W_*oB&xcjCPy0^~ty-;DpV1L6o}E*h8cijl~{CK7XplQ zwA?!e(Q!?CBEclSCbAiC?&k@5B+qvcl>!=vts!DLPzezp4+~S8lRccsluE0)7AR`r zf{(u3t`ud1E1{6A#O$jziq1R}QJcLM(UT%VhU620Tc2i$!O82gJwPCm?vq%DG7(0) ziemt1Mq^#$=*Il;wVVI&m50Cdz}2JUSr5;0b;bU))d#7ml=C zbkW$XO`3Wd3zj>U^Ufpn(a@WR#{@XP@w; zN51rn@Bgcd=Pv)7*F5`Kw;rm3oZUs?xi{5lFi|NIF*N`oahaMenA{J9kQTiM!-Wes zkSC;rFct*{4V~^#qF{153m1F5oumO$CIe(WS3=8b0@WyM%vVi5{;3Ck?w9}MPd;(a z`qb@pb;?AzT2Us@bDtV>kpZpUaldR&+-^ukRj@p7!yhNiD`jyk3jNZnu4)sBJU39+6i5wFRFAPiaoz)nP# z5mcv%K`rPGweIljSZ33lW7DZY_Kb&Yof(gq({S#1-h`B%NY-!DWCz3fsJUbLQpL;l zIwVqsg;FDWMrjjIx;wQ3>b5*7SvV8{c)GG;h4Gb;9~qU`VQj9Xhr`j`YywDz4?Naj zZZ)PCO&BgBNV-7TG*pHM7@$N>O7hLD7LG21B5r~(#vXDv_H1_n6M*~u=)2-AsK^9i zshC!x$NC~eS6mm$UYh7V?b?VWVvETFRGp8y`jPseuNS9hrZt>18L`q>OETzdPPc4> zGEmJs%9tD<@qwGipZWa5AN-5Yf9Ml`d-ntP&!;bz(-+MqqN0?@fieWc?BOO!32vEq zW|k4xB-?RqIzWxX_%EyUYA^%gO*I_&aAQF+B9~nfG{lra0}hjU=Fxwx;VzCA@q`_) z7Sq#m;qmtz-}lqM`oZfruK(C~f6J3DoH|eyNXcxCT5GjBtyWNv1`nFMPZ14n_{Fx= zT?9&#(j>sCb+GA`>47m4tgNnVc~WR z_>*_fr|&4IPE9MFXTh|JSX(?QoBGQk$;OBv+@i@`MLlfgB1wlIb=6i01b zvTO5wnmt4@Ex2Bnf1xmj9?Ale^g!thcMk(%)vi7`)tgVgwfrw{fBmbz>5eB~TAiX? z6J9vfmD-KDLME)H1jIst4{^H{fLu~gza)+0`~1p~c{MU__HePN2eQ**7V*_cajU6) z!qW-}?AR5o%V})4q6jbRpd-Z1(m>i!XvTx%8uLLKWwy4uu>6_9txZHV650}bt+mRc zi_;+9z+T|dy5U6R&j4UPuJcW~eso3oq(hvAs3=g}s0iO^$b6rY+7_Pxu*qd#KLa2_ ztPrdLI2n*59i+QE9%u{O|ET~;6|B0t6GzPfGz$zKBnbpJ1|il|oaMrBN!_flLP>rqM68XIrGF3*hEJzR}0`P3P7F`&DrUOe21h6~ps6dpI>42_;)7-n1&vi0k z02E&$m>J}5E=qXGf@T==G9J?1iygw4enjWi%*3&n&hSegiG0(OZhP4`T>h44U-?hJ z`NyC7(!CY49bAyrDVj?NL>39qw^}1WHB^ZlB2Nh(X;`Cjd>C2^Fs8;O`OalePH9T2 zWPVd|rKU}ZMC995hgO0$lHAe{Bm`TZPXmE!;N*&|f#vWVOZ~@(?)~}q{n=`TA9(#Y zKl$?M!>o4}V45aWfrR&;M$f|%fj5RAst92kSWiKc(-M&bflX$f)#F4t%87uUq~#`h zu2qT$hk2arNhdby`YriZ4v8gH1wj1~jL-Dix}dY!u?y3M*6akM4DBD~PTMj|8swcKVe zmr|!-j0DteWoc;WHg052hC(P3sVib>)(s1b4JkUFPkzcihcPGl354r@Nj3?&ZzJ9I zN)1>`|E}aq8ufYeIu!_qX0r}` z61rmE&>~S4D*&K^Lli2{-zImw;aRs|x$T#K_ro9j*Y=ZFo(hVM7Is7}V%tOQg0WVl;IYO{!>tKrz#d`suqL{@LI7!$1Dp z&)qzIaXPr=1|};jfZz!)0LTOp$_i4&)|{{N=CRDjFZ#wO{r7Lb>t)Zpc;&$3 z+VB>uN7rn9V_i;ThN%>a(bix^Dd9&QI>s$zM~-0_K64bI2JKKA;>^GZWcWui8AQ$7 z!TKq6jlBMoF{z`qcp^ zI_N7+N+o;%BI+VS_a%o@d&s=)f^mbo1|L8oXe8yXLU}@9-_%CNakY05nV-`Z=t7Md z@Qu_c@-Ub}4v5PudF=}?Ub^Kj)T@8^iO)X#$PJu(g3zc_gd7Q4MKRwVJkxgtQU6;y z^?Dl9NZm;+i<(p!?-*~z4vd9T(3}fR9kCG19f9nK7{}U-90F9GCfY=sQ4ObxOoerY z)yhs^`uzR({rvy^7uWRQUElGNJ1-ubg-uWciwG$uW)?&6R1{=TrcZu2)jh=}u;Q+2 z0+TCNBI)#}1gE2$be2|Qyw{`B;tnDKq@FrBtR_b$l&UHp{nWib^;j zEmw}$6H%ZOgrZ8Ct!KJ0tKY#*I>SXVIM9uW*;Y-5Tz4}G(deaME@r;WXCz-f*Y>Q$p_4@I3 z!P?f>3BzS87LhFBkAzlIcV9MAKCtM6e&n9-WpkPpwD)cVd@u`20q=i zfsL>F{U&Yd_so_+QoU(8!wXW3=^Ai0n#*uUs>lK6$F0gOcV0U6L$AB-whO=YXMgk6 ztM~J8!ht8juIOo;bq#Bgf^?rRzSnp{`@9ontM+c=Y1DP%;R2n*ytAnwBS|j?mG>ld zk>ZW4W4Cg(^<1RL!D^n@uw&W;5;Do@Tjr^J@!D74{hR-fRr`V0z4!&UpDm~ggQ!sz zRW!IIsh-M{Nj=c+adpr(C{o4qd>AC{K1-0^iZk+7iC}~wp7JG*b^^vpAR=}H)2IL8 zk)Qvqzx?A*+5 zeK>h*$G%6T4bpSCfgP0HqC`!8NHPMYkaXi?hG*HaLIkX8#_Kn3IhbDe(r3NvO)q)* z(=T0A76LM5^aFDN4kngjB2p&SN|>mYGO22%8aEt-;{YuI)`8qLxu_vxLb)my3Y|2W z*8){b1=Z+vEJWjae)C8?xoC4k<1SY$6LbfNqm-tJvH0+k7TNjEW|?4s059ia#Hw?5 zEPq7XV9?Z2ujHikbd07+EI&;EUFVB8Ms+^j)7v&xMtej2WwhDEOhdYNbvHS+dk8&$ za`3x(e^+cA(qDjNSPOJ+p{<<_1*tSw&6dI*&eG+>(*Bj$L7T1atbaiQr9S3e0tQPZ zW8;Eug0dKc48NZs{kCOeJE>cVNZa=;Pwf`ZJ5#P2CU$;(140*S%>~6g%_jbkq)PuH zD=~Qovm!VRdEqlJmou+~o_gPh{`&r#Uz>$>bx0vJ$7mJM%(o$>T;rz{DVOAM z_0Ww6f8~9jz|GaUx4!rpmt-X=@0II<^BrSrQ)Q^4P!JqlBAN{~bKet}pwmNsN7KKeR!S@d`14va> zCFja{PQ4o9yox!6X;%h@n-pBoS>^_eG~Jiaxcp@JsUb~eBPh6?A=#*w@T7vg*#)tP zI}3yYs9Q5tjvkR~58Qqz-}&kn|LFI=epdRF=ZjHW*Z((~u? zR49o97sweJjwP&&>CIVT>d`RC=6)F8w_I}UnbU(4aMUEmuQA9Ek(D6yoD#IYH1K7H ztm_I=h|NXBJZeqp@CFhTna0@@?lDkWC|)fX*FKiWmI0qlgYmpMStQo>cS`CI4b&8$ z$r4E}QeL~CZ*f94XJr#{ORr4((oVU>p6s_pAj8`>9+%}WBY`bveBsQ@`$q}$n2rIm z{u;;4wm6r?b2$VVQJIfh)GahL#XEf>L{`E{BEbiHrseB#+NZ+`j3)#+dR!w-Mu z_^U_dmU%8Hv4a4r1rJANYkR%pKoIN$qVI;fz+_lQHR0dp6rmfe*22?fl~kNMgVo{Pk9_sr@B6d49{uolzUbLcy5&%D zDuUbMnUSm>rOTWH&ybC%IIKE`y-3F;qKaqUS6}C%*+`e&ZR;rzG@2o6d4-JZB8nG< z-hln>-4FlFum0%=KKA*e>5LqnS(~y<&;w`<>1zPhCzqsIbvBV&IhZ*b3~OYAQMNz3 zG#b#^_}~zH?k09y=SiFuF)Ar6c zz2+^idCm)NJ#z>vsPI%}6vDt_kO@4PMA5p91o?)u14?ZU3Pa-;9XxluWlBpxUIypw zFsNQgfF*G=kVWq-#b%!P9Aj{5>|7Hm)XA-Uv++ZImA*w!sBZ*bw3RnoGD0I8TNrYPocR5*kYap+_9 z#9;Tx4ejDG0VTf3#ng>oUm&s{+ZuYC=5hE>ZHVmIj)w5%FSUsM4g=Ks_xlZ7wG_Bi% zDjqvi@xBzRLp^u*| z+wXn;lh3Wr`o8cUbuaEbDv|2TX_Bf@y6X%v8`?^tNHnVGU^mE1f=9@@vp_1~wH7UO z*V8;e0yBi-IjeyvgMUX#<^dE!X)rbK2@b3?Axc4#D{t754X-snmvXl+8*nJ}VPD%` zy5wBVBO>0mp>e&M7LnwreMuKWU@E4xVpMu2v@3g2i;_4bzzKqM=O$zA?FcM1Ay3M6 zGfWu%;o!N&ddfgnA5-boz=uXt81HEwho`;Tq;g9}mK6miLZ+!7{FCU!2 zw4(RLiDYS;XK>b{TD+VL0xcc~b3B~1-LeCHtB2eV zEEY+^lGt%gp>L8R1Iac8vmvsX|9Qj4)$HQGG>_Wh^kKo}W39JpBC8~+C`hN@r(=8gl1b%l7F-X1WJ*EB5n;Til(Cmz(nsq63ZvEmRrtSaI|RP z#0}6}ylZqA`JJDQ`L|BwF>urAC2C^RLir z(sSgU#bl&havFwgof9xQ3Tf#CPjtS&h0exzL!+*2_`bW^3@mcE%?B0v ziA@C`*SDWz#v_;=9|6(`=p+i(3W1%!aR0;WUwrS!r|HxWzwQOky*#N@ijW#KDw2&L z+(eO{){EF6A!dOfWpc-?h4yEJc-IFH273OT8EZ8$l&KU|npT6A`AAlu{>SS-{~Let zJAeL#tEVsX^m!?2GXP5XphrZo^-&~zB1FAUT1-Ov|A7dW?&Jt;%3Ur_pa*rEw?q&| zK+xXE?=}|scs?m0xRsyJ^cE)hltQ=VtR57ZZ{E25^z^;2dHy?I`|M|2EQijX#8U%$ z(Ui20QiMgZTDC<{0NLgkNu-$?=W>y4v3tp&@@k>9_;iZxz$F7)u};sqKNcwgrX2ALjIExj1GTH zP)0jP_G%l&hzZ*;1wA9{1ihg-lQo}g_-qQt@GQrx?OQ2DddgKpH@mZXc*~Mz+Qv*S z3!NAceX$mz5jpSD(hH3|6x{jvgYSCf^B$@COYi^FFMRoHD?O|@C*_og&ht9G^zO7U zh@f~;Rb!zGzh7GdBr+j?tW|Fe5J`cOH4o^{k}(h)oEBRV79{sbNLn-mHekj-TjF=u zGrgY_4fUpRw!<@WZvNV}hu-t+f2ue6@80sFC*HD}V3Y6Tq0p%mC~5ONS5ib(R}lgC zEJOuSL;xzO6I!NA>XI3{FXmA%qx++o@}M-A)x|O##smsDvg6M2OdL{CAVr&#Cvll zEE!OTGc$SmWOag(Rt=I?XL~9nM@=R#aOH^Yqo9kr=#-(Ev(S_pW~$D{PE09#Fu>kL zMPtP1SX(~c6Yh!J<_UqKg>>BU>r#&i)|P2!!@15$Q+P;=eGzS3*g)F&NsZm!rG*%W z5p8qNI6q2=0U>^A$u=08yI@4nK75XpvKZZXFq!oRwBzl%+*z}IsG-Fh%f$*1Xq0*8 z{Q`(88Co;I74@l?58n0q7v6Gs`aSRcz0ZF6D|-5I$5Pg!C|Zg?UqR3So1d36vt_?0r-HL!us1p{T;eUed87 zT)Ea=^wJ2FsZ2%Jvk73r8TJqNtbg{GKJ@;Nf5y&S)H4^3sVD`rxyz1bpfHkrvT2|h zda_36iHV?wovu$|$05s~OzU12sYjzQ=t?dInK~+%vQY5`jR#Bt;CwLl0q+tL0Y955^IzdUvNFHONf0( zZX|}02+*w!zuK|I4!dkOjT>lQHcz*o(k1>v-1I{LGP*tGO)|c#MLKihLWdhf4u=yX z99^$n5HZ+jsw1-lvp0;by?Oqw6yW@%R>%b$4va!x*Ugz7y&cn zjE@Qh;(S{JF^x7s&k|2MXK(%1XC6}j<1hd2-`{ti-f~LHAt&F*)!-?IC={W24=~+& z{Zc|VKg2NcZTWAlrmg4zy;!svtQ_bh^Emr@=}+}lynJ1o7a+HpBBZRiI^evNOS-cF z03ZNKL_t)>JXtw|iw6%pc+ao?-bb*$`V((|^}*@GDcuOwTh^!+k;$8W4A3(+pzwPo z0_-`>3XkCnVFEJ|RGR8kK%r_ARqV@SCQ2G( zyW!AzJ!8iPZl$?obg_hE;HhLFnj&_cot6avti1uiNHhWPureFIHV=-t9Z{0yB4J~S0-~x}r`Ay^J6_O4 zHPihyUfAR*()H}cr7iN`e98CPWljAAR{j7E~xsq+ zj+^`~Oh@E0Gqt@*TNpb@Gr%4gY+mXDm|MU2Jx;x8D+sqpMcT_YF6@B6NXOo$Bl*$C zzw7XT-2SI!G+wt#16$y5!4o#$74}K9vI{^Jo|Wk-x7a&g{Vcn7?HAwwk&oZ=1)jT2 zrpwe*m;^@9c&rf0w4$@(miyebz5H%hdq$bGF`5lMVq{`Wxtz;n7)P)6g0lDYPpm)& zrkMHTlKear1rw=Mp%xf0D@>phrlRLA|NXt6fA{-7d2q)a?|9X7o_1PiLldg35WCI??!7R{fA{v+{@@#)|M+v$DyX1!_I1FzC~c#n$2CQw zr3=?XTb3k+@rli)F-pO03E#AeVWt;MhQpl>rwBzvmFiX35^br*tm~0*xz}bwB2xC) z6aU16NILbb29t&66kmyw(@o33{}Dt0H3@9%8w4zxX!d}X9}WKC9hv7P!QlKRidZW= z&%OZ(%$88M23NB0ldv?n4R;}@|N3>~c@$5Ak=B@*7Q@Tiz}o8FI@-xD)VFKHog3|X zgbu_kC`TXE!l>J?C~SUb^UH0Hb|#vh{H&WAUU3wgN)9zT`&5)5xu$UlZ6$K$ z9N+xfZ_q=#{#$?Yw_mv%0@F*T6X2|~0z#uo6pC#vRayMY!Ev%1hK+?!X(dq&EsMuD zxP-(+r>qP)974_p=ETS$V6aG%prRU7WGaMUo>7V%o|Ust{Oa|u{K9X3=^Me_(iU5)#y$%hbF_GR!#3D)8NI`O_1xMV6J1-BR5K$XzrRhEaf=PGoBk9M zdkMn=y-Nim=EZB)Q-?wih05rT5P;rgX7J{e;p%Rj2(T+}0t5ez6p8I;^UaScEBxk` zTr(=3f(~t4E*y=8ZMc(_?~;s<4p7c&9T44oUz8G6mC1Z|s0a_`Y(3O_%XKw}@PM9}TI+FxlCAFqwRhG)c)t z7*$dnf|w1WTGVU}6D=yDGpp}(d2sF=_2QTQ+x_qPFMsyj+aLGJXPiHfYHEg379Nx> z{UcT%CoM1|yrp%3h~}9U5pR@iQaMf6DnI<``+niQA9>)~;hBqf+|bi&Xeq2mHy{u% zt`e>DObF*$rb$F;Y3EAATH_-%KG*Z>8gV$}8XQw38m@BG>zgxBbH0Y5Hdo=Mz(Xn* zgFjk&G{Y}@cTyzKkh!py^%1W>bo-(F$eUmDj@Lc!Dd(rtVwwRuf-P>-s(w0 z--$GQr|^(uT_>ukMqw+HFyFG!TRUrJ=d|qC7bE9*f5U)N01PlH&GVxcPp9|}(N7zJBq;bp$=WfnLQgrN>%FILa{tJoT1w1ZgQwtCzC)q8SMz1@!?F>2T*}eEow6t?c zw;VDcnrh|W0gxr?vH)z?=eJFV9TeCATi!fAE8FsZ%(>t5_5Ky4@M{@ECs805c_{sA z)aEY%+yBLW(~_aNYT`dU?U&K2B6!#4NCPM#V!MV&FND|x+gqzhF#XLJ?|aX0|LL7S z_HF0SA4m!qVkD#vG9$!F2vtSZw?Iy+_9g7AS4GM+Y0;Up0rxz7 zv^swYr)b99a+H!-55^HC)GfUb5r$MZRsHjGk@bPyC^znZ@;Q0un_lsKuYUe>FPu6P zdg)YtyLhclzsvK@q<-We3$ z{h{rbk6-b{AqX9wxpm+695J|mnER3h92$sHPn$mN0^a=6r~lY@zWxbkXpelQ)T5%s zYN1JNTa9!bxm>aI+%ygdG)6hn?Etbbw8m{3Bpx+rZO8pgvlpA{owK|fh2k1XZbRrU zoCryZ6q>E;3|16F0o6>_)ovQsl>$4&gk}x)S>4a8qWs z6A(;_VrDaltq5=(-`Lr5g1`6~5s=ykYm8Qp!tdDL!?c%8)dE@in^&QW7(z(M!XT@!Toi!0r zmM{`g^HumMQf3qbs^S3PLDId?{S^B=^}}lnJRw$rGSt$AtAYOqPnY^xfG7e=>s zfmiEQ6?m-;P^^`3D(afT6XVmJGG?T4b!B(@s1?pwrv)T^M$Pp%nh!pi&^MjY!khmz`0XW2r%`2?jhq! zhk5a^ZCo8*)24C&tSj;j>I80~r__{ZE{mp(_2Z99YvQx9xI{$kG~_84^oQQ?{36r4fAfQ%zVGuq z^Z4oPGwW<36q%u@mTh}wLNan;h0TOeR=^QhTIO2vs8}q}5ir}NKv^>0-T|t4;0mC9 zbELeG8IJ21D0Ns0q56B!fNKTMz%|MU?i=JL$_nKet3#eT`?-hj`}Gff@&$L^@yxRa zo+$yTHJmmz)m-y7X5!UE)QM?D_39IDzvTzN=jCs?>nXRNKb%0&43=$PQ}L07 zu@rPGk?R8As@%M16q4Q=b#Lp5%b-*cW@;^H-(d{XcLd#(Ll}b`iB*?*srVs?k79;u z@o8x?EhAr&bq)>MjkNVHSVnL5Fvfic!y7DPHjiX{QAAL*sCrq&C_6T=-8o=0w3#pw z;%%nk>kWWM>A^1I0m23-(6fkpcrq}fP`CD&61u??Ibj$d@&9)SpFPOgd1hcFJMJ76 z$Nh(lzi~@WaHL@wQ5wJOfB)v`22T@g;~gAs*dEmQI@eqm&yJ?p?);eL0^14S015VH ztn7G5mKQb$)s)L!&xLETQPn=IZTvB$k`$p$&?{#SzxP|8yFR}0Uq0~Bzq{wEln1B7 zi|bm03ls&42kc#Y6rDlW^%dfqz6~s7$P(P5kdX#9#_orTa2V~l3fhyAwU~KoJ72zQ zH8)>iyjZYWp&Cw|!p&2k`25{}|J8?{eD<~jF!nG{-Iv*(o1mF^M=}DFS$F~oGpe)9 z$QbbrgK4D{($F!^|mi;A;soD}EBqTeEQq>cHC?c#PMzE5C)fs5P?EA+m=5@V!?KzLT`1Uuv z`1@b`?5Cf`p;49aomz6AMo}mci}ri%pjS z&T)~Sa6Fc)J2aZ*vwJBJ7$xow)-oK)Up6gL>143u>dv=qfW1#z>#m_S&L#2RaD7>~ z^H|2!xcLqWj2ps-w0-rT4EBk~W1xnGZnX3LQXr?4&%EvMN5AW3XK%grKfLFUKL6z} zug)7*r)QCw47Zc`UUd{zQ8Pq@M+7uY5dIMKp}`bdcyRtJ_pkr%b6IJwTc= zPO`0RZhM7{D#*}P*1wlK)y0Yzin;`AENx3X#Oa3Bh^sXRR7-~iM%hy%gxOOJ+RIzm zMk2koOPKa}D61j`G7|(_6=p-iF!nJlw;>VSY1(Hk^ud7=M_Cm?i*z}pQP?yRX(QZt zhXNF-GU~t!kK7)nH%jXr^612?7f*mbpwy)rLps$M!`a~AnJ=(ZV9@NeoPP)njX6K-stA@T@ z#IBqz-}%yK7CHRsUwGf$58e&jio6b&7cLD(^X{?*<=oYW@BPw0KCqrC2R>O8 zElOnQ!g;T#6jkvBI{_`NQ?z(;o+|?iP*p_5Y&PJy>a`;?tSCiPDHUQuqqpDQtlr2~ z!Fj1E`}MqG5u*+clfmAUD8iK0%`@l|*_gO*_&%bKaIYN@JHEsHC9iCa=WFAXcFf3q9jh(P^yVBWG-D`ezO4wmVdh1ml9lt`-1!+ zfU1gU#P>&eHZ1NI*WE}U+@mD3pPWz-tJN7A3zz_i1wb{bI?7`&kC)~itjLcNL z_K2zcx&Leb{~fjy9`C%6$y1@LuB1NYti0uAPvgyR|E2eR@Z(>+r>s_Gb;bx-1!vU> zDzw?Gii&!iC-&H2+x7%f7@O0Tp;Nyfje!a>8Fa`XYyapl6Wsiz+iKesC{fU5d8fBk z@^5+-oDF>3fT_TU)tU8G-h2Pmn``hue5V*mNh^SRHU*Kn>Fa(H-vf*!q=>4jP%JXk z!w~ZAtm};HH*T&;%8FEAR#tOkv+G6@T}3S68+&NAS?tOxh>6@-;=i6x_^EdV-#6xMoVZ1Um`b@q*&e}rb2ONec0MP z-z5jNp`#|*Y<)PhL$x^!HZCGkF*jtR3=&tugH*aalMSSF^=*6T|Ej!|`(@idldZ>O z?a|u*Bk|-lPdir8G7qQeqT5V zRJGYCVJ@^}Yyf065An%d?f7_Ym88-X+7k5#i#QTY8kvp>tn5F>biK&(83@`Nes`uR zOIxAw{dR+HGgXq&)=Xq5y~_L+`u0U4q9J08kc!m=GuWEPH}K%S&$#2(@BiLcy#B7I zUOB@9^`M(2G@5KpBEE&iCWl*xB()-nEd(*miz<`clWgxo9^SEgJ&vTq;S2*;fY$;H zQ`4p|`eF+psH10TOWbvsCH2ns&4^+S*3aC@DZ~nzNcL40S*n7X@H7{Qk1^Q-$MM>dBsLiPFy5Z2zA?9wd{kftLW&yY z#Vwm>V0?KcFT{v`L4IW?rBdvWv49m^dPH+csoclCj+)I9BEmG!-yK2Fo)2qB2m*% zYnkpLGSu7c6MfAhT$ZU}Kz|S!BA!7k6Kfm6#V--6qo`?i;UH$(E&6n=sS(eqgd0MSWsGumSp?aZe zq=qrtBm!^?$F(|%#Ajp=B4i05yH=EuYlp`MRzsk5;2yUD*&wh1Aq#}JJ*#(JRSx7M zG#uTmvu8vI%}lko$RN`ikxqeA+RRF@ni-&jqD_KEQxj1GObRf;N*2tSNTIg<>Dd`^ zw@GC{3PZ*;{#ZTc<|n*Ub_4v?|Aul-u1M{9qJ)19Fy^K4xed4uAOTIzD+Q+yVK>{$T;MVWz{2+ zsw8gPu?Cw;wf~?Xl9(9sFEBQ0Pzct;n1ycidv^#3*;sjpBgj8W7-F!bji2u()R-o^ zVa06#oFMsP+Pa~!3E$&{y_bzIc{DEzgTzB78hoFv*u~!UK^au_hRMucL5YnOy+=<= z^oXIg*J`N7DP~f|bj=qOk-nkYp5@(PV8|^jW!vJa^cxl)f_Bx?^@QQ%I8YsQ({@jr zyWC=C%xBsG?7pm-eS>O%JsQ|Mu3~FYTOa1O>1hj$1wOa3EjC_){Z|)*8q*PWf<2_7 z?4HUzVr6msyTP+07iZrbbg~41D@1`>v~sz0SYGqOryj50_<#KB@BYn~zG8aEQ8_nb zA^^8rK!|yXafE@Scg}N$Mj$pN_9}jk6}4>^WLWGjd@Wr>EiHCK&NU=x|2>q*G59?! zPcAV5z`W>Q5t;#JT;A>}O zIx=1x_}wm+wPQqEH#oc$sf5LL01S<xew8{X2DdQ-OV#z z9kZyLa?{$TG<1b(Ie1Js=(#5!meaJGH$R4q3|k6-?PDJ#kI_^5bsSA%eSKi_#ORkF z`>vjhv47@qGGHg<1YuzPj|vzErD~M@VOmMk_(Z^}kVE2ehkVOjPrgvz@N@6|!$1Ah zSIU_?4o=;ARHe7{Lxowi@em;kAd)$EgT_6^^BT(^W!MtVuGahF@wKnHQ@3v*Y+H$I zmTBH)k%Qgu6|m|h z7~PXLu-GnwQ;*;p6wv|-t;B?aECvt|oS{1b0}&3C{2saMX( zA*#S~yFw9^vCE7A!U;(GAz)=7)}H^VQHCD>weYaR zJ`d`?J2O)Ah~$^a$7Y@+%}P}08ZranHP4HWK1!ADU{FW><>sVIv*bL<)z%~cfWK5&FviI4zIh?rZVAtm) zXKI8>x1ODM_v(9;L19om%jTeVJl^m*_;1^%_X4KFogC;V<~^7*ht|FVWX;dQbs>@Z zI6*H>@*OXF`Y9$0K%&d-v)`(5z3-qA!|gD}6dt$bislnFv;6+|~WRV25ERIDggg~!wN zoA&Vi-|&p5{P_30;w>+G%H>m7wSq|zMBC-Six)d)bhTY+icr&rTEU8Rs4`0y;?}AT z4Q1MTz?OE*Vc;!!aS#z3LPMlsy1|m5W%_F8_!7#Qcqxbvs^urk;uXPLhnPlCw`Gz} zex(g~1aS9}uGAg;kwXm6fC?JfR=D)R_Ad;dZrNz`N$j@;jNP@u0ej3JEk$dT89Fpn zl(ywumdiAr<2DO=Bwc}U}iVF`OQd`{zAg{hVy5ek zp57kLk(M;sw?UQQcmvEm;?oA+pa^I9fmNPXW)6zGxJ^#@+^ zj3@u(_ka6qUwGxVLa%mY7Ph#SA?_gcz|WFLI4VMyaq3&}teAt4)k3kshz{$q_`$W_>&15`sivpLAkEtT<6Z@&F1D4LEeUk5_XR&8cBh73}AQ@J> zvu7JFZE)nBB(z87ZG=en;d9^7A3tHH9t|*OhYJeXM2m|}3S?6P=MA}>!`&_vKou8G z+3R2W)C(8St?dIJ|IC+fOv>rP+9oT)QecAW4k{IamO@smmCmnap;+dJ(DKEGm9(Vx zn3PD0N!*X?qT!@_M024HWr@DZk{_k|OGJ`6LDB>$q*;a1`>e2(;s_yGBSC?LS>_N; zkl7b?q_gy-|M1Laj^DU~XIQ1y@DWStlQ)bgcqZl{Y%nVRI%MjzK3%QsJjj4Qy zK!warQ(MCAM$knDUL(HHGHf=|Y5Ruml1tk|YpU^hH5lCRI)STPt`cd+;Fm~gBLdJH z)3nN*-l|5&uPjH((WJ}3Ucit;j3}Q59=6qvCA(kX{scPSG6EK(^YgVEM!PV!{8Req zIwQ@n>*D3Qgn1`mjT3C}`VE%7^VxkjWGrVl8EgPH{wc%F`vAih4Q~V12;gLV?tB)H zHd%{?33~wBK@yowM)uB3t&p}qJ8mcIJgUuEJl+8xuhtv)zxGAX{-56Qs=MyI<-%kWssMDiYJe%-Lqeq6$N-A>jzJ^4rXIDy zZP5+g#?Z)6jqM*1A&MUR91j_yTJHJ1(-AMTQmv5ZTjZ92<{(NYCdX3BK9molsjzweYTHav3j77ES(kG(>4 z9|dj#c5({LHeh`bKDKAaiQXd=`)qK?6WR0f`1rnYeSLt9!tZ3IWc=2K{n1VMd;z{s%-BApRu!-fuWN&!U9aql0?q`1WgCF?h7jNo?a^a4nI?)uRsE~FH zTazZGZM;KIrx@+E6vHljXEL()r3v5`ZSW)#$szCHX${rrq{W>}!%YkWy$H>q$o_dQ zAE}y_rInDh0x!N2O78O3BRi8wyp2hFmoVqWSk*g0kEF%F;p%6mIH6g@w09_G`wAaW-prFdpO&(o)=`)}3 zlW)E2m3Lk~TfAMl>jfIK>nc_c)H|M|kzJ#E*YtfygROCO7evA+!m4gJx(B~OPIP20 zkR;>c$%KqRW_y629R#c4iLs-4o8g13~lNf$JxS2 z3yUE(KC%xdCnIEh$-Ybb{@fPrJ0IVdp!leOJ?cb1syI3MJLd0s1=sq4PkrHm8|84ivX(-s zD2kF)6M7~j#Hv|u2DS-QYRR(kUF2rVZINz}`uGliN#;v0KGB|P?-_++idHWfP=T5i zXzK3bo0B!J01;JBSusXmry*ra6mBGH*wejCLk#iL0FzLv8&Ap7x6NZbsY}1~F!W~N zMjH6YFq_6FIRY74UbUB}^z}>OmPOP9NFfVgkb+W$Gv{Me=6`!XWSuE?$%B#)!^#e*Cg@#?+me zjYbFPnyKpfS%`wR^v^Galayt+%x_szWyUQzK;{>i7e_HM+`i2qwwclHWsk^65w+ee zFN40Wj5RAS^a`YG3T4x!;7B@*%u=^!Dk1^E(yWX%*a*TkMyb%M!jcJmR1sComMn0nofrwb|HqI;Bk5-*|1MO>5O`0-q!euHy;Gd@R|P{- z0PtSW0?5?OD-jD}6kD|-BW>$TvUh z>Hp)~U;3(NT|6%kGm+*4luX_9Z>7_qGxRZ?Mh4l;t!q2@xRHd4#0HO)q0E3>n6RDy zBCF7bn}ID&qU#xeL_{E}&^FxYO+px?q&qqin*#5rr%_QiYUQ!erzpmo$moEt!X+J>vm1Rv>PdF)LgX~&X^{z-uKFPxVaMQ%<0D+V{!Mp2<=_9n%U|`3%a?>DyypyyC_blq2q>Dv zg)EyLc4U~nESu3#zBr2QC}f~4unmdmH3+N9sslhsRv|H{<)=3Xwe3#aX1-e#D0nn< zVPmq;mkb<}kM``gPp<*CPgsu7>eisP^|P_KO}6M^-^;Q8o<|+j34lG8L2>IIUC!*t z1IJ{AM+K|_v%HX=ttTGH{9F`yRVp=x-NgIWyVwpMJ~#@B`m=@N4@1 zPyAg`J6K)538kI_fl5#i$@?u9;?K88za}O};5*DBVIZakn9RO&NI%&VVRj)UKOs#6 z%P&e+wKKn{iQ&ko5B}UT`9wsu076mH_aQ`Md7w}{XR-yV9IZ+cq6Ja}lS!0M0-2hD zObYPltxZe`JF{&kv^h2o=~8lnrLc*kg`u3xy)8}|x@-u63c0bWYgu2DYY)8m=}-Be z-+9;TzTwj46_f^6)q|iFqr_&WqaxBsIU!*=afP<~x71IfBo&Y8u`#xd*l*{>ZmwZa zz?VLE8FS$z@WagZ7DgtBj2Z(V-c^+${AiqyInT`b67iKbk|_qFAHJXC;1Gx1<`aEb z{qj;)E+1$*pCJR&5J9t0jTA-AEj)K82+Wo5 zSuhJLvS|UwmoFysu_RfH3c>aTY`Qmg-WWG8vNK5O?E|5-X)sV9+p#@aU&pgME}*9} zjrsk%U%ruYvP9`W2e7a2S-*cd7lV(=Qb_b($GeUVlW~Ut9wO^rSx`Gw?n5esJ@B2| zr3n;z7WRr~-*)EvUSZ|t2mb1dH)-X}tuujIU{F=sOqj?tASU(TpzYCq-I?iXo$bV1 zdWsgi4BMS0OVr+Z1Ifye4!AJ_14(c1AVCs2{sJ=si26GSiK#UbOk>AFicu}>J&mcf zDmtUADKm6RjwIo87WBPL;-n310QXLG-X6Pih3n=EG=T-ZY`k_Xm%Jk{_m|9KE zRXFbrm(l2?K1PewIutn~Bs(Zhhm>??V4xfe`QMoW7o4K` zzJe<1AZxd=w4}g|eAlJM5LPey+m>-z3l&F%*@0pCikQ?*U1XT7!NeKWh4zSaFh*g* z*21Z7h_@VuYsyW}Xwf1j18q8mETpK6fQ_gdDG+;b+n(L2sZoHC`vu<9ygNS%Lr5LC4OzT13uI^0GT0ck_E*SM5XZ|Lf0Q zKi27tvK&@Ir2uBLa1}Xs{{AQ#B8Kg8M%JBhO5@%o5g5Zy1iI`Td-UXFbsu5tQq~e! z0N)^q!)|C0Kt+mTlJ0SB?KRiP-WCE4cmyIgd6#{GLTa{nf(TSpqWHSeG=VjwM)8E? z9`G7=Vva%=e2lh4P>N+I=rMQ@IW6s3C-me~irR&@i#o}e|^WR-tfG~U7G$s*538kyX`6ud!D)0-tT*^KF7v34$NdW3JzC?{iMe;_!O!z1Es*&T+rZG4}y^voUvADR|k$oYBOnk}%x~_KMbp zh4S$xzs{Ek`H^vg#s)l8acO7Kf|ce3I2COpmwrNmZ@gok;A5@%R#w{+P`P4E|F4b| z5r%Kv@F0apNJ{UAG~=YaE2*;(?Mj zT;7_BVF9CDl|taDP`p0Wzj&Jh8>p{l2&6nd6eqH}Y~6%RL9vZkytaJ&EH2u&9upU6 zm2m!R4OeF-;E_f7|NAZDv@ME3_>B0W@A^jLpWg27{?4!b`a5>9{bL-@O&VipA1PW0 zz>E>(fbT|gaqxC*_L8)&r&^rDn}P`jaNE2i+!SH+E4FBK79Ce6wH_X-_(}U?W1xth+(6~sEdpAj*IlBdpwd6AUw zy>msP?dll%Cg>-_L{|jP4=FW70vxCVBy*%GP^yGDhe@d>K;0t2ERj${ht6g}u0NyD z?|)4SoRGVMCxb(f5jHm5r#;j_yXqw-qptM}=#LQP1Dpq$Pp#^f>yy{N_P2d{V>R+h ztNO$|?^v1iRK|-_-mfte>m6eA%OmZ3KcwasI+mfMdaBB(n80aDkP4TDj6B~>&39{J z?cxGw+)|J?L=AmWK!k#1(K~Q`?UfBb^6j5Ae&#FhzVl1J_B-$0KfinV+1m%qb2tTG z?`23#sp5Vcm2}c|bG}v8Sj^n_il12kJq?E{dTRQjc#Und98(>Ja!=AF;v|VSgOEW3 zVTzKj)BU~8DP9=E4`Od(6Ck+BW+Jd;5{$m9#0%k)_R?{M3K)mwxakzWWp3up1MN5hRQN zBik;nn^)1?6FoAJ+v3j8@UdWP#E6duvpHvHxEVodc=|MjSNmC!TDd; zH8G8;cy24m4**YpAPaoZ%&F^Y0$`HS+1dz*A=!3569OcQT!BVi%M!AtfI0Aaqt2XH zxBBypiy0#7paW2yL8{^=)no~i^QF{k2RR`ol@zWGa1N7R?=vQJ1aV&l)RF~AAb=pb zX)!O36m%yA)(sJ?sH`PFMh&(6$3%@a1%i|g>A?{M?+(7U>xaMV8@~QCf9`Jk#n1lA zZ`y{tyEh(e%Nlq!?6^E}NmY5`eiaHb*AV8WiNy3=-=3wS%sb%b!d#DqjyK7OU1n{m$D zi^<4IE~XCS4RfxtcPdF9`&Q|i(}2aa^gTMaVb@V}4Y8Z*YBpO*^_MRQ+krdb2q7*@ zYkK57awLrjcN*l++;pnaCIy;h#C5)&vWoUcG?7wd}fpSV5{ z1)j7{LWR`QWZ;zg8uLfTwF)v<1RTq?bia5@2!`m%cg|&dyiur(RZ2YO1mCO_tEgIk z3?oeb;Gci~{v&tXUwJr2;~@bKCg+P1FG@=#4U~A?nZ}c5 zr}dt~*Qcuy;iQ>1hiDCPc*G1<-A{=JyuUW?gptMbsi-nq(nsND_k=N(_Pm;ii>T@=aDCYoATJ0;aS&de*{I{EYeDe7Tu$- znE&)}jN5Xh844f>k*$%D)06x8PPoxqZ}~#iX`VhhyTyMHP!=1hUQ@+$T%1tNHFXM< zNfu`?#4y~5Y;&`C9%!Pc*rubV*38v%>Z@(bE)SnK^U^`S3a{al}T zw93L?&VSJ^C*96RB=z<9*Sa}PjKvdm$Av9!km2#KMI2zN4Vp{hq# z^$3r!OgQC2-Fx)1JU^}|^%Y#&aj+6JxsS=mA_(qqTmA~{>7=`L#2u77DUV#8;AVMx ziRrT;R*zTV`HZ;Th6d*C8QGg&OA{_`McRQEc6slu@BQ{~{7?VAAOFmEzWK@!h2hg=j1Y8Re41LHiEo2=e%Ju2qhGct=)o7%}5X$RRUadHiaCz#=Ss#k-=(i<7n8)N49 zydIK^X;v0x6Ii%5^iRU>_Iw_RdZn6Ee%$?qXgO_^5rS27IAxf$3-hXXW!AExVdMm& zQ}Ox}m`zHvvT8xy>^Im3oNnu*Pkn&vCIvqF$yBQ< zy`JqguCc;q#J@ZvqUjR%n@@p|eyPo;PEjczg*V<>wZ>X)aW?#N&SyH0?P4i_nfB)6 z(%|X4*MEG1yC40_N)XXJ;WW^|c=ZlH{)6B0b^CLF?Qj0V?|%JD+Mn5Yc;e z`H;u?;eo;MJ!Dfx&#_Ney$Hzb;;tTv5B3p8%zAmqm60o8tD(~m3Z3f1w34R*86FxwvYe&KlOt@`st5-WPbq-VjII%e`AdN`uoYdT=jG&aOJ|+%Fh~NT|CW?W0FP0 zlUs9Gm(;@iZv0%EMz8HVrEJi`xo7F2gn*BdvVeqb5C@5I00*%LQTHXU@~Ds9P3^cj zW#)?L`3kR>(nL=DXz-Jwj$xM}jX0HYg!Z9d= zHW_sB1cEp#&9c zA5PzXe+sNc#Va2KViU;;WFVR=_uE+%@$pyq6F>5)-~0U^{<**VOP_z|OXKC2Y-|U; zbY&WvfjDID?a4(^JoDUC^F`H@OQK||pO1|mtn#lLuup?To3tI4MG5o-UN4!EpFl*= zJ3Z~t@YePvF4Qe#`d+pJ*oJTS<4~&>1>wa!zEg*DF#3e(g znZJ#;Te97{nVQ;{YQWCM}F!DzUkw;?m!}A!erPX|TN-kwKf-)o?8qzKHYuRWPb?ogl{KFzj$x@~b|lG7lw^ap-QoG& zb~i#{7<4G|g_!a1S>qMcNV^It`g_fYe~77+^Fh`PXaYG(L%KThaEy7GgT~Mp^L@_4 z5PXm&%cz(`V6)?~z&M@~H&LxpD{^be(*V8?1$KBp)*8?n@Y}j>Ts5Ct6ZilWs0gpd zQGX{RWRBD=Rdnyx3Jw_(ydCCyWZLy1K63X;7EdLs47+iC^3kuaet_0nMG&lQmx&J| z&r{2E_}r*fuZN@w+PpT8Qg2RYAk^ME-3)&xL$r*~6W5b>A0>nLhuCWUZ08NlK!8FZ z$0iE==9lo7fAWX^`PaVwyMOOj?BQ)Zdkq@o#oL&;=t>jwMx0}jRdY*Q?N}?_OZY|? zw!JP>g=;2^Ii<@S#1X;GO9CNE!$2WAR+1O^rd}70W+s#GL;%RK=kzi&h~%W0x?H4k zcrb1Ndj~XS;6CA7X?Cx+BA`9XeNQz79>}WT=LF4ywfRTRvPR_b<`LXYSy~afj4DCkvlp@Fc0g~S^Fd3 z!->i2U2+AoG9I=ljs;+}1m4ql4jJK^N4zEd}G~#2mQ7ee*l}Uk? z@|{C%Ti3L6=bLJ#N4uLQSA2aWOb|xcjiP#M*lSzmk~cHYy8Z3EyADg< zM>@lU>tOTGLY99zSVB+K^HY03qsNA_PN~~!ho(X42B7&FY(+sLh$CBYBr6fk@FL{h zAy`X(A93-%_QqU$(%Ab~CK!UgLk%pSVifyJiK@4S001BWNkl0YRu z%a>B4lF^}8!M*;DC;Ci&2I^>`ONbc6u4{a->J#LOmtMSPheh4$kwi;zi}Ti1>yD;n z0CQJImnRK03wy-3O5Zv}FjHSC&4U~r9hUPcskcJ|hiy7O^~pEB>6QJJIOpIPcowFt zL)py)lqIDUQrASp!rUX5u6`Jg-<83n2OSUK^N9_n0QA}bT|lD0S;5VhsouO+jhAVY zgx)GUv~by1#L@xlG(s7O8#FkGA@O0q$9B&nx8n#BSPLEBWPJJ7NW$to+=aO22)8J3R*TMM2r%K0+w$>=+FURT zl#gJ=FdR8;3!fP$g|7=x2Wp!Ps{AOPRi@~bpzQW!7K8*+T^t@ce5qsQJ9D8aApCS} z#SZZtdIoa|K-=OzR0tU#Md@`&o{sE$yZ&SGjKw_*+dy5>|%UPTAQ#DB^5yp@7Iatq1-l}Ll1ui&M{ zwQ#Q$Jfh-79K$O-u`8k*Y+LST>I`lv*ak?)F=!YMp2koxYWLx?I5GIam3Fp|%P~VZ z0?ve5f{G0#omS^71sC6`Z~#V{$^!MMlnKyFFKu@l2L@#1J@X_1KR!54C5>+$ZU6sh zGdWRYyRK=-SA-k%wcd3mzA$?2Fn4_pfEXhr!cdW*h;n1DHP~YhXUHP za^NOjQlDEyDQ`o~l@C=>an~T}{%$fF{7e!Vv8@)*)^tZ10`>LUPT+qz&LQ;r;w@rI z9t8WC)pJMNd$KRS_0@OYJ1+OnAl~2I?H;`L*r?NClxC+j2uV?6tW?({;TQp*wmw-C zSIlm0u3sto8D(`$Mk+DF#G^P`*xY{@WoJ~vFJN%^)}?SwLQ1CS$$s%etaO^bcdz}S$W@_?Bda2Ko8qxS#$zK$L16$|{8BR!CH>OV`CCq07P@pvlGf$u{CpxE?U3Rfh!Z=0uKx?WFPei(*A-a7-PWAsEi{?R*+YsVXR zH5_wsB2vOcY42K{U!kj^uKvQ2pa#mDk{;it=JTmyM7V?!DDv2!|JIk@`CtCgZ~xwx zzxo=4%jIG(4!azpuy6Fzo6Q|V5}*->co78K1-JoXE;G{i5JVl`KbNII6!c*zVLVJj zQH^yB54(`$wvCs^-Sf|V_44)c`tj^taP!D}R#)FjxITf9QjJs9U8l6FmsD!tQaQ&ieQ%NI4USb5XrBQt= zj5Ad(oChF-!DI3Ao_K>4arn_@AmGP;^2k%X;ZX#|zus?A@^itcVY{<=kQj&eslp69 zvSsm+XKwh~E*_ASyrXN_4jTR);Mg`|>;x{C7w;0so3Fq2(N|yo^f!ItTi|n$vLF1&;7hZ&h9h87)Zfe4^TIkSSTZzC#3U z)Jqme>Zio9{0Jpf9I5tmK_s?qq#g`XKT204T|Fms0vVN^X6CJ{(c3hV^~J^BS=G~XcJ?4V`os&DoOBmBUDhpP!-*^4gpZeY(`Sv&8;DsC; z#>jYdTGM(QsUJjKAanz}t=3*tD(+c{v)t9xbN&a`FT!Ao4N2xa1ps=s=V_~;QF4!# znbutLyX^|?5FlOGm#ox+nM^2!2%3U#D(1+PO^?~8;0m`gdT5&DCcO91BzFjjreqoGV8lZbl&D)S# ziI6f)Uvz8D4k#i?GMb6oflQ;T1i>mxCWS>s;=tH=|EfLQzy0v=_KSD%Kycr%1H-Us z0OQ?h8F=B(OnPPNYFw|sWt3T(gYzy&hItVlaEXgJR`YO7x!*u{$?-QsmHo7OhMFjp=X z@jj1ZTR3KGmw4!eXxETI{sCXlm}qTdK< zqO38ELO>PTcv$vU7Z^}LTOjg&pT0U3QaAh~mKi-4zA9tH?gz=s!Xn8_@r<(S`i8=ABsqBTS>QWt(*{Zxv@wJ z+rB+}^&{iuk8ZDh9M50ng9e8gxo;dV%*}=Hkc2cbB9Q43p@_yup}8MSHpr=5y^bVk zG!2e8WQ-baPYJT@#BvAhqIpwCmogNG^0;n3gp)N3s2Ul2997e94!Q*Z(?Ixw;j{T# zGW}>QzuK z47D?XgWPy<8nOsBypR?)K2cAoj`qba7Bf&Eyim#%vI7R&BYednj>v7~(SFCQ08u-i z9V`n_X}xW#$+$>mGlje=3n5&*7C`h;BRM5odV!lKwU05VF@X2*@Bjis+y-coey()P z0*aG8(SJ>tsHiP8O6lbS*a;KKBJQ&I=_bYNX!AG`N&Wq4L3euPd@;;qW~^el$*MI> z0U?-OE_isb;}FUHnRE#6K^w;AA>0I9#4c@~X6x$!xxlqstG_JVyyB_B%~HE7Gw_ zNdr`^ad^Jbj&_3?^ni`H2xb_at3ndf><^#yyO8xmn}2 zST-nPBQ~#ZKB&!uKNg#@BCVrn9LlR0OZ?Rd>1D;OgdyHJcx%0!!FeD00rIWtDuHASQFE8 zS6D5!rAz5aC?N`>Xi*{O0cKZ`CLGcrBCJ9gLJGxMvVaIXE{Bfy#@MLKAVJt+5(YMH z;TmQHOc@v-dAdd88La@}>DPo@_%urM0J*^_i7dmYl11Z-D93%QU?Ed1T!`YsT%7_t zPTK=%Ra$g#8v~RbV?e}VCOkkHV>|?H@G!doKTNK?9RQJk^=dlTf)>FBDNjNu-_NCt zr7Da)F|O$t;oyt=VX$Z;uCg#AL=|)sP67pa`2gbUu~631GoefH01mH6C@fT!Zq~*4 z+@s#@$dci@BQJ=|NXH)|H<$B zwr_oXYzB(M#n58Gq(Huw|NZyAK%f4N`iT!jKZ&h0&orE+nED~f9fKn`8iJ8$^_1DD z`DCW5w){JIy_`^Wcy-%Diup{H`p?V2LZQn#rrp^&Xa!arV4M30JOFPIn1&9s;UR-o zwIO&2lVeAR<2oFO@KYLx`>W;iSh)9^kjw?Wb*}NM+1fbCL`28FNNju4f;jWB^)* zsoxa|j3b(}%%h5HB1eYrxsnLmzi1;%^JfdB0)N47r?=d z8;4z9=+NLs&h4?x7?fb`s7av?EwTh)CWJiGN} zH=aQghgZ0Uk;H_s?>O>Mu%aYgsj4fMpOR2%h#)l06end>`HZH7W2(%FR+k{LzhXli zCEfC|@jcgt7vM;87&9$1Ok3)XZIhoxtOIrkrn{HyT1yf|L%k z!_k%-^$1`@KF@?>XG&O!8-3SL>EEzVN8nAz+%xa>Q786ha_Ny%tz1Y!kVUJYMYOlh zE>dwFp&^)ZTQQsLu7CvHU90g@S&Ks=$3_AgwRaFPZ#P8>4XafGjhS~`DM>RhvtCU{ zvI7JS-+31RYz&r)%7vHmi}{qmXjdw-Hru?FXO-21{pK}S#92HA6r;?J%V2B`#-PbK zqKMtVfgSnn;Zn#wKtQZ$t&cZS6BirLPm!EEiNLH8Jgf6a>`0OhaNF-U3>}BTsIie_ zY_T;*294w&WwI|bg)xDG%#zl~ykN@Rjx3ZgYOhZ=98n^lBrOMvV$?I<3QeeV*h%f3 zaCAj}c!C1w;7&FpjGKY6duA?@0NapVPS94hm-Hy9AFN0uEoQA~ke=hq6_1U`p}B|T zR>)XuzRDCX6Mj?@RPdilI1IFn&4b|tGO|(El087L#NJe#le;jRMkO+QOM3*XqdL@Y zZ*h8fvs%my)VRM>bn62M9G5J$6Ap~$ZydP)XTSf2zxv;O*0#$}|L~{3>9svG28}b~ zg@SIAhkZqk&G4CgXN678zC2tuimphgUuj&F0QXNMUNczYNEx{|YRCm`%Wx$nuc;5qTUJE3zwa*Obe=Eg8*K?o{o2X6M9(64Huu=R)a5uv!qh zZ8viL@{N?El@0rYb<%O_=9p)yK-H{sA$)=&`-&ca1X#e5w+6J)jj1#YLJsyBmPt{R zBwucci!6%4;tjKbdRl_G`hl@VggK-{%NUzUX5e6^e>Py4ji8kXYJ?*Z?mmzCiR>)K ztghEI+-6KGXvp7~q?rbe&|D`1L!?0>4%;M!%Be)NN7(WkExmJvDJN>Cq^v0V2m>qt ztSL4DNS&WOK^!tVFmnt2`KM)|Imndo{e_fnyuSGu1vUwxfS#nvNtnGj%rJ(`b)wf< zBT2Vg#=8FZ0Qfo7>Go`>|KWtX3m#+`vt(3a6qd9SC`Vf&} zt)Sd#r_`3}aOC`bCaw<49523)Cz&?Kq`=rv=o1*yR>Q^K40&6b3NI;w^agOlcn^36 zQTt2w?4!T>+n@j0U-+em{r+eE?4S7LbKcoOY~H)iJY9r~bjeDeJq2l+{!1itp`1mV z#oe1irijXui-YUEFfhFLK&CFtcl%hH1>6J@d*s|ht@-DbJZ_P3ig6vVQ6(&Bgjdb0 zc@o}ir7h1emSKts*iVcQS)j=BdkkT|c!|*fxF1Ka%%g_z1_aPX-vY&|3n>~cg1*8*9U(z9_P$0^60ndAU!tmelVxQPkl^j0lti2j z*>K3sF}aE~^}4DK`YAhV*a@u1qe;lSr-bDPxfHnM9$epRE~X&sy!yoWO`u09hri{u zCz{1MrPi-`2d*xL+Xsxwf;?U^y|n%<1H3^(4%$RqpZ}~%Eg+Be(+tm}@iy!KYGLyJ z@gxkxGnZYQ9f`-R(w#u#nsT_JKwm5?xi9JB^Etsi{kn3|nD9jTvJqaL5vNCSmiHRV zpRem6%Jp@F0uuql4wuo5=`k^bo6EL$VRvUJ`@^G$6y+^1CU4yzxh{ zh#>I(Wqb9LzxsQh|F8c0U)=7V{p6qgW1o8C?#_i#n41?uW(T6?(DWhCTfl=qNl52zt83AOsbvsjEW38(a z&si|ja4H%FlKq9!j(N+K66sb3vsx=!@BqXZ+9fa2RqT84p=Bh5!{b-P4p7`w(U0o5 zO@fv+T`Lo&&6q%_{B6@=#X!jx9@6DW3QR#QpI+fjv-F^aG{UV^P?`%eN%^x2d38)DDXN{Bl z9Lvm=;jC*WA)>WNgrNu^_R-IZxG95j9t`-q#IMMET{eF$Lq3$Ka?FvLp9Vd)Z@`JH zLgg)oL6_e`wgihyLpX?#DYxzRHuhd3LH^7G1ltpx`}*kL5@U$N&O`;9Mt<-hzJ|MOd4`OJU#7ry^vFK^FO z6@CMu02%ZUJt!RkqOzc4a&%jwi$It-g;7GUKli9EtRl(QEHnth2l4_DZ$%ogUqC<+W5&0JP2yFw8oaas#XJ4x{Jgd<33ZdD*R=zwfD z3tW`$ja}`uF?1Z3u%*XPHKjubf;E~bxF>Yx`uZQ$ZnG8z2b8Q0f*>+g?o$ENk*w7c zD{gKJLqlS08I3$n0$Hy1h?F~(s6|p+L*bOd>!N0Tf%;NzUCmN~dr3p`aB^lPC-)Yk z=1NcMbtxKW?4P548FjbkCg^Q>5N)SJQ0i>O_(x$xoAGu^bt~4 zTtK9_8~@@aF{u5w<@Ba*o{M@P3hYZeQ=pT90pY`SQ z{6@-?$(Dyow)rP65FyE@4?-kUVpm~&>xa?f8EYD}!5A@Q^nPyfu0J3SiKVC2f6Bu;*{#;kyZhpMKeK#Et! zgi+337ya%%S(eF+iAKcKa$*r($mW`(eZ8i`gx9L;=A%_LwusABgR+kp6%7zj`=66b zIz=~`o$FNk$HF}S?3#qyw>~5V&NY}0^K&*5&S)^sWdcgoiy#kIc*zE{!XVzfAy0!4 zeHSw_oihb-fg(vZgxU#HB`mc_qLsR0UdWVfI;jay;cQ9G)M<3;x)!@<;Q6h#$)Uq= z=0i(TTzndtu*V_t{uR9T@y~zti+)TxjQ{{307*naRDb<{_{F!s`nCVyFMj6ZuRnju zci&4pBeQpLwbFv>UX7G%R}-NfSn33Z2+Q?{N}QfvcG^xT<^LD9!maaMXFL`VSHWSD zTo*Fe5|51`n4Ve~&r^Q8s0quXt%=IlE#1zjfmj|C(I*rdJ>tiarB4NCGQ##THc1>B zGwbPHen#5n5dkB?1I%q+(LGkiEq$}o6-oD5R9D!TGK z4bV?tG;-vA@X!TF@7JrUZ~>p?;0s#^MLZ>FK1d|}aZyEW+a_G7gF?oKNp6}x?tFJG zwIZkW*K|p!G3%CK4s{YzS#~rnsrGCQeBo2MDffy$h6 zVjs1xV8zsYgA)$kgtf=woS+sr?A9DoYPU5^IU5#R^;JT!k9&I@;)r^vG_2T%N1=ud z7&kP>t?Mz^y$=NncuQU z?%sTd!yxWok(ur|ULU{lg+Kh+U--Y?ezyO+fBxV6&ez9t-0d#$d;!_-BN@tbE?}M| z79V<)W|*_*_1~XZa)GCyMhxO&+@OOzpfP3w$RWB0{8weV$_j<)6Dhg?r=QkKz-^h$u>_6gnYX^o zGEyipHYY`&mVq*&RFE$>!A*bSMn3uf^VK8^F~-Ji3t^zbeU_7*Dg10VWON%-Tt~lNb9=Br+3FjS6P>H}Ne+lKPzFIf)LPiID|Jj3Wzgf>d}O-wT0@r~ z;z~!@B$;?Z=+w}$kY-{9LaTD2usjVQT~$cNRHMP+#9t`E1yv#5OMom!RfF@1T-O>J zR#j?^Gs5OmjuWLvS;$k15}q;|d`eYj!?r)Hr2NTXP|9}#V~|63Km+EbJ@}i;^Fo|7*d7|E7b|g z8XFKfiXqt{GxJ_iKsKi@Qug{$oDI7XiQedL2L#QZNMzR0xT`}DdrTh@I&)DsSx70M3v(r0 z1|U+*ZQ*%qv~=lq6}&BIH?~)nJy@Zzs$6gH=a9nw6a!WxrHI{}=AZcH@D2&Bi1$=0 z!S+MABMh*GaT}FHSfy3}FOWQD$yNT z&Q0s0Lh|I?e4cJ+vxq!Q%vowg@ov|_<8WJZgB`d$U~CwhZG-nO!SsbMfBwJuTc3SR zeDf#2XFS96jnE*uL7+Pn0{}sBV?Yu!E1~LgpkROBLsJ$m_?tO5OK5( zkBwLLVkrJ*lmw`sR(?g^#SXq5(9*cr=3Vvt%itXMJbuJ)kX6SZ%Ar(b!3Ia{xs=Eu z%ZQ{Xu+*LdW*}3YUfU`VH1ARd!oqmWmHSJ~tpSx^R3v4wac;p;TS!|;d~JbFE}jKA z#KOkNzMuh}2rTL9t*Yw_6N7U&xy5m$989-xk@b%Wqndv=fAHkP^hY(o*wS@hnSbnII!$kbT)}U^%AR@SBpq7M>c96P5 zFBP+tv3hjZL``>ww#({-={?Sclwb`Acv>RtqR12XUcMtWkm3QicgvQYVD8RGo8i{(+0Xpw^EMnFXFqS}(6*P9-hR~}^eIo__ty!gXn zGh>jqpR|~%d}J_z17@xTU07EbZX^!8r=Jje7-t&1f>f9*XGv;k-2>F@>xq!Q+ycN7 z-^<8-KBB4baxQ`~gPiG3*aWnY!Q|4-SJuW9e+d4Z9Gi%{A;{LhM6lbY_;$y;jPY49 zWlOD1Wpw9EIx#c7u2gknuwNvmaoM_Rb}TidT=VL62Y7b?4%1C z6HQE>d8i=c!+c}Y!*w*zQK&H$Jeiz9?Vz3rY`8%^?THco@IdA+-L{JJ z;-Z-0v>$0*TM9M@$fZ+RBKMkvPS;He?1YgbpOS{KfqBNrn)PgBRzTGi{?5IYT+&TeZd?3ur*t9;&}5!s?`OIQ0?O!Bdt?Lbu(x&x#PP^o%pwq$)wJt_bZ z8h2(f(GgV8>zXf@j_j{l#to;-DsR>>C{T7R8(zbrlkQ&LUf+NJYoGsHf9F?TUiLbB_%wwAX$jwcxZQCes zpU>S6`VF%~dMH75XbjwqvBLyAICzMrUAkwSV+4#NwcP_YwU`j0Ez1HcJ~|Q< zr9C@$504g7mccX&R$73MbZ%0P#NmkLED|{6J-ZRrXTUM(c%qn$HXKYK^!BY~M_XfK ze|Mk!4gfFm83KFj0R%)Ov(je{UPFjfZ{OMqFa5;YvTR(M2PAWg6upat)7m8rf=Fp> zoDGJ2&`UC=66P23!r=mcr-9rY8nLr<8xFmeGpOPSWCxAw%K*XK*WtrbpoQ0keYeZ7 zgHBZQtud3P)AxPIcN2PnwfgkPPjBfF8u*ZwnFBKtY@lV9X~&s(Wqw z#rqHI*nkTLzzdE`f;tzqy$b-kKki=UD|f&4Tc7*u|Kl%z^S6HUkAC+j?zUraBM!od z3yI-XAM%FLAc_UTN^6KNk_f4#MkEZy>FDl)h`{KF15InDI!qJXF5m+hJBtq^uwj%? zCE}PcwpdGN{FH%w(Xs}6rllf5LkJv_3CAD}R;%&T&iq`V)Mi82pp9T07;6Kd$S7nW z;xEAE5^EnLU}3sQhnJ5G01_+?7W9hG<^jmH_+dDJi|k#Nep;-D(HOE{oxWpknJ$Hb z8@ayghK*n5=iB-*D$Q%GR{{r|Lm@-|kPS0>yBc~+c&30?TCzxMVlrWVgZUL+uS`uw zJa!Sc-gL2<99uTs5CerqYw$5I5DT$~hmC7SE)G=FJr=f)6VGBX`!7c(7)9fw^m$8j8&%W+)H z4(wz!I?Pir2p6{;L8Yz@{U5u`(-mUk$mFX3YVGf3OHP=UoxB(tV($MfVAukwli)6K z4@AU+zP}RL`8MuV1yFHM(68dm%&FVv=p$SBvIWHYdJ_?k_Hbb+%P_ULyz2yxl%5f{ zOZ^HrVX9laXD_@$$xB$7_T5+npU2y1li5laEruR~5Tk*3@_mE}Ds;wGM3yYbMJ37Q zGpE>GMY-!02YmS%eZcZ35YL?NPO~Yjyh4Bc69$B&EUB8sQ2;6&H_HT^PD*6tMw&*i zCALt2$`b0(f8kPx=T#`POk8m)hE{sfXu-l8nAuRwXC@Y&pg<*R`UCNaDixeSKsEC` zSwcA^O9-^T0Da@|Bve1FAYd_~6g zNS;kHP@1hge=9Uk6@&D8eX2d=Srbld!uh2=lQ@bE0BT~J)9Gg|KP>G0&aBFdq+v-3 z5PkwU>nn_>PH?NaAmcl8Y0Qr%1Sm#%NV8KHyUo$d5X@5b(*U-pGEgNT#{6_FBzpH# z!q~TG&+P8yfBDw&)ps89w8nvHZ5Q-&h(d+WX!6vFR4PBhiMzOU+NM&!l$7vNvKFgh zHi|)R&)`Y)p)r1whm)xp@$f#eLQJ#RlFRx7O}WT3_YQmc)aJyzS1Ldpq{$4jZ2d>f zb|(}zlE4m*J&sHE^b9w^*c}+bWWr@&H<-aIIa9)Fr5<6mO#A##`=d*M)>8Y60ZO9G zfkfVXmks&|*~gq!eT6Xk`FVnd@o>)bHeMsK70J&TGL3X@BH~I$)FdC{x2yH{YY>Bb zYlxSvBU6&5=(mM%(TRSv36uh^XD0DA{aJ7uv!;JtPa3~mM@BPKu;8n-0?(tZYwyT9 zQAihRO)t*7?a5QccK^Mn-znSN(gZ2_Tvjk=y6Z;aKskBy_dK0=b~jSEd-8U7 zW0`x0!|Afb$kSAGwd7pGi2|!GYlNLp5#L8cP>0IglLh3@S|6FxdlDqqlBpV*<9bS!WVP50&f(_p&# zJ&#=~5I7%A_KQP`CzR3hFcV`^BjE>f@f!v@N%0{XKM=%~h2k1dmCE!e5LmAR5}a;E65?t*0nJ zX`XL8=2Bemd+lb&&XXmY~h= zv;OX5AI;=)5Ja>p%AHPxlcF#_(%tNZ_&!fJJbsc_2-q4aqjO@(BgC7y-~lgz0> za*;M0$4nB)UMSroT&^y8SJQHWskEO`;*V)BhGeUQKf*kUOk^vuaPg%WJn+=~qg(S! ziG7RC*lfd_uid^X9(P2<(tyj#u?Z8OWUs9&fGoCT2U}&->U&Z*!J^gy^Dyi4^y-I` z4l9?&OTZTOz>-?=NMBC!>y$Xt#jo0Q&cB~6q>O!ynEnk-*)7)7vRZ_&v~oc){@3!a zH;uCx%QFu`%8DfE%80wo8Fuk$9`wY){A2bBED|~);)BRFUj5(`Do+GJrkST-o5m>X zqa7?|5;gm>CrO!iF@@dik?*uNN;2S-bxg4M>+>MPr41Dbj|n$Jr;Lv?uG_GR7~~}3 zX_)yAU5mU__1ay{pd;DoiYapK83bxJVSHkBfK(9n2L^aRfQ&c*+Q2c4+te62N-0JS8lx}3Qw*l!TI!d_{4 zK982rpfPhHaYhOhGF}05+eANoMM2V|s){5v(w);2y%jYm>Ed5@O%d7YC?}#fXB*K; zhvY7L=bi(IFn73F*2P&Q7pbL0Zbem?SL&QrfC*T1ajAqmat&FJl`=6SIYxMWmNrrx znnoo8eqG`$NtBp+qUQOrEc?5P3*^J@j8OemizynygD72T9yk5V9AT&}5- zEUW1>pPV&+b2wyFYJQ<-2hr~;eqss@R|wZ_hWer|kH%~ReFL26SnnV0$vHtyFr(4f zBvR>!lDFjXYa|CWCZ(NNCrg3OVT*!^R-_a=4Db$=9*)CaaBS|+z@*E?Mc>rK@mg?- zo0%!PE!#RN%U({r?Ae<(?I#5hfE;I`B?1&TZ0?XHjYN;r7UO+7GT%&-8-gltc>C$F zP)bWF>d9kqH;gCwh#aKdKm1<(Dv3geyhIoLde>%Feor ziHYe4bV=$9O5?7`A=eyHy6-*KhJjk>1A= zMMYYko!&}~v6ZoiI8U(ys@o{}mpP@(olNUoEnGXxi(=RPRA#mS)~85;7oSq5h)!2J zRm8gXTvx&K=5-D?6Ed$o1aec%TxN~4K(gfk8h`ZytXm&mB`L0ub(;bew~g39-+ed+ z#!(Z9IBj9qvDzzXk3?}Tj^{75U)nMhrM8-)e0{zOud1MwZPbt$EMY9 zLYE)}CQFU8$+3(AF*RRQus@dly&;Hl%A7}EO+&(gILO@M?2_NRDf$pH3BIkcLgiO& z%F6@3%~_hvtC%D)D?;b4N`E*9chHOoI)QE$Yz|ZUz8Y?f{x-*Gk*CmW+!jWMX)L@z>=#u6ZqOt0A)ZYqUHSMzv6`{7r1=0D}7^V!KfkBUV!Z#Gs8zcqIhl=v; zMtz76bxpCXgo1lMP_kBxvAe9ujP z6ul&b!w4A-1BQ!q$%!5yzylC$R%s^$JTTn^cFbOJLPC^yACuNQs2#USV7Q}&%s?hCi@8oQ9V5uH z;lNf^&M0hPg?u0ZS1!9(b6*Z;A0455kxuMAEtvCg#w_-U^ zu*QH=#JP3}8ptY5jcgg}{c${da!Ckm0gYf)SD?+$EZySktPpo^F4{O(48wxZ^C9T_>?)`H)os4@eE;33tvLHZ!G!XA%ZYl>f+i2Jpi9ZQAz!xCLegQ6o z{HQ`dcU>ZBnKg7lx=H(9ejbroL8W&TRhuR+m-Jj>blogivZrt}P8fnEI4dYYW5%-R z;O(^Q^eEIHJ1UtVYkxdda6}3bfPn|GG~ylkcvdN$DYV&E!P2+P^L*y|4oW)I2-jDc zE{aJVgg{G>Ahx?%5_KD^=+B=Z`|}|& zlOi(U6pxn>Pl*JS#COLttLbuQ7wdD4*@|yjH+aQOrhEx4Ym4}5#6qD;I9 zdu!xy1-ki1Us4Vi5m~j>oLC<7k70-aSviK%ASbpWq}EnKp_YoE0ao?33&{}_7s86< zejF9e8zh+3pRpe^qBk)SqajN}LZ_Xne1*pXqAC>kIcyW3Hxl5bAa5a9Y!ECHFFz6u z=WJw5&kcYP**=66%t@wh?xCdXK>4*unzP9%VWrsXF=9Zt_xsp03&S^sG zw3bZraD5>@y6leQ`refO6AHQL#_P+9=Fbf@%R=W^Tlk{lz{V;MTts7jh+RxQuF0Od zb$$1-UnA*di~|8?_H?QBN*NaTAMlCCBIe1a#AjXI$y58GGk<`fXBIcNr*oBHsEBeFq^`q)* z7-s8GrhnKnQYe$W3PB^Jkd?}_t}WKtPII3((n_K&NUUpy-I*bmPGJd)XkmPKubSv! ztxb+*CJPoA{Lh*6TySyY>*u@6kK*Z1i8f!C*VznZ!#au_w8=@Fy`Hmw7}0U;u(nn7 z_yeo+7mpTyjs?<_(*4=(s)9d1aOwv(myXXzcy&#<0?~Y|RVaIjA9SivsJfm#8UldGcaxq%LV^B|;dNJS7*4aL_-t&S${J($U)jSjbgNJ9#-5jZ{T6`GBH1cKOVJLv*#OeKMAh>@c$84WKD zZ458cxP{7&+1B$+h~2z+1zUClC%Coew(1VbiuLOMY142@t}e&owK&ZI9HJ*UqAH<) z5f6{(^#bilh<*^|sGiO;jKORxQ~o^iq}g0N2h@`~r}eWP5E_1DF&NqJR>fhriLO}- z4dqF4Rjy4cTDji=yO(c)SqfiWSOJM6aI7cUGsGT&GwgdQOx<|XWQ$}_8tR2&M(f7 z7RE8{Fz7-~J0!jvP8#k>k&m30 z-as1iWsTMUQCt)53B~9k!GUoH-lgq)<*1cVLeoqHU@14zULXeBSubO`HJ@~ezWyZ* z1Lq#Un3z*Fl~Y^7J9Q>L`{eymf@Lo6v>gO{7d?otx{Zs z?RIM#ZX=QrZ>2y;K@B4dpbsp*>$UD!Y_UbGAf_amx4F(c@=RldQpIK<-vlvJJF-r@ z%|IrMG)7a-5uFr>m~^I0i{;bG`|uTa*H_Z(Ba;>&T!cgJe(C_`*|X7$JQm(}0635ha97OsvxoS0?3VFmhI(aHc7Cv_XSJc3qy90nJW5#|+6eI`{F zae^Cb{R-v_1Gb3f#7h*ik1*jP?tF|}fiJfQ-4-Qk9rdii-%++f5KUtn!^@_k(ckrO z4K-af{n1>@-bx1X88J+|iPN#jMRf<7ZBgxV(b3V7l(03)d#${!qFD>-ut zmfQS#@5+GnTgqw#?uxFx zeh}?e-Et=tDokgSH~Q?5PZ&=?ScA3_)3w@@YD}|w!XZo5{jaVDrcCs&+B7pgPFO-a z%UWafaHTz1LpCD9jJf)2RaJQN7&A?z+`g<$?6E6M6EC?lmnl5trDAIMUXx^fgq#ef zeYOJh#pGS5^K)k2G5e6&)+1}i1OC^xz)U@~{Sj5%KO zq)#P|H!y`-%PlB9MS(pG-u_sPfJ{tYiLa1BiBr%|PMj?vOT4v62`7(SPbTZ@CaKQ< zU&UjI1?Qdg_A132xa-9rt7a*Sq!;DJSIZ2NTkMJAR6kdOI!LH?nrK;aYVP2>%)l5=(a(^tr9d+nH9?RAtP zG_f;cr-2g*QA1nom}YVNtn+*5hWYgp(`WOy?eLq#xKMK2epaPK^+*UGH`5b9MYqa@ z)uM;Vc6#42Fx|TZI)FI1$P9zQKIX1TBegQb{M91mafQOXI|;~UwUruflq1jhQsy%~ zOf-Sa7RpoFsFua?Lx|lvDEl?(wtWjt?pQDJZ_CMv;L4tiMP1=?DrOX2r8mz5(h!dW zxMU@ZbDM>CS~EOdL51|0WOtj$4Nkk-o#=|Y(I2fbThqnRXN~1%sd|0!Y8O}7I$LBl zZYb*ZwS^ap9dz~hL3rW4S ztjkY$d;GpU+(~O(N9YV#!?(eaTD2Z{f&$gwT?YZY(t#wsBPVA51w2okS@^Z|9PS=tv#hCi^FW!WN>_OWb(K$Ygbcp3#OurRqi{MMa;#g zShyxmKm14he|dYGUR#zVOK2^NeP3p^iWa3tLTU*Hh-QXFHy|-#!UX;S|Bw+gegGqc zm@r~MBef6%5U52%byHoH@9wb0z&_kOBKEmAGb=mv-aY5+9pT|_ZeMP;+V9hK=ujk(sU!z>ppP%x0c)QQj0oN)~(b~J>-tK2vd3GJ=i)TUF)4Z2@JmNLCpKFG^ZTX1q| zvQ&2ozmQ?%#R%L%7B_%NufNy2d$R#4@T}Nr=p)u_7_=ha7A4GcDuubW7J#Vz5k$x} zMoZ2vS_{*_@oJV?z4P%L^7=L4Bx6fxe>)i|{P(EMU7lecxm@RcHv%Qcj8Y3dQ*$6% zZgM(pRvZ}S>;#TwqLM9(PuO{f&AGT&+p23P$V33-Z#NDc-?pTt#Z7iN6>lsw_cRAf z)|T2OWw3BI8bb1TwE+t)@7vIp?rq(w>T`Qn%>xbz#u26NmZy@jHAmUuS7|a;Qq2an z6F`y+gP0w0@alDF%wu4K5L>>mt!9Sw=YewzHjzVCJCtp1X}}9!VLUb%s_=CWp+9~M z;0I!9o>os=vsD&L8CLWQKV3i0N!N^JNCh z<0U#hO+@gQxn8H1b6-#3WLO9wq~&mx2!~$f#m-mvd)7o(t*>^MOZjAH zng_Dm8FE}xETHz$D+>N!cw-K~WVm|NC}n|M)`;x^4`SNQTF-G|IJ3P>pOz21^DzjL zvT)HDOGg0+@>fp|!9m7uvYot_5qFq$rvtI2&&M5=UtjHVpE@+rn0HT4jBDox(_hqK zv02^Ha;V+STX(N~avx6Z;w`;ZhCG=e{Nw1Kl{Pyv&N!QzL3p|7b%LlUxLQYcy~)6Z z0?4)IOKv2@6Ec#uJGC@aF%u=79$VJo2kcdEJ+op9(w$Gwjp#6uz!iu;L;r?r;I*_F%4V4r#b$k;De8&-CGY}Yw3POvs!47*5o@w0y-Gyy2c}QNnqO~I zX;tE6AQ~-on=C6TR zO#b4|$S0Pqlsx0V9;3TD2m2c=# zgy@fRrLtG;n$&Enrccaub`{pCVQ@D#R;FYRp2M1$U@ZMwreX@KHV01R8M6@H^@zY?VrkqSG~C9^ik{Y(XiSTkTDg3Odm-cH)U*ur+;B|B zT$O5H!td@@zD$`3f<X>jSq3Pl=JGi30ZQc&#de;kLQirlX!wIJ`i1#dhs`q*s zmB^EK3sLLnRkh_RZ4+`H_eT*gl}3(vO#3~|Eozb%OK7KC)0}BU>e&RFjE1V##UOHz zx(~8|r*2UOJ~*^IlEY9=WrrV*LXE245zQSV+F5{^d}Exe$tux#Nm?{9Tj|WtFO$`u z{R{`rXJZsR!-l_@8+eFz?2DzaDt7|V8JkSDPGSDh|K@qR)h%Wg<2uW{{fE3=^M?5I zEbom&#os8lq#c8RF`hV|ryuNGz*#9qt$Ww3RNkM}^DCfC75ZY?*I);$xA;EfUQET0 zdUY{OMo>HqUce8Jgc?$)BW!?U^)uz&_E|Z13f!+D?<1U+ghI=2BU`fLB^eynHne4X zMLm$la1=MPQgIBQxOGLD3LV9UQ{H3HNy$1sRzbjpS6DoArm0aRxQJ8bI)p1A+BjT- zfTCuX02llP2s#zZL9v3tIa?WXs7PRXvJE)__R4H=S-rd2tA(N6QZDvrnzQ(@)Il-(VGBgb^@Rz3%~#}VNmyCc*ZvN=6_tw&+-ZKA6sq8QOmR#^vdL`6ZA za{JhT7SvOzcDBg)<*M}U1?ToN9C*W6wfZ#UanKkCeI&O;jnk2`9i6zN?8eI@S=D*3 zw0Z+~wjO0!B(a#S=UwWP#lIigbT@X*5|qBX&_arOg|;#Ai{m*|jHDfEp?ki7-LHz3wRHdWzz zQP8bsCndipE-2iI`nFs#s49K3b_$cZP;S-J#J4fC+eF-eryteYGY4)rTIy|yG+Gxf z2YW#?RKUv7rnbM?!u4jYJ>5MV#16?=OHHZ2Tw~eMAd5@4bwFnq{$A;N3DkfHam~wO zvzmQ6s{TRT&10*MT@0-ulEI6-h%AHS4ZLM9s5}NHe^-8#C5aAr zfoP&mmPQr#% zz-wBwey3dSgz!=sxKa$@1)}u>PA_HKTZp4NN_8!C3Uspm@dx6ABuL4x_#?h=F*XQC77CI>^r+x zDXJ^lF{gfB8@KmLs#83s2$j*WwkhWlR{10UB<+=}UlQ`pIxQfq;4WCKdfhYEmuoWW zVTV+-9QLdVHmUr|zCks@HghY6Tj@=t6S0_gBg3Xu-P2dCS81)A1Vt+RDP9^$&C7Zs z=jLk-mCs)uyFJDGU$M0`I3lu^1~XAnk-7$4Js5V>z|~pZpq?uMzT4g+geq|NFpzlV zMTL#gCC(`AaIcz12BNgs>TpdTv0|sGMu_Qsv(mTWP+C7VJNPgi8o`-sRjL))p9_Lk zqy0&KuJt{u`>oWlS;TaEv-nivR6fQBr;s0yME`OU@tFm4bz8~hZxpC{&?&7TRY6bO+%<0apPcK${L7rBp2j|sGy&bPT@i{xN z-dTP_nG+R^p}rrDuVZ(rXsiOr_(qWqi=R$7G_C}0yl@9I>` z9Bk}#>F~0Ol|7$K`{r1yc7b$v(%nx0MuSvGkx5e_#-_ak z+Gx?zQTBPamg1lEs)To?n??sqwl`~i=|=9`(sd5f-f$qmgt8Vail}{N6yukn>e6(b z7uodJG=Yt8!ic}NDEfdbZNmeQ>MS{-MppJ>j<;;zje42SsX8ocLC{lJBWjAxA!Hbk zwIJ@)k8*3r4~*2^J`JU|UODCH{>T>``1nQug1b2YF$)vFYdSkZgtY}~y-F)6*XxyO z4Y#h1Keq7urPu8-w8`n!OY?g$Ue4Ig)6Iy!ypqc*EzMRU6GjD+N;9{?+E^5QKGQ{z z79Di~ycA`w>F24|xBBTh^0FW~prcTqnVKwt{GE!l`W|YQ z8Htt4rPKXHY*(uMtf`7W=7y4CiEDNn z-*MAx)xN5~gZ@}@j0$mvkk5VAki^}m9h9{7>v~P6oU|l4pYK#FhiV(_8fW8P1QU}! zN7{vG%GyLut%23}B&JX)pHj%nos4^Y(M{dq${E*LrXvy(`QV(&P%SfVrq;jkc#LCp zy{)|xuF}sgs|g8u-%$JWItF83jd4M`wfTr_d_lhsi!*N=_#wd~5KceifSXoHW0fK@ zi|ao7c@$W2q(*$qm};r%qQrVOq;IDBa(-)E#f3#Mjfnj{-_x4EG~l9^Hrt~H@8x-+ z^|Ug60497On$eho)$YJ;ZS;sABUGsVG3I?spmtKN0H13foRn6S$@g}quE6*(2wvkF zCb2ju+|{OJO3?+Q&X&s^Kh?`!`6-Go;-gN9;*lkJi*vaNsH5BJJ98lMJZ~+fFpvr%IhRx)@2n5kTBwajwo7F z1G829P`!DkWtAgEaanR64G+vInJ+H{&Kz*+U|B{E&q+&?R)PcA#vvqXr!i@OvfuGM7tunA$wqD_6rA zTlKR3t&f5%2iyT)+_eBPo-RYb&a}RcZ7Pc)r{6FXmI~X+QYB6NKp0-rFDQ;u8O6wg zWYtX)3&N0ZR>2Nqrd~yXc0>AJL)Pdi&CzB7eFHz3mZ0_tyi^DU_4%M+zxl4Wbe?3e9mVSDd ztq?N9k|4El8aT&v#KLIWT>{VwrGW4~8=8l%0RY}KPbCGCP?5sS`-z6ta4*9a*Ma%$K2fcmtn6`4Z-MEA<4Hd~Hn?sq zBX`JOQKXZ!f&HFl_>r*@VpVl5t|zQZK<=npNz}c~v-0k?xkte*qo+VB)W8^Lfi1=u zj_@o9i>M6k08HYGG~+R{4j$fX?Q@_)pCv~gu@zLIAG3eRcdtpsNK0BRG6?txOvPjV zfok<^j;__mywYMU!<4GFmq14qX0pYzr0Up;CyUGR@8w+>`F3u%KioVPj*s7mc5{Ou zRr$&3L23ISRkG^W>1~aYa?yAaD>zEXbizuwUi#$2-jCF^uweZ;V`sq;L+>cf4^NQL zx6vk7gSph#YA4(0P@T*_*~YS?09tdB`QWyl*!+d5CFguSfFq`*;VL71zn0@QZy91| zTE)9_tvN9=m)oD&Wq)J$^Zo^Xk^>_u<;01AK&J6a4=Xjt4v@OF5yLCJQ_{MkZWYSh zBA`WBU7E6M?Pm2fb$*U=lrxDuC?Gcmh^vr42c3 zW0GsVq0jWm-?s21OCAR^^q{H}Quv)DI)}>A=$*}2ogHuIZqmlzg=_r z?yNI24-?ZRi`1?Vq(qVLF4^e6Q$v>wHZ3QT(LEeak>j!#NaU zQewK6DHUAMfCKP`NLH4DMz$@;npw?-F4~ zbJ#ki9pTSb1&uI}5oO9wv8HlJi;6_*&?PqgqK-yRkHOO7Dq<3hy^LmXKXcVv>S9># zRz0nYmmF2HRj6cj%~!=Ou5kbRzeKxZn}ycwxpEdJV>DN^DlJrrijA*i^ z;te%v0CfIJ|1O- oD`;_ij|sX;~9kgse*9Pf>ZK1bxX1&@mgp(4?fOnPSMPTOEqELX@KF<1ovBuZeZ5$&=&)Jco{@9M z4;K(-VaNy=>FHGqfRhJej}}uCM#*4gw1@N<^^r4?f~tZ{mu@I>Y`jxCaQEHr+}Vaq1F$#%+W`{p@4;j?TIQNrbUMR(sgtUvU8LaN%9>66HBEL}mdd)b`#Jf_q22wV5uX&=mBR-j!B$X&t_U zS{0{0qAKv;^4ZMLkNEhdH1&geYWcC^?{%?^eL!4|0KBlSeJC2JV~1k0Dq#7h`&J$c zqcC?{==YFT1CHDhTN&p1JT%a$u%ndme9?Fue!9EM4!Ebb^kc!^)`$r@%<=A|&Qaa) z^{)_IG-m(+AOJ~3K~x_*C8sntky<7zGsm1O9xpombO5yQ6Wj>#l%ILDG%+>_jmC2c z((#N+v_N9;aEN70MH9I-@;TTb`mQ;GNP?wG5Z1h`+*0OsW>ynG)f=2f@e2-Yeh67E zr)SHuEZh@7`RVUpd430e_45S+7JjEG!ymn?uh=P%DLkeLsK~RRlR8UPl?V`3qe~-l z(3YSKr}`;}j;tk}V{-7s@()@a7Z2ok0epkdds+xjV@HuZPRU&~v%^KRm%H0>0Qmm? z6+Do;7_Iq}-R)!{&j@GC@?@JRDY;dtjx}PR{+g2&Irp&el@smZ1Q!so0#&;O0W!+G zV=gGtU-xoShn7PzVX2zMAnp3BLLxP}i=CQh_OLMXAcOb!^ZXt$zf(GCmIWXQbX6m^ zDri`MnxDgx09MDow@Pz_Pk@ARmd8}}Uy_zbC3*l*I1y5scER9)g_~}WQ3{h{7KO7z zES+#B05g4*z^lB9t0KWF0Hl$*tt?5cVy`X#8YtxxCzg#NcXKy^$bOkodLte_s zP27d0wr#)X`VJf2)a~^gw_TEd^Ut7@iti2pqNq3A0Xr!_035Jye3`zVeug?Y%HgP< z&_gC(88_6Q) zcWf{?KSBu;P;S=nMDBq)juSAN6lu0PrG2P`GHzDA>ciGC?nC`~$#u`KcK;ScRy{4| z$U`Y3w$^@C5MRYo#LD`3Du^^2Bnz09z3NHPru`oJ#^H|q=n_Er`PO+tkVj-l>rA@U zf%Xe^(WNz^v69}7eeXW?+u{RV1{KuGrHL+jw$Ri=)dWT+)_Ae&o-`PauJ2Plr!mR| zNc6m4B+O7)?^fLeKprs%gxsRK^P0bd1M`f=dF-@B-v)y)QeyyPU-F+lY1GctOA7d;Hm#`wH5D3*N=VzYrQXqidVQtJRG@v;y=v%|l?butTQ;*kw01>opAvPEzc z{t_@@&_~0Wm|SpCE(8wfEN7)m=X8u#m!^u}875n`;TL{=MIO?|s`Lb2LPNsqK9c15 zmOO~|5*#qTkoE0CC^43x}J_%8*s>8zPT52XuM&3^C3m%&qT689K zfJZulsja4sX?4-#e0d}3Xz$}Y51em@fa5Syv{Rtb@~o9uN9n2qa_}~i*)5n&9n1Ju zq;-<#!Ik7h)$xzNj`5zA#ZXx?i^AwSqJC=jM7Gw5o6au2k?pj zf;eC-K~)wFRhA=cTh7I?eD=7LRbn_}@nwcP{!hVtOjGsI`Ymx=mDOh)`QVagrGh4f z)$k)JA#BbWv6v^XOlp=_*!1IYsL?GfwJz(}$r@{Up4bd&O43f2=9HM&k>UQNmaykd zG0n*uVM>t%(a!)T96@6E86I&h`!sY`X>*SA6mzCJqozc)lxOInLY>5^T+%QB2qSz| zB=wq(T^o z0NYHoA!YDtM1Z=Ms zH8qRJ9{qYU`kMJ|0Fo1O1y?ksETdCHM`d7kjasDxq0P{yh>gnN{X>}J1;yZk%MaFD8PT&-?1Rng&xu)#fc_QXF* zR;c@~{dijhu%@i!s8+o~EH<){ye~me{T>@MoUfnkjcPU(tk&&y*P6R|byt_>3{lK9 zH$wSm_G>j)FWOA&#`8qt9&rQ2PAxsZNyUFrc}lGcEnLAas8 zTPQoypOPnO?mg@WI~v0o7Xm(*yeog)e#id#QowVgXvIJfk!0Wv1n9pbhAqzz_OhCv zh`!agjS2Jf8^4Tx2ePI;Nsw?!Z~n`_0pIxk9mf%=8yplJevW1gPWU?!#Cy!>s-arugoZ$8LwHjKF=mTs0wee)Ij;0BCpy29`d3NS0SHTEn+;4e97Jww-mbY$n*V{suh+{7f!wscO?0WySi8Ij*iHf)!y~;O5~I; zC3aD>8B0yU8@cN*uE!hH%?1ChqtAJH>lSLrgEZ?C)sNktwIciZYZpSzZa*etx*N~K zS1b~&@?NoHhPAt6mDzo4yaMGv;O0*Q>}Rza34?Kdx8MEMFaGOqe$k7+%8p;;lJq_^^dEUd^;nRS7MqP^Wra8>Gx)))muT((NVgo$TFIt? zwoFpcGvBps0u%RARa=ukdtEuOtQ|7MG~!@Ph@0^JuYc=*`LFYz|IP2@=Wq25&XWe? zH{rK51C2=MCWI}Vr-N0edjk(=1kTLEUlI&DnE0`Dn%Q-hVO*z%oZv|yvhQRBMPcL- z;5?}VQLZ+kI@ z+ulYyW5e{vd?W<9pX=uoNCd=WOv39%rVVI;FL}QE=Ca~Kyk7&Ubpd! zO0(p$bzxToOh^%G#p7em-Gn$luiYOJgZtZm#DNvI4Z*f9Sz_eh|BFBWFaPuZYCu7x{*Rrs%>Xpw@FT$E_=SSB6z%W)iX z`)A+zzx-eS&wu+r{7?VnpZ>r0+kfNaFVInIfy?r{$!LT8A)&z;?TgQ=snS0h#?#Ek zim_+Ib;9-uos5Lv+OX734Gj<0f_SM%c0sJi^9qt;$vOPQW9dWJ867$1I{vzo0=ewz z9SbaQ<`+u{CJ1Qx*!zfZ3@y}@uK_CTLX|fep<58Z8?xM8szWluOcwiyM0Yq6dUd)l zfM!@eGrX9Qu88P{1_T53OQenp6iucxY%Mg%x*4^p1x1JsZXCngxzmW3IsQOLVU>Ds zB>IK)qE7L(bYDhTwV_Lja;3ajy!?qX#)!g}v%Fh;cw$4oJbZ6a5H5EDMR@Hf4@k8c zb3ji+daO_V%)r94N*(63_ZBHUgi~)E?|=92|K0!MAN^bZ=-+((R;of$O6TTS zVG0r!2RRmmq>s+K%-)4gnH1{uYeqX9kTdH`HO9kZ>yiNR{}cZE|Lyf(^ZWV!YrTJq z!*KA$7ioS*qcuw}ufhoNj-V~cNwMYW2N^Pj{V2m?ZD-oN(x&;G-I@Spxeih)3gAR`pW$IcM~P!`!O;BeHbMXMpk zJ^9iTjEOe^=Bpb{ z&fd#PRcTybl}|?5cF7g1Br@v_NCFQpFoKxCp6t4cF5np8B=Mwm8^2zJv0RDuRsG(Z z0fxy;?%1;e>23qDU8Z1aSAfCnfG(f(Uw6*nRn27 z%=(0MVOeV%KHAb0Kzl{R(s+e#C91sTn340;o3ium=kJ8S$*r zvlCH(tmea0v4u-RgNorO0H^SG{QQmU{M~nZBkH$`s+_{&1Z75Ysft1FX?}v6i$ik7 zW6SJ_%Oj};W!vdg%K5Lk2Wa91j$*$1#On6%SZ*dxM*VLE^agNoTb=6m`>v^ofFlV9 z?HAh1Xa@5-VD?L^sWc-iK@+Ii#m$>})?_N7hob&OKqipG)k~istR1WJfWu(c%MenE zYSI}qh+1({R{ka>_m?7|lo4`DvdpE0EKBb4Z+0B=C~SK&YFp6xK1701?0_57EQhqy zwilW217!*vFi+u0q-c`>yE3q>n}>jhooSt6;eclG6K9kUhmJiq5u`kTES0jFoqWI> zTg>bFaSbZRems1uvfspEGQ=W9CFle!7dcssKuBD99~j*cBOtCb(Oi9p+aVeW%#{ag}kc_C(N?q*onUyCJMH4 z5|z-;(PfM)HtoU84$ye=_?;k_;dlW!({gvRf6icA#B=u$CU{-Zhh5Q3dPYOSbfEOA znL0>^MKT})gU3MMVX{Hz7zV%9vi=X_Ky8->n_x7Zt*j-kHU~q89|+4;bm^ zU%&DFeCuT?A1D1?*{k+xj@tWQ!d3XQeQLDUe8~yvM65u9B2XV9-5Iu!bb}wn3-1^7 z5)Nmlj?!5nO*k#z&}%^}NRLX>E1f7hY?Rds!|#I{u7`R!r1dgXr^8*|aO#$;VEW5xsB^yhlc_20 z@BjLSb!X{|dIimh!|X6I;ezQdL46!jb%RDoqV6Byatd@F0vIk{Y>KVuDtm2Kh z7=YEohEitW2|#3mPGq6~@YTz5C5zg&kme8R*$n(+vHDU?#rtCoa?0y;#zaDnokH?; zu)~TwaZJiHElS;ORv^c21 zLu(||f^~E>(myo5m2zX<(*$Y&T`Ho+#g=ukwad6WzFA#!tQRs&8a67Dwp?kVj(jz zZ0>2Y`=+M?;ajH_>K#CZa=SPNl_3V^BLg~EH}tQCX1Y+Rlt6v>18SECQ0FB91d?q8e!T)PojC6x_)Q#yL~#sxd@dsB?IiCBmone}ZBU*W$o| z`fEcTsuL(xJ6<<=e$GX-GEqMqti_-1SiNEm>Sre!z|T@Fx*uRpjO<*@jB0c+GGj+? z_Y+PFF)~#826_LmWRIPkfRP;3RNTU1i1keUtI>W>P(|(Ff$GYy2xXq2iDuncuzz*@ zlUQ9W%Ci&naisM{1O~xL6Kb5?66AIJVse_bs77D3Fm{T6;9Mp z&4Sln>ABQTZqdo`Gpebm-kf^tHAvL`BYA{>B01EPW{yMrMj2JbP}cUBIXF)PFN}#4 z*KT=k)kbdQ8F{QWoSmEHCL~gUf=G`IV{y)iISO?5ME)kZG}SlnEYW-0_St+C5`OVz zDwMQS=B!`_tp^;p1+_5`467GxZ|9PUU=ig#1gN#1o)&^jEE5_aSa`dqn;hcpGiQ&9A97Fja(<|=KAn~ zJ(~B5UF#TZ1hTQhs` z@8>)AI4JyhqN_U(s_?P#>Y3yqi5+3E=q?mU#3c{VL&9BhIXHk4!%#nD!npp-5LYXo zNjhy0<}CQ?a4Ka1g3g@3k;CqIbu2ofQC^xvX96x_g)uv95`4VAR8z9ps(U)m%$_3{ zqu^T=EV+dU_U7)Zv^0vrSX1<-noCcvZXV*@hF5^)*`FfFwN=?iIOiIE1n*nw7~e%{{ItD!;B_1D98|hC8mcG$ zy+YSGsN;FIKsZcE!g=#&xl&uRyW{exyISuY*V})eD(vNH&&9!6P z9fC$%VJF2Jb~npN<&v<|U;aMMlW)%*M4mCd6eOi<^`r59q4R&{hRX}WoG7;lm;g=# zUuq85hg1|efUVaBMqt7>^98~89m-)Pdn%V+FrMn5cVabkqSfuA+dp|d669+Rv;k{c zp{8;KHn6)sc7)^K?V~R{_Vd^M@gEH8i?*~N4Q1v8+#JJvah5+ogcE)3$}G@8a<$f? ziX9VbTg00ER?Nj1P5Fy&J=C|Vk3$8qjwwyE7lD&)-^=o1hbOa9?2FlKOP+=|&CGMq zUE{(2Rbk*xI&dnF<>|;sLyE9?-A82L zkh@!yFmwk+ML|(de*$?--V3=1%Z&`dTh>W2Qjke+0Ox5$oB<&LG%`|tQGkDTjl8T|uPAyj^pd`snoZH^nr%ef#@e zfMDkB?%J)a@Z*&)X$D~ zGFJz`O7GZHxDeCJ?in-Ae^t9&9A6#VnB_6;x9(a)-PT3|Bs(M8>QJTgSG&s-;nvPm z^Iu(&1GgVMu+2rj#gREk=0T8L|CZJM`xdit*2Tu+?<oxs+_f*o%K7SSZj{lL45FX#iv3E1C5BfW&-Pi&!)KB@*3ZiHWFnBH650^V z>0>UU8yAOziF3|x<2^@l)MffKQr&+H#TEzVF5HI30Z1j@JF^nJDuWR$DgbzqC6t5g zNm4$VD|IKgbw|jjdW`)a2OWBHpJPp;z_U>EGMI;R5qod0V1!OCUYJQkQ>229s=Oau z&zgcnB&Ct9J!g!Pm^|s*0%;OAHN`e?wusL1D7S05epZc5re935MU6Coj&xSqwusy^ z);zHi$yp6xB?-J1&;j-_$n%ivTpg5zPin1gHmQ}iY-SWp*2Np)cpPK0;v@T6iY0|@ zn5)HsTz_J?VqTKp4Q?D*{HY;UPkQWY{kSoI2h~}UGIwr$8kD0aaT%4hm1XbtICHof zsYOP+dYvnBPeYO#oIC=HkU)&)+m8IH_UebOU{u=)R*zMDP^|3SN-4+FLs9H*O}Irn z87IU{MYrr|n}@(+AQ*L*vg>?&m@ID5NEFR?dfw-zJ-C{wy^-zhnP>>YZ`Q7g^Qlj0 z64qpwYtBj|UsW`=8y?>+TgTFQEKQr~DV+sjyQrG57ANGd^Ymho&@5gJGvPXb^ac+* z4p?noE`}(9*Ja9ggZwCI@rwZ-_=uRB1dWCd#g?l=e{ADlnzs~yBMMBU4d6<6uo9As zO9X^8T+PgAfB$4fJ}%mEXs8RnE$LOZ7%oG47_9PLtvQq1(l%fB40O+j%418c0&_9< zmfnn4H!`$RRFTMiF#Y^gJw2jMYPQ|&lVXNuUvGJ)!`^KEUX;<&O@%OTWAp$3AOJ~3 zK~x;c>?7zxMsDO8*^d^k`QRK^w$MFXBq=Z$`dCMwa<(+i_SC!tiE?>}i75_-SR-pb z@2TJu#pZRPSk3kN?2!X!_n6dJjqQ}@<^KD79|!x%FwdLkPV-BbE>H3L0r>QWOSgN9 zQ!NsRRL#A&xk8b_DL43$+2OLxw3YE~Be@Seem}?N0gepc-cOd%sE~Y-naj2*MQr$1 zLkyQsSp!6sW8Sh`x-rS~R9e}MR)NJ9lMS}9GPXaHz@c0a7gQ_j1?C%wICF~YxcQuj z0xE9BBD{>Ywjc`I;n)ThPRkACH~;M2v7xB)z_#KL7u;O?fuD{v62Zip+`XVQ~xlxyagiUsLSLobMs0N;s%$RNVI_5HW z8eqO)y*YU{-qx!qUM%{u3RPDk_UN!BlcXv3YDT+VSW6hwY-PRM1_+YRc82*o3xt4qY4zN2e1ZN7b7fl4y=hFyCy`&7Az zSedLv=iTXNrJ0uGpkt?Ku--PV1t`{K**7i1a)So$#j?V`0a;dh1ayknFYpa8j;)Hl zx1o~C+ERqW2tWNhULwyEZ{ZthdGg3flAw*EsI@CI>?mVy$`4}f!9LOvV9^oZpx2l@ zjTn~~3l1k@LD@0{ogjy#%=b7|IcQNyzInaIk_CI10?$~@Hj`}FNG{SMdpl1Z+@sz%L34vM>x@$kA400Cv(n*0?K2rc7pRvU@b zRigT3s$wnx0(NU<{Fp7b;0VC4$ZTA|_Rmb-^9?!dbe;#{!Z#RTM)&g#zWew+i;`S% zz>C`}BblAwV!g66fr7wOu;T#oteIK|h|A936BR5o%n`2qcvYZkc?1PwZ7r_>pXv8v zbAj2M%%KPePV_eGDwx3j{Us>>cs0J@(YN|=5s0$(M$rA*FQ4O5cPo9w$NpTFGTrU_ z5PBAfEMA&H6e>#l=A^H9pMFGxpS@PF`sXjA*LxJrC7o^3iY|O?oYNmJoacGlUC^E* zwsCIJn02k`NSB$C$=3o|nsf9sgll7PmySOf2mauicJvRvK6OmP@%nVJ9)BLxp6Y&V zKoH}Mv=gWJhP{RNDEZ$VXs_$W>4SX$CNwVt)CJR!jYb}0`vBr}+dv%>W8q;@T8g#8 ziBE+GhWvQ_3_XAP$`y(OiR+2o6=4L{QMy2w+cJZuGDvwS3on9`vHx1m3L^$O29m>J zE@7COP32u#?-zPy%t=R>%=kDWRtUdGjr$EwDbq_c_$!X*VU}?N!Z(iLNs1H7aR>)l zg~myOUJZ{(uJ$Ebi*)dm0iKN{bbeP5d4e{EUmbCz3;42eE*MkZHRMq*wU_1L9KDlI z71&I{SsP}e15?z4kP}eQeVDnli9q`in^qnoUC}bi$_+zzRXc5b66pGx*1}5;Q){d_ zSOJi7SLf+mwL*jd4+d(0z~1@i>nHIMHKC96{6xB-7<1EXcu~ym8NfPD%FEvwh^i*l z7Bf88h_{k;t@M=1`um`Wo`_HlLZ%%HK*)*-Pm}yKs8nVbZ1x`wV>e z($Z{$`qZ)JK<p#(7WFW~h^}xM zWAzbk9GWU{WV5S94fahr(h+k*)=eyZi)GIHp-+=Fy^2SA8g{-JU+M#GTQezB3JVlC zeQP3@U8t(9r7q0UQ60FvslEk(&YdCxYK2!D{OL=Ga)5&r-sk#6iOz#)OX`v_piFV9 zldae$01{5V%w7PQDX}I?3^ohL#i6Jt$m1m*Wnen}(aw&SHo1^;SiU-Y_LexCZg20( z$`%&Xbcy9gNr3V?4mhXouqZ%X0guE=s1quO>b(_Mm{PaP|0caf{e>?WLwME<&7Gl+ zXVfuX+EE16klUjBvdmhlcMwj+7NK)3DJc|WE*}zWrZi1aBVH-@^YjA4bxggFVZV<} zyL^7}?br1DNU?;`g{0~LtV*d7Hju-!{rHoB46zF_KFK1ej|1svRT8dZ-FsDWPh!#y zfl;5iSo_2T&lKC@5Py0OoOgcgSZniJ4npYJcTszPO^h=W3 zZ)klLzR|@YaMXe>oMeAHEzShRNRN{lEfY;Ivt!Y437l#n-w3$~{C>+do)Nu>Q0vyH ze5Ve>uQ?D0$hE&x>hyidD`;WUpK&EBz+}&^Qc;b3xlKc^^Ip2NTaheWI1-sKUV8PVY!mW_dT>Q~n`(8?y7dZ=Bn z_aQq>&JTfuZf4FPgaG(bdNK?{GR5M{%jwF9yas&mkTSd9mIscf zFRdTer4FuZ?i?$RnYF#Y?IKqCOwT(f^hDpuo8C7Qwt3q^kjwE{=atpzuhn!2*P{OJ zq+NqwZW5R>6B}oN^y4!c*S%E|+2Xw~5^%ySkE{XQ<-oxXz>3c5_ojmB%#do~rfTrTbC;Dj@Bm)M*Fk$QXeEhAJ^MHZb83EHdd`Wyz^0-$i%|~mFki-DuRU4W z+>W@+Tjo-v)N*_hQ?t2(a|piCbzW-;2E!Ba_K1T@Ew(jXUWSTi$jokJcEE_d~lCjCUQykGQ~yhnp99Tz3EUzJ%Q zd8a^BtLh%c+c#ca)XVRd{X2y`rbSSMzqkeYC!cVq*rexUzioFH_UjMiz}9#5_%>Pd zrTB8P?$6dl|6ovei}g6DFUB=Gw$pPwu)ZZtbA%x+o4zn6J&%1^f z{sb`%uPbnTMjdcFcpMz(rfr=sq&?d+J#)W-+Xo1wNVra(g<2RJH>b6+Bq63M zZ_}@0Cfi7vF4e_@V|OFl(kNEbA}5Ik(d0&0?amuX|KdsA$FM75smamMLvL3+@N>sB=zzp1ad1Ei3y;m=NE6O6nMIbW$FSY8;yiXi>}BFrUpa83qF*nI-Q@vG z53kvXc#qaRU_7x@A#PvQFZ)>I!}_2HcvknmNZo(Brjv7d``1^19!|+!-ZcTP{ZA1b zQKO+~xddC<)Lz@L9MX88R4?eEo%%Vl*K(;v_=j6wbMmW;fZ5}kez08q6B91sr3D62hDy&9OT z%#^Im3QRqdhG$qc>)ze6UaQS$XN8rb016#+!(mw-q*kCaf03U|qjMxLi+llcINaU;T5=M!1AHk~jxrMgo+pgopqKLyNWIhQLK%=vlukel z(!GlOr~rLVaqiDX`Zj{cr=Pz4GWE ze)t~C`Xnp~9EFQ%=Rg(j1{s)_wGfGnd$=5Ikfa@f0jU0$_7Q+ziukIQnRSeUo*Vy9 zebHq9L{HW^WOs^@It)h8^bI@&O5X?xCk((F{w?i3hbZQPm`%E9vqVnHDmDi|(!pO# zz#;>5^dho0E6qQ|y5QgGzS}?8pBY4h%gq zaY@sH#xJk&-r+xGD6d0v@7=rlqGK&q4R-UVjQYh*gN3|@D02n1MP)yZe;Fx0zj=8YtJ6%YM>q8Ox#y?a;^Y0_Dj^hg$_?&WI{+| z75b(P*?I?ymFvAl#dNbCFGt{~W`b{E4W_4aZ$j1K{`Ql%^|dR?>fszO8?nkjb}^iW zY4tcdfYpr*g3tI5yV23j{Cq_tNFd866a~Y&CT=T`OCY>96NLu__86b&jt|G>rm_P-BaT-q4ua${4i&3CfCoKR6_iEQ z6L;g<|AlGxuAxPdXXtiue%liep2A9`xBmN}9LH0aZK-tTh;;U`(h$(W5iB@a*;X-Mp<2^QUK8ezB&KnQlrpk2(sy z@1!4AhZaW1w&VeNTq6+wd~DNg?0K`27w@|A3VOOI;!NMx&eSp|7XhR8z>7A9+H`au zwA<~(z24xc>Vl03$)urW5kgfOIvdOvarG_tW!}j0H3xQ^SOeUi{elCVdq0?;>+7za z+9rA%b=-65*!-nEx1a3TUHR%plNLz~daeg%sY(>@y(HoyrpRyF*hlRnxh6D)+^R~?lcK^WA01`qyAZ@*qfZC(Bkl#DAk!ZQPS!1 z!)&HANEYl&f(4{SX5nbo9alCF?7jIQidt!{A_+YQ3Vb5{5 z8NmD@!`Wgi$yq*A_qOo`D)wOUll7~T{VJLy&cn}&lT-x3wgis~tC8+_kw>@-iSC?Y z*)&0!E*q-(ai;F-l0z7Zo@+vE%;`vs={psK=e_mO!zL@V{GxdR<%NgKY z&pgR&>F|Vj9l!w{(g7W%lSk~d`Uap9?JWguptw)mVv;$v+oc-X-0)CARK>gUr)vN3 zROT-Bj`#(ujNBJ_2nx*Si>p{CBy)!LEnc8WPIogxE}g zA;u{)1%>iq?c*?eLFoQfsPlrLc_g4jKgF|^+yXkz32PCZjqujyR^B32>H3h1b ziWou-CpSJGfNHPZrJovX)H%^hm%L7xW7QLy9jJ4uGVv1|X=@Boj+#XJK6}%1i%JOY z*W>=``Z^VV{gx7O0W!3bP$u)ATgfTk^jlbIO=ug|&tE^JF+aEYC!L=kUVpldEi;9n{q`yXraB2U?*Yu+PFJKmctVvRDqeW# z7om(lff)I=RQ-VsG@Gx%C6ltb(d3b60{{@i*EDljGg>1Sv8gs6D8xVg#fYiInW}f$)-rRW#(mu8oyAk-)#z$W*JSb zx9WcH!n~GQF2_o(?=Iw3cW4WlU~=b=ouH?SW6^p4>dWT>CE2kPMVWJ}YJTZil*@PD z74YObt?@Kky2ME1#Xzg?%vG>k%xPj4-O0KrV-kiD_<<;DFvIUh+kzw9nIvin#|cSY zAgbulktl8-m%;j!A-mkYejgjNh_%dBiFJGQu0>Cbq|s!@_UG=T*dv7N`Wd4Ap&WR< z{_x5AaQ!hI<4@4!>K{+Bt_6BJlC7^Q0qg1YP8QI@(*f-h_RCbOvx>V8-WXf>diUpL zqC>W7eHZDaS|et)#WmJ;$J6T+mZ0TwgO9}dgRaeuy*R{RKvk)P(Q=TDGq-iqy(PcA zy`Y04+=ei*np0}7pOLkCBV#odjTK??5TU4;SthTV%PXAU^94zMs!}0Yd~Gwl5DXkR zOUR@XmA}|j^P_C9S$trN2n!7Vc)&SZ#Z2MsOzEbZ09N!XVaH=*+~dVMXz+=LxXs!9 z>#x40p6*ZhGZr1Y&z`!szu`~nk<7fY~E%SW{g?@T{s1j2jMH) zc2z;8kuO#ETHyrGb2@%oZ$psh=(H1I0Z#&79unb3=O!r^DCp>7E~#3$`dFwhC+o-5 zuIB5%&Y@FIzGIUQc`A1c#Qk-ubGYeu2ww8k1sBcoGI9rk;9V?&n8RnNRikyGhFC7u@ZHj`X7H$g-|F0_SM@Zm zaa&XG0s{Kb?ai&>-AFKdYsC-RpFInGb8i_XqD6`eG9%A6nx8#fi>Gazp_sM$rwzKcV*Ms`dv5Bd9e%#ADyu7iW zXvtyJ{W~eQgotPXea8S&iJd^IOQdAjXqgpA_ws_$Jf|%1-1V2So{LY)0)%l5kw@+w z>pi<4M^0(Z6bs5UC+pKh|9}n3=~H3zS(?_t6XxJ4h`9~GYG@9(SYln6p$0zrih~w) zf1kQqC^NFL9U;*{oqMUL(zqq*utQ_*f*^5x@ zZ2m>~8xf*crtE>4KHEGD59m|G=8LOkd*XM;*ODuo63|4}SwE~{F1ZSeS0ExtY{`Gj zU^modcSx6?DA<6umWz`nm&jtzYB7#)tn>kHEq_gixkLGDdS(x~rn@h~VR?kI39rPO z=d@}qQ?T5zohG}boPSkSqg_fL>|fxV%b2nJS?>kmlO^!+Qybg>03ZNKL_t*1z2En0 zXZdfR13$lxPs4xIq}PsB>gtDY`+YlhdA4@FHj=M=`wF3{^4~7vgxpMKU>AV&r&C0{ zJg4hd>=+Ud{JF9N*K@dvdU93XE}l{OT#WsMJO%eW7$RV0EH(InChM~%p#8)|{~pv1 zua2ZsK`~2P5YY2u_c=W~4TPhOW`LV9A-^;yO!p*@m`K@EZUFodXbL{Jr{NbQW!IegPX za7O_AP!2cvAsshAYl++#vOPx7ggY5oFF@a&Qs;IT@2pDW#`U2)Md=9tX~EN`);yQBAR-<%YAe{uA$9332n&C%rwOq)d|GrFWza}+e z=$pKA|INrY8egolW)!P@T?QdyiQ{fCKt=d#As(?<^LApX0aN{I5^#6jK`zgE+9LbR z!)cBS_7U9h*+ncPJ}}HOTfE+;DfV?U3f-XnPs6}*HIfgls9XMWv8v^v|0pzc#BwmL zf~gaD#nzXTY#Z2Z)?cNM$w}o{GsL@Rk-yeT#{nRt0R04hIR zdA%>zB%EI?Wthjpgd3Vfm@Yn~11Aw@^}Mu0Pl9s6xC#Zb5C;&hl|5>XC>efu;GHvZ zOsqw(I0>Cai7F}-OUV2T{>0Q zVHIsOj+!*VoLk=+41%f91lCP=4O6t_-m#~bZ{7LJbSn2K3Qd=CxxcRZHtZPQNI7Nd zBk&>I*12?(3%@eH!G+&1C0)H;CCSl#N5)~h$MJyiVGw^rb&SV~3HL;`BKVh6NspFu zs5g3}!Or72&&u#!<5*Ji+l$zc;ZDTQweG%IZ1MGOhcivnUWGD~+xkwSgLW%&Z*cx+ zW6W<-oFyi+L9WkfX^8x0xCg%1I3ug?LxA0Nu>u-5Md1O8UtwTl@3)J^?a$+NetmZ> z)?1skrHP2Fka=6o!c$t0&%Yq6e0MM!0N}#YF%r@x&oF5*9CC*rv3c@vP(?fHP`;gLxpnaX-8W=~FH8kWX0iau9=qts za8tHMQ!~!JQ?B)Gy;S7}Dz@_h#F)pOE!6Hj>8S)BhJqeM=Vjw5h1@GRHj)ZdhrF~t4MMMQtZMo@?oGF@X21;NR@>&R!`ZnTqvHS4uz zBQjTl+LV-#9NUN{JlCek^wZ3p^4KP8F{~b?P4E{xc^ys`P2f|<;oDD z1R67XQw;aG%DR|Lu(gGI@YtL|LieditZ}}K&Hyqtk!`#I@?a;pvxe^`wa@(qv8LQd zxJ->ZA9xGKsqJcI)5Nel>3EDmxerzyeO=1I>n!%yn=GG}$?iI_F*XqB!;WK5980zD zR)2BbAol&;uP_jAcl&3(J<#tqe9Cq7vK9k|yQWs5t$QFrsR+vUZ-Droa9-{{?26fJ zh7OEXOZ_q|_gQ!$Fi5NU#q^Pk6@#r08M*q+z^=ur7kVx?`t;|R__L7UNCRzn8wt-H z+gEa{O0JDj%&eCZ?E@zSDiUv^EL=wV$ zX95Pyf)ZCvDjF&}T6%8@U?>+~7Hh4sSnggjh@*5Z&hYaEIaLPFKwL*Uc*&Gt>@+bZ zx>(6lpR9!W)C#(7=4nV*{vIj3u7J^%hivXTFUNmAM8be<0Fe~0a()J3Y!VL%BVoOE zf8vXIeRF-kA6iT&&xoy+h*gZqep=rTe-eXrtNeCr2p!Sd`-A5I_c3$*tw?HB-f+uc zUZl=-754BK6ThSRTkoT+9iMmgb{9+PXMK)?c2ogO7PtspZ{cK>Z?}BrkAclx&o}sZ zDYK6)SH{@pK9Y%8jW`@Qpu%BvqZ0?dfa&+3{-{@jWD~FGQ-~rb1E!nqaKH@tGTZM}i=8z(nSQJM9k&?=)rp8#3dI>` z`1+#kz0sLLSdCx?FgX(7EhAeFixC91U(BsS*oDyoPDA(sIw}V5c4@8F3rpqDMJoOW zO|W^YQ8Z;NNFL#^u3O)LY^kU9`^J->@-c$TEgP!^jw&f8QNVnbs3J!Xd?Ai}Rl$H?icLTC`O!YYXQ6VR* zpbgT!{RQ3c5c~fP1HW3*_3n@d4}qlGpfFVOt-+nSGT7_)1N)cUeZQCHIJI*Zj;y<( zNLO{WIA>H3g&I}1ZIBOSx}ybx0@IXkE%(%B-=pg0ai%XO zuYR&2@U)8eb9ZOkII%O|bwmK2nRpuPdNwGl98Y}gTy{smeGH+UGzPx0i{#|3F{pl= zQed=PN|r?#nGAGWBwJCLaUugGX#)Ht55P%w+P6Bkm6V#YLGaRx=QML9g?MOAjmN}? ztEeILxCE2~FxW3w*iXH?bdzFAS`Fu^4q|3RFZ0uYWo%)4oyG{hcQO2_D>`{qU~_V$ z)34@&Nv{b#mT6Y?RX}Fh0UFN!*2OCg#UHD>Ji8cB(x~KDr~++Y-bk{=?f1<1tBYSh zHYCuCoLy41q?5M5!J9aJ=Lz;TmR^#?pJ+;rp%H6ZpM89ph4zo-wYdAF*6J} zgbmR3j)57+a3_R?amAQ4K{51zF6<0J9{F$63-!f8!r;IQh4<6P`@`P=wr@RYswTeM zmMJm~JR%J^V5Ss1p1afS-P_T+$w-Mj(pvE0D|jDQ=nYo#ZwqZ55+s?Q6xqm(q!}O& z-((18=PIkHtS#XZbTVg3lDV0y-4Osrfu-^qs}?Gq{K&GRqa!b3QaC7WgsaFb10$cw|yp7?PP+c$9c)y_Be?(KAS4ua})PYVpa|f)N zS_7r9BsB&EIY=E$_}bk7ZgJ-Nfpa1HnRdVu0uF&00bG3K+gY)e@2T89Ve-wGhbr^h z1!H+h6WNJ5RRMDQ#J7Pk0}5`Cso6Vj0SrjC^UYeXs4S8=LhyycaDORCGyjP(81P6O z`W3{U5BxJQ@Yh{GKfHYvmNuE&2koG1XumSMKRK!K!0w~k=;g6u0tnHaa#n@TeeWJ` z5B#~`Zj}qjXwHlTna0U_B&0=&)X;KLdo7+9m{1Pt47y21wqV|V{uh{(5P1ypm2l?2 z+XGL|44^6@k%Xnu2W<{+7XIMailc%;KPVyp;`p(@_AHPtHKxC89qCy(omAG{V7u&#-`ATU>KxKy@Nd{DE(g6JgPSQ&5)Mbo zY@NHd!F57lLG2Y{O?Y3$YYaE%{a$Q;WsI{>;T3OZwf325zKM+0N{3CK$<6!@@jN9R zWLIEN8Cz~A%~gA4ufxj`<4jAnv{=MKgN4cM=wBlC1!8;j!9Rq7)xiq}Hhi=Yb?f@e zwWtPdESc&+NCSO9Z2ee^q{ha#Vc+lG2G(TN9W`ca8Lm?@t;+!6@C=ksk;0W*jG3N) z4!srhdA0dz3xkX%RtPy549x@ei0n7Yw6e)QBOYT5+kk2~*zP}@5F38P?-%R4y9AD* zj{yZWZl+nP$t{xcbwbWu)(JP=30w&_1x&VgZyFd-qXqergve*jL{QK2Obf(eVJ{C);#t`09D z0IYEQo_5D!S1ip+T!~GRb&u(!4e~xi?7gUXn;ks-wj#{wRf6u(a<1qIk?*ekF z0c^(y^=4V+T9EWI zA91x5EM|)4&Mn?%_PdJSE}9vWYJ4!huu=?&dC8|6j{Pez(03%SNo@w(DP217;g@T1 z7W#dmc-?N! zZZKhKUC)bIHWQKy>nKs6T?Rm^N;1fh44$tSG{PeiLGR;Mn_+eoa;r?z`;G zOfzX>^IFFPV15Wis$H1jdPwTXjS5xG2r$<&`7&qJ`l68WHL|RB6r8#D=!4XN=t^mi zG)XQv;0&LG2)g?PRqlVBw8-Rw)69x@z;Ij+MHF&SPaU~rrzSOuu69mFSqc?XX!#V| z+Lu_{Tr49@^_kv7= zKEJxuO_HrkFloU(MX%r$9~%$1$~pBhLOud?*0oE$u7RvxuPcRmozw2}x>zkL#wKsk zls1htb_dO}Et%$*!+xDq4J?->dB#GSeMUnhde{rE48j>DQrY`dvR5 z9Zp#+6$g)C%55Pl4{7aDE(w<9J#!zXwYRrA)uDxmf-lLJ$vGPojv-$wq_gE` zvl|sD*7*`uGaa?u_!>9|Lps}4Ps=0RSX_I-q}2{L?P@W`O?q&es&!_rn0$-D_9Da{Vp^dit~~7$NBXy$!P|`J@HX*f);Q#Q`9V~;jJCxbWvciR0@I&y+J>nxv=B1syRPSDxp^IhZ(qttk7B&P! z391Qpe+@xm!==}zPNv+#HR6K0w*o{`3OkuisZP16m z!B`T^?dC<{}`L}qFalM4p){PdK0Ta>9bgCSFBGzEmkq{Ph94ua~ zpa^g=juHl8q|^tPW|mEMqHwQPHvHE7z&>t2-CCK5#uC-uwhKe-t&umNIhf!LVBL5i zaHOe2pOh~cdXrV1%Id{x7SN4x?_+aAjIph?Td~>_L?@4;l|tE;2R)tcZ+x6I(l4_6 zdKnlY;MAH?y{q0tI$C8{jS-TZ_&7WmLYSc*x~aBVn>;Lp9AKh1cY3;c3#kdkRdN-G)b(!S2p3;z{J#|eRb(Q zh++LYi;kLIS|vNyfEFJ*r#LIwhO)vAB&kg&MPzzDUhP0n3%;R(nX#3N{ zSs#*w=vmLG66$dR^6l!D$vL%bnk9ql$uBr{;{CSyd-PGFIk9bPRBvxImUq{_m`px6 zfj=Ob<7|{gh1I8A%sqEh*q}w6wXMl6F&anvel+vc2_TFW$eBAk z&gkyhuS!s%SPx|y5jy}kWKCPGm;A(_=Dz~O6j#?Fm}h!!+7N@W7&M#?-s0IrAJrFkGQDYtqTf#sRJX&CtwSsudMB#Db^i5`Cq?ykAVk zx^(CtHK^yII+EK88B!$a)F;lIoAdGT{ zmo6K!V~ug>2Nn5MQf2~;Tj`$Eix#%LO|yda8thww;s`H0lFEa#NgmbI!o|Ss?4(^w z8Y6?!s^i7tNz%9wJDEr@ls1WA4OP88_hPUuSw~*A!ch>bM)u~W_S|H2C-h35DVxMz>AIY;n#%kH0(u-zD>Br(#Eb(Wy7E-!QPz=yQW zwvT-}qHY80BE2_U@`OAO;3N-Yl&y-Sv%^fkO=L2-Y02b}_gD|S^t%RD|LO&vT0s`% zk=Be9_F4fu-OTJK_cUl{ zOumsV%gVD8JdELM{{nr>qM#?GEH_O_SpubELasI{^jnkZmw3x9JIl+1VyCYRs;@~_ zUc!5a=R%t!eyL0|IHHOV9k_(gVDcDvqG3+=QeIl6Yv0Hux-n*!woz_!K$YL1N?k_< z?hV>4AUg6ZqRvqY#1BT50yCz_3+eVrGbTvb3Dlid6JY?>PKk{0zKp_1!jK@?5PM71 zBhy$^bmXAI+eV?g3xnkNdAoeEq5Cy~!f@rRdj_Xh`s!X16}7xvMVT4af7g4r-nzj% zW7-~m^NK5@w^Fh7TW(TvU}U`!dJs|N2Kj)7?c=+R!-1y;O(5K_;Q}EEGnQ~>yWH>X zP2PC#2w$w!>%i8c>@O~sKOvDDUWUwpOJGdk;fqR{7jZlekei>W71cIESUDS>gY-%b z-0Etm=c4pi`|%&2fBT`|EQMmmmnvVZ;yBNx**Ph9ELvLc4FO9y3YaOFOU}Ncc1JS5 z>OFDg+~fU?N^2ywCG~+4F@P(=^AbT>-kSATbIB>X?$GGLKGEO~fmnZbZMJTraY+FS zD)hgjinp+oort99AvL&FgLs7%xiEi-p!=Ly@NB{Rhqgup#IcuSp&VP^(rO01;iutEbklJ)c=j)8+0LD8U6NwJ{9Z7)*>6bClsiQ%EQU*@m$d94}t>Cn_+KV~OPH$saLu~7CySJY+&w2L#CtdlOi+WiPD{s_rpv_*@od@t2FZ9PC zCk*id-Ipt1TP_1u)N%R56x5dOsli<$M|)E$ah|X#6xW;ZLn6^sr)vF$v61Og4P1?b z3gZ;R!J?>TdMPu3q|FwB8OWAH)waLaM{aLR7#FrdP?zZLIX}mjP^~2N1G8-`e*#CrD;PaV<30 z*{1qlAA5(26wLX(Nk9>Km{Dse8QNOJ6(Ui9N03uw;S%g4T4aJU`zTj#|dEX4*1MD;u!5f4mcr1UCC+khHzt+m!qnkm-NNM6S2 zjX(4oNe)G+8(1`}8Z;B8a;hSjJy6s@_xg60jLyGysul5{jW{x7RjKW|yMV*oK|4-@2Fs#3OPH0lfkXa-6}H%2uz)@{t9-$w# zHf@7?y^4Cvq_MOwLZaLR11>EW2;U^Z6whDvQmd)?Aa3)x?+af3Q$IY2a#Zm;c$n`!_#GkLXU6 z0;(1*y6y7{l2g~=TC6uptRFZ;`ThXqD>5$jS81V+>B&mNZ54S+tc|S54j&{c`UB)rMAWG|&%6vG)axX)u7ogUM{nn(y55$bR^L0ouL@>Z3P zg4s{d+a-ySih35(Lk7G65pGeYH{qZav!)SLoMf=@j$D8s-zQdZ@2JzKyonQIDEz-q z*UC7gvTSHP(87|MFXaaVeh3Fd@yDb68gqrPw}P=n3cZNrFTD=q>T$kdTd*D;P4uYE zGm=MK0I5D?U2UYey_KIv?fm1a=wVnD3W(-IxQ5@wJ7l@$eN>jvFh>ix;wTMajF83Z z?rReIlQ0>PJ1v&pQJ|lSC7=tQe)BxvGJG(q2DK^gK$cJ@cKit&J&CKURKJ8Urgsoq z1TPZkIDY)`^T+@6KmTw4>;L|L{=4%!!QcP>^Y`C>x8pc|`wQ%ZPRS$Gg4BgPRVEm4 zfS+Jn;i*3mr_8)eI0qGRs}WGACH5-)XR_U_Wm8%cE%wINe5_~*NPkkD+;)#RbK0RJ zV(DeX;Rd7Z$lB7up#wAA09}gY6}f0rec&Qo@RKO>8W1lQR8x0$D<+&gN=T#lrmP%qFs zz2);vE`rn{9i>rW2{!?>cMDG5cIgT;^H7`@KzA8|oX}=0Ez%YjjsRID zO_7jS>#d^wDDQ3uAu|j1C6yo~2-?}JxCHOkD|&+<5QiaSTZ#4GoK7XsSa7tABkGlV zf{9I=^G6O1;mrtD?W=$m>%D@e%pw+xi@qk8yfMd~er=4lt2Piw3K`EoFAY^oZ*n45 zG2Cd!?dSG5#y?8v6soHfsM2eCM$_WG;D(^*R*{SKBmoJ%DF{oMyiE`4Si_{JTL{lS zuf;)LVe$&6DeArk=@9OMMPkDu?7?Ez(_Zlo04mBZwC~NIw*U;_ivXoLQw6gNjU50E zyZE>N>+iq+`~Tzb`r~){PkjEs=fi^+O?F7X0iNMnG2YxtoxlnHTod5|TqaOgIuO#L z@_`AK2?QXcj&x;&2`9LDYDwYR2txCtOdL)i!o{N&7fdkX3g;w@bRBM#fpjD6gLDu8 zPe8E0G!2GzDE8P_SPhNFkN@@h9XS8{|L6DrN`JGCMi}fX6ss^g-jv>C2`A zwe?AY8ASDf?NY7Y-Vj^2dT*5W6aT`xN!AF?7A+i*p(m#gvZ$(fX)`S zaVz1*!DDJiP3l2b%ULts6WD&-q>SnyAOPj5_uQd4nP*xe?WS2M0hT_>*nDR^HVK@r zI3yk=69vg=)2~jao*?KQeNT1y5FQ_$6mII)8>R`61T6SB_ zdQ|Ne51d@7xY<$&2_g{ZDz1Yuj9!M4QY`(c_V5!K#>3;sxl-)K{>9x`ldS)QjAkhV zcnYdFVL3QEOU)_aSH{eK#X;j6D=)eY%1y~3L@w7W_Z}fB%iX?DY9G~lhF<`xKRi!p ztarIS?<1|x1TqaQF-knfch@$^h;LTbdLDAIrG7lm!WeBjR*p@{yfO_(urzfxUIUCe z{)QiaaVO=coxkxk`i1MG%Na*!GC>z9%LD*nct2@B1MSP8Y*t1eK_He6wu@jA<$%p*1S)8K%+vI^(nfa3y<^o)HC&fJ!L>AC=YOhuZq z-~Zsx|M!o7^Pl`YexPJzfPR-Ejny0Kj1OX9U5l9w5rkHITUa0&R`=5BYFQzig5;Or zE;rU`0n(Z!NeC9fmUYv#vyCvIk2oKNI%l13At2dSq^J253W0GPA{?fXQb~CvA#LF? zRhteCO6cnvz+%<|t4!S`TrNA_|EH;`Z5Ji=k(4qWNCqg8X;A5}h%Pr8m z-+OlqWBicADJ6TV743r6SOP@N32)8%7;@~u+v-~9ED1yf*>s{3I2A^4@&vA2Z|cHj z4p|&RGPxO!JnILiF5)6T;3wxPrblskz>lP@P^@b8$}n!okf3@%1{_?|Q(;~^*G=2v zB45l!J8HGC1LYzvb2rK0z{d#TN136kPH9TJ@OTqI6sM2w%H+Xnvq4{~+?|Y3gD=ke za#tu%c!ZkLN4=z+=Z_)whHZ_JV<|^cb}f_>CCpV|x|$n?NE>&af%9@wMPPyoxg7jB z+|!_9j64JBD^luiz}vin&EC#q-DqHXCF@F6z}dE-WnoSj)&WzJv2FT*AL1tAk;%086huQCXy%3mr)Wu2`o5{Y{x6p8c#|1W}vn}LVOt8gQ1)}HB( zLZ6MwCP(H-qfr$ant8R{X?Y4>VSRPsL^kINw}T;S`(62@WvWBD)5Um-!kH(BlDMLm zYgyq)#rZY|;dCU9m>IH$NoX5hhGl~;M2>g=`vqP<>~na=D$;6Yy|~v-4*7RP zCL~%mKFmGLPB?kkX+1htDplo*RLJ$Ge~v&KP&mk=?OR17ZEm&tIuSH_bW_xK^wJ!H zo0(*wkyjCE@T;SFU_?_G0vK@|&TuJ{KthCB6=az@LcGobT}`?vD}1PyXWS;ximX7q zkrj*fF|yDVpaogh*$M57a@hfA>f~v8+IM5Qcr6Qjq|Qm%u0XXO$>IbvBBZ|R$fM{T z&jKHWc>;ot()$mAz!~lXgCPzbQN$Is;4MmRD-JXG$<%YtDhUzi8RATo0b$f+LSF`) z8xr5_RG1sSR48hnYeTTr%BHGXvhBfARh>X{;UiR|pDKq|s~fpvj04v!|Kjc1BvYMR zEY6!^UzT_9kE&3)Doy)&AS0-mZTE#DWeA@N3xPaZ&~`PKstp&(OM>0p71hr}mxb z1t!!w3fWm+zrIovNZw0G8JnrgJ#26pSC-fq)lJ%I$|wz1PQ03DdS>96yI*G!Pt7GY zln~YDQ0^nuAQg4Yc_>yikzuKfHOCT!D)<6Ysq-#C@~UX)sz9D%re03OnENNwAIf{9 z7KYVul*Uf?8<;*x{(BrNOnD=^2%qWTN+Bm&s-P+XScgf^R;HqP^H~js)~7%F?VBQ} zkiRiX%giuH(}^LRE(S?abu-?H;FmiT62+SON?hC^R{ZlzujrE!zqwN28ZQ`d&<%i- zNAF0}#;@K0ysdCJu~Vy4VMQSKt)5ps(|G1JuTGD6kE^Z7q&Q^kNs|e$Y>LKXxc}4Z z877R=ERtV@WKNTL#Qr4?mFwSd0ta|N$1)VPaT`A-Wf0r{RbJ=H$ zMB+nM6s^XOGVg`;GQ^?-2MoNRWH!M{xl$D5YhJW9kXL#D_w{PlteVd4ZmU;4h1=Rt!7bwK(-oUyA}i&!&GZm!}I*|0{xt$Ph1q>gXR zEeDGk!&sa!fN&8Xq(79Y$IwygZwQ1)9zuk8i-BE`*Y-a7o53X>K^IvWb>V!PL;c8c zM+ivRaiQ|xdF7i?#ibHRDcf|H4g}WbxPgSOAa*S+JJePwqM;Wgqr*$Qz)Ntq4#O|X z&%b3a`u1wQ>KnpA;g1q-LG_A!D@@a20L{uqPqX8NZV;GC9)=={r1lW=$ z;UHywh)@$Q;X?xtUOzt-ap2p_D{#6#gp-IWHk(@b7{X+{-Pmpe=PGH5wF>=YD|5Lc zjE=>KTRGA{s*5XR!>i)mzishI!>9yhp@?4+TT93)Ew{w*@`nY88S1o5Lr_r zk-ak8qt@#-tOB+2@ zNW#eJN{C_>9*LxP6)M6Y;~IRb#)WV~Ch(=GmV7{z%Nf9J1<{}&k%;p|RE=EoT+aLs z(gqs2ZiF+KIBNX8j?Dp3tgRsx8kD54CT0kJxl4mD*A~BC-v`_c6oIGj ztqeGDed1(qwZlmop1{Z|I_+0AaV>QJ8dh@v5tq8ONzQec;C*34FY6)6EkZgH@0iw4YV z+c)>YE$`Wlbq8yuI;v=m=d0mX!J{DO*2BUvunBcpM$x*Xca&)fy9@r(p+ zyVc4k2xmdqf#yB<64(#&S=w7ai3%sI2^HFtgzLK8uP`_&x7+%(6L1#>3$YVRp6u<{ zS1&^Fr!ZkR9V%mKi|Z{WQOHmu_=d*kk4q`p{WH7dySKBjJBG5XgFvu(f`^$$7{OF# zu)SI&wRf!&SJO(jLHqUU2R>o>MV%tmdH}@+>uYG_6zLIil&f!fL>*-Cj=&5_r$vrd zR6tDzN0spud8{%NnuAVe0*Z3f6FAC!qJ801^MB4Zjf$F&3_`iVs8*yQz_Dy>%Ut}b zl+sPpnS8BG%*RP3q)Xom54Gr*a4kX8 zOgR%Hv|T~tcyTUpHoX%Iap(!j9Dr@S==MO+mG=2QCxDXJK-0e z;TUWS7y?mylgQBol(9~ncUWp4_McD$v@y(bgm2tx+)c320h)Btai!Y1RM~-AuZX&J zKujPCK+B{8M~kRrhxtUkWdOxb?7cHr3t`at^Cy4)LH{64_}W%UK>1*5YqyQIbifE^ ztXRA`2MLhfsZzZTJLWR>T9CA^V?*4 zV1`dY^2|_=QlD>84`rWUn9Q{(;C~M{3j;|23X zv*X|q5$+%2P^2qM6zMkK8qea0uVU}<%L~^Y@XQ#1O0p9^DsRt3Sb^r^b_DGADqD|a znQVUru^QS}%~2QR_(&I8qVw&o-peJ3Y=b9<3{0tUw3q9hJuA(e3a>|CpkW#n?sHg- zAo#2X?Ka0+j#QM6w(tv8{46Oh6SZW{{@#A|0G4)9M#v2rp3WiL<-Lyvi7GvvGinX0 zK!$Rhsr*U`HF}s%l>t+seBb*gnKgu2L3OFKgu(VJ9GlMU9p(UZCNHsoyhVyB0CZ7N zTEyX8dPTR;5E~0P20i83^V-RbKJvvo&6@Q{QfJA~)nOh9!NRI9Tdv}{ZM*&jtNETx zx&D@>2gtH2j31Q24e3t4xeR7^GYTQ)QXD!Bl^|Y;a)vBjZs|pw8F>{?l*v1S{&Tm?=9K~?04QdCXI^W9 zD&~di=#}tZNB-@-bdQPfbOHt3G%64+q8m!kI4tuRaed(ZhyKg$cE@g5Mf2CQDrW7#^LUwu7zol!1T;Ar{T~Ej7d1Gq(Pz*&+$%3|v$+I%d zeS|WxXE$}GDT>4Q=Bwjz38;Xq`_&tcp%-(GzkWQb$CqJ0f7*Ia?W$<@hEb~?@9W!9 zy*Yec6bZ&z-(YFE^dpWDc)>y+i;m*^K*iQ?Juf#guL{6ag02P7^_5y@nQnGEM!2NSa@Rnk-B;WnA6>y6C z10mXzc4o*>#%^F0v19>paRJFRfV&1%<7u|Iajv4m8g(C5kG$MJ4Cisu zj#`@#IK|34AVo#c8)Lm?fV*|z<&G%VNOK)d#-RXd?i}d?A&(SMWS;)cW7CObSbOnb z2z`xz{~W|#aAOFl)QQ7qt9(Hj6Bgoj$ zR1+R%Mm0D2>S}{-v9}F$%Uw6#Sp4$6S=I8RL312&Qoz7C;^vYD$(QUXQkW3BwLL#~ zbW-AXGa{8lPY7qdZ%~BfN3gHdGF5<>Bt2BLDLdCNl)D9Lk=4t9Ujg;X)D# zDlH7RA<9m7nMGf$lb!_9qX!Yn69_etqJ;LbZxUR|B{!Vy@S>JmX{Jjvd+RSXNpy?F z^0uXF51;y0qhH2oIW3|Ry$nN%MD0M?K)>6}UoeQZTzb3vB*O7buI0w7%t%r+(J*XK zj8&iJuUl{<8~(Sh3$_VA#|E__{}!ktRI_GeO|d=dhSZD5>M*yR?xxJ^A$`e$2ij~D zGlq&Ou_B_F5yg5pi8mh)dSl_qaDJqjWa>jU-`P9O@${x;@r33~>M=Kzrj7dQCe{jX zG2f`r#5i;?`qfg?LXjyR*>q>4k%^yULP=2Z{ER}>kUEVH9)?X?@@&BZRlEjd=d8E0v|Yg#diBIHKqe7v&p7glp=C=xuqo>61FAu#(;9+C`#HQh9p)jKgG(3*lT*flLSZb1oSasUK?a{Jg+C zBYvaqdC#z+p!6L?rRLI_sWHJ=txng{engoB`j5*#^5e+dqxrum!W0>ok8+UMbiK${ z)m-+US0CH$d$TZre3Xz5g1amkiBXs7Dz6EJ!*B|88CYkwa!OY43jOP|QBre7Lg#);xB?Vqs;m$J(qr`ve1fKIs zGAD7AwtIoYV5OQei3r*p>SBgeR6Ch6CKpBNmO~z*4KHhgF|$|K6vGz83Cy)9sQ^w4 zna4oacC)QcEv?HXfu8_y1V}%*Om2zQB-~*K+?f%8GzNvnp$7}yf{49N@cTm>(afbU zcCv&qhMhxweyMZT)cwZH3$dB5${~bA9>Q_?c}497Cx14xQu58S`Z~&Woj_Z9NBW{- zu{<}01Q5x!qi#?!qD*cC5ivmS1j1))aOe|heg>nj!1^?pb!65n;j|ctHX`Ff$y!DB9cF86LLs7OM^^oyXR{YdCUt(7 z9M1-l4F|K(-4qXt#|4tisck_nwbjdp^0T8)UC)Pepy9+#Q_7KxyM{W5TQJeQ%YCp1 zkk0sd6+0;nW$X5d5GgWNXRlOg^IsMTBWsTe47cMa5mjY34h2+tZxxWNk)CPpgH(ty zulE*uLc!nzNkUBi1dI$F&I*vR1*jlKV1$0)SA@fQ;Lng1Zf+eliO<>4ow!Vl3JQ6O zFY+qx5C|2cMfE0kzXB6I%Y55FW(@mHjEEI>Q0E4c&v>S#j&p>(4$Ius0CS%pPAp%! zh6vKm7ts^gmb?4vo>tzzp4HR2QUi`arf6Vnj;mjkHu@FL5ju*JSsLgK+iucJn^A=h zeXLKQkqweEk*WLy%`DW5_I05Cjor*S$Mw1|Uv7)qJaESMrIassdVA# zPY{yT)x$(odg|9|WNk^R2a5(dMxLNpR=k2ddj2aACXwVp$kf6dA*0nc@iRu}qRcYn zKHTkC#I|MMFZ=TFVgy4%YYZ0!+|ajxIsBwN4h zL+alxcqYNF>|^sP`+slI&YYnL9pnidnM}1fPbyiFz>GDo=271ej^^{a-+iCd>oYy8 zimT5(F-n$%EE z;bm}OWENAXi=nb8PGnRt#c4+D)5soFB&tNBva@mNjB7Iet@TbNHh8(F=7tjO?0u1( z1Us5>r~w^vy~r=Ml*QYX{~?M+(4+r2vKWjjoszdWs4>&lGVj-oJl=4tMZ@i;YFCVpd&AZBjF{>rFEvo_K^S6Br@9R=rzScvx1QP{1DKkL>yvndPXIgmt6)m+>fc14L z4QswjqO>fTcVDi-cfxWlm>sHkEkJn&;Qe*&sI@VRk|5g-cs~b5w0;Hz1uoL78IFgW zCAEgJOXAgdyc@}IYL|@Q%U(~-k&kdl49d!;=Io+2{hsfFP%1#tS_4 zR>M|BE(W-#8LQCGQD=b>>T-_nafks+IMb8;ziBWmX8OV`k}rh@H!P!3iAe;r(ky}* zcdnH31w`(>r}kfj+7`$-@{8es?6~)$=GA>Kldn};lyU$EB2Rt`7eTqR&Q)VLs8|qq zC7ea6lVyEFR&yki>2LfzDlZV>Ib&3VFDF3x%*Fe1WV6fa_PCgp%-8r-eK+S+@v$FGApKw4BigHJS)-VTL2ZK`*lrSuUL#WvkcSZAjVcjp@&; z)wi4L?w8lzj^J{afK|RE=ei6j@nl9bDDBB@{U`uL<6M~Z8Uicvjpd zx3_bF`K}b~ll}gI2Wxu;b`CT!!ZU;+v)T7+dho+BwZxImbhU2O5I56MFcuXNAqc7C zr-0l+WV}Y{F#?uy%O}CN$ZOmyAU5|&QZH4fs7N>V(a1UXxG&PZwwn#XA@h_KdIuF3 zmg zFJGrZwLHhCbO{kbqC7YnsgwYBNjf5x8DR#KXT6JH9o~D05ek$Frk6%(r6xS&zgc=a zOCf5*C;;V#uVH%EEt0QA?w=G7#}Y`X3c%!sHt2^MHKADCh(Uo!j{hF)KDz$bUPP&; zD77v^m|T^Hy8#udU?5?5_5HCmEPAP=*2P-d)ZGlUN4|Iji7LY+)?vp!cdXtc4_zh~ zXWP5~OQ`Mr`j(zU%{G&{xd^Wa8#1f3sblKussbn(=N0>sU@5csq7|W}CehWs3tqJY zn|nXB(%+o1!Rtw_>8rCY8$L*b4C{qFh2WICcNHL2y&6@a$5@PYr3MgVE?cWLTVL|0 z?9!f-YBETFQd?Pf9cn!v4xcO3HYXxEXGSKjO{=Hm0?dvwoq;ePld6flh@TS3cTt&- zTMDkVDt+8J5Ez%~k5eB2WNrpbkpb*IFx6UIFlqfT!b0rh$JA%I~OBG@tN{V)_jLecnSNq zb+uh6?+8lWGMB=hUg0smbHx@g001BWNklMKt)|FGD|zB5KnaW(!%Uy z&AmMvxl)-ui2|-f=PdYD6t^>9^yaku4Zs6GvSe4@8er-8xZn|y$xz~bcM1R4JoPQvDs7 z6S-Kcw)GYa7#Rq+->T{C%3REL3tF+L>}rz9Jx*F=h|~}@HTP;|j}I?b=?mNnE=9RS zZ8FDRJoYY~g9(sB?(!=lJ6jM0+a`c0gn%`+f5J5x(Y?);7(pT0q@O?G7vxzLcL_UI z#L!%>DGTpLh_WX(xi#A3*+4xM0m;7d0Oh*^0RI6IJi-^oi}c!MS`*aJ>b8MF@{=I5 zcrK;f(S}tyKv0J&Yjc_YvkAJ6v@Apsa(BNo&B$w4xvv_CanB!eG%(cr(VF@Cl%`mg z%!|8e!D3Vbd#uVBHX9bZe%7l6j`xORd8q{bA5*ArMoXp26CEv;CP+*X)43KVWtP@R z8a;|I0Hk#9(iRaAl?`;r1MebBJ)YvBnMIMwbw%M24wsxb-aIJ-jMKeeYQ(Y^J+5W# z`JRkB5;}Otng)RbMjr4wr=iaK)tZ*=%zcT&igXY0soLI%BLH}Wq}dqP-$O7Us!AVxT{a$ha|A};3A=XmNE z14~)l*y~LKy(}ltk|W0FF-2MsY_Y{9ff~HgeqwTsd}M}O^Xj~)Io5qKnoK+o9pwm8 z3MInPECc?WAoB!5m}NCIbk=_**oe{vd-)zv$RZ7ahm3H?eYr5onw}>&`jmaH-LMyDTM$s+x2JC%}vrW-9ln>O+DsV;gW5XV3{mZ6ONj$tzqqajh_!!hSp}t6smWVI=e+?a8Y)ie*jL@agZObANA0{5 zd*mXmc%DC6Tc4JlW|JK4Se_U*r8W1M$DC?@Qd6$Sv)=*N9u`rE?T4cP&knZov zls$LNEDT%WEpx-#khkq@uF@kM7HOsUd|Ak3lgrRioOJSwbv>b^J(vo~g`*dbY z${n5oN6@4~Y_SkFDrDu0DQ1-A(^5tTgawkhYboIrPVD%>%Lk^if|UMO!G!r6Mx?S( zVxT8j%!RETs1~IG(knIpEsP*zr3*F@*j4_t%`0B8-3FE7HZ``iVeZmsb(naX7??y} zbJ6Ihj0UUEiZH6@JmNDVciHG>r6#$}m*`RwC=yuWtp$Ie0~fm=|I(qxi5#7ivLnOU z%SKm2*BV0&&Z}hV+FB4042;Ok97QT#d31#d;I-R>pO;)>oSaqiVHKM=kmk6neP)9{w|nDu z1DH1h$=Bd)A)9fzdn9-bjkLwxf5Q3}K+_!O($OMJ?T}akMresl`#ihje z8U)+7l6;HmG%)`5su6_l;E(H7jBQlkIDiQJf8K>}2+_<|X7lFWODAh{=8m$tI>KA%UL4 zdAjUt)nwkb#p*vufL%5e~yMd%{j$hX@bKaG+34Wr&rMWK(> zQg{X2OL^j&VZ8`bxxz=DDkV2p0;xR1gTiW0*rHgi=Ho5Sd*W#d&U!t`?=lWQ_9nzEt-f>oM-(l)q@|F`vO&ciPrxLvzU+NGCb6LB2J`BytaD0m$k<-~~%{5cFIM~$Vv zBePN>-p=a9NS3Fk9#)SqcGa`zX)g@LD)e@vT$XVXOqXM!O>Jc$o$en1Qsz?0y6QLp zN*N#H{K%#2GIQ_~whZ_I2i;^E$x|9pJcBB$ZhNWA)-I72X*A^F`ZV;ZhfrJW&Ar z@ZVh@DN<#tH_Zi>Y;9&O@ev#W0Ps4l#A#l>%4y^^FJ|%dj)f7H#uRN@PK5Ro2f+)O z`@5)eu*!`iO;pT-ZV!OvWiRktwwIo4erOA$1Ckjf-~+h*l=)>>6puu>uxtADQoGZ` zH*i)W=}AJY{qd*aUZq6q8!S`5&-LuTNtU(iLJ=XbsW7p&wfB-$VWSd|H;E|VQqJqN+)2IF5^l zf)LyckQpL4ik(o(fH<~#E}<->y+6-E2)JZOJ6oF;Vk@(GUIXPW;9}Gh-~pQabR4jM zd)VJjo+esvC^IS50C_LP^D6m}hoE*LGVEk${ZuSsKFsDY4y0o&MkAW*Fgs&2RhyB> ziUPr_NJ1oh@xpy8_EqWvVow$O_l3+Yq$8b3=@Un6kzMFh0|YA9Pr@H2L{LcD$p6E| zzZ}O$FzAQDuk-_GpkGs{0XQY;hK3N}7SZsnEx&X`1E=kPd#23?S79ZNe}1-OnQHRTJqMt?Cke^CDTmLEF8WeTl1 zk@30bL#zcS(-R6fCNei{|z9=Dn#rQP{TPETn zF7RMlt%)KgvHt*Qcip@+;DC;EQDNJ7tm9C6#66rOMH_fKW;CoFF=5HW z4VLSQK3t;vLT$t$^;}^O_)C&1?Flu?8a3n5#!aJ)*J>rwF|R)W*L$i$i3#hQ?yLKxnYceYjANU3_W98^7L7V zlFje&&BS&@{PJ#CitHVpj~DA0ffv0AM8pC_sy$TB*ukLFkT5b%_3|^VUfZsEs6Ojj z5nQ9?DKn>?yy#P_HQojHYPnXr$?aSK;t;H>mtwff`CH>(_Q_@nLW}JAWG-ip;5n*? zw8PA4QruZ7BZGjKzDuke(-k1Hv0pDENz#tQpWD`VO z2APZ>APgblGgv_hT)`bGqUQjNl;>rSZ6pG2i?wio4e))90*$jT$%R!svIQg;l;$L# z6Q2vc{7nOBU&E~pws$$Ho^%G_qWB>vuRVN;Fik4kpieFSlw!**p$fhhbNYZd##A&6q7m^jWF;~5-+<~=s*!wEc zh{^Yua7WQ6$Jh1n3oz?nkI>oU$Q)FWe6tp1>>Y_ZtH-5VG>+88ntg2)%2X%~${^FF zq}=P)A~NA+s~P3iPrX;%dCFs6O+C-Oe*EtHXM2O^3&ffn0@GnE&v&{#Bu~+vhsq;y zVwd4<=0k=%t&XFmopXi%RF{*1CU>@m`*OA~pAB-=GOu?FOO(9Xr*sQd2&GfaC%N!( zNwPNNHYBZRyAOm7MXlKAK)J=8qxnv!Qg=$h@2?93@v!7;pI6Ye%4@DP6sK}#VFc@u z2trgkqd}=4tAynYwt-rI{g#763!bnREIHqBY|x$8LFJ0mQJz@<wHYuuMgHn>1%V-pWiIxuA==umK(VuSj9{_>kTnvSMFKk1P+Uup zW?uA&K2770&h6YWQ__<(ixiynOKC=Q$f@2>w7g`6?kuwDVYO5b%XldW54-BVB%V{H zQBQkFi-%G!7Mwr85758^JjBY9&>PEir8{sX(@DJ{9NxZnRTBMsee*rSuxs{C)nqAK+8>U&H@oRr zi5tdhax3P_ZvC#bBjcU;TiN(8f4dn zn7Y^Ow}-)j6)o-sUSkTS7v5E50jii0n;vww2GFnnLg4l68pmAoAOr;Uq5V{Rg%wg^ zY5EvFekIbDYaAuND$YgyT8zG`)Q)yaY{mwFwPj8Ot}HO+X~?U04zKj`B&!<-=9jN7 z3?CEEJCrVff_uWO1AbKMmz8%MOVL*`nkT;RV=e(Bs(e+7hSHwU42tkHCoVjnlS!3= zsAI9SIy!DzyMLf`YIx?7{dnQGFDt*Y%9-EH@QP>kg0%Za*vQ|#lU2@RnLXkyd%%+ zPmzaEsgHdL2^t|;(y zAOB>;nmTpGC^pcJZR4?V)EALkihAob?ir)<#FE;Oc~!VETczr$OwTEbH74jL@c}n?|4j!KTl>&;=7{=px(s|hu>Shim}?~2(rOG5sMDntI8EfIk_Hc~U$-ok?0IMWYw*QY& zD5}H;aaYmeS&tOx7eTtq0xMlS1jQ*k>5@m@YLYa#Br~2JR~a8z0=zb?p8u~Iv=eNp zIWK&0jE@?tk&RX`UFy=w)XH)kF&D+>psL+BvTqgbgvJ&eC)%_W!(qN#@#IrGSi_o1 z#3UgOTzT@HUy8j47}5jJ(mBVz<)#tqrZE*4Ve^EW;xh)RiGV(C&jClFtMOI`)@ow~ zgQu{hukL31Y}t1G@pcyjr1%1!8(PqG(j#?K{GY2 zu?3D5%Dhh&%%^Ib5Pg(*uqJSXL2I@^0?2WYTt zOBt5NAgCDpnma3}+6^E*qB&D_-02Z+g{WkS43I`atmIp6bHeJBDXOOu1LnPvyruzE45JztdkDg-_BxQ9o@(*)F;7_CELfH4tK*x*K7yaj4OVtI@Xtofg&%Qdt5|W#$}4W}yng)x7T9E_4j4 z7IGVQZ~Fk`8BGj=oT975@G_%~;DsLT`(0Z<{t9B_UDj}8ww0U(=6UWV^oXNeo57lQ z_DO&1GN(M)S@n}7-QvVI^wXS<0SDK(eG@`9q93PSA-YvPoTC_8Mn=UYHN@^zX=CTwJu`9`Ss-s7EHp~uRf~gE+6KVmL#m@2 zYaGihl~Gh|e9Ac59nwN?1hvA@=5^H+VroVmaucFPw~jaiC6j(A@>-;@W%zMU;1;x& z1|JO^ATMP$yJ5dn0&0~OnwFCV_c@w_(VFEmLy zL5k~xIv}SGlG2BHxXpkWNOilmXwR2H=2{#ZyUi$=h&NJ2&BQfh*&BJ19<~Wl2x zMn&>@?kzCoDh2wv9!l5ZFPx!!bZ(1pDD^U$vIQXy98m ze(ng|D#1>C(fskz=K2djpnm zd!`!)hpu1?jDTguN282RxIvzQA;^u7mH}U@w_NZehn?ar)FWkt1^ZO?($3X2)0auM z>18^$dh$xgRoC~cl8Q?IbDQ3my*=U}C5ub`YknUxG>{qSaze75Viww8`zt@i{sy`AFLi0vVc6oYuI9)eMgFr;wJ*s9;@@%qnX%_s6hy14}~9-gAIt zdd`_Ieo9@^2+n#P%!sGVMpaVLAE1seE9u6qsm8#TIhJc{E()jI9C+ zF6-PC0|;bKZp}Ryu4~x zNdm91)x`>!S$cu}LNeNl0g)iN>-R97D@sAgBsmlF{yE5iLE$y4R z5I7=QF%b4V2nyn3{}BOeKx@^kUCtMZZh*WN<9+|oc>D^_wl*hzm!G#h7Bth9Ib(4-|3JEt(v#FXv+Rp2gDm)CI66zi%^*5g zS?3t(hZ3G)pgbU!s$N(=QWI7%Li)ao3ry@S;PV3rJfdPj(${gW%<)LC-$+G!pxRWP zIxUFd7&ggLZgP#TwRr`A&*I)7aAw>wC^#vtrPQpNy=kxz4dKrE}I^YtE|5%*go5h>?-+WSfAwBMv?-Uj*P+%pH^Z zk-P0pdn3A&n@W|0G69~aZ6vVHSnFbfbaOiJ2ESnM_wf_<1-%`{EJ@NRs++1=S6jhL zq-r{yRyu*;tG;cTTHytGtLYBrCXZ|IK?+GaMa07!8=;YPzD^bS{I!Noc9;yba%e;0IVp>Tu%dL2Ds~tDCP?p z2e(?tONp7bCNn$y(yBy5%dc7Kz{Zw)3+~ohLL{nCXvI`>c7b2_@1r*P()+4EYeFN; z9u}QOc9=-2^j|^Jw`=z(6NA&Y@i~0=@aG~}z6sQf@g}Jvqi9)`$7{N~xmto1CD$?r z#e_>!vV8UreOSL!h_jO0LCM`~>9YzD+~t7<82FY54wTQD^zT;oeE#~ETTeEC%$=U& zmzfDx55dw!I8bG@%ejLhR$qoVe3@=?LN?+it0)aCr`4@5PTF{Q%rn<*>&<0=d$&n9 zH*!u~n2ikCHhmMivSe%$sW75F72({JURJFg=P1HNvHbB&$#Ya+OWLGPSpzfx9keUr z&(XK(jVoM-misZP=oX7i&E4xgA}XPuUV{V`v~8D4*h8h$aUHrIN4wY zb~}rPC6%F+ViQ=YMoE4OrUSWcGr5EjY$bqK*);^}DH2Ge5r<^sSQdl4N9XKD}D4rZu%Zfk4)z z=_@)5I0e^8vzDUb2*7;EmsZ4u3R?Zd5i zu2JlD%j&5bnFf6>6kA4i(P!PIv=h=gEL)9(oHQO7xB7Fy2YGWqb3|Ju*!9v~32c2{ zqnq?En-v3IH*?hpGXmBOgWlUPV^Eh0gbS| z4f8TyjG6i*IQ>%27K#Jc51^%~IVaFYr*NLJR?h8h77BV`oPwS!nY6aB?JT1VwmKAEThQvgQnCVW^z@;EA%xgnY==eV-81o(14Q9~;9o=Ag^c$46ag2`3X zF{@ky@K^(XQiACa)c|ItL@y!l`z=4-)Q~Rhbu)Mu=BwRAl;B1KS%;fR*T=&L)M^UN zZxg68o2w{dcFcBriQOJxbM`BlOMv3R7wv^}YS`YzQp}f4VC(bNw+q-We8yShUuue= zL_HN{PeB(1h_JY4z;LYLl>Qs8^R;p3<8>k62YPCL(pF?el9Mx8>b|i95gWT^e`j;* zSJa5oMkrH*tusnALl$y9akYK|sscERIGu~N@pCAV{5{tlKt&|btHUZpz|zXwj?y>+ zK2L`lhTAV`V3N`cI!B^GdrvU5l`kKw$<>rxLmv~JB#1t;Enk=CKqA~OGpjw&eV?gu z@BlI#w$EgbrF-IQL~Dh)`-8!oBpCISdxum>?z%k{QLMtNS*y^iN|n_E%glt4h{mj{ z7Tm>_K%X0$)*V9BI&XRt&_bKr_JW7YZhv;7?oq5XoT}_qwY;b*kUU5SUq*k26=4*0 zJ2Z2F%av5rj;?Q73Z`jldj>o~T}L0r5Vk;WTotqnJr*0-axovc1kY1b7zNfc=PG$5 z@_<9)3nb| z8=GFrCZ27l001BWNklA*(Rh?hVnlqsEE}ai-S}kl(&8vl(&o{I} z+i(t1tt_k3X+B|AA*O6ssO@-=&MeqoDsR%~eaK6`PuA#rZjInG&qs_eIZb8}!4~ zVo7ZDy_`K+pXZuZH)S>;!zGOY$=by{0|VjTtg>}5=sxUE-cz$HQD0wCS2DW2Qf zbea&`Cz2I4wM4|^$+tkj&EpreEmYHChU{D8N8fYSg$PrL0PH$jJy5a^MBIi?WaJ(d zJp@cJ;V7PuP~rqqJ8-nDX}wna%RdSGU{`hAYnxf&OtqIOus9cxQ6zhb^+z4}bm{i{ zH(dKHclBwzy=@2#!Ovwv;tnrW##*)F9&TZnPnQi>n`pg_^XX=Xh{JHg zjHH;=)ZR?3dP;Gip#xD?J2-@Zy@=qm#K)JW%$%9h|A;@%5ZG+hfD`5P#bYB$ur&4d z_tj%sN?{ytyRHz*;YlpE<3KT_aE4ANC7C%GHMivz-L>HWOF*>0YzRo3J-8(@K6mc< zP7D6t&8vd8Qa8{5nG0XwQET);jV93|#*o8^5v(}WY|it)d>ixoR-R%fZBYCzIP-K8 zM;3@bnY(n8g9%|P`?QTwo4)@>FMlG@_1mj!lpi|ru0{LsOSYqdG_6*70A-(cdJtI1 z!KJD&6jpJ2E6Mbo9ylb{eB+BvT$c;9n~(9`bYL=CJ#LnuRj)!ogKvQXXKnA@P4Hlr zY0luI%aiKmQn1MqYW)NNvjXvCV$Mw>y~^_MmkJPWDPLoZWBjw1+t&}H*ghF{TwJq7 zFt^aV$sn_UYnA)asiC4n9CP02gnsGM{((}Cqx(|=FgPJHg|ER3YS!}+uM3OOXRZHx zUB4$*g$+skP92=yqa|s?+vyp4H-HAZNBARBU{a@wYr!}8bOux(pxvB4)%Ib~eWvrd zFJVz1vLGPDDJW`3EvZxksp4SMSoO79APBueYiVQGHH?71RBaPQe4V4DXYY5a1(N;grH+3K6x<1&JNrRtj(tB&(UP~*PXual2>uY?Bd>W^G^)&B2) zWnMPoiUDcVSM9y%&Oh~SQFIkG<`lclsc*8gF+0N@!c-1ZEfxoNd8$R{^4ZuguUxVv z~E=UZ(p-mAT+UBtE%(!PfPkrdu1nY!Ip%Pwnz(X`i@( z{R0B>TpLcZ4BAvDo_iNQN%Cr@blmBIopqued-e3y&ycLU*}F~7(ppOev0#&=tbe*qm8=|MdfPxN~Z0)1=bK*%(#D~ zz=5erA32PBBIokuWwr*R7raeIH-n$Ki-V|L2fi(uFRd@Fcei;l4Au!LmB`upqFC=w z`RM~s3BsfBxuNuQD3Wq+x|z>X*HRI;F5NQmsDFfFYh3F=F|hvz_bnLpy`kNqCD+^h z`oX5g`>A*KQ{BT{2e7H!A^pYmS@<}Ed%0vo>cT$R^%8K{Xp-H~EFG7&J9d{a&9VmF z&@d3Ttcd(>|9?D0r-~O)I z`-Y9MPxk5|tJsGCkJVmaZs-|)2!;4fE47VGvb6$O_t``)l-U}C%2ObiV5K4(1<0fq zWtIT5+~!#fLnKtamVggQu(k)gyb-@g&y8Yx0IHr6#(~RZ932(YXA?emuZj>`!PK+7 zzxbj6?;aIPAR{Ctz$#d$D&tbPq;&cVLBLK!;t8GjiWjbh>(;#{W5``UsdADMS9TjO zw00KlFo$fI+YX6-2#wu8LEUzLcDFs0B0Rh%o0)-7m`j0A<+d8a2R7j21MADRf9six z7IiaTMp~ONXPgls-pi?zp7pB{bvYgaC-wgJlV(=~-k(V7Tkk75$~ym{Hd#sl&yuh2 z6MM_k+QD?+(DQe{ycDnyN*GJ%itRhv^Divunr-#FWRDtWAR z(|tT_ROW%x5jzgTch?~t@I&rA&eHuL+3OiHPGEo&a4)ne0m0o-M<`_(oWxigXnQ6i zu$udtVEJmDCq-4#5X4$h%=p;_buxdSi}F#(oLGm4h0Fx5g`t@0ShZn4_Ocr5^P2|0 z%;j!@en*FEKvm~`H#5dk*@=d2k?5P->Fx(xk@*_(x+Vhf!F83f5`94=GZ>M( zsyByMSSRM>%KUewRAb=Z(sPOQ0_>HoXfy&wzHNfA+$LuDwO=}xlf|m+*48BWVvd0@?y{g zgSI^z1ehu~k1b@~I1ea(S#~hd3!J57dTHmcF{^3LsAm zvz3bbZcx(dq!JtT=n61X1YlGQJ#fS!c_e62EP|m?5!Ge3oCZPSMT($j6_tp0R)Bz_ z$zpVJFw(vu;$B!9uf4H7cCN|bO_o`vZfTP7bz5hYgVtmT_mY{3NXV!TE?40M1Up1Q zZ{VbnG!x;}+6<#2TeBAv!_8?dXbcp;NKEOyn!Duu;=nW2pdJ82TWs8cMwa-N9W-kf5VH4N=7 z64r`rYT?!pMh*jUEqKMZHlNbciH7L)lEYSQp>Fi^pW$ehV zYJ#b{%T%cA;x_Z6cnm2=%Bnrt^Q6SNELM%H0AIi35Rjh*Wo0kTE5g@Rc26FUweK-^Rl@ zGKr}6LSm9~PD;_mo+75JbU-ia7wB*uqLFbD8cDNhWbbx)oALIda1oqEl$P0;^cqs# z5U3RWIlRE1-F7@mU!jZ+24SfgXrxGC9P zN~}~|oC`sMU%(OdLm`l2Z7Ly+?AnCsqDb~~e+zU)RF{^k#h}O;HqPM=Dy#(+rDjLC zxwLb>{W4h>yEoM+&|6d2Y+=acOb970N6Huq9gq%IZct0_!&zG?7(rTM7)UJv?rv|< zbKLCK>>Hl^(0R|@C^mgcE;69}3gZHwu02css}HM;*=DUJOS8ms8`tb6m6YXHe3*x( zaPq2xfuwRQsuRmm2<^}dm&=^yI}?7ApUj|qvGSFqeZ#}I^@nHk1mMOK2?viSw8+)N zUfG2>BED`{HJ8RG7ISu)teW5+yjI^b?CzNj2p{p%^W{7#3zeZ(feOuW5rGR)o;gr+ zmu}t0#kAR(L2Vni^YW9etI~jBUtHRl5rg~o0uh_A=+_EmYzHPec~;;*DFM>t(M^|=7OM8IVff11y{g245p}UcwB03nEmJ-(VL9in=jeN}nko*9{Ob+cy@hs$l;}v4XNkQY ztOfUm0Yt5F_xbCHCF`)Ksd&4qsiWA6JeHEnU|VUR!bsPKE&|H5g>}fM+$F{#?<8~} z*E*S~k>IhB9pFn+EN(~6zqYma86Z-FIkQ_-!34ta>~tq{FI;2j2TP2g`SrW;bMgSk zFN@c!XA8R(YNcn{a&eMen?nrh ztS<+Pu6v+6`(yxD%|z8{Qk#z7Ne6 zeHe zY5fzTXSh>5v>||~kdK}=03)@0MH#25b-)cy!5j>jdjR)5W0Os}{3TY>WB$1Hd33A- z9+?irm50*B4SkJ_no@{5pji~tD+O!AF!b}=~l{ z4s)^AVHAd@xKX8T{cZJ`iYH~N{QmZ?!;nz1>3!nV*bdq3d{0XF^MuUYj0eDqu6i2J zFsrQq>+#nqAR{@H{5*3r0}WavS>jkH;d%0E94r$0Q`QkC~__4F-z z$x;XnX5gjHMyc)Ci^sZSB!&_ns(Us439=Ca)sbA3x}V%`HK-FXWlgCWgNm4Zv0sWD zYBuMc_YTBljh$Yp$!F6KNEQHH|L>`KfNlZj`?Jx)8(x;L^ArLQwF1u4O2}Y%l(Gyu z+$_MhTppd-**Eh>8XqCR2Dv!Hoe4)XGwX~}4nzaoNWsk_k!hmCkyfXp+0RYbXHuie zvuU#{Z8r;YMgAIERtuNs5%WH_;l=@PAWy$_d?bb4%n$ZA!V2TNc9Qi7k2|_;{t^oRY8coi?R^d-a~q-CIf9 zV8n4OH8cSxWkO29t)JLiyU*9(_DmYW%kDd{Bb>Y+hRGcpqJ3 z$+fcOySHD-@GX8m?-Eu3c|02$r~K}$>^Hik+P+{bJ(hyR98azHInDlqSrR&IrQxL!+# zTsaUZh!V=MM!S^gqF^-k2HE{V0J$r5Bw`*~uYXqV%FT+0KJaE{>Jf% z>di!%4)nCu`pGix6RPnlHoLNjHZ;leH@TLEnw#Wu(2AhAs_IRtuY-A#WyWc%WTG@& zxujcdENVu3@DB+LbViXe=@5ZeE@e@c&>{)n(8MBFbU3y-W~mU>sVmn>|98EnQM$i{ zWa?oe_y1rOPp= z8t(#90aZ43@j~K#@ZXAdtp@c1Dqw-dGZ} zmHd_VlMyv?PwXTE<|KIR^#mvTY0PbN=w-H5K8Pj4aAS`-hQ}4#6phwFi?Y|rOTnw3 zQsE}c?%Kt_zNp1DnNQ05BBy`k+Z(O6u|&hpPSz}jCWH_ltuB_uC3eF415VU0G(SmtuQ{k6SM| zA{JN6v#B#~edtv7>_|P=b7q0JyrNpxpltkkxipe+OLoTUwKgU|>CuTBKaBX>sIhWY z5ZDxVPSzH9ZwY84`j91>3I}D21~`;hgs<>oDS;Ri=gS@`GK3NRI$v>)xZ{DDQ5dGB zl9R5Y8{ZLc4zGy~+nsE@G&9F+tbG?4gatN6dNLtRbLPv_Z3%)JXf7m`)O^kCEt4o`StBf29O9jt!CcwdJ=7Ez|Y!_rk#$=40) zpyqbQdL`_XsS|hj8@(D*tO0e1iprdD1(sF;4f9tRI$BAT%4lYSw`@mt$ICmO|6P=w z2E{ej*Iok{rhR9i$|v~}>BV>R{XS*BKJ5(v3$q|42rxM4b7bj{8Ma)neSUU|#!^Gv zKM8pX=&iDV&eW2+u3+lvwoiQeaDE{W>g^wiRBL#if{oJ8icB>kK($Jrh(4kDL#?3& zsRmW4w<}Gi9c(&$%BXde<~H~;ES5XnJl5}ZR$(ItF~p+}8;WefJwtQB4XOJ;qT+jP z3+HX|p;u1+Q*db;R4K2W6NJSQoP6W#h;c3nPo>aZLSFNC0jwZFe}XaTwr<<59xTf1 zdYTJ%P_Xj)cl)tqyOh9mCe!3DiC(s>)K3?&;i5S{leaq)e_MaLY=#c_0Y8fwMs~A9 z?vcpquvCw?dp8vGuD)8}lfedfjSaafN2Y9XCK@=>mZ)bFO~&!g_@c0wpGk+2|K4#Kp^tX^Hd5UkK&3IOwRreVG1p|3QQ!zYOj{k@_eGgzd4Nn5)Itx zVhBp?A5o~-WM~HnH=M*J@7^lAKena%*!1kqd}A0c#QAV3RZk+UAn?5}q{?Ah%+Orq z%1zl|9&wJMu!>vyJ;rJdic+q%10f+fOTx=&My*0E?Y^`;%i!s8aH@u?Ck(}p3Pr0s zxzeI*$o0#)hTE~D1xmDWCn}-K4AbFV!x>BGxb3^kAd5;YwGbaBt-by9K|7m!EI}16 zu2RM)l?s{LZi?BT);W8B>ZN0_vF{~uHwIEK=|@^aj(rks1=CR0`a)@v5-5@EQHqG_ z+HzVO)Xti$RwE(Kd9tQrere!A9nc||@Q(O>53?eoM4yD72I3PBJYU;NEAQN`Rra${ zm0nmx7)c$u@l;t8YLEA_JOZUMSy(M>bCxTYE|q_m6=E+#+3y{nKHShrt@b1X3!e5Y*))0T!jm~EX{=H(Jd@x`MbzF}x)8D8 zj;*YdImREQErQ`H*tqwbt&wjK#~w#@7zz7K4Y-o=LSdhXSm|!AdOwa>h*-|rnqLfO z2o(#tjc0yPTeCNSqUQarb6cI)6MT9tqCC(|O)DG&UvP#?G%MTitCG1$1kuJ~1oEN; zr%Uh5e*~+fhS4y|tqoScM_6`_HQHQWNWM^(C$qx=F%m3 zH94VbOqGA`*Z>RVu7cg|>=fJY!qZ?N%mgZ-Rk6$olSz?TjoFOHaYVJFtTEx#(* zE{@?Sxd#{>>GWI^ic#|jsHuB7&TL&nENdLox%<_h>*UrLZXdxrj?P3hNt#;d4X|mjC z`{)>LB&;5afY))WS#!0TSmT;Wtb|F7u!L{`NBNM=gx#Wq_ds~E3b=%tV66pLDs*&q zOHgFvX`X|=wT{dY32<6^A?XgC@6 zcst%YT{vR{MyJ_QXv@AO_M*@y%$2c_N5@-r!WP-{U9q%{;n+kkNddPBJeC}_fKf3a zPp%nUu=}F+GFBy7BaB=f*C6c_sZHLR$JXENCn%3FF7yXT(Q0rkJuu>SO9Ys+rV0`_ z*QJ6w(}z=k0u;rH(=789u~tq75lZ&@nHp1B9JCp-*hQ12dSmyR(RGwM-~l^IE?%`@ z3Vtt-x3z&79X>LPZkpOk7sjQ=TQZfvb28 zkBqZE2ys?$rjEC035q@X2{9#fA}i!%9Gy#1_pCQ5Z%TQI8HV+Wp*51?@|0JHtMhCZ zX2tphhfWiq1Ns3u4htl1V5uIuqz<_Bx}j8qdPM2Y6TtO&ytY_v8bgPxj)W#4n3F~` zdQ^8sIu>+5h99dOOuHl9x8>+uyoBhpJy3Yw7Sz5PLLuO-Jk;BKLFlyzB1B!&WjvPB zS4~Q=Uw9tDZ%&@f&X*UJNj0k?*U8D5BFdMBzB&sr)k;b0hQ-Js5*%ddkfsmr0=9eN zmu74xDyNCe>DF`zI#yKgdL%aRokd##ui=I|#Qh9+uQ1e>ExvV+z!#v(K~OL%f}WDS z4N=|RhGC9aTe%p;y=BWgw1aR)3!P(F1ac&_<%m_%+Ws{lDr?ev-9XkZ*wb;^stkTE z$33_wcBipTcKmC=8;W2TN4Mka6rBFMlIXz$sQR}8US&*ll))3-&B+s}Lr*(9po-`> z#dfh00Gv@E4LB~=uE;^6R#z2qtyko+dBg!^UBh0ikp}=8bh!9-oFbz9WrwEKial0@ zJ!%L#%O?)^{Twr6j@~jChqanK6Y7f1c07wUx~SM3R&Yhsk5&M5L*kMp=m0EE73M)F z!Q6_-Tt_kH!>WQ=NQIf1h1ItRKr{o=Vw#&}gI2bBmDh?94L5CWA?gQuI*s%TbgmSH zeMprRA@U&ERCdA7o?DlY?0*&H4=VVhW^S`F@B+^WmpL?)2e-YKG>_SFH{w*(e;N>s z?e6x8x!j0G|NNoexA*WQ9XisXlTk33jff@NpILNpJYVH~KNIBX+WPz5%FYv~(jL(RLc^zz{P#Q?DBN4|D7}{orM!)c9OPSC zLuuHm9z{P>#3*OD>CgrxR)}b@K9F`Ob$#)}M}*gno=NjyjACg4S&+E4Nb3I1XzTbe zv%E3^H%Xs!Gw!d5$ahyOr7Sy1i!q2pR{(YDOh%y}oin@iQq$4Y(VDHxqQ(k%(WHLH z@pbM8^oo)i%0v`^JO*}CRgFhq7@}{lHfxJs4`NjkEo1<%5f7BB6ug6{cp^g}&GXsW zdf{chy5W{Ai?AG3E)UTQEznt>D3_~&l+!3KyMhP44?`&ePRb;6;E2;v7`Pmn8CRrb zJ^M0qGMFP}#9}(AI8L_;LNdwMndoHUamP zgRK{&domAJ4%%q=XDuL~TAUrL;irC?WZ?(TV9xh!Vzebg9J~<4^mS%9HuA(<-%%dM zTv?)M!l!QV^U%6)pUBQB23ckuh}tMg4cgu!hvEn=e-56xwCgKwA?#eyjzT+LEVkUD zspEy({$y-Bwx&P@>+Wmf+5M8Z+iaG(i)HRv1(dZ`+lz))=#@@3bF6y3miQNMvb(e* z^TXU?tGJZnxikTv+3!N14+CETgXtztUR}zg7A5f~H{VA+{2ul}{wS!rA|M3R&O2fh zqzzG=mQPR4Vk}LXe*{3uoBQ_6s@bN*9TqxO7H5|#ey$L(DRZ~n`%p(2lsA+k+tQCU z`h3#IXDiM$Z(Rvl9TsQWjMS_{;9Gc$CluARfrxHrI!Hhq&*=cxrcGA1C|{rQ6+xSo zo$s1wXeCo{qM0eXj<3g6Y#Gv&(N)uc0kWnf-tYQKGK#Op4@Oi}X@q+2qd<|MiY#!K zF>VUH)Hg~iF`@){q}+9OT3N^3c%rq}S9L#I*NmCX{GX6D3r}lr& z;b~CzvF6Bh#Ols=9@n6Hlue599AMC4bVbz$j8OO(-KAq4SKOSz4)rt*pUinTv4UFM zf3bip5?RfH>1z?VufVx0WiGB=y;|RX7!h`AV;LCYPEP^^X~c095y~st&E(i5WW|nw zT`{f%Og|IH#dYf!Z+}=vRLHmG_BxjF$bu_S9mz-0HSvxQMk3W_or!p*TL|hk$!(RW z)*@YLe<2F|N75x$4&|}2(*F4XcNw{NPWu#RDw=o)h_9^j{i?1m1N=m})d61>`#6WA zR*a}%<5Mzg(?`S$dJ(VGE!*);J-OYf2xHlB)p!$tzA6e`eQKLGPQwT$$OyIPHcv?> z6t*RAs;$i#4ZTv2ZTW^0gD#ej>;6fEvi@lm$r3=_wcR+7MCR zg_esm_-c%cP&%(0U)6GP9W#Q#qV*wntwhx6rSm;a>+Frn0Y?dZAWD!=FDAe#=It_rhM+tmPn8^G%!YuM@F21(b1jp z>`pyx6R_Fcf2WJz{)q@kzl;(3Co8+lnsp8Rbtgy;H~8ve=W>J}Oy6Bo_hgl|AOrYR z)2ZIy_x+&u9)9!f(-d#7zu%K$ll+SaVWbKl|7E*{IAIZj5lCU^94-!s;f;2djbDt> zqnAIAOZ{X2bT|yLMTCz|346T7w=6+?R<=ts?rVz{x{O)XacElGH`V_{r^|Jij`{j_ zGt4DV;dubw&rAvViOR3l2*CgT?vs(O_#?vET9mxk!4}q zjT=ba~ ztKMzWfU*~}$%TsO+a;joZz-Jhy883th3xh@hqLCc`cl)e^S?6P5PuAjkznq!pl_`NH*ldh>WsFCJebas8li`}A zdgAVRQ5EN@uB7)P$XRPC0bz8}ELbLaVE}*Udei}*lsm`2bMh3pfsL`O(h^pt2h(ocP4w|oQ%`$U=wr&Pj&^~c-XU3*x&pWihVmS)N6LOxB zL94LJpl?}XTpjyC>}_;YHTN50N;bb?%wy8fx0aKxI8QrM-~*^xa+l4KlxLhNU>=of z!%aKWCQV}z!dx1pdoR81cDUt_;(9x88?rd?y0Ttv? z6`&q2U~jGuiIlQRXOuz{^g2(E3?KmDC>Ju*h4HR;`@T*lc&2ujr?s4#r3SEm$wX9v zuBKjYoA;6V(NJN7Rk$@u)qr3*rZPVbR4{Ao7-jj_kr{zP%04p_}F$z+yGra~FxBv)D zx9673dbsTN%lB6kuw`HjYFvw@*x>V{I^PA~!6M6@nUINOa3eT1!s<(U3bP=@P|B67d; zwZ=;9A$@}HWby@387PuSSy_DR9u*tA?7|LdVI6WEj89?^tUK8lZ(i8oqWkMXAME{! zDdPl7(q)33I6yb^GZf)V=^sdV=jS8v1bBkf3p*EpHAE~^e<2e?~ z$Pdc;FRSDG8$MlA9Y0>-1RTRwas3`8NcvRn7@(@=eGtU806^=VyHQj+ut>f0bSIJM zm2B%pyh8Zn7_b&7uKHe|MCf;Ef+XPP8u5>lbj_1g0p8&-DghA+=-}$-vQ6w-L*0e+ zdOEV4k-?2CR__++*xo~HoYX)VI~I=dit)T!Wz?LmYOZ6;hc!Y~w(#-+?&W zz}s~jOm^{hDyH#axT_jiX=&*$ES*4$bdi5 zEssY80@LZl5&JEgYODS7X=;`g^>zisX%_*8sQcqYF5>eL6m?K#R7>JO z%(6jA$`{tEB|L$O+O{Qj1mon`2jp1A$+~765%?dU%UnmgP*G(Scfp zw|a|npc2B-7^7ry?>*pqtRg%El^u3we|Gzw8mE))-M0qOOf6RZrPl8Vk1@|VDf&;- zx~zICgAI8xMGw{I)X}_g(GKXJ+Qy&dG@&}qqG)tF5t2IDe)^RNA*C6)93MbGkp`x7O; zaw)4=L750Y;%v(UI4ZkWi@Jot7Pnk!b*EU7cg|8Lk_+)s-CV$e8!|53lr7dB=Gtqg zha`1z9Hf7hW?U;|{fd?lrw;7{AQ3AP5-z!)-jxa2dUiXut+V*RSpc?jsd7-=L^Y&2 zTP(wKwNWEFrR>}$@BnIG6&nzm6psWpdnVG+=w)D@X*IHRc)2_sg`{P1*UcTNX0JUQIxZlMy%k=ShE-9&R}WWNyV2zN zzCnuHJ)5}iQ?GhTfUD16F5MpI^ma!#0JOs*HeTq^3b85GeZUdZmN)N~sI>`+uk&7q#twD;Did6_mX9Qg{fs0RF?)d*cgeAGH(c*)O zU-q+0XjuL12fC&c8cJS|UN#2gym0)bEvR@-VAHC7& z`qUEL{iT8>S@m_b5>(05m&pw>ODG@@z-wi+4CI=FXB{X&Rn}v6X-fB)PF99)-IZFp zOznCqUD()8DZ^n{ncbQ*BA}U|wNIEka7?H2?eJFq~egQv$zn1+b zBU~`c>gF~V)NP8+qI`R-KudbL;w>uQj(|K3o7^Y|eg2v@JuV$ipZ8SeB-hR}yo@!;9iSrk5R?>U`nJ9Ec!iYt~ zmj5dlPMJfHUVHS|(>CPBn|&`SRYiiL4_(itZBiTWAhlp$po2e+KcRP3R{s$PJP8rP zOOPksq+ftsq64_?g9@CU%}#BU&;M+QWKWHEDG-Sc60ZdEp5%GLewF=p(t#i7?djRZ z8w8a3j@U;K;4cp(-?Hh!sPAeuwU#33V=mS4-np4-_B?mal$-sE^}6d6JW4cGDX?S_ z0MQM?d|NALlB(<{rQ<;lC0|iE*b~RHs^}5Lp?`t;C#Wb$0y#;i#MAHvx!Dg^v}IUJ zLPn=xnILOr1;!dT2|HORJ62bTSZ$>YyOk&6#iSM`O9y&+D#->frztldzW~)fk)NbI zrNGDoVr+PQmGl}o5hA(cK?!Ry(L@s*IHksm8hAn|uwPI2X3~>DkEvp!{BAsad$}UE z!#U>Z1;j6`WR@v5ga+XT>y+D5Q}=Kx&HZXg>pLG~EZxF@0CdBv11=K};Op&p7XdYv zeKT@BgPA~`CxA`{38kK@8TJzVvPSc~O(DnDqZIiltI0 zh(~#D8P$}S^VoQPJY?&0CF7=->OXCBQeVx?m@ZasU0wU7rY=BaL}lG zr6+mTDYQ!65cFUIc(V&-O=X!nnnH(~N|p-d;?G*7q{=Sl9jY%@SA7GMt&7{3W`Nc% zRN>Z%eX5FF%j!$0(hZ5Q+Pv|p5FU_vmv<_6fM(RsY2lT~NGkEtC^zFsld4 zVrlQmid5C~Flyp;OtB6_j~nU)n3S26?BPvc=$MXt7JVwMm+Cp$GO?zXW_#7fT?%z^ z=GMwLI=#(#0}b$WRs&04G}`;lY7!-L*~uuWvyj(ioN}Ul|GX!g!+^2AZ(D2Ysa}^n zbR%x5Fkrq}V0f(&4ak0!Z{Y)fHLpj%;g3^nm*mv83&)lmLgfaK^v5Z>JgSNx!C9%4 zveHGLEZoXu1e_7k{}*&hK%I=1iyj1Xl@jRgR8BYHNIHS9Fr`?Y2#O7WDDN4_@OR_{qsay&_P77i@i)Hc7Z~kwB*jM;=d1S29QC zee>}tN|pk+X#>^l7}mTLW!iCHa#20e{)SC|v#KMVng0miD;=43gD%#O<+n6!*wder z2HdZ?>(-@AXe~Fp=*?IP$LR|opo2UPW*y$VwcM;IWg3&hRr8@+AL?j@aEj9&uI^{B z=!qUp8rR~+oucIzhdqu5O&PF_xnUI{Jlm+fP-E>&)b7m^M~2--XC&ZKy0-Fv>&>4G-_{4L zd;{m4aZK=ZcIuw|E6?Rp@|rKo0E-mu5oBB__`uTdUQJYgR1I}hS(98_KUGE!z+9Bn zc4;|q%;Dz0W%;f{{y?=U_ME>=z1BKHYt#U^ZFoDulk~(ar4bMvI-wU@?iwG_zzu$t z%_~7o)5;8o%N4=!l`L<*&vZGC_C)}o3hUdhlxi`vDekpe98}x?%HD>Fji5`#B(Kw# z(^@c}(1K?SBV|1o6k$6nkwf`~VRrAMu9)06fR&iZcAGydLodX+maL&Waip&q+Q9-# zmr2SCk6hc2ZcDv@=r7btY0AjXbv-pD1?44}q5@Iai&Vk0?VgjaBxMOpYL(TLkCCsZ zHD7@1A6>7%ydJW)`Jd@DtYu2EMAqn8M(c5&pc-R>i2~?UDd3A#-c}KFI`^I@kz>*sxwBu@;wpKba|Ez34EG*dkFMlVpT|(cEyP+U zAn5DFSqszC zT>4-nd3mI$(kgxfSKOZU^(#6mXCkC`=f5g)JNofAy*|BTMf^6UwGNnIU|Oufc@bAh z*t~6=-k82_ky;fCdpxbVw!t-r_1y*GRZ%$pB)U=>afHh;&tX8>*l*Xu-(TN6Xt(b< ze^t0YARyBlS$Xx0wP|INLROjE33{owU12+e8oq);Nu=^vd!Wm*s8))7Ec+LDMEHe; z;ut17aB(QgcUt9<2pSNr`e3s+B{;139wSMq+@)(MbJHiSD_3_JGb~G=1hv8+4Rx8K zR7}{GGT%6ene>ULOfH$7agrw;;EcYZ3`&Moo|O2!9yKC}3fwjbfQv5M!^&bVl9Pn< z)XSX~Fb50IVB_QrSzV*_RiN==DpI=lvJc2Zd3xn`nP@Ug=9WW3Xz;TxM zaOal$z6#_@THVEIxId8fo;}?f3j34C5a3n&Kv3IZG5jHeDG#U^RUgPZ-DcjJ_n}3{ z7IZlmLArWO!aC}%A!xCX(NV~RQh6Ep%-Z8-`C6%*!PI(&sOB8%uNo2zN{iwa$0Fs6 zOGhshZ%l9JggZChl)7+r4)UT;SG~anU!01g$lBgY3^IQYJXfxOzcq5-D5H5zsAqNi z`pZ73O6_c!5J$!rLJXF7Ki|pSciTHdE&uny*_?geIwsvUnri+C{QwSmZsF&; zr{8R!xpwwp^Lej>`kl*eLrMlX2)g2Uw3QfxDytuy{4R4YAWr6L6{1odvGfTwU-&zo z8GDaE&kpg$DbJCjIIC-c>IQI349*8qq_TeU-ZaQn9}Fs$pESis661`t=#rp_ZLA|6 zRyO6_#31Ewug0)+CfEFCYvVTWTuUE36zCueH+(uq?XfnyJlV60SaD426O%M$J~+Wy zWTR-Ff!5GNdNGS*(IRA0ZArg79m|FK9f@yV9R)b{ z*x%lHE&q&w88Z8pZg1j-fL`8ZZz^9)W{slUGhS~B0WHCEWikP|ZL0c8$pTYPKiqcdnP*!DFlcOKlBAMk}UI zQ@RY~t-M~WP<|nQ5GPxkbOf;-oN0R2i^p6_t0QY(^ihCQzhm9mIuX(C3p(o5ih6Ix zXr>1HM!qf-v!MgOq1fG0-i&#$p&LOzh1XnvBxa%wqR(s+J@*KJ0hbEN% z(+cqgH@>Pm#6U$g8M6r70yhQrHHv4Tl8!@oQLNlIV+67od8tzOokMx#lluz(HZB3I zEKYPIj;0dp$nXfWD3|-{6?`FCuGCVwR>)DzzAar;J}z6cd49M&kS%J826Sz6T>3#~n7A=7+gP_zhC+CLMQNT9)~(^*PE$Bp(4 zX&bPvk29q83(?7x4?6r?$y9_546(%|sXf>($JOh(3r)O~!f-Fv)fhaRIm~@@tRKOX z?TP{*-2z$-j5T)-sviGd^K8sIz@OhxtdvFMU{;&85JRByPJZc-{Q!R;$}s>SVJ`rA zIGCS78g#mP2L#A-$el~hF%R~<}a=G^x0^2aO8f&eQLSJxDf|L9nc7ZfsE~0 z(d7+onU=^U8y=;qc+4`)?xX48TpJQqi(m`hV$}G4KTmx>IR3RzLNP02Ep! z)k>d%zP+T@6MXA%9>h_3xG(69;~)%fvJ)2j)xd_yv2I3XafB7KQWS0t-~2s->Q=nX zl=ny~cy0V@ifu#F{K3lo+~y#|aa#sQm#IuOnjR}Ukl5C-1L>hBE5%r8(4uWE&QOLw zuR;=HcVHO&1(3|YMC$$idY^CUKtcpqv%Wm9G*y=&s{ip}8%7@oyoC^y z?o04Q?`#`k%cVS4+i6A$O{z?$S&_dUoH}dc)o{C4YZt!XCb9od>m{!P-jkOgyoEC$ zlB~5}k9}%%tQOJsITD>IxDO^_*Q?aNazZht;-&$*YAK~)(hGpaZp^S8N#`Yx#SHC7 zE-j5M%5_nLC717LW96@AZeZ(hMrAp{!`~ef>68uaV zkWMo}Z;LRd%qjU#x)VReuRJ#PB;Yv8nG!Ps**)gLnJZpQ948u|;A<2#5ul1#j%{8k z6@A(8M&FC46^kbVhxCF>ZxasUkj{YrRYOrb*UIv3F8QK0`_HG1CeL0~tv@pN+Y^>4 zP-FNXFY-6y*9?B7&5e@62ENN-Z&!$=-6r}YPlQUqMMQOUjO_XsfC6_^+3SXAgUCAc z63jf_|8~5Eb9qPkir8*p%ct3lWvH~HexEs;LA~(F7H8+6f<3Ffs6G}l;Az@K(7xm+ ze|7)Yuj7|c>q6{NA@y$!5#^*#0-$L0IEhR48|<_Y6&+cLLjvHG@CvwR@n495GxDG^ z(?Q2!ulE;;U+m>y=UWHy5==PHZR&H>_Z5Q%^LyR=OHt!2^|ZE}?m_sMFexXTCk{a5 z0i14voxhm_{DI?#>kYg~$mH(GgJT4oCvZB+7jcReCkYO8CAOLAK>z?C07*naR9e;l zs#I7Mqj&*;8-n0;GwAErgO2ly{?}i>{nh#Y`NrQm{HNI~@c|I{22$;kM|#(Gq0(js zYfsljQFhhJS8~zP*2>NPaZV_lX6~nvMl*;Biy*T|>8UtYDPRpcMAVLEM=~D2kI$ZWpc!%sr2XxT?66c?3Kl~tY(vE`IgE&WFZZS4rmz0Is z55Zw+sscLsMXc&25eV6RFTV5jczG(ogw$CC{=@@6pm0IsJc3uMwJe)X#fEI|Ge{&9 zd@LTuZ>1bEI;)`&$XEm9{?Rk5bTyw@&x7Z6YnS}BmR&C#Yo<#=X^;o z(n;sRS4QB=^tuyL9N!QT014i;vbOGte^k3)vTTILI~>lT5$>bDx6Dzu zKEl}so#6M6k2Rga5#C%C;)4kI3IaXU2)>QIf3eS*|Ng32L9O6MjqhdbbASnw> z{o8+q|5xYvuW`KK2kaN(5Wb?0lgvO;2Lktj14Iah;s|o(W;DqK!9^I=1p^E`Q;jmx z#mlL9+r{%zg%`}b8 zRTB9IzJ%7rxh80Bv^yoy>9w0C*Dh&qSm364yLP+Mlhyq{Yw<_o6+0+cJ0vc&C~V7u z`IKYKqGxn!+LZ=_d`sXpx=FYGJu9#Xs=B22I<_)67-oA zU&p%yWGlQztB{2ru_C4X6&QgDT}`$H5PL`;o{VMbvF2kX|Ij<=L!6)3MuNnw!xa9z zWuhkx2(^U(5g7zBh0d|TYo`aM&b#@+Ns1kgi&?-k zavI)dK4KshSB=N=ILSn*$L0ZKw=R@U4{vFgw4PN*v~aN3p!EF;l?5#h>5?U>&6*cV zdTLucH&!7S*^oJ;w32DU?_xD<2uf$)pm$!UyR}TntIcL<$4!^#l78*JAE}k4Lt^YpRi#oJ>axQV*2Ra<#4A0kQ{&s&F%@$!Mk=Rj$!eVJ{Ga{D|L}kK z@Bh31=j;4=yuRKp9_O1LSzJpzxCHqdfSd9PSF6`OE@et1_r!f zUo;#zew@eg%U}GfU*G@Z|Mb87&;Rm&=imMNz+Vce;~ma1@S^rdyS03yMxV3SE=x9> z=0pF6AcBw|W}<%ill}95_K*JS|MEZoCx7=B|Lw0Nf4}|x^_KX~*uJH!3l+M<;W8T@heRgkn~!H~}4p$xof{AHV(EfBKL9!~f(z`a3Vcc!0fWxZR74 zA{W;Fa>Zm{mTpDI_76%tK3c~GL29y5bXhp+VHhH7CDw7HWmJUDo@;;qDhRotLqlsl z%<-@Uy@>Qiu%`?*tBATPp^m?$Qp=AM53`wDb~~w!FCgTNmP?mDTSuZ$9$>>M2wLnT zNB1dAjclm?IkT5kVrAK~wJ7}C#YpG9)6bZ3+Fb-vg%Uc8H(hIkK!c~0SPkMhn)NKg zJg*pHC(M@9N20d(17C&iR+(WPxFEf3(|y%{aC%*j<CIo${~FSBFcJ-IBmh@BB36PuB_z7C+d1lB&PqDxOCE0-u>qjH-+CMPL&tBl z|KqRqzx|89_rLy&fBA*?xxj%om^1#}-HW11sk8NYg?Kq>`y4@8oFC|D6C^(my#Ld` z_ZR=|fALTL*+2MkcvP-)_;Koxp^J*s*TxOfrZaBk(xDl!#bx1V}0l z5HLjd(<%SUANF_uWCtJ~Xj8Iua*pSt&(`+mY0MZ_0@?S=Ed}*icP-z+BR-V{S}ma& zq@m+jT3%t|BKDVWdc1-t?2QWdE&*ukk2U%{96Ylywc@cGU3T$V`ex=bqKWDGhmdZ| zi)l@GU777(+W10|+M?27udM+r%n_m}ZZ6-k&)p=~uzcIl?hZs-f@YRniz^OMxi&Om zs|r7ifW-l;HT!+o^2~!9be?3NC3KREbKO@DvJ+N*RENBq z;PX}~Q-(^;qYtNnt@6h*V4tas#->XP#1r8;pANW;r&;9XXE40|ffc~NUk&}ZUmvCP z!_~N{no9%VM?_(39bS;s?ZFkOnO&cK@HPK;A7b~81^ERLo)H*7nd$Q5Eq6NLmbv_# z)sOhrzwuR;FB|aEMrbEd9>AyrufMd(A-VABaSOnq`a2zM1@>byUlb%3sfx36{2$l4 zI}ezCk^h0g{Wtsi_5B9_MEtZq^5#CQ_?gv0&?}1jo^>u8y_(kUn8#%Ztt^M${v|s7 z?fSysK3;#HcDxe$;gfGDDAuII%NxqHsQk&$g2NNd?xkX}G8-w7jGay^)YDM6hChWC z{UBCXN4gdElf3Q1JLeZ|uTK3*{_?CKa;0`k#$D1?;xXcNjUs6`4KdmG@HgFOk_|jPQNDv$n zGtR?Ifg1#!>YXbSb)xi;hi6pb-^;-6*5Vf7TrAlRVzB&l3amQ2Jz0F=DQIg>n;lb+ zl#Gfy_y2*b5;@zHObB0hW{x_v_R$YUE+UfuJ)f7fd_ztxI|f53|qE$|cwovc&+0+bS6 zp?P83u+OLfi{Z8_hUCwT`c*zasi=EUjD$%l-QaAx|NQmeoL|2khqd2P4P8bjRDK|n z>j_6x2XM;PYcX@Vb(slUDUhY}GO!cwC0zdYpTEMt0F&O4i(sAuSEp2^+i58p$a4ut zKj$Fo;K80{a(bLyW|zQ4AT_x7N*&Y#*`ucGCV}W+2FMRWW6A5 zCo15KK&_Rm;v4~s0%~2h9EC9& zj=_(sfVf1Rc6&k=r3-L9MOVf0{ioI|d&sNZC*iz;_?`v07@)dV)1@pwR`C;p;L*vy zGR=eGxH@U|y3zZ=Q{(x}25JOd2?e5zAPhProH86PBSCXdu-RoqTyFpnwZy{VS)Rxh zrB;Bi3txtSg*YDw7mCIohkpGlKXv|m>&w&YaZe(oz(r+Uuq9W+1Px*)p)pMGbx`#? zSISC~cjlfa@H6TiMhX0G59xaQLq*7{G3AH^Z$QG8>ES$Izl*k*`TjxUm zkBe11eB>lm-ZqDZLCpAfsczEz^xUV1azC;^N;{WZ6t)rU{z2zxl(XLv#AVnv+HDg_ z!Mn=mec*MfwwN0#>IB?E&dUsdnMHtvgCYR@mG%yBcbXUYBb?LVk5fXf3wx!M%G*;U zmkOy2P@jy`Ggy$t^2#C?!!jn0$Sele1{GpsN41&4f6W-%bYsh*Xr@7<7BBICvQef@ z)(d@aTPzgRnP`zY>z+t0-M$T#TCwIh()UdKdcV2nr8jI{pjnG4&`xUxA`Q9V^BJC< zMn1I3(78dBIKjSOi%`+0e)o4&s``Z^`Yv#vB4HAhHFr*J|d z58_xQg{B>=clE3K|EgKFTzU4IIm_RKE{*&R(+HL8ARLGNiTa__po0W?Zko4Qj6Ko? zv8y0w>xj8CZ@r}uv`yii36ti5Ks)5edHy)x(bZRhHKJw%fOqEqlP-qbBE1>Dp|%Jl zsAVba?6&o{Wv=9YM(M9Cv>yTCX+AZlzJJa^)zC6r5$^T5NDh#3z$q7nVm-3pCYuru zB^HL3JQP?2pz?PDkBnqZZz!y5ZY}R4_fk8u!fwMJ?(EHonv_vbV&fZ z&!o~7f+E&3h>&(P2RNH1ITYu+(e|&q8ec$eQ1IT?S?8n>w=y&N9Og&*K#fp<|NE5yhlkQkcDUKCfA` zW;jzULw%NBsPB_dO$ZkCncZR?g{rFg8LhMZI~5RaMons_(}EW|Bb)_IX$b?@o=D*& zA>g16uBDErWlg)4LOxQR&szAy^(o;}QTUA|KuL!usyC4QIM%$$FzjW|K1 zH?+{9H`sz2@H}<$Zui7F8d86hYN=NqK)b^cf$AgdqdaLqU6Mlfq8SO-n^&VI6h80A4( zl92e-x4X$uqW|F|bWX6O6BaAtZphw_A8EMD_n4kfs z5hj@oFiZm7TBuuHXRq{+fnUNSGuOZOsqU;(|6XflW?cLp?j9b<6a0QjE3dgO5Ya~| z276nou@QKS4fz;u@^WD%qJzSAT&hzL;-RC0h|4!yv1J!M!yp9x0R6;a8&AFJt@cgF zs?qZEBEx~&rHQ$}TdH?^g|!K<{Ij8c38#a<0tWkD=3W-W0gqg~W45i~DC@?_wgJ<* zDkaLjD4VfGG6`iVD&<>;livZyaRRQxXdq4&^%1yDYCv(_IvzM~-F<>5Cp--)Lyj)o zv(kO}iWw1z&!tFWiSWY1)!6CsG2MM&s-<4o{YTy4_TVtWoX*!D{oCpMPVm%8C-7Qk zACZB#?EqvVN(fy5$fFGW*dJvjuY=)w>uOI&C6uD30cF(hOy9nr_D9(_z=>~VzZX)F zm4VO|{e?D!pOM9*k*>g9UO|CJC2@fEEoDg>B2!Oz3A^a`fR0*b-=kEKjF%)@(Uw@K z#(_ZqA{jDL+03$>$7(38+Kkv!H~=^N3cTMT*z^ri*3Pp?u>e_BM^NAbgu zOJf6clSCof5&K+|I~;^j4tMH2l#r)H<}tmVsUqq0O7k(yDXuk7h?jFowp^bv)~rHm z{W8gt?0Ur(=U)nhW9519YzhQ`+Nr7IJMs27(O4Ws*ke*%;^&B9AMJ=t&M0!lTyeDm zOOuUW;rH_Uw3cTL2m`Eb{zUSUg>q(z{*+zIz)bAzf(ZyEHuY4aKS!vo(~4<|YXmKd zK(h)#04t_l&EHM7z01qDWgc<7J~TAva~hUo_M!}m3hQ6B>Z(Rs{%ZZ@Wsv2=j5phx zl6foFp_ezPcBOCt5CGz2;5?@O*vx{U@F&f~uId61E%@WVu#qZPWqpB&|=$ zrX9PAc4`>I%w9eg&fnMAlFl>sx>5@@_KI8_A)UQAuVDcpBw;C|5Q7@$mTBR7TL5Wd z%6J^P6)JKT!mqJgCgsWBQW8F21O8V7XF_j{5*HY+e(#zdcU!U^DgQ>xzU@io1lQLG z5G%DyiM`|S12Tc9d!u z)mvA!UhW@>l>;p4eVEs-kdp04#_oq75k$^G3iXcO*LM4v-zagKp4<0p`be1QjNq8>vrD_FKqznp=CjidHzcSx1Y;?+t*{9_Is1y zlzshomyhwtv-sk!fu1Ev9Ar2eROv2uu7x0YIE1^vwC@eJxbY7iwbm!lh2OAK)tFjh zx1DS`een>?VanXlj^)Omr>^&)`scgl34DO(g~M4guE<^8c|R6wH5+LG+@q@9R6FD@ zBjokDkubG}EkNZ$Akp>;S4w)0Cz@%V#;Uq>yIRzim#kCpIGv>hK$Uo!g0=r6k&%hz z(+mwg9MnxegR1Y>$T+LVpWwNmHwL;xtf8Gt&!Gm&xz-}DU!0uSCeFi9+XIk!cMTbZ zJ36$3qDj3>2Vl8Sh`e*qSSsj)7M@e9QIi=y=X|Re`d*=IgP2#iU4p~kt~dBb<}@&@ zOwZFm&eA8#{&r@H^z_Y5)(0NR29G@g3387^eWfPb%H%A=8~=gxWkT~qlv?V|_t|C0cAy=-p7l85>(%{%V|Q>E#wB>6$l(86`4~ zA;l5w4=uQDX;DSlXwU?1s$Nkt|He84`m0PO=RU1c{TP0L_PFxasl@?=icn;=!gBa# zg_>56&-8Ii=6tw5Ww;Dz5DN&QmOMOKsx<5y{wEP7Nmr9ng0a-DT($S(Z;YIgepm)6}J-4|k_L{RHiMHPlqY+7|Jw1eV00HUlUp%v#oyI_Rb#CnEA2i$@mk zu!1qjW%Q$s()I^N6!}p>_Usx;+94K~JxSkC@3}2%0jmg>HDPQauB*oREKd7QijIEh+ZAcY!_eVTI;Yes_8#Zcf5K|YZ`5QBytWrjI6JODkRx0 zPQX6Sda@OOhytvyKy#23}dWbIEPOuQ}iklsXU`@W7Q>3 zUEB2uArk>V@l1M>RpZI2#`nk|7r|E@h*a_Uo|^lO(GysC?sbhe4ZMPCeMNRx2$_cH zvb>i6U%ADZx#NR^MZwk)EB$)LU+TXvuCL+wMYBJ1{SaCH#jw}%t@iduy~3FO1I#X(fJWR~F+J!deQRrjK;%&TTcMI^RNAkN=R(usV zrWyFl!Q`w=2vn7k8*{AG9`8NXd*X4_sGgH*4o zKPagHFpjj&l7iZ|8AMV?vxX(ywG)>8W%ov(%=`_WQ{3NL727t!_e0`}c zzjAMJ{XW}ORDWPa0b2T{v%NNn?t>uJvYfT4Cg|`QFij*uf{bj`#H%*)eFUDMz%$aW zo7!%O;6md^MTp%h{2HE3V}F9$V>g~_qx;;4POE5b|Jij9J4W8FsWpB9dD24M^w=;E z9-alFN2>$Cz~mYNnn)yUO(arhdm}+6cr6e!^4`f7QrytSnmOl`xgp3WTh-CZTae%b zIwqp;^186%O?x$sif#AnWEz39r!D|pBUr^_km}Rs^g2n#v=5@arG_8k-t$sV?+F8yQi$F; z5DV(w8>B>Yf&01ys>3i4z>#`?VJ5IGJT)A1a|x~wJkH{gFZ9*jG3!li!K~M6aK-k? z-r|b3U$!j@tHpSaU7M8&7NU+^&`=&~IWfal9Wu$3qDp*V$)nnhQq<2mj7ItZ4lxoC z9`AMwI~K0sDz4vD{$1WZzTPeWX~@D_ujw*ua6nSZ-6zPe#1X{ymOHEu1qy6$vT~>7iAOHA5_eaw?3eKD#vc*A0PqE-y78U& z__S``l=#k8{q`d9mF5>&on|k^;iw^Dn)V-bLi|v9dAsS^pGiL~4~d=e*o{ zB+U2%NOh{+eh5P;8_8RHWQl_-YxHg|%uxSrQePl?SGdeXP6O$2z+5{2T9%AiDJHDt zmb}6;e25Zrd!;gCBY;@)xhQ7NU<0tWHi0UbPy$o%h|(cyh<=Y#2pSJ&k=xlSkgsHt z7+$UUb=X+CuYYI)a8DG9jZ1S%9@hmP;rl6M0n91=&NP~*uSSdnsN_3ZpP;gi(K z%=C&C?jvyF&daNq^Y#ePHvhDp2vF`M7qsn$*|uyhCzA>}Qe12Vw0c0l(0=^KO%0 z6KCBe;Uo`_ooa6ILnG{PZFwrEPKl)z3f_5(rkh?1cNa5}@H%o*k#AI)M`s#5YF~Co z!*a<{lZteb$B6j0pXYN1%U6gl_0IKd0?ukxTB3rrOxRjRI@?-ap#!Tb8-N8L0R~l# z>6Hb8O@<`1#qpEg(u{3g5G$oC!*@&W8wq#EukaSX@XECeFDsF&y%@2l1;H^6(RD(n zV0m(DjF_*$TM1kaRdfe@<~ZFKd}@t7nW=MyJGW&D7F1GS-v}EwQ$%7lr zdM_|i=LrCeFo(Xg&c)zv2;SUrV}grdKHvQTJU_e(lp)_%&W-;kgr6I~gYhnyb`yO~ zYS~^2amYHJB*!*SPX1yh(OhJ{l{1G?MS{KguX8Z~XgNPhjppy8O_6SlF)_@j8#1mU znoqxuVNTNeO~}fg{e}{5k3BVB^r>BY0kEGMg9zqf7s5cL12ngzDmECx$^S*8>dB;Q zh9om1rew><2ua0Ow_QC;SO}5u;bqfU>b6q#F|gqsI1qK09tMeyKjrnOAgjyct=}Ud z0{ljiQSq|I6_M?xun}r0V=iM-?ax4aC!pF`#YjHs#rm{hY%Qqjmz8eRteW?5mO?_>#ER1USKWDL<1Z0DyxsIuQhvJMbKQFEcm|Tddd9x>3%# zQey)~QIce2+rO(O3ky~quZoq@+>ug6Ito4&5<9B;`-@q9MxDA-*>M4-EQZqiH*yA@ zEW4Jl&4-N`Bm?w#7TGn=$Lr^a4YevEWkj5Pc|b4bxhH2aRZveyv#azREy_A5)02HL zI5U{NmiAUMP(npXS;I;Gy(?1Pi5| zF_I50jkzeol17-9MCqv|zLYFLp+klmhj7K}XO5mxXhUIo`gil!fmdi`LX|FG@LahT zwc8=#+0d9`Ij*08XNZd{Yw!bWT%mm)bmY>)7-4sMisbo>5MhT ziw$CSo<%6*s+L*XL56a^S&SN)Ov6z_*15ckI_r3Wppx3j$5pX3CNUyj-PPLLa&cvM z%1h@lRa1ak?iZOW^))?6T3<|!&b9;2V zbqU3(Ki{D}pT7vx+3fs#dwsRsB5d|mj>cQlYkv8u;K?=&m`7VI$7swbfjp|A<^*f; zJ$Ae#>-8ZI#;9EfQ=O9$XM!@lDUqAbHNK_xE?oQw6%F02@!#CcP$>y3oP778eP9h@ z!*x9$&YH1$xQwiZp-8B2X)_bD5V5Xsx}~r{;jYP;ahHybvwVo@f4+$*0$nE@$`G9cKnpu2S zQB}p?;oV!(AxU%%se*MSLRb2VlvACMiPzJlUT|g8`9wi6k&`&HM(%Q%vP-NnQB@V% z2(!cN6}U^0N9EEF)CpBx%9h17pUOHaE=a~g`NTw0orKcj$%c8`bF0y<(jiMv1@3Cj zafV#3ke33BK9)lXH*%~uAkam|?o`rBsiUWZmAZPN=v`i~RqQ3sUp=Bxe{Ciu3%O9Z zevjRea(Ezvgu*-(mIRM9-&z?bW($Y;B~KcgyIX7+;Hu-B=1c<`mLfO$h;kh|sr5S_3~x*82~y0{L& z*AAIQnIZEmcf*E;xRQ!@9nNH#<*>&v>{g5QQ#eZn<%;2|lotigfa{ReS2#4}`5B($ z(if=wnl)Gh!{fV3nA~{hGE`l$R7{Z^pJrsQ3G$HjL;l9vI1q1k2&yo60cN&8%$nNZ zJZy(NGPcfUpJk*L->yut7WEo4nhB=S<1#^RK$vCd647=Wc8O&^^2OzsG|>sty&RGR zEtgA*9eb_(Is(OMcJG5ktC0Tv0k@i|e*q0!U`s*Qfa$r|0;?#+K9Z=3o|3beKA4eJ zEj=sznnd@C++_}AmWr;;eYMHMNTYBJ)nxrwz8yPf5TE%H7M9YFswh7Nm7qhQrmr=`( z`0y}4e{DPW5r7wH>j~PER5&=F8=^NK^k*87@0Ko72}TQ>Q+%#=YxD zM2GlTE9~(=Q*v2dt5cS$oqUmy6ij)dWF*8LfTVW7FuoSR+wQ5^vF+*Lrc?&0F;~Pp zIx2~@c;}W*61KP?m)tTJMpNS!Rlu+35^Q{S33A(#w9jm%C)QZQDp0t12ohfC{UJOm zEoX?+JkBLh(AndGdM6Ax@?<*oxsn~Oo_eqCi1bCa-PGwOHS-yPFJ=)S*#Y-AOTVZ* zz=0;^zJQ1$7-TODjUxBdN1%HDew>vMvdx6d=d5w3mW~viIX4VJv%s+n$YJRup;)d| z*8?@czQTS<-}Lu|!W84|S|=>$uU0XFoZkor>qDkf-TWy1bz_p-eP9>0-MWCc;{+n) zpn+*sWW{eLEdb<^kG-VM4GD`Dfega&c3*r zZxyU7ipl>)FqAvx&OEHweRhA*s?c4_NxSpJiGna#9a5MC%}pnBTWMx=gtPNLFkg&10dS|8DkJ@`Od2T z!^=Ytv&JXJX|Ujj6wo<}r+DHO_8dj%kmr$Ak|V*=i3_&xd95CM%Iu{ZkjJ?0fM1N! zwAy)#TECzn>BF=VO|hNG;MD1msuY<7xM%dSog%`kHVJmF3qo5ebJiS`$A*+RI4TAj zqsnB|HX?>9UW{E3-?7y~cfjdEzYT%aa9LWeOt7>F^0`dPNFN_TuCph8=DI)jlP^9# zJiiuz!So}uloA6%l^mp7JLQKSOvB25nbfxDvQt>eWo4iY296}p(qK{?E*UfoO}*BC zI+1I0!u=)){ov`Z@7_D(htC*G-A{tyi>5wwA5+)#SWcU2eyy~Wht)ZTZSLhxENi7C zBAX`0SqAgn@QM<6t(o1;f{57oMK1l^^*6!P51;?|I#R@TA_4|!OZR)=_JGmr};^VhLuZ=YA~C7%n<(4g!$V+ zRwe-gl_8{zajgZC5@L^Lad{Uu=(0r{%PuHsJ=!RgGj&^u_XXhgED>?Ak>oVEWnr<< z%Q9Dty0mZ8j3mfka%Tp2Q-d)yWYr@BK$(GNc*SN6mG50%zBr%=b%%v|HaqltBE{nR z1jG^z`FX0?j+j=CKv)(`v0#e58@a$`RaARw|F>TJ{NiV3u0e|+59YbRt)-Th5i$n* zWWjlm&|r!yYfOEVBR$blbwx;#CT=|n=rA*`z;t96HrOA<_x%TbaqmyPdZxcwQH^&m za`b1-ph&nt@ezPZ7@{JD5nNW`v2?RDj zscp2_Qluxgi;>G9E^`;m%W$0rkXnpY!w}=d7&-x+&>@FMc6?^Zg1KWoI}0ag>t_#a z`eKjFrlrg}Tpu9HUOTEcXmvx$@XTJoUUkA-mdv{=8zteWvWrXIW}}g)+BQNfgkmYq zoSq^{cF##MYLTM`v zxH|IW;E2{1urj}t)Il71h*jnYU@RzA>2FUk(VY9t@ao9+M}YhYVtmMI``LG~;_bg3 z(IbEq&&q^#taf@S@lgoH7Ny(W^7B}M#hQ?Ic^`LO``8q73FMg3Vu#88_CBx8|5SAo zc4T$d&+P4MWIeJ*x zjWWdH)pUzQm=}1My})#c-dYKr*Bf;&EtMdS?$CR~zlP`E3Tr&RJ`tUR-Avy~X5o)} z$tJ{H_zCaG42liAS8||_o*xI+*(HwBI5h_ih^=kWIRp}(E)!A0+u$%4R2fny2*SpO z7FKJ<4Iph}&5WU+LDmo1M+I=tP;pubXQ_sWkX2NbsG}I}g1s#&-+md?Tp>(ry%Vlf zEK|T+<5j%o)8L~P!6A>trEh?d2kCKYtbv@1AUdE|bTg9!i6}xGApwiks9tTWY=492d?bmE`#WkB*O zb-awYrsJD-?SJTJ)VyH9y5 zU$O>wL|=v37~+Tg;C{D+#uwAd72V;Hh*&8Z+fJ%YsWhwJRE2h=^{dlH$)Bput@?kF zdmV~0mNM@spd6mhv1LRE!M|kb!=$RamVuLTa3lVoV~uD^4G4K{9LOUsDk9mtAs3sIfC@*>4d^oLkG zAyQ+Vx%Z0>MTKmaDvgt#8*IFmSrdXwcy+%$B_P9B?QSEIoD6+i`ESo{fe2N)er5is zHkn2XF1km`U6fDkWRkKO6Aq0hm6AoN@P@-SsfP9C*5$(_5$-p6SkyI%v>{V?V5m6h zN{ak=0?f5Sdjq=SammWQrI;5DU>>Tc>%hvNGBsr`9fR`R|LFdPd;zztB9Ft#Cd4i? zzR&jxH(u@N&C9{{aW(T~H#|U_<8S|dd3Qukt7|PxKS`OEsZ7`zNPB7Z#*8a>q9q0u zCDB^0=F~&#B0Gn=q``bELwB~#PuE$CphdBcL`u4vp;0*dijv@7Tcbmc&`*dKZccFt&}=dz1vMkvu#Py? z=C(EMijIu}^K8FZuM^UNbZD9Il3u{eU{db^D43`hvX3-5Eop7gUSqy6&P3LfmK$q8 z$RuY%9=nR2B6yINff1^XP_N`w&ha!f9Ecrq+%TCP^)LH*UAa|bEJg&#AS)Mf*p8mZ z>?LyrH=S1au4C%EmMF9oe`p&5d{r!nMC|K|ZI=L@gpsElItj}&z!~bzIqS{kiH_9^>+Tm8|MhLo+VDHYVO#rENt6B~$ z-_*iQWAWHU?ViWH)pnY%H;AtrZWe;G_mlKk4V296T(SeSI-vtaNfELY^s1cfBx|t( zzrD3cv%6{`MWF$QLR6p)1PzhlR}&tOtJ~q74dObHY5t zsaE1{?1%O^!MlbRxrDD6Rwx6)_u7}pe3n><9Y!k`^oi{CX8niZup2@1D*n&RdRvgM zMfQZ|Q|g^Yc)7c*2TeGIT;_Ee&{wj$+BU$Gz#rsnYoJTlJ+L2k&;|#B1tRJ8#QU12 z-6|YQ|IbFkQxu!Jvd~Mcm}6=CAjCO7aMgp8z*TyhJP-xi1V1%zjej@t8GH$pMPnP`qVupqHGSkZ|o7T2i;oI_BmK-XtcCc|W`)zhN z{r5P>dg2RY{lwksPJ-gJCMj1pwMNP9U{%07aFWMSFL4D47$a2t2T6vk0 z7Fl9tLjVxm=&kz=SVu0nJF+x&bYsT>Ahsm9fOkX!!91KOVvZm(at_#WC{jX2@sNKf zze&2xWX+*UAwR=fWtX)LyL9pt92U0QibBa26{Sq6x8g|2FtHWqka-#W7dn3AqFRH0 zB?-Tll3(9VgWXM@RX&{Q%=hyD_eiyKd-(x65Xhp*qRx-bI$*hO8j5NbClvl|lbrC% z+4bF2{M7O^+&(~c%^f%K*Q(+vQ1pem{c1?h4{RX?jgdSwBlYRh$%U34c_R-~*2bK} zuJX9?Ri(UuxWxqr2zD16RU&Ishb4B}T&PfAyrPu4S~8nS8sjjBG3OQ5{SsVfJ#%Tn z3XlHO2)|TgKg&3kY8-8SO?&yq5J5tmnVt#v@$L&a$gqjuLt_CE|6by`?PS&B;{jHq z+J&ut?=$L6#{9KUffhWnDm*uqS*pqhWGValimkq89E~X8LXBti{{U93i z%tB<$>~6Mo%etMLu{dv*>b^$*hB5c9ubmUF9A5U*&aFffGq)vH=N?7KVmp>)?G*#e zOe9_vLUTx#yU2pxiqj(WN;4jr$d;UCeSqA<^dqTMNG-jle-V*oZfNN>t|f3dh>%-x za{e{>&e~s|dclpNbd)2s|GNP9_M?D4sc5H!@yz(?krWqJt~ZK{$^f-YULqm($rS*Y znK)OnA`nSoK{pYFosebz(S2x}*1v{C2q0;i@B>xIWKH&ppnYDg&z}6cTO6@iba8Tz zN{dA~!N(i!o*Mre7d?YHYLtQg^yWZTKT%PQTwZr;<@65fTuFSbYU@< zp+J-MS#A;!-3C=n>hbQ=@&Q#BR3E!u+fV6-`W6r+3IX#vW(ieYfXMW@N{y|am$lc)Q(sJBCqjXUVqjJ& z7zILgH%R{I;rhFF=J_(x6*-)ht4G6PyPQcRDOfYChXV$v{37dZaaA}nbAofsR!A)? zA;0!Yg%{{wW^SBJxD8$>9b6&JGVkNLWM#yA1c26SP`<=IrznF!%Kcu`d|M_9yA@$eJu#9jriuF8BImP5OzFA|#4@>xu6+mi997la>T^eha2UA0JKo?gH)E@5DFjDY zzIQLj9b#YO!fqcvU4KKySpyr%Y4hSvfkdoGQUZtjk7t-FLY-vU?^Z9h;z~n@91q-w zRpK3X-G>RpN+~`Rq9cM(lZgnfyYQx*+SVf<=Jf@{e#kgKbGP+SWORsflR|!r{mcni zk?1(tbb|~Eo^!PA5wvkK+NL{52oAH6h<-PrxJC-3L&VO^0IclGRAl*}S6a@>OeguO z_gSeW8E^`dOU<6~SjyA0HVn+;m3`CQiS~ZA`LMIi0=Li`+Ul-{Fh7s)}ZtaVZR8vMO@9N}HcmBjU^X?j0*=1N0 zoQ$8lHGE_MAb$=ZT7>S7I$rdg@I)gf*Jo!6*v8l}X-aBO-8l)scM9y^E!!t+eUyUP zmI&&Ek%lps0Qo3t@TVh7_h&U1)P(>5AOJ~3K~zd1QKZMJ)Ki(bdQ<_WIJ_*7#i^?z zB#SrB zk6n9=!2y7?JZEVOu>>XSM3-2mtZJEKi#htpDCQpOmBF@DNC=to;d0ED7(W$&ya+vz zw7Za(?<(XCGzoWiV-KM?sDQoD-r6nFyd8S5-d*_%4_7Ig%utInz>92gsFDzWF$Cw8A#5Z^S-c6c_#Hk95P z>FbC3@dE9cHFNEE7bW9?(l>@Vtc%D*U7)c7(;iQ0l0PhW+y1aUMoL}Aj*f@U7IA7dtD!+Eh znpLc*xTIgOie=P8>BLC6u?o`{c*;>{H|=uSJJ)aZ))ZUTMyoNldUnB5ami3gEYgv? z#aIp;4Fn|x-q+K=1zA5}t3mU5H>!~wsxA6C|L`9|QMGcMA~~c}wXm%qRrW(acnu^5 z7v&z15WGZhNcWLgw9J#TaJuJJBEF_k^ABjVL6>FOUr8?IT_KG%9_9+XrlG25tNwaMuV^d*M#!}phhUccyk~rJz%c|=7ELU)pHPlWg78!;YxT2)Y?J2zO7#O`> z09in$zb`)B9(H2>yQ!#pe*Y!yd99#k@A?cANn0;c<%MOBtF=BGlPeMVF4Zh-pKx7_ zSp@N{Ri@~&N-z^lv|QD3$jdJ#H6e6owhtQb5!zeZk32oReA^X+2?|8f15Q^ z3ApuH>v`_kMzOI0Wu->EJsw@Uf49Rh1i@tir{3KKfosqEaA9@gMY!$YSZ?Y#B+8yBy%E56>Q#`QwG6;&UN-t-33h=z$Z5 z$0PwHruGrsCCMEwn3d^~8y>kBi^C$BO0fo+nTmVw*>88qsM)XIfUJ2>q6=|~&q3jkL2@rGLsb;1pqzt@6?vm+N#{83JkmrsVVdcc zOR5yf$0-5bK#g#*Acw3=d%8bmIT@9fS^krBl}nKP1zEXSZ1HVoNLP}y{Suq?fJ3J# z3WX#oALTUYA&xT{a=2Ez4r355Ma}rwjTkBW?=oar*_iFFfi#OC2zsMseGpSx)hb_s zLDKoXH#ulkt%y;1dmEnV22FA`seTvLnC|cT@&tz1UDk>L%jGP5k27+ea3D`bNtt!- zince;#gFH*nl;uFJU1lfh6L8o6PV&Vg)EM$HXC#z;FR75S8Zk)rkQFaDeec1+Jw&l z;Z2-rExbNn6W*$lonG=;)GXF`yr%zf|GhbyzRU=^1cxX8q)+{flV*o!#0k1W z5FNk^Vjbt?fGd(VBFhA49uJbI1;l@SkoC75PRxj9d2c)ww|gyaK*;}BXcp-Z5PP7B zQ>au)g~TQ3;ZhWrJ{eYXc-NqG{^XSSR^)J6 zn<>}sM@eD;R#slD0WWoU$Ge&Xh+kT5*AGb)>53siC*28DChQ|H+6DAzPkxcq^K@NI z>A%tI{bR54r%3&}s>m=?9vF*QsHBJi7X)de*s& z20&5l-9XUKOm0{iD`=Z6L!WAD32X8qZTbo#Ie@h}WOvDg-Fa?N!J&w$ZxW#sa>+m| zcf=zFYJ2}Dub)L$>FK1>b(^aCl0%P$tpqfGD7R!4#X{SO#FS z@6e~c$$z>?!?c97fwNiLn&z~3@+K3&t`dKRnI1)h+~6&GZE z-T7UB;2wj?qmink&cJ;hTgX8#yEf`p_l&q(2D1&-yO&96xOq)5$l-2kunt6|UEKJc zNh>`(KA7rX+5Qu!k6^#Ib_EE4`ApaN7=(0I7;nlulwsb+Q$Nq!lj|Ev@D+tWB*R9N z9E7pEPibYqdHLKsCU@y6GR108Wyck_q~|$&t;&wtV6PHc4a?1of05mDVTyt7PuDaf zejB2-#LFjyPL{`=3>XKhY!A0=x=>(~sDLQWUum6TS#Bz!>JQ}Crtr4ydcf^32}W9? z2EfA-a2-$=uBRQ4ISb=fGvNyg{2*#RUei0(p0@e!98cTR+uh9K2zp~4xSpjsH}kh7 z{1D~obZC7mq`F&au46`RaOg`C%mpO|d=v_lm30czbMrYQb(Jy@z37zilJ@0Vr9b7w zgIr5sx(FJ9I3lm+c>&@QI&~K2l=(gGDds$(zr=^egSuh8d3zEE!(r?7PG#S0!SF8) zrl}O4;J<~4XQX{9n1R&C#m)Y)=X+ zn6y2_IE8#pW@6+KV2^szsNwB7 zPnW*dQnhm$HfXSRiQIZzm^#)Q{a)s+P*G+9pq5c6KCjFs{igh!Q!t_8d0$K9Paz_axCx|7e3 zoY)+92tU#A1);_Hyi zof4fDP7oMXKd#}@?v7L*n81=%8`*u*5P8!8%z`#x@E!tSK?u;PNuJ&E4*~VX12&9_ z-}-v%p-&H7GA^;Y(3*F^b5 zXl%9A&KGSAaplSr%1mn`Et+GyH0gbw*9VX?SaJ2D39Fy64<4@%i2mTj_+iU~MLR9^ zs@S#O6KcyTLFH+{`j(F0N}SZ$GGe^gP2LY+skjy|?A9ZG`n4qyg0*79U)K3Qc~YnF z&hy+p0Q74r9sYwqjje9NR|dEU$qlE=B|$Eilj#f&$6S$lGX{_!EA?0xs7x>`DLFO6 z*H_tltgvoF%hQQMH~7go1`lVPJ(QtIA%vt(MW(4mHn7$$K%4Q@Km>$&j%|3DZQkFi^p@CMu>L840c)fg;g zAbF#%FDM*I5>Pp#x-|KK_zH>u%lgSEy)qTQwu|K)aiiqXGU(k;{{VvXiG%KhH^Z>!7qDR0wB=1BgCWF=T`z0y% zcvNYjJc^N{bIA~^qVnW;PytJvNtKpac_m`S)yJWr>Z46DUjw``)I%(*P+nOJeDk(4|Rr&V+p#UequxxR_!u*!;E27|cmRM`|Eu<#zz=!$TM z1%F#fWzNRuF@ZOsGf*%VVM(W*bhROCZh!tsWZ@ZK>&-UN(k)GTFXn1YNIgp?&N}aVr^`=8-H_3 z0h|?#@7gKaXvPzV7YTTgr1feV^6*e5#nLUW06;R*Bu0X*U?-%*z!&*qQ=CF-TdB+l zf7%ar0wn7D=v0mud$jpj*+6U3IfpF!ACwYhc?knxYPRu`g5}sCY3C_ za5Q_pMlYDi2mqMS$J>9pZaqHxU6=h(n*M1v>*332x940HX9YqPcuGd?txhRSg{R@k z!n$59@l%y%3R9eAF9l~-csF#eJ6y!KJ{I zq@d`Te)1Dbv38kVt>-wCQle$68y7TdOlA2rBVi4}%P2s};DIdP zM>rD>%QPy>D;CzddDFb-+4Y<++o%w__Rbs!4gw;cj~k z*LUrW+*To_MbJej42yVTSjtr1OgIoF&=qmZ`!RL+5=Eb`R18fdA72ko`TSnWgJSD5 zV^w?x+X89u6LKy>?WR;uVo3k$phs9==FmqALy?z2OaE%7W>-PQ1tt+NqeOYHE`XJE zO-Zl26LO_-)<@OpP-CnW7+B5iLyy5_Y`KBj^gsSCsZqvMK}n@GWBb}|1<{!@qi4f4 zGlYOHwQQyZg6sGvt=#8@PRScn>G@6VxZUOW9%(@#9$YB;;E|t~KDtVmnperkt-BVo zy-JIhnY|0hW!)6YicX`xI;EE#FSAH88)GKI4?f0o$-mFp7ofKdJn>J8%gX_k1?@d^ z@e)Sa(p`5OMC+AqaAIl<;zFnEr(259uJ4%&W@f~Dtb#6g4o zb$dMcV(+!XW6XeOm>Qj1AxN@}-Mfz3k5E+^1wZ{f-?<4=DBos}Ym)T*o4$|;fkxg5 zd%xP;Fe^hVkJ9L4lfx42y$lK0N>m%LUED~ShM(Peq?3!xNw5s;cx1l;VS}gwn3M$J8FAFhtmR) z(>`L2ZSI3PZ^a%b&Vtro_j`bZ6QIMs^E~+-G>1G>7|!xBymk+ODju*x0yT03vY>Wp z8shk7I}5x97~GKOZAK_DEg+Vx6;8c${$jtr&cAT~cRc=(bz{A1Cb{94IT?r7N-7?B zH5>S{g~Gd_2CQ%@szD%CaK@hb4TMRi^V@N}qHqikgG@&`?#?22f!5=%O&J$=daILT z!LqJ$<*B@dH#`QwtGbZlm?1&<1^yEJaCcK~LCN?r%P#iLAC9ILSEu9pND)sF?l^(A zC=EJ5BfgheXHARInn4hqZ^W;9m9xi)?@Zc0FgRz;D|T58`W#BQh2RtQHpF-okT1*_ zZ<+8b`GS7^6?n^V3id*6p9_w1(eW~Ceske;F#Jrdii=cZexx5g4N-szr^`=7P&0N@ z;v@yU;s4(4U;X9zev9;|EuthFXkn_V;lqO^q<0a9NtP;)kx%i4_4emig%U`3x^8f^ z(~!Agw4@CVf)sT|Z7hAG(cZ+%%5A$yCM&kw%NsQvU%-CB)I_xQ489V!>)paTy^FWdqNtp zkfc_A6Hk|GF;5%NSNz5|p$wxoU@uIqS{G-!b4a2-A$WV7^Pl?^?pOENPtL`}eNrFq z#ys2w9-=vxk(E(mt~Egv$_X2BCh7$lJ=t;LeyK>_rQ`gkkDqN-gcH#5i~jI;{_+3u zZ~pv$`RD)mzxcy1F8|}(_1!3%nZ157R<406n>^R8L=YAMbBBkOM?t3$n?@@oOp;Cy zYx)%YbUAo{zXNgj_h0b+zy2@(^Z)k0`Uiji_ut&L4vlF0V;Im6f_)+DGV{kLzi#Jt zm&habSjTGBs$hRfqYgl)5yz?}*WwX{ni$O7X%^md)GSfelz+%8w9Yb=9in zOPlzVQQ3^p(ubd6g1Y-afdV43{^s#7{=;AY&;R6~{nLN`FY(Kt`L}O8>;-+JzVXm; zfHWSa!zj{W1ZXuQ2iSW|Su5$vp^v42GmdEUlYki=#|eUb{Q@3-y#5OK-~RW1`G5cW zKkD^z^+5quTX;&6G)JP~M~ULKQ04OR)KV_6P)fRVG%$A7m&I5>k6|0^lriJJ40qN9 z;IffYz~3=7KYSsG`bqmy=3w+kfJbio2vCR?xs0kJaO{~XL~cMKDZFh>0cWa?exM_6 z-j3e@&q(RoC@?PDXI;e_ldMTU;5x$b5*Ce@D^{{t{%2oN5yxL1X)qbf>i`4EjNU~B zK#|}JI1rm0VDR$;53wRg;a@!4bQ@8#l0?)lptZ;=eaH7s#)7PgB$u(MWdX(>rs`-k zP$Hwgy|{O z13vO;dpuWLq4NTOmq>p5gWkXXlYjRA{$Ky{-~QPzI`sDMe>~4$!ISol$1i5z%yNS* zBS`=iBWAfof>%Jn^L%j06;@491?kEm6pX~YxFsiB~Y-;KwBJqk(n`Gv zVOEZVC`IqIfAN>!|A+tSpZuf$@qfiHe^r>_DMMo@NIATDIUMG*Y8f*AKm}m|M$ng_=~swoxjJ|w{tm@ z6NO1cfy%TO&mADcKrAOVr{Rbk;SxMh77oiJJBHiC+NA0PIdU6ivWoAHBa0fWjKVluwW-ACX*>uP>rdrpIQ8G0j3JX2p zFm=_V=|noF9Qnhazu$lTumAGfcE(xa%<30eA|1G+Y@j4g$a_fgWK&0>`pN zP#@fZce=GD$Z__%NO0hU{oDWNpZ=f!`q%d z)!)L`dVtM`9EfIsGaXP=oGBUt@sf{FQc?@j7vfR*f2aI#x>R_wn4gg;vc9~$2WlM7eH6H>_*PGw|{U78SDi!h?IwR3yI6hz0NdQ8#4+atdnx#jB_DFS9-`9{`zwA#EHMAIiy7usGgVl9M|I&0+=5=mvsWlKX- zwlw+8*HB0wZ#iJPSu~WEM=D%=NS(JFVhJ7&TcSh^k-9v{tmEtp4k_KVU;?F2ZP8g; zpvnb?B-k(bCLF)F-@kzO;WXOmuEX2{2j$WuV10~VWX=5w)zQAu?{ce@%igCV7d#H4 zJaXU;oZt29e|Y`=&)sPz7mP=m0I4`SBPkbE<-jO1dq(9jL_T73qOyVMRsAE>kE&vQ zz|xbUa#hFLhQSNRLrZ@aPCUbS*>wk)wYw&!CPN+OkeL>l5|tva=fDAEFY~1Q2cyX; zawP4b>t*y8tdZEiElEhq#BZ-7ix^5@5Y@}J@F{->e=ZvKY9+zussdiI;_*(YSh zf;v zQ-+k|GFGBXChihEJ+atPDMU((nQ%n7Jx^b$7{(%G5Ii@IeIV`&qQAI)EaimSlNR%f zw7Wh=uHr{oiki5r!>Sh~JEs40WGZocfb;njS(a1kAm??arNZ-2j+pWr_(dMAy`h74 z6t@{7Jj(=;MGTlcNR#6{9l&vzly$2aXGja-!JwahoRUL?MR;?Iip?5mIl@xZ#bURG zSB?fFFgy7?6(KvZuU7`_v{l=-cn5C0INTZTgB!;ER-N*XkhmR`8EAj00;gAeCmCTdA4}7#wiNVc-kzzrwfQ`M2L6-wxt9 zBCUxh@tT6k^3S5Bsbqc{Q*CDH>F%btO1qfROn^*cI;JLw*N}1*%CKoxFJ<}!laym{ z*BmF+iL%^KMh8qh1e%QGasCkmbH&H3@%j*b=uYRYjQFjSdVUIG+ap(<7cTa2{hoNg zU-H-S`lfHclN;!;7j$$)OE{E~P7Ckg8BCoa`7`MaN6aeEXiCDDOeX{v`2t?{()sJJ zJPtR=Pe?954jiELI&_|XhI6xHoi*;>aIDSh03z+6ZIMz68VlS<`hh2O40uN@0B{){ z0!g~+Sg4D5dW3%I>dzRtUcXts5r{4S!gnbc_&C6K)HyyP!@$^<+^4ZVIp={w8ansl zk!#DX6(+JQ42+R$!b+|Y%n^qH+8g%H{X1DVjU>*XCXzbxUqC63GS^OKM7W)GA_-ck zPK=#hF%0&VCJN;OxsBl&Tl&aI>F(1b{x%lf7c`y7)JEFqRw7(}eimxo<_|0&0Hd#d z`2OKCY}QbhTu@n*fW#UA03ZNKL_t(;nP(npmN9wu1b0`!$HCm^HMCv)T^a&F#~!Zc zXBLk?45Cgm8qLl>z8&BbuxT#kG0$hH9F7MRd{u?$R`=!Me} zn6elAR~TO3zM<-LT#Umnu{ptVN7g3+@qo%9$1Wk0T>gy>mUfBk?bn8^#6U1h=4cfY z-G{|F=Jh}<6U9S>?47RR&7&|sJjuSIFRg$1^ANi&g7#-tbtge*NW)Z~^-skzI401DC1{bz0lHAWH ze5S5IR+2DAs99>uvyB^7t0_K}_4|AICqPjo8wzu>iR{kQ4P_2v+V*GgCn&kcNkXAi zl&9-7eWvl&GRg+cd|@PEuRqW^Iv2s-SGW8^hYubuPsXf8j@(j@&@y>*G+ey4B*-gP zbu?u`6uN~F1V}Qk589L)jO-l`xLaozen00lwhMTn> ztpqRXwQPUkKH--_FWeQ31tDlzqRA-ewBw}A`P~J+%2~;8D%ir5xr_qcs7S)s%3+JC zh4SicpAgLBq_I(mLC|-cC-lbquW`QldgV#19`?R}wRJr$320dl1q`)BXoC5KsW0xf zu}Qe-X@AD)^I=;qC3wBAi+-;0X`ClK$*g>4RY78w*+o)}BY`W~S@eTz1o7Ty_l$ae z+D{8&U#q=QtY_B&aldpF{B*rfov~R!$-C|B%^foRZfD0dr7CwZ9squQOBXwXJ$nt#pFMRA4ud#qfy9*Am9qgi$ejp?5`ph}e=* zIjbs261Z-pt3hstO22enD%_B@$=f?B?|0dPWoh;B1F^+#;~g`x^Fd*6v@{1*`Sus` z%l^aZeW+rAH`Wh}*#O|I8kuh7E3*nxF^v~O+O>2DKU5w?OLs?kP2~H^6)a(Wo(~Aw+^y+d``L1=yJ$HYm36BGuI08tP2c zuXWf|GZjZwA@%u$6aM^iO5%<6|&7czCdZ&1|XIx+)>(kwFa2i3&RHXfHMj3Gs=H6kv0_V1*kJpLF1%?P0-!Yy7ZYZr-1uC;HiKwCMZigNA?RENh zKi{Bew8MhJ#N%{y!a)d~MVHIA=xnkLqUo~)7kspEbm3B^q6;3p*hHy6=*xC@d zTP-E&G%(eINIyo_@>D%Ow3sCZphSVG4!^b3@FjLa$|@+hH@x1(6!$4_ph=VkR5dpH zqfL${EaWd^E^(rQVo&7Da6qSURv$@jmZ@mVM-`czE}ibDM0b&P9Eb7fsS@P|4Nb32 z1C14lXI&-QK99DZ>^74N$LezLY1%FcG#sa1 zndrLaf0q;=FSd%UfPeM%1Be7kIsCYDRyjW%f*I_x{l*8x$B+Ef-1WnMH0BClr#S66oECP5^mb;#gg^C4g_(uc=*3&`W*-CA@IJnUtO4>BM5^u1x5aM)(@Y+ZOm08Z^e| zRcT_ASsoIme+ELm3j;oo#XM!du*u;Qc( zopo+ikSK_BE3`V?59rA5%1Q;5ClFg@X@q!(N3v!=&iDIE?w4bUMGXW{e$9PJP} ziVOP3jx;wM%EY{~#*yo8^^+;bfwOAah&avOdVSX~xxNw%c0yH98Vw0{X0jser(7=r zkUKn%)jn%EP3VBVO2&1R@D$$f-1K-tR1~AvHy3h&7ytzo&K?nXC9Q7ecSJx!9tu(U zEY?YqekSZErKA9sJ7z+g9Wi= zG-#l*ti5zc-38GkhGTvuB*Q6-qsN_2d($W<-69$pve$VSBt;r?)lOO?!M4H)>PU($ z38_o@7*yORl-axMQdJ{N&XU2HwNnJhjSfnO3#ag_N4gmtlIWC+PFV1V!v%jKldG$m ztt?H{NdsUU>s4Z}_DXdqXUs1l*twTw6zvA-<8G_EyXkl?V!AKbV_85S6cF~NcO|3% z=oTDhfp|{wKA<(=r|Ws}G27jMB8DBE|0yhtK$v>AQ_3KSKkeT%dY6rvXscPLEL4Fd zC~~;W_6cX34=!k%l=iLBiawd`Ww$^$pMj9Igi)bG5m`*Tv z^EpZsF!H?1?~4#~wWd{La){z30`ADVWBK|$m*Xuv@{R!TFqz5VbkAB2Xt~b;<6Me# zSh*aGTI9b(L&bJ_^Hre5$*?^#B9=su9#sdNRqbhkQcoWJ2WSj3+i7H*#PtENz%rW) zA9y4#GUASL{@MS}+PnVjwq5mMzu#EvefROXVILd&_(E*JxKMIyDVJc!CO}dGrU@h> zAyCmYRsWw#m8w?#P*OFOsSn-ur#l{Pn}Q z%rV#Vy!#wOmX7v$pXXU?t~tkjjxpvKzF9D_M3~gZPjX5%6M$qU10#vV6^Tq$+NwcL zG06=a@a&isNpK>v> zd8uU@H4$5FlrC*fsJ!uTUe_{reTqS~gu85_PkB_X@&8=)W1L5-Ar_EcPa~ZlA$Z(f z(qQN}af(WW$Gd6Pl%W2fsI(sypK~$3h{&NGjF=t99^T8sd~OyUCB{2J!zYoH6g#j& z<<-J7I6Qe~ipq>9=LwN(Qez$(bu(v+Ow!wJK`i(Lk$MCKUx|b$WdiC6@U4&NikQds z++5N1o!3l)8^5Nmm6H_*><|y{8#hza=JwRQgLKKWN7M39Jm^e7g(X{Mc~oIu_1y zUUai$5Xk))gK6K#z9YDlZYxQLBIk}YgBjiPzZ(HcRKvohAz;}!gfzZl?cwOE4R#`WiY)<+EM(~zBEWDbqG0(9E_S$ zMOt8_blZHb%dxAZx@K>*G+-A*O42}{(^rSugi8)Jz$|y-m^DAX>uZ^0nj5}i^1F4X9<(Fq0FuvD<@ojyilK8&0c|GP9WjArKZ38iFS9?%=)n)lXq--Ty4 z2VM^^TM%aAuKN@8NhWs}`_ z!uq>kqY>JBd}LWb;6DSdApuQsTHMuMtW-dm8^z@FrPrk~+TS|ea!Z6N1sTs4Ju`}v zXm(kGI6>-p9RB0APoo~3+RCe~%+Y8Ozepm=IWv=DqOAb~IvEg%Dqaku$#=54Nq`}X zUtq<&x61)vYTgUU9jV~+S4XIBazfW_2o4N6RdhShZ+Uz&qLd%jjrgr~ z-?Y`({=I(ey|YFeCn&nypl#w(Fy4zX|pi z=diq&43`&PUKa$2s1`zCCV{0n%i;QFHC$>AK8+)@G3J%!*W=TCyxKxZ*y6Q7w&Um) z6%dx6zak2UY1`v8I)_)-@IyytHa`IAIiq&>hsD;=kD7YeSXr(pix0bo^gM;AgdT;o zuMOK9xXiB@#O8nVn%rW?Fwge{XaXJc8y-;ZxhcpnLMB6lk|zjLh|;}j^$&%(z9lf_ zaP_dtBgA)mf$!ytjCEZoaaioH+$K@isq6bx{>n0M6$SgdB{mxiTPD$H0lfd8Wf)<7 z-AHruu;?2eiZQ$NDbG?8@Un$L{cc=<2dwa!vfv~Z+$LvQ0j^0MaWL41L%ZAoaSi}W zA_nCr)hY(5CVgt5d<>X>oU80;qjXIZj+n^RZR>0fJ=U(s5GfUvnR%Y2lz9{Dm$@)$ z#JM6JkVf=YCxFYf?9-&Hf0I`Q)S?Go$9eh){I~(IZ`=+C$V@-<#bk@~5+hU6$h*CDGhE$Zlq;YhZ#5uZeRpM8NnJ1RvJALq(UdtTS`##f4!(a)MC{O)#pgG ziW3lCqJ7Xi&XAr@=#x$(wDZcJ&}zHBP6XU``W`6v|9PEwk{j*7A};7Q(=5i?G z;clp*vEHo?z13ShZ_{*7-!y)&zdwuJ(|`#qLt~0DKx{aKgV-49uc*Mo(O zk&w)y+0FXH!AR3!ATFI+X{&f<;0-u6P@J*=76?3otaBWz2KA@uM~pqPuf}(O;the17-yI=-2v)t;Zg>S z$}Y%7oHR-CUlaApOdx=WLWsFE@;Q=nupf{>_a5)sGP zhBX1kxt4;3kYP5Y6P5kd0ub8B%Yj!;DH9=mMr+3DLO2As&_hXTic?Rdkq3@(5TGA0 zJwQKS8ct~m+{<*Z{$q zlR&gnIb4ek-(L$Z)G-D$a`(n*Iiw2-NFUdf^EHJG^lAVX>hP#c2taZL2oOHg&M2V^ z3r0TS%!evuseYd~>(;Lm?+Xnuvm|mRBeicvk@DSba@|*<@V7WkUZE;)DUIP4IOos# zc9-NvfN|obgn+VygzM_Yr#T}oFPy*dq?~S1lIks9dR!T12@I4(4Bj+`(;A4iFX4Gi z%U-G#M?&ool5%0VQ<`UWs^&>WjnOwY`Q zw^#glA?OwSiQ5 zP?dNURJD_kYv~}GhpVQgFzxNrNukr<2|F*|gr;yAD#J-&cp;LIqmH97vjJ+dK9e$G zC(Smw>^?YO`pjK)Wp9z1H7l7F>^n;z2m?GUlUpT_kg+%9O9M(-ji#)R5k9d{x z(*U+Q{|7h2Be8If79Nz!_wkC)LZiS0M&Iu*0yD+zjVl;1w^?;aG0%;Zh#2rp#`MdU zEr+bR=2&Kw(Wj$0ddcSIxlqVJ`b09|$lAT+yF>5Dj033{D zm2>2jnS``Q3~%zSA>u}ZW`G~R@h0&j=)kGdh~sA1fT=Ci-d6H(V1hn1_IZ$eQN3&p zo8+(pA22MpS&_8Lv}(LMSq!3UdKfJs*oDp-PZ;pmnswx8|EXoP0A(SJoa$au2kA!VtwNg{kftYShl8+rsySjLdb)Qh9(wo=l zzjhb9nMFpf!cmzky19zUZxor!rfLsfi!Fd@6F{zu9F6dO}6Qh85w}H#1*HU zj5)S1M=CH|iT^ahc|t*YiZ-xKr@HGf>_2af1QTfP5eIV9FpUWYS*o;qD^(f`BF2`H zyv_X_@(xh_bWQXoE#s+7FeUs$D~r&(kWjvt1v7<8PE!tNY~^wy=5$ONi?~S&dRh0o zhPfU)ib_=)nJQV&DW}NkTfz?Gek=Z6zOu;>@XJMW5zy>&RPdfph_Zv}Ph1JnXNz(ut&zkcxIiS+pgM z5(uEj%^)Xu5~E5}qa+j}D?|zGAPDvsE)Xx{E7^6DjD1)z#giBaCixi%xQK`xTE$1o7cE2WTZ=|p&$q*VRai> z<$>rnrd{zBN3^;|`zeA+5#g{wyO0miLE5NJUa(xEE3@H+v#OPF^n{C{7z`hS%d0_w zmOU4(z?)mW5;Bqw;F4(^M;4xiLm<2ObccL%x0EEhs=(fN5Sik?!iOE6j+1UT1ZG4a zPU>yoKJWy(mlu$k>A{xOL(1`+I|d=oo2LM&4vvD$%A98PQm*5n-3l+MJTpZ&fuFwf z;JR+*P|FF((vGEpe23(RtU{UzVi$lZw%iPLaT}R{h(L_61IC$;?D2xA8ANzW1(+>M zD;+(t!7`Z6$YKXYTZ>j?1qRz}{h0G%kjyD|qiECTJjPV~VA6cW#oYZ{wTH4~xwiS< zm_u3KNdn8P(om4a%T&?a;FrVH|^quupwFI?Mm)A*$8S3F-lPfp~T)I zz)_6h{j(y&im}sGx;ojAotKhH$}o{y%7R-ln}n3Px!mbOEVuhfHfi~Da&L>0kZ~X^ zmwm;eB{z}O9M8GmwS9Tw{Cxa&%1M3cIW?97;(T+Q_cTvz8%d@fuBusq$)Ypzw2I_X zA)0SzdP*}tY9^2vr){2sG|;4kY?lt8nFcd!pnTMwd1@bS)h;wfFH2>So=F6Y9piJ@ zD=t96Ms&GMR2Xwb?ZFcpUn8q?6&vxa_w)4Z6~3|qi{ynXywT6ZN=xf1xlm~Bf-ogl zu(AQ}sf?R7e~$RABShsU_3%|h%Cn09B!4EuVO=%f1y<+lv3nMHUc0RG;h-W6zzq8i zvk(R4n6Fu}jSNJ1Z_3sh@FW{=&ai)+6q4_l*v~|jdSlI}31Kh_-o|9i>#d(?w+V%` zHF7|?Iy|jFdn76Y^{hEK_4+uaWIQ6fE>DJ&vMky5gf1M7l zwP0bN8K?5t8OxI!#BXRph}juDEp&w9QB5Ep6wa3uDAAtnzbR69mLOl3e`M{!@nGUWBYiu1C^3hMIpE>0p& z$}HmX*dFSXp0~Ny)HM@#BUC2KOt@x~n%Fh;u2=mSJXh&-{R*a#CJ1blZNd&krC7z0 z$LRp*3W>phU6S%3a&wa?OKpbD+yFNbMr^~+ucdD3S?Ivn zU4FJi-trnpmY^hHhX`&n7Crx$&bQW|rP&~C@w17E6xq58rzxBdGsy*ENKFuDQ4jx{ zl>~_PE&^ovn1tEO7RoK=UgTa|+ei-&dkneznAo_|!JW1W*^i(+#t>~YyC?6bYa96< zHOayPriUfy-s4Qe4ILkYhp%IUA8869f{fv>sPU1PX?pC;K&0kt`aZH)tQ0Uv4A0i- zy1f{?5bd;qW*TzUJ+Au&92hR?^1QKov^eMopK~7Uz%MRB57Zags{( zx87^7+|G04JWR-R9-3xFOd0R>;2MZI7LfT2Ia94Z$^rGu~ z9)l+y4_%`Sx}-9BCN(vLL9dzZ#a3fo1j@=h3(AzH$zo>+)P1#uq57g1lmOPbwaMk+YX7*Hs&@FYbJwhm&@YVy;ji2aG@X@e(BCYVP1qL{j_ z+lxxvcc#ewHGyc^gEYKq8>mGrkx6n$jS|>dw$Zn)=+u(x-}h8)b>%Dx`7d*^UI_{e z7{d!GI@xr7aatS!_nF>z)2(Zl7~QU{-&8Z~$04&6f=aF=TdFF~He^;pP(M)Zm>Xyx$r zc}}$lAiS&-q0ED3nNraSdBOpeDx=KB2s(@hQhQAgpGPflOCXkofixzHul@J5?sWu( z#QZ4^c{ep3;9dpBVz+a~MjQDtxqOAJ$FC00h?u5C_d*D1zWaMaZU}2o9%Ssn=5&jq z{Kgi~Z?Vw4Rlt$4+cFOPw=6U(Qrm{j%ZI`bpTsgxMB5pGx#38DBYNz!G{cMF`544P zl6svhgP<{}BSMlGuq4Y0T2G^v8L_jq;i{UoRH9&HNVR&iTwmjA;bn)dl%SiIP|9C= z)HyX->ZB>1SiAG+)C3V$eS>C0OilC!}oUX zWNz+Gs&RFnh6$D-SrzNX=8xoN>BVRF*OXeV!QTt5oR;+1$E<_X+S!D-=fnmgJ0t%b z71-xgCqQNJ&rCvMcJ7tHNf`;(5{}bWXi7r)OM4`LNX}#EzV;k*9hucNcP#N3Rp$yC z;TE$d?h@?{Znf!j31#4BQ7PT&uAlQ}seWGTzS|cc`Mc&=_S22u8mEOXZ3qBwK#;!* zGjITi?({{~ouI>Kz!Dg9OxKj%Irk_LW;`}(3YPKUn6J|mF@y+9^fi`AyqBuJ3P$7% zPfT}XKHgS}OVGN@CJ!xVHj-^LGs27cr>YZ*l%`7J1a^aIVyLnz(L`qxbJHPqHTiIa zbmbTEPt{~*eq%02@aSo-Old}Aop;$HMcnLDCp0E(Q(=<_$|n=2Tx)@v{JBKS@}69C zMGbFXWgIY<+;vi8s+9yId_2Ms@VzOqms*}>M8Y}8g4il*k{DJRUzo&~H-Xv`t6Y?Y znLno&%a05M0|pI)!wg{x$oo9S$_9qDyb^zUKaRt)l(1yd;VO{STpb2r%qn0RTFv?# z)2^J0o>4U_{f0^>YQL>`KM>-;$29qi zE-o;s5zG7GKJz2EcMJeC=dY3Y`i+*cOY_Birj$7OF3)m5wSTaEdk2CD{nL#o8ClJE z)*q*~_J>2`a`~xQGJR>vwGfc`>4k8%R!Y)pvM}iWN-v)md;Rg&wW{F!yUVp{ixZJV zB9HkO=`PS}eA}1Ybkn3;W)0CU7j(67{k<>r5|x#Qv_V)2p3b zoRpug`2u8X*BkDOPLAo#C^#^=aef0*R;i0#ZFWjn&P<$T%8VDzz#eWpPk36(^}gV44ZN4lDE72(IRbqp6(eKR|{~F(_L`aS8B9C zI?@-9iaZC6GTW<>S2pOBOuF`GMuN7ig)zk+r=SkMX`kWTJ%lJ&bDNpOEu=_p3Ey7T zb8Gka>y}cSGt^`7Jl6;Qe8R$^@WqCMzl9TGnttSYG;zK!YMf6P`*t@JgsmM;1wc|(?c%xEK`Xd zc@nOjDOs);JIb%^%G0kdm%AN48yOD_$pYG?0uj+&jXd~r!=r+9a$2(nRI(0;D#p@8 z5fYmX{d+yt))2bHY2)O84p@3&oq4{+pBjlTGYqeVBw|Yl@4;I~@%ogMJ;OZP z%3Gp$YrhBvI7ea)0C~h7C9PkCc{gf59Csk%ZfF`352mR9f_V!vhBXB zFIFV@&-UW`d^v5G<{{v5;Nr=?;o%n$jJHiLnA2u^%T3#=_Fj=$kbNCp<=j-#je<*_ zd#Np?rQF^XqLT=Em%qcZZ}rGQ6>jRO8c#Nji)dkkH!=@_rH^5B_pX)m6bvhMF$Y!QouR@njplP3U!y;oSXcJI* zeoU~kKCndH)*1ssmt3`#P2xD_LTe}IYbCiu25i)p=N&N#;KulUy2;L^ z!&k!ukwW50G2MYt5{IG5G!}j4<6gggu>(ERib>vU4$Ij%Xn{%ZUNWUtJ{Pu$Nq{yD z-|)HjHy=L74}w~*!U}#f-vjaAy3)ex6euU4;UP>vs9oklY)i`_kr+-Hm;r=ahWY99 zwkUu!1_)}SHx2NtYqRj=M9C#Z_EyL{m)hnzfpc3^6f-@aNC9!lydlSPb{bS|&-<=1 z9r5MzQ+Zhp@N7V9-Mf*dT=9}6M4G`HGJCAK0EM1>T#4zEsAElXa%v>(y5BfQ5TMI5 z=pEpWGVS-?wG^ADEMC%dMJkmEKxxa<(-)R5iR$mZUM1mK7!e_49RfXFDC5QTwNG*| zoba4vCx~&1K){iKD`pMsINLxXPWrK|iXL=nd#=2N01&OFkpAIAQF^=54;XU}K{+z*LMhJG z*6Y?q3XrL={o#jPQ}zL0^kw@vC9)5qbi}8pW#q`rjkQup5{Jg{a~tCQX^VJ8z?`J z=XS#o503(pp7d$i4N-zgBfA7MvFg19_jE`W-`0|SD&62B#K0p`4#JrQW#0%Gafp49;Igh@IyG?(dS%Jd;~ zy5lM|La*VgFk<5EeiXz2i-uyVjjtvgn4z!`h$Z_Xr-NRs$AhfC1?L4k#33A+B~e7b z{L3=A7PY4pN2hnl^lp}d!W2$a740^c_W~qt1 zxdim&h42F?n@|Vr(vR;?*@z)MXE0e$@*byShR@j|+#Lv&ursA+hbItCQQWSw2u#lH z?9>p#C8>uY&7(m?H61PLJ+W1+uBn#7ODa}vz)|rW(EYa-mEIZ!wxof4(R6Ah{ZDa` zu?8nUAH>5q*j*a{%Eoz?^Bjq<(sEjASB$yH;sg?P+CJ68bcT1xdKNAFv6@&MhJYkzh|D`rJ{a2<3DdSW%HS_03Dcr#B)HKpF`rL^lV^l*R&%x!Kfw+*g`88dLFl zJP!z~jLnt)?0Z+LuH)~0U^olCnJ%ym|!Ys!?&NmnNVtA?& zSOykRe4;1!J$XGhsN6P_*}YG35fXEAwt$eHQ|?;|Z?xuVFC|6Xt1g`>>B1{iDNZtuJ4iUf@pc%ts01(;Fv;p%Lxh`6* zs5k9{>&vO)QPvoOMJ^CZJ1bA`A@G)PNb&6y<(VWNF0)|%g~xJx$D5^<+ju2O=DwDY zg@BtI-xV_2Lahu&5YeZj;mN>4oaNDc9RZT&8#OO_yQPw_IM1Sk^um!BZ{Ve9ubCFj zXjzfdQcIN?QaHnp!D6H3xpi|mi<2VpRCy?K!6!pTIeDaT@jc#=^|Hg@tX3!f+(>s} zI3LcjjFqMr;DHB+e<0?3 z6xn4ipVOCJroDmF1D-2uax>kM5|AO&G*GfAu!|=UnNARE$!)h673ExGPOYaYEud)X zTnyYfv$%<3?!oZ(5y(?C%(^q#UStZ0{t9c;U_(vCiBI;;^nu()bjMwZNq1@b7J1n` zt+~ofi8DDqgfFuayqBNm>}9HyTsEm|+A*Ch4G|L>5e3K{WRO`{4F#>#!cFTbJ>0ie z{UUh!&XDs4bkMQIrxsOY8xF*5+27UIo-FBkE9oMpOF+-2QUyoL?C|TRWapKO(qT}j zvOWoya2<@x2|cw$eU+&yWvqWt8? zs`hRwzIEoeKBkyb|K>JpD9$@(#Sf2fYzEtaP1>PtP5Wx+P&oh?wrD8~fl4hkEwH(u z^PI0>KevG9LP>L*#zrc45&e-TpKQ?Phv+4MLqa5jdb5iu1A|BQ$_XLDvP%2L@hYnX zD(aB3y@P9ig3%c~Q~ypD-&}E1jW$ADU3-DxhhBaC_5I23zJ2h1lkOn1ZI{NlT*8cC3e(fvN_BBb zX{T=>6JjOP0hLF5G)DXj8ijFWe%bMj)o=h_k070PSJRx5FwAGgabC(4?$@V5Eb}muB|?Y{gn_ZCFj?Xcu7E3 zltYy@P!9$VSHu``XG4wSCH>xQ-2CGvkRFFgLFNU&Vv0qiani!-PQAgWWi*^7adT6Z z3uG1eum9?i(_}QCihqm5w`TEVGLh42n2f~*-JWZr=JcBKjx5}v)^t`%Y^k+MnCzrz{Ao9X6ElIp5W>_Iz}9 z@vO95MN?+7h(N!~vTO<&03)hZtSc2}Do>gh&VvjXWE$V$72~2Sd`>LvwO}ky_g9oC zbAvVytp^Sx;Ul(sx!^SDy5HVEs?N|%_8$m$L_#F*jAg6CtJx;Vs9~+P=%a~)8ZJMi z_b2%)^DnMB?Zp>YM85mY%ABE)S=ux9Hh^O%KJ$qWe(HnY#D{0^ySv|P)5CE*eX4QT zUQw>v+UsikJ}cAp8ax*Z86H~Lo=XN>SrrxVxV_4bi<>afBToihtzWi$ii!uPQUkK} zZuq~{mK{07PzjpT$h?|ZP462(bVpx4=9u82OJ&K@i=?!+N4;i><8dar;3SyRUg>jV zdDRLvxt7ivsYX4u)VQ%lM^n2juWGBfrSskmAdeyU`qyAI#FP&XPpD1`YC$_8I5hri z{`i$hQL1GcZI$Q|o^hOH!HLKh=rOqR_PX3|VUrRmPv%RsQWPist1L^;UO6(8On7+4 z@Ioh8`()R0TBQhx7|ZfhDZ5>v@+%MG^1&1lqcK^g7G=@HaS zOVk8M4cp+b(pQ9VnN|f)G2NR>xL#5JLsJ2r%&Ym{#p69Nl}?aig!EX3YAV3gh5o?s ztQZXrprkoRrUxDv15o_i;oy?=al|bf#7g+oN&m%SCXokBoVF4Rv4RjW^bK&p+nCDv(1GO-Vc}kNl^jO{1cJMTLPpcPiC}hUL#p?0{@Z4$Jb6mNl0BxvEW@IX#h1gDv}##-jAT1faCldbRNQkGH1p&`%aF26SsQT!Y4 zT(tAtl?G8F@(8VIr3m{~s@-ENn$%l^VMSGWZ_iFA=d-TQCT6Sf$5`JeK(LX*;11gz z_T6~F!&^_k{?+%t{QPs@^X(t`rkA#9Gz9~Ac10Rqr&at3kQH)pb?{7;r-ZXtq1Be! z#L|V7CBBlLL-!PjeAmPi7UJk~Gf{4tH0lEZKx9JYKBaCY#32opB#A^MCA}z{)$@YSR8l`mYEz&Z{;O$`4VfI%Ppfc@y_ zKK1W@=0p3#@A2u|n}*r8Z5xgY#<4`j&-`0d)75{Wfr3G2Ow1oE)#}#oVHY>Mso~cb z^&VL6O715pQpw$bDghTAUcWFUS?+ig_RylhB0{_p`K{|QMCY3yeOC2&2|WW%29z;8 z)@S>01*>rmAJ17?JNv&*C4=a(?@VJPmLBkOGP?-Jpehs0vnI0m_-Q$1>l9Tg%=>O2 zJr2*?+w2Yjr67;qgf65qpRfckaTdZ?Y!wL>?d8(IwLVzDy8!>BC7PYB3C=ReI8IVI z#dQ}KT!$^uHx}LuaXerT!0rzF%`pDxt1s) zpAYcfW>ALf@|9bXDZ=lN4#!7*wxttyx(8#Kdk0^Lo zwUJqQ00%WVWDyUDglBRiw=Q^tBJ+*=aU8%wiZo&ay-lBDcMHKY>}AkKrS$2>A}`=+ zMY=)@ZmhwVy58@^&WT$lQTm1wtxSnqMsa{CdN26X9@(RdicB$Ljvw#a)|u4w*d}(3 zn|{w@S55dtaj_Qho!y>%+sE#I;jjO|+yDL7e)V7e&i#iz`Y`S;p8IW=kml+G);Ob$ z)?`P-qRMG_nrD)cTXnY=aKh9rb^ao-6b5gq)oatW54`wSjYe#Y7Hyo#FXsWP{zy&u zG46lCbqa-^Zf11qaED^r2K99aIA^x0y^3QmHSGCtF#v5>^Y7OMAv12WPnsik3?73A za1jLDd1JI$9Vxgy)6meS5rwCeMu)AFzYR}eC`7=dfp$&~AP5`6q2Z@~g#q&%@R8B? zZe6vvJlbCkfaLIW`r>tKC!g>rVoTo|qTSyD#-=LCMxSiDux>T)t9sL(B&0a;TyS&E zpUEH^ro+gGciy&#r$6vL-~ONc^bdXJBQM|MGMW)Gk2c2JRe5kNJ@B;H7b8p8q~$Zq zz4vyN#}3kcQf55J3pua}Ly{k5-x37Z@CQm7ad>fX7tSiEtnXUYTYjTK9PM7qkxS(t zfFhTU5{{N@>ecx-BRp8aymG)HXa_LHK@LCMXT|}UOsuoFkrYGp7GJ6P$SmZhb_P6A z7a&Ln>T0KC!fQ8R7qe{*0w&htT_dQvxkDLMPrXo$#8K8w_H_3c@Kk|prpYyjYJ>bV*qKUwS#m%Qm9o!iMJ{Tu2cIhS zUukjYjG5b;MmsGq(7EM=qw6G~iIc0V#<7OqWSztl`3lo(XXvY~ zY@FGKyePs~A->7axi6nOA9X;xNqvFKxm_I-0TC69slX@nU2( z^)pSOv<#di6bKxd7@5)iIx(#hs(HR5Y3VG;y23tP`IOrh%S8cR!29# zLOB-|h0N*e(FCB-a?T})-lT8|KGg(@NJF72r6@T}qFarXPOOxwu?LiysVbv()*!g+ zj^fj|?;hU%w?6UufBH8*_haAt&2Q}EURxB_Lb~h0JkL-Iy5g*5vF%Hp?pkRqS63=4 zSTjMSbV?E!(t+b)JRF{yKtY>v2VA<+x194Ccv-a7Y2oDWU? z>g)1S4<6t!Y+Go)N@iha>4^GyAkPz4c2Z{M{+8H%k?^u6HV$0~k|yqh7exsJfdiu| zncb%dMoex7n3Y+19Tv{I{($8gbi)fY#UjZqLyvS@KmxSQJI!lbcrUaIBl*<;!w_vt zgbzh=nck~RE85r_<|V}2ZL_vhn`+(`W<+&HEj{iO9@yUq+=Cyu8$bU2AOG4{zwf{K z<$v+(U;ACY{$cF*f^mZxjsY_RY#iVWHwq-oBAHkh1E7n%l3vLIjhPIZLVf1M2UvT- z`&LOLcKIr@1V&V>h*hbGIY$^NiajFkD<0Xh*=9q4vh;D#6_^azqc16sp$l*^Yy^n| z*vW=y05}vikc<*|w<1EzAH3 z%WM;l(6X=-o2TH1yw2!p7O<}F(8%bxfI%H5WzBI6ZX>;R0=$Wsbhp_yfZ>O{xkVIn zJh$Uw&!0d4+HZdACqDMK{{8R&EC0^NKCol=oed-$#2#X>?{v>w4ag!U5qx%As%O{y_8E~HHhK>k1C}Q;SiDnOBfA2^X-z+p;xDg%0dEC(FY(#I@!&4};lw{C*TAZ*mOSilaqw74I~MK@*oWjB8%IX9+L zmM6N4tlVQ3BsV-S3>vK)P7WdDmh|jh%r~yE0@4H=SKrr1L+w1|Ic9@6@@!69`n+P^ zz9qf#BBo+LO}&=9zP@zZsi%a>M2Hi(*l0L3#sfGGjqE7dyqe{&4o5iMi~%y+L>a$9 zS!>7CgG>mPuA0*ws{jdvsduTHA={=oh(=ltWE*HFBghcPUIA(x26vA^$I$Q;rLDx2 z9fr4`K+v**93nXSH~t&x|sjsP64 zX*ssh9;Oq+C;@h}4Q{#{85PoL^i%44rnv_VrRR}hyw{t~D`D(S9+Qj$qIsV?kFFsx za{*464mU+?X2;pwK$yccZW~1%#3rTjTWDiSeBYgP)%3UmiyOY-UkSMX+ErE*cc6%| z5kuq6*X)a5_|7lC_3%Ic<6r&tul~;6Yi}OME{V8YDBCt{(|nhkKf@11j9hZ0`>MTF z?E(L*&#yt9mB`opiABWermK3&`Rn3?QVn~O)QPXDR?25cz`P1#X6QL<8f4-oU`Sh% zZZ2vXA6)Fs_ll0ker?8)+A>2StY~gt=3Rpr`g1&WC zDmC0zJv{f7sYJ3y#to%j`Y-u+9k_z1M3x4=-bT0GYU!l+w^7xP)Zh6Q;eg|5U!;s)x}9nBvL3(R2RcSE}WYIR5WSZj!yyEDMtjAjpvx zUbIU{r45gP%e+nZ!=)TK!~q_cySqCb&yKHu?OQ(n`p;C2#`B4OY#8Oj+~;kRfCcmXbXio4*+`G#vE%`{(C8fVQk z2(K4>Zz?pz3G>5|d04i-#sEbUbue98JuV7T#?vTpKO zaU9WyBJ8Gc2+1ZVFJNF}tuqHMSV>YrKo&`eO4l@##`9nNrC*S@5e zKWr~OxoGIn!GS%E3?VZ;21NJju9~W6Q3oHU2@cFsScvroxG@K4pv)+aTM4T>Zf3-! ztY7qH5OOxhh~O@XBY-$r)D1rWFpvS- zHP0$Q8hc;XuK|bjH)v^mv)FLDl6Z~FYNa))3yl1(5=q^dGF%PQ9xut5y;TvS3zIaVqPSp(LuBR76UOAR3N+59mCMVThaS=TGm zLla!5Q$P&Yw96b>q0*DZ4kAtYn3(TO{rn2Wi-fy7+NOu+JjMp?$Md_(TbHkYWURae>Qwmh>)_4;9ieqjP6R%~Lm@&M!qs{ok9 z$cssu%(M@O_2wzN!q|`FAY}%?%JTFu zdg7s=0tnY)Vi!iSX*wx@EIO_~d%RmvQSGL?J|{zGJ< z_|Z2t-sr+2B}k;m=Bq+vm*r9Une7Biv1qHEoeHvL5Da(77yq=E!~+{d;yGw}G)u!v z!Fqjo#>)M~m&=zHX=bStOPHo0mfWpWX@1L8U9Mie z8l{IPQ%u=VmdcU+_GFoz9f=(5Y}FQ&AiN2MtH^p0z%_WgLR!>NXuet+Glf_LHUwU| zddS1pRO+4xM0I6Zns2F4@7lM|FokI!y#MOS0oBZFE-`m;-8v}>4_}u7L(^j+Pm}Si zR<8nyeaG>jXHRXvyo_hZJ74{_H=g|b7r*egzwoUedE!ptVLB?z0na(ly$b^k=QX_W zQv2gt36*G74&6;IR|aK?Q%rWHMPyDRz~r%f)%L4Wu2N-9Cp*)!=ov3eh$_XP729=P z*XGRh59JsOsg-5m2K4Zx7NwUw_jxrU8GVHe;BICaOAOGAjMxg%>e{1Y@K`2N`LWZ@ zjX48oEtNZl^1dMO6SqxcGqG?&ZRd&f9i_qw%xXYm95B&lymXsp1>I#aiI1rn+}WRD2%@as#2m zwKiH-NE#VPzl}W2TS;N`!KEu9 zmHvb7rMQ}quKws6MVV)?nvdZHNkxE>fL`fu#!I>@`kK0L!sIba!i8G1T5@}bV4utc zp`V+&AmUx(DC#U1t`;(mzc7NcZF7NVPdl=hqzj2rjSpMo zi2+zk8xu_`%oNuFP}rzp?l}!h2)aB69`5c3p1u9n*S_-R2VehNKmNJD{`pUS zp6pA5Z#bagVedRD7V713;Nyx;YTAz?YyD=~=nEFm5hx=#uo(@!fRw@8DF~Ul0)XbN zhCooeS;W{1>zgsQhx4Ud(92X*DKtaI_0%aJ%~P_N`&=KOL}abx8c%I26C$R-T3(u~ zlOoeKKT23p2GOv&)t#MTiRm!*UDPpCt8sIySqgyt)A?824lFl22&!zQ4U(jT$et=R zKaKJ2AF{vq*Z%CQZ}7kRhyUU?e(yK$-~TCl^7`{*8+HL7;GKz>`mG!??mA%Uc(|af z^)QkO){_IV{DOS9T-vGy&ys41Bo(YmS;pptFGPpRbbZz{H83TPQj*z)d=L*$74ynZ zTm^Lt?A=1t{Q9vV|BHXE>GilsAlc>q64jc6(T@x?wnQ zNPeVD4~9*OJ};zcJcn!g%QL<8#0rshqtfQh*WS1~1zuyS zBa1IY7H`#g=s!owuHbR<2yo@@cN4au&67sL)d7;G2(l){gh`|5I?KUIvMTX29oN%H z%b4xRkxHJtm;#N0xWj9baC5B&coSb?)G;^Y$a{?rJX(Saf8LOZ-GH!x@xhrCq86DCvw&E<*n(EPQr&10zS z6o|lVN8@60HM%T`<3xq+@n&ZIs0QZ#qY5T0c`h}vZcn(8c`Ex?Bu5wJ*3wmkiJ5#w zea=nAT-0b7=@7duj1e+B`Z(H@sXmC&w+dOnPzP}gXmF6&pi1zmonbe#+`ww$-Vxe& z6)IU_aL6xgNC1B3HSa_i1Mv#x_Hhb~2B^jwYsA&EQe^;If-aDsmNjq}ci02Qh2#10 z^*?;`o1XmakA447e*dRFd_VR$Ru+5R^7D9egG}NmE5A^KBmgETPJ)Q#(P!JzJ6u&v8CX^qYuZZJVHTMiTqw|IW{;SX4*az5 zEm$~YmSfZla+rXTu?0ej14T+pi6m6@m&`6=?D`B9I2J_=dDS=q9P{v8?54&|>dAwd zWwPMJ`YXxaW3cs*>UdrP5LamZClx2e=te1eI4esZ#vi-t%exK|GR)r}Oab z7L~fCZ>EQr;8JKn3qKn<2JeV(egEBm{8zvC!|!|TAN;TX$8Y_?m-d%Gg8RDz`+$L) z+g34ojW|p-m3K2TSnxTP36)#iosD8U>ONM0cNLZ4=oxLUC3_Gq)(Rq1E&Ood+Ut_Y zR_$$uZi0C4Xrcd~YB?K>|-@7_Y)s#FC7@mMNTPj6SDu!81KfXT~?W}c` z+-d9_Bjr+=LYsvVc=Ee(n3;f!+%ai@T>uOi$3BKGZ{usf`_b3zKlk+##->p8mh{rVFeP$#8-SfF*pWe7y7j+P%W!Dzp*-a>hR~b>L zQaTPv*vE)gc<(P@czVAJbV+^m%9g9z!Pigg)ekkExO!bKF0^0tSD@L2}TAyM^ogi>< zAUwvT?dd*-WcK-?TKkHvTr znL(RC;t+>uyti%RAdUmP>~`3*x9s^Jef%~4+)sS=@BGMjf6J@f1pqr9p!?)VlKa$K zzW!V;^HZwe7TmfaYMLN=3|Z$dPm-!YlxZ5uL#dJd;XLJxXLE*`OV*Fy-TAxIwKBj1Q9FBp7qoQsJjLnW zaD#Tpq{=fKVDx{IVHz$eX7_kKrqfj0&#-7Hc~SnCqTrVr&v4zKKVL+>MwrFX5aT;{?f1f>$m>D{q+w%I~-F0_#86W zo&<^{+^onxGl{aCJe4`(p*1MnF|v*h^AmbIk2{T5gqJqmD|&TJ@#@it%;ZeRdx?nv zd*|vSbJ7ZxepR7&OXI0ZtJu1|(0oaRelFmUoMJDFL(F+uNahT$PSZmp|0`vg6VsF^ zVVV@CoJuu-OU7b%asvm4IAjBWHVly)AecEQSggTG{6*{My3ZpY*>Uso9i3bmaDyo$ zILQ}YMV-E9(DCpvo(czfVDn6l2iP`g=4d$qN?bTs%JViw4B!Gv6viGiwCB^24)?a+ zp$b(4lMy!UM&q+5*O@O@R_F;UnY*-6hyPFY+*41QRxcr|fxK6$7mF z8Sy}DOW~)5HBK`w^>4%-@E`y*$S{Ih7XLwO`<7MF3^Jo#gzzaF! ze-#WA%P{jwi3fNA2h4y2w&?%Vf0Zj=vsY^O79WfqX;z**tM_gjo+2n^Wm_K&VP+f~ z_0qoGZJv#!sNIf@;aj+6BE9G;302c*alS_%Y3V%e^25v_KiXO|>>AqLU=rSZ9Y6iU z--dhp`~T>F|FtjuzxMu5Zckp7-3_-}$3@x!c(^bHWqLmr`#n$Llwlrbd5da9TEW&F zfFbrht2QKf)Fu}+{OEo8Fte~iZEn)QFC`cd2u}9*c-=#0+H{_f1!6O$+?Gw5y+&%U zA>S|E`Z8?o{B}J~+S5zdy39noiV0l%219slO$I*k@yxk?HE; zF4?rTb!1cFIFQRpt_H6og_YDo>3)M;kQ&Zqt)Ve;F31fo0vm>nq2t1B$PV#<*^J|q zaU9FFT<{TZ$o658aUG>ulf0*>$=62(GK4+Klqc>+V0CoNB?Pni_NL^lALdG9kw}mI z-Pr5`2$z9DO1vC;38woy;hm=sZ+-bQZ@%(#f911(`-i^c&DUYrl02CE*u-#2^sJ)X zWsA~xHTMoEQ|ym%HAJuEp4;_XZlm>lX645izrTUH(^j zNvFBRzVMn3ugS7l*bV3b0e0k@yI6>5U6mq93&T@60T_n%EsLL7I5=~6LJDTwWk(ph zq#|c*aMD}l_ms0I9ZK>zNZHf_Xvb30{|0(>X3HF5L>=yUg$vC*4vdDpDI!|(mBx^; z(MW(01;$o3pUbj)yH z^hM<1Wr^ZuF^r>Gk&clOB)_;+-Mq%yF{3*Rs!QCsxnP`6O=P(jrF>LrGSO|d7QvWu zEjJcQ!sB$T1#e6~X_Hk>%b&lJbj~bZQc@6R*gs@DYScEFuqnA32;&w^UZ@4Lp0q{y zu9P$)njVX?0UFGJP2@3jT#n-y67~&xg2Q#PHTSdu zX(}q%IX{lfq19|gmf#gM3n7%RKy?IS8)9s{xOwnkV29no09`PiM|GIv;ZD!&@{XQA z{p1H;{hL4X@BP$Y{Pf3O8$0%b;|ODEq$9WS8fpeem2VkkJg$*p(i*r#YGIwz59!%eyB*SH9PUKO)4T;-zpkAF zC8}_np1O>fzU+Q;Bg84+{0DmThqOMLT|Y+@fdhxdZflSx@Q!yMd*%4a&wZQWM}P4j z{mQTX_OD+ap6;){F}5eVzZ}_kjeqLkh!uJL$(oBhOJxvuNr9BW2`40^HK96+vjj7(v zNKmhrfsYKAFf`OGlLc8V!zHkz1;t|fwF{l*K$Qp=uAXCD%B*2Los^~XmJR(Rk~!%5 zQ>VZywMR}J;O=5V#1Rf@MpfM#6xc$TT;Fo0-p8)_h;hW`MUeUKyjaH4dhl3@-C^6c z-I2$p$O+#z$V5X_4~aBM5a0#8)J}&O9PX>nJo4CNy49piFbdmQ<|l$8q10NsfX8k) zO`M3V0I~0jvc+K7sIb^PbC>J@Wp^?{)DXwm?Rbe#?=EjW|AQ}o`r~i@-JksYPkrH2 zZ`|Q7l1pQ>+~!;|2U648IcHU7ipmW{yql=GdGm_3^RrnlY1?;CWwFiE-37=jHrYlT z&UbNQHqSTL?k)7+G~q_^bE$wzx@O&yv8rXg>(=1Lx?(M|0#tsPrm?PlFL8|#hb~Ou z-nO5^JHUH`;oKw!kb>*825XX&!kUQBC!J?0O^{t$8tzumt$DF$ZC}|a@HvGCk5f}7 zE+lxB_sgNDm*)?z^h9$nhtm3hfbA-ySBNwuf6WV|02*Pv_%=?Y_HUUDa!Z3F43`=% zK*hs=C$Kl)hcEu%cf9=4EC2QX^pAh-H@@`z={xr7H*>px_TcCGk35WF(G8d?7Y`uW zkZ0f$klQKZfMz1@1$-uMNy!aj@bVc?Vp<$7Gz7RLl1O_HAZ(;&r2)7}iQkN z)(U1}P-c9Fr+=j9Zyn&~PQFcD~>V~1rlYm_Tf?Myp2B?zR zeMIltHLjwAm6j3YdptZ`p1-57e{~!Wv^(hlcCWb#ra6L2Hn~X8gSE#r3OzXjg6D?7 zggp8t02B_dY4%Kmz!u3r9O-e5OeDeth7D(%(uyEF;~Rc1B2It-qH)XVanrVe!^XwN z@x&gEcmD8+#`k^tqkrd%pZ($Q`NW6!aTnG3FT!3KDp_L4jrbIaY+T-W~iyCtXk16CU6}#e#@pb3Y$g{}%12nm}&D}+i|42z@yT<@Zly00%uYVq7#1im|hgZG)rh!O==N zOKi~LWDSz`lE-(22f)pCDC3B(d=!WvEV4|4Wt|0vFosu+8vt-6lTCUJ}8UQf7ZW~5~@#X9l;_Y3Gu@``8negLqNV~S$RwyMq24plN z?8$igD&Kl_|LVBd`<}fb?t{Dg)_i9}a|d_`MpEJfbVG7-oA)k&+$;7;Hoqst8a0@xwnD;6^XgF0*um@`S1GkpZdTD?{-OH1(3iYc-VU*3oX}xUq0vgFjKA66phgk%sf48 zxK-eV0PX5DSho|yPaS|7Sd8`gNd1fT@f4PB1wSSNeDbyDC82?RzZ~0_{^*^rJ=Ysg z?9Mz`6v;0w6W?(_PJ5hf6?N79UBRFJ_=c{s=>i>XK9G#u7~zLOR@UEUz#Dh^!oU5| zZ+`uU|DRv~((k@?Jj4i_*)|6Ku!-b$t6OLT7zWt}a)&m_?Kmisl}uS`A`GMG$B1+& zxlL>%!X!gFKpl|~e7F>HaWW1+?n05nT?+|MK^%j^&dq3~gfYegG0e6@x@e52PcLtM z<-5Q2!>{kV_bXC%7y!^S69g|c(1D4S0#7*l22|qB>-r3i001BWNkl70=f>O!)Gw@1SwaXSw|QS9;y(SWbsYW$nmz61_j=X+ zBSoJ3Cr3kpPr&`twhUn4yDH1LC|Su~v+kU8c0a1CtE;N3 ztE$y<)vIEQgrg|13b4uU{3=*YRjROMq77JqfF;1neJ(IElMg<6>A{B{0S7~}aBMDV zOk(p|Y!cRS$BuCqdnNr)ur1(5)@30#S6=H&#G#h;8jLS7#swN6+}SkeW;pbHgK2oQ zNMM7A5Ilf`KorF@jj;)hu8K>Y>oAFfV4x17NyU#j>Q15bSbS{Ek3FO%mUZukwKM^v zQ_3>VUgT6i!;U}n6UR`F3zi90P?&ZyE`R0=U%&6G7jAgLx&1_PVEE#7-HkODu<6O= zjRiScdppt+=4f%`Tr^9p5`*=>8njLT0|%63a}d8X&yPFGW-Xmh_`&C#f9W&MJ({y> z&=*BPRkdaA#ixkf*>V71Ltg@100s>qP~FvhGpJ?H z*QT;WywTv^hABJ=G;UGPMhKRdvMw*4+?DGO_DhrI{!>~LDTQpIr|})pLtBNtzs9<< zvOZZGW~w6tPcr~~K!d-as%A<;%Mn4LmVUBaqw3W1| z)pTbi;;IK$Gk&F5Y#7>BoK(A$bzqnIm;gMc6Ag`yTbimnpXMa||4T{fUBN1$e9^2*^^ScJ{ux(P#Q=Pq5% z6eX)^N!@1z{BWBX1W9nPz#eR%u__rvG4Xl203uwHN7x>-I5aB4>|||aHKUzd6e|UN zFSuo*8HZIuf<`sFob>|JeP4U%t6zPWEtH@`WO-%%g=`v`wAw49NAA(f3i)KVF zbOS**i&AOSEim4voUR;{&N5(IxKBldXKPQR&|6Y71?6~cNN(o=A!B)7D@D8xT9NcjIf zsR)eW$;r~Nn}8Xhj-ALhQs6cM9>24?kE*7Trn9pAo(#Xze%XHd8uKs)!u-B; z2BKe(;U&`0y9MeqlKKj3suEJzaHma3>7avw3>1Jpw~#oXcX}7e{6HPMb$a zSEZbh6!(9|%`@;h6^e+**9#dbWrUE>U8Jm8qp1OYXT0~{B)^MFH;Vc}pCMd!s*T08 ztp7Fb#0s%BFO_~IlObu8ADkUKeYp-$tZN(5QC%F`#QVx4nHIYjE?j!|?H_&NbIv~f z2fsTlQaC=)J(z)9wja~UWAFR0*895bU4MEpxkXd+1#h!IMgV1TPEk`;B~)Z!uvI~> zK4Ts((=qtyu{AFphc04|MtDSSIUA~(<%kkBQZ6P2Ak@aS%sin~)jO!s8^e2~Q{tM% ziRM;0kCHVriI6~p4iGn$N*c_)^GJ9|Z|sR>gi=|f3UrvCoySd+b)+Iw2Im(wgSp(B z+7?IKvIN=3+HP*9=#-)U365wZ2HAr{`c7K_3+oNyV9a7F)QP)JOAPHuJRI}!wpo>? z3LN2{4G`Zs)Ey}x7S}^{V`F@>dL<(pxFs2D)d)&gIj&o00i#GV03|}I8GD;vQAF9O zrHT=k!69`~g@v0~PjgVZ+Y)sw}1S;$L;jOQe0zI({jQ9%b`$*Z)!8)H~70jl}VrBbp`t!LMHDj z1p(-+P%zK1)TWye)l)gARGMRL#KYUn2DL*VnL&{O75FKSC(Rm2F;%q{u@b##=@QaK zlglPXCR?q5A#SfAYUFa$pjTuKT?~f~=MkRO6DiUxl_%tSHs%P9Mo_kO%gpt;A&^oO zrOXwez{(Pk&VBqVfBG-pc;|_e*S_w1&!63qg_$A~elzQC(eP}kk$$e6^L1Cp1?0UX zLpdQIPp&haV7O_+TW_aj!Dt8X?UXdqxwR3KkR+vd3JjVWpLKXrH^~aDy479TaV=4A zXmeHAJkb*{q_%|#=*yZnL#j?CLFeufse~EZo!|o28%BGK5pbK(5akdum~Mu`(#+hY zr(ASUyaWu?@zu;eQ|uHY#$fxPC5_n;?r0ye_K6JZ%0jVtaI?;_I5-YYc5oH{X8m z8{c;O<2>N$^OqrpCE!U~qDLB%Yk(<|2X)|40WC>gEFq)mU+y}9Rc9n%+wNJ80*lr=Q(^)=^OG0u^nW5sRXn|9AR+po}y{Hq#R)fNMVW zl|TJ|-g(_OSW^ma=YHE1IUDX7LSF z#auKRa`TBc=o++5wy|n=#lkV3fm+k*6c~^po+@`$j)zN$qwHeGpuicNjD&^v)yw9t z2(6eWIU4PF=GtV1qE-d7z&63y0oJ&Xbp`tJ(>4fnu^;0q;uxza|;Pem15>!*u z1;n`5C@@Te6AGM=!gdPW^u2*T&pf*YP|rAGI|KoRrcfef)1~kcm0Rz+@3-Idu5Vn- za{jE!LbE}tIkOk@y^N^Rx8p}P?%#z(=n^F`(l8>A5;W3MCr3@|8j536|5;+n;9gO# zhKFS`rbN{kn+TS~LNWx_DdMSCH3*SbOy00^>%6!N9uU4pRm-Uq)+V&FfYHL3nH*@j zs?8=#gMGvPs)$_Q4p^j%tXOt;4d=mXd1sd=WqD!s?hoIyzq|OS|LJSL=f?d#F;Ssk z@aTeoVrCgiGtW>rM}T!;9mzHimq|%0|2W~cJ;ki!VKmaUx>3Dw$6AuXKx^$zSDtTw zy=#fitgLOL&6JFzkLfT9&UzO#t4z4;rQD}9WF3ii|6T)?eu#o{i#1Wv=|h$ocbkoa zY8WX$&*HO;3mc}=-!?D(INl6>&JV5Isc6U#v$8D93a{z+dX~pX>K2e#z%hlT%~WU) z1}elL*=$ub-y#_V%;Ds+PJ!$Ac_I`zM`n!zrKgn5%L-$OI}3Ka+5*@SBhUwBn@&Mcq#DSjyVdmGkagL{=UEEej53S0&%B0^9%E6M7=eu^jRNPu zM$E`jfX%lI&u6`9qTSILJ=M3-)uvD>FgE2|hjrW)y`2I#G~e<_Y@6uPsMTciwLt@z z4TrP`4*C91-~VgB``(Y<^DUlw8Wsn}U5eCOE*tG>I4y&a$^#K`ap=~jbyrMx7%b=b z{n9P##Vn8j1D0SfBRiBbPQHq+DbRA%&49!-TTbBak42CmLucz?5Fo93#Es@>I`jZs-Ig`cpuwb3Bb<=sy=u5r;9=Z#&jQ@jLWS zB4(o8NvCdj^sxuteB0f!%76FgU-`ltPVN&!iSaWM5D_!ANY=d3IcYS3%?>vu&CuZ1 zjkm{rj_HxHz45E=8ta2%d+U4Z(VgFw3zjcdmBM~KM0`teiwF+cFRWPeY=0-uR>nR5 zRK;@^pZ!eDv|L0;EN|6p?%P%vRwPlRHSM)j>367`)t!k+wmjVyu!od&Wtr<P)8 zG8;f72nhA4Bl0rw@CqNk_u>ETU%%`9pS)-9`e*Xs^u^^8saV@pwHkN;KeDVUT9*mh zut7pwpUNjZ_~;yhx~ zsi~;~MzNHNDb_C#cH>nlVO|x>Rs^1+>6&O`XY8Enm}30aNxm&lTj8U2OHXY7Tm`TI z&iA{nH0u(pl`IxGb^f8p9{Sz)ef$wQ{Nto+&xEw|i-{V1B*3Y?aE z*W9F&x;HY8;$N?N)z1^D`vjknlf@bwGfS>$uGUwd5vBCox*J6}N{^v>9QRq1A5$=o zc-ym^ zSUo|!{yCw*_2)m*WpyM49$9_ctGcrr2!n~adx)rE1$}gh+duQbuf6e|cieN&&iNbc z#EHY4jSJ)zO^rLn&RI>1t?lD5@afa-XU2yz>yY!2K3U;R*L@!8GPbWnZC*~#iitD9wWMb)siu5}jg@}o8I%HFp& z)M~OjlOK(%Xah~gnx8dlQBnb4z8wnJ_gjAvDDWu2wvfSk;kjR~exO%@&*K9&<3G}w z)2DTvh)QXCCS3PnvCG6`Y9G4io4@{scmMGx@5^V;>&{6t$rKI?%kWEAMN$~{D&^LL z+t9!^BFhWR0M-ODDmmNQpcnyWYi%-gLj#n4+)(oK0-#Ym{L_GlW{@J1JQ0r@EfrAb z`65zxWA4&IzrYy-J$aDUn|3=I^#H!Q$jdbu?iSdj)aW!kzyfPzdfAbqmweVq#xj-F zfs-X6e$#3Ee^mp_#L_S%5UbT8pf~~S9z42Qz3pT7n%O`8nOFbdO=or_lS87EfR6|+ zsXl3=mI;96PC7_8v`vd}j)C_)u;XCPue$0Rn19o=uKevt)2LnBal79B)_MR&7#pvR znYt|qeZE^8m7VPuSBuY$lNgP*_2|(O#bV+n^49W<(=vPSVmSS`)s8sW-q3ULKX3_a zWtwUq;oC(R6l1|T;i1RGShxv{T6jt+P}{FhDFuc>Y}-U1cTjT$o+t%g>7cB*6ijnM ztXD4^3MU_fscAN@L?2kmr@ngOU;h64|M(MMIz06>J9!c|*u_H*Or#~|rHYV}R(SAT%2g(SWVvc=&*tlmQX2a3(Q?tT=R}xg5ARO zJ=@^1Ywp7C>5pN}Yt$1BsVzy7Hurv_Yn^G9O(SSCWZ{k+Z%Y(KMGXLnYx!K~4MtET zUu}E^RL0UDdw52S+Iv+)6r@7ZAOc$*E+GmGki@++7ccI<{f_%iaIyHASH1MPr}to~ zyCSOv%r!(;Wkh0vJh*#3*IGeOo9RuO&{ZD5HgS}Qx+;9uacy~9^|5lML-;~7X@gpy7GH=p*k<|^s_u^K zChx0xM@OxfB)S44Yz0dmmQ-8y7^6P@@p#2;!WfQ42Cdd6hP(akq}WqUfjt=|WpUGV$4L?9kYsPIb!r7|uS@oB*lrQPUl& zCPK^xv%!$U1>3p8I-@zxGiyNGQqne1Y~>8cr01uU0*_AylZAuL6nIQHpNQ+t_UDQq zvA8Lh24tj1vVH7JkNorB`QzK}{*vyVTkM|FmGgMWV$bqY^I?Wjc1&4PjTg<$0D=l6 z2r5=5_vge@nfWH+H#e?wA#H7WJ?h&4z~VY$12m&(dM-u?cW<_`#WJ#9y(r?TO3YL8 zuet59NS8=-JQx7AR9x4xVF8+HxnHWRMok6c5<4rQn5=_t;pk>F70*66k%k>h zYH+l57@=9sKjOpeLM?i*{aq=R=H6D3TqCbLMY~g1I(4=3)2h*@@m%Tng9NqdsP3ro zH3;WvasoESsXfrKKP!NZAV=dk);HMvVoHG`OD4De_KmM&OxG~hHMnh1vtV=WZT(Qy zWDpR-eD0Od6t})<$@^ApAB&hQ_iSo+VusIibnQ2QGa6|atGDwwr0jBGxP8@`kU}z7 z8X^8=y>?FO4wQ9`Pw?4mqDN9-jn1A>;Dq=$QQ-RJ;8#k4+m{u(Y)WGaY=hcDfifNx zI!eQs0;{*$cZLEd_?&WD2BrVwkM1o?;pB(p~S|?)wu#U{myF8SBe$S zFIe3>8BxRnVaZPb4XRKm2^zDM8CO43C?bzi>>@OZ4FCv&sm8ZpcZdkjysf(fVB{)b(ff?RTC6$86_GpuqmGblSis;@|K*5ejU-&x|Y1 zWUT2)t&m@>BLJ3S7gl=L7a#idH@)|rcYXHpy=$<4V0i&(0)cFn&1i8fXRUYdrQK!~ zTzXxqJ1kpbbvi0)ao)yCB-Wp8)kS1ogKizP=*^rhhqcmUeFYFzbxja}Uxr&s(CEoZ zMCNiXcwC{|RY*Ly}$80E@x{)O4#Lvu>muU<(;D23#3N@CK>Wmnv z5wVg(&92dvjL3?e9W2f~_W0xP{MhFg1OLJ6U;V1*T)Qhva*;a0ZZ8gge0 zB4*MpSX*=>cs8JAekzYifwgXZ^%POyTC-0f1+t&M<33Lc1s=7cRRL4>_kq+4J{X5_Ok^3IsyViCO%Bc{=2r>7uNCvTyo4PCdYrxM0F!UH};kpHq zR-kM{X$+bVoo2dkhWka17ZKpm)n&U009dK1UkYEt^$Psuk~A9pa;4&g&SEfh!D($n zgQ)3=@&O~6=$G)i(g|fT#juUJfEXr6U)aT^r5}|iCRt@T`SiyhT>Qa%Ka+K5__bCZf&2u z<=97q;|XS0r6>K_X9CaU>rtUxQ!R3P<41Ol5!k59=PCe`wXZgVv5n8#R%0XBo8C6= zS=u5>UhERevnESgvlD?)OL(^B`nuw(w8l2Z4s+FrQB$-R6Vs^t+PEgWlVjksEu+6E z6gXX0Pmlt2)WvshP#eH@8>f4rcYM-y0EJzmJz{d#7ask;-tfWqedONNaF#o#4M~`^ z=?6k4^NTWw?o4gs=fJT(F$;g6JGVoE>%R(795*?WVnSLEg(r4kb@GTAH8FIR7@a|>uTL&C(&&mdtOmYRms&&nL$e&?rG zhnN5HFaPk%ZaR00IXQ|zLKG#w3P(m!Z>Mux`^rs4k9u3BGDhwX$E-UpYTW_Gh9cPf z{z)Cww#M5!I!^Weh%wE)-=v7Iza76I>j8!nXDa8)?C-qYtQfUS)16RkXT{pejbUp6 zdo)7J1(^g;63jYqthHGwWU@OP5A(^Itp5*D;4$lJH=9qG0yltdB~zBb@24z;BwFlp zSb+~^`OxPc_|@Nj?+5Pw8ure}!6{+Vm1_2EU1gb=i782%(EKjnv2(RkpjByPbAxh` z1}WK+NBFSuIV*}E2F)TSETZuYmcnBh@T_Vb5ttcNi#LF8{yclRv3P#4800*OiANrg z#ivuv1~Y5!I&HDVHW|fYq5zOHpm_xoFi}=eEt%kbJjB>t+ZyW`ZTN`s{>%EVEBeB< z!~>TY7!4s=%CyxzB}a=)ag16P4Jgz|8WS+6t@m$G?2dJMXfec;(A(+&?WG z0EH%lU@(^ZnG0x}`QjBm+n3PMGVcnj`*h51NuR6{&Gvhx1+J)W-OXHq_`1qoX(A*H zWuX#4Go6j}5B6)d7}eIp~!nOE&S>uj{U z8a+1tD-A0pq{jL(6>I_5aF3 z>TBP8_`mz*AA9LD4$g_0=?V*AC8RK!hSQZQDD zVqIO|()i}C%U0hnDycf6RVtflicMk#g=^=e#kIPd$II$0!%<<1l+zhqBTJNg`DI*B z1^GRRWbhY~0xKI_Z+TPWSI~9i+a;V7S}q(&gk|WX8F$|M!2j|)Z~M^azP8#wi=F+P z6-$z{^q^KqeV{|w>u1$loxndT5u)B3=OM@Yw;-p$5T|CV5&`cq_fT>|Q z?ApO~j~w#0yT9>UZ~NHtM_zo(vreB#?txzXOAQh^17fDybcWciSrb`bSwRl#u6GSf z{d0^w7qPRg>JQpxn49bN@K{gZV=FNyU|Snh15c-Kw|9Lt>0^$Ku`1#E#1PeEXa?-@ z5xUL2t@!MKBSjg^%0d1 zeg2_;`NrGtxcke?y))c9up|Z|D-I83kd%Di=7~f=_i;q+7cSod{)p2rKTSdxG=>v4 z3`2ZgDNwLQ2^#;Ct+PAmKiCTG&3!> zT@RI4iWs1hY_TIHRT%)KmD|yB!&E_&Ri)aN?*jCE9(i%d#7uquz<4PWmVc zr_dUJIm^j_l1irN6n?h_2|%GM^FYlsSQdp*gnQRqd_2AJT_1n!(aU>(0po8 zx8&!cVLG3vZvz}4IzACspQKWU5-IomapK<)5M790iMVgw6cm~(dbzgQ z52b_4wbh|a0Z}5f3@9P3Vn#BBoxk1$7Mzk**4Y)}bIaTMOwMnPNr7P*8a;mwDR4{% ze`XZ84QvCfivL0~SkWFd-hSVOfBvuE^TE5nkay0fgVQU3y5g_{kfxdyNl2(m5lV^5 z0WssiASijMd>Y*5?g0QgmTl}1Rl{}aAsS;pV_n3aXZ#D)5s`0eg2@;$!(0cz43Ujlh-KtqkW;5lNHX;aW7Al=iIbR4 zzp;E>-Wn=c9uk0(ObI|2p;-c?Vsur52rtv}(>Nw+q$#s4^QLeZOhayF4#}`IGl-v{ ziYd8w?W2#$J3jE)J=(AQ^vi$Xrt=G6Am|3Fd9v@;=V+29Z!5d3R&2(2`=`F06x-f) zAYsCZj$~eiO4p0kc6!Js1uPiWy36>a>nj3mf-yS^V;kCVQke&PQ#%uUj;lE!%62%< z=*enbuC-=SqV~%UZ`d%=X5o?D8P>yPz$B8zh{(dd7`lx{d%87o6%@$vhuLQ`uJ0HH z_7dW$qrj@^{#jArcCgK;fW#fnJR}~@xb@?I`m4YFo;yGHEuOh<*grU=0BV}SJPawx zaJbB-CSvBfD`6wu%bTXMO9)rU-2)H&`Z*U5F3(Ex*c``rvkouXv9;W;5bCclv|6$b zwntYNk{@E8q6a4yivci$s+FV=?u*&T--=Ja!ty|B*LnoN(Qh6qj+|LDMRt;%+20Wy zQXd!F&mLw-A*eOZ5eV~(m25bO)MdWmYsl?~RDD)T$VIt6r6oiN2LS_`uB|1nStT83 zJ%N$9`KbI_8n3~Tvcn|d6y$IVD8_^n*Id4Yx7~5CB}qSX%lAKH|8xoJBy0sF1Ekx3 zZsrc-wc4`h^+*5^iSx?$s@wKGR1H_U?)rhpDk>#=g@9$?V7sJo^wg!ru@5A=x)?WT zt!nFfG^ltRKh_m8GpIV2S&T6>#ED)RfNdL;b%L`WW*b!d)uh`tR3y7QcrKDn4k?#` z6(HSh5?yXs9~Z4GwARiL3$@PRh&5O_#;=Jg+-Fo!#HPp4TG>7tARfb5A*K{KCf7FSGDgB=vMT&CM+Q|joKRp*$1^)wo3?tGOjg$*Tk-#xC~(uD#$8WW zG^UdUXNNQhXf#o91$#8xhdy`VH-7)t4}JPecJew+yP9c2Ai3I}jjC4icp%4)Q(dn& zBWt3oF5^`<9CZpD+3Ni^N(c-F36iVht&Un1UDoB$3{OLsAY~2puKp+@5b;sH$du-2&)Ys12T=jLE&fC^AT@#?~Sv>H)l3IepJ7lcdS;tn1I6 zIoSKw;p1s>CPQTyOjjB%XK-&=iNTaK7QxZm(`C23=dY&^Q2cZFxVTLXzGNF(N~G+mV=y56q;ZUK05 zaI$4k*f6fS#)&b;ChxkAwvCG=?GuXSe}$!Ci5ekJw${u|HCB?4dEiZPTT8frq!PBy5#)FeCQMb0jZJ=OWSDJE$Q<}&K1*E7xxT0S7#hBdvld^&6>PynY>0=vPR6V zTIm`C@79#_d|v{Z%QR6SEF;Q_%a=|KeD>3>-yafT#!MRsi7SSz_>=(vlM8#=AVRZn zb}T-SCM-0lMU<1q9pUqye%+1NocY$5FAe*KVF4x7{FYF_<&>{;i)CLW4VnsBeqT!^ z(a&|+sMgtKzvkQ0V(w@?#O+w=s^Ng4c~_Acs+`wTIuXH4^J)n$PMm${a(>^(zjW=X zo!xZvEzh}bKQXtAgpM)wmPyzs`{LZQ{ZQSJ<=k*|P=Ac4wrrTo@X|k(Ij-@S(uRyv z?H#-8((b0WRr^_2isvf!)ytqb9#LOqE5_O;W9zs^;~3$SvD`Jz%8TwVQO*3Uo~y@kX5+lZ%{kX_g%bfkfU&% zUBd_yZ~zCI0c!c;xob{5`^IZ`22smGfh4%oiIGshd5?iZhuU*;*0GOZBD0tpFbsn# zcF4bc)3q;p&NJ@${AaMbtZ7Fvz?P%}W*!`g1Y;Lqk;so2WBK=P`_#7|y14kI z*S+|rQwK?s4pl29Q=HAhYHZ8g#K!ER2dP7Kztm$yBg}BadYd#p){YxOs>lzAf)NN4 z4kcskZ937M?RwMOdTQIZ#%358={_AK^ov@mAT^6{}FD}=Tw@J`) zK~;x~O0@G5uY=2qV&SQ%OMq0jG#VEuAxg3A4Nw-(={6Rll)Npl#vqP`&)K(jJbZ4d zzMTTGnF1$Yzrz%GOpHlz8;l1vi?Mzb*g}C@y6!Js9w+p0BZMh&3HpHQhwpjlpZ(gK zK6cMH?BsRB$KLV*av8KI(3U~y?_{#FGi;g&xl z6*H9818+D59<24~Y@XGW;&%Z_Y?c5DkYEFmOb?L{6Ib8$UC(~@Gp`*4W(n%@J5fwT zfUKqfg^{LQ3^1{h+om`=)<_4?gh(QZOb{U@>)E~Gd!BdGnO#|3eAKe$Ol30hq&7+@ zEdxthrd7{f0_6f+=tRY{vQX>4hHm(Qm#bL@7)sg~vuu{(hNixq(!qqn;wY~*-mU7; z0}z&7EiwOMf0af{>?VjkJ`3i;HbJi$m@Wu6Too?Rr73e zR5V(n)p<}818E8B!89ReESK_=%oH0(=_X3omg*tO1TdZ8Hpq=(vSF>5jk&ZS060T_ zbNHM-I;M@I@VUM5CqjYSCVCd^?=S_f4+_V^SU0F*ecPCHqP1pl$NIjg0c!9xEVhC^ zxYGB0>?{A%Z~V~*Kl9Dy$?NUl{GshY_Mn7iKkI47%#>KBXU?~VJu55 zCdBG2c_51dD+%WnU-R7X%DTUO;q~gZ{MrN^QP(;oufLjw+15VHKJyscPOeI}WSao{xtIjYZK(yS3Gy2h&8oDNCvDzu!Mb5#T-kjKs#^k@Ok`+-XgTVlN5NQklVDZWOQ&wo#qKh%kQRl}_0CO&Kq@s?nyM#GGpMuC*9uxsDr0HK zIh>b{!W_ae$u!KFZ+570pyxiSMPR4Wbplq0X?3{Ji!XZK4X^y}r=Q;+HTd(992rRz`W>d~(a!(}c8 zL&@G9`yMmU+IgmRB*iw=g25`ugB$1st(8Kmk`=Dt^~iFxW86gIy^Hx2oYD_VKV*g- zf*ImuxwGQANA0?|-}%M=`M2Ns!OuSMh_=W|vz1{*QYeI!B;Vs%_fZzB#KuL~5$Hxf zxM|59sT5C2UQy%6Y;%2FTpQFCRlgztHgTLI#`F$5jE(;JH!1*SHP((NXm z8{DjLpDij*YqKYPr=nt0cb^BXY|D;;&n*Oh8>w{`eEB(_P>5aAh*~ieo4?rB;Q7cxrlJ1xTnu=bw zix1y;X87?RdeIA?b&+^g(IC0)%a%nIZ(yTs#E=IH}m$(<#iK6$6#Q7P`HY5O~4+t5NoibSl@ze()H0RewCQT?NlLM5fWB)#GXP;ESL8yqmxGnWuM{ zO!G?30Lz}9%*8H)F*wrs%sCP6XY=%*s>` ztAu;IO4VEpsbevW`Rh5C2^KID9e|ycVx>x9I=JSM$MYL*|MVl5F8!0A`{9>9>tKhg z9j5T~?U{S5G%IRaVUO)rYc)&kS76!B>QT$G_9CM}G=@@-?q{DZi*0USKGXF$je42f zdNRa%-Pahf?VQ6V7#r8MHO_VXL1B%XuXk(G&L~kM7q8N+qe1sV56OGFN)4WnLLw1m4nOB2UMYhCey3A5-&s zg#Glna=o~M-8_uu0K1w&!4-xMu*wBGz^-6W+d0=9*v+Zfw_FB`4Hpsa)Y`#0_f%2R z*s(is=53N@eCT69=;m~#IKr(!NIg;6Iw*8-&awoC3;w9e*PK@w~#neA`s`%O&7Z9p3lxul(kl?!5J`ukqv!ixZ~~B>@H!qGl^` zvuGw#$Xc#@p>asVWSl2n=FsjDx;FT-#O~ zQ0X#vVlUj=YWQSZtCb>Z3w6tEZJgF~ZFOTWX=V};nh}H2@ZyH!a$=mBX)q6~5~09E zvmPRuo!Gm$I{k(_K5^mjv48UOKk|ZeI|npq&E=iK&$vR^HvcHe%M*YI+aHrr0jVD# zYuy4Ts{+`)Ma{#q#?#oNuJ5brR)I10*sHv+*THL3vw&f)i+)g;)~({dx`b5I;tXJI zJY&FQE5>RPy&fk$c%f#^;1eSS#n_*gH>bE!%YDDn;AC~ibet!1?Tx|`Kx3`&Jfo=& zrxKyTsbru4JIg_@hWD*a@Hv?&tWDOFNP&~4uto-my4xpuI|XuXTt^KGarQM5+sB~5 zwybar3M^)-!gs1q!)T&&h~|!c8N)wZly+$P?Ik~U?*qT_`|rK=<6qW;8?bY*gct-| z!49DYT2=)_(vI3H_-##$%rIc~HHa$bqAXF}s0`tgSVz&@S}b^b z^kNkxEuUF(6#)v?e4Y;T4wr|x{O~i+?f=xPU-G(Fyx_)zh2%qkLK6{F14&7s36s>D zW{ZyK(#>ExctAtRS}g|nCXZT<9$1d~{GtSfh!`n0T)Qj3^kXl&@W4a=;oToSyp$gw z&e(85-KCXA@icJR4UCN!P&%|~V8Or~Axe(Z)ae?I<4Wrx>dHE)49J~!+@494t10|| z&@l-2zKKKKem$_d>IJ$9lF7p^FC!y@T{0Hb;hOs&d*l!9yeFmMZ@u>AuXye?Cksgp zg_!Gu9K_vm!XVk=8}kF9wToRbEi_nxN_FV{u5mK@rf=Dy_{K?8K{2QWvo~Y zn>@fp+KsHd6&+n_q05TYUuz<>lZ!z%KLFcN3f;_jeg zmtYTOz3uL={@b^I=+@8O_xRqyVt;>?jh2O`IBdOBU`at>C>OC7$If=>Qw3g}zzK>U zJ3JJ}gNaLu%Rc~B1npB?1OlK4 z6~#gbTWPs!jxbA!mURz&{x#{pdi~2UJ^aX9Zu`WggR~kFF_E$h|i zwDtDLW~kOnV$5QCruh^BCUYf@ta}W6#vod*CRCLfrFws)RBF3srr|q2c~)JZ`YcrF zl|PFXfx?);l_4uu+OGX%h`sIjoOCoxfmd zOlg*V-(FoeBUV8SybOIP^CO>s)6N)lyZx0$lY!oUfu?^JQk3q=au@T5a^)Y|q0B(0r9CR0UTLJgt<;IRjH z4j*~-%U}BQul>H4Jo8}RY=8>X@)Bys0T_}9q-3xOi#>eNGCrEgV5WeZf(1ZaV*yf9 z@`VOdSQaJ$ku?*mBn#m3o-Lk#{r=zoo3~t6{=preqp9qlKg?=ncbVhdzRJ92kOa^v z1%WJ|C+mG-=5W-kaL$LMTe02oN$uCFdMMqNf7Q#~;!0jpwtyxUDw0sdNHT-a6%3F8 zSjdT|U3mQ4Z+!2kE??BY_n+MSvge&SNJdL0QWQ%gN^*1)N*FaZpF>u_QJLwScR*pa zY~^aMu^bFV>(Okll^hq zo3cVO%8hOS#JvJTV06PV34=$ENh|ElY=mS=IJk4O)(|)^!fyZv2(Y>gE`g;TKE7Bj zU-6>n|H5B?>5FeVb&`~2HZILGI1uFuXy3b{Md%wWTiJtB3mY4(sQ{HtTiGVY=DIj) z7A?foRP}Ht$>A!egcm>O>_7O0SCjVp@4IVtc(^$G3`JTQUAFYbarnWl46ODI9*3@ zR$Jq^Ze0nJQ#zuXp^bnYcTgR`wdKJ2_L16&RYPz20?m1_n@X-%XoG?T$SF-jS?OS%?XjJz)S62!7m0Lrk+OJJqC*cl`P zJ0>@O*XeWr#cNgVEw_FA(uKX@_T_64Yh07QJ{x81f70C(o>lNcCqu(p7zKw?+Rbb1Yj_miSu1U~DTsQR0 z?rdAV#x5u3EOxy&zUv=ErT_pS07*naRBxD#2IIK=2>Q{tx~PaaY-#e)m2UI3+?u_L z=ZVbJ>|1X5yk32Kfj>hEyt=w=L?g!$e`nPv1OPNdi<&KI-@0h;{^(c!&o|umkuN-? zyXO|W`>Umzh%+$1A*94_atLlFp?-|@t99r?B_GjefYU`G7oCe`EY(S*F-XwqP=FAZe;< zp!zwwmM;95G;)ZzOeNFMSv*JcR&GNvh)_t7IhQMW7eg}JDe)O*raF)>y#B;L{*~8Q z+WDi~KA}l%@47?XYdU5aTgKRt>HJrmmlOc35xw0xv$bW+9_S|g$OwDv1=`w_hf8Vq zqQN3Sc3s9u$VvdeY{-3t%>YRdxwORI?lljsR`2=L7Y~2;9e?{Le(1-)|JkQ$sa`hd zm(a6|Yo6=x39sZM+c^%?-%|JZ;60^-S{L3|EzGW182DvmgeNy*X7z&6veYZ9s9J5q zhLubZ0E!wlW(V_tG4}4`A__(zS5h#$zh5{Pls!PvVz-ZJ-0u^Awls2VgXBy*e|{)% z{r6*1;9RkKWewr7L`{VQ05!V^Jd*K;ci#JN-}cduefb;9oimHwlS`0;YvDt96{Tui zik+eW?spugKeI4eH9~~4+k)e{^&~SF^H|+8cq=U?wf^4!GDbEH&{!O||= zq}o>E2=OCAXHe19UAWGQb-QMa%mwRcEzhQtd5OQ%`UK1vq2&&j#Y~sP+a@4$g07e^ z0_p7eOH01{6JNM=iDyopdgXJ^oLQ(LEe%FpxZ^Ti{hD+a;(VlRZ2)=utMZ!N=&q=4 ztu?ojuTVggIvjo5_#8c`CjywPeYm2oM?A|DJ}Jzo(B8aLk2K-{e?Wl0F+?_o(Sgkz z6P%R?8ZvCe86qRTt7N2-T5g<`Huc3z;dsV{H45Bb>nWtbCpgjl^Q14UCyfGwlEUS` z=tyQz62zdUO1(_^)5r4L@3{BZ{_Q*NzW=f1$+N?WgNr#^HW_w=lCudtEqVq)(xc*w zqSIv0Ceekd0}gvVi5&&j-G!Ld)It>%X@mlfmA!cjU+b>({~RK8U4WHH9`v$4{*C8c zck=K5%n$$6&CkDakGl%+veKRKOu{!JdQ_W=U zTN{y1B2t9ZRaQe97N#pP*$2P-y2aml{mqvy=C^$0D+Xf!8sr^Fm0K=hNBK}XC!cCl z4m@csspI*pszUF;wk}Rq8(#VQ)Xz@`kvR<&?HmTKG`^cDC?W*2>B?3LWJ^gUVfVCJ z`rxPU|6l*_cVGM)H~+PloZl1O#Q>v%QXI5k7Q&zXpn6A=*~9bt)FIFE%I!(Z~ZCi~+|>s)3wV8s;3&DF7mISE#e`k883bYmMuh~uEG zYEVY!o>cK@9iqqWOrMJ4(RQ$?3rHwZ&q7d}K|LP}Ns217w@%O_%QLN`@`n3Imypqx6zq_%-&!oybDrp%b3J9Gk$dIG=U+8rt&2D`-c)eHIeZ@v51|HExxy8p4AGdB#2-BsGjY70SH49ml% zt}=Iafx_`TU$u4oeh$=i?WZ^cPs{>w;?*NcL(-tzob*GQY$|Q+jo%})W2j9!0?5z| z8z92N%e?r|4JYukuYLLJU;C09PYky|PUi}60$ymQzQLHj>1S;U*JiM{zd8nB6B{G9<7Cp%I)3Wb zsSyqU`h8x$bQPiAN+GkFY^9sfLaAk!zh$o5kKq|!MMzJa)#&D*P=-imkh*m3zrqC7SPcJP0=+66o>&+jy_nRy1UXOHgWmFSb_V{f}Vo=i@HV1FP z#X#)F9BGBw$mqPSkcCH@9=Q;jR4n=Mx}C`Q*s7~*9ZFro)iyK=6fmR=y>z97%H@Zy zKd@hT-7P=+nwLJ~jL2oBfU*EcTdAr6q!t-cq7@7!_vr$FmfKp((O-qbS=Jy4L@Iaj z74Jnguv~D63_>s%4Fb9;SZTX~VGap7xkt_T2OT=oer8_+y9fzx&H3 z=TadNs?0U~YL&6V{<()Q47YyzTbJK(=iyJ?{G%^E ze@!Yrp$k_!*s;|zn4WaTw(==e%^XI?Ta7FX8{UF}leq$w&u*+fj3Y1CVzXHFjJh57 zl5TKIYt3!}tajmSI~@hs?BfKzsji#&r0TrB#tHQ9{xz`0{llwaSYD^dDG_cDIU58ZaN zAp}R@a~pkj6d0|>MzoT_Y~vPIfg>lnr$C!R(o^85qRvsEb*CrmfE|YdEv~xvNn%Yi%7QR z*k;U1u^nphH1uU+1`$Yt333LAw8ZLBtd`fE;!of5eLw%27r)?|UG@9lV9Ueh&W?e| zhk$^hf&?9m#bAlD_0kZjqZ97f!U~ZF-`Mrx3hwl*>e%ruofH)cNFwU-5=dsYQWFA9 zM$2ZTD42i)+N-|n-2d z%kKhMxy~K|jc>aO)%I$w4>AK1rXHy;g1?92(~fXE{d4MlBPcPyWph`*RDM=Xm>En5 zXICq^^{y{G`p9MChkxWRpFh7V877p391AQA`^+IHj&i#@;;H<3i}7dETkD2D0Ycj> zbXc;ogRYnw+3}lMC|1$tk(g$+|7P$HYD(o!Ai zm6B0aG#frQH!{Mf4a8Y3OxNkO*p-f5FyRkVkhW7G zx*hyXzck-LP$4vBaS=eBa)QZBDQZ|*{@S6wt)`uBeNRnI-Uw@aukMUn^)b)`#71Cc828M;IbECL?B`*Wj= zu3Yy;B<3QaLwFO#PJ)1ICB^Zchyw?wfV%;M(V0SivOLyB-APGMMse?gzbQ~HK+_T}*>~%UO=I5H5kp^`0#+7e*rG!5?JByiLsxd(jkD}2gk}(z5vEv? z_g|JjeE%2!-5-7IzHc1r-Wl$kG)oXEb8AY!g2#1#Mi$n>Eu~|9z4N59?G>sav5NDF za!*)z^99cH`nGV`uTYn_qJMjXQ*!#+>39(UHOUoN!_by3UU(^~40C&t(U| zT^v}K-`JF@g@<=WydG<@w$ZGV;{kWSnGby=AG`%t>K`GhIx;ogu+{FdMM z&P8e(h)`MUS$-$;#t4bxy>rcI9vUQU;I55MJHcNe$Hbp31jLx1%skbdy92C1T^%;e z3W>4@vo0{H^ljz`JW4I;|A7^_Wd8ai_Lld5;s5ye@Bi|JOL_lV**(a*0N7TlX-Dog zuS$;J+`e5od$+RMCU~;sIsQ;3L@k^rN*9C7>iQh7MS@|^EO!G2dQf?_f-Ju$0S$Qt zy+jpRUf5qf^4D*9$uIuo%fIjGyL*<0v=Gxn<8q~oA?>6ERToUEOU+sX>QK52D(sdO zi-0c}bGrG^#4G8f1}})betrlBfonEy#u72maF8 zfAlM_QR>_8{Hz*y;u>&4&?vBa)28=U;Z;D#gx!?rCYeM#4$E%ltP^iGR)1>sMg%oA zA}c*{?(QyBBx{rpbNuo!#+Y-i{e4&1UUll6efC~!t~tjX zeK)`Jy>I-=SKiA!q)7e~2y85DOOoX(%qn-}aFu)gu2~LnRbIm)t>{RH-U3M|Nf*kz zvL#z%#_8uM1?@~Lj4uL)np}QP*(M&%WUvBxebiury0E3S{PBn=teaAJzNkm}5J`Gi zinYUwoW{t{%<7+!nvi^QvV+pc)a1Y~I!+Kx4^nh-|5mCAE{$C~n+`HFFIwiuL>jEX=PvJzAa;L;d``iEE7eD+3)1$BS?c}^l{YH))Vfu~d8dNfU`EH_L<;oE@ z(RsOjnd)r>!v)y`#pwzIZ`lS+msMiH1quaM>GQnhZh+8m(yr$}`_$>-AAI|p{`mL5 z`S(11bzcwVZ6xdnB)M&^@zlsTZ-RsdIHMa)`pQD1;BlJ`S-9Q-ZI(@L+}-8o9)b;7 z&zJv;wJ>Vm5wk!D&ej?LH_!}S>^I#zTWhV6(7x-DhHv}2S8adnJKRhQadaxO19xxvUgx$_i!mT}c*^AXby0$tj-yu8)HJ1F$ zoTy>>$&4Uxc~m zYPE#{&EbMh;Go!b;q;<_z$GgoKXF%!(?U=sbs!dE*e|5%V2)bB6P#xeK0+QNl)u$9 zd>KP=Fbs4Po%cH{_^E)H#^9TAuY z7o6H=A|i*tvV?pYUnz}Ln;WvrnPQkI1vwF70zaV`AdQfb<`;EGSb~f;zHz?P)VVWd zzEVFN@Hlr{?M8gQ;}c&v|I)90?C*c@L;u$={mW0k06zZIzFj#?Jy_yCD4^hgL4*~L zC>ejbX)KBjL?>Yx7``pom@<3f&(t5kfM=!ai&2fU8cQYvEydwL{TfIO+6d2;%T z`%BM1qR+qY?ce$ze*c@l_LcYVLxk;chwp6L=G|>SpVjx%X2>(ot&Y^vID@`+$>+MJ zZWPCRhv3jw9V6kM&YajSmq#~Evu1>xptJZv$olwbW&peI0IV5WlY15_kZ5%2UelYu z`pG}@6Yu(O{->Y+d%yTE?eQ;f?dg8g(8@g>SwkwqV1REV1Quq}51Xx#Ab?3nu^wBI zbAW!`#(Jt4UGUJdz!#n+ulvTI(k$oRhXW+Sfkw(GQNC;EiT5An#*aVu+@Jd!|L9+T z`q}ULrr-O!pMHGXNb`G!wplZ4c_394ib9e2rEbCJiXt`M7dcBQ#-i;GGjJRo1}5{U zYOiF_6dE?hI7%ZLoMCYWk0jI5#}03MC_lmf#6TIswI1Y5Lz2b3p-C=!<`4Bm<;2sdn? zv%M($*bP48SLf?Ti4HS#DZO4+R?doEBZYVo>xs;_MdILVv5-XawQ9IVC^g6psicZ@ zpp%Wz0R9MFIkQqnBWaIAt~oP!-YTa**76ioN3r*aG2E zXj$$#A{yZ2eB;Ph!tVnBc%Uc1j@!rL)<1)K#B#9e5ya_ON2p|*B#1IMHRF6m_B4wb&(qxos? z9aP({9M&D})Y|q4dG+z%{={GXJHPY~fAOQQ{gMawuhDG3GPkR%tF~>%CNpiKgD!M2 zlAdjuu~h#hA$kP?gE$A1O|}*87naYE(XR)Xv6Hm%^1L=xC)Zq<19D3#pq+sSHFyLY z1VN6@!M=v=k?GobvPz^Lm54HsFu|JAts5StOjIG9aq4lZseL8IWR6)1!gQ7iA|1w* z7mER*$efNjhguMr!Z@QO22)Ber<{PX(bXilYrEpTM{e5HuYdBT=lf zOgP6rOg;VfwaUvCuLhCT-+6<;h|ecO;ml*wxTUz5m3A}YmGdl!vdlG6Ld&%0d@iQT zCE05dQK?@R$$4G;m4EZmzw)>K;YU9Ef<1TwS65Nx%c%UZNSu{9h&b0G@JET0IkMZZ zL5OIy%tRxERUO%lqMWUkR}dE@?}Rg1SJWE_L%B&TM0RC#45cn%W#wpyhIFO41z`!! z%$H|Wd?``}hwuhKi}VNe?%usW+|S+Z#ob=qx6eJhzi>XEA9>}zHCcm{*<189Z-f2V zu!rOQLw;cKkgeBXS#3BrP^7qwvjHROsxlXb3|lrg4m}UgoD)O40zgkQm_x9Y7Jy<$ zY0uk4Z`ldr`T3_F<$Ip_#y|Oe-|~B2admQ$HivTi*$)f!Miue1e%NCHPvUH~B6tl4Qh@B6;r zbYR<>wRYam^4{#UT{oAj^NRk~H@=R4`U8LNXa4R#_|*^l*3NpQ;{-3MJ)-em$Ny!_ z))#4)q=#V@45|zBcCwDjxV=dGhymvI4@Dbc_mCH<(gT6lvA8@K^D)86iaiVNyKJ*| z>exCQc4|-jt{3}@zy66AfBnOsCeG?-_zhdAuYxwBRe0QCb;@?Sxd_Yn07RJ7n7Thv zYL9V7q*3;vpiIiGc3Gw7DqEJ`N|2d*S&MV}9Vh+0&v z`9p|&s>WhCNCX_bkF|tBW<`XVxd+PV@o!6GHSmGq%4$(BMT7#-tLmjpWfwz@GZ;BqUCz2*bRd#)M?CI*~-GC z(&xWq8zrKZ9aGAn5=F)|2DV;ILzjQYVxj$$Mv$j`or5B`&X{VTuz zNj~vvzj_2_t!)Yy&WvE6k^X$rDC3kafv$4M^W3mV-t*MY<0xo~%42H|NwDd14n573 zx%I`w@~(9K5p2N_DVG%iE~`tGPq~$$ks|u41jM~YW-HMJ(9%WXJ;*HEshHW-eQU;c zUsw0l?n!4hlZS7!Lminy-%6BY;a64+kOvGoY%7vOrc7G5QxhNNt>yPhmBXM#@fuGJ z#yOF5K_Ols6&6!r_#s39H_xA+`{#oK0pbunFn;xp$glMsql#wQN^buveX_3 z?-IIMw{DINRJSX(dv^6G{86I&zSBGtW<{w<1~Y^b35j0t4!#YcWn@nXRk=iafS^HE z?0lx$02#=T&4@EH2Bp-6z;FlxLz7S4HS=e!vtU~E#(7MAXpSZE$wrBuZgC}#iv|du zTzW#e!ObMP9LZ5QXL3AE4nwfz0?ju|c5hC^*+6MP=Iu16BxUwjXc;ccQd4tE@fKx8 zfYf0k%)1dC=xRdi4Q$qX4|DZc7=u)urxeoS4_eU)g}^!xQ{Y%dZ`T!PeX&4h_%ovP ztJIMyZ}|ds4+`HRq7KaKBJJzeHF;^OHsxutjQtOas)OGiJo@C5ulb65&p)uIUi)yn z@1j|g6YgLO+#;NW&?SM9RPOaQxxwNAx(H}zD0YHiqMM9PXHY^aUJ-W6V_1T;>B2@a z4=F4jlK%Tlk&TsU5J4=HpwJ*QAygBQFomX75~4AsA|tZaD99*|x*9 z19lTOX;dnfVM1(s=*?AOJ~3K~!g>P@;Hduz?*npMUE5{KM~f=EvUk&0qP%b^_FU6O3JU z-C(;?vbo93NVuFJtW^xJ=YU~us}B#VyPFYt&|5Hr0*MUZCO-wc2nT%x{TN~{`S?hw z7+nmQ2ot9q^&9WInUQQ}1Y8~NgtxZQHWF}MxBKpL*P|!ACtW;XBz+;eN%U|t)N9j%iW>WsAoiQZ0fpCvb?#Sv!6lUX64e!3=R}dk!=mo zrWj!f*8_L!UB?7Ya!*n?{j z4&4X4)2r67rDs(}F(h;*SIGa7!mrV z2FVHpE!ZZk_d;vIWyLJQCoA(*CJZ7$v3K?~iPS*3QQllpHoJqnvf@6+9HF30otF5qmRw@a6GQ_ut%6f9_!V>| zTy?*?M}fO=CW!!AxorVQ0t$BTh9}SM_XS z`hJ>ZR7_SGoRF+vEBn!5q0bhmGmj6` zK4Y&94mES|&&sh#PkTW-SZmBJM%F_Bum%7gs;qOr!AsA5$2~$xSsT>QngH}_T{E?tv5~knnMwznUq*a6N~V0qJ#%HcHO?KE4kw{6AM(*D zCrimK4Kj&GWtAixk>W_Apq?J$=#ZnCgr9vC6tUEvN=j5c1QCVDj~&{8j_#!oDi57l zH2R#Idb!Sg;e%u5Uh^y$yvimV>e~RUNs~Wj-kf0IS;^uJ>M2mm^R{eOm_R;YTz;oA zNs(4kmi{o@zl-6X@T}?Qil&hc&qFukCQFD#grqsUdUvY;P^50Dlx@gEcgb_6B5V+X zhd^Z43fdL@$*_%Vnz}OPUr-tW54(-N1Je>bCGvt+jx9P@aeFB&92w#XDq(fNlku6hZ|+#di}HOl~Mv(}RFa>_Yf-6JWJX7+F!7ukV@R z7dORxii$-#MVcASe209G)Cm|thjy?J8#E2kR+(i*!2d2=G+2{}(Fi^XraTE_6Qmg&b>qm|@u?IcastJJlTrXSvnVD}&UzsSrFn6o)ulgA z84Hw_6DStPVVyPKS&M@^- zX|hE#9RYmSGFCS?D!a1CCY2P2Oe-p- zigs!TUh1Rm2%F&)rdzV%VR+h#mO~Niv4;c{4Iby8u@3_pC26qsq9wxlHs=|h9BCX= zf(BWkM5YQeG(L%u%cm|3aa-wfdEzC7oD4of;a&+{$pypmgxaLKOfyo8WNo4$I3QKCjmR(Faz>H!#21JfXde*qWD_giIGcaSg zxW_f})y=}V57!b2s1d*(67#C*o4@|)|M_ZR+`zyHBs`;dF<_Zqi*QT3B}Jho&6 z=a&7#;nH!lOEiwBR@d}YRGHzpTK-5tS~lDV5^!3|F&~Gl6ekS>IjMB04-A8@8+XGE z@vy;xE&ww4J!*ruFaw=K(g13+317U?wpRIvAzO@%1zm3VV?GARab$)v~OK)PofBr26=m z9*(tX*n|{P?k<$RnmB-&$wkN3ssmtJlMZyMOP%oW^wSA7q9L<=rIF8&F4}Ud5XCY$ zbcI4UAMrY3AoZ9;=?N8Dj%g5mRBb?8!vrTV_WEXx5B- zNGW`C?L$D8a|pmeLf}%qPtOboiC+L~m6EPbC{kZWk!v7u3A54No0Yyk^wfbdSY#e1 zIxO#8KFkC_rHbQIVZ8(RD=3CWY`5+V<`zF?#%bnQ41^7S~OVt;xOjUgw_E6&|F}9K*zG0=uiVF;62z zTM>RR166Sp0dBO4M6>i?sKg^AWrhnG!VbgvM@c=78C&f~QlzCUp#k1~C+*Z4U0t2d z(`J%8_`vvG-~45#>$lzfk1u`j*FNUpc6yb&X$x0UxhWDw?n;Ndyau~b=|ljJZI(uk zo91`vz8+e;IBz@P$3T(sI;?8f2+w4#wj!I}fjzYXMzd~3rG(^+3}B|andnFr28oM_ z_k(MwWKe23MS&Gg7&A;~myj-fmRqLeMv&Pw1!(D7u@aLSJS_*v+_fP@S-dqH?oB?gZjD1i9n_%p@+AoLJ6==lF^B_ez-%@G@+eD>4i2q>l#h%ipZb&!9ROu< zh92gj^(4!V5}ov!h%(6&a;y;kTmaM4rA2XMgbFqCn-*PU0HIWkR18%9`5N>>3CRJ0 z3|N3X)uxnBVisQoa_@x0^XP-2l>sMcOV|!x7mF(UG$sL*bpIW%Mc+!n7YI4h(Q@(Q z5B}|N07)w-9W&ps_y|Y8>8Zn!w3BZ7^PhiAFTD3{f8fXd;J19umu~m5Lk&_xmu-Ye zH|RUb#+KOy1VVsHsQfWPE!9{wQjxY9SQ)fdaw?|h;pl{?IW9_;bsNfzCjld$Gi08! zMldW$0zd>01(*7)J;-rnjG#Z{vIh9x&-=D**4l~LCn~BYHVMR2C%y9xuRgW!`?G)P z=l;>J{<=5gy~l*>>RaZ(1|L28I9)g|dku;zTVW`0>;7T(?#pbiWb0*OPVd33y+6E6 zWlI%Pi2aU6OU5#QZU73+agXd$*KmwP2}$LzbItE#O*JWH_{uS4m4NJWt64o!n8)BT zAz+l^Z!T*14V5yr7DWeq6!TX0hnE1OWSsmU)*cl?AvK%I561Me#k8{|xz<+1nbI$S ziF`CMonH&4Iuc2}I2!16hU*6)$~x zBKhLvQ|$YW+Y&tDh|!7D$8JDtX;`I|hs=;NhWzN&5jt=&;{p~%pLy125qQXx;IW}@ zc?iIgVUxL~07D_9!)#&)QHp8Fn|S63qjaj}vTED|7*=^1I~?^+kwI4WnU=vtAnF;S zk7B2GDwCv~BrW{EaDaWJR8QuUE+tHEcDYkU%YzOsFzyz&B$(lhFnU5RAC{?-+(Q{% zTtD;1dKQtf5~COY)EO?@nqGRrpZ&z+?b#oB_gnt-4}R-ced&YNdm}sHy%XH*ET;jy zI*E|7jM%J|Oiq0y19ymDjTJIan{c&>XQ(N%udGhsYXG<6tg|`DkOWf2+9e?5AIY}d zsp38=7zEZ^x-~jz-kQ0i_nX!>vj#TE_x)^*n>FwDVAETE-z)ya2fpL{GcWwp4}IM6 zQhW4i;pC3d!aSEVn0D@^FVd_)B%2&uyoD4t3CyW}qy^ zr_Eq&irD0IBB86=m~$P(1tEN))$IafJdMne>Bc#PYUYQLOQVJFuDM>tZddU!WC^0@ z*HGRxA_@bRQ3CnSWz(+(Fusnu`y$Kk=kXbnvSDmHO3!^H&~`hi3zZCT1Hd44Ah;_ zCQue+j9hYp9#xnsN6qoXfixPJwSc#kw%U{9%$F^@^AXll9xU3^GM3?ZU`Q%T0%3|& zTNN>>2(|!Hphydt$SS&0*-Gg_QGQnJjIWQLJ`2vYl)LaK2Bwgls9ONnB`D_93YT&x zK&A~jJ-V%S(-+aB`L5_5o>&nZ6PehR4=Di+WSyk5&UUzSF6Rd577t{)h!;ACk|8XH z^uWpVy)MhGcTHz?+HEC$R~U{tm5Y5*7__~Y;Wwy${Q{cAW} z-F)9WrPJx;?!BMecCyyov*qD9Lfz_h${A>Kq(Xen`3RiO%$$BOCZZaga;t7o9BSB# zCS*kCLe;J^k;G8~(T>Zqsd6yp6d4AfcW?4-+qz@l-F-iuPOX`s-uLdXtBr)opSbSd z{g&5WpWgkS{rSJ~E1&%Q-X8Pq8g?JtpmWusv$Ua#rWI#C@D8B#6gzIxMB}+n7n_%w z<|@^O2B89d?#JcGn27FE=Rz;h}}=|z-e6Edm8N0-isgU!eg(%UrQT`0t`_Aoq)aaS9`&4T3tk#yLm zVj(FiSstNmh0Y5T$5dXAOiPdJcq53(+WA zm^VILlbWNK8dP?LQturYh?StQO1=^7TNMRWJQQTv*_e=x2R&b!QRCXA$tjhrU|21e z*KM}7UNzx$VzqBo-8jZsEt|1YiyVG)Ml3DGHV~aastiZfq-<=?d?Uvj<6a)P>Rpp= zxvfWsP{DfLg}X=|%bKR{H!Qf7&kz8^nT#0&8okMoVn^${jE!&`dm<7Iqb4<9lZcMR z;^YFEg{D@%6bjflU}!K6%#@Q$W#)q0uf`mg#jcM9Mpb4FiJ8nes1WGYjzG9No%G_z z9?`Qu^q#l;srNtgO|O2?d}lv5`3^I83(i7z?{G6U0xgdO8lIlfpFt#-UWYa1Ai-72 z=RMmRK9I9mnr&5h6jQ$R9b1+VMAw7{RGTL#FdLb;ab#zUXQKCRX3aKUHFxxVm&}aK zHb)oSbtZVy_ITsBf5U5k{0H9tGe7r#|KdkJ?~gp*c>+$J{Ag?v7vU7%KU*fSlVp)9JkE9VG@c?MRen+p_;W}~xiv=Z~0YVvp0*a6R) zK1*dEa}ko_v?9R3Y#y?#SCP-D1J&}aG^YTWN<}VW=aPXGe)=5nuuTNgPnZI){JjL! zLf}ING-max4T4zwC4G=)fs|!P)CA@t2PYidD<)h8yD4+VVOVuG-sMgY04{r%U@Y)1 z@13_gimS6HyRb9kl6bg`|Em%TKp&N$- z%(UH@#?%#xvZ5o1ilUrDU?YO-H;5^QZCrpamsu=Qi^7o`Gd6Qftx6~7;7fAH_^{-) zCJP!=ikTQK1GY+{8;dCdOCWSjsB-cs9yUW7gVa{cqNstvgANBUHF&g2w<-}{Fkjpk zB#u0HI1P6NKIaOCHhthS12~?)nn1D0ml6L^Mit?f9myStq8*#+%z@U@6R45YF!Ltt zaQEdku=pjX$_e4fu?&d^ z5s}HQa-to)3FU6cAEG>Nh_31W#6lmaNJ=bHdEXFdp?_7ko#ScMjCo`NmuU(-mRE3u z!v{gFJ0N6B{>XL3|7qIW=@}o<_{PF^^(U6g{|0IyD_!N zL0KcCVIZDnE%I>B&tNq{3D2B-q_VWP0 zqO>eZfVBZT2ex3@L=tG(IwX2y2Oe{PXRn{;YeQqZ}v?kx-QT4wICa?X@ zMt|W=tm*=t2em9gh3YkDk)G#3Pb!TAe=~^e4YcEcyMU>H`>Eg)Lf5Cx$Xodixt?d8N`@;Yt zn^DGHeGD}T1D>bHP<2X1VD_oPaveAW4pp4El2xghdiW6({fd)FD!& zwS2HVy-R#Cg^Gx(q8mC6h|oTtq?6s4vD= zEfWXR@q}1pEkcXK0ORob;#O53#wy}eLwFHYY-?bFZx{@ZJ7m!bg#yv&;TYH`2Y0AN zGH@bFypLEiAdWrUSBx6JUW(>HM=hIQ2i{Jr#ZtwADf+)f1J(v+i=3dcbRmmvaRdtR zbZxoKO6`%5nKQTa$$O-Cj&xa7_-6XWzu;S z)E5S-bgAK;&P{Y!7z&-(0u_`gOA&l^!IMWtW2uxSAtDE~fsAI=W@bg|NaEUpDz$EQ zxae1*RWOl;8!44AMeTeZ-9EOGz+O0D3Bo{WMRC1BJ8^=YB(Dgrqus#I{^A#&JU##R zXMX>G@}uwgny0U=MNh><1_cI3 z4mU^=oJwY;N?Aeup))SrYP^_$4aJk|oVY*>BNHx=$_qSY`7Nu`u->_TuN-5LQ-NFq z^5cFkBB>UIB_15yFU`Z@TtcNV1F4jxlexG+!U@MSfyX4Za7-Jxueoa(s~~M5us+8b zmPE*40i$d_mZrgB%RZZi2g=C0K$0M*NIZ+iRAqS+9BDh`+}1lTmRr}QF5gGjn7^O+;Igric-F8Bf=xvL8;QF~yaYA^D^@)p`iVP$5m&m7|f z&C~{JR-+gNN6aq~k`L99h`A}1uvY&~4xmMbr64KWjzgiT>DVHlZ~(<51z*5d3?{XL zNKhI|IY(J(t&{7xBf6v6_u%F5WYW=CAb=(Qpy@10%1{Zs38JYBfzvabtxW-AwrSK( zICR$eIlTCV$9eP4H~;QG{sYgv{?%8H&>y}8-)M&Ibk#fMVqNYoWkNd`t*5=$`D0NO zYmxElCCeiNAWy6H%1SY1-Ip<>O(8}^5Xs>h)mDlXT}W@FF+}b-{0v|^Mk9lahN^QY zPgeN3BrJhkf}pWS>*i>ay}Lk|S)AubLmWse!MkX5*Jk+ANA~wV^STH2j-UMLU-%cl z^=ZF)?A#1zz#7_>>)dZ1!i>yQCq~@&QWAu#lPoJ|h`NL_fJ5fz%UtCqirkRMf* z`p^cuN%kij^}-7)no+}nf~9OV@kvcABNgdt(!xDb{Yak%Q@c(t{A3s! ze*2Xzsu}=ZaLiS{jt00WK{doAb9(by2A^jp)Y;1OMrvpqlb5m*_iJ#)daLo+2nQWE zs{SceA-^2?9TScd9@#vFLuvz9uo&gg8sH13Qyel?A*iW%4L&hAjxGHMxZFmJ!NExI z$f;efYe=KG%3w7IyW^(X>tLaTp;uji`!;_Z-`KLzK|OP}L;*`<&bKcuHzVC&);o8x zWrw`ULx(by%TElvsQsR+E~?;RorAopfkq|gqQZj{og-5^9p(}50RX1!5(Hh#D@&Wv zm?0`hY@Obnuo!#E^rOr}RtM@PaVg)0RDVZ|b78IHbveJ_10%hFLwe;u*)4K5vmLEJ z7P6YIQ(?x=YoL7T2zg?v>G58Jv_X;R0I6^Ljom!^4sUQ5duY3B@`=Gh5 z8`!w-eedUHc71(X?In*yAEEaUAnxjU1do6SJq#wN@RcizSsX4`bl#*$n<;E6&1MMt z+NmwJL1={pbf1bw0z4~Fn-T6k@T$sk6BTsSMyZ`U!K7Re^6Mps7O`ew35NB^i^9$B{R?oo9gd9p4 zCKC^FI5FHR5dCs^Jn$n56Z)d!4MW!<6SJIFw}vRnnc}3Lv_m2m_aRb<$N*TPccpMl z?4;K|2(akl8jm8?*9b$e0qXg930C(tv0d)b#B3dQ1)4-)bjhCmK&-Zu&bLPYz6^q-~$cbP^aBoe5 zMKxon`DU!2Pmg(#k zTeFM#GysZj)QP3G*nh#InXFGf!!!pU@1hJ1G%AfaH48`S*#rb1C**jlj=Mr}#Q8-$ z{Ou>~g&%s`8$a+pZ~5A%A3V_R9bLYiTJMtf%{Cwejj6mmNEKu>%xdJ!FgLSh)sT#^ z$hFLb!GVM<2^`v!408AC7M)-xLhJ>e65+RmdzaK2qUlTJ$ZTdvy?g>I)rVo_)z(K* zRG2jnNw_2^PH2ecPDYFMckjM?oZTS6iQqal?7M)}hASc^GWmm%Iv$bVSC18$jgREk?g^g!geDL8QBAVeSJ@ zlgquF2f}K!4mikB{k7~7V;HdJgUV)15&Lg*MPc61T9$2NZEnu{;$rcmNaa$AD}3`#$mcRfMz)P`TXq1Uj3;3$ajDHkG%8izwR{;9&|N0n)aLi z@L}Y**|wRx@B1G0-=j7>Hj8Ftm{_wgeTi#^bO+P63t~yXWrawBtFbC6t8T%jEReVz zI863GJKEIMV{<4QM@>rAiXL^+UsMZc4Nb-ZvkuyFib1cm4&V3PU8fdCj0hTABdnQA zPe0H*-|`jDzVOzc`fES`tDpMKdyl>Dbb93Zoic(~tkaG;)S%!phhV^Mu?OHzMA1TE zlQvgOEZt-co39@R*PER5R$S4R07GWHB~wnHOpQ%1nq!gQ+?T@F^$Mv_%F!66*0wxY zgEELOb=ArOU4nw+ZIi9UjBbN8*2IOdhih>RH~4yP_M(K2YzxhMFClz*)j@#eiz*^p z{+!H5Snf_OF|czEeff&%Z3a5`z1TKx=W5PpBAEt5VeyR?{SWxotE3)Ei(3FsRo(yR48{o`_ z&3Aw9GfzKy{zLD0(~p1un_m0G=~|GwlLn(98g*@3Gc(B|r6quqTAqag7t&15(dA$m z34;(}%T&!QPTC9GF+JFMj-w4jS?axq^OBObaGF(zJ;YHD9X;wMigCM3@I1kxz^xI> zo9X5d=y_g5;y(-fjG6qWTCZGk_ia0o)_XVNv~A(=4DT(RPhM}||D9j?=wt8xvp@B} ze)zXPYLC3)y1nXQrbD)wkIu0GhCq40!JJu$x%+qSx*tDZs6rS2RplEDWU_^##@{m` zXdwF$o#L4~jw|I!M=I_4`L?9hlwt?IbQwwu)(@tpqf84a;+hjG-&h1HN~=CnOojDx zq`K?KNH9emhOnyKYo&w;#No0v%kuK$l;TN-lUIzNG@rX5)j+m7b|KA?(7Dnty@o7D zBzk1!lq|2XrBG1;u8*oJhLWqVBslJ5wI)vzXXJ$EQG48mL(Qe^I7EO0#C9nhUV&HIIf2a zkcZwgw4Xswtarsxs~MzRX>NFTE_VFo)fk~#cxzz(5Y_`chcQ@_Ox$E+=lO;Hh0i>7 z>VM>YZ~ejV{HE7EadqFM?z``&w!s=VUbn`PPO_bPXYZ0ce3ir9!X#M|O%-LWqt5du z)dZNzYqhuw!cVhm06Kj+p3$*f)RuZgx zaSMDtGSIQhLlM1=Z#Y_nx36O5#0>kTTw_tuAd|yW8iiuI@M^AD&eF?AyuBhPjC3!42tjkeR%7B9{+i{!ZFB55M zeIdqUPCmqD>10}{W1Ul2yB<0bDFfh_e3Cbatz2PXG8H5sdQ7wcjnAN=*UySiVi?bm&Yi-;8yt~}b`@Wk| za)$^rZBJa````L?&p-F#U;G>Y@I%l3=KU{u^-FrRW98J!(8c7@i#;d1CHeYf<9Bd} z8iAvgd(tNrCoQ&VpiBjVebBt`(%8Lt7 zq!;%j)k+A@gzXUp1iBAY9{|cNmOOL5bj{RDLlYk5N)&_vb$Snn(44cRurhcf9ed zUvYiqGLhy@l+$}>vs1frm%K+uN@cON8O_~+tU8AvQBf8PQmtGL5y|qf#A2V^QwJ^j zs;nzX<80?ZkJRRYVule)*qA@iBK$V7SESSeRkOcbBr{3QRA3E2q~rh;qWLnSD^W#~ zsyGJI0`>I38Y{9G$2&w`i<#}-B?sMLa&2u3Dt^Ty?R);f*L~(W{^Vc#g^xb};q9?6 z+wGbayRco+6O_7;)!|*^}lpLTKn$M2N=5rJl@G z&XM5LFo83~{E$?(H zs_e^P#a8Rhb(9689$9QY75&O(hl8OXEY=eWX`S6?{C~M}y9$LqhnuxPW-$R1J`RRs7EHHnvWm98r%T6k4sDP zLD2vY0iaB_SSK?eQ;_#@G--S=XjqmZB8@cmm-ND?Ui0AL55N7*f9!j|^~;~+sqY); z((e0dGkJH{)=tfAmqRjI*kLqe9#C|$%$;(H@(hA%^j#tVm>Fqim0iINBgB?L{TMUC zfmy|nr@4Vj*H$PWBD5J>MG8w)4LuQ_%C#)chr^6IBGosDM#Y(%LKtl$ffI;qrNoJd zjgV2R;D9O5naKNtQ+UQ3aXxoaW;8YtF5f$zc;w#u-}UwP9@T&QKmXjndhTO4*RR}h zU)KiT*a&p*ZYEZf8UUBp*xYh0z%3gw`M@x+IQ}}K<62ica~}$Ghq&d~n1zYYk>>&8 z#UPj0Wq#hmBgUVL$qZEHqJw*tfsb0N72OZ>skLg1SO`#QlFM6#kuRq)-*hf(eRiqw zQZk)@o06G~s77kqBVD@256tF}ASI5O8R3)jjzz4%S>+j)y;h7<{-_0%WAA1u!cuIG z+q+PFgn~SeLj^;SmvOgj*-WOv2>s?bbF$2&r-`5e&=k03*5a~GY>N+m=;)U*+mBa z*viC&L4c|0$%h^~c4CTi#CJ&@ESMh0Kg=ybu&lI@pPWh5iSa5*WI^xZx|1W_zDik{ zyr>owIF{i9A3JrNGcJ7_^Ye<9MawF3OVw(J&aehEc%*R3_J`bG+HRhE`Z4>De(1Zu z_YeHu*FAN*Cl}BfP2M{t1AW_Cv`cA5AWjrglzq3h8BCI8dWKv*9K|kV8;B%Q0CIs0 z?alxgw@OusOhX_3PbrjeNup#el(MndFsrb+hk@o~8fi?+50$?gva9&%;0vn!g}Bvh z$#YRPBUVs($W${%s;W{r!=Y$Y6TL*E7y`m53zY;j8sReHW*4Y0eSr6W=hr{{!gK$_ z-}5)~)3Ug^pV|u}Y0gNgCXaFXN*a z{Bf{LOU6Bj@E~ri;&VKr@|~n|Au`LxqAz?@cexP9(`$U?;z~UrMABUI1X{9nFB3$> z@}f$&%4f#+gGY~~?Xiv#8n&8qJu4iYy_cHE@^u+ctE3*6hHiH|Z2~}|Z0XCRd*M)$ zE_Rs}QD&^S23s*{m8&bSvHG;;sq%8#M@$2R$du0c?BLQ=_6~6}u5ydzsG|sDm~>-? zwZ*kZn!nv1c_l6Y7R~<+M#pIKR|vke0lL&r?qu97{3L)%+pCAg%BK%KqYgzm7&KGi zm^R6VKJOKi` z%FrCkAW3eGF!t_e_q~)cyFS@VXFr|pJ#md6e)lunp8T)>(l31cb053HYwY^o3sRTa z=_K#yCE}-xevOs`x5y5#X`CH?8th)v{y1jh*FA0E&~#gH;1&TEXJ0dhlVdI;Wd|7z z&-=6+ZeK%`j?Xx<=7H-kbIqQXcc%7?e!EjSn0CTJ41|>PaEBJZPP2X5qq}<+rB2UL%OOEw2vV=^kSo z7L*2aWJ=#W0qMBj3#ol@)F)ahqI=0aqe*_cRqhHc-xk=xf3d!rHOYlLb1ZnhDw&z{ zg)=N5u)>DH6D_fo1U`is1*jw-+ zX=H_zLlaQge36onQq|oxi!J6SWOKWC%|xA;M7$+>e1?c+q$kG|(Fo8Op(#n;MP#Fx z>&D$(!qbnOe(*I6I1lw0QM$NlEB`I>5eD_fi!w%1=f>Tgm3@485f68bEUc98 zV|L0lj5zrS`K+1ZYotA9ILa83dzA=bvD$IXM+#gDjsL)(59xm>3a`*CRwKKfI(&00 zcW!}aMMg^|m4G6KTN{%NUG`PETN>v|D{<rp3-uz?V z^M)^f?D{$ugWeqiz3;uFZKu{4=gZ}xJ&Wd1)|ZglRz^Xi!)CnJETBC$y%e)j{2eOK zW=Sj&&TQTi7J?7-xKyMBZOs}}u==Q+cTWc5|;oHKf zqm(oSF|sIQvK0(1&LFtJE)ZtTX#2VE`1i&-}8+R?mzlx|MK7Y zH=p~&>6-0y-#fum>_<2rmk8O4Sr?pZ{i&R3z6!;ngjV?z|8LfnyO?p5F#+4|rcPvadNCg`;6ct}vLw;qMGZd)q1m$gdV zMG7sxfzm#2X=5t>H648hS@Sj&<>Vr_z`uT_3Exx;)|lNf4s~m9u;vfqfZoHYQp+hv z3#URo_jY-3Xp>owF@tz@9OaOF?XX!hSGL6JA>M|G&&6YqNu}e*V2ghW3WV0C}G2_u)RtSeeP+gSBYDThlH`5pT@~MWXM2~|c zK0bS?39{Di#r=z<^XDb?cV>iUNV0scS;1BZ#2f&Z;0(Mh`-s&5@0R|*SQ*3rFi3wM zL3H6fDdZglAHX1Hz8pt3KMy<2Gz5nhbCfjVrSE90A-+@v3>M~ldGYvh4Lg-1U_l>D zEFBcMCYu~aW(4QdtvlUUroF)GWq_8KID@Y*>qCFpHH{4{H&pF-2E=Tn+p#j>4{F(% z#SzXdG}Ba<>Jd{O+I$=)zwl**Sdwb(2Le~g$%HyJnOyz7Py%t>m%@O>w{tg`(iGEi zmht%zq`ZS{hoZ2Eq{II(wXp+W>!u5GKal?rdlg@Z0Y(FmkRxU|zeKt1&-*7o{_3Z; zKk=jA`+>K8!&g4OZ4yT`kBt^bs49xB;RZmijvj>vQMsv%2&hy~$+HWqqDyM|hey&^ zDG9}il7tO%qs2?p&6p%(j0%CM>d9GV1g-K;v{fXq1}{=fv6=|rgFMC%%T!bjRS0xN z=x=(THKc)iDKL?(Fs;K;+kjevlyYD0fLb&6-uIhMY}=-M7=T`JAK(8SuYdlfZ~u!w z`}4o?+n+kU@=ApFE2x29hZJ*BQ*}^Tfsq(D@oG4=R#hnPR3Y@ho5b$a4U!s`hUk^# zw(R90iDrF4K2?nY2gAQb>y^z<&IFLmCdcA%TbKq`kKX`AAiyAtRK%iv8VBYrGN`7b z2}7=&L*tHwAj>|?F>B|>#59sYd`>yjG)f2!;!pZq0Jex~9VB#g{b#)tEZ6(dj2oZ| z@0Tj)Xc>8timFVm(oc_@bN8hMV&i77WzNUBCd1~3#TJ<$%hSB5PVGb|#0*@m(_yJ2 zHC2@kGu=Z=8;MJpysR87|I&ya*-$P5QzFDzefpILu@2U)A>PIs>u9iHQqz@tk{ham z4{xJ)3ZySG^8x?j2bW@H+@r|OV)S(7s;sDB8UGHv@XCH1VGU1Ra7G7N@n%)3zL}t%>WIEa+&r;&=*mR%Wv9-c7D;H`^?k#_`Y|%=?{J9 zH-5#VtzmBfjP8)b8XK&jOL2Ip%={3yyGz8hoJj#s3f`s9Wl>)U zGT{@{>QtR$3|NJdiq8(GyF6NY|emZrfMX`CeFK(COUh0Kge&Z*Zm5Xrw1qiop>M9?hE(F43AADDwJhO2&sB7 zvc~D7-AUdv1DONt33-|(wt@3xoWRQYpK(ymlHWgZmzN_at1(72Y)9q21f zV45ny3L}!-FWtbGW%%u3L# zi-?`FS_X%I>hMwxoghr%U=&t99v3~sTA{%nf?>s%ht`rWVF{sS2L>O$>nhm~%vv#^ z4lJxBtS&U=Q6!^6qdp6j&9QEOr9mZwRv|zyi4xf{fwSb?DbzA&W|mad%@e+LE^B%k z*43@P%7|VkXh0m&GFcEi0At-&)^nD$Hgy-T8Xjb-_LPV=maOUZuP;*(vUDtrEk)SG zr7ompauJ#9J?T26+I1P|*dVHG>Z#9gKV z7CD(pUT2fy5F-N|CohJ0O(lyiXdAS-Zlj>;i5y}!Pwiq(ASEIz$`_4G$}-KbvNr<} zuMa!7;2Xm#l}6^|at`X{HV57vRb47ednO81$$80&RgcVfCXhf$nZH3a=={=GaM@0>J0QmEH-pd`p-jW!s;5Vzyi zm1Q?8z*Jt2yJgpM^?Xrcwoh0t=z4%#x!OwL_4z*x01WV2ae*3P3_Q*2RZK2x6H_)J z0g|nw4eiaYFf&Vr53NDxkuYBBjph`cIW;NueSwe4-{qn9a*Wsp>je z%ER;%(F(J-%5@ZksErVi?QKUo2VoX~>@-^ANc;h4Z29_;G!_z>sxk^macFxZu?o=maZ3EG}qKL2A=AgTK?*N@{@DuE{Ph9GPB;5e1H5K7;#suq}-7^dN-D4vKSk|I+I(fx$M?7UJ4rq+igc_vt-D$(i~ z#2(nY>M6l}$22g-6bF%vX>%zp7*nmCoo~oHE3LtbJ*_gWh;upux*|CM03ZNKL_t(x z(%~?PXNnunKcXsSX(m7eWA)3T>K+6qS{J44AsJ7pa+lY@dk*F`ml(im$-M&mqvm0C zV-3^cD4a%Yt^O}y9Q(&9X;v1$;saxM0SZ>RfeE_dqh4Tq@hlbexj4`Q^J_*{Mu{B} zQsuXd>Hs)x6vrhOsrL>|v|Pnw>6{Q4vz(A%?pn>gz%%&fLLGC{ll0y4X0}nmCl9rl zb*kdwY)H&L%j55X;p0!hDi$7xGR~Yht1Vk(Ksa+XIBd{0rE;{S*jitQ!l=PvtvFI{ zwx=UR;~Z3EPvrdX|4-Pv_G-IbXJOYh=KZYq-6z}I+XsjpJ0`|S+7gJPkkpXIPDnyZ zI0OhuL|cVYs*721B}L&`xFs)UrbDin!AQ$AEk&_WBUN=4ET;>1a8$9voR zUF)9X>W6Wd^Iq#UJW96T^*r}s9>yHw8rK+eOrjuTsSD)wkFZfTyHiR+q$|3zQKMRI zMQ11NOHBPJR9GR@kQc%vaBSuGS{etSjG|`HNVzL+p8VPu-go!zpZ;S%^e4Xm)1Umn zahos)sE6}mg05L{FE@jw8sxLP8$@>*=P(LJ%kB`A7zbx(21HTZq7_MD$aCS%Rem z6!p~0D36PXAa?91%66nrK_g{R6pE?H2plTZsXd#3&H-k6XC!uw;$b-_Z18T}LTHBL ztyk`T^n1VU!Ny`;T;RtHuW#`i--f%X4x+~C-)OYG8QDeh&1)9mGo^4r|!-nKlAhR_AO zeWiX?3sPIws;cjMz12FgWvohbVGCG}&DQQ~yH+Lv)d`t7%U<=y92j-dy46zOKUREW zWYfg)-=XQa>prB0TMD#JM&6J~Ss9YoAm|QPEWZqExVNQLWU6xN==E|aTpDJ3q&9%4*>;C1}5&;IuJ+@1gB zU-_T^!7u%az40Nw_Ubtg0W_mr?l^A7+}jJrCJfav>mwk~GJ8u2v@&9G1-3b1Pd|@z zjjQ^SqL^a4#cZNKU-t>9WFlUE@2FCU9WM>bAnz7GNUD83p{F`xu60d5vX#XXw7OY@ zZC$q0bD7A#Y>CNASb5ar9dkT>~ACNgZkgQs3woUZjxPrX-B}-72ua_5Gg&*iNh3v;lOv{({L%44YrngaQv0+f0)?Vp zva)s{8~T|dGzRV;U@i``iTfAh;WytqzV^p|@b~=mk9_BEd-Lv&iFq?xC6OHCW_cb^ zqK!GD?mSUv0p`&=8It!(*AE*-nz6!ev1_Gv`vIJQi85ID48bQR7bzv!kStxZ1&s{D z!;mOXII4jv-9jDb83odvq~)h&!J#-S?(pg1@a4$~Z~{gFHvK`OoY6f8DySIBvyp7o zB@zM$kt1LsV>uBOJCys`VacBEpb1DfD`V-Pnaiio!wyie3E}l;{K0?yTTgrTU;X9( zIk!~JR)s#UQnQU$X^eGFELeaTAP zC`+rfKwF#Yji@Mv*9LZ#^5V)wy%fUO9^AtdVxCRy^P_7&Xq>gG%zr^rC&h*W0lb88 z5S?2+5!P$ADSI>*rSdK@^S(nFwaqw1Tgt0i#ATWnPSR1quvj}N0J{gYGSt1rc(|qN z7!>t5EtexU6ZDc#o6pDbr0cJ#ty)!Z-SzcAp1K~i0yEQ~+u#i%VaDNJMOoJ^k03}0 zdE{K|UidqU(SQKQ!ld4za6p=o6BetM<>d7Ec#2-wol z3iVh|>lMRN=V6IZC(SKmSC&uMs?I*jRnhgoy`X~Bt)Y2rUgP!+QjqZBlHJ|>#l(5y z=6LZny!*uuz0N=R`~Quf{?Si=(|e8)bmV*xO)EPc1l}4Y-ags`6cNVvuG#dT#qW$twbC^;-BWewratN5N!}9Px6W@4-&wcv0z4O(FpZVFp^N)VzSMmD1d*%K2?m9E!)TdCz zEz(t7K+HErqSJ_1y8&dS731~5nwBu_{KB5oQEF?KW2}^|{I{V}^_FH(#iB0~o!l^s zU9Knh#XZ(b-Z!=0e>QUN_pSIJYT0?A$}LS`g@AGWh**xuMTzY7Ty!11j-;Tf>IooK zh2f=)+Ang7IddJ)xb`a$CS=gWwXHG2ow>h(mFyjX-9psr!nISo=L>Q1~Xb0$mD*h_PHbtR38^?tS1&=wV0u|rt{zFj8Qjj>Eo zRSiu z>M;TiGS6QPPb>H2fo95>U2dxwgt?}B`J}+~DG53)bM_3eV-fu##(}jNVk;{%8N6 zFZ>dQjpOxcH{q1-;l|j~7-G8TFZN3YvG1Fg|g zA2rgKU376}VK9&4pw~90{rQ*t$og?<>B3#yhJSJC?5d#4huFKnkHbroG#j9FBgDrO zgh~Wm zgZJrB+NJu@BN8i32RTSiFDsMp)3%iAhfF^KE?wBiRFNU``0(a3%DW|5cb93|#$%1V z)EO+-G0{%w=1&y!o4UE7Bv zPBE>d50IFXn0JTWfARCLkGFsN5BH~Mrb<*KFhnbsApAQcYV;pzm@N+_w z9NXbMkt>+7?k0^pGzK7!=*sgl%Jx^ilwKFHRwM5NeST}pWh6p&%Foi=tdTE4V~sP5 zIbvyqqe%Sl#MQC1JU%3nM6)FrJZ7Am7!fAP<;F;)f%ZvG6ULS|lAy^$m4+?Lf(!ei zt_*c#Hcct4_+FA$`iV#!$6@68@BrXAj-;JPkaWH0;AcPmk6Q-PhNCxc-rIqx7^>^`M&l zWmQ7dJC~@M=lz&A$)SrcO-gf;O+z1E@)G0%^eK8TO9>I$a}}E5ES<>xx>8Z9kms7C z3@O#BD<`4G_OTr99a-d<=x*Lh0I3fdn&@RcyW))P`4`psQUR*L=Jkq8;!m;D6yTO! z7Zr!f#GtiU<*T$kP`iV@_kNQwKKkipof0-qZr4s#SprC1p^ai_hnAJJ#i!itwSnX+ zfS1r9NC`F{yRXOVBHqnXJ-xWNH750@YMeIFed!d}RF;p+D6ZQi4F!lc03GARJ70PD z$`{{yjep?#KJybl^yyE%b@yBvh}aqhXioVw(=nj)q+k}>I4J%c+j3hfQ7AR>T6FP# z_bhb9;55p&i8PV$=a})~IH)o$4)g07Pt9pck3VdX!xdh4Fbpfffry=f9tU!kGRUTJ zt(K+5)6pbG95BQrBrTb@$V!c_5zL+JEW52tWhwg{&5TMmjRk6NcwuozIiMN32vsDw zJ0X`(_q*G3qe-W`-)=X#=Jat8kt!x4t!@k5=iWZDnqyWvh0>*2B1z$T;A$S`gKVH+7r4Sj}^-FvR>LfRs__ue%?!_noov$yJ%U^Q<&(i z%4WeIKd_(n^@4LO@enV2^S3KjxD`(>sPhd<6BCfT`viSPVqx37Cr{o4F9s@jk*}lD zfncH1`3noN&rw4!^=Nj=EL#Q zoZ4ldE|ZCTqW?(}=~<BuDM}j?9r_Ckt#Uj+Qe!wxb9lHBwzOGRHMp zFaoi&Pb>?~3;`P9iw%s__IOFe#na(#qmK1wH7IU%m&n5q3ojB>kII*&ySl;xDQm>K zn$rJ`qlL1cX}Q`H!gLSk!h(vs&`<3TcK$lxj)EbI9Jh*&q0xZ~NjG@Bizc{ae5E?z{8(D;RX$fmI?_O}Xq=r(|ax zg{k)ME+1wlTMk79RD)Ycz-y&zdWVfJMNIaGvK%Lcn2%M=aP7fI)v9Raa$O2f(++pT z(`F_S*R?yG(759CwwnZ^;3^BOJbL$@w{lTBo6hk})<|_nt$p-fow)#lXy#Vbu}G*L zvZDhnt3Nx0L20Lj2Dpb&J?E(N3)oZ7i{`rc1l#kqTa>~*u@mO;AYTW3p(547USlOb zz|OXQORGE48fct$1ym_`S1YwIBo&FHj?8ynx390 z?P$p>+f(PjYW6l+FcuwifOJ%HNu<3Xb_uFS-|G%OEV03kb;eG;(c z0YwgI{4hrE4@ldKrCAWpC{4Y+Sz9V_Fu#&|QZl%rK7qZN%w|6!#RF9{sFpU1TGv(B z={%>O=ZK?xkr#wCnE|fT-Ng?*zxxy4|2y#T@E892-~EMmzNpvUd>BV1fm|8E#b@@Y zh0N_7?ylgr0lWy!h zFO~OR80=|B9yLO(YdSl(41;=4RlK7FdOhrAN+;9}h@u};X#{hvZde7(6Ct8faK%KC zXsR3l*G#>9iEb*m22H-5>IuNep|t36jaM6U56$Wxv8mKc3KI9IW)}2mU+`(en(El? z7An*y$e{_!YiF%9Hx$3zmbR|E4ETCoSvTA0`}O1AjuM}~omz|DmDW8fZwOFs%x4?& zmvlCVD+)sOn{~ZrbTK<9n$rznuMtTJ8VYI95S$t`s=aDO9Z${>307~H zW$qvlSt~-GSiWCrfLoS4>gaImEQkPXL5&_CtT9Qb(IOy# zSV>bPLuu_Pl_^pv)0!w8tXWdFJV&EHs?^N_WJ?-%Ex)k`IbgGnQ{OM{jF@F8HaTI9 zC)kZ$Pw#*B&H-%8w!+dm&-H3zwGfiLjBVbS+A8`M36YmD_#S=CV+vA*0~L*1&)+6= zJwg2|Q=$-*cbyvNRmt%4+O%VO{IjzNO%~6I3gXHbWtWSIc8_EuQ770I$<$WBn<@t zBb`g`=}^jGih3NWyR-OF8J#p?fHP7>lfJDaOmJG$W*p2M&}>%Pqm=-di{IB#ARg9T zf}GOGTbAM(Ctf&bg56G-7mJkxR%6hNZ zMk;dKor5ehALGf`Y}V3Q8?BbXE4jDxBHUqAb~K4%CuqPC7$4@#!HTvmu8;Mnl#iMh z@=BhS>!R946pB;ZwiSJe+SZktb>yUnj%C#dUTs*4qcpUl+-+$HU;JAb%gox3wu3VBDA^>UlUr%uBYw$u1B)YHu7WTAn+@nHZ(a z;YxGwr)^W5dUn=j2UBmRbcuFt7^-BjXD|9)U3u9DFu+)wcW`6X0CI?wMg5@W$CiG# zO^Fwg-a?ph(eRa;k1eeSO8_pABcx)13^A8R6h%O(TBO0Z!)6zC^VacqXPl(8h zC0$e~3_+dn)ukjN&4gnkkhgFHfSAqtcWAVF$f7H2MHl%`1oTH{JdGNt9y)6|XN0fV z!s&oVm?@J;R(?A+H!iOBbZsH%DA=ctBV|z)S@8T-ALnW>(SL=iDNmn~q%$NZHS7e= z(@#9RgBOjUBl9W++UfW177Ny*GA?}_v~fTN zr_uo!(HlhqqQKbIm36}fo+*JIW+Un(TW*(5?o!~HG0h|ms5ml#VJmYv2NgsPGf2Uu zpEKxljlnzRlZCA6ysg1l4kD;yrVNCm8U;iH(G82F5LNY~2>7W2DmC!(E;t2uR~%E| zW#_{CW|WZG6&92g*04)nB#tW6+_%lqs#H zfAohx^Rc&{{pUaPH-7O;?>u|+6ZiJ&oN@>>jDhohP3H^H@^@LjXXax}lujj89l3&l?!BTVU%z*-}84GOq9Qbk+tx2fxvo1lgy`rAByzn<#JQ|K%d$+!MnFv*cRV%q>Q*%(PdGNt;PD~dEMx85y ztzlm;hh^)2#rwA}ty=!%c7^}`vY+DDyx*+CmjE&0L-l@#G|GL_h^lH zD(u=r_;fK|k2=ZieU(+AM|T=8le5oJu=;JoLa>=S9Up#yavw1$~!GZaFI9`1D{tN%?n?L;4pZT|b@DG0X zr#||eH#iNMFfC0#m6^w3ibPl$p@?%*Z?sR zd)+`mr*V)7UyX6RhEbaC%0mu-Jl-f!3!7w0kPbl3*lvBep8&&|tDr#ViDvs*`}yK; zL9tsNNQOPBA4N6_(r(2W4s31F7&%E{srHbh>q&CN3iLc7w!|^RfNarB&_oiw;UAq} zlbZwiFpM;tK8<6LQ@9atJ{v#$J-_QWe)IhEfAw$w{8v6d-t(cup5M<2yNz+ULq0cx z5Dn9^Z|pVG3>dDmXp4DgE8~(P9v;*B`$BEAhk9CJZ&ffxEp59-Yq9Y~Z04}< zY(KMW^s=axNwglVt;CleH!r&o)ilyte4P+kYrTGT<-D|-TK1-_qpSv?=S$m--P3%& zzyeaL{f(rkGR3O8p$ld&k}(!pDdTO zMyKkKq=m?gIi%cXa+{*anWBsft-`kihEW{ho`vb1u?>iUU@H_ah3}qf`hG)ZOHHgr9@o^BkMpzly8`4^&dw#WqOIdtU8`TK^}&*`hWhDS zTDami?Kbb~Q5C2paye%T>&{*4WiQ%Z*F#h-Z(?Ha#-=MCXQ6IaYP)d_d1bk7BfrBM zr3!Y$2H2n|w^ygo?n6`t<=UBg_O-X-1u&Hw@noyCng8q|O4`35ZK?9$N(gE8nOmdb>UK?J9HgXv#|-mhyQtY$GMIizr=^U3%$d z^y@nC6>+@I8_PF((w(iRi#}ngtSx~B7E~kLFvjV^!yL!BJKwqgwO{|(Td)2HKlwvH z{5>E2&<)Qb^9T3RJ#h#?ltDhLcQHO zfV9KLbllJLZji%bJIaS&!B76czxK-AtN-a={%il_*FS%}`HdXM{r%+akX5{rOA;?i zAGIJKX~xT{sD-UXbki%cRNQ=3Dy?SyV&di03ZNKL_t)Ebk%8E)9TlEY%8gn z`*@zIDnus+lPx;%13=s_j+5Lw88JZ$LU#jpMHCqMGWfB2K1`;p)MjUPA=zSTV6 z8HR~5#^lXAz~+_4~NJ z5|J*kw*JzLRqre6pP`av+NF%mg*?onlx>7fC1j~JWmy=?-6)ILI}Lc`yj^z*O1^^KKdEQ_$s*%s;A-ki9=0_?u0qY5(zvd%mfd(zbLhBS@RAlh{Zh-2>}Hac!>!(9 zyRFQAm^vTx^6u1RN|D;_+HP(uKytBTTW43aspJwB53VNcCak3csgwVXRprE z1KG1}LbtT#m+hB_w$p#Q&#ecZFrSE+Rt!M!W;gl~6;P@;S@_LHJs#ox!+)_p->+l` zX0A=yo^|~}0AZz-smx}BQC+hv1!nunM6 zqqv;7?jm2T8QJ^HlDEhop|*oduR^w6uKn+|c9u(CVGGuP$UB&~4~}imF5zLSR|KD* zOowBhcHHsds}EoJ=O6pP?ce*!f8)n~&o_Pen9wos;5;>K@BnzeI9)hy&&&?Vi=>Y= z83&_>uFl33wYPxUwv_?241QTqb+uQr_T-o_wGkRUU?Pwa$}(b_t@1mMFS0$t46uw0 zXB!fdWXgQRyg5 z6j0huIrH{tEfn}QVan&sQ`g6)k~;phEst!X(V_Evc(}j4`pii1^mz~7G=|w2pm2N7 zo&MPOe)9dV{n(%Vi+}y^{nKB(d;dqyaXa4yPzmI#JsYr9?2c%$!*+38urc`S&;FD_ zQ-#@}3I(<9)+HLXKJ7j9vbnNAmqvF3TCUW}{$-l6R1Y_7w=VP2M6HJQR&`@MM{ikZ z15{^mEad=KK&Zd6J-Tz7>aCZDb7kB;#>?^hLo48A?eZ1fR9+SXTaW0ac;RYX9}T!~ zKH2`9r~33!81nk541(=B`#OktP%5@CU%jmjbbW>8G3h1dRO4Zv?K~al;pc z%7~psgdi8PmZmNjUYo(k55psCv7KVLlb@_xHiB_8JpofvS8Tg$_Sa8*9W;<7MLIUi zy`9~-O8JKH1ixZ#~`lHAIaX@cSM6E5RHhu-;BeEFBZ z?V}(5Q$O|DAOD_@fAE+$4*I)OC&*#Xgd`gYn8k?-a7}dlE^9uZlRP4JhG4$Sok`Wf zq#P6s9CK*PE91}%0(%+!yb9u+w& zItWQ-$()3=3_G6RC`><3!7a1rPoEC+!NX|>{Cx*M`{{4~+QSe0xxe@~|KYFxhCiD& zo_lz=#}QKvY;g|la$j9}{Aa1E1tGb9+&@I6)dr=*m0g%6a@r&{G z?QgY8ZGTzKBSnuoLn5wRgNc{Fg8M7_aDblZuV)BVL9AX5t9>M0qGU99?y@llME8md zWGY7w^fls@FW-a;Js)$0!Cum%Gy@x2jEf6=l%KaTa@!*=EcavSe=-O=lo4X%g<8(8 z?bB00vcwD2HGK@VcA~2WAhx~Lpm|!p+S}8PR0;)6I6wo>sTaq5`}o?IKlKf7{<}Z% zxj*`uk9}wm_n7wLW?wT5;3kc8ir{f~ND6CL=?l@=X6*K*$6Q&dikTvj_5i5xq;0XT8jq?<*nCN&|!p*loY2cX&Who?8ua1XK`V z%B&XwQHsJNQdqm`qCq4(JtqHj1Y{_>H>g#ZT^Qcf5q+qUTBR*}8`Do_mF_6o=00nw zNSL*0DJLB31sF8DGh)1W@l{IWZp5*kQ3%y=lODj^biOh42Y&arzVYhof9bFN-M{_! z|LIrt>iO)AGfoJ5Nfvdy zb49baBaM0yw!K>qX`9C~Lb0OCqkU>wQOj~?S+z%!Y)P2<;?e?oWHqZxyRqC`{_>7j2BoZkg%{RX94ta#v9) z=Lsg z@TKqiSHJN;{&#-xJ3ju(Tj6Tm+yKox!yy}?(+SZ?*m<7QCm|c9;Dw?pfjDy&Q0A+n z{U!1e|4OIMtC|t4vO01?1L+IJRhC-`Fly9Q-bz>jQ`R978TC0Y67Jq}mT!?Tr{~+P zi=8^6&_=(pRE}yXqmGGK@hY}PYs=Mr2&HMnc1&_ zIt2M7Zvk7jQ8tc{PY^i99nEE_waoz9>8GE5_v~gSqrYeH`@j98AAIw*554i8|MqYF zgD=By_bSE#0rC_KK2^LWuiGjJrFQwXx90SMU%`y}p*2EG=f#e0pWaTU(xK8ijF+1& ziHf6akhryAPtxz|oj8=Y1t>CqsIKZ4ql6cx~7| zo^4qJCPkZf^S{(iy!cVdTz85P8EZRXdPQH~3^eXkr$mHxe)!dT6?a;)p8?qdU^ zn&g(1e#nL^Rw@XM9Y|)R1cXA^JE(>Iv>zrk+7WFK2yDn1HOR|^) zVEv=g*0oM{q=ZZfDStxT#C1&?!936V`csX5n&EhY_o}`M%C$#aWK50rW}z?kzRQ;| zJwkWG#EZA_;_cV&zWSq|{T)B`1Hbb-Klb_?&~)0Ix7(q}Ef~+jn#nZJ^Wou)w;acj z+nHF(^g{WwF+_}CAjvE0Q>p3rFTJ9ltjWxa7H>LHStdrY+@t_li`77xn#GhNinbu~ zKUHub1z)SxWvz~^AdCa5T-Y*-^7{@ChC^pGuR}W6D}lGpR1r{RCRCVZpmrk!S6eqa zLGtJ%(i+7Wj*yCULrX0WBFb%NX;y5l0S9>pLYnOcEJMXM z5(eJZVy?m748}=Ni~~X=-7gAHgwlKktRfpz7{%!mkb?(gu)3EHoAL5Gtl3sU838|{95#UoP1sR$5y~aD{SGjy&ED7IY@bFLf&h>6 zlx?eh6a0w-GlXQJuP`X)!T6`n4?$XE2=GK&tbj^4av-p-fdNJlY1V0^DFY8_=Jpv( zzlk^i7cYB7C?XNM!$MF|F@tsvgQ5r<-@x2SFY+P^MzCbVI6-O%B@K?4DaJckl)lEgCX|8K z*)kGv+8D@KSHsqD7A$G<5S0iC#cA0hG$2Zbz2E)EfA4Sq#2e3F7dTJS#4)2f&=GG7Yw0w&B-a?U5d$8(s3QqB>R^bh zE#tKgQZ^a83m7puz?g;p^JnE5J)OPF6P-N!9ap%dDwt}vx*qyG9z@tk21OwoS8BQLVN9)*w;C;L~mC3ouFl% zdzI=Dfq~Ek7rhf16ID~-A%`%h$zQ+?nqVB$JX3qJ%zP@N=(1NdVr0K!UU`ert6>zP zo~npP8|Skiy)6-(<>5!zo0T+sy6gnc)eBd};2uI{Vq#=1ApjXUW)rinbTJp{ z4@aIc7;jM>T@p)tQ6lH^p=IKcO(G#tQF*D&C~9QXm2wMYBumazqax&f9+aQ=nl9%A zPUudlcd90DJL0{|sxS>xmw;tabH)+*9bJ06d>F;TB+uHrY>48}QsQGGH#_kL67F+O zkkHh5pH|a%C{W|XMl)sqEYz@}>m>r1o<;StuyRM^7I~Jaq7Y}*&_Z#MgnPEZ+sU)U zoxe20$$5(2VZJ)8O;P+v96*zjB*zy@BugS3dEh-}jy0^UWXp&>f!ZWMom)i(H@$ zxT6Vks+Xx{v_f<(@3<-v1iFSyG%fGH)!LNDxtbEJv+SL9F>~ z#zX{r;}Gh|$l(aZK#%T}zt1RreLG|yxZ$&(dh=r+`k}w^_kaH9{@y?S-~ZwN{iS!l zG@re3@+J-!1_)9{ReEYDMapuj<*8WH#j)#hDx8~1V$0810uh#PQEFjboEnng0j3B^ zc2?2+Cd@2qat6#1Jx>vg`Ef()-;}Ug*s4Zaagx^q7IdHyZZ23u6mE@uZ|X$5w)6q8 ztZHD6Am!4xSm6Sgk~v`>=%_4s7-tJ)!r+0}Yn0g{rQH&lmXwAIJ0B2YkL}16Staev zJmr{#+&PiRk_&g&_;eyQ6KzM`hCv9r4;R^@qG1`BYFL(rq(YIW9~kkBqH41wS`hT| zLIiZJji?xEdL>}T7{Gy3{w`j;jq`zcMI_|$t~A?eL-I+P{ifDLA;(2^iUo5|Fht5q zd*qCZaz8CR#Ss4DnnF&DdcXrQ48!kV*uz)(;%&WstkuBD9{Cu?dchFtcjKsp5W0C%US&zEi z92P39IzZz9MhI~TDvc%*_cR#{Zj~G%@=#_2Po~jb2e=fo8sTRE z7U&0n(%({AFPSF+FCb+S@;E?La#(6kV-+*1nuNkU;SMLJfz-4ptZp=#5f!Fpw@@_H zD9PYqTxC!MNOCrFL{n4Bi)BNIH!g;&smnOcJasv+B1?dbHvf)LHm81eLM0o}jr z5AQtK+i&ol*X_I^kNYHVxhevzq}gLQ+_BFOs_om%g|XIdtz}PRxpLToFQhR8B1&=- zfx&SQ6PSZ=$*9|W_to+ChhBfM*U$0FGw?R-NW7l0`T>|@0I+ayD>P$?Sf`RLiiI2i zz0Hq@Ta>h#Oen!~xZI%`w%7rlqGB5rl^GVEeuj&t3bk5g$%%rEI`xeSozp}^aWq=G zN_pS`VXmP#h^E@FvLlKlF5t%ikAuoJ8ak(9ES-!pWmJj zKVKX6$#3}Zr#}AHcYpf_Kl1+Z-ocw-a^v7_oaZEtF-+2V|KN03EWz|x+@q?%NZra# z-Dsp#hOR2fsdRfAlr-{XT`CF|=A&W+EHqs57M6)ww>f^EbzXxZuWiOtwHjM@Wz!fL z|68Rn)h9GVU9BUD%EI=vUxW-fqQ8}XQVxs#Rt^v** z+#0*Wv>l#Dc~kkjyhb_aOYy+Y2`MY+bt04{L*cWq3Ju7T+k)AcE_dQ#9!DOE=o71_j6`lRN?`Y8({|lOj-2M z3?{Sbr*x(eaO}GE7=Rf>Y77n=FGxsnBE=x-a#vJU>tt0@Hf%7Bk%-8Wd686xTLK>j z7zm=mL6_4f2^!bYHmT$3K`eOC-At!EB~6^rgj~+tm=_V$aDPokg(}DbpF=W=E{DCC z^w=9UUmo>T9_NZ7#5WP(pAIC=^& zKg*k9cqlZ|3>LMQ!Z!#~$-?y#Fk|UWM{qHY(~~czO>w$TpZ71m_VDgk@8AB7Pk!|M zA9?eQbW%j&V3MKgy#Lv=S8vC&=sXP2WMK_ga9K2fLo!G{Aj&dW03#yKh+LCMea1c4#r zD4Rq{!;aGGXluxn(R7$mn;x^YJL_vG<_FCk1U_qwf{S{7VwQFjkoYqNG9HhHo#}#R z3j=T?7?Uy?b!$6(Qd>sLd73tOxb+6D~eP3n~R@A4drfjh#sX?Q6meh9PkJ9AnVz zoDXx(F~+a~*z~YOn(lzihF28C#V+A<7Ez6MvsDc;m0<`fC$O`Fly14GLZE~+#ECUd z^qd#0u1vcMm@}(*XT?ubR!PMJFq1sVYOsmW1Z80Zpie2XfU%(^H7j?1B$Faka5UJt zqm*djxsu&j2dQ;)B3UkLTss4qC~Z~1pA^;w1CxwxSwn;;#fOEolmL|Zzas8~3yLze z9=nd%B;Esn71K)ZQzh7!z93g@x{w)fk3G(7%@xByIXy!4lv(;Es4lzk5F9{lh%~mN zy(OE*g6zOSWyv{eP@+X~xTT1x05X`9@cG&^d+!}ziA~0t#$7U*I2w*gK0qRe%cP?Q zx1nu$q>$NJ>W}Vi^T3eAT#q(oE=gwK!5EZNd;morj^o`EZ%<8*+sJohygI;hW)ehr zGqT+?;iK~O645eZGBs{x%$-h$(+tFv!^2a_$u&T=1SDjUVgfMMF~};FT12{Kv8h(( z1;o=78Vp8ZgsM&JSSSJ_9WryU_yY*wY$sJJj4B|Q15Qx6soPU6fHDhpXpt{NdPf~n z8;T}BIL$a{Cfz^-9n5yYi0%okxT4+)`B6PTPeu!s|%c(xMnMv3onY>VV zY9PKXV$1a&*<_?@{DR&K9fuj4@M1$6%*^aSoJ2%|?~=@8>0-#!*u=m-pq#$qBN2@> zi(?{GrybO*lXikIr_RH(khW-%ZkOiBy-6pwYEv-|sySg+i6RbHGe;@B-O?=^e|U@eUBEDbjl2Lo`QZ+GRnf5LQG9*u}O zCHEj?9q@B1Pw=&aOe(-4cRZ9hvl4y|QVtd~-6Fb}4n)z}o4I45nY>pBZaXL{vXcx_ zGbXW9IyA^sPkJz3X{u--Nkb(>NB~CBJ*`;;#`y_!0uo#7 z5tAVTu*mSC**PWXZg^xLx=(kH4XeShl;nf#WYIz!`OYMg)fpcsu+`(HMEk{c4b^_D z4vCZ!a=^_Pbole*cyiet2kMEMP)f<%{iNF4NGe2MRZYtt2z3-qtd)rqH<$ zN#QOL48h8HiE=#h6h8N@S5;lDs?mfS6Dq<2G6icJ+Z52z&$1LPXfWatr#$N?FD7hE^6qCZpdq}JrlN{rN>Np~)Jzf_G zH!9=RbG!l=mdzpoPqU{{TE8_*XkcYJHRB8qH^S48vn}$hGRH)zs!lbu{7r<15)Qng zvg%lvvDcA2laC|R=l$Ep5QK+ci6Zb|QuBbtP)US{SrMX?X#=Ag5E#|D7>cM68XH7}pqE|1Bo&o4 zu$Gd)`gZ4@($Z5ECh1f8Tj(%)jm)JQ5(Ch~|lL*@l1-?L6~ zn?YKWP(cLrVVLQtkP(Za6l(#bau-KTu>+oY<6;p5A|jbi05nT~yJspd4F)oJQ~;3C zkJ6SX55a*G6d3+fdo7mBd%E21ILvUKr;TwO!`%%7L+*ag^l{D1#w`|+2PNW72{|?y z$i)$-w=uo^%q@in+*k-OW5)3zU;!>I0?8OLh0*FkT zig6TJE}P|mdFsU2p%U~|`#9B>g7u3)PN&!-@C`LfhJaj_K3rk6G6~Djrp@yzBcsIE zVWB8c12oFWDY~QRRYWvOfKL%dyptb}001BWNklvAss>i=)6)7ijQ|-wWjx$HKt>$Q9Ir8Q zM8v7HO_6j>cwST^vz2P>pqQy5(>0xLOm}#tq6I$44kgwG&Uk5or*ykBLLBXbRR#U- zih?rBjWY78t={S?lHXwld5M8!7WP)IQ-HyW_<|$GM(LU`T%rIXy<4_ScPipx7?J~? zRp!%)&%|BB0cIIy1cphnF5(cz$j;5IZbjt_nr(+`H{^}p#S#e;z{dePN;LdY={6n@fFBnTgI095F=Nms_XLaXOd;|1v$aB$Kn6HkRp z405!mqL6m;!*By7z9`C+gM&CCk~rl~4IT#2B%gDNSqbu(exCP}bQ*8REmYxoo^#G% z5nBd;JiJx0j|rWkpIElUCXZZTy3cJ9GSC^z%Q2%+Ho})+)tXt?Io1YP#sHOo3Be-ND zy!>vo>dc4)(Z*Y`i#4Yye__K$G(Vzo;c^))aC;aDwU*>246MGF7LB-_G)Rmz))`a@ z4ksqY8g>NwN$-Bg9DD9M1G7hziw3Hw*-usE)`TQm==PO*4(ysIzcis72VYsB!PE>1R|a z3<#`3yB_CuZqwHscy9PsDGsH|ip=85hD%_WD;kCGtZ+(YdcgUmMzQjHuzd6{BO%HhUSdFmHwBd9_KVv$?! z-31u;{cqNsa@b9!959N;tWbP+ZI>? z(=j18-jTq?ZH??2O$c(DMY}y4EE|Yzu2e#15?!HH9p$gFS|XBPcyRZ`keERdHI7e@ znK~@_kk~pNhJ}(91-m8mGLN|ow?E{#JXipk6%{%wRbD2WBoG6gniUH=LOp;HbsqKp zknSlDOklbKQv))i*@(3m8FQA7HM8cx zg6`p9*71*Y=3W;92c+E19f&d3FPTmQSol>jcfIDITRyLAv>}(S(@nSVB+?FGpg#Dr@^Z4o%5EDbWpl$84v0UJ}2U=|_VjEmx!l5xfNdGTfU>g<3qALi0uRzI=Yj(CvF49`UHs#1y zyTa+937GDulp7(+Y>;b5V5md%wqCDHL>;_85teVzm%7%EMNq7Dhx% z!wC2k-6IzrjD1EDqD0-u`23v4c6vl&@J$f4C{;ZD4j)jy`82U9xb_!>vlEYz8^0#$M6QkQcO;^uk|AwJu20 z(uP?P4bk#ystC^z& z6$MU`V|K|r57G1)?IX}N+f?!Cc!lB&`QqP@&b^$uf2zE|A{n;lAp70(P0b32w-=%! z$1Kzf0$k((1UVaPDS55HE2L9X@ELwHv(k6RHOt3ZTvsVh!752OBa#Hz=NQDt;#hS@ ziDgb^(FJMGqK)y5u`C&w>dN4rUVVkP+GaEj6gx6Ac`6((GfT=x6lE(A6{LMGDfbz3 zY+3#$VSM#^t}qg z7lumwM25vP_!zP^oiGamIN?-UwQRw*8dk$LWFGOAwHIEoV26!Ls}Hsze6M^cw|kXJ zq2L!wOq$D;dq(y>oY8~;3TU6XU<&-@BHdV(#DhJDM@o_nW1=K;4A0u%fXe+%fjdD4 z@+Cn{M07C-rRYHta9*}^QB{?5rL{w#3=}DF?eR~9U7n&N&Wj1)e5hD##5uX@T?G*f zXpqzuv&%Kk*XJT#av7E;`9v@9s8nA8id6EMvtixT>UqRU#W7k8S8Sz~HYW@W@( z!v>U*KPIb|@|~1{wAG5sIWBXRj7y4rQ3a_YvZ_E(NN!;elKSmrju7p>F*_JT7@Og= zG*0T-QdhlhtY(*KEg&h6m9A`MWTIx+diOfz!%?w}>^3blv6Q>lq_xW<@hoR15(y@c zR1OQOAyG?fd=Uz{H}gCfOqHd-OF?Q(RQ@EDnm>$ps85?1fV@&j5h_;V35HAyJ$K06wj8EL7nx}J z$nt>N$ya;T$V)QK(7PB<0 zdn6-ex+IdEB3qbKiai*jXj|kym=qK!3N55GWY9vvekS1pMAAeWQvrapiN$zTrKelK z1A-Au$uW(XN>qoi$_(w*5et1Ym}E|(2OlQ_x=2rerFsg=-&%GqhpRaNf=7_oJ2 z^?7C^(#Yj9uQktzju08Y38=`T{L;r0YTFyjASC8jB5`%#ea=MIc@7Gj*KImCi_s<{ zw2=3vj8fJ03ShF}Wz&_F6P4!(tp}@~kIIpf>Y`NJzEMA7pMcPSZn#e+c$&K{i!U3{{zj zuw2D(R9K^Y6pxa01_HBdEhj)KHPZ?z^#bm5i6o9Q&@DBhh{=QkK&JL)R(!fdS;S=+ z2W$X`W5!H+co(!JQL`lZ%nCb-O1mYDF{A?tE_0c*&)u@&DK??;5*4AChscCblx^b* z!)wZsWwM-Ao+-y6^nP23#K578V*H|5MasFY?IQ+YhT4hri;fDST)9MoLvC$Hug0rb zP$^Sd;^7`NB1*}#*Kc9@2=Q}YnH2#{qm{p^MJN3I>K`oko7S_pVrn%}1-{Rr6!S+8HGK2brD9t?n?x-BpN)%_atcYUt zC6Asll3Lsa5DzHm7evM~MreKMR`^>HGp1;-$m*fH7jsY6UzoY8aXTl-ZP?7&Y{1yt zy-Yg%gTovNG`Bd>a`d()6Mhiebb!~-?>0#P_6R{Hj zz0Q<4Xo`2;XwJ+Gv?|3lR@Fu-pvwbGfMyAm&XP+lPK>{cbXIz0qoUwi^tDbx>!SftdWiQ4=tyAHj<7-H7q3_>iBB~ZO1Y~ku zd)|g8i+b`ElaYg+so++0dyF1FXr4{TvDmyI905mfK)scw8 z3`d$wMF*sp`WLV+RcnO=H&$~R`7w_nmSfXhj7dEt89fshy9{Y<#m`;qHxrcAJTzf~#8Id~;AO zpmT6If;cVZo0+5RNPS`r=aml5apDBv%&{Z5-TgQ*_Q=y0C9}2raX6iBumG(9Bkxz_OF=`@SmiMKc1lDX#DzoNa876*Ry|TkTc6FyBlJP6@LbaC3SJjyBOnsK<=_W(W4sOkcTla^I>|wc z2R?{Z0FIRx)$tS+c@HJ3TMzKRkoZMzq z1(smPj6_ic)YbzTJFZpke{G&cbXrF4VS%+ipY+~98^u9Bwx;1Sh9`OxNc`qqkks!^ z82q%$b#+UD;@X0nZ~gHio-p@Sl7%UuyWv2R2`EbOMVxS;;0beO;$$pObr^f6MdJB8 zei-8Fj2PC07Ha&e2bX)4q8QV|ImCKAE8F+G?%7Z=hs|^Br%-?yvN;_YFELqK&&cox zx~}r#fP}Eu_sh=~L>QQUk6oZJRLNp@B>$#yesST)aL_4yyq>%nkW2+Sq z+*ju04}oNK_dz<`Gv({&_Y^dYbvlXXXF7)d@k^WQilUSNJ#BkyD?AOuP@5#cqrW3? z(N{rwtYDY={qxb;e}k(*O(}W^R<=SSVT~p+SESQ}6;4mF!6!lD_wq$VWtug2>Fj9b zePvWDJFgAf$K<(^Dh5U%=uWkiUU%k{(uAjL#`Cc%2~upkT3CP^9>7d20SgT$MG4Pm z;sg>WccH5dLHK_*>& z`|~L&h>^f50w!(@`vGv#`9hI+9@hUK*M#lVwzv8$;Y*qmX(4r-CpZQ8JayG7&(AvE zBH+3?JhQ6-m;qvf-q+K$Qlx8J&T6h?WP%K55w&eRgBomEv-<=R^o#BiMii#SCxWyY z31uisF2#mXp)dcC{N=@D=?dkR3+?$y>@f7C<;sKwdKosAk7?y-{D1$gL5%w=pcY28 z_Q3bPlQrH$KKMvc2&ZSS)caSVb+Qle0&^!Sp$aI8p@+QD;k^V==RKLy1Q4E6gV`1W zs2vMta^rvN@oGPRP#s^EZUDi&k6lgOdMPG=L#MgHRB|PT zC31Hkdw9=J-KSDNEh+!l=D!B$ z6giJVy^*?KP<7}smGBkPF;4x&d>A z7tfUYH}vOPa8FyX%u`(hbmZB@6#%de>D|tO!SfcOOV>+uCuL<BdhxmJMD9A2Kqq)(y5do7R=~qR5q(=La!)-$5R4`f33h(_eXzwe5;vk z(pm5?;<=5*2H-QO8)Ul$(i?**wJ|^X$wN<84A&|+e&2C#{mWp0X$k&K0d~4448t!Hpk)BQ9J1BjOC7+8X+vrHn6c#{4mMmnW=< zI?8{6{4WXo{u3+wD?lkQ=-ycC5aqhoV^rK1qL3?z)K&;jdfO zEn_)f4zWqh{C2v$_nMUday){@qF0G)8`@gdOI z<6GiLNB>x{)-O-FxdT0pVY=irV`^_;*+$`oj`ZUY286ly-q*SyX|M{CJVFqe zmv~|^Y}tGd8ZfilW9@*l{*+yDV@8HcL2x!_ldq9E&MMx(Q^S8P_Al0{L7}|lvp5>z z9Hw^kFgd(+}v7i){jfGF9Z;f_22#qD1^i$1GH6_y8?Im{XBi*4@l2(`HnC zvF%(;Q0N&x@EB&ByfE6!k`}<~L7F1$X16m7#n7A2V-l{F4<<6Xee)hWDSJf%(hJ4v z9blw?q~ACm@m)whGe7A>lzz`!h=aJ?0lG8%xp~J{v+d@VM1!@$QWLB*(BaQ&*z|!3 zM@Q!{X`6{k@yXm6nOQcA)SRhlAjp|hNqilBh(2=2U6vpvqHN1&Z$KE4J)cxBRk@4g{aEiSxIwMm*MNoF_dP z1BV}r=H{dfp(^{vf?`PI@_N+YMWoL_LGmDj9hOJWS$4xfl#o4`*2A@2-gDLc@G3Wq zlN>$9+PXISTT4WvWky{1QUK`HTdGHsfB_1dE)3mwH5!31bKT;9dXvxdJcKwzQrat= zv(sUZa|m2mR!Etjku;N{v(WHw$7)a&*{jXS`R( z9fVd}h?*@_GosE_v|)Y*84VX)+N48@Ra&mWYl-4blr-4BEZGzzLD@kwZY1#R87lGdNKYbB728i&oj0GRnpSa~cmgN7LbvFLLZyzKyN2cR<90*enR3pCU-c zRC8e(s=tB&yEEdVnAo8!TuV7ekB=nm4;Az13J=V@ zvg-Jh5ye>+T(4ReIObY4L^u>3XV(rYtxsJje<`u>IS-1&v5kie&`eR2#`7s&Z3fn+i%vGmJnbpf$jA?-ERZj2ib5KdL6B$^>fCPiXMaxGB| zF+QD~s$OP4Y0~d% zkP0%5lSZ3V%W0X=000xcNkl$EuU4&Q0dY;jX7KuVZHIOc7J~B{VIz0&*Or8ufe;e z7>;d*=a1wvhQiY@2h!zXo_?OH*>${%uwNkUl@as3DKkoLAj8ca_f|hhEeALWTBzZN z4LS1Qml&smpC^X-KfHw=95zKK)I3s`X637x@{tZ}W`;_JcC3j2zJauj$tU;pk=3ob zN~|PGpVh+`Jx7QNDo%~=VG>y4wv$;j|eqfB2wC*FjA0~kL2$O5*6XMGe0!D9Ut z9*yU>Y_^<1*J6~u`|bTnrQa|;#h}Qc#~KC&pH>g&0@V`H0UnQ=_)w}vA2?Zr^s==o z!L}jQzm(FfCvl9DP_nzk7W*k0#Ur5}l8cn?O_m2d$sPn|wyR0|OA^47LBn>o)^6%R zErJBA*8KiD%CeC@oR`s|VN?>kgqCpMI5Si5f~N!GoadW91JIBlK#ZnsV_y;LzxCU4 zL0)B)au;*;pD~7&J+2;Oe*hGRA*n3)|ch9(!X+!buBymLL4CqjR!7Rc3yxg183r|Bw*RM~^92_sJhwVamlBkp)J@o&>%9 zv5$vm3J3UAVhQsxFn;Q_<&QG76I(PydH@&-l;KcFSrllg%oob8rG&g_j7hBeHWVOu zod<1qrCTXi;K7UmHP1mz83t%i3^Y7ws9WR0?8pR)^oU#w5y%$L}>zwmj1OWYQ#%$;ELZ^K9 zLL`5924|NlBrzu-KJ{yHa3!775zHVl?N}(OLnUWX_c(pLo$rwn42BS zTTm`PksSlubKM_p5fr7P(;8`8BeS+rPE(W)WzlB+un+Jua8knKjA}?y3II=MKgWUT z!;|3L0c0776)X!~<9Z8HIM&Ek@sWBnij2BT25z}a&q-kSZjyZ8c7`aS-=p9AV$0GC zX3#v6FW&OA>kL_T-yV|3p(95YGxp`lgI8ufqnR~^4Si^xwOJGrco0Mt=k3ENyaISZ zaYbn}8CSCqmm$+bDTe?SDVRDcbeI}Z6|B4b^?LfK4vamv@|-h?Oh#i#dgDn;=O?f- zm5gsjKSs%C&PGPk(xx$w;-8Df%jbj({!+jXDk5UFURM=di}N(Zg_L&u_~RYZ{MVpu(fYEmfN-v z+>V*Qruy^LW~^H1zSfgst{L>Gv!>N|`h%g!&vVk5IZ{SL0vlp`f%|<(+dDVCz!4uD>O0)l3 z?Olh1tLOH97Ggz*ozt7O>mX@k&4sk#fBiaXA!l*jIJ(|H)Y2+bye0=ry9ktz%2?CF z4@XwyU?c3K_iy!v6kh~Lty-++ZPhRc37lFq*|eroDy!pd zc7Bk9)qc813SEqD@+&K0A`XI;rzQBTB%PSjz;yC{&f4H9`D3)AK!AGxMbYbBk*-Gn z%%dPqv=g_=rY!2Hiixt?!BA$&!=j%;k(h3-ohy}b$G7B->1b3R$;OP!ArRX|nY*of zpw2OuHUokuT9L>wZUMkhGp?|Xz1c_kA#aZNUgTbtB1reI!gfn(+z0n<1`~lUsP?+& z@FMqS$xXjqp93o*K4!X@Z|Xu4ufDCwC(ikmK5!jOtJ+Qs3YiNo`t6w)%9)_Q;xf{M ziHvw8|C_jgK4!qCb@a7)X5(~t|1m|@%|m$R^GDC-`fO?{ zC^@gy|KcJ^*X-p^6HrPa@u^-YGaRiAI7ut#xVI2jpQ?mq?Ip=yG`Hj=?u^aeu(P8} zPf6#{i;9-$;qzO7@<(8u#TRy3`RakHuhhB3n)z9FeGFoRu#BN(?W)8GV4Mus_rav< zhpWx`eO?{GD3 ze%<fhuZBRdQ441%H{%@X^9+Cv9OgME^-4gasT$~XKw)or`VvE7!zC3R{MQeR41$*-q1!S_q zth<$)Thke|X(s;Z`(47P{gh?*%YLERlI^d=asLZVNcy_gjMkF;c_Y)-mnU4rS;!E6 zI&SVput~Uko|}5nO48-F%oY~$Yqj3R0yY)k;OF#ppKmNyicVCG zoj$UZ3zwSfVvSCa=>q^79fElEem);TRV~&BmhHJ;@qP6S#f>7@G7+gQjId7xpxME~ z@JmtCgX2G*|Zz?B=x)x|Lm@b=RF_=_Qa1Vl}nAvy+*a728n zu&$r_(ZfPY8EeSB6OwRA+E>S2F2aR|P=mY~7QQx5z|5Qm57HenOtJ1oZ-0J1N`)32 z+@k{Eqk7n$XvD}i;0n?frGA1gl@Elz@A=(SWiGmR^yAt8;Ccbv$Vrtnw$LDPn5$R) z9S@0_cs-#D&fO7JkkZ%lL)uGkq@wZaKX|y)(8#C|d2=aq-irFCVrMT__$LxkXBxPH z2;o=G&+DE?`&Kstj7UAtf|nJ_$D^bVes7)p6+brmeD;w)*R^$MFQ9quI0xrMf&ck$ z{s+9jjkMMJ+Lhfp8BDT4W zF=t!h_PbqK<$g7PtZkT$P6cKf?duZ5jyyDm)-b5rqXB+n^8O9Hb(fIr_jpen-3e1j=jrGm<`JHZhWgp z0=i@X69WL;y0u2G%hlmigD0<(ef^sHQ&@|%^NR6>^Mrovi2+-=eSN+eCuPkxF&29O zmC3m}euzw=g5NC!Pg`scF!zCd0WJYZ_DZ-&y>nGq07^J0<5W4?Xn8J^_f zTBA^fa2#`U8^bAKjhl~7So+Lhm~34iS>XIguef2!9#}_*mFU#2+w({3rln`_7%T$C zKDFp@y95RNHaWO49>*ZPBj5)4A;iNbrGL&L@yt-Qg2wmmehNEyXuzDGnL7kOv-e;3 zG7dg=QM6@RjL5%C5^a!!ZZbRrR9NNjxi-k=7ApDSp`PFOob!99w|ospGI{2ZXrqrC z;FGvFbX8V#lOOmeP!-xyN#OYmr^xXXYiB=viz)UnOjX~9OXFgQKx%MnAHuIOdk%n- z$ZFqnzqk=9W(Yzg1B+<#eP49*Il!lB%zzai24=*?@qiW}Xs zh57Jj45;PjATyAj&*iWcfbWO&0DeA!ia+EpSD}7OF-qcLXo*uK=eyun@*v>fA}j_^a)tPHfL| zDYUAj{OtEQBRFVnU?eV1?9C6eW~_;}MPnOG45rw54hq66sKypUf0!7EDkHi`NV5gp!u_=@WipqBAz>u>A?&b?}90ag8l5km*oF6Z5>F|1J zLP5c!IMF$AHPDT2r`R)Aj;W{&Xo{r$SKa1RK1Jd)EIZc(3E4=7Kub@p5>wHqcZPaF zHj+^5;vkK2I&zrTV7Z6gk>0dg7>qv{A z)nE#rarw{ku|kxa=jHqq+$15!WQ@JV_jfJ>GYjxgU(F-Bt_(+wx?G0eHB4~|PlbnJ z>7-Fpeqh@ZneeO)y(ahL8Ax@Z$~h}r=jwCn;9;{+HFBoiP;~3sL?r=W>gHUL3C;M5 zKAaaE4Qa|a-wzi&@mP=yazz@dFw;Mh5qtwxJl9=-mlx*IKEvB`cvmmQpEGCBA9B6Y z@w7(gg#k)W`uUZBm<-OR>XFxwSEm$26pyEu@`E;jX(qTM=-_;TZCi)bW|@%Gy47bI zjr3l=4m)d@}_ z84_vEJ8M&HMyieje~SQ@TTbT6&NmJ*J)X38WL1fI@DSw$9&Ls7_zUC+E>OV@&a}DIoBOGgU)ZEG8 zieejoO6u$KDeD5v1XD~r5NlJZg_Mj9^yM)lm5ewVs5$M^dOAQh5Ump;7(kYoBpXd0 zGVE&AI;pZO+{KoMT$IN6J(1pu%g@nL0ljL_MU}R+35seZw0rH0oB~8_=vST9{0KPn zkecqgV){Y(>)5CL=9w%m&m@Qd7cJ)#8E~^!wHgWqkKxYa`!Ke5jJHp%q~8RB^z zrkpy&oby&ozzvQ@KyjC4h3Vbhkdn?xH!T62{|~W|ZYYA&X-xnC002ovPDHLkV1g?< BCJq1q literal 0 HcmV?d00001 diff --git a/backend/plugin/article/resource/database/migrations/.gitkeep b/backend/plugin/article/resource/database/migrations/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/backend/plugin/article/resource/database/migrations/2026_07_25_000001_create_article_tables.php b/backend/plugin/article/resource/database/migrations/2026_07_25_000001_create_article_tables.php new file mode 100644 index 0000000..422ab49 --- /dev/null +++ b/backend/plugin/article/resource/database/migrations/2026_07_25_000001_create_article_tables.php @@ -0,0 +1,94 @@ +hasTable('article_category')) { + $schema->create('article_category', function (Blueprint $table) { + $table->bigInteger('id')->primary()->comment('主键'); + $table->string('name', 100)->comment('分类名称'); + $table->string('slug', 100)->nullable()->comment('分类标识'); + $table->bigInteger('parent_id')->default(0)->comment('父级分类ID'); + $table->integer('sort')->default(100)->comment('排序'); + $table->tinyInteger('enabled')->default(1)->comment('状态: 1启用 0禁用'); + $table->longText('description')->nullable()->comment('分类描述'); + $table->bigInteger('created_by')->nullable()->comment('创建者'); + $table->bigInteger('updated_by')->nullable()->comment('更新者'); + $table->bigInteger('created_at')->nullable()->comment('创建时间'); + $table->bigInteger('updated_at')->nullable()->comment('更新时间'); + $table->bigInteger('deleted_at')->nullable()->comment('删除时间'); + $table->index('parent_id'); + $table->index('slug'); + $table->index('enabled'); + }); + } + + if (!$schema->hasTable('article_tag')) { + $schema->create('article_tag', function (Blueprint $table) { + $table->bigInteger('id')->primary()->comment('主键'); + $table->string('name', 100)->comment('标签名称'); + $table->string('slug', 100)->nullable()->comment('标签标识'); + $table->integer('sort')->default(100)->comment('排序'); + $table->integer('heat')->default(0)->comment('热度'); + $table->tinyInteger('enabled')->default(1)->comment('状态: 1启用 0禁用'); + $table->longText('description')->nullable()->comment('标签描述'); + $table->bigInteger('created_by')->nullable()->comment('创建者'); + $table->bigInteger('updated_by')->nullable()->comment('更新者'); + $table->bigInteger('created_at')->nullable()->comment('创建时间'); + $table->bigInteger('updated_at')->nullable()->comment('更新时间'); + $table->bigInteger('deleted_at')->nullable()->comment('删除时间'); + $table->index('slug'); + $table->index('enabled'); + $table->index('heat'); + }); + } + + if (!$schema->hasTable('article_content')) { + $schema->create('article_content', function (Blueprint $table) { + $table->bigInteger('id')->primary()->comment('主键'); + $table->string('title', 200)->comment('文章标题'); + $table->string('slug', 200)->nullable()->comment('文章标识'); + $table->bigInteger('category_id')->default(0)->comment('分类ID'); + $table->string('cover', 255)->nullable()->comment('封面图'); + $table->string('summary', 500)->nullable()->comment('摘要'); + $table->longText('content')->nullable()->comment('文章内容'); + $table->tinyInteger('status')->default(1)->comment('状态: 0草稿 1发布 2下架'); + $table->tinyInteger('is_top')->default(0)->comment('是否置顶'); + $table->integer('sort')->default(100)->comment('排序'); + $table->integer('view_count')->default(0)->comment('浏览量'); + $table->bigInteger('published_at')->nullable()->comment('发布时间'); + $table->bigInteger('created_by')->nullable()->comment('创建者'); + $table->bigInteger('updated_by')->nullable()->comment('更新者'); + $table->bigInteger('created_at')->nullable()->comment('创建时间'); + $table->bigInteger('updated_at')->nullable()->comment('更新时间'); + $table->bigInteger('deleted_at')->nullable()->comment('删除时间'); + $table->index('category_id'); + $table->index('status'); + $table->index('is_top'); + $table->index('published_at'); + }); + } + + if (!$schema->hasTable('article_content_tag')) { + $schema->create('article_content_tag', function (Blueprint $table) { + $table->bigInteger('id')->primary()->comment('主键'); + $table->bigInteger('content_id')->comment('文章ID'); + $table->bigInteger('tag_id')->comment('标签ID'); + $table->bigInteger('created_at')->nullable()->comment('创建时间'); + $table->index('content_id'); + $table->index('tag_id'); + }); + } + } + + public function down(Builder $schema): void + { + $schema->dropIfExists('article_content_tag'); + $schema->dropIfExists('article_content'); + $schema->dropIfExists('article_tag'); + $schema->dropIfExists('article_category'); + } +}; diff --git a/backend/plugin/article/resource/database/migrations/2026_07_26_000002_alter_article_content_add_publish_fields.php b/backend/plugin/article/resource/database/migrations/2026_07_26_000002_alter_article_content_add_publish_fields.php new file mode 100644 index 0000000..9f28ee8 --- /dev/null +++ b/backend/plugin/article/resource/database/migrations/2026_07_26_000002_alter_article_content_add_publish_fields.php @@ -0,0 +1,93 @@ +hasTable('article_content')) { + return; + } + + $schema->table('article_content', function (Blueprint $table) use ($schema) { + if (!$schema->hasColumn('article_content', 'content_type')) { + $table->string('content_type', 50)->default('article')->comment('内容类型')->after('title'); + } + if (!$schema->hasColumn('article_content', 'channel')) { + $table->string('channel', 100)->default('official')->comment('所属频道')->after('category_id'); + } + if (!$schema->hasColumn('article_content', 'visibility')) { + $table->tinyInteger('visibility')->default(1)->comment('可见范围: 1公开 2登录可见 3私密')->after('channel'); + } + if (!$schema->hasColumn('article_content', 'author')) { + $table->string('author', 100)->nullable()->comment('作者')->after('visibility'); + } + if (!$schema->hasColumn('article_content', 'source')) { + $table->string('source', 100)->default('original')->comment('内容来源')->after('author'); + } + if (!$schema->hasColumn('article_content', 'offline_at')) { + $table->bigInteger('offline_at')->nullable()->comment('下线时间')->after('published_at'); + } + if (!$schema->hasColumn('article_content', 'seo_keywords')) { + $table->string('seo_keywords', 255)->nullable()->comment('SEO关键词')->after('source'); + } + if (!$schema->hasColumn('article_content', 'seo_title')) { + $table->string('seo_title', 200)->nullable()->comment('SEO标题')->after('seo_keywords'); + } + if (!$schema->hasColumn('article_content', 'seo_description')) { + $table->string('seo_description', 500)->nullable()->comment('SEO描述')->after('seo_title'); + } + if (!$schema->hasColumn('article_content', 'like_count')) { + $table->integer('like_count')->default(0)->comment('点赞量')->after('view_count'); + } + if (!$schema->hasColumn('article_content', 'comment_count')) { + $table->integer('comment_count')->default(0)->comment('评论量')->after('like_count'); + } + if (!$schema->hasColumn('article_content', 'favorite_count')) { + $table->integer('favorite_count')->default(0)->comment('收藏量')->after('comment_count'); + } + if (!$schema->hasColumn('article_content', 'is_recommend')) { + $table->tinyInteger('is_recommend')->default(0)->comment('是否推荐')->after('is_top'); + } + if (!$schema->hasColumn('article_content', 'allow_comment')) { + $table->tinyInteger('allow_comment')->default(1)->comment('是否允许评论')->after('is_recommend'); + } + }); + } + + public function down(Builder $schema): void + { + if (!$schema->hasTable('article_content')) { + return; + } + + $dropColumns = []; + foreach ([ + 'content_type', + 'channel', + 'visibility', + 'author', + 'source', + 'offline_at', + 'seo_keywords', + 'seo_title', + 'seo_description', + 'like_count', + 'comment_count', + 'favorite_count', + 'is_recommend', + 'allow_comment', + ] as $column) { + if ($schema->hasColumn('article_content', $column)) { + $dropColumns[] = $column; + } + } + + if (!empty($dropColumns)) { + $schema->table('article_content', function (Blueprint $table) use ($dropColumns) { + $table->dropColumn($dropColumns); + }); + } + } +}; diff --git a/backend/plugin/article/resource/database/seeds/.gitkeep b/backend/plugin/article/resource/database/seeds/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/backend/plugin/article/resource/menu/admin.php b/backend/plugin/article/resource/menu/admin.php new file mode 100644 index 0000000..237bee6 --- /dev/null +++ b/backend/plugin/article/resource/menu/admin.php @@ -0,0 +1,46 @@ + '文章管理', + 'code' => 'article', + 'app' => 'article', + 'path' => '/article', + 'icon' => 'plugin', + 'children' => [ + [ + 'name' => '内容中心', + 'code' => 'article:index', + 'app' => 'article', + 'path' => '/article/index', + 'component' => '/article/content/index', + ], + [ + 'name' => '内容分类', + 'code' => 'article:category:index', + 'app' => 'article', + 'path' => '/article/category', + 'component' => '/article/category/index', + ], + [ + 'name' => '标签管理', + 'code' => 'article:tag:index', + 'app' => 'article', + 'path' => '/article/tag', + 'component' => '/article/tag/index', + ], + [ + 'name' => '内容回收站', + 'code' => 'article:recycle:index', + 'app' => 'article', + 'path' => '/article/recycle', + 'component' => '/article/recycle/index', + ], + ], + ], +]; diff --git a/backend/plugin/article/resource/menu/frontend.php b/backend/plugin/article/resource/menu/frontend.php new file mode 100644 index 0000000..917fd5d --- /dev/null +++ b/backend/plugin/article/resource/menu/frontend.php @@ -0,0 +1,9 @@ + + tag_names?: string + created_date?: string + updated_date?: string +} + +export const ArticleContentService = { + ...BaseService({ baseUrl: '/article/index' }) +} + +export const ArticleCategoryService = { + ...BaseService({ baseUrl: '/article/category' }) +} + +export const ArticleTagService = { + ...BaseService({ baseUrl: '/article/tag' }) +} + +const pluginApi = { + async test(params = {}) { + return request.get<{ msg?: string; data?: unknown }>({ + url: '/article/index', + params + }) + }, + + contentList(params = {}) { + return ArticleContentService.list(params as Record) + }, + + categoryList(params = {}) { + return ArticleCategoryService.list(params as Record) + }, + + tagList(params = {}) { + return ArticleTagService.list(params as Record) + }, + + async recycleList(params = {}) { + return request.get<{ code: number; msg: string; data: Record[] }>({ + url: '/article/recycle', + params + }) + }, + + async recycleRestore(id: string | number) { + return request.put({ + url: `/article/recycle/${id}/restore`, + params: { id } + }) + }, + + async recycleDelete(id: string | number) { + return request.del({ + url: `/article/recycle/${id}`, + params: { id } + }) + } +} + +export default pluginApi diff --git a/backend/plugin/article/resource/template/admin/lang/en/en.json b/backend/plugin/article/resource/template/admin/lang/en/en.json new file mode 100644 index 0000000..1ab8908 --- /dev/null +++ b/backend/plugin/article/resource/template/admin/lang/en/en.json @@ -0,0 +1,136 @@ +{ + "article": { + "title": "Article Management", + "description": "Article content operation and management plugin", + "card_title": "Article Plugin Data", + "refresh_btn": "Refresh", + "common": { + "list_mode": "List Mode", + "columns": { + "index": "No." + } + }, + "modules": { + "content": { + "title": "Content Center", + "description": "Manage articles, publish states, and content archives.", + "search": { + "keywords": "Keywords", + "keywords_placeholder": "Please enter article title, category, or tags" + }, + "form": { + "title": "Content Title", + "title_placeholder": "Please enter article title", + "slug": "Content Slug", + "slug_placeholder": "Please enter article slug", + "content_type": "Content Type", + "category_id": "Category", + "category_id_placeholder": "Please select category", + "channel": "Channel", + "visibility": "Visibility", + "author": "Author", + "author_placeholder": "Please enter author", + "source": "Source", + "cover": "Cover", + "cover_placeholder": "Please enter cover URL", + "summary": "Summary", + "summary_placeholder": "Please enter summary", + "content": "Content", + "content_placeholder": "Please enter content", + "status": "Status", + "is_top": "Pinned", + "is_recommend": "Recommend", + "allow_comment": "Comment Setting", + "sort": "Sort Order", + "sort_placeholder": "Please enter sort order", + "view_count": "View Count", + "like_count": "Like Count", + "comment_count": "Comment Count", + "favorite_count": "Favorite Count", + "published_at": "Published At", + "offline_at": "Offline At", + "tag_ids": "Content Tags", + "tag_ids_placeholder": "Please select content tags", + "seo_keywords": "SEO Keywords", + "seo_keywords_placeholder": "For search engine optimization", + "seo_title": "SEO Title", + "seo_title_placeholder": "Optional, defaults to content title", + "seo_description": "SEO Description", + "seo_description_placeholder": "Optional, highlight value and search keywords" + }, + "columns": { + "title": "Article Title", + "content_info": "Content Info", + "category": "Category", + "tags": "Tags", + "status": "Status", + "business_data": "Business Data", + "time_info": "Time", + "is_top": "Pinned", + "updated_at": "Last Updated" + } + }, + "category": { + "title": "Content Category", + "description": "Manage article category structure and ordering.", + "search": { + "keywords": "Keywords", + "keywords_placeholder": "Please enter category name or slug" + }, + "form": { + "name_placeholder": "Please enter category name", + "slug_placeholder": "Please enter category slug", + "parent_id": "Parent Category", + "parent_top": "Top Category", + "description": "Category Description", + "description_placeholder": "Please enter category description" + }, + "columns": { + "name": "Category Name", + "slug": "Category Slug", + "article_count": "Content Count", + "enabled": "Status", + "sort": "Sort", + "updated_at": "Last Updated" + } + }, + "tag": { + "title": "Tag Management", + "description": "Maintain article tags, popularity, and related article counts.", + "search": { + "keywords": "Keywords", + "keywords_placeholder": "Please enter tag name or slug" + }, + "form": { + "name_placeholder": "Please enter tag name", + "slug_placeholder": "Please enter tag slug", + "description": "Tag Description", + "description_placeholder": "Please enter tag description" + }, + "columns": { + "name": "Tag Name", + "slug": "Tag Slug", + "article_count": "Usage Count", + "enabled": "Status", + "heat": "Heat", + "updated_at": "Last Updated" + } + }, + "recycle": { + "title": "Content Recycle Bin", + "description": "Manage deleted articles for later recovery or cleanup.", + "search": { + "keywords": "Keywords", + "keywords_placeholder": "Please enter article title or deleter" + }, + "columns": { + "title": "Article Title", + "category": "Original Category", + "deleted_by": "Deleted By", + "deleted_at": "Deleted At", + "expire_at": "Expire At" + } + } + } + } +} diff --git a/backend/plugin/article/resource/template/admin/lang/en/index.json b/backend/plugin/article/resource/template/admin/lang/en/index.json new file mode 100644 index 0000000..a11b9a1 --- /dev/null +++ b/backend/plugin/article/resource/template/admin/lang/en/index.json @@ -0,0 +1,8 @@ +{ + "article": { + "title": "Article Management", + "description": "Article plugin demo page", + "card_title": "Article Plugin Data", + "refresh_btn": "Refresh" + } +} \ No newline at end of file diff --git a/backend/plugin/article/resource/template/admin/lang/zh-cn/index.json b/backend/plugin/article/resource/template/admin/lang/zh-cn/index.json new file mode 100644 index 0000000..582d445 --- /dev/null +++ b/backend/plugin/article/resource/template/admin/lang/zh-cn/index.json @@ -0,0 +1,8 @@ +{ + "article": { + "title": "文章管理", + "description": "文章插件示例页面", + "card_title": "文章插件数据", + "refresh_btn": "刷新" + } +} \ No newline at end of file diff --git a/backend/plugin/article/resource/template/admin/lang/zh-cn/zh.json b/backend/plugin/article/resource/template/admin/lang/zh-cn/zh.json new file mode 100644 index 0000000..1fcdb6e --- /dev/null +++ b/backend/plugin/article/resource/template/admin/lang/zh-cn/zh.json @@ -0,0 +1,136 @@ +{ + "article": { + "title": "文章管理", + "description": "文章内容运营与管理插件", + "card_title": "文章插件数据", + "refresh_btn": "刷新", + "common": { + "list_mode": "列表模式", + "columns": { + "index": "序号" + } + }, + "modules": { + "content": { + "title": "内容中心", + "description": "管理文章内容、发布状态与内容归档。", + "search": { + "keywords": "关键字", + "keywords_placeholder": "请输入文章标题、分类或标签" + }, + "form": { + "title": "内容标题", + "title_placeholder": "请输入文章标题", + "slug": "内容别名", + "slug_placeholder": "请输入文章标识", + "content_type": "内容类型", + "category_id": "内容分类", + "category_id_placeholder": "请选择内容分类", + "channel": "所属频道", + "visibility": "可见范围", + "author": "作者", + "author_placeholder": "请输入作者", + "source": "内容来源", + "cover": "封面图", + "cover_placeholder": "请输入封面图地址", + "summary": "摘要", + "summary_placeholder": "请输入摘要", + "content": "文章内容", + "content_placeholder": "请输入文章内容", + "status": "状态", + "is_top": "是否置顶", + "is_recommend": "推荐", + "allow_comment": "评论设置", + "sort": "内容排序", + "sort_placeholder": "请输入排序", + "view_count": "浏览量", + "like_count": "点赞量", + "comment_count": "评论量", + "favorite_count": "收藏量", + "published_at": "发布时间", + "offline_at": "下线时间", + "tag_ids": "内容标签", + "tag_ids_placeholder": "请选择内容标签", + "seo_keywords": "SEO 关键词", + "seo_keywords_placeholder": "用于搜索引擎优化", + "seo_title": "SEO 标题", + "seo_title_placeholder": "可选,默认继承内容标题", + "seo_description": "SEO 描述", + "seo_description_placeholder": "可选,建议突出商业价值与检索关键词" + }, + "columns": { + "title": "文章标题", + "content_info": "内容信息", + "category": "内容分类", + "tags": "标签", + "status": "状态", + "business_data": "经营数据", + "time_info": "时间", + "is_top": "置顶", + "updated_at": "最后更新" + } + }, + "category": { + "title": "内容分类", + "description": "管理文章分类结构与分类排序。", + "search": { + "keywords": "关键字", + "keywords_placeholder": "请输入分类名称或分类标识" + }, + "form": { + "name_placeholder": "请输入分类名称", + "slug_placeholder": "请输入分类标识", + "parent_id": "父级分类", + "parent_top": "顶级分类", + "description": "分类描述", + "description_placeholder": "请输入分类描述" + }, + "columns": { + "name": "分类名称", + "slug": "分类标识", + "article_count": "内容数", + "enabled": "状态", + "sort": "排序", + "updated_at": "最后更新" + } + }, + "tag": { + "title": "标签管理", + "description": "维护文章标签、热度与关联内容数量。", + "search": { + "keywords": "关键字", + "keywords_placeholder": "请输入标签名称或标签标识" + }, + "form": { + "name_placeholder": "请输入标签名称", + "slug_placeholder": "请输入标签标识", + "description": "标签描述", + "description_placeholder": "请输入标签描述" + }, + "columns": { + "name": "标签名称", + "slug": "标签标识", + "article_count": "使用次数", + "enabled": "状态", + "heat": "热度", + "updated_at": "最后更新" + } + }, + "recycle": { + "title": "内容回收站", + "description": "管理已删除文章,支持后续恢复或清理。", + "search": { + "keywords": "关键字", + "keywords_placeholder": "请输入文章标题或删除人" + }, + "columns": { + "title": "文章标题", + "category": "原分类", + "deleted_by": "删除人", + "deleted_at": "删除时间", + "expire_at": "过期清理时间" + } + } + } + } +} diff --git a/backend/plugin/article/resource/template/admin/routes/index.ts b/backend/plugin/article/resource/template/admin/routes/index.ts new file mode 100644 index 0000000..6d04b32 --- /dev/null +++ b/backend/plugin/article/resource/template/admin/routes/index.ts @@ -0,0 +1,59 @@ +import { AppRouteRecord } from '@/types/router' +import { RoutesAlias } from '@/router/routesAlias' + +export default { + path: '/article', + name: 'Article', + component: RoutesAlias.Layout, + meta: { + title: '文章管理', + icon: 'ri:plugin-line', + module: 'article' + }, + children: [ + { + path: 'index', + name: 'ArticleIndex', + component: '/article/content/index', + meta: { + title: '内容中心', + icon: 'ri:article-line', + keepAlive: false, + module: 'article' + } + }, + { + path: 'category', + name: 'ArticleCategory', + component: '/article/category/index', + meta: { + title: '内容分类', + icon: 'ri:folder-2-line', + keepAlive: false, + module: 'article' + } + }, + { + path: 'tag', + name: 'ArticleTag', + component: '/article/tag/index', + meta: { + title: '标签管理', + icon: 'ri:price-tag-3-line', + keepAlive: false, + module: 'article' + } + }, + { + path: 'recycle', + name: 'ArticleRecycle', + component: '/article/recycle/index', + meta: { + title: '内容回收站', + icon: 'ri:delete-bin-6-line', + keepAlive: false, + module: 'article' + } + } + ] +} as AppRouteRecord diff --git a/backend/plugin/article/resource/template/admin/views/article/category/index.vue b/backend/plugin/article/resource/template/admin/views/article/category/index.vue new file mode 100644 index 0000000..d835801 --- /dev/null +++ b/backend/plugin/article/resource/template/admin/views/article/category/index.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/backend/plugin/article/resource/template/admin/views/article/category/schemas/index.tsx b/backend/plugin/article/resource/template/admin/views/article/category/schemas/index.tsx new file mode 100644 index 0000000..0d64db7 --- /dev/null +++ b/backend/plugin/article/resource/template/admin/views/article/category/schemas/index.tsx @@ -0,0 +1,189 @@ +import { CrudSchema } from '@/components/crud' +import { DictEnum } from '@/enums' +import { $t } from '@/locales' +import { ArticleCategoryService } from '../../../../api/index' + +export const crudSchema = (): CrudSchema => { + return { + api: ArticleCategoryService.list, + dialogTitle: $t('article.modules.category.title'), + crudApi: { + add: ArticleCategoryService.create, + edit: ArticleCategoryService.update, + remove: ArticleCategoryService.delete, + view: ArticleCategoryService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'article:category:create', + editAuth: 'article:category:update', + removeAuth: 'article:category:delete', + viewAuth: 'article:category:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'LIKE_name', + label: $t('article.modules.category.search.keywords'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('article.modules.category.search.keywords_placeholder'), + }, + colSpan: 6, + }, + ], + }, + columns: [ + { + type: 'selection', + }, + { + type: 'index', + label: $t('article.common.columns.index'), + width: 70, + }, + { + prop: 'name', + label: $t('article.modules.category.columns.name'), + minWidth: 220, + }, + { + prop: 'slug', + label: $t('article.modules.category.columns.slug'), + minWidth: 180, + }, + { + prop: 'article_count', + label: $t('article.modules.category.columns.article_count'), + width: 120, + }, + { + prop: 'enabled', + label: $t('article.modules.category.columns.enabled'), + width: 120, + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_ENABLED_STATUS, + }, + }, + { + prop: 'sort', + label: $t('article.modules.category.columns.sort'), + width: 120, + }, + { + prop: 'updated_date', + label: $t('article.modules.category.columns.updated_at'), + minWidth: 180, + }, + ], + dialogProps: { + width: '600px', + }, + formSchema: { + showDefaultActions: false, + labelWidth: '100px', + schema: [ + { + component: 'Input', + show: false, + ifDetail: true, + colSpan: 24, + prop: 'id', + label: 'ID', + }, + { + component: 'Input', + prop: 'name', + label: $t('article.modules.category.columns.name'), + componentProps: { + placeholder: $t('article.modules.category.form.name_placeholder'), + maxlength: 100, + }, + rules: [{ required: true, message: $t('article.modules.category.form.name_placeholder') }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'slug', + label: $t('article.modules.category.columns.slug'), + componentProps: { + placeholder: $t('article.modules.category.form.slug_placeholder'), + maxlength: 100, + }, + colSpan: 12, + }, + { + component: 'ApiTreeSelect', + prop: 'parent_id', + label: $t('article.modules.category.form.parent_id'), + defaultValue: 0, + componentProps: { + api: '/article/category', + requestMethod: 'get', + params: { + format: 'tree', + }, + afterFetch: async (res: any) => { + if (!Array.isArray(res)) { + return res + } + return [ + { + id: 0, + name: $t('article.modules.category.form.parent_top'), + }, + ...res, + ] + }, + clearable: true, + checkStrictly: true, + class: 'w-full', + labelField: 'name', + valueField: 'id', + }, + colSpan: 12, + }, + { + component: 'InputNumber', + prop: 'sort', + label: $t('article.modules.category.columns.sort'), + defaultValue: 100, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'ApiDict', + prop: 'enabled', + label: $t('article.modules.category.columns.enabled'), + defaultValue: 1, + componentProps: { + code: DictEnum.SYS_ENABLED_STATUS, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 24, + }, + { + component: 'Input', + prop: 'description', + label: $t('article.modules.category.form.description'), + componentProps: { + type: 'textarea', + rows: 4, + placeholder: $t('article.modules.category.form.description_placeholder'), + }, + colSpan: 24, + }, + ], + }, + } +} diff --git a/backend/plugin/article/resource/template/admin/views/article/content/index.vue b/backend/plugin/article/resource/template/admin/views/article/content/index.vue new file mode 100644 index 0000000..c375ed5 --- /dev/null +++ b/backend/plugin/article/resource/template/admin/views/article/content/index.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/backend/plugin/article/resource/template/admin/views/article/content/schemas/index.tsx b/backend/plugin/article/resource/template/admin/views/article/content/schemas/index.tsx new file mode 100644 index 0000000..fde1498 --- /dev/null +++ b/backend/plugin/article/resource/template/admin/views/article/content/schemas/index.tsx @@ -0,0 +1,544 @@ +import { CrudSchema } from '@/components/crud' +import { DictEnum } from '@/enums' +import { $t } from '@/locales' +import { ArticleContentService } from '../../../../api/index' +import { h } from 'vue' + +const contentTypeOptions = [ + { label: '文章', value: 'article' }, + { label: '图文', value: 'news' }, + { label: '公告', value: 'notice' }, +] + +const channelOptions = [ + { label: '官网内容', value: 'official' }, + { label: '专题内容', value: 'topic' }, + { label: '活动内容', value: 'activity' }, +] + +const visibilityOptions = [ + { label: '公开', value: 1 }, + { label: '登录可见', value: 2 }, + { label: '私密', value: 3 }, +] + +const sourceOptions = [ + { label: '原创', value: 'original' }, + { label: '转载', value: 'repost' }, + { label: '投稿', value: 'contribution' }, +] + +const statusOptions = [ + { label: '草稿', value: 0 }, + { label: '发布', value: 1 }, + { label: '下线', value: 2 }, +] + +const getOptionLabel = (options: Array<{ label: string; value: string | number }>, value: string | number) => { + return options.find((item) => item.value === value)?.label || '-' +} + +const getStatusTagClass = (status: number) => { + if (status === 1) { + return 'inline-flex rounded-full bg-[#ecfdf5] px-2 py-[2px] text-xs text-[#10b981]' + } + if (status === 2) { + return 'inline-flex rounded-full bg-[#fef2f2] px-2 py-[2px] text-xs text-[#ef4444]' + } + return 'inline-flex rounded-full bg-[#f4f4f5] px-2 py-[2px] text-xs text-[#909399]' +} + +export const crudSchema = (): CrudSchema => { + return { + api: ArticleContentService.list, + dialogTitle: $t('article.modules.content.title'), + exportFileName: '内容中心', + exportFields: [ + { field: 'title', title: '标题' }, + { field: 'content_type', title: '内容类型' }, + { field: 'category_name', title: '分类' }, + { field: 'tag_names', title: '标签' }, + { field: 'author', title: '作者' }, + { field: 'channel', title: '频道' }, + { field: 'visibility', title: '可见范围' }, + { field: 'source', title: '来源' }, + { field: 'status', title: '状态' }, + { field: 'is_top', title: '置顶' }, + { field: 'is_recommend', title: '推荐' }, + { field: 'view_count', title: '浏览数' }, + { field: 'like_count', title: '点赞数' }, + { field: 'comment_count', title: '评论数' }, + { field: 'favorite_count', title: '收藏数' }, + { field: 'published_at', title: '发布时间' }, + { field: 'updated_date', title: '更新时间' }, + { field: 'summary', title: '摘要' } + ], + crudApi: { + add: ArticleContentService.create, + edit: ArticleContentService.update, + remove: ArticleContentService.remove, + view: ArticleContentService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'article:create', + editAuth: 'article:update', + removeAuth: 'article:delete', + viewAuth: 'article:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'LIKE_title', + label: $t('article.modules.content.search.keywords'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('article.modules.content.search.keywords_placeholder'), + }, + colSpan: 6, + }, + ], + }, + columns: [ + { + type: 'index', + label: $t('article.common.columns.index'), + width: 70, + }, + { + prop: 'content_info', + label: $t('article.modules.content.columns.content_info'), + minWidth: 380, + formatter: (row: any) => { + const metaItems = [ + getOptionLabel(contentTypeOptions, row.content_type), + row.author || '管理员', + row.category_name, + row.tag_names, + ].filter(Boolean) + + const badgeNodes = [ + Number(row.is_top) === 1 + ? h('span', { class: 'inline-flex items-center rounded bg-[#fff7e6] px-1.5 py-[1px] text-[10px] text-[#fa8c16]' }, '置顶') + : null, + Number(row.is_recommend) === 1 + ? h('span', { class: 'inline-flex items-center rounded bg-[#ecfdf5] px-1.5 py-[1px] text-[10px] text-[#10b981]' }, '推荐') + : null, + ].filter(Boolean) + + return h('div', { class: 'flex gap-3 py-2' }, [ + row.cover + ? h('img', { + src: row.cover, + class: 'mt-1 h-14 w-20 flex-none rounded bg-[#f5f7fa] object-cover border border-[#f0f0f0]' + }) + : h( + 'div', + { + class: 'mt-1 h-14 w-20 flex-none rounded border border-[#f0f0f0] bg-[#fafafa] text-[10px] text-[#c0c4cc] flex items-center justify-center' + }, + '无上传封面' + ), + h('div', { class: 'min-w-0 flex-1 leading-6' }, [ + h('div', { class: 'flex items-center gap-2 text-sm font-medium text-[#1f2937]' }, [ + h('span', { class: 'line-clamp-1' }, row.title || '-'), + ...badgeNodes + ]), + h( + 'div', + { class: 'mt-1 flex flex-wrap gap-x-3 gap-y-1 text-xs text-[#909399]' }, + metaItems.length > 0 ? metaItems.map((item) => h('span', item)) : [h('span', '-')] + ), + h('div', { class: 'mt-1 line-clamp-2 text-xs text-[#606266]' }, row.summary || row.slug || '-') + ]) + ]) + } + }, + { + prop: 'status_info', + label: $t('article.modules.content.columns.status'), + width: 140, + align: 'center', + formatter: (row: any) => { + const statusText = getOptionLabel(statusOptions, row.status) + const visibilityText = getOptionLabel(visibilityOptions, row.visibility) + const sourceText = getOptionLabel(sourceOptions, row.source) + return h('div', { class: 'flex flex-col items-center py-2 text-sm leading-6' }, [ + h('div', [ + h('span', { class: getStatusTagClass(Number(row.status)) }, statusText) + ]), + h('div', { class: 'mt-1 text-xs text-[#606266]' }, visibilityText), + h('div', { class: 'mt-1 text-xs text-[#909399]' }, sourceText) + ]) + } + }, + { + prop: 'business_data', + label: $t('article.modules.content.columns.business_data'), + minWidth: 250, + formatter: (row: any) => { + const metricItems = [ + { label: '浏览', value: row.view_count ?? 0 }, + { label: '点赞', value: row.like_count ?? 0 }, + { label: '评论', value: row.comment_count ?? 0 }, + { label: '收藏', value: row.favorite_count ?? 0 }, + ] + + return h('div', { class: 'grid grid-cols-2 gap-2 py-2 text-xs text-[#606266]' }, [ + ...metricItems.map((item) => + h('div', { class: 'flex items-center justify-between rounded border border-[#e5e7eb] bg-[#eef2f6] px-3 py-1.5 transition-colors hover:bg-[#e5e7eb]' }, [ + h('span', { class: 'text-[#909399]' }, item.label), + h('span', item.value) + ]) + ) + ]) + } + }, + { + prop: 'time_info', + label: $t('article.modules.content.columns.time_info'), + minWidth: 190, + formatter: (row: any) => { + return h('div', { class: 'py-2 text-xs leading-6 text-[#606266]' }, [ + h('div', [ + h('span', { class: 'text-[#909399]' }, '更新 '), + h('span', row.updated_date || '-') + ]), + h('div', { class: 'mt-1' }, [ + h('span', { class: 'text-[#909399]' }, '发布 '), + h('span', row.created_date || '-') + ]) + ]) + } + }, + ], + tableActionColumn: { + width: 170, + }, + dialogProps: { + width: '70%', + }, + formSchema: { + showDefaultActions: false, + labelWidth: '100px', + schema: [ + { + component: 'Input', + show: false, + ifDetail: true, + colSpan: 24, + prop: 'id', + label: 'ID', + }, + { + component: 'Input', + prop: 'title', + label: $t('article.modules.content.columns.title'), + componentProps: { + placeholder: $t('article.modules.content.form.title_placeholder'), + maxlength: 200, + }, + rules: [{ required: true, message: $t('article.modules.content.form.title_placeholder') }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'slug', + label: $t('article.modules.content.form.slug'), + componentProps: { + placeholder: $t('article.modules.content.form.slug_placeholder'), + maxlength: 200, + }, + colSpan: 12, + }, + { + component: 'Select', + prop: 'content_type', + label: $t('article.modules.content.form.content_type'), + defaultValue: 'article', + componentProps: { + options: contentTypeOptions, + class: 'w-full', + }, + rules: [{ required: true, message: $t('article.modules.content.form.content_type') }], + colSpan: 12, + }, + { + component: 'ApiTreeSelect', + prop: 'category_id', + label: $t('article.modules.content.form.category_id'), + componentProps: { + api: '/article/category', + requestMethod: 'get', + params: { + format: 'tree', + }, + teleported: true, + clearable: true, + checkStrictly: true, + class: 'w-full', + labelField: 'name', + valueField: 'id', + placeholder: $t('article.modules.content.form.category_id_placeholder'), + }, + rules: [{ required: true, message: $t('article.modules.content.form.category_id') }], + colSpan: 12, + }, + { + component: 'Select', + prop: 'channel', + label: $t('article.modules.content.form.channel'), + defaultValue: 'official', + componentProps: { + options: channelOptions, + class: 'w-full', + }, + rules: [{ required: true, message: $t('article.modules.content.form.channel') }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'author', + label: $t('article.modules.content.form.author'), + componentProps: { + placeholder: $t('article.modules.content.form.author_placeholder'), + maxlength: 100, + }, + rules: [{ required: true, message: $t('article.modules.content.form.author_placeholder') }], + colSpan: 12, + }, + { + component: 'Select', + prop: 'visibility', + label: $t('article.modules.content.form.visibility'), + defaultValue: 1, + componentProps: { + options: visibilityOptions, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'Select', + prop: 'status', + label: $t('article.modules.content.form.status'), + defaultValue: 0, + componentProps: { + options: statusOptions, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'Select', + prop: 'source', + label: $t('article.modules.content.form.source'), + defaultValue: 'original', + componentProps: { + options: sourceOptions, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'Avatar', + prop: 'cover', + label: $t('article.modules.content.form.cover'), + componentProps: { + shape: 'square', + }, + colSpan: 24, + }, + { + component: 'Input', + prop: 'summary', + label: $t('article.modules.content.form.summary'), + componentProps: { + type: 'textarea', + rows: 4, + maxlength: 500, + placeholder: $t('article.modules.content.form.summary_placeholder'), + }, + colSpan: 24, + }, + { + component: 'ApiSelect', + prop: 'tag_ids', + label: $t('article.modules.content.form.tag_ids'), + componentProps: { + api: '/article/tag', + requestMethod: 'get', + params: { + format: 'select', + }, + labelField: 'label', + valueField: 'value', + multiple: true, + clearable: true, + filterable: true, + class: 'w-full', + placeholder: $t('article.modules.content.form.tag_ids_placeholder'), + }, + colSpan: 12, + }, + { + component: 'Input', + prop: 'seo_keywords', + label: $t('article.modules.content.form.seo_keywords'), + componentProps: { + placeholder: $t('article.modules.content.form.seo_keywords_placeholder'), + maxlength: 255, + }, + colSpan: 12, + }, + { + component: 'Input', + prop: 'seo_title', + label: $t('article.modules.content.form.seo_title'), + componentProps: { + placeholder: $t('article.modules.content.form.seo_title_placeholder'), + maxlength: 200, + }, + colSpan: 12, + }, + { + component: 'Input', + prop: 'seo_description', + label: $t('article.modules.content.form.seo_description'), + componentProps: { + placeholder: $t('article.modules.content.form.seo_description_placeholder'), + maxlength: 500, + }, + colSpan: 12, + }, + { + component: 'InputNumber', + prop: 'sort', + label: $t('article.modules.content.form.sort'), + defaultValue: 100, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 8, + }, + { + component: 'DatePicker', + prop: 'published_at', + label: $t('article.modules.content.form.published_at'), + componentProps: { + type: 'datetime', + valueFormat: 'X', + class: 'w-full', + }, + colSpan: 8, + }, + { + component: 'DatePicker', + prop: 'offline_at', + label: $t('article.modules.content.form.offline_at'), + componentProps: { + type: 'datetime', + valueFormat: 'X', + class: 'w-full', + }, + colSpan: 8, + }, + { + component: 'InputNumber', + prop: 'view_count', + label: $t('article.modules.content.form.view_count'), + defaultValue: 0, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 6, + }, + { + component: 'InputNumber', + prop: 'like_count', + label: $t('article.modules.content.form.like_count'), + defaultValue: 0, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 6, + }, + { + component: 'InputNumber', + prop: 'comment_count', + label: $t('article.modules.content.form.comment_count'), + defaultValue: 0, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 6, + }, + { + component: 'InputNumber', + prop: 'favorite_count', + label: $t('article.modules.content.form.favorite_count'), + defaultValue: 0, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 6, + }, + { + component: 'ApiDict', + prop: 'is_top', + label: $t('article.modules.content.form.is_top'), + defaultValue: 0, + componentProps: { + code: DictEnum.SYS_YES_NO, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 8, + }, + { + component: 'ApiDict', + prop: 'is_recommend', + label: $t('article.modules.content.form.is_recommend'), + defaultValue: 0, + componentProps: { + code: DictEnum.SYS_YES_NO, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 8, + }, + { + component: 'ApiDict', + prop: 'allow_comment', + label: $t('article.modules.content.form.allow_comment'), + defaultValue: 1, + componentProps: { + code: DictEnum.SYS_YES_NO, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 8, + }, + { + component: 'Editor', + prop: 'content', + label: $t('article.modules.content.form.content'), + componentProps: { + placeholder: $t('article.modules.content.form.content_placeholder'), + }, + colSpan: 24, + }, + ], + }, + } +} diff --git a/backend/plugin/article/resource/template/admin/views/article/index/index.vue b/backend/plugin/article/resource/template/admin/views/article/index/index.vue new file mode 100644 index 0000000..2617d29 --- /dev/null +++ b/backend/plugin/article/resource/template/admin/views/article/index/index.vue @@ -0,0 +1,147 @@ + + + + + diff --git a/backend/plugin/article/resource/template/admin/views/article/recycle/index.vue b/backend/plugin/article/resource/template/admin/views/article/recycle/index.vue new file mode 100644 index 0000000..68ba3c5 --- /dev/null +++ b/backend/plugin/article/resource/template/admin/views/article/recycle/index.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/backend/plugin/article/resource/template/admin/views/article/recycle/schemas/index.tsx b/backend/plugin/article/resource/template/admin/views/article/recycle/schemas/index.tsx new file mode 100644 index 0000000..9d6c771 --- /dev/null +++ b/backend/plugin/article/resource/template/admin/views/article/recycle/schemas/index.tsx @@ -0,0 +1,65 @@ +import { CrudSchema } from '@/components/crud' +import { $t } from '@/locales' +import pluginApi from '../../../../api/index' + +export const crudSchema = (): CrudSchema => { + return { + api: async (params: any) => { + const response = await pluginApi.recycleList(params) + const rows = Array.isArray(response) ? response : [] + return { + recordCount: rows.length, + totalPage: 1, + rows, + } + }, + useCrud: false, + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'LIKE_title', + label: $t('article.modules.recycle.search.keywords'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('article.modules.recycle.search.keywords_placeholder'), + }, + colSpan: 6, + }, + ], + }, + columns: [ + { + type: 'index', + label: $t('article.common.columns.index'), + width: 70, + }, + { + prop: 'title', + label: $t('article.modules.recycle.columns.title'), + minWidth: 220, + }, + { + prop: 'category', + label: $t('article.modules.recycle.columns.category'), + minWidth: 160, + }, + { + prop: 'deleted_by', + label: $t('article.modules.recycle.columns.deleted_by'), + width: 140, + }, + { + prop: 'deleted_at', + label: $t('article.modules.recycle.columns.deleted_at'), + minWidth: 180, + }, + { + prop: 'expire_at', + label: $t('article.modules.recycle.columns.expire_at'), + minWidth: 180, + }, + ], + } +} diff --git a/backend/plugin/article/resource/template/admin/views/article/tag/index.vue b/backend/plugin/article/resource/template/admin/views/article/tag/index.vue new file mode 100644 index 0000000..c763b60 --- /dev/null +++ b/backend/plugin/article/resource/template/admin/views/article/tag/index.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/backend/plugin/article/resource/template/admin/views/article/tag/schemas/index.tsx b/backend/plugin/article/resource/template/admin/views/article/tag/schemas/index.tsx new file mode 100644 index 0000000..3031030 --- /dev/null +++ b/backend/plugin/article/resource/template/admin/views/article/tag/schemas/index.tsx @@ -0,0 +1,169 @@ +import { CrudSchema } from '@/components/crud' +import { DictEnum } from '@/enums' +import { $t } from '@/locales' +import { ArticleTagService } from '../../../../api/index' + +export const crudSchema = (): CrudSchema => { + return { + api: ArticleTagService.list, + dialogTitle: $t('article.modules.tag.title'), + crudApi: { + add: ArticleTagService.create, + edit: ArticleTagService.update, + remove: ArticleTagService.delete, + view: ArticleTagService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'article:tag:create', + editAuth: 'article:tag:update', + removeAuth: 'article:tag:delete', + viewAuth: 'article:tag:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'LIKE_name', + label: $t('article.modules.tag.search.keywords'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('article.modules.tag.search.keywords_placeholder'), + }, + colSpan: 6, + }, + ], + }, + columns: [ + { + type: 'selection', + }, + { + type: 'index', + label: $t('article.common.columns.index'), + width: 70, + }, + { + prop: 'name', + label: $t('article.modules.tag.columns.name'), + minWidth: 220, + }, + { + prop: 'slug', + label: $t('article.modules.tag.columns.slug'), + minWidth: 180, + }, + { + prop: 'article_count', + label: $t('article.modules.tag.columns.article_count'), + width: 120, + }, + { + prop: 'enabled', + label: $t('article.modules.tag.columns.enabled'), + width: 120, + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_ENABLED_STATUS, + }, + }, + { + prop: 'heat', + label: $t('article.modules.tag.columns.heat'), + width: 120, + }, + { + prop: 'updated_date', + label: $t('article.modules.tag.columns.updated_at'), + minWidth: 180, + }, + ], + dialogProps: { + width: '600px', + }, + formSchema: { + showDefaultActions: false, + labelWidth: '100px', + schema: [ + { + component: 'Input', + show: false, + ifDetail: true, + colSpan: 24, + prop: 'id', + label: 'ID', + }, + { + component: 'Input', + prop: 'name', + label: $t('article.modules.tag.columns.name'), + componentProps: { + placeholder: $t('article.modules.tag.form.name_placeholder'), + maxlength: 100, + }, + rules: [{ required: true, message: $t('article.modules.tag.form.name_placeholder') }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'slug', + label: $t('article.modules.tag.columns.slug'), + componentProps: { + placeholder: $t('article.modules.tag.form.slug_placeholder'), + maxlength: 100, + }, + colSpan: 12, + }, + { + component: 'InputNumber', + prop: 'sort', + label: $t('article.modules.tag.columns.heat'), + defaultValue: 100, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'InputNumber', + prop: 'heat', + label: $t('article.modules.tag.columns.heat'), + defaultValue: 0, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'ApiDict', + prop: 'enabled', + label: $t('article.modules.tag.columns.enabled'), + defaultValue: 1, + componentProps: { + code: DictEnum.SYS_ENABLED_STATUS, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 24, + }, + { + component: 'Input', + prop: 'description', + label: $t('article.modules.tag.form.description'), + componentProps: { + type: 'textarea', + rows: 4, + placeholder: $t('article.modules.tag.form.description_placeholder'), + }, + colSpan: 24, + }, + ], + }, + } +} diff --git a/backend/plugin/article/resource/template/admin/views/index/index.vue b/backend/plugin/article/resource/template/admin/views/index/index.vue new file mode 100644 index 0000000..1d702c1 --- /dev/null +++ b/backend/plugin/article/resource/template/admin/views/index/index.vue @@ -0,0 +1,147 @@ + + + + + diff --git a/backend/plugin/article/resource/template/web/.gitkeep b/backend/plugin/article/resource/template/web/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/backend/plugin/produce/Install.php b/backend/plugin/produce/Install.php new file mode 100644 index 0000000..349ef1a --- /dev/null +++ b/backend/plugin/produce/Install.php @@ -0,0 +1,59 @@ +importPluginMenus() - 导入菜单 + * - $this->importTemplates() - 复制模板 + * - $this->uninstallPluginMenus() - 卸载菜单 + */ +class Install extends BasePluginInstall +{ + /** + * 安装前回调 + */ + protected function beforeInstall(string $version): void + { + $this->output(" 🔄 Running beforeInstall...\n"); + } + + /** + * 安装后回调 - 按需导入菜单和模板 + */ + protected function afterInstall(string $version): void + { + $this->output(" 🔄 Running afterInstall...\n"); + + // 导入菜单 + $this->importPluginMenus(); + + // 复制模板资源 + $this->importTemplates(); + } + + /** + * 卸载前回调 + */ + protected function beforeUninstall(string $version): void + { + $this->output(" 🔄 Running beforeUninstall...\n"); + } + + /** + * 卸载后回调 - 清理菜单 + */ + protected function afterUninstall(string $version): void + { + $this->output(" 🔄 Running afterUninstall...\n"); + // 卸载菜单 + $this->uninstallPluginMenus(); + } +} diff --git a/backend/plugin/produce/app/adminapi/controller/ExceptionAnalysisController.php b/backend/plugin/produce/app/adminapi/controller/ExceptionAnalysisController.php new file mode 100644 index 0000000..ffefb12 --- /dev/null +++ b/backend/plugin/produce/app/adminapi/controller/ExceptionAnalysisController.php @@ -0,0 +1,32 @@ +service->overview($request->all())); + } +} diff --git a/backend/plugin/produce/app/adminapi/controller/ExceptionRecordController.php b/backend/plugin/produce/app/adminapi/controller/ExceptionRecordController.php new file mode 100644 index 0000000..be4585b --- /dev/null +++ b/backend/plugin/produce/app/adminapi/controller/ExceptionRecordController.php @@ -0,0 +1,102 @@ + true, + 'keyword_fields' => ['order_no', 'user_code', 'reporter', 'type_name', 'reason_name', 'issue_name', 'remark'], + ]; + + public function __construct(ExceptionRecordService $service, ExceptionRecordValidate $validate) + { + $this->service = $service; + $this->validate = $validate; + } + + #[OA\Get(path: '/produce/exception-record', summary: '异常数据列表', tags: ['produce-exception-record'])] + #[Permission(code: 'produce:exception-data:list', description: '异常数据列表')] + #[PageResponse(schema: [], example: [])] + public function index(Request $request): \support\Response + { + return parent::index($request); + } + + #[OA\Get(path: '/produce/exception-record/{id}', summary: '异常数据详情', tags: ['produce-exception-record'], x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ])] + #[Permission(code: 'produce:exception-data:read', description: '异常数据详情')] + #[SimpleResponse(schema: [], example: [])] + public function show(Request $request): \support\Response + { + return parent::show($request); + } + + #[OA\Post(path: '/produce/exception-record', summary: '创建异常数据', tags: ['produce-exception-record'])] + #[Permission(code: 'produce:exception-data:create', description: '创建异常数据')] + #[SimpleResponse(schema: [], example: [])] + public function store(Request $request): \support\Response + { + return parent::store($request); + } + + #[OA\Put(path: '/produce/exception-record/{id}', summary: '更新异常数据', tags: ['produce-exception-record'], x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ])] + #[Permission(code: 'produce:exception-data:update', description: '更新异常数据')] + #[SimpleResponse(schema: [], example: [])] + public function update(Request $request): \support\Response + { + return parent::update($request); + } + + #[OA\Post(path: '/produce/exception-record/export', summary: '导出异常数据', tags: ['produce-exception-record'])] + #[Permission(code: 'produce:exception-data:list', description: '导出异常数据')] + #[SimpleResponse(schema: [], example: [])] + public function export(Request $request): \support\Response + { + return parent::export($request); + } + + #[OA\Delete(path: '/produce/exception-record/{id}', summary: '删除异常数据', tags: ['produce-exception-record'], x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ])] + #[Permission(code: 'produce:exception-data:delete', description: '删除异常数据')] + #[SimpleResponse(schema: [], example: [])] + public function destroy(Request $request): \support\Response + { + return parent::destroy($request); + } + + #[OA\Delete(path: '/produce/exception-record', summary: '批量删除异常数据', tags: ['produce-exception-record'], x: [ + SchemaConstants::X_SCHEMA_REQUEST => BatchDeleteRequest::class, + ])] + #[Permission(code: 'produce:exception-data:delete', description: '批量删除异常数据')] + #[SimpleResponse(schema: [], example: [])] + public function batchDelete(Request $request): \support\Response + { + return parent::destroy($request); + } +} diff --git a/backend/plugin/produce/app/adminapi/controller/ExceptionSettingController.php b/backend/plugin/produce/app/adminapi/controller/ExceptionSettingController.php new file mode 100644 index 0000000..14169dc --- /dev/null +++ b/backend/plugin/produce/app/adminapi/controller/ExceptionSettingController.php @@ -0,0 +1,94 @@ + true, + 'keyword_fields' => ['code', 'name', 'remark'], + ]; + + public function __construct(ExceptionSettingService $service, ExceptionSettingValidate $validate) + { + $this->service = $service; + $this->validate = $validate; + } + + #[OA\Get(path: '/produce/exception-setting', summary: '异常设置列表', tags: ['produce-exception-setting'])] + #[Permission(code: 'produce:exception-setting:list', description: '异常设置列表')] + #[PageResponse(schema: [], example: [])] + public function index(Request $request): \support\Response + { + return parent::index($request); + } + + #[OA\Get(path: '/produce/exception-setting/{id}', summary: '异常设置详情', tags: ['produce-exception-setting'], x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ])] + #[Permission(code: 'produce:exception-setting:read', description: '异常设置详情')] + #[SimpleResponse(schema: [], example: [])] + public function show(Request $request): \support\Response + { + return parent::show($request); + } + + #[OA\Post(path: '/produce/exception-setting', summary: '创建异常设置', tags: ['produce-exception-setting'])] + #[Permission(code: 'produce:exception-setting:create', description: '创建异常设置')] + #[SimpleResponse(schema: [], example: [])] + public function store(Request $request): \support\Response + { + return parent::store($request); + } + + #[OA\Put(path: '/produce/exception-setting/{id}', summary: '更新异常设置', tags: ['produce-exception-setting'], x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ])] + #[Permission(code: 'produce:exception-setting:update', description: '更新异常设置')] + #[SimpleResponse(schema: [], example: [])] + public function update(Request $request): \support\Response + { + return parent::update($request); + } + + #[OA\Delete(path: '/produce/exception-setting/{id}', summary: '删除异常设置', tags: ['produce-exception-setting'], x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ])] + #[Permission(code: 'produce:exception-setting:delete', description: '删除异常设置')] + #[SimpleResponse(schema: [], example: [])] + public function destroy(Request $request): \support\Response + { + return parent::destroy($request); + } + + #[OA\Delete(path: '/produce/exception-setting', summary: '批量删除异常设置', tags: ['produce-exception-setting'], x: [ + SchemaConstants::X_SCHEMA_REQUEST => BatchDeleteRequest::class, + ])] + #[Permission(code: 'produce:exception-setting:delete', description: '批量删除异常设置')] + #[SimpleResponse(schema: [], example: [])] + public function batchDelete(Request $request): \support\Response + { + return parent::destroy($request); + } +} diff --git a/backend/plugin/produce/app/adminapi/controller/HardwareFaultDescriptionController.php b/backend/plugin/produce/app/adminapi/controller/HardwareFaultDescriptionController.php new file mode 100644 index 0000000..aeda737 --- /dev/null +++ b/backend/plugin/produce/app/adminapi/controller/HardwareFaultDescriptionController.php @@ -0,0 +1,91 @@ + true, + 'keyword_fields' => ['description', 'remark'], + ]; + + public function __construct(HardwareFaultDescriptionService $service, HardwareFaultDescriptionValidate $validate) + { + $this->service = $service; + $this->validate = $validate; + } + + #[OA\Get(path: '/produce/hardware-fault-description', summary: '硬件故障描述列表', tags: ['produce-hardware-fault-description'])] + #[Permission(code: 'produce:hardware-fault-description:list', description: '硬件故障描述列表')] + #[PageResponse(schema: [], example: [])] + public function index(Request $request): \support\Response { return parent::index($request); } + + #[OA\Post(path: '/produce/hardware-fault-description/import', summary: '导入硬件故障描述', tags: ['produce-hardware-fault-description'])] + #[Permission(code: 'produce:hardware-fault-description:import', description: '导入硬件故障描述')] + #[SimpleResponse(schema: [], example: [])] + public function import(Request $request): \support\Response + { + try { + $file = $request->file('file'); + if (!$file) { + return Json::fail('请选择Excel文件'); + } + if ($file->getSize() > 5 * 1024 * 1024) { + return Json::fail('Excel文件不能超过5MB'); + } + $extension = strtolower((string) $file->getUploadExtension()); + if (!in_array($extension, ['xlsx', 'xls', 'csv'], true)) { + return Json::fail('只支持xlsx、xls或csv格式文件'); + } + + $result = $this->service->importFromExcel($file->getPathname()); + return Json::success('导入成功', $result); + } catch (\Throwable $e) { + return Json::fail($e->getMessage()); + } + } + + #[OA\Get(path: '/produce/hardware-fault-description/{id}', summary: '硬件故障描述详情', tags: ['produce-hardware-fault-description'], x: [SchemaConstants::X_PROPERTY_IN => 'id', SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class])] + #[Permission(code: 'produce:hardware-fault-description:read', description: '硬件故障描述详情')] + #[SimpleResponse(schema: [], example: [])] + public function show(Request $request): \support\Response { return parent::show($request); } + + #[OA\Post(path: '/produce/hardware-fault-description', summary: '创建硬件故障描述', tags: ['produce-hardware-fault-description'])] + #[Permission(code: 'produce:hardware-fault-description:create', description: '创建硬件故障描述')] + #[SimpleResponse(schema: [], example: [])] + public function store(Request $request): \support\Response { return parent::store($request); } + + #[OA\Put(path: '/produce/hardware-fault-description/{id}', summary: '更新硬件故障描述', tags: ['produce-hardware-fault-description'], x: [SchemaConstants::X_PROPERTY_IN => 'id', SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class])] + #[Permission(code: 'produce:hardware-fault-description:update', description: '更新硬件故障描述')] + #[SimpleResponse(schema: [], example: [])] + public function update(Request $request): \support\Response { return parent::update($request); } + + #[OA\Delete(path: '/produce/hardware-fault-description/{id}', summary: '删除硬件故障描述', tags: ['produce-hardware-fault-description'], x: [SchemaConstants::X_PROPERTY_IN => 'id', SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class])] + #[Permission(code: 'produce:hardware-fault-description:delete', description: '删除硬件故障描述')] + #[SimpleResponse(schema: [], example: [])] + public function destroy(Request $request): \support\Response { return parent::destroy($request); } + + #[OA\Delete(path: '/produce/hardware-fault-description', summary: '批量删除硬件故障描述', tags: ['produce-hardware-fault-description'], x: [SchemaConstants::X_SCHEMA_REQUEST => BatchDeleteRequest::class])] + #[Permission(code: 'produce:hardware-fault-description:delete', description: '批量删除硬件故障描述')] + #[SimpleResponse(schema: [], example: [])] + public function batchDelete(Request $request): \support\Response { return parent::destroy($request); } +} diff --git a/backend/plugin/produce/app/adminapi/controller/MaterialCategoryController.php b/backend/plugin/produce/app/adminapi/controller/MaterialCategoryController.php new file mode 100644 index 0000000..ad1773b --- /dev/null +++ b/backend/plugin/produce/app/adminapi/controller/MaterialCategoryController.php @@ -0,0 +1,65 @@ + true, + 'keyword_fields' => ['category_name'], + ]; + + public function __construct(MaterialCategoryService $service, MaterialCategoryValidate $validate) + { + $this->service = $service; + $this->validate = $validate; + } + + #[OA\Get(path: '/produce/material-category', summary: '物料分类列表', tags: ['produce-material-category'])] + #[Permission(code: 'produce:material-category:list', description: '物料分类列表')] + #[PageResponse(schema: [], example: [])] + public function index(Request $request): \support\Response { return parent::index($request); } + + #[OA\Get(path: '/produce/material-category/{id}', summary: '物料分类详情', tags: ['produce-material-category'], x: [SchemaConstants::X_PROPERTY_IN => 'id', SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class])] + #[Permission(code: 'produce:material-category:read', description: '物料分类详情')] + #[SimpleResponse(schema: [], example: [])] + public function show(Request $request): \support\Response { return parent::show($request); } + + #[OA\Post(path: '/produce/material-category', summary: '创建物料分类', tags: ['produce-material-category'])] + #[Permission(code: 'produce:material-category:create', description: '创建物料分类')] + #[SimpleResponse(schema: [], example: [])] + public function store(Request $request): \support\Response { return parent::store($request); } + + #[OA\Put(path: '/produce/material-category/{id}', summary: '更新物料分类', tags: ['produce-material-category'], x: [SchemaConstants::X_PROPERTY_IN => 'id', SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class])] + #[Permission(code: 'produce:material-category:update', description: '更新物料分类')] + #[SimpleResponse(schema: [], example: [])] + public function update(Request $request): \support\Response { return parent::update($request); } + + #[OA\Delete(path: '/produce/material-category/{id}', summary: '删除物料分类', tags: ['produce-material-category'], x: [SchemaConstants::X_PROPERTY_IN => 'id', SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class])] + #[Permission(code: 'produce:material-category:delete', description: '删除物料分类')] + #[SimpleResponse(schema: [], example: [])] + public function destroy(Request $request): \support\Response { return parent::destroy($request); } + + #[OA\Delete(path: '/produce/material-category', summary: '批量删除物料分类', tags: ['produce-material-category'], x: [SchemaConstants::X_SCHEMA_REQUEST => BatchDeleteRequest::class])] + #[Permission(code: 'produce:material-category:delete', description: '批量删除物料分类')] + #[SimpleResponse(schema: [], example: [])] + public function batchDelete(Request $request): \support\Response { return parent::destroy($request); } +} diff --git a/backend/plugin/produce/app/adminapi/controller/MaterialController.php b/backend/plugin/produce/app/adminapi/controller/MaterialController.php new file mode 100644 index 0000000..3367f24 --- /dev/null +++ b/backend/plugin/produce/app/adminapi/controller/MaterialController.php @@ -0,0 +1,96 @@ + true, + 'keyword_fields' => ['product_code', 'product_name'], + ]; + + public function __construct(MaterialService $service, MaterialValidate $validate) + { + $this->service = $service; + $this->validate = $validate; + } + + #[OA\Get(path: '/produce/material', summary: '物料列表', tags: ['produce-material'])] + #[Permission(code: 'produce:material:list', description: '物料列表')] + #[PageResponse(schema: [], example: [])] + public function index(Request $request): \support\Response { return parent::index($request); } + + #[OA\Post(path: '/produce/material/import', summary: '导入物料', tags: ['produce-material'])] + #[Permission(code: 'produce:material:import', description: '导入物料')] + #[SimpleResponse(schema: [], example: [])] + public function import(Request $request): \support\Response + { + try { + $file = $request->file('file'); + if (!$file) { + return Json::fail('请选择Excel文件'); + } + if ($file->getSize() > 5 * 1024 * 1024) { + return Json::fail('Excel文件不能超过5MB'); + } + $extension = strtolower((string) $file->getUploadExtension()); + if (!in_array($extension, ['xlsx', 'xls', 'csv'], true)) { + return Json::fail('只支持xlsx、xls或csv格式文件'); + } + + $result = $this->service->importFromExcel($file->getPathname()); + return Json::success('导入成功', $result); + } catch (\Throwable $e) { + return Json::fail($e->getMessage()); + } + } + + #[OA\Get(path: '/produce/material/{id}', summary: '物料详情', tags: ['produce-material'], x: [SchemaConstants::X_PROPERTY_IN => 'id', SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class])] + #[Permission(code: 'produce:material:read', description: '物料详情')] + #[SimpleResponse(schema: [], example: [])] + public function show(Request $request): \support\Response { return parent::show($request); } + + #[OA\Post(path: '/produce/material', summary: '创建物料', tags: ['produce-material'])] + #[Permission(code: 'produce:material:create', description: '创建物料')] + #[SimpleResponse(schema: [], example: [])] + public function store(Request $request): \support\Response { return parent::store($request); } + + #[OA\Put(path: '/produce/material/{id}', summary: '更新物料', tags: ['produce-material'], x: [SchemaConstants::X_PROPERTY_IN => 'id', SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class])] + #[Permission(code: 'produce:material:update', description: '更新物料')] + #[SimpleResponse(schema: [], example: [])] + public function update(Request $request): \support\Response { return parent::update($request); } + + #[OA\Post(path: '/produce/material/export', summary: '导出物料', tags: ['produce-material'])] + #[Permission(code: 'produce:material:list', description: '导出物料')] + #[SimpleResponse(schema: [], example: [])] + public function export(Request $request): \support\Response { return parent::export($request); } + + #[OA\Delete(path: '/produce/material/{id}', summary: '删除物料', tags: ['produce-material'], x: [SchemaConstants::X_PROPERTY_IN => 'id', SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class])] + #[Permission(code: 'produce:material:delete', description: '删除物料')] + #[SimpleResponse(schema: [], example: [])] + public function destroy(Request $request): \support\Response { return parent::destroy($request); } + + #[OA\Delete(path: '/produce/material', summary: '批量删除物料', tags: ['produce-material'], x: [SchemaConstants::X_SCHEMA_REQUEST => BatchDeleteRequest::class])] + #[Permission(code: 'produce:material:delete', description: '批量删除物料')] + #[SimpleResponse(schema: [], example: [])] + public function batchDelete(Request $request): \support\Response { return parent::destroy($request); } +} diff --git a/backend/plugin/produce/app/adminapi/controller/ProcessController.php b/backend/plugin/produce/app/adminapi/controller/ProcessController.php new file mode 100644 index 0000000..5147ff7 --- /dev/null +++ b/backend/plugin/produce/app/adminapi/controller/ProcessController.php @@ -0,0 +1,115 @@ +service = $service; + $this->validate = $validate; + } + + #[OA\Get(path: '/produce/process', summary: '工序管理列表', tags: ['produce-process'])] + #[Permission(code: 'produce:process:list', description: '工序管理列表')] + #[PageResponse(schema: [], example: [])] + public function index(Request $request): \support\Response + { + return parent::index($request); + } + + #[OA\Get( + path: '/produce/process/{id}', + summary: '工序管理详情', + tags: ['produce-process'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'produce:process:read', description: '工序管理详情')] + #[SimpleResponse(schema: [], example: [])] + public function show(Request $request): \support\Response + { + return parent::show($request); + } + + #[OA\Post(path: '/produce/process', summary: '创建工序', tags: ['produce-process'])] + #[Permission(code: 'produce:process:create', description: '创建工序')] + #[SimpleResponse(schema: [], example: [])] + public function store(Request $request): \support\Response + { + return parent::store($request); + } + + #[OA\Put( + path: '/produce/process/{id}', + summary: '更新工序', + tags: ['produce-process'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'produce:process:update', description: '更新工序')] + #[SimpleResponse(schema: [], example: [])] + public function update(Request $request): \support\Response + { + return parent::update($request); + } + + #[OA\Post(path: '/produce/process/export', summary: '导出工序', tags: ['produce-process'])] + #[Permission(code: 'produce:process:list', description: '导出工序')] + #[SimpleResponse(schema: [], example: [])] + public function export(Request $request): \support\Response + { + return parent::export($request); + } + + #[OA\Delete( + path: '/produce/process/{id}', + summary: '删除工序', + tags: ['produce-process'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'produce:process:delete', description: '删除工序')] + #[SimpleResponse(schema: [], example: [])] + public function destroy(Request $request): \support\Response + { + return parent::destroy($request); + } + + #[OA\Delete( + path: '/produce/process', + summary: '批量删除工序', + tags: ['produce-process'], + x: [SchemaConstants::X_SCHEMA_REQUEST => BatchDeleteRequest::class] + )] + #[Permission(code: 'produce:process:delete', description: '批量删除工序')] + #[SimpleResponse(schema: [], example: [])] + public function batchDelete(Request $request): \support\Response + { + return parent::destroy($request); + } +} diff --git a/backend/plugin/produce/app/adminapi/controller/ProcessStepController.php b/backend/plugin/produce/app/adminapi/controller/ProcessStepController.php new file mode 100644 index 0000000..933b153 --- /dev/null +++ b/backend/plugin/produce/app/adminapi/controller/ProcessStepController.php @@ -0,0 +1,115 @@ +service = $service; + $this->validate = $validate; + } + + #[OA\Get(path: '/produce/process-step', summary: '工序步骤列表', tags: ['produce-process-step'])] + #[Permission(code: 'produce:process-step:list', description: '工序步骤列表')] + #[PageResponse(schema: [], example: [])] + public function index(Request $request): \support\Response + { + return parent::index($request); + } + + #[OA\Get( + path: '/produce/process-step/{id}', + summary: '工序步骤详情', + tags: ['produce-process-step'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'produce:process-step:read', description: '工序步骤详情')] + #[SimpleResponse(schema: [], example: [])] + public function show(Request $request): \support\Response + { + return parent::show($request); + } + + #[OA\Post(path: '/produce/process-step', summary: '创建工序步骤', tags: ['produce-process-step'])] + #[Permission(code: 'produce:process-step:create', description: '创建工序步骤')] + #[SimpleResponse(schema: [], example: [])] + public function store(Request $request): \support\Response + { + return parent::store($request); + } + + #[OA\Put( + path: '/produce/process-step/{id}', + summary: '更新工序步骤', + tags: ['produce-process-step'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'produce:process-step:update', description: '更新工序步骤')] + #[SimpleResponse(schema: [], example: [])] + public function update(Request $request): \support\Response + { + return parent::update($request); + } + + #[OA\Post(path: '/produce/process-step/export', summary: '导出工序步骤', tags: ['produce-process-step'])] + #[Permission(code: 'produce:process-step:list', description: '导出工序步骤')] + #[SimpleResponse(schema: [], example: [])] + public function export(Request $request): \support\Response + { + return parent::export($request); + } + + #[OA\Delete( + path: '/produce/process-step/{id}', + summary: '删除工序步骤', + tags: ['produce-process-step'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'produce:process-step:delete', description: '删除工序步骤')] + #[SimpleResponse(schema: [], example: [])] + public function destroy(Request $request): \support\Response + { + return parent::destroy($request); + } + + #[OA\Delete( + path: '/produce/process-step', + summary: '批量删除工序步骤', + tags: ['produce-process-step'], + x: [SchemaConstants::X_SCHEMA_REQUEST => BatchDeleteRequest::class] + )] + #[Permission(code: 'produce:process-step:delete', description: '批量删除工序步骤')] + #[SimpleResponse(schema: [], example: [])] + public function batchDelete(Request $request): \support\Response + { + return parent::destroy($request); + } +} diff --git a/backend/plugin/produce/app/adminapi/controller/ProduceConfigController.php b/backend/plugin/produce/app/adminapi/controller/ProduceConfigController.php new file mode 100644 index 0000000..1ba8f6c --- /dev/null +++ b/backend/plugin/produce/app/adminapi/controller/ProduceConfigController.php @@ -0,0 +1,60 @@ +input('group_code', ''); + if ($groupCode === '') { + return Json::fail('配置组代码不能为空'); + } + + return Json::success('获取成功', $this->service->getConfigByGroup($groupCode)); + } + + #[OA\Post(path: '/produce/config/save', summary: '保存生产配置', tags: ['produce-config'])] + #[SimpleResponse(description: '保存成功')] + #[Permission(code: 'produce:config:update', description: '保存生产配置')] + public function save(Request $request): Response + { + $payload = $request->post(); + $groupCode = (string) ($payload['group_code'] ?? ''); + $configs = $payload['configs'] ?? []; + + if ($groupCode === '') { + return Json::fail('配置组代码不能为空'); + } + + if (!is_array($configs) || $configs === []) { + return Json::fail('配置数据不能为空'); + } + + $this->service->saveConfig($groupCode, $configs); + + return Json::success('保存成功'); + } +} diff --git a/backend/plugin/produce/app/adminapi/controller/ProduceController.php b/backend/plugin/produce/app/adminapi/controller/ProduceController.php new file mode 100644 index 0000000..5da949c --- /dev/null +++ b/backend/plugin/produce/app/adminapi/controller/ProduceController.php @@ -0,0 +1,82 @@ + true, + 'keyword_fields' => ['process_order_no', 'product_code', 'operator', 'remark'], + ]; + + public function __construct(ProductRecordService $service, ProductRecordValidate $validate) + { + $this->service = $service; + $this->validate = $validate; + } + + #[OA\Get(path: '/produce/product-record', summary: '整机数据列表', tags: ['produce-product-record'])] + #[Permission(code: 'produce:product-record:list', description: '整机数据列表')] + #[PageResponse(schema: [], example: [])] + public function index(Request $request): \support\Response + { + return parent::index($request); + } + + #[OA\Get( + path: '/produce/product-record/{id}', + summary: '整机数据详情', + tags: ['produce-product-record'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'produce:product-record:read', description: '整机数据详情')] + #[SimpleResponse(schema: [], example: [])] + public function show(Request $request): \support\Response + { + return parent::show($request); + } + + #[OA\Post(path: '/produce/product-record', summary: '创建整机数据', tags: ['produce-product-record'])] + #[Permission(code: 'produce:product-record:create', description: '创建整机数据')] + #[SimpleResponse(schema: [], example: [])] + public function store(Request $request): \support\Response + { + return parent::store($request); + } + + #[OA\Put( + path: '/produce/product-record/{id}', + summary: '更新整机数据', + tags: ['produce-product-record'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'produce:product-record:update', description: '更新整机数据')] + #[SimpleResponse(schema: [], example: [])] + public function update(Request $request): \support\Response + { + return parent::update($request); + } + + #[OA\Post(path: '/produce/product-record/export', summary: '导出整机数据', tags: ['produce-product-record'])] + #[Permission(code: 'produce:product-record:list', description: '导出整机数据')] + #[SimpleResponse(schema: [], example: [])] + public function export(Request $request): \support\Response + { + return parent::export($request); + } + + #[OA\Delete( + path: '/produce/product-record/{id}', + summary: '删除整机数据', + tags: ['produce-product-record'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'produce:product-record:delete', description: '删除整机数据')] + #[SimpleResponse(schema: [], example: [])] + public function destroy(Request $request): \support\Response + { + return parent::destroy($request); + } + + #[OA\Delete( + path: '/produce/product-record', + summary: '批量删除整机数据', + tags: ['produce-product-record'], + x: [SchemaConstants::X_SCHEMA_REQUEST => BatchDeleteRequest::class] + )] + #[Permission(code: 'produce:product-record:delete', description: '批量删除整机数据')] + #[SimpleResponse(schema: [], example: [])] + public function batchDelete(Request $request): \support\Response + { + return parent::destroy($request); + } +} diff --git a/backend/plugin/produce/app/adminapi/controller/RepairRecordController.php b/backend/plugin/produce/app/adminapi/controller/RepairRecordController.php new file mode 100644 index 0000000..6ef2cc5 --- /dev/null +++ b/backend/plugin/produce/app/adminapi/controller/RepairRecordController.php @@ -0,0 +1,140 @@ + true, + 'keyword_fields' => ['repair_no', 'order_no', 'product_code', 'product_name', 'fault_description', 'operator', 'remark'], + ]; + + public function __construct(RepairRecordService $service, RepairRecordValidate $validate) + { + $this->service = $service; + $this->validate = $validate; + } + + #[OA\Get(path: '/produce/repair-record', summary: '维修数据列表', tags: ['produce-repair-record'])] + #[Permission(code: 'produce:repair-record:list', description: '维修数据列表')] + #[PageResponse(schema: [], example: [])] + public function index(Request $request): \support\Response + { + try { + [$where, $format, $limit, $field, $order, $page] = $this->selectInput($request); + $methods = [ + 'select' => 'formatSelect', + 'tree' => 'formatTree', + 'table_tree' => 'formatTableTree', + 'normal' => 'formatNormal', + ]; + $order = $order ?: 'repaired_at DESC, id DESC'; + $total = $this->service->getCount($where); + $list = $this->service->selectList($where, $field, $page, $limit, $order, [], false); + return call_user_func([$this, $methods[$format] ?? 'formatNormal'], $list, $total); + } catch (\Throwable $e) { + return Json::fail($e->getMessage()); + } + } + + #[OA\Get(path: '/produce/repair-record/{id}', summary: '维修数据详情', tags: ['produce-repair-record'], x: [SchemaConstants::X_PROPERTY_IN => 'id', SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class])] + #[Permission(code: 'produce:repair-record:read', description: '维修数据详情')] + #[SimpleResponse(schema: [], example: [])] + public function show(Request $request): \support\Response { return parent::show($request); } + + #[OA\Post(path: '/produce/repair-record', summary: '创建维修数据', tags: ['produce-repair-record'])] + #[Permission(code: 'produce:repair-record:create', description: '创建维修数据')] + #[SimpleResponse(schema: [], example: [])] + public function store(Request $request): \support\Response { return parent::store($request); } + + #[OA\Put(path: '/produce/repair-record/{id}', summary: '更新维修数据', tags: ['produce-repair-record'], x: [SchemaConstants::X_PROPERTY_IN => 'id', SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class])] + #[Permission(code: 'produce:repair-record:update', description: '更新维修数据')] + #[SimpleResponse(schema: [], example: [])] + public function update(Request $request): \support\Response { return parent::update($request); } + + protected function expandExportRows(iterable $items): iterable + { + foreach ($items as $item) { + $record = $item->toArray(); + $parts = is_array($record['parts'] ?? null) ? $record['parts'] : []; + + if (!$parts) { + yield $record; + continue; + } + + foreach ($parts as $part) { + $faultDescriptions = is_array($part['fault_descriptions'] ?? null) ? $part['fault_descriptions'] : []; + $record['order_product'] = implode('/', array_filter([(string) ($record['order_no'] ?? ''), (string) ($record['product_code'] ?? '')])); + $record['part_category'] = (string) ($part['category_name'] ?? '-'); + $record['part_code'] = (string) ($part['product_code'] ?? '-'); + $record['part_name'] = (string) ($part['product_name'] ?? '-'); + $record['part_fault'] = implode('、', array_filter(array_map( + static fn (array $fault): string => (string) ($fault['description'] ?? ''), + $faultDescriptions, + ))) ?: '-'; + $record['part_quantity'] = (string) ($part['quantity'] ?? 1); + $record['part_source'] = match ($part['source'] ?? '') { + 'new' => '新料', + 'old', 'after_sale', 'after_sales', 'after-sale' => '售后', + 'repair', 'refurbished' => '返修', + default => (string) ($part['source'] ?? '-'), + }; + yield $record; + } + } + } + + #[OA\Post(path: '/produce/repair-record/export', summary: '导出维修数据', tags: ['produce-repair-record'])] + #[Permission(code: 'produce:repair-record:list', description: '导出维修数据')] + #[SimpleResponse(schema: [], example: [])] + public function export(Request $request): \support\Response + { + return parent::export($request); + } + + #[OA\Delete(path: '/produce/repair-record/{id}', summary: '删除维修数据', tags: ['produce-repair-record'], x: [SchemaConstants::X_PROPERTY_IN => 'id', SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class])] + #[Permission(code: 'produce:repair-record:delete', description: '删除维修数据')] + #[SimpleResponse(schema: [], example: [])] + public function destroy(Request $request): \support\Response + { + try { + $ids = $this->getDeleteIds($request); + if (!$ids) { + return Json::fail('删除参数不能为空'); + } + $this->service->transaction(function () use ($ids) { + foreach ($ids as $id) { + $this->service->deleteRecord($id); + } + }); + return Json::success('ok', $ids); + } catch (\Throwable $e) { + return Json::fail($e->getMessage()); + } + } + + #[OA\Delete(path: '/produce/repair-record', summary: '批量删除维修数据', tags: ['produce-repair-record'], x: [SchemaConstants::X_SCHEMA_REQUEST => BatchDeleteRequest::class])] + #[Permission(code: 'produce:repair-record:delete', description: '批量删除维修数据')] + #[SimpleResponse(schema: [], example: [])] + public function batchDelete(Request $request): \support\Response { return $this->destroy($request); } +} diff --git a/backend/plugin/produce/app/adminapi/controller/RepairSettingController.php b/backend/plugin/produce/app/adminapi/controller/RepairSettingController.php new file mode 100644 index 0000000..6f8d0ec --- /dev/null +++ b/backend/plugin/produce/app/adminapi/controller/RepairSettingController.php @@ -0,0 +1,65 @@ + true, + 'keyword_fields' => ['code', 'name', 'remark'], + ]; + + public function __construct(RepairSettingService $service, RepairSettingValidate $validate) + { + $this->service = $service; + $this->validate = $validate; + } + + #[OA\Get(path: '/produce/repair-setting', summary: '维修设置列表', tags: ['produce-repair-setting'])] + #[Permission(code: 'produce:repair-setting:list', description: '维修设置列表')] + #[PageResponse(schema: [], example: [])] + public function index(Request $request): \support\Response { return parent::index($request); } + + #[OA\Get(path: '/produce/repair-setting/{id}', summary: '维修设置详情', tags: ['produce-repair-setting'], x: [SchemaConstants::X_PROPERTY_IN => 'id', SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class])] + #[Permission(code: 'produce:repair-setting:read', description: '维修设置详情')] + #[SimpleResponse(schema: [], example: [])] + public function show(Request $request): \support\Response { return parent::show($request); } + + #[OA\Post(path: '/produce/repair-setting', summary: '创建维修设置', tags: ['produce-repair-setting'])] + #[Permission(code: 'produce:repair-setting:create', description: '创建维修设置')] + #[SimpleResponse(schema: [], example: [])] + public function store(Request $request): \support\Response { return parent::store($request); } + + #[OA\Put(path: '/produce/repair-setting/{id}', summary: '更新维修设置', tags: ['produce-repair-setting'], x: [SchemaConstants::X_PROPERTY_IN => 'id', SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class])] + #[Permission(code: 'produce:repair-setting:update', description: '更新维修设置')] + #[SimpleResponse(schema: [], example: [])] + public function update(Request $request): \support\Response { return parent::update($request); } + + #[OA\Delete(path: '/produce/repair-setting/{id}', summary: '删除维修设置', tags: ['produce-repair-setting'], x: [SchemaConstants::X_PROPERTY_IN => 'id', SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class])] + #[Permission(code: 'produce:repair-setting:delete', description: '删除维修设置')] + #[SimpleResponse(schema: [], example: [])] + public function destroy(Request $request): \support\Response { return parent::destroy($request); } + + #[OA\Delete(path: '/produce/repair-setting', summary: '批量删除维修设置', tags: ['produce-repair-setting'], x: [SchemaConstants::X_SCHEMA_REQUEST => BatchDeleteRequest::class])] + #[Permission(code: 'produce:repair-setting:delete', description: '批量删除维修设置')] + #[SimpleResponse(schema: [], example: [])] + public function batchDelete(Request $request): \support\Response { return parent::destroy($request); } +} diff --git a/backend/plugin/produce/app/adminapi/controller/ScanDataController.php b/backend/plugin/produce/app/adminapi/controller/ScanDataController.php new file mode 100644 index 0000000..a536404 --- /dev/null +++ b/backend/plugin/produce/app/adminapi/controller/ScanDataController.php @@ -0,0 +1,120 @@ + true, + 'keyword_fields' => ['order_no', 'user_code', 'operator', 'remark'], + ]; + + public function __construct(ScanDataService $service, ScanDataValidate $validate) + { + $this->service = $service; + $this->validate = $validate; + } + + #[OA\Get(path: '/produce/scan-data', summary: '扫码数据列表', tags: ['produce-scan-data'])] + #[Permission(code: 'produce:scan-data:list', description: '扫码数据列表')] + #[PageResponse(schema: [], example: [])] + public function index(Request $request): \support\Response + { + return parent::index($request); + } + + #[OA\Get( + path: '/produce/scan-data/{id}', + summary: '扫码数据详情', + tags: ['produce-scan-data'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'produce:scan-data:read', description: '扫码数据详情')] + #[SimpleResponse(schema: [], example: [])] + public function show(Request $request): \support\Response + { + return parent::show($request); + } + + #[OA\Post(path: '/produce/scan-data', summary: '创建扫码数据', tags: ['produce-scan-data'])] + #[Permission(code: 'produce:scan-data:create', description: '创建扫码数据')] + #[SimpleResponse(schema: [], example: [])] + public function store(Request $request): \support\Response + { + return parent::store($request); + } + + #[OA\Put( + path: '/produce/scan-data/{id}', + summary: '更新扫码数据', + tags: ['produce-scan-data'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'produce:scan-data:update', description: '更新扫码数据')] + #[SimpleResponse(schema: [], example: [])] + public function update(Request $request): \support\Response + { + return parent::update($request); + } + + #[OA\Post(path: '/produce/scan-data/export', summary: '导出扫码数据', tags: ['produce-scan-data'])] + #[Permission(code: 'produce:scan-data:list', description: '导出扫码数据')] + #[SimpleResponse(schema: [], example: [])] + public function export(Request $request): \support\Response + { + return parent::export($request); + } + + #[OA\Delete( + path: '/produce/scan-data/{id}', + summary: '删除扫码数据', + tags: ['produce-scan-data'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'produce:scan-data:delete', description: '删除扫码数据')] + #[SimpleResponse(schema: [], example: [])] + public function destroy(Request $request): \support\Response + { + return parent::destroy($request); + } + + #[OA\Delete( + path: '/produce/scan-data', + summary: '批量删除扫码数据', + tags: ['produce-scan-data'], + x: [SchemaConstants::X_SCHEMA_REQUEST => BatchDeleteRequest::class] + )] + #[Permission(code: 'produce:scan-data:delete', description: '批量删除扫码数据')] + #[SimpleResponse(schema: [], example: [])] + public function batchDelete(Request $request): \support\Response + { + return parent::destroy($request); + } +} diff --git a/backend/plugin/produce/app/adminapi/controller/SpecificRuleController.php b/backend/plugin/produce/app/adminapi/controller/SpecificRuleController.php new file mode 100644 index 0000000..9279887 --- /dev/null +++ b/backend/plugin/produce/app/adminapi/controller/SpecificRuleController.php @@ -0,0 +1,115 @@ +service = $service; + $this->validate = $validate; + } + + #[OA\Get(path: '/produce/specific-rule', summary: '特定规则列表', tags: ['produce-specific-rule'])] + #[Permission(code: 'produce:specific-rule:list', description: '特定规则列表')] + #[PageResponse(schema: [], example: [])] + public function index(Request $request): \support\Response + { + return parent::index($request); + } + + #[OA\Get( + path: '/produce/specific-rule/{id}', + summary: '特定规则详情', + tags: ['produce-specific-rule'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'produce:specific-rule:read', description: '特定规则详情')] + #[SimpleResponse(schema: [], example: [])] + public function show(Request $request): \support\Response + { + return parent::show($request); + } + + #[OA\Post(path: '/produce/specific-rule', summary: '创建特定规则', tags: ['produce-specific-rule'])] + #[Permission(code: 'produce:specific-rule:create', description: '创建特定规则')] + #[SimpleResponse(schema: [], example: [])] + public function store(Request $request): \support\Response + { + return parent::store($request); + } + + #[OA\Put( + path: '/produce/specific-rule/{id}', + summary: '更新特定规则', + tags: ['produce-specific-rule'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'produce:specific-rule:update', description: '更新特定规则')] + #[SimpleResponse(schema: [], example: [])] + public function update(Request $request): \support\Response + { + return parent::update($request); + } + + #[OA\Post(path: '/produce/specific-rule/export', summary: '导出特定规则', tags: ['produce-specific-rule'])] + #[Permission(code: 'produce:specific-rule:list', description: '导出特定规则')] + #[SimpleResponse(schema: [], example: [])] + public function export(Request $request): \support\Response + { + return parent::export($request); + } + + #[OA\Delete( + path: '/produce/specific-rule/{id}', + summary: '删除特定规则', + tags: ['produce-specific-rule'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'produce:specific-rule:delete', description: '删除特定规则')] + #[SimpleResponse(schema: [], example: [])] + public function destroy(Request $request): \support\Response + { + return parent::destroy($request); + } + + #[OA\Delete( + path: '/produce/specific-rule', + summary: '批量删除特定规则', + tags: ['produce-specific-rule'], + x: [SchemaConstants::X_SCHEMA_REQUEST => BatchDeleteRequest::class] + )] + #[Permission(code: 'produce:specific-rule:delete', description: '批量删除特定规则')] + #[SimpleResponse(schema: [], example: [])] + public function batchDelete(Request $request): \support\Response + { + return parent::destroy($request); + } +} diff --git a/backend/plugin/produce/app/adminapi/controller/StatusTransitionController.php b/backend/plugin/produce/app/adminapi/controller/StatusTransitionController.php new file mode 100644 index 0000000..0858f08 --- /dev/null +++ b/backend/plugin/produce/app/adminapi/controller/StatusTransitionController.php @@ -0,0 +1,115 @@ +service = $service; + $this->validate = $validate; + } + + #[OA\Get(path: '/produce/status-transition', summary: '状态转换规则列表', tags: ['produce-status-transition'])] + #[Permission(code: 'produce:status-transition:list', description: '状态转换规则列表')] + #[PageResponse(schema: [], example: [])] + public function index(Request $request): \support\Response + { + return parent::index($request); + } + + #[OA\Get( + path: '/produce/status-transition/{id}', + summary: '状态转换规则详情', + tags: ['produce-status-transition'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'produce:status-transition:read', description: '状态转换规则详情')] + #[SimpleResponse(schema: [], example: [])] + public function show(Request $request): \support\Response + { + return parent::show($request); + } + + #[OA\Post(path: '/produce/status-transition', summary: '创建状态转换规则', tags: ['produce-status-transition'])] + #[Permission(code: 'produce:status-transition:create', description: '创建状态转换规则')] + #[SimpleResponse(schema: [], example: [])] + public function store(Request $request): \support\Response + { + return parent::store($request); + } + + #[OA\Put( + path: '/produce/status-transition/{id}', + summary: '更新状态转换规则', + tags: ['produce-status-transition'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'produce:status-transition:update', description: '更新状态转换规则')] + #[SimpleResponse(schema: [], example: [])] + public function update(Request $request): \support\Response + { + return parent::update($request); + } + + #[OA\Post(path: '/produce/status-transition/export', summary: '导出状态转换规则', tags: ['produce-status-transition'])] + #[Permission(code: 'produce:status-transition:list', description: '导出状态转换规则')] + #[SimpleResponse(schema: [], example: [])] + public function export(Request $request): \support\Response + { + return parent::export($request); + } + + #[OA\Delete( + path: '/produce/status-transition/{id}', + summary: '删除状态转换规则', + tags: ['produce-status-transition'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'produce:status-transition:delete', description: '删除状态转换规则')] + #[SimpleResponse(schema: [], example: [])] + public function destroy(Request $request): \support\Response + { + return parent::destroy($request); + } + + #[OA\Delete( + path: '/produce/status-transition', + summary: '批量删除状态转换规则', + tags: ['produce-status-transition'], + x: [SchemaConstants::X_SCHEMA_REQUEST => BatchDeleteRequest::class] + )] + #[Permission(code: 'produce:status-transition:delete', description: '批量删除状态转换规则')] + #[SimpleResponse(schema: [], example: [])] + public function batchDelete(Request $request): \support\Response + { + return parent::destroy($request); + } +} diff --git a/backend/plugin/produce/app/adminapi/controller/StepRelationController.php b/backend/plugin/produce/app/adminapi/controller/StepRelationController.php new file mode 100644 index 0000000..5e82edc --- /dev/null +++ b/backend/plugin/produce/app/adminapi/controller/StepRelationController.php @@ -0,0 +1,115 @@ +service = $service; + $this->validate = $validate; + } + + #[OA\Get(path: '/produce/step-relation', summary: '步骤关系列表', tags: ['produce-step-relation'])] + #[Permission(code: 'produce:step-relation:list', description: '步骤关系列表')] + #[PageResponse(schema: [], example: [])] + public function index(Request $request): \support\Response + { + return parent::index($request); + } + + #[OA\Get( + path: '/produce/step-relation/{id}', + summary: '步骤关系详情', + tags: ['produce-step-relation'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'produce:step-relation:read', description: '步骤关系详情')] + #[SimpleResponse(schema: [], example: [])] + public function show(Request $request): \support\Response + { + return parent::show($request); + } + + #[OA\Post(path: '/produce/step-relation', summary: '创建步骤关系', tags: ['produce-step-relation'])] + #[Permission(code: 'produce:step-relation:create', description: '创建步骤关系')] + #[SimpleResponse(schema: [], example: [])] + public function store(Request $request): \support\Response + { + return parent::store($request); + } + + #[OA\Put( + path: '/produce/step-relation/{id}', + summary: '更新步骤关系', + tags: ['produce-step-relation'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'produce:step-relation:update', description: '更新步骤关系')] + #[SimpleResponse(schema: [], example: [])] + public function update(Request $request): \support\Response + { + return parent::update($request); + } + + #[OA\Post(path: '/produce/step-relation/export', summary: '导出步骤关系', tags: ['produce-step-relation'])] + #[Permission(code: 'produce:step-relation:list', description: '导出步骤关系')] + #[SimpleResponse(schema: [], example: [])] + public function export(Request $request): \support\Response + { + return parent::export($request); + } + + #[OA\Delete( + path: '/produce/step-relation/{id}', + summary: '删除步骤关系', + tags: ['produce-step-relation'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'produce:step-relation:delete', description: '删除步骤关系')] + #[SimpleResponse(schema: [], example: [])] + public function destroy(Request $request): \support\Response + { + return parent::destroy($request); + } + + #[OA\Delete( + path: '/produce/step-relation', + summary: '批量删除步骤关系', + tags: ['produce-step-relation'], + x: [SchemaConstants::X_SCHEMA_REQUEST => BatchDeleteRequest::class] + )] + #[Permission(code: 'produce:step-relation:delete', description: '批量删除步骤关系')] + #[SimpleResponse(schema: [], example: [])] + public function batchDelete(Request $request): \support\Response + { + return parent::destroy($request); + } +} diff --git a/backend/plugin/produce/app/adminapi/controller/StepStatusController.php b/backend/plugin/produce/app/adminapi/controller/StepStatusController.php new file mode 100644 index 0000000..89c3b17 --- /dev/null +++ b/backend/plugin/produce/app/adminapi/controller/StepStatusController.php @@ -0,0 +1,115 @@ +service = $service; + $this->validate = $validate; + } + + #[OA\Get(path: '/produce/step-status', summary: '步骤状态列表', tags: ['produce-step-status'])] + #[Permission(code: 'produce:step-status:list', description: '步骤状态列表')] + #[PageResponse(schema: [], example: [])] + public function index(Request $request): \support\Response + { + return parent::index($request); + } + + #[OA\Get( + path: '/produce/step-status/{id}', + summary: '步骤状态详情', + tags: ['produce-step-status'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'produce:step-status:read', description: '步骤状态详情')] + #[SimpleResponse(schema: [], example: [])] + public function show(Request $request): \support\Response + { + return parent::show($request); + } + + #[OA\Post(path: '/produce/step-status', summary: '创建步骤状态', tags: ['produce-step-status'])] + #[Permission(code: 'produce:step-status:create', description: '创建步骤状态')] + #[SimpleResponse(schema: [], example: [])] + public function store(Request $request): \support\Response + { + return parent::store($request); + } + + #[OA\Put( + path: '/produce/step-status/{id}', + summary: '更新步骤状态', + tags: ['produce-step-status'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'produce:step-status:update', description: '更新步骤状态')] + #[SimpleResponse(schema: [], example: [])] + public function update(Request $request): \support\Response + { + return parent::update($request); + } + + #[OA\Post(path: '/produce/step-status/export', summary: '导出步骤状态', tags: ['produce-step-status'])] + #[Permission(code: 'produce:step-status:list', description: '导出步骤状态')] + #[SimpleResponse(schema: [], example: [])] + public function export(Request $request): \support\Response + { + return parent::export($request); + } + + #[OA\Delete( + path: '/produce/step-status/{id}', + summary: '删除步骤状态', + tags: ['produce-step-status'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'produce:step-status:delete', description: '删除步骤状态')] + #[SimpleResponse(schema: [], example: [])] + public function destroy(Request $request): \support\Response + { + return parent::destroy($request); + } + + #[OA\Delete( + path: '/produce/step-status', + summary: '批量删除步骤状态', + tags: ['produce-step-status'], + x: [SchemaConstants::X_SCHEMA_REQUEST => BatchDeleteRequest::class] + )] + #[Permission(code: 'produce:step-status:delete', description: '批量删除步骤状态')] + #[SimpleResponse(schema: [], example: [])] + public function batchDelete(Request $request): \support\Response + { + return parent::destroy($request); + } +} diff --git a/backend/plugin/produce/app/adminapi/controller/TransitionLogController.php b/backend/plugin/produce/app/adminapi/controller/TransitionLogController.php new file mode 100644 index 0000000..47e093a --- /dev/null +++ b/backend/plugin/produce/app/adminapi/controller/TransitionLogController.php @@ -0,0 +1,59 @@ +service = $service; + } + + #[OA\Get(path: '/produce/transition-log', summary: '转换日志列表', tags: ['produce-transition-log'])] + #[Permission(code: 'produce:transition-log:list', description: '转换日志列表')] + #[PageResponse(schema: [], example: [])] + public function index(Request $request): \support\Response + { + return parent::index($request); + } + + #[OA\Get( + path: '/produce/transition-log/{id}', + summary: '转换日志详情', + tags: ['produce-transition-log'], + x: [ + SchemaConstants::X_PROPERTY_IN => 'id', + SchemaConstants::X_SCHEMA_REQUEST => IdRequest::class, + ] + )] + #[Permission(code: 'produce:transition-log:read', description: '转换日志详情')] + #[SimpleResponse(schema: [], example: [])] + public function show(Request $request): \support\Response + { + return parent::show($request); + } + + #[OA\Post(path: '/produce/transition-log/export', summary: '导出转换日志', tags: ['produce-transition-log'])] + #[Permission(code: 'produce:transition-log:list', description: '导出转换日志')] + #[SimpleResponse(schema: [], example: [])] + public function export(Request $request): \support\Response + { + return parent::export($request); + } +} diff --git a/backend/plugin/produce/app/adminapi/controller/WorkStatisticsController.php b/backend/plugin/produce/app/adminapi/controller/WorkStatisticsController.php new file mode 100644 index 0000000..8e133d2 --- /dev/null +++ b/backend/plugin/produce/app/adminapi/controller/WorkStatisticsController.php @@ -0,0 +1,64 @@ + $this->monthlyColumns((string) $request->input('month', date('Y-m'))), + 'items' => $this->service->monthly($request->all()), + ]); + } + + #[OA\Get(path: '/produce/statistics/daily', summary: '日工作统计', tags: ['produce-statistics'])] + #[DataResponse(description: '获取日工作统计成功')] + #[Permission(code: 'produce:statistics:daily', description: '日工作统计')] + public function daily(Request $request): Response + { + return Json::success('获取成功', [ + 'columns' => $this->dailyColumns(), + 'items' => $this->service->daily($request->all()), + ]); + } + + private function monthlyColumns(string $month): array + { + $month = preg_match('/^\d{4}-\d{2}$/', $month) ? $month : date('Y-m'); + $days = (int) date('t', strtotime($month . '-01')); + return array_map(static fn (int $day): array => [ + 'key' => (string) $day, + 'label' => str_pad((string) $day, 2, '0', STR_PAD_LEFT), + ], range(1, $days)); + } + + private function dailyColumns(): array + { + return array_map(static fn (int $hour): array => [ + 'key' => str_pad((string) $hour, 2, '0', STR_PAD_LEFT) . ':00', + 'label' => str_pad((string) $hour, 2, '0', STR_PAD_LEFT) . ':00', + ], range(0, 23)); + } +} diff --git a/backend/plugin/produce/app/api/controller/.gitkeep b/backend/plugin/produce/app/api/controller/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/backend/plugin/produce/app/api/controller/DataEntryController.php b/backend/plugin/produce/app/api/controller/DataEntryController.php new file mode 100644 index 0000000..867ef5e --- /dev/null +++ b/backend/plugin/produce/app/api/controller/DataEntryController.php @@ -0,0 +1,1698 @@ +validate = $validate; + $this->productRecordValidate = $productRecordValidate; + parent::__construct(); + } + + #[OA\Get(path: '/produce/process', summary: '获取工序下拉', tags: ['produce-web'])] + #[DataResponse(description: '获取成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] + public function processOptions(Request $request): Response + { + $items = Process::query() + ->where('status', 1) + ->orderBy('sort') + ->orderBy('id') + ->get(); + + return $this->formatSelect($items); + } + + #[OA\Get(path: '/produce/process-step', summary: '获取步骤下拉', tags: ['produce-web'])] + #[DataResponse(description: '获取成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] + public function stepOptions(Request $request): Response + { + $processId = (int) $request->input('process_id', 0); + + $query = ProcessStep::query()->where('status', 1); + if ($processId > 0) { + $query->where('process_id', $processId); + } + + $items = $query->orderBy('sort')->orderBy('id')->get(); + return $this->formatSelect($items); + } + + #[OA\Get(path: '/produce/step-status', summary: '获取状态下拉', tags: ['produce-web'])] + #[DataResponse(description: '获取成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] + public function statusOptions(Request $request): Response + { + $stepId = (int) $request->input('step_id', 0); + + $query = StepStatus::query()->where('status', 1); + if ($stepId > 0) { + $query->where('step_id', $stepId); + } + + $items = $query->orderByDesc('is_initial')->orderBy('sort')->orderBy('id')->get(); + return $this->formatSelect($items); + } + + #[OA\Get(path: '/produce/material/lookup', summary: '按商品编码查询物料', tags: ['produce-web'])] + #[DataResponse(description: '获取成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] + public function materialLookup(Request $request): Response + { + $productCode = trim((string) $request->input('product_code', '')); + if ($productCode === '') { + return Json::fail('商品编码不能为空'); + } + + $material = Material::query() + ->with('category:id,category_name') + ->where('product_code', $productCode) + ->first(); + if (!$material) { + return Json::fail('未找到对应物料'); + } + + return Json::success('ok', [ + 'id' => $material->id, + 'category_id' => $material->category_id, + 'category_name' => $material->category_name, + 'product_code' => $material->product_code, + 'product_name' => $material->product_name, + ]); + } + + #[OA\Get(path: '/produce/scanapp/material-category', summary: '获取扫码端物料分类选项', tags: ['produce-web'])] + #[DataResponse(description: '获取成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] + public function scanAppMaterialCategory(Request $request): Response + { + $items = MaterialCategory::query() + ->orderBy('category_name') + ->orderBy('id') + ->get(['id', 'category_name']) + ->map(static fn (MaterialCategory $item): array => [ + 'id' => (string) $item->id, + 'category_name' => (string) $item->category_name, + ]) + ->values() + ->all(); + + return Json::success('获取成功', $items); + } + + #[OA\Get(path: '/produce/hardware-fault-description/options', summary: '按物料分类获取硬件故障描述', tags: ['produce-web'])] + #[DataResponse(description: '获取成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] + public function hardwareFaultDescriptionOptions(Request $request): Response + { + $categoryIds = array_values(array_unique(array_filter(array_map( + 'intval', + explode(',', (string) $request->input('category_ids', '')) + )))); + if ($categoryIds === []) { + return Json::success('获取成功', []); + } + + $items = HardwareFaultDescription::query() + ->whereIn('category_id', $categoryIds) + ->where('is_enabled', 1) + ->orderByDesc('use_count') + ->orderBy('id') + ->get(['id', 'category_id', 'description', 'use_count']) + ->map(static function (HardwareFaultDescription $item): array { + return [ + 'id' => (string) $item->id, + 'category_id' => (string) $item->category_id, + 'description' => (string) $item->description, + 'use_count' => (int) $item->use_count, + ]; + }) + ->values() + ->all(); + + return Json::success('获取成功', $items); + } + + #[OA\Get(path: '/produce/config/info', summary: '获取前台生产配置', tags: ['produce-web'])] + #[DataResponse(description: '获取成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] + public function configInfo(Request $request): Response + { + $groupCode = (string) $request->input('group_code', ''); + if ($groupCode === '') { + return Json::fail('配置组代码不能为空'); + } + + $items = ProduceConfig::query() + ->where('group_code', $groupCode) + ->orderBy('sort') + ->orderBy('id') + ->get(); + + $data = []; + foreach ($items as $item) { + $data[$item->code] = $item->content; + } + + return Json::success('获取成功', $data); + } + + #[OA\Get(path: '/produce/config/data-entry', summary: '获取扫码输入页配置', tags: ['produce-web'])] + #[DataResponse(description: '获取成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] + public function dataEntryConfig(Request $request): Response + { + $processId = (string) $request->input('process_id', ''); + $stepId = (string) $request->input('step_id', ''); + $orderNo = trim((string) $request->input('order_no', '')); + $processOrderNo = trim((string) $request->input('process_order_no', '')); + $productCode = trim((string) $request->input('product_code', '')); + $userCode = trim((string) $request->input('user_code', '')); + $applyMode = trim((string) $request->input('apply_mode', 'order')); + $ruleContext = [ + 'mode' => $applyMode, + 'order_no' => $orderNo, + 'process_order_no' => $processOrderNo, + 'product_code' => $productCode, + 'user_code' => $userCode, + ]; + + $basicSettings = $this->getConfigGroupData('basic_setting'); + $stepRule = null; + if ($stepId !== '') { + $stepRule = ProcessStep::query()->with(['process'])->find($stepId); + } + + $specificRules = SpecificRule::query() + ->where('is_enabled', 1) + ->orderBy('sort') + ->orderBy('id') + ->get() + ->filter(function (SpecificRule $rule) use ($stepId, $ruleContext) { + return $this->matchSpecificRule($rule, $stepId, $ruleContext); + }) + ->values() + ->map(function (SpecificRule $rule) { + return [ + 'id' => $rule->id, + 'rule_name' => $rule->rule_name, + 'rule_pattern' => $rule->rule_pattern, + 'rule_type' => $rule->rule_type, + 'apply_mode' => (string) ($rule->apply_mode ?: 'order'), + 'match_field' => (string) ($rule->match_field ?: 'order_no'), + 'step_ids' => $rule->step_ids ?? [], + 'sort' => $rule->sort, + 'remark' => $rule->remark, + ]; + }); + + return Json::success('获取成功', [ + 'basic_setting' => $basicSettings, + 'step_rule' => $stepRule ? [ + 'id' => $stepRule->id, + 'process_id' => $stepRule->process_id, + 'process_name' => $stepRule->process?->process_name ?? '', + 'step_code' => $stepRule->step_code, + 'step_name' => $stepRule->step_name, + 'prerequisite_steps' => $stepRule->prerequisite_steps ?? [], + 'prerequisite_mode' => $stepRule->prerequisite_mode, + 'prerequisite_require_final' => (int) ($stepRule->prerequisite_require_final ?? 1), + 'allow_repeat_scan' => (int) ($stepRule->allow_repeat_scan ?? 0), + 'repeat_scan_statuses' => $stepRule->repeat_scan_statuses ?? [], + ] : null, + 'specific_rules' => $specificRules, + 'current' => [ + 'process_id' => $processId, + 'step_id' => $stepId, + 'order_no' => $orderNo, + 'process_order_no' => $processOrderNo, + 'product_code' => $productCode, + 'user_code' => $userCode, + 'apply_mode' => $applyMode, + ], + ]); + } + + #[OA\Get(path: '/produce/scan-data', summary: '前台最近扫码记录', tags: ['produce-web'])] + #[DataResponse(description: '获取成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] + public function recentRecords(Request $request): Response + { + $page = max(1, (int) $request->input('page', 1)); + $limit = max(1, min(50, (int) $request->input('limit', 10))); + + $query = ScanData::query()->with(['process', 'step', 'status']); + $this->applyScanDataFilter($query, $request); + + $total = (clone $query)->count(); + $items = $query->orderByDesc('scan_time')->orderByDesc('id') + ->forPage($page, $limit) + ->get(); + + return Json::success('获取成功', compact('items', 'total')); + } + + #[OA\Get(path: '/produce/scan-data/statistics', summary: '前台扫码统计', tags: ['produce-web'])] + #[DataResponse(description: '获取成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] + public function statistics(Request $request): Response + { + $query = ScanData::query(); + $this->applyScanDataFilter($query, $request); + + $todayTotal = (int) (clone $query)->sum('quantity'); + $successTotal = (int) (clone $query)->where('scan_result', 1)->sum('quantity'); + $failedTotal = (int) (clone $query)->where('scan_result', 0)->sum('quantity'); + + return Json::success('获取成功', [ + 'today_total' => $todayTotal, + 'success_total' => $successTotal, + 'failed_total' => $failedTotal, + ]); + } + + #[OA\Get(path: '/produce/scan-data/user-code-stats', summary: '前台用户扫码统计', tags: ['produce-web'])] + #[DataResponse(description: '获取成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] + public function userCodeStats(Request $request): Response + { + $query = ScanData::query() + ->selectRaw('user_code, operator, SUM(quantity) as count'); + $this->applyScanDataFilter($query, $request); + + $items = $query->groupBy('user_code', 'operator') + ->orderByDesc('count') + ->limit(20) + ->get(); + + return Json::success('获取成功', $items); + } + + #[OA\Get(path: '/produce/product-record/recent', summary: '前台最近整机记录', tags: ['produce-web'])] + #[DataResponse(description: '获取成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] + public function productRecentRecords(Request $request): Response + { + $page = max(1, (int) $request->input('page', 1)); + $limit = max(1, min(50, (int) $request->input('limit', 10))); + + $query = ProductRecord::query()->with(['process', 'step', 'status']); + $this->applyProductRecordFilter($query, $request); + + $total = (clone $query)->count(); + $items = $query->orderByDesc('created_at')->orderByDesc('id') + ->forPage($page, $limit) + ->get(); + + return Json::success('获取成功', compact('items', 'total')); + } + + #[OA\Get(path: '/produce/product-record/statistics', summary: '前台整机统计', tags: ['produce-web'])] + #[DataResponse(description: '获取成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] + public function productStatistics(Request $request): Response + { + $query = ProductRecord::query(); + $this->applyProductRecordFilter($query, $request); + + $todayTotal = (int) (clone $query)->sum('quantity'); + $successTotal = (int) (clone $query)->where('scan_result', 1)->sum('quantity'); + $failedTotal = (int) (clone $query)->where('scan_result', 0)->sum('quantity'); + + return Json::success('获取成功', [ + 'today_total' => $todayTotal, + 'success_total' => $successTotal, + 'failed_total' => $failedTotal, + ]); + } + + #[OA\Get(path: '/produce/product-record/user-code-stats', summary: '前台整机用户统计', tags: ['produce-web'])] + #[DataResponse(description: '获取成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] + public function productUserCodeStats(Request $request): Response + { + $query = ProductRecord::query() + ->selectRaw('user_code, operator, SUM(quantity) as count'); + $this->applyProductRecordFilter($query, $request); + + $items = $query->groupBy('user_code', 'operator') + ->orderByDesc('count') + ->limit(20) + ->get(); + + return Json::success('获取成功', $items); + } + + #[OA\Get(path: '/produce/member-user/check', summary: '校验用户编码对应会员', tags: ['produce-web'])] + #[DataResponse(description: '获取成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] + public function checkMemberUser(Request $request): Response + { + $userCode = trim((string) $request->input('user_code', '')); + if ($userCode === '') { + return Json::fail('用户编码不能为空'); + } + + $member = Member::query() + ->where('username', $userCode) + ->first(['id', 'username', 'nickname']); + + if (!$member) { + return Json::fail('用户编码不存在'); + } + + return Json::success('校验成功', [ + 'id' => (int) $member->id, + 'username' => (string) $member->username, + 'nickname' => (string) ($member->nickname ?: $member->username), + ]); + } + + #[OA\Post(path: '/produce/scan-data/record', summary: '前台提交扫码记录', tags: ['produce-web'])] + #[SimpleResponse(description: '录入成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] + public function record(Request $request): Response + { + $data = $request->post(); + if (!$this->validate->scene('store')->check($data)) { + return Json::fail($this->validate->getError()); + } + + $userCode = trim((string) ($data['user_code'] ?? '')); + $member = Member::query() + ->where('username', $userCode) + ->first(); + + if (!$member) { + return Json::fail('用户编码不存在'); + } + + $processId = (string) ($data['process_id'] ?? ''); + $stepId = (string) ($data['step_id'] ?? ''); + $statusId = $data['status_id'] ?? null; + if (empty($statusId)) { + $statusId = StepStatus::query() + ->where('step_id', $stepId) + ->where('is_initial', 1) + ->value('id'); + } + + $entryMode = (string) ($data['entry_mode'] ?? 'order'); + $prerequisiteError = $this->validatePrerequisiteSteps( + $stepId, + (string) $data['order_no'] + ); + if ($prerequisiteError !== null) { + return Json::fail($prerequisiteError); + } + + // 一单多机仅增加按数量重复录入的能力,仍须遵守原有步骤规则。 + if ($entryMode !== 'multi_machine') { + $duplicateError = $this->validateRepeatScan( + $processId, + $stepId, + (string) $data['order_no'] + ); + if ($duplicateError !== null) { + return Json::fail($duplicateError); + } + } + + $quantity = max(1, (int) ($data['quantity'] ?? 1)); + $now = time(); + $result = Db::transaction(function () use ($data, $quantity, $userCode, $member, $processId, $stepId, $statusId, $request, $now) { + $quantityError = $this->validateOrderStepQuantity( + (string) $data['order_no'], + $processId, + $stepId, + $quantity, + (int) $data['scan_result'] === 1 + ); + if ($quantityError !== null) { + return ['error' => $quantityError]; + } + + $scanData = ScanData::query()->create([ + 'order_no' => (string) $data['order_no'], + 'quantity' => $quantity, + 'user_code' => $userCode, + 'operator' => (string) ($member->nickname ?: $member->username), + 'operator_id' => (int) $member->id, + 'process_id' => $processId === '' ? null : $processId, + 'step_id' => $stepId === '' ? null : $stepId, + 'status_id' => $statusId ? (int) $statusId : null, + 'scan_result' => (int) $data['scan_result'], + 'scan_time' => $now, + 'remark' => (string) ($data['remark'] ?? ''), + ]); + + $this->handleNextStepTransitions($scanData, $request, $member, $now); + + return ['model' => $scanData]; + }); + + if (isset($result['error'])) { + return Json::fail($result['error']); + } + + return Json::success('录入成功', ['id' => $result['model']->id]); + } + + #[OA\Post(path: '/produce/product-record/record', summary: '前台提交整机记录', tags: ['produce-web'])] + #[SimpleResponse(description: '录入成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] + public function productRecord(Request $request): Response + { + $data = $request->post(); + if (!$this->productRecordValidate?->scene('store')->check($data)) { + return Json::fail($this->productRecordValidate?->getError() ?: '整机录入数据校验失败'); + } + + $userCode = trim((string) ($data['user_code'] ?? '')); + $member = Member::query() + ->where('username', $userCode) + ->first(); + + if (!$member) { + return Json::fail('用户编码不存在'); + } + + $processId = (string) ($data['process_id'] ?? ''); + $stepId = (string) ($data['step_id'] ?? ''); + $statusId = $data['status_id'] ?? null; + if (empty($statusId) && $stepId !== '') { + $statusId = StepStatus::query() + ->where('step_id', $stepId) + ->where('is_initial', 1) + ->value('id'); + } + + $model = Db::transaction(function () use ($data, $userCode, $member, $processId, $stepId, $statusId) { + return ProductRecord::query()->create([ + 'process_order_no' => trim((string) ($data['process_order_no'] ?? '')), + 'product_code' => trim((string) ($data['product_code'] ?? '')), + 'quantity' => max(1, (int) ($data['quantity'] ?? 1)), + 'user_code' => $userCode, + 'operator' => (string) ($member->nickname ?: $member->username), + 'operator_id' => (int) $member->id, + 'process_id' => $processId === '' ? null : $processId, + 'step_id' => $stepId === '' ? null : $stepId, + 'status_id' => $statusId ? (int) $statusId : null, + 'scan_result' => (int) ($data['scan_result'] ?? 1), + 'remark' => (string) ($data['remark'] ?? ''), + ]); + }); + + return Json::success('录入成功', ['id' => $model->id]); + } + + #[OA\Get(path: '/produce/exception/settings', summary: '获取异常设置', tags: ['produce-web'])] + #[DataResponse(description: '获取成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] + public function exceptionSettings(Request $request): Response + { + $startAt = time() - 30 * 24 * 60 * 60; + $issueFrequency = ExceptionRecord::query() + ->where('reported_at', '>=', $startAt) + ->whereNotNull('issue_id') + ->selectRaw('issue_id, COUNT(*) AS frequency') + ->groupBy('issue_id') + ->get() + ->mapWithKeys(static function (ExceptionRecord $record): array { + return [(string) $record->issue_id => (int) $record->frequency]; + }) + ->all(); + + $items = ExceptionSetting::query() + ->where('is_enabled', 1) + ->orderBy('setting_type') + ->orderBy('parent_id') + ->orderBy('sort') + ->orderBy('id') + ->get(['id', 'parent_id', 'setting_type', 'code', 'name', 'sort']) + ->map(static function (ExceptionSetting $item) use ($issueFrequency): array { + return [ + 'id' => (string) $item->id, + 'parent_id' => $item->parent_id === null ? null : (string) $item->parent_id, + 'setting_type' => $item->setting_type, + 'code' => $item->code, + 'name' => $item->name, + 'sort' => (int) $item->sort, + 'frequency' => $item->setting_type === 'issue' + ? ($issueFrequency[(string) $item->id] ?? 0) + : 0, + ]; + }) + ->values() + ->all(); + + return Json::success('获取成功', $items); + } + + #[OA\Get(path: '/produce/exception/statistics', summary: '获取异常统计', tags: ['produce-web'])] + #[DataResponse(description: '获取成功')] + public function exceptionStatistics(Request $request): Response + { + $query = ExceptionRecord::query(); + $this->applyExceptionRecordFilter($query, $request); + + return Json::success('获取成功', [ + 'pending' => (clone $query)->where('status', 0)->count(), + 'review' => (clone $query)->where('status', 1)->count(), + 'done' => (clone $query)->where('status', 2)->count(), + ]); + } + + #[OA\Get(path: '/produce/exception/recent', summary: '获取最近异常记录', tags: ['produce-web'])] + #[DataResponse(description: '获取成功')] + public function recentExceptions(Request $request): Response + { + $limit = max(1, min(20, (int) $request->input('limit', 4))); + $query = ExceptionRecord::query(); + $this->applyExceptionRecordFilter($query, $request); + + $items = $query->orderByDesc('reported_at')->orderByDesc('id') + ->limit($limit) + ->get(); + + return Json::success('获取成功', $items); + } + + #[OA\Get(path: '/produce/query/records', summary: '查询生产记录', tags: ['produce-web-query'])] + #[DataResponse(description: '查询成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] + public function queryRecords(Request $request): Response + { + $recordType = trim((string) $request->input('record_type', 'scan')); + $orderNo = trim((string) $request->input('order_no', '')); + $keyword = trim((string) $request->input('keyword', '')); + $userCode = trim((string) $request->input('user_code', '')); + $status = $request->input('status', ''); + $scanResult = $request->input('scan_result', ''); + $page = max(1, (int) $request->input('page', 1)); + $limit = max(1, min(100, (int) $request->input('limit', 20))); + $startAt = $this->parseQueryDate($request->input('start_date')); + $endAt = $this->parseQueryDate($request->input('end_date'), true); + + if (!in_array($recordType, ['scan', 'product', 'exception', 'repair'], true)) { + return Json::fail('查询类型不正确'); + } + + $query = match ($recordType) { + 'scan' => ScanData::query()->with(['process', 'step', 'status']), + 'product' => ProductRecord::query()->with(['process', 'step', 'status']), + 'exception' => ExceptionRecord::query(), + 'repair' => RepairRecord::query()->with('exception'), + }; + + if ($recordType === 'scan') { + $query->when($orderNo !== '', fn ($builder) => $builder->where('order_no', $orderNo)); + $query->when($userCode !== '', fn ($builder) => $builder->where('user_code', $userCode)); + $query->when($status !== '' && $status !== null, fn ($builder) => $builder->where('status_id', (int) $status)); + $query->when($scanResult !== '' && $scanResult !== null, fn ($builder) => $builder->where('scan_result', (int) $scanResult)); + $query->when($keyword !== '', fn ($builder) => $builder->where(function ($nested) use ($keyword) { + $nested->where('order_no', 'like', "%{$keyword}%") + ->orWhere('user_code', 'like', "%{$keyword}%") + ->orWhere('operator', 'like', "%{$keyword}%") + ->orWhere('remark', 'like', "%{$keyword}%"); + })); + $query->when($startAt !== null, fn ($builder) => $builder->where('scan_time', '>=', $startAt)); + $query->when($endAt !== null, fn ($builder) => $builder->where('scan_time', '<=', $endAt)); + $query->orderByDesc('scan_time')->orderByDesc('id'); + } elseif ($recordType === 'product') { + $query->when($orderNo !== '', fn ($builder) => $builder->where('process_order_no', $orderNo)); + $query->when($userCode !== '', fn ($builder) => $builder->where('user_code', $userCode)); + $query->when($status !== '' && $status !== null, fn ($builder) => $builder->where('status_id', (int) $status)); + $query->when($scanResult !== '' && $scanResult !== null, fn ($builder) => $builder->where('scan_result', (int) $scanResult)); + $query->when($keyword !== '', fn ($builder) => $builder->where(function ($nested) use ($keyword) { + $nested->where('process_order_no', 'like', "%{$keyword}%") + ->orWhere('product_code', 'like', "%{$keyword}%") + ->orWhere('user_code', 'like', "%{$keyword}%") + ->orWhere('operator', 'like', "%{$keyword}%") + ->orWhere('remark', 'like', "%{$keyword}%"); + })); + $query->when($startAt !== null, fn ($builder) => $builder->where('created_at', '>=', $startAt)); + $query->when($endAt !== null, fn ($builder) => $builder->where('created_at', '<=', $endAt)); + $query->orderByDesc('created_at')->orderByDesc('id'); + } elseif ($recordType === 'exception') { + $query->when($orderNo !== '', fn ($builder) => $builder->where('order_no', $orderNo)); + $query->when($userCode !== '', fn ($builder) => $builder->where('user_code', $userCode)); + $query->when($status !== '' && $status !== null, fn ($builder) => $builder->where('status', (int) $status)); + $query->when($keyword !== '', fn ($builder) => $builder->where(function ($nested) use ($keyword) { + $nested->where('order_no', 'like', "%{$keyword}%") + ->orWhere('user_code', 'like', "%{$keyword}%") + ->orWhere('reporter', 'like', "%{$keyword}%") + ->orWhere('type_name', 'like', "%{$keyword}%") + ->orWhere('reason_name', 'like', "%{$keyword}%") + ->orWhere('issue_name', 'like', "%{$keyword}%") + ->orWhere('remark', 'like', "%{$keyword}%"); + })); + $query->when($startAt !== null, fn ($builder) => $builder->where('reported_at', '>=', $startAt)); + $query->when($endAt !== null, fn ($builder) => $builder->where('reported_at', '<=', $endAt)); + $query->orderByDesc('reported_at')->orderByDesc('id'); + } else { + $query->when($orderNo !== '', fn ($builder) => $builder->where('order_no', $orderNo)); + $query->when($keyword !== '', fn ($builder) => $builder->where(function ($nested) use ($keyword) { + $nested->where('repair_no', 'like', "%{$keyword}%") + ->orWhere('order_no', 'like', "%{$keyword}%") + ->orWhere('product_code', 'like', "%{$keyword}%") + ->orWhere('product_name', 'like', "%{$keyword}%") + ->orWhere('operator', 'like', "%{$keyword}%") + ->orWhere('remark', 'like', "%{$keyword}%"); + })); + $query->when($startAt !== null, fn ($builder) => $builder->where('repaired_at', '>=', $startAt)); + $query->when($endAt !== null, fn ($builder) => $builder->where('repaired_at', '<=', $endAt)); + $query->orderByDesc('repaired_at')->orderByDesc('id'); + } + + $total = (clone $query)->count(); + $items = $query->forPage($page, $limit)->get()->map(fn ($item): array => $this->formatQueryRecord($recordType, $item))->values()->all(); + + return Json::success('查询成功', compact('items', 'total', 'page', 'limit')); + } + + #[OA\Get(path: '/produce/query/timeline', summary: '查询订单生产时间线', tags: ['produce-web-query'])] + #[DataResponse(description: '查询成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] + public function queryTimeline(Request $request): Response + { + $orderNo = trim((string) $request->input('order_no', '')); + if ($orderNo === '') { + return Json::fail('订单号不能为空'); + } + + $timeline = collect(); + ScanData::query()->with(['process', 'step', 'status'])->where('order_no', $orderNo)->get()->each(function (ScanData $item) use ($timeline): void { + $timeline->push($this->formatTimelineRecord('scan', $item, (int) $item->scan_time)); + }); + ProductRecord::query()->with(['process', 'step', 'status'])->where('process_order_no', $orderNo)->get()->each(function (ProductRecord $item) use ($timeline): void { + $timeline->push($this->formatTimelineRecord('product', $item, (int) $item->created_at)); + }); + ExceptionRecord::query()->where('order_no', $orderNo)->get()->each(function (ExceptionRecord $item) use ($timeline): void { + $timeline->push($this->formatTimelineRecord('exception', $item, (int) $item->reported_at)); + }); + RepairRecord::query()->with('exception')->where('order_no', $orderNo)->get()->each(function (RepairRecord $item) use ($timeline): void { + $timeline->push($this->formatTimelineRecord('repair', $item, (int) $item->repaired_at ?: (int) $item->created_at)); + }); + + $items = $timeline->sortBy(fn (array $item): array => [$item['event_at'], (string) $item['id']])->values()->all(); + + return Json::success('查询成功', [ + 'order_no' => $orderNo, + 'total' => count($items), + 'items' => $items, + ]); + } + + #[OA\Get(path: '/produce/exception/order-check', summary: '校验异常提报单号', tags: ['produce-web'])] + #[DataResponse(description: '校验成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] + public function checkExceptionOrder(Request $request): Response + { + $orderNo = trim((string) $request->input('order_no', '')); + if ($orderNo === '') { + return Json::fail('单号或条码不能为空'); + } + + $reference = $this->findExceptionOrderReference($orderNo); + if ($reference === null) { + return Json::fail('未找到对应订单或整机记录,不能提报异常'); + } + + return Json::success('校验成功', $reference); + } + + #[OA\Get(path: '/produce/repair-record/tasks', summary: '获取待维修任务列表', tags: ['produce-web'])] + #[DataResponse(description: '获取成功')] + public function repairTasks(Request $request): Response + { + $limit = max(1, min(100, (int) $request->input('limit', 50))); + $tasks = ExceptionRecord::query() + ->where('status', 0) + ->orderBy('reported_at') + ->orderBy('id') + ->limit($limit) + ->get(); + + return Json::success('获取成功', $tasks->map(static fn (ExceptionRecord $task): array => [ + 'id' => (string) $task->id, + 'device_no' => (string) $task->order_no, + 'type_name' => (string) $task->type_name, + 'reason_name' => (string) $task->reason_name, + 'issue_name' => (string) ($task->issue_name ?? ''), + 'reporter' => (string) ($task->reporter ?: $task->user_code), + 'user_code' => (string) $task->user_code, + 'reported_date' => $task->reported_date, + 'status' => (int) $task->status, + 'status_name' => $task->status_name, + ])->values()->all()); + } + + #[OA\Get(path: '/produce/repair-record/statistics', summary: '获取维修统计', tags: ['produce-web'])] + #[DataResponse(description: '获取成功')] + public function repairStatistics(Request $request): Response + { + $query = RepairRecord::query(); + $todayStart = strtotime(date('Y-m-d 00:00:00')); + $todayEnd = $todayStart + 86400; + + return Json::success('获取成功', [ + 'pending' => ExceptionRecord::query()->where('status', 0)->count(), + 'processing' => ExceptionRecord::query()->where('status', 1)->count(), + 'completed_today' => (clone $query)->whereBetween('repaired_at', [$todayStart, $todayEnd - 1])->count(), + ]); + } + + #[OA\Get(path: '/produce/exception/repair-task', summary: '获取维修异常任务', tags: ['produce-web'])] + #[DataResponse(description: '获取成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] + public function repairTask(Request $request): Response + { + $deviceNo = trim((string) $request->input('device_no', '')); + if ($deviceNo === '') { + return Json::fail('设备编码或订单号不能为空'); + } + + $task = ExceptionRecord::query() + ->where('order_no', $deviceNo) + ->whereIn('status', [0, 1]) + ->orderByDesc('reported_at') + ->orderByDesc('id') + ->first(); + if (!$task) { + return Json::fail('未找到待维修的异常任务'); + } + + return Json::success('获取成功', [ + 'id' => (string) $task->id, + 'device_no' => (string) $task->order_no, + 'type_name' => (string) $task->type_name, + 'reason_name' => (string) $task->reason_name, + 'issue_name' => (string) ($task->issue_name ?? ''), + 'reporter' => (string) ($task->reporter ?: $task->user_code), + 'user_code' => (string) $task->user_code, + 'reported_date' => $task->reported_date, + 'status_name' => $task->status_name, + ]); + } + + #[OA\Post(path: '/produce/repair-record/record', summary: '提交维修记录', tags: ['produce-web'])] + #[SimpleResponse(description: '提交成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] + public function repairRecord(Request $request, RepairRecordService $repairRecordService): Response + { + $data = $request->post(); + $exceptionId = trim((string) ($data['exception_id'] ?? '')); + $userCode = trim((string) ($data['user_code'] ?? '')); + $repairResult = trim((string) ($data['repair_result'] ?? '')); + $categoryIds = array_values(array_unique(array_filter(array_map(static fn ($id): string => trim((string) $id), (array) ($data['category_ids'] ?? $data['category_id'] ?? [])), static fn (string $id): bool => $id !== ''))); + $parts = $data['parts'] ?? []; + $images = array_values(array_filter((array) ($data['images'] ?? []), static function ($image): bool { + return is_string($image) && preg_match('/^https?:\/\//', $image) === 1; + })); + $operationFaultSteps = $data['operation_fault_steps'] ?? []; + $responsibleOperators = $data['responsible_operators'] ?? []; + + if ($exceptionId === '') { + return Json::fail('请先加载维修任务'); + } + if ($userCode === '') { + return Json::fail('维修人工号不能为空'); + } + if (!in_array($repairResult, ['material_defect', 'operation_defect', 'assembly_mismatch'], true)) { + return Json::fail('请选择有效的维修判定'); + } + if ($repairResult === 'assembly_mismatch' && !$categoryIds) { + return Json::fail('请选择搭配错误分类'); + } + if (!is_array($parts)) { + return Json::fail('更换备件格式不正确'); + } + if (!is_array($operationFaultSteps) || !is_array($responsibleOperators)) { + return Json::fail('作业不良责任信息格式不正确'); + } + + $member = Member::query()->where('username', $userCode)->first(); + if (!$member) { + return Json::fail('用户编码不存在'); + } + + try { + $record = Db::transaction(function () use ($exceptionId, $repairResult, $categoryIds, $parts, $images, $operationFaultSteps, $responsibleOperators, $data, $member, $repairRecordService) { + $exception = ExceptionRecord::query() + ->lockForUpdate() + ->whereKey($exceptionId) + ->whereIn('status', [0, 1]) + ->first(); + if (!$exception) { + throw new \InvalidArgumentException('维修任务不存在或已处理'); + } + + $partSnapshots = []; + $operationFaultStepSnapshots = []; + $responsibleOperatorSnapshots = []; + $primaryFault = null; + if ($repairResult === 'assembly_mismatch') { + $selectedCategories = MaterialCategory::query()->whereIn('id', $categoryIds)->get(['id', 'category_name'])->keyBy('id'); + if ($selectedCategories->count() !== count($categoryIds)) { + throw new \InvalidArgumentException('搭配错误分类不存在或已删除'); + } + } + if ($repairResult === 'operation_defect') { + $scanIds = array_values(array_unique(array_filter(array_merge($operationFaultSteps, $responsibleOperators), static fn ($id): bool => (string) $id !== ''))); + if (!$operationFaultSteps || !$responsibleOperators) { + throw new \InvalidArgumentException('请选择作业不良责任步骤和责任人员'); + } + if (!$scanIds) { + throw new \InvalidArgumentException('作业不良责任信息不能为空'); + } + $scanRecords = ScanData::query() + ->with(['process', 'step']) + ->where('order_no', $exception->order_no) + ->whereIn('id', $scanIds) + ->get() + ->keyBy('id'); + if ($scanRecords->count() !== count($scanIds)) { + throw new \InvalidArgumentException('责任步骤或责任人员不属于当前维修订单'); + } + foreach (array_values(array_unique(array_filter($operationFaultSteps, static fn ($id): bool => (string) $id !== ''))) as $scanId) { + $scan = $scanRecords->get($scanId); + $operationFaultStepSnapshots[] = [ + 'scan_id' => (string) $scan->id, + 'process_id' => (string) $scan->process_id, + 'process_name' => (string) $scan->process_name, + 'step_id' => (string) $scan->step_id, + 'step_name' => (string) $scan->step_name, + ]; + } + foreach (array_values(array_unique(array_filter($responsibleOperators, static fn ($id): bool => (string) $id !== ''))) as $scanId) { + $scan = $scanRecords->get($scanId); + $responsibleOperatorSnapshots[] = [ + 'scan_id' => (string) $scan->id, + 'operator_id' => (string) ($scan->operator_id ?? ''), + 'operator' => (string) $scan->operator, + 'user_code' => (string) $scan->user_code, + 'process_id' => (string) $scan->process_id, + 'process_name' => (string) $scan->process_name, + 'step_id' => (string) $scan->step_id, + 'step_name' => (string) $scan->step_name, + ]; + } + } + foreach ($parts as $part) { + if (!is_array($part)) { + throw new \InvalidArgumentException('更换备件格式不正确'); + } + $productCode = trim((string) ($part['product_code'] ?? $part['code'] ?? '')); + if ($productCode === '') { + throw new \InvalidArgumentException('更换备件商品编码不能为空'); + } + $material = Material::query()->where('product_code', $productCode)->first(); + if (!$material) { + throw new \InvalidArgumentException(sprintf('备件商品编码不存在:%s', $productCode)); + } + $source = trim((string) ($part['source'] ?? 'new')); + if (!in_array($source, ['new', 'after_sales', 'refurbished'], true)) { + throw new \InvalidArgumentException('备件来源不正确'); + } + $quantity = (int) ($part['quantity'] ?? 1); + if ($quantity < 1 || $quantity > 999) { + throw new \InvalidArgumentException('备件数量应在 1 到 999 之间'); + } + $faultIds = array_values(array_unique(array_filter((array) ($part['fault_description_ids'] ?? $part['selected_fault_point_ids'] ?? $part['selectedFaultPointIds'] ?? []), static fn ($id): bool => (string) $id !== ''))); + $faults = collect(); + if ($faultIds) { + $faults = HardwareFaultDescription::query() + ->whereIn('id', $faultIds) + ->where('category_id', $material->category_id) + ->get(['id', 'category_id', 'description']) + ->keyBy('id'); + if ($faults->count() !== count($faultIds)) { + throw new \InvalidArgumentException('备件故障点不存在或与物料分类不匹配'); + } + $primaryFault ??= $faults->first(); + } + $partSnapshots[] = [ + 'product_code' => (string) $material->product_code, + 'product_name' => (string) $material->product_name, + 'category_id' => (string) $material->category_id, + 'category_name' => (string) $material->category_name, + 'source' => $source, + 'quantity' => $quantity, + 'fault_descriptions' => $faults->map(static fn (HardwareFaultDescription $fault): array => [ + 'id' => (string) $fault->id, + 'description' => (string) $fault->description, + ])->values()->all(), + ]; + } + + $now = time(); + $datePrefix = date('Ymd', $now); + $sequence = RepairRecord::query() + ->withTrashed() + ->where('repair_no', 'like', sprintf('RP%s%%', $datePrefix)) + ->lockForUpdate() + ->count() + 1; + if ($sequence > 9999) { + throw new \RuntimeException('当天维修单号已超过9999条,无法生成新的维修单号'); + } + $repairNo = sprintf('RP%s%04d', $datePrefix, $sequence); + $repair = $repairRecordService->save([ + 'repair_no' => $repairNo, + 'exception_id' => (string) $exception->id, + 'exception_reason' => (string) $exception->reason_name, + 'exception_issue' => (string) ($exception->issue_name ?? ''), + 'order_no' => (string) $exception->order_no, + 'category_id' => $repairResult === 'assembly_mismatch' ? $categoryIds[0] : $primaryFault?->category_id, + 'category_ids' => $repairResult === 'assembly_mismatch' ? $categoryIds : null, + 'fault_description_id' => $primaryFault?->id, + 'repair_result' => $repairResult, + 'parts' => $partSnapshots, + 'images' => $images, + 'operation_fault_steps' => $operationFaultStepSnapshots, + 'responsible_operators' => $responsibleOperatorSnapshots, + 'operator' => (string) ($member->nickname ?: $member->username), + 'repaired_at' => $now, + 'remark' => trim((string) ($data['remark'] ?? '')), + ]); + + $exception->fill([ + 'status' => 2, + 'handler' => (string) ($member->nickname ?: $member->username), + 'handler_id' => $member->id, + 'handled_at' => $now, + ])->save(); + + return $repair; + }); + } catch (\Throwable $e) { + return Json::fail($e->getMessage()); + } + + return Json::success('提交成功', ['id' => (string) $record->id, 'repair_no' => $record->repair_no]); + } + + #[OA\Post(path: '/produce/exception/record', summary: '提交异常记录', tags: ['produce-web'])] + #[SimpleResponse(description: '提交成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')] + public function exceptionRecord(Request $request): Response + { + $data = $request->post(); + $orderNo = trim((string) ($data['order_no'] ?? '')); + $userCode = trim((string) ($data['user_code'] ?? '')); + $typeId = (string) ($data['type_id'] ?? ''); + $reasonId = (string) ($data['reason_id'] ?? ''); + $issueId = (string) ($data['issue_id'] ?? ''); + + if ($orderNo === '') { + return Json::fail('单号或条码不能为空'); + } + if ($userCode === '') { + return Json::fail('提报人工号不能为空'); + } + + if ($this->findExceptionOrderReference($orderNo) === null) { + return Json::fail('未找到对应订单或整机记录,不能提报异常'); + } + + $member = Member::query()->where('username', $userCode)->first(); + if (!$member) { + return Json::fail('用户编码不存在'); + } + + $type = ExceptionSetting::query() + ->whereKey($typeId) + ->where('setting_type', 'type') + ->where('is_enabled', 1) + ->first(); + if (!$type) { + return Json::fail('请选择有效的处理类型'); + } + + $reason = ExceptionSetting::query() + ->whereKey($reasonId) + ->where('parent_id', $type->id) + ->where('setting_type', 'reason') + ->where('is_enabled', 1) + ->first(); + if (!$reason) { + return Json::fail('请选择有效的异常原因'); + } + + $issue = null; + if ($issueId !== '') { + $issue = ExceptionSetting::query() + ->whereKey($issueId) + ->where('parent_id', $reason->id) + ->where('setting_type', 'issue') + ->where('is_enabled', 1) + ->first(); + if (!$issue) { + return Json::fail('具体问题与异常原因不匹配'); + } + } + + $images = array_values(array_filter((array) ($data['images'] ?? []), static function ($image): bool { + return is_string($image) && preg_match('/^https?:\/\//', $image) === 1; + })); + $record = ExceptionRecord::query()->create([ + 'order_no' => $orderNo, + 'user_code' => $userCode, + 'reporter' => (string) ($member->nickname ?: $member->username), + 'reporter_id' => (int) $member->id, + 'type_id' => $type->id, + 'type_code' => $type->code, + 'type_name' => $type->name, + 'reason_id' => $reason->id, + 'reason_code' => $reason->code, + 'reason_name' => $reason->name, + 'issue_id' => $issue?->id, + 'issue_code' => $issue?->code, + 'issue_name' => $issue?->name, + 'images' => $images, + 'remark' => trim((string) ($data['remark'] ?? '')), + 'status' => 0, + 'reported_at' => time(), + ]); + + return Json::success('提交成功', ['id' => $record->id]); + } + + /** + * 查找可用于异常提报的订单或整机记录。 + */ + private function findExceptionOrderReference(string $orderNo): ?array + { + $scanData = ScanData::query() + ->where('order_no', $orderNo) + ->orderByDesc('scan_time') + ->first(['id', 'order_no', 'process_id', 'step_id', 'scan_time']); + if ($scanData) { + return [ + 'reference_type' => 'order', + 'reference_name' => '订单记录', + 'reference_id' => (string) $scanData->id, + 'order_no' => (string) $scanData->order_no, + 'process_id' => $scanData->process_id === null ? null : (string) $scanData->process_id, + 'step_id' => $scanData->step_id === null ? null : (string) $scanData->step_id, + ]; + } + + $productRecord = ProductRecord::query() + ->where(function ($query) use ($orderNo) { + $query->where('process_order_no', $orderNo) + ->orWhere('product_code', $orderNo); + }) + ->orderByDesc('created_at') + ->first(['id', 'process_order_no', 'product_code', 'process_id', 'step_id']); + if ($productRecord) { + return [ + 'reference_type' => 'product', + 'reference_name' => '整机记录', + 'reference_id' => (string) $productRecord->id, + 'order_no' => (string) ($productRecord->process_order_no ?: $productRecord->product_code), + 'process_id' => $productRecord->process_id === null ? null : (string) $productRecord->process_id, + 'step_id' => $productRecord->step_id === null ? null : (string) $productRecord->step_id, + ]; + } + + return null; + } + + private function parseQueryDate(mixed $value, bool $endOfDay = false): ?int + { + $date = trim((string) $value); + if ($date === '') { + return null; + } + + try { + $parsed = new \DateTimeImmutable($date); + if ($endOfDay && preg_match('/^\d{4}-\d{2}-\d{2}$/', $date) === 1) { + $parsed = $parsed->setTime(23, 59, 59); + } + return $parsed->getTimestamp(); + } catch (\Throwable) { + return null; + } + } + + private function formatQueryRecord(string $recordType, object $item): array + { + return match ($recordType) { + 'scan' => [ + 'id' => (string) $item->id, + 'record_type' => 'scan', + 'record_type_name' => '扫码记录', + 'order_no' => (string) $item->order_no, + 'product_code' => '', + 'process_name' => (string) $item->process_name, + 'step_name' => (string) $item->step_name, + 'status_name' => (string) $item->status_name, + 'result_name' => (int) $item->scan_result === 1 ? '成功' : '失败', + 'operator' => (string) $item->operator, + 'user_code' => (string) $item->user_code, + 'quantity' => (int) $item->quantity, + 'event_at' => (int) $item->scan_time, + 'event_date' => $item->scan_date, + 'remark' => (string) $item->remark, + ], + 'product' => [ + 'id' => (string) $item->id, + 'record_type' => 'product', + 'record_type_name' => '整机记录', + 'order_no' => (string) $item->process_order_no, + 'product_code' => (string) $item->product_code, + 'process_name' => (string) $item->process_name, + 'step_name' => (string) $item->step_name, + 'status_name' => (string) $item->status_name, + 'result_name' => (int) $item->scan_result === 1 ? '成功' : '失败', + 'operator' => (string) $item->operator, + 'user_code' => (string) $item->user_code, + 'quantity' => (int) $item->quantity, + 'event_at' => (int) $item->created_at, + 'event_date' => $item->created_date, + 'remark' => (string) $item->remark, + ], + 'exception' => [ + 'id' => (string) $item->id, + 'record_type' => 'exception', + 'record_type_name' => '异常提报', + 'order_no' => (string) $item->order_no, + 'product_code' => '', + 'process_name' => '', + 'step_name' => '', + 'status_name' => (string) $item->status_name, + 'result_name' => (string) $item->type_name, + 'operator' => (string) $item->reporter, + 'user_code' => (string) $item->user_code, + 'quantity' => null, + 'exception_reason' => (string) $item->reason_name, + 'exception_content' => (string) $item->issue_name, + 'event_at' => (int) $item->reported_at, + 'event_date' => $item->reported_date, + 'remark' => (string) $item->remark, + ], + default => [ + 'id' => (string) $item->id, + 'record_type' => 'repair', + 'record_type_name' => '维修记录', + 'order_no' => (string) $item->order_no, + 'product_code' => (string) $item->product_code, + 'process_name' => '', + 'step_name' => '', + 'status_name' => '已维修', + 'result_name' => (string) $item->repair_result_name, + 'operator' => (string) $item->operator, + 'user_code' => '', + 'quantity' => null, + 'material_category' => (string) ($item->category_name ?: $item->category_names), + 'fault_description' => (string) ($item->fault_description_name ?: $item->fault_description), + 'event_at' => (int) ($item->repaired_at ?: $item->created_at), + 'event_date' => $item->repaired_date ?: $item->created_date, + 'remark' => (string) $item->remark, + ], + }; + } + + private function formatTimelineRecord(string $recordType, object $item, int $eventAt): array + { + $record = $this->formatQueryRecord($recordType, $item); + $record['event_at'] = $eventAt; + $record['event_date'] = $eventAt > 0 ? date('Y-m-d H:i:s', $eventAt) : null; + return $record; + } + + protected function applyExceptionRecordFilter($query, Request $request): void + { + $userCode = trim((string) $request->input('user_code', '')); + if ($userCode !== '') { + $query->where('user_code', $userCode); + } + } + + protected function applyScanDataFilter($query, Request $request): void + { + $orderNo = trim((string) $request->input('order_no', '')); + $userCode = trim((string) $request->input('user_code', '')); + $processId = (int) $request->input('process_id', 0); + $stepId = (int) $request->input('step_id', 0); + $statusId = (int) $request->input('status_id', 0); + $scanResult = $request->input('scan_result', ''); + + if ($orderNo !== '') { + $query->where('order_no', $orderNo); + } + if ($userCode !== '') { + $query->where('user_code', $userCode); + } + if ($processId > 0) { + $query->where('process_id', $processId); + } + if ($stepId > 0) { + $query->where('step_id', $stepId); + } + if ($statusId > 0) { + $query->where('status_id', $statusId); + } + if ($scanResult !== '' && $scanResult !== null) { + $query->where('scan_result', (int) $scanResult); + } + + $recentOnly = (int) ProduceConfig::query() + ->where('group_code', 'basic_setting') + ->where('code', 'recent_records_today_only') + ->value('content'); + + if ($recentOnly === 1 && $orderNo === '') { + $start = strtotime(date('Y-m-d 00:00:00')); + $end = strtotime(date('Y-m-d 23:59:59')); + $query->whereBetween('scan_time', [$start, $end]); + } + } + + protected function applyProductRecordFilter($query, Request $request): void + { + $processId = (int) $request->input('process_id', 0); + $stepId = (int) $request->input('step_id', 0); + $statusId = (int) $request->input('status_id', 0); + $scanResult = $request->input('scan_result', ''); + + if ($processId > 0) { + $query->where('process_id', $processId); + } + if ($stepId > 0) { + $query->where('step_id', $stepId); + } + if ($statusId > 0) { + $query->where('status_id', $statusId); + } + if ($scanResult !== '' && $scanResult !== null) { + $query->where('scan_result', (int) $scanResult); + } + + $recentOnly = (int) ProduceConfig::query() + ->where('group_code', 'basic_setting') + ->where('code', 'recent_records_today_only') + ->value('content'); + + if ($recentOnly === 1) { + $start = strtotime(date('Y-m-d 00:00:00')); + $end = strtotime(date('Y-m-d 23:59:59')); + $query->whereBetween('created_at', [$start, $end]); + } + } + + protected function getConfigGroupData(string $groupCode): array + { + $items = ProduceConfig::query() + ->where('group_code', $groupCode) + ->orderBy('sort') + ->orderBy('id') + ->get(); + + $data = []; + foreach ($items as $item) { + $data[$item->code] = $item->content; + } + + return $data; + } + + protected function handleNextStepTransitions(ScanData $currentScanData, Request $request, Member $member, int $now): void + { + $previousRelations = \plugin\produce\app\model\StepRelation::query() + ->where('to_step_id', (string) $currentScanData->step_id) + ->where('status', 1) + ->orderBy('priority', 'asc') + ->orderBy('sort', 'asc') + ->orderBy('id', 'asc') + ->get(); + + foreach ($previousRelations as $relation) { + $previousScanData = ScanData::query() + ->where('order_no', (string) $currentScanData->order_no) + ->where('step_id', (string) $relation->from_step_id) + ->orderByDesc('scan_time') + ->orderByDesc('id') + ->first(); + + if (!$previousScanData || empty($previousScanData->status_id)) { + continue; + } + + $transition = StatusTransition::query() + ->where('step_id', (string) $relation->from_step_id) + ->where('from_status_id', (string) $previousScanData->status_id) + ->where('trigger_event', 'next_step_scan') + ->where('auto_trigger', 1) + ->where('status', 1) + ->orderBy('priority', 'desc') + ->orderBy('sort', 'asc') + ->orderBy('id', 'asc') + ->first(); + + if (!$transition) { + continue; + } + + $startedAt = microtime(true); + $fromStatusId = (string) $previousScanData->status_id; + $toStatusId = (string) $transition->to_status_id; + $isSuccess = 1; + $errorMessage = ''; + + try { + $previousScanData->status_id = $transition->to_status_id; + $previousScanData->save(); + } catch (\Throwable $throwable) { + $isSuccess = 0; + $errorMessage = $throwable->getMessage(); + } + + TransitionLog::query()->create([ + 'id' => Snowflake::generate(), + 'work_order_id' => $previousScanData->id, + 'work_order_no' => (string) $currentScanData->order_no, + 'step_id' => (string) $previousScanData->step_id, + 'transition_id' => $transition->id, + 'from_status_id' => $fromStatusId === '' ? null : $fromStatusId, + 'to_status_id' => $toStatusId === '' ? null : $toStatusId, + 'trigger_event' => 'next_step_scan', + 'trigger_data' => [ + 'order_no' => (string) $currentScanData->order_no, + 'user_code' => (string) $currentScanData->user_code, + 'operator' => (string) $currentScanData->operator, + 'operator_id' => (int) ($currentScanData->operator_id ?? 0), + 'process_id' => (string) ($currentScanData->process_id ?? ''), + 'current_scan_data_id' => $currentScanData->id, + 'current_step_id' => (string) $currentScanData->step_id, + 'current_status_id' => (string) ($currentScanData->status_id ?? ''), + 'scan_result' => (int) ($currentScanData->scan_result ?? 0), + 'remark' => (string) ($currentScanData->remark ?? ''), + 'previous_scan_data_id' => $previousScanData->id, + 'previous_step_id' => (string) $previousScanData->step_id, + 'previous_status_id' => $fromStatusId, + 'relation_id' => $relation->id, + 'relation_type' => $relation->relation_type, + ], + 'trigger_user' => (string) ($member->nickname ?: $member->username), + 'trigger_ip' => $request->getRealIp(), + 'is_auto' => 1, + 'is_success' => $isSuccess, + 'error_message' => $errorMessage !== '' ? $errorMessage : null, + 'duration' => (int) round((microtime(true) - $startedAt) * 1000), + 'remark' => '下一工序扫码自动触发状态转换', + 'created_by' => (int) $member->id, + 'created_at' => $now, + ]); + } + } + + /** + * 订单首笔成功记录所在的工序步骤作为数量来源步骤:该步骤可以持续累加; + * 后续每个步骤的成功累计数量不得超过来源步骤的成功累计数量。 + * + * @param bool $isSuccess 失败记录不计入步骤累计数量 + */ + protected function validateOrderStepQuantity( + string $orderNo, + string $processId, + string $stepId, + int $quantity, + bool $isSuccess + ): ?string + { + if (!$isSuccess) { + return null; + } + + // 在事务内锁定该订单既有成功记录,避免并发提交时基于旧累计数量重复放行。 + $records = ScanData::query() + ->where('order_no', $orderNo) + ->where('scan_result', 1) + ->orderBy('scan_time') + ->orderBy('id') + ->lockForUpdate() + ->get(['id', 'quantity', 'process_id', 'step_id']); + + // 首笔成功记录建立数量来源步骤,本次可直接写入。 + if ($records->isEmpty()) { + return null; + } + + $sourceRecord = $records->first(); + $sourceProcessId = (string) $sourceRecord->process_id; + $sourceStepId = (string) $sourceRecord->step_id; + + // 数量来源步骤允许多人、多次持续累加,以其最新累计数量作为后续步骤的上限。 + if ($processId === $sourceProcessId && $stepId === $sourceStepId) { + return null; + } + + $sourceQuantity = (int) $records + ->filter(static function (ScanData $record) use ($sourceProcessId, $sourceStepId) { + return (string) $record->process_id === $sourceProcessId + && (string) $record->step_id === $sourceStepId; + }) + ->sum('quantity'); + $completedQuantity = (int) $records + ->filter(static function (ScanData $record) use ($processId, $stepId) { + return (string) $record->process_id === $processId + && (string) $record->step_id === $stepId; + }) + ->sum('quantity'); + + if ($completedQuantity > $sourceQuantity) { + return sprintf( + '数量来源步骤累计为 %d,当前步骤历史累计已达 %d,存在超报数据,请先由管理员更正后再继续录入', + $sourceQuantity, + $completedQuantity + ); + } + + if ($completedQuantity + $quantity > $sourceQuantity) { + return sprintf( + '数量来源步骤累计为 %d,当前步骤已累计 %d,本次最多可录入 %d', + $sourceQuantity, + $completedQuantity, + $sourceQuantity - $completedQuantity + ); + } + + return null; + } + + protected function validatePrerequisiteSteps(string $stepId, string $orderNo): ?string + { + $stepRule = ProcessStep::query() + ->whereKey((string) $stepId) + ->first(); + if (!$stepRule) { + return null; + } + + $prerequisiteStepIds = is_array($stepRule->prerequisite_steps) ? $stepRule->prerequisite_steps : []; + $prerequisiteMode = (string) ($stepRule->prerequisite_mode ?: 'all'); + $requireFinal = (int) ($stepRule->prerequisite_require_final ?? 1) === 1; + + if ($prerequisiteMode === 'none' || $prerequisiteStepIds === []) { + return null; + } + + $prerequisiteSteps = ProcessStep::query() + ->whereIn('id', $prerequisiteStepIds) + ->get(['id', 'step_name']) + ->keyBy('id'); + + $matchedSteps = []; + $unmatchedNames = []; + + foreach ($prerequisiteStepIds as $prerequisiteStepId) { + $matched = $this->hasSatisfiedPrerequisiteStep((string) $prerequisiteStepId, $orderNo, $requireFinal); + if ($matched) { + $matchedSteps[] = (string) $prerequisiteStepId; + continue; + } + + $unmatchedNames[] = (string) ($prerequisiteSteps->get($prerequisiteStepId)?->step_name ?? ('步骤ID:' . $prerequisiteStepId)); + } + + if ($prerequisiteMode === 'all' && $unmatchedNames !== []) { + return '前置步骤未完成:' . implode('、', $unmatchedNames); + } + + if ($prerequisiteMode === 'any' && $matchedSteps === []) { + return '前置步骤未满足,至少需要完成一个前置步骤'; + } + + return null; + } + + protected function hasSatisfiedPrerequisiteStep(string $stepId, string $orderNo, bool $requireFinal): bool + { + $query = ScanData::query() + ->where('order_no', $orderNo) + ->where('step_id', $stepId) + ->orderByDesc('scan_time') + ->orderByDesc('id'); + + if (!$requireFinal) { + return $query->exists(); + } + + return $query->whereHas('status', function ($builder) { + $builder->where('is_final', 1); + })->exists(); + } + + protected function validateRepeatScan(string $processId, string $stepId, string $orderNo): ?string + { + $latestRecord = ScanData::query() + ->where('order_no', $orderNo) + ->where('process_id', $processId) + ->where('step_id', $stepId) + ->orderByDesc('scan_time') + ->orderByDesc('id') + ->first(); + + if (!$latestRecord) { + return null; + } + + $repeatPolicy = $this->resolveRepeatPolicy($stepId, $orderNo); + if (!$repeatPolicy['allow_repeat']) { + return '当前配置不允许重复扫码'; + } + + $allowedStatuses = array_values(array_filter(array_map('strval', is_array($repeatPolicy['repeat_scan_statuses']) ? $repeatPolicy['repeat_scan_statuses'] : []), static fn ($value) => $value !== '')); + $currentStatusId = (string) ($latestRecord->status_id ?? ''); + if ($allowedStatuses !== [] && ($currentStatusId === '' || !in_array($currentStatusId, $allowedStatuses, true))) { + return '当前状态不允许重复扫码'; + } + + $interval = max(0, (int) $repeatPolicy['repeat_scan_interval']); + if ($interval > 0 && (time() - (int) $latestRecord->scan_time) < $interval) { + return '重复扫码间隔不能小于 ' . $interval . ' 秒'; + } + + return null; + } + + protected function resolveRepeatPolicy(string $stepId, string $orderNo): array + { + $basicSettings = $this->getConfigGroupData('basic_setting'); + $policy = [ + 'allow_repeat' => (int) ($basicSettings['global_allow_repeat'] ?? 0) === 1, + 'repeat_scan_interval' => max(0, (int) ($basicSettings['repeat_scan_interval'] ?? 0)), + 'repeat_scan_statuses' => [], + ]; + + $stepRule = ProcessStep::query() + ->whereKey((string) $stepId) + ->first(); + if ($stepRule) { + $policy['allow_repeat'] = (int) ($stepRule->allow_repeat_scan ?? 0) === 1; + $policy['repeat_scan_statuses'] = is_array($stepRule->repeat_scan_statuses) ? $stepRule->repeat_scan_statuses : []; + } + + $specificRule = SpecificRule::query() + ->where('is_enabled', 1) + ->orderBy('sort') + ->orderBy('id') + ->get() + ->first(function (SpecificRule $rule) use ($stepId, $orderNo) { + return $this->matchSpecificRule($rule, $stepId, [ + 'mode' => 'order', + 'order_no' => $orderNo, + ]); + }); + + if ($specificRule) { + $policy['allow_repeat'] = (int) $specificRule->rule_type === 1; + } + + return $policy; + } + + protected function matchSpecificRule(SpecificRule $rule, string $stepId, array|string $context): bool + { + $ruleStepIds = $rule->step_ids ?? []; + $stepMatched = empty($ruleStepIds) + || in_array((string) $stepId, array_map('strval', $ruleStepIds), true); + + if (!$stepMatched) { + return false; + } + + $normalizedContext = is_array($context) + ? $context + : [ + 'mode' => 'order', + 'order_no' => (string) $context, + ]; + + $ruleMode = (string) ($rule->apply_mode ?: 'order'); + $currentMode = (string) ($normalizedContext['mode'] ?? 'order'); + if ($ruleMode !== 'both' && $ruleMode !== $currentMode) { + return false; + } + + $matchField = (string) ($rule->match_field ?: 'order_no'); + $matchValue = trim((string) ($normalizedContext[$matchField] ?? '')); + + $pattern = (string) $rule->rule_pattern; + if ($pattern === '' || $matchValue === '') { + return false; + } + + return @preg_match('/' . str_replace('/', '\\/', $pattern) . '/', $matchValue) === 1; + } + + protected function initialize(): void + { + } +} diff --git a/backend/plugin/produce/app/appapi/controller/DataEntryController.php b/backend/plugin/produce/app/appapi/controller/DataEntryController.php new file mode 100644 index 0000000..17b6593 --- /dev/null +++ b/backend/plugin/produce/app/appapi/controller/DataEntryController.php @@ -0,0 +1,227 @@ +delegate->processOptions($request); + } + + #[OA\Get(path: '/produce/process-step', summary: 'APP 获取步骤下拉', tags: ['produce-app'])] + #[DataResponse(description: '获取成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: 'APP 公共接口')] + public function stepOptions(Request $request): Response + { + return $this->delegate->stepOptions($request); + } + + #[OA\Get(path: '/produce/step-status', summary: 'APP 获取状态下拉', tags: ['produce-app'])] + #[DataResponse(description: '获取成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: 'APP 公共接口')] + public function statusOptions(Request $request): Response + { + return $this->delegate->statusOptions($request); + } + + #[OA\Get(path: '/produce/material/lookup', summary: 'APP 按商品编码查询物料', tags: ['produce-app'])] + #[DataResponse(description: '获取成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: 'APP 公共接口')] + public function materialLookup(Request $request): Response + { + return $this->delegate->materialLookup($request); + } + + #[OA\Get(path: '/produce/scanapp/material-category', summary: 'APP 获取物料分类选项', tags: ['produce-app'])] + #[DataResponse(description: '获取成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: 'APP 公共接口')] + public function scanAppMaterialCategory(Request $request): Response + { + return $this->delegate->scanAppMaterialCategory($request); + } + + #[OA\Get(path: '/produce/hardware-fault-description/options', summary: 'APP 按物料分类获取硬件故障描述', tags: ['produce-app'])] + #[DataResponse(description: '获取成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: 'APP 公共接口')] + public function hardwareFaultDescriptionOptions(Request $request): Response + { + return $this->delegate->hardwareFaultDescriptionOptions($request); + } + + #[OA\Get(path: '/produce/config/data-entry', summary: 'APP 获取扫码输入页配置', tags: ['produce-app'])] + #[DataResponse(description: '获取成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: 'APP 公共接口')] + public function dataEntryConfig(Request $request): Response + { + return $this->delegate->dataEntryConfig($request); + } + + #[OA\Get(path: '/produce/member-user/check', summary: 'APP 校验用户编码对应会员', tags: ['produce-app'])] + #[DataResponse(description: '获取成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: 'APP 公共接口')] + public function checkMemberUser(Request $request): Response + { + return $this->delegate->checkMemberUser($request); + } + + #[OA\Get(path: '/produce/query/records', summary: 'APP 查询生产记录', tags: ['produce-app'])] + #[DataResponse(description: '查询成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: 'APP 公共接口')] + public function queryRecords(Request $request): Response + { + return $this->delegate->queryRecords($request); + } + + #[OA\Get(path: '/produce/query/timeline', summary: 'APP 查询订单生产时间线', tags: ['produce-app'])] + #[DataResponse(description: '查询成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: 'APP 公共接口')] + public function queryTimeline(Request $request): Response + { + return $this->delegate->queryTimeline($request); + } + + #[OA\Get(path: '/produce/scan-data', summary: 'APP 最近订单扫码记录', tags: ['produce-app'])] + #[DataResponse(description: '获取成功')] + public function recentRecords(Request $request): Response + { + return $this->delegate->recentRecords($request); + } + + #[OA\Get(path: '/produce/scan-data/statistics', summary: 'APP 订单扫码统计', tags: ['produce-app'])] + #[DataResponse(description: '获取成功')] + public function statistics(Request $request): Response + { + return $this->delegate->statistics($request); + } + + #[OA\Get(path: '/produce/scan-data/user-code-stats', summary: 'APP 用户扫码统计', tags: ['produce-app'])] + #[DataResponse(description: '获取成功')] + public function userCodeStats(Request $request): Response + { + return $this->delegate->userCodeStats($request); + } + + #[OA\Post(path: '/produce/scan-data/record', summary: 'APP 提交订单扫码记录', tags: ['produce-app'])] + #[SimpleResponse(description: '录入成功')] + public function record(Request $request): Response + { + return $this->delegate->record($request); + } + + #[OA\Get(path: '/produce/exception/settings', summary: 'APP 获取异常设置', tags: ['produce-app'])] + #[DataResponse(description: '获取成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: 'APP 公共接口')] + public function exceptionSettings(Request $request): Response + { + return $this->delegate->exceptionSettings($request); + } + + #[OA\Get(path: '/produce/exception/statistics', summary: 'APP 获取异常统计', tags: ['produce-app'])] + #[DataResponse(description: '获取成功')] + public function exceptionStatistics(Request $request): Response + { + return $this->delegate->exceptionStatistics($request); + } + + #[OA\Get(path: '/produce/exception/recent', summary: 'APP 获取最近异常记录', tags: ['produce-app'])] + #[DataResponse(description: '获取成功')] + public function recentExceptions(Request $request): Response + { + return $this->delegate->recentExceptions($request); + } + + #[OA\Get(path: '/produce/exception/order-check', summary: 'APP 校验异常提报单号', tags: ['produce-app'])] + #[DataResponse(description: '校验成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: 'APP 公共接口')] + public function checkExceptionOrder(Request $request): Response + { + return $this->delegate->checkExceptionOrder($request); + } + + #[OA\Get(path: '/produce/repair-record/tasks', summary: 'APP 获取待维修任务列表', tags: ['produce-app'])] + #[DataResponse(description: '获取成功')] + public function repairTasks(Request $request): Response + { + return $this->delegate->repairTasks($request); + } + + #[OA\Get(path: '/produce/repair-record/statistics', summary: 'APP 获取维修统计', tags: ['produce-app'])] + #[DataResponse(description: '获取成功')] + public function repairStatistics(Request $request): Response + { + return $this->delegate->repairStatistics($request); + } + + #[OA\Get(path: '/produce/exception/repair-task', summary: 'APP 获取维修异常任务', tags: ['produce-app'])] + #[DataResponse(description: '获取成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: 'APP 公共接口')] + public function repairTask(Request $request): Response + { + return $this->delegate->repairTask($request); + } + + #[OA\Post(path: '/produce/repair-record/record', summary: 'APP 提交维修记录', tags: ['produce-app'])] + #[SimpleResponse(description: '提交成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: 'APP 公共接口')] + public function repairRecord(Request $request, RepairRecordService $repairRecordService): Response + { + return $this->delegate->repairRecord($request, $repairRecordService); + } + + #[OA\Post(path: '/produce/exception/record', summary: 'APP 提交异常记录', tags: ['produce-app'])] + #[SimpleResponse(description: '提交成功')] + #[AllowAnonymous(requireToken: false, requirePermission: false, description: 'APP 公共接口')] + public function exceptionRecord(Request $request): Response + { + return $this->delegate->exceptionRecord($request); + } + + #[OA\Get(path: '/produce/product-record/recent', summary: 'APP 最近整机记录', tags: ['produce-app'])] + #[DataResponse(description: '获取成功')] + public function productRecentRecords(Request $request): Response + { + return $this->delegate->productRecentRecords($request); + } + + #[OA\Get(path: '/produce/product-record/statistics', summary: 'APP 整机统计', tags: ['produce-app'])] + #[DataResponse(description: '获取成功')] + public function productStatistics(Request $request): Response + { + return $this->delegate->productStatistics($request); + } + + #[OA\Get(path: '/produce/product-record/user-code-stats', summary: 'APP 整机用户统计', tags: ['produce-app'])] + #[DataResponse(description: '获取成功')] + public function productUserCodeStats(Request $request): Response + { + return $this->delegate->productUserCodeStats($request); + } + + #[OA\Post(path: '/produce/product-record/record', summary: 'APP 提交整机记录', tags: ['produce-app'])] + #[SimpleResponse(description: '录入成功')] + public function productRecord(Request $request): Response + { + return $this->delegate->productRecord($request); + } +} + diff --git a/backend/plugin/produce/app/dao/.gitkeep b/backend/plugin/produce/app/dao/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/backend/plugin/produce/app/dao/ExceptionRecordDao.php b/backend/plugin/produce/app/dao/ExceptionRecordDao.php new file mode 100644 index 0000000..890ef9a --- /dev/null +++ b/backend/plugin/produce/app/dao/ExceptionRecordDao.php @@ -0,0 +1,72 @@ +query(); + + if (($where['keyword'] ?? '') !== '') { + $keyword = '%' . $where['keyword'] . '%'; + $query->where(function (Builder $builder) use ($keyword) { + $builder->where('order_no', 'like', $keyword) + ->orWhere('user_code', 'like', $keyword) + ->orWhere('reporter', 'like', $keyword) + ->orWhere('type_name', 'like', $keyword) + ->orWhere('reason_name', 'like', $keyword) + ->orWhere('issue_name', 'like', $keyword) + ->orWhere('remark', 'like', $keyword); + }); + } + + foreach (['type_code', 'reason_code', 'issue_code', 'status'] as $field) { + if (($where[$field] ?? '') !== '') { + $query->where($field, $where[$field]); + } + } + + if (!empty($where['reported_at_range']) && is_array($where['reported_at_range']) && count($where['reported_at_range']) === 2) { + $query->whereBetween('reported_at', [ + strtotime((string) $where['reported_at_range'][0] . ' 00:00:00'), + strtotime((string) $where['reported_at_range'][1] . ' 23:59:59'), + ]); + } + + return $query; + } +} diff --git a/backend/plugin/produce/app/dao/ExceptionSettingDao.php b/backend/plugin/produce/app/dao/ExceptionSettingDao.php new file mode 100644 index 0000000..256ef45 --- /dev/null +++ b/backend/plugin/produce/app/dao/ExceptionSettingDao.php @@ -0,0 +1,69 @@ +query(); + + if (($where['keyword'] ?? '') !== '') { + $keyword = '%' . $where['keyword'] . '%'; + $query->where(function (Builder $builder) use ($keyword) { + $builder->where('code', 'like', $keyword) + ->orWhere('name', 'like', $keyword) + ->orWhere('remark', 'like', $keyword); + }); + } + + foreach (['setting_type', 'parent_id', 'is_enabled'] as $field) { + if (($where[$field] ?? '') !== '') { + $query->where($field, $where[$field]); + } + } + + + return $query; + } +} diff --git a/backend/plugin/produce/app/dao/HardwareFaultDescriptionDao.php b/backend/plugin/produce/app/dao/HardwareFaultDescriptionDao.php new file mode 100644 index 0000000..63582fc --- /dev/null +++ b/backend/plugin/produce/app/dao/HardwareFaultDescriptionDao.php @@ -0,0 +1,21 @@ +query(); + + if (($where['keyword'] ?? '') !== '') { + $keyword = '%' . $where['keyword'] . '%'; + $query->where(function (Builder $builder) use ($keyword) { + $builder->where('product_code', 'like', $keyword) + ->orWhere('product_name', 'like', $keyword); + }); + } + if (($where['category_id'] ?? '') !== '') { + $query->where('category_id', $where['category_id']); + } + + return $query; + } +} diff --git a/backend/plugin/produce/app/dao/ProcessDao.php b/backend/plugin/produce/app/dao/ProcessDao.php new file mode 100644 index 0000000..336215a --- /dev/null +++ b/backend/plugin/produce/app/dao/ProcessDao.php @@ -0,0 +1,42 @@ +selectModel($where, $field, $page, $limit, $order, $with, $search, $withoutScopes); + $query->withCount(['steps as step_count']); + + if ($page > 0 && $limit > 0) { + return $query->paginate($limit, ['*'], 'page', $page)->getCollection(); + } + + return $query->get(); + } + + protected function getKeywordFields(): array + { + return ['process_code', 'process_name', 'description']; + } +} diff --git a/backend/plugin/produce/app/dao/ProcessStepDao.php b/backend/plugin/produce/app/dao/ProcessStepDao.php new file mode 100644 index 0000000..5cc5fb1 --- /dev/null +++ b/backend/plugin/produce/app/dao/ProcessStepDao.php @@ -0,0 +1,35 @@ +getModel()::query() + ->where('group_code', $groupCode) + ->orderBy('sort') + ->orderBy('id') + ->get(); + + $result = []; + foreach ($items as $item) { + $result[$item->code] = $item->content; + } + + return $result; + } + + public function batchSave(string $groupCode, array $configs): bool + { + $timestamp = time(); + + foreach ($configs as $config) { + $this->getModel()::query()->updateOrCreate( + [ + 'group_code' => $groupCode, + 'code' => (string) ($config['code'] ?? ''), + ], + [ + 'name' => (string) ($config['name'] ?? ''), + 'content' => is_scalar($config['content'] ?? null) || $config['content'] === null + ? ($config['content'] ?? null) + : json_encode($config['content'], JSON_UNESCAPED_UNICODE), + 'sort' => (int) ($config['sort'] ?? 0), + 'remark' => (string) ($config['remark'] ?? ''), + 'updated_at' => $timestamp, + ] + ); + } + + return true; + } +} diff --git a/backend/plugin/produce/app/dao/ProductRecordDao.php b/backend/plugin/produce/app/dao/ProductRecordDao.php new file mode 100644 index 0000000..e6347d9 --- /dev/null +++ b/backend/plugin/produce/app/dao/ProductRecordDao.php @@ -0,0 +1,76 @@ +query(); + + if (($where['keyword'] ?? '') !== '') { + $query->where(function (Builder $builder) use ($where) { + $keyword = '%' . $where['keyword'] . '%'; + $builder->where('process_order_no', 'like', $keyword) + ->orWhere('product_code', 'like', $keyword) + ->orWhere('operator', 'like', $keyword) + ->orWhere('remark', 'like', $keyword); + }); + } + + if (($where['process_id'] ?? '') !== '') { + $query->where('process_id', $where['process_id']); + } + + if (($where['step_id'] ?? '') !== '') { + $query->where('step_id', $where['step_id']); + } + + if (($where['status_id'] ?? '') !== '') { + $query->where('status_id', $where['status_id']); + } + + if (($where['scan_result'] ?? '') !== '') { + $query->where('scan_result', $where['scan_result']); + } + + if (!empty($where['created_time_range']) && is_array($where['created_time_range']) && count($where['created_time_range']) === 2) { + $query->whereBetween('created_at', [strtotime((string) $where['created_time_range'][0]), strtotime((string) $where['created_time_range'][1])]); + } + + return $query; + } +} diff --git a/backend/plugin/produce/app/dao/RepairRecordDao.php b/backend/plugin/produce/app/dao/RepairRecordDao.php new file mode 100644 index 0000000..175bad6 --- /dev/null +++ b/backend/plugin/produce/app/dao/RepairRecordDao.php @@ -0,0 +1,21 @@ +query(); + + if (($where['keyword'] ?? '') !== '') { + $keyword = '%' . $where['keyword'] . '%'; + $query->where(function (Builder $builder) use ($keyword) { + $builder->where('code', 'like', $keyword) + ->orWhere('name', 'like', $keyword) + ->orWhere('remark', 'like', $keyword); + }); + } + + foreach (['setting_type', 'parent_id', 'is_enabled'] as $field) { + if (($where[$field] ?? '') !== '') { + $query->where($field, $where[$field]); + } + } + + return $query; + } +} diff --git a/backend/plugin/produce/app/dao/ScanDataDao.php b/backend/plugin/produce/app/dao/ScanDataDao.php new file mode 100644 index 0000000..091e050 --- /dev/null +++ b/backend/plugin/produce/app/dao/ScanDataDao.php @@ -0,0 +1,76 @@ +query(); + + if (($where['keyword'] ?? '') !== '') { + $query->where(function (Builder $builder) use ($where) { + $keyword = '%' . $where['keyword'] . '%'; + $builder->where('order_no', 'like', $keyword) + ->orWhere('user_code', 'like', $keyword) + ->orWhere('operator', 'like', $keyword) + ->orWhere('remark', 'like', $keyword); + }); + } + + if (($where['process_id'] ?? '') !== '') { + $query->where('process_id', $where['process_id']); + } + + if (($where['step_id'] ?? '') !== '') { + $query->where('step_id', $where['step_id']); + } + + if (($where['status_id'] ?? '') !== '') { + $query->where('status_id', $where['status_id']); + } + + if (($where['scan_result'] ?? '') !== '') { + $query->where('scan_result', $where['scan_result']); + } + + if (!empty($where['scan_time_range']) && is_array($where['scan_time_range']) && count($where['scan_time_range']) === 2) { + $query->whereBetween('scan_time', [strtotime((string) $where['scan_time_range'][0]), strtotime((string) $where['scan_time_range'][1])]); + } + + return $query; + } +} diff --git a/backend/plugin/produce/app/dao/SpecificRuleDao.php b/backend/plugin/produce/app/dao/SpecificRuleDao.php new file mode 100644 index 0000000..3419973 --- /dev/null +++ b/backend/plugin/produce/app/dao/SpecificRuleDao.php @@ -0,0 +1,70 @@ +query(); + + if (($where['keyword'] ?? '') !== '') { + $query->where(function (Builder $builder) use ($where) { + $keyword = '%' . $where['keyword'] . '%'; + $builder->where('rule_name', 'like', $keyword) + ->orWhere('rule_pattern', 'like', $keyword) + ->orWhere('remark', 'like', $keyword); + }); + } + + if (($where['rule_type'] ?? '') !== '') { + $query->where('rule_type', $where['rule_type']); + } + + if (($where['is_enabled'] ?? '') !== '') { + $query->where('is_enabled', $where['is_enabled']); + } + + return $query; + } +} diff --git a/backend/plugin/produce/app/dao/StatusTransitionDao.php b/backend/plugin/produce/app/dao/StatusTransitionDao.php new file mode 100644 index 0000000..4f4cd30 --- /dev/null +++ b/backend/plugin/produce/app/dao/StatusTransitionDao.php @@ -0,0 +1,115 @@ +where('step_id', $where['step_id']); + } + + if (($where['from_status_id'] ?? '') !== '') { + $query->where('from_status_id', $where['from_status_id']); + } + + if (($where['to_status_id'] ?? '') !== '') { + $query->where('to_status_id', $where['to_status_id']); + } + + if (($where['trigger_event'] ?? '') !== '') { + $query->where('trigger_event', $where['trigger_event']); + } + + return $query; + } + + public function getAutoTransitionsByStep(int|string $stepId, int|string $fromStatusId): array + { + return $this->getModel()::query() + ->where('step_id', $stepId) + ->where('from_status_id', $fromStatusId) + ->where('auto_trigger', 1) + ->where('status', 1) + ->orderBy('priority', 'desc') + ->orderBy('sort', 'asc') + ->with(['toStatus:id,status_name']) + ->get() + ->map(function ($item) { + return [ + 'id' => $item->id, + 'step_id' => $item->step_id, + 'from_status_id' => $item->from_status_id, + 'to_status_id' => $item->to_status_id, + 'to_status_name' => $item->toStatus->status_name ?? '', + 'trigger_event' => $item->trigger_event, + 'event_config' => $item->event_config, + 'priority' => $item->priority, + ]; + }) + ->toArray(); + } + + public function getAutoTransitions(int|string $stepId, int|string $fromStatusId, string $triggerEvent): array + { + return $this->getModel()::query() + ->where('step_id', $stepId) + ->where('from_status_id', $fromStatusId) + ->where('trigger_event', $triggerEvent) + ->where('auto_trigger', 1) + ->where('status', 1) + ->orderBy('priority', 'desc') + ->orderBy('sort', 'asc') + ->with(['toStatus:id,status_name']) + ->get() + ->map(function ($item) { + return [ + 'id' => $item->id, + 'step_id' => $item->step_id, + 'from_status_id' => $item->from_status_id, + 'to_status_id' => $item->to_status_id, + 'to_status_name' => $item->toStatus->status_name ?? '', + 'trigger_event' => $item->trigger_event, + 'event_config' => $item->event_config, + 'priority' => $item->priority, + ]; + }) + ->toArray(); + } +} diff --git a/backend/plugin/produce/app/dao/StepRelationDao.php b/backend/plugin/produce/app/dao/StepRelationDao.php new file mode 100644 index 0000000..f9dede7 --- /dev/null +++ b/backend/plugin/produce/app/dao/StepRelationDao.php @@ -0,0 +1,69 @@ +where('from_step_id', $where['from_step_id']); + } + + if (($where['to_step_id'] ?? '') !== '') { + $query->where('to_step_id', $where['to_step_id']); + } + + if (($where['relation_type'] ?? '') !== '') { + $query->where('relation_type', $where['relation_type']); + } + + return $query; + } + + public function getPreviousSteps(int|string $currentStepId): array + { + return $this->getModel()::query() + ->where('to_step_id', $currentStepId) + ->where('status', 1) + ->orderBy('priority', 'asc') + ->orderBy('sort', 'asc') + ->get(['id', 'from_step_id', 'to_step_id', 'relation_type']) + ->toArray(); + } +} diff --git a/backend/plugin/produce/app/dao/StepStatusDao.php b/backend/plugin/produce/app/dao/StepStatusDao.php new file mode 100644 index 0000000..3c03054 --- /dev/null +++ b/backend/plugin/produce/app/dao/StepStatusDao.php @@ -0,0 +1,35 @@ +where('step_id', $where['step_id']); + } + + if (($where['trigger_event'] ?? '') !== '') { + $query->where('trigger_event', $where['trigger_event']); + } + + if (($where['is_success'] ?? '') !== '') { + $query->where('is_success', $where['is_success']); + } + + return $query; + } +} diff --git a/backend/plugin/produce/app/model/.gitkeep b/backend/plugin/produce/app/model/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/backend/plugin/produce/app/model/BaseModel.php b/backend/plugin/produce/app/model/BaseModel.php new file mode 100644 index 0000000..f635aa0 --- /dev/null +++ b/backend/plugin/produce/app/model/BaseModel.php @@ -0,0 +1,37 @@ +hasOne(Admin::class, 'id', 'created_by')->select('id', 'real_name as created_name'); + } + + public function updateds(): HasOne + { + return $this->hasOne(Admin::class, 'id', 'updated_by')->select('id', 'real_name as updated_name'); + } + + public function getCreatedNameAttribute(): string + { + return $this->createds?->created_name ?? ''; + } + + public function getUpdatedNameAttribute(): string + { + return $this->updateds?->updated_name ?? ''; + } +} diff --git a/backend/plugin/produce/app/model/ExceptionRecord.php b/backend/plugin/produce/app/model/ExceptionRecord.php new file mode 100644 index 0000000..47ba974 --- /dev/null +++ b/backend/plugin/produce/app/model/ExceptionRecord.php @@ -0,0 +1,81 @@ +reported_at)) { + $model->reported_at = time(); + } + }); + } + + protected $fillable = [ + 'id', + 'order_no', + 'user_code', + 'reporter', + 'reporter_id', + 'type_id', + 'type_code', + 'type_name', + 'reason_id', + 'reason_code', + 'reason_name', + 'issue_id', + 'issue_code', + 'issue_name', + 'images', + 'remark', + 'status', + 'handler', + 'handler_id', + 'handled_at', + 'reported_at', + 'created_by', + 'updated_by', + 'created_at', + 'updated_at', + 'deleted_at', + ]; + + protected $casts = [ + 'images' => 'array', + 'status' => 'integer', + 'handled_at' => 'integer', + 'reported_at' => 'integer', + 'created_by' => 'integer', + 'updated_by' => 'integer', + 'created_at' => 'integer', + 'updated_at' => 'integer', + 'deleted_at' => 'integer', + ]; + + public function getReportedDateAttribute(): ?string + { + return $this->reported_at ? date('Y-m-d H:i:s', (int) $this->reported_at) : null; + } + + public function getHandledDateAttribute(): ?string + { + return $this->handled_at ? date('Y-m-d H:i:s', (int) $this->handled_at) : null; + } + + public function getStatusNameAttribute(): string + { + return match ((int) $this->status) { + 1 => '处理中', + 2 => '已处理', + default => '待处理', + }; + } +} diff --git a/backend/plugin/produce/app/model/ExceptionSetting.php b/backend/plugin/produce/app/model/ExceptionSetting.php new file mode 100644 index 0000000..c60e93f --- /dev/null +++ b/backend/plugin/produce/app/model/ExceptionSetting.php @@ -0,0 +1,50 @@ + 'integer', + 'is_enabled' => 'integer', + 'created_by' => 'integer', + 'updated_by' => 'integer', + 'created_at' => 'integer', + 'updated_at' => 'integer', + 'deleted_at' => 'integer', + ]; + + public function parent(): BelongsTo + { + return $this->belongsTo(self::class, 'parent_id', 'id')->withTrashed(); + } + + public function getParentNameAttribute(): string + { + return (string) ($this->parent?->name ?? ''); + } +} diff --git a/backend/plugin/produce/app/model/HardwareFaultDescription.php b/backend/plugin/produce/app/model/HardwareFaultDescription.php new file mode 100644 index 0000000..2e8b50b --- /dev/null +++ b/backend/plugin/produce/app/model/HardwareFaultDescription.php @@ -0,0 +1,39 @@ + 'integer', + 'is_enabled' => 'integer', + 'created_at' => 'integer', + 'updated_at' => 'integer', + 'deleted_at' => 'integer', + ]; + + public function category(): BelongsTo + { + return $this->belongsTo(MaterialCategory::class, 'category_id', 'id')->withTrashed(); + } + + public function getCategoryNameAttribute(): string + { + return (string) ($this->category?->category_name ?? ''); + } +} diff --git a/backend/plugin/produce/app/model/Material.php b/backend/plugin/produce/app/model/Material.php new file mode 100644 index 0000000..51c7d13 --- /dev/null +++ b/backend/plugin/produce/app/model/Material.php @@ -0,0 +1,42 @@ + 'integer', + 'updated_at' => 'integer', + 'deleted_at' => 'integer', + ]; + + public function category(): BelongsTo + { + return $this->belongsTo(MaterialCategory::class, 'category_id', 'id')->withTrashed(); + } + + public function getCategoryNameAttribute(): string + { + return (string) ($this->category?->category_name ?? ''); + } +} diff --git a/backend/plugin/produce/app/model/MaterialCategory.php b/backend/plugin/produce/app/model/MaterialCategory.php new file mode 100644 index 0000000..31cf037 --- /dev/null +++ b/backend/plugin/produce/app/model/MaterialCategory.php @@ -0,0 +1,38 @@ + 'integer', + 'updated_at' => 'integer', + 'deleted_at' => 'integer', + ]; + + public function getNameAttribute(): string + { + return (string) $this->category_name; + } + + public function materials(): HasMany + { + return $this->hasMany(Material::class, 'category_id', 'id'); + } +} diff --git a/backend/plugin/produce/app/model/Process.php b/backend/plugin/produce/app/model/Process.php new file mode 100644 index 0000000..b89ac0f --- /dev/null +++ b/backend/plugin/produce/app/model/Process.php @@ -0,0 +1,46 @@ + 'integer', + 'status' => 'integer', + 'step_count' => 'integer', + 'created_at' => 'integer', + 'updated_at' => 'integer', + 'deleted_at' => 'integer', + ]; + + public function getNameAttribute(): string + { + return (string) $this->process_name; + } + + public function steps(): HasMany + { + return $this->hasMany(ProcessStep::class, 'process_id', 'id'); + } +} diff --git a/backend/plugin/produce/app/model/ProcessStep.php b/backend/plugin/produce/app/model/ProcessStep.php new file mode 100644 index 0000000..cebaadc --- /dev/null +++ b/backend/plugin/produce/app/model/ProcessStep.php @@ -0,0 +1,55 @@ + 'integer', + 'sort' => 'integer', + 'status' => 'integer', + 'prerequisite_steps' => 'array', + 'prerequisite_require_final' => 'integer', + 'allow_repeat_scan' => 'integer', + 'repeat_scan_statuses' => 'array', + 'created_at' => 'integer', + 'updated_at' => 'integer', + 'deleted_at' => 'integer', + ]; + + public function getNameAttribute(): string + { + return (string) $this->step_name; + } + + public function process(): BelongsTo + { + return $this->belongsTo(Process::class, 'process_id', 'id'); + } +} diff --git a/backend/plugin/produce/app/model/ProduceConfig.php b/backend/plugin/produce/app/model/ProduceConfig.php new file mode 100644 index 0000000..e752979 --- /dev/null +++ b/backend/plugin/produce/app/model/ProduceConfig.php @@ -0,0 +1,39 @@ + 'integer', + 'created_by' => 'integer', + 'updated_by' => 'integer', + 'created_at' => 'integer', + 'updated_at' => 'integer', + 'deleted_at' => 'integer', + ]; + + public function getNameAttribute(): string + { + return (string) $this->name; + } +} diff --git a/backend/plugin/produce/app/model/ProductRecord.php b/backend/plugin/produce/app/model/ProductRecord.php new file mode 100644 index 0000000..dc03814 --- /dev/null +++ b/backend/plugin/produce/app/model/ProductRecord.php @@ -0,0 +1,82 @@ + 'integer', + 'scan_result' => 'integer', + 'created_at' => 'integer', + 'updated_at' => 'integer', + 'deleted_at' => 'integer', + ]; + + public function process(): BelongsTo + { + return $this->belongsTo(Process::class, 'process_id', 'id')->withTrashed(); + } + + public function step(): BelongsTo + { + return $this->belongsTo(ProcessStep::class, 'step_id', 'id')->withTrashed(); + } + + public function status(): BelongsTo + { + return $this->belongsTo(StepStatus::class, 'status_id', 'id')->withTrashed(); + } + + public function getProcessNameAttribute(): string + { + return (string) ($this->process?->process_name ?? ''); + } + + public function getStepNameAttribute(): string + { + return (string) ($this->step?->step_name ?? ''); + } + + public function getStatusNameAttribute(): string + { + return (string) ($this->status?->status_name ?? ''); + } + + public function getCreatedDateAttribute(): ?string + { + return $this->created_at ? date('Y-m-d H:i:s', (int) $this->created_at) : null; + } + + public function getUpdatedDateAttribute(): ?string + { + return $this->updated_at ? date('Y-m-d H:i:s', (int) $this->updated_at) : null; + } +} diff --git a/backend/plugin/produce/app/model/RepairRecord.php b/backend/plugin/produce/app/model/RepairRecord.php new file mode 100644 index 0000000..a57aa12 --- /dev/null +++ b/backend/plugin/produce/app/model/RepairRecord.php @@ -0,0 +1,160 @@ + 'array', + 'category_names' => 'array', + 'parts' => 'array', + 'images' => 'array', + 'operation_fault_steps' => 'array', + 'responsible_operators' => 'array', + 'repaired_at' => 'integer', + 'created_at' => 'integer', + 'updated_at' => 'integer', + 'deleted_at' => 'integer', + ]; + + public function category(): BelongsTo + { + return $this->belongsTo(MaterialCategory::class, 'category_id', 'id')->withTrashed(); + } + + public function exception(): BelongsTo + { + return $this->belongsTo(ExceptionRecord::class, 'exception_id', 'id')->withTrashed(); + } + + public function getExceptionTypeNameAttribute(): string + { + return (string) ($this->exception?->type_name ?? ''); + } + + public function faultDescription(): BelongsTo + { + return $this->belongsTo(HardwareFaultDescription::class, 'fault_description_id', 'id')->withTrashed(); + } + + public function getFaultDescriptionNameAttribute(): string + { + return (string) $this->fault_description; + } + + public function getOrderProductAttribute(): string + { + return implode('/', array_filter([(string) $this->order_no, (string) $this->product_code])); + } + + public function getRepairResultNameAttribute(): string + { + return match ($this->repair_result) { + 'material_defect' => '物料不良', + 'operation_defect' => '作业不良', + 'assembly_mismatch' => '搭配错误', + 'process_defect' => '工艺不良', + 'no_defect' => '不良不现', + default => (string) $this->repair_result, + }; + } + + public function getResponsibleOperatorNamesAttribute(): string + { + return implode("\n", array_filter(array_map( + static function (array $snapshot): string { + $step = (string) ($snapshot['step_name'] ?? ''); + $operator = (string) ($snapshot['operator'] ?? $snapshot['user_code'] ?? ''); + return implode('-', array_filter([$step, $operator])); + }, + is_array($this->responsible_operators) ? $this->responsible_operators : [], + ))); + } + + public function getPartCategoryAttribute(): string + { + return $this->formatPartValues(static fn (array $part): string => (string) ($part['category_name'] ?? '')); + } + + public function getPartCodeAttribute(): string + { + return $this->formatPartValues(static fn (array $part): string => (string) ($part['product_code'] ?? '')); + } + + public function getPartNameAttribute(): string + { + return $this->formatPartValues(static fn (array $part): string => (string) ($part['product_name'] ?? '')); + } + + public function getPartFaultAttribute(): string + { + return $this->formatPartValues(static function (array $part): string { + return implode('、', array_filter(array_map( + static fn (array $fault): string => (string) ($fault['description'] ?? ''), + is_array($part['fault_descriptions'] ?? null) ? $part['fault_descriptions'] : [], + ))); + }); + } + + public function getPartQuantityAttribute(): string + { + return $this->formatPartValues(static fn (array $part): string => (string) ($part['quantity'] ?? 1)); + } + + public function getPartSourceAttribute(): string + { + return $this->formatPartValues(static function (array $part): string { + return match ($part['source'] ?? '') { + 'new' => '新料', + 'old', 'after_sale', 'after_sales', 'after-sale' => '售后', + 'repair', 'refurbished' => '返修', + default => (string) ($part['source'] ?? '-'), + }; + }); + } + + private function formatPartValues(callable $callback): string + { + return implode("\n", array_map( + static fn (array $part): string => $callback($part) ?: '-', + is_array($this->parts) ? $this->parts : [], + )); + } + + public function getFaultDescriptionIdsAttribute(): array + { + return $this->fault_description_id ? [$this->fault_description_id] : []; + } + + public function getFaultDescriptionsAttribute(): array + { + return $this->fault_description ? [$this->fault_description] : []; + } + + public function getRepairedDateAttribute(): ?string + { + return $this->repaired_at ? date('Y-m-d H:i:s', (int) $this->repaired_at) : null; + } +} diff --git a/backend/plugin/produce/app/model/RepairSetting.php b/backend/plugin/produce/app/model/RepairSetting.php new file mode 100644 index 0000000..3029bbb --- /dev/null +++ b/backend/plugin/produce/app/model/RepairSetting.php @@ -0,0 +1,50 @@ + 'integer', + 'is_enabled' => 'integer', + 'created_by' => 'integer', + 'updated_by' => 'integer', + 'created_at' => 'integer', + 'updated_at' => 'integer', + 'deleted_at' => 'integer', + ]; + + public function parent(): BelongsTo + { + return $this->belongsTo(self::class, 'parent_id', 'id')->withTrashed(); + } + + public function getParentNameAttribute(): string + { + return (string) ($this->parent?->name ?? ''); + } +} diff --git a/backend/plugin/produce/app/model/ScanData.php b/backend/plugin/produce/app/model/ScanData.php new file mode 100644 index 0000000..e055d69 --- /dev/null +++ b/backend/plugin/produce/app/model/ScanData.php @@ -0,0 +1,88 @@ +scan_time)) { + $model->scan_time = time(); + } + }); + } + + protected $fillable = [ + 'id', + 'order_no', + 'quantity', + 'user_code', + 'operator', + 'operator_id', + 'process_id', + 'step_id', + 'status_id', + 'scan_result', + 'scan_time', + 'remark', + 'created_by', + 'updated_by', + 'created_at', + 'updated_at', + 'deleted_at', + ]; + + protected $casts = [ + 'quantity' => 'integer', + 'scan_result' => 'integer', + 'scan_time' => 'integer', + 'created_at' => 'integer', + 'updated_at' => 'integer', + 'deleted_at' => 'integer', + ]; + + public function process(): BelongsTo + { + return $this->belongsTo(Process::class, 'process_id', 'id')->withTrashed(); + } + + public function step(): BelongsTo + { + return $this->belongsTo(ProcessStep::class, 'step_id', 'id')->withTrashed(); + } + + public function status(): BelongsTo + { + return $this->belongsTo(StepStatus::class, 'status_id', 'id')->withTrashed(); + } + + public function getProcessNameAttribute(): string + { + return (string) ($this->process?->process_name ?? ''); + } + + public function getStepNameAttribute(): string + { + return (string) ($this->step?->step_name ?? ''); + } + + public function getStatusNameAttribute(): string + { + return (string) ($this->status?->status_name ?? ''); + } + + public function getScanDateAttribute(): ?string + { + return $this->scan_time ? date('Y-m-d H:i:s', (int) $this->scan_time) : null; + } +} + diff --git a/backend/plugin/produce/app/model/SpecificRule.php b/backend/plugin/produce/app/model/SpecificRule.php new file mode 100644 index 0000000..71d5fe9 --- /dev/null +++ b/backend/plugin/produce/app/model/SpecificRule.php @@ -0,0 +1,47 @@ + 'integer', + 'is_enabled' => 'integer', + 'step_ids' => 'array', + 'sort' => 'integer', + 'created_by' => 'integer', + 'updated_by' => 'integer', + 'created_at' => 'integer', + 'updated_at' => 'integer', + 'deleted_at' => 'integer', + ]; + + public function getNameAttribute(): string + { + return (string) $this->rule_name; + } +} diff --git a/backend/plugin/produce/app/model/StatusTransition.php b/backend/plugin/produce/app/model/StatusTransition.php new file mode 100644 index 0000000..a3ca886 --- /dev/null +++ b/backend/plugin/produce/app/model/StatusTransition.php @@ -0,0 +1,64 @@ + 'integer', + 'from_status_id' => 'integer', + 'to_status_id' => 'integer', + 'event_config' => 'array', + 'auto_trigger' => 'integer', + 'priority' => 'integer', + 'side_effect_config' => 'array', + 'sort' => 'integer', + 'status' => 'integer', + 'created_at' => 'integer', + 'updated_at' => 'integer', + 'deleted_at' => 'integer', + ]; + + public function step(): BelongsTo + { + return $this->belongsTo(ProcessStep::class, 'step_id', 'id'); + } + + public function fromStatus(): BelongsTo + { + return $this->belongsTo(StepStatus::class, 'from_status_id', 'id'); + } + + public function toStatus(): BelongsTo + { + return $this->belongsTo(StepStatus::class, 'to_status_id', 'id'); + } +} diff --git a/backend/plugin/produce/app/model/StepRelation.php b/backend/plugin/produce/app/model/StepRelation.php new file mode 100644 index 0000000..0a8c613 --- /dev/null +++ b/backend/plugin/produce/app/model/StepRelation.php @@ -0,0 +1,51 @@ + 'integer', + 'to_step_id' => 'integer', + 'flow_condition' => 'array', + 'priority' => 'integer', + 'sort' => 'integer', + 'status' => 'integer', + 'created_at' => 'integer', + 'updated_at' => 'integer', + 'deleted_at' => 'integer', + ]; + + public function fromStep(): BelongsTo + { + return $this->belongsTo(ProcessStep::class, 'from_step_id', 'id'); + } + + public function toStep(): BelongsTo + { + return $this->belongsTo(ProcessStep::class, 'to_step_id', 'id'); + } +} diff --git a/backend/plugin/produce/app/model/StepStatus.php b/backend/plugin/produce/app/model/StepStatus.php new file mode 100644 index 0000000..2dd4991 --- /dev/null +++ b/backend/plugin/produce/app/model/StepStatus.php @@ -0,0 +1,50 @@ + 'integer', + 'is_initial' => 'integer', + 'is_final' => 'integer', + 'sort' => 'integer', + 'status' => 'integer', + 'created_at' => 'integer', + 'updated_at' => 'integer', + 'deleted_at' => 'integer', + ]; + + public function getNameAttribute(): string + { + return (string) $this->status_name; + } + + public function step(): BelongsTo + { + return $this->belongsTo(ProcessStep::class, 'step_id', 'id'); + } +} diff --git a/backend/plugin/produce/app/model/TransitionLog.php b/backend/plugin/produce/app/model/TransitionLog.php new file mode 100644 index 0000000..9504134 --- /dev/null +++ b/backend/plugin/produce/app/model/TransitionLog.php @@ -0,0 +1,72 @@ + 'integer', + 'step_id' => 'integer', + 'transition_id' => 'integer', + 'from_status_id' => 'integer', + 'to_status_id' => 'integer', + 'trigger_data' => 'array', + 'is_auto' => 'integer', + 'is_success' => 'integer', + 'duration' => 'integer', + 'created_at' => 'integer', + 'deleted_at' => 'integer', + ]; + + public function step(): BelongsTo + { + return $this->belongsTo(ProcessStep::class, 'step_id', 'id'); + } + + public function transition(): BelongsTo + { + return $this->belongsTo(StatusTransition::class, 'transition_id', 'id'); + } + + public function fromStatus(): BelongsTo + { + return $this->belongsTo(StepStatus::class, 'from_status_id', 'id'); + } + + public function toStatus(): BelongsTo + { + return $this->belongsTo(StepStatus::class, 'to_status_id', 'id'); + } +} diff --git a/backend/plugin/produce/app/schema/request/.gitkeep b/backend/plugin/produce/app/schema/request/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/backend/plugin/produce/app/schema/response/.gitkeep b/backend/plugin/produce/app/schema/response/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/backend/plugin/produce/app/service/admin/.gitkeep b/backend/plugin/produce/app/service/admin/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/backend/plugin/produce/app/service/admin/ExceptionAnalysisService.php b/backend/plugin/produce/app/service/admin/ExceptionAnalysisService.php new file mode 100644 index 0000000..cbaf402 --- /dev/null +++ b/backend/plugin/produce/app/service/admin/ExceptionAnalysisService.php @@ -0,0 +1,85 @@ +query($params); + + return [ + 'total' => (clone $query)->count(), + 'pending' => (clone $query)->where('status', 0)->count(), + 'processing' => (clone $query)->where('status', 1)->count(), + 'completed' => (clone $query)->where('status', 2)->count(), + 'by_type' => $this->group($params, 'type_code', 'type_name'), + 'by_reason' => $this->group($params, 'reason_code', 'reason_name'), + 'by_issue' => $this->group($params, 'issue_code', 'issue_name'), + 'by_date' => $this->byDate($params), + ]; + } + + private function group(array $params, string $codeColumn, string $nameColumn): array + { + return $this->query($params) + ->selectRaw("{$codeColumn} as code, {$nameColumn} as name, COUNT(*) as total") + ->groupBy($codeColumn, $nameColumn) + ->orderByDesc('total') + ->orderBy($nameColumn) + ->limit(20) + ->get() + ->map(static fn (object $item): array => [ + 'code' => (string) $item->code, + 'name' => (string) $item->name, + 'total' => (int) $item->total, + ]) + ->all(); + } + + private function byDate(array $params): array + { + $model = new ExceptionRecord(); + $connection = $model->getConnection(); + $table = $connection->getTablePrefix() . $model->getTable(); + + return $this->query($params) + ->selectRaw("DATE_FORMAT(FROM_UNIXTIME({$table}.reported_at), '%Y-%m-%d') as date, COUNT(*) as total") + ->groupBy('date') + ->orderBy('date') + ->get() + ->map(static fn (object $item): array => [ + 'date' => (string) $item->date, + 'total' => (int) $item->total, + ]) + ->all(); + } + + private function query(array $params): Builder + { + $model = new ExceptionRecord(); + $query = $model->getConnection()->table($model->getTable())->whereNull('deleted_at'); + + foreach (['type_code', 'reason_code', 'issue_code', 'status'] as $field) { + if (($params[$field] ?? '') !== '') { + $query->where($field, $params[$field]); + } + } + + if (!empty($params['reported_at_range']) && is_array($params['reported_at_range']) && count($params['reported_at_range']) === 2) { + $query->whereBetween('reported_at', [ + strtotime((string) $params['reported_at_range'][0] . ' 00:00:00'), + strtotime((string) $params['reported_at_range'][1] . ' 23:59:59'), + ]); + } else { + $query->whereBetween('reported_at', [strtotime('-29 days 00:00:00'), time()]); + } + + return $query; + } +} diff --git a/backend/plugin/produce/app/service/admin/ExceptionRecordService.php b/backend/plugin/produce/app/service/admin/ExceptionRecordService.php new file mode 100644 index 0000000..17bdde7 --- /dev/null +++ b/backend/plugin/produce/app/service/admin/ExceptionRecordService.php @@ -0,0 +1,16 @@ +dao = $dao; + } +} diff --git a/backend/plugin/produce/app/service/admin/ExceptionSettingService.php b/backend/plugin/produce/app/service/admin/ExceptionSettingService.php new file mode 100644 index 0000000..276105f --- /dev/null +++ b/backend/plugin/produce/app/service/admin/ExceptionSettingService.php @@ -0,0 +1,16 @@ +dao = $dao; + } +} diff --git a/backend/plugin/produce/app/service/admin/HardwareFaultDescriptionService.php b/backend/plugin/produce/app/service/admin/HardwareFaultDescriptionService.php new file mode 100644 index 0000000..35ce940 --- /dev/null +++ b/backend/plugin/produce/app/service/admin/HardwareFaultDescriptionService.php @@ -0,0 +1,84 @@ +dao = $dao; + } + + public function importFromExcel(string $filePath): array + { + $sheet = IOFactory::load($filePath)->getActiveSheet(); + $rows = $sheet->toArray('', true, true, false); + if (count($rows) < 2) { + throw new \InvalidArgumentException('导入文件至少应包含表头和一条硬件故障描述数据'); + } + + $headers = array_map(static fn ($value) => trim((string) $value), $rows[0]); + $indexes = array_flip($headers); + foreach (['分类', '描述'] as $header) { + if (!array_key_exists($header, $indexes)) { + throw new \InvalidArgumentException('导入表头必须包含:分类、描述'); + } + } + + return $this->transaction(function () use ($rows, $indexes) { + $created = 0; + $updated = 0; + $categories = []; + + foreach (array_slice($rows, 1) as $rowNumber => $row) { + $categoryName = trim((string) ($row[$indexes['分类']] ?? '')); + $description = trim((string) ($row[$indexes['描述']] ?? '')); + if ($categoryName === '' && $description === '') { + continue; + } + if ($categoryName === '' || $description === '') { + throw new \InvalidArgumentException('第 ' . ($rowNumber + 2) . ' 行的分类、描述均不能为空'); + } + + $category = $categories[$categoryName] ?? null; + if (!$category) { + $category = MaterialCategory::query()->withTrashed()->where('category_name', $categoryName)->first(); + if ($category?->trashed()) { + $category->restore(); + } + $category ??= MaterialCategory::query()->create(['category_name' => $categoryName]); + $categories[$categoryName] = $category; + } + + $faultDescription = HardwareFaultDescription::query() + ->withTrashed() + ->where('category_id', $category->id) + ->where('description', $description) + ->first(); + if ($faultDescription) { + if ($faultDescription->trashed()) { + $faultDescription->restore(); + } + $updated++; + continue; + } + + HardwareFaultDescription::query()->create([ + 'category_id' => $category->id, + 'description' => $description, + ]); + $created++; + } + + return ['created' => $created, 'updated' => $updated]; + }); + } +} diff --git a/backend/plugin/produce/app/service/admin/MaterialCategoryService.php b/backend/plugin/produce/app/service/admin/MaterialCategoryService.php new file mode 100644 index 0000000..9f1e269 --- /dev/null +++ b/backend/plugin/produce/app/service/admin/MaterialCategoryService.php @@ -0,0 +1,16 @@ +dao = $dao; + } +} diff --git a/backend/plugin/produce/app/service/admin/MaterialService.php b/backend/plugin/produce/app/service/admin/MaterialService.php new file mode 100644 index 0000000..1a4805e --- /dev/null +++ b/backend/plugin/produce/app/service/admin/MaterialService.php @@ -0,0 +1,86 @@ +dao = $dao; + } + + /** + * 从 Excel 导入物料;首行必须为:分类、商品编码、商品名称。 + * 相同商品编码会更新分类和名称,以便重复导入。 + */ + public function importFromExcel(string $filePath): array + { + $sheet = IOFactory::load($filePath)->getActiveSheet(); + $rows = $sheet->toArray('', true, true, false); + if (count($rows) < 2) { + throw new \InvalidArgumentException('导入文件至少应包含表头和一条物料数据'); + } + + $headers = array_map(static fn ($value) => trim((string) $value), $rows[0]); + $indexes = array_flip($headers); + foreach (['分类', '商品编码', '商品名称'] as $header) { + if (!array_key_exists($header, $indexes)) { + throw new \InvalidArgumentException('导入表头必须包含:分类、商品编码、商品名称'); + } + } + + return $this->transaction(function () use ($rows, $indexes) { + $created = 0; + $updated = 0; + $categories = []; + + foreach (array_slice($rows, 1) as $rowNumber => $row) { + $categoryName = trim((string) ($row[$indexes['分类']] ?? '')); + $productCode = trim((string) ($row[$indexes['商品编码']] ?? '')); + $productName = trim((string) ($row[$indexes['商品名称']] ?? '')); + if ($categoryName === '' && $productCode === '' && $productName === '') { + continue; + } + if ($categoryName === '' || $productCode === '' || $productName === '') { + throw new \InvalidArgumentException('第 ' . ($rowNumber + 2) . ' 行的分类、商品编码、商品名称均不能为空'); + } + + $category = $categories[$categoryName] ?? null; + if (!$category) { + $category = MaterialCategory::query()->withTrashed()->where('category_name', $categoryName)->first(); + if ($category?->trashed()) { + $category->restore(); + } + $category ??= MaterialCategory::query()->create(['category_name' => $categoryName]); + $categories[$categoryName] = $category; + } + $material = Material::query()->withTrashed()->where('product_code', $productCode)->first(); + if ($material) { + if ($material->trashed()) { + $material->restore(); + } + $material->fill(['category_id' => $category->id, 'product_name' => $productName])->save(); + $updated++; + continue; + } + + Material::query()->create([ + 'category_id' => $category->id, + 'product_code' => $productCode, + 'product_name' => $productName, + ]); + $created++; + } + + return ['created' => $created, 'updated' => $updated]; + }); + } +} diff --git a/backend/plugin/produce/app/service/admin/ProcessService.php b/backend/plugin/produce/app/service/admin/ProcessService.php new file mode 100644 index 0000000..657f589 --- /dev/null +++ b/backend/plugin/produce/app/service/admin/ProcessService.php @@ -0,0 +1,16 @@ +dao = $dao; + } +} diff --git a/backend/plugin/produce/app/service/admin/ProcessStepService.php b/backend/plugin/produce/app/service/admin/ProcessStepService.php new file mode 100644 index 0000000..308795b --- /dev/null +++ b/backend/plugin/produce/app/service/admin/ProcessStepService.php @@ -0,0 +1,16 @@ +dao = $dao; + } +} diff --git a/backend/plugin/produce/app/service/admin/ProduceConfigService.php b/backend/plugin/produce/app/service/admin/ProduceConfigService.php new file mode 100644 index 0000000..1169c59 --- /dev/null +++ b/backend/plugin/produce/app/service/admin/ProduceConfigService.php @@ -0,0 +1,26 @@ +dao = $dao; + } + + public function getConfigByGroup(string $groupCode): array + { + return $this->dao->getByGroupCode($groupCode); + } + + public function saveConfig(string $groupCode, array $configs): bool + { + return $this->dao->batchSave($groupCode, $configs); + } +} diff --git a/backend/plugin/produce/app/service/admin/ProductRecordService.php b/backend/plugin/produce/app/service/admin/ProductRecordService.php new file mode 100644 index 0000000..9898293 --- /dev/null +++ b/backend/plugin/produce/app/service/admin/ProductRecordService.php @@ -0,0 +1,16 @@ +dao = $dao; + } +} diff --git a/backend/plugin/produce/app/service/admin/RepairRecordService.php b/backend/plugin/produce/app/service/admin/RepairRecordService.php new file mode 100644 index 0000000..88de94c --- /dev/null +++ b/backend/plugin/produce/app/service/admin/RepairRecordService.php @@ -0,0 +1,121 @@ +dao = $dao; + } + + public function save(array $data): RepairRecord + { + return $this->transaction(function () use ($data) { + $data = $this->prepareData($data); + $record = RepairRecord::query()->create($data); + $this->changeFaultUsage($record->fault_description_id, 1); + return $record; + }); + } + + public function update(int|string $id, array $data): bool + { + return $this->transaction(function () use ($id, $data) { + $record = RepairRecord::query()->findOrFail($id); + $previousFaultId = $record->fault_description_id; + $data = $this->prepareData($data); + $record->fill($data)->save(); + if ((string) $previousFaultId !== (string) $record->fault_description_id) { + $this->changeFaultUsage($previousFaultId, -1); + $this->changeFaultUsage($record->fault_description_id, 1); + } + return true; + }); + } + + public function deleteRecord(int|string $id): bool + { + return $this->transaction(function () use ($id) { + $record = RepairRecord::query()->findOrFail($id); + $this->changeFaultUsage($record->fault_description_id, -1); + return (bool) $record->delete(); + }); + } + + private function prepareData(array $data): array + { + $hasCategoryIds = array_key_exists('category_ids', $data); + $categoryIds = array_values(array_unique(array_filter(array_map(static fn ($id): string => trim((string) $id), (array) ($data['category_ids'] ?? [])), static fn (string $id): bool => $id !== ''))); + if ($hasCategoryIds) { + $data['category_ids'] = $categoryIds ?: null; + $data['category_id'] = $categoryIds[0] ?? null; + if (!$categoryIds) { + $data['category_names'] = null; + } + } + + $categoryId = $data['category_id'] ?? null; + $faultId = $data['fault_description_id'] ?? null; + + if (isset($data['repaired_at']) && $data['repaired_at'] !== null && (int) $data['repaired_at'] > 9999999999) { + $data['repaired_at'] = (int) floor((int) $data['repaired_at'] / 1000); + } + if (array_key_exists('category_id', $data) && !$categoryId) { + $data['category_name'] = null; + $data['category_names'] = null; + } + if (array_key_exists('fault_description_id', $data) && !$faultId) { + $data['fault_description'] = null; + } + if ($categoryIds) { + $categories = MaterialCategory::query()->withTrashed()->whereIn('id', $categoryIds)->get(['id', 'category_name'])->keyBy('id'); + if ($categories->count() !== count($categoryIds)) { + throw new \InvalidArgumentException('物料分类不存在'); + } + $data['category_names'] = array_map(static fn (string $id): string => (string) $categories[$id]->category_name, $categoryIds); + $data['category_name'] = $data['category_names'][0]; + } elseif ($categoryId) { + $data['category_name'] = MaterialCategory::query()->withTrashed()->whereKey($categoryId)->value('category_name'); + } + if ($faultId) { + $fault = HardwareFaultDescription::query()->withTrashed()->find($faultId); + if (!$fault) { + throw new \InvalidArgumentException('硬件故障描述不存在'); + } + if ($categoryId && (string) $fault->category_id !== (string) $categoryId) { + throw new \InvalidArgumentException('硬件故障描述与物料分类不匹配'); + } + $data['category_id'] = $fault->category_id; + $data['category_ids'] = [$fault->category_id]; + $data['category_name'] = $fault->category?->category_name ?? $data['category_name'] ?? ''; + $data['category_names'] = [$data['category_name']]; + $data['fault_description'] = $fault->description; + } + if (isset($data['parts']) && is_string($data['parts'])) { + $data['parts'] = json_decode($data['parts'], true, 512, JSON_THROW_ON_ERROR); + } + return $data; + } + + private function changeFaultUsage(int|string|null $faultId, int $delta): void + { + if (!$faultId) { + return; + } + $fault = HardwareFaultDescription::query()->withTrashed()->find($faultId); + if (!$fault) { + return; + } + $fault->use_count = max(0, (int) $fault->use_count + $delta); + $fault->save(); + } +} diff --git a/backend/plugin/produce/app/service/admin/RepairSettingService.php b/backend/plugin/produce/app/service/admin/RepairSettingService.php new file mode 100644 index 0000000..4fe2274 --- /dev/null +++ b/backend/plugin/produce/app/service/admin/RepairSettingService.php @@ -0,0 +1,16 @@ +dao = $dao; + } +} diff --git a/backend/plugin/produce/app/service/admin/ScanDataService.php b/backend/plugin/produce/app/service/admin/ScanDataService.php new file mode 100644 index 0000000..1744f07 --- /dev/null +++ b/backend/plugin/produce/app/service/admin/ScanDataService.php @@ -0,0 +1,16 @@ +dao = $dao; + } +} diff --git a/backend/plugin/produce/app/service/admin/SpecificRuleService.php b/backend/plugin/produce/app/service/admin/SpecificRuleService.php new file mode 100644 index 0000000..bd7cfed --- /dev/null +++ b/backend/plugin/produce/app/service/admin/SpecificRuleService.php @@ -0,0 +1,16 @@ +dao = $dao; + } +} diff --git a/backend/plugin/produce/app/service/admin/StatusTransitionService.php b/backend/plugin/produce/app/service/admin/StatusTransitionService.php new file mode 100644 index 0000000..fc8d384 --- /dev/null +++ b/backend/plugin/produce/app/service/admin/StatusTransitionService.php @@ -0,0 +1,16 @@ +dao = $dao; + } +} diff --git a/backend/plugin/produce/app/service/admin/StepRelationService.php b/backend/plugin/produce/app/service/admin/StepRelationService.php new file mode 100644 index 0000000..e32cd5e --- /dev/null +++ b/backend/plugin/produce/app/service/admin/StepRelationService.php @@ -0,0 +1,16 @@ +dao = $dao; + } +} diff --git a/backend/plugin/produce/app/service/admin/StepStatusService.php b/backend/plugin/produce/app/service/admin/StepStatusService.php new file mode 100644 index 0000000..74d5480 --- /dev/null +++ b/backend/plugin/produce/app/service/admin/StepStatusService.php @@ -0,0 +1,16 @@ +dao = $dao; + } +} diff --git a/backend/plugin/produce/app/service/admin/TransitionLogService.php b/backend/plugin/produce/app/service/admin/TransitionLogService.php new file mode 100644 index 0000000..864590c --- /dev/null +++ b/backend/plugin/produce/app/service/admin/TransitionLogService.php @@ -0,0 +1,16 @@ +dao = $dao; + } +} diff --git a/backend/plugin/produce/app/service/admin/WorkStatisticsService.php b/backend/plugin/produce/app/service/admin/WorkStatisticsService.php new file mode 100644 index 0000000..fad7c40 --- /dev/null +++ b/backend/plugin/produce/app/service/admin/WorkStatisticsService.php @@ -0,0 +1,215 @@ +normalizeMonth($params['month'] ?? null); + $days = (int) date('t', strtotime($month . '-01')); + $start = strtotime($month . '-01 00:00:00'); + $end = strtotime(date('Y-m-t 23:59:59', $start)); + $rows = $this->collectRows($params, $start, $end, static fn (string $column): string => "DATE_FORMAT(FROM_UNIXTIME({$column}), '%Y-%m-%d')"); + + return $this->formatRows($rows, $days, static fn (int $index): string => (string) $index); + } + + public function daily(array $params): array + { + $date = $this->normalizeDate($params['date'] ?? null); + $start = strtotime($date . ' 00:00:00'); + $end = strtotime($date . ' 23:59:59'); + $rows = $this->collectRows($params, $start, $end, static fn (string $column): string => "HOUR(FROM_UNIXTIME({$column}))"); + + return $this->formatRows($rows, 24, static fn (int $index): string => str_pad((string) $index, 2, '0', STR_PAD_LEFT) . ':00'); + } + + private function collectRows(array $params, int $start, int $end, callable $periodExpression): array + { + $dataType = (string) ($params['data_type'] ?? 'all'); + $rows = []; + + if ($dataType === 'all' || $dataType === 'order') { + $rows = array_merge($rows, $this->queryScanData($params, $start, $end, $periodExpression)->get()->all()); + } + + if ($dataType === 'all' || $dataType === 'machine') { + $rows = array_merge($rows, $this->queryProductRecord($params, $start, $end, $periodExpression)->get()->all()); + } + + return $rows; + } + + private function queryScanData(array $params, int $start, int $end, callable $periodExpression): Builder + { + $scanDataModel = new ScanData(); + $connection = $scanDataModel->getConnection(); + $scanDataTable = $scanDataModel->getTable(); + $processTable = 'produce_process'; + $stepTable = 'produce_process_step'; + + $query = $connection->table($scanDataTable) + ->leftJoin($processTable, $processTable . '.id', '=', $scanDataTable . '.process_id') + ->leftJoin($stepTable, $stepTable . '.id', '=', $scanDataTable . '.step_id') + ->whereBetween($scanDataTable . '.scan_time', [$start, $end]) + ->whereNull($scanDataTable . '.deleted_at'); + + foreach (['process_id', 'step_id', 'scan_result'] as $field) { + if (($params[$field] ?? '') !== '') { + $query->where($scanDataTable . '.' . $field, $params[$field]); + } + } + + foreach (['user_code', 'operator'] as $field) { + if (($params[$field] ?? '') !== '') { + $query->where($scanDataTable . '.' . $field, 'like', '%' . $params[$field] . '%'); + } + } + + foreach (['process_name' => $processTable . '.process_name', 'step_name' => $stepTable . '.step_name'] as $field => $column) { + if (($params[$field] ?? '') !== '') { + $query->where($column, 'like', '%' . $params[$field] . '%'); + } + } + + return $query->select([ + $scanDataTable . '.user_code', + $scanDataTable . '.operator', + $connection->raw($connection->getTablePrefix() . $processTable . '.process_name as process_name'), + $connection->raw($connection->getTablePrefix() . $stepTable . '.step_name as step_name'), + ]) + ->selectRaw($periodExpression($connection->getTablePrefix() . $scanDataTable . '.scan_time') . ' as period') + ->selectRaw('SUM(' . $connection->getTablePrefix() . $scanDataTable . '.quantity) as amount') + ->groupBy('user_code', 'operator', 'process_name', 'step_name', 'period') + ->orderBy('user_code') + ->orderBy('process_name') + ->orderBy('step_name'); + } + + private function queryProductRecord(array $params, int $start, int $end, callable $periodExpression): Builder + { + $productRecordModel = new ProductRecord(); + $connection = $productRecordModel->getConnection(); + $productRecordTable = $productRecordModel->getTable(); + $processTable = 'produce_process'; + $stepTable = 'produce_process_step'; + + $query = $connection->table($productRecordTable) + ->leftJoin($processTable, $processTable . '.id', '=', $productRecordTable . '.process_id') + ->leftJoin($stepTable, $stepTable . '.id', '=', $productRecordTable . '.step_id') + ->whereBetween($productRecordTable . '.created_at', [$start, $end]) + ->whereNull($productRecordTable . '.deleted_at'); + + foreach (['process_id', 'step_id', 'scan_result'] as $field) { + if (($params[$field] ?? '') !== '') { + $query->where($productRecordTable . '.' . $field, $params[$field]); + } + } + + foreach (['user_code', 'operator'] as $field) { + if (($params[$field] ?? '') !== '') { + $query->where($productRecordTable . '.' . $field, 'like', '%' . $params[$field] . '%'); + } + } + + foreach (['process_name' => $processTable . '.process_name', 'step_name' => $stepTable . '.step_name'] as $field => $column) { + if (($params[$field] ?? '') !== '') { + $query->where($column, 'like', '%' . $params[$field] . '%'); + } + } + + return $query->select([ + $productRecordTable . '.user_code', + $productRecordTable . '.operator', + $connection->raw($connection->getTablePrefix() . $processTable . '.process_name as process_name'), + $connection->raw($connection->getTablePrefix() . $stepTable . '.step_name as step_name'), + ]) + ->selectRaw($periodExpression($connection->getTablePrefix() . $productRecordTable . '.created_at') . ' as period') + ->selectRaw('SUM(' . $connection->getTablePrefix() . $productRecordTable . '.quantity) as amount') + ->groupBy('user_code', 'operator', 'process_name', 'step_name', 'period') + ->orderBy('user_code') + ->orderBy('process_name') + ->orderBy('step_name'); + } + + private function formatRows(iterable $rows, int $periodCount, callable $periodLabel): array + { + $grouped = []; + $summaryRows = []; + + foreach ($rows as $row) { + $productionProcess = $this->formatProductionProcess((string) $row->process_name, (string) $row->step_name); + $key = implode('|', [(string) $row->user_code, (string) $row->operator, (string) $row->process_name, (string) $row->step_name]); + if (!isset($grouped[$key])) { + $grouped[$key] = [ + 'user_code' => $row->user_code, + 'operator' => $row->operator, + 'production_process' => $productionProcess, + 'process_name' => $row->process_name, + 'step_name' => $row->step_name, + 'total' => 0, + ]; + for ($index = 1; $index <= $periodCount; $index++) { + $grouped[$key][$periodLabel($index)] = 0; + } + } + if (!isset($summaryRows[$productionProcess])) { + $summaryRows[$productionProcess] = [ + 'user_code' => '总计', + 'operator' => '', + 'production_process' => $productionProcess, + 'process_name' => $row->process_name, + 'step_name' => $row->step_name, + 'total' => 0, + ]; + for ($index = 1; $index <= $periodCount; $index++) { + $summaryRows[$productionProcess][$periodLabel($index)] = 0; + } + } + $period = (string) $row->period; + $period = $periodCount === 24 ? str_pad($period, 2, '0', STR_PAD_LEFT) . ':00' : (string) ((int) substr($period, -2)); + if (array_key_exists($period, $grouped[$key])) { + $amount = (int) $row->amount; + $grouped[$key][$period] += $amount; + $grouped[$key]['total'] += $amount; + $summaryRows[$productionProcess][$period] += $amount; + $summaryRows[$productionProcess]['total'] += $amount; + } + } + + $items = array_values($grouped); + if ($items !== []) { + $items = array_merge($items, array_values($summaryRows)); + } + + return $items; + } + + private function formatProductionProcess(string $processName, string $stepName): string + { + if ($processName !== '' && $stepName !== '') { + return $processName . '-' . $stepName; + } + + return $processName !== '' ? $processName : $stepName; + } + + private function normalizeMonth(mixed $month): string + { + $month = is_string($month) && preg_match('/^\d{4}-\d{2}$/', $month) ? $month : date('Y-m'); + return date('Y-m', strtotime($month . '-01')); + } + + private function normalizeDate(mixed $date): string + { + $date = is_string($date) && preg_match('/^\d{4}-\d{2}-\d{2}$/', $date) ? $date : date('Y-m-d'); + return date('Y-m-d', strtotime($date)); + } +} diff --git a/backend/plugin/produce/app/service/api/.gitkeep b/backend/plugin/produce/app/service/api/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/backend/plugin/produce/app/validate/.gitkeep b/backend/plugin/produce/app/validate/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/backend/plugin/produce/app/validate/ExceptionRecordValidate.php b/backend/plugin/produce/app/validate/ExceptionRecordValidate.php new file mode 100644 index 0000000..340fda4 --- /dev/null +++ b/backend/plugin/produce/app/validate/ExceptionRecordValidate.php @@ -0,0 +1,66 @@ + ['required', 'max:100'], + 'user_code' => ['nullable', 'max:50'], + 'reporter' => ['nullable', 'max:100'], + 'type_id' => ['nullable', 'integer'], + 'type_code' => ['required', 'max:64'], + 'type_name' => ['required', 'max:100'], + 'reason_id' => ['nullable', 'integer'], + 'reason_code' => ['required', 'max:64'], + 'reason_name' => ['required', 'max:100'], + 'issue_id' => ['nullable', 'integer'], + 'issue_code' => ['nullable', 'max:64'], + 'issue_name' => ['nullable', 'max:100'], + 'images' => ['nullable'], + 'remark' => ['nullable', 'max:65535'], + 'status' => ['nullable', 'integer', 'in:0,1,2'], + 'handler' => ['nullable', 'max:100'], + 'handler_id' => ['nullable', 'integer'], + 'handled_at' => ['nullable', 'integer'], + 'reported_at' => ['nullable', 'integer'], + ]; + } + + protected array $message = [ + 'order_no.required' => '单号或条码不能为空', + 'order_no.max' => '单号或条码不能超过100个字符', + 'user_code.max' => '提报人工号不能超过50个字符', + 'reporter.max' => '提报人不能超过100个字符', + 'type_id.integer' => '处理类型格式不正确', + 'type_code.required' => '处理类型编码不能为空', + 'type_code.max' => '处理类型编码不能超过64个字符', + 'type_name.required' => '处理类型名称不能为空', + 'type_name.max' => '处理类型名称不能超过100个字符', + 'reason_id.integer' => '异常原因格式不正确', + 'reason_code.required' => '异常原因编码不能为空', + 'reason_code.max' => '异常原因编码不能超过64个字符', + 'reason_name.required' => '异常原因名称不能为空', + 'reason_name.max' => '异常原因名称不能超过100个字符', + 'issue_id.integer' => '具体问题格式不正确', + 'issue_code.max' => '具体问题编码不能超过64个字符', + 'issue_name.max' => '具体问题名称不能超过100个字符', + 'status.integer' => '处理状态格式不正确', + 'status.in' => '处理状态值不正确', + 'handler.max' => '处理人不能超过100个字符', + 'handler_id.integer' => '处理人ID格式不正确', + 'handled_at.integer' => '处理时间格式不正确', + 'reported_at.integer' => '提报时间格式不正确', + ]; + + protected array $scene = [ + 'store' => ['order_no', 'user_code', 'reporter', 'type_id', 'type_code', 'type_name', 'reason_id', 'reason_code', 'reason_name', 'issue_id', 'issue_code', 'issue_name', 'images', 'remark', 'status', 'handler', 'handler_id', 'handled_at', 'reported_at'], + 'update' => ['order_no', 'user_code', 'reporter', 'type_id', 'type_code', 'type_name', 'reason_id', 'reason_code', 'reason_name', 'issue_id', 'issue_code', 'issue_name', 'images', 'remark', 'status', 'handler', 'handler_id', 'handled_at', 'reported_at'], + ]; +} diff --git a/backend/plugin/produce/app/validate/ExceptionSettingValidate.php b/backend/plugin/produce/app/validate/ExceptionSettingValidate.php new file mode 100644 index 0000000..7538956 --- /dev/null +++ b/backend/plugin/produce/app/validate/ExceptionSettingValidate.php @@ -0,0 +1,43 @@ + ['nullable', 'integer'], + 'setting_type' => ['required', 'in:type,reason,issue'], + 'code' => ['required', 'max:64'], + 'name' => ['required', 'max:100'], + 'sort' => ['nullable', 'integer', 'min:0'], + 'is_enabled' => ['nullable', 'integer', 'in:0,1'], + 'remark' => ['nullable', 'max:65535'], + ]; + } + + protected array $message = [ + 'parent_id.integer' => '父级设置格式不正确', + 'setting_type.required' => '设置类型不能为空', + 'setting_type.in' => '设置类型值不正确', + 'code.required' => '设置编码不能为空', + 'code.max' => '设置编码不能超过64个字符', + 'name.required' => '设置名称不能为空', + 'name.max' => '设置名称不能超过100个字符', + 'sort.integer' => '排序必须为整数', + 'sort.min' => '排序不能小于0', + 'is_enabled.integer' => '启用状态格式不正确', + 'is_enabled.in' => '启用状态值不正确', + 'remark.max' => '备注内容过长', + ]; + + protected array $scene = [ + 'store' => ['parent_id', 'setting_type', 'code', 'name', 'sort', 'is_enabled', 'remark'], + 'update' => ['parent_id', 'setting_type', 'code', 'name', 'sort', 'is_enabled', 'remark'], + ]; +} diff --git a/backend/plugin/produce/app/validate/HardwareFaultDescriptionValidate.php b/backend/plugin/produce/app/validate/HardwareFaultDescriptionValidate.php new file mode 100644 index 0000000..e037185 --- /dev/null +++ b/backend/plugin/produce/app/validate/HardwareFaultDescriptionValidate.php @@ -0,0 +1,34 @@ + ['required', 'integer'], + 'description' => ['required', 'max:500'], + 'is_enabled' => ['integer', 'in:0,1'], + 'remark' => ['max:500'], + ]; + } + + protected array $message = [ + 'category_id.required' => '请选择物料分类', + 'category_id.integer' => '物料分类不正确', + 'description.required' => '硬件故障描述不能为空', + 'description.max' => '硬件故障描述不能超过500个字符', + 'is_enabled.in' => '启用状态不正确', + 'remark.max' => '备注不能超过500个字符', + ]; + + protected array $scene = [ + 'store' => ['category_id', 'description', 'is_enabled', 'remark'], + 'update' => ['category_id', 'description', 'is_enabled', 'remark'], + ]; +} diff --git a/backend/plugin/produce/app/validate/MaterialCategoryValidate.php b/backend/plugin/produce/app/validate/MaterialCategoryValidate.php new file mode 100644 index 0000000..36a85b2 --- /dev/null +++ b/backend/plugin/produce/app/validate/MaterialCategoryValidate.php @@ -0,0 +1,25 @@ + ['required', 'max:100']]; + } + + protected array $message = [ + 'category_name.required' => '分类名称不能为空', + 'category_name.max' => '分类名称不能超过100个字符', + ]; + + protected array $scene = [ + 'store' => ['category_name'], + 'update' => ['category_name'], + ]; +} diff --git a/backend/plugin/produce/app/validate/MaterialValidate.php b/backend/plugin/produce/app/validate/MaterialValidate.php new file mode 100644 index 0000000..0ec14f4 --- /dev/null +++ b/backend/plugin/produce/app/validate/MaterialValidate.php @@ -0,0 +1,32 @@ + ['required'], + 'product_code' => ['required', 'max:100'], + 'product_name' => ['required', 'max:200'], + ]; + } + + protected array $message = [ + 'category_id.required' => '请选择分类', + 'product_code.required' => '商品编码不能为空', + 'product_code.max' => '商品编码不能超过100个字符', + 'product_name.required' => '商品名称不能为空', + 'product_name.max' => '商品名称不能超过200个字符', + ]; + + protected array $scene = [ + 'store' => ['category_id', 'product_code', 'product_name'], + 'update' => ['category_id', 'product_code', 'product_name'], + ]; +} diff --git a/backend/plugin/produce/app/validate/ProcessStepValidate.php b/backend/plugin/produce/app/validate/ProcessStepValidate.php new file mode 100644 index 0000000..27c9de2 --- /dev/null +++ b/backend/plugin/produce/app/validate/ProcessStepValidate.php @@ -0,0 +1,63 @@ +route?->param('id'); + $processId = (string) (request()->input('process_id') ?? ''); + + return [ + 'process_id' => ['required', 'integer'], + 'step_code' => [ + 'required', + 'max:50', + Rule::unique(ProcessStep::class, 'step_code') + ->where(fn ($query) => $query->where('process_id', $processId)) + ->ignore($id, 'id') + ], + 'step_name' => ['required', 'max:100'], + 'description' => ['nullable', 'max:65535'], + 'sort' => ['nullable', 'integer', 'min:0'], + 'status' => ['nullable', 'integer', 'in:0,1'], + 'prerequisite_steps' => ['nullable'], + 'prerequisite_mode' => ['nullable', 'in:all,any,none'], + 'prerequisite_require_final' => ['nullable', 'integer', 'in:0,1'], + 'allow_repeat_scan' => ['nullable', 'integer', 'in:0,1'], + 'repeat_scan_statuses' => ['nullable'], + ]; + } + + protected array $message = [ + 'process_id.required' => '所属工序不能为空', + 'process_id.integer' => '所属工序格式不正确', + 'step_code.required' => '步骤编码不能为空', + 'step_code.max' => '步骤编码不能超过50个字符', + 'step_code.unique' => '步骤编码已存在', + 'step_name.required' => '步骤名称不能为空', + 'step_name.max' => '步骤名称不能超过100个字符', + 'description.max' => '步骤描述内容过长', + 'sort.integer' => '排序必须为整数', + 'sort.min' => '排序不能小于0', + 'status.integer' => '状态格式不正确', + 'status.in' => '状态值不正确', + 'prerequisite_mode.in' => '前置步骤验证模式值不正确', + 'prerequisite_require_final.integer' => '前置步骤终态要求格式不正确', + 'prerequisite_require_final.in' => '前置步骤终态要求值不正确', + 'allow_repeat_scan.integer' => '允许重复扫码格式不正确', + 'allow_repeat_scan.in' => '允许重复扫码值不正确', + ]; + + protected array $scene = [ + 'store' => ['process_id', 'step_code', 'step_name', 'description', 'sort', 'status', 'prerequisite_steps', 'prerequisite_mode', 'prerequisite_require_final', 'allow_repeat_scan', 'repeat_scan_statuses'], + 'update' => ['process_id', 'step_code', 'step_name', 'description', 'sort', 'status', 'prerequisite_steps', 'prerequisite_mode', 'prerequisite_require_final', 'allow_repeat_scan', 'repeat_scan_statuses'], + ]; +} diff --git a/backend/plugin/produce/app/validate/ProcessValidate.php b/backend/plugin/produce/app/validate/ProcessValidate.php new file mode 100644 index 0000000..7d89b55 --- /dev/null +++ b/backend/plugin/produce/app/validate/ProcessValidate.php @@ -0,0 +1,43 @@ +route?->param('id'); + + return [ + 'process_code' => ['required', 'max:50', Rule::unique(Process::class, 'process_code')->ignore($id, 'id')], + 'process_name' => ['required', 'max:100'], + 'description' => ['nullable', 'max:65535'], + 'sort' => ['nullable', 'integer', 'min:0'], + 'status' => ['nullable', 'integer', 'in:0,1'], + ]; + } + + protected array $message = [ + 'process_code.required' => '工序编码不能为空', + 'process_code.max' => '工序编码不能超过50个字符', + 'process_code.unique' => '工序编码已存在', + 'process_name.required' => '工序名称不能为空', + 'process_name.max' => '工序名称不能超过100个字符', + 'description.max' => '工序描述内容过长', + 'sort.integer' => '排序必须为整数', + 'sort.min' => '排序不能小于0', + 'status.integer' => '状态格式不正确', + 'status.in' => '状态值不正确', + ]; + + protected array $scene = [ + 'store' => ['process_code', 'process_name', 'description', 'sort', 'status'], + 'update' => ['process_code', 'process_name', 'description', 'sort', 'status'], + ]; +} diff --git a/backend/plugin/produce/app/validate/ProductRecordValidate.php b/backend/plugin/produce/app/validate/ProductRecordValidate.php new file mode 100644 index 0000000..2c4c091 --- /dev/null +++ b/backend/plugin/produce/app/validate/ProductRecordValidate.php @@ -0,0 +1,51 @@ + ['required', 'max:100'], + 'product_code' => ['required', 'max:100'], + 'quantity' => ['required', 'integer', 'min:1'], + 'user_code' => ['required', 'max:50'], + 'operator' => ['nullable', 'max:100'], + 'process_id' => ['nullable', 'integer'], + 'step_id' => ['nullable', 'integer'], + 'status_id' => ['nullable', 'integer'], + 'scan_result' => ['required', 'integer', 'in:0,1'], + 'remark' => ['nullable', 'max:65535'], + ]; + } + + protected array $message = [ + 'process_order_no.required' => '加工单号不能为空', + 'process_order_no.max' => '加工单号不能超过100个字符', + 'product_code.required' => '商品编码不能为空', + 'product_code.max' => '商品编码不能超过100个字符', + 'quantity.required' => '数量不能为空', + 'quantity.integer' => '数量格式不正确', + 'quantity.min' => '数量必须大于0', + 'user_code.required' => '用户编码不能为空', + 'user_code.max' => '用户编码不能超过50个字符', + 'operator.max' => '操作人员不能超过100个字符', + 'process_id.integer' => '工序格式不正确', + 'step_id.integer' => '步骤格式不正确', + 'status_id.integer' => '状态格式不正确', + 'scan_result.required' => '扫码结果不能为空', + 'scan_result.integer' => '扫码结果格式不正确', + 'scan_result.in' => '扫码结果值不正确', + 'remark.max' => '备注内容过长', + ]; + + protected array $scene = [ + 'store' => ['process_order_no', 'product_code', 'quantity', 'user_code', 'operator', 'process_id', 'step_id', 'status_id', 'scan_result', 'remark'], + 'update' => ['process_order_no', 'product_code', 'quantity', 'user_code', 'operator', 'process_id', 'step_id', 'status_id', 'scan_result', 'remark'], + ]; +} diff --git a/backend/plugin/produce/app/validate/RepairRecordValidate.php b/backend/plugin/produce/app/validate/RepairRecordValidate.php new file mode 100644 index 0000000..138d4ee --- /dev/null +++ b/backend/plugin/produce/app/validate/RepairRecordValidate.php @@ -0,0 +1,49 @@ + ['required', 'max:100'], + 'order_no' => ['max:100'], + 'product_code' => ['max:100'], + 'product_name' => ['max:200'], + 'category_id' => ['integer'], + 'category_ids' => ['array'], + 'category_ids.*' => ['integer'], + 'fault_description_id' => ['integer'], + 'repair_result' => ['max:50'], + 'operator' => ['max:100'], + 'repaired_at' => ['integer'], + 'remark' => ['max:1000'], + ]; + } + + protected array $message = [ + 'repair_no.required' => '维修单号不能为空', + 'repair_no.max' => '维修单号不能超过100个字符', + 'order_no.max' => '订单号不能超过100个字符', + 'product_code.max' => '商品编码不能超过100个字符', + 'product_name.max' => '商品名称不能超过200个字符', + 'category_id.integer' => '物料分类不正确', + 'category_ids.array' => '物料分类集合格式不正确', + 'category_ids.*.integer' => '物料分类不正确', + 'fault_description_id.integer' => '硬件故障描述不正确', + 'repair_result.max' => '维修判定不能超过50个字符', + 'operator.max' => '维修人员不能超过100个字符', + 'repaired_at.integer' => '维修时间不正确', + 'remark.max' => '备注不能超过1000个字符', + ]; + + protected array $scene = [ + 'store' => ['repair_no', 'order_no', 'product_code', 'product_name', 'category_id', 'category_ids', 'fault_description_id', 'repair_result', 'parts', 'operator', 'repaired_at', 'remark'], + 'update' => ['repair_no', 'order_no', 'product_code', 'product_name', 'category_id', 'category_ids', 'fault_description_id', 'repair_result', 'parts', 'operator', 'repaired_at', 'remark'], + ]; +} diff --git a/backend/plugin/produce/app/validate/RepairSettingValidate.php b/backend/plugin/produce/app/validate/RepairSettingValidate.php new file mode 100644 index 0000000..3ebae2e --- /dev/null +++ b/backend/plugin/produce/app/validate/RepairSettingValidate.php @@ -0,0 +1,43 @@ + ['nullable', 'integer'], + 'setting_type' => ['required', 'in:type,reason,issue'], + 'code' => ['required', 'max:64'], + 'name' => ['required', 'max:100'], + 'sort' => ['nullable', 'integer', 'min:0'], + 'is_enabled' => ['nullable', 'integer', 'in:0,1'], + 'remark' => ['nullable', 'max:65535'], + ]; + } + + protected array $message = [ + 'parent_id.integer' => '父级设置格式不正确', + 'setting_type.required' => '设置类型不能为空', + 'setting_type.in' => '设置类型值不正确', + 'code.required' => '设置编码不能为空', + 'code.max' => '设置编码不能超过64个字符', + 'name.required' => '设置名称不能为空', + 'name.max' => '设置名称不能超过100个字符', + 'sort.integer' => '排序必须为整数', + 'sort.min' => '排序不能小于0', + 'is_enabled.integer' => '启用状态格式不正确', + 'is_enabled.in' => '启用状态值不正确', + 'remark.max' => '备注内容过长', + ]; + + protected array $scene = [ + 'store' => ['parent_id', 'setting_type', 'code', 'name', 'sort', 'is_enabled', 'remark'], + 'update' => ['parent_id', 'setting_type', 'code', 'name', 'sort', 'is_enabled', 'remark'], + ]; +} diff --git a/backend/plugin/produce/app/validate/ScanDataValidate.php b/backend/plugin/produce/app/validate/ScanDataValidate.php new file mode 100644 index 0000000..bd63576 --- /dev/null +++ b/backend/plugin/produce/app/validate/ScanDataValidate.php @@ -0,0 +1,49 @@ + ['required', 'max:100'], + 'quantity' => ['nullable', 'integer', 'min:1'], + 'user_code' => ['required', 'max:50'], + 'operator' => ['nullable', 'max:100'], + 'process_id' => ['required', 'integer'], + 'step_id' => ['required', 'integer'], + 'status_id' => ['nullable', 'integer'], + 'scan_result' => ['required', 'integer', 'in:0,1'], + 'remark' => ['nullable', 'max:65535'], + ]; + } + + protected array $message = [ + 'order_no.required' => '订单号不能为空', + 'order_no.max' => '订单号不能超过100个字符', + 'quantity.integer' => '本次数量格式不正确', + 'quantity.min' => '本次数量必须大于0', + 'user_code.required' => '用户编码不能为空', + 'user_code.max' => '用户编码不能超过50个字符', + 'operator.max' => '操作人员不能超过100个字符', + 'process_id.required' => '工序不能为空', + 'process_id.integer' => '工序格式不正确', + 'step_id.required' => '步骤不能为空', + 'step_id.integer' => '步骤格式不正确', + 'status_id.integer' => '状态格式不正确', + 'scan_result.required' => '扫码结果不能为空', + 'scan_result.integer' => '扫码结果格式不正确', + 'scan_result.in' => '扫码结果值不正确', + 'remark.max' => '备注内容过长', + ]; + + protected array $scene = [ + 'store' => ['order_no', 'quantity', 'user_code', 'operator', 'process_id', 'step_id', 'status_id', 'scan_result', 'remark'], + 'update' => ['order_no', 'quantity', 'user_code', 'operator', 'process_id', 'step_id', 'status_id', 'scan_result', 'remark'], + ]; +} diff --git a/backend/plugin/produce/app/validate/SpecificRuleValidate.php b/backend/plugin/produce/app/validate/SpecificRuleValidate.php new file mode 100644 index 0000000..4834c3b --- /dev/null +++ b/backend/plugin/produce/app/validate/SpecificRuleValidate.php @@ -0,0 +1,47 @@ + ['required', 'max:255'], + 'rule_pattern' => ['required'], + 'rule_type' => ['required', 'integer'], + 'apply_mode' => ['required', 'in:order,machine,both'], + 'match_field' => ['required', 'in:order_no,process_order_no,product_code,user_code'], + 'is_enabled' => ['nullable', 'integer', 'in:0,1'], + 'step_ids' => ['nullable'], + 'sort' => ['nullable', 'integer', 'min:0'], + 'remark' => ['nullable', 'max:65535'], + ]; + } + + protected array $message = [ + 'rule_name.required' => '规则名称不能为空', + 'rule_name.max' => '规则名称不能超过255个字符', + 'rule_pattern.required' => '规则表达式不能为空', + 'rule_type.required' => '规则类型不能为空', + 'rule_type.integer' => '规则类型格式不正确', + 'apply_mode.required' => '适用模式不能为空', + 'apply_mode.in' => '适用模式值不正确', + 'match_field.required' => '匹配字段不能为空', + 'match_field.in' => '匹配字段值不正确', + 'is_enabled.integer' => '启用状态格式不正确', + 'is_enabled.in' => '启用状态值不正确', + 'sort.integer' => '排序必须为整数', + 'sort.min' => '排序不能小于0', + 'remark.max' => '备注内容过长', + ]; + + protected array $scene = [ + 'store' => ['rule_name', 'rule_pattern', 'rule_type', 'apply_mode', 'match_field', 'is_enabled', 'step_ids', 'sort', 'remark'], + 'update' => ['rule_name', 'rule_pattern', 'rule_type', 'apply_mode', 'match_field', 'is_enabled', 'step_ids', 'sort', 'remark'], + ]; +} diff --git a/backend/plugin/produce/app/validate/StatusTransitionValidate.php b/backend/plugin/produce/app/validate/StatusTransitionValidate.php new file mode 100644 index 0000000..ac87f95 --- /dev/null +++ b/backend/plugin/produce/app/validate/StatusTransitionValidate.php @@ -0,0 +1,103 @@ + ['required', 'integer'], + 'from_status_id' => ['required', 'integer'], + 'to_status_id' => ['required', 'integer', 'different:from_status_id'], + 'trigger_event' => ['required', 'max:100', 'in:next_step_scan,scan_trigger,exception_trigger,manual_trigger,timer_trigger,complete_trigger'], + 'event_config' => [ + 'nullable', + function (string $attribute, mixed $value, \Closure $fail) { + if ($value === null || $value === '') { + return; + } + + if (is_array($value)) { + return; + } + + if (!is_string($value)) { + $fail('事件配置必须为有效的JSON字符串'); + return; + } + + json_decode($value, true); + if (json_last_error() !== JSON_ERROR_NONE) { + $fail('事件配置必须为有效的JSON字符串'); + } + } + ], + 'auto_trigger' => ['nullable', 'integer', 'in:0,1'], + 'priority' => ['nullable', 'integer', 'min:0'], + 'transition_type' => ['required', 'max:20', 'in:primary,side_effect'], + 'side_effect_type' => ['nullable', 'max:50', 'in:log,notify,update_field,trigger_event'], + 'side_effect_config' => [ + 'nullable', + function (string $attribute, mixed $value, \Closure $fail) { + if ($value === null || $value === '') { + return; + } + + if (is_array($value)) { + return; + } + + if (!is_string($value)) { + $fail('副作用配置必须为有效的JSON字符串'); + return; + } + + json_decode($value, true); + if (json_last_error() !== JSON_ERROR_NONE) { + $fail('副作用配置必须为有效的JSON字符串'); + } + } + ], + 'description' => ['nullable', 'max:65535'], + 'sort' => ['nullable', 'integer', 'min:0'], + 'status' => ['nullable', 'integer', 'in:0,1'], + ]; + } + + protected array $message = [ + 'step_id.required' => '所属步骤不能为空', + 'step_id.integer' => '所属步骤格式不正确', + 'from_status_id.required' => '源状态不能为空', + 'from_status_id.integer' => '源状态格式不正确', + 'to_status_id.required' => '目标状态不能为空', + 'to_status_id.integer' => '目标状态格式不正确', + 'to_status_id.different' => '目标状态不能与源状态相同', + 'trigger_event.required' => '触发事件不能为空', + 'trigger_event.max' => '触发事件长度不能超过100个字符', + 'trigger_event.in' => '触发事件值不正确', + 'auto_trigger.integer' => '自动触发格式不正确', + 'auto_trigger.in' => '自动触发值不正确', + 'priority.integer' => '优先级必须为整数', + 'priority.min' => '优先级不能小于0', + 'transition_type.required' => '转换类型不能为空', + 'transition_type.max' => '转换类型长度不能超过20个字符', + 'transition_type.in' => '转换类型值不正确', + 'side_effect_type.max' => '副作用类型长度不能超过50个字符', + 'side_effect_type.in' => '副作用类型值不正确', + 'description.max' => '描述内容过长', + 'sort.integer' => '排序必须为整数', + 'sort.min' => '排序不能小于0', + 'status.integer' => '状态格式不正确', + 'status.in' => '状态值不正确', + ]; + + protected array $scene = [ + 'store' => ['step_id', 'from_status_id', 'to_status_id', 'trigger_event', 'event_config', 'auto_trigger', 'priority', 'transition_type', 'side_effect_type', 'side_effect_config', 'description', 'sort', 'status'], + 'update' => ['step_id', 'from_status_id', 'to_status_id', 'trigger_event', 'event_config', 'auto_trigger', 'priority', 'transition_type', 'side_effect_type', 'side_effect_config', 'description', 'sort', 'status'], + ]; +} diff --git a/backend/plugin/produce/app/validate/StepRelationValidate.php b/backend/plugin/produce/app/validate/StepRelationValidate.php new file mode 100644 index 0000000..0995bdb --- /dev/null +++ b/backend/plugin/produce/app/validate/StepRelationValidate.php @@ -0,0 +1,86 @@ +route?->param('id'); + $fromStepId = (string) (request()->input('from_step_id') ?? ''); + $toStepId = (string) (request()->input('to_step_id') ?? ''); + $relationType = (string) (request()->input('relation_type') ?? 'normal'); + + return [ + 'from_step_id' => ['required', 'integer'], + 'to_step_id' => ['required', 'integer', 'different:from_step_id'], + 'relation_type' => [ + 'required', + 'max:20', + Rule::in(['normal', 'exception']), + Rule::unique(StepRelation::class, 'relation_type') + ->where(fn ($query) => $query + ->where('from_step_id', $fromStepId) + ->where('to_step_id', $toStepId) + ) + ->ignore($id, 'id') + ], + 'flow_condition' => [ + 'nullable', + function (string $attribute, mixed $value, \Closure $fail) { + if ($value === null || $value === '') { + return; + } + + if (is_array($value)) { + return; + } + + if (!is_string($value)) { + $fail('流转条件必须为有效的JSON字符串'); + return; + } + + json_decode($value, true); + if (json_last_error() !== JSON_ERROR_NONE) { + $fail('流转条件必须为有效的JSON字符串'); + } + } + ], + 'priority' => ['nullable', 'integer', 'min:0'], + 'description' => ['nullable', 'max:65535'], + 'sort' => ['nullable', 'integer', 'min:0'], + 'status' => ['nullable', 'integer', 'in:0,1'], + ]; + } + + protected array $message = [ + 'from_step_id.required' => '源步骤不能为空', + 'from_step_id.integer' => '源步骤格式不正确', + 'to_step_id.required' => '目标步骤不能为空', + 'to_step_id.integer' => '目标步骤格式不正确', + 'to_step_id.different' => '目标步骤不能与源步骤相同', + 'relation_type.required' => '关系类型不能为空', + 'relation_type.max' => '关系类型长度不能超过20个字符', + 'relation_type.in' => '关系类型值不正确', + 'relation_type.unique' => '该步骤关系已存在', + 'priority.integer' => '优先级必须为整数', + 'priority.min' => '优先级不能小于0', + 'description.max' => '描述内容过长', + 'sort.integer' => '排序必须为整数', + 'sort.min' => '排序不能小于0', + 'status.integer' => '状态格式不正确', + 'status.in' => '状态值不正确', + ]; + + protected array $scene = [ + 'store' => ['from_step_id', 'to_step_id', 'relation_type', 'flow_condition', 'priority', 'description', 'sort', 'status'], + 'update' => ['from_step_id', 'to_step_id', 'relation_type', 'flow_condition', 'priority', 'description', 'sort', 'status'], + ]; +} diff --git a/backend/plugin/produce/app/validate/StepStatusValidate.php b/backend/plugin/produce/app/validate/StepStatusValidate.php new file mode 100644 index 0000000..6233431 --- /dev/null +++ b/backend/plugin/produce/app/validate/StepStatusValidate.php @@ -0,0 +1,59 @@ +route?->param('id'); + $stepId = (string) (request()->input('step_id') ?? ''); + + return [ + 'step_id' => ['required', 'integer'], + 'status_code' => [ + 'required', + 'max:50', + Rule::unique(StepStatus::class, 'status_code') + ->where(fn ($query) => $query->where('step_id', $stepId)) + ->ignore($id, 'id') + ], + 'status_name' => ['required', 'max:100'], + 'is_initial' => ['nullable', 'integer', 'in:0,1'], + 'is_final' => ['nullable', 'integer', 'in:0,1'], + 'description' => ['nullable', 'max:65535'], + 'sort' => ['nullable', 'integer', 'min:0'], + 'status' => ['nullable', 'integer', 'in:0,1'], + ]; + } + + protected array $message = [ + 'step_id.required' => '所属步骤不能为空', + 'step_id.integer' => '所属步骤格式不正确', + 'status_code.required' => '状态编码不能为空', + 'status_code.max' => '状态编码不能超过50个字符', + 'status_code.unique' => '状态编码已存在', + 'status_name.required' => '状态名称不能为空', + 'status_name.max' => '状态名称不能超过100个字符', + 'is_initial.integer' => '初始状态格式不正确', + 'is_initial.in' => '初始状态值不正确', + 'is_final.integer' => '终态格式不正确', + 'is_final.in' => '终态值不正确', + 'description.max' => '状态描述内容过长', + 'sort.integer' => '排序必须为整数', + 'sort.min' => '排序不能小于0', + 'status.integer' => '状态格式不正确', + 'status.in' => '状态值不正确', + ]; + + protected array $scene = [ + 'store' => ['step_id', 'status_code', 'status_name', 'is_initial', 'is_final', 'description', 'sort', 'status'], + 'update' => ['step_id', 'status_code', 'status_name', 'is_initial', 'is_final', 'description', 'sort', 'status'], + ]; +} diff --git a/backend/plugin/produce/config/app.php b/backend/plugin/produce/config/app.php new file mode 100644 index 0000000..a2a027c --- /dev/null +++ b/backend/plugin/produce/config/app.php @@ -0,0 +1,9 @@ + true, + 'debug' => true, + 'controller_suffix' => 'Controller', + 'controller_reuse' => false, + 'version' => '1.0.0', +]; diff --git a/backend/plugin/produce/config/info.php b/backend/plugin/produce/config/info.php new file mode 100644 index 0000000..a384834 --- /dev/null +++ b/backend/plugin/produce/config/info.php @@ -0,0 +1,20 @@ + 'produce', + 'identifier' => 'produce', + 'type' => 'madong:plugin', + 'version' => '1.0.0', + 'description' => '', + 'author' => 'mrlee', + 'author_email' => '', + 'website' => '', + 'uninstall' => [ + 'drop_tables' => false, + 'remove_dependencies' => false, + ], + ]; diff --git a/backend/plugin/produce/config/installed.php b/backend/plugin/produce/config/installed.php new file mode 100644 index 0000000..7bb33e2 --- /dev/null +++ b/backend/plugin/produce/config/installed.php @@ -0,0 +1,4 @@ + '1.0.0', + 'installed_at' => '2026-08-30 15:44:35', +); \ No newline at end of file diff --git a/backend/plugin/produce/config/middleware.php b/backend/plugin/produce/config/middleware.php new file mode 100644 index 0000000..1b12afb --- /dev/null +++ b/backend/plugin/produce/config/middleware.php @@ -0,0 +1,19 @@ + [ + ApiAccessTokenMiddleware::class, + ], + 'adminapi' => [ + AccessTokenMiddleware::class, + ], + '@' => [ + \app\middleware\AllowCrossOriginMiddleware::class, + ], +]; diff --git a/backend/plugin/produce/config/route.php b/backend/plugin/produce/config/route.php new file mode 100644 index 0000000..6c12a09 --- /dev/null +++ b/backend/plugin/produce/config/route.php @@ -0,0 +1,126 @@ +registerRoute([ + 'route_prefix' => '/produce/openapi', + 'register_route' => true, + 'openapi_doc' => [ + 'scan_path' => [ + base_path('plugin/produce/app/api'), + ], + 'modify' => function (OA\OpenApi $openapi) { + $openapi->info->title = '生产管理 API'; + $openapi->info->version = '1.0.0'; + $openapi->servers = [ + new OA\Server( + [ + 'url' => '/api', + 'description' => request()->host(), + ] + ), + ]; + /** @phpstan-ignore-next-line */ + if (!$openapi->components instanceof OA\Components) { + $openapi->components = new OA\Components([]); + } + $openapi->components->securitySchemes = [ + new OA\SecurityScheme([ + 'securityScheme' => 'api_key', + 'type' => 'apiKey', + 'name' => config('core.jwt.app.token_name', 'Authorization'), + 'in' => 'header', + ]), + ]; + }, + ], + ]); +}); + +/** + * 注册 AppAPI 路由 + */ +Route::group('/appapi', function () { + Swagger::create()->registerRoute([ + 'route_prefix' => '/produce/openapi', + 'register_route' => true, + 'openapi_doc' => [ + 'scan_path' => [ + base_path('plugin/produce/app/appapi'), + ], + 'modify' => function (OA\OpenApi $openapi) { + $openapi->info->title = '生产管理 APP API'; + $openapi->info->version = '1.0.0'; + $openapi->servers = [ + new OA\Server( + [ + 'url' => '/appapi', + 'description' => request()->host(), + ] + ), + ]; + /** @phpstan-ignore-next-line */ + if (!$openapi->components instanceof OA\Components) { + $openapi->components = new OA\Components([]); + } + $openapi->components->securitySchemes = [ + new OA\SecurityScheme([ + 'securityScheme' => 'api_key', + 'type' => 'apiKey', + 'name' => config('core.jwt.app.token_name', 'Authorization'), + 'in' => 'header', + ]), + ]; + }, + ], + ]); +}); + +/** + * 注册 AdminAPI 路由 + */ +Route::group('/adminapi', function () { + Swagger::create()->registerRoute([ + 'route_prefix' => '/produce/openapi', + 'register_route' => true, + 'openapi_doc' => [ + 'scan_path' => [ + base_path('plugin/produce/app/adminapi'), + ], + 'modify' => function (OA\OpenApi $openapi) { + $openapi->info->title = '生产管理 API'; + $openapi->info->version = '1.0.0'; + $openapi->servers = [ + new OA\Server( + [ + 'url' => '/adminapi', + 'description' => request()->host(), + ] + ), + ]; + /** @phpstan-ignore-next-line */ + if (!$openapi->components instanceof OA\Components) { + $openapi->components = new OA\Components([]); + } + $openapi->components->securitySchemes = [ + new OA\SecurityScheme([ + 'securityScheme' => 'api_key', + 'type' => 'apiKey', + 'name' => config('core.jwt.app.token_name', 'Authorization'), + 'in' => 'header', + ]), + ]; + }, + ], + ]); +}); diff --git a/backend/plugin/produce/config/translation.php b/backend/plugin/produce/config/translation.php new file mode 100644 index 0000000..9caa692 --- /dev/null +++ b/backend/plugin/produce/config/translation.php @@ -0,0 +1,7 @@ + config('app.lang'), + 'fallback_locale' => ['zh_CN', 'en'], + 'path' => base_path() . '/plugin/produce/resource/translations', +]; diff --git a/backend/plugin/produce/produce-replication-plan.md b/backend/plugin/produce/produce-replication-plan.md new file mode 100644 index 0000000..a6fe19d --- /dev/null +++ b/backend/plugin/produce/produce-replication-plan.md @@ -0,0 +1,1044 @@ +# Produce 插件六模块复刻方案 + +## 1. 文档目的 + +本文档用于梳理 `backend/plugin/produce` 插件需要优先复刻的 6 个模块,并结合旧项目的前端、后端、SQL 安装脚本,整理出一份可以直接执行的开发方案。 + +目标模块: + +1. 工序管理 `process` +2. 工序步骤 `process-step` +3. 步骤状态 `step-status` +4. 步骤关系 `step-relation` +5. 状态转换 `status-transition` +6. 转换日志 `transition-log` + +本文档基于以下真实参考: + +- 旧前端目录:`old/web/src/views/produce/*` +- 旧后端路由:`old/server/app/admin/route/produce.php` +- 旧后端控制器:`old/server/app/admin/controller/produce/*` +- 旧后端 Validate:`old/server/app/admin/validate/produce/*` +- 旧后端 DAO / Model / Service:`old/server/app/common/{dao,model,services}/produce/*` +- 旧库 SQL:`old/server/scripts/sql/install.sql` +- 当前插件骨架:`backend/plugin/produce/*` + +## 2. 当前 produce 插件现状 + +### 2.1 已存在结构 + +当前插件目录:`backend/plugin/produce` + +已有基础骨架: + +- `app/adminapi/controller/ProduceController.php` +- `config/app.php` +- `config/info.php` +- `config/route.php` +- `resource/menu/admin.php` +- `resource/template/admin/api` +- `resource/template/admin/views/produce/index` +- `resource/template/admin/lang` + +### 2.2 缺失结构 + +以下目录当前基本为空,尚不足以承载 6 个业务模块: + +- `app/model` +- `app/dao` +- `app/service` +- `app/validate` +- `app/schema` +- `resource/database/migrations` + +结论:当前 `produce` 插件仍是示例骨架,复刻这 6 个模块时需要按插件标准完整补齐后端数据层、控制器、菜单、模板源前端。 + +## 3. 旧项目总体结构结论 + +### 3.1 旧前端页面模式 + +旧前端每个模块基本采用如下模式: + +- `index.vue` +- `data.ts` +- `modules/form.vue` + +技术模式为: + +- `VXE Grid` +- 手写查询表单 +- Drawer Form +- 手写列表请求与弹窗逻辑 + +不适合直接复制到当前项目。当前插件应改造为: + +- `BasicCrud` +- `schemas/index.tsx` +- `api/index.ts` +- 插件模板源目录开发 + +### 3.2 旧后端路由模式 + +旧后端集中在:`old/server/app/admin/route/produce.php` + +6 个目标模块在旧项目均有独立路由分组,说明旧项目对这 6 个模块是完整拆分的,不是页面层虚拟模块。 + +### 3.3 旧数据库来源 + +旧项目这 6 张核心表的建表信息没有体现在 `old/server/scripts/migrations` 目录的独立 PHP migration 中,核心定义主要在 SQL 安装脚本中: + +- `old/server/scripts/sql/install.sql` + +因此本次字段与索引参考,优先以: + +1. SQL 安装脚本 +2. Model fillable / casts / relation +3. DAO / Service 业务逻辑 +4. 旧前端页面字段 + +作为综合依据。 + +## 4. 六模块真实表与后端入口对照 + +| 模块 | 表名(Model) | 旧控制器 | 旧服务/DAO | 旧前端目录 | +|---|---|---|---|---| +| 工序管理 | `produce_process` | `ProduceProcessController` | `ProduceProcessService` / `ProduceProcessDao` | `old/web/src/views/produce/process` | +| 工序步骤 | `produce_process_step` | `ProduceProcessStepController` | `ProduceProcessStepService` / `ProduceProcessStepDao` | `old/web/src/views/produce/process-step` | +| 步骤状态 | `produce_step_status` | `ProduceStepStatusController` | `ProduceStepStatusService` / `ProduceStepStatusDao` | `old/web/src/views/produce/step-status` | +| 步骤关系 | `produce_step_relation` | `ProduceStepRelationController` | `ProduceStepRelationService` / `ProduceStepRelationDao` | `old/web/src/views/produce/step-relation` | +| 状态转换 | `produce_status_transition` | `ProduceStatusTransitionController` | `ProduceStatusTransitionService` / `ProduceStatusTransitionDao` | `old/web/src/views/produce/status-transition` | +| 转换日志 | `produce_transition_log` | `ProduceTransitionLogController` | `ProduceTransitionLogService` / `ProduceTransitionLogDao` | `old/web/src/views/produce/transition-log` | + +## 5. 模块依赖关系 + +这 6 个模块存在清晰的业务依赖链: + +1. `process` +2. `process-step` 依赖 `process` +3. `step-status` 依赖 `process-step` +4. `step-relation` 依赖 `process-step` +5. `status-transition` 依赖: + - `process-step` + - `step-status` +6. `transition-log` 依赖: + - `process-step` + - `step-status` + - `status-transition` + - 生产执行侧产生的数据 + +推荐开发顺序必须遵循该依赖链。 + +## 6. 六模块详细分析 + +### 6.1 工序管理 `process` + +#### 6.1.1 旧前端参考 + +目录:`old/web/src/views/produce/process` + +查询字段: + +- `LIKE_process_code` +- `LIKE_process_name` +- `status` + +列表字段: + +- `process_code` +- `process_name` +- `description` +- `step_count` +- `sort` +- `status` +- `created_date` + +表单字段: + +- `process_code` +- `process_name` +- `sort` +- `status` +- `description` + +#### 6.1.2 旧后端模型字段 + +模型:`old/server/app/common/model/produce/ProduceProcess.php` + +真实字段: + +- `id` +- `tenant_id` +- `process_code` +- `process_name` +- `description` +- `sort` +- `status` +- `step_count` +- `created_by` +- `updated_by` +- `created_at` +- `updated_at` +- `deleted_at` + +关系: + +- `steps()` -> `hasMany(ProduceProcessStep::class)` + +特殊点: + +- `step_count` 在模型中带有自动统计能力,不只是纯存储字段。 + +#### 6.1.3 SQL 参考 + +来源:`old/server/scripts/sql/install.sql` + +表:`ma_produce_process` + +关键约束: + +- 唯一索引:`uk_process_code(process_code, tenant_id, deleted_at)` +- 常规索引:`tenant_id`、`status`、`sort` + +#### 6.1.4 复杂度评估 + +- 复杂度:低 +- 适合作为第一个落地模块 + +#### 6.1.5 新插件建议 + +模块名建议:`process` + +后端应提供: + +- 标准 CRUD +- 下拉接口 `select/options` + +前端建议: + +- 标准 `BasicCrud` +- 保留查询项与排序、状态字段 + +--- + +### 6.2 工序步骤 `process-step` + +#### 6.2.1 旧前端参考 + +目录:`old/web/src/views/produce/process-step` + +查询字段: + +- `process_id` +- `LIKE_step_code` +- `LIKE_step_name` +- `status` + +列表字段: + +- `process_id`(实际显示工序名称) +- `step_code` +- `step_name` +- `description` +- `sort` +- `status` +- `created_date` + +表单字段: + +- `process_id` +- `step_code` +- `step_name` +- `sort` +- `status` +- `description` + +#### 6.2.2 旧后端模型字段 + +模型:`old/server/app/common/model/produce/ProduceProcessStep.php` + +真实字段: + +- `id` +- `tenant_id` +- `process_id` +- `step_code` +- `step_name` +- `description` +- `sort` +- `status` +- `prerequisite_steps` +- `prerequisite_mode` +- `prerequisite_require_final` +- `allow_repeat_scan` +- `repeat_scan_statuses` +- `created_by` +- `updated_by` +- `created_at` +- `updated_at` +- `deleted_at` + +casts: + +- `prerequisite_steps` => `array` +- `repeat_scan_statuses` => `array` +- `allow_repeat_scan` => `integer` +- `prerequisite_require_final` => `integer` + +关系: + +- `process()` -> `belongsTo(ProduceProcess::class)` + +#### 6.2.3 旧前端与真实后端差异 + +旧前端页面只展示了基础字段,但后端模型里还有生产执行相关能力字段: + +- 前置必要步骤 +- 前置步骤验证模式 +- 是否要求前置终态 +- 是否允许重复扫码 +- 哪些状态允许重复扫码 + +这说明: + +- 如果只按旧页面复刻,会丢失隐藏业务能力 +- 新插件应优先保留这些字段,只是可以分阶段决定首版是否全部开放 UI + +#### 6.2.4 SQL 参考 + +来源:`old/server/scripts/sql/install.sql` + +表:`ma_produce_process_step` + +关键约束: + +- 唯一索引:`uk_step_code(step_code, process_id, tenant_id, deleted_at)` +- 常规索引通常包括:`tenant_id`、`process_id`、`status`、`sort` + +#### 6.2.5 复杂度评估 + +- 复杂度:中 +- 依赖 `process` +- 基础 CRUD 不复杂,但完整业务字段不应忽略 + +#### 6.2.6 新插件建议 + +模块名建议:`process-step` + +建议分两阶段: + +第一阶段: + +- 工序下拉 +- 步骤编码/名称 +- 排序/状态/描述 + +第二阶段: + +- 前置步骤配置 +- 重复扫码控制 + +--- + +### 6.3 步骤状态 `step-status` + +#### 6.3.1 旧前端参考 + +目录:`old/web/src/views/produce/step-status` + +查询字段: + +- `step_id` +- `LIKE_status_code` +- `LIKE_status_name` +- `status` + +列表字段: + +- `step_id`(显示步骤名称) +- `status_code` +- `status_name` +- `is_initial` +- `is_final` +- `description` +- `sort` +- `status` +- `created_date` + +表单字段: + +- `step_id` +- `status_code` +- `status_name` +- `is_initial` +- `is_final` +- `sort` +- `status` +- `description` + +#### 6.3.2 旧后端模型字段 + +模型:`old/server/app/common/model/produce/ProduceStepStatus.php` + +真实字段: + +- `id` +- `tenant_id` +- `step_id` +- `status_code` +- `status_name` +- `is_initial` +- `is_final` +- `description` +- `sort` +- `status` +- `created_by` +- `updated_by` +- `created_at` +- `updated_at` +- `deleted_at` + +关系: + +- `step()` -> `belongsTo(ProduceProcessStep::class)` + +#### 6.3.3 SQL 参考 + +来源:`old/server/scripts/sql/install.sql` + +表:`ma_produce_step_status` + +典型业务含义: + +- `is_initial`:步骤初始状态 +- `is_final`:步骤终态 + +这是状态机基础数据,不应简化掉。 + +#### 6.3.4 复杂度评估 + +- 复杂度:中 +- 依赖 `process-step` +- 是状态转换模块的基础配置表 + +#### 6.3.5 新插件建议 + +模块名建议:`step-status` + +建议保留: + +- 所属步骤联动下拉 +- 初始/终态布尔字段 +- 基础启停状态 + +--- + +### 6.4 步骤关系 `step-relation` + +#### 6.4.1 旧前端参考 + +目录:`old/web/src/views/produce/step-relation` + +查询字段: + +- `from_step_id` +- `to_step_id` +- `relation_type` +- `status` + +列表字段: + +- `from_step_id`(显示源步骤名称) +- `to_step_id`(显示目标步骤名称) +- `relation_type` +- `priority` +- `flow_condition` +- `description` +- `sort` +- `status` +- `created_date` + +表单字段: + +- `from_step_id` +- `to_step_id` +- `relation_type` +- `priority` +- `flow_condition` +- `sort` +- `status` +- `description` + +关系类型枚举: + +- `normal` 正常流转 +- `exception` 异常流转 + +#### 6.4.2 旧后端模型 / DAO 参考 + +模型:`ProduceStepRelation` + +真实表:`produce_step_relation` + +DAO:`ProduceStepRelationDao` + +体现出的真实业务能力: + +- 支持按 `from_step_id` / `to_step_id` / `relation_type` 搜索 +- 支持按 `priority asc, sort asc` 排序 +- 提供 `getPreviousSteps(int $currentStepId)` 能力 + +这说明该模块不仅是配置关系,还直接用于生产流转路径判断。 + +#### 6.4.3 SQL 参考 + +来源:`old/server/scripts/sql/install.sql` + +表:`ma_produce_step_relation` + +真实字段: + +- `from_step_id` +- `to_step_id` +- `relation_type` +- `flow_condition`(JSON 文本) +- `priority` +- `description` +- `sort` +- `status` + +#### 6.4.4 复杂度评估 + +- 复杂度:中偏高 +- 核心复杂点在 `flow_condition` +- 仍可标准 CRUD 化 + +#### 6.4.5 新插件建议 + +模块名建议:`step-relation` + +前端首版可先: + +- 使用多行文本录入 JSON +- 列表中直接字符串展示 + +后续增强: + +- JSON 校验 +- 条件构造器 UI + +--- + +### 6.5 状态转换 `status-transition` + +#### 6.5.1 旧前端参考 + +目录:`old/web/src/views/produce/status-transition` + +查询字段: + +- `step_id` +- `trigger_event` +- `status` + +列表字段: + +- `step_id` +- `from_status_id` +- `to_status_id` +- `trigger_event` +- `transition_type` +- `auto_trigger` +- `priority` +- `description` +- `sort` +- `status` +- `created_date` + +表单字段: + +- `step_id` +- `from_status_id` +- `to_status_id` +- `trigger_event` +- `transition_type` +- `side_effect_type` +- `side_effect_config` +- `auto_trigger` +- `priority` +- `event_config` +- `sort` +- `status` +- `description` + +触发事件枚举: + +- `next_step_scan` +- `scan_trigger` +- `exception_trigger` +- `manual_trigger` +- `timer_trigger` +- `complete_trigger` + +转换类型枚举: + +- `primary` +- `side_effect` + +副作用类型枚举: + +- `log` +- `notify` +- `update_field` +- `trigger_event` + +#### 6.5.2 旧后端模型 / DAO 参考 + +模型:`ProduceStatusTransition` + +真实字段: + +- `step_id` +- `from_status_id` +- `to_status_id` +- `trigger_event` +- `event_config` +- `auto_trigger` +- `priority` +- `transition_type` +- `side_effect_type` +- `side_effect_config` +- `description` +- `sort` +- `status` + +关系: + +- `step()` +- `fromStatus()` +- `toStatus()` + +JSON 处理: + +- `event_config` 自动 JSON 编解码 +- `side_effect_config` 自动 JSON 编解码 + +DAO 体现出的业务能力: + +- `getAutoTransitionsByStep(stepId, fromStatusId)` +- `getAutoTransitions(stepId, fromStatusId, triggerEvent)` + +排序规则: + +- `priority desc` / `sort asc` + +说明: + +- 该模块不只是配置表,而是生产执行流程中的规则引擎核心 + +#### 6.5.3 SQL 参考 + +来源:`old/server/scripts/sql/install.sql` + +表:`ma_produce_status_transition` + +真实字段里已经明确包含: + +- `transition_type` +- `side_effect_type` +- `side_effect_config` +- `event_config` + +#### 6.5.4 复杂度评估 + +- 复杂度:高 +- 是 6 个模块里最复杂的配置模块 + +复杂来源: + +- 依赖步骤与步骤状态双层联动 +- 表单中有条件显示字段 +- 存在 JSON 配置字段 +- 影响实际状态机执行逻辑 + +#### 6.5.5 新插件建议 + +模块名建议:`status-transition` + +建议实现分两层: + +第一层: + +- 完整字段 CRUD +- 文本方式维护 JSON +- 步骤切换后刷新状态选项 + +第二层: + +- JSON 结构校验 +- 副作用配置器 +- 事件配置器 + +--- + +### 6.6 转换日志 `transition-log` + +#### 6.6.1 旧前端参考 + +目录:`old/web/src/views/produce/transition-log` + +查询字段: + +- `LIKE_work_order_no` +- `step_id` +- `trigger_event` +- `LIKE_trigger_user` +- `is_success` + +列表字段: + +- `work_order_no` +- `step_id` +- `from_status_id` +- `to_status_id` +- `trigger_event` +- `trigger_user` +- `is_auto` +- `is_success` +- `duration` +- `error_message` +- `created_date` + +操作: + +- 只有 `detail` + +#### 6.6.2 旧后端模型 / Service 参考 + +模型:`ProduceTransitionLog` + +真实字段: + +- `work_order_id` +- `work_order_no` +- `step_id` +- `transition_id` +- `from_status_id` +- `to_status_id` +- `trigger_event` +- `trigger_data` +- `trigger_user` +- `trigger_ip` +- `is_auto` +- `is_success` +- `error_message` +- `duration` +- `remark` +- `created_by` +- `created_at` + +特征: + +- `UPDATED_AT = null` +- `trigger_data` 自动 JSON 解码 +- 服务 `read()` 会加载: + - `step` + - `transition` + - `fromStatus` + - `toStatus` + +旧路由里还存在额外查询接口: + +- `work-order-history` +- `step-statistics` + +说明: + +- 该模块是典型只读日志模块 +- 不适合做标准新增/编辑/删除页面 + +#### 6.6.3 SQL 参考 + +来源:`old/server/scripts/sql/install.sql` + +表:`ma_produce_transition_log` + +关键字段: + +- `trigger_data` JSON +- `trigger_ip` +- `duration` +- `error_message` +- `remark` + +#### 6.6.4 复杂度评估 + +- 复杂度:中 +- 不是 CRUD 复杂,而是业务只读特征与统计扩展 + +#### 6.6.5 新插件建议 + +模块名建议:`transition-log` + +实现建议: + +- 列表页 + 详情页 +- 默认只读 +- 不开放新增/编辑/删除 +- 后续可补: + - 工单历史 + - 步骤统计 + +## 7. 推荐复刻顺序 + +必须按依赖顺序推进: + +1. `process` +2. `process-step` +3. `step-status` +4. `step-relation` +5. `status-transition` +6. `transition-log` + +推荐分阶段: + +### 第一阶段:基础主数据 + +- `process` +- `process-step` +- `step-status` + +### 第二阶段:流程规则 + +- `step-relation` +- `status-transition` + +### 第三阶段:只读日志 + +- `transition-log` + +## 8. 新插件目录落点建议 + +### 8.1 后端 + +建议新增如下结构: + +- `backend/plugin/produce/app/model/Process.php` 等 +- `backend/plugin/produce/app/dao/*` +- `backend/plugin/produce/app/service/admin/*` +- `backend/plugin/produce/app/validate/*` +- `backend/plugin/produce/app/schema/request/*` +- `backend/plugin/produce/app/schema/response/*` +- `backend/plugin/produce/app/adminapi/controller/*` +- `backend/plugin/produce/resource/database/migrations/*` + +建议 6 模块一一对应生成: + +- `Process` +- `ProcessStep` +- `StepStatus` +- `StepRelation` +- `StatusTransition` +- `TransitionLog` + +### 8.2 前端模板源 + +正式维护目录必须放在: + +- `backend/plugin/produce/resource/template/admin/api/index.ts` +- `backend/plugin/produce/resource/template/admin/views/produce/process/index.vue` +- `backend/plugin/produce/resource/template/admin/views/produce/process/schemas/index.tsx` +- `backend/plugin/produce/resource/template/admin/views/produce/process-step/index.vue` +- `backend/plugin/produce/resource/template/admin/views/produce/process-step/schemas/index.tsx` +- `backend/plugin/produce/resource/template/admin/views/produce/step-status/index.vue` +- `backend/plugin/produce/resource/template/admin/views/produce/step-status/schemas/index.tsx` +- `backend/plugin/produce/resource/template/admin/views/produce/step-relation/index.vue` +- `backend/plugin/produce/resource/template/admin/views/produce/step-relation/schemas/index.tsx` +- `backend/plugin/produce/resource/template/admin/views/produce/status-transition/index.vue` +- `backend/plugin/produce/resource/template/admin/views/produce/status-transition/schemas/index.tsx` +- `backend/plugin/produce/resource/template/admin/views/produce/transition-log/index.vue` +- `backend/plugin/produce/resource/template/admin/views/produce/transition-log/schemas/index.tsx` +- `backend/plugin/produce/resource/template/admin/lang/zh-cn/zh.json` +- `backend/plugin/produce/resource/template/admin/lang/en/en.json` + +安装后再复制到: + +- `frontend/admin/src/apps/produce/*` + +## 9. 菜单与权限建议 + +当前插件菜单 `backend/plugin/produce/resource/menu/admin.php` 只有一个示例菜单项,不能满足这 6 个模块。 + +建议调整为: + +- 根菜单:`生产管理` +- 子菜单: + - `工序管理` + - `工序步骤` + - `步骤状态` + - `步骤关系` + - `状态转换` + - `转换日志` + +权限码建议统一前缀: + +- `produce:process:*` +- `produce:process-step:*` +- `produce:step-status:*` +- `produce:step-relation:*` +- `produce:status-transition:*` +- `produce:transition-log:*` + +注意: + +- 日志模块建议只保留 `list/detail` 等只读权限 +- 不建议给 `create/edit/delete` + +## 10. 接口风格迁移建议 + +旧项目接口风格: + +- `/admin/produce/process/list` +- `/admin/produce/process/get/{id}` +- `/admin/produce/process/create` +- `/admin/produce/process/update/{id}` +- `/admin/produce/process/delete/{id}` + +新插件建议按当前项目标准 CRUD 控制器收敛,避免继续沿用旧式 `list/get/create/update/delete` 命名。 + +建议资源路径: + +- `/adminapi/produce/process` +- `/adminapi/produce/process-step` +- `/adminapi/produce/step-status` +- `/adminapi/produce/step-relation` +- `/adminapi/produce/status-transition` +- `/adminapi/produce/transition-log` + +附加只读接口可补: + +- 下拉选项接口 +- 状态联动接口 +- 日志统计接口 + +## 11. 风险与注意事项 + +### 11.1 旧前端不等于真实后端能力 + +最典型的是 `process-step`: + +旧页面未暴露: + +- 前置步骤数组 +- 前置验证模式 +- 重复扫码控制 + +但后端模型与 SQL 已经存在这些字段。 + +结论: + +- 不能只按旧页面抄字段 +- 应优先以 SQL + Model 为准 + +### 11.2 `status-transition` 是规则引擎核心 + +该模块不是普通配置表,DAO 已体现真实执行用途: + +- 获取自动转换规则 +- 按优先级执行 +- 依赖事件与状态 + +因此该模块开发时应把: + +- 数据正确性 +- JSON 配置合法性 +- 联动逻辑 + +放在比页面美化更高的优先级。 + +### 11.3 `transition-log` 是只读模块 + +不要把它误做成标准增删改查。 + +推荐: + +- 列表 +- 详情 +- 历史/统计扩展 + +### 11.4 迁移来源差异 + +旧项目这几张表的核心定义主要在 SQL 安装脚本,不在当前已检索到的 PHP migration 单文件中。 + +因此新插件开发时: + +- 迁移文件需要重新按当前项目规范补建 +- 不能直接依赖旧 `scripts/migrations` 目录复用 +- 但可以严格参考 `install.sql` 的字段与索引 + +## 12. 推荐实施计划 + +### 12.1 第一批落地 + +先完成: + +1. `process` +2. `process-step` +3. `step-status` + +交付标准: + +- 后端 CRUD 可运行 +- 菜单可访问 +- 模板源前端完成 +- 运行目录联调通过 + +### 12.2 第二批落地 + +再完成: + +4. `step-relation` +5. `status-transition` + +重点: + +- 规则字段 +- JSON 输入 +- 状态联动 + +### 12.3 第三批落地 + +最后完成: + +6. `transition-log` + +重点: + +- 列表 +- 详情 +- 历史/统计接口是否保留 + +## 13. 待确认事项 + +正式开始开发前,建议你确认以下内容: + +1. 插件显示名称是否确定为“生产管理” +2. 这 6 个模块是否全部进入一期 +3. `process-step` 的隐藏字段是否一期就开放 UI +4. `status-transition` 的 JSON 字段是否先用文本方式维护 +5. `transition-log` 是否确认只读 +6. 是否要把旧路由里的 `select`、`statistics`、`work-order-history` 一并纳入一期 +7. 数据库主键是否统一按当前项目雪花 ID 规范重建,而不是继续使用旧 AUTO_INCREMENT 风格 + +## 14. 结论 + +结论如下: + +1. `produce` 插件当前只是骨架,无法直接承接旧功能。 +2. 旧项目这 6 个模块具备完整前后端参考,可复刻。 +3. 复刻时应以 `install.sql + Model + DAO/Service` 为准,不能只照搬旧页面字段。 +4. 最推荐的首批实现是: + - `process` + - `process-step` + - `step-status` +5. `status-transition` 是业务核心,复杂度最高,应在基础模块稳定后实现。 +6. `transition-log` 应按只读日志模块实现,而不是标准 CRUD。 diff --git a/backend/plugin/produce/public/cover.png b/backend/plugin/produce/public/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..162b1b5bec8da930cf98fd71b33e5ccda8a6e81a GIT binary patch literal 375457 zcmeFZdpwlcA2@#IF{3dkF{VwI9mCX^hH?+7iIlrBs2NhCiO|iZqT5h*MXJ>pMQU=X z!O$2XR;7y)hGJ4Jsa8m8E3{j-%kMm+_VW4erQPrE_50_y@7?ICl4%eSNP63hA z1R6jasICf$-ss`8*cTlE?Tg-j4?lJ&KN_?f|8e{8d;iaq#_DzJS3|6cus(b>FFFL4 z`LGLnyVif#9ScYwY7(7kM-Mn6Mjw%JaY0 z1s4ENbr66rxAjkk&;5f(!g`gD3KozJ37r|A~1a5#^pc6a*yQkQvBqWG=E0aYKBOKqM5|gv29zkp0MEBo~n&mB>Y; z3Au$lKn9UlDnLbDg`}ddVyrS(#Zkpe#b0HON|ee@l@t}BO0G(&N{z}jm3EZ}Do<73 zU{$d?STfcaYln5l`e8$`o3J~v`>25&h<$;5kJH3W#m&Om;#_bXTqte} z?kk)ScM?~DtH<5K_2Pb1RaGUa&Q!Hlbynr7hO2H<-KUzPdRnzk^`>f%>Z@_%#!VhK zYn=T!uW_r!#fvpTaTmt5jq4rv8n2H35^siIjQ7W{$0y>2_#*syd>g(W|FfEw z8dc3!%}Z^yTAbPewS2W2wN|xWwVw$S2{Q@y1YbfpA%Sq1P)evLbPE8Cs57tF(4% zWouPy-PU?FQD>s*M6ZeKChnV9H1Ybx$J*nxXJ|WVuh!n9ou_?SyGKVw$3VwXCq!qr zPQFgPPA^fFIFsl?3@4@%ONcGR7rNTI7P?Dyx9Vo=p3{9mQX$PCxsW1B2S_qf2WfQD zv`Gsm@h0t^R640`(obJZ`GWZc?~9Z#PJeOhi_yvC$xf3aCVw-zYVtijtR7v@TW^cr zF}-@dr&EYi?52cFNtq&>^4(NqDt#(@>b9wQQ=6y0nl^pfl4%>K9hr7{+SBQz>CEZj z(*@JdPapVF=gawDuKiN*<%KVwkafum$&uv4Dy? z8M%zx#u~;8jW-(?8$UE5nYf!InpBzmFxzmp|LkvOUz`1Yj^&)lIr(!sO|?y3O%qLP zOoz z!v4X0^8BFrqWKRN=r35cAa}v{Oata>=1FG%LZgM@3ndGGaG2u|c8vNArvIyR>w|(&bAFm;SVD(X#Yq4>+?qJ2*{TJ?>iW zS^shVOZ`v!zY1^)$O!0NZn^xccoo6IQNTSssK7S{76k^mdik zs@zqtf?a}-2EPb#49N@`T+Li9SUteA=cV)d*VwN~U-LNBKJ-xNK-hvXVc65Pj%%~l zz6^H`KOX*5gjd9=h!2s=B2TZwuM1jNy@x@r&aNwqdu0 zY`e5we|y6AhdUPTII$D6GkE8vT?V`M?CRw&;foUp2@whM#5sxSi6gt0?XKA~Z4ZA> zPtua4;;+Vk74_BaukF4*o{UXio7}S3eD9IH?^9N%G^Wl;6{f!37qYK0%{1+B+K2sX z_O~3cI&kcu>cRB~JHA=)jW~T`dVG4%A&*0q00Y& zM+}b~Jn}XxEbCUbL-y&TQ;+UF`cuy8oVH`kW2MKZ9Zx+zDq1VLb7IMf%G?>b!aUWy z&3S$KOY^T4%q=K9sdqB<;79A)?ierlhB+Df?N*0xzEj2DZ zahh~GRSKlB(kEp>WgRj%*`@Ni<)vq+XO33rRHRg5D&s0&RE1SNILkeIv)Z-#QjJ|r z#kVHko~qTa%|54l?!bA%`90@9T!_E$s%~T5(~F@OdoHcK)One6S#ibtN=v<4eZ$qo zS1(^%c(;Y3Y;M%toOknl+k&=> z?Tgy4DqIvzw>)p%?C|Tjb9?#i2X|KAd3-nW?#u5sfA@1IzYEuua!>1?uzPBE?tP>C zryp27IQMYT!{+aOzVGY_=^1`U ze|drb@&fPPF}1L;_;RL={amwoCgv7q=pYz1 zH8l-&jW0Aczc7QTShIf&A1;B3czpZ>pn{65uu<7N

    UI4-#ow~25uycK>%4D6X&BaAZh=eW1Jaw! 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

    sg+5x|JTg7qFgE*ru>G5>K4W9| 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%0D#nxFkkAVlqZiA-!(ulE=)>x^3f^1A_ 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

    # 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

    @GW9Rl@^Hp*`6qzNzL;9n6hMc$PGnt{ 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 C!uiDj literal 0 HcmV?d00001 diff --git a/backend/plugin/produce/public/icon.png b/backend/plugin/produce/public/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b3430bed272247cba67e30ffb1f57c67310694b9 GIT binary patch literal 29219 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 P{(-5hXe$?8unhP=x1J4; literal 0 HcmV?d00001 diff --git a/backend/plugin/produce/resource/database/migrations/.gitkeep b/backend/plugin/produce/resource/database/migrations/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/backend/plugin/produce/resource/database/migrations/2026_07_30_000001_create_produce_basic_tables.php b/backend/plugin/produce/resource/database/migrations/2026_07_30_000001_create_produce_basic_tables.php new file mode 100644 index 0000000..bf09874 --- /dev/null +++ b/backend/plugin/produce/resource/database/migrations/2026_07_30_000001_create_produce_basic_tables.php @@ -0,0 +1,144 @@ +hasTable('produce_process')) { + $schema->create('produce_process', function (Blueprint $table) { + $table->bigInteger('id')->primary()->comment('主键ID'); + $table->string('process_code', 50)->comment('工序编码'); + $table->string('process_name', 100)->comment('工序名称'); + $table->text('description')->nullable()->comment('工序描述'); + $table->integer('sort')->default(0)->comment('排序'); + $table->tinyInteger('status')->default(1)->comment('状态:1启用,0禁用'); + $table->integer('step_count')->default(0)->comment('步骤数'); + $table->bigInteger('created_by')->nullable()->comment('创建人ID'); + $table->bigInteger('updated_by')->nullable()->comment('更新人ID'); + $table->bigInteger('created_at')->nullable()->comment('创建时间'); + $table->bigInteger('updated_at')->nullable()->comment('更新时间'); + $table->bigInteger('deleted_at')->nullable()->comment('删除时间'); + $table->unique(['process_code', 'deleted_at'], 'uk_process_code'); + $table->index('status', 'idx_status'); + $table->index('sort', 'idx_sort'); + }); + } + + if (!$schema->hasTable('produce_process_step')) { + $schema->create('produce_process_step', function (Blueprint $table) { + $table->bigInteger('id')->primary()->comment('主键ID'); + $table->bigInteger('process_id')->comment('工序ID'); + $table->string('step_code', 50)->comment('步骤编码'); + $table->string('step_name', 100)->comment('步骤名称'); + $table->text('description')->nullable()->comment('步骤描述'); + $table->integer('sort')->default(0)->comment('排序'); + $table->tinyInteger('status')->default(1)->comment('状态:1启用,0禁用'); + $table->json('prerequisite_steps')->nullable()->comment('前置必要步骤ID数组'); + $table->string('prerequisite_mode', 20)->default('all')->comment('前置步骤验证模式:all=全部完成,any=任意完成,none=无需验证'); + $table->tinyInteger('prerequisite_require_final')->default(1)->comment('前置步骤是否要求终态:0否1是'); + $table->tinyInteger('allow_repeat_scan')->default(0)->comment('是否允许重复扫码:0否1是'); + $table->json('repeat_scan_statuses')->nullable()->comment('允许重复扫码的状态数组'); + $table->bigInteger('created_by')->nullable()->comment('创建人ID'); + $table->bigInteger('updated_by')->nullable()->comment('更新人ID'); + $table->bigInteger('created_at')->nullable()->comment('创建时间'); + $table->bigInteger('updated_at')->nullable()->comment('更新时间'); + $table->bigInteger('deleted_at')->nullable()->comment('删除时间'); + $table->unique(['step_code', 'process_id', 'deleted_at'], 'uk_step_code'); + $table->index('process_id', 'idx_process_id'); + $table->index('status', 'idx_status'); + $table->index('sort', 'idx_sort'); + }); + } + + if (!$schema->hasTable('produce_step_status')) { + $schema->create('produce_step_status', function (Blueprint $table) { + $table->bigInteger('id')->primary()->comment('主键ID'); + $table->bigInteger('step_id')->comment('所属步骤ID'); + $table->string('status_code', 50)->comment('状态编码'); + $table->string('status_name', 100)->comment('状态名称'); + $table->tinyInteger('is_initial')->default(0)->comment('是否初始状态:0否1是'); + $table->tinyInteger('is_final')->default(0)->comment('是否终态:0否1是'); + $table->text('description')->nullable()->comment('状态描述'); + $table->integer('sort')->default(0)->comment('排序'); + $table->tinyInteger('status')->default(1)->comment('状态:0禁用1启用'); + $table->bigInteger('created_by')->nullable()->comment('创建人'); + $table->bigInteger('updated_by')->nullable()->comment('更新人'); + $table->bigInteger('created_at')->nullable()->comment('创建时间'); + $table->bigInteger('updated_at')->nullable()->comment('更新时间'); + $table->bigInteger('deleted_at')->nullable()->comment('删除时间'); + $table->unique(['step_id', 'status_code', 'deleted_at'], 'uk_step_status_code'); + $table->index('step_id', 'idx_step_id'); + $table->index('status', 'idx_status'); + $table->index('sort', 'idx_sort'); + $table->index('deleted_at', 'idx_deleted_at'); + }); + } + + if (!$schema->hasTable('produce_step_relation')) { + $schema->create('produce_step_relation', function (Blueprint $table) { + $table->bigInteger('id')->primary()->comment('主键ID'); + $table->bigInteger('from_step_id')->comment('源步骤ID'); + $table->bigInteger('to_step_id')->comment('目标步骤ID'); + $table->string('relation_type', 20)->default('normal')->comment('关系类型:normal-正常流转,exception-异常流转'); + $table->text('flow_condition')->nullable()->comment('流转条件(JSON格式)'); + $table->integer('priority')->default(0)->comment('优先级(数字越小优先级越高)'); + $table->text('description')->nullable()->comment('描述'); + $table->integer('sort')->default(0)->comment('排序'); + $table->tinyInteger('status')->default(1)->comment('状态:0-禁用,1-启用'); + $table->bigInteger('created_by')->nullable()->comment('创建人'); + $table->bigInteger('updated_by')->nullable()->comment('更新人'); + $table->bigInteger('created_at')->nullable()->comment('创建时间'); + $table->bigInteger('updated_at')->nullable()->comment('更新时间'); + $table->bigInteger('deleted_at')->nullable()->comment('删除时间'); + $table->unique(['from_step_id', 'to_step_id', 'relation_type', 'deleted_at'], 'uk_step_relation'); + $table->index('from_step_id', 'idx_from_step_id'); + $table->index('to_step_id', 'idx_to_step_id'); + $table->index('relation_type', 'idx_relation_type'); + $table->index('status', 'idx_status'); + $table->index('priority', 'idx_priority'); + $table->index('deleted_at', 'idx_deleted_at'); + }); + } + + if (!$schema->hasTable('produce_status_transition')) { + $schema->create('produce_status_transition', function (Blueprint $table) { + $table->bigInteger('id')->primary()->comment('主键ID'); + $table->bigInteger('step_id')->comment('所属步骤ID'); + $table->bigInteger('from_status_id')->comment('源状态ID'); + $table->bigInteger('to_status_id')->comment('目标状态ID'); + $table->string('trigger_event', 100)->comment('触发事件'); + $table->text('event_config')->nullable()->comment('事件配置(JSON)'); + $table->tinyInteger('auto_trigger')->default(0)->comment('是否自动触发:0否1是'); + $table->integer('priority')->default(0)->comment('优先级(数字越大优先级越高)'); + $table->string('transition_type', 20)->default('primary')->comment('转换类型:primary-主转换,side_effect-副作用'); + $table->string('side_effect_type', 50)->nullable()->comment('副作用类型'); + $table->text('side_effect_config')->nullable()->comment('副作用配置(JSON)'); + $table->text('description')->nullable()->comment('描述'); + $table->integer('sort')->default(0)->comment('排序'); + $table->tinyInteger('status')->default(1)->comment('状态:0禁用1启用'); + $table->bigInteger('created_by')->nullable()->comment('创建人'); + $table->bigInteger('updated_by')->nullable()->comment('更新人'); + $table->bigInteger('created_at')->nullable()->comment('创建时间'); + $table->bigInteger('updated_at')->nullable()->comment('更新时间'); + $table->bigInteger('deleted_at')->nullable()->comment('删除时间'); + $table->index('step_id', 'idx_step_id'); + $table->index('from_status_id', 'idx_from_status_id'); + $table->index('to_status_id', 'idx_to_status_id'); + $table->index('trigger_event', 'idx_trigger_event'); + $table->index('status', 'idx_status'); + $table->index('deleted_at', 'idx_deleted_at'); + }); + } + } + + public function down(Builder $schema): void + { + $schema->dropIfExists('produce_status_transition'); + $schema->dropIfExists('produce_step_relation'); + $schema->dropIfExists('produce_step_status'); + $schema->dropIfExists('produce_process_step'); + $schema->dropIfExists('produce_process'); + } +}; diff --git a/backend/plugin/produce/resource/database/migrations/2026_07_31_000002_create_produce_transition_log_table.php b/backend/plugin/produce/resource/database/migrations/2026_07_31_000002_create_produce_transition_log_table.php new file mode 100644 index 0000000..63232ff --- /dev/null +++ b/backend/plugin/produce/resource/database/migrations/2026_07_31_000002_create_produce_transition_log_table.php @@ -0,0 +1,51 @@ +hasTable('produce_transition_log')) { + $schema->create('produce_transition_log', function (Blueprint $table) { + $table->bigInteger('id')->primary()->comment('主键ID'); + $table->bigInteger('work_order_id')->nullable()->comment('工单ID'); + $table->string('work_order_no', 100)->nullable()->comment('工单编号'); + $table->bigInteger('step_id')->comment('所属步骤ID'); + $table->bigInteger('transition_id')->nullable()->comment('转换规则ID'); + $table->bigInteger('from_status_id')->comment('源状态ID'); + $table->bigInteger('to_status_id')->comment('目标状态ID'); + $table->string('trigger_event', 100)->comment('触发事件'); + $table->text('trigger_data')->nullable()->comment('触发数据(JSON)'); + $table->string('trigger_user', 100)->nullable()->comment('触发用户'); + $table->string('trigger_ip', 50)->nullable()->comment('触发IP'); + $table->tinyInteger('is_auto')->default(0)->comment('是否自动触发:0否1是'); + $table->tinyInteger('is_success')->default(1)->comment('是否成功:0失败1成功'); + $table->text('error_message')->nullable()->comment('错误信息'); + $table->integer('duration')->default(0)->comment('执行时长(毫秒)'); + $table->text('remark')->nullable()->comment('备注'); + $table->bigInteger('created_by')->nullable()->comment('创建人ID'); + $table->bigInteger('created_at')->nullable()->comment('创建时间'); + $table->bigInteger('deleted_at')->nullable()->comment('删除时间'); + + $table->index('work_order_id', 'idx_work_order_id'); + $table->index('work_order_no', 'idx_work_order_no'); + $table->index('step_id', 'idx_step_id'); + $table->index('transition_id', 'idx_transition_id'); + $table->index('from_status_id', 'idx_from_status_id'); + $table->index('to_status_id', 'idx_to_status_id'); + $table->index('trigger_event', 'idx_trigger_event'); + $table->index('is_success', 'idx_is_success'); + $table->index('created_at', 'idx_created_at'); + $table->index('deleted_at', 'idx_deleted_at'); + }); + } + } + + public function down(Builder $schema): void + { + $schema->dropIfExists('produce_transition_log'); + } +}; diff --git a/backend/plugin/produce/resource/database/migrations/2026_07_31_000003_create_produce_config_and_scan_data_tables.php b/backend/plugin/produce/resource/database/migrations/2026_07_31_000003_create_produce_config_and_scan_data_tables.php new file mode 100644 index 0000000..aceb27b --- /dev/null +++ b/backend/plugin/produce/resource/database/migrations/2026_07_31_000003_create_produce_config_and_scan_data_tables.php @@ -0,0 +1,94 @@ +hasTable('produce_config')) { + $schema->create('produce_config', function (Blueprint $table) { + $table->bigInteger('id')->primary()->comment('主键ID'); + $table->string('group_code', 64)->comment('配置组代码'); + $table->string('code', 64)->comment('配置代码'); + $table->string('name', 255)->comment('配置名称'); + $table->text('content')->nullable()->comment('配置内容'); + $table->integer('sort')->default(0)->comment('排序'); + $table->text('remark')->nullable()->comment('备注'); + $table->bigInteger('created_by')->nullable()->comment('创建人ID'); + $table->bigInteger('updated_by')->nullable()->comment('更新人ID'); + $table->bigInteger('created_at')->nullable()->comment('创建时间'); + $table->bigInteger('updated_at')->nullable()->comment('更新时间'); + $table->bigInteger('deleted_at')->nullable()->comment('删除时间'); + + $table->unique(['group_code', 'code', 'deleted_at'], 'uk_group_code_code'); + $table->index('group_code', 'idx_group_code'); + $table->index('sort', 'idx_sort'); + $table->index('deleted_at', 'idx_deleted_at'); + }); + } + + if (!$schema->hasTable('produce_specific_rule')) { + $schema->create('produce_specific_rule', function (Blueprint $table) { + $table->bigInteger('id')->primary()->comment('主键ID'); + $table->string('rule_name', 255)->comment('规则名称'); + $table->text('rule_pattern')->comment('规则表达式'); + $table->tinyInteger('rule_type')->default(1)->comment('规则类型'); + $table->tinyInteger('is_enabled')->default(1)->comment('是否启用:0否1是'); + $table->json('step_ids')->nullable()->comment('关联步骤ID数组'); + $table->integer('sort')->default(0)->comment('排序'); + $table->text('remark')->nullable()->comment('备注'); + $table->bigInteger('created_by')->nullable()->comment('创建人ID'); + $table->bigInteger('updated_by')->nullable()->comment('更新人ID'); + $table->bigInteger('created_at')->nullable()->comment('创建时间'); + $table->bigInteger('updated_at')->nullable()->comment('更新时间'); + $table->bigInteger('deleted_at')->nullable()->comment('删除时间'); + + $table->index('rule_name', 'idx_rule_name'); + $table->index('rule_type', 'idx_rule_type'); + $table->index('is_enabled', 'idx_is_enabled'); + $table->index('sort', 'idx_sort'); + $table->index('deleted_at', 'idx_deleted_at'); + }); + } + + if (!$schema->hasTable('produce_scan_data')) { + $schema->create('produce_scan_data', function (Blueprint $table) { + $table->bigInteger('id')->primary()->comment('主键ID'); + $table->string('order_no', 100)->comment('订单号'); + $table->string('user_code', 50)->comment('用户编码'); + $table->string('operator', 100)->nullable()->comment('操作人员'); + $table->bigInteger('operator_id')->nullable()->comment('操作人员ID'); + $table->bigInteger('process_id')->comment('工序ID'); + $table->bigInteger('step_id')->comment('步骤ID'); + $table->bigInteger('status_id')->nullable()->comment('步骤状态ID'); + $table->tinyInteger('scan_result')->default(1)->comment('扫码结果:0失败1成功'); + $table->bigInteger('scan_time')->nullable()->comment('扫码时间'); + $table->text('remark')->nullable()->comment('备注'); + $table->bigInteger('created_by')->nullable()->comment('创建人ID'); + $table->bigInteger('updated_by')->nullable()->comment('更新人ID'); + $table->bigInteger('created_at')->nullable()->comment('创建时间'); + $table->bigInteger('updated_at')->nullable()->comment('更新时间'); + $table->bigInteger('deleted_at')->nullable()->comment('删除时间'); + + $table->index('order_no', 'idx_order_no'); + $table->index('user_code', 'idx_user_code'); + $table->index('process_id', 'idx_process_id'); + $table->index('step_id', 'idx_step_id'); + $table->index('status_id', 'idx_status_id'); + $table->index('scan_result', 'idx_scan_result'); + $table->index('scan_time', 'idx_scan_time'); + $table->index('deleted_at', 'idx_deleted_at'); + }); + } + } + + public function down(Builder $schema): void + { + $schema->dropIfExists('produce_scan_data'); + $schema->dropIfExists('produce_specific_rule'); + $schema->dropIfExists('produce_config'); + } +}; diff --git a/backend/plugin/produce/resource/database/migrations/2026_08_06_000001_create_produce_product_record_table.php b/backend/plugin/produce/resource/database/migrations/2026_08_06_000001_create_produce_product_record_table.php new file mode 100644 index 0000000..82e7783 --- /dev/null +++ b/backend/plugin/produce/resource/database/migrations/2026_08_06_000001_create_produce_product_record_table.php @@ -0,0 +1,49 @@ +hasTable('produce_product_record')) { + $schema->create('produce_product_record', function (Blueprint $table) { + $table->bigInteger('id')->primary()->comment('主键ID'); + $table->string('process_order_no', 100)->comment('加工单号'); + $table->string('product_code', 100)->comment('商品编码'); + $table->integer('quantity')->default(1)->comment('数量'); + $table->bigInteger('process_id')->nullable()->comment('工序ID'); + $table->bigInteger('step_id')->nullable()->comment('步骤ID'); + $table->bigInteger('status_id')->nullable()->comment('状态ID'); + $table->string('user_code', 50)->nullable()->comment('用户编码'); + $table->string('operator', 100)->nullable()->comment('操作人员'); + $table->bigInteger('operator_id')->nullable()->comment('操作人员ID'); + $table->tinyInteger('scan_result')->default(1)->comment('扫码结果:0失败1成功'); + $table->text('remark')->nullable()->comment('备注'); + $table->bigInteger('created_by')->nullable()->comment('创建人ID'); + $table->bigInteger('updated_by')->nullable()->comment('更新人ID'); + $table->bigInteger('created_at')->nullable()->comment('创建时间'); + $table->bigInteger('updated_at')->nullable()->comment('更新时间'); + $table->bigInteger('deleted_at')->nullable()->comment('删除时间'); + + $table->index('process_order_no', 'idx_process_order_no'); + $table->index('product_code', 'idx_product_code'); + $table->index('process_id', 'idx_process_id'); + $table->index('step_id', 'idx_step_id'); + $table->index('status_id', 'idx_status_id'); + $table->index('user_code', 'idx_user_code'); + $table->index('operator_id', 'idx_operator_id'); + $table->index('scan_result', 'idx_scan_result'); + $table->index('created_at', 'idx_created_at'); + $table->index('deleted_at', 'idx_deleted_at'); + }); + } + } + + public function down(Builder $schema): void + { + $schema->dropIfExists('produce_product_record'); + } +}; diff --git a/backend/plugin/produce/resource/database/migrations/2026_08_07_000001_add_mode_fields_to_produce_specific_rule_table.php b/backend/plugin/produce/resource/database/migrations/2026_08_07_000001_add_mode_fields_to_produce_specific_rule_table.php new file mode 100644 index 0000000..7d1e5e8 --- /dev/null +++ b/backend/plugin/produce/resource/database/migrations/2026_08_07_000001_add_mode_fields_to_produce_specific_rule_table.php @@ -0,0 +1,53 @@ +hasTable('produce_specific_rule')) { + return; + } + + $hasApplyMode = $schema->hasColumn('produce_specific_rule', 'apply_mode'); + $hasMatchField = $schema->hasColumn('produce_specific_rule', 'match_field'); + if ($hasApplyMode && $hasMatchField) { + return; + } + + $schema->table('produce_specific_rule', function (Blueprint $table) use ($hasApplyMode, $hasMatchField) { + if (!$hasApplyMode) { + $table->string('apply_mode', 20)->default('order')->after('rule_type')->comment('适用模式:order订单 machine整机 both全部'); + } + if (!$hasMatchField) { + $table->string('match_field', 30)->default('order_no')->after('apply_mode')->comment('匹配字段:order_no process_order_no product_code user_code'); + } + }); + } + + public function down(Builder $schema): void + { + if (!$schema->hasTable('produce_specific_rule')) { + return; + } + + $hasApplyMode = $schema->hasColumn('produce_specific_rule', 'apply_mode'); + $hasMatchField = $schema->hasColumn('produce_specific_rule', 'match_field'); + if (!$hasApplyMode && !$hasMatchField) { + return; + } + + $schema->table('produce_specific_rule', function (Blueprint $table) use ($hasApplyMode, $hasMatchField) { + if ($hasMatchField) { + $table->dropColumn('match_field'); + } + if ($hasApplyMode) { + $table->dropColumn('apply_mode'); + } + }); + } +}; diff --git a/backend/plugin/produce/resource/database/migrations/2026_08_12_000001_create_produce_exception_tables.php b/backend/plugin/produce/resource/database/migrations/2026_08_12_000001_create_produce_exception_tables.php new file mode 100644 index 0000000..91e8a27 --- /dev/null +++ b/backend/plugin/produce/resource/database/migrations/2026_08_12_000001_create_produce_exception_tables.php @@ -0,0 +1,136 @@ +hasTable('produce_exception_setting')) { + $createdExceptionSettingTable = true; + $schema->create('produce_exception_setting', function (Blueprint $table) { + $table->bigInteger('id')->primary()->comment('主键ID'); + $table->bigInteger('parent_id')->nullable()->comment('父级ID'); + $table->string('setting_type', 20)->comment('设置类型:type处理类型、reason异常原因、issue具体问题'); + $table->string('code', 64)->comment('设置编码'); + $table->string('name', 100)->comment('设置名称'); + $table->integer('sort')->default(0)->comment('排序,值越小越靠前'); + $table->tinyInteger('is_enabled')->default(1)->comment('是否启用:0否1是'); + $table->text('remark')->nullable()->comment('备注'); + $table->bigInteger('created_by')->nullable()->comment('创建人ID'); + $table->bigInteger('updated_by')->nullable()->comment('更新人ID'); + $table->bigInteger('created_at')->nullable()->comment('创建时间'); + $table->bigInteger('updated_at')->nullable()->comment('更新时间'); + $table->bigInteger('deleted_at')->nullable()->comment('删除时间'); + + $table->unique(['parent_id', 'code', 'deleted_at'], 'uk_exception_setting_parent_code'); + $table->index('setting_type', 'idx_exception_setting_type'); + $table->index('parent_id', 'idx_exception_setting_parent'); + $table->index(['is_enabled', 'sort'], 'idx_exception_setting_enabled_sort'); + $table->index('deleted_at', 'idx_exception_setting_deleted'); + }); + } + + if ($createdExceptionSettingTable) { + $this->seedExceptionSettings($schema); + } + + if (!$schema->hasTable('produce_exception_record')) { + $schema->create('produce_exception_record', function (Blueprint $table) { + $table->bigInteger('id')->primary()->comment('主键ID'); + $table->string('order_no', 100)->comment('单号或条码'); + $table->string('user_code', 50)->nullable()->comment('提报人工号'); + $table->string('reporter', 100)->nullable()->comment('提报人'); + $table->bigInteger('reporter_id')->nullable()->comment('提报人ID'); + $table->bigInteger('type_id')->nullable()->comment('处理类型设置ID'); + $table->string('type_code', 64)->comment('处理类型编码'); + $table->string('type_name', 100)->comment('处理类型名称'); + $table->bigInteger('reason_id')->nullable()->comment('异常原因设置ID'); + $table->string('reason_code', 64)->comment('异常原因编码'); + $table->string('reason_name', 100)->comment('异常原因名称'); + $table->bigInteger('issue_id')->nullable()->comment('具体问题设置ID'); + $table->string('issue_code', 64)->nullable()->comment('具体问题编码'); + $table->string('issue_name', 100)->nullable()->comment('具体问题名称'); + $table->json('images')->nullable()->comment('现场图片'); + $table->text('remark')->nullable()->comment('补充说明'); + $table->tinyInteger('status')->default(0)->comment('处理状态:0待处理1处理中2已处理'); + $table->string('handler', 100)->nullable()->comment('处理人'); + $table->bigInteger('handler_id')->nullable()->comment('处理人ID'); + $table->bigInteger('handled_at')->nullable()->comment('处理时间'); + $table->bigInteger('reported_at')->nullable()->comment('提报时间'); + $table->bigInteger('created_by')->nullable()->comment('创建人ID'); + $table->bigInteger('updated_by')->nullable()->comment('更新人ID'); + $table->bigInteger('created_at')->nullable()->comment('创建时间'); + $table->bigInteger('updated_at')->nullable()->comment('更新时间'); + $table->bigInteger('deleted_at')->nullable()->comment('删除时间'); + + $table->index('order_no', 'idx_exception_record_order_no'); + $table->index('user_code', 'idx_exception_record_user_code'); + $table->index('type_code', 'idx_exception_record_type_code'); + $table->index('reason_code', 'idx_exception_record_reason_code'); + $table->index('issue_code', 'idx_exception_record_issue_code'); + $table->index('status', 'idx_exception_record_status'); + $table->index('reported_at', 'idx_exception_record_reported_at'); + $table->index('deleted_at', 'idx_exception_record_deleted'); + }); + } + } + + private function seedExceptionSettings(Builder $schema): void + { + $timestamp = time(); + $rows = []; + $add = static function (?string $parentId, string $type, string $code, string $name, int $sort) use (&$rows, $timestamp): string { + $id = (string) Snowflake::generate(); + $rows[] = [ + 'id' => $id, + 'parent_id' => $parentId, + 'setting_type' => $type, + 'code' => $code, + 'name' => $name, + 'sort' => $sort, + 'is_enabled' => 1, + 'created_at' => $timestamp, + 'updated_at' => $timestamp, + ]; + return $id; + }; + + $repairTypeId = $add(null, 'type', 'defective_repair', '不良维修', 1); + $returnTypeId = $add(null, 'type', 'return_reconfigure', '退料重配', 2); + $testReasonId = $add($repairTypeId, 'reason', 'test_defect', '测试不良', 1); + $agingReasonId = $add($repairTypeId, 'reason', 'aging_defect', '老化不良', 2); + + foreach ([ + ['configuration_error', '配置错误'], + ['order_review_error', '审单错误'], + ['picking_error', '配货错误'], + ['order_change', '改单'], + ['return_refund', '退货退款'], + ] as $sort => [$code, $name]) { + $add($returnTypeId, 'reason', $code, $name, $sort + 1); + } + + $testIssues = ['不亮', '不进', '不通电', '死机', '卡logo', '机箱风扇不良', 'USB接口不良', '面板LED异常', '异响', '少配件', '配置不符', '风扇灯光异常', '机箱不良', '炸电源', '水冷坏', '声卡异常', '网卡异常', '不读硬盘', '硬盘超时', '掉盘', '机械格式化失败', '硬盘坏', '硬盘容量不对', '掉驱动', '打不上驱动', '不断电', '不认无线', '内存不识别', '闪屏', '断电', '花屏', '烤黑', '高温', '短路', '蓝屏', 'AIDA红', '烤断电', '灰屏', '烤机重启', '卡顿', '机械共振', '烤机使用核显', 'CPU主频低', '自动重启', '显存不符']; + foreach ($testIssues as $sort => $name) { + $add($testReasonId, 'issue', 'test_issue_' . str_pad((string) ($sort + 1), 2, '0', STR_PAD_LEFT), $name, $sort + 1); + } + + $agingIssues = ['烤花屏', '烤黑屏', 'CPU高温', '显卡高温', '烤蓝屏', 'AIDA红', '烤断电', '烤灰屏', '烤重启', '烤机使用核显', 'CPU主频低', '显卡掉帧', '掉驱动']; + foreach ($agingIssues as $sort => $name) { + $add($agingReasonId, 'issue', 'aging_issue_' . str_pad((string) ($sort + 1), 2, '0', STR_PAD_LEFT), $name, $sort + 1); + } + + $schema->getConnection()->table('produce_exception_setting')->insert($rows); + } + + public function down(Builder $schema): void + { + $schema->dropIfExists('produce_exception_record'); + $schema->dropIfExists('produce_exception_setting'); + } +}; diff --git a/backend/plugin/produce/resource/database/migrations/2026_08_13_000001_create_produce_material_tables.php b/backend/plugin/produce/resource/database/migrations/2026_08_13_000001_create_produce_material_tables.php new file mode 100644 index 0000000..4a206f6 --- /dev/null +++ b/backend/plugin/produce/resource/database/migrations/2026_08_13_000001_create_produce_material_tables.php @@ -0,0 +1,51 @@ +hasTable('produce_material_category')) { + $schema->create('produce_material_category', function (Blueprint $table) { + $table->bigInteger('id')->primary()->comment('主键ID'); + $table->string('category_name', 100)->comment('分类名称'); + $table->bigInteger('created_by')->nullable()->comment('创建人ID'); + $table->bigInteger('updated_by')->nullable()->comment('更新人ID'); + $table->bigInteger('created_at')->nullable()->comment('创建时间'); + $table->bigInteger('updated_at')->nullable()->comment('更新时间'); + $table->bigInteger('deleted_at')->nullable()->comment('删除时间'); + + $table->unique('category_name', 'uk_material_category_name'); + $table->index('deleted_at', 'idx_material_category_deleted_at'); + }); + } + + if (!$schema->hasTable('produce_material')) { + $schema->create('produce_material', function (Blueprint $table) { + $table->bigInteger('id')->primary()->comment('主键ID'); + $table->bigInteger('category_id')->nullable()->comment('分类ID'); + $table->string('product_code', 100)->comment('商品编码'); + $table->string('product_name', 200)->comment('商品名称'); + $table->bigInteger('created_by')->nullable()->comment('创建人ID'); + $table->bigInteger('updated_by')->nullable()->comment('更新人ID'); + $table->bigInteger('created_at')->nullable()->comment('创建时间'); + $table->bigInteger('updated_at')->nullable()->comment('更新时间'); + $table->bigInteger('deleted_at')->nullable()->comment('删除时间'); + + $table->unique('product_code', 'uk_material_product_code'); + $table->index('category_id', 'idx_material_category_id'); + $table->index('product_name', 'idx_material_product_name'); + $table->index('deleted_at', 'idx_material_deleted_at'); + }); + } + } + + public function down(Builder $schema): void + { + $schema->dropIfExists('produce_material'); + $schema->dropIfExists('produce_material_category'); + } +}; diff --git a/backend/plugin/produce/resource/database/migrations/2026_08_14_000001_create_produce_repair_management_tables.php b/backend/plugin/produce/resource/database/migrations/2026_08_14_000001_create_produce_repair_management_tables.php new file mode 100644 index 0000000..803d37e --- /dev/null +++ b/backend/plugin/produce/resource/database/migrations/2026_08_14_000001_create_produce_repair_management_tables.php @@ -0,0 +1,92 @@ +hasTable('produce_repair_setting')) { + $schema->create('produce_repair_setting', function (Blueprint $table) { + $table->bigInteger('id')->primary()->comment('主键ID'); + $table->string('setting_type', 50)->comment('设置类型'); + $table->string('setting_name', 100)->comment('设置名称'); + $table->string('setting_value', 255)->nullable()->comment('设置值'); + $table->integer('sort')->default(0)->comment('排序'); + $table->tinyInteger('is_enabled')->default(1)->comment('是否启用'); + $table->string('remark', 500)->nullable()->comment('备注'); + $table->bigInteger('created_by')->nullable()->comment('创建人ID'); + $table->bigInteger('updated_by')->nullable()->comment('更新人ID'); + $table->bigInteger('created_at')->nullable()->comment('创建时间'); + $table->bigInteger('updated_at')->nullable()->comment('更新时间'); + $table->bigInteger('deleted_at')->nullable()->comment('删除时间'); + + $table->unique(['setting_type', 'setting_name'], 'uk_repair_setting_type_name'); + $table->index(['setting_type', 'is_enabled'], 'idx_repair_setting_type_enabled'); + $table->index('deleted_at', 'idx_repair_setting_deleted_at'); + }); + } + + if (!$schema->hasTable('produce_hardware_fault_description')) { + $schema->create('produce_hardware_fault_description', function (Blueprint $table) { + $table->bigInteger('id')->primary()->comment('主键ID'); + $table->bigInteger('category_id')->comment('物料分类ID'); + $table->string('description', 500)->comment('硬件故障描述'); + $table->unsignedInteger('use_count')->default(0)->comment('使用次数'); + $table->tinyInteger('is_enabled')->default(1)->comment('是否启用'); + $table->string('remark', 500)->nullable()->comment('备注'); + $table->bigInteger('created_by')->nullable()->comment('创建人ID'); + $table->bigInteger('updated_by')->nullable()->comment('更新人ID'); + $table->bigInteger('created_at')->nullable()->comment('创建时间'); + $table->bigInteger('updated_at')->nullable()->comment('更新时间'); + $table->bigInteger('deleted_at')->nullable()->comment('删除时间'); + + $table->unique(['category_id', 'description'], 'uk_hardware_fault_category_description'); + $table->index(['category_id', 'is_enabled'], 'idx_hardware_fault_category_enabled'); + $table->index('use_count', 'idx_hardware_fault_use_count'); + $table->index('deleted_at', 'idx_hardware_fault_deleted_at'); + }); + } + + if (!$schema->hasTable('produce_repair_record')) { + $schema->create('produce_repair_record', function (Blueprint $table) { + $table->bigInteger('id')->primary()->comment('主键ID'); + $table->string('repair_no', 100)->comment('维修单号'); + $table->string('order_no', 100)->nullable()->comment('订单号'); + $table->string('product_code', 100)->nullable()->comment('商品编码'); + $table->string('product_name', 200)->nullable()->comment('商品名称'); + $table->bigInteger('category_id')->nullable()->comment('物料分类ID'); + $table->string('category_name', 100)->nullable()->comment('物料分类名称快照'); + $table->bigInteger('fault_description_id')->nullable()->comment('硬件故障描述ID'); + $table->string('fault_description', 500)->nullable()->comment('硬件故障描述快照'); + $table->string('repair_result', 50)->nullable()->comment('维修判定'); + $table->json('parts')->nullable()->comment('更换备件'); + $table->string('operator', 100)->nullable()->comment('维修人员'); + $table->bigInteger('repaired_at')->nullable()->comment('维修时间'); + $table->string('remark', 1000)->nullable()->comment('备注'); + $table->bigInteger('created_by')->nullable()->comment('创建人ID'); + $table->bigInteger('updated_by')->nullable()->comment('更新人ID'); + $table->bigInteger('created_at')->nullable()->comment('创建时间'); + $table->bigInteger('updated_at')->nullable()->comment('更新时间'); + $table->bigInteger('deleted_at')->nullable()->comment('删除时间'); + + $table->unique('repair_no', 'uk_repair_record_repair_no'); + $table->index('order_no', 'idx_repair_record_order_no'); + $table->index('product_code', 'idx_repair_record_product_code'); + $table->index('category_id', 'idx_repair_record_category_id'); + $table->index('fault_description_id', 'idx_repair_record_fault_description_id'); + $table->index('repaired_at', 'idx_repair_record_repaired_at'); + $table->index('deleted_at', 'idx_repair_record_deleted_at'); + }); + } + } + + public function down(Builder $schema): void + { + $schema->dropIfExists('produce_repair_record'); + $schema->dropIfExists('produce_hardware_fault_description'); + $schema->dropIfExists('produce_repair_setting'); + } +}; diff --git a/backend/plugin/produce/resource/database/migrations/2026_08_15_000001_add_exception_snapshot_to_repair_record.php b/backend/plugin/produce/resource/database/migrations/2026_08_15_000001_add_exception_snapshot_to_repair_record.php new file mode 100644 index 0000000..6e74931 --- /dev/null +++ b/backend/plugin/produce/resource/database/migrations/2026_08_15_000001_add_exception_snapshot_to_repair_record.php @@ -0,0 +1,50 @@ +hasTable($table)) { + return; + } + + $schema->table($table, function (Blueprint $table) use ($schema) { + if (!$schema->hasColumn('produce_repair_record', 'exception_id')) { + $table->bigInteger('exception_id')->nullable()->comment('关联异常记录ID'); + $table->index('exception_id', 'idx_repair_record_exception_id'); + } + if (!$schema->hasColumn('produce_repair_record', 'exception_reason')) { + $table->string('exception_reason', 100)->nullable()->comment('异常原因快照'); + } + if (!$schema->hasColumn('produce_repair_record', 'exception_issue')) { + $table->string('exception_issue', 100)->nullable()->comment('具体问题快照'); + } + }); + } + + public function down(Builder $schema): void + { + $table = 'produce_repair_record'; + if (!$schema->hasTable($table)) { + return; + } + + $schema->table($table, function (Blueprint $table) use ($schema) { + if ($schema->hasColumn('produce_repair_record', 'exception_id')) { + $table->dropIndex('idx_repair_record_exception_id'); + $table->dropColumn('exception_id'); + } + if ($schema->hasColumn('produce_repair_record', 'exception_reason')) { + $table->dropColumn('exception_reason'); + } + if ($schema->hasColumn('produce_repair_record', 'exception_issue')) { + $table->dropColumn('exception_issue'); + } + }); + } +}; diff --git a/backend/plugin/produce/resource/database/migrations/2026_08_16_000001_align_produce_repair_setting.php b/backend/plugin/produce/resource/database/migrations/2026_08_16_000001_align_produce_repair_setting.php new file mode 100644 index 0000000..36ae720 --- /dev/null +++ b/backend/plugin/produce/resource/database/migrations/2026_08_16_000001_align_produce_repair_setting.php @@ -0,0 +1,85 @@ +hasTable($table)) { + return; + } + + $hasParentId = $schema->hasColumn($table, 'parent_id'); + $hasCode = $schema->hasColumn($table, 'code'); + $hasName = $schema->hasColumn($table, 'name'); + $hasSettingType = $schema->hasColumn($table, 'setting_type'); + $hasSettingName = $schema->hasColumn($table, 'setting_name'); + + $schema->table($table, function (Blueprint $table) use ($hasParentId, $hasCode, $hasName) { + if (!$hasParentId) { + $table->bigInteger('parent_id')->nullable()->comment('父级ID'); + $table->index('parent_id', 'idx_repair_setting_parent'); + } + if (!$hasCode) { + $table->string('code', 64)->nullable()->comment('设置编码'); + } + if (!$hasName) { + $table->string('name', 100)->nullable()->comment('设置名称'); + } + }); + + $connection = $schema->getConnection(); + if (!$hasCode && $hasSettingType) { + $connection->table($table)->whereNull('code')->update([ + 'code' => $connection->raw('setting_type'), + ]); + } + if (!$hasName && $hasSettingName) { + $connection->table($table)->whereNull('name')->update([ + 'name' => $connection->raw('setting_name'), + ]); + } + if ($hasSettingType) { + $connection->table($table) + ->whereNotIn('setting_type', ['type', 'reason', 'issue']) + ->update(['setting_type' => 'type']); + } + + $schema->table($table, function (Blueprint $table) use ($hasCode, $hasName) { + if (!$hasCode) { + $table->string('code', 64)->nullable(false)->change(); + } + if (!$hasName) { + $table->string('name', 100)->nullable(false)->change(); + } + }); + } + + public function down(Builder $schema): void + { + $table = 'produce_repair_setting'; + if (!$schema->hasTable($table)) { + return; + } + + $hasLegacySettingType = $schema->hasColumn($table, 'setting_type'); + $hasLegacySettingName = $schema->hasColumn($table, 'setting_name'); + + $schema->table($table, function (Blueprint $table) use ($schema, $hasLegacySettingType, $hasLegacySettingName) { + if ($hasLegacySettingType && $schema->hasColumn('produce_repair_setting', 'parent_id')) { + $table->dropIndex('idx_repair_setting_parent'); + $table->dropColumn('parent_id'); + } + if ($hasLegacySettingType && $schema->hasColumn('produce_repair_setting', 'code')) { + $table->dropColumn('code'); + } + if ($hasLegacySettingName && $schema->hasColumn('produce_repair_setting', 'name')) { + $table->dropColumn('name'); + } + }); + } +}; diff --git a/backend/plugin/produce/resource/database/migrations/2026_08_17_000001_add_operation_fault_responsibility_to_repair_record.php b/backend/plugin/produce/resource/database/migrations/2026_08_17_000001_add_operation_fault_responsibility_to_repair_record.php new file mode 100644 index 0000000..596bd5d --- /dev/null +++ b/backend/plugin/produce/resource/database/migrations/2026_08_17_000001_add_operation_fault_responsibility_to_repair_record.php @@ -0,0 +1,42 @@ +hasTable($table)) { + return; + } + + $schema->table($table, function (Blueprint $table) use ($schema) { + if (!$schema->hasColumn('produce_repair_record', 'operation_fault_steps')) { + $table->json('operation_fault_steps')->nullable()->comment('作业不良责任步骤快照'); + } + if (!$schema->hasColumn('produce_repair_record', 'responsible_operators')) { + $table->json('responsible_operators')->nullable()->comment('作业不良责任人员快照'); + } + }); + } + + public function down(Builder $schema): void + { + $table = 'produce_repair_record'; + if (!$schema->hasTable($table)) { + return; + } + + $schema->table($table, function (Blueprint $table) use ($schema) { + if ($schema->hasColumn('produce_repair_record', 'operation_fault_steps')) { + $table->dropColumn('operation_fault_steps'); + } + if ($schema->hasColumn('produce_repair_record', 'responsible_operators')) { + $table->dropColumn('responsible_operators'); + } + }); + } +}; diff --git a/backend/plugin/produce/resource/database/migrations/2026_08_18_000001_add_category_ids_to_produce_repair_record.php b/backend/plugin/produce/resource/database/migrations/2026_08_18_000001_add_category_ids_to_produce_repair_record.php new file mode 100644 index 0000000..7d9ea22 --- /dev/null +++ b/backend/plugin/produce/resource/database/migrations/2026_08_18_000001_add_category_ids_to_produce_repair_record.php @@ -0,0 +1,27 @@ +hasTable('produce_repair_record') && !$schema->hasColumn('produce_repair_record', 'category_ids')) { + $schema->table('produce_repair_record', function (Blueprint $table) { + $table->json('category_ids')->nullable()->after('category_id')->comment('物料分类ID集合'); + $table->json('category_names')->nullable()->after('category_name')->comment('物料分类名称快照集合'); + }); + } + } + + public function down(Builder $schema): void + { + if ($schema->hasTable('produce_repair_record') && $schema->hasColumn('produce_repair_record', 'category_ids')) { + $schema->table('produce_repair_record', function (Blueprint $table) { + $table->dropColumn(['category_ids', 'category_names']); + }); + } + } +}; diff --git a/backend/plugin/produce/resource/database/migrations/2026_08_22_000001_add_quantity_to_produce_scan_data_table.php b/backend/plugin/produce/resource/database/migrations/2026_08_22_000001_add_quantity_to_produce_scan_data_table.php new file mode 100644 index 0000000..58f0a5f --- /dev/null +++ b/backend/plugin/produce/resource/database/migrations/2026_08_22_000001_add_quantity_to_produce_scan_data_table.php @@ -0,0 +1,26 @@ +hasTable('produce_scan_data') && !$schema->hasColumn('produce_scan_data', 'quantity')) { + $schema->table('produce_scan_data', function (Blueprint $table) { + $table->integer('quantity')->default(1)->after('order_no')->comment('本次数量'); + }); + } + } + + public function down(Builder $schema): void + { + if ($schema->hasTable('produce_scan_data') && $schema->hasColumn('produce_scan_data', 'quantity')) { + $schema->table('produce_scan_data', function (Blueprint $table) { + $table->dropColumn('quantity'); + }); + } + } +}; diff --git a/backend/plugin/produce/resource/database/migrations/2026_08_30_000001_add_images_to_produce_repair_record.php b/backend/plugin/produce/resource/database/migrations/2026_08_30_000001_add_images_to_produce_repair_record.php new file mode 100644 index 0000000..182507b --- /dev/null +++ b/backend/plugin/produce/resource/database/migrations/2026_08_30_000001_add_images_to_produce_repair_record.php @@ -0,0 +1,26 @@ +hasTable('produce_repair_record') && !$schema->hasColumn('produce_repair_record', 'images')) { + $schema->table('produce_repair_record', function (Blueprint $table) { + $table->json('images')->nullable()->after('parts')->comment('维修现场图片'); + }); + } + } + + public function down(Builder $schema): void + { + if ($schema->hasTable('produce_repair_record') && $schema->hasColumn('produce_repair_record', 'images')) { + $schema->table('produce_repair_record', function (Blueprint $table) { + $table->dropColumn('images'); + }); + } + } +}; diff --git a/backend/plugin/produce/resource/database/seeds/.gitkeep b/backend/plugin/produce/resource/database/seeds/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/backend/plugin/produce/resource/database/seeds/ProduceDemoDataSeeder.php b/backend/plugin/produce/resource/database/seeds/ProduceDemoDataSeeder.php new file mode 100644 index 0000000..5e54579 --- /dev/null +++ b/backend/plugin/produce/resource/database/seeds/ProduceDemoDataSeeder.php @@ -0,0 +1,630 @@ +forceDelete(); + StepRelation::withTrashed()->forceDelete(); + StepStatus::withTrashed()->forceDelete(); + ProcessStep::withTrashed()->forceDelete(); + Process::withTrashed()->forceDelete(); + + $processes = [ + 'production' => Process::create([ + 'id' => Snowflake::generate(), + 'process_code' => 'L1SC', + 'process_name' => '生产工序', + 'description' => '生产主流程示例数据', + 'sort' => 0, + 'status' => 1, + 'step_count' => 3, + 'created_by' => $adminId, + 'updated_by' => $adminId, + 'created_at' => $now, + 'updated_at' => $now, + ]), + 'addon' => Process::create([ + 'id' => Snowflake::generate(), + 'process_code' => 'L1JZ', + 'process_name' => '加装工序', + 'description' => '加装分支示例数据', + 'sort' => 10, + 'status' => 1, + 'step_count' => 1, + 'created_by' => $adminId, + 'updated_by' => $adminId, + 'created_at' => $now, + 'updated_at' => $now, + ]), + 'repair' => Process::create([ + 'id' => Snowflake::generate(), + 'process_code' => 'L1WX', + 'process_name' => '异常工序', + 'description' => '维修/异常处理示例数据', + 'sort' => 20, + 'status' => 1, + 'step_count' => 3, + 'created_by' => $adminId, + 'updated_by' => $adminId, + 'created_at' => $now, + 'updated_at' => $now, + ]), + ]; + + $steps = [ + 'panel' => ProcessStep::create([ + 'id' => Snowflake::generate(), + 'process_id' => $processes['production']->id, + 'step_code' => 'PB001', + 'step_name' => '拼板', + 'description' => '生产起始步骤', + 'sort' => 0, + 'status' => 1, + 'prerequisite_steps' => [], + 'prerequisite_mode' => 'none', + 'prerequisite_require_final' => 1, + 'allow_repeat_scan' => 1, + 'repeat_scan_statuses' => [], + 'created_by' => $adminId, + 'updated_by' => $adminId, + 'created_at' => $now, + 'updated_at' => $now, + ]), + 'assemble' => ProcessStep::create([ + 'id' => Snowflake::generate(), + 'process_id' => $processes['production']->id, + 'step_code' => 'ZZ001', + 'step_name' => '组装', + 'description' => '生产主流程第二步', + 'sort' => 10, + 'status' => 1, + 'prerequisite_steps' => [], + 'prerequisite_mode' => 'all', + 'prerequisite_require_final' => 1, + 'allow_repeat_scan' => 1, + 'repeat_scan_statuses' => [], + 'created_by' => $adminId, + 'updated_by' => $adminId, + 'created_at' => $now, + 'updated_at' => $now, + ]), + 'test' => ProcessStep::create([ + 'id' => Snowflake::generate(), + 'process_id' => $processes['production']->id, + 'step_code' => 'CS001', + 'step_name' => '测试', + 'description' => '生产主流程第三步', + 'sort' => 20, + 'status' => 1, + 'prerequisite_steps' => [], + 'prerequisite_mode' => 'any', + 'prerequisite_require_final' => 0, + 'allow_repeat_scan' => 1, + 'repeat_scan_statuses' => [], + 'created_by' => $adminId, + 'updated_by' => $adminId, + 'created_at' => $now, + 'updated_at' => $now, + ]), + 'addon' => ProcessStep::create([ + 'id' => Snowflake::generate(), + 'process_id' => $processes['addon']->id, + 'step_code' => 'JZ001', + 'step_name' => '加装', + 'description' => '加装支线步骤', + 'sort' => 0, + 'status' => 1, + 'prerequisite_steps' => [], + 'prerequisite_mode' => 'all', + 'prerequisite_require_final' => 1, + 'allow_repeat_scan' => 0, + 'repeat_scan_statuses' => [], + 'created_by' => $adminId, + 'updated_by' => $adminId, + 'created_at' => $now, + 'updated_at' => $now, + ]), + 'repair' => ProcessStep::create([ + 'id' => Snowflake::generate(), + 'process_id' => $processes['repair']->id, + 'step_code' => 'WX001', + 'step_name' => '维修', + 'description' => '异常维修步骤', + 'sort' => 0, + 'status' => 1, + 'prerequisite_steps' => [], + 'prerequisite_mode' => 'all', + 'prerequisite_require_final' => 1, + 'allow_repeat_scan' => 1, + 'repeat_scan_statuses' => [], + 'created_by' => $adminId, + 'updated_by' => $adminId, + 'created_at' => $now, + 'updated_at' => $now, + ]), + 'rework' => ProcessStep::create([ + 'id' => Snowflake::generate(), + 'process_id' => $processes['repair']->id, + 'step_code' => 'CP001', + 'step_name' => '重配', + 'description' => '异常重配步骤', + 'sort' => 10, + 'status' => 1, + 'prerequisite_steps' => [], + 'prerequisite_mode' => 'all', + 'prerequisite_require_final' => 1, + 'allow_repeat_scan' => 0, + 'repeat_scan_statuses' => [], + 'created_by' => $adminId, + 'updated_by' => $adminId, + 'created_at' => $now, + 'updated_at' => $now, + ]), + 'cancel' => ProcessStep::create([ + 'id' => Snowflake::generate(), + 'process_id' => $processes['repair']->id, + 'step_code' => 'TD001', + 'step_name' => '退单', + 'description' => '异常退单步骤', + 'sort' => 20, + 'status' => 1, + 'prerequisite_steps' => [], + 'prerequisite_mode' => 'all', + 'prerequisite_require_final' => 1, + 'allow_repeat_scan' => 0, + 'repeat_scan_statuses' => [], + 'created_by' => $adminId, + 'updated_by' => $adminId, + 'created_at' => $now, + 'updated_at' => $now, + ]), + ]; + + $statuses = [ + 'panel_processing' => StepStatus::create([ + 'id' => Snowflake::generate(), + 'step_id' => $steps['panel']->id, + 'status_code' => 'PB_PROCESSING', + 'status_name' => '拼板中', + 'is_initial' => 1, + 'is_final' => 0, + 'description' => '拼板初始状态', + 'sort' => 0, + 'status' => 1, + 'created_by' => $adminId, + 'updated_by' => $adminId, + 'created_at' => $now, + 'updated_at' => $now, + ]), + 'panel_completed' => StepStatus::create([ + 'id' => Snowflake::generate(), + 'step_id' => $steps['panel']->id, + 'status_code' => 'PB_COMPLETED', + 'status_name' => '拼板完成', + 'is_initial' => 0, + 'is_final' => 1, + 'description' => '拼板完成状态', + 'sort' => 10, + 'status' => 1, + 'created_by' => $adminId, + 'updated_by' => $adminId, + 'created_at' => $now, + 'updated_at' => $now, + ]), + 'panel_exception' => StepStatus::create([ + 'id' => Snowflake::generate(), + 'step_id' => $steps['panel']->id, + 'status_code' => 'PB_EXCEPTION', + 'status_name' => '拼板异常', + 'is_initial' => 0, + 'is_final' => 1, + 'description' => '拼板异常状态', + 'sort' => 20, + 'status' => 1, + 'created_by' => $adminId, + 'updated_by' => $adminId, + 'created_at' => $now, + 'updated_at' => $now, + ]), + 'assemble_processing' => StepStatus::create([ + 'id' => Snowflake::generate(), + 'step_id' => $steps['assemble']->id, + 'status_code' => 'ZZ_PROCESSING', + 'status_name' => '组装中', + 'is_initial' => 1, + 'is_final' => 0, + 'description' => '组装初始状态', + 'sort' => 0, + 'status' => 1, + 'created_by' => $adminId, + 'updated_by' => $adminId, + 'created_at' => $now, + 'updated_at' => $now, + ]), + 'assemble_completed' => StepStatus::create([ + 'id' => Snowflake::generate(), + 'step_id' => $steps['assemble']->id, + 'status_code' => 'ZZ_COMPLETED', + 'status_name' => '组装完成', + 'is_initial' => 0, + 'is_final' => 1, + 'description' => '组装完成状态', + 'sort' => 10, + 'status' => 1, + 'created_by' => $adminId, + 'updated_by' => $adminId, + 'created_at' => $now, + 'updated_at' => $now, + ]), + 'assemble_exception' => StepStatus::create([ + 'id' => Snowflake::generate(), + 'step_id' => $steps['assemble']->id, + 'status_code' => 'ZZ_EXCEPTION', + 'status_name' => '组装异常', + 'is_initial' => 0, + 'is_final' => 1, + 'description' => '组装异常状态', + 'sort' => 20, + 'status' => 1, + 'created_by' => $adminId, + 'updated_by' => $adminId, + 'created_at' => $now, + 'updated_at' => $now, + ]), + 'test_processing' => StepStatus::create([ + 'id' => Snowflake::generate(), + 'step_id' => $steps['test']->id, + 'status_code' => 'CS_PROCESSING', + 'status_name' => '测试中', + 'is_initial' => 1, + 'is_final' => 0, + 'description' => '测试初始状态', + 'sort' => 0, + 'status' => 1, + 'created_by' => $adminId, + 'updated_by' => $adminId, + 'created_at' => $now, + 'updated_at' => $now, + ]), + 'test_passed' => StepStatus::create([ + 'id' => Snowflake::generate(), + 'step_id' => $steps['test']->id, + 'status_code' => 'CS_PASSED', + 'status_name' => '测试通过', + 'is_initial' => 0, + 'is_final' => 1, + 'description' => '测试通过状态', + 'sort' => 10, + 'status' => 1, + 'created_by' => $adminId, + 'updated_by' => $adminId, + 'created_at' => $now, + 'updated_at' => $now, + ]), + 'test_failed' => StepStatus::create([ + 'id' => Snowflake::generate(), + 'step_id' => $steps['test']->id, + 'status_code' => 'CS_FAILED', + 'status_name' => '测试不通过', + 'is_initial' => 0, + 'is_final' => 1, + 'description' => '测试失败状态', + 'sort' => 20, + 'status' => 1, + 'created_by' => $adminId, + 'updated_by' => $adminId, + 'created_at' => $now, + 'updated_at' => $now, + ]), + 'addon_processing' => StepStatus::create([ + 'id' => Snowflake::generate(), + 'step_id' => $steps['addon']->id, + 'status_code' => 'JZ_PROCESSING', + 'status_name' => '加装中', + 'is_initial' => 1, + 'is_final' => 0, + 'description' => '加装初始状态', + 'sort' => 0, + 'status' => 1, + 'created_by' => $adminId, + 'updated_by' => $adminId, + 'created_at' => $now, + 'updated_at' => $now, + ]), + 'addon_completed' => StepStatus::create([ + 'id' => Snowflake::generate(), + 'step_id' => $steps['addon']->id, + 'status_code' => 'JZ_COMPLETED', + 'status_name' => '加装完成', + 'is_initial' => 0, + 'is_final' => 1, + 'description' => '加装完成状态', + 'sort' => 10, + 'status' => 1, + 'created_by' => $adminId, + 'updated_by' => $adminId, + 'created_at' => $now, + 'updated_at' => $now, + ]), + 'repair_processing' => StepStatus::create([ + 'id' => Snowflake::generate(), + 'step_id' => $steps['repair']->id, + 'status_code' => 'WX_PROCESSING', + 'status_name' => '维修中', + 'is_initial' => 1, + 'is_final' => 0, + 'description' => '维修初始状态', + 'sort' => 0, + 'status' => 1, + 'created_by' => $adminId, + 'updated_by' => $adminId, + 'created_at' => $now, + 'updated_at' => $now, + ]), + 'repair_completed' => StepStatus::create([ + 'id' => Snowflake::generate(), + 'step_id' => $steps['repair']->id, + 'status_code' => 'WX_COMPLETED', + 'status_name' => '维修完成', + 'is_initial' => 0, + 'is_final' => 1, + 'description' => '维修完成状态', + 'sort' => 10, + 'status' => 1, + 'created_by' => $adminId, + 'updated_by' => $adminId, + 'created_at' => $now, + 'updated_at' => $now, + ]), + 'rework_completed' => StepStatus::create([ + 'id' => Snowflake::generate(), + 'step_id' => $steps['rework']->id, + 'status_code' => 'CP_COMPLETED', + 'status_name' => '重配完成', + 'is_initial' => 1, + 'is_final' => 1, + 'description' => '重配完成状态', + 'sort' => 0, + 'status' => 1, + 'created_by' => $adminId, + 'updated_by' => $adminId, + 'created_at' => $now, + 'updated_at' => $now, + ]), + 'cancel_completed' => StepStatus::create([ + 'id' => Snowflake::generate(), + 'step_id' => $steps['cancel']->id, + 'status_code' => 'TD_COMPLETED', + 'status_name' => '退单完成', + 'is_initial' => 1, + 'is_final' => 1, + 'description' => '退单完成状态', + 'sort' => 0, + 'status' => 1, + 'created_by' => $adminId, + 'updated_by' => $adminId, + 'created_at' => $now, + 'updated_at' => $now, + ]), + ]; + + $steps['assemble']->update([ + 'prerequisite_steps' => [$steps['panel']->id], + 'repeat_scan_statuses' => [$statuses['panel_processing']->id], + ]); + + $steps['test']->update([ + 'prerequisite_steps' => [$steps['assemble']->id, $steps['addon']->id], + 'repeat_scan_statuses' => [$statuses['assemble_processing']->id], + ]); + + $steps['panel']->update([ + 'repeat_scan_statuses' => [$statuses['rework_completed']->id, $statuses['cancel_completed']->id], + ]); + + $relations = [ + [ + 'from_step_id' => $steps['panel']->id, + 'to_step_id' => $steps['assemble']->id, + 'relation_type' => 'normal', + 'flow_condition' => [], + 'priority' => 0, + 'description' => '拼板完成后进入组装', + 'sort' => 0, + ], + [ + 'from_step_id' => $steps['assemble']->id, + 'to_step_id' => $steps['test']->id, + 'relation_type' => 'normal', + 'flow_condition' => [], + 'priority' => 0, + 'description' => '组装完成后进入测试', + 'sort' => 10, + ], + [ + 'from_step_id' => $steps['addon']->id, + 'to_step_id' => $steps['test']->id, + 'relation_type' => 'normal', + 'flow_condition' => [], + 'priority' => 0, + 'description' => '加装完成后可进入测试', + 'sort' => 20, + ], + [ + 'from_step_id' => $steps['test']->id, + 'to_step_id' => $steps['assemble']->id, + 'relation_type' => 'exception', + 'flow_condition' => ['reason' => 'assembly_rework'], + 'priority' => 0, + 'description' => '测试失败后回流组装', + 'sort' => 30, + ], + [ + 'from_step_id' => $steps['assemble']->id, + 'to_step_id' => $steps['repair']->id, + 'relation_type' => 'exception', + 'flow_condition' => ['reason' => 'repair_required'], + 'priority' => 0, + 'description' => '组装异常进入维修', + 'sort' => 40, + ], + [ + 'from_step_id' => $steps['test']->id, + 'to_step_id' => $steps['repair']->id, + 'relation_type' => 'exception', + 'flow_condition' => ['reason' => 'repair_required'], + 'priority' => 0, + 'description' => '测试异常进入维修', + 'sort' => 50, + ], + [ + 'from_step_id' => $steps['panel']->id, + 'to_step_id' => $steps['rework']->id, + 'relation_type' => 'exception', + 'flow_condition' => ['reason' => 'rework_required'], + 'priority' => 0, + 'description' => '拼板异常进入重配', + 'sort' => 60, + ], + [ + 'from_step_id' => $steps['assemble']->id, + 'to_step_id' => $steps['cancel']->id, + 'relation_type' => 'exception', + 'flow_condition' => ['reason' => 'cancel_required'], + 'priority' => 0, + 'description' => '组装异常进入退单', + 'sort' => 70, + ], + ]; + + foreach ($relations as $relation) { + StepRelation::create([ + 'id' => Snowflake::generate(), + 'from_step_id' => $relation['from_step_id'], + 'to_step_id' => $relation['to_step_id'], + 'relation_type' => $relation['relation_type'], + 'flow_condition' => $relation['flow_condition'], + 'priority' => $relation['priority'], + 'description' => $relation['description'], + 'sort' => $relation['sort'], + 'status' => 1, + 'created_by' => $adminId, + 'updated_by' => $adminId, + 'created_at' => $now, + 'updated_at' => $now, + ]); + } + + $transitions = [ + [ + 'step_id' => $steps['panel']->id, + 'from_status_id' => $statuses['panel_processing']->id, + 'to_status_id' => $statuses['panel_completed']->id, + 'trigger_event' => 'next_step_scan', + 'event_config' => null, + 'auto_trigger' => 1, + 'priority' => 0, + 'transition_type' => 'primary', + 'side_effect_type' => null, + 'side_effect_config' => null, + 'description' => '拼板完成后推进下一步', + 'sort' => 0, + ], + [ + 'step_id' => $steps['assemble']->id, + 'from_status_id' => $statuses['assemble_processing']->id, + 'to_status_id' => $statuses['assemble_completed']->id, + 'trigger_event' => 'next_step_scan', + 'event_config' => null, + 'auto_trigger' => 1, + 'priority' => 0, + 'transition_type' => 'primary', + 'side_effect_type' => null, + 'side_effect_config' => null, + 'description' => '组装完成后推进下一步', + 'sort' => 10, + ], + [ + 'step_id' => $steps['assemble']->id, + 'from_status_id' => $statuses['assemble_processing']->id, + 'to_status_id' => $statuses['assemble_exception']->id, + 'trigger_event' => 'exception_trigger', + 'event_config' => ['source' => 'manual'], + 'auto_trigger' => 1, + 'priority' => 5, + 'transition_type' => 'primary', + 'side_effect_type' => null, + 'side_effect_config' => null, + 'description' => '组装异常时转异常态', + 'sort' => 20, + ], + [ + 'step_id' => $steps['test']->id, + 'from_status_id' => $statuses['test_processing']->id, + 'to_status_id' => $statuses['test_passed']->id, + 'trigger_event' => 'scan_trigger', + 'event_config' => null, + 'auto_trigger' => 1, + 'priority' => 0, + 'transition_type' => 'primary', + 'side_effect_type' => null, + 'side_effect_config' => null, + 'description' => '测试通过', + 'sort' => 30, + ], + [ + 'step_id' => $steps['test']->id, + 'from_status_id' => $statuses['test_processing']->id, + 'to_status_id' => $statuses['test_failed']->id, + 'trigger_event' => 'exception_trigger', + 'event_config' => ['source' => 'manual'], + 'auto_trigger' => 1, + 'priority' => 5, + 'transition_type' => 'primary', + 'side_effect_type' => null, + 'side_effect_config' => null, + 'description' => '测试失败', + 'sort' => 40, + ], + ]; + + foreach ($transitions as $transition) { + StatusTransition::create([ + 'id' => Snowflake::generate(), + 'step_id' => $transition['step_id'], + 'from_status_id' => $transition['from_status_id'], + 'to_status_id' => $transition['to_status_id'], + 'trigger_event' => $transition['trigger_event'], + 'event_config' => $transition['event_config'], + 'auto_trigger' => $transition['auto_trigger'], + 'priority' => $transition['priority'], + 'transition_type' => $transition['transition_type'], + 'side_effect_type' => $transition['side_effect_type'], + 'side_effect_config' => $transition['side_effect_config'], + 'description' => $transition['description'], + 'sort' => $transition['sort'], + 'status' => 1, + 'created_by' => $adminId, + 'updated_by' => $adminId, + 'created_at' => $now, + 'updated_at' => $now, + ]); + } + } +} diff --git a/backend/plugin/produce/resource/menu/admin.php b/backend/plugin/produce/resource/menu/admin.php new file mode 100644 index 0000000..6d3e28d --- /dev/null +++ b/backend/plugin/produce/resource/menu/admin.php @@ -0,0 +1,178 @@ + '生产管理', + 'code' => 'produce', + 'app' => 'produce', + 'path' => '/produce', + 'icon' => 'plugin', + 'children' => [ + [ + 'name' => '物料分类', + 'code' => 'produce:material-category:index', + 'app' => 'produce', + 'path' => '/produce/material-category', + 'component' => '/produce/material-category/index', + ], + [ + 'name' => '物料库', + 'code' => 'produce:material:index', + 'app' => 'produce', + 'path' => '/produce/material', + 'component' => '/produce/material/index', + ], + [ + 'name' => '生产配置', + 'code' => 'produce:config:index', + 'app' => 'produce', + 'path' => '/produce/config', + 'component' => '/produce/config/index', + ], + [ + 'name' => '工序管理', + 'code' => 'produce:process:index', + 'app' => 'produce', + 'path' => '/produce/process', + 'component' => '/produce/process/index', + ], + [ + 'name' => '工序步骤', + 'code' => 'produce:process-step:index', + 'app' => 'produce', + 'path' => '/produce/process-step', + 'component' => '/produce/process-step/index', + ], + [ + 'name' => '步骤状态', + 'code' => 'produce:step-status:index', + 'app' => 'produce', + 'path' => '/produce/step-status', + 'component' => '/produce/step-status/index', + ], + [ + 'name' => '步骤关系', + 'code' => 'produce:step-relation:index', + 'app' => 'produce', + 'path' => '/produce/step-relation', + 'component' => '/produce/step-relation/index', + ], + [ + 'name' => '状态转换', + 'code' => 'produce:status-transition:index', + 'app' => 'produce', + 'path' => '/produce/status-transition', + 'component' => '/produce/status-transition/index', + ], + [ + 'name' => '整机数据', + 'code' => 'produce:product-record:index', + 'app' => 'produce', + 'path' => '/produce/product-record', + 'component' => '/produce/product-record/index', + ], + [ + 'name' => '扫码数据', + 'code' => 'produce:scan-data:index', + 'app' => 'produce', + 'path' => '/produce/scan-data', + 'component' => '/produce/scan-data/index', + ], + [ + 'name' => '转换日志', + 'code' => 'produce:transition-log:index', + 'app' => 'produce', + 'path' => '/produce/transition-log', + 'component' => '/produce/transition-log/index', + ], + [ + 'name' => '异常管理', + 'code' => 'produce:exception:index', + 'app' => 'produce', + 'path' => '/produce/exception', + 'icon' => 'warning', + 'children' => [ + [ + 'name' => '异常数据', + 'code' => 'produce:exception-data:list', + 'app' => 'produce', + 'path' => '/produce/exception-data', + 'component' => '/produce/exception/data/index', + ], + [ + 'name' => '异常设置', + 'code' => 'produce:exception-setting:list', + 'app' => 'produce', + 'path' => '/produce/exception-setting', + 'component' => '/produce/exception/setting/index', + ], + [ + 'name' => '数据分析', + 'code' => 'produce:exception-analysis:read', + 'app' => 'produce', + 'path' => '/produce/exception-analysis', + 'component' => '/produce/exception/analysis/index', + ], + ], + ], + [ + 'name' => '维修管理', + 'code' => 'produce:repair:index', + 'app' => 'produce', + 'path' => '/produce/repair', + 'icon' => 'tools', + 'children' => [ + [ + 'name' => '维修数据', + 'code' => 'produce:repair-record:list', + 'app' => 'produce', + 'path' => '/produce/repair/repair-data', + 'component' => '/produce/repair/repair-data/index', + ], + [ + 'name' => '维修设置', + 'code' => 'produce:repair-setting:list', + 'app' => 'produce', + 'path' => '/produce/repair/repair-setting', + 'component' => '/produce/repair/repair-setting/index', + ], + [ + 'name' => '硬件故障描述', + 'code' => 'produce:hardware-fault-description:list', + 'app' => 'produce', + 'path' => '/produce/repair/hardware-fault-description', + 'component' => '/produce/repair/hardware-fault-description/index', + ], + ], + ], + [ + 'name' => '数据统计', + 'code' => 'produce:statistics:index', + 'app' => 'produce', + 'path' => '/produce/statistics', + 'icon' => 'bar-chart-2', + 'children' => [ + [ + 'name' => '月工作统计', + 'code' => 'produce:statistics:monthly', + 'app' => 'produce', + 'path' => '/produce/statistics/monthly', + 'component' => '/produce/statistics/monthly/index', + ], + [ + 'name' => '日工作统计', + 'code' => 'produce:statistics:daily', + 'app' => 'produce', + 'path' => '/produce/statistics/daily', + 'component' => '/produce/statistics/daily/index', + ], + ], + ], + ], + ], +]; diff --git a/backend/plugin/produce/resource/menu/frontend.php b/backend/plugin/produce/resource/menu/frontend.php new file mode 100644 index 0000000..917fd5d --- /dev/null +++ b/backend/plugin/produce/resource/menu/frontend.php @@ -0,0 +1,9 @@ + 'web', + 'category' => 1, + 'source' => 'plugin', + 'code' => null, + 'name' => '生产录入', + 'url' => '/produce/data-entry', + 'icon' => 'ri:qr-scan-2-line', + 'level' => 1, + 'type' => 2, + 'sort' => 10, + 'target' => 1, + 'is_show' => 1, + 'enabled' => 1, + 'created_at' => time(), + 'updated_at' => time(), + 'deleted_at' => null, + ], + [ + 'app' => 'web', + 'category' => 1, + 'source' => 'plugin', + 'code' => null, + 'name' => '异常处理', + 'url' => '/produce/exception', + 'icon' => 'ri:error-warning-line', + 'level' => 1, + 'type' => 2, + 'sort' => 20, + 'target' => 1, + 'is_show' => 1, + 'enabled' => 1, + 'created_at' => time(), + 'updated_at' => time(), + 'deleted_at' => null, + ], + [ + 'app' => 'web', + 'category' => 1, + 'source' => 'plugin', + 'code' => null, + 'name' => '维修处理', + 'url' => '/produce/repair', + 'icon' => 'ri:tools-line', + 'level' => 1, + 'type' => 2, + 'sort' => 30, + 'target' => 1, + 'is_show' => 1, + 'enabled' => 1, + 'created_at' => time(), + 'updated_at' => time(), + 'deleted_at' => null, + ], + [ + 'app' => 'web', + 'category' => 1, + 'source' => 'plugin', + 'code' => null, + 'name' => '待维修订单', + 'url' => '/produce/repair/tasks', + 'icon' => 'ri:task-line', + 'level' => 1, + 'type' => 2, + 'sort' => 40, + 'target' => 1, + 'is_show' => 1, + 'enabled' => 1, + 'created_at' => time(), + 'updated_at' => time(), + 'deleted_at' => null, + ], + [ + 'app' => 'web', + 'category' => 1, + 'source' => 'plugin', + 'code' => null, + 'name' => '综合查询', + 'url' => '/produce/query', + 'icon' => 'ri:search-eye-line', + 'level' => 1, + 'type' => 2, + 'sort' => 50, + 'target' => 1, + 'is_show' => 1, + 'enabled' => 1, + 'created_at' => time(), + 'updated_at' => time(), + 'deleted_at' => null, + ], +]; diff --git a/backend/plugin/produce/resource/template/admin/.gitkeep b/backend/plugin/produce/resource/template/admin/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/backend/plugin/produce/resource/template/admin/api/index.ts b/backend/plugin/produce/resource/template/admin/api/index.ts new file mode 100644 index 0000000..a182241 --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/api/index.ts @@ -0,0 +1,519 @@ +import request from "@/utils/http"; + +/** + * produce 插件 API + */ +import BaseService from "@/api/core/base"; + +export interface ProduceProcessRow { + id?: string | number; + process_code: string; + process_name: string; + description?: string; + step_count?: number; + sort?: number; + status?: number; + created_date?: string; + updated_date?: string; +} + +export interface ProduceProcessStepRow { + id?: string | number; + process_id: string | number; + step_code: string; + step_name: string; + description?: string; + sort?: number; + status?: number; + prerequisite_steps?: Array | string | null; + prerequisite_mode?: "all" | "any" | "none"; + prerequisite_require_final?: number; + allow_repeat_scan?: number; + repeat_scan_statuses?: Array | string | null; + process?: { + id?: string | number; + process_name?: string; + }; + created_date?: string; + updated_date?: string; +} + +export interface ProduceStepStatusRow { + id?: string | number; + step_id: string | number; + status_code: string; + status_name: string; + is_initial?: number; + is_final?: number; + description?: string; + sort?: number; + status?: number; + step?: { + id?: string | number; + step_name?: string; + }; + created_date?: string; + updated_date?: string; +} + +export interface ProduceStepRelationRow { + id?: string | number; + from_step_id: string | number; + to_step_id: string | number; + relation_type: "normal" | "exception"; + flow_condition?: string | Record | null; + priority?: number; + description?: string; + sort?: number; + status?: number; + from_step?: { + id?: string | number; + step_name?: string; + }; + to_step?: { + id?: string | number; + step_name?: string; + }; + created_date?: string; + updated_date?: string; +} + +export interface ProduceStatusTransitionRow { + id?: string | number; + step_id: string | number; + from_status_id: string | number; + to_status_id: string | number; + trigger_event: string; + event_config?: string | Record | null; + auto_trigger?: number; + priority?: number; + transition_type?: "primary" | "side_effect"; + side_effect_type?: string; + side_effect_config?: string | Record | null; + description?: string; + sort?: number; + status?: number; + step?: { + id?: string | number; + step_name?: string; + }; + from_status?: { + id?: string | number; + status_name?: string; + }; + to_status?: { + id?: string | number; + status_name?: string; + }; + created_date?: string; + updated_date?: string; +} + +export interface ProduceMaterialCategoryRow { + id?: string | number; + category_name: string; + created_date?: string; + updated_date?: string; +} + +export interface ProduceMaterialRow { + id?: string | number; + category_id: string | number; + category_name?: string; + product_code: string; + product_name: string; + created_date?: string; + updated_date?: string; +} + +export interface ProduceHardwareFaultDescriptionRow { + id?: string | number; + // ... other properties +} + +export const ProduceMaterialCategoryService = { + ...BaseService({ + baseUrl: "/produce/material-category", + }), +}; + +export const ProduceMaterialService = { + ...BaseService({ baseUrl: "/produce/material" }), + categoryOptions(params: Record = {}) { + return request.get({ + url: "/produce/material-category", + params: { format: "select", ...params }, + }); + }, + importExcel(data: FormData) { + return request.post<{ created: number; updated: number }>({ + url: "/produce/material/import", + data, + headers: { "Content-Type": "multipart/form-data" }, + }); + }, +}; + +export const ProduceProcessService = { + ...BaseService({ baseUrl: "/produce/process" }), +}; + +export const ProduceProcessStepService = { + ...BaseService({ baseUrl: "/produce/process-step" }), +}; + +export const ProduceStepStatusService = { + ...BaseService({ baseUrl: "/produce/step-status" }), +}; + +export const ProduceStepRelationService = { + ...BaseService({ baseUrl: "/produce/step-relation" }), +}; + +export const ProduceStatusTransitionService = { + ...BaseService({ + baseUrl: "/produce/status-transition", + }), +}; + +export interface ProduceTransitionLogRow { + id?: string | number; + work_order_id?: string | number | null; + work_order_no?: string; + step_id: string | number; + transition_id?: string | number | null; + from_status_id: string | number; + to_status_id: string | number; + trigger_event: string; + trigger_data?: Record | string | null; + trigger_user?: string; + trigger_ip?: string; + is_auto?: number; + is_success?: number; + error_message?: string | null; + duration?: number; + remark?: string | null; + created_by?: string | number | null; + created_name?: string; + created_date?: string; + step?: { + id?: string | number; + step_name?: string; + }; + transition?: { + id?: string | number; + trigger_event?: string; + }; + from_status?: { + id?: string | number; + status_name?: string; + }; + to_status?: { + id?: string | number; + status_name?: string; + }; +} + +export const ProduceTransitionLogService = { + ...BaseService({ + baseUrl: "/produce/transition-log", + allowedMethods: ["list", "get", "export"], + }), +}; + +export interface ProduceSpecificRuleRow { + id?: string | number; + rule_name: string; + rule_pattern: string; + rule_type: number; + apply_mode?: "order" | "machine" | "both"; + match_field?: "order_no" | "process_order_no" | "product_code" | "user_code"; + is_enabled?: number; + step_ids?: Array | string | null; + sort?: number; + remark?: string; + created_name?: string; + created_date?: string; +} + +export interface ProduceProductRecordRow { + id?: string | number; + process_order_no: string; + product_code: string; + quantity: number; + process_id?: string | number | null; + step_id?: string | number | null; + status_id?: string | number | null; + user_code?: string; + operator?: string; + operator_id?: string | number | null; + scan_result?: number; + remark?: string | null; + process?: { + id?: string | number; + process_name?: string; + }; + step?: { + id?: string | number; + step_name?: string; + }; + status?: { + id?: string | number; + status_name?: string; + }; + created_name?: string; + created_date?: string; +} + +export interface ProduceScanDataRow { + id?: string | number; + order_no: string; + quantity?: number; + user_code: string; + operator?: string; + operator_id?: string | number | null; + process_id: string | number; + step_id: string | number; + status_id?: string | number | null; + scan_result: number; + scan_time?: number; + scan_date?: string; + remark?: string | null; + process?: { + id?: string | number; + process_name?: string; + }; + step?: { + id?: string | number; + step_name?: string; + }; + status?: { + id?: string | number; + status_name?: string; + }; + created_name?: string; + created_date?: string; +} + +export const ProduceSpecificRuleService = { + ...BaseService({ baseUrl: "/produce/specific-rule" }), +}; + +export const ProduceProductRecordService = { + ...BaseService({ + baseUrl: "/produce/product-record", + }), +}; + +export const ProduceScanDataService = { + ...BaseService({ baseUrl: "/produce/scan-data" }), +}; + +export interface ProduceExceptionSettingRow { + id?: string | number; + parent_id?: string | number | null; + parent_name?: string; + setting_type: "type" | "reason" | "issue"; + code: string; + name: string; + sort?: number; + is_enabled?: number; + remark?: string | null; + created_name?: string; + created_date?: string; +} + +export interface ProduceExceptionRecordRow { + id?: string | number; + order_no: string; + user_code?: string | null; + reporter?: string | null; + type_id?: string | number | null; + type_code: string; + type_name: string; + reason_id?: string | number | null; + reason_code: string; + reason_name: string; + issue_id?: string | number | null; + issue_code?: string | null; + issue_name?: string | null; + images?: string[] | null; + remark?: string | null; + status?: number; + status_name?: string; + handler?: string | null; + handler_id?: string | number | null; + handled_at?: number | null; + handled_date?: string | null; + reported_at?: number | null; + reported_date?: string | null; + created_name?: string; + created_date?: string; +} + +export const ProduceExceptionSettingService = { + ...BaseService({ + baseUrl: "/produce/exception-setting", + }), +}; + +export interface ProduceRepairSettingRow { + id?: string | number; + parent_id?: string | number | null; + parent_name?: string; + setting_type: "type" | "reason" | "issue"; + code: string; + name: string; + sort?: number; + is_enabled?: number; + remark?: string | null; + created_name?: string; + created_date?: string; +} + +export interface ProduceHardwareFaultDescriptionRow { + id?: string | number; + category_id: string | number; + category_name?: string; + description: string; + use_count?: number; + is_enabled?: number; + remark?: string | null; + created_date?: string; +} + +export interface ProduceRepairRecordRow { + id?: string | number; + repair_no: string; + exception_id?: string | number | null; + exception_reason?: string | null; + exception_issue?: string | null; + exception_type_name?: string | null; + order_no?: string | null; + product_code?: string | null; + product_name?: string | null; + category_id?: string | number | null; + category_name?: string | null; + fault_description_id?: string | number | null; + fault_description_ids?: Array; + fault_description?: string | null; + fault_descriptions?: string[]; + repair_result?: string | null; + parts?: Array> | string | null; + responsible_operators?: Array> | string | null; + operator?: string | null; + repaired_at?: number | null; + repaired_date?: string | null; + remark?: string | null; + created_date?: string; +} + +export const ProduceRepairSettingService = { + ...BaseService({ + baseUrl: "/produce/repair-setting", + }), +}; + +export const ProduceHardwareFaultDescriptionService = { + ...BaseService({ + baseUrl: "/produce/hardware-fault-description", + }), + categoryOptions(params: Record = {}) { + return request.get({ + url: "/produce/material-category", + params: { format: "select", ...params }, + }); + }, + importExcel(data: FormData) { + return request.post<{ created: number; updated: number }>({ + url: "/produce/hardware-fault-description/import", + data, + headers: { "Content-Type": "multipart/form-data" }, + }); + }, +}; + +export const ProduceRepairRecordService = { + ...BaseService({ baseUrl: "/produce/repair-record" }), + categoryOptions(params: Record = {}) { + return request.get({ + url: "/produce/material-category", + params: { format: "select", ...params }, + }); + }, + faultDescriptionOptions(params: Record = {}) { + return ProduceHardwareFaultDescriptionService.list({ + limit: 999, + is_enabled: 1, + ...params, + }); + }, +}; + +export const ProduceExceptionRecordService = { + ...BaseService({ + baseUrl: "/produce/exception-record", + }), +}; + +export const ProduceConfigApi = { + info(params: Record) { + return request.get({ url: "/produce/config/info", params }); + }, + save(data: Record) { + return request.post({ url: "/produce/config/save", data }); + }, +}; + +export default { + materialCategoryList(params = {}) { + return ProduceMaterialCategoryService.list(params as Record); + }, + materialList(params = {}) { + return ProduceMaterialService.list(params as Record); + }, + processList(params = {}) { + return ProduceProcessService.list(params as Record); + }, + processStepList(params = {}) { + return ProduceProcessStepService.list(params as Record); + }, + stepStatusList(params = {}) { + return ProduceStepStatusService.list(params as Record); + }, + stepRelationList(params = {}) { + return ProduceStepRelationService.list(params as Record); + }, + statusTransitionList(params = {}) { + return ProduceStatusTransitionService.list(params as Record); + }, + transitionLogList(params = {}) { + return ProduceTransitionLogService.list(params as Record); + }, + specificRuleList(params = {}) { + return ProduceSpecificRuleService.list(params as Record); + }, + productRecordList(params = {}) { + return ProduceProductRecordService.list(params as Record); + }, + scanDataList(params = {}) { + return ProduceScanDataService.list(params as Record); + }, + exceptionRecordList(params = {}) { + return ProduceExceptionRecordService.list(params as Record); + }, + exceptionSettingList(params = {}) { + return ProduceExceptionSettingService.list(params as Record); + }, + repairSettingList(params = {}) { + return ProduceRepairSettingService.list(params as Record); + }, + hardwareFaultDescriptionList(params = {}) { + return ProduceHardwareFaultDescriptionService.list( + params as Record, + ); + }, + repairRecordList(params = {}) { + return ProduceRepairRecordService.list(params as Record); + }, +}; diff --git a/backend/plugin/produce/resource/template/admin/api/statistics.ts b/backend/plugin/produce/resource/template/admin/api/statistics.ts new file mode 100644 index 0000000..fd84d75 --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/api/statistics.ts @@ -0,0 +1,50 @@ +import request from '@/utils/http' + +export interface WorkStatisticsQuery { + month?: string + date?: string + data_type?: string + process_id?: string | number + step_id?: string | number + scan_result?: string | number + user_code?: string + operator?: string + process_name?: string + step_name?: string +} + +export interface WorkStatisticsColumn { + key: string + label: string +} + +export interface WorkStatisticsOption { + label: string + value: string | number +} + +export interface WorkStatisticsResponse { + columns: WorkStatisticsColumn[] + items: Array> +} + +export const ProduceWorkStatisticsService = { + monthly(params: WorkStatisticsQuery = {}) { + return request.get({ url: '/produce/statistics/monthly', params }) + }, + daily(params: WorkStatisticsQuery = {}) { + return request.get({ url: '/produce/statistics/daily', params }) + }, + getProcessOptions() { + return request.get({ + url: '/produce/process', + params: { format: 'select' } + }) + }, + getStepOptions(processId?: string | number) { + return request.get({ + url: '/produce/process-step', + params: { format: 'select', process_id: processId || undefined } + }) + } +} diff --git a/backend/plugin/produce/resource/template/admin/lang/en/en.json b/backend/plugin/produce/resource/template/admin/lang/en/en.json new file mode 100644 index 0000000..c3442b5 --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/lang/en/en.json @@ -0,0 +1,217 @@ +{ + "produce": { + "common": { + "columns": { + "index": "No." + } + }, + "modules": { + "process": { + "title": "Process Management", + "search": { + "process_code": "Process Code", + "process_code_placeholder": "Please enter process code", + "process_name": "Process Name", + "process_name_placeholder": "Please enter process name", + "status": "Status", + "status_placeholder": "Please select status" + }, + "form": { + "process_code_placeholder": "Please enter process code", + "process_name_placeholder": "Please enter process name", + "description": "Process Description", + "description_placeholder": "Please enter process description" + }, + "columns": { + "process_code": "Process Code", + "process_name": "Process Name", + "step_count": "Step Count", + "sort": "Sort", + "status": "Status", + "created_at": "Created At" + } + }, + "process_step": { + "title": "Process Steps", + "search": { + "process_id": "Process", + "process_id_placeholder": "Please select process", + "step_code": "Step Code", + "step_code_placeholder": "Please enter step code", + "step_name": "Step Name", + "step_name_placeholder": "Please enter step name", + "status": "Status", + "status_placeholder": "Please select status" + }, + "form": { + "process_id": "Process", + "process_id_placeholder": "Please select process", + "step_code_placeholder": "Please enter step code", + "step_name_placeholder": "Please enter step name", + "description": "Step Description", + "description_placeholder": "Please enter step description" + }, + "columns": { + "process_name": "Process", + "step_code": "Step Code", + "step_name": "Step Name", + "sort": "Sort", + "status": "Status", + "created_at": "Created At" + } + }, + "step_status": { + "title": "Step Status", + "search": { + "step_id": "Step", + "step_id_placeholder": "Please select step", + "status_code": "Status Code", + "status_code_placeholder": "Please enter status code", + "status_name": "Status Name", + "status_name_placeholder": "Please enter status name", + "status": "Status", + "status_placeholder": "Please select status" + }, + "form": { + "step_id": "Step", + "step_id_placeholder": "Please select step", + "status_code_placeholder": "Please enter status code", + "status_name_placeholder": "Please enter status name", + "description": "Status Description", + "description_placeholder": "Please enter status description" + }, + "columns": { + "step_name": "Step", + "status_code": "Status Code", + "status_name": "Status Name", + "is_initial": "Initial", + "is_final": "Final", + "sort": "Sort", + "status": "Status", + "created_at": "Created At" + } + }, + "step_relation": { + "title": "Step Relation", + "search": { + "from_step_id": "From Step", + "from_step_id_placeholder": "Please select from step", + "to_step_id": "To Step", + "to_step_id_placeholder": "Please select to step", + "relation_type": "Relation Type", + "relation_type_placeholder": "Please select relation type", + "status": "Status", + "status_placeholder": "Please select status" + }, + "form": { + "from_step_id": "From Step", + "from_step_id_placeholder": "Please select from step", + "to_step_id": "To Step", + "to_step_id_placeholder": "Please select to step", + "flow_condition": "Flow Condition", + "flow_condition_placeholder": "Please enter JSON flow condition", + "description": "Relation Description", + "description_placeholder": "Please enter relation description" + }, + "columns": { + "from_step_name": "From Step", + "to_step_name": "To Step", + "relation_type": "Relation Type", + "priority": "Priority", + "flow_condition": "Flow Condition", + "sort": "Sort", + "status": "Status", + "created_at": "Created At" + } + }, + "status_transition": { + "title": "Status Transition", + "search": { + "step_id": "Step", + "step_id_placeholder": "Please select step", + "trigger_event": "Trigger Event", + "trigger_event_placeholder": "Please select trigger event", + "status": "Status", + "status_placeholder": "Please select status" + }, + "form": { + "step_id": "Step", + "step_id_placeholder": "Please select step", + "from_status_id": "From Status", + "from_status_id_placeholder": "Please select from status", + "to_status_id": "To Status", + "to_status_id_placeholder": "Please select to status", + "trigger_event_placeholder": "Please select trigger event", + "side_effect_type": "Side Effect Type", + "side_effect_type_placeholder": "Please select side effect type", + "event_config": "Event Config", + "event_config_placeholder": "Please enter JSON event config", + "side_effect_config": "Side Effect Config", + "side_effect_config_placeholder": "Please enter JSON side effect config", + "description": "Transition Description", + "description_placeholder": "Please enter transition description" + }, + "columns": { + "step_name": "Step", + "from_status_name": "From Status", + "to_status_name": "To Status", + "trigger_event": "Trigger Event", + "transition_type": "Transition Type", + "auto_trigger": "Auto Trigger", + "priority": "Priority", + "sort": "Sort", + "status": "Status", + "created_at": "Created At" + } + }, + "transition_log": { + "title": "Transition Log", + "search": { + "work_order_no": "Work Order No.", + "work_order_no_placeholder": "Please enter work order no", + "step_id": "Step", + "step_id_placeholder": "Please select step", + "trigger_event": "Trigger Event", + "trigger_event_placeholder": "Please select trigger event", + "trigger_user": "Trigger User", + "trigger_user_placeholder": "Please enter trigger user", + "is_success": "Result", + "is_success_placeholder": "Please select result" + }, + "columns": { + "work_order_no": "Work Order No", + "step_name": "Step", + "from_status_name": "From Status", + "to_status_name": "To Status", + "transition_event": "Transition Rule", + "trigger_event": "Trigger Event", + "trigger_user": "Trigger User", + "trigger_ip": "Trigger IP", + "is_auto": "Auto Trigger", + "is_success": "Result", + "duration": "Duration(ms)", + "trigger_data": "Trigger Data", + "error_message": "Error Message", + "remark": "Remark", + "created_name": "Created By", + "created_at": "Created At" + } + }, + "config": { + "title": "Production Config" + }, + "scan_data": { + "title": "Scan Data" + }, + "exception_data": { + "title": "Exception Records" + }, + "exception_setting": { + "title": "Exception Settings" + }, + "exception_analysis": { + "title": "Exception Analysis" + } + } + } +} diff --git a/backend/plugin/produce/resource/template/admin/lang/zh-cn/zh.json b/backend/plugin/produce/resource/template/admin/lang/zh-cn/zh.json new file mode 100644 index 0000000..b3cf285 --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/lang/zh-cn/zh.json @@ -0,0 +1,217 @@ +{ + "produce": { + "common": { + "columns": { + "index": "序号" + } + }, + "modules": { + "process": { + "title": "工序管理", + "search": { + "process_code": "工序编码", + "process_code_placeholder": "请输入工序编码", + "process_name": "工序名称", + "process_name_placeholder": "请输入工序名称", + "status": "状态", + "status_placeholder": "请选择状态" + }, + "form": { + "process_code_placeholder": "请输入工序编码", + "process_name_placeholder": "请输入工序名称", + "description": "工序描述", + "description_placeholder": "请输入工序描述" + }, + "columns": { + "process_code": "工序编码", + "process_name": "工序名称", + "step_count": "步骤数", + "sort": "排序", + "status": "状态", + "created_at": "创建时间" + } + }, + "process_step": { + "title": "工序步骤", + "search": { + "process_id": "所属工序", + "process_id_placeholder": "请选择所属工序", + "step_code": "步骤编码", + "step_code_placeholder": "请输入步骤编码", + "step_name": "步骤名称", + "step_name_placeholder": "请输入步骤名称", + "status": "状态", + "status_placeholder": "请选择状态" + }, + "form": { + "process_id": "所属工序", + "process_id_placeholder": "请选择所属工序", + "step_code_placeholder": "请输入步骤编码", + "step_name_placeholder": "请输入步骤名称", + "description": "步骤描述", + "description_placeholder": "请输入步骤描述" + }, + "columns": { + "process_name": "所属工序", + "step_code": "步骤编码", + "step_name": "步骤名称", + "sort": "排序", + "status": "状态", + "created_at": "创建时间" + } + }, + "step_status": { + "title": "步骤状态", + "search": { + "step_id": "所属步骤", + "step_id_placeholder": "请选择所属步骤", + "status_code": "状态编码", + "status_code_placeholder": "请输入状态编码", + "status_name": "状态名称", + "status_name_placeholder": "请输入状态名称", + "status": "状态", + "status_placeholder": "请选择状态" + }, + "form": { + "step_id": "所属步骤", + "step_id_placeholder": "请选择所属步骤", + "status_code_placeholder": "请输入状态编码", + "status_name_placeholder": "请输入状态名称", + "description": "状态描述", + "description_placeholder": "请输入状态描述" + }, + "columns": { + "step_name": "所属步骤", + "status_code": "状态编码", + "status_name": "状态名称", + "is_initial": "初始状态", + "is_final": "终态", + "sort": "排序", + "status": "状态", + "created_at": "创建时间" + } + }, + "step_relation": { + "title": "步骤关系", + "search": { + "from_step_id": "源步骤", + "from_step_id_placeholder": "请选择源步骤", + "to_step_id": "目标步骤", + "to_step_id_placeholder": "请选择目标步骤", + "relation_type": "关系类型", + "relation_type_placeholder": "请选择关系类型", + "status": "状态", + "status_placeholder": "请选择状态" + }, + "form": { + "from_step_id": "源步骤", + "from_step_id_placeholder": "请选择源步骤", + "to_step_id": "目标步骤", + "to_step_id_placeholder": "请选择目标步骤", + "flow_condition": "流转条件", + "flow_condition_placeholder": "请输入 JSON 格式流转条件", + "description": "关系描述", + "description_placeholder": "请输入关系描述" + }, + "columns": { + "from_step_name": "源步骤", + "to_step_name": "目标步骤", + "relation_type": "关系类型", + "priority": "优先级", + "flow_condition": "流转条件", + "sort": "排序", + "status": "状态", + "created_at": "创建时间" + } + }, + "status_transition": { + "title": "状态转换", + "search": { + "step_id": "所属步骤", + "step_id_placeholder": "请选择所属步骤", + "trigger_event": "触发事件", + "trigger_event_placeholder": "请选择触发事件", + "status": "状态", + "status_placeholder": "请选择状态" + }, + "form": { + "step_id": "所属步骤", + "step_id_placeholder": "请选择所属步骤", + "from_status_id": "源状态", + "from_status_id_placeholder": "请选择源状态", + "to_status_id": "目标状态", + "to_status_id_placeholder": "请选择目标状态", + "trigger_event_placeholder": "请选择触发事件", + "side_effect_type": "副作用类型", + "side_effect_type_placeholder": "请选择副作用类型", + "event_config": "事件配置", + "event_config_placeholder": "请输入 JSON 格式事件配置", + "side_effect_config": "副作用配置", + "side_effect_config_placeholder": "请输入 JSON 格式副作用配置", + "description": "转换描述", + "description_placeholder": "请输入转换描述" + }, + "columns": { + "step_name": "所属步骤", + "from_status_name": "源状态", + "to_status_name": "目标状态", + "trigger_event": "触发事件", + "transition_type": "转换类型", + "auto_trigger": "自动触发", + "priority": "优先级", + "sort": "排序", + "status": "状态", + "created_at": "创建时间" + } + }, + "transition_log": { + "title": "转换日志", + "search": { + "work_order_no": "工单编号", + "work_order_no_placeholder": "请输入工单编号", + "step_id": "所属步骤", + "step_id_placeholder": "请选择所属步骤", + "trigger_event": "触发事件", + "trigger_event_placeholder": "请选择触发事件", + "trigger_user": "触发用户", + "trigger_user_placeholder": "请输入触发用户", + "is_success": "执行结果", + "is_success_placeholder": "请选择执行结果" + }, + "columns": { + "work_order_no": "工单编号", + "step_name": "所属步骤", + "from_status_name": "源状态", + "to_status_name": "目标状态", + "transition_event": "转换规则", + "trigger_event": "触发事件", + "trigger_user": "触发用户", + "trigger_ip": "触发IP", + "is_auto": "自动触发", + "is_success": "执行结果", + "duration": "耗时(ms)", + "trigger_data": "触发数据", + "error_message": "错误信息", + "remark": "备注", + "created_name": "创建人", + "created_at": "创建时间" + } + }, + "config": { + "title": "生产配置" + }, + "scan_data": { + "title": "扫码数据" + }, + "exception_data": { + "title": "异常数据" + }, + "exception_setting": { + "title": "异常设置" + }, + "exception_analysis": { + "title": "异常数据分析" + } + } + } +} diff --git a/backend/plugin/produce/resource/template/admin/menu/admin.php b/backend/plugin/produce/resource/template/admin/menu/admin.php new file mode 100644 index 0000000..02598e3 --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/menu/admin.php @@ -0,0 +1,134 @@ + '生产管理', + 'code' => 'produce', + 'app' => 'produce', + 'path' => '/produce', + 'icon' => 'plugin', + 'children' => [ + [ + 'name' => '生产配置', + 'code' => 'produce:config:index', + 'app' => 'produce', + 'path' => '/produce/config', + 'component' => '/produce/config/index', + ], + [ + 'name' => '工序管理', + 'code' => 'produce:process:index', + 'app' => 'produce', + 'path' => '/produce/process', + 'component' => '/produce/process/index', + ], + [ + 'name' => '工序步骤', + 'code' => 'produce:process-step:index', + 'app' => 'produce', + 'path' => '/produce/process-step', + 'component' => '/produce/process-step/index', + ], + [ + 'name' => '步骤状态', + 'code' => 'produce:step-status:index', + 'app' => 'produce', + 'path' => '/produce/step-status', + 'component' => '/produce/step-status/index', + ], + [ + 'name' => '步骤关系', + 'code' => 'produce:step-relation:index', + 'app' => 'produce', + 'path' => '/produce/step-relation', + 'component' => '/produce/step-relation/index', + ], + [ + 'name' => '状态转换', + 'code' => 'produce:status-transition:index', + 'app' => 'produce', + 'path' => '/produce/status-transition', + 'component' => '/produce/status-transition/index', + ], + [ + 'name' => '整机数据', + 'code' => 'produce:product-record:index', + 'app' => 'produce', + 'path' => '/produce/product-record', + 'component' => '/produce/product-record/index', + ], + [ + 'name' => '扫码数据', + 'code' => 'produce:scan-data:index', + 'app' => 'produce', + 'path' => '/produce/scan-data', + 'component' => '/produce/scan-data/index', + ], + [ + 'name' => '转换日志', + 'code' => 'produce:transition-log:index', + 'app' => 'produce', + 'path' => '/produce/transition-log', + 'component' => '/produce/transition-log/index', + ], + [ + 'name' => '异常管理', + 'code' => 'produce:exception:index', + 'app' => 'produce', + 'path' => '/produce/exception', + 'icon' => 'warning', + 'children' => [ + [ + 'name' => '异常数据', + 'code' => 'produce:exception-data:list', + 'app' => 'produce', + 'path' => '/produce/exception-data', + 'component' => '/produce/exception/data/index', + ], + [ + 'name' => '异常设置', + 'code' => 'produce:exception-setting:list', + 'app' => 'produce', + 'path' => '/produce/exception-setting', + 'component' => '/produce/exception/setting/index', + ], + [ + 'name' => '数据分析', + 'code' => 'produce:exception-analysis:read', + 'app' => 'produce', + 'path' => '/produce/exception-analysis', + 'component' => '/produce/exception/analysis/index', + ], + ], + ], + [ + 'name' => '数据统计', + 'code' => 'produce:statistics:index', + 'app' => 'produce', + 'path' => '/produce/statistics', + 'icon' => 'bar-chart-2', + 'children' => [ + [ + 'name' => '月工作统计', + 'code' => 'produce:statistics:monthly', + 'app' => 'produce', + 'path' => '/produce/statistics/monthly', + 'component' => '/produce/statistics/monthly/index', + ], + [ + 'name' => '日工作统计', + 'code' => 'produce:statistics:daily', + 'app' => 'produce', + 'path' => '/produce/statistics/daily', + 'component' => '/produce/statistics/daily/index', + ], + ], + ], + ], + ], +]; diff --git a/backend/plugin/produce/resource/template/admin/routes/index.ts b/backend/plugin/produce/resource/template/admin/routes/index.ts new file mode 100644 index 0000000..135eafe --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/routes/index.ts @@ -0,0 +1,215 @@ +import { AppRouteRecord } from "@/types/router"; +import { RoutesAlias } from "@/router/routesAlias"; + +export default { + path: "/produce", + name: "Produce", + component: RoutesAlias.Layout, + meta: { + title: "生产管理", + icon: "ri:plugin-line", + module: "produce", + }, + children: [ + { + path: "material-category", + name: "ProduceMaterialCategory", + component: "/produce/material-category/index", + meta: { + title: "物料分类", + icon: "ri:folder-2-line", + keepAlive: false, + module: "produce", + }, + }, + { + path: "material", + name: "ProduceMaterial", + component: "/produce/material/index", + meta: { + title: "物料库", + icon: "ri:archive-2-line", + keepAlive: false, + module: "produce", + }, + }, + { + path: "config", + name: "ProduceConfig", + component: "/produce/config/index", + meta: { + title: "生产配置", + icon: "ri:settings-3-line", + keepAlive: false, + module: "produce", + }, + }, + { + path: "process", + name: "ProduceProcess", + component: "/produce/process/index", + meta: { + title: "工序管理", + icon: "ri:stack-line", + keepAlive: false, + module: "produce", + }, + }, + { + path: "process-step", + name: "ProduceProcessStep", + component: "/produce/process-step/index", + meta: { + title: "工序步骤", + icon: "ri:list-check-3", + keepAlive: false, + module: "produce", + }, + }, + { + path: "step-status", + name: "ProduceStepStatus", + component: "/produce/step-status/index", + meta: { + title: "步骤状态", + icon: "ri:flag-2-line", + keepAlive: false, + module: "produce", + }, + }, + { + path: "step-relation", + name: "ProduceStepRelation", + component: "/produce/step-relation/index", + meta: { + title: "步骤关系", + icon: "ri:git-branch-line", + keepAlive: false, + module: "produce", + }, + }, + { + path: "status-transition", + name: "ProduceStatusTransition", + component: "/produce/status-transition/index", + meta: { + title: "状态转换", + icon: "ri:share-forward-line", + keepAlive: false, + module: "produce", + }, + }, + { + path: "product-record", + name: "ProduceProductRecord", + component: "/produce/product-record/index", + meta: { + title: "整机数据", + icon: "ri-product-hunt-line", + keepAlive: false, + module: "produce", + }, + }, + { + path: "scan-data", + name: "ProduceScanData", + component: "/produce/scan-data/index", + meta: { + title: "扫码数据", + icon: "ri:qr-scan-2-line", + keepAlive: false, + module: "produce", + }, + }, + { + path: "transition-log", + name: "ProduceTransitionLog", + component: "/produce/transition-log/index", + meta: { + title: "转换日志", + icon: "ri:file-list-3-line", + keepAlive: false, + module: "produce", + }, + }, + { + path: "repair", + name: "ProduceRepair", + meta: { + title: "维修管理", + icon: "ri:tools-line", + keepAlive: false, + module: "produce", + }, + children: [ + { + path: "repair-data", + name: "ProduceRepairData", + component: "/produce/repair/repair-data/index", + meta: { + title: "维修数据", + icon: "ri:file-list-3-line", + keepAlive: false, + module: "produce", + }, + }, + { + path: "repair-setting", + name: "ProduceRepairSetting", + component: "/produce/repair/repair-setting/index", + meta: { + title: "维修设置", + icon: "ri:settings-3-line", + keepAlive: false, + module: "produce", + }, + }, + { + path: "hardware-fault-description", + name: "ProduceHardwareFaultDescription", + component: "/produce/repair/hardware-fault-description/index", + meta: { + title: "硬件故障描述", + icon: "ri:tools-line", + keepAlive: false, + module: "produce", + }, + }, + ], + }, + { + path: "statistics", + name: "ProduceStatistics", + meta: { + title: "数据统计", + icon: "ri:bar-chart-2-line", + keepAlive: false, + module: "produce", + }, + children: [ + { + path: "monthly", + name: "ProduceMonthlyWorkStatistics", + component: "/produce/statistics/monthly/index", + meta: { + title: "月工作统计", + icon: "ri:calendar-2-line", + keepAlive: false, + module: "produce", + }, + }, + { + path: "daily", + name: "ProduceDailyWorkStatistics", + component: "/produce/statistics/daily/index", + meta: { + title: "日工作统计", + icon: "ri:time-line", + keepAlive: false, + module: "produce", + }, + }, + ], + }, + ], +} as AppRouteRecord; diff --git a/backend/plugin/produce/resource/template/admin/views/produce/config/index.vue b/backend/plugin/produce/resource/template/admin/views/produce/config/index.vue new file mode 100644 index 0000000..648d1cb --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/config/index.vue @@ -0,0 +1,52 @@ + + + diff --git a/backend/plugin/produce/resource/template/admin/views/produce/config/modules/basic-setting.vue b/backend/plugin/produce/resource/template/admin/views/produce/config/modules/basic-setting.vue new file mode 100644 index 0000000..ea96816 --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/config/modules/basic-setting.vue @@ -0,0 +1,175 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/admin/views/produce/config/modules/erp-integration.vue b/backend/plugin/produce/resource/template/admin/views/produce/config/modules/erp-integration.vue new file mode 100644 index 0000000..28aa92f --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/config/modules/erp-integration.vue @@ -0,0 +1,207 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/admin/views/produce/config/modules/specific-rule.vue b/backend/plugin/produce/resource/template/admin/views/produce/config/modules/specific-rule.vue new file mode 100644 index 0000000..34b58e6 --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/config/modules/specific-rule.vue @@ -0,0 +1,324 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/admin/views/produce/config/modules/step-rule.vue b/backend/plugin/produce/resource/template/admin/views/produce/config/modules/step-rule.vue new file mode 100644 index 0000000..eb9d66d --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/config/modules/step-rule.vue @@ -0,0 +1,237 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/admin/views/produce/exception/analysis/index.vue b/backend/plugin/produce/resource/template/admin/views/produce/exception/analysis/index.vue new file mode 100644 index 0000000..08326fd --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/exception/analysis/index.vue @@ -0,0 +1,228 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/admin/views/produce/exception/data/index.vue b/backend/plugin/produce/resource/template/admin/views/produce/exception/data/index.vue new file mode 100644 index 0000000..12bdc6d --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/exception/data/index.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/admin/views/produce/exception/data/schemas/index.tsx b/backend/plugin/produce/resource/template/admin/views/produce/exception/data/schemas/index.tsx new file mode 100644 index 0000000..3d4630e --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/exception/data/schemas/index.tsx @@ -0,0 +1,127 @@ +import { CrudSchema } from '@/components/crud' +import { ProduceExceptionRecordService } from '@/apps/produce/api' + +const statusOptions = [ + { label: '待处理', value: 0 }, + { label: '处理中', value: 1 }, + { label: '已处理', value: 2 }, +] + +export const crudSchema = (): CrudSchema => ({ + api: ProduceExceptionRecordService.list, + dialogTitle: '异常数据', + crudApi: { + add: ProduceExceptionRecordService.create, + edit: ProduceExceptionRecordService.update, + remove: ProduceExceptionRecordService.remove, + view: ProduceExceptionRecordService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'produce:exception-data:create', + editAuth: 'produce:exception-data:update', + removeAuth: 'produce:exception-data:delete', + viewAuth: 'produce:exception-data:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '90px', + schema: [ + { + prop: 'keyword', + label: '关键字', + component: 'Input', + componentProps: { clearable: true, placeholder: '单号、提报人、处理类型、原因或具体问题' }, + colSpan: 8, + }, + { + prop: 'type_code', + label: '处理类型', + component: 'Input', + componentProps: { clearable: true, placeholder: '请输入处理类型编码' }, + colSpan: 8, + }, + { + prop: 'status', + label: '处理状态', + component: 'Select', + componentProps: { clearable: true, placeholder: '请选择处理状态', options: statusOptions }, + colSpan: 8, + }, + { + prop: 'reported_at_range', + label: '提报时间', + component: 'DatePicker', + componentProps: { + type: 'daterange', + clearable: true, + valueFormat: 'YYYY-MM-DD', + startPlaceholder: '开始日期', + endPlaceholder: '结束日期', + }, + colSpan: 12, + }, + ], + }, + columns: [ + { type: 'selection' }, + { type: 'index', label: '序号', width: 70 }, + { prop: 'order_no', label: '单号/条码', minWidth: 160 }, + { prop: 'type_name', label: '处理类型', minWidth: 120 }, + { prop: 'reason_name', label: '异常原因', minWidth: 120 }, + { prop: 'issue_name', label: '具体问题', minWidth: 140 }, + { prop: 'reporter', label: '提报人', minWidth: 110 }, + { prop: 'status_name', label: '处理状态', minWidth: 100 }, + { prop: 'handler', label: '处理人', minWidth: 110 }, + { prop: 'reported_date', label: '提报时间', minWidth: 170 }, + { prop: 'handled_date', label: '处理时间', minWidth: 170 }, + ], + dialogProps: { width: '820px' }, + formSchema: { + showDefaultActions: false, + labelWidth: '105px', + schema: [ + { component: 'Input', prop: 'id', label: 'ID', show: false, ifDetail: true, colSpan: 24 }, + { + component: 'Input', prop: 'order_no', label: '单号/条码', + componentProps: { placeholder: '请输入单号或条码', maxlength: 100 }, + rules: [{ required: true, message: '请输入单号或条码' }], colSpan: 12, + }, + { component: 'Input', prop: 'user_code', label: '提报人工号', componentProps: { placeholder: '请输入提报人工号', maxlength: 50 }, colSpan: 12 }, + { component: 'Input', prop: 'reporter', label: '提报人', componentProps: { placeholder: '请输入提报人', maxlength: 100 }, colSpan: 12 }, + { + component: 'Input', prop: 'type_code', label: '处理类型编码', + componentProps: { placeholder: '例如 defective_repair', maxlength: 64 }, + rules: [{ required: true, message: '请输入处理类型编码' }], colSpan: 12, + }, + { + component: 'Input', prop: 'type_name', label: '处理类型', + componentProps: { placeholder: '例如 不良维修', maxlength: 100 }, + rules: [{ required: true, message: '请输入处理类型' }], colSpan: 12, + }, + { + component: 'Input', prop: 'reason_code', label: '异常原因编码', + componentProps: { placeholder: '例如 test_defect', maxlength: 64 }, + rules: [{ required: true, message: '请输入异常原因编码' }], colSpan: 12, + }, + { + component: 'Input', prop: 'reason_name', label: '异常原因', + componentProps: { placeholder: '例如 测试不良', maxlength: 100 }, + rules: [{ required: true, message: '请输入异常原因' }], colSpan: 12, + }, + { component: 'Input', prop: 'issue_code', label: '具体问题编码', componentProps: { placeholder: '可选', maxlength: 64 }, colSpan: 12 }, + { component: 'Input', prop: 'issue_name', label: '具体问题', componentProps: { placeholder: '可选', maxlength: 100 }, colSpan: 12 }, + { component: 'Select', prop: 'status', label: '处理状态', defaultValue: 0, componentProps: { options: statusOptions }, colSpan: 12 }, + { component: 'Input', prop: 'handler', label: '处理人', componentProps: { placeholder: '请输入处理人', maxlength: 100 }, colSpan: 12 }, + { + component: 'Upload', prop: 'images', label: '现场图片', componentProps: { listType: 'picture-card' }, ifDetail: true, colSpan: 24, + }, + { + component: 'Input', prop: 'remark', label: '补充说明', + componentProps: { type: 'textarea', rows: 3, placeholder: '请输入现场情况或处理说明' }, colSpan: 24, + }, + ], + }, +}) diff --git a/backend/plugin/produce/resource/template/admin/views/produce/exception/setting/index.vue b/backend/plugin/produce/resource/template/admin/views/produce/exception/setting/index.vue new file mode 100644 index 0000000..a4a5e48 --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/exception/setting/index.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/admin/views/produce/exception/setting/schemas/index.tsx b/backend/plugin/produce/resource/template/admin/views/produce/exception/setting/schemas/index.tsx new file mode 100644 index 0000000..fac58e4 --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/exception/setting/schemas/index.tsx @@ -0,0 +1,100 @@ +import { CrudSchema } from '@/components/crud' +import { ProduceExceptionSettingService } from '@/apps/produce/api' + +const settingTypeOptions = [ + { label: '处理类型', value: 'type' }, + { label: '异常原因', value: 'reason' }, + { label: '具体问题', value: 'issue' }, +] + +export const crudSchema = (): CrudSchema => ({ + api: ProduceExceptionSettingService.list, + dialogTitle: '异常设置', + crudApi: { + add: ProduceExceptionSettingService.create, + edit: ProduceExceptionSettingService.update, + remove: ProduceExceptionSettingService.remove, + view: ProduceExceptionSettingService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'produce:exception-setting:create', + editAuth: 'produce:exception-setting:update', + removeAuth: 'produce:exception-setting:delete', + viewAuth: 'produce:exception-setting:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '90px', + schema: [ + { + prop: 'keyword', label: '关键字', component: 'Input', + componentProps: { clearable: true, placeholder: '编码、名称或备注' }, colSpan: 8, + }, + { + prop: 'setting_type', label: '设置层级', component: 'Select', + componentProps: { clearable: true, placeholder: '请选择设置层级', options: settingTypeOptions }, colSpan: 8, + }, + { + prop: 'is_enabled', label: '启用状态', component: 'Select', + componentProps: { + clearable: true, placeholder: '请选择启用状态', + options: [{ label: '启用', value: 1 }, { label: '停用', value: 0 }], + }, colSpan: 8, + }, + ], + }, + columns: [ + { type: 'selection' }, + { type: 'index', label: '序号', width: 70 }, + { prop: 'setting_type', label: '设置层级', minWidth: 100, formatter: (row: { setting_type?: string }) => settingTypeOptions.find((item) => item.value === row.setting_type)?.label || row.setting_type || '' }, + { prop: 'code', label: '编码', minWidth: 150 }, + { prop: 'name', label: '名称', minWidth: 160 }, + { prop: 'parent_name', label: '所属上级', minWidth: 140 }, + { prop: 'sort', label: '排序', width: 90 }, + { prop: 'is_enabled', label: '状态', width: 90, formatter: (row: any) => row.is_enabled === 0 ? '停用' : '启用' }, + { prop: 'remark', label: '备注', minWidth: 180, showOverflowTooltip: true }, + { prop: 'created_name', label: '创建人', minWidth: 110 }, + ], + dialogProps: { width: '700px' }, + formSchema: { + showDefaultActions: false, + labelWidth: '105px', + schema: [ + { component: 'Input', prop: 'id', label: 'ID', show: false, ifDetail: true, colSpan: 24 }, + { + component: 'Select', prop: 'setting_type', label: '设置层级', + componentProps: { placeholder: '请选择设置层级', options: settingTypeOptions }, + rules: [{ required: true, message: '请选择设置层级' }], colSpan: 12, + }, + { + component: 'ApiSelect', prop: 'parent_id', label: '所属上级', + componentProps: { + api: '/produce/exception-setting', requestMethod: 'get', + params: { format: 'select', NE_setting_type: 'issue' }, clearable: true, placeholder: '处理类型无需选择上级', + }, colSpan: 12, + }, + { + component: 'Input', prop: 'code', label: '设置编码', + componentProps: { placeholder: '请输入唯一编码', maxlength: 64 }, + rules: [{ required: true, message: '请输入设置编码' }], colSpan: 12, + }, + { + component: 'Input', prop: 'name', label: '设置名称', + componentProps: { placeholder: '请输入显示名称', maxlength: 100 }, + rules: [{ required: true, message: '请输入设置名称' }], colSpan: 12, + }, + { component: 'InputNumber', prop: 'sort', label: '排序', defaultValue: 0, componentProps: { min: 0 }, colSpan: 12 }, + { + component: 'RadioGroup', prop: 'is_enabled', label: '是否启用', defaultValue: 1, + componentProps: { options: [{ label: '启用', value: 1 }, { label: '停用', value: 0 }] }, colSpan: 12, + }, + { + component: 'Input', prop: 'remark', label: '备注', + componentProps: { type: 'textarea', rows: 3, placeholder: '请输入备注' }, colSpan: 24, + }, + ], + }, +}) diff --git a/backend/plugin/produce/resource/template/admin/views/produce/material-category/index.vue b/backend/plugin/produce/resource/template/admin/views/produce/material-category/index.vue new file mode 100644 index 0000000..e424302 --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/material-category/index.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/admin/views/produce/material-category/schemas/index.tsx b/backend/plugin/produce/resource/template/admin/views/produce/material-category/schemas/index.tsx new file mode 100644 index 0000000..5282377 --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/material-category/schemas/index.tsx @@ -0,0 +1,42 @@ +import { CrudSchema } from '@/components/crud' +import { ProduceMaterialCategoryService } from '../../../../api' + +export const crudSchema = (): CrudSchema => ({ + api: ProduceMaterialCategoryService.list, + dialogTitle: '物料分类', + crudApi: { + add: ProduceMaterialCategoryService.create, + edit: ProduceMaterialCategoryService.update, + remove: ProduceMaterialCategoryService.remove, + view: ProduceMaterialCategoryService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'produce:material-category:create', + editAuth: 'produce:material-category:update', + removeAuth: 'produce:material-category:delete', + viewAuth: 'produce:material-category:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '90px', + schema: [{ prop: 'LIKE_category_name', label: '分类名称', component: 'Input', componentProps: { clearable: true, placeholder: '请输入分类名称' }, colSpan: 8 }], + }, + columns: [ + { type: 'selection' }, + { type: 'index', label: '序号', width: 70 }, + { prop: 'category_name', label: '分类名称', minWidth: 220 }, + { prop: 'created_date', label: '创建时间', minWidth: 180 }, + ], + dialogProps: { width: '520px' }, + formSchema: { + showDefaultActions: false, + labelWidth: '90px', + schema: [ + { component: 'Input', show: false, ifDetail: true, colSpan: 24, prop: 'id', label: 'ID' }, + { component: 'Input', prop: 'category_name', label: '分类名称', componentProps: { maxlength: 100, placeholder: '请输入分类名称' }, rules: [{ required: true, message: '请输入分类名称' }], colSpan: 24 }, + ], + }, +}) diff --git a/backend/plugin/produce/resource/template/admin/views/produce/material/index.vue b/backend/plugin/produce/resource/template/admin/views/produce/material/index.vue new file mode 100644 index 0000000..ef5768a --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/material/index.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/admin/views/produce/material/schemas/index.tsx b/backend/plugin/produce/resource/template/admin/views/produce/material/schemas/index.tsx new file mode 100644 index 0000000..71e2114 --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/material/schemas/index.tsx @@ -0,0 +1,50 @@ +import { CrudSchema } from '@/components/crud' +import { ProduceMaterialService } from '../../../../api' + +export const crudSchema = (): CrudSchema => ({ + api: ProduceMaterialService.list, + dialogTitle: '物料库', + crudApi: { + add: ProduceMaterialService.create, + edit: ProduceMaterialService.update, + remove: ProduceMaterialService.remove, + view: ProduceMaterialService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + hasExport: true, + addAuth: 'produce:material:create', + editAuth: 'produce:material:update', + removeAuth: 'produce:material:delete', + viewAuth: 'produce:material:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '90px', + schema: [ + { prop: 'keyword', label: '关键字', component: 'Input', componentProps: { clearable: true, placeholder: '商品编码或商品名称' }, colSpan: 8 }, + { prop: 'category_id', label: '物料分类', component: 'ApiSelect', componentProps: { api: ProduceMaterialService.categoryOptions, labelField: 'category_name', valueField: 'id', clearable: true, placeholder: '请选择分类' }, colSpan: 8 }, + ], + }, + columns: [ + { type: 'selection' }, + { type: 'index', label: '序号', width: 70 }, + { prop: 'category_name', label: '物料分类', minWidth: 160 }, + { prop: 'product_code', label: '商品编码', minWidth: 180 }, + { prop: 'product_name', label: '商品名称', minWidth: 220 }, + { prop: 'created_date', label: '创建时间', minWidth: 180 }, + ], + dialogProps: { width: '640px' }, + formSchema: { + showDefaultActions: false, + labelWidth: '90px', + schema: [ + { component: 'Input', show: false, ifDetail: true, colSpan: 24, prop: 'id', label: 'ID' }, + { component: 'ApiSelect', prop: 'category_id', label: '物料分类', componentProps: { api: ProduceMaterialService.categoryOptions, labelField: 'category_name', valueField: 'id', clearable: true, placeholder: '请选择分类' }, rules: [{ required: true, message: '请选择物料分类' }], colSpan: 12 }, + { component: 'Input', prop: 'product_code', label: '商品编码', componentProps: { maxlength: 100, placeholder: '请输入或扫描商品编码' }, rules: [{ required: true, message: '请输入商品编码' }], colSpan: 12 }, + { component: 'Input', prop: 'product_name', label: '商品名称', componentProps: { maxlength: 200, placeholder: '请输入商品名称' }, rules: [{ required: true, message: '请输入商品名称' }], colSpan: 24 }, + ], + }, +}) diff --git a/backend/plugin/produce/resource/template/admin/views/produce/process-step/index.vue b/backend/plugin/produce/resource/template/admin/views/produce/process-step/index.vue new file mode 100644 index 0000000..3305168 --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/process-step/index.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/admin/views/produce/process-step/schemas/index.tsx b/backend/plugin/produce/resource/template/admin/views/produce/process-step/schemas/index.tsx new file mode 100644 index 0000000..487fe0a --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/process-step/schemas/index.tsx @@ -0,0 +1,185 @@ +import { CrudSchema } from '@/components/crud' +import { DictEnum } from '@/enums' +import { $t } from '@/locales' +import { ProduceProcessStepService } from '../../../../api/index' + +export const crudSchema = (): CrudSchema => { + return { + api: ProduceProcessStepService.list, + dialogTitle: $t('produce.modules.process_step.title'), + crudApi: { + add: ProduceProcessStepService.create, + edit: ProduceProcessStepService.update, + remove: ProduceProcessStepService.remove, + view: ProduceProcessStepService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'produce:process-step:create', + editAuth: 'produce:process-step:update', + removeAuth: 'produce:process-step:delete', + viewAuth: 'produce:process-step:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'process_id', + label: $t('produce.modules.process_step.search.process_id'), + component: 'ApiSelect', + componentProps: { + api: '/produce/process', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: $t('produce.modules.process_step.search.process_id_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'LIKE_step_code', + label: $t('produce.modules.process_step.search.step_code'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('produce.modules.process_step.search.step_code_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'LIKE_step_name', + label: $t('produce.modules.process_step.search.step_name'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('produce.modules.process_step.search.step_name_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'status', + label: $t('produce.modules.process_step.search.status'), + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + clearable: true, + placeholder: $t('produce.modules.process_step.search.status_placeholder'), + }, + colSpan: 6, + }, + ], + }, + columns: [ + { type: 'selection' }, + { type: 'index', label: $t('produce.common.columns.index'), width: 70 }, + { + prop: 'process.process_name', + label: $t('produce.modules.process_step.columns.process_name'), + minWidth: 180, + }, + { prop: 'step_code', label: $t('produce.modules.process_step.columns.step_code'), minWidth: 160 }, + { prop: 'step_name', label: $t('produce.modules.process_step.columns.step_name'), minWidth: 180 }, + { prop: 'sort', label: $t('produce.modules.process_step.columns.sort'), width: 100 }, + { + prop: 'status', + label: $t('produce.modules.process_step.columns.status'), + width: 120, + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + }, + }, + { prop: 'created_date', label: $t('produce.modules.process_step.columns.created_at'), minWidth: 180 }, + ], + dialogProps: { + width: '680px', + }, + formSchema: { + showDefaultActions: false, + labelWidth: '110px', + schema: [ + { + component: 'Input', + show: false, + ifDetail: true, + colSpan: 24, + prop: 'id', + label: 'ID', + }, + { + component: 'ApiSelect', + prop: 'process_id', + label: $t('produce.modules.process_step.form.process_id'), + componentProps: { + api: '/produce/process', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: $t('produce.modules.process_step.form.process_id_placeholder'), + }, + rules: [{ required: true, message: $t('produce.modules.process_step.form.process_id_placeholder') }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'step_code', + label: $t('produce.modules.process_step.columns.step_code'), + componentProps: { + placeholder: $t('produce.modules.process_step.form.step_code_placeholder'), + maxlength: 50, + }, + rules: [{ required: true, message: $t('produce.modules.process_step.form.step_code_placeholder') }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'step_name', + label: $t('produce.modules.process_step.columns.step_name'), + componentProps: { + placeholder: $t('produce.modules.process_step.form.step_name_placeholder'), + maxlength: 100, + }, + rules: [{ required: true, message: $t('produce.modules.process_step.form.step_name_placeholder') }], + colSpan: 12, + }, + { + component: 'InputNumber', + prop: 'sort', + label: $t('produce.modules.process_step.columns.sort'), + defaultValue: 0, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'ApiDict', + prop: 'status', + label: $t('produce.modules.process_step.columns.status'), + defaultValue: 1, + componentProps: { + code: DictEnum.SYS_YES_NO, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 24, + }, + { + component: 'Input', + prop: 'description', + label: $t('produce.modules.process_step.form.description'), + componentProps: { + type: 'textarea', + rows: 4, + placeholder: $t('produce.modules.process_step.form.description_placeholder'), + }, + colSpan: 24, + }, + ], + }, + } +} diff --git a/backend/plugin/produce/resource/template/admin/views/produce/process/index.vue b/backend/plugin/produce/resource/template/admin/views/produce/process/index.vue new file mode 100644 index 0000000..c2d5b17 --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/process/index.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/admin/views/produce/process/schemas/index.tsx b/backend/plugin/produce/resource/template/admin/views/produce/process/schemas/index.tsx new file mode 100644 index 0000000..c662f03 --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/process/schemas/index.tsx @@ -0,0 +1,154 @@ +import { CrudSchema } from '@/components/crud' +import { DictEnum } from '@/enums' +import { $t } from '@/locales' +import { ProduceProcessService } from '../../../../api/index' + +export const crudSchema = (): CrudSchema => { + return { + api: ProduceProcessService.list, + dialogTitle: $t('produce.modules.process.title'), + crudApi: { + add: ProduceProcessService.create, + edit: ProduceProcessService.update, + remove: ProduceProcessService.remove, + view: ProduceProcessService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'produce:process:create', + editAuth: 'produce:process:update', + removeAuth: 'produce:process:delete', + viewAuth: 'produce:process:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'LIKE_process_code', + label: $t('produce.modules.process.search.process_code'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('produce.modules.process.search.process_code_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'LIKE_process_name', + label: $t('produce.modules.process.search.process_name'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('produce.modules.process.search.process_name_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'status', + label: $t('produce.modules.process.search.status'), + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + clearable: true, + placeholder: $t('produce.modules.process.search.status_placeholder'), + }, + colSpan: 6, + }, + ], + }, + columns: [ + { type: 'selection' }, + { type: 'index', label: $t('produce.common.columns.index'), width: 70 }, + { prop: 'process_code', label: $t('produce.modules.process.columns.process_code'), minWidth: 160 }, + { prop: 'process_name', label: $t('produce.modules.process.columns.process_name'), minWidth: 180 }, + { prop: 'step_count', label: $t('produce.modules.process.columns.step_count'), width: 120 }, + { prop: 'sort', label: $t('produce.modules.process.columns.sort'), width: 100 }, + { + prop: 'status', + label: $t('produce.modules.process.columns.status'), + width: 120, + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + }, + }, + { prop: 'created_date', label: $t('produce.modules.process.columns.created_at'), minWidth: 180 }, + ], + dialogProps: { + width: '640px', + }, + formSchema: { + showDefaultActions: false, + labelWidth: '100px', + schema: [ + { + component: 'Input', + show: false, + ifDetail: true, + colSpan: 24, + prop: 'id', + label: 'ID', + }, + { + component: 'Input', + prop: 'process_code', + label: $t('produce.modules.process.columns.process_code'), + componentProps: { + placeholder: $t('produce.modules.process.form.process_code_placeholder'), + maxlength: 50, + }, + rules: [{ required: true, message: $t('produce.modules.process.form.process_code_placeholder') }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'process_name', + label: $t('produce.modules.process.columns.process_name'), + componentProps: { + placeholder: $t('produce.modules.process.form.process_name_placeholder'), + maxlength: 100, + }, + rules: [{ required: true, message: $t('produce.modules.process.form.process_name_placeholder') }], + colSpan: 12, + }, + { + component: 'InputNumber', + prop: 'sort', + label: $t('produce.modules.process.columns.sort'), + defaultValue: 0, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'ApiDict', + prop: 'status', + label: $t('produce.modules.process.columns.status'), + defaultValue: 1, + componentProps: { + code: DictEnum.SYS_YES_NO, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 12, + }, + { + component: 'Input', + prop: 'description', + label: $t('produce.modules.process.form.description'), + componentProps: { + type: 'textarea', + rows: 4, + placeholder: $t('produce.modules.process.form.description_placeholder'), + }, + colSpan: 24, + }, + ], + }, + } +} diff --git a/backend/plugin/produce/resource/template/admin/views/produce/product-record/index.vue b/backend/plugin/produce/resource/template/admin/views/produce/product-record/index.vue new file mode 100644 index 0000000..bdd4600 --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/product-record/index.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/admin/views/produce/product-record/schemas/index.tsx b/backend/plugin/produce/resource/template/admin/views/produce/product-record/schemas/index.tsx new file mode 100644 index 0000000..ae2abe9 --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/product-record/schemas/index.tsx @@ -0,0 +1,249 @@ +import { CrudSchema } from '@/components/crud' +import { ProduceProductRecordService } from '@/apps/produce/api' + +export const crudSchema = (): CrudSchema => { + return { + api: ProduceProductRecordService.list, + dialogTitle: '整机数据', + crudApi: { + add: ProduceProductRecordService.create, + edit: ProduceProductRecordService.update, + remove: ProduceProductRecordService.remove, + view: ProduceProductRecordService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'produce:product-record:create', + editAuth: 'produce:product-record:update', + removeAuth: 'produce:product-record:delete', + viewAuth: 'produce:product-record:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'keyword', + label: '关键字', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入加工单号/商品编码/操作人员/备注', + }, + colSpan: 6, + }, + { + prop: 'process_id', + label: '工序名称', + component: 'ApiSelect', + componentProps: { + api: '/produce/process', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: '请选择工序', + }, + colSpan: 6, + }, + { + prop: 'step_id', + label: '步骤名称', + component: 'ApiSelect', + componentProps: { + api: '/produce/process-step', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: '请选择步骤', + }, + colSpan: 6, + }, + { + prop: 'status_id', + label: '步骤状态', + component: 'ApiSelect', + componentProps: { + api: '/produce/step-status', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: '请选择状态', + }, + colSpan: 6, + }, + { + prop: 'scan_result', + label: '扫码结果', + component: 'Select', + componentProps: { + clearable: true, + placeholder: '请选择扫码结果', + options: [ + { label: '成功', value: 1 }, + { label: '失败', value: 0 }, + ], + }, + colSpan: 6, + }, + { + prop: 'created_time_range', + label: '创建时间', + component: 'DatePicker', + componentProps: { + type: 'daterange', + clearable: true, + valueFormat: 'YYYY-MM-DD', + startPlaceholder: '开始日期', + endPlaceholder: '结束日期', + }, + colSpan: 12, + }, + ], + }, + columns: [ + { type: 'selection' }, + { type: 'index', label: '序号', width: 70 }, + { prop: 'process_order_no', label: '加工单号', minWidth: 160 }, + { prop: 'product_code', label: '商品编码', minWidth: 160 }, + { prop: 'quantity', label: '数量', width: 100 }, + { prop: 'process_name', label: '工序名称', minWidth: 140 }, + { prop: 'step_name', label: '步骤名称', minWidth: 140 }, + { prop: 'status_name', label: '步骤状态', minWidth: 120 }, + { prop: 'operator', label: '操作人员', minWidth: 120 }, + { + prop: 'scan_result', + label: '扫码结果', + width: 100, + formatter: (row: any) => (row.scan_result === 0 ? '失败' : '成功'), + }, + { prop: 'created_date', label: '创建时间', minWidth: 180 }, + { prop: 'created_name', label: '创建人', minWidth: 120 }, + ], + dialogProps: { + width: '760px', + }, + formSchema: { + showDefaultActions: false, + labelWidth: '110px', + schema: [ + { + component: 'Input', + show: false, + ifDetail: true, + colSpan: 24, + prop: 'id', + label: 'ID', + }, + { + component: 'Input', + prop: 'process_order_no', + label: '加工单号', + componentProps: { + placeholder: '请输入加工单号', + maxlength: 100, + }, + rules: [{ required: true, message: '请输入加工单号' }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'product_code', + label: '商品编码', + componentProps: { + placeholder: '请输入商品编码', + maxlength: 100, + }, + rules: [{ required: true, message: '请输入商品编码' }], + colSpan: 12, + }, + { + component: 'InputNumber', + prop: 'quantity', + label: '数量', + defaultValue: 1, + componentProps: { + min: 1, + precision: 0, + }, + rules: [{ required: true, message: '请输入数量' }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'user_code', + label: '用户编码', + componentProps: { + placeholder: '请输入用户编码', + maxlength: 50, + }, + rules: [{ required: true, message: '请输入用户编码' }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'operator', + label: '操作人员', + componentProps: { + placeholder: '请输入操作人员', + maxlength: 100, + }, + colSpan: 12, + }, + { + component: 'Input', + prop: 'process_name', + label: '工序名称', + componentProps: { + disabled: true, + }, + colSpan: 12, + }, + { + component: 'Input', + prop: 'step_name', + label: '步骤名称', + componentProps: { + disabled: true, + }, + colSpan: 12, + }, + { + component: 'Input', + prop: 'status_name', + label: '步骤状态', + componentProps: { + disabled: true, + }, + colSpan: 12, + }, + { + component: 'RadioGroup', + prop: 'scan_result', + label: '扫码结果', + defaultValue: 1, + componentProps: { + options: [ + { label: '成功', value: 1 }, + { label: '失败', value: 0 }, + ], + }, + rules: [{ required: true, message: '请选择扫码结果' }], + colSpan: 24, + }, + { + component: 'Input', + prop: 'remark', + label: '备注', + componentProps: { + type: 'textarea', + rows: 3, + placeholder: '请输入备注', + }, + colSpan: 24, + }, + ], + }, + } +} diff --git a/backend/plugin/produce/resource/template/admin/views/produce/repair/hardware-fault-description/index.vue b/backend/plugin/produce/resource/template/admin/views/produce/repair/hardware-fault-description/index.vue new file mode 100644 index 0000000..ebd6782 --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/repair/hardware-fault-description/index.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/admin/views/produce/repair/hardware-fault-description/schemas/index.tsx b/backend/plugin/produce/resource/template/admin/views/produce/repair/hardware-fault-description/schemas/index.tsx new file mode 100644 index 0000000..a3eeb0f --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/repair/hardware-fault-description/schemas/index.tsx @@ -0,0 +1,135 @@ +import { CrudSchema } from "@/components/crud"; +import { ProduceHardwareFaultDescriptionService } from "@/apps/produce/api"; + +const enabledOptions = [ + { label: "启用", value: 1 }, + { label: "停用", value: 0 }, +]; + +export const crudSchema = (): CrudSchema => ({ + api: ProduceHardwareFaultDescriptionService.list, + dialogTitle: "硬件故障描述", + crudApi: { + add: ProduceHardwareFaultDescriptionService.create, + edit: ProduceHardwareFaultDescriptionService.update, + remove: ProduceHardwareFaultDescriptionService.remove, + view: ProduceHardwareFaultDescriptionService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: "produce:hardware-fault-description:create", + editAuth: "produce:hardware-fault-description:update", + removeAuth: "produce:hardware-fault-description:delete", + viewAuth: "produce:hardware-fault-description:read", + rowKey: "id", + searchFormSchema: { + labelWidth: "90px", + schema: [ + { + prop: "category_id", + label: "物料分类", + component: "ApiSelect", + componentProps: { + api: ProduceHardwareFaultDescriptionService.categoryOptions, + labelField: "label", + valueField: "value", + clearable: true, + }, + colSpan: 8, + }, + { + prop: "keyword", + label: "关键字", + component: "Input", + componentProps: { clearable: true, placeholder: "故障描述或备注" }, + colSpan: 8, + }, + { + prop: "is_enabled", + label: "启用状态", + component: "Select", + componentProps: { clearable: true, options: enabledOptions }, + colSpan: 8, + }, + ], + }, + columns: [ + { type: "selection" }, + { type: "index", label: "序号", width: 70 }, + { prop: "category_name", label: "物料分类", minWidth: 160 }, + { + prop: "description", + label: "硬件故障描述", + minWidth: 300, + showOverflowTooltip: true, + }, + { prop: "use_count", label: "使用次数", width: 100 }, + { + prop: "is_enabled", + label: "状态", + width: 90, + formatter: (row: { is_enabled?: number }) => + row.is_enabled === 0 ? "停用" : "启用", + }, + { prop: "remark", label: "备注", minWidth: 180, showOverflowTooltip: true }, + { prop: "created_date", label: "创建时间", minWidth: 180 }, + ], + dialogProps: { width: "720px" }, + formSchema: { + showDefaultActions: false, + labelWidth: "110px", + schema: [ + { + component: "Input", + prop: "id", + label: "ID", + show: false, + ifDetail: true, + colSpan: 24, + }, + { + component: "ApiSelect", + prop: "category_id", + label: "物料分类", + componentProps: { + api: ProduceHardwareFaultDescriptionService.categoryOptions, + labelField: "label", + valueField: "value", + clearable: true, + placeholder: "请选择物料分类", + }, + rules: [{ required: true, message: "请选择物料分类" }], + colSpan: 12, + }, + { + component: "RadioGroup", + prop: "is_enabled", + label: "是否启用", + defaultValue: 1, + componentProps: { options: enabledOptions }, + colSpan: 12, + }, + { + component: "Input", + prop: "description", + label: "故障描述", + componentProps: { + maxlength: 500, + placeholder: "请输入该物料分类的硬件故障描述", + }, + rules: [{ required: true, message: "请输入硬件故障描述" }], + colSpan: 24, + }, + { + component: "Input", + prop: "remark", + label: "备注", + componentProps: { type: "textarea", rows: 3, maxlength: 500 }, + colSpan: 24, + }, + ], + }, +}); diff --git a/backend/plugin/produce/resource/template/admin/views/produce/repair/repair-data/index.vue b/backend/plugin/produce/resource/template/admin/views/produce/repair/repair-data/index.vue new file mode 100644 index 0000000..aef41a3 --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/repair/repair-data/index.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/admin/views/produce/repair/repair-data/schemas/index.tsx b/backend/plugin/produce/resource/template/admin/views/produce/repair/repair-data/schemas/index.tsx new file mode 100644 index 0000000..d2db915 --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/repair/repair-data/schemas/index.tsx @@ -0,0 +1,490 @@ +import { h } from "vue"; +import { CrudSchema } from "@/components/crud"; +import { ProduceRepairRecordService } from "@/apps/produce/api"; + +const formatPartSource = (source: unknown): string => { + const labels: Record = { + new: "新料", + old: "售后", + after_sale: "售后", + after_sales: "售后", + "after-sale": "售后", + repair: "返修", + refurbished: "返修", + }; + const value = String(source || ""); + return labels[value] || value || "-"; +}; + +const parseParts = (parts: Array> | string | null | undefined): Array> => { + if (Array.isArray(parts)) return parts; + if (typeof parts !== "string" || !parts) return []; + try { + const parsed = JSON.parse(parts); + return Array.isArray(parsed) ? parsed : []; + } catch { + return []; + } +}; + +const formatPartValues = ( + parts: Array> | string | null | undefined, + getValue: (part: Record) => string, +): string => + parseParts(parts) + .map((part) => getValue(part)) + .filter(Boolean) + .join("\n"); + +const formatPartRows = ( + parts: Array> | string | null | undefined, + getValue: (part: Record) => string, + nowrap = true, +) => + h( + "div", + parseParts(parts).map((part) => + h( + "div", + { style: { lineHeight: "24px", minHeight: "24px", whiteSpace: nowrap ? "nowrap" : "normal" } }, + getValue(part) || "-", + ), + ), + ); + +const formatPartFaultDescriptions = (part: Record): string => + Array.isArray(part.fault_descriptions) + ? part.fault_descriptions + .map((fault: { description?: string }) => fault.description || "") + .filter(Boolean) + .join("、") + : ""; + +const formatCategoryNames = (row: { + category_names?: string[] | string | null; + category_name?: string | null; +}): string => { + const names = row.category_names; + if (Array.isArray(names)) return names.filter(Boolean).join("、"); + if (typeof names === "string" && names) { + try { + const parsed = JSON.parse(names); + if (Array.isArray(parsed)) return parsed.filter(Boolean).join("、"); + } catch { + return names; + } + return names; + } + return row.category_name || ""; +}; + +type ResponsibilitySnapshot = { + process_name?: string; + step_name?: string; + operator?: string; + user_code?: string; +}; + +const parseSnapshots = (snapshots: ResponsibilitySnapshot[] | string | null | undefined): ResponsibilitySnapshot[] => { + if (Array.isArray(snapshots)) return snapshots; + if (typeof snapshots !== "string" || !snapshots) return []; + try { + const parsed = JSON.parse(snapshots); + return Array.isArray(parsed) ? parsed : []; + } catch { + return []; + } +}; + +const formatRepairResult = (repairResult?: string | null): string => { + const labels: Record = { + material_defect: "物料不良", + operation_defect: "作业不良", + assembly_mismatch: "搭配错误", + }; + return labels[repairResult || ""] || repairResult || ""; +}; + +const formatOperationFaultSteps = (snapshots: ResponsibilitySnapshot[] | string | null | undefined): string => + parseSnapshots(snapshots) + .map((item) => [item.process_name, item.step_name].filter(Boolean).join(" · ")) + .filter(Boolean) + .join("\n"); + +const formatResponsibleOperators = (snapshots: ResponsibilitySnapshot[] | string | null | undefined): string => + parseSnapshots(snapshots) + .map((item) => { + const operator = item.operator || item.user_code || ""; + const process = [item.process_name, item.step_name].filter(Boolean).join(" · "); + return [operator, process].filter(Boolean).join("|"); + }) + .filter(Boolean) + .join("\n"); + +const formatResponsibleOperatorNames = (snapshots: ResponsibilitySnapshot[] | string | null | undefined): string => + parseSnapshots(snapshots) + .map((item) => { + const step = item.step_name || ""; + const operator = item.operator || item.user_code || ""; + return [step, operator].filter(Boolean).join("-"); + }) + .filter(Boolean) + .join("\n"); + +export const crudSchema = (): CrudSchema => ({ + api: ProduceRepairRecordService.list, + dialogTitle: "维修数据", + crudApi: { + add: ProduceRepairRecordService.create, + edit: ProduceRepairRecordService.update, + remove: ProduceRepairRecordService.remove, + view: ProduceRepairRecordService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + hasExport: true, + exportFileName: "维修数据", + exportFields: [ + { field: "repair_no", title: "维修单号" }, + { field: "order_product", title: "订单号/商品编码" }, + { field: "exception_type_name", title: "异常分类" }, + { field: "exception_reason", title: "异常原因" }, + { field: "part_category", title: "物料分类" }, + { field: "part_code", title: "物料编码" }, + { field: "part_name", title: "更换备件" }, + { field: "part_fault", title: "故障描述" }, + { field: "part_quantity", title: "数量" }, + { field: "part_source", title: "来源" }, + { field: "repair_result_name", title: "维修判定分类" }, + { field: "responsible_operator_names", title: "责任人员" }, + { field: "operator", title: "维修人员" }, + { field: "repaired_date", title: "维修时间" }, + ], + addAuth: "produce:repair-record:create", + editAuth: "produce:repair-record:update", + removeAuth: "produce:repair-record:delete", + viewAuth: "produce:repair-record:read", + rowKey: "id", + searchFormSchema: { + labelWidth: "90px", + schema: [ + { + prop: "keyword", + label: "关键字", + component: "Input", + componentProps: { + clearable: true, + placeholder: "维修单、订单、商品或故障描述", + }, + colSpan: 8, + }, + { + prop: "category_id", + label: "物料分类", + component: "ApiSelect", + componentProps: { + api: ProduceRepairRecordService.categoryOptions, + labelField: "label", + valueField: "value", + clearable: true, + }, + colSpan: 8, + }, + { + prop: "fault_description_id", + label: "故障描述", + component: "ApiSelect", + componentProps: { + api: ProduceRepairRecordService.faultDescriptionOptions, + labelField: "description", + valueField: "id", + clearable: true, + }, + colSpan: 8, + }, + ], + }, + columns: [ + { type: "selection" }, + { type: "index", label: "序号", width: 70 }, + { prop: "repair_no", label: "维修单号", minWidth: 160 }, + { + prop: "order_no", + label: "订单号/商品编码", + minWidth: 180, + cellStyle: { whiteSpace: "nowrap" }, + formatter: (row: { order_no?: string | null; product_code?: string | null }) => + [row.order_no, row.product_code].filter(Boolean).join("/"), + }, + { prop: "exception_type_name", label: "异常分类", minWidth: 120, cellStyle: { whiteSpace: "nowrap" } }, + { prop: "exception_reason", label: "异常原因", minWidth: 180, cellStyle: { whiteSpace: "nowrap" } }, + { + prop: "part_category", + label: "物料分类", + minWidth: 140, + cellStyle: { whiteSpace: "nowrap" }, + formatter: (row: { parts?: Array> | string | null }) => + formatPartRows(row.parts, (part) => part.category_name || ""), + }, + { + prop: "part_code", + label: "物料编码", + minWidth: 150, + cellStyle: { whiteSpace: "nowrap" }, + formatter: (row: { parts?: Array> | string | null }) => + formatPartRows(row.parts, (part) => part.product_code || ""), + }, + { + prop: "part_name", + label: "更换备件", + minWidth: 240, + cellStyle: { whiteSpace: "nowrap" }, + formatter: (row: { parts?: Array> | string | null }) => + formatPartRows(row.parts, (part) => part.product_name || "", true), + }, + { + prop: "part_fault", + label: "故障描述", + minWidth: 180, + cellStyle: { whiteSpace: "nowrap" }, + formatter: (row: { parts?: Array> | string | null }) => + formatPartRows(row.parts, formatPartFaultDescriptions), + }, + { + prop: "part_quantity", + label: "数量", + width: 80, + cellStyle: { whiteSpace: "nowrap" }, + formatter: (row: { parts?: Array> | string | null }) => + formatPartRows(row.parts, (part) => String(part.quantity ?? 1)), + }, + { + prop: "part_source", + label: "来源", + width: 90, + cellStyle: { whiteSpace: "nowrap" }, + formatter: (row: { parts?: Array> | string | null }) => + formatPartRows(row.parts, (part) => formatPartSource(part.source)), + }, + { + prop: "repair_result", + label: "维修判定分类", + minWidth: 140, + cellStyle: { whiteSpace: "nowrap" }, + formatter: (row: { repair_result?: string | null }) => formatRepairResult(row.repair_result), + }, + { + prop: "responsible_operators", + label: "责任人员", + minWidth: 120, + cellStyle: { whiteSpace: "nowrap" }, + formatter: (row: { responsible_operators?: ResponsibilitySnapshot[] | string | null }) => + formatResponsibleOperatorNames(row.responsible_operators), + }, + { prop: "operator", label: "维修人员", minWidth: 120, cellStyle: { whiteSpace: "nowrap" } }, + { prop: "repaired_date", label: "维修时间", minWidth: 180, cellStyle: { whiteSpace: "nowrap" } }, + ], + dialogProps: { width: "860px" }, + formSchema: { + showDefaultActions: false, + labelWidth: "105px", + schema: [ + { + component: "Input", + prop: "id", + label: "ID", + show: false, + ifDetail: true, + colSpan: 24, + }, + { + component: "Input", + prop: "repair_no", + label: "维修单号", + componentProps: { maxlength: 100, placeholder: "请输入维修单号" }, + rules: [{ required: true, message: "请输入维修单号" }], + colSpan: 12, + }, + { + component: "Input", + prop: "order_no", + label: "订单号", + componentProps: { maxlength: 100, placeholder: "请输入订单号" }, + colSpan: 12, + }, + { + component: "Input", + prop: "product_code", + label: "商品编码", + componentProps: { maxlength: 100, placeholder: "请输入商品编码" }, + colSpan: 12, + }, + { + component: "Input", + prop: "product_name", + label: "商品名称", + componentProps: { maxlength: 200, placeholder: "请输入商品名称" }, + colSpan: 12, + }, + { + component: "ApiSelect", + prop: "category_id", + label: "首选物料分类", + componentProps: { + api: ProduceRepairRecordService.categoryOptions, + labelField: "label", + valueField: "value", + clearable: true, + placeholder: "请选择首选物料分类", + }, + colSpan: 12, + }, + { + component: "Input", + prop: "category_names", + label: "物料分类", + componentProps: (model: { category_names?: string[] | string | null; category_name?: string | null }) => ({ + type: "textarea", + rows: 2, + readonly: true, + value: formatCategoryNames(model), + }), + ifDetail: true, + colSpan: 24, + }, + { + component: "ApiSelect", + prop: "fault_description_id", + label: "故障描述", + componentProps: { + api: ProduceRepairRecordService.faultDescriptionOptions, + labelField: "description", + valueField: "id", + clearable: true, + placeholder: "请选择硬件故障描述", + }, + colSpan: 12, + }, + { + component: "Input", + prop: "exception_reason", + label: "异常原因", + componentProps: (model: { exception_reason?: string | null; exception_issue?: string | null }) => ({ + type: "textarea", + rows: 2, + readonly: true, + value: [model.exception_reason, model.exception_issue].filter(Boolean).join(" · "), + }), + ifDetail: true, + colSpan: 24, + }, + { + component: "Input", + prop: "fault_descriptions", + label: "故障描述", + componentProps: (model: { fault_descriptions?: string[]; fault_description?: string | null }) => ({ + type: "textarea", + rows: 2, + readonly: true, + value: (model.fault_descriptions || []).join("、") || model.fault_description || "", + }), + ifDetail: true, + colSpan: 24, + }, + { + component: "PartsDetail", + prop: "parts", + label: "更换备件", + ifDetail: true, + colSpan: 24, + }, + { + component: "Select", + prop: "repair_result", + label: "维修判定", + componentProps: { + clearable: true, + options: [ + { label: "物料不良", value: "material_defect" }, + { label: "作业不良", value: "operation_defect" }, + { label: "搭配错误", value: "assembly_mismatch" }, + ], + }, + colSpan: 12, + }, + { + component: "Input", + prop: "repair_result_detail", + label: "维修判定", + componentProps: (model: { repair_result?: string | null }) => ({ + readonly: true, + value: formatRepairResult(model.repair_result), + }), + ifDetail: true, + colSpan: 12, + }, + { + component: "Input", + prop: "operation_fault_steps", + label: "责任步骤", + componentProps: (model: { operation_fault_steps?: ResponsibilitySnapshot[] | string | null }) => ({ + type: "textarea", + rows: 2, + readonly: true, + value: formatOperationFaultSteps(model.operation_fault_steps), + }), + ifDetail: true, + colSpan: 12, + }, + { + component: "Input", + prop: "responsible_operators", + label: "责任人员", + componentProps: (model: { responsible_operators?: ResponsibilitySnapshot[] | string | null }) => ({ + type: "textarea", + rows: 2, + readonly: true, + value: formatResponsibleOperators(model.responsible_operators), + }), + ifDetail: true, + colSpan: 24, + }, + { + component: "Upload", + prop: "images", + label: "维修现场图片", + componentProps: { listType: "picture-card" }, + ifDetail: true, + colSpan: 24, + }, + { + component: "Input", + prop: "operator", + label: "维修人员", + componentProps: { maxlength: 100, placeholder: "请输入维修人员" }, + colSpan: 12, + }, + { + component: "DatePicker", + prop: "repaired_at", + label: "维修时间", + componentProps: { + type: "datetime", + valueFormat: "x", + placeholder: "请选择维修时间", + }, + colSpan: 12, + }, + { + component: "Input", + prop: "remark", + label: "备注", + componentProps: { type: "textarea", rows: 3, maxlength: 1000 }, + colSpan: 24, + }, + ], + }, +}); diff --git a/backend/plugin/produce/resource/template/admin/views/produce/repair/repair-setting/index.vue b/backend/plugin/produce/resource/template/admin/views/produce/repair/repair-setting/index.vue new file mode 100644 index 0000000..037165f --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/repair/repair-setting/index.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/admin/views/produce/repair/repair-setting/schemas/index.tsx b/backend/plugin/produce/resource/template/admin/views/produce/repair/repair-setting/schemas/index.tsx new file mode 100644 index 0000000..831356e --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/repair/repair-setting/schemas/index.tsx @@ -0,0 +1,100 @@ +import { CrudSchema } from '@/components/crud' +import { ProduceRepairSettingService } from '@/apps/produce/api' + +const settingTypeOptions = [ + { label: '处理类型', value: 'type' }, + { label: '维修原因', value: 'reason' }, + { label: '具体问题', value: 'issue' }, +] + +export const crudSchema = (): CrudSchema => ({ + api: ProduceRepairSettingService.list, + dialogTitle: '维修设置', + crudApi: { + add: ProduceRepairSettingService.create, + edit: ProduceRepairSettingService.update, + remove: ProduceRepairSettingService.remove, + view: ProduceRepairSettingService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'produce:repair-setting:create', + editAuth: 'produce:repair-setting:update', + removeAuth: 'produce:repair-setting:delete', + viewAuth: 'produce:repair-setting:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '90px', + schema: [ + { + prop: 'keyword', label: '关键字', component: 'Input', + componentProps: { clearable: true, placeholder: '编码、名称或备注' }, colSpan: 8, + }, + { + prop: 'setting_type', label: '设置层级', component: 'Select', + componentProps: { clearable: true, placeholder: '请选择设置层级', options: settingTypeOptions }, colSpan: 8, + }, + { + prop: 'is_enabled', label: '启用状态', component: 'Select', + componentProps: { + clearable: true, placeholder: '请选择启用状态', + options: [{ label: '启用', value: 1 }, { label: '停用', value: 0 }], + }, colSpan: 8, + }, + ], + }, + columns: [ + { type: 'selection' }, + { type: 'index', label: '序号', width: 70 }, + { prop: 'setting_type', label: '设置层级', minWidth: 100, formatter: (row: { setting_type?: string }) => settingTypeOptions.find((item) => item.value === row.setting_type)?.label || row.setting_type || '' }, + { prop: 'code', label: '编码', minWidth: 150 }, + { prop: 'name', label: '名称', minWidth: 160 }, + { prop: 'parent_name', label: '所属上级', minWidth: 140 }, + { prop: 'sort', label: '排序', width: 90 }, + { prop: 'is_enabled', label: '状态', width: 90, formatter: (row: any) => row.is_enabled === 0 ? '停用' : '启用' }, + { prop: 'remark', label: '备注', minWidth: 180, showOverflowTooltip: true }, + { prop: 'created_name', label: '创建人', minWidth: 110 }, + ], + dialogProps: { width: '700px' }, + formSchema: { + showDefaultActions: false, + labelWidth: '105px', + schema: [ + { component: 'Input', prop: 'id', label: 'ID', show: false, ifDetail: true, colSpan: 24 }, + { + component: 'Select', prop: 'setting_type', label: '设置层级', + componentProps: { placeholder: '请选择设置层级', options: settingTypeOptions }, + rules: [{ required: true, message: '请选择设置层级' }], colSpan: 12, + }, + { + component: 'ApiSelect', prop: 'parent_id', label: '所属上级', + componentProps: { + api: '/produce/repair-setting', requestMethod: 'get', + params: { format: 'select', NE_setting_type: 'issue' }, clearable: true, placeholder: '处理类型无需选择上级', + }, colSpan: 12, + }, + { + component: 'Input', prop: 'code', label: '设置编码', + componentProps: { placeholder: '请输入唯一编码', maxlength: 64 }, + rules: [{ required: true, message: '请输入设置编码' }], colSpan: 12, + }, + { + component: 'Input', prop: 'name', label: '设置名称', + componentProps: { placeholder: '请输入显示名称', maxlength: 100 }, + rules: [{ required: true, message: '请输入设置名称' }], colSpan: 12, + }, + { component: 'InputNumber', prop: 'sort', label: '排序', defaultValue: 0, componentProps: { min: 0 }, colSpan: 12 }, + { + component: 'RadioGroup', prop: 'is_enabled', label: '是否启用', defaultValue: 1, + componentProps: { options: [{ label: '启用', value: 1 }, { label: '停用', value: 0 }] }, colSpan: 12, + }, + { + component: 'Input', prop: 'remark', label: '备注', + componentProps: { type: 'textarea', rows: 3, placeholder: '请输入备注' }, colSpan: 24, + }, + ], + }, +}) diff --git a/backend/plugin/produce/resource/template/admin/views/produce/scan-data/index.vue b/backend/plugin/produce/resource/template/admin/views/produce/scan-data/index.vue new file mode 100644 index 0000000..082d7b1 --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/scan-data/index.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/admin/views/produce/scan-data/schemas/index.tsx b/backend/plugin/produce/resource/template/admin/views/produce/scan-data/schemas/index.tsx new file mode 100644 index 0000000..045b17b --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/scan-data/schemas/index.tsx @@ -0,0 +1,254 @@ +import { CrudSchema } from '@/components/crud' +import { ProduceScanDataService } from '@/apps/produce/api' + +export const crudSchema = (): CrudSchema => { + return { + api: ProduceScanDataService.list, + dialogTitle: '扫码数据', + crudApi: { + add: ProduceScanDataService.create, + edit: ProduceScanDataService.update, + remove: ProduceScanDataService.remove, + view: ProduceScanDataService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'produce:scan-data:create', + editAuth: 'produce:scan-data:update', + removeAuth: 'produce:scan-data:delete', + viewAuth: 'produce:scan-data:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'keyword', + label: '关键字', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入订单号/用户编码/操作人员/备注', + }, + colSpan: 6, + }, + { + prop: 'process_id', + label: '工序名称', + component: 'ApiSelect', + componentProps: { + api: '/produce/process', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: '请选择工序', + }, + colSpan: 6, + }, + { + prop: 'step_id', + label: '步骤名称', + component: 'ApiSelect', + componentProps: { + api: '/produce/process-step', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: '请选择步骤', + }, + colSpan: 6, + }, + { + prop: 'status_id', + label: '步骤状态', + component: 'ApiSelect', + componentProps: { + api: '/produce/step-status', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: '请选择状态', + }, + colSpan: 6, + }, + { + prop: 'LIKE_operator', + label: '操作人员', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入操作人员', + }, + colSpan: 6, + }, + { + prop: 'scan_result', + label: '扫码结果', + component: 'Select', + componentProps: { + clearable: true, + placeholder: '请选择扫码结果', + options: [ + { label: '成功', value: 1 }, + { label: '失败', value: 0 }, + ], + }, + colSpan: 6, + }, + { + prop: 'scan_time_range', + label: '扫码时间', + component: 'DatePicker', + componentProps: { + type: 'daterange', + clearable: true, + valueFormat: 'YYYY-MM-DD', + startPlaceholder: '开始日期', + endPlaceholder: '结束日期', + }, + colSpan: 12, + }, + ], + }, + columns: [ + { type: 'selection' }, + { type: 'index', label: '序号', width: 70 }, + { prop: 'order_no', label: '订单号', minWidth: 160 }, + { prop: 'quantity', label: '数量', width: 90 }, + { prop: 'user_code', label: '用户编码', minWidth: 120 }, + { prop: 'process_name', label: '工序名称', minWidth: 140 }, + { prop: 'step_name', label: '步骤名称', minWidth: 140 }, + { prop: 'status_name', label: '步骤状态', minWidth: 120 }, + { prop: 'operator', label: '操作人员', minWidth: 120 }, + { + prop: 'scan_result', + label: '扫码结果', + width: 100, + formatter: (row: any) => (row.scan_result === 0 ? '失败' : '成功'), + }, + { prop: 'scan_date', label: '扫码时间', minWidth: 180 }, + { prop: 'created_name', label: '创建人', minWidth: 120 }, + ], + dialogProps: { + width: '760px', + }, + formSchema: { + showDefaultActions: false, + labelWidth: '110px', + schema: [ + { + component: 'Input', + show: false, + ifDetail: true, + colSpan: 24, + prop: 'id', + label: 'ID', + }, + { + component: 'Input', + prop: 'order_no', + label: '订单号', + componentProps: { + placeholder: '请输入订单号', + maxlength: 100, + }, + rules: [{ required: true, message: '请输入订单号' }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'user_code', + label: '用户编码', + componentProps: { + placeholder: '请输入用户编码', + maxlength: 50, + }, + rules: [{ required: true, message: '请输入用户编码' }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'operator', + label: '操作人员', + componentProps: { + placeholder: '请输入操作人员', + maxlength: 100, + }, + colSpan: 12, + }, + { + component: 'ApiSelect', + prop: 'process_id', + label: '工序名称', + componentProps: (values: any) => ({ + api: '/produce/process', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: '请选择工序', + disabled: values?.id !== undefined && values?.id !== null && values?.id !== '', + }), + rules: [{ required: true, message: '请选择工序' }], + colSpan: 12, + }, + { + component: 'ApiSelect', + prop: 'step_id', + label: '步骤名称', + componentProps: (values: any) => ({ + api: '/produce/process-step', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: '请选择步骤', + disabled: values?.id !== undefined && values?.id !== null && values?.id !== '', + }), + rules: [{ required: true, message: '请选择步骤' }], + colSpan: 12, + }, + { + component: 'ApiSelect', + prop: 'status_id', + label: '步骤状态', + componentProps: (values: any) => ({ + api: '/produce/step-status', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: '请选择状态', + disabled: values?.id !== undefined && values?.id !== null && values?.id !== '', + }), + rules: [{ required: true, message: '请选择状态' }], + colSpan: 12, + }, + { + component: 'RadioGroup', + prop: 'scan_result', + label: '扫码结果', + defaultValue: 1, + componentProps: { + options: [ + { label: '成功', value: 1 }, + { label: '失败', value: 0 }, + ], + }, + rules: [{ required: true, message: '请选择扫码结果' }], + colSpan: 24, + }, + { + component: 'Input', + prop: 'remark', + label: '备注', + componentProps: { + type: 'textarea', + rows: 3, + placeholder: '请输入备注', + }, + colSpan: 24, + }, + ], + }, + } +} diff --git a/backend/plugin/produce/resource/template/admin/views/produce/statistics/daily/index.vue b/backend/plugin/produce/resource/template/admin/views/produce/statistics/daily/index.vue new file mode 100644 index 0000000..405009a --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/statistics/daily/index.vue @@ -0,0 +1,310 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/admin/views/produce/statistics/monthly/index.vue b/backend/plugin/produce/resource/template/admin/views/produce/statistics/monthly/index.vue new file mode 100644 index 0000000..8bc0a3d --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/statistics/monthly/index.vue @@ -0,0 +1,290 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/admin/views/produce/status-transition/index.vue b/backend/plugin/produce/resource/template/admin/views/produce/status-transition/index.vue new file mode 100644 index 0000000..3d3743c --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/status-transition/index.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/admin/views/produce/status-transition/schemas/index.tsx b/backend/plugin/produce/resource/template/admin/views/produce/status-transition/schemas/index.tsx new file mode 100644 index 0000000..8c386f9 --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/status-transition/schemas/index.tsx @@ -0,0 +1,290 @@ +import { CrudSchema } from '@/components/crud' +import { DictEnum } from '@/enums' +import { $t } from '@/locales' +import { ProduceStatusTransitionService } from '../../../../api/index' + +const triggerEventOptions = [ + { label: '下一工序扫码触发', value: 'next_step_scan' }, + { label: '扫描触发', value: 'scan_trigger' }, + { label: '异常触发', value: 'exception_trigger' }, + { label: '手动触发', value: 'manual_trigger' }, + { label: '定时触发', value: 'timer_trigger' }, + { label: '完成触发', value: 'complete_trigger' }, +] + +const transitionTypeOptions = [ + { label: '主转换', value: 'primary' }, + { label: '副作用', value: 'side_effect' }, +] + +const sideEffectTypeOptions = [ + { label: '记录日志', value: 'log' }, + { label: '发送通知', value: 'notify' }, + { label: '更新字段', value: 'update_field' }, + { label: '触发事件', value: 'trigger_event' }, +] + +export const crudSchema = (): CrudSchema => { + return { + api: ProduceStatusTransitionService.list, + dialogTitle: $t('produce.modules.status_transition.title'), + crudApi: { + add: ProduceStatusTransitionService.create, + edit: ProduceStatusTransitionService.update, + remove: ProduceStatusTransitionService.remove, + view: ProduceStatusTransitionService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'produce:status-transition:create', + editAuth: 'produce:status-transition:update', + removeAuth: 'produce:status-transition:delete', + viewAuth: 'produce:status-transition:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'step_id', + label: $t('produce.modules.status_transition.search.step_id'), + component: 'ApiSelect', + componentProps: { + api: '/produce/process-step', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: $t('produce.modules.status_transition.search.step_id_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'trigger_event', + label: $t('produce.modules.status_transition.search.trigger_event'), + component: 'Select', + componentProps: { + options: triggerEventOptions, + clearable: true, + placeholder: $t('produce.modules.status_transition.search.trigger_event_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'status', + label: $t('produce.modules.status_transition.search.status'), + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + clearable: true, + placeholder: $t('produce.modules.status_transition.search.status_placeholder'), + }, + colSpan: 6, + }, + ], + }, + columns: [ + { type: 'selection' }, + { type: 'index', label: $t('produce.common.columns.index'), width: 70 }, + { prop: 'step.step_name', label: $t('produce.modules.status_transition.columns.step_name'), minWidth: 160 }, + { prop: 'from_status.status_name', label: $t('produce.modules.status_transition.columns.from_status_name'), minWidth: 140 }, + { prop: 'to_status.status_name', label: $t('produce.modules.status_transition.columns.to_status_name'), minWidth: 140 }, + { prop: 'trigger_event', label: $t('produce.modules.status_transition.columns.trigger_event'), minWidth: 160 }, + { prop: 'transition_type', label: $t('produce.modules.status_transition.columns.transition_type'), width: 120 }, + { + prop: 'auto_trigger', + label: $t('produce.modules.status_transition.columns.auto_trigger'), + width: 120, + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + }, + }, + { prop: 'priority', label: $t('produce.modules.status_transition.columns.priority'), width: 100 }, + { prop: 'sort', label: $t('produce.modules.status_transition.columns.sort'), width: 100 }, + { + prop: 'status', + label: $t('produce.modules.status_transition.columns.status'), + width: 120, + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + }, + }, + { prop: 'created_date', label: $t('produce.modules.status_transition.columns.created_at'), minWidth: 180 }, + ], + dialogProps: { + width: '860px', + }, + formSchema: { + showDefaultActions: false, + labelWidth: '120px', + schema: [ + { + component: 'Input', + show: false, + ifDetail: true, + colSpan: 24, + prop: 'id', + label: 'ID', + }, + { + component: 'ApiSelect', + prop: 'step_id', + label: $t('produce.modules.status_transition.form.step_id'), + componentProps: { + api: '/produce/process-step', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: $t('produce.modules.status_transition.form.step_id_placeholder'), + }, + rules: [{ required: true, message: $t('produce.modules.status_transition.form.step_id_placeholder') }], + colSpan: 12, + }, + { + component: 'ApiSelect', + prop: 'from_status_id', + label: $t('produce.modules.status_transition.form.from_status_id'), + componentProps: { + api: '/produce/step-status', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: $t('produce.modules.status_transition.form.from_status_id_placeholder'), + }, + rules: [{ required: true, message: $t('produce.modules.status_transition.form.from_status_id_placeholder') }], + colSpan: 12, + }, + { + component: 'ApiSelect', + prop: 'to_status_id', + label: $t('produce.modules.status_transition.form.to_status_id'), + componentProps: { + api: '/produce/step-status', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: $t('produce.modules.status_transition.form.to_status_id_placeholder'), + }, + rules: [{ required: true, message: $t('produce.modules.status_transition.form.to_status_id_placeholder') }], + colSpan: 12, + }, + { + component: 'Select', + prop: 'trigger_event', + label: $t('produce.modules.status_transition.columns.trigger_event'), + componentProps: { + options: triggerEventOptions, + placeholder: $t('produce.modules.status_transition.form.trigger_event_placeholder'), + }, + rules: [{ required: true, message: $t('produce.modules.status_transition.form.trigger_event_placeholder') }], + colSpan: 12, + }, + { + component: 'RadioGroup', + prop: 'transition_type', + label: $t('produce.modules.status_transition.columns.transition_type'), + defaultValue: 'primary', + componentProps: { + options: transitionTypeOptions, + isBtn: true, + renderType: 'RadioButton', + }, + colSpan: 24, + }, + { + component: 'Select', + prop: 'side_effect_type', + label: $t('produce.modules.status_transition.form.side_effect_type'), + componentProps: { + options: sideEffectTypeOptions, + clearable: true, + placeholder: $t('produce.modules.status_transition.form.side_effect_type_placeholder'), + }, + colSpan: 12, + }, + { + component: 'ApiDict', + prop: 'auto_trigger', + label: $t('produce.modules.status_transition.columns.auto_trigger'), + defaultValue: 0, + componentProps: { + code: DictEnum.SYS_YES_NO, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 12, + }, + { + component: 'InputNumber', + prop: 'priority', + label: $t('produce.modules.status_transition.columns.priority'), + defaultValue: 0, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'InputNumber', + prop: 'sort', + label: $t('produce.modules.status_transition.columns.sort'), + defaultValue: 0, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'Input', + prop: 'event_config', + label: $t('produce.modules.status_transition.form.event_config'), + componentProps: { + type: 'textarea', + rows: 5, + placeholder: $t('produce.modules.status_transition.form.event_config_placeholder'), + }, + colSpan: 24, + }, + { + component: 'Input', + prop: 'side_effect_config', + label: $t('produce.modules.status_transition.form.side_effect_config'), + componentProps: { + type: 'textarea', + rows: 5, + placeholder: $t('produce.modules.status_transition.form.side_effect_config_placeholder'), + }, + colSpan: 24, + }, + { + component: 'ApiDict', + prop: 'status', + label: $t('produce.modules.status_transition.columns.status'), + defaultValue: 1, + componentProps: { + code: DictEnum.SYS_YES_NO, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 24, + }, + { + component: 'Input', + prop: 'description', + label: $t('produce.modules.status_transition.form.description'), + componentProps: { + type: 'textarea', + rows: 3, + placeholder: $t('produce.modules.status_transition.form.description_placeholder'), + }, + colSpan: 24, + }, + ], + }, + } +} diff --git a/backend/plugin/produce/resource/template/admin/views/produce/step-relation/index.vue b/backend/plugin/produce/resource/template/admin/views/produce/step-relation/index.vue new file mode 100644 index 0000000..44e01f0 --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/step-relation/index.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/admin/views/produce/step-relation/schemas/index.tsx b/backend/plugin/produce/resource/template/admin/views/produce/step-relation/schemas/index.tsx new file mode 100644 index 0000000..c0c8a1e --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/step-relation/schemas/index.tsx @@ -0,0 +1,218 @@ +import { CrudSchema } from '@/components/crud' +import { DictEnum } from '@/enums' +import { $t } from '@/locales' +import { ProduceStepRelationService } from '../../../../api/index' + +const relationTypeOptions = [ + { label: '正常流转', value: 'normal' }, + { label: '异常流转', value: 'exception' }, +] + +export const crudSchema = (): CrudSchema => { + return { + api: ProduceStepRelationService.list, + dialogTitle: $t('produce.modules.step_relation.title'), + crudApi: { + add: ProduceStepRelationService.create, + edit: ProduceStepRelationService.update, + remove: ProduceStepRelationService.remove, + view: ProduceStepRelationService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'produce:step-relation:create', + editAuth: 'produce:step-relation:update', + removeAuth: 'produce:step-relation:delete', + viewAuth: 'produce:step-relation:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'from_step_id', + label: $t('produce.modules.step_relation.search.from_step_id'), + component: 'ApiSelect', + componentProps: { + api: '/produce/process-step', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: $t('produce.modules.step_relation.search.from_step_id_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'to_step_id', + label: $t('produce.modules.step_relation.search.to_step_id'), + component: 'ApiSelect', + componentProps: { + api: '/produce/process-step', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: $t('produce.modules.step_relation.search.to_step_id_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'relation_type', + label: $t('produce.modules.step_relation.search.relation_type'), + component: 'Select', + componentProps: { + options: relationTypeOptions, + clearable: true, + placeholder: $t('produce.modules.step_relation.search.relation_type_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'status', + label: $t('produce.modules.step_relation.search.status'), + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + clearable: true, + placeholder: $t('produce.modules.step_relation.search.status_placeholder'), + }, + colSpan: 6, + }, + ], + }, + columns: [ + { type: 'selection' }, + { type: 'index', label: $t('produce.common.columns.index'), width: 70 }, + { prop: 'from_step.step_name', label: $t('produce.modules.step_relation.columns.from_step_name'), minWidth: 180 }, + { prop: 'to_step.step_name', label: $t('produce.modules.step_relation.columns.to_step_name'), minWidth: 180 }, + { prop: 'relation_type', label: $t('produce.modules.step_relation.columns.relation_type'), width: 120 }, + { prop: 'priority', label: $t('produce.modules.step_relation.columns.priority'), width: 100 }, + { prop: 'flow_condition', label: $t('produce.modules.step_relation.columns.flow_condition'), minWidth: 220 }, + { prop: 'sort', label: $t('produce.modules.step_relation.columns.sort'), width: 100 }, + { + prop: 'status', + label: $t('produce.modules.step_relation.columns.status'), + width: 120, + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + }, + }, + { prop: 'created_date', label: $t('produce.modules.step_relation.columns.created_at'), minWidth: 180 }, + ], + dialogProps: { + width: '760px', + }, + formSchema: { + showDefaultActions: false, + labelWidth: '110px', + schema: [ + { + component: 'Input', + show: false, + ifDetail: true, + colSpan: 24, + prop: 'id', + label: 'ID', + }, + { + component: 'ApiSelect', + prop: 'from_step_id', + label: $t('produce.modules.step_relation.form.from_step_id'), + componentProps: { + api: '/produce/process-step', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: $t('produce.modules.step_relation.form.from_step_id_placeholder'), + }, + rules: [{ required: true, message: $t('produce.modules.step_relation.form.from_step_id_placeholder') }], + colSpan: 12, + }, + { + component: 'ApiSelect', + prop: 'to_step_id', + label: $t('produce.modules.step_relation.form.to_step_id'), + componentProps: { + api: '/produce/process-step', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: $t('produce.modules.step_relation.form.to_step_id_placeholder'), + }, + rules: [{ required: true, message: $t('produce.modules.step_relation.form.to_step_id_placeholder') }], + colSpan: 12, + }, + { + component: 'RadioGroup', + prop: 'relation_type', + label: $t('produce.modules.step_relation.columns.relation_type'), + defaultValue: 'normal', + componentProps: { + options: relationTypeOptions, + isBtn: true, + renderType: 'RadioButton', + }, + colSpan: 24, + }, + { + component: 'InputNumber', + prop: 'priority', + label: $t('produce.modules.step_relation.columns.priority'), + defaultValue: 0, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'InputNumber', + prop: 'sort', + label: $t('produce.modules.step_relation.columns.sort'), + defaultValue: 0, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'Input', + prop: 'flow_condition', + label: $t('produce.modules.step_relation.form.flow_condition'), + componentProps: { + type: 'textarea', + rows: 6, + placeholder: $t('produce.modules.step_relation.form.flow_condition_placeholder'), + }, + colSpan: 24, + }, + { + component: 'ApiDict', + prop: 'status', + label: $t('produce.modules.step_relation.columns.status'), + defaultValue: 1, + componentProps: { + code: DictEnum.SYS_YES_NO, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 24, + }, + { + component: 'Input', + prop: 'description', + label: $t('produce.modules.step_relation.form.description'), + componentProps: { + type: 'textarea', + rows: 3, + placeholder: $t('produce.modules.step_relation.form.description_placeholder'), + }, + colSpan: 24, + }, + ], + }, + } +} diff --git a/backend/plugin/produce/resource/template/admin/views/produce/step-status/index.vue b/backend/plugin/produce/resource/template/admin/views/produce/step-status/index.vue new file mode 100644 index 0000000..19cb79c --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/step-status/index.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/admin/views/produce/step-status/schemas/index.tsx b/backend/plugin/produce/resource/template/admin/views/produce/step-status/schemas/index.tsx new file mode 100644 index 0000000..0832468 --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/step-status/schemas/index.tsx @@ -0,0 +1,227 @@ +import { CrudSchema } from '@/components/crud' +import { DictEnum } from '@/enums' +import { $t } from '@/locales' +import { ProduceStepStatusService } from '../../../../api/index' + +export const crudSchema = (): CrudSchema => { + return { + api: ProduceStepStatusService.list, + dialogTitle: $t('produce.modules.step_status.title'), + crudApi: { + add: ProduceStepStatusService.create, + edit: ProduceStepStatusService.update, + remove: ProduceStepStatusService.remove, + view: ProduceStepStatusService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'produce:step-status:create', + editAuth: 'produce:step-status:update', + removeAuth: 'produce:step-status:delete', + viewAuth: 'produce:step-status:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'step_id', + label: $t('produce.modules.step_status.search.step_id'), + component: 'ApiSelect', + componentProps: { + api: '/produce/process-step', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: $t('produce.modules.step_status.search.step_id_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'LIKE_status_code', + label: $t('produce.modules.step_status.search.status_code'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('produce.modules.step_status.search.status_code_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'LIKE_status_name', + label: $t('produce.modules.step_status.search.status_name'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('produce.modules.step_status.search.status_name_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'status', + label: $t('produce.modules.step_status.search.status'), + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + clearable: true, + placeholder: $t('produce.modules.step_status.search.status_placeholder'), + }, + colSpan: 6, + }, + ], + }, + columns: [ + { type: 'selection' }, + { type: 'index', label: $t('produce.common.columns.index'), width: 70 }, + { + prop: 'step.step_name', + label: $t('produce.modules.step_status.columns.step_name'), + minWidth: 180, + }, + { prop: 'status_code', label: $t('produce.modules.step_status.columns.status_code'), minWidth: 160 }, + { prop: 'status_name', label: $t('produce.modules.step_status.columns.status_name'), minWidth: 180 }, + { + prop: 'is_initial', + label: $t('produce.modules.step_status.columns.is_initial'), + width: 120, + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + }, + }, + { + prop: 'is_final', + label: $t('produce.modules.step_status.columns.is_final'), + width: 120, + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + }, + }, + { prop: 'sort', label: $t('produce.modules.step_status.columns.sort'), width: 100 }, + { + prop: 'status', + label: $t('produce.modules.step_status.columns.status'), + width: 120, + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + }, + }, + { prop: 'created_date', label: $t('produce.modules.step_status.columns.created_at'), minWidth: 180 }, + ], + dialogProps: { + width: '720px', + }, + formSchema: { + showDefaultActions: false, + labelWidth: '110px', + schema: [ + { + component: 'Input', + show: false, + ifDetail: true, + colSpan: 24, + prop: 'id', + label: 'ID', + }, + { + component: 'ApiSelect', + prop: 'step_id', + label: $t('produce.modules.step_status.form.step_id'), + componentProps: { + api: '/produce/process-step', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: $t('produce.modules.step_status.form.step_id_placeholder'), + }, + rules: [{ required: true, message: $t('produce.modules.step_status.form.step_id_placeholder') }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'status_code', + label: $t('produce.modules.step_status.columns.status_code'), + componentProps: { + placeholder: $t('produce.modules.step_status.form.status_code_placeholder'), + maxlength: 50, + }, + rules: [{ required: true, message: $t('produce.modules.step_status.form.status_code_placeholder') }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'status_name', + label: $t('produce.modules.step_status.columns.status_name'), + componentProps: { + placeholder: $t('produce.modules.step_status.form.status_name_placeholder'), + maxlength: 100, + }, + rules: [{ required: true, message: $t('produce.modules.step_status.form.status_name_placeholder') }], + colSpan: 12, + }, + { + component: 'InputNumber', + prop: 'sort', + label: $t('produce.modules.step_status.columns.sort'), + defaultValue: 0, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'ApiDict', + prop: 'is_initial', + label: $t('produce.modules.step_status.columns.is_initial'), + defaultValue: 0, + componentProps: { + code: DictEnum.SYS_YES_NO, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 12, + }, + { + component: 'ApiDict', + prop: 'is_final', + label: $t('produce.modules.step_status.columns.is_final'), + defaultValue: 0, + componentProps: { + code: DictEnum.SYS_YES_NO, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 12, + }, + { + component: 'ApiDict', + prop: 'status', + label: $t('produce.modules.step_status.columns.status'), + defaultValue: 1, + componentProps: { + code: DictEnum.SYS_YES_NO, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 24, + }, + { + component: 'Input', + prop: 'description', + label: $t('produce.modules.step_status.form.description'), + componentProps: { + type: 'textarea', + rows: 4, + placeholder: $t('produce.modules.step_status.form.description_placeholder'), + }, + colSpan: 24, + }, + ], + }, + } +} diff --git a/backend/plugin/produce/resource/template/admin/views/produce/transition-log/index.vue b/backend/plugin/produce/resource/template/admin/views/produce/transition-log/index.vue new file mode 100644 index 0000000..1a84668 --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/transition-log/index.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/admin/views/produce/transition-log/schemas/index.tsx b/backend/plugin/produce/resource/template/admin/views/produce/transition-log/schemas/index.tsx new file mode 100644 index 0000000..1ec65b3 --- /dev/null +++ b/backend/plugin/produce/resource/template/admin/views/produce/transition-log/schemas/index.tsx @@ -0,0 +1,277 @@ +import { CrudSchema } from '@/components/crud' +import { DictEnum } from '@/enums' +import { $t } from '@/locales' +import { ProduceTransitionLogService } from '../../../../api/index' + +const triggerEventOptions = [ + { label: '下一工序扫码触发', value: 'next_step_scan' }, + { label: '扫描触发', value: 'scan_trigger' }, + { label: '异常触发', value: 'exception_trigger' }, + { label: '手动触发', value: 'manual_trigger' }, + { label: '定时触发', value: 'timer_trigger' }, + { label: '完成触发', value: 'complete_trigger' }, +] + +const formatJsonText = (value: unknown) => { + if (value === null || value === undefined || value === '') { + return '' + } + if (typeof value === 'string') { + return value + } + try { + return JSON.stringify(value, null, 2) + } catch { + return String(value) + } +} + +export const crudSchema = (): CrudSchema => { + return { + api: ProduceTransitionLogService.list, + dialogTitle: $t('produce.modules.transition_log.title'), + crudApi: { + view: async (id: string | number) => { + const res = await ProduceTransitionLogService.get(id) + return { + ...res, + trigger_data: formatJsonText(res?.trigger_data), + } + }, + }, + useCrud: true, + hasAdd: false, + hasEdit: false, + hasRemove: false, + hasView: true, + viewAuth: 'produce:transition-log:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'LIKE_work_order_no', + label: $t('produce.modules.transition_log.search.work_order_no'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('produce.modules.transition_log.search.work_order_no_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'step_id', + label: $t('produce.modules.transition_log.search.step_id'), + component: 'ApiSelect', + componentProps: { + api: '/produce/process-step', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: $t('produce.modules.transition_log.search.step_id_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'trigger_event', + label: $t('produce.modules.transition_log.search.trigger_event'), + component: 'Select', + componentProps: { + options: triggerEventOptions, + clearable: true, + placeholder: $t('produce.modules.transition_log.search.trigger_event_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'LIKE_trigger_user', + label: $t('produce.modules.transition_log.search.trigger_user'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('produce.modules.transition_log.search.trigger_user_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'is_success', + label: $t('produce.modules.transition_log.search.is_success'), + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + clearable: true, + placeholder: $t('produce.modules.transition_log.search.is_success_placeholder'), + }, + colSpan: 6, + }, + ], + }, + columns: [ + { type: 'index', label: $t('produce.common.columns.index'), width: 70 }, + { prop: 'work_order_no', label: $t('produce.modules.transition_log.columns.work_order_no'), minWidth: 140 }, + { prop: 'step.step_name', label: $t('produce.modules.transition_log.columns.step_name'), minWidth: 160 }, + { prop: 'from_status.status_name', label: $t('produce.modules.transition_log.columns.from_status_name'), minWidth: 140 }, + { prop: 'to_status.status_name', label: $t('produce.modules.transition_log.columns.to_status_name'), minWidth: 140 }, + { + prop: 'trigger_event', + label: $t('produce.modules.transition_log.columns.trigger_event'), + minWidth: 160, + formatter: (row: { trigger_event?: string }) => + triggerEventOptions.find((option) => option.value === row.trigger_event)?.label || row.trigger_event || '' + }, + { prop: 'trigger_user', label: $t('produce.modules.transition_log.columns.trigger_user'), minWidth: 120 }, + { + prop: 'is_auto', + label: $t('produce.modules.transition_log.columns.is_auto'), + width: 120, + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + }, + }, + { + prop: 'is_success', + label: $t('produce.modules.transition_log.columns.is_success'), + width: 120, + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + }, + }, + { prop: 'duration', label: $t('produce.modules.transition_log.columns.duration'), width: 120 }, + { prop: 'error_message', label: $t('produce.modules.transition_log.columns.error_message'), minWidth: 200 }, + { prop: 'created_date', label: $t('produce.modules.transition_log.columns.created_at'), minWidth: 180 }, + ], + dialogProps: { + width: '960px', + }, + formSchema: { + showDefaultActions: false, + labelWidth: '120px', + schema: [ + { + component: 'Input', + show: false, + ifDetail: true, + colSpan: 12, + prop: 'id', + label: 'ID', + }, + { + component: 'Input', + prop: 'work_order_no', + label: $t('produce.modules.transition_log.columns.work_order_no'), + colSpan: 12, + }, + { + component: 'Input', + prop: 'step.step_name', + label: $t('produce.modules.transition_log.columns.step_name'), + colSpan: 12, + }, + { + component: 'Input', + prop: 'transition.trigger_event', + label: $t('produce.modules.transition_log.columns.transition_event'), + colSpan: 12, + }, + { + component: 'Input', + prop: 'from_status.status_name', + label: $t('produce.modules.transition_log.columns.from_status_name'), + colSpan: 12, + }, + { + component: 'Input', + prop: 'to_status.status_name', + label: $t('produce.modules.transition_log.columns.to_status_name'), + colSpan: 12, + }, + { + component: 'Input', + prop: 'trigger_event', + label: $t('produce.modules.transition_log.columns.trigger_event'), + colSpan: 12, + }, + { + component: 'Input', + prop: 'trigger_user', + label: $t('produce.modules.transition_log.columns.trigger_user'), + colSpan: 12, + }, + { + component: 'Input', + prop: 'trigger_ip', + label: $t('produce.modules.transition_log.columns.trigger_ip'), + colSpan: 12, + }, + { + component: 'ApiDict', + prop: 'is_auto', + label: $t('produce.modules.transition_log.columns.is_auto'), + componentProps: { + code: DictEnum.SYS_YES_NO, + }, + colSpan: 12, + }, + { + component: 'ApiDict', + prop: 'is_success', + label: $t('produce.modules.transition_log.columns.is_success'), + componentProps: { + code: DictEnum.SYS_YES_NO, + }, + colSpan: 12, + }, + { + component: 'Input', + prop: 'duration', + label: $t('produce.modules.transition_log.columns.duration'), + colSpan: 12, + }, + { + component: 'Input', + prop: 'created_name', + label: $t('produce.modules.transition_log.columns.created_name'), + colSpan: 12, + }, + { + component: 'Input', + prop: 'created_date', + label: $t('produce.modules.transition_log.columns.created_at'), + colSpan: 12, + }, + { + component: 'Input', + prop: 'trigger_data', + label: $t('produce.modules.transition_log.columns.trigger_data'), + componentProps: { + type: 'textarea', + rows: 6, + }, + colSpan: 24, + }, + { + component: 'Input', + prop: 'error_message', + label: $t('produce.modules.transition_log.columns.error_message'), + componentProps: { + type: 'textarea', + rows: 4, + }, + colSpan: 24, + }, + { + component: 'Input', + prop: 'remark', + label: $t('produce.modules.transition_log.columns.remark'), + componentProps: { + type: 'textarea', + rows: 4, + }, + colSpan: 24, + }, + ], + }, + } +} diff --git a/backend/plugin/produce/resource/template/web/.gitkeep b/backend/plugin/produce/resource/template/web/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/backend/plugin/produce/resource/template/web/api/data-entry.ts b/backend/plugin/produce/resource/template/web/api/data-entry.ts new file mode 100644 index 0000000..7796e94 --- /dev/null +++ b/backend/plugin/produce/resource/template/web/api/data-entry.ts @@ -0,0 +1,167 @@ +import request from '~/utils/request' + +export interface ProduceOption { + label: string + value: string | number +} + +export interface ProduceRecordItem { + id?: string | number + order_no?: string + process_order_no?: string + product_code?: string + quantity?: number + user_code?: string + operator?: string + scan_result?: number + scan_date?: string + created_date?: string + process?: { + process_name?: string + } + step?: { + step_name?: string + } + status?: { + status_name?: string + } +} + +export interface ProduceSubmitScanDataResult { + code: number + msg: string + data?: { + id?: string | number + } +} + +export interface ProduceStatistics { + today_total: number + success_total: number + failed_total: number +} + +export interface ProduceUserStatsItem { + user_code: string + operator?: string + count: number +} + +export interface ProduceMemberUserCheckResult { + id: number + username: string + nickname: string +} + +export interface ProduceDataEntryStepRule { + id?: string | number + process_id?: string | number + process_name?: string + step_code?: string + step_name?: string + prerequisite_steps?: Array + prerequisite_mode?: string + prerequisite_require_final?: number + allow_repeat_scan?: number + repeat_scan_statuses?: Array +} + +export interface ProduceDataEntrySpecificRule { + id?: string | number + rule_name?: string + rule_pattern?: string + rule_type?: number + apply_mode?: 'order' | 'machine' | 'both' + match_field?: 'order_no' | 'process_order_no' | 'product_code' | 'user_code' + step_ids?: Array + sort?: number + remark?: string +} + +export interface ProduceDataEntryConfig { + basic_setting: Record + step_rule: ProduceDataEntryStepRule | null + specific_rules: ProduceDataEntrySpecificRule[] + current?: { + process_id?: string | number + step_id?: string | number + order_no?: string + apply_mode?: 'order' | 'machine' | 'both' + } +} + +export function getProcessOptions() { + return request.get('/produce/process', { format: 'select' }) +} + +export function getStepOptions(processId?: string | number) { + return request.get('/produce/process-step', { + format: 'select', + ...(processId ? { process_id: processId } : {}), + }) +} + +export function getStatusOptions(stepId?: string | number) { + return request.get('/produce/step-status', { + format: 'select', + ...(stepId ? { step_id: stepId } : {}), + }) +} + +export function getProduceConfig(groupCode: string) { + return request.get>('/produce/config/info', { group_code: groupCode }) +} + +export function getDataEntryConfig(params: Record) { + return request.get('/produce/config/data-entry', params) +} + +export function getRecentRecords(params: Record) { + return request.get<{ items: ProduceRecordItem[]; total: number }>('/produce/scan-data', { + limit: 10, + page: 1, + ...params, + }) +} + +export function getProductRecentRecords(params: Record) { + return request.get<{ items: ProduceRecordItem[]; total: number }>('/produce/product-record/recent', { + limit: 10, + page: 1, + ...params, + }) +} + +export function getStatistics(params: Record) { + return request.get('/produce/scan-data/statistics', params, { showErrorMessage: false }) +} + +export function getProductStatistics(params: Record) { + return request.get('/produce/product-record/statistics', params, { showErrorMessage: false }) +} + +export function getUserCodeStats(params: Record) { + return request.get('/produce/scan-data/user-code-stats', params, { showErrorMessage: false }) +} + +export function getProductUserCodeStats(params: Record) { + return request.get('/produce/product-record/user-code-stats', params, { showErrorMessage: false }) +} + +export function checkMemberUser(userCode: string) { + return request.get('/produce/member-user/check', { user_code: userCode }, { showErrorMessage: false }) +} + +export function submitScanData(data: Record) { + return request.post('/produce/scan-data/record', data, { + showErrorMessage: false, + returnFullResponse: true, + }) +} + +export function submitProductRecord(data: Record) { + return request.post('/produce/product-record/record', data, { + showErrorMessage: false, + returnFullResponse: true, + }) +} diff --git a/backend/plugin/produce/resource/template/web/api/exception.ts b/backend/plugin/produce/resource/template/web/api/exception.ts new file mode 100644 index 0000000..292cb05 --- /dev/null +++ b/backend/plugin/produce/resource/template/web/api/exception.ts @@ -0,0 +1,143 @@ +import request from '~/utils/request' + +export interface ProduceExceptionSetting { + id: string | number + parent_id?: string | number | null + setting_type: 'type' | 'reason' | 'issue' | string + code?: string + name: string + sort?: number + frequency?: number + remark?: string +} + +export interface ProduceExceptionRecord { + id: string | number + order_no?: string + user_code?: string + reporter?: string + type_id?: string | number + type_name?: string + reason_id?: string | number + reason_name?: string + issue_id?: string | number | null + issue_name?: string + images?: string[] + remark?: string + status?: number + status_name?: string + reported_date?: string + handled_date?: string + handler?: string +} + +export interface ProduceRepairTask { + id: string | number + device_no: string + type_name?: string + reason_name?: string + issue_name?: string + reporter?: string + user_code?: string + reported_date?: string + status?: number + status_name?: string +} + +export interface ProduceRepairPart { + product_code: string + product_name?: string + category_id?: string | number + category_name?: string + source?: 'new' | 'after_sales' | 'refurbished' | string + quantity?: number + fault_description_ids?: Array +} + +export interface ProduceScanRecord { + id: string | number + process_name?: string + step_name?: string + operator?: string + user_code?: string +} + +export function getExceptionSettings() { + return request.get('/produce/exception/settings', {}, { showErrorMessage: false }) +} + +export function getExceptionStatistics(params: Record = {}) { + return request.get<{ pending: number; review: number; done: number }>('/produce/exception/statistics', params, { showErrorMessage: false }) +} + +export function getRecentExceptions(params: Record = {}) { + return request.get('/produce/exception/recent', params, { showErrorMessage: false }) +} + +export function checkExceptionOrder(orderNo: string) { + return request.get>('/produce/exception/order-check', { order_no: orderNo.trim() }, { showErrorMessage: false }) +} + +export function submitExceptionRecord(data: Record) { + return request.post<{ code: number; msg: string; data?: { id: string | number } }>('/produce/exception/record', data, { + showErrorMessage: false, + returnFullResponse: true, + }) +} + +export function getRepairTasks(params: Record = {}) { + return request.get('/produce/repair-record/tasks', params, { showErrorMessage: false }) +} + +export function getRepairStatistics(params: Record = {}) { + return request.get<{ pending: number; processing: number; completed_today: number }>('/produce/repair-record/statistics', params, { showErrorMessage: false }) +} + +export function getRepairTask(deviceNo: string) { + return request.get('/produce/exception/repair-task', { device_no: deviceNo.trim() }, { showErrorMessage: false }) +} + +export function getScanRecords(params: Record = {}) { + return request.get<{ items: ProduceScanRecord[]; total: number }>('/produce/scan-data', { + limit: 50, + page: 1, + ...params, + }, { showErrorMessage: false }) +} + +export function getMaterialCategories() { + return request.get>('/produce/scanapp/material-category', {}, { showErrorMessage: false }) +} + +export function getFaultDescriptionOptions(categoryIds: Array) { + return request.get>( + '/produce/hardware-fault-description/options', + { category_ids: categoryIds.join(',') }, + { showErrorMessage: false }, + ) +} + +export function lookupMaterial(productCode: string) { + return request.get<{ + id: string | number + category_id: string | number + category_name: string + product_code: string + product_name: string + }>('/produce/material/lookup', { product_code: productCode.trim() }, { showErrorMessage: false }) +} + +export function submitRepairRecord(data: Record) { + return request.post<{ code: number; msg: string; data?: { id: string | number; repair_no: string } }>('/produce/repair-record/record', data, { + showErrorMessage: false, + returnFullResponse: true, + }) +} + +export async function uploadProduceImage(file: File, subDir: 'exception' | 'repair') { + const formData = new FormData() + formData.append('file', file) + formData.append('sub_dir', subDir) + const result = await request.upload>('/file/image', formData) + return result?.url || result?.full_url || result?.path || '' +} diff --git a/backend/plugin/produce/resource/template/web/api/query.ts b/backend/plugin/produce/resource/template/web/api/query.ts new file mode 100644 index 0000000..58cb956 --- /dev/null +++ b/backend/plugin/produce/resource/template/web/api/query.ts @@ -0,0 +1,54 @@ +import request from '~/utils/request' + +export type ProduceQueryRecordType = 'scan' | 'product' | 'exception' | 'repair' + +export interface ProduceQueryRecord { + id: string + record_type: ProduceQueryRecordType + record_type_name: string + order_no?: string + product_code?: string + process_name?: string + exception_reason?: string + exception_content?: string + material_category?: string + fault_description?: string + quantity?: number | null + event_at?: number + event_date?: string | null + remark?: string +} + +export interface ProduceQueryPage { + items: ProduceQueryRecord[] + total: number + page: number + limit: number +} + +export interface ProduceQueryParams { + record_type: ProduceQueryRecordType + order_no?: string + keyword?: string + user_code?: string + status?: string | number + scan_result?: string | number + start_date?: string + end_date?: string + page?: number + limit?: number +} + +export interface ProduceQueryTimeline { + order_no: string + total: number + items: ProduceQueryRecord[] +} + +export function queryProduceRecords(params: ProduceQueryParams) { + return request.get('/produce/query/records', params, { showErrorMessage: false }) +} + +export function queryProduceTimeline(orderNo: string) { + return request.get('/produce/query/timeline', { order_no: orderNo.trim() }, { showErrorMessage: false }) +} diff --git a/backend/plugin/produce/resource/template/web/pages/data-entry/components/MachineEntryPanel.vue b/backend/plugin/produce/resource/template/web/pages/data-entry/components/MachineEntryPanel.vue new file mode 100644 index 0000000..a436d8d --- /dev/null +++ b/backend/plugin/produce/resource/template/web/pages/data-entry/components/MachineEntryPanel.vue @@ -0,0 +1,549 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/web/pages/data-entry/components/OrderEntryPanel.vue b/backend/plugin/produce/resource/template/web/pages/data-entry/components/OrderEntryPanel.vue new file mode 100644 index 0000000..3c29066 --- /dev/null +++ b/backend/plugin/produce/resource/template/web/pages/data-entry/components/OrderEntryPanel.vue @@ -0,0 +1,610 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/web/pages/data-entry/components/entry-panel.css b/backend/plugin/produce/resource/template/web/pages/data-entry/components/entry-panel.css new file mode 100644 index 0000000..ecdb41f --- /dev/null +++ b/backend/plugin/produce/resource/template/web/pages/data-entry/components/entry-panel.css @@ -0,0 +1,340 @@ +.main-top-grid { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(340px, 1fr); + gap: 20px; + align-items: stretch; +} + +.workbench-panel, +.records-panel { + background: #ffffff; + border-radius: 20px; + border: 1px solid #e5e7eb; + padding: 28px; +} + +.panel-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + gap: 16px; + margin-bottom: 24px; +} + +.column-header { + padding-bottom: 18px; + border-bottom: 1px solid #eef2f7; + margin-bottom: 22px; +} + +.panel-metric-card { + min-width: 240px; + min-height: 56px; + padding: 12px 16px; + border-radius: 16px; + background: #f8fbff; + border: 1px solid #e3ebf7; + display: flex; + align-items: center; + gap: 12px; +} + +.panel-metric-label { + font-size: 13px; + color: #64748b; +} + +.panel-metric-value { + font-size: 28px; + line-height: 1; + font-weight: 700; + color: #2563eb; + margin-left: auto; +} + +.metric-eye-button { + width: 32px; + height: 32px; + border: 0; + border-radius: 999px; + background: transparent; + display: inline-flex; + align-items: center; + justify-content: center; + color: #94a3b8; + cursor: pointer; + transition: all 0.2s ease; +} + +.metric-eye-button svg { + width: 18px; + height: 18px; +} + +.metric-eye-button.is-hidden { + color: #c0cad8; +} + +.metric-eye-button:hover { + background: rgba(37, 99, 235, 0.08); + color: #2563eb; +} + +.panel-title { + font-size: 18px; + font-weight: 600; + color: #2563eb; +} + +.panel-subtitle { + margin-top: 8px; + font-size: 14px; + color: #6b7280; +} + +.workbench-form { + display: flex; + flex-direction: column; + gap: 20px; +} + +.field-row { + display: grid; + grid-template-columns: 1fr; + gap: 16px; +} + +.field-row-split { + grid-template-columns: minmax(0, 1fr) 180px; +} + +.field-group { + display: flex; + flex-direction: column; + gap: 10px; +} + +.field-group-quantity { + min-width: 0; +} + +.field-group label { + font-size: 14px; + font-weight: 600; + color: #334155; +} + +.field-error-tip { + font-size: 12px; + color: #ef4444; + margin-top: 6px; +} + +.field-primary :deep(.el-input__wrapper), +.field-row :deep(.el-input__wrapper), +.field-row :deep(.el-input-number .el-input__wrapper) { + min-height: 58px; + border-radius: 14px; + box-shadow: 0 0 0 1px #dbe4f0 inset; +} + +.field-primary :deep(.el-input__inner), +.field-row :deep(.el-input__inner), +.field-row :deep(.el-input-number .el-input__inner) { + font-size: 18px; +} + +.field-primary :deep(.el-input__wrapper.is-focus), +.field-row :deep(.el-input__wrapper.is-focus), +.field-row :deep(.el-input-number .el-input__wrapper.is-focus) { + box-shadow: 0 0 0 1px var(--el-color-primary) inset; +} + +.quantity-input { + width: 100%; +} + +.quantity-input :deep(.el-input__wrapper) { + padding-right: 40px; + overflow: hidden; +} + +.quantity-input :deep(.el-input-number__increase), +.quantity-input :deep(.el-input-number__decrease) { + right: 1px; + width: 36px; + margin: 0; + background: #f8fafc; + color: #94a3b8; + border-left: 1px solid #dbe4f0; + box-shadow: none; +} + +.quantity-input :deep(.el-input-number__increase) { + top: 1px; + height: calc(50% - 0.5px); + border-top-right-radius: 13px; + border-bottom: 1px solid #e5edf6; +} + +.quantity-input :deep(.el-input-number__decrease) { + bottom: 1px; + height: calc(50% - 0.5px); + border-bottom-right-radius: 13px; +} + +.quantity-input :deep(.el-input-number__increase:hover), +.quantity-input :deep(.el-input-number__decrease:hover) { + color: var(--el-color-primary); + background: #f1f5f9; +} + +.field-label-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; +} + +.lock-switch { + display: inline-flex; + align-items: center; + gap: 10px; + font-size: 13px; + color: #64748b; +} + +.action-row { + display: flex; + gap: 12px; +} + +.action-row :deep(.el-button) { + min-width: 160px; + border-radius: 12px; +} + +.dashboard-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + margin-bottom: 16px; +} + +.dashboard-title { + font-size: 18px; + font-weight: 600; + color: #111827; +} + +.dashboard-caption { + font-size: 13px; + color: #94a3b8; +} + +.station-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 12px; +} + +.station-card { + display: flex; + align-items: center; + gap: 12px; + padding: 14px 16px; + border-radius: 14px; + background: #ffffff; + border: 1px solid #e6edf6; +} + +.station-icon { + width: 34px; + height: 34px; + border-radius: 999px; + display: inline-flex; + align-items: center; + justify-content: center; + background: #e8f1ff; + color: #3b82f6; + font-size: 13px; + font-weight: 700; + flex-shrink: 0; +} + +.station-info { + display: flex; + flex-direction: column; + min-width: 0; +} + +.station-info strong { + font-size: 16px; + color: #1f2937; +} + +.station-card b { + margin-left: auto; + font-size: 32px; + line-height: 1; + color: #2563eb; +} + +.records-header { + margin-bottom: 20px; +} + +.records-panel :deep(.el-table) { + --el-table-border-color: #eef2f7; + --el-table-header-bg-color: #f8fafc; +} + +.records-panel :deep(.el-table th.el-table__cell) { + font-weight: 600; + color: #475569; +} + +.records-panel :deep(.el-table td.el-table__cell) { + padding-top: 14px; + padding-bottom: 14px; +} + +@media (max-width: 1024px) { + .panel-header, + .field-label-row, + .dashboard-header { + flex-direction: column; + align-items: flex-start; + } + + .panel-metric-card { + width: 100%; + min-width: 0; + } + + .main-top-grid, + .station-grid { + grid-template-columns: 1fr; + } + + .field-row-split { + grid-template-columns: 1fr; + } +} + +@media (max-width: 768px) { + .workbench-panel, + .records-panel { + padding: 18px; + border-radius: 16px; + } + + .action-row { + flex-wrap: wrap; + } + + .action-row :deep(.el-button) { + width: 100%; + } +} diff --git a/backend/plugin/produce/resource/template/web/pages/data-entry/index.vue b/backend/plugin/produce/resource/template/web/pages/data-entry/index.vue new file mode 100644 index 0000000..fd4c107 --- /dev/null +++ b/backend/plugin/produce/resource/template/web/pages/data-entry/index.vue @@ -0,0 +1,1026 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/web/pages/exception/index.vue b/backend/plugin/produce/resource/template/web/pages/exception/index.vue new file mode 100644 index 0000000..4aa024a --- /dev/null +++ b/backend/plugin/produce/resource/template/web/pages/exception/index.vue @@ -0,0 +1,150 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/web/pages/query/index.vue b/backend/plugin/produce/resource/template/web/pages/query/index.vue new file mode 100644 index 0000000..cbf483c --- /dev/null +++ b/backend/plugin/produce/resource/template/web/pages/query/index.vue @@ -0,0 +1,179 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/web/pages/repair/index.vue b/backend/plugin/produce/resource/template/web/pages/repair/index.vue new file mode 100644 index 0000000..27192a0 --- /dev/null +++ b/backend/plugin/produce/resource/template/web/pages/repair/index.vue @@ -0,0 +1,105 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/web/pages/repair/tasks.vue b/backend/plugin/produce/resource/template/web/pages/repair/tasks.vue new file mode 100644 index 0000000..a6a201a --- /dev/null +++ b/backend/plugin/produce/resource/template/web/pages/repair/tasks.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/backend/plugin/produce/resource/template/web/pages/routes.ts b/backend/plugin/produce/resource/template/web/pages/routes.ts new file mode 100644 index 0000000..db00be5 --- /dev/null +++ b/backend/plugin/produce/resource/template/web/pages/routes.ts @@ -0,0 +1,42 @@ +export default [ + { + path: '/produce/data-entry', + component: () => import('~/apps/produce/pages/data-entry/index.vue'), + meta: { + title: '数据录入', + layout: 'default', + }, + }, + { + path: '/produce/exception', + component: () => import('~/apps/produce/pages/exception/index.vue'), + meta: { + title: '异常处理', + layout: 'default', + }, + }, + { + path: '/produce/repair', + component: () => import('~/apps/produce/pages/repair/index.vue'), + meta: { + title: '维修处理', + layout: 'default', + }, + }, + { + path: '/produce/repair/tasks', + component: () => import('~/apps/produce/pages/repair/tasks.vue'), + meta: { + title: '待维修订单', + layout: 'default', + }, + }, + { + path: '/produce/query', + component: () => import('~/apps/produce/pages/query/index.vue'), + meta: { + title: '综合查询', + layout: 'default', + }, + }, +] diff --git a/frontend/admin/.gitignore b/frontend/admin/.gitignore index 8ef10a2..430c718 100644 --- a/frontend/admin/.gitignore +++ b/frontend/admin/.gitignore @@ -8,7 +8,6 @@ dist-ssr # 忽略 src/apps 目录下除了 demo 之外的内容 -src/apps/* !src/apps/demo/ diff --git a/frontend/admin/src/apps/article - 副本/.gitkeep b/frontend/admin/src/apps/article - 副本/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/frontend/admin/src/apps/article - 副本/api/index.ts b/frontend/admin/src/apps/article - 副本/api/index.ts new file mode 100644 index 0000000..0dc5ccf --- /dev/null +++ b/frontend/admin/src/apps/article - 副本/api/index.ts @@ -0,0 +1,88 @@ +import BaseService from '@/api/core/base' +import request from '@/utils/http' + +export interface ArticleCategoryRow { + id?: string | number + name: string + slug?: string + parent_id?: string | number + sort?: number + enabled?: number + description?: string + created_date?: string + updated_date?: string +} + +export interface ArticleTagRow { + id?: string | number + name: string + slug?: string + sort?: number + heat?: number + enabled?: number + description?: string + created_date?: string + updated_date?: string +} + +export interface ArticleContentRow { + id?: string | number + title: string + slug?: string + category_id?: string | number + category_name?: string + cover?: string + summary?: string + content?: string + status?: number + is_top?: number + sort?: number + view_count?: number + published_at?: number | string + tag_ids?: Array + tag_names?: string + created_date?: string + updated_date?: string +} + +export const ArticleContentService = { + ...BaseService({ baseUrl: '/article/index' }) +} + +export const ArticleCategoryService = { + ...BaseService({ baseUrl: '/article/category' }) +} + +export const ArticleTagService = { + ...BaseService({ baseUrl: '/article/tag' }) +} + +const pluginApi = { + async test(params = {}) { + return request.get<{ msg?: string; data?: unknown }>({ + url: '/article/index', + params + }) + }, + + contentList(params = {}) { + return ArticleContentService.list(params as Record) + }, + + categoryList(params = {}) { + return ArticleCategoryService.list(params as Record) + }, + + tagList(params = {}) { + return ArticleTagService.list(params as Record) + }, + + async recycleList(params = {}) { + return request.get<{ code: number; msg: string; data: Record[] }>({ + url: '/article/recycle', + params + }) + } +} + +export default pluginApi diff --git a/frontend/admin/src/apps/article - 副本/lang/en/en.json b/frontend/admin/src/apps/article - 副本/lang/en/en.json new file mode 100644 index 0000000..1cbdbc3 --- /dev/null +++ b/frontend/admin/src/apps/article - 副本/lang/en/en.json @@ -0,0 +1,60 @@ +{ + "article": { + "title": "Article Management", + "description": "Article content operation and management plugin", + "card_title": "Article Plugin Data", + "refresh_btn": "Refresh", + "common": { + "list_mode": "List Mode", + "columns": { + "index": "No." + } + }, + "modules": { + "content": { + "title": "Content Center", + "description": "Manage articles, publish states, and content archives.", + "columns": { + "title": "Article Title", + "category": "Category", + "tags": "Tags", + "status": "Status", + "updated_at": "Last Updated" + } + }, + "category": { + "title": "Content Category", + "description": "Manage article category structure and ordering.", + "columns": { + "name": "Category Name", + "slug": "Category Slug", + "article_count": "Article Count", + "sort": "Sort", + "updated_at": "Last Updated" + } + }, + "tag": { + "title": "Tag Management", + "description": "Maintain article tags, popularity, and related article counts.", + "columns": { + "name": "Tag Name", + "slug": "Tag Slug", + "article_count": "Article Count", + "heat": "Heat", + "updated_at": "Last Updated" + } + }, + "recycle": { + "title": "Content Recycle Bin", + "description": "Manage deleted articles for later recovery or cleanup.", + "columns": { + "title": "Article Title", + "category": "Original Category", + "deleted_by": "Deleted By", + "deleted_at": "Deleted At", + "expire_at": "Expire At" + } + } + } + } +} diff --git a/frontend/admin/src/apps/article - 副本/lang/en/index.json b/frontend/admin/src/apps/article - 副本/lang/en/index.json new file mode 100644 index 0000000..a11b9a1 --- /dev/null +++ b/frontend/admin/src/apps/article - 副本/lang/en/index.json @@ -0,0 +1,8 @@ +{ + "article": { + "title": "Article Management", + "description": "Article plugin demo page", + "card_title": "Article Plugin Data", + "refresh_btn": "Refresh" + } +} \ No newline at end of file diff --git a/frontend/admin/src/apps/article - 副本/lang/zh-cn/index.json b/frontend/admin/src/apps/article - 副本/lang/zh-cn/index.json new file mode 100644 index 0000000..582d445 --- /dev/null +++ b/frontend/admin/src/apps/article - 副本/lang/zh-cn/index.json @@ -0,0 +1,8 @@ +{ + "article": { + "title": "文章管理", + "description": "文章插件示例页面", + "card_title": "文章插件数据", + "refresh_btn": "刷新" + } +} \ No newline at end of file diff --git a/frontend/admin/src/apps/article - 副本/lang/zh-cn/zh.json b/frontend/admin/src/apps/article - 副本/lang/zh-cn/zh.json new file mode 100644 index 0000000..82765df --- /dev/null +++ b/frontend/admin/src/apps/article - 副本/lang/zh-cn/zh.json @@ -0,0 +1,108 @@ +{ + "article": { + "title": "文章管理", + "description": "文章内容运营与管理插件", + "card_title": "文章插件数据", + "refresh_btn": "刷新", + "common": { + "list_mode": "列表模式", + "columns": { + "index": "序号" + } + }, + "modules": { + "content": { + "title": "内容中心", + "description": "管理文章内容、发布状态与内容归档。", + "search": { + "keywords": "关键字", + "keywords_placeholder": "请输入文章标题、分类或标签" + }, + "form": { + "title_placeholder": "请输入文章标题", + "slug_placeholder": "请输入文章标识", + "category_id": "内容分类ID", + "cover": "封面图", + "cover_placeholder": "请输入封面图地址", + "summary": "摘要", + "summary_placeholder": "请输入摘要", + "content": "文章内容", + "content_placeholder": "请输入文章内容", + "status": "状态", + "is_top": "是否置顶", + "sort_placeholder": "请输入排序", + "published_at": "发布时间", + "tag_ids": "标签ID" + }, + "columns": { + "title": "文章标题", + "category": "内容分类", + "tags": "标签", + "status": "状态", + "is_top": "置顶", + "updated_at": "最后更新" + } + }, + "category": { + "title": "内容分类", + "description": "管理文章分类结构与分类排序。", + "search": { + "keywords": "关键字", + "keywords_placeholder": "请输入分类名称或分类标识" + }, + "form": { + "name_placeholder": "请输入分类名称", + "slug_placeholder": "请输入分类标识", + "parent_id": "父级分类ID", + "description": "分类描述", + "description_placeholder": "请输入分类描述" + }, + "columns": { + "name": "分类名称", + "slug": "分类标识", + "article_count": "内容数量", + "enabled": "状态", + "sort": "排序", + "updated_at": "最后更新" + } + }, + "tag": { + "title": "标签管理", + "description": "维护文章标签、热度与关联内容数量。", + "search": { + "keywords": "关键字", + "keywords_placeholder": "请输入标签名称或标签标识" + }, + "form": { + "name_placeholder": "请输入标签名称", + "slug_placeholder": "请输入标签标识", + "description": "标签描述", + "description_placeholder": "请输入标签描述" + }, + "columns": { + "name": "标签名称", + "slug": "标签标识", + "article_count": "内容数量", + "enabled": "状态", + "heat": "热度", + "updated_at": "最后更新" + } + }, + "recycle": { + "title": "内容回收站", + "description": "管理已删除文章,支持后续恢复或清理。", + "search": { + "keywords": "关键字", + "keywords_placeholder": "请输入文章标题或删除人" + }, + "columns": { + "title": "文章标题", + "category": "原分类", + "deleted_by": "删除人", + "deleted_at": "删除时间", + "expire_at": "过期清理时间" + } + } + } + } +} diff --git a/frontend/admin/src/apps/article - 副本/routes/index.ts b/frontend/admin/src/apps/article - 副本/routes/index.ts new file mode 100644 index 0000000..6d04b32 --- /dev/null +++ b/frontend/admin/src/apps/article - 副本/routes/index.ts @@ -0,0 +1,59 @@ +import { AppRouteRecord } from '@/types/router' +import { RoutesAlias } from '@/router/routesAlias' + +export default { + path: '/article', + name: 'Article', + component: RoutesAlias.Layout, + meta: { + title: '文章管理', + icon: 'ri:plugin-line', + module: 'article' + }, + children: [ + { + path: 'index', + name: 'ArticleIndex', + component: '/article/content/index', + meta: { + title: '内容中心', + icon: 'ri:article-line', + keepAlive: false, + module: 'article' + } + }, + { + path: 'category', + name: 'ArticleCategory', + component: '/article/category/index', + meta: { + title: '内容分类', + icon: 'ri:folder-2-line', + keepAlive: false, + module: 'article' + } + }, + { + path: 'tag', + name: 'ArticleTag', + component: '/article/tag/index', + meta: { + title: '标签管理', + icon: 'ri:price-tag-3-line', + keepAlive: false, + module: 'article' + } + }, + { + path: 'recycle', + name: 'ArticleRecycle', + component: '/article/recycle/index', + meta: { + title: '内容回收站', + icon: 'ri:delete-bin-6-line', + keepAlive: false, + module: 'article' + } + } + ] +} as AppRouteRecord diff --git a/frontend/admin/src/apps/article - 副本/views/article/category/index.vue b/frontend/admin/src/apps/article - 副本/views/article/category/index.vue new file mode 100644 index 0000000..d835801 --- /dev/null +++ b/frontend/admin/src/apps/article - 副本/views/article/category/index.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/frontend/admin/src/apps/article - 副本/views/article/category/schemas/index.tsx b/frontend/admin/src/apps/article - 副本/views/article/category/schemas/index.tsx new file mode 100644 index 0000000..54d659a --- /dev/null +++ b/frontend/admin/src/apps/article - 副本/views/article/category/schemas/index.tsx @@ -0,0 +1,164 @@ +import { CrudSchema } from '@/components/crud' +import { DictEnum } from '@/enums' +import { $t } from '@/locales' +import { ArticleCategoryService } from '../../../../api/index' + +export const crudSchema = (): CrudSchema => { + return { + api: ArticleCategoryService.list, + dialogTitle: $t('article.modules.category.title'), + crudApi: { + add: ArticleCategoryService.create, + edit: ArticleCategoryService.update, + remove: ArticleCategoryService.delete, + view: ArticleCategoryService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'article:category:create', + editAuth: 'article:category:update', + removeAuth: 'article:category:delete', + viewAuth: 'article:category:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'LIKE_name', + label: $t('article.modules.category.search.keywords'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('article.modules.category.search.keywords_placeholder'), + }, + colSpan: 6, + }, + ], + }, + columns: [ + { + type: 'selection', + }, + { + type: 'index', + label: $t('article.common.columns.index'), + width: 70, + }, + { + prop: 'name', + label: $t('article.modules.category.columns.name'), + minWidth: 220, + }, + { + prop: 'slug', + label: $t('article.modules.category.columns.slug'), + minWidth: 180, + }, + { + prop: 'enabled', + label: $t('article.modules.category.columns.enabled'), + width: 120, + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_ENABLED_STATUS, + }, + }, + { + prop: 'sort', + label: $t('article.modules.category.columns.sort'), + width: 120, + }, + { + prop: 'updated_date', + label: $t('article.modules.category.columns.updated_at'), + minWidth: 180, + }, + ], + dialogProps: { + width: '600px', + }, + formSchema: { + showDefaultActions: false, + labelWidth: '100px', + schema: [ + { + component: 'Input', + show: false, + ifDetail: true, + colSpan: 24, + prop: 'id', + label: 'ID', + }, + { + component: 'Input', + prop: 'name', + label: $t('article.modules.category.columns.name'), + componentProps: { + placeholder: $t('article.modules.category.form.name_placeholder'), + maxlength: 100, + }, + rules: [{ required: true, message: $t('article.modules.category.form.name_placeholder') }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'slug', + label: $t('article.modules.category.columns.slug'), + componentProps: { + placeholder: $t('article.modules.category.form.slug_placeholder'), + maxlength: 100, + }, + colSpan: 12, + }, + { + component: 'InputNumber', + prop: 'parent_id', + label: $t('article.modules.category.form.parent_id'), + defaultValue: 0, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'InputNumber', + prop: 'sort', + label: $t('article.modules.category.columns.sort'), + defaultValue: 100, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'ApiDict', + prop: 'enabled', + label: $t('article.modules.category.columns.enabled'), + defaultValue: 1, + componentProps: { + code: DictEnum.SYS_ENABLED_STATUS, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 24, + }, + { + component: 'Input', + prop: 'description', + label: $t('article.modules.category.form.description'), + componentProps: { + type: 'textarea', + rows: 4, + placeholder: $t('article.modules.category.form.description_placeholder'), + }, + colSpan: 24, + }, + ], + }, + } +} diff --git a/frontend/admin/src/apps/article - 副本/views/article/content/index.vue b/frontend/admin/src/apps/article - 副本/views/article/content/index.vue new file mode 100644 index 0000000..c375ed5 --- /dev/null +++ b/frontend/admin/src/apps/article - 副本/views/article/content/index.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/frontend/admin/src/apps/article - 副本/views/article/content/schemas/index.tsx b/frontend/admin/src/apps/article - 副本/views/article/content/schemas/index.tsx new file mode 100644 index 0000000..736c216 --- /dev/null +++ b/frontend/admin/src/apps/article - 副本/views/article/content/schemas/index.tsx @@ -0,0 +1,212 @@ +import { CrudSchema } from '@/components/crud' +import { DictEnum } from '@/enums' +import { $t } from '@/locales' +import { ArticleContentService } from '../../../../api/index' + +export const crudSchema = (): CrudSchema => { + return { + api: ArticleContentService.list, + dialogTitle: $t('article.modules.content.title'), + crudApi: { + add: ArticleContentService.create, + edit: ArticleContentService.update, + remove: ArticleContentService.delete, + view: ArticleContentService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'article:create', + editAuth: 'article:update', + removeAuth: 'article:delete', + viewAuth: 'article:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'LIKE_title', + label: $t('article.modules.content.search.keywords'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('article.modules.content.search.keywords_placeholder'), + }, + colSpan: 6, + }, + ], + }, + columns: [ + { + type: 'selection', + }, + { + type: 'index', + label: $t('article.common.columns.index'), + width: 70, + }, + { + prop: 'title', + label: $t('article.modules.content.columns.title'), + minWidth: 220, + }, + { + prop: 'category_name', + label: $t('article.modules.content.columns.category'), + minWidth: 160, + }, + { + prop: 'tag_names', + label: $t('article.modules.content.columns.tags'), + minWidth: 200, + }, + { + prop: 'status', + label: $t('article.modules.content.columns.status'), + width: 120, + }, + { + prop: 'is_top', + label: $t('article.modules.content.columns.is_top'), + width: 120, + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_ENABLED_STATUS, + }, + }, + { + prop: 'updated_date', + label: $t('article.modules.content.columns.updated_at'), + minWidth: 180, + }, + ], + dialogProps: { + width: '70%', + }, + formSchema: { + showDefaultActions: false, + labelWidth: '100px', + schema: [ + { + component: 'Input', + show: false, + ifDetail: true, + colSpan: 24, + prop: 'id', + label: 'ID', + }, + { + component: 'Input', + prop: 'title', + label: $t('article.modules.content.columns.title'), + componentProps: { + placeholder: $t('article.modules.content.form.title_placeholder'), + maxlength: 200, + }, + rules: [{ required: true, message: $t('article.modules.content.form.title_placeholder') }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'slug', + label: 'Slug', + componentProps: { + placeholder: $t('article.modules.content.form.slug_placeholder'), + maxlength: 200, + }, + colSpan: 12, + }, + { + component: 'InputNumber', + prop: 'category_id', + label: $t('article.modules.content.form.category_id'), + componentProps: { + min: 0, + class: 'w-full', + }, + rules: [{ required: true, message: $t('article.modules.content.form.category_id') }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'cover', + label: $t('article.modules.content.form.cover'), + componentProps: { + placeholder: $t('article.modules.content.form.cover_placeholder'), + }, + colSpan: 12, + }, + { + component: 'Input', + prop: 'summary', + label: $t('article.modules.content.form.summary'), + componentProps: { + type: 'textarea', + rows: 4, + placeholder: $t('article.modules.content.form.summary_placeholder'), + }, + colSpan: 24, + }, + { + component: 'Input', + prop: 'content', + label: $t('article.modules.content.form.content'), + componentProps: { + type: 'textarea', + rows: 10, + placeholder: $t('article.modules.content.form.content_placeholder'), + }, + colSpan: 24, + }, + { + component: 'InputNumber', + prop: 'status', + label: $t('article.modules.content.form.status'), + defaultValue: 1, + componentProps: { + min: 0, + max: 2, + class: 'w-full', + }, + colSpan: 8, + }, + { + component: 'ApiDict', + prop: 'is_top', + label: $t('article.modules.content.form.is_top'), + defaultValue: 0, + componentProps: { + code: DictEnum.SYS_ENABLED_STATUS, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 8, + }, + { + component: 'InputNumber', + prop: 'sort', + label: 'Sort', + defaultValue: 100, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 8, + }, + { + component: 'DatePicker', + prop: 'published_at', + label: $t('article.modules.content.form.published_at'), + componentProps: { + type: 'datetime', + valueFormat: 'X', + class: 'w-full', + }, + colSpan: 12, + }, + ], + }, + } +} diff --git a/frontend/admin/src/apps/article - 副本/views/article/index/index.vue b/frontend/admin/src/apps/article - 副本/views/article/index/index.vue new file mode 100644 index 0000000..2617d29 --- /dev/null +++ b/frontend/admin/src/apps/article - 副本/views/article/index/index.vue @@ -0,0 +1,147 @@ + + + + + diff --git a/frontend/admin/src/apps/article - 副本/views/article/recycle/index.vue b/frontend/admin/src/apps/article - 副本/views/article/recycle/index.vue new file mode 100644 index 0000000..fa6aad5 --- /dev/null +++ b/frontend/admin/src/apps/article - 副本/views/article/recycle/index.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/frontend/admin/src/apps/article - 副本/views/article/recycle/schemas/index.tsx b/frontend/admin/src/apps/article - 副本/views/article/recycle/schemas/index.tsx new file mode 100644 index 0000000..bd35770 --- /dev/null +++ b/frontend/admin/src/apps/article - 副本/views/article/recycle/schemas/index.tsx @@ -0,0 +1,65 @@ +import { CrudSchema } from '@/components/crud' +import { $t } from '@/locales' +import pluginApi from '../../../../api/index' + +export const crudSchema = (): CrudSchema => { + return { + api: async (params: any) => { + const response = await pluginApi.recycleList(params) + const rows = Array.isArray(response?.data) ? response.data : [] + return { + recordCount: rows.length, + totalPage: 1, + rows, + } + }, + useCrud: false, + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'LIKE_title', + label: $t('article.modules.recycle.search.keywords'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('article.modules.recycle.search.keywords_placeholder'), + }, + colSpan: 6, + }, + ], + }, + columns: [ + { + type: 'index', + label: $t('article.common.columns.index'), + width: 70, + }, + { + prop: 'title', + label: $t('article.modules.recycle.columns.title'), + minWidth: 220, + }, + { + prop: 'category', + label: $t('article.modules.recycle.columns.category'), + minWidth: 160, + }, + { + prop: 'deleted_by', + label: $t('article.modules.recycle.columns.deleted_by'), + width: 140, + }, + { + prop: 'deleted_at', + label: $t('article.modules.recycle.columns.deleted_at'), + minWidth: 180, + }, + { + prop: 'expire_at', + label: $t('article.modules.recycle.columns.expire_at'), + minWidth: 180, + }, + ], + } +} diff --git a/frontend/admin/src/apps/article - 副本/views/article/tag/index.vue b/frontend/admin/src/apps/article - 副本/views/article/tag/index.vue new file mode 100644 index 0000000..c763b60 --- /dev/null +++ b/frontend/admin/src/apps/article - 副本/views/article/tag/index.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/frontend/admin/src/apps/article - 副本/views/article/tag/schemas/index.tsx b/frontend/admin/src/apps/article - 副本/views/article/tag/schemas/index.tsx new file mode 100644 index 0000000..5ade820 --- /dev/null +++ b/frontend/admin/src/apps/article - 副本/views/article/tag/schemas/index.tsx @@ -0,0 +1,164 @@ +import { CrudSchema } from '@/components/crud' +import { DictEnum } from '@/enums' +import { $t } from '@/locales' +import { ArticleTagService } from '../../../../api/index' + +export const crudSchema = (): CrudSchema => { + return { + api: ArticleTagService.list, + dialogTitle: $t('article.modules.tag.title'), + crudApi: { + add: ArticleTagService.create, + edit: ArticleTagService.update, + remove: ArticleTagService.delete, + view: ArticleTagService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'article:tag:create', + editAuth: 'article:tag:update', + removeAuth: 'article:tag:delete', + viewAuth: 'article:tag:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'LIKE_name', + label: $t('article.modules.tag.search.keywords'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('article.modules.tag.search.keywords_placeholder'), + }, + colSpan: 6, + }, + ], + }, + columns: [ + { + type: 'selection', + }, + { + type: 'index', + label: $t('article.common.columns.index'), + width: 70, + }, + { + prop: 'name', + label: $t('article.modules.tag.columns.name'), + minWidth: 220, + }, + { + prop: 'slug', + label: $t('article.modules.tag.columns.slug'), + minWidth: 180, + }, + { + prop: 'enabled', + label: $t('article.modules.tag.columns.enabled'), + width: 120, + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_ENABLED_STATUS, + }, + }, + { + prop: 'heat', + label: $t('article.modules.tag.columns.heat'), + width: 120, + }, + { + prop: 'updated_date', + label: $t('article.modules.tag.columns.updated_at'), + minWidth: 180, + }, + ], + dialogProps: { + width: '600px', + }, + formSchema: { + showDefaultActions: false, + labelWidth: '100px', + schema: [ + { + component: 'Input', + show: false, + ifDetail: true, + colSpan: 24, + prop: 'id', + label: 'ID', + }, + { + component: 'Input', + prop: 'name', + label: $t('article.modules.tag.columns.name'), + componentProps: { + placeholder: $t('article.modules.tag.form.name_placeholder'), + maxlength: 100, + }, + rules: [{ required: true, message: $t('article.modules.tag.form.name_placeholder') }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'slug', + label: $t('article.modules.tag.columns.slug'), + componentProps: { + placeholder: $t('article.modules.tag.form.slug_placeholder'), + maxlength: 100, + }, + colSpan: 12, + }, + { + component: 'InputNumber', + prop: 'sort', + label: $t('article.modules.tag.columns.heat'), + defaultValue: 100, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'InputNumber', + prop: 'heat', + label: $t('article.modules.tag.columns.heat'), + defaultValue: 0, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'ApiDict', + prop: 'enabled', + label: $t('article.modules.tag.columns.enabled'), + defaultValue: 1, + componentProps: { + code: DictEnum.SYS_ENABLED_STATUS, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 24, + }, + { + component: 'Input', + prop: 'description', + label: $t('article.modules.tag.form.description'), + componentProps: { + type: 'textarea', + rows: 4, + placeholder: $t('article.modules.tag.form.description_placeholder'), + }, + colSpan: 24, + }, + ], + }, + } +} diff --git a/frontend/admin/src/apps/article - 副本/views/index/index.vue b/frontend/admin/src/apps/article - 副本/views/index/index.vue new file mode 100644 index 0000000..1d702c1 --- /dev/null +++ b/frontend/admin/src/apps/article - 副本/views/index/index.vue @@ -0,0 +1,147 @@ + + + + + diff --git a/frontend/admin/src/apps/article/.gitkeep b/frontend/admin/src/apps/article/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/frontend/admin/src/apps/article/api/index.ts b/frontend/admin/src/apps/article/api/index.ts new file mode 100644 index 0000000..5c8087b --- /dev/null +++ b/frontend/admin/src/apps/article/api/index.ts @@ -0,0 +1,118 @@ +import BaseService from '@/api/core/base' +import request from '@/utils/http' + +export interface ArticleCategoryRow { + id?: string | number + name: string + slug?: string + parent_id?: string | number + article_count?: number + sort?: number + enabled?: number + description?: string + created_date?: string + updated_date?: string +} + +export interface ArticleTagRow { + id?: string | number + name: string + slug?: string + article_count?: number + sort?: number + heat?: number + enabled?: number + description?: string + created_date?: string + updated_date?: string +} + +export interface ArticleContentRow { + id?: string | number + title: string + content_type?: string + slug?: string + category_id?: string | number + category_name?: string + channel?: string + visibility?: number + author?: string + source?: string + cover?: string + seo_keywords?: string + seo_title?: string + seo_description?: string + summary?: string + content?: string + status?: number + is_top?: number + is_recommend?: number + allow_comment?: number + sort?: number + view_count?: number + like_count?: number + comment_count?: number + favorite_count?: number + published_at?: number | string + offline_at?: number | string + tag_ids?: Array + tag_names?: string + created_date?: string + updated_date?: string +} + +export const ArticleContentService = { + ...BaseService({ baseUrl: '/article/index' }) +} + +export const ArticleCategoryService = { + ...BaseService({ baseUrl: '/article/category' }) +} + +export const ArticleTagService = { + ...BaseService({ baseUrl: '/article/tag' }) +} + +const pluginApi = { + async test(params = {}) { + return request.get<{ msg?: string; data?: unknown }>({ + url: '/article/index', + params + }) + }, + + contentList(params = {}) { + return ArticleContentService.list(params as Record) + }, + + categoryList(params = {}) { + return ArticleCategoryService.list(params as Record) + }, + + tagList(params = {}) { + return ArticleTagService.list(params as Record) + }, + + async recycleList(params = {}) { + return request.get<{ code: number; msg: string; data: Record[] }>({ + url: '/article/recycle', + params + }) + }, + + async recycleRestore(id: string | number) { + return request.put({ + url: `/article/recycle/${id}/restore`, + params: { id } + }) + }, + + async recycleDelete(id: string | number) { + return request.del({ + url: `/article/recycle/${id}`, + params: { id } + }) + } +} + +export default pluginApi diff --git a/frontend/admin/src/apps/article/lang/en/en.json b/frontend/admin/src/apps/article/lang/en/en.json new file mode 100644 index 0000000..1ab8908 --- /dev/null +++ b/frontend/admin/src/apps/article/lang/en/en.json @@ -0,0 +1,136 @@ +{ + "article": { + "title": "Article Management", + "description": "Article content operation and management plugin", + "card_title": "Article Plugin Data", + "refresh_btn": "Refresh", + "common": { + "list_mode": "List Mode", + "columns": { + "index": "No." + } + }, + "modules": { + "content": { + "title": "Content Center", + "description": "Manage articles, publish states, and content archives.", + "search": { + "keywords": "Keywords", + "keywords_placeholder": "Please enter article title, category, or tags" + }, + "form": { + "title": "Content Title", + "title_placeholder": "Please enter article title", + "slug": "Content Slug", + "slug_placeholder": "Please enter article slug", + "content_type": "Content Type", + "category_id": "Category", + "category_id_placeholder": "Please select category", + "channel": "Channel", + "visibility": "Visibility", + "author": "Author", + "author_placeholder": "Please enter author", + "source": "Source", + "cover": "Cover", + "cover_placeholder": "Please enter cover URL", + "summary": "Summary", + "summary_placeholder": "Please enter summary", + "content": "Content", + "content_placeholder": "Please enter content", + "status": "Status", + "is_top": "Pinned", + "is_recommend": "Recommend", + "allow_comment": "Comment Setting", + "sort": "Sort Order", + "sort_placeholder": "Please enter sort order", + "view_count": "View Count", + "like_count": "Like Count", + "comment_count": "Comment Count", + "favorite_count": "Favorite Count", + "published_at": "Published At", + "offline_at": "Offline At", + "tag_ids": "Content Tags", + "tag_ids_placeholder": "Please select content tags", + "seo_keywords": "SEO Keywords", + "seo_keywords_placeholder": "For search engine optimization", + "seo_title": "SEO Title", + "seo_title_placeholder": "Optional, defaults to content title", + "seo_description": "SEO Description", + "seo_description_placeholder": "Optional, highlight value and search keywords" + }, + "columns": { + "title": "Article Title", + "content_info": "Content Info", + "category": "Category", + "tags": "Tags", + "status": "Status", + "business_data": "Business Data", + "time_info": "Time", + "is_top": "Pinned", + "updated_at": "Last Updated" + } + }, + "category": { + "title": "Content Category", + "description": "Manage article category structure and ordering.", + "search": { + "keywords": "Keywords", + "keywords_placeholder": "Please enter category name or slug" + }, + "form": { + "name_placeholder": "Please enter category name", + "slug_placeholder": "Please enter category slug", + "parent_id": "Parent Category", + "parent_top": "Top Category", + "description": "Category Description", + "description_placeholder": "Please enter category description" + }, + "columns": { + "name": "Category Name", + "slug": "Category Slug", + "article_count": "Content Count", + "enabled": "Status", + "sort": "Sort", + "updated_at": "Last Updated" + } + }, + "tag": { + "title": "Tag Management", + "description": "Maintain article tags, popularity, and related article counts.", + "search": { + "keywords": "Keywords", + "keywords_placeholder": "Please enter tag name or slug" + }, + "form": { + "name_placeholder": "Please enter tag name", + "slug_placeholder": "Please enter tag slug", + "description": "Tag Description", + "description_placeholder": "Please enter tag description" + }, + "columns": { + "name": "Tag Name", + "slug": "Tag Slug", + "article_count": "Usage Count", + "enabled": "Status", + "heat": "Heat", + "updated_at": "Last Updated" + } + }, + "recycle": { + "title": "Content Recycle Bin", + "description": "Manage deleted articles for later recovery or cleanup.", + "search": { + "keywords": "Keywords", + "keywords_placeholder": "Please enter article title or deleter" + }, + "columns": { + "title": "Article Title", + "category": "Original Category", + "deleted_by": "Deleted By", + "deleted_at": "Deleted At", + "expire_at": "Expire At" + } + } + } + } +} diff --git a/frontend/admin/src/apps/article/lang/en/index.json b/frontend/admin/src/apps/article/lang/en/index.json new file mode 100644 index 0000000..a11b9a1 --- /dev/null +++ b/frontend/admin/src/apps/article/lang/en/index.json @@ -0,0 +1,8 @@ +{ + "article": { + "title": "Article Management", + "description": "Article plugin demo page", + "card_title": "Article Plugin Data", + "refresh_btn": "Refresh" + } +} \ No newline at end of file diff --git a/frontend/admin/src/apps/article/lang/zh-cn/index.json b/frontend/admin/src/apps/article/lang/zh-cn/index.json new file mode 100644 index 0000000..582d445 --- /dev/null +++ b/frontend/admin/src/apps/article/lang/zh-cn/index.json @@ -0,0 +1,8 @@ +{ + "article": { + "title": "文章管理", + "description": "文章插件示例页面", + "card_title": "文章插件数据", + "refresh_btn": "刷新" + } +} \ No newline at end of file diff --git a/frontend/admin/src/apps/article/lang/zh-cn/zh.json b/frontend/admin/src/apps/article/lang/zh-cn/zh.json new file mode 100644 index 0000000..1fcdb6e --- /dev/null +++ b/frontend/admin/src/apps/article/lang/zh-cn/zh.json @@ -0,0 +1,136 @@ +{ + "article": { + "title": "文章管理", + "description": "文章内容运营与管理插件", + "card_title": "文章插件数据", + "refresh_btn": "刷新", + "common": { + "list_mode": "列表模式", + "columns": { + "index": "序号" + } + }, + "modules": { + "content": { + "title": "内容中心", + "description": "管理文章内容、发布状态与内容归档。", + "search": { + "keywords": "关键字", + "keywords_placeholder": "请输入文章标题、分类或标签" + }, + "form": { + "title": "内容标题", + "title_placeholder": "请输入文章标题", + "slug": "内容别名", + "slug_placeholder": "请输入文章标识", + "content_type": "内容类型", + "category_id": "内容分类", + "category_id_placeholder": "请选择内容分类", + "channel": "所属频道", + "visibility": "可见范围", + "author": "作者", + "author_placeholder": "请输入作者", + "source": "内容来源", + "cover": "封面图", + "cover_placeholder": "请输入封面图地址", + "summary": "摘要", + "summary_placeholder": "请输入摘要", + "content": "文章内容", + "content_placeholder": "请输入文章内容", + "status": "状态", + "is_top": "是否置顶", + "is_recommend": "推荐", + "allow_comment": "评论设置", + "sort": "内容排序", + "sort_placeholder": "请输入排序", + "view_count": "浏览量", + "like_count": "点赞量", + "comment_count": "评论量", + "favorite_count": "收藏量", + "published_at": "发布时间", + "offline_at": "下线时间", + "tag_ids": "内容标签", + "tag_ids_placeholder": "请选择内容标签", + "seo_keywords": "SEO 关键词", + "seo_keywords_placeholder": "用于搜索引擎优化", + "seo_title": "SEO 标题", + "seo_title_placeholder": "可选,默认继承内容标题", + "seo_description": "SEO 描述", + "seo_description_placeholder": "可选,建议突出商业价值与检索关键词" + }, + "columns": { + "title": "文章标题", + "content_info": "内容信息", + "category": "内容分类", + "tags": "标签", + "status": "状态", + "business_data": "经营数据", + "time_info": "时间", + "is_top": "置顶", + "updated_at": "最后更新" + } + }, + "category": { + "title": "内容分类", + "description": "管理文章分类结构与分类排序。", + "search": { + "keywords": "关键字", + "keywords_placeholder": "请输入分类名称或分类标识" + }, + "form": { + "name_placeholder": "请输入分类名称", + "slug_placeholder": "请输入分类标识", + "parent_id": "父级分类", + "parent_top": "顶级分类", + "description": "分类描述", + "description_placeholder": "请输入分类描述" + }, + "columns": { + "name": "分类名称", + "slug": "分类标识", + "article_count": "内容数", + "enabled": "状态", + "sort": "排序", + "updated_at": "最后更新" + } + }, + "tag": { + "title": "标签管理", + "description": "维护文章标签、热度与关联内容数量。", + "search": { + "keywords": "关键字", + "keywords_placeholder": "请输入标签名称或标签标识" + }, + "form": { + "name_placeholder": "请输入标签名称", + "slug_placeholder": "请输入标签标识", + "description": "标签描述", + "description_placeholder": "请输入标签描述" + }, + "columns": { + "name": "标签名称", + "slug": "标签标识", + "article_count": "使用次数", + "enabled": "状态", + "heat": "热度", + "updated_at": "最后更新" + } + }, + "recycle": { + "title": "内容回收站", + "description": "管理已删除文章,支持后续恢复或清理。", + "search": { + "keywords": "关键字", + "keywords_placeholder": "请输入文章标题或删除人" + }, + "columns": { + "title": "文章标题", + "category": "原分类", + "deleted_by": "删除人", + "deleted_at": "删除时间", + "expire_at": "过期清理时间" + } + } + } + } +} diff --git a/frontend/admin/src/apps/article/routes/index.ts b/frontend/admin/src/apps/article/routes/index.ts new file mode 100644 index 0000000..6d04b32 --- /dev/null +++ b/frontend/admin/src/apps/article/routes/index.ts @@ -0,0 +1,59 @@ +import { AppRouteRecord } from '@/types/router' +import { RoutesAlias } from '@/router/routesAlias' + +export default { + path: '/article', + name: 'Article', + component: RoutesAlias.Layout, + meta: { + title: '文章管理', + icon: 'ri:plugin-line', + module: 'article' + }, + children: [ + { + path: 'index', + name: 'ArticleIndex', + component: '/article/content/index', + meta: { + title: '内容中心', + icon: 'ri:article-line', + keepAlive: false, + module: 'article' + } + }, + { + path: 'category', + name: 'ArticleCategory', + component: '/article/category/index', + meta: { + title: '内容分类', + icon: 'ri:folder-2-line', + keepAlive: false, + module: 'article' + } + }, + { + path: 'tag', + name: 'ArticleTag', + component: '/article/tag/index', + meta: { + title: '标签管理', + icon: 'ri:price-tag-3-line', + keepAlive: false, + module: 'article' + } + }, + { + path: 'recycle', + name: 'ArticleRecycle', + component: '/article/recycle/index', + meta: { + title: '内容回收站', + icon: 'ri:delete-bin-6-line', + keepAlive: false, + module: 'article' + } + } + ] +} as AppRouteRecord diff --git a/frontend/admin/src/apps/article/views/article/category/index.vue b/frontend/admin/src/apps/article/views/article/category/index.vue new file mode 100644 index 0000000..d835801 --- /dev/null +++ b/frontend/admin/src/apps/article/views/article/category/index.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/frontend/admin/src/apps/article/views/article/category/schemas/index.tsx b/frontend/admin/src/apps/article/views/article/category/schemas/index.tsx new file mode 100644 index 0000000..0d64db7 --- /dev/null +++ b/frontend/admin/src/apps/article/views/article/category/schemas/index.tsx @@ -0,0 +1,189 @@ +import { CrudSchema } from '@/components/crud' +import { DictEnum } from '@/enums' +import { $t } from '@/locales' +import { ArticleCategoryService } from '../../../../api/index' + +export const crudSchema = (): CrudSchema => { + return { + api: ArticleCategoryService.list, + dialogTitle: $t('article.modules.category.title'), + crudApi: { + add: ArticleCategoryService.create, + edit: ArticleCategoryService.update, + remove: ArticleCategoryService.delete, + view: ArticleCategoryService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'article:category:create', + editAuth: 'article:category:update', + removeAuth: 'article:category:delete', + viewAuth: 'article:category:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'LIKE_name', + label: $t('article.modules.category.search.keywords'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('article.modules.category.search.keywords_placeholder'), + }, + colSpan: 6, + }, + ], + }, + columns: [ + { + type: 'selection', + }, + { + type: 'index', + label: $t('article.common.columns.index'), + width: 70, + }, + { + prop: 'name', + label: $t('article.modules.category.columns.name'), + minWidth: 220, + }, + { + prop: 'slug', + label: $t('article.modules.category.columns.slug'), + minWidth: 180, + }, + { + prop: 'article_count', + label: $t('article.modules.category.columns.article_count'), + width: 120, + }, + { + prop: 'enabled', + label: $t('article.modules.category.columns.enabled'), + width: 120, + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_ENABLED_STATUS, + }, + }, + { + prop: 'sort', + label: $t('article.modules.category.columns.sort'), + width: 120, + }, + { + prop: 'updated_date', + label: $t('article.modules.category.columns.updated_at'), + minWidth: 180, + }, + ], + dialogProps: { + width: '600px', + }, + formSchema: { + showDefaultActions: false, + labelWidth: '100px', + schema: [ + { + component: 'Input', + show: false, + ifDetail: true, + colSpan: 24, + prop: 'id', + label: 'ID', + }, + { + component: 'Input', + prop: 'name', + label: $t('article.modules.category.columns.name'), + componentProps: { + placeholder: $t('article.modules.category.form.name_placeholder'), + maxlength: 100, + }, + rules: [{ required: true, message: $t('article.modules.category.form.name_placeholder') }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'slug', + label: $t('article.modules.category.columns.slug'), + componentProps: { + placeholder: $t('article.modules.category.form.slug_placeholder'), + maxlength: 100, + }, + colSpan: 12, + }, + { + component: 'ApiTreeSelect', + prop: 'parent_id', + label: $t('article.modules.category.form.parent_id'), + defaultValue: 0, + componentProps: { + api: '/article/category', + requestMethod: 'get', + params: { + format: 'tree', + }, + afterFetch: async (res: any) => { + if (!Array.isArray(res)) { + return res + } + return [ + { + id: 0, + name: $t('article.modules.category.form.parent_top'), + }, + ...res, + ] + }, + clearable: true, + checkStrictly: true, + class: 'w-full', + labelField: 'name', + valueField: 'id', + }, + colSpan: 12, + }, + { + component: 'InputNumber', + prop: 'sort', + label: $t('article.modules.category.columns.sort'), + defaultValue: 100, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'ApiDict', + prop: 'enabled', + label: $t('article.modules.category.columns.enabled'), + defaultValue: 1, + componentProps: { + code: DictEnum.SYS_ENABLED_STATUS, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 24, + }, + { + component: 'Input', + prop: 'description', + label: $t('article.modules.category.form.description'), + componentProps: { + type: 'textarea', + rows: 4, + placeholder: $t('article.modules.category.form.description_placeholder'), + }, + colSpan: 24, + }, + ], + }, + } +} diff --git a/frontend/admin/src/apps/article/views/article/content/index.vue b/frontend/admin/src/apps/article/views/article/content/index.vue new file mode 100644 index 0000000..c375ed5 --- /dev/null +++ b/frontend/admin/src/apps/article/views/article/content/index.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/frontend/admin/src/apps/article/views/article/content/schemas/index.tsx b/frontend/admin/src/apps/article/views/article/content/schemas/index.tsx new file mode 100644 index 0000000..fde1498 --- /dev/null +++ b/frontend/admin/src/apps/article/views/article/content/schemas/index.tsx @@ -0,0 +1,544 @@ +import { CrudSchema } from '@/components/crud' +import { DictEnum } from '@/enums' +import { $t } from '@/locales' +import { ArticleContentService } from '../../../../api/index' +import { h } from 'vue' + +const contentTypeOptions = [ + { label: '文章', value: 'article' }, + { label: '图文', value: 'news' }, + { label: '公告', value: 'notice' }, +] + +const channelOptions = [ + { label: '官网内容', value: 'official' }, + { label: '专题内容', value: 'topic' }, + { label: '活动内容', value: 'activity' }, +] + +const visibilityOptions = [ + { label: '公开', value: 1 }, + { label: '登录可见', value: 2 }, + { label: '私密', value: 3 }, +] + +const sourceOptions = [ + { label: '原创', value: 'original' }, + { label: '转载', value: 'repost' }, + { label: '投稿', value: 'contribution' }, +] + +const statusOptions = [ + { label: '草稿', value: 0 }, + { label: '发布', value: 1 }, + { label: '下线', value: 2 }, +] + +const getOptionLabel = (options: Array<{ label: string; value: string | number }>, value: string | number) => { + return options.find((item) => item.value === value)?.label || '-' +} + +const getStatusTagClass = (status: number) => { + if (status === 1) { + return 'inline-flex rounded-full bg-[#ecfdf5] px-2 py-[2px] text-xs text-[#10b981]' + } + if (status === 2) { + return 'inline-flex rounded-full bg-[#fef2f2] px-2 py-[2px] text-xs text-[#ef4444]' + } + return 'inline-flex rounded-full bg-[#f4f4f5] px-2 py-[2px] text-xs text-[#909399]' +} + +export const crudSchema = (): CrudSchema => { + return { + api: ArticleContentService.list, + dialogTitle: $t('article.modules.content.title'), + exportFileName: '内容中心', + exportFields: [ + { field: 'title', title: '标题' }, + { field: 'content_type', title: '内容类型' }, + { field: 'category_name', title: '分类' }, + { field: 'tag_names', title: '标签' }, + { field: 'author', title: '作者' }, + { field: 'channel', title: '频道' }, + { field: 'visibility', title: '可见范围' }, + { field: 'source', title: '来源' }, + { field: 'status', title: '状态' }, + { field: 'is_top', title: '置顶' }, + { field: 'is_recommend', title: '推荐' }, + { field: 'view_count', title: '浏览数' }, + { field: 'like_count', title: '点赞数' }, + { field: 'comment_count', title: '评论数' }, + { field: 'favorite_count', title: '收藏数' }, + { field: 'published_at', title: '发布时间' }, + { field: 'updated_date', title: '更新时间' }, + { field: 'summary', title: '摘要' } + ], + crudApi: { + add: ArticleContentService.create, + edit: ArticleContentService.update, + remove: ArticleContentService.remove, + view: ArticleContentService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'article:create', + editAuth: 'article:update', + removeAuth: 'article:delete', + viewAuth: 'article:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'LIKE_title', + label: $t('article.modules.content.search.keywords'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('article.modules.content.search.keywords_placeholder'), + }, + colSpan: 6, + }, + ], + }, + columns: [ + { + type: 'index', + label: $t('article.common.columns.index'), + width: 70, + }, + { + prop: 'content_info', + label: $t('article.modules.content.columns.content_info'), + minWidth: 380, + formatter: (row: any) => { + const metaItems = [ + getOptionLabel(contentTypeOptions, row.content_type), + row.author || '管理员', + row.category_name, + row.tag_names, + ].filter(Boolean) + + const badgeNodes = [ + Number(row.is_top) === 1 + ? h('span', { class: 'inline-flex items-center rounded bg-[#fff7e6] px-1.5 py-[1px] text-[10px] text-[#fa8c16]' }, '置顶') + : null, + Number(row.is_recommend) === 1 + ? h('span', { class: 'inline-flex items-center rounded bg-[#ecfdf5] px-1.5 py-[1px] text-[10px] text-[#10b981]' }, '推荐') + : null, + ].filter(Boolean) + + return h('div', { class: 'flex gap-3 py-2' }, [ + row.cover + ? h('img', { + src: row.cover, + class: 'mt-1 h-14 w-20 flex-none rounded bg-[#f5f7fa] object-cover border border-[#f0f0f0]' + }) + : h( + 'div', + { + class: 'mt-1 h-14 w-20 flex-none rounded border border-[#f0f0f0] bg-[#fafafa] text-[10px] text-[#c0c4cc] flex items-center justify-center' + }, + '无上传封面' + ), + h('div', { class: 'min-w-0 flex-1 leading-6' }, [ + h('div', { class: 'flex items-center gap-2 text-sm font-medium text-[#1f2937]' }, [ + h('span', { class: 'line-clamp-1' }, row.title || '-'), + ...badgeNodes + ]), + h( + 'div', + { class: 'mt-1 flex flex-wrap gap-x-3 gap-y-1 text-xs text-[#909399]' }, + metaItems.length > 0 ? metaItems.map((item) => h('span', item)) : [h('span', '-')] + ), + h('div', { class: 'mt-1 line-clamp-2 text-xs text-[#606266]' }, row.summary || row.slug || '-') + ]) + ]) + } + }, + { + prop: 'status_info', + label: $t('article.modules.content.columns.status'), + width: 140, + align: 'center', + formatter: (row: any) => { + const statusText = getOptionLabel(statusOptions, row.status) + const visibilityText = getOptionLabel(visibilityOptions, row.visibility) + const sourceText = getOptionLabel(sourceOptions, row.source) + return h('div', { class: 'flex flex-col items-center py-2 text-sm leading-6' }, [ + h('div', [ + h('span', { class: getStatusTagClass(Number(row.status)) }, statusText) + ]), + h('div', { class: 'mt-1 text-xs text-[#606266]' }, visibilityText), + h('div', { class: 'mt-1 text-xs text-[#909399]' }, sourceText) + ]) + } + }, + { + prop: 'business_data', + label: $t('article.modules.content.columns.business_data'), + minWidth: 250, + formatter: (row: any) => { + const metricItems = [ + { label: '浏览', value: row.view_count ?? 0 }, + { label: '点赞', value: row.like_count ?? 0 }, + { label: '评论', value: row.comment_count ?? 0 }, + { label: '收藏', value: row.favorite_count ?? 0 }, + ] + + return h('div', { class: 'grid grid-cols-2 gap-2 py-2 text-xs text-[#606266]' }, [ + ...metricItems.map((item) => + h('div', { class: 'flex items-center justify-between rounded border border-[#e5e7eb] bg-[#eef2f6] px-3 py-1.5 transition-colors hover:bg-[#e5e7eb]' }, [ + h('span', { class: 'text-[#909399]' }, item.label), + h('span', item.value) + ]) + ) + ]) + } + }, + { + prop: 'time_info', + label: $t('article.modules.content.columns.time_info'), + minWidth: 190, + formatter: (row: any) => { + return h('div', { class: 'py-2 text-xs leading-6 text-[#606266]' }, [ + h('div', [ + h('span', { class: 'text-[#909399]' }, '更新 '), + h('span', row.updated_date || '-') + ]), + h('div', { class: 'mt-1' }, [ + h('span', { class: 'text-[#909399]' }, '发布 '), + h('span', row.created_date || '-') + ]) + ]) + } + }, + ], + tableActionColumn: { + width: 170, + }, + dialogProps: { + width: '70%', + }, + formSchema: { + showDefaultActions: false, + labelWidth: '100px', + schema: [ + { + component: 'Input', + show: false, + ifDetail: true, + colSpan: 24, + prop: 'id', + label: 'ID', + }, + { + component: 'Input', + prop: 'title', + label: $t('article.modules.content.columns.title'), + componentProps: { + placeholder: $t('article.modules.content.form.title_placeholder'), + maxlength: 200, + }, + rules: [{ required: true, message: $t('article.modules.content.form.title_placeholder') }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'slug', + label: $t('article.modules.content.form.slug'), + componentProps: { + placeholder: $t('article.modules.content.form.slug_placeholder'), + maxlength: 200, + }, + colSpan: 12, + }, + { + component: 'Select', + prop: 'content_type', + label: $t('article.modules.content.form.content_type'), + defaultValue: 'article', + componentProps: { + options: contentTypeOptions, + class: 'w-full', + }, + rules: [{ required: true, message: $t('article.modules.content.form.content_type') }], + colSpan: 12, + }, + { + component: 'ApiTreeSelect', + prop: 'category_id', + label: $t('article.modules.content.form.category_id'), + componentProps: { + api: '/article/category', + requestMethod: 'get', + params: { + format: 'tree', + }, + teleported: true, + clearable: true, + checkStrictly: true, + class: 'w-full', + labelField: 'name', + valueField: 'id', + placeholder: $t('article.modules.content.form.category_id_placeholder'), + }, + rules: [{ required: true, message: $t('article.modules.content.form.category_id') }], + colSpan: 12, + }, + { + component: 'Select', + prop: 'channel', + label: $t('article.modules.content.form.channel'), + defaultValue: 'official', + componentProps: { + options: channelOptions, + class: 'w-full', + }, + rules: [{ required: true, message: $t('article.modules.content.form.channel') }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'author', + label: $t('article.modules.content.form.author'), + componentProps: { + placeholder: $t('article.modules.content.form.author_placeholder'), + maxlength: 100, + }, + rules: [{ required: true, message: $t('article.modules.content.form.author_placeholder') }], + colSpan: 12, + }, + { + component: 'Select', + prop: 'visibility', + label: $t('article.modules.content.form.visibility'), + defaultValue: 1, + componentProps: { + options: visibilityOptions, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'Select', + prop: 'status', + label: $t('article.modules.content.form.status'), + defaultValue: 0, + componentProps: { + options: statusOptions, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'Select', + prop: 'source', + label: $t('article.modules.content.form.source'), + defaultValue: 'original', + componentProps: { + options: sourceOptions, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'Avatar', + prop: 'cover', + label: $t('article.modules.content.form.cover'), + componentProps: { + shape: 'square', + }, + colSpan: 24, + }, + { + component: 'Input', + prop: 'summary', + label: $t('article.modules.content.form.summary'), + componentProps: { + type: 'textarea', + rows: 4, + maxlength: 500, + placeholder: $t('article.modules.content.form.summary_placeholder'), + }, + colSpan: 24, + }, + { + component: 'ApiSelect', + prop: 'tag_ids', + label: $t('article.modules.content.form.tag_ids'), + componentProps: { + api: '/article/tag', + requestMethod: 'get', + params: { + format: 'select', + }, + labelField: 'label', + valueField: 'value', + multiple: true, + clearable: true, + filterable: true, + class: 'w-full', + placeholder: $t('article.modules.content.form.tag_ids_placeholder'), + }, + colSpan: 12, + }, + { + component: 'Input', + prop: 'seo_keywords', + label: $t('article.modules.content.form.seo_keywords'), + componentProps: { + placeholder: $t('article.modules.content.form.seo_keywords_placeholder'), + maxlength: 255, + }, + colSpan: 12, + }, + { + component: 'Input', + prop: 'seo_title', + label: $t('article.modules.content.form.seo_title'), + componentProps: { + placeholder: $t('article.modules.content.form.seo_title_placeholder'), + maxlength: 200, + }, + colSpan: 12, + }, + { + component: 'Input', + prop: 'seo_description', + label: $t('article.modules.content.form.seo_description'), + componentProps: { + placeholder: $t('article.modules.content.form.seo_description_placeholder'), + maxlength: 500, + }, + colSpan: 12, + }, + { + component: 'InputNumber', + prop: 'sort', + label: $t('article.modules.content.form.sort'), + defaultValue: 100, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 8, + }, + { + component: 'DatePicker', + prop: 'published_at', + label: $t('article.modules.content.form.published_at'), + componentProps: { + type: 'datetime', + valueFormat: 'X', + class: 'w-full', + }, + colSpan: 8, + }, + { + component: 'DatePicker', + prop: 'offline_at', + label: $t('article.modules.content.form.offline_at'), + componentProps: { + type: 'datetime', + valueFormat: 'X', + class: 'w-full', + }, + colSpan: 8, + }, + { + component: 'InputNumber', + prop: 'view_count', + label: $t('article.modules.content.form.view_count'), + defaultValue: 0, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 6, + }, + { + component: 'InputNumber', + prop: 'like_count', + label: $t('article.modules.content.form.like_count'), + defaultValue: 0, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 6, + }, + { + component: 'InputNumber', + prop: 'comment_count', + label: $t('article.modules.content.form.comment_count'), + defaultValue: 0, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 6, + }, + { + component: 'InputNumber', + prop: 'favorite_count', + label: $t('article.modules.content.form.favorite_count'), + defaultValue: 0, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 6, + }, + { + component: 'ApiDict', + prop: 'is_top', + label: $t('article.modules.content.form.is_top'), + defaultValue: 0, + componentProps: { + code: DictEnum.SYS_YES_NO, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 8, + }, + { + component: 'ApiDict', + prop: 'is_recommend', + label: $t('article.modules.content.form.is_recommend'), + defaultValue: 0, + componentProps: { + code: DictEnum.SYS_YES_NO, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 8, + }, + { + component: 'ApiDict', + prop: 'allow_comment', + label: $t('article.modules.content.form.allow_comment'), + defaultValue: 1, + componentProps: { + code: DictEnum.SYS_YES_NO, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 8, + }, + { + component: 'Editor', + prop: 'content', + label: $t('article.modules.content.form.content'), + componentProps: { + placeholder: $t('article.modules.content.form.content_placeholder'), + }, + colSpan: 24, + }, + ], + }, + } +} diff --git a/frontend/admin/src/apps/article/views/article/index/index.vue b/frontend/admin/src/apps/article/views/article/index/index.vue new file mode 100644 index 0000000..2617d29 --- /dev/null +++ b/frontend/admin/src/apps/article/views/article/index/index.vue @@ -0,0 +1,147 @@ + + + + + diff --git a/frontend/admin/src/apps/article/views/article/recycle/index.vue b/frontend/admin/src/apps/article/views/article/recycle/index.vue new file mode 100644 index 0000000..68ba3c5 --- /dev/null +++ b/frontend/admin/src/apps/article/views/article/recycle/index.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/frontend/admin/src/apps/article/views/article/recycle/schemas/index.tsx b/frontend/admin/src/apps/article/views/article/recycle/schemas/index.tsx new file mode 100644 index 0000000..9d6c771 --- /dev/null +++ b/frontend/admin/src/apps/article/views/article/recycle/schemas/index.tsx @@ -0,0 +1,65 @@ +import { CrudSchema } from '@/components/crud' +import { $t } from '@/locales' +import pluginApi from '../../../../api/index' + +export const crudSchema = (): CrudSchema => { + return { + api: async (params: any) => { + const response = await pluginApi.recycleList(params) + const rows = Array.isArray(response) ? response : [] + return { + recordCount: rows.length, + totalPage: 1, + rows, + } + }, + useCrud: false, + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'LIKE_title', + label: $t('article.modules.recycle.search.keywords'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('article.modules.recycle.search.keywords_placeholder'), + }, + colSpan: 6, + }, + ], + }, + columns: [ + { + type: 'index', + label: $t('article.common.columns.index'), + width: 70, + }, + { + prop: 'title', + label: $t('article.modules.recycle.columns.title'), + minWidth: 220, + }, + { + prop: 'category', + label: $t('article.modules.recycle.columns.category'), + minWidth: 160, + }, + { + prop: 'deleted_by', + label: $t('article.modules.recycle.columns.deleted_by'), + width: 140, + }, + { + prop: 'deleted_at', + label: $t('article.modules.recycle.columns.deleted_at'), + minWidth: 180, + }, + { + prop: 'expire_at', + label: $t('article.modules.recycle.columns.expire_at'), + minWidth: 180, + }, + ], + } +} diff --git a/frontend/admin/src/apps/article/views/article/tag/index.vue b/frontend/admin/src/apps/article/views/article/tag/index.vue new file mode 100644 index 0000000..c763b60 --- /dev/null +++ b/frontend/admin/src/apps/article/views/article/tag/index.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/frontend/admin/src/apps/article/views/article/tag/schemas/index.tsx b/frontend/admin/src/apps/article/views/article/tag/schemas/index.tsx new file mode 100644 index 0000000..3031030 --- /dev/null +++ b/frontend/admin/src/apps/article/views/article/tag/schemas/index.tsx @@ -0,0 +1,169 @@ +import { CrudSchema } from '@/components/crud' +import { DictEnum } from '@/enums' +import { $t } from '@/locales' +import { ArticleTagService } from '../../../../api/index' + +export const crudSchema = (): CrudSchema => { + return { + api: ArticleTagService.list, + dialogTitle: $t('article.modules.tag.title'), + crudApi: { + add: ArticleTagService.create, + edit: ArticleTagService.update, + remove: ArticleTagService.delete, + view: ArticleTagService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'article:tag:create', + editAuth: 'article:tag:update', + removeAuth: 'article:tag:delete', + viewAuth: 'article:tag:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'LIKE_name', + label: $t('article.modules.tag.search.keywords'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('article.modules.tag.search.keywords_placeholder'), + }, + colSpan: 6, + }, + ], + }, + columns: [ + { + type: 'selection', + }, + { + type: 'index', + label: $t('article.common.columns.index'), + width: 70, + }, + { + prop: 'name', + label: $t('article.modules.tag.columns.name'), + minWidth: 220, + }, + { + prop: 'slug', + label: $t('article.modules.tag.columns.slug'), + minWidth: 180, + }, + { + prop: 'article_count', + label: $t('article.modules.tag.columns.article_count'), + width: 120, + }, + { + prop: 'enabled', + label: $t('article.modules.tag.columns.enabled'), + width: 120, + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_ENABLED_STATUS, + }, + }, + { + prop: 'heat', + label: $t('article.modules.tag.columns.heat'), + width: 120, + }, + { + prop: 'updated_date', + label: $t('article.modules.tag.columns.updated_at'), + minWidth: 180, + }, + ], + dialogProps: { + width: '600px', + }, + formSchema: { + showDefaultActions: false, + labelWidth: '100px', + schema: [ + { + component: 'Input', + show: false, + ifDetail: true, + colSpan: 24, + prop: 'id', + label: 'ID', + }, + { + component: 'Input', + prop: 'name', + label: $t('article.modules.tag.columns.name'), + componentProps: { + placeholder: $t('article.modules.tag.form.name_placeholder'), + maxlength: 100, + }, + rules: [{ required: true, message: $t('article.modules.tag.form.name_placeholder') }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'slug', + label: $t('article.modules.tag.columns.slug'), + componentProps: { + placeholder: $t('article.modules.tag.form.slug_placeholder'), + maxlength: 100, + }, + colSpan: 12, + }, + { + component: 'InputNumber', + prop: 'sort', + label: $t('article.modules.tag.columns.heat'), + defaultValue: 100, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'InputNumber', + prop: 'heat', + label: $t('article.modules.tag.columns.heat'), + defaultValue: 0, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'ApiDict', + prop: 'enabled', + label: $t('article.modules.tag.columns.enabled'), + defaultValue: 1, + componentProps: { + code: DictEnum.SYS_ENABLED_STATUS, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 24, + }, + { + component: 'Input', + prop: 'description', + label: $t('article.modules.tag.form.description'), + componentProps: { + type: 'textarea', + rows: 4, + placeholder: $t('article.modules.tag.form.description_placeholder'), + }, + colSpan: 24, + }, + ], + }, + } +} diff --git a/frontend/admin/src/apps/article/views/index/index.vue b/frontend/admin/src/apps/article/views/index/index.vue new file mode 100644 index 0000000..1d702c1 --- /dev/null +++ b/frontend/admin/src/apps/article/views/index/index.vue @@ -0,0 +1,147 @@ + + + + + diff --git a/frontend/admin/src/apps/produce/.gitkeep b/frontend/admin/src/apps/produce/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/frontend/admin/src/apps/produce/api/index.ts b/frontend/admin/src/apps/produce/api/index.ts new file mode 100644 index 0000000..a182241 --- /dev/null +++ b/frontend/admin/src/apps/produce/api/index.ts @@ -0,0 +1,519 @@ +import request from "@/utils/http"; + +/** + * produce 插件 API + */ +import BaseService from "@/api/core/base"; + +export interface ProduceProcessRow { + id?: string | number; + process_code: string; + process_name: string; + description?: string; + step_count?: number; + sort?: number; + status?: number; + created_date?: string; + updated_date?: string; +} + +export interface ProduceProcessStepRow { + id?: string | number; + process_id: string | number; + step_code: string; + step_name: string; + description?: string; + sort?: number; + status?: number; + prerequisite_steps?: Array | string | null; + prerequisite_mode?: "all" | "any" | "none"; + prerequisite_require_final?: number; + allow_repeat_scan?: number; + repeat_scan_statuses?: Array | string | null; + process?: { + id?: string | number; + process_name?: string; + }; + created_date?: string; + updated_date?: string; +} + +export interface ProduceStepStatusRow { + id?: string | number; + step_id: string | number; + status_code: string; + status_name: string; + is_initial?: number; + is_final?: number; + description?: string; + sort?: number; + status?: number; + step?: { + id?: string | number; + step_name?: string; + }; + created_date?: string; + updated_date?: string; +} + +export interface ProduceStepRelationRow { + id?: string | number; + from_step_id: string | number; + to_step_id: string | number; + relation_type: "normal" | "exception"; + flow_condition?: string | Record | null; + priority?: number; + description?: string; + sort?: number; + status?: number; + from_step?: { + id?: string | number; + step_name?: string; + }; + to_step?: { + id?: string | number; + step_name?: string; + }; + created_date?: string; + updated_date?: string; +} + +export interface ProduceStatusTransitionRow { + id?: string | number; + step_id: string | number; + from_status_id: string | number; + to_status_id: string | number; + trigger_event: string; + event_config?: string | Record | null; + auto_trigger?: number; + priority?: number; + transition_type?: "primary" | "side_effect"; + side_effect_type?: string; + side_effect_config?: string | Record | null; + description?: string; + sort?: number; + status?: number; + step?: { + id?: string | number; + step_name?: string; + }; + from_status?: { + id?: string | number; + status_name?: string; + }; + to_status?: { + id?: string | number; + status_name?: string; + }; + created_date?: string; + updated_date?: string; +} + +export interface ProduceMaterialCategoryRow { + id?: string | number; + category_name: string; + created_date?: string; + updated_date?: string; +} + +export interface ProduceMaterialRow { + id?: string | number; + category_id: string | number; + category_name?: string; + product_code: string; + product_name: string; + created_date?: string; + updated_date?: string; +} + +export interface ProduceHardwareFaultDescriptionRow { + id?: string | number; + // ... other properties +} + +export const ProduceMaterialCategoryService = { + ...BaseService({ + baseUrl: "/produce/material-category", + }), +}; + +export const ProduceMaterialService = { + ...BaseService({ baseUrl: "/produce/material" }), + categoryOptions(params: Record = {}) { + return request.get({ + url: "/produce/material-category", + params: { format: "select", ...params }, + }); + }, + importExcel(data: FormData) { + return request.post<{ created: number; updated: number }>({ + url: "/produce/material/import", + data, + headers: { "Content-Type": "multipart/form-data" }, + }); + }, +}; + +export const ProduceProcessService = { + ...BaseService({ baseUrl: "/produce/process" }), +}; + +export const ProduceProcessStepService = { + ...BaseService({ baseUrl: "/produce/process-step" }), +}; + +export const ProduceStepStatusService = { + ...BaseService({ baseUrl: "/produce/step-status" }), +}; + +export const ProduceStepRelationService = { + ...BaseService({ baseUrl: "/produce/step-relation" }), +}; + +export const ProduceStatusTransitionService = { + ...BaseService({ + baseUrl: "/produce/status-transition", + }), +}; + +export interface ProduceTransitionLogRow { + id?: string | number; + work_order_id?: string | number | null; + work_order_no?: string; + step_id: string | number; + transition_id?: string | number | null; + from_status_id: string | number; + to_status_id: string | number; + trigger_event: string; + trigger_data?: Record | string | null; + trigger_user?: string; + trigger_ip?: string; + is_auto?: number; + is_success?: number; + error_message?: string | null; + duration?: number; + remark?: string | null; + created_by?: string | number | null; + created_name?: string; + created_date?: string; + step?: { + id?: string | number; + step_name?: string; + }; + transition?: { + id?: string | number; + trigger_event?: string; + }; + from_status?: { + id?: string | number; + status_name?: string; + }; + to_status?: { + id?: string | number; + status_name?: string; + }; +} + +export const ProduceTransitionLogService = { + ...BaseService({ + baseUrl: "/produce/transition-log", + allowedMethods: ["list", "get", "export"], + }), +}; + +export interface ProduceSpecificRuleRow { + id?: string | number; + rule_name: string; + rule_pattern: string; + rule_type: number; + apply_mode?: "order" | "machine" | "both"; + match_field?: "order_no" | "process_order_no" | "product_code" | "user_code"; + is_enabled?: number; + step_ids?: Array | string | null; + sort?: number; + remark?: string; + created_name?: string; + created_date?: string; +} + +export interface ProduceProductRecordRow { + id?: string | number; + process_order_no: string; + product_code: string; + quantity: number; + process_id?: string | number | null; + step_id?: string | number | null; + status_id?: string | number | null; + user_code?: string; + operator?: string; + operator_id?: string | number | null; + scan_result?: number; + remark?: string | null; + process?: { + id?: string | number; + process_name?: string; + }; + step?: { + id?: string | number; + step_name?: string; + }; + status?: { + id?: string | number; + status_name?: string; + }; + created_name?: string; + created_date?: string; +} + +export interface ProduceScanDataRow { + id?: string | number; + order_no: string; + quantity?: number; + user_code: string; + operator?: string; + operator_id?: string | number | null; + process_id: string | number; + step_id: string | number; + status_id?: string | number | null; + scan_result: number; + scan_time?: number; + scan_date?: string; + remark?: string | null; + process?: { + id?: string | number; + process_name?: string; + }; + step?: { + id?: string | number; + step_name?: string; + }; + status?: { + id?: string | number; + status_name?: string; + }; + created_name?: string; + created_date?: string; +} + +export const ProduceSpecificRuleService = { + ...BaseService({ baseUrl: "/produce/specific-rule" }), +}; + +export const ProduceProductRecordService = { + ...BaseService({ + baseUrl: "/produce/product-record", + }), +}; + +export const ProduceScanDataService = { + ...BaseService({ baseUrl: "/produce/scan-data" }), +}; + +export interface ProduceExceptionSettingRow { + id?: string | number; + parent_id?: string | number | null; + parent_name?: string; + setting_type: "type" | "reason" | "issue"; + code: string; + name: string; + sort?: number; + is_enabled?: number; + remark?: string | null; + created_name?: string; + created_date?: string; +} + +export interface ProduceExceptionRecordRow { + id?: string | number; + order_no: string; + user_code?: string | null; + reporter?: string | null; + type_id?: string | number | null; + type_code: string; + type_name: string; + reason_id?: string | number | null; + reason_code: string; + reason_name: string; + issue_id?: string | number | null; + issue_code?: string | null; + issue_name?: string | null; + images?: string[] | null; + remark?: string | null; + status?: number; + status_name?: string; + handler?: string | null; + handler_id?: string | number | null; + handled_at?: number | null; + handled_date?: string | null; + reported_at?: number | null; + reported_date?: string | null; + created_name?: string; + created_date?: string; +} + +export const ProduceExceptionSettingService = { + ...BaseService({ + baseUrl: "/produce/exception-setting", + }), +}; + +export interface ProduceRepairSettingRow { + id?: string | number; + parent_id?: string | number | null; + parent_name?: string; + setting_type: "type" | "reason" | "issue"; + code: string; + name: string; + sort?: number; + is_enabled?: number; + remark?: string | null; + created_name?: string; + created_date?: string; +} + +export interface ProduceHardwareFaultDescriptionRow { + id?: string | number; + category_id: string | number; + category_name?: string; + description: string; + use_count?: number; + is_enabled?: number; + remark?: string | null; + created_date?: string; +} + +export interface ProduceRepairRecordRow { + id?: string | number; + repair_no: string; + exception_id?: string | number | null; + exception_reason?: string | null; + exception_issue?: string | null; + exception_type_name?: string | null; + order_no?: string | null; + product_code?: string | null; + product_name?: string | null; + category_id?: string | number | null; + category_name?: string | null; + fault_description_id?: string | number | null; + fault_description_ids?: Array; + fault_description?: string | null; + fault_descriptions?: string[]; + repair_result?: string | null; + parts?: Array> | string | null; + responsible_operators?: Array> | string | null; + operator?: string | null; + repaired_at?: number | null; + repaired_date?: string | null; + remark?: string | null; + created_date?: string; +} + +export const ProduceRepairSettingService = { + ...BaseService({ + baseUrl: "/produce/repair-setting", + }), +}; + +export const ProduceHardwareFaultDescriptionService = { + ...BaseService({ + baseUrl: "/produce/hardware-fault-description", + }), + categoryOptions(params: Record = {}) { + return request.get({ + url: "/produce/material-category", + params: { format: "select", ...params }, + }); + }, + importExcel(data: FormData) { + return request.post<{ created: number; updated: number }>({ + url: "/produce/hardware-fault-description/import", + data, + headers: { "Content-Type": "multipart/form-data" }, + }); + }, +}; + +export const ProduceRepairRecordService = { + ...BaseService({ baseUrl: "/produce/repair-record" }), + categoryOptions(params: Record = {}) { + return request.get({ + url: "/produce/material-category", + params: { format: "select", ...params }, + }); + }, + faultDescriptionOptions(params: Record = {}) { + return ProduceHardwareFaultDescriptionService.list({ + limit: 999, + is_enabled: 1, + ...params, + }); + }, +}; + +export const ProduceExceptionRecordService = { + ...BaseService({ + baseUrl: "/produce/exception-record", + }), +}; + +export const ProduceConfigApi = { + info(params: Record) { + return request.get({ url: "/produce/config/info", params }); + }, + save(data: Record) { + return request.post({ url: "/produce/config/save", data }); + }, +}; + +export default { + materialCategoryList(params = {}) { + return ProduceMaterialCategoryService.list(params as Record); + }, + materialList(params = {}) { + return ProduceMaterialService.list(params as Record); + }, + processList(params = {}) { + return ProduceProcessService.list(params as Record); + }, + processStepList(params = {}) { + return ProduceProcessStepService.list(params as Record); + }, + stepStatusList(params = {}) { + return ProduceStepStatusService.list(params as Record); + }, + stepRelationList(params = {}) { + return ProduceStepRelationService.list(params as Record); + }, + statusTransitionList(params = {}) { + return ProduceStatusTransitionService.list(params as Record); + }, + transitionLogList(params = {}) { + return ProduceTransitionLogService.list(params as Record); + }, + specificRuleList(params = {}) { + return ProduceSpecificRuleService.list(params as Record); + }, + productRecordList(params = {}) { + return ProduceProductRecordService.list(params as Record); + }, + scanDataList(params = {}) { + return ProduceScanDataService.list(params as Record); + }, + exceptionRecordList(params = {}) { + return ProduceExceptionRecordService.list(params as Record); + }, + exceptionSettingList(params = {}) { + return ProduceExceptionSettingService.list(params as Record); + }, + repairSettingList(params = {}) { + return ProduceRepairSettingService.list(params as Record); + }, + hardwareFaultDescriptionList(params = {}) { + return ProduceHardwareFaultDescriptionService.list( + params as Record, + ); + }, + repairRecordList(params = {}) { + return ProduceRepairRecordService.list(params as Record); + }, +}; diff --git a/frontend/admin/src/apps/produce/api/statistics.ts b/frontend/admin/src/apps/produce/api/statistics.ts new file mode 100644 index 0000000..fd84d75 --- /dev/null +++ b/frontend/admin/src/apps/produce/api/statistics.ts @@ -0,0 +1,50 @@ +import request from '@/utils/http' + +export interface WorkStatisticsQuery { + month?: string + date?: string + data_type?: string + process_id?: string | number + step_id?: string | number + scan_result?: string | number + user_code?: string + operator?: string + process_name?: string + step_name?: string +} + +export interface WorkStatisticsColumn { + key: string + label: string +} + +export interface WorkStatisticsOption { + label: string + value: string | number +} + +export interface WorkStatisticsResponse { + columns: WorkStatisticsColumn[] + items: Array> +} + +export const ProduceWorkStatisticsService = { + monthly(params: WorkStatisticsQuery = {}) { + return request.get({ url: '/produce/statistics/monthly', params }) + }, + daily(params: WorkStatisticsQuery = {}) { + return request.get({ url: '/produce/statistics/daily', params }) + }, + getProcessOptions() { + return request.get({ + url: '/produce/process', + params: { format: 'select' } + }) + }, + getStepOptions(processId?: string | number) { + return request.get({ + url: '/produce/process-step', + params: { format: 'select', process_id: processId || undefined } + }) + } +} diff --git a/frontend/admin/src/apps/produce/lang/en/en.json b/frontend/admin/src/apps/produce/lang/en/en.json new file mode 100644 index 0000000..c3442b5 --- /dev/null +++ b/frontend/admin/src/apps/produce/lang/en/en.json @@ -0,0 +1,217 @@ +{ + "produce": { + "common": { + "columns": { + "index": "No." + } + }, + "modules": { + "process": { + "title": "Process Management", + "search": { + "process_code": "Process Code", + "process_code_placeholder": "Please enter process code", + "process_name": "Process Name", + "process_name_placeholder": "Please enter process name", + "status": "Status", + "status_placeholder": "Please select status" + }, + "form": { + "process_code_placeholder": "Please enter process code", + "process_name_placeholder": "Please enter process name", + "description": "Process Description", + "description_placeholder": "Please enter process description" + }, + "columns": { + "process_code": "Process Code", + "process_name": "Process Name", + "step_count": "Step Count", + "sort": "Sort", + "status": "Status", + "created_at": "Created At" + } + }, + "process_step": { + "title": "Process Steps", + "search": { + "process_id": "Process", + "process_id_placeholder": "Please select process", + "step_code": "Step Code", + "step_code_placeholder": "Please enter step code", + "step_name": "Step Name", + "step_name_placeholder": "Please enter step name", + "status": "Status", + "status_placeholder": "Please select status" + }, + "form": { + "process_id": "Process", + "process_id_placeholder": "Please select process", + "step_code_placeholder": "Please enter step code", + "step_name_placeholder": "Please enter step name", + "description": "Step Description", + "description_placeholder": "Please enter step description" + }, + "columns": { + "process_name": "Process", + "step_code": "Step Code", + "step_name": "Step Name", + "sort": "Sort", + "status": "Status", + "created_at": "Created At" + } + }, + "step_status": { + "title": "Step Status", + "search": { + "step_id": "Step", + "step_id_placeholder": "Please select step", + "status_code": "Status Code", + "status_code_placeholder": "Please enter status code", + "status_name": "Status Name", + "status_name_placeholder": "Please enter status name", + "status": "Status", + "status_placeholder": "Please select status" + }, + "form": { + "step_id": "Step", + "step_id_placeholder": "Please select step", + "status_code_placeholder": "Please enter status code", + "status_name_placeholder": "Please enter status name", + "description": "Status Description", + "description_placeholder": "Please enter status description" + }, + "columns": { + "step_name": "Step", + "status_code": "Status Code", + "status_name": "Status Name", + "is_initial": "Initial", + "is_final": "Final", + "sort": "Sort", + "status": "Status", + "created_at": "Created At" + } + }, + "step_relation": { + "title": "Step Relation", + "search": { + "from_step_id": "From Step", + "from_step_id_placeholder": "Please select from step", + "to_step_id": "To Step", + "to_step_id_placeholder": "Please select to step", + "relation_type": "Relation Type", + "relation_type_placeholder": "Please select relation type", + "status": "Status", + "status_placeholder": "Please select status" + }, + "form": { + "from_step_id": "From Step", + "from_step_id_placeholder": "Please select from step", + "to_step_id": "To Step", + "to_step_id_placeholder": "Please select to step", + "flow_condition": "Flow Condition", + "flow_condition_placeholder": "Please enter JSON flow condition", + "description": "Relation Description", + "description_placeholder": "Please enter relation description" + }, + "columns": { + "from_step_name": "From Step", + "to_step_name": "To Step", + "relation_type": "Relation Type", + "priority": "Priority", + "flow_condition": "Flow Condition", + "sort": "Sort", + "status": "Status", + "created_at": "Created At" + } + }, + "status_transition": { + "title": "Status Transition", + "search": { + "step_id": "Step", + "step_id_placeholder": "Please select step", + "trigger_event": "Trigger Event", + "trigger_event_placeholder": "Please select trigger event", + "status": "Status", + "status_placeholder": "Please select status" + }, + "form": { + "step_id": "Step", + "step_id_placeholder": "Please select step", + "from_status_id": "From Status", + "from_status_id_placeholder": "Please select from status", + "to_status_id": "To Status", + "to_status_id_placeholder": "Please select to status", + "trigger_event_placeholder": "Please select trigger event", + "side_effect_type": "Side Effect Type", + "side_effect_type_placeholder": "Please select side effect type", + "event_config": "Event Config", + "event_config_placeholder": "Please enter JSON event config", + "side_effect_config": "Side Effect Config", + "side_effect_config_placeholder": "Please enter JSON side effect config", + "description": "Transition Description", + "description_placeholder": "Please enter transition description" + }, + "columns": { + "step_name": "Step", + "from_status_name": "From Status", + "to_status_name": "To Status", + "trigger_event": "Trigger Event", + "transition_type": "Transition Type", + "auto_trigger": "Auto Trigger", + "priority": "Priority", + "sort": "Sort", + "status": "Status", + "created_at": "Created At" + } + }, + "transition_log": { + "title": "Transition Log", + "search": { + "work_order_no": "Work Order No.", + "work_order_no_placeholder": "Please enter work order no", + "step_id": "Step", + "step_id_placeholder": "Please select step", + "trigger_event": "Trigger Event", + "trigger_event_placeholder": "Please select trigger event", + "trigger_user": "Trigger User", + "trigger_user_placeholder": "Please enter trigger user", + "is_success": "Result", + "is_success_placeholder": "Please select result" + }, + "columns": { + "work_order_no": "Work Order No", + "step_name": "Step", + "from_status_name": "From Status", + "to_status_name": "To Status", + "transition_event": "Transition Rule", + "trigger_event": "Trigger Event", + "trigger_user": "Trigger User", + "trigger_ip": "Trigger IP", + "is_auto": "Auto Trigger", + "is_success": "Result", + "duration": "Duration(ms)", + "trigger_data": "Trigger Data", + "error_message": "Error Message", + "remark": "Remark", + "created_name": "Created By", + "created_at": "Created At" + } + }, + "config": { + "title": "Production Config" + }, + "scan_data": { + "title": "Scan Data" + }, + "exception_data": { + "title": "Exception Records" + }, + "exception_setting": { + "title": "Exception Settings" + }, + "exception_analysis": { + "title": "Exception Analysis" + } + } + } +} diff --git a/frontend/admin/src/apps/produce/lang/zh-cn/zh.json b/frontend/admin/src/apps/produce/lang/zh-cn/zh.json new file mode 100644 index 0000000..b3cf285 --- /dev/null +++ b/frontend/admin/src/apps/produce/lang/zh-cn/zh.json @@ -0,0 +1,217 @@ +{ + "produce": { + "common": { + "columns": { + "index": "序号" + } + }, + "modules": { + "process": { + "title": "工序管理", + "search": { + "process_code": "工序编码", + "process_code_placeholder": "请输入工序编码", + "process_name": "工序名称", + "process_name_placeholder": "请输入工序名称", + "status": "状态", + "status_placeholder": "请选择状态" + }, + "form": { + "process_code_placeholder": "请输入工序编码", + "process_name_placeholder": "请输入工序名称", + "description": "工序描述", + "description_placeholder": "请输入工序描述" + }, + "columns": { + "process_code": "工序编码", + "process_name": "工序名称", + "step_count": "步骤数", + "sort": "排序", + "status": "状态", + "created_at": "创建时间" + } + }, + "process_step": { + "title": "工序步骤", + "search": { + "process_id": "所属工序", + "process_id_placeholder": "请选择所属工序", + "step_code": "步骤编码", + "step_code_placeholder": "请输入步骤编码", + "step_name": "步骤名称", + "step_name_placeholder": "请输入步骤名称", + "status": "状态", + "status_placeholder": "请选择状态" + }, + "form": { + "process_id": "所属工序", + "process_id_placeholder": "请选择所属工序", + "step_code_placeholder": "请输入步骤编码", + "step_name_placeholder": "请输入步骤名称", + "description": "步骤描述", + "description_placeholder": "请输入步骤描述" + }, + "columns": { + "process_name": "所属工序", + "step_code": "步骤编码", + "step_name": "步骤名称", + "sort": "排序", + "status": "状态", + "created_at": "创建时间" + } + }, + "step_status": { + "title": "步骤状态", + "search": { + "step_id": "所属步骤", + "step_id_placeholder": "请选择所属步骤", + "status_code": "状态编码", + "status_code_placeholder": "请输入状态编码", + "status_name": "状态名称", + "status_name_placeholder": "请输入状态名称", + "status": "状态", + "status_placeholder": "请选择状态" + }, + "form": { + "step_id": "所属步骤", + "step_id_placeholder": "请选择所属步骤", + "status_code_placeholder": "请输入状态编码", + "status_name_placeholder": "请输入状态名称", + "description": "状态描述", + "description_placeholder": "请输入状态描述" + }, + "columns": { + "step_name": "所属步骤", + "status_code": "状态编码", + "status_name": "状态名称", + "is_initial": "初始状态", + "is_final": "终态", + "sort": "排序", + "status": "状态", + "created_at": "创建时间" + } + }, + "step_relation": { + "title": "步骤关系", + "search": { + "from_step_id": "源步骤", + "from_step_id_placeholder": "请选择源步骤", + "to_step_id": "目标步骤", + "to_step_id_placeholder": "请选择目标步骤", + "relation_type": "关系类型", + "relation_type_placeholder": "请选择关系类型", + "status": "状态", + "status_placeholder": "请选择状态" + }, + "form": { + "from_step_id": "源步骤", + "from_step_id_placeholder": "请选择源步骤", + "to_step_id": "目标步骤", + "to_step_id_placeholder": "请选择目标步骤", + "flow_condition": "流转条件", + "flow_condition_placeholder": "请输入 JSON 格式流转条件", + "description": "关系描述", + "description_placeholder": "请输入关系描述" + }, + "columns": { + "from_step_name": "源步骤", + "to_step_name": "目标步骤", + "relation_type": "关系类型", + "priority": "优先级", + "flow_condition": "流转条件", + "sort": "排序", + "status": "状态", + "created_at": "创建时间" + } + }, + "status_transition": { + "title": "状态转换", + "search": { + "step_id": "所属步骤", + "step_id_placeholder": "请选择所属步骤", + "trigger_event": "触发事件", + "trigger_event_placeholder": "请选择触发事件", + "status": "状态", + "status_placeholder": "请选择状态" + }, + "form": { + "step_id": "所属步骤", + "step_id_placeholder": "请选择所属步骤", + "from_status_id": "源状态", + "from_status_id_placeholder": "请选择源状态", + "to_status_id": "目标状态", + "to_status_id_placeholder": "请选择目标状态", + "trigger_event_placeholder": "请选择触发事件", + "side_effect_type": "副作用类型", + "side_effect_type_placeholder": "请选择副作用类型", + "event_config": "事件配置", + "event_config_placeholder": "请输入 JSON 格式事件配置", + "side_effect_config": "副作用配置", + "side_effect_config_placeholder": "请输入 JSON 格式副作用配置", + "description": "转换描述", + "description_placeholder": "请输入转换描述" + }, + "columns": { + "step_name": "所属步骤", + "from_status_name": "源状态", + "to_status_name": "目标状态", + "trigger_event": "触发事件", + "transition_type": "转换类型", + "auto_trigger": "自动触发", + "priority": "优先级", + "sort": "排序", + "status": "状态", + "created_at": "创建时间" + } + }, + "transition_log": { + "title": "转换日志", + "search": { + "work_order_no": "工单编号", + "work_order_no_placeholder": "请输入工单编号", + "step_id": "所属步骤", + "step_id_placeholder": "请选择所属步骤", + "trigger_event": "触发事件", + "trigger_event_placeholder": "请选择触发事件", + "trigger_user": "触发用户", + "trigger_user_placeholder": "请输入触发用户", + "is_success": "执行结果", + "is_success_placeholder": "请选择执行结果" + }, + "columns": { + "work_order_no": "工单编号", + "step_name": "所属步骤", + "from_status_name": "源状态", + "to_status_name": "目标状态", + "transition_event": "转换规则", + "trigger_event": "触发事件", + "trigger_user": "触发用户", + "trigger_ip": "触发IP", + "is_auto": "自动触发", + "is_success": "执行结果", + "duration": "耗时(ms)", + "trigger_data": "触发数据", + "error_message": "错误信息", + "remark": "备注", + "created_name": "创建人", + "created_at": "创建时间" + } + }, + "config": { + "title": "生产配置" + }, + "scan_data": { + "title": "扫码数据" + }, + "exception_data": { + "title": "异常数据" + }, + "exception_setting": { + "title": "异常设置" + }, + "exception_analysis": { + "title": "异常数据分析" + } + } + } +} diff --git a/frontend/admin/src/apps/produce/menu/admin.php b/frontend/admin/src/apps/produce/menu/admin.php new file mode 100644 index 0000000..02598e3 --- /dev/null +++ b/frontend/admin/src/apps/produce/menu/admin.php @@ -0,0 +1,134 @@ + '生产管理', + 'code' => 'produce', + 'app' => 'produce', + 'path' => '/produce', + 'icon' => 'plugin', + 'children' => [ + [ + 'name' => '生产配置', + 'code' => 'produce:config:index', + 'app' => 'produce', + 'path' => '/produce/config', + 'component' => '/produce/config/index', + ], + [ + 'name' => '工序管理', + 'code' => 'produce:process:index', + 'app' => 'produce', + 'path' => '/produce/process', + 'component' => '/produce/process/index', + ], + [ + 'name' => '工序步骤', + 'code' => 'produce:process-step:index', + 'app' => 'produce', + 'path' => '/produce/process-step', + 'component' => '/produce/process-step/index', + ], + [ + 'name' => '步骤状态', + 'code' => 'produce:step-status:index', + 'app' => 'produce', + 'path' => '/produce/step-status', + 'component' => '/produce/step-status/index', + ], + [ + 'name' => '步骤关系', + 'code' => 'produce:step-relation:index', + 'app' => 'produce', + 'path' => '/produce/step-relation', + 'component' => '/produce/step-relation/index', + ], + [ + 'name' => '状态转换', + 'code' => 'produce:status-transition:index', + 'app' => 'produce', + 'path' => '/produce/status-transition', + 'component' => '/produce/status-transition/index', + ], + [ + 'name' => '整机数据', + 'code' => 'produce:product-record:index', + 'app' => 'produce', + 'path' => '/produce/product-record', + 'component' => '/produce/product-record/index', + ], + [ + 'name' => '扫码数据', + 'code' => 'produce:scan-data:index', + 'app' => 'produce', + 'path' => '/produce/scan-data', + 'component' => '/produce/scan-data/index', + ], + [ + 'name' => '转换日志', + 'code' => 'produce:transition-log:index', + 'app' => 'produce', + 'path' => '/produce/transition-log', + 'component' => '/produce/transition-log/index', + ], + [ + 'name' => '异常管理', + 'code' => 'produce:exception:index', + 'app' => 'produce', + 'path' => '/produce/exception', + 'icon' => 'warning', + 'children' => [ + [ + 'name' => '异常数据', + 'code' => 'produce:exception-data:list', + 'app' => 'produce', + 'path' => '/produce/exception-data', + 'component' => '/produce/exception/data/index', + ], + [ + 'name' => '异常设置', + 'code' => 'produce:exception-setting:list', + 'app' => 'produce', + 'path' => '/produce/exception-setting', + 'component' => '/produce/exception/setting/index', + ], + [ + 'name' => '数据分析', + 'code' => 'produce:exception-analysis:read', + 'app' => 'produce', + 'path' => '/produce/exception-analysis', + 'component' => '/produce/exception/analysis/index', + ], + ], + ], + [ + 'name' => '数据统计', + 'code' => 'produce:statistics:index', + 'app' => 'produce', + 'path' => '/produce/statistics', + 'icon' => 'bar-chart-2', + 'children' => [ + [ + 'name' => '月工作统计', + 'code' => 'produce:statistics:monthly', + 'app' => 'produce', + 'path' => '/produce/statistics/monthly', + 'component' => '/produce/statistics/monthly/index', + ], + [ + 'name' => '日工作统计', + 'code' => 'produce:statistics:daily', + 'app' => 'produce', + 'path' => '/produce/statistics/daily', + 'component' => '/produce/statistics/daily/index', + ], + ], + ], + ], + ], +]; diff --git a/frontend/admin/src/apps/produce/routes/index.ts b/frontend/admin/src/apps/produce/routes/index.ts new file mode 100644 index 0000000..135eafe --- /dev/null +++ b/frontend/admin/src/apps/produce/routes/index.ts @@ -0,0 +1,215 @@ +import { AppRouteRecord } from "@/types/router"; +import { RoutesAlias } from "@/router/routesAlias"; + +export default { + path: "/produce", + name: "Produce", + component: RoutesAlias.Layout, + meta: { + title: "生产管理", + icon: "ri:plugin-line", + module: "produce", + }, + children: [ + { + path: "material-category", + name: "ProduceMaterialCategory", + component: "/produce/material-category/index", + meta: { + title: "物料分类", + icon: "ri:folder-2-line", + keepAlive: false, + module: "produce", + }, + }, + { + path: "material", + name: "ProduceMaterial", + component: "/produce/material/index", + meta: { + title: "物料库", + icon: "ri:archive-2-line", + keepAlive: false, + module: "produce", + }, + }, + { + path: "config", + name: "ProduceConfig", + component: "/produce/config/index", + meta: { + title: "生产配置", + icon: "ri:settings-3-line", + keepAlive: false, + module: "produce", + }, + }, + { + path: "process", + name: "ProduceProcess", + component: "/produce/process/index", + meta: { + title: "工序管理", + icon: "ri:stack-line", + keepAlive: false, + module: "produce", + }, + }, + { + path: "process-step", + name: "ProduceProcessStep", + component: "/produce/process-step/index", + meta: { + title: "工序步骤", + icon: "ri:list-check-3", + keepAlive: false, + module: "produce", + }, + }, + { + path: "step-status", + name: "ProduceStepStatus", + component: "/produce/step-status/index", + meta: { + title: "步骤状态", + icon: "ri:flag-2-line", + keepAlive: false, + module: "produce", + }, + }, + { + path: "step-relation", + name: "ProduceStepRelation", + component: "/produce/step-relation/index", + meta: { + title: "步骤关系", + icon: "ri:git-branch-line", + keepAlive: false, + module: "produce", + }, + }, + { + path: "status-transition", + name: "ProduceStatusTransition", + component: "/produce/status-transition/index", + meta: { + title: "状态转换", + icon: "ri:share-forward-line", + keepAlive: false, + module: "produce", + }, + }, + { + path: "product-record", + name: "ProduceProductRecord", + component: "/produce/product-record/index", + meta: { + title: "整机数据", + icon: "ri-product-hunt-line", + keepAlive: false, + module: "produce", + }, + }, + { + path: "scan-data", + name: "ProduceScanData", + component: "/produce/scan-data/index", + meta: { + title: "扫码数据", + icon: "ri:qr-scan-2-line", + keepAlive: false, + module: "produce", + }, + }, + { + path: "transition-log", + name: "ProduceTransitionLog", + component: "/produce/transition-log/index", + meta: { + title: "转换日志", + icon: "ri:file-list-3-line", + keepAlive: false, + module: "produce", + }, + }, + { + path: "repair", + name: "ProduceRepair", + meta: { + title: "维修管理", + icon: "ri:tools-line", + keepAlive: false, + module: "produce", + }, + children: [ + { + path: "repair-data", + name: "ProduceRepairData", + component: "/produce/repair/repair-data/index", + meta: { + title: "维修数据", + icon: "ri:file-list-3-line", + keepAlive: false, + module: "produce", + }, + }, + { + path: "repair-setting", + name: "ProduceRepairSetting", + component: "/produce/repair/repair-setting/index", + meta: { + title: "维修设置", + icon: "ri:settings-3-line", + keepAlive: false, + module: "produce", + }, + }, + { + path: "hardware-fault-description", + name: "ProduceHardwareFaultDescription", + component: "/produce/repair/hardware-fault-description/index", + meta: { + title: "硬件故障描述", + icon: "ri:tools-line", + keepAlive: false, + module: "produce", + }, + }, + ], + }, + { + path: "statistics", + name: "ProduceStatistics", + meta: { + title: "数据统计", + icon: "ri:bar-chart-2-line", + keepAlive: false, + module: "produce", + }, + children: [ + { + path: "monthly", + name: "ProduceMonthlyWorkStatistics", + component: "/produce/statistics/monthly/index", + meta: { + title: "月工作统计", + icon: "ri:calendar-2-line", + keepAlive: false, + module: "produce", + }, + }, + { + path: "daily", + name: "ProduceDailyWorkStatistics", + component: "/produce/statistics/daily/index", + meta: { + title: "日工作统计", + icon: "ri:time-line", + keepAlive: false, + module: "produce", + }, + }, + ], + }, + ], +} as AppRouteRecord; diff --git a/frontend/admin/src/apps/produce/views/produce/config/index.vue b/frontend/admin/src/apps/produce/views/produce/config/index.vue new file mode 100644 index 0000000..648d1cb --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/config/index.vue @@ -0,0 +1,52 @@ + + + diff --git a/frontend/admin/src/apps/produce/views/produce/config/modules/basic-setting.vue b/frontend/admin/src/apps/produce/views/produce/config/modules/basic-setting.vue new file mode 100644 index 0000000..ea96816 --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/config/modules/basic-setting.vue @@ -0,0 +1,175 @@ + + + + + diff --git a/frontend/admin/src/apps/produce/views/produce/config/modules/erp-integration.vue b/frontend/admin/src/apps/produce/views/produce/config/modules/erp-integration.vue new file mode 100644 index 0000000..28aa92f --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/config/modules/erp-integration.vue @@ -0,0 +1,207 @@ + + + + + diff --git a/frontend/admin/src/apps/produce/views/produce/config/modules/specific-rule.vue b/frontend/admin/src/apps/produce/views/produce/config/modules/specific-rule.vue new file mode 100644 index 0000000..34b58e6 --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/config/modules/specific-rule.vue @@ -0,0 +1,324 @@ + + + + + diff --git a/frontend/admin/src/apps/produce/views/produce/config/modules/step-rule.vue b/frontend/admin/src/apps/produce/views/produce/config/modules/step-rule.vue new file mode 100644 index 0000000..eb9d66d --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/config/modules/step-rule.vue @@ -0,0 +1,237 @@ + + + + + diff --git a/frontend/admin/src/apps/produce/views/produce/exception-analysis/index.vue b/frontend/admin/src/apps/produce/views/produce/exception-analysis/index.vue new file mode 100644 index 0000000..08326fd --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/exception-analysis/index.vue @@ -0,0 +1,228 @@ + + + + + diff --git a/frontend/admin/src/apps/produce/views/produce/exception-data/index.vue b/frontend/admin/src/apps/produce/views/produce/exception-data/index.vue new file mode 100644 index 0000000..12bdc6d --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/exception-data/index.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/frontend/admin/src/apps/produce/views/produce/exception-data/schemas/index.tsx b/frontend/admin/src/apps/produce/views/produce/exception-data/schemas/index.tsx new file mode 100644 index 0000000..17a46fd --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/exception-data/schemas/index.tsx @@ -0,0 +1,187 @@ +import { CrudSchema } from '@/components/crud' +import { ProduceExceptionRecordService } from '@/apps/produce/api' + +const statusOptions = [ + { label: '待处理', value: 0 }, + { label: '处理中', value: 1 }, + { label: '已处理', value: 2 } +] + +export const crudSchema = (): CrudSchema => ({ + api: ProduceExceptionRecordService.list, + dialogTitle: '异常数据', + crudApi: { + add: ProduceExceptionRecordService.create, + edit: ProduceExceptionRecordService.update, + remove: ProduceExceptionRecordService.remove, + view: ProduceExceptionRecordService.get + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'produce:exception-data:create', + editAuth: 'produce:exception-data:update', + removeAuth: 'produce:exception-data:delete', + viewAuth: 'produce:exception-data:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '90px', + schema: [ + { + prop: 'keyword', + label: '关键字', + component: 'Input', + componentProps: { clearable: true, placeholder: '单号、提报人、处理类型、原因或具体问题' }, + colSpan: 8 + }, + { + prop: 'type_code', + label: '处理类型', + component: 'Input', + componentProps: { clearable: true, placeholder: '请输入处理类型编码' }, + colSpan: 8 + }, + { + prop: 'status', + label: '处理状态', + component: 'Select', + componentProps: { clearable: true, placeholder: '请选择处理状态', options: statusOptions }, + colSpan: 8 + }, + { + prop: 'reported_at_range', + label: '提报时间', + component: 'DatePicker', + componentProps: { + type: 'daterange', + clearable: true, + valueFormat: 'YYYY-MM-DD', + startPlaceholder: '开始日期', + endPlaceholder: '结束日期' + }, + colSpan: 12 + } + ] + }, + columns: [ + { type: 'selection' }, + { type: 'index', label: '序号', width: 70 }, + { prop: 'order_no', label: '单号/条码', minWidth: 160 }, + { prop: 'type_name', label: '处理类型', minWidth: 120 }, + { prop: 'reason_name', label: '异常原因', minWidth: 120 }, + { prop: 'issue_name', label: '具体问题', minWidth: 140 }, + { prop: 'reporter', label: '提报人', minWidth: 110 }, + { prop: 'status_name', label: '处理状态', minWidth: 100 }, + { prop: 'handler', label: '处理人', minWidth: 110 }, + { prop: 'reported_date', label: '提报时间', minWidth: 170 }, + { prop: 'handled_date', label: '处理时间', minWidth: 170 } + ], + dialogProps: { width: '820px' }, + formSchema: { + showDefaultActions: false, + labelWidth: '105px', + schema: [ + { component: 'Input', prop: 'id', label: 'ID', show: false, ifDetail: true, colSpan: 24 }, + { + component: 'Input', + prop: 'order_no', + label: '单号/条码', + componentProps: { placeholder: '请输入单号或条码', maxlength: 100 }, + rules: [{ required: true, message: '请输入单号或条码' }], + colSpan: 12 + }, + { + component: 'Input', + prop: 'user_code', + label: '提报人工号', + componentProps: { placeholder: '请输入提报人工号', maxlength: 50 }, + colSpan: 12 + }, + { + component: 'Input', + prop: 'reporter', + label: '提报人', + componentProps: { placeholder: '请输入提报人', maxlength: 100 }, + colSpan: 12 + }, + { + component: 'Input', + prop: 'type_code', + label: '处理类型编码', + componentProps: { placeholder: '例如 defective_repair', maxlength: 64 }, + rules: [{ required: true, message: '请输入处理类型编码' }], + colSpan: 12 + }, + { + component: 'Input', + prop: 'type_name', + label: '处理类型', + componentProps: { placeholder: '例如 不良维修', maxlength: 100 }, + rules: [{ required: true, message: '请输入处理类型' }], + colSpan: 12 + }, + { + component: 'Input', + prop: 'reason_code', + label: '异常原因编码', + componentProps: { placeholder: '例如 test_defect', maxlength: 64 }, + rules: [{ required: true, message: '请输入异常原因编码' }], + colSpan: 12 + }, + { + component: 'Input', + prop: 'reason_name', + label: '异常原因', + componentProps: { placeholder: '例如 测试不良', maxlength: 100 }, + rules: [{ required: true, message: '请输入异常原因' }], + colSpan: 12 + }, + { + component: 'Input', + prop: 'issue_code', + label: '具体问题编码', + componentProps: { placeholder: '可选', maxlength: 64 }, + colSpan: 12 + }, + { + component: 'Input', + prop: 'issue_name', + label: '具体问题', + componentProps: { placeholder: '可选', maxlength: 100 }, + colSpan: 12 + }, + { + component: 'Select', + prop: 'status', + label: '处理状态', + defaultValue: 0, + componentProps: { options: statusOptions }, + colSpan: 12 + }, + { + component: 'Input', + prop: 'handler', + label: '处理人', + componentProps: { placeholder: '请输入处理人', maxlength: 100 }, + colSpan: 12 + }, + { + component: 'Upload', + prop: 'images', + label: '现场图片', + componentProps: { listType: 'picture-card' }, + ifDetail: true, + colSpan: 24 + }, + { + component: 'Input', + prop: 'remark', + label: '补充说明', + componentProps: { type: 'textarea', rows: 3, placeholder: '请输入现场情况或处理说明' }, + colSpan: 24 + } + ] + } +}) diff --git a/frontend/admin/src/apps/produce/views/produce/exception-setting/index.vue b/frontend/admin/src/apps/produce/views/produce/exception-setting/index.vue new file mode 100644 index 0000000..a4a5e48 --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/exception-setting/index.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/frontend/admin/src/apps/produce/views/produce/exception-setting/schemas/index.tsx b/frontend/admin/src/apps/produce/views/produce/exception-setting/schemas/index.tsx new file mode 100644 index 0000000..fac58e4 --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/exception-setting/schemas/index.tsx @@ -0,0 +1,100 @@ +import { CrudSchema } from '@/components/crud' +import { ProduceExceptionSettingService } from '@/apps/produce/api' + +const settingTypeOptions = [ + { label: '处理类型', value: 'type' }, + { label: '异常原因', value: 'reason' }, + { label: '具体问题', value: 'issue' }, +] + +export const crudSchema = (): CrudSchema => ({ + api: ProduceExceptionSettingService.list, + dialogTitle: '异常设置', + crudApi: { + add: ProduceExceptionSettingService.create, + edit: ProduceExceptionSettingService.update, + remove: ProduceExceptionSettingService.remove, + view: ProduceExceptionSettingService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'produce:exception-setting:create', + editAuth: 'produce:exception-setting:update', + removeAuth: 'produce:exception-setting:delete', + viewAuth: 'produce:exception-setting:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '90px', + schema: [ + { + prop: 'keyword', label: '关键字', component: 'Input', + componentProps: { clearable: true, placeholder: '编码、名称或备注' }, colSpan: 8, + }, + { + prop: 'setting_type', label: '设置层级', component: 'Select', + componentProps: { clearable: true, placeholder: '请选择设置层级', options: settingTypeOptions }, colSpan: 8, + }, + { + prop: 'is_enabled', label: '启用状态', component: 'Select', + componentProps: { + clearable: true, placeholder: '请选择启用状态', + options: [{ label: '启用', value: 1 }, { label: '停用', value: 0 }], + }, colSpan: 8, + }, + ], + }, + columns: [ + { type: 'selection' }, + { type: 'index', label: '序号', width: 70 }, + { prop: 'setting_type', label: '设置层级', minWidth: 100, formatter: (row: { setting_type?: string }) => settingTypeOptions.find((item) => item.value === row.setting_type)?.label || row.setting_type || '' }, + { prop: 'code', label: '编码', minWidth: 150 }, + { prop: 'name', label: '名称', minWidth: 160 }, + { prop: 'parent_name', label: '所属上级', minWidth: 140 }, + { prop: 'sort', label: '排序', width: 90 }, + { prop: 'is_enabled', label: '状态', width: 90, formatter: (row: any) => row.is_enabled === 0 ? '停用' : '启用' }, + { prop: 'remark', label: '备注', minWidth: 180, showOverflowTooltip: true }, + { prop: 'created_name', label: '创建人', minWidth: 110 }, + ], + dialogProps: { width: '700px' }, + formSchema: { + showDefaultActions: false, + labelWidth: '105px', + schema: [ + { component: 'Input', prop: 'id', label: 'ID', show: false, ifDetail: true, colSpan: 24 }, + { + component: 'Select', prop: 'setting_type', label: '设置层级', + componentProps: { placeholder: '请选择设置层级', options: settingTypeOptions }, + rules: [{ required: true, message: '请选择设置层级' }], colSpan: 12, + }, + { + component: 'ApiSelect', prop: 'parent_id', label: '所属上级', + componentProps: { + api: '/produce/exception-setting', requestMethod: 'get', + params: { format: 'select', NE_setting_type: 'issue' }, clearable: true, placeholder: '处理类型无需选择上级', + }, colSpan: 12, + }, + { + component: 'Input', prop: 'code', label: '设置编码', + componentProps: { placeholder: '请输入唯一编码', maxlength: 64 }, + rules: [{ required: true, message: '请输入设置编码' }], colSpan: 12, + }, + { + component: 'Input', prop: 'name', label: '设置名称', + componentProps: { placeholder: '请输入显示名称', maxlength: 100 }, + rules: [{ required: true, message: '请输入设置名称' }], colSpan: 12, + }, + { component: 'InputNumber', prop: 'sort', label: '排序', defaultValue: 0, componentProps: { min: 0 }, colSpan: 12 }, + { + component: 'RadioGroup', prop: 'is_enabled', label: '是否启用', defaultValue: 1, + componentProps: { options: [{ label: '启用', value: 1 }, { label: '停用', value: 0 }] }, colSpan: 12, + }, + { + component: 'Input', prop: 'remark', label: '备注', + componentProps: { type: 'textarea', rows: 3, placeholder: '请输入备注' }, colSpan: 24, + }, + ], + }, +}) diff --git a/frontend/admin/src/apps/produce/views/produce/exception/analysis/index.vue b/frontend/admin/src/apps/produce/views/produce/exception/analysis/index.vue new file mode 100644 index 0000000..08326fd --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/exception/analysis/index.vue @@ -0,0 +1,228 @@ + + + + + diff --git a/frontend/admin/src/apps/produce/views/produce/exception/data/index.vue b/frontend/admin/src/apps/produce/views/produce/exception/data/index.vue new file mode 100644 index 0000000..12bdc6d --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/exception/data/index.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/frontend/admin/src/apps/produce/views/produce/exception/data/schemas/index.tsx b/frontend/admin/src/apps/produce/views/produce/exception/data/schemas/index.tsx new file mode 100644 index 0000000..3d4630e --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/exception/data/schemas/index.tsx @@ -0,0 +1,127 @@ +import { CrudSchema } from '@/components/crud' +import { ProduceExceptionRecordService } from '@/apps/produce/api' + +const statusOptions = [ + { label: '待处理', value: 0 }, + { label: '处理中', value: 1 }, + { label: '已处理', value: 2 }, +] + +export const crudSchema = (): CrudSchema => ({ + api: ProduceExceptionRecordService.list, + dialogTitle: '异常数据', + crudApi: { + add: ProduceExceptionRecordService.create, + edit: ProduceExceptionRecordService.update, + remove: ProduceExceptionRecordService.remove, + view: ProduceExceptionRecordService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'produce:exception-data:create', + editAuth: 'produce:exception-data:update', + removeAuth: 'produce:exception-data:delete', + viewAuth: 'produce:exception-data:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '90px', + schema: [ + { + prop: 'keyword', + label: '关键字', + component: 'Input', + componentProps: { clearable: true, placeholder: '单号、提报人、处理类型、原因或具体问题' }, + colSpan: 8, + }, + { + prop: 'type_code', + label: '处理类型', + component: 'Input', + componentProps: { clearable: true, placeholder: '请输入处理类型编码' }, + colSpan: 8, + }, + { + prop: 'status', + label: '处理状态', + component: 'Select', + componentProps: { clearable: true, placeholder: '请选择处理状态', options: statusOptions }, + colSpan: 8, + }, + { + prop: 'reported_at_range', + label: '提报时间', + component: 'DatePicker', + componentProps: { + type: 'daterange', + clearable: true, + valueFormat: 'YYYY-MM-DD', + startPlaceholder: '开始日期', + endPlaceholder: '结束日期', + }, + colSpan: 12, + }, + ], + }, + columns: [ + { type: 'selection' }, + { type: 'index', label: '序号', width: 70 }, + { prop: 'order_no', label: '单号/条码', minWidth: 160 }, + { prop: 'type_name', label: '处理类型', minWidth: 120 }, + { prop: 'reason_name', label: '异常原因', minWidth: 120 }, + { prop: 'issue_name', label: '具体问题', minWidth: 140 }, + { prop: 'reporter', label: '提报人', minWidth: 110 }, + { prop: 'status_name', label: '处理状态', minWidth: 100 }, + { prop: 'handler', label: '处理人', minWidth: 110 }, + { prop: 'reported_date', label: '提报时间', minWidth: 170 }, + { prop: 'handled_date', label: '处理时间', minWidth: 170 }, + ], + dialogProps: { width: '820px' }, + formSchema: { + showDefaultActions: false, + labelWidth: '105px', + schema: [ + { component: 'Input', prop: 'id', label: 'ID', show: false, ifDetail: true, colSpan: 24 }, + { + component: 'Input', prop: 'order_no', label: '单号/条码', + componentProps: { placeholder: '请输入单号或条码', maxlength: 100 }, + rules: [{ required: true, message: '请输入单号或条码' }], colSpan: 12, + }, + { component: 'Input', prop: 'user_code', label: '提报人工号', componentProps: { placeholder: '请输入提报人工号', maxlength: 50 }, colSpan: 12 }, + { component: 'Input', prop: 'reporter', label: '提报人', componentProps: { placeholder: '请输入提报人', maxlength: 100 }, colSpan: 12 }, + { + component: 'Input', prop: 'type_code', label: '处理类型编码', + componentProps: { placeholder: '例如 defective_repair', maxlength: 64 }, + rules: [{ required: true, message: '请输入处理类型编码' }], colSpan: 12, + }, + { + component: 'Input', prop: 'type_name', label: '处理类型', + componentProps: { placeholder: '例如 不良维修', maxlength: 100 }, + rules: [{ required: true, message: '请输入处理类型' }], colSpan: 12, + }, + { + component: 'Input', prop: 'reason_code', label: '异常原因编码', + componentProps: { placeholder: '例如 test_defect', maxlength: 64 }, + rules: [{ required: true, message: '请输入异常原因编码' }], colSpan: 12, + }, + { + component: 'Input', prop: 'reason_name', label: '异常原因', + componentProps: { placeholder: '例如 测试不良', maxlength: 100 }, + rules: [{ required: true, message: '请输入异常原因' }], colSpan: 12, + }, + { component: 'Input', prop: 'issue_code', label: '具体问题编码', componentProps: { placeholder: '可选', maxlength: 64 }, colSpan: 12 }, + { component: 'Input', prop: 'issue_name', label: '具体问题', componentProps: { placeholder: '可选', maxlength: 100 }, colSpan: 12 }, + { component: 'Select', prop: 'status', label: '处理状态', defaultValue: 0, componentProps: { options: statusOptions }, colSpan: 12 }, + { component: 'Input', prop: 'handler', label: '处理人', componentProps: { placeholder: '请输入处理人', maxlength: 100 }, colSpan: 12 }, + { + component: 'Upload', prop: 'images', label: '现场图片', componentProps: { listType: 'picture-card' }, ifDetail: true, colSpan: 24, + }, + { + component: 'Input', prop: 'remark', label: '补充说明', + componentProps: { type: 'textarea', rows: 3, placeholder: '请输入现场情况或处理说明' }, colSpan: 24, + }, + ], + }, +}) diff --git a/frontend/admin/src/apps/produce/views/produce/exception/setting/index.vue b/frontend/admin/src/apps/produce/views/produce/exception/setting/index.vue new file mode 100644 index 0000000..a4a5e48 --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/exception/setting/index.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/frontend/admin/src/apps/produce/views/produce/exception/setting/schemas/index.tsx b/frontend/admin/src/apps/produce/views/produce/exception/setting/schemas/index.tsx new file mode 100644 index 0000000..fac58e4 --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/exception/setting/schemas/index.tsx @@ -0,0 +1,100 @@ +import { CrudSchema } from '@/components/crud' +import { ProduceExceptionSettingService } from '@/apps/produce/api' + +const settingTypeOptions = [ + { label: '处理类型', value: 'type' }, + { label: '异常原因', value: 'reason' }, + { label: '具体问题', value: 'issue' }, +] + +export const crudSchema = (): CrudSchema => ({ + api: ProduceExceptionSettingService.list, + dialogTitle: '异常设置', + crudApi: { + add: ProduceExceptionSettingService.create, + edit: ProduceExceptionSettingService.update, + remove: ProduceExceptionSettingService.remove, + view: ProduceExceptionSettingService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'produce:exception-setting:create', + editAuth: 'produce:exception-setting:update', + removeAuth: 'produce:exception-setting:delete', + viewAuth: 'produce:exception-setting:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '90px', + schema: [ + { + prop: 'keyword', label: '关键字', component: 'Input', + componentProps: { clearable: true, placeholder: '编码、名称或备注' }, colSpan: 8, + }, + { + prop: 'setting_type', label: '设置层级', component: 'Select', + componentProps: { clearable: true, placeholder: '请选择设置层级', options: settingTypeOptions }, colSpan: 8, + }, + { + prop: 'is_enabled', label: '启用状态', component: 'Select', + componentProps: { + clearable: true, placeholder: '请选择启用状态', + options: [{ label: '启用', value: 1 }, { label: '停用', value: 0 }], + }, colSpan: 8, + }, + ], + }, + columns: [ + { type: 'selection' }, + { type: 'index', label: '序号', width: 70 }, + { prop: 'setting_type', label: '设置层级', minWidth: 100, formatter: (row: { setting_type?: string }) => settingTypeOptions.find((item) => item.value === row.setting_type)?.label || row.setting_type || '' }, + { prop: 'code', label: '编码', minWidth: 150 }, + { prop: 'name', label: '名称', minWidth: 160 }, + { prop: 'parent_name', label: '所属上级', minWidth: 140 }, + { prop: 'sort', label: '排序', width: 90 }, + { prop: 'is_enabled', label: '状态', width: 90, formatter: (row: any) => row.is_enabled === 0 ? '停用' : '启用' }, + { prop: 'remark', label: '备注', minWidth: 180, showOverflowTooltip: true }, + { prop: 'created_name', label: '创建人', minWidth: 110 }, + ], + dialogProps: { width: '700px' }, + formSchema: { + showDefaultActions: false, + labelWidth: '105px', + schema: [ + { component: 'Input', prop: 'id', label: 'ID', show: false, ifDetail: true, colSpan: 24 }, + { + component: 'Select', prop: 'setting_type', label: '设置层级', + componentProps: { placeholder: '请选择设置层级', options: settingTypeOptions }, + rules: [{ required: true, message: '请选择设置层级' }], colSpan: 12, + }, + { + component: 'ApiSelect', prop: 'parent_id', label: '所属上级', + componentProps: { + api: '/produce/exception-setting', requestMethod: 'get', + params: { format: 'select', NE_setting_type: 'issue' }, clearable: true, placeholder: '处理类型无需选择上级', + }, colSpan: 12, + }, + { + component: 'Input', prop: 'code', label: '设置编码', + componentProps: { placeholder: '请输入唯一编码', maxlength: 64 }, + rules: [{ required: true, message: '请输入设置编码' }], colSpan: 12, + }, + { + component: 'Input', prop: 'name', label: '设置名称', + componentProps: { placeholder: '请输入显示名称', maxlength: 100 }, + rules: [{ required: true, message: '请输入设置名称' }], colSpan: 12, + }, + { component: 'InputNumber', prop: 'sort', label: '排序', defaultValue: 0, componentProps: { min: 0 }, colSpan: 12 }, + { + component: 'RadioGroup', prop: 'is_enabled', label: '是否启用', defaultValue: 1, + componentProps: { options: [{ label: '启用', value: 1 }, { label: '停用', value: 0 }] }, colSpan: 12, + }, + { + component: 'Input', prop: 'remark', label: '备注', + componentProps: { type: 'textarea', rows: 3, placeholder: '请输入备注' }, colSpan: 24, + }, + ], + }, +}) diff --git a/frontend/admin/src/apps/produce/views/produce/material-category/index.vue b/frontend/admin/src/apps/produce/views/produce/material-category/index.vue new file mode 100644 index 0000000..e424302 --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/material-category/index.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/frontend/admin/src/apps/produce/views/produce/material-category/schemas/index.tsx b/frontend/admin/src/apps/produce/views/produce/material-category/schemas/index.tsx new file mode 100644 index 0000000..5282377 --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/material-category/schemas/index.tsx @@ -0,0 +1,42 @@ +import { CrudSchema } from '@/components/crud' +import { ProduceMaterialCategoryService } from '../../../../api' + +export const crudSchema = (): CrudSchema => ({ + api: ProduceMaterialCategoryService.list, + dialogTitle: '物料分类', + crudApi: { + add: ProduceMaterialCategoryService.create, + edit: ProduceMaterialCategoryService.update, + remove: ProduceMaterialCategoryService.remove, + view: ProduceMaterialCategoryService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'produce:material-category:create', + editAuth: 'produce:material-category:update', + removeAuth: 'produce:material-category:delete', + viewAuth: 'produce:material-category:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '90px', + schema: [{ prop: 'LIKE_category_name', label: '分类名称', component: 'Input', componentProps: { clearable: true, placeholder: '请输入分类名称' }, colSpan: 8 }], + }, + columns: [ + { type: 'selection' }, + { type: 'index', label: '序号', width: 70 }, + { prop: 'category_name', label: '分类名称', minWidth: 220 }, + { prop: 'created_date', label: '创建时间', minWidth: 180 }, + ], + dialogProps: { width: '520px' }, + formSchema: { + showDefaultActions: false, + labelWidth: '90px', + schema: [ + { component: 'Input', show: false, ifDetail: true, colSpan: 24, prop: 'id', label: 'ID' }, + { component: 'Input', prop: 'category_name', label: '分类名称', componentProps: { maxlength: 100, placeholder: '请输入分类名称' }, rules: [{ required: true, message: '请输入分类名称' }], colSpan: 24 }, + ], + }, +}) diff --git a/frontend/admin/src/apps/produce/views/produce/material/index.vue b/frontend/admin/src/apps/produce/views/produce/material/index.vue new file mode 100644 index 0000000..ef5768a --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/material/index.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/frontend/admin/src/apps/produce/views/produce/material/schemas/index.tsx b/frontend/admin/src/apps/produce/views/produce/material/schemas/index.tsx new file mode 100644 index 0000000..71e2114 --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/material/schemas/index.tsx @@ -0,0 +1,50 @@ +import { CrudSchema } from '@/components/crud' +import { ProduceMaterialService } from '../../../../api' + +export const crudSchema = (): CrudSchema => ({ + api: ProduceMaterialService.list, + dialogTitle: '物料库', + crudApi: { + add: ProduceMaterialService.create, + edit: ProduceMaterialService.update, + remove: ProduceMaterialService.remove, + view: ProduceMaterialService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + hasExport: true, + addAuth: 'produce:material:create', + editAuth: 'produce:material:update', + removeAuth: 'produce:material:delete', + viewAuth: 'produce:material:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '90px', + schema: [ + { prop: 'keyword', label: '关键字', component: 'Input', componentProps: { clearable: true, placeholder: '商品编码或商品名称' }, colSpan: 8 }, + { prop: 'category_id', label: '物料分类', component: 'ApiSelect', componentProps: { api: ProduceMaterialService.categoryOptions, labelField: 'category_name', valueField: 'id', clearable: true, placeholder: '请选择分类' }, colSpan: 8 }, + ], + }, + columns: [ + { type: 'selection' }, + { type: 'index', label: '序号', width: 70 }, + { prop: 'category_name', label: '物料分类', minWidth: 160 }, + { prop: 'product_code', label: '商品编码', minWidth: 180 }, + { prop: 'product_name', label: '商品名称', minWidth: 220 }, + { prop: 'created_date', label: '创建时间', minWidth: 180 }, + ], + dialogProps: { width: '640px' }, + formSchema: { + showDefaultActions: false, + labelWidth: '90px', + schema: [ + { component: 'Input', show: false, ifDetail: true, colSpan: 24, prop: 'id', label: 'ID' }, + { component: 'ApiSelect', prop: 'category_id', label: '物料分类', componentProps: { api: ProduceMaterialService.categoryOptions, labelField: 'category_name', valueField: 'id', clearable: true, placeholder: '请选择分类' }, rules: [{ required: true, message: '请选择物料分类' }], colSpan: 12 }, + { component: 'Input', prop: 'product_code', label: '商品编码', componentProps: { maxlength: 100, placeholder: '请输入或扫描商品编码' }, rules: [{ required: true, message: '请输入商品编码' }], colSpan: 12 }, + { component: 'Input', prop: 'product_name', label: '商品名称', componentProps: { maxlength: 200, placeholder: '请输入商品名称' }, rules: [{ required: true, message: '请输入商品名称' }], colSpan: 24 }, + ], + }, +}) diff --git a/frontend/admin/src/apps/produce/views/produce/process-step/index.vue b/frontend/admin/src/apps/produce/views/produce/process-step/index.vue new file mode 100644 index 0000000..3305168 --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/process-step/index.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/frontend/admin/src/apps/produce/views/produce/process-step/schemas/index.tsx b/frontend/admin/src/apps/produce/views/produce/process-step/schemas/index.tsx new file mode 100644 index 0000000..487fe0a --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/process-step/schemas/index.tsx @@ -0,0 +1,185 @@ +import { CrudSchema } from '@/components/crud' +import { DictEnum } from '@/enums' +import { $t } from '@/locales' +import { ProduceProcessStepService } from '../../../../api/index' + +export const crudSchema = (): CrudSchema => { + return { + api: ProduceProcessStepService.list, + dialogTitle: $t('produce.modules.process_step.title'), + crudApi: { + add: ProduceProcessStepService.create, + edit: ProduceProcessStepService.update, + remove: ProduceProcessStepService.remove, + view: ProduceProcessStepService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'produce:process-step:create', + editAuth: 'produce:process-step:update', + removeAuth: 'produce:process-step:delete', + viewAuth: 'produce:process-step:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'process_id', + label: $t('produce.modules.process_step.search.process_id'), + component: 'ApiSelect', + componentProps: { + api: '/produce/process', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: $t('produce.modules.process_step.search.process_id_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'LIKE_step_code', + label: $t('produce.modules.process_step.search.step_code'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('produce.modules.process_step.search.step_code_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'LIKE_step_name', + label: $t('produce.modules.process_step.search.step_name'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('produce.modules.process_step.search.step_name_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'status', + label: $t('produce.modules.process_step.search.status'), + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + clearable: true, + placeholder: $t('produce.modules.process_step.search.status_placeholder'), + }, + colSpan: 6, + }, + ], + }, + columns: [ + { type: 'selection' }, + { type: 'index', label: $t('produce.common.columns.index'), width: 70 }, + { + prop: 'process.process_name', + label: $t('produce.modules.process_step.columns.process_name'), + minWidth: 180, + }, + { prop: 'step_code', label: $t('produce.modules.process_step.columns.step_code'), minWidth: 160 }, + { prop: 'step_name', label: $t('produce.modules.process_step.columns.step_name'), minWidth: 180 }, + { prop: 'sort', label: $t('produce.modules.process_step.columns.sort'), width: 100 }, + { + prop: 'status', + label: $t('produce.modules.process_step.columns.status'), + width: 120, + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + }, + }, + { prop: 'created_date', label: $t('produce.modules.process_step.columns.created_at'), minWidth: 180 }, + ], + dialogProps: { + width: '680px', + }, + formSchema: { + showDefaultActions: false, + labelWidth: '110px', + schema: [ + { + component: 'Input', + show: false, + ifDetail: true, + colSpan: 24, + prop: 'id', + label: 'ID', + }, + { + component: 'ApiSelect', + prop: 'process_id', + label: $t('produce.modules.process_step.form.process_id'), + componentProps: { + api: '/produce/process', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: $t('produce.modules.process_step.form.process_id_placeholder'), + }, + rules: [{ required: true, message: $t('produce.modules.process_step.form.process_id_placeholder') }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'step_code', + label: $t('produce.modules.process_step.columns.step_code'), + componentProps: { + placeholder: $t('produce.modules.process_step.form.step_code_placeholder'), + maxlength: 50, + }, + rules: [{ required: true, message: $t('produce.modules.process_step.form.step_code_placeholder') }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'step_name', + label: $t('produce.modules.process_step.columns.step_name'), + componentProps: { + placeholder: $t('produce.modules.process_step.form.step_name_placeholder'), + maxlength: 100, + }, + rules: [{ required: true, message: $t('produce.modules.process_step.form.step_name_placeholder') }], + colSpan: 12, + }, + { + component: 'InputNumber', + prop: 'sort', + label: $t('produce.modules.process_step.columns.sort'), + defaultValue: 0, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'ApiDict', + prop: 'status', + label: $t('produce.modules.process_step.columns.status'), + defaultValue: 1, + componentProps: { + code: DictEnum.SYS_YES_NO, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 24, + }, + { + component: 'Input', + prop: 'description', + label: $t('produce.modules.process_step.form.description'), + componentProps: { + type: 'textarea', + rows: 4, + placeholder: $t('produce.modules.process_step.form.description_placeholder'), + }, + colSpan: 24, + }, + ], + }, + } +} diff --git a/frontend/admin/src/apps/produce/views/produce/process/index.vue b/frontend/admin/src/apps/produce/views/produce/process/index.vue new file mode 100644 index 0000000..c2d5b17 --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/process/index.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/frontend/admin/src/apps/produce/views/produce/process/schemas/index.tsx b/frontend/admin/src/apps/produce/views/produce/process/schemas/index.tsx new file mode 100644 index 0000000..c662f03 --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/process/schemas/index.tsx @@ -0,0 +1,154 @@ +import { CrudSchema } from '@/components/crud' +import { DictEnum } from '@/enums' +import { $t } from '@/locales' +import { ProduceProcessService } from '../../../../api/index' + +export const crudSchema = (): CrudSchema => { + return { + api: ProduceProcessService.list, + dialogTitle: $t('produce.modules.process.title'), + crudApi: { + add: ProduceProcessService.create, + edit: ProduceProcessService.update, + remove: ProduceProcessService.remove, + view: ProduceProcessService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'produce:process:create', + editAuth: 'produce:process:update', + removeAuth: 'produce:process:delete', + viewAuth: 'produce:process:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'LIKE_process_code', + label: $t('produce.modules.process.search.process_code'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('produce.modules.process.search.process_code_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'LIKE_process_name', + label: $t('produce.modules.process.search.process_name'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('produce.modules.process.search.process_name_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'status', + label: $t('produce.modules.process.search.status'), + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + clearable: true, + placeholder: $t('produce.modules.process.search.status_placeholder'), + }, + colSpan: 6, + }, + ], + }, + columns: [ + { type: 'selection' }, + { type: 'index', label: $t('produce.common.columns.index'), width: 70 }, + { prop: 'process_code', label: $t('produce.modules.process.columns.process_code'), minWidth: 160 }, + { prop: 'process_name', label: $t('produce.modules.process.columns.process_name'), minWidth: 180 }, + { prop: 'step_count', label: $t('produce.modules.process.columns.step_count'), width: 120 }, + { prop: 'sort', label: $t('produce.modules.process.columns.sort'), width: 100 }, + { + prop: 'status', + label: $t('produce.modules.process.columns.status'), + width: 120, + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + }, + }, + { prop: 'created_date', label: $t('produce.modules.process.columns.created_at'), minWidth: 180 }, + ], + dialogProps: { + width: '640px', + }, + formSchema: { + showDefaultActions: false, + labelWidth: '100px', + schema: [ + { + component: 'Input', + show: false, + ifDetail: true, + colSpan: 24, + prop: 'id', + label: 'ID', + }, + { + component: 'Input', + prop: 'process_code', + label: $t('produce.modules.process.columns.process_code'), + componentProps: { + placeholder: $t('produce.modules.process.form.process_code_placeholder'), + maxlength: 50, + }, + rules: [{ required: true, message: $t('produce.modules.process.form.process_code_placeholder') }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'process_name', + label: $t('produce.modules.process.columns.process_name'), + componentProps: { + placeholder: $t('produce.modules.process.form.process_name_placeholder'), + maxlength: 100, + }, + rules: [{ required: true, message: $t('produce.modules.process.form.process_name_placeholder') }], + colSpan: 12, + }, + { + component: 'InputNumber', + prop: 'sort', + label: $t('produce.modules.process.columns.sort'), + defaultValue: 0, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'ApiDict', + prop: 'status', + label: $t('produce.modules.process.columns.status'), + defaultValue: 1, + componentProps: { + code: DictEnum.SYS_YES_NO, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 12, + }, + { + component: 'Input', + prop: 'description', + label: $t('produce.modules.process.form.description'), + componentProps: { + type: 'textarea', + rows: 4, + placeholder: $t('produce.modules.process.form.description_placeholder'), + }, + colSpan: 24, + }, + ], + }, + } +} diff --git a/frontend/admin/src/apps/produce/views/produce/product-record/index.vue b/frontend/admin/src/apps/produce/views/produce/product-record/index.vue new file mode 100644 index 0000000..bdd4600 --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/product-record/index.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/frontend/admin/src/apps/produce/views/produce/product-record/schemas/index.tsx b/frontend/admin/src/apps/produce/views/produce/product-record/schemas/index.tsx new file mode 100644 index 0000000..ae2abe9 --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/product-record/schemas/index.tsx @@ -0,0 +1,249 @@ +import { CrudSchema } from '@/components/crud' +import { ProduceProductRecordService } from '@/apps/produce/api' + +export const crudSchema = (): CrudSchema => { + return { + api: ProduceProductRecordService.list, + dialogTitle: '整机数据', + crudApi: { + add: ProduceProductRecordService.create, + edit: ProduceProductRecordService.update, + remove: ProduceProductRecordService.remove, + view: ProduceProductRecordService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'produce:product-record:create', + editAuth: 'produce:product-record:update', + removeAuth: 'produce:product-record:delete', + viewAuth: 'produce:product-record:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'keyword', + label: '关键字', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入加工单号/商品编码/操作人员/备注', + }, + colSpan: 6, + }, + { + prop: 'process_id', + label: '工序名称', + component: 'ApiSelect', + componentProps: { + api: '/produce/process', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: '请选择工序', + }, + colSpan: 6, + }, + { + prop: 'step_id', + label: '步骤名称', + component: 'ApiSelect', + componentProps: { + api: '/produce/process-step', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: '请选择步骤', + }, + colSpan: 6, + }, + { + prop: 'status_id', + label: '步骤状态', + component: 'ApiSelect', + componentProps: { + api: '/produce/step-status', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: '请选择状态', + }, + colSpan: 6, + }, + { + prop: 'scan_result', + label: '扫码结果', + component: 'Select', + componentProps: { + clearable: true, + placeholder: '请选择扫码结果', + options: [ + { label: '成功', value: 1 }, + { label: '失败', value: 0 }, + ], + }, + colSpan: 6, + }, + { + prop: 'created_time_range', + label: '创建时间', + component: 'DatePicker', + componentProps: { + type: 'daterange', + clearable: true, + valueFormat: 'YYYY-MM-DD', + startPlaceholder: '开始日期', + endPlaceholder: '结束日期', + }, + colSpan: 12, + }, + ], + }, + columns: [ + { type: 'selection' }, + { type: 'index', label: '序号', width: 70 }, + { prop: 'process_order_no', label: '加工单号', minWidth: 160 }, + { prop: 'product_code', label: '商品编码', minWidth: 160 }, + { prop: 'quantity', label: '数量', width: 100 }, + { prop: 'process_name', label: '工序名称', minWidth: 140 }, + { prop: 'step_name', label: '步骤名称', minWidth: 140 }, + { prop: 'status_name', label: '步骤状态', minWidth: 120 }, + { prop: 'operator', label: '操作人员', minWidth: 120 }, + { + prop: 'scan_result', + label: '扫码结果', + width: 100, + formatter: (row: any) => (row.scan_result === 0 ? '失败' : '成功'), + }, + { prop: 'created_date', label: '创建时间', minWidth: 180 }, + { prop: 'created_name', label: '创建人', minWidth: 120 }, + ], + dialogProps: { + width: '760px', + }, + formSchema: { + showDefaultActions: false, + labelWidth: '110px', + schema: [ + { + component: 'Input', + show: false, + ifDetail: true, + colSpan: 24, + prop: 'id', + label: 'ID', + }, + { + component: 'Input', + prop: 'process_order_no', + label: '加工单号', + componentProps: { + placeholder: '请输入加工单号', + maxlength: 100, + }, + rules: [{ required: true, message: '请输入加工单号' }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'product_code', + label: '商品编码', + componentProps: { + placeholder: '请输入商品编码', + maxlength: 100, + }, + rules: [{ required: true, message: '请输入商品编码' }], + colSpan: 12, + }, + { + component: 'InputNumber', + prop: 'quantity', + label: '数量', + defaultValue: 1, + componentProps: { + min: 1, + precision: 0, + }, + rules: [{ required: true, message: '请输入数量' }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'user_code', + label: '用户编码', + componentProps: { + placeholder: '请输入用户编码', + maxlength: 50, + }, + rules: [{ required: true, message: '请输入用户编码' }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'operator', + label: '操作人员', + componentProps: { + placeholder: '请输入操作人员', + maxlength: 100, + }, + colSpan: 12, + }, + { + component: 'Input', + prop: 'process_name', + label: '工序名称', + componentProps: { + disabled: true, + }, + colSpan: 12, + }, + { + component: 'Input', + prop: 'step_name', + label: '步骤名称', + componentProps: { + disabled: true, + }, + colSpan: 12, + }, + { + component: 'Input', + prop: 'status_name', + label: '步骤状态', + componentProps: { + disabled: true, + }, + colSpan: 12, + }, + { + component: 'RadioGroup', + prop: 'scan_result', + label: '扫码结果', + defaultValue: 1, + componentProps: { + options: [ + { label: '成功', value: 1 }, + { label: '失败', value: 0 }, + ], + }, + rules: [{ required: true, message: '请选择扫码结果' }], + colSpan: 24, + }, + { + component: 'Input', + prop: 'remark', + label: '备注', + componentProps: { + type: 'textarea', + rows: 3, + placeholder: '请输入备注', + }, + colSpan: 24, + }, + ], + }, + } +} diff --git a/frontend/admin/src/apps/produce/views/produce/repair/hardware-fault-description/index.vue b/frontend/admin/src/apps/produce/views/produce/repair/hardware-fault-description/index.vue new file mode 100644 index 0000000..ebd6782 --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/repair/hardware-fault-description/index.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/frontend/admin/src/apps/produce/views/produce/repair/hardware-fault-description/schemas/index.tsx b/frontend/admin/src/apps/produce/views/produce/repair/hardware-fault-description/schemas/index.tsx new file mode 100644 index 0000000..a3eeb0f --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/repair/hardware-fault-description/schemas/index.tsx @@ -0,0 +1,135 @@ +import { CrudSchema } from "@/components/crud"; +import { ProduceHardwareFaultDescriptionService } from "@/apps/produce/api"; + +const enabledOptions = [ + { label: "启用", value: 1 }, + { label: "停用", value: 0 }, +]; + +export const crudSchema = (): CrudSchema => ({ + api: ProduceHardwareFaultDescriptionService.list, + dialogTitle: "硬件故障描述", + crudApi: { + add: ProduceHardwareFaultDescriptionService.create, + edit: ProduceHardwareFaultDescriptionService.update, + remove: ProduceHardwareFaultDescriptionService.remove, + view: ProduceHardwareFaultDescriptionService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: "produce:hardware-fault-description:create", + editAuth: "produce:hardware-fault-description:update", + removeAuth: "produce:hardware-fault-description:delete", + viewAuth: "produce:hardware-fault-description:read", + rowKey: "id", + searchFormSchema: { + labelWidth: "90px", + schema: [ + { + prop: "category_id", + label: "物料分类", + component: "ApiSelect", + componentProps: { + api: ProduceHardwareFaultDescriptionService.categoryOptions, + labelField: "label", + valueField: "value", + clearable: true, + }, + colSpan: 8, + }, + { + prop: "keyword", + label: "关键字", + component: "Input", + componentProps: { clearable: true, placeholder: "故障描述或备注" }, + colSpan: 8, + }, + { + prop: "is_enabled", + label: "启用状态", + component: "Select", + componentProps: { clearable: true, options: enabledOptions }, + colSpan: 8, + }, + ], + }, + columns: [ + { type: "selection" }, + { type: "index", label: "序号", width: 70 }, + { prop: "category_name", label: "物料分类", minWidth: 160 }, + { + prop: "description", + label: "硬件故障描述", + minWidth: 300, + showOverflowTooltip: true, + }, + { prop: "use_count", label: "使用次数", width: 100 }, + { + prop: "is_enabled", + label: "状态", + width: 90, + formatter: (row: { is_enabled?: number }) => + row.is_enabled === 0 ? "停用" : "启用", + }, + { prop: "remark", label: "备注", minWidth: 180, showOverflowTooltip: true }, + { prop: "created_date", label: "创建时间", minWidth: 180 }, + ], + dialogProps: { width: "720px" }, + formSchema: { + showDefaultActions: false, + labelWidth: "110px", + schema: [ + { + component: "Input", + prop: "id", + label: "ID", + show: false, + ifDetail: true, + colSpan: 24, + }, + { + component: "ApiSelect", + prop: "category_id", + label: "物料分类", + componentProps: { + api: ProduceHardwareFaultDescriptionService.categoryOptions, + labelField: "label", + valueField: "value", + clearable: true, + placeholder: "请选择物料分类", + }, + rules: [{ required: true, message: "请选择物料分类" }], + colSpan: 12, + }, + { + component: "RadioGroup", + prop: "is_enabled", + label: "是否启用", + defaultValue: 1, + componentProps: { options: enabledOptions }, + colSpan: 12, + }, + { + component: "Input", + prop: "description", + label: "故障描述", + componentProps: { + maxlength: 500, + placeholder: "请输入该物料分类的硬件故障描述", + }, + rules: [{ required: true, message: "请输入硬件故障描述" }], + colSpan: 24, + }, + { + component: "Input", + prop: "remark", + label: "备注", + componentProps: { type: "textarea", rows: 3, maxlength: 500 }, + colSpan: 24, + }, + ], + }, +}); diff --git a/frontend/admin/src/apps/produce/views/produce/repair/repair-data/index.vue b/frontend/admin/src/apps/produce/views/produce/repair/repair-data/index.vue new file mode 100644 index 0000000..aef41a3 --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/repair/repair-data/index.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/frontend/admin/src/apps/produce/views/produce/repair/repair-data/schemas/index.tsx b/frontend/admin/src/apps/produce/views/produce/repair/repair-data/schemas/index.tsx new file mode 100644 index 0000000..d2db915 --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/repair/repair-data/schemas/index.tsx @@ -0,0 +1,490 @@ +import { h } from "vue"; +import { CrudSchema } from "@/components/crud"; +import { ProduceRepairRecordService } from "@/apps/produce/api"; + +const formatPartSource = (source: unknown): string => { + const labels: Record = { + new: "新料", + old: "售后", + after_sale: "售后", + after_sales: "售后", + "after-sale": "售后", + repair: "返修", + refurbished: "返修", + }; + const value = String(source || ""); + return labels[value] || value || "-"; +}; + +const parseParts = (parts: Array> | string | null | undefined): Array> => { + if (Array.isArray(parts)) return parts; + if (typeof parts !== "string" || !parts) return []; + try { + const parsed = JSON.parse(parts); + return Array.isArray(parsed) ? parsed : []; + } catch { + return []; + } +}; + +const formatPartValues = ( + parts: Array> | string | null | undefined, + getValue: (part: Record) => string, +): string => + parseParts(parts) + .map((part) => getValue(part)) + .filter(Boolean) + .join("\n"); + +const formatPartRows = ( + parts: Array> | string | null | undefined, + getValue: (part: Record) => string, + nowrap = true, +) => + h( + "div", + parseParts(parts).map((part) => + h( + "div", + { style: { lineHeight: "24px", minHeight: "24px", whiteSpace: nowrap ? "nowrap" : "normal" } }, + getValue(part) || "-", + ), + ), + ); + +const formatPartFaultDescriptions = (part: Record): string => + Array.isArray(part.fault_descriptions) + ? part.fault_descriptions + .map((fault: { description?: string }) => fault.description || "") + .filter(Boolean) + .join("、") + : ""; + +const formatCategoryNames = (row: { + category_names?: string[] | string | null; + category_name?: string | null; +}): string => { + const names = row.category_names; + if (Array.isArray(names)) return names.filter(Boolean).join("、"); + if (typeof names === "string" && names) { + try { + const parsed = JSON.parse(names); + if (Array.isArray(parsed)) return parsed.filter(Boolean).join("、"); + } catch { + return names; + } + return names; + } + return row.category_name || ""; +}; + +type ResponsibilitySnapshot = { + process_name?: string; + step_name?: string; + operator?: string; + user_code?: string; +}; + +const parseSnapshots = (snapshots: ResponsibilitySnapshot[] | string | null | undefined): ResponsibilitySnapshot[] => { + if (Array.isArray(snapshots)) return snapshots; + if (typeof snapshots !== "string" || !snapshots) return []; + try { + const parsed = JSON.parse(snapshots); + return Array.isArray(parsed) ? parsed : []; + } catch { + return []; + } +}; + +const formatRepairResult = (repairResult?: string | null): string => { + const labels: Record = { + material_defect: "物料不良", + operation_defect: "作业不良", + assembly_mismatch: "搭配错误", + }; + return labels[repairResult || ""] || repairResult || ""; +}; + +const formatOperationFaultSteps = (snapshots: ResponsibilitySnapshot[] | string | null | undefined): string => + parseSnapshots(snapshots) + .map((item) => [item.process_name, item.step_name].filter(Boolean).join(" · ")) + .filter(Boolean) + .join("\n"); + +const formatResponsibleOperators = (snapshots: ResponsibilitySnapshot[] | string | null | undefined): string => + parseSnapshots(snapshots) + .map((item) => { + const operator = item.operator || item.user_code || ""; + const process = [item.process_name, item.step_name].filter(Boolean).join(" · "); + return [operator, process].filter(Boolean).join("|"); + }) + .filter(Boolean) + .join("\n"); + +const formatResponsibleOperatorNames = (snapshots: ResponsibilitySnapshot[] | string | null | undefined): string => + parseSnapshots(snapshots) + .map((item) => { + const step = item.step_name || ""; + const operator = item.operator || item.user_code || ""; + return [step, operator].filter(Boolean).join("-"); + }) + .filter(Boolean) + .join("\n"); + +export const crudSchema = (): CrudSchema => ({ + api: ProduceRepairRecordService.list, + dialogTitle: "维修数据", + crudApi: { + add: ProduceRepairRecordService.create, + edit: ProduceRepairRecordService.update, + remove: ProduceRepairRecordService.remove, + view: ProduceRepairRecordService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + hasExport: true, + exportFileName: "维修数据", + exportFields: [ + { field: "repair_no", title: "维修单号" }, + { field: "order_product", title: "订单号/商品编码" }, + { field: "exception_type_name", title: "异常分类" }, + { field: "exception_reason", title: "异常原因" }, + { field: "part_category", title: "物料分类" }, + { field: "part_code", title: "物料编码" }, + { field: "part_name", title: "更换备件" }, + { field: "part_fault", title: "故障描述" }, + { field: "part_quantity", title: "数量" }, + { field: "part_source", title: "来源" }, + { field: "repair_result_name", title: "维修判定分类" }, + { field: "responsible_operator_names", title: "责任人员" }, + { field: "operator", title: "维修人员" }, + { field: "repaired_date", title: "维修时间" }, + ], + addAuth: "produce:repair-record:create", + editAuth: "produce:repair-record:update", + removeAuth: "produce:repair-record:delete", + viewAuth: "produce:repair-record:read", + rowKey: "id", + searchFormSchema: { + labelWidth: "90px", + schema: [ + { + prop: "keyword", + label: "关键字", + component: "Input", + componentProps: { + clearable: true, + placeholder: "维修单、订单、商品或故障描述", + }, + colSpan: 8, + }, + { + prop: "category_id", + label: "物料分类", + component: "ApiSelect", + componentProps: { + api: ProduceRepairRecordService.categoryOptions, + labelField: "label", + valueField: "value", + clearable: true, + }, + colSpan: 8, + }, + { + prop: "fault_description_id", + label: "故障描述", + component: "ApiSelect", + componentProps: { + api: ProduceRepairRecordService.faultDescriptionOptions, + labelField: "description", + valueField: "id", + clearable: true, + }, + colSpan: 8, + }, + ], + }, + columns: [ + { type: "selection" }, + { type: "index", label: "序号", width: 70 }, + { prop: "repair_no", label: "维修单号", minWidth: 160 }, + { + prop: "order_no", + label: "订单号/商品编码", + minWidth: 180, + cellStyle: { whiteSpace: "nowrap" }, + formatter: (row: { order_no?: string | null; product_code?: string | null }) => + [row.order_no, row.product_code].filter(Boolean).join("/"), + }, + { prop: "exception_type_name", label: "异常分类", minWidth: 120, cellStyle: { whiteSpace: "nowrap" } }, + { prop: "exception_reason", label: "异常原因", minWidth: 180, cellStyle: { whiteSpace: "nowrap" } }, + { + prop: "part_category", + label: "物料分类", + minWidth: 140, + cellStyle: { whiteSpace: "nowrap" }, + formatter: (row: { parts?: Array> | string | null }) => + formatPartRows(row.parts, (part) => part.category_name || ""), + }, + { + prop: "part_code", + label: "物料编码", + minWidth: 150, + cellStyle: { whiteSpace: "nowrap" }, + formatter: (row: { parts?: Array> | string | null }) => + formatPartRows(row.parts, (part) => part.product_code || ""), + }, + { + prop: "part_name", + label: "更换备件", + minWidth: 240, + cellStyle: { whiteSpace: "nowrap" }, + formatter: (row: { parts?: Array> | string | null }) => + formatPartRows(row.parts, (part) => part.product_name || "", true), + }, + { + prop: "part_fault", + label: "故障描述", + minWidth: 180, + cellStyle: { whiteSpace: "nowrap" }, + formatter: (row: { parts?: Array> | string | null }) => + formatPartRows(row.parts, formatPartFaultDescriptions), + }, + { + prop: "part_quantity", + label: "数量", + width: 80, + cellStyle: { whiteSpace: "nowrap" }, + formatter: (row: { parts?: Array> | string | null }) => + formatPartRows(row.parts, (part) => String(part.quantity ?? 1)), + }, + { + prop: "part_source", + label: "来源", + width: 90, + cellStyle: { whiteSpace: "nowrap" }, + formatter: (row: { parts?: Array> | string | null }) => + formatPartRows(row.parts, (part) => formatPartSource(part.source)), + }, + { + prop: "repair_result", + label: "维修判定分类", + minWidth: 140, + cellStyle: { whiteSpace: "nowrap" }, + formatter: (row: { repair_result?: string | null }) => formatRepairResult(row.repair_result), + }, + { + prop: "responsible_operators", + label: "责任人员", + minWidth: 120, + cellStyle: { whiteSpace: "nowrap" }, + formatter: (row: { responsible_operators?: ResponsibilitySnapshot[] | string | null }) => + formatResponsibleOperatorNames(row.responsible_operators), + }, + { prop: "operator", label: "维修人员", minWidth: 120, cellStyle: { whiteSpace: "nowrap" } }, + { prop: "repaired_date", label: "维修时间", minWidth: 180, cellStyle: { whiteSpace: "nowrap" } }, + ], + dialogProps: { width: "860px" }, + formSchema: { + showDefaultActions: false, + labelWidth: "105px", + schema: [ + { + component: "Input", + prop: "id", + label: "ID", + show: false, + ifDetail: true, + colSpan: 24, + }, + { + component: "Input", + prop: "repair_no", + label: "维修单号", + componentProps: { maxlength: 100, placeholder: "请输入维修单号" }, + rules: [{ required: true, message: "请输入维修单号" }], + colSpan: 12, + }, + { + component: "Input", + prop: "order_no", + label: "订单号", + componentProps: { maxlength: 100, placeholder: "请输入订单号" }, + colSpan: 12, + }, + { + component: "Input", + prop: "product_code", + label: "商品编码", + componentProps: { maxlength: 100, placeholder: "请输入商品编码" }, + colSpan: 12, + }, + { + component: "Input", + prop: "product_name", + label: "商品名称", + componentProps: { maxlength: 200, placeholder: "请输入商品名称" }, + colSpan: 12, + }, + { + component: "ApiSelect", + prop: "category_id", + label: "首选物料分类", + componentProps: { + api: ProduceRepairRecordService.categoryOptions, + labelField: "label", + valueField: "value", + clearable: true, + placeholder: "请选择首选物料分类", + }, + colSpan: 12, + }, + { + component: "Input", + prop: "category_names", + label: "物料分类", + componentProps: (model: { category_names?: string[] | string | null; category_name?: string | null }) => ({ + type: "textarea", + rows: 2, + readonly: true, + value: formatCategoryNames(model), + }), + ifDetail: true, + colSpan: 24, + }, + { + component: "ApiSelect", + prop: "fault_description_id", + label: "故障描述", + componentProps: { + api: ProduceRepairRecordService.faultDescriptionOptions, + labelField: "description", + valueField: "id", + clearable: true, + placeholder: "请选择硬件故障描述", + }, + colSpan: 12, + }, + { + component: "Input", + prop: "exception_reason", + label: "异常原因", + componentProps: (model: { exception_reason?: string | null; exception_issue?: string | null }) => ({ + type: "textarea", + rows: 2, + readonly: true, + value: [model.exception_reason, model.exception_issue].filter(Boolean).join(" · "), + }), + ifDetail: true, + colSpan: 24, + }, + { + component: "Input", + prop: "fault_descriptions", + label: "故障描述", + componentProps: (model: { fault_descriptions?: string[]; fault_description?: string | null }) => ({ + type: "textarea", + rows: 2, + readonly: true, + value: (model.fault_descriptions || []).join("、") || model.fault_description || "", + }), + ifDetail: true, + colSpan: 24, + }, + { + component: "PartsDetail", + prop: "parts", + label: "更换备件", + ifDetail: true, + colSpan: 24, + }, + { + component: "Select", + prop: "repair_result", + label: "维修判定", + componentProps: { + clearable: true, + options: [ + { label: "物料不良", value: "material_defect" }, + { label: "作业不良", value: "operation_defect" }, + { label: "搭配错误", value: "assembly_mismatch" }, + ], + }, + colSpan: 12, + }, + { + component: "Input", + prop: "repair_result_detail", + label: "维修判定", + componentProps: (model: { repair_result?: string | null }) => ({ + readonly: true, + value: formatRepairResult(model.repair_result), + }), + ifDetail: true, + colSpan: 12, + }, + { + component: "Input", + prop: "operation_fault_steps", + label: "责任步骤", + componentProps: (model: { operation_fault_steps?: ResponsibilitySnapshot[] | string | null }) => ({ + type: "textarea", + rows: 2, + readonly: true, + value: formatOperationFaultSteps(model.operation_fault_steps), + }), + ifDetail: true, + colSpan: 12, + }, + { + component: "Input", + prop: "responsible_operators", + label: "责任人员", + componentProps: (model: { responsible_operators?: ResponsibilitySnapshot[] | string | null }) => ({ + type: "textarea", + rows: 2, + readonly: true, + value: formatResponsibleOperators(model.responsible_operators), + }), + ifDetail: true, + colSpan: 24, + }, + { + component: "Upload", + prop: "images", + label: "维修现场图片", + componentProps: { listType: "picture-card" }, + ifDetail: true, + colSpan: 24, + }, + { + component: "Input", + prop: "operator", + label: "维修人员", + componentProps: { maxlength: 100, placeholder: "请输入维修人员" }, + colSpan: 12, + }, + { + component: "DatePicker", + prop: "repaired_at", + label: "维修时间", + componentProps: { + type: "datetime", + valueFormat: "x", + placeholder: "请选择维修时间", + }, + colSpan: 12, + }, + { + component: "Input", + prop: "remark", + label: "备注", + componentProps: { type: "textarea", rows: 3, maxlength: 1000 }, + colSpan: 24, + }, + ], + }, +}); diff --git a/frontend/admin/src/apps/produce/views/produce/repair/repair-setting/index.vue b/frontend/admin/src/apps/produce/views/produce/repair/repair-setting/index.vue new file mode 100644 index 0000000..037165f --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/repair/repair-setting/index.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/frontend/admin/src/apps/produce/views/produce/repair/repair-setting/schemas/index.tsx b/frontend/admin/src/apps/produce/views/produce/repair/repair-setting/schemas/index.tsx new file mode 100644 index 0000000..831356e --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/repair/repair-setting/schemas/index.tsx @@ -0,0 +1,100 @@ +import { CrudSchema } from '@/components/crud' +import { ProduceRepairSettingService } from '@/apps/produce/api' + +const settingTypeOptions = [ + { label: '处理类型', value: 'type' }, + { label: '维修原因', value: 'reason' }, + { label: '具体问题', value: 'issue' }, +] + +export const crudSchema = (): CrudSchema => ({ + api: ProduceRepairSettingService.list, + dialogTitle: '维修设置', + crudApi: { + add: ProduceRepairSettingService.create, + edit: ProduceRepairSettingService.update, + remove: ProduceRepairSettingService.remove, + view: ProduceRepairSettingService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'produce:repair-setting:create', + editAuth: 'produce:repair-setting:update', + removeAuth: 'produce:repair-setting:delete', + viewAuth: 'produce:repair-setting:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '90px', + schema: [ + { + prop: 'keyword', label: '关键字', component: 'Input', + componentProps: { clearable: true, placeholder: '编码、名称或备注' }, colSpan: 8, + }, + { + prop: 'setting_type', label: '设置层级', component: 'Select', + componentProps: { clearable: true, placeholder: '请选择设置层级', options: settingTypeOptions }, colSpan: 8, + }, + { + prop: 'is_enabled', label: '启用状态', component: 'Select', + componentProps: { + clearable: true, placeholder: '请选择启用状态', + options: [{ label: '启用', value: 1 }, { label: '停用', value: 0 }], + }, colSpan: 8, + }, + ], + }, + columns: [ + { type: 'selection' }, + { type: 'index', label: '序号', width: 70 }, + { prop: 'setting_type', label: '设置层级', minWidth: 100, formatter: (row: { setting_type?: string }) => settingTypeOptions.find((item) => item.value === row.setting_type)?.label || row.setting_type || '' }, + { prop: 'code', label: '编码', minWidth: 150 }, + { prop: 'name', label: '名称', minWidth: 160 }, + { prop: 'parent_name', label: '所属上级', minWidth: 140 }, + { prop: 'sort', label: '排序', width: 90 }, + { prop: 'is_enabled', label: '状态', width: 90, formatter: (row: any) => row.is_enabled === 0 ? '停用' : '启用' }, + { prop: 'remark', label: '备注', minWidth: 180, showOverflowTooltip: true }, + { prop: 'created_name', label: '创建人', minWidth: 110 }, + ], + dialogProps: { width: '700px' }, + formSchema: { + showDefaultActions: false, + labelWidth: '105px', + schema: [ + { component: 'Input', prop: 'id', label: 'ID', show: false, ifDetail: true, colSpan: 24 }, + { + component: 'Select', prop: 'setting_type', label: '设置层级', + componentProps: { placeholder: '请选择设置层级', options: settingTypeOptions }, + rules: [{ required: true, message: '请选择设置层级' }], colSpan: 12, + }, + { + component: 'ApiSelect', prop: 'parent_id', label: '所属上级', + componentProps: { + api: '/produce/repair-setting', requestMethod: 'get', + params: { format: 'select', NE_setting_type: 'issue' }, clearable: true, placeholder: '处理类型无需选择上级', + }, colSpan: 12, + }, + { + component: 'Input', prop: 'code', label: '设置编码', + componentProps: { placeholder: '请输入唯一编码', maxlength: 64 }, + rules: [{ required: true, message: '请输入设置编码' }], colSpan: 12, + }, + { + component: 'Input', prop: 'name', label: '设置名称', + componentProps: { placeholder: '请输入显示名称', maxlength: 100 }, + rules: [{ required: true, message: '请输入设置名称' }], colSpan: 12, + }, + { component: 'InputNumber', prop: 'sort', label: '排序', defaultValue: 0, componentProps: { min: 0 }, colSpan: 12 }, + { + component: 'RadioGroup', prop: 'is_enabled', label: '是否启用', defaultValue: 1, + componentProps: { options: [{ label: '启用', value: 1 }, { label: '停用', value: 0 }] }, colSpan: 12, + }, + { + component: 'Input', prop: 'remark', label: '备注', + componentProps: { type: 'textarea', rows: 3, placeholder: '请输入备注' }, colSpan: 24, + }, + ], + }, +}) diff --git a/frontend/admin/src/apps/produce/views/produce/scan-data/index.vue b/frontend/admin/src/apps/produce/views/produce/scan-data/index.vue new file mode 100644 index 0000000..082d7b1 --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/scan-data/index.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/frontend/admin/src/apps/produce/views/produce/scan-data/schemas/index.tsx b/frontend/admin/src/apps/produce/views/produce/scan-data/schemas/index.tsx new file mode 100644 index 0000000..045b17b --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/scan-data/schemas/index.tsx @@ -0,0 +1,254 @@ +import { CrudSchema } from '@/components/crud' +import { ProduceScanDataService } from '@/apps/produce/api' + +export const crudSchema = (): CrudSchema => { + return { + api: ProduceScanDataService.list, + dialogTitle: '扫码数据', + crudApi: { + add: ProduceScanDataService.create, + edit: ProduceScanDataService.update, + remove: ProduceScanDataService.remove, + view: ProduceScanDataService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'produce:scan-data:create', + editAuth: 'produce:scan-data:update', + removeAuth: 'produce:scan-data:delete', + viewAuth: 'produce:scan-data:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'keyword', + label: '关键字', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入订单号/用户编码/操作人员/备注', + }, + colSpan: 6, + }, + { + prop: 'process_id', + label: '工序名称', + component: 'ApiSelect', + componentProps: { + api: '/produce/process', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: '请选择工序', + }, + colSpan: 6, + }, + { + prop: 'step_id', + label: '步骤名称', + component: 'ApiSelect', + componentProps: { + api: '/produce/process-step', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: '请选择步骤', + }, + colSpan: 6, + }, + { + prop: 'status_id', + label: '步骤状态', + component: 'ApiSelect', + componentProps: { + api: '/produce/step-status', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: '请选择状态', + }, + colSpan: 6, + }, + { + prop: 'LIKE_operator', + label: '操作人员', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入操作人员', + }, + colSpan: 6, + }, + { + prop: 'scan_result', + label: '扫码结果', + component: 'Select', + componentProps: { + clearable: true, + placeholder: '请选择扫码结果', + options: [ + { label: '成功', value: 1 }, + { label: '失败', value: 0 }, + ], + }, + colSpan: 6, + }, + { + prop: 'scan_time_range', + label: '扫码时间', + component: 'DatePicker', + componentProps: { + type: 'daterange', + clearable: true, + valueFormat: 'YYYY-MM-DD', + startPlaceholder: '开始日期', + endPlaceholder: '结束日期', + }, + colSpan: 12, + }, + ], + }, + columns: [ + { type: 'selection' }, + { type: 'index', label: '序号', width: 70 }, + { prop: 'order_no', label: '订单号', minWidth: 160 }, + { prop: 'quantity', label: '数量', width: 90 }, + { prop: 'user_code', label: '用户编码', minWidth: 120 }, + { prop: 'process_name', label: '工序名称', minWidth: 140 }, + { prop: 'step_name', label: '步骤名称', minWidth: 140 }, + { prop: 'status_name', label: '步骤状态', minWidth: 120 }, + { prop: 'operator', label: '操作人员', minWidth: 120 }, + { + prop: 'scan_result', + label: '扫码结果', + width: 100, + formatter: (row: any) => (row.scan_result === 0 ? '失败' : '成功'), + }, + { prop: 'scan_date', label: '扫码时间', minWidth: 180 }, + { prop: 'created_name', label: '创建人', minWidth: 120 }, + ], + dialogProps: { + width: '760px', + }, + formSchema: { + showDefaultActions: false, + labelWidth: '110px', + schema: [ + { + component: 'Input', + show: false, + ifDetail: true, + colSpan: 24, + prop: 'id', + label: 'ID', + }, + { + component: 'Input', + prop: 'order_no', + label: '订单号', + componentProps: { + placeholder: '请输入订单号', + maxlength: 100, + }, + rules: [{ required: true, message: '请输入订单号' }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'user_code', + label: '用户编码', + componentProps: { + placeholder: '请输入用户编码', + maxlength: 50, + }, + rules: [{ required: true, message: '请输入用户编码' }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'operator', + label: '操作人员', + componentProps: { + placeholder: '请输入操作人员', + maxlength: 100, + }, + colSpan: 12, + }, + { + component: 'ApiSelect', + prop: 'process_id', + label: '工序名称', + componentProps: (values: any) => ({ + api: '/produce/process', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: '请选择工序', + disabled: values?.id !== undefined && values?.id !== null && values?.id !== '', + }), + rules: [{ required: true, message: '请选择工序' }], + colSpan: 12, + }, + { + component: 'ApiSelect', + prop: 'step_id', + label: '步骤名称', + componentProps: (values: any) => ({ + api: '/produce/process-step', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: '请选择步骤', + disabled: values?.id !== undefined && values?.id !== null && values?.id !== '', + }), + rules: [{ required: true, message: '请选择步骤' }], + colSpan: 12, + }, + { + component: 'ApiSelect', + prop: 'status_id', + label: '步骤状态', + componentProps: (values: any) => ({ + api: '/produce/step-status', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: '请选择状态', + disabled: values?.id !== undefined && values?.id !== null && values?.id !== '', + }), + rules: [{ required: true, message: '请选择状态' }], + colSpan: 12, + }, + { + component: 'RadioGroup', + prop: 'scan_result', + label: '扫码结果', + defaultValue: 1, + componentProps: { + options: [ + { label: '成功', value: 1 }, + { label: '失败', value: 0 }, + ], + }, + rules: [{ required: true, message: '请选择扫码结果' }], + colSpan: 24, + }, + { + component: 'Input', + prop: 'remark', + label: '备注', + componentProps: { + type: 'textarea', + rows: 3, + placeholder: '请输入备注', + }, + colSpan: 24, + }, + ], + }, + } +} diff --git a/frontend/admin/src/apps/produce/views/produce/statistics/daily/index.vue b/frontend/admin/src/apps/produce/views/produce/statistics/daily/index.vue new file mode 100644 index 0000000..405009a --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/statistics/daily/index.vue @@ -0,0 +1,310 @@ + + + + + diff --git a/frontend/admin/src/apps/produce/views/produce/statistics/monthly/index.vue b/frontend/admin/src/apps/produce/views/produce/statistics/monthly/index.vue new file mode 100644 index 0000000..8bc0a3d --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/statistics/monthly/index.vue @@ -0,0 +1,290 @@ + + + + + diff --git a/frontend/admin/src/apps/produce/views/produce/status-transition/index.vue b/frontend/admin/src/apps/produce/views/produce/status-transition/index.vue new file mode 100644 index 0000000..3d3743c --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/status-transition/index.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/frontend/admin/src/apps/produce/views/produce/status-transition/schemas/index.tsx b/frontend/admin/src/apps/produce/views/produce/status-transition/schemas/index.tsx new file mode 100644 index 0000000..8c386f9 --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/status-transition/schemas/index.tsx @@ -0,0 +1,290 @@ +import { CrudSchema } from '@/components/crud' +import { DictEnum } from '@/enums' +import { $t } from '@/locales' +import { ProduceStatusTransitionService } from '../../../../api/index' + +const triggerEventOptions = [ + { label: '下一工序扫码触发', value: 'next_step_scan' }, + { label: '扫描触发', value: 'scan_trigger' }, + { label: '异常触发', value: 'exception_trigger' }, + { label: '手动触发', value: 'manual_trigger' }, + { label: '定时触发', value: 'timer_trigger' }, + { label: '完成触发', value: 'complete_trigger' }, +] + +const transitionTypeOptions = [ + { label: '主转换', value: 'primary' }, + { label: '副作用', value: 'side_effect' }, +] + +const sideEffectTypeOptions = [ + { label: '记录日志', value: 'log' }, + { label: '发送通知', value: 'notify' }, + { label: '更新字段', value: 'update_field' }, + { label: '触发事件', value: 'trigger_event' }, +] + +export const crudSchema = (): CrudSchema => { + return { + api: ProduceStatusTransitionService.list, + dialogTitle: $t('produce.modules.status_transition.title'), + crudApi: { + add: ProduceStatusTransitionService.create, + edit: ProduceStatusTransitionService.update, + remove: ProduceStatusTransitionService.remove, + view: ProduceStatusTransitionService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'produce:status-transition:create', + editAuth: 'produce:status-transition:update', + removeAuth: 'produce:status-transition:delete', + viewAuth: 'produce:status-transition:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'step_id', + label: $t('produce.modules.status_transition.search.step_id'), + component: 'ApiSelect', + componentProps: { + api: '/produce/process-step', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: $t('produce.modules.status_transition.search.step_id_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'trigger_event', + label: $t('produce.modules.status_transition.search.trigger_event'), + component: 'Select', + componentProps: { + options: triggerEventOptions, + clearable: true, + placeholder: $t('produce.modules.status_transition.search.trigger_event_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'status', + label: $t('produce.modules.status_transition.search.status'), + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + clearable: true, + placeholder: $t('produce.modules.status_transition.search.status_placeholder'), + }, + colSpan: 6, + }, + ], + }, + columns: [ + { type: 'selection' }, + { type: 'index', label: $t('produce.common.columns.index'), width: 70 }, + { prop: 'step.step_name', label: $t('produce.modules.status_transition.columns.step_name'), minWidth: 160 }, + { prop: 'from_status.status_name', label: $t('produce.modules.status_transition.columns.from_status_name'), minWidth: 140 }, + { prop: 'to_status.status_name', label: $t('produce.modules.status_transition.columns.to_status_name'), minWidth: 140 }, + { prop: 'trigger_event', label: $t('produce.modules.status_transition.columns.trigger_event'), minWidth: 160 }, + { prop: 'transition_type', label: $t('produce.modules.status_transition.columns.transition_type'), width: 120 }, + { + prop: 'auto_trigger', + label: $t('produce.modules.status_transition.columns.auto_trigger'), + width: 120, + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + }, + }, + { prop: 'priority', label: $t('produce.modules.status_transition.columns.priority'), width: 100 }, + { prop: 'sort', label: $t('produce.modules.status_transition.columns.sort'), width: 100 }, + { + prop: 'status', + label: $t('produce.modules.status_transition.columns.status'), + width: 120, + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + }, + }, + { prop: 'created_date', label: $t('produce.modules.status_transition.columns.created_at'), minWidth: 180 }, + ], + dialogProps: { + width: '860px', + }, + formSchema: { + showDefaultActions: false, + labelWidth: '120px', + schema: [ + { + component: 'Input', + show: false, + ifDetail: true, + colSpan: 24, + prop: 'id', + label: 'ID', + }, + { + component: 'ApiSelect', + prop: 'step_id', + label: $t('produce.modules.status_transition.form.step_id'), + componentProps: { + api: '/produce/process-step', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: $t('produce.modules.status_transition.form.step_id_placeholder'), + }, + rules: [{ required: true, message: $t('produce.modules.status_transition.form.step_id_placeholder') }], + colSpan: 12, + }, + { + component: 'ApiSelect', + prop: 'from_status_id', + label: $t('produce.modules.status_transition.form.from_status_id'), + componentProps: { + api: '/produce/step-status', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: $t('produce.modules.status_transition.form.from_status_id_placeholder'), + }, + rules: [{ required: true, message: $t('produce.modules.status_transition.form.from_status_id_placeholder') }], + colSpan: 12, + }, + { + component: 'ApiSelect', + prop: 'to_status_id', + label: $t('produce.modules.status_transition.form.to_status_id'), + componentProps: { + api: '/produce/step-status', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: $t('produce.modules.status_transition.form.to_status_id_placeholder'), + }, + rules: [{ required: true, message: $t('produce.modules.status_transition.form.to_status_id_placeholder') }], + colSpan: 12, + }, + { + component: 'Select', + prop: 'trigger_event', + label: $t('produce.modules.status_transition.columns.trigger_event'), + componentProps: { + options: triggerEventOptions, + placeholder: $t('produce.modules.status_transition.form.trigger_event_placeholder'), + }, + rules: [{ required: true, message: $t('produce.modules.status_transition.form.trigger_event_placeholder') }], + colSpan: 12, + }, + { + component: 'RadioGroup', + prop: 'transition_type', + label: $t('produce.modules.status_transition.columns.transition_type'), + defaultValue: 'primary', + componentProps: { + options: transitionTypeOptions, + isBtn: true, + renderType: 'RadioButton', + }, + colSpan: 24, + }, + { + component: 'Select', + prop: 'side_effect_type', + label: $t('produce.modules.status_transition.form.side_effect_type'), + componentProps: { + options: sideEffectTypeOptions, + clearable: true, + placeholder: $t('produce.modules.status_transition.form.side_effect_type_placeholder'), + }, + colSpan: 12, + }, + { + component: 'ApiDict', + prop: 'auto_trigger', + label: $t('produce.modules.status_transition.columns.auto_trigger'), + defaultValue: 0, + componentProps: { + code: DictEnum.SYS_YES_NO, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 12, + }, + { + component: 'InputNumber', + prop: 'priority', + label: $t('produce.modules.status_transition.columns.priority'), + defaultValue: 0, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'InputNumber', + prop: 'sort', + label: $t('produce.modules.status_transition.columns.sort'), + defaultValue: 0, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'Input', + prop: 'event_config', + label: $t('produce.modules.status_transition.form.event_config'), + componentProps: { + type: 'textarea', + rows: 5, + placeholder: $t('produce.modules.status_transition.form.event_config_placeholder'), + }, + colSpan: 24, + }, + { + component: 'Input', + prop: 'side_effect_config', + label: $t('produce.modules.status_transition.form.side_effect_config'), + componentProps: { + type: 'textarea', + rows: 5, + placeholder: $t('produce.modules.status_transition.form.side_effect_config_placeholder'), + }, + colSpan: 24, + }, + { + component: 'ApiDict', + prop: 'status', + label: $t('produce.modules.status_transition.columns.status'), + defaultValue: 1, + componentProps: { + code: DictEnum.SYS_YES_NO, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 24, + }, + { + component: 'Input', + prop: 'description', + label: $t('produce.modules.status_transition.form.description'), + componentProps: { + type: 'textarea', + rows: 3, + placeholder: $t('produce.modules.status_transition.form.description_placeholder'), + }, + colSpan: 24, + }, + ], + }, + } +} diff --git a/frontend/admin/src/apps/produce/views/produce/step-relation/index.vue b/frontend/admin/src/apps/produce/views/produce/step-relation/index.vue new file mode 100644 index 0000000..44e01f0 --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/step-relation/index.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/frontend/admin/src/apps/produce/views/produce/step-relation/schemas/index.tsx b/frontend/admin/src/apps/produce/views/produce/step-relation/schemas/index.tsx new file mode 100644 index 0000000..c0c8a1e --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/step-relation/schemas/index.tsx @@ -0,0 +1,218 @@ +import { CrudSchema } from '@/components/crud' +import { DictEnum } from '@/enums' +import { $t } from '@/locales' +import { ProduceStepRelationService } from '../../../../api/index' + +const relationTypeOptions = [ + { label: '正常流转', value: 'normal' }, + { label: '异常流转', value: 'exception' }, +] + +export const crudSchema = (): CrudSchema => { + return { + api: ProduceStepRelationService.list, + dialogTitle: $t('produce.modules.step_relation.title'), + crudApi: { + add: ProduceStepRelationService.create, + edit: ProduceStepRelationService.update, + remove: ProduceStepRelationService.remove, + view: ProduceStepRelationService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'produce:step-relation:create', + editAuth: 'produce:step-relation:update', + removeAuth: 'produce:step-relation:delete', + viewAuth: 'produce:step-relation:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'from_step_id', + label: $t('produce.modules.step_relation.search.from_step_id'), + component: 'ApiSelect', + componentProps: { + api: '/produce/process-step', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: $t('produce.modules.step_relation.search.from_step_id_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'to_step_id', + label: $t('produce.modules.step_relation.search.to_step_id'), + component: 'ApiSelect', + componentProps: { + api: '/produce/process-step', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: $t('produce.modules.step_relation.search.to_step_id_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'relation_type', + label: $t('produce.modules.step_relation.search.relation_type'), + component: 'Select', + componentProps: { + options: relationTypeOptions, + clearable: true, + placeholder: $t('produce.modules.step_relation.search.relation_type_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'status', + label: $t('produce.modules.step_relation.search.status'), + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + clearable: true, + placeholder: $t('produce.modules.step_relation.search.status_placeholder'), + }, + colSpan: 6, + }, + ], + }, + columns: [ + { type: 'selection' }, + { type: 'index', label: $t('produce.common.columns.index'), width: 70 }, + { prop: 'from_step.step_name', label: $t('produce.modules.step_relation.columns.from_step_name'), minWidth: 180 }, + { prop: 'to_step.step_name', label: $t('produce.modules.step_relation.columns.to_step_name'), minWidth: 180 }, + { prop: 'relation_type', label: $t('produce.modules.step_relation.columns.relation_type'), width: 120 }, + { prop: 'priority', label: $t('produce.modules.step_relation.columns.priority'), width: 100 }, + { prop: 'flow_condition', label: $t('produce.modules.step_relation.columns.flow_condition'), minWidth: 220 }, + { prop: 'sort', label: $t('produce.modules.step_relation.columns.sort'), width: 100 }, + { + prop: 'status', + label: $t('produce.modules.step_relation.columns.status'), + width: 120, + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + }, + }, + { prop: 'created_date', label: $t('produce.modules.step_relation.columns.created_at'), minWidth: 180 }, + ], + dialogProps: { + width: '760px', + }, + formSchema: { + showDefaultActions: false, + labelWidth: '110px', + schema: [ + { + component: 'Input', + show: false, + ifDetail: true, + colSpan: 24, + prop: 'id', + label: 'ID', + }, + { + component: 'ApiSelect', + prop: 'from_step_id', + label: $t('produce.modules.step_relation.form.from_step_id'), + componentProps: { + api: '/produce/process-step', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: $t('produce.modules.step_relation.form.from_step_id_placeholder'), + }, + rules: [{ required: true, message: $t('produce.modules.step_relation.form.from_step_id_placeholder') }], + colSpan: 12, + }, + { + component: 'ApiSelect', + prop: 'to_step_id', + label: $t('produce.modules.step_relation.form.to_step_id'), + componentProps: { + api: '/produce/process-step', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: $t('produce.modules.step_relation.form.to_step_id_placeholder'), + }, + rules: [{ required: true, message: $t('produce.modules.step_relation.form.to_step_id_placeholder') }], + colSpan: 12, + }, + { + component: 'RadioGroup', + prop: 'relation_type', + label: $t('produce.modules.step_relation.columns.relation_type'), + defaultValue: 'normal', + componentProps: { + options: relationTypeOptions, + isBtn: true, + renderType: 'RadioButton', + }, + colSpan: 24, + }, + { + component: 'InputNumber', + prop: 'priority', + label: $t('produce.modules.step_relation.columns.priority'), + defaultValue: 0, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'InputNumber', + prop: 'sort', + label: $t('produce.modules.step_relation.columns.sort'), + defaultValue: 0, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'Input', + prop: 'flow_condition', + label: $t('produce.modules.step_relation.form.flow_condition'), + componentProps: { + type: 'textarea', + rows: 6, + placeholder: $t('produce.modules.step_relation.form.flow_condition_placeholder'), + }, + colSpan: 24, + }, + { + component: 'ApiDict', + prop: 'status', + label: $t('produce.modules.step_relation.columns.status'), + defaultValue: 1, + componentProps: { + code: DictEnum.SYS_YES_NO, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 24, + }, + { + component: 'Input', + prop: 'description', + label: $t('produce.modules.step_relation.form.description'), + componentProps: { + type: 'textarea', + rows: 3, + placeholder: $t('produce.modules.step_relation.form.description_placeholder'), + }, + colSpan: 24, + }, + ], + }, + } +} diff --git a/frontend/admin/src/apps/produce/views/produce/step-status/index.vue b/frontend/admin/src/apps/produce/views/produce/step-status/index.vue new file mode 100644 index 0000000..19cb79c --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/step-status/index.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/frontend/admin/src/apps/produce/views/produce/step-status/schemas/index.tsx b/frontend/admin/src/apps/produce/views/produce/step-status/schemas/index.tsx new file mode 100644 index 0000000..0832468 --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/step-status/schemas/index.tsx @@ -0,0 +1,227 @@ +import { CrudSchema } from '@/components/crud' +import { DictEnum } from '@/enums' +import { $t } from '@/locales' +import { ProduceStepStatusService } from '../../../../api/index' + +export const crudSchema = (): CrudSchema => { + return { + api: ProduceStepStatusService.list, + dialogTitle: $t('produce.modules.step_status.title'), + crudApi: { + add: ProduceStepStatusService.create, + edit: ProduceStepStatusService.update, + remove: ProduceStepStatusService.remove, + view: ProduceStepStatusService.get, + }, + useCrud: true, + hasAdd: true, + hasEdit: true, + hasRemove: true, + hasView: true, + addAuth: 'produce:step-status:create', + editAuth: 'produce:step-status:update', + removeAuth: 'produce:step-status:delete', + viewAuth: 'produce:step-status:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'step_id', + label: $t('produce.modules.step_status.search.step_id'), + component: 'ApiSelect', + componentProps: { + api: '/produce/process-step', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: $t('produce.modules.step_status.search.step_id_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'LIKE_status_code', + label: $t('produce.modules.step_status.search.status_code'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('produce.modules.step_status.search.status_code_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'LIKE_status_name', + label: $t('produce.modules.step_status.search.status_name'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('produce.modules.step_status.search.status_name_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'status', + label: $t('produce.modules.step_status.search.status'), + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + clearable: true, + placeholder: $t('produce.modules.step_status.search.status_placeholder'), + }, + colSpan: 6, + }, + ], + }, + columns: [ + { type: 'selection' }, + { type: 'index', label: $t('produce.common.columns.index'), width: 70 }, + { + prop: 'step.step_name', + label: $t('produce.modules.step_status.columns.step_name'), + minWidth: 180, + }, + { prop: 'status_code', label: $t('produce.modules.step_status.columns.status_code'), minWidth: 160 }, + { prop: 'status_name', label: $t('produce.modules.step_status.columns.status_name'), minWidth: 180 }, + { + prop: 'is_initial', + label: $t('produce.modules.step_status.columns.is_initial'), + width: 120, + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + }, + }, + { + prop: 'is_final', + label: $t('produce.modules.step_status.columns.is_final'), + width: 120, + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + }, + }, + { prop: 'sort', label: $t('produce.modules.step_status.columns.sort'), width: 100 }, + { + prop: 'status', + label: $t('produce.modules.step_status.columns.status'), + width: 120, + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + }, + }, + { prop: 'created_date', label: $t('produce.modules.step_status.columns.created_at'), minWidth: 180 }, + ], + dialogProps: { + width: '720px', + }, + formSchema: { + showDefaultActions: false, + labelWidth: '110px', + schema: [ + { + component: 'Input', + show: false, + ifDetail: true, + colSpan: 24, + prop: 'id', + label: 'ID', + }, + { + component: 'ApiSelect', + prop: 'step_id', + label: $t('produce.modules.step_status.form.step_id'), + componentProps: { + api: '/produce/process-step', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: $t('produce.modules.step_status.form.step_id_placeholder'), + }, + rules: [{ required: true, message: $t('produce.modules.step_status.form.step_id_placeholder') }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'status_code', + label: $t('produce.modules.step_status.columns.status_code'), + componentProps: { + placeholder: $t('produce.modules.step_status.form.status_code_placeholder'), + maxlength: 50, + }, + rules: [{ required: true, message: $t('produce.modules.step_status.form.status_code_placeholder') }], + colSpan: 12, + }, + { + component: 'Input', + prop: 'status_name', + label: $t('produce.modules.step_status.columns.status_name'), + componentProps: { + placeholder: $t('produce.modules.step_status.form.status_name_placeholder'), + maxlength: 100, + }, + rules: [{ required: true, message: $t('produce.modules.step_status.form.status_name_placeholder') }], + colSpan: 12, + }, + { + component: 'InputNumber', + prop: 'sort', + label: $t('produce.modules.step_status.columns.sort'), + defaultValue: 0, + componentProps: { + min: 0, + class: 'w-full', + }, + colSpan: 12, + }, + { + component: 'ApiDict', + prop: 'is_initial', + label: $t('produce.modules.step_status.columns.is_initial'), + defaultValue: 0, + componentProps: { + code: DictEnum.SYS_YES_NO, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 12, + }, + { + component: 'ApiDict', + prop: 'is_final', + label: $t('produce.modules.step_status.columns.is_final'), + defaultValue: 0, + componentProps: { + code: DictEnum.SYS_YES_NO, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 12, + }, + { + component: 'ApiDict', + prop: 'status', + label: $t('produce.modules.step_status.columns.status'), + defaultValue: 1, + componentProps: { + code: DictEnum.SYS_YES_NO, + isBtn: true, + renderType: 'RadioGroup', + }, + colSpan: 24, + }, + { + component: 'Input', + prop: 'description', + label: $t('produce.modules.step_status.form.description'), + componentProps: { + type: 'textarea', + rows: 4, + placeholder: $t('produce.modules.step_status.form.description_placeholder'), + }, + colSpan: 24, + }, + ], + }, + } +} diff --git a/frontend/admin/src/apps/produce/views/produce/transition-log/index.vue b/frontend/admin/src/apps/produce/views/produce/transition-log/index.vue new file mode 100644 index 0000000..1a84668 --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/transition-log/index.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/frontend/admin/src/apps/produce/views/produce/transition-log/schemas/index.tsx b/frontend/admin/src/apps/produce/views/produce/transition-log/schemas/index.tsx new file mode 100644 index 0000000..1ec65b3 --- /dev/null +++ b/frontend/admin/src/apps/produce/views/produce/transition-log/schemas/index.tsx @@ -0,0 +1,277 @@ +import { CrudSchema } from '@/components/crud' +import { DictEnum } from '@/enums' +import { $t } from '@/locales' +import { ProduceTransitionLogService } from '../../../../api/index' + +const triggerEventOptions = [ + { label: '下一工序扫码触发', value: 'next_step_scan' }, + { label: '扫描触发', value: 'scan_trigger' }, + { label: '异常触发', value: 'exception_trigger' }, + { label: '手动触发', value: 'manual_trigger' }, + { label: '定时触发', value: 'timer_trigger' }, + { label: '完成触发', value: 'complete_trigger' }, +] + +const formatJsonText = (value: unknown) => { + if (value === null || value === undefined || value === '') { + return '' + } + if (typeof value === 'string') { + return value + } + try { + return JSON.stringify(value, null, 2) + } catch { + return String(value) + } +} + +export const crudSchema = (): CrudSchema => { + return { + api: ProduceTransitionLogService.list, + dialogTitle: $t('produce.modules.transition_log.title'), + crudApi: { + view: async (id: string | number) => { + const res = await ProduceTransitionLogService.get(id) + return { + ...res, + trigger_data: formatJsonText(res?.trigger_data), + } + }, + }, + useCrud: true, + hasAdd: false, + hasEdit: false, + hasRemove: false, + hasView: true, + viewAuth: 'produce:transition-log:read', + rowKey: 'id', + searchFormSchema: { + labelWidth: '100px', + schema: [ + { + prop: 'LIKE_work_order_no', + label: $t('produce.modules.transition_log.search.work_order_no'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('produce.modules.transition_log.search.work_order_no_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'step_id', + label: $t('produce.modules.transition_log.search.step_id'), + component: 'ApiSelect', + componentProps: { + api: '/produce/process-step', + requestMethod: 'get', + params: { format: 'select' }, + clearable: true, + placeholder: $t('produce.modules.transition_log.search.step_id_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'trigger_event', + label: $t('produce.modules.transition_log.search.trigger_event'), + component: 'Select', + componentProps: { + options: triggerEventOptions, + clearable: true, + placeholder: $t('produce.modules.transition_log.search.trigger_event_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'LIKE_trigger_user', + label: $t('produce.modules.transition_log.search.trigger_user'), + component: 'Input', + componentProps: { + clearable: true, + placeholder: $t('produce.modules.transition_log.search.trigger_user_placeholder'), + }, + colSpan: 6, + }, + { + prop: 'is_success', + label: $t('produce.modules.transition_log.search.is_success'), + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + clearable: true, + placeholder: $t('produce.modules.transition_log.search.is_success_placeholder'), + }, + colSpan: 6, + }, + ], + }, + columns: [ + { type: 'index', label: $t('produce.common.columns.index'), width: 70 }, + { prop: 'work_order_no', label: $t('produce.modules.transition_log.columns.work_order_no'), minWidth: 140 }, + { prop: 'step.step_name', label: $t('produce.modules.transition_log.columns.step_name'), minWidth: 160 }, + { prop: 'from_status.status_name', label: $t('produce.modules.transition_log.columns.from_status_name'), minWidth: 140 }, + { prop: 'to_status.status_name', label: $t('produce.modules.transition_log.columns.to_status_name'), minWidth: 140 }, + { + prop: 'trigger_event', + label: $t('produce.modules.transition_log.columns.trigger_event'), + minWidth: 160, + formatter: (row: { trigger_event?: string }) => + triggerEventOptions.find((option) => option.value === row.trigger_event)?.label || row.trigger_event || '' + }, + { prop: 'trigger_user', label: $t('produce.modules.transition_log.columns.trigger_user'), minWidth: 120 }, + { + prop: 'is_auto', + label: $t('produce.modules.transition_log.columns.is_auto'), + width: 120, + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + }, + }, + { + prop: 'is_success', + label: $t('produce.modules.transition_log.columns.is_success'), + width: 120, + component: 'ApiDict', + componentProps: { + code: DictEnum.SYS_YES_NO, + }, + }, + { prop: 'duration', label: $t('produce.modules.transition_log.columns.duration'), width: 120 }, + { prop: 'error_message', label: $t('produce.modules.transition_log.columns.error_message'), minWidth: 200 }, + { prop: 'created_date', label: $t('produce.modules.transition_log.columns.created_at'), minWidth: 180 }, + ], + dialogProps: { + width: '960px', + }, + formSchema: { + showDefaultActions: false, + labelWidth: '120px', + schema: [ + { + component: 'Input', + show: false, + ifDetail: true, + colSpan: 12, + prop: 'id', + label: 'ID', + }, + { + component: 'Input', + prop: 'work_order_no', + label: $t('produce.modules.transition_log.columns.work_order_no'), + colSpan: 12, + }, + { + component: 'Input', + prop: 'step.step_name', + label: $t('produce.modules.transition_log.columns.step_name'), + colSpan: 12, + }, + { + component: 'Input', + prop: 'transition.trigger_event', + label: $t('produce.modules.transition_log.columns.transition_event'), + colSpan: 12, + }, + { + component: 'Input', + prop: 'from_status.status_name', + label: $t('produce.modules.transition_log.columns.from_status_name'), + colSpan: 12, + }, + { + component: 'Input', + prop: 'to_status.status_name', + label: $t('produce.modules.transition_log.columns.to_status_name'), + colSpan: 12, + }, + { + component: 'Input', + prop: 'trigger_event', + label: $t('produce.modules.transition_log.columns.trigger_event'), + colSpan: 12, + }, + { + component: 'Input', + prop: 'trigger_user', + label: $t('produce.modules.transition_log.columns.trigger_user'), + colSpan: 12, + }, + { + component: 'Input', + prop: 'trigger_ip', + label: $t('produce.modules.transition_log.columns.trigger_ip'), + colSpan: 12, + }, + { + component: 'ApiDict', + prop: 'is_auto', + label: $t('produce.modules.transition_log.columns.is_auto'), + componentProps: { + code: DictEnum.SYS_YES_NO, + }, + colSpan: 12, + }, + { + component: 'ApiDict', + prop: 'is_success', + label: $t('produce.modules.transition_log.columns.is_success'), + componentProps: { + code: DictEnum.SYS_YES_NO, + }, + colSpan: 12, + }, + { + component: 'Input', + prop: 'duration', + label: $t('produce.modules.transition_log.columns.duration'), + colSpan: 12, + }, + { + component: 'Input', + prop: 'created_name', + label: $t('produce.modules.transition_log.columns.created_name'), + colSpan: 12, + }, + { + component: 'Input', + prop: 'created_date', + label: $t('produce.modules.transition_log.columns.created_at'), + colSpan: 12, + }, + { + component: 'Input', + prop: 'trigger_data', + label: $t('produce.modules.transition_log.columns.trigger_data'), + componentProps: { + type: 'textarea', + rows: 6, + }, + colSpan: 24, + }, + { + component: 'Input', + prop: 'error_message', + label: $t('produce.modules.transition_log.columns.error_message'), + componentProps: { + type: 'textarea', + rows: 4, + }, + colSpan: 24, + }, + { + component: 'Input', + prop: 'remark', + label: $t('produce.modules.transition_log.columns.remark'), + componentProps: { + type: 'textarea', + rows: 4, + }, + colSpan: 24, + }, + ], + }, + } +} diff --git a/frontend/admin/src/apps/test01/api/index.ts b/frontend/admin/src/apps/test01/api/index.ts new file mode 100644 index 0000000..e49ecda --- /dev/null +++ b/frontend/admin/src/apps/test01/api/index.ts @@ -0,0 +1,18 @@ +import request from '@/utils/http'; + +/** + * test01 插件 API + */ +export default { + /** + * 列表 API + * @param params 查询参数 + * @returns 响应数据 + */ + async test(params = {}) { + return request.get<{ msg?: string; data?: unknown }>({ + url: '/test01/index', + params + }); + } +}; diff --git a/frontend/admin/src/apps/test01/lang/en/en.json b/frontend/admin/src/apps/test01/lang/en/en.json new file mode 100644 index 0000000..a933478 --- /dev/null +++ b/frontend/admin/src/apps/test01/lang/en/en.json @@ -0,0 +1,8 @@ +{ + "test01": { + "title": "插件测试0", + "description": "", + "card_title": "插件测试0 Data", + "refresh_btn": "Refresh" + } +} diff --git a/frontend/admin/src/apps/test01/lang/zh-cn/zh.json b/frontend/admin/src/apps/test01/lang/zh-cn/zh.json new file mode 100644 index 0000000..1287c59 --- /dev/null +++ b/frontend/admin/src/apps/test01/lang/zh-cn/zh.json @@ -0,0 +1,8 @@ +{ + "test01": { + "title": "插件测试0", + "description": "", + "card_title": "插件测试0数据", + "refresh_btn": "刷新" + } +}

    BRx6@*b6orBDn;lCCI~2p=kf5(P_RW2;)KAm9~Uo8c5Tpr~@^T zydIcO*CFzAYY=@DspBanIYOcU>C~K>$?-HCnxnI*AP#cBkPA=)HQpsPof(Nb`wR=Y z86^sXcv3l|7qGPeaZk@jf#~yk;GTg4Gt;Xsvt%?n`ekFAQK$+)+}*XWIWV3d;pY+X zL3`}Hp_3w}xW*CSR%-s#uc=cu$>P$jaakF__Ysld$HYTc_ak?!$<2?^U zf>KKR-A}B5cM@=UY@zfXbKS%PKQXv%Cr3sWzL{44{xRO|yB4k-mr+!cQ)nJk z4!jWOxN1y>yWn}<3@V?T%Tizw6qoj~O0vcCaxVVoaB0 zvhbwE;1m-_inz~Hudu*twIFjkC5s2d(!x}Q0O^B*fO3Nh*~m~|-9C(gltBjhOssyJ z5Jp!4d`crd)j4uKQRa#8S$z>#x<&XGV~9AI;$6bMQqDKB9I7#QEDyQT3|h1)c7|0H zg+Vs#9qCdS`It-(nD_4cl(cg^RsGeS=={7*V9CC2)eh3;1<9HMqv2uYwVzEpz5d(j zaf1K8{Sw4&9*7eTSH#^~Sq0DU_AkHjk?4DIn=6)E-fxdbH3EC>(ZXBxBmr-&+)zBWFLArTplJ6eINh3{opat)!MK$`b-BhD| zE)a(b)EX#t`>KkB%ZsjEsR6RQHS*A+D~&~!0g|;L4A3o%p6?1J9n&*hl#No%sp-5% zJ}^f z3?RNMZOx3ObZ@l?7r^Y&U%0yHy3ePauo&zSuoz5#{gfZvo>&azV{V=&OC$4-FQ@yE zMxb488z|@N!4wo$NL1BxEk01= z7b*$%USX7A3&))OXqCrPkEbzCfJrji)LW@m^aG znKAvEonnB;jA5jzKy01}clBU{@R&gEi zbLC`KpyG-m9_n;d#hu%lztTl6*DAecQZ{HuysU(%>a;^v94HYNZ zbA$F>L*x@71qT9T1qNtW@?bMYARTDrimAl#f)eG0*&iI(WLKIngk`S7;q_3*8z)CR zKrjaspz^%>8EI91zzICahX^>yAEur;w(-Dr2ULQPfugg0q-|wN7i?I#jVpHP$8?pg zm7XtZ_GmDXjDY+5(Uw4an#8^iJYHycRQ3KL2ty zc4HOjf7SqCVnmgLnq%o#;Jbj)*HaMuNTCE|a(w+f8dpo}$jZyl^zFxOqA=Es#?WP> zON@`CafQz>U-C*DrY7Ab!C=1GF&i@y2zEh$ZNI$w9Z*Ew{ky1U%m2;6-J8Pk?#-Xe z>r8)=U%L%K2V{2m?ipl))}RjQ{zPfNu*Gs@l44FIeo^uhNS`5I61X>dccmBC;e&b} z;@$X0Or9$;gY-_@h#B2XI>xp)?l3x(Iqku5ZJm~-`}jra4rb{J^?@>&-H<)QGH**R zao^a1-o1a>XS_#$<&7XVwBq)mnW&~iCTFGxn$?HzJ(a(zbp#gZJ0X5n#w~4V*AZ!V zhhHhRLy00befj|xYYB;mkFp;1=w8g8u*>uE2%LQPs%CQKmdb2+!|mgr(l%os?XHc` zf0VtJZ>uD#WBmwr5NES!hfRuqVRuO!nt08+Qc2WK9hzurt+pE)a0KR@+9?aSulrlO z?cA}iVl-#Re5fh}u8}vMxJ%PoMSFOjV- zDL!b^3}s1q;yP_)^Y`Z1h|bF(^Q{JKP^=`SOX6ac@$oMTw^iBDW~Kp)MY6?yT$R@L>Kz zGYuTRv(1X7^;LaeqZuEsD%`!JDdK|3ei)X#b~2WKw_^Ld|L-Kdt?$dR)HsWBi!Ihd zO_p+L*ah zQ~xJ__ejd0Vi6h-VWRAwhc8rvXJuo}`R z*rimO6|M83tmp2BQgDMK_7cS~1VRj&3P&JP9w9^yo}%F@<1>^ZVe`%+aC^}K#Rxrp zQMLmtXC4PNvkgE%E8}4i&LwKBzf3jk5fGH9xLC_2iBk`>Pifm#`f94BXe5i=S9eVv zUmV)iDh50D!1Nbh_I+oRgvGH*w- z$-u&B)?a)3VIq6QtTXJ8x~Q+cQs3~1aC_ODV@Sye8GBKhI6U>+xA}Yme11dR+s+&E zM*?=c>#XjRDQ71xt(^2rRH|2 zE^*+miPGv1tOQBNk>wK?WkvsZQta#AgB~nZN8Ee+`fPll>E+iJ*GsrDX}uvMe)2W< zz1T#thuP=L*1jGQJSQIrS0UFNgh9jz4}57ZhzE}hiZ3S7M9|Wyysr9+8=L+|Fr;Aip9wnTO+6EgnQz4RJIr5_)c9v8Z2YCzf=jj#@*U! zUeb^}oSA4ZD*b$Fyi_gLS2V&I3Ztcq;+C=x*%W)B@x2d~7PZ_SB)TEMjExXc9nz47 zh&dpn=O0M#L1Jk(wDckbRIJulObwNC5sOGn5Z!$aixABrq}wI%8Q4G5)SXM!9L}Yt zd$ATD_=@3nAF33Kl!4Z2+d$xIeA((hA$fLe+TC~~tITw-ygzBjkjP8H4@GfxzSaoD z1DOZ!+}@_`t&Ybcq-galC<`mA3WFqiLCi#P@k1vm;2+|PZBXaE2?Ge2H7a{e3i_=8 z^7i$v>T|MYU_wj?!fGk>qO2b%*?A{s+vq~zs*uX~KfR>>va^B8U70(5-6B0bJU%|o&()Kj$Y<2Q-A%B$73B;p0jvy@?_`jfB*e>*K+56+*g6+kE$x@ zluR-G)1?Xq_i4cWk_{!%eRp5|+*y-pRe|re&S55^B(t1pCui*(}6Kvy4Z0zkekTaqSln1<;FHrV!v%> zRajas-1t_8RaIiz4kqy$@%~JSmxdVRTxa#U1iQrd8j>hEICP+6-WjWe%DMF|8O)F2IabnX zaA;EE071XknWirFhc(5jaUQ0Tf|G=VU@H@pz@SetWxc{ePDwUv$fPt4Y>T|Oi_*ULH1)4G+BoZYxMxD=umse(q!tE)is5pG&dpy+BRIek zc@CK;FJ6~Isfw$|WL zx{!)ZkkCA9H*nHhR2o7Ie37}oh{MacgYH{hZ8(22Zo4zv3R}saNvrol1*N8&s(GTM zo3FTC(Xx3BjX|9)zf%0C`C3gx)Yne*&-S}WY5Oa!7cjy|)#kqisuXAD zgqCs32V!@I=QepJZ#E7;pe5n3Np`H0OU^eCsJtv!7bS^jqIqEa($tgB%7+=d(9%31 z5I8c?`54?A=Z*5V)?F-Dx&(*eXm@=Taw6dp^0fo`@q5K8u~?{xLZq!X0gn0;n$t`3 z%3IWu`om0A4FQ#rgi9DI!kY$9siAg@^!^F)7Dct&?L)!Su+DYPveonZkbiCjxb~)siGw`>Ks#pIy9yeQ*v|ob9EF zMC`8BhP;+H2%ICw{_M8^^pVSP0=>;er>+}6YxFEP?}LQPc3ju?>axFZYP@Tk6Mk~% zpQ^$)mV~cSU-d3@{*a{VVSnDocsekZFH;)(rS%-IDsB{`z8Ub~=h~9Lfy~V??wxm+j`<207ljHJ<5eG_#`SsQd!eq`&XW z*WOmS<&n`2xi{At;(GqGW$Otex4Y>XtIx+R-mqe(@JC`k z;D5iXvYlhOZnATK=X?0=&ndAB%-D^%jfU>^v2ZFKU5ETTqY@TT?Epivum#>YQIv=l z4E7*@ND7g3J_0sxoN5hAM0jVQyrorh>cQ-G4kuYWkd)6qkMP8Skt>o3&BG!z-E>je zHnyqOsLJ703?O0o>0XJ}`$V;nFws9wiKW>P(9Wp&j^6d$9*0vj^}O*%Fz`Th6*hY% zoQt4YX*aWMd=*alik+)tom^-mq(T#EFfipO&N~NObkmq8sgPRB&}lB$0n^)8aghil%RNG7NZjo__Sh-WysM@eG>Qw> zq-IoJ@x>ZgiVsW6^`5JnzJE7fT3SLZ5)M;KSHdCCvPfNsjaY92)S5M~jokghIY9)X z`?o`b^`*MnBOyxHLW^B@tKFs5-3xHMqwsv~a=VPuJKvHM|Nir~XU_rUt4N1C2_iCx z%Iu+}-4ea$G;CS>ZvOuMse3&=PFS zCUhcM9d~T^xzVnRiyjJrAyT{uId`=~)YId!7vWH^PJ2m|S|W~!JEcZU96&)7)S5&k zT-2W@iIYGU*T;_RcrE2e3p4 zBsBsFlRE^Lf_WtXJ~i!24Q*I65)jEAQ@^_+oo8DfpgKv|~Bf}t&ALOOwPLpF>zB~FC?puN*F0D@YAw#K)g2fMj?%$R1;{1}0g&(jGMZp6$Sq{Zl3P8hA>9 z4gwkIV89>t;?)nljOOjEapJUFcXs2DaxxK4ODHh0oDva3t(l6TLiWD>+f;hs>aNyX zf69YQ-#xN5U;#|8i@Rvx5U^V5$R@A%Ua0J9T;dg&XY-{bgmjTo-#qNwF4f0(>^?m> z9GGTrUE5ZbKyx_s4k+kGi4cxi-=C4^?$4O@?GAHDXg6UfEttRI#=aCkg`g4R`Tu-O zNWbGOnY33-4Uz-h-Iw3uCd%GZL)Y8b-)t4D2*1(yI8C3e z*<(_1le#f`RQdL=FOw5tfUq;4ZYgNBT#xeK?CAbM@BY@k**D((^M{Oo2{jp+!576NJ=@UL2|sTB{XE#p6nB&^jf1P_2-S%QQnF2=N`l>X`vyk zM3nSmn}g&Lc|;;DABWm4>VZHxN4RJ-85X@g5R^44sWS(=`y36<`pdQ} zy%QzZBHaW9n_?WIm(U4cU(C0y&LfC>XY@kz(j>s9jpa^*CBzpeU=dAXd^>{l#Y@_~ zr)buRSQhkBjuj2wB-#S)eJC}UjScy_u{&_2``b7;AQ2we{(Q?xIahDwB=y(7yq|Ad z<=#}peSbSFr&lWY$XWgL*J{_Blq`#_+0pgBmdq_`LE={DX*V!t$2%cEDF|Ly#k%*c zwly$NJ8sYUcXe`?EiSj#IU8zd<)+yb-Jf(@Cdt~c&4RU}&IXO}rVs1WH>Q^@U?CZ! zpG1%MaXtZc7X!^0?Mf*CCLfi`zF|wja)_cs?_oxu=y* zAHAD$6aXlwpFSPkrgv{$-yX5t;9G*`ZgP!c!r%JYd(nnic-pR|3u?IOgA!_xd}fhJ9a zpUgTn3th}Ng+{>IYhbp>H5kM@BOY8xwMcaYD+z0@v{(+UmTl^_(U7Y|iY82_k4r-( zKrq)R>J1Tr|51t6Fh0kE($cf7V9-;JF8fdhW*V&APSxymXtoVRCm<3|%Z91g-^rHJ zfT8lGPz1QvYygXk%P@tC&CMrpw0YZ@TsIudX{`1;v>`8f}AW4t99p%6Ad%Rni84lijt;U`|5<%W60g}Hr--b0B zd}5|l(xhhfIk{#uW{NQyT*^QvbFp={VkpTpNCHYDQA64j@=z3#_CJ|4i3_`|A_7cz z&E1hK6uEKWUkPWpv$M3D^}kv!XK=bK2^$S(O}7gNy&-bAv}B0Zog*n&8^pr|97H4% zh8C4}aT67F0V}4Av$#y&_`I?BA_9*{2WeeITD;PwT@VS}v}=N|b9?sQQyJDlE}|40 zaa%Fbpd1^lM&4c|EE{K$+-ZYwZd}C8RwL{oQcbBaIVog%e9J%wq#f37pe8K}a?nfV z&=wjDIdDo;RLWb*xqu}`v7w|u|Jfz;9u#%1;Wz)>Q}MfLr+$a;8T+X)Y`1_K`|XRc zsz0mTJa+R-PnN~+e@`q6{F1a=Da;Bd6O*-*w~wFoS(JA@`t^A9xZirS@!2x4!970n z{QrGkeHq*le1fz3J#x89?z-OP>-VG1_Kmz4K6$CeGSMvT;3Uo&TPOq>qz zCSJ4`2XeppE>EWa-=JY&CUTa!s%G`F-E8ac1JvJoTRuBKPrm_~=C~gR{5z-j=z=V$ zz1p2qvQUXs7@}psC-JI?sC3?4rJ*F7_H$U+qMe9YVhglV`%Wk74ni)?x6YU5TZ@DY zos!PBNq#7LC#^Q;kVc-Jk~9n{oqe~n+O10^#|G{_kJw{2a7t37g_Zy&afBRS7CcBy zT70KH*pI@X&a<_<;CCb_j+fwWFqv#{Bp{n(lX{Df0WVaO;)A5{kW~8lx@IU10bUPt zgNpu_ITOPn5WS&roLahuoQzz)T>`49_f+GhoV^GB%g8Jtr0o!*s3x}uuozfq#rF3u0&8@62mCOEyc-sUwyUayZr{$vqORBx%(1KS9!=mO-vf z$h@-a_!(r1>O)vHEcveUUVW&WEZy*;soO=<64ysStuC)R)raZ3XuvpSd=#x@b$F!x z&F%8DCRxgsr|LfzITl!7K9x3*H1G;)jVy`!`|jw^){33FH&p)J!X1@>s~@UXO5}+` zux8Xhac}#1{+51+kMii*TdWA{J6PHu*ddYm0qByE3koG>Gt@2e?U<>}yfy)bmPH)B z@u%x_%(OD2qxDsavD?`CwE5b)dqdmLn10{!dN~#9zuQe)>Hg9G{vJ!$v)uW9 zq)J1EbYpO$10AA^etZOOzyX#XZ(D5&M|Pp~^${Woa2t&d=VRdf17@~231n^^)C&Hb z2zsDxhiEydpWW?1^P1PrF4LABIHTQs-z1|bJ{1SMbVotTUc35kHI~*yyRMdJcafki z1%-;;(QbwgHrhg^QD)*Y2@-HKailUhP8$51csOg%W_!g}arcJ(&Jwfx$HFy}<<5>* zaW|u)B21~@gv;yKuX7nLMTcDE3Ku@zdZWZ84biMGDpr*kf@+lelhfAy&1PQviZ~q$ zAZWOEecibgOgqccM7T7p4qGi*>ZtUt^!~#clEEMdHP<>S`YGnhYin8H7};c8h0F~& zL6S?^i=F9%PVbkMW04gDNomKQN17ZzTTR*Ix4sE4x0q4V+nygSpS7gijGF8HsNePN zEvN!n-<~yz`)6V2W87wiMclVsg+Q$Sq$Uk3U57|F&$fxdm5SmJiPW+~={VMzi#QF` zTCR<(`bZ))(Q7`_D={A1r3;Z*Y`A#!2&=q_7VX$P=&=ROH06aEG5Jy2X&p()Mw$TumNvG|&Ii#Q^(Z#*#V^AHu>D2;*`goQQgH8tMhjx(G5yB|+fn`fWK zp^n~>XolK$s!GEq#ZWMNM8^Z&rbbD*6tkm7N`IExNQUCyKE!F*fAOugegt`s-i`RY z%T4xhWp)ag7Pv3(|Iqa1@lfsm|K>QOGt3LM5Wij59@xhNfGJ6eHcD zP+8iHF&Il3dqT#v>2~iel$5Qq4MlZZBuUm15-rO5d*AQl@yp}UA08OaykD=^^Ywf_ zU$1vwPj7b+M@v60@zJA4*G&Li42n4R>)qE6PcAt6eJQV=w6C6SuU`3KfiFXTj!-J} znk=9=sYzPARY{hWHVY;AQ_)l7Xu=M7nMp~hHYE*p!b!e;(vDy7P02ne+4M%ochBrCzc9F$5TL!@~keVKVIdt+2C z9AYe|p>iW(=mrG_(>S5UX?cZ=;;sK9k^D?>$q)hgx#@X`OcIO10cB}WM`KmlM67`# z3YDqil@8hvX!IAUlsKDZ(iCqXLs(dO5ZA{|V9yHa^=QS$gF8x7v-lOvVm7uKA(a*;=kK%+R% z&Ymm2zT=i3Fr@vg%kqBP(P8>N^fi@SyYP}z=rbImD;d5jci;e-o}LaUef)W3OT)o)N^^|sz7b~VFLlccL(FNf26roEaI6Nkei z9gntaIDPrlJ$AKvdN>&ba_6r+a1Z#qj+NU439&6cRzgd43SX9o+S388D1d1~6!tJ@ z_yyq-6%K<(un9_eWuQHqgVhffrVW1$e^+HNTP)buwW`voH-T5&b6>+uE24F_5j zb~^pJ<}r+y2I}nd@?03Qs{e9njD9yzGqA;nZCS5Y8kiPbR`I$tvFJ=<;-j3aTW(m~ zSQ|duc4EtoJAsqEPuBjr4an{CN#BBEgceV@3OR(^T#D_(z3r#_Z_L)-Io;h*HQ5n4 zJ#e*ie$rx4e8FWVW36jvrxFuuY?8Q`OI^zig_$LP#IJ#TIH zHT3j0HkW8QPJE0W&!7F6Jo9m6`g-T&x5-GWM+JmwncCf(*JCBQriulbi8XayH@y~= z_T4-KV!X5{Ajc^)AzWlZFP4QED?*gH&PWkL4Dsd?G~!toR8~{c6*T99nwg?lMpEKt zvUoAINzHAKa|~p5iHDUF3il`;#WTo|ZGj!&6^v zxh3%RR)!YK%yE12FDf1KAYc!cJP#p}ktii%W>z3^K~lIhH*8?D_Rzu!`~e_GQ^$CmO#S^nCttXn#f%&&ey3!BYTWnKXI*drm}NlDDg>7 zVN~=18Vlf?m1s(dGanI|)M~3-P3QHog31(1r$y{2bKGCahKt!nER7JHnvjcV5+r^m zkFl9g_bq}+QJVvT`F4p9-CrZ`I9?Mj@LPuHHhzJHsTsL{Hhb+_`w^rP9SEMU@4Uw%v><5**Y2q%v}6Kj4p zE}rblpE~F`V-oqJA%E(ZNxRJj&oy@|PL8eboc`>eKV9eWPOE=(M(@BP?~|iGHrK6y zk9if2$|s+NVoD^e2*%C)(ETwuGV zetRe=+=1rp^=S6;48Cj9i*RfN@rm~;O1H(FMJ7?Qp;#*WQP6|+>iQ0(j65nEV<&)s zDn>Lt-RA(OhnYPegp2EoZa1JoOU%twIKFWRGBh;S;N{AiaCO8$RnCy70j_0vw6TFb z-2;mGX{O6Cde;TdW2*QH-7)qanb^Tv*t_X|%p8cG zSV-v#!j5cMwIzRgd-b=C)!)3QKFk>z*-J|9>xl!=kve zMa(@bdZ))7%kJGXm#0B*xS~4yo&8DsO3oiy^x@>MPcJ)$1M6J)?4|&o?GCC>N{>TJ z53z6Ihv3g=UnFJ$wl=&daMxVBxAkRZWv@$X`oI`f;HTHI;+nMc4@>89MDyoeJsaq> zAVI7w6stJv&7T*X?I}7Jml$aCX!xexeXDQt!EozV$6slk)2*G;@4y=6*DvPD`5ZD= zu9LDJM@hIz6JDlfOxdxCjcH6@fA*sTnf#{GR;S~YxkOSdI^TLdf#6Q z?IVQo;#B+lI&k{^+8r=Av^Y@+r`#x%=Sj^&j4k#I_0B<)mNOqRB^h&Nxpna==EcIH z^b)4OZltaU!=pP&70*r(BO%I@XS9*1DGY~jG@etdy^&PBg6aCExeZqO{r>p;(j)GV z+pI61b8Duo@J}|+l(1zO24YsZUvI_59SMc9%Q0!3QhA1mH9WI#bupjVj*S%UWc_6B{U{ zP?IZ1mS+%ujggoDHCZn(@~_!22ZrkA;|0H4$f^Ahkse|UG>?$q%X*f25OV}<%>5d& z0Z*LUl$ubW!dXy=9*vnIe%%=T+Ek`sn_(spUOd+WX6o@Hde0gG=bBCif00auD^)&X z9+oIEhp0#l&Kn}gOcI5my#y7=L~cvk0Dg}WLlVeL37Of0lZ*P&7Fulb|9X1nV&s?3 zDgW8V$fHN>z;6D;?aREcwQji}JmRW6|8;*-;Cv^gOHozm`^9B+V1*ReUZ4cr;kI?fA?ppeQ+!jC7`?tUqK$3>|B`=&|8XS?u zwolRVqoWKDpgYV^C2Xn$kQ0)jG1yASN^Z0W0ACrDP^QiWDyHZvu0*Xv;O_5xgwP%D=roNW78E?zPcK+`RxS zj@UtJ)@8f__iXvEbW*?b96{gXN%)t}44*HS^`7);|^&H*WkhTX$pT z(_s5#BW`)g-OV-DeMsmk{J&6M0N4OfhU1$54^RU=H7V+a6ivU(0nLpsor&YVMbLS2 zU4S+pJn-5jeVc-_oSre?Qxsw}0XrN+EyKFc=7A0x(wrx?T35tAOo4BSf0NUk{M<-w zrsre>vRDrL60X2`mf9I|qXi7JjbMZG}U zc$ir-A)>G{1qHxLqo=PIh5ERO;`0EngD@ep7;4dx@P`IYLGSlHTvauCCURoS%s}MS z;;E&{%c_13CAKc}_BuP<_;TAq6Bp;@eL=R!Qo_q~!3D?2*_(kd{8*geLZ=AvXB5E- zfbtqZ9vFKx*>lQZrFs;$U$4+AXX`bEM@eCigT>2SQd~_}wCTKdClGv zBb8TYyQ*jJfZlud3Yfq#3gqUoxu<+qQpQU-Dh=}uC)w7$|^$d*FBD2 zfe_=xGfj#Um&XW!d$uh;mmFfevDSLU3bZKoGWITY4xU&DXbFi7u$iny*QA*DlJ}4b z$I1oF2!=gVZiM1RJP)E!D9@8121Ab3aHV!Q;(J|Xs;!#r4HY7cN zr1Y_JAAmu*&20gtOETF|Y0lum7Aj2|3_Z3>ZfM&i_~(MBmzSsV&Yc^8weY1w;BWCn z0osVjN|7N&I>8iJKa@vQEcr6gzpmb45#YE0`9&OAbPX}fY-9NR;YM|13#f%~tkUws z0!<@>vmPbae9J8BzdSJT-B>z&^Gt9=M8wx`1K*pQzkh$Z3hWvL&8t>J*vxzTYM@s> z+e8*};=QCzpn({EKj+Df$eF8=pJryh=TH9{ubS1*_ww$XdOBzEA>WGA-^acWZVzkd zu?@(N9PJxyy)z!RwXnyaCVF+Lm4&80$XIbT{G(x!VPPlQrw5bQPJL-B`2eV{u&S@X z?t3-T`h(DpepHs*=t@V>l$yQvo}LRd<3QtGdS*E2wPt&0(HXz?1vr^`SQVdZDgoJz z%V+4ip=3AVQ=S52+Z!gR3mK@uZfk@bwdcb6gvU`aI|{-No4)@iJdSO0z#K0Z(WBf+ zE4AsCIzA~)_hW+QAjOYj@^XRNvBwBfB4s_SP+Z`Edh|xYvL+?8!3>i)Tce0n$l!%a zd;o+lhm-P9m9?OaEG<)uLJI$b)h%TC`gIDZcrHqZ86FU|U+0RcFc}LFl z`R7+wRaU;X_~##sed~E1{lUMt+r+Lj@A}f;Kkz;6e+`9fMD|eJ`yCux zHniS2oQ3ZcdkC8M&3(E_Ar2*cj;vGP66-YI9J=PacNJrA;d|>;gD!)d)vx2{%9NHI z`kYv8r{MQ`rcN>frrx&OR@*gt`cS(~{kiuB`foPkY=rZX$YcgXJYh)WCYR;06Nh-42oH&;d=*6R@hX~2 zW1>D3G-W-RCkFfk(YFajwNv;WFCa+B>l=h3Sg;I%L7o*N^7CYsyPW$>vrwUt$|7|1AevyfD)}f)Ry{P`^*~57^WP+;ejMbo$-@ z7`iWoaZ7ysiwfZt3mD}u?(5X1S;f{^)!Pigf;PK)wFaB|*P3y|LBYX*5Sy5o=>PPo z23*MWv1YuX-yaZC)l-LO4=xuzeQ=S(Lg`UHYb&cJ24<73Y=>{Ju%``HygL2l?wu?9 zR>c{&r4#Y5#55ZpEJ&;tweZ6-mZguA_^X?G<=3mgDsG=HZJsPJa1R_kG}7(CWN%9q--&g6{qI z4~IWLdGTMgZuhlM8V;(csyaUNwunSO((-&d(f>)+XmhewYis1Mto)hJ)w7k8acR_$ zE4A8*5+nw~Lw1~v>lnQm7&m+~uwghLpuHc+G4Be@c_Qraw%Y6xKfUIJgtkkP9aQHe zQA$aafsbW6p8$+jp{-6tToaDHC)?9ydkTY@y_#X13&G4}5k1Ay?SYKXWI|jn85C3@ zs%>fD$=2UlP@6@Gs`ZJL0MfOOw;~kam#96pN~lT4PRB0IC{%*fyUG(eBrYOa#XuPP z9CbP>WXsoUNSb1bSU5Y18cV%~#Q<@3y|4v9M?F8fJYOl+Q{*<{$uvtQXq}YOx&A&_ zA}TSD5uma6RciXZDXLwoYopZb-yc0O@uOk!>@q+r%nsa`8mj=HD*5zOP-NJ#ihHXU ze1dIRTfPd<1k&a_%_Y?UVjG;PK>NqpJEO>aH^JugLJvmK!3KxsxaTL2e7*7!GE)@p zqcm?N=bpcB-u=z;zwh;%zxsZnRjl;_r#N*qR$W(L&#)LF>Rc_|Q@RA#3(jfEj@ssY z4qCNuUYt|6dC_xeed#>AJlBTn&CIk1p$-An6OXFLy6e7=fS$QJ|LXGq+a02mO))A<{8&9TX*?f>zP*DyXiCiY*o|ICM76O*fKzVTE$`W%IGtL}$Ne zA^_@fpZ#KtDy2fjIw^O0mvYlz$7AOu_P77jsoOC;g0@Gl6}uK z&w(&EE?M2|u^Dg_b$|5-Wb^f(l4H!j%fR}jGfoSREDIi%J?@G6WerLETib7(8Yy2~aeU_D;_080owHqk{P?cr zI5n}|@oj8oNMz*BL+{?MEx)Jv?k)J}=y=z$J+5e>R^0XLJ)@sKwS6zC8MVyG?LP^e zOmE+Iu07cUCUte)#(29V^5bw|CP6a-y&o1bRcyUb{v0HUJUY2DAr* zX8QF4iwt$T-T#0egf25`Nl=_GnY%xmY*oI;v;_x4f3)P4F)O;UpE~& zZ<8}o8;+OBSz`pOt3wsh=j!*mus{R92lFphEupKsn|kmZp7+5CCG#} zXN)+t;2ro9TvtFHQ8I8Uy1KN7WrwcnK*z{_=A z{@YIR=1eQta}V1;BR760d|@8Jp&R(J6VFn^?i)n^%Z=aId$wfXnLyzcP3QH^=eV02 zx;uuazrXx$6L5aFS0D)9$U*zgU%j1EE!B2wa`)-Pi4ijt$!Kz=p-WQkh}f6LoI%pM zI+V`Wsey4n6U^Q%l+NCGO*~h|cD}~;H^U#P5u6w`eU6zfk5jw+oe5&b;yD1;1N1K> zKete`_nK(i9~B$>crEV#qmwe++f3IL7fOEzj|_t$GgT^rNFC@96oW0|7wbTv;g16l zsW3Mlx%^QLR@VhT0|Rl64_N8}9Z{xu@E%7&#;^d9y+MRIvzg$a+0*6ANgh7e#AD^M#h5d8e}i6D8_O(Hv4clDj|!gB z*ynCtv@1V1yzi(@mMr4cUmmr8QC5DC$}%ZMYs#zkJtG$Qmd$@!Q!|~bgWj?FC*Nyv za@?oSKYny|EmCLnZfY^(keTV-@e;IKQk*VE0PlCH`!7LMSNO~r*>cN~c1>SI=o7=a z#j%s=6|mujM~wX;UeqH&ODylQc<47@#8>ulPjO(**`hPUmZigArY72+MhCVWJ~>?j zn3oR6$Fn{8vx(JHkG7B&ddhZ^Bs=%E+ngTGs+t^at)948J@IUOb}H^_+xFd66BDg# zE2`eyvRnN5GYI>|3qZqr=n&AQPp_>HFRP9W2mh5Hb{#GYY^W()z376M_q^d1{$IOh zW`2C0xtLt_qr-cmZk1Npe`5D^&EnI)86ekyMF8;gddKVo0J(E>fflH}3-1I2p4Fzb zC@`nSS%wGi)lYien7W5!w9?l)XDN}^b~dxk&>)IF<}7ldr|iKruEE6wP9-=6VysLo zZc-K}@)_!Lc-@k%K~ZXSxtC1lSq4Kq3v;ToL;)+IF6f$rq1g&TzTAkRD>n+&Mz;_x zJS)0@;ZZA<-+|~{*)r9?9N;=c8Ng_^C?3ZUUhZ9Ax<1E2y_QM`gF~WhHkiu-YJv;! z#4MmIDDfxmx55uMr3>rOma)VBPBSYznvR`&*Tk3y0FMZn@%#NBoremC72eY zJth`lNe{k!@t)3#9FLp;Q!l+ai#t22W~NG>fG2!5t|!?3#oJih*q*MVTL4j*#6b#8 zE5c{G>k>Z{Ur!HbQ1;yt>k5P=ZJ^yf|Mka@AD=%TYVjcH3QKtXo3cyxVFLQq2=|;4 zB=&596LmrH3*mh$IJhB3d|#BBd(C_U=>o||>h4RszwoC_2(6R|IG6i#C9CU$0>;C} z+d~c74b(s04D6h~n?KvTtMivu!E`}rvC6)8jcy`UQh*^%KJ4VA#%#2l0}E-Mm?(t=wA}*S zPnE4LHHGw&ecUl`V}0f(JajCE1N)dz zi_*p^l+opsLeJV3PAI83ac+S#zlsoLA?wmaLB`3wf3cCB=9vmisXYJkQej(wYl6kT zTTEBL&fL69$mdn9PY3v-!XD+edzhCIqmIsPIcj|byKq} z74B@7c#Z?(#a}7OwWFV+vwV&mYVVg&zh&Z&`vX3`-?W}zkgoZnpy=PIUU!@sO`hpqwzjgeI`Y?4->RyaXC;FdkFRb9y5y==cgVi> z0lqYFVDi_TSX=)iXx8#WMRj%FRl6-$yKDn`etq?Cs3FPv0SKORW9`pA@5z_#<>j-3 z-m|Y3&o+)P(dWRu3yatY@^LiCc7axT&)!|2L4I3WW6)lDrXZ&@x?o5`fh6=O4gnKS zlZNK%?C){`1KZhDrbIho%$d*JAX~PzjohuKD>AW<03euA8?+Z}WAuTjI2iaaCB=Id z4gpC?tZ?G+VMg0!2R9munhJP8_-zsPJ|=5#;Ix@)6s6sPg#=ls=kY?eoUYAG&&Ly# zY<&xHQ#Mo#gAs9f1A;rJQfu*zrcso5xpWwFbTnUBNRTEb0|O2U_;|Uw!V-{3|GOw!gVK zSLb|5+h6+|v~|5UDg8>>N5X!qvC?=ihX{74S<@2w29LK~&0{k2D1Yt{Aq`>|<_^fj zRNh^54%Y~O>aaQ3&{wQ=_4#XufL+W*^*RH`+j`(Q-h=3WnavSw2(uZ zC-vOn33))h4|hO-cj%5Eg4#SFT$*c&=@-uxT^;gtCV)nV>LLV<8`_ku!evSpQj8Sq zFa%(_IaFz&%0?})#EOlC$PLMOZHTbPRId&7eOR@wrXn}OC@qhTNKR%agcxIcDontD zz8>>JAzh|4w>F>_DuzP>Q@n_@-P+76JrujnMSd5pCsNqVeG7S ze93EyY8RNpk0Hdx>=AnRqu#?WYN#SYa~Z%VBO zySl!Cv*C24?Ae0Vpt_bRlAXqkyQhY&=>X|p9wsZ=ma^%=Q} z7&t4$aw^a$IZPk7`{*;Ulps%gHR_kLeBO&4qAZotT!UA!5nmL4SKJf><~~PKmXnxv zTd5xDCK41JBZOGg=o7+JFg6S^WOYWEjyZt{+!QYW3g8MkeTP}zzhmC)jFJs~=BS*5 z5GWv7dN+w&7$_=VMq!u=GsPhAp<>{4SPgUA7C344+fLO)ei@$~aQp>kPrqm6CmMX3_+R^;MZQS{A13MmID|1 zbJsXHRGgkZZs8?xs|^SVU7d$+usGnVX#3+r?AbtpFIzAKb#MA#0-vpG;H#E#e$-jY z7IJcrP&Fgg4;^Joc?kJdp_BTPr~Sh70dW^YBTs}m><)}OqX(>loiqKbW?CYD+?joO zc)C9)r~SEuRV+0HhZB}4LD8Wmuz;pE0+`j5JRWlkBYhb{X9K7%PjFYSUHCDG>j8t= z@mjLn3f88lp7)m_=koUXG4Ewfuees@b5V9gldR~D_yBLw| zM-Ui_5ts8)5;=EeY90)TFSSe;(M=WZy8wq+F6O|11mh#U{@Sp}t!k5n$chJ`fJ-lr zV20xL9$3*OmOVWouW0Vm9oo*BJE;4kd{+Izl(d;E*29nY)w#QIxD4F@a7nat0d1kL z?B&4G1EmU3>wwDVn`HN)xjDzK$15dXh7{H*L#~W%J^IDD?HVk}<=48l5DRL6WV`N2 z%k>&JvaihtbD7aT69Hm&z^0BIt5la;v7rBLzP54y|Mvn=8Ki|J9yEPCuEvez8?Z7e zu>F3Z{hx7x_OuT*(H&3X$_IN!2fZijYX-jMRDa(E+@G(y4#y! z9^K&h^XrzwpFjU|;~#*H0V)nJ4Fmw~-rdSmU;F#JNJY=1SplHKwq0=cM(5j#lfR}W zJ{|ZtJv}hf)%86mCuh~+(_?KP+V_IM?gQ>$!=AFhu*17&-#&@-59pbl(w`mEn*F)O ze=8pxPdlA3)c+HZi<29M|0}cYA+Jk&Y{2kO;QSolJ^rj)Hv&aug1ne&r|ybwm3e8_@+Ez_^n1c^}-|$^k0&> z@Yve60ktTYXsKOzZ(v>fgPPEvBQrCRUx6vhapFtg*PK=P)u*T1YNn_6&X21xCYU!IumOU5pT(v+uJ3g*;HR4a#t8Hl! z&m5X{h-6w@^J>6U4Xh}2i)WAtW8hWg!nz*~q}1Z&+I~U+OMNJ@_VTpFjxM}7l};(u;D%PnV_(Ozsz zOU`fScnS!@v8W1N6<#g|28OoAY;9o0YRXO!4}k_=bQ8h-qbe>k3=8+a7m%0?F3Xbe z#02snZql+cUpJAPj~hnHn5zqT1(FAk#8oE{I~@VAtVbbbLCh^uPH0iuGFYN=Z}i?G z?cNk`#33kgbIq>3KkJ3*YqG3EA>fYHruD^R$?5zQ{$nz|Z6565;6zUG3%a7@Tn?eL zYhB-M!=FCnV+?yPBH+N?n?NLkR)&oVPM=3b_~I9NtPwDj_N18#1miL#;+%yB`I)$WRux=VfMbNtb#ZMj;}T)uD8 zd6^S6DK>gJeW{uL0w;nK6}*q!E4Xi!biIa7&oTsu0@xPkY0f!2r+VzcqZ_BcJ!^HG zsh^#moPCl%(>T7RxeKLRO45_7e{|iL`WH+%{Q^5Ao-eMvTUow((b}o^(OSFLc9w1~ zyL&g{$dRu>vl!J0u$`*F1zHU~rIiuW6XCWM;iEq7rRT54#ZAV6({nT|Y`o1s|H%0p zRbZ9*sUu$-O*$iNJ7z~_r@Utx^QZ4h!Mqfn+-rWJ5csle7im2jy}1;STbeyL&lG`N zQ}BXdbA+&!2Sh<7O_mp3_AJLBNhrq{AgLrqk-MI*8zE?cnfjqrQv^4|6epP|a5VRB zLSVpC+37H}Eko5A9$;*y1*UB#k;piit+Lyef^o&AaxH!fj@jKgVbzo6`JEM}^#*izuJ`0eM{A9+>e7G0yy6`5 zJExPZI$ymhFHbM+65rZUn0|$!{w#c7t@b=z;~DDP9oZkXex1*^`+Izx1)Ek_6}{OJ zwSh#xd~`(b^@$s|!KAjsc7d8~9Cd$sG%s@8J9f$3WpUiEZ^JFInx zoEh2$W&oz9wZdM4y$4TbpRIZa_La#GYk~|;d2x~DyLxYlH&w0E$Y5O{;hLB}wCPHZpRnCE=oa3vroy7r2l=NL|7eGrhGiw{)IQ^@`L)IMhPE)fRTr+^# z4YCe8{(Ufx#?FD6>I#?RBQmi*a~pI(4EDpd!7z)&gAQnCh|zRdX29d{V09J-rcBwa z%JBndp8hEZE&8FhJC{u>{qJ~#)sBtH(;t&h_g$Zzp7wt-@g{IHM?)9V+iI$juG+)t zOQC5{(I5$neM7a*Cgh3&bCy5})`c+q0(aAxW5FQfX2lc+ro{Hk#F%w9=!-1bhXmPD zu{A8jAk&pJD&j20Fel4y0;Lu1IS1ZLTz|vcnrS0cFumv$60uv}vnop70zxecPExC^eIPx$?~_f9JnYV)sIYDaPVNLJ3^sU>y` z^&=*FKkMXA)qbe{SvNSCGYdS>5w^Lh|I9;9_6`htPd(PUoL}|pUHRg*k-J}BSbO)> zL~m&IP^yE2!`sfz@prAacU}JR?z-ojRQXZ)(T^JsPWnas7^;z$x0jF1zP8_z?@;+> zIP<{H?b|2o?v>x2iO-+v9*>;rneF?Z_jK~?uSX5XbRS*{Nf9?OKL2w>)}ugxNt2>%ym)D z^Tp4}Xuz$V=HM>W<`OYCDQQpw8!^x}heb;$l1(uLQ(I%6DQrlvc&Hy*i(2&JY%VBd zmhl0QWYZX%iyCRdjFdBOOf0$rzro^gP#OY}Tx2jKiJgY+Pj998l*yU+Rv64)Uy%g} zTNtQ10#d&om%cGk*modo@=n#a%ia?ws)I^)t^N6aI&M;ba8&4bJ*qg?&-6>UgRm`= z@4{<2eti9(Z#vS-I}W*^scJ3=Wz8D>yr<8f>sWvL!>jdqS2$o8N4APDtgJNgX#IX` zQEN~9x2g*h_cl0B-23s@z?w>vQ)~W?t0~w}U^3tp#acrmxg39ZMMHOifW>50Fs!-9 zNG`CR4iFKedv{;~Ob)3M==2e*7abb8F> z^qAJn_(=8myAuajL%0jU-yowY-9&;bY7`l=AC50vn3DQ{0{=Qh5^B)>+=U$SO5Qch zjlriNcyw_vCyBjxgB{EuBzhRC;iq#`C>L+waIpl0Dl4SLND7_hG8Lbo5E0Pf zT2i1U26pRDlP&qi0|VPGv)Gkkx{xL%_RGzPcEDa4?8to6!z{{RoJ`Jg99Dwt4A&_KJ_7Q!@J`lX6wPK~q;wZ1jVE$Oq#Rov z1ht_S(f~wvz5JdN5rr40a5q6Qj5Iw86`{gNA%gSLU36gZZdjW}?_H9dMAv-~znm*y zp0S)nrwgvguvj$+Pb&oDO&kKjR5410biG@YB}Mf=o&<7HGZdk{n+P}KHr4!x^{O!W z86ertXG+g_s^&AeedR73<2kXI6GzUZacQK8GX|KoEP%iQgh<+0LI9j{28DSr15RI0 zm9CPmYQ%O()NQV}E#0Cu{UP$l;n}Gt(?iF0y_G-R6%jH#9##c7p`$ubh zeDL0nMJ!6hwX5T-t39LPw%{u>oc?_t_wAhyyh0r;(n}Rr7)PhVA6>vVrhU7eC>6`4 z1V5H#mI^b3H+7h}@j^qMnrYB|OEv=UJm~)W_isI2WkZ=e^`gpd^#L(74(x?H968wG z__JoV{2zf4kHJr(#n2>dCbxw!PHAOf&V-9#hDKFk8Zd!o*&RC^F3_;HuA7Le+Gs}1OMb{&C(^DFA=U)rro2^#l44ZG zG6M}m2rR5M;MH;rB%EkyRZzr$|8x)1Z0h}AnyF&<};9TTy>=8)QosB#F7 zhM|y9ceYaHhyY9@!>|Ye?HiOTbzz|vpzJ&EZ{5C1?@;Quts{fy;le+s4}~4Oy=?I4 z>V=wdAgfzwr%RXXB6LI8s3P@dJW40U$bcIk_|XxWb>YTcK(u{TFkWi@Hx*$T=Up0q zxp|BKzt(b1n3$L1@^3Wf9OEe}QTO*UGUc9la_^tNZ@*U?sBAE68~HRaJoBep|KBEC z*8Yl5j+{z!{F0Jb#>LBU`fD-e=>iZIefY&dff3A zFkpcq{$t{J>z}W_AD!*)0vP(X&YvvP^MyyBC!$Nr3U1%Kd$+2*yv=*K8dUQ8&rMdX z+CJ&`$6$QTbmHQlwGC^(wpD-WteV(WJ$8L|rYuy~1!9wQMN6>dfa=$eX^hGJ11Bu8p0-s}7jB|nI2bf+&}00>85A~IyuLc*Xu zPeCmWAZQz88`9^}@g~Kl-_qa5a?i*VMv@RZPDTs_EkeeEr&OgFMuGJek--9vrC2>D z2so}~%0iehq~*xCu-`@N#vHInnUJDP#5r9|Bi%)TI!dNFhqJbx>s_fWpBusQ*QiD4 zy3Ba-Z>W{j#fH=dvlLi@oZu50+*kz`9U!_W4tU72mQ@&wn~W)21pou?-)1WK-Q|yM z$3OX3eOq;UbYvzkZ@4XPWbvZiqT$QiN{j!zoyxWT{<|(pDEvQFX5A|F?DQN7Ek`km zTzbi5O&Ud?TnJ%HD)>c@Z{fgyZkU%tAX|Cb5Bb{Kh(f%- z>?x{!4c)yY?TyarKvRYJ`*4TPVUvGC$Nj4hZpnXl@<*KGWRCab-(l6?hZWoW$cVmK z$Ucq)u#xKa49N=oGWm-j~deGWHJs>t)-321y(!7k_2@FfsimJ1*;R z1yGa1n0whET?|FJ8>gsABnVi;!x3CT>cx=Dxq#aacTfB~K>0fZ<;7}#JBqnVJrPpgxy%S;^}4U% zp0A^xTfSME{`hO-L1}T4%d6YF{Cq+x+r7NKI(BSw(+a}rL2tiwP05ZO!h;X80J|WA+ItoFAaQi`<33V z+rRIpt-&#EH*Krmbb(zWR=kPgq^9oT9G;G@rkH^;0gvjYyI;Bm_$V{^@G2~~A;I|xNsq_7)f+KW|7>jg{?bZkuw2llj zR&ej57jZdaz;c!-S?pvUv0De_)duZzRUs_o1rr@J6qO~FXGD#lZ_B*LX7eLd-} z{7e8(jj7bWi$V|&lycO9Wya-NVXzdzlci{^0zu4v(*=>gJA@-;Re&D!!1H~7K6^8B zc;<1|=>cG~Uij;Mv?GYgcdf@vuX}*CEdR1zzHwh#x&1b(J1{^>{k9F{_tTL_j$DKc z72_Efo~9XK{`D7*ZO*d(YjB_|Xvdbpu5eFqt#Z|mmGQxA{yym4T9uj(6Cw(d90&Qm!GKaYkH-nLSHI z(#3^xHM2dO`xMX&_iNs!&U ziK9U>gnLsEwvb3NaNQTS(YI>(ZGp&vq_hBvPZNu}S0sa!QFxAp==>ELFzz0muvs zp-WXu_*XdK_=t3@;PmAwt??WViByEK2n}@=UjkZbw(EZ{r_Vblq&dmNP3w9$y=nfw zc^k=P;?3k69rL*9(|4-hTpzr*NK=b~sV=gV)`c{)WJZkImxD z-$3XEmwZV7gtAlR-=cDlZLFI|K~cUX>7m>dLP6uD7}?*q4?x>=A7+E4STg9~ ztLMj09zSvH`KRNphYlUS;Be|h*pWGvHyZBzr%`3y_cs&KRMT zJJT3LlBI5>b{)lG38G z{lERr`B$gTacXq#_kKUi^Lakcb7-Jt^Yribp2U3yFNR}5&zlf)z$@lMR-v6VlzkE`D)npNkUc}A3WNwlKc?&U) zVy!NbeA?BOiML9qtfI03L3S9)4Weih)LC3ee;0rw8Zg~L&!wvFBQ}|r&5d=oWQa!R*k~anDfU7&#+DxC_cow9mb!Yl+-aF5xZmuZ z^0kOO9Sw8xhLQOshVa(v?VuF8TR8o|efrztiHS$AOvh*0{e0S&KK`w{xvkvKWnr%W z_Le74#$Vp>o$Ww(9C31InY92L(W{+{!dv6r-77P`6|6M?z1y9a)~*PM9bH(P)imj zYhEowp3Kuet&fK6st^J!$_FEX}l4w-uL@C4o+$5ez&+rQIGl|L@8*I_mdawSCN&U<*4ei7pz0 z%>aNC4?(Xxr{6#^RTBoP2sb(o&E^lZ@lbTbsZI43xh z7{io~u)~}sXo_ZBCR*tMA~Kc8!!Uq^A!oVh;-yTZxG=GK#aY>d7L9V8i6gBv-1(`gZDa?ghnpW$miI?qoYPxy4${`Z&TlS7*) zzfb>uexb+UcnM#Glj!(>c5Vno_9CaMbNEEbaL&f<6*=o%&X+t-snl8lvGKF!3>G&V zMNKT5{+3&rr!tvRF8`L=OkS6Fc2SO(vA@JxjWt&fA}mM~0S2;;CAmn%OTDAsUk32kF_yHw zOo}j&kOe#;Jqvssi%6WKQ3HdFBcocvL}mniS|90Ju>ImK{r)pmQZf57&40oQrQ$d238 z1m`E?r;1B6zje2FtLOd(x7PRYp?Hv5Z(dMm4rLX)Zyy19_vyA(e^AjkyKD>G8o%%H zZ};NISAPI>z+)iv*MA&)o(4ejd<5P;;=|#A@vfd_lN`Mnn}sTKUZ3^f?pvY#qP(HX z)TgAV;_9g@SISL|_`+6+50VSHu*q!so<)LmVTIdJ^v3Z+)#uj@7XE>*PH9OE&lY>!&oe@L_*}Z5zIWtmA)*EI(iClQ7dV=QjDo%viKY%Fvb*4H0X#7TQZXg z7Pq2ru|-2^?WqfaoW{TqP71 z3WFSpQdyv+3dC*gSE@-i^}+p`TxFABu0^J25`Fc}#bA>(zaOsWBgRDE}HX z3qM0U^ZJdCu0c41+7Ng!^tbHfGm(+2<1O9Cd~KJDy3VZsmJD}qAGz9=*H?GpO#9yB z7PGbwZ@m4;$Z5NeGf|2@FaM|eKsMw8vsdK@%zLS0H=Y~3eZ$22do52}bZW+LpP3vq zNbH;2^Ydupxn! zs#$jXPMM<(R2%3CujCoSO6~c^Qb!phW;UXifuea9^0*U)Vhie~nT zv!d>)n(L} z2kK_=a_^uKfMqQfWd!c$L;NhJR0N`awl!`@W@Y@#13EWhX?%P>Sy~Da3WdTrenCb$ zdP4+hb16v}mLkocbH|Jd)?>;-mpXi3w>tek)BIR)${VLpVx4e^_+p8_)8;HN#-^G|@e9*F51d`4E?-03hfxJvr%n+SAc z(z=S9rFREEE$Mod?^b#vYGd{Am4Z*dtG?HD=YMK@`s#W?)!?23;}NSWI;-;CjL=mr zmEPGt6-xsjQra6D9q z(`X7SnuoW{wS+*Wv&yLCO<>5Dtb{8wnJ6zs#0?vDEI>fInXpgYLcfRbJn}@>(miq; zl*!1xW<-M-A=9PPSs=Yih&ixfgc8g*oMb3#7Q?)OEa2g0ci3QejZFu2w~2>FF20Yc zl*+^+uaGn@5-Pt8WWlI>+z>%(PBf&hp%B1Uw71ZVuaALV9Ec4g3?AYttN}YBE3-wT zT-OYxC1g(XmOF(Q5eWnfgvAGUAF*)dV@xoc!x?cbgh-KI#yK8zq28Uq1N*+3I*lZ3 zTu#@1;(z0M-3}k8KWN!ruMR`Z8%HugSOVJ}RU#_ymu?5?A5kENTR^)+>?pr~ckZa# zyU^u)b79!uu`Qy2Z+m2?q)P1+b{5eei48SGrETRtq=@jpkOM_m+Tuq7>48J}#pQfy zft~l)j_+?8?Wc1qKe;7r93LM^{6pwIGYtf$hZ4sPdM2k1U$DP^({Ni$%-4^eq?)3{0JMxS$zMih2`-?`jZ2<-#k9lpZ~5AOitqIrq$i;6(%XXCk-53tY_m0LGzLck%zGFOFxGYq`OHsOq; z>PfbRs$^Rl%hH&p4JYy8Ocat|HrG>TDSf_~xGzi`*Gc>`GJUgte8KWZb<;^Buj=BR zN<+3)bcwHDDe>288-8}c|NOT+MQ!}Ah>h+oF+e5gUz34dzRy0!&mspou6TK1#O>RnN*6;Opkd@7s~YwgzhF&q)r-fNv?#rW&)u3s5@T~Ny=2ojv^6#J}lE^{^yw?qTD7hyR^V2 ze@7EybjuUDm%6b@9SjFu!L-n#2$?E>2Aa{NvH)w*M+Or+*&ju-z}FU8;wWGq5Tey$ zMXp6~U}AJE zj?Jd>A;<#P=s1U)Lqu7ZR)?VnAsgiTU})ek3DRExn*Y#JJ_6Ae@YQ}nd<+O~rcymp zdil9TfWagI%$1`@H;a6HS@iVuH?kuxgxZgd|4vzMeIA~^|2Bk@3S+r-X< z-(N*W>rU=VsyevH#84cq?wS@GfS>VILMfO-FR*VOoxJEwf# zarr-os&4;;ffoD80iY#2GSLCF=z4z6njRltET2K9kYTA4XroTyp>*U#8_4yQrcv9T zK6&{hV%ycr5Qs=2<}*bI_b+#2FLNXaWi!c6D^v^=$7`_)&r7B=^luSzLjae8DYfdb zQL>c8O0TmrR{);IIiD3_w-As!a~VSKCDvlD7q$>bkfmf+%wnpgFQTstDVQ={fS_y< zGPDp#Y7TQ@F}GP6a1wXgpQ#>ZsbYg#K>&PI2(;WFeKkEsKcI@q53sz{cqorBAch-I zOFgXru$FY!;ye;hgOF+|@Gi*M#nd6Ppl7?b3bUN%t56*Z%Z(SgG%|MXAAllp;KbCM z(lhm6dndF}Nv6|oz7HucnXw=LcB*z-W;u-nkN@&?TBcK1pi z>DeAS{QTvcU9M#&Q3MOA9Ma0zbFusx^q9^N(jZE378JTmWFFqcAcT4%LeAeT_vC`L z0z5^TXDF7=FbPK=AJ`d1)5<9k`wTyCIi6ER^&t)B_f;PJvHQ%gON%EOme+rOc%nKs zHPFuj8gM14E38Pk5N>9lapc6IDmGt@=0OlJ6bEPvq=4c9;1O*iccnIg$@ThEDrJN3!(djVgY3fc zfTFe&;3T|pMRKzMcZ3hGqzN<3xn4kM01EM}L1?@XN|I;`owtv#dj~}=oiKt}Z43N_ z3Wt$!8aby%({hr~~|% zH#{hv!FP`zF$r{%lzl6Xr9JU)Aq`z$=Mx`vD!KCVhsQaO5`TAm4O>sx`^wFr_TXev z=l35whB_Z_0PD+sIaT`pmH$dfz^3x~dk)sIcJBu*_({JIi|Z@yxbaH4}ep)LZ)R>%y@pnu-wn{zj&&40uH zI%~h@<=m7#9FGRX8)DpHqjDfW=>m7~3RromX>G6lvTx97j9g->93`*;O~8b;8b-nW zas(>?rC2Hp46WEEEcO;UfFT6jY`{O@BFLg_5tZX=0w(ymTn8{NrdudodvCGF_@GN> zBIY7ik?w+($-CThA-$}0X%j&h$Ht*7CqR!7Awb~=2`QCv;53N{-eQy~qVFTbIS3^h z{fkDiWKjT@8zK3aRTd7muwaV;HPa-Zpxx8bc11kmY1O@KA{<-m@!m?D`{ z3=o5yQ@E3ihQprEuZ4BI1R4T|T{dWN9o=)PCZ4%Z{X9|kvjiyTPM>sRgg${t{~-(s zO9@C+K*^;B_K0(y@2JLOFtebmKvC}_gcIVD0FEScbtYOzzrFSP7Fr_0rBWvnI4Or+ z6at!lWtdE*HA?mt-cALyuP}mM1L}n#1a&S8b(bL;>QXMEVT|1-d(;>O z-9q-U_;M%3Wi$|jcp;uyOr@?u#MR{}ocaN$REVLzbXq^3hBN>~n!g|6=t-zFauJpP zBH76dFOc)hilm}uLy1bAan$P{G3quzkPcXE`N_2n)~__z$^4;-nzb{^eKhwaA&SJCwsZ|XN-w9 z=Zq}l(G8>RDe!tz?S=Ig2|6C~331&JSR`Ox_d`_mDJR;{*1K}~dBnVF0 z`u?2Bc?w}stfNoiI@*eap@p~Urjt+H4}QA1Hb-QUb*QH!U` zc?tXFfzqd!dGaSF8+_asYZBQTorJSmMn84{X`nCrec^{^#3r{L2?rl>2LkqVquL19&4{ z|0EIKq7%;|GXbqZ4&~|#zfi9_3%HuXh9e+1f~(<*qOE&#>JkY{+CK7AGjy}T7T%5LBf~D#NH%>gVWE~EFSFiylPtE zvpsZMcEy$QD`SUNR8Ugaxf?0}6iMrrvdM-1fGN;@;5@x5YF<@E=}spQn>&BE9f&t_ z8UefK60q-XV@foZ_*9V~D&w z=Jg#yhLXSErJ0f$AbZ2wqoE)YOI$6bO2S<;DRU+kFH%dTK+h0tp_2cY9pNro_t&|I zh$rWt54B&|u)SrA@xpl(B`!J8Yr;x$^zW7MwrTiEzm=w8fX${nBF@YT)u`7!?2op;^a zD)we9D(&{VYO0wEUGd*AM`)Z;xA)2Ay~KT~);x@R6?mwVZ=cLJ6%e6a`vJqdDJ;I?7n4p7#<04$XfzPD`t z_5L0ZyR&!gIc4VJR5Z2#*=n-iWTqKHLYoa&%vA+5Ig zEaigI4`r?7fel-sLQ|2CX2K~>3{x5+`9nvis213G;Y>1U1iTn>CxK!{Od)q=D4ha^ zvy_<=!kDw7F3luYg*)nAhR}p^UJ8|Z8wZ0W1gvsIBt_ zG5&Fo=`@3{kFHwfL6`wuxe}Dc>xkDuavKPdIi5a2k8;4lyKx;xR+WY3UcBQ=)#QlHKzTPt(|Rl1ScVSqN| z6fTN7S9Jy4y--ksQC5-ZE5I=RERw9-q?EBG1XtZB4xAvm6ynul=PCE-IK+gcR7@r( z0D_Mr%C<;Gz#Ha46}Pg}JT3|GB!B9KzagbcB3!W5B+GCDgn!-x%ZzS&$FjTOUT zvQ!~@EU6|BVGQuF8pPX9QOmRODnJO@h6E|BLdD40U1vofi4s%>K%yY*>}N*-F-Y8T zu^{n7e&Ubq)8B?R9~c37&+gzCus7m4Kc~DhGL%{3v-Z}@w!N>~N)|c#B@8*i6+S&H zl8Q@Bzg=8H)O){SMtS+z(U1-8pcMV&HU!Rp@CR709)6XsV-T=;TKHEQfw^}wOBgB-AtfB@-83huiNFmdOIGbt- z$(>g`4&UNH0fQAsk(-)vMZsE}DOD;{P>_?Z_-~gMM)J2`{W1Lge0yWxrE*uo^AEdx z!7BHejXQVN1E1>h60sQe;3D^s{~$2$?%#CFTn1@ptFgG@IL6^&9z0%6sYcdDAsApJ zVG@|TT0WmOlQ7VS3scaY9yo?7>TxBy~1u%`&TT=M*KC7mBdFybr;8EYNY$ z$SVyM8~g8=TVu#!fa=g7k1R;~T6FLT`;8*(Be3FhBTBe%Mz1N0jfT0Q1W1s31ZH?+ zGRGH92)$K`f}$AB1glG+&w$t}ziWsCc2;DGW8NGl;HeU0++lDlGZBu*{H8z<_|vF- zVF#GvV*ALaM1Kk#2Ta34N!pT;k5g&lT>!mz-0tGCqOc#pImg$Wuj+39{_H6YxuaAT zvET4PVT-B+7^pmWJWx5^6a~mWh6oY!AnTUrU_1W%!u6lMQ1d+8C9)x)8~cA5oh-5TT~{A z&0#x(sOE~;AKnaD3mF6=$vD&8!ayB$B>!Tp>snoQzU9?(pLZW)SH%{5uRCz&_=iej z`_ihTr^DyAL6p!u$fQ`$B#;Dr>+e21^yOXs*Wb}+cIPx&q#r)qa{ln-mY#VU&v(fm z@7-k7b{l$U8h+%G%~mUfu!VXLFf!I(FfcIFaps{+NT?5}3hlXHw48K^EaIklL3|o#ge^0T_M~MCdH1xs zMIv&UR7PMaRZS$ue-;?;FLN5Mi1o%$Z$us{iJ_CdF@{IZ=vg_#l0k>Ebh_2V+HYI-k6!>VUho3!Upf-akXGsd-!zq=7jH0-R&krIt@fNsay5iw`T^=zh@El(3fhm<2vna z-p-!7$=?s#8!ZgXX5BXZP$vGPZbC;87p1ldgLDax@zi2@+=8XE&H49W4qTRZJ(J*i zR%PWbW2evDwNG^zrxlK-%$AqH_m}M{6CDeGf4a1~@%xMFg!+#&-_d?w8<}pa{{_(b zB!h{speJ3>xrBY{E`e_37a;To!n{rjwPb9`;Zc^G10k;PZkR}U5Y5h%7C{oZNL`2_ zA&R-$h|RqsE*B3n9pw|4#DV04Nf0~6lfEEZAj=dLfjth?z{94A1%p|u#1l=QAoQ;e z^}tL+j4?U<8IrN~6LG~{8{;C>S&77oyJTImJi50XyCJ^|;5{DT-{&#n9+6T73IcV9 z>uNR{qh+$(IjIzHe+yE@m6 z#X?j?A|uQWg<>)?n~Oww-gcZv#2Up)8mYgdukU#A)}$cVnFNyk1U&!c^jKjN4`kvII3A;+D|Pv6iZxouLMu z|C5QYIvzUrF4Ow7Sj3PEu?7~TI*MVYJb_V>Uc=EeAig52JyE+J=)8M$dDkv*q0o&; zONk^L8(=FLGSM|4@Nj?SXu$V@I0{}EsZKUD~`e>K+c#w^fN%3$9+Y;QLcxZw$Q z3#S1IjZL`7F%)e6i&*^H1@M=GybxNPyF4?Gfyjk5G=k2pEJ6P&KWUK1CRkNX?w?)` z-W<5!&CNtr1oKTPg*cas8Yy;W!_FVnP9FnGklz!3>r7=Pjy#&KDZOy$ccwvNbikRa zH+9FOWXqK@-^;;v8!xm!j5C%z zrfK2(R2t+mnKmjFikewy?40G%bc$CT)5VZDTd1-UV{${{6WTpiI)g8a47S!-abJy* zGF~jUjKXXp|Kg$z0<#LF2F-mZ?jZRKu|ej7CV*_^EW|^ z<>4qI6h20n0ltj21H~foXc4$@h&l=1RCci8nkIwat(i5qhDJ;VZ|L$gpcCu5DWv(R zsiE?qmH6bWcJJ&4vU^ zP&2t{bG?6Fh~i91gB6Kn0oOlS2*-Mf<@HOx8|{h;s9(>ImC z;$|n=m=xd9zv`E)ma8o@^e7-@H3Rm5uqN){{_mfE?!UQ797R=fp4?#@y9=Y~_d1|G z-a&=LyR=f+@V@T7Jg*W-A)o;SQx8*U>A^=F<7)#BeYtUF)yHw&O~?D<6XqB#9#{9h z^57}>rq^0+wzu}J0BYRj7Ldlw8CPqJ9mb*(Cx1Wh>+8F_k9X?nrKLvu_DtM~O?=by z^P&AJvssB>>nCqaciK;sHs+D&v6OI>67=8=7yX=K-Nf=FU%NQmIS|uvqNOgX^F=jq zuC6-@_Kbt^hfS=aE`exivURG+U)%*f`=^7=@<$fpvw5=}uyC4*jDsUI921!mqA5bT z0Qbh@IO#ETKSuPM)#CnQxXEdDG@-`BZ;u*<2=qbS&4P4ZBsm#=YQT*>1Yi!A|N6Z;cDMur%Gq=$R?8+-BA$Z*2E!o)%$Y zjs-s84Qo3SELV6u^DcjrBSV3%212{bV`r=A9j3IShBStaVVXxSe9n}xBBGK@dN}78 z8eoED6#}c+!n*{%=92r^;_-p>9?eKgiTayS2&XBeH=!1kO#o8X>4t};#0(8*R=`Qe|Wm>*731kvP~%}%$ISK5$9EqHFD!~OFJ1f~Szqre-5R>(w6Q0_E^ z#vL7oaI8PsGp_+dz>cH>s9y93OC)8ck~|#oqv8Xc+1l?{=Xe(w8+phxO-BjZy}6=; zT)!ikx-x=9q+*K$b3ng&JgfvC>t>+4$@@PE1-D zv9oS-%8t%MaR+ssZ8x4d)>lq6DTKLZrY3WmG)cW|I67ktO3MVs$3dnwfu^aiJyVe< z5C2?+zCMdt!JRVl*zdMWw7)@;-|~*KcZ@H&UbHogQ#!4{8qQqV*K~R)1^b-2d~Y)Y%?o(?p*WS zV5*qYAWWGV(Q`lSOx>Z$pVyi$uD#!z(>n3#QNp|GsgFDD4*mX+`18Q@*Xf`2QC}zAEZXlr zpf2!uu+>7dZ2w{?>qf{n52A$r5avWz!eweU#wfQ8{4zDE1Qbc29pgGkres`{Ezpeyp*dm>6!~JaV_CZa6ry zljFQ(-rVI6e|`J5ZpMm~-L3Dxe6h$V6y3`6niuTdS!Z)?uCu7~#oOrGg!rOkar(Pk z_k$Yq#OA3z%cAwyHnx3?4+zWbusGiF&)Yoj$9d88uvjgYKYYY%>FhOKWD-7lCn#qQ zvuI|ZCCN~@aDa^f4~OMqzUk5}cmtipHP5Yt$Ruy&?keLuRGuG;-dCJ-8qOBXo0oap zw@YNPhwAXE>PzP0#LAJC@p0FrkKg{hH!^i+EOB_eezJbT-G1`-Lj5wR%vMW^IUYIf z+wX=@rPvW6jTnHD_i$6vfFYs;;i`i2LY%xIZ2;T2Nn%PXxsQl(>y(vHjOPw-3V33? zO)6GHJ`fLyp;X9@b3uv7T?}eJM(RNv>_!$eY4R`|ZJDVjYT!xGdA3K5W$)rPdQ4TF zI`-_=TyR5-3Nh!uLdn`dTyr+>Q@@`%#n6)`yOt{O1GGQJV_x(EB@0;`+ zM<5$=8FzI=@g1n&%q?cUY0QGyWR^kZ@utK5t0BCAe2MF#WB_eA13K|GhDmQZZjzx4 zRb!XgiNjHI#}Czfyb=E(_?&erH`W9l;Ti~q2+^kLvNhQxoez}kTpb0N4SAGbGWzBF z`Idn%)-wZ-ype|k?abYLDMO4u#QePJp8@v`ao(>b5EO$Zg92pj(3@8ClKwNAHS5gH z_^uyEXE$}Yru=RAlyMJYTM40i2z5qU^HJyfbTH$9ff$b}AANnt z2|&OI@d~swnF&^wW6jV}u{F6lLn9_k1h^flqs{peOrBP|Kq`_Q%)Hc)!A%b*s}3Yb zXWWnqf$9)w6zhD@M^GH6fd$7<`WYs%qpmon5X8A-c0~~Q3i}bxKz7}-J8L(UYyazX z;-LNXBfA6NKQsahwD0RT|MlX>rJcbZvSy1ts>mNdhBxT0NXfhZqAEX(ASk~7r0QtP z0P`&Rz-Hm-$@c2@Qj4naR!;E!&gDB7pEx}EhPLNOUp%z-t?gUet(QA2-+fF0na&7$ z78zru8PWES#WKGmI?*~z!hd%lCUUMxC?)#!Ci8I-98(HbK$Liy+JJXcQ6)ry?uRHS zyBuMK?mc5p=`FHCxcdn0NEBp3u)+77uRHYh?dZkK@z4du34l}SQ2%)_)^6N>YHIq| zk9fhrJU_^xhDHV&ZkR~}DQhkvIgmR7WPN~xVi77M=CBHUajxFXPyGT^nTO*$*lx|5 zHe}UN1RY5=Wj&H&cC1)_mrO1aq0OxHJcjy!gShLQX>&dwg+@1_Xb-~$L1UvcGAU_k z6qC_o2N(MF&r)8)Oe^6SI*DInrHjTA>B@$pGTqo1XOa|8h8@MeS%`CR>fBU8L9*!= z3lii+;|u+QsCF!fg&O&JhB(pjU6sXojDCmaHT?`DKX3to0kB71wrZ`ZL?oJ^64F;% zcrkf)#Vk;KMjoFvYrJk%fSGf&etX|Z7JN?J#Z4Y{txHa>grn(D+*=|`EbCISwoSld-2b?Q|5i+M~&;@RrA# z~wJMTK#Cy(1rHYO&c8=Sbk`7ed6cosrU82IuqX=wx1%Wg3nx5 z>Rc#7K;Ih<0Rv=+`Iv{seyBS-S=kdczR&8uoqp%CWrvZqEKgPrwDq1-KOny}pWBK& z&eP)T*3b^;qrk$Br%M-*!Kz*!m3vjVBZTHWqmt_&WMm7jV7D7Ern`#8HvT9?D(IaBNn{E-rOfs|~SF-OL@91S`Q$OK!DL?hJ z(1UU`;F^WpYsF76g+dW?=h<_`o}!cC?Aa0EW4uiz^i+imJE-){>Qxt;@{J{^2{=I> zk(MtfXDJpI3I=FvyIgO==R4XzJJk==UzZO_fRgz?q$g3rqXTY*mO zhDvDnYSL1j!1=q+z0F&?A+Ysty6jYg=fl~@wi;4QViq7CqC67}U#Lywf$9o_WO*41 zS6P2+hkgNN&$1aQ1Okr*F=DmN^-W6-dMW?gwF|t%Ahgi_YUJaV&%`sw5)OR*{?y`l z%iYkq7XAiK;@F1mzxGOYJ(om!rWkEGGTQRzP4v96#hy>x9M{&%J)ll@s z)s@H05?DZZ|AOZ9AZ~*d2)%`XZ-W@c%?6i>NON6u&o|>VC~yfj#w3U$LE%dcN98*% z%-;-B#HG~vje9qR#Tc<#Ft<@c_FP36F@l{mcfbshXQD;AWg^p5VX-<8AxCG~O`>o$DTSlTa>MpWcN^jJ~aiD8z359tDlwFG24Me%BEu@zs9sKqv z>4kQi<{$dB^1>$jPoTwq^L>TULz@fj)s4}h;w||1X580(tx1n9-WAGDcLq`$MdILV z$AQ*E==itH#`VW_+(maM<5&IrX4#?134`p! z_^_pFxbwwW%dW@L6oBt8|MRpj%sP=S96pgSzwyPg92wr9-%58g)WdtV;CF53<$0gZ=83u&{cqk_R!xS_Y`j}HdH=$p>6XRy6OGd! z&ul)vFilV92nO}h!KN(yWLMb(=;~Rp@AsOF&~;f*QBkghSmbLg3FjJ-7G`Gx^D&hv zbG8`V6r~2R9V|d#Z+5^gH6DQ_RTXtfDW3c9+ya;XDxX9Hw8j0Lh72TT0oqTN>ts80 zd$}ntc`Jc|7HXuu3pOdLENig(<*QUZLi&pVNE+BJ4tz5&T~oa`w@bVCq8>5YC>?b% z73<39pdhC%U^rTJlS61sk1PULdJRJt<29N>V9G-DI}$>ZBEa56VVJ@iAvvS54huZ` zInrJ?8?vPuZwFi0x606C23M-QzY@e5p(=l-wqLIq(m(H&-DLmMsLp48jeFOz7BhH2 z#yXCps-}Zh#-_=bt{%sE#E#>r_l5xR`b)L(lTCLAwzT?1bt32f>4>CX)@w3G{|nDy z5LiOOE46z<3h!QF(7-N2K#D8qI%fx$F)sH#4;=@s-RRGYk8+O%&fj=^Xm2YVVR`&m zA7#$vlvvX=;o-B9$6D+FzzN0=37tO@>RXQmx7CMGKW+LR_4V#Q290sAwy(Nim07&Z zfxqO6)6?6ypcuXPS1?q~@aOif-s>Qp+V*OpKa{<$a5n7<%UAEoNoVcI@ImVlt49-U z-&e(N8uK3-8@09SeW#^){QEP5!5icc+qK(jA64*A-fE)7f zap0!2a*?f<465FrLkzODl8+f*C`J$%@aB?laji;VDOz)l2ke$qXJ32PG~`?(C{zdf zE1`IXHkP(BZjCHm)GWZ|>7rUh zz6j6(Zx1l7?uHp8{5Ua{lsMfpp*ekjR^2!#NgC}VT7%}(&{$S8Q%ImU|J>p;<^wBBvE>L$;?!0!6I>WH&J%T}Cet;u_ueCo#8VcSPG zrKirFJ(atOw(%?(E~>_h>A{*vu;xi(&_cP6Sm+5y8zIr#(!%@+ERsatMXHpGNO#JZ zLB!ntFdOx;m02 zd3|4i|FR?{sR?RSRMCTUZFbUxE-GkiLdpK)s)aS@Mf=x4{ccqT>SAY1r2a-vKouQ-*eW2b)AxZCDkD>|bOe*65nsnGyPQ~%Rv{YWizg?RJt ziOiny{2pM(QUAq$;%5DH{nQ)#gDd<@Ll)v45D!BN|B|O8Ct#vCi_ar61Q^7J3B2wF zNW%sK@3BTScrC~g;R_^btoO$Pl~H9Ux0Ib_emWbTgz__}vTJxl$$sri+Dk~Qk%rmG z5p;)8jK*qkB`T}n%=B;>S0}S#KTXGBAlY^yw#l!{7`f2v$*(Pgd(C)~7f?o+6T*g1 zhBx1nqcEN7EL6a&?-!j6=f=&37G*7RlrM6mo1|5Sho_)s|3Q}wc@_*QYEp!W&G1xE^u#ZVCvJ~SZ?K;P zzEwZ}HYnKHZEBO_((d2;fc($iGVRZAAD-^Bew+8+x6wxH9D}g#S>)1pHt+O@9+$Yj zdm1-?=*Q2WvYB^Z>W;J{+)pl>0XS)Yj{+m-n{1(ylyYJhyrG zpe%C5o;6PyQLcZHpcm&aZ%aBAekw40&YU1k+55gg;_ZbMr&zI3ktwxnfVL4^wsw;)%aFx~^cH8R zF*`C=k{UEOzzu?1Xg4iu5w(xbV_XtIstu#Ano_le78D1KUcnb1C+_{(TO#SF<#SV5 zv0t2G7xw|jnGm~M4XTsGu;tHJeg+)Um%25Vh6p$PfHH{<_n$l9Pp%#L5(F{^s` z&Aye#_Udncb*#_#L~zZKWhh!COK-?$QN#g9l(P57l<$wJUff^z0C7^yzJ?(*!N#<* zTdW+>+_Hb}S@}^|CTVlwYbDZ?5Jw^t$ty{0NGz69=sIh=SO~Hl^DrwJEsr6mN|Z{; zx}vV+KuAR?!&BE%ix9^FH)u-(N{841kpknRs{>q<(Tx%)r_7ZdxT691HYjRMKJ~LM zX``wfneqjnhZ7VxVB|zmm-gwo3_hE9>E2-+gZo)AMuAF4Wk7!hr7U~S&Sas9fv1>Q zqvB{TY2WitXZ`4b9^n7_A@QL8p|LXw?*_x{Z!Fq51Ty!^nO9f)Za>%Jlknx`;jt)d-6>uCSpyLYwC z6&&`jCH7N;$B$oq)wUw1F|ObPaK&4GsIUFdWa9Xb>cr1|XJpsu9&wE?`dL9iMUq-r zzEXf8wQ8HL$+)rC@vLe_h*u3BRMJHrb(ZbwGy5gt@{3efOsS*bF}1_nTu|psf}jO} zp0kp=tz)=F~ZQP@# z=)@Q$v&8&J3S4<__H`&LNR#nPSjH8iU-*O?tEwX}iZMb7Q5)gmakFJ8%sP#5PY2*q zVZRx|B6NW9hX54=@Qp@{qv-OLRZ1n`@4L(ZAWl0cP1S+egFOdE0&wK=KI{_CDrjfd0{w?&NVt1~;;Xkb&+uP=RlAoU&m_Vee@UFmPPp&uR}KHRx;x}#^} z#G$Xtr$+35wQin%G<|*~@ynF}Ox>HmyLCy#KnhI;NY~LG{Veu<&5;*)ZPYAqo1<^M zI@Woq;{Ry+_IRlB|Nmy3sbffI#<*0fGbc1Alw6{eGh?Qmh-R2=kxG(oa;?xRGh^f! zl}j##GG-$_-ImHFw(DS0*tWK^l$uDbMW~S5@7?e5_&#{_$2__@=Y4s-p0DQxeE0j= z^2;*POyOjhmvQ2qAH3!NxB!x96R3el@#V$xc%A1ZtPM14PhPin5k|yP9a^@+86x1qY(3X0@vrRP8!XCyrlGg+HjC zPz5sB-Du&XwP9}8=rL{2X@1SJaj<1CiCmsB3beGtxk`p&Az`9ERnS-UV#TrdeTn^U z69;A<78y(;WxC+n|qylUF;qIe*UEWW{dvHzc<$*m%hSGucpmKFnw<4;SzRt_RNWm*#R^0Uhx7iy6&I^rC)>FXeIx ztxT9n-eAIYB5gY$z0K;;R^|59ECRUijS<&|l#YiF`~AW_$8JSTm#3tB1%&X9&AsN> z>~IiFJ(w0}iTo(@AR|tuSELS!6U2?L4SQJNw5d0X6~u z%s7Q-%asi;jxR;p=sGli6!Vh=5gDvO0?`1>n>i=Z^~Z81&WBg+*~ZCcS~I2R^0e^|7FVMpKXYYTQ{tzj+n zCJ5w@jDYfuOsXwIU?VDxWZ8Hg4=aWUS9>MbRvN}Nk2WcoG#h$=ajOK@*)g-BKJkNp z{rbuYMH!m2hYwM?t%ancb&J$DZmuc1aC%qE&D;b2wPMp>W(O}^=X$*U^wPcN=?xWr zkLR;>Yc-|TTW;R861@yq{qp_8p`o9un^HOgK7Q9;a{J@;=@IMJhhO`;CUe|o)+T=V z6&#F-q6P9wi98=MCYS4#oBSa*qh%84n_{D zk%Q1Z(3w7+ZQeMG7QzGX4nbloA#%GI;s948eUW%ToUyjnJi_X_b;hhzc`^rAX4g}1 zAtAn|Srm>1lP5Rb8b+q&os`3~&D*na8MuCgo#22cY-sISTt5d%J$vQSi#6GRgF%k6 z%AqF1v$J1y)2S9xX@i9=mlkWZX=syrft~V!1+#z|JM10ymk<~D2xWhj@=)`rO!6u` z%}Y)u+c_mWAxrI$n;9lFSRTkdMRrG5I@J<2rV*}-m(29s{gRhBvO4ko+L`X6$X1GcAdI50_$FVCjOWOq?Y^oqD_lPW)Awf^IDDK{Bn13@SORt$|cEQJ3L4 z%!S*@B;Yy+n+vN5lT2g>77BohufC`B*N{Bt#efn;)+M=DT^|nGY z>SpO^{ZViU@v0DQj$f2+k3VWj*KOeAihJ5*kRi3Um_Z0^NmNEO&EAKQlTE5pHxJ5Yn)R2JX(G1qG{(Jw)Z15{O(ZWUH6A)64M-^HXs&&x5y}$7Ok-8zi{otboLk zOXZDxwWP+BMS(#NEfrSi3L0*}6uFv885ahgZc1r#`RQI@C8ha1)u_4Ddnq|58w8k?^v>Y%b*3e=X=qPO$sWb*;x5; z7-4J!y?#-vuRqoHP%1d_)6xzs^1XNPYDB{OXH6-;mAj1(vlOO%` zTmrA$qojbfvi_)Rc*>56$r~=94{TZUf@lBl_32ML#{cM=>Q7%kH3=*#?oQlIm`I z8OFHx=F&2MA=4c-yqo77a0;1@&&>htUKv&~WYgQDA=d1tJ>Af>4z%8b3hIxj%1UTf!QAMvJs z{L8b=>2QkTu#FcE*mY8H=AcD*4hn(Fe!}|+@(=0n(nO)$!g*iZ?7SZSkMVO z>hc7emRE4`Vs6M8ZbN_Jh_eCCNCLP@@!|vJJL<>VpN$_fYkK%T39&vF7dQ5zXy$d| zSX1I;`phS{brjxm&Z#sd_uV4Qgpb3W_ZYOCG?@xh?zLj0R9P4&Lu1U^3d#g-a58ag2~)by3#;%q0nMdi zLg}gps!u@r``ChgJG=F%H-y4;C8jJ#byt4wW@j{nZjgp%f;La z7L_H!dcy)!VB*tkfy7%}4>9cVW@LDA2B3B_nHKMPv(u09qlf{9Pf?j(P>**pcN33T zD~h*F?$m|LXy6!d0`)3VlgvUPjh@KxJ?05_yOXcIe>b#2cfa}D6ROSDYR;m9E1(|=WKi=j?TTQWx2w)8Bztv+buWU}7<<%7DCYqy^F_~hB;5VNJoJWA=AdD;4o{nd zAjZfbqr$4#H7zZSw1LFM@=(IlPmWtcH{y&B;$gIn5Ra0rh`Kc7q1858gxEX9FPojw zU_qf|+31L~(*nt0PBj-%!$uA`(!;O6ggXK1@4fyLYnqNuzK)n`P5ko9w4!(XkHO=y zt*hr%AHLFZD>uOY{NuxB)e=yU>|MNM@r!^>9q&|+pWq8kiu*yEcdqU3w_64gty=?V=$!&4G{DS8>e zL8M9|K>)>v2AcbfvwM;?r3kD!U!S!{iku+HwuB8eD@=UKB;aMer89hpG}EEeno_h3 zrfKZ$6yoi=fIejsUy81Xe(x!l#90CcRU2394+>AO3%iF-hjD9|CL|gH!$>VllLnAZ zu*u??%Gn=g>#EOtEKE8JYt}a8{{B4V%sfG7JV%sKv^k@i!C38K%ao~DvgnOCz<$U~ zTVoRwi>)iOK*jn%XkEoR=?R>aD;h4tGO4r%7=IyACV8*Sm8<~|rZvdn z{N{s??8|YFWGC6jRojHitFVD9NHJ*npIN_r@|^YO?B`_+=yh&N+SOAdt|sf>{x)ZE z)JKK?(Ktf(yX1Rs_Wf_Q_T1!}7p7Lj%$COQh0*0b`_3myJVnpj8I64LMipB@^g>UPt0$>E*4WqKjyp2^0n zjE#qEK38C7c5JQFMrWT>j_%{;gfpFS^DK z+?}}E8|yZ9f8P4ZFPB!otjIRDHd6FN>z?mzZ?C`5*4EZn!>6rey!H}_p95I5w=aHi z6UnSE@?lthzHQ<4-oEiQ&s=&P_Vhk?=-uS_ERY?#wyhihH7-AXwYnXdT3UK;U;df` zSy|~RD_aV`!9sO*Ae3zxlz+qW!5yB%YcDUHBj%Z~we;7d#`d%Bdwe%N5r0`}?D`%!AV7lg8CwFQ+nfbXW;`UQ# zLoUN@If1gW(-Ii-NX&vTE;O{E8!O_GhBrb(q69t?Aww0LWn;X7khB%LkG28nTbDVS zCy=9=al)mGyH9B>m6|+=<6|3@xth!g)B>)RDT)eFlq5}H6ku?paWt)aPs8d*ZNzn5 z1z|(fnXk{X;Z;FP*;N>oNI9LCXQC^`nZ@^Ufb2U-h26|7uYv5irA2-MQ1x-83-&jh zr(V%wG9s84R&?xJdsJs=>%Yz~Hl5dLoaK01aqEg``L=rjeT6qduTox=1(m>>fGte{ zZv)5xEczHAYpP)IbM^k}896vL6p`rZf92)NXNO(gUcVS?Fxl~>eb(dsS4(O-bM=0? zWl$8}1W@>y;rcJ*U|#hyMy7rB;=AwN@1BX%ZIcBvqkxjJdgk)osTI>b^Zr=W6s0p> zwzuGHOei}OC(@eR*y8nIWJ=BvKJAG5^(Yu(JqEiryy@Vgyu)U5=p>`9VHgzsOSwd| z4HuaUaGX+MB(2mnuS_mO0Za>qINNMj?6p1|f4^t9&Ecyhp8f}FuUf2^+zzqtww?0? z=imbnU!1)*GtEOO4*(KLiIE8fqKIr25*Q>i(JST?6goJSO;y$isU$5dSiS9{t31$W zCksf*Z0V*Il*xQ#f;<}^lpwsOqo9v%H5#KmJ@}cnG!nDsvFW|BG+?5V7miC4WHp7S!Y+xwF zqz)wVK}~^El|Hqb&d#HzGE-O5_3Zv(c`&RN_`i~PY(!R4xO6`bd^nPq_OlKQ^Yv5J zD`l@N*-^UC#Y0{<4AKw36-lLkUR>NKd~y5O^muy3%aN}=pL(26w}0&U^eHd#Q=VJ> zg_#kzv5DOWIOGxlRxuG_HZB(43nXLQ-*Y=t;Yx;R=}mezXeY#QNsTXwuhyf0nQ8Y@ z-G+NO9CBtY#|GlrN{y)$tU&VZvk`fp!)L3J= zu(UL*%g~4rLvnGAq1b8ZN*$Z-rKI%Ow$<5b+znO=b5jqV(i{Q7Fk~5$DnW)r8Hfq2 zEA`NwuZRM^J6rdnT#0GIxAy7_7cR8Myar_SCo3>3ipErz*%$-a;K78ioi0eZB^JLzEt1+cMf974f zG`eE&^sU@CFZQp>{CcS7wA+wg;$$1>9T$S3MZw*XdDBB~5m(>W)I#FLvYq)iT-t6B zzzm2qo)svzrLki%Hdj;nCcLTt+m}OiS9UF`et+c3dq0yrPbHRGS93r|7m;pa*&4~^ z43ZHeN>_}n_rduhMs-6~b`N)pOm*!RRDY%9W3-LYwtu6ouDRzC(Iy)(6jRj$MAWbc z!%R30u|8r>{}X*atDVes;tNFP z$ys$Pf7@v|Tf4OVWQbugEjaDm0@bPg)>M@ePGWJC67zP<$?oDSXQaX8V7e8`#!MQJO+EKPv6``ZKgPakkk|U`@#7uSo{8gbW1ch9n-eD=g1)h? z#r1V~-|uT)+b`UDv9Q0#px8jR2PjyISrQN<3v`6F@W&8=4o ztn`D~=dZ54g)h&I6ppxFc3GBxF6iH|){%>)BVWJXsukNWbDVoEziJ<~a066;A+or= zzkLY92lA2lvN4vnSj!wBr|yF@RyROtOSSZd^SGDpM;_#}mjPSl?bGoBj^ zP5(%ye7lBmQizCZHSWsb4IuE8%wzB^7z`S%oy*zQsmma^!(Je%1VE6Q0*D8xH>t_v zK9#z<0&?ntvb_mDDBv3A;cr+#4hoP+up`J!p`Z$ZEgW=sRd|oBE!S0TT!8aHPhR#r zBzB_Z%o$(Pp3SXgK{8|>w=WH{k47+zH|74_hFQ@XS33-j?Why#v zHWwa72m({($dnr6#cge?jmRV;ntKK$)?$J{F_nLDY@D~40qgfH=Po5}bZV!I7}%fp zdL~8()8EG(JNEZ2>EBOu;h58kC;AH4k3MW=z+;?}?PZZ+>Ev&FOSa01l!ra=iL$vA zH8e2(t-tNffrk#gQEM-R|Md0U!#@9id^`fKSa=%S)-UQC|Mq3Nr^k8A*Mz#)FTQIZ z#@8)+awQQi^~|Rw$L(V3)?GcUetGlhrakt1?30j!X7}Pr zGZiBB#F6Z^L(ZoGc=!HDXE^Ahz)swCwPV|s=}4p z%MdW97c-0?Xy?0yxt@pKJ&fM^_!bzn9I(loN7ynpMh=x`qy_qrjDWbGzC!Sp!m*7` zUHkqNPl_vL7g4|_RVFYZxXgbfJTwCk8ljWd4Y?sV$V}awI)L!|g#lz1Hn&u0M7z(=DnzG_f+?vxJ2W>1)cLdl5S#4d)u4V9FhyKyjo zBw<}!>ACXK6lN(il+6D4u5h1a)hp^*iHcmJw6deJlzsssd?iLE8*N3@1vP@ysML2H zR=fOZ2|tit9Bi0`6VW6~qk=$L)><8|xf+qNAbHg-1A&;zF!@wDYiZ=W-Tv16@ap#o z$JVuh?COzE-@Z(Kx%uK?=!T8bW+*jDeyoBZ7^{reMY7Y1frzY3 ziLt2E3X1}e<0u1zf!TWQh!%sm=npQ@EFf+rylkUI=zDKsPLH8~C&*R)saPOWP6lFm z_?-7zhQ8 zfH;UbFqA^HoQ&0Ajv(=X*z=fqugFj!07oC~TBWKoeLkyWZ3@p=& z)4eBoc*8v*q|>gQG0~~jByrKL2|2Es^9dLVQOR1eo(v5>vlgTjGi>h7fomB{$|WEH zi_Bh7m<={JLO`5OiaBPaqzQGT3*~v|d`--68^<27*%_KoRY3AvSF%|w)rf0H>0#@` zwf{Q@;Ia39u`=#LN{oTO4L?%a`^1Ol|5KJ#=ZmPCTmn06T@I0y#)jzEDiW9PX z>mT@E^hdUm6ncCi%_7H(oa0#;{Lw&WYe+aSETT95Zmp28RORzOT>KQ>TIlF-_=wAa zu)VAW(z3IxWoh$ELqqll@7)^|WUio_r)F6=qRE^cV=t=j%)B0)>Kh-P{ttweQ(nU9hlqlS%8jk%aS~zJC2$7{9LVTxqTN*^$;w&z|)4 z^||!M-)Y?v=4ij|tgZc0aae`l>r~87Zm(-Zb6h7edI~r+_xi^FnSBsRg}tB_?u);0<9s==9@=y8%O8V@qfJFKaUXc0S{Qi81VSq9Wy~nYi<6z!*WOrLKMIaG$QmAz7 zDdl&qw-C^0ZV0I61KmKKNZ~Q7UYVZ+;3y4*1#y5YBB(#2m&KB(On7*MdDVlpN-aj> zW@r}Dw4T&*7R_y`C#~D|&i{f9$+d(kj7$-u2t791BroIo8GS|FDSyD^1go`@GH!*#P&#M`*|_y?yT&U<bVzJ#tVK+u=u3kU!?OFe~qj$*vJ}Ku?ctOcms64T`k8Hs$GHDGB}OTd}FCfAl9^2~|N&L0W$*zK$I887o8 z?QGU7DvOiixNCUR$g^ktN7fF!sCd!ueEQals4FFw4v)6|sb$g(PvI17F_v|8XBxg7 zRYB4Kwx6f*f%4yleu{b4FX)?c^>&tfhQwd#c^&Y0?us&&LdN1s6s{1F3R0D8Dnj(c z;ELlLBJB_uJ|#CStcH>Ml1)zAf+*^3u!t#Ufm0B?Wgm7%4dlEDvV{A7G5bF*fO&;Q zj;S<|0VC|iY|Y%8dzlc;q`Y|V+5-{=vy{$8W!=HSL&!-BcaD1|Mx)(~vcj~%OF0s2 z7LMZsV9bfjupP%O!zn{FGI@mW=gm2yqLdEjVo=8Jh+V`f+bDMmcej&U%cEw=TE#rU8 z9Y&6VEfLe|@+|&>m;K1QhX-0VJ?%W->(b&9+k3##*Z%2G_Ro-;UJizZG2S%IN+HgC z<|G#Sxo0C$x@UdT_S&;=<52VwnJa^SkSao>QnPIc=81f5Yt8d|YG$B0V}ttKUkwZ? zd9LY3##s^@3|{hv>lxV;JKq0`i@MzOdK+q?kt-A z`s{tg)cL!kZFeT7w0?8Uhb^nH#VXk=tcsgGhZzl=MWx)uSDgm9ESV%QJ4{{O9Lm}) zN0=zeC}?iLi8^TaawF<3i2x*)JK86)7L!v6n_{wgRot%5pK&yn5^W;Hl8uDY`c&TD zGgoWUR!|sHqj{7=KjBZa0Yb>9456`&D{IPlsGwvnFLXmPcd^2Y+|CBFRmRB_9Je4d znTAxti&YEe+_N%k_6{NHUmEzNb~)v;{g__jyK3O~JvKOff63(M6tH9JFKliqM)cBe z0qy1qo5iO)=K5H&^5)ukiEzh}@87?lDVhwi=>jd?| z17pvIt7?J^D;~=LxS?nAFuU@WOncvP=WOSFEdg}Os$Lf4U9s}RXU)zSow7zfsS4ns$Eq zr^@1l|M4!nm;X!@{u=Ibgks{vw5tM1rl;I{rU-9e&}}C!Z~|lf-F*i zr3GB}+~aJ_76r9z*TR_AV_m6bmVZi>e-*d3heiJ)Cr-aJ-8EoXrZ4rI?I&N=Xc=Ch z2q@EhjRp=IHQTSnbVana<+U6Piy1ytx32oe!MoodCk|XcKDs*bQ`^*EZsSFXgTU}@ zroKOXmj?69#1WRKIj|_PGmbZsB4h=jY^7pGJt#tIc@%8@2QWGyOk{6K4HQ@Nd>x3N zkrYIS1Xf1T!Vu6=oX}V`kW@JC4V@H&?6UDf473*iB76hzCpi8LF~fx~VcEisR#F8& zS%t$H3X6emWtJsC?ZnoA!V?UFnfQNlIXCa=%jSEEcvh>T$juyRZW0EwsQI*5nKcPx z@a>9sI~AM>b?m(uddB6P;{k8tmkk_J^JU|*P_F<>j^iHt4;S}wtnK%<`rl9ytWX|3 z8^<%Ly0n`bs{m)<#gTwiWK*Fi6LUgBrzNlakkHv!o!HYhb84nLB7E1xyLrdQrh$pe z!7$){@o&%3_Nuu;e=Q^OkHEk88%JrpZ+tkJKk@GJ_2ZR;)c~RaYPi0K?oW5Nwim{9 zjrva*>-=SBo4CNrv`6F9I_rka$k%)04A4tZX zQujKgwXc%86nLpVgk3*t)bM8U>)U)$OMcA2nT^lG7U$dl&!zXxsy&axoDMh@v>ZEE z-CpPwTy*2Z`rh>sk4HvEI!9f4>sH(qUWnNIV^DMa%fltDy$i>_Bows7Ml6|`?wVTL z^?f+aC6)}O)uEbb3}I1+Ih@W0`Vz4w&6zRBMeTD_!Z1%km9vWR^+btEhVr<|41O*; ze%k{iu@P8i9nK!$;vx|t3odtVz>qHU?G5*}3`Uv+uV>NAC4SxL>~gTuyoYr~sCR=E zl4ejy)(S;Drp9XEIVw|FtcM~0EaTkZa&?)|W;;U_nmMa%2&=tF${2|6Sf+DDIL-p%VL&!O7^*Q!_s?c3oX#4MDG919j+r)` zDXEEE26%u!2ci&#k7oF?q&~I!IvkO4i4e)*yGGJ$eQ7<();V0IbxAY=Ts=O6@kDsX z?yganSRo!JavCKlX>($2dEsve$~Xo#<(}5wVU@A#gx?quIP}&?nvOQ>$-3qtf8+vTUSDjbt@KwTV=T8 z?zi)9KyNXhAm zSG)aMUSAauE;?29RBo$!_rdfe^Cljb^7b;!ICDnYTnvK@laooX5k?hc=)vrd8av^i zB;Z_Rwni+j-$gu34`S&f9AC3SwisdxQ?NO^FJ@U~p)v%0fcu(BAUcex=|F=jsMt%3 z`b7dvyKr!SZ}4DprPdtzd?j;(=Ilk|Xo75q?ILfyi7Sz_^HC#rkO`%)kZpW=?C?sFrM&4{wpnsLXPb3@Xr`rpg z-Q@XC_GUO+DSwdc)O+~XktIM-JpFR|x4YkxW(I$C`~EcjVoJ(or>cX_jh5zRxWlOK zr+cjI`P>wjWdhFg{v#7Z=`;V0fBLkw>w5{HVgYI3Uv?S0x7;{3u;@cH*s~qIVO>G z>X_trWqvBUQcrre|0cXj#xmdw4IwPIY?hr$eSRD1obO&KdL{Ju=Yw(jj!j{#`d^kL-L$k(BFE$<8ZD_@5jPPWG0`QzZ^ zh}&e+l#7!{K+8l2GHgHW@+EqUag2 z-^n~`4{~lVZef{9ZaFLFm778AdlF0p(Os;TaZm*7`5C>08!%Uh$#j}W@~qvdJQk)% zD&&sio#gRiqIm665QmE-q>YFgB?lnjeMeQ=kYfQqsVRxB31Y8;h$s?elY(BprHGykxBtYay_a0jITFNSXJwoDSB$<)N@o@^7zg<^m z=A)0qXQG}7-rbjA^6ho&w{OE;BM~MI%Heyn=eRIDDp*p4rB-1@be^EW*-B2065tef zn*4#?n`7fw-@O_=_R-Y+KZvDMx3n09q4aEHbqUDqc*O{S-dPgcxLDb*3V z{w;2*IyOEqbaeiWV-XMPw=a3)>KZou<;!G3NAG$*-riUf{ywcbB4_HG^_^oQx$ezj z+f!y*BW4=9zMs1LxoM`YX!7OE$D)LprfRQj*mT#&$elF8kDcFA3qV2(l!XCjjf|p= zLVSB_-od)<*E@FC1^&2Db}#HO{c#)bDno=y3C3;)N*!|)S;F$Hrz+}jm_ZqmNah@x zwM+k}x27uhz(`KQ{m=FwcWMqxi4c`FsN9+j0~$A>Vi8I+p0^HJX{*o=&|%B z1eK}Qlg>(>uihvm+1(?2S24wu85;2#P!+>X+kECB9aP`V26UTm3o8)ti6apiq_DTy2+?_fcXY7 znnL(tizrcqI}9~&GO4hkO#GaH-Xn9QRH@bwqn6!|e2WxQBK1?&;Bs8#P9qk zfJ;Xqgy9Aa+pKNGfO`1o5yhS4hzJ#H{h{t0DpgjWb%qWzmofbr-64<+9=@^Bnx;tu zj8+sHQqg5Z5+einDeBD;fsf31#y$2Js=2Jqp{n(O2IFTEy9nX4_y|IZXRhd8I^F>B z42HShY-XAnT`K6dA0DXzJB<%qa+qWuc+m#iHRoYP^s+K*6+_61jS_@d@vNak5@n6V z+A2619lSI4!n9+3Y%0^P*KAEMPkyY6MlBbjrp+5qsV#g`cD3pPPejX)kvQk(DX+2< zfNt|4>?G;ryWxSB_YZe}+}kPz7va#mqwNVtj~~C&A2VRkWO{G+!t{ABfsamqyz`s- zc>9QIpjPg<6R~TuamU!-UE_}vhxQFFnVvWEW!}v7#9{+0gEihPwkL(Q=)<-fLM@8I z!{_kr7n9Bq!yb@rUjNZQ!t?s0Yr`G`)2Q7i-#MLdpKZiu|0{IG|HTFR3~ly;6qb;s zE6?^tOI3a+R+=ix&c*J670ZHvL?0Xw^W#hxzD>Ii<_YBc)X%dhvPlLF=)IBU6tW17 zxzF9bk!diDVVU3%N`Z~a2|l7tqGDOU-(z_L3#gw_Pbn=H9HABZ875>EPbJi4EMk>e z@(-OgPN51A#vsmdMLk(keucU?-;8W7?e;b>x`bK_r7(er@qug$0|hV*Fs05`)C*}0 z>6n@YZ2-kBBvcagAN0yFAaMw+m=lTWG2 zs3-!{+v{Kg{N~P7Ft}9;sw0|SWdjj@OxK>4W47zu+}zf=b$z(g_0458xaij#{w?!c za{XIMo)zwWY7Ok7$hUv96pGJS=n{U45`S70;j5QQfyLGydO>`Uv@BSO4FsPvA{>p% zW&vy)n8M^ZKSHD)_hh<+HHUcymXSy#sgF=9UK1?KfHlRK8s1lWx`K3?spe1`{2#uP z%}Y-o>~b@TF|LoF2wnJ_%j>EYZ;k^k!0PG02B!xS-3m^U2s5$3kYk)_!Uj3#kb^M? zFdkAtMQ@oFg?LzH^9Oi=ApKE_8yCY2txgV3(%~*gFyu#B*i0u#D&-H~v`WBm*>Qk111{$}m`-5hXMj zp3l#v%Fp7~! zM=xQD2cg-xUCn_{&Z3dWZ7gn)!KQm?WRN-Yk{AW%_{msW zXR0YVniWFhGj^f^;H+YjC4?Oqk?$_b4DKe3+N8v^?g!7sF_nr02*fO-bBln}A{k2q zQapQbEN4gSXNI;EcQ}b7yLwH3^EnXyaK#(fz-uP|9;q|R1IAOgtwyq`8q@dhKzVo& zu&k;MYHRd^6OW%h{&mO1x53GdyHg+f>t?$$zH>T%DiD!VE>+g%G!zuRqiepNxKEDrZSfq|?L zCZc=Rk!c`B;MtiHI9O$-F3zwd^wyXu%G^o(Aqg7CRX;1WVzL`Kfc%mx8AH9LkC+xp zF@niYLgf2ks;dQvBE_7J0_Ry&NTNn%jO~l2)3hMRn@lpd43!{d)x{JmIj*Q zRl)R>&}AxRl3!4=nfRU^&tjP+OG#!&BjEMHB_V}SNmkuP^h6_;G0er7+8{;+O9&HX zFf0>fD24e<4V^_=j5@WrEWVaF0od>}pSxz}P5(Xb?#%loGnWsZ?CW_D*%}W{nS--p zyajW>OVEPX_Hkta>A{`B{+QOOsfp3eZJU9u?+^dqs#ARrAAUVr{>|m@5B2N1z8y=v z^E!N@9|$!rU%&HDM0IWT>hfbnxHtyvLr{0x?Xl}+g!X%>@?$mtYsrvCAG_r&*0&?8 z&c>vFgcx)YZZ9YN)}R|&U%!6m9XlMRKx8A|aUP1s0@h+MgL4je9#lfKm8nT0bVKp*Il`E!MFLWh zImLjNnkmWfrBs$NsJ4Z{G#4nEuuyCgK|Go^$XpgpoH5g)QZr0II1n<`StJF;8Taqu z#!KI$DF&fDBn2n<(y@EEKV3{5DkD*&|GLj1i^h3MIvkDocVE(FRhnvEveM9HE|3ge z!QkuU6m7=A1>CDeyLjC?F3_-7)#~(L42sPlF>&TnFpZJvUM2)aSmnaSNOl9A~=-Ki4NF5V365TlQLJsibd--yYa>*`n;qy>hnwWjbqe17PRBig( zf?bga5#QceSDpT{f7Jo{la#)mmanT0wbr)nHwFda<8R+u3hu`pomt!z8F($v<-kBi zV&Cfm;KF@p0_cEar`rdo?z@dO&3uVxuYqRUW}GfQUCgcjnB*T*bR!k#f|Z?uufGI* z8-RBxE3m3R`j73lz`1mO2k01q9kAVr)AtdU^?X8S{=G;ROBaMp;Iz!tR5QrVU#{Tu z)Fv=nVX#QwC<DwDP|gvazgY zxiM!wVd7&(rXkta%bopTD0-QiGmaYsThlym`iW4E+zhx29k^)esRqUtGCwLnjxe%2 zZL>Rx=AR9-1~3}Oo4fS4z_N|jQ6_VA!~_Ts=7ROGgwV_Z-2lnOh&9B`g$}Q5Je$|| zJ~nZpZf3k|dh5uyFAoQ2Bp(iUh~M5m*m3x`51lDV-Z%1XO*LsQm$;l8wf{{_1FW@s z>e)o!*Y9IvA1V*tfB61zN0tBc{?D$xogJeccU-%`c%!y0w52_4OU#@6{*f2f|7%}W zaAR+AehU_QhA@cPfIIfejg${vd`Gk9!gBZd z>jSS37QN|vH5&g%;Nm4q7X4P5v}5M$j+w5RkLlA5MaR?mx#n`PI5+i}YtBbgGk=i^ zQ)M`gMiYEe4j1l5hdo$C(%EJo7BtM>&gTNZwh;m`)vQia`>k?$R+$Yv9>Is@vuHwN6D*^_6i7)rEi_sBv}h8DzB1-WofF0z^4_i=by?`1 zVgyw<{GCsk-JAwn7>oQ*?8-%*I~!Ri9xHj=`Dwd8I-LyJNXfQ4d1q4FvO7%YLm_bJ z>vOu6clDe9#KD(QuNxl%vtC>9Oxs+REWWnO*)--Ze_lt={|7t!R?l3Wc|QYq*&pss zG`Wr4xK!cH7Fx;PIW-2stU2Xs<%c_M?$Txz7Xr6Skr&_CU;g~@&N}Ok-TF7 z`rwpZLZ4%B82&dB^-SYh8F@aqg5wYablV&Xk0<9X(vtNfcfQpXa(1I+mE_}RgF})m z#fdqv6lUcTb!7t3gDL#FTLl!J9wWp`AA2AmuZdK2^YJo70N~XHT`a9wm*#<9ieo}t zl@Ps1GL!;6u)YTm&{M=1o&5t~kQ9;`{yvb)NhatYBb^zb(N$Q0F_RFX1Fzb~kd4r; zVa$SVW$ePbxMe?ui|R&Y{lZQKHqG)%4b}sY8pVUiU*kpw+$J{9G)7F7bd9~aJDFHi zbiua6^kHyEoW%^yzI>RbKu9^j;gQUh z>njL3;U4TIMjK6&>7Rs2c8ymKcDRyq+({`>wd-Bits}+UbxDYet6v{DA0K=JF5j_% z(V6ij3124{bEq7H<~B@eM&@lVm)9e~soZ1%%)@hqiu9WqLV)!UXCG+@FgYW6GSym!s@1AeEj0u_TsGrC^eQajNDyeR}*RwAx zANR()4F>%DdR>z45wo>wh=01@IW;5Wty_?AjGjp1cc)V-lIgFQN@8v!oT0Ne8c_^-#; zd_Hoe_U_Av?}2fVcE$9m9TPo?1U1>E7qUD%4OLst6BXW$w8LmmvpvZcTPX~8 z@GiwF%|=nYkrIQP_E%tSJ2CO==c^INik(IdZN2+r&^nqp zvttr;C(q`^ytF`IE_mVBJ$ka0#v7SfL19P?aQkLrLfgiT(pTO5AlE|}Dr9?;_6r|b zUcyanX;MU;p6ZDpd?IWJA!V9IrD9bIm6EQ4fsEqIy)+r?A6TXR4U=IqtvHN>m@W_n zF~wwB5#c0*Fon%W9>Um(tY~&3d}-#qu;SrMR(C{9Xn~)ADIoDHF%%empp7N3R<(Cy zKw*KYH?F70!`UhKPMy(Qq6&4mLWsjip2fGNYswKM^-S0TS#Ve;%4NAF7k2-oNf+9Z zr5ejFM9$4@;5+4{yl*L3#vj)O9Zt6@xFS^oSOM52dQT2P26-3^0#Lt|mF0om<_gxw zfTG0dgI^y`jIt}U&rXQ(mQ5|QeD^ZSC?e*CTu++xITx}5BNJEBgTLN8GrrcmzCEic zDq(26qoYE3PJXH5*~qh~E0i0H4lHT{AFdvqNa_Dn_A5X>0Bc?}l>uDGeqo#Bc%ec(e8uVaN47Qv zG_6@wdB}#b-_qC5yb{nWE%1wfN`o)g@Yn>QR90G10mIXhr79y9qH)27_YIGeMKm!F z_eV{Q7=Ai{0VkqS91Mj>Lz=VEP!LaT%xx%<1mi%X5@)f@#e!pzHfx-fbEcu3+^$_% zX$AaEQV1L1eOsl%Ty)7y>+*870$>hy?qzdxxGZt4n`a8O&wS$xWcipFkmP|#BPV_r7 zv`4O7>hL;Sik-STpE=vl_F}$wnRDK}!LG!y&+lp$^#O_z+ykWWb+5xo&z^Ml9xo~% zupgb6>g#`9ch1(gh37@GA5|zqE&n~99(v;J30ooU*+xQRrDbRt6|eV5ta21^MyXaj zAKE_`nZE+e+L;LZmTie>9zY zJd^+b|J&8*+B0a`M3^P(9hw|pyY?8vTN~IK1$syD`m9nkLwILHKhca^NT@jTi zMem46>Z3xG%%OKDMemZFey{iUcKiKP-EI`w_1f!scs%Y8VEX>|Lht0$vHLU5ug-+g zfYF<)icxNkTF1h$c|g?3!_#W01T&D|ktiE5Awm*l1l4hib#^?XEB9ksQVlCRp;S-e zs8{Gnpu+tKjBjq<6dIz>-ZoMuv_6b-EJo7OeL{J<-T3-RHbX7Q2};`xEQP#sqb5_O z=VMbOFNRUSt}7`Gks7MJ53)}Fy!aR)bYz7`)EWK}*MWjb>u|ao107BN?^F>6S!F>j$?h0p zxMQQ(g2xZ?v7vykXJT)f%>;ZZ&Mj&ee<0p3;P|J+h~?G2U+Y%utg>o;!f(9*U~Hg) zX<1~+BLc&R*;X>H=#E-O5NzL1x^ote+zC z^@_x;+}%m$sLMQa+lDzj_N=zTe(T zdhXC_KgHMH+UTxt|A`hSdv1n*`rhVr_gZo9WbgFh(}te$CK$d4;e+3iQ?9 zv~y(8vg`6<|2{8KTvLlin3hXee2XxI#&i;duA_kN4r;tVloRs)PF1+6zqLaxsr zU~MA+K~xST-6ggoiBOkV7HW!Dm`Wi9Bneg2&&}{b(WQ@V2bdM|QSE^Oae3!T(e%8e zuxg2rbMBW*1&I&7(SeLfxQp+>8TEQMGBmzUVC2ZaM|iu_=G>y%+HgH2`AVLcf|1wc_-tJ(8)>8p5Quv#?V8_Z@+=>OzH;jr~(37O9{A#4ZImBy_h z(YoQcP4?c|23$fv$3L`w4;ylf){ST!iCq)kc;}7I-o**4qH|3TTys7jTs?ikeC+?_!JXlro|Q&9A#}wB8uu3R*Wf|C5?2)(KPsP z7J{OVMTUN|^ILNJ*4a-ivIq&sLjfKAA+Dr|n8lbycuxH$W&yLwn?ex*5HeuJ1ofS& zTIO`i57*Bh<*^iDS3?8$X7A&uw8wTlpa~Jm&PZ~A*+9Vx5zWhb`_4rk^x38|e$ED0 z$h(d(+Z+kJA!W-zZ4l(+5syoa$UwDB+}#93z;KBJ&Lh&S!w??=^Sohrs#td*pQ#X& zIQ4T=7bT^kxx#9etfIj=AZLS3*TGr+ER?W2o(5LIT%{29N{4-SqD?2=0O9@YClJ?L zHmM8T$G=|!f8^BHnYyY!-Z+%|-7dbARc$+4#J9qTRm-yXiZ7q4?giE1%=DYP-R%UO zrH(xvFY?ELX)y&abuPLP7wHv69NgQ@1 z#Am9g%v;(BT1hcEi7&InPRN=nQ6%I-`tDLAHcaV8TUxfx0dU3k4*$4AwJFcO{X01c zlGGahIx+nI#7{61a~gjG{GWbn_mgCR9|!bW?r^-_KBV3hCm+N&Q%q*ZyH+le0MG#v zkhq@3p%?FzaA~7u1=Qu~ofUSZ5vHcXX}i9FqNOo^gy&IV#Pfq*1k7cEmtyb9{A6UF z6xVH77my|;DxeoQmOn?4&%Pt9!KE;doe$-sORlbvDo_#wg%L8t8VT5cQq>7TfV^1J z$+ThM>nZi%rQ)Zi<*=0Q*JgFi4+QEKHk5fui3>}J zyQtYULK5}Ct^2s<0zh zZv_t>$Ro6XG=z!RyA-#v31GARJ{fDCQP^H$_5DYJR?N1>2OGZk{kg4n5*RN#ra#tB z0j2-DuhUa;-|p7VG;&(V=0uHZcE#ECe#~v$a>0f-@A)R_iOoe(-VC4y=OHDb9AZfw z(1Rbm3k-p80GseXT*@ck(n6H$CE1y$QE}w9FE2hH<%?5cO14yvtKLP;rqdnr)_biZ z5^cX#JS!|w0T~#D&PAcX{jdMA-ex(LS(F!+RXsOM==>i6453hvZ9*b27&cfx5po~C z67d^0(Td3fT(+|PrY}Z>rLs{klo$Z^5bO#;PCk^?Y0N||K(-*gi=)aneXS?y?3qRA z>Jbu_ViG?8Kla%Xgg|f>F+CLj$#Z2=g$$MLRhcs>_%euZ!-Zc2tYcm8%m>jihzSLf z2%6simr^`^d-~P#sfOCgIdQ)d-hB0JEPvq(BzFv}c9zHNgDE~u|GRa1=j*E8udBwi zmfoKnP4JH!&v^Gp`f6+L@#%O_e!s4p=rOa*%KZ4|?wJ4ash3kHau=55WnJ$2>vB=c z27Tnlt@+PMdjnTfEVYSGHt<8exH+8HVy4<#JClNV$(o!6DDi*aE^!#p3&pj$mnmG4 zTcqh-D#R*aE_3x-K^v3%Y{)=#98xkUA)oqDAI5 znV#U+DA!{wZh5?3BsHJO^pGHB5L4>v(Qt(fU*%hjpbeWsSUe(oTZu}XBSS#?4#1?a zbPMesuWeo%kVE8S#Go{H_D+d-bdNFKG&ds=Ur%84#4wiAWWRja%;g{qCUO*{>TDqr zGnQc@8hDH0x&rbAD_vJYMQJ!+TEnJ^5I&J_W8bh&U{OK(XQbi1e~Fdz;{AjRB~@%e zJZ*2;LH9nAHz~-+5TqZz)99%(cUYD&$Ws-*(~ZbYaentO*7x_#n#GQb*CP`3!-O@j zFF1qt``z;C$+oE)YrmRbzT!_IsloGX1an^i1X{o-pbB_ zjAri+Z;=Sl>Y}Izw(Y3X&aQA+cKgL(bLT*XG~{&=c=9qm+BbA#%Vj(dx-e4V6O2T; zRfe!6;+=O~SFO^}kgoz-${cGPo|mt&U{&B*B6tp1Jih@$hH@EO6UP+^AT)*v!osL@lJ;Otw!9K!#)w2xQH9Am3&DeVU{GmEl9 ze$(1*E~s$D63u|bePG;ZTJjH%NGab~zp1=o6M+!#z{gk$exVCfB;p9+_#7tkx)Y)> zls=O3g_0=p76Rjukqq4tU#buj;>m2~HG+GR-F!v>vEs3*$Ea$(@I}xv)9vvU)o00? z7lj>L+dSK%zXC$N!|8`L+a3J&PgUoRclA!(iyP^l`FwcmN044aOCJp+zJL@MF&~T= zz<>(@s4(I{qXtQ%$&_USG+W!SoB*M)m0iWw_4;U{Z#_LM%nBD?YtO#kyN~c z!WRghn~^yd<&QTpH0kHWN?m%B&T?s|T7XgAMmVZja!&xUBYW`?BGsjwB%y%$NFAyW zi#rwTg&Sz~S3049xrsKX+)bB=tPNq>?0IS?2W6dtq_MmcerR?LLL3MJ%ZPz|bQ?<% z&^+TG&@AWz#VcOFP7%@MX_7r@cjOQVLY=1w^;YB|M9#u9=+;z}87?8uolPD$B?4tQ zA7XfSsSV>nFIU&*IP>a%T4NJi_q)w!e{?*Ybl_UB5TbmmUxzVzkP?xHMVLzxmM%Q^ z_H>~9PLJ>YjqhIn+uD9~V(7?_hxzuF;(p)6;_hV?hiW~eXTI$Mi=I1LvD4#w;((O$ zW82K<+L5^F{@&?hGvC%YO+Jg-Rf7NvO&6fQpLX7E0lw?JlFJ`XL>LP3m^=p}vqGan zpnjy&B!H{IP_ex|(%^RgQ2DE<#Q^0ycsYzYz#?<_$O;vz1-$r@>q5fFT62N#eTdRk zU-(XAJ94T7SARHAzD$RTy8#j5s+YjKHdbwWFF%isT34z!lAuUSDeewKOq=2Wj=}@+ z;_~$+Sj9$63rI2fPu>J9)X99T6YuROwR?OP+pE8mLch>igzNIiFdLPv(gUVPI(HOU zKEgwp0IYhzd7K0Y#Viz9lq7C7!uyP`Y8WDyZ@Lyd=uGnAA>E+lM5-P{ zfxG7J%*WcvZl~{GmQTMMo7uT6qOttoV<|8M4<<|`1b1?nr?%)lQmOv7wi+A%HvH!9 zM1q#5XB!Yce;WH5al55MQq=@o?_(DuSr&xq?3Z>$JD`G{=Mv6xJVi`!8S+qTXI3jlogBTQG1s5g( z-Kp z1TDQC(L4Qk?0&~1gT^ndV9pf-EY3YArk77n9-i*_8aw{7E3s!cjHv+ZW z4m|;Zxyg^|m7lI=(up`h^1Q^C(2$}?1gkJ2-wRXu*5GMK@!pe6CB_DE4zAb|HI1)@ z=@$ni+OVXjq$-3g!^Qaek!LOh4W1;FDO&_nh=8~%@XH6$s3j;A@QE)*kaG&C9#$~f z^VHTf%?FrLlfF%tt@vD@7()S&RwBDOilt;mANItQzl@$ z36fB$%Da5GUwYbPTXVd|{ypdGHg@$c`+&!bU(&x*208BnmxcJK_Zuwoa#+Soqzq?^`_geDzU>*iYYWBNk*{-V(K?@!@U|Qee=1$M5~`zVX@r;RnO; zMq90!=30Oq`fcX)>jLoM0CVchwWYOF*B$6(14TkZ`oF&6`{i5EM?^upUzwFp9!&vk zixs9#I%J?zW$;Q=c-`QT-RVR2rwbE4(P0g`j0}A5sOx#9IhoI^#8P>3_i+Bs>Y8m) zR1wiqSU*2PIHEZs!}Hk6ibJz~9vmvwe);6qhtiAlGLNtFnrFYv<8LKkK8l<}Da1`sg{gm6&8ve}2jag!aUu9#dYmXh6?cq<24&D&9)qS-hxE#@Sx*@OzB?UqrzO|3DV z09gQ>Du*QN>y)dPOt<#_N{$;Vn^`mS&)D?ygtGfbqpJ<>oUI>>Dv7>Rq2a#5DrCz; zox|5n_FysSC^b|UUb%&*Dr-i5w*Xw`le%%Uq<`-1QP{&?kfMD3k$tNHB* zt*q#WE_|@I3Img<)(u|5n_LZomk;fcb(4+N-v^l-o5d^TtH?bAMDBFu!&6@9{q|KIr`}s=DS#OteAE;PUDJEnnR+ zGZOdv+N(TcTlpj@K8iz39uVZw++aOdRnJDZ(5N#hENK6V6_B%=(HU6wi;wc^O<^fk z^2kOvq3_jNfX-ZUL zCE}Rf`Unl6s<}c8TS1i7fUQU|d?zm%E3hLqtaWQJflSju5sXl)NoOn8K_m_lMDbQr zo?$kr*?iK#r2ror`^OjL&1QohHulwd?ChrGNmFpOgu^%+#6P6!1NlinkLmIOmI>Em zBo#3sbU8R4izO0L-9^e}*oyRPn4^(@+TB@4jF$6>UG><8;dG?hhs)zur@43BcA7c8 zzx79R(JCgNd#2fJ)hU&?N2E{WCFUx08(X#r4C8GMRnzRw2CO<1bM;W{r;)xJ377uX z@dK5lfmWkrgH^}-mZJdZd$DYB%hKsluv4v_)P4KM5C7>4Gs82JZ=9M6MQjrS;Egee zXZJ@hqbRS5p{&fTOa%|78wuf{#I)G7fPyG8lF=VidX!v2A`$?kvc^>*?=x29o8ruXB;9pf@S0?3ytsAUyj$}mD$gd!5Oe*2^Y}Fh z3u1<#%=4#+9K1@KUB~8-0}`>4SrUYjf#L2%4gP>WWauTO4i<=;+9)^*uAds=fU)=Z zLd8x51W1H3<3S`em&PV&5MM|O6QTMnn=cUWlcUzaDcwp!{K`)l;e zIdH$WU)lG%sHlW-RB-dT3&EYswZ?8*`T#DD&<8}e^F=~ReR75{2Q*hV38}6u8gY|Y zFFt)MgT9nRp#gcS<8znL0Pe`&S+4tLv;LB&FY;)(%oa)ej7#=jVkuA+wVwRNM4$%-&v&x9$r%<%A3UH09v{-ipfJWx0x~JHt zL=elpCI9zrN&teMoekm-$peByCM$azk;62po=XEW&4B_}Y4`2gsm1vV>k6x09?)K8 zb&FQgRP{WBVJl^;Xulv^)K~B7U>|S$`e(P&aa7$GReiPpdt*XN{1ACb>BIht*x2va zUxl2idP>jvB#!&3JN>zAsxa>7-QKB5+nM(>KfX@Ani(B_*zS!A8A_gV8NxUKh_eaJ z7Z9$7wR`kEk9eurVuuD92g5;KTaHAmQW-QxR{Nd)5_MHyYrBP4;QrFtjBMYXIXZkI z0pg+cwpE0;;$kBp|IOe=9a zIgg=Y2UsGmnl$igS6=~sHk(z#X(CCPJ!=q%za%w4c&OhMu_RjV5JeK8*6`-&D^T}T{iV{>C}U-PRC=8R$V=0t~eU|{asX1^^V9b zY@??ej6a5yqP*50<3}%i`hKI-y=q5UN=ojB)eCk}UPfLW{Oc^#kqN|LKfiPz_P>`M zd_`=Ul~rWAH%pP9tbp!F6b$2lDk(kbwWjDGcqh0+2`Q?__Zn96pz>3mxJLbDXugaL z1zedWA*cHg&r|Bnw$qWkgX$oz$hl|3Y*+Vm_KM44M87>Ww|%oe5Bt8JMcwAkOeZok zU^abKvW4r}_1neGm*4p&x*s&nIBJkk^~%k0;`0rF^KOVVu=>Mq$y*18bBIxCBUWl{G91ML0BM+J zrojwKOvy3bj@W8MnP^ID5N3Hmnl32$H0pH<9-W0nz-mCYrz4Su#bTb#bA({2-U!wK z41}Wa$qBGxhNt_8qYR5(cWXmI+E#yKY~|)HVCablfGtUi+G1dj(Y8n`$MFpC_Jz}! zXY|Ki;~R{(Ri%b1LQR{KQ50w*z_JH-;V`2Nc{OL&0M+xBMbhh46cB!!N^Umwh%#() zlEi|CSqXOEEChNm>qkuNcTI}z4!K%W(rjD>n!$`^sdv>L)uf(Inow97zqN#&&EjOo zp6oHb?g!T0UkalapVN=Ju>YoeH|=k%9PuhvB2j_boEL23L4uTh=WGv&J2#~tO9w}- z#-Q;@LBx{N5yyXG8!S6o${mk=zkb^JuH*J%An!cUcei&O;1NLEv-$o^?UaA*m_OL^ zj-|x?{&Sfv+kl#`E5)I_^&L^y1{X_S;Tr(1`9kKYZ^l$F2TAN-A}}? z(*U1ac(t&KVdY~@0ANIKq*$?RhtVi6oM{UNKvl~QlBx(G@=-tA!d55>(zbOxBi@_c zR8&-P-e=W3pLuj6X1zBbV<`1kLHv2}^%Aj4k14fTnXkPqN2(_elP*FPJ|_9P+6VJH zrAU_)J&$WDP(902x)M5p8vum1WlW6a0SQ)MURaL^6d29x2n;XAV758UwP2TzD_}Au zb@DN6aDUz=F)k5{X-pNomsOH8U|g9*TuF1?QO!k}=>oIOH!QT`hBu%1WebwwEj_>Y zJ5BeWv}k0QJ6I&_Z}q#o0AahEgvSPR&@t$iI(@W@{IvSN%K@z)^*L2B76~tvzptQG122UfHW-^;YHIoVkHQhtG0-=xB^A{U@ z469!~=_LJCy`yY{Uv6(L_uCZnVRIO~{D(vbAZSv0xeL_HGee z0AIaTv}M2hHT`obDJgOPUUEA6{g++Gl3oXgnj_H$J6?^vKQS^|{sJ#lQsdjxWUR>x)#Su`_tdY|fF-mM zCU;(XjM3rdWM2lcKAF!4(VC1(_?AAys(MSLZY~+<=ovJ55VK#YJtJ2nVoy`Z)ketgBn4Ga_or+{y z#>WN>k6~|=LV%koQVJ_+CVXt(DWFy znSUC{y_N0*K;Db(c)V_yFSO}mdW_CbCHJXaz}Q>q?y7Y6kcZ~GqQuk_)7RP#ZP$;i z=7eyzavCteH>7QoZBoJ<6_U-nMFSCVNJHU2Ti0)W%h-R%LhI17UI&BTqp>@)T&fHj z2kqWE7|b>6*nR49|F^c8Z|CBEnbjUWG_@!0)7MF-+L?r=C;`y8*g~A_vv&?$dw9!F z(G(nMb)mG??-HUe090`kQJjiT5J9Qo>Os(m7n2F=dT>>~Q2~1!Ll9mgBv3qIUXB~SnZpyG zmy0Vd3qf`>5iCD-cf9CttsUtA(ykvJaZ_vKe$DC7T58c)e)e2HZ@Y!=>)@hfI7zkj zYF6fXO6t(j<46DN$Myr@_nlyudk%ik_JCFN=&SvGebR$j#h<>X#7(9Zzki=q#3i`@&upl}JPM>dSqb)d-xieF}(-U9c)*fCqkRh$0SD5CBdtl8d!)7uffcjb4v8<(X zNkzlD9Sv7r5WT&y9rejID}il}F3^Y&PRj=bJsW2S1Lz=6g@>j#6`#=!Kw){lP6fzK zy04=^ZC!f!pb|}8!;SwX8|8u3II$|ygveuy*kHmB8aO_mX*)`?7l42X;3OB?KVBCE zNc;M$2wZs@lqUesOND7R6>-b?Ux1I~S61^{5aY)Hr${?W8wceibR-pYnrrME+|dBk z$saWt*B;m(bw)Reidggrk}PD9p=G}XWJyg0$j4-a$cw$^J-cCrCh|f}TT0U4!vHLQ zSgL6D4yiYdFX2-toN`TiqQ>lp2BoHico_zkQrhRt4v@m>WN3bL!CJAjZ)@W%tqrC} z4c7Z6wrsuHf23$K9wcDqj%R#zawr7=`N^L%(=*e{iK<-||#7}-@?f<)+36^&)VEk#-p@Q<~mlRztVla0qvTatk ziZ`E96@|ee#^HaNs+gx3xKAV*Y#hnEuSnFFAVu9G4{u*aF(h|C@0RJpfZPfoS?3)} zAk0qaJavVnvmR9+xp?K4j?Z={hkLhu=f;fvyz;)d7|^HNHgo{tmetAXSG%i&O8@XL zes4x}_`|8M(y=D)_qPX)jg2i2vo9qsahPZE9F!n`+*puJQvbE2-PbbIM1zvn=TbZgV~SI~2(@Atk=Jx`hb=VAK<7?qv?T(*>yh{?}4Zh?*Ol>e`D z)7AbH5g?Doe!(uD7rELJ?Dp!D_4s1FU3Fw+-T>{e21MD*0%1EQhDs$AZ%5x&k7KmM z5&-0(CIVEmU}B2Z z@#H@7=e=@7~?U}C+o_99!#QVpgHA_-*>E9lMcvCcVs7)O0o6%A{7 zSiPy^Up?$D7Ik(&d!71`S`Zr0kPP$d*Wqr%z>6tj9@dcqpddh)MCmql0I49WShjN) zuZBF}$tWh1j(EZK9RswOnj_xb2drMF9cUJ9W7aSeyQDMM1_~E@3Yepl?E=8 zDCM_a?Mcz9{dF(G>iguRx!>uQ?3TgS!Clo^9#*{*!|&rhET0^Y`*`lehnZisabvZ= zf!uj%?eW9r@hd7ZFBsawBvR$-tso*b@-jAGC<1lp@%tXmp`63gQLA))ZcG9%G<9cTMX)-&LFev)RW>mEF2uaD@f`ZOMY^pUJ1rSo|RznwknvtJm?BM z&p4#i(#qY(`sI_1$}Vw8FwETB3{2o0T*Raw7WCXozP{2>g0tHW(jDMco*jY-vw5BafI*h1o=N8|`@9 z$IGi{p^+vz9*n?9L5c1Uhya#HL4+P5=wWhdXow1ypJ$>-lNoozj%q?jAF$rdJSv+S ztQ`df*&6Wki>baENNQMp_Sq9_!fTg~Pi(r70yy!xp!Pd9HvMLE@AT8L1C+Lo{e4kx z?7H)nncu1mK0b;4F+7zLH`@Q{`ypdcMq9Th=C$|CvhopO?IMg41_W`T?L->lo|CVy znjaFg5nI(G3SvDaJ}jcaq5#$@4X%cF{iYBsC!KkH{#8O3dGGAkr#fF7UkV5R_#ANfZsq28o1XczV%H_ z9FDjG8d8(2x5s0g=KltG&vsy3YFU0iwx;HC<|lBco`M4Mv8%U2UK}!j?xgDrg6xfA zW-n>w7d8Tx(w7Qj<0(=SN){wE~6UN~%4Hx3d6R zgw|g`P_hrFjOig4hnADzGfg@y7j)D#-j3vwpTj3=q`TUHai1uh29e-HdT!uPd`5r| zH=KXD9>drO1+q;Nf^f$flX-7XEOXa>c-5(G;@YjT($bH^AAZI-^gFBZ4W)JUu9O8* zE)*%W04@ZmzP6EW>&o{ES1M6gxnVY|$@u)b(8kBVXl;2~8*h#Mew#41?N~?NvCv;r zppd1}kE~5K6WGI0B+P#+Tp}mRMqNcjrh}>}1FC=_P71W8-j%jR20mA3Hg~WY(22Il z5Sp+QxC<8_0ZcOVtK94e6_yx)Pe{EIKta@U1IWIfTleMXkS4I_^Y6QP@l#Fm&85xS z6lB27>n&LqE}*+06W<%k3-K>OnU0yic|%q@@%TonZ?1^=m3h)X3a zPt_mbHs%wX^|JHBe}AxbEZV)`{k{XoqThOS51ns4K3v@D{~KhVebAlx-?_2rFEfK* zkI(o|V++I0nQ%V5MUEnDV|HLt*u2Hg)^D|2UymIhPP2nu^O(d@x}>I0>Odumlb&wA%A#znz6fU`K$*O`Chc>lziMxl+^c(L5(W8zQvrPhj=-J^eM|> z>Uski$^gBnOs1DOa+Vnd8#kl{kny}GhGG`OZ2?bUKH|Y8vr5GI%!teM6rv1s)!C)0 zp;LqigW$cFNO6rv@|)HOh#D1o#DA0oNweXRD;RF(RVo7MbzE4WG@=Zm7PC)$SUxiv zH_3-agkao*Q`?_g|lDxh|n~?MJPbP`G{Icd&woUa##T`D@fi!0&hpEJY zd~U0Abnb*+chr%p$$=ZWH7BO7w~^>Cb8hU`d}1#z4W?)aun5B9e^zY6byOmq*{jC(KK*0pQ%Bj- zVgFiC`96HOe{bNE(TshYAWZC&*wVI z{Cj(Qb3M9+|Nb2QbIk<{FlU|mG&KEtu;obg=W}z;?J~;u+eoH{1*Y-r|LM#Q3}r6* zr>?S`8<yCCna|s0`F@gY#2oA|f-IH^WWasCWgu zQuY{dy8UK(=?w0VA`C9$f|>IGItrp&Pl_PkC|?Gr^Nu)QY|_@2|5B{rrrXk(3Ff1x zTsR3Uxr4LV>Q>HxZ4f#ykl(@r+$!`9VQiA;$tkj5rMsmRxodgh#QvcPKq zaZ$nNn;1(>*XPA%Aam@SG90|PXYJt8(={8-n+-L%N)w&|ZSbAkmOssl6l!`ba4{d{ z&s$|*zlKVI;)R$58|9mVzdquMJ8RQfh&r`odn;zN0D7wPBFpIXV^NYDpA)?@1EHD; zFUzDsxF~R5-W9^R7Kb-)-}K~+Rr?Pw54Qk*S>rESD1 zA@Nqb7;PBK3sB@QfD5oC8<~qpG8ajS0q1N!%*Jms<6&HurQ*3Dt<~E;%+j=E={>Q( zop*AGHu7xV5$E8YiQ0a4cBhE+lFR1hO`&;bnqX?4FH@zw;wFosZjPj{N9h3#Oehjh z0;eX%Q0=wB+Z2Ii5QDZAaYNKXG|_>=6qRyx7+~hAN!1hj84>w65z2aPb+RiBFAMqZ4p^g<3#}eKwbf^!IU<63(*Q3VJCDsMBI)8sS??@-?uM~8@F#QpI=~n z;B{rSXUQK0@ZPMKL7Sp`-{-V06h`;9y|;RvlVmxz<+*|O;#TS7w@Hsf72pi44(mR* z-2eX3@sOuo^cC6ntd5<0Yi07kW2#`nVqdTo&$oY2sw}m;IVrRcO#SeIsyf-SD-a1kHnDrh@Sg8Ke})fF*qj_rZY}J{Qi~if~C&CmYfH?aSi6^0YGZU8?q^nV6Z#^@hz&y2y$@im2 z@Fz9+Z<_#}@U00^y5fOxCd}j46pCV#HCUsLrb%ObmHCKEIZTi^$nh%(P~WQ;+rxy% z%&(*ZJDdiAXCy_vPDS}TmsszLs8yT9Vh8zJO_)fgP&QNkbN$Y_jER_#b-r+k#^|a@ z0A6rVtd)R>;2;(s-N{U)AYV!5%3LbUXL>3G67}&BI*%wFbuESdGwJ76zIpQ&N;R)& zGL(Ru*8q%62LA{t^fs6`kjf?!NBKr5UA?&4yHr*c_5GyQj-)<-zuQ=HewoNE!PMmi zaFJjrHIjiaEdS>fL!Y0(gccks>DJ3XjXfvq?LYWC(=%>p{KlS%hf{;oC-l3&j1Sd> z1^P_Biydo;8`nKCta}1vP5uk4y>XMdj>pDB^s@tnxO9Qnige3)S}ODS=4Y0Vik#=r zh#zzQ$ZB!iBatmaSy6?)mmU6xoA7|Glo_@90!RbF$FgjUTI`MX*HtEm zCAEJ$`1)yaX`WhBwy2XtI$*;gfxd4Qw34mEf079}rs2(B{Vol!I z9P})6!ESLn#%+3|13C+Ih^F)qz(j&d-r$hY3oV_hM z@9wwRkCj@SOZ*Kmcs;$nn{VvqMSJ8u^y8?^j?VsPmgrwiQN4K%F1-{w2VGJrz~`x%K;p z*yuZpyZ?Osw7Zg^H8uur)?BB!6Zh|}xe!tLy;aY!QLot2BQUi8U_f_IW%&gU@Y=mz zVsUQsa{mi$dw>)`b@=e@f5wME!gu%i*2f0d{i)zh;-Xc*iPQARU{oYtLNDCp+^EMy zpZ*;an3QLzcgJ>d_Vuv9>brNRKAYq+0`0zy&uLp6-W@YCIj(i$TiFS~{%9~T6q4-c zp+Gy&Of_?MMR?ef#~C#lJoD2{v*Z1$u^Pis{-E0ese_l~*G!&N+`O4Ya9$uWP;;n9 z)`P_*JSbE(9TUCv#;U0h!3gEw=P8}{)@R^;)z|-f#G;Ji6JVNhtt4M_v=@&ad$hoUJmY>6q6=?SIt2HmhAm7hE|9$cxT^&0kYlQ!3D zpx89u+!U`_yH}4{o(LFyQA19smcP*(zgTm1Y(Af<_#} z&XO0e;_~OLb`Y01FI?fX%Nz)EYLEYVVAA{R*L2JBYwb3beNm3dDNet?0Vmz*;_lk- zPBRyl9v}H%*h9-~4i9MJ*=OA9^_u~@%Fwc|i^$axuyrnr$o)GtN@~{f@ep z;5Dfw*unF8L|-)3Qh5N8FWX=eVjx3IDFJrO@>z^hSyK#cJ<&Sx`9?8pp&phan4P0xbY%gCF=SRd~OGnk2V86xAGKUa1U8}R=< zIMb971+z|NEF_g6k)S3hKvrY*jQwurBp0fl&pZ;y3R`_WNCwn}S)EdzCXW!{;sB@} zb#(yc=z?yREXY(otWIvPo$8pm;8{D8?DT6YZWlNDX?C_x^y-?=$E=X^(f>0DyfV~d zstW!x(PR4O&lW+W^{xo$#v`GN2K{Bv*pk-#!N%OFfzbn*f;9F}&NA!w=4bPRH)GLH z7hoyD6uR{u>^Uz5{s#oG0JJN;;Zms>J}>ZlNn}#bYe?w6jGYwj+yviXL|D!@N>Dhv zJlWDpqHAgC4moCXD#N<<0`-fxSY}5j?Lwn_zb+k)h{(MVKJ14r=o9l&{}5aBsPoUIrygoMj~!Wf+TJTu`+Ri$L(-p%1NRU6EE)cKJMzxw ziMFYp!zTc)+3tb|2m>E{4;G5g8<(#3SbF?d-`I&S9n*ag(~olR#o9l$U8V8BuSh#j zt)eFI+yR$FUgODtOl7m^Fb$&MWw?OIAto6qoeg9$%=+A7wb#hTW@-Q{!4B4I@?0mA zSgpi#EDhfZ^Xd?@i%lDMLlkt>18vr?plK_mu7jwj%$HVj5UW`W5FFmTw@MT0<@yey zEQ;<4l;1*R;`{R-#-xdZ?m_v7mXI94i>rm1E<7&63184?HKa7Vs!42RZ*Nh9V4@D5-ND zxF(dwFe~)(HU-e&AWj6pMG&Lld=++$C{vt-8TEO9I{r7zOgGVBITH#|B&)_Uy{SHH zL$s^&o<7E-`)yjo!xm5X+&gd@_6H--+7q$7)mN?T!@I zQ1Y03O-?;^J)egpO2E9^feaO5L8N&>US!3P;k%Q`%d^~FN6auYL~xSGVPD^0W?*=}v##^e;hE&xpG%K_b($C|26M~@ zH}3AS?fuo|>1kU$I5hMK;0G248m{D>UynyWUGiYJaY&usB^ACIq{oeROt*fW9z6_H zWaDq%9MPZb1LBs5nK!i)dz_}ryHO_0SwLTt%Bn zn+yKW6f2c+f=)nYbks)fW|steNvT*T%N;bf94JJGXl=4c4uE3UNPNu8M}vbF31PPz zI9`|a^1zcK;Pu{GUQbQX$>LgN3$#1m_l(WipHv>U&2X_skW<$xfR_ zJsNyjgJ;fz?M}rUTm9zk+twlE(D3(z_Z=L1tPHZ>9SD5(ZD{zkrAHrfbXu)pH#Rk> zyZo!?*x|!%;o(oa&ueLo-S0e;wxDv~XCIU8Lk1s@(6ijwg^MUlE>R5AaxamQlr=iqFzi< z`0{nk-g+wp_!T?8c>obSx+z38%Gw-NC`RBB`Y21Ss-KXls9V%vfHbBd^D|0-l_pW3 z%#jUz8bJIRDbjjWB`i>ufg7__eNCN;tY-ioU50_W&G5gATm%YaLcbfh9yHh*^?5O7 z%C*fI>kRl;m1`TAarfbYb&t57H5*apS5XO(if;ZGnq|JV+!YmZ(2BhcOlC>}#K(=m zY@2~V_9FAs6pQ!@(T>(k7Lvdt%yCEQ>@5KY&a0r-DsOut?$>JHs0>2zIk?T79bw(O zd;M#V9sx?vcMWqU9u5Xa>-WdrpZYh=vv&L%;Jp8suAO@1^m|0t|1a0ML9+!+3AR$m zDHO7G)?))4}vCZ~G?wc$m<9$t~WsRP9zuTahjRABCK+iH#S$4~3;G zuAX{~;pbP5KKFobNv#o>)CHlBgT^WBHUC7;t}e&1v($_j`0^@>(yD{{KqOjyy?2%I)Nt4{lO? z_**zaon)gWAm@Hnp1eZDT42PWP|pb13n(OV9z>B*(Lx?2ZC2i|ePBKqrH8m#8c-61 zsQMbhk(J1zeD zCqq5O5AC-Ng=R+oytw6s;~qh)y~N&xzRcV*oBk|Rq6nx=Gstl-9m;V~=rC3JSsE1j z=4ChFy^LU20l(gx@G&P%fG6S3jCvMF=4M9O`zWu94Da;_vdLuJ;5XXkwmlKsYcB*U zBJdBZUw+yQDx%ov{}0a%Ut!&k{?yzRvBKu(6fdXEuIBT^ffd0w zS{~j{KHje76g#puZnE**)adBom5#Du&z9El@kFiZ?=u5VQ$J?2wt>5h7FO6sGfBWnw#6 zgSV5B!pXP|z}dIS8YDizOuG)qo4LSuVtUitl#SKFazQ@Os(EvDj9%cr1HzKXjp*oE zy-2zo=Av$1=70)SV+i`x8cH+wEUa_}q^;9P1T5(k%XsVq5?|`-cbn5j#kZWAg!>?PC2lrZXXy&OL0FvXCAkX*Ca)`W2=8qX^&Z;vtMu|#%gW4^zZ11keh05JQJh`8MQ0}Uc4lsc`nX*bGz=6y{ z@Hz$>FQuit05#1`XiJiigRAEUk^-XW#1Ov2%7qg1*IwZMnbZ&-XDgF`#$4aku;ZQiqwz8*LFDwxE@`(S0{N^6jbqV>1tG$2QL-e4Xx% z`!>-%p2Uk^P|Bo8g)8a^leIEnKndUXe+HCB+s$FeJ{5UMQ9FL6QPSTOCAipkOxZO=%#C( z_4sD$HlU#3T&H#=E!%CDm`IWI&{eUyujAd1Y|4}9>C%$`Zsc$jMV)zuN(gC~%fOOe zkTvoU9{OCfpsLBJQXI1h;pUN8l>bN5*~c@v|9`w)u4x;NYqKGBxHfk)5r;%axwghx zqUI)*n`lWwH>i_39kw;Oj5I}Vs}Y(L6-AVTYN8@KB%++$r1C9?>ZF9<=lt>er+<1R zY1j4neBPhe>-mgIj)|(WLUa0P6b_XH+bA|X+>dCa_sHo8bW^?o_EjE3ktKLQOtpI? z(Gx`tn81QKx|z32N$t#{$q<5-Eze5>kBKv2wOE+-F5-~O>7v{5&$~j(2)RU zOB#kxwwe3e#!+eH66ovNRbA#rh;v8a<3;Dr#iiC+V`Q8PFV_#RwxSMM0=ixG!6Q4g z4xH=w3)0Ea`sdf#?~hjKh8wh<3Le!Uj$VOS*;_d9G z#hybIht{4Sja?r3Ht^+3lh(kSBX3+KDFaje8W)z$|9yQ^)6Az|LE~d#X6F6X#v@-2 zuB~`lcxwO9`3q~#Z#or!UR=CY98XDRv)TGrg& zr%o61$bgt*WovE??d$^~l7h5KUxF4`UO0$98ymX<3Xp>>Au&tBk}Z8@kF!7(R=BOCz@*t$VUl$ zckk2=dY2=ADT5K@@8|m;f`STey0d8nY7ig3OD9of2t(LI^1D^Ww6j;T&Tr;RdfLhU z;y|l`EOevr7L?OdIDY%^Wa@zB&6I(A?>jW~f`qY_Vb^%(%1Du)ZS_`eGEUT%#hf|? z`s!zYz5nVJWV(`ev23RevZnTPe^=}>+Y81fyN`k@^qEa=c^%u92gIM>^iRa^KRJva z`D3s;;`Q692Pr8RzJF>>`nqD_>3=bj&!3-#&j0ghpkP%iwF9Ut7G{&?-R3vNzrGWK z#qLfgK|CQ-VECYn@L$n%JxpQZrv&~|MT6YimdFBA%h>e-CuWv6e#)P-f-{;-l3+2h z_S=DLx$SzLmf5f=M;Lp_!wfAI!*`@){&^zr*oBz5oI$c$zcZ^zDhAbXSBK%7{$kVw z$m!IVvHnrtNUZ9C+=*#hwWOe$4DOwBuY{#DW+iGzE1_{yf2NX0k3(s@snmzp zp|9T4)Uk~ue389kL3fJU4>7-Dg8wvr0nD~Z`qV&p8X~PD9Zd7NqXWUEis51gDwy&j z*NFV&TfoyQnRy{gc&b^QZJ5KWhiMya##qW)pIX;=@pWya4d?*< zIMGo6Y~ZJkA33_ZGuYNOIvvZY20pfd*xN6D*fJ3Y8rHuaan4v;0l8kfl=o!gGJ`|s z<1^|AQU3eL#A%M6y|(`Svr4nWI}i;f5soVtreYc+c`=-)54pL`0(d1*EBme&E`}*L zPU}LMx@L}ww3vM`1>_U&>o4J|OVj(p^(gR9Rn3^^Ni{{tqN;kDaX3pL+~aA*KWUR$ zDWvf#`-W|6>-++byt}tM^!vGmf1AF(o(NsD=G9?_Dp5je^Gu&s~gu;G`FK zejI2vn&$p3NJ&YdIA^Rox5tQJBa7D*=944JR_}h(;?>m-e-arD(^fXOA1s23rTHgh zWyNBp7OE~ifvc3zZNFRHn>83h4PT!yB3~V#w}P`$sopc~t0&;o3E5k@T`ye5%dLGW zp8Zj>S{G|-azypn*7tSZ@d;iPed@h!T~C!(f4huV{Sb^vmJ@T%$N#|=G8vSKUvHn= zG?8R;6$7#2v`1d8J^;fok0j&_(++1o3_uaB;^O3Bieh&)In@(8=Cv!WZG-wUX*mL} z8-LEc?Fm99JlpEjwty+m%7h{~HPg_Oyqx2ZxdF{dDD&k`vua_8j||^TrIu$O`=wGw z8Jm>}D*1_LJo$9bA~ug$LKKleq}W3YWw*HtFjG^-1|_njNQQuCw7{^<0)|WU5emDs zy2X5W8;Pp)ow}VWA@Re|6;M4mJQpBs=K=}I!1O#y^Zf2)UpsTT?J!i|X5rE7ZGLS} z1I#0_Z%~6!iEkcO8bCM6G>G#t75P~+$`dSPzOe?eJ`f?NqfVjkzA}x$eYDd4JZdOG zR7f|!+3}I-ViJ?_m+C+o_(Mc!Xj z7dP8aC4RqX@_pvZ{Pg9k3!_PMLnfWSY!eiyvJE4V^~@j{LNUw>l0{O?EEt}Idtx5O zBl*J+h11D#(qV)1d%uho(mu->_Owl{kDu^;xGHePgjPXdEDS??y@tmpcb<*njlzKaPv9SGm(|$U9FQa-HE< z!a>D&xcNRbyUGeo5$<@(?Cd@Iz0kG3OW;&O5eX0q++o%*%{_UCk~-Cn;dY{7k(gR4 z6(7cK0E2-MnaPp`_fX2i^>(H+Kd1$@wq{o$9>xjhacZDD_-<;D=hQh*|6yB&4DRWZ zl|U_Qh$&-XMz8-}HGj`-=3>+5*3h}(g+2Fc@}~}1+3Wq({V5zQjqQbMAhVtt*q`V< zxUaSS$g;(b?*7V{`T*?Qb)uuY!@U59r~VGy=638x?0L%|;)@P5{!;sMqmGOxnlGp; zo9Qp8h@++RInGM=7zay9a4}2aM2jBwt#Vg~oI$)yFI%M`Q6jP=Ccw_yC;ohVKr7|k zD|hYgk_~EpRa~^RecGoSfg2Q-sYV*#? zQ#G%hU3a^7#vkkj*3r6-PuDNZ{jXsE{P1OP>iXxO*9J*n(=N<^Y6a_Z=tGsA$oYq%WS)hmWjb~3^mJI9rGYf0D?(? zN;15;Ap z-HAE6lQKmG{^!X|MVe8Q)d$`#>nz|CbuZBhirw87;EWo@8suR0YW;E|>;*m|kfg6& z38}%~TJxX7glej&Y_3!5lT>PVYfP13u0E_5j9vxnt{hSSBFBVBm@pL8Kml!3yh(}- zS*~C;*Cm+tKRlUW&Qtz%0M|!w41za2YyUbwH*)X&nNGL4Pw#Kv zjP976`!ue*f9>2a3$1S7o50W7=ovQ#s&dDQSg};eBG491U347nVx4a(O}0$M%!1Sw z;Ansd{??4$!bZ@z)KlcTp3)6n$u?x%25iEq{1S*EnObgVrMWyqpQIrLNRXE6a*_4$ zHllz?C!Zat($q)0ml*?4jX4h|xo39lZmu@kWwYjN>#M*kErGU(fs4K4Q*GsPBCEeW z{0!d~JanUfiPkG}mjuyMJ*K>{S^>d)TTCX|CnnZP$*__n8zH0;xV*h!+YRI@6VfI!P1SFDEqRLcx$~-3L%_^^p?b>z@7}1-kZr{c=>GJ5&7W#L!FQVExY}gI$F7A43 zR*OgSSW2#}jB2H%nJOWfGOthW6=sAzSH8MZM2>Lo^jp*Whbk}DW$Z_&=+VWWpTopw zMbQywAMJ{f``7;XX)ZFclu5MpHb;obqc<0i`2bW6Ia$R=!9=Y<-^;w{86G&`_ zCeA$_I6Rd2abkbt%<%O?%UbWf-@ovF;nVJgkEiB8H_aY4UiDr|;X>79ch|J^pZm1| zccxw-rXH3UJ~$T)|3qQaB_yFni5Q$LdB_rW5O1(NI}jZ3Y)<|0%msb;9%x5J*VH0g2xnMl~dCwT_bDdE~a!Phl`JSm0(E3j$^+x>IDT;y6W28ZAMKQhvU|7=SySaeB{t5OYLAv z8nuO3w$i~Cts_kEXirm_r@go1F|n2g^?LY>HEAjcswY*o^y+-g&;*iTq<|(U?{Xj8 zNaU1a9I8sVRzJ$8XsQ6jKlt_#MYtmqH`Aocw)r4a#bSPp=}O-D&7?R`;IxKJsl;N0 z75wXtAGNk!snPBo9td6dHZ|9+oA~WF%TxQCRyTsnlcsO~&bfWNwD5i6=46(QRI~x; zLB&9gz+`S`3~Ls*nSW3-6|kH~kO-2U#x_#iM``3D*ULglGvF;?P7LZH=KY5d^*Q!| zBEU%OESzRnox8HQ{-9AZytByqgH-NqSga-B5@ir$rRP!+QXXwnlwVlJlkYVzj*bvr zmlmg9glY`@rizUsfx(Q_q6LINC79zGBkaGbJZT$JZ3hk0Osn0+OV|eWZPuB)TdW=A zLiE}JZmy8e8Y*vYc}=8pQ%|u8totoGB$$>W!=auw@uC{S3B<0pPC!&?FS%Fdp?1f# z9a%>MoyK~{u!f?~KZxdHLKTdVT`u%ZzTT1*7 zLNwkf-uBt)kFL9a?))-o0(7un06EHR*kzp=`wT@VH5|abi0wUIow+(C#d|?duDPtv zA6u!H-ChX$cwY~G+D`IQJGn14bk?~+7vy_2 zvLoTs3vfb2-yA)5>~KP1Yj=O(kKH}4Yu8*EsjK`vrrS8vvLXq*plA1k{Wj>|>gryo zSk*cS0z02l79I=%k=nmQaavq2dQ|2AdkuHofuo;dVT111=%d@Jz+Nrew!YhFM`cUEa@D=;#MzEj z;K2Ryf#m{Fc>Z%{#oDj``}d!JI_Ezve6w5_?tERCGGK#fc@jr=dhA=mEO6DU*CVm0 zHBwK+jsj7Lr#Hl|m+`>GQE8t%?O_0W$g<#YUHIF(mAFFQmF%#MT-1xx{co|AOM+GE zu^501F;(E&>|vTYUpe8rsj3*_$kj$CEOuHs@A6)Lw#`Ca8=Q^2dH&Bnn+r^xn!yBW zNaP|NX|cHGtWldgtp9`Wwvsrq-k6A&Cs=CUa`taW8jB8?QCfTonT;w%QnA$EVkHP& z)%DyZ&`tRzfwrWsU19dsLfo4O*=O2dwo8~670W)PlS<-P4k9qE5in~3<#@Ol>7*<_ z;ZGW)d0HU0^4-;9L%vKZwwL3T!_^7-A4m5Ck>>n&&?9%7wOrVmWqa-5<8FXJETlfl zOI;6?eJ|bC{`uRNe>*HMBrN0K2oqZkkZy+C>&%_a3wwS-RZif5-kfIs`rL?zs&Ye$ zO4IDIOPXyhbuyYO2@IN@I~@VY)Hb8cJ`sx(x%0K_ z?ug1{au$&b};d z-k~`3bAJ4fzkL4m>ELg5L{@TUh*!wi&O&9% z4z5R9hc=sTj%M++S&p@J4r8_`W-BpcW*Me-MX;;cpa)K*@QA!%8N7`U>q7xF#EU`@ zgvLt5p0%JYeuBV9gtk^pCSpLQK{?sm%D0_NB{OLxc$YGUcbpZ(+z}pQ!>&zV4AsZ09-*Og&x$hrplD&U7J+RV8+EIQq^mIeL|C{HOi zWK&r@F0u631)!GCqzVq0BFxdB11PXRY60pE1`@v0SB%JF*^1D^jJ9(K8{Enu<-!Jv zih0e4zgS3_=^ z%#T`*59|l8_k}5t2VK$hE${;i$~r}y_ChtYhRmTOjLu=2L@WpD0E7cBhyb{Jw?qs{ zz!=$p8}3IvyPO-l%~9p-UQSIFqASvuIgoA^e*FI|0QA4dThegujw(nd3yOJqB^*GWah%c*M(_tntC65J7i`4#W&NR9AD(+Q-AJdil}Y2Djkk~1e;;xC&qJRC`Vsx1-1X(?(ikQxU=rhK5Pt_H2#BvnnNAv1DTo5mq>K91qh_rA;d)0*S9sx@ z)Ff@M?KXy{;1Ne)&veBWBb@3FJviQ`Wq$;$RJ>G}3K6yWY~m;#&uUvw25>YcL?Eo( zjvEr77Jc@GHcN@3no$&Eh5EC%GQr4vhZ*F_oJLoSp245OfjG=HSEIwpVtBe9Pg%r7cp;Gp zjeDbNkFbyq9mD*cn9aC%R;W2if?UGz6rt7jRFtF3DZYPvDMT%D7vGR5c`aHs!$sh# zmdD0LX%vwkUD#a7Zjr0R;<3O-HMY+tyzUGo&UH|qO>}qXgeHER`Wm_rx=;p51hvf+ z{7hTG{o}`qk8ND5cZ2XS4I6Xdi2+F7+?dShZ$gPf(pxBSk-mJ+!gUfr7B zE7-+lWlN;0Jq1NOho1;F@j0J=* z_IB`tTfO#|S;f3K6?BPE7EzXJl&^{?i^$)TAMrXjFDfGAVi^EN$wg)4va(|78;9;| z{T>60_Fkhy&rw5;+$D6pNl)f-i|=+dH)wm4IyyS&^A%8w|za`9pU zF0>*R_i0At=I_XNiOMJB?!o+UmVn0 zCd#~>5g9u_wEnp>13ZmGr(B|5=g!71e4A*Rn|U=7o78A>bM}2eJoug2xsi`4E*~6P z-~XDnIwLXyyleg&{UyzPe%5(&pfl;;kIGwDKChVndg0}VRTlizX3(p*qgf~BiKMQE z1;n-j=N2m<@oK|R?tGIw+NPDp1|J>R2cx43fEILBTe*;>Dg^-P-{E0^3#m90Los8a zd{P|~qFt35$${#Ji&4hRmfLTvZqdKcrhj280u&sLZ0SZmpb5lCQ9;YqEmFe6-Nh{W z>Cklwo7&Ufji%LB3KU1wX{eJAETbG@Oetlg9g6RoQgs?IVu(?kg$5N4|4g)E?WcQ# zBO02zkpfShL)mhKtvNgkkLI+j&?>2OvSL#tJVJR)b#j*`Cz}=|AxT=aN|8(o!lEk9 z08j-HWaY=aRSHj~`=gSr4J2U%kBw*+N`*!@Xkb2&Ah=k{x}>I#@NPx9Kx9~?=QYs&YL|_^fPL3D_$L&_^XeIXTMSq?ByZyO+G3Ffi%cRs zS{5VxEb%Z?VrYkow1`E?Sd7Q6C#mT`-duc#LFG}LL=E{n_@+vh@!hCBg{*C2nuMj9 zyutLqPQO%dnM~=wT@_0^y{UwSorF!Zaq5Y_bP{;)2#3SbWM5R5K+J1CsFWH#Wg6Mk z!r@x!-Z6U+LwqHd3%`l|x$XTUUQs5)mbHab}6i>WB7! z8Th?2?aG^j+TeVn_b#y6{+CiGZw;XMh#d?$fpw>nBFnr^{ltFB zLAQ*FF(~8Soxn7w(am~B$O9|>YQj^yr^`|d@z!ORYizZm%C<&Zwa$rq$NuuaZfo%D zR|%B8x~#M{HrO_&rq}*@U8GX@H^MpEUSVFd)%(l9+_!^y5j)P=z>~P} zepAx7j+;Y?;G7AbLBM|*y}1qO(jQ#-K0i74XVbUNB%6m$dYpm=>Jh3+{FgY@)gKR{ z8Cnu*h5?n&Yt*03`%cOBEb+BAAM-}{hdV&Kv=n~eO1^p}#xEwT+AjBvCL5Z=0_F+C z463SJmYE`OvO*Pn8Ab*@MRQo~oZ3L6WQ8(PSy`?!n6eCBM@$(* zdix=nD*XCM15r$ouf&M_u&glrGM|d$-pMm10B9(7_VUA*FOx%^%e)=H;*t4i>}Y+39FH|q7)QKLi1aXz;)Ka7 z#oIA&VmrJSvD>S$EZ*Ov%ZvD@O9UrlR;R9l(eC9CwzOV5ra#q?wnyrT8};n`VJg?h zx)$$oBJovuo|VjtuX@N)`FT4t>KlLC!jwf5?(DK*uck^0ql|b=PVH*2xYmT9*|Yk@ zW*sNpoI_PB;|D(+25Vx^)x>|E@_=)m@mw|gzSh>@^V&+i=nxqz@byo5WLow>?6S`I zKex9oeqQENd#L`8l@oDu|Gc^vXq|9t?eAa5_DiBeG6s&#cH9hgeX8fWrrtGU~qq^ z*lo0{9HLCHkp);tZD|R17`ojZW?dZ)7dQCIw@fc7O0etaNi@5%3!x+C@N@y*K&54_ z$~2^|;0cV)j45zwg3uG^=ezn4h~*d)VOLqfFpF-4GCZM7_S6~)ZexY30l^pXy(n%2 zZ#sn_{7fgPssWH@5uKz1`J`6je#fpjuWtZf7NLqHG)tz;nc+*SveKRA(B-Qn>h+{7 zAabZUTWkg|uM}Y6XEt#%d2213Qeg`ZY7=j}S}RpZ`O27jh^J7P$Y@KpH(zdGD_}z~ zEOMZ6whM}4J&6zl=ffQTwSG1>J@Um=C3IF*l{;B%7G{fPKO1qz^T zJQ6@n)dT|xxj|ovb*|=F`O=#Mb6@{;?VejZlsGF=*Jmzf zB2s9YkjzB0787aA?dyx!41&~?3jh)gKqur)7r?{rH&WN}FG<9d3Ic&i3fE#~`gH`J zwKeoV&_$Nvq;v|YZ3l<;T=j-a#>?ta4TJ2`#g|B3KoH08*9=&y=7dB$_v}1j@Gw9f za6Cqe@Z;p-MX@+VgHt5+-Lun6(LuqRJ(sh7I_+&I?PF>54;Ljo(e$NC_+jA@5CuPG zsaVX_F*8?eAq1wv)4bXPu@tCaFEsCwRQ=EcIh$+?zINw@gr5gCWJeY|$IO}>-ES@QR804@n_NJ<)< z?DG2fH!Z)62DXU2-C&EFxNLDMh{6`>mz56!vojM4B+_zrzj>Y|c7;s&ZX40Bw9-T6|;C5_w z>et&LLm^Ga7Uoa=Czt(_^!aLH?CjsSG@ppv+t!JJv4I(`hx12&=C$dQ?q5A!xx){V zVcW^63PiJ-1rLYwIa5N^?7sdbai5HD3_#>dk5H?u_-)qAm1e9|67bo0DuuPQ{^j9X zncn@dR0y$rDCXG9wyOwK>~1E5$W*kKBr#GJvSc!6G6?`RHxnsb7%!Bc2}>tz=x0Gk zn3nzE7q!+HJ;;?#qP1CY-GOib;*#)6#U_x>0<(M<;#OBU6>hVfMo2iguWQPrT_Pc- z^9#7EzY1+?&CJ*vsc`_@2xsB zp95v5I&YeOXl?lI8>CWD23fK`8P9msVXB@c#Bl!h8%3D9V8+WFVS{=tUd_0`E(qY5 zRa-SxK(M^8#7brL`~;fj*Md}&{Ye5Qp{TT7_DIvw@kx&uiNaI1J9q7oTb%||dvtj) zwDHII;Abt7KNQuOd?`iu!*>>c$|aQ7=;sD-9-ScNZp4fbn2YTFRVvRPc4x0l&&`A5 zIL1=J!}Jbp02ww5S6gP{?m_|$q$JYPfy=^Aj8t2ZfDZEC4+^njxeq|&E71jOQ# z-d3ik0hZWFqL~c#@csgc9TjR}^1M`7NuLbL#A+eGwg9cMGaD6G-X`vN5pfpCLGHQL zy*Lj(d)M$4_|(3 ziHKi@AwHg#5t@67%ap}i^boZj-%)R`#>%JdKJ9PoI@3XlMFPofSS2nIW#(y>ByM@1 z98WLP->8S&BXO64$B&0$u02Ak@WrXwTfser&>r6h`1(SRbAd)3W+=;Rpzx0oX8_Xu z*BLBBClihy={Tvq(+PDxm+tQgdf6wIm-{9Ku_b)95&n9kzpIg#* zV60AAoQpCXYZFfa85!^yt4qA(y5N~azd zsDz_uJa=_N>FNZbD9A$#D#A7rrM?X`aQka56N?um19mk+y2f+TC>Q!dW{NEmjBQy1 zShNa1rM`f_VFbLa>0V z&85{u9xHpRRWcj7TG9vhs1T6wd6s7(0yS>qn5jr$uwdW>hoI_~@hs@;t|;^AKXks< zsPRgXmZKg`kF~v}j9!3P9${|ZY@8)lbO3HI)5(;I%ajQWPwG?|)@x_U&;@F2NKODtA&ZaJ zB0%gN)nd`Mj>8J$6p8UZO|8@NzVI~g-&$ID`i$7LIL1n82esNioA~Tp_U+xHtMj8x z3nTlJrmnku$eB3w!6CjP?fS~-%KYHF_BPMlB7*uqUO%9uC6yoN&hhtX2j z4!jD0<-LxxUEe=U-Fx4OANEAkpY3S=So_+INYm2dz2f{wpM3?ghn6f_rfRwNa#GA6 zk_c(-&WyaT?=GA8cLiQ1Z!-id)3d-Y10AJ?*BhG0;zIlkY+L7?UmvLlr@dRY!SdDT zJ`IcXMn(e-`rqYVJXC)``%R#BW_9o#kZj#|b6|EwBhbJ_NU<>S649TxuhfVm8iF}@ zQu1t{)!0tFxIJ-ed057g`I!pa6^{-z4fc*r1M>EW$=sWTuOHpqJ~VylcxD2ka*2O7 z%>Fs_^_<&G%EFt4@6VEYz3^<3`Ya|!hB7Oi%LyK?ZB|>a2u9C{{Is~3(~>hpcUhYi z&`kOs*#)OE3Rq9?;s#*ot;g9YIYv{`+ahEQip5Md8%t(wq^=lsk19GwLx%uuj~T=U zmzaELuh~OOvaEs!t`M^Xl``J;R4%|JU7`a>5s3|IoGlUlVMU0f?aKp87JcfRu+h?& zjUKoR^OzecRM{0zg3E*B|KVqOJS@zk0pU@SF>C(DsWS1*TJviQJi}$5-<&O5e57&m z@b5tMeBRjAc&SDef1@xCA#(BLMdnG)mM)7P_{_T(7g7PtM6%ehz3;{CcR`)!z#pjj z?Mu34umPHM(zCWpjwR*@a1#%h;M)A>BbNL3Dcao0B=#8B7$^a`=73os#ZI!Q zLQ$HDpG3Zbul|`yFh6}bQyq{=HfP(zAk#;uiPY}t&FtZGY!k{@i28T{Fl27sCk)#W zReELQb>O>4kF4#Id1j%)BH)}UIbaI(oc74bO%jQ~6HsNxxP1ABV`ah67)`P?hzUP5 zAO1y(%T*_;%3Q3&%JPkIX>PHv5F&?PMkpm&tDchdY}|LQH@on;8Kdu@@8t(WCn`M< zf2HORibWwS_x7|Osl%{?RhzrZe<5mi?-D%@yITkU*6T$Q^dlK(-~OI?Kqe zrmlzX?haCk{#cB}1JmJ-c@V0If2qxfz3VCfj1lneM~m<4Lo6N~u)P@6mSD(IpIM!n z2|c_GnIgm7N`GvOrAy&Jwze!DN_t=+oXR^UK>F4GYt#Bp+t~VCw2u51^dANFS<)BK zl~|Y#yV6E1nB7I(J zCmn|Wryp`p;H2W>Jb)sk<%(Vxz90NB?qdAzFLYDzxi9rYow?)VyCY9fayC@Vz6=cwZI}pb-7EPr`=X}t=zJ=T zN(rQrZe?in&V9e3mS>5Uy{W65YyzaaIl%o~y4X(|o$B4Zx_4qCE&9j7)fweAy0IN3v4wwh=kGMl z49)*fkI!x?5Q8l{pREmp9+I*DOMg2!l}chx(($wy->M}x<@_GJ4yWq!SOwx^LN+z+ zu;$idTp5NXhN%r?btJC(_RNC0S&%ZNkT*qFj&4HTMSk!kq1w&DL*~|-mqmUpf(F`O=UE5L;wxDW#mdWsS+{6zUQ4rSJ zGnfQnqHE#lyx_YtE95Caa`QC=%1lAmrmc$09I{fZT4hW*nMRwGiFxj&JRN`I;yMze zx*Vx$Ii>nu>)TA)dIg9`H=xAcQEo%pn;m?7QM4D^-ikg_!~<92{vyAZ{&H1UUBICV zbCF2L7WdFDc?{rFleeVc=PjAyR)TI>f{^XhuXX~rJU>y*SaiE#ZatelZDD7&_RNOh zK~*0d;b9Pl(jQs~s8dB`$EfD=6Sm#S#Vl}hVqGNzI&$6n29%%_rwLHwj6)MY z#U}wH=Ix}djg1YotK-pU(w4|aey!7oKSjLme)OfYv-8&LWu<*;z{`X4Yx_TZ@oQ6Q zvU6Q_)fb+4^ApQar>euzFTEmPMP?sWL`2ob&whIA?vgR^{wS{9adETf) zdEb4D--#=S9AAKtcHni0a?(k`%Rd`!q*Uq2{*xLGO5K;tPb5Yn)q`6&4Gyt%f0y{&JnB8XEfc; zkBR5UW0x*-(XD*E@n_ZB!m5n2vO|KUt%0{xF5?YD;Ne@5IG?icYRkgZrJ?yx-Ipel z_BT=&1{PjV&V3)aumF1f2Bj$u=0x>Sl2{nD(mPZHcdHtreAiyCGi0|+S|H^N6V|o6?wFxq zY9pzV4lyxXW_I1?Y2|l)D~Kwr#TtQ62?I~dVXjJo=uT~%51h9B8p5}ghz*G}17@Py z6GUL@;p!L7NZLV=h7SfoSyFFcvasrb$lWKFoSl|u_#mQ`hhC#InU0uOjGwg<;D$^1 zJ1>h3ZEdzB^9sZakdVEe1@(|r{6@Quy9bUdr0(t0xqFtRk{oYDdJCf~4Ofr5hK5d# z-^e&_&g6-RZ4t?;s#2LNzwLE31kCU(T?xV?PFvK@NazKw@U&1Pjywq7If%fF-9mNpW;aEfqo@dXE;<<=%U1uSdLYxNvpqP@%@F{`PB|#RC6vm*`3- zIhHRqZo~VG8qBN^GDE1?W#D8=5&oCxq;cSq8z;mvG0DE!YyCD5rftWpnPbNlhA>1V z@~A=bK97Cs#Q+*ksO%wSQEIkAQUyiTd>3XAn5T)%cW;;s$FhU;q(1Tyk#r&?a>7M-Tq1e5}3K|6cIp+0fs=Y#9RU%cjP!4`K)Z*aMgy z5nH3V4&Zhn!sFZ$EEy3+^aeg@cZ}aXXouE{`yN{T9ixB0*8?XI&y9zidg*0ro$a04 zyvnhicdZPH;Ng2C#Cuk!MeS?dTgg~{aE}&!_FLWu`arvVw_#jLk7Ueg62QAibm#^OL@OqIk zW*--{FaEL1rTA;k;|)Kyy1cDly-fOX*_QFbTS(O7)u5(tvvuO~>=y8XO8NxY;QJT8 z56z7)d^d2L{dafMm*3oeKe{&YTlfBjPn#B67sf)rfBgLY>2z7JNK0_iMg}^=C|%Mf zLqn*@a#&X9Pp6SYF;fU96AZ=7BU&tSFnE+^Ksf0=?7L4E15PELQ+Yp``*L)t2$^f{ zi%laz-vKp*mfQ!G`469~X2=7!O4wYOLlFqvG=S1a(3AyGS_}alXO>Cks#S``A>Y9;m6in8J;D8mJ|Jc3pQ*UKuO*fVDif8t$;xQXGb)F~00D z&0NF0Xe)^D<0ey*v(bzmSlPPGS;yO-ziyfu=S%C+>D-76f2xjtg9-}tp& zM}I!d%}H$*J%U+XeLu0A@!Zo+b{q_SSwjudl$ZvYQ*%IK#kQIV?Lc*+uHoM4LMFnY zS}UY7QWtR}nWb%GC&Aiuy83*roX%;M2J^C{6dcDmx-67uR)ErjB3Lj-x1Px|psLi1 zB#|SupaYM;ces5Uar+96l?&h9=C6+Vei$FTvE-kG)g0x=LYK_E?b`uDVm|7z-kMH7 z;pH9Tyr_qfw&QcIEi$<@-j@@%I!(+f(~Fdf^9WI#0}-qgE0y?h-p9lRfOdcVzk&Tp zq1LE<)QQEVk3jVParwWC_%dIvZRhM;T7b12TX$Mq#?G-PGDy2K58Z|1U+%tNL#Hsy z7S-f`7a*RA3n7-@M#hMN;CdZ%uGym;Y#E&;k?;j)+ z#@m1Y5dS!Ku<>XjCo2uwJsx$Et9MHr=~slmJ%&bX^3woZBFd~|*F`Rm&~M&pIs#$65=e>t-*qkbsV+TiBLw_{_wfU~|A1&M^*zdf)#0e5{2 zPaHFSg@-Sq@|>vsoK-K)fO4{BalhAE_+de~7N1mckc*jt?J9xg>)K|n=)iTE*ZM|j z=>4;v-z~1mjl2TystZ2LK0AEFtW$eaktViifjvZJ$0go(=`_r#ks(uYf_ zRw6xCA__BdvTSM>S%WbHIoui*Vse_j(^sB^lwL7>8tk8Jk$#qhL`ubVTT*70*Yaz5 zJYygr)#8J_Zpxx;urPzK0gGA+Krydw4 zQJ|)YAQVGocQsR9aF(i{1WD-0jBs?rFv-;$` zCjz2}ICCb$^;Dz9mxo2ix|%()+8Gp;V|;QoNG}ACsBAQuSFKd~V#?uS623B0sYItN zK-`p)TO@voaf6>HbZeXR)X{@(DCF97iWLynz)-ea+ep4a5mV%(0onV^l<7pgcK)F% zVl@*q>@)EMJ?>J4t3R|J=;Ak!j548bSe|>ArVkh28zVsx1Lzl>A8)Ro#YTI#Y^=6f%VZA?} z@8oV!0!nYYT5w?zEl*IwyG94P2}DDJrGp`?@!5u#;|&)U-fUXJ^f_U=^sQb` zh;In0)Yr?3-i~!Yid_brVxH@Q^X++f&juNlqv@Vx!mn%fJgU@h##fUIXkW0>e{a|PQ@ccK* zvWWvz&)`e?E-{KHBnX z?CF4)IyPtm>6|Sb@85RbZDFa~?3RVjq;K=Ho0{g+LX$prm^6QXFf{*j(sXOmZ0OuT zXz%J0QJObOpyFu)Zd(AF=DpUz!8f%IxA-9lBc+lhZ7CQ+=;!b$rHT#c{?QOrM64!* zOol8bc73@_5bnSO0~y?#jo_H6F=UR`_T7*oKMAdFoW>FrV12dg65!rco^i$Kh6fax zP=SfGlEuTv4b=si#HwW9n1_oqJqb*ONtJIR0=kmuq(A4S`jm`j0y$E$)O|dwn$r*y zU_sbf9SPTGxG_~$RSzPF8nj6$S+PNdnO8rs$RZ`vkcW%=(-ZKS6?l^ertA^p$1HSL z@gxi&?Lm_vDT9=Xlt@>~kr@loD2*NK!x!x-LfSx4IWxxNk$Vx5*W&wW>jYYBf&3JY z+pJwW%;MR@WOpc)tyiFKJ6_G$AMS^)f#_zpP^}PoN1^xCai@LDbF71<$P}1+th}ZV zb94;10#f!Mww4ZtnA|F>=jwIW9Hl~1dfkn)ExV(Z;?#!)O0DU#yJuBJ1MF7t9KvQKX)&#{zHe| z(dEzJ_$!BQNTPRCeZuac!sC6E(_#tefFqMIX>yx8e z3P6@#JWQkV;o3}3l${plU11K3EEw#t$mBq-+6e{!si2=tkd%)}eXQY7OF{j8&jN9T8g3;(&VO|!es-QD)6 z=9BCA+dWKCiT{^pIUgHLqB~r$B+X~gQXV0R3jE?Au5GpmDcT;ec%E~xj z6v43D%cdsp)OU)QB#lfYR-Bi*>-FlzE~S z%xvEMdvKjUk5q8|L>iG#*zKS7XI+E5mjRk{OV_U$1uYM8d61;eq9~liM2$ z9`A3Qe{j$O%*a|-mzAqVe%*N{&*l6+Na_cFWlDZ z4-;EI{xkjU+tbyLALsS1nsA-Gy25zk-*4Zh;|3e+0r>verqHC%pF#O!5`=i%zJHp# zbTu(Vj}Tfw4SX;;K?=qa>;- zSewoRGaHJ2_STqKsUBnT>tZ~7Y5zyl*~c@z|Np$H3d{@`q^Tv|*b8f?h*%gi~ z!TSaZLebyGNTn2n4ob4ZeedvDsW<(zh3hOH&U*)mlw=jD`2k0Hn2OT#Fjh+0REzdF zmqymA{O6HkP3mP|*x=!Q!e4~&N=3&4oUDEr>mp{#WDJ&Qj1a`eQ)*C&&Q7G(<_Dk&uU~m!6 ziXc2?h|Gc!BA1@yuMtnRz*+_3h!~}3SOWp^<%pHf?3;75`u#H#vy<(_La*KGAFD8pifp5NYUUgj8 z8mdr0Sz1YJVN@uqU+hq^6?{@XgfGGQd_ z=Vwc=-5rPTx4+JI29-HV<#B7~UwU%>55>ooy>H8ozX)G_JN0Q|iKe}NK9#;i+NF6H z`hGa!H5-YvkN0wmziydOGLn4;tv{phm=p7I>$+dI-Y40Z;@CnZ2>+tk{KQ%7}5Ao)iPnQ9WYcg$ccIGoE37`4z$%}p0@{Ue{ z1N`*p*K;%O%VJ7<{y~T&nz0EDwKCZmg`*XbY<0`IvWIp`enUjY7nLN1EY-flUWX?c-oLS{&3r^Z>&Un}91KA}!gLsXGO9&{~lLm&@=#%IeG2(M^nU6lJn# zY&kMo-dIjnx2?Cc>W9Qkgslmc>|~Ry-;vMsG6n*=bFRm`tCuxhb+O?>`ZAp_i5wBE z1jkZAMhtNdJ~lo?3ZmaKmBLSgbJEI`HD%#)uFZUlU31J9|Dj?thY5tanQ5vD^Thnnr-&i1`}hjL7t1HY(j zyjnoQbEM48R}qt|WEUIHdKs{W>On24g6ORHhaQg2mL%e|h|NpIICk`gbiop) z(*MfCkNamo4$e$JJJ*~%ZJ2%$7(xOAVwnF%x4RvQ8-9EFX#4p8SQiWhojHsqvcKj8CB0?BlB53xVe@7Hry@4$R?nZP10+ zTX09JcSOnxN-N_%j+MA!=2)uj{o3?r%eU>jW@Q=Cxq7~^2$x>qw$nm2?(KNHKE4Un zlU=qmyy8mgduw}3H6E?LpuVZgV%5Gh7G4p_Jdh5IwHLa^Z+-`kT34KGN6nwf&6jul zyonXHnh+Abh_}xw}21*a_{TrX%JW*XrA6bbM5HY-OtK0II=7T*_uXHad@>0M(HKo z>c+MkIh@QMpnjm38Ig+E06VEdgDJjTq>C^jn@QSb3gcZlb|?ecjx}+^ZBaZ>)+8W7 zw|)%uA>v(8^R1~Q`s1*TVB=rsPzV>?&Ld&;h}AaP1fwTXaYcF z>3E*tnW&(XhRFGdE)Bd3HQ?IxA#zJ{U?uR3>z75?7GV_z)Lg#EPfR}wHm$iz@sj7f zoxu%AKR(9+mE_c^bn7vRSq?`IR`-{F#1;{iJh?==J=M?NUc@8;wT6rBY3Tr`f>sZN zq|Dyz12yT(`YA$Fam2+S8pn*Z+9ostZ=>@)&uO6Rvu)Zz5!IPcXZNzIfz>^&?2?YX zFB#!Ys{`3f-Ew{ojtQ5kLYF@9mCAL|nhe*s;D&`QVR|{mC>OJ2Q%R0PS#D1miUHiIgblmp|eQl@vHX+(*?a`6rU3LYUEYWn}}stTz^I)=!z zh&@7l#=;!4MGsnIN1Y+pU3`3GWKD&s_lV?DD+nYMj&G0bT}?-|$64jl;JHGah%2=t zgZ~cQnN++1-7L*rfIz8YK7kuu>PbtjtD>@{fc&&x-JYT%xGnjfprxYs{)!IAc}QI= zR-DLh>5I77V&|t3diz@Q*lf1W{%R>FhlA$AdzpEP1U0`#p`1&@s@=)*JzR7LR)i%o zhuKkI%V%FNogMr1DQ)?-hg+NT;w$}Wf-1|7RHrzD&M-Nbj9hSisHKB z_5md#H_Yuc-xp66y4hsyk25c?)M~-ZGVgfd2k+T`FO04`Iul)EL``wfmTtiMD}(YJ z^~?ApfE%zi-$YsF^$4&8qI>Es*;j9W_-W0f$rrnuBz_tfy8w^hdR;sHUhZ4YI%IM? zKn)x~!F%()9(kPt^r4kkjmu3Kiqe9p8|OX`j6os#j>MnR=^;CQzm?q7{L1I(Ou(&M zw=UJ|ev8Y0bgucJ^Qnpq!2x-zolx9>xupkfj8Qg_)EyP=USo@S`Gp01uC8FaWW~S3 zpAOZmtOV4`LNCYj?>?nH8~BiK(mN7(E-z7|RHqWeVo(4Y;&c2(CvgBv6Xk;bL%0BR*N-bE& zs1TtbO`9d5(-2<pXp5B86$z1U`uKa zRt?dFg{mp)UR$uD&9F8hnHx}pEsE;wb%FZbdb-cD%@U~yrjX?c8>_tW6p=&f!!-m; z@D0udf#wRpAXq{+g@tmyEoGpVjO3GbS-x)38GhAIBUD)}GP0|8#}!{)YscbROaU34z&aM9 zEIvkoSLedH`Kl=f{aONJxtM81GvcJnKy{!qV`mJf3bmj?rSFC|Hh+D4ZFahO^5y7k zcR)|rlNS=#KZX- z=+$VP&&xCIRC#dAi@?Qed&!LQQVyYOd;?eaQ}vGD7q{e~#;uRFQGWT86F(ij@p5Zu z$w*UgVZp+vbmOp?-@&o_{nmGv_AD;Dc5Tnw@r~PlnSQsC)vXpd+VuA*GjONNg$Grq zJD+ZX=Is`&7;!f`){*FWHZJ9UY<2zd%xjas6y6>FY1Of}Vc;UnJ9IN?^}glHV_t^7 zPnd{beC^S;Un=yqpnpCF)Skazb#fr~XVR9KuKu<+!~b<&Zl1V%7z_fZjwb!`dvntD zU#01bvnBeXgCkte!yOK zxQ@V#RdL}=1%G&XtFKBxD^V!8$~26qOX%jOChSJ7TyK z0$8COyq3ZYe7%Cqe)Yg!j0bbV>2r8RokQ!~3auD}hu2G(dKyDdV`lqu;lZp}{;iVU!2Kv7|fvVK%00#HWNRy>*s8R;bupr*xG%hs^&? z!o?dIH!@YuXoHf=z%nxrz+2Rky4KU~(mPi+?eJSfGUA%rq!5${aqPB?q6Egkh6E)~ z>CeSOd-qu*3&z6d0iXEgng0f-UJlNJPKs^a;t}`alJ}t_#qCc6NWV=42Ld!AHw!s+OQhe26?NCI{OD#9jOBTa0*lJ=#xs{9`>y}#=TU)p z0O}Y<;4VtV-=0q1*zotNlc`In-C-Gpm6GQQ8KvHG*z3)Mca3wNg()-Yw;o9gG2T+% zHO}o_-Fwi8373anEUR?T6m&J6`#ib#JC~7Pl!daty?;MYGLkp$-w8_XMUM)8`{R@0 z-ILfGg17^+ft;}L?ue&K-GN{ChTn5a_55>apXbQI&KEIV*FYwHYNSgg=H(f_{zpuj znVR_TU~tA|pQF?7#xMN#wz#i{`f~6iIK7_$YV#)}(`UrI>t-kIM2*Goyhmfc8}S_J zz=l>1CXL@1oP7-(tuyU;qenlze{=*SkEc$Z+js8c=aqmS>|5R4Hm|IErv=C$d?|>q zNE9-u%ER=fOficDda@A`5tiqWDPXPA4>eI#^3d7`H(Idd2-{LHgGOX<;R+eAbdD)p2 zKzAY6V7~9l4E~@p9t1wh$%$6xW43{EaA~kn+ajGW4I0iSD~0G$ki#7MfmI-hplA6% zTyB@r&C%%30`Y?e(cSfzNtFE1dzSJ=^V&}7zh6las?w0yi$SKaLe`cEiU4SfE$mpt z2X_73buejZbPq~K@GsPRx9cpy{`Osm)=bH>t1Gid^dQB4m~KUdnLwdL06i(EbFSwT zg4VkY>hdbuQ@EP5D_Gpnr!OO$Fg9y+_J~R;YxDgB5$eeZ8_;J)^<`3O6~N?qpg!P( zrBGzl&tWk^1{BrVy{g#A(v|$57XVn0gmMW)(~v8y!DklmUGg(?^lVfkUQ#H`GPX@= z#Pf{OVO~mCyw9UZn99+aY!WQ?(|NrKyT7_HC!qV7lYLZK*>Q3XaUs#HeBRIsITmd} zM|n~bDw6WKmSpR^ids8kPJ}PyYHRw&0j>vUA5}w8P}mPvwSFP3KqHUZg_?&j{P19} zMy$6#WyEkPlcAcjjOusQq$6d+3&|-S;eUmRZa+p{jNJTe8)U*Gb51xwkUVn5l@tZ< zgzk?+Z-1HjZ*=BH-sR@$yQ4GD-b!N5j&z%RPx@j1NWbKZi<^u!R$P^kU)JT-|Et4w z7wW2cVhJaiAA$zheeZF?PS~kI%yV5z-5s2E z`>pLQ^ysXv4~==}Uc_2bRv!}E)q}vk@|dRH56M2GpC`d^y03jWK;QE?!comX8wWr+ zT7pQMUl8EB%!1$YZ}`m@TY)2iCPojv8Z2y2eDw`8b@P_9)ul)0e13niHU7J6i~bC& z^<_{tBX4AV$Axs^G50u6kCqpYz=>Ms3y$Esi+PWdK6*cT6Z$Zq#cO0E@D;pif1mf} z-iKAa8{fB^U%obQVaFd=JU7-#+-%zGxjBVkO_g}_X4~pzkGxI-B*7o`C&#@<_m2z= z#7rNFyfyvbqSs)Mzcu*=V6G-RKRg-pnR;_{>h1geGgCKa*MxsZaoXgX;TtZ#uI9{x zb2}53;hCvQq=IY?#w|$Rc1&u_ms;|T{fYQoj(V<1xriMVY+4aFg zB7m;BAO}y!CdL>lVr=$SWntbhE_Y$zgVU1i!x6U8wE!aG1k~>Oxl|^dCNkxw!l{`U zHV-i}%J}B}-sO0RPckBLQaSXVJ`r09nE-Kx=j%z;a$WV`m+ID|BDqoy#5TyJw$+!{ z08RLR`=(~alCt=iX`(X28!zX8IndUUE>aY*fk_Jr;I`AUn;9A4cPzzhu*|ueWl{)&MEi22^^zcNAVR@$l%ec!t^=3j zyH011*J9xn9I=L4T1V}>id#QMgSof~6>`wQ_6{#VK^UVU>ba#lJLq+UKW|A&BSRB% z(|>qmh>fw>z)80iw7@&S>3z)fh~MTope32gxsE)r_A&r==$&u^IV**;}Y2n4)=g)Pa> zU}gHJLS+C`X?M@wfT9Ye6gpUYTtFvRaO4RLdNO%0s=%jvG{DNt9{p}Q>f$-kgfWdN zP|sV+?bq(9_8PDT6+ZDqTuzXkIz!u{p&kTJrbBc^whWjSHqePK$6XLS1eK%5Bl{CC zT^k>qy?gY_%;fTs=`J&VRk+)wH^p&X;|G43y=xxx1lC4=#Cpuk1s;N+pdUVu=Lo77 zlxu0-vgjk$5k(*ME_nC5mbj4tAbB*;8t$48&U6k2*f{QT{NJ91%9_4(=So~<-@%N+ zKDzhG9dlB<7Q|-k(d!etI(`sq%Z&x8b&~rZx(O@NQxBcnWUUogne>Ly*#Yc2B`qDQ z*)yl~UGZeZ)8gGNVSfY4$B%J7UF}V&uTtk()`kUT)ob@{MKFnfGv1d_ngv zliJiaJL5BMMvSv@&FA7?T~K+Aetz@Q;%i{DyS#n9_T;1GG5cELFWm)k<(H2pYb{p@ zp7+PzI6JTA(BexK{$LWF_s96+?)rWAfAxBFZ8GeA(&j^pWB6~^9nL#@{(ji|4>P?< z$u|alYFZ7?24}vW0{7(&pP6^XO|92vpMHBK?w@%#JK-~oKqjs`vY*OB8!^?lJBlub zvbFW!#qhjnZlzj5yARp57(C~C{}Fc zQUJSxDR6&w2Er?X{iaOo7L2j74nttS@nEh=4+F~So@0X|#GMxG%mgOJ6E>vqxl6!? z6LhqLWodUGWD1ADay$nYQ6ZDk=n9xCC7T;4Aev6fD;Fs-Fj~rxw&ieaR|?HEAIyluRm~nf zSF)v5)-dloa@J%}{pZ5w*K3|V|M5cC@9Hn!@EFDXVF(4$ghU58WkK;cY93L}8~UDX z?c7htYAo5cf{F%GH=bTJwTvb%;R+e`Woj^@3(!D5#w|Cn z)B>UUGEsdY1!aH-Fw~#j$x{GKJ1I{IrpjB(3@1d$*abZK7RZEs^eBYs1#Vay7BOq^ig0i)&U>WHEXp$R&EGp$|DTHR4#u^t$bjw zC6E`?wpykjRu^%{9Ol|`(FhArY|6u@=-FCDBVOJrvc0EBkFu$ZDj#+AmE~~WtZ(!S zN)%#5JU#mY{9N&hM4)u%nAEBG^%B{ES0hFp0|Q4vSMK!i;H>`U;HlwnERK@6S0^{S zt-a!X^6suuv0E_iiMs{P?I}fU+vPrDqGj|5ae~l!fB12^xL}Np7r1&{zPt^rbUvk- zpSvz2d3eNZ3I=A4y;#M6E$e&A>E@ea3%s6%{prqa7-M;8-!10n9lt8i7`X1S!Db%; zgkiL_u7ZkiPmAFdJ7ZG#n5D0-gO?)j>Hm)STzzY=Xmi#slJK()Eg5HmzVk^-+XxzXuGrjTR!uC+s*1zPI5$e8hY&>c5Ij%z17-~yzJth|=El2dr6kkpv+e{qfN@`%ND^`jn zpY~RQtLN5vDA#%v-yd)*tC43%r{K97a+{?#sX`ir(G`eF8uIW|M8=>!mkYyiY!FCQ z{G4^uk)r>eBY`I7QsK56aCp#vhz$nZ z3gE25JZXq^+p($j`}`A?T+hU1=G5p4D7B6d;Ro55k%_e`xe~OR+iS+kL5rRlcqHxR z=z@{W5(P}hGX2dp$Y{J^Sv3YuHaX`41oexvTQH{;78Np1FW#w%dzECBwO^sYGDUZJ zAQH+QT8XE(ohEJ~iKP#NDb__YZ!Q{GikC}kRcwsWw%+%_4Gs;jf1G-O$Y2q;t*60i zi9o3XSh&DkJpm!sU`xcX)M!0m1F%xddfiWe&hvOd+?9w>ceIGSSD59Py=&pf)oglX z{;DE)S?iB(O32?XU4UgaD&c#mEm_`X=h@E`E&==fAewqVJsjyN*vXD=U6bpeuIbB8 zfpfH>YQBZz4ZA#^j?eWQ{sA&pwD6URlvEeYrq0B59=qFbpu?RzZ>?HsQXNGDJ%Vh6 ztAG>`QymeL9w~F6ql$&uzNzGQlq>T`FYjNv?WFng<+C5nXFqJ4e$>3~(fChE`3q7| z=4^}Utuu6u_p>-n)2BaI;z?!IuV9sX1Crclz~UdvogtU6KaUhwWi z(&m^ZG4ikX+%0g2m-I-<=RG*RyW+m{>e0KE#kCSvcqAV0q>YSjn@j{i&TT7y+jswd z;JHX+B>GjuvuEbl@(Lom^1%rl7)yBtF35oop>r2n(Zb*j4(OIMdC{w%dR;6SPx|HO zyT&n5?^hlf1{yfXX(r(f0t-mK0W z2&nb~TcXLtONZ8sj)b)j6h=lnP;pOg-ufK`PVRs0H$QhKX~yt1W82K%=ccCSTFwqX zn!WkKdu>jJ@UPXOuC)g^i(H3k2&~{_wcg2cc0u}?Icfo;fmcD#`4aRxMF(dh$n(Zf z8i-!#*=DIQzQ?m$t4l!ibloXVvUu!-h+`Xqh_n>*SQ2D1bP>zvECJ&GkOQDKHc||r zqXUo6Ndr3|G#yyMu~MNHvBLFpVWg?e4&kuIiWI<2DSY)H#Hkup2xFv#hrTQhf-0tt z`a^79RgWh+1ORHStvr}Z%v3Z2@Hh=|)kl=yw18;Ir$rozjt7IqZLSa^mjXvCOT@4= z95DR`PwwY}U*^l_RP=F|NHQ?gb4M_&KFka^hGI!1PD>-e^3(9g3u)$KYBk4?xs ze9+9UgbakZAmA1ZHl4@a{#RuL`q!`BRaW)!XWd#cO}jtD$6$GW&5!KkK-A5we*8=So$;A+TK| zf4E+*f*$(9>Hfr2wXC5w7xS%S=C(8A#a?b)7dNlMm22ke<{iLZ1j;#%9r82dfjC$RfI^L5Zl3z*w{uMj<9w7C zQV~hDeyDh)m`I=q5~@Ce&5+r$&)3#y z-rv1%epV3oD)5?Jbm>q|Jjp&i>@m2HV@9MgO((5D1f#q?tmO0f&B143BgL2A{C9B8 zqXHl(e0p-h+-VCvFvKk?+)o-rTjsjyu6x`qu$tNb_kHuF`78c4wqVZy3 zw;2OSLqhV z)^n~}Mr(8xs7rdtPF}d}s4ZFwxnlfHmoPm|cnlTU*np>&3`1R4U=FMWRvto#%IHB6 zWeqqG4r>1jznc~?-kpPC@;*JyMeo?uX36mL=KdKXfvUuu%uZdl4t+%>{dpWQrxzhb zZO6Q$hK$=RO|pPEvfkUIR9f45%$kh`)~SBr!XA=xwV;9vcCZ-;7;#T!Eu|9KS1_P; zIkV)5HG=>^mB6<3!_a#bLTph30$fIbHe)SsnFkG> zZ3||!o_=_vQTf2vvPeQfR4uwM&JTS(o0OPRE=O7`kJp)SB2q3Xog0*+jCpmNEX;8a zHZBZQ;f=XxZ4>l&<8+ z)GoGE-&8C-T!G;^7$LTRq1mi>)qhIds(c3n%$GhYhX>3$~%2@&N5{UN?!t%ahPy` zb<2gwh{$w5+UsJA;;>bn?lE4eTB>k;-BaE42SF&Xxx8SGB_Ay^`Dc6Ku^rC03si@x zPbH}R0l@K3ds^Vqk$4iE#7&*g=Rf)e0snxF4X-+RZSwud@^h#1irn6>QvRlzf9i!X z;X;+7fV67T@U;Nw_272gn<$HK?5#Z+Q8=8Qfi?tHX59I)l*%PM9hknwUAuKFMz&#N zCnPbij~p<;djS6|TLXLyf7YJdcc^Rl#mD=#CkMvfJ-M)L`tSDT$zvH_fk!6(z58h9 z&%vqN+h#s(TVivkESzB4X7_!m(c?QxOwo5Wr#&4t^3BB5ZGF&i8SvN;A;^FX!b&L( zZ#W_Irt(dAC>m%?Mn@wu(q!2{0?0Z{rwr;&BWPeGNO!c^Em8F0a~kn#jxwkBMdveETHLo4lytkn`I7a;3%u@cLM zED4!N&H7+mSA{p6$A;HXuQTUyK~LOV8qrrFr0W;;bHDk47+e@vyQdsaAj9i9wAO$W z7w78Z%lesE{^Rt^w&Yw0GRlD#)^c{5{1Ne^45l*kD%o<4{&AQ;;3ecVQdlgSA6@wX zXcw|${Xw{{Q$jNoWjU29<^!!5e&_KEJNFXZFixY|nOHaI$AK+R)x z+jW=?AFQ!U2P1T;t3*;gnRw1CYxtluzxcPv9{%3Kg8KQV&Kpl007mipP~!cxfwXnW zGeAQhSq^@z42}8ZVhUet4e4%4d^Py$RpHis_hWA~ow<)QbN%jGk-knP*lCe(%w@(C zY0r7AeSqL|qy0pu@!m7vQ>gBLC!XXtQhLK4*6xey92odrH~hMIS?o`j%|{Zu;(I{N zWcuv*#5j;UCZ@*HmhQVhc478);LPOgm;Ier7~AuQ7jE)!-UZT|>rJcTZzFYcXk>q1 z&ma`)sRG~PuN?3Za-`Aspb4z#3sb6tFCgfMbTgC4i2xW`h{37lLa4M`!7+ht z)%z8eh97s@)_q$ca5acLMFa#yH6Ns&o1V&qj6D9H9c~9qoyb-H*cWl7;MRdAvWVrD z0Jy<4H-t+#4m_|8>Av%YnNx;OAn=|Lf?bsy#--}P zwz#wB$Q;F7trhr~y3x`ou891>WhX74C3ENTi71B{>O1ZD{v# z7)OtAU}SYJSaGsu4^tt0kcx+l1@A+%7u#nt%v;@S_0@4KjEi?J!_F*ZWq>%zF=cCZ zA78=4=Lmd3Vo*J-|GA;AdQLrxZt_5j)FeHkxwp}tm`-QHe}RC1B6+Chjrh`jx;KN^RuSc6!$0bkw_k#zePcr8>d#s-s4x))%f>`$4On=axn19DICOVVRvP9x()X#CEs7^9UHqlw_)|*tH{LWa}fl;`|Y*8t0itA zVL34U=|6+v_1&~XPB|{j;xoafkK)8=HWf$k)7I|dDng`pI=n_2dp`^t0cg~i`{@JK zHj#zH?d}<=A#OEK_kMSOb-c%+b3cF9uLAbE_78X84^02`V*m2{<~~#4L*Ub=PkGH> zhDT?f9R2C%rs=VzvwzfvxG~ocrMn)hkEHizo9t@M=h4EgAK1&ejz)GE%-sxhNvZLPW$HC?qDHLBNyy)C`U@Y=^0!RIuO7 z>I1%hh-sc1#>nGF=$x-$a3WLv#gE}afAt{Jc2uW>bMzp!2<%&HZZdG+d>(FhB>a?fc*drskG#BZwGnOa*c>4+?j!$o~z2R z#?d(lJ@w}4jKVByt4$;)0RB&(+a#8?olajV*7hjRsYkhVSerB~8X^}-$SHj}&LElz z40))$uGN>B{7@`}s)yKs=#!!Yc`saq_4-(nam5^+r72plq1o$g zyVF+7RUjH@On||7!&(*Bf=wKzmmMT!VTtL^9PqDacL&5c+c|COxnuD>VYN*Y*ROrg z{8QV{WM~%{m*E$wysUm&Ks~TtBz`d`S6!nB$7SI~jH_dakcp;4{v=XANV(Ya3SK+V zZ4fBE5jMgr5UYMJ0lGaGWkGWIxSw1k_4S|zJi#8=p(G`$?gZv@oEH~CQ9mZo?J4rV z+)d?sgdky`@?}Ho8B&Cw3?*>ueyDyUn*?(7_|ci4n?E z5avN}T?BiqU!>{q5{^8`T%C&ewwNJu_uG_iv#=mc;1$<<^Y`ChJ(_H9|GtEOcE$O5 z+DK!qE*ew~!JynZ*SeCfCenKA3KwiS1nE1P4ldMSg{(MoTOz2Vp=T*^Bi^M1!QqcB z_zJV_7mdxd4h0Lg6uSwo-t6%DJpQpZXZF6;3)aT$Eor1q??bqM&3u2DLiYSV`*Z(m zc($(Q3blOI%a)q6>ki33zALrA8DgGhx@z>Z{h{ythyN^A$-D-8!}O~yyQQCZeE0aL zbJzA1Zr!%+)Ei-X^e>z4$AWEXMKzHBPsb2OymAg)_%JasylVb4ve+~CDSn>wDPkey z3nXryw!bj($PxP{CGxsI9jKr{Gh5jwa2tAFSo%=h9frtJy|MIrV`hF#{?E zed`cFE+G!dmU6spU9PtxOf{8)Fm%3(9u0Y?BVht*Mz{GU0Z5I!v2Ej+sUIKpKaYCS zPz0=H^mGkg0iHs;q0*bd5u1~E1Q50bE6}VAN}F#f`G@4&SSGfvZQ}!9xB`1sC84*% zxLy7YV0a|c*HIuc14nHeJe?uUQi5~iY0;#+0rfM%=*oJy1_u@);`EFpSS6%su%Vyn z_}DDxTSUaqvk6wVg@`p6R{Nt2^-KDG9d{*hxeTT}TtgEwC#YZ`B!KiR5bq6a;uSw! zZaSClCc1Iu3>D7G*^8PlM6UcZq;Q4m9iI0TrVAid8HXmk?Lf$EZ1lCSd&e{@H`M*= zkfr$|99q9Z5=JL3Uc_vi~0dK4uh+)3KL-O%a9Vs(0jf$fC%YooXKSq zxN3h{(&@+lY+&W`k!S*STdve2+Sc%0>@nahGG{_^hzvhe!|r!C#s+2VjXdL5-o76Y#P%M4qgKjX7RNh8KdBC4T#=^(&l{MUb9pEyil(y!lZcfo>Gn3v z>Q7Ecxk1q6lwKdD46<=!KJTO8>`+b1Tvm!x50_2qk(T;X-mJF}cIvnuPp)n^R=wED%bVD4NHY8&Fi%xw6;Qsr8%YCNr zZ_D}1`vS=2g4ERgJIAVi(nNBWQcHrmhS&sq(r62+o z;w)MD49vlei&sDT?fQ4`y)SePA4yJb`tEze`oI1-?uDUH`_rq7<5$_B8phSWt?Pc5 zvW%je=zrkTIFGzX4cy)LU=maPp|2n+4=Gx@+2_Rj5`S;zEk#osk zPc=`+H#e_c>ofbrXZGXg=Gp0OGxwV>dosC}9dB1lUn?49i?jSfh|V=2{(a`29mrA0 z_`qrg(otm;SPY3&Nz}HDrT=M6OZ#$035FQ*4jnJErwtoo>oB9*6V3=M(wB))oM_64 zR83+lw^=Yi?HgU_uz7erp2Lv>h<}lC%wIm`RExz3Zv~e^ajGdMi)**#$1w!z8%43 zfre)n7N5Y_xy##@9K`;qpuV^GJSWZ`i5@=VrIyz{u+u@HBnaW#rt|R}@@9wb_WD=*HtJW0WC+!WwjzIZL_n|i6fhvU1`qMy!j_DobmrwMG?=s$~E z<|X~fo>%RV8Xn&C90lTh<~yf#py}Cc>I#xIY^*;H97gU@7{#Nr+f&f#PGaxmf)|7K zDve}d8CP?$%penjjab29W;tj3S7lkZ`ofIx*Q?59B(wow#pDA4VA;8CX86&vS3tQ~ z)1r;EA5Qk!zw%LKe!*YffpGqUaC@v^!5K4Ze95u_WK1}5z$b9~!q|lxRa#|%rf@vj z=g~NLzJV;E`MKmbWt>9%)#GVPWPE{Rlst@mT^$#>$1cFZ?U<775(fndJVt(aIdbc2 zLA3qCN}xJS4h(pWPfcC@H~HwXGv5!@c8%{V_Ui0=61%>->&B6ik&fdGphnlSOzj*Vp-G^Q$elypJB-TwMRqsjFak^%aNHAcGkx z4f2z65UNLO`vt3KLD+4tWmi@mkE`9eU7B7pVq&^>&4Q3Lua3fZi$f?^{skqi-}bU4 zYpzXtUHf|B=+uYiX^_qM_X#MZzdZX-(a|q&MrZ#4P0;U}r$5g=H{)-wA+aBY-d&8$ zcghmjFbljs%_*I;fXrs$IMzbbyD)i$yoHBAR`+~whzJ{Oqb+Vn4K7j=&6RUcfDqlDp0}54Hg20h<;~yu|EWahw10k{kV9fV;e!r`EKC@Y$vWE_H425PJn($?h!Im#mqI-*OM6++_B&!*>d)ZM&YrueMO2aWK+%g5s? zVYNTaoXwT|T3?PiVCtt>_7$vwW50KPo``hU%t2jUU{M`)WX`VfJHEraX&}vTtnJsV zJAfl3Xb8YlxUJ%K466zL4lF$lRyvdVR|N9_XsWEy`3(IF)mDkfL0k8~F2RC9+>VG0 zv>$rIW*IhQHi~5or9`yD6oHrs!08;Uv7Qi)bsLv|tNVNyqLsc5vz_?14m|pGY66J% zcPA6O5{XZo8Va?4B{y%3ai;c1w-ns&v1k4MakOze%d;K$(T{wFt+6Kin$ zuU!BZn@bg!4uK-&XVH}fg_9is@*igEi=k0|rMYJb&b{shtYD_X1ln_C4uBKAe+M6L zzoWn|)>|Tb)BN#em-{09%qsht?#gyU_tT#4_>%Fv7Xt6Re-9v6d2t^B2hL|^?C?=! zq<9#LXcLB*J+N;;J>?3S0yb+>ER3=(GR`4dwpIG2mdRkdL9R?Dfm|CPJ2DwE6EcJ? zJV%$HOgx0QgvMx?N(K*sis4!l3Jz428crbFd~J(Bk`VC6Zl315{V0f>m zTO~43IhK4@WMF&t13a8BEWE|c=_BvV0ErELY*v~dp&XaxuhON7l>(c32)OW=|5j#T z4iY6yCARspXlmrV;WrFX>iAW2vbLShHEb{;Wb(i?DY$hoL!dPYg6yyV^*37u)E8Ha zn7%tFj-P>|@ldJ^oXgUbo4*;)kA1T}-ILx18t_=PCRJ2e{xFhGS!K(i!-R($<&qT8 zM&Po9U-Jb4wge@%1ad7CvPy;MD2R=*hiLlUfNdEPT_Fprb+7{#oG`e|8W$nQGE%MJ z<+AQObG9R)9!VAAaKhpkxi@2<{|379j7Z819U^E0grWO1!TpBDl{h{YguisCQGRJ5 z6>4Sp1rmqJ_7jx%=Z=L4{>*p+{}1HzUu?EQ_jCo9=R^rVg)x*}hn2 zAHa84&MPb|Ri-RN8+gjYv00cSD0(H)T*w4E@0E#BuZAKTLp_fvMRHPjk`j!taJfix zz>zIE`t{Ay+5et3UvJbE|8~Z0_mzMDm)wm>sJhL(Ms#}Y_H7c1gQE)fFQ-w;J) z_tWCw?trU;fdIj-j*hS;_fN>wuO*9hi6zXixcON}UImhhYEHlVkh~n!%2d4beiT%? z=huN)$G6_wKYkvcm}tFwXz}|{>bIa{PW}9A=L|E=wE_glj-;tv?eAfE-yexUN!7Ps@6gKU|y9Udh z@-;$7&-Z3;9w(Mu`V@ZyP%)GN3ZqINo*b* zc?{0(hsIxKriR6E~L1ZkpyCZavH-5%%X2s}QepjkhAnj?)q$&k~j#>KHFv+6RjHB(QSoL3Z5OFbd#nWDvIg{r@{S3(b! z859v|j0MCglPFqVb?C!LT_r?~B&3A#XsF?mItqgw80$cHVg&-K1&KNO#*?x8V74g@lFQKuEbKAjr`fa5=}VGtqzm zS88H%;n(`YDLKU8{>Kb=aP0&sPub(87P+ zvruQ3(A@0s^zr2MhxYf52E)H~jDrslkel=x`S9T*NY-o}Jb8Cd_rMd2Zt2a=q9cm~ z&z1PpEPb|0%JMDdNc3w6B|82`d`!Wbi?t=}f*M<9!?ZiD^pGS&q@>IiTM>_tUN-`5# zCV2k!8j9``we;b;-U6>;RONhr14H}Pd*r8Xh1MeuSQaM0XHUZQr(*+yGjEU1T%Mi2 z*8EF}@u{QJ&t?t(#!nsuYG{)aVjGI&S#Mrd9}4;u-S`TOhquUz@RxHc65un24Q2@A zI7Fg1fXlF(-vEM$z`9A?nITITD4n4{_(W#x8ybMzie9Nm=w{AogMcem*rMU!JbH^A!yB&+l`F&K@I!kJV9~^qfau0d z{vm3I8=^ujGp9oz2b8lJik$CsGlQx;M|OeoQ+t&+4|N??=lIMNoF4O~SU zYz)QwaR8rNx67B4v|OnCg5=Gi?zDhxdgcsAq{>=XLVP(4M3O&^ij;pIr;j0qbG~3O z2fNQqE-0HVqCRL)&&4(UB?44vF{2#AK(-7S1A*KhtjaG|ev@@@rI366sxx&f7@o16 zS8e@(cw1=Vee%LcULcM(WXVWXFT@e6iDw`Soa3K!xTM>M(G+k$J29YKnQ(;%nu9IL znM(r3(Xo`2gdezWz=APPl@_Vhz$t)E>j;Vs8?Dy^m(kGr$XXL)f2JpnrgEaF)A%sY zssA}e4UrHg#TFY9G3|J*AoqH7>i%HK$Re}qf}qjQH?Cj3e(v))fLLxT9WN$^F8MsU zfb{%vLC}czqsgi+v&}uo+J9VHL!J<#&ZiWDm)-D%f!HU65FQ-x$ELraLR=Xq@tM&! z!FkB7%I!k?!qU00%ddMhQ8gYTCLJB1#cDjcEAz2?+`+2t_Cv|d%h#Sf7RlTtd<33z zTeifQTpPf-kBlt8j5q-=cs}RU!1!M0Ppd2&dr8ix7@o&i9f^-q-_88@mYi?$1!U&; zJzDwa|GbmJ-YX?B{LmQr6Q{MkP+4V;vtzjPxua9DUE8bPhtA#HB)#$I|Iu{r@l5yc zAGaB16`wJuQnpb>5=p3TKAUkPG3;9rk({Dc=G4JqV={+oBFZ5n!d-|mBy^z2p#zad zY9_awqMXC;egE<6p?@fc+WYgquGjUtp0Dvp*M!%TB#Z|r^A7QM5Qw)PCW7X4a!GBw zpfnx_ZI3N^oOldjcLI zYkywKH(gw9Z&JhtW?AJ_da>1fs&tvB(hku|@$3M1u?mt<$O13Vi(DD(l6CZs78wLP z1xk~zjOWtN%sB9CRS^XWC{UNZL!-(hz{p}YDE&V^salJ&ifoD}nnu)bvy9XRU=+MG z1_6Y_3>FS8MF|A^4Pd3=Ac_=E97>f@1c!tJ?m7e$%YF#H*wI!?z|Gz=k_*Q5vV?UF zW@0ixhqF-5Fyc)Fs5g=6c>SuD0|Z0oeqhuVO{*Q}U*FEN@}_9;t!i2 z)68Z8;3K|S#>tuJM5Ax(!EhPu0Je1~d;M>ffeE*a9nx;mL+2(N-X?N89z4+PyFMv6 zqZ!fuo4XDFP1!q^2ghO+VoW65T^xVnw9ZPjotMEAcI;E#kVtNy4F8|s5o%6D-|~sx z&j*NmKJ0sI$wkgU$0G3**|wonh^}k>XR9n5BFV%dDWxzxOfYaJpbKf?&WI{SL+72GPo+1ZM0JHYHpw2wYC1jd$%pre`T731}Of*-`{{?o&@bQ z#utXd22Ny|sx2F(y4l{=qoeKJ zBiWu&M(u8W#}B{eKMU;Ac~BEZf;#G|k0??B44{{B-|Q}nTUM7s#=XlqNu~Da1t<#z zo1#{xOh&ug40*&G9@H~9$i+U3{Vpe11s&p`)Zb~AAh`SOmM{sYl;Az8=iBA?zA(-( z=&W$y-ouR>a&WWE27&P_zJTG85nNyXb?NDYN8QZLFB!+PH)WYl$oM?!SjtG&CC)$z!{@643m7#oG1@-GN4?e1PbBZK(Cnz3E48X=b73M<#an^|B!tqb3mqX z&{n!-tlsRC^zO_XIB1^}JAm}=Y?s-wV*G6)UuAGlh$Lvev*NL zrW~-pBw&`PvLd`jiBhXRJ{socs#CZWWT{W)#%Ffms8B_UhLk!*O<1h&eKeq%JcX=N zOuep~pX-c|m`zo9qaQvi$&TD1r%OY4Q(!zcaf0Zh&5gI#1vRNdf13jdM@+4Ur&5|( z&i%4BFkc}e7}AB7R?_7k(9O|6>`BK%rcz98L=j9xDN~A=26DlW2sn-sK1p%ac-L%F zsNo;zvSPe9pB7v^%ckLKCDT3Fa6&1bTA1#PL#H9t(v|7N7BW1NFR67T%}2H*-S*z8 zl8JljfeKa}n2t{{5aH`F$R(1qVsf*d0iMU_!?bKgB2iA)M#^pifb(FEX{!T3y;8*v zV2wm>wjn%@AWxJxChxt$LUR+5x>N$+i9qy*S=<*_C}=b?P5RAOBg`_A-r*^9r zcPB!x_Y@ksXBaAv`k3W`a0ur9t7xL^{$0g}xQxnQj~ACeW~&{RZWpAO4P41C6NdF3 zGrc;(G*f!d>+bIEvseqf0EfSFc!q2SY1lkVpJ$L0H9=CU`CUGM#g|NMe9)H5D+yLj zNkO90KUwWzNjTZ-DJ|tBN}&Sm8C^+91?iUd&2~E5IQ^)T851eAR?;5DO+H7xcD(8O zWM!$#q2Q3a@O;XPt@YtlgMPI@ye_+k{+@!2@2eO(*bx0|cK3SLvA#{WLiC@U6^=1) zhtzviga}W3X}TO8ePr~>HN$4JV!K+sk9uLkec?*jdZ!SfUm6sY1sT+s32TLdvi_QL zP4zjuuNl3|@#>&Rvd{OOd15TNlUvWCu(Ry9A|J^rKXRq(Vi>}n_c^UOMg;|CCj9>J zdgS52sx5ny%XjzH9Y)lb)mUX3CWRfZ`=5JFm{4GNFmLy%TE_Tk*AwM6bKx&%zTdCd zn4sTon;A^0^3BmrsP9+DSf|%^Zo;TP=o1QSre#Xwg6j?%QbQ%I3}~vKOrv;-&D+HC*UEMnW9p_U9=W_ysC^g-a z^M8I^bhTy_{~80oMwVyi2kSx507!)_KKCVZrY~m2@kuhnG_BZ3Eqnw$KTB?Q*f^qp z``JcsZJBrp!ZvXN20S^UVUdP+qyhm)im)rXt3WYVq!Iz4pL;Bymm(p94%WtRu05q9 zLx74da4~@wpB!wubm~{+wr}CWP;(E5_S1FlT|o_ZDqbCPr_%#mUmbg;daYaanr}*R zyG!R>#x+L6)o(Y2)#IODjYV!t8Cq^r0oTUzm}AU*ebYj{XB3cS#+H8n{_}RNziG~5 zy+3btxqhhQ`yS=f$|QQA4=G+XAN9t83f!tN&IzpR%LSva+JdfL@?q&WW;`>U$t(S}Ck6%%jFP*v;dd$!q5E8bkG$j4pv?sCizH za(&ow9b>*9cCb`9u+hgl!F8{{R)-nzpmr4xZXd??*yn~MVNrup1I}d<9)uaS55_YWEqdTI}{r#tFQxu`S10@ zHj>$1kIRGujGb};^$ek)e0=`*pOlhEbZ-?SgHy+SXXs;GfYvB9j?(EJi{uXfdg4*o&x%=bobE_+vvW{=xTCBFcU7KDX ztQHH0+7;eDDN zZ1@nsK*`+9JpvI(^fz%Z%lQ_0JHOdu!slqBD#03$k6=^Y5X5n&qyxi}n@~67A{}kE ziS^U#xoGT?J)akRK7lg9Q5Yuc@;ub3D2y0VMa+^Vxo@^owd&Eh?dA%)N)T_lC2m5j ziI5$MlPF4AyzGEN`@H#^&7MdC?@l0kAEix*)6glokSUq}sWj37{BS9zs-VJs7REaF z|6Ty{1f6Tip6H1sq6tZ+rirvvB!wCtPkH|Ja-dcc@|yuNL3)aZ_Yd*Hc9^Co%{DB; za`6Y#F;zP`+Quc1K z#IyvG(Ftclnj?gG8!0TxiL*%kOr}_q(gL$P_wUX;TG8~xT_0R^xsGv$jjP`$PoFox z>ibwv^33q>&=dNS$Ih7q>kU87NikG!N1o7k9PO^^RC?S$(A8e+?l9Uu+oDnt^ZVoV znB}yJnC0UZOJ#Yh^Sh&0G#b`s@BbRvl;| zm5+&6k_{eYKJWu>=}U(3@tRI47eE#Z4MTm!;@}Mt1S|=q#6{oCO@%0?pR9nc_9580Xu_r-67i=KX_g1N=$Zp@3mCwRSPkk~D zL2ZaVccMw{WoG7h&WNBayIocHTII6=!NsV$JDD!f86n3nBJ_CQud(LACue`Rp+f><^Tq?=Z*? z5%$hSHtG%cYz*0W3z!;5R_o_3xx6}-;d^HEkW9~y$l!-KVp1a1nh))Hbu6&FCXmr3 zoZOfF_H9K*cR?32>*QXh!l8C`tFBV}9Z<&((^1sx(^Q$wr`$6(TxvLxSvld}C!!a3 zpH3MG-Jh4SJ=yHGEc&2D)AGlPn6Tr0jKMC)(V?~6p|Kb%8GbX)%HT%sdj}OcHVgKG zy-EjUadxa*6Bw?HqzGS#O8|H}OLZ}5k|+}o=r(8mzLIs2%AbgR#;r%XB*G{e1=24PCb` zO~jvg@r;(lbp-4yFoUGVmS%bjW|q()4s^qjQv!3GHL)n9hycdFcVQbYMwG@iRi)!p30G|F6_$YF zVuOe75{Abib*7-@q2Hz zQ(alV1m&U!``j~v8~=Qn{xhYqx@CQFeQ{{LMmRTev~PU;Xy&hrOS7FLk5hzUQFD>5 z4$0wWd3U;sgMSFl_GOP>8U8&rDXbF;>biXO9yw?S>7Tk79sMLn`RypfEcedq<*F~` zHJO2YjqAHC)fdrulv{Ncv)&%Dr0>y-q zZmG5{d=4(QE;wcsLDMk;`=1m^q_@gU>O=|$!^@?2l-|0H^hP!7^E{{%ey#gloSnGM zFg3iz!&@tQ>8?g+9YeT(v}5awCtn1N<26PGuNLQp=bDyhcP4a}o)x;kVzJC>!hSv0 ztC=%UH~#3|RmMDut?e9?-n+#TpCuglex_?A@<@%@Yt_KR{HzdVkdE=lcA_WTeyY&b z9_O6_ceuSGeeP7-^m^aXt<(eike>yc3I-oY?|&6u50G%*qrb^hi|I&O0_x1OuE_U_~?@^U$g7M|6I8{nDcH=#%S@;oIGrgVTNyMN~PY{ zv*jUr$)`FLprU~9yn0vS;~eRkd6T{$|J4_{JXc+VHg%M8_vu)}lReZ*@75f)m6h;} zetq{I)kk%VxvAA|@mzL$RZghdDTMCBmuIqh;3Y6OQ1N{wVmj;5a-7BDDkHl%?Iva> zm3(rasv26F4f}{$&)!IC(22Nu8?gfiSxLcA`jzZZ+*F(l0na;ts0KH<^905wfmN9- zfzUz3!z7}nu_!^;xRe7o7At!ZpoC9W16D+wDgv3Pjxq#Cx|wW`PT^lL2&XhZ2R^oP z8WGF=wEdL~(*Oo_ItOr|%@q{l0Rs$LvKcuEtE(#v0p_D>EN?;!0OIjJ+7xN$HV5#6 zFx;7*i=pCW*ol$5c^<@iJ9}|CD!u*!_c~~K>uti3f$DV5Cs~S?r5A+NkU}D)V?peX zEuxgp1d=%#CoccgrthuIMxkt)9i}*tcQJx38xM+?sdP9OuS6vJv<#y1VHjZ?Ug`4C z4<{0@1)A9W1O<@N%yl5))c!LDwp|N?+v?tgVXT3JY>$3v4D7*n9=F7|-K4 zv0*~9zmG~hauT@td@}J`k92hL38u|tG>*vgC{afuWVO~BZOG~l>~>)_e2P{XJ{aW3R6wxfNlO0O97bsxKbshm3@88X;a+}*ws(YG+vxH=`&h+3VT z^lfN(y1ukKX6Db`k=Z|gBGuMAK@vDG|K0Sb-*a`ub8T{HZL+;REUI3=IBoxx zQ)=zUuIw)fO_ZkKMIf_*I3*EJ=PRTZ5U*Z1FGK(L9Ty^qp&2q>8A8vnDO$)MXD~{( z5ZxZ$1yTM!93Du>Pp#ZZNvsEOQ=)UW*Mu(8-z$B;?M6K@h#uLgdM+q{92e$|CIZ=8ect2!2FpT85v{te;4R!dw0opejnKP`c^fg zkD(WG_OY;_%FO?f+UK0svu71c_>7<~*I%GI7S1ovjbqe5U(32!!*F?Tm`zvj@q6#U zxYvawddFg^`+FJx<;BJ4{~%$ehyaJPnG1$?(ey zQw-1mbd73fbi1ox+xl$}yu*8MP3eSgKz0pdkZbtr*ZreEO!Y`wNPPjpXtddPBftMA zje0m-Da!^>Ve#HZ56@)$V%F&uyTAkg8@Rcb93FD-3WP$pKKRD}E-2li@GfV|#r?VZ znWM$Oy6+bsP2NE3B>F<9KIM!H%ErUp9DoJ$R7%9Tp*;azLmUZZR( zV0-DtAFvb0!RZHf;vfz>1^A88sD7zdhiwYrbdzD5BBWB1WpJh&9qHEQ!LIjHMH95V zkFd}!mN0b|YSRZ3kv+-v;J*zl1^Hy!<)`AMQ{mYKwfv4xvM5y52C6Joj>4&ONz7G^ zz>+{9!3G>efFFx!iIF>y#N#6R01BN@-nW%BG|lPp=3?bekWNblZQ<7R9@ zTK6P`F8rhuF)RNbNeQJ>q+*RVxp-Y#$tNi{f;<+FjEAz(Tva@gEJehxLsBBVJb?(F zP&X<0a3mj>o<#AQa7OqR!xKq7`OjDjnieL2dXP?H!@A85T#q8_$a2}Z+k!v`-}pq%jP%7UCd4c{uC-aL6|esu0^qo{Vb8VM%;}+q)w>qUFPm1g*B3n3@BeC_ z6m%{{dzgG56V_DRiC(?5)OK!F)SkEg$KPV5|6H#A+xC&fZ^EI-g{i@FjZ1S)YvVCX zCV-zQ1iO{sfw2U{o`~Ij(Mv7Y8`qXQ z$4xw==SIK+!G9kVjV(P*>3<6JK-Y}*MT@2DYhsYF6|<)D-`mV+%u>wiN8n*zU+Rll zt!M-ydClA_pgC<}?%!2!D6No2h2;OG(a2Xrsi+UvcE}LItBjn(iTT{NE*51M-q`#` z+yo^NLK2(X#CT;ZPNgCnP17Xch#Wlp;FA(m57bXBBIPPF3yqN0;r>~ zwt2{9v4Pkk+e4;VEWf{g4z%<_et&OD0n0m>erjVvr>o0@+U$@c<4?|(BP+8zkVKw9 zmfoXx@<<5s*VLs3FoWp4{St$w2FMV%f^V$=nMDZ6wvpOvDS`|(Y*7rj*Hu^Q6haZ@ z>@>_iTqTnQx_%HPzfWfT$(OTzt_I)Mhc|q=6V|>E_rT)qxu+rJmJ4o!D|FdduahGk z*S4U!|2t;qbb^$ja^h!#_mtSVAw^4?O|?AzLPz^XL;dA4v(W>M*H1kSDf`l3`R48G z`jr)iFy-_=5z|BL-6x(ty&OF4*5h5Lhf{7Z8s~3NAPn|0{rE-cb~t|T#DvE}al~}v zA5nq@WeTwDXGGhp7>6?L9#lUocrInQ;=WMaK7yR;D-Nuinws`#ANedOk}A0GrXT8o z&JfoC{L{Lydlb+$e_B@G?rE{^0uG#LphyeuVE_sxH=U zHPUoI#$(v2>bN8{k7ua^wb?o#DJ3-SZ0Z0NPfH}2uvyF`KM{zR0j%rM?$=G5#cS4>CGIH5|K&pSKZoMr!4!f05jiy;j<3v%Zp749lH z%ZhQqHu*%5s6t8PrUCab5exPPizSL^J0EiJY!Q?IZNee<|2$>=_2m9UCsimI4G|uT zaM-t^bS@8ubHqX9#~{bl{KsBi`R47h5?~=qW5Y(s45cMwgyFzQ5uYSAtJusf0GZ@D z96XIrlhftQrX|T^5Ovs#$_YqRkCp-=)s*^2W6@uB_&**R6{z)`b>}&*d9eCZ`)N{u*0d^{xA7b$M1MX8fr6Du^^&z3RC> zIkY^fvG((C`Rnr69e+)I`z9Z~em#10Dk5gsBzpYOxrWvGnxV#}-)ZM!R*nNn@yqY2 zsc3&0z#KaK~St)*9JU-k#yb=MPAyb1#J^woR*NNWm-CpGz6hr2qGUXBsTbNJX1F@ zE%lg=?2K`~A{SCpkYnFsGfB9IM2DIAM{kEL%#lWtXM;XUybo*I_h@>hCz)}`?>g7- z-sg(?+Ud(ihdlOKNfjQdJF!r$?A*DLFO8~t`!sqrF?kDHC(MuM(wX9>iNvzi3wB@w zn6gTNR-sdCrcEv*e_oAZPu>UOTZ zsvAC`z*{ySB>l>vTaC=@@w4`P%C7V@CJExYL~1G7k+ArfD=fFt0cs@O%S#I)r9v8D z(2FME^h+0QPN4|qn7ULRQjD|3ztwV>wcmvoL)w6qXe;*88uC(i)*%p@fo6^6`ZGy# zv0OTyMo>^lzy|18!7N%q4iez=O%quI=ztbmG)|Ly-WIPK%!`BLSvck?EjsfU%;64@ z9+J|t(I~LcC4xv&BqpX>lny2OAc4fK*=$Q_BqP(}AZ^3Dk{~#PO(SR*!8`yQKw^jR z2^6sP@!Yhv%@mMiyzms9_jZc90#I2ey;!OVbi4uq-bE)mfH7gC?Z`Wp44wpv7@F?( zpv^o>POAC?9bCRCN?+#~wt6ofho+iij_{GsU!2KmAs2l3pL)_g5ia;2QqKkDQWW}q zk{DmidPX6`jroiCJ1w?IY+|;XTWP8ro6@Xfcs5;L6qFPhho^3+lO^0liXb)i2UY@x zLj_(LJ1uBL^7NGvM9I7Pd9|8$e~=n|*#>DLg=63AVv`Ds)ntp+%xyz|O-wHUZgBL%(E7}@#pFu&uuEvvrRCXggW!qc2pm}c zo|hu}k31dd_0B$B|6qJB@oM=|T<_qZub)g(b?>0>%Ix6Lm}PB?KMNJpO_A#@tG+AZ zx%TO(=>y?*K~XS?x`uy=<&7syqNi;YqOrq!lqf1e|8TwtPlQI>i)Sp z^k>d<{p!$C=KAc=YJJSg;?H;H4;ZqKmEVxJXRz4LkZ3Q2X0sp{uGaucf$h~oPTCT` z87HYjBtt0Rfu~@&aZodv!j-qX+N`6r^Nvo-;T(}Q3BqtK(Y8`gw2+AWI1Cr7@d*Ld z$=>uQ5OtMw`4r5dzs+M-`d_Xr7`d#>?SI_+`CeVqQ~dmRhj~zl+*aw5^1hvfjz%Nn z$&`!ef1-xQ_CGG$6&QFADcWn~_}@qYuFNoQAxLIp6IgbA6MfYJyIi&EHeaLWeAyEI zJxZ$OBTtWHOZx+=SffXUW*_YnJTm|Na4cJXTH{Xnb)c+zWNxyQa+RM1?*Mmn%X-;Z(LTSN=12^!AJ}y?67O)g1XmoY(|tiwL4PNtlX0J@8?eK%#K^_g zNU<}l_xs-3EQEXq?OCH^+{7SWD1hIOJnNWnJQ^z8_mdd`q^^&vgYDJd+1_Pne3v}GxUWS6woEKg%MzUah z|Axn=qz%M}fGd2X)y7OGfsz>Kj0nupRRXPhv8ijRl4r7|7QMvQmz97{$B1#BiqL+b z7s>{?29peUUgQ??1jmP?s=Xc0O{3>%nJXaoLWRx1OuQ)-9NTy( zm7Jm8;b+T9yaE0R#-l+Tmx~_>g zs#Rwx%MDFbpaHmuEJ1rMIt1aa#U#tU9LbBT&1a$-3$Qnld-K=o%8vS zJIhoy7+q+};VPj}Tr$MGA)n&E6{eJ?yHM5jV-5HiN~<3r9$(`yzmwMVhtgaFH02xh}~eP$pF>5!Gr$AhIv)Fo{Rb zIL+w6=#9KMXIc(Q^D$)u&yI{n)A`P4(=Qx}#Djbu1r4rY%k{QLc4Ar%k|39O1lHnV zWej_gD9HiBsr5IWtB%oQD?{t?o{KF_^M{%iHCE%Beu`#ablzTFerz%M$g^T)ZfrTU z;l#r2@dlfnc zJYMC)I3MGB4up=5jc4XHtcriVwOINysa@eYIOzG9jo74gD8Qa)5UiX$lHFGk{mnmS zUL|_UA4Hh{99nB?TB%|R1_B*dq{5EFxW$K3(|(v>s^Z!HuGy?vuwB<>gs3Z`LjHSxux+IfvjpoNQj6I{1L&PdbSXeF!(8Eo?a5jY=} z;k?rLHs#QK?d{u9;bCP(dnIwC+@9NYXR_aP+M_9Z$?Ao&1nyC~+BU8+EQHz_tHkQC|;$qBL3LzSa{qb2)w{1^m z^#F%IYkUsFeb(_XU|;4FB$=N+swrD;jo=2 z^X_fQ5HkPj8vfSp=y^^!-|wIIU)l=xu--$3hm>6p|EI>K0aRyB(zzRGBG;cFGYlob zX3Zuowq-Qb1DbA;#0Xut{LLpN(s>xspN+SAz z7D>A<5lkO=X{=deL(yGRY5`-sEkEXL8YduCgMR- zr2>RWq@(Fvu5(Ty4IOWad!vIqz$YEnZ6@DZgwdkAHt4);=UE1)u8QqT_G{(g3KPS+W<^j|!ebB#s1Dw~~?%#u!TCd%*Vl z3@MA!b&z5z#uE#%7Pcvtvt$^N3Zv=jg%Fyn?6B+B?P@`k#_rwG^Zqew)2plN-&dOc ztmZA3PDd?|X+N9WFAr|!$P1qr#xsFl5Zcf+0p1aK2c`1YUneRYryCbP+^)}z$cvtz z@07O~Nj`n-#TPes{p`*W=E>RzVG*P8Y-h?Qbn}RnzguRt`$Fbqx1+^US54zwztCi8 zX?}EQWj?}U{m-ML6(@9@JKgvX@z^-DrcXzHwL5pYzqlf1Y&7~ic&k`D8ne*!r(tNN zuW3H0X$>Ua#r)YFJ)UP_C~Q&LJ!PU&d&^XbYqk-xN9<@J!03r*=kGp)Zp!=% z2x6*wI;hW@ub;N2JmckCYiU^F0T_mMaOYkkGM?v;zy@xYo+ami5jEGQ#ny&fA;nCx zB;L%{#$kNC;uyjcjh9xZR$n$wA1Yu+Su_03=WRU}WUSa}{vLswk21M)XWRRh&kIqz zo@W(-3663u3qWgEFXev5mDv}Su(R_ z_C}%XD5|Y8`8Yn4mQRtBsy=p#jZfgFpHnb&w&A*{r?B9S2BIKDJlODcW`mbL(pgQd z^)L|qiPlJ_?oAj{yvn(-gL7~v6=g?7$~I%1vT4w;7KJ^VT6XJ*`Tu(XAc#b1y-Le( zzAk&Zjv=eW^?Kw-tBE#&WZ@@r$ zP}WeggHW@hsV?eBnRGE;D*q-wgTiwErwFSBcnlz(%7lqVWptlq-BNc` zP2gsmYMHor6OOQ;R2y%)S3Zgpi{dcRWFR+yQ3^hm&KFsypdnq_W}4zo6z;zOBKVe@ zTjzxEi9|4(y8m#3TCD`;@W~^1fJd>(2iLSX2x*NXLaulU?1i^}0TrV~uJPQ|%_Z29 zU}yF-%a-ejGpQ`?v#2^JF_Zva)F>u5o3dmh=N$@L<+GeKx=@`RpQlbVt^TQ4{VKEm zwP{^rZ8ql5QFPzhM-|VtpV!w`yXU@*efyTI5p^-@36Rj5dphQp7k}ed)2*RxIa0y*0Op(+>7ypdHlq`Rr|i3RSZ79<>6bwfS|hXv!GfKFc$tU6G&Z` z=4L0e9ltz{`nBW_W|>Ph=9ibg&yBQvju;KzWZK~^dul@)D6m@(Ba(C6+N%XC?aN;x z%vZW<%vXY%e*aqksj+r_y?uSTY4z^wMn5lNqTVA#a>r<4?_zTL|)qyL_x~v{Ox`_?ptdX6gfrG zeB>aR_$(e^p~8hUgFUGd@n|B>+qCT}hSbW$5)Xyyd}mgl7-+gMH+wcFl9SY5ta`xK z2<}YL&;I7;H`F`!?K`s$=w<(lh={m;UB260a5&Sgvrz@&?fc6kuLr1fba=0#vtIl? za84e#{{x`!PT3N}58slmwD(8cbQ-8|41_y2QV^D}_S$TO5)FGgCcr5!E`F^&H#hDG z7FRnSw1n3Q7ydd{F1hECXYKiKmm12e|Hp*x-*!7hq;dR6+dD=nL0;SQrz@R z?)_X_8%b8l!jm<`-@g`r zKc0Tj`PO_TvTnXS`_*|D0x_7hH;KaYKcbM2Hu6qq6+j2d(DNU6Y$TcxIBtkQDf%`f zF`XhwxuX+GJHX39awu{ySZH)*awMcps21IY(akn&7($Bg)?)Xw+y=O6GpC$4XwpE7 zhvvE@wf-HL4`L`}v76h-TzQe?Qi-!{CN-W!#p4rTK#i6_7@wsOYzm#x;@cbwUfYZW zjPv*%PXb{B2WAqLswKYLN=>11fbzx!9vCJXP|Yg9g&}8!YJJoUbCOa-;G5EgL3{F6 zOCc%EhOIzCVQxaji>+3+gjsv8jjZ!C_$x77A{7Qz{B0cG(`eZGEQVkw#rTdi^heq!8hW1z#ajTtxkPr7jH-A?M0(5 zy&_Okh~SH-TMlq?6xc+OD^M}x4=RdwP*Yu4_(D3;8V*(fI3lQ|Hg%oF{P&qj3&DZi za+QK2P$LUb&3`LtWB+}YFA+RnDqu8Rnp;*`e+0_t^{%1+MulrYtNX1TvpCfrG5sZG z?k?!@?`uRoUwe!KSJ1-GpVvkvE^qqKxTWQ@e%f{U>3)qb4KWuCjXt~WKGD?b3WY@U z3qJYu54JEom>&8n<$VmoCf%wV4B>oKQ@v3Cc+i~zjfTeQZ_KEeg`Xc+hmU3^T<&Y1 z6rCBU_Xv22Z$0AHN|xJ(MtG!6Aj%najLhmXm6-ME)jm+JcrI73ul7aH9gUgGTl;Qt zdHsCDDUW^b8xlw@XhSY|4&=(d;6ll9rXZCf0r*qns2gdT20!6o8!Mw{lH42$*OX*! zP!eoJvGcN1Lty#o>K&{L%Gx86W;&{RWLRwNU^U|uIKyV4k<2u`Fxk?eT@h2$Q#IAw zG&E|1>na0>dIg~YdE@rNd(gzA-AAiyDyjzu2N^-bG&n3GVts1$fMCO(O(ss8f@@Di zJR9jKfpe&KWr+COe`WQjTAI*;OIQVxmEHE7cD~~NGzyBdXH(I>yZbbaCs(R3U06Rm zzdALwHnp~m(EFJ$ZjJrvn}tTzAf zh$M@hunt8w5df#TX=*0H&Po2M2Y2GZ4o<2Ig{4}8YqoW;E>I1=tKg}anszI)aMm78 z#s65>+&JYHHn{MzJf>-V{K;$8kn)>*#q7s~qF481ZU)%HhIpq$d6`B8IZ~3cVcVj^ z!9?x_QR%*~2OiQdeP!cSH{+@Us~PiO`mYCd1$#DC^o6}O>~lNNFB(@{>iVq4p&_&o<^thW~^7NbOp1bro9A#%p=UbSB14ixy& zOr?;suI}PAxbXi*@`=?T38)DQt{_=)30-&AD=Xd9v+SPHo87> zd1&cN-dgwcT3XEV$JZJf8lEvf<225!0F9~Qov?Ax(*pccuG}b$YT9*d|JJI8ZIj1C zVv5duX_%P4)08vZnDM}Ho^d>6V4sOo+{kx9L{rd8M!q0vCv*ar@ znwA$o%Ewd*G;046D%Z?KK8=aKSaau2|GA)D9Ij6s9=kJm*U?QKZuhUn4qrPyd8wYU z_POHEY{lB~_3!6aLt=hSudlAJH7!@H{~NP3w087Z(5JJ)^I%WOnrj;WX|vomA|)lc z2(VePtsm?6dg+I1#e`$3 z)L0CP>7=_YDQ(tPi}|4^zI}sAwQOJaleg35?}-SM3g`ah$O2M6!Ci$JyGe&;+xuTUDR*@xUr@eTZD@E5*^nGZ>BxRN$5 zRyXQomPWq3ji5GDYN}hn7iFG&?e)CFFoab;H#7Hc?)UG=dPd@*z9Vd2&W&!OJH_d7 z9oFSgEUEa_Ei+=e3)$#(u*H)}BbO4Ppr^0zXu;xa@@_<`!hW_a)_K#eGrn8L0)3JZ zNLLE~7FLR><5mVJm!|d(Z0j7(q7HjINnSyvuGvZ-fl<@e*(Rc6uoU*2K0pjb(+EUO zGpkZaUUo)BHaO7**dhQ}7y^u^{GW6(AD1b?MjKNI_&sDo>;)(>1&+2O6))POfzZ~* ztpM|)cxjv_V7?ZMh*}($GhC8`A<*o;sJ8WKfwaGPHxiA{i&R$0hjFn~a~<>K1PY^*plocD5HB$&&F2#XJL@}#~2w6~KAe|^)yD$WOtRWd!d_l38bc02M zZoYZ;4CX-2dU$V;d5ho7rtV4YK`Uu1nzdMQDHx8;_IE5(Uu(Fe6gr1OC2sV=NYngd zA+015ho%#12iFzuE5)MYi|wAlcs#y@>*92fO2h{?$EktG5Qv@P0#LtpJok36F#4NH z%$Voe(dcQ zSu<>U?8ci_QvoBa<5zq4uU}xu#E6OZ6Mi=}kDmKDGn}Vh9_RAmOnbHah9m0k6fd9m z*rc2*BfW0c>aPvUCEd@q&%OQg(R01JX*P5HD;RjnuXnFcOs_VqPpyD~>1tT7;PH1@ z?>t%XJAl`+|2r?OABSQiuX1rnsWathh=$nRdRhl-^Od<(?iJ<8;W!Am=hgCT*m&Le zBf5E1RaqTWv#ow2N`a;;KVw`+qOw^Zr08Eb1+R2=>tz;i7rU_@jE<_@GuwZyzoyI& z(41BU^*N^;V$XNzcsXec5PTN1ZA?2UBM+m3?rE? zb*V!^Q1h94CBbENg&#sgv#t$CtB2&B^837dJo>1KtrI2PPn8_thspB0wzLRN^XeQh zkJNp9rLWBvR3CoOS#-$N`Jt3jox5Sh>u=u2j~9jy6uW09udIgoWpo(^G0LkM8wM5{ zB*nE&(Q|1UtN*^X7;qmKxB##YfZhDKUvYK?EEqlQ-E$zxN%9{vNPIfx#L9;ewqO zRu2-+3%jH1%NUZbUx`)}DPn8B6hc$lWuIVkRf*}Q0rzHgBVh@QbIJMsfe|A;RiSZj z(Zb)82+E0nZ)ac9H-PR1uuSK1-c`_2i}!4_$#7FZCqsMmodew;QewrOWMVa-R&$<%C-q4d3zjm}bVS5cB9*zfAS5#pw9FeY95e?} zE>)xEj6Y1XW_gv8+0zC)0 z8KPmV;!{LHsgcL=#Wo}*%0-&F3%Um_BH+Y_pJI^+wu6XA0;!O#Mb3yYKNgOjR1RsfS6@;Oga-(vd8VZg@P#sSM0U>2y8fj}@5vB*@hPdp|O zr&0;SOAlDJK&3<`AIeE`M2hI}yF{X45sW5m!vOMC9eoyLjib?8d4)(sWsYArhW_q` zODM7Aii2h`OfZY5=irFk1XDG1YmI6#%RAYnd5b1Y*0*vO6De+`AjdrMm90KfNqgk5 z2$;V>J^(A}Ak~{?rIkr?utN|ziB|DE19J5pf#-Tq(@e$cn#Lcn()Yn)t!cet`p;NI z^zWAzE8p^>cKc5)oHmbM{MYSmjj(F8IO@0%xSmYESPY$AdGc3T#BP&s^S@^wp97o! z#a82)(PusNOZx{-+{rv&&&ZwtEcpT{}C6b7oNz4%|-mH*9S{FhH zq7nuF->qaPHS+v?DX+HIyY{cYtc(`^z2$mnyPNjb5+{G@e-Uo`joOX7?UO+0Y#l2A z00Au08N#WB%RUNNzVu;(T#3_uNpO7!4&Pze*>KD3d$fgLR$UV)7N&)QdEq1gTFnd} zT@mC15UJT$?;S6azlCDRXC1PgL2N%5=Mwo+2sZ?#Ag( zudk(vpL!|Bg$!ZeX8@FJb=jFUTpP3alYRU0>#^09h>8l0>57Gj-2i-7j0x+`d6CgI zc58J^aIWTvqR{P$1fWnNu&MW|kNDQ2P{(bbZ){`F08xVL0Xv{pPsh)v@xDc5Wi5hM-8XT>MAD&JGF7sQr-2wG)q(= zH=qy~Arh3BOu&_(ytlWup*2BW_D)1BmOyAingniTd~@54L#e3Q9d5^9_Y|1>mg+#1 zvU%v1i>4CIthfPEgc~_Y$*nq24@J^W3S*3TR3#{ogKIE>fFLihrAkgDT~2lvA+V~hfO@d^fo!!+B9aYG8|mN*!} zOmd;(5wdJV+jdbtNa3*(UB$}ZdFCZg<%8BjtdJOKDa%Xa0US6xo~hGg!;z>|;4E4< z`v<2wA~7R4APh#{mB1$P6p0b7R3AX;dm?{Xb_MWAtxs;D&5rT zAlIqcR?`lx<)DUOL%BV|?)kUt8~(HFtn9Ar&HED<^K<==#`@^^>iw1173PtPfkQP) zLB};3mlyxcPB4Z9lOrQbr^||?F0Zd813z5TU%B($m!dC5*A31`fi>UHVMAvfYod;W zExB_m(e;xnPX>F}9uEpu1(!e1|2Jq7OuyJ$fQ*+5J0o1X)U^B7r(-Pw2CItE9u^`T zsHvVVkDAO5dbueDt%f0-8rI@nQE0Qw*MsX+w|2IE{~W#6zI**@%<6ykh4oh&YoqHU zF)N@=4{n+c@_gcDgTX29^v5Xg#H3K+Z3?Nakmg1jFPVfPS$}$i0xh#q*@(J`pS;Wa zIY((T!8#R9DLF_l!9CICh_tjdw}}-;h$Va!GLfonXf6xlmdI8YX=_gnbh6IYXb0>- zYVy1HF03?cFb*p7`{%T2%jqAcayMOA??UrULQ?qP_%1L?QB;(a;+~L_&QQdaZd$_^ zPmAb3$7GE(A27BqtR%>5m`6tr3ML2J+b0JZ4hyB+>d=1mh3gB~HOx0MgyEN;>^h2Q z10YL5l+fL=W|T36yy>nVdhP#cIva4N_y7O5*)*ft*4!j%o0~Q=G>USVHO>%boMPtY zs8rU{Q1Lx(Hcf4myWB)_Q-l+hYC{RtL~bjh(<(KjP6ub|xH)t4f1m$#{ajbqRackG zwb}dqdEGpp&xfC-KA{W_qPZqsX;?z87F{2cy+5HgelQ&4reMRNdfN_kF2^tbtvlG$ z^BpMrma8Wf=d-qEeSNPkoS$in|7rb5)VWi~*oxEdvJOTDBRh=%?Tu!&S67HQhvMJeUVCqo> z7!3$v0gMvN;-M(Kt{)<8IDl$T@xFJXrlOujnD{3-<$wSCAhYk|_a3tf`|zk~Jd{F2 z7oj9f&bj@@caL{;rMl8E=XEY3Ag(^{c?hB#&WcKu`;@EJEpEq*VJqCJA_N~zd2yNL z<4vq^F9DHn?G6&Klp|TOKGuX3*A_I=jw)eb367i4+nVJb#sn%I zp@S!P9|64ua{MC7fI)X&V=hz$l_&01UIhL}YJ~vFZ(uruXCV!krpCQ-s!4<}@d|2` zxrrceU(i-=PGce}SO}0FDa=72x=7^NbrlOm7+@ugCgm;coUqRIRe~A8;lf=OFd-G^ z4sbjARRY6_VA`*K2#_h)an^~!ucc0K)3noZJ2YWhSWLA*R1->m^3N^{E1es{e&Q+YxQnWPR%R0)ro<;TPwh!woLxB`Z0*}LLBI(+8~4!axBn%4XjH7kDdzu)Q#4ld z>UliH)GTae(t;@J2TKYy7X=Juau>&fQhwqvF+b8D_^o!o}X!3O;pIdZJ#kyH8^#E zY2oCC%QMt>>p~y?waWwJDY60Hr4bRQFA-TbK41D-%kFJQKu^x1jikt_*3rj zw9^SvtyiboMsHSKMeWY~3IRE@4w=&7<>WAK^M1HpfYWjAsnp2yB4Os>zP{di2I>IM;8PN^Y6kJ;2W(A9` zxn0*+6(sK3_9PDKW;t%UfiEeJ0_n|r{m@Umi;uD2m6qm?Immi4dw4ei?CoYQF~0^< z@yhJQ__J;Pd$qHQq&mZFS4uvr*XYg&r+8CFLg4>;8)QmZMf0layv40jM~W&{=>vB9(rHNM%RW83Vc zysX+uG&?Aw*2D6k0iHx3IMlO*X7fsn%8kZ$dn~f~=u|2Z3XIdb*%%?!QMYTCMRqiu z0NaC;Z?Rl! zZ4#R104F^2K#b>hAMr#>5;KS!Vpv#)PpN=L8lo|%WQYY`#XK5Cfdaq4l2_Y5!EN7H zz^wfeuq@0ZO_nWzo_<&4=TnLic4fTLeD$*4_YSo}_W3KY!^|cshI>`hU+1O|rz9l& z&+(@zwamrkr{$%>nG@i|%d9`NDWV&bMng;ImQO2Wppm>kv$<#at7GFIdI}ke9nIMKU8~ zNat4H)Pa;m{Z#_p=71Ey1Z+8XS5S#5Mn0@Ji7>4{~YC(+WK6<@? ziS25qhCjz?LpgPqgSPLtTURaYK;F?p?88wUwYogY=`ahRKhdp0`GxamA-+p)`3Rwn zlK~7{12(Wsat5&=W`{UKoqWad24qM;^Z8SWwV@>K?5vYUWjY?(Lh&55(;d>;;Vqp4 z>8v+<27ATiNrNhf_cK3l!$jV=ad}gmVy?P+l5})bR$F~$uiy7%&P}a^Yv$p+;Jv+< zRu+DCS^9JAJdd{rSdK|=%g%&67~VmCP^*j7Oiiy5WlZe6i1fMF{L9{URs^}Tx2An+ zPQD}i6ro&dde+=G(4W$|{Pf%T$-*;zpV&p*DbTgY{Z}JthEO{9*>+9M-RJ#gPXYI` zx;1)_fh(7XEtAxsNFuU5!lIq#cq-ypEMTR`k5OT}a}YxU?k2w9{w*j+3b*kfSM$vr zZ%Q4Lk&(V1*5R@7=&_RBwWeaXYjuL!*D|Z}V_-(}y&~eq7h3fu*_6X{Rzl_67f|UwnDyPmuK%Y6DBC0MD4gkfjaHHuZz3Pi>pCme zEhj{eW6FpdXtVAsElN|sH%Uj(X-q1y8mcvJ3Zr#+IFcY8jSQHu1ZIj$zXYW@5j#9c zD4-Ui`$WQ^glOesYCAO7znsOI32bzHqFg zvCAX5fST=#@U zJc##7{a7SEG_VDIZF4H}ahB(qUk*It{uFy*bn0?!{Xfa~U*~>f5fVrNA4U1KawV&Q zcr@*)ojvM>T*tsJw)A`*{%nkyc1P0i=O@zUox4JMc+IkRejErg4XM*7Tk2D9SRHO# z%o?6sDO)Zm9zOR^hDi|a_yQ9x5qe4K7$x+9*-i9IR?-PXL;m-+~FVZ4E zs~ju}6+OusbTQA0Y%!&_D1VKe#ugS;MBV_Qd$OrrDRW2K7W>M!Ose9ICjW3eAOCRb z0ok^E`|)}>v=x^z!9rNHdVrlU$XC}(?Yuv=D-XuG}no!MXW10 zdm9|O`13U{{Qz7Js`vhQM{!gHsgT{{uJhAC(;*pnWGf=67I}mhIFyC$VpQ`Dn;@q@ z(gHJXLtV*~K_n4d<6a-RdtmRVz#L$nWNt_N+aJ6?!42xWuSfsfo*IwrPBlCGhu&Fj zpPx&yga+-;24LZM*7Gr~6u5dzbE!xTe75q69IEXq>>4MvW)v>i+m|CQY^z|E5)yug z_>uhtfKc=c&bPyhia07S!--nJ3IG^vY_q+bNQD7AkaSamO$C%53hh9cB+%70w3iUi~8{`=7iwOUcw*}1%OBxOm}36dY}6>N2aapxF6%tp<38t*Sr zvnG>AXBvSEdG2&u(!ZYuPlIok-A;;Cyq66Z_;OVkb9v2B>IJWRcC4O~-M^YRb{3V4 zIqe^|qx}3L!Rb&R$a_Dn*H=<#j=o&P<56NCzQ>HnMnAliMmMT?^%Kdlza6of5Bx-f z>gL%`cFxWLa}(%9+Oo1%|8!ZkUKwax`qo|LRxds3eI5j7QLS(UWi6GCxh5ymXb!L% z_zeMP*!|vpU0dnvkM|8u?h_f2-2^RkAnOmWpfzt#){7TX>5t*HSOX1@xDU-c|C;ZaaQ>TM(MMmAQZBKPLGR%I|bR2rEHm&<$Dw$3p zI8dl&u&eeIyU7wt=a?;}%z63F)WeS$=1cSA!3swcK&2abtM{n4rlw)$gxb7!-<>ll zDL*^(kHtH+CN92-R`VVT;~@vkY7}p&I!uUV5V`d2yYskxxVeC@RWC@t zT>t~+P$+=;Rk`1cFLIX^{V}&i{Mo5dDx})R-sN@2^p#AOpndBn*xde}y+MlBna0o> zfOHPIP-ri6FF;hprE}``i-*NAT9q_9f!}fLTKQ4)d?ek5Dljaxq3IEUP?kYOAcS-a zkF&F^1mS{DvndTH@1SaE;0 zEQHVesX|W;Gt_7ha8W+ng(mtUU8`m*6RV(*ZnsuH0A0wN7-VY))s=6G8)KpC_3BH^ zL$FrlPv&=cK;L_N>5)tFit6_2pN&~r)|340JLjk3ou=nQ{-@a0=$&NLDcgBt6p(ew zoB`KhX?C$E^4p+7@eX{t^e3lQo{o)uS1<31HCDWe5l%HG6?e#npRt=cmf6&DtpHEl zlinH}*_%OOb~e;Fem0sc`F=dJAN=_~KJL(8bnh$QssCVUW~W^ze`jI8dkN*}=-k&g zvZPUIOs4$U zx>}gBpvpSIGtB+^+5K!&J<^JBP5TdvC=d*O$o1)VPLXQ^%q@+1^L2McP;a}epx=?} z-F(ObKP2`lKX-Y1ovEpN<&Iv|80MPTI=q}_i4!U}*Nd1nBIwx7?rte8wW7n#hEO{J zol7c<{k>=~>2^P8P$K)6V?M}BZ?Jp%h4q>a1B2TAKVBQeevK(vdnc}5m-d2R@}f5Y zJkTd)Q!~-g+~5bCFG}TLZ_VpoW|Z|UGb|zX1o@Pc<o^Z! zjl3L&D8ZG$#8b2XvE6#NAfvSWTA`x#VF@MXctu^+;2K?=-QYe-SAwxuv|^Y|8G8_| z;5ARr2RA)52coU_qa(8NCsi-XPpCtmL;W9<{i^~1& zLnYPhr+14cXykQd;$P6deU#3G6X4BWR|X}t*2cL(@!h)!x(x()b<7G-~5u<%$Nazbx@+~Ov?mY8)hNGXOo9p9IN;h07OQW~R)SPC^Z)gW6 zh?ckDp3I{yreU@4HmzDr%TT&#!Bbq#0QeRr6`~qX3qy>%QB#MAV^@L@cpU1Z(u_sA z4;p`jCDjcIuw!|t3lh$SYE=3*GzbVGC0Ec|z3LVu7=1h~?P_&=ZrDZ|74&_OG)r6+ zlju2OV;&~)lXSO<#V)R;*RnHacM&@dpi#A0_oZTbrMpOwXa90(c>g^ zbB!eZLEeqPPyvBgXUWxtk zW}esI|Gi=6N>g-Wk>iofPL*2$IL^*I%DtVxo|un=D^c2O;f1WM*qfz&2UySXx zXKWV3)7I110BbY3_v&-U+M@pNb=PAvJ74xL#+P*RjVH$((gwm>0{}43+_;nPl$wp@sip}a)+2$)_ z#Z`j0$NQI0t4CHJkFJ8~qSbG0E72>8>#>T)2^t->FWal(7=0)&$d5(JL5b?NV-mWx znekfsAtzCs9pU87BeSMY=;C;maKR%=P^2*Z2hlP!SkCSO8Ke2oPaGBzcz` zE`UyJK4iM@c^-FkAhtBhf{Gs>Q@zxAq2v5ZdvAaR+?`S#-%q5t#g?XWt*&k|y;J?& zDQnE{ug2xpHc-9{BNOo)O9I(b*u}!N`lZu{34~M4H(oL=P|QKMz8e}TOHadY^Hx8d zAFXMB3mC|RyBvSdjmntF(~Y%^DJ@TMRV2+Eig--pyco(W$3#^GY|YBzSv77cyw6il zwZ5M|W6$Ac%q5Ku->NfXR!o+J4nv3EcBOS(dUkjSS%ZQi@!_Pm+G+ic_6k{r03Gq* zi&k?J*7c<{QWG_dLD(F;G3Ib;O3mY4ne~dWr92?uz>4_68Vi*vstDcV263Y_NvMMk zH{+ushto4Sk^M)1e}4ErDC-s9K1IGhbtr&1nhGd%ZH7$j1;R(nK&f)8;dAr&>uvBrzccM6)#AeUq~MpLoM1x&nkjFukM6XK55he(ik5#vAw7A69bSr&4z z>CdljIVrgfJA^*|AkOOLer;|oxEn&^Eg}LjqPstq2RA6#ZL2p&W0K=aqvsVdT59&* zOIx>2wl)+E>zsBnF8kneweyp#b!lN@S@w&(6)e;=fq;UiIC-k#yTg&6B7-}}_TE{x zy*D}+`HJVEeSoW3FubO;!SGLh@z6=*tgP%Yhib>)oScg{E&%#;f^lEsqKfZiob|or zYftB7k#W|T3VbbGj&*kKA9EVmWa*GuJ14zL`BP>!@?feFsP|6Ht3fTG2GFyGA1kL< z`=XQMSAQh8uKvAJdv3~j{+BDkHrq8gy$wGGHYz>tq~hs zN0e9e`kuSR!QH%HhOeVBaV*t+V1)?Y2dIvjc!^O4Mw5uD081Bi!tYc%Y8+#YL0QM-ylI>&iH#H#T`Kk%N$4L_y_xsE z{M^mkl}_=mml9}og5p1&vcl`@BNEerW2_$! z@k?Fdx01qoI#`wr#O|Me$})-U9~&EMuxjLScV~Vt`98Ir6ug-Wy6O{?y;G;dxWQgj zecxJxJHss3JIrJjooiK&G09((f9#Mj+sm9$Xo&JdS=|72U(HaIp+8kz^Et+7viIGI zc^(g)M~0J#I6cccKP0>^09CAIYeJ^g=x%>v2FR{urtN*eTa0yzRNXscL*qyCCrZe z+*gEvf-)Qd6)oI&vMpUygB6MB404*&CNwQ^qZmYTniDmI24S@TKr{PGcnzA7Xo3R& z!$`v*{UlUyC}Ed#46JAG0fL(HN<3P5M2NGdC01iuiDs**(8U|Mx1k9V`U-Z@a~x2I zSMC!k;@naV+yn-N^w9shaHv@*G$B3A@4?^LY&P1H3VyH{g+k2c2WnxFLXbL6c;;5| z0-Ey^MmwKo89;9ike^}Oq;H4n$@O-%gsv1Nq@8M!JtpHJF2uH z?CV&ZuF7;220`*Sv5>lAITGdPO5RJ`ZZRUd`wN$+?MAn$VZp(;b86+y+<*c+P#di`_b6KHtcT_f#h-hSW)6x75r3_1GKKSt)Z@K*yi*FSs=}fM)jduF0{n zrB4ngW;%B(K1|;$Surc4=j`=vGwrK8}Ye? zvF;({;+h-(OHBMry|OYlxm}mjb=ctOk+psku;yrdZw8EG>0E_bfp*JB`kiYNy9fM+ ziXZ{hsl!JTf^=a4lO+!dd^EZ*z17C`>nK@Yj2h0l{kqTpD!7H6L0gpaTbNf4RnJn~ zM68gnxut8OuaS_Wyh$1-arCr6nQl?^ERw5n<8z5;+6(iY7NMV=n)A3+s))xVpvT-q@nD%HrrScnc8h@! zHNhB(Rh;zO;~ofkQcokLFH5^0d(Qp(Bg47z*VIsTS>Q(yFnaFgnR%B#^#H` zztj+MDQBJRD_D1tHc!?-YU3^Pyo6o5B3i`%$=;}SIJe$-42@0&Uvwh1SG*06*Uhe8 zgAZjjgP?|4LScw044}J5u}B(?QR`U6ThH44iHcQxJoBoRAF|87QF=l zhov$rW-mg}IHuf-(?abqBh$p$vXpZTnEo{xB1rk)~*E9(~8*HiI=y^27Jj+Mu(W zeCe2#bv?FehWprVemUOh#5{;rX`OL-AWN#3?i!Q5+tt6lw8W9$m+-7)60DkyCRGmo z{fpp!D6Y-222XUytp5Jk*2Ki3qE5&EYV}y3{Ow15e@DyU!b=+zm(Tq^_W-;_lMXM!$rDC#RrGv>LOU&fPez0ElW&)pJs zAn19Rv>{i!wP8e&QXdMXo0cBJqmbQht}oM?m~pjEzhKwZ8FBK6l!_KChEeWBLWm>E zfk)#FJVGW#R+1dD3cfjHsZZaWQdt392?-)r*59I`scoHCOXe>-K4eV-fv z|C(943TU#eQ@aWu&)r`Wf`cJL3+PLgH2rdD`Yi)#YI=qf?^e0KCw!RAk&mxd>8zZ# zQVc%b-Zm3`q51dI4%20gNX`o+j;A;pbOWKpJkzh*q$T@Y7n*#pTI!KAzC_m)l6sYAtVbz zNo8gGw^*R^FR@V2O<03yC0FHcWh@sTa0O_{{f1f|Ohbg~=1^0Y84$y3Wv^Y-oiz{D z-G&zrT!@x9z*AN3I07#FQcL=!L@$mfu9<-gk5Ea|*G^dLMMD?$7QagZW(&n@;ko_< zeJ#^+s*k4%hr@1&5THfaa3^|ANvebHHV6c=XzD|H2CfS;9L!vVj0oT6Q`?erspYMu zJ(EPe=oMZPkPdk5_|_^~Jrhyi%WxxAVuT>tGd~(k0{w9a15#Hll?22!$eMT)7^1?R zE@D&7u{DX_2rC@=iMA&WPKZ_wo&L)n|owDidc`u!|?o`F});j-p zFYpvAqhZNa@3O{LV&YuRja>%nvQTc)Kc5^OGRGFjmXlpRUsm&(-0u?;ILkPVM%%Lr zS)Y-5YA4@i{m7-K%g(nR&bEZ6CMgOA>NZ?yRLD3dxLap#nQeY{&D|XKSTQ(tX60G* z>TL2mm%rx69EvvpF-v0d3NY?|FI)Ms0b~HB{HRX(Hzj%D@71sDD>>47d;c922E>bv zy6%3*W+H;`NnNC~7*49<@hopP?Q7h^5>K>VlH#!t#O!>KJztQ;e#9?o)$0Mh<7k2YE zCdU#+8?PsCW4sBCdQe2+RoDpW~;`U}|4 zJ2tL=sdY3{<0U*T53$92F!z$pU{dDM(P)LNRuWi#N}L9DHPf+y3W+bYOnp3CFbz-O zuvr^v0S#V*+h+aZSfsqR2!SZtMD{w+XEfhFA&d6juEZitWA0uX5<`TMoE{`!;&_OV z_YzZipLs*$!l2mU5Z%i*W*-i(p)>AUmu+YR9miDvg7Bo7-uA3a6*<%fpvv{4)^(ZP zVWKU4A^_@uG46^pwK4yI?XG1yZ%k!iO~^4U@DdP0gs=sHw6ON_-pO>LBlJpT$Y8t2YO!qUyagq}LV&NI;BBb`9=9cGbzsbu^f zW8AbdqGPWFwE>CeWB7nU;4k1n1B^v9Gy%;(h%cqfNlL=)aaNbdI(leY>Z|hh^>Py7 zL)Q_0dU{Vdok*irokK!m(D5${{`o&G0L!vLFoc9z=vFM8>)u%1&Zu_)nr-hq4wP>| zWDqNx0&u#z2zX!xs!(Z~2GuKr)6QmG@R9`*?W9A7dA{j_Yhp$v;mKOEZnxW2fc}E8 zv_zWl9p$eopNWZYG@>sc^89NdRp#OGzsn69W`$xWVM|b{_;JXA>AF7ei&{+F`zDyX zd~e6|FB1->GZdahOUnH8X+=iy8Q)#!)XT|=#<5KD;gR{7vJ>jliedekvd_*yCfhST zKXvT9V`S*`_nzBJf8N|Mx-7MB{kP*hxFHTGzRTVQRoUmv0}7q3%L^lIOCL70txjx6{`-B~zrk() z>`IxBHr^7JwD31T$$gqxemt`}=CV9iwyHc5wmf_DTtvdA@mDX)?@}EPm&Cm^5F4bw z!d=4&)6)@`LAHHrHgHfj6bNy!2McnukMNN6)EEpU+xA9|G2%w=U-vQMf}77aKKT3f zxog*AFqnDXp7qhbjh;pR+J6kcmGL64-H0eI$}BRx@tS?&sVxvr{h4g^`t45TWo_KT zi@59_X&rNX=qdZ=TiI2V34A=4Tuy`E-$ZvZ)Q^no1vkD&pWFNS_fo1OTqlvdaLP0Ri1><<0P=%!Dp(((#hmU+j1CN(pmHUqGUF26&j1Ez zygW?&{i|sW;7CEXAO32Q=_s3M1?xbeoP=e1RuN9oz8va4cFxSsJT(;^?(RsEWV7*y zr1IfBo4am_1R9DcY3cnp`ybOIS5(Ut)sC1w*$6A%Q1xF_4k32`h-gbwOj_AfQqIzhZy zHiAfpu<)WHHyjM1y2128M?=R=*=I#mO<_(1U(50N%{AzY^cAQORZUO#zk|Xzw3BFL zBpOGf3pkY+s1T@kg{;}gW9aH!Lo^s2h~he)``|R87zqL{&WRy$oc@X`(HUpeI>~RM zpgVv74s9qDCho;`U1{nfK`mCyKz=C5US|q1LJ0%N>3)Th^xSDe1BjWXgfrx6T#3pb zfI-oYo4VWbLI-EM-Zz+c#`2Eqs?1bZb)mp8fFJNyV;H!IlSau(|fjA zY)=ibAp7ZeM;u1&VDc2HWIM3mvZvUW*paRk`CV~6V$Ko@9H!@s{+JJrV{_4z^WQ*K z`}1`!k6qi@`$}r147k3(eV=nc_g;9n4gspo1a|h^OK(ed4+9y|S7rY36MmN-pz57I zkt|@CAP2e?5f=5CIma`Z9suC?o0-BWh0MIN;`&%z%Hp46KdZiiHzaZXq3=u^cq{|! zoztgdkJ;=BPHKUrrmhJ-|8}2gG$Eg82gee^n~NiGu2wi4+3U#e&!NW^?DP@~O=y(+ zPno0<&=`Kw%3CmHbjgv>9Hm_c7`O}bSseNWVqUoFg_cBl=w+|bajt%GD$uJ!T>FNM z?wLkD=M)zujhK~R!y=LS)fYrm97{YQaF7XSYCAq>4T*|47vzcJr?(%b6LJtj z{>yOmHd_MI8J(b8#IVHV(2VcLXGd%22?PQL-iMD-{sKJjUqDFh0l>+5zUF#>$U&FJ z88@A^pD=~sJvq5vroe+Y8*aMIQ6feO1ubZZnbK9q6q~)EE1b<%nHwv)-6K%Q1Qyqo z9!@1|67qo{ww2_gD#R$gYr&^*= zdDIVLDxRR*<$;t?=i~FmsA>Uiv69)2NXTYdWS`fmE6}7dRZP4+p-c;+8%?hh07bq} z8slj#hQhMUgI<6j9n)ewjG=o;Ssv7EzF36Jkh6$>0D zmRAy6jN~%#08)Sz44C2ZtbAYajnu7Pink|#(sKm4v5SS=hfjb9Y) z9RbQcTk&)!zsB17ykX~ZW?j=m(@1vAJ4ItsFUD1sn+3VTM81`SRICTW3>YG|7%?q zM?qR|3ZN3HGSmlL)QbbF3t6i_-Vf@JF3;`(7TfvcAJ^MvuLC{)Ov=ppRn_Q9U)j>b z)ekO32JlLItY#Vl6ZXYmpe1q5I2$M_-wTC+AZN2Pa4Wm&g*7!) zcn$XLh23yOUyWdQEQ+$FQ}yGA2%6sAL3mLmw#}(CNawKW-dB2zG%F&{ZDRZlYZ{8o z91HBJ)d<{SAL|n8oVWyZ($=jD(rT~?eRyW3?fX@!Yyw$uyr-Nx$1BSO*?h0y{05p2 zqzcLp>M4RKcThr!p>7+Rvc1*;OLvFeM!P@R`=e|rCFTy|!OltG>xouu-0bBF5K{;x zi~pw_MAnbvvytNSKp%tEg5o2J?-v)dv543EplIkB8b(wL$`uyPhiSZ zg~B)pB`*@g|3e44SHOsbLZUWiTq0mlnn=5&p6Cs()CQZehzgD=4)h8j-Zmdchm{tu zF@u^o)?zp0ch?F6#0RSK465Tz=!xd?BP;`b$09#sK$i!^q*brWP1v4($q@2@;FI6o zNR;n_rK7tygV+j_N*37F6;kC4h$XPhz-9|?2H?&ze9}?d63o(|k`|1Tg<}y{cSD;I zBFrqV8k(=<(n{z)P*u>j=1M5=;`~BDRF3xO?m;^`8#Yw+$ceQ)ANGd)656Z)uBKx?;+j=EWhbq+n~GA8|&BfGS0R^!uoh zjRL8ezAzB^XQJV!Rl_9NL$&D6=)a$Ms6;g6cI$oDEjNOiqvFfN;^7-W!G>v+S^>R_ zm)23mNG~YzPq^^@JNn{d_ZN)FpXAfKz$R=r zuPYz-o!HEdO>vw{x&qGRm;Lvq6#K#lfmg0IX=&lH^q2XAC%L;n-?H9vui)d*TUlmg z=v<#v7JliynWnn6`5ot$^!C(U5X*HN1WLw$io)yt@NV;N-cO@t-tR*l%5RvR05GxJ zbIY>f10Xk!7yIzxob>ecm|;@RSzbqG@bs<4#+A2iix1nr&n%6s_Kkka2vg7gHk$G_ z$vJuPo{Rd=BW(*uTtGb67$8sfShp>yvQn0=Z(V*ivosgIsz?Dxyn6L{${g_Ar2zYV zqss!A1>Ea$-`{sK*Fmd>ng_+GaO5IG$6AD@r)Ncm=EV#|O$!E1C&EIYv});iu<1C4 z>tX0mykns>#XhDPJ5?ynyTMxdV=h|n84Kb?&gVk>JNYAKMA1FEW32Ono`*mhrmTuevg`I9py6uJEtk=zaND^-B zqWL_C%$z7@?E%H4d@szts@3R>Yt1I`tEihW>N7e??7T1Y4&2aZ>)jdW5)ta0%;Bp0 z&$K1Zuk2B`)+Ytu`fryQAP!W}KH;!->5%a}oQTF5ii+fv7FUvVuZ}SjE*G6_wqFa& zMIn2Q2(Epg$k2OnQ*tiU+ivh-^_eEN$!0MysYK-YjBl^Z@VxCnqKDI+7^b+mPb`Et zmuC>oLB;_9dS2wagkMT5l#j2)Nc!&=aIKJ9sh)UBP-XU2Tzk#40&Pzlw^%E253qg( zj*${BvymBV6U?HK0kke?F1(6{6XFSRw44LNl5s2zk+V(gJ8pVgv_?pyG8qQhUVMyY z&Lw6`ju#Gau2BeBx+I4K9IVQV2Kv5u+?^eO|GWp6vK>J1G7XkaXyd-L@-F8;>k$Wou6@K2x2u&yo{$8eA_5Zisu#8s#|dzt&#%(fqJ>{%syx7JEYg_81suh}atsVg1>IE3 zkagSlQ724M<(TRwxmkIWD8NEOgCHfk2AiUl_rhIEDha09Uf62z{!`)X=T$89Uogb1 zIXNFW8{~?`x!My@!V(&s?t|ZkKA1T+v6xxN3kIb+c(f;laev`94?{mp&B%D5!vjLv zDcSou>3z(!_0Gb=!n5$Zr8DzmZjHQpwd(Hp*!LdU)RT`k5Bp!f{YkUX+i&n~=axJI{|WzHjZl=1g@1=+tBf*N^;}tiNld$JSCNeJ4}*LRClK&s}M#m&OHi zM|bX5@Jt$cB(QH-K3bqC$>iHUJy}xg&TG}}El--#0TkHEd9#HMSYn+t6cZz$w z0~QxCeEh$N&&@82&;N}EPv@ndSC6*6Z=L@(y8L)U^4M=KOP|zdW}XzPmsb}7m85!g z-eq}ZzHO<#?cXad|AJWVl?}i^5A?V_ZU1at`8j2EX7voX6kHOM7cZX)WL`wN--Nh9 z&)dU!E5#tPlZI2EDPI7{{j_Kp?jR4ui&HLrGajF*=xMY<0rJFoYBK2C z^EpEf9zxx&MlF7A09Cvetp#Fh@S2GKqHyRjce4+qA^AW+hf{{-szAAns6r6aP?9h_ z-AP_%q9mZYESu#=DnP3Q!yridi?MPystQhsud8mk7E!B7_oYbh#KlqMF26I0VQ?V8m1Nu zLc)VUfc;{X=Y@8$%Xx(AHUa!((~vc`sqtbt&g8#qfL7rY5aq{+YGGBjA8(e^NP(*^ zA%D-`@@i+CHtH zYJk{Ri^R%dq(g-cTOJlD95N3M^nUo3R5tK_GGXMyZ;>S@LkNMk8?kFm*2fUVmjIK% zmZ*E4MkQk0*0Uuv`R15y@(`mugmN7|pRwMv!f6n`(I9HuxDOs+%Mq!jn?3yK`VuEg z)W!@mh%f?m+ad4#;>Eivy(Yd2< z_-bDT*x^XJzkFbza9mf@KWoF#b+pph})y@jG zzd}}Abm%Kb@@VrExegHRPF`JB%~DT%dv!9XQ2GWG_~(m^8#CgY>!i$K7Qgl*az3(5 zm=MV|KQ($p2C}lI2iN^f{zkaMO$ch@D6VG}_8bnD9csu@oTF@p)}N1Ftq)uM_dwgi z?UnJYmDy8USN__TGB@V(o9e@4>%W$OMRYq675!S}&`CPx(B6DSns{EIYnZ^TW9O(sZ)W;}8O zRtpl7y_X2+?F1SloK(fYl^cn~mke>)2t-g10YRd^GJ}*BWSl+o5rQSWOluyflSU%- zkp5YUofKVs?_d7VL5Sma1Yx)2u^rs+dd8l@_L$oIGbq@83z%l91GbuJp;<`XxUG3( z%~zZ3g@uK#+A1NLW|dtO#J%!|WRK-~Tb)4Cd8t#c^Sv3$ZA><8( z`Ua-^?+x@iQ`GMw|F^mv_CJt}9Ws14M1C~*nYfr-7pX7?RjUJ0YIhYge0R^t?@j*V zOFK2bUK0o+o98y!|Ng6{YeIFg)*P@scM*toMVp3M7J<}fT^NE_p&sp!oVA`{3WJ%Ohnub?8DaFJpKlf#i54y(9T8x&LMnx0 zx?G)aGC#av(9_aU%0nQN@)C;HqDxfm#}Tk=9oZW5T>~u!-PT;ywcBZp;~17mq!{A*1PIJ zgkUtuXW~t&pmYTEvFAF|JDR&3iPfo>H*H{0;eK6vbfbxBnn-lcWk{rei3n7=YevL; zS##9CBz+gM7MPe`>LMZQ2ng&z9?jJe22I5oDrp`t0t{nupLW>o-E(|p(YJ5a#XO#T zf~*Ows)qAsT-D;hqm(~not@`9JN3B=Sp2QT02u}xy^g12yc1c9v)td7fBabKnZHFToVvRg|5xL%Ophx#Hn*ij zJePDP*mrB&@H*Y*DaGAem+qZ;!)1ijNke3P|J>iNJli8Jz?^&XVBrHu>-J5aKeO^N zYxQ>4iO{lJTT_1gTkW!}3R_yta#{FzHahWJaM+@%_&LwxxUeE?}^i{P%Lo z^5fe{YDLPoT`Avs!d50$|8iL#Xj}OwY`JswsY~jHX!Run_b2k)D4o0ZIQP6d9W4e2 zRc8=TzGEYTzE9S*m*7{Pk-o!K)H1e3!;xs#UEsu(hMOA{vGc4%PB_E#{-|031S-^h z;;d%t=+>u3il5T{r|Hku>Z{pplxfw(Z;FY>Rb+mSmv)yPB~`buGWP==U0(U zrwM1*RL~9zaL`)88VN$YcO3)AqT->hI%3$9p%^#UfQ|0kW;3G#xt8*xVM0`t*;lXdU6#aPo8&Cn2L$gP4HuyBX6F~+XoM>cpe|D)+#z?pvEKi)n@Go@h;NwqC9=Y%5CtdYnp7UdAB6k6KyP0C?o zGKY$srHmXa6qz%X2_Y2`BQ>Uj5Ph9b|L6O=u77p4t}9vFKA-2gpZEQ~UvC*4Ifh~; z2Sve&iZT{V6{IQ!#PDcRc7d8W5*KA$2pkAoC9QMNHUO~9B}_+C@T0}>oRhLy6fF~w zLTZ-CM2y}hjOMC<6#*tQ)oS|fu?1O1U8a!wf~d18Cc+k}zw0=NvJF&-;#{{SZr062 z#~&6iq~?0@9}wW^joB2W+Dm}#i-b&?E#SCG5+ROIEhj`N2LjhVEIeEZ_L`vLYus$X zF-_(OPh}GE=()^MjXqV0P(|YX{>ht+GJ)VEu1EZ6bB+F9HIJOpvXQTY1 zDZ6b6g`jn^84j78z(MIYaKAH7+9uksj4U=<64)?%DO4&Fe?G1xRSPrcA)} zcq2Iu89iXu(6Q(ui{)4BTb!4flTIrJqdBz1stMDoVi5=g&_5{FqcistICZXHzaBhw zQ2wN!Sb$wq$1H#t%tm&FfkX_^zzz_&$7Y?LobZ@VQQ6jHS;>DICzeBj5+iV8rNM^g4ocKqN*z2Yb+Y6nNCA~$ z!7ozk&TnRsJgw^T6i^h0=)>0M-lP#*Uoq1a_yz`-r2Qm6fa69EP#F@t4a-jkC~-f2 z^1-l>Y>qLhPF@~mErZb_+o;{6Q(lW9wkt%COCrN_GWlXk;Sf>WMnz&Dmx2;v_($W6 zTd`zc)i+166lohEsbP#Tq&$Q#g@U1CZXE`tmMk_2!hVr~BoV4mP)h4j;;1K+jdCKg zTP@-)u$U^FQ121q!u0nr7GV+>UyBS<=O{>phYPn`N=ruKoCuLBeB+`7l~MAf4Lcrz zy0;$VmaGU_I3{G%cr`9d}-{xB+t@a4GHL-BAGDw0zxOeZoCO7zFavDJG~&jgFU=9eUqB@&8@`$pi$HfFN0HF5#MfiE$L? zKR`t>q0tf$V%oZG`vyzSVc4lMc#^PWfrQOMJSE^LakWGd2tAB4w$$_&w?NB_PaoS8 z&nHljh18k%qraAx240lw>3s;TnmBmuIW4C`f?glIxYl&uRlwWVS0;OMx9>A&RCyP9 zqPuu|+Bp34?6p|0D;2{Zw?3{gsuZ}qqw#1a>|^RO^C9s~JOxZ)4pgEqZp_RPZlR@17wcTTJKyUT7-fC^u!GjI!Gt;Z{=IhNK zOKpy0nIRCHI{|+30rH%6iJA?ncGOzrv;rDHS z*GTok>(+ zZ{>nH5C#G*+$<-}wVCW~N0VpZZo`VUE)pFDaf^-gt4VTE`}= zlzy5t%0)*UCgy{<3=kLbdGgPuMtnMRkCl7cC47% z~KgSk>GyCJ|xYDCknZ; zu)F{Y_P}w3wVl}D92h1V;CahF1~EKE`4eYcORV{hg)#{K$GD8^M{2soL2YoW5(+1> zpUFOYiNcSf({#BrC~FE!mHy|l^79;@Iqwq`I;U+nTNysV$D$B59?8R@s=S>qp3p`29~eh&GR){gqlRxI}~w09LBQf^0EKxcCUA z>8%XsV3%eC(J4!n7edU&q(@@5g;v4Bc;xCq&QBdNI~5M z(d@3)1r&NAGY!E)+Ia4U&q$h}{g1*yjz>~pk|PGsZ?jdk!9>cUY~Unx7qknimdkOl zj@!>iEA?ePT435!Ek0V_dJJ-fsWj`)@?Aj;a(CM)jZ?0+}%AA8`UnfP&8WR zosIz{mG%%Io)6Cj)toM^+(wx&=zdsk?^lc?_*WjR=_G02jt&{Y9fR^oqVs-&p+dNyO-PEBhl%5nS&VoT+_@ zWJRR{c8}@s8gSI?oQSR1e!6a6I6l0xq}aHWd}uLjt#N1YR8*;X=+a_W=v;Z@%FojE zrNFSim7#w{%X;ez>uX^i^*5IO=!Go_8dn2>-*4i~w8UHN zWH__xFB29MO(0^PVF)05HPGTtaU7E`rpe9Rgs6bzDI`j`+IDY?s<;iiWUfg53b!D! zjkO;r`vRjoAaiB<{B!cT7}6+G1?lVWVMFTP)8wvS?yRZsYM&*{uGQTr+fUMQvtLkQ z{9(9upW&~h7_iL+V18VyJmm+^M z&8X9SnWkfu;ar-Pa(c&(duo2PuML4*kh}x3Yl1vo{RCIO4Wt<93(Bk%PFAHHqZd*n z6gJAxTy)OOaVvVwmj^)Vw*Xj$m}=ce({{^%DBKa*nr%r;rLqj)EO2}CXvaM%VEQU# zSa*xIn`^Ej{#>o-4r}NFe3ge+M z9&L*_B-yR4P__Tbj&m6qlP}Xh7#a8#_s^%JDQOO|NbIZn5bRcZ86^LVkkj-r=CF#} zz#+-$r?RMB1bh+%6K5kN zMW}d|lUXcD4MQw4hR>X0AV#+*M*xoGjD`)%sSXRDvBCrr2j$@s@K*Irs`2|l0M(nL z(vfi7`XTrW2Q4;114F>-15tomm!Q;){X@t`ckxNmxOgZB)bufltifg`u`U~u=gwGh zW$|ofknd&5L;%*DN)pIgs>>$eqX-Ci8Sx7OOKc@*NWWDdO-DuP&Kx7lCRh_xfj7ue z1wMLe(DIz8N=#Qwqb3S+m;Y~I;DNGa@<|KAdlnN3X(SQ-s^t9M6Y+amdrmwevNK0- zTT`mFNRyhWuOQNGkN{%|;zKOyioTGhjJm}aj=5lv3KqpxUg^H zz@>oK6O0F2y{p~lL*_~OUZD=6tPt?=^R+9VEu)h^jG=$17OxKD4gbS8=dz-mCH3*qebJJ41nq zy?0EsF>I-6Dr`OCuKCIp@AY0F({=g>|NYcb+OWR5GkE1g6o|GNUVJyaSiAlz?BCTb zYolT7tLx{pw#PIdjYDxN;o-`YIFd$+bTpAf(#&NbHYGVSIVSM8*%SoGLAVf}slY!9 zKOe8w{0b!Ph}kotw-(aJp8;&alY*A^o0qpN)>u_P1@~CioZxl;h36^-P1*|LI++rM zm=~rA8~oS-KaY`E(X51OGz)o3nba;%$0yhqAvUoy`gyVKP{wW?z;+4cel<+_mdCzq z7hlG+cjkV@Hbwcy@;Ubi>e*YR8EO6E6@_#CTefUbbf;5%#%|O* zZMl0F6B8SOi|3HMScb5+Y?xTIF`Q(nX62Qwf=i%i661tlkA=I)#TsAy%Fs!Q$cgTG z>BQF{_PJzAsBWPi)=y+qn?0>C0>l$!1;~agg1nyls#|Q56;UH>opR-UF_3ul-ZIrz z)YE{x!?rLwfvB|y7~aS*22xG+p5s@nvqzcA8`!BGTuNPyQ9l@+q%fc1F<4mz2_z~o+Fl?k5>HsH+vBG7k!C~T5 z6)5+*lZvXjOe+?W$717aiLhh>cN2<*1QYG{z%qlps0N&rkfs@WWA)YJ(D>xm2D(gtK4#|Q-k9--j0B?gJTG61|9?Az-2r+W{#7a zj>AckSYdp$I_?TMczNe56dJHfjGl+ryeql8Or}+C_21v;+nNDrD_}z(A1tXH2bU1g zfh>PQ{Bv0$yT#$E=QH-4xwNJ4n4ImLRm$F*$8`M-{EFb#aLBa$bAY(~@+HAO85u#` zGkc@*yNu82wCY~3lQEQ@e}+>F>J@Y)aYm;uZ}j@<;+F+jEA?c%=P80F(d_K>^wOU{ zOCliQJyG1U%%C)>1%ngO=(uh%HW8KR$gd4V7Xx6@a+;qJeo3A zr+1*ohrkiN{T$Ih@59b-dLai$*jg}|$3<;9+tWg#swXNdfCQuBMHRmAn%mwF1pJnk zihZDMZc-%ky!SDXoT%2LC5%(igLW`2G_jD0l!ejLkXV#AfV%lE_ek#;h?ooEwzRb5 z%0}mh48NMaa)t(fXpGQNyXTmBApSF(OX6oknuSaR__wHC(sTq~8an#bkO`zPD%DUY zJHP+4_btyo7X}_n?&(C5ZoRi5>=+JmTl#nDQ^VBY36ulsc;=?P61k%kUyO_z+ZeR8)R5S zG2x;1m_%T?eRvcgvkno2Kpf;$#$51HLB~7dS*WnPUThMxwcJ=E3Z%bIi(AChI%vd4 ztb`p!U>}OJ&E$f1J7Cm9tFjRFmNwrteP!+B&e{?V77#*(jOeK#0UcBi0G>LzT6 zu{Rqd50^zpn>x2AL_8&MdVqCLoV1@OsC$?Wx#?DTof?{}?>Di2F?<;aUZKjayz-qXFQ#YE(s?4x_LU6KxS52{e$W+H>xgey029Pf8E5(&``J}koZ0Hp7wld znSli|{p8~ZnYyO_U(D+NE?lpluGhSymE8WHe8@oxh2i{LQ&hojlnr^i{VS6>K;I1;W|}qB4Nn7{Y?ANl_tUcuHHf2CYpCwfBx;sIUkIs zG|pOjdmOi4>YwWO=@#=LIIN3b#CwfM0*>x$@hl}_4{URJukf9i>?eoJ5P$E+ORkh? z$rrt{=m^=IqLAUfvXGRH7YfS_M^f7@o%bfbDQq>2c;L+z(42Jz5oIZ5%DMTjkBGMJ zIc3Jykxn*0%QE{@V>u)fd6q8n=N>V^rYgkN2|K(0A}CriweaigeRW6|KxDf}>O8f_RRVrzhVcTMXuHE9=k zXT)PrELjTIN)=w1jP_8ASF}8v|Y51Xyv5TT5dSf!U%1c;)2ZTUs;!bJu~i zictzPI=Ica%{h8yT^0WEPY$D)16paqbhC1FxdfJsb7DfoY{v1CQ=X(cH6lVj5Qy_~ z1yyqKjwHM|wKZFI#1@+Ni%aA(kK^&ET)5_5`V|uc-`h%JF$i&GeJ}7jly^ZyRwe{9 zL9jN4UwlsW0>SrUiiJf?BoG!5)&xHQ?DT@$6#U zA+X-ras5sZD%?JVBlWf9_l#<#{J0mnabF+KBq>Ts-<5-|DO&z=ER{xU7eftRt`rT- zvn+c3p7)xK=@Wk>$l>?J`>XK2U`Ff$h_@b9Z0vZK9yp=&-=(w?`qyJrJV->yV3 zThqI5`Rn83Pnt7)Xul^6{d7`3eGI92T46shco{UsGt}BoFqh4Nx3si^R^IhGeYMP8 zVGzt+4}WTRDINYT7&txU517U!8hKye@ObGV)eq-DvZ}(KAz-w%^)L7M_l7`kOKOOJ z|M>W}{aGb_eg3BpnVC1#eECxS-<|*S#?ZqrPicOhi|So`3FDx`SZrr zl&@ZGziV|y_a9m+TzJ*E{?|Ti&LE?-e*WFm+Q{&-`hV_uLD=$CD44|$T^-*UJmI%9 zczu5D>u~Ubde++Svr^a?xGYE=CKa4Pa>6->v7|xCRs#`L73UQR!j9?A7gh4%Z1~>8 zo&g$gq9tNlOGu$03{=9QjA-w%pEba(yY{CG8~|49?>0>TZ46l*u@8Og<#vBdv&+82 za6`F_)?BoKDTS2Zo_?yt2Ny01SI!;i&1WV*4Y6tlUd;3PqP@F3y^m;l9521H{k(Zqbz8olO5x|; zeRf}YDY0sd$07%lLd-Fp{U+5<-|v>cc;E`2P{glKVHzxdOh07<>;MvEa)OhpwHwIP(GU5K+C!ijqt*V zu#_S+IB-YCI{JVB*wctM4Pv@QkgaMiA#Q{IDU?POp-920j)GBmVkN@J=RUc0>iT3ypkUAOu|i7%O9BK~t7z{*L3vP8t<7e%5$2ZeFBc1nT#>xq zC|RV6w!{>gB_>j$gEi#CEip4{CUIu5iZjRHNj8xiL|Or?*Do1#q@^ewuP!ccrfqq$ z5LJ}+%1h&`tl5M?s|7VF!r1Zl`;Mv-1NYL?x}_!dUp{|+I9Cu-V?G45r&{;>C6$8T zVh8m<))cqPLh{Ho@8JtsRu{H_p?hmP71_%ZHOgj22CqMQyOAxV`UW&X8(R1bgqMW) zI38>6Xc935{;ZNKxL^sUxB@r%GPE<~l|96q4yto0P=MuckGKj31cXEg7d z4X8gj`FCmQ-?1Av!JzIt(4;$wCIOHZw-OJwHE`+SQ0g#nboAHRyh)V`gjM_=P3Uz48X&@D zTYVr1Ym$bKLL4~85nL;(_*@e@(-*e5@T#(LZf#>$W6%kM^8JZO0WXJu_01=x7(7zR zh}U>tD^kAoQe4N$l1cdZyM~$G-;3;tSpW`GBaD9ellDjjR82}$jA@<_Q{Hu^4TRiw z`&8=+&XTar?%%!`-t3&ck+*u|X2#gI;e|a{TuUPHuaCWNun!2Tx} zXK_VWgPUDz2glJ?>!MBEF;C=!bnA49G>Gb(!M*+@z80rkv0ZKOcFt`gjz5y^J&mJ^do-&;yOMG~Okm<_@&8wF{K4vn#SlvF4qb72m zcxQ#U^N>RY6AmBQ;fa;2ys5t7#i6Ote~ZKT-S_Ro7Ry5#zdS4fy8LwoikX3Ic9m2l zRho#|*vvT$fnkw*7z%OIC>NuIrC*SNBO+%~Ky!*BWxYulsa9Z}8}D&ESVJEGy*Y;& z6erLGYc1NqijPnMwJB;>1BkaT+)x2pTi{&wfPf)>O}eE5hh$kmSLf)F;0$#Li1wpY zI2w|raN<`EfDs(c1`J;@rV_N?g<3*Oek^EQS-?lN;AU4)@xl^^hbL-KNXSG!kRdB9 zz79^)LbQ4ic3n>sGnsVnFoB8Ms4u%1F1yi)$N}KVY*`aGV|cCvjD@$z9L=ScLG0sl za^OI*j(ScZgu0tOp@0}`eF)AbHFJrQoJu4I6*Y>YJLBQtd+ZXEgky87q~I^CNSfkL z6`&71G;1#8pcx@1lh?lcdX8}+O!V<-e9Q%3Gz-BYsLtde04uARbAgCru}DPv{uhSi zWahQ6s5BTP3u_0-_h-^@T)(TXwznaq!szzqR|+qNwGq%cjqZ1Z-v*SM%MGOyjM~$~ zFGXebU$WRCbNv^x(gk4m4;g;qJ;tsYX?YWvOa!pZDj7@ za^hs&3A^r&-=*`bjG*r~hnFWWge@=LcPdspIF><$Y4dCP!j|?yV3pVP`;T0i} zz zb_#W_`nrOPhPtICg+lGwb4pjPi^PvB!S@C<%X-3y#x0n=@+X{I1*8I(TCB9 z?R?~et%PDWGLEeQ6&e470yR&eOag`F0#1Y3wqj>|v-(qFJG&*0m3t4SJWCNU+IHI( zRwSi`B+d^9T@U^apho5EfBrTul^KP*CU zGDmIc2sZP5&a;oZp93GtaTHM+G_l*H#EH0t7OITU>eEV~Rv3qYmy->NR2 zOTqouV0M++m{%o*(#N4jb=P)?z}Q`_vE@lw8033Ks$jbKrJw2O3rOv_3@{&VP{hR2hqHvj%rQF1`?D%0(Aod@y)u6pe&5 zT`X!iLM{$o72sPeuM~wqMdGC;j#`HYatdvU4^K7FF?|GfZ1ZksD_eNO2n*tO>w6WZIq{VJxeR)efHe$&Ja*Q(x{p%VL&_9y%AkC!`_?%1)@qj7Piz96a~ z3i!mD{sCBtKEE+hc<&k>w9LPlPBk{BlwGdeIv3M)@1!j+sx)k5T9CCS90B=@KW{8g zgERZY@al@|&d`P1TN{hj7T7>oa*V5N!mA+mZ7Vt*Vh%c_WjU8 zH&|rWKQ*oluazEJJhV3NAH2LjbgFS-ZRF-uA9ItAup0c`bq@7?=w=vY9>{DB^ikPLvH_cB(>add0Z*i88$Bd?flWV7Te| zArhZ;?{icxSB?WD-%FSK2dIOW_q+R2wf9FWeZKJH#S4zK=Cl1}>_Q1u++>UoH3Ngu zob-0+Nk6V7lXlcZ-bRm2IEi9AJg2;Gc8}CLO3#L8TYnrme>1qst(WJ$-XFHKV87NC zwx|fk9D(<73J^_&9>4pXOU;*m|GZ%dCM^9<027Ut^jl2qVNXn;rg{Q}%qod76(2=K zDythr*J_-Kt>vQ(Qx!Jmjp~kKP%!1Kz@b<4{<`g`E_^gng`G~7_9baXqA7F=p3h+- zP+F60Yw-+}W{`|}&~61A!Xv2zOujpYMMt3HZ7?Ry576*m;at&U0>Ok2`We!e)3^%Z zsY0W=6B=Hi)<1y<(>#PC3k(KwP=WFmkh=&l6ST7R$^jFES|H0B(dG>PJ`k^m6RP^3 zs5_6ww@Lx6LB0@^e8J{8UK~A>$2M*S7D9+EJFMVYvj8wpb!35ozU>N&2E0&)m=~%}x6dj|z-bjz18GRN$yk!O25tNvD7< zOgH1&m1=xa?fJJ@LQK=giWEYj3Xw%Y;ce40&C9=S`SthPe+g?Q{0pNdj{6R#IDXOTJ9 z6FG|o>nmC7ePJst>qE0Y?MMM!vDOEu0%#X0P7%^nhl!j0c})N%WXyjwH496zWR4j( zv&ZWwS4C($L$oGMqQMj^XVcaC>9vuK;Q3bV*O$Upr`DsUg8y|LUYzb)A4{|kTWhli zu=yzP%=;TxD@wy?A+Z(iNf(C;tS%BI6`Hdhip0-wotP*+DzHMiSc`+$6PUY^lt2!! z>!n(Ike>(H^$(0Ya#7_|pgcQSx!P%7?soU?)Ki*94V9R_H7VTtR`e|&kT<(;s$u!d zz`oRWBi1Fq2D*z4T|*MhE}L_$V_YYC2WE9f`)Eu9zpx|J2$^{8E$Q_i`a<-ml)OLU{xU@HB6pK8Z zeAEvD{{dwhhbv?Q0B@C6PYh&+0sRFBu^MKK58hQV^_&Wh@Hr(_baUz;Z~{L(4Q3y9 zuKq~`3TRu)&aky#<)D-@U7rYB9A5b{6&!H$@8bPF|B}9-)v-=<_A=AjQk?252WwWm zHHz8j9v=?vz)-SfT{2EmBRFz?ZyCjd?PA($J@OmHDwxKqZ?O-LBDR9FItR^AM92gG z>u~~?;Y_E1Qxw~nuK}nBikftghe=^ww{5Ud%SEC5jN4L2Pi4Y|mycpRj@NM@7J>w- z>J>4nCRsCzfHM-3#f6r2lo50xdgE=ygjOs(Nw0PNu;Sp{=albJry8c#U2Zx*hFn<4nG8wbKSu1kE z3B%Y6raA)|ib~mlgY*~>#;+wgVut|l zp`9lYW2KHVk@pv#K+x4u@ECczB3*X06b}j_vX?kAq3sDN&Qx-fc*^%@t=L&6`(JpOyobTA@!7-)6t%Ni|@o|Oi23L<|{<>a0RMSb{Am2>7 z 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�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 literal 0 HcmV?d00001 diff --git a/backend/plugin/article/public/icon.png b/backend/plugin/article/public/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..786fbd3199f060ef1f2bbdea6fcebe704dfe3391 GIT binary patch literal 267659 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