From 8d176fc96557049d97469cb86b6539db8c7c40a6 Mon Sep 17 00:00:00 2001 From: zhaoyz <2@2.com> Date: Wed, 10 Apr 2024 09:24:16 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=9F=E5=91=BD=E4=BD=93=E5=BE=81=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=20=E7=BB=9F=E4=B8=80=E8=B4=A6=E6=88=B7=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E5=8F=AA=E8=83=BD=E4=B8=80=E4=B8=AA=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AuthorizationServerConfiguration.java | 87 +++++++-------- .../rax/auth/endpoint/RaxTokenEndpoint.java | 4 + ...sourceOwnerBaseAuthenticationProvider.java | 104 ++++++++++++------ ...ceOwnerPasswordAuthenticationProvider.java | 13 ++- ...esourceOwnerSmsAuthenticationProvider.java | 17 +-- .../component/PermitAllUrlProperties.java | 1 - .../swagger/config/OpenAPIDefinition.java | 5 + common/pom.xml | 4 +- db/pig.sql | 2 + pom.xml | 2 +- .../java/com/rax/admin/api/entity/SysLog.java | 2 +- .../com/rax/admin/api/entity/SysUser.java | 2 +- .../controller/SysHospitalController.java | 2 +- .../admin/controller/SysLogController.java | 11 +- .../com/rax/admin/mapper/SysLogMapper.java | 9 +- .../com/rax/admin/service/SysLogService.java | 5 + .../admin/service/impl/SysLogServiceImpl.java | 7 ++ .../src/main/resources/application.yml | 9 +- .../main/resources/mapper/SysLogMapper.xml | 12 ++ .../src/main/resources/static/html/app.js | 93 ---------------- .../src/main/resources/static/html/index.html | 53 --------- .../src/main/resources/static/html/main.css | 14 --- .../images/SliderVerify/SliderVerify-0.jpg | Bin 14799 -> 0 bytes .../images/SliderVerify/SliderVerify-1.jpg | Bin 17632 -> 0 bytes .../images/SliderVerify/SliderVerify-2.jpg | Bin 28363 -> 0 bytes .../images/SliderVerify/SliderVerify-3.jpg | Bin 35581 -> 0 bytes .../images/SliderVerify/SliderVerify-4.jpg | Bin 6430 -> 0 bytes .../interceptor/WSChannelInterceptor.java | 8 +- .../medicine/controller/ChatController.java | 14 ++- .../controller/MedicineController.java | 52 +++++++-- .../medicine/service/AIMedicineService.java | 5 +- .../service/impl/AIMedicineServiceImpl.java | 52 +++++++-- .../impl/DoctorMedicineServiceImpl.java | 2 +- .../service/impl/RevulsionServiceImpl.java | 2 +- .../service/impl/VitalSignServiceImpl.java | 20 +++- .../com/rax/vital/timer/VitalSignTimer.java | 45 +++++++- .../com/rax/vital/util/DatabaseNameUtil.java | 34 ++++++ 37 files changed, 385 insertions(+), 307 deletions(-) create mode 100644 upms/upms-biz/src/main/resources/mapper/SysLogMapper.xml delete mode 100644 upms/upms-biz/src/main/resources/static/html/app.js delete mode 100644 upms/upms-biz/src/main/resources/static/html/index.html delete mode 100644 upms/upms-biz/src/main/resources/static/html/main.css delete mode 100644 upms/upms-biz/src/main/resources/static/images/SliderVerify/SliderVerify-0.jpg delete mode 100644 upms/upms-biz/src/main/resources/static/images/SliderVerify/SliderVerify-1.jpg delete mode 100644 upms/upms-biz/src/main/resources/static/images/SliderVerify/SliderVerify-2.jpg delete mode 100644 upms/upms-biz/src/main/resources/static/images/SliderVerify/SliderVerify-3.jpg delete mode 100644 upms/upms-biz/src/main/resources/static/images/SliderVerify/SliderVerify-4.jpg create mode 100644 vital-signs/src/main/java/com/rax/vital/util/DatabaseNameUtil.java diff --git a/auth/src/main/java/com/rax/auth/config/AuthorizationServerConfiguration.java b/auth/src/main/java/com/rax/auth/config/AuthorizationServerConfiguration.java index 605bb6d..fbe34c3 100644 --- a/auth/src/main/java/com/rax/auth/config/AuthorizationServerConfiguration.java +++ b/auth/src/main/java/com/rax/auth/config/AuthorizationServerConfiguration.java @@ -1,5 +1,6 @@ package com.rax.auth.config; +import com.rax.admin.api.feign.RemoteClientDetailsService; import com.rax.auth.support.CustomeOAuth2AccessTokenGenerator; import com.rax.auth.support.core.CustomeOAuth2TokenCustomizer; import com.rax.auth.support.core.RaxDaoAuthenticationProvider; @@ -37,11 +38,7 @@ import org.springframework.security.web.authentication.AuthenticationFailureHand import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; -import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.CorsConfigurationSource; -import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -import java.time.Duration; import java.util.Arrays; @Configuration @@ -60,51 +57,52 @@ public class AuthorizationServerConfiguration { private final RaxLoginPreFilter raxLoginPreFilter; + private final RemoteClientDetailsService clientDetailsService; + @Bean @Order(Ordered.HIGHEST_PRECEDENCE) public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http, - RaxAuthenticationSuccessEventHandler successEventHandler, - RaxAuthenticationFailureEventHandler failureEventHandler) throws Exception { + RaxAuthenticationSuccessEventHandler successEventHandler, + RaxAuthenticationFailureEventHandler failureEventHandler) throws Exception { OAuth2AuthorizationServerConfigurer authorizationServerConfigurer = new OAuth2AuthorizationServerConfigurer(); - http.cors(httpSecurityCorsConfigurer -> httpSecurityCorsConfigurer.configurationSource(corsConfigurationSource())); - http.addFilterAfter(raxLoginPreFilter, UsernamePasswordAuthenticationFilter.class); http.with(authorizationServerConfigurer.tokenEndpoint((tokenEndpoint) -> {// 个性化认证授权端点 - tokenEndpoint.accessTokenRequestConverter(accessTokenRequestConverter()) // 注入自定义的授权认证Converter - .accessTokenResponseHandler(successEventHandler) // 登录成功处理器 - .errorResponseHandler(failureEventHandler);// 登录失败处理器 - }).clientAuthentication(oAuth2ClientAuthenticationConfigurer -> // 个性化客户端认证 - oAuth2ClientAuthenticationConfigurer.errorResponseHandler(failureEventHandler))// 处理客户端认证异常 - .authorizationEndpoint(authorizationEndpoint -> authorizationEndpoint// 授权码端点个性化confirm页面 - .consentPage(SecurityConstants.CUSTOM_CONSENT_PAGE_URI)), Customizer.withDefaults()) - .with(authorizationServerConfigurer.authorizationService(authorizationService)// redis存储token的实现 - .authorizationServerSettings( - AuthorizationServerSettings.builder()/*.issuer(SecurityConstants.PROJECT_LICENSE)*/.build()), - Customizer.withDefaults()); + tokenEndpoint.accessTokenRequestConverter(accessTokenRequestConverter()) // 注入自定义的授权认证Converter + .accessTokenResponseHandler(successEventHandler) // 登录成功处理器 + .errorResponseHandler(failureEventHandler);// 登录失败处理器 + }).clientAuthentication(oAuth2ClientAuthenticationConfigurer -> // 个性化客户端认证 + oAuth2ClientAuthenticationConfigurer.errorResponseHandler(failureEventHandler))// 处理客户端认证异常 + .authorizationEndpoint(authorizationEndpoint -> authorizationEndpoint// 授权码端点个性化confirm页面 + .consentPage(SecurityConstants.CUSTOM_CONSENT_PAGE_URI)), Customizer.withDefaults()) + .with(authorizationServerConfigurer.authorizationService(authorizationService)// redis存储token的实现 + .authorizationServerSettings( + AuthorizationServerSettings.builder()/*.issuer(SecurityConstants.PROJECT_LICENSE)*/.build()), + Customizer.withDefaults()); AntPathRequestMatcher[] requestMatchers = permitAllUrl.getUrls() - .stream() - .map(AntPathRequestMatcher::new) - .toList() - .toArray(new AntPathRequestMatcher[] {}); + .stream() + .map(AntPathRequestMatcher::new) + .toList() + .toArray(new AntPathRequestMatcher[]{}); http.authorizeHttpRequests(authorizeRequests -> authorizeRequests.requestMatchers(requestMatchers) - .permitAll() - .anyRequest() - .authenticated()) - .oauth2ResourceServer( - oauth2 -> oauth2.opaqueToken(token -> token.introspector(customOpaqueTokenIntrospector)) - .authenticationEntryPoint(resourceAuthExceptionEntryPoint) - .bearerTokenResolver(raxBearerTokenExtractor)) - .exceptionHandling(configurer -> configurer.authenticationEntryPoint(resourceAuthExceptionEntryPoint)) - .headers(headers -> headers.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable)) - .csrf(AbstractHttpConfigurer::disable); + .permitAll() + .anyRequest() + .authenticated()) + .oauth2ResourceServer( + oauth2 -> oauth2.opaqueToken(token -> token.introspector(customOpaqueTokenIntrospector)) + .authenticationEntryPoint(resourceAuthExceptionEntryPoint) + .bearerTokenResolver(raxBearerTokenExtractor)) + .exceptionHandling(configurer -> configurer.authenticationEntryPoint(resourceAuthExceptionEntryPoint)) + .headers(headers -> headers.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable)) + .csrf(AbstractHttpConfigurer::disable); http.with(authorizationServerConfigurer.authorizationService(authorizationService)// redis存储token的实现 - .authorizationServerSettings( - AuthorizationServerSettings.builder()/*.issuer(SecurityConstants.PROJECT_LICENSE)*/.build()), + .authorizationServerSettings( + AuthorizationServerSettings.builder()/*.issuer(SecurityConstants.PROJECT_LICENSE)*/.build()), Customizer.withDefaults()); + DefaultSecurityFilterChain securityFilterChain = http.build(); // 注入自定义授权模式实现 @@ -115,6 +113,7 @@ public class AuthorizationServerConfiguration { /** * 令牌生成规则实现
* client:username:uuid + * * @return OAuth2TokenGenerator */ @Bean @@ -137,6 +136,7 @@ public class AuthorizationServerConfiguration { /** * request -> xToken 注入请求转换器 + * * @return DelegatingAuthenticationConverter */ private AuthenticationConverter accessTokenRequestConverter() { @@ -160,10 +160,10 @@ public class AuthorizationServerConfiguration { OAuth2AuthorizationService authorizationService = http.getSharedObject(OAuth2AuthorizationService.class); OAuth2ResourceOwnerPasswordAuthenticationProvider resourceOwnerPasswordAuthenticationProvider = new OAuth2ResourceOwnerPasswordAuthenticationProvider( - authenticationManager, authorizationService, oAuth2TokenGenerator()); + authenticationManager, authorizationService, oAuth2TokenGenerator(), clientDetailsService); OAuth2ResourceOwnerSmsAuthenticationProvider resourceOwnerSmsAuthenticationProvider = new OAuth2ResourceOwnerSmsAuthenticationProvider( - authenticationManager, authorizationService, oAuth2TokenGenerator()); + authenticationManager, authorizationService, oAuth2TokenGenerator(), clientDetailsService); // 处理 UsernamePasswordAuthenticationToken http.authenticationProvider(new RaxDaoAuthenticationProvider()); @@ -173,17 +173,4 @@ public class AuthorizationServerConfiguration { http.authenticationProvider(resourceOwnerSmsAuthenticationProvider); } - @Bean - CorsConfigurationSource corsConfigurationSource() { - UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); - CorsConfiguration configuration = new CorsConfiguration(); - configuration.setAllowCredentials(true); - configuration.addAllowedOriginPattern("*"); - configuration.setAllowedMethods(Arrays.asList("*")); - configuration.setAllowedHeaders(Arrays.asList("*")); - configuration.setMaxAge(Duration.ofHours(1)); - source.registerCorsConfiguration("/static/**", configuration); - return source; - } - } diff --git a/auth/src/main/java/com/rax/auth/endpoint/RaxTokenEndpoint.java b/auth/src/main/java/com/rax/auth/endpoint/RaxTokenEndpoint.java index a66c148..dac785b 100644 --- a/auth/src/main/java/com/rax/auth/endpoint/RaxTokenEndpoint.java +++ b/auth/src/main/java/com/rax/auth/endpoint/RaxTokenEndpoint.java @@ -1,5 +1,6 @@ package com.rax.auth.endpoint; +import cn.hutool.core.codec.Base64; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.TemporalAccessorUtil; import cn.hutool.core.map.MapUtil; @@ -170,6 +171,9 @@ public class RaxTokenEndpoint { cacheManager.getCache(CacheConstants.USER_DETAILS).evictIfPresent(authorization.getPrincipalName()); // 清空access token authorizationService.remove(authorization); + String username = Base64.encode(authorization.getPrincipalName()); + redisTemplate.delete("rax_logged_in::" + username + "::a::"); + redisTemplate.delete("rax_logged_in::" + username + "::c::"); // 处理自定义退出事件,保存相关日志 SpringContextHolder.publishEvent(new LogoutSuccessEvent(new PreAuthenticatedAuthenticationToken( authorization.getPrincipalName(), authorization.getRegisteredClientId()))); diff --git a/auth/src/main/java/com/rax/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java b/auth/src/main/java/com/rax/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java index bb302ac..8ca9ba0 100644 --- a/auth/src/main/java/com/rax/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java +++ b/auth/src/main/java/com/rax/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java @@ -1,11 +1,22 @@ package com.rax.auth.support.base; +import cn.hutool.core.codec.Base64; import cn.hutool.extra.spring.SpringUtil; +import com.rax.admin.api.entity.SysOauthClientDetails; +import com.rax.admin.api.feign.RemoteClientDetailsService; +import com.rax.common.core.constant.SecurityConstants; +import com.rax.common.core.util.R; +import com.rax.common.core.util.RedisUtils; +import com.rax.common.core.util.SpringContextHolder; +import com.rax.common.security.service.RaxUser; import com.rax.common.security.util.OAuth2ErrorCodesExpand; import com.rax.common.security.util.ScopeException; +import jakarta.annotation.Resource; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.support.MessageSourceAccessor; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.security.authentication.*; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; @@ -23,17 +34,17 @@ import org.springframework.security.oauth2.server.authorization.token.OAuth2Toke import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; import java.security.Principal; import java.time.Instant; import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.function.Supplier; /** * @author jumuning - * @description - * - * 处理自定义授权 + * @description 处理自定义授权 */ public abstract class OAuth2ResourceOwnerBaseAuthenticationProvider implements AuthenticationProvider { @@ -53,21 +64,29 @@ public abstract class OAuth2ResourceOwnerBaseAuthenticationProvider refreshTokenGenerator; + private static final String LOGGED_IN = "rax_logged_in::"; + + private final RemoteClientDetailsService clientDetailsService; + /** * Constructs an {@code OAuth2AuthorizationCodeAuthenticationProvider} using the * provided parameters. + * * @param authorizationService the authorization service - * @param tokenGenerator the token generator + * @param tokenGenerator the token generator * @since 0.2.3 */ public OAuth2ResourceOwnerBaseAuthenticationProvider(AuthenticationManager authenticationManager, - OAuth2AuthorizationService authorizationService, - OAuth2TokenGenerator tokenGenerator) { + OAuth2AuthorizationService authorizationService, + OAuth2TokenGenerator tokenGenerator, + RemoteClientDetailsService clientDetailsService + ) { Assert.notNull(authorizationService, "authorizationService cannot be null"); Assert.notNull(tokenGenerator, "tokenGenerator cannot be null"); this.authenticationManager = authenticationManager; this.authorizationService = authorizationService; this.tokenGenerator = tokenGenerator; + this.clientDetailsService = clientDetailsService; // 国际化配置 this.messages = new MessageSourceAccessor(SpringUtil.getBean("securityMessageSource"), Locale.CHINA); @@ -83,6 +102,7 @@ public abstract class OAuth2ResourceOwnerBaseAuthenticationProvidernull if the AuthenticationProvider is unable to support @@ -126,8 +148,7 @@ public abstract class OAuth2ResourceOwnerBaseAuthenticationProvider(resouceOwnerBaseAuthentication.getScopes()); - } - else { + } else { authorizedScopes = new LinkedHashSet<>(); } @@ -139,7 +160,7 @@ public abstract class OAuth2ResourceOwnerBaseAuthenticationProvider redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + String previousAccessToken = redisTemplate.opsForValue().get(LOGGED_IN + username + "::a::"); + String previousRefreshToken = redisTemplate.opsForValue().get(LOGGED_IN + username + "::c::"); + String accessToken = authorization.getAccessToken().getToken().getTokenValue(); + String refreshToken = authorization.getRefreshToken().getToken().getTokenValue(); + if (StringUtils.hasText(previousAccessToken)) { + redisTemplate.delete("token::access_token::" + previousAccessToken); + redisTemplate.delete("token::refresh_token::" + previousRefreshToken); + } + R clientDetailsById = clientDetailsService.getClientDetailsById(authorization.getRegisteredClientId(), SecurityConstants.FROM_IN); + redisTemplate.opsForValue().set(LOGGED_IN + username + "::a::", accessToken, clientDetailsById.getData().getAccessTokenValidity(), TimeUnit.SECONDS); + redisTemplate.opsForValue().set(LOGGED_IN + username + "::c::", refreshToken, clientDetailsById.getData().getRefreshTokenValidity(), TimeUnit.SECONDS); + } + } diff --git a/auth/src/main/java/com/rax/auth/support/password/OAuth2ResourceOwnerPasswordAuthenticationProvider.java b/auth/src/main/java/com/rax/auth/support/password/OAuth2ResourceOwnerPasswordAuthenticationProvider.java index 460833a..61a44c3 100644 --- a/auth/src/main/java/com/rax/auth/support/password/OAuth2ResourceOwnerPasswordAuthenticationProvider.java +++ b/auth/src/main/java/com/rax/auth/support/password/OAuth2ResourceOwnerPasswordAuthenticationProvider.java @@ -1,5 +1,6 @@ package com.rax.auth.support.password; +import com.rax.admin.api.feign.RemoteClientDetailsService; import com.rax.auth.support.base.OAuth2ResourceOwnerBaseAuthenticationProvider; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -28,15 +29,17 @@ public class OAuth2ResourceOwnerPasswordAuthenticationProvider /** * Constructs an {@code OAuth2AuthorizationCodeAuthenticationProvider} using the * provided parameters. + * * @param authenticationManager - * @param authorizationService the authorization service - * @param tokenGenerator the token generator + * @param authorizationService the authorization service + * @param tokenGenerator the token generator * @since 0.2.3 */ public OAuth2ResourceOwnerPasswordAuthenticationProvider(AuthenticationManager authenticationManager, - OAuth2AuthorizationService authorizationService, - OAuth2TokenGenerator tokenGenerator) { - super(authenticationManager, authorizationService, tokenGenerator); + OAuth2AuthorizationService authorizationService, + OAuth2TokenGenerator tokenGenerator, + RemoteClientDetailsService clientDetailsService) { + super(authenticationManager, authorizationService, tokenGenerator, clientDetailsService); } @Override diff --git a/auth/src/main/java/com/rax/auth/support/sms/OAuth2ResourceOwnerSmsAuthenticationProvider.java b/auth/src/main/java/com/rax/auth/support/sms/OAuth2ResourceOwnerSmsAuthenticationProvider.java index 6884942..e6c06d9 100644 --- a/auth/src/main/java/com/rax/auth/support/sms/OAuth2ResourceOwnerSmsAuthenticationProvider.java +++ b/auth/src/main/java/com/rax/auth/support/sms/OAuth2ResourceOwnerSmsAuthenticationProvider.java @@ -1,5 +1,6 @@ package com.rax.auth.support.sms; +import com.rax.admin.api.feign.RemoteClientDetailsService; import com.rax.auth.support.base.OAuth2ResourceOwnerBaseAuthenticationProvider; import com.rax.common.core.constant.SecurityConstants; import org.apache.logging.log4j.LogManager; @@ -19,7 +20,7 @@ import java.util.Map; /** * @author lengleng * @date date - * + *

* 短信登录的核心处理 */ public class OAuth2ResourceOwnerSmsAuthenticationProvider @@ -30,15 +31,17 @@ public class OAuth2ResourceOwnerSmsAuthenticationProvider /** * Constructs an {@code OAuth2AuthorizationCodeAuthenticationProvider} using the * provided parameters. + * * @param authenticationManager - * @param authorizationService the authorization service - * @param tokenGenerator the token generator + * @param authorizationService the authorization service + * @param tokenGenerator the token generator * @since 0.2.3 */ public OAuth2ResourceOwnerSmsAuthenticationProvider(AuthenticationManager authenticationManager, - OAuth2AuthorizationService authorizationService, - OAuth2TokenGenerator tokenGenerator) { - super(authenticationManager, authorizationService, tokenGenerator); + OAuth2AuthorizationService authorizationService, + OAuth2TokenGenerator tokenGenerator, + RemoteClientDetailsService clientDetailsService) { + super(authenticationManager, authorizationService, tokenGenerator, clientDetailsService); } @Override @@ -52,7 +55,7 @@ public class OAuth2ResourceOwnerSmsAuthenticationProvider public void checkClient(RegisteredClient registeredClient) { assert registeredClient != null; if (!registeredClient.getAuthorizationGrantTypes() - .contains(new AuthorizationGrantType(SecurityConstants.MOBILE))) { + .contains(new AuthorizationGrantType(SecurityConstants.MOBILE))) { throw new OAuth2AuthenticationException(OAuth2ErrorCodes.UNAUTHORIZED_CLIENT); } } diff --git a/common/common-security/src/main/java/com/rax/common/security/component/PermitAllUrlProperties.java b/common/common-security/src/main/java/com/rax/common/security/component/PermitAllUrlProperties.java index 057f728..3d684b1 100644 --- a/common/common-security/src/main/java/com/rax/common/security/component/PermitAllUrlProperties.java +++ b/common/common-security/src/main/java/com/rax/common/security/component/PermitAllUrlProperties.java @@ -33,7 +33,6 @@ import java.util.*; import java.util.regex.Pattern; /** - * @author lengleng * @date 2020-03-11 *

* 资源服务器对外直接暴露URL,如果设置contex-path 要特殊处理 diff --git a/common/common-swagger/src/main/java/com/rax/common/swagger/config/OpenAPIDefinition.java b/common/common-swagger/src/main/java/com/rax/common/swagger/config/OpenAPIDefinition.java index cd66522..c7fae8f 100644 --- a/common/common-swagger/src/main/java/com/rax/common/swagger/config/OpenAPIDefinition.java +++ b/common/common-swagger/src/main/java/com/rax/common/swagger/config/OpenAPIDefinition.java @@ -59,6 +59,11 @@ public class OpenAPIDefinition extends OpenAPI implements InitializingBean, Appl private ApplicationContext applicationContext; + /** + * + * @param swaggerProperties + * @return + */ private SecurityScheme securityScheme(SwaggerProperties swaggerProperties) { OAuthFlow clientCredential = new OAuthFlow(); clientCredential.setTokenUrl(swaggerProperties.getTokenUrl()); diff --git a/common/pom.xml b/common/pom.xml index 00530fe..f92f057 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -17,11 +17,11 @@ common-bom common-core - common-datasource + common-log common-mybatis common-oss - common-seata + common-security common-feign common-swagger diff --git a/db/pig.sql b/db/pig.sql index bcbbbf9..0037790 100644 --- a/db/pig.sql +++ b/db/pig.sql @@ -623,6 +623,8 @@ CREATE TABLE `sys_user` ( `wx_openid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信登录openId', `mini_openid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '小程序openId', `qq_openid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'QQ openId', + `sex` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '性别', + `hospital_id` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '医院id', PRIMARY KEY (`user_id`) USING BTREE, KEY `user_wx_openid` (`wx_openid`) USING BTREE, KEY `user_qq_openid` (`qq_openid`) USING BTREE, diff --git a/pom.xml b/pom.xml index 46cdf1c..d591851 100644 --- a/pom.xml +++ b/pom.xml @@ -89,7 +89,7 @@ - codegen + quartz diff --git a/upms/upms-api/src/main/java/com/rax/admin/api/entity/SysLog.java b/upms/upms-api/src/main/java/com/rax/admin/api/entity/SysLog.java index 9d4a6f0..bd2442a 100644 --- a/upms/upms-api/src/main/java/com/rax/admin/api/entity/SysLog.java +++ b/upms/upms-api/src/main/java/com/rax/admin/api/entity/SysLog.java @@ -36,7 +36,7 @@ public class SysLog implements Serializable { * 日志类型 */ @NotBlank(message = "日志类型不能为空") - @ExcelProperty("日志类型(0-正常 9-错误)") + @ExcelProperty("日志类型(0-正常 9-错误 1-添加 2-删除 3-编辑)") @Schema(description = "日志类型") private String logType; diff --git a/upms/upms-api/src/main/java/com/rax/admin/api/entity/SysUser.java b/upms/upms-api/src/main/java/com/rax/admin/api/entity/SysUser.java index 17e93d3..a8418c7 100644 --- a/upms/upms-api/src/main/java/com/rax/admin/api/entity/SysUser.java +++ b/upms/upms-api/src/main/java/com/rax/admin/api/entity/SysUser.java @@ -148,6 +148,6 @@ public class SysUser implements Serializable { private String sex; @Schema(description = "医院") - private String hospital; + private String hospitalId; } diff --git a/upms/upms-biz/src/main/java/com/rax/admin/controller/SysHospitalController.java b/upms/upms-biz/src/main/java/com/rax/admin/controller/SysHospitalController.java index d4a61de..1a85b62 100644 --- a/upms/upms-biz/src/main/java/com/rax/admin/controller/SysHospitalController.java +++ b/upms/upms-biz/src/main/java/com/rax/admin/controller/SysHospitalController.java @@ -49,7 +49,7 @@ public class SysHospitalController { return sysHospitalService.getHospitalList(name, offset, limit); } - @RequestMapping("/getHospitalList") + @PostMapping("/getHospitalList") R getHospitalList(String name) { return sysHospitalService.getHospitalList(name); } diff --git a/upms/upms-biz/src/main/java/com/rax/admin/controller/SysLogController.java b/upms/upms-biz/src/main/java/com/rax/admin/controller/SysLogController.java index 3ee298f..b864641 100644 --- a/upms/upms-biz/src/main/java/com/rax/admin/controller/SysLogController.java +++ b/upms/upms-biz/src/main/java/com/rax/admin/controller/SysLogController.java @@ -39,7 +39,8 @@ public class SysLogController { /** * 简单分页查询 - * @param page 分页对象 + * + * @param page 分页对象 * @param sysLog 系统日志 * @return */ @@ -50,6 +51,7 @@ public class SysLogController { /** * 批量删除日志 + * * @param ids ID * @return success/false */ @@ -61,6 +63,7 @@ public class SysLogController { /** * 插入日志 + * * @param sysLog 日志实体 * @return success/false */ @@ -72,6 +75,7 @@ public class SysLogController { /** * 导出excel 表格 + * * @param sysLog 查询条件 * @return */ @@ -82,4 +86,9 @@ public class SysLogController { return sysLogService.list(Wrappers.query(sysLog)); } + @PostMapping("/getMonthlyLogCount") + public R getMonthlyLogCount(String startTime, String endTime) { + return R.ok(sysLogService.getMonthlyLogCount(startTime, endTime)); + } + } diff --git a/upms/upms-biz/src/main/java/com/rax/admin/mapper/SysLogMapper.java b/upms/upms-biz/src/main/java/com/rax/admin/mapper/SysLogMapper.java index 6cda539..dd16776 100644 --- a/upms/upms-biz/src/main/java/com/rax/admin/mapper/SysLogMapper.java +++ b/upms/upms-biz/src/main/java/com/rax/admin/mapper/SysLogMapper.java @@ -3,16 +3,17 @@ package com.rax.admin.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.rax.admin.api.entity.SysLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; /** *

* 日志表 Mapper 接口 *

- * - * @author lengleng - * @since 2017-11-20 */ @Mapper public interface SysLogMapper extends BaseMapper { - + List getMonthlyLogCount(@Param("startTime") String startTime, @Param("endTime") String endTime); } diff --git a/upms/upms-biz/src/main/java/com/rax/admin/service/SysLogService.java b/upms/upms-biz/src/main/java/com/rax/admin/service/SysLogService.java index b42cae7..510b3a3 100644 --- a/upms/upms-biz/src/main/java/com/rax/admin/service/SysLogService.java +++ b/upms/upms-biz/src/main/java/com/rax/admin/service/SysLogService.java @@ -5,6 +5,9 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.rax.admin.api.dto.SysLogDTO; import com.rax.admin.api.entity.SysLog; +import java.util.List; +import java.util.Map; + /** *

* 日志表 服务类 @@ -30,4 +33,6 @@ public interface SysLogService extends IService { */ Boolean saveLog(SysLog sysLog); + List getMonthlyLogCount(String startTime, String endTime); + } diff --git a/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysLogServiceImpl.java b/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysLogServiceImpl.java index 547e82d..b048b48 100644 --- a/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysLogServiceImpl.java +++ b/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysLogServiceImpl.java @@ -13,6 +13,9 @@ import com.rax.admin.service.SysLogService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; +import java.util.Map; + /** *

* 日志表 服务实现类 @@ -52,4 +55,8 @@ public class SysLogServiceImpl extends ServiceImpl impleme return Boolean.TRUE; } + @Override + public List getMonthlyLogCount(String startTime, String endTime) { + return baseMapper.getMonthlyLogCount(startTime, endTime); + } } diff --git a/upms/upms-biz/src/main/resources/application.yml b/upms/upms-biz/src/main/resources/application.yml index 1e34b51..3b4d0f6 100644 --- a/upms/upms-biz/src/main/resources/application.yml +++ b/upms/upms-biz/src/main/resources/application.yml @@ -1,5 +1,5 @@ server: - port: 9999 + port: 8888 servlet: context-path: /admin @@ -17,7 +17,7 @@ spring: driver-class-name: com.mysql.cj.jdbc.Driver username: root password: root - url: jdbc:mysql://192.168.65.130:3306/rax_backend?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&nullCatalogMeansCurrent=true + url: jdbc:mysql://192.168.65.130:3306/rax_backend?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&nullCatalogMeansCurrent=true # 定时任务属性配置 quartz: properties: @@ -46,6 +46,7 @@ spring: multipart: max-file-size: 100MB max-request-size: 100MB + # 静态资源文件 mvc: static-path-pattern: /static/** @@ -79,10 +80,6 @@ security: - /rax/** - /hospital/getHospitalList # 临时白名单 - - /static/** -# - /topic/** -# - /front/** -# - /medicine/** #--------------如下配置尽量不要变动------------- diff --git a/upms/upms-biz/src/main/resources/mapper/SysLogMapper.xml b/upms/upms-biz/src/main/resources/mapper/SysLogMapper.xml new file mode 100644 index 0000000..b3c56b3 --- /dev/null +++ b/upms/upms-biz/src/main/resources/mapper/SysLogMapper.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/upms/upms-biz/src/main/resources/static/html/app.js b/upms/upms-biz/src/main/resources/static/html/app.js deleted file mode 100644 index c49f243..0000000 --- a/upms/upms-biz/src/main/resources/static/html/app.js +++ /dev/null @@ -1,93 +0,0 @@ -const stompClient = new StompJs.Client({ - brokerURL: 'ws://localhost:9999/admin/rax/SurgeryData' -}); -/*const testClient = new StompJs.Client({ - brokerURL: "ws://localhost:8080/test-guide" -})*/ - -let user = "" - -stompClient.onConnect = (frame) => { - setConnected(true); - console.log('Connected: ' + frame); - /*stompClient.subscribe('/topic/user/'+user+'/doctorMedicine', (greeting) => { - showGreeting(greeting.body); - });*/ -}; - -/*testClient.onConnect = (data) => { - console.log('Connected: ' + data); - testClient.subscribe('/topic/test', (greeting) => { - console.log(JSON.parse(greeting.body).content); - }); -}*/ - -stompClient.onWebSocketError = (error) => { - console.error('Error with websocket', error); -}; - -stompClient.onStompError = (frame) => { - console.error('Broker reported error: ' + frame.headers['message']); - console.error('Additional details: ' + frame.body); -}; - -function setConnected(connected) { - $("#connect").prop("disabled", connected); - $("#disconnect").prop("disabled", !connected); - if (connected) { - $("#conversation").show(); - } - else { - $("#conversation").hide(); - } - $("#greetings").html(""); -} - -function connect() { - stompClient.activate(); - // testClient.activate(); -} - -function disconnect() { - sendNameToServer('stop'); - stompClient.deactivate(); - // testClient.deactivate(); - setConnected(false); - console.log("Disconnected"); -} - -function sendName() { - user = Math.random() - $("#user-id").val(user) - sendNameToServer(); -} - -function sendNameToServer(status) { - /*stompClient.publish({ - destination: "/front/doctorMedicine", - body: status ? status : $("#name").val() - });*/ - stompClient.publish({ - destination: "/front/doctorMedicine", - body: JSON.stringify({'status': status, "db": "test", user}) - }); - stompClient.subscribe('/topic/user/'+user+'/doctorMedicine', (greeting) => { - showGreeting(greeting.body); - }); - /*testClient.publish({ - destination: "/app/test-hello", - body: JSON.stringify({'name': "test-hello"}) - })*/ -} - -function showGreeting(message) { - $("#greetings").append("" + message + ""); -} - -$(function () { - $("form").on('submit', (e) => e.preventDefault()); - $( "#connect" ).click(() => connect()); - $( "#disconnect" ).click(() => disconnect()); - $( "#send" ).click(() => sendName()); -}); - diff --git a/upms/upms-biz/src/main/resources/static/html/index.html b/upms/upms-biz/src/main/resources/static/html/index.html deleted file mode 100644 index 314aa04..0000000 --- a/upms/upms-biz/src/main/resources/static/html/index.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - Hello WebSocket - - - - - - - -

Seems your browser doesn't support Javascript! Websocket relies on Javascript being - enabled. Please enable - Javascript and reload this page!

-
-
-
-
-
- - - -
-
-
-
-
-
- - - -
- -
-
-
-
-
- - - - - - - - -
Greetings
-
-
-
- - diff --git a/upms/upms-biz/src/main/resources/static/html/main.css b/upms/upms-biz/src/main/resources/static/html/main.css deleted file mode 100644 index 8643b76..0000000 --- a/upms/upms-biz/src/main/resources/static/html/main.css +++ /dev/null @@ -1,14 +0,0 @@ -body { - background-color: #f5f5f5; -} - -#main-content { - max-width: 940px; - padding: 2em 3em; - margin: 0 auto 20px; - background-color: #fff; - border: 1px solid #e5e5e5; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} \ No newline at end of file diff --git a/upms/upms-biz/src/main/resources/static/images/SliderVerify/SliderVerify-0.jpg b/upms/upms-biz/src/main/resources/static/images/SliderVerify/SliderVerify-0.jpg deleted file mode 100644 index b503bce47de354dc308acfb81857ae2c1d759081..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14799 zcmb7qbzD@@x9`v)F$~?^!@wXR-Q6(6&>S}}Sa|=QW|%VLf6BI)GT(ptU}MUZ*#Fc2Q5^2S{uqY;NE37a%jdtJ1OPx90RR_M zBO(eF!Ak$HG8TqIYz6^<22ruJ!7BYP?ssWv9?r~RseqFZpofmS#n%E2@ad-Y?$(%D!*f^T zUg{s}0U}ikzKx~{35aA<{j_8%Jg0Kqr`to`vNrFLHO>?~zB(3KIhr%!%o~Y|a&50( z(557*iy!bc>}2A(8kq(?Sen!X4K_Ux=ToYf5=T6ojtnqL?`68O%yyp3pRVwKc``n2 zhOk#%u^wAUORD!3(hvH~?82?zyjc%&kDg^yj9|IgD|%gQbHBHo$F?Fbwc`F%oPnpZ}=#h{~DfplNNLlXJ#ynbgcw z*5lAK##|iOeMPW~7cts4FyMx2bu=~`Y!_|{?iF$QbnF4yvZRrkrc}gJTu5mim%iYX z+gdYC!D~R&6Y!yxCF0XFUaQVznz5Jhr1L}P`5bt)#k%g4{Gxb*-j)6Uxnc7HpLT%5W{Qc=wD)z(G@X470j_ z3|rNCmvueX{-8W~d`r88RJdR1ei5aPbxCOr0MuFJQ8L^YK*PCnw7c5)KN97<$riH6 z)C{l0Ll|>82xM?gXhrIAm~t?viPh1?lPa4Q4Yg zueFNOGe0$q{1jCNYc(oOS+8u>>y9-mtL7UUw+K8GG}Eqfghl6Nh*lYE!J-RP3o7$6 z>OgfC*&OP;=tm5Jp|J(}W6}X4?M8UqkIG%PEG)O``n&Dq;6Wh1S$AHGHlmMSKEX1g zVwP!9@Qgv8EmWZvqlF*-^IFuG<*DutJK0lT+4IlLj?{wr5O;NqD(kqC>gZljH_EcA z=(#M{h&Mn1k+7GwF#?ISl5dzsjvuE>v#1CEU_$|So$D?3J!J?= zMf?1+bF|g?%s+M7J^nsGj-JlUdXYJBtKH1SSgTN#>Xj*xK%^;GM#5#`Y!A!+;hx1* z3x~fdLk0hewO)F*O|{pTG|N`gsa8rcoj2o;K#@_dWA6S;W%F(MmLDvw)TKYbCkbFj ztFD#Tw>omRVM%AFB`R{sy1XHWzLt6}ja+(_k=feq+GT8&TFNhCj5bc9>-i>lx=C;5>qx7PjdYd-SW@fJLYb$5!1=&Vv7AjG-%C%{+;Tr89 z$YocGjld^`uO&w5cczd1gZ6Kp)Et#qe4SJif4QBMli|{?^>Vvms$KcbLn@Z_3rMPD z&F+&Q!CYtGN)~)8Jt*PM=xk(tfp#KSX-0H*8JsGe1O|vr;1W<4&%=+*>({FkqJ}_z zre`LG3hOlSjcRtyrMBgZ?fm{DkCyz>WZFk$!OQHPx6y+*=OS>aaFQMXMqfPa2}P)J564Y z8&p`Vp4{(y`O#5pbBB`V>Eis=H>?i-v%L-ZdS-E5IE+F~$Ktdu&^6>w(gfuiq0G}x zEPW!+SR-~X9P?y`OL>!m%O_Wd*u70%V z`5p2z?X<_Mr(x?w;E8KuYf=Z-`bNP?U@`Qo@99tK%=XO}B6eZSqWkg~@70!838a6%vgFWU`P@=$P zZfqFHP)kW*@Sb+8G6U`a2^JoRDoqTK7w=dKP@Dk(2rI|!U2i^5m-1N77&iX zKm8b$(~)2SNC3E)B&A4*X~cjUMF0@Mh8d%1j!FOgKmay2HWn^6Cf8#?0;U?1{wZ)k zKwL^Tb`eE94yYlOlKuT~3>+ZDG-Kgm(;>_I@a5f_xa?TYL)^u!-IhwlN50+xs>~S* zl1W-eCV_ja>eu{a{OOUPCSH!oqt*+Z+*NDCI>x6LXJMqN+iUI~Bg3udZXSukxku$t z!9;NDHEnY8Io$c&Jmy|(SHP<0=YitMRn)v|Q@WrytW-cPH^j&q9s+M^adL9LhPk_W zd`GKSSNAMiqg9*{xv2V0>uPC**x@5JDtAmr=ZnQi;rGZsalSjiTZQThHO+&zc2m&B z{?cE1C%85FTlshEwGf&5P+ERVXY9z>(n=74%vOT9;P!H;!4AB|`AD~B(7HNyWMpy+ zm6k<}c*UTwbHfO35uFs?u%%vAqh5;}N^c2)H!r1XRLtymh)rBRgFELQFNdJ()TpO_ zKg?TpzW7EXMPqlq^DE!^D3nIR)6;G=%q-#3biKtn2kzv22SC_yhvaVD0Zxf77Gna9 zY+>%^7r8&wsEpJCjns&_AqvH2cIT6WJ@q3OqEP0Q#6Q?qdDP&~+ z=(+r`_4&Jd5?cu_4H(5dd%s*(R?g3owv`T!3R8}bIYwhX0i)j7SOiO)tJnMG&oVA? zkBibBG~9XO%aPUY3M!r-Ro8}zs8xHjPu$8A&iTrbuldRojw(zr1T#{vVsB4IBZ~^M zESb_<)yEFi$T_&vQ}k{uk1*Z3nj$B+rc>5rYW(0DS!d@ni=T{`vh>$ordlRrX#7Dr zbOEgz5V8uS+c2wF(>~le$BqVLdCY@WeYDNQ#0cf_#e2UaSg25Rj*?MeTGzX^c6YTq zS6eV@=d$FlZac+L`PR?*i6<1IoLhS(_%%N{w`i43=+0_*X}GH=bE*#~W5n*|W8l=R zfQ3;?zkDUdo!%Pj*L8z2aqHv{^tK)&$8_@a^vs694`bvEno8W&(@-!`?&u&_bPKjz zA&?;W^2Smwsda4P*soW^ce{&`=vs2K<*iK8;XMvXM7N~+_A(>;*mBW`R{-gB47BaJ zOwT2B!u^;_TS7X1 z>tK(U(KQ%?Lk`cRI@(CFI6qM3(hQ~jwd{Q4=d|bR1ie)!iPd~)XIGy^YwHvSTNpFHE~3iW*&X7z+z+GG4y}u-938?|%6H z@x!cy%9$zIBmHHsD(Qrq7;#EklT4z-M$Bh@qx-#qa=I>LUtCY??jgAYWQN1NTj$Q_ zJrC}8_~*+!kV*IXywEwaQ^@`y{v2g>-^_CGTtNhr=u>3Z>s&#l_1Ld#>-Ms1m zH+%)xw!s-U;=3EhY(o7sj(ssY^Gtf z^20KoABiTf3WI{9i%8q3oI~JTm9l1Fqjw9FJW4Xkr$3@}Li6)u4ZCmA(uX2Y&B;YP1 zBR{;0MgquIS7c(h+e2%19}E{^Tzw^(D_AWD?wnqj)E(M}yb9ZbhtgpD3*$8|!^=iu zh_Z%s=RE1_CG(3vo6Z-@&V?+==68U&{nk6cnH?rya8m%Vv2bv)|K^MT5Cs-Chz&?7 zqKLx|HBvIPclehpFv&y#Yfp1Dlg+x;+V`ar4y&!JS|$X-s+UScFPEd6iZ4GzcL#{I zk&tEKgO}0deVD(B%%>Z%wzh_T-}qC=liuK&+P- zj_1BKKa>1Gt%bC;wZof{GukW}F{xnSKYnpyapH^$qUgf2{gCXWHB!RCVP})%#8MoC zO_Q}KR(KMM&^WmRV1(!TD?CQ_|5tbspduwZ4phm=-teF7*#Bf#Y*S73-O=KpwOVEX z#>^`Z;(d;%A+-ED&mKlRy5dB4>;%COXTxM-V&donb_xc=E@fae*f3^-!mTtu*&|j? zCwH_g33u+HA;}w5ioLJOQhMij#9~UFV!bLCM(lm z`|_J74TiKle{;(7U9XL;5*8@fsB(nfALV*JsKv=p>pF8Khz~t7g&M6kUGv^3U?dX* z0du=<=EBt_n~jzG{q1>qu%}p%#*!Uk#`XZtU3HuSy|^cX1__c2JA_W4kn? z4YU{Dq=u2}x;dzv8GKGkvu|u{Ic&mRoP8{L zNaK>vqU3K#-P|V@oHIjar8I3Nt+Z@dZhOg26`^LfZu3REevW9PwPRwU7&py5nsp`3VW4=ab~4>fJmE~) zLw)gvl$d>#+-($>G2`oe(060-uv>xgH0h;qR7C7}Y3Zl=BAEC>+p~XSv8HAQ)iRgvA6-ruBb}vTY zry3%jQI_HJd>jIQ915NAfeneUAM%-!*=p%v4>`2n5Qx>T9|lCLlc*jb%Qdi z)c6j?`R9BN2}Yub!gJs!O34LM2}#l7)Ug>)cy5e4Bc3D!Nm2QYGxl7|W%9_SkSCp! z6G?{xUhTI8nn=Av<5bNR!^vubm$@_fZCXuEu;)YsR-D_tM4u|0SLKtB*v%T8NRuzB zc^hVPRrge8#~o^uyna&~` zBg@crwZN_QYwkH6gQ}`3PjfU+yq;_3b4aK9Lh3o6n4SZnGNrn5pq!NuZz4<6Pgb;T zS^)#Qm@*~G%~CX$VVZ8{=$ZrAtqd%-SIRWG-=6-Kg+(Y$|aIfvEjv-uGypCR6;`M25|o6_4=844rE7xECY>jCh$`jN!=Q)fYQ$!20 zS5bG*<}9}s7&N5l5$aY!+MlR%`w0=OPR;y$L1~TWSZL6%@m=Cx%X>DJhasBQq$i1l z{okntmhs`NUvy@&f67l;p~neDUzo0@MN`P$W9E0$G1jDyDEA2QFV(PgRY|kd3)bA1 zc&N?h2`T(4jziu#lbOMERK!lG)Kr@;rc_R;`fH|uoi_0~V?vrcf&s~@DnaREPAD|O z>256Pq{~06>_sNZYH@*dJoofUY5uoZgOniORss@Mz%FU$Q}$0$i848cOY=2Q?VTp7~1R~UwX?f zDG}|b5SFu1uPxH_5(6;AFm_`@i$(J^7wFkAqB~WJXp*6wdECg0bW$jmUd+nV=c+3t zpun_!kq9QvkKGph5!8lQm;}}78@r6XiX$gZJAjoFkkp~XL9f0cLo?~1C zCHNalJcc_1CNonG2J+a@LC1CY36JQ{375?2nTw5{Q{b{Mb`S=)fdWOANtHTbmO&t) z^e8m>nlpQ+U)VWI$@b<02+CT=82DJErB^pS!+};s4f(VDjHi#9Oy_$qDTXu2-^Blj zp7rHxxY3!1Ghi`fIRyOB>tEKXwsi-#^jPX>K~q^?1MxC(DB@DF;4B zNM^XF7;-e82t{y>)OJkjImnOZ<@|X`QW+#7<-XbtWoQyjHJ<-ejifRbieDc{{s%FD z(d9(M3EOi|Ma3De#Bw2|Jo7T&c@A+U;XuLP6RyqLk744WM7>;4E+Z#iDFHZQUmn|) z{y~3tJw$)J`$lxQ;SON(%kAM`omd2vWH}a=`@BPug&Ae$;si%%WN{iaMWcTtQw1Y6 z9)>xVvs?}W(>^$#O_z;#a-zMz_18ETBsTKzPgpQrm|fB9e&FP$&^KaqtJi8^7cWo_ zq%C`N2e28c?6wrV$sqLoM$PnV2Pxsjn&2lH;?f2`wSC(FUO`MQtrE3xRL4&Eq?>cC zcpoI29#1GdG(vjHRezj1Cx7=qs$6J-0i71juWeUK@kJIjx>K^8^!U?+LYZVqbBP{h zy*Bs3KD&`oCk5eTB+Ek!t2TLu{lEoZZ?@mxGB%qYhNUFc zK!Ray44iI6EV-UevT8{l>ZX?$7-F8sP<}V*%7b6+=bA=DlbHEbi8vz?C zhfrwz`ceb*-OjNWVmq1Y4iNN~6=gN>YwYq;|1jml_MpTafJDdKr6{IxlzSi5>8NGv z~Ue63Q)Dg}~!ChgH~lLEhg!rdCIhL|_tTZc2So;&S+a2%K* zz5}r77|gz7CN&@44Q)25zv*(DlnTGxfxDmy}-g%WQ+D2}AXZwa+jFXi~$0k{alg2|@sVflL7p4CIK zPF-hHqMML=E=~da56>7o+S#iLVrv&GjVB;tPn!ns07t5-c5QY~{GsJyHbkfqtEK^) zJAj$%q=wP%qg&Ot$=T1n3h#&J-=0$3x>rch25}E`yC{Z6BxITRM&zp%Cy9NPW_UNS zY;1^>j0dUCQeA{85q;Yvg&`zgAlzA|yy!wlEs2JRei>&~&BipnZIk4(Ds1ZN&IT43 zpHtl+LW;*jV-_eFJLR=C?*M*MZ*OpgG5!<1$ z-%g1j3i8bfEYr%5~~3{AR`X_L!zcW9-i#~ zha>in{GT66Y9T)Bxl8hbEtibxLr+=nNo}Qo7s3u$;jzJAuBihO4K5Pj*~RaX58R{iiQOD4fz?^6W&ooAY~k@*Yp=STpA}>!Jmrdq6{#ydJmYm#xcZcN z5_|FRw4`T%)}4WGyyj3s(*6Ny6#JBH>HSBG40e4d49r1`c-_u~+q}dQ_7ObExWC5u zVxIKp0l-yi?|2!k_un*78NPy!-Itj}MMX%Ozy|&hCif_vt^8mrXq)>TwT7yq;S%}fH(;!pOlVh_QzQ;(&zLhwG2Xcp9XadAqD zaX&MQnu*5dQsSCNH?k_qd{dW6-Yx3cx8~n`pZXQRrx*bk!XmxGjw;c4PLPiQ0!bu`() zmsYD{Iu3-go;GD1jDl;m%BbV8B8bETKfZ(Pk*owpDqE9;F=a|R#|ABuv|Fh6I;#{0 z-+;U3@P~p_*S%Zz7LznFKA&pgd5W=E8PQL5~?4n#>0r8U%4+!`9nW6#gj)kO!;21IEX zj76w)FCeNp{~OW7VD^!tihpt|DT^*<$i3)o%`a7Y3oBO+!|dWDW%eTIqHBxKV$s@00^B32Pw z)7wu*>sp)I#kM|t@F1b)6QX9fNM#dtVhP2id~M@+Wtck@XbnerKjgP<48lhw za(*uyeCN4cYmfxu;$WLe%Z=DncB=}E1V)uh2rt><`uUG!RgLP8aU-m09l&|Y?rSXx zm>>uVXd`4x%LLH~3w`<<6SX-oKMx_?8)3oufP{%L8l>#HL$-A#|8G(%X~an(Yo?p)e!1*yDB|ef7lYX;|q3 zGiyJ(c08bdD_WJ#{g(J)FEOew1{iIpU&L;C#vRDn%J7(;HIYymsN2x+j4!jL>@=yQ zNPAOiFcgg8h7Ek_8tEIB)rK)LKM>>P|Gj_r@2Cq4fZ5_w0%9y2k_?zHLTxtw?Q+g?x!OLokwqJCMU8jM6nnd^P64t&m($Xn+r z@I<2HJ|~1TgEmMJ6=`n~<-VlocA@Haf6Y?W5$c}jL*^_r|LJU^#kjUzMJ!Wl;1AYg z9ocg0Vux|=J%u`#vV%Dxm!De}zT!BzO zgLCT{=hvL?3Hu|pZ%g~6aVW5DM5kobSXNKr5IWrcAiC`Rc1J+7}kf-5AZooE{StknO?MZu+Bq zv;v9KtDEP)eeR8~woJ@o$ z?bW&J+(vE8F5l*eQ>UuSGyqpv(0R}S=IP@Ru>X8i(MVn=$yJG7etl!pQ3~LJ6G=yuaJ$8fg!% zz2&g-KSSs`TR-)ZS*xfUU7ZS`J8eHp@TJyqvK|VGvC6eJr|nc5HKyiE=mo%Z(ZZOS zzMbH-$y9p8&t|Dv3k9|02Q^$4tv21qrwni9CpzP7hGPjt&6C32X^9WXc&?No_4CSA z-k!8Ne<+)a+3>nlYbt0dlETQG=uS2A>Ikcnr%&iw*U`^~m2gN;V3P#Emt|6G7V~`k zC@q!~dM$5D6ix@+m$G}RB|IKEt7Z;19QVYDmjpY}1xHyrbHk%-T8GS~0BSO|t146n zeXlEO_bNc#s!0LNBhbhRSm2X8H)9z2gB?Xo~~tgif{0LLo6DHA^BjygAXrb@Q5saty5ll;GDhsLm?6DjD5^ z9qU=qz9LR#36b}kKo=?Za_~4Ml{UAaaeX}(*eNUueSZOg=1|=}bplDh3?*>_!D`d< z#+>4}Xr7x2gOB8R8|F-AMFJ+REj13viQFciYrF5V8)_RRCW}Ve=i>fh>_o&0I-bQB z)p>7E9Pl4dmiy@=Krqd8%ppD92uw4h-0!Pk!I01S>S99!=?Q0^R^?+??K3DXp4KOr|K@#idIxGEwqKU;vSHXX_wN`zhsphF=9xHOAE zB!T&p=Q|HZGP-fg=yFi2@oR=ogR6#Rh7XAX`M1*sXnl;8cyQ5-7?JA}5P* z7*b$CThby`!}!Q(zV_+R#8ia2kMNxNA-6UHWvV2m)BX)~{L|JkyWJmznF!Kcn&}+c zIg~Ks@H#bJU1aik@`G&1+G_;y+coBzNB(*3wT<4^?gFj5HheroRL07$Uo$wyvfY+r zv(|;PJ&)hMNXciVFkJyh*a3UG$|SLdB|)1ylL1jd`K9eQilQxB_Ew$q6}So)!lL)% zYe*up=0%P~>x@SXndB*HVv1Ss@J776&=JG& zv<_0xP{N&Tfij+lx&BkN+xiH1Qtko5)3IEgO9ug}(#EJ9As`k~jcb7bcwuwTo91LJ z&X@^G$85PqfO`zI0uXx?zWGiamJ>Jq^wA=@!|Ux6rb^E&c(a_uhRwKjt<~P}CBzZA z-s8Y038&y=bKXdy`HVgHj*{xxsizv?88=%?VBV_Q$G**{UmPJ)U0GN%oLQQA2;(YM zjB&MWAnck-v1P`~S>7n(NmOm80~N}ljBkxJYe1)MfNu@^RIu$70OrUv(ke*)E|Hh5Miw?ULu~H-CO?y@G0h9QE-|Ey)~px`jhua*1BJ}rS;aHuSKMh zRrIydzRtq2TK-L`arkPusIWitp%Z?wyOk^YjoeOYBu>A8Mk)(;U0Rs;@~v~s9e_Wf z)T^u^P<_Uc!;#C}ZBVs1^RWi0ACFT`O(isOsx&X2-g3>jJVZ6EQ<;zkE*BTi8AX9A zqZk*+E80kS(1GO(bl`C!4Z3(qMWiA?KEX3-n@1yBV342cb3Ibv@G#=Nd+L^`)v?Gs zVsVF>JQyu`;DUp7zwIrNO^ilho~C;yD9KlZ0QT7D%?(p0o ziT+VsYmhnxOGI?O-(wJuG*h{9x?(~L8Rti>KDdVqZ2-V#YPWPJzJkOgl5Zo19s9}b z&18U;Q}@Rpr-gb)vKPRQodpXlW%TlE3r^(ORnuJf`7FlFZ>Mz=SlA~TH(%PbSj2i> z#EwhdrHIc>XpHqaTKxX+wd2hG|8Mq2qVq|kguRWzxkYjegrgf zov5pV+?%$*UhT`kzIqd(c+NKp7w_NTc)1$q?x`sfIZBT5Le!6FG;fx#3pDY<8J`}8 zdrCC9909ajK`ANS0Wv1_UTlSMZSg<$!mX^C9!zYT$zzyY1+UAyP*=2o&Bw7|9jKL3 zcadjUR`@y0om*0L`K?Qd&wj!BNqRd*b$owL0wTIouv<)b?{l!u$d$C3KgtT>T&E9V zlhGIyTa$-w3#@DACuFhtHKm7|e<(^U^3F8|mpjny< zo>#%eXE4^q*J@26Vb~p4!8n>~Hs~EL;zF{x-!i>8xHt+-=^6& zWWbA~Ye!cdFN)-6`+;w4QS3rfq>W`Yxc$)xr-eOn9aKbxW|cNLEZ;vJCRF$X6&T&9 ztKWj0)U|TsO#6vN_iF9ziu~ZEHUenxOHEBp?_Hd}N{P~F58>sx1GLm#71#V4T0}nC z^mS#PQK)5a`NICT7r?rr79o=#`P42xx-wj+QU@X60AR}HFD10nI@Vv1uZh@KqTS{W z%oeQDPO7uZH{zbX9)9*=s@6|xinAiShQu{k{FH(Q#~wa8KXKNBlgo-yGb$KLmDLWQ z7Zd(|Yfr*a^oe_QZNEflK!bnG@`a8fmLS{L^&p2QL_V)YP*aYm_S#&gyd;Opx;W9B z?}kqKs;q(8U0(<_36ZQHL~F^jS^wZMt&=a5%o_^JG|d?fkUKr3TIUU1)Q)A0GU}oN`A@CwmjOcx6aNxMu}>5f{4%`Sn8Z@&z+lW&RdY%n28b0eR_ zR^fBzq46u<(8iLk42C(pGIGtvzRPL?$y3m#Kkt1LI zfOexE`wIPpkQXNw&mM117Wh$y(m@pMo_FvkP-ZC;1Wlkh)y zfGtS$bw^=e(W+uKn~8#Wt>3wLb_)MVz7Q&{!$7xEu)C)(WR!|LDqU!pIpRu% zhH>-#<-rj}Z#ePi(JPqt_7~H&2ik}g1gzKm#^I!6og#2Ki_1Y61U-hGqJiZI+?a{6okt;Vna+vrqrT^ zMLJ{NL?(ZEp?;kAS-~9V5G(BtFrFBdi5|TJINJq^4hZ(-nd~bbq?r9Y%la~^PiEZZ zOEYopXvT2yq=g2-z;gJqPiERPy2Gpu;j~Y6#qw=eI?LVDk(qd_^a__>vB}Ns0~lWZ zpl^32M0qdHe%>o-xYI!Bn)^nAVDb(?_bB@-S8YCmK_^$ZaiFggLek~4#!mIz3e|=D z7N0O;Q_Sup!Fd?B%W9#323uUt4Dy}vFMS{mD=heP{H{)sd?NQMn?`OatgcD8_4ZR1 zcA!GLst+%!R?#r-**z*2%SdAW5#t-Fp7h+p^zfI#6y`1;+ptJlRA_>K);?h7pc_S& zPD6rvp3J}QX0WoZ@2}O1lRRRgc6s;CXM;Q2{tTZ$8fJAiQI0i^NKUv9cn~}V&gKh$ zmlxYP80M2DNZY6vEmp~0kl_8QsfR&*taqN}NOk`6ZCvuu8;Q3pDS47Z7fCFM5IDq6 z$9XarSIHVzc#Shw8tpR1si*uKP-gC&b%pDLOg@}p1 zVX5~3K?di*123+VX8X@<^$xwG+<;tQD zX}a?!MpjNC6V9DT%z=qP$*w}1dT!6b54)J#0D`JJK*DC}Pv7@&&~QPn@dm3>7VscK zq^xj2CUiZAr6A${iM{yph=S2%-+N_i?vSW36g+Oh0>#0A$>yGdY%XuiaX+=uVkxQ( zlZml6SjNZ3b?eUW2)yqbAJu31U_yXh*L`FtKs?jY$H_^l;Q-B+_>pg}S^Z;Z%VHz7 zgydJ&9f|if0RPhD2p=>>P#&tq+loPdtX$(&-lYuaF@@r&v;*yVJ1=B zLjql;oZ-oBXq+{tVH#6&a0k;sNPkes`}30DPY-)ZTUq0)zRkpKJ{XUkq4lG@FPB@D zU%FtC*f00prR_z0Kiwt2QQHrn@ThL(^Qt}Iy3(edIQ-X zCikrt765+ze5FUlc=HZ$4zW`^8Ok#T#i^+uH(l z3=~|UpOTrn$-#fDvdpnpv`!?Pas9wKGHhmz-y{esYN_X?BF@5Gf?}O|ZW}f@iR$v% ze9t}Kqio&f$xi^SmQvGpobM}`>hifX81OiMt{oQDd^He|>kyI{u}}M+;_+AP@AL1D zthc}niI}s)(ZC&_%N3*x8wy$pYeG4$VASND_pQ zPnCAWEG9M!a2n_9xtn0W!?%T4S`y~wX6MMF=q<8ARbi2vlerLU%r~vU7d(Fbmc6AG zFq4jc{RXYoUSnCMqobq#MS@$j@KrXofcdJMA4FJn_YIBkx({YpUazp|=0vt&4Q642 zd4~xOs`j1`+IU6*FrZ~z<Jepf6?be e{ycK3-DOBp82MS&SEFHKF!l4d|E=BK^8W$8gMhgJ diff --git a/upms/upms-biz/src/main/resources/static/images/SliderVerify/SliderVerify-1.jpg b/upms/upms-biz/src/main/resources/static/images/SliderVerify/SliderVerify-1.jpg deleted file mode 100644 index c4c26333248ad18073c8bd3317b221d1df246850..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17632 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 diff --git a/upms/upms-biz/src/main/resources/static/images/SliderVerify/SliderVerify-2.jpg b/upms/upms-biz/src/main/resources/static/images/SliderVerify/SliderVerify-2.jpg deleted file mode 100644 index 5e00f5cd8d2d845c511c1069f96e1a926c75c4cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28363 zcmYIv1ymf(()Qw-;O-6!EQ>>McUj!sgF6I*y9IX-PSD^oUIfHUNNv0uX=-0058yxNrynxL59h_i% zUQW~s((kA_!2&#hmt}wy02LV-1sMqy1qB5S4HX>|{|zPv1||tE9u__YDHSCJDLFYc zJ&1{#mW_^_oSC164a~{I!$ZX+C?dcm4C3bDdie>!K!vk_Cx(N=0lYu~WUqZefP?$j z^?&@ojsXz~8Rg{{0QEm|xNBvngm_0{F!5`12r70s4SjfuBE4tpz`y`!81g^Q{38wj z^eIh4Ny;hSDW14D81wbjgrMT$BBtOf$gr~~B*a@1gI{&25mCj%Kcz@2Fqcs{zM8c} z2ERTp9)c<Wov$QlDz%&B@P{l*gXlUr^Q(oOkM-B`ua)!Z`0|3F|pTgunYkwJH<16r>cYp!B^V#*(bR#wz|*0^qtOA~^^qgc(-#P?^xGT`WYn~_r-vSf$wHxnXB*yThi zqsUYK`FkeNYKDR~@nV^|5XF}f3{l^V{e8u6K7#K*rKR8|h&tyD3TUj>Bsbf-NNWi$ zEW8e-!bMS15yZ{la(FFC*c{qb46yi&iTNTx)v!jwaPnCKLNh zLDJ5gJv3{-8@1ffJc9Q}ehHk{l-|qqEuIVM_= z$>!|5tyBK$PM6bdyJ_^@g|ddtdqOoyNcjFc=FyZ9eq90%i^@;xFJCoVJ1+mu7d!Fv zUODwg3O{OF-)d%MNiPia%yjX5+24mMh3p$CmF6ncF zg*tg$`+KFx$~i?CygB$gLNNEX`GDog{r!c3;q0F$1HeFBCB@O4s)6_HqLCzgmtEvP z>Od|^HbPZ3B7zPz=BQO;e8$#Z#)kpUPyVGny#ZS`*L_DWHOlPeIc4a-{YBWCPxh|- zj2%~&u9#V>bL_&a=QNiM)kB;zce@vEN4@lgSAYzy24`FQ@29jEYF*t1OX)>;BR=I5 zZDfimUru3m#PTQ-jmR|A;ei%ZzP|uC*ja7rIaNM(CEoEI9@)&5;A>jF-}C0=kWp!| z(`9?-7a8xl(Wptjpy_nk#Fa+wX`!cWSN>6zb1J$S#tcBy}1IPUXG}wK7GGY z#y&rFG*CD(Q;cF9M}64X|Jo43L{um6{p||?YqqmcX=kIrWTtPxYqjYlpBOl>Q%~g` z$6k>{(aBUoS{%I7We^^(B{@dOQ=1W$ST8ZL?&)vfvfbY|bB7c_(RSsrFc@F(7-(HI zh7KWcp}AuJOw-uba%}$!|AO(aKFEbjMDWtT zshsSdm4iQ*GU8Vmr6~J5#tPvq4D8h}+vNt&$sEKDOC%7J-;rXvHREnx3$vYbduMBWc%g?keLz z|Mso$lTazFAE`!1@3>oK;rw{)V;ttUXHI_W=g%f{fRvU#V zDPv>}I?}BZzUOBeJCrP^*~it6LF2i1n_vqp1EavHsiTw&euw5N$C=Jdso}xZgZDAg zJE;RUCw52r>^coi3g|7sKU&kV#@^$xE8LpD-C8@3HQi$aYIA%{XR3tg;?j2tl4SPX zJwD7pC=wLuo`8A&=G!0w}O+Cj4xxtoM~w49q5^eGoG$V?J}B6C}-}eb4zpZrI~J0kOcv8AYXE_ zV%!5xxqZq{5-M;tU04~>HL~!+-KLrrp;7#p*H@)h#rml21L=-sgG=5uRIGy+iEWL? zvgq#d+qlwJT=YG3IMpk_rs_J!wD;9-#^1)=)lC?5MJiE^;#^V5NL#;e@=DxL1bZ_X zxW`FXRd-1O7Zoc53afMdM^OCXl=&|PGVblBL>TouO-cdCEbhd9?VhNqMx%@7|ByR+>D?wGqa#y zvo(cV;xQKfA*%9@fMQUJQK4pLfc0D^8+o8}%Evp?^7lTxb5p zjC5{nAGbIO3sPm=;75B8a>i?C^7g6lRXO{rD?%(g=nBt-{ISekW>np(-Joo-qmY}$ z*ziOa6HBK1XoZ4nmv}(ARm+E@&WEpDIL*h>&Vh+rT~Ijh<4hC-C-?T)6<#|kEoe7C zi;w<9WyX`yIXAwUKl`CzbR2f{`Pedqu*zmOjd4kZSgSL)tmoV$@u|;0dc-7<&UAY5 zcw0PMWu=i#37hP|l>}D0z$lU6Zq+t!fAz@cIKaJxIDgP-F)XLv)tCfVewbzG?K>~Z6Et-0AK=`RVb@C*EwU6&^B67>~|8^ThbQ-Hn z!z|QPmC>Q)q?z+&ULC_cz}xyZm=lo431sAoOKnF<<+=ho^cm@&-L#;vb%!5-8|W3l znIe4?CzM+vdY9ZjEBSkRIfQZQ!Q94N(n-I? z)_KpyyTTbn7UqD8SQnlh7=X+Jpg=LqM1ZWpCB}Us$87eL;wnF1rS*|!>spQQ(Ss@v z&^C>o{kRF}vb1U32*51ZwruxPy75!8&sMY2kHADJ=(E)MOY4S3Q!bQc5}MGP^0R!& z3*oYJ&z&w6St%H;6V3zL@ooGFWb^E!6iFG+6#awYs>78N&qo%nc)-lQM*oN9%+4^L zY%p9B?kcc#UyXQTi?O8jvF0Sv7iBGj2s2#S_C3qZpYs<0ffU*{k~Pce%nC{cOd*L* zBmQQ!obeu|YGse|F}@nt2wv;&sQd^p{Jo}m6a~mg6AC8HEgKCV&EyyNpX8>NH8KeB zwfV!;bHl2NFLa(zPc@KlFDA|2O3HbMbriMA<%a+8B=KHOb4`$Ldif)faW=JZ)$aan z$o>m}<|2@rXT^*b&-N`{a=I*Uuu6GsZ-Qmn=raF`byaKPNkHuWI~C`|QWP zelAK=Nf5t?xKctCMUCev;g;hghAm83HWQSv2$%FI7^IAHyMFNkC>A!~k#zCqyhw{; zNEj*mMp(JhV{YQ5@-Z2ryv!+}b4~M|k&bWB)a=40zlL%C%L*aE=e`DUMk&1u8~$Wd zdJ@yOm>axI(w*adc<1uaDrAyu!von z)82GyKAJzRrnn1G|wX*ooow(mY^K`pmKRJ&r}#Mv(ob*aLgaGQ9r=wiSH zDJdT1myL_3eU=*9r!hK>#>WJbYI~F&+npwWs#5$)H=Ub2syS<_g{Z6mb`C;WFTZO! z7Un!^*nrqF)@_H4^s&Vt3{NORmLJ2_Z(qZrLGJ^F{5!|hZ{K_Nv1m;@bc6=ZR^cjD z@I=wdJA-r5d^C5@DAPHhw^|6~aDShKH05*bAQ&UeY#)-pc7tk1I@-Y(MPgx$f| zzRUANnf7gx=D6j0Seqi_q(%Lu0r18P;wPwUqw7?k^cvm{S&X^guJ-Pdes8$_9t9JX z2jeuTrDDZ+>|nkCGA_dnZ{J>tx)qwaHYQX|RVo+mNI;TA@to4jpt~ET$@1_yN0Jt* z%1n_3@2HUe=B%H&z4_H7&SA}24)Y*hM$6Jj7}(;|Za_*9{0158Rc`=ncj&XX@vKPb zCg6mQHUT>Z;WGP3HHC9Cak1FJg~MwKF97uUo@wV;p$@MJ#dXPVZLQY5T}p}Zqn`jr zK5#fr%hzwPjaD&!D*tdc>dJ19xyLqS%nAZQNp5~lp`nwqgjQQUC2@=4;l15DGh9V0 zei$j%%x;ON-lA#u__^JHd3U>Fy|P)87_+tW+ivoQ3k_)x1=&D|FKiH`sXWoM>UQ9{ zC-iQG&ti)=8pKO3gf)DwKCp>d9C;VWb%_(0&7zC&0$|#rW4~bo8RoX@hLoKR!0Z!R zTP=^*h)JBqOsH&6W_%uzwvy(&V_Ak~1 zF0N+G9dnY@N4t5)YE>tRF@iMwdv}fcKa8t>u_XmhlQ_mn(tNvPO@PdS+fHl?jjX{ixf**je#h zV29xftQH@(jAD48nWaV@lS<<;L#}pC90+E6C+y5+?+u>a9t`XD=yu(X*o`-7o-Mc* z@I1}h901pi=46oNLp93HsD@$u(ohC~A#TIGxj-gyG#`slxda%)SQaxJ`R_sQ`OO@b z=Y)qWRCy8K`Yf1-I+_cjyM@M}Jd4ES@?(AIos-|!#Hc~T0&At*qWF3L&8+MXkh6>^ zMWz{4p4i4KJp<7YI=e;b$sKN`&&PZBTBj`Q*s4VJ3i^2>7%qbxdp44H9l zx#`z8pssd>#dtN95eM0}1u}%0q6uFFD}RLpdmt0B&QxN@m{>9O>DDO zvk?9{@)LkCPY!++d%^^Y--aAf|mgtPmxVtBgSxFqppY+YB--DGh zK>!q`eZ8=4-v^ZmPlIZjIPvwX8*%6aH?0tq3}EN1tN6gLin;Y*`$fvVz+=H`5k+=2 zs9tdwZoX4%XtnjUIQQJS!MwBe%S`sRCrUOnpe9i-*BS@JWhKbq`SCU;|D?F%gLM|> zYP+OFFcSH=Eq7ttpyGl1^ZGFe8}mX9?-146QXms##Ar&(2cD!(qxnfKi^rNL;nAue zpj71=P1d0lyi$?z$e@8}<{+>*a0%Q|tx(4g;NX$hnW<9z+ z2f6!WnqiueYAa?6<|PJ?7A#3ZB5Y=u=V!Em+JTv~m39z$3}XlN zgF7}O2Rr=JeV6)dZNY>OGX2|Q)3=r&hZsT6A_=iSM|ZGlH>%|wU(o`X8?3vIW3GhC ziURSL;^W7e$=io#I*FO>Ua>aF-M@LbpvySB;!eH&~b}fxED9}rc7;|A*zRd`ZpUz7JJP`FC=55 zb5?DdR4iYe@s2DBf9&;>yt7U=D58DThW~t0S9ALfTpq=c+3Az68T+$Zsbb7rc;}e4 zrl#gr3xn6%-oR5?8@+y$;3G|d77*6 z+C9_Ppx=wup2Nf0?0^teKP5*mfxpIIWOwd(oNT9_2SKnJ#Cbe!KAKUD(Vf^r- zn=vMe{m!+|TK9@&`*BuVt1>q(d_c8PQkz!)zWN-!(=oJBBpr`YCS9G->X39=lKr>& zae1Xo6ZTK(+~igDIjxITKKludN7ffWN;S;m&1a=sUX1c4DE(2NM&~%as|2P;6 zatrnxLJD(&V4I?H{1LqQJE{zOJVD}y+4;^lM{s~)6{gN;P1Tmo&)KRJLpiPNiHO*NhjWF(xT%~IhXrdvYQSU~ZHeoG! z%X-zG!puo%OHP^1XJLq1>Ib;Nt?n&ExNNDcHENKdJI5a+7hS{Uj}h;j%HF60v}(Dm z5S|aKns!R!{wg<0#_}50eV!b@C|NQwsgBNsB<%E^GRt0c(rHPeXld7L?S^<|A{KWt&?VCTYI zCmVsaCx5j0v?y=?#!50$1RaGQhqQVTIM$y&H(Ao3+(|Y>AYPy2c?`C;qG!NhbzvIQ zCf*VOvhhKvd*NY!17?t7syu1t53`qe^8so~jD)FQ%35P*uml*Sk*2IvZ6N)%QGUd4 zX2`-o)71xP=RDPITFQ>$UE6WhUl{2xP%)F^zC?@@SXp_Zqssc|!MnC*VjW^fvR-tb z6^E0WzW};_eqgPcf^hlqDIRo~$eHD*0zDAeBsVms5>?8)WONLb+Su<3l=s0c+M(3j zn%m)}oA-2hQ|7qURAs!~)4$ZrtF%B~D#O;3N>5B#taP2#ZfH`gif1KTV(V5#~;33ddRSXnuNq*EF*(=a$)^Fr#kEv;fNw3D7a zb>cxayhrpFYhsS=GkvXnh<%PFqVSOFrWRCK z(q+J;<7$Xc?QCGRk`6CUMT*FZFpQAD_t7b@`dvM%|1CF#dT3jdaqn6c?-o=g@BvAm zYt^lNkb2ZB35`J~1mZfli;h#3DG$}`-!+z6VI0<+lhiDl)3%aU&3-o>n>w7#T28P) z)%1CPBvS3ILlaMOYB^qQQuywuv-}6Nw{2dixA~H3#yCU-a^bU_LKnuaK^h3+RZi-` zhFbd}zz9s{AmBOWL2>Nc@y@~O=N-cWx$y8Q4Xq5OYu0KO5&>Y-k`R)X^fBx6NagLB zmo?B0lS%9R9McZfw=w=GE6;c#9WrG-D-Ax>B3FyORhur^JU8HSdK+h+(q!%_o{CR0 z5&-RIC&dQpr9Ak{8MC4JotvKWi8hcYRSHccv;raKne`-^DkruCRkobo z%`Fl$i*~BVT+MsBx_#9mE{fPKTPu;ePIpautxPkCs8VY)==}pF()P+E9-cIE)7|$p z2pJm$;#b(9at;vsqA7vV-$Z{VGG|V=6!dw3IdD$ko0#V#s6;ev4^w31@C7gwF7qp{ zK7r&YoE${<#<4bc(OjXivR zHiOW&()nPwab@bgcL^%M{x}?S1khH_n$oBma!Swj^74EEAfqgxA8wpINj|iTWUflq z^qJa16Y)-}BALdf1}tOQD?5D~&5y0I`l4k$hINonaqmRt=)zV5y0@#K5evD5wb5~r zziW1Hl+6QI!HE9#-$X~pwdLvb)e-fR|G*Q>4TugQ3~qvlJ!Sfj{(KH{s2+x4Q_0-8 z2F2QIJ7|Zn65^qFeq>F_jly)5y2k#(T2uY=LpWUYI~&%GbKi25dliVVD36=#QX>;c zOwk;*wKB^*rWMt)SdawV2qV^$evk_y$=_2aB(?(Zg2t^|kz! zOjNLYqtFjKEeVcU+2&pY4Mms_u%x;)V|1i5DIDrQJQa)DnKWnB2Xls091nX<=Xjs7 z<>owQSI>cQJ1;54F>b6aswKaT#^`ISSC7oJF{QPZ=n0LDk3<&v6-_x($V;9Q~*mdk89c zD-8LlH%DWc1#IpJw;K5_r}2fRjqWl!x^g0w{#1pY6Mm3qEZo7d(zLIeAtQC#M0-aL z)ee%#JdECme>P~0E=Cxkncv}pEyMw)a}D9OH~smwlEMpuFe<*Eigu-qni_78POcc% zu9S})M%oFFRVjhED>be2jiU6k}D3K75rq*me2;HU6XeOvLd_p_mTToh}P>(5lkt zeweM&D0>yW^8b*3~ZY{K-zt{ zPuK$1|BwV>17_g~*_{o}wMDsc^0~eM;$8r>Kba<`-&8zXg!i(+SA-Sfw0)dyD0*rH zjrh{>1$>$j@rgQp(-ifAX3>1G%7^N9h;Q6^1KTy-KXG%VXyr$8=kH;u2qq3Im4 zER-SZpH*l>a2e+aA*Nt-Y>Sqe**0eGYG?ozt-Xus`V&c!DsG~DVk#eoOp)-r(_*<9ct$)hx;;x_9YKbfR~>%;d4Vs0 zf#s2$-bRukkN8O+d|l|!1NpPfQ;`(k)rIa=qcSnx5~Owc48Q*JwpJ7a_Sfg z5#UF(8(b1pp9>MshN*ESG>kK17wg9WGP**q`UhwojdX~(-7~Y5K_yKKo7UvYz3e3- zd-O)l=RLm+SD@3aDT!G-9I-J5Z`W@+jehT9@Uj4YKaI^QO(^VI<=805LM-YGLICo{ zpGc{VVpag=x8aR9BRTca)g6Kd_=n7+i1SSBJ+3Rr5o=b(Ysuz5XK0HJZz1K6dr6n@ zb5DDU1ytb<8^SV+)*0tG>ihy(x4g`B>L_UCLoFd`qiM|PsbY2T5aDD5_tvr};5myd z!Ie}$0mO7J6s|hf{Ah$F8$*@K_ zGMaC@w$xEfINo}kn~2=X*H={U12UbC{_Tl377U*QBieq#Ra^TZZ18}<*)-;TtBF^l z#S+_m%m#Sl1|1dXI);U#f@Qmz4|0-(#2by~Di3hS1e41)5wUQ$#kks? ztk)s(%z7!Fp+z=cY93?u7NxBLU{#a@u7NP9;lOkp4HCEKE1!h zk?W~@|8V=76A5>Sb^Erz0D`7CioOoony%sCOw~h3z4(@ll;bvjZ)}^hyZ{ijTJJJO z?Uc0aBG@NgW&Fgr^G$uVDdR;gYoL92+255$2X4r~d2*^IHpyu&jE1;50*7#1O!Vl$ zbM{(r@X7iIhRBo&ZocC!O~Q-I^fn$kZd2|d>aT7Xdgk3Jx?DnON9x&c}IP>X31SmPzXT$P>rr->v)?>2uB=^y6)9fB-M zmI@q_txW+pej}mKFm}I~iD}E2p3fS#(F+1G*i)Ar0%U?WaGvur_GVk0nl>UT1!NK5 zjD9@lWe~r0Bdk}@5ThUN*4aoG$OqX{jZPFTS|eBX1(u_KzT%F%(MD@Y_+8$O~`!9Y3webnGaa6h)GRq<& zU3t7k^d8PO(i?2c5+IH(@L^lL#OCeL&r2P_T{xx1#Hz~WR`jz$CRbZ}MRztsC%Ywk z$jwLUp;FDWz;oSVjdI?dnM;uU@vMEuj!;_v?s~IeuxJ@^g}(Fa=cr&LvBfWj=Jt6R zQ-^S+o4bG^PR|XdX|2dg@$*?2hI<;GO|)(nZz68PrnQ`5jXYYFaS4=4x2{R^Fm8aZ6&l|Ii^Y;8Pq&xgrFp$jY6wa+BklCsNE)ePhX}`IYkm z(D-U+vG#2+Ql2mGaiB6ez=OhkgPU6SRKUx~tTq+qBp5kTkP3D0>%v3?Vrbw}N&H)xg%p1+$fcM@+T*nt*p>M;kFtL|-K zqzn|bbQdA`6_8~DFPz_rWq0UQyVhX^oU^Lj*! z(j~J)AvY>QH0>8E7>36Qh5&HS@oNeHck4cmc4k@03dc(4@+1sgShYcp%nh5dBL3)) z?8UaOcF7H=NK4IoLW^(pE8fPX8Wm$tbX>zW{?UylSf{kXJ!17=M>>Qu-q=GsIa~rq zHpZKYO>tDjK{OyGZiL=lv-N=u>17CN+X<&3i>FIgPo-6Ept2+OMviPj7L}_J=|@#F z#efrZss<5h!#)&mNj8>Da8MHwx z!In|;&^Gq{H|CgP!=y)D)c?od^_7_oa1f`%VPHS!-7p)6uF~7c2 z`Rgw4%&M_~~A zt~6^UjYT1s3?eCJHpHx^Fo_pH0>>ceM+4ZsQEC{XV4GH#+{B?f2rq=jNxu zlZR`C>ngE8r7wOEy{G|An%;+f9Fp&p7_M4MX(jLvdCv+qwN7~w>*H9k)ksBTG3W{> z%52B}sgBnU5KyIKW#8Bi?mThYX|l`kfazhBs|%0B8fiUZU<|IBfQ$l5XzBms;O$R>U;bZ8+P?EXh?7rw#b?Z980@{d&2rm4 z)CtLOVBfH?{U&8%gB=|E9FspyWSYH}nDk2+zt4C&1x#oRkHJjw1om`BL};fcYWpSZ zz#pYlN6Y6w`;qrvdRzXdYx`ShkGf+!gA0|*IcHtR_Xa*InF}{J%MMEyaQ&tCJ>qkC zGi`CSz)t+NSfLz3<|(G*c(s#KDzp_T=bR&s(|!KNH>1^pS%;;=NCY~=L%>Xo`t$Da zxgn2Vw$3a{eZh9qoY_n3qjm2Xd%&t#tro({-rBC70g8Zv?*KuD=J0}OH9+*HFvxFx z>6<)xNPur9Y{||tu5z2Xg$-+3j|fE!T35@+@57hvXO3*hjm@8RFu4RehbrK?1|;7b z;~)v`-_jjP{QV-K8){J9^rxW27z*4qjUW+`*7j{i=P}ZrBd_?}aH1FFUHTs5oU=rH z)j;rF4p3OOu3)Fq0SY;zokMjsoBQ4)<|Y_LD(D|ti+yEoK3vQD27)l|LFN#OE;^hV zTDCa5{7^z3A$(Yjp|k#LZlJQTA>~vU?h9|$5e*}@ahnEo5zEZyN4aTye={I*lh3`{r+ne^aNW&yXr@lAm17AQt^*i7?!YMpFk z=a_6At=q>o)tPpYY;y@xhEJ^aqJyv5GA{`}zB|sJ_^M(g+m)`wgLCsGnPgNfb2A!qE0H!1sH24qOzRxx^dA1CcO=^ODnBPS1{ z;1MJSChSY-WIt7HfbJ>b>L5qeuBNb&+l>gf#0U&4#!tMUQj0Az&;SgWoqWi(-Fljw7GZsk6CywR#+*9d}cg%4X} zAuph%Ur7)xGnxo*3 z7vOAD+n~TRgSCtbedEZBcw}9vwoHN8ZxjM;t=pO=`!-SFpuU2vmp7g?3dCvX&W<(i z-`Rr7bN)>@6@8ce4Y34r&W<|b|5ZYd3Y!4j*XCX-wTo$>rC8(;?QXYA6k1{861}3z zOYx*}$~JE?_yS-tK)ShlYe)^7XD9mrbEFAa83`7Q-3(nJU}-d+4O>cD%xbWNmDX24 zKodr@c)jb{sz@z-EkWl5EOXs44@Yd93y6&L%1Fu8vrQ_`7ac^KhMv8d)o%5=tf^f6 zK`F+^m$=5`^EM6SDnTcP`tRM)jd05F1I}>1KyQ^FB9v4Tf06-~eVE@GW^}{!>(vc| zqRZiAlu?(9Im+DFg7Eabuz3z4#!4O#qYF*SV%2^L>XC?_^_RhTFZ5p8X$-$EStu|Hk9PRf{#G7Zq%gu5Yg!tDyQYj^Tg}C$8 zMUbTI4?k!Y9eqF(K9w|?kf6ORVR3f|T$dO(gq%&l1uq+~u%K+DgMoc&J*$N61|(?H z7;RS9EuT6Ir*1-y$16czu5>K;OZHv+iK#Nq*cemz@Vs^1u1*zM|1d0_%*%jHxoN)@FPr$PWg1tj)mS-yyx5*vWP-3bJEJ6r%E*Y8m^; z#I^JsWBARL0F1g~S6B^ziH%9mBTPN^T`^OKz5qPMu*tLjrrZ~nNdUu0vaAwe!Ybbe z#PWku+R=gWN$Qvw@ze1A1|TdXBe)#8ls|dlSMggMEr~NIzs(;6xE=?j3w?I&2SX9} zI3S++zvguZxAZL&*y{)a*VeGtHmJr>>e`!7PFZ?4mjjN|_8+0fXT0i!;=Zl!1c&P! zGx$v-0$4Y|uycOklC}@pLt`A;wq}gZCXE;KC%W84!Hf<3lC&Fg>duylO-Sa2$Wv)q zso|JhS{*sXjIvVJLJV<3-2l+g1^2Ti6rtFIX5}5yz2S33CUL|YlyeYQ!8o0pNiX4N zW4IJj>j2#JUnkQvwjTz>6zuL&6^h}j?J*;SDzCFdM*9Ps$=f5Q&WW^k8sfJ7+Rn-5 zOX)JD5DX=On6f`w@{1^-giA&<)ziA?~EDco2o6 zaehX_Qmj=OYwd{p?C_@SqS0@+*VxQ2C;UQ>V~ML*Q5ZMPIA4;Nbhc>P^Dd-pFQkc% zUx4R6oxj>}yj=CNrZUqq+Fti3cJ$YL7)1b~ee_rNVN9}*>zV3K7UVMG3A zV5ZlFN&SQLqk^rn$4&LQd$U0fZS+!6pnZZb6QFOLA<<;6GG7XjKT`ryPT|G8CBS|b zTK*~Ghb=V2GYM{b$&hNYC7rIa^DYCQgV#4kNM0vUB_mUL)_%x{k7agc=p3laT4g-V zL^08TdL;vPO>W1&Dh(sZ7U!C$Zj(afh!-jrWJcN}|AWUB(n@35w1X z5|iLPo#lGsMAvsY5d56CLMMGAqPU0ix*Lvx#MA9r<2zOfQ^#4vsP10&`>ltGc|r@8 z`fskfw-NyXy=rbQrd-2R@1dS1)?O>%&9{jR7O6K3&y&XmdMnj22?2)pWyNQVTUj2g zlJNxH(9LO$Eq53Mo6`l+Ls@vlE~#TP^AP7NZ0241rWGwmc53)8}fcdM2rA1~?JTGN;89$B8K>(AMcIDaPNoZ!rV@R;+VBRGtmREeWo)M)BP(CRW5%+vl ztaG;BG%GNb88lWJbhGA9f_eK!v?^ize0zv{&jD4Jc;ZLerV#r@!JuHcGMWN`y8(V0Bm)-NA8?2kG6Vrb`UJf3P1}NPowLwdP3G%8# z##$5%5WEu@fx346ezYiM>wx_IxV1T#{C92=A+GG5O?-|^I}SyHZ#Z+ z+Sueg8>o~-zaf}mlgN$VnMMpqCq*>Hma`je0S6Z`Un($>+gD0`C=g?KNJVMLsg&Pu#Xdm_-` z1+gVwDH#BKjfpm&l^SN-;PL_1!{QJPB9>?8Ms5+1qa~*Bld#(Jg0pF_@<|ISzK#oC zDR;&E8sX45cpM9wCE2AkIMfWn#hmGoAB5aTm4Rde)aZQE+?&Fy2$e!?qj%O4@XW^D z1f|9AzEbk`VKB~|qYHGkH|2Kz@u0JWfqRwxw8n4q8_3I)JMwWpWhl1X4x*e$Mu8lh zy32Ok2?ud^@wl@SZ^FNSI-thJ7hv#9+sl@4`>{(g+f&!fs_{dXt?De7XG^ub5QV5? zv+5=y-C8vopW$0dZ@lsc(V>z#Af7Y35|(f}+5ND#_o}N3ILS@R(TrsG3U~FX2vM`# zGv^TD&)&Yv!8bCIRNMBSGNjJvEd~0po(ebi40<=RRQB&0#MZZVEt-?6CT0nD?a5VX-Uz057bQ}bA=z@?Yv0ScKvwvI(e05M8l;Vd3jgm! zDz=cJbI|L$+;m!U%W}{Qz-8vha?Ny&`1xi70S$E1{Q`LIUJ2t}1i(w;2;u#%-#e1i z`E}ocqw&$`6T#T0F_9v`R}8S6p>3Nf39nNRUS_u_`y4Z8DgV>uv*=Xrw++pwZ-nzq z$}Hx+tzBf9LZ98_w=|ovP&s_w7yr_64b!mYRAh|An|k-7E7RZ<_ju*`1E&PQ#Wt zP6;wuw#v^B&Jm}rj|MCz`en0FJESFvTeA~LgLDh3_;+_XoK1K6#gRwVi`=zN>jr*Q zufI0~X=Z^>zKb#FmaS>P5YDQny zM#lyQr%~wAwFeyRcQOPq1WqnHV@jLeO6VfTLVteZq@;xVEG43ZL(h{-;Yz$R2qP3H z_x_y`pZ+ju{uIQ%9vquwl--B)3i~nt7xsHa{r-1!_;rife_%gsw~+t9ej8`h=ivXH zZxX|%X&1l360f8TIixH;q&nB=zMECkx>l3!mJ?01&^%10HBys~!QCQ;?oC}IqGGQV zA5wv5uGXr*tunpHJS@C86s>|>=_N1J5D!9TefZ+d-}HTqEb>Q^nxyGgufM~( ztAAE~0UR$pc3jz%OqBK0CaWkhB;(-Va3)8`gQc*qXb$~xcT(2xuBf|ZXKXU(&e%bH#QhuMXS)?C>d*~)Sq&QHWLKKmsG<}d}w6%Na+KW-Tg0}ie9QM4B>y&8@X zgYOl6s+dB&NTB%vu|J$iA&WdE1HTF;==E8wHX0TUww`UmYzJGX9O{EGn=~}^SzgP2 zQyBxph@zrDsVrs6^ya8iMkYJ^N_%@Ip+%#NFxu{o@ z5c^)=9P-wUb1KfRd7~_W7)B%a8*iZ^_lf!PhWLC zDcPO^@VPk^*5p4D*Z*d;_fflGm#P_H>;SqKhvO2Bf~U0#SRN{6f;54_l}11at~ zuiJ|=A(3+&iXKPldcIw{q1U@Sf4RDAM^A>b-tPql3;=w`xVgXhI@W(y0y()S#P{8m z?2=XF^c4!LyzN+xX=2wW$Qc{pnqr)Wb)j%d8vkXKp@OxfyOgV+?XK(UR(-ivR16!~ zjH4Yg>6Z{U)dS6!e<_oB#%-F+bUQzykU&$~tVU3D+SPqJON`}fV<}o_r4`ql=JiqQBAB)c>Z4iTP>v0+_G5~39e!- zrd^WbL1)1Bwlf8(d=&Z7`iKKmx7*72{Xnd6FoA5^XmInGBNno#u1iUfBCS9ic{hLx z{L99}bXGeEGxoFLVUUz00K@kB+aVGUS^LRvQj!AzlHk3|3~A>{zC5H_!b7Q12v3d(jA zY;D#iaBlwqzCUq^Fr%OuK8Z1U8*M-?EpQOB%8Qn(czQ0fXYi`Y0}GX_7B>F?t~M(R zS#!=4o6fNbNI_edmbLMTfGta*zokZ{D`K=U{6UBtH~5yw*;8TP)PZ47pBE7sY+%XV zzGEiZnNi`FSs^$&h!o)9pp{Npq4kAbOoCv&9KFhcRp^YO_lGaiHU`RUjFjKIlxs(h zVU$mXWsMWSF);$@b@h%gZ};59iM9oNLczQvGkq$F&VK3#B9ACloPEYIB{_vV-dUIm|5gYnP0EFBTT&P|8rgTZ~9#)DY7m>_9Q(@Bq#RxQtr*KjBcpaR8pe>jhg-Q?(b`mp-igR|2U5W0fa z#$|EwEV7r_{mchf7zpEn9Mn>|J>?qeo&tn#!A)!Vh^u8{gE79<@&@4U0aZzooD3;| zSu8%?vW^~EMb25kMIH~HCCv-&2yl+?Qspu_I!NMuv&rUO)=Xzavvxh=A-c?Sz8KUp zU0+Zr`?)GBYPwQIfqRSinb{9>>j7JJP5UrZr)FkcwG;tg=2d{PU)nKT8f;)3s|Q3L zdxBhAQ&Dr-0*JDg=s_cFSS^U5pOO)xd2tqHz1(t>*(cftvKzoBb|tEUOBsb%Sq5LD zac*J?G^xc(tqm1L;{O1cTM&*Y)LuQtX9Q}10*pHw2L_oZ0Ojc2M%ocF36-BM3R-NYsOBMhFW)53J7;{omB}Wcb zUMjxO&Dw<=ozzeeMoXv65Gx+*4KLs41r4Wt`%?pdBpo1d5WZ8vXi-j^l4({KCp-&k)U$rcq>>1Aj51k*BCb zYqL<_cY*kBG9A?lg1D5joq6y}k5~xDN-)_ATW!ljLa<}{^Af@b1P>w=g+Fub)&Ap} zN7@yON*f|eescKZ;t~F|*5N3i@{_nGC6GqqLS*hT#cXjbl^z&YUM3KIC|lVIVyh#J z?p(`vm`FA}+;+lv7H2)XYCbb`s<>0SEeILuCk7A>wjooWNz>+c6+VNjf*Q5=k8m{#1iarOH1<;d0P(qGf(SaR)Ve1KtzY)jV z0R};~5ZTv=y!H3K()@g`-*~*BUb7zbfUM@BG|R~?rH&{ie3ydNOb9$Vi9#(75(Fr( zET^$9oib8h7TL^fFm?muF_f}s67QO*=GHNA7m5srj{T+blDr0Ca44-IK>=5+L=0nN z%zK5O7=^UGBUg%J5=2^;_^8Ip4Y)R_DTZ1c!D?YMWwA;!R&z1jt)bitdg&3tq~(L} z2ylzz>c+jMQ_!j5cqXtOXuZ{$mf#YldV^yHp4a=7WppV0*vzJG-CJBs%Ycf}@AKSM z5mZ(Trhb0Y74=Zz83lEsJ~{YE7)(&VHg3;#w%~lzlniI zx06}to^jMSwgO%=Ky(X!^(n<-$(p|llxrYTvCJ?op$AwZK^gax{fT<9ZZyQVkY@2t zBQ6_eh&%&AF)J)Pr4U@o#y=BToGcv&Gj`Y70Ssoc=jK=_DWNrF3Qi^la~&`QqhH)@ zti=U+n4-zlqiHu!;#sCG0)KFoyz*~`p*MXe#Q>s3O%?3KwTj=83N(Y2)Ua3sRF(CL zNpJz&&u*=qN&zB$*}0#8&vB?_OSy0L0mB2L7tUq;tyyrULzAg4$Wp_tQNj>e&DQa*cX2hFQDRMhwdV+gfRdQ zJ@q?B3fsxU{Kp35Zxp_MAu4QxLsfrs?bHQ&{86IEs>(9D#oa7Wgog!B?K4K4@;pZc zD}M{YPl&9!3_`#j`$r)KgO>8!wak3dtbgoH?67|?sWYO|+J+T1Zy4RGAwAEB^oo&r@s{!twDHV-F;>H(dV!w*a{T8^w#V$&moMTV`3TuPRW%QjShTxlvWV z^$;wty~5hS#vj~B)vL|I79MvP$UVQrFIhVxRst~tgB-rH@MiM#VY{9g9>$4AQTmwi zjnmAj)?Royj@s6CI+ftM)He4W5~*gmjPO%~!68tGKeCu?^7UTTj|7fDbLy! zapdE${LUI!0vYo;5xHA0`iRLk){{I&V!Kgp;_4xiG9Em`f_poAdu0iAm+KV;S1XOP zF}0th3i@d;SKf!(HF6uV=d4QKJ%afV4807n2LolV6;Y+5vvB4Cz^An2J2F7aXD8** z^z+QP{JBDim_2@zbQe}U~1smkXORW^;>)Vg=$%tcFYC$u4D03{>;wl<13}6*>GWm+J0?~!UAvI)jv-w~S zPM1emgpiOv59EWGG+GzFuzW)W3=X~ef>1_it^0iDC91YlTKqE-tB19-k%4KPM6kg4 zn||h&(uKvvaxVGtE|olk9SSckBPZJ7qiN4JQ(r1%-qx*>S=&v!QF}hq1JF0iq(Qkl z9`pNxSOrJCVDDv-#Go3jH&XW?R^>HqppEX$6U4RP|Ivclx={{SZL zLjD7fmZf80St}DKH9>ehkW7v1IA-S-e2tLPaN#QAN}h52#t=1Lt38lbj8lB|6tzN( zEBmjWaDNdjy8&ya9^%_qy2(SYFLnYd~p))K<>V^3el(jCOD$Q-^0)np#1yKR5ARbDSAVsjB=b%T+L{K`}|X?Q+22opLT zGUfzbcwj1rk^Rfdmf#CNxpcH}x{CtB_Hy#eEkj_(%)b$C!T!X#kb^hF1eaGV7Zp+^3>_Zvm#rIa;4NUKh8U+Cm`YpEDNe=w}=3_K;m z0;XC(YPK0yGKV0=Em|QlK#P-a`>9U0ok2nppGOk>ExOC9&@29Bz;rnlJIjZbpNOY~ zB#bW2UOB<@Gh){?T2}TI@$`X&72ay!x8ASB6R}wLsvmUyTy`j|Q5SgTjpFXm!-+=$INoUUN0l*4X&>62cHN!1xTFxN`aD`fpG05 zCoz+74Lc#l3tTqxunZ>LbspT>`A_Nsg1O7j?f@;bz)_iYFmcRe21>qW!JY|$N}>@4 zUyd#ttp5N;X<%5CXJZ_pPk#`>yf?a(R5RB4--z!6wtiQE_l|PQq57Nq%9GVvh+34; zTa_ZN>ai1dEXF>N3E|E7@;}^5GlkQ!{-Y=sEsZLmZ;?n8IOK;~SQVu&;fFB_CMc&~ z3i?#U(;bEBTznqz(;^Em5g`ka{W+XMT-hlpC zm!dLTu-eNGabFMxEX^&83zwBTuMiKp3sRSEf0Rxe6$*OBO=49PyWCcI6s@N2yM-zg z3ZUhJ)o(RQV|+tOgJ1@e3mUEk;ldcqVK$bssvwPFEy8OSQbd|pW!nP0W>iqrrt^D& zq+qWmHhi!P3jusqWkVTHXO+q*sS4`)ajDh`QM5w4&V8aJ-PUhVqO95PC?$oNefYPpL0^yxYRRE^U}_>;ErB) z*HBNA4GP;^_}9D;SEa~f70LLb6bicvC?Yc{&(&uPml8$G**Ft=)Jd&z2*|3xH2tQfGos9=+6qE zUS3-BK9ogq7aO4$4cuiD0g&#aROZXo2Q)T{t8e2q4x5sJ$#|*&-fwcFfu=2CZh$9b zcW}WtbAK89M#Z5R$CSQdn&tEOfO@Gr5ZBcU&rR}2D+RFK-X-~?i|#z;ba8MhXd6c` zl9mib__IVu2)GXDbzkl#EVV2O@Dn2I%xc=ir2y$)XdnPMRHH`AD-;X}P4eUKELL2y z^z)A~p$9`_Y^X?Lz@TmntSsZN9y~%yq;~?P5MPP53-1*+Edbw?p>TH<(MhIweqqcU z?cblIxrr7U3xH5YA@+hO%I3|R&%9){T#xk|=qnK*kZ2bQ&Q#i;Ep^NsTn%=_Lg_3W zK^?|M?mkpCyc$n(S$o)E)B4ZaZUqI>hue(AYNobPRv(UGIf-|+z8?9FJ5ptC%s&x9 zHC3VEkm?HVMw6aCkg6yX1!AR&(5|lR6fx?a&)dP2b&)qzzS3oD0uos zRUt6IdfZc+(Qs&Gd~q90M0*L4fNt*y%_kk)E4&zLD#YKD5~s@>4X*z5t%6&Re#(k1$(;MOE$cQhNaF2M#PuYs8VHeoWrd6QrmJ42|$!A6CP*^t1N0|XKFh=M+&L8eoPaK-AW%eM6eSc8Gil!T7_EovR_la0)iME%Rw(luEK;_LVmkfs;Ur z({mk0OyJI?VkpY+b#aO?20Rgl!F5OGAySj6l(Nu8U$Ej^7Iv&uMeSjc>~$D|-0mhO zp@k!oyq~z+O=y2_%m8)~UGv}d3B)wET{6jvbkIHEf@qXEbfXX&DAK{iy-M_PpS*4W zSA&Se%Y)yTg6IXgJ^AqkPQ-%SxaB3gmS%@QI6t{n)ZlIH?FkNnc)aYyVmn$ZmB3*T z&A$=IK~;@ou@x&Nf0WA<>DiRs(=Oo!A~IY z!cFd2(|@0M_dLJql*^5@gh;MqEwc7Hm;uUcnSl~q4HazOX&5RN(rD;AAjFZBV)@)z zZ8=Sn;QT6?`IyAp7kG=S6G&5VXT7X93*cHW8sM1$pi;V|0Ufy+NfcW4oc^RkgqtrW zU=}2y*@N{Qi&yxLlmMmX1w{huLs^ej0WCM{ei$Q zai~`{3TSLNCJ?z-j771W>@+#WTGeByP zBtpiH&};8IIjY4133Fqc?pA7Dh0|Zdb14WntlRb>s-n{wg1ZgizI&MJb(AB#%EheX zqu22e0>QlSpUgf;VO>NmUES2w9*!a_cE4sI0024WETj|#Z{Ab64;SOVj^&q#sDteR z0yQa%(hNa-+5AB%Tv?;$88A0_7FMiGu~5l%sl>Q9pf3?>g1DjAn5=}qYh$VbD{aeY z_}l=g?7+k^0GmbwI>Sdq6R}>_4UMEYNa)@Y+M<T-qM;$fBNi9tfpc@i68!a>WinTlz~`qpnXRw?kEL9Y1k*1FUA4)C~*4 zX*Do}WqfsC%xRZqo^pO6OS@BDd6&6ex`vobL;Hr^SGwSwNItO`Gt>>ijYKv@1b0(- z8&dOeY-@AWRKp--sM17QM0u*XS){PB@3yR$idH9u& z@HYb3j6U(4BaU|wrwK`6TG5x;Le2Q9KX*PO(k-HbYc$GItD;;9DEbpmXdaA?02G~K z;e(>N8lnM49Ujp>0IR&qa#x}K&oc6xT5t6LjRKC+{wf1WS~{nPOTiu;%Geb0oWF=- zs^agURBmv2srtulKrr!e`k!5im;kl1*@J!Dpvl?D^3(|I%(AmVP1e#3*7h?klMR<<4RgN+90Zs%gcKgRE)~=0Xwg(hwa&elknP{tU zH!N*I+TfQG)X@I`RB=Qv-3K+Qkc005g4L(&gTexf?on2Q9@6Wg&~6ne#gDw9t*x$) zn2M`rnmp7nw5oDv@ATXN29(O)tIt0W?iOlVjTiIhh-oN_riH`IP$(tQmCieh0jteH zPr2*cW!=Th~Vrnz_<;husb+N>^itH;4yoE2F^^u(Bqq$*|fl3U+Q2Mt9{cl zGQA2@a`!+s+(Vok9){xEa-;ySyfRA(gyF~TQ4v9m{pV9akvgaIxrhU?&a#`uAmX(u zRn)6%170<)_Z3vyA@(M@vpeDfo3to0*bmC%LW5;E_nf&a8&3l)InJr-Og8VSb!{{R z6j9qA-twA)1W=Wr(W!V;qs5us$GX=m-wYk?fCMnLcNni`jEN|yvHSAmbI5-4=0kvH$mED0!FfVP98?A%qUIRFo&87g}= zNwt`vJ(isU$z-aKDWxdvP8?-9L#!mj+8 zxW%CNl=UB;l&A~#B8O-yuf$jfZ~%Ubo=kc`?`W{#5;l0GR%^S3gaJzVV-*ni08o3d z*5FHB8!OX_+%9Yp@aD?L7-|j5X!;yNN_=HE3La3fgZDbHevG&l(Mmn=Pm&Bu_mb~( zaUEtAttVuBEE6pdvDC!mmn%|aBibch;hUAh+m@1Y)@4GOJwVI`P`eyd21d083K%H4 zrJ!AV$LIzAUoqg)L+AehVEcluuP01qtkS5jElP216a7B&x>aNWj@X9*z{Q?gSI}aS zoLpXQSK2UW=rnvO2q|+`{&i8qT~M-HfW<%yz2G4-hyFxIi`9l38 ztIAtl#V)5P4pou!7RrF6Gv7Tz=v8>*vpJRuwkjLtUVWx`sl4dE*VG7)Ekhi09-FEY zY~9$hqX<&10ewA7>zp)k)iTH1RNs>^zll~u>=n=R4*sK5@IV)sxL!sR$g#v8>y1OK zo96Y$7X_1wWxB$s+JynJYS2Qv5C!PG=(nj_)i_GOls?hp6|^)q>fP=%_RuJ*`1)!* zpz)&oSMP98f>0c%k^#(&W3CX{*)64g>S`V}MjkQa>)5wvFu;!QC zbH8W}YvlmP&oL4vF5J8cmiYa_`6=K6O;_Fq{{S~GPwYX?@11cOwjxw@?G9S)Nj~zi zq!YhlrSM2lz2d>*>J^|3x%F5ey#k|}V@7l_HP=DyN0@*VbUnV}ifAk>xW4<&-g#hE&8`5PTgTJU}N)0A+0WzcQ0l zpOC=-9*S-Xpw$7v{Ko5TV5iHebWN~F;h6ZHuB?1Yb-5GmdHl>n#G@wbG;{4V7Og^b zHJd4ggt)R`QBZcow8d{$xy@;v{KuM+G{%%EZ|p)!Bm-uzE93VrV__Ee?-7BUJb=g{ zS@T$zFcRu=d3e+)HkVhUziq`zh_R9G?jsjj%ko7Pyw2ME_2LaI>`ns5v~3RNX{wp4 z+TxQxFg82Z3zfSHab-e=BH*Atd5$g6!A%j_OIX~nG8wzOg)6?p64IS>j22Um78X^2I3Ui~Ey6xKqk-!Xla?62Z8&=pA=HayjD zp*5=F!f{*~ec}{X#aew@fC#4;kC$t@FD}K(C>@rVt+cia&B|qO z-4aqSVPgjzXNG)`LOO=Y;t4=SV4oz*P=c+Ul}xSd%LmXiEzsD^sX)4g*B8V{+fG97 zFzX6vtPvLoI5iWy;lnck06-u5OgzqsOe8pJ~z<7D~s2Wwm0Ywxxmx2UuDXVh9 za(ADeBB6Q<16Q0r@r1Uaauw&fX5gs1u4{;atSHm_1lZU#7Wr<^8JV=OtaoCox-myn zI5w;ohfF_+I95hl<@K3a1@YoJfn;1hNA)cl60)xR!h>^EOI4^G5e85^!ipcX0MM^^ z(*$2cKn1P56N5i!rj*1A>M56T-pq9XWmR7$BXgU{2z{b~?q&stbt0AoRx*AXiwG*+ zr60uJNZpVRVCT#V=x|;8j=iFxMj95w$NHcGP%;Q(=?2Yfwth&CQJNLMn2yLT3i5M) zYu;PdF+h23gQ}-R`j-f;sz*?`aq)zhrJNWw5~@vFQF79hnnnD$jF7r2`!%m=f7+o# z`-_&MfT;QEZd)kHfqMsr3kt@|f*UoAg^`hnXq{8xHBWU7iLUhcBN{6jrq9|KAPD6G zh&s?&oSKc^FJ(a7?`=gDUL4aK9En6PdhrHr7j-MJOQx<01*@?*nFM9J#2`&oQ&i_P z{{VQDVy3AXuLbCeNEA?A*~ zh6E4hCN#^%(5UPUmy|18i%P0BxFXIegYr9uT3p7m5r`D0vo6~QuuCaJ$@_u5bh8cQK42P%s|%NK};3*5rgzR}!8rT2{j&iH0)YiDnE$kSHp<#kbS|fl+tE1waVXgm6l$$C75~U&R!$ej`w7 zpwAqq$piy8il_sUoJ?h61BPOSt(Qk}0xb)_5rQt#F|rEn39E%1Dvbxerx&f5uhdu( za5cB-9fwi7_>T%d5U|NpXruIq2;Q2+0iYeL`i?5{+*3dks0KmL0utZ0DJ{CKR1YeBB5hzkv9CyIvk_&ozeG-z?OHrhN|GdV+2A0Q;_nk0ALE0qQaHi!5h_4@tJ!-c&??uXvxNAy$e+E%C;z8 zdV$?5CdMQ!@l#KT$x9e5GPOr-IFu@vT4=nccZ})_9x7E=0f!zj zFKgZ~@ISayBuFTl(0Rmb4I!goc5>u^$P$cRWpurBGn&i`tV@lwW-Y*7;`^1>`XyVT z;nZzZClzsBDk;jZbbxi70Msw6W;4!LL z4KCnl);vqgU8)7EIRFQ0-hH5<%akuEO*Q0EE)AX=xo<|+8MjklkYiJ9btt-Ks~PKb8mQ{Bz#3|E6S=jDz%Nu${&V1Xn`{V*pj!Lz&2L-E~O=cO)<}IwCW)! z;aHG!q8wS8x{3p%L&FBRTGu}FbdjzP5Cv-B&^{o1(^lA?VKy8Ch3J9E5T-3uFJT9B ztdK`DS142=oJ6g_%pC`7rce-aZTVqn=CBZ68}da2G_^M>rPVZFktR)1x<0cJ%Goau za)bn@2+L4WgH%AVr#7L6I>x((wjYUPxI0H6-lCd*DhXB-5f>BE_=->`4a5-LSPS`{ zYEh(pp`#F8nyT|rs1(t%ygb3Hc|nn-)k+s`D>1QH21qYjaZM}cUKXhfsbM05;htXQ zEdVQDJKFa#D=3Eb*oGLc*h!O7s?6Y()Kbbm{6ejfZ!P{}6w>O`5Tr#^&>O0aEUvaN zOat9+CBZMfnS4aZ5MLL>S-4C9Yweh*TwH*I@6-cHS^K~)nqG!g(i=5?39cz0ymO%z zU`MeH@u$o+d7HLqnDGz=HZ!vxw2||j?))PxMzSg(00Uus!SEgHE4WHia<$!y%pomF zU7?!11p(wbU{{Ej09w;_Zcw({u)2b%w@3(u6S+#F4hwsbA+tTPxN5r?8==G*KpYcr z1{Grr#>Sl_&t5#mUr!S0Ryvtd!`c8CJ>myanF~_*zj*GIX;)BUk*t!~jwmpCGr=jF z%KC=EwksHgU>3+DV(xKPznKalkX5pTyj+z zLV##!3CI_DB@li(iBKLyxGFA1*Yg`U*8}x1p_hi@Y=;cp`GVqE3lVHY2&XFn3ST59 zQYpe$p#V~Ab#PNH8w%<*t#nl&scA`Jj;7vv=8ysa9@2{7)Trs{x*Ry_5ggbH!vGBx zY<$89BANk6(nbgAwT=ySIH52}a0`1_fk@{}N>*=o8o6ZdX!d|c!e=RW)OPln7S1OK zX_ue0{E=JAZ8nhJV3S{uN9{cWX|vue5#k0X=>T&s1tSNDO2!-->Kgk@s^DM_d4>ZN zFlr&f8BkvmQPkWZ;HcL%)B(7>qf!euM)3iv;sfh|rK0&j7>M5hk_g?9MM4px^mvr! K0>SR?fB)Hzy9Is# diff --git a/upms/upms-biz/src/main/resources/static/images/SliderVerify/SliderVerify-3.jpg b/upms/upms-biz/src/main/resources/static/images/SliderVerify/SliderVerify-3.jpg deleted file mode 100644 index 717e3b786298998cd3eff83b73ac87051cd2e1c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35581 zcmb5VWl&r}(=fWY26uP2T_nNX7kBr?6WoHkyX@lb?hwHiU)%{vaDpaS0tCqAdEWQC zx4xgZ&&-*w?yjDho|;qLJ#+r8|Jwn4Qw(s100640TmVb}0Dul4LP7x`yTR7hz5 zZ4F;=>i@+pUvQ59l|g>NiIM+5dFMFP|H{88{4c1yy#J%;|FjqYKsp8h^@Sn;0tz5y z{11-wq9HaD13>mdAAG5R(*KnK3J4&T{*U&5{{R5w(*My;@zO2I|Khg)QU3z6dh)8O zFRiw-owu($gQ|iU14!`ozb^oJ046#*209uh1_lNe7A7_>$tzqO99&8wVtf)>DtbCv zDjFIF7Cv?cCLU%Q8jjbTJOV%=At8EpQOP$T2|hs~(0`O5VPRq6;^0!edPMLvjtEQpDGi#DbJCqjEmCC3@^Q}ps~oaOa+=g_;Gy( zsxXHlV}_4#N49PkYg66=-dhWtVQZD&Ol2(L-gt@A>I{v6CK(2tdg;oADoKZJE|aH} zK+O#>gKLzY*jZ#fQ{re}r(315pI+05V^cNM26Whl&~&GUC3Q!T-T`c$WpWz9Ahxb{ z)3{h%aY@o(HPa9RX^HX>Iw@b$o9y6MTHawO?2GI7-s8Q=uL_;cn4FyAa|_Nk<#&z9 zdUAfLy^~r~KYCsicIvvUzUD}IGjIJ`DX3fK*SZ=fdUvZUNsv#QkT6=c>BIK2dhtHi zWLXiuEa>nXR-lY0#cQPSD0aESi*l87!jyujrB_vw9}Rg|EH8L%RKL!fIy3HO8TfK3 zFLZs@IScf;X{Xux8vXGfAb-^t=xPbw^>4~qla=WAYSbTJU_F%_jTdT&pE{X5VU=s7 zvSu2}sT)NOI+ke_$M_1j7#y7*%YKL1p6ev@N0d+=YCSDSaxIm1XgbkAcAB_)%Vd|N zp!#*o$1L&Yl1wPPEP&)2x*QWp!fwxQ0oAi)^67fPcw0(P|6X7Ixf>&u05&dZ`=9ve z+4;OW#d$xA#8iSa&@Gx-%ksfQuxZ;^Jfkb`q#@B0OW90sDu02NbkxF^!f{`Jf7(?J zQDK*yuAwb>#MiAWt(;0UNIqz%Ga(^zL73*9WE+LO5VgNzi%xOcQt;Pg*B_@V-^{L; zsz@QMlos3i?cr51iV^eMMe;Qok;i*0U&b~i6C@Jwt+hzxzgUf?-?CgDN$TGxNU~4A z4zBJX?eZ_a*yTkN>nwnYBH^X##*K+CF4 z{pCyjYVKDY_l5!OZPvM%vZiyeMjihHlTfe{<>n%*N_Z~MzYN#q8F`Q~Bw%ELK+B=QVG)Q%@ zU`(WdXoz^mQO?d+QdyK@_h-8wUDWW&M&0`M`jO3DaHx}^8BKZ8kqDw(kxz1@ z3b5JKQUl)9av4^Vc&lGlbR>Kb%BR}Zk{We)Bs-|ea<-1Kw4MMHfAvbGRu=nQK6dok z*;Fa#64hN(jr3T2*8CRpu#GAff!lnP>H50(+|e?LUKrYUU>wxF~&a<3BDUmDUR?0qT6_`R!A(_e1Y@Q)n1uUOrFMm*JEU?HKFV9r+ksUKi^1*Cvn(L&f&&OxQvA2WsTOvyIhgzuiO(iG`z-vQMF{QsnRE_(=uI$Lk zc(UsO1(gz&`q%UsafzySS8jwYk69OH;QbAnKtl_J6h&D*BM?zce` z)e8ul2P&*FIBef#xO|16PStxN;2)qdc)FVCN6}HOC5q%wc?`FpsjK8?lBRNQ;0R+6 zk>VF&J&+=}HHEZp#bMeQJvTJ^gFnyZ@rvzXUD)pa()g?t<>#z|4)Kh-X@e`@Qx*jdp&((r2iPm4 zxL7u7ua{DXBfBtq<%XN<{7N`BkfW`j^Y83PC!T1w5%->ePWN-Y>x9wj5fu2t-SVv@BQe77k6zW3H+9hc`Pi$oF*IoM|i3eVf^?IjPS^LmsSMiuotSn*V z)Z<)2XL?One*4D06McbIY?)W6ZMB$wO%d{Dk;bKaH8c9jS`S0AcWUcX$V$;($aG5`f5wXv7T!HWb##`)~43 zl=+vrO88vvL+)E~ZnYg~Ou0uB*;vK$zw+@D6-;8R#f9(}-qQ3t(Z07cA9F>8oa|?| z!P<~N>xnfxV2}mga^U1Q@AXmkjCZ|GUr9W{uPJM<-D;i6Gg9i%HtLw+p1H4K+-}r4 zV$p4HWq7O0BCHwSO~V%HCB~aq%8&E&S5L{C*Jx|l$x-na+bxc+YS%n-Qm}x~)!cv< z+3rW^*K&#Dz;z4n#+fp8LLYep(fOer96;G}Wx{(Qr@UA3rx-|ziWGABl6fPF28mJ1 zYG1H4T_L(!O0mA%u?iNq7GA8wW35n9EJ zCy!Qd-H@N^ESt(dr_BZ-PM5Qw2VG|zk$3^9P+21hq+Jiek_xLIQa_04F?v|2`v5P*rb!&zx(YWw@nYs0-NRnr?hB(EauVsnS zs(LeDRvQDeg0Lj|rTV+JF>aDIv>54na|4@ZvUc}~O<9Lp>WoLL%WxUrnh$-xPviY^ z1AK3Z%l*#$`gT*dW28*PVXXYO!$|ou8cnC;$S0L+U-Dfq!HTa!*?(whr_}#YQxH0L@qd-nZ_?vY`#xf+znI(;^0yRnK~C>s{fD&2!~R2(vp)de z6USeV@GIHaMVrCj96jto-c!ugeYdl_GxLxo-3`~ z0e^eTOrUj(4GCWN_$K(7p>_7GutA+$SrVN7mca@a6daEgkx;;2lUyP&<~G-tZsSS1 z998M+NxDQ~$hue-;b5DGGp12IR1v&o)GasLmV%0tri8kVjxptXE{sDpM^(qF!p_9G z5gtCSM?j%J^i=X=Eu93Zj+G19SKdUh5@~PgC^OxV*$~>MgpN8mTsj*?2bzT5JSGm7 zkXXG2U=p6LJHry<83+tuwZu4R;xkOhSi__DNJbHIji>0?nY`+xfH%e-Od}CU<{dE+ zzY7Wrn0k{(s8^E2jz$bFNmgsPW9_6fs-t`08Vym6!!kwX)Q(QEHz|lRt&lzSA-2@Ddp83hsL}yTohl~7QfEYiL5RP zqa~(V%W;8wrISP%dx{9`s}FE4zdf)BeDcPcYYqVmrcJfS?q2I?W&T zUF~T%wy%h67;Ijd6v+_QBeDdRW>E(PANcu;-K75kutnvEkA4qtPK$OmnBB*X=5{re zD9D{FV>AiJx|wo8-h0qAtno;>{Bn~fj2Gt^!&_5{2zBc~Wdt#jV|!Z8GbT5 z!Mgryt}$~090C8nVy?Wz#QJ^0rH=~)=!A1ood#^e-eaJQEqhVm)yk7%hjpW2Agc&y zeuiuyl0Wh@WW9iLf4cd!`Ba>zn34G(z>>)bdV4B?z}j`3mlqU7VnJW^Bji3bPO%d0 z_}Rc~G4V4ZMM_cA@`JE$IcvC5$ON&#y=ZXH1SWngle@TM7RIerA*n6e-D-_?EN?)R zIUg!IBoK;D;gK|VL?`=ni3x??V1j=Lps84~At>~>qmV})*37vYsKSctTn(KcqnkI+ z@~5*H8tIWV!f4QlDbS)X^Q=dQ2#uWdWlfcv1LDyIJlMcrkU}3vXHhh&!31;DUSdC< zqQ@8n=0wMsPOt{hd*1XA1GNU}#Vc?q@WG)8HYV$oDyUDPE1N6Qc!%B97Bxmi2G%yQ zZ0tE<$!t#GQ>Nf(%rW22g%wx@TMSa|y# z=juv}CsH)PGd^9WMh7?|J z(;Vu!`@Nct4HwRY4;<)_hU4a+PBH*S(4aB0N7|)`;P~sxwLR+*u#!pId{CMup5$?> ztaXZ4cpwhiF!iA->{nBznMmwU_VoMryxQ);j=SbA2%sfX`}l&gofEI9@+4{`MaCiD zlGxnTI?q99ISM+MNgu9%JmS$gkOPNOK4RUqiwUsRDQKGc>t_4tn!9ZY@&! zvCJB&30+iA>QJO)l|T0{^(pByFNDFvF1R`_v?bMcAhBQ!^)hj;Xecq(=GvI0|72pw z?#<#-fwavoaf#YTQ;4_NKS1X9yDQtYRFH85=`4~qQ(ziphhS7Ef{pwNQ{cJ8q#`q<$10Ai=4WG6}u%h6b`|&OA{s1W)5bB_)F59qF3KbYj+L z$Kvw*Bu6{8Oh-*e0Kr{;idEZ{DDL)DO9pKaGe>t>4o5w^s^$FD1|2R=pB!$AEYsBv9G)_*d`WN3DFuL?K>@XM4wC-=Ta>~ zUqd;AK;FiLM~&QZ8=pm>N3>+$99%yyYFFhaMh3*-Y4!)5}g zFS4+;x>~}jLM`TZ<7knYL#oEdQPbzWpObVz>6I&eYpbhldOm>=mk-X$ zbPGH?8(-|gjZ?qZmUyO>#-vJWJM?3#5rD}Osow3iskl0rQ5YcZ&({_HDEUVcwtq^j z*oxF>tQoK!6jeK!)-RvKt8b`xG4p_z+WZ69Wg!!VG6cszCdTcAZWP@8y&()Hd+w%B zzjR~?W3RcZU@Kgu&T%HUa6oj;FkDhZ&^&)XVCaf$z(i_@7fJej5$W52|1Q>`Rvj5r zZ6;6AGi!Bz#a9=eZkw2%U;ED(lcnNin|$)xRqKS z`Y|pHyzha9Un5IW z1|2%m3|@3Infy&W06ttc{00&k0cz1FLo@@^uF)JWZgW(=7!f@w;?fzlR({aZWc+WW zFK@>8`1{QW}MH1s{-M~lX-uW6VY z;w4sgaC~LE69K=(ui28885L!?PmU80;Oym&Y8-E&K(WC#su-!((w^%<{J!c(^R8Ui zK-J6~`66PKD5D>Zwc1wut1C`YrIl7);+Gn;O#@3blh2p>OH8Y`>WOX0!IAquvAl+k zI!UHj<(-dt)H@G*3ye1pad>eS$>Z%pYm`PZk%45N&S1d-Ix z6RZgcu@F|tsKbY#gtfyd`1q*9{UALpssjL%8(}GiwaPw*eOOEyj0RsG#C1U6AS3ZK znFJb8HP6-2m2P*^B?gN*-s<63G4oD%)l(1M;3`Z2%N`1KLAkmp!tbP03^X9Fda|o* zIrdcWJFNs*EwW3=xQI4IMA*kH1xr7V@TmCB7&zs?`XXNML-;dW~(u` z&Cfl1*w6MvHh_OWCY<-l`FNGpjh{4NWLqPP#=qMm_! z7`@gGShwP7^MMegRnRN*=q7wbw}$$GcEbf-uph=41RW3fd))!*1e&MM{U$1D z*uoxpOS}t#1PH<#!>AeQ`bzA6%sn^`f?9Htp;A1x2M%>1!sz0}+?wMZb&`fgxryD# zl}DwW+SAmYg!AB42fp?$GL%t5Cjt(fUum|Pmc54`?ZIy2+f`Sj>smQ&u!fvJ1i2gq z`%RO1eO^5b;&q9~6bVO|kVHvLiUpOPxN(nvfFz2J1Yf<=1uGOv+E5Cu+JUfR*e~T8 z+JW=~N;8u`m!N705X?0B$MxrMz}54;ckc+wU{U!?Bu&tSsf=q zQCA#H9!kEpTL@_^iPdNA%bs~vIph$Hvtjme=FIkCCp!a34gcGQG-t;BCjXpU z8xPe|Tp|ce3R~WFaWr#m_8l@0+GXZAc_TaoK7oph#adcmqy&ADAp9+q?<4{GI9K0C z@P=V~c#6^akW8v;d6g=FmE>)lw_8xU5&%^da*n1ztbQ7s&kd}ClxlpY%0hD|_0NAy zG-mS5sWK;-*&>q}NS&0B<~8i7Mg`xbj;Y1eq*jGgTGA4Dy3V!NlJ5#|Yiu_8YgQ9Y znH;#5o?b5Wk=pt+h6;70`Rsf0+S?b9N_MpS9R}OIO3(oUg>NSdC=Zcf29!4NU)h^A zG?8;5Q~0dQHC*L2Sz~b-@Z!@H$yTJOwsH) z^uY#&WiZ9a&D(D^JU6g@luOpc_!-NvH0rvvxY&xMx)Z6fCCO5Qx7@WS$j*%qQJrHG zP4Yv3EH~`^o~OnY7*^P&L>2fd0_90mAJJ#)`bwtEo8=CSw)P85)HlZ*c6n#GKGd7JnEnHN zO`J*o+WHSL)o0M)VRCLKUEjhO{&U)Y@peTeU8+Ll@6r@tn$tGL{9aAKn!28Zu(C^F3qbazp29}2X z3yCO5gtz?NEl)$}dIsHuA*#InFGnkaX)(ElF$!t39et^gc7Lsh@yi zQ_R3z;&s*YtEMB_24PR$!42~t)jn|!4Z~}s9{mS-21QX4&C)KPSn2if!VGfKxVnW% zjahH}l?R=-`#O#W3^~AY_Ks;$^P7C;I|mP)c8^Q>Jw9dnN+WOd;KIHZo95x|nm*hM z?f1)gKbgLkuGl?RW2RgdZU!wqGQIx6N>pKu^9B3k@7b$>XZmi-i&kGB`h@ zMh}??DSkrr^vdN*A`?>#=oMiFcdVWHLF|&))io4g(hkkl%j<__4<}X=kYPjmpnxB( z&Fa;k`?I*^RJCiY@uILl$O$J}zO#n);ukKD$%dEGOIo)&$(2S8l-+Ecbn}Ad^k2~U9lv} z@pAg*yv%4{be7QsvBnb?>z{$yUd(5r^LXEL1@+M%GKVB2JgA=+Bg_T}1;riEgCS_qtr2mGF=ee0B1Vx~J+;g( z@j9v*HGCVp9{BD*(55L6oh57M%_p}LmNsE*7Bh?S#k+LZ+w;7yWAobcJg{Tq8ka`XIW7t@*LI-w=+73mcP|hs zm~R*QI*aGgy_T+lOPt;`VD$_4wztY}^Ggi;66%;)0gu3}^=kzhzQB~xqp0)1dC$PH z_fkH;w<{dS5QhrdSEc6jo3Ms$um*mZbB;cs34yia2*@ zY=+=wh&X>x^rm+1p3ZEuMEoWeZ!hhm?wl07??Ia8`aDQ9z|q(GNfTKkxE7Anixe@J z%O7hdShmrSHfTokOlEZF)m|*lv{Uhx!4Co0? zjdY*-s&svQ{Y&|tEt`uRDRB-kk2rlIjb&ybqxG4_L671=D~&GMj^giJ8vVibubLGh ztwiPu+CT%;KURd8`k(13t;otS&0CO#2~spPG!$I8Ag|t9I+!b}m`f#n)&X;^-#z|n zwypaG_DN;K99!E>T>o2UB(ZlOM-a`3DJLAIr>BGYU)+lMW!OwF!$v}Vxlr&@{uc<5 zkck)s2pDC6#Io8t{~bB zz|MYVEXP@_w|$O{m^u9mn33RPF*`HKY2zrgIwqX*<-(`{Rzqc{O(s}_%DW&j*ARyM zB8=E3o<>z#M zklve)iZ%?)$BBA4Aya0PmwmA5o_XH67QvCd`cnEnj|FoKIlFp?lh1;~6G^q3U*YJ9 zVgqx>y+}j7Wov@FW{-STo*`sJgC9g`%cbq88c4S=<&~wuvZ5OKqf7kv8anvG%4($Q zA3)VEv7`C4pe^vzG_zAmwx>O~FDgmQO5M4@*$c0d84Yee9OVL^Xt8A)?miUqHQe^~ z|MUIxJ}W9w0_+bTvrIW$cem4=lOV3`^d4^ew7>M4WGwyFRHfd zg5Igw`y~#$R8{*#C9yDze^Uk`>}R1t#{EIoW4UG}u^mQ%A#ZeeUHQ=v1U(hXCz1yS zeETc-U(6}CCNp)s*;H2@XeRn>ANG8gPugjbUKJBdkOhF(>%<&CWVtr*-KL0e-UF+FeYEh4rH)LS zOpB~exzc?IGqfVWc0O)~mGszpvU{kKF>4nAKat+P#v4{mN3zaBYC zz2D-t0-5rp>K;=no(i%Tr)!|Pzq6loOg&;{uI(K^ZM<0j2l(w%{5x-7mTGK)lJCZE z(aw({64m6ih+#JMD|ShXPfMRWeRqPhq(4ZwrOb_-ccAO2d`G}`G$}WV%|ECJTwJZ` z(8QVqwRd`o`{ZW^CPrT?F77u^13j4cB@t>u*+1TpL5GNc^Xr66LnVcFvM|V?3}&K| zN{4VWFy#^}`2BU|G3{%~L`Tff{%L<;Z-u{muiANr#;b>JGk-`8W(VJ_En*ksvFr#Y zn+(F0MO$r&Kct=3-@eX->`!O$gOAbF*ZSM}IzMNI2ya4^>Ni6teEs5NhN1 zYY^Y|z6|{L_SM<#KlPY9Pby1xe$;W9iw2K!Ksw7*d`9X#icyi|wo zv#S#8O;D`~;VN(}bAjb*7zj4P6n|FAlwJuoeall6UP?Xu+b$&BTYJv0`k1)ptURLd zd%54~A7J#=xjS2LUWQOApR&d@VILKkj9+yskgRbs^SVB{(5-_>GiDjemor(NgCR>y z#*&< zu|#~qv8{+nVr7EELKMq6rGz-PxKI{ISA8sgk~iUPC@=T--k9EF)3ZO6lJ5)iSVc_C z5Beg-j*qK_Iz&@#|JXw_tq(x%?6x3xU+N!9id7j?ft2iJoGJRkU$<^9>{KIx1HLS7 zn1?~Xsx{#q6MakSAcMNXy_Jr?)Vdu>#kcfDd)= zvuc`~a{1tDwUb#8A2@Ug6;5jh&Y;(kV?B1~8y)s4C!t*At%CX4Px=Wxq?R1p;#(Xq zoWEi9ixY*U#_D97;#Rj11`oqZ7q3g`tj(hQ^h?;WS+?R(-iT*qa>0;5a-WDw69j zQDrBzw>&mk$TyNWD;_FF)+f$~*>v_dmHSS_rT);3JBv+|%zlz}0%V@g{Xkw}3Vt`% zJ|{=m9!jgv^%pqqsP>!ER_qk5kk)>LXI9QdO;NyOY>FT4vx+uhG+0Y$}=iwZB0uf47MpSG;=x6 zwx%r5G1fBkP9(dq-Rrn(flS-&Ry55m%Pd>$I8N?Oef>ITN=K3lR(;LenED6o${q3s zj*Xh`rV!=F=cT_12EViZ0s4aeYF+SJISp)i_}z{-NCS1kcIk)qmX#k8w>KVLVA2Uj zlhR36lk_j`oY6$LxZ1NO-69^>ip~e0&H>M&Kr{AV3&VB18vG~n&$N@FV_i3IK1eNX z?^bj^FWvqFI2AqPXbo1EHML}W5ACM#ErQ#tSU>25391`-7k0^2b=T2NCo1Zmi!?>B zXYNI(K>5*NTo?(UBpOYMS+0C#k-ZT%^`Ry3zRyb0-wxWTq{MOAj>OT8jxHNk+$VM} zfn=@uVNt!8B|bB2w?gG&{7ZP}y8VfJd%ywzA3!hfOwGzhO^Kl(M=y=ZSxs`HzN%|q zcT;ZD<)C4SfH!Y+g-Bs*GS{-&vQFWg%r2`gm=a{#QnoxPU1xKA`XOYRy|-J>)M7|n z^-0sJFO#b;2DMV5Tu*_(I6rTw^J{9lJ6}~(4c55fiv4mn<7h6FxvWb=v;2yKx$KBN zZ(et%s5jFqN$;JP@y|az(@l~|lnaWOmkmm5Y8>QE)Styd_xVUZQ>E`NtuL5mT9D^6 z4p%5HwK&UpJL2|+30FvpJMRNar%Le@1dFE->+ER)CRlmSG9nY`*5Aa}j zp$EKDt8=FqD9qy7ftVNBKY`784tCk?2g|RNCb=SS2ukzoL8eJLX1#43lbOPsZ5?U0 zi|UzP=EjRFW}1#SZ1oN56UA@n5OpB+=8S&;P^RCwu<^#<<2CO(RPn!L+MeR=)M0Fh zo&)c?T-!2mQK%-(-y-|X6F$&INP?~}o9Yj5@^h>VY>||Dg2TepyqwSVR=S3GY$oPI zUMlvL_8)>|UvVs@e`4nmjBV+|f6PlO66q&js`H*7J179nl1;C`EnE7yYI|To1rJFn zkFZRax|X^Ty);e81V*LI-%0Myq~)MpTuip zvhI^&f)evR%x4c^2>T<^Y5^N{Lz zUyPo4Xir}4DE2`@X3{(}F}=t3G)F{_1W$+~vk zfBe4nICtUj50GHR^Eh?yFp%)Kgnk?`7zIDEozk)t2`_R>2?2hW!~UcB{J8E1Nz!0 zWxcxPX^NWWz+I%fwwI3F#B0WzWUm(=6PG z<_&eQ*}SLGIuj~c|BwL>e))LBJ>l3qC9VBt9B9qbA1I6e&1?3iS&^hxOf_54NSX6J zL935g9^;Z7>iBxe9pCXCU&eeeFJ%~O&EKR+0=PHLL4)YR(*D7VAM}TQ$^3ari5L6Lag5ECft?vUbu7|ez9{z%Fb@ZZu4=>78A>n^PVi1Yo#ffx;S*NmT_ znWwQs1T*(g*jYNkQ}r=gI4B$00^;N5l(JQhv4x_fiee|-s+|J$Q4F{Y@nS$9V@!Cs;-Q2qY}z0kKV4Cfv}D_ z;LzKXyFrf1{M+aV<{?)<7o*WH6sjwh*; zb-GN6rdJmdJbF1&?}BOz+gi3!nP!}V>(IQNgAnGU?}U&TqNxYC{eX>N!VJk@De;wR z4yLRE7HDd91OUYls&b-Hq9ihriiM0mVzA-_1dl^3QYs!z`JrEdM2!$5X zKRm5@oj@mYqBebrX^BOuQdV1o)oO|5@%C!oN3;lXu?gG_aQ~zyLAM3hV$8>hL<|pn zK{hn@-|&y*-oFbn2EUGDigse<;uLe~YttF%RL@f<=q$p!j$3+n0@!<%orY5QSGeA8 zL`B)bpqM?{j85+kJ(!_eauw(`glJnFWQ)-#m{iRsZ56&`PGSWvJ%SR&4j)U`gygWBKwuJLSjbh6V4&Wz?w7i_ zb!*7f$?PlTgls}YllHjVh}>=qu&&rx9Xb!UekC#FlDexq%e0E{1DkfiP-Bx7r((fu z5hmVwc__EUF(1JuoqZPu^0Xfe!!!3h-VaW6h)fW>X4Sk5RUD_pNb9GgB@snL&`>Fc19Tk~=fi1kmy;_t` z5j3nVD{7(?fdbegxk$L zReuc$kY4#IKgFC!gpbX}+@EMA(_q`5E5_bL_K>Qlw_4NMMd?%kZDp4;Au_PcQFLp3 zbo3tp>80eo*$PEjRq^%M{sS<^3hM9Aiza9z2nFEqlskLsc3KgTv2hu;bo-DKdq@&u z#IkxcUSMa!Jv9#sd`F1JzI)~-Fyc+iY{2(((758B789kPia29m2YUFn<-f!ouzbY+QIUnv`UQT*665C?NIu~><_K*`4d~4IRXNC0l9FW@NW&v zTo5&f^TB-vJ%;2j-4;Wr3Ikb>lG9M@ujD+x*f;ttSgE}w?Uv|CtI-6M1Qq*fwNi%)})CLBx3$)keJXM*ZL1Co6|s+y!$x+@7Q71 z+4(pE6v9ENvTU6$nKzu6eJ!`VnnK%d8 z0!Uo;AHY#Lmi1Sk@7B^Ujr)7Sc{R>N%Dlo7w2tlRqR~gVU!2HJR#3tUJQT;zw9b)I zHXg%dq?!+l*dY3yNueaGR2DVW$Hs8Em_#qwnsV*iVzhyF#6N(9z$N&W(Zh;&6c|7I zIP$0fgg&k$>(4mV~)(8 zmCf5V+pgOqqADlmI&b~+66P$MSs3XB8yxJ~kr>7M5I?=2;{?LG&Hn-1It-tR?EcbO zEplgv*%9^9do3)?t|HGIbI$Eh+K&MVd^EjxsY#*{)I2W@{Mzcxk!Um3G<7QDST>sx9WP_j6{h zh$Eb<@Z)z-bcyj-prh!8IaV{XYA%1iWQX?1BnaJg_hRvonoqP=4xm(aiY-7$st~=Q z2)0x5$>aNAbW5Y%vV4qjVx#z6HL>euXxm0dryO7%?4Y(#MOx^CB z#^wKE{%FZM9T8NR2QADEFwI#98m0^a_L{%#>1nmweok+@7W|`WgeD8btkI)X-kMOx z9p%PS)*~Kp^Nko03G${3gw1Vnw-Au*@lQNSGQ9S^*lUhUE2wq9BKx&3WA^bHO`980 z1<%e4_=P*+E_j+Pu#tVfYL*7X99DaHG5sj772V(b0P7*aXh||;HQd1}Nu@hn(D2<7 zOGstDh>3JWDpj^K7y|jhjo!yiomjMA^XeylxC^H>B{icMWui?kt$*t{Gun~_;CM{~ zKc_Kv1dee21L)`Csb*6+Co{IHY?!mFAg1__j_8q_lZUU@U>*?-@MIRXZX1NhC}$Wc zAVc|FT8F@OCsQBevGQ}b=7sB*H&Hx#ho*6mkYSphSKqyZ{mFEve6`h>2YX4(9ErnF z{n3pB%&ys=Nd>Oed}4^g-_YA%H{+8Jcoc3muVLxY8;xj&Vq)!*qc;bYysOO%%W!qf zwdl5TQ9ris;DhBYp+(`sxx|JKD|kB z8=E==Cu-wD`=NQ(AjNKUXNBRxXAq6FR;$Rb)wg^&>yj(4C_!}@w|+* z*~Mn{D)%AAh*5_=+xbaU{x7_SAjZ{fwC%h0lauXZj_#Q0Td=Hu&Y& zsY_&fqPZgTP)cYAq6Ra^n^BWZ_=lP0qkI-#r{X`rS%-33QK=cS9mD}U+#gAgq710! zEsv`}@+OJosFro9R%2)r83H2r$Lw>b6e#H5c~7fAwCq}^MKmmU&ZjLf_h5j-i9TAJ zFQkGz?bUCth|NHg-i)HU$nu&3&5XF#5~jy{qnuGfh>jMOMx3Kg9-_3?r$JdFTYMG; z2EW__v~OHFNcv)?9=buU2Hv*zMlG^dY*9n1IGQp%YJ1yq3eFxNHmx({spW?i z`BewPO*kNjAxeS}HR;+kGBueQu!k}fwTXf3Nm1^AS0`Xw#yn)9LR&HEc_%rPC_L3) zkJ^JKW1GXdW2Fz<`UVk9HOgYCrCfdh=&g*tTUTj(?{O1Dsp`$ z72fis0Y{7rGWsr0MlE<4#lgH)j|F`o5P`c;#a&uINY$sox-QN;Z|Mzx!XGk5lhyVU zK+CBeo+N)Rw1x}b1`hmPYD$6M_{$xQyo_MD+Wr#IgQFiv91jB)!=j1Hu!m~AvP~6? z7qD%+2$BEh$K*CuCD_5_p0N@Vqi>1gXfziO?Dh&Z{ZU;Uqd#Y>5#5A&^y^-Vs>ix8 z&uDx`FSc%@aCjZGMV)*PYtN@+=Fm!lIxDkC(7LDLR;c{ko(i8)`<+MZz+PM0D=~U@ zVf#f#ObeFCFEl~vOS|%iPV&U1hn$)2=vluiR=j{$pP20@(X8g-5Wu{p@2yBaaj@3* z4kd0gBykC}Vxc7Wxk{#ljn9EOb*>T({jGtGre%2KPp=B)Gecw}LPq<>ae_N;SEzH& zw}%2OBSGGgsO`sBf*imKTXO`Vk3DOWXqtNG8z?&KUbZnk1>uCUW!csSc62Uw$}%b@ zsasbx(P&876^oZSPa(8$x~{}?E#L&7E2g};52i2A^;kT zsyDAIV2VP)b(N0OOf7G|z8KkX1JwIIZTzYz;etyMyGYX}EV2H?i)e3e*H?V2F8gnS zLqUEz8FS2CODczpH}^Xu4g^14HC*>6^y?Hh+{Bk0G_zQCsMgw5 zYQnzV;1Jw`L(qoc4h0GXE$;5_TC}(ZhZZlTxD|JID})vaF2xHJEu}cm$9vv$zO~L; z^B3%yJ$v7C|E_B$hj}{MJ~$HJVEuZ4I{reuwI(yQhX}A$N3MinWOy0 zlh@kusY2u?6E+)YBMdH4?WlM&my3{}3CMPXU6oDI&yD<%{wyJ#G?=PW**LcUb`XV9 z^*fu$HCF2}o-x#mpW0>wF_=?Kpb-_0OaBx3W==Ns=F0=S?DUzNRDf{U2eU5+$qSEP zuv4DFHcm1@WP;42blJO7cTM$oQ~v>WxtLA`7}tpcRpl&fRR)TX+SOy_@fp-nFlJXA zGGpO)ovvt}EAA}0tvL5i&9s&dI|Yo5-0%clzIq%l541A_lVdx?oR2Ucf>zBcJg_V0 zE>edmHXtdzIw!F)_gWL(bUJdJsrs%q?Sa@sFQ?_eM^ehGC+}E7*esL6G%_>C9yA<4 zB&UGHO|$bb2^+?@;KS|DYWRn^_`u+AAP*&uiXGi2SHMQP3IlAZP%X$Cv` z@{t51@7CV_t8L%B(s)kptVu?qq;hd5(5Me*+&?H=^A$=KnH`Vk0qxZ9VIM0`=fW!u z^@J?7j3JzpOto>xy%a@5YYu~e44C;4E7>u2mi%*PopDr-HvkvN3he!Ex6L0$vTagj zUc78N{;IEdG<*FLtr()WcgaqH6}r6NpK?KtahCy2x=SUsOZMk1;!4;O%A^K`E2FN$ zG0@^W;}WBaiS~1}mx%RCumRtWwTgO*<>SplCdkkswGBO{tgQm|5@Tsn#3X+YaNlo` zQW}s|YK6WHEFXbc$oWrXf9BwJAvduunglNLCkCLJRUtd{Rd=4`Av{f7)eod02Dabl zR-D_*%NGO=#M1l8L1k9tdPtXZPC?Zo9UUVjjGhkcxzql1)QWW-zPK!ExdBO-@(ZJq z+s+NvS+)ISmmKowc*W8hA6e&B#+mJBphugT{ekf?EeVx2ojL=$;srR=(0@9% ztgPcsUkfM{!Fwh<1d%1(Be1OK_Ad3Zw-u{endV0M)QN6S>UfNc9q;b|cS(ljeB_S#QLz}8ihhRN?=$1C zdoRRoZ4Nw%qZ0ERN$Bd4hb+_mp}mr8;o;*-dThwCi-4JWuk)%5IaI(q&2L#vx=iO$ zcIc63%NETY2@Iu%N7htZ|HAtyb89D+C~O3yx*D-T1lI6EF9RBsijO&Cb_;wJ+dKlv z-B_HefS>T{r-aC&y6T{31ab7Mc*p1elMXp$3`Uk?FRko8Ld}gzUsM9 z{<$az`VWBaY4%xV|6lwvqpx&C?-$QQLgbr7vEJfZ1~&6~iUWEt)oXgIzge^nQ}~e1 zaXDNLlyY7+N;UpvQ0^}k(|(e!y>mhzjHr=`4lnwn$Q)3bfYtz;oo*~&-V-#hCIq> z%S-;6mAoY80x#5P^Vf+rALCWd%eN*7lBaUUzi|o&4>b*Zf7Rm8?qt>3=vAF1qkozE z4e(NPakqUR8Bul}cP&i|$dV`ZsFAKm%Je-=L8s70h+{gEn5Mj%9$wKIE_@Y zuM->&$}r5CM!Kl%Cy06D4~rmNJf>4k74fE01>)#L^`Rsiay{09?2mB5L*^>49#$?^ zZ{lg&4c6SRRjdmKpMESb`VWW=h1hybUvV{fXm(oNCUlVTSmx>|TS zt^{QVBgHB7_5jjvi8XHO&vzZB@8(tYMN5pv>|!W%*cC$7rZRY6-4@u5x(*wIGX zBsB9RYw(@}!RV7r%-dXP(<{1Pa|Ra%0~A1uF_jva3VEKTQZy`W&mIQ&(&Q*m&Moaw z=^;bd>C0*Z6Og|0{)d)7tS^v|4}YaSqld=(640z%I)Qn9XF*NwWd{BRhHt&fbu^(v zb3ZelQjp7(z|-p3pxKIc^g>1Qy!S+xKfuRp9Vv0PGaGIIAiJ_$&9?7*O7CLva%0v(hy+%f(tF z=lUtgBOcgun@fl=Q$?WL{XM+ozMhi3)he>f)>`Q1mbqJ}a*W{*&IS?o_Nz>lj84Ao z*z?wr?6AOu#OVD*vEW87q?(PBX0nFe^k-jykWDD7<;*(jRM!V~n#LU=^?VDWD1KRt z(DclBe`*oiDY=u_9V^so?LSkCoL9iwMx~g#<$gwE!~|Z72`=m*i!24o=*H98nDiaf z(&kpz6AKAJmT0|Co&0Vs5vQ3D78?Oo81q3G#~8kCIp$oM?fmhM&Xg`AVA3<%gm*z< zyTfWj)xmvY=VVs&z-eBXI?a;z(DZ4X>#5{@+&OxFCykklHj4)M$Zzq`~2 z#1Or?Cgr-NhXdmARgR9_4L@rDftZs66afhr9)g~Q!Erf`V)bvP zcuBClRIAMo4iS4blU|A0PVly0nt?iGqq@p}l{ex#M}7>Gm-+@Km!vO#$kk*kW7jDs z&Jkl05WBI(>AjWtHQvDq z^;<|bseIpBitR0;t3kb)4HaNc}S>(e=zqzq)Xcx=E9XVx8$~ zmylu>HsB?OYol6!t~JF1e~YLMp(n$cO3{N?b@)Rv^$nv4;5Ie*t%}lTdAAOmph%19 z#NBtJO}u>60;g6P^)1dl=ZJE=^H^Q)V7>sVSXh1O{dA3&Nj-WuYp66X!^jo8S;n8C zzxivZ*+;5$14mH`Hkjy@^h|%zDuGfTz!7&pcyli+OAHNMXtKYgTd8)PiwN_JnzmrO zcIEWF^{O>qSmU$s6(S9@!Vk4I2GQDRI=hkWNe5@$YgxUSq~ZTVz+(0xVm>JHRR`|U zu!9c;FJJW8U^|{fFZJhv0=6H75QamlTt5a?K()g#xAX&o=?Ty?qG|#Q52&JzFb3rr`!Fr1FNL zd%dsmfh5b=db1ES^ESNURh2A7P)4H3AT(PEpTVBZA_%BPdq5QakToZNK>71KBAQl?N>L>a44J{zQPhU_eB#$NCF|QHiN>;@j`kw>FP5 zL%+jYZSIa1_*?;ro4fCH&uCii35=-I1Pq_XccrPLWHzp?YdjDuDA+ZA;S+GSMPPjV zld$?2Z=2DY#aF7DZ4cVy%q{vfkPD{gAbDT;^u!sDOW+fNv!^2$6g z;S#r3Zt={3&nE7eURuCTiqzy@j)pZ*WsQf0dtYMWMimey=Db@LE=*BLtzKm9hivN--sWaTTLG`O_sQb~m@;nY_>)_+u-Hm=bz3#G~ z+?j=|>efuf+6u5rp)aSjX3E-^v=qB9(RKU?-w zb3qrQLqzZ)nZQGPJ2K36#6)cAWN@m}P0R{`G0y(z5rdQD@RDc#fBbU)Bl!Rjov0`1 z4~x6CGw2+~xmVUbao!|r%%wtKwQm!MH?VD^-!#2D`zo&o1?NnHp_6F zgGbY}>ZTYJ!AXNS1$+v>>H7e$sw}61AF!dhEY4ss!Ll1P;Iy_i1UFip5F;>JjOB42 z1N;Z{QSt*|OM&w8=!0gEY!V&lJ0P=MiKSUBiCEQO04G5pPL=bu0;nz7L9aNl+0ZJP zRvRtPEQ_UjAN>U}Ki_oiw8RarackvL?ifJX8^#sKNfEe+R-?Ul3@hQ=vz_Y{u(go^ z_ehh~P_cKZvd!~x{JnrPfWSLNiDU1*FJZ<-6iuV)m9%k;{$g$+ZxPWJ*Wq@g{slZF zAFzG*hDg~#n3*?{o0ic>M5XJl6^di2yb{}cdT7|O8#`F9Z#omvAJZrks=>|48j^ZI z^y3BA!Rh_Q8>!QbN}qo>KqC6pwMz%8+6b96+h)f}&T=+OcXFc$xVju5+cygsQH&~> zIWHK#C_2g+VDUZU5j!RD4C?f|nzrC>(2*b>kbrv_=XYmK8O;A%!4_VFE%s~Hp9YAc z3FcaVL%8w=ccb*xiD-bSv13?LnleRGd2jZ^W-g>pmZpCkIuuZc`djVPj>cty5{!f1 zr|da=*5yV!hk{Gto*IL^SAWRQb1_ik!*e5^Tgzy|m+S?Y_+?%F|1k*^Vj?gjAFqs-m(~BeWBvz|AR1APp5{&*^owQ$ zKTy*XCQ2;B1ywwG~E@i*@uTHWF3~5au}O3x~AC`##y&= zJHylCsj#{Oasxx~mx3iE=c6R!Hwynkbobm+?pN+iBKa<~`^YcqV}g0M<>Rw|4fV`V z+krrz`$sZK63DtZwTbflE?WhIeKYPvZ5OSG+RmG1W$()9sag3Hz^Y}`q1x*~tP?Tv z@-&7OcKJ;GpISAMK6pil-QdcDKR6Oqill*4a~OgIe3CQMe-9J49Y+L}}yQ>(KbgI!DRaF?3za;%+@ zyPaTryCNEv0A;piB#?VA7(Gb@!{-_m^a8P8TjnBj` zcI}2y80bP}n;i3L7+5)O-&3xF4a*>3BC6vG_PI|g@F2?Gp`X>6)|3>mE$*_D-$NHn0PNIZNXJ^^@576}HOEE1`j+qrM2ha4Op$+Aa zfPnuyvHyd={9m2r%fvE*`Ltwsy{!H>P4hn#2@%cm3O+qUKtA|CfIeilA+0z}?$UE? z`QO+VvQJ0$^>a^BMg4+8@=vc!in0pMRZb0&;*%y7**VF8t@wK0$ zS(bkk3&LhXv+y_LW@4jfa-=uE*Y|7Q0=s`>sUz+U_OQPAj&7?^tUk*YK`sWI^F0f#6J{?JUjC&mj@W7=p}9jC)?Mm=um9oy*^xpxb)*A#iHOim^Yd0Q03 zz(ZR=PucWmGZjrOGeSV&QTasOxhgL&XyJfj;&Y4o`s zGR8B!f_rd{2!-I^y3Wje0%5cKv`<@fY7U5IhPl0C{Hy+TXn$WDTl4KZmdX#^6p>6U zY(gXwAgx&=W$g?#!lnmLkEq$d!q5w~0KM1*wu`>T$Z~=g5b8@bshj3kLa6vKgAPa2 zV53!O@*@skQK{haF*P+EQGWUE@K_Wb^B%i07`ya)y}4V{i;T` z@Zlg6L{^ZXq`;J1jF}YCBHU*cpxW1{NdF&z+%N&cmiBop?vdf5eyE3I#NsiLv*`~u zIB3V^us9J?+-MQ$u=QzBBt~RgC2o`c&E;CuvaMssT)$V9ErlYJdw7cKZnJgY9c z!>x3OO}`Oi|1`Ms9~B6wI=>O{KeeVF%Gm1&Cy8f29BMbo84hf|f`Fn{G0M4mp< z3S}=V?l)EbZo5|NevjI$@H{2Nah*2v8p-G<=?p=6E1=Vd8!Nn&KZ&u8mP7YhJ_a{( zwm2dgA&1sG=sKVCZ{~hVieL&5%_G(kG$g@HmUgYo6f%fIbj`YD;=?KJmBi~OvLFCe zIVsm{r49QQU%7i()0yazuNe?l?w5PiL zN-l{_Xpx0obc7>lF*6$@(F_`QJX`ltnvNWYPtsMsy#~jxhi;|z_%-RK@M=AulvjVg z*dSiH=7&uP4m6I)q9iH}#dwDig*Ol~5Ygrx`kr#pp7rk-2uk%b6(4#%Y4?0`hr|5@ z*rPPZC7lfY<^k9w7} zSQGLMpnu9xoqQyQqtFOm#DcOiE5QUCGcqk;FsMq2lYt}y*AvQT-y*~zO#tQUcxjT6 zX>)it3ZoED2)dVr>B71cQ@rDubu86)274(|`E!h^(ONnW$ zJ;#eSMd8Coy7y#`W`Tcjb^}nq6 zmu;$=mWP@LS*tYDf5#8+BZP-@9D4mrX{?}plDB{V0AIlN$$wCktU14p$K_zE3n|uq zvKuC~N$|gk5K%A>*(Y+2 zP)}|phdW-Dc1nM@s9g*bA1F@P#OQ=F^3{#-tpSbshXU&T<{jOVQWL@37%>~-&6oVn zwvpdxVPk+h##m#H-|RpNBPJT8@TAId&Zr8V#?{0&%{Lisi&#sfDs-al>k)ySl4lg=}CfCR!3T#ko8N*Q`W!+po0w-uIHQSJFzGq3e;pL zrCBdsZLq!h*X%3^G(g~zstwQVOc-l!2Ojiqa#VG$4s~WV_9ZV6FUc;D0q zopn4vpm`b@TVcP8s54NP+*v4maybV^ZZWJ6h5mY;RKak$;Zot?_|YREc40Z*0}Z#K zl{=-l;cb}-e%=DRZ44w;d`7g6F^!;a{Ny!52ECP~I{+-jE5_+i*p9QHC*TPz?h_OP zr$^Rti;}zJUozxmEnM*<+y{yshCf3YxS3a!pf1p31YMxWO@O07Pxa1f;(O#dqD=t*^n!?rqzYl-5R3dHrLS ze95e4!|bsZY6*U585AS?or>XK;B7_^NA|OHI8W*wDB<0YYw38a2`QpvE;oyKr*(!2jp@p?k|DF`?c7`t@ zHFf(!NPlepzkV0;C+pb@qkH+XxY?Dpu{O>=@csV)2uXVn?fM?+_f<8v!<{soP`0G% z!;H4s>s}QF{m8E)qxs_TS1l9rI2y-eyeK>7(*yIWYMAO1!er=B*1e4Qm%k6gh0IPK zFPfOxZxmKvO|T^vx`AtNX2`w%QjC=JhVPVtT22jP^B|5)T!4+$(Sn21;q>B=Euh0}#E=pKLxQlIFzZBT+VVz=;;}AQrSTXYxl`q24L; zQ>P3ET%f$@3T7G1h) z-Z5oZ4MQi+yb1K{y>U5Ko#JSz2*-;L|K=@J9!CYqG$ko+O zG$jnBvbe=8!ll1@RA;yhormgwv)7ujNA8Kv?-=h~LfAHOT<7Sd^OQc_`*Mi7;1X6( zuSidwk{2&bs$#pw3~^U^9!sDKOH{ZViN4OMq^pYe^IM;zYxQhsuCu)5-C4Ab{VsI| z(xeD_bMYkS{Idfe^{oFyA@1P-wfw8p61xBnlE`@zGfV(?s_`xc9WbVNfPO{Bkc&6~ zGUVEv%^$onaFB068d**cS$bC^%BD8$KDD~=vTiR7e3= zGoCaYi@nUkr8Bes&Qz4CM*G%KSBlNnY9s2vb&&>pAB8V6BZJJ_2Y&#RuGWL4<@?Rg zw~{=~I?yXr;4YfbtkH$1hd>nxyG@mHL|M)Y9!GITt31nX!(3}3ii6cGJlc!seq(3K ze4z9r!9>r(S|xW43`d_)lHCYN2n+9pj`H?!Fb+U%nvrnhKdH} zsm4!l_uUfDON)dqA2D>Elis$S_gR&tBvw$!yCt+9UuW9AAAU6ke$&9^^ErK?b|d0n zWxi-Q^^cl9GM2%|16@{Y>s4J}n-rU}9i}a6Yy3Cq-&y+w04kKv9gEQfJU7JPH~pRF zv+fZolur$^7|kC5C91BmGJkTSQR8dUflBNxS!Gv(Y1*SZKj8Oe!Nt(031QPquMUF+ znvn4Dhp*V{W#&30a2sDNy9RtGqd%#PofLq{J}@#0F-%UoLa{YJi_}NzynvE;Yp=6- z@h&Fs#g7fc9VJZISpwEqDdEswH93EhPnrH-HN6`jlIRZvQF?jdDE6MQcAg}45>{|5-Dk~;*Pcj|K{(&+@orfGJ&xFLrZA`s*=qoEF&5`0j$ zR0hY6+Vyv<(FzSqdN>MK-x=S^*YL>6_Z7PZ<+6glzeS>Q$+5a>=t84*MQP+9&m-hI z9ztX_961Y;{se+c22}I(COOAkLErscuGqO1r_j0z8iRd(>}GE=e$19zVk}fwsV+}t zvF^tx^X{h{*o`p;Qg91%X&&IINksEeI1pZnZ%^@(8%*S%iIUIzYU8~&{_E=OXVUAFm(1!0*$H+;23xm}( zv?hA6v(or?1F*g4ecCa4mwtYv5g0WY_xG4xFaxMbD51WNQjSfNZe{vG6+pIZwz~Z= zCCLoynMcr)PvHKIy-x6S?@zYM1_a_3U1xsf_vZZ$X^R`|RMs3d{~3wRl5DcweOY;2 zyo%BQCNo)(g~SCChu$YDR`XftUP4(Rt}S=;B{Q?P3_3xLmnd0g&R++wncIM@8BMpB z&5MlE4S_sDPb2Ti^j%kD!+!M8kW5SnSSfZr?Uw@~jq)C+T3?4eh3}rmj7X0NHU)TA4l~0UfNI*5$nVy=ltF>Wz`S9q`5kjyGLYwna6suQw;ym4zsK-sh4S& zvUhikJe$z$rV2Y$d>2PL7Q+ieRih+g$X*v4y+aD=atT?RqR^l#kk*-LUr&x+uO&?;n*dKZ5RV z61enn2VFz{-48Ib>^f(nSq%c1U-RCqy-AORy@s=nW?v@{dXj@b=(N96`Gnit?-(lh zA0Sfzv}X4xzxpbFfKT60giO;T%_81ci_E0n5lRtYSj~qhLpW-OfLtJ6SsWN+nwpNE z=KjD>u+1rh!5fWE#x!nL$32=*PU=HzrciuH@N@#Ji<4oGMX^j`nu>(4ALa zg9$eYWf+9Jw7$kauehgE`+Fuj277}hjlKT^NZlQ5nX}a>Y;9iCP-3w*;}AQqH&7Uu z5)E5Th=otg7gLhqzq=wgV3hVJg8{?6^1tvSDA^mNPI`&T(#U9J#S7t>Q{I0Qu;$2h zgA%HK7DE07!zy*u4IVoqP1-ZRV}E4Y_WWY;2On_u+ts4^oW5;H;d)I<7hE}tol{*i znO-FFi*>XOGqQIeQSF+uyYWoB`6korV0HNXKS0DsBb^`cv`ItJn^=>z)PvX8CDb=? zCBk0<*sdTn&kk5+Q{KZ!c)`*`t`Df@F7l=B|Gt}fNHusxnKcISIHxC%FuY52CE2jq zG>s6dmfS|&SYTu(h~UGx7cVb~micilgM+c~^9~hTkh^~((`+qt2D4VVA8Ed*9=0Ri zaj;9c3P58!zs9$G&+#mWn%(vvKvM=tS${`>Ob8@Df~u}Pj`EKkjsW$f0?Y5>i0Y1M zw9`U}FxX8${K7DKU*!+*MAopoWqG04$JHr9mXd=Rn_%2wu>xsRIki z^dDbW{hVGIrDG9$obdidu;zE#o=RkmY^wwPi>*1P-Y|=H%{iafpOf?&iX_c=31?OE zD&%qfOBzscTRSD;FPEw|1ud^!qEH6+SJ|_zTHIllsTn*b4*qsH5-!-*Kst(uy&UKi ztU#aHglml)cA(CkKSq$U2hWUfUFG>p)TeAy!X8v!zoVNBccBu7oaztlI#-0;*e0m~ zi7;}zyR2e+8JnwDfx%PA_HDheWk=q6AjP{SzN|LlbvMz|X^r>owW)Uk@a?R5O1xoDtkYYa;&k2+u|pR@MFPH?w%oz{`jwB%|kb1#y%- zf5xz?@N9FzmQm>9=rZ_E>s>M`E?O}vllRo>Uk1YChe_kPqUUi};g~{8oJzodfCi(3 zFng+Yywd@!9cU@~%efOAM;(hhHg`)OL57`n;`YQXBI7P+U3WCz#V$vU@<5u@^2PpoH zHE%xr;`VWrQ^s0kEk8&Vd`~Zu8*!|d@uT|`TVl273c7R>c?ZpHm|vt!vr9};SF9X6 z>Gmw|9lhdSS)U~(MvK{lE>RiRQJNq;2|Eret3Q< z@%O%&?!H``O)qpk&i7-n_%S{25o@cJ(4>Lwqr31es)PpXhh4Q_o5sqbJbdqplJ%{> z$EkJPMEZ4g|LmDUzHA)LL_BOh%IB4;i{-lOMBVKK=%y{e&n(tu-d}KZ<@hxCa4p3_ zMSczoM1U9h9{pN9Iyo3$lLBI2Q;}2W`X69KOBM~H-iTd%5={uc_&dI{XE={!U`;9_ z5e493UN=wGpb8}w7dfxe0?)Riv_rik{O4-0hj4S zh0aZ!>Ma@VR|rOLhL@cSP@ zW5$t*R-;}3xP$F9N?DA}LQWy2z0Y9cj+tPg=fOi3iU$W$o|BqvZ|gQGq8rQpE8S(P z(msee;pNo;Ez=xuPpw9^eZTb`K$@d z^Vcc+orrzktR--u9!auiBp>!6=^69tR5XI-30AukhTgXEUH<(bg^REMQ*46`YiF{7 zeMY|k8IWOpddGR&{E|AcX5;EoVe=zsCY3xK#&z=gBZ-+M)RKKpxVJF9whz_&nQycjD7diAw zfMJJzu``B7keLCVKp*7;T=CnhtTy+pc8R=lMmt@nIBmUJ2DFSu&D0DEJww^lpz&dqT)(oO)aqWk4Ntg; z*&W#r`^Ya?xgYV)lT=9eWLzn8&09i>e{)k-N4(9^PK`JAf#$^HG&o@0Va#&oj0mv! zb!QEda>2=qWWE1!c8yR+M!6DqC`Zmyw|JJ&Mq|1njf}+Qu{9O_+B*gVw%Jpg)lUTQ zWWS+tzqs8!e}UxD9JeN~)Hx4G>NY}(t?;{jF&&8vg5a*kstccyv?)3f?L0aV2`!$a zy0uhJdTC90g5RTrUIcqpXPTV#HdOLNKV8=_)4>)gBc`Ym!B^$&^Bp7OwnhG1Tzs0*!w%ghuizFJ#7F2=io@rYsay0arqDW9j-l%r;nKd4lT zC2jg3OohTTBQL%pS!owZm?|v*JLQ*Aa)k*HEO>Q7CC8vh|Kt0Q0 zvHd?NKBfar#`LO3iaF#c8BCeKgOyD@6zqz(zx-9^YcvSZyo-s;Ke){~R;xT9_5Dpk z?g^m#r?@sJjs16M#wJNI7Sza&J-wkAwKpL9b!wMo7%1W#Wyk}zIIxTvLg#^-p}?!h zDGOP@N0oiyFS4rjSVZTDRbJ|8Zs?4E4ok#aM+%|SLGsE3^bJiM=XvdYugwl9MQOUY74ehn# zpLZFu#11UwlQA2{F3yJPWfpw+?m03)z8DEOs`AW40Ccf$qB-#v}mYf;y>V}1W?YHOcu;Y zmYzFuIHW1;Gc^isEu@v!bSw_%a9P#N6=VPA*9K4omp|gH&{TG|#$+ERIXa)ge=?K7 zs|u%UhrXp2V>c?PbX?nzyddb;860~V<7{QRIz+VQlhJ?Pv8lPh?*y#@+K0rmM#^kD$P{c&5+q^K5 zKYCCN3H#yw`P@6Q=s!S#o&AEx?MPBxVGFLAJrwj={-4BN#;DhV>Q~<$#pKtOt4ux0 z2Ar2fXmz#r5*_cggr%>g^~E;I@XF*nI%>6TE6nX-W%#kWu43458j2C;w6>QUOyW#F zF&-EKJO|q1%oLB$6YS-&95f>oj=trn1_*un1Q+d5yhdXdOEvK)jzx1$k$Vw3_%S=8 z-!Qwc_fDbGH^y%Buxs*6C$AF-`i>$<%>MPaYhu)8QsCMjr!Y6|14C>q0SUd_lAE;Ei^e~ZV8pqj(@>(dA~2`^jey~w}aiX zo<*w?CTL8@-!H!p;5$kk2O+0bGi@9+x%6EFBYh+|Dp5>6Bq?hfmBN6GQF5%Zd39EN zqG@JXdalZ(?^yZd5kNyRfDmMmu!aRj+tc?k87l`zzC&LC*c9NH1^C8pmzmfz@;%9A z^93K(S+WQ?(2gebczh*gk7NL`diZ`==xwx-JU}j!f%Y*Mhyu&tzX&ji*K3NvpZ9BFfUXIw!5i#?) z9R=Bw4}Z4?c@ET=*9t`3Wwq2Ai$!97^!v5R!o=ggW3R`)u3e}#NvJREF3f7U@*jZN z%4;9-b>WYRd874n(UdUi6cjXca?F9~uHe1a292CdRPS(^QYkA2d9W%JO4`{{+PSR0 zSexEqlgTyCmw%v);YzkA61OrPA^+j1J4`(-0@*L$Yblbj=5wK+4c)YyMvIPH;$mAkQHzD7E zjeL8TpIWcOC}%i)ygS03*`&YErjAWK;Jp%biP~&&+wg7C`bc#(Q)X?U9f-g)w5G~+ z#Ukc>rG@uiK@37te~SOZJ}C&nJ4z~LINKa+cO79YfX2m{2u|^G|NZ6?wNf}5LEW?* zp6Ur=HfIV4QCp)1RZyN6rNdhWKRv^(IW{`NDWY&s1#;O}qFEM89%BPIG^dA@>_Mqc z@;Ldt($SyT!Hz-%Zt)qt5HCW4B3?WEcZzD$qA8-eHS;?T)HJYCZ2l9q2K$b;&N?l^ zktK6f^&Q-0u92WDIJ)LIo=SRETGJN!SOX`uoBOJ1!0U73oZ7NdA>yubt8|0L)P7#n z`T}&*GWSf|1W)?!Y`htgR>-q~2jvx#lQ$x0Nd)@nvauOMgY-59?uHr8dYLDTezdxi z$xJ}by^aJ%%ZBqT0GGny4hwYJu&|!z4O=Yt+4-t)U*lo25rnt9P0;^TTxM|6TsF6* zAyB*q>zK|ERQ*E~W8$$Y;CUE5 zwn3izI@;+#nac+FuO~?j*O#e&1PJEtQGlS%$MGf{@tO{K=3y^e;@~FMu|&2oZna5+C~v+$eKW?562-a7R*`-r}-van;Vife{L5hm;`r_F$qe&RFC?En=4(feSIxTY zZWa|I4^zZ9L*s#51{0my-H@* z8#jbI1TibW~YT?6tJ3`BG&_$DN7f3V0F#DN3}-X5SXF*BdMWyo-6fT2^yr~jkC{Y9l5^IOS0_3n z{88+e@)8>JBX`JGj3Y?SwLx#qHA-_LpmPl*1BEq(p31#L;pUqmJ91=O-?&meY~Xjv zhmlt#Em1PgK_dj?>{#2rKuY|wY;-`xB{_f+^%pMpTP|~DxJC8U++f@=DyA#PR8AnQ zExy(&ZEuu`u{HAu=e?0zs&`_cwz0i#J_~IPyRWnoMFIXCzCe^*ERelfsn2u}p;Gl1 zeJU2G1;eMcDv{H2CpWP+vYm+BcO~M=N2fGGJAp}{z*10GFPl5DU7;A7sy11OVa%#$ zo|0=wefbSj9#2G*KtoGY^@p?-d0IC{nb(JtEk9-O;E$a0AEl6AMDVU=?SzEC$bmE_ zkJ3)rZyV!&&G^qc+VJmI?tG~7sP-T#%gRiDcwvogQOBnpD~Ck~Lp^Uf{dwe*wFKz+ zPEHt0$U8D!IaIp@Gs-q%{ei5RG+n%-Qa_5nGM2~NS`yn<8iDzaNSRb7otn*F9?A{= zUXLwnt>5_uEBf?bLi-mcOz$+##*4n>Nwn3nZ@8#Bt1V~op*JP~96J9KXEX2?7_ z*2s(xH+;s|`#DKWR+P_dP}ST$r+PmEB~B})m9rM+su4{uz7H>5q986e+&R-!o#!N9;Mb8srh0U-?Kboq$f=bG6yULf z!b!xV1QgQ6oTWOb4SSf-cJKOSQOXR0ZyJ*YZA=hutF+v# z*m2G91i9*oGM_w90R@(raz$j`(mdpo7nc(@2=LuxyY_FPC zt{B14osDMUZu=8blG0lKBBwR9QbA6saMg}1>O-5#D&!Aj4FiBmaSET9_!U2Yq;+3T z8hrk%m{VYek^3);2-5%)Wun}Yo6nRjAR=Zmp)^!(pkQ*Mchq`rQusPw;aJbXJMKS# zXEPatZ8SEsTk(Zv7so2Z^7F?uV|S1VKboYh zU_@KPAJDMu>(@y#S0EP_5TRij{vdA7bq942)CyNyqZ>p2Y(RpTL%BpRNPbAz@y(@~ zyuXZS%sDAG(~e+r6qz2p@k?o;3wYK;gO5>Zh7V(LERuY{U?Q{n)qqU34*wvaEm0>; z4^`9*O_8dP(rPk0eL?O#Xg(){H5NFg@Y$5|K1+-}34bzky!3U;X%G6>ELV$`Vo7Db zo7lp@R@qf5ejUg3XBdb}rARDGWjUlR0hOZ{5BN1t^OY7$eBoO<;qK)!`L$-$n&AP3 zw+KpVGs6-42Z|lrtzFhB7qh~W9YF*aH>-6CZ6g;j$Jm7P(&7#Q4c9O<(MU$v)Prg~ zWd*~>qA7XXe}mAyRQVSt6SzqezsQy2JGp>#+%Q$NNPP!M=J*+lw8V#*jbjbfX9qLx;!gLBm080XZUauy?_;(OM93liLWmyw z{n$pcd<=q8OeM{wW3vHfXHW_M!W4lMi~vd>MML_HvU%&DyF`e43hIe#(}oU$Wv#yX zGK2n40Lch8_v9C1DrQ{5g&^>T>$t0hqv z?m;4g+dKP96^riA@(#F|x8Vvm-q?FZc;#E;?bsv*M>%C$}+5i(IR2o&5P zL{M2`g-1uE0AHlGI&}~OtA)ahV*)HOW>zoR1S8n4VpHsP2o5BcTO8Wji^(d)t2S2! zjpp=4v}UXDfN$HI5xq%kcqL$2qTZrsHCEs#Zcr_N;|k2e;At&aZelGB>;VM9>|AOp z)>%Octqlx|if1@hD+;9+-*jtar!f{ceX-q@9RC32=h8o6oY(cj0w5KXOAO1k4x<8? z(4u9<=H@jHX>$nx+%-_ca>c43(&?n;0It%_L2tY`T(=T{NRVX4VR8FQ@T!LGuMssc z-u`0z2R8dk@~s*|j0Wnc2FaUvRlD^uY8lErDh`&+0)h64f?2L__QW}~#cAQFs)p!m z+Bkf012J%j6eeJ8@pc78F;_8jP`VzkM11eHX_=X8I~bE7nQYzOGaI7L(ud3%s4Qf@ zNTTCtrZ8NS1x6`-9|oelT+5${YYj%f7d40P3@$lULLx<@ax82tN}jL;I5d*kIxv+WERFE%3MGL76Vat0dG4<@lEWfKzTB~a&;5*9@!YZo;6Hjok6VBh#6wsxCP>O+Jhgr2u-gD%xxA`yZsUFkH|2m+LP zU@Xr_Hv>f@)PbK4Q;&jbkV8ZWz0oYV!4S%1@vNbj!Z$&YdDIKFe|Y4x=M6?wnu8H=Otm@>BqV7gW~8EestZ4hi8 zFxi{?n;=1a&R~LB`-PY$i3ewn!D!2hqcy}5R={I1FK8m0HLJT)rp3YqL6%0^5^|}_ za(x%My95;uo!qR;x)oerQCMuF2b)aGL9)-6?FkWz$}!P&71j2a#6iktTjeuk#Hi~P z48!JUJ&>_jNJPb{pJ_yronccu3LHX|(^=A05U&*kn5BRrA-P{E#JpBZ<*mznP{Krt ziB>A+aCfjNA^}qsV&bVDaZm$8j0yqk7EtMG(Ode?zVhk-fTs$}>kDoNE-!+)y$g+x zBO`Phg_@UU_BuZ@vaLzg^@Y8XvV6nDjVc|gbQMa)8_w>&@p(rJh}zJ2rl!oTY$<;7 z+@;3IRc2I6<(Z+>zsZRAl{=_`xsVg2S%{z`#2B)8N&pFAqVeIr<9B>9w2QP#>*paC5b2 zrbt@zN&qFt7S(TvEfT#YF+M>MJw2Epx6wpbKsW*deZT}=r!Lwe93ijp$Wy0idJ&Linv# zz3K#X*!>CUfEWHEiFcB}@?Z>sQC;mxkmQ2|9LX7=^CvAFCSTm1Ifh&JAr_M8-=wig z6;&x`aI~T>m=$wgv26rZ(;rD{qYD_$ARrU+_jx*0cPcy_(bQ zEX33IL?G)b@dFkB>BAxf0bY*OekDz3YsL#n!a9wU-nW^?T?*gkHfZOs%te$M$cZ@= zyQ~!z+6ELXInrxD86U(8w2X0XflUie$+7okDsgdAjbQh2R#k)rm5Jbj$hRwMAw)>v zO#c9ouS#^%`%Mr&NI(GH+8B@-9Q|WZA}7_YgOiA zHy4MW5HJ%Xa*wQUTVjSEFiKh6qIa06JUG?f<9V4b_3ns(TiqXcpRZFcsvaUdEC;Kk_3crQ`1v5^4<_U&Geqs+WEmD860hY}Sd&5?p=KL@#Tvmtc zaIq(a1Jf~y#A(aY;LAag826PMjoMH?^3=6(8}qoqu`YnGc~b1Gm4Ai`X3%6|UomDE zS-Y&m!Ei_gf?P`mSI%klxF$lmRr!?yE>%A9+PdIbe(+v!vaBBP=^@K|edR_-;khvG zX|!T=%`_iKs~l@%^D5__r-tCc5ugyHQ@T`45Skjsf?cX8#a)Hs$pY0Wh$y`Qp}4U@ zF`^-uX5XA_1?NfZ&cKCFkVhiNH%twZr-D;^^bnXU6&f)>aXlbSePn1XTZ^7aJjd%m zZWu%hoWzq*!r~!-Oc2yUJPcaT#jZR z3j0CO0@$g`$mxO$FSRqfjC?=@15j*OmTEdi3NTIAiK!auYeGj&W-XcWh`1c}Ecu5G zMTi^Wl@#A<0Dw9Owo&q6>-%YIhWeC*PRzh~sg5{>q|+Mw2WZX9Js1nbPWCJ;o%0&o zW!oOdTTAJa)_kOXAl|DamK4La2SqzOx|j97qKziC0IgK8aR%y Z#yE{q^U50+oKAuEfVCB#CKX*z|Jm8Bxk~^5 diff --git a/upms/upms-biz/src/main/resources/static/images/SliderVerify/SliderVerify-4.jpg b/upms/upms-biz/src/main/resources/static/images/SliderVerify/SliderVerify-4.jpg deleted file mode 100644 index e0edcb64fef1c743f3ebd01570b6de52c913cbcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6430 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 RlY}LV{&)a5pSAS-e*l~xoe%&3 diff --git a/vital-signs/src/main/java/com/rax/vital/interceptor/WSChannelInterceptor.java b/vital-signs/src/main/java/com/rax/vital/interceptor/WSChannelInterceptor.java index 14fed11..a07d438 100644 --- a/vital-signs/src/main/java/com/rax/vital/interceptor/WSChannelInterceptor.java +++ b/vital-signs/src/main/java/com/rax/vital/interceptor/WSChannelInterceptor.java @@ -44,17 +44,15 @@ public class WSChannelInterceptor implements ChannelInterceptor { String token = accessToken.get(0); OAuth2Authorization authorization = authorizationService.findByToken(token, OAuth2TokenType.ACCESS_TOKEN); - if (StompCommand.CONNECT.equals(accessor.getCommand())) { + if (StompCommand.CONNECT.equals(accessor.getCommand()) || StompCommand.SEND.equals(accessor.getCommand())) { if (authorization == null) { throw new AccessDeniedException("Access is denied"); } } } - if (StompCommand.ABORT.equals(accessor.getCommand())) { - System.out.println("StompCommand.ABORT"); - } else if (StompCommand.DISCONNECT.equals(accessor.getCommand()) - || StompCommand.UNSUBSCRIBE.equals(accessor.getCommand())) { + if (StompCommand.DISCONNECT.equals(accessor.getCommand()) + || StompCommand.UNSUBSCRIBE.equals(accessor.getCommand()) || StompCommand.ABORT.equals(accessor.getCommand())) { String simpSessionId = (String) accessor.getHeader("simpSessionId"); vitalSignTimer.stopTimerTaskMongo(simpSessionId); chatService.stopTimerTaskMongo(simpSessionId); diff --git a/vital-signs/src/main/java/com/rax/vital/medicine/controller/ChatController.java b/vital-signs/src/main/java/com/rax/vital/medicine/controller/ChatController.java index faca068..dd1ac87 100644 --- a/vital-signs/src/main/java/com/rax/vital/medicine/controller/ChatController.java +++ b/vital-signs/src/main/java/com/rax/vital/medicine/controller/ChatController.java @@ -2,6 +2,7 @@ package com.rax.vital.medicine.controller; import com.alibaba.fastjson.JSONObject; import com.rax.vital.medicine.service.ChatService; +import com.rax.vital.util.DatabaseNameUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.handler.annotation.MessageMapping; @@ -11,6 +12,8 @@ import org.springframework.security.oauth2.server.authorization.OAuth2Authorizat import org.springframework.security.oauth2.server.authorization.OAuth2TokenType; import org.springframework.stereotype.Controller; +import java.util.HashMap; + @Controller public class ChatController { @@ -27,9 +30,16 @@ public class ChatController { if (authorization != null) { String username = authorization.getPrincipalName(); String simpSessionId = messageHeaders.get("simpSessionId", String.class); - String db = params.getString("db"); + // 病人名 + String patientName = params.getString("patientName"); + // 病人身份证 + String idNum = params.getString("idNum"); + // yyyyMMdd + String date = params.getString("date"); + String databaseName = DatabaseNameUtil.encrypt(patientName) + "_" + DatabaseNameUtil.encrypt(idNum) + "_" + date; + // 消息内容 String msg = params.getString("msg"); - chatService.sendMessage(db, username, simpSessionId, msg); + chatService.sendMessage(databaseName, username, simpSessionId, msg); } else { throw new AccessDeniedException("Access is denied"); } diff --git a/vital-signs/src/main/java/com/rax/vital/medicine/controller/MedicineController.java b/vital-signs/src/main/java/com/rax/vital/medicine/controller/MedicineController.java index a649d52..c77e89a 100644 --- a/vital-signs/src/main/java/com/rax/vital/medicine/controller/MedicineController.java +++ b/vital-signs/src/main/java/com/rax/vital/medicine/controller/MedicineController.java @@ -2,17 +2,21 @@ package com.rax.vital.medicine.controller; import com.alibaba.fastjson.JSONObject; import com.rax.vital.timer.VitalSignTimer; +import com.rax.vital.util.DatabaseNameUtil; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.handler.annotation.MessageMapping; -import org.springframework.security.access.AccessDeniedException; import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; import org.springframework.security.oauth2.server.authorization.OAuth2TokenType; import org.springframework.stereotype.Controller; +import org.springframework.util.LinkedMultiValueMap; + +import java.util.ArrayList; +import java.util.List; /** * 用药 @@ -32,14 +36,44 @@ public class MedicineController { @MessageMapping("/getSurgeryData") public void doctorMedicine(MessageHeaders messageHeaders, String body) { + LinkedMultiValueMap nativeHeaders = (LinkedMultiValueMap) messageHeaders.get("nativeHeaders"); + ArrayList tokenList = (ArrayList) nativeHeaders.get("token"); + String token = (String) tokenList.get(0); + OAuth2Authorization authorization = authorizationService.findByToken(token, OAuth2TokenType.ACCESS_TOKEN); + + String username = authorization.getPrincipalName(); + String simpSessionId = messageHeaders.get("simpSessionId", String.class); + JSONObject params = JSONObject.parseObject(body); - OAuth2Authorization authorization = authorizationService.findByToken(params.getString("token"), OAuth2TokenType.ACCESS_TOKEN); - if (authorization != null) { - String username = authorization.getPrincipalName(); - String simpSessionId = messageHeaders.get("simpSessionId", String.class); - vitalSignTimer.createAndSendMessageMongo(params.getString("db"), username, simpSessionId); - } else { - throw new AccessDeniedException("Access is denied"); - } + // 病人名 + String patientName = params.getString("patientName"); + // 病人身份证 + String idNum = params.getString("idNum"); + // yyyyMMdd + String date = params.getString("date"); + String databaseName = DatabaseNameUtil.encrypt(patientName) + "_" + DatabaseNameUtil.encrypt(idNum) + "_" + date; + vitalSignTimer.createAndSendMessageMongo(databaseName, username, simpSessionId); + } + + @MessageMapping("/changeAIFlag") + public void changeAIFlag(MessageHeaders messageHeaders, String body) { + LinkedMultiValueMap nativeHeaders = (LinkedMultiValueMap) messageHeaders.get("nativeHeaders"); + ArrayList tokenList = (ArrayList) nativeHeaders.get("token"); + String token = (String) tokenList.get(0); + OAuth2Authorization authorization = authorizationService.findByToken(token, OAuth2TokenType.ACCESS_TOKEN); + + String username = authorization.getPrincipalName(); + String simpSessionId = messageHeaders.get("simpSessionId", String.class); + + JSONObject params = JSONObject.parseObject(body); + // 病人名 + String patientName = params.getString("patientName"); + // 病人身份证 + String idNum = params.getString("idNum"); + // yyyyMMdd + String date = params.getString("date"); + String databaseName = DatabaseNameUtil.encrypt(patientName) + "_" + DatabaseNameUtil.encrypt(idNum) + "_" + date; + vitalSignTimer.changeAIFlag(databaseName, username, simpSessionId, params.getString("flag"), + params.getString("medicine"), params.getString("value")); } } diff --git a/vital-signs/src/main/java/com/rax/vital/medicine/service/AIMedicineService.java b/vital-signs/src/main/java/com/rax/vital/medicine/service/AIMedicineService.java index 4bd9ee1..4dac7f0 100644 --- a/vital-signs/src/main/java/com/rax/vital/medicine/service/AIMedicineService.java +++ b/vital-signs/src/main/java/com/rax/vital/medicine/service/AIMedicineService.java @@ -1,7 +1,6 @@ package com.rax.vital.medicine.service; -import com.baomidou.mybatisplus.extension.service.IService; -import com.rax.vital.medicine.entity.AIMedicine; +import com.rax.common.core.util.R; import org.springframework.data.mongodb.core.MongoTemplate; import java.sql.Connection; @@ -15,4 +14,6 @@ public interface AIMedicineService { List getAIMedicine(MongoTemplate template); List getAIMedicine(Connection connection); + + void changeAIFlagMedicine(MongoTemplate template, String flag, String medicine, String value); } diff --git a/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/AIMedicineServiceImpl.java b/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/AIMedicineServiceImpl.java index 3d21f1c..67db698 100644 --- a/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/AIMedicineServiceImpl.java +++ b/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/AIMedicineServiceImpl.java @@ -1,8 +1,6 @@ package com.rax.vital.medicine.service.impl; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.rax.vital.medicine.entity.AIMedicine; -import com.rax.vital.medicine.mapper.AIMedicineMapper; +import com.mongodb.BasicDBObject; import com.rax.vital.medicine.service.AIMedicineService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -10,11 +8,13 @@ import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -28,11 +28,24 @@ import java.util.Map; @AllArgsConstructor public class AIMedicineServiceImpl implements AIMedicineService { + private static final Map doctorMedicineKeyMap = new HashMap() { + { + put("丙泊酚", "丙泊酚"); + put("舒芬太尼", "舒芬太尼"); + put("瑞芬太尼", "瑞芬太尼"); + put("顺阿曲库胺", "顺阿曲库胺"); + put("尼卡地平", "尼卡地平"); + put("艾司洛尔", "艾司洛尔"); + put("麻黄素", "麻黄素"); + put("阿托品", "阿托品"); + } + }; + @Override public List getAIMedicine(MongoTemplate template) { Query query = new Query(); query.limit(1); - query.with(Sort.by(Sort.Order.desc("_id"))); + query.with(Sort.by(Sort.Order.desc("Time"))); List aiMedicines = template.find(query, Map.class, "AIMedicineTable"); return aiMedicines; } @@ -40,7 +53,7 @@ public class AIMedicineServiceImpl implements AIMedicineService { @Override public List getAIMedicine(Connection connection) { List medicineList = new ArrayList<>(); - try { + try { Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT id, phase, `丙泊酚`, `舒芬太尼`, `瑞芬太尼`, `顺阿曲库胺`, `尼卡地平`, `艾司洛尔`, `麻黄素`, `阿托品`, time FROM `AIMedicineTable` ORDER BY time LIMIT 1;"); while (resultSet.next()) { @@ -59,8 +72,31 @@ public class AIMedicineServiceImpl implements AIMedicineService { medicineList.add(medicine); } } catch (SQLException e) { - throw new RuntimeException(e); - } - return medicineList; + throw new RuntimeException(e); + } + return medicineList; + } + + @Override + public void changeAIFlagMedicine(MongoTemplate template, String flag, String medicine, String value) { + BasicDBObject obj = new BasicDBObject(); + obj.put("Flag", flag); + obj.put("Time", LocalDateTime.now()); + obj.put("ConvertFlag", "2".equals(flag) ? 1 : 0); + template.insert(obj, "aiflagtable"); + + if (StringUtils.hasText(value) && StringUtils.hasText(medicine)) { + BasicDBObject medicineObj = new BasicDBObject(); + for (String key : doctorMedicineKeyMap.keySet()) { + if (key.equals(medicine)) { + medicineObj.put(medicine, value); + } else { + medicineObj.put(key, 0); + } + } + medicineObj.put("phase", ""); + medicineObj.put("Time", LocalDateTime.now()); + template.insert(medicineObj, "doctormedicinetable"); + } } } diff --git a/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/DoctorMedicineServiceImpl.java b/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/DoctorMedicineServiceImpl.java index e86aefa..9e78877 100644 --- a/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/DoctorMedicineServiceImpl.java +++ b/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/DoctorMedicineServiceImpl.java @@ -32,7 +32,7 @@ public class DoctorMedicineServiceImpl implements DoctorMedicineService { public List getDocMedicine(MongoTemplate template) { Query query = new Query(); query.limit(1); - query.with(Sort.by(Sort.Order.desc("_id"))); + query.with(Sort.by(Sort.Order.desc("Time"))); List doctorMedicineTable = template.find(query, Map.class, "DoctorMedicineTable"); return doctorMedicineTable; } diff --git a/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/RevulsionServiceImpl.java b/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/RevulsionServiceImpl.java index 00bbda2..e498b62 100644 --- a/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/RevulsionServiceImpl.java +++ b/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/RevulsionServiceImpl.java @@ -31,7 +31,7 @@ public class RevulsionServiceImpl implements RevulsionService { public List getRevulsionServiceList(MongoTemplate template) { Query query = new Query(); query.limit(1); - query.with(Sort.by(Sort.Order.desc("_id"))); + query.with(Sort.by(Sort.Order.desc("Time"))); List revulsionTable = template.find(query, Map.class, "RevulsionTable"); return revulsionTable; } diff --git a/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/VitalSignServiceImpl.java b/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/VitalSignServiceImpl.java index b9c6083..ee671e9 100644 --- a/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/VitalSignServiceImpl.java +++ b/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/VitalSignServiceImpl.java @@ -38,8 +38,24 @@ public class VitalSignServiceImpl implements VitalSignsService { public List getVitalSignsList(MongoTemplate template) { Query query = new Query(); query.limit(1); - query.with(Sort.by(Sort.Order.desc("_id"))); + query.with(Sort.by(Sort.Order.desc("Time"))); List vitalList = template.find(query, Map.class, "featureTable"); + + if (vitalList != null && vitalList.size() > 0) { + Map map = vitalList.get(0); + Long bis = (Long) map.get("BIS"); + map.put("BIS_except", bis <= 40 || bis >= 60); + Long hr = (Long) map.get("HR"); + map.put("HR_except", hr <= 50 || hr >= 80); + Long sbp = (Long) map.get("SBP"); + map.put("SBP_except", sbp <= 90 || sbp >= 120); + Long dbp = (Long) map.get("DBP"); + map.put("DBP_except", dbp <= 60 || dbp >= 90); + Float st = (Float) map.get("ST"); + map.put("ST_except", st <= -0.2 || st >= 0.2); + Long etCO2 = (Long) map.get("EtCO2"); + map.put("EtCO2_except", etCO2 <= 30 || etCO2 >= 45); + } return vitalList; } @@ -48,7 +64,7 @@ public class VitalSignServiceImpl implements VitalSignsService { List vitalList = new ArrayList<>(); try { Statement statement = connection.createStatement(); - ResultSet resultSet = statement.executeQuery("SELECT id, phase, bis, hr, sbp, dbp, st, temp, spo2, etco2, ppg, abg, tof, time FROM `featuretable` ORDER BY time DESC LIMIT 1;"); + ResultSet resultSet = statement.executeQuery("SELECT id, Phase, BIS, HR, SBP, DBP, ST, TEMP, SPO2, EtCO2, PPG, ABG, TOF, Time FROM `featuretable` ORDER BY time DESC LIMIT 1;"); while (resultSet.next()) { Map vital = new HashMap(); vital.put("id", resultSet.getString("id")); diff --git a/vital-signs/src/main/java/com/rax/vital/timer/VitalSignTimer.java b/vital-signs/src/main/java/com/rax/vital/timer/VitalSignTimer.java index c7c0160..edb470b 100644 --- a/vital-signs/src/main/java/com/rax/vital/timer/VitalSignTimer.java +++ b/vital-signs/src/main/java/com/rax/vital/timer/VitalSignTimer.java @@ -38,16 +38,16 @@ public class VitalSignTimer { private final RevulsionService revulsionService; // mongoDB定时任务容器 - private static final Map timerMongoTaskMap = new HashMap<>(300); + private static volatile Map timerMongoTaskMap = new HashMap<>(300); // mongoDB链接工具类容器 - private static final Map mongoDBSourceMap = new HashMap<>(300); + private static volatile Map mongoDBSourceMap = new HashMap<>(300); // mysql定时任务容器 - private static final Map timerMysqlTaskMap = new HashMap<>(300); + private static volatile Map timerMysqlTaskMap = new HashMap<>(300); // mysql链接容器 - private static final Map mysqlConnectionMap = new HashMap(300); + private static volatile Map mysqlConnectionMap = new HashMap(300); // MongoDB的地址 @Value("${vital-sign.mongodb.host}") @@ -73,12 +73,21 @@ public class VitalSignTimer { @Value("${vital-sign.mysql.password}") private String mysqlPassword; + private static volatile Map masterControlMap = new HashMap(300); + /** * 根据当前用户和患者数据库进行查询生命体征和用药信息并推送,数据库类型是MongoDB * * @author zhaoyz */ public void createAndSendMessageMongo(String database, String username, String simpSessionId) { + + synchronized (username) { + if (!masterControlMap.containsKey(database)) { + masterControlMap.put(database, username); + } + } + TimerTask task = timerMongoTaskMap.get(simpSessionId); if (task != null) { return; @@ -110,7 +119,6 @@ public class VitalSignTimer { result.put("flags", flags); simpMessagingTemplate.convertAndSendToUser(username + ":" + database, "/surgeryData", result); - } }; // 定时任务,设置1秒 @@ -200,4 +208,31 @@ public class VitalSignTimer { } } + public void changeAIFlag(String database, String username, String simpSessionId, String flag, String medicine, String value) { + + synchronized (username) { + if (masterControlMap.containsKey(database) && masterControlMap.get(database).equals(username)) { + MongoDBSource mongoDBSource = mongoDBSourceMap.get(simpSessionId); + if (mongoDBSource == null) { + mongoDBSource = new MongoDBSource(mongoDBHost, mongoPassword, mongoUsername, database); + mongoDBSourceMap.put(simpSessionId, mongoDBSource); + mongoDBSource.open(); + } + + MongoTemplate template = mongoDBSource.getTemplate(); + aiMedicineService.changeAIFlagMedicine(template, flag, medicine, value); + + HashMap result = new HashMap(); + result.put("status", 0); + result.put("flag", flag); + result.put("msg", ""); + simpMessagingTemplate.convertAndSendToUser(username + ":" + database, "/medicineData", result); + } else { + HashMap result = new HashMap(); + result.put("status", 1); + result.put("msg", "不是主控人员"); + simpMessagingTemplate.convertAndSendToUser(username + ":" + database, "/medicineData", result); + } + } + } } diff --git a/vital-signs/src/main/java/com/rax/vital/util/DatabaseNameUtil.java b/vital-signs/src/main/java/com/rax/vital/util/DatabaseNameUtil.java new file mode 100644 index 0000000..2ef52d0 --- /dev/null +++ b/vital-signs/src/main/java/com/rax/vital/util/DatabaseNameUtil.java @@ -0,0 +1,34 @@ +package com.rax.vital.util; + +import java.util.Base64; + +import org.springframework.util.StringUtils; + +public class DatabaseNameUtil { + private static final String key = "ruianxing112232323"; + + public static String decrypt(String data) { + Base64.Decoder decoder = Base64.getDecoder(); + return new String(xor(decoder.decode(data))); + } + + public static String encrypt(String data) { + if (StringUtils.hasText(data)) { + Base64.Encoder encoder = Base64.getEncoder(); + return encoder.encodeToString(xor(data.getBytes())); + } + return null; + } + + private static byte[] xor(byte[] dataBytes) { + byte[] result = new byte[dataBytes.length]; + byte[] keyBytes = DatabaseNameUtil.key.getBytes(); + int keyLen = keyBytes.length; + + for (int i = 0; i < dataBytes.length; i++) { + result[i] = (byte) ((dataBytes[i]) ^ (keyBytes[i % keyLen])); + } + + return result; + } +}