From c9ffb52b7fda6cc75f4882691fe3d32776c0adea Mon Sep 17 00:00:00 2001 From: Eg <1711788888@qq.com> Date: Tue, 7 Apr 2026 09:03:48 +0800 Subject: [PATCH] Initial commit --- .gitignore | 80 + Makefile | 75 + README.md | 389 + SECURITY.md | 5 + deploy/docker-compose/docker-compose.yaml | 90 + deploy/docker/Dockerfile | 18 + deploy/docker/entrypoint.sh | 19 + .../server/gva-server-configmap.yaml | 148 + .../server/gva-server-deployment.yaml | 74 + .../kubernetes/server/gva-server-service.yaml | 21 + deploy/kubernetes/web/gva-web-configmap.yaml | 32 + deploy/kubernetes/web/gva-web-deploymemt.yaml | 51 + deploy/kubernetes/web/gva-web-ingress.yaml | 18 + deploy/kubernetes/web/gva-web-service.yaml | 21 + docs/gin-vue-admin.png | Bin 0 -> 105776 bytes server/Dockerfile | 31 + server/README.md | 54 + server/api/v1/enter.go | 13 + server/api/v1/example/enter.go | 17 + .../api/v1/example/exa_attachment_category.go | 82 + .../api/v1/example/exa_breakpoint_continue.go | 156 + server/api/v1/example/exa_customer.go | 176 + .../v1/example/exa_file_upload_download.go | 135 + server/api/v1/system/ai_workflow_session.go | 102 + server/api/v1/system/auto_code_history.go | 115 + server/api/v1/system/auto_code_mcp.go | 173 + server/api/v1/system/auto_code_package.go | 100 + server/api/v1/system/auto_code_plugin.go | 218 + server/api/v1/system/auto_code_template.go | 121 + server/api/v1/system/enter.go | 59 + server/api/v1/system/sys_api.go | 381 + server/api/v1/system/sys_api_token.go | 81 + server/api/v1/system/sys_authority.go | 257 + server/api/v1/system/sys_authority_btn.go | 80 + server/api/v1/system/sys_auto_code.go | 219 + server/api/v1/system/sys_auto_code_sse.go | 210 + server/api/v1/system/sys_captcha.go | 70 + server/api/v1/system/sys_casbin.go | 69 + server/api/v1/system/sys_dictionary.go | 191 + server/api/v1/system/sys_dictionary_detail.go | 267 + server/api/v1/system/sys_error.go | 199 + server/api/v1/system/sys_export_template.go | 456 + server/api/v1/system/sys_initdb.go | 59 + server/api/v1/system/sys_jwt_blacklist.go | 33 + server/api/v1/system/sys_login_log.go | 82 + server/api/v1/system/sys_menu.go | 335 + server/api/v1/system/sys_operation_record.go | 124 + server/api/v1/system/sys_params.go | 171 + server/api/v1/system/sys_skills.go | 263 + server/api/v1/system/sys_system.go | 89 + server/api/v1/system/sys_user.go | 516 + server/api/v1/system/sys_version.go | 486 + server/cmd/mcp/config.go | 192 + server/cmd/mcp/config.yaml | 14 + server/cmd/mcp/logger.go | 17 + server/cmd/mcp/main.go | 35 + server/config.docker.yaml | 282 + server/config/auto_code.go | 22 + server/config/captcha.go | 9 + server/config/config.go | 40 + server/config/cors.go | 14 + server/config/db_list.go | 53 + server/config/disk.go | 9 + server/config/email.go | 12 + server/config/excel.go | 5 + server/config/gorm_mssql.go | 10 + server/config/gorm_mysql.go | 9 + server/config/gorm_oracle.go | 18 + server/config/gorm_pgsql.go | 17 + server/config/gorm_sqlite.go | 13 + server/config/jwt.go | 8 + server/config/mcp.go | 18 + server/config/mongo.go | 41 + server/config/oss_aliyun.go | 10 + server/config/oss_aws.go | 13 + server/config/oss_cloudflare.go | 10 + server/config/oss_huawei.go | 9 + server/config/oss_local.go | 6 + server/config/oss_minio.go | 11 + server/config/oss_qiniu.go | 11 + server/config/oss_tencent.go | 10 + server/config/redis.go | 10 + server/config/system.go | 15 + server/config/zap.go | 71 + server/core/internal/constant.go | 9 + server/core/internal/cutter.go | 125 + server/core/internal/zap_core.go | 133 + server/core/server.go | 48 + server/core/server_run.go | 60 + server/core/viper.go | 76 + server/core/zap.go | 36 + server/docs/docs.go | 9314 +++++++++++++++++ server/docs/swagger.json | 9286 ++++++++++++++++ server/docs/swagger.yaml | 5677 ++++++++++ server/global/global.go | 68 + server/global/model.go | 14 + server/global/version.go | 12 + server/go.mod | 207 + server/go.sum | 880 ++ server/initialize/db_list.go | 36 + server/initialize/ensure_tables.go | 113 + server/initialize/gorm.go | 87 + server/initialize/gorm_biz.go | 14 + server/initialize/gorm_mssql.go | 64 + server/initialize/gorm_mysql.go | 48 + server/initialize/gorm_oracle.go | 37 + server/initialize/gorm_pgsql.go | 43 + server/initialize/gorm_sqlite.go | 38 + server/initialize/init.go | 15 + server/initialize/internal/gorm.go | 31 + .../initialize/internal/gorm_logger_writer.go | 41 + server/initialize/internal/mongo.go | 29 + server/initialize/mongo.go | 155 + server/initialize/other.go | 32 + server/initialize/plugin.go | 15 + server/initialize/plugin_biz_v1.go | 36 + server/initialize/plugin_biz_v2.go | 16 + server/initialize/redis.go | 59 + server/initialize/register_init.go | 10 + server/initialize/reload.go | 45 + server/initialize/router.go | 117 + server/initialize/router_biz.go | 19 + server/initialize/timer.go | 37 + server/initialize/validator.go | 22 + server/main.go | 51 + server/mcp/api_creator.go | 159 + server/mcp/api_lister.go | 95 + server/mcp/autocode_http.go | 48 + server/mcp/client/client.go | 44 + server/mcp/client/client_test.go | 132 + server/mcp/context.go | 66 + server/mcp/dictionary_generator.go | 174 + server/mcp/dictionary_http.go | 73 + server/mcp/dictionary_query.go | 139 + server/mcp/enter.go | 31 + server/mcp/gva_analyze.go | 494 + server/mcp/gva_execute.go | 750 ++ server/mcp/gva_review.go | 170 + server/mcp/http_client.go | 153 + server/mcp/menu_creator.go | 228 + server/mcp/menu_lister.go | 59 + server/mcp/page.go | 8 + server/mcp/process_utils_unix.go | 37 + server/mcp/process_utils_windows.go | 58 + server/mcp/requirement_analyzer.go | 199 + server/mcp/result.go | 29 + server/mcp/server.go | 52 + server/mcp/standalone_manager.go | 479 + server/middleware/casbin_rbac.go | 32 + server/middleware/cors.go | 73 + server/middleware/email.go | 58 + server/middleware/error.go | 80 + server/middleware/jwt.go | 89 + server/middleware/limit_ip.go | 92 + server/middleware/loadtls.go | 27 + server/middleware/logger.go | 89 + server/middleware/operation.go | 129 + server/middleware/timeout.go | 55 + server/model/common/basetypes.go | 43 + server/model/common/clearDB.go | 7 + server/model/common/request/common.go | 48 + server/model/common/response/common.go | 8 + server/model/common/response/response.go | 62 + .../model/example/exa_attachment_category.go | 16 + .../model/example/exa_breakpoint_continue.go | 24 + server/model/example/exa_customer.go | 15 + .../model/example/exa_file_upload_download.go | 18 + .../request/exa_file_upload_and_downloads.go | 10 + .../response/exa_breakpoint_continue.go | 11 + server/model/example/response/exa_customer.go | 7 + .../response/exa_file_upload_download.go | 7 + server/model/system/request/jwt.go | 21 + .../system/request/sys_ai_workflow_session.go | 40 + server/model/system/request/sys_api.go | 21 + server/model/system/request/sys_api_token.go | 12 + .../model/system/request/sys_authority_btn.go | 7 + server/model/system/request/sys_auto_code.go | 291 + .../model/system/request/sys_auto_code_mcp.go | 16 + .../system/request/sys_auto_code_package.go | 31 + .../model/system/request/sys_auto_history.go | 57 + server/model/system/request/sys_casbin.go | 27 + server/model/system/request/sys_dictionary.go | 9 + .../system/request/sys_dictionary_detail.go | 43 + server/model/system/request/sys_error.go | 14 + .../system/request/sys_export_template.go | 14 + server/model/system/request/sys_init.go | 124 + server/model/system/request/sys_login_log.go | 11 + server/model/system/request/sys_menu.go | 33 + .../system/request/sys_operation_record.go | 11 + server/model/system/request/sys_params.go | 14 + server/model/system/request/sys_skills.go | 80 + server/model/system/request/sys_user.go | 77 + server/model/system/request/sys_version.go | 40 + .../response/sys_ai_workflow_session.go | 21 + server/model/system/response/sys_api.go | 18 + server/model/system/response/sys_authority.go | 12 + .../system/response/sys_authority_btn.go | 5 + server/model/system/response/sys_auto_code.go | 27 + server/model/system/response/sys_captcha.go | 8 + server/model/system/response/sys_casbin.go | 9 + server/model/system/response/sys_menu.go | 15 + server/model/system/response/sys_system.go | 7 + server/model/system/response/sys_user.go | 15 + server/model/system/response/sys_version.go | 14 + .../model/system/sys_ai_workflow_session.go | 35 + server/model/system/sys_api.go | 28 + server/model/system/sys_api_token.go | 17 + server/model/system/sys_authority.go | 23 + server/model/system/sys_authority_btn.go | 8 + server/model/system/sys_authority_menu.go | 19 + server/model/system/sys_auto_code_history.go | 68 + server/model/system/sys_auto_code_package.go | 18 + server/model/system/sys_base_menu.go | 43 + server/model/system/sys_dictionary.go | 22 + server/model/system/sys_dictionary_detail.go | 26 + server/model/system/sys_error.go | 21 + server/model/system/sys_export_template.go | 46 + server/model/system/sys_jwt_blacklist.go | 10 + server/model/system/sys_login_log.go | 16 + server/model/system/sys_menu_btn.go | 10 + server/model/system/sys_operation_record.go | 24 + server/model/system/sys_params.go | 20 + server/model/system/sys_skills.go | 25 + server/model/system/sys_system.go | 10 + server/model/system/sys_user.go | 62 + server/model/system/sys_user_authority.go | 11 + server/model/system/sys_version.go | 20 + server/plugin/announcement/api/enter.go | 10 + server/plugin/announcement/api/info.go | 183 + server/plugin/announcement/config/config.go | 4 + server/plugin/announcement/gen/gen.go | 17 + server/plugin/announcement/initialize/api.go | 49 + .../announcement/initialize/dictionary.go | 12 + server/plugin/announcement/initialize/gorm.go | 20 + server/plugin/announcement/initialize/menu.go | 22 + .../plugin/announcement/initialize/router.go | 15 + .../plugin/announcement/initialize/viper.go | 17 + server/plugin/announcement/model/info.go | 20 + .../plugin/announcement/model/request/info.go | 12 + server/plugin/announcement/plugin.go | 32 + server/plugin/announcement/plugin/plugin.go | 5 + server/plugin/announcement/router/enter.go | 10 + server/plugin/announcement/router/info.go | 31 + server/plugin/announcement/service/enter.go | 5 + server/plugin/announcement/service/info.go | 78 + server/plugin/email/README.MD | 78 + server/plugin/email/api/enter.go | 7 + server/plugin/email/api/sys_email.go | 53 + server/plugin/email/config/email.go | 12 + server/plugin/email/global/gloabl.go | 5 + server/plugin/email/main.go | 29 + server/plugin/email/model/response/email.go | 7 + server/plugin/email/router/enter.go | 7 + server/plugin/email/router/sys_email.go | 19 + server/plugin/email/service/enter.go | 7 + server/plugin/email/service/sys_email.go | 32 + server/plugin/email/utils/email.go | 122 + server/plugin/plugin-tool/utils/check.go | 138 + server/plugin/register.go | 5 + server/resource/function/api.go.tpl | 44 + server/resource/function/api.js.tpl | 32 + server/resource/function/server.go.tpl | 25 + server/resource/mcp/tools.tpl | 56 + server/resource/package/readme.txt.tpl | 7 + server/resource/package/server/api/api.go.tpl | 260 + .../resource/package/server/api/enter.go.tpl | 4 + .../package/server/model/model.go.tpl | 75 + .../server/model/request/request.go.tpl | 39 + .../package/server/router/enter.go.tpl | 4 + .../package/server/router/router.go.tpl | 42 + .../package/server/service/enter.go.tpl | 4 + .../package/server/service/service.go.tpl | 213 + server/resource/package/web/api/api.js.tpl | 130 + server/resource/package/web/view/form.vue.tpl | 274 + .../resource/package/web/view/table.vue.tpl | 694 ++ server/resource/plugin/server/api/api.go.tpl | 255 + .../resource/plugin/server/api/enter.go.tpl | 6 + .../plugin/server/config/config.go.tpl | 4 + server/resource/plugin/server/gen/gen.go.tpl | 18 + .../plugin/server/initialize/api.go.tpl | 12 + .../server/initialize/dictionary.go.tpl | 12 + .../plugin/server/initialize/gorm.go.tpl | 17 + .../plugin/server/initialize/menu.go.tpl | 12 + .../plugin/server/initialize/router.go.tpl | 14 + .../plugin/server/initialize/viper.go.tpl | 17 + .../resource/plugin/server/model/model.go.tpl | 76 + .../server/model/request/request.go.tpl | 38 + server/resource/plugin/server/plugin.go.tpl | 33 + .../plugin/server/plugin/plugin.go.tpl | 5 + .../plugin/server/router/enter.go.tpl | 6 + .../plugin/server/router/router.go.tpl | 46 + .../plugin/server/service/enter.go.tpl | 7 + .../plugin/server/service/service.go.tpl | 211 + server/resource/plugin/web/api/api.js.tpl | 127 + server/resource/plugin/web/form/form.vue.tpl | 464 + server/resource/plugin/web/view/view.vue.tpl | 689 ++ server/router/enter.go | 13 + server/router/example/enter.go | 19 + .../router/example/exa_attachment_category.go | 16 + server/router/example/exa_customer.go | 22 + .../example/exa_file_upload_and_download.go | 22 + server/router/system/enter.go | 53 + server/router/system/sys_api.go | 35 + server/router/system/sys_api_token.go | 19 + server/router/system/sys_authority.go | 25 + server/router/system/sys_authority_btn.go | 19 + server/router/system/sys_auto_code.go | 46 + server/router/system/sys_auto_code_history.go | 17 + server/router/system/sys_base.go | 16 + server/router/system/sys_casbin.go | 19 + server/router/system/sys_dictionary.go | 24 + server/router/system/sys_dictionary_detail.go | 26 + server/router/system/sys_error.go | 28 + server/router/system/sys_export_template.go | 35 + server/router/system/sys_initdb.go | 15 + server/router/system/sys_jwt.go | 14 + server/router/system/sys_login_log.go | 23 + server/router/system/sys_menu.go | 29 + server/router/system/sys_operation_record.go | 18 + server/router/system/sys_params.go | 25 + server/router/system/sys_skills.go | 35 + server/router/system/sys_system.go | 22 + server/router/system/sys_user.go | 28 + server/router/system/sys_version.go | 25 + server/service/enter.go | 13 + server/service/example/enter.go | 8 + .../example/exa_attachment_category.go | 66 + .../example/exa_breakpoint_continue.go | 71 + server/service/example/exa_customer.go | 87 + .../example/exa_file_upload_download.go | 130 + server/service/system/ai_workflow_markdown.go | 468 + server/service/system/ai_workflow_session.go | 184 + server/service/system/auto_code_history.go | 217 + server/service/system/auto_code_llm.go | 125 + server/service/system/auto_code_mcp.go | 45 + server/service/system/auto_code_package.go | 743 ++ .../service/system/auto_code_package_test.go | 108 + server/service/system/auto_code_plugin.go | 512 + server/service/system/auto_code_template.go | 453 + .../service/system/auto_code_template_test.go | 84 + server/service/system/enter.go | 30 + server/service/system/jwt_black_list.go | 52 + server/service/system/sys_api.go | 326 + server/service/system/sys_api_token.go | 106 + server/service/system/sys_authority.go | 412 + server/service/system/sys_authority_btn.go | 60 + .../service/system/sys_auto_code_interface.go | 55 + server/service/system/sys_auto_code_mssql.go | 83 + server/service/system/sys_auto_code_mysql.go | 83 + server/service/system/sys_auto_code_oracle.go | 72 + server/service/system/sys_auto_code_pgsql.go | 135 + server/service/system/sys_auto_code_sqlite.go | 84 + server/service/system/sys_base_menu.go | 147 + server/service/system/sys_casbin.go | 215 + server/service/system/sys_dictionary.go | 297 + .../service/system/sys_dictionary_detail.go | 392 + server/service/system/sys_error.go | 126 + server/service/system/sys_export_template.go | 724 ++ server/service/system/sys_initdb.go | 189 + server/service/system/sys_initdb_mssql.go | 92 + server/service/system/sys_initdb_mysql.go | 97 + server/service/system/sys_initdb_pgsql.go | 101 + server/service/system/sys_initdb_sqlite.go | 88 + server/service/system/sys_login_log.go | 53 + server/service/system/sys_menu.go | 390 + server/service/system/sys_operation_record.go | 83 + server/service/system/sys_params.go | 82 + server/service/system/sys_skills.go | 785 ++ server/service/system/sys_system.go | 62 + server/service/system/sys_user.go | 336 + server/service/system/sys_version.go | 230 + server/source/example/file_upload_download.go | 65 + server/source/system/api.go | 265 + server/source/system/api_ignore.go | 78 + server/source/system/authorities_menus.go | 121 + server/source/system/authority.go | 88 + server/source/system/casbin.go | 360 + server/source/system/dictionary.go | 71 + server/source/system/dictionary_detail.go | 121 + server/source/system/excel_template.go | 75 + server/source/system/menu.go | 135 + server/source/system/user.go | 106 + server/task/clearTable.go | 51 + server/utils/ast/ast.go | 409 + server/utils/ast/ast_auto_enter.go | 47 + server/utils/ast/ast_enter.go | 181 + server/utils/ast/ast_gorm.go | 166 + server/utils/ast/ast_init_test.go | 11 + server/utils/ast/ast_rollback.go | 173 + server/utils/ast/ast_router.go | 135 + server/utils/ast/ast_test.go | 32 + server/utils/ast/ast_type.go | 53 + server/utils/ast/extract_func.go | 62 + server/utils/ast/import.go | 94 + server/utils/ast/interfaces.go | 17 + server/utils/ast/interfaces_base.go | 81 + server/utils/ast/package_enter.go | 85 + server/utils/ast/package_enter_test.go | 154 + server/utils/ast/package_initialize_gorm.go | 196 + .../utils/ast/package_initialize_gorm_test.go | 171 + server/utils/ast/package_initialize_router.go | 150 + .../ast/package_initialize_router_test.go | 158 + server/utils/ast/package_module_enter.go | 180 + server/utils/ast/package_module_enter_test.go | 185 + server/utils/ast/plugin_enter.go | 167 + server/utils/ast/plugin_enter_test.go | 200 + server/utils/ast/plugin_gen.go | 189 + server/utils/ast/plugin_gen_test.go | 127 + server/utils/ast/plugin_initialize_gorm.go | 111 + .../utils/ast/plugin_initialize_gorm_test.go | 138 + server/utils/ast/plugin_initialize_router.go | 124 + .../ast/plugin_initialize_router_test.go | 155 + server/utils/ast/plugin_initialize_v2.go | 82 + server/utils/ast/plugin_initialize_v2_test.go | 100 + server/utils/autocode/template_funcs.go | 713 ++ server/utils/breakpoint_continue.go | 121 + server/utils/captcha/redis.go | 61 + server/utils/casbin_util.go | 52 + server/utils/claims.go | 148 + server/utils/directory.go | 124 + server/utils/fmt_plus.go | 125 + server/utils/hash.go | 31 + server/utils/human_duration.go | 29 + server/utils/human_duration_test.go | 49 + server/utils/json.go | 34 + server/utils/json_test.go | 53 + server/utils/jwt.go | 105 + server/utils/plugin/plugin.go | 18 + server/utils/plugin/v2/plugin.go | 11 + server/utils/plugin/v2/registry.go | 27 + server/utils/request/http.go | 127 + server/utils/server.go | 126 + server/utils/stacktrace/stacktrace.go | 79 + server/utils/system_events.go | 34 + server/utils/timer/timed_task.go | 229 + server/utils/timer/timed_task_test.go | 72 + server/utils/validator.go | 294 + server/utils/validator_test.go | 37 + server/utils/verify.go | 19 + server/utils/zip.go | 53 + web-admin/.env.development | 1 + web-admin/.env.production | 1 + web-admin/.gitignore | 24 + web-admin/README.md | 47 + web-admin/docs/system-inventory.md | 191 + web-admin/eslint.config.js | 23 + web-admin/index.html | 13 + web-admin/package-lock.json | 4732 +++++++++ web-admin/package.json | 39 + web-admin/public/favicon.svg | 1 + web-admin/public/icons.svg | 24 + web-admin/src/App.tsx | 198 + web-admin/src/assets/hero.png | Bin 0 -> 44919 bytes web-admin/src/assets/react.svg | 1 + web-admin/src/assets/vite.svg | 1 + .../src/features/apis/ApiManagementPage.tsx | 318 + web-admin/src/features/auth/LoginPage.tsx | 183 + .../src/features/dashboard/DashboardPage.tsx | 123 + .../dictionaries/DictionaryManagementPage.tsx | 334 + .../features/discovery/ModuleLandingPage.tsx | 69 + .../src/features/discovery/systemInventory.ts | 303 + .../src/features/errors/ErrorLogPage.tsx | 184 + web-admin/src/features/layout/AdminShell.tsx | 208 + .../src/features/menus/MenuManagementPage.tsx | 337 + .../features/params/ParamsManagementPage.tsx | 201 + web-admin/src/features/person/ProfilePage.tsx | 123 + .../src/features/roles/RoleManagementPage.tsx | 397 + .../src/features/server/ServerStatePage.tsx | 71 + .../src/features/system/SystemConfigPage.tsx | 130 + .../src/features/tokens/ApiTokenPage.tsx | 237 + .../src/features/users/UserManagementPage.tsx | 400 + web-admin/src/index.css | 250 + web-admin/src/lib/api.ts | 275 + web-admin/src/lib/date.ts | 9 + web-admin/src/lib/http.ts | 63 + web-admin/src/lib/menu.ts | 57 + web-admin/src/lib/storage.ts | 13 + web-admin/src/lib/tree.ts | 26 + web-admin/src/main.tsx | 46 + web-admin/src/store/auth.ts | 46 + web-admin/src/types/system.ts | 171 + web-admin/tsconfig.app.json | 30 + web-admin/tsconfig.json | 7 + web-admin/tsconfig.node.json | 24 + web-admin/vite.config.ts | 27 + web/.docker-compose/nginx/conf.d/my.conf | 26 + web/.docker-compose/nginx/conf.d/nginx.conf | 32 + web/.dockerignore | 1 + web/.env.development | 11 + web/.env.production | 7 + web/.gitignore | 5 + web/.prettierrc | 12 + web/Dockerfile | 25 + web/README.md | 106 + web/babel.config.js | 4 + web/eslint.config.mjs | 29 + web/index.html | 115 + web/jsconfig.json | 10 + web/limit.js | 37 + web/openDocument.js | 20 + web/package.json | 87 + web/public/favicon.ico | Bin 0 -> 4286 bytes web/public/logo.png | Bin 0 -> 76683 bytes web/src/App.vue | 46 + web/src/api/api.js | 206 + web/src/api/attachmentCategory.js | 26 + web/src/api/authority.js | 113 + web/src/api/authorityBtn.js | 25 + web/src/api/autoCode.js | 582 + web/src/api/breakpoint.js | 43 + web/src/api/casbin.js | 32 + web/src/api/customer.js | 80 + web/src/api/email.js | 14 + web/src/api/exportTemplate.js | 145 + web/src/api/fileUploadAndDownload.js | 67 + web/src/api/github.js | 19 + web/src/api/initdb.js | 27 + web/src/api/jwt.js | 14 + web/src/api/menu.js | 141 + web/src/api/plugin/api.js | 10 + web/src/api/skills.js | 169 + web/src/api/sysApiToken.js | 25 + web/src/api/sysDictionary.js | 112 + web/src/api/sysDictionaryDetail.js | 145 + web/src/api/sysLoginLog.js | 33 + web/src/api/sysOperationRecord.js | 48 + web/src/api/sysParams.js | 111 + web/src/api/system.js | 55 + web/src/api/system/sysError.js | 126 + web/src/api/user.js | 181 + web/src/api/version.js | 114 + web/src/assets/404.png | Bin 0 -> 43988 bytes web/src/assets/background.svg | 1 + web/src/assets/banner.jpg | Bin 0 -> 40498 bytes web/src/assets/banner2.jpg | Bin 0 -> 45773 bytes web/src/assets/dashboard.png | Bin 0 -> 72153 bytes web/src/assets/docs.png | Bin 0 -> 4701 bytes web/src/assets/flipped-aurora.png | Bin 0 -> 72652 bytes web/src/assets/github.png | Bin 0 -> 7793 bytes web/src/assets/icons/ai-gva.svg | 1 + web/src/assets/icons/close.svg | 1 + web/src/assets/icons/customer-gva.svg | 1 + web/src/assets/icons/idea.svg | 1 + web/src/assets/icons/lock.svg | 1 + web/src/assets/icons/server.svg | 1 + web/src/assets/icons/warn.svg | 1 + web/src/assets/kefu.png | Bin 0 -> 6770 bytes web/src/assets/login_background.jpg | Bin 0 -> 41154 bytes web/src/assets/login_background.svg | 33 + web/src/assets/login_left.svg | 123 + web/src/assets/login_right_banner.jpg | Bin 0 -> 719028 bytes web/src/assets/logo.jpg | Bin 0 -> 27616 bytes web/src/assets/logo.png | Bin 0 -> 8060 bytes web/src/assets/logo_login.png | Bin 0 -> 25312 bytes web/src/assets/nav_logo.png | Bin 0 -> 76683 bytes web/src/assets/noBody.png | Bin 0 -> 4097 bytes web/src/assets/notFound.png | Bin 0 -> 19669 bytes web/src/assets/qm.png | Bin 0 -> 4821 bytes web/src/assets/video.png | Bin 0 -> 5160 bytes web/src/components/application/index.vue | 39 + web/src/components/arrayCtrl/arrayCtrl.vue | 67 + web/src/components/bottomInfo/bottomInfo.vue | 44 + web/src/components/charts/index.vue | 47 + web/src/components/commandMenu/index.vue | 195 + web/src/components/customPic/index.vue | 90 + web/src/components/errorPreview/index.vue | 126 + .../components/exportExcel/exportExcel.vue | 84 + .../components/exportExcel/exportTemplate.vue | 40 + .../components/exportExcel/importExcel.vue | 45 + web/src/components/logo/index.vue | 82 + web/src/components/office/docx.vue | 31 + web/src/components/office/excel.vue | 36 + web/src/components/office/index.vue | 49 + web/src/components/office/pdf.vue | 39 + web/src/components/richtext/rich-edit.vue | 164 + web/src/components/richtext/rich-view.vue | 131 + web/src/components/selectFile/selectFile.vue | 87 + .../selectImage/selectComponent.vue | 86 + .../components/selectImage/selectImage.vue | 503 + web/src/components/svgIcon/svgIcon.vue | 44 + web/src/components/warningBar/warningBar.vue | 33 + web/src/core/config.js | 55 + web/src/core/error-handel.js | 24 + web/src/core/gin-vue-admin.js | 29 + web/src/core/global.js | 63 + web/src/directive/auth.js | 25 + web/src/directive/clickOutSide.js | 43 + web/src/hooks/charts.js | 18 + web/src/hooks/responsive.js | 35 + web/src/hooks/use-windows-resize.js | 23 + web/src/main.js | 37 + web/src/pathInfo.json | 86 + web/src/permission.js | 224 + web/src/pinia/index.js | 8 + web/src/pinia/modules/app.js | 162 + web/src/pinia/modules/dictionary.js | 252 + web/src/pinia/modules/params.js | 31 + web/src/pinia/modules/router.js | 207 + web/src/pinia/modules/user.js | 150 + web/src/plugin/announcement/api/info.js | 110 + web/src/plugin/announcement/form/info.vue | 137 + web/src/plugin/announcement/view/info.vue | 510 + web/src/plugin/email/api/email.js | 29 + web/src/plugin/email/view/index.vue | 60 + web/src/router/index.js | 41 + web/src/style/element/index.scss | 24 + web/src/style/element_visiable.scss | 138 + web/src/style/iconfont.css | 47 + web/src/style/main.scss | 59 + web/src/style/reset.scss | 381 + web/src/style/transition.scss | 68 + web/src/utils/asyncRouter.js | 29 + web/src/utils/btnAuth.js | 6 + web/src/utils/bus.js | 4 + web/src/utils/closeThisPage.js | 5 + web/src/utils/date.js | 44 + web/src/utils/dictionary.js | 93 + web/src/utils/doc.js | 3 + web/src/utils/downloadImg.js | 20 + web/src/utils/env.js | 3 + web/src/utils/event.js | 17 + web/src/utils/fmtRouterTitle.js | 13 + web/src/utils/format.js | 175 + web/src/utils/image.js | 126 + web/src/utils/page.js | 9 + web/src/utils/params.js | 14 + web/src/utils/request.js | 231 + web/src/utils/stringFun.js | 29 + web/src/view/about/index.vue | 166 + web/src/view/dashboard/components/banner.vue | 38 + web/src/view/dashboard/components/card.vue | 45 + .../components/charts-content-numbers.vue | 185 + .../components/charts-people-numbers.vue | 130 + web/src/view/dashboard/components/charts.vue | 49 + web/src/view/dashboard/components/index.js | 19 + web/src/view/dashboard/components/notice.vue | 67 + .../view/dashboard/components/pluginTable.vue | 65 + .../view/dashboard/components/quickLinks.vue | 83 + web/src/view/dashboard/components/table.vue | 47 + web/src/view/dashboard/components/wiki.vue | 40 + web/src/view/dashboard/index.vue | 128 + web/src/view/error/index.vue | 49 + web/src/view/error/reload.vue | 14 + .../view/example/breakpoint/breakpoint.vue | 340 + web/src/view/example/customer/customer.vue | 215 + web/src/view/example/index.vue | 19 + web/src/view/init/index.vue | 386 + .../aside/asideComponent/asyncSubmenu.vue | 66 + .../layout/aside/asideComponent/index.vue | 47 + .../layout/aside/asideComponent/menuItem.vue | 49 + web/src/view/layout/aside/combinationMode.vue | 146 + web/src/view/layout/aside/headMode.vue | 139 + web/src/view/layout/aside/index.vue | 39 + web/src/view/layout/aside/normalMode.vue | 110 + web/src/view/layout/aside/sidebarMode.vue | 290 + web/src/view/layout/header/index.vue | 133 + web/src/view/layout/header/tools.vue | 194 + web/src/view/layout/iframe.vue | 73 + web/src/view/layout/index.vue | 118 + web/src/view/layout/screenfull/index.vue | 62 + web/src/view/layout/search/search.vue | 98 + .../setting/components/layoutModeCard.vue | 205 + .../layout/setting/components/settingItem.vue | 111 + .../setting/components/themeColorPicker.vue | 150 + .../setting/components/themeModeSelector.vue | 70 + web/src/view/layout/setting/index.vue | 228 + .../setting/modules/appearance/index.vue | 106 + .../layout/setting/modules/general/index.vue | 247 + .../layout/setting/modules/layout/index.vue | 145 + web/src/view/layout/tabs/index.vue | 421 + web/src/view/login/index.vue | 251 + web/src/view/person/person.vue | 631 ++ web/src/view/routerHolder.vue | 22 + web/src/view/superAdmin/api/api.vue | 918 ++ .../view/superAdmin/authority/authority.vue | 595 ++ .../superAdmin/authority/components/apis.vue | 174 + .../superAdmin/authority/components/datas.vue | 145 + .../superAdmin/authority/components/menus.vue | 309 + .../superAdmin/dictionary/sysDictionary.vue | 924 ++ .../dictionary/sysDictionaryDetail.vue | 430 + web/src/view/superAdmin/index.vue | 20 + .../menu/components/components-cascader.vue | 131 + web/src/view/superAdmin/menu/icon.vue | 1179 +++ web/src/view/superAdmin/menu/menu.vue | 932 ++ .../operation/sysOperationRecord.vue | 277 + web/src/view/superAdmin/params/sysParams.vue | 604 ++ web/src/view/superAdmin/user/user.vue | 622 ++ web/src/view/system/state.vue | 192 + web/src/view/systemTools/aiWrokflow/index.vue | 2423 +++++ web/src/view/systemTools/apiToken/index.vue | 299 + .../autoCode/component/fieldDialog.vue | 502 + .../autoCode/component/previewCodeDialog.vue | 119 + web/src/view/systemTools/autoCode/index.vue | 1681 +++ web/src/view/systemTools/autoCode/mcp.vue | 151 + web/src/view/systemTools/autoCode/mcpTest.vue | 615 ++ web/src/view/systemTools/autoCode/picture.vue | 426 + .../view/systemTools/autoCodeAdmin/index.vue | 620 ++ web/src/view/systemTools/autoPkg/autoPkg.vue | 207 + .../view/systemTools/exportTemplate/code.js | 32 + .../exportTemplate/exportTemplate.vue | 1166 +++ web/src/view/systemTools/formCreate/index.vue | 208 + web/src/view/systemTools/index.vue | 20 + .../view/systemTools/installPlugin/index.vue | 126 + web/src/view/systemTools/loginLog/index.vue | 180 + web/src/view/systemTools/pubPlug/pubPlug.vue | 305 + web/src/view/systemTools/skills/index.vue | 1460 +++ .../view/systemTools/sysError/sysError.vue | 457 + web/src/view/systemTools/system/system.vue | 1135 ++ web/src/view/systemTools/version/version.vue | 998 ++ web/uno.config.js | 26 + web/vite.config.js | 118 + web/vitePlugin/componentName/index.js | 88 + web/vitePlugin/secret/index.js | 7 + 713 files changed, 111641 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 README.md create mode 100644 SECURITY.md create mode 100644 deploy/docker-compose/docker-compose.yaml create mode 100644 deploy/docker/Dockerfile create mode 100644 deploy/docker/entrypoint.sh create mode 100644 deploy/kubernetes/server/gva-server-configmap.yaml create mode 100644 deploy/kubernetes/server/gva-server-deployment.yaml create mode 100644 deploy/kubernetes/server/gva-server-service.yaml create mode 100644 deploy/kubernetes/web/gva-web-configmap.yaml create mode 100644 deploy/kubernetes/web/gva-web-deploymemt.yaml create mode 100644 deploy/kubernetes/web/gva-web-ingress.yaml create mode 100644 deploy/kubernetes/web/gva-web-service.yaml create mode 100644 docs/gin-vue-admin.png create mode 100644 server/Dockerfile create mode 100644 server/README.md create mode 100644 server/api/v1/enter.go create mode 100644 server/api/v1/example/enter.go create mode 100644 server/api/v1/example/exa_attachment_category.go create mode 100644 server/api/v1/example/exa_breakpoint_continue.go create mode 100644 server/api/v1/example/exa_customer.go create mode 100644 server/api/v1/example/exa_file_upload_download.go create mode 100644 server/api/v1/system/ai_workflow_session.go create mode 100644 server/api/v1/system/auto_code_history.go create mode 100644 server/api/v1/system/auto_code_mcp.go create mode 100644 server/api/v1/system/auto_code_package.go create mode 100644 server/api/v1/system/auto_code_plugin.go create mode 100644 server/api/v1/system/auto_code_template.go create mode 100644 server/api/v1/system/enter.go create mode 100644 server/api/v1/system/sys_api.go create mode 100644 server/api/v1/system/sys_api_token.go create mode 100644 server/api/v1/system/sys_authority.go create mode 100644 server/api/v1/system/sys_authority_btn.go create mode 100644 server/api/v1/system/sys_auto_code.go create mode 100644 server/api/v1/system/sys_auto_code_sse.go create mode 100644 server/api/v1/system/sys_captcha.go create mode 100644 server/api/v1/system/sys_casbin.go create mode 100644 server/api/v1/system/sys_dictionary.go create mode 100644 server/api/v1/system/sys_dictionary_detail.go create mode 100644 server/api/v1/system/sys_error.go create mode 100644 server/api/v1/system/sys_export_template.go create mode 100644 server/api/v1/system/sys_initdb.go create mode 100644 server/api/v1/system/sys_jwt_blacklist.go create mode 100644 server/api/v1/system/sys_login_log.go create mode 100644 server/api/v1/system/sys_menu.go create mode 100644 server/api/v1/system/sys_operation_record.go create mode 100644 server/api/v1/system/sys_params.go create mode 100644 server/api/v1/system/sys_skills.go create mode 100644 server/api/v1/system/sys_system.go create mode 100644 server/api/v1/system/sys_user.go create mode 100644 server/api/v1/system/sys_version.go create mode 100644 server/cmd/mcp/config.go create mode 100644 server/cmd/mcp/config.yaml create mode 100644 server/cmd/mcp/logger.go create mode 100644 server/cmd/mcp/main.go create mode 100644 server/config.docker.yaml create mode 100644 server/config/auto_code.go create mode 100644 server/config/captcha.go create mode 100644 server/config/config.go create mode 100644 server/config/cors.go create mode 100644 server/config/db_list.go create mode 100644 server/config/disk.go create mode 100644 server/config/email.go create mode 100644 server/config/excel.go create mode 100644 server/config/gorm_mssql.go create mode 100644 server/config/gorm_mysql.go create mode 100644 server/config/gorm_oracle.go create mode 100644 server/config/gorm_pgsql.go create mode 100644 server/config/gorm_sqlite.go create mode 100644 server/config/jwt.go create mode 100644 server/config/mcp.go create mode 100644 server/config/mongo.go create mode 100644 server/config/oss_aliyun.go create mode 100644 server/config/oss_aws.go create mode 100644 server/config/oss_cloudflare.go create mode 100644 server/config/oss_huawei.go create mode 100644 server/config/oss_local.go create mode 100644 server/config/oss_minio.go create mode 100644 server/config/oss_qiniu.go create mode 100644 server/config/oss_tencent.go create mode 100644 server/config/redis.go create mode 100644 server/config/system.go create mode 100644 server/config/zap.go create mode 100644 server/core/internal/constant.go create mode 100644 server/core/internal/cutter.go create mode 100644 server/core/internal/zap_core.go create mode 100644 server/core/server.go create mode 100644 server/core/server_run.go create mode 100644 server/core/viper.go create mode 100644 server/core/zap.go create mode 100644 server/docs/docs.go create mode 100644 server/docs/swagger.json create mode 100644 server/docs/swagger.yaml create mode 100644 server/global/global.go create mode 100644 server/global/model.go create mode 100644 server/global/version.go create mode 100644 server/go.mod create mode 100644 server/go.sum create mode 100644 server/initialize/db_list.go create mode 100644 server/initialize/ensure_tables.go create mode 100644 server/initialize/gorm.go create mode 100644 server/initialize/gorm_biz.go create mode 100644 server/initialize/gorm_mssql.go create mode 100644 server/initialize/gorm_mysql.go create mode 100644 server/initialize/gorm_oracle.go create mode 100644 server/initialize/gorm_pgsql.go create mode 100644 server/initialize/gorm_sqlite.go create mode 100644 server/initialize/init.go create mode 100644 server/initialize/internal/gorm.go create mode 100644 server/initialize/internal/gorm_logger_writer.go create mode 100644 server/initialize/internal/mongo.go create mode 100644 server/initialize/mongo.go create mode 100644 server/initialize/other.go create mode 100644 server/initialize/plugin.go create mode 100644 server/initialize/plugin_biz_v1.go create mode 100644 server/initialize/plugin_biz_v2.go create mode 100644 server/initialize/redis.go create mode 100644 server/initialize/register_init.go create mode 100644 server/initialize/reload.go create mode 100644 server/initialize/router.go create mode 100644 server/initialize/router_biz.go create mode 100644 server/initialize/timer.go create mode 100644 server/initialize/validator.go create mode 100644 server/main.go create mode 100644 server/mcp/api_creator.go create mode 100644 server/mcp/api_lister.go create mode 100644 server/mcp/autocode_http.go create mode 100644 server/mcp/client/client.go create mode 100644 server/mcp/client/client_test.go create mode 100644 server/mcp/context.go create mode 100644 server/mcp/dictionary_generator.go create mode 100644 server/mcp/dictionary_http.go create mode 100644 server/mcp/dictionary_query.go create mode 100644 server/mcp/enter.go create mode 100644 server/mcp/gva_analyze.go create mode 100644 server/mcp/gva_execute.go create mode 100644 server/mcp/gva_review.go create mode 100644 server/mcp/http_client.go create mode 100644 server/mcp/menu_creator.go create mode 100644 server/mcp/menu_lister.go create mode 100644 server/mcp/page.go create mode 100644 server/mcp/process_utils_unix.go create mode 100644 server/mcp/process_utils_windows.go create mode 100644 server/mcp/requirement_analyzer.go create mode 100644 server/mcp/result.go create mode 100644 server/mcp/server.go create mode 100644 server/mcp/standalone_manager.go create mode 100644 server/middleware/casbin_rbac.go create mode 100644 server/middleware/cors.go create mode 100644 server/middleware/email.go create mode 100644 server/middleware/error.go create mode 100644 server/middleware/jwt.go create mode 100644 server/middleware/limit_ip.go create mode 100644 server/middleware/loadtls.go create mode 100644 server/middleware/logger.go create mode 100644 server/middleware/operation.go create mode 100644 server/middleware/timeout.go create mode 100644 server/model/common/basetypes.go create mode 100644 server/model/common/clearDB.go create mode 100644 server/model/common/request/common.go create mode 100644 server/model/common/response/common.go create mode 100644 server/model/common/response/response.go create mode 100644 server/model/example/exa_attachment_category.go create mode 100644 server/model/example/exa_breakpoint_continue.go create mode 100644 server/model/example/exa_customer.go create mode 100644 server/model/example/exa_file_upload_download.go create mode 100644 server/model/example/request/exa_file_upload_and_downloads.go create mode 100644 server/model/example/response/exa_breakpoint_continue.go create mode 100644 server/model/example/response/exa_customer.go create mode 100644 server/model/example/response/exa_file_upload_download.go create mode 100644 server/model/system/request/jwt.go create mode 100644 server/model/system/request/sys_ai_workflow_session.go create mode 100644 server/model/system/request/sys_api.go create mode 100644 server/model/system/request/sys_api_token.go create mode 100644 server/model/system/request/sys_authority_btn.go create mode 100644 server/model/system/request/sys_auto_code.go create mode 100644 server/model/system/request/sys_auto_code_mcp.go create mode 100644 server/model/system/request/sys_auto_code_package.go create mode 100644 server/model/system/request/sys_auto_history.go create mode 100644 server/model/system/request/sys_casbin.go create mode 100644 server/model/system/request/sys_dictionary.go create mode 100644 server/model/system/request/sys_dictionary_detail.go create mode 100644 server/model/system/request/sys_error.go create mode 100644 server/model/system/request/sys_export_template.go create mode 100644 server/model/system/request/sys_init.go create mode 100644 server/model/system/request/sys_login_log.go create mode 100644 server/model/system/request/sys_menu.go create mode 100644 server/model/system/request/sys_operation_record.go create mode 100644 server/model/system/request/sys_params.go create mode 100644 server/model/system/request/sys_skills.go create mode 100644 server/model/system/request/sys_user.go create mode 100644 server/model/system/request/sys_version.go create mode 100644 server/model/system/response/sys_ai_workflow_session.go create mode 100644 server/model/system/response/sys_api.go create mode 100644 server/model/system/response/sys_authority.go create mode 100644 server/model/system/response/sys_authority_btn.go create mode 100644 server/model/system/response/sys_auto_code.go create mode 100644 server/model/system/response/sys_captcha.go create mode 100644 server/model/system/response/sys_casbin.go create mode 100644 server/model/system/response/sys_menu.go create mode 100644 server/model/system/response/sys_system.go create mode 100644 server/model/system/response/sys_user.go create mode 100644 server/model/system/response/sys_version.go create mode 100644 server/model/system/sys_ai_workflow_session.go create mode 100644 server/model/system/sys_api.go create mode 100644 server/model/system/sys_api_token.go create mode 100644 server/model/system/sys_authority.go create mode 100644 server/model/system/sys_authority_btn.go create mode 100644 server/model/system/sys_authority_menu.go create mode 100644 server/model/system/sys_auto_code_history.go create mode 100644 server/model/system/sys_auto_code_package.go create mode 100644 server/model/system/sys_base_menu.go create mode 100644 server/model/system/sys_dictionary.go create mode 100644 server/model/system/sys_dictionary_detail.go create mode 100644 server/model/system/sys_error.go create mode 100644 server/model/system/sys_export_template.go create mode 100644 server/model/system/sys_jwt_blacklist.go create mode 100644 server/model/system/sys_login_log.go create mode 100644 server/model/system/sys_menu_btn.go create mode 100644 server/model/system/sys_operation_record.go create mode 100644 server/model/system/sys_params.go create mode 100644 server/model/system/sys_skills.go create mode 100644 server/model/system/sys_system.go create mode 100644 server/model/system/sys_user.go create mode 100644 server/model/system/sys_user_authority.go create mode 100644 server/model/system/sys_version.go create mode 100644 server/plugin/announcement/api/enter.go create mode 100644 server/plugin/announcement/api/info.go create mode 100644 server/plugin/announcement/config/config.go create mode 100644 server/plugin/announcement/gen/gen.go create mode 100644 server/plugin/announcement/initialize/api.go create mode 100644 server/plugin/announcement/initialize/dictionary.go create mode 100644 server/plugin/announcement/initialize/gorm.go create mode 100644 server/plugin/announcement/initialize/menu.go create mode 100644 server/plugin/announcement/initialize/router.go create mode 100644 server/plugin/announcement/initialize/viper.go create mode 100644 server/plugin/announcement/model/info.go create mode 100644 server/plugin/announcement/model/request/info.go create mode 100644 server/plugin/announcement/plugin.go create mode 100644 server/plugin/announcement/plugin/plugin.go create mode 100644 server/plugin/announcement/router/enter.go create mode 100644 server/plugin/announcement/router/info.go create mode 100644 server/plugin/announcement/service/enter.go create mode 100644 server/plugin/announcement/service/info.go create mode 100644 server/plugin/email/README.MD create mode 100644 server/plugin/email/api/enter.go create mode 100644 server/plugin/email/api/sys_email.go create mode 100644 server/plugin/email/config/email.go create mode 100644 server/plugin/email/global/gloabl.go create mode 100644 server/plugin/email/main.go create mode 100644 server/plugin/email/model/response/email.go create mode 100644 server/plugin/email/router/enter.go create mode 100644 server/plugin/email/router/sys_email.go create mode 100644 server/plugin/email/service/enter.go create mode 100644 server/plugin/email/service/sys_email.go create mode 100644 server/plugin/email/utils/email.go create mode 100644 server/plugin/plugin-tool/utils/check.go create mode 100644 server/plugin/register.go create mode 100644 server/resource/function/api.go.tpl create mode 100644 server/resource/function/api.js.tpl create mode 100644 server/resource/function/server.go.tpl create mode 100644 server/resource/mcp/tools.tpl create mode 100644 server/resource/package/readme.txt.tpl create mode 100644 server/resource/package/server/api/api.go.tpl create mode 100644 server/resource/package/server/api/enter.go.tpl create mode 100644 server/resource/package/server/model/model.go.tpl create mode 100644 server/resource/package/server/model/request/request.go.tpl create mode 100644 server/resource/package/server/router/enter.go.tpl create mode 100644 server/resource/package/server/router/router.go.tpl create mode 100644 server/resource/package/server/service/enter.go.tpl create mode 100644 server/resource/package/server/service/service.go.tpl create mode 100644 server/resource/package/web/api/api.js.tpl create mode 100644 server/resource/package/web/view/form.vue.tpl create mode 100644 server/resource/package/web/view/table.vue.tpl create mode 100644 server/resource/plugin/server/api/api.go.tpl create mode 100644 server/resource/plugin/server/api/enter.go.tpl create mode 100644 server/resource/plugin/server/config/config.go.tpl create mode 100644 server/resource/plugin/server/gen/gen.go.tpl create mode 100644 server/resource/plugin/server/initialize/api.go.tpl create mode 100644 server/resource/plugin/server/initialize/dictionary.go.tpl create mode 100644 server/resource/plugin/server/initialize/gorm.go.tpl create mode 100644 server/resource/plugin/server/initialize/menu.go.tpl create mode 100644 server/resource/plugin/server/initialize/router.go.tpl create mode 100644 server/resource/plugin/server/initialize/viper.go.tpl create mode 100644 server/resource/plugin/server/model/model.go.tpl create mode 100644 server/resource/plugin/server/model/request/request.go.tpl create mode 100644 server/resource/plugin/server/plugin.go.tpl create mode 100644 server/resource/plugin/server/plugin/plugin.go.tpl create mode 100644 server/resource/plugin/server/router/enter.go.tpl create mode 100644 server/resource/plugin/server/router/router.go.tpl create mode 100644 server/resource/plugin/server/service/enter.go.tpl create mode 100644 server/resource/plugin/server/service/service.go.tpl create mode 100644 server/resource/plugin/web/api/api.js.tpl create mode 100644 server/resource/plugin/web/form/form.vue.tpl create mode 100644 server/resource/plugin/web/view/view.vue.tpl create mode 100644 server/router/enter.go create mode 100644 server/router/example/enter.go create mode 100644 server/router/example/exa_attachment_category.go create mode 100644 server/router/example/exa_customer.go create mode 100644 server/router/example/exa_file_upload_and_download.go create mode 100644 server/router/system/enter.go create mode 100644 server/router/system/sys_api.go create mode 100644 server/router/system/sys_api_token.go create mode 100644 server/router/system/sys_authority.go create mode 100644 server/router/system/sys_authority_btn.go create mode 100644 server/router/system/sys_auto_code.go create mode 100644 server/router/system/sys_auto_code_history.go create mode 100644 server/router/system/sys_base.go create mode 100644 server/router/system/sys_casbin.go create mode 100644 server/router/system/sys_dictionary.go create mode 100644 server/router/system/sys_dictionary_detail.go create mode 100644 server/router/system/sys_error.go create mode 100644 server/router/system/sys_export_template.go create mode 100644 server/router/system/sys_initdb.go create mode 100644 server/router/system/sys_jwt.go create mode 100644 server/router/system/sys_login_log.go create mode 100644 server/router/system/sys_menu.go create mode 100644 server/router/system/sys_operation_record.go create mode 100644 server/router/system/sys_params.go create mode 100644 server/router/system/sys_skills.go create mode 100644 server/router/system/sys_system.go create mode 100644 server/router/system/sys_user.go create mode 100644 server/router/system/sys_version.go create mode 100644 server/service/enter.go create mode 100644 server/service/example/enter.go create mode 100644 server/service/example/exa_attachment_category.go create mode 100644 server/service/example/exa_breakpoint_continue.go create mode 100644 server/service/example/exa_customer.go create mode 100644 server/service/example/exa_file_upload_download.go create mode 100644 server/service/system/ai_workflow_markdown.go create mode 100644 server/service/system/ai_workflow_session.go create mode 100644 server/service/system/auto_code_history.go create mode 100644 server/service/system/auto_code_llm.go create mode 100644 server/service/system/auto_code_mcp.go create mode 100644 server/service/system/auto_code_package.go create mode 100644 server/service/system/auto_code_package_test.go create mode 100644 server/service/system/auto_code_plugin.go create mode 100644 server/service/system/auto_code_template.go create mode 100644 server/service/system/auto_code_template_test.go create mode 100644 server/service/system/enter.go create mode 100644 server/service/system/jwt_black_list.go create mode 100644 server/service/system/sys_api.go create mode 100644 server/service/system/sys_api_token.go create mode 100644 server/service/system/sys_authority.go create mode 100644 server/service/system/sys_authority_btn.go create mode 100644 server/service/system/sys_auto_code_interface.go create mode 100644 server/service/system/sys_auto_code_mssql.go create mode 100644 server/service/system/sys_auto_code_mysql.go create mode 100644 server/service/system/sys_auto_code_oracle.go create mode 100644 server/service/system/sys_auto_code_pgsql.go create mode 100644 server/service/system/sys_auto_code_sqlite.go create mode 100644 server/service/system/sys_base_menu.go create mode 100644 server/service/system/sys_casbin.go create mode 100644 server/service/system/sys_dictionary.go create mode 100644 server/service/system/sys_dictionary_detail.go create mode 100644 server/service/system/sys_error.go create mode 100644 server/service/system/sys_export_template.go create mode 100644 server/service/system/sys_initdb.go create mode 100644 server/service/system/sys_initdb_mssql.go create mode 100644 server/service/system/sys_initdb_mysql.go create mode 100644 server/service/system/sys_initdb_pgsql.go create mode 100644 server/service/system/sys_initdb_sqlite.go create mode 100644 server/service/system/sys_login_log.go create mode 100644 server/service/system/sys_menu.go create mode 100644 server/service/system/sys_operation_record.go create mode 100644 server/service/system/sys_params.go create mode 100644 server/service/system/sys_skills.go create mode 100644 server/service/system/sys_system.go create mode 100644 server/service/system/sys_user.go create mode 100644 server/service/system/sys_version.go create mode 100644 server/source/example/file_upload_download.go create mode 100644 server/source/system/api.go create mode 100644 server/source/system/api_ignore.go create mode 100644 server/source/system/authorities_menus.go create mode 100644 server/source/system/authority.go create mode 100644 server/source/system/casbin.go create mode 100644 server/source/system/dictionary.go create mode 100644 server/source/system/dictionary_detail.go create mode 100644 server/source/system/excel_template.go create mode 100644 server/source/system/menu.go create mode 100644 server/source/system/user.go create mode 100644 server/task/clearTable.go create mode 100644 server/utils/ast/ast.go create mode 100644 server/utils/ast/ast_auto_enter.go create mode 100644 server/utils/ast/ast_enter.go create mode 100644 server/utils/ast/ast_gorm.go create mode 100644 server/utils/ast/ast_init_test.go create mode 100644 server/utils/ast/ast_rollback.go create mode 100644 server/utils/ast/ast_router.go create mode 100644 server/utils/ast/ast_test.go create mode 100644 server/utils/ast/ast_type.go create mode 100644 server/utils/ast/extract_func.go create mode 100644 server/utils/ast/import.go create mode 100644 server/utils/ast/interfaces.go create mode 100644 server/utils/ast/interfaces_base.go create mode 100644 server/utils/ast/package_enter.go create mode 100644 server/utils/ast/package_enter_test.go create mode 100644 server/utils/ast/package_initialize_gorm.go create mode 100644 server/utils/ast/package_initialize_gorm_test.go create mode 100644 server/utils/ast/package_initialize_router.go create mode 100644 server/utils/ast/package_initialize_router_test.go create mode 100644 server/utils/ast/package_module_enter.go create mode 100644 server/utils/ast/package_module_enter_test.go create mode 100644 server/utils/ast/plugin_enter.go create mode 100644 server/utils/ast/plugin_enter_test.go create mode 100644 server/utils/ast/plugin_gen.go create mode 100644 server/utils/ast/plugin_gen_test.go create mode 100644 server/utils/ast/plugin_initialize_gorm.go create mode 100644 server/utils/ast/plugin_initialize_gorm_test.go create mode 100644 server/utils/ast/plugin_initialize_router.go create mode 100644 server/utils/ast/plugin_initialize_router_test.go create mode 100644 server/utils/ast/plugin_initialize_v2.go create mode 100644 server/utils/ast/plugin_initialize_v2_test.go create mode 100644 server/utils/autocode/template_funcs.go create mode 100644 server/utils/breakpoint_continue.go create mode 100644 server/utils/captcha/redis.go create mode 100644 server/utils/casbin_util.go create mode 100644 server/utils/claims.go create mode 100644 server/utils/directory.go create mode 100644 server/utils/fmt_plus.go create mode 100644 server/utils/hash.go create mode 100644 server/utils/human_duration.go create mode 100644 server/utils/human_duration_test.go create mode 100644 server/utils/json.go create mode 100644 server/utils/json_test.go create mode 100644 server/utils/jwt.go create mode 100644 server/utils/plugin/plugin.go create mode 100644 server/utils/plugin/v2/plugin.go create mode 100644 server/utils/plugin/v2/registry.go create mode 100644 server/utils/request/http.go create mode 100644 server/utils/server.go create mode 100644 server/utils/stacktrace/stacktrace.go create mode 100644 server/utils/system_events.go create mode 100644 server/utils/timer/timed_task.go create mode 100644 server/utils/timer/timed_task_test.go create mode 100644 server/utils/validator.go create mode 100644 server/utils/validator_test.go create mode 100644 server/utils/verify.go create mode 100644 server/utils/zip.go create mode 100644 web-admin/.env.development create mode 100644 web-admin/.env.production create mode 100644 web-admin/.gitignore create mode 100644 web-admin/README.md create mode 100644 web-admin/docs/system-inventory.md create mode 100644 web-admin/eslint.config.js create mode 100644 web-admin/index.html create mode 100644 web-admin/package-lock.json create mode 100644 web-admin/package.json create mode 100644 web-admin/public/favicon.svg create mode 100644 web-admin/public/icons.svg create mode 100644 web-admin/src/App.tsx create mode 100644 web-admin/src/assets/hero.png create mode 100644 web-admin/src/assets/react.svg create mode 100644 web-admin/src/assets/vite.svg create mode 100644 web-admin/src/features/apis/ApiManagementPage.tsx create mode 100644 web-admin/src/features/auth/LoginPage.tsx create mode 100644 web-admin/src/features/dashboard/DashboardPage.tsx create mode 100644 web-admin/src/features/dictionaries/DictionaryManagementPage.tsx create mode 100644 web-admin/src/features/discovery/ModuleLandingPage.tsx create mode 100644 web-admin/src/features/discovery/systemInventory.ts create mode 100644 web-admin/src/features/errors/ErrorLogPage.tsx create mode 100644 web-admin/src/features/layout/AdminShell.tsx create mode 100644 web-admin/src/features/menus/MenuManagementPage.tsx create mode 100644 web-admin/src/features/params/ParamsManagementPage.tsx create mode 100644 web-admin/src/features/person/ProfilePage.tsx create mode 100644 web-admin/src/features/roles/RoleManagementPage.tsx create mode 100644 web-admin/src/features/server/ServerStatePage.tsx create mode 100644 web-admin/src/features/system/SystemConfigPage.tsx create mode 100644 web-admin/src/features/tokens/ApiTokenPage.tsx create mode 100644 web-admin/src/features/users/UserManagementPage.tsx create mode 100644 web-admin/src/index.css create mode 100644 web-admin/src/lib/api.ts create mode 100644 web-admin/src/lib/date.ts create mode 100644 web-admin/src/lib/http.ts create mode 100644 web-admin/src/lib/menu.ts create mode 100644 web-admin/src/lib/storage.ts create mode 100644 web-admin/src/lib/tree.ts create mode 100644 web-admin/src/main.tsx create mode 100644 web-admin/src/store/auth.ts create mode 100644 web-admin/src/types/system.ts create mode 100644 web-admin/tsconfig.app.json create mode 100644 web-admin/tsconfig.json create mode 100644 web-admin/tsconfig.node.json create mode 100644 web-admin/vite.config.ts create mode 100644 web/.docker-compose/nginx/conf.d/my.conf create mode 100644 web/.docker-compose/nginx/conf.d/nginx.conf create mode 100644 web/.dockerignore create mode 100644 web/.env.development create mode 100644 web/.env.production create mode 100644 web/.gitignore create mode 100644 web/.prettierrc create mode 100644 web/Dockerfile create mode 100644 web/README.md create mode 100644 web/babel.config.js create mode 100644 web/eslint.config.mjs create mode 100644 web/index.html create mode 100644 web/jsconfig.json create mode 100644 web/limit.js create mode 100644 web/openDocument.js create mode 100644 web/package.json create mode 100644 web/public/favicon.ico create mode 100644 web/public/logo.png create mode 100644 web/src/App.vue create mode 100644 web/src/api/api.js create mode 100644 web/src/api/attachmentCategory.js create mode 100644 web/src/api/authority.js create mode 100644 web/src/api/authorityBtn.js create mode 100644 web/src/api/autoCode.js create mode 100644 web/src/api/breakpoint.js create mode 100644 web/src/api/casbin.js create mode 100644 web/src/api/customer.js create mode 100644 web/src/api/email.js create mode 100644 web/src/api/exportTemplate.js create mode 100644 web/src/api/fileUploadAndDownload.js create mode 100644 web/src/api/github.js create mode 100644 web/src/api/initdb.js create mode 100644 web/src/api/jwt.js create mode 100644 web/src/api/menu.js create mode 100644 web/src/api/plugin/api.js create mode 100644 web/src/api/skills.js create mode 100644 web/src/api/sysApiToken.js create mode 100644 web/src/api/sysDictionary.js create mode 100644 web/src/api/sysDictionaryDetail.js create mode 100644 web/src/api/sysLoginLog.js create mode 100644 web/src/api/sysOperationRecord.js create mode 100644 web/src/api/sysParams.js create mode 100644 web/src/api/system.js create mode 100644 web/src/api/system/sysError.js create mode 100644 web/src/api/user.js create mode 100644 web/src/api/version.js create mode 100644 web/src/assets/404.png create mode 100644 web/src/assets/background.svg create mode 100644 web/src/assets/banner.jpg create mode 100644 web/src/assets/banner2.jpg create mode 100644 web/src/assets/dashboard.png create mode 100644 web/src/assets/docs.png create mode 100644 web/src/assets/flipped-aurora.png create mode 100644 web/src/assets/github.png create mode 100644 web/src/assets/icons/ai-gva.svg create mode 100644 web/src/assets/icons/close.svg create mode 100644 web/src/assets/icons/customer-gva.svg create mode 100644 web/src/assets/icons/idea.svg create mode 100644 web/src/assets/icons/lock.svg create mode 100644 web/src/assets/icons/server.svg create mode 100644 web/src/assets/icons/warn.svg create mode 100644 web/src/assets/kefu.png create mode 100644 web/src/assets/login_background.jpg create mode 100644 web/src/assets/login_background.svg create mode 100644 web/src/assets/login_left.svg create mode 100644 web/src/assets/login_right_banner.jpg create mode 100644 web/src/assets/logo.jpg create mode 100644 web/src/assets/logo.png create mode 100644 web/src/assets/logo_login.png create mode 100644 web/src/assets/nav_logo.png create mode 100644 web/src/assets/noBody.png create mode 100644 web/src/assets/notFound.png create mode 100644 web/src/assets/qm.png create mode 100644 web/src/assets/video.png create mode 100644 web/src/components/application/index.vue create mode 100644 web/src/components/arrayCtrl/arrayCtrl.vue create mode 100644 web/src/components/bottomInfo/bottomInfo.vue create mode 100644 web/src/components/charts/index.vue create mode 100644 web/src/components/commandMenu/index.vue create mode 100644 web/src/components/customPic/index.vue create mode 100644 web/src/components/errorPreview/index.vue create mode 100644 web/src/components/exportExcel/exportExcel.vue create mode 100644 web/src/components/exportExcel/exportTemplate.vue create mode 100644 web/src/components/exportExcel/importExcel.vue create mode 100644 web/src/components/logo/index.vue create mode 100644 web/src/components/office/docx.vue create mode 100644 web/src/components/office/excel.vue create mode 100644 web/src/components/office/index.vue create mode 100644 web/src/components/office/pdf.vue create mode 100644 web/src/components/richtext/rich-edit.vue create mode 100644 web/src/components/richtext/rich-view.vue create mode 100644 web/src/components/selectFile/selectFile.vue create mode 100644 web/src/components/selectImage/selectComponent.vue create mode 100644 web/src/components/selectImage/selectImage.vue create mode 100644 web/src/components/svgIcon/svgIcon.vue create mode 100644 web/src/components/warningBar/warningBar.vue create mode 100644 web/src/core/config.js create mode 100644 web/src/core/error-handel.js create mode 100644 web/src/core/gin-vue-admin.js create mode 100644 web/src/core/global.js create mode 100644 web/src/directive/auth.js create mode 100644 web/src/directive/clickOutSide.js create mode 100644 web/src/hooks/charts.js create mode 100644 web/src/hooks/responsive.js create mode 100644 web/src/hooks/use-windows-resize.js create mode 100644 web/src/main.js create mode 100644 web/src/pathInfo.json create mode 100644 web/src/permission.js create mode 100644 web/src/pinia/index.js create mode 100644 web/src/pinia/modules/app.js create mode 100644 web/src/pinia/modules/dictionary.js create mode 100644 web/src/pinia/modules/params.js create mode 100644 web/src/pinia/modules/router.js create mode 100644 web/src/pinia/modules/user.js create mode 100644 web/src/plugin/announcement/api/info.js create mode 100644 web/src/plugin/announcement/form/info.vue create mode 100644 web/src/plugin/announcement/view/info.vue create mode 100644 web/src/plugin/email/api/email.js create mode 100644 web/src/plugin/email/view/index.vue create mode 100644 web/src/router/index.js create mode 100644 web/src/style/element/index.scss create mode 100644 web/src/style/element_visiable.scss create mode 100644 web/src/style/iconfont.css create mode 100644 web/src/style/main.scss create mode 100644 web/src/style/reset.scss create mode 100644 web/src/style/transition.scss create mode 100644 web/src/utils/asyncRouter.js create mode 100644 web/src/utils/btnAuth.js create mode 100644 web/src/utils/bus.js create mode 100644 web/src/utils/closeThisPage.js create mode 100644 web/src/utils/date.js create mode 100644 web/src/utils/dictionary.js create mode 100644 web/src/utils/doc.js create mode 100644 web/src/utils/downloadImg.js create mode 100644 web/src/utils/env.js create mode 100644 web/src/utils/event.js create mode 100644 web/src/utils/fmtRouterTitle.js create mode 100644 web/src/utils/format.js create mode 100644 web/src/utils/image.js create mode 100644 web/src/utils/page.js create mode 100644 web/src/utils/params.js create mode 100644 web/src/utils/request.js create mode 100644 web/src/utils/stringFun.js create mode 100644 web/src/view/about/index.vue create mode 100644 web/src/view/dashboard/components/banner.vue create mode 100644 web/src/view/dashboard/components/card.vue create mode 100644 web/src/view/dashboard/components/charts-content-numbers.vue create mode 100644 web/src/view/dashboard/components/charts-people-numbers.vue create mode 100644 web/src/view/dashboard/components/charts.vue create mode 100644 web/src/view/dashboard/components/index.js create mode 100644 web/src/view/dashboard/components/notice.vue create mode 100644 web/src/view/dashboard/components/pluginTable.vue create mode 100644 web/src/view/dashboard/components/quickLinks.vue create mode 100644 web/src/view/dashboard/components/table.vue create mode 100644 web/src/view/dashboard/components/wiki.vue create mode 100644 web/src/view/dashboard/index.vue create mode 100644 web/src/view/error/index.vue create mode 100644 web/src/view/error/reload.vue create mode 100644 web/src/view/example/breakpoint/breakpoint.vue create mode 100644 web/src/view/example/customer/customer.vue create mode 100644 web/src/view/example/index.vue create mode 100644 web/src/view/init/index.vue create mode 100644 web/src/view/layout/aside/asideComponent/asyncSubmenu.vue create mode 100644 web/src/view/layout/aside/asideComponent/index.vue create mode 100644 web/src/view/layout/aside/asideComponent/menuItem.vue create mode 100644 web/src/view/layout/aside/combinationMode.vue create mode 100644 web/src/view/layout/aside/headMode.vue create mode 100644 web/src/view/layout/aside/index.vue create mode 100644 web/src/view/layout/aside/normalMode.vue create mode 100644 web/src/view/layout/aside/sidebarMode.vue create mode 100644 web/src/view/layout/header/index.vue create mode 100644 web/src/view/layout/header/tools.vue create mode 100644 web/src/view/layout/iframe.vue create mode 100644 web/src/view/layout/index.vue create mode 100644 web/src/view/layout/screenfull/index.vue create mode 100644 web/src/view/layout/search/search.vue create mode 100644 web/src/view/layout/setting/components/layoutModeCard.vue create mode 100644 web/src/view/layout/setting/components/settingItem.vue create mode 100644 web/src/view/layout/setting/components/themeColorPicker.vue create mode 100644 web/src/view/layout/setting/components/themeModeSelector.vue create mode 100644 web/src/view/layout/setting/index.vue create mode 100644 web/src/view/layout/setting/modules/appearance/index.vue create mode 100644 web/src/view/layout/setting/modules/general/index.vue create mode 100644 web/src/view/layout/setting/modules/layout/index.vue create mode 100644 web/src/view/layout/tabs/index.vue create mode 100644 web/src/view/login/index.vue create mode 100644 web/src/view/person/person.vue create mode 100644 web/src/view/routerHolder.vue create mode 100644 web/src/view/superAdmin/api/api.vue create mode 100644 web/src/view/superAdmin/authority/authority.vue create mode 100644 web/src/view/superAdmin/authority/components/apis.vue create mode 100644 web/src/view/superAdmin/authority/components/datas.vue create mode 100644 web/src/view/superAdmin/authority/components/menus.vue create mode 100644 web/src/view/superAdmin/dictionary/sysDictionary.vue create mode 100644 web/src/view/superAdmin/dictionary/sysDictionaryDetail.vue create mode 100644 web/src/view/superAdmin/index.vue create mode 100644 web/src/view/superAdmin/menu/components/components-cascader.vue create mode 100644 web/src/view/superAdmin/menu/icon.vue create mode 100644 web/src/view/superAdmin/menu/menu.vue create mode 100644 web/src/view/superAdmin/operation/sysOperationRecord.vue create mode 100644 web/src/view/superAdmin/params/sysParams.vue create mode 100644 web/src/view/superAdmin/user/user.vue create mode 100644 web/src/view/system/state.vue create mode 100644 web/src/view/systemTools/aiWrokflow/index.vue create mode 100644 web/src/view/systemTools/apiToken/index.vue create mode 100644 web/src/view/systemTools/autoCode/component/fieldDialog.vue create mode 100644 web/src/view/systemTools/autoCode/component/previewCodeDialog.vue create mode 100644 web/src/view/systemTools/autoCode/index.vue create mode 100644 web/src/view/systemTools/autoCode/mcp.vue create mode 100644 web/src/view/systemTools/autoCode/mcpTest.vue create mode 100644 web/src/view/systemTools/autoCode/picture.vue create mode 100644 web/src/view/systemTools/autoCodeAdmin/index.vue create mode 100644 web/src/view/systemTools/autoPkg/autoPkg.vue create mode 100644 web/src/view/systemTools/exportTemplate/code.js create mode 100644 web/src/view/systemTools/exportTemplate/exportTemplate.vue create mode 100644 web/src/view/systemTools/formCreate/index.vue create mode 100644 web/src/view/systemTools/index.vue create mode 100644 web/src/view/systemTools/installPlugin/index.vue create mode 100644 web/src/view/systemTools/loginLog/index.vue create mode 100644 web/src/view/systemTools/pubPlug/pubPlug.vue create mode 100644 web/src/view/systemTools/skills/index.vue create mode 100644 web/src/view/systemTools/sysError/sysError.vue create mode 100644 web/src/view/systemTools/system/system.vue create mode 100644 web/src/view/systemTools/version/version.vue create mode 100644 web/uno.config.js create mode 100644 web/vite.config.js create mode 100644 web/vitePlugin/componentName/index.js create mode 100644 web/vitePlugin/secret/index.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..613bcd4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,80 @@ +# ---> Go +# If you prefer the allow list template instead of the deny list, see community template: +# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore +# +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +# vendor/ + +# Go workspace file +go.work +go.work.sum + +# env file +.env + +# ---> Vue +# gitignore template for Vue.js projects +# +# Recommended template: Node.gitignore + +# TODO: where does this rule come from? +docs/_book + +# TODO: where does this rule come from? +test/ + +# ---> macOS +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk +.idea + +# ---> Server Files +logs +log +uploads +upload +server/config.yaml + +# ---> AI +.claude +.codex +.cursor +.gpt diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..9135c9a --- /dev/null +++ b/Makefile @@ -0,0 +1,75 @@ +SHELL = /bin/bash + +#SCRIPT_DIR = $(shell pwd)/etc/script +#请选择golang版本 +BUILD_IMAGE_SERVER = golang:1.22 +#请选择node版本 +BUILD_IMAGE_WEB = node:20 +#项目名称 +PROJECT_NAME = github.com/flipped-aurora/gin-vue-admin/server +#配置文件目录 +CONFIG_FILE = config.yaml +#镜像仓库命名空间 +IMAGE_NAME = gva +#镜像地址 +REPOSITORY = registry.cn-hangzhou.aliyuncs.com/${IMAGE_NAME} +#镜像版本 +TAGS_OPT ?= latest +PLUGIN ?= email + +#容器环境前后端共同打包 +build: build-web build-server + docker run --name build-local --rm -v $(shell pwd):/go/src/${PROJECT_NAME} -w /go/src/${PROJECT_NAME} ${BUILD_IMAGE_SERVER} make build-local + +#容器环境打包前端 +build-web: + docker run --name build-web-local --rm -v $(shell pwd):/go/src/${PROJECT_NAME} -w /go/src/${PROJECT_NAME} ${BUILD_IMAGE_WEB} make build-web-local + +#容器环境打包后端 +build-server: + docker run --name build-server-local --rm -v $(shell pwd):/go/src/${PROJECT_NAME} -w /go/src/${PROJECT_NAME} ${BUILD_IMAGE_SERVER} make build-server-local + +#构建web镜像 +build-image-web: + @cd web/ && docker build -t ${REPOSITORY}/web:${TAGS_OPT} . + +#构建server镜像 +build-image-server: + @cd server/ && docker build -t ${REPOSITORY}/server:${TAGS_OPT} . + +#本地环境打包前后端 +build-local: + if [ -d "build" ];then rm -rf build; else echo "OK!"; fi \ + && if [ -f "/.dockerenv" ];then echo "OK!"; else make build-web-local && make build-server-local; fi \ + && mkdir build && cp -r web/dist build/ && cp server/server build/ && cp -r server/resource build/resource + +#本地环境打包前端 +build-web-local: + @cd web/ && if [ -d "dist" ];then rm -rf dist; else echo "OK!"; fi \ + && yarn config set registry http://mirrors.cloud.tencent.com/npm/ && yarn install && yarn build + +#本地环境打包后端 +build-server-local: + @cd server/ && if [ -f "server" ];then rm -rf server; else echo "OK!"; fi \ + && go env -w GO111MODULE=on && go env -w GOPROXY=https://goproxy.cn,direct \ + && go env -w CGO_ENABLED=0 && go env && go mod tidy \ + && go build -ldflags "-B 0x$(shell head -c20 /dev/urandom|od -An -tx1|tr -d ' \n') -X main.Version=${TAGS_OPT}" -v + +#打包前后端二合一镜像 +image: build + docker build -t ${REPOSITORY}/gin-vue-admin:${TAGS_OPT} -f deploy/docker/Dockerfile . + +#尝鲜版 +images: build build-image-web build-image-server + docker build -t ${REPOSITORY}/all:${TAGS_OPT} -f deploy/docker/Dockerfile . + +#swagger 文档生成 +doc: + @cd server && swag init + +#插件快捷打包: make plugin PLUGIN="这里是插件文件夹名称,默认为email" +plugin: + if [ -d ".plugin" ];then rm -rf .plugin ; else echo "OK!"; fi && mkdir -p .plugin/${PLUGIN}/{server/plugin,web/plugin} \ + && if [ -d "server/plugin/${PLUGIN}" ];then cp -r server/plugin/${PLUGIN} .plugin/${PLUGIN}/server/plugin/ ; else echo "OK!"; fi \ + && if [ -d "web/src/plugin/${PLUGIN}" ];then cp -r web/src/plugin/${PLUGIN} .plugin/${PLUGIN}/web/plugin/ ; else echo "OK!"; fi \ + && cd .plugin && zip -r ${PLUGIN}.zip ${PLUGIN} && mv ${PLUGIN}.zip ../ && cd .. diff --git a/README.md b/README.md new file mode 100644 index 0000000..cfae15a --- /dev/null +++ b/README.md @@ -0,0 +1,389 @@ + +
+|
+
+ 📄 创建基础模板 +🤖 AI生成结构 +⏰ 生成代码 +🏷️ 分配权限 +🎉 基础CURD生成完成 + |
+ + + | +
+
+
+
+## 1. 基本介绍
+
+### 1.1 项目介绍
+
+> Gin-vue-admin是一个基于 [vue](https://vuejs.org) 和 [gin](https://gin-gonic.com) 开发的全栈前后端分离的开发基础平台,集成jwt鉴权,动态路由,动态菜单,casbin鉴权,表单生成器,代码生成器等功能,提供多种示例文件,让您把更多时间专注在业务开发上。
+
+[在线预览](http://demo.gin-vue-admin.com): http://demo.gin-vue-admin.com
+
+测试用户名:admin
+
+测试密码:123456
+
+### 1.2 贡献指南
+Hi! 首先感谢你使用 gin-vue-admin。
+
+Gin-vue-admin 是一套为快速研发准备的一整套前后端分离架构式的开源框架,旨在快速搭建中小型项目。
+
+Gin-vue-admin 的成长离不开大家的支持,如果你愿意为 gin-vue-admin 贡献代码或提供建议,请阅读以下内容。
+
+#### 1.2.1 Issue 规范
+- issue 仅用于提交 Bug 或 Feature 以及设计相关的内容,其它内容可能会被直接关闭。
+
+- 在提交 issue 之前,请搜索相关内容是否已被提出。
+
+#### 1.2.2 Pull Request 规范
+- 请先 fork 一份到自己的项目下,不要直接在仓库下建分支。
+
+- commit 信息要以`[文件名]: 描述信息` 的形式填写,例如 `README.md: fix xxx bug`。
+
+- 如果是修复 bug,请在 PR 中给出描述信息。
+
+- 合并代码需要两名维护人员参与:一人进行 review 后 approve,另一人再次 review,通过后即可合并。
+
+## 2. 使用说明
+
+```
+- node版本 > v18.16.0
+- golang版本 >= v1.22
+- IDE推荐:Goland
+```
+
+### 2.1 server项目
+
+使用 `Goland` 等编辑工具,打开server目录,不可以打开 gin-vue-admin 根目录
+
+```bash
+
+# 克隆项目
+git clone https://github.com/flipped-aurora/gin-vue-admin.git
+# 进入server文件夹
+cd server
+
+# 使用 go mod 并安装go依赖包
+go generate
+
+# 运行
+go run .
+
+```
+
+### 2.2 web项目
+
+```bash
+# 进入web文件夹
+cd web
+
+# 安装依赖
+npm install
+
+# 启动web项目
+npm run serve
+```
+
+### 2.3 swagger自动化API文档
+
+#### 2.3.1 安装 swagger
+
+``` shell
+go install github.com/swaggo/swag/cmd/swag@latest
+```
+
+#### 2.3.2 生成API文档
+
+```` shell
+cd server
+swag init
+````
+
+> 执行上面的命令后,server目录下会出现docs文件夹里的 `docs.go`, `swagger.json`, `swagger.yaml` 三个文件更新,启动go服务之后, 在浏览器输入 [http://localhost:8888/swagger/index.html](http://localhost:8888/swagger/index.html) 即可查看swagger文档
+
+### 2.4 VSCode工作区
+
+#### 2.4.1 开发
+
+使用`VSCode`打开根目录下的工作区文件`gin-vue-admin.code-workspace`,在边栏可以看到三个虚拟目录:`backend`、`frontend`、`root`。
+
+#### 2.4.2 运行/调试
+
+在运行和调试中也可以看到三个task:`Backend`、`Frontend`、`Both (Backend & Frontend)`。运行`Both (Backend & Frontend)`可以同时启动前后端项目。
+
+#### 2.4.3 settings
+
+在工作区配置文件中有`go.toolsEnvVars`字段,是用于`VSCode`自身的go工具环境变量。此外在多go版本的系统中,可以通过`gopath`、`go.goroot`指定运行版本。
+
+```json
+ "go.gopath": null,
+ "go.goroot": null,
+```
+
+## 3. 技术选型
+
+- 前端:用基于 [Vue](https://vuejs.org) 的 [Element](https://github.com/ElemeFE/element) 构建基础页面。
+- 后端:用 [Gin](https://gin-gonic.com/) 快速搭建基础restful风格API,[Gin](https://gin-gonic.com/) 是一个go语言编写的Web框架。
+- 数据库:采用`MySql` > (5.7) 版本 数据库引擎 InnoDB,使用 [gorm](http://gorm.cn) 实现对数据库的基本操作。
+- 缓存:使用`Redis`实现记录当前活跃用户的`jwt`令牌并实现多点登录限制。
+- API文档:使用`Swagger`构建自动化文档。
+- 配置文件:使用 [fsnotify](https://github.com/fsnotify/fsnotify) 和 [viper](https://github.com/spf13/viper) 实现`yaml`格式的配置文件。
+- 日志:使用 [zap](https://github.com/uber-go/zap) 实现日志记录。
+
+## 4. 项目架构
+
+### 4.1 系统架构图
+
+
+
+### 4.2 前端详细设计图 (提供者:baobeisuper)
+
+
+
+### 4.3 目录结构
+
+```
+ ├── server
+ ├── api (api层)
+ │ └── v1 (v1版本接口)
+ ├── config (配置包)
+ ├── core (核心文件)
+ ├── docs (swagger文档目录)
+ ├── global (全局对象)
+ ├── initialize (初始化)
+ │ └── internal (初始化内部函数)
+ ├── middleware (中间件层)
+ ├── model (模型层)
+ │ ├── request (入参结构体)
+ │ └── response (出参结构体)
+ ├── packfile (静态文件打包)
+ ├── resource (静态资源文件夹)
+ │ ├── excel (excel导入导出默认路径)
+ │ ├── page (表单生成器)
+ │ └── template (模板)
+ ├── router (路由层)
+ ├── service (service层)
+ ├── source (source层)
+ └── utils (工具包)
+ ├── timer (定时器接口封装)
+ └── upload (oss接口封装)
+
+ web
+ ├── babel.config.js
+ ├── Dockerfile
+ ├── favicon.ico
+ ├── index.html -- 主页面
+ ├── limit.js -- 助手代码
+ ├── package.json -- 包管理器代码
+ ├── src -- 源代码
+ │ ├── api -- api 组
+ │ ├── App.vue -- 主页面
+ │ ├── assets -- 静态资源
+ │ ├── components -- 全局组件
+ │ ├── core -- gva 组件包
+ │ │ ├── config.js -- gva网站配置文件
+ │ │ ├── gin-vue-admin.js -- 注册欢迎文件
+ │ │ └── global.js -- 统一导入文件
+ │ ├── directive -- v-auth 注册文件
+ │ ├── main.js -- 主文件
+ │ ├── permission.js -- 路由中间件
+ │ ├── pinia -- pinia 状态管理器,取代vuex
+ │ │ ├── index.js -- 入口文件
+ │ │ └── modules -- modules
+ │ │ ├── dictionary.js
+ │ │ ├── router.js
+ │ │ └── user.js
+ │ ├── router -- 路由声明文件
+ │ │ └── index.js
+ │ ├── style -- 全局样式
+ │ │ ├── base.scss
+ │ │ ├── basics.scss
+ │ │ ├── element_visiable.scss -- 此处可以全局覆盖 element-plus 样式
+ │ │ ├── iconfont.css -- 顶部几个icon的样式文件
+ │ │ ├── main.scss
+ │ │ ├── mobile.scss
+ │ │ └── newLogin.scss
+ │ ├── utils -- 方法包库
+ │ │ ├── asyncRouter.js -- 动态路由相关
+ │ │ ├── btnAuth.js -- 动态权限按钮相关
+ │ │ ├── bus.js -- 全局mitt声明文件
+ │ │ ├── date.js -- 日期相关
+ │ │ ├── dictionary.js -- 获取字典方法
+ │ │ ├── downloadImg.js -- 下载图片方法
+ │ │ ├── format.js -- 格式整理相关
+ │ │ ├── image.js -- 图片相关方法
+ │ │ ├── page.js -- 设置页面标题
+ │ │ ├── request.js -- 请求
+ │ │ └── stringFun.js -- 字符串文件
+ | ├── view -- 主要view代码
+ | | ├── about -- 关于我们
+ | | ├── dashboard -- 面板
+ | | ├── error -- 错误
+ | | ├── example --上传案例
+ | | ├── iconList -- icon列表
+ | | ├── init -- 初始化数据
+ | | | ├── index -- 新版本
+ | | | ├── init -- 旧版本
+ | | ├── layout -- layout约束页面
+ | | | ├── aside
+ | | | ├── bottomInfo -- bottomInfo
+ | | | ├── screenfull -- 全屏设置
+ | | | ├── setting -- 系统设置
+ | | | └── index.vue -- base 约束
+ | | ├── login --登录
+ | | ├── person --个人中心
+ | | ├── superAdmin -- 超级管理员操作
+ | | ├── system -- 系统检测页面
+ | | ├── systemTools -- 系统配置相关页面
+ | | └── routerHolder.vue -- page 入口页面
+ ├── vite.config.js -- vite 配置文件
+ └── yarn.lock
+
+```
+
+## 5. 主要功能
+
+- 权限管理:基于`jwt`和`casbin`实现的权限管理。
+- 文件上传下载:实现基于`七牛云`, `阿里云`, `腾讯云` 的文件上传操作(请开发自己去各个平台的申请对应 `token` 或者对应`key`)。
+- 分页封装:前端使用 `mixins` 封装分页,分页方法调用 `mixins` 即可。
+- 用户管理:系统管理员分配用户角色和角色权限。
+- 角色管理:创建权限控制的主要对象,可以给角色分配不同api权限和菜单权限。
+- 菜单管理:实现用户动态菜单配置,实现不同角色不同菜单。
+- api管理:不同用户可调用的api接口的权限不同。
+- 配置管理:配置文件可前台修改(在线体验站点不开放此功能)。
+- 条件搜索:增加条件搜索示例。
+- restful示例:可以参考用户管理模块中的示例API。
+ - 前端文件参考: [web/src/view/superAdmin/api/api.vue](https://github.com/flipped-aurora/gin-vue-admin/blob/master/web/src/view/superAdmin/api/api.vue)
+ - 后台文件参考: [server/router/sys_api.go](https://github.com/flipped-aurora/gin-vue-admin/blob/master/server/router/sys_api.go)
+- 多点登录限制:需要在`config.yaml`中把`system`中的`use-multipoint`修改为true(需要自行配置Redis和Config中的Redis参数,测试阶段,有bug请及时反馈)。
+- 分片上传:提供文件分片上传和大文件分片上传功能示例。
+- 表单生成器:表单生成器借助 [@Variant Form](https://github.com/vform666/variant-form) 。
+- 代码生成器:后台基础逻辑以及简单curd的代码生成器。
+
+## 6. 知识库
+
+## 6.1 团队博客
+
+> https://www.yuque.com/flipped-aurora
+>
+>内有前端框架教学视频。如果觉得项目对您有所帮助可以添加我的个人微信:shouzi_1994,欢迎您提出宝贵的需求。
+
+## 6.2 教学视频
+
+(1)手把手教学视频
+
+> https://www.bilibili.com/video/BV1Rg411u7xH/
+
+(2)后端目录结构调整介绍以及使用方法
+
+> https://www.bilibili.com/video/BV1x44y117TT/
+
+(3)golang基础教学视频
+
+> bilibili:https://space.bilibili.com/322210472/channel/detail?cid=108884
+
+(4)gin框架基础教学
+
+> bilibili:https://space.bilibili.com/322210472/channel/detail?cid=126418&ctype=0
+
+(5)gin-vue-admin 版本更新介绍视频
+
+> bilibili:https://www.bilibili.com/video/BV1kv4y1g7nT
+
+## 7. 联系方式
+
+### 7.1 技术群
+
+### QQ交流群:971857775
+
+### 微信交流群
+| 微信 |
+| :---: |
+|
+
+防止广告进群,添加微信,输入以下代码执行结果(请勿转码为string)
+
+```
+str := "5Yqg5YWlR1ZB5Lqk5rWB576k"
+decodeBytes, err := base64.StdEncoding.DecodeString(str)
+fmt.Println(decodeBytes, err)
+```
+
+### [关于我们](https://www.gin-vue-admin.com/about/join.html)
+
+## 8. 贡献者
+
+感谢您对gin-vue-admin的贡献!
+
+
+ -RcEwi5|z&@u)$rKHvgs#0vy&i`9sSK#gvzRiGhSfCM6u!Kl?J>2R_Y4ktJv zW<3Qjf(3C@L;xnxV#xst)F7~%gaki>32`{328rJ0>I;sMPVnvsL!BS}=c*~v9I*gmip7m?*wdfYmR3OI;NjCPt4 z1h)o_1Pg;$9cY~sL$z5bMxi%gQ7TDPgHJ3)A_RC63L<3C=~5DrW(=bJDyQ73Mk7Lo zU<=qS3MC8dBh> @ccLZQ4cmr9|wi{VrUl`jg)EEEEo53%zZ z9F-;zG*BgO8QTe(z%UMzznq;fY$ zY%xR7cnE}tX1c6Fqz)}J$iU(tD2Q0B#506MU&s!@pF 7?>U> zi>PoYIAowh3D#kk>Y#R)&8o4OR8q7A?G=)pHX%za68NPe6q+ShIrI`H6sfVYOn9c2 zs dyIJUv{?S2?$?cY-F_@rNLMM8eO07}F(<)u|fC?MX!qk2d2fWCP zlZd1ywM|5ZE38^n$hovIuMcJoq99&^*KZ{VLZIyS5sZ47jAI6tV0EipYK)046-xa` zpdY&1ijXtlbU4%MX8OrkyhWi?OPow4%1M_wEL4RJ0`)q)PN_(2kXZ#R2gd7xvCRya z0!m^-;cl$c7Ni(8Qn%Eq)*7XDuH4}>2^|;~IY5P|Q~`_(%}}T~M3z+sG0PQBs+`Ou zc^MowL4$x{AwE7 K1g-W$U0GB{HQi8)SCaB$H zg&iufa@7jGl`9OQ$X<;K#v;iuo`4t#Z^Y4T0yK@T35q#dyb;f(L*!0`-zDOp{Zc)W z0|9-495x+1<6t2$g~f-FGxR}!5aaT*=m?G+E+_NJ2wH#)vrAYwJs=-s2MeR)xa@YQ zLc O{+nvJYhNK^=k4-DfHGzPYcjP^RX1TSADV>*;7 zB?iF}!(=9{LIQd)h%N=$D efRyr21l9`Y?yaMhP2f;ug z9LlC*acZ@NDMl)V0<{4G_aUHeA{FcMgV7Kb4qRbaK=tq>CRZY5Bb`1LS0kd5+*&72 zrlzCuT(_Mi51|bm;TDH1-h&MVG?yJi;Tk1U23}zIQs{iBjqgN(*~ln@7weZYtSEvR z2Q`?iN|9fK;{mH<>q35I<3PCtI#o;X@UU(U-R-1l$rgegMX*B5YN$!4^l$|*mVwX4 zQDkt9$v`$Zpgsf33`dZdBtHZL7=?frRG<`Gs)u2>; N@|+Z1%HUBy?z-F6q1 z0caaAYnnGev)WK9D2|~94J3r$X5(3uem2L(5VPoT5(Dl*i=1|+KmrT7irM9K%R;IL zYhbzpE~D8mw7Lae6-^=!hynY@1!*J*6lo;V-FT XkKV)9h5{ fOb3)O+Ly3`DTPONsoDKMlYD0TA! zd@)PtG^+)22H@C!ACrxiLs34w-LE$ilx8l|41%gk=0|E(I4jg6l>a=Je09y z1P;f5rZG_h2NY=t4J4W2N*fh}75QNrHB0RfyWC *uGwW% zx_M@WKtkZK)P5=kXAVL h3gN`+PLQ?l4lKaNNY8cb%Nkcr|6 zgz%t6FO^w>cr9LKRY?3O8WjP-!C7RLOccUsl#NK@XxI=J#^OiWu}Yy%DI?PDSSCrT zuoDz?DIBI}yI4p)mq%0k(0-554{+LRma$xXADm9$BK$};2u&)UPDy1E z65#4^EXx@39UGNzV_-!T6hnhG61*rl7iVV*l{QlVY2vt ^p&&LsUCEQX 5&;abg3XfCFfwBP+2^kjfLm8vHu1md4O>*<_;A?RKHr6f)DGC-O1E0MTmY(OrHn zzz?zpsWg)$OofSP^x%UA70O1%+w}~tjHy+~jUX0L?0zc`EjH*REE5Zbw_{YuP~d=v z)B^Vks9+u7n@q KHr5k%L#Uyn1iQ#3>p(xOs5JRB#sWn^}0=XqK-g!2uv(D zi2;=<=^BVbi(~NAOaqDuQ8HjqogD3y=}a;o$3#>!lrk^Yg`
3f{{#xV5w3JR_-@4Ohz(G&X*W;!BDnMwi#(mi_(Z>kqI_h zkRbQc=m9og!+>!e0g^<`V)KkRh8Hh!1I }XT$!KYqz4@eKiTNvqgYn00H}; !SnTAliTEil1U_%OOAvGB}%mtug6Ov1Pv2U5m2BCnOw?&JH#3@1})KX zR3a^k&h@$2SY#*^%8YcCPUweQIlLep?{^CoS`!vQH~Q&zj#;3k%TWd`3PMCPXciU5 zB`|PNeBh8GgMsI;S%8y}wLUkA;G=n18VJ&4Ve+&{1BXPg1;j+TgFy=QV91pcBUOOo zVvRwTS80%n$QX;<>%*aKOoYeglv8bHI!ntFD%hY}#BynfY@Oa~P(n;Nn}?5M0WwPR zI|bIz_VJnEVkYRcTBM$Yv~f_PfKg}Au%sd)T8BX@hz669WHm6kOdg*P4~l|R8;NUh z1!-EUo9q{f0TSp<+K}cgEO61m2n4iPYt+!JNGeie7b5&9p@?oZ2Pi}|#LDsj?c=>7 zG{qpN2xK6;@JL~Nwbf0c+cjn_OMs+col2coN3k+JdLqH8;HXJ>3g64piAhu$Qt1#F z #NcI&Nv3mncsD>(`^(yf$2AWkBOq` Chfr3?<*?e(Hn z^kAr9=H;;+9u~&$aRuNsL{R2KTMQ%=C{uYnQ~`$R(!+#7Dp!F*k|1J`oUzSH2G^$r zFlbQ1ZFq%8>eu)^8W5@sPL3oXf(hUOzg|bsh%r<-%3{^H_#SjXWB1Y|B$ZTy(wUqZ zm|p3mDfCdN1OkW?-i;T*83bnlZid1TKBxmhfOz2S5FjW6EE~+}F=~)9l@hDghIZ8( zsw|*G>U6u|6fKO33*F#-p+wusqywgpxAKi1j@-lzh{#+I9AxM!AD%~cN$pU!4QFSO z6fg`Wi1VuXDt8Fr0MxT3PA )5r%@(y4D2q%dx ^IzoZ6ll4p{(ZJ 0($&WMp^)jYgLq?&3atnur@*@2rI}!^w2@x8v)9 PJEi#Wmp`y8k28dYUL^GrYD~f65gkA{#=m_ADc!kvzQYs^~ zAwpSDswIc=H42pqD!NJs&8MJA@CX6aD~A&Z5`u?m=6Q&KoRAeZB%L7CP@q9|&}*WT z(OkSm&UX{&ey=Wsl;F>Y1bm)sl@T#g3X*77dk}W1pTnk^1rCD5K{8^M7?8d3I6{M* zEtBeSW(fyw;SfbekPoR%9-P+cgoq%vfQrcF>%>X}%&HZWy&>?|BB%%^lw=e0h#>;! zF(?CgF$yB`;K^vXQX$s!fJhcVdGRoa$_@t!AIPooUMQM{LTW5Q0H!RwKqb+b)C4$= zfOWX=TANtylh8r(N49~kcrn+jprie06<6lwYj`{qQOtBnM0|r+k4JhvP=pd9a*2ah z3x>tk@Tf{Yf}#$EE{KinH-kWrQeznqi3PM6l?smB@AYZnFf)f23Jq`!0_LHyA$%ox z8;k7}D?$erpoR#xkmy4yLS92LP|+xAP^xrFcpeM}q|9D}+X3~6g>XHL WLmh8HVHwNKw_1^K#3=)v6@v#E856ZX@zzuOdp^U zxn{pcuE6RzOcdK>rqDeyBpYKFJ1s&O4Xr|>8Dc-hi (v*iibO4QZs-KGL380!rVxW3w)P>2SKsTC^Z6j!f>tBP=}Bjkl@pcfkOe|Ak#wI z;|k~*4w#niwfVSosRtz$>)Zgi>{_V;u43Y`8ZL^dGhppdrWCGGu|pdL({UNJAQc|e zn8Aq;o)4FzgAxZ)0uEF}PN>9W@R%hIxX3}FGo%8vSR!YV%@jvRmBJ}vf_M8wYOYA2 zG-60-bHM1v5j|WHg-(QkBtoHMVX$z#RpJ+5)dHW`1`17h6a{NjGof&dQpv;1`Szfm zXK{!XULTjI^+KTvvkY)}h1x6%SomJH2jS((Z7z<@>zBJ(60}VK6Vn+cl9J9KiyUme z!Yrim6;P1_$zjSJR#3X)Dx6rKQb7i&Z#5W|2%Mc~_oB5<0Tb%PdUR5y5Jop@FfOgk z1rv#B7{63Qv%t{^y$>R=a=8dEsG@>p;-LW**KC(Ek!maw@3h$wcBR=s5!jIo6wTn* zYEfRE5J5nrj1IEWM}t%Gp%WAeTj+5yg-$We5- ~*xbZ-xT7!~Hg{$#!8O8=@`yFhU z%E 2yXbBOP6GGCFj~7y!VL|ivcSw_3?3W~g3o`?2RjZ6!Tmo+uy7JB zan_P9T_U^Ch&Z8tZhcj+t)e^mt*?5e_9v{1VXZ(M>oNi{Xt{rA{t7%|s!_Q-Rj))} z9=du2WAM<5{N>RTf0J^*3oFRDmoQ|)*n5L&ShZ)*o`sz2+pX#OLR7ML2mC_`_W89b zg)Jv%U%FOqI@(f|Zhw7kYD;TF#c|Ge-3KOg`Q|?_DQCj>QK%d4-q`WyxJ6yM_Ky6I z%QxTP$Ik8kpCdXaz>mHEzh>&Z)ee5u|3ByGobr##RlfiI?$C&{-S4gc7_J3RPuW|j~R{V!8 z{GV5JhjDjiWZ)C?%shocA!-UXzu1))ov58>s~P+S*AilS4;=jTFM+ymhreOR{9!JG z6>Wx7lIFK;6d#g4jQf2-dt1%VL)bTIleTRbqS6lh$1#DkZXTCF-GIIE)AkM >JJRpYJfWx3!d?@*HffFB^Ay zNBanv`j?*lf7sWpKPEEm*}lbJa3+=1^=G22`HvS 1QAV z!|&voD^Ku_=C{fpNOFn~h^Dna=r!x++6B$yat*g9$~^^ZzfLtFG}Y^!FDCvo)olBp zJ*G~Xvj5J5#*@!Swbb06^bmDFxhX#W{gd_O1@n_ 2IhX~1E@R+)# z%NSnqWJB)`bWeHL{nNXPvubC3e$V-F*!vP|apv+*t;Y-Z8*cyZINtK^@!GnUyGd(5 z#5VOnSK7Pbc!#^6{Jt|TbRT%B?>G32YySStT|+IAH@eS!|71v2;Q2P%$d-M)-OX2% zKEaN(HWqxa&Tqa&am*QV &SSAw#vudV+04DD#beRufbt=$yUqraEmI`C@#7mrKnJ2Z0qm7Bc? z$2&0JDLKoAWe+L(bx!~IW^UDj4-LHZ`Hz-QQpTQ-G7`oNHQO>jG!-Uoi}kE{%dhnxe mwJ8 z ?_wV;y_-bX+i_G
wB4~+CRt_Z0y^?BDkN3LbwwrkF&{I>^uP4@?- z=R_JR@+_CnSXSpvWN+OE>|$^8D8!ntUiTv~@F(fTV>?Zi*Q21lHL)GI$7=cX(mr`- zuBHV@)9%i8trj1dJ^ZlzaKY#F>W}1e%LW`3jhx-Nc^$7_0H$e9cTqaE(6#Hr_g9me zOA~E( _2y?{bJ zi>^m^3Tf|QEqJe;-*QKi+cofF*D__FU+O2?3fuEOeSALaZta3~F^y%}dm9Tsf7+1C zIrr6P_74F*vn@Kh)8q!OKU=b2&{FBTab9>galhi+(zdFm1$zkt;t|hGcMr*SPdj=B z_N?udSbe+Je}3N=R8p@2rtxe>Sn#I~DKB<~>#mm^JX&x780p`c_7WcDGJEPs$h-t* zOa4ZF?vq2b^%GNM#E{dR=FI-emAG$1LVfQ0;+sxAf0F{Zt?B-mfILgRTzpu*=dZu; zma?op^yd#24-gkFXh*nTaKSsG6uC>nh8c@9Y2PM|Zp6pky2eKB{+CU3?XBJmmgk*` z4zBJ{U&7(;+kbpb%m4WLYOe8I^05Yz`)c&@eV)2fnrZ#guS~Ca8i)yVZH-GiM_uS$ z>8-GYp#Rt6(P6)=!94mUGlw+pt1dkth6vG(l|wrWen5|zpFg^yrGF$`-85ZNT`=GC zY_smb&Yh7{2Cp189qf7jo;jzzJy2Prpvs@Oplzda8!nDsIQwYfr(j8N-PB6^xqh*& z_f)1kJ%@e8gOYq8N!6@w!A?{;*ER9D^$v(rU6cFCFi)cMli!w3*fcvMrCYC3`h#u0 z`?sn;fAVeIutAu6`+(?Rg56b2n{+wtC(=}4`P YY+_Gu?f$)2*u*di%38Va?%d?)m(%1ml_#^=n1|iBdCLu1Ly9JU)!oT4 zK-VL0tmAd;nmTpSHfrnhS)XM)7PJ{==f}RjG|mH%?b3qdf@>dFL{H0}U &I$tS|l=6eJ0?Y)$C;c!yn%z<{1SlqMi_HN36exqhc2}}Df z4<=3hAGWar2-+GC4|aHI>YrUT8qKL!7e?kP#cTyk69;fA6i|J=-3hXQ@DyO;6wT z-C^nX>g=WUlFy&ocZ;5X_$os0?%hE~FsRdhs2OJkocKM%l756PkG^n!Ll3;_;+i|R zD5E1jkV=SOFg0ObVV5z3j&|)dciP~|QBftDO>@#ROCOn@O`7$d78%(`VqRX(n4bUL zyVjk!#a+``6&G$_jzT40LH(Im#`gZTrC~`4umJV_pYpz%E`KsmCw}&pj%a^rddh&A z?-Jft`I5?eMbz|eE6djPLhYWLXO?jbW4-nJu1+tUy)42jJ^aD6_W*0h%=njA6U%c9 zLw>uXF1&YfU+Fc(7Z=T(4Fb~BzbiW=h)n7}YJM{>AE?U^VLh=(UwTNEm9*<&>T#DB zRu%&DA)Fb|hcj<%hEE#U|M1-WSmnsw {<=GZ8MZSSF?-=Kug zZFdWmqii6mc59DsDG{g&mah1^JvAYu+ky1qLrcG;ND& g-mMuvIneR0PQpEx0{IBvW9`svkN{jIS>hYp?KTzM9W za@DMuc7*ya81r>gsjGoW8D|?hao|SxPwh<$>i{KVRqUI@+L8%SRa9jI;U p3$wrw#hSQ^E_G=;B7rq)qLQ zM}MYXZC~#gQi1sZ0{?n>u5sh4XZmhmL+`f$RA~vB-*yI_Q42ph@;|lJ8B%(0BMD`) z{iY))Cz`Z_PEv ke&^|qasRohsMCt3Y}>;DDw9DN23KL0J*)4BSO-LKF5U~VYOp7az0$oK8hpWj{F z`Qcw+<}YXxR-V<)>-Rk*awzL|2Sx4#@2x-wj-PlD9a>4@rW6 2`we#mMc)57=i&J$+7%L;tUzPAnR08$yksa}IQ9^W&@F?ldkkO?b{@Z(U z32z)_&7lJ`R2TZTH`o@gY cW>s}_E4AAS#h>gNs_z~xB@tUkrN$em!NPT36C z)gHSzis3x?si^(ofQ4LuN(T!JZ*xEBOon@Z?ApHY(|dEn%=Ry=-$@5 mk)o6}Ai6(B~$d71x7!A^lixW^egbuf_k zU`<@(&5!Tj2#x^mf{tNx;25*;;N2A?SwcxQ*x&Pty|Je-EN$z7EgnjKCpz1}+BE z^rZ?rRTTN_*`bozyTA(e`~ViN*n%+dZ_ck*XJ=()bxiW^&d~*XhOjYXHXh$;>9hr4 zq$%G6%vC02^yxIub=@zliAWFMd7B-_+B7$4xRdW~y1#A6#fv+D9%AbbWfvJood%B{MFKeNiWbD%o0)*nPpUtCtwtr#2S#yEj>PC<0) WeZM-D7f?y_!k?N) zcd!jx5AcGS^I!hi3k(3P+|brsBb(K~=NHRWp9bpAn}uuZAZ@9~yB2 {Ux} zUjk{_RNxthIcpYlIPR1D5Rp{DeuL}Q^c*ni5Qv@^goQCvBLYv>)!sdtG^cV)@>lGy z9|o#*qRuK__-&4}S)oh>s%0*3#efd99H|Ki5~ndtw&eegpMkhqF8Q0EgWYcq@#pWJ$= zO}=(i{2v`e^dHcpf)kNp9mTUQDL)MPZRY$_*RjukKpKk2L$X$^=!4YXOlYaQD+vTn z#uU6$#)EVSi!v_#T43ZRhLEF=GyWgsm^?3g>6z^1l`(RAGbrYmUOxD9_&w8CA`!{m z1fapQ|3-di`GC6aEZ~;=LCP)%#5C;Gxlrvf|K(p{Q%+4Q`T{?_)!6{RP_yFOIx8ay z-BWIs5wDGX Q7A$OhF=<<;@f1t8^<_a_xMhn zC}-NqU0g)w{e~?sKE#K)ou9?EcMA+TwLi|f2v~=+J_Yte=Mv6zMWw$0+3HDlTmyoY zj_UVM`@l=wls!u{!B AJpm)D&c(;zIIOLi}3XNCgJ`Ll@5 za!SISuvI@``5 Qv2-8qLHQ`li2X9c^Beb-$={!Rn!fsU&cPp#iib9o)>=+?TewCHeowdaRyTRw zUP8q|!8ccLWdt;D-hR70>wV2FUx!vU^fp)K(56X_l$0JO9XND|c{yHRGU#5eX%n4s zaMp>XF2l{8DY3rBOhQ|$=(x4&L1(!&vaZMdB=Mnz*QyWQD44c9Hau*}QjclOhbsIo zb$HmyaLd$
mTP&j;;b_l8j!&U4560UhvzRd1B$3!ic^D0O`3j=bJFqs89OcGiMJ9JiB@G zNRemu(XRa(%Euo5{>|OSl8?C)vZ~MZAom+ta`z ==Vd&t&t8zJE!r|6h`rm%{JE35zP&zo@BSU(OY?oFpY=mp z?TP&wN-KS3(%88CgBkoccQ@$UHYJL_*RCBO_pRlxmuq4z^U~ek)yaFfU~iY4Ky>il z)Hz+N4=3*B%xaHnWDnbatX%J_y!*7S2PipAow9sp?#y3ryj?Ss-u~h34GI22=MYWT zrs>m57dP2%9>{=IZy)gD9^wz2`;@NV`77`KeEsMb#jSk>hY>Y@ADOD>yJlrdn{fHp z27=Ua)$@eu9TLJ4=Dm7!UVcVx_ 84)i zy%~LIviRZkK8L4H^`VYgOA^Kfhwd|+YoiVSJsOv6T(GO@+Sm%}hb@EVxcP-*+R0(7 zOG5c^)d`oR!`}LS_e=O-83ZAT`01xz_H%!v>QA5!tjpN({jVwCO{w7n$n)0!(*7ik zx((#-m&axBI!2A}W3J@wO0Smg?qM>0vS-S6w~au*JA1Z%mwE%buXV`0a!N|Na)Bkvu;e+J+k#&Mae&jvG^SRQgUeQdChuJ@#GP(1uqh zM`{X}r9BP~d+`YxuQDu+9X=7TJjH;Y8#`ED$+m -2@WB42*KIGOONEIaktPh%RoO-dt83;%SF84)(m`oo<&$J+o5 zc%E07c8`*c4!-(X6 vk~ z7Zg)|jM}&{d|<=P`}vpWc)_m`*4l=sLi8Ax^kDQ3b17l;p`*8W70EAZ2W{JZy;zpB zUwFH)l8=PHSR*)f^+> {BSw}quEvZV!>hLsfFqL6zi4{!y!x3 z7R!;v@v7j9RPW_7*OWKai|U)kfSTSc0=XmmNgbbZGxZW`|MvaXL2o0o=Dm3Ku&QMD z&ST=CO{ER4yLt(!C_(*4-jxMU1!ak{{f{EzKviUOvtr2L3EMXG>@W@El$U=mMAbYT zfG*LW*Y+=izFN1UI_sEYafPw|K{wNE?bRFRp6jY%N2SZ=eUrM4T$=AG>QbA|+LN-G zYh8|v%KB8 XV)9i-EIL0My zk0mi Ie7y9NJwE|&llsy`BI zJSlH$Edej-J2q^^*rLeSb7#=2_wPP{PV3umIV?4keVRxW?)_NVaS9YkP8n8sFJso3 zH*;2(qmm~Ve#}xHmDf>_vLUgo>(+H;w|~kt)7~z*FUmnB-emI{%Ox={(C8#ep=bqr(JjF`p$|S zH;;=VCujVxlDQTr>BaDt{kOW=64cc>GU9}x#~My%=ll2OMSaXXz`~EkXCMk6Rrc># z^YX5y72djEpKsc)-vk$2h+d~1D7*RQ?1#E>jg!8!hOet0{D->lq}h`-@Si5K6Gy!Y zf7m9Uds0H$bG>CHT5=;J??Mdr)Z*=!y*}6}_Q)w90?@yi%IaWl>b;B5 jikG$C-&xkm^c;QZOQ%$_P>Qc=95&auV@rzRT zh5KiB9<(KP-34Dhm&e)oV$q1jAKyRRhR87C9@H(M++QZB;qx;4pErT(&5ssv`8i`m zh`J_}_o#Ot+k{V3k}5LGV-4xJg@0sV>Mz`W_}3P-MI6z8>Mi?~3+BR}Zu^=OZ+j9O z^UV|26;1BbZ^ix7Kc lJ()blOR+e{2UNh*ollpY)_LH$Mw8y#=?}yd@_C8@=&Y8A1iyPjkk_RD8 z_agUM5;M}S$cT+a%6|KndMz;(XM+0U&v5fw!hWgD(@n2BQl~rAXT;r|?4suLEz1rr z$Zwv3ZXBEr0-l*&(ph@$7FrM^cVl}W2^)K2b<7Vhw)P&(;JVY&4z6pxQJD7kcH+9E zsrZZ;?-&;c0{BUZ8Zx;eTk`n#sM6mfo{Hj|ZvB3&5wj=xuW_3Ty}Ef?fP#;Ej+XA; zCTt*m7u; boZoHmzU&%!}0^j zG5tDX%##%fda5vEX>d-Ja95jRnf~f^vzV8&bKgNa0$;bdyyjN?s{tD}&zsBR?Rx#X zcEIJ!jkkSurH1F%9|(Ar$$ei`Cs9Vv7iQUL$(_Xp;&&%nigJS%Ma%M}@cK&3frC+# z>7vc={>sYSp$|WD)VIBSPF3PXbegp5*tZLY?2Wz+*c$Hm!Vk~8ArIIN3SZr_{?CeS zq_4;CMW2`~Mrn_J_LF@8R~XwrR?aQqCVQ5Odlrqo;ys_01>3lx`@&0%y5GuMZ*n*z z*OewZ;T>GzWB6~Uje8eh 4gDckn}X(y-oZ>p!3vd-Kkx?UTLN z?#`CAf=D=Z%F*q+%t_Ot%El#be-^#qVnt$M)C1=N+fG2Q??|78GZwaY&A1yL-h+)e z-TH3JNWlk-x;=kXG~(@*KaW+ei8X{Aup8`nXSJ|@%9QNzeRIw)9kFe74tibUNeWJd ztS(%3_OIwaCvCgecWgRs!!*s?#wvyGU8ZSO`bf{Mmgj5ecN ASdNTQq?t6kccLS=WSdWGr$?98 zYtD;C3M*
YHu3h`RB$N+VwYfUUf8W8qhYj9% zupnx3`S|Bg*7&as9D1NI@4SmfzMK1069>+U-pm|4_|E%r)Icw pRoDsoR##_uT4-Fp9Em1D-jypn^gm-$2HAE}A>#&>mCilm_YKt;8DB%*R8 zr(W(ku<7kcZ&3E)eq7^QOY543I(UX8<)ikUdgb08#4vPPZCQ^cxIel2&pS@;Jlfxo z^yZD=MOOCp9; -2ks@bPpS0T6$$O!)*5pvuB_3bx zHJw0RUT|ZhGI`+8VU$_tqaz+q7*Aj3thzsr-#aT;7+bTWc-1TZ^YG#qdoy X-9&2 zKVMHfm0zGwoL8C}9kEgz6`8eja?U+x&MQvzw{5TI?DgLLyef9GeEpBJ&V!U{O3&W| z9p+y@2oUTtsu^DQ-ne%xQoOwXKIn=5Q$>`G#y<|AbFYm`c^O~zg;SFIE=!#}ZWMtY z_i!n3)~NCM`Lnai2t$_AANOMD;-??3oS18x7%@M!xoz;IdGFc>?0H_8)^>dT{lqbr zsCCyzjh_=gJ8MXqMSErI#^U%%*g1u-B5EF>iZz7H)p2{Ef;|h9#zt37ZNE{$=WTAT zUPgU$m*(3ZX{nBmhe%>`7T*@{$Sc0Fl=}8##mT#}ZhK5?9gVMEkKJz|7+UH38H}0% zlj!p+=vHd;?r*N|7(M!N_c;@u7GtMV1=rmdT5c}PloV{7I(6I2x-F`$&=V7WU3*9N z$J|qo=Nrzk4OHF5-z|cgE$FQ>i7jelX+!ForZH6~7e4)ciTYXGQ+Un8&uLTNV#%fz zds>S!)5+9xr(-R%UN0|sn_#$boWGLH{&4OTwc<)<`u&Xs cpHS!Rw#&=biA@91<{^f`#h+gWGFsee8$7S-7S-`X2SyKiJZVD zgk!0jZ!?tRpVuahp0=%W(w?J}RzKf-_G*PK2%3jj>s~Yuj6g2OqSzWZgddXv)L1 z!?Fh(R^_jHRKv(TwGy?lHp_4|XOEgQo5jZbzI$TdCh6lX758WF9v-&xK*9Y265(*6 zX5R=%`sA2uwFD5KyvdzMS?a?HQDfHm?0J2Q{u-MuE18|_G?u3Nw*Jf1|4dhvK3zO< z`~gOLb7e(8oE*9C$nco< `XU#dro`r|g7PP0i>!`Zr#ZN!q_|_GJ#kbvh!><`t z(>gkK*YzErCd5O@S%lt6vnS`DWCrWqx}H}De3}^FK2Eo}9G(;lmye1)zj;qd?pfL3 z*1z`_A74^jePcsj a z)IbLz1KviPG((oZ)tbB+Q9Js2{XWn6;-gynfbC-sADj2InypvuTA4WZy_D;!z0I~e z%f}R-do#Y`qPGoOd~ZMd#hbb&25Ma0(Xh;3WX47J#)7w!{kZv)>QBAvZK!ndkBf_s zu1PbOZd@Whx_VQ%)%ipJy2?fCHWVPU(>yX)pW-6$93B%Yqy+H*nm8Q0ni z5vAgb5wi!nmq$b6l&^;!>pNv1`|5>$U9*>)X`7GVV`f4*QGMFV7wcL}HeL*Tx*F4X z+JUoxGKq28rIwC>jvY79M%@7Kwic3_zj5Q#`^N|yH*Oq`oQ=;|75rgJ&8m? *!sqU~r855WwCjCG+uoZO50PIxb@P2KXYQ}p zhmVgaEBiLWykqR?wMEjb&5Zl0FWOgb8y+Jm9CNsQV!r#xkl2X!6GLES^$}sqqiz~Y z66A?d+pwanx|m>@%o;vreA^AVF8t>FNpXzosLZSax0x6J6Ln_z3+W5wbEU3zUD2x8 zw>@fF-fWYhFM2mwF{OsO99^cX|HccWYkwx*jhMF0x3BrSQ}_GYk+sq}9}0?!j}=I% zi05PX2gdDfT-`+f{C>0gQ>iU1$E<2leF9^ikE;FIiC$~}X eNS3cEF z`k{VCa@dmk8{(+%b9D1=+}VEj++G^Rv(9|v@qoQl-)ee8)}I^BG$XdG>-u@_NrEIl zXY4-PL+zkBZ?0S!F=^#_*yMD>kP(;ed4|m#a^{C={KPzUbeeLPAZh~QgcH3#Z-O#U z7 60y{06`b3lrod5?EW)Ff?3N$mD0a6r*wjTI4GnDZnf5rA`VVYI_cYi zvQ_MV9lv?#z_NkKdD9=bv&YY@W16SB2`co@$NspW-9zlNe8HP;H5=NmuKx5^r3)`E z$^MCAfXmD+nMM1K?U|dGlG|e}d=qu;^-cHRFBeoNC#BPxXEk9St{s~As}^o+#QgdG zMtDZ$n oeWE{qKaCZnw7uHJ9;nuQT*-c^gfBbvIsC5(=g#aW*M6FaCT5>Pg 96UKrwzIXBvsI%NpGk(uChO9dR1}}g-r>7Ye!$V3dPy5L2U1nDGJ12i z68?9={iya=#7W~{FKGH$!=9(U+ILFt67hqj!w)v!FRs1O^P#q#Sbiv0J~~9L=Xq0) z-zz>6M@TzCGELfCeS9+`e5vf!cBQv^t0$<%De%W%SNvUWL*1&IHFBq*=ih 1Q~Tffa(bh$iF*$`b>zp7=cp*XPk;QYUq5WVe48-4Vg z+Nh1$!(-2Vp4#3tg>P8$#A7FnO*HCKiq`95Ka7$co8TT6@z7k-{%LB>(&Jkv7*Q3M zXH+_VjzMRes=(^Z*R>-96}fx#i{oM$kL$PRl^jk!Si4}$rXES(bvKTi_qpeqpn6yR zvWeD{TB5F6RX=1KN!{?t^<&ZMZPg#W>D#vyo 95|2jp}Tc`RK@ssP|dJi=Up$ z+%am*{8P9#ZFY9w%YO~3IDVn)!1P>IdQ8PAVq 7B{M-MJ@!YdB7 zeW=>HM+KZ@3E7(zw!D6B_^EraqgR*4!hf78ZTOjZG{)Il`u^%dMvv9o%CNgXP&bXL zsZUlfY`j_dEqm_AV tOzI~QVKU9DXD~#0@5HuhjdFfN(xAc zfQU4Lba!`$fpnL&(mhHydtEb#_w#&v@8kG>?LY4y51hGXUFSO2*|jpeXk`B}lA5+W zm^gD|tltjY{?sh1S^P${La8&-??nG2{;#^q{?SKcoVyj#>h6?%Em7R3#?D*6yBEHP z3)n}-s*~&rus5D@W!n~(-su%)v4IViI_&JP^-L|AcWjTbhgu&cmz8P}AH{7inFV?K zh#DO6(hbz_2bQWv99hquPTzX+QSx%^LjyLGiJ5rq*?OB4S6p=xPVc4H$?Fz33_y?@ z jkNUpTle=$AJFmm+i(v##WU* zLt33#J1W;yLf4ODKly~vdy~tC)etaK+nR(|kv!1M+N?zDmkNkGvEE3$&%xcKzG>8q z5^%;hH2U>BXGq0B4`W=>r8eO^u@uic@%!&D^2CyB9xM`e8~0Q&l)H89{`1a(wy&N} zf}sEVS|a*R9H(XUM x;!*(+q_pXAo1Ykv#VVCauzKtm@561ZC(sP<7j~Js zu~=3%d#Xapf8Zlp&;y^cGlr=bpT!%MW~`kq5D X3 zGk!0|`r0GV89g~ii08)o31epCNd7RR7vs4l>&zR>TCqYTVh185z4vqG4qZVdE zE`PS=#E%MM-u)(G;tlkH>aS%bAZ?KOv6=Psxhww3FBV-3Ka<@}fp2?#KKwt`8TXQ8 z*FlWde6eK+sk*5JVbtj>BF{>6@r6?i1B^{v9p6RO?ghpV8hKP;1zDYuX=)g`-X#6! zSmf8otLAKGjGjv>6j-jE82;#RUE$mLxV$wdHi Dm!r{Zt@ gW;G`~55{4qI7UY;dEG#kQ@ )=&y4$+}0qLVKjXCTGP0O@`R?C|;b-&a~`yDv(X@ z<&_YrvsO2+S2z6|#&rs?cuVe5lyHTH(C?k`)A9)Oe&~o)9$kwzyv<9w9w$`Xvs8R{ zmC!PaUx-otq}A8ak~26SXYb&N$!_2G%Zf+F-HeIi{GqZNOr%o`&UZ%@m`_fgni$wr zut+3WG?d$eGP~9F%IV=IuPZx8(`PzoC(~#7vBm|%Bmou53hy_jH5Re6tDQoIG?mLd zB=sV{G!x^HzL2*oH=kJ}+&-w$9wS)9+j&l+=EuzKdiGAJWMGbd8F dFv?MaaknG(a)PXr||&GJW;aRq`A5C7|$fWhgg_n2by417C3dO4W3> zabIN2Xn&5T>_$dp;Ho&<$HolNX=~=8*B~h5x+PlkD`Z!O bS?AMF!YNUW_xi)PIK}D #xoA#tEr0b+8B?IF29{IXP8tWoa$+QCZ3!`*1qrRmNbSp^_4=UQ z=9n TP;|6DO7EK zAFby|%RTGf Vi*RPV~)SkP@B{uUWq9-G~Rn>L=sVh(Q%zA@{_ z&2eNlO>?Nc5x6rvC=~{%Ka9c*9TE9HLfd4Z9;>kkR @AEmo;nQKvh58>>(MH# z2Cc9jUXOSG7Tv)1dQFK<)0UuMke1qZyo}=Bgk?I6GF00GWbU4cWT+YAY1=Ego}5hZ zbNKEZ)Pyx{vfd}40Ha2m!G;y9O_-N7Q`evEdEjny0N;Z#B@HU?avPq&K*0S4ZIgz2 zOhqNz$j6B2l%2{cc-~n3WPj-~l!;M58PWBqr >d}9Bkl}wc2J>Rd>!=wdEi5N6VNAuAL=UDrlj{62K4T)M$ z?Hq^qGb2rZFZAcEP9HQ2#`n^_RM(IWe9G_) 1rzOq_=c$q<7$bAIaXB%2;b;`_IIl z7Ph}+`<}VPv*>$!JV(NYc9hiZ3z_26P}sZ^uju5h&a2;I@u1PkD=5(YnB?|Gp3W2C zkBE(zjg9#m(JExUK@+Qxa5Vj`$paL9eMM2$H_J3o)3Wh!k8_o7Dx~#uA}3du)YzA; z@j4#%LDnN)+2zPG*M50>fW4(BgUI+UzL(Zbf64oCo>?iZM^~s^NiqC4=U8aIKt&}h zf_nQRy5_-)(;Xf`h1E{oQo7cC+boq&*0iZ8Lpe+@2gR?=GjR?q)~I?%z3}lBB`C6I zFjbn>;ClJu3e_IjZ=j#F^D?8FH@_dh5*A633ff4b>s}_6vKy56FFvy6paxYoglhT~ zu02z09EkVj?<4)cQSVImqmshlT##}4v|$HFO@gqD!hPp78d93LDtMm>2j_tpiR z$Y~7TbTmw4<48EsUA6xG{m5w1L~W;!H{ps~+hv;5TB+m4Vmju89U?oJ{=#yPc-`bl z>Rlwx)M8R)!+_BdhAP2^FgiwALINm5=Y^#>qssHc&-(GjQ>Y&ZfB#DOtmmCJ 4 z5c;wpLZkWNNiUfk@?$*_X;++h{vw&cr|mq1?1RhRW9aIBzM`N6!L<9fH|uZZwo!gu zy!o|MBRvFMzpu|}zzj99NAcLkTUkf013KqZ_y*Nc8Txu!!Q4I#3}r@^TTIFCCHApp zbo(SYs>Fu0vMgcn5ix1OZdvQ5dc(CSFrD(g;^B?b4wkZzFY(5 huOqnpvX|C%|45tB{FHt^ z40^*B8c^Z;J8p>vdY=_aHQ18n4B7~piud#`M@)U*ql{?Ljb?&dlP yQ<=}lZaoxn7dFM)(xY2b`w2ktiBxW zJU7@Gu9V@MtjGR5B+%d_6zKYG)8%hDu-8j8{mH6B@7vAyCeGmbuEEQ?=q%+qT?wM@ zB&yi8X8}n+_tz!tXIFE})4xVbSf0^(I8OfLK#9K#KN2<}8&j!_Q>uS&-Cd#|c!Qgd zDK6g4xXMLzv5BRzh~7Tj(qgeDRC}<{Ej)= XO8!YKxOZL@K8+;L(aI%Q_3DN1oQ%N_&$M{CV?uMdb!?itX2bYokPs`c<#$XcG;7 zbsFy|f98jeqwah# a ziX=OA$&a~c%-8VhhAOR0fnxe40>BQF@caQA9nITHE$}z2M_ePuBs9c$)m%k5?fe#Z zrqZ2z`K&xrfUFHTOgn+(+`!fHzTBwo;4y;RVRS%_Jq9!8pgN>hTd$YGDWUb4_V9le z%fg#ur8rKrSHk6miG&5##4tb9d4 g$%mtBvYSzJ BSHno4w#Uwt0;n1HdNEXnAoXntcJ&k9oDv*+GBkO zKmIll3Uy-8c+BQs7hmMDwLX2?s|c?NPT_wRt8G6Oy8gO_-6@sq$kbqH ivkucEL!@ulRVQ^7T(Y)jyM^7g_R4a%i3}aYH+P$8~KpmWh3~|8%9!<4Kt7 zt&MN-w>4_>A7@nu1eq5COOkHMB9y 8Lw3V(>Dc}a zW^GK;LN57|#7ARtWCl!cM2jUApvpQy3LUS$U=RGV2+Mwd?V(1IE+d6K@sG(Cd(wuq zq0@|179A&C)4Y*D0_DQFV(AB|`$AgBexE*Qv*L;jX|+jAX%QBtDs7yNu>Q?2yfX4% zMFBvig|}=+)Mj>Dl@6PJ8xd=u;53@x-(H{4X3+Gop|RhR*b|0_l^iYP4X|Ne_a56u zm*u>>>~T76u3m(%F`?Jeu(%<`z6+l|B$HXy-rf0eb=6^~<5S1?I X`~8pw{NBGx*;fDhb{w&w-|_t$WQp7uH0>Mm&*W zau9Dmk5<+kR>JXXYPj4#gw~8hNwor7%9ZKHyO(=15^7yQaJkQDf>S>j#@r?R--v>)`KO>0Zm3b<=pVxaU8x$Vx-?Du2iKX+ zhbi^C`jv)R^va>{pRNuswfOYB(KWaJU;y?%?Kr;J%dh&zmv&gTs{RH!v1?J#`e;dx zu6sw za !oqJw2NM}&_>;q_943KZE1pq1j)h=+_9IT?q !aCWjopwQf3P~jx=*NK_4X(R+%=&A1z_gJiV 7d2@V2hp4h(0ZKp2R#6PI)PIVtiYZq~iB>fWW#cN9t$;NH$#8 zvKt5~D)k2fs+Y!mSA>e!KJ{>WfR<;gm(z YA*{#I{V;lr5-!&$x|R37npM z4P){`(j9!L1F )Xm4;<2xGuTLPqC5ArQ)EnaatQC!Ru&~ SEL4j30!@m_nObI~D=vLXWtt(s^le}YfseY(!~?f$4vlbh znW;pzLnb>r6P{|f_j?Z4vHYQ4 @pk3rKGWPj9OwbQlL>v`!c-eC0qnC{lM!O z|D{u# #eTylR(qvoVjSCR!U(>* zV@j!zHY)nl7_a$g+ko%wXB)eX-taC<>?fH1|DWi9s4x{=I=NS`g?FG;TW2AkyaprP zsgbg=sci`| N3KTQ D{E`S5LMKlb@t@<>F)cTVmAuh)fx&ZUjzxww~J6QHD-)Sl7C{0@tF2 zetUWa6!6t{yN2bC%PuV!R-pFWTuVw*1@2@0)C3kn!g{0OVffcstPtig^#KPt=gHD! zX)E7Jr=|eAlC248J`3~6GJj^`2bHxUkUCHXDu+jc+CG@V=F)6D$6Uf=h;MjTTX{&= z-#mnaQK8!K1hFaXw;Oonz4C3mK75f3%kG8mN$|?Se23=dQ-Nlyv9fG1rz90LhoQNv z|2`$#=&`PU*^pRZkrH?}_9&FWK R+;n_>#_r|2ZJ_@x^?Auc+ zi)Jt&;Wa8AwyN}|TtPd9gNj~uVC*J&ggGiJq05qDs;*7HiltmjkR;aVF~%I-w7m~v zI9P9lL3MPitkBN=DbLmh_zBm a)ZEKY6C zrj2W3QH>MC-z!^pS>C0;;r+y94^Ic4SAhf_*)6H?L5UO)K)`!whO}yHAxv6+oibRS ze9+pk!OVm?>Cvj4VoZ*1^)2K!JnwF!Oi{=EJ+rn2)(`8WBw6suffkaos#tkHG9&mf zHr9s;b@Af32Md!w#*Tyrc}dzx$edSQuiW3GOH6iqzqtOpo4V#`qjm>03!Cq4{J_ox z9p`;c({6-vrGtn$C4v+bdPi9G#ip7co}?V%(FCxuQ%I`R7FQT}_2FvApyiBPKEr%d z@j+Q-UE!7muL{e=jr(vD`rN(K+unv75!;}_HGL$u7Ex<%SR|MNQuEOtkDflTS;DVb zPOEG<@@nN>rQfDAi^OCa)ymPnEh}h9GqJ2!@wJ1$&WCw+bJ&S1VYi#--Ta$}Hg0fM zE-ugOSTS`wlYkIb=_3c^KG!oRyW+W>?2Oc$?2hkjcCe`Wh=HQ} y>2OsyxZk88ZNg3M}*mh}5H@1tk8gVEr$jQ;@P4lXl zcD66Ek#T(pwa$5p-bRS`V;mSe^`>mBqsisKHSHwVmhBr&J^ fC841D1 z9V5y=D(GG_JuEGB4dAkTv4{K1mo>Sgs?HU)nncruEA{4NFV6)2wBur*`B0iy9b4E$ zx~2QT#N?s1=iDTDn~lh-+H~3T%viUrF0Pu{AYOK>F?J5?2{llq^tN1L<-ByC=7&?$ z*Z53FRnS}F9g)Jsoy%lafF}AgGREgra2**qo>^;zNfZK_a;dK-L6jk)V?sf%kO_lj zEAq>jJ`=rk6AHW5Zd^*X9ytUx>{e#aqAlwib$^pd*>u!dR`i~jY%5h6X(a>LI~r!V zpLN!rd7&xrjk6C+5$<8y_t?nYt!yB<=Ny$ZRJ)P-X4>~TW$5^i6tRH8EQPx}EAw## z;^!?iI$jt(EF-Vsjw;%mH69l60@N?J%#RkXzzau?%ZGMms)OU>h6|j#4CV-}?&X6a zGzq(5>LV!ekYmJAZMUa0ja6>OwS1rll2v^;I5lA3u3e6Np(Wr&PWrg+I%%+>ncBS&m=>dmmAc|aa zRWWVkz6LD9ppf>9kRT|pDSn!6(i3)A;c#lHYbRCe+rPx$KlFv>hz;#BsyT}u-TTqT zS!Iu&&y3th#!s_1Txwm+G#)#VaaHAiyUAbljVAMWha~^qi@QrNHwfh>L4-)zpmd|x zU}e^ zPEs964RPl>mS==MEi)Ud}f+0;csv{ND?H~v|Shu-UAzzFmoL9-?=-H z@MOy91;G=@FK#+9;P#^FClP~1oOn$CBlHR-w^C|00rRH6uR|#9jndS%^mNVi`zAb; zeQ18oBb?>9f=#+jkuJd?2YSzHeeYC1mYLk?c~@72RjNg78;K23Z*jKuo%!RV^~lZk z`kL)(qnO4D>Zye=jk9nI^V2AarMA4^6AvbQhwwAef*p=S99<4yE&7>6Y=b7^^yxTW zWZiETVwZ9)mX0B$t|S}ut|Se*Zcb)nF;??qWu;WKG<#|;n%zcT@0nyQ_?BmjMqKu8 zl^ps5QE07XMHj0Eq)dOplZ_Hi8@I-EvxitOJ!pVgRF)Nsi2_oOzxm?jTbZI7R*skb zA67rm|K RUADSaum ~%;9{W;ynLy09Jo_Y1;juFn8OR%z<&m6!MjS>of4fW!G{} zNn?hWzH7tthPX(iW;cq~=}cYmt1pLg;JA#b)&**`8n7j=T~+nJ729P8+-`F%;u `G l0Eg!g*P2ry#T9>a z(F^WigZoivF0yxE$k*PA?4!>BOHp*$$;Po5d?H6dZ`ZcY=#+SI%XhNHm~|WurDJ?& z-U$}XRgx>D5%q^|*qoHAizYW0)?e*e%f7$IA`|Q+JtzlF0ny+BDNx 7K#WSMz)snaXaN!3kD&f$ah|(YBhuzXXJ@jV9JJrO1tn2+PHl5Hu8n@= znXshNq}}~w+f%Ula63!aFQcK #Kt_n&MEyl4a9OXqzHC`^k{tU}zd1l;+u-p=l>6*05d}gQ<)Jv>;#p0W zi{D?_e><+`#+nVthn5fPFzhCX6xh?-VWWP=tlJz?nLJhb^>B~yhE-ws(a?k*_ZaQ4 zNG<0`ZvoR_s?}_hj_9bGrNr1;dUMIB7y;SAhv%`%nv=aW2l1H1W; gJBMXN6)s~)7tZ(m+b8p}BKN>{IhOBvperl)u*OFy^{6ruO*A=H$)vWN pS&2krH*@?rfuO z^Z{%2x@`8M1N$_6SMt$}5o@C1a_1kxA~nMkEc8?E)jL+?G`#tp-(DRiRdB= AscR8>`p7gULD5U(A69q->_FKuo*SD)#liJ!q# zSp0Z>JrR2l^!24U1j92WfYz4joj_*Gw$S=<@qigixc^*9K|)X|mg{v$7N-kxFjz>I z;AlcUF_%#>=XzE`vw;=p`*CuxnS7*Q`V)nU_qzM(7+$%hmTt>l0a4_e1e8eA=~QjP zjjTiNj*6?h wlYL1$va5x#nJuV<^fo?$G%M@dGSxpAP?_VLub zx4C_1 #%=0QK2IcT2bxF;P~!HA<@-7L#UGMf2eZBOmWU6R#&n*t1T zSNTli! rn!lJ^{M|s}wkx(uAw^$UYMhFC`z*qg{yr%nlS1 z8O1PYpyVBK4aAo)tsg1bQac|O%h)WIL8w8f^hF)pTg%ktRbB1doD?Oi*k;p8JzBk$ zPcjwxV(CH2r&?r 3K%_#8schd$$;x4auimeKWR&K`s{-k0AY|K3%@Fe!DaKJ1 zZ{v+V+;g1Zqj82Z*`;YThz);59lo_bOw+^iw6B0q2&+mcbec@G0=FEEg)^02%Xw{0 zry*9{kNHS4Z-k>z(w-o++>p(`fOJ%B_=#z;It&EA6lVv^&l67Zc^d<=VIb!mc0 T$9m!D0Xxu! I6<3Dv^W}OK*e|>xy}7Xa|SA|^Gbi=-YlGK5e#2*?W`Zdb_yHC zaMN6lPsElk%hifP2NI8+!VXbl=e33dbA*9vn97O>9Gvu-WqiDJ;SZdMdLumCm%js; z4!`hDD{HTu9@&&yT60%xey6p<7zHuM_RopEc-EYKP=>oWn3J}@s|qFid8ua}E@rW% zmU~CX+R@L*k60TMj5s*uHhmAwPBN3{fN4cD9YKItzC?*4nzHZQjslk;G>*R!jXrz7 zL M|$ @Gr2r_PC#4F$0c;v!XPNPNeb+F>QWl|=~(kjXB zKIq)B+Lcf9%o_0u-1+v#Yh}DZ!m74whXERC`S3v(VyKE?uwaRB3cMo9;>%5x6eWJ= zztc?wsZc!PYbBy&G*xC5$G (C4{vqk7%SCli;N$I zmooq-PfDb=JgZN1$;^=8rn&$qr|5QqQ&xHbX|M{^^6=8gCo2+*Z|NsS;!{sqbpf?+ zCF1fSya!mgAggf74)47(Yu7HbSu 8d*c|uj6*iwWV&3IW7Om@*Y4=s2Z175LVu%w M6|)T-tijq6|Jc2jEq)Lga)Lz7;FF+7U2D3(^jHQpYxek zUj31|j(|I?_AQA IE#~Ig}P~o#c|K= zelo^BVDcd8%N6X=e)*Q?cF|P@eH+C|EwO*i^t*y)j*oXcat%sa5 7?frtXv;6vuB{&@uWt|TH}v_o?6E;@<5$S9Ya? eTG$-Nj}JlFWCLBg z`Xl?XCeE1W(k)qR-ul&<>*|K3e#f##rK>gq>9N*4#TJY*3UpThd$ayZ?nR1^8eAAP z^_Y%IHW*>xF!1wn!+lBxGJ#jV(Ci1p=q5-S-*JGeGBy=s o5 zceCt-zI==fY__%0JT#8A=+RMG)2ufc|8}@lrNiSOxC$kVeL>vAXvsTS6Cq8O318av zamvJ0^DK~zN37ArcFdK|3wBz`KYZxr_l+!1_ay15KB3)h$RxUiVn*=NY1vWxsQsQ> zL&4X*Zi1ya&aA+1 SDu0vFi4RNt|AH7f)n4q*VRZBiLdevd^yO<9 WU#?2@wwB1Rmd0A7jypT`llpCOFCkMR`c*0D- zc6_xDPc$udj!iVFDvU@pHTBp_oP@?uQUQ-z?Do$zwV8)X&R$tr&A`X*mpN;m5-E45 zWX%Io@`fvg{Z;6VNgHUV<@$a)$NB*TuT)dQCO>fSZ14Cg0wY3mkF+b5jNM92mu}lE zy~Ee3m&k8(p#8DS_6=xuU8_1`90p(M$a0|AcuG)TWGa}hpmq1?7N}7nkN{QRQf>U| znkfesj!)tq&aM9_Z*dwf^mrM 0*5Pkw}hp6984eYc_%wKMhdr?HMI)DD(V-oKbn!(0@O61XxhdG&>hsiIqH z{zEYK%T<3HI35sDJ_0N|gPO{NWD6q3BK=isw`%t&FmGe1gvm(bX_@A#lTubunlPBb zGN#<1>bkq}wBAKA6@6z23|}cXbMYLjH2vqAC*-*_tjCz@wPf(*NwJk%y9lBOM;4@O z0zou6Gl578Uh-mx0t`fP{mK=5F#lIhPvefTF+A)L^$sd4R1ofZ%h VvOwV6VXs@Nmq|XWvKzeb+vhDKd><0BD2%IR_C3<`15iR5QDU z*giz0++fK#*R&hwW32U{68vjO27-RC22Md=A>}3#LF!O&p&2_EQO$>xB;Z^m?{Zcm z1g&5aGkAPOIR5W&vQa4c?AG(1455N4aH7EbwY2_@(cXmSR@#vBT|sV;5J2 E6%T%}eq2S20NCq27 lI^>pN(DN&nW{_8dtS+Jf zOKQ2qyhpgymoAe-_comO82rE3pqDAIeDuxMl$J+J(;BSe1;$4v`ty?6Yl7`}p0}M! zBjcFR)>~x& lrf85ACW5DrFz;E@4KV58gF@^u@Om z&% 8 bx$#JpSFGu|M%tp01M0>xdr$6)?+5-QWzu->*`nH{pz(s!2 z3#LuNavkMw{6R$$cxh-we)0n(@+QELQ`?qM1tj9ZuEv2lvxGlbMaYk9bpXO2m6!ew zNmK%ORCxH}eCGcGFd(AGdG8@O4?@W?;N{JyvDL`skfNnG8V`X<@XrHaRJAr`D4dVW z+ra=s__=;Q^~EM S38wBe1xO*%` n|AqC6_rZQXn-6c!2@@Z4nGl4dGMuxZy#d788s* z|EWvac`+4~Lhn7m>cjjLc_dc#@w1${aGh|Q7g|OUP=kL2dx2nkJ^W%AG2t2KAFmiE z{1=1@dKx{#e-6*93Oq8SKTCyNr4uKsCiZRZ+s-9IWrTYT* khHIdF3dAUW1**TM5)VYg7gJoG4mlV!R7LfuCC?uCC%yG;T| ziB`UqM{*hUJ+4|~rZE3^d28wVTY%7ZF$~lE-!D%#HTV>tgNE}K$V`0^2%s3utdOOQ zk#`)0VVi)HjlJ&6nF_)T?Yz|yiJVI)(_r#_@ok7Ax&Upl+u+Po;#>kpa)~{f2DvQ? zsyCvR(CsUNc0dkvk%&42*7@<8*~iwnTL{BPI4nFI-}82 >u(fSdh59k$s4DS zJ4ku+T+Nf$|2qbt0?!5TMGV*5O`L1c^#qq+k*a$q<_m7kpC-2wA7yfG;hOkZ&T@kiKC(Gq{ePY8oWdBLzc=B znsl914Zc{wN_mWm0tR;8@}&KP+iU*cq1%5vPXUyNdvCAf{)dRWjCvFEIUO$VWx!Uw zAe9B%LU-2E(TP 4F1db=Kz z)@nd#)V8MVH ~bD0-Qzek;ucgyT!0+nmPJ){2jDH ;qcLPz>#qC&<0w0UDE>2tiCa zmjfsLcz($J`E9%pckrV3hA0md8qqgDXBu_ua=@uw%q=7D4A6_ItY?L&1S+OEq~0>I za%#|~O0;H*S_zKL*3C`aV91GZK)cPFB+|;g_u1s8 )dj*;5?b3tsZb7?`8bhp~gB8higgI`ZF)T+wC44pjGNs$^&865i>bnNGB zG55lGNF;?UUvb{cj?G9$$Y XS@SFk?J%*(S-QkUW^n+^5aunuHdNlU&Men%_i kc|pZALu|<6MbhVlqw*?GfMM+%$1zX4!bQOflEg{R?;Y3Ai&Lc+(5-~(jzMs z^;3Ib=DNQ%FQ3R@X7W0Z{Bqs&(t%w2T=Q)s=7M+0(x4)WHQ!(mdF_DUD}c@4)h{3) z|3@r1Sero&StT}V0NoIujP+xV$!t|0Q5Fvs+MXbA2ZQa4&v$mJKDr!BlRDH_)fDjh z57MQcxGQB?o>nMYyX3cGq_GN9jU1=K9B-+Zn~5q+0R%eRbRw?@y0!#lPnrl}79>s{ zy#xGKROxr!|6PYDZ6n@6>xeG1Jh^h>y;7AAZG-bhDP%0Q&z{$?U-QqRHyLnZi9bD< z&_A$MZT>08HLk|o=$iTUz+ndv9!J^++2IK F~rOJ~7!YEPodwhu@UA z4qPEM;joi*{^5q#B%a4sZ+%K}@zlR7MV|Y#Opy42oPu*YOcQcm*+?d2F{7W3RB9ib zPw&ReEac^$#0V((*e#XGVH*0I2AtxwFae}{!1?~mvO*T1j>fWYar5=hZF*tFi8l`_ zJTFolOf{~(X-g6+;Wk*VB21;tE251Q?N#8SjJX23R7l+v03=t-n(uhZuqw_8n$ZM* zRG&0DBNT_tHFC2dnKlHvEyys74Vrt5oC1!pC=-ARasJ$%gj~}U_+4q*QuL5p_ZA>U zUmQSL0whk@ rMd)~zcVFKX|d^f5n3L-@A=3f>Fz!Q)g0Bl$VAiNUZ zreox$_d(KNE|{$pQpGR8E1P9nd;l+iK95kTkQ>NxuYYwo*q$)eE&!Vv+WaV~o;z~O z$H1!IY>8HfNUI7>3AX*o*OuY_{ctADim!Y(3DH%5ga-?R7EIPi4rIu92Q; xX z<#&@*zabJ6CyN dqSOI@hfj FJb|y^1a1Wrk3c7Y_~a81QP*{P)E^?)qzRlp%JB0@q`-nG1~Lcf?nEIi zEj=JdLK)&yWdE#Afs9C*Aj)1Zqdo@2xEc2m ($V^7bx#=pJEuc eB2aY=lJ4?6T|9qW6R)q}dAzOJb0R2%L_~wwt+#(xHw6Y @ z#p+GKrK5_iY12UBJxdJO@K#=beoTQA2wul78F$XEp8zQ6T*3W+UVfPz?Df@G<9kS8 z!=RDwHyjo&9KcRUCl;D0A*aR*N`s$2eDUJkX9WUN4Ir+mBEbiNDpc@pdir?d_&;bD z)CbS|UyP6+gXGpU)%A +LLct9lPdXnsuBk;oH1HKKWo5kJBTpz{PwNyshCG8u?*zMQ{i_1rt|PDG zfKKi?J2=zbbJmNzK3E62zKmAv9TzXw0 CTlNkMPagG^WL6GILps_#%fc(wohU?B07 z8r*9la?Tgf7QJ`?!F<0Xer@gkmGc-Nl633|O#i_%3(2wb83fDHLeY@#9M~58&w+(% zmhQ*)fc*jk;Dyxpdg*1-j9esBzC4G5KsbQ#zWV<4q|YfR30z1Nddim~{Kpg_8 G@v@sxUeCa0`?^yUTq#m#m=Mfs6+tkNZ0nkfTy`>Q_-*z-cTG z1*fUvTfw&5YPXE`hGk^yljUP>kUObY?J7%6N9C_J-1L~NpY{(MXJa|u`K+1{zA0kV zJ;Kcw6h(GL_MOY*G{IV!kxdWxV;hYtMEtw`S%vfGVG{(`SOUYOBt1Ou%H?_>Qny#c z`*Zy{smChZ17Dp^lJey&QKq&?7^i-dJt1#+D0TCdQ&i|-jZtk-zsGmjq6v-I)%g=u z-J6AWz3QpyW&tV+g|Q*@=J#YTgd0u~ 4rh6oI#GPS9fx{s!BcuIo0E@tDAv6gF28OVN zXos&oE7$#Re)u3^PCxg)?XR5o{2OKo0Zw|#T$Kf{MHywNM$^oQiKN0$&>j=C9CFu9 zj(6)VuTKs^&S#3-KVDTVk&YHGlPr#p=8v~G;hOL^7SOXq^$5IDb+n$M|M0=@3hnK~ zEW5*-++PmLdCYx9wYLsCYLpY(llv7H7w?6%lRTcN4*Gk$)1}LrKs;EkGp-7s8yh3m zyK2HIh5YKYBn|t=&mV<{GKjF$iB`Ck4r90uChM5iJ1sgcj$G+^q*)Sdb|2p5E+H8Z z5C>PDbW7Xdaq-xdQdH4U%=L2-+L1`@jzV81!lmr%`!zUgwepbbCQ|euj}w?5CB?aU z7+#3th{mfL$~aQ6G7mW~#`rz+D)$|{WdH?p?8vL1uL^rYaJ%D0R+jo}6YV#KRHveU zOYa{)BRpxvaBnz%nQeJ&tGs{IrBUvixJ*|p9bg$&UlD_rZE%=eH+w5E^OUSpblH~{glCi@83iT01f;XN7KrCvM z2_;hLgVvkVk;e?*E1J~>{jB*6#}CV8f23}p^Zf3#o1gTk`| 4UXr#_W-Z8gJ;N3on?b{912RM;HTZL zemT<;?D`X5f6*mow@l?UZe{gke@S z9^|S?Os1%yLU~KpOw|S@Vma9Me2bLfY*g--ooqSAr-@n_LGA6=4;DM78|`3j@b9PI zaZQ;k`+KjeOPoe-E_TS%%hW9FM9I6 18tqhlnPyPcP#oc>TmpW>iugF z-gs#HXiZ`I@%k}FSm=k_r`0Y*J4c1GPAKU$K{>qd&AXLH4j!8mSS)fQu9rf(bpM+J zO$dSA&X__=o5D!Dxr4jAlDd`~BsZ-|QCneY-yq%78j(z>WBXNO5HoKmRsU+kB+2hm zd5tT}PGdx2lNs?_Co7bp#JMjV1Ab-ZW+!H*rNIirePOlTlWxED@&2AE>V=Wq1TIje zI&!@;a2+&j>c`B{)8#smtdG|ZV8q2#JpOhdT6TDIhd-5Xyi(Hp{SC9R6lJ%}ExUiM z1m#~@8+;fqU1kD=Qf4W&`A*Ui7E$+sjqP8IyZ}N4(F6DIiJcSiyh#2VQGN @MQ9~k?8Xyt!s<^MUY%v|$wGfF~$@twNpmo8?y?zDSY ze7w~_i5e!*PdKJtzLcTp* 9^WxNAE!-pxoEsgvFSMfLqW;{w6b2Q-^l>Q`>$ zx93S$dgQgNz>50?X-aX+45S@NK?D|WlQ+2tr#6Av7*ty>PnwZG{|a>7Eqp?{i_nA@ zl(Vv2ReuCQBPb8_=j(p6;ftstHFUAgM{-r<^GV?a*DO6v02{fgmPWooP%E7rFXN z5M!K+XS#c_IwvsiM+aqwkx?VTi<}F>I=bX#3SO6@FmngF+zqJsp~^V|S^NMDf_>nT z&fVpFinJF0odZEyjtKx7XTDT@ Ewis) zxW0JcR3tltbCJ*Yg4;@AM+6EKe@-RI2dqwDm2_ShR|lTn?2Zimv-;&&0K4T1tp&1p zD~SLgqT;Wy^FMLu|5tHnJsB9{QfhEr?0Qm8 *4 *Ip+|*7#Ll_=x`Z+XIM#W#Jq!80De$V&WbV^n zxLmy&fYerZEC%^iV -585~u)4vvbNq%x8dB?*%zMSfY;nxo`EK z`AJ}}I{+peE{{M%ax@Nr{cF%4Hxy(fpMcOjF- $9B~ zw6}q{yreIW-9`3g0SKGu5w?5CMAm;*k)h&T%L7qxJ
E(6E*RjDxyI5TV?A)vm{T&kACUEa872J~OqUN*+^qjS3SeFnWg^@Y%W%V^L zDB_wZ (n5Rn!*coBTweN(j9Bx@4w0lq^OF%8-xXd3|>+q!;D63(z=L z`4;73btbTSnducV @Z>Qh{K-asXU0(_ihD0$%s-iN784 zlk@T&h4b=ipeDiK*3jVZ(&sk-vx0YpC3nYN9I7*bW?|?3J0vu3q1HWGX4#8mBnn8B z-}*jW`W(WmR}y$PTKYiVMZyjS)fzq&$So|$%Zu3Dw9Or9oq-;txOT^Nt$1^H+(v4# zJKnoU3&BmOvJ{~9P*PIz$8gtckZX1WSl^S$C;Hu+ETX8QV%+7Tb`5M2N6Bk8SU_i? zJ6;NQYY?lc20ZHG1+IIBX=udktQvZOT|t^~@7uR-fEvqHdPv3m%?mgJ4jrA;Rq^vo z1e A+G6MPm=?DMLx!3~xjD166K_`mtK@(Aow|u1J#{SX`hSD>fjc zwa8b28N5Z_54g0NQ1G(|5)2!sB|PUvpW{W tp-6Xks7RNzba!{dH<#Y` z-upeC=iR^GAD@5aT5GO3#~kw<=Qzih@zI@;g5{6E&>>0OZ?V}7_#?Noq*1bY2)U$B zzUvd0GSO_M#RYH41$oEdB8c++1(X4QbU%K;$z0^w{?dIT_Kq{$30mntS$I-3DagB3 zr;1a|1C@FVO`+QpX( 0gEXc!Nrlt-YP%owyO zw*h=8Z)hn*`J2$ Cx^&iKg)y BV9%b1|@6{e${j(>IxR( zKN51Pzz3D#Zej&f0S+Cx>2k9`{<-S-=kFOn?#cHV{dcx3z#q)ttrj~b_{M*O8aFUW z6BD4w6 rp;mFdG}&cXuqc8&W<#9f=716=~lmzu^=bBzt#}Pk}bp zdr(tgVzrh_0Cxkv@OUeP3%d;iqv`svM_EZ}VPqCuLe6us9G5EDH&W)Zp{&*5X6vE1 z)E*I6Sy@RjrlqM#3&goqw}s5{faCA#?w0Ok)H W)Dw^;2>UO=<_5sbc&P68wlBYIL- zr#sHGhJf`# JL09=x40&;r&10!cF zwezp`U9ZmelDOx5*so9O*3uZj?S2^CtI%b;sfuBcZT|!mw$vGl5(zY=|Mqrs&=M1X z)c_fd`>HK*QUYe#_tH{Q2x<27wth9Zmo%P?=`1+pu6h#jxy6I(=e~ 7ZW2kUbwrbinha)$FO&>`3x+Mn3X_jc%+r0T)BSJjj;z(j#c}m0?fPV-e%KR( z<5e73XuP}<4F841dCh7po CCLE(_&1V#MyvZ3tC;8UOJk!NCy_ zQg_$P`EB_q2z(f8_VreBzg6{B@b&*yYS@2P5F|E=pfsLWx>_}^kBM!SCwkMN2riRP zHE20#C+OFc-h94WyJYe;0B&)$(aM()TBlvGPWA4=kQVhnQupTo OdV#)Kk-k+?r03Bp?8S?~qb)Am$zU)3A~UIx z&!PzCh52XbKp7)DR;ab4J6vh0q7;>o*AOvc?4TA^mg+w1* Vq}QhXb%dE)*wk1qr`@RT0a(oB69Jpr)IQ03k~BQw%;t%OS$@(u1dg zPE!~f7+;XhWaUP1@~Ck+eWpg#Cr9W%5Pt#B_Qw_Sf>Uqf=L0$G;M2Cz&B13UtY@2w z?zg#oZ>@+oG22HTe;NI}ySXvbP{XKI{^LUXX3q8m$+U`SbGZBP@Q_@D{6yL6#A)+G z(4$mUL@*$!wrbm{?|XFkd~StD7`CoCaZ^WDlY-r#6+ysb{+r`rCs1_ucCJUg?elKG zs?gGJ$Wsc*wbJy 8sKs?dx+W>Zz xW1sWv*J*7U-Nx%%8Zo_4l724mD2F`T8$!IAi(I(RR z&Ed9@@lAPR?1u@7iM;N|sx#u5e%XSCvNu6t_1O^3zRS$(vH!`LTXFPk)bl<9N;o~G zva!Y;M+N=tx7P?kLRxZ7wUc3 r_U~`@91a3= zQeT#|%)tFq_y!Nedy-h9YOQmv^s$F>&rtFjf=Bp*^HENe)lMQwPb~RHqp0ORbOJ3{ zCfIlVH3dOJeIL1#Dh31_#;8WGe|ew8ZhsaHB6cjEI%;3)fs_;hB= c&P<~Pl zF`UX;0q)BJ|F2N{v=N&3p1zdU`X%FS=in8>a)C-;B)VErg?ec|lyO2xQ3hZZMq9=n z5mF@ZsW4$~({9k O!py*z0ep}C@v}UbLM||FcqlgLwF63AY;0^chk4 C3%fS(@_&A8u|;51`^ z5_;)P-tk(4JD%BA8555jZ5#vRK}H`V2I%??MNDD99Cg44*uk`)qmcdm@_A3G%w1At zcMK}8<&}5KHA$vayx}L~m>61fMmQiyRs!x(Jn#n{u#W`bvsGok@rOjyzV|gBMTA%T z8qv|`wp|dtMJ%w6|M^jfs^$+R0KCx~AlQILMrj1DzWJZ81m8 `wwL70I3xPWVR&8Da(tq7=i9Lk~~^U>UaR#^l;t! zz<=4-HzN5NhaUA4nUcNATz`Fab!wez8^`{E{{BRu0h7>eFl>F8S9pCpJR$Nqy3&45 zUs hx~=^|HRDJtGm+ 3?@MmvO5s z8HU4TGF|J4-YR%|z9cCd7aL0s8ZO4fP)JIHt!oMprLv+TDGv{iQ$NpIt&+N~F%V<6 zwTpwu2{iMFF-11zL8OG>L&$l(f}B*QcTg@Uxt+!e=BD)8m{IoJXd2R%*%+c$Ye$t! zl1L`!J5}$TTTAL%u3$^~WHECpde}o#-6JllBc*SC(*GID^P)*vX^$&^M{#`GLqD5A z#_#rGEvvNj8UGk?-OS0!b5VNO7@XE)vL84s$q`TpqXoQApRd)}PO0|`-T8=+Yw&&} zh5RWWWDw8U9^FF>2DstzCM3mn21_0d4;pfh=!uQrtbEFC8Ru6OcG>&E=;`-OP^+R! z^&v?*m2bUCx86Wvr!hBIECI<3HFuOH+1oa3Htz#J%lKq^?kHO_|1@94L|?szYp{v1 zIPJ(gntiX9vy$|k-YG^!si~@VetPj5f`SW%1tJ;f6cU|f9mHEcci<8e9M|#4OVk)x z95p%y)ew9!6lUrIAK`=-zkr4aJeE?xM}xT`q>xR_#WgU=al-s$gCjLECjCR@+IW7R zj@gCh^*@mU`w4$arM+*E^z)Hmzi@C3DV(H@O;%?FgQIKlwo8)58x|R}V@g2P!0pO1 z=ZND=6C};Elx%*zo=I$((Jr^FS!ogD1EzMU*3o$FpbSjtbN9zL>ykpeR#M091ooW( zv{5lJ$$_gNWToPzFn>1_aL@uqXR7#4l=Lf@T{t^GUl|(8e1%|8b_is%2XDmO1yv~1 z?Q?GqO1)Wn;?37^pSvSe*`-mJ_>~$w3PYK5JpRu2)@dO+d#Fw>)MieFSx9hcKkSR- zT$$49HFL*>xAtoZNqF(psmyLs4Q|r`s zf4{>YnjQJ!g;K^I)g*vXy=ekdc;4H;%KB;I OXBJqUY;c3N(wTdb0Fp`;LS%6 z2ky~OB;A3_|JDZzFpD}j0a|@9wwYTWm+O7DJ5;R42UAc;l27I3*`vtkJ$I>C-cd7y zX3Po#*r1yGU!iyqxJDwo9K_kVDxk7h3ORcgmN_e@Iu$dOuPc!rzX~r*Pb=eQGW?Gg zz{~Dijnk)Ea-V!Jt&;~iTrprGQ}zVT27EJiId~ThZrML{;@z-g-nvxKr27ojSxfn* zG+h>KD$c2N0F0IiF4$R!&b Hj|Un6ET%w=>p7G_N#|rI`@0fQ{-y65 zF{F7%I#6v#16+IMa+v602VR?NG0)&9i|-q9ri)sA7;I`RxwDO)6{`M)g;rlR41Co9 zzQ?)sxB}hAPo7Rrn5U;I+J@*h+RgAP!M%S}_Yj3}y)X(o!Vo_I3;oI4?}ffE56ps3 zXGxO!Z?Olw5gKS_qC8Bv6W2d7u!I~MX^9gnX=lL@QK4+CDd!+hMfpg+L<@{;1jGYB zb^)fV0myhdw$g!6g#7Wx?pQ!}$^ZK#^t=1MF-aXtLtB6F-3HIq$e35-U(^)Zn*7ho zN)B2mT7}YI7}S;Se~FNLd-rsMA~h-S5OU5%iW2M|J_Zz`1n$I7v^8?~FM1+uEytC> zJAV-aw+n#}X!C(QjnlwTeGI4)u%>$qLYgm#wdfc-zck3k1-wf2*DPLV%*k0X-82y0 zF0)5MSFZiS`!7F-ivsVymf1_}mf1@fv(__Ebn(e~Qg=5wb`ptsj0rYa^L m z#he!&O)4MQm-59@TFO7AMqyyR7_F#fUXXTyKZe-_^bccVY)lhbfqX>`Sd3|$6LbE5 zYLt$_@$~=vlOH{PY D^TLz1?~)^VrL&-!o!2w*!%=oO{yhL z5&d2^aCXU)JS3acl!tK1bimW_1)>UFD|UBxR~9hDyeh6;1f`@TceJ)s)p90Ji%O^{ zhw25eKs6RIptC%m^zI|VgEDGb;l4=MJa7R)s3W-j 6jP~YA+Z;y15YJIRI*=yVG@` z?%%v%tj!3D<3NQm@ZF%;`hWUv#7waGq*MKn@d`tywiTC*_*Y}#R-*#th|{7wmv@!; zz+3kLmyX^56&3zhirN+Ih(EF8f8)D>EBam8eGkNTSe?}s7V!L#rM?-Bd;xAlS*Iv~ z##|fsr-J;yQPhFFkY~Y%0NsD%yZ;0Mf87fNDDRQUlorRmKS?jEj!%FjKaNp@xSVO& zpF#akikex3ycJ)f4!lK}2uzU;G8B44HBG+@!TuM%8_WU3`3DLED|%4A!-x;30LIC0 zSY@mzLe6*DNe?Z`?%%cP|9>Ll|BXb%zgPM1Qwr_hdt+Y=9K4w7d=IH8%fCbwLIqTy z>L036{O=i}O~^xAL)P`*Rv8=xzk4OXD+7-aZEHS==s^x322ughYjAhbprkr9L7+td zbaejr?KcV!JO|pX)pBP{Y KqtJSI4 fGTElToePuhl{+be_D_T84L!C0mV+q{GR3f$3I1%{Z6$0*T;;o{QM$` zI#Fpkj80=_V$unEfr|;eYKOjn^d-O&fAV7Me~OejiUOhhgdz^)*4};{RuE#UnQ{BL zJypZ9xD9xlkV`zk%z(`;0Jh!faclzV-{q;oOBYBX9Cj#K(03^zg0d#58SzSw1EURa zyB?N?GYIRzujs(9vRy)X(SL#_e^PhER7D~p8JUCZP~qVG-^Eg$*y;}<#<>zelA&TM ztTzE=;8*R{{a4??JqFxn523wo9heUlR&`oiwnLS7e=hFvHk0_u1)RVX@8+TxD9!z0 zLJRR%u)m4APCyxZ;wr^@{oxA7!Bh1gvkTt)262V*CC2)6WJ 7Ie?7Mrb|H z7lJOt*qItcl^{>E2!0Skz;+L;3^-toX#VhEKVkDAzYu5Ilh_q_AHf8yGZc6~Uzzb- zOFbObFo0QF<~3fde(XPEZaP->TnwQ}F%UYNc6I{yJMQ}u{zAQOo*#g_C49b_et$sl zsxa4o3@Qx){QvUhR*8GRLA^_!&p{jRP>~Kd&%zr_F@gH7zyLcimU`DWUTDw2T@Rhp zv!41qWHD<$WEI1{^6fQJJjP*+o@sFJ0b`(9OY<&v9y=NkVrg*OiDlNSmjcHwsJ-pD z@PmQ-TYyQ)$h7{+41*%x5g`R|-39-#;z1 z2Fa+aCz6;x`)x^o-8*@ts;&-_6QRztBY7&nYimKmt_uVh%b $(fhD@K*+~tR*IR zxPkNFfPGN1rd0C&cSTOPsPJ1+P+S}br7S?kX}O!BB-|K_`HvO?)T#W=NeS`sy6 N3hCGR6S&pUJa7*&GE~ zZff7F)6sJM(7y#^>ToB1jpk{d5>Va~0tS%YrC+a%5YYqR`sJ!;OB85Ot hI7*xf05Mw6)86m^TVQ(Ct|M(HK++P77yTKBS(jFU|KN?w)|gyz{bv4t2Lgi0 z1>@fq^&Vc|@4~chJtIu)20;+vUI_4WR2dyrfcX4fKcfh8;piVJz;u4^j}p9;lIK~8 z*JN3N(iUJ}-=iw^zw@g*>gNNDl43va7Gv@=Ly=Eo14c9dJ6kY_D4WVV>N%&VudmOM z ^ z&!$TDKL0%qhy@QsCg76Fkx#`ScvEm61e{p4i4`y5`5}Q@_}FzIz>s^NlNdCced-$T zZm-x(yRleu3~m1Y4vJE @E^(x^2}fj zZXfvo`s8=vJIIc-x^G|Vz*Qszai59NcrG5C0D%3++hI6r=#apsC{*#zy#g@oPOZq? z7HYU{&=Y`z|M)eQN@f`tezmPuVFv}+Mo};Ea035=a8T*SAaimwtv21&00T2~qQT9k zM*me1vCsaCE8N~kf0QLZrCtL29|AX|M$l(q&4B&wvW0j;`V!*$>za-lokYk7LLxrQ zx8WMZ%P`md$o)Wv1I|RSc*76CY|?DTiLn5`$FtXXBx`_j;tgo`Wpu_?ax`J^@qcj% zOj2P2C6(!(=O#) =q-3&drDy8P=;1n=R99~RVzqdp{z{Wi=d2ugZKTK|ZvUvtI zQlij&Cr%mwOaRWtt5SxVGE}|0`6x6rbU9JSE@paKw{E9;YFmet;qQ(4G7!}JN`qUj zkoDoR8lcTxO}j*frVDNE)8^R(OpH+(lN}_$%f_~a;r0~O%v$Z>Yd!t5hSZM=wJIcb zo6hvt(g(qFxEzs2w*OJUf@B$xsZ5?*B+C7V%IWvY^Y4GXUv4!@f6;PxCDhf~x$o{| zHVnXsR8O@c);$TZdUz9D{-Gci>d?y3n)TXZ!sE1xm#0$tTWy3mLhb-MCiFnZNW6;t zHv~Aq*<*qe`2R=~2z1Aq^{3DQ0Ydoo#ejceN=nL0rnJ$2iMRgM2SAt|%zGbxh6>Lc zz-G5jX+L`OXgT|%UF>6)Mn&Ly*LF<8|IwcoKk_-9FdxcMAkpYBc~$`|rgsx}l>Ac# zu$cZCn3L`A_;p~IMYmQFlzZ W@QMJ_v&oH3tk$NnW~ zvjD2vOf69t`k-j396QB-K9y9l;cJQC3ByE VN+fpg%|%IMiOw2p ?*@e02DS+ai*@b!#&(x1RN(^YD)$y!MKSx0yp%GRrj-wft37z` ce%*Z5wR5{k5wbIrKugZ6osvM|x!~efw!QJle#%h}oWJTl4UE z04w^o t&%S?8i7lqOS2!nv!5C*fuAj8R0uqi}UQT}A}y({6F! zl9+Zpxhn0c`>6b+P!&H1xLc^8p0@puSTc^+$uw)*&-}AZuYY@;b8dMf|AG_#$#ZpH zeIBJr12+Ak4;(NL{)eSdTB|v&z8WYO#%ZhY*VDXr(MPAe_nO8l>Tm0hDLfrVah--c z(T6w~hATXuJ`FTM@~LPLCQdt3xM AC12`dG+TnSPdRiYi?|O_XKsP3%3`tcCS7 z>8pP=W1QX >H9uShaLMKq!EV-x^$J%}S0w$I?)!pE&Rac{%Vs|_S5ZB&vT6Mu z%`+?BPc1ag&vKK&Jer;MCFKKp%kb0{ 3FhM5Pz?5hov_Q0#5-T=by1k{a=gLk$5xC=YdWxOmgV2TDbhC+0G$3> z`o-Cte@o7mxq|@kg~#in{Az@gEe6%i9HLySLQDwF=jF3x+Uefa+wZT;n%3H!MYM;h zhwQG~Vx315hI08xM$n@^BaZ`_+fVVRG3fX#Y-_cfFraNs^HRTcnxOjLkjG@lA@lgL z&D2@Zwc)N#`Q|%o#XRc$+sQg*#YUY=7fOC(V|dZ|3c0XMaWfg7qOCe@CXeg$11Hdy zvS !O ^a6G pv}r_ciQe_}IxHLJ&{)6>0jee28r@pT~j zPr3O#cigUD#tq%){KRF2n| c(9V3uqLS=kUZj3O4 z)t8s@I)L+D3FB48^>y!Em6-tJ4@Pi|-dw6_xk*(Ic+S*WTMR6s>M}X3OUfA47tjm_ z