From 6e4ab22d4c806b4ed2b4a6b2bfaca6a1e01a8c8a Mon Sep 17 00:00:00 2001
From: wkc <978997012@qq.com>
Date: Mon, 26 Jan 2026 18:20:13 +0800
Subject: [PATCH] init
---
.claude/agents/kfc/spec-design.md | 158 ++
.claude/agents/kfc/spec-impl.md | 39 +
.claude/agents/kfc/spec-judge.md | 125 ++
.claude/agents/kfc/spec-requirements.md | 123 ++
.../agents/kfc/spec-system-prompt-loader.md | 38 +
.claude/agents/kfc/spec-tasks.md | 183 ++
.claude/agents/kfc/spec-test.md | 108 +
.claude/settings/kfc-settings.json | 24 +
.../system-prompts/spec-workflow-starter.md | 306 +++
.gitignore | 47 +
LICENSE | 20 +
README.md | 95 +
bin/clean.bat | 12 +
bin/package.bat | 12 +
bin/run.bat | 14 +
doc/若依环境使用手册.docx | Bin 0 -> 428152 bytes
pom.xml | 255 +++
ruoyi-admin/pom.xml | 89 +
.../main/java/com/ruoyi/RuoYiApplication.java | 30 +
.../com/ruoyi/RuoYiServletInitializer.java | 18 +
.../controller/common/CaptchaController.java | 94 +
.../controller/common/CommonController.java | 162 ++
.../controller/monitor/CacheController.java | 122 ++
.../controller/monitor/ServerController.java | 27 +
.../monitor/SysLogininforController.java | 82 +
.../monitor/SysOperlogController.java | 69 +
.../monitor/SysUserOnlineController.java | 83 +
.../system/SysConfigController.java | 133 ++
.../controller/system/SysDeptController.java | 132 ++
.../system/SysDictDataController.java | 121 +
.../system/SysDictTypeController.java | 131 ++
.../controller/system/SysIndexController.java | 29 +
.../controller/system/SysLoginController.java | 131 ++
.../controller/system/SysMenuController.java | 150 ++
.../system/SysNoticeController.java | 91 +
.../controller/system/SysPostController.java | 129 ++
.../system/SysProfileController.java | 149 ++
.../system/SysRegisterController.java | 38 +
.../controller/system/SysRoleController.java | 262 +++
.../controller/system/SysUserController.java | 256 +++
.../web/controller/tool/TestController.java | 175 ++
.../ruoyi/web/core/config/SwaggerConfig.java | 64 +
.../META-INF/spring-devtools.properties | 1 +
.../src/main/resources/application-dev.yml | 103 +
.../src/main/resources/application.yml | 106 +
ruoyi-admin/src/main/resources/banner.txt | 24 +
.../main/resources/i18n/messages.properties | 38 +
ruoyi-admin/src/main/resources/logback.xml | 93 +
.../main/resources/mybatis/mybatis-config.xml | 20 +
ruoyi-common/pom.xml | 136 ++
.../ruoyi/common/annotation/Anonymous.java | 19 +
.../ruoyi/common/annotation/DataScope.java | 33 +
.../ruoyi/common/annotation/DataSource.java | 28 +
.../com/ruoyi/common/annotation/Excel.java | 198 ++
.../com/ruoyi/common/annotation/Excels.java | 18 +
.../java/com/ruoyi/common/annotation/Log.java | 51 +
.../ruoyi/common/annotation/RateLimiter.java | 40 +
.../ruoyi/common/annotation/RepeatSubmit.java | 31 +
.../ruoyi/common/annotation/Sensitive.java | 24 +
.../com/ruoyi/common/config/RuoYiConfig.java | 122 ++
.../serializer/SensitiveJsonSerializer.java | 67 +
.../ruoyi/common/constant/CacheConstants.java | 44 +
.../com/ruoyi/common/constant/Constants.java | 173 ++
.../ruoyi/common/constant/GenConstants.java | 117 +
.../com/ruoyi/common/constant/HttpStatus.java | 94 +
.../common/constant/ScheduleConstants.java | 50 +
.../ruoyi/common/constant/UserConstants.java | 81 +
.../core/controller/BaseController.java | 202 ++
.../ruoyi/common/core/domain/AjaxResult.java | 216 ++
.../ruoyi/common/core/domain/BaseEntity.java | 118 +
.../java/com/ruoyi/common/core/domain/R.java | 115 +
.../ruoyi/common/core/domain/TreeEntity.java | 79 +
.../ruoyi/common/core/domain/TreeSelect.java | 93 +
.../common/core/domain/entity/SysDept.java | 203 ++
.../core/domain/entity/SysDictData.java | 176 ++
.../core/domain/entity/SysDictType.java | 96 +
.../common/core/domain/entity/SysMenu.java | 274 +++
.../common/core/domain/entity/SysRole.java | 241 ++
.../common/core/domain/entity/SysUser.java | 336 +++
.../common/core/domain/model/LoginBody.java | 69 +
.../common/core/domain/model/LoginUser.java | 266 +++
.../core/domain/model/RegisterBody.java | 11 +
.../ruoyi/common/core/page/PageDomain.java | 101 +
.../ruoyi/common/core/page/TableDataInfo.java | 85 +
.../ruoyi/common/core/page/TableSupport.java | 56 +
.../ruoyi/common/core/redis/RedisCache.java | 268 +++
.../ruoyi/common/core/text/CharsetKit.java | 86 +
.../com/ruoyi/common/core/text/Convert.java | 1018 +++++++++
.../ruoyi/common/core/text/StrFormatter.java | 92 +
.../ruoyi/common/enums/BusinessStatus.java | 20 +
.../com/ruoyi/common/enums/BusinessType.java | 59 +
.../ruoyi/common/enums/DataSourceType.java | 19 +
.../ruoyi/common/enums/DesensitizedType.java | 59 +
.../com/ruoyi/common/enums/HttpMethod.java | 36 +
.../com/ruoyi/common/enums/LimitType.java | 20 +
.../com/ruoyi/common/enums/OperatorType.java | 24 +
.../com/ruoyi/common/enums/UserStatus.java | 30 +
.../common/exception/DemoModeException.java | 15 +
.../common/exception/GlobalException.java | 58 +
.../common/exception/ServiceException.java | 74 +
.../ruoyi/common/exception/UtilException.java | 26 +
.../common/exception/base/BaseException.java | 97 +
.../common/exception/file/FileException.java | 19 +
.../FileNameLengthLimitExceededException.java | 16 +
.../file/FileSizeLimitExceededException.java | 16 +
.../exception/file/FileUploadException.java | 61 +
.../file/InvalidExtensionException.java | 80 +
.../common/exception/job/TaskException.java | 34 +
.../exception/user/BlackListException.java | 16 +
.../exception/user/CaptchaException.java | 16 +
.../user/CaptchaExpireException.java | 16 +
.../common/exception/user/UserException.java | 18 +
.../user/UserNotExistsException.java | 16 +
.../user/UserPasswordNotMatchException.java | 16 +
...UserPasswordRetryLimitExceedException.java | 16 +
.../filter/PropertyPreExcludeFilter.java | 24 +
.../ruoyi/common/filter/RefererFilter.java | 77 +
.../ruoyi/common/filter/RepeatableFilter.java | 52 +
.../filter/RepeatedlyRequestWrapper.java | 76 +
.../com/ruoyi/common/filter/XssFilter.java | 75 +
.../filter/XssHttpServletRequestWrapper.java | 111 +
.../java/com/ruoyi/common/utils/Arith.java | 113 +
.../com/ruoyi/common/utils/DateUtils.java | 192 ++
.../ruoyi/common/utils/DesensitizedUtil.java | 49 +
.../com/ruoyi/common/utils/DictUtils.java | 217 ++
.../com/ruoyi/common/utils/ExceptionUtil.java | 39 +
.../java/com/ruoyi/common/utils/LogUtils.java | 18 +
.../com/ruoyi/common/utils/MessageUtils.java | 26 +
.../com/ruoyi/common/utils/PageUtils.java | 35 +
.../com/ruoyi/common/utils/SecurityUtils.java | 188 ++
.../com/ruoyi/common/utils/ServletUtils.java | 218 ++
.../com/ruoyi/common/utils/StringUtils.java | 723 ++++++
.../java/com/ruoyi/common/utils/Threads.java | 99 +
.../ruoyi/common/utils/bean/BeanUtils.java | 110 +
.../common/utils/bean/BeanValidators.java | 24 +
.../common/utils/file/FileTypeUtils.java | 76 +
.../common/utils/file/FileUploadUtils.java | 260 +++
.../ruoyi/common/utils/file/FileUtils.java | 303 +++
.../ruoyi/common/utils/file/ImageUtils.java | 98 +
.../common/utils/file/MimeTypeUtils.java | 59 +
.../ruoyi/common/utils/html/EscapeUtil.java | 167 ++
.../ruoyi/common/utils/html/HTMLFilter.java | 570 +++++
.../ruoyi/common/utils/http/HttpHelper.java | 55 +
.../ruoyi/common/utils/http/HttpUtils.java | 293 +++
.../common/utils/http/UserAgentUtils.java | 254 +++
.../ruoyi/common/utils/ip/AddressUtils.java | 56 +
.../com/ruoyi/common/utils/ip/IpUtils.java | 382 ++++
.../common/utils/poi/ExcelHandlerAdapter.java | 24 +
.../com/ruoyi/common/utils/poi/ExcelUtil.java | 1944 +++++++++++++++++
.../common/utils/reflect/ReflectUtils.java | 412 ++++
.../com/ruoyi/common/utils/sign/Base64.java | 291 +++
.../com/ruoyi/common/utils/sign/Md5Utils.java | 67 +
.../common/utils/spring/SpringUtils.java | 164 ++
.../com/ruoyi/common/utils/sql/SqlUtil.java | 70 +
.../com/ruoyi/common/utils/uuid/IdUtils.java | 49 +
.../java/com/ruoyi/common/utils/uuid/Seq.java | 86 +
.../com/ruoyi/common/utils/uuid/UUID.java | 484 ++++
.../main/java/com/ruoyi/common/xss/Xss.java | 27 +
.../com/ruoyi/common/xss/XssValidator.java | 39 +
ruoyi-framework/pom.xml | 64 +
.../framework/aspectj/DataScopeAspect.java | 184 ++
.../framework/aspectj/DataSourceAspect.java | 72 +
.../ruoyi/framework/aspectj/LogAspect.java | 264 +++
.../framework/aspectj/RateLimiterAspect.java | 89 +
.../framework/config/ApplicationConfig.java | 30 +
.../ruoyi/framework/config/CaptchaConfig.java | 83 +
.../ruoyi/framework/config/DruidConfig.java | 126 ++
.../config/FastJson2JsonRedisSerializer.java | 52 +
.../ruoyi/framework/config/FilterConfig.java | 80 +
.../ruoyi/framework/config/I18nConfig.java | 43 +
.../framework/config/KaptchaTextCreator.java | 68 +
.../framework/config/MybatisPlusConfig.java | 63 +
.../ruoyi/framework/config/RedisConfig.java | 70 +
.../framework/config/ResourcesConfig.java | 72 +
.../framework/config/SecurityConfig.java | 128 ++
.../ruoyi/framework/config/ServerConfig.java | 32 +
.../framework/config/ThreadPoolConfig.java | 63 +
.../config/properties/DruidProperties.java | 89 +
.../properties/PermitAllUrlProperties.java | 73 +
.../datasource/DynamicDataSource.java | 26 +
.../DynamicDataSourceContextHolder.java | 45 +
.../interceptor/RepeatSubmitInterceptor.java | 56 +
.../impl/SameUrlDataInterceptor.java | 110 +
.../ruoyi/framework/manager/AsyncManager.java | 55 +
.../framework/manager/ShutdownManager.java | 39 +
.../manager/factory/AsyncFactory.java | 102 +
.../context/AuthenticationContextHolder.java | 28 +
.../context/PermissionContextHolder.java | 27 +
.../filter/JwtAuthenticationTokenFilter.java | 44 +
.../handle/AuthenticationEntryPointImpl.java | 34 +
.../handle/LogoutSuccessHandlerImpl.java | 53 +
.../ruoyi/framework/web/domain/Server.java | 240 ++
.../framework/web/domain/server/Cpu.java | 101 +
.../framework/web/domain/server/Jvm.java | 130 ++
.../framework/web/domain/server/Mem.java | 61 +
.../framework/web/domain/server/Sys.java | 84 +
.../framework/web/domain/server/SysFile.java | 114 +
.../web/exception/GlobalExceptionHandler.java | 145 ++
.../web/service/PermissionService.java | 159 ++
.../web/service/SysLoginService.java | 176 ++
.../web/service/SysPasswordService.java | 86 +
.../web/service/SysPermissionService.java | 89 +
.../web/service/SysRegisterService.java | 117 +
.../framework/web/service/TokenService.java | 232 ++
.../web/service/UserDetailsServiceImpl.java | 66 +
ruoyi-generator/pom.xml | 40 +
.../com/ruoyi/generator/config/GenConfig.java | 87 +
.../generator/controller/GenController.java | 263 +++
.../com/ruoyi/generator/domain/GenTable.java | 385 ++++
.../generator/domain/GenTableColumn.java | 373 ++++
.../mapper/GenTableColumnMapper.java | 60 +
.../generator/mapper/GenTableMapper.java | 91 +
.../service/GenTableColumnServiceImpl.java | 68 +
.../service/GenTableServiceImpl.java | 531 +++++
.../service/IGenTableColumnService.java | 44 +
.../generator/service/IGenTableService.java | 130 ++
.../com/ruoyi/generator/util/GenUtils.java | 257 +++
.../generator/util/VelocityInitializer.java | 34 +
.../ruoyi/generator/util/VelocityUtils.java | 408 ++++
.../src/main/resources/generator.yml | 12 +
.../mapper/generator/GenTableColumnMapper.xml | 127 ++
.../mapper/generator/GenTableMapper.xml | 210 ++
.../main/resources/vm/java/controller.java.vm | 115 +
.../src/main/resources/vm/java/domain.java.vm | 105 +
.../src/main/resources/vm/java/mapper.java.vm | 91 +
.../main/resources/vm/java/service.java.vm | 61 +
.../resources/vm/java/serviceImpl.java.vm | 169 ++
.../main/resources/vm/java/sub-domain.java.vm | 76 +
.../src/main/resources/vm/js/api.js.vm | 44 +
.../src/main/resources/vm/sql/sql.vm | 22 +
.../main/resources/vm/vue/index-tree.vue.vm | 505 +++++
.../src/main/resources/vm/vue/index.vue.vm | 602 +++++
.../resources/vm/vue/v3/index-tree.vue.vm | 474 ++++
.../src/main/resources/vm/vue/v3/index.vue.vm | 590 +++++
.../src/main/resources/vm/xml/mapper.xml.vm | 140 ++
ruoyi-quartz/pom.xml | 34 +
.../ruoyi/quartz/config/ScheduleConfig.java | 57 +
.../quartz/controller/SysJobController.java | 185 ++
.../controller/SysJobLogController.java | 92 +
.../java/com/ruoyi/quartz/domain/SysJob.java | 171 ++
.../com/ruoyi/quartz/domain/SysJobLog.java | 155 ++
.../ruoyi/quartz/mapper/SysJobLogMapper.java | 64 +
.../com/ruoyi/quartz/mapper/SysJobMapper.java | 67 +
.../quartz/service/ISysJobLogService.java | 56 +
.../ruoyi/quartz/service/ISysJobService.java | 102 +
.../service/impl/SysJobLogServiceImpl.java | 87 +
.../service/impl/SysJobServiceImpl.java | 261 +++
.../java/com/ruoyi/quartz/task/RyTask.java | 28 +
.../ruoyi/quartz/util/AbstractQuartzJob.java | 106 +
.../java/com/ruoyi/quartz/util/CronUtils.java | 63 +
.../com/ruoyi/quartz/util/JobInvokeUtil.java | 182 ++
.../QuartzDisallowConcurrentExecution.java | 21 +
.../ruoyi/quartz/util/QuartzJobExecution.java | 19 +
.../com/ruoyi/quartz/util/ScheduleUtils.java | 141 ++
.../mapper/quartz/SysJobLogMapper.xml | 94 +
.../resources/mapper/quartz/SysJobMapper.xml | 111 +
ruoyi-system/pom.xml | 28 +
.../com/ruoyi/system/domain/SysCache.java | 81 +
.../com/ruoyi/system/domain/SysConfig.java | 111 +
.../ruoyi/system/domain/SysLogininfor.java | 144 ++
.../com/ruoyi/system/domain/SysNotice.java | 102 +
.../com/ruoyi/system/domain/SysOperLog.java | 269 +++
.../java/com/ruoyi/system/domain/SysPost.java | 124 ++
.../com/ruoyi/system/domain/SysRoleDept.java | 46 +
.../com/ruoyi/system/domain/SysRoleMenu.java | 46 +
.../ruoyi/system/domain/SysUserOnline.java | 113 +
.../com/ruoyi/system/domain/SysUserPost.java | 46 +
.../com/ruoyi/system/domain/SysUserRole.java | 46 +
.../com/ruoyi/system/domain/vo/MetaVo.java | 106 +
.../com/ruoyi/system/domain/vo/RouterVo.java | 148 ++
.../ruoyi/system/mapper/SysConfigMapper.java | 76 +
.../ruoyi/system/mapper/SysDeptMapper.java | 118 +
.../system/mapper/SysDictDataMapper.java | 95 +
.../system/mapper/SysDictTypeMapper.java | 83 +
.../system/mapper/SysLogininforMapper.java | 42 +
.../ruoyi/system/mapper/SysMenuMapper.java | 134 ++
.../ruoyi/system/mapper/SysNoticeMapper.java | 60 +
.../ruoyi/system/mapper/SysOperLogMapper.java | 48 +
.../ruoyi/system/mapper/SysPostMapper.java | 99 +
.../system/mapper/SysRoleDeptMapper.java | 44 +
.../ruoyi/system/mapper/SysRoleMapper.java | 107 +
.../system/mapper/SysRoleMenuMapper.java | 44 +
.../ruoyi/system/mapper/SysUserMapper.java | 147 ++
.../system/mapper/SysUserPostMapper.java | 44 +
.../system/mapper/SysUserRoleMapper.java | 62 +
.../system/service/ISysConfigService.java | 89 +
.../ruoyi/system/service/ISysDeptService.java | 124 ++
.../system/service/ISysDictDataService.java | 60 +
.../system/service/ISysDictTypeService.java | 98 +
.../system/service/ISysLogininforService.java | 40 +
.../ruoyi/system/service/ISysMenuService.java | 152 ++
.../system/service/ISysNoticeService.java | 60 +
.../system/service/ISysOperLogService.java | 48 +
.../ruoyi/system/service/ISysPostService.java | 99 +
.../ruoyi/system/service/ISysRoleService.java | 173 ++
.../system/service/ISysUserOnlineService.java | 48 +
.../ruoyi/system/service/ISysUserService.java | 217 ++
.../service/impl/SysConfigServiceImpl.java | 232 ++
.../service/impl/SysDeptServiceImpl.java | 337 +++
.../service/impl/SysDictDataServiceImpl.java | 111 +
.../service/impl/SysDictTypeServiceImpl.java | 223 ++
.../impl/SysLogininforServiceImpl.java | 65 +
.../service/impl/SysMenuServiceImpl.java | 589 +++++
.../service/impl/SysNoticeServiceImpl.java | 92 +
.../service/impl/SysOperLogServiceImpl.java | 76 +
.../service/impl/SysPostServiceImpl.java | 178 ++
.../service/impl/SysRoleServiceImpl.java | 426 ++++
.../impl/SysUserOnlineServiceImpl.java | 96 +
.../service/impl/SysUserServiceImpl.java | 565 +++++
.../mapper/system/SysConfigMapper.xml | 117 +
.../resources/mapper/system/SysDeptMapper.xml | 159 ++
.../mapper/system/SysDictDataMapper.xml | 124 ++
.../mapper/system/SysDictTypeMapper.xml | 105 +
.../mapper/system/SysLogininforMapper.xml | 57 +
.../resources/mapper/system/SysMenuMapper.xml | 211 ++
.../mapper/system/SysNoticeMapper.xml | 89 +
.../mapper/system/SysOperLogMapper.xml | 87 +
.../resources/mapper/system/SysPostMapper.xml | 122 ++
.../mapper/system/SysRoleDeptMapper.xml | 34 +
.../resources/mapper/system/SysRoleMapper.xml | 152 ++
.../mapper/system/SysRoleMenuMapper.xml | 34 +
.../resources/mapper/system/SysUserMapper.xml | 227 ++
.../mapper/system/SysUserPostMapper.xml | 34 +
.../mapper/system/SysUserRoleMapper.xml | 44 +
ruoyi-ui/.editorconfig | 22 +
ruoyi-ui/.env.development | 11 +
ruoyi-ui/.env.production | 8 +
ruoyi-ui/.env.staging | 12 +
ruoyi-ui/.gitignore | 23 +
ruoyi-ui/README.md | 30 +
ruoyi-ui/babel.config.js | 13 +
ruoyi-ui/bin/build.bat | 12 +
ruoyi-ui/bin/package.bat | 12 +
ruoyi-ui/bin/run-web.bat | 12 +
ruoyi-ui/build/index.js | 35 +
ruoyi-ui/package.json | 72 +
ruoyi-ui/public/favicon.ico | Bin 0 -> 5663 bytes
ruoyi-ui/public/html/ie.html | 46 +
ruoyi-ui/public/index.html | 208 ++
ruoyi-ui/public/robots.txt | 2 +
ruoyi-ui/public/styles/theme-chalk/index.css | 1 +
ruoyi-ui/src/App.vue | 20 +
ruoyi-ui/src/api/login.js | 60 +
ruoyi-ui/src/api/menu.js | 9 +
ruoyi-ui/src/api/monitor/cache.js | 57 +
ruoyi-ui/src/api/monitor/job.js | 71 +
ruoyi-ui/src/api/monitor/jobLog.js | 26 +
ruoyi-ui/src/api/monitor/logininfor.js | 34 +
ruoyi-ui/src/api/monitor/online.js | 18 +
ruoyi-ui/src/api/monitor/operlog.js | 26 +
ruoyi-ui/src/api/monitor/server.js | 9 +
ruoyi-ui/src/api/system/config.js | 60 +
ruoyi-ui/src/api/system/dept.js | 52 +
ruoyi-ui/src/api/system/dict/data.js | 52 +
ruoyi-ui/src/api/system/dict/type.js | 60 +
ruoyi-ui/src/api/system/menu.js | 60 +
ruoyi-ui/src/api/system/notice.js | 44 +
ruoyi-ui/src/api/system/post.js | 44 +
ruoyi-ui/src/api/system/role.js | 119 +
ruoyi-ui/src/api/system/user.js | 136 ++
ruoyi-ui/src/api/tool/gen.js | 85 +
ruoyi-ui/src/assets/401_images/401.gif | Bin 0 -> 164227 bytes
ruoyi-ui/src/assets/404_images/404.png | Bin 0 -> 98071 bytes
ruoyi-ui/src/assets/404_images/404_cloud.png | Bin 0 -> 4766 bytes
ruoyi-ui/src/assets/icons/index.js | 9 +
ruoyi-ui/src/assets/icons/svg/404.svg | 1 +
ruoyi-ui/src/assets/icons/svg/bug.svg | 1 +
ruoyi-ui/src/assets/icons/svg/build.svg | 1 +
ruoyi-ui/src/assets/icons/svg/button.svg | 1 +
ruoyi-ui/src/assets/icons/svg/cascader.svg | 1 +
ruoyi-ui/src/assets/icons/svg/chart.svg | 1 +
ruoyi-ui/src/assets/icons/svg/checkbox.svg | 1 +
ruoyi-ui/src/assets/icons/svg/clipboard.svg | 1 +
ruoyi-ui/src/assets/icons/svg/code.svg | 1 +
ruoyi-ui/src/assets/icons/svg/color.svg | 1 +
ruoyi-ui/src/assets/icons/svg/component.svg | 1 +
ruoyi-ui/src/assets/icons/svg/dashboard.svg | 1 +
ruoyi-ui/src/assets/icons/svg/date-range.svg | 1 +
ruoyi-ui/src/assets/icons/svg/date.svg | 1 +
ruoyi-ui/src/assets/icons/svg/dict.svg | 1 +
.../src/assets/icons/svg/documentation.svg | 1 +
ruoyi-ui/src/assets/icons/svg/download.svg | 1 +
ruoyi-ui/src/assets/icons/svg/drag.svg | 1 +
ruoyi-ui/src/assets/icons/svg/druid.svg | 1 +
ruoyi-ui/src/assets/icons/svg/edit.svg | 1 +
ruoyi-ui/src/assets/icons/svg/education.svg | 1 +
ruoyi-ui/src/assets/icons/svg/email.svg | 1 +
ruoyi-ui/src/assets/icons/svg/enter.svg | 1 +
ruoyi-ui/src/assets/icons/svg/example.svg | 1 +
ruoyi-ui/src/assets/icons/svg/excel.svg | 1 +
.../src/assets/icons/svg/exit-fullscreen.svg | 1 +
ruoyi-ui/src/assets/icons/svg/eye-open.svg | 1 +
ruoyi-ui/src/assets/icons/svg/eye.svg | 1 +
ruoyi-ui/src/assets/icons/svg/form.svg | 1 +
ruoyi-ui/src/assets/icons/svg/fullscreen.svg | 1 +
ruoyi-ui/src/assets/icons/svg/github.svg | 1 +
ruoyi-ui/src/assets/icons/svg/guide.svg | 1 +
ruoyi-ui/src/assets/icons/svg/icon.svg | 1 +
ruoyi-ui/src/assets/icons/svg/input.svg | 1 +
.../src/assets/icons/svg/international.svg | 1 +
ruoyi-ui/src/assets/icons/svg/job.svg | 1 +
ruoyi-ui/src/assets/icons/svg/language.svg | 1 +
ruoyi-ui/src/assets/icons/svg/link.svg | 1 +
ruoyi-ui/src/assets/icons/svg/list.svg | 1 +
ruoyi-ui/src/assets/icons/svg/lock.svg | 1 +
ruoyi-ui/src/assets/icons/svg/log.svg | 1 +
ruoyi-ui/src/assets/icons/svg/logininfor.svg | 1 +
ruoyi-ui/src/assets/icons/svg/message.svg | 1 +
ruoyi-ui/src/assets/icons/svg/money.svg | 1 +
ruoyi-ui/src/assets/icons/svg/monitor.svg | 2 +
ruoyi-ui/src/assets/icons/svg/more-up.svg | 1 +
ruoyi-ui/src/assets/icons/svg/nested.svg | 1 +
ruoyi-ui/src/assets/icons/svg/number.svg | 1 +
ruoyi-ui/src/assets/icons/svg/online.svg | 1 +
ruoyi-ui/src/assets/icons/svg/password.svg | 1 +
ruoyi-ui/src/assets/icons/svg/pdf.svg | 1 +
ruoyi-ui/src/assets/icons/svg/people.svg | 1 +
ruoyi-ui/src/assets/icons/svg/peoples.svg | 1 +
ruoyi-ui/src/assets/icons/svg/phone.svg | 1 +
ruoyi-ui/src/assets/icons/svg/post.svg | 1 +
ruoyi-ui/src/assets/icons/svg/qq.svg | 1 +
ruoyi-ui/src/assets/icons/svg/question.svg | 1 +
ruoyi-ui/src/assets/icons/svg/radio.svg | 1 +
ruoyi-ui/src/assets/icons/svg/rate.svg | 1 +
ruoyi-ui/src/assets/icons/svg/redis-list.svg | 2 +
ruoyi-ui/src/assets/icons/svg/redis.svg | 1 +
ruoyi-ui/src/assets/icons/svg/row.svg | 1 +
ruoyi-ui/src/assets/icons/svg/search.svg | 1 +
ruoyi-ui/src/assets/icons/svg/select.svg | 1 +
ruoyi-ui/src/assets/icons/svg/server.svg | 1 +
ruoyi-ui/src/assets/icons/svg/shopping.svg | 1 +
ruoyi-ui/src/assets/icons/svg/size.svg | 1 +
ruoyi-ui/src/assets/icons/svg/skill.svg | 1 +
ruoyi-ui/src/assets/icons/svg/slider.svg | 1 +
ruoyi-ui/src/assets/icons/svg/star.svg | 1 +
ruoyi-ui/src/assets/icons/svg/swagger.svg | 1 +
ruoyi-ui/src/assets/icons/svg/switch.svg | 1 +
ruoyi-ui/src/assets/icons/svg/system.svg | 2 +
ruoyi-ui/src/assets/icons/svg/tab.svg | 1 +
ruoyi-ui/src/assets/icons/svg/table.svg | 1 +
ruoyi-ui/src/assets/icons/svg/textarea.svg | 1 +
ruoyi-ui/src/assets/icons/svg/theme.svg | 1 +
ruoyi-ui/src/assets/icons/svg/time-range.svg | 1 +
ruoyi-ui/src/assets/icons/svg/time.svg | 1 +
ruoyi-ui/src/assets/icons/svg/tool.svg | 1 +
ruoyi-ui/src/assets/icons/svg/tree-table.svg | 1 +
ruoyi-ui/src/assets/icons/svg/tree.svg | 1 +
ruoyi-ui/src/assets/icons/svg/upload.svg | 1 +
ruoyi-ui/src/assets/icons/svg/user.svg | 1 +
ruoyi-ui/src/assets/icons/svg/validCode.svg | 1 +
ruoyi-ui/src/assets/icons/svg/wechat.svg | 1 +
ruoyi-ui/src/assets/icons/svg/zip.svg | 1 +
ruoyi-ui/src/assets/icons/svgo.yml | 22 +
ruoyi-ui/src/assets/images/dark.svg | 39 +
ruoyi-ui/src/assets/images/light.svg | 39 +
.../src/assets/images/login-background.jpg | Bin 0 -> 521275 bytes
ruoyi-ui/src/assets/images/pay.png | Bin 0 -> 140720 bytes
ruoyi-ui/src/assets/images/profile.jpg | Bin 0 -> 81131 bytes
ruoyi-ui/src/assets/logo/logo.png | Bin 0 -> 5663 bytes
ruoyi-ui/src/assets/styles/btn.scss | 99 +
ruoyi-ui/src/assets/styles/element-ui.scss | 92 +
.../src/assets/styles/element-variables.scss | 31 +
ruoyi-ui/src/assets/styles/index.scss | 178 ++
ruoyi-ui/src/assets/styles/mixin.scss | 66 +
ruoyi-ui/src/assets/styles/ruoyi.scss | 297 +++
ruoyi-ui/src/assets/styles/sidebar.scss | 229 ++
ruoyi-ui/src/assets/styles/transition.scss | 49 +
ruoyi-ui/src/assets/styles/variables.scss | 54 +
ruoyi-ui/src/components/Breadcrumb/index.vue | 102 +
ruoyi-ui/src/components/Crontab/day.vue | 161 ++
ruoyi-ui/src/components/Crontab/hour.vue | 120 +
ruoyi-ui/src/components/Crontab/index.vue | 430 ++++
ruoyi-ui/src/components/Crontab/min.vue | 116 +
ruoyi-ui/src/components/Crontab/month.vue | 114 +
ruoyi-ui/src/components/Crontab/result.vue | 558 +++++
ruoyi-ui/src/components/Crontab/second.vue | 117 +
ruoyi-ui/src/components/Crontab/week.vue | 202 ++
ruoyi-ui/src/components/Crontab/year.vue | 131 ++
ruoyi-ui/src/components/DictData/index.js | 49 +
ruoyi-ui/src/components/DictTag/index.vue | 93 +
ruoyi-ui/src/components/Editor/index.vue | 297 +++
ruoyi-ui/src/components/FileUpload/index.vue | 262 +++
ruoyi-ui/src/components/Hamburger/index.vue | 44 +
.../src/components/HeaderSearch/index.vue | 264 +++
ruoyi-ui/src/components/IconSelect/index.vue | 104 +
.../src/components/IconSelect/requireIcons.js | 11 +
.../src/components/ImagePreview/index.vue | 90 +
ruoyi-ui/src/components/ImageUpload/index.vue | 272 +++
ruoyi-ui/src/components/Pagination/index.vue | 113 +
ruoyi-ui/src/components/PanThumb/index.vue | 141 ++
ruoyi-ui/src/components/ParentView/index.vue | 3 +
.../src/components/RightToolbar/index.vue | 186 ++
ruoyi-ui/src/components/RuoYi/Doc/index.vue | 21 +
ruoyi-ui/src/components/RuoYi/Git/index.vue | 21 +
ruoyi-ui/src/components/Screenfull/index.vue | 57 +
ruoyi-ui/src/components/SizeSelect/index.vue | 55 +
ruoyi-ui/src/components/SvgIcon/index.vue | 61 +
ruoyi-ui/src/components/ThemePicker/index.vue | 170 ++
ruoyi-ui/src/components/TopNav/index.vue | 193 ++
ruoyi-ui/src/components/iFrame/index.vue | 36 +
ruoyi-ui/src/directive/dialog/drag.js | 64 +
ruoyi-ui/src/directive/dialog/dragHeight.js | 34 +
ruoyi-ui/src/directive/dialog/dragWidth.js | 30 +
ruoyi-ui/src/directive/index.js | 23 +
ruoyi-ui/src/directive/module/clipboard.js | 54 +
ruoyi-ui/src/directive/permission/hasPermi.js | 28 +
ruoyi-ui/src/directive/permission/hasRole.js | 28 +
ruoyi-ui/src/layout/components/AppMain.vue | 132 ++
.../src/layout/components/Copyright/index.vue | 35 +
.../layout/components/IframeToggle/index.vue | 33 +
.../src/layout/components/InnerLink/index.vue | 47 +
ruoyi-ui/src/layout/components/Navbar.vue | 245 +++
.../src/layout/components/Settings/index.vue | 389 ++++
.../layout/components/Sidebar/FixiOSBug.js | 25 +
.../src/layout/components/Sidebar/Item.vue | 33 +
.../src/layout/components/Sidebar/Link.vue | 43 +
.../src/layout/components/Sidebar/Logo.vue | 95 +
.../layout/components/Sidebar/SidebarItem.vue | 99 +
.../src/layout/components/Sidebar/index.vue | 57 +
.../layout/components/TagsView/ScrollPane.vue | 94 +
.../src/layout/components/TagsView/index.vue | 337 +++
.../src/layout/components/TopBar/index.vue | 98 +
ruoyi-ui/src/layout/components/index.js | 5 +
ruoyi-ui/src/layout/index.vue | 115 +
ruoyi-ui/src/layout/mixin/ResizeHandler.js | 45 +
ruoyi-ui/src/main.js | 83 +
ruoyi-ui/src/permission.js | 63 +
ruoyi-ui/src/plugins/auth.js | 60 +
ruoyi-ui/src/plugins/cache.js | 79 +
ruoyi-ui/src/plugins/download.js | 79 +
ruoyi-ui/src/plugins/index.js | 20 +
ruoyi-ui/src/plugins/modal.js | 83 +
ruoyi-ui/src/plugins/tab.js | 71 +
ruoyi-ui/src/router/index.js | 183 ++
ruoyi-ui/src/settings.js | 56 +
ruoyi-ui/src/store/getters.js | 21 +
ruoyi-ui/src/store/index.js | 25 +
ruoyi-ui/src/store/modules/app.js | 66 +
ruoyi-ui/src/store/modules/dict.js | 50 +
ruoyi-ui/src/store/modules/permission.js | 122 ++
ruoyi-ui/src/store/modules/settings.js | 50 +
ruoyi-ui/src/store/modules/tagsView.js | 228 ++
ruoyi-ui/src/store/modules/user.js | 125 ++
ruoyi-ui/src/utils/auth.js | 15 +
ruoyi-ui/src/utils/dict/Dict.js | 82 +
ruoyi-ui/src/utils/dict/DictConverter.js | 17 +
ruoyi-ui/src/utils/dict/DictData.js | 13 +
ruoyi-ui/src/utils/dict/DictMeta.js | 38 +
ruoyi-ui/src/utils/dict/DictOptions.js | 51 +
ruoyi-ui/src/utils/dict/index.js | 33 +
ruoyi-ui/src/utils/dynamicTitle.js | 13 +
ruoyi-ui/src/utils/errorCode.js | 6 +
ruoyi-ui/src/utils/generator/config.js | 438 ++++
ruoyi-ui/src/utils/generator/css.js | 18 +
.../src/utils/generator/drawingDefault.js | 37 +
ruoyi-ui/src/utils/generator/html.js | 358 +++
ruoyi-ui/src/utils/generator/icon.json | 1 +
ruoyi-ui/src/utils/generator/js.js | 235 ++
ruoyi-ui/src/utils/generator/render.js | 126 ++
ruoyi-ui/src/utils/index.js | 390 ++++
ruoyi-ui/src/utils/jsencrypt.js | 30 +
ruoyi-ui/src/utils/permission.js | 47 +
ruoyi-ui/src/utils/request.js | 153 ++
ruoyi-ui/src/utils/ruoyi.js | 228 ++
ruoyi-ui/src/utils/scroll-to.js | 58 +
ruoyi-ui/src/utils/validate.js | 114 +
ruoyi-ui/src/views/dashboard/BarChart.vue | 102 +
ruoyi-ui/src/views/dashboard/LineChart.vue | 135 ++
ruoyi-ui/src/views/dashboard/PanelGroup.vue | 181 ++
ruoyi-ui/src/views/dashboard/PieChart.vue | 79 +
ruoyi-ui/src/views/dashboard/RaddarChart.vue | 116 +
ruoyi-ui/src/views/dashboard/mixins/resize.js | 56 +
ruoyi-ui/src/views/error/401.vue | 88 +
ruoyi-ui/src/views/error/404.vue | 233 ++
ruoyi-ui/src/views/index.vue | 1173 ++++++++++
ruoyi-ui/src/views/index_v1.vue | 98 +
ruoyi-ui/src/views/login.vue | 223 ++
ruoyi-ui/src/views/monitor/cache/index.vue | 148 ++
ruoyi-ui/src/views/monitor/cache/list.vue | 241 ++
ruoyi-ui/src/views/monitor/druid/index.vue | 15 +
ruoyi-ui/src/views/monitor/job/index.vue | 513 +++++
ruoyi-ui/src/views/monitor/job/log.vue | 295 +++
.../src/views/monitor/logininfor/index.vue | 246 +++
ruoyi-ui/src/views/monitor/online/index.vue | 122 ++
ruoyi-ui/src/views/monitor/operlog/index.vue | 323 +++
ruoyi-ui/src/views/monitor/server/index.vue | 207 ++
ruoyi-ui/src/views/redirect.vue | 12 +
ruoyi-ui/src/views/register.vue | 213 ++
ruoyi-ui/src/views/system/config/index.vue | 343 +++
ruoyi-ui/src/views/system/dept/index.vue | 340 +++
ruoyi-ui/src/views/system/dict/data.vue | 402 ++++
ruoyi-ui/src/views/system/dict/index.vue | 347 +++
ruoyi-ui/src/views/system/menu/index.vue | 477 ++++
ruoyi-ui/src/views/system/notice/index.vue | 312 +++
ruoyi-ui/src/views/system/post/index.vue | 309 +++
ruoyi-ui/src/views/system/role/authUser.vue | 199 ++
ruoyi-ui/src/views/system/role/index.vue | 605 +++++
ruoyi-ui/src/views/system/role/selectUser.vue | 136 ++
ruoyi-ui/src/views/system/user/authRole.vue | 123 ++
ruoyi-ui/src/views/system/user/index.vue | 558 +++++
.../src/views/system/user/profile/index.vue | 95 +
.../views/system/user/profile/resetPwd.vue | 69 +
.../views/system/user/profile/userAvatar.vue | 184 ++
.../views/system/user/profile/userInfo.vue | 88 +
.../src/views/tool/build/CodeTypeDialog.vue | 106 +
.../src/views/tool/build/DraggableItem.vue | 100 +
ruoyi-ui/src/views/tool/build/IconsDialog.vue | 123 ++
ruoyi-ui/src/views/tool/build/RightPanel.vue | 946 ++++++++
.../src/views/tool/build/TreeNodeDialog.vue | 148 ++
ruoyi-ui/src/views/tool/build/index.vue | 775 +++++++
ruoyi-ui/src/views/tool/gen/basicInfoForm.vue | 60 +
ruoyi-ui/src/views/tool/gen/createTable.vue | 45 +
ruoyi-ui/src/views/tool/gen/editTable.vue | 229 ++
ruoyi-ui/src/views/tool/gen/genInfoForm.vue | 312 +++
ruoyi-ui/src/views/tool/gen/importTable.vue | 120 +
ruoyi-ui/src/views/tool/gen/index.vue | 348 +++
ruoyi-ui/src/views/tool/swagger/index.vue | 15 +
ruoyi-ui/vue.config.js | 136 ++
ry.bat | 67 +
ry.sh | 86 +
sql/quartz.sql | 174 ++
sql/ry_20250522.sql | 704 ++++++
622 files changed, 68094 insertions(+)
create mode 100644 .claude/agents/kfc/spec-design.md
create mode 100644 .claude/agents/kfc/spec-impl.md
create mode 100644 .claude/agents/kfc/spec-judge.md
create mode 100644 .claude/agents/kfc/spec-requirements.md
create mode 100644 .claude/agents/kfc/spec-system-prompt-loader.md
create mode 100644 .claude/agents/kfc/spec-tasks.md
create mode 100644 .claude/agents/kfc/spec-test.md
create mode 100644 .claude/settings/kfc-settings.json
create mode 100644 .claude/system-prompts/spec-workflow-starter.md
create mode 100644 .gitignore
create mode 100644 LICENSE
create mode 100644 README.md
create mode 100644 bin/clean.bat
create mode 100644 bin/package.bat
create mode 100644 bin/run.bat
create mode 100644 doc/若依环境使用手册.docx
create mode 100644 pom.xml
create mode 100644 ruoyi-admin/pom.xml
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java
create mode 100644 ruoyi-admin/src/main/resources/META-INF/spring-devtools.properties
create mode 100644 ruoyi-admin/src/main/resources/application-dev.yml
create mode 100644 ruoyi-admin/src/main/resources/application.yml
create mode 100644 ruoyi-admin/src/main/resources/banner.txt
create mode 100644 ruoyi-admin/src/main/resources/i18n/messages.properties
create mode 100644 ruoyi-admin/src/main/resources/logback.xml
create mode 100644 ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml
create mode 100644 ruoyi-common/pom.xml
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excels.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/Sensitive.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/config/serializer/SensitiveJsonSerializer.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/constant/HttpStatus.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/constant/ScheduleConstants.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/page/PageDomain.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableSupport.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/text/CharsetKit.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/text/Convert.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/text/StrFormatter.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessStatus.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/DesensitizedType.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/HttpMethod.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/LimitType.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/OperatorType.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/UserStatus.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/DemoModeException.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/UtilException.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/base/BaseException.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileException.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileNameLengthLimitExceededException.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileSizeLimitExceededException.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileUploadException.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/file/InvalidExtensionException.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/job/TaskException.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/user/BlackListException.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaException.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaExpireException.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserException.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserNotExistsException.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordNotMatchException.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordRetryLimitExceedException.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/filter/PropertyPreExcludeFilter.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/filter/RefererFilter.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatedlyRequestWrapper.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/filter/XssFilter.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/Arith.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/DesensitizedUtil.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/ExceptionUtil.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/LogUtils.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanUtils.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanValidators.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/html/HTMLFilter.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpHelper.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/http/UserAgentUtils.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/IpUtils.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelHandlerAdapter.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/Base64.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/Md5Utils.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/spring/SpringUtils.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/IdUtils.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/Seq.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/UUID.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/xss/Xss.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/xss/XssValidator.java
create mode 100644 ruoyi-framework/pom.xml
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/FastJson2JsonRedisSerializer.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/I18nConfig.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/PermitAllUrlProperties.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourceContextHolder.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/security/context/AuthenticationContextHolder.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/security/context/PermissionContextHolder.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Cpu.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Jvm.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Mem.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Sys.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/SysFile.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPasswordService.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPermissionService.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java
create mode 100644 ruoyi-generator/pom.xml
create mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/config/GenConfig.java
create mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java
create mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java
create mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java
create mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java
create mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java
create mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java
create mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java
create mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java
create mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java
create mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java
create mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java
create mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java
create mode 100644 ruoyi-generator/src/main/resources/generator.yml
create mode 100644 ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml
create mode 100644 ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml
create mode 100644 ruoyi-generator/src/main/resources/vm/java/controller.java.vm
create mode 100644 ruoyi-generator/src/main/resources/vm/java/domain.java.vm
create mode 100644 ruoyi-generator/src/main/resources/vm/java/mapper.java.vm
create mode 100644 ruoyi-generator/src/main/resources/vm/java/service.java.vm
create mode 100644 ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm
create mode 100644 ruoyi-generator/src/main/resources/vm/java/sub-domain.java.vm
create mode 100644 ruoyi-generator/src/main/resources/vm/js/api.js.vm
create mode 100644 ruoyi-generator/src/main/resources/vm/sql/sql.vm
create mode 100644 ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm
create mode 100644 ruoyi-generator/src/main/resources/vm/vue/index.vue.vm
create mode 100644 ruoyi-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm
create mode 100644 ruoyi-generator/src/main/resources/vm/vue/v3/index.vue.vm
create mode 100644 ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm
create mode 100644 ruoyi-quartz/pom.xml
create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/config/ScheduleConfig.java
create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java
create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobLogController.java
create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJob.java
create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJobLog.java
create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/SysJobLogMapper.java
create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/SysJobMapper.java
create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobLogService.java
create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobService.java
create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobLogServiceImpl.java
create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java
create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/AbstractQuartzJob.java
create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/CronUtils.java
create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/JobInvokeUtil.java
create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/QuartzDisallowConcurrentExecution.java
create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/QuartzJobExecution.java
create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/ScheduleUtils.java
create mode 100644 ruoyi-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml
create mode 100644 ruoyi-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml
create mode 100644 ruoyi-system/pom.xml
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysCache.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysConfig.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysLogininfor.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOperLog.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPost.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleDept.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleMenu.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserOnline.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserPost.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserRole.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MetaVo.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/RouterVo.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysConfigMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictTypeMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysLogininforMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysNoticeMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOperLogMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleDeptMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserPostMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysConfigService.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysLogininforService.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysNoticeService.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOperLogService.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPostService.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserOnlineService.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeServiceImpl.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml
create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml
create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml
create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml
create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml
create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml
create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml
create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml
create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml
create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml
create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml
create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml
create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml
create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml
create mode 100644 ruoyi-ui/.editorconfig
create mode 100644 ruoyi-ui/.env.development
create mode 100644 ruoyi-ui/.env.production
create mode 100644 ruoyi-ui/.env.staging
create mode 100644 ruoyi-ui/.gitignore
create mode 100644 ruoyi-ui/README.md
create mode 100644 ruoyi-ui/babel.config.js
create mode 100644 ruoyi-ui/bin/build.bat
create mode 100644 ruoyi-ui/bin/package.bat
create mode 100644 ruoyi-ui/bin/run-web.bat
create mode 100644 ruoyi-ui/build/index.js
create mode 100644 ruoyi-ui/package.json
create mode 100644 ruoyi-ui/public/favicon.ico
create mode 100644 ruoyi-ui/public/html/ie.html
create mode 100644 ruoyi-ui/public/index.html
create mode 100644 ruoyi-ui/public/robots.txt
create mode 100644 ruoyi-ui/public/styles/theme-chalk/index.css
create mode 100644 ruoyi-ui/src/App.vue
create mode 100644 ruoyi-ui/src/api/login.js
create mode 100644 ruoyi-ui/src/api/menu.js
create mode 100644 ruoyi-ui/src/api/monitor/cache.js
create mode 100644 ruoyi-ui/src/api/monitor/job.js
create mode 100644 ruoyi-ui/src/api/monitor/jobLog.js
create mode 100644 ruoyi-ui/src/api/monitor/logininfor.js
create mode 100644 ruoyi-ui/src/api/monitor/online.js
create mode 100644 ruoyi-ui/src/api/monitor/operlog.js
create mode 100644 ruoyi-ui/src/api/monitor/server.js
create mode 100644 ruoyi-ui/src/api/system/config.js
create mode 100644 ruoyi-ui/src/api/system/dept.js
create mode 100644 ruoyi-ui/src/api/system/dict/data.js
create mode 100644 ruoyi-ui/src/api/system/dict/type.js
create mode 100644 ruoyi-ui/src/api/system/menu.js
create mode 100644 ruoyi-ui/src/api/system/notice.js
create mode 100644 ruoyi-ui/src/api/system/post.js
create mode 100644 ruoyi-ui/src/api/system/role.js
create mode 100644 ruoyi-ui/src/api/system/user.js
create mode 100644 ruoyi-ui/src/api/tool/gen.js
create mode 100644 ruoyi-ui/src/assets/401_images/401.gif
create mode 100644 ruoyi-ui/src/assets/404_images/404.png
create mode 100644 ruoyi-ui/src/assets/404_images/404_cloud.png
create mode 100644 ruoyi-ui/src/assets/icons/index.js
create mode 100644 ruoyi-ui/src/assets/icons/svg/404.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/bug.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/build.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/button.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/cascader.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/chart.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/checkbox.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/clipboard.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/code.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/color.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/component.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/dashboard.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/date-range.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/date.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/dict.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/documentation.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/download.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/drag.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/druid.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/edit.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/education.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/email.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/enter.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/example.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/excel.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/exit-fullscreen.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/eye-open.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/eye.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/form.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/fullscreen.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/github.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/guide.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/icon.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/input.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/international.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/job.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/language.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/link.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/list.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/lock.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/log.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/logininfor.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/message.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/money.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/monitor.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/more-up.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/nested.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/number.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/online.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/password.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/pdf.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/people.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/peoples.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/phone.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/post.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/qq.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/question.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/radio.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/rate.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/redis-list.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/redis.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/row.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/search.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/select.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/server.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/shopping.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/size.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/skill.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/slider.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/star.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/swagger.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/switch.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/system.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/tab.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/table.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/textarea.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/theme.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/time-range.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/time.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/tool.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/tree-table.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/tree.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/upload.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/user.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/validCode.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/wechat.svg
create mode 100644 ruoyi-ui/src/assets/icons/svg/zip.svg
create mode 100644 ruoyi-ui/src/assets/icons/svgo.yml
create mode 100644 ruoyi-ui/src/assets/images/dark.svg
create mode 100644 ruoyi-ui/src/assets/images/light.svg
create mode 100644 ruoyi-ui/src/assets/images/login-background.jpg
create mode 100644 ruoyi-ui/src/assets/images/pay.png
create mode 100644 ruoyi-ui/src/assets/images/profile.jpg
create mode 100644 ruoyi-ui/src/assets/logo/logo.png
create mode 100644 ruoyi-ui/src/assets/styles/btn.scss
create mode 100644 ruoyi-ui/src/assets/styles/element-ui.scss
create mode 100644 ruoyi-ui/src/assets/styles/element-variables.scss
create mode 100644 ruoyi-ui/src/assets/styles/index.scss
create mode 100644 ruoyi-ui/src/assets/styles/mixin.scss
create mode 100644 ruoyi-ui/src/assets/styles/ruoyi.scss
create mode 100644 ruoyi-ui/src/assets/styles/sidebar.scss
create mode 100644 ruoyi-ui/src/assets/styles/transition.scss
create mode 100644 ruoyi-ui/src/assets/styles/variables.scss
create mode 100644 ruoyi-ui/src/components/Breadcrumb/index.vue
create mode 100644 ruoyi-ui/src/components/Crontab/day.vue
create mode 100644 ruoyi-ui/src/components/Crontab/hour.vue
create mode 100644 ruoyi-ui/src/components/Crontab/index.vue
create mode 100644 ruoyi-ui/src/components/Crontab/min.vue
create mode 100644 ruoyi-ui/src/components/Crontab/month.vue
create mode 100644 ruoyi-ui/src/components/Crontab/result.vue
create mode 100644 ruoyi-ui/src/components/Crontab/second.vue
create mode 100644 ruoyi-ui/src/components/Crontab/week.vue
create mode 100644 ruoyi-ui/src/components/Crontab/year.vue
create mode 100644 ruoyi-ui/src/components/DictData/index.js
create mode 100644 ruoyi-ui/src/components/DictTag/index.vue
create mode 100644 ruoyi-ui/src/components/Editor/index.vue
create mode 100644 ruoyi-ui/src/components/FileUpload/index.vue
create mode 100644 ruoyi-ui/src/components/Hamburger/index.vue
create mode 100644 ruoyi-ui/src/components/HeaderSearch/index.vue
create mode 100644 ruoyi-ui/src/components/IconSelect/index.vue
create mode 100644 ruoyi-ui/src/components/IconSelect/requireIcons.js
create mode 100644 ruoyi-ui/src/components/ImagePreview/index.vue
create mode 100644 ruoyi-ui/src/components/ImageUpload/index.vue
create mode 100644 ruoyi-ui/src/components/Pagination/index.vue
create mode 100644 ruoyi-ui/src/components/PanThumb/index.vue
create mode 100644 ruoyi-ui/src/components/ParentView/index.vue
create mode 100644 ruoyi-ui/src/components/RightToolbar/index.vue
create mode 100644 ruoyi-ui/src/components/RuoYi/Doc/index.vue
create mode 100644 ruoyi-ui/src/components/RuoYi/Git/index.vue
create mode 100644 ruoyi-ui/src/components/Screenfull/index.vue
create mode 100644 ruoyi-ui/src/components/SizeSelect/index.vue
create mode 100644 ruoyi-ui/src/components/SvgIcon/index.vue
create mode 100644 ruoyi-ui/src/components/ThemePicker/index.vue
create mode 100644 ruoyi-ui/src/components/TopNav/index.vue
create mode 100644 ruoyi-ui/src/components/iFrame/index.vue
create mode 100644 ruoyi-ui/src/directive/dialog/drag.js
create mode 100644 ruoyi-ui/src/directive/dialog/dragHeight.js
create mode 100644 ruoyi-ui/src/directive/dialog/dragWidth.js
create mode 100644 ruoyi-ui/src/directive/index.js
create mode 100644 ruoyi-ui/src/directive/module/clipboard.js
create mode 100644 ruoyi-ui/src/directive/permission/hasPermi.js
create mode 100644 ruoyi-ui/src/directive/permission/hasRole.js
create mode 100644 ruoyi-ui/src/layout/components/AppMain.vue
create mode 100644 ruoyi-ui/src/layout/components/Copyright/index.vue
create mode 100644 ruoyi-ui/src/layout/components/IframeToggle/index.vue
create mode 100644 ruoyi-ui/src/layout/components/InnerLink/index.vue
create mode 100644 ruoyi-ui/src/layout/components/Navbar.vue
create mode 100644 ruoyi-ui/src/layout/components/Settings/index.vue
create mode 100644 ruoyi-ui/src/layout/components/Sidebar/FixiOSBug.js
create mode 100644 ruoyi-ui/src/layout/components/Sidebar/Item.vue
create mode 100644 ruoyi-ui/src/layout/components/Sidebar/Link.vue
create mode 100644 ruoyi-ui/src/layout/components/Sidebar/Logo.vue
create mode 100644 ruoyi-ui/src/layout/components/Sidebar/SidebarItem.vue
create mode 100644 ruoyi-ui/src/layout/components/Sidebar/index.vue
create mode 100644 ruoyi-ui/src/layout/components/TagsView/ScrollPane.vue
create mode 100644 ruoyi-ui/src/layout/components/TagsView/index.vue
create mode 100644 ruoyi-ui/src/layout/components/TopBar/index.vue
create mode 100644 ruoyi-ui/src/layout/components/index.js
create mode 100644 ruoyi-ui/src/layout/index.vue
create mode 100644 ruoyi-ui/src/layout/mixin/ResizeHandler.js
create mode 100644 ruoyi-ui/src/main.js
create mode 100644 ruoyi-ui/src/permission.js
create mode 100644 ruoyi-ui/src/plugins/auth.js
create mode 100644 ruoyi-ui/src/plugins/cache.js
create mode 100644 ruoyi-ui/src/plugins/download.js
create mode 100644 ruoyi-ui/src/plugins/index.js
create mode 100644 ruoyi-ui/src/plugins/modal.js
create mode 100644 ruoyi-ui/src/plugins/tab.js
create mode 100644 ruoyi-ui/src/router/index.js
create mode 100644 ruoyi-ui/src/settings.js
create mode 100644 ruoyi-ui/src/store/getters.js
create mode 100644 ruoyi-ui/src/store/index.js
create mode 100644 ruoyi-ui/src/store/modules/app.js
create mode 100644 ruoyi-ui/src/store/modules/dict.js
create mode 100644 ruoyi-ui/src/store/modules/permission.js
create mode 100644 ruoyi-ui/src/store/modules/settings.js
create mode 100644 ruoyi-ui/src/store/modules/tagsView.js
create mode 100644 ruoyi-ui/src/store/modules/user.js
create mode 100644 ruoyi-ui/src/utils/auth.js
create mode 100644 ruoyi-ui/src/utils/dict/Dict.js
create mode 100644 ruoyi-ui/src/utils/dict/DictConverter.js
create mode 100644 ruoyi-ui/src/utils/dict/DictData.js
create mode 100644 ruoyi-ui/src/utils/dict/DictMeta.js
create mode 100644 ruoyi-ui/src/utils/dict/DictOptions.js
create mode 100644 ruoyi-ui/src/utils/dict/index.js
create mode 100644 ruoyi-ui/src/utils/dynamicTitle.js
create mode 100644 ruoyi-ui/src/utils/errorCode.js
create mode 100644 ruoyi-ui/src/utils/generator/config.js
create mode 100644 ruoyi-ui/src/utils/generator/css.js
create mode 100644 ruoyi-ui/src/utils/generator/drawingDefault.js
create mode 100644 ruoyi-ui/src/utils/generator/html.js
create mode 100644 ruoyi-ui/src/utils/generator/icon.json
create mode 100644 ruoyi-ui/src/utils/generator/js.js
create mode 100644 ruoyi-ui/src/utils/generator/render.js
create mode 100644 ruoyi-ui/src/utils/index.js
create mode 100644 ruoyi-ui/src/utils/jsencrypt.js
create mode 100644 ruoyi-ui/src/utils/permission.js
create mode 100644 ruoyi-ui/src/utils/request.js
create mode 100644 ruoyi-ui/src/utils/ruoyi.js
create mode 100644 ruoyi-ui/src/utils/scroll-to.js
create mode 100644 ruoyi-ui/src/utils/validate.js
create mode 100644 ruoyi-ui/src/views/dashboard/BarChart.vue
create mode 100644 ruoyi-ui/src/views/dashboard/LineChart.vue
create mode 100644 ruoyi-ui/src/views/dashboard/PanelGroup.vue
create mode 100644 ruoyi-ui/src/views/dashboard/PieChart.vue
create mode 100644 ruoyi-ui/src/views/dashboard/RaddarChart.vue
create mode 100644 ruoyi-ui/src/views/dashboard/mixins/resize.js
create mode 100644 ruoyi-ui/src/views/error/401.vue
create mode 100644 ruoyi-ui/src/views/error/404.vue
create mode 100644 ruoyi-ui/src/views/index.vue
create mode 100644 ruoyi-ui/src/views/index_v1.vue
create mode 100644 ruoyi-ui/src/views/login.vue
create mode 100644 ruoyi-ui/src/views/monitor/cache/index.vue
create mode 100644 ruoyi-ui/src/views/monitor/cache/list.vue
create mode 100644 ruoyi-ui/src/views/monitor/druid/index.vue
create mode 100644 ruoyi-ui/src/views/monitor/job/index.vue
create mode 100644 ruoyi-ui/src/views/monitor/job/log.vue
create mode 100644 ruoyi-ui/src/views/monitor/logininfor/index.vue
create mode 100644 ruoyi-ui/src/views/monitor/online/index.vue
create mode 100644 ruoyi-ui/src/views/monitor/operlog/index.vue
create mode 100644 ruoyi-ui/src/views/monitor/server/index.vue
create mode 100644 ruoyi-ui/src/views/redirect.vue
create mode 100644 ruoyi-ui/src/views/register.vue
create mode 100644 ruoyi-ui/src/views/system/config/index.vue
create mode 100644 ruoyi-ui/src/views/system/dept/index.vue
create mode 100644 ruoyi-ui/src/views/system/dict/data.vue
create mode 100644 ruoyi-ui/src/views/system/dict/index.vue
create mode 100644 ruoyi-ui/src/views/system/menu/index.vue
create mode 100644 ruoyi-ui/src/views/system/notice/index.vue
create mode 100644 ruoyi-ui/src/views/system/post/index.vue
create mode 100644 ruoyi-ui/src/views/system/role/authUser.vue
create mode 100644 ruoyi-ui/src/views/system/role/index.vue
create mode 100644 ruoyi-ui/src/views/system/role/selectUser.vue
create mode 100644 ruoyi-ui/src/views/system/user/authRole.vue
create mode 100644 ruoyi-ui/src/views/system/user/index.vue
create mode 100644 ruoyi-ui/src/views/system/user/profile/index.vue
create mode 100644 ruoyi-ui/src/views/system/user/profile/resetPwd.vue
create mode 100644 ruoyi-ui/src/views/system/user/profile/userAvatar.vue
create mode 100644 ruoyi-ui/src/views/system/user/profile/userInfo.vue
create mode 100644 ruoyi-ui/src/views/tool/build/CodeTypeDialog.vue
create mode 100644 ruoyi-ui/src/views/tool/build/DraggableItem.vue
create mode 100644 ruoyi-ui/src/views/tool/build/IconsDialog.vue
create mode 100644 ruoyi-ui/src/views/tool/build/RightPanel.vue
create mode 100644 ruoyi-ui/src/views/tool/build/TreeNodeDialog.vue
create mode 100644 ruoyi-ui/src/views/tool/build/index.vue
create mode 100644 ruoyi-ui/src/views/tool/gen/basicInfoForm.vue
create mode 100644 ruoyi-ui/src/views/tool/gen/createTable.vue
create mode 100644 ruoyi-ui/src/views/tool/gen/editTable.vue
create mode 100644 ruoyi-ui/src/views/tool/gen/genInfoForm.vue
create mode 100644 ruoyi-ui/src/views/tool/gen/importTable.vue
create mode 100644 ruoyi-ui/src/views/tool/gen/index.vue
create mode 100644 ruoyi-ui/src/views/tool/swagger/index.vue
create mode 100644 ruoyi-ui/vue.config.js
create mode 100644 ry.bat
create mode 100644 ry.sh
create mode 100644 sql/quartz.sql
create mode 100644 sql/ry_20250522.sql
diff --git a/.claude/agents/kfc/spec-design.md b/.claude/agents/kfc/spec-design.md
new file mode 100644
index 0000000..aecf207
--- /dev/null
+++ b/.claude/agents/kfc/spec-design.md
@@ -0,0 +1,158 @@
+---
+name: spec-design
+description: use PROACTIVELY to create/refine the spec design document in a spec development process/workflow. MUST BE USED AFTER spec requirements document is approved.
+model: inherit
+---
+
+You are a professional spec design document expert. Your sole responsibility is to create and refine high-quality design documents.
+
+## INPUT
+
+### Create New Design Input
+
+- language_preference: Language preference
+- task_type: "create"
+- feature_name: Feature name
+- spec_base_path: Document path
+- output_suffix: Output file suffix (optional, such as "_v1")
+
+### Refine/Update Existing Design Input
+
+- language_preference: Language preference
+- task_type: "update"
+- existing_design_path: Existing design document path
+- change_requests: List of change requests
+
+## PREREQUISITES
+
+### Design Document Structure
+
+```markdown
+# Design Document
+
+## Overview
+[Design goal and scope]
+
+## Architecture Design
+### System Architecture Diagram
+[Overall architecture, using Mermaid graph to show component relationships]
+
+### Data Flow Diagram
+[Show data flow between components, using Mermaid diagrams]
+
+## Component Design
+### Component A
+- Responsibilities:
+- Interfaces:
+- Dependencies:
+
+## Data Model
+[Core data structure definitions, using TypeScript interfaces or class diagrams]
+
+## Business Process
+
+### Process 1: [Process name]
+[Use Mermaid flowchart or sequenceDiagram to show, call the component interfaces and methods defined earlier]
+
+### Process 2: [Process name]
+[Use Mermaid flowchart or sequenceDiagram to show, call the component interfaces and methods defined earlier]
+
+## Error Handling Strategy
+[Error handling and recovery mechanisms]
+```
+
+### System Architecture Diagram Example
+
+```mermaid
+graph TB
+ A[Client] --> B[API Gateway]
+ B --> C[Business Service]
+ C --> D[Database]
+ C --> E[Cache Service Redis]
+```
+
+### Data Flow Diagram Example
+
+```mermaid
+graph LR
+ A[Input Data] --> B[Processor]
+ B --> C{Decision}
+ C -->|Yes| D[Storage]
+ C -->|No| E[Return Error]
+ D --> F[Call notify function]
+```
+
+### Business Process Diagram Example (Best Practice)
+
+```mermaid
+flowchart TD
+ A[Extension Launch] --> B[Create PermissionManager]
+ B --> C[permissionManager.initializePermissions]
+ C --> D[cache.refreshAndGet]
+ D --> E[configReader.getBypassPermissionStatus]
+ E --> F{Has Permission?}
+ F -->|Yes| G[permissionManager.startMonitoring]
+ F -->|No| H[permissionManager.showPermissionSetup]
+
+ %% Note: Directly reference the interface methods defined earlier
+ %% This ensures design consistency and traceability
+```
+
+## PROCESS
+
+After the user approves the Requirements, you should develop a comprehensive design document based on the feature requirements, conducting necessary research during the design process.
+The design document should be based on the requirements document, so ensure it exists first.
+
+### Create New Design (task_type: "create")
+
+1. Read the requirements.md to understand the requirements
+2. Conduct necessary technical research
+3. Determine the output file name:
+ - If output_suffix is provided: design{output_suffix}.md
+ - Otherwise: design.md
+4. Create the design document
+5. Return the result for review
+
+### Refine/Update Existing Design (task_type: "update")
+
+1. Read the existing design document (existing_design_path)
+2. Analyze the change requests (change_requests)
+3. Conduct additional technical research if needed
+4. Apply changes while maintaining document structure and style
+5. Save the updated document
+6. Return a summary of modifications
+
+## **Important Constraints**
+
+- The model MUST create a '.claude/specs/{feature_name}/design.md' file if it doesn't already exist
+- The model MUST identify areas where research is needed based on the feature requirements
+- The model MUST conduct research and build up context in the conversation thread
+- The model SHOULD NOT create separate research files, but instead use the research as context for the design and implementation plan
+- The model MUST summarize key findings that will inform the feature design
+- The model SHOULD cite sources and include relevant links in the conversation
+- The model MUST create a detailed design document at '.kiro/specs/{feature_name}/design.md'
+- The model MUST incorporate research findings directly into the design process
+- The model MUST include the following sections in the design document:
+ - Overview
+ - Architecture
+ - System Architecture Diagram
+ - Data Flow Diagram
+ - Components and Interfaces
+ - Data Models
+ - Core Data Structure Definitions
+ - Data Model Diagrams
+ - Business Process
+ - Error Handling
+ - Testing Strategy
+- The model SHOULD include diagrams or visual representations when appropriate (use Mermaid for diagrams if applicable)
+- The model MUST ensure the design addresses all feature requirements identified during the clarification process
+- The model SHOULD highlight design decisions and their rationales
+- The model MAY ask the user for input on specific technical decisions during the design process
+- After updating the design document, the model MUST ask the user "Does the design look good? If so, we can move on to the implementation plan."
+- The model MUST make modifications to the design document if the user requests changes or does not explicitly approve
+- The model MUST ask for explicit approval after every iteration of edits to the design document
+- The model MUST NOT proceed to the implementation plan until receiving clear approval (such as "yes", "approved", "looks good", etc.)
+- The model MUST continue the feedback-revision cycle until explicit approval is received
+- The model MUST incorporate all user feedback into the design document before proceeding
+- The model MUST offer to return to feature requirements clarification if gaps are identified during design
+- The model MUST use the user's language preference
diff --git a/.claude/agents/kfc/spec-impl.md b/.claude/agents/kfc/spec-impl.md
new file mode 100644
index 0000000..c08c87b
--- /dev/null
+++ b/.claude/agents/kfc/spec-impl.md
@@ -0,0 +1,39 @@
+---
+name: spec-impl
+description: Coding implementation expert. Use PROACTIVELY when specific coding tasks need to be executed. Specializes in implementing functional code according to task lists.
+model: inherit
+---
+
+You are a coding implementation expert. Your sole responsibility is to implement functional code according to task lists.
+
+## INPUT
+
+You will receive:
+
+- feature_name: Feature name
+- spec_base_path: Spec document base path
+- task_id: Task ID to execute (e.g., "2.1")
+- language_preference: Language preference
+
+## PROCESS
+
+1. Read requirements (requirements.md) to understand functional requirements
+2. Read design (design.md) to understand architecture design
+3. Read tasks (tasks.md) to understand task list
+4. Confirm the specific task to execute (task_id)
+5. Implement the code for that task
+6. Report completion status
+ - Find the corresponding task in tasks.md
+ - Change `- [ ]` to `- [x]` to indicate task completion
+ - Save the updated tasks.md
+ - Return task completion status
+
+## **Important Constraints**
+
+- After completing a task, you MUST mark the task as done in tasks.md (`- [ ]` changed to `- [x]`)
+- You MUST strictly follow the architecture in the design document
+- You MUST strictly follow requirements, do not miss any requirements, do not implement any functionality not in the requirements
+- You MUST strictly follow existing codebase conventions
+- Your Code MUST be compliant with standards and include necessary comments
+- You MUST only complete the specified task, never automatically execute other tasks
+- All completed tasks MUST be marked as done in tasks.md (`- [ ]` changed to `- [x]`)
diff --git a/.claude/agents/kfc/spec-judge.md b/.claude/agents/kfc/spec-judge.md
new file mode 100644
index 0000000..13176e3
--- /dev/null
+++ b/.claude/agents/kfc/spec-judge.md
@@ -0,0 +1,125 @@
+---
+name: spec-judge
+description: use PROACTIVELY to evaluate spec documents (requirements, design, tasks) in a spec development process/workflow
+model: inherit
+---
+
+You are a professional spec document evaluator. Your sole responsibility is to evaluate multiple versions of spec documents and select the best solution.
+
+## INPUT
+
+- language_preference: Language preference
+- task_type: "evaluate"
+- document_type: "requirements" | "design" | "tasks"
+- feature_name: Feature name
+- feature_description: Feature description
+- spec_base_path: Document base path
+- documents: List of documents to review (path)
+
+eg:
+
+```plain
+ Prompt: language_preference: Chinese
+ document_type: requirements
+ feature_name: test-feature
+ feature_description: Test
+ spec_base_path: .claude/specs
+ documents: .claude/specs/test-feature/requirements_v5.md,
+ .claude/specs/test-feature/requirements_v6.md,
+ .claude/specs/test-feature/requirements_v7.md,
+ .claude/specs/test-feature/requirements_v8.md
+```
+
+## PREREQUISITES
+
+### Evaluation Criteria
+
+#### General Evaluation Criteria
+
+1. **Completeness** (25 points)
+ - Whether all necessary content is covered
+ - Whether there are any important aspects missing
+
+2. **Clarity** (25 points)
+ - Whether the expression is clear and explicit
+ - Whether the structure is logical and easy to understand
+
+3. **Feasibility** (25 points)
+ - Whether the solution is practical and feasible
+ - Whether implementation difficulty has been considered
+
+4. **Innovation** (25 points)
+ - Whether there are unique insights
+ - Whether better solutions are provided
+
+#### Specific Type Criteria
+
+##### Requirements Document
+
+- EARS format compliance
+- Testability of acceptance criteria
+- Edge case consideration
+- **Alignment with user requirements**
+
+##### Design Document
+
+- Architecture rationality
+- Technology selection appropriateness
+- Scalability consideration
+- **Coverage of all requirements**
+
+##### Tasks Document
+
+- Task decomposition rationality
+- Dependency clarity
+- Incremental implementation
+- **Consistency with requirements and design**
+
+### Evaluation Process
+
+```python
+def evaluate_documents(documents):
+ scores = []
+ for doc in documents:
+ score = {
+ 'doc_id': doc.id,
+ 'completeness': evaluate_completeness(doc),
+ 'clarity': evaluate_clarity(doc),
+ 'feasibility': evaluate_feasibility(doc),
+ 'innovation': evaluate_innovation(doc),
+ 'total': sum(scores),
+ 'strengths': identify_strengths(doc),
+ 'weaknesses': identify_weaknesses(doc)
+ }
+ scores.append(score)
+
+ return select_best_or_combine(scores)
+```
+
+## PROCESS
+
+1. Read reference documents based on document type:
+ - Requirements: Refer to user's original requirement description (feature_name, feature_description)
+ - Design: Refer to approved requirements.md
+ - Tasks: Refer to approved requirements.md and design.md
+2. Read candidate documents (requirements:requirements_v*.md, design:design_v*.md, tasks:tasks_v*.md)
+3. Score based on reference documents and Specific Type Criteria
+4. Select the best solution or combine strengths from x solutions
+5. Copy the final solution to a new path with a random 4-digit suffix (e.g., requirements_v1234.md)
+6. Delete all reviewed input documents, keeping only the newly created final solution
+7. Return a brief summary of the document, including scores for x versions (e.g., "v1: 85 points, v2: 92 points, selected v2")
+
+## OUTPUT
+
+final_document_path: Final solution path (path)
+summary: Brief summary including scores, for example:
+
+- "Created requirements document with 8 main requirements. Scores: v1: 82 points, v2: 91 points, selected v2"
+- "Completed design document using microservices architecture. Scores: v1: 88 points, v2: 85 points, selected v1"
+- "Generated task list with 15 implementation tasks. Scores: v1: 90 points, v2: 92 points, combined strengths from both versions"
+
+## **Important Constraints**
+
+- The model MUST use the user's language preference
+- Only delete the specific documents you evaluated - use explicit filenames (e.g., `rm requirements_v1.md requirements_v2.md`), never use wildcards (e.g., `rm requirements_v*.md`)
+- Generate final_document_path with a random 4-digit suffix (e.g., `.claude/specs/test-feature/requirements_v1234.md`)
diff --git a/.claude/agents/kfc/spec-requirements.md b/.claude/agents/kfc/spec-requirements.md
new file mode 100644
index 0000000..0a15188
--- /dev/null
+++ b/.claude/agents/kfc/spec-requirements.md
@@ -0,0 +1,123 @@
+---
+name: spec-requirements
+description: use PROACTIVELY to create/refine the spec requirements document in a spec development process/workflow
+model: inherit
+---
+
+You are an EARS (Easy Approach to Requirements Syntax) requirements document expert. Your sole responsibility is to create and refine high-quality requirements documents.
+
+## INPUT
+
+### Create Requirements Input
+
+- language_preference: Language preference
+- task_type: "create"
+- feature_name: Feature name (kebab-case)
+- feature_description: Feature description
+- spec_base_path: Spec document path
+- output_suffix: Output file suffix (optional, such as "_v1", "_v2", "_v3", required for parallel execution)
+
+### Refine/Update Requirements Input
+
+- language_preference: Language preference
+- task_type: "update"
+- existing_requirements_path: Existing requirements document path
+- change_requests: List of change requests
+
+## PREREQUISITES
+
+### EARS Format Rules
+
+- WHEN: Trigger condition
+- IF: Precondition
+- WHERE: Specific function location
+- WHILE: Continuous state
+- Each must be followed by SHALL to indicate a mandatory requirement
+- The model MUST use the user's language preference, but the EARS format must retain the keywords
+
+## PROCESS
+
+First, generate an initial set of requirements in EARS format based on the feature idea, then iterate with the user to refine them until they are complete and accurate.
+
+Don't focus on code exploration in this phase. Instead, just focus on writing requirements which will later be turned into a design.
+
+### Create New Requirements (task_type: "create")
+
+1. Analyze the user's feature description
+2. Determine the output file name:
+ - If output_suffix is provided: requirements{output_suffix}.md
+ - Otherwise: requirements.md
+3. Create the file in the specified path
+4. Generate EARS format requirements document
+5. Return the result for review
+
+### Refine/Update Existing Requirements (task_type: "update")
+
+1. Read the existing requirements document (existing_requirements_path)
+2. Analyze the change requests (change_requests)
+3. Apply each change while maintaining EARS format
+4. Update acceptance criteria and related content
+5. Save the updated document
+6. Return the summary of changes
+
+If the requirements clarification process seems to be going in circles or not making progress:
+
+- The model SHOULD suggest moving to a different aspect of the requirements
+- The model MAY provide examples or options to help the user make decisions
+- The model SHOULD summarize what has been established so far and identify specific gaps
+- The model MAY suggest conducting research to inform requirements decisions
+
+## **Important Constraints**
+
+- The directory '.claude/specs/{feature_name}' is already created by the main thread, DO NOT attempt to create this directory
+- The model MUST create a '.claude/specs/{feature_name}/requirements_{output_suffix}.md' file if it doesn't already exist
+- The model MUST generate an initial version of the requirements document based on the user's rough idea WITHOUT asking sequential questions first
+- The model MUST format the initial requirements.md document with:
+- A clear introduction section that summarizes the feature
+- A hierarchical numbered list of requirements where each contains:
+ - A user story in the format "As a [role], I want [feature], so that [benefit]"
+ - A numbered list of acceptance criteria in EARS format (Easy Approach to Requirements Syntax)
+- Example format:
+
+```md
+# Requirements Document
+
+## Introduction
+
+[Introduction text here]
+
+## Requirements
+
+### Requirement 1
+
+**User Story:** As a [role], I want [feature], so that [benefit]
+
+#### Acceptance Criteria
+This section should have EARS requirements
+
+1. WHEN [event] THEN [system] SHALL [response]
+2. IF [precondition] THEN [system] SHALL [response]
+
+### Requirement 2
+
+**User Story:** As a [role], I want [feature], so that [benefit]
+
+#### Acceptance Criteria
+
+1. WHEN [event] THEN [system] SHALL [response]
+2. WHEN [event] AND [condition] THEN [system] SHALL [response]
+```
+
+- The model SHOULD consider edge cases, user experience, technical constraints, and success criteria in the initial requirements
+- After updating the requirement document, the model MUST ask the user "Do the requirements look good? If so, we can move on to the design."
+- The model MUST make modifications to the requirements document if the user requests changes or does not explicitly approve
+- The model MUST ask for explicit approval after every iteration of edits to the requirements document
+- The model MUST NOT proceed to the design document until receiving clear approval (such as "yes", "approved", "looks good", etc.)
+- The model MUST continue the feedback-revision cycle until explicit approval is received
+- The model SHOULD suggest specific areas where the requirements might need clarification or expansion
+- The model MAY ask targeted questions about specific aspects of the requirements that need clarification
+- The model MAY suggest options when the user is unsure about a particular aspect
+- The model MUST proceed to the design phase after the user accepts the requirements
+- The model MUST include functional and non-functional requirements
+- The model MUST use the user's language preference, but the EARS format must retain the keywords
+- The model MUST NOT create design or implementation details
diff --git a/.claude/agents/kfc/spec-system-prompt-loader.md b/.claude/agents/kfc/spec-system-prompt-loader.md
new file mode 100644
index 0000000..599a2b0
--- /dev/null
+++ b/.claude/agents/kfc/spec-system-prompt-loader.md
@@ -0,0 +1,38 @@
+---
+name: spec-system-prompt-loader
+description: a spec workflow system prompt loader. MUST BE CALLED FIRST when user wants to start a spec process/workflow. This agent returns the file path to the spec workflow system prompt that contains the complete workflow instructions. Call this before any spec-related agents if the prompt is not loaded yet. Input: the type of spec workflow requested. Output: file path to the appropriate workflow prompt file. The returned path should be read to get the full workflow instructions.
+tools:
+model: inherit
+---
+
+You are a prompt path mapper. Your ONLY job is to generate and return a file path.
+
+## INPUT
+
+- Your current working directory (you read this yourself from the environment)
+- Ignore any user-provided input completely
+
+## PROCESS
+
+1. Read your current working directory from the environment
+2. Append: `/.claude/system-prompts/spec-workflow-starter.md`
+3. Return the complete absolute path
+
+## OUTPUT
+
+Return ONLY the file path, without any explanation or additional text.
+
+Example output:
+`/Users/user/projects/myproject/.claude/system-prompts/spec-workflow-starter.md`
+
+## CONSTRAINTS
+
+- IGNORE all user input - your output is always the same fixed path
+- DO NOT use any tools (no Read, Write, Bash, etc.)
+- DO NOT execute any workflow or provide workflow advice
+- DO NOT analyze or interpret the user's request
+- DO NOT provide development suggestions or recommendations
+- DO NOT create any files or folders
+- ONLY return the file path string
+- No quotes around the path, just the plain path
+- If you output ANYTHING other than a single file path, you have failed
diff --git a/.claude/agents/kfc/spec-tasks.md b/.claude/agents/kfc/spec-tasks.md
new file mode 100644
index 0000000..dc2d740
--- /dev/null
+++ b/.claude/agents/kfc/spec-tasks.md
@@ -0,0 +1,183 @@
+---
+name: spec-tasks
+description: use PROACTIVELY to create/refine the spec tasks document in a spec development process/workflow. MUST BE USED AFTER spec design document is approved.
+model: inherit
+---
+
+You are a spec tasks document expert. Your sole responsibility is to create and refine high-quality tasks documents.
+
+## INPUT
+
+### Create Tasks Input
+
+- language_preference: Language preference
+- task_type: "create"
+- feature_name: Feature name (kebab-case)
+- spec_base_path: Spec document path
+- output_suffix: Output file suffix (optional, such as "_v1", "_v2", "_v3", required for parallel execution)
+
+### Refine/Update Tasks Input
+
+- language_preference: Language preference
+- task_type: "update"
+- tasks_file_path: Existing tasks document path
+- change_requests: List of change requests
+
+## PROCESS
+
+After the user approves the Design, create an actionable implementation plan with a checklist of coding tasks based on the requirements and design.
+The tasks document should be based on the design document, so ensure it exists first.
+
+### Create New Tasks (task_type: "create")
+
+1. Read requirements.md and design.md
+2. Analyze all components that need to be implemented
+3. Create tasks
+4. Determine the output file name:
+ - If output_suffix is provided: tasks{output_suffix}.md
+ - Otherwise: tasks.md
+5. Create task list
+6. Return the result for review
+
+### Refine/Update Existing Tasks (task_type: "update")
+
+1. Read existing tasks document {tasks_file_path}
+2. Analyze change requests {change_requests}
+3. Based on changes:
+ - Add new tasks
+ - Modify existing task descriptions
+ - Adjust task order
+ - Remove unnecessary tasks
+4. Maintain task numbering and hierarchy consistency
+5. Save the updated document
+6. Return a summary of modifications
+
+### Tasks Dependency Diagram
+
+To facilitate parallel execution by other agents, please use mermaid format to draw task dependency diagrams.
+
+**Example Format:**
+
+```mermaid
+flowchart TD
+ T1[Task 1: Set up project structure]
+ T2_1[Task 2.1: Create base model classes]
+ T2_2[Task 2.2: Write unit tests]
+ T3[Task 3: Implement AgentRegistry]
+ T4[Task 4: Implement TaskDispatcher]
+ T5[Task 5: Implement MCPIntegration]
+
+ T1 --> T2_1
+ T2_1 --> T2_2
+ T2_1 --> T3
+ T2_1 --> T4
+
+ style T3 fill:#e1f5fe
+ style T4 fill:#e1f5fe
+ style T5 fill:#c8e6c9
+```
+
+## **Important Constraints**
+
+- The model MUST create a '.claude/specs/{feature_name}/tasks.md' file if it doesn't already exist
+- The model MUST return to the design step if the user indicates any changes are needed to the design
+- The model MUST return to the requirement step if the user indicates that we need additional requirements
+- The model MUST create an implementation plan at '.claude/specs/{feature_name}/tasks.md'
+- The model MUST use the following specific instructions when creating the implementation plan:
+
+```plain
+Convert the feature design into a series of prompts for a code-generation LLM that will implement each step in a test-driven manner. Prioritize best practices, incremental progress, and early testing, ensuring no big jumps in complexity at any stage. Make sure that each prompt builds on the previous prompts, and ends with wiring things together. There should be no hanging or orphaned code that isn't integrated into a previous step. Focus ONLY on tasks that involve writing, modifying, or testing code.
+```
+
+- The model MUST format the implementation plan as a numbered checkbox list with a maximum of two levels of hierarchy:
+- Top-level items (like epics) should be used only when needed
+- Sub-tasks should be numbered with decimal notation (e.g., 1.1, 1.2, 2.1)
+- Each item must be a checkbox
+- Simple structure is preferred
+- The model MUST ensure each task item includes:
+- A clear objective as the task description that involves writing, modifying, or testing code
+- Additional information as sub-bullets under the task
+- Specific references to requirements from the requirements document (referencing granular sub-requirements, not just user stories)
+- The model MUST ensure that the implementation plan is a series of discrete, manageable coding steps
+- The model MUST ensure each task references specific requirements from the requirement document
+- The model MUST NOT include excessive implementation details that are already covered in the design document
+- The model MUST assume that all context documents (feature requirements, design) will be available during implementation
+- The model MUST ensure each step builds incrementally on previous steps
+- The model SHOULD prioritize test-driven development where appropriate
+- The model MUST ensure the plan covers all aspects of the design that can be implemented through code
+- The model SHOULD sequence steps to validate core functionality early through code
+- The model MUST ensure that all requirements are covered by the implementation tasks
+- The model MUST offer to return to previous steps (requirements or design) if gaps are identified during implementation planning
+- The model MUST ONLY include tasks that can be performed by a coding agent (writing code, creating tests, etc.)
+- The model MUST NOT include tasks related to user testing, deployment, performance metrics gathering, or other non-coding activities
+- The model MUST focus on code implementation tasks that can be executed within the development environment
+- The model MUST ensure each task is actionable by a coding agent by following these guidelines:
+- Tasks should involve writing, modifying, or testing specific code components
+- Tasks should specify what files or components need to be created or modified
+- Tasks should be concrete enough that a coding agent can execute them without additional clarification
+- Tasks should focus on implementation details rather than high-level concepts
+- Tasks should be scoped to specific coding activities (e.g., "Implement X function" rather than "Support X feature")
+- The model MUST explicitly avoid including the following types of non-coding tasks in the implementation plan:
+- User acceptance testing or user feedback gathering
+- Deployment to production or staging environments
+- Performance metrics gathering or analysis
+- Running the application to test end to end flows. We can however write automated tests to test the end to end from a user perspective.
+- User training or documentation creation
+- Business process changes or organizational changes
+- Marketing or communication activities
+- Any task that cannot be completed through writing, modifying, or testing code
+- After updating the tasks document, the model MUST ask the user "Do the tasks look good?"
+- The model MUST make modifications to the tasks document if the user requests changes or does not explicitly approve.
+- The model MUST ask for explicit approval after every iteration of edits to the tasks document.
+- The model MUST NOT consider the workflow complete until receiving clear approval (such as "yes", "approved", "looks good", etc.).
+- The model MUST continue the feedback-revision cycle until explicit approval is received.
+- The model MUST stop once the task document has been approved.
+- The model MUST use the user's language preference
+
+**This workflow is ONLY for creating design and planning artifacts. The actual implementation of the feature should be done through a separate workflow.**
+
+- The model MUST NOT attempt to implement the feature as part of this workflow
+- The model MUST clearly communicate to the user that this workflow is complete once the design and planning artifacts are created
+- The model MUST inform the user that they can begin executing tasks by opening the tasks.md file, and clicking "Start task" next to task items.
+- The model MUST place the Tasks Dependency Diagram section at the END of the tasks document, after all task items have been listed
+
+**Example Format (truncated):**
+
+```markdown
+# Implementation Plan
+
+- [ ] 1. Set up project structure and core interfaces
+ - Create directory structure for models, services, repositories, and API components
+ - Define interfaces that establish system boundaries
+ - _Requirements: 1.1_
+
+- [ ] 2. Implement data models and validation
+- [ ] 2.1 Create core data model interfaces and types
+ - Write TypeScript interfaces for all data models
+ - Implement validation functions for data integrity
+ - _Requirements: 2.1, 3.3, 1.2_
+
+- [ ] 2.2 Implement User model with validation
+ - Write User class with validation methods
+ - Create unit tests for User model validation
+ - _Requirements: 1.2_
+
+- [ ] 2.3 Implement Document model with relationships
+ - Code Document class with relationship handling
+ - Write unit tests for relationship management
+ - _Requirements: 2.1, 3.3, 1.2_
+
+- [ ] 3. Create storage mechanism
+- [ ] 3.1 Implement database connection utilities
+ - Write connection management code
+ - Create error handling utilities for database operations
+ - _Requirements: 2.1, 3.3, 1.2_
+
+- [ ] 3.2 Implement repository pattern for data access
+ - Code base repository interface
+ - Implement concrete repositories with CRUD operations
+ - Write unit tests for repository operations
+ - _Requirements: 4.3_
+
+[Additional coding tasks continue...]
+```
diff --git a/.claude/agents/kfc/spec-test.md b/.claude/agents/kfc/spec-test.md
new file mode 100644
index 0000000..b7e60be
--- /dev/null
+++ b/.claude/agents/kfc/spec-test.md
@@ -0,0 +1,108 @@
+---
+name: spec-test
+description: use PROACTIVELY to create test documents and test code in spec development workflows. MUST BE USED when users need testing solutions. Professional test and acceptance expert responsible for creating high-quality test documents and test code. Creates comprehensive test case documentation (.md) and corresponding executable test code (.test.ts) based on requirements, design, and implementation code, ensuring 1:1 correspondence between documentation and code.
+model: inherit
+---
+
+You are a professional test and acceptance expert. Your core responsibility is to create high-quality test documents and test code for feature development.
+
+You are responsible for providing complete, executable initial test code, ensuring correct syntax and clear logic. Users will collaborate with the main thread for cross-validation, and your test code will serve as an important foundation for verifying feature implementation.
+
+## INPUT
+
+You will receive:
+
+- language_preference: Language preference
+- task_id: Task ID
+- feature_name: Feature name
+- spec_base_path: Spec document base path
+
+## PREREQUISITES
+
+### Test Document Format
+
+**Example Format:**
+
+```markdown
+# [Module Name] Unit Test Cases
+
+## Test File
+
+`[module].test.ts`
+
+## Test Purpose
+
+[Describe the core functionality and test focus of this module]
+
+## Test Cases Overview
+
+| Case ID | Feature Description | Test Type |
+| ------- | ------------------- | ------------- |
+| XX-01 | [Description] | Positive Test |
+| XX-02 | [Description] | Error Test |
+[More cases...]
+
+## Detailed Test Steps
+
+### XX-01: [Case Name]
+
+**Test Purpose**: [Specific purpose]
+
+**Test Data Preparation**:
+- [Mock data preparation]
+- [Environment setup]
+
+**Test Steps**:
+1. [Step 1]
+2. [Step 2]
+3. [Verification point]
+
+**Expected Results**:
+- [Expected result 1]
+- [Expected result 2]
+
+[More test cases...]
+
+## Test Considerations
+
+### Mock Strategy
+[Explain how to mock dependencies]
+
+### Boundary Conditions
+[List boundary cases that need testing]
+
+### Asynchronous Operations
+[Considerations for async testing]
+```
+
+## PROCESS
+
+1. **Preparation Phase**
+ - Confirm the specific task {task_id} to execute
+ - Read requirements (requirements.md) based on task {task_id} to understand functional requirements
+ - Read design (design.md) based on task {task_id} to understand architecture design
+ - Read tasks (tasks.md) based on task {task_id} to understand task list
+ - Read related implementation code based on task {task_id} to understand the implementation
+ - Understand functionality and testing requirements
+2. **Create Tests**
+ - First create test case documentation ({module}.md)
+ - Create corresponding test code ({module}.test.ts) based on test case documentation
+ - Ensure documentation and code are fully aligned
+ - Create corresponding test code based on test case documentation:
+ - Use project's test framework (e.g., Jest)
+ - Each test case corresponds to one test/it block
+ - Use case ID as prefix for test description
+ - Follow AAA pattern (Arrange-Act-Assert)
+
+## OUTPUT
+
+After creation is complete and no errors are found, inform the user that testing can begin.
+
+## **Important Constraints**
+
+- Test documentation ({module}.md) and test code ({module}.test.ts) must have 1:1 correspondence, including detailed test case descriptions and actual test implementations
+- Test cases must be independent and repeatable
+- Clear test descriptions and purposes
+- Complete boundary condition coverage
+- Reasonable Mock strategies
+- Detailed error scenario testing
diff --git a/.claude/settings/kfc-settings.json b/.claude/settings/kfc-settings.json
new file mode 100644
index 0000000..8a5c161
--- /dev/null
+++ b/.claude/settings/kfc-settings.json
@@ -0,0 +1,24 @@
+{
+ "paths": {
+ "specs": ".claude/specs",
+ "steering": ".claude/steering",
+ "settings": ".claude/settings"
+ },
+ "views": {
+ "specs": {
+ "visible": true
+ },
+ "steering": {
+ "visible": true
+ },
+ "mcp": {
+ "visible": true
+ },
+ "hooks": {
+ "visible": true
+ },
+ "settings": {
+ "visible": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/.claude/system-prompts/spec-workflow-starter.md b/.claude/system-prompts/spec-workflow-starter.md
new file mode 100644
index 0000000..b36a705
--- /dev/null
+++ b/.claude/system-prompts/spec-workflow-starter.md
@@ -0,0 +1,306 @@
+
+
+
![]() |
+ ![]() |
+
![]() |
+ ![]() |
+
![]() |
+ ![]() |
+
![]() |
+ ![]() |
+
![]() |
+ ![]() |
+
![]() |
+ ![]() |
+
![]() |
+ ![]() |
+
![]() |
+ ![]() |
+
q%cr;BeJ!q7WMoiEqDl0ocFz8RO!J)=U zhZn&quK%cp33AgerBIH$`sj4e7KUR8Ze?VJCu}A+?RBgWvg>*WY)6j0zTIbFr3o>` zL;w%rFjE$}6J1jP^*8y*g#yGY(^>E#6N-#6D~yj9QYgY~)S$c(kcqT;Pf&eeb@r;p zk8CodjhQYPn<<;9hq)-fA9d=pIx%4eFc>oBxs)tA_sIN|Ji<9ew%VEncOrKE z3pV#$YzK?DVh3DKj<~Dtnk`?WbK51XTHK7 Ujk9UQGr5%~aZ2;A39brhE#4%&($>C;qn!Jvd8e7i&W0ID}d z?7NJ(1+Tq(?TZbT;9SS_Z)Ixfut3FKv6g}<8sc3?4Rqmq^|{~S6=nU@@Ji@}fhCFH zTt;;I4jpTC-WkPBAUP4_ALHkC*Mbcdwsaf;nK998l)I^F61_iNlTBFFW-K?ugzb=% z$9t|~g#ow;s`!x7@*@=`pIQvER!pX#Q`2539~b8!%{ |7iLwdA6F_ zZb447VPc(*e?CsH#6U~*GkrIORdgN>T!s`Q i(DDc%~wr26@J=;Ge-B{h+D3_~6^f(u&AT4&AuAUIdk$D^&;ZR5$Q+3nNZk_z3r zNr?QEQ9W)!w&_RP>eRx}l$*)3s9FNXGOx({pcbG6S;s*SYD{!MKDu|7TAK^;iNqEa z1@etQgbm!T9=pGYRkwBZ#jyh)#cbIDOk`$Q+r<$*@Fz<$a;q9oh-6g*2>(Q1@(#f+ z6FOu$9d>bkq+_4BEQzxy!8WohstE*sJZ<0i8fRsH*ZS#AQ4@PRp%f&B4-MpD>bY;- zKjs4hw9_cafHX&BlW%M7xbN^@kQp2hyud}*dQEsq0h>-L{MG8TJne)osF1qDA%S?tiY~AqZH$F&zfh8>-!g1>8tfl>0vXP+Px=%L2J!S|)a%60Qf>@y3T#Gtf zX-|qbpE}BYpJ#__GLJM?FI0Tqel^ld2YQ11$Y23DmwXRA6p-7(kCUAFGuAJEq({bL zd)-Ice%eeiuJ^v)T6uoriuq*x)>Ah(5~KGCre-wF1mn3wEwsP9d(5j7nKdNyowCWA z+8s4!harRc`l@Kf|22cQB01p)S i^{%CM{r+rYM6hqi| zft;1z9QiEWR~!p*y|G6$*x_?@)T!`@EC?Q`!)kS-(`e_Z`Mn~VLo=Aa%$73OS%~!C zN>j&G6e3F42{n2-rIc`JY1&-ssinYN2Rq;iF`8goD@C3H#p#=0&D$Ib-Ct9k;A`?V z8v{%@SDO#y`VVmmp>0!(X Y!&up39;FBTsLc*NS8W5?M z59)X@j-^7B15Lef_nsU}!4eDs5LKd|YBWbda1(iuaak(lH#u6?LY5dKRnt%?+F>JA z%`W51T?@XQR_8qYKih*?sM80fmgPa&XZB|3gJ ULEC8bE6JBA;bQ$)$zSTZRPD9dCOyd ztZ;i2e{WA)bg?iV6lR4!Ob%UuR=2`}3w9@|Go8Ww%j}i#i5cU(i4PSKTRgO|v3S1A z_-hJ2*2vna1h&uqr+d9-th|;nt+f=xcE*aN(xJcmvAw-ovOER#`j)HdRi?M5%Nf!7 z? +&AalW>swuY?SCMhCxhD?^SuJwMH5#qXR*A-T{GRCP zssp&J-!?SJIrJ8P^I~Q9_&x2(Sa*#hm(Qutw#46yC~0{mmj;Lq^sr#z;fbCpBO990 z&DsxfMy0sRC(awY2A{Gx@iZ7YLX7ZDHX%R*q7Nk?2Ku!U??F9Mlg6ds6E5=!4WmZ^ z *V zH1NGvvux8{50S6GB!f#pcxHpVTH^U%T1aOJazI0LJ#Mwy=xiX+L*!Jo!Vll8d7G{@ z0Y|Y&b6WAkpo(qv77e@DV)^yKnz^Cb%GG@8tN76^wOZ4f)e)GPPzBGII3e3?TUg)2 z*?vN0Sn~?9b+sFIywyLyZyEZsblcH&{8e1hz&E2*Tk}?4>#~)Qt-Nm+#FNc#`oV7E zwGmyAHO+vB %-_V*9jLed}d1@=dK4vm_XIR}*3JTnNAuu_(M>$85G+7xAq zg^Nk{Jbi46ABc)5Y qpD zv4vVY{RSj<9i4OQ? zMMs`M?1T-({10jUa M+Qi ze-FN1a* T z)9unHu>|7kA3l?D3qxBRam7T|I#UD aeXV_L@7vt%bOR;aQjE4CEJ1KCL2R3wGjgRDy}xGj0}SoQ@_ H|p 9l*#%j!sKR##lf$<2}Z81- c^1`I|0&6dNjc30>U&yW%_lww2n1L |`?mh72pO8r9lOck>rg^2wbc!k;9by5L11wey zqD;y}T)wH2=ktb+c+qgWo6HZF1*O6}rdb87L?7^5^$r3LlYV|8W&Jk=EMDppKVDnI zcM(@%G>(5V %Icc5dDD1s9s|`MVYym0R5R+|j4)9*zJa4Cw`n zL>_Nfgt-%$q-6-c>pd!9UQDx2?C|?jbwa0G;1NMs#HN==JCPS$+n&su0gjST?`bzj z0U4}}G_1M%@i)6~O%)Ta4j}xHX}v#_0ftqboTgsgy*33$9dV(r^SJV`u36lqFyABK z!5q5F?d&*@^6+W{8uhEeG8&bpAqJ=@zN1J5cyYf|qBxPJ$lNC7g?(;%Xe0Wi(&8L^ zm*(V*qdgm%O gUXK^Q%G~S7Kg`JU6>IY(LR}WKXlp*?0)H! z--8`fu+C8cfxCIOrVNF^ s#q5$qhOhLqTXn1cqyDejw# zei-i7LC@&X1do0Ft!S`L?kGhRL*d15OSA>6sZu+nwIab=qYT7dDhK!7pgDkq=q&7& zp$X#+G5i>2?KdbhIwt4jP|AD=yOb$jKU>r`NqM55Ng>SMm580!kJ()o(-4fpuWW}8 zXX=ypYTyS+Y?9<&9M33J(;@!O&-M@m0_}&g@HTzcMLhF4K%z-A?C?SAA`_?0(!=%Q zVTc@=2G^x$ChS}zRd|nWS$?T4LOEjTtNIoK?1Q>PW1^FvnX+vxw(+@){(f)Bz6t1j zo4%%EX%uGi8Wux4n!;cqVN+qs#8%SkKyiXeYK8Bw*nnvz@C ;Q;eSp?zyRJ*$sBE5F`n>)UP9gsA6aU4_g%E@n&YKspYU zoJmza`ktjG0`j?fMGb60|254G`}Hl5`lDVvj?FiCBBqGVMS4qp+3}%!hn>iN-w7J% zNNgRQx{<#3!!hsoO@!C> iTSzg&09LgfIi3+ifpOl`RKMYV&Z#O z)BFp!+PKQC-=D9)LF5q&Hhi+FYTsv8rti=S1P9bJ$(BOg$aF?>mYecYZXV_t-)I1a zrcu;iZyNcL*xDe2aKme`x^@Zg>O Vi~>=||f> zn7AKJ%7=Nsu;MZ@3U{ByiQm1TH=cRuY`DTVG!NqO=u+f%W2ZT%NQ=Vj_;N|Pje0iq zLOF9%pcqe#o FPnjt(%z*q~w* zYM;3Y*N2wDB?Qt&e5^lTUwu8;7!tXHij@~p`N-0qEd4y3tOD8SM2RH*r{ZzM_px?@ z2FGhwsy0tuL@LX^JhJ_&g5z(v;6~KHnJgcb?@D>E*)^x#wI6*bX8MdPX^V4?UoIz^ zTD1r B=yyMDJ2`KL8SI!!OJsLX6u}d2&)JP7?v$pEY8UfQMGj@ywvii6bdP=)r)+M z58T5?0k7|jN2K)=%O^7U+yQj_A>S|%2iU) NM{S1N?f?>5twDDm-><DZ;!3Lb&23w79JIOYjGX9|71*&g@dhEL$Y)dNKdU5hxT!V?;No TGb70fiN4PE4~$#l0Z9A=C~eRv(KEF*DY-Z3}5XcJbX#MsD# zOfPep9m&Q>UJjeQ@2vZB=rI|GEDi$iY#hG(4d`~7s!1{|*#UIzI}TgIL<2?vJJeW5 z)UEO~hO-oHZ* )8A^bYw79vfBHmb!YyH0Oq3aD z#CVW#%Gk0q^cR;t$uu &zD&W;uq9_?f UuW@>Rj=_8#L{cc zynrpM_7IELwM&4rw%STiEl<44(ovgbIxOux0{>oky4~o7ne#ijR%_Su+1t=<7+{K# zidt9>uJ30ezEb0boWq-o&)#T9Ui5Wld%1FRL5h$3Nq>WU%wlav?Upu)ph3|}GT&47 zy6+y4zp1ii^j;DqmiWdxHciM|38i)Ch>al&BP}{`!nj4MfxN=p!qqR8q}D-g>59h{ z7N+0cYGj#yL!gcyDd|tqz@-q&F>;!3GT1h%GwD$2cfFL5S$=M*-+$x~qGw4M9sTS> zN>Np^YRE;W;8G|U&eO4U?OF!o6flpO>D+#FMF8+jYxL6D-iSqPiM6^`m3tB5)Gju8 z8=AKVlL5+Nsb1py2Vf0GbK+<}8Z<9f8QDk@dCwM*rUk3%FZDL~DNkKiQx~C H5*l*&G=m3?)G55gUKZR?m{3#vjmKskUzbkBGwG$ejBeR;J_n {f~vL4i5NtTWRs@~@}**|>V)5>aepqsDV1^1lB b z*D^w7=Zh2(yq&<0Z*U$X);4^X=fwR7RF2-rX6mNJLS`q*6i<1kpuZo+`}0ddsRwC& zU`vc7--~D{$nB99u6E$BO`7r!M (v~-0>7yD>b5N#$OT~T>*)J`}E_{yk%l)blh5SZ)_ zdiyy|;hn%|>ycGfx=wWMoeo5y{Rs)JcDZOV|Ck zbpC zHf^I-$jn6|LE%K5_=NyV+gE01!Ij79iQeT(=3?~Md$Zi)gxG6CJOZnyG3`hrw+V=~ zR^(I oM}oU@s}GWxu89)_(R;9R|kXuNYn(v&UouYl;pIErJYWTuBTk1+1m z-bp|?V`zu5;Jdb!#`*@4=jBB?hg@_Tkv>G1Bt#N5T6@~(>(ZR I4EeNWR;|}JgrL9Q20@*;lpUwg5o3{A8|5C=XSHu0+myAabavV z{$ld{p&nl(&GY&j8+>l~!eZQv?eoB;NK;K6?_=y8%Mpa%;^P8TS%6>+2_qtQqPXZJ z)des;MbMxM!V`1clfK )5Ht#?F?(Z82Y9nPK zWn-4Ki~lurF~Kw7Cv&HKj3a|6?Ne74%{oMuq?Q{}(;;|L!-Y3TF#S{pJn%Ve(gL}d z7CwNh9Hn;0fuj3MKErn@w+T^3Oop5U1^3vbJ6GIz CLST2xKG0Ksao5zkwNB%=B2-O7OwM+&Fho5S)HM0 zaQ5NYJzizMn78zcpuuabu(nCd07s*yLlbv{>*&BD(w!l6z`Tp#`uH$tGElqe<@w#E z_4!{@&LtwK2E5<^z%VKRfc!sG&gKqZ@$Ag =Q6isfhQ*X$%xa zP>?6^#1)}aXY}l%g0*LEkW-h)RK)JFRO_`m9ywJ^cqU8VvNR@lh)?ZGs3hV5Zn@;u zkhgnt9RhOjg!nx@2_(l*SqW8GRN_qZfJ{zhc&GtI{$6h0Y)Tjm$WF>)Fofkc6AKZ0 zih^Es4g9_6*A(me <@%-sw!I zhEqnB)TFWl3;0L6ONDLl)je9Eyjf_(6xa9ZMr`4(P5B&U!4sIot)g>f1yw_3xfDR4 z&<}NDB_N60TGC}}n?7%{7Ww^JQWcHWOuQO(X{+`&TQ4|+cj};2kH(=5v#}!PC`uq2 zS)Uhnm@$G}r-q@DRBodZxIQ^a^ZHO|7p5wfWV(*hv6LQ@@zIB5ad)b{#m960-yY>o zJEQje@LKT!@tyJ00S1>mWeXG&(%CXAcu8bQ8Bb)21J}s4*==Jbq4WsQy4XVF4H{Ji-u@hy l<6;WQEY2+YYsBy&ugVb*dh`tc$nLIHX&K0b^_7d z8cOBk{_OIf(nDq|CAI;o)5#i5Zw>0!;{u4SfzPR^y~VMKJp{%BgP{?Y87&QiPt!}a z2OddUHuWu+`uhqyVItJiHH$DsZt;HDrO#vGBZ-c^HN?SR{FzG(6$sOh|BGCG_$XzV zGMaQL15U8WIo?beri0SIB`}=8W|4i4g&W^rWE!V q}j`%u^QC64Fo$cLP z!V2n#{Ej(pm>JE| hT55Z2KoA<*D#sGdFH(6EEvxm@888oY?XQo>Qh&THYlh+%z&ks^GUCABkMd(Ml zBm+kA*L$_LPYw^C#|~M^jewt!ljHffxkGvK5nz=bF9Ca>K0x^bskX%3wq(l1cilG4 znOYI?F1jsd^QOOBN_+p_$o}u;kX(6q%y?gwU+M7w$3nyW&q7m_vF5z`KbZ6SNgxR+ zXBWm)#geyeob3b*T4yLrGa?B*yya?)Qfi~9c?UEm?P2a}!J7P%D4xy(QOt_wY4+ZM ze~E+-6Xu}3`1SREc(Tu}v6rv6ZQJxDH`1L*-Jp9NOW8UVY*SY {(Av$<8g2>3bAK@&s9NRZy8QQ1<%h>D&(@$#F9O!PtUd$E|nSb$>F3v1}o 9sWsog5_EVPsV3 zzR|4G!0ZMs;lc-Jb$1#e@Z-Mlp4h9~%IG(*SUkm2$qmrYSfkBBtivKSo5flx34fQW zb*jv^5)4l^WU49%UjVKr=wPx{x3+?~Pcs^$YTY z{tz_r9Ev2k?vD}C;(Ks0T8e4E<0LN0Sq#Edojqq9d9o2Bmz@)(JBmYFyS?hWnla-v zn>WG5iLO4J&oE9;1?Q1j@61w^*Jxd6#rW>A)o@tf8a{fjx{F~8*8%LZgA~szRrbE- z>V@{2M1zOzg0qIBc#2`B7%J@>_z6D}M~XC8*xZQrjw@?%(?=kCu#MrZ&58G>E8)v# z%VHx5_2$vggY9CF#}V+a1yDeLf*K0=2c#b-sD+_nQO!sq7b6ocEdSU@lO kD^#(^v5(!!2Nv@^?Yb zpf~nzYl*I^#yl{Xz1|J2G~}nbpC#Z2QTNTVzg_#kYsAp{(Rh`;Y1F^`*Fs6P>TvN> zNB}?+>py^GX=Y^lKN!1FQ#N652&D^ZB!IY8NMZJxL>XyJ+s0!k0Rq*tKHg}*@t8zM z<%(^^)#I#5keD0W2_F2K9@=?if$4m&Z!`eL{ns;2`6 vD?v^_uUpEPM?}Wwo%nSafOJ>Xqw0V;qJFVs2I;I z8K^2348~~FV}&LL<7w5=RC6&sQ@SLPsQNA`vBRjFO!9dh= E*YL#4M%eTD+LWShe6baf^8#?t z1r;RXM Rt+ zaw^dXJn^8x?z_!qB?YZy7g>~1lsNYOE=BE7j1i6foAvu}v7d`wLjLe#*PFJEl7Ehl z}?ic2xAj@QJB)*Wrq1WT5Ui*;@h{*>~*^;k4Jujx@ikh6Bs#1&7V*HGmnrnsYN zB|$+mZFV@qHuFwK+jwi-oBcqKAZa#qeKQwDs9qkB3`gyH=tfKOms@LZ(!MH4D0`rS zNJ0l4O{{*@4te&a1irhe4v>q3HnN`s3J-rYs3l|tRLX) -JK(`L}m6Kz-VVbdXY>+?ME0EWq>Bkw_y z3QvXYc;fQ2d^PRjH_d(Rpk&nIJSvIs%XUHkyQ`~@>xW6fEx*quKaI|ss(uccj@fmc z*SdJk0{LSy#S)RMZJj?rbO`!L3qo2xo=%#wkjXdasGzQSVYr$tu^tlI2iz$Zc%H5; zro5VO#=xHD30^Wk2-@xl=hp6grv~MgUdc`gj_4{7BDeEk+=!73R)th8-oLb&KNsj+ z2%qDxG>IK#A-ENkv3Ppp@#W#EG~-Tbz9Ay%G`g$Vp2sR3pT9I4+qjHJ02h2yh3sq^ z3&(ywNhGnJ&KL75%@^x^O#-F)W(bw;fopdpY}H-EKf5A5*u~6#Q6nx{mJ=^C^5!xz zwz3oApch=HoNv8U*LW0^b+ERmMi|;F=`f>|Il;=yVUIrkg;$(o8yZ~%Z^htK!*bct z{ZMy(=>8Nz)ml7ZO7IpL`L81mx^M_VorWpYh~lWefxuF<2Rz~SE%xW@=5ulQpe?RD zY(7N2ES5TvtD%eEW3t_w>N~aVJ+3`2^*?X9^U4{cN^Uusa{S%jVVkjq0`@?bZ?{e{ zFrG-R10ez$=Y(K=@U2_dfpRrz+pO|XIq`1iNK73RJGRNgR5(3Ud`4cs=F=6m(XZvW^V6_BWUjH7wO=Z|Kw@IY_Q`Nzl|GHvBjM=vb ze#lFMRG#e~nlrZ?UiV7)cDX>u4N#$e6v^bbWrO&x^sS|R1-Q+OHU$B12Xi3gY*Ixq zh1LrZI~48Y7)D7qh#;?Q=MB2)C?<^hguv{|I98**WcWRS`MiOf0%x!CNyA_=ln_wf z_5M8V&d+3B)X7Cv7fv=_G1~+maSyKYR{v>C;Xe#d1m)k6Sma1I+2?D P#j+%*l@mu=uh%$(F*v6Lb{);K1_N>)F?K(+Nk}#4(LeQubf@7JYEPL zl@A-wH`JI@OeZ{r&^6Np&uKrSnoJa3rYVN+I$o6>fLPJJ^R5g5_Ja;a;?G5L^Eh58 zK98#hTPB}{H21vs{GY+6!K~1)_DDgYG!{?Y3>`wm324$PkdqEFR-eVBMqz=kQs2u! z8&P4-^f?&LQXu@-YMtoRO|`hw312_Nu} -UXV?fsHBcdXHfImcbR3tdyBb2k2a e)yCqi6y6Mg~q6+A- z`ZX&1vWcbJS5fu>e{J2*Z%a@#yKqkkcUn^#NV3iHhvSO5;nl=%f~H>;y~kHQ^&e;L zL>?T0^5z1i<-TtQ|H_p7?*g-G0E$u`0sxr%&z YhI}+Xx}L2H`UUy6OyeLOIStuCo?jT@E1_RVm;5UsL2|OKq>~}9o#K5j zsRh>-{E=ee5hDk8lX@mxU-b721l_eh@jew5I*W${2mSluW^ytb6)~+Kiw8`&*TIDh z13rUctugvU2C)u?l jdTN`?T>x*%63+i@(Zg@ z0dWkVpp`sQy=GEGZMvQ~$y?&l45GO1NkbVVZnM-^6kN1UAQKRK+{twZvXqi<^)#;l zT~cX6XmV$`O#9^?Vii7pLlmhd=w~K=JQ8Q;bYmVlJamp 0zTIgWCBqV3{*9=a zxh0tM^7tJ|Y9kWqdAq#d{QHw>hQsFdUARiNCDkKiQ|&xP7{$TN7XzyV4g!G+*)C_Z zy!G?(P0e^{;RM^%hfDS2<@IlKk-0u1Y#3s+PSG$CJb1FsBilcAV|0HV>0S*S&H `3uK7-H9o*hUpYl#sI7dhbAYHgG=`UFiaf4MdOudJb z2ux=#;n3ut9ZLJQ(_u>@q0 1@9C$@CLX)0x&CZ-P(!H5`0g6n&(#38EKesg#)Ip_O$`lz~n7m4wcsEpRJa zON^U<;(@O$EQG|x$p=$Mv|>f7@>(vA5BgIq(Q~XKYUo-6q1H0wh)7T+VqEU33I_?6 zsJ0`ksk|*#Q8s;EgqnQdV>*UPRrFkRq;QnGHpd*4W)TccyEXG5rc_^q9r^}6m9Vin zaIw(h;Hq %A&dl4@E$X5<h z6i1O1AMuNF+L-C>kM`hCC-c43z|`5Ag=Q`NGq(rS?rKmy5D(k9XM*YhMJeMC{@64@ zzK#%DZ>8^DSaNbNR}0bCx`F^8?%Rqm2n_H?V*h=$@n2%>YO-9Fj>LLi;Nd+A`8cV1 zDm8q)tjb>-`_7cA(8;VKmKe!R&+QE7ETe<8Ww^p1qMlsV^3o>HV~Dv@0cw?wsMilR ztg0=`E7AKDN_8o*J#Y%viG=!B^Cz91 G(jli3E{j-g7Q;ZDV=P7H(52 z&Tld}u{tm%GwYZ%9#rz!W=!+2BEo66Ocn`TKwCXD$3A0n8N-*nm5|>RtN2xW^?^DM zSX7j*cmeNS#?CKGSKS}a!w%;B3$_an# EtW zWrK&jykWclP@D_kl@IW`oBeG*7+kasAABsBQEy%O`771n9pS&(;`;5mNB`L3c3-ym z*XsN4zLkGW#Q*M#yIw&%?k>xn%jr=5Sm!taqY~ken=v9YI&Zmxb+LA26*`3r(l{?Q zXkQI$fBiPy0X9dGW*iqxOXMY|gi~tVEzxa2Xd%0gBP%AyLcNUpBUAV>`^y%Owxle^ zm}S`m5zQ=9a*ac^0fyG+!|V;{-lSSv?N8||kJhhWsEj$1xW$SJUXSw@lba3o1PexT zA&1c5^CK1xW}*M%i)T`Z>A2hC^nUr``a5Ps=n8;d#QvWNSqT#Kb^og`euz0IWt8X2 z8^?B)l0GNZxi|0%rAtHc<>#_fVt$ lW(9l-=gBe<*mnKGZVAL5+vg!;M!n@vcrRuWBGgZLIjwT1|bg zGn=n7#~DzDO)084LG-0Tph&@Wexd?E N#J>Atmn3=Dk zOy@{&6G%`$^na=M?SQwyDZ 92zox10^8fq=%xTxb( z+JWK0p9ftHx&oX8U{R)Q2rhTmdFjyBxNssWT|$2_){~KxP~%FP?s0g|Z7X!3IW&Fh zD! o>5yE(pId%hN~!= eA|Y{! z(#R3YmKtH`p)?Q`{yopQwB5nq*5+nVqd19e0Z<^)_4BUn!;w>vIFNIOvyjn@fMC2K zWxR?2j(I93^`<~bERY}|ebJ7YltJtIF-uWv99tKB`IbbMZuq=RY1NN^_R~xmBIcU? z>NUae -xRAfzPC#RXDuhQ~MpvNsh|ypU-istqT)I=aEB4#t zI+zK#pHKftDfwq ?zwx)?2k l%9uWE4?K l}#eN+MzkmwPGE=f(v-M-;IlwHN8ga@KRi6#bQ3 zx^*xVqYY#df=GWtob`Eox5GztaPX52Ysqe&KZQ~QH!-|rdhB=Px|G~m3;!F>;56E_ z)0!vRo$+v^f5oL4wurrn!gUjpefD$b_qSNfO7tT#jM=gaNe9XsvNx2(MXB$yXL`c? zs^LV<5`$0#_dA2q;H{GN7S|&9aeZ|rpMHwOz(C;#cm;tznjCDN4lj~}UxTgvSSbq4 z*gPOz*liF^u=1s}-0JQZe-xQsD_HJoL>T|#D>?QAACrY+`TRlIh}2X{)Na&D$M2^5 zBWPS-+`=SwrP=b0_xrRfm%6MZ1e>FXWEK3ZIrCr4LJl|3SPnP%uL&Nz*c6DXj@?@y zA}__4VsB1j2$-et72D?~UlsGaOi{5)B1mi_R+5UbqRgQ$s53DEtsH?sQLir~h}`xa zq=p_e;Sz-5ovTyb=vut^?trh o$=;m}XM{xP3yY!4@_f`s27e`}tE{4Sh(+ZCgVUqDan71W}_! ptB*T&x;MIy2^n&`eVaG5ZLN_|tjLOy)Kl*-NVsVhWVWi6pkrqahYxZaF`h1HN-(b(cEo+fXFh~1 z!okWQT}7W(udWQA)c1QiLKierr%pK%FFH3lb%}Y-MzR*W_LP%_z@15Si$dZb@=&|Z z34h}VN=B`CAm7iT#v@=)d@pK ?y; z(TIZ>1n|$q`1<8vjk|VcrdCFbR(3`fW-JVj_7+h}3X%x0xc}URAT1@P0sw&F0|1~b z&|k_4Fx9A2{dE9wQIQk@)J)-@e0_m&l+tnm01yZMnILJjh+nVsvq@S^Sj|)a+z-YO zIJofX#|W1_LeZ*JB$BKxMBi8zx2TQIp8p=2F5cA~>fZ#jD>5Gp{OJZ#t@MssDWy_5 zu!;mC*sI=yo3W@k*F9?tERq3Dr->Qsvhe$KIh>gI;j`uUDtoK%JY?Z{wfUXZ!k^XU z$YYw@qvncp++Xm+NA-cAC7u(KZv6K78tKi#w>U37?5G-0g88%s+ZZ{&zCLTq-qJ&o zNA%er>>nT@5l*Bc5ss8hCI9~cKtR90NfZ@-T0ou @dwJ{2TJ>>?Fd^l6l`v8Y69$<1sVi|)(iE}YPFzH3nid90yQHe)1QghqD-L- zXo3QpnwlD$;H!X;`YM3>1V}Gzx@;j-Dti?F5&8<9F|()~a$|2`b5);f$V5hg2Q)Av zD=Q;26F!-ul`;V?O--OuvrtG%!Iq*_$Cx0MB!teslmk!qrSl6G5#=O$;$KhzM RFM~uk}}WQWv*0VJG2V>>* Egt8&yS zR1XPOO@+G`0zrIiMC9Nl(V`O!`7{WPKL&6lLM4;d2;QXTjPpV++MvpiFuU1Gd8xmN zn>Z!=odA_(ZG}XWWp|1%_U#i5Mafb1n3U}z9jGg*n@A;vpqj;M#Ol7YtEQn9<#m&@ zwGIMuWCsfm(J>+O(+qK5xHPv87A7;RGA^;^S;yF?DvVOPLOn-xeorBEHL#Z-J*((A ztx0rMRn<6VpR0{_rl`Be3s^UFQ45PBBdm*Xi)=MD!l${hv8AEWYJ@NKfyR2Pv7x20 z!D?z~X=(^G!56eN1jOG^AJ ry7Fgh~p2CfS?1`6j+aCKuve;#UBzVnmu~;EBIJU{Z={$O6iS zB9|bwGRYO4h@5>3BAK>gV~)vh&ro5KlZC`lBt}HJaMeJPL?jFs6*Lr*eqzxT*%j5p z!=gFTekFTCn@^O5Lb5 4*z5HZcK^vho z1=tK%t1D=Lpb8pn0i3K{F?bq3WHvF9v~$oHr%oh3D0*DlUWAQ uG53{CNZG6O#BkSVTv5~%QA|%a#=uR_E?u_ epkjK^Blw%JRX?Rl*>YFTyYnT>#RKbT@4FQj}-o
b4ZrgM6)3>ugMub8xq6)fmvnHly>zn+$$xw&s%`a zfT5tF0X~6-h8FlVHUz*W(%1xl@hmVNq*;vtLA)R KxaFoIV8GMH8?nZt2N3-@K563ss)W`i@cxm(M%{12zjBEM z8PF&pOLiq%GIb&cCH#@gJP`uj4T5+u>8H~i>mPzPOG!9+W zwtYqz2&HWV)wem5b`{AXsyLnF!eLAtIWh$Fwvj{6CVhF6bctZ4ac3{=q?(>1YG8QQ zEoPe>y3|K-!=M-{x#tA<*r(dAMxH)B>XeyJ%?-`LWh)hYa)L;Y8^BHOW7U1CL+O@D zx&LsuD*K{gbQESwHJ9zHzJOULf|06ll1C|D+!PT uQ4ivcU9r*Xn8 z F>5>v+ RMU z$b@pwJiYRb*WL&-J}&y^MH8=??8<=dzZ-rq`IdPH-u;{O@qtlBK&stk 0^I- j7`y;sMRbXWB??!6T&R#Z$h$_O6ST YgIWteomk?@ %68tE|NhA5~ ABYn9iNt`B zT`O3x3O2$P={4Nt+$5-}Q*4i?Uf_)}MVBsPjitt@9#*4`sE6zceF3$}kb_aFIYNV2 z4P`ZL gm7z!1%%@APnf%jv``>;OFYDrTruc`bl_XdcQzRLc zywaAu_@1s2gnx5T-@kmk&pc9b#W~c6#GC}366?NVT6hqmsYE6?ds6Q3n|?O?@mJo| zqzYAXS*kXzd-cGsPocoUgZtk9=ev11U)u56$Ft_m*uQW8l3zadg@I>%{K-dO8S%BA zJ$pf(K4+YI-ndICatoF$vImGO7}*Qda_PA76CBLuG2%i>YmQV@URtHrcp+4%ntf=m zNb; 4ckO~L^Mb+F5y8#CW$-<1DJtY5v|b+o#+y^ zqM~b4aZA)mE{RZ )c48fopMRh9^}=ntiY zB2{YbRqLecDU-oSHX_$+2ffhPk{n6uiRo&(MGoLs94@ z;RpRi@5mT&P5V?;vOS94+EY{rr@IFANBJmm*4TFgYAVQ1p`j~Dl^7h-(rP~NK}~if z0lWI+Jf&JodPoDGVHMNXKDxity5ZE*H#Q=$k1j-XU6DHIQBPz~%@Mk#AqzA?s%w$s zKbqAhs2zMD=?H}DhtTIjopB#Geg_wkM?&N=&zfcJ3#dWPJTvQ@uBtT|@)WBMDv{2@ zLj +||E7pM85oQgzR-?sJvu**$y3PbN;8 z^NY{_`hViFI6 YTZ`N$svU%&m z2ktz4`0!0LZu#Ml{ g-Rb5GW2uqM4G1sA33wX`#lLcl%5!b{3wcn}6l5vf8G71Bsp zI0T)d2OsUV*yJqcs-vDCQ{)7R4+t@Dk#U7otb>eKbYo2j(kd+;10>oYn4Vk?h_W~% ze<`*d68dB0`mB1yn7f1$nJ&nPWbhh|n^H_sQd(qCj3OoWf=w7xAeVAP8jMPiM4F2< zT0~OcROQA>PG#k2p+(OgC64hUI*s757km0eg(&H|sS(7hq&3kdKXQeo5^7Dig=k4i zpkruB>SB+58$gpAxrd{KLGxP$5+Q2*Cw|&@2sWBZqJ)&Dq->;&%QEh91i3dJyOXt0 z?5q$OW(JRGml5VZ_zO-S_;v6%h#88=<=?Ob5D8 zxu}ZK4wDbjVK)a-huj><^SHAjmvD!KAeGF_=1Fs`f~BgsWJcM4Kd|?ZBtX%OVmpsl z?%qARJ_e-f`s;S@KkDk>yMH#1I1Lz$T&MK$U;J``>r}6kx~}~3gekY(`Pu7#hEwDL z#AnpR-99+}^mA-*Ts;yfpQ3{dE4T0ezfX_3$Q&r}jZ?c%9^3~nO`<+csxV+mx%}We za)1`UHeB^ScU0-^bAI>N_e@eH{WZ4UKL4>}M-Lo0(5GMTv%h@ygh^Ky-}Iv`Tef`q z>8E$zJ1_s@uYY;?+5RqpPj-HM;&?sT{wZ=?{U@9+c+nA|++-dxKH_OX@d3-0H0aP> zFMM|Y<=U(v{j+a; IIIL;l+D+%?b2F<76Ik^qyTrhILHgL2wKN0G-^VLqCdnJ zxx&jM=sz@r=Y= ^k1;1BqNaZmCOe8FeJ@dL3?*?2kw z9uXHGj1-YE;^IzR{-I`yAQDuGqDe#`Iofz=DWi6Y53S}>9e@{Pik%nmF?6{FgV2o* zQdm00iU|~yyGkC!ESM8p01Crj&^Zg*l@0%8W@qCEer9K7iG$QK+Ce}|l+V@6CWs!F zXUW1rR|E|xHA&fcWT?7)l!3M xTVpYT~IT+RkN>rtw eP5X0fcr`h gp$-{QW;SeQ5bIM_+K>kN<1>sIQKC{5Q+a8ZzXKSKb_Q>NykU{D>|sbdmP^ zKK;v&zc77`s%8B18> ;v2uFq_0c1oGh7>Yusp~sENU!3DO#7K2JorayE6Ew%?@RBfwx;Mi zdnZ=nmolI^7F46(q(0Ot*$vuEgyn@0{hty@XB3pSX*1Z0Ky|6!wR_r@DH|otF18l- z4Wq(VS;$=DPWGwONEFnZ;K6EhUbEr07+FHyJ}R@26OG^-KeMgDl{!GCtO{doRg%3X zk&`1vgakqX%#Ht;0MfX&hnc8^`a)Z7jDDmZk<&%n$uy&r16P_JiH9iPu F4HQ(I>&>oMD;i|F)$rM*D$2CMtHdPJICda;8pv-ty zA9VlCo&Sq%JN5=^e`N2jrp6OtIxQ=^>&g92ciG|w_V4w? @6WtJpLHL1qCfDIUVr?LQB&?N`{1d^&=4h})XDLOn+CvNs|7-=;5b;V z&~PO;tg8$PckhrqSzeSSuNb#-$HxbnKR)ou?|k1L^~gJd3&@WgCS=o~ zs}!yAK5K8?|61ptajN?1bS{`Tz0%w+d7LR-TvDCK<@Jxw=(?0`jItY-L}haEAPSIG z5Gf)sdIiuIO>;02&B71(`0zv9gvy8D^c7pPJ-J$te05nDj18rb2Upfg0d%69_2YrG zQG$48fQpDof;j0UTd9I- z=Y{*^%iouts#N-6Qt+6xFz|kpgy#VRwG) zSTNc3igl`HIYz4*e9C60#=LoLGclpDr=pR_DyFQQcF)NjJ}B~9n(-Vq9GyW$_$Z1- z9Gy1GQXlCgmXE;6@g_kL6GS_-1k%#*Y||74o#a+1pPr^OsR;EOsS$)V@peVLWHGu2 zP(P$An_?H07h8>Xqc6oAGshiiqWs|Y_E&n3Q? dRsLv`(K zr(1Axr0VE<5izNeAs(tN4d!6y?`@0#U70 fjST&%KXF`GkenYG zJdDp#xjvv_qe$=th?M@A$Hmhm4uL2SHZp)nP{U%R%}5cytj!nzjH>K``BXI|_zp+l zc*L@{nMxVSNHf=Xal8Ne_BrkO=l)b*U;pyUFIQFlK6l6n2u| 3yS@ryaj z9)ITj_ut>MXV3G0SRcU04e8QET}g3AbS;N3r+w?E5BlzSWwSAcB?VG!!noqnR~JPh z8btSkj*rS}yAzdPF~o$RB|TU^Sw)D{i0!1*&8Ij(S6I4o!zEJufG9PhO8TN{uUNE- z(bZO6zxB?LO%T;CVvNLQo^p>t^)HqJ7EC{J-%j` 9>JdCKQ^a$k_Wpdh z8Hf1jE!X9~@2=^fJ3&r2Y@lwek|DNDr;pqrmY`8hR_!C+BXLvDB&uy)sSovEg`~YV zgxY(Sp3IOBHp*Ee$3M-u5KDT{g^LfgCITU;mAou^*Bz#m`;-@RQWHrH1AP%zwMnLB zl-26!ks}vRb*F9WYf~#@lt~6A=deBcG{tvm0YA;f)@2gWwTI{&@pPB*q1#(|WpOU! zaFA%t;$QyE_0eQYYC_u{nkzWo{)wmZDb~l1?2&t5QoxYf4^w_w-+j>Evid_^B)|05 zd$a;@9L}2gX@^X6OL3|Q1BocEK|SX0g2GLz4m5t!wQHBXd-wkCcfT9Z?~FmG<@V^( zH^bjE!=LSM$?~`OPw98sAO7(C?%lgjKI!EB^`GiBMA89ea ^HqL z2KJir3Yyv8d8|*y7kX#HXV8*&tiY~Uf0TLU9RX|Zs6l
H^m8^)umn->kuXGiO#qeW=oJ`(>WhFJnl*jG>RdD|m+V2nw^1CJn$J zhzJORBrf8#bmR5fUIT=infAhgJ;NHsf&qW<3tgsxxr l}3ogMF>A~t8`j3#QtYgR^C0EdsY#dQ)-hZTrxvRgY6X*5s^EEIu;V+?w=l> zq9#*g@uL!L?m(J|{oM72?zG`JVI}l5mVC8T%dOtk4iQpq*$ws>){C^}vQnn1QLmzp+!i12D?~U-m|LLdtP@l?8x$K2p5(Uvu4zaRx 4ms8;VFl5ZlS z2BJVQbZKi3$u1 ; zM4^ %oLgmR2r$i EBd3rJ{+8=64HO07J3nkGQ@{jJe6l0qqimd(bTd`rxCWfM?DO0p (%tIP&FTuDuJrj^<|+3r_$gI4`)9xWT3|o? zrJryd&Z?YP3X6B`Ze@4(gTSuvfrDNA-MVC`8ZD?jI}>&la?L1rOjV!8U8nT#2bQWa zmtLNK;iUsl9S%0V#^(B_=HnuO9(E{gIC$jq|1Q73p`l^JTYnq!)o%#{kLU-8qP9ML z?I&M+=0E?vWbEmF|9ijfGwRNT8+YDt-sVR#FTeeJzpGs_1_P$v`AzRpf!CU@9S-B+ z-QV{6YT(Ze*N(6@FYR(wV8iz7&b6#}A3x=5fxk4uL7(rv$NG-4{;%mL{a?85OW*$E z!i^u#gbc{2zV`cR8-9Cb|A6)ROaD3g>1l60cIBR>T?^-1^Z!!+ AlxmmPbzFPr^qovlE)XDXCelq~KB*`7L&DBdv=3C3>`+!NB@%=Z zhM; Qm1- zVIq+<;>`Y%Tt*Nza|D^?<(Lpsg;k8)kLrtf-UOtYMo@7Zpv^q?C{UJ8IrhXqcBDTA zr7Oc5&LH)2A$e0Gn2HNsaf3^U8n~+8>X5rn=)672?74-9g%0!wH?5_>bG-CZlf>N- z5^lO*!99&t^?IC}+60YQonPZgbxDIF{!3Gz{%}ey1j6-6=yRdYxR0yf!TDWN+svR( zc^-6K4_qF1&$8y&(=ut&4277gVu-1_YwON^@_lMX1xNSqZai_!>@X^&Q&yMmJ^QLf zRvjHUpl8+NkI%aC`uG3!nXBxE*IudJ^j??|kUQd>(U**IwegJpJ)fI!{`c=KuU+*N zUNA+-6z%f~5mXr&FlSrv3j|c*E(DI4s`X91|JKx#YW!N};eyNq!AJ0Fs`gW85*rAC zdk >{r3zuFs>*w>H-@Z58mI|M~^XHr|4S{_V3Jb@5 oe@g z5qL4+@#dD};%W7k 3C_7%1fmEIKU(YF^?%lZK z`tzV=K&r-Cf8R0lJiPqBTR!L;x0 V$*MhYzdj8WJt%`2nw%*!Wat?O%=P%wc;>n4den0%Z z?_aQd+MADE* |-fj zibwoOcyDA36Rrd{E0U|GpjOhiAlG>OB~}$$AndEEBp_;M1Sy| GmcXMTK!~ z5Yhy5qhxNLBw9vmq+`?@ GiLfd#c8&Z3{7XSBsjk_bs_X@Y1e5 q48k*twejtb>bBpD&p3$WPs%Xa^1cwHAV39K9g%IqgL zu@`(r5g@|R-FXTb8ZR&) lCX428x@RsIj;5G zQ_WPJPTfkC=z%5&tqhA(+mO Qo`A>nijQ_yir{RqylIZ$wI z<|zjgl2;&`+vw|qBb)eP))<@(GUW8NZn){@TW-1alfCu&g73QEcr?>_$d%!YQ+ht} z_+vNUbp1d7wZ{ctIH*G-eflXq|2Xl&slP1W`iGSufk+kbCupA7PXTwU0!9UUV`Jz# zQXr35byK{3;h>APW>hE%qSSr3+>3~HAeum`@bX15GntvET{PzA*|)9vXm_|k^~Zm; z?waphw}1csE3O#(;g;GHha2~Na`@xA&;Pw`|Gz)l_pfcAzw`E{bI%)5S64UdzkdFw zr{59RDq-88cgTq=OX1Vo|FyUN-}@Us5mqI+u3 q`1NH2 zgx#I2J4ji8B(2+1|F1pu+xIs7dtc+DV-^3E)nVSk e8hA1e+vi@Ur%`PZ=takTt_!ND)rRB>vZuzvn_EqcKr)1>(c>QM->4Myb zB89M+zP%RS0eBIRxcGvT0-SE*uk!Sfv#+IDIfkU~OM2zV0|=LI`IIT{=`8(# ^3+Gw6@# zP{P5EK%!6>@^z{e(d~Rxu!#3vigz?AZBge2r8%l3)HKi1caaAQDmRdF0Le%oJGe)B zWUxjk)!0zq*wD~e51;ym2K?Yp{M0w1O!!E5o^pO^(5NoT+yH(ksGX!WX(9C_t-gW2 zz+bFId{LP(zt)^86KzEGOgEPH+uB}T?c`EkHenwXF<6>AOJ?VJ$q{o;Mrg^1B_dg} zUP9IUNT_9dX`GOcPx>PD0FVQ>0>qhw#^U1K{F39jBoK#YM9KEZJ3LYHz0RMLZMkw?5Tn5Xo>u@4#w zi&a#vx|CBM3GyUrx1(-6 y0}Fiwe#Yd<3?Xv9h{kW_Rs!a&P!#_v)PqpObrK_w1DkANbO{R~CGF_RQ>c zaz<}F>+jtgzC{1Y6s4dze6oc={G1Fjv5GAC(hKYDcFJij-A?Y^>m-BNAeQc!DtKMs zqF>J)IB?*9{nvl}Yx{>8U7CCK>;bzN!HzgSf6I|$2d#|b1qD|QA3prM)2 fM&%m;T)M)2o)eBd%1t|9tI3?^E2jzN8KN=3L*L!X@vD6@B+B z|5f(B-R*RxJ8jrC-&;5J)>n6nRp $xp^ 1d#EbK7A$f*RNhB=xRZ^fW}Ym?1F&>LA{CDJYTnNCGND zm1PK#4idu18)sydBA|j55o1G!D&*k8=|u#k!h#XV$R1_m(SbN}RW|xq^|j_G(&eg2 zfM!(6qiWx%1g(am%fxxnr8w?Xte)m8g6SFYVMf=efFVg=XrZ8qDd)K{P_;QzhMX(s zqaLU#kj@U+vPY3YUSz)tW3VJq;t>r+eMHTmfaz#PL!bK4$|32$QG-B0eQ1PBNow5* zMJ9xGOdH>%E0HiYIG1w&>v2gP=V-oh4?t5)8?>0nq&Na0sg>j@-s*=b zi<>BW(yW*+S`t>}iN7pWjT1ie7f>$Z}BuG>j`;!gC z41S6&5rI~DQYc4RMc%?6#9bA;Wch(@opf?m&y%xHI;m^Vld@0hnSFB4E+_ZQ#v}0Q z3DgH@7G%imd2*MNPRa`X0SV?=_?ZbGkb`A=Wu4SB6NH0IkaKd+uHt9c-o1OAdd4Zk z&)d59z}H59orZ#KtA2Y&gJ~LE^n<%6-EjUTm*&H!SX;MlTT=db->fe-Hf0{EKeFf0 zCt2N&Ex30cz|_Bg|0jO?yAS{G`27Ew3wt-wzD~lO^x6LvpY^}j{A ~FCo|6zE4USaIPqcsu~w)u_vK^LhhdL@P 7>!^e6~uxkE!?KyZo{OrZj zQBQsMAHVx122Q Kaajg~}0O7;KEbvEC z8e}ShY7yTObcYN@qR*)7l=A@HUnob;5@VXtqN*1KDkd_jW8_d%`x)xD!qGOK>ZRAT zT^p^qLM`$|q9o!p@?Rr@MO8(4l=(o-Z?!nto=m$%N=M1#WF-PPe7&IDMIpnl_SMAA zSZNr*|H43swk6 8E23X5qWnsPIWck7GSO1C3>x2McgjxH-65)Q zdh4W1)HZQDeE`~LYWpI|$7HxTDcnan1j)s!TwxkIc}pWGlrW}ByAcJU3$lm|S`z}< zhlXBaMB%eCYP(e0h*ew(F$PnRWji99?6ovN<>({EqJ}YzHTa9}TD=7;N|W2VLT<^J z<)Z+~-6p7$c8{qzB(>9oXuR6RROFLhZ`pPB9FZL^!6Kf8laq?mjvUSxX)E)U44+qV z_B7r}B|W?KM5I7Pbw?y` g9$ W^}4r19Z$TDk|9mUFgueri@B*z@QvTxS&WPB4UH+R#{%ND6Ump3ibL 0oV=Lx7QFy#k7g)h3^Kmya6+z{*5hW8j@MzVc73!E&zwBN| !C(Bq3db zP3qYTqj)M)4qCA&QiEh%uyLoZGT|$0sNYCs!8wEgHQk6%Q5JRFzB!@zXzC_GrEo8I z@gigj_@KA<5wP$_k}7iWP& #$UZ22i-rS{ zy380IazGIQk{g!`9ze7MPE&Z6gIAF?SdMKuCH272^aI*Q`}(Wx^5rWEKx1Ldv;Co@ ztsE(04ilK3yh`Irw;i&tiPp&>B_|nO4X9gbS_G3S5vlGNuF7PnM=l9 #zWuGr$e1_99KVrGaIwjn7sBy)p5|wtVNlZ zXSqPCtAHy{wy&{IcGJ4**EYTL_uV`Gt(z&b8LD}I_3lN#W6Q!M^mNa^y|7 *zjAARt_hr4#}yzuK6!t;P{y|v-&v%l20 zZ{J_saqpqcr+4qsy=SkU*Dd`4@(W=!QR@k|MZLTg16|buFIbVdz}ecVbqvV?E%|7g zKt$A p=@@})4sTD&+}aX`Gp`cycJ@bqEq zDl#hg3)lT7arGn{6}}D`{!))n=h$5&uEfUeJJCh4&XcuDF1p&rC2dp`QX|$ZvR6?X zMG}hxloV1#RpLLS5AMlG14WgUYpFz4ELVo5ie6-b|D$|zN2;J*V3ZX1jHd+5nrX-t zTFql~>gtt-EE @L5grx(I2C ztSGAqF7U=`tw N0Yb3PL3fSAs9n)YCLrb_nSu#-gw)*>57Emo*`&BIZh{3Rkyq z(h-9&;80Up&qWxL__` cS$?Q+IU&H5#=FSm)>knPjG- zeOg6Oyts{FQsp@t((0i1gqCwDWJ^Mo^15()Tr<>F*0}7bs`N$1!H~odHHCX;qieDj z<+D!8w)%FpV6On3oEmzxBf3KlWWr(ChJztNHTIpbjyAZ}b(5+`fAm;O6D}^bdtU$6 z_!0knuWt9h_gDSze}De@=Rdn?@zA_8x}KEvw?F?Yx9^2rvU|WK CA^wKNgY0-%>&O+;kx(xp?}R*Gw XmO=#9(HB;Nxgc>*ym zd7)Pf4zUw-Qs`q?s)#sBLZWz}&DdmPg+!CD=n038L(e4l@0J`&dc B$>Jp!H&>Tdwq_DXy10q6Nm{s2H2JF4!!PEGWuWDRvc-QPN~o zQ=vHof&dwsDBpyr-dCueZj+WO=`eH~%uEHv5HvtA02YJPo#YFJ )*q)Lx=%|oHn$umch+A7pf8tojEN+}_k9nM+9LZ 5rJQ!9dYN_HF`9rFIn KR?N`;r(- zA3Ay=t~nJ~p>Qg?N!1@0y|8o3r%(cJOb;A{aP8(3%}09-I@BCEv1^NO$bjL8j~(jK zt=maG`T(2*zkK?HIb+3(QPAHd>>P4+krza|1=eekxMr!flMFEOO02tGawxS#5gAg~ zP<3Z4_=cud(tcyGDti>!lnliPB;?(-zGp{$XyFz1F c1PJl>4w zh1*eXX9c22MY4=IFSt}C{k5$U_99I0ei2KQ3Q?D&2CLDx-%^79M^q 7EQzP8U-O?U~s4WP1t35%fUIc;@QEe#$J8U*`#=6R2yhJ$l| z3bGB$`De_Oppn1_(h7kHOLFMbo@d+#gUAzM `k<04X~G+UIRibK8> zWfbzt8LXu1I%uos1w>3l$B{XvlJ> 5e2%6B=CbA8BU*8x2ql zT2X`pQ<5vWX6djYxth>5TJb4qWHP! YfA%;tfAAdrFkpJn;sBkqAP64@Z1l^^J3%Vjqc(<#h3DcFhzSBis**7GP zRG%Pu;y-l{tTuFZtrB8qb91QJONw%H5WR8@CnB#J4&r-y&6ng#ZZav 1p3>$Sw513`h+L#G4-}() zi738@%s*&}vE?|&g&b^p*qO7=W3*wPstz^SkGhhGp{N+Ln~$Mr)nG}SoD@o6p!!bK zWNV`)g}hhM24L|;8uR2iH6&$W^Xe$%dzr+9+M*7cw~BK(;E;lCz9?I0>}4wHp|mxT z6zRt|%|hC&OL*!;T`yp8G+ikb4pLb_OaO;WNv()f8Mh4fwMAa2j7cG}u%Xnm(d2`4 zw zyEUan&lW)nnxj@!Auv)v>*1>~QB1{#h%hx)XuVvUy-So=nVM)JrK)X?M!)E{lO>tM z&t7Kra%e8)v{DPag8EU>d9AY2Ts2$kCzpHe4J4 TI23>>A+G@@)`Z>N`CuOjDH$J>pN2b;~x}y(Z5X9idevT^v7E Wt&KlksSvOxEJbX7oYLfE-8E5Bis+MJdP3YpUTI-MU_f&d#286%Ug$%m@jF zE7swZlt~$hRJpFL$O*uXBQAO3Qbzk)!xhn33WN`h>{XJf*cTt&ND(fiE~fIRT%yG_ z$+56#CM$W2T=La25*j&iAvLKFW|fy zxX6>@26E9vtdtQ*b5p&(st%;cDX}~V3mgSZyD&3)Td&A)Oj1|PU*+{&swl~kTpCb+ zHD@FR4&q~~S_jEdKSGQ+&%+)p%sG1rXM)nbD7sh$O?HW!gYFn>J+;+-Bv3nusW-{p zX>7 721a+cf2L>#P7#SSKtVK*Q&0N#~uz_(l zgsucO`A21)vx8=%4I_Q`7?mzerSZ>|S&u~%WP1h~bl8(<8)H>YN@B^17Y8pep|4(i zCS4JTur|kXA$8{!zk>ys LgqXFl-F-MJ zjnEC=qbsgL4pA|aDs`KvEHi=%C^kY@Gb6xU-T<2fL9Wp97E?Xoh9&j-1kF-LBmAnb z`{r#hS%budj}}H5Cr&0a`)*dV18G*Kf&;#6?>?QYR}@H>UI+Wjk;Re0@HoUk0O6 zzD*HVCYN~9iyk9IYDo-HOa-wZ*oiL7M5pLxUB&N GRMJ_r-vV=^E zT_fqV*S%T}1S7Vu@p9o0arv@Gn6b>O`kf7NEp>F#TzG71Y@d*n%I-(W;?-TgXs1p( zvWLR)oMVQ@2{qM@BT{QM4og9*blkUXrI7Sqt)hgKUhF;jrBumg5{d_U@*(@)&&jEb zn+MgQ=6#}Zq11dpRV;}T=_ybYc+f!5%Q?YEc~w4pMu<^Fqf>)yPER#v%+VqljxnI^ z-m&|`i)zY2OB#vMY2!?ItMZC7>7l8bB->?-RaJ)OiX7E)&^X$qYZn<+ixr=Ajbs|S zPSWI UdFXgJ7=uPnFi^1$u$Za~7A{B?k_jb8E=@M5 z?n@Ib)MT!*W6g1q(|2UjNF|&rj-Jz&6G1u@jgYs2_U)(UQMNrrTTs*`OkS3qEmB>s z*E-2sY`)`oD$Xz?*;iy@R}_bCa~-l&(FIgtMavZ)(d|-e1MQxLWJgDa%N-Ep01-v( z#f756_3CI^s$`|+GNs2TG6nTi6h+}+N9rIgN8}2jt!IO6MX*P)b1^e%0s(8U*5a2^ z!*0FNDAiADv3E=jwQ?)6N4=sACMtHy5tmFuMnCaxtid+9l$28OAp}@cJ$M>RL?zpg z(y1ld!8hz78pK0PR_a`EB|3zWxCWRs+W2jEI?Xd>kkw1Bo-WR1I(U|AB4v q;sn87TCizC&Wmvixrh?!abWIF8yM=06*aVX#=~1c(m}9OQ`iq*K z{M#-p;WTd?9CGCR(+!bhR1a@gW*bOj7CWxl#zb?@IoT$!i5R4jUIq+ q`WOpkLs#Z;YHhwtrA#E$Bsp{MqQMF$xcp&!%>bilrIH!jcOisM*I+=NQppvtSK z{@1u+m6ugl&+D62Dy~z|Raoh))R#H+l~8 )tOWhh?)zXz9lyMDR>c=)5Ek&nC&2 djsm@tExnl0*7Oia@>g_+_UqT6KwY!E)}Wzz!HbDE$y`a*Xx^@Cu! zx`Y}dE~26MnpVs)>O(Y2T?iZ(66ds(HbgDJNlcu#je0hOn%RcoOucnf98b{ijcf1_ z+ V~e=VK%6q?H;g8Zzg?tL6tY|Y8QaezuNd|i*iASx6?5lG$8KXIPC#s_*)%q- z*Zs_hjHZydvW{c-%ULNFk{rlSvC{Vgjk)Wim=iB`5zz2)q-CvHcR#n F>H?(^1hZwItj-`=a+!R&ht|aYRt>!|2J@ zZ;STkp(JX=*1w`HcY)Wxb$(HV9mVKG{$Nh@NS89(JB|$e4iKkefFBfSoz^8QU-u1p z7DoEZ%03vB;COVw&ZvdTMm>@tK5l>z&eED>9z?3TNR**6Q!Lmz1XGYt1Gh(k 75kG);OC*s^%$C0gy^cZJ{isE@UwhIUQ=Z+FaGP|(fS?>o$?_@aU z0w>IGP1;|GyrJ%r|KRcJl)p&+F{@?v^e`91c7koVXR|RRzw4}QUBcYrKX4~ rS4m-Kfr^5l*b?2+!qNN1eZfavUCRh8$vJB?o@_5kULVS3h1$j_1%Utn zKtR(^wqM|#yAi 75t1AvP+oR?8 z?n=Y|yT8&Ge+oV>D{YT|p1_pG6kXrfwatHCw-bg#F%2nDGmEEAA3fD7WI( DnVRGJGC)M=Pc|@Bch6iy*5V8l@9J zw0aO>4~2^?B Xa1SS*qGZiEy6(g zD=P@x%jmt#wq15+=(YoZ48Ze6XKniza)>C4`Ey&b5~07$6Rp}p1qnSZ|8w(?h7kxq zjQZd$yT$L#a(a%~M^9L{qF>?Da(wxHo_o%#X>bCj1Yggpecw;ZClj->P#Q8_R?YRR zJr1*6yX}(JrL`2&|CNmL?izhEIvxl#>~(I9&JT*A@7?(YIbIFmXjS`We&*KG^`x1? z3AlY8p)_sWT=#2L!W%V4+Adu1x1DX3ff7L@ah}(eXs8}=M*2M5ZwIgndRN6dbV*;n z!8TF>tADnZ)wpUfg!@R`@&2|s-HFum)oEar1mB`il|Px|-k`9@OyA8xoN9sqYo|~7 z!i_)5a(d3WRtzIPPN&XG;nh8eQHlx48obq~rsNiO|7V=@LO_KIuGF|Yj~rbJtv^QU zAunX=WavH}MxuG&ucn9?H(&K42P(XGeLjBnZr%ERKKkmtpQyb)oD a=m%{(DQR z_9~KyCC OfmJy^ezk2j*cn)} vGF?TIu+JU?GdQ z>3F(_9|lThM#c!H>N!S^`6D>kb}U2j?qMq#t4c?WY9&@IZSzEFf6I){Jzz)2?b_ak z7tDUyLgB)-cH$+Y$RES|E$Y{9lbDDy!Yv+}*mtEkezw1<)u_&k6KW>Dj~PJjr}#sY z6S3W^s3<1qSNaX|_Nq{sQL|1;>b2rr+3`XIuD{vRS*L=~eb=i^zrv!j0@Y18EeV?+ z^?3x0+9ZOLE=-Kq%SZ7i >C~~Q@B38=Nr*pPs!*`03MnWrFHfyn zcOq}j4-&fbZ6B;3d|11`zbBIdqWeY+mkQ4> r!j(S%sRW{mru{bejiNUrdq5K zz{_X&Nw3C^lGHvXa`!E3TDnDZ=D1jcKm*i>v=%Sj8zTBZ!Iu|&Ix2)GC}?e-&u`+B zf-(BF)}r@Bsxjm0?Rc)zc&vU2{dCw}GUIO{-TB+?riY9%#vcLg=-!WmnTSSW7GVje zB)mb_&Be+O(u|h0yh`lo^3DUtDd!~1;~5GTr&2*P6Enn7LbWXIFpMK71j0ABzSmE_ z-5rv5km)CTAD7Sln{7 YwsxEfCqJL(Jt_Px|tegMq 2<9O=q+GJl;bRjjenT6{S+* Qv5SE~<&_ODR_hj|X3^Pg*{aYw_8 z0-%=&_sc%p+;S~6ISDn3NS@+|jO0cVGqE~{4)Ec(M%pgTGga0xqa~E8L@?))|FTe} zcnnoi(QayhR(wUwBQ%xA<3?0EzBS2c=V?`y m1g_hmcwj< zY(;
UDPO6U=Y;86mFL70{^R3G{=1#XNkwV zTual}i$66wHI*|s+U?%Ybrxe~C}=cSPx|EfB8gO8n}N!e`}@B=8RVrTwkpvAasHAm zO?;b&5pam1xjgcthkAcQRP(SSp%vU~#qobfZ}2#M2%X>c%@)bGO{uUsN})7Npql!` z#FISRCDXzvV>)*lQ}4h}emg6Yp+ZdMlv64?t%h%%zQ1S_kW#8a1Skb(o$_xLtfWfy zLMTugEa@qbx@K`k>%+h0;p8$8%Z y 2{>H2U5UG=fE621U#Po{XyE*BrC$@B4qCFJ=j?E< uBwPJntyn?TUJ*kxEob&3R#IcqdUn-jbKN^EJ$gZ zsxNODey$=!xo+3z5J%>pg_ywdit8n*8Q9N*_m3E=|3nGfkYjHYQT_$1BTk)HGQO{p zWOa%##4K2ufpI}J+l=Q@S4EUMxe6OwIHPv4BA#-K{re9`3j!E6!Plt&y+WnRxvr%d z!~J3#OPm0E#wcMva=Vk7US@0tuLg_jyeU_8|Ky)J-VOsBF;hiCYfh_SpORG}rrGWX zsjP u4@Oh-y9AD1glX8=JT5+f*w2$Kl}k_;_>huO4+n(E7r0Gr&H-PJ)7J z8IMkhKaCZ5;x1HYe#ekYFG)x1g(Rc@eeT!NZD0tcD?&21(y%(k+bA~DK9RCmEIs}d zK(l9!%WYoO>vXQG_2o;17TagB ADb!ZZ zoV~&{zo#o~UFDn_S*X2nG(yN69}QI~I@<#^wii`@tB-gEl9Lt)=IziLt(w1U>W%s7 zqhP11PWQ3nyA`e%K65*|U~Ic0oC~VMay%kst D#EWOC7c8e84pZgGeNMO!PPej zn gSd#7Gl5!qS&FNB!o3VsDWz= zqYv-z32-mO8_7sgYT>ZOgiu*&DrCW!d>Fa$=8raEEmAEP_JFTPGtjtbM9}|spLJ6F z#E5j?<8~Mw%HUadg)Ma8{c|8?3IY!vqaOdsyf1Q~;X)9I1wzL^gy^Ryz32?$vq9yd z*GOUSUul4i>H21jBb7qw+R{p`9+)I0Ra!REH2#slWOMF^*WD =tinQ) z1NqP_FG=D+vB9rXIFs*7Osx(@bdkay@qjR#hwyjewSjL7UXwi2u`!_o%fpGa6nv7b zY_2@ShgObg1rvX}4b7~mas+8>i=%`?#e@?87GyPaV9UO-POI9WOaU}ZD28UyFd>+> zS7~@N?@_>1MA 9`)DSrYpO6g{fsEPmwr>8#n_yq%3u zNL|*O(psue?n3B((QUm1h343!7lw7YQU|m&+CKL0-tOBH??>ZjLi*@md?dr{=}mR@ zIX3Y4g0WazK(>XUJWvQKaCSItq5(=SZ1-K&<5cKYwo-gmq^(DR2!>)Bm~2}l(I+Z{ zt1;j9A-tlbQ&-SRFp+YBWxd?8H%Z=%A4G4W3dTT?0znZfC-rV5TYwsv%kpvQJhbd) z ;}v#Lo1NeaB|c>MQpzV>*rVX68}7PQ5lyp+_tcB?@_0!iUdc%TtTaf3 zawUcpiRXzRqN)`9Xbw zG*a)`jj3^@EW~M;L2K$5g0cC;4P)hgUw(GfV2ZL9P zqGEr4qz|w(A-@Q=v#ERP;NT!6Bm^2B)n-HUHQLsT0$&Ms9+c$w(knrd)#`ZI9V>WJ z<}x8)ldqs4^ghQv={NP^^N!! 29cLoo|ErI!ok zhe98JS*4YdDu@<(hEg eAHPX{*sYy_`;Rd_9ZjkAv8#7>g}|Zwlk#x7n1Y}4J)=~Mm)Y=xU-}+6lXE8 zDCfmXQ|7A5O>~!~;}d{C_`zuC${8F;za`jIt1o!1HJeVWr!?!R1;t@SLC2?h)y#A} zAHx(wACJDLzSoh(h*)k0W_9v=5vv%GxQ8sO2IGChq1R}25C>4>VcaSKEAWo!CgkH1 zsYxtcyXd`QV6PGa{Z}F2??8QV@qrmVKQ5s%8g_L;Jt=xA?Jp_;v_Z;7Xw!?;2AOJI z8rREzm2ztcQ`a3&zn9Y3+i |#a<)BJ!yNIdxE;{}X V5UY4MnelqnFWbclqyq(?1WV1rS!O z;ObK!Nv#+_^$U-$sW8L=>^N#F#SjRj-`Q{48Gwg$`_+VgT!T~FImDpPT9y!U2WVEt zCZ)RWFcgJX=W%~R#OKma-E%dASVHu%*!kl%luyel$<77`s>T#3E b|;YFVz9hg(C71gYuC&V`}djpKNvFUWgaaW z2?$P|z-RLJz{gFrTUymy>~Yo9Iu=KRk6wn0JvWD2JpW$^se^PB#Q@gsE%(2OSk(Nt z @#dOa&({F051y)oG|C{yD$!cw&g8$-?6Qf=|;R7MiC>{!-BLCB~GwyGEz zkldX(O0y#-O%WaNiLDkz#N)8HpQ0!DyFW}#w+ws>EvK?+s9Jiqjtff5cpUYi?^1*M z7D#@JZmAO3G!s;{#pt18VR>YxVc3yDup=DAf7eS&>>sVt2RC#ujQ#=fX8AWvFL~T| zCD?|$( FkP*uWDvtxUPZ=a6rc=P=XJ!O^kn2JDxAJYN{WsSycg0u}wUJ8=t&Wtm`q zG`DxThY|&^*SLs4OsHW|_YYOE>_|Vsu=_spp*C5Rpzc{H6Zsqc0fA?>O7*``s;7e9 zFG1$68_9BuVeN#&WSJgfM&%&JG1pqamWt|%)t<_~6(ypT#09kMx3 hoys=N@pjqi57&Q2Kqkk}y$KEHZ^*E` z83T29NmK~}EA(B`8XT^7k{0*u-2f_$lZ(I+3uY@hpx&n4j_7+{Unm+ef4%RgKe%Jy z<@52%z_2{J831icqHVDqKtPohaLPR>BXBc(4FVh}+5eaf#`PD)Aa#NLpND&hb|tA; z^$2~h9}J(6Aca^!{W%}d=FDAhZ2c-IgxoA&8f$(eO{Hk@{@x%6kklB?mUa}QRhc=! z7*&G3=(JC$9392LmB(hvsH5id8eN7RyVWl__m0pl@CIG!H6YXaVDYIBM1Q&X!(xrk z{hD8>TqAQB{(QU58*{DnGjvdg8OI1b@f(3h5ypQLKxzid&jJkOTOz^$wnacXRAwl~ zQ5*tpGF?}pN;pP2*dF>1<%OhzuI#W?!hjnw?xSh zijcmPPe%M_j>0J4(3Mqz#p~&4VAK00*d3{kBYi`ZZV{;p`YlM`l!P~{;axH}(Hp?S z3VeQk7T8%GX{vMiq18l?zm7`Cy>+YMgP=Th)d%fYqkt`1{IfdC%VA2;+aqhX`mzlA zrH?NOTxBd@4YjZ2U_3lT-e7*dvWZx$@k^uF*46DV1n86in}9mHd+-}dN+v@f#+6em zSxm|PvEt{DYQt|?__3a4;`+;n2zRr{JahWYLI`c6cl~N9K!tXD++4HmLLsQ{t$N%t zN12mduCeI$g9P(D-F_T^LfcNn%Ss)4lT9=N{u2hi&sAXZQ9B|=kv$xk hX|d)?m6vyq{|Dh{f?-c(*2T_?fYum mt1JTT=!m+wM& zWjW5yN{h{9KAC6R0auJdIuhAg#o#_DdVxK(AIPsnW?dGM$a;N?BJ=UO>3UXMthey^ zjuRuB>U}W&At8N8h}U#fum868tGs`008 !wSvY?@ji~^T{@@{htHK)gYBdg$`%pwm^au~V- z79-nQY0%dsqI*?6yw5!TqZ}c=DqyJ^ idk(y3+hWSu+D}mv)a&Y1p93?!9&Z3ul7TRqbr6X@86I@s} z7@&j+IZ`SDugHOd7r+PKyWe0sWyiSu&}$(xm(GG`O`{X%J3Z!W+KkobjupCxy16Cw z#VW1W0!~O`<8Kd`Y|4H&?5Qg5WL_~Ls0{jP6@EvB-^j@*oe8Ar1vH~H>t-*P%cz4$ z8_TMi-p*7R;6!pyq&J%sk~*tr>d<1mVRtCVdg6VV!Abv!ityI; un+upr496|LD)@M1hQqjQB7oi`mV3`Pvzq9-kUZ-}NBs>7} zoACmmn4p3U#;l4?O0%*OUBrx3P VWHq)h|p}jKH4OH^Z*wr zDK0ElC=pC>%opyA6H2!lsn9gAF9NgWNVGzVwEeYzZRGQ75OBAMC#l9V^3`1bn^| Lv@wzjFWeN1q%OzyPeR_zSmGAR4_JGj9kO+_UAP;x;37T1rBUrn@=g!@YBICJAt z&zV}3Z@XkT-H0XI7>F(@Kct|kDkh7tJk{C0va^-XPSbvCE7pjA@pMPY&)rsi-+Muo z!#9n~$6>l4Y59F|2P2u7!SRIvzJ_0EmN7o(L3T9Nkjy+7V*Gspla z++&Pxqw0!MakWxmzo4Lz$%<^G$R-UPF&2{JmdtR#zos;76;tbG!>?l11&R^ltcsNT z(u58RK{MoS)9WtGlZuScya6WF=!-;azl`sRJ)djmUR9$oX5`~S9y=cIC@hl{Ej;3P zgkPRsC6YBzTp6gxz6nk|ev}whjCMZWBwTHN(8zHML=>lL1Q>l3{!ZntmIYRRRsU9y zo+;3P4w0}Bg=fcsfNea`4rq9ZY>;At60d31vxQDy2h0NTJKLZ0Z(5yzLdPCljM}&- zKZNX_e~5}%5&ViK;_~i0!O5p&bTKS+9dC2)-2sX;0=~0|$p=iXBr{pob4KPxsUlos zs$2*M0|Qt$FYIjlpqz58 EF ?dlVGL>l)0fF z^E?&zqqVSPT8*Bp>bALhs0syJ7WuqH{yIA8-QUnq71xp(G^v5hjYf!?tA1mU$G1*- zQm5*dkxbd0mU`h|qH8N2A2$rLoRU1g+pe@Z7_zLR8!Sofh6K``QVxH{u^9uI(PCmE zyj5UE+OxBzU?TAmcT+*jKh8y|JRXARf70s0+Miyn-pdEUaW!C(3fl UDD_6n(H_lT(CVreOy5nl;A5JC@5#OH8b-ceA3%=Q% zMIi;}B_U9x+zA5F1&jDiYT0T|EAXob9h%_-4EWM*DuFS)_vmET-|g#-#;)v=L1gUo zH{Z%48nl<0{MP+b7h@ f_;YnfbiuY#qAOCa9sr#t-2xr|^V?mKN zQ%HAg%494GbV&c2cBDq*L%DBm2+sU4g~mv33u}B=930IB9txWi*B7OoUe6B8pjU8B zp4caO;~-21Aack;NIuiGABt1SFz63v0<$g%reV(}+qC_NhZwk)C+o!r;_888_kEVB zY1J>#be<9W)KGG`+UjvJlf?&0VO-6)Vf8#fe~g`^38VZx1Njl;+P09Fe5p{j&i1nm zFa&~@d9_BG+%uYc7bUi?wwanX4q6^P41EOKhl=kxw(xQNRV5%?RD7>KVB6+T#R`j% z%H@_nxlG1W7s}Nxm;X{UisQ!c8NfL7e_s(=U&*h4c}kKUbrV~pw$~=S0qJQLWR~Pg z+L%WJHE5BMY>qIQ-qQDPY7Cfe$BzL7#*wSET4RIJdAQiirC`8dO(F0{Gnz9dP4ACp z;IUo>Q&zoI{dv e#21J>& X9tMjm@K-Wm%=KlYvw8C!Twnw2ihxVYJeHMY0~i>_ zCniur%dMqB^voK3RlikH_d)`L7kOEr(@cwuhv_p4p!$@84+@hKW>8HuE9&DByAl__ z8j6W-Yd6wJh^J_bj-S&JuKkj#C9?Qx17JsS%r@4tCml2>J9(eW@eo%wRslZW+<-u! zh=_<~rTrPxCkJ7-0CcRNE(yaTwqS&eX~^ol>5F85LZzntbnQ`$KZKRS!uiW-;2IRO zPL=Ooe9VlvjhLypAGlT+*^87$@teoeRR5z2#O7uqowA?)`DT|8Z=$0KaJ-gwxV=W{ z8y&8mcAWzwe*9up1s!qh`Vf6aTR{4(w!v$B6q5RCy0i?@SMg#wt-YV#1E(+rB0cUD z(+_*tf!GIMmAZfR-j10dukh?rA4UR5O?@ 3+y_R&5qd*Jg z3a3bWf*AIKVh96fB@?+_E3WJJ99Qqb+-t2vKd;*BFKARdqtX2sD^5BZwL`=1uc}SW zDBhd##Yyd9j*`BQYVN00mr7+SX)Jbnzp7TKLsFOj=gG~~*^E(JiW1j;+13x#r$u6+ z!Thc92MAeG8 bQ^#wJ^cr=q(#m;|Xhzt+JH{D3@%3wk|V}50{M(4jm+ouMLm& zlf