From 17d583bbf8de6216e15e6384ada4839aaf206647 Mon Sep 17 00:00:00 2001 From: dengyuhan <464958567@qq.com> Date: Fri, 9 Mar 2018 13:36:35 +0800 Subject: [PATCH 01/10] =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 87 ++++++++++++ .../magnetw/controller/BaseController.java | 32 +++++ .../magnetw/controller/MagnetWController.java | 131 +++++++++++++++++ .../dyhdyh/magnetw/filter/EncodingFilter.java | 75 ++++++++++ .../com/dyhdyh/magnetw/model/MagnetInfo.java | 66 +++++++++ .../com/dyhdyh/magnetw/model/MagnetRule.java | 35 +++++ .../magnetw/service/MagnetWService.java | 132 ++++++++++++++++++ .../com/dyhdyh/magnetw/util/GsonUtil.java | 19 +++ src/main/resources/ehcache.xml | 44 ++++++ src/main/resources/rule.json | 95 +++++++++++++ .../webapp/WEB-INF/dispatcher-servlet.xml | 40 ++++++ src/main/webapp/WEB-INF/views/error.jsp | 17 +++ .../webapp/WEB-INF/views/search_result.jsp | 127 +++++++++++++++++ src/main/webapp/WEB-INF/web.xml | 73 ++++++++++ src/main/webapp/index.jsp | 5 + src/main/webapp/resources/css/base.css | 11 ++ .../webapp/resources/css/search_result.css | 34 +++++ src/main/webapp/resources/js/search_result.js | 94 +++++++++++++ target/classes/ehcache.xml | 44 ++++++ target/classes/rule.json | 95 +++++++++++++ target/magnetw/META-INF/MANIFEST.MF | 5 + target/magnetw/WEB-INF/classes/ehcache.xml | 44 ++++++ target/magnetw/WEB-INF/classes/rule.json | 95 +++++++++++++ target/magnetw/WEB-INF/dispatcher-servlet.xml | 40 ++++++ target/magnetw/WEB-INF/views/error.jsp | 17 +++ .../magnetw/WEB-INF/views/search_result.jsp | 127 +++++++++++++++++ target/magnetw/WEB-INF/web.xml | 73 ++++++++++ target/magnetw/index.jsp | 5 + target/magnetw/resources/css/base.css | 11 ++ .../magnetw/resources/css/search_result.css | 34 +++++ target/magnetw/resources/js/search_result.js | 94 +++++++++++++ 31 files changed, 1801 insertions(+) create mode 100644 pom.xml create mode 100644 src/main/java/com/dyhdyh/magnetw/controller/BaseController.java create mode 100644 src/main/java/com/dyhdyh/magnetw/controller/MagnetWController.java create mode 100644 src/main/java/com/dyhdyh/magnetw/filter/EncodingFilter.java create mode 100644 src/main/java/com/dyhdyh/magnetw/model/MagnetInfo.java create mode 100644 src/main/java/com/dyhdyh/magnetw/model/MagnetRule.java create mode 100644 src/main/java/com/dyhdyh/magnetw/service/MagnetWService.java create mode 100644 src/main/java/com/dyhdyh/magnetw/util/GsonUtil.java create mode 100644 src/main/resources/ehcache.xml create mode 100644 src/main/resources/rule.json create mode 100644 src/main/webapp/WEB-INF/dispatcher-servlet.xml create mode 100644 src/main/webapp/WEB-INF/views/error.jsp create mode 100644 src/main/webapp/WEB-INF/views/search_result.jsp create mode 100644 src/main/webapp/WEB-INF/web.xml create mode 100644 src/main/webapp/index.jsp create mode 100644 src/main/webapp/resources/css/base.css create mode 100644 src/main/webapp/resources/css/search_result.css create mode 100644 src/main/webapp/resources/js/search_result.js create mode 100644 target/classes/ehcache.xml create mode 100644 target/classes/rule.json create mode 100644 target/magnetw/META-INF/MANIFEST.MF create mode 100644 target/magnetw/WEB-INF/classes/ehcache.xml create mode 100644 target/magnetw/WEB-INF/classes/rule.json create mode 100644 target/magnetw/WEB-INF/dispatcher-servlet.xml create mode 100644 target/magnetw/WEB-INF/views/error.jsp create mode 100644 target/magnetw/WEB-INF/views/search_result.jsp create mode 100644 target/magnetw/WEB-INF/web.xml create mode 100644 target/magnetw/index.jsp create mode 100644 target/magnetw/resources/css/base.css create mode 100644 target/magnetw/resources/css/search_result.css create mode 100644 target/magnetw/resources/js/search_result.js diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..4e852fb --- /dev/null +++ b/pom.xml @@ -0,0 +1,87 @@ + + 4.0.0 + com.dyhdyh + magnetw + war + 1.0.0 + magnetW + http://maven.apache.org + + + + org.jsoup + jsoup + 1.11.2 + + + net.sourceforge.htmlcleaner + htmlcleaner + 2.21 + + + + + com.google.code.gson + gson + 2.8.2 + + + + + javax.servlet.jsp.jstl + jstl-api + 1.2 + + + + javax.el + javax.el-api + 3.0.0 + + + taglibs + standard + 1.1.2 + + + + + + org.springframework + spring-web + 4.3.1.RELEASE + + + org.springframework + spring-webmvc + 4.3.1.RELEASE + + + org.springframework + spring-context-support + 4.3.1.RELEASE + + + + + net.sf.ehcache + ehcache + 2.10.4 + + + + magnetw + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.6 + 1.6 + + + + + diff --git a/src/main/java/com/dyhdyh/magnetw/controller/BaseController.java b/src/main/java/com/dyhdyh/magnetw/controller/BaseController.java new file mode 100644 index 0000000..5c981d8 --- /dev/null +++ b/src/main/java/com/dyhdyh/magnetw/controller/BaseController.java @@ -0,0 +1,32 @@ +package com.dyhdyh.magnetw.controller; + +import org.springframework.ui.Model; +import org.springframework.util.StringUtils; + +import java.net.SocketTimeoutException; + +/** + * author dengyuhan + * created 2018/3/7 14:19 + */ +public class BaseController { + + protected String error(Model model, Throwable e) { + return error(model, null, e); + } + + protected String error(Model model, String message, Throwable e) { + String defaultMessage = "未知错误"; + if (e != null) { + e.printStackTrace(); + if (e instanceof SocketTimeoutException) { + defaultMessage = "请求超时"; + } + } + if (StringUtils.isEmpty(message)) { + message = defaultMessage; + } + model.addAttribute("error_message", message); + return "error"; + } +} diff --git a/src/main/java/com/dyhdyh/magnetw/controller/MagnetWController.java b/src/main/java/com/dyhdyh/magnetw/controller/MagnetWController.java new file mode 100644 index 0000000..7a19ff3 --- /dev/null +++ b/src/main/java/com/dyhdyh/magnetw/controller/MagnetWController.java @@ -0,0 +1,131 @@ +package com.dyhdyh.magnetw.controller; + +import com.dyhdyh.magnetw.model.MagnetInfo; +import com.dyhdyh.magnetw.model.MagnetRule; +import com.dyhdyh.magnetw.service.MagnetWService; +import com.dyhdyh.magnetw.util.GsonUtil; +import com.google.gson.reflect.TypeToken; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.io.InputStream; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.servlet.http.HttpServletRequest; + +/** + * author dengyuhan + * created 2018/3/6 16:03 + */ +@Controller +@RequestMapping("") +public class MagnetWController extends BaseController { + + @Autowired + MagnetWService magnetWService; + + private Map magnetRuleMap; + private List sites; + + + /** + * 搜索 + * + * @param model + * @param site + * @param keyword + * @param page + * @return + */ + @RequestMapping(value = {"/", "search"}, method = RequestMethod.GET) + public String submitSearchMagnet(Model model, @RequestParam(required = false) String site, @RequestParam(required = false) String keyword, @RequestParam(required = false) Integer page) { + try { + List siteNames = getSiteNames(); + if (StringUtils.isEmpty(site)) { + site = siteNames.get(0); + } + int newPage = magnetWService.transformPage(page); + //model.addAttribute("title", String.format("%s - %s", site, keyword)); + model.addAttribute("current_site", site); + model.addAttribute("keyword", keyword); + model.addAttribute("current_page", newPage); + model.addAttribute("site_list", siteNames); + return "search_result"; + } catch (Exception e) { + return error(model, e); + } + } + + + /** + * @param model + * @param site + * @param keyword + * @param page + * @return + */ + @RequestMapping(value = "search-json", method = {RequestMethod.GET, RequestMethod.POST}) + @ResponseBody + public List submitSearchMagnetJson(Model model, HttpServletRequest request, @RequestParam(required = false) String site, @RequestParam(required = false) String keyword, @RequestParam(required = false) Integer page) { + try { + List siteNames = getSiteNames(); + if (StringUtils.isEmpty(site)) { + site = siteNames.get(0); + } + List infos = null; + int newPage = magnetWService.transformPage(page); + if (!StringUtils.isEmpty(keyword)) { + MagnetRule rule = getMagnetRule().get(site); + infos = magnetWService.parser(rule, keyword, newPage); + } + return infos; + } catch (Exception e) { + error(model, e); + return new ArrayList(); + } + + + } + + /** + * 网站的筛选规则 + * + * @return + */ + private Map getMagnetRule() { + if (magnetRuleMap == null) { + magnetRuleMap = new LinkedHashMap(); + + InputStream inputStream = getClass().getResourceAsStream("/rule.json"); + List rules = GsonUtil.fromJson(inputStream, new TypeToken>() { + }); + for (MagnetRule rule : rules) { + magnetRuleMap.put(rule.getSite(), rule); + } + } + return magnetRuleMap; + } + + + private List getSiteNames() { + if (sites == null) { + sites = new ArrayList(); + Set> entries = getMagnetRule().entrySet(); + for (Map.Entry entry : entries) { + sites.add(entry.getKey()); + } + } + return sites; + } +} diff --git a/src/main/java/com/dyhdyh/magnetw/filter/EncodingFilter.java b/src/main/java/com/dyhdyh/magnetw/filter/EncodingFilter.java new file mode 100644 index 0000000..c845787 --- /dev/null +++ b/src/main/java/com/dyhdyh/magnetw/filter/EncodingFilter.java @@ -0,0 +1,75 @@ +package com.dyhdyh.magnetw.filter; + +import org.springframework.cglib.proxy.InvocationHandler; +import org.springframework.cglib.proxy.Proxy; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.lang.reflect.Method; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * author dengyuhan + * created 2018/3/8 18:05 + */ +public class EncodingFilter extends OncePerRequestFilter { + private String encoding; + + public void setEncoding(String encoding) { + this.encoding = encoding; + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws ServletException, IOException { + // 设置请求响应字符编码 + request.setCharacterEncoding(encoding); + response.setCharacterEncoding(encoding); + + // 传递给目标servlet或jsp的实际上是动态代理的对象,而不是原始的HttpServletRequest对象 + request = (HttpServletRequest) Proxy.newProxyInstance(request.getClass().getClassLoader(), request.getClass().getInterfaces(), new MyInvacationHandler(request)); + chain.doFilter(request, response); + } + + class MyInvacationHandler implements InvocationHandler { + private HttpServletRequest request; + MyInvacationHandler(HttpServletRequest request){ + this.request=request; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{ + if (method.getName().equals("getParameter")) { + String value = request.getParameter((String) args[0]); + try { + if (value != null) { + value = new String(value.getBytes("ISO-8859-1"), encoding); + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return value; + } else if (method.getName().equals("getParameterValues")) { + String[] values = request.getParameterValues((String) args[0]); + if (values != null) { + for (int i = 0; i < values.length; i++) { + try { + values[i] = new String(values[i].getBytes("ISO-8859-1"), encoding); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + } + return values; + } else { + return method.invoke(request, args); + } + } + + } +} \ No newline at end of file diff --git a/src/main/java/com/dyhdyh/magnetw/model/MagnetInfo.java b/src/main/java/com/dyhdyh/magnetw/model/MagnetInfo.java new file mode 100644 index 0000000..5a6d01c --- /dev/null +++ b/src/main/java/com/dyhdyh/magnetw/model/MagnetInfo.java @@ -0,0 +1,66 @@ +package com.dyhdyh.magnetw.model; + +import java.io.Serializable; + +/** + * author dengyuhan + * created 2018/3/7 11:29 + */ +public class MagnetInfo implements Serializable{ + + private String group; + private String magnet; + private String name; + private String size; + private String count; + + private String resolution;//清晰度 + + public String getResolution() { + return resolution; + } + + public void setResolution(String resolution) { + this.resolution = resolution; + } + + public String getGroup() { + return group; + } + + public void setGroup(String group) { + this.group = group; + } + + public String getMagnet() { + return magnet; + } + + public void setMagnet(String magnet) { + this.magnet = magnet; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public String getCount() { + return count; + } + + public void setCount(String count) { + this.count = count; + } +} diff --git a/src/main/java/com/dyhdyh/magnetw/model/MagnetRule.java b/src/main/java/com/dyhdyh/magnetw/model/MagnetRule.java new file mode 100644 index 0000000..052b708 --- /dev/null +++ b/src/main/java/com/dyhdyh/magnetw/model/MagnetRule.java @@ -0,0 +1,35 @@ +package com.dyhdyh.magnetw.model; + +/** + * author dengyuhan + * created 2018/3/7 11:52 + */ +public class MagnetRule extends MagnetInfo{ + private String source; + private String site; + private String waiting; + + public String getSource() { + return source; + } + + public void setSource(String source) { + this.source = source; + } + + public String getSite() { + return site; + } + + public void setSite(String site) { + this.site = site; + } + + public String getWaiting() { + return waiting; + } + + public void setWaiting(String waiting) { + this.waiting = waiting; + } +} diff --git a/src/main/java/com/dyhdyh/magnetw/service/MagnetWService.java b/src/main/java/com/dyhdyh/magnetw/service/MagnetWService.java new file mode 100644 index 0000000..81c9e14 --- /dev/null +++ b/src/main/java/com/dyhdyh/magnetw/service/MagnetWService.java @@ -0,0 +1,132 @@ +package com.dyhdyh.magnetw.service; + +import com.dyhdyh.magnetw.model.MagnetInfo; +import com.dyhdyh.magnetw.model.MagnetRule; + +import org.htmlcleaner.CleanerProperties; +import org.htmlcleaner.DomSerializer; +import org.htmlcleaner.HtmlCleaner; +import org.jsoup.Jsoup; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; + +/** + * author dengyuhan + * created 2018/3/6 16:04 + */ +@Service +public class MagnetWService { + @Cacheable(value = "magnetList", key = "T(String).format('%s-%s-%d',#rule.source,#keyword,#page)") + public List parser(MagnetRule rule, String keyword, int page) throws IOException, XPathExpressionException, ParserConfigurationException { + return parser(rule.getSource(), keyword, page, rule.getGroup(), rule.getMagnet(), rule.getName(), rule.getSize(), rule.getCount()); + } + + @Cacheable(value = "magnetList", key = "T(String).format('%s-%s-%d',#url,#keyword,#page)") + public List parser(String url, String keyword, int page, String group, String magnet, String name, String size, String count) throws IOException, XPathExpressionException, ParserConfigurationException { + String newUrl = transformUrl(url, keyword, page); + String html = Jsoup.connect(newUrl).get().body().html(); + XPath xPath = XPathFactory.newInstance().newXPath(); + Document dom = new DomSerializer(new CleanerProperties()).createDOM(new HtmlCleaner().clean(html)); + + NodeList result = (NodeList) xPath.evaluate(group, dom, XPathConstants.NODESET); + List infos = new ArrayList(); + for (int i = 0; i < result.getLength(); i++) { + Node node = result.item(i); + if (node != null) { + MagnetInfo info = new MagnetInfo(); + Node magnetNote = (Node) xPath.evaluate(magnet, node, XPathConstants.NODE); + //磁力链 + String magnetValue = magnetNote.getNodeValue(); + info.setMagnet(transformMagnet(magnetValue)); + //名称 + String nameValue = ((Node) xPath.evaluate(name, node, XPathConstants.NODE)).getTextContent(); + info.setName(nameValue); + //大小 + String sizeValue = ((Node) xPath.evaluate(size, node, XPathConstants.NODE)).getTextContent(); + info.setSize(sizeValue); + //时间 + String countValue = ((Node) xPath.evaluate(count, node, XPathConstants.NODE)).getTextContent(); + info.setCount(countValue); + //一些加工的额外信息 + String resolution = transformResolution(nameValue); + info.setResolution(resolution); + + infos.add(info); + } + } + return infos; + } + + + public int transformPage(Integer page) { + return page == null || page <= 0 ? 1 : page; + } + + /** + * 数据源链接转换 + * + * @param url + * @param keyword + * @param page + * @return + */ + private String transformUrl(String url, String keyword, int page) { + return url.replaceFirst("XXX", keyword) + .replaceFirst("PPP", String.valueOf(page)); + } + + /** + * 磁力链转换 + * + * @param url + * @return + */ + private String transformMagnet(String url) { + String regex = "magnet:?[^\\\"]+"; + boolean matches = Pattern.matches(regex, url); + if (matches) { + return url; + } else { + String newMagnet; + try { + int startIndex = url.lastIndexOf("/") + 1; + int htmlIndex = url.lastIndexOf(".html"); + newMagnet = url.substring(startIndex, htmlIndex); + } catch (Exception e) { + e.printStackTrace(); + newMagnet = url; + } + return String.format("magnet:?xt=urn:btih:%s", newMagnet); + } + } + + + private String transformResolution(String name) { + String regex720 = ".*(1280|720p|720P).*"; + String regex1080 = ".*(1920|1080p|1080P).*"; + boolean matches720 = Pattern.matches(regex720, name); + if (matches720) { + return "720P"; + } + boolean matches1080 = Pattern.matches(regex1080, name); + if (matches1080) { + return "1080P"; + } + return ""; + } + +} diff --git a/src/main/java/com/dyhdyh/magnetw/util/GsonUtil.java b/src/main/java/com/dyhdyh/magnetw/util/GsonUtil.java new file mode 100644 index 0000000..8c72b06 --- /dev/null +++ b/src/main/java/com/dyhdyh/magnetw/util/GsonUtil.java @@ -0,0 +1,19 @@ +package com.dyhdyh.magnetw.util; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.io.InputStream; +import java.io.InputStreamReader; + +/** + * author dengyuhan + * created 2018/3/7 14:00 + */ +public class GsonUtil { + private static Gson gson = new Gson(); + + public static T fromJson(InputStream inputStream, TypeToken token) { + return gson.fromJson(new InputStreamReader(inputStream), token.getType()); + } +} diff --git a/src/main/resources/ehcache.xml b/src/main/resources/ehcache.xml new file mode 100644 index 0000000..b04d194 --- /dev/null +++ b/src/main/resources/ehcache.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/rule.json b/src/main/resources/rule.json new file mode 100644 index 0000000..6d8ebe7 --- /dev/null +++ b/src/main/resources/rule.json @@ -0,0 +1,95 @@ + [ + { + "site":"AOYOSO", + "waiting":"0", + "group":"//div[@class='col-md-8']//div[@class='panel panel-default']", + "magnet":".//a//@href", + "name":".//a", + "size":".//table//tr//td[2]", + "count":".//table//tr//td[1]", + "source":"http://www.aoyoso.com/search/XXX_ctime_PPP.html" + }, + { + "site":"磁力吧", + "waiting":"0", + "group":"//div[@class='search-item']", + "magnet":".//a//@href", + "name":".//a", + "size":".//span[3]//b", + "count":".//span[2]//b", + "source":"http://www.ciliba.org/s/XXX_rel_PPP.html" + }, + { + "site":"种子搜", + "waiting":"0", + "group":"//table[@class='table table-bordered table-striped']", + "magnet":".//a//@href", + "name":".//tbody//a", + "size":".//tbody//tr//td[2]//strong", + "count":".//tbody//tr//td[1]//strong", + "source":"http://www.zhongziso.com/list/XXX/PPP" + }, + { + "site":"SOBT", + "waiting":"0", + "group":"//div[@class='search-list col-md-8']//div[@class='search-item']", + "magnet":".//a//@href", + "name":".//a[@target='_blank']", + "size":".//div[@class='item-bar']//span[2]//b", + "count":".//div[@class='item-bar']//span[1]//b", + "source":"http://www.sobt5.org/q/XXX_PPP.html" + }, + { + "site":"BT岛", + "waiting":"0", + "group":"//ul[@class='mlist']//li", + "magnet":".//a//@href", + "name":".//a[@target='_blank']", + "size":".//dt//span[1]", + "count":".//dt//span[2]", + "source":"http://www.btdao5.com/list/XXX-s1d-PPP.html" + }, + { + "site":"bt177", + "waiting":"0", + "group":"//li", + "magnet":".//a//@href", + "name":".//a", + "size":".//span[1]", + "count":".//span[2]", + "source":"http://www.bt177.net/word/XXX_PPP.html" + }, + { + "site":"zhongzidi", + "waiting":"0", + "group":"//div[@class='panel-body']//ul", + "magnet":".//dl[2]/a[1]//@href", + "name":".//a", + "size":".//dl[1]/dd[2]", + "count":".//dl[1]/dd[3]", + "source":"https://m.zhongzidi.com/list/XXX/PPP" + + }, + { + "site":"cililiana", + "waiting":"0", + "group":"//ul[@class='mlist']//li", + "magnet":".//div[2]/a[1]//@href", + "name":".//div[1]/a", + "size":".//dl/dt/span[1]", + "count":".//dl/dt/span[3]", + "source":"http://cililiana.com/list/XXX/PPP.html" + + }, + { + "site":"屌丝搜", + "waiting":"0", + "group":"//ul[@class='mlist']//li", + "magnet":".//div[2]/a[1]//@href", + "name":".//div[1]/a", + "size":".//dl/dt/span[1]", + "count":".//dl/dt/span[3]", + "source":"http://www.diaosisou.org/list/XXX/PPP" + + } + ] diff --git a/src/main/webapp/WEB-INF/dispatcher-servlet.xml b/src/main/webapp/WEB-INF/dispatcher-servlet.xml new file mode 100644 index 0000000..2381d10 --- /dev/null +++ b/src/main/webapp/WEB-INF/dispatcher-servlet.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/error.jsp b/src/main/webapp/WEB-INF/views/error.jsp new file mode 100644 index 0000000..1522c26 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/error.jsp @@ -0,0 +1,17 @@ +<%-- + Created by IntelliJ IDEA. + User: dengyuhan + Date: 2018/3/7 + Time: 14:18 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ page isELIgnored="false" %> + + + 出错了 + + +

${error_message}

