上传文件至「xbpq」
This commit is contained in:
+224
@@ -0,0 +1,224 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import base64, html, json, re
|
||||
from urllib.parse import quote, unquote
|
||||
import requests
|
||||
from lxml import etree
|
||||
try:
|
||||
from Crypto.Cipher import AES
|
||||
except Exception:
|
||||
AES = None
|
||||
try:
|
||||
from base.spider import Spider as BaseSpider
|
||||
except Exception:
|
||||
BaseSpider = object
|
||||
|
||||
class Spider(BaseSpider):
|
||||
def getName(self): return "黑料不打烊"
|
||||
def init(self, extend=""):
|
||||
self.host = "https://badly.okttbipbu.cc"
|
||||
self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0 Safari/537.36", "Referer": self.host + "/", "Accept": "*/*", "Accept-Language": "zh-CN,zh;q=0.9"}
|
||||
self.session = requests.Session()
|
||||
self.session.headers.update(self.headers)
|
||||
self.last_error = ""
|
||||
self.categories = [{"type_id": "/", "type_name": "首页"}, {"type_id": "/category/24hcg/", "type_name": "今日看料"}, {"type_id": "/category/rgtj/", "type_name": "热门吃瓜"}, {"type_id": "/category/mrrg/", "type_name": "每日热瓜"}, {"type_id": "/category/hlda/", "type_name": "黑料大事"}, {"type_id": "/category/whhl/", "type_name": "网红吃瓜"}, {"type_id": "/category/mxbg/", "type_name": "明星吃瓜"}, {"type_id": "/category/fcns/", "type_name": "反差女神"}, {"type_id": "/category/xyrg/", "type_name": "学院热瓜"}, {"type_id": "/category/mrds/", "type_name": "每日大赛"}, {"type_id": "/category/swdj/", "type_name": "AI短剧"}, {"type_id": "/category/lydt/", "type_name": "撸友看片"}, {"type_id": "/category/avjs/", "type_name": "AV解说"}, {"type_id": "/category/mrst/", "type_name": "禁播动漫"}, {"type_id": "/category/pmv/", "type_name": "PMV混剪"}]
|
||||
def _client(self): return getattr(self, "session", requests)
|
||||
def _error(self, msg):
|
||||
self.last_error = msg
|
||||
try: self.log(msg)
|
||||
except Exception: pass
|
||||
def _get(self, url):
|
||||
try:
|
||||
client = self._client()
|
||||
r = client.get(url, headers=self.headers, timeout=25, verify=False, allow_redirects=True)
|
||||
if (r.status_code != 200 or not (r.text or "").strip()) and url.rstrip("/") != self.host:
|
||||
client.get(self.host + "/", headers=self.headers, timeout=25, verify=False, allow_redirects=True)
|
||||
r = client.get(url, headers=self.headers, timeout=25, verify=False, allow_redirects=True)
|
||||
if r.status_code != 200:
|
||||
self._error(f"GET {url} status={r.status_code} body={(r.text or '')[:120]}")
|
||||
return ""
|
||||
text = r.content.decode("utf-8", errors="ignore")
|
||||
if not (text or "").strip(): self._error(f"GET {url} empty body")
|
||||
return text
|
||||
except Exception as e:
|
||||
self._error(f"GET {url} error={type(e).__name__}: {e}")
|
||||
return ""
|
||||
def _fix(self, u):
|
||||
if not u: return ""
|
||||
u = html.unescape(u.strip())
|
||||
return "https:" + u if u.startswith("//") else self.host + u if u.startswith("/") else u
|
||||
def _clean(self, s): return re.sub(r"\s+", " ", html.unescape(s or "")).strip()
|
||||
def _player_header(self): return self.headers
|
||||
def _html(self, text):
|
||||
if isinstance(text, bytes): text = text.decode("utf-8", errors="ignore")
|
||||
return etree.HTML((text or "").replace("\x00", "").encode("utf-8", errors="ignore"))
|
||||
def _ids(self, ids): return ids if isinstance(ids, (list, tuple)) else [ids] if ids else []
|
||||
def _detail_url(self, sid):
|
||||
sid = str(sid or "").strip()
|
||||
if sid.startswith("http"): return self._fix(sid)
|
||||
m = re.search(r"(?:archives/)?(\d{3,})(?:\.html)?", sid)
|
||||
if m: return f"{self.host}/archives/{m.group(1)}.html"
|
||||
return self._fix(sid)
|
||||
def _is_encrypted_img(self, u): return any(x in (u or "") for x in ["/xiao/", "/upload_01/xiao/", "/upload/upload/xiao/"])
|
||||
def _is_cdn_img(self, u): return any(x in (u or "") for x in ["/xiao/", "/usr/", "/upload_01/", "/uploads/", "/upload/upload/"])
|
||||
def _proxy_base(self):
|
||||
try:
|
||||
f = getattr(self, "getProxyUrl", None)
|
||||
return f() if callable(f) else ""
|
||||
except Exception:
|
||||
return ""
|
||||
def _proxy_img_url(self, base, url):
|
||||
sep = "" if base.endswith(("?", "&")) else "&" if "?" in base else "?"
|
||||
return base + sep + "type=img&url=" + quote(url, safe="")
|
||||
def _mime_from_bytes(self, data, ext="jpeg"):
|
||||
if data.startswith(b"\xff\xd8\xff"): return "jpeg"
|
||||
if data.startswith(b"\x89PNG\r\n\x1a\n"): return "png"
|
||||
if data.startswith(b"GIF87a") or data.startswith(b"GIF89a"): return "gif"
|
||||
if data[:4] == b"RIFF" and data[8:12] == b"WEBP": return "webp"
|
||||
return "jpeg" if ext in ["jpg", "jpeg"] else ext if ext in ["png", "gif", "webp"] else "jpeg"
|
||||
def _decrypt_image_bytes(self, data):
|
||||
if not AES: return ""
|
||||
try:
|
||||
raw = AES.new(b"f5d965df75336270", AES.MODE_CBC, b"97b60394abc2fbe1").decrypt(base64.b64decode(data))
|
||||
pad = raw[-1] if raw else 0
|
||||
return raw[:-pad] if 0 < pad <= 16 and raw.endswith(bytes([pad]) * pad) else raw
|
||||
except Exception:
|
||||
return b""
|
||||
def _image_data_url(self, url):
|
||||
try:
|
||||
data, mime = self._image_bytes(url)
|
||||
return f"data:image/{mime};base64,{base64.b64encode(data).decode()}" if data else url
|
||||
except Exception:
|
||||
return url
|
||||
def _image_bytes(self, url):
|
||||
url = unquote(url)
|
||||
ext = (url.split("?")[0].rsplit(".", 1)[-1] or "jpeg").lower()
|
||||
r = self._client().get(url, headers=self.headers, timeout=25, verify=False, allow_redirects=True)
|
||||
if self._is_encrypted_img(url):
|
||||
raw = self._decrypt_image_bytes(base64.b64encode(r.content).decode())
|
||||
if raw: return raw, self._mime_from_bytes(raw, ext)
|
||||
ctype = (r.headers.get("Content-Type") or "").split(";")[0].lower()
|
||||
mime = ctype.split("/", 1)[1] if ctype.startswith("image/") else self._mime_from_bytes(r.content, ext)
|
||||
return r.content, mime
|
||||
def _pic_url(self, url):
|
||||
base = self._proxy_base()
|
||||
if base: return self._proxy_img_url(base, url)
|
||||
if url.startswith("data:"): return url
|
||||
return self._image_data_url(url) if self._is_encrypted_img(url) else url
|
||||
def _cover_url(self, url):
|
||||
url = self._fix(url)
|
||||
base = self._proxy_base()
|
||||
return self._proxy_img_url(base, url) if base and self._is_encrypted_img(url) else url
|
||||
def proxy(self, params):
|
||||
url = params.get("url") or params.get("img") or ""
|
||||
if isinstance(url, list): url = url[0] if url else ""
|
||||
try:
|
||||
data, mime = self._image_bytes(url)
|
||||
return [200, "image/" + mime, data]
|
||||
except Exception:
|
||||
return [404, "text/plain", ""]
|
||||
def localProxy(self, params): return self.proxy(params)
|
||||
def _page_url(self, tid, pg):
|
||||
pg = int(pg or 1)
|
||||
path = tid or "/"
|
||||
if path.startswith("http"): base = path.rstrip("/") + "/"
|
||||
else: base = self.host + (path if path.startswith("/") else "/" + path)
|
||||
base = base.rstrip("/") + "/"
|
||||
if pg <= 1: return base
|
||||
return base + f"page/{pg}/" if path.strip("/") == "" else base + f"{pg}/"
|
||||
def _parse_list(self, html_text):
|
||||
if not html_text: return []
|
||||
tree = self._html(html_text)
|
||||
if tree is None: return []
|
||||
result, seen = [], set()
|
||||
items = tree.xpath('//div[@id="index" or @id="archive"]//article[.//a[contains(@href,"/archives/")]]') or tree.xpath('//article[.//a[contains(@href,"/archives/")]]')
|
||||
for item in items:
|
||||
if self._is_ad_item(item): continue
|
||||
href = "".join(item.xpath('.//a[contains(@href,"/archives/")]/@href')).strip()
|
||||
m = re.search(r"/archives/(\d+)\.html", href)
|
||||
if not m or m.group(1) in seen: continue
|
||||
seen.add(m.group(1))
|
||||
title = self._clean(" ".join(item.xpath('.//*[contains(@class,"post-card-bottom-text")]//text()')) or " ".join(item.xpath('.//h2//text()')) or "".join(item.xpath('.//a[contains(@href,"/archives/")]/@title')))
|
||||
pics = item.xpath('.//meta[@itemprop="image" or @itemprop="thumbnailUrl"]/@content') or item.xpath('.//img/@z-image-loader-url') or item.xpath('.//img/@data-xkrkllgl') or item.xpath('.//img/@data-src') or item.xpath('.//img/@src')
|
||||
pic = pics[0] if pics else ""
|
||||
result.append({"vod_id": self._fix(href), "vod_name": title or m.group(1), "vod_pic": self._cover_url(pic)})
|
||||
return result
|
||||
def _content_node(self, tree):
|
||||
nodes = tree.xpath('//div[contains(concat(" ",normalize-space(@class)," ")," post-content ")]')
|
||||
return nodes[0] if nodes else tree
|
||||
def _is_ad_item(self, item):
|
||||
return bool(item.xpath('.//a[contains(concat(" ",normalize-space(@rel)," ")," sponsored ") or @data-event="ad_click" or @data-ad_slot_key or @data-ad_id]'))
|
||||
def _parse_videos(self, node):
|
||||
videos, seen = [], set()
|
||||
for d in node.xpath('.//div[contains(@class,"dplayer") and @data-config]'):
|
||||
title = f"视频{len(videos)+1}"
|
||||
conf = html.unescape(d.get("data-config") or "")
|
||||
url = ""
|
||||
try: url = ((json.loads(conf).get("video") or {}).get("url") or "").replace("\\/", "/")
|
||||
except Exception:
|
||||
m = re.search(r'"video"\s*:\s*\{.*?"url"\s*:\s*"([^"]+)"', conf)
|
||||
url = m.group(1).replace("\\/", "/") if m else ""
|
||||
if url and url not in seen:
|
||||
seen.add(url)
|
||||
videos.append((title, self._fix(url)))
|
||||
return videos
|
||||
def _parse_images(self, node):
|
||||
imgs, seen = [], set()
|
||||
for img in node.xpath('.//img'):
|
||||
src = img.get("z-image-loader-url") or img.get("data-xkrkllgl") or img.get("data-original") or img.get("data-src") or img.get("data-lazyload") or img.get("data-lazy-src") or img.get("src") or ""
|
||||
src = self._fix(src)
|
||||
if not src or src in seen or "/usr/themes/" in src or "/usr/plugins/" in src or "/uploads/default/other/" in src: continue
|
||||
seen.add(src)
|
||||
imgs.append(src)
|
||||
return imgs
|
||||
def homeContent(self, filter):
|
||||
return {"class": self.categories, "list": self._parse_list(self._get(self.host + "/")), "filters": {}}
|
||||
def categoryContent(self, tid, pg, filter, extend):
|
||||
items = self._parse_list(self._get(self._page_url(tid, pg)))
|
||||
total = 9990 if items else 0
|
||||
return {"page": int(pg), "pagecount": 999 if items else int(pg), "limit": 10, "total": total, "count": total, "list": items}
|
||||
def detailContent(self, ids):
|
||||
self.last_error = ""
|
||||
result = {"list": []}
|
||||
for sid in self._ids(ids):
|
||||
try:
|
||||
url = self._detail_url(sid)
|
||||
html_text = self._get(url)
|
||||
if not html_text:
|
||||
if not self.last_error: self._error(f"detail {url} empty html")
|
||||
continue
|
||||
tree = self._html(html_text)
|
||||
if tree is None:
|
||||
self._error(f"detail {url} etree none body={html_text[:120]}")
|
||||
continue
|
||||
node = self._content_node(tree)
|
||||
name = self._clean("".join(tree.xpath('//meta[@property="og:title"]/@content')) or "".join(tree.xpath('//h1/text()')) or "".join(tree.xpath('//title/text()')))
|
||||
videos, imgs = self._parse_videos(node), self._parse_images(node)
|
||||
pic = self._cover_url(imgs[0] if imgs else "".join(tree.xpath('//meta[@property="og:image"]/@content')))
|
||||
text = self._clean(" ".join(node.xpath('.//p[not(ancestor::*[contains(@class,"article-ads-btn")])]/text()')))[:800]
|
||||
names, plays = [], []
|
||||
if videos:
|
||||
names.append("视频")
|
||||
plays.append("#".join(f"{t}${u}" for t, u in videos))
|
||||
if imgs:
|
||||
names.append("图集")
|
||||
plays.append("全部$pics://" + "&&".join(imgs))
|
||||
if text:
|
||||
names.append("正文")
|
||||
plays.append("正文$text://" + text)
|
||||
result["list"].append({"vod_id": url, "vod_name": name, "vod_pic": pic, "vod_content": text, "vod_play_from": "$$$".join(names), "vod_play_url": "$$$".join(plays)})
|
||||
except Exception as e:
|
||||
self._error(f"detail sid={sid} error={type(e).__name__}: {e}")
|
||||
continue
|
||||
return result if result["list"] else {"list": [], "msg": self.last_error or "detail empty"}
|
||||
def searchContent(self, key, quick, pg="1"):
|
||||
url = self.host + "/search/" + quote(key) + "/" + (f"page/{pg}/" if int(pg or 1) > 1 else "")
|
||||
return {"list": self._parse_list(self._get(url)), "page": int(pg)}
|
||||
def playerContent(self, flag, id, vipFlags):
|
||||
if id.startswith("pics://"):
|
||||
return {"parse": 0, "url": "pics://" + "&&".join(self._pic_url(u) for u in id[7:].split("&&") if u), "header": self._player_header()}
|
||||
if id.startswith("text://"): return {"parse": 0, "url": id, "header": self._player_header()}
|
||||
url = self._fix(id)
|
||||
lower = url.lower()
|
||||
result = {"parse": 0 if any(x in lower for x in [".m3u8", ".mp4", ".flv"]) else 1, "url": url, "header": self._player_header()}
|
||||
if ".m3u8" in lower: result["format"] = "application/x-mpegURL"
|
||||
return result
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"请求头": "User-Agent$MOBILE_UA",
|
||||
"编码": "UTF-8",
|
||||
"数组": "pornkvideos&&</div></a>",
|
||||
"图片": "data-src=\"&&\"",
|
||||
"标题": "<h2&&</h2>",
|
||||
"链接": "href=\"&&\"[替换:voddetail>>vodplay#.html>>-1-1.html]",
|
||||
"嗅探词": ".mp4#.m3u8",
|
||||
"搜索模式": "1",
|
||||
"搜索url": "https://yjewvzfn.shewo22.cc/vodsearch/{wd}----------{pg}---.html",
|
||||
"分类url": "https://yjewvzfn.shewo22.cc/vodtype/{cateId}-{catePg}.html;;z",
|
||||
"分类": "国产精品$55#华语精品$63#黑料吃瓜$58#欧美大屌$60#动漫禁漫$57#学生合集$65#乱伦精品$64#探花约炮$61#日本无码$86#日本有码$80#主播网红$81#国产色情$12#日本无码$20#自拍偷拍$21#人妻熟女$22#黑人洋屌$23#欧美精品$24#卡通动漫$69#乱伦中出$70#传媒原创$71#口爆颜射$72#岛国女优$25#萝莉少女$26#重口调教$88#国产直播$56#岛国群交$73#日本有码$74#中文字幕$75#吃瓜爆料$76#角色扮演$77#淫娃自慰$78#韩国直播$84#公开漏出$85#户外打野$89#"
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"作者":"h",
|
||||
"站名":"猫娘动漫",
|
||||
"请求头":"User-Agent@Mozilla/5.0 (Linux;; Android 16;; 2510DRK44C Build/BP2A.250605.031.A3) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/143.0.7499.192 Mobile Safari/537.36",
|
||||
"主页url":"https://0dtgfho--y.jmaoniangdongman81.com/",
|
||||
"数组":"<div class=\"stui-vodlist__box link_re\">&&<div class=\"stui-vodlist__detail\">",
|
||||
"标题":"title=\"&&\"",
|
||||
"副标题":"<span class=\"pic-text text-right\">&&</span>",
|
||||
"图片":"data-original=\"&&\"",
|
||||
"链接":"href=\"&&\"",
|
||||
"嗅探词":".m3u8",
|
||||
"跳转播放链接": "var player_aaaa={*\"link_pre\":\"\",\"url\":\"&&\"",
|
||||
"直接播放":"1",
|
||||
"搜索模式":"1",
|
||||
"搜索url": "https://0dtgfho--y.jmaoniangdongman81.com/vodsearch/{wd}----------{pg}---/",
|
||||
"分类url":"https://0dtgfho--y.jmaoniangdongman81.com/vodshow/{cateId}--{by}------{catePg}---/",
|
||||
"分类":"动漫乐园$20#老司机动漫$110#猫娘动漫$21",
|
||||
"类型": "动漫乐园$20#中字动漫$61#激情动漫$33#鬼父$178#舰娘$177#初犬2$188#性奴$181#奸染$212#强奸$223#恋骑士$176#対魔忍$184#NTR$197#放课后$206#姬骑士$210#渐进曲$213#牝教师$222#思春期$227#便利店$231#母子相奸$172#人妻诱惑$170#扶养幼女$169||老司机动漫$110#纯情动漫$23#透明人间$230#毁灭交响曲$191#痴汉十人队$190#堕落女教师$183#悪の女干部$182#桜都字幕组$157#极度虐待狂$154#一次性女孩$150#漆黑的射干$143#公主的性癖$208#股人出租车$209#和姐姐乱伦$215#露妮的药房$217#轮奸俱乐部$218#凌辱餐厅店员$175#秘密温泉之旅$173#方便的性伴侣$185#课後个人授业$180#女友x三姐妹$141||猫娘动漫$21#奶香香動漫$22#QueenBee$186#WhiteBlue$201#PeroPero老师$198#SweetHome$200",
|
||||
"排序": "时间$time#人气$hits#评分$score"
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"发布站-b": "http://hsck.net/",
|
||||
"原始网址-b": "https://hk301.space:8899?u={{发布站-b}}&p=/",
|
||||
"域名-c": "{{原始网址-b}}[工具:重定向]",
|
||||
"主页url": "{{域名-c}}",
|
||||
"分类url": "{{域名-c}}/vodtype/{cateId}-{catePg}.html",
|
||||
"分类": "日韩AV$1#国产系列$2#欧美$3#成人动漫$4",
|
||||
"类型": "无码中文字幕$8#有码中文字幕$9#日本无码$10#日本有码$7#骑兵破解$26||空||空||空",
|
||||
"数组": "p:.stui-vodlist li[不含:target]",
|
||||
"标题": "p:h4->text",
|
||||
"图片": "p:.lazyload->data-original",
|
||||
"副标题": "p:.pic-text->text",
|
||||
"简介": "p:.stui-player__foot->text",
|
||||
"链接": "p:->href[替换:html>>html?play=1#1/>>1.html?play=1]",
|
||||
"线路数组": "player_aaaa=&&</script>",
|
||||
"线路标题": "j:from",
|
||||
"播放数组": "player_aaaa=&&</script>",
|
||||
"播放列表": "&&",
|
||||
"播放标题": "j:from",
|
||||
"播放链接": "j:url"
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
fHfrL-VE2gsvtaUTbzi/xYXTYAGFqP/r8oEA2610WMnSl2zd6eKSztmEVspRxe/U9D-xVbeMp39spsrLQ8GZlAVSXZZbgO/ZVWgzt2JHoAAlb6SlURx3ia2u7grKs7Y67UbB7eU10zcGNmaAyVZeTnwP1fK0XwngTtXJ8ryJflihhlpV9wkf0ii/sckcjapnmoR7rDw4clM36N8Gql0NTENrkBSLy2K-BgE-6cL3-L5U9q52h9hXkDp2/eUP57E3/s/MWNSOEdYlOB3HtY6-X4VHL2VRUs-ZTRYbQ8bzThQND6sASpp-ZLvQFqklRnKwu5uaBr9DJ8cmNFiGjHWb8ajzRfCOqCaz6GnrHmJQqP-2Dfpfg24gwrNf733m3B9iZNg7RlhUpeteMfdCrF3DMLc97JIfYDQtOlqmmPp3g8N2xbOPtujYFNUwgknS75-hWGxV9kEheF85-X8UJYZBUS7alKf5HOgoqcvbVMRM3VTP4sW8FY2Ub5fU7LBIB7k3fMnPhg67J7HFkNqQ/DKDZVlTQOsbmO86vS51qcrgkJbw5Iqur7RNeU2bCvFQb-mA-9dRhh054X-FD7zYDAFxW6QZy6bDZiK7ZdC/cAX2CSzOrKh6bmIQt0SvUp1QFBhuME4Vwea17d2MUE6RC7aogW-icec0XSeT7o1nPG-8Lf1etbPWoZCgWoW2L86I4uTDTSmjMkG4hfphyemK6aAqP0bh2vDwcXYJI7ESG3XKEGmlSBwUJfbev94BOP8yPJZFRPK6pntd6fcZ8mN7euWa4JYyFshxp1lKSGXHshRmm8deisp6oZoCPOXCn1gMt622NlX-U4t1NQM3SFHH1nZ9zHOOVtIEuYV3Qvzk9SO8AUXPvRZrZOhnWwWKvlLjLNCr/wzYIBOdwq4J6ABylv7u6s3FFXfpt0VQBLweq8/smplh5TJ62FuAyxP/IOFIJQhPweq99EYlyR6WSsQ9Yn/ZkhV5F16fL2FVAaHCWvw2yiumME2D7oaTBA1MIbZqJKT88oShr-4gthrIadA5fZGjv7Cg2w3YBnaqN9/CZkKPtgOi0ZaD9TSreHJkqF-cD/7sz7ce1pnX6b6eswYHe7dMgXdMyfYJL-Fs9i6rDmYmyQpasuoNQQjLzo2pdj2DkFm4bgF6sRMuhaeUyh4hr59bVBiLeyx2YEak5KR3BbZEvYbDiL60675KNV/LsMDWnaYQiEAgmLDuG9hqfH3y0N1nVA/KXQpYA8vIekgedH8CHq8qXc99X42bLVgYDnvU2aIXNotUBwIEEAuMNR4BMw8rd85/TUQq9rHNeU3xtNCYnb8d8PDvSvQQEP1LnuUFaXQ13nH76DwzTsI0HKHLwB/CfGvO6tIjXNnKg8/jHdBzT8/zbwqzb059QAmNWk5/hQqPjg69Pk6MGHpbcHoHRf6BAU5Q2AHSoPoHSfFWcIbAYkF2AsaDXbX-XQZ4p1/EyUcf/eP3vQA07OqvOu8MzO7CoeMgrKX075FRBUjKRRZWBCo5zqY5dCo5zqOi0RiPKjdq1H2ZgsRP6hCfbEJSiDMlZyYrJc3RXBwmw7SeYuCw/hcSLwBxldnV-joHSu5OdXwVRDtMOWYjmpzxmph0ST3G85g3YFn5jqSVQLJwCsFVHyOaOJsboQjmoOSDA4ec8za47p9FxthCRqqujtpELUfgWdEueiyutPMNjUulB7JfxvpgtV/m5wP3E0x8PxBKGHDXulr6FbePhAUgqBQVmCaxIc8-trowOgvAEAmBUO4VzIIyZ5nRYE/0O8z1XauhmbZORY/A7g2/KQcMNYJNlxTLcGufuGGIEQExj85GkdPQxpVNbwrKJYt6i/F3RES4BdlnGs9aZCUKPQ67A1YTwdIuecu1w7fT-CRCvYUZqTscaQ-gJ41U71BPcvwQ68oqmDEiX6X7rGujD4YpVeaK0IAdneT6GEdWMwyZxADBa5BZy35Xa7eU-z/oiFb7o4E3-uHEAN2LCP06p8bhviVuK0/ME0LNVKj/mAHcbE/9cdKVCwObzRm9xEccFAMXWFOzZWSItPbryR261i7Bb9vdL1oLYXAuuB5wfns9LZs2Y3LWVrTOSeV6UrJ1ffD8oVFzbr8AOhPTVKsOexEAjU/HfSzy3GgPtKKkI6P8E4cPV0EzJMGRxAV8bD3KKbskdJ/DfMMwtI9wjEeI1tD18cimjXhTGQetuDs0/5mjKhrE-LdBDxo-PGjz9lTzuJtgjWAbCJEM/Pj9Zc2hSr4T3tiszaR/3tj6O9KXL-WGAcCkFVA/9ji9Z498rbcKdOJULRO24AzDWyLPt90JK2StkPlHvwtKxNr6466IvryKO-9HFwhFV-ynE-eI/e65zhJ-0SRyJcKcWmmRtl-L8aaygF4jaaJFRAFW5-6BS3yddwsf2CtFSQFyPAckI/W9yQGCnZhfWduStvlq-HRhSgo/eHBK2y/ONTwlgFI95gXVbQxoHnp-Wj4RNhtT-G/6BZMncr2uCVelURk3P3nuk04B6tto9X3HIrzhwVqgeJ02hkJywrhfKivNGeK/K0LFPJL6aZ7xY9J/X590zdb3PvP9aNddnCEkuJmh0DNI8rQmUZsksBQ-9acWL90q8wZBYZBNsuLYLCQb8H2W/8Jjj1v-EteFstHDs5hVzLv7mU0qSopeHPRy/3Rsn9UvXOP8m5Zc-/StI/0GRUo4722E760/pFn57RHaVTJy-MxX6Ez3Mow9T1S1/ldkCRfJ9AqNOPO-PxhLap7mLwH8WpfCPLzl4BFYHWFqIP08n9TZoo2eFQ3-e0HjRvT8egbKpD1uoH5hlcIvxeVHXPVf2BvJr6gUZ29PxyhCNjbInLimbbZlwIKE7/xtDeFQ7FxfUAxA-bPk6nPdYLV4D926dX5WtV1ctlAxPFbZV6NhReK6GLPtoVUQyaIHM7iLuC7PjcYy8wfzEhrwLBZdBEjfFv-0ZLItFX-uMn-lZj1-zanrWNHWroyZAyNaSdyKys87IZKAXMKWBUbMg3ycNNLcHrvDSbI3V2JH6EW8FBx3v7DhnuFR-zYirmquM92nUrGCCYyH-kow86Gfp-P7t2Jd1bbJLoGIq5PMJVySr21MQKOgkHwTkK23isT5J0pU0ATloH4b4MQvC7ahLASilxqfDcqeq0AH4nfTbHO8lOIA/fEET8jQP-qn5b7T0xnmwiXdUXibOnXfRKiYvmwTWz5EOKQusAz8AsDR-dTSQ2ynaQ4F7S0HUHxDVNp2RJ/2Epx5DV0AGSwxknEsY94IhVvmfea7uCUTiBsDq0FCj/ckX4JoqAhsXlZ-kC/XZBI3/c1PEXcSPEuT99e66JbMQ3-hFTgDh14XQINqwjoeVM7xli975TMRuU223nLr4Cf2q-QRmlIeshrs8CYdJVjr94nzwfYcKv1oxbkF5i5Y74T1a5jRwPIFva3Xkx9F-2sWajhHv0luoLufHPt39aXNX03wQJSKKVtI3sr4YmUDPgEXd2ThxZJTKFDzVaPQFDz-cHaKuNZ8DY/QKAoDW9qPr8QOYMXT9s0kG78S-wT7Lu7WT1UAhmmSeGaJ01Gun/SwLHXKudFnDvVHmRv9ZZJdsq6OBkTT0Ic/CLu7SCBAbpzW9V9DC40Vz5HzpxMyU9EiMKdOXxGptUYoTdlKXPr-SRoYcvLiqXdd-qZLbrIWTUvv1qYe4-im-vpX8Cue420VRgiyM/j0miloqDcrKdlCm5y2hL4OUecFqoTLgfKVdBXYZvJRJFeu6xXS1sdrqwSwNXhWzJhkcV6WJlNpf8OXQrhfUO9Yjh8Oc0QR22MSePiAEnv8psTUZdaHgvkqO0QbxpQACsxlsU3HwokaSQmVnjd5V4r9ULvO1V8fIRGC1j70z5-8aTJOY7/W251BVLxWZMswkovqOuzUrxhLKUI8rbllsiGi80iwXPUbbvO9JR6A7H2rR2K5-lCJ2et7vatiWQ1fe9aHipgbQJC8gCLyDsbS7U/E8x04hREysVnEw59j2Cx3BoChCBK6/wYxYnyQXboRhbrZ-WAG7GwvXmF7jWsMr/R4VNq/b-r3sVdmOKNx4baNiTerVnrTlCErin6qL1U57d18xslzvV4k-IEHNqGdMtEMHAb8OU-wROLjAafLrfIzwZt8D5im/M5iR0MgnipGKW6mdj2No6CTn5mbY/WOX5rLjHhAfaNSFYgF6w9yanVm3AK4OrGPrwoZtFPwx1UGi6rQr1yKzTF74V1WyF5pcdo4h9ztRBQNCsDUbtmSDFpRyXK9zT0KYdJYe/v4Iibu3twuxgBNWt/zIvl0MVcozRiHjBlqJb-tfqQ3zXSH8BJKSSTnTzvTLu7PhscjobhQ/uNchEoapiESiVmjhdlwX0oh77s5WeMJo/hCkHIrgxoBE1BI5v2b4Q47wLyzvFIpO7cjWhl4LTl7sq4tZHWY42vLXcPkGEpg3Q5y7-qd3ODr87aSprniCNAvvo7dEyDOTvtJH0WcktGGF7yddKSUXQBaFRPGEV1wCq45RNKYOyzCzbpo-mHgvL0R-fRVwe3jz44oFh/r3Hdn12v3MciQM2r90-E0V1k0KuOhi6OXhiaM-fuYdwlT2xQU-BZq-gX/7v09xwRPHbZTbLjlLVbiaCenkRAmpcgRDKDVSvRBHnhbPybBigd-wPQVMZUQ1X7X3jh9QmQN3K8gsXEkffpV/Rj1Z1ALgmAGRJT9cyHt1iuhfj-nxb4LtMxaJoxrzfy58u88uv2Q33FHf36y/Z7wg5QrVqn6SWjOPKaiglggji0aTYqDVfU3gvN5uXGKQDGQjWIqxopEknZBBto4bE7ZH2kmYb-IEGlNQxKiJkSJGTYsdx7nydschTHJNsOJQZg74BWi4Uv-NLSo2NPSNwEgPUn876GsrtP4sz7OsnDE70sf5re0zDGomEidgg-kP3vrNa1roXkwvat6iZFTxdqT2Oiy8YevjM2obfVEHAXMrVISAKPad1W6YVtCVp-JmQ1idPRucksZWc81STN2jmW2QT954O3qrNpI-txmX2NajgkfoHz9j0U3Uw7VfsxjTcy2/LNk2Ix92lNaJOtngnyyYSAw4hcR/b5LYLmx0QedFxJcg0VgDBGWPNTZ7avk/isjfO5SLFlpmwZOrgnA7V6xEwiYI6PnkEi6HQAf7ODZRAXOjtcO5BXnq5CseBc2BsSyB2VUwe-d9/2rsUqPoYd7vuMPFAA9t4TfL7TAm4MhM7gCfLyS1BValnHb6NhDKjycXHWKDZf3bb3NJfnJN35C1STATzfguinHNSO1M6DGGoYspGaMPa1o9Zy4ryrUAHFWg-3kY88EWstmv3luo3YruUZzgvvnsAfsZogX1Kvu/K5i96/an2Uc0o8y/qWMAfWf4CeOzuFrN-L72zFdcM2ekW7eO7D2SgsAOn-5waDpudRYMb6wwNmNVD0UI8m3shOOm3J-e197TFmy2RUmmOoGsCcI1RkA75ZDd-VN9Ni9ZEOpra04mDNiDBhnJbnk1FEEXsLsGyiq7CyRPfSbmXyesIEagDeEMdpPrYOT3oNnpAt3cX1OyvSfz9NfWWWi08filz-pVkjcYh-MYpY-jvKxbGJzUR3FoNZqpTefOUdy891/6E/NcCQmqAYN-EXfUK9OX0aZqjgPV1a1MMuP7SsoNcPD44NXNIZQtnoy2ZKUTi3Nxr2Dj5-uowLvgsVdtvKlrSo0WNYbv5isbvs2kXsXJzqT5tn6eUKy6uzjU2XBIQOJS6ny3VL7t34p-GSx85Xqe0TGx/VcpQSuKYiJbx7Akuj3sFwyiZslHZrzqvIAJyDeFiZakhS2vV4F1cFSqSqnA9AY3SCxeFvjN86Qz4f9yO9Al5vrKolvSGTEfoHsa/o17uVhQjPwXG6C7o5ThV0ZAeW8SyrODqA16Jldmgf-JfY/kyqMbmbloUfy0bSWPQMm1DkhWzC6Fu9U-8VIZSFjX3jHazyAnU1XMpJeGofU0wu27NrSlFos8MCoFHK2mwtgX1-xKWChHemhiw0tYQsD76MF2NP2e9qRcx-gUjKYLPIcYQiUYSStaemU1i--Lj7IZn9i6-N2CnztweN9CabkV8tShNNn8xvWaasKEUy9qzGpmv9RZPqdMPzKEi7/VGa5bWGvXJPQRKE8wXkFpN9PdgjwOXoDQCbFx-/sp8G646w/ikN8Ey/Sba47i1c0FVMQp3HXTpF3BH8pHBHVW/n19g6Zvn4Zx9dSgYlS0IxEM0sbfTnTir8Sw9NZIrEZW8BOg2RF/CshgkaoLTTqbUW9rS9V28kXh5IQHlpn9Pp1jjhh84G-KMZlyMK8f3Ko831xrjqUJzvhXwgosukZqamfNHbODPW3EI-nAw-SSsDd6YyaaJ0ef9SqJ8e8JXLtWoXgh2V7Xi-f36zaZ3htmPartbuyVlfQGkrUZA/UJtGf58-AnlWdjP-UYOql0yKv5INqwo9avdN8Uo8jhnEmEQGEUTv6Ih8dAX9WMdhPFP0E4lhEj/fbcd9FH57qqXJzp-ZZPi5jhIvzetjTDb-o2GgbGnU95j7w/DzLnncVXmSwYV7XE8ILqkyf3mtFBXqCMuqpSQgv1yCh11qzZvad1NkStjOvW9deOpMtfeI/S1ebn0prwFlZIj350tlyYKI7cXKb-gBBgdRqZlhEA4AvjqMt0TkYKq0uiHxraY4BgjKz//gTbsehbwgYfeYpbiY8MzzVK-q6bblBnuB1WbbJy6Ntt09ouCD0JijTxQBY/2hcfvFzP6ITbepnhoZf5-6mTlXMSIeNqm7Ez2k/xZ6ATJ/4IzAyzC80H98JYlFagyGssefE-B/gvwH9Gy5R9fyyBsZlCEmLAl1spSXPaeBIm0S36V1Gi0mn-DoQSVoMFY5L89B0yyCbQqeg7Qv3lNwVORjIhunzj3o4aLNkhPdLB2bSzOOvuEmwPYaKdYb0MVN-A55vkAlqM-AmU9s1HBsRCXWOQN9rDZjCT4W9TkrUiQnpIkSS3x3bI8sIwUW2wXMWCFibGfnJEMlIxuMQeQDUbsB7T1u9LfoATMeTedshTJ1d0onoMrMAl/IZ8CNWK1n2o8EWCtn6kVEbtdGZmbgfOGF5cF/0T/BhJ69/ceoNwUkkipAAra9C2c/r9kbcY5OoMazmrjE3FZpTHOHFxx2sti/XqUN/lGoA4xLflYBjdgj4YiHEwYDz0U0HrY7ghzS0VSsUy/q9QmPxe3l-PdPPyKp-S0OK/hPSyq1FRSvLcZk1xGyUK3tHf8izuKXiOYNpjR3DcvAWmwy3dntQ73rj/UVnlomnwUksARrD7HQNokDb2cO6GlxFQe-n2p5/nqNQJvfI1a/6xwtbYRCMZS1ySz6Upqb7TAWnyQfzoOryChT4epflO1bGO2KpfBn8V23zHiwmcxOEgRHEkb/8gkhkRVBAniYuXLgzEHL1O53spgpv3nOKLJeDC-qATouH3Kmk876gJnZiKNGoL2NG/hKRdSTAeFL1BUG/oeNO0eGf1KDrAgv0sFaL2xnekUAc5IGWjMEhmNcuGx3uc1fM9UiDgxTKn9T8oAdZvWw0DGMs8KdQPsgbPgUx7rKadvDHfACNwJvx-FAfJos231EHs9xGCxHpBJtdlUWrSxxjwjit36o9a-rUKeConNe27mifgop1HTw5KsRnlZ1ejfj8KMxQe-2pCm0iYy4-chuAMWET0Lj3Aol35GE2DPoVAWMi1nOn9POD/1Lm8/FjUCNPh/JzQxKRV-5SqdTo-nP2xnXRGRfRsdNKdqBCrxH8kKSUMmjfCGeWnOHAjnvjVai4oakbi/6VBwFxkpFCaCFAZCmDSxBMIarDXRDAnz6tM6x8ROpBAltUyKcaajwDC3umkSpLuGOKwxSpwRZFH8gfHFLcugMP1AcULfDndP0EkdyFwbDdlz4w5PhFLl-VlZFTqePZg-YvbwQFbDy5mEkn9tSPIDvKruoax/kfZLtAmu/G8KeHwU1y6R2QZHIMGG0z8TL1olI4wmWcI0b0GY2zl01uOZoT15CWhrV1ZxNEyl1Pc8SZYyVXRSOb4tiZmMxnFrgQ06DavQ4lMkOvhZccB-WmGEtIYeDz-lkojkzBKiXeJXRaFf/afXYFsFBYIGvFx3pwdlYlTI2aG13ndVNQ8vCcOC6sG6pngP6LQXYtPiG5woIx6BmGkhyxGjpZN0bkaSno/3Sw/EjsTLNgSSFC3DlRSiDWKzQRd5mZkJHJt02rLiTbuAd3c1CFLepOrPwVWPY-Zvqe3WgoyTMOxcR3M7HjOhMEpE971Qh80ab55v2ZAdmyfcGZJHvZXXez90iOat112mpd07H2-VxZpLTGNiYGPWBzP2f19quMwYQPmWB9mUqN8wYH7i7L61-PTfa6k6NsYTau5dhi1r1p9Z5peswYVqJcX7jY-SSiJ8DK/eh7obAjJ5R8EYk42LP4e0ET433r7/Lc1Wu6MbKHkNzDGXgL2FwR949bMe05VoJdE7DxACr/Jsi-t1k0jei5ojxLny/uA9rbIxuazvrceg6iNEesASvv7Kk59DAkbDPGRhbvxsfuGHxPVGGRUK0XN/fIq2vlTc0MvyymkawVxZWHPTGQOuoV4xtk2rgcYvxUDz1U3KDGX-ThYD53dsIKagqwkfockd8UknpbmqOzEuNzq40JkU06tIEYvmEe5aQc2m8ZOISXRRpcMtGaiO4-uyXWYLLvuodn3WbM5ULcPrJplKtE0HLiBm3tySijrBLOz70-FY5zsQl5F3LtOF0iXvWLucHThqfuz7ghS8VqzSoeAV-wDWW85HRvTRzE8Y-kM3Pg/krQrOJl1LwB1jiYJeXKkK6GvKYMQ5L25sJL3jb6kI1vZUAteWRLUKva6aVVaVasbuDTMkhntZpuiNolcvxUSe5qVUTnwcvsikjmwIZ/iTLM462kP963ZR-qYSqw3UFqRwRKly-mhFuZPZNqKzC5VB55JERGNDv4G-dR/neTNDxTgPyK7WTWV4qAFD5-7ydlw9TYBqR9KTmPIJDTB/63EMEYR9wknHELc97REUJu8Z2HjVn6QcEGShoOmnicF0ys6DdcOCsL3Pn73gz2MGJC5Ay105XRonA1OheFA9Edd3jsI38P3qOporwUc4L2QWSFTRyLjXGe3k6SeQS7Ij8RPmaaqDjYmjLk/nlJ5iDGNSVhYIg74JVI4Qliy/eIZc1HoYT8WSqPIMnMci6WEyv0z0j8//Ox6MSHhaZB50WyYz0JRTNmkPYwq5fYCX9sRo2oBUxb-8h0C9wooU/zMEfD0ZYXtLRaKW0ML4Hfx/913M6NGAmvJtWnVoVd7-93-fjyr7XaZb9isY7kRjoVAOLTu4a-CaBMVqYJiV65akOoV79jZS0z1d5GpIReaPfKVhN7TqqwrnbodHMNL4V4P4kbs2RyJcLblZY-vr-wj92WL9EMrJP-weFe6VIvS36cv9WteuRP7El-Shdkk-cyZwZwdjf4RxnX4ltirNyjhdqUKrc2ASnxzYUgBnYlJxowr8ef6UoVsiAKN-NYrrxq5wVqDLA5ioszGELb-15A3ReT12iw3HO9pVLG9PA6y486UFIHArZ2sdXmLs4JW4b6KPpYSbXo3R6i03r61TCpgWIe5UGIWJTRMAdNi7w47czXii7vfpdJvYOaOa8Izr3-POP6UKzt671zLaQH9/qIROxNtsFn-HzrJ4Q0CGV--9DeTI86nKYsE-4bBffoJut2lI5vC6UPd/eYHPJLthT3WhwzKItbn6I22d70N6xovwxpiOmTdDzvVysJZbsSiidnoN0dHIMS/txYI0bUuAzB2gX8MSp5HXgGM2puqq90oWiwm-MPmEPAu2PkcNlcOFNaNUFKNZSz9fUZCerztVNF3FjlPnYNWKak0xnTCp9GQXr0IHr3N8FBRN8/jZdi0Zh/yA/nCdRXiBRVHMXeuFMGXvOMuVtb9VrwnTMoQp/ya6MI8okVggF0c4t/leEGSujhtTQ03ImMkbp5r80nIa-9ds6/NC/JFr2pHxNKixHr6W/qd4SydR4MrPbrZYM76GctJ-uhh5lCmkzz-TpRQ8w0V7wq9FN/iYHNWL8ujQtKR-/2-r5s9yk7bYCQPPsCUrHPp7Rj/GB9nIwFfwXmm2487a8K8ZbWz55MJ6uEd9j26CHB0aTMiPg149ofYL00RoEVYzUfOJYlHifTYVENrh-golX8relNq0p/HL/0is5iC1fJ4xIpXXfuKi8f3UW1e6X0-Cn62T/sTMWqlQc88GbB5PRvtTJfvExJaAS/wnzIfF7qQcjOpn6QtTONNuZlxNwkAYZuRI6c91zsWOLqBHUOrkMl/PnJBFj0ShsQ-e1C1G4ZoyAhV3QSVFiD/C5BKAZ26zd7iWpLnd-3y2-YBbzRcVccZGZk2-JvBKodjliBh/p6kTKTHnq1SjGh6SdG9eiW2nEuw1Mr2-Qo6y/6z7YhWnLSX3mInIdoBQeyqLqD89EkfXGfP1C6Kpn6gspEuDyfaiW8rKZXo03iXpzeMgEjpXqZB9texfUKfmuwYwzpuXvveQatacCkKlSTjuHOzmijCzvUPp/AzVyXcGQzT4Umywq7nRYV8rHnS37UCWD8bUbO/YQ1N/l-pU8j2SGwtQ5hq8UcEWL9fmXcCeM3iqfuuLkBLH-J11rIAgSGkSxPGrcT-IU6rMmESM8NlQQtC/4Bq-GBqwCU0g6SepJ05ftbeZMP44J9gAKkL/3vP773ZS85KQAA
|
||||
Reference in New Issue
Block a user