├── model └── ts ├── utils ├── __init__.py ├── ts ├── __pycache__ │ ├── logger.cpython-36.pyc │ ├── utils.cpython-36.pyc │ ├── utils.cpython-37.pyc │ ├── __init__.cpython-36.pyc │ ├── __init__.cpython-37.pyc │ ├── datasets.cpython-36.pyc │ ├── datasets.cpython-37.pyc │ ├── parse_config.cpython-36.pyc │ ├── parse_config.cpython-37.pyc │ ├── augmentations.cpython-36.pyc │ └── augmentations.cpython-37.pyc ├── augmentations.py ├── logger.py ├── parse_config.py ├── datasets.py └── utils.py ├── t.jpg ├── classes.names ├── html.html ├── config ├── capture.data └── yolov3.cfg ├── test.py ├── README.md ├── det.py ├── main.py ├── models.py └── tdc.js /model/ts: -------------------------------------------------------------------------------- 1 | a 2 | -------------------------------------------------------------------------------- /utils/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /utils/ts: -------------------------------------------------------------------------------- 1 | ts 2 | -------------------------------------------------------------------------------- /t.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrright2019/TDC_-/HEAD/t.jpg -------------------------------------------------------------------------------- /classes.names: -------------------------------------------------------------------------------- 1 | 圆柱体 2 | 圆锥 3 | 正方体 4 | 圆体 5 | 正对字母 6 | 侧对字母 7 | -------------------------------------------------------------------------------- /html.html: -------------------------------------------------------------------------------- 1 | _fp_041413({"fpsig":"110096097EEE17ABADA6A0FAA8DDEDC4E7F6987AD2FCB2F926FEDCF350BD9763756C3BA3B470C839BCE39C85F7EF2998AD5B"}) -------------------------------------------------------------------------------- /utils/__pycache__/logger.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrright2019/TDC_-/HEAD/utils/__pycache__/logger.cpython-36.pyc -------------------------------------------------------------------------------- /utils/__pycache__/utils.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrright2019/TDC_-/HEAD/utils/__pycache__/utils.cpython-36.pyc -------------------------------------------------------------------------------- /utils/__pycache__/utils.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrright2019/TDC_-/HEAD/utils/__pycache__/utils.cpython-37.pyc -------------------------------------------------------------------------------- /utils/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrright2019/TDC_-/HEAD/utils/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /utils/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrright2019/TDC_-/HEAD/utils/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /utils/__pycache__/datasets.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrright2019/TDC_-/HEAD/utils/__pycache__/datasets.cpython-36.pyc -------------------------------------------------------------------------------- /utils/__pycache__/datasets.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrright2019/TDC_-/HEAD/utils/__pycache__/datasets.cpython-37.pyc -------------------------------------------------------------------------------- /config/capture.data: -------------------------------------------------------------------------------- 1 | classes= 6 2 | train=data/capture/train.txt 3 | valid=data/capture/valid.txt 4 | names=data/capture/classes.names 5 | -------------------------------------------------------------------------------- /utils/__pycache__/parse_config.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrright2019/TDC_-/HEAD/utils/__pycache__/parse_config.cpython-36.pyc -------------------------------------------------------------------------------- /utils/__pycache__/parse_config.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrright2019/TDC_-/HEAD/utils/__pycache__/parse_config.cpython-37.pyc -------------------------------------------------------------------------------- /utils/__pycache__/augmentations.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrright2019/TDC_-/HEAD/utils/__pycache__/augmentations.cpython-36.pyc -------------------------------------------------------------------------------- /utils/__pycache__/augmentations.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrright2019/TDC_-/HEAD/utils/__pycache__/augmentations.cpython-37.pyc -------------------------------------------------------------------------------- /test.py: -------------------------------------------------------------------------------- 1 | 2 | import execjs 3 | ctx = execjs.compile(open("tdc.js","r").read()) 4 | eks,gdata = ctx.call("add_x") 5 | print(eks) 6 | print(gdata) 7 | eks,gdata = ctx.call("add_x") 8 | print(eks) 9 | print(gdata) 10 | 11 | -------------------------------------------------------------------------------- /utils/augmentations.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn.functional as F 3 | import numpy as np 4 | 5 | 6 | def horisontal_flip(images, targets): 7 | images = torch.flip(images, [-1]) 8 | targets[:, 2] = 1 - targets[:, 2] 9 | return images, targets 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TDC_- 2 | TDC点选验证码 3 | 4 | 5 | 6 | 1.pyexecjs使用node引擎 7 | 2.model为yolov3模型,使用100张图片训练了990次迭代,6个类,在classes.names中有显示 8 | model下载地址: 9 | 链接: https://pan.baidu.com/s/1ArEXh-3sLGPfreGTCgMYvw 提取码: 4evc 10 | 11 | 注:时间匆忙,只训练了6个类,针对很多不同的点选提示需要重新训练更细致的分类,如需使用各位自己去训练吧:) 12 | -------------------------------------------------------------------------------- /utils/logger.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | 3 | 4 | class Logger(object): 5 | def __init__(self, log_dir): 6 | """Create a summary writer logging to log_dir.""" 7 | self.writer = tf.summary.FileWriter(log_dir) 8 | 9 | def scalar_summary(self, tag, value, step): 10 | """Log a scalar variable.""" 11 | summary = tf.Summary(value=[tf.Summary.Value(tag=tag, simple_value=value)]) 12 | self.writer.add_summary(summary, step) 13 | 14 | def list_of_scalars_summary(self, tag_value_pairs, step): 15 | """Log scalar variables.""" 16 | summary = tf.Summary(value=[tf.Summary.Value(tag=tag, simple_value=value) for tag, value in tag_value_pairs]) 17 | self.writer.add_summary(summary, step) 18 | -------------------------------------------------------------------------------- /utils/parse_config.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | def parse_model_config(path): 4 | """Parses the yolo-v3 layer configuration file and returns module definitions""" 5 | file = open(path, 'r') 6 | lines = file.read().split('\n') 7 | lines = [x for x in lines if x and not x.startswith('#')] 8 | lines = [x.rstrip().lstrip() for x in lines] # get rid of fringe whitespaces 9 | module_defs = [] 10 | for line in lines: 11 | if line.startswith('['): # This marks the start of a new block 12 | module_defs.append({}) 13 | module_defs[-1]['type'] = line[1:-1].rstrip() 14 | if module_defs[-1]['type'] == 'convolutional': 15 | module_defs[-1]['batch_normalize'] = 0 16 | else: 17 | key, value = line.split("=") 18 | value = value.strip() 19 | module_defs[-1][key.rstrip()] = value.strip() 20 | 21 | return module_defs 22 | 23 | def parse_data_config(path): 24 | """Parses the data configuration file""" 25 | options = dict() 26 | options['gpus'] = '0,1,2,3' 27 | options['num_workers'] = '10' 28 | with open(path, 'r') as fp: 29 | lines = fp.readlines() 30 | for line in lines: 31 | line = line.strip() 32 | if line == '' or line.startswith('#'): 33 | continue 34 | key, value = line.split('=') 35 | options[key.strip()] = value.strip() 36 | return options 37 | -------------------------------------------------------------------------------- /det.py: -------------------------------------------------------------------------------- 1 | from __future__ import division 2 | from models import * 3 | from utils.utils import * 4 | from utils.datasets import * 5 | from PIL import Image 6 | import os 7 | os.environ["CUDA_VISIBLE_DEVICES"] = "0" 8 | import sys 9 | import time,uuid 10 | import datetime 11 | import argparse 12 | import numpy as np 13 | import torch.nn.functional as F 14 | from PIL import Image 15 | import torchvision.transforms as transforms 16 | import torch 17 | from torch.utils.data import DataLoader 18 | from torchvision import datasets 19 | from torch.autograd import Variable 20 | import cv2 21 | 22 | 23 | def pad_to_square(img, pad_value): 24 | c, h, w = img.shape 25 | dim_diff = np.abs(h - w) 26 | pad1, pad2 = dim_diff // 2, dim_diff - dim_diff // 2 27 | pad = (0, 0, pad1, pad2) if h <= w else (pad1, pad2, 0, 0) 28 | img = F.pad(img, pad, "constant", value=pad_value) 29 | 30 | return img, pad 31 | 32 | def resize(image, size): 33 | image = F.interpolate(image.unsqueeze(0), size=size, 34 | mode="nearest").squeeze(0) 35 | return image 36 | 37 | 38 | def GetImgMat(img_path): 39 | img = transforms.ToTensor()(Image.open(img_path)) 40 | img, _ = pad_to_square(img, 0) 41 | img = resize(img, 416) 42 | img = img.view(-1,3,416,416) 43 | return img 44 | 45 | from PIL import Image, ImageDraw, ImageFont 46 | def predictImg(model,path): 47 | 48 | Tensor = torch.cuda.FloatTensor if torch.cuda.is_available() else torch.FloatTensor 49 | img_detections = [] 50 | mat = GetImgMat(path) 51 | input_imgs = Variable(mat.type(Tensor)) 52 | with torch.no_grad(): 53 | detections = model(input_imgs) 54 | detections = non_max_suppression( 55 | detections, 0.75, 0.1) 56 | return getBeforePosition(path,detections[0]) 57 | 58 | 59 | 60 | def getBeforePosition(path,detections): 61 | if detections is None: 62 | return 63 | img = np.array(Image.open(path)) 64 | detections = rescale_boxes(detections, 416, list(img.shape)[:2]) 65 | classname = """yuanzhu 66 | yuanzhui 67 | zhengfangti 68 | yuanti 69 | zhengdui 70 | cedui""".split("\n") 71 | im = cv2.imread(path) 72 | global_data = [] 73 | fontStyle = ImageFont.truetype( 74 | "font/simsun.ttc", 16, encoding="utf-8") 75 | for x1, y1, x2, y2, conf, cls_conf, cls_pred in detections: 76 | # if cls_conf.item()<0.7: 77 | item = {} 78 | item['name'] = classname[int(cls_pred)] 79 | item['x1'] = x1.item() 80 | item['x2'] = x2.item() 81 | item['y1'] = y1.item() 82 | item['y2'] = y2.item() 83 | global_data.append(item) 84 | cv2.rectangle(im,(int(x1),int(y1)),(int(x2),int(y2)),(0,255,0),2) 85 | cv2.putText(im, classname[int(cls_pred)], (int(x1),int(y1-6)), cv2.FONT_HERSHEY_COMPLEX_SMALL,0.8, (0, 255, 0) ) 86 | cv2.imwrite('output/{}.jpg'.format(str(uuid.uuid1())),im,[int(cv2.IMWRITE_JPEG_QUALITY),70]) 87 | print("写入完成") 88 | return global_data 89 | 90 | 91 | 92 | 93 | def load_model(): 94 | opt = { 95 | "model_def":"config/yolov3.cfg", 96 | "class_path":'classes.names', 97 | "conf_thres":0.75, 98 | 'n_cpu':0, 99 | 'nms_thres':0.1, 100 | 'weights_path':'model/capture_990.pth', 101 | "img_size":416 102 | } 103 | device = torch.device("cuda" if torch.cuda.is_available() else "cpu") 104 | model = Darknet(opt['model_def'], img_size=416).to(device) 105 | 106 | if opt['weights_path'].endswith(".weights"): 107 | # Load darknet weights 108 | model.load_darknet_weights(opt['weights_path']) 109 | else: 110 | # Load checkpoint weights 111 | model.load_state_dict(torch.load(opt['weights_path'],map_location=device)) 112 | model.eval() 113 | classes = load_classes(opt['class_path']) 114 | return model,classes 115 | 116 | 117 | global_model,global_data = load_model() 118 | 119 | def p(img): 120 | model,classes = load_model() 121 | obj = predictImg(global_model,img) 122 | return obj 123 | 124 | 125 | # p("t.jpg") -------------------------------------------------------------------------------- /utils/datasets.py: -------------------------------------------------------------------------------- 1 | import glob 2 | import random 3 | import os 4 | import sys 5 | import numpy as np 6 | from PIL import Image 7 | import torch 8 | import torch.nn.functional as F 9 | 10 | from utils.augmentations import horisontal_flip 11 | from torch.utils.data import Dataset 12 | import torchvision.transforms as transforms 13 | 14 | 15 | def pad_to_square(img, pad_value): 16 | c, h, w = img.shape 17 | dim_diff = np.abs(h - w) 18 | # (upper / left) padding and (lower / right) padding 19 | pad1, pad2 = dim_diff // 2, dim_diff - dim_diff // 2 20 | # Determine padding 21 | pad = (0, 0, pad1, pad2) if h <= w else (pad1, pad2, 0, 0) 22 | # Add padding 23 | img = F.pad(img, pad, "constant", value=pad_value) 24 | 25 | return img, pad 26 | 27 | 28 | def resize(image, size): 29 | image = F.interpolate(image.unsqueeze(0), size=size, 30 | mode="nearest").squeeze(0) 31 | return image 32 | 33 | 34 | def random_resize(images, min_size=288, max_size=448): 35 | new_size = random.sample(list(range(min_size, max_size + 1, 32)), 1)[0] 36 | images = F.interpolate(images, size=new_size, mode="nearest") 37 | return images 38 | 39 | 40 | class ImageFolder(Dataset): 41 | def __init__(self, folder_path, img_size=416): 42 | self.files = sorted(glob.glob("%s/*.*" % folder_path)) 43 | self.img_size = img_size 44 | 45 | def __getitem__(self, index): 46 | img_path = self.files[index % len(self.files)] 47 | # Extract image as PyTorch tensor 48 | img = transforms.ToTensor()(Image.open(img_path)) 49 | # Pad to square resolution 50 | img, _ = pad_to_square(img, 0) 51 | # Resize 52 | img = resize(img, self.img_size) 53 | 54 | return img_path, img 55 | 56 | def __len__(self): 57 | return len(self.files) 58 | 59 | 60 | class ListDataset(Dataset): 61 | def __init__(self, list_path, img_size=416, augment=True, multiscale=True, normalized_labels=True): 62 | with open(list_path, "r") as file: 63 | self.img_files = file.readlines() 64 | 65 | self.label_files = [ 66 | path.replace("images", "labels").replace( 67 | ".png", ".txt").replace(".jpg", ".txt") 68 | for path in self.img_files 69 | ] 70 | self.img_size = img_size 71 | self.max_objects = 100 72 | self.augment = augment 73 | self.multiscale = multiscale 74 | self.normalized_labels = normalized_labels 75 | self.min_size = self.img_size - 3 * 32 76 | self.max_size = self.img_size + 3 * 32 77 | self.batch_count = 0 78 | 79 | def __getitem__(self, index): 80 | 81 | # --------- 82 | # Image 83 | # --------- 84 | 85 | img_path = self.img_files[index % len(self.img_files)].rstrip() 86 | 87 | # Extract image as PyTorch tensor 88 | img = transforms.ToTensor()(Image.open(img_path).convert('RGB')) 89 | 90 | # Handle images with less than three channels 91 | if len(img.shape) != 3: 92 | img = img.unsqueeze(0) 93 | img = img.expand((3, img.shape[1:])) 94 | 95 | _, h, w = img.shape 96 | h_factor, w_factor = (h, w) if self.normalized_labels else (1, 1) 97 | # Pad to square resolution 98 | img, pad = pad_to_square(img, 0) 99 | _, padded_h, padded_w = img.shape 100 | 101 | # --------- 102 | # Label 103 | # --------- 104 | 105 | label_path = self.label_files[index % len(self.img_files)].rstrip() 106 | 107 | targets = None 108 | if os.path.exists(label_path): 109 | boxes = torch.from_numpy(np.loadtxt(label_path).reshape(-1, 5)) 110 | # Extract coordinates for unpadded + unscaled image 111 | x1 = w_factor * (boxes[:, 1] - boxes[:, 3] / 2) 112 | y1 = h_factor * (boxes[:, 2] - boxes[:, 4] / 2) 113 | x2 = w_factor * (boxes[:, 1] + boxes[:, 3] / 2) 114 | y2 = h_factor * (boxes[:, 2] + boxes[:, 4] / 2) 115 | # Adjust for added padding 116 | x1 += pad[0] 117 | y1 += pad[2] 118 | x2 += pad[1] 119 | y2 += pad[3] 120 | # Returns (x, y, w, h) 121 | boxes[:, 1] = ((x1 + x2) / 2) / padded_w 122 | boxes[:, 2] = ((y1 + y2) / 2) / padded_h 123 | boxes[:, 3] *= w_factor / padded_w 124 | boxes[:, 4] *= h_factor / padded_h 125 | 126 | targets = torch.zeros((len(boxes), 6)) 127 | targets[:, 1:] = boxes 128 | 129 | # Apply augmentations 130 | if self.augment: 131 | if np.random.random() < 0.5: 132 | try: 133 | img, targets = horisontal_flip(img, targets) 134 | except: 135 | import traceback 136 | print(traceback.format_exc()) 137 | 138 | return img_path, img, targets 139 | 140 | def collate_fn(self, batch): 141 | paths, imgs, targets = list(zip(*batch)) 142 | # Remove empty placeholder targets 143 | targets = [boxes for boxes in targets if boxes is not None] 144 | # Add sample index to targets 145 | for i, boxes in enumerate(targets): 146 | boxes[:, 0] = i 147 | targets = torch.cat(targets, 0) 148 | # Selects new image size every tenth batch 149 | if self.multiscale and self.batch_count % 10 == 0: 150 | self.img_size = random.choice( 151 | range(self.min_size, self.max_size + 1, 32)) 152 | # Resize images to input shape 153 | imgs = torch.stack([resize(img, self.img_size) for img in imgs]) 154 | self.batch_count += 1 155 | return paths, imgs, targets 156 | 157 | def __len__(self): 158 | return len(self.img_files) 159 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import re,time 3 | 4 | from det import * 5 | 6 | 7 | 8 | 9 | cookie_str = "TDC_itoken=1117279312%3A1587446300" 10 | cookies = { 11 | "TDC_itoken":'1117279312%3A1587446300' 12 | } 13 | 14 | sess = requests.Session() 15 | 16 | createIframeStart = str(int(time.time()*1000)) 17 | headers = { 18 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0', 19 | 'Accept': '*/*', 20 | 'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2', 21 | 'Connection': 'keep-alive', 22 | 'Referer': 'https://007.qq.com/online.html', 23 | 'Pragma': 'no-cache', 24 | 'Cache-Control': 'no-cache', 25 | } 26 | 27 | ptcz = '64c6eaeb4bd663d6117a7d5fce3ed215e87dadf70aed38aeeca90ef8139c9924' 28 | 29 | params = ( 30 | ('aid', '2100049390'), 31 | ('protocol', 'https'), 32 | ('accver', '1'), 33 | ('showtype', 'popup'), 34 | ('ua', 'TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NDsgcnY6NzUuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC83NS4w'), 35 | ('noheader', '1'), 36 | ('fb', '1'), 37 | ('enableDarkMode', '0'), 38 | ('fpinfo', 'fpsig=undefined'), 39 | ('grayscale', '1'), 40 | ('clientype', '2'), 41 | ('cap_cd', ''), 42 | ('uid', '2819700269'), 43 | ('wxLang', ''), 44 | ('subsid', '1'), 45 | ('callback', '_aq_64821'), 46 | ('sess', ''), 47 | ) 48 | 49 | response = sess.get('https://ssl.captcha.qq.com/cap_union_prehandle', headers=headers, params=params) 50 | 51 | import json,time 52 | 53 | data = json.loads(response.content.decode("utf-8").replace("_aq_64821(","")[:-1]) 54 | print(data) 55 | 56 | sess_ = data['sess'] 57 | sid = data['sid'] 58 | 59 | 60 | 61 | 62 | params = ( 63 | ('0', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0'), 64 | ('1', 'zh-CN'), 65 | ('2', '1.8'), 66 | ('3', '1.8'), 67 | ('4', '24'), 68 | ('5', '6'), 69 | ('6', '-480'), 70 | ('7', '1'), 71 | ('8', '1'), 72 | ('9', '1'), 73 | ('10', 'u'), 74 | ('11', 'undefined'), 75 | ('12', 'u'), 76 | ('13', 'Win32'), 77 | ('14', 'unspecified'), 78 | ('15', 'e466827d3971a555235e032f6e6f19d2'), 79 | ('16', 'a7bc50d4cdc0a49bdd948adde466aeb5'), 80 | ('17', 'e3cf09cd89763e62623a65a77c741594'), 81 | ('18', '0'), 82 | ('19', '83f619edd084ef69de541dd8973c2320'), 83 | ('20', '10401920241080192024'), 84 | ('21', '1;'), 85 | ('22', '1;1;1;1;1;1;1;0;1;object0UTF-8'), 86 | ('23', '0'), 87 | ('24', '0;0'), 88 | ('25', '39efe514b8b0ae9b048fe4d2074540a9'), 89 | ('26', '44100_0_1_0_2_explicit_speakers'), 90 | ('27', 'c8205b36aba2b1f3b581d8170984e918'), 91 | ('28', 'ANGLE(Intel(R)UHDGraphics630Direct3D11vs_5_0ps_5_0)'), 92 | ('29', '2a4bdde0b1902c187a151c77e5b69d33'), 93 | ('30', '267301cb561d8b8f1b6749e8d046e11e'), 94 | ('31', '0'), 95 | ('32', '0'), 96 | ('33', '0'), 97 | ('34', '0'), 98 | ('35', '0'), 99 | ('36', '0'), 100 | ('37', '0'), 101 | ('38', '0'), 102 | ('39', '0'), 103 | ('40', '0'), 104 | ('41', '0'), 105 | ('42', '0'), 106 | ('43', '0'), 107 | ('44', '0'), 108 | ('45', '0'), 109 | ('46', '0'), 110 | ('47', '0'), 111 | ('48', '0'), 112 | ('49', '0'), 113 | ('50', '0'), 114 | ('fesig', '13343404337304794372'), 115 | ('ut', '1019'), 116 | ('appid', '0'), 117 | ('refer', 'https://ssl.captcha.qq.com/cap_union_new_show'), 118 | ('domain', 'ssl.captcha.qq.com'), 119 | ('fph', ''), 120 | ('fpv', '0.0.15'), 121 | ('ptcz', ptcz), 122 | ('callback', '_fp_041413'), 123 | ) 124 | 125 | response = sess.get('https://ssl.captcha.qq.com/dfpReg', headers=headers, params=params, cookies=cookies) 126 | 127 | 128 | respdata = json.loads(response.content.decode("utf-8").replace("_fp_041413(","")[:-1]) 129 | 130 | fpsig = respdata['fpsig'] 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | params = ( 141 | ('aid', '2100049390'), 142 | ('protocol', 'https'), 143 | ('accver', '1'), 144 | ('showtype', 'popup'), 145 | ('ua', 'TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NDsgcnY6NzUuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC83NS4w'), 146 | ('noheader', '1'), 147 | ('fb', '1'), 148 | ('enableDarkMode', '0'), 149 | ('fpinfo', 'fpsig='+fpsig), 150 | ('grayscale', '1'), 151 | ('clientype', '2'), 152 | ('subsid', '2'), 153 | ('sess', sess_), 154 | ('fwidth', '0'), 155 | ('sid', sid), 156 | ('forcestyle', 'undefined'), 157 | ('wxLang', ''), 158 | ('tcScale', '1'), 159 | ('uid', '2819700269'), 160 | ('cap_cd', ''), 161 | ('rnd', '499769'), 162 | ('TCapIframeLoadTime', 'undefined'), 163 | ('prehandleLoadTime', '30'), 164 | ('createIframeStart', createIframeStart), 165 | ('ptcz',ptcz) 166 | ) 167 | 168 | capHtml = sess.get('https://ssl.captcha.qq.com/cap_union_new_show', headers=headers, params=params) 169 | capHtml = capHtml.content.decode("utf-8") 170 | 171 | txt = re.findall('dt="(.*?)"',capHtml,re.S) 172 | print("规则",txt) 173 | 174 | is_coding = False 175 | for r in ["请点击正对着你的","请点击侧对着你的"]: 176 | if r in txt[0]: 177 | is_coding= True 178 | 179 | if not is_coding: 180 | print("未编写改代码") 181 | exit() 182 | 183 | 184 | jspath = re.findall("tdc.js(.*?)>",capHtml,re.S) 185 | 186 | websig = re.findall("websig:\"(.*?)\"",capHtml,re.S)[0] 187 | 188 | vsig = re.findall('H="(.*?)"',capHtml,re.S)[0] 189 | 190 | print(jspath) 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | jspath = "https://ssl.captcha.qq.com/tdc.js"+jspath[0] 207 | 208 | with open("html.html","w") as f: 209 | f.write(response.content.decode("utf-8").replace(jspath,"tdc.js")) 210 | 211 | 212 | 213 | 214 | 215 | stage_str = """ 216 | window = {} 217 | var window = {} 218 | 219 | window['Array'] = Array 220 | 221 | window.navigator = {} 222 | window.navigator.cookieEnabled = true 223 | window.location = {} 224 | window.location.href = "" 225 | window.getComputedStyle = function(){return {}} 226 | window.matchMedia = function(x){ 227 | return {media: x,matches:true} 228 | } 229 | var document = {} 230 | document.documentElement = {} 231 | document.charset = "UTF-8" 232 | window.innerWidth = 1920 233 | window.innerHeight = 937 234 | document.documentElement.clientWidth = 1903 235 | document.documentElement.clientHeight = 937 236 | document.body = {} 237 | document.body.clientWidth = 1903 238 | document.body.clientHeight = 1889 239 | document.body = {} 240 | document.body.clientWidth = 476 241 | document.body.clientHeight = 137 242 | document.createElement = function(){return []} 243 | navigator = {} 244 | navigator.userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36" 245 | screen = { 246 | availHeight: 1040, 247 | availLeft: 0, 248 | availTop: 0, 249 | availWidth: 1920, 250 | colorDepth: 24, 251 | height: 1080, 252 | left: 0, 253 | mozOrientation: "landscape-primary", 254 | onmozorientationchange: null, 255 | pixelDepth: 24, 256 | top: 0, 257 | width: 1920, 258 | orientation: {angle: 0,type: "landscape-primary"} 259 | } 260 | window.screen = screen 261 | document.createElement = function (x) { return [] } 262 | """ 263 | 264 | stage_str += 'document.cookie = "{}"\n\n\n'.format(cookie_str) 265 | 266 | end_str = """ 267 | 268 | Z = 1 269 | TDC = window['TDC'] 270 | 271 | TDC.setData("ft","6f_7P_n_H") 272 | TDC.setData({coordinate:[10, 64, "0.5000"]}) 273 | K = 0 274 | function add_x(){ 275 | 276 | TDC.setData({ 277 | trycnt: ++Z, 278 | refreshcnt: K 279 | }) 280 | gdata = TDC.getData() 281 | return [TDC.getInfo()['info'],gdata]; 282 | 283 | 284 | } 285 | 286 | x = add_x() 287 | console.log(x) 288 | 289 | """ 290 | 291 | jsresp = sess.get(jspath) 292 | print(sess.cookies) 293 | 294 | 295 | with open("tdc.js","w") as f: 296 | f.write(stage_str + jsresp.content.decode("utf-8") + end_str) 297 | 298 | 299 | import execjs 300 | ctx = execjs.compile(open("tdc.js","r").read()) 301 | 302 | 303 | 304 | params = ( 305 | ('aid', '2100049390'), 306 | ('protocol', 'https'), 307 | ('accver', '1'), 308 | ('showtype', 'popup'), 309 | ('ua', 'TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NDsgcnY6NzUuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC83NS4w'), 310 | ('noheader', '1'), 311 | ('fb', '1'), 312 | ('enableDarkMode', '0'), 313 | ('fpinfo', 'fpsig=undefined'), 314 | ('grayscale', '1'), 315 | ('clientype', '2'), 316 | ('subsid', '3'), 317 | ('sess', sess_), 318 | ('fwidth', '0'), 319 | ('sid', sid), 320 | ('forcestyle', 'undefined'), 321 | ('wxLang', ''), 322 | ('tcScale', '1'), 323 | ('uid', '2819700269'), 324 | ('cap_cd', ''), 325 | ('rnd', '499769'), 326 | ('TCapIframeLoadTime', 'undefined'), 327 | ('prehandleLoadTime', '30'), 328 | ('createIframeStart', '1587446299561'), 329 | ('rand', '0.726533437089379'), 330 | ('vsig', vsig), 331 | ) 332 | 333 | 334 | 335 | response = sess.get('https://ssl.captcha.qq.com/cap_union_new_getcapbysig', headers=headers, params=params, cookies=cookies) 336 | 337 | 338 | with open("t.jpg","wb") as f: 339 | f.write(response.content) 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | objects = p("t.jpg") 348 | 349 | ''' 350 | [{'name': 'zhengdui', 'x1': 141.91305541992188, 'x2': 207.52615356445312, 'y1': 182.9700469970703, 'y2': 289.5917663574219}, {'name': 'yuanzhui', 'x1': 539.66796875, 'x2': 644.810546875, 'y1': 222.9202880859375, 'y2': 328.2587890625}, {'name': 'zhengdui', 'x1': 488.8005065917969, 'x2': 554.8145751953125, 'y1': 80.8041763305664, 'y2': 190.52880859375}, {'name': 'cedui', 'x1': 129.19741821289062, 'x2': 177.7596435546875, 'y1': 83.20233917236328, 'y2': 201.85980224609375}, {'name': 'zhengdui', 'x1': 545.4267578125, 'x2': 640.708984375, 'y1': 218.67037963867188, 'y2': 329.60302734375}, {'name': 'yuanti', 'x1': 384.8795166015625, 'x2': 481.59320068359375, 'y1': 215.79359436035156, 'y2': 311.32647705078125}, {'name': 'zhengfangti', 'x1': 385.5037536621094, 'x2': 474.96282958984375, 'y1': 212.2169647216797, 'y2': 308.42047119140625}, {'name': 'zhengdui', 'x1': 330.2404479980469, 'x2': 387.6609191894531, 'y1': 130.0834503173828, 'y2': 261.6133728027344}, {'name': 'zhengdui', 'x1': 229.5642852783203, 'x2': 286.5433044433594, 'y1': 146.38681030273438, 'y2': 273.88916015625}] 351 | ''' 352 | 353 | all_ans = [] 354 | if "正" in txt[0]: 355 | for o in objects: 356 | if o['name'] == 'zhengdui': 357 | ans = "{},{};".format(int((o['x1']+o['x2'])/2),int((o['y1']+o['y2'])/2)) 358 | all_ans.append(ans) 359 | print("ans:",ans) 360 | 361 | 362 | 363 | if "请点击侧" in txt[0]: 364 | for o in objects: 365 | if o['name'] == 'cedui': 366 | ans = "{},{};".format(int((o['x1']+o['x2'])/2),int((o['y1']+o['y2'])/2)) 367 | print("ans:",ans) 368 | all_ans.append(ans) 369 | 370 | 371 | 372 | 373 | def verif(gdata,ans,eks): 374 | params = ( 375 | ('random', '1587460707166'), 376 | ) 377 | 378 | data = { 379 | 'aid': '2100049390', 380 | 'protocol': 'https', 381 | 'accver': '1', 382 | 'showtype': 'popup', 383 | 'ua': 'TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NDsgcnY6NzUuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC83NS4w', 384 | 'noheader': '1', 385 | 'fb': '1', 386 | 'enableDarkMode': '0', 387 | 'fpinfo': 'fpsig='+fpsig, 388 | 'grayscale': '1', 389 | 'clientype': '2', 390 | 'subsid': '5', 391 | 'sess': sess_, 392 | 'fwidth': '0', 393 | 'sid': sid, 394 | 'forcestyle': 'undefined', 395 | 'wxLang': '', 396 | 'tcScale': '1', 397 | 'uid': '2819700269', 398 | 'cap_cd': '', 399 | 'rnd': '499769', 400 | 'TCapIframeLoadTime': 'undefined', 401 | 'prehandleLoadTime': '30', 402 | 'createIframeStart': createIframeStart, 403 | 'subcapclass': '11', 404 | 'vsig': vsig, 405 | 'ans': ans, 406 | 'cdata': '12', 407 | 'accbcb': gdata, 408 | 'websig': websig, 409 | 'eks':eks, 410 | 'tlg': '1', 411 | 'vlg': '0_1_0', 412 | 'vmtime': '_', 413 | 'vmData': '' 414 | } 415 | 416 | response = sess.post('https://ssl.captcha.qq.com/cap_union_new_verify', headers=headers, params=params, cookies=cookies, data=data) 417 | 418 | 419 | 420 | jsondata = json.loads(response.content.decode('utf-8')) 421 | print(jsondata) 422 | if jsondata['errorCode'] == '0': 423 | print("验证通过") 424 | exit() 425 | 426 | 427 | 428 | 429 | 430 | eks,gdata = ctx.call("add_x") 431 | # print(eks) 432 | # print(gdata) 433 | 434 | for r in all_ans: 435 | verif(gdata,r,eks) 436 | eks,gdata = ctx.call("add_x") 437 | # print(eks) 438 | # print(gdata) 439 | 440 | 441 | -------------------------------------------------------------------------------- /config/yolov3.cfg: -------------------------------------------------------------------------------- 1 | [net] 2 | # Testing 3 | #batch=1 4 | #subdivisions=1 5 | # Training 6 | batch=16 7 | subdivisions=1 8 | width=416 9 | height=416 10 | channels=3 11 | momentum=0.9 12 | decay=0.0005 13 | angle=0 14 | saturation = 1.5 15 | exposure = 1.5 16 | hue=.1 17 | 18 | learning_rate=0.001 19 | burn_in=1000 20 | max_batches = 500200 21 | policy=steps 22 | steps=400000,450000 23 | scales=.1,.1 24 | 25 | [convolutional] 26 | batch_normalize=1 27 | filters=32 28 | size=3 29 | stride=1 30 | pad=1 31 | activation=leaky 32 | 33 | # Downsample 34 | 35 | [convolutional] 36 | batch_normalize=1 37 | filters=64 38 | size=3 39 | stride=2 40 | pad=1 41 | activation=leaky 42 | 43 | [convolutional] 44 | batch_normalize=1 45 | filters=32 46 | size=1 47 | stride=1 48 | pad=1 49 | activation=leaky 50 | 51 | [convolutional] 52 | batch_normalize=1 53 | filters=64 54 | size=3 55 | stride=1 56 | pad=1 57 | activation=leaky 58 | 59 | [shortcut] 60 | from=-3 61 | activation=linear 62 | 63 | # Downsample 64 | 65 | [convolutional] 66 | batch_normalize=1 67 | filters=128 68 | size=3 69 | stride=2 70 | pad=1 71 | activation=leaky 72 | 73 | [convolutional] 74 | batch_normalize=1 75 | filters=64 76 | size=1 77 | stride=1 78 | pad=1 79 | activation=leaky 80 | 81 | [convolutional] 82 | batch_normalize=1 83 | filters=128 84 | size=3 85 | stride=1 86 | pad=1 87 | activation=leaky 88 | 89 | [shortcut] 90 | from=-3 91 | activation=linear 92 | 93 | [convolutional] 94 | batch_normalize=1 95 | filters=64 96 | size=1 97 | stride=1 98 | pad=1 99 | activation=leaky 100 | 101 | [convolutional] 102 | batch_normalize=1 103 | filters=128 104 | size=3 105 | stride=1 106 | pad=1 107 | activation=leaky 108 | 109 | [shortcut] 110 | from=-3 111 | activation=linear 112 | 113 | # Downsample 114 | 115 | [convolutional] 116 | batch_normalize=1 117 | filters=256 118 | size=3 119 | stride=2 120 | pad=1 121 | activation=leaky 122 | 123 | [convolutional] 124 | batch_normalize=1 125 | filters=128 126 | size=1 127 | stride=1 128 | pad=1 129 | activation=leaky 130 | 131 | [convolutional] 132 | batch_normalize=1 133 | filters=256 134 | size=3 135 | stride=1 136 | pad=1 137 | activation=leaky 138 | 139 | [shortcut] 140 | from=-3 141 | activation=linear 142 | 143 | [convolutional] 144 | batch_normalize=1 145 | filters=128 146 | size=1 147 | stride=1 148 | pad=1 149 | activation=leaky 150 | 151 | [convolutional] 152 | batch_normalize=1 153 | filters=256 154 | size=3 155 | stride=1 156 | pad=1 157 | activation=leaky 158 | 159 | [shortcut] 160 | from=-3 161 | activation=linear 162 | 163 | [convolutional] 164 | batch_normalize=1 165 | filters=128 166 | size=1 167 | stride=1 168 | pad=1 169 | activation=leaky 170 | 171 | [convolutional] 172 | batch_normalize=1 173 | filters=256 174 | size=3 175 | stride=1 176 | pad=1 177 | activation=leaky 178 | 179 | [shortcut] 180 | from=-3 181 | activation=linear 182 | 183 | [convolutional] 184 | batch_normalize=1 185 | filters=128 186 | size=1 187 | stride=1 188 | pad=1 189 | activation=leaky 190 | 191 | [convolutional] 192 | batch_normalize=1 193 | filters=256 194 | size=3 195 | stride=1 196 | pad=1 197 | activation=leaky 198 | 199 | [shortcut] 200 | from=-3 201 | activation=linear 202 | 203 | 204 | [convolutional] 205 | batch_normalize=1 206 | filters=128 207 | size=1 208 | stride=1 209 | pad=1 210 | activation=leaky 211 | 212 | [convolutional] 213 | batch_normalize=1 214 | filters=256 215 | size=3 216 | stride=1 217 | pad=1 218 | activation=leaky 219 | 220 | [shortcut] 221 | from=-3 222 | activation=linear 223 | 224 | [convolutional] 225 | batch_normalize=1 226 | filters=128 227 | size=1 228 | stride=1 229 | pad=1 230 | activation=leaky 231 | 232 | [convolutional] 233 | batch_normalize=1 234 | filters=256 235 | size=3 236 | stride=1 237 | pad=1 238 | activation=leaky 239 | 240 | [shortcut] 241 | from=-3 242 | activation=linear 243 | 244 | [convolutional] 245 | batch_normalize=1 246 | filters=128 247 | size=1 248 | stride=1 249 | pad=1 250 | activation=leaky 251 | 252 | [convolutional] 253 | batch_normalize=1 254 | filters=256 255 | size=3 256 | stride=1 257 | pad=1 258 | activation=leaky 259 | 260 | [shortcut] 261 | from=-3 262 | activation=linear 263 | 264 | [convolutional] 265 | batch_normalize=1 266 | filters=128 267 | size=1 268 | stride=1 269 | pad=1 270 | activation=leaky 271 | 272 | [convolutional] 273 | batch_normalize=1 274 | filters=256 275 | size=3 276 | stride=1 277 | pad=1 278 | activation=leaky 279 | 280 | [shortcut] 281 | from=-3 282 | activation=linear 283 | 284 | # Downsample 285 | 286 | [convolutional] 287 | batch_normalize=1 288 | filters=512 289 | size=3 290 | stride=2 291 | pad=1 292 | activation=leaky 293 | 294 | [convolutional] 295 | batch_normalize=1 296 | filters=256 297 | size=1 298 | stride=1 299 | pad=1 300 | activation=leaky 301 | 302 | [convolutional] 303 | batch_normalize=1 304 | filters=512 305 | size=3 306 | stride=1 307 | pad=1 308 | activation=leaky 309 | 310 | [shortcut] 311 | from=-3 312 | activation=linear 313 | 314 | 315 | [convolutional] 316 | batch_normalize=1 317 | filters=256 318 | size=1 319 | stride=1 320 | pad=1 321 | activation=leaky 322 | 323 | [convolutional] 324 | batch_normalize=1 325 | filters=512 326 | size=3 327 | stride=1 328 | pad=1 329 | activation=leaky 330 | 331 | [shortcut] 332 | from=-3 333 | activation=linear 334 | 335 | 336 | [convolutional] 337 | batch_normalize=1 338 | filters=256 339 | size=1 340 | stride=1 341 | pad=1 342 | activation=leaky 343 | 344 | [convolutional] 345 | batch_normalize=1 346 | filters=512 347 | size=3 348 | stride=1 349 | pad=1 350 | activation=leaky 351 | 352 | [shortcut] 353 | from=-3 354 | activation=linear 355 | 356 | 357 | [convolutional] 358 | batch_normalize=1 359 | filters=256 360 | size=1 361 | stride=1 362 | pad=1 363 | activation=leaky 364 | 365 | [convolutional] 366 | batch_normalize=1 367 | filters=512 368 | size=3 369 | stride=1 370 | pad=1 371 | activation=leaky 372 | 373 | [shortcut] 374 | from=-3 375 | activation=linear 376 | 377 | [convolutional] 378 | batch_normalize=1 379 | filters=256 380 | size=1 381 | stride=1 382 | pad=1 383 | activation=leaky 384 | 385 | [convolutional] 386 | batch_normalize=1 387 | filters=512 388 | size=3 389 | stride=1 390 | pad=1 391 | activation=leaky 392 | 393 | [shortcut] 394 | from=-3 395 | activation=linear 396 | 397 | 398 | [convolutional] 399 | batch_normalize=1 400 | filters=256 401 | size=1 402 | stride=1 403 | pad=1 404 | activation=leaky 405 | 406 | [convolutional] 407 | batch_normalize=1 408 | filters=512 409 | size=3 410 | stride=1 411 | pad=1 412 | activation=leaky 413 | 414 | [shortcut] 415 | from=-3 416 | activation=linear 417 | 418 | 419 | [convolutional] 420 | batch_normalize=1 421 | filters=256 422 | size=1 423 | stride=1 424 | pad=1 425 | activation=leaky 426 | 427 | [convolutional] 428 | batch_normalize=1 429 | filters=512 430 | size=3 431 | stride=1 432 | pad=1 433 | activation=leaky 434 | 435 | [shortcut] 436 | from=-3 437 | activation=linear 438 | 439 | [convolutional] 440 | batch_normalize=1 441 | filters=256 442 | size=1 443 | stride=1 444 | pad=1 445 | activation=leaky 446 | 447 | [convolutional] 448 | batch_normalize=1 449 | filters=512 450 | size=3 451 | stride=1 452 | pad=1 453 | activation=leaky 454 | 455 | [shortcut] 456 | from=-3 457 | activation=linear 458 | 459 | # Downsample 460 | 461 | [convolutional] 462 | batch_normalize=1 463 | filters=1024 464 | size=3 465 | stride=2 466 | pad=1 467 | activation=leaky 468 | 469 | [convolutional] 470 | batch_normalize=1 471 | filters=512 472 | size=1 473 | stride=1 474 | pad=1 475 | activation=leaky 476 | 477 | [convolutional] 478 | batch_normalize=1 479 | filters=1024 480 | size=3 481 | stride=1 482 | pad=1 483 | activation=leaky 484 | 485 | [shortcut] 486 | from=-3 487 | activation=linear 488 | 489 | [convolutional] 490 | batch_normalize=1 491 | filters=512 492 | size=1 493 | stride=1 494 | pad=1 495 | activation=leaky 496 | 497 | [convolutional] 498 | batch_normalize=1 499 | filters=1024 500 | size=3 501 | stride=1 502 | pad=1 503 | activation=leaky 504 | 505 | [shortcut] 506 | from=-3 507 | activation=linear 508 | 509 | [convolutional] 510 | batch_normalize=1 511 | filters=512 512 | size=1 513 | stride=1 514 | pad=1 515 | activation=leaky 516 | 517 | [convolutional] 518 | batch_normalize=1 519 | filters=1024 520 | size=3 521 | stride=1 522 | pad=1 523 | activation=leaky 524 | 525 | [shortcut] 526 | from=-3 527 | activation=linear 528 | 529 | [convolutional] 530 | batch_normalize=1 531 | filters=512 532 | size=1 533 | stride=1 534 | pad=1 535 | activation=leaky 536 | 537 | [convolutional] 538 | batch_normalize=1 539 | filters=1024 540 | size=3 541 | stride=1 542 | pad=1 543 | activation=leaky 544 | 545 | [shortcut] 546 | from=-3 547 | activation=linear 548 | 549 | ###################### 550 | 551 | [convolutional] 552 | batch_normalize=1 553 | filters=512 554 | size=1 555 | stride=1 556 | pad=1 557 | activation=leaky 558 | 559 | [convolutional] 560 | batch_normalize=1 561 | size=3 562 | stride=1 563 | pad=1 564 | filters=1024 565 | activation=leaky 566 | 567 | [convolutional] 568 | batch_normalize=1 569 | filters=512 570 | size=1 571 | stride=1 572 | pad=1 573 | activation=leaky 574 | 575 | [convolutional] 576 | batch_normalize=1 577 | size=3 578 | stride=1 579 | pad=1 580 | filters=1024 581 | activation=leaky 582 | 583 | [convolutional] 584 | batch_normalize=1 585 | filters=512 586 | size=1 587 | stride=1 588 | pad=1 589 | activation=leaky 590 | 591 | [convolutional] 592 | batch_normalize=1 593 | size=3 594 | stride=1 595 | pad=1 596 | filters=1024 597 | activation=leaky 598 | 599 | [convolutional] 600 | size=1 601 | stride=1 602 | pad=1 603 | filters=42 604 | activation=linear 605 | 606 | 607 | [yolo] 608 | mask = 6,7,8 609 | anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 610 | classes=9 611 | num=9 612 | jitter=.3 613 | ignore_thresh = .7 614 | truth_thresh = 1 615 | random=1 616 | 617 | 618 | [route] 619 | layers = -4 620 | 621 | [convolutional] 622 | batch_normalize=1 623 | filters=256 624 | size=1 625 | stride=1 626 | pad=1 627 | activation=leaky 628 | 629 | [upsample] 630 | stride=2 631 | 632 | [route] 633 | layers = -1, 61 634 | 635 | 636 | 637 | [convolutional] 638 | batch_normalize=1 639 | filters=256 640 | size=1 641 | stride=1 642 | pad=1 643 | activation=leaky 644 | 645 | [convolutional] 646 | batch_normalize=1 647 | size=3 648 | stride=1 649 | pad=1 650 | filters=512 651 | activation=leaky 652 | 653 | [convolutional] 654 | batch_normalize=1 655 | filters=256 656 | size=1 657 | stride=1 658 | pad=1 659 | activation=leaky 660 | 661 | [convolutional] 662 | batch_normalize=1 663 | size=3 664 | stride=1 665 | pad=1 666 | filters=512 667 | activation=leaky 668 | 669 | [convolutional] 670 | batch_normalize=1 671 | filters=256 672 | size=1 673 | stride=1 674 | pad=1 675 | activation=leaky 676 | 677 | [convolutional] 678 | batch_normalize=1 679 | size=3 680 | stride=1 681 | pad=1 682 | filters=512 683 | activation=leaky 684 | 685 | [convolutional] 686 | size=1 687 | stride=1 688 | pad=1 689 | filters=42 690 | activation=linear 691 | 692 | 693 | [yolo] 694 | mask = 3,4,5 695 | anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 696 | classes=9 697 | num=9 698 | jitter=.3 699 | ignore_thresh = .7 700 | truth_thresh = 1 701 | random=1 702 | 703 | 704 | 705 | [route] 706 | layers = -4 707 | 708 | [convolutional] 709 | batch_normalize=1 710 | filters=128 711 | size=1 712 | stride=1 713 | pad=1 714 | activation=leaky 715 | 716 | [upsample] 717 | stride=2 718 | 719 | [route] 720 | layers = -1, 36 721 | 722 | 723 | 724 | [convolutional] 725 | batch_normalize=1 726 | filters=128 727 | size=1 728 | stride=1 729 | pad=1 730 | activation=leaky 731 | 732 | [convolutional] 733 | batch_normalize=1 734 | size=3 735 | stride=1 736 | pad=1 737 | filters=256 738 | activation=leaky 739 | 740 | [convolutional] 741 | batch_normalize=1 742 | filters=128 743 | size=1 744 | stride=1 745 | pad=1 746 | activation=leaky 747 | 748 | [convolutional] 749 | batch_normalize=1 750 | size=3 751 | stride=1 752 | pad=1 753 | filters=256 754 | activation=leaky 755 | 756 | [convolutional] 757 | batch_normalize=1 758 | filters=128 759 | size=1 760 | stride=1 761 | pad=1 762 | activation=leaky 763 | 764 | [convolutional] 765 | batch_normalize=1 766 | size=3 767 | stride=1 768 | pad=1 769 | filters=256 770 | activation=leaky 771 | 772 | [convolutional] 773 | size=1 774 | stride=1 775 | pad=1 776 | filters=42 777 | activation=linear 778 | 779 | 780 | [yolo] 781 | mask = 0,1,2 782 | anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 783 | classes=9 784 | num=9 785 | jitter=.3 786 | ignore_thresh = .7 787 | truth_thresh = 1 788 | random=1 789 | -------------------------------------------------------------------------------- /utils/utils.py: -------------------------------------------------------------------------------- 1 | from __future__ import division 2 | import math 3 | import time 4 | import tqdm 5 | import torch 6 | import torch.nn as nn 7 | import torch.nn.functional as F 8 | from torch.autograd import Variable 9 | import numpy as np 10 | import matplotlib.pyplot as plt 11 | import matplotlib.patches as patches 12 | 13 | 14 | def to_cpu(tensor): 15 | return tensor.detach().cpu() 16 | 17 | 18 | def load_classes(path): 19 | """ 20 | Loads class labels at 'path' 21 | """ 22 | fp = open(path, "r", encoding='utf-8') 23 | names = fp.read().split("\n")[:-1] 24 | return names 25 | 26 | 27 | def weights_init_normal(m): 28 | classname = m.__class__.__name__ 29 | if classname.find("Conv") != -1: 30 | torch.nn.init.normal_(m.weight.data, 0.0, 0.02) 31 | elif classname.find("BatchNorm2d") != -1: 32 | torch.nn.init.normal_(m.weight.data, 1.0, 0.02) 33 | torch.nn.init.constant_(m.bias.data, 0.0) 34 | 35 | 36 | def rescale_boxes(boxes, current_dim, original_shape): 37 | """ Rescales bounding boxes to the original shape """ 38 | orig_h, orig_w = original_shape 39 | # The amount of padding that was added 40 | pad_x = max(orig_h - orig_w, 0) * (current_dim / max(original_shape)) 41 | pad_y = max(orig_w - orig_h, 0) * (current_dim / max(original_shape)) 42 | # Image height and width after padding is removed 43 | unpad_h = current_dim - pad_y 44 | unpad_w = current_dim - pad_x 45 | # Rescale bounding boxes to dimension of original image 46 | boxes[:, 0] = ((boxes[:, 0] - pad_x // 2) / unpad_w) * orig_w 47 | boxes[:, 1] = ((boxes[:, 1] - pad_y // 2) / unpad_h) * orig_h 48 | boxes[:, 2] = ((boxes[:, 2] - pad_x // 2) / unpad_w) * orig_w 49 | boxes[:, 3] = ((boxes[:, 3] - pad_y // 2) / unpad_h) * orig_h 50 | return boxes 51 | 52 | 53 | def xywh2xyxy(x): 54 | y = x.new(x.shape) 55 | y[..., 0] = x[..., 0] - x[..., 2] / 2 56 | y[..., 1] = x[..., 1] - x[..., 3] / 2 57 | y[..., 2] = x[..., 0] + x[..., 2] / 2 58 | y[..., 3] = x[..., 1] + x[..., 3] / 2 59 | return y 60 | 61 | 62 | def ap_per_class(tp, conf, pred_cls, target_cls): 63 | """ Compute the average precision, given the recall and precision curves. 64 | Source: https://github.com/rafaelpadilla/Object-Detection-Metrics. 65 | # Arguments 66 | tp: True positives (list). 67 | conf: Objectness value from 0-1 (list). 68 | pred_cls: Predicted object classes (list). 69 | target_cls: True object classes (list). 70 | # Returns 71 | The average precision as computed in py-faster-rcnn. 72 | """ 73 | 74 | # Sort by objectness 75 | i = np.argsort(-conf) 76 | tp, conf, pred_cls = tp[i], conf[i], pred_cls[i] 77 | 78 | # Find unique classes 79 | unique_classes = np.unique(target_cls) 80 | 81 | # Create Precision-Recall curve and compute AP for each class 82 | ap, p, r = [], [], [] 83 | for c in tqdm.tqdm(unique_classes, desc="Computing AP"): 84 | i = pred_cls == c 85 | n_gt = (target_cls == c).sum() # Number of ground truth objects 86 | n_p = i.sum() # Number of predicted objects 87 | 88 | if n_p == 0 and n_gt == 0: 89 | continue 90 | elif n_p == 0 or n_gt == 0: 91 | ap.append(0) 92 | r.append(0) 93 | p.append(0) 94 | else: 95 | # Accumulate FPs and TPs 96 | fpc = (1 - tp[i]).cumsum() 97 | tpc = (tp[i]).cumsum() 98 | 99 | # Recall 100 | recall_curve = tpc / (n_gt + 1e-16) 101 | r.append(recall_curve[-1]) 102 | 103 | # Precision 104 | precision_curve = tpc / (tpc + fpc) 105 | p.append(precision_curve[-1]) 106 | 107 | # AP from recall-precision curve 108 | ap.append(compute_ap(recall_curve, precision_curve)) 109 | 110 | # Compute F1 score (harmonic mean of precision and recall) 111 | p, r, ap = np.array(p), np.array(r), np.array(ap) 112 | f1 = 2 * p * r / (p + r + 1e-16) 113 | 114 | return p, r, ap, f1, unique_classes.astype("int32") 115 | 116 | 117 | def compute_ap(recall, precision): 118 | """ Compute the average precision, given the recall and precision curves. 119 | Code originally from https://github.com/rbgirshick/py-faster-rcnn. 120 | 121 | # Arguments 122 | recall: The recall curve (list). 123 | precision: The precision curve (list). 124 | # Returns 125 | The average precision as computed in py-faster-rcnn. 126 | """ 127 | # correct AP calculation 128 | # first append sentinel values at the end 129 | mrec = np.concatenate(([0.0], recall, [1.0])) 130 | mpre = np.concatenate(([0.0], precision, [0.0])) 131 | 132 | # compute the precision envelope 133 | for i in range(mpre.size - 1, 0, -1): 134 | mpre[i - 1] = np.maximum(mpre[i - 1], mpre[i]) 135 | 136 | # to calculate area under PR curve, look for points 137 | # where X axis (recall) changes value 138 | i = np.where(mrec[1:] != mrec[:-1])[0] 139 | 140 | # and sum (\Delta recall) * prec 141 | ap = np.sum((mrec[i + 1] - mrec[i]) * mpre[i + 1]) 142 | return ap 143 | 144 | 145 | def get_batch_statistics(outputs, targets, iou_threshold): 146 | """ Compute true positives, predicted scores and predicted labels per sample """ 147 | batch_metrics = [] 148 | for sample_i in range(len(outputs)): 149 | 150 | if outputs[sample_i] is None: 151 | continue 152 | 153 | output = outputs[sample_i] 154 | pred_boxes = output[:, :4] 155 | pred_scores = output[:, 4] 156 | pred_labels = output[:, -1] 157 | 158 | true_positives = np.zeros(pred_boxes.shape[0]) 159 | 160 | annotations = targets[targets[:, 0] == sample_i][:, 1:] 161 | target_labels = annotations[:, 0] if len(annotations) else [] 162 | if len(annotations): 163 | detected_boxes = [] 164 | target_boxes = annotations[:, 1:] 165 | 166 | for pred_i, (pred_box, pred_label) in enumerate(zip(pred_boxes, pred_labels)): 167 | 168 | # If targets are found break 169 | if len(detected_boxes) == len(annotations): 170 | break 171 | 172 | # Ignore if label is not one of the target labels 173 | if pred_label not in target_labels: 174 | continue 175 | 176 | iou, box_index = bbox_iou( 177 | pred_box.unsqueeze(0), target_boxes).max(0) 178 | if iou >= iou_threshold and box_index not in detected_boxes: 179 | true_positives[pred_i] = 1 180 | detected_boxes += [box_index] 181 | print("index", pred_i) 182 | print("位置信息", pred_box[box_index]) 183 | batch_metrics.append([true_positives, pred_scores, pred_labels]) 184 | return batch_metrics 185 | 186 | 187 | def bbox_wh_iou(wh1, wh2): 188 | wh2 = wh2.t() 189 | w1, h1 = wh1[0], wh1[1] 190 | w2, h2 = wh2[0], wh2[1] 191 | inter_area = torch.min(w1, w2) * torch.min(h1, h2) 192 | union_area = (w1 * h1 + 1e-16) + w2 * h2 - inter_area 193 | return inter_area / union_area 194 | 195 | 196 | def bbox_iou(box1, box2, x1y1x2y2=True): 197 | """ 198 | Returns the IoU of two bounding boxes 199 | """ 200 | if not x1y1x2y2: 201 | # Transform from center and width to exact coordinates 202 | b1_x1, b1_x2 = box1[:, 0] - box1[:, 2] / 2, box1[:, 0] + box1[:, 2] / 2 203 | b1_y1, b1_y2 = box1[:, 1] - box1[:, 3] / 2, box1[:, 1] + box1[:, 3] / 2 204 | b2_x1, b2_x2 = box2[:, 0] - box2[:, 2] / 2, box2[:, 0] + box2[:, 2] / 2 205 | b2_y1, b2_y2 = box2[:, 1] - box2[:, 3] / 2, box2[:, 1] + box2[:, 3] / 2 206 | else: 207 | # Get the coordinates of bounding boxes 208 | b1_x1, b1_y1, b1_x2, b1_y2 = box1[:, 209 | 0], box1[:, 1], box1[:, 2], box1[:, 3] 210 | b2_x1, b2_y1, b2_x2, b2_y2 = box2[:, 211 | 0], box2[:, 1], box2[:, 2], box2[:, 3] 212 | 213 | # get the corrdinates of the intersection rectangle 214 | inter_rect_x1 = torch.max(b1_x1, b2_x1) 215 | inter_rect_y1 = torch.max(b1_y1, b2_y1) 216 | inter_rect_x2 = torch.min(b1_x2, b2_x2) 217 | inter_rect_y2 = torch.min(b1_y2, b2_y2) 218 | # Intersection area 219 | inter_area = torch.clamp(inter_rect_x2 - inter_rect_x1 + 1, min=0) * torch.clamp( 220 | inter_rect_y2 - inter_rect_y1 + 1, min=0 221 | ) 222 | # Union Area 223 | b1_area = (b1_x2 - b1_x1 + 1) * (b1_y2 - b1_y1 + 1) 224 | b2_area = (b2_x2 - b2_x1 + 1) * (b2_y2 - b2_y1 + 1) 225 | 226 | iou = inter_area / (b1_area + b2_area - inter_area + 1e-16) 227 | 228 | return iou 229 | 230 | 231 | def non_max_suppression(prediction, conf_thres=0.5, nms_thres=0.4): 232 | """ 233 | Removes detections with lower object confidence score than 'conf_thres' and performs 234 | Non-Maximum Suppression to further filter detections. 235 | Returns detections with shape: 236 | (x1, y1, x2, y2, object_conf, class_score, class_pred) 237 | """ 238 | 239 | # From (center x, center y, width, height) to (x1, y1, x2, y2) 240 | prediction[..., :4] = xywh2xyxy(prediction[..., :4]) 241 | output = [None for _ in range(len(prediction))] 242 | for image_i, image_pred in enumerate(prediction): 243 | # Filter out confidence scores below threshold 244 | image_pred = image_pred[image_pred[:, 4] >= conf_thres] 245 | # If none are remaining => process next image 246 | if not image_pred.size(0): 247 | continue 248 | # Object confidence times class confidence 249 | score = image_pred[:, 4] * image_pred[:, 5:].max(1)[0] 250 | # Sort by it 251 | image_pred = image_pred[(-score).argsort()] 252 | class_confs, class_preds = image_pred[:, 5:].max(1, keepdim=True) 253 | detections = torch.cat( 254 | (image_pred[:, :5], class_confs.float(), class_preds.float()), 1) 255 | # Perform non-maximum suppression 256 | keep_boxes = [] 257 | while detections.size(0): 258 | large_overlap = bbox_iou(detections[0, :4].unsqueeze( 259 | 0), detections[:, :4]) > nms_thres 260 | label_match = detections[0, -1] == detections[:, -1] 261 | # Indices of boxes with lower confidence scores, large IOUs and matching labels 262 | invalid = large_overlap & label_match 263 | weights = detections[invalid, 4:5] 264 | # Merge overlapping bboxes by order of confidence 265 | detections[0, :4] = ( 266 | weights * detections[invalid, :4]).sum(0) / weights.sum() 267 | keep_boxes += [detections[0]] 268 | detections = detections[~invalid] 269 | if keep_boxes: 270 | output[image_i] = torch.stack(keep_boxes) 271 | 272 | return output 273 | 274 | 275 | def build_targets(pred_boxes, pred_cls, target, anchors, ignore_thres): 276 | 277 | ByteTensor = torch.cuda.ByteTensor if pred_boxes.is_cuda else torch.ByteTensor 278 | FloatTensor = torch.cuda.FloatTensor if pred_boxes.is_cuda else torch.FloatTensor 279 | 280 | nB = pred_boxes.size(0) 281 | nA = pred_boxes.size(1) 282 | nC = pred_cls.size(-1) 283 | nG = pred_boxes.size(2) 284 | 285 | # Output tensors 286 | obj_mask = ByteTensor(nB, nA, nG, nG).fill_(0) 287 | noobj_mask = ByteTensor(nB, nA, nG, nG).fill_(1) 288 | class_mask = FloatTensor(nB, nA, nG, nG).fill_(0) 289 | iou_scores = FloatTensor(nB, nA, nG, nG).fill_(0) 290 | tx = FloatTensor(nB, nA, nG, nG).fill_(0) 291 | ty = FloatTensor(nB, nA, nG, nG).fill_(0) 292 | tw = FloatTensor(nB, nA, nG, nG).fill_(0) 293 | th = FloatTensor(nB, nA, nG, nG).fill_(0) 294 | tcls = FloatTensor(nB, nA, nG, nG, nC).fill_(0) 295 | 296 | # Convert to position relative to box 297 | target_boxes = target[:, 2:6] * nG 298 | gxy = target_boxes[:, :2] 299 | gwh = target_boxes[:, 2:] 300 | # Get anchors with best iou 301 | ious = torch.stack([bbox_wh_iou(anchor, gwh) for anchor in anchors]) 302 | best_ious, best_n = ious.max(0) 303 | # Separate target values 304 | b, target_labels = target[:, :2].long().t() 305 | gx, gy = gxy.t() 306 | gw, gh = gwh.t() 307 | gi, gj = gxy.long().t() 308 | # Set masks 309 | obj_mask[b, best_n, gj, gi] = 1 310 | noobj_mask[b, best_n, gj, gi] = 0 311 | 312 | # Set noobj mask to zero where iou exceeds ignore threshold 313 | for i, anchor_ious in enumerate(ious.t()): 314 | noobj_mask[b[i], anchor_ious > ignore_thres, gj[i], gi[i]] = 0 315 | 316 | # Coordinates 317 | tx[b, best_n, gj, gi] = gx - gx.floor() 318 | ty[b, best_n, gj, gi] = gy - gy.floor() 319 | # Width and height 320 | tw[b, best_n, gj, gi] = torch.log(gw / anchors[best_n][:, 0] + 1e-16) 321 | th[b, best_n, gj, gi] = torch.log(gh / anchors[best_n][:, 1] + 1e-16) 322 | # One-hot encoding of label 323 | tcls[b, best_n, gj, gi, target_labels] = 1 324 | # Compute label correctness and iou at best anchor 325 | class_mask[b, best_n, gj, gi] = ( 326 | pred_cls[b, best_n, gj, gi].argmax(-1) == target_labels).float() 327 | iou_scores[b, best_n, gj, gi] = bbox_iou( 328 | pred_boxes[b, best_n, gj, gi], target_boxes, x1y1x2y2=False) 329 | 330 | tconf = obj_mask.float() 331 | return iou_scores, class_mask, obj_mask, noobj_mask, tx, ty, tw, th, tcls, tconf 332 | -------------------------------------------------------------------------------- /models.py: -------------------------------------------------------------------------------- 1 | from __future__ import division 2 | 3 | import torch 4 | import torch.nn as nn 5 | import torch.nn.functional as F 6 | from torch.autograd import Variable 7 | import numpy as np 8 | 9 | from utils.parse_config import * 10 | from utils.utils import build_targets, to_cpu, non_max_suppression 11 | 12 | import matplotlib.pyplot as plt 13 | import matplotlib.patches as patches 14 | 15 | 16 | def create_modules(module_defs): 17 | """ 18 | Constructs module list of layer blocks from module configuration in module_defs 19 | """ 20 | hyperparams = module_defs.pop(0) 21 | output_filters = [int(hyperparams["channels"])] 22 | module_list = nn.ModuleList() 23 | for module_i, module_def in enumerate(module_defs): 24 | modules = nn.Sequential() 25 | 26 | if module_def["type"] == "convolutional": 27 | bn = int(module_def["batch_normalize"]) 28 | filters = int(module_def["filters"]) 29 | kernel_size = int(module_def["size"]) 30 | pad = (kernel_size - 1) // 2 31 | modules.add_module( 32 | f"conv_{module_i}", 33 | nn.Conv2d( 34 | in_channels=output_filters[-1], 35 | out_channels=filters, 36 | kernel_size=kernel_size, 37 | stride=int(module_def["stride"]), 38 | padding=pad, 39 | bias=not bn, 40 | ), 41 | ) 42 | if bn: 43 | modules.add_module(f"batch_norm_{module_i}", nn.BatchNorm2d(filters, momentum=0.9, eps=1e-5)) 44 | if module_def["activation"] == "leaky": 45 | modules.add_module(f"leaky_{module_i}", nn.LeakyReLU(0.1)) 46 | 47 | elif module_def["type"] == "maxpool": 48 | kernel_size = int(module_def["size"]) 49 | stride = int(module_def["stride"]) 50 | if kernel_size == 2 and stride == 1: 51 | modules.add_module(f"_debug_padding_{module_i}", nn.ZeroPad2d((0, 1, 0, 1))) 52 | maxpool = nn.MaxPool2d(kernel_size=kernel_size, stride=stride, padding=int((kernel_size - 1) // 2)) 53 | modules.add_module(f"maxpool_{module_i}", maxpool) 54 | 55 | elif module_def["type"] == "upsample": 56 | upsample = Upsample(scale_factor=int(module_def["stride"]), mode="nearest") 57 | modules.add_module(f"upsample_{module_i}", upsample) 58 | 59 | elif module_def["type"] == "route": 60 | layers = [int(x) for x in module_def["layers"].split(",")] 61 | filters = sum([output_filters[1:][i] for i in layers]) 62 | modules.add_module(f"route_{module_i}", EmptyLayer()) 63 | 64 | elif module_def["type"] == "shortcut": 65 | filters = output_filters[1:][int(module_def["from"])] 66 | modules.add_module(f"shortcut_{module_i}", EmptyLayer()) 67 | 68 | elif module_def["type"] == "yolo": 69 | anchor_idxs = [int(x) for x in module_def["mask"].split(",")] 70 | # Extract anchors 71 | anchors = [int(x) for x in module_def["anchors"].split(",")] 72 | anchors = [(anchors[i], anchors[i + 1]) for i in range(0, len(anchors), 2)] 73 | anchors = [anchors[i] for i in anchor_idxs] 74 | num_classes = int(module_def["classes"]) 75 | img_size = int(hyperparams["height"]) 76 | # Define detection layer 77 | yolo_layer = YOLOLayer(anchors, num_classes, img_size) 78 | modules.add_module(f"yolo_{module_i}", yolo_layer) 79 | # Register module list and number of output filters 80 | module_list.append(modules) 81 | output_filters.append(filters) 82 | 83 | return hyperparams, module_list 84 | 85 | 86 | class Upsample(nn.Module): 87 | """ nn.Upsample is deprecated """ 88 | 89 | def __init__(self, scale_factor, mode="nearest"): 90 | super(Upsample, self).__init__() 91 | self.scale_factor = scale_factor 92 | self.mode = mode 93 | 94 | def forward(self, x): 95 | x = F.interpolate(x, scale_factor=self.scale_factor, mode=self.mode) 96 | return x 97 | 98 | 99 | class EmptyLayer(nn.Module): 100 | """Placeholder for 'route' and 'shortcut' layers""" 101 | 102 | def __init__(self): 103 | super(EmptyLayer, self).__init__() 104 | 105 | 106 | class YOLOLayer(nn.Module): 107 | """Detection layer""" 108 | 109 | def __init__(self, anchors, num_classes, img_dim=416): 110 | super(YOLOLayer, self).__init__() 111 | self.anchors = anchors 112 | self.num_anchors = len(anchors) 113 | self.num_classes = num_classes 114 | self.ignore_thres = 0.5 115 | self.mse_loss = nn.MSELoss() 116 | self.bce_loss = nn.BCELoss() 117 | self.obj_scale = 1 118 | self.noobj_scale = 100 119 | self.metrics = {} 120 | self.img_dim = img_dim 121 | self.grid_size = 0 # grid size 122 | 123 | def compute_grid_offsets(self, grid_size, cuda=True): 124 | self.grid_size = grid_size 125 | g = self.grid_size 126 | FloatTensor = torch.cuda.FloatTensor if cuda else torch.FloatTensor 127 | self.stride = self.img_dim / self.grid_size 128 | # Calculate offsets for each grid 129 | self.grid_x = torch.arange(g).repeat(g, 1).view([1, 1, g, g]).type(FloatTensor) 130 | self.grid_y = torch.arange(g).repeat(g, 1).t().view([1, 1, g, g]).type(FloatTensor) 131 | self.scaled_anchors = FloatTensor([(a_w / self.stride, a_h / self.stride) for a_w, a_h in self.anchors]) 132 | self.anchor_w = self.scaled_anchors[:, 0:1].view((1, self.num_anchors, 1, 1)) 133 | self.anchor_h = self.scaled_anchors[:, 1:2].view((1, self.num_anchors, 1, 1)) 134 | 135 | def forward(self, x, targets=None, img_dim=None): 136 | 137 | # Tensors for cuda support 138 | FloatTensor = torch.cuda.FloatTensor if x.is_cuda else torch.FloatTensor 139 | LongTensor = torch.cuda.LongTensor if x.is_cuda else torch.LongTensor 140 | ByteTensor = torch.cuda.ByteTensor if x.is_cuda else torch.ByteTensor 141 | 142 | self.img_dim = img_dim 143 | num_samples = x.size(0) 144 | grid_size = x.size(2) 145 | 146 | prediction = ( 147 | x.view(num_samples, self.num_anchors, self.num_classes + 5, grid_size, grid_size) 148 | .permute(0, 1, 3, 4, 2) 149 | .contiguous() 150 | ) 151 | 152 | # Get outputs 153 | x = torch.sigmoid(prediction[..., 0]) # Center x 154 | y = torch.sigmoid(prediction[..., 1]) # Center y 155 | w = prediction[..., 2] # Width 156 | h = prediction[..., 3] # Height 157 | pred_conf = torch.sigmoid(prediction[..., 4]) # Conf 158 | pred_cls = torch.sigmoid(prediction[..., 5:]) # Cls pred. 159 | 160 | # If grid size does not match current we compute new offsets 161 | if grid_size != self.grid_size: 162 | self.compute_grid_offsets(grid_size, cuda=x.is_cuda) 163 | 164 | # Add offset and scale with anchors 165 | pred_boxes = FloatTensor(prediction[..., :4].shape) 166 | pred_boxes[..., 0] = x.data + self.grid_x 167 | pred_boxes[..., 1] = y.data + self.grid_y 168 | pred_boxes[..., 2] = torch.exp(w.data) * self.anchor_w 169 | pred_boxes[..., 3] = torch.exp(h.data) * self.anchor_h 170 | 171 | output = torch.cat( 172 | ( 173 | pred_boxes.view(num_samples, -1, 4) * self.stride, 174 | pred_conf.view(num_samples, -1, 1), 175 | pred_cls.view(num_samples, -1, self.num_classes), 176 | ), 177 | -1, 178 | ) 179 | 180 | if targets is None: 181 | return output, 0 182 | else: 183 | iou_scores, class_mask, obj_mask, noobj_mask, tx, ty, tw, th, tcls, tconf = build_targets( 184 | pred_boxes=pred_boxes, 185 | pred_cls=pred_cls, 186 | target=targets, 187 | anchors=self.scaled_anchors, 188 | ignore_thres=self.ignore_thres, 189 | ) 190 | 191 | obj_mask=obj_mask.bool() # convert int8 to bool 192 | noobj_mask=noobj_mask.bool() 193 | 194 | # Loss : Mask outputs to ignore non-existing objects (except with conf. loss) 195 | loss_x = self.mse_loss(x[obj_mask], tx[obj_mask]) 196 | loss_y = self.mse_loss(y[obj_mask], ty[obj_mask]) 197 | loss_w = self.mse_loss(w[obj_mask], tw[obj_mask]) 198 | loss_h = self.mse_loss(h[obj_mask], th[obj_mask]) 199 | loss_conf_obj = self.bce_loss(pred_conf[obj_mask], tconf[obj_mask]) 200 | loss_conf_noobj = self.bce_loss(pred_conf[noobj_mask], tconf[noobj_mask]) 201 | loss_conf = self.obj_scale * loss_conf_obj + self.noobj_scale * loss_conf_noobj 202 | loss_cls = self.bce_loss(pred_cls[obj_mask], tcls[obj_mask]) 203 | total_loss = loss_x + loss_y + loss_w + loss_h + loss_conf + loss_cls 204 | 205 | # Metrics 206 | cls_acc = 100 * class_mask[obj_mask].mean() 207 | conf_obj = pred_conf[obj_mask].mean() 208 | conf_noobj = pred_conf[noobj_mask].mean() 209 | conf50 = (pred_conf > 0.5).float() 210 | iou50 = (iou_scores > 0.5).float() 211 | iou75 = (iou_scores > 0.75).float() 212 | detected_mask = conf50 * class_mask * tconf 213 | precision = torch.sum(iou50 * detected_mask) / (conf50.sum() + 1e-16) 214 | recall50 = torch.sum(iou50 * detected_mask) / (obj_mask.sum() + 1e-16) 215 | recall75 = torch.sum(iou75 * detected_mask) / (obj_mask.sum() + 1e-16) 216 | 217 | self.metrics = { 218 | "loss": to_cpu(total_loss).item(), 219 | "x": to_cpu(loss_x).item(), 220 | "y": to_cpu(loss_y).item(), 221 | "w": to_cpu(loss_w).item(), 222 | "h": to_cpu(loss_h).item(), 223 | "conf": to_cpu(loss_conf).item(), 224 | "cls": to_cpu(loss_cls).item(), 225 | "cls_acc": to_cpu(cls_acc).item(), 226 | "recall50": to_cpu(recall50).item(), 227 | "recall75": to_cpu(recall75).item(), 228 | "precision": to_cpu(precision).item(), 229 | "conf_obj": to_cpu(conf_obj).item(), 230 | "conf_noobj": to_cpu(conf_noobj).item(), 231 | "grid_size": grid_size, 232 | } 233 | 234 | return output, total_loss 235 | 236 | 237 | class Darknet(nn.Module): 238 | """YOLOv3 object detection model""" 239 | 240 | def __init__(self, config_path, img_size=416): 241 | super(Darknet, self).__init__() 242 | self.module_defs = parse_model_config(config_path) 243 | self.hyperparams, self.module_list = create_modules(self.module_defs) 244 | self.yolo_layers = [layer[0] for layer in self.module_list if hasattr(layer[0], "metrics")] 245 | self.img_size = img_size 246 | self.seen = 0 247 | self.header_info = np.array([0, 0, 0, self.seen, 0], dtype=np.int32) 248 | 249 | def forward(self, x, targets=None): 250 | img_dim = x.shape[2] 251 | loss = 0 252 | layer_outputs, yolo_outputs = [], [] 253 | for i, (module_def, module) in enumerate(zip(self.module_defs, self.module_list)): 254 | if module_def["type"] in ["convolutional", "upsample", "maxpool"]: 255 | x = module(x) 256 | elif module_def["type"] == "route": 257 | x = torch.cat([layer_outputs[int(layer_i)] for layer_i in module_def["layers"].split(",")], 1) 258 | elif module_def["type"] == "shortcut": 259 | layer_i = int(module_def["from"]) 260 | x = layer_outputs[-1] + layer_outputs[layer_i] 261 | elif module_def["type"] == "yolo": 262 | x, layer_loss = module[0](x, targets, img_dim) 263 | loss += layer_loss 264 | yolo_outputs.append(x) 265 | layer_outputs.append(x) 266 | yolo_outputs = to_cpu(torch.cat(yolo_outputs, 1)) 267 | return yolo_outputs if targets is None else (loss, yolo_outputs) 268 | 269 | def load_darknet_weights(self, weights_path): 270 | """Parses and loads the weights stored in 'weights_path'""" 271 | 272 | # Open the weights file 273 | with open(weights_path, "rb") as f: 274 | header = np.fromfile(f, dtype=np.int32, count=5) # First five are header values 275 | self.header_info = header # Needed to write header when saving weights 276 | self.seen = header[3] # number of images seen during training 277 | weights = np.fromfile(f, dtype=np.float32) # The rest are weights 278 | 279 | # Establish cutoff for loading backbone weights 280 | cutoff = None 281 | if "darknet53.conv.74" in weights_path: 282 | cutoff = 75 283 | 284 | ptr = 0 285 | for i, (module_def, module) in enumerate(zip(self.module_defs, self.module_list)): 286 | if i == cutoff: 287 | break 288 | if module_def["type"] == "convolutional": 289 | conv_layer = module[0] 290 | if module_def["batch_normalize"]: 291 | # Load BN bias, weights, running mean and running variance 292 | bn_layer = module[1] 293 | num_b = bn_layer.bias.numel() # Number of biases 294 | # Bias 295 | bn_b = torch.from_numpy(weights[ptr : ptr + num_b]).view_as(bn_layer.bias) 296 | bn_layer.bias.data.copy_(bn_b) 297 | ptr += num_b 298 | # Weight 299 | bn_w = torch.from_numpy(weights[ptr : ptr + num_b]).view_as(bn_layer.weight) 300 | bn_layer.weight.data.copy_(bn_w) 301 | ptr += num_b 302 | # Running Mean 303 | bn_rm = torch.from_numpy(weights[ptr : ptr + num_b]).view_as(bn_layer.running_mean) 304 | bn_layer.running_mean.data.copy_(bn_rm) 305 | ptr += num_b 306 | # Running Var 307 | bn_rv = torch.from_numpy(weights[ptr : ptr + num_b]).view_as(bn_layer.running_var) 308 | bn_layer.running_var.data.copy_(bn_rv) 309 | ptr += num_b 310 | else: 311 | # Load conv. bias 312 | num_b = conv_layer.bias.numel() 313 | conv_b = torch.from_numpy(weights[ptr : ptr + num_b]).view_as(conv_layer.bias) 314 | conv_layer.bias.data.copy_(conv_b) 315 | ptr += num_b 316 | # Load conv. weights 317 | num_w = conv_layer.weight.numel() 318 | conv_w = torch.from_numpy(weights[ptr : ptr + num_w]).view_as(conv_layer.weight) 319 | conv_layer.weight.data.copy_(conv_w) 320 | ptr += num_w 321 | 322 | def save_darknet_weights(self, path, cutoff=-1): 323 | """ 324 | @:param path - path of the new weights file 325 | @:param cutoff - save layers between 0 and cutoff (cutoff = -1 -> all are saved) 326 | """ 327 | fp = open(path, "wb") 328 | self.header_info[3] = self.seen 329 | self.header_info.tofile(fp) 330 | 331 | # Iterate through layers 332 | for i, (module_def, module) in enumerate(zip(self.module_defs[:cutoff], self.module_list[:cutoff])): 333 | if module_def["type"] == "convolutional": 334 | conv_layer = module[0] 335 | # If batch norm, load bn first 336 | if module_def["batch_normalize"]: 337 | bn_layer = module[1] 338 | bn_layer.bias.data.cpu().numpy().tofile(fp) 339 | bn_layer.weight.data.cpu().numpy().tofile(fp) 340 | bn_layer.running_mean.data.cpu().numpy().tofile(fp) 341 | bn_layer.running_var.data.cpu().numpy().tofile(fp) 342 | # Load conv bias 343 | else: 344 | conv_layer.bias.data.cpu().numpy().tofile(fp) 345 | # Load conv weights 346 | conv_layer.weight.data.cpu().numpy().tofile(fp) 347 | 348 | fp.close() 349 | -------------------------------------------------------------------------------- /tdc.js: -------------------------------------------------------------------------------- 1 | 2 | window = {} 3 | var window = {} 4 | 5 | window['Array'] = Array 6 | 7 | window.navigator = {} 8 | window.navigator.cookieEnabled = true 9 | window.location = {} 10 | window.location.href = "" 11 | window.getComputedStyle = function(){return {}} 12 | window.matchMedia = function(x){ 13 | return {media: x,matches:true} 14 | } 15 | var document = {} 16 | document.documentElement = {} 17 | document.charset = "UTF-8" 18 | window.innerWidth = 1920 19 | window.innerHeight = 937 20 | document.documentElement.clientWidth = 1903 21 | document.documentElement.clientHeight = 937 22 | document.body = {} 23 | document.body.clientWidth = 1903 24 | document.body.clientHeight = 1889 25 | document.body = {} 26 | document.body.clientWidth = 476 27 | document.body.clientHeight = 137 28 | document.createElement = function(){return []} 29 | navigator = {} 30 | navigator.userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36" 31 | screen = { 32 | availHeight: 1040, 33 | availLeft: 0, 34 | availTop: 0, 35 | availWidth: 1920, 36 | colorDepth: 24, 37 | height: 1080, 38 | left: 0, 39 | mozOrientation: "landscape-primary", 40 | onmozorientationchange: null, 41 | pixelDepth: 24, 42 | top: 0, 43 | width: 1920, 44 | orientation: {angle: 0,type: "landscape-primary"} 45 | } 46 | window.screen = screen 47 | document.createElement = function (x) { return [] } 48 | document.cookie = "TDC_itoken=1117279312%3A1587446300" 49 | 50 | 51 | !function(){var M="char",m="CodeA",N="o",n="deA",O="t",o="harCo",P="d",p=".sx,-q+",Q="Vmk",q="H",R="c`",r="s",S="^",s="9X",T="g>d04Z",t="a",U="U,",u="O",V="j;",v="3Pu3:.6B,A0h7",x=",",Y=">",y="]",Z="$A0=>",z="4",AA="Q",aA="M",BA=":;",bA="}",CA="9",cA="Sy",DA="7>",dA="l_",EA="*1",eA="-",FA=":Z",fA="WYS [OQ",hA=".Qch^i",IA=",*",kA="P",MA="s~/",mA="+",nA="??",oA="0O",pA="(",rA="h ",tA="L3EJ",wA="mUhr",XA="s",xA="`",ca="x",qA="Jyw",OA="=",PA="a",RA="B",UA="m",VA="(",WA="v+l*pQwl~s9^sznv+l*",ba="s",da="iSh",ea="Z",Fa="Kx",ga="d6)59-6",Ha="D",ha="y+1",Ia="+",ia="c",ja="l",la="*",Ma="T",ma="ElA",Na="+",na="QI",Ra="5",GA="aZgmhf",gA="c",HA="l",iA="}}ayr",JA="cs*",jA="KMV",KA="l6,/5",LA="rll",lA="-roq(v,r(l)p(v}",NA="{",QA="O",SA="/-X54/-x4",sA="YUSO",TA="S",uA="xyz}+y",vA="<",YA="m",yA="1",ZA="n",zA="tr-*",Aa="v",aa=",",Ba="y5AE9",Ca="5",Da="S[NXNGNQNY^",Ea="HM",fa="J",Ga="j1}-5b-",Ja="yv*Y~v",Ka="|",ka="U22",La="y|on",Oa="1v",ra="su,z0",Sa="vtn",sa="(",Ta="r",ta="EA",Va="^",va="3",Wa="ab",wa="`",Xa="l",xa="c",Ya="n.)/",ya=".",Za="]bm",za="IKQ",AB="A@",aB="6",BB="}",bB="H",CB="Q",cB="P]S,w{w(",DB="}wy|xzyz",dB="}",EB="xv+",eB="S",FB="^;",fB="b7",GB="`3",gB="8",HB="b",hB="WX",IB="`",iB="8",JB="w",jB="r===",KB="=",kB="hhhhhh",LB="3|",lB="o",MB="z",mB="5",NB="7h",nB="V",OB="W",oB="n",PB="C-",pB="JOM",QB="vn(",qB="xm",RB="DH",rB="e]:0 )-25~|",SB="{1.",sB=" */<3+6 9(",TB="oxwys",tB="p",UB="5",uB="?[",VB="PKhr",vB="ru",WB="i",wB="k",XB="0|w=GJJAEA",xB="G",YB=">",yB=")dud",ZB="3fw1w",zB="d",Ab="H{/--",ab="L",Bb="W",bb="NKr",Cb="G",cb="NL?",Db="?",db="2edje",Eb="kY^ijW",eb="h",Fb="j",fb="p",Gb=",",gb="A+)",Hb="5]",hb=")C",Ib="A",ib="Mu",Jb="V",jb="w",Kb="m",kb=")d",Lb="hr",lb="s",Mb="-",mb="9",Nb="^V",nb="_",Ob="THC",ob="8",Pb="0k",pb="l",Qb="Y",qb="y+",Rb="73",rb="xv.Ur",Sb=".",sb="r",Tb="P?=L",tb="s9",Ub="G1",ub="SaS",Vb="b",vb="/(1*7",Wb="(",wb="t",Xb="ou~",xb="(",Yb="t",yb="Y+Q",Zb="K",zb="(7^{",AC="{",aC="9b",BC=")",bC=">",CC=",",cC="*",DC="J-",dC="@HCA",EC="kg1",eC="/}",FC="+",fC="{",GC="N",gC="f_TeZ",HC="_",hC="W",IC="=[Z",iC="]X",JC="i",jC="ag",KC="f",kC="N",LC="?",lC="a9V`aR[R",MC="8",mC="*",NC="(n",nC="w",OC="r|{",oC="LMt",PC="Z,",pC="P",QC="$",qC="+[Ya(",RC="Y",rC="(",SC="t_O",sC="y",TC="V:FFBEcXX53BF5:3W9F;?9W5A",tC="?XBG4>;5",UC=">",uC="=",VC="oty",vC=",)",WC="|q2J~(~",wC="u",XC="c",xC="l[g_",YC="w",yC="N",ZC="[",zC="5678?@ABCDEFGHIJKLMNOPQRSTUVWXefghijklmn`",Ac="j?45",ac="f",Bc=";:;",bc="x",Cc="^",cc="T7",Dc="<5F",dc="9l",Ec="S",ec="/",Fc="D",fc="<",Gc="u",gc="[05.?",Hc="A",hc="nty",Ic="T)uv",ic="R",Jc="O?",jc="s",Kc="J",kc="Ov",Lc="K5",lc="T",Mc="y-4",mc="n?",Nc="7",nc=".",Oc="^ec",oc="o@",Pc="x",pc="8",Qc="9:;<=>?@ABCDEFGHIJKLMNUVWXY",qc="lx",Rc="m",rc="Em",Sc="[",sc="JJ",Tc="CLE",tc="R",Uc="`b",uc="O",Vc="`",vc="{-",Wc="}",wc="3",Xc="c",xc="T",Yc="G|z",yc="8",Zc="CRXQK",zc="CAmSclGRXb",AD="BG",aD="OJ",BD="eBJh",bD="f",CD="e6,~W",cD="C",DD="&z00i7.zRG&0zv1",dD="-,R",ED="2",eD="9",FD="G",fD="l&t",GD=",*6",gD="o",HD="{",hD="-",ID="=/-",iD="B";function JDjD(t){for(var r={tCCtu:function(n,t){return n-t},dNUKO:function(n,t){return n+t},IgZGs:function(n,t){return n+t},njITi:function(n,t){return n+t},dnGdz:"charC",PyEUk:function(n,t){return n<=t},aTSSo:function(n,t){return nI",XOsfG:function(n,t){return n(t)},DbLQJ:function(n,t){return n+t},tqxyE:function(n,t){return n+t},tJNhJ:function(n,t){return n+t},VDbfZ:function(n,t){return n+t},Fxxjx:function(n,t){return n+t},BfCrz:function(n,t){return n==t},gdvHm:function(n,t){return n+t},iaGvV:")L`bHmsd",VhCBV:function(n,t){return n(t)},ToQRg:function(n,t){return n+t},dZzFd:function(n,t){return n+t},yGZWA:function(n,t){return n(t)},mTcqb:"U*f",RZGvn:function(n,t){return n(t)},bJJzb:function(n,t){return n+t},IayAD:function(n,t){return n+t},eHzcL:"t^szn",XlXog:function(n,t){return n+t},gMwhV:function(n,t){return n+t},fcvUu:"pQwl",DEigy:"6EZaU",FBonN:')C"*7',xvWMd:function(n){return n()},sPbFm:function(n,t){return n(t)},gfwlA:function(n,t){return n(t)},rCxaD:function(n,t){return n+t},yckqA:function(n,t){return n(t)},xTAVO:function(n,t){return n+t},RMDaX:function(n,t){return n+t},NDZlX:function(n,t){return n+t},KHFPH:"kxy3}wy,/}",tjmWE:"u1},",tDrmM:function(n,t){return n(t)},YIOIN:function(n,t){return n(t)},lwCLi:function(n,t){return n(t)},LZBVM:function(n,t){return n+t},pKFKA:function(n,t){return n(t)},CxTiM:function(n,t){return n+t},NjVeP:function(n,t){return n+t},WwIpN:function(n,t){return n+t},tTEkG:"LIE GIF:Z_]R",GsFjr:function(n,t){return n(t)},KPJWC:function(n,t){return n(t)},jaBxT:"JNSQF",yfvRS:function(n,t){return n(t)},qChqJ:function(n,t){return n(t)},iTjjl:function(n,t){return n(t)},NXkof:function(n,t){return n(t)},TvTuH:"r}+)u",vjlYD:"7afdY",RiaVv:"WAFD9",mrfYE:"/inla",fbxJs:function(n,t){return n(t)},wXsQm:"o).,x",ptTbg:function(n,t){return n(t)},gOFce:"MKPNC",HGiqS:function(n,t){return n(t)},OkXCA:function(n,t){return n(t)},mLbEr:"b6;9.",QWNzr:"q~,*v",xRPoy:function(n,t){return n(t)},zIfkt:"DTYWL",RaiXi:function(n,t){return n(t)},MvupE:"i/42~",ZJAqi:function(n,t){return n(t)},UstWf:function(n,t){return n(t)},JYPcC:function(n,t){return n(t)},bPnyn:"2fki^",YSfpt:function(n,t){return n(t)},JGSof:function(n,t){return n(t)},TWEnu:function(n,t){return n(t)},gQqaY:"FRWUJ",YdoUZ:"PHMK@",FjiFw:function(n,t){return n(t)},MDyNK:function(n,t){return n(t)},xhKZR:"uz(}r",ocHtf:function(n,t){return n(t)},KSWTd:"+mrpe",kOovF:function(n,t){return n(t)},eliRL:function(n,t){return n(t)},ufVzi:function(n,t){return n(t)},AWubh:".jomb",NbJRy:"j.31}",cEWuS:function(n,t){return n(t)},XYwPc:function(n,t){return n(t)},eQSPI:function(n,t){return n(t)}},_0x144eb7=_0x396187.AIDbM,_0x1d4556=")",_0x2f0507=_0x396187.AklUi,_0x432ee8="^j",_0x41fdca="5",_0x205bfe="Ai",_0x38ec79=_0x396187.xQzlc,_0x5cb9d8="KF",_0x53f5d4="R",_0x555db1="s",_0x2cefcc="bQ",_0x2e594e="B",_0x287611="3",_0x438f5d=_0x396187.QfaBX,_0x452a98="^H",_0x5b1fc1=",",_0x567925="d",_0x18bd39="Y",_0x57d9d7="|",_0x54c2b7="4",_0xaf5797=_0x396187.FIQoM,_0x54f159="K",_0x425a73=_0x396187.ZMSfq,_0x5ba0f7=_0x396187.oxEYG,_0x4558d4="?",_0x2ea603="*",_0x5e9dad=_0x396187.yMwpd,_0x57f0a0="RR",_0x4fd2c3="P/AF<",_0x1555d5="H",_0x49e8a=_0x396187.qxIhl,_0xa204e=" A",_0x21b25c="+",_0x53c78e="B",_0x20f168="D",_0x17e15c=_0x396187.DbLFa,_0x22df58="=",_0x22aeb5=_0x396187.DFOah,_0x157928="D",_0x12d6db="G",_0x22e188=_0x396187.JpsKe,_0x3e91e5=_0x396187.sfhvx,_0x596262="u",_0x3af567=",",_0x3c0641="T",_0x1fba27="5",_0x396e7c="(",_0x25c3bd=_0x396187.QzMlY,_0x362681="~",_0x2f0f73="]",_0x535cc8="e",_0xdc2938="v+",_0x10978a="4",_0x4312e7="M",_0x22f260="t|",_0x4c7ea0="Lx",_0x591d21="b",_0x56a717="h[",_0x13f882=_0x396187.AfFOm,_0x3c1362=46182139,_0x58bdfb=-204257853,_0xfc9e29=-99126184,_0xc33411=[],_0x9bbf80,_0x3dada9,_0x3d4b87,_0x25fd4f,_0x1f3dd3,_0x4b946c,_0x492b95,_0x281cce,_0x3c94b0,_0x5d5f22,_0x5b15be,_0x1dde8f,_0x5d47fc,_0x3922ce,_0x1a1812,_0x380553;_0xc33411[_0x396187.uwrxo(JDjD,"1glj_")]((_0x9bbf80={exports:{}},function(n,t,r){var u={cMCDV:function(n,t){return _0x396187.GyUCE(n,t)},gnnSY:"Q;@M",ZOWSX:function(n,t){return _0x396187.GyUCE(n,t)},ugsKB:function(n,t){return _0x396187.Lpjsq(n,t)},LsXCT:function(n,t){return n+t}},e="",c=_0x396187.OOQiL(c);function c(){return/(iPhone|iPad|iPod|Android|ios|SymbianOS|Mobile)/i.test(navigator.userAgent)}r(103)[JDjD(_0x396187.Lpjsq(_0x396187.yejJn(_0x396187.yejJn(Q,"w"),q),_0x1d4556))](7),n.exports={get:function(){return[c||(e||(e=document.createElement(u.cMCDV(JDjD,u.gnnSY))),u.ZOWSX(JDjD,u.ugsKB(u.LsXCT(_0x144eb7,p),"-"))in e)?2:1]}}}.call(_0x9bbf80.exports,_0x9bbf80,_0x9bbf80.exports,_0x255329),_0x9bbf80.exports)),_0xc33411[_0x396187.uwrxo(JDjD,_0x396187.jbYFi)](_0x396187.uwrxo(_0x255329,_0x396187.uwrxo(_0x255329,62))),_0xc33411[_0x396187.iylWU(JDjD,_0x396187.JqRpb)]((_0x3dada9={exports:{}},function(n,t,r){var u={MeiuM:function(n,t){return n+t},WggdG:function(n,t){return _0x396187.GyUCE(n,t)},SWCxa:function(n,t){return _0x396187.yejJn(n,t)}};u.rYyQE=_0x396187.GUkEa,u.rPkih=function(n,t){return _0x396187.GyUCE(n,t)};var e=(0,r(_0x396187.BebBG(r,99))[1])(_0x396187.iFODc(JDjD,_0x396187.eZXAP));n.exports={get:function(){return e?[u.MeiuM(u.MeiuM(u.WggdG(JDjD,']"'),u.SWCxa("",e).replace(/"/g,u.WggdG(JDjD,u.rYyQE))),u.rPkih(JDjD,'U"')),null,1]:[null]}},_0x396187.gInfF(r,103)[_0x396187.fZNmO(JDjD,_0x396187.yejJn("W"+_0x2f0507,"("))](32)}.call(_0x3dada9.exports,_0x3dada9,_0x3dada9.exports,_0x255329),_0x3dada9.exports)),_0xc33411[_0x396187.zitQu(JDjD,_0x396187.scpLR)](_0x255329(_0x255329(104))),_0xc33411[JDjD(_0x396187.JqRpb)]((_0x3d4b87={exports:{}},function(n,t,u){var e=navigator.languages;_0x396187.fZNmO(u,103)[JDjD(_0x396187.MpCIX(_0x396187.tfKiI(_0x396187.lWXgW(R,_0x432ee8),";"),r))](15),n.exports={get:function(){var n="";if(e&&e.length){for(var t=0;tK",GKZQt:"1[11.",uTmIf:"E8DH=89/1?,z",KA),"("))in document||e.rFPPm(JDjD(e.kIKss(e.JQjYZ(e.hazhy(e.lEsiR(LA,lA),"*"),"ls"),NA)),document)},_4:function(){return e.rFPPm(e.qqBFb(JDjD,e.lEsiR(e.lEsiR(e.ZadjM(QA,"?"),x),e.GDTrN)),window)||e.LiVxn(e.qqBFb(JDjD,e.dyIhR),window)},_5:function(){return r.YjhMf(r.YggCa(JDjD,r.goblP(r.goblP("h{",SA)+")","/.")),window)},_6:function(){return e.HLYuI(JDjD,e.jZahB)in window},_7:function(){return JDjD(e.ZadjM(e.xEznt(e.xGzVg(e.xGzVg("BG","]K"),sA),"["),TA))in window},_8:function(){var n=!1;try{r.kSJVV(100[100].rhinoException,r.PcYAW(JDjD,r.goblP(r.oUUTQ("k","2+"),uA)+"x"))&&(n=!0)}catch(t){}return n},_9:function(){var n=new RegExp(e.dBDgR(JDjD,e.xGzVg(e.xGzVg(e.pgXVQ,vA),"C?")),e.AvHrp(JDjD,"6["));return n.test(navigator.vendor)||n.test(navigator.appName)},_10:function(){return new RegExp(e.AvHrp(JDjD,e.XFJRi(e.QShBL(e.YIcZF,"{"),"z")),e.AvHrp(JDjD,"a0")).test(n)},_11:function(){return new RegExp(r.FQkPd(JDjD,r.oUUTQ(r.YDdEW,YA)),r.MJSIj(JDjD,"h)")).test(n)||r.YjhMf(r.ZGMgL(JDjD,r.lkbsV(r.SlOHQ("iYw2/{",D),yA)),window)||r.HecoY(r.tlsoE(JDjD,r.HDCIP(r.HDCIP(r.HDCIP(ZA,zA),Aa),aa)),window)||r.HecoY(r.mgECX(JDjD,r.HDCIP(r.Kzvws(r.zuAwh,Ba),"B")+Ca),window)},_12:function(){return!(!r.wYngH(r.mgECX(JDjD,r.Kzvws(r.Kzvws(r.TfknC(r.iwyov("CT"+Da,Ea),"FS"),"L"),fa)),document)||r.OGdcu(r.ayRov(JDjD,r.yQJvw(r.yQJvw(Ga,Ja),"*-")+Ka),window)||!document.applets||!document.applets.toString||r.kSJVV(document.applets.toString(),r.ayRov(JDjD,"G")))},_13:function(){return e.kdysD(e.YPqSx(JDjD,e.QShBL(ka+a,"8")),window)||e.QNIKf(e.YPqSx(JDjD,e.QShBL(e.QShBL(e.GmoHs,s),"_")),window)||e.hzhHs(JDjD(e.gRGLx("rt",La)+"y"),window)},_14:function(){return r.WVIkf(r.BLBcE(JDjD,r.wgoMz(r.HqiOL("n",Oa)+ra,"v,")),window[r.EqrZU(JDjD,r.HqiOL(r.zJLLg(r.qBpWv(r.vAaOM,Sa),"*|"),sa))])&&window[r.ZbkLy(JDjD,r.wBoOG(r.wBoOG(r.udpvx("n(",_),Ta),r.QxRyF))][r.ZbkLy(JDjD,r.udpvx(r.udpvx(r.QGyZd(r.RJRCj,"57"),ta),Ua))]},_15:function(){return new RegExp(r.ZbkLy(JDjD,r.QGyZd(r.kLUqR("P6",ua),"D=")),r.ZbkLy(JDjD,"l|")).test(window.location.href)||new RegExp(r.ZbkLy(JDjD,r.kLUqR(r.kLUqR(r.XmxTI(Va,"(0"),va),"6/")),r.ZbkLy(JDjD,"tt")).test(window.location.protocol)}};for(var u in t)if(t[u]())return c.OjTet(parseInt,u.substring(1),10);return 0}()]}},r(103)[c.ULWqm(JDjD,c.DAeZA(c.yKspe(c.vjIZG(Wa,wa),Xa),"=u"))](11)},function(n){n.exports=105},function(n,t,r){var u={WcfZK:function(n,t){return n==t},AlWtz:function(n,t){return n(t)},wSSAU:function(n,t){return n+t},CdVyQ:function(n,t){return n-t},qwxQK:function(n,t){return n/t},huIpn:function(n,t){return n(t)},uPAtj:function(n,t){return n+t},PmiMO:".nio",lyJIg:function(n,t,r,u){return n(t,r,u)},JCtQd:function(n,t){return n+t},SdQSj:function(n,t){return n+t},eDmdL:"KSJ",qkLpT:"ty-.r,",UHruR:function(n,t){return n(t)},rUELa:function(n,t){return n(t)},ouKtn:function(n,t){return n(t)},DuOZw:function(n,t){return n(t)},lFTVe:"sPNZ+"},e=u.qkLpT,c=r(u.UHruR(r,75)),o=(r(41),u.UHruR(r,u.UHruR(r,13))),i=u.rUELa(r,u.rUELa(r,76)),f=u.ouKtn(r,r(22));u.ouKtn(r,103)[u.DuOZw(JDjD,u.SdQSj(u.lFTVe,xa))](20);var x=0,D=[];function _0x16b8da(n){var t;n=n||window.event,x<"},c=(function(n,t){var x={MCDHK:function(n,t){return n===t},cEsgS:function(n,t,r){return e.CtViX(n,t,r)},Fmiwl:function(n,t){return e.VCglf(n,t)}};x.excPS=e.swdkd,x.SQzkU=function(n,t){return e.VCglf(n,t)},x.DnCkN=function(n,t){return e.MefSq(n,t)},x.bmSyh=e.fPLTn,x.eXDJT=function(n,t){return e.MDTqo(n,t)};var r=function(n){for(var t=x.excPS.split("|"),r=0;;){switch(t[r++]){case"0":n.getStatus=function(n){try{x.MCDHK(e,o)?x.cEsgS(n,null,e):e?x.Fmiwl(n,e):c=n}catch(t){}};continue;case"1":var u=navigator.getBattery||navigator.battery||navigator.mozBattery,e=null,c=function(){},o=x.SQzkU(JDjD,x.DnCkN(x.DnCkN(x.bmSyh+aB,"~"),BB));continue;case"2":return n;case"3":try{u instanceof Function?u.call(navigator).then(function(n){i.FigSf(c,e=n)},function(){e=o}):e=x.eXDJT(u,o)}catch(f){}continue;case"4":var i={FigSf:function(n,t){return x.SQzkU(n,t)}};continue}break}}({});n.exports=r}.call((u={exports:{}}).exports,u,u.exports,r),u.exports),o=254;e.VCglf(r,103)[e.sviTh(JDjD,e.MefSq(e.MefSq(e.OQVad,bB)+"p",CB))](35),c.getStatus(function(n){n?(o=Math.round(e.bZUsu(100,n.level)),n.charging&&(o+=100)):o=255}),n.exports={get:function(){return[o]}}},81,51,function(n){n.exports=92},69,function(n){n.exports=113},11,function(n,t,r){var u={PePzj:function(n,t){return n(t)},tdNWe:function(n,t){return n(t)},CqFvL:function(n,t){return n+t},KpPZP:function(n,t){return n(t)},CFSDV:"9.a",vOSKL:function(n,t){return n(t)},mbnyM:function(n,t){return n+t},GafPZ:function(n,t){return n+t}},e=u.PePzj(r,u.tdNWe(r,10)),c="";try{c=u.CqFvL(u.KpPZP(e,function(){try{return document.location.href}catch(n){try{return document.URL}catch(t){}}return""}()),JDjD(u.CqFvL(u.CqFvL(u.CFSDV,cB),DB)+dB))}catch(o){}u.KpPZP(r,103)[u.vOSKL(JDjD,u.mbnyM(u.GafPZ(u.GafPZ("K",EB),eB),"4"))](5),n.exports={get:function(){return[c]}}},function(n){n.exports=51},function(n){n.exports=115},function(n){n.exports=33},function(n){n.exports=100},function(n,t){var r={CyKSl:function(n,t){return n(t)}};n.exports=function(n){if(n){var t=n.indexOf(r.CyKSl(JDjD,"kS"));0>>t},nyNQL:function(n,t){return n&t},OZJBM:function(n,t){return n&t},xvqfW:function(n,t){return n*t},oLkha:function(n,t){return n*t},eJGKa:function(n,t){return n>>>t},lquCS:function(n,t){return n*t},dEOEW:function(n,t){return n*t},XYQjh:function(n,t){return n*t},HZiCh:function(n,t){return n>>>t},YFqSX:function(n,t){return n+t},IeiOf:function(n,t){return n*t},POtrZ:function(n,t){return n*t},PEBpf:function(n,t){return n|t},BqwcL:function(n,t){return n<>>t},FyKSX:function(n,t){return n>>>t},zFkbC:function(n,t){return n+t},eylem:function(n,t){return n|t},DCgKM:function(n,t){return n|t},hyTbu:function(n,t){return n<>>t},IPpQx:function(n,t){return n+t},NPytR:function(n,t){return n+t},hHLbl:"====",WyFmW:function(n,t){return n>>>t},PilhV:function(n,t){return n+t},BsUxG:function(n,t){return n(t)},berqm:function(n,t){return n+t},ullEd:function(n,t){return n+t},ofIKW:function(n,t){return n+t},uyvKW:"DmH",HyEef:function(n,t){return n(t)},Nosrk:"z08",clsFN:function(n,t){return n+t},eKewH:function(n,t){return n+t},rjshL:function(n,t){return n+t},OMlcT:function(n,t){return n(t)},qHKdA:function(n,t){return n+t},ZMwAz:"4|7|6|5|3|9|0|8|2|1",XYeZV:";7 48,=",ONGjc:function(n,t){return n(t)},yqafe:"9]^",pIeQw:"V53@H3E",xTnew:function(n,t){return n+t},OnooE:function(n,t){return n+t},wRFCJ:"l)1(0|,(",WXPeh:function(n,t){return n+t},zOAdM:"=]RM",cZJdL:"twwnr",nGAeo:function(n,t){return n*t},zcpiK:function(n,t){return n(t)},xNcwq:function(n,t){return n*t},lZTcu:function(n,t){return n*t},MFgrp:function(n,t){return n+t},WiPzp:function(n,t){return n+t},CJJMI:"+#c3-",IJkBV:"P#_eh",CvGWV:function(n,t){return n+t},jLqvZ:"hHH0",eYmiE:"qeSPUZmrsp,um)s|rs)s)mw|t}",jAjqt:"i}{",LVffO:",{3{1",PDvLl:function(n){return n()},Nxgvv:function(n,t){return n(t)},XEhfx:function(n,t){return n(t)},tkRdR:function(n,t){return n(t)},kDCqM:"s99",DvIoC:"||||||",cRXrB:"c[P]TX",pFCQp:"PY_LW",YsKgn:"obP",cEPWT:"Q>>16,a.OZJBM(t[1],O)];var r=[0,0,0,0];return r[3]+=a.xvqfW(n[3],t[3]),r[2]+=a.MgiDL(r[3],16),r[3]&=O,r[2]+=a.oLkha(n[2],t[3]),r[1]+=a.eJGKa(r[2],16),r[2]&=O,r[2]+=a.oLkha(n[3],t[2]),r[1]+=a.eJGKa(r[2],16),r[2]&=O,r[1]+=a.lquCS(n[1],t[3]),r[0]+=r[1]>>>16,r[1]&=O,r[1]+=a.dEOEW(n[2],t[2]),r[0]+=a.eJGKa(r[1],16),r[1]&=O,r[1]+=a.XYQjh(n[3],t[1]),r[0]+=a.HZiCh(r[1],16),r[1]&=O,r[0]+=a.YFqSX(a.YFqSX(a.YFqSX(a.XYQjh(n[0],t[3]),a.IeiOf(n[1],t[2])),a.IeiOf(n[2],t[1])),a.POtrZ(n[3],t[0])),r[0]&=O,[a.PEBpf(a.BqwcL(r[0],16),r[1]),a.BqwcL(r[2],16)|r[3]]},k=function(n,t){return a.qYlgT(0,t%=64)?n:a.diHpv(t,32)?[a.PEBpf(n[0]<>>32-t),n[1]<>>a.FMaxE(32,t)),a.wrgVd(n[1],t)|a.HZiCh(n[0],a.QxbaF(32,t))]:(t-=32,[a.iCfaY(a.tUMVF(n[1],t),a.HZiCh(n[0],a.QxbaF(32,t))),a.vxOfg(a.euYvL(n[0],t),n[1]>>>a.JvDUx(32,t))])},U=function(n,t){return[a.MFMBP(n[0],t[0]),a.yyvRN(n[1],t[1])]};function _0x4f222b(n,t){n=[a.OsCAu(n[0],16),a.OZJBM(n[0],O),n[1]>>>16,n[1]&O],t=[a.FyKSX(t[0],16),a.OZJBM(t[0],O),t[1]>>>16,a.OZJBM(t[1],O)];var r=[0,0,0,0];return r[3]+=a.YFqSX(n[3],t[3]),r[2]+=a.FyKSX(r[3],16),r[3]&=O,r[2]+=a.zFkbC(n[2],t[2]),r[1]+=r[2]>>>16,r[2]&=O,r[1]+=a.zFkbC(n[1],t[1]),r[0]+=a.FyKSX(r[1],16),r[1]&=O,r[0]+=a.zFkbC(n[0],t[0]),r[0]&=O,[a.eylem(a.euYvL(r[0],16),r[1]),a.DCgKM(a.hyTbu(r[2],16),r[3])]}function _0x29b419(n){return n=a.oUGab(U,n,[0,n[0]>>>1]),n=a.oUGab(S,n,[a.zFkbC(106351296,C)+4070840919,a.XMnCk(a.XMnCk(a.XMnCk(c,D),f),E)]),n=a.oUGab(U,n,[0,a.FyKSX(n[0],1)]),n=a.PtPUc(S,n,[a.aesqC(e,1927284897),a.aesqC(F,B)]),a.bABPl(U,n,[0,a.FyKSX(n[0],1)])}function _0x2e01b8(n,t){t=a.dwJjo(t,0);for(var r=a.maYkD((n=n||a.eLtLA(JDjD,a.ERCPD(a.ERCPD(a.gHrwT,hB),IB)+"W")).length,16),u=a.LpwUD(n.length,r),e=[0,t],c=[0,t],o=[0,0],i=[0,0],f=[a.ERCPD(y,903137844),P+183208213],x=[a.rQqMg(g,M),a.rQqMg(h,1374597469)+I],D=0;a.FUQjf(D,u);D+=16)o=[a.DCgKM(a.DCgKM(a.DCgKM(255&n[q](a.gTpRv(D,4)),a.hyTbu(255&n[q](a.gTpRv(D,5)),8)),a.hyTbu(a.OZJBM(255,n[q](a.TLHxS(D,6))),16)),a.cmugL(a.OZJBM(255,n[q](D+7)),24)),a.DCgKM(a.HOjRx(a.bisyM(a.OZJBM(255,n[q](D)),a.pDwjh(a.GNwZg(255,n[q](D+1)),8)),a.Voejr(255&n[q](a.FmoEe(D,2)),16)),a.Voejr(a.GNwZg(255,n[q](a.FmoEe(D,3))),24))],i=[a.bisyM(a.xborh(255,n[q](a.FmoEe(D,12)))|a.xborh(255,n[q](a.GACzV(D,13)))<<8,a.tmDKn(255,n[q](a.FfMga(D,14)))<<16)|a.TqALc(255,n[q](a.VIzZo(D,15)))<<24,a.bisyM(a.KHqDg(a.KHqDg(a.TqALc(255,n[q](a.EpicV(D,8))),a.fRlMj(255,n[q](a.EpicV(D,9)))<<8),a.Voejr(a.gQOKv(255,n[q](a.EpicV(D,10))),16)),a.Voejr(a.gQOKv(255,n[q](a.EpicV(D,11))),24))],o=S(o,f),o=a.nxDCJ(W,o,31),o=a.QALzq(S,o,x),e=a.Kicbo(U,e,o),e=a.xxtop(_0x4f222b,e=a.xxtop(W,e,27),c),e=a.xxtop(_0x4f222b,a.xxtop(S,e,[0,5]),[0,a.DwYBJ(a.DGuGh(1293816273,Q),j)]),i=a.xxtop(S,i,x),i=W(i,33),i=a.xxtop(S,i,f),c=a.xxtop(U,c,i),c=a.xxtop(_0x4f222b,c=W(c,31),e),c=a.xxtop(_0x4f222b,a.xxtop(S,c,[0,5]),[0,a.DGuGh(a.ulXya(K,N),L)]);switch(o=[0,0],i=[0,0],r){case 15:i=a.xxtop(U,i,k([0,n[q](a.MRkPB(D,14))],48));case 14:i=U(i,a.xxtop(k,[0,n[q](a.MRkPB(D,13))],40));case 13:i=a.xxtop(U,i,a.fqiPd(k,[0,n[q](a.ubPpf(D,12))],32));case 12:i=a.LCwHq(U,i,a.LCwHq(k,[0,n[q](a.QHunl(D,11))],24));case 11:i=a.LCwHq(U,i,a.LCwHq(k,[0,n[q](D+10)],16));case 10:i=a.LqolN(U,i,a.SmtLn(k,[0,n[q](a.QHunl(D,9))],8));case 9:i=a.SmtLn(U,i,[0,n[q](a.knawB(D,8))]),i=a.SmtLn(S,i,x),i=a.fMPju(W,i,33),i=a.fMPju(S,i,f),c=a.ktCIf(U,c,i);case 8:o=U(o,a.NxvQN(k,[0,n[q](a.rDqYo(D,7))],56));case 7:o=a.NxvQN(U,o,a.NxvQN(k,[0,n[q](a.rDqYo(D,6))],48));case 6:o=a.NxvQN(U,o,a.NxvQN(k,[0,n[q](a.FEWZk(D,5))],40));case 5:o=a.NxvQN(U,o,a.NxvQN(k,[0,n[q](a.HUcRw(D,4))],32));case 4:o=a.NxvQN(U,o,a.NxvQN(k,[0,n[q](a.TQFhj(D,3))],24));case 3:o=a.NxvQN(U,o,a.NxvQN(k,[0,n[q](a.ZrGXe(D,2))],16));case 2:o=a.NxvQN(U,o,a.SvdUe(k,[0,n[q](D+1)],8));case 1:o=a.SvdUe(U,o,[0,n[q](D)]),o=a.jGmGK(S,o,f),o=W(o,31),o=a.YKsws(S,o,x),e=a.YKsws(U,e,o)}return e=a.DWQsF(U,e,[0,n.length]),c=a.LWXCR(_0x4f222b,c=a.LWXCR(U,c,[0,n.length]),e=a.LWXCR(_0x4f222b,e,c)),e=a.eLtLA(_0x29b419,e),c=a.LWXCR(_0x4f222b,c=a.crdwK(_0x29b419,c),e=a.NXfGh(_0x4f222b,e,c)),a.TpAcb(a.ukwIc(a.PwVAx((a.crdwK(JDjD,a.tuMwY(iB+a.UbxHN+JB,"w"))+a.SaSoX(e[0],0).toString(16)).slice(-8),a.tuMwY(JDjD(a.IPpQx(a.NPytR(jB,a.hHLbl),KB)),a.WyFmW(e[1],0).toString(16)).slice(-8)),a.PilhV(a.BsUxG(JDjD,a.PilhV(a.berqm("Gh",kB),s)),(c[0]>>>0).toString(16)).slice(-8)),a.ullEd(a.BsUxG(JDjD,a.ullEd(LB+_,p)),(c[1]>>>0).toString(16)).slice(-8))}function _0x13448a(){var n=document.createElement(a.BsUxG(JDjD,a.ofIKW(u,"]jr]")+lB));return!(!n.getContext||!n.getContext(a.BsUxG(JDjD,a.uyvKW)))}var R=a.tkRdR(_0x2e01b8,a.koKui(JDjD,"Kd"));a.koKui(r,103)[a.UDSdL(JDjD,a.XFeNe(a.XFeNe("RG"+oB,PB),"L"))](28);var V=function(){var f={};f.TNvWS=a.ZMwAz,f.jlrTo=function(n,t){return n+t},f.ONaAA=a.XYeZV,f.Wxrdw=function(n,t){return a.OMlcT(n,t)},f.BJZeD=function(n,t){return a.qHKdA(n,t)},f.LbqqB=function(n,t){return a.qHKdA(n,t)},f.phBlo=function(n,t){return n+t},f.ctIic="M>")](34)},function(n){n.exports=113},function(n){n.exports=117},function(n,t,r){var u={ACGHR:function(n,t){return n+t},kAIUP:function(n,t){return n+t},YIlfp:"l0+",rpope:function(n,t){return n-t},NQwzK:function(n,t){return n/t},uUCCi:function(n,t){return n(t)},szTts:function(n,t){return n+t},aSdyc:"+jlrpbr",nOIKm:function(n,t){return n(t)},EzeOX:"1v{",XEOIr:function(n,t){return n(t)},lBiDu:function(n,t){return n(t)},INedI:function(n,t){return n+t},bhhVl:function(n,t){return n+t},eKIUW:function(n,t){return n+t},PnaJv:function(n,t){return n(t)},xnfNg:function(n,t){return n(t)},VPFWE:function(n,t){return n(t)}},e=u.EzeOX,c=u.XEOIr(r,u.XEOIr(r,75));u.XEOIr(r,41),r(103)[u.lBiDu(JDjD,u.INedI(u.bhhVl(u.eKIUW(hb,Ib),ib),Jb))](21);var o=u.PnaJv(r,u.PnaJv(r,13)),i=u.xnfNg(r,r(76)),f=u.VPFWE(r,u.VPFWE(r,22)),x=0,D=[];function _0x54d338(n){var t;n=n||window.event,xq");try{n=r(u.gkzzJ(r,80)).get()[0].split(u.TWYJu(JDjD,"Bi"))[0]}catch(t){}return c[u.UKACa(JDjD,u.uKeUw(Ob,u.QRBir)+ob)]=n,c};var i=u.hXIUj(r,u.hXIUj(r,28));o[JDjD(u.DvXPL(u.DvXPL(u.DvXPL(Pb,u.yBlpK),pb),Qb))]=i[u.hXIUj(JDjD,u.GyWUN)],o[u.hXIUj(JDjD,u.DvXPL(u.DvXPL("i",qb),u.lsfPT))]=i[JDjD(u.mvNHk("V5>",Rb)+"D")],o[u.hXIUj(JDjD,e+u.XilkA)]=i[JDjD(u.mvNHk(u.IkeHE("n",rb),Sb)+sb)],i[u.MHsYD(JDjD,u.INhFY)]()}catch(x){var f=u.MHsYD(r,u.lfkNv(r,31))(x);o[JDjD(u.IkeHE(Tb+tb,"L9"))]=function(){return u.UKACa(encodeURIComponent,u.ySgCD(u.uHniQ(JDjD,u.UQGHX),f))}}},function(n){n.exports=39},function(n){n.exports=73},function(n,t,r){var u={AtrRA:function(n,t){return n+t},ODZLX:function(n,t){return n+t},TIaVi:function(n,t){return n(t)},ihsCF:function(n,t){return n+t},xwjpn:function(n,t){return n+t},TABZY:"NKr"};n.exports={get:function(){var n=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,t=window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight;return[u.AtrRA(u.ODZLX(u.TIaVi(JDjD,"1R"),n)+JDjD("N]")+t,u.TIaVi(JDjD,"ew")),null,1]}},u.TIaVi(r,103)[u.TIaVi(JDjD,u.ihsCF(u.xwjpn(u.TABZY,Ub),"P"))](4)},function(n){n.exports=118},function(n,t){n.exports=2},function(n){n.exports=92},function(n,t,c){var r,o={DkdNi:function(n,t){return n%t},ADQYF:function(n,t){return n(t)},WIkJD:function(n,t){return n+t},HSeiJ:function(n,t){return n+t},LEIkq:function(n,t){return nMN",BBjos:"sop",TPlFi:function(n,t){return n(t)},pfWFP:"dQbca",rjuMf:function(n,t){return n+t},zOZpl:function(n){return n()},Kfcpc:function(n,t){return n(t)},JseSa:function(n,t){return n+t},qgUVs:"<1^^}",oYqTI:"-|q",nIfkB:function(n,t){return n(t)},BWarU:function(n,t){return n(t)},TRuBF:function(n,t){return n(t)},hDAfQ:"*ml",bsQLM:function(n,t){return n(t)},suhhO:function(n,t){return n+t},YrBMA:"[42A",HVIfG:function(n,t){return n(t)},zxQiC:"2YZ",BaBsZ:function(n,t){return n(t)},fGnty:function(n,t){return n(t)},GnYmP:function(n,t){return n(t)},acUhE:function(n,t){return n(t)},NKXeP:"aP`",hEeVp:">s0",wXxiC:function(n,t){return n(t)},dJzxw:"5}7",OUjeh:function(n,t){return n(t)},ElDFP:function(n,t){return n+t}},e="e",i="+",_=o.oYqTI,f=(function(n,t){n.exports=[JDjD("QF;")]}.call((r={exports:{}}).exports,r,r.exports,c),r.exports),x=o.nIfkB(c,o.nIfkB(c,55)),j=o.BWarU(c,c(64)),D=o.BWarU(c,c(63)),u=o.BWarU(c,o.TRuBF(c,79)),a=[JDjD(o.hDAfQ),o.bsQLM(JDjD,o.suhhO(":`",ub)+Vb),o.bsQLM(JDjD,o.YrBMA)],s=[],p=[],d=[],J={};function _0x519a54(n,t,r){n[t]=r}function _0x609fde(n,t){if(!n)return"";var r=o.DkdNi(n[o.ADQYF(JDjD,o.WIkJD(o.HSeiJ(e,vb),i))],24);if(o.LEIkq(14,r)||t){r=o.bKeuy(24,r);for(var u=0;o.Pbvyr(u,r);u++)n+=o.vfKqQ(JDjD,". ");return n}return!1}function _0x16ae9e(n,t){for(var r=t.length,u=0;o.bqCtk(u,r);u++)if(o.lWIIl(n,t[u]))return u;return-1}function _0x4879d6(){for(var n=0;o.OTcTp(n,p.length);n++){var t=p[n];t[a[1]]&&t[a[1]]()}}J[o.HVIfG(JDjD,o.zxQiC)]=[],J[o.BaBsZ(JDjD,"7dU")]={};var l=new RegExp(o.fGnty(JDjD,o.suhhO(o.suhhO(yb,"KU"),Zb)+"c"),o.GnYmP(JDjD,"FI")),b={},v={set:function setData(n,t){if(x.isObject(n))for(var r in n)o.YEanT(-1,o.CbMsI(_0x16ae9e,r,f))&&o.GbNzM(_0x519a54,J[o.vfKqQ(JDjD,o.uVyzO)],r,n[r]);if(x.isString(n)){var u={};u[n]=t,setData(u)}}};v.clear=_0x4879d6,v.init=function(){var n;return function(){for(var n=0;o.OTcTp(n,u.length);n++){var t=u[n];t[a[0]]&&s.push(t),t[a[1]]&&p.push(t),t[a[2]]&&d.push(t)}o.vfKqQ(c,o.vfKqQ(c,65))(o.vfKqQ(c,o.dTter(c,61)))}(),function(){for(var n=0;nQU",DsiQo:function(n,t){return n in t},QBEEl:function(n,t){return n(t)},tECYP:function(n,t){return n+t},sNZVG:"^_8P^^LRP",dlIod:"5bU"},f=i.dlIod,x="m",D="d",r="CH",a="A",u=function(){var u="V",e="g",c="b",o=i.kfCUQ(JDjD,i.RHAuW(i.OWGLo+hC,i.VTJPa)),t=i.DsiQo(i.QBEEl(JDjD,i.tECYP(IC,i.sNZVG)),window);function Target(n,t){var r="";if(arguments.length<2?r="":typeof n!=JDjD(f+iC+u+e)?r="":typeof t!=JDjD("-no"+x+D+JC+c)&&(r=""),r)throw new Error(r);this.target=n,this.name=t}function Messenger(n,t){this.targets={},this.name=n,this.listenFunc=[],typeof(o=t||o)!==JDjD(kC+"MNL"+r+a)&&(o=o.toString()),this.initListen()}return Target.prototype.send=t?function(n){this.target.postMessage(n,i.haeVQ(JDjD,"L]"))}:function(n){var t=window.navigator[i.yqtsF(o,this.name)];if(i.lsHDR(typeof t,i.pGvcX(JDjD,i.yqtsF(i.Srzlb(i.zJjJz,jC),KC))))throw new Error("");i.CeuXh(t,n,window)},Messenger.prototype.addTarget=function(n,t){var r=new Target(n,t);this.targets[t]=r},Messenger.prototype.initListen=function(){var r={ArOIb:function(n,t){return i.GOZTj(n,t)},GwBrn:function(n,t){return n(t)},xuOkC:function(n,t){return i.drryz(n,t)},PcAzw:i.rsPUF,KjNqg:function(n,t){return nA",wisWc:function(n,t){return n(t)},pjxSy:function(n,t){return n(t)},LKhII:function(n,t){return n+t},rsjqo:"Njt(zvp",zcUbB:function(n,t){return n(t)},nDFiT:function(n,t){return nNS`",lXrKN:function(n,t,r){return n(t,r)},bhzRS:function(n,t){return n+t},jNCyu:"H4{z?ITOKE",fstFu:function(n,t,r){return n(t,r)},RPbsz:function(n,t){return n*t},FehZm:function(n,t){return n+t},KllYS:function(n,t){return n/t},LQhDR:function(n,t){return n+t},FYMJu:"2J:9U_jea",SNOfl:function(n,t){return n+t},WRdSa:function(n,t){return n(t)},hkfbd:function(n,t){return n+t},ViVxe:function(n,t){return n(t)},czutV:function(n,t){return n(t)},obHEi:"nUS_0h",FOkLA:function(n,t){return n(t)},qvsgD:function(n,t){return n+t},wmwOy:function(n,t){return n+t},dYIly:function(n,t){return n+t}},_=s.WRdSa(r,s.ViVxe(r,111)),j=r(s.ViVxe(r,99))[0],p=s.ViVxe(r,r(99))[1],d=s.czutV(r,s.czutV(r,75)),J="",l="";s.czutV(r,103)[s.czutV(JDjD,s.obHEi)](27);var u=new RegExp(s.FOkLA(JDjD,s.hkfbd(s.hkfbd(PC,"*2"),pC)+QC)),b=new RegExp(s.FOkLA(JDjD,s.hkfbd(s.qvsgD(s.wmwOy(s.wmwOy(s.dYIly(qC,"7"),RC),"a"),rC),"$"))),e={on:function(){for(var n=s.FyWRX.split("|"),t=0;;){switch(n[t++]){case"0":c.listen(function(n){try{var t=JSON.parse(n).message.val;t&&(x.GaSzN(t.indexOf(x.paHjU(JDjD,"Gr")),0)&&(t=decodeURIComponent(t)),l=t.split(x.paHjU(JDjD,"fS"))[0],J=x.eUbVH("",Math.floor(x.VehUZ(parseInt(t.split(JDjD("sF"))[1],10),1e3))),x.FlIOQ(j,JDjD(x.FobhE(x.xjmjw,yC)),x.ymDpG(l,JDjD("iP"))+J));var r=document.body||document.getElementsByTagName(x.teKBu(JDjD,"ns)u3"))[0];r.removeChild&&r.removeChild(f)}catch(u){}}),s.FNMpP(d,i,s.msnhr(JDjD,s.yEoxA),function(){var n;c.addTarget(i.contentWindow,e.child),n={message:{type:s.msnhr(JDjD,s.aDJrV)}},c.targets[e.child].send(JSON.stringify(n))});continue;case"1":try{var r=s.wisWc(p,s.pjxSy(JDjD,s.LKhII(SC+s.rsjqo,sC)));if(r&&b.test(r))return r=r.split(s.zcUbB(JDjD,"Et")),l=r[0],void(s.nDFiT(11,(J=r[1]).length)&&(J=Math.floor(s.qzmCh(s.LJAEU(parseInt,J,10),1e3))))}catch(D){}continue;case"2":var u="m";continue;case"3":var e={child:s.zcUbB(JDjD,s.MSFeK(s.JYNJf(s.qpDzz(s.yQpJx(".",XC),"`"),xC),u)),parent:s.GBSEK(JDjD,s.gwsDu(YC,s.YYXNG))},c=new _(e.parent);continue;case"4":var o=s.GBSEK(JDjD,s.kUzjK(s.kUzjK(TC,tC)+s.RuEXT,UC)),i=document.createElement(s.TJvVL(JDjD,uC+s.IsXho));continue;case"5":f.setAttribute&&f.setAttribute(s.TJvVL(JDjD,s.Pqlbx),JDjD(s.rpMNV(s.rpMNV(s.rpMNV(s.rpMNV(VC,vC),WC),wC),"K"))),f.style&&(f.style.display=JDjD(s.DgptJ)),f.appendChild&&f.appendChild(i);continue;case"6":try{!function checkBodyAndAppend(){var n=document.body||document.getElementsByTagName(s.msnhr(JDjD,s.pUTJS))[0];n?n.appendChild(f):setTimeout(checkBodyAndAppend,50)}()}catch(a){}continue;case"7":var f=document.createElement(s.wRCEH(JDjD,s.qbYxL));continue;case"8":i.src=o;continue;case"9":var x={GaSzN:function(n,t){return n>t},CVjtm:function(n,t){return n-t},vFJDc:function(n,t){return n>>t},BWMWy:function(n,t){return n(t)},IfmoE:function(n,t){return n(t)},foyJg:function(n,t){return n(t)},TKFcw:function(n,t){return n+t},yoATg:function(n,t){return n^t},dZamS:function(n,t){return n+t},fDLky:function(n,t){return n(t)},QlQFX:function(n,t){return n(t)},hnIik:function(n,t){return n>>>t},bpFJo:function(n,t){return n(t)},GjoLZ:function(n,t){return n+t},lyKhp:function(n,t){return n(t)},NMYse:function(n,t){return n(t)},xvyEE:function(n,t){return n(t)},PlJGS:function(n,t){return n+t},ipKqw:function(n,t){return n(t)},VsYac:function(n,t){return n(t)},TUWnW:function(n,t){return n>>>t},RcNlU:function(n,t){return n+t},HodZj:function(n,t){return n+t},LfidM:function(n,t){return n&t},sQpnr:function(n,t){return n(t)},jVnPE:function(n,t){return n+t},bVRPn:function(n,t){return n+t},JpoeD:function(n,t){return n(t)},gBHzp:function(n,t){return n(t)},nRImw:function(n,t){return n(t)},yarNY:function(n,t){return n^t},BnUNG:function(n,t){return n(t)},pQsSR:function(n,t){return n(t)},JInRI:function(n,t){return n(t)},wLHmd:function(n,t){return n(t)},UktrR:function(n,t){return n+t},PwjVX:function(n,t){return n>>>t},kNwUi:function(n,t){return n(t)},hazZc:function(n,t){return n(t)},asHWU:function(n,t){return n(t)},keKut:function(n,t){return n(t)},UXENn:function(n,t){return n(t)},OVWod:function(n,t){return n+t},sPqPD:function(n,t){return n+t},huUAu:function(n,t){return n^t},uJmqV:function(n,t){return n(t)},EjUAs:function(n,t){return n(t)},Tvsad:function(n,t){return n(t)},dAVWF:function(n,t){return n+t},WPJQF:function(n,t){return n(t)},UkvOk:function(n,t){return n(t)},JDvjt:function(n,t){return n",XQeiJ:function(n,t){return n&t},WbkBO:function(n,t){return n>>t},Qdwre:function(n,t){return n&t},HUdjO:"4B41",mammU:"e}+{",rvVic:"5]2~(",oPCGy:"81Bj?4",HlEXR:"+S(t",fcdQj:"g<1",IrvRh:"KHFsA:K",aoSJj:function(n,t){return n+t},ZodwQ:"Jvwxyz{|}~()*+,-./01234",bWmLT:function(n,t){return n+t},UFwiA:"5ffUm"},a=D.HUdjO,u=D.mammU,e=D.rvVic,s="H",_="muzs-",j=D.oPCGy,p="5",J=D.HlEXR,l="-",v=D.fcdQj,h="2e",g="r,",r=D.IrvRh,w=26291309,C=-25662376,m=2628144460,A=D.Ysrte(JDjD,D.aIacI(D.aoSJj(D.ZodwQ,zC),"dr")),B=window[D.Ysrte(JDjD,D.bWmLT("4",D.UFwiA))],y=window.btoa||function(n){for(var t,r,u=D.dukjb(String,n),e=0,c=A,o="";u.charAt(D.Zovtc(0,e))||(c=D.PcTsR(JDjD,"Mo"),D.gxpRA(e,1));o+=c.charAt(D.chOOZ(63,D.TSaqi(t,D.CVjtm(8,8*D.gxpRA(e,1)))))){if(D.vFJDc(255,r=u[JDjD(D.WNRii(D.aCUbY(D.JnaWo,Ac),"hD"))](e+=.75)))return JDjD(D.tGkIR);t=D.Zovtc(D.TeXtV(t,8),r)}return o};function _0x34244d(n,t){var e={DqaDz:function(n,t){return D.KVTeB(n,t)}};e.qoYFC=D.lhhhY,e.CZjBE=function(n,t){return D.hkHur(n,t)},e.awbKd=function(n,t){return D.EzsOI(n,t)},e.xDDXo="`+0):b7,-`",e.LTTxN=function(n,t){return D.mDhnO(n,t)},e.oemQZ=function(n,t){return n(t)},e.nYLHB=function(n,t){return D.PwJtZ(n,t)},e.eZpsj=function(n,t){return D.crUVC(n,t)},e.DdaDm=function(n,t){return D.nwdqh(n,t)},e.Riojx=function(n,t){return D.cnMRi(n,t)},e.TxjBL=function(n,t){return D.HjruF(n,t)},e.NhxqQ=function(n,t){return D.PwJtZ(n,t)},e.wZWVv=function(n,t){return D.nwdqh(n,t)},e.Lmjgv=function(n,t){return D.nwdqh(n,t)},e.xZqdt=D.CjQrk,e.yuoNn=function(n,t){return D.mDhnO(n,t)},e.VQiEC=function(n,t){return D.BRXLe(n,t)},e.bDwoa=function(n,t){return D.lKWdS(n,t)},e.LDhZz=function(n,t){return D.WUQmH(n,t)},e.Uyipb=function(n,t){return n+t},e.WaBKD=D.uXLoG,e.ixPDf=function(n,t){return D.oWlgo(n,t)},e.valcU=function(n,t){return D.XrxiZ(n,t)},e.YvOxC=function(n,t){return D.MZcxF(n,t)},e.LWbbY=function(n,t){return D.YAnFb(n,t)},e.kXbts=function(n,t){return n*t},e.TUKuf=function(n,t){return D.WfBYb(n,t)},e.DkZCG=function(n,t){return D.YAnFb(n,t)},e.QZNdl=function(n,t){return D.IGguN(n,t)},e.lCpGb="g~BB,",e.yETvL=function(n,t){return D.BbgJH(n,t)},e.hUfgo=function(n,t){return D.YzuJS(n,t)};var r,u=D.BbgJH(B,D.NPmUl(x,58)),c=D.lIOlL(B,x(D.WQeCL(x,25))),o="";for(c[D.YaiuP(x,D.YaiuP(x,42))]=function(n,t,r){var u=0;for(t=0;D.vFJDc(t,4);t++)u|=D.CKLhG(D.CVjtm(n[JDjD(D.ZKVsQ(D.ZKVsQ(cc+Dc+D.tHouc,dc),s))](t),-7),D.raAlc(8,t));M[D.PcTsR(x,D.PcTsR(x,42))]=u}(D.YaiuP(JDjD,D.XhiBv),D.YaiuP(x,84)),function(n){try{n[e.DqaDz(JDjD,ac+Bc+e.qoYFC)]()}catch(t){}}(t),c[x(91)]=function(n,t,r){var u=0;for(t=0;t<4;t++)u|=D.PsYiI(D.bzFtg(n[D.KVTeB(JDjD,D.vahkH)](t),14),8*t);M[D.KVTeB(x,91)]=u}(D.YaiuP(JDjD,"MJ@u4"),D.lUOgb(x,D.GJVTq(x,25))),c[D.hNQGJ(x,x(42))]=function(n,t,r){var u=0;for(t=0;e.CZjBE(t,4);t++)u|=e.awbKd(n[JDjD(e.xDDXo+fc)](t),12)<>>D.BpFQY(x,x(45))),u),D.YVVyz(o,M[D.chOOZ(o,D.BpFQY(x,D.BpFQY(x,61)))]+D.YVVyz(b+26291309,C))):D.nAOyC(3,D.WbQoe(o,D.BpFQY(x,D.DAYiA(x,61))))?r+=D.zUanM(u<>>D.JpoeD(x,D.gBHzp(x,61))+D.gBHzp(x,84),D.nRImw(x,x(61)))?u+=D.yarNY(D.bVRPn(D.yarNY(D.PwJtZ(r,D.nRImw(x,D.BnUNG(x,25))),D.TUWnW(r,x(D.pQsSR(x,42))+D.JInRI(x,D.wLHmd(x,25)))),r),D.UktrR(o,D.UktrR(M[D.LfidM(D.PwjVX(o,D.UktrR(D.kNwUi(x,D.hazZc(x,45)),D.asHWU(x,x(74)))),D.keKut(x,D.UXENn(x,61)))],D.OVWod(i,-38474545)))):u+=D.yarNY(D.sPqPD(D.huUAu(D.PwJtZ(r,D.UXENn(x,x(25))),D.PwjVX(r,D.sPqPD(D.uJmqV(x,D.EjUAs(x,42)),D.Tvsad(x,D.Tvsad(x,25))))),r),D.dAVWF(o,M[D.LfidM(o>>>x(D.WPJQF(x,45))+D.WPJQF(x,D.WPJQF(x,74)),x(D.UkvOk(x,61)))]));n[D.UkvOk(x,91)]=r,n[x(x(42))]=u}function _0x3d594f(n){for(var t=0,r=0;D.JDvjt(r,4);r++)t|=D.PwJtZ(n[D.tPVHW(JDjD,D.pqGtb(u+e,"[7"))](r),D.XLgLe(8,r));return t}var L=[],M=[];function _0x51bc6(n){return String[D.Ysrte(JDjD,D.aIacI(D.aIacI(D.aIacI(Jc,r),jc),D.ZUqaf))](255&n,D.XQeiJ(D.TSaqi(n,D.Ysrte(x,84)),255),D.XQeiJ(D.WbkBO(n,16),255),D.Qdwre(n>>24,255))}n.exports=function(t){var r={PutoE:function(n,t,r){return n(t,r)}};return function(n){return r.PutoE(_0x34244d,n,t)}}},function(n){n.exports=118},function(n,t){var e={CMgpm:function(n,t){return n||t},mhbSY:function(n,t){return n!=t},CkcKV:function(n,t){return n-t},nENPk:function(n,t){return n+t},SOMSk:function(n,t){return n||t}};n.exports=[function(n){var t,r;return n.touches&&n.touches.length&&(t=n.touches[0].clientX,r=n.touches[0].clientY),{x:e.CMgpm(t,0),y:r||0}},function(n){var t,r;if(e.mhbSY(n.pageX,undefined))t=n.pageX,r=n.pageY;else try{t=e.CkcKV(e.nENPk(n.clientX,document.body.scrollLeft),document.body.clientLeft),r=e.CkcKV(n.clientY+document.body.scrollTop,document.body.clientTop)}catch(u){t=n.clientX,r=n.clientY}return{x:e.CMgpm(t,0),y:e.SOMSk(r,0)}},function(n){var t,r;return n.changedTouches&&n.changedTouches.length&&(t=n.changedTouches[0].clientX,r=n.changedTouches[0].clientY),{x:t||0,y:e.SOMSk(r,0)}}]},function(n,t,r){var u={hbvEL:"ZB@C3",QcPSZ:function(n,t){return n+t},dXmBA:function(n,t){return n(t)},OQfwm:function(n,t){return n+t},XRQTH:function(n,t){return n+t}},e=window.navigator.cookieEnabled;u.dXmBA(r,103)[JDjD(u.OQfwm(u.OQfwm(u.XRQTH(Kc,kc),Lc),lc))](16),n.exports={get:function(){return[JDjD(e?u.hbvEL:u.QcPSZ("g~",Mc)+"}"),null,1]}}},85,90,function(n,t,r){var u={Xlmkj:function(n,t){return n(t)},ExWpD:function(n,t){return n(t)},zVBfL:function(n,t){return n+t},uPghC:"_db",IgSPM:function(n,t){return n+t},iQNSS:"0cR_U"},e=u.Xlmkj(r,r(10));r(103)[u.ExWpD(JDjD,u.zVBfL(u.uPghC,mc)+"w")](6);var c=u.IgSPM(e(document.referrer||""),u.ExWpD(JDjD,u.IgSPM(Nc+u.iQNSS,nc)))+(1215974485151+J+146626902636+k);n.exports={get:function(){return[c]}}},function(n){n.exports=106},function(n,t){n.exports=4},function(n,t,r){var u={PhZKT:function(n,t){return n(t)},KFKNX:function(n,t){return n(t)},nErTr:function(n,t){return n+t}},e=0;n.exports={get:function(){return[++e]}},u.PhZKT(r,103)[u.KFKNX(JDjD,u.nErTr(Oc,oc)+Pc)](0)},76,function(n,t){var r={iYUrG:function(n,t){return n",VMFBj:function(n,t){return n+t},ZfxxQ:"2ceki[cel",AoydL:function(n,t){return n-t},DHATF:function(n,t){return n(t)},MYbBF:function(n,t){return n-t},JwXdv:function(n,t){return n%t},IBaHO:function(n,t){return n+t},cxoSr:function(n,t){return n(t)},HjXSs:function(n,t){return n(t)},ikJfb:function(n,t){return n+t},QfbHH:function(n,t){return n+t},ngwlz:function(n,t){return n+t},wGboi:function(n,t){return n+t},uuRBC:function(n,t){return n(t)},Ilwqp:function(n,t){return n(t)},VNmqG:function(n,t){return n(t)},Tbcqh:function(n,t){return n+t},RZwGf:"`a_",JGpke:function(n,t){return n+t},dchpG:"0d]f_l",vFnsM:function(n,t){return n-t},wcOsv:function(n,t){return n(t)},tIiQV:function(n,t){return n(t)},MBQOz:function(n,t){return n(t)},bgMXS:function(n,t){return n+t},bMUPJ:function(n,t){return n+t},Tmxfo:"1;9"},u="<`[aO",e="T",c="[",i="b",f=o.VNmqG(r,o.VNmqG(r,75)),x=(o.wcOsv(r,41),o.wcOsv(r,r(13))),D=o.tIiQV(r,o.tIiQV(r,64)),a=200;o.MBQOz(r,103)[o.MBQOz(JDjD,o.bgMXS(o.bMUPJ(o.Tmxfo,rc),"N"))](18);var s=[],_=0,j=(new Date).getTime();function _0x4baeb2(n){var t;n=n||window.event,o.JvMNo(_,a)&&(t=o.yRuWq(n.type,JDjD(o.BbCCM(o.BbCCM(o.BbCCM(o.nZcbl(u,e),"Y"),c)+i,"Q")))?x[0](n):x[1](n),s.push({t:o.SiUee((new Date).getTime(),j),x:Math.round(t.x),y:Math.round(t.y)}),_++)}n.exports={on:function(){o.QPLRn(f,document,o.xxOsR(JDjD,o.wXcdg),_0x4baeb2),f(document,o.xxOsR(JDjD,o.VMFBj(o.ZfxxQ,Sc)),_0x4baeb2)},get:function(){for(var n="2|3|0|4|1".split("|"),t=0;;){switch(n[t++]){case"0":var r=o.JwXdv((e+=o.DHATF(JDjD,"I<"))[JDjD(o.IBaHO(o.IBaHO(o.IBaHO("i+",vc),Wc),wc)+"~")],24);continue;case"1":return[o.cxoSr(D,e),null,2];case"2":for(var u=function(n){for(var t,r=[],u=0;u~"),f.NMnIa(r,t));u+=JDjD(f.Hjwwb(f.zcctC("9",f.UNklo),"2")),u+=f.NMnIa(JDjD,f.hDAic(f.oVtfi(f.LWrWd,Xc),xc)+f.INfeE),document.cookie=u;try{window.localStorage&&localStorage.setItem(n,t),window.sessionStorage&&sessionStorage.setItem(n,t)}catch(e){}},function(n){var t,r=document.cookie,u=f.NMnIa(encodeURIComponent,n),e=r.indexOf(u),c=null;if(f.CHHJc(-1,e)){var o=r.indexOf(f.NxILx(JDjD,"Ko"),e);-1==o&&(o=r.length),c=f.NxILx(decodeURIComponent,r.substring(f.oVtfi(f.oVtfi(e,u.length),1),o))}try{window.localStorage&&(t=localStorage.getItem(n)),window.sessionStorage&&(t=t||sessionStorage.getItem(n))}catch(i){}return t||c}]},function(n,t,r){var u={PfTuG:function(n,t){return n(t)},iqDjx:function(n,t){return n+t}},e=document.charset||document.characterSet||"";n.exports={get:function(){return[e]}},u.PfTuG(r,103)[JDjD(u.iqDjx(u.iqDjx(Yc,"/W"),yc))](13)},function(n){n.exports=98},function(n,t){var e={BHCRY:function(n,t){return n(t)},VmeSe:function(n,t){return n