+ + diff --git a/src/main/webapp/WEB-INF/views/search_result.jsp b/src/main/webapp/WEB-INF/views/search_result.jsp new file mode 100644 index 0000000..d3e69a2 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/search_result.jsp @@ -0,0 +1,127 @@ +<%-- + Created by IntelliJ IDEA. + User: dengyuhan + Date: 2018/3/7 + Time: 14:18 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ page isELIgnored="false" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + <%----%> + + ${keyword} + + + + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+
+ + + + + + + + + + +
+
+
+ + + + + <%-- + + --%> +
+
+ + +
+
+ +<%--
+ + + + + + + + + +
${info.name}${info.size}${info.resolution}${info.count}
+ +
+ + + + +
+
--%> + + + + + + + + diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..345591b --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,73 @@ + + + + + + + contextConfigLocation + /WEB-INF/dispatcher-servlet.xml + + + org.springframework.web.context.ContextLoaderListener + + + dispatcher + org.springframework.web.servlet.DispatcherServlet + 1 + + + dispatcher + / + + + + search + + + + characterEncodingFilter + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + forceEncoding + true + + + + characterEncodingFilter + /* + + diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp new file mode 100644 index 0000000..c38169b --- /dev/null +++ b/src/main/webapp/index.jsp @@ -0,0 +1,5 @@ + + +

Hello World!

+ + diff --git a/src/main/webapp/resources/css/base.css b/src/main/webapp/resources/css/base.css new file mode 100644 index 0000000..f9a9beb --- /dev/null +++ b/src/main/webapp/resources/css/base.css @@ -0,0 +1,11 @@ +.container-margin-top { + margin-top: 3%; +} + +.td-center { + text-align: center; +} + +.no-padding { + padding: 0px; +} \ No newline at end of file diff --git a/src/main/webapp/resources/css/search_result.css b/src/main/webapp/resources/css/search_result.css new file mode 100644 index 0000000..4f4f5f6 --- /dev/null +++ b/src/main/webapp/resources/css/search_result.css @@ -0,0 +1,34 @@ +.search_form { +} + +.search_result_pager { + float: right +} + +.td-count { + width: 10%; +} + +.td-page-action { + cursor: pointer; +} + +.td-page-number { + margin-left: 10px; + margin-right: 10px; +} +.search_site{ + margin-top: 1.5%; + margin-bottom: 1.5%; +} + +#tr_load_more{ + cursor: pointer; +} + +.container-margin-bottom { + margin-bottom: 1.5%; +} +.loader div{ + background-color: #D32F2F; +} \ No newline at end of file diff --git a/src/main/webapp/resources/js/search_result.js b/src/main/webapp/resources/js/search_result.js new file mode 100644 index 0000000..6824c91 --- /dev/null +++ b/src/main/webapp/resources/js/search_result.js @@ -0,0 +1,94 @@ +var keyword = getQueryString("keyword"); +var site = getQueryString("site"); +var page = getQueryString("page"); + +$(document).ready(function () { + + $("#btn_search").click(function () { + requestSearchPage() + }); + + $("input[name='site']").change(function () { + requestSearchPage() + }); + + console.log(keyword) + if (keyword != '') { + requestSearchInit(); + } +}); + +var lastRequest = null; + +function requestSearchPage() { + var from_keyword = $('#keyword').val(); + var form_site = $("input[name='site']:checked").val(); + $('#form_keyword').val(from_keyword); + $('#form_page').val(1); + $('#form_site').val(form_site); + + $('#form_search').submit(); +} + +function requestSearchInit() { + $('#table_content').find("tr[name='content']").remove(); + $('#div_loading').show(); + page = 1; + requestSearch(); +} + +function requestSearch(stopLoading) { + if (lastRequest !== null) { + lastRequest.abort(); + } + lastRequest = $.ajax({ + type: 'get', + url: 'search-json', + data: {site: site, keyword: keyword, page: page}, + dataType: 'json', + success: function (reponse) { + lastRequest = null; + if (stopLoading != undefined) { + stopLoading(); + } + $('#div_loading').hide(); + if (reponse.length > 0) { + $("#div_btn_request_page").show(); + } else { + $("#div_btn_request_page").hide(); + } + page = page + 1; + for (var i = 0; i < reponse.length; i++) { + var html = "" + + "" + reponse[i].name + "" + + "" + + reponse[i].size + "" + + "" + + reponse[i].resolution + "" + + "" + + reponse[i].count + "" + + "" + $("#tr_placeholder").before(html); + } + }, + error: function (xhr, type) { + lastRequest = null; + if (stopLoading != undefined) { + stopLoading(); + } + alert('出错了'); + } + }); +} + +function getQueryString(name) { + var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); + var r = window.location.search.substr(1).match(reg); + var context = ""; + if (r != null) + context = r[2]; + reg = null; + r = null; + var str = context == null || context == "" || context == "undefined" ? "" : context; + return decodeURI(str); +} diff --git a/target/classes/ehcache.xml b/target/classes/ehcache.xml new file mode 100644 index 0000000..b04d194 --- /dev/null +++ b/target/classes/ehcache.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/target/classes/rule.json b/target/classes/rule.json new file mode 100644 index 0000000..6d8ebe7 --- /dev/null +++ b/target/classes/rule.json @@ -0,0 +1,95 @@ + [ + { + "site":"AOYOSO", + "waiting":"0", + "group":"//div[@class='col-md-8']//div[@class='panel panel-default']", + "magnet":".//a//@href", + "name":".//a", + "size":".//table//tr//td[2]", + "count":".//table//tr//td[1]", + "source":"http://www.aoyoso.com/search/XXX_ctime_PPP.html" + }, + { + "site":"磁力吧", + "waiting":"0", + "group":"//div[@class='search-item']", + "magnet":".//a//@href", + "name":".//a", + "size":".//span[3]//b", + "count":".//span[2]//b", + "source":"http://www.ciliba.org/s/XXX_rel_PPP.html" + }, + { + "site":"种子搜", + "waiting":"0", + "group":"//table[@class='table table-bordered table-striped']", + "magnet":".//a//@href", + "name":".//tbody//a", + "size":".//tbody//tr//td[2]//strong", + "count":".//tbody//tr//td[1]//strong", + "source":"http://www.zhongziso.com/list/XXX/PPP" + }, + { + "site":"SOBT", + "waiting":"0", + "group":"//div[@class='search-list col-md-8']//div[@class='search-item']", + "magnet":".//a//@href", + "name":".//a[@target='_blank']", + "size":".//div[@class='item-bar']//span[2]//b", + "count":".//div[@class='item-bar']//span[1]//b", + "source":"http://www.sobt5.org/q/XXX_PPP.html" + }, + { + "site":"BT岛", + "waiting":"0", + "group":"//ul[@class='mlist']//li", + "magnet":".//a//@href", + "name":".//a[@target='_blank']", + "size":".//dt//span[1]", + "count":".//dt//span[2]", + "source":"http://www.btdao5.com/list/XXX-s1d-PPP.html" + }, + { + "site":"bt177", + "waiting":"0", + "group":"//li", + "magnet":".//a//@href", + "name":".//a", + "size":".//span[1]", + "count":".//span[2]", + "source":"http://www.bt177.net/word/XXX_PPP.html" + }, + { + "site":"zhongzidi", + "waiting":"0", + "group":"//div[@class='panel-body']//ul", + "magnet":".//dl[2]/a[1]//@href", + "name":".//a", + "size":".//dl[1]/dd[2]", + "count":".//dl[1]/dd[3]", + "source":"https://m.zhongzidi.com/list/XXX/PPP" + + }, + { + "site":"cililiana", + "waiting":"0", + "group":"//ul[@class='mlist']//li", + "magnet":".//div[2]/a[1]//@href", + "name":".//div[1]/a", + "size":".//dl/dt/span[1]", + "count":".//dl/dt/span[3]", + "source":"http://cililiana.com/list/XXX/PPP.html" + + }, + { + "site":"屌丝搜", + "waiting":"0", + "group":"//ul[@class='mlist']//li", + "magnet":".//div[2]/a[1]//@href", + "name":".//div[1]/a", + "size":".//dl/dt/span[1]", + "count":".//dl/dt/span[3]", + "source":"http://www.diaosisou.org/list/XXX/PPP" + + } + ] diff --git a/target/magnetw/META-INF/MANIFEST.MF b/target/magnetw/META-INF/MANIFEST.MF new file mode 100644 index 0000000..82551b4 --- /dev/null +++ b/target/magnetw/META-INF/MANIFEST.MF @@ -0,0 +1,5 @@ +Manifest-Version: 1.0 +Built-By: dengyuhan +Created-By: IntelliJ IDEA +Build-Jdk: 1.8.0_101 + diff --git a/target/magnetw/WEB-INF/classes/ehcache.xml b/target/magnetw/WEB-INF/classes/ehcache.xml new file mode 100644 index 0000000..b04d194 --- /dev/null +++ b/target/magnetw/WEB-INF/classes/ehcache.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/target/magnetw/WEB-INF/classes/rule.json b/target/magnetw/WEB-INF/classes/rule.json new file mode 100644 index 0000000..6d8ebe7 --- /dev/null +++ b/target/magnetw/WEB-INF/classes/rule.json @@ -0,0 +1,95 @@ + [ + { + "site":"AOYOSO", + "waiting":"0", + "group":"//div[@class='col-md-8']//div[@class='panel panel-default']", + "magnet":".//a//@href", + "name":".//a", + "size":".//table//tr//td[2]", + "count":".//table//tr//td[1]", + "source":"http://www.aoyoso.com/search/XXX_ctime_PPP.html" + }, + { + "site":"磁力吧", + "waiting":"0", + "group":"//div[@class='search-item']", + "magnet":".//a//@href", + "name":".//a", + "size":".//span[3]//b", + "count":".//span[2]//b", + "source":"http://www.ciliba.org/s/XXX_rel_PPP.html" + }, + { + "site":"种子搜", + "waiting":"0", + "group":"//table[@class='table table-bordered table-striped']", + "magnet":".//a//@href", + "name":".//tbody//a", + "size":".//tbody//tr//td[2]//strong", + "count":".//tbody//tr//td[1]//strong", + "source":"http://www.zhongziso.com/list/XXX/PPP" + }, + { + "site":"SOBT", + "waiting":"0", + "group":"//div[@class='search-list col-md-8']//div[@class='search-item']", + "magnet":".//a//@href", + "name":".//a[@target='_blank']", + "size":".//div[@class='item-bar']//span[2]//b", + "count":".//div[@class='item-bar']//span[1]//b", + "source":"http://www.sobt5.org/q/XXX_PPP.html" + }, + { + "site":"BT岛", + "waiting":"0", + "group":"//ul[@class='mlist']//li", + "magnet":".//a//@href", + "name":".//a[@target='_blank']", + "size":".//dt//span[1]", + "count":".//dt//span[2]", + "source":"http://www.btdao5.com/list/XXX-s1d-PPP.html" + }, + { + "site":"bt177", + "waiting":"0", + "group":"//li", + "magnet":".//a//@href", + "name":".//a", + "size":".//span[1]", + "count":".//span[2]", + "source":"http://www.bt177.net/word/XXX_PPP.html" + }, + { + "site":"zhongzidi", + "waiting":"0", + "group":"//div[@class='panel-body']//ul", + "magnet":".//dl[2]/a[1]//@href", + "name":".//a", + "size":".//dl[1]/dd[2]", + "count":".//dl[1]/dd[3]", + "source":"https://m.zhongzidi.com/list/XXX/PPP" + + }, + { + "site":"cililiana", + "waiting":"0", + "group":"//ul[@class='mlist']//li", + "magnet":".//div[2]/a[1]//@href", + "name":".//div[1]/a", + "size":".//dl/dt/span[1]", + "count":".//dl/dt/span[3]", + "source":"http://cililiana.com/list/XXX/PPP.html" + + }, + { + "site":"屌丝搜", + "waiting":"0", + "group":"//ul[@class='mlist']//li", + "magnet":".//div[2]/a[1]//@href", + "name":".//div[1]/a", + "size":".//dl/dt/span[1]", + "count":".//dl/dt/span[3]", + "source":"http://www.diaosisou.org/list/XXX/PPP" + + } + ] diff --git a/target/magnetw/WEB-INF/dispatcher-servlet.xml b/target/magnetw/WEB-INF/dispatcher-servlet.xml new file mode 100644 index 0000000..2381d10 --- /dev/null +++ b/target/magnetw/WEB-INF/dispatcher-servlet.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/target/magnetw/WEB-INF/views/error.jsp b/target/magnetw/WEB-INF/views/error.jsp new file mode 100644 index 0000000..1522c26 --- /dev/null +++ b/target/magnetw/WEB-INF/views/error.jsp @@ -0,0 +1,17 @@ +<%-- + Created by IntelliJ IDEA. + User: dengyuhan + Date: 2018/3/7 + Time: 14:18 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ page isELIgnored="false" %> + + + 出错了 + + +

${error_message}

+ + diff --git a/target/magnetw/WEB-INF/views/search_result.jsp b/target/magnetw/WEB-INF/views/search_result.jsp new file mode 100644 index 0000000..d3e69a2 --- /dev/null +++ b/target/magnetw/WEB-INF/views/search_result.jsp @@ -0,0 +1,127 @@ +<%-- + Created by IntelliJ IDEA. + User: dengyuhan + Date: 2018/3/7 + Time: 14:18 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ page isELIgnored="false" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + <%----%> + + ${keyword} + + + + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+
+ + + + + + + + + + +
+
+
+ + + + + <%-- + + --%> +
+
+ + +
+
+ +<%--
+ + + + + + + + + +
${info.name}${info.size}${info.resolution}${info.count}
+ +
+ + + + +
+
--%> + + + + + + + + diff --git a/target/magnetw/WEB-INF/web.xml b/target/magnetw/WEB-INF/web.xml new file mode 100644 index 0000000..345591b --- /dev/null +++ b/target/magnetw/WEB-INF/web.xml @@ -0,0 +1,73 @@ + + + + + + + contextConfigLocation + /WEB-INF/dispatcher-servlet.xml + + + org.springframework.web.context.ContextLoaderListener + + + dispatcher + org.springframework.web.servlet.DispatcherServlet + 1 + + + dispatcher + / + + + + search + + + + characterEncodingFilter + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + forceEncoding + true + + + + characterEncodingFilter + /* + + diff --git a/target/magnetw/index.jsp b/target/magnetw/index.jsp new file mode 100644 index 0000000..c38169b --- /dev/null +++ b/target/magnetw/index.jsp @@ -0,0 +1,5 @@ + + +

Hello World!

+ + diff --git a/target/magnetw/resources/css/base.css b/target/magnetw/resources/css/base.css new file mode 100644 index 0000000..f9a9beb --- /dev/null +++ b/target/magnetw/resources/css/base.css @@ -0,0 +1,11 @@ +.container-margin-top { + margin-top: 3%; +} + +.td-center { + text-align: center; +} + +.no-padding { + padding: 0px; +} \ No newline at end of file diff --git a/target/magnetw/resources/css/search_result.css b/target/magnetw/resources/css/search_result.css new file mode 100644 index 0000000..4f4f5f6 --- /dev/null +++ b/target/magnetw/resources/css/search_result.css @@ -0,0 +1,34 @@ +.search_form { +} + +.search_result_pager { + float: right +} + +.td-count { + width: 10%; +} + +.td-page-action { + cursor: pointer; +} + +.td-page-number { + margin-left: 10px; + margin-right: 10px; +} +.search_site{ + margin-top: 1.5%; + margin-bottom: 1.5%; +} + +#tr_load_more{ + cursor: pointer; +} + +.container-margin-bottom { + margin-bottom: 1.5%; +} +.loader div{ + background-color: #D32F2F; +} \ No newline at end of file diff --git a/target/magnetw/resources/js/search_result.js b/target/magnetw/resources/js/search_result.js new file mode 100644 index 0000000..6824c91 --- /dev/null +++ b/target/magnetw/resources/js/search_result.js @@ -0,0 +1,94 @@ +var keyword = getQueryString("keyword"); +var site = getQueryString("site"); +var page = getQueryString("page"); + +$(document).ready(function () { + + $("#btn_search").click(function () { + requestSearchPage() + }); + + $("input[name='site']").change(function () { + requestSearchPage() + }); + + console.log(keyword) + if (keyword != '') { + requestSearchInit(); + } +}); + +var lastRequest = null; + +function requestSearchPage() { + var from_keyword = $('#keyword').val(); + var form_site = $("input[name='site']:checked").val(); + $('#form_keyword').val(from_keyword); + $('#form_page').val(1); + $('#form_site').val(form_site); + + $('#form_search').submit(); +} + +function requestSearchInit() { + $('#table_content').find("tr[name='content']").remove(); + $('#div_loading').show(); + page = 1; + requestSearch(); +} + +function requestSearch(stopLoading) { + if (lastRequest !== null) { + lastRequest.abort(); + } + lastRequest = $.ajax({ + type: 'get', + url: 'search-json', + data: {site: site, keyword: keyword, page: page}, + dataType: 'json', + success: function (reponse) { + lastRequest = null; + if (stopLoading != undefined) { + stopLoading(); + } + $('#div_loading').hide(); + if (reponse.length > 0) { + $("#div_btn_request_page").show(); + } else { + $("#div_btn_request_page").hide(); + } + page = page + 1; + for (var i = 0; i < reponse.length; i++) { + var html = "" + + "" + reponse[i].name + "" + + "" + + reponse[i].size + "" + + "" + + reponse[i].resolution + "" + + "" + + reponse[i].count + "" + + "" + $("#tr_placeholder").before(html); + } + }, + error: function (xhr, type) { + lastRequest = null; + if (stopLoading != undefined) { + stopLoading(); + } + alert('出错了'); + } + }); +} + +function getQueryString(name) { + var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); + var r = window.location.search.substr(1).match(reg); + var context = ""; + if (r != null) + context = r[2]; + reg = null; + r = null; + var str = context == null || context == "" || context == "undefined" ? "" : context; + return decodeURI(str); +} From 387f443fb116708fdbe1c8356bc70dc7805ec120 Mon Sep 17 00:00:00 2001 From: dengyuhan <464958567@qq.com> Date: Fri, 9 Mar 2018 16:31:12 +0800 Subject: [PATCH 02/10] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=8F=96=E9=93=BE?= =?UTF-8?q?=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../magnetw/WEB-INF}/classes/ehcache.xml | 0 .../magnetw/WEB-INF}/classes/rule.json | 0 .../magnetw/service/MagnetWService.java | 16 ++- src/main/resources/ehcache.xml | 2 + .../webapp/WEB-INF/views/search_result.jsp | 101 ++++++++------ .../webapp/resources/css/search_result.css | 21 ++- src/main/webapp/resources/js/search_result.js | 12 ++ target/magnetw/META-INF/MANIFEST.MF | 5 - target/magnetw/WEB-INF/classes/ehcache.xml | 44 ------ target/magnetw/WEB-INF/classes/rule.json | 95 ------------- target/magnetw/WEB-INF/dispatcher-servlet.xml | 40 ------ target/magnetw/WEB-INF/views/error.jsp | 17 --- .../magnetw/WEB-INF/views/search_result.jsp | 127 ------------------ target/magnetw/WEB-INF/web.xml | 73 ---------- target/magnetw/index.jsp | 5 - target/magnetw/resources/css/base.css | 11 -- .../magnetw/resources/css/search_result.css | 34 ----- target/magnetw/resources/js/search_result.js | 94 ------------- 18 files changed, 104 insertions(+), 593 deletions(-) rename {target => out/artifacts/magnetw/WEB-INF}/classes/ehcache.xml (100%) rename {target => out/artifacts/magnetw/WEB-INF}/classes/rule.json (100%) delete mode 100644 target/magnetw/META-INF/MANIFEST.MF delete mode 100644 target/magnetw/WEB-INF/classes/ehcache.xml delete mode 100644 target/magnetw/WEB-INF/classes/rule.json delete mode 100644 target/magnetw/WEB-INF/dispatcher-servlet.xml delete mode 100644 target/magnetw/WEB-INF/views/error.jsp delete mode 100644 target/magnetw/WEB-INF/views/search_result.jsp delete mode 100644 target/magnetw/WEB-INF/web.xml delete mode 100644 target/magnetw/index.jsp delete mode 100644 target/magnetw/resources/css/base.css delete mode 100644 target/magnetw/resources/css/search_result.css delete mode 100644 target/magnetw/resources/js/search_result.js diff --git a/target/classes/ehcache.xml b/out/artifacts/magnetw/WEB-INF/classes/ehcache.xml similarity index 100% rename from target/classes/ehcache.xml rename to out/artifacts/magnetw/WEB-INF/classes/ehcache.xml diff --git a/target/classes/rule.json b/out/artifacts/magnetw/WEB-INF/classes/rule.json similarity index 100% rename from target/classes/rule.json rename to out/artifacts/magnetw/WEB-INF/classes/rule.json diff --git a/src/main/java/com/dyhdyh/magnetw/service/MagnetWService.java b/src/main/java/com/dyhdyh/magnetw/service/MagnetWService.java index 81c9e14..972b396 100644 --- a/src/main/java/com/dyhdyh/magnetw/service/MagnetWService.java +++ b/src/main/java/com/dyhdyh/magnetw/service/MagnetWService.java @@ -101,11 +101,23 @@ private String transformMagnet(String url) { if (matches) { return url; } else { + System.out.println(url); String newMagnet; try { - int startIndex = url.lastIndexOf("/") + 1; + StringBuffer sb = new StringBuffer(url); int htmlIndex = url.lastIndexOf(".html"); - newMagnet = url.substring(startIndex, htmlIndex); + if (htmlIndex != -1) { + sb.delete(htmlIndex, sb.length()); + } + int paramIndex = url.indexOf("&"); + if (paramIndex != -1) { + sb.delete(paramIndex, sb.length()); + } + if (sb.length() >= 40) { + newMagnet = sb.substring(sb.length() - 40, sb.length()); + } else { + newMagnet = url; + } } catch (Exception e) { e.printStackTrace(); newMagnet = url; diff --git a/src/main/resources/ehcache.xml b/src/main/resources/ehcache.xml index b04d194..8a2f0ee 100644 --- a/src/main/resources/ehcache.xml +++ b/src/main/resources/ehcache.xml @@ -15,6 +15,8 @@ diff --git a/src/main/webapp/WEB-INF/views/search_result.jsp b/src/main/webapp/WEB-INF/views/search_result.jsp index d3e69a2..9be46d1 100644 --- a/src/main/webapp/WEB-INF/views/search_result.jsp +++ b/src/main/webapp/WEB-INF/views/search_result.jsp @@ -14,6 +14,8 @@ <%----%> ${keyword} + @@ -29,54 +31,61 @@ - -
-
-
-
- +
+
+
+
+
+ +
+
+ +
-
- +
+ + + + + + + + + +
-
- - - - - - - - - - -
-
-
- @@ -123,5 +132,11 @@ } }); + + +
+ +
diff --git a/src/main/webapp/resources/css/search_result.css b/src/main/webapp/resources/css/search_result.css index 4f4f5f6..5c19207 100644 --- a/src/main/webapp/resources/css/search_result.css +++ b/src/main/webapp/resources/css/search_result.css @@ -17,18 +17,33 @@ margin-left: 10px; margin-right: 10px; } -.search_site{ + +.search_site { margin-top: 1.5%; margin-bottom: 1.5%; } -#tr_load_more{ +#tr_load_more { cursor: pointer; } .container-margin-bottom { margin-bottom: 1.5%; } -.loader div{ + +.loader div { background-color: #D32F2F; +} + +#footer { + width: 100%; + text-align: center; + height: 60px; + bottom: 0; + background: #eeeeee; +} + +#footer-content{ + font-size: 18px; + padding-top: 20px; } \ No newline at end of file diff --git a/src/main/webapp/resources/js/search_result.js b/src/main/webapp/resources/js/search_result.js index 6824c91..0298d12 100644 --- a/src/main/webapp/resources/js/search_result.js +++ b/src/main/webapp/resources/js/search_result.js @@ -4,10 +4,22 @@ var page = getQueryString("page"); $(document).ready(function () { + $('#keyword').bind('keypress', function (event) { + if (event.keyCode == 13) { + requestSearchPage() + } + }); + $("#btn_search").click(function () { requestSearchPage() }); + $("#disclaimer").click(function () { + var content="本网站完全开源,仅用于技术交流学习,用户使用本工具进行的任何操作,本服务器均不保存。\n\n" + + "本网站不会存储,不能分享,也不提供任何传播信息与资源的功能, 对此工具的非法使用概不负责。" + alert(content) + }); + $("input[name='site']").change(function () { requestSearchPage() }); diff --git a/target/magnetw/META-INF/MANIFEST.MF b/target/magnetw/META-INF/MANIFEST.MF deleted file mode 100644 index 82551b4..0000000 --- a/target/magnetw/META-INF/MANIFEST.MF +++ /dev/null @@ -1,5 +0,0 @@ -Manifest-Version: 1.0 -Built-By: dengyuhan -Created-By: IntelliJ IDEA -Build-Jdk: 1.8.0_101 - diff --git a/target/magnetw/WEB-INF/classes/ehcache.xml b/target/magnetw/WEB-INF/classes/ehcache.xml deleted file mode 100644 index b04d194..0000000 --- a/target/magnetw/WEB-INF/classes/ehcache.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/target/magnetw/WEB-INF/classes/rule.json b/target/magnetw/WEB-INF/classes/rule.json deleted file mode 100644 index 6d8ebe7..0000000 --- a/target/magnetw/WEB-INF/classes/rule.json +++ /dev/null @@ -1,95 +0,0 @@ - [ - { - "site":"AOYOSO", - "waiting":"0", - "group":"//div[@class='col-md-8']//div[@class='panel panel-default']", - "magnet":".//a//@href", - "name":".//a", - "size":".//table//tr//td[2]", - "count":".//table//tr//td[1]", - "source":"http://www.aoyoso.com/search/XXX_ctime_PPP.html" - }, - { - "site":"磁力吧", - "waiting":"0", - "group":"//div[@class='search-item']", - "magnet":".//a//@href", - "name":".//a", - "size":".//span[3]//b", - "count":".//span[2]//b", - "source":"http://www.ciliba.org/s/XXX_rel_PPP.html" - }, - { - "site":"种子搜", - "waiting":"0", - "group":"//table[@class='table table-bordered table-striped']", - "magnet":".//a//@href", - "name":".//tbody//a", - "size":".//tbody//tr//td[2]//strong", - "count":".//tbody//tr//td[1]//strong", - "source":"http://www.zhongziso.com/list/XXX/PPP" - }, - { - "site":"SOBT", - "waiting":"0", - "group":"//div[@class='search-list col-md-8']//div[@class='search-item']", - "magnet":".//a//@href", - "name":".//a[@target='_blank']", - "size":".//div[@class='item-bar']//span[2]//b", - "count":".//div[@class='item-bar']//span[1]//b", - "source":"http://www.sobt5.org/q/XXX_PPP.html" - }, - { - "site":"BT岛", - "waiting":"0", - "group":"//ul[@class='mlist']//li", - "magnet":".//a//@href", - "name":".//a[@target='_blank']", - "size":".//dt//span[1]", - "count":".//dt//span[2]", - "source":"http://www.btdao5.com/list/XXX-s1d-PPP.html" - }, - { - "site":"bt177", - "waiting":"0", - "group":"//li", - "magnet":".//a//@href", - "name":".//a", - "size":".//span[1]", - "count":".//span[2]", - "source":"http://www.bt177.net/word/XXX_PPP.html" - }, - { - "site":"zhongzidi", - "waiting":"0", - "group":"//div[@class='panel-body']//ul", - "magnet":".//dl[2]/a[1]//@href", - "name":".//a", - "size":".//dl[1]/dd[2]", - "count":".//dl[1]/dd[3]", - "source":"https://m.zhongzidi.com/list/XXX/PPP" - - }, - { - "site":"cililiana", - "waiting":"0", - "group":"//ul[@class='mlist']//li", - "magnet":".//div[2]/a[1]//@href", - "name":".//div[1]/a", - "size":".//dl/dt/span[1]", - "count":".//dl/dt/span[3]", - "source":"http://cililiana.com/list/XXX/PPP.html" - - }, - { - "site":"屌丝搜", - "waiting":"0", - "group":"//ul[@class='mlist']//li", - "magnet":".//div[2]/a[1]//@href", - "name":".//div[1]/a", - "size":".//dl/dt/span[1]", - "count":".//dl/dt/span[3]", - "source":"http://www.diaosisou.org/list/XXX/PPP" - - } - ] diff --git a/target/magnetw/WEB-INF/dispatcher-servlet.xml b/target/magnetw/WEB-INF/dispatcher-servlet.xml deleted file mode 100644 index 2381d10..0000000 --- a/target/magnetw/WEB-INF/dispatcher-servlet.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/target/magnetw/WEB-INF/views/error.jsp b/target/magnetw/WEB-INF/views/error.jsp deleted file mode 100644 index 1522c26..0000000 --- a/target/magnetw/WEB-INF/views/error.jsp +++ /dev/null @@ -1,17 +0,0 @@ -<%-- - Created by IntelliJ IDEA. - User: dengyuhan - Date: 2018/3/7 - Time: 14:18 - To change this template use File | Settings | File Templates. ---%> -<%@ page contentType="text/html;charset=UTF-8" language="java" %> -<%@ page isELIgnored="false" %> - - - 出错了 - - -

${error_message}

- - diff --git a/target/magnetw/WEB-INF/views/search_result.jsp b/target/magnetw/WEB-INF/views/search_result.jsp deleted file mode 100644 index d3e69a2..0000000 --- a/target/magnetw/WEB-INF/views/search_result.jsp +++ /dev/null @@ -1,127 +0,0 @@ -<%-- - Created by IntelliJ IDEA. - User: dengyuhan - Date: 2018/3/7 - Time: 14:18 - To change this template use File | Settings | File Templates. ---%> -<%@ page contentType="text/html;charset=UTF-8" language="java" %> -<%@ page isELIgnored="false" %> -<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> -<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> - - - <%----%> - - ${keyword} - - - - - - - - - - - - -
-
-
-
- -
-
- -
-
-
- - - - - - - - - - -
-
-
- - - - - <%-- - - --%> -
-
- - -
-
- -<%--
- - - - - - - - - -
${info.name}${info.size}${info.resolution}${info.count}
- -
- - - - -
-
--%> - -
- - - - - - diff --git a/target/magnetw/WEB-INF/web.xml b/target/magnetw/WEB-INF/web.xml deleted file mode 100644 index 345591b..0000000 --- a/target/magnetw/WEB-INF/web.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - contextConfigLocation - /WEB-INF/dispatcher-servlet.xml - - - org.springframework.web.context.ContextLoaderListener - - - dispatcher - org.springframework.web.servlet.DispatcherServlet - 1 - - - dispatcher - / - - - - search - - - - characterEncodingFilter - org.springframework.web.filter.CharacterEncodingFilter - - encoding - UTF-8 - - - forceEncoding - true - - - - characterEncodingFilter - /* - - diff --git a/target/magnetw/index.jsp b/target/magnetw/index.jsp deleted file mode 100644 index c38169b..0000000 --- a/target/magnetw/index.jsp +++ /dev/null @@ -1,5 +0,0 @@ - - -

Hello World!

- - diff --git a/target/magnetw/resources/css/base.css b/target/magnetw/resources/css/base.css deleted file mode 100644 index f9a9beb..0000000 --- a/target/magnetw/resources/css/base.css +++ /dev/null @@ -1,11 +0,0 @@ -.container-margin-top { - margin-top: 3%; -} - -.td-center { - text-align: center; -} - -.no-padding { - padding: 0px; -} \ No newline at end of file diff --git a/target/magnetw/resources/css/search_result.css b/target/magnetw/resources/css/search_result.css deleted file mode 100644 index 4f4f5f6..0000000 --- a/target/magnetw/resources/css/search_result.css +++ /dev/null @@ -1,34 +0,0 @@ -.search_form { -} - -.search_result_pager { - float: right -} - -.td-count { - width: 10%; -} - -.td-page-action { - cursor: pointer; -} - -.td-page-number { - margin-left: 10px; - margin-right: 10px; -} -.search_site{ - margin-top: 1.5%; - margin-bottom: 1.5%; -} - -#tr_load_more{ - cursor: pointer; -} - -.container-margin-bottom { - margin-bottom: 1.5%; -} -.loader div{ - background-color: #D32F2F; -} \ No newline at end of file diff --git a/target/magnetw/resources/js/search_result.js b/target/magnetw/resources/js/search_result.js deleted file mode 100644 index 6824c91..0000000 --- a/target/magnetw/resources/js/search_result.js +++ /dev/null @@ -1,94 +0,0 @@ -var keyword = getQueryString("keyword"); -var site = getQueryString("site"); -var page = getQueryString("page"); - -$(document).ready(function () { - - $("#btn_search").click(function () { - requestSearchPage() - }); - - $("input[name='site']").change(function () { - requestSearchPage() - }); - - console.log(keyword) - if (keyword != '') { - requestSearchInit(); - } -}); - -var lastRequest = null; - -function requestSearchPage() { - var from_keyword = $('#keyword').val(); - var form_site = $("input[name='site']:checked").val(); - $('#form_keyword').val(from_keyword); - $('#form_page').val(1); - $('#form_site').val(form_site); - - $('#form_search').submit(); -} - -function requestSearchInit() { - $('#table_content').find("tr[name='content']").remove(); - $('#div_loading').show(); - page = 1; - requestSearch(); -} - -function requestSearch(stopLoading) { - if (lastRequest !== null) { - lastRequest.abort(); - } - lastRequest = $.ajax({ - type: 'get', - url: 'search-json', - data: {site: site, keyword: keyword, page: page}, - dataType: 'json', - success: function (reponse) { - lastRequest = null; - if (stopLoading != undefined) { - stopLoading(); - } - $('#div_loading').hide(); - if (reponse.length > 0) { - $("#div_btn_request_page").show(); - } else { - $("#div_btn_request_page").hide(); - } - page = page + 1; - for (var i = 0; i < reponse.length; i++) { - var html = "" + - "" + reponse[i].name + "" + - "" + - reponse[i].size + "" + - "" + - reponse[i].resolution + "" + - "" + - reponse[i].count + "" + - "" - $("#tr_placeholder").before(html); - } - }, - error: function (xhr, type) { - lastRequest = null; - if (stopLoading != undefined) { - stopLoading(); - } - alert('出错了'); - } - }); -} - -function getQueryString(name) { - var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); - var r = window.location.search.substr(1).match(reg); - var context = ""; - if (r != null) - context = r[2]; - reg = null; - r = null; - var str = context == null || context == "" || context == "undefined" ? "" : context; - return decodeURI(str); -} From a6b0cb923cf2462b0656a2bfb5f5e5151125d710 Mon Sep 17 00:00:00 2001 From: dengyuhan <464958567@qq.com> Date: Fri, 9 Mar 2018 16:31:52 +0800 Subject: [PATCH 03/10] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=BF=BD=E7=95=A5?= =?UTF-8?q?=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + src/main/resources/ehcache.xml | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 6143e53..db75790 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,4 @@ # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* +target diff --git a/src/main/resources/ehcache.xml b/src/main/resources/ehcache.xml index 8a2f0ee..dc535d7 100644 --- a/src/main/resources/ehcache.xml +++ b/src/main/resources/ehcache.xml @@ -15,8 +15,8 @@ From 6b4c18e95c824bc5668dc278d306dd7caa46ac8d Mon Sep 17 00:00:00 2001 From: dengyuhan <464958567@qq.com> Date: Fri, 9 Mar 2018 16:59:29 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 +++++++++++++- screenshots.gif | Bin 0 -> 107197 bytes src/main/resources/ehcache.xml | 4 ++-- 3 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 screenshots.gif diff --git a/README.md b/README.md index 95497a2..756bb65 100644 --- a/README.md +++ b/README.md @@ -1 +1,13 @@ -# magnetW \ No newline at end of file +# magnetW + +## Demo +####[直接体验](http://bt.xiandan.in) + +## 截屏 +![](screenshots.gif) + +## 其它版本 +#### Mac版:[magnetX](https://github.com/youusername/magnetX) + +## 免责声明 +#### 仅用于技术交流学习,禁止商用,对此工具的非法使用概不负责。 \ No newline at end of file diff --git a/screenshots.gif b/screenshots.gif new file mode 100644 index 0000000000000000000000000000000000000000..b34044877d729b84a29d036e7699e0708236f3e8 GIT binary patch literal 107197 zcmdSBXH-+|zPCFQ0tpaEP*fBY5Cl||02UO~07^%Z4gv|qpXy{!-m7WtHpS|`vd++t0v&K1NocGKzGBO6_Lq5#R|NXn}>vv1bN{QUjuY%-) z9RYxoO#k?is*0qz(j%ekC@K&@`O_W*;HSL*egVHf=1+OQA$&vlri`$Nn$Ud%F$pmd zN$J~C>Ku<9E#Q zMfbI|k-NH~rMA&)U0Zi!1sP*CSz}EVTRFK`a!+4tJhIbMGd0wCgOPSLR5vv-HMVpz zv2$~>FmJtGRhMQOEM$t*Y?4&k!k;SHo&Ec`RZ^Zu2>9zK`U%l(c zBh!mROTQ-84~U&j^CK-&6JJP^_0tmztJCcZ(<9rn?R%?3hwBq_lxuZ!X>(=i*WuRM z!urqkqur&Ajg77Cz0HH;z3r{to!#Su&Ew-^7#SebvdI)C*L%ZGUeReQOlkB-a>>QZ z6s0x?u?U+_v=ybbhH^*-vdI>wx4-98$z{qC#cyTxYbf#ka1? zl7-%6$)F30Ri#UVSt_}D-Bq7fMhahaCMs5!t&LaMt$gdQF8}$R;7!l|xTa!#rtSUJ z=RGx*n+ttu@=1?ttF~80ODw+k)K>rcNo>p{ceQrM?rkm(=05MOt3CKdn(0h>^11Hl zV0Uxnd++DZWHLa*N5n!-n-V=?JXu69I8EEzhntp6O$cUn(U%()9C;{YnGSl8hn%8M(yb;|eA0j1uF3(3BMw-pXm}X?p$6A&x&BxiaTwaK` zAI_eSx^}u*F?f1=iPwCut`9h$S*8AS1aP@QA_lLzG8ENsa zmzOe={j^PxVcO=)*|A2;eTdYu<>lPM7V?z^#D`S#m3(~m7&5nbXL;o#;jWy;)2eCn z)gs?h)yR+aw^mk5`XcY}Kkc|^vG&PDEe=`I|9WMuJoT|?c-d&A#gAvR7n-hBtd^}< zCrr~t{HWX-mLIO6&Oi83ceo>OTq8bp75^YAnhO~WYZOu9`Nlldew)T&pb#B}w*1-5 z(#lOj@9)!F3KaOzwp=mCNK&(?Mr+aEzTiQRQeyoq>?N{C5N_xe303NSupUg1zkjfs z=6(Ctp)&Hmz^qUotCY#=)*zo1zf$Y9UsvFrX75l_;xP3X-@N>tVJ=3Jx6P>@bU7mnN zg~8Xybf|i1BT@S0qOTqZdtDvVR6#5sj}qv`*I?dVcUm+-3nW5~UHW69n3oTz}CM z;@(UX=rgxbEQ2)fLgLQmA>N_Sp~!(nUhW(uoD4G#{D>ttmsXsGsM#!1Wm10$qjU;0 z?k|?3M5Ct)Vu*V&ohwsuGW%L1Eg6@xr^+PhsniG~lcf2?1S=$+8cuE!AgA>(jBmsm zPu<#-62jPqa-SQ($}@At$wc@`(!RK`O==P2*b9~InQ?i6ioX8_Bxs|`3C{(RE;g!N z^=*=5dadMn@ge7JvtaZIL9t8hkCSn-NH64T7Ee0sB?f1XZZ*MF1xXFKZ!*o7AFngGDwHt4h<$YJ^>CwsVwMPu&h!hr*ORSM*RaY31Qq4z_6DE?ZjP1 za&1T|WI7pNdR|0_)2B*FIcM^?3)ix(C1LHz(KLB1&d|t^ju2z~2g9@d(SXGiS=zMiB(_SdEj_h(Id6UVl79(3m@kwHM}EqfJdqZniZ=?=Y@ zoq~B5^z!v`KNlPOY^}K=^_LfK8pLC1t|W{<$SG1biN`?sOk3zH@GWPYJTvACrO&IQ z25X*97Zld2>v>j<)RFhUWLdwu$dYvjuVyI@tG*e{D{z~J{&?n8ScK)}GZ%5ZSua1> z0*h#oFz+YaFCaQ718r$+pa+NIX#qmL0`>IRXzUq{5^6Imt7oc&;w3n^lI9vj2=R_d zh1Fo!UrbKW*TwXy;ptV0SFAU+;`psGBP=-4iWIGd%U92fZnpAmfaupwaI-Sp|LAu) zLeHlls@B8dJ@aFIx+~Zd#TP|=&-&nnID?%|T|KQ51g*&ekIWKSdu&gLvh^UmS;}wx zhxn!bjSg3+g)4E8^3Ip~zE!cLB-n z$}-TXZzO_~7P3VkLv?qG@lo>gciBlDX%kl^S#4pT>-L~OB1)`#r{t8+v3< zEQFsK2qVZvuf6rFY=`)M7S4yGDkq?sw#mwX+gH&DK`DbXX-4MSAY12CL zM7W_-E{Mh2W_&x79=LH){UBDa;Kx7|GXn%g>ySyt+ZRmw@}7yv6z>ZuE6r3~Gk~-t?V*+ycs)wIFIB-R5;#G7TrHwKqIR9{2ye#7lRAn*L+-3HcU(nO&valOu|_N2Vt8!{uY z{jyWjv*Qha4Y9eipPgG(=r_X12dX@w@9InL>1REuUDoK`AO4uQ7R$ag%*uXh;A7Jc zPrdu1XW9X)#+xSvh&q!0PnS=vZ+2*UT-SaT98SK-{Ppno-g@Sfqbb(sEAdfBi!o1J z7oJ1+l?&X++pSNIhn|1loBDaILU?{+$Ghq1+h>Nu=R)KVc-`TyfX8%ElH0cEhvT16 zm-S!n<7b#iXqc!sLJXy6?Th8G^=QasOhMDaW}rowH!uBNQqi6pM8-rCJQ(eE;Q!`) z(ftLi822bMu*<|+@-kNgxr9`w@?;beLE%uhmxv6}=%)-tUQ{sFpcjY<%uDc;XCR5z z*$ZJPjhp}&slpfnlVMdDecN>SQyc?zJwiPTrn!g&Qz1Y|KMlhy*m~0+|H8 zTnK%m$=K}Z2Gd8RD9O($A)~VbdIn$T>>%jpU#CQ)894bYGZA2rqm&QA(H;sW*;(L_ ztinDF^@tA@Oe#D+m-K_EIT3NN;CnJmWs8hC#=&F^;xS(^SCL>e2Itr2ZHA>*q&|nG*KdP0?s^XwiFhJ`AsHkV>BoiidrQXVgMymn{k6d7~nh- zfc7zf!x&E?f%7B)gn^80!0c zrbz2Tup1JnCDMGrGlG>E8*TjIVg9)bj6N7z5CHcwU>GOcfOPN-qgd23@wGb=V1sc5 z@*z9{Tq7R5L4se^3SbC>>+gc}ah7BP?JA4kPMe<}4t#(N@7oQbn+ooeq1{E}`%F>+|=PxLIlW8aGeb25N1g5*LtnBZ-6hjAALqOk+jCL`Q|Nct)7 z+0k>#-UwtL2#kD3M!`UM-ETLc5@%z#qeZWCgzj>H!5rR8n0T6#P-tNQnG|dy!+;=x zdSc)R3|Ms+k30*i$E#lop!OjpB$G*q0v}-zTI3@K(i%@!>ijMnK$zp;vDrvew*O7D z@IKS`+2srZ96$jU^#c2JjPCY%o^&S&%84qy6Ga{7M=L^i zsXdxp$glv4*okIX@Jw+y6@8*UjhmB>)-T#Qh9LGU`$vM}X)CyIrqoWV*N?}rq&VMFM$U2~8(uONS-qgT+;sUmdg%TOwG zPC6avZdKx1W#Y{%Nlq}gyahOWpZ^66_|at?C?|>bJtM*fd@lwyj)n3kGkBuqd(%YuSI>6&;V>a8B>4=EJ zUHUyN96c6oOAC63q4iOMJ>G@;I>9E92murrf%+)l7y;2ooFY-H(&gK-_ zG%Pe(cPANEzLnlhr0cbjmyKmSDNm~vOUq#KB!QHEUOqD-hT-F*k8piNl#RTQQ?bTA zf|Z>6flMeSixl|~!yq#Zg7UD(i@I?(@}bFr*Pj)@F$`H_rBx`THwm<@1Rtk^T`EL0 z73Px(i0Uf{L^5mylX)gPbG9S1pYx`*jlXRn02U8DkVJZnC9Erfc={L-NNO+>ln$S8 zoh}AMfc4x#A<@~^+d%quEQ5Z;Z7kI`5~hJ?m?Kv7A}he2v}gVVCS$S^E*PM%l%vxPa=9WKkgXB!iG6HK05*p5KAHqbZvs%P59BEWh$Ej$kO5Rk zH+feVL@G0lF2Gr&rUoK}3(H+93x){M-UQegBtS2MABnI$7)lHrX2Nz0*#;Q-o;U8fUcYzE6 zYzP?-`YDq_9gBB%riA(I@A5GEJUWKMkgz?(`+$-NS%yi`x*9?)I~vB!5qiu)1*)L} zp)2BIkNw9hoTcem;JOT>thlI+4y;wi+kkM zS2C8D90sZ_tjxa)zTQP808~Lat8x}1`H+=CS-A)@0AD6VS}Zl(A-3hC!`YLm0t+Jr zFo5M!RZn0w^*Y?WEi|uDx%C6lZe-Ih|8GNB1@pjWm0P9He)w)GULE$7#@q zI<}=#iPu-EfUrwajVm2+5aN^#q&>*e-KNqO1<<^IK&6BbHxnP0(-tc1B$0s4%TOo= z#i$UM8{BnLp-?s$>B#|1CnrX&5N;mSN1W}Y>I*~=Do2-N>H)vlm3l8rWDic%g}?Le z75xb$bTj~wMqqe}&94;B^uCAfvpE8qjRDP2`wKAO5tw}_y&cokfpRWUa0Omol1yB#By%= zkD!rCesDE>AR_xcm3U}6QFsWE|8`8~QEqw)Rz|mZ)B@(z{E^^kW2uI{|bPSp8b} z{?4b5Z}R(@%Y-%`#T${eD<4ckA0)K8U-s{LK{edyJL+5;!3Xi4s8>bb+ zR8TW9w65tQF@ky8Lz4+Z1-w*RNT3P;I}t%*NFd1}DJv>69?sQk0~RR6v6urQn*ano zoY*B9h|zBghGZ&~d34Y>iy~b*J31`-q51_>ObFt+T9_>@!_N2@_Z!H<-rloGGYnm1 z4yqNp8JX2@)KiF;q;Bw3XTTDI3DuH5LC>C-sDVU?@FSl-PC2JARu@#WZrO9Y1IdaW zWj*W(j~P>10{P%!+wp0)jNXwj@nSYGPq!IrL1-`r@nDG&*#~=Y86jg4k%eK1>SH*s zNIP6e`-D6W)$H?I$Kyr3LqW%L!$)jj;byDxreSSxtZyL?8hQQA($~1ztl(NmSkK!y zV@Mbj)R$la&%dRMNI8clae!7<#jayotS-E>?t_h!fFH8RZggeJ)!bZvS}4Hq>npsF z1L4JoNCX(Op;I{;;TtF@d*6H55;a>7(nA|fE(AGhQpsG8$GJ>9)2DMJl+vv)nK92S z-$`1*Q-3!{c_Ha9OniG7^45XjYtY*gD%*~9CFEkqvVB1am^31n7)7+MnMclP$ia`<4PM~fdC+EXi z7&h|~4R%*tXvb*9+h{kXFLvd2-N)tfu6?Y=ofnBWOMoQlR_L3x{n;}{7yp!wfh=N{k>1(GD6*1+hdu|lfJ97 zaG9D3Hh72xOQtBAk{PYP!Yq6It|c9up9F5nA;ESX^M#4daAfxJksTK)sm7fO zdQmkC$quojdQV*_B#ABeJ1eX`INCoWjpuw6!mTwhD;s`Ut-$c>z?^)vpixh{*5JHi z{DnJSO~0`6Eoe~7kt@wbLjQ@+La$CJeN1^Ej|ic0n%-i+FRGHQ{Yk?l2P?(x=;z~T zkIevlz$|pwInYOs9ZT5g_Ld@(udTBF`GuCw&u@;1YFO5Rlee7%P6?(WoqXR|VK zB&KFCAeefcmnY7CLzXWs{FU65+|ms>{+qF=ORlp;Iq6L{u2&S^?#gzhU%MITFLm!B z=R>A5Hco?nQilOVs!L??4DYm8>o7c#ad#uFQRYRLAi0hCeXx+@72+n)bz0uP_bM*T z+*h`^h^qQ3T(PV4-NqdiF1Oj3g^U}|yrh}bpDA)fkPzavbXCy~=`LOiwae`85^_>e zo`+$c55hLuc`xa*PCJa~k?-tqy@0wzs)ya;n@hT{cXrWB^;;##A9r_3U*}clTz!BC zWNMS`EO;>)|LWaSMPM_ldqdA{^NZv2HwW9lzPr7r7HJ93m^0z9wrTcfwSIh*rP?fW zWoWQz=qdL=lSCztutl`K@r{aeiHoqQuSm#If znS}$}Hm)eQSMBF{$6w;9N8C0C9*d5Xdar&S+u)PUJhUHD(Qx0stoU=pftNh*wnL!( zb!I2pCR5hY-Pv*ASGm@iH%`+*x9fO_B?@&sU(Fo#EPDl@x-R`w)`w23B_nSRR---- z9K^(WygBT$^f+=`=7N6D*tT0ZcHf{=a1Pk6wVw4en? zG=xXVli^P6J}Rp6aPFnY1L5S_{RQ;OBgG37niw+l-mW;ZjGLXoO@~_T6$?xX?{*Td z`%@cs=j3T6Z#K9-gOyVwYlxDe=&U}%eOHo$<|$5++kok<(?jmlOfvF@1}77CAM!~F z2B@SPoXU54#BcmG=-I5nncCe)C_g6LjVArG-A+J*Fnqx}xho~o@-)OQ{l)n; zCuy@O3n%O;m`bU{4yGI5%qKf5S{kdwjn5k2uH93#@l%PP;WoL` z?flq2LnUFw&_r}{@3B*hO5$d^$-On_CvNj9Ne8ng503VpU};p7sV0Fo0WEEYM!!uMrTs1P2*WFi+ zZc)t;{$QqP<)RWlubL@3XZFN>UnQAFElcu}`O~*9s_8sx+44r_Dhd0lSyE~_Dj&?% z@?F&OjMZ|V&6#V|?yD90spY-6WTDmVqF$PzmTzHX@oaKmy`n{}!0v;E?wX56&Ai%2 z*Ex&lNBbHC8udc&OP2Z!u9{6e>P10DmM_j9Xp-Bc)QjJLur#{ns?}wzUJ^HFX>#vC ztItopH0_d=nWC%qP=@-aTq7$B-2?5>7WJ}{4^~!IuFods)yu2rtX{ewJR{O*R5V_) zwtefWGs~k<*=b~LmvEr7D5X&~_`%vC-&J?jSfhG;&f2l|K$qmFQ8RPtrE|Bd-d2W2 z?TXP$*U1CD-4>0y%?~f#*Ib_;&TD)=pxmWL2hRbhCV`5_#*@Jf1L4)Ir#H6oK7WXT zNozKo%&_sj=B5uf(QIU$xADJssE_p5Y~tdv4N!D5V9wNRzG`e6q)v;*e-7J&{(8ZtH&FCe| z4b|@R=CMyD`a(s&%Q z72VBMGqu0u8aw3b9+_*lY7duWIOJQoTj(rkk5tb)d~`puz(AjkHuAhKdh2d!$ouST zr}68Ogd1Shu8LvO(yIWbBJR2XMe_dXCWM$+3Y+{DTv9jCU+CKByP*p_I5nO>w!um3OrOkj zYQFZyHrPaGhIPTI_1>{9-d|^yi`Thb@y)C7Or5!_CeEF@$FHJWb>@XLox82x*u^jC zEQl^R_qre3B|~)=C3#)?-@dU==ha=3H*pzEIJVD{)?HS~borA1#v#u{cjeiF%Si39 zL!rO!>I+`iuibB6muBj&S(vzvPaeOnXx05;m+3mW_QtVhLHDQYg6sFAV@Cp1kL1nk zHpSrK)WoZ|9%SM+bDr$fCat&eKGSXPnul|jiQZ=1g4@D9vU8um-c}l~`;wxE%TT7? zcCLy0iZ0n@v{i4XB-4G(%ENVHLGM@f0@?kiJK2>8eZJes`)2*EhubXg^Sw@!H=7A$ zw?*ma`-7Qpw(~vQS52NDj4!j#5#W~;-oNN*o`6al-B)AnMF6l_{SW57^N$>?rT#lExk|%MsMuNXf;@X77^;HRh zLkSdIQjkqjh+k4zO!9_;n1V^1x| z2z@K8`D+};C0zea^ec}*8@C8!Y_zj)h?9S^b8xm>M1iM)s+YM==r*=kF675)=@C4NFSId&j*C437v8 ziZ2aHt%^?1e4kMgmR22>Rh5`goF0iyiN$5a#D0toD@^h)N{TH=i^$1JDo+lqP7Nwe zi>S*9&&bZn$WPMXg^yxAlGOoGI^JuIydWQc4K{cM{CV+L(W)z#%M!cUqj7ATk*Hf%BhahwV?{q z*UyCJ?%tl>hR(sBuEDQe&3(Ong9BgsM<)A5zfFt`)ekH*jjweM5_`Wac7EHS7#JN> zKf333x)%>7h_gd;+e0hA`j!vI=QqaJcISp$X9l~MMw?bvR3v%LDtXeS1GA57sAUrlzOn7Jtr7EiW%m|J+;svAMLhI=!*Cy0NpmbFj3#xwKE- zT$!Ti8tXfYhg-zG%@y*&Z*OB`dv|;PaCdwA_;7BlWbouP{N0((Vco9^KaNBETkf($c9`0-6kn>%_A=UpKOvI3!8to zNgOPw{$Z0WTyy&mo8+F$=JMY*iDUi9Z7TBa+92oT!^ivW%(9}v(8zXl$%RS@cQ!?#nvPJh%zWfOl& z5(nnVnhxYITbwqh&-u{o^B748(u&HG!1}r=R6O){(jiG*tBU^w1*<7!8G^guyVHMc z68GllNVvi%w>*Hx6bD0It+sVB$c#311v7dm+)S z%5+Z4A0W1Hhczh!%sh*29U%b#wuL)%%WF>P%#i2l(*X8F5RinjOBH0A=r>GCkEGZn z<40!0mqjrE8d`uP7Y0$YCUbO#%~r@6RLCBbKOG&un#9h z*}9U+LNX)4C<6Ra*Ns>x;%cf%6726Imf33~(F@eaOF-CYotzE3C( z2Naq zT=+;nt_t|fa(qai3_zXEk(o$Xm;&(?Jc~ecm*iQY&jI0;sizB+@;cp>Omn-91^$ZU z%>kd%qwE&$2atUD6sGj_4Cqf)k$h2>LD%@7#-45=`H6_7T;uQzPJNVd2@Ow0p7ob$ zx_E9KC!>&hBC4&4=k9vI2~VF(E-c8urX_;%*y0xkn1JV0SN^x0mc}2K%!`)n%2xh= zIyM99fBg5!`H!*r>C2Blle2t;R5iBw|9pND+Q0ns{QO@`&Yt;Q%JBR%Ifs|`DU)+_ zW&huroRqP-w6sM0xxc)&P8plC>j!Ha+dsAs{}*GEv~#$pS4*O3%#No&`(qo%l~vQ1q8SlFHZ}ayo)W$j4J+b?&YmTqBl~CZ_4L? zb}w=I0nPs-pum(j=-l|ulrvzLk=(Y@f09| zLXM-mwgT*Dy29iIsHnYw(?`Sc1mP9qyv-i5U#lgdtRwO-7@i!O$ODo#)4`C}(TBl| z@`t~ITW>~jC<&bs6IVD}IV&X2T8Y=U?s*Vpwe!`qk#+0sTYy8FCu&HUz|0d44{8qu z3Z-}=0J3DM@EM|b-)SIRIS5D-J83J#wCHI!hL^s+H(OF*HFM?u?`1_XlK6X7feC6a z;{Ls=7)tTH5-5MDa1{(-JA~1wFgU~=Hcfb8sPg0BCjpw2b4B~y)f;d9(@9;6jr?HX zTo*leJFHjaWXl;Xm`&4}=Olwi^oZmE%8X?D*3Mzgyjek7E&q9ZV5F_bbzN??5PRZ9 zG#f3TfO_&70a21T8I18c51>I(91^_t`oW~hWaFDxAN?ds*VAc}yzaeYe;d!~$8m#5 z@5_Nj*--2Yp9aI8UGND;BK0j8gbBca#NRR1nJ_ER0UY9}^jqTaeUd*qJ(-4VVGm>G z4+T_22m&rjkj#6MCvLO0AtX>(6}XRIiEGQX3(02WxODlsL%WHul1K(qdo#UlJdJoYRez@CE)ND7_Xz~h3W&YD1AR7%MKz{xi5 z_%;|A3xEQh2=s~KK~MtGe2Pno@f@MbBpFV(BAGeEQG4x z3rax4fC`K}9!WTxC@v`?hNa5pkl_GGJ`!acF@3=q`MB~Nv-7=DJrzx8y%bthZPVFs zC)%rCPwxry%`iN>2;=dZQZTF9Od#DDy4pU}<21IJxNA6Aqa8u+eY3xrR5P}46C~H? zb#6$x*?{>0qNC66uDufN_K+m6Tz_C$wx;g6tVg#y`a`ZOt~*P+S@sr-OCQkc1iK4AM#(P3(;(q8!nFB&NEfa)gI{>F00zkw|SeZvmiH8 zHMU*g)SavMt7D{YfBPerArAwUA8j~}IMcXpu1Q!@2I#MnUWPHC26zPU!{*l^X(r^2`SmL{DiTiJbvrLMK-TRV1+f7{m&%ngYaQgfS=2Oh4 zSx%p2JHdA86qmqx9{!V;Zk*r~W#PNc!OhEY>B{x%*DqcbzIq+SEqIS#@P^Q>JGbuM zzjyEciE9s;1?A4&kUxFv>G}K5SS1Y4OPO7evu2mKsSg~}A2@w@Xc?-A2^F`BduSW^@O8pthnT0BP$j!a6^B?g*ZAii ziIVPF58bQe+>7HoVX#ruI#A zkw-$MTXOB=Fv5$3Cd;^%m$6+|iT$RjEhc$i+|nCtGx~gdd_qD(!o$O(V`6;#J_JS; zg(lYFV~Y}!iei$gz0*Die5eb_s>7!hM`YB-W!0smq~_%0q~v@`%dILdDXpxm^vY-m z%4rBFX!9-Z53c+kmfsZqu`NEgDeP1CyR!a>n#ugC9>3nzw+*Y|?enoM(>e9MsSRVf z&6Bll1D|`x>iQ?s+g6IYr%U^$>xO?8f7|)ozghWxr;_-qc4oJ`@^e=Wp{c2BhSb}j65tsP9vEceZBep%ceTivGAMP^4veta8SogUv@`8GW> zGqdz_WqM&{Wo3GKef0-vhO|AuL0L}itZW~y9UQN(Eo}W*{Y6?m+Fah++WPftZ|mTA zcYBL`xc&b*e4wnEa;H*-F8ch7HIt=?7u|JFZtV)3_`m3@Xw+fE4LE}0|It^u^9;!r z@ONM3(_SiZ=&!zt_8`Y!eHE)^hrjwN8T`4w`zjh=8z_Ah>&KO^DSefo69V6hf=KvP zPG}b|tE68#M0NS+v(F**26U$+pMEkcb(_qQ%9jZiD3GXDzGbDhs9|+6&Nojx7pa(P zj@iG#)h}?#BMTJ3dFce7QW#!w^T<`vq9`x)$(nNhots)s#zh-Orcu^s-$2aHG?ZvQ71V||O9Df51oqrTqjpqlma>9ihpMmvs(Kyt==vA5oy^rQ$p$_r zUiJ0q>u^qps4<7gsC08#5XQ8n1P+F*UM$SrmT zMx~1j$#8wCSm#l-Wn654UQ&JGPoprUih;}FZ^_;n+sh}N@M-ihJ>j%QckoXG?7X>|s2B|wl^HHS9BuL8ikbsm%9W|4!_YIOgBbuC zW&#!rxN#^e=-p_gz1YnpDSaBHUebQz3&gJZWV_4^z3hFrWk_lNJnkj@dTAkW?h9Z8 z6$GLU=m07t{;Ir~O;IyKu4&3d_KuC`L%28|BFXN4L;oG)!G%ltuh<{}Kyz7@%JV!( z@}$j`6K=?2bFT7vFW`&)MKtL7PQ2XBGxmj~F6S?KvGjC@6SP3nR$0 z1kI@%llC`_RZGBq-C96HpUR-xrx%4n_>CwY)xjO=?(+ojSEELUTVtGjh0t+p@Aw2M zu>Hux$LV-LMAbB^c527ML^Ic9aO1Z*EwZhMg zs&C>GpmVihDK&Ikg8m-u!#=5sg*Qx4AR6014dbAUmGg_%hwE*;Nl&HO@2nke_DKsI zZ4GI>ym!MSFS+)DYZj(uc-UXycy~7HPpFGQa`pk(7ml0ey&tAN8 zlIJ$hWq#i4H$=tmFpH2az4$}q<&EBGys*+R zbTU#`bJYEf;GJHmnVA?FTR8s%xH~#Ib13+7sd;njyt}RIbrloHqaVv>n0N!@d&|u8 zzLB?xaj=N#+j~~;_)Jo+SQYZwrSjW+60obdXO)SvE0;I%ePo>=^D0K&%$vgNWgRm9 zM)s}|POiZeUN7gBr{`Cs8&+!O6Z;$72S%F(XBz~UnTOOGzb|(RNOz0ObBZpO^6!ws zby!3-8Kkzmm#jLKZg?7L`~&Oz*_-;h{tfhFeJ%gce19CyFDM~6B+)NCF+R*MA|f&% zHlKp>BVux65{m=V%HvWp!afw^(<=V}{kV+E)EM7?2Ksp)Vk=Vu|DgP=tjs?gzpOZ? zqPz;1+kz_^{sZx&Dux287kob-W|X&P)D3>BY@!hS_w^HA?TdbdBYg7_g-N6kMkzo) zw|SzVeXOFTwW?z{t7SHSY^$yRrHQ<>(f2V&rfT(>+Po4A6#QdN7m-L87-8S`(c~Y|ft$+DHF@V4Om*XWa zBlx77W2V8LO-%pPzx*!@;5rU+))adp@TLyK*5k{ad1<`?d>MZe^B`0U-~V<0l9pSv zGrZxu#JUI--MM?SgvLmn*GqFznE!zR7|!=e`WH3{BOm0U(-7MK!~lxZ5yE*s(S4$Y zSP3ac5gm^IU;xHBOBsLnFaKr$86vZ28ook>J;Z~wRkGG%UgX2KWnyzEq>PS&gcH5^e=xCb0|NF06Akxs++t3`jL>9wL)q{O7pKbF_Rk$Bz`oo z){N<|~ov2VY@dkQ&ZtG@|g})ep#S4H!+Xyd{`mw zC;DS=A=&@>{t({VYIBxu?}f}QaQ@8x$_hLjCqyl{5iB0eE!@XhZt@ocU|*l_Epp#o zZ0lTWXP1Je_@5~^1RzLx6$yon(Lvq)Zwz6Zo;UWxH|uw2y-~dn=5hGI`-i)dR6?jc z<-U8@!iAL1ZO~JQ`Qa~izIDiw&JGRkrpBTdIB{3{K{zPH;;@nZQZo9CA17QN!gb*& z3q!qzCNL^nx$3`=;cB~$JE_plGA&ZSXDogn?G$+#~=l8YopC8`cq%eSa^y$4&sl)-? zZDPZXx-ef27Aj;m;LoB|)b5-|#oD*n@}P&7!LrahaOBY7%F7J=O9CeiJKpo!IEd`c zqQDus$pXEgNAhHezewX({~cY&>4mVIVYekU3TX+_pFWg}W$Dh6@|9M!Xeq(bq+_oJ zPx%}7H6k+j7S8jLe6iQ->0(j!XNY@G5j`gz=!%+|k3mZ6+TdjHy6?#gFj{Fo35cVO z57($C>{=;?^{CC4CpZAEZIgO|wL3?>{9HxIiJ}ZC)kh+uOmO>Tt_#Pgl{<1uAi*1; znEk#c!Q-d!Q*d!a2E+pTvIA*1ThDN{O_E!6GzhT^N`B+pNV`FT-tDVrVAu3~5thQ} zD(1j&rz?f3vg2!y%V`rm>gK+!v3ed$udA7Tk}M5{fv@sj(@W=K*?H=d-jGQt=b8!u zGpprKZT-TW$5Gu%0$GMZ!Y_jNrBL;ei+gAq+h^I^FmV=+;5JO)o-{ z7(P0+$`|y7ye`)k1^^aPnNZ)%d1yS1_|AH$D@%TUY~lO6`$Xv8B)AqbYawahp`sN_ zVz76bdEi#m=-E_H!`0VwFGcUwCz1uC-+x{QLrFYJ+BWM;skSwOQ;o;TtR z3KSD|X4bc98X_P=+JkJ+Q_oC8Zlde2X#+HgWgKuPw=4I?2;hZ6B_yV&G~;%DWzef1 zxvr68R7m113RD>N0h5!*mAngj>0+o(VX`qd zahNQyRulY!cn|{1`LG5le(AWV>v1WXW`YC9e;)~ZOzB?|83Ur-uYH1X5LosB0ziWS zwr>Go)kZJ0`8usbjgOD9jzNHQ9u?4nq5;4h*z7gTC)SFU z6Zm;5!8UEERHG;RA;(JE5n(p**>2nK{$*?Wtc=DvDuA-zi6^qdY#^P#Aa;;sk!4zn za@P8Ir`Q{^jCr6P;F21ax7#kW?L?w3qSl`=&56wZx;Wp*r=G5$Zys2m+Hp*^;%|*<1nbg$;uopTv z{u;K=fz+;=u)91t^Q4s1`Ur9k1IWf7vuFPl1YPWN5&9lpSNf!G;|{~sacJRFnKt(o zu0kwCHGX4M13vZGjlN_D zrt2ZuQcW@Thp|gJ`N%~3$W{1IZkxxuK1wXU$|An1n!ewQ*pJrPH6&={@SJ+PzRb#y zI{@JxMwb^&m)}R1mlaqn5>%=gl<9vxKGrY{k8s%|%kz!Kab65OO2tW|WXIy$(c zBKS3>?ezQ1oAZ7Jda^41sz^Cj=y4>Ao5S>@b0SwK7$WeEzd(w1}C_J7$B{#SvEVogz^R(M1N1vLi8l|?0#;?ip=;#63A zaaelI-#II*?thiDGPBb1Dk#1bC1;hDRR-iV{=tqB`7IG8?e8l`C^;*$qKzU;{mEHD z&8w7<^@luCqE>dpZ}>=wT6xXi%3E72Da^WmGPh&?Q_p<$;Nm~vW9`Io_0+F_M6Kqs z?6#V6O4OpT$d;x`O4=H0EB{Bx>g?=l?;NC{$*+IVWcR>tF4_N^OH#IcDQI$he4K(N z8;9opLX)fQU#2PI)IaDXC3$sDZuX5Y{YhR;(+6GiJKgigUCRewr&k7Mw}zH}$1cjA zFa=hQuO3i%<=mI{)yc1v*tI+}@>lE{{2jag0+(wue`T(f4NB&sfXlg!qd(yCuYF)j z=9;HuuEX6$iZt~bT<%l0f47bge;;*2`3?NJC=7A$-#YW=;-Px?V8*{V^QL3)J;Al* z_2qx#%$v@0cF{j$<%M^Je|KK zGoCTdesj)xlRqG1jd{)MJLhL{{g-+3zx75A){Vo=aj(qYb(D zQA~4fJA&!IH*XjiBUv?r*OvZc-rOqtl<8o=RS*VD2e_vFPxHoD^W>*2$A8Tm&(BW- zTo~PT6yo|<|C76ltrw?1`q#YKSSv{U8jF6e%=0&Qy;bg+5@QViYu^0Ra}A`FFqmIl zEw21)-nc)YdTsot=Xw+CrCr|j*Sukp!`xsIuB<-GteEzp%)|Fzcc5`TwyE_s>PW9HNwFWV8+#%6)iz$V#{`_D@tX6B?w5}9cL*}v!C+?DRSd$2 z!!k|xhYYtZcsP_5w*;6wiL@)Kf}tA?!-9t7^=E~jDV** zah*LdIHH_jWwyeeKE_7!YevIuv4R3W2J=`S_H`dDBpdvCOst@~tVUdA*5!Chj1e^p zCqLTGbN?l1$X>V|D-h-EuH$_b!Xh7kc3UKB^sycclFB5!mcSl|q-R(o!t_az2rC%q z!rnb5lhP|EYsh*UfqlK2hdaqqY3zTjGhSaV(mC^0g+XnWoh?+F<4j0U4`;1En~6lE zz-x&J_B}+T&K<9KI@OpnbK4*_#R#wFQY^oY#J~j%nKdZ8n{N&s&emsfa^rya!X&b> z<`Xl4%v_9&{H3e)NZt~SfUsT)hia^8bFX4<@%Sk+8lx@?JR&h5Z(@e7=rEeY-$6x| z0I+^v1l_J}BwPi_QvOAk-JgOLmKGvhvvPvdkDYbfWvAld2qFH*r;AZgWAra>1^j#F zaX1XXLI|xQLP@yzK!8r$1p<~>s%(pcBIOJE`%=^WvRMR$zt3G{kgV2 z@i%vE0ZZD3)kiQGVFlvQWO$#R-U(i9k27>{k}4@lY7`dcEucpv0%@xgdsVQSLWWsM z%7w4F6g5&%@QdhpghOYsE%20Yy^{e!EhPw8f2VW$o4aZnlb(JWgA1auP5eX<8>SP^ z^SIEuuabd*t4~vO$7*eai&vLC&#qIPtdCJ>#vV#*t&r(AsuWpxkp(E$dlC9Q`CuEe zkk*}W&?N^&`W#p|W2-j7#)`<+!9v19ht5(WYz(E4Sh=qt00hGVbO4Gj)4uRLEQ%+0 z)LNhxb1AfM33iNv@;m{OgYhCa&e(T_Q$?>Y?6?T7AQ;q{YuPU03Q~?RJsL=%8xaTj zDfFzhgqUDqx)%X0^dvehfQa`8P`q6L3ILNGgubAdt{rrWJBCXWR9|-+ z^rWNWfuOH8ISL}9rz3JWo;^|@!lg0G&FpkOX`e@1?{fGhOS`bl>H2b;VXrjIsY)p{ z0B%3Kp}MULIYwbo2nts6`Nex>cN$1Bm$%~D?Ml1P0?(lLXS+A%O1b{{e~ED1`fJ|M zt18zDAOS<7l&q^gjZq>uzH;y*7WsURw=DlIE7qi{h%MO{Nv>x2x7N5S+oQkPfW z=!A;ZNeu^a6@v@vC^b!O0qyIjP)=v`J$9L0=NmO{7X=IZL?v+VGhk109c}$yK!pmFfue`H6XvU;Y3|SvfHcsp| zOYJpD>!UG~SJQ`WGy7=Lq)oxJL&2nLYNt;&`Co7HQPJ>&lF@sWQ+^fmkIJTK@Fb>n zIk0~5e+l?={|)c!>gs5*eQeI_$m0H}(jl7o7*R77S^qA!b}F`EHmP-vP%@NJF`Q8~ z^}Ko_vvxSOVKS}hT}JbCX4~A;hUuKPnVj}{nhKf!Vz{XJEwOQ`q-CO@^>7VYm%O)kyPeE#_E^X$TU z@5)~1r$h4E(ctp0!OcUO0Xez&WrDIdv34;3d3Sz|c4j_U*gg96{u52tNv$>hHg+*x8)CKHmOLk)Fi^RI8gDB`z*SC{i<=ltlQAZvS0pPY78&JYBIt{ zdn}k`%8t8?&VO4+K?Rw?`GfK-;9Wzu-!gA*;Bf1sIO#Ub4qP_Obk~G0v%ObWzLyd) zh#V^n7>xVo>@kaz=O}hy&8{CelpfqOkB#kL(RNhm6uk!#HS}h8O^h7tyLlrE;W~7# z3l?drcon`J$?A)CHc=cxry46(ih^+bT$=B)(!7?G^hJmD6b8=R?@Ni3_ir6bXT?k3 z|D+Jmmp{Pj6J2bZXXy-JVV;RK%<_Z%I_M`O$RavELeI4Xp^$`r#{A$KMlV(*Jt7f= zEcF**tCddEV|CG^`r?aPk(LP=BMB~jB4aRluj}~{8(_vU;!b$^;3q&|e&o1x!16k8 z_nSaxK3$lA(Q%v&2|qH5QhbgX)hSmZzMe|FOqMG~g-WF8a^4ecHs;v8yyL2fLzK%n zEb!Rr(&tOlp+JzEw3zz*C^3Tv?30Q|y*>a%OMxE=>nnED3(?CD18MWgrdxyG@{Xoa zk&s(@bf{CEz;?elz>GmzYm;{v*xftk(m63sDZ1>YAnjg$%?pqxeRqEx6~aIOF&sXo zj*T7|ER~LA2F8AWAU@h9Ya{>n(S}>_mDS5|l*I55xd^OTxk!aa3onrz+8z zMG)O3c;Wp`y>1;vZrG%Dc|dpZg=l#P;0H=fkMq&um>|YssYvF!5Gzue#ITae$v=FO zIXhm}tM=X5`z%7H#8^}$+x2iU)&y+#di8I&%=K3zBoOd|t=?4jtT#sW>(gO3v_*Sl zobECJ6GZ~xUaY#8YsOUq^4cVF@+XBl2?oRq(cxe?0Fap$|Bgm(LzS}j&rPw7$-9w= zuTI^rL@~VI|GP+Fgi5C`I018bvkln(vq*qQAkvGkrC|Tnmj9XfHw1?PmH-bBqd0+^1Amlu6n6k zJy5?9rmLV}sCD78f`X~4g1Lgcy@tHCk(|{f_3Qd_*G$!|%{5*0M1A9qjG2&AoIS{B#|I(YBt~9DN*}UG1E`?QTA_^T6D?X6k8+ za=L$uaPzLy)KKO;^|3Ubp@I{T~Db1U&E$4i46G3D@($8F@xux{XKQiLrH# zyBdq$>tglC6hBm861G2uC$xI*ugYXA76;I#64*>zZFgJ^GknvzT- zlH>iX5+B*8`8cHd*Wkz%&N=D&2PwzYR!u7cpOubpHfwv)>x3xQIS$mRF+>_Sy@^_Q;+j2N!2wZQg!jm z_9{{hsj<27WlR0b_Lp(bI}`K!Qz{2jO2*SGrm~tx((2wlYnsV!oGWhZE@_`BZkwxk z`R-LmZ|m##ZG+P<-@Y#y*{m4)TsE@#VsxveXR&T{vwm{B^I7yzNy1Qh!gO`YbbZ=H z-ILjxv^Q;)(=W^4y(}B(dO0^tS{`_@(%=4Ntm@lj{kPesorSj7{UbxYuiy5+85$ZM z8lD;$pBo(+`Y<*8Zeeg@Vq$J~^8JVRZ)cV|7j{20zW$fU~hu=HzRzI&UuB@*wQ@(uJ`nPSd(_{1{~s4UT3KsiT*&;w+ZayM zmic%SraHq(yc!P8m<*{nUIpQsbU^Bx1irIE^%lfyNy40R)^&)L0uvmc_)ESu&&11o zK<=#RM7*e?3_uL7jMnZODv(RQQvoKHS(c;*TR#Rlr5NNJWVCwIp~Si_gSz7M0UsxM zyZSpg5DF$!bz8HEu>c8ime8VU%XtW)7a#5HnmoVnF2_Itc{r6&Tg8dxP!qP1K=a(P ziL#YovdTpEOuQw6BpBP}6@h{zCYJX6M~~enNQO+z;gpeQ^Fh04TP*Y^ze+xxh$5Zf zxUwe~nvPcy`BhmSmvZ2A-(ZJLR0-%IC3!gE85nECsG>X$&E&$RGYTix_=GYbBOLeZ z>#Jr9MkwrYhDO&LAISl;wU+}2m1gFUezQ9a0ORZ;@r?goJ|j@>rX!^D5oa?Q@G0jf z1ZZb&&I@F)wuXBHu=`5_^EcU1=XqBzjE2(vaDRpp@i3qS&et2pO8}*mO#8Ql6A+~n zM%WtxJU6ep#uPde3-JRxvmcZlXwB1YUBSZ33@8j3d+I3&NzU<5#@)*O1Br$MhOm0q zSh^4}maekBtCOyhG#-bt<-_U#&3-&sR=jXvB)}jVSIUU?@@J%#xSI)pfuglwP?b+4 zqc^g3jEfx}4unTL?w%;KP)0}+5=HM*?cOO*^tn_>3shn@weNz_{mPXNuG8|TE}kPO zlaa0;WC7Clibu`LzMvJ zY*({wXIYl2OTN);7oQ->?x}r?=|b~(q_%;g#mcPPeD?TcAnOSgH~=4lGZf{9PM=cZ z0#IE{>M#!a{VGASoI z>K@#hR8$2pD3N*W(&UT9Q$fqh9o~c}l>IRi-K2R5sR-rPOi+xL@u|~iY8{R0;K$r*rsqrQ09YR+`Zro_mD=F@OBkkmm@aKD6;i>MDewl7W>qWyWt6*k(ohQoIft-A>rAr znBrTpEk1+_uauV$;)?yEngY^FAEvh(#CIE~_FE-(*<=kkJRLR5n{p(MIOdI8G^{!& zkUg_{e3Lr^9(TFt4SN<(gyi@7mrn-O&UsWWy0))*bgT!|Qf`yi{d+cJ@0dsWI7bJ# z;ez}#LtIireTiW=h#{^KVd3$ScVZ(SWa4h;#Q0{Xg%m_N6h?a$Bs?ffdsLep)R-R> z8ylODn39EkBrzBTqn|)E68om$G25xy{vgwQBhG?-dJAO)=*j4Skcf{Ti(*t z826+TU)qnW8c(bliEfvh$A6DNlZBd5S7UyX!|Idx-v{LnD zZ)xW*%l~uZ)Az62zYjKPC5ToQsK4n-s{RiUenyTbWLhB6HT07{I{v>w_%}G;qy@|0 zi0F=y{eOw@o0qk2<+3p(@cuUlziQ2mQu&gl_x}%s|4+=_Z_~LM|Ap{NsU?>CH2mKX ze)})OKkk107vX;@&-`KFeCrmf}wLim%jW&%52{zdq+=Yv*0 zx&IG@f3E3<^>4<17Qu{o!{sz)DgTA=XGYuTdo0q1z--S%BU2=n{xbx&F_RH1`4{0& zuQ^DKSNadaf72E<5G9iQ7vXo(gr~2Vyl)pKXj!>k%Rqfaaad-_chZ)Lo%sJn_{F>| zyXsfc0PAowc5KSxYgH$-_G?6xc?v5prkMAWmd~H=UJmdN?aus!z+Z1g)sO4mYV{k{ zm=?-iz29w;RlWXiAYqGx@7*GP@!5IHb=A~(L~98~U14@wnv^uVNF};fsHhSp7l}TH z-#hb_xRxZe*7g?HUo&iP*WyGS^v&5TI-J>PR}0&h$7~5JI+mXv|zJ;9m7(+F_oy#&W^%Aw)_tD^LEU zq)=dJ?NG0_@ zUL5PN`3F9r#K@Ua?s8KCov0 z0Hq&`{i9DuCyCY@Ywe6>mk8%%a;1Y%@Bd7NcJ%Pam-8|FU7HRxjXa+)qKV;#`1R{? zV_Ui;d3chpR&EPi$1gE`dDxczLkJ;+p;u1-TpC8!j{Qm`!zCmTBJe^ErBOX->F1um zfrLjyJ}yFJ8sWB&zQbpPPexI@{4^f?z~Q@}-;1f?`RRaB@g13Qm1i zKh6)o%te}T6YCG)cFw>iB3pD%zavGkp@dm^OKk*@2q|kbnUh?CuQSk25tbizpKd3V zgx^0m+)2WMsT4hML<_Z?H()XTqX^`A7f=&MjL0d$Ov!C}p1y2Q#LpYhqZzl)c3X7E z_$-3{!W?QOt3B`G>H-}E4N~GhFnK0%xy-mt_ewPQ4Ftm52eJiBUy0swwmvpgdE*ox zrj&OgL0ad^{MC|>fbJreqGIb0izDIf#$q2SBJ0hfNq5z`#s18`F>V@|ss@)7oyTc| z9Kf`TdNKe30H*60Ub%EIx`emesS6Xw3xIB%uej}mC5so1zsbA)cM zqD}FbQRn~)00qEE;MG?cDeCVcSlgNIja1slhp-^zb}|?fQ3DS52H85j<8#ie`@0Bs zb@`epb>HH&TVk9EE2eK6Zd_LPcM+_u<;yi526_zRou<818FOqyhyK{@Sd;e~c0Z*X zxJ8(`(AaWsMg-MX+Y@pha5DI*H}SGMaAxqsC*GM_8D1IF?bx^3e_R14wYx#%^B?{k zHnlF@H@j_*0?gZ^I+m5_LG+a$86CwHhJL?@5;t9#_Jb%_y}tv>7P-E2rx|$ZLyCOv z#665Y=#ltPiTmX;G2KceuysKp%!C{41)t?@gkUBQhL-t{4ti040}0a=;nTnRjLd3N z&n}(n2dy85Uo#e>r8JN`gA_%k%U=_S6r{@s{FiRZJ?`_$7Ao+e*y_i zG^3z3%H16A0>R=jPks)4*8FK>0?x^N4!ykgH;}-a)#slWUNcZT93v#v7m8nAH@5#L zkSM+|ylxhBI6-7>C^fviVe$BIvec}B7D#MZw;fKAk{T-AFK^n-A5J%qG*mwv-n@Qf zS9I}uElFFx-R1PrY@bz|{Ji`v5*wtnkz_(%m*2*Slu#ZzKWzJ$ zfSG&q_~SnaKWkE$+OZ-_jLDmKewZci;Ki=r&7OMaPneE+gLD ztIhg3JO0h;9l1v@8+yJ!`zMe%e7pJbev<3)r^U_|vb&k@1*zW(S8l|Q;Qj^@Pd8Fz z4#%28cM2aKFI;|j7?59`S$5<1mdA_0=`h{>7xf`}uGCh{2mbx4@!#hk%EtFkjQs5Q z8T`da_VS09@&P$PK41MW_%42~Js@qp|3>&0^!nYMz3Rx4otvHQ^PD$s4Zp%I^pnQ5 zbjA#_qyESwmjqsb3$d1q>N0AC8Fn=2C0`&!N{)|01pMy(=!bU5q+z1=0sf!e?q}EP zxcbCX-^Q-!>h4hqIJKyc+;4sP2}`LVRzzo*uE$luxtLQ_l|QeOuW*sdzhhV*yJ0^X?#F;hmv9UhC59J)2 zN@j?XKpX=R#(o5QIc6n6L?l`TDw>%FhQ>#Le6nS3{9>zaPOZX+Jsd^VH*+@~_!>sC z@!`YU*L<@nfD)GVS{D>rO3ykL`EO3tnV|~&wp_oizB*x6R8Jm#~6ep z23Q?^%pe3hjY(RA@id)0@pTj?&z_QrHgh=1GuWRAA<({mz&O30Ox=EBl9j}Z22)Nx zJ4;0;%Z4-KJy@<=F#Fn`WiCj93NrEnupAWK0EI!}>hVTvh{~+rQuU4hlpYUgQE8&lrUtkfA~Sz7H`#EZO%Pk%bk*^pOH!1(`UA z@MsiBOv0}thWjBFcvpX}dpkRLEj{;FP8#OqNJ=o4t zvYDI+N~gJ#t^pcEFvN)twFxjefvH_7lN=!1?z5RHxwarEg%K>skQ)kvWyDGaq5=MG zhR|j<-fO_lI&kt3WE2nH?`7&oJi88KUTtAZe*|0tB7!6v=F7R)=0I2qz!})Ykj={5 z&vd%%sr5U$TTE$&^K^m|!Gpv`C#Jm4+@$txB5z*~hLkwp%x3*Av92&R0|U+npv(w( zHnHmK>ncub2?==aiX=!!kkgx-b0;Wck}(ymowQNNxPb>n0NkqUp=^OK!s59N86o## z4f{wy8isD{H0Mgd3)!6fgQk3jW-zV}%t{@tvt}<)Kf$sOWgN_|X)k5`ZsZ<6-l0iM zU?tFB+Gg-u1@oZ9;G`}F1xlFJsU#RL(QTu+uq+9BkfT0Gj3eB&4XU+0 zWQ)v}?|*c5j*&Cmxc=(7I{hH-5DZWw4AQ-nR54nut{P37rpOPDv#_FE z9&Toz`_8roPdT0N+$JR^yEZr4{%LGmvu33kQ1_C1h~cq(+loYoWi$CR;icMO&U+%u zIJW3o`)m7ajJ#Oz6O_9E3Gibu7GiGOiS+D5dI2Ov?jG~=mi)QR%(CV(l5rM-$**7&c!qo> zLNoR7Y_WkT*OSkS`3m!h^*j_tkyD^JC-;8aTH18;FIv8W&hS50!#o12`QVo&ONp22 za!wbsVq5dcjFD*I?4_p~w=+IT^hJ8tTa|a-S1tb1Ujnsjn7m}cIn>TA4U)+jW^Q5i z4W{EgS6zLPaf&a^{gAD{HS?ib8x_MAa@0K-#0_eRL7MmAA7hP}LkIXk^J-}iQPsyp z=4c?oBKQf@6IQld8P@Hbu834--_%JR#u;AN-Zb*x~azDFf)hThvn68$ycEdaFN-a{vu3!}h)R13nSJ`X@O>9;fEFkbD?S@JokIj zd@GkVn4DuCJjSyv`*4s!W;9uIsN_XFclcK4pWvQ9%_(<+z~M;n{9q2$r?Z(EHn=b< zQ_C&i!d9it`q+q-f(g?21>yl%^GLA0Z4ftVp%7*+1YmUrB{-|dBJXebaMV@BhS>zh z%F5xxyoN=ns`Zl=Z>Y4J^mE0IFpF24K>oEMi^B<)9tMdPXb)fCu{0upoK^;74It-F z=F732_S-{%k}z3&6!nXCXHT2d*3X0=2(ok=b9*L>WYQrPy(#lvn-8Q6aQ6Qq zgtvD?jY|En!>5fO!zoj?oJy^Bg8H< z=~1r%+Qw}6nlnGVtc#LjV)@!=Eg$_oj_o55(V~FoC$StL;OwMo^-%7INO(69HjM!! zk?^m?4S0Vht5Y7hlcB(=c)$1Kxw#Q!Yrm!;;{hh?T7ChlWQyqzlT~=G8V27?e9+MT z9zv)+ATo0y)2++sn?5JCROWPeyFWoR-eW1Ax>+J}7`yp&=IXg>$#^MS3h2{f(<+>EpLxRlD&^b z)@uQ96hL)*I6TzRa_PBTb!Xc8tNjZ|Ip?L|=C;tjWUAm7s1e9C*$lb{D&E+AXSK(U z1qo0m6dg@PcVE2U9 zYg;+Cwl+X|Z6{9Z`0B|cza;t`VE*y_^!+UQygN^{Qj;jg846S?%ddc^L(z<@7(?d+ z*2MteDfV~M`|n#gOvE&|ZCBLJ^AkoMKV-+C6=de8C};#4#snblg1Ik}?%IORQMvvc zq4H4CICkngUo<&i-;hH|a)qAtBMsr#ZhgmopO-F0;FmN;V%jVv z-sBtyUrD027X0;z$+fY>Il_6C+@Vp+(zA+OPF;J?Eh?@x*u8F@s?ZCH-an^jE%@H1 z+GDEvax2%nh>)*d66$X#H=c8x{8nT;HuLQUSKU|DsM^YW#w&Xa`l#l5Df_;Zvsa28 z-tD>#wfDJxjP+*nlb(kZGXa*I2G_Ugc{g!e)af#Dm1`sQ@2B6eJg@c9 z)bC{dWm#`Gp1mGBm#OsYUhn88_qO1sWfW8Hb6vwW4VN+e@y$F4^y_o2@oyu-KStjF z4m#NR^tR;2$3Hv!KVPlRP;(E$06H#&^77sUUh69&>WcP2p*bzlPv@0VVE9pi>0n}+ z#OSiB?QQEK44G=$*j0BuP+XQ)?9ah!L!`PB`qK9*c;%kdygBJRdC!nPXpg-`Ah|0= zjcTp9YxEqui!mC?rk61)c;a_u;B9FX4dJhwyl(<;vFaNbiPO73#BINVFzp|$G#x&i zjoLAgT~7BkySTX^Yj#17GtE>JqUhVL9`46}g`cir2u)Svyy|CeP$631qj8j;jyelf zLX0&apVp#PPXE}mMC%q^nV@%1@UyVel6*0)pd|XkO!h{Rsdb|V_YZ3a-;9X@+siVt zSDm!&e(2i2v)?s86aPC--|?~k{xy#aOa3NquQt|toGj1m&ziJ+s+}`6ys2z=pB6G& zV(QHwIzE{9|LGX8obm8_;AX?m>%r@vZvKPt-@wxG1UNmZ-T`3FZn&C8iVcm9L$PY2!YINCqDOQt&!jOk*!aE$5Uv!VBZn7pU1wVx+g;X#!W8#{s-arpSFMa+ke(IE9Al4?WW%k7JO$y9)3{Dn!ZPg z{Csj*KbDrU-cPYHdbIfXVTar5dP3;P`eV0_!_Rdy{5Q8=Zao|PcK2my(C#3cYOu`M zTZ<5M?*(ee!LS>3;8$MdEAyYrGhty4->73@0-)`HSIaj*EPWE7U5RitJEy0+4^c1! zMDRfYrG@_>Zwh%flKq_%Rj-Hr8JjUWD)zQhlCeqw=hrx_;I09)SQH%DgN}BxjnVnQ z9_b`aFR(;0WS-_^4_m=GrWT#}|0Udja%ch!oWf3}s9=B=mUX@Zr4YMVQVXMsmGcGe7?ZqibO1A+*ceEh#D-FGs?0HKJV3eNoWz zJTOT^_0S8##-4<=(>YZ*z?46bdEuhk@%;x(g1{K#uGOgI0I!}P_GHRUuJ73>z8+O< zA0vv_Mcwchy&#yn$Y^a~dBUiySn>JEVb5EiBB%j6%+bgwUWd+TRlGJkZ~tq2LKlwd z5mfE{BSRce`!u0)Nz1O!$l#)dur{9#XD&8gf?y#;0-$H8V^I;xLg|;ABP72z$Jyzv zB#rTkI4Wtr=7{~6Q8S%|^GKa4Lmff+?MBDlUM^l62&v+MKLD5^S@oeMd9 z_N!)5m}lKxZ!3H-4z(oE%e$d}T#9h9Erdp+!}Xo=2*zB14x+Ztp?#@`E$>RH^w>t= zn+*h0rF?n2ZJ&9=052c?YXOBkz_opY)xoY%@^np%t^}I>MQcMf1Ye_N7;Baju?+$r9@OguP?5nU-x{Fdw99*ffVAP_(lmwQA zYdi)_a1pj@fCW)IW5A`f2?X3-J=Uct$O%fh&imq^yX7ewqAFeWDx_#?r&G6%xo{lO zlda!r30E(|pzCMA9)}%a%;T+jh3}0!u?xS*KO=D&238GDcxSmnWR}@l)(zTP4sNCj z!zx0`)qb+;S$yRgh@=0i<;1Rg<(WJ8>ga2UH|W>bu+GdU9bwW&py*4hb#dJg7oHc) z(b81c(`^)}B-ecMg%>W;ySDnQrKGqYeOx2CJu#9!TbDvB^I<4ki1*8Ts}{$kQI9_m zNx#;WQcvvCX)aj`DOqpnAm3lN@VJ*kB~zg1 zC~a>}b;wP=zAk-HD|b|1a}ll|3gHFp;>9pK(V_Lr>WLD~PB2+I6)HFmtm5_vDdNc>?l<{(q2}-K14OH<)+S2~TX?GCs|eQ+ev=2g z$MA1P7teiBq0hZ-&2QecRdi|dE$?x}s_JpC?+X_*Bq=R5)Y^#YOVyHNW$TphN9Lox zil_^fD8#Q(qidmyT)KtkLZK2schS=`1+cc40!H7glZNxQ&n_dFQj{CsQQqT7+V9~) zFT(4}DPai|;EK=wDs^!yj9K`J`O9(xv7Na4C!Dx8evsBK-A!jQ=qzL!qlO?JA0_MW z?|nSQSoKn59G!L;nW9SyV78D<(U26)WAhJ9F|0rY6X*nFRxX(b+Ky<%Sn!x+>PsD0 zS*m3QrZlcCy4#ra3YOR5etQd@yZiO{{B&@=gXj+Th|W?dSTtPnJf&MpwYy{}LPpJ{ zV!2f)94?b4T*EXG&AZ)ddISk|YO7VqXSOOCwyV`C&r^yEKUG^$a}aJ;pvK+KyswG} ztAyv+VoNT+Rb2}a@A6f}lUzX-60 zwYo5a=3$fecq#7+n1^}+Ms_y03y6Qw-6g$z1l2>9DYb%cNEA{H;_!>{Fh{2nrteL> z7_CqsGE}(r#h|7>5&Y$`CZCAP#eohT4(R

EtePTaUbuwJ5OwFg`9^JiAA%R5ec0*vPZ%wJy-;RQe)+S4;_Vc zsGaBA)C|T%@uFh<#wD22@$-_XKMKOAIS2u!$1QR;w(He}RLuZ8?c3?h`|qN-Q87pP z@Yud`$N{nA)Jt3+DPaBKSE?U_RV$d3q z=O>ohb}4z_LO`n8(42-XN!md2^;BR-c>?~Lv|3QxYaC2_=oDEmJ^Xa7F;1nLeXn%- zuzy98%wz@Yy%_V^u263Ux3(d49UsA|fYKKnyuCH}!X@4>4Mw}Gua&?`rzyuw!onl~ zFH2aU1e>P>_JO53ZZyhHO^1FQeir>y=P{38D16^vQa*;dyAyq19z8Ke{S- z-b6iqQk~7M0PEw`IA(<(pOkey-CgN`r`n|BPn{OND605Cviwt-?v3Rb3?7DZX@0iw zGOD(KXB-j(?vU@Pe5UYb&?`^;Ktt00wbZuUu3ikk*T9u@%`~{?z1f%=X*Ekl@{>Bb z5B9aoOU5|cf*L`x#J2A4Ud?G?Gn`tTO&R%N!&QNa-WyU z2nIH=l1Jqtj3_3rj?u+V&+pC>X_jS}1XJQMbT_qu^Q@_qXfK|`&|j!=x1#;kkZA=% zl8tgHbft@2StJpq(GS`m2|l&@k688VvZEkgPp5u&g7pbO`deU5aTr?CWe#79`d zio(dyz~+&iBd8;9JatmCt%Ppi#CRo-OPPsxsnjgahp5Utd7*@_-=JCKegLj?9;!e5 z%5N9vgDH7DE(fm%XZx3gZd}nwgZg$s?i0iNqF)D>t9CYJ&MOjKOLyFL_lqw^sn@Ye^MaxFHPE?v0s>ncMSsO2lO#UqPzEv@+`nU*-_wG zC0sT(gc+XKg*5}9rWpK98SEKsoHhw|-_1r;9iGQQdkLd_^6`*0dUIQQ2}R`Dc90JY z(mw^;%?GZ)a5CyK>tyU}C3^lMb*L?NOe22a<-!olm|VKT1B(${cG*(}%iKfpWMe3w zNly&`rIu}7_;M`7F$j{)?)Y^qq;_BY9;VWKUT;2EJYK3?e;1|to*{-VLeiqcYY0R+ zb4lZ7p=Lbjy2rb1d^oaMd`rfpCIdHn`QsSJ$1or!=>FBTdhqNV!vo=>4Ej;h z2ys%=1$yHfZFyDcB~O>l8Phdm;P$m46k_)COQo=?T(Mm*(=g2CcqE8_>S{qB{TmXD zX_i4bd#E@+X})L3-3`vD;>_P;6t4n|(plWFRE{SCv$x|A*ReiJFF5xby)>M88l0;J z7C&&+B(BAbPvs2*Yy}eF$FHSvyD?%;;!24TLMjjpT1`4J{QYgA{dK=3%O=mM@xJVIN%G-@`+l;2P6#o_ns|>I)5mE5rlW zVhZ$PG_$_-B4Lu<5i9Gc(m=%GO29D|X)%`DF_y$-A7Y`t4peU>!IGXmSfbEi)z$h9 zbKoSwMwwvy=lM(sPfL3Bh>9CqXW@(6ZZ~de>pmbRoGiIt5*dyA0({p_v$dcmL^U_a7ubSWSA! zT5;>Td*Fj-0h&oc50sd4KL>tw@9qEm7VvnB@UYFy{GjR)W#)mq?h$>*BPP@XpX5P} zedZBY?GfMMk?_DHbl*KmEYG)?|CYg0694)eA&(K{dMnfVBN5Nc>wM|c30Wfv*_o?} zcRU}jKF(pd#h39sx5M*!$KxlB3B>Azy#3W@e>@8_ALlN?4Ttb!` zuk*J|Z_t5nH*9Y@1#V;*u;irUPNwGhZsp~>Yzl&1nyg-*wsXr)fz-UmCoaGAT7W&8 z+r&$NgFguhEKAUzg~keB>0jME0C_t!csZUF=eu2S15K}zT96~Dl+-11B@ibF6Q)MD z2?d-f)Ia>fm1!$Iu=!1;Kw+RN*bZk&F#2qTTP-e;%l^7923ZM)ZdBjVsLR_D!(F8q z6bRzB_#+i73gnzr&=wLFeOtDt=-lU`zZ%#T6Soq9Nk060-sW$!Q+L;-!A9?4=z%*A zPklp!Cw=WS=X5Ydx;~7%0+-OY2bH5dz~91%&@k28_FZQk!F|^ci^!SGZUPqTq9AhY(XeQd-(|5MP4k{NbICQ>8(StyZK_byTk@`cZ#-SPQO((#*5v--jtq# zNh_CHqNBW?Kz#ecElhUBw!sR85mjgDLjBJ(U)ICsi-uxKgq%v=GPLQbGf^Lb!G8JR zXX@V-XJmZu%MF%K@xU*ha4lTT^*zxh?(lU^y-7M?Kzch^%W%%B+)?!6EAf4U*I^-G zgZUYYc?Qa@0`0DkNEOizUC5jm6~H!t~0!&>eMbDmeZd$&~8c!mF91-K9IA4Oo@p7#y8 zSFBP|8;7hluE5($$plvfSKdXoOSyfNDj0o$Q+eU~d`!xbzw4PU(Kk=93nFo&Du2AC za4`Hwz!h6cTVH0Kg@`_mAig5n!H1npJR|cuaCGcc{$a)3MaaNs5jkq3U4WHziJlf) z^_0+qxhuczr?g)M2wP0)>nLTVUkUUoQNP=w{%~s6IK~GpjmyBB2dG|F+q#&Lmtqm6 zK|SDo{HwcBh0V?Xx3fSPGU@^e#xn(Dv<2?;FhEi5YDn|p-+lKDU(^syWw(|G4kEz> zBe+^}PV>3E*7BB%*i+ypoRf7a)yt#7`gmOS&+dyhST||bpH3G!N+*{XK!QCcflEm* zK1+d_hVT6dJns<4BrLZp-Dc?lmTMLY!9V2C9StTce&D%u(JR7i{->DWNZ{kQaaohA zyT&+jQy8hhBS=5?VZapiKtkl#8)5CFXJuL$=2O6T@Q8T#N7b5C^~FPcUo_am&{-*d!rmr! zt>G@c@~NlRtw~Npg0ik|vnRe@K$QcMF&=PY>$Vc%S~zVqm=YT2|2-f`1U z^I~>_G-X8C?hR<^%ONGi^_vWf)mEx+2mF@jYVIz-RLi^@Z0%XCDr?} zt}BL9_Rg`&?#e)x09;{UdzvoAIm5BL}~vjgna)B2#vD30*X5>Nb#T=VX^+dSh9wM?!@*mL?LQA z0fSiwD}-q|mtq&l>8U6v25|}1t@Q^aLBa5wL0B~*Qx8Ah;B1qPw`11js*$WvgY=%MtQoi{Rn;&TC{^9E(OOZdehT_5 zK;Vxqhb)X|6av{I`en?=2O-uv#X)>#^GMWSGyq}eLJeG#a=D2#SXv6mOc0-{iy)Ikdkdlr zdBj*RqL!3avc_`+e@@e!o@jx8&MI5!>AFBT8}`a?d?U zDsu}Vw}jM}ktCH{Mah1Cf5CY?&Ut)3@6YFbUhn6#+|`5-b@i?R)8;#i(lxFrwf9@J znvy06HUDy&hs%6GsPMm^HaWLoUm84aU)z+)RQ$q0hM2tN6MGn?Glz7tOO9DmzG)(C zDs1-1n$^!(S3`4S_m&1NL*|9XdXDy~M(Y75fXO>k;wsO9C(g{#L zeOlCG)|~uhqAmjz^;(PPDX;0#o*c}r%?rL)ZQ2~9J9vRH8$OfFzz$$$yB&TB?o*z` zgC0smRvR$#U0@NMe@;SMifp1|8><%c#`(%`gOj0S_zay~QeS ztjkOmR2OH+)i|A^bSRRFya*gn<|@!=(}AE~X}2-v>kVxfi)&@5u4+_(GmSMlOma;Z z@)d~ZX3s%lUGN?D1bf+FpQW2P0oW?h_mqL1#mN46>Ze1t4#8v|StZJb<&5I4dsjxQJ{joVzN6Avvchz@IMDA9rX-J2@;!_k3@fZ^8(Nr zVie=aTHayx`#DVHr&q1Rb|xyU9E^Zp&G8$7;aV>Z6YvIX_ z6Gam5SDCrB&U3YT-xX;@fo#q3nUVl1vIf9l+ehe6o$c=Kets@I=6&fM3E8SO4?p}) zCkOFpPEWbPpN;cK9+HE^&Y&7C9>tKYx4#0I3j0AC12gRk>DsAX=HG2VcP24RO{IUQ z@fwlnt#UBOXDKEN%ewp}r5z*TC=0w{Xr*AtwW90P6zr%1^a&-YxdxJEb*8PpT?t~6 zaFAim>nJMc7H6_4%y2dR$ziMlRbX?X+4q3KUi2+&*!1CqQ6HxPy}{60YV$tby#0=h zcXzvFK8p$5llz?FLdjaP56YL-pzr#%qScxV2jMF3Kl?^fo|Sx#B=_^#IzHT)l_WZH zf`&RGArIf4D;|{HRJ?N>)%UMDf`vx;{s{?Nu7B5QXi2oeCB-^cTG%K~Ge>$GUc;X2 zXJ^H1;c;JI4`?b!!MpxD;07>|61w2eKM}pWssKFo;W?kKm6pP2GpXKpbp_i9HtB}f zoSi${wy!Zk z7ko&%4cC9T=jXZ(**AueOogXpuN#&-xKCfH9|gjp<&8HlMvmw4bBFADOe;C|(Rf~J zjFcs9y?35B+S@nlD16M2D>nFs(cqJn5=J4w-CH2cTkc2UCt%>)d@W(@;wRrz46#ix zQFT(~8mknrY|x2cf*0{}XX9dk{VMl>#mG2szih$QN_=lZ>-&$x(It$}v{f<&;3Ko$ zY}GF3^g$py@TpU>tpxOa%X|2`E$)L=*Dom zOn)0!r4fjhnV&WIL+*IY@x{Im{o_$os4>^GIWddU3ii#W>SK?TQ?ZKwW}}XPho7?( zeE)Gzsli_4IG6T@lnt9XA1fX?wS5<2eR6WWJ1Q)D!Xkt*1X_uAV@zz2se!-`wwfdHU<6 z{^>z$;wteaeY=i+3aJFJqk%l=Ph%pym{lIB%5Y#MP!A0@tpwYkc@({Q+`S^$C%5C}rXR%+Rs*Z0~$w8|X*hP2uu#Zsd&1gT?TSAIz z)yjH)BT|0N=AzAZ>l}@~ylaDB%8d0Z2dxCh+>tB#qecNjjIzzb#*r7I$b&zI%Q9Az zGz>+Xcj-wQ1ENu@r2I<1sN_5yt!mZqSNfr52Ao*6XoQ#@F(*F9klhVWfSX1dX~i1l z`xt8v87LSSuZx>GS(O@@+>auVEmbeAkq0>n2h3>`=F$H8dW>Qd7tSYqa9d=kHwJQ- zj%)8aPB7io*CD1JzrD0EfC4|X<6pM)pc(kSvgav)?ql?`f%bB*)UxrOSIz7!&A6P1 zbnq~${%)u>K7Xc$E@;A4N>V?1{|0=9e;Pr0;Uk7bt;1@fYT(wRNp?{2unYJLTA%c< z4!{q^Z4W=WJ+!<8<1y|TaH>kZ_`>L7E>$YNTtAztWAe}v_|UF^wD)M(7b-4g5Evdw z55$Mn+LaG9JT(m57S|hfYs{wp7#)-@9yq|{U(OWO?Ai=S9Y#$!JCRs4w=&90{j_=| z4%R@C(u|kY5Vm^^vON-CCkB4xi)zLWOC#Ae2t_fLu-@BHeI#+#AlWrrOfzgeH~6!c zlwpXVm}`NdGWSE=U141m2#q4CPbDiwf^IK-PMjVRJ9!PfN^tzgAX3S`4KPI4uZJJg zB5{Lgu%TqBv69#p2|I$GDAJD{i2GO<8BZeI8i)gs^!^wn&n9a})_+~{eQ(Wkb;m6T zU#`db$_0t%QX$GUGwU~#jA=z#YQ%HKDX7XIw<=TiHqb`VgmG;(C%37T27Sh(R8k5z z%#D-ki5+&4{&KTcQZs#!!wL>rV;w0qL9%{v3HEI4g4w3?)CQwGM$c~ZEZ=UVsMUuQ z^H5P_M;k%msy0|KA{o0F!rEhnI05O^kD;1LYo8`_a~>=O1hFECC5x=A;@iciNsk|u zeE?f9;fHO&fp5^E-r>_xNNL;RGM)Od9`_GH_ZxDo>~#V%jZ#xy2Gn^ze(&H!)L9W% z3h*@DCTSp3G8#XNrS(DgRZdZvDb0K|!u512pR1B3BQVUY20h zGuQ)vB|>;(wJ~3YPZsRYPm;9-*7MS@R7JUgt!`!!$@FA4B-jj*t&1WZGG!T{FWBTa z+|(ex=ug*1f%dLCp)y)J+&<{<5Ig$5=I&DZrZ)Ba2MSM;%?GmY$j z$ifzatlYt?t>~c*o7ytDPrl_f7jsz?N3VZ5C46a8SWwSBSJu{Sy>KTj!_;JF2U*yEC2c9#WHwn|4#wO3FB#OX{x%iZl`iY7~^IIL?UX+h0&J@(`GMlw+%I~n5 zMyK@g7}JdxxHX3F;t&Wad+M!+M5?M(_f zYl%~4Cxc1`GCQ+Fg7;=)q6S2QxHC$uFXDbY|1$KCIE123B96zuDqS&ozKMWTe9RH?;;DM653sf9^p}T=_z91RR81+8Su!{I^-LRndB=PQ^!6<7P<}0Bzvv=XpE1!ES6d2&s>~}k7yy4 zkV8TV#Hv`lfon{SlR_Xb-Pi}P{A+RVbRcMI=msev$|?wZA`}K9+yd8nX+OE=Y5b_c1PhY zKGq9uu3pxv`X3mILnOIAV&v4n~rjz+BkRoNNG80K5?9e>|J@ ze3iw<%sKM@*M21HHOzz%$F-Mj)Q6a#=}Of#V$sS`#lcPxg~DNvN1U#s;u5V2npOoI zQmL$r$M{<}lsT!l6nNpUWoM!D&8qq^Cj;$6?d?MLindJT5S5sVoB{AS$ZRbVx zC^n@^#Y5Qg=>e`L2-{IMzpHjDhvC_K$t!<20;zFqKV!-1MqC>^Mq2sO{l%O)!?_L6 z#{Fb+L|n$N;fJe6cj0#AXh`r46_9+YdurR0r4(qErpA@whh93?3ey%hve($~>Vu{V z>%*5F4?JHH`rjCH9X$Xd#y9}L)K`Gd3=C68f>`9!X!U%qr;o_C zR5xaq59TrF>OVPFg4|RFYc8v7H}IbMDAoxb<|iqB~ulRRo_-g(VC*@t^bUVK`GZtyYZf#+== z?nMh{0Jt@g;ra0DL!7B$3Y1ap2T)WYs^bj&()%M>eOO*dGm1avWVR^6*QQMS=C8wJu3$TgQ3j9dEo6wp!}Ism0$_3tT_BdgWB(X$ z`Ue|-NaaSKv^^*(;}xvg681L4ffF(2S`O4c^IBZ4kla*)ucJiIdE)y*%1A>W~$NK15}H zS4pE~tYxB@!nV}Ef#x4!7=*@wOi!76O9Z+(sp)2aKCAeQF&jP|MP1!oLNLFrmT?D|ZP_xjR9Xsfm$-f0r1YQQY9+-M_?kHnl-^WJFcy{}P|FW#Uq!Bj zy*0f9y0~VFvoKDkOIEw(*l6%3Ij_my8A^I@V#*-;c+3}PZ% zDXyc_TZPU}8I){i7by~}n=EOo=d=*nhW>3F9fjo(vb4LTBqkxwh!HZ}dUKaEvl(5O zz+gyo_V^pz$8bK27#P*v5b-KN+%lpl(v%omY3hqMDs}a(tm;9zETw8@b!PyxWRezN zb;(%v{<`-csotG73Vl)K(RQO7x5?|L@k-^+Wi{m&j^J8_x@&aAEp+!9NA~ zNQd(FLBXj#38tHw zq)Vo}IjWLi&_x`{oj{5^T{AMpt&((1ev}?&eB`Y8ef?XMH<4~*OsNDI36xxG0fkRX zAh#Y?n9IX-n8is9=3z`774>f{T1kof*ZgKlLQJKHoY7GOKam;vKYkRC8Cjq3VWBXMcn{=c{u6X>(B zb&rSe8RO+au5@!_F;<766m&t2z+-uX@AsE(I;EobPi!$47lo5O0!!AB$>OgaM&Xu} z7kSo09xRG$9~~qR@hf2=?3x~ieP~|B$-K;WQRaDW`E<@^ zu;j%EFt%syHfJFP`3Yy@s#9U*tK55M)D!)X*WqYL=;a(Mva$V{ldu8vInhihizVd6 zkK#p@f6`Pc@8O&yZJpUIoC9&YuyQd`(0zABu7GzoNg=HdZt?{; z`r_6X%>*(-scy!WvBWkx^E6q+_{%E~IT$isQ0_dKlR0E|eI%8<9{8CsDvt(Mr+HD5 zN83|$98A&V)HaId+b=dZd*?3Ez6c53p0kakYay#n!FTk=aCS$O^RzD;^|}`z*T5lg_Q)rO6U?BFZhe!B}{z<@!pGrz2n2(n*}9Wc*B$ah(lF(%N`3ac)Ht*zJ-N&dcObD(cM(k93Jp&>HR5B50(3SWQOO; zn?0V6(c8_@m%e(g>+$x^6n($ipzXOi^|Lp6QZA&-^TLk=-o7>NAF+~;KU9@GsoP?^ za%1fM#osS@U+l59-nw1#{zr%Fi{rOH5{}>hN1vK?tpiLo5a?e$=)x!}v&$|i@A9Q( z&f?A&pjXLKUOp_BP=kC6yQ!KhJ{*atAq>x6x`mf7R|RTV%4ILpeZ`meC2B@ud3{ipGO zPl%&7gvaK}sG9H3nliG{?S~6v)`qti9si@>x}6gKy;h(~GCkXt#~c2ujjE6f#juOK zSgo-sA=@U?_?L~AByDxvOCs#UW9F`#BleFuO#II+uWhQ_Q56bN(YE$|X*U$Vl_Ww_ zu=1tHn!pp17G&~k#A>PPs*-16?fPL6KU9)F9iOSVC?M6VFf4tPnU$h`vW6iJ4@9Q8lalXk52oo&H#go1|gpB1&)r^xp`z zNCo<3j3Gb~HGt~>lULSy4ckVp;58i0%V-@~=uEvy{O(ssNb>(2I&=L_^z_f$&URqQBK)9Ek95UTI{Y-QF%+a3P3WZ^y!@& zDBs=9n@p0Z|6*;nI0YioB_IXxpZ?8&0~r7qtwmg_HAuR~ehj7YwGTufLGXt+(pBu} zOwZ;;4~lIKx9&wd1+Ze_WjD-~B3u6|unm--t`4mRtZ`8p2e>r%7|~9;?H{!*|m<^wz2C~qL|G8-nq zV*k}Y$L^HjU47_Dp2FE(2073#wUUWbAz*0h_I0ctXB*Ro8Q=~!TJ3W%0bM5XS;T{Z zsl|lhr5I_~6vrcG6>ShmcYuO0yV{#_sxIrHJA;9o13#)H4EZ-aGFOo#8^DYhv;|@% z0Rqo`fi>5dIaT9KVID1$xU0l4Xf1LyP=A*qb}G(VyBl1)+vdyk9XhbH&G0RJUC%I_ z)eAkqpf=>Tr9k#B%6Do!D`JP+_BvzqkeFRDaq4ecYSIrd@3P~wU&YLLy^4dbP$D;j`2%o?#iD@ifb{(5>TD;8#sm<Q9d66s%2RY2H+tM1&`vTCsqKw)7 z;5<76n4eUOJR}YdN?RpbZ6Hs8tP6Mn(kzB|K)-t`aR?~bUrF=@=(qIC!m5r7NFsd= zZ0|tqdA{t4RqQ6B96zUL(g(PV-q`!vfOz_K+NeNM5O$LaOhDYXYsaimfye+ydayW( zS?*mS>35Zd9V!VF>C4w#Cl3SgJ_0K0i!+E}U3(4XkyOk_Eaw|6uAAnh(=OvS422G$ zE{zEbDk=x3aKKiJPuI?!M5AE+%pPfur&OVMN#*`V)k}`5eh254#ZfF<^2ZbZd6cHDo&YJ^~z%|}}BC>xKSrCf0AHr673;k^u|KoTbK9Dy5O22goOM>uB zX9})Z`Uwt%puiX^0cqfi=f2FHopX_Mmod&io+h4_JBfAMTy!G|&|Qdv+jo#vQyAF- z2}K9VE+VCN_)LZ7;yWwPXevagi2y}nC6X<|3oz=l?|oOX0w7W2s}U~1N0x^z+cDf* zc!T0Xw4F+;6Hw=aw50UsMPKm?xJCt+aRp;z9ufg|drdp#TxIg3^|LSU>;500G)CV+ z=?6&GHYdF=oi;fwdbU7q>{Y`z!?N84>8|YQ9?8ZuNj%P28>z? zkJyY-_*<8_0IBZ;P9X!kZd#E?o!kxup!7)&I>>bZk*7<{VHA>-QW$X#;xc!Cir91- z39O5BP&jY=6!Cs5*Ii{QK$C%j+>2I4?yh-Kx4r0?3v{9O3=hbtHVYDl!v^#lEC*DBojn0L!pcDHFL(sfoGauV{8Su z%g><8!e%|V@>ire17~E78KFNYKUEtftxLDOtH0p4+*>HL^uu7mB=REVgZUcLi5huH z%mN$43g1#k2iW}BgYCOuX`+?k@CXxf&{rO@%7ezj^vYPMB$~p2U;;;M@_wWWq!Cn> z?=pxcF+N{CUvD51AIanfGX2o~Z?>AL4X0#U$gKnC0^C9#1695qH!b40~RMgAU|$S&d5;A6SUqIg)Pn<5vkU=6O2>}mU0iQ5l7 zW#;M_17`0pK|ws<@HQXbu!s7=Gb7MEdrFBhE2dDbZVpVUlGf+Lvyl<)>lB5S86Q4w z)?ZZV7%JQIM?Q|pB)pP@g&&d5Xec^)H{TsDJSc4Ux?sNO`4S*D!s6g5DA#^`a~ z@4s*@K%19IQuuQK>#RkH)KQ?Qs9q#6)Gf8%9s0?Ww z259ZHLT^+v^%-ObxSHP$$R3W>htoWWL!n8uPz_&;T9<}xwN26;jq)vZOBXRYF%KT4 zKnR#KxH@%*cAh8b(k(GmM_~ltXheXY7J5L?&d4NesO2M2dMzrx%Mn3Xy@Dp;H|JG+ z*F%3D;AfNMJ&aVChV*ssr8qzxqA^(xNigh^N-cx6MvV-EaZyULc+&iB8wQIo1yk>6 zz!*bp(vyi?8e8ROMtU^KOMv8jeFhk7AW8n|BwRJn7s7eI5^P7f4qJ46K)ZEQ)x|?u z>BVmj76MR=#y)b7WBduAuu@@bjjJj|wy6~-2;p{eOgPqb@^?nf+_2NI2Whm&LzgkI zTiDpBc($H*hN*&3Q^9GUzgkf5J))pam8K9dk`Cn2apx&nWiDBTR(RL2ZT}kzG;5tR zf?PF21lDYuse}Oy6#iJ{j+hG9t6%))G4V-V!Y(aw8515GluAIF-xWy-U)-pR5v@wS zF_OL{uk?o~*vup`=Te*Dl9|zE5uC*MLo`533WuPE_^o=-Dan#pRYL3{I6c#su(*F{ zRF|Tnqk^N8yO=eSO>U4xa{q*s!bD~n{7az@4oSwpVz2zBhG^ifFt`V^)Qi-mz^(&Z z`o(4TfY>3bLMi@&@Y73Zd{Cw+Yi;Uc%P@U2@I4b%`gCfx0Foc+p9TN zHH!t;xYGuN6Vl|?Zpi()pTHai1gs&xIq-!C2=Jsp1P#HgS}yc8>J{+;aqj_vssSMq zAHB*#XOBH7H+9 z#Dd(N@Cp9Y1mE{RpwJwTLu^G!z`>#%|9)k{uE-WelwrTYB30ka6nt&%JaVA+`cTMK z3%lp%aR14xrZZTFduElX;qn8nH2jiyUmScxOts}FBY9tB1Gr7lIj=Dg5`J=4>b~%k ze69|J;PywkeRmQRJpO!MT)nFXg=$Z@e4H9(J9qCNCrHb`ig|i7JRWFSYcT&tOrRog z#C8o?yw3baOugJ7q729&?{A}d0Tb+(73KA0NqmBfW>D4}Tpep7YB+nJN0jVoO78%R zG_RzEC;f{BF17wG?|jx*FmO(DPo(@Nx<}WJfKX&42}@W>K&!5z53(N0Y>zR^q?kA1tT9KuSok{@xvFm0kW?oD5_LLPSq*rO7Wa}$~+e- z0=~3kD%+`@36b=C#7WJDs?vjD>_9xix|*6gsQ3mL{>qnhxV3oaIi>`y5$`o6c{`}@ zha2E#$Z4qObzK8#n>I-r?^Thn5x&sG9P^9x`8KcS!FYHT0#W=z-;1= z1~F>!Cqz3uJw)@CNZ?#Ui@N>vI6Vq?Vvzo}fJ|`o%HzyzP2M+T2fi=I7fw9<>(*8$Uit`4w9Q`JSsM2ne> zi`Z1?qVu!l_@)w;j@ zl%GRgoKLla70bR!y!mAzY|$9ki0ZGGyVAFG@H8)nC^11%m-47qk?}M!p9}FulLcU> zs82z&s3rlm%=RYbw@M;oEzvAb)|whE?u&*woJF==*p@s}k{#kU8#^)$e(|oincWnQ z>OD=9tMT%Z#Yc1fmbd)RJ~HH&X%Bal6Lb3epz5bQDHnrO>0;b|xwm zBzR)k@1{;8Bc+rC+y!R?hV@_C4-5Gqa#e@)a&k~!#(HD^PC05H)BSR_zK{Cl>76q9 zlMT1sW^*~+rpbnE@&2|zR?Hz4Nd91N5QX7(G++}xKER(vS{*Hb7gUkfK=UKF4KieA z8m%T+mxJR)Iv+1J+7x4f4hB*!CW) zcqSpSS68@c{RK$`Hiv8Ptz&LN!JWs$Z7|L1Vfyqe2{Jxke9i*WZrQVDTKGV|SM0Lm z)6WT;7(QC_Gmj_v7cec-p6(B6o^SW>E&4J&Rx5ipIuZ%Nmoxw5u-^WsEE}W=AZE#V zj@1ZpzX)5$#OT>0_FVQx3?4lOiz3(cA6;P<805&3`F?ZEFdg-3qrc;AV8oswmp7B9 z=>6-78A*Gi<@t&+9ZmUP5HuBf*S1RaW=j94|dv<@J>xn&B8fE1wm(Oar5Xf~2ViKVB%!ReSA7g^v5!s8q+Zk@e^)=o^49Gtq zZE!aix0NcfV#sb|038V$qXihD=&#&HgH4mkZ2m@-h)^uo2=$7o$x%Jl6U&(*j!l-0 zrLvFOM74sVg2Kb&a;EwbXvryBfZoX~wTn=&`bdBJMS|5BdveF3f>L%1-{b&%A7vrx{6SabC}F+uayRCs(1i{S}C!uF^=)9jCR1muB$Kb(2wMQ}d;d_1eZ z6SMjLe2q`*9!dH#5$?35SoAtqE3778r@M+bp@;K66F!KQV4%k5zIg-r zsNO_A)82r2*Yq~-5|F-?23OY|6T$6nvELE}W-a2l1f(h;-PBb1l(Fhh2LR9;#`?pX zL&6uND>(VFIprh{rSDtizwh3d|8NB<##tG1EFqrrUC4l2B#Nuy)V^W=EV!p?X?mVF zaxOK#t?7~py0#RC$KKyAFmVAD+3`7-71;OJx7MijEm!rkxh-Z%)%iw$N$z##!30Qa3v4 z-pXFSydiu%`uLHnyC3GDTG>?x-%=UEf@8ium3IF?wEiu^KT4(fot&E4@Tausj3)QN zkKa4zAGKU-ZK6A&rOxJAJ|Oh^_q=jEx}I$eZ#js(uKxBhT_p7zA}*$GK;R04zP?uq zgY8@D#D{w#b&F=wxUWU?-Z%QezvMJGTrNy-$5PLfx%&UtEESPnVAdFATePy83Pim^ zSXbhXh%B`6WC_}qoXM9Z@9)uy!?NM+Sy4AW@(#L=@Z>1wJQDa%;A`xwr^B;Rcifr$>%V7u(_F1w=|^3ja^Kr}b zE!~e>bH0ULj(flIz5B^aw(pTyaVr~gPoBQX`F^!2?!!*_lV|_2{fK=X_wlgh$@3pM zKjOc>Uk;M!eo1HBC9vqcNp$JXWqa{Cfg^s6HKJ!wq{YRYw{-qRYR|BI?q2q5{xy}& zo^0Kz;FQbp8)EWL$5_~+dFuq-TZ@lLI8< z?QxACPiOLS4{M%1rElI4?rpr#a#(-<_O`{1Kcq(&y_-MtZ?h>r%I!PNmrFC=IRzK$ zd~d40(wr*NyBkd&#jhn)mTg~cefHsA_(AOx9XqvwvA}3xYCnrGtBU0~T64W0x59a^ zH{%=GDH-lc_T8`XRtgto@ctru<)C(J_hseC;IpiR!x~=Zxo^!sFUYKn1|!}`Uk5Tv z+a>I460qF^0XD-)V9BQGlpkg5f4k{wxlzW&>gBu1kC4FQ7t^#2fsEG=lM~MQW*8!% zdAAkj6T&rP-G4vh==knPl=w|iwfVjJMz+uCVO?UJd6Y`or*MIv z6*^V4f&|r$gnvQwn+E$ZWGcMZ8&-$*rdJYJj}SfHuwO;mFms~t8e5YA48w!_^9uRz z3GDEv_fOZvPicx{4q)NMYfX``CU3XXwgdx17(199xTsyz7OP8wSx0(4lnf0uSLf@Nf}h&IrL9*|KwL47uKdKw|T z$7VRnbnhoy3VyBKX28*5Iu4uR_*l z1;Wn>j~J(2<_TS6gtJJXsBq6bwEM~I6Q$|hI2+gM#)x0b@Uq754T)& z4CF7Fym@4|+r$3d99G-L?FQ!zLoj#(!9vD7HeI4f(9OO($ciD+xi!e~R?_{uqO+CG zpNyR8WHy_JdiI?Nqe0H`pnWN{Dd4d>4$DrEl7j7sL2Jd!t2guOs({J?WP+vodG ztlfDiB4%+%CtB&X39ntXb{`GVkCZ=k$eV6Zzd9$%kIFhtK6jifNbgs^P36(C&k<5` zHKYkKQAKnp3i-U{H8o{21@M!0g}=pOnrNPy4XcBFBMv?u69BzT%Mf$o?HjsZfS*OF zhJ-r*0?-a2ea9THFkG2rJCWHWa0$c8+Kpo$ZcT3?i5OJmpwUMK?zea)7d-nGfkQtM zw&mTBzK!6bsMoDF953-o&*pTlvK$$}-cUIj0d(ltB7CI{Ru6;Lz*D6etR}0tbHFS$ z3QZ~K4?m5g z$v}EZTA&$-Inz1O0ZlC!4oVEy?v`-`kWXWV)8Agu5eXp-^X7K3tfHF>Ax$+PmN)rk zQys`mfEyi7V#Dyx&0IX*Ml9MVKxSpf_mEu=AALFINN+Q~MCEab_K{)Y^J9QkN^1&8 zAnKkQ!XQXT(>6|4qZMMs(%dOP~h(i}Z17)p+}9ZYC}LxBY< zm;R`IxwS*9nf1?Ab%*K{68r|4UKn5LV4CmX3&9r`ToNHlr9O4k@~HA0kd)>ZJ0tN1 zeT74IYp~Md)`pMc$0RP?=l5hWV2fh2;1&yYkwTn*5@31uMnWtZ6pb1^WQ(ezGjgVS z76m0Cn21vEwh^B1yD#`W#rKL5p&CtGSrs^qB5H#lgQ@Q{b1>yTib+Y-h3h*;BjlFo zekIH8Y8K%tmd(o8TjQu4>D&Jlxn)Kgdajx(7rLFHHKYLNlQxfs$BqwswiEWmZu{oX~j{{;#WC3yRc&VJ!{_ zv`h+9v8L=ze(}z}VAa#-%U4W~()k%rq=pX|-O2JDH}nNh<_KV+ea#!|s1V-c`QF5H z%~)ZPD3j&*yzM@NiQNmkul~-z*r3%29x9Yaf$0*C1+&NQ{e*JX#7u1i=@Qa}?WM|H zF=1J7N$DEjVr{JyxR0;6P!T&UsyYB98A~p7mJz@CzFTSKiBp$(xxdF* z@;y~^7-v$XGhNGu-x}-DCBAa5f=k^(Bxa1p*Y!RJYE*1dE9SEG+OJbgI5go+M+R{F z-60hvDB}s&`{^XHzMHL|(L?v1cklL14!pki&UizKdk)dwE6GCSWpIJV1{(MAD#=c* z%71JgoV(0LwYQ;CG5%D+oG8>$hEknDs}vCYPh0%~u_9uISLaR-I|vyO1>yWz$04i2 zpPkR3sW`4^vf=^0xchvpgO8u~hOT5wBC_FB>X#&b)|z z%c*(7k-Elro1%V*;{-FXb1Zp&CO6HqcnLWmrTTcM)zv3SZ}g2#A4V2QAQ&|I)ZbBD zHFfCj8ukz}X8Kzg#$ZiI17i}v!1>7?9iSj67%j;0&1m^`Ki#*CZcvtgtjR9Q6VcAM zOySL0Q>$K6!&Z%W)`>1uf{ZLgInZ}y6bg4^_+$t=H)%R7m5Vws&M>>N6Tp>ZPk@9S zNM>4GsO@P+vz`x)f6$u}fV~Up2dMcxeoke)=LN7t!w+|v1?&mB9l_VDbf9a9o(~dn zOYp$s$LRcVt1A8Q&m4JWlCZsd9Nw=(x@*aJ_V#}6jsDlijd7i$%Fo(VhktWCt<-#3 z$!5I^wyq?vegG5J*p?(?)wZ&aIE8Z7AhveT$6O1>)VW6*;tZatSFb|imSrXP==^pY z@;WgpiLUl9AC%Ysn}0Te~@KhaSd*tQ&fOn7NcrLlG*Tc(60y~ z7S3rQ207vDo-@=-#^nWy?t?!OOtS6gSUHzbXvvGBCwS{ON={0(A_k6c zLbmYd${({`(YvJld^q=T)V{2*YLL7EK&CtWw=gCGd9->#lHGzLP`-wRbAF0Zet-L4 zl=c8SVO5W>UqPl)suT}o1bCkUn8J7Mo2ZPs06x(_hypggR|bxZ6nO3jdWyJ0VK$pi z`3HFR3cTvy=mi>(K+s7s9D6>)*qr0iEGHHp$niai0V_RD2Qb!5yk}O~VWY4vukO6x zHGoXA3Q&oYr#lt}Ummo;U+2QdKP>eK%52`-sIjA>J2`rT{Jp#Qbd2&eqUvbAG+M!y z>MZkU(2u2P0c&rec3!y=b2b0SY)4|>9sd6A{t|E=2Tg&WhGt(M+r7fi{(g3fxm2W6 zaV8zVC;cc9X}EFNJJVKa8AH+FwQXU1-X2QLMSg@^55dxe`I;|tTkl%D&xAkSotGGV zDgAL~dW>fQxbNf7Z8OJtQ0ykdR>s09_|sBBv$S&30}as?Ok<>%S7ZpE7u#Zgtz2mG zNh@B>;(1)P;?`-QD$pw40j^iL{4b$;)i{%i%PJsg^T<{`Ia&(ULQV2O+IjcYNj)F?fd`wq}2h@K>Gk1&Jn^ zxdUF%5qWtl6@4qAuPbhA9q~r_45o978fNCpRaHrI^PWa8+S{{cak1q#^_+u_CR(@2ZUnTiTAuw!dL1(| zR~e9a{dPK++I^?*GjS_rZ{boW%a!QNHAfuw@GN!uCpf<%?5&7~=$|b65zO1nDPKTL zsDkN8rnN7*;eJx{g7n9Qj~8T2HwS7xmQ1?@-mYri*WYweiA{+#A-cNgUUU|#wtkLa zs};~uVZ-TB_JC?=zK!O?eh=pO$iy>Xr~%H=DXqVuhqgw=u1aNns9^#0*R+Evl9 z%%f3eq$gti#itI{)6UlpM_0GsKDzX({KDVs-#Yb9V4mVY@n zyLdZWBU@!HEB9>QA0(a%qVpRHK;}`FAn2bMw0;)Y_^a0bP*XY^gw9tB_;Q5v7Ggba zBHz=4t>&?TPpN^rOet}2Z8g{~S|n>#WA%ADYgheH@ptWM>|2+nc7g!CU6KSs=ZBar zY(JBK$tclR2f%fmpQ*x8{x)EreN5VbHTeUp((8F>c?}|eIL)SeaQeH>BwpT54pMuctea9WEfd=;?NvmoYt9r5y33evLC3ReW65lT+3!UnQ$# zOU5y@Q~Qjnl>VdFQp;zC)GFfXlBII~>8$BIiqwG1ls>O@1=Bip(q5G>r@JK*wZQ$^ z>eBSm<>kz&p@FJ?=}^fFlhNGo8k7aHah{}v$e5a|{w86|Q~aVu**7xDEgp4!Cik)z z11&!=UMPvFUvnVIfcqbZaJCJD^-|>=(9Xb6r zaTQ=6Y=-TX#B*BL@P(}<-yM*m1AQ!70f1M(X0Sg`UrdcKaV$D(Jd$x(4pC!|%`FBw z5IIfmw{-1Gy4f)^aPv*_IW1q^z=RcMD`nMB5b|lCYgM0I=2FzSeC%^Bb9)|U+ugS` z*#ceP2zn*dkRy$~nQ7NKE#uWykD&2iVV}KedtkylHtoyj`0Q}@utK?MX#Rg3-G@Jw z@BatzGaTnQ*0I--bB?`7cH#`tRgWhNQfu`YOPpPcWsIxgZicxx!DEkmTiOnL#6tS|hiNy*?Fe3_K;dvu}` z&BSN@E=;$&(UHCBv!yl04-+EJVe?|cQZElKS;Hm`MegJX9j139Wx?XbKK;SzFFa&q z4J@r(Tf*mlV}bm@97}su$zv)Fc%q!!s7V2%4C4L})0AyzUk2zn7|1Bf@;7rfgg;eXTLq*aqRohAhK~8g0n!8j!739V z?-dp(w9^R_vc_fH&FhH{L_tJjrd}$iu<>dhqU3Y-|~IU zhT4nKO%%JD%x?5HsN`!O;cO{>!-p&m_EiW_^9?@hs`~xaZ_A4=`0g~X8Ld>EC3SX! z=OGys%?k{ape6&Y=+bpbP#89OTPcvwX%1ax z!ROp`u`%IC;mMjes!BlTn&@s1qMV>~nFq`_gVhB0PB51%e_31m?1Bo`1%0-l4R%)K z6y@Z3iWGNNx2Wz(0WmQRcIQxpp3GBW^>rt?mZrMeC=KPTOFK6|_nx(2`%^T1EYrdV z9EkqplDB2P`h=x1e5E4L@^EJM)vuS0`lBAmyI13o`3H0Q5w;E*$&yF8))5^5LD)bH51g)}7y#Sr_AwRL zq&Qyxrn($)#_0fk`xlHYW7F&#JUHKxrQ81eP2e0%2(`ynYzX03xO(#L-SNA-jOylptwU<58r1H1YjO!%^=iP%Oj&MF__#qDxqU9%rCgg{o?VW#| z=P8%Vqvjprdj3#6WKw=(Kib{qzQ-o))Zgm1829^|+dJ>44M zW=JNI2=ADhx|E{R+g9eMPBqFsYjJpUU-5%7`!YjEuac1C!uD=5eFduWCom(r19aNV z@mCDp2RS~n{88xkujtjt(C_3R;mq5kuch(uYql05dzNn<{1?lvT{BE1EE|;md0orM+S3(DX|W zgA<+(Ed;|T%^b+Ik3BM;1uLg4ZcN^K6SP5&AlI$Zg?!$w1tij(Qrc=+~p!q4`_zu(dl zk3N|s9?mWv{~Aa_O zCet|SG_Gmvhr8IeGp{C}(zpe?`DD8Jk7!++wA?c|niEzax?6_4r6)qaSKB&Ww^c+dtLL=!OC>>F zldW#$>6ft{Svtcf_YttRZs=K7Q+m|-%vC1p{*;k(X=a?koy1s3*`cCShu$XQgjf>g z&J_IKj^q*z8cu>ZMsW6&HW@WjF~l6rppvV%ON_3Z+-Iid2XF|I^XB++E}?4tv=uWM zC4EiMmODIW>$okV;ZG}g+?vdEpXwV|nh&1AUvz#Y>|Hc)kYa$YDbdVSx|8b$1KlN6 zrW~Mr#v#c>i|7Il7l8ilh?H0QdImvFot*s2&-P9zaN#W>U%MP_mpp#4I$!Ln968mp-9lqn-y>B1&t;W-;L)s!F4e zCMU5X^LBdu^6m7Jq`c+#JSAi&G=&hr~M%y|{D<0ml`nPELA>t+Z5 zoMM;W6Th8z53~*>*eCfd-%Ugy;3Nl;THw9s=1cDRkO*0LY>vcLSfnG~}lyvApU2!S!!OVT z4VwgaSj5RpotoklcgR)e0ka8eAU(5aFzF1NfCr*xmA_{8xxkVGx2cAGUo&^Mg5WZ( z`k(Qadnlw7k-tdeX#5U;L85Or*>nAvk?Z2AzKwj`1cfq4zo@C82=UvcP$;qLUjPik zqz21Gih#!`b1h`85pBU#3i(jA22iWUxW!Y{EKMMslv#?Xed3CX( zt$NwyoSifmQD_7Tl7~vWhk>-=T*@HeNAE|IxzLXJT*Wk~3m{q3{(T||5(((9R8_bv zs_l56Cl5JPC0aB~OVh+bqZ!_0(FnlHHTrZXtq>Pk!LKVc%4DHsXp-9`J5c%D3kOnz5kN4f;lhV_K7dVIQ@;i&IRKnnSZq8i&0YhuqqSgj&~3`JJ3F z=x|Z6d{6&R=DYBqjqBqbC1#IH;{~|8W!g=#oQDcSXRlXNJKopb=k*yMAUqwfse_bw z3X~kWUhsZ_$_GK2_L-rnAS(PQB7?UHAkmfwc;|joRRnl_s)M!Swx#gsYBlUjUtZr% zuEarF7T}`L^l=e|Yd-G{2 z5m@L{DX&{AXL!2njc7BE9f)p9irUwJaoX5UYvy8gibr+Dqj_)fh8(kezO&Bh4+o($ z45ofn;M#BQ(oDKc&wL^la*rzMC!|;{lk&iw>c}WhV!1<(G*`n7Ab~F24bx>BKhv)^ z)l==$&oZ>VFG)5cO05Th@B*&E9nj!7=kG5HD1GQtdx={8h11@rbUOg7(1r5x)Ql$f z*ZCYK9Sb$jNgIefsq#6|FFZ85`o%Nsh(GXSA-+t%WMn$*#(VW+p_ZGHY@=DQ!Ru!; zODVFMyfrmz8MJeG^{^(s`Byr{5*v;siYKFJ9inq7)8muex@sEL%y>ph)z-|~7L_F? zlN;~=Fe&ARwvG5=j;iL?ELDG2@UiS7;&V5_@@-E1pPJPp#d^R0#@fh5c#gJ5Jnk^1 z|88&zM=@{hJTbeS63RE7m!I`1sn{vPZ11*O5i4E9I*>>zOhFxFpY?liDdLtlEk!>% zqfn=W=&$rxBU5uOwbFK@#Z=Iv$(wUw>w*a?0Gpdhm;O!)H)uT#%(Deh6{-hAadry?GI6&||KXipBxPz5A# z@%tYy=DkHlk%S_#&}nDPj&_dwfo_z2#`Gko`@vheSh5`Kll;N<@?gls{O2QwboFha z^m2ZSBiIWn$NB^H>#$STHL~pjJ{9xvP+8A{9_467*l#G`NHe-ge%%%tbUo{?C`28V zh3ig>AYRbjg8JBRWEpZ^NA)ToGNG;_8a1scfJ;!b;9u_{Zue3=bvW0yh^5n}ODZ8b zw6rXg1*a9yqXl*V_*-R+ywyjT-a9W}#m0rX)cA-EqM$bRDbpY+x^tpJc3UiOl>LS1W$0mXqIZdKO>sosE{{uf=r{{V7eg zO0@+kA1*2s8QzG$OM8$L1YmQE0%a=P>4OyX&A5Zku-)7Syc}_mV4rqJO85o;g6Z&O|Lkq z8q>P}pyUgqk};4L(IQPxPG7{(1C7k)YVMySW0q~q+`*&*(=>Vgta^CMSZ8ajN1=UK z#21B-Bn{{kTcIhkzOAEpP^Vbwia@KCsE!&a`(`0ga9}`TFbhDMQ(V^y*#&+FXO6SUi>-+Z@z|7!V+317pt z!+cyNSg0mpjl*f69K2NH5wBd;w_L{x(pX%^WBE<4?EOs)=d?B~d~Pzjs^D%=_3Z{& zqt(2w%2x$>bw)0mA;;_w40`Y2w#fHMC->b z#oW^0O*1|Xxj{|xL_NrL;2yTi4j21^zVQC^XrN=wwQ

$_l@dCBQ$#$&EQV)tFo1 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%0D_YyUHu=L}OL2gMeLe~f-`##E3Cktcv7n}JCZ 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/ehcache.xml b/src/main/resources/ehcache.xml index dc535d7..8a2f0ee 100644 --- a/src/main/resources/ehcache.xml +++ b/src/main/resources/ehcache.xml @@ -15,8 +15,8 @@ From 3460f7e7f9f2f81eaead82d489b326325807c029 Mon Sep 17 00:00:00 2001 From: dengyuhan <464958567@qq.com> Date: Fri, 9 Mar 2018 17:00:29 +0800 Subject: [PATCH 05/10] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 756bb65..fcc1381 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # magnetW ## Demo -####[直接体验](http://bt.xiandan.in) +#### [直接体验](http://bt.xiandan.in) ## 截屏 ![](screenshots.gif) @@ -10,4 +10,4 @@ #### Mac版:[magnetX](https://github.com/youusername/magnetX) ## 免责声明 -#### 仅用于技术交流学习,禁止商用,对此工具的非法使用概不负责。 \ No newline at end of file +#### 仅用于技术交流学习,禁止商用,对此工具的非法使用概不负责。 From 5d2a32751af6520a6ad113ab4ccc2e56780feb81 Mon Sep 17 00:00:00 2001 From: dengyuhan <464958567@qq.com> Date: Fri, 9 Mar 2018 17:01:26 +0800 Subject: [PATCH 06/10] Update README.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index fcc1381..f5c4516 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ -# magnetW - ## Demo #### [直接体验](http://bt.xiandan.in) From 6e6d3122eb7e04e3e4037d73f188553308103d30 Mon Sep 17 00:00:00 2001 From: dengyuhan <464958567@qq.com> Date: Fri, 9 Mar 2018 17:04:22 +0800 Subject: [PATCH 07/10] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index f5c4516..7b3cb43 100644 --- a/README.md +++ b/README.md @@ -7,5 +7,9 @@ ## 其它版本 #### Mac版:[magnetX](https://github.com/youusername/magnetX) +## 快速搭建 +#### 进入[releases](https://github.com/dengyuhan/magnetW/releases)下载编译好的war包,发布到tomcat即可 + + ## 免责声明 #### 仅用于技术交流学习,禁止商用,对此工具的非法使用概不负责。 From 5b924c6b6bde10174bc44ee0920a754b46f9f28e Mon Sep 17 00:00:00 2001 From: dengyuhan <464958567@qq.com> Date: Fri, 9 Mar 2018 17:05:04 +0800 Subject: [PATCH 08/10] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../magnetw/WEB-INF/classes/ehcache.xml | 44 --------- .../magnetw/WEB-INF/classes/rule.json | 95 ------------------- 2 files changed, 139 deletions(-) delete mode 100644 out/artifacts/magnetw/WEB-INF/classes/ehcache.xml delete mode 100644 out/artifacts/magnetw/WEB-INF/classes/rule.json diff --git a/out/artifacts/magnetw/WEB-INF/classes/ehcache.xml b/out/artifacts/magnetw/WEB-INF/classes/ehcache.xml deleted file mode 100644 index b04d194..0000000 --- a/out/artifacts/magnetw/WEB-INF/classes/ehcache.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/out/artifacts/magnetw/WEB-INF/classes/rule.json b/out/artifacts/magnetw/WEB-INF/classes/rule.json deleted file mode 100644 index 6d8ebe7..0000000 --- a/out/artifacts/magnetw/WEB-INF/classes/rule.json +++ /dev/null @@ -1,95 +0,0 @@ - [ - { - "site":"AOYOSO", - "waiting":"0", - "group":"//div[@class='col-md-8']//div[@class='panel panel-default']", - "magnet":".//a//@href", - "name":".//a", - "size":".//table//tr//td[2]", - "count":".//table//tr//td[1]", - "source":"http://www.aoyoso.com/search/XXX_ctime_PPP.html" - }, - { - "site":"磁力吧", - "waiting":"0", - "group":"//div[@class='search-item']", - "magnet":".//a//@href", - "name":".//a", - "size":".//span[3]//b", - "count":".//span[2]//b", - "source":"http://www.ciliba.org/s/XXX_rel_PPP.html" - }, - { - "site":"种子搜", - "waiting":"0", - "group":"//table[@class='table table-bordered table-striped']", - "magnet":".//a//@href", - "name":".//tbody//a", - "size":".//tbody//tr//td[2]//strong", - "count":".//tbody//tr//td[1]//strong", - "source":"http://www.zhongziso.com/list/XXX/PPP" - }, - { - "site":"SOBT", - "waiting":"0", - "group":"//div[@class='search-list col-md-8']//div[@class='search-item']", - "magnet":".//a//@href", - "name":".//a[@target='_blank']", - "size":".//div[@class='item-bar']//span[2]//b", - "count":".//div[@class='item-bar']//span[1]//b", - "source":"http://www.sobt5.org/q/XXX_PPP.html" - }, - { - "site":"BT岛", - "waiting":"0", - "group":"//ul[@class='mlist']//li", - "magnet":".//a//@href", - "name":".//a[@target='_blank']", - "size":".//dt//span[1]", - "count":".//dt//span[2]", - "source":"http://www.btdao5.com/list/XXX-s1d-PPP.html" - }, - { - "site":"bt177", - "waiting":"0", - "group":"//li", - "magnet":".//a//@href", - "name":".//a", - "size":".//span[1]", - "count":".//span[2]", - "source":"http://www.bt177.net/word/XXX_PPP.html" - }, - { - "site":"zhongzidi", - "waiting":"0", - "group":"//div[@class='panel-body']//ul", - "magnet":".//dl[2]/a[1]//@href", - "name":".//a", - "size":".//dl[1]/dd[2]", - "count":".//dl[1]/dd[3]", - "source":"https://m.zhongzidi.com/list/XXX/PPP" - - }, - { - "site":"cililiana", - "waiting":"0", - "group":"//ul[@class='mlist']//li", - "magnet":".//div[2]/a[1]//@href", - "name":".//div[1]/a", - "size":".//dl/dt/span[1]", - "count":".//dl/dt/span[3]", - "source":"http://cililiana.com/list/XXX/PPP.html" - - }, - { - "site":"屌丝搜", - "waiting":"0", - "group":"//ul[@class='mlist']//li", - "magnet":".//div[2]/a[1]//@href", - "name":".//div[1]/a", - "size":".//dl/dt/span[1]", - "count":".//dl/dt/span[3]", - "source":"http://www.diaosisou.org/list/XXX/PPP" - - } - ] From 2622cec420827cdb9924779eabdcd20e88c896cb Mon Sep 17 00:00:00 2001 From: dengyuhan <464958567@qq.com> Date: Fri, 9 Mar 2018 19:06:38 +0800 Subject: [PATCH 09/10] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=8B=E9=A1=BA?= =?UTF-8?q?=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/rule.json | 151 +++++++++++++++++------------------ 1 file changed, 74 insertions(+), 77 deletions(-) diff --git a/src/main/resources/rule.json b/src/main/resources/rule.json index 6d8ebe7..775af91 100644 --- a/src/main/resources/rule.json +++ b/src/main/resources/rule.json @@ -1,95 +1,92 @@ - [ +[ { - "site":"AOYOSO", - "waiting":"0", - "group":"//div[@class='col-md-8']//div[@class='panel panel-default']", - "magnet":".//a//@href", - "name":".//a", - "size":".//table//tr//td[2]", - "count":".//table//tr//td[1]", - "source":"http://www.aoyoso.com/search/XXX_ctime_PPP.html" + "site": "种子搜", + "waiting": "0", + "group": "//table[@class='table table-bordered table-striped']", + "magnet": ".//a//@href", + "name": ".//tbody//a", + "size": ".//tbody//tr//td[2]//strong", + "count": ".//tbody//tr//td[1]//strong", + "source": "http://www.zhongziso.com/list/XXX/PPP" }, { - "site":"磁力吧", - "waiting":"0", - "group":"//div[@class='search-item']", - "magnet":".//a//@href", - "name":".//a", - "size":".//span[3]//b", - "count":".//span[2]//b", - "source":"http://www.ciliba.org/s/XXX_rel_PPP.html" + "site": "磁力吧", + "waiting": "0", + "group": "//div[@class='search-item']", + "magnet": ".//a//@href", + "name": ".//a", + "size": ".//span[3]//b", + "count": ".//span[2]//b", + "source": "http://www.ciliba.org/s/XXX_rel_PPP.html" }, { - "site":"种子搜", - "waiting":"0", - "group":"//table[@class='table table-bordered table-striped']", - "magnet":".//a//@href", - "name":".//tbody//a", - "size":".//tbody//tr//td[2]//strong", - "count":".//tbody//tr//td[1]//strong", - "source":"http://www.zhongziso.com/list/XXX/PPP" + "site": "AOYOSO", + "waiting": "0", + "group": "//div[@class='col-md-8']//div[@class='panel panel-default']", + "magnet": ".//a//@href", + "name": ".//a", + "size": ".//table//tr//td[2]", + "count": ".//table//tr//td[1]", + "source": "http://www.aoyoso.com/search/XXX_ctime_PPP.html" }, { - "site":"SOBT", - "waiting":"0", - "group":"//div[@class='search-list col-md-8']//div[@class='search-item']", - "magnet":".//a//@href", - "name":".//a[@target='_blank']", - "size":".//div[@class='item-bar']//span[2]//b", - "count":".//div[@class='item-bar']//span[1]//b", - "source":"http://www.sobt5.org/q/XXX_PPP.html" + "site": "SOBT", + "waiting": "0", + "group": "//div[@class='search-list col-md-8']//div[@class='search-item']", + "magnet": ".//a//@href", + "name": ".//a[@target='_blank']", + "size": ".//div[@class='item-bar']//span[2]//b", + "count": ".//div[@class='item-bar']//span[1]//b", + "source": "http://www.sobt5.org/q/XXX_PPP.html" }, { - "site":"BT岛", - "waiting":"0", - "group":"//ul[@class='mlist']//li", - "magnet":".//a//@href", - "name":".//a[@target='_blank']", - "size":".//dt//span[1]", - "count":".//dt//span[2]", - "source":"http://www.btdao5.com/list/XXX-s1d-PPP.html" + "site": "BT岛", + "waiting": "0", + "group": "//ul[@class='mlist']//li", + "magnet": ".//a//@href", + "name": ".//a[@target='_blank']", + "size": ".//dt//span[1]", + "count": ".//dt//span[2]", + "source": "http://www.btdao5.com/list/XXX-s1d-PPP.html" }, { - "site":"bt177", - "waiting":"0", - "group":"//li", - "magnet":".//a//@href", - "name":".//a", - "size":".//span[1]", - "count":".//span[2]", - "source":"http://www.bt177.net/word/XXX_PPP.html" + "site": "bt177", + "waiting": "0", + "group": "//li", + "magnet": ".//a//@href", + "name": ".//a", + "size": ".//span[1]", + "count": ".//span[2]", + "source": "http://www.bt177.net/word/XXX_PPP.html" }, { - "site":"zhongzidi", - "waiting":"0", - "group":"//div[@class='panel-body']//ul", - "magnet":".//dl[2]/a[1]//@href", - "name":".//a", - "size":".//dl[1]/dd[2]", - "count":".//dl[1]/dd[3]", - "source":"https://m.zhongzidi.com/list/XXX/PPP" - + "site": "zhongzidi", + "waiting": "0", + "group": "//div[@class='panel-body']//ul", + "magnet": ".//dl[2]/a[1]//@href", + "name": ".//a", + "size": ".//dl[1]/dd[2]", + "count": ".//dl[1]/dd[3]", + "source": "https://m.zhongzidi.com/list/XXX/PPP" }, { - "site":"cililiana", - "waiting":"0", - "group":"//ul[@class='mlist']//li", - "magnet":".//div[2]/a[1]//@href", - "name":".//div[1]/a", - "size":".//dl/dt/span[1]", - "count":".//dl/dt/span[3]", - "source":"http://cililiana.com/list/XXX/PPP.html" - + "site": "cililiana", + "waiting": "0", + "group": "//ul[@class='mlist']//li", + "magnet": ".//div[2]/a[1]//@href", + "name": ".//div[1]/a", + "size": ".//dl/dt/span[1]", + "count": ".//dl/dt/span[3]", + "source": "http://cililiana.com/list/XXX/PPP.html" }, { - "site":"屌丝搜", - "waiting":"0", - "group":"//ul[@class='mlist']//li", - "magnet":".//div[2]/a[1]//@href", - "name":".//div[1]/a", - "size":".//dl/dt/span[1]", - "count":".//dl/dt/span[3]", - "source":"http://www.diaosisou.org/list/XXX/PPP" - + "site": "屌丝搜", + "waiting": "0", + "group": "//ul[@class='mlist']//li", + "magnet": ".//div[2]/a[1]//@href", + "name": ".//div[1]/a", + "size": ".//dl/dt/span[1]", + "count": ".//dl/dt/span[3]", + "source": "http://www.diaosisou.org/list/XXX/PPP" } - ] +] From 7df307865622d1758872bda69dbeda57dc12f60a Mon Sep 17 00:00:00 2001 From: dengyuhan <464958567@qq.com> Date: Fri, 16 Mar 2018 16:43:53 +0800 Subject: [PATCH 10/10] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=A4=B1=E6=95=88?= =?UTF-8?q?=E5=8F=8D=E9=A6=88=E7=9A=84=E8=B6=85=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 9 +++- .../magnetw/controller/BaseController.java | 12 +++++ .../magnetw/controller/MagnetWController.java | 4 +- .../magnetw/service/MagnetWService.java | 1 - src/main/webapp/WEB-INF/log4j.properties | 32 ++++++++++++ .../webapp/WEB-INF/views/search_result.jsp | 4 +- src/main/webapp/WEB-INF/web.xml | 52 ++++++++----------- 7 files changed, 80 insertions(+), 34 deletions(-) create mode 100644 src/main/webapp/WEB-INF/log4j.properties diff --git a/pom.xml b/pom.xml index 4e852fb..91d21a6 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.dyhdyh magnetw war - 1.0.0 + 1.0.1 magnetW http://maven.apache.org @@ -34,6 +34,12 @@ jstl-api 1.2 + + log4j + log4j + 1.2.17 + + javax.el @@ -64,6 +70,7 @@ 4.3.1.RELEASE + net.sf.ehcache diff --git a/src/main/java/com/dyhdyh/magnetw/controller/BaseController.java b/src/main/java/com/dyhdyh/magnetw/controller/BaseController.java index 5c981d8..ebeb945 100644 --- a/src/main/java/com/dyhdyh/magnetw/controller/BaseController.java +++ b/src/main/java/com/dyhdyh/magnetw/controller/BaseController.java @@ -1,15 +1,27 @@ package com.dyhdyh.magnetw.controller; +import org.apache.log4j.Logger; import org.springframework.ui.Model; import org.springframework.util.StringUtils; import java.net.SocketTimeoutException; +import java.net.URLDecoder; + +import javax.servlet.http.HttpServletRequest; /** * author dengyuhan * created 2018/3/7 14:19 */ public class BaseController { + private Logger logger = Logger.getLogger(getClass()); + + protected void logger(HttpServletRequest request) { + String queryString = request.getQueryString(); + if (!StringUtils.isEmpty(queryString)) { + logger.info(request.getRequestURL() + "?" + URLDecoder.decode(queryString)); + } + } protected String error(Model model, Throwable e) { return error(model, null, e); diff --git a/src/main/java/com/dyhdyh/magnetw/controller/MagnetWController.java b/src/main/java/com/dyhdyh/magnetw/controller/MagnetWController.java index 7a19ff3..1e45a69 100644 --- a/src/main/java/com/dyhdyh/magnetw/controller/MagnetWController.java +++ b/src/main/java/com/dyhdyh/magnetw/controller/MagnetWController.java @@ -49,7 +49,8 @@ public class MagnetWController extends BaseController { * @return */ @RequestMapping(value = {"/", "search"}, method = RequestMethod.GET) - public String submitSearchMagnet(Model model, @RequestParam(required = false) String site, @RequestParam(required = false) String keyword, @RequestParam(required = false) Integer page) { + public String submitSearchMagnet(Model model, HttpServletRequest request, @RequestParam(required = false) String site, @RequestParam(required = false) String keyword, @RequestParam(required = false) Integer page) { + logger(request); try { List siteNames = getSiteNames(); if (StringUtils.isEmpty(site)) { @@ -78,6 +79,7 @@ public String submitSearchMagnet(Model model, @RequestParam(required = false) St @RequestMapping(value = "search-json", method = {RequestMethod.GET, RequestMethod.POST}) @ResponseBody public List submitSearchMagnetJson(Model model, HttpServletRequest request, @RequestParam(required = false) String site, @RequestParam(required = false) String keyword, @RequestParam(required = false) Integer page) { + logger(request); try { List siteNames = getSiteNames(); if (StringUtils.isEmpty(site)) { diff --git a/src/main/java/com/dyhdyh/magnetw/service/MagnetWService.java b/src/main/java/com/dyhdyh/magnetw/service/MagnetWService.java index 972b396..68cd82c 100644 --- a/src/main/java/com/dyhdyh/magnetw/service/MagnetWService.java +++ b/src/main/java/com/dyhdyh/magnetw/service/MagnetWService.java @@ -101,7 +101,6 @@ private String transformMagnet(String url) { if (matches) { return url; } else { - System.out.println(url); String newMagnet; try { StringBuffer sb = new StringBuffer(url); diff --git a/src/main/webapp/WEB-INF/log4j.properties b/src/main/webapp/WEB-INF/log4j.properties new file mode 100644 index 0000000..8e5d393 --- /dev/null +++ b/src/main/webapp/WEB-INF/log4j.properties @@ -0,0 +1,32 @@ +name=magnetw +log_path = ${catalina.home}/logs/${name} +time = %d{yyyy-MM-dd HH:mm:ss:SSS} + +log4j.rootLogger = INFO, console,D,E + +# Disable other log +log4j.logger.org.springframework=OFF +log4j.logger.org.apache.struts2=OFF +log4j.logger.com.opensymphony.xwork2=OFF +log4j.logger.com.ibatis=OFF +log4j.logger.org.hibernate=OFF +log4j.logger.com.cloopen.rest=OFF + +log4j.appender.console = org.apache.log4j.ConsoleAppender +log4j.appender.console.Target = System.out +log4j.appender.console.layout = org.apache.log4j.PatternLayout +log4j.appender.console.layout.ConversionPattern =[%-5p]----[${time}]----[%l]%n%m%n%n + +log4j.appender.D = org.apache.log4j.DailyRollingFileAppender +log4j.appender.D.File = ${log_path}/${name}.log +log4j.appender.D.Append = true +log4j.appender.D.Threshold = INFO +log4j.appender.D.layout = org.apache.log4j.PatternLayout +log4j.appender.D.layout.ConversionPattern =[%-5p]----[${time}]----[%l]----%m%n + +log4j.appender.E = org.apache.log4j.DailyRollingFileAppender +log4j.appender.E.File =${log_path}/${name}.error.log +log4j.appender.E.Append = true +log4j.appender.E.Threshold = ERROR +log4j.appender.E.layout = org.apache.log4j.PatternLayout +log4j.appender.E.layout.ConversionPattern =[%-5p]----[${time}]----[%l]----%m%n \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/search_result.jsp b/src/main/webapp/WEB-INF/views/search_result.jsp index 9be46d1..7318a75 100644 --- a/src/main/webapp/WEB-INF/views/search_result.jsp +++ b/src/main/webapp/WEB-INF/views/search_result.jsp @@ -13,7 +13,7 @@ <%----%> - ${keyword} + 磁力搜 - ${keyword} @@ -85,7 +85,7 @@

diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 345591b..56dc35a 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -3,35 +3,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> - - contextConfigLocation @@ -54,6 +25,29 @@ search + + + log4jConfigLocation + /WEB-INF/log4j.properties + + + + + log4jRefreshInterval + 10000 + + + + + org.springframework.web.util.Log4jConfigListener + + + + + webAppRootKey + magnetw + + characterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter