From 5f63af12bdd96545f3b4c918c41e73f63a9a3e15 Mon Sep 17 00:00:00 2001 From: "LAPTOP-SB56SG4Q\\86185" Date: Mon, 21 Mar 2022 19:06:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=BC=80=E6=BA=90=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=9D=90=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +- plugin.xml | 19 ++ src/main/java/com/fr/plugin/HttpUtils.java | 265 ++++++++++++++++++ src/main/java/com/fr/plugin/NDConfig.java | 70 +++++ .../java/com/fr/plugin/NDXloginFilter.java | 107 +++++++ .../XGlobalRequestFilterPlaceHolder.java | 110 ++++++++ .../resources/com/fr/plugin/demo.properties | 1 + .../com/fr/plugin/demo_zh_CN.properties | 1 + 技术文档.docx | Bin 0 -> 34002 bytes 9 files changed, 577 insertions(+), 1 deletion(-) create mode 100644 plugin.xml create mode 100644 src/main/java/com/fr/plugin/HttpUtils.java create mode 100644 src/main/java/com/fr/plugin/NDConfig.java create mode 100644 src/main/java/com/fr/plugin/NDXloginFilter.java create mode 100644 src/main/java/com/fr/plugin/XGlobalRequestFilterPlaceHolder.java create mode 100644 src/main/resources/com/fr/plugin/demo.properties create mode 100644 src/main/resources/com/fr/plugin/demo_zh_CN.properties create mode 100644 技术文档.docx diff --git a/README.md b/README.md index 4536257..82de28b 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ # open-JSD-8075 -JSD-8075 自定义token单点 \ No newline at end of file +JSD-8075 自定义token单点\ +免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\ +仅作为开发者学习参考使用!禁止用于任何商业用途!\ +为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系hugh处理。 \ No newline at end of file diff --git a/plugin.xml b/plugin.xml new file mode 100644 index 0000000..5ec3880 --- /dev/null +++ b/plugin.xml @@ -0,0 +1,19 @@ + + com.fr.plugin.nd.login + + yes + 1.0.2 + 10.0 + 2020-07-31 + fr.open + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/fr/plugin/HttpUtils.java b/src/main/java/com/fr/plugin/HttpUtils.java new file mode 100644 index 0000000..8fba4ab --- /dev/null +++ b/src/main/java/com/fr/plugin/HttpUtils.java @@ -0,0 +1,265 @@ +package com.fr.plugin; + +import com.fr.base.FRContext; +import com.fr.base.ServerConfig; +import com.fr.base.TemplateUtils; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.StringUtils; +import com.fr.third.org.apache.commons.io.IOUtils; + +import javax.servlet.http.HttpServletRequest; +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.Base64; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +/** + * http请求工具类 + * + * @author fr.open + */ +public class HttpUtils { + + /** + * 返回当前系统的回调地址 + * + * @return + */ + public static String getCallBackUrl(HttpServletRequest req) { + StringBuilder url = new StringBuilder(); + try { + url.append(req.getScheme()); + url.append("://"); + url.append(req.getServerName()); + if (req.getServerPort() != 80) { + url.append(":"); + url.append(req.getServerPort()); + } + url.append(TemplateUtils.render("${fineServletURL}")); + url.append("/url/authorizationCallback"); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + return url.toString(); + } + + /** + * 返回当前系统的根路径 + * + * @return + */ + public static String getDefaultUrl(HttpServletRequest req) { + StringBuilder url = new StringBuilder(); + try { + url.append(req.getScheme()); + url.append("://"); + url.append(req.getServerName()); + if (req.getServerPort() != 80) { + url.append(":"); + url.append(req.getServerPort()); + } + url.append(TemplateUtils.render("${fineServletURL}")); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + return url.toString(); + } + + /** + * get请求方式 + * + * @param path + * @return + */ + public static String httpGet(String path,String token) { + StringBuffer buffer = new StringBuffer(); + try { + URL url = new URL(path); + //打开和url之间的连接 + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); + conn.setRequestProperty("Accept-Charset", "UTF-8"); + conn.setRequestProperty("token", token); + conn.setRequestMethod("GET"); + conn.connect(); + //构造一个字符流缓存 + BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); + String line; + while ((line = reader.readLine()) != null) { + buffer.append(new String(line.getBytes(), "UTF-8")); + } + //关闭流 + reader.close(); + conn.disconnect(); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + return buffer.toString(); + } + + /** + * post请求方法 + * + * @param path + * @param param + */ + public static String httpPost(String path, Map param) { + String var3 = getParam(param, ServerConfig.getInstance().getServerCharset()); + PrintWriter var4 = null; + BufferedReader var5 = null; + String var6 = ""; + HttpURLConnection var8=null; + try { + URL var7 = new URL(path); + var8 = (HttpURLConnection) var7.openConnection(); + var8.setRequestProperty("accept", "*/*"); + var8.setRequestProperty("connection", "Keep-Alive"); + var8.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + var8.setRequestProperty("Accept-Charset", "UTF-8"); + var8.setRequestMethod("POST"); + var8.setDoOutput(true); + var8.setDoInput(true); + var4 = new PrintWriter(var8.getOutputStream()); + var4.print(var3); + var4.flush(); + + String var9; + for (var5 = new BufferedReader(new InputStreamReader(var8.getInputStream(), "UTF-8")); (var9 = var5.readLine()) != null; var6 = var6 + var9) { + ; + } + } catch (Exception var18) { + if (var8 != null) { + InputStream errorStream = var8.getErrorStream(); + if (errorStream != null) { + try { + String s = IOUtils.toString(errorStream, StandardCharsets.UTF_8); + FineLoggerFactory.getLogger().error("resp logger :{}", s); + return s; + } catch (IOException ioException) { + ioException.printStackTrace(); + } + } + } + } finally { + try { + if (var4 != null) { + var4.close(); + } + + if (var5 != null) { + var5.close(); + } + } catch (Exception var17) { + ; + } + + } + + return var6; + } + + /** + * 发送json 模式的请求 + * + * @param url + * @param param + * @return + */ + public static String sendJsonPost(String url, String param) { + FRContext.getLogger().info("请将后面的内容发送给开发者:" + new String(Base64.getUrlEncoder().encode(param.getBytes()))); + StringBuilder sb = new StringBuilder(); + PrintWriter out = null; + BufferedReader in = null; + HttpURLConnection conn = null; + try { + URL realUrl = new URL(url); + // 打开和URL之间的连接 + conn = (HttpURLConnection) realUrl.openConnection(); + FineLoggerFactory.getLogger().info("打开链接:" + conn.toString()); + // 设置通用的请求属性 + conn.setRequestProperty("accept", "*/*"); + conn.setRequestMethod("POST"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("Content-Type", "application/json; charset=utf-8"); + conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + // 发送POST请求必须设置如下两行 + conn.setDoOutput(true); + conn.setDoInput(true); + // 获取URLConnection对象对应的输出流,设置utf-8编码 + out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), StandardCharsets.UTF_8)); + // 发送请求参数 + if (StringUtils.isNotBlank(param)) { + out.print(param); + } + FineLoggerFactory.getLogger().info("发送参数[{}]:" + out.toString(), param); + // flush输出流的缓冲 + out.flush(); + // 定义BufferedReader输入流来读取URL的响应 + in = new BufferedReader(new InputStreamReader(conn.getInputStream())); + String line; + sb = new StringBuilder(); + while ((line = in.readLine()) != null) { + sb.append(line); + } + FineLoggerFactory.getLogger().info("接口返回值:" + sb.toString()); + } catch (Exception e) { + if (conn != null) { + InputStream errorStream = ( conn).getErrorStream(); + in = new BufferedReader(new InputStreamReader(errorStream)); + sb = new StringBuilder(); + String line; + try { + while ((line = in.readLine()) != null) { + sb.append(line); + } + } catch (Exception ee) { + + } + System.out.println("错误响应:=======>>" + sb); + } + System.out.println("发送 POST 请求出现异常!" + e); + e.printStackTrace(); + } + // 使用finally块来关闭输出流、输入流 + finally { + try { + if (null != in) { + in.close(); + } + if (out != null) { + out.close(); + } + } catch (IOException ex) { + ex.printStackTrace(); + } + } + return sb.toString(); + } + + private static String getParam(Map var0, String enc) { + String var1 = ""; + Set var2 = var0.keySet(); + Iterator var3 = var2.iterator(); + + while (var3.hasNext()) { + String var4 = (String) var3.next(); + String var5 = var0.get(var4) + ""; + + try { + var1 = var1 + (var1.length() == 0 ? "" : "&") + URLEncoder.encode(var4, enc) + "=" + URLEncoder.encode(var5, enc); + } catch (Exception var7) { + ; + } + } + + return var1; + } + +} diff --git a/src/main/java/com/fr/plugin/NDConfig.java b/src/main/java/com/fr/plugin/NDConfig.java new file mode 100644 index 0000000..e18d494 --- /dev/null +++ b/src/main/java/com/fr/plugin/NDConfig.java @@ -0,0 +1,70 @@ +package com.fr.plugin; + +import com.fr.config.*; +import com.fr.config.holder.Conf; +import com.fr.config.holder.factory.Holders; + +@Visualization(category = "单点配置") +public class NDConfig extends DefaultConfiguration { + + private static volatile NDConfig config = null; + + public static NDConfig getInstance() { + if (config == null) { + config = ConfigContext.getConfigInstance(NDConfig.class); + } + return config; + } + + @Identifier(value = "valAddr", name = "接口地址", description = "接口地址", status = Status.SHOW) + private Conf valAddr = Holders.simple(""); + @Identifier(value = "frUrl", name = "报表地址", description = "报表地址", status = Status.HIDE) + private Conf frUrl = Holders.simple(""); + @Identifier(value = "appId", name = "sysId", description = "sysId", status = Status.SHOW) + private Conf appId = Holders.simple(""); + @Identifier(value = "clientSecret", name = "clientSecret", description = "clientSecret", status = Status.HIDE) + private Conf clientSecret = Holders.simple(""); + + public String getFrUrl() { + return frUrl.get(); + } + + public void setFrUrl(String frUrl) { + this.frUrl.set(frUrl); + } + + public String getAppId() { + return appId.get(); + } + + public void setAppId(String appId) { + this.appId.set(appId); + } + + public String getClientSecret() { + return clientSecret.get(); + } + + public void setClientSecret(String clientSecret) { + this.clientSecret.set(clientSecret); + } + + public String getValAddr() { + return valAddr.get(); + } + + public void setValAddr(String valAddr) { + this.valAddr.set(valAddr); + } + + @Override + public Object clone() throws CloneNotSupportedException { + NDConfig cloned = (NDConfig) super.clone(); + cloned.valAddr = (Conf) valAddr.clone(); + cloned.appId = (Conf) appId.clone(); + cloned.clientSecret = (Conf) clientSecret.clone(); + cloned.frUrl = (Conf) frUrl.clone(); + return cloned; + } + +} \ No newline at end of file diff --git a/src/main/java/com/fr/plugin/NDXloginFilter.java b/src/main/java/com/fr/plugin/NDXloginFilter.java new file mode 100644 index 0000000..d2f63a1 --- /dev/null +++ b/src/main/java/com/fr/plugin/NDXloginFilter.java @@ -0,0 +1,107 @@ +package com.fr.plugin; + +import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; +import com.fr.decision.webservice.v10.login.LoginService; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.transform.ExecuteFunctionRecord; +import com.fr.plugin.transform.FunctionRecorder; +import com.fr.stable.StringUtils; +import com.fr.web.utils.WebUtils; +import org.json.JSONObject; + +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.HashMap; +import java.util.Map; + +@FunctionRecorder(localeKey = "ffe") +public class NDXloginFilter extends AbstractGlobalRequestFilterProvider { + @Override + public String filterName() { + return "ndLoginxxxxxxx"; + } + + @Override + public String[] urlPatterns() { + return new String[]{ + "/dee" + }; + } + + @Override + public void init(FilterConfig filterConfig) { + NDConfig.getInstance(); + FineLoggerFactory.getLogger().info("登录插件初始化"); + super.init(filterConfig); + } + + @Override + @ExecuteFunctionRecord + public void doFilter(HttpServletRequest request, HttpServletResponse httpServletResponse, FilterChain filterChain) { + try { + String token = WebUtils.getHTTPRequestParameter(request, "token"); + if (StringUtils.isNotBlank(token)) { + NDConfig ndConfig = NDConfig.getInstance(); + String url = String.format("%s?Token=%s&Sys=%s",ndConfig.getValAddr(),token,ndConfig.getAppId()); + Map params = new HashMap<>(); + params.put("Token", token); + params.put("Sys", ndConfig.getAppId()); + String json = HttpUtils.httpPost(url, params); + if (StringUtils.isNotBlank(json)) { + JSONObject jsonObject = new JSONObject(json); + String result = jsonObject.getString("result"); + if (StringUtils.equals(result,"True")) { + String empNo = jsonObject.getString("empNo"); + login(request, httpServletResponse, empNo); + } + } + FineLoggerFactory.getLogger().info("登录认证,收到token :", token); + } + filterChain.doFilter(request, httpServletResponse); + } catch (IOException | ServletException e) { + printException2FrLog(e); + } catch (Exception e) { + printException2FrLog(e); + } + } + + public static void printException2FrLog(Throwable e) { + StringWriter writer = new StringWriter(); + e.printStackTrace(new PrintWriter(writer)); + String s = writer.toString(); + FineLoggerFactory.getLogger().error("错误:{}", s); + } + + private void sendRedirect(HttpServletResponse res, String url) { + res.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); + res.setHeader("Location", url); + } + + + private void login(HttpServletRequest req, HttpServletResponse res, String username) { + String token = null; + try { + token = LoginService.getInstance().login(req, res, username); + req.setAttribute("fine_auth_token", token); + FineLoggerFactory.getLogger().error("login success"); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + FineLoggerFactory.getLogger().error("login failed"); + } + } + + private boolean isLogin(HttpServletRequest req) { + return LoginService.getInstance().isLogged(req); + } + + +} diff --git a/src/main/java/com/fr/plugin/XGlobalRequestFilterPlaceHolder.java b/src/main/java/com/fr/plugin/XGlobalRequestFilterPlaceHolder.java new file mode 100644 index 0000000..b2f356d --- /dev/null +++ b/src/main/java/com/fr/plugin/XGlobalRequestFilterPlaceHolder.java @@ -0,0 +1,110 @@ +package com.fr.plugin; + +import com.fr.decision.ExtraDecisionClassManager; +import com.fr.decision.fun.GlobalRequestFilterProvider; +import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; +import com.fr.event.Event; +import com.fr.event.EventDispatcher; +import com.fr.event.Listener; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.injectable.PluginModule; +import com.fr.plugin.observer.PluginEventType; +import com.fr.stable.StringUtils; + +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Set; + +/** + * @author fr.open + */ +public class XGlobalRequestFilterPlaceHolder extends AbstractGlobalRequestFilterProvider { + private static final String CURRENT_PLUGIN_ID = "com.fr.plugin.nd.login";//需要求个这两个配置 + private static final String CURRENT_FILTER_NAME = "ndLoginxxxxxxx"; + private static GlobalRequestFilterProvider PLACE_HOLDER_IMPL_FILTER; + + @Override + public void init(FilterConfig filterConfig) { + Set providers = ExtraDecisionClassManager.getInstance().getArray(GlobalRequestFilterProvider.MARK_STRING); + if (providers != null) { + for (GlobalRequestFilterProvider provider : providers) { + String filterName = provider.filterName(); + if (StringUtils.isNotEmpty(filterName) && CURRENT_FILTER_NAME.equals(filterName)) { + PLACE_HOLDER_IMPL_FILTER = provider; + break; + } + } + } + + com.fr.stable.Filter filter = new com.fr.stable.Filter() { + @Override + public boolean accept(PluginContext context) { + String pluginId = context.getID(); + return context.contain(PluginModule.ExtraDecision, GlobalRequestFilterProvider.MARK_STRING) && CURRENT_PLUGIN_ID.equals(pluginId); + } + }; + Listener listener = new Listener() { + @Override + public void on(Event event, PluginContext context) { + Set providers = context.getRuntime().get(PluginModule.ExtraDecision, GlobalRequestFilterProvider.MARK_STRING); + if (providers != null) { + for (GlobalRequestFilterProvider provider : providers) { + String filterName = provider.filterName(); + if (StringUtils.isNotEmpty(filterName) && CURRENT_FILTER_NAME.equals(filterName)) { + PLACE_HOLDER_IMPL_FILTER = provider; + break; + } + } + } + } + }; + EventDispatcher.listen(PluginEventType.AfterRun, listener, filter); + EventDispatcher.listen(PluginEventType.AfterActive, listener, filter); + EventDispatcher.listen(PluginEventType.BeforeStop, new Listener() { + @Override + public void on(Event event, PluginContext context) { + PLACE_HOLDER_IMPL_FILTER = null; + } + }, filter); + } + + @Override + public String filterName() { + return "GlobalRequestFilterPlaceHolder"; + } + + @Override + public String[] urlPatterns() { + return new String[]{ + "/*" + }; + } + + @Override + public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) { + try { + process(request, response, filterChain); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e, e.getMessage()); + try { + filterChain.doFilter(request, response); + } catch (Exception ex) { + FineLoggerFactory.getLogger().error(ex, ex.getMessage()); + } + } + } + + public void process(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws Exception { + if (PLACE_HOLDER_IMPL_FILTER == null) { + if(FineLoggerFactory.getLogger().isDebugEnabled()) { + FineLoggerFactory.getLogger().debug("[GlobalRequestFilterPlaceHolder] placeHolderImplFilter 为 null"); + } + filterChain.doFilter(request, response); + } else { + PLACE_HOLDER_IMPL_FILTER.doFilter(request, response, filterChain); + } + } +} diff --git a/src/main/resources/com/fr/plugin/demo.properties b/src/main/resources/com/fr/plugin/demo.properties new file mode 100644 index 0000000..9bc5f29 --- /dev/null +++ b/src/main/resources/com/fr/plugin/demo.properties @@ -0,0 +1 @@ +Plugin-Test_Function_Abs=Test ABS \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/demo_zh_CN.properties b/src/main/resources/com/fr/plugin/demo_zh_CN.properties new file mode 100644 index 0000000..aa910e8 --- /dev/null +++ b/src/main/resources/com/fr/plugin/demo_zh_CN.properties @@ -0,0 +1 @@ +Plugin-Test_Function_Abs=测试ABS函数 \ No newline at end of file diff --git a/技术文档.docx b/技术文档.docx new file mode 100644 index 0000000000000000000000000000000000000000..05be85682d38ebce7352437bd82dc6aca4c8c9f6 GIT binary patch literal 34002 zcmb@tV~{RQ(=|G_ZQHZQwr$(CZQI^s+vXnIwr%6=`~LJkZ=CPPi8vi`MR#1aqPucs zS5@Z9YI!MO5Ga6ujxgDM{(sK@>wx@wVQgn4?`UW5L@)mrhVu6hh<{y+9&tp~;~hl=T=) z*o~;y+c&Kh#%l=!sgYhM@qw|$VkGdyK3+$#7C*1SH!ePlpK--meY;#yiYQ|YdO{sa zk0=vmb4(X{ws!Z<@m*_SwUkW%X(1a61Z{5b928CAE8_sBj}BzX#c3hCU#hwdwjrW_ zgK~L@7)0Tp1I@0!1Ez4)H;ua3{irCio=5Qz$;rpCX(cozrGFAQ*~RU7_D(RWANspq z0WJnl!Cul8uujdfFB1$g2L}k~gMjR%cdwu2*%j+T=0|#Z9@qKuMV1PxX+O_#8fBG} z&773@E0F#2dF;mT#dGojlxMi0V!3jp^K(Sy?#e3%wX$M5Rm~*J=AmKKT_a7Z=eVn^ zweMJz|7E+-^PV%e#AcGPde7124(dNWB;?tvukhDHzJEQ0_+LF_Want|kBfW~6|4pr zP(pUVKj2AkZ01q^q_7U)@KVAYr(e>NsKHt-#2c&re9dcejSS<_pKRXbW@Q=rR#cus zESHO>QOH0<@<)kMb<@vXm}1VzA9AlGs>OsN<@D!sboNpQkBJ!Vt+9etsqGf<&(ooo z2!r3q#MUE&m$gd;3V}PUtY&`5uk)~Kd*AZtOOB$f?6x1~9>8H_C4_?&p%Bk|uUCMJ z2jmB0HMz0ND1Kf&>07;+3Ds`0TOG}iT`~`Kn@BkzioJ}L&#kuD%$xc|$MgN!cseiE zV^Qt!q6Q2{ReU^fGzjpDR{%Inb5J{?)#A2E4ObA9kT#cIfb|$9*N`3c3aG8g?*-OX zk1>e?J~gj&Z&d7XiWPKAiR9{q1K*^Kk27PW z1z3)0wO8IUGi<`=O!aws7^(YjBc$@pXYua1WOy!NTwlfEP-o zlYs!0w<8Aerrkcd^J_tPpEjL}7Meh!pY7FjbW`T$)X#?qcp@OKr`;k2PBA`z5~-Xd zVO*p?4wusnE#%aneFRJ_-%3c}GLRYvy&VQAjDGL$rlig6^@Zfm?N~6u@ZSBhPN%;fS z?awtkDOY2t_~<^f1cSG_Yps&R6ufal=G0}wC|!z(@2JE#5qcVdND>HzHYc*3u>$vt z_O31tH^lxITb#lv_boHDFt-c2ovU`(NbYUWtMB>tmacWTOAd`${fr>uL;1%L(@PdS z-_P2|l0zzA2)9!oe>Sez_M*$nVMCkqXN#kCl zvYIwFd4~;?yVhb#e>vCN-cbA`+@z6;b<&Q4$pJVcxuyvUUC@W*Vv}@2z@nW5x6d

vrZ<*ui6yls*uSP^n@yjmo9H5J3Kj$ePylG9;UCc0 z@1+%gmcF1*H+&kQ)g8y3oM#GqYHTyOBfSQ6e(im+b}0HR)Ab*v4#vyIYd1Ei__HVs zy)AC>1e1Zj-2btouOpS-Iv>#Kg7N;oN*r;+e93<*$2Q}Jq66MJX%MNfa?7)w=P#Po zExGP=JKs;a?XmYu1+H(RqNbSqd=QHx|J4}q{DMlpPN^AuDvnr1dk|735QlC^X7$$i z$eYaaD;0EWrH+OpY5hQ&mC({XmQ_lO8oBd8<}!w@o^N}o-yJ#ZKn5pPcLt_AjINq><>e88oI6KAy?+Z*K;pcjUh4v$!_Q1$;v$Q}zrnBY(|_BRzvnkn<0Ccjqp7PRxOjYB=)@D4#Vv#Ub+wo zBSa^%)A(2MG+;QfFORFLW^0!^p&c~2J?3TR43bDN3ED`saC+W|Oo$&qJ_IGm4~ zvkoVYI49vDjS$ySC}a>mMj*K9BkWC}t$@idg2J?f}yD`B9 zm=HnfTn>m+w8S}eUP!ScysWsHt*GlAdrM>ek=~Txbpa-U!Z64Fs`+D}PSUgjX_0CI zrsPyeyV)oPqmXSg&-r3Kd%0ER%@CN^qreUSle8v-tiP6cbHaQW$lbo!$V#^hh_mEi^l^78a33mtuP`+eV>t1iJ8Bgs2#wt11WP%|8Te3LNlSE9mOwG-AwB@k3!YS zwnq_!z{N4x-mn>Dh~*vi>46QY0xVy;;!a_ir8QY;YpA3iUG~wg38|wlLQ7HGV0)@P zPh<6WdP}-P2`$sBmOBv+$XB)5iMDEESxR(vI(8J?Ii;2gF7U0+r+d~sP-ryJj8<6| zdVcR}Hx5C$BM&sR^A>R;a_s~jJ*t20*a@D z5*=9RQ(BQqzPcKQQ=EPUVVM3JupN$A)q5yy*T1FsW11K}ik;rRha8-ZJj;Yeni@oF z+#M3y8)%VLg1%S`Z|FBN&tC)knA*IA!-h(flGdu($r*=*{9KjpH^S4ohlM1lmDt?Y z|8C?|@c?AG0^04r{sc_=$ZUMOYoCO=P&0y>y6+f*d(gOLFPEYgOr(QCNGV*3ny$PL zB~8@;5k)awrc0c9%4|6DDh-2tzaBF_f$&2G>#Zn47_TS=QKXCrMEMlN?|1~mM{>&Q zYK-Hn`Wq0A@7F1i1MB)vwp!_)2@pX%k{F2MemK7*4x)GjF%YGLFac>SMA4AL&E#Gb z=wm7Kn`Iv*qfH-WLdpd&x1>J3zWC=UG8nSrDrTXc8+N7-UOFCV4HtzV-Cj$P?`FKx5gzeW z@+(!F-tn}xg*rQClbvQ4)s@s60jFK&Oxm!?i7<1InL16|v9G+a%F^jCuR6zPw$fSV zKmjOk!ODnQD$w)R5-!{(cx;AdDJq!{<)66Fs{?@GbG}PO+UGvB89L&=nNoNPWwp<}XAdgNkqTdq`+4JZnutsSrvu zD_qdTmxDu2d_dYFw$N`qNm_b#XF?nU8Mi&)}y?@KKeTo(j=C?&P7a+(qVmp@tKhLN$d zUFF&+cO{M*QEVxrnqB3>%lk5<4QO^$3C-@v5tl<*l7@;QnkSn3GDp8Ggr=5I{U8%k5PnM)H?Y1(J)m;hF|Ga&K zu+ZGwR>_ zGr82DZ@)syeJ8Se0D*5l^zAw~A6sZy))MzHG;O15ZnZ1fMoZZ$S{R|e8j`X#mk?QR z-Q}q1q(ie;!A%C-K!Jr-OE|wT;McZreh(;lC}W~&@raK0ETb>R)?Hqdb3a#im3yxC z?fzzPi5byyW6~I0BD7O_xp2IAZ0uqVOWG`SIVeE;Fou!aII_PulJbignw1DXH=ar2Rbg;Dw)X4)Bxpz|duq z&ebN_MZmEP?<^lbe8Ja7QxIspOj?dtP}f z(pjaoZ(F+Gp%r=p6MOL?lha5gbTm=F%V&BjtV66;Zy9&t%AmmYkahLD3yc&;{Ny|F z+C_4m+ts`+nhJANM0p%IBYK2qz)Z!uW4P^SAA0&>KM(`S!gld@KSj zXmvx{ADVVliWMpfNs5(U6i$lyy5qY)4eJw)bXgsQaTVp;H8?e{Dd0wxJREoRbIVt7 z530GhzxWpLTdrNQBjKeQRfAb1{(OlpT@?Vfnv-rme?DLEzYSHSi&cKY40~oh zgqZiFbD!;zM`qZb#8ErnRE1U2OzBo~p&I6u*!_^_9SP%L+XD}#`6t{Q?B(?m-hh$d z#rWAm)ORfGuq00XH$=R@zw>7Nel8y3{Jg&(@^bxNvs9!j4J>?q(W%C_Q|Xc>Rc4Oz ze*PQ3{~tj>enkt05Ci}q;BQF(PrCVU{O)Ap>}+9c_HTIJtg0neapXYnJH@-iQq zni@etyv__<_$!F4?&FfAGzMLdXv3oP^PMNwXn+ndU*k$C`yuCJs^|4Hsj(j~xkQmB z@YWayhX1hPw_z&;-gVNR2g7V=cpw9%J|d0)cpkmq&(%JH1q0aHBY+A7?wvPc^04xp zdC>zB`y6=#P{6J#l`PD6#a1}-le*fV_I)Hqrh@2{gEJ@IOrUCvHb^s)LZ#uTMNLtv zmXQci`_??pdR&@3e*FcBQN{{Rumw#l3d5rSl+L`Qm(8bIvq5;VT7w^bIFDKG4MObB zf%PDdxC*zF_Ye=YJY`1EvO2-Ec3ZamT@_h&kK$wYIkNQA=o+4e3I$$lmeNVPY3-p` z#Z^UHeg@Ha3MO`+XaB>gDR~hQ=3ohD@WL(<*SUlwFS{^m8BSF26-I1O0w~m*OlJCd zWWoXNTEF7*YC>e7=rfOip5RD&e&_0B{gIqiG0hGOLXnR@W5RrwA?Lc2%LH}eI%Nn|1V~8nriV_k{PVrsdaOm-z$o9 zQ4eJYeO$;V#{jl*oG!oxsm~%%dTNJSBjb0+= zN$_Ik=iT2Ld)pFH9V~o(yNc%S5_f9VQ=w38U>(#`F@4dEs&S#l-GpKqS)nU78H-nx zF!BhoTgPQr*X=2wAP`HDJ(j0z-~&)?HCa8AQ@yYfRj8@hSl~)d#_7xkitiw51+S3` z@|&h~gT2@NUU2?(6bA0I!A%ZoGyO&!JTZs(#X?6^NmtEULabX$IW6RVRC&NfRL^7x8x_*2lroFmld8f!E;E~9Z+&8h$xHYP4YfO38BvL2bSu^sq;29Qd zd_9b78@OCN_GDWuz&BYwBX6Y@ezi5H;Y!|7D8)%papwZkiMmG=xg7WJ%>rg34j8jqY-lVxGgEJ+p`J30a20gtMw;CW_oD!>R35F}E-& zmHXiJ)0R`Uel_Z}L8R-L=A$ybhNW#7JtSSpYF#$<-_96L!H?P0jc(!51aT3md7YXg z%Vjw;dxNm|Scq{wG&RPuJ}`Ti;1(dIMHnh`?+-tUN$p4u9|A^N$!UYsipxNCwjLbq z{NMF}zd8T^m`|L|O>9j5n<}uVcQElA3;-Yn8vp?HKY{UBiiSP`Fqv2oe5-Mjp8HY~%jwY|O+Ye+}IYS1zZjW=APMFAl4qMG~)8emBFC z6e%ClJLO{PyvT9iB0*4CL=uT`d(L?I@Hrklq2G+eSSJ=##AE9|UyBSAzkDE!2`X`` z-r;H7CoH$;9*Q0*I+F>1q^t6I?f2-a5JW-*c`#~^%+f7WZs@2Z@WB|qr;!tfxe?VC zR_`x_Knn%B3EB*&rBS7tfJQ8-4>QCGSgkBXe1i0RexRrC@wnZ%^18jKHsR!iLHQ$j z4wx5_yUd>*0mijiZ5f= zJ9&|r=d8 z#{Ya!b?I8HTi*T}_*smZg7kEWN`zoL0@_1qA| zMi8Z!+wV5Rl4?b_?Jp>Lu!Y$qYu=hAIYUT1%__A=4WL(EbV~_UL0C&yZ8&7aQoBs# zofJg}z#MNNVpK#1iD`fz*&b6E@LQd_uMz}(dzDac8pc9L{5_DY;>;&o-#og!OHHoV z@9B||v+dzWjg zhzE`&wtiWWsJBoM+{YwPBNKNd7R`a!T?fD?8IV5KjuY%fkWsZs_@S7=(O)aO5e>aq zp{>XTbzl>JM4;V~k#66WVVinkYq&mXXPO;wdvbiup8xbNQ#w7pBbO{upV65GJA3`~4$?>v0?M|d+D$Vm&fRBV$!Wv16t z-SDMTa_yqdGv#UWn6Mx>j7xgPhA#AR%j^V}JGK>)dFT@9DK~p3sqrO`{KVtS`#qW4 z#DKuO8@(RertvEF__{+Zxjr|O!BHbKrZu?PY&ArHX9kB`!WT+P@U@H!6NSBvU!Msa zvW7RG>N12qK*nonK@cb-5{^W&EqJg1lP;zDuI^6lxlCgv3}FHXsgjnrX;8|Ooy+Rb zFj^&mW7ae>waNd0N{cfM3Uo(TOhX0R#o9*2D3ee`OzXM_AS8UolAI zUCLh)(n0M{4yg?$zDG@2b$F*tiJc~G0;#lpR@-LSFK_vYiq`vnH5D7^7L)cFR*$Xs zs)yC(rUH{%J9AT~s{Y3KW}zmCwY3~G7xq?>b~O+lndU7~9v_Je*Ja-n17=0z!kDj> zLjA;4gj~T5MSKL_oH{elQlsN2l~L5AbH>?gTU~%s5!Zd-Rq&flR!sJpeX2mwA*#R71W@ zt1PGGnxW4)*OvB8zP{B&Y|;%f7}rjA`+2r5_mqAqqN}0J$Z;svFRwNc1M_5DV`;<5 zR+B$=4X?XoB%Z)MOc+e0)z-k8AK3p{y2%=qU~>Aqq(x)=mst95AVs&hDq{1PgYuP3SW)L&iiJ z_=A;_%ePrSH$4Lbg9Vl@UQd+n&Y|Dh(Ds_%_w7$l9~E-vwSgW+-@u6~|5cy{a-ilJ zbF0;=5cd%WD{;26@Hm-nrZQD*%mSdnkuzP=6h-(iL!)VdZT5TY@GL~G+BEF^Rd5Z| z0d5la$U4h)A?q4haDOh5feaUIG3Ed_Q+87!DASxb)uLJcf_RepCc!!45`CW1Q(`qG zyhxhgBqf-x0^s`(nL-;Qt8{GahP0~X^=pJ!x!4Dw%v_7a^c?r9-uB`70NQh=tAjOh zjN_T3PR+PQejBeQOU$nLdk|r(#}nVEs^l@wDqz5Jn=qP~g`(33LgG{|>f8 z04evsPrechDI)%82(nnUM9v5`(^68&V_?1*SPQ(2M>Kv2l}2cUXtqjC&bpUanqgLo zOEm9Tg{T5^%ttYuY|?(Z$lZ3`48^uRcKxz& zzfpBRlWlt>>3Ss4<_4#>QoE_u`OvZ?O|~VFiQMKOkCOza5T+e*>z5W?+cOkhmkpIWp?2i(?_fEMOVQ)vx25@<-56=|*9x zb3Gj1x*aT5N@;^r{RJ4!c`@|}-&hb!dkzzn1JJOmSA@ndA!(yiZ)@vov<`@Dv8*38 zRRx+nuN}!x7VdphkmrKSxz|?1-4YCIYG8*J^t7hzAr8jZ(5A1x$^xkh@WkGxbbr1o z@4Zn~gi@mjqw#=xEFoET1_lDvhD{_~OxQr+|1LUX@9Hjpq?45`h$m;bkBJ0u#1GCu z*C2lY5!V!w{I-u2 z0ZF^l*@D^AH+h6kt2?=LIY>~YgCSy8YIu2TLEIg!i-#e;+#+{*jckMD^aE)t1H}&) z(C}J*HBG9vgNEqOKS&uOs4h}!YIgd$lhd^FB?g2ub@(e~gA6DpT15&L@o>!B8VbiMTC)3WLBuDQ{W_$Z` z@}*jA(_u5aXs^~^SNHE*6MHEa)lT%9y;Z@rwJ&@fwglb1R1B>MIsBMm%`j1RaQKUE zb8fYCc4YQhmn&##syj5bynLPSpL@ewy{xv|OtQ<2L1p^4DHV3Dp^-JpY0e(~fUs>1dIq35KDf^vY zZ10n6SG~XL6Dc;XdgoC(ztlvAY=5>0)i~B3c)NcbUtJf`1vP2MqKp9wLod^_H3w-? zclYM{6}Ga>pC}CLs31a~2sx_!srHnuZXq*qr^;3|i1gK$w_P2Ijaow$Fb9i_nBf;- z(!~&o4lh>KWqVXF1iM9%X-C;SB4T=w!W=y!fQcFOYn}quMoF9w^`)38y~W29U|~A< zHlX}1zNeK@ zEjiotjNl}y6ZsN9JB z>64_REje6Itu%unFQKYEw81E%QM3dOdwp<^h2{m7UFo($pH1eKea$!<6m-^)gjKtG zb~fzD9Q-Hl@6=bOJ~@{!p#NNtjfA{Jj{aI9_ScHPOY(oQ_8%+$-5&F=DJF3WRzd%B zM}^}Ki|ECoAx)F)>BXvkEurp)zr@hcI^**WIva+wPe-;_+YU$Ty3P`Uwtd6AIT&*! zAwR7&`BOyyh7~p%g8GQd2zX&aKe*=VQXIUBSu3vFCMVP0Tt3vN;Jb%4hWE8a#)-{# zutfINpp5oxUC|k#bd;%3-UE%*#33|LUNz6~FLo|ATgdwT=*W%H=(6s$ED48`BWI$L zo8rFVaE*Ldl86IxB2)a@?InPx^^=!(P%kg)70U;bAH`IYh}1bz!5t+F$u5^yK(=o_ z0vD0*dNrR1uP@mDq-Ibc8e;eF4ikJB005-F)ch;^*}B*mnmGOy{{D$os#Ue@vKUZ& z^O}AT2(Jv_Vbf-rMT&jYQz(^GWVBv@aqI(C^x|!Pf4y)WFDEicj_U5~PrpsSylGEP zZ9x|{;z)^rz|*>2t20d!BO>>}SM$kTM5VAOVclUU^gEb$8=7ow`F=Yqfp8mX(e&Gc zVQ7PjV1=j_xL~ceL?TVbXEGs4Sfn2t~9BnB%uVh9yvGaU>j9MDR)5PSHx&nKNOzqwH~ zwvZwxJ;}Fub&4|Kd;l?>Zn*4vnO~Fu5Uc*+5}<4`rGaAgq9a*X)K_l%o>VS!fnETz zNlB%ckHgGz$z^pg=O~6$BMEimC}4=V{<`?%d8XOoV2ZhP2zZjt+g;LDPw7^^R$av` zW${pRA?NfE*k@?iuLmmw-JJHj)0p5yngMcGy zqq*)69nA7t=Wjr|kVBCa2{Zv-#gbZG6svq=)yb!LK7J$l)E&F%`@PNa=?59=F4ZXH zHQ93^tgpV;ex27THVVy@&nK(FFdC=wszE33X6}hGI=f{AE&rPxn-tRT0yYIymVnou004p5nj=AOHdY0Tgwb`G>?@_-8fp$6tAHM6IRGH0mJ-9UH5;Fap_S zt(}3v^lw!$1l5I~gZ7YT=f-CjiRN@|ZLez4AaS?}k(Sz5^o%{OxdfFtnuFC#=dOcK z0p%JsQGhnVd4pvMR7nJq7{qa*Os8Wg$z6$uIDX@1r+I@F1Hb@>3p;f73WOin1lL*j zy*MZI)d_TFk?CxHfA{F1kNE$QIvwc#^ZUkFXJ9rGT!LBL6W)Me=66&;rp0tq^CXz8 z@GksFEbKDPU^hGAVz|W{N)ZJ0PTRsTQ~ds*AdE^k`}!<31OUH1$PmOXCDqJRozFb<;KZ39pL@8a|A*3voqvI$W3Q3>}vfK zsqMG+SLe6O#{>1M2r!lp|6qZB^W0^|6OXeUvt*YS5~@_6U%*@R;dUDm9yr9ZdCpB*dEzr`(YdathK zOrA6RXw*wJ(w$j`hE8L`oyHZF3?%@Ad9nJN;A|q>;_k2}!W%3F{YDWU-?V*7 ztVttr5flt8gTbnA25){*Z%~rr`yJ{jI=^*i`D69Dmo<{?hs6XKgpURXD1=zjZ>xGblD4zH!{Y(>Nnk&ZY9NN1i7-y<`RXr2j3+?&ab%6Ctw>2@t*t2OzBNNg zTY&pSvkgVtz)IIqKuL5pNd?_9=&BOxH{k_q+3dRHI&DACDV>d;cWbuxd@?Bj9PolUuF9XmLo#yKM`w6YI4QO!D5(kw|5 zQ|>^TvadqMjrbw!7(yWr> zm>Blh_@z=~4e9A}lixe4Ma5c3xKC8p75Ss&+GZ%R(4YZBMP?wlrE`lGaj4YRXTy28 z@^vb&CNDZ+;NFk_)*!U5?yMl4>SA99p$*Xl_7_6)L`_;=j7!j2`|dKf08$Sj{3PYH z80NxWdc{B$e?AWxQPLgm7UIi^ZptG<&X>lC)s{R-Q-`aeo_J4eI=U-`Iw_o_1PgNE zvm-*EU!(y8%+%PL$LxYf*PE*3gy66V$c|S7v|>c_O?N%vgkQuvrm5MvD=%)UpD(U0 z2(!4C?Rsb&$WU(?q{@W|t@UxnnHC0#XSNeAnk-8Il2M46i8s>Tasyo2nZ7+)f(t0A zald56OU%fQc~L}0l8&hGBJ-NVrYMSSF`cT<(# zExY&AbDKAT_qvbsSBdS7!8MsIh(PBNswg*lj<7v-2x#`C&Ps@r5}a#tS$_NXpb9I- zCR=fJxq%+r8bUU2Ryn$yZ3J_o^Lyg&$y`d;o;*4ZqinQbtl*U6@sgpU@FI!S{%rka zGQd!(VTSB-o|2W=#)`(5g`Fji>E~BdMIlsUEE~JxUV4dA-MIzn{TY>HUtN{PnQC2s zI0W;#0qp&{t2kFiBtM+myhRwxwDtoOGC{HBEbuP~Hi2PO+}H$pb7S}8HJR$ek3LQZ zR=J}szO-Fns}RAJlo&JfsQ6M`L{+?TtN_6NXvXXgp?&bovzv^`YE~(=@<*)9v1`;S zi>#`U0#u^>$3Y9U6dyNvjpITQ8_kzhqzEsT@&%Kn(L-AsJ`bgtKg{XWWINT4o&}P_ za{2Cb2e=wu!GQEPhpzN3^hQ=`d#Nl?W^U9da3?V;LDlzXJz*QutNat8XgBa?R0cn% zPaMI&f>kkwe#$rwR*67=E+*H96rtU|I0Cs!B9erm@n}BNn|f&Sd{nyHd;(<~4%wF_ zd5hi{E*GZob5y}82hJw?$XL;M;s6|4~9)AwzL?3N$;`~`vi>uK&$h`B{LIV4^@=ydsXEUSM{0L!;FwTB*hiJ z&GL6B#{ftvc)71mDK(-cp_*b9CBT8dhx}ITIUVtJO)HF(??h@Vcz1!v=WqNs@|{;{ zi>w`bPcB$VS7+FuhGg{DomwYX&nN_75U*IuAw)mEQ$R>wb-%0oiPm4x?NEzCsqWk&j-?QY0=0dJzqgb2DN69el5CCM z7M;tT`m0_-M;W59O1g^>Vhemr&P<%N>bHi92e+32`2FSeQ}`A6+~=V{dkc% zetLzk@Fe8Ld45_)B4w@)9**4ZlR*5&_}P-4aZrWUcX?vcfS4eqXNRy^g;c6s8;tNr zCmMp43&sX_4nLPzf?YI>S{-sCvlCl(9=B&_88FM<&nFP#Zl2ulm%Q7z@ms-ERbwDg zb6QdtZL{yEZ312QBD;4lBhLN^3dFV*p|{v_9O{A|nLF+S0&}SM56nI-1iV1^UV~G7o`H7i7@l7u5S4nA)TTPO3VEVsF$P74!=8OJd&M6Lm zu?s^nl#Y7)*Xliii@${jW)&Y>IRrMONOsG^|LV199$wPuep0I4_@e3UFSui7bm7dFM@SiCxfD$Od`%dJb~BnXNGp! z&du`t0wO5E2MjY2Th#Mvp_8h}6{n{9R%TH)U%mf2+B~&-r$T7BZTgEW*aHZz$Wq-iDcpO z;)jWnJxR#4s~mrTiGewrHhLxKr}1uEHW?~0Du%GGDz%!zE+w?u@2`Q?G+zkYKYu=V!?j2o1ZoCS1$`byPEc|(E)`W+V z5wc&J9iN-Xy~5X6mi7VmPBTk$-4+e*s03$)m=^b)cbm|?I^M2os8&4!`Qo61V?NR~ zSn#EP$dIEI&+g`!xD{OI+l{n>%2L%1_V?eK*NSu$}+6v(~j-;VpW1FIg>n^ZT_a^ZYiupW=XW-SkhG!Yp;P!$H8cngX*G$X-2@y^M`ofKv8n^aR@R?c)ux^Emhn z2j;Hkh6^2OriOiEuNHd20N-0)%Q#%3aQj6R8)Bv)-9|#h9FL5+d!&+h0rktIfDmA< zL1o9Xn$tNuP&dZ8@3rg}+9$y@y0%t&uTuz#=XJ4*sokA8i!=&S!@08?tYn0-4eS}| zS(q(2xxk@gO8@TqKD=R~SsKZ{`2`T1qUmFTC49q|=7UkbCUA zO6omYPJBj>QdECM*6#tDAmA#Bx+`)D#U#7@ca6_u&DM|db3A?U&k8{akb{Vi;5Ubn zkN3719nIG~%N-yB7kdd*7h5ueJq$xJ{^lL7FRwb`VR=C8;7uWE9Aj9jGF#QRbVyfY z=C*80U+c{PE=5_;^+ee+J*|Ml_c%Km*U~n%x5V^y<(_xC6GuGqTau-E=Y~$w!ipQ! z$X@w35{1b^5K(zAgNpR!+_8#}d zNAKkwU~ygE%9J+x{8JMylV{hyBh4AQj?LrLn|`;DQeEmMb!%AO>+3n)Nc7%T#{yLg zZTKJ{JG^20`R)r=qG9^hwD(+IHoAEPe;q*Oe1v@5AMOtpYDy4o z6?2FM85B`7b+qUdpQaYk@s2ae7*F>%GENPTI_9nTms|bNo>IQUp6a{~=va#vO|S&> zvx>`NUh9WZ0Ww}zLx+lG;|u4Yz|r#ujC}ptV58N7{_Sq~=Swp@AWx=c5gbL>W z&Xz9)o^LzN@7qdct6v{9<(l@{*>rP{)Lc$WBvVFXUD1Sca*QpxGD$ua{_!>Ac<`Lr zwL5ox-^M++6{QOLk^gk_pkx?qi^HNtCj*NN>io zCNGXL7ZfLs9VxdyYUb~kxv#uje>}|a;dY*D`;iUT$nzZdG=L6Z`IjD(Ui0CIAw4UE zTVa5aZ`|U}REqz8gh^{`hegY?*BW(OGN)UyDO4fhn5NZy_7r2~ghrxFgfM^Y3XdaK z&6P|2-AS`PvgTRy$en|hdY_%o{#-e0^qMB~K04>beI2V+NKB0p`o>BTwueQ@!Ot$w zJ{fXeg;ZzzG`JZb7^$k-?SvRTW0PQvRPqTUROZ zkZQ(|X|v#RzG&?q#;Dc`uI#2Ad1QgXq_l^sF!|>d?yKA2hJkX-QKvCKbjO1^S&^Rb zdQ(Zg+(G;~Yo|6Q=_!3AEqEf+PA72I5-Q`qjCE&F!<&0Wmc$B$i3vgL8}Ly{C-Tbu zI%~$hnwYjL@xCaQCd5Oi21f~yc=zac$=l_95Y>_NoUx-NYQdN)0SuLy!87_z4Fyq; zKLf5&J%%6ic#E?F-&>8bcBZTF6*tX&9L!o_qK%E+TEvNmms{#0TUo>NCJ>F@T74e_ zDzz2B%F}%(ROEeB1TW3yHXsx(T;{ca6$NbZq_WACWPGYUOKnPLCT^57o-QE-V6IELCtXQO9Jy*7DWEoB!ek(S+6a>;i4+cRd&wKNRau=Iy4o2q!3E++(y z(m#|A11#r7^_@gPR$}K#iyJ0JK$;3TYI;M7MGDwW=|zpj5@}=)#EZPgq#|u3T>c&$ zkIVPMJU?a1TNhy-6iMI_FsSzH$uB6|4AVA0%Bx^=V<1-ali|U8c|3=%2kGvRg2e ztbH8QaWV1xol0-ym325W$7tQ|&k6MW6nip#2ct~tAVZgg`tPioI_y0#KSI_|g*^=4 zz32_sC_cHSg|jb-?x#|y1cSbG;otMYIFqQ=y;`)l9NF7+w}4_^1?=v&?+1+V!#=-p zI&W7B15mMOSYJ4`#j98d>f7^^%c2nYnXz}Xo2N7EZEQ?svi%}(!*?yzAcEzQo9RW?-dGV{n-&-R5 zz^V^lA|t7(s3O}uVW;(m?$gLYCe2pD%gN79xc&?m7Xkz>YoiOu5tzdYs|o5Ai{#Kk zuCgb&j;yHx&cA6P0(dH_htwNhc4~V&jFc*WG(sBc8QCOhK~awmRJaAS8G0sabaZo* zNJh;G$q;GkFS_}36ceTwZ9W&OdAzNba6(*Zwi*3$+_@g?`KXR+i$qh>DTvwcsX3lr#To`p>H0p1BItPf3b_WpkI_4^wK}4%l zB^cu$eHDY-iwS#QBpE0$6H_7w0dY+=59Dj^3^v)+Eog6W$184w#}Q|Z6Fe)o3SWzG zSYT0K!H+o>dbES?E`mX&Dv9_>DC?VV@ph4skgzW;b# zZ42NrHkmEcN*06LZ|iWTUG{nYYVUF^T%d<&YL%r!r@P7ET1`Y<5pPi1+WFINH-69l z|1|cF(UmS+)NrhhosMnW=%{1cwr#6p+qRRAZFFqgw%(j`-h0nI{oU`5w|?xgQFEiB-O zow@k6DkgH$@F3$P-j$ThNNn!taCrc?vtYp0T|t9)6wr2ls4Ap88RFyUK^ChmCeF;Y z!>i=u8PGqO2=I&WL<$?DI4KtNme%vSQ;6*2BISrx*Y{#F&?sOtwi8NcuaJ%daQ+#C z^VvQQ!x>M`1$U=<5dRRRhsI9#YjWUa796K)NJD2=JeUAqsYGIv%!#X3jjXLHMa|Ir zlk98v568wEl6vHm;N(lPxYaP4j758UbWezmO%Hp#dtF9mjAec5S)lE#ys#D^&m%L= zK+AA%8c$cB+c(RJ_ffPeHTa9QC@8EvROoze?Lgj}1Ogeesy)2$HcHJ_pA1Jwt_6!H zVBsZwvM&L-f#9H-eV82~3@)!VY7+D-K6R~BtV;*mo~B)8+3;FUIUFLt78L;C&LLH= z*Lb{h;{YKJiog<1?Pcyef!g}6KO92V6J)zMP4Cvqc#^l~9Y-Hwed{GLKnH%LXgcW- za}sODkb8+EV}0QqxR7*i+10+x!Eew)tOLXdjVT!CaerTR5Z@)rM=RpLbK4!quF-9Y_MV7WE=uy9uuP6I(tXhzdemFOi<=IRz5?u?(A|L{^oP? zqP~XGOcNZu#%&X$!3jCQwApoh#RNJjYmRPD&n?o5V+wpg3?i zsV}yK_`RJp9f9A?b@MU=YrG>pYnLHMw}FnME|iLJjn(O^*2b26KI#!F2Urh^p@84F zB1ni2K)zHkjXq`lIuLt|Vhpij1R=wp`RkX7UQ8q7j>i!P4%_p!B8=?@deqNSGN<*T z$}w@UMl@cl9>*mRi#uY5;drbc41hcH^lT}^U}u_N6}*c5ku@hIB9Vlxq3 zK9O(iQ36Al$4T|z3>a1dgfe&xS}1wD`y?n8HhCC@L&);L8zaNYZ3s$y=bmzg3Fk>? z;s-1(AR*H`-hCAx#-JFfMJ()PBEOFpa}g1Ui|7&R$)EeKKFwd4M$$~u7GR`3T9EqQ zVZ*tU0nLYo;b}ZC*o(1F-K!l~TVLCZ+xsddFUf`HbDr4E&yRMT()EHZ?9Ro5B+n=H z{v|J0vpko%8mYW>*!gMPo2Zu=!iP6{#hPXH1Fkg^X(wD2L7S$zx<>S4k_;?ak~gpg zWnveLjj*d|O4A|%jCdl8oS?I%teFqlUD^A@NiT8qCk&rh7zTy|ex@8BPrB)^9bo-C z(9$tGU|in9Q%}2hTOEkam}An*;0G_3w#9qRa7ZW62Z1TwEeYAaa}t`f&6k)gF<@b$ z007V2p67SmyK6_^fN?6P(u1dkn(De5wdX2P-e#B0Nof#tT|JerTL+?jmoKQ_0*8|1 zd3Ob;!^V8=LkAz!xq?wFRt3A_^?y1V1?oF7b^)qXVX92_(as+howK$-lE6T8q+90E z;HYH5U@NT)dHBsD_!Q+EH_>Rw$zikk=ycM2x6J4a2+RXo6lC4#e0=Bv+hk7$SAtz* zKm9(pmSkt=S?(00n#Ax93ZI$AwJ&-?KsN5dM{$OkD0Dw!43h;PJKElw zb((3y#^ehg8^H-;5oV8L(;@lo0S5iJfJSG9OYg2sye}fjg?r_o5!|FyD?B&?o}o4K zV7Z${iSs%eUr}71K-co8wALCF3iV9vhGX)B>cRq%K~$the}w*s-*Zzi%{G3n-r^9X zpdKvL6{Fte>@xC;txwiC2z&}D0+N5hwErOKXn$4T``7^`3QG$DZS=?udDF{6d0!52 zWO#<*t68u7NS?H&hfc9QEko$;K)QYqm24Gw%ccE#kbr!r}Ct$#nolcUg%+p8czGQiJA}pEAEyj z^~0Abmi%=ECOy^6oxI^Lqx&VCx%5zcT3H`+FcDCc5uXmIO%uTGjRJ!GF1nv%+~Y>% z74B}@D6%0JzxbY9ENhfIH|ZC)Yqj;fF$)wF7sNyNLF|b*RM*s=TjO5)${8Ijr$cCL zB%8F>y3QMmT|AMZopW?CmxfzYw2dS~wpfKFiqZHHwq`q;GstmpKi;ECY@(Ki&bq7% zaEI(63R;pJW<=_MR?Z*Xj6lM^{IHW+^U4sRR}a8WHk1@b7qYt9*^2Vf70xW0!!Epn zy!0=^uLNh+R!}aJnGu(P<_vM}&=x>Q7X)Oc=VuBi@fRVyAQZc)I`Ir^;+Zw~)~b^M zZTGe)CLdtW;JOTD-Xc%OWH!~;TgXuy)~^cOT*@=5&T+>s`<}8a?&s(TFpS-#bf=0Z!` zJS@g@b4ekV+6Z^kYgkyPkcwG&MrnOS5Ex&GYh`ZbQCrVK@3LC6*7@}wi@l9uRZ_^g^siJ;~sEsQoqnwLLC9uTbsa|{iSl?F+Y!kRit zs*@N}3B*m81Exy}&2mT9*N~UPVeZd3i};LRc?_hR@h!z1Vb^!7C}oOK*&PzJNmS}= z6N4HpL|4;ojHPA7F|F&c#0VBv6ZVAY6DgCaYXuw+0ZF>Sg4Pxf0sGd1mi%1Un^OrG z)QrQn!yV-kO)y8QzXyX{;_?25v;R))cBaU$9~$TjkJijYoBM4KM4cSz7?x;bj{Ymj z!zjN6RQuc_#7x337c9{XYJn3SJrnRJ=40bG{L#Z_cvb_eOwV~0nypK^HM*EJY|oPt z7TnsTiqa32;o1AAeu^$;H=LDKZLCp~-qETiLzlc#)mUPA? zFhuqNom8vlxQk;#rlQAH$^k~Zqs4To1{=US84zh)&=qs$%%L}SBb{; z>Q-F`PLpGs4c+p4HXYnELdVImve&4MBl7rIps*jOb=32;DPBrM@bqFHI9uWetvgJw z&aR7FHx$pQFAGVR!bp$ftZ+*^r@eJ5o0Zfv-W;*3AlP1V;c(E?sEfA}mlmSngvk`x zBof#y$lqUh!e)~u85T%?Sh+Vzs5pFOU{&F(-{^U|oxMq*g@jFwO&<{=#vfdRGJhzZ zJFoW=5jIY)rLdQ?HK5q3gl1L!&N)OWVnoRLt70_>+aTy|f>n2%w&kTqN@B8u%(9faqBi9bAJo^bBQ zonhA)XX6#ewCgGcY2D2@=K*EO@|rGLT+x4Wg^AOvZNX>q6_~N;urByo2j!_w@3XzK zyO=^O1d5BFDBUD(RWC)@5OO={_}%y+JYX8wk`Y27br0)-)_zIAZ4U|Z;8{?9YSfAl zf9FC%Z@ru_a&#It7s&T7o;B)Y~6Q1Vu>TM(Q%0Q>cHF;G#;sx$qw;k9>ZJO z;GVijD%F?GuB-^3RW2UKu3_;ue@>WK@ol~R0*5ogro)>3J^^l|yMN@ZL~PFzaCjdb zMkG>|ar$&gC%)sv2T15NH(BXO8E5w3D=xU>nxl)O^cF)>F8@Sz8r{V1qVmev15HDv zDHd`zf=t}&5yPH_Tag3 zvNWLivK(h!Mp zViNv>;`_E?N{^ohOL+6g0@fPG*nxG?6SfWe-;d<26bo!>#vdZx9+DS%e=R(hr#V4I zmES)&#)?IH?8x!>NaH?cxoz}BZ`o%y>=lct zi6$f?Daq~b)g=d|nIN`_Nz~t4C^8VoX7Yo9CI*pJnSN-8_+T=9o7n1{Usqo67LF2- z^gC!AHrSTSYRItD9iH2SP?q~6iTey+cB;@fLZWYTJI2jjZnd;x2N+#aY7gNJE2unZ zV|X!3QKubP=gW@I{&}@ou6(UQeDn;V2p^z+|9DbOzL6 zCAMbqusYXRtAq8~5m7wbGMALXcMOE}ryo^BjoWTk7m~`k%DYZ~s_La(*>*-p)G!2Q z0I|r(B*dTOs6uG;;+4%x8V+mh@KfGUyN6anPZDPYi=K8kU$vRHr^WBt>H}qhYCmXG zZKMD>AB}e2ygMK^PAb z?b*N*{_R=+;LzpinE1koX=cwQg^qe>7j-Z6bT zwTrIVGxPoGCzitD(MBk&FydQCFmAxkEjyHa8z7zq9&TDR>pih<3IW^A^;P_D9@a?c z#@}$jmZovy7oT95>&kveu(RFr&{g`qWF}YQ`jCrm?vfgK-#;2naW`xI<~Ke+FTUL6jdT-k&vS!t!)Yvbo&PfdW!>R zy`L86VN*RJ8V!OtCgYA^X^-$o)rHI9xm|*?5OfX9a*tO41pq&7 zcuFNDv$;dWe%YMhxFnyl6>y8xkYkM)pARgXz)&NP?IqHVQo0t(;`8ME@!8islTT8F zTBCf_Q{`>9%GDuA-08K~X3pZFhBU}zFw_i(o{74#6R5ojd%!$gL_%8KI2cb&YeVCj zclD{yJBK?wvnyX_oSlWIUGeLbidU*f?-d{uH^&?wnbbrr4DO6DYvv=n4`vs%n=9UE zm|)7w21mmdiXOD=FI5$ISv+d`(rR0sAvYHE7&NV33_$BFpsCe&wBSo33WURU2=8|9 zmU`dxofTpqpY@B!qo<$hAfPIftYF#b4a?=}G1zrA@h)ki>rt}s zZf1N6>^*LZF#933QL%2|0AEcCUOab2+YNa!{&fD%V=Cq6q)6T(GPL?!V&r%;5^Rzh z3`rFu6kZnGA3g5ay<^=W92}n#A`k`zjBEg`TQ9o@Pm{tx5lvNlXO2mhvyx2t>cWe! zer*GxBPFUYA}u&IIlcNlcs+Ge3-x6mA5^=J|GS|CIHeNrT1=Tzagn7M9Azvq>_@S{ zeJnuS9$(W;UG9;MvYmDMuFH{mkY$#1m8?#XOYq}GYv*LAAYlk#Hm*;qWbG+*|P&ss_`UsCfy$?s8~h!WbpC42xIo8U$kLbwJ8XN_q|Q~+*%f=S%O%1jxrmT zs%-@{)UP$ux`KBGxv=!~z+NlMF-UHblsa=FiQvffpntVXt&S^FCd94PuDlY^mYnyL zA;SPA4Ks|g>PtEi6bZMm`X8jV8V-PnR1buiLX;U8#%jG&xc-z4B^$+rZGUal>eqf> z#{+v&mf7J6yd3I68#W)3oco#J#|vV)a1eD(VUjJhM3TjthKxtuk=kyb-vTFzjPU@K z9kF)TWc=7ct;eXeKQtf?EzIqwX3f~*DxWH?@yTk^c?Jr2d*e~h1Aq@MO{zo`6p4#$mFLl7%@rL*d3OCc1 zob<%epk_ZUG5UCwR}(W~b0n+bXj@TO(iMJUThw|+QI(rG$LG%h z%2@QX7~Y*>DBet+5N$Fioej>doza41j$9h0jMX-&Qy7r6$`C?bzniTiiH3F}4B^R$ zR|t@wXh0(?eLk!PF`-Sa_C>~1rDmaTYlcOxk&z!OQ-o>jjek_yjhXin-IkNcI!&C5 zT+d1e$80h!r ze@~cdYZZcbBiVQiN7DK?S{hf^?VjOVFX~e0gX?n#{Hy?5(df}yC>P97i|iSRuT5U` zfQIIVNT`PEq9}NI$0i!#3vBriSoIpaJ7fKI6}8PDUn7%Oe;plgxS`=873kQ#f`utF z04?!YK~mBiU*3Ne{}Ef6CVh=%RA}TZ>AZid?1h-0S%exVg?5N#N-TYA3P;hanvU=y z&;QDZUA6zxbSItDXE&JA_X~3Z3TV5u95#9LAr7u!P70&lV0gtDlWbPO`6u)~Xx#Xn z7T?m>8=IdFtJiChd&;4O_E^BCKZn7< zAuRU>S=iM*Lt=x!@FQZEoyYEO?Q3Pi`rJRRP7V8(N`dmS*!B;3R3y+Y^WM86bi)6NYr zzyfM0bA|Ct6PB;F6rN?qKs-h=>pAjPG`TaDx_@x-dAeO)|0Q61(SOuhf#bOzpRnk# zmzBFswRS%1@p*q2>9Ry03E+6@qVNo#ck#*T4zb)(0SrsUDygK_A>>`h!b z@xJ6t5>IZ$rpzA=sVWk%%gUcAfm{p8;F-;WG;_wZ=RSPaQ?RYJni&u^Ozs-9XiA7k zy-GxWXuDsJ9zvN%H`+UOK>li?a$Er4avcY?UtVs3edlW~*srsinvvBxuOTyva$X39 zUAMoYlQG6u_G%N* zd=9T_*<<)oL&cLjOSyiGGF*kJdvJcnP5qA2gsUgfG}>`nQT}ptwFQ0Xyl-%BxJOPB zDJMGENWr7s!1T**ZexLzhyHztg%QXq5!lFpaNeGHkdfx?a>~#!YKsT@KHw{6gzJQ6<=5X^+N@0pC8z#>I7DO>b^wJhJul##sBOf=y=8QiwL1gAQ>N*tOy#Gibkfv{H%R(|*M zJ^wy`&@^j;+9xETG=WnAm5<&?W2T8*c-cW=q&Dh?Cl*k zD%aaeq<;j&0Me+Mx^Zc)5Y%aCp`9efL5>@=USRNQq*8$%EnZ<6@(<;Cqc5$>e}P zXObws97!9jH|j%#Aj4J#)XU3^T~A+=HeXbt zT8Eu*hlYg39;Ima`XcYGXU+eo8n>CSl?PNFFn7_50kX&z2~8pl?d1^fNt&l9;wuLI zcw_4vj>yz@<76?KBuBjIr6meafOmot>S$I9-vrmlw=&{RK`DwSJi{}XyW5~QWv1N` zB*kYEt86F4qv2aQYF>GfTk37WkZSFTc(Yt8ysEqFW{CDa5e4XtVowZYi#c*g!*;^ayNmVon<;W44vP9X`^pd)_X#Prw#Qzl%Aif6E2kul5zo!_q=GEJZcz4~PI?l+#oPez(WDcWnu|U}g9%flt(rB0 zog>mulQkuAXEd&7sri9j-d*H>(-TT)x$}*asciq@(mTQkx_jT|0pso1#fBu!i&?~r zJ)A?$TqfdOh5TFyG)Mm3&Un&$+LTv%)qF3npCN4bSmSmj2#%?Cx+Inln4QQCWZLY8 z$82ubQ{ikjyjqPx()Fwl%Aj-aYnlHMkk^rX-raraw({U1k!I-2igq{l@Q*BDBBhnf zGE4KhsR+Or+WUT$fFWBqYZOK5hN-4(%R0QarFsOb4u-d|iw-U(u`_6FjP<@x<}6aQ z@4B&PMFl|D2g%dR=@BB*wIbsvxat8WN31YyPPiEKQ%}vvku)KF zGa@yI?&X9$evdh#$p%YP*n!(456iJ7+5n5ficdl`3RxpU3BcbyJnb3`$ zrG@hbP|MX1XALQ?BwwEV1vZ;R?3-_|orrk_;Yo+|kVq>QB(a`^BhL3KQ=IFS_MLmP zh)X=cblto5JjO3@o3y-MG8IU%Rfv}+){A@*+-lzNxqnTuc+7a%Tx4FbF!KB`yFRex zfV`;6vv*D17?LztoBQ#Y+L2Q$=XPqYG(=?j%bzvLx?#S)gDwRmV%IzGi2)UiW?WV} zQKkIou|zpNZr7p8$y=h@jk~m($&IX;N~NvyesHugV)x8C791wFK$u5AZfOuH#>xPj zS9WjV=sv5U;<*t%!g?-RW%!~s|L2^A1lC-POPR7;!Wrjxt_GKOE?j7{)3=&^4&+Y% z^cVzJ8_t{I%81G*e=vJMX^*lDLS_Iqb{u^-2$w_3Uv;eDrcH;6wL)T0tRiHy9vw~} ze#F#FM~&{Omn@Q~iz)3cwOiAabq^Fg&%K)LVt4iXyvmC=R!^vEWfLb>><{ztwNf^U zL+~%}yVNTnLY(J?I3|;lQs9guLD=C{kr?w>C}PsCFsw%7jMNLKci-;4YafOsYY$7|PXd(%}3- z<0xI#Q?A?bIVPXxipaBaPH#=(53#LiF)y^m{ZQstw$)ON^j=Jq)01qRZJya$?f9(R zefqAf;>2>JQ_(J7xT?pFHOd07pr#uxmBy*ygNnJYv1C^t4>h@ak2a_HxYrfgMHNrB zg=fo-Tdf?p#gLm$&v?H3bqh#Y5E zNA$g9$DzE?gc45IUzZPm?Qu2Por!uje``C%4rq}19z=VEOVI=M)h$X`?>A&=KC&xfv{t5{iiHuz+J) zn~+S?QAoacQ@XZ}fc+uP>wl5=JpQbh9IJDpr^B|ZGg029FS1QpSE1!nJ6X)cJlmc# zQAr`2zFaK-jfNg$=@Q;loto$)z%n{Cix=1=<_Q293x7@XnDY5XPNrlx=xE+lIa;VD z*dkcF1x$mW`N0^$>4^t2_bkiEikG?A_=B?Oy;+*(*0c=+gc*WULTe3Fv5MkO7iObb z;tPV1LM%PZeCOp(TD1w4uZEYK`DC$jWMiKWldK;N87Ki zRC&8u$IIkR>y_l`O@;d7riP?=50t4>R)M3=9O_8#KwPW5=bsHP#?D@)h%8jRKM)0k zTy|k?DsBs8?0K?Bj(JT(i)MlDFXid@QDOT>e~^p=$c0t`4qEUulK`0^Xx~mX-|azY zuxO|ixs6H&=$(L%jx6-I73R@DkSiltRsAG-c6Ocvp)j!1%~vC!JMbE?2pm?g?14$` z0)>|47{0iO<@tI!ZKj2TS+#%vel}ULZFsY+9~sSv^$s+rS~%3Py=??BszI*@n_EDBokEf9!aSUF(4 z!~R$VQlXR|B%Y+VMX{?Ac{=Ckn|MDx+2Y;$rh{q2a z=1WJ`o^nRn$1nZ81#ba&y;@zdiBnP&x~5q08KazI#Qp=yxheI|DBi66u(d?agr>wz z8LHDnw0W{xG==hjgs=h8O70_jeH#T?cCm%Mf_lmhLDOaxzF+l(n@f-^Q$1>bJ{#gq z{2(_Dkv*nOFp&h-E*Of_UD$9wJH||T=ojyx649c_Fx|^}u+)0IIgk!j;7Q4?(2F^1 zttUvE%81SrnnKC3M#151;&iSBNDD`;w#4TH@ltbl4=*q*bInO=y?-3qH_3Qu_8vQP znd-7E&wre_pHoxS#@p5Afn_fQlhJF~znB!2MyjF>#@=^>+a0WM`gM!(pwE&@I6L|@ zxWGm#mRT+K>WLOwGx()_pi;4XxQGFU%>_fi$ry_J-fcAQ;ko%?hL{r04ViRx!K?G@ zeyL(dzIvifXeSBnDx{eVir(AX6kq@L4L?y+9O!`~7hcC%r+c6=>`|p)eg#!UCOuXS zUEaoc)xw#XPrS_C8z|)orhUd)s7$iM2>Cc4%$uZ?h;X&tF$IGsCU{gp1&#ysGOCmN z0un~0YLpO`FyBU{LIuTy+Qe@E%!Q{fivubEO?hESLM}PPphC&vyvHZsNzF2sH26bhoqKxuvQms$#LUNdqXDJr8)qc(j>hFD! z#xSJQw+fg>Yo=Z2s#dd^6@PrP3(V2^7`iKr-l212GQt+mjf2Uo(m5?4U8G1hKgu4a zuD^@!H2p(S5ICNf<1Jj8r{)*El{)Ryg>AYP$M;`CQ$)d3GNvgi>5l6Ihsw%O$kneG z-!yb>mJ7xsS9Mhq(|9eN>cHewgs>bE1rd599Hq<7!Gw$=+r124lp<)X?Vkyn|*Xf42n1O<#gYP(w~po1bli;j4!3T+h;SlUm0u)H$#) zTm#UqvGH)Fh|aQyy5eN2tcDL|D@Y+SX^*mnTbQGes&8%HjHPWcQ2EsvzthYTjV}#K zw*DfCml&AaHnIMtE?9IPdiT=!jg!)}%Ge#tM}Ks9$zkslzg=s}67WQ2-L}2OY8D@N zIe)M6LuRI0|E9(dtk8{OqB8NE4I&_|ve04p5JlJSKV-exL4n&N8k z-I6L;s+bbYy@}g5$!sl(V_l!lFwR_tBM{_b0a@BZhhLw9zxJ9a6`xya`EJKss(!%q zQs*Ir>OI?2WTm!>uiINpXg|U%KDSp|nAdT>{hZ5>=+=HUlGin zUoX22BtL#wQDu9vQ{+1j1RW3OeH<>iMM2h|932tsW!Mv=PJofqv6O`7yuA9c=-~K# zPcN2w+}l0yF75yi(-wcu6%Y$-p>4)!b{DJ_=ynp$-*nPD?=*ACt{gt?eZtGeMli7j zzdYaOU?bll^igWvg6pGIdo;QL&|Is4ScAde18uAGH`3|qUbP^*vzCSC>Ug)!K+%P# z8s$9je|^_3<9RT~S$KiD#pUN*rw$D5doxz$TFm;HC(xaY0n2G2J;+0vAJ0KT6i00D z_3_0yoQ-#&9vm(GaNv6CwU|X{yOyJD`pwnQR@bu9x{G)^;o!>56*{6RtXu?_nZ?2@Y6%+6+ z$8b_MKnbqhquY?QSEwZHqoODh@fUw#yvvY12O=F8a0@#W$jtklDS*DuVe)yd=&x}) z-yhZ}n~)F?P{$RG!EfrY{2j4ZgvRKc)+8i{K{1v9F&6-gT*J04%}ZoI=V06AhTIV3ZN>x-KG>qe}S^KVhw0$TP2Dh)rcBp&3IBz(u zM$9;pbA!4~uWQcHZJxau-9x4p4(&jrQv{MaTThXF?iPq5gX(CGn2;#z) zGHo!$Q8IzW(I9Z7H!18gV$7xOYs4%)V7}BVL20dYLXB5VuO!u6(qJ9RA0-Xgpe8NY z2gF`<1|jgB5G-;(`H^!jJ`yM%x>do3_BID?u8JYwdHo3#MTv~rRB|u4z`R>1Qh+I| ztvkzr3Q2Iew(Ruuw6V)M16}Gn+n3cj-`Z-+%O4p9^7pK+Ud(vy;oV(;yQNG7#e>zw z&#Ij;piDO#&*QQkchT=GNow8e)gennAGxlk;Jm@E6+i(fqRRn*ed`yFgI9xNvmQ~Co$0(v-lK&7$ykZ%nXciQNUKun1dg#O@g%- z%Y~;qivA^a+cJ?wKJ-phhB;Oqx)04-i`)hYw;EraXky=0F%s~C9zd^z1iR;l&Yo$% z)_CO6bgD{6D0Wf`VTW7~an7AEEX10%9Gz_dx>6Qc^m!uKJ6LW)d+cXAj9HqV6?e%f z0tA-shaEG|`NGPrBubJldU$ku5TgOvMk|kfj7JeNU5o|;9TXqed$=_`DRbxij9*Sv zHwiK=LAtjEBdEjXu|_2+v;nvPh%p;SgPso05ay9$Vbi@d=@P9$Qo-nu)5S?|`5C;D zXMAK<0HFkb7wcDVlOr)fg=8-gJd1C7k!N2+*8$FSa3k_;ER!WJy~cotV)KkfaNq>Y z&&fv`^I-`g6T}i{+=S^pw0v`+t~_y@O;B*V-oJts<&(?5Kq358ERFi^!_#%dRA;m=7 zyT|#8z~sRyYA{iOzWW{w-+`ko?|0H;y-QoJQp-*hH3#H$f7nFf>riO4b~S$#%EFnj zcxTJGt#3#`tZ1+jt4xnvkXz{yjG9Uo~?%U^YTb~q>e~{n()raPfo)xic zV!-t9fft|~_+y@|D-;CN7S@7?8KRy(_$g~JYp>A~4W91)-p$pO?U!~8#uFa)LvHpC z{w_K3mX}b8iZFg{umjIh-8bjDwqFPs-Tc2@=5GpOu#E5ZKZk>XaVx={mjW|cc%&Py2r%!##T+W~kBIgR z@?2k1hSS!)T<$H40;;QBq_SK=7P`>2jD zOTGu)(r?yyxX)m-Pbp&8A1pBb&W}RpsB|N^2+M0KWEwplWAV*HEKy`&Z8|PZsimu5 zTFmbTz1RK+2lKy)6#rX-ycnwi@IRBo`zgPl3{Av|@^B5gRMf|Lz{#)7V-)FHY<0if`S~CgJpgyHaZnG38R^ zLV-BZh0?)Psq{+d-RizimFrYs)ehVb9^#R;wtl*vGbb9Xr{6L()GySJ*>^59qQa!( zh};1z!kGZ4M3|71m_gIw0Am+Nq>eGc?c%gG3|p|hCBtKz2#4+XzOka5K)yML)(#r1 ztTr^lId)eA$}pD$rr;3^5@Y9zt=CEtaB_wK1j_YIVj8h;Cly`@cWOnt9;U|M2~2vsa^kE}2^FZX1`iB4j+gBMmRl>ja*zh zrZUXuo4B_}Y8cym(f#%IigD*Z>0ZN@U{6CnQ!D+s;r|eMR{!=%_4+B&psnC)V`#7W z2mf(Hf~0g0AAHaS$$PL-RS=B}-GB_+qpbpLvWsS;{9?2AQU<}RyYUw$Fi4as@woGQ z&kbXvmNT0+1`c(BkdY-nm}{QVE-_^aPTIwj+Y;x|+K`?^0nRU=>fa1@ruO=6TJGT) z2a^f=L6a^O~RdZ<=mJdkF%S3))fN4ejw7$OKe;%D{87BCN=a& zLK_(@qn`P~%vg+A8w&AA1s!9rD&nv|Zc+(9M#P2-{&WQe*Vj@ihbTt+DUUv?KC=rB zh=OH^r-?LH(p*=E4^tXYdmufUNYiz+)#^ohHykQ?B0b5qc#0e3-7ItMBy}*s{!=!M zxKA{A`moKBMPNz4O0!pX3L`Zv%h@3jv63MTjSQ;3f!#MK3c z)5ID?^ZX?)K!mk1*Yp8~i#_+p%go{_f$I$?y5}dQHy{u)z~6#(zfaxg>;V7*;C;T* zc>dRk{L8?9uTp>1`@h;B^@_vwUzPoLr@z<#KQMne)%rK)&wcp6oc%R~KcIg&BO&1S|A^qlIk&-Sm>eAdH1>D)i5X#bfB7DrM+htG{3{&{f!tMgx( zApJD(Zk8sp!`{yVMy-zI2@{;%(UknI1C|6PsqZ#>)Q6#g0ee`<674yP!s=d0C0a`Kigk(nD(#rV(;K;Vfd%8=l^@&LO!eSpT7U4N3oIuIvM^KS2Kn+sqKV literal 0 HcmV?d00001