From f5728ff520d1f8a5f6b748bb496481e166c59295 Mon Sep 17 00:00:00 2001 From: KNKIM Date: Mon, 25 Oct 2021 15:10:54 +0900 Subject: [PATCH] =?UTF-8?q?=EC=B9=B4=ED=8A=B8=20:=20=ED=8D=BC=EB=B8=94=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9=20=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nlib/col/service/CartService.java | 31 +++-- .../nlib/col/service/CollectionService.java | 13 +++ .../java/nlib/col/service/CollectionVO.java | 18 ++- .../java/nlib/col/service/impl/CartDAO.java | 2 + .../col/service/impl/CartServiceImpl.java | 85 +++++++++----- .../service/impl/CollectionServiceImpl.java | 100 ++-------------- .../java/nlib/col/web/CartController.java | 22 +++- src/main/java/nlib/util/StringUtil.java | 45 +++++++ .../mapper/nlib/col/CartDAO_SQL.xml | 12 ++ src/main/resources/nlib/nlib.properties | 9 ++ .../WEB-INF/jsp/nlib/cart/listCartItems.jsp | 110 ++++++++++++++---- .../webapp/images/thumbnail/noimage-b.jpg | Bin 0 -> 11513 bytes .../webapp/images/thumbnail/noimage-m.jpg | Bin 0 -> 6219 bytes .../webapp/images/thumbnail/noimage-s.jpg | Bin 0 -> 2404 bytes 14 files changed, 288 insertions(+), 159 deletions(-) create mode 100644 src/main/webapp/images/thumbnail/noimage-b.jpg create mode 100644 src/main/webapp/images/thumbnail/noimage-m.jpg create mode 100644 src/main/webapp/images/thumbnail/noimage-s.jpg diff --git a/src/main/java/nlib/col/service/CartService.java b/src/main/java/nlib/col/service/CartService.java index 114663f4..b623beb2 100644 --- a/src/main/java/nlib/col/service/CartService.java +++ b/src/main/java/nlib/col/service/CartService.java @@ -84,16 +84,6 @@ public interface CartService */ public String deleteCartItemsFromCookie(HttpServletRequest request, HttpServletResponse response, CollectionVO cartVO) throws Exception; - /** - * 비로그인시 카트에 저장된 내역을 로그인한 후 해당 사용자의 카트로 저장하고, 쿠키 카트내용은 초기화한다. - * - * @param mbInfoId - * @param request - * @return - * @throws Exception - */ - public int saveCartItemsOfNonMember(String mbInfoId, HttpServletRequest request) throws Exception; - /** * 쿠키 카트(비로그인 상태의 카트정보) 존재하는 경우, 해당 사용자 카트(DB)로 등록한 후, 쿠키 카트 삭제한다. @@ -106,4 +96,25 @@ public interface CartService */ public int mergeCart(String mbInfoId, HttpServletRequest request, HttpServletResponse response) throws Exception; + /** + * 쿠키 카트(비로그인 상태의 카트정보)에 존재하는 자료 개수를 리턴한다. + * + * @param request + * @param response + * @param cartTypeCd + * @return + * @throws Exception + */ + public int countCartItemsFromCookie(HttpServletRequest request, HttpServletResponse response, String cartTypeCd) throws Exception; + + /** + * 사용자 카트의 자료 개수를 리턴한다. + * + * @param mbInfoId + * @param cartTypeCd + * @return + * @throws Exception + */ + public int countCartItems(String mbInfoId, String cartTypeCd) throws Exception; + } \ No newline at end of file diff --git a/src/main/java/nlib/col/service/CollectionService.java b/src/main/java/nlib/col/service/CollectionService.java index e4b5f3f0..cae817b7 100644 --- a/src/main/java/nlib/col/service/CollectionService.java +++ b/src/main/java/nlib/col/service/CollectionService.java @@ -44,4 +44,17 @@ public interface CollectionService { * @throws Exception */ public List setDetailInfoForList(List list) throws Exception; + + + /** + * 목록의 자료정보에 상세정보를 조회하여 설정한 후 리턴한다. + * + * @param list + * @param mbInfoId + * @param defaultThumbnailUrl + * @return + * @throws Exception + */ + public List setDetailInfoForList(List list, String mbInfoId, String defaultThumbnailUrl) throws Exception; + } diff --git a/src/main/java/nlib/col/service/CollectionVO.java b/src/main/java/nlib/col/service/CollectionVO.java index a1f49684..ad308158 100644 --- a/src/main/java/nlib/col/service/CollectionVO.java +++ b/src/main/java/nlib/col/service/CollectionVO.java @@ -32,9 +32,6 @@ import nlib.util.StringUtil; @JsonIgnoreProperties(ignoreUnknown = true) public class CollectionVO extends PagingVO { - // 기본 썸네일 (썸네일 존재하지 않는 경우, default url) - public final String THUMBNAIL_IMG_URL = NlibProperty.getString("item.thumbnail.image.url"); - //-------------------------------------------- // 자료항목 //-------------------------------------------- @@ -103,6 +100,7 @@ public class CollectionVO extends PagingVO { private String assetLink; /* 자산링크 */ private String regId; /* 등록자ID */ private String modId; /* 변경자ID */ + private String mUseYn; /* 관심여부 */ //-------------------------------------------- // 기타 연관기능 항목 @@ -183,11 +181,15 @@ public class CollectionVO extends PagingVO { this.title = title; } public String getRprsThumbUrl() { - return rprsThumbUrl == null ? THUMBNAIL_IMG_URL : rprsThumbUrl; + return rprsThumbUrl; } public void setRprsThumbUrl(String rprsThumbUrl) { this.rprsThumbUrl = rprsThumbUrl; } + public void setRprsThumbUrl(String rprsThumbUrl, String defaultImgUrl) { + if(StringUtil.isEmpty(rprsThumbUrl) || !rprsThumbUrl.startsWith("/")) this.rprsThumbUrl = defaultImgUrl; + else this.rprsThumbUrl = rprsThumbUrl; + } public String getUseYn() { return useYn; } @@ -691,5 +693,13 @@ public class CollectionVO extends PagingVO { this.rtnDd = rtnDd; } + public String getMUseYn() { + return StringUtil.isEmpty(mUseYn) ? "N" : mUseYn; + } + + public void setMUseYn(String mUseYn) { + this.mUseYn = mUseYn; + } + } diff --git a/src/main/java/nlib/col/service/impl/CartDAO.java b/src/main/java/nlib/col/service/impl/CartDAO.java index 6487331f..60c4e430 100644 --- a/src/main/java/nlib/col/service/impl/CartDAO.java +++ b/src/main/java/nlib/col/service/impl/CartDAO.java @@ -22,4 +22,6 @@ public interface CartDAO { public int changeCartType(CollectionVO cartVO) throws Exception; + public int countCartItems(@Param("mbInfoId") String mbInfoId, @Param("cartTypeCd") String cartTypeCd) throws Exception; + } \ No newline at end of file diff --git a/src/main/java/nlib/col/service/impl/CartServiceImpl.java b/src/main/java/nlib/col/service/impl/CartServiceImpl.java index 299ed57d..c4b7c4d9 100644 --- a/src/main/java/nlib/col/service/impl/CartServiceImpl.java +++ b/src/main/java/nlib/col/service/impl/CartServiceImpl.java @@ -77,29 +77,26 @@ public class CartServiceImpl implements CartService * @throws Exception */ public List listCartItemsFromCookie(HttpServletRequest request, HttpServletResponse response, String cartTypeCd) throws Exception { - Cookie[] cookies = request.getCookies(); - if(cookies == null || cookies.length < 1) return null; + if(StringUtil.isEmpty(cartTypeCd)) return null; List list = new ArrayList(); - String targetCookieName = CART_COOKIE_NAME + (cartTypeCd == null || cartTypeCd.equals("0") ? "" : cartTypeCd); + String targetCookieName = CART_COOKIE_NAME + cartTypeCd; - for(Cookie cookie : cookies) { - String cookieName = cookie.getName(); - if(cookieName.startsWith(targetCookieName)) { - - // _NLIB_COOKIE1=:masterId:masterId: - String cartStr = cookie.getValue(); - String[] cartItemsStr = cartStr.split(":"); - for(String itemStr : cartItemsStr) { - if(StringUtil.isEmpty(itemStr)) continue; - CollectionVO vo = CollectionVO.createWithMasterId(cookieName.substring(cookieName.length()-2), itemStr); - vo.setMbCartId(vo.getMasterId()); // 비회원 쿠키 카트의 경우, 카트ID를 자료ID로 대체한다. - if(vo != null) list.add(vo); - } - } + // _NLIB_COOKIE1=:masterId:masterId: + String cartStr = getCookie(request, targetCookieName); + if(StringUtil.isEmpty(cartStr)) return null; + + String[] cartItemsStr = cartStr.split(":"); + for(String itemStr : cartItemsStr) { + if(StringUtil.isEmpty(itemStr)) continue; + CollectionVO vo = CollectionVO.createWithMasterId(targetCookieName.substring(targetCookieName.length()-2), itemStr); + vo.setMbCartId(vo.getMasterId()); // 비회원 쿠키 카트의 경우, 카트ID를 자료ID로 대체한다. + if(vo != null) list.add(vo); } + if(list.size() < 1) return null; + return list; } @@ -525,18 +522,6 @@ public class CartServiceImpl implements CartService log.debug("updateSelItemsForDB > " + cartVO.getSelItems()); } - /** - * 비로그인시 카트에 저장된 내역을 로그인한 후 해당 사용자의 카트로 저장하고, 쿠키 카트내용은 초기화한다. - * - * @param mbInfoId - * @param request - * @return - * @throws Exception - */ - public int saveCartItemsOfNonMember(String mbInfoId, HttpServletRequest request) throws Exception { - return 0; - } - /** * 쿠키 카트(비로그인 상태의 카트정보) 존재하는 경우, 해당 사용자 카트(DB)로 등록한 후, 쿠키 카트 삭제한다. * @@ -570,4 +555,46 @@ public class CartServiceImpl implements CartService return mergeCnt; } + + /** + * 쿠키 카트(비로그인 상태의 카트정보)에 존재하는 자료 개수를 리턴한다. + * + * @param request + * @param response + * @param cartTypeCd + * @return + * @throws Exception + */ + public int countCartItemsFromCookie(HttpServletRequest request, HttpServletResponse response, String cartTypeCd) throws Exception { + + if(StringUtil.isEmpty(cartTypeCd)) return 0; + + String targetCookieName = CART_COOKIE_NAME + cartTypeCd; + + String cartStr = getCookie(request, targetCookieName); + if(StringUtil.isEmpty(cartStr)) return 0; + + String[] cartItemsStr = cartStr.split(":"); + int retCnt = 0; + for(String itemStr : cartItemsStr) { + if(StringUtil.isEmpty(itemStr)) continue; + retCnt++; + } + + return retCnt; + } + + + /** + * 사용자 카트의 자료 개수를 리턴한다. + * + * @param mbInfoId + * @param cartTypeCd + * @return + * @throws Exception + */ + public int countCartItems(String mbInfoId, String cartTypeCd) throws Exception { + return cartDAO.countCartItems(mbInfoId, cartTypeCd); + } + } diff --git a/src/main/java/nlib/col/service/impl/CollectionServiceImpl.java b/src/main/java/nlib/col/service/impl/CollectionServiceImpl.java index d8b74d94..628338ad 100644 --- a/src/main/java/nlib/col/service/impl/CollectionServiceImpl.java +++ b/src/main/java/nlib/col/service/impl/CollectionServiceImpl.java @@ -96,110 +96,25 @@ public class CollectionServiceImpl implements CollectionService { * @return * @throws Exception */ - public List setDetailInfoForList_BK(List list) throws Exception { - - if(list == null || list.size() < 1) return list; - - final int MAX_CNT_FOR_ONE_QUERY = 10; - int cnt = list.size(); - HashMap orgCdMasterIdMap = new HashMap(); - HashMap collectionMap = new HashMap(); - String mbInfoId = null; - - // 문화원별 자료ID 항목값 생성 - for(int i=0; i 0) jsonMasterId += ","; - jsonMasterId += "{'masterId':'" + vo.getMasterId() + "}"; - - orgCdMasterIdMap.put(orgCd, jsonMasterId); - } - - // 문화원별 API 요청 처리 - for(String orgCd : orgCdMasterIdMap.keySet()) { - - String jsonMasterId = orgCdMasterIdMap.get(orgCd); - if(StringUtil.isEmpty(jsonMasterId)) continue; - - jsonMasterId = "[" + jsonMasterId + "]"; - - // API 호출 - DataApiReqVO reqVO = new DataApiReqVO("/uac/service/nlib/col/listItemInfo", HttpMethod.GET); - reqVO.putInfoItem("mngOrgCd", orgCd); - reqVO.putInfoItem("jsonMasterId", jsonMasterId); - - reqVO.setMbInfoId(mbInfoId); // 통신 시, 암호화되어 송수신됨 - DataApiResVO resVO = dataApi.request(reqVO); - - // 결과 처리 - if(resVO.getResultCode().charAt(0) == 'S') { - List> recordList = resVO.getList("record"); - if(recordList == null || recordList.size() < 1) continue; - - for(HashMap record : recordList) { - CollectionVO cVO = (CollectionVO)XmlConverter.convertMapToObject(record, CollectionVO.class); - if(cVO != null && StringUtil.isNotEmpty(cVO.getMasterId())) { - collectionMap.put(cVO.getMasterId(), cVO); - } - } - } else { - log.error("setDetailInfoForCartItems > 소장자료 다건 메타정보 조회 오류(API) : " + resVO.getResultCode() + " : " + resVO.getResultMessage()); - } - } - - // 목록에 업데이트 설정 - for(int i=0; i setDetailInfoForList(List list) throws Exception { + return setDetailInfoForList(list, null, null); } /** * 목록의 자료정보에 상세정보를 조회하여 설정한 후 리턴한다. * * @param list + * @param mbInfoId + * @param defaultThumbnailUrl * @return * @throws Exception */ - public List setDetailInfoForList(List list) throws Exception { + public List setDetailInfoForList(List list, String mbInfoId, String defaultThumbnailUrl) throws Exception { if(list == null || list.size() < 1) return list; int cnt = list.size(); HashMap collectionMap = new HashMap(); - String mbInfoId = null; // 문화원별 API 요청 처리 String jsonMasterId = ""; @@ -254,18 +169,19 @@ public class CollectionServiceImpl implements CollectionService { vo.setSubjectNm (cVO.getSubjectNm()); vo.setOrgNm (cVO.getOrgNm()); vo.setCreatYyyy (cVO.getCreatYyyy()); - vo.setRprsThumbUrl (cVO.getRprsThumbUrl()); + vo.setRprsThumbUrl (cVO.getRprsThumbUrl(), defaultThumbnailUrl); vo.setInterfaceId (cVO.getInterfaceId()); vo.setOpenDivCd (cVO.getOpenDivCd()); vo.setOperReadRangeCd(cVO.getOperReadRangeCd()); vo.setOperOutRangeCd (cVO.getOperOutRangeCd()); vo.setUseStatus (cVO.getUseStatus()); - vo.setRtnExpctDd (cVO.getRtnExpctDd()); + vo.setRtnExpctDd (StringUtil.formatDateStr(cVO.getRtnExpctDd(), "-")); vo.setAwaiterCnt (cVO.getAwaiterCnt()); vo.setBookLentPsblYn (cVO.getBookLentPsblYn()); vo.setRsrvPsblYn (cVO.getRsrvPsblYn()); vo.setReqPsblYn (cVO.getReqPsblYn()); vo.setInterestYn (cVO.getInterestYn()); + vo.setMUseYn (cVO.getMUseYn()); // DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD // API에 존재하지 않을 경우, 추가 DB 조회 diff --git a/src/main/java/nlib/col/web/CartController.java b/src/main/java/nlib/col/web/CartController.java index c2aa5582..8a376d19 100644 --- a/src/main/java/nlib/col/web/CartController.java +++ b/src/main/java/nlib/col/web/CartController.java @@ -80,6 +80,8 @@ public class CartController extends NlibCommonController String mbInfoId = getMbInfoId(request); List list = null; + int cartTypeCd1Cnt = 0; // 대출 카트건수 + int cartTypeCd2Cnt = 0; // 열람 카트건수 // 카트 목록 가져오기 if(StringUtil.isEmpty(mbInfoId)) { @@ -87,21 +89,33 @@ public class CartController extends NlibCommonController list = cartService.listCartItemsFromCookie(request, response, cartTypeCd); // 카트 목록 자료에 대한 상세자료 설정 - collectionService.setDetailInfoForList(list); + collectionService.setDetailInfoForList(list, null, NlibProperty.getString("thumbnail.image.url.small")); - // 문화원별 정령 처리 + // 문화원별 정렬 처리 list = sortCollectionListByMngOrgCd(list); + + // 카트 건수 + cartTypeCd1Cnt = cartService.countCartItemsFromCookie(request, response, "1"); + cartTypeCd2Cnt = cartService.countCartItemsFromCookie(request, response, "2"); + } else { list = cartService.listCartItems(mbInfoId, cartTypeCd); // 카트 목록 자료에 대한 상세자료 설정 - collectionService.setDetailInfoForList(list); + collectionService.setDetailInfoForList(list, getMbInfoId(request), NlibProperty.getString("thumbnail.image.url.small")); + + // 카트 건수 + cartTypeCd1Cnt = cartService.countCartItems(mbInfoId, "1"); + cartTypeCd2Cnt = cartService.countCartItems(mbInfoId, "2"); } - if(StringUtil.isNotEmpty(message) && message.startsWith("%")) { message = StringUtil.decodeUrl(message); } + + model.addAttribute("cartTypeCd1Cnt", cartTypeCd1Cnt); + model.addAttribute("cartTypeCd2Cnt", cartTypeCd2Cnt); + model.addAttribute("list", list); model.addAttribute("cartTypeCd", cartTypeCd); model.addAttribute("message", message); diff --git a/src/main/java/nlib/util/StringUtil.java b/src/main/java/nlib/util/StringUtil.java index d1bcd04d..bc1f0065 100644 --- a/src/main/java/nlib/util/StringUtil.java +++ b/src/main/java/nlib/util/StringUtil.java @@ -36,6 +36,28 @@ import org.slf4j.LoggerFactory; * @version 1.0 * */ +/** + *
+ * @Class Name : StringUtil.java
+ * 
+ * @Description : 
+ * 
+ * 
+ * @프로젝트명: 지방문화원 통합자료관리시스템 구축사업 (2021)
+ *
+ * 
+ * + * @ ------------ -------- --------------------------- + * @ 수정일 수정자 수정내용 + * @ ------------ -------- --------------------------- + * @ 2021. 10. 25. KNKIM 최초 생성 + * + * + * @author 이씨플라자 * DIGITALSHIP KNKIM + * @since 2021. 10. 25. + * @version 1.0 + * + */ public class StringUtil extends StringUtils { private static final Logger log = LoggerFactory.getLogger(StringUtil.class); @@ -238,6 +260,28 @@ public class StringUtil extends StringUtils { return str; } + + /** + * 날짜 문자열(YYYYMMDD)을 받아서 화면 출력용 날짜 형식 문자열(YYYY-MM-DD)로 리턴한다. + * + * @param dateStr + * @param defaultStr + * @return + */ + public static String formatDateStr(String dateStr, String defaultStr) { + + if(isEmpty(dateStr)) return defaultStr; + + String tmpDateStr = dateStr.trim(); + switch(tmpDateStr.length()) { + case 4 : return dateStr; // 연도만 있는 경우 + case 6 : return tmpDateStr.substring(0, 4) + "-" + tmpDateStr.substring(4); // YYYY-MM + case 8 : return tmpDateStr.substring(0, 4) + "-" + tmpDateStr.substring(4, 6) + "-" + tmpDateStr.substring(6); // YYYY-MM-DD + } + + return defaultStr; + } + /** * 이메일 masking 후 리턴
* 변환 실패시 입력값 그대로 리턴
* 이메일 아이디 앞 2자리 노출
*/ public static String maskEmail(String email){ try{ @@ -284,4 +328,5 @@ public class StringUtil extends StringUtils { catch (Exception e){ } return name; } + } diff --git a/src/main/resources/egovframework/mapper/nlib/col/CartDAO_SQL.xml b/src/main/resources/egovframework/mapper/nlib/col/CartDAO_SQL.xml index e83e04e8..8635a4fd 100644 --- a/src/main/resources/egovframework/mapper/nlib/col/CartDAO_SQL.xml +++ b/src/main/resources/egovframework/mapper/nlib/col/CartDAO_SQL.xml @@ -29,6 +29,18 @@ AND IFNULL(A.CART_PROC_DIV_CD, 'N') = 'N' ORDER BY B.MNG_ORG_CD + + @@ -200,10 +235,10 @@ $(document).ready(function() {
-
+
@@ -214,6 +249,7 @@ $(document).ready(function() { + @@ -242,21 +278,32 @@ $(document).ready(function() { +
${cart.interestYn } - - 즐겨찾기 아이콘 - 즐겨찾기 아이콘 - - ${cart.rprsThumbUrl } + + + + + + 즐겨찾기 아이콘 + 즐겨찾기 아이콘 + + + + + 즐겨찾기 아이콘 + 즐겨찾기 아이콘 + + +
- - + 온라인열람 @@ -264,17 +311,17 @@ $(document).ready(function() { 대출 - + 방문열람
-
${cart.mbCartId }${cart.title } ${cart.masterId }${cart.mngOrgCd }
+
-

${cart.useStatusNm }

+
poss imposs">

${cart.useStatusNm }

${cart.rtnExpctDd }
-
${cart.operOutRangeNm }
-
${cart.operReadRangeNm }
+
poss imposs">${cart.operOutRangeNm }
+
poss imposs">${cart.operReadRangeNm }
@@ -284,7 +331,26 @@ $(document).ready(function() { - + + + + +
+
+
+
자료정보
+
이용상태
+
반납예정일
+
대출
+
방문열람
+
+
+
카트에 저장된 자료가 없습니다.
+
+
+
+ +
@@ -299,15 +365,19 @@ $(document).ready(function() {
- + - +
+
+ + +
diff --git a/src/main/webapp/images/thumbnail/noimage-b.jpg b/src/main/webapp/images/thumbnail/noimage-b.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a8789acfbea9652be74e8ef82d2d08de59a71c55 GIT binary patch literal 11513 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 b0~nC{^^xeM|7Od7F8+hS{{jR!_bLAeYs$FH literal 0 HcmV?d00001 diff --git a/src/main/webapp/images/thumbnail/noimage-m.jpg b/src/main/webapp/images/thumbnail/noimage-m.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b5b11848a53e1272bba71a8a699b98bcddc00097 GIT binary patch literal 6219 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 bnM6m~cG-5BmqO>h8vXb8Ka+udyR5$hGrVWh literal 0 HcmV?d00001 diff --git a/src/main/webapp/images/thumbnail/noimage-s.jpg b/src/main/webapp/images/thumbnail/noimage-s.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3c25fbdc5fdce9e2fa61874f4f33ba01908ebfb2 GIT binary patch literal 2404 zcmbVM3sh5Q623`z$+19WK`l~4s8v9c+$1+bN4)=ur#WwYpNCno4~aDF|wL#_UZb$mw#rJ^P(J{(t_N`R1RQ zfAoX;pMiB;wKxd?f`i=wE8rFMV*s9`5~gJX7{Ck_ivU3XGY&~nDrHPES*jojL`Wh` z5+V|^S|B5XBnlbu@l(qL!ZcV(NQ9HcQWkNdqmxJwi&(@cD3lT^W5X%ppd2|Ik@Ie( zFegpuEh75)5`5H5wL~U?l>&lVk}g#+)hwdXITKwQ#AG7DsG>|`5&aFUgy_&P0vnOT z1c*fQ6jDHtz+jL-I>carTM1MONF`Iy55p6rGa&|(x{a_1BFZKgB{9P}yhSc_$09CX zDl03Cltm*U@?P6=Vnj+XcoZZeDkY1E zM*8v!5?N^IlH(P#C6O5JWz<$E!{Jw9tf;Ms%$C9Aa9Dw;u!!ghNhB6AY2N-`95#(Z;2qZ5C_G*Fv zX685xYYb+Y#JIErus8sVG0>SC1?U!IhBseh-})C9x)LNh_zNtk0j_Tr;Qz~3KMbtK zVNg~a9`FO^zsz5bJv%p^>z<9#UEj0SY&oo(b>n_lu8kM0dfzk%jQ{)t6B#dd<|zpw z#+=}A%@dQ!l*`95ZIAS?(Nx#?`hwQ?n+EQD+c`6fubo}B{?LGH6zo4#@ta%JiP;Aw z`E!S370)}nC%b))oMO_$^Pchh^4dq3KRmTfq__8edUjQ1MMcieo306?{~EYz|FoG@ z{7!>z)2_Y*2$y6ijd^tL^v3(i(*b79b||PFajqJ#M^^=dQq47}Y#+<~-oTj#`z9+^ zPWLa`zP{_#ld2DQtv>j8%Rr&9?+JVJuCe4Q^R3YBsY+@?BX37bZF1x5Q_-_>zdDC* z-vIkx9!=-rV+x%;haE;eNPms}^wykN>aT-e?bZVxKbrXz9_rxg9OB zXDpMPzTcc!%CzfyQuPs&a;~j8s`iVITxOcRI$WksIn9NoszTE;EH#<^o8~i0k&?|H zzSa&#Tq~)oI>5qbJbN&1QH{i9h}y(;h_5Ro+)lZ$m-vo$Ct!QdMnRU z9%OEC&aE43WcK#sED85xExp~IAFnLF82f{T&Np?;{YzGV`sn5An9`__pfKA{V%Fz{ zGn{py#U7`LohKc%w``uE<#E3-{WY37zjnJ##;)6Q@Eh%Z>$VY1Wk#R&1mml>-R?Pc zbaG?ukHOn0@lSvdr)Zr|Q+@qDF#f%iYM1)+xJcXF0u^VvasBSek)zIqiNZEM{`4i$ zC&1Z+jWsj-8{whGlZY_8|LE9S561{$R~uF$E&#iQ+q(MB?3{bTRt0p!OGLl3)azhz%7tGtnfh4@(_E}yR(QF9$%oZ?BpDLU-@ zPN1hWs}vK{(fGG)i_@<6lhudIYtr>Vik4pv;o^AbNRRoktB1ds9*w2XSXVVPT&R0k zRUBy@-&k)OYZq!ACg zJKp5o7|n?;2e-zhtm|}v?6gy74`~x1Ro>?|6;JEjPj0aVo(f5tqMjqYZ=Koy9Ud$e z+Vm7PjgQZM?OcNnh2M