diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..64d248d --- /dev/null +++ b/.env.example @@ -0,0 +1,18 @@ +APP_DEBUG = false + +[APP] +DEFAULT_TIMEZONE = Asia/Shanghai +PROXY = + +[DATABASE] +TYPE = mysql +HOSTNAME = {{HOSTNAME}} +DATABASE = {{DATABASE}} +USERNAME = {{USERNAME}} +PASSWORD = {{PASSWORD}} +HOSTPORT = {{HOSTPORT}} +PREFIX = toolbox_ +DEBUG = false + +[LANG] +default_lang = zh-cn \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e8f8d09 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/.idea +/.vscode +/vendor +*.log \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..80ef291 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,42 @@ +sudo: false + +language: php + +branches: + only: + - stable + +cache: + directories: + - $HOME/.composer/cache + +before_install: + - composer self-update + +install: + - composer install --no-dev --no-interaction --ignore-platform-reqs + - zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Core.zip . + - composer require --update-no-dev --no-interaction "topthink/think-image:^1.0" + - composer require --update-no-dev --no-interaction "topthink/think-migration:^1.0" + - composer require --update-no-dev --no-interaction "topthink/think-captcha:^1.0" + - composer require --update-no-dev --no-interaction "topthink/think-mongo:^1.0" + - composer require --update-no-dev --no-interaction "topthink/think-worker:^1.0" + - composer require --update-no-dev --no-interaction "topthink/think-helper:^1.0" + - composer require --update-no-dev --no-interaction "topthink/think-queue:^1.0" + - composer require --update-no-dev --no-interaction "topthink/think-angular:^1.0" + - composer require --dev --update-no-dev --no-interaction "topthink/think-testing:^1.0" + - zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Full.zip . + +script: + - php think unit + +deploy: + provider: releases + api_key: + secure: TSF6bnl2JYN72UQOORAJYL+CqIryP2gHVKt6grfveQ7d9rleAEoxlq6PWxbvTI4jZ5nrPpUcBUpWIJHNgVcs+bzLFtyh5THaLqm39uCgBbrW7M8rI26L8sBh/6nsdtGgdeQrO/cLu31QoTzbwuz1WfAVoCdCkOSZeXyT/CclH99qV6RYyQYqaD2wpRjrhA5O4fSsEkiPVuk0GaOogFlrQHx+C+lHnf6pa1KxEoN1A0UxxVfGX6K4y5g4WQDO5zT4bLeubkWOXK0G51XSvACDOZVIyLdjApaOFTwamPcD3S1tfvuxRWWvsCD5ljFvb2kSmx5BIBNwN80MzuBmrGIC27XLGOxyMerwKxB6DskNUO9PflKHDPI61DRq0FTy1fv70SFMSiAtUv9aJRT41NQh9iJJ0vC8dl+xcxrWIjU1GG6+l/ZcRqVx9V1VuGQsLKndGhja7SQ+X1slHl76fRq223sMOql7MFCd0vvvxVQ2V39CcFKao/LB1aPH3VhODDEyxwx6aXoTznvC/QPepgWsHOWQzKj9ftsgDbsNiyFlXL4cu8DWUty6rQy8zT2b4O8b1xjcwSUCsy+auEjBamzQkMJFNlZAIUrukL/NbUhQU37TAbwsFyz7X0E/u/VMle/nBCNAzgkMwAUjiHM6FqrKKBRWFbPrSIixjfjkCnrMEPw= + file: + - ThinkPHP_Core.zip + - ThinkPHP_Full.zip + skip_cleanup: true + on: + tags: true diff --git a/README.md b/README.md new file mode 100644 index 0000000..affb2e1 --- /dev/null +++ b/README.md @@ -0,0 +1,73 @@ + +### 🎉 What's this? +这是一款`在线工具箱`程序,您可以通过安装扩展增强她的功能 +通过插件模板的功能,您也可以把她当做网页导航来使用~ + +### 😺 演示地址 + +* + +## 🎑 说明 +> 严禁用于非法用途 + +### 🎊 环境要求 + +* `PHP` >= 7.4 +* `MySQL` >= 5.6 +* `fileinfo`扩展 +* 使用`Redis`缓存需安装`Redis`扩展 + +### 🚠 部署 + +* 从[Release页面](https://github.com/netcccyun/toolbox/releases)下载源代码 + +* 设置运行目录(绑定目录)为`public` + +* 设置伪静态 + +* 如果是下载的Source code包,还需Composer安装依赖(Release页面下载的安装包不需要) + + 配置阿里镜像源(国内服务器可选) + ``` + composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ + ``` + + 升级compose + ``` + composer self-update + ``` + + 安装依赖 + ``` + composer install --no-dev + ``` + +* 打开网站会自动跳转到安装页面,根据界面提示完成安装。 + +* 更新方法:下载源码后直接上传覆盖即可 + +#### 🍰 伪静态 + +* Nginx +``` +location / { + if (!-e $request_filename){ + rewrite ^(.*)$ /index.php?s=$1 last; break; + } +} +``` +* Apache +``` + + Options +FollowSymlinks -Multiviews + RewriteEngine On + + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] + +``` +#### 🍓 鸣谢 +* [aoaostar](https://github.com/aoaostar/toolbox) +* vue +* thinkphp +* layui +* layuimini +* DashLite diff --git a/app/.htaccess b/app/.htaccess new file mode 100644 index 0000000..3418e55 --- /dev/null +++ b/app/.htaccess @@ -0,0 +1 @@ +deny from all \ No newline at end of file diff --git a/app/AppService.php b/app/AppService.php new file mode 100644 index 0000000..8b09c45 --- /dev/null +++ b/app/AppService.php @@ -0,0 +1,22 @@ +app = $app; + $this->request = $this->app->request; + + // 控制器初始化 + $this->initialize(); + } + + // 初始化 + protected function initialize() + {} + + /** + * 验证数据 + * @access protected + * @param array $data 数据 + * @param string|array $validate 验证器名或者验证规则数组 + * @param array $message 提示信息 + * @param bool $batch 是否批量验证 + * @return array|string|true + * @throws ValidateException + */ + protected function validate(array $data, $validate, array $message = [], bool $batch = false) + { + if (is_array($validate)) { + $v = new Validate(); + $v->rule($validate); + } else { + if (strpos($validate, '.')) { + // 支持场景 + [$validate, $scene] = explode('.', $validate); + } + $class = false !== strpos($validate, '\\') ? $validate : $this->app->parseClass('validate', $validate); + $v = new $class(); + if (!empty($scene)) { + $v->scene($scene); + } + } + + $v->message($message); + + // 是否批量验证 + if ($batch || $this->batchValidate) { + $v->batch(true); + } + + return $v->failException(true)->check($data); + } + +} diff --git a/app/ExceptionHandle.php b/app/ExceptionHandle.php new file mode 100644 index 0000000..9031efc --- /dev/null +++ b/app/ExceptionHandle.php @@ -0,0 +1,58 @@ +plugin = $plugin; + $this->clientip = real_ip(); + } + + protected function view($tpl = null){ + if($tpl == null) $tpl = strtolower(request()->param("method", "index")); + $template = plugin_path_get($this->plugin['class']) . '/'.$tpl.'.html'; + View::assign("plugin", $this->plugin); + return view($template); + } + + public function alert($code, $msg = '', $url = null, $wait = 3) + { + if ($url) { + $url = (strpos($url, '://') || 0 === strpos($url, '/')) ? $url : (string)$this->app->route->buildUrl($url); + } + if(empty($msg)) $msg = '未知错误'; + + View::assign([ + 'code' => $code, + 'msg' => $msg, + 'url' => $url, + 'wait' => $wait, + ]); + return View::fetch(app()->getRootPath().'view/dispatch_jump.html'); + } + +} \ No newline at end of file diff --git a/app/Request.php b/app/Request.php new file mode 100644 index 0000000..b30b1df --- /dev/null +++ b/app/Request.php @@ -0,0 +1,8 @@ +setName('cron') + ->setDescription('定时数据清理任务'); + } + + protected function execute(Input $input, Output $output) + { + // 指令输出 + Db::name('querycache')->where('uptime','<',date('Y-m-d H:i:s', strtotime('-30 days')))->delete(); + $output->writeln('定时数据清理任务执行完毕'); + } +} diff --git a/app/command/PluginPackage.php b/app/command/PluginPackage.php new file mode 100644 index 0000000..10a4951 --- /dev/null +++ b/app/command/PluginPackage.php @@ -0,0 +1,55 @@ +setName('plugin:package') + ->addArgument('space', Argument::REQUIRED, '插件域,例如:utility') + ->setDescription('打包指定域的所有插件'); + } + + protected function execute(Input $input, Output $output) + { + $space = $input->getArgument('space'); + // 指令输出 + $rootPath = app()->getRootPath() . '/plugin/'; + if (!is_dir($rootPath . $space)) { + $output->writeln("该域不存在:[$space]"); + return; + } + $plugins = glob($rootPath . $space . '/*'); + $output->writeln("正在打包:[$space]下的文件"); + foreach ($plugins as $plugin) { + $zip = new ZipArchive(); + $filename = $rootPath . 'output/' . $space . DIRECTORY_SEPARATOR . basename($plugin) . '.zip'; + if (!is_dir(dirname($filename))) { + mkdir(dirname($filename), 0777, true); + } + if ($zip->open($filename, ZipArchive::CREATE | ZipArchive::OVERWRITE)) { + + $tree_relative = tree_relative($plugin); + $files = multi2one($tree_relative, '', '/'); + foreach ($files as $file) { + if ($file !== '.' && $file !== '..') { + $zip->addFile($plugin . '/' . $file, $space . '/' . basename($plugin) . '/' . $file); + } + } + } + $zip->close(); + $output->writeln("打包成功:[$filename]"); + } + + $output->writeln("该域所有文件都已打包完成:[$space]"); + } +} diff --git a/app/common.php b/app/common.php new file mode 100644 index 0000000..1438d8d --- /dev/null +++ b/app/common.php @@ -0,0 +1,476 @@ +getRootPath() . config("view.view_dir_name") . '/index/' . config_get('template') . DIRECTORY_SEPARATOR; +} + +function plugin_alias_get() +{ + return trim(request()->param("alias"), '\\/'); +} + +function plugin_method_get() +{ + return request()->param("method", "index"); +} + +function plugin_current_class_get($namespace) +{ + return str_replace('plugin\\', '', $namespace); +} + +function plugin_path_get($class = '') +{ + $class = str_replace(['\\', '/'], DIRECTORY_SEPARATOR, $class); + return realpath(app()->getRootPath() . "/plugin/$class"); +} + +function plugin_info_get($alias = '') +{ + $plugin = Db::name('plugin')->where('alias',$alias)->where('enable',1)->find(); + if(!$plugin) return null; + if(!plugin_userlevel($plugin['level'])) return null; + $plugin['is_star'] = 0; + if(request()->islogin){ + $stars = explode(',', request()->user['stars']); + if(in_array($plugin['id'], $stars)){ + $plugin['is_star'] = 1; + } + } + return $plugin; +} + + +function msg($status = "ok", $message = "success", $data = []) +{ + return json([ + "status" => $status, + "message" => $message, + "data" => $data, + ]); +} + +function reset_opcache() +{ + if (function_exists('opcache_reset')) opcache_reset(); +} + +function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) { + $ckey_length = 4; + $key = md5($key); + $keya = md5(substr($key, 0, 16)); + $keyb = md5(substr($key, 16, 16)); + $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : ''; + $cryptkey = $keya.md5($keya.$keyc); + $key_length = strlen($cryptkey); + $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string; + $string_length = strlen($string); + $result = ''; + $box = range(0, 255); + $rndkey = array(); + for($i = 0; $i <= 255; $i++) { + $rndkey[$i] = ord($cryptkey[$i % $key_length]); + } + for($j = $i = 0; $i < 256; $i++) { + $j = ($j + $box[$i] + $rndkey[$i]) % 256; + $tmp = $box[$i]; + $box[$i] = $box[$j]; + $box[$j] = $tmp; + } + for($a = $j = $i = 0; $i < $string_length; $i++) { + $a = ($a + 1) % 256; + $j = ($j + $box[$a]) % 256; + $tmp = $box[$a]; + $box[$a] = $box[$j]; + $box[$j] = $tmp; + $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256])); + } + if($operation == 'DECODE') { + if(((int)substr($result, 0, 10) == 0 || (int)substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) { + return substr($result, 26); + } else { + return ''; + } + } else { + return $keyc.str_replace('=', '', base64_encode($result)); + } +} + +function get_curl($url, $post=0, $referer=0, $cookie=0, $header=0, $ua=0, $nobody=0, $addheader=0) +{ + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + $httpheader[] = "Accept: */*"; + $httpheader[] = "Accept-Encoding: gzip,deflate,sdch"; + $httpheader[] = "Accept-Language: zh-CN,zh;q=0.8"; + $httpheader[] = "Connection: close"; + if($addheader){ + $httpheader = array_merge($httpheader, $addheader); + } + curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader); + if ($post) { + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, $post); + } + if ($header) { + curl_setopt($ch, CURLOPT_HEADER, true); + } + if ($cookie) { + curl_setopt($ch, CURLOPT_COOKIE, $cookie); + } + if($referer){ + curl_setopt($ch, CURLOPT_REFERER, $referer); + } + if ($ua) { + curl_setopt($ch, CURLOPT_USERAGENT, $ua); + } + else { + curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"); + } + if ($nobody) { + curl_setopt($ch, CURLOPT_NOBODY, 1); + } + curl_setopt($ch, CURLOPT_ENCODING, "gzip"); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + $ret = curl_exec($ch); + curl_close($ch); + return $ret; +} + +function jsonp_decode($jsonp, $assoc = false) +{ + $jsonp = trim($jsonp); + if(isset($jsonp[0]) && $jsonp[0] !== '[' && $jsonp[0] !== '{') { + $begin = strpos($jsonp, '('); + if(false !== $begin) + { + $end = strrpos($jsonp, ')'); + if(false !== $end) + { + $jsonp = substr($jsonp, $begin + 1, $end - $begin - 1); + } + } + } + return json_decode($jsonp, $assoc); +} + +function dgmdate($timestamp, $d_format = 'Y-m-d H:i') { + $timestamp=strtotime($timestamp); + $timestamp += 8 * 3600; + $todaytimestamp = time() - (time() + 8 * 3600) % 86400 + 8 * 3600; + $s = gmdate($d_format, $timestamp); + $time = time() + 8 * 3600 - $timestamp; + if($timestamp >= $todaytimestamp) { + if($time > 3600) { + return ''.intval($time / 3600).' 小时前'; + } elseif($time > 1800) { + return '半小时前'; + } elseif($time > 60) { + return ''.intval($time / 60).' 分钟前'; + } elseif($time > 0) { + return ''.$time.' 秒前'; + } elseif($time == 0 || $time < 0) { + return '刚刚'; + } else { + return $s; + } + } elseif(($days = intval(($todaytimestamp - $timestamp) / 86400)) >= 0 && $days < 7) { + if($days == 0) { + return '昨天 '.gmdate('H:i', $timestamp).''; + } elseif($days == 1) { + return '前天 '.gmdate('H:i', $timestamp).''; + } else { + return ''.($days + 1).' 天前'; + } + } else { + return $s; + } +} + +function unzip($filepath, $filename) +{ + if (!file_exists($filepath)) { + return false; + } + $zip = new ZipArchive; + + if ($zip->open($filepath) === true) { + $zip->extractTo($filename); + $zip->close(); + return true; + } + return false; +} + +//多维转一维数组 +function multi2one($data, $dir = '', $step = '') +{ + $list = []; + foreach ($data as $k => $v) { + if (is_array($v)) { + $list = array_merge($list, multi2one($v, $dir . $step . $k, $step)); + } else { + $list[] = ltrim($dir . $step . $v, '\\/'); + } + } + return $list; +} + +function tree_relative($dir) +{ + if (!is_dir($dir)) { + return [basename($dir)]; + } + $arr = []; + $scandir = scandir($dir); + foreach ($scandir as $v) { + if ($v != '.' && $v != '..') { + if (is_dir("$dir/$v")) { + $arr[$v] = tree_relative("$dir/$v"); + } else { + $arr[] = $v; + } + } + } + return $arr; +} + +function copy_dir($src, $target) +{ + if (!is_dir($target)) { + mkdir($target, 0777, true); + } + foreach (glob($src . '/*') as $filename) { + $targetFilename = $target . '/' . basename($filename); + if (is_dir($filename)) { + // 如果是目录,递归合并子目录下的文件。 + copy_dir($filename, $targetFilename); + } elseif (is_file($filename)) { + copy($filename, $targetFilename); + } + } +} + +function del_tree($dir) +{ + if (!file_exists($dir)) { + return true; + } + $files = array_diff(scandir($dir), array('.', '..')); + + foreach ($files as $file) { + (is_dir("$dir/$file")) ? del_tree("$dir/$file") : unlink("$dir/$file"); + } + + return rmdir($dir); +} + +function config_get($key, $default = null) +{ + $value = config('sys.'.$key); + return $value ?: $default; +} + +function config_set($key, $value) +{ + $res = Db::name('config')->replace()->insert(['key'=>$key, 'value'=>$value]); + return $res!==false; +} + +function get_version() +{ + return VERSION; +} + +function format_date($timestamp = null) +{ + if ($timestamp === null) { + $timestamp = time(); + } + return date('Y-m-d H:i:s', $timestamp); +} + +//当前命名空间的包名 +function base_space_name($space) +{ + $str_replace = str_replace('\\', '/', $space); + return basename($str_replace); +} + +if (!function_exists('str_starts_with')) { + function str_starts_with($str, $start) + { + return (@substr_compare($str, $start, 0, strlen($start)) == 0); + } +} +if (!function_exists('str_ends_with')) { + function str_ends_with(string $haystack, string $needle): bool + { + $needle_len = strlen($needle); + return ($needle_len === 0 || 0 === substr_compare($haystack, $needle, -$needle_len)); + } +} + +if (!function_exists('is_valid_url')) { + + function is_valid_url($url = null) + { + if (empty($url)) return false; + if (!is_string($url)) return false; + $filter_var = boolval(filter_var($url, FILTER_VALIDATE_URL)); + if ($filter_var) return $filter_var; + $parse_url = parse_url($url); + $path = array_pop($parse_url); + + $url = str_ireplace($path, '/' . urlencode($path), $url); + return boolval(filter_var($url, FILTER_VALIDATE_URL)); + } + +} + +function real_ip($type=0){ + $ip = $_SERVER['REMOTE_ADDR']; + if($type<=0 && isset($_SERVER['HTTP_X_FORWARDED_FOR']) && preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) { + foreach ($matches[0] AS $xip) { + if (filter_var($xip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { + $ip = $xip; + break; + } + } + } elseif ($type<=0 && isset($_SERVER['HTTP_CLIENT_IP']) && filter_var($_SERVER['HTTP_CLIENT_IP'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { + $ip = $_SERVER['HTTP_CLIENT_IP']; + } elseif ($type<=1 && isset($_SERVER['HTTP_CF_CONNECTING_IP']) && filter_var($_SERVER['HTTP_CF_CONNECTING_IP'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { + $ip = $_SERVER['HTTP_CF_CONNECTING_IP']; + } elseif ($type<=1 && isset($_SERVER['HTTP_ALI_CDN_REAL_IP']) && filter_var($_SERVER['HTTP_ALI_CDN_REAL_IP'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { + $ip = $_SERVER['HTTP_ALI_CDN_REAL_IP']; + } elseif ($type<=1 && isset($_SERVER['HTTP_X_REAL_IP']) && filter_var($_SERVER['HTTP_X_REAL_IP'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { + $ip = $_SERVER['HTTP_X_REAL_IP']; + } + return $ip; +} + +function get_ip_city($ip){ + $new = new \app\lib\IpLocation(); + $arr = $new->getlocation($ip); + if($arr){ + return $arr['province'].$arr['city']; + }else{ + return false; + } +} + +function get_plugin_url($alias){ + if(substr($alias,0,1) == '/' || substr($alias,0,7) == 'http://' || substr($alias,0,8) == 'https://'){ + $url = $alias; + }else{ + $url = '/'.$alias; + } + return $url; +} + +//极验3.0服务端验证 +function verify_captcha(){ + if(session('gtserver') === null)return '验证加载失败'; + $GtSdk = new \app\lib\GeetestLib(config_get('captcha_id'), config_get('captcha_key')); + $data = array( + 'user_id' => request()->islogin?request()->user['id']:'public', + 'client_type' => "web", + 'ip_address' => real_ip() + ); + if (session('gtserver') == 1) { //服务器正常 + if ($GtSdk->success_validate(input('post.geetest_challenge'), input('post.geetest_validate'), input('post.geetest_seccode'), $data)) { + return true; + } + }else{ //服务器宕机,走failback模式 + if ($GtSdk->fail_validate(input('post.geetest_challenge'), input('post.geetest_validate'), input('post.geetest_seccode'))) { + return true; + } + } + return '验证失败,请重新验证'; +} + +//极验4.0服务端验证(无感) +function verify_captcha4(){ + if(!input('?post.captcha_id') || !input('?post.lot_number') || !input('?post.pass_token') || !input('?post.gen_time') || !input('?post.captcha_output')) return false; + $real_ip = real_ip(); + $url = 'http://gt4.geetest.com/demov4/demo/login'; + $param = ['captcha_id'=>input('post.captcha_id'), 'lot_number'=>input('post.lot_number'), 'pass_token'=>input('post.pass_token'), 'gen_time'=>input('post.gen_time'), 'captcha_output'=>input('post.captcha_output')]; + $referer = 'http://gt4.geetest.com/demov4/invisible-bind-zh.html'; + $httpheader[] = "X-Real-IP: ".$real_ip; + $httpheader[] = "X-Forwarded-For: ".$real_ip; + $data = get_curl($url.'?'.http_build_query($param),0,$referer,0,0,0,0,$httpheader); + $arr = json_decode($data, true); + if(isset($arr['result']) && $arr['result'] == 'success'){ + return true; + } + return false; +} + +//极验4.0服务端验证(滑动) +function verify_captcha4_slide(){ + return verify_captcha4(); + if(!input('?post.captcha_id') || !input('?post.lot_number') || !input('?post.pass_token') || !input('?post.gen_time') || !input('?post.captcha_output')) return false; + $url = 'http://gcaptcha4.geetest.com/validate?captcha_id='.input('post.captcha_id'); + $param = ['lot_number'=>input('post.lot_number'), 'pass_token'=>input('post.pass_token'), 'gen_time'=>input('post.gen_time'), 'captcha_output'=>input('post.captcha_output')]; + $param['sign_token'] = hash_hmac('sha256', $param['lot_number'], config_get('captcha_key')); + $data = get_curl($url, http_build_query($param)); + $arr = json_decode($data, true); + if(isset($arr['status']) && $arr['status']=='success'){ + if(isset($arr['result']) && $arr['result'] == 'success'){ + return true; + }else{ + return '验证失败,'.$arr['reason']; + } + }else{ + return '验证失败,'.($arr['msg']?$arr['msg']:'请重新验证'); + } +} + +function checkdomain($domain){ + if(empty($domain))return false; + if (!preg_match('/^[a-zA-Z0-9:\_\.\-]{2,512}$/i', $domain) || strpos($domain, '.') === false || substr($domain, -1) == '.' || substr($domain, 0 ,1) == '.' || strpos($domain, '*') !== false) { + return false; + } + return true; +} + +/** + * 取中间文本 + * @param string $str + * @param string $leftStr + * @param string $rightStr + */ +function getSubstr($str, $leftStr, $rightStr) +{ + $left = strpos($str, $leftStr); + $start = $left+strlen($leftStr); + $right = strpos($str, $rightStr, $start); + if($left < 0) return ''; + if($right>0){ + return substr($str, $start, $right-$start); + }else{ + return substr($str, $start); + } +} + +function plugin_userlevel($level){ + if($level > 0){ + if(!request()->islogin) return false; + if(request()->user['level']<$level) return false; + } + return true; +} + +function checkRefererHost(){ + if(!request()->header('referer'))return false; + $url_arr = parse_url(request()->header('referer')); + $http_host = request()->header('host'); + if(strpos($http_host,':'))$http_host = substr($http_host, 0, strpos($http_host, ':')); + return $url_arr['host'] === $http_host; +} \ No newline at end of file diff --git a/app/controller/Auth.php b/app/controller/Auth.php new file mode 100644 index 0000000..7894bbd --- /dev/null +++ b/app/controller/Auth.php @@ -0,0 +1,220 @@ +islogin) { + return $this->alert('success', '已登录', '/'); + } + View::assign(['is_qq'=>config_get('oauth_openqq'), 'is_wx'=>config_get('oauth_openxw')]); + return view(); + } + + private function oauth_config(){ + return [ + 'apiurl' => config_get('oauth_appurl'), + 'appid' => config_get('oauth_appid'), + 'appkey' => config_get('oauth_appkey'), + 'callback' => (string)url('/oauth/callback', [], '', true), + ]; + } + + public function oauth() + { + $type = input('post.type'); + if(!$type){ + return msg('error', '登录方式不能为空'); + } + $state = md5(uniqid(rand(), TRUE)); + session('oauth_state', $state); + $oauth = new Oauth($this->oauth_config()); + $res = $oauth->login($type, $state); + if(isset($res['code']) && $res['code']==0){ + return msg('ok', 'success', $res['url']); + }else{ + return msg('error', $res ? $res['msg'] : '登录地址获取失败'); + } + } + + public function callback() + { + $code = input('get.code'); + $state = input('get.state'); + if (empty($code)) { + return $this->alert('error', 'code不能为空', '/login'); + } + + if(!$state || $state != session('oauth_state')){ + return $this->alert('error', 'state校验失败,请重新登录', '/login'); + } + + $oauth = new Oauth($this->oauth_config()); + $res = $oauth->callback($code); + if(isset($res['code']) && $res['code']==0){ + $type = $res['type']; + $openid = $res['social_uid']; + if(empty($res['nickname'])) $res['nickname'] = $type.Str::random(5); + $user = Db::name('user')->where('type', $type)->where('openid', $openid)->find(); + if($user){ + if($user['enable']==0){ + session('user_block', '1'); + return $this->alert('error', '当前用户已被禁止登录', '/'); + } + $uid = $user['id']; + $password = $user['password']; + Db::name('user')->where('id', $uid)->update([ + 'avatar_url' => $res['faceimg'], + 'loginip' => $this->clientip, + 'update_time' => date('Y-m-d H:i:s') + ]); + if(session('user_block') == '1'){ + Db::name('user')->where('id', $uid)->update(['enable' => 0]); + return $this->alert('error', '当前用户已被禁止登录', '/'); + } + }else{ + $password = Str::random(16); + $uid = Db::name('user')->insertGetId([ + 'type' => $type, + 'openid' => $openid, + 'username' => $res['nickname'], + 'password' => $password, + 'avatar_url' => $res['faceimg'], + 'regip' => $this->clientip, + 'create_time' => date('Y-m-d H:i:s'), + 'update_time' => date('Y-m-d H:i:s') + ]); + if(session('user_block') == '1'){ + Db::name('user')->where('id', $uid)->update(['enable' => 0]); + return $this->alert('error', '当前用户已被禁止登录', '/'); + } + } + + $session = md5($uid.$password); + $expiretime = time()+30744000; + $token = authcode("{$uid}\t{$session}\t{$expiretime}", 'ENCODE', config_get('syskey')); + cookie('user_token', $token, ['expire' => $expiretime, 'httponly' => true]); + session('oauth_state', null); + + return redirect("/"); + }else{ + return $this->alert('error', $res ? $res['msg'] : '登录数据获取失败'); + } + } + + public function logout() + { + //session(null); + cookie('user_token', null); + return redirect(request()->header('referer') ?? '/'); + } + + public function verifycode() + { + return captcha(); + } + + public function adminlogin(){ + $username = input('post.username',null,'trim'); + $password = input('post.password',null,'trim'); + $captcha = input('post.captcha',null,'trim'); + + if(empty($username) || empty($password)){ + return msg('error', '用户名或密码不能为空'); + } + if(!captcha_check($captcha)){ + return msg('error', '验证码错误'); + } + if($username == config_get('admin_username') && password_verify($password, config_get('admin_password'))){ + $session = md5($username.config_get('admin_password')); + $expiretime = time()+2562000; + $token = authcode("{$username}\t{$session}\t{$expiretime}", 'ENCODE', config_get('syskey')); + cookie('admin_token', $token, ['expire' => $expiretime, 'httponly' => true]); + config_set('admin_lastlogin', date('Y-m-d H:i:s')); + return msg(); + }else{ + return msg('error', '用户名或密码错误'); + } + } + + public function adminlogout() + { + cookie('admin_token', null); + return redirect('/admin/login.html'); + } + + public function qqlogin_api(){ + $do = input('get.do'); + $type = input('get.type'); + $info = $this->getQqloginInfo($type); + if(!$info){ + return json(['saveOK'=>1, 'msg'=>'该登录类型不存在']); + } + + $login = new \app\lib\QQLogin(); + if($do == 'getqrpic'){ + $array = $login->getqrpic($info[0]); + } + elseif($do == 'qrlogin'){ + $array = $login->qrlogin($info[0], $info[1], input('get.qrsig')); + if($array['saveOK'] == 0){ + $cookie = ['uin' => $array['uin'], 'cookie' => $array['cookie'], 'nickname' => $array['nickname']]; + session('qq_cookie_'.$type, $cookie); + } + } + + return json($array); + } + + public function qqlogin(){ + if(!checkRefererHost()){ + return redirect('/'); + } + + $redirect = input('get.redirect'); + $type = input('get.type'); + if(!$redirect || !$type){ + return $this->alert('error', '缺少参数', '/'); + } + $info = $this->getQqloginInfo($type); + if(!$info){ + return $this->alert('error', '该登录类型不存在', '/'); + } + if (substr($redirect,0,1)!='/') { + return $this->alert('error', '回调地址错误', '/'); + } + + View::assign('logintype', base64_encode($type)); + View::assign('loginname', base64_encode($info[2])); + View::assign('redirect', base64_encode($redirect)); + return view(); + } + + private function getQqloginInfo($type){ + switch($type){ + case 'qzone': + return ['5','https://qzs.qq.com/qzone/v5/loginsucc.html?para=izone', 'QQ空间']; + break; + case 'qun': + return ['73','https://qun.qq.com/', 'QQ群管理']; + break; + case 'qqid': + return ['1','https://id.qq.com/index.html' ,'我的QQ中心']; + break; + default: + return null; + break; + } + } + +} \ No newline at end of file diff --git a/app/controller/Base.php b/app/controller/Base.php new file mode 100644 index 0000000..0d47588 --- /dev/null +++ b/app/controller/Base.php @@ -0,0 +1,37 @@ +clientip = real_ip(config_get('ip_type')??0); + parent::initialize(); + + } + + protected function alert($code, $msg = '', $url = null, $wait = 3) + { + if ($url) { + $url = (strpos($url, '://') || 0 === strpos($url, '/')) ? $url : (string)$this->app->route->buildUrl($url); + } + if(empty($msg)) $msg = '未知错误'; + + View::assign([ + 'code' => $code, + 'msg' => $msg, + 'url' => $url, + 'wait' => $wait, + ]); + return View::fetch(app()->getRootPath().'view/dispatch_jump.html'); + } + +} \ No newline at end of file diff --git a/app/controller/Index.php b/app/controller/Index.php new file mode 100644 index 0000000..54222f5 --- /dev/null +++ b/app/controller/Index.php @@ -0,0 +1,226 @@ +cache('categorys', self::CACHE_TIME)->field('id,title,icon')->where('enable', 1)->order('weight','desc')->select(); + $link = Db::name('link')->cache('links', self::CACHE_TIME)->field('id,name,url')->where('enable', 1)->order('weight','desc')->select(); + + $tool = Db::name('plugin')->cache('plugins', self::CACHE_TIME)->field('id,title,alias,keyword,request_count,category_id,level')->where('enable', 1)->order('weight','desc')->select(); + $list = []; + foreach($category as $item){ + $list2 = []; + foreach($tool as $row){ + if(!plugin_userlevel($row['level'])) continue; + if($row['category_id'] == $item['id']){ + $row['url'] = get_plugin_url($row['alias']); + $row['out'] = substr($row['alias'],0,1) == '/' || substr($row['alias'],0,7) == 'http://' || substr($row['alias'],0,8) == 'https://'; + $list2[] = $row; + } + } + $list[] = ['id'=>$item['id'], 'title'=>$item['title'], 'icon'=>$item['icon'], 'items'=>$list2]; + } + + View::assign('category', $category); + View::assign('tool', $list); + View::assign('link', $link); + return view(); + } + + public function stars() + { + if(request()->isAjax()){ + if(!request()->islogin){ + return msg('error', '登录后才能收藏工具'); + } + $uid = request()->user['id']; + $do = input('post.do'); + if($do == 'clear'){ + Db::name('user')->where('id', $uid)->update(['stars'=>'']); + return msg(); + } + $id = input('post.id/d'); + if(empty($do) || empty($id)) return msg('error', 'param error'); + $plugin = Db::name('plugin')->where('id', $id)->where('enable',1)->find(); + if(!$plugin) return msg('error', '工具不存在'); + $stars = explode(',',request()->user['stars']); + if ($do == 'add' && !in_array($id, $stars)) { + array_push($stars, $id); + } elseif ($do == 'del') { + if (($key = array_search($id, $stars)) !== false) { + unset($stars[$key]); + } + } + $stars = implode(',', array_unique(array_values($stars))); + Db::name('user')->where('id', $uid)->update(['stars'=>$stars]); + return msg('ok', $do == 'add' ? '添加收藏成功!' : '取消收藏成功!'); + } + + if(!request()->islogin){ + return $this->alert('info', '请先登录', '/login'); + } + + $category = Db::name('category')->cache('categorys', self::CACHE_TIME)->field('id,title,icon')->where('enable', 1)->order('weight','desc')->select(); + $list = []; + + $stars = request()->user['stars']; + if(strlen($stars)>0){ + $stars = explode(',',$stars); + $tool = Db::name('plugin')->cache('plugins', self::CACHE_TIME)->field('id,title,alias,keyword,request_count,category_id')->where('enable', 1)->order('weight','desc')->select(); + $list = []; + foreach($category as $item){ + foreach($tool as $row){ + if(!plugin_userlevel($row['level'])) continue; + if($row['category_id'] == $item['id'] && in_array($row['id'],$stars)){ + $row['url'] = get_plugin_url($row['alias']); + $row['out'] = substr($row['alias'],0,1) == '/' || substr($row['alias'],0,7) == 'http://' || substr($row['alias'],0,8) == 'https://'; + $list[] = $row; + } + } + } + } + + View::assign('category', $category); + View::assign('tool', $list); + return view(); + } + + public function history() + { + if(request()->isAjax()){ + $do = input('post.do'); + if($do == 'clear'){ + cookie('tools', null); + return msg(); + } + } + + $category = Db::name('category')->cache('categorys', self::CACHE_TIME)->field('id,title,icon')->where('enable', 1)->order('weight','desc')->select(); + $list = []; + + $history = cookie('tools'); + if(strlen($history)>0){ + $history = array_reverse(array_unique(explode(',',$history))); + $tool = Db::name('plugin')->cache('plugins', self::CACHE_TIME)->field('id,title,alias,keyword,request_count,category_id')->where('enable', 1)->order('weight','desc')->select(); + $newtool = []; + foreach($tool as $row){ + $newtool[$row['id']] = $row; + } + $list = []; + foreach($history as $id){ + $row = $newtool[$id]; + if(!$row) continue; + if(!plugin_userlevel($row['level'])) continue; + $row['url'] = get_plugin_url($row['alias']); + $row['out'] = substr($row['alias'],0,1) == '/' || substr($row['alias'],0,7) == 'http://' || substr($row['alias'],0,8) == 'https://'; + $list[] = $row; + } + } + + View::assign('category', $category); + View::assign('tool', $list); + return view(); + } + + public function comment(){ + if(request()->isAjax()){ + $do = input('param.do'); + if($do == 'add'){ + if(!request()->islogin){ + return msg('error', '登录后才能提交留言'); + } + $email = input('post.email', null, 'trim,strip_tags,htmlspecialchars'); + $content = input('post.content', null, 'trim,strip_tags,htmlspecialchars'); + + $data = [ + 'uid' => request()->user['id'], + 'email' => $email, + 'content' => $content, + 'enable' => 0, + 'create_time' => date("Y-m-d H:i:s"), + 'update_time' => date("Y-m-d H:i:s") + ]; + $validate = Validate::rule([ + 'email|电子邮箱' => 'require|email', + 'content|留言内容' => 'require', + ]); + if (!$validate->check($data)) { + return msg('error', $validate->getError()); + } + + $captcha_result = verify_captcha4_slide(); + if($captcha_result !== true){ + return msg('error', $captcha_result); + } + + $last = Db::name('comment')->where('uid', request()->user['id'])->order('id','desc')->find(); + if($last && time() - strtotime($last['create_time']) < 600){ + return msg('error', '你发表留言的速度太快了,过段时间再来吧'); + } + + Db::name('comment')->insert($data); + return msg(); + }else{ + $page = input('get.page/d'); + $limit = 5; + $uid = request()->islogin ? request()->user['id'] : 0; + $select = Db::name('comment')->alias('A')->leftJoin('user B', 'A.uid=B.id')->field('A.id,A.uid,content,reply,A.enable,A.create_time,A.update_time,B.username,B.avatar_url')->where('A.enable', 1)->whereOr('A.uid', $uid); + $total = $select->count(); + $comment = $select->order('id','desc')->page($page, $limit)->select(); + $items = []; + foreach($comment as $item){ + if(!$item['avatar_url']) $item['avatar_url'] = '/static/images/user.png'; + $item['time'] = dgmdate($item['create_time']); + $items[] = $item; + } + return msg('ok', 'success', ['total'=>$total, 'page'=>$page, 'pagenum'=>ceil($total/$limit), 'items'=>$items]); + } + } + return view(); + } + + public function captcha(){ + $GtSdk = new \app\lib\GeetestLib(config_get('captcha_id'), config_get('captcha_key')); + $data = array( + 'user_id' => request()->islogin?request()->user['id']:'public', + 'client_type' => "web", + 'ip_address' => $this->clientip + ); + $result = $GtSdk->pre_process($data); + session('gtserver', $result['success']); + return json($result); + } + + public function statistics(){ + $id = input('post.id/d'); + if(!$id) return msg('error', 'param error'); + $plugin = Db::name('plugin')->where('id', $id)->where('enable', 1)->find(); + if(!$plugin) return msg('error', '工具不存在'); + Db::name('plugin')->where('id', $id)->inc('request_count')->update(); + + $history = cookie('tools'); + if(!$history) $history = []; + else $history = array_unique(explode(',',$history)); + if(in_array($id, $history)){ + $key = array_search($id,$history); + unset($history[$key]); + } + $history[] = $id; + if(count($history) > 20){ + $history = array_splice($history, 0, 20); + } + cookie('tools', implode(',', $history)); + + return msg(); + } + +} diff --git a/app/controller/Install.php b/app/controller/Install.php new file mode 100644 index 0000000..91b95e5 --- /dev/null +++ b/app/controller/Install.php @@ -0,0 +1,131 @@ +getRootPath() . 'install.lock')) { + exit('你已安装成功,需要重新安装请删除 install.lock 文件'); + } + Cache::clear(); + reset_opcache(); + } + + public function index() + { + // 检查安装环境 + $requirements = [ + 'PHP >= 7.4' => PHP_VERSION >= 7.4, + 'PDO_MySQL' => extension_loaded("pdo_mysql"), + 'CURL' => extension_loaded("curl"), + 'ZipArchive' => class_exists("ZipArchive"), + 'runtime写入权限' => is_writable(app()->getRuntimePath()), + ]; + reset_opcache(); + $step = Request::param('step'); + View::assign([ + 'step' => $step, + 'requirements' => $requirements, + ]); + return view('../view/install/index.html'); + } + + public function database() + { + $params = Request::param(); + $rules = [ + 'hostname' => 'require', + 'hostport' => 'require|integer', + 'username' => 'require', + 'password' => 'require', + 'database' => 'require', + ]; + $validate = Validate::rule($rules); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + $dsn = 'mysql:host=' . $params['hostname'] . ';dbname=' . $params['database'] . ';port=' . $params['hostport'] . ';charset=utf8'; + try { + new PDO($dsn, $params['username'], $params['password']); + } catch (\Exception $e) { + return msg('error', $e->getMessage()); + } + try { + $envFile = file_get_contents(app()->getRootPath() . '.env.example'); + $envOperation = new EnvOperation($envFile); + foreach (array_keys($rules) as $value) { + $envOperation->set(mb_strtoupper($value), $params[$value]); + } + $envOperation->save(); + } catch (\Exception $e) { + return msg('error', $e->getMessage()); + } + return msg(); + } + + public function init_data() + { + try { + + $filename = app()->getRootPath() . 'install.sql'; + if (!is_file($filename)) { + throw new Exception('数据库 install.sql 文件不存在'); + } + $install_sql = file($filename); + //写入数据库 + $execSQL = new ExecSQL(); + $install_sql = $execSQL->purify($install_sql); + foreach ($install_sql as $sql) { + $execSQL->exec($sql); + if (!empty($execSQL->getErrors())) { + throw new Exception($execSQL->getErrors()[0]); + } + } + } catch (\Exception $e) { + return msg('error', $e->getMessage()); + } + return msg(); + } + + public function admin() + { + $params = Request::param(); + $rules = [ + 'username|用户名' => 'require', + 'password|密码' => 'require', + ]; + $validate = Validate::rule($rules); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + config_set("admin_username", $params['username']); + config_set("admin_password", password_hash($params['password'], PASSWORD_DEFAULT)); + config_set("syskey", Str::random(16)); + file_put_contents(app()->getRootPath() . 'install.lock', format_date()); + return msg(); + } + +} diff --git a/app/controller/admin/Category.php b/app/controller/admin/Category.php new file mode 100644 index 0000000..182f4f8 --- /dev/null +++ b/app/controller/admin/Category.php @@ -0,0 +1,134 @@ + 'integer', + 'limit' => 'integer', + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + $page = isset($params['page']) ? intval($params['page']) : 1; + $limit = isset($params['limit']) ? intval($params['limit']) : 50; + + $select = Db::name('category'); + if(!empty($params['title'])){ + $select->where('title', 'like', '%' . $params['title'] . '%'); + } + $total = $select->count(); + $items = $select->order('weight','desc')->page($page, $limit)->select(); + + return msg("ok", "success", ['total'=>$total, 'items'=>$items]); + } + + public function get() + { + $params = Request::param(); + + $validate = Validate::rule([ + 'id' => 'require|integer', + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + $item = Db::name('category')->where('id', $params['id'])->findOrEmpty(); + + return msg('ok', 'success', $item); + } + + public function add() + { + $params = Request::param(); + + $validate = Validate::rule([ + 'title|分类标题' => 'require|unique:category', + 'icon|小图标' => 'require', + 'weight|权重' => 'require|integer', + 'enable' => 'integer', + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + Db::name('category')->cache('categorys')->insert([ + 'title' => trim($params['title']), + 'icon' => trim($params['icon']), + 'weight' => $params['weight'], + 'enable' => $params['enable'], + 'create_time' => date("Y-m-d H:i:s"), + 'update_time' => date("Y-m-d H:i:s") + ]); + + return msg(); + } + + public function edit() + { + $params = Request::param(); + + $validate = Validate::rule([ + 'id' => 'require', + 'icon|小图标' => 'require', + 'title|分类标题' => 'require|unique:category', + 'weight|权重' => 'require|integer', + 'enable' => 'integer', + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + Db::name('category')->cache('categorys')->where('id', $params['id'])->update([ + 'title' => trim($params['title']), + 'icon' => trim($params['icon']), + 'weight' => $params['weight'], + 'enable' => $params['enable'], + 'update_time' => date("Y-m-d H:i:s") + ]); + + return msg(); + } + + public function enable() + { + $id = input('post.id/d'); + $enable = input('post.enable/d'); + + Db::name('category')->cache('categorys')->where('id', $id)->update([ + 'enable' => $enable, + 'update_time' => date("Y-m-d H:i:s") + ]); + + return msg(); + } + + public function delete() + { + $params = Request::param(); + + $validate = Validate::rule([ + 'id' => 'require|integer', + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + Db::name('category')->cache('categorys')->where('id', $params['id'])->delete(); + + return msg(); + } +} \ No newline at end of file diff --git a/app/controller/admin/Comment.php b/app/controller/admin/Comment.php new file mode 100644 index 0000000..00f9e9c --- /dev/null +++ b/app/controller/admin/Comment.php @@ -0,0 +1,140 @@ + 'integer', + 'limit' => 'integer', + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + $page = intval($params['page']); + $limit = intval($params['limit']); + + $select = Db::name('comment'); + if(!empty($params['uid'])){ + $select->where('uid', $params['uid']); + } + if(!empty($params['content'])){ + $select->where('content', 'like', '%' . $params['content'] . '%'); + } + $total = $select->count(); + $items = $select->order('id','desc')->page($page, $limit)->select(); + + return msg("ok", "success", ['total'=>$total, 'items'=>$items]); + } + + public function get() + { + $params = Request::param(); + + $validate = Validate::rule([ + 'id' => 'require|integer', + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + $item = Db::name('comment')->where('id', $params['id'])->findOrEmpty(); + + return msg('ok', 'success', $item); + } + + public function edit() + { + $params = Request::param(); + + $validate = Validate::rule([ + 'id' => 'require', + 'content|留言内容' => 'require', + 'enable' => 'require|integer', + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + Db::name('comment')->where('id', $params['id'])->update([ + 'content' => $params['content'], + 'reply' => $params['reply'], + 'enable' => $params['enable'], + 'update_time' => date("Y-m-d H:i:s") + ]); + + return msg(); + } + + public function enable() + { + $id = input('post.id/d'); + $enable = input('post.enable/d'); + + Db::name('comment')->where('id', $id)->update([ + 'enable' => $enable, + 'update_time' => date("Y-m-d H:i:s") + ]); + + return msg(); + } + + public function delete() + { + $params = Request::param(); + + $validate = Validate::rule([ + 'id' => 'require|integer', + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + Db::name('comment')->where('id', $params['id'])->delete(); + + return msg(); + } + + + public function uploadlog() + { + $params = Request::param(); + + $validate = Validate::rule([ + 'page' => 'integer', + 'limit' => 'integer', + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + $page = intval($params['page']); + $limit = intval($params['limit']); + + $select = Db::name('uploadlog'); + if(!empty($params['uid'])){ + $select->where('uid', $params['uid']); + } + if(!empty($params['ip'])){ + $select->where('ip', $params['ip']); + } + if(!empty($params['fileurl'])){ + $select->where('fileurl', $params['fileurl']); + } + $total = $select->count(); + $items = $select->order('id','desc')->page($page, $limit)->select(); + + return msg("ok", "success", ['total'=>$total, 'items'=>$items]); + } +} \ No newline at end of file diff --git a/app/controller/admin/Link.php b/app/controller/admin/Link.php new file mode 100644 index 0000000..b4e2e07 --- /dev/null +++ b/app/controller/admin/Link.php @@ -0,0 +1,134 @@ + 'integer', + 'limit' => 'integer', + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + $page = intval($params['page']); + $limit = intval($params['limit']); + + $select = Db::name('link'); + if(!empty($params['keyword'])){ + $select->where('name|url', 'like', '%' . $params['keyword'] . '%'); + } + $total = $select->count(); + $items = $select->order('weight','desc')->page($page, $limit)->select(); + + return msg("ok", "success", ['total'=>$total, 'items'=>$items]); + } + + public function get() + { + $params = Request::param(); + + $validate = Validate::rule([ + 'id' => 'require|integer', + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + $item = Db::name('link')->where('id', $params['id'])->findOrEmpty(); + + return msg('ok', 'success', $item); + } + + public function add() + { + $params = Request::param(); + + $validate = Validate::rule([ + 'name|名称' => 'require|chsAlphaNum|unique:link', + 'url|地址' => 'require', + 'weight|权重' => 'require|integer', + 'enable' => 'integer', + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + Db::name('link')->cache('links')->insert([ + 'name' => trim($params['name']), + 'url' => trim($params['url']), + 'weight' => $params['weight'], + 'enable' => $params['enable'], + 'create_time' => date("Y-m-d H:i:s"), + 'update_time' => date("Y-m-d H:i:s") + ]); + + return msg(); + } + + public function edit() + { + $params = Request::param(); + + $validate = Validate::rule([ + 'id' => 'require', + 'name|名称' => 'require|chsAlphaNum|unique:link', + 'url|地址' => 'require', + 'weight|权重' => 'require|integer', + 'enable' => 'integer', + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + Db::name('link')->cache('links')->where('id', $params['id'])->update([ + 'name' => trim($params['name']), + 'url' => trim($params['url']), + 'weight' => $params['weight'], + 'enable' => $params['enable'], + 'update_time' => date("Y-m-d H:i:s") + ]); + + return msg(); + } + + public function enable() + { + $id = input('post.id/d'); + $enable = input('post.enable/d'); + + Db::name('link')->cache('links')->where('id', $id)->update([ + 'enable' => $enable, + 'update_time' => date("Y-m-d H:i:s") + ]); + + return msg(); + } + + public function delete() + { + $params = Request::param(); + + $validate = Validate::rule([ + 'id' => 'require|integer', + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + Db::name('link')->cache('links')->where('id', $params['id'])->delete(); + + return msg(); + } +} \ No newline at end of file diff --git a/app/controller/admin/Menu.php b/app/controller/admin/Menu.php new file mode 100644 index 0000000..6b15ea7 --- /dev/null +++ b/app/controller/admin/Menu.php @@ -0,0 +1,120 @@ + '主页', + 'href' => 'page/dashboard.html', + ]; + $logoInfo = [ + 'title' => '工具网后台', + 'image' => 'images/logo.png', + 'href' => './', + ]; + $menuInfo = [ + [ + "title" => "常规管理", + "icon" => "fa fa-address-book", + "href" => "", + "target" => "_self", + "child" => [ + [ + "title" => "主页", + "icon" => "fa fa-home", + "target" => "_self", + "href" => "page/dashboard.html", + ], + [ + "title" => "分类管理", + "href" => "page/category.html", + "icon" => "fa fa-bookmark-o", + "target" => "_self", + ], + [ + "title" => "插件管理", + "href" => "", + "icon" => "fa fa-puzzle-piece", + "target" => "_self", + "child" => [ + [ + "title" => "插件列表", + "href" => "page/plugin.html", + "icon" => "fa fa-list", + "target" => "_self" + ], + [ + "title" => "安装新插件", + "href" => "page/plugin/install.html", + "icon" => "fa fa-cloud-upload", + "target" => "_self" + ], + ] + ], + [ + "title" => "用户管理", + "href" => "page/user.html", + "icon" => "fa fa-user", + "target" => "_self", + ], + [ + "title" => "留言管理", + "href" => "page/comment.html", + "icon" => "fa fa-comments", + "target" => "_self", + ], + [ + "title" => "上传记录", + "href" => "page/uploadlog.html", + "icon" => "fa fa-cloud-upload", + "target" => "_self", + ], + [ + "title" => "友链管理", + "href" => "page/link.html", + "icon" => "fa fa-link", + "target" => "_self", + ], + [ + "title" => "系统配置", + "href" => "", + "icon" => "fa fa-cogs", + "target" => "_self", + "child" => [ + [ + "title" => "基本信息配置", + "href" => "page/system.html", + "icon" => "fa fa-cog", + "target" => "_self" + ], + [ + "title" => "管理员配置", + "href" => "page/account.html", + "icon" => "fa fa-user", + "target" => "_self" + ], + ] + ], + /*[ + "title" => "在线升级", + "href" => "page/update.html", + "icon" => "fa fa-cloud-upload", + "target" => "_self", + ],*/ + ], + ] + ]; + $systemInit = [ + 'homeInfo' => $homeInfo, + 'logoInfo' => $logoInfo, + 'menuInfo' => $menuInfo, + ]; + return json($systemInit); + } +} diff --git a/app/controller/admin/Plugin.php b/app/controller/admin/Plugin.php new file mode 100644 index 0000000..16c8a4c --- /dev/null +++ b/app/controller/admin/Plugin.php @@ -0,0 +1,224 @@ + 'integer', + 'limit' => 'integer', + 'category_id' => 'integer', + 'class' => 'is_legal_plugin_class', + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + $page = isset($params['page']) ? intval($params['page']) : 1; + $limit = isset($params['limit']) ? intval($params['limit']) : 50; + $orderby = ['id' => 'desc']; + + $select = Db::name('plugin'); + if(!empty($params['title'])){ + $select->where('title', 'like', '%' . $params['title'] . '%'); + } + if(!empty($params['alias'])){ + $select->where('alias', $params['alias']); + } + if(!empty($params['class'])){ + $select->where('class', $params['class']); + } + if(!empty($params['enable'])){ + $select->where('enable', '1'); + } + if(!empty($params['category_id'])){ + $select->where('category_id', $params['category_id']); + $orderby = ['weight' => 'desc', 'id' => 'desc']; + } + $total = $select->count(); + $items = $select->order($orderby)->page($page, $limit)->select(); + + return msg("ok", "success", ['total'=>$total, 'items'=>$items]); + } + + public function get() + { + $params = Request::param(); + + $validate = Validate::rule([ + 'id' => 'require|integer', + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + $item = Db::name('plugin')->where('id', $params['id'])->findOrEmpty(); + + return msg('ok', 'success', $item); + } + + public function add() + { + $params = Request::param(); + + $validate = Validate::rule([ + 'title|插件标题' => 'require|unique:plugin', + 'alias|路由别名' => 'require|unique:plugin', + 'class|插件类名' => 'require|unique:plugin|is_legal_plugin_class', + 'category_id|分类' => 'require|integer', + 'level|用户等级限制' => 'integer', + 'enable' => 'integer', + 'weight|权重' => 'integer', + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + Db::name('plugin')->cache('plugins')->insert([ + 'title' => trim($params['title']), + 'alias' => trim($params['alias']), + 'class' => trim($params['class']), + 'keyword' => trim($params['keyword']), + 'weight' => $params['weight'], + 'enable' => $params['enable'], + 'category_id' => $params['category_id'], + 'level' => $params['level'], + 'login' => $params['login'], + 'desc' => $params['desc'], + 'create_time' => date("Y-m-d H:i:s"), + 'update_time' => date("Y-m-d H:i:s") + ]); + + return msg(); + } + + public function edit() + { + $params = Request::param(); + + $validate = Validate::rule([ + 'id' => 'require', + 'title|插件标题' => 'require|unique:plugin', + 'alias|路由别名' => 'unique:plugin', + 'class|插件类名' => 'unique:plugin|is_legal_plugin_class', + 'category_id|分类' => 'integer', + 'level|用户等级限制' => 'integer', + 'enable' => 'integer', + 'weight|权重' => 'integer', + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + if(isset($params['level']) && isset($params['enable'])){ + Db::name('plugin')->cache('plugins')->where('id', $params['id'])->update([ + 'title' => trim($params['title']), + 'alias' => trim($params['alias']), + 'class' => trim($params['class']), + 'keyword' => trim($params['keyword']), + 'weight' => $params['weight'], + 'enable' => $params['enable'], + 'category_id' => $params['category_id'], + 'level' => $params['level'], + 'login' => $params['login'], + 'desc' => $params['desc'], + 'update_time' => date("Y-m-d H:i:s") + ]); + }else{ + Db::name('plugin')->cache('plugins')->where('id', $params['id'])->update([ + 'title' => trim($params['title']), + 'alias' => trim($params['alias']), + 'class' => trim($params['class']), + 'category_id' => $params['category_id'], + 'desc' => $params['desc'], + 'update_time' => date("Y-m-d H:i:s") + ]); + } + + return msg(); + } + + public function enable(){ + $params = Request::param(); + + $validate = Validate::rule([ + 'id' => 'require', + 'category_id|分类' => 'integer', + 'enable' => 'integer' + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + Db::name('plugin')->cache('plugins')->where('id', $params['id'])->update($params); + return msg(); + } + + + public function delete() + { + $params = Request::param(); + + $validate = Validate::rule([ + 'id' => 'require|integer', + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + $plugin = Db::name('plugin')->where('id', $params['id'])->find(); + if(!$plugin) return msg('ok', 'success'); + + Db::startTrans(); + try { + $classPath = plugin_path_get() . '/'.$plugin['class'].'/Install.php'; + if (file_exists($classPath)) { + require $classPath; + $class = 'plugin\\'.$plugin['class'].'\\Install'; + if (class_exists($class)) { + $uninstall = new $class(); + $uninstall->UnInstall(); + } + } + Db::name('plugin')->cache('plugins')->where('id', $params['id'])->delete(); + if (!empty($plugin['class'])) { + del_tree(plugin_path_get($plugin['class'])); + } + // 提交事务 + Db::commit(); + } catch (\Exception $e) { + // 回滚事务 + Db::rollback(); + return msg('error', $e->getMessage(), $e); + } + return msg('ok', 'success'); + } + + public function upload() + { + $params = Request::file(); + + $validate = Validate::rule([ + 'file' => 'require|file', + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + $uploadedFile = Request::file('file'); + $plugin = new \app\lib\Plugin(); + $zipFilepath = $plugin->getZipFilepath(); + $uploadedFile->move(dirname($zipFilepath), basename($zipFilepath)); + return $plugin->install(); + } +} diff --git a/app/controller/admin/System.php b/app/controller/admin/System.php new file mode 100644 index 0000000..520718c --- /dev/null +++ b/app/controller/admin/System.php @@ -0,0 +1,127 @@ +count(); + $data['count2'] = Db::name('comment')->count(); + $data['count3'] = Db::name('user')->count(); + $data['count4'] = Db::name('user')->whereDay('create_time', date("Y-m-d"))->count(); + return msg('ok', 'success', $data); + } + + public function info() + { + + $tmp = 'version()'; + $mysqlVersion = Db::query("select version()")[0][$tmp]; + $data = [ + 'framework_version' => app()::VERSION, + 'php_version' => PHP_VERSION, + 'mysql_version' => $mysqlVersion, + 'software' => $_SERVER['SERVER_SOFTWARE'], + 'os' => php_uname(), + 'date' => date("Y-m-d H:i:s"), + 'checkupdate' => '//auth.cccyun.cc/app/tool.php?version='.config('app.version').'&ver='.config('app.ver') + ]; + return msg('ok', 'success', $data); + + } + + public function all() + { + $all = Db::name('config')->select(); + return msg('ok', 'success', $all); + } + + public function get() + { + $key = Request::param('key'); + $value = config_get($key); + return msg('ok', 'success', $value); + } + + public function set() + { + $params = Request::param(); + + foreach ($params as $v) { + if (empty($v['key'])) { + continue; + } + config_set($v['key'], $v['value']); + } + cache('configs', NULL); + $all = Db::name('config')->select(); + return msg('ok', 'success', $all); + } + + public function setpwd() + { + $params = Request::param(); + if(isset($params['username']))$params['username']=trim($params['username']); + if(isset($params['oldpwd']))$params['oldpwd']=trim($params['oldpwd']); + if(isset($params['newpwd']))$params['newpwd']=trim($params['newpwd']); + if(isset($params['newpwd2']))$params['newpwd2']=trim($params['newpwd2']); + + $validate = Validate::rule([ + 'username|用户名' => 'require|chsAlphaNum', + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + config_set('admin_username', $params['username']); + + if(!empty($params['oldpwd']) && !empty($params['newpwd']) && !empty($params['newpwd2'])){ + $oldpwd = config_get('admin_password'); + if($oldpwd && !password_verify($params['oldpwd'], $oldpwd)){ + return msg('error', '旧密码不正确'); + } + if($params['newpwd'] != $params['newpwd2']){ + return msg('error', '两次新密码输入不一致'); + } + config_set('admin_password', password_hash($params['newpwd'], PASSWORD_DEFAULT)); + } + cache('configs', NULL); + cookie('admin_token', null); + return msg(); + } + + public function templates() + { + $glob = glob(app()->getRootPath() . config("view.view_dir_name") . '/index/*'); + $arr = []; + foreach ($glob as $v) { + if (is_dir($v)) { + array_push($arr, basename($v)); + } + } + return msg('ok', 'success', $arr); + + } + + public function clear(){ + Cache::clear(); + reset_opcache(); + return msg(); + } + + public function iptype(){ + $result = [ + ['name'=>'0_X_FORWARDED_FOR', 'ip'=>real_ip(0), 'city'=>get_ip_city(real_ip(0))], + ['name'=>'1_X_REAL_IP', 'ip'=>real_ip(1), 'city'=>get_ip_city(real_ip(1))], + ['name'=>'2_REMOTE_ADDR', 'ip'=>real_ip(2), 'city'=>get_ip_city(real_ip(2))] + ]; + return msg('ok', 'success', $result); + } +} diff --git a/app/controller/admin/Update.php b/app/controller/admin/Update.php new file mode 100644 index 0000000..901f146 --- /dev/null +++ b/app/controller/admin/Update.php @@ -0,0 +1,134 @@ +RELEASE_API = base64_decode('aHR0cHM6Ly90b29sLWNsb3VkLmFvYW9zdGFyLmNvbS9vcGVuL3JlbGVhc2U='); + } + + private function get_last_release() + { + + $res = get_curl($this->RELEASE_API, 0, Request::domain()); + $json = json_decode($res); + + if (empty($json) || empty($json->data)) { + if (!empty($json->message)) { + throw new \Exception($json->message); + } + throw new \Exception('"连接云中心失败,请检查网络连通性是否正常"'); + } + return $json; + } + + public function check() + { + try { + $release = $this->get_last_release(); + $release->data->current_version = get_version(); + + } catch (\Exception $e) { + return msg('error', $e->getMessage()); + + } + return msg('ok', 'success', $release->data); + } + + public function update() + { + try { + $release = $this->get_last_release(); + + } catch (\Exception $e) { + return msg('error', $e->getMessage()); + + } + $get = get_curl($release->data->download_url); + if (empty($get) || str_starts_with($get, 'CURL Error:')) { + return msg('error', '下载更新包失败,请检查网络连通性是否正常'); + } + $tmpFilename = app()->getRuntimePath() . '/tmp/' . uniqid() . '.zip'; + if (!file_exists(dirname($tmpFilename))) { + mkdir(dirname($tmpFilename), 0777, true); + } + if (!file_put_contents($tmpFilename, $get)) { + return msg('error', '保存文件失败,请检查是否有写入权限'); + } + $rootPath = app()->getRootPath(); + if (!unzip($tmpFilename, $rootPath)) { + return msg('error', '解压压缩包失败'); + } + return msg('ok', '资源包解压成功', $release->data); + } + + public function updateDatabase() + { + $glob = glob(app()->getRuntimePath() . '/update/sql/*.sql'); + if (empty($glob)) { + return msg('ok', '未发现数据库更新文件'); + } + foreach ($glob as $value) { + $result[$value] = []; + $basename = basename($value); + $lines = file($value); + $execSQL = new ExecSQL(); + $lines = $execSQL->purify($lines); + $number = $execSQL->exec($lines); + $result[$value] = array_merge($result[$value], $execSQL->getErrors()); + + if ($number > 0) { + $result[$value][] = "影响的记录数 $number"; + } + $result[$value][] = '创建数据库升级记录成功'; + end: + unlink($value); + $result[$value] = "[$basename]:" . implode("\n", $result[$value]); + } + return msg('ok', "数据库执行结果:\n" . implode("\n", $result)); + } + + public function updateScript() + { + $glob = glob(app()->getRuntimePath() . '/update/script/*.php'); + if (empty($glob)) { + return msg('ok', '未发现更新脚本'); + } + foreach ($glob as $value) { + $result[$value] = []; + $basename = basename($value); + try { + require $value; + $class = 'UpdateScript'; + if (!class_exists($class)) { + throw new \Exception("更新脚本不存在[$class]类"); + } + $instance = new $class(); + $boot = 'main'; + if (!method_exists($instance, $boot)) { + throw new \Exception("更新脚本不存在[$boot]方法"); + } + $instance->main(); + $result[$value] = array_merge($result[$value], $instance->getResult()); + } catch (\Exception $e) { + $result[$value][] = $e->getMessage(); + } + $result[$value][] = '创建更新脚本升级记录成功'; + end: + unlink($value); + $result[$value] = "[$basename]:" . implode("\n", $result[$value]); + } + return msg('ok', "更新脚本执行结果:\n" . implode("\n", $result)); + } +} \ No newline at end of file diff --git a/app/controller/admin/User.php b/app/controller/admin/User.php new file mode 100644 index 0000000..f741bc0 --- /dev/null +++ b/app/controller/admin/User.php @@ -0,0 +1,122 @@ + 'integer', + 'limit' => 'integer', + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + $page = intval($params['page']); + $limit = intval($params['limit']); + + $select = Db::name('user'); + if(!empty($params['id'])){ + $select->where('id|openid', $params['id']); + } + if(!empty($params['username'])){ + $select->where('username', 'like', '%' . $params['username'] . '%'); + } + $total = $select->count(); + $items = $select->order('id','desc')->page($page, $limit)->select(); + + return msg("ok", "success", ['total'=>$total, 'items'=>$items]); + } + + public function get() + { + $params = Request::param(); + + $validate = Validate::rule([ + 'id' => 'require|integer', + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + $item = Db::name('user')->where('id', $params['id'])->findOrEmpty(); + + return msg('ok', 'success', $item); + } + + public function enable(){ + $params = Request::param(); + + $validate = Validate::rule([ + 'id' => 'require', + 'enable' => 'integer' + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + Db::name('user')->where('id', $params['id'])->update($params); + return msg(); + } + + public function edit() + { + $params = Request::param(); + + $validate = Validate::rule([ + 'id' => 'require', + 'level' => 'integer', + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + Db::name('user')->where('id', $params['id'])->update([ + 'level' => $params['level'] + ]); + + return msg(); + } + + public function delete() + { + $params = Request::param(); + + $validate = Validate::rule([ + 'id' => 'require|integer', + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + Db::name('user')->where('id', $params['id'])->delete(); + + return msg('ok', 'success'); + } + + public function slogin(){ + $id = input('get.id/d'); + $item = Db::name('user')->where('id', $id)->find(); + if(!$item){ + return $this->alert('error', '用户不存在'); + } + + $session = md5($id.$item['password']); + $expiretime = time()+30744000; + $token = authcode("{$id}\t{$session}\t{$expiretime}", 'ENCODE', config_get('syskey')); + cookie('user_token', $token, ['expire' => $expiretime, 'httponly' => true]); + + return redirect("/"); + } + +} \ No newline at end of file diff --git a/app/event.php b/app/event.php new file mode 100644 index 0000000..00ab4bd --- /dev/null +++ b/app/event.php @@ -0,0 +1,17 @@ + [ + ], + + 'listen' => [ + 'AppInit' => [], + 'HttpRun' => [], + 'HttpEnd' => [], + 'LogLevel' => [], + 'LogWrite' => [], + ], + + 'subscribe' => [ + ], +]; diff --git a/app/lib/BilibiliHelper.php b/app/lib/BilibiliHelper.php new file mode 100644 index 0000000..05e17d7 --- /dev/null +++ b/app/lib/BilibiliHelper.php @@ -0,0 +1,477 @@ +'8K 超高清', '126'=>'杜比视界', '125'=>'HDR 真彩', '120'=>'4K 超清', '116'=>'1080P 高帧率', '112'=>'1080P 高码率', '80'=>'1080P 高清', '74'=>'720P 高帧率', '64'=>'720P 高清', '48'=>'720P 高清', '32'=>'480P 清晰', '16'=>'360P 流畅', '6'=>'240P 极速']; + public static $qualitys_audio = ['30216'=>'64K', '30232'=>'132K', '30280'=>'192K']; + + + public function __construct($cookie = null, $token = null) + { + $this->cookie = $cookie; //For WEB + $this->token = $token; //For APP/TV + } + + //获取登录信息 + public function login_info() + { + $url = 'https://api.bilibili.com/x/web-interface/nav'; + $ret = $this->curl($url, null, $this->cookie); + $arr = json_decode($ret, true); + if(!$arr){ + throw new Exception('获取登录状态失败'); + }elseif(isset($arr['code']) && $arr['code'] == 0){ + return true; + }elseif($arr['code'] == -101){ + throw new Exception('COOKIE已失效'); + }else{ + throw new Exception('获取登录状态失败 '.$arr['message']); + } + } + + //获取用户上传视频信息 + public function ugc_video_info($querystring){ + $url = 'https://api.bilibili.com/x/web-interface/view?'.$querystring; + $ret = $this->curl($url, null, $this->cookie); + $arr = json_decode($ret, true); + if(!$arr){ + throw new Exception('获取视频信息失败'); + }elseif(isset($arr['code']) && $arr['code'] == 0){ + return $arr['data']; + }else{ + throw new Exception('获取视频信息失败:'.$arr['message']); + } + } + + //获取正版视频信息 + public function pgc_video_info($ep_id){ + $url = 'https://api.bilibili.com/pgc/view/web/season?ep_id='.$ep_id; + $ret = $this->curl($url, null, $this->cookie); + $arr = json_decode($ret, true); + if(!$arr){ + throw new Exception('获取视频信息失败'); + }elseif(isset($arr['code']) && $arr['code'] == 0){ + if(!isset($arr['result']['episodes'])) throw new Exception('获取视频信息失败,返回内容错误'); + $data = null; + foreach($arr['result']['episodes'] as $row){ + if($ep_id == $row['id']){ + $data = $row; + } + } + if(empty($data))throw new Exception('获取视频信息失败,未找到对应视频信息'); + return $data; + }else{ + throw new Exception('获取视频信息失败:'.$arr['message']); + } + } + + //获取正版视频信息 + public function pgc_video_info_by_ssid($season_id){ + $url = 'https://api.bilibili.com/pgc/view/web/season?season_id='.$season_id; + $ret = $this->curl($url, null, $this->cookie); + $arr = json_decode($ret, true); + if(!$arr){ + throw new Exception('获取视频信息失败'); + }elseif(isset($arr['code']) && $arr['code'] == 0){ + if(!isset($arr['result']['episodes'])) throw new Exception('获取视频信息失败,返回内容错误'); + $data = $arr['result']['episodes'][0]; + if(empty($data))throw new Exception('获取视频信息失败,未找到对应视频信息'); + return $data; + }else{ + throw new Exception('获取视频信息失败:'.$arr['message']); + } + } + + //获取课堂视频信息 + public function pugv_video_info($ep_id){ + $url = 'https://api.bilibili.com/pugv/view/web/season?ep_id='.$ep_id; + $ret = $this->curl($url, null, $this->cookie); + $arr = json_decode($ret, true); + if(!$arr){ + throw new Exception('获取视频信息失败'); + }elseif(isset($arr['code']) && $arr['code'] == 0){ + if(!isset($arr['data']['episodes'])) throw new Exception('获取视频信息失败,返回内容错误'); + $data = null; + foreach($arr['data']['episodes'] as $row){ + if($ep_id == $row['id']){ + $data = $row; + } + } + if(empty($data))throw new Exception('获取视频信息失败,未找到对应视频信息'); + return $data; + }else{ + throw new Exception('获取视频信息失败:'.$arr['message']); + } + } + + //获取视频弹幕 + public function get_video_comment($cid){ + $danmu_xml = $this->curl('https://comment.bilibili.com/'.$cid.'.xml'); + if(!$danmu_xml){ + return msg('error','获取弹幕内容失败'); + } + $dom = new \DOMDocument(); + $dom->loadXML($danmu_xml); + $result = $this->getArray($dom->documentElement); + return isset($result['d']) ? $result['d'] : []; + } + + //用户上传视频解析(支持外链) + public function get_video_url($aid, $cid){ + $param = [ + 'avid' => $aid, + 'cid' => $cid, + 'qn' => '120', + 'otype' => 'json', + 'fourk' => '1', + 'fnver' => '0', + 'fnval' => '128', + 'player' => '3', + 'platform' => 'html5', + 'high_quality' => '1', + ]; + $url = 'https://api.bilibili.com/x/player/playurl?'.http_build_query($param); + $ret = $this->curl($url, null, $this->cookie); + $arr = json_decode($ret, true); + if(!$arr){ + throw new Exception('获取视频下载链接失败'); + }elseif(isset($arr['code']) && $arr['code'] == 0){ + if(!isset($arr['data']['durl'])) throw new Exception('获取视频下载链接失败,返回内容错误'); + $url = $arr['data']['durl'][0]['url']; + $size = $arr['data']['durl'][0]['size']; + $quality = $arr['data']['support_formats'][0]['new_description']; + return ['url'=>$url, 'size'=>$size, 'quality'=>$quality, 'format'=>$arr['data']['format'], 'codec'=>$this->get_codec($arr['data']['video_codecid'])]; + }else{ + throw new Exception('获取视频下载链接失败 '.$arr['message']); + } + } + + //用户上传视频解析 + public function ugc_video_parse($aid, $cid){ + $param = [ + 'avid' => $aid, + 'cid' => $cid, + 'qn' => '0', + 'type' => '', + 'otype' => 'json', + 'fourk' => '1', + 'fnver' => '0', + 'fnval' => '4048', + ]; + $url = 'https://api.bilibili.com/x/player/playurl?'.http_build_query($param); + $ret = $this->curl($url, null, $this->cookie); + $arr = json_decode($ret, true); + if(!$arr){ + throw new Exception('获取视频下载链接失败'); + }elseif(isset($arr['code']) && $arr['code'] == 0){ + if(!isset($arr['data']['dash'])) throw new Exception('获取视频下载链接失败,返回内容错误'); + return $this->video_data_handle($arr['data']); + }else{ + throw new Exception('获取视频下载链接失败 '.$arr['message']); + } + } + + //用户上传视频解析(TV接口) + public function ugc_video_parse_tv($aid, $cid){ + $param = [ + 'avid' => $aid, + 'cid' => $cid, + 'qn' => '0', + 'type' => '', + 'otype' => 'json', + 'fnver' => '0', + 'fnval' => '4048', + 'device' => 'android', + 'platform' => 'android', + 'mobi_app' => 'android_tv_yst', + 'npcybs' => '0', + 'force_host' => '2', + 'build' => '102801', + ]; + if($this->token){ + $param['access_key'] = $this->token; + } + $url = 'https://api.snm0516.aisee.tv/x/tv/ugc/playurl?'.http_build_query($param); + $ret = $this->curl($url); + $arr = json_decode($ret, true); + if(!$arr){ + throw new Exception('获取视频下载链接失败'); + }elseif(isset($arr['code']) && $arr['code'] == 0){ + if(!isset($arr['dash'])) throw new Exception('获取视频下载链接失败,返回内容错误'); + return $this->video_data_handle($arr); + }else{ + throw new Exception('获取视频下载链接失败 '.$arr['message']); + } + } + + //正版视频解析 + public function pgc_video_parse($aid, $cid, $epid, $is_cheese=false){ + $param = [ + 'avid' => $aid, + 'cid' => $cid, + 'qn' => '0', + 'type' => '', + 'otype' => 'json', + 'fourk' => '1', + 'fnver' => '0', + 'fnval' => '4048', + 'module' => 'bangumi', + 'ep_id' => $epid, + 'session' => '' + ]; + $url = 'https://api.bilibili.com/pgc/player/web/playurl?'.http_build_query($param); + if($is_cheese){ + $url = str_replace('/pgc/','/pugv/',$url); + } + $ret = $this->curl($url, null, $this->cookie); + $arr = json_decode($ret, true); + if(!$arr){ + throw new Exception('获取视频下载链接失败'); + }elseif(isset($arr['code']) && $arr['code'] == 0){ + if(!isset($arr['result']['dash'])) throw new Exception('获取视频下载链接失败,返回内容错误'); + return $this->video_data_handle($arr['result']); + }elseif($arr['code'] == -10403 && !$is_cheese){ + $url = 'https://www.bilibili.com/bangumi/play/ep'.$epid; + $ret = $this->curl($url, null, $this->cookie.';CURRENT_FNVAL=4048;'); + preg_match('!window\.__playinfo__=([\s\S]*?)<\/script>!',$ret,$match); + if(isset($match[1])){ + $arr = json_decode($match[1], true); + }else{ + throw new Exception('获取视频下载链接失败 '.$arr['message']); + } + }else{ + throw new Exception('获取视频下载链接失败 '.$arr['message']); + } + } + + //正版视频解析(TV接口) + public function pgc_video_parse_tv($aid, $cid, $epid, $is_cheese=false){ + $param = [ + 'appkey' => '4409e2ce8ffd12b8', + 'aid' => $aid, + 'cid' => $cid, + 'qn' => '0', + 'module' => 'bangumi', + 'ep_id' => $epid, + 'expire' => '0', + 'fnval' => '80', + 'fnver' => '0', + 'fourk' => '1', + 'mid' => '0', + 'otype' => 'json', + 'device' => 'android', + 'platform' => 'android', + 'mobi_app' => 'android_tv_yst', + 'npcybs' => '0', + 'build' => '102801', + 'ts' => time() + ]; + if($this->token){ + $param['access_key'] = $this->token; + } + $param['sign'] = $this->tv_get_sign($param); + $url = 'https://api.snm0516.aisee.tv/pgc/player/api/playurltv?'.http_build_query($param); + if($is_cheese){ + $url = str_replace('/pgc/','/pugv/',$url); + } + $ret = $this->curl($url); + $arr = json_decode($ret, true); + if(!$arr){ + throw new Exception('获取视频下载链接失败'); + }elseif(isset($arr['code']) && $arr['code'] == 0){ + if(!isset($arr['dash'])) throw new Exception('获取视频下载链接失败,返回内容错误'); + return $this->video_data_handle($arr); + }else{ + throw new Exception('获取视频下载链接失败 '.$arr['message']); + } + } + + private function video_data_handle($data){ + $video = []; + $audio = []; + $timelength = round($data['timelength']/1000); + if($data['dash']['video']){ + foreach($data['dash']['video'] as $row){ + if(preg_match('!://(.*:\\d+)/!',$row['base_url'],$match)){ //替换PCDN + $row['base_url'] = str_replace($match[1], 'upos-sz-mirrorcoso1.bilivideo.com', $row['base_url']); + } + $size = round($timelength * $row['bandwidth'] / 8); + $video[] = ['url'=>$row['base_url'], 'quality'=>self::$qualitys[$row['id']], 'bandwidth'=>round($row['bandwidth']/1000), 'size' => $size, 'codec'=>$this->get_codec($row['codecid']), 'ratio'=>$row['width'].'×'.$row['height'], 'fps'=>$row['frame_rate']]; + } + } + if($data['dash']['audio']){ + foreach($data['dash']['audio'] as $row){ + $size = round($timelength * $row['bandwidth'] / 8); + $audio[] = ['url'=>$row['base_url'], 'quality'=>self::$qualitys_audio[$row['id']], 'bandwidth'=>round($row['bandwidth']/1000), 'size' => $size, 'codec'=>str_replace(['mp4a.40.2','ec-3'], ['M4A', 'AC3'], $row['codecs'])]; + } + } + return ['video'=>$video, 'audio'=>$audio]; + } + + //获取音乐信息 + public function get_audio_info($sid){ + $url = 'https://www.bilibili.com/audio/music-service-c/web/song/info?sid='.$sid; + $ret = $this->curl($url, null, $this->cookie); + $arr = json_decode($ret, true); + if(!$arr){ + throw new Exception('获取音乐信息失败'); + }elseif(isset($arr['code']) && $arr['code'] == 0){ + return $arr['data']; + }else{ + throw new Exception('获取音乐信息失败:'.$arr['message']); + } + } + + //音乐解析 + public function get_audio_url($sid){ + $url = 'https://www.bilibili.com/audio/music-service-c/web/url?sid='.$sid.'&privilege=2&quality=2'; + $ret = $this->curl($url, null, $this->cookie); + $arr = json_decode($ret, true); + if(!$arr){ + throw new Exception('获取音乐下载链接失败'); + }elseif(isset($arr['code']) && $arr['code'] == 0){ + if(!isset($arr['data']['cdns'])) throw new Exception('获取音乐下载链接失败,返回内容错误'); + $url = $arr['data']['cdns'][0]; + $size = $arr['data']['size']; + return ['url'=>$url, 'size'=>$size, 'quality'=>'MP3(192K)']; + }else{ + throw new Exception('获取音乐下载链接失败:'.$arr['message']); + } + } + + private function curl($url,$data=null,$cookie=null,$referer=null){ + $ch=curl_init(); + curl_setopt($ch, CURLOPT_URL,$url); + $httpheader[] = "Accept: application/json"; + $httpheader[] = "Accept-Language: zh-CN,zh;q=0.8"; + $httpheader[] = "Accept-Encoding: gzip,deflate,sdch"; + $httpheader[] = "Connection: keep-alive"; + curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader); + if($data){ + if(is_array($data)) $data=http_build_query($data); + curl_setopt($ch, CURLOPT_POSTFIELDS,$data); + curl_setopt($ch, CURLOPT_POST,1); + } + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); + curl_setopt($ch, CURLOPT_REFERER, $referer?$referer:'https://www.bilibili.com/'); + if($cookie){ + curl_setopt($ch,CURLOPT_COOKIE, $cookie); + } + curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.44'); + curl_setopt($ch, CURLOPT_ENCODING, "gzip"); + $ret=curl_exec($ch); + curl_close($ch); + return $ret; + } + + private function get_codec($codecid){ + switch($codecid){ + case 13: + return 'AV1';break; + case 12: + return 'HEVC';break; + case 7: + return 'AVC';break; + default: + return 'UNKNOWN';break; + } + } + + private function tv_get_sign($param){ + $key = '59b43e04ad6965f34319062b478f83dd'; + ksort($param); + $signstr = http_build_query($param); + return md5($signstr.$key); + } + + private function getArray($node) { + $array = false; + + if ($node->hasAttributes()) { + foreach ($node->attributes as $attr) { + $array[$attr->nodeName] = $attr->nodeValue; + } + } + + if ($node->hasChildNodes()) { + if ($node->childNodes->length == 1) { + $array[$node->firstChild->nodeName] = $this->getArray($node->firstChild); + } else { + foreach ($node->childNodes as $childNode) { + if ($childNode->nodeType != XML_TEXT_NODE) { + $array[$childNode->nodeName][] = $this->getArray($childNode); + } + } + } + } else { + return $node->nodeValue; + } + return $array; + } + + + private function encWbi($params){ + $mixin_key = $this->getMixinKey(); + $curr_time = time(); + $chr_filter = "/[!'()*]/"; + + $query = []; + $params['wts'] = $curr_time; + + ksort($params); + + foreach ($params as $key => $value) { + $value = preg_replace($chr_filter, '', $value); + $query[] = urlencode($key) . '=' . urlencode($value); + } + + $query = implode('&', $query); + $wbi_sign = md5($query . $mixin_key); + + return $query . '&w_rid=' . $wbi_sign; + } + + private function getMixinKey(){ + if(!empty($this->mixinKey)) return $this->mixinKey; + + $url = 'https://api.bilibili.com/x/web-interface/nav'; + $ret = $this->curl($url, null, $this->cookie); + $arr = json_decode($ret, true); + if(!$arr){ + throw new Exception('请求失败'); + } + if(!isset($arr['data']['wbi_img'])){ + throw new Exception('获取WbiKeys失败'); + } + + $img_url = $arr['data']['wbi_img']['img_url']; + $sub_url = $arr['data']['wbi_img']['sub_url']; + $img_key = substr(basename($img_url), 0, strpos(basename($img_url), '.')); + $sub_key = substr(basename($sub_url), 0, strpos(basename($sub_url), '.')); + $key = $img_key . $sub_key; + + $mixinKeyEncTab = [ + 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, + 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, + 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, + 36, 20, 34, 44, 52 + ]; + + $t = ''; + foreach ($mixinKeyEncTab as $n) $t .= $key[$n]; + $this->mixinKey = substr($t, 0, 32); + return $this->mixinKey; + } + +} \ No newline at end of file diff --git a/app/lib/EnvOperation.php b/app/lib/EnvOperation.php new file mode 100644 index 0000000..ab8500b --- /dev/null +++ b/app/lib/EnvOperation.php @@ -0,0 +1,63 @@ +exampleEnv = $exampleEnv; + } + + /** + * @return mixed + */ + public function getEnv() + { + return $this->env; + } + + /** + * @param mixed $env + */ + public function setEnv($env): void + { + $this->env = $env; + } + + public function purify($env = []) + { + preg_match_all('#{{(.+?)}}#', $this->env, $matches, PREG_SET_ORDER); + foreach ($matches as $v) { + $list = explode(':', $v[1]); + $value = isset($env[$list[0]]) ? $env[$list[0]] : ''; + $defaultValue = isset($list[1]) ? $list[1] : ''; + $type = isset($list[2]) ? $list[2] : ''; + if ($type === 'bool') { + $value = var_export(boolval($value), 1); + } + if (empty($value)) { + $value = $defaultValue; + } + $this->env = preg_replace('#' . $v[0] . '#', $value, $this->env); + } + } + + public function set($key, $newValue) + { + if (is_null($this->env)) { + $this->env = preg_replace('#{{' . $key . '}}#', $newValue, $this->exampleEnv); + } else { + $this->env = preg_replace('#{{' . $key . '}}#', $newValue, $this->env); + } + } + + public function save() + { + return file_put_contents(app()->getRootPath() . '.env', $this->env); + } + +} \ No newline at end of file diff --git a/app/lib/ExecSQL.php b/app/lib/ExecSQL.php new file mode 100644 index 0000000..69dad18 --- /dev/null +++ b/app/lib/ExecSQL.php @@ -0,0 +1,64 @@ +errors; + } + + /** + * @param $sql array|string SQL语句 传入字符串类型需以\n分割 + * @return int 返回影响行数 + */ + public function exec($sql) + { + $sql = $this->purify($sql); + $number = 0; + foreach ($sql as $key => $line) { + try { + $number += Db::execute($line); + } catch (\Exception $e) { + $this->errors[] = '第' . $key . '行:' . iconv('utf-8','utf-8//IGNORE',$e->getMessage()); + } + } + return $number; + } + + public function purify($sql) + { + $tmp = ''; + $purify = []; + if (!is_array($sql)) { + $sql = explode("\n", $sql); + } + foreach ($sql as $key => &$line) { + + $line = trim($line); + if (substr($line, 0, 2) == '--' || $line == '' || substr($line, 0, 2) == '/*') { + unset($sql[$key]); + continue; + } + $tmp .= $line; + if (substr($line, -1, 1) == ';') { + unset($sql[$key]); + $purify[] = $tmp; + $tmp = ''; + } + unset($sql[$key]); + } + return $purify; + } + +} \ No newline at end of file diff --git a/app/lib/GeetestLib.php b/app/lib/GeetestLib.php new file mode 100644 index 0000000..94e3170 --- /dev/null +++ b/app/lib/GeetestLib.php @@ -0,0 +1,146 @@ +geetest_id = $geetest_id; + $this->geetest_key = $geetest_key; + } + + //验证初始化 + public function pre_process($params) { + if(!empty($this->geetest_id) && !empty($this->geetest_key)){ + return $this->pre_process_api($params); + }else{ + return $this->pre_process_demo($params); + } + } + + private function pre_process_api($params) { + $public_params = [ + 'digestmod' => 'md5', + 'gt' => $this->geetest_id, + 'sdk' => self::SDK_VERSION, + 'json_format' => self::JSON_FORMAT + ]; + $params = array_merge($params, $public_params); + $url = 'http://api.geetest.com/register.php?' . http_build_query($params); + $res = get_curl($url); + $arr = json_decode($res, true); + if($arr && isset($arr['challenge'])){ + return $this->success_process($arr['challenge']); + }else{ + return $this->failback_process(); + } + } + + private function success_process($challenge) { + $challenge = md5($challenge . $this->geetest_key); + $result = array( + 'success' => 1, + 'gt' => $this->geetest_id, + 'challenge' => $challenge, + 'new_captcha'=>true + ); + return $result; + } + + private function failback_process() { + $challenge = md5(uniqid(mt_rand(), true) . microtime()); + $result = array( + 'success' => 0, + 'gt' => $this->geetest_id, + 'challenge' => $challenge, + 'new_captcha'=>true + ); + return $result; + } + + private function pre_process_demo($params) { + $url = 'https://www.geetest.com/demo/gt/register-fullpage?t=' . time() . "123"; + $referer = 'https://www.geetest.com/demo/slide-popup.html'; + $data = get_curl($url, 0, $referer); + $arr = json_decode($data, true); + if($arr && isset($arr['challenge'])){ + return $arr; + }else{ + return $this->failback_process(); + } + } + + //正常流程下(即验证初始化成功),二次验证 + public function success_validate($challenge, $validate, $seccode, $params) { + if(!empty($this->geetest_id) && !empty($this->geetest_key)){ + return $this->success_validate_api($challenge, $validate, $seccode, $params); + }else{ + return $this->success_validate_demo($challenge, $validate, $seccode); + } + } + + private function success_validate_api($challenge, $validate, $seccode, $params) { + if (!$this->check_validate($challenge, $validate)) { + return false; + } + $public_params = [ + 'seccode' => $seccode, + 'challenge' => $challenge, + 'captchaid' => $this->geetest_id, + 'sdk' => self::SDK_VERSION, + 'json_format' => self::JSON_FORMAT + ]; + $params = array_merge($params, $public_params); + $url = 'http://api.geetest.com/validate.php'; + $res = get_curl($url, http_build_query($params)); + $arr = json_decode($res, true); + if($arr && isset($arr['seccode'])){ + if($arr['seccode'] == md5($seccode)){ + return true; + } + } + return false; + } + + private function check_validate($challenge, $validate) { + if (strlen($validate) != 32) { + return false; + } + if (md5($this->geetest_key . 'geetest' . $challenge) != $validate) { + return false; + } + return true; + } + + private function success_validate_demo($challenge, $validate, $seccode) { + $params = [ + 'geetest_challenge' => $challenge, + 'geetest_validate' => $validate, + 'geetest_seccode' => $seccode + ]; + $url = 'https://www.geetest.com/demo/gt/validate-fullpage'; + $referer = 'https://www.geetest.com/demo/slide-popup.html'; + $data = get_curl($url, http_build_query($params), $referer); + $arr = json_decode($data, true); + if($arr && $arr['status'] == 'success'){ + return true; + } + return false; + } + + //异常流程下(即验证初始化失败,宕机模式),二次验证 + public function fail_validate($challenge, $validate, $seccode) { + if(md5($challenge) == $validate){ + return true; + }else{ + return false; + } + } +} \ No newline at end of file diff --git a/app/lib/Ip2Region.php b/app/lib/Ip2Region.php new file mode 100644 index 0000000..f5567c7 --- /dev/null +++ b/app/lib/Ip2Region.php @@ -0,0 +1,47 @@ + + * @datetime 2022/07/18 + */ +class Ip2Region +{ + /** + * 查询实例对象 + * @var XdbSearcher + */ + private $searcher; + + /** + * 初始化构造方法 + * @throws Exception + */ + public function __construct() + { + $this->searcher = XdbSearcher::newWithFileOnly(dirname(__FILE__) . '/ip2region.xdb'); + } + + /** + * 兼容原 memorySearch 查询 + * @param string $ip + * @return string + * @throws Exception + */ + public function search($ip) + { + return $this->searcher->search($ip); + } + + /** + * destruct method + * resource destroy + */ + public function __destruct() + { + $this->searcher->close(); + unset($this->searcher); + } +} \ No newline at end of file diff --git a/app/lib/IpLocation.php b/app/lib/IpLocation.php new file mode 100644 index 0000000..aca475e --- /dev/null +++ b/app/lib/IpLocation.php @@ -0,0 +1,239 @@ + + */ +class IpLocation { + /** + * QQWry.Dat文件指针 + * + * @var resource + */ + private $fp; + + /** + * 第一条IP记录的偏移地址 + * + * @var int + */ + private $firstip; + + /** + * 最后一条IP记录的偏移地址 + * + * @var int + */ + private $lastip; + + /** + * IP记录的总条数(不包含版本信息记录) + * + * @var int + */ + private $totalip; + + /** + * 构造函数,打开 QQWry.Dat 文件并初始化类中的信息 + * + * @param string $filename + * @return IpLocation + */ + public function __construct() { + $this->fp = 0; + $filename = dirname(__FILE__)."/QQWry.dat"; + if (($this->fp = fopen($filename, 'rb')) !== false) { + $this->firstip = $this->getlong(); + $this->lastip = $this->getlong(); + $this->totalip = ($this->lastip - $this->firstip) / 7; + } + } + + /** + * 返回读取的长整型数 + * + * @access private + * @return int + */ + private function getlong() { + //将读取的little-endian编码的4个字节转化为长整型数 + $result = unpack('Vlong', fread($this->fp, 4)); + return $result['long']; + } + + /** + * 返回读取的3个字节的长整型数 + * + * @access private + * @return int + */ + private function getlong3() { + //将读取的little-endian编码的3个字节转化为长整型数 + $result = unpack('Vlong', fread($this->fp, 3).chr(0)); + return $result['long']; + } + + /** + * 返回压缩后可进行比较的IP地址 + * + * @access private + * @param string $ip + * @return string + */ + private function packip($ip) { + // 将IP地址转化为长整型数,如果在PHP5中,IP地址错误,则返回False, + // 这时intval将Flase转化为整数-1,之后压缩成big-endian编码的字符串 + return pack('N', intval(ip2long($ip))); + } + + /** + * 返回读取的字符串 + * + * @access private + * @param string $data + * @return string + */ + private function getstring($data = "") { + $char = fread($this->fp, 1); + while (ord($char) > 0) { // 字符串按照C格式保存,以\0结束 + $data .= $char; // 将读取的字符连接到给定字符串之后 + $char = fread($this->fp, 1); + } + return $data; + } + + /** + * 返回地区信息 + * + * @access private + * @return string + */ + private function getarea() { + $byte = fread($this->fp, 1); // 标志字节 + switch (ord($byte)) { + case 0: // 没有区域信息 + $area = ""; + break; + case 1: + case 2: // 标志字节为1或2,表示区域信息被重定向 + fseek($this->fp, $this->getlong3()); + $area = $this->getstring(); + break; + default: // 否则,表示区域信息没有被重定向 + $area = $this->getstring($byte); + break; + } + return $area; + } + private $provinces = array("黑龙江省","辽宁省","吉林省","河北省","河南省","湖北省","湖南省","山东省","山西省","陕西省", + "安徽省","浙江省","江苏省","福建省","广东省","海南省","四川省","云南省","贵州省","青海省","甘肃省", + "江西省","台湾省","内蒙古","宁夏","新疆","西藏","广西","北京市","上海市","天津市","重庆市","香港","澳门"); + /** + * 根据所给 IP 地址或域名返回所在地区信息 + * + * @access public + * @param string $ip + * @return array + */ + public function getlocation($ip='') { + if (!$this->fp) return null; // 如果数据文件没有被正确打开,则直接返回空 + if(empty($ip)) return null; + $location['ip'] = gethostbyname($ip); // 将输入的域名转化为IP地址 + $ip = $this->packip($location['ip']); // 将输入的IP地址转化为可比较的IP地址 + // 不合法的IP地址会被转化为255.255.255.255 + // 对分搜索 + $l = 0; // 搜索的下边界 + $u = $this->totalip; // 搜索的上边界 + $findip = $this->lastip; // 如果没有找到就返回最后一条IP记录(QQWry.Dat的版本信息) + while ($l <= $u) { // 当上边界小于下边界时,查找失败 + $i = floor(($l + $u) / 2); // 计算近似中间记录 + fseek($this->fp, $this->firstip + $i * 7); + $beginip = strrev(fread($this->fp, 4)); // 获取中间记录的开始IP地址 + // strrev函数在这里的作用是将little-endian的压缩IP地址转化为big-endian的格式 + // 以便用于比较,后面相同。 + if ($ip < $beginip) { // 用户的IP小于中间记录的开始IP地址时 + $u = $i - 1; // 将搜索的上边界修改为中间记录减一 + } + else { + fseek($this->fp, $this->getlong3()); + $endip = strrev(fread($this->fp, 4)); // 获取中间记录的结束IP地址 + if ($ip > $endip) { // 用户的IP大于中间记录的结束IP地址时 + $l = $i + 1; // 将搜索的下边界修改为中间记录加一 + } + else { // 用户的IP在中间记录的IP范围内时 + $findip = $this->firstip + $i * 7; + break; // 则表示找到结果,退出循环 + } + } + } + + //获取查找到的IP地理位置信息 + fseek($this->fp, $findip); + $location['beginip'] = long2ip($this->getlong()); // 用户IP所在范围的开始地址 + $offset = $this->getlong3(); + fseek($this->fp, $offset); + $location['endip'] = long2ip($this->getlong()); // 用户IP所在范围的结束地址 + $byte = fread($this->fp, 1); // 标志字节 + switch (ord($byte)) { + case 1: // 标志字节为1,表示国家和区域信息都被同时重定向 + $countryOffset = $this->getlong3(); // 重定向地址 + fseek($this->fp, $countryOffset); + $byte = fread($this->fp, 1); // 标志字节 + switch (ord($byte)) { + case 2: // 标志字节为2,表示国家信息又被重定向 + fseek($this->fp, $this->getlong3()); + $location['country'] = $this->getstring(); + fseek($this->fp, $countryOffset + 4); + $location['area'] = $this->getarea(); + break; + default: // 否则,表示国家信息没有被重定向 + $location['country'] = $this->getstring($byte); + $location['area'] = $this->getarea(); + break; + } + break; + case 2: // 标志字节为2,表示国家信息被重定向 + fseek($this->fp, $this->getlong3()); + $location['country'] = $this->getstring(); + fseek($this->fp, $offset + 8); + $location['area'] = $this->getarea(); + break; + default: // 否则,表示国家信息没有被重定向 + $location['country'] = $this->getstring($byte); + $location['area'] = $this->getarea(); + break; + } + if (trim($location['country']) == 'CZ88.NET') { // CZ88.NET表示没有有效信息 + $location['country'] = '未知'; + } + if (trim($location['area']) == 'CZ88.NET') { + $location['area'] = ''; + } + $location['country'] = @iconv('gbk','utf-8',$location['country']); //转换格式,防止乱码 + $location['area'] = @iconv('gbk','utf-8',$location['area']); //转换格式,防止乱码 + foreach($this->provinces as $v) { + if(strpos($location['country'],$v) === 0) { + $location['province'] = $v; + $location['city'] = str_replace($v,'',$location['country']); + break; + } + } + if(empty($location['province'])) $location['province'] = $location['country']; + if(empty($location['city'])) $location['city'] = $location['country']; + return $location; + } + + /** + * 析构函数,用于在页面执行结束后自动关闭打开的文件。 + * + */ + public function __destruct() { + if ($this->fp) { + fclose($this->fp); + } + $this->fp = 0; + } + +} \ No newline at end of file diff --git a/app/lib/Oauth.php b/app/lib/Oauth.php new file mode 100644 index 0000000..203a3d7 --- /dev/null +++ b/app/lib/Oauth.php @@ -0,0 +1,74 @@ +apiurl = $config['apiurl'].'connect.php'; + $this->appid = $config['appid']; + $this->appkey = $config['appkey']; + $this->callback = $config['callback']; + } + + //获取登录跳转url + public function login($type, $state){ + + //-------构造请求参数列表 + $keysArr = array( + "act" => "login", + "appid" => $this->appid, + "appkey" => $this->appkey, + "type" => $type, + "redirect_uri" => $this->callback, + "state" => $state + ); + $login_url = $this->apiurl.'?'.http_build_query($keysArr); + $response = get_curl($login_url); + $arr = json_decode($response,true); + return $arr; + } + + //登录成功返回网站 + public function callback($code){ + //-------请求参数列表 + $keysArr = array( + "act" => "callback", + "appid" => $this->appid, + "appkey" => $this->appkey, + "code" => $code + ); + + //------构造请求access_token的url + $token_url = $this->apiurl.'?'.http_build_query($keysArr); + $response = get_curl($token_url); + + $arr = json_decode($response,true); + return $arr; + } + + //查询用户信息 + public function query($type, $social_uid){ + //-------请求参数列表 + $keysArr = array( + "act" => "query", + "appid" => $this->appid, + "appkey" => $this->appkey, + "type" => $type, + "social_uid" => $social_uid + ); + + //------构造请求access_token的url + $token_url = $this->apiurl.'?'.http_build_query($keysArr); + $response = get_curl($token_url); + + $arr = json_decode($response,true); + return $arr; + } +} diff --git a/app/lib/Plugin.php b/app/lib/Plugin.php new file mode 100644 index 0000000..9e7a9fa --- /dev/null +++ b/app/lib/Plugin.php @@ -0,0 +1,147 @@ +tmpPath = app()->getRuntimePath() . '/tmp/'; + $this->uniqid = uniqid(); + $this->zipFilename = $this->uniqid . '.zip'; + $this->zipFilepath = $this->tmpPath . $this->zipFilename; + + $this->tmpDirPath = $this->tmpPath . $this->uniqid . '/';; + + if (!file_exists($this->tmpPath)) { + mkdir($this->tmpPath, 0777, true); + } + + } + + private function unzip() + { + if (!file_exists($this->zipFilepath)) { + throw new Exception('压缩包不存在请重试'); + } + if (!unzip($this->zipFilepath, $this->tmpDirPath)) { + throw new Exception('解压失败'); + } + return true; + } + + private function checkPlugin() + { + $tree_relative = tree_relative($this->tmpDirPath); + $arr1 = array_keys($tree_relative); + $pluginAuthor = reset($arr1); + if (empty($pluginAuthor)) { + throw new Exception('插件目录格式有误,安装失败'); + } + $arr2 = array_keys($tree_relative[$pluginAuthor]); + $pluginName = reset($arr2); + + if (empty($pluginAuthor) || empty($pluginName)) { + throw new Exception('插件目录格式有误,安装失败'); + } + + if (!file_exists("$this->tmpDirPath/$pluginAuthor/$pluginName/Install.php")) { + throw new Exception('插件缺失Install.php,安装失败'); + } + return [ + $pluginAuthor, + $pluginName, + ]; + } + + private function clearOld() + { + + if (!file_exists(dirname($this->pluginPath))) { + mkdir(dirname($this->pluginPath), 0777, true); + } + del_tree($this->pluginPath); + } + + public function install() + { + try { + + $this->unzip(); + + $checkPlugin = $this->checkPlugin(); + + $this->pluginAuthor = $checkPlugin[0]; + $this->pluginName = $checkPlugin[1]; + + $this->pluginPath = plugin_path_get() . "/$this->pluginAuthor/$this->pluginName"; + //清空旧插件 + $this->clearOld(); + //移动文件 + rename("$this->tmpDirPath/$this->pluginAuthor/$this->pluginName", $this->pluginPath); + // 执行Install.php + require "$this->pluginPath/Install.php"; + + $this->pluginClass = "$this->pluginAuthor\\$this->pluginName"; + $class = "plugin\\$this->pluginClass\\Install"; + if (!class_exists($class)) { + throw new Exception("插件缺失类$this->pluginClass,安装失败"); + } + $install = new $class(); + $model = Db::name('plugin')->where('class', $this->pluginClass)->find(); + if (!$model) { + $model['title'] = '插件' . $this->uniqid; + $model['alias'] = $this->uniqid; + $model['class'] = $this->pluginClass; + $model['desc'] = ''; + $model['category_id'] = 0; + $model['request_count'] = 0; + } + $pluginconfig = $install->Install(); + if(isset($pluginconfig['title'])) $model['title'] = $pluginconfig['title']; + if(isset($pluginconfig['alias'])) $model['alias'] = $pluginconfig['alias']; + if(isset($pluginconfig['class'])) $model['class'] = $pluginconfig['class']; + if(isset($pluginconfig['desc'])) $model['desc'] = $pluginconfig['desc']; + + //判断alias是否重复 + $model2 = Db::name('plugin')->where('alias', $model['alias'])->find(); + if ($model2 && $model2['id'] !== $model['id']) { + $model['alias'] .= "_$this->uniqid"; + } + $model['id'] = Db::name('plugin')->cache('plugins')->insertGetId($model); + } catch (\Exception $e) { + @del_tree($this->pluginPath); + return msg('error', $e->getMessage()); + } finally { + @del_tree($this->tmpDirPath); + @unlink($this->zipFilepath); + } + return msg('ok', '安装成功', $model); + } + + /** + * @return string + */ + public function getZipFilepath(): string + { + return $this->zipFilepath; + } +} \ No newline at end of file diff --git a/app/lib/QQGroup.php b/app/lib/QQGroup.php new file mode 100644 index 0000000..bd4a8a4 --- /dev/null +++ b/app/lib/QQGroup.php @@ -0,0 +1,170 @@ +uin=$uin; + preg_match('/skey=(.{10});/',$cookie,$skey); + $this->gtk=$this->getGTK($skey[1]); + $this->cookie=$cookie; + } + + private function getGTK($skey){ + $len = strlen($skey); + $hash = 5381; + for ($i = 0; $i < $len; $i++) { + $hash += ($hash << 5 & 2147483647) + ord($skey[$i]) & 2147483647; + $hash &= 2147483647; + } + return $hash & 2147483647; + } + + //QQ群列表 + public function grouplist($onlyadmin = false){ + $url = 'https://qun.qq.com/cgi-bin/qun_mgr/get_group_list'; + $post = 'bkn='.$this->gtk; + $data = get_curl($url,$post,'https://qun.qq.com/member.html',$this->cookie,0,$this->ua); + $arr = json_decode($data,true); + //print_r($arr);exit; + if(!$arr){ + throw new Exception('QQ群列表获取失败!'); + } elseif(isset($arr['ec']) && $arr['ec']==0) { + $group = []; + if(isset($arr['create'])){ + foreach($arr['create'] as $row){ + $group[] = $row; + } + } + if(isset($arr['manage'])){ + foreach($arr['manage'] as $row){ + $group[] = $row; + } + } + if(!$onlyadmin && isset($arr['join'])){ + foreach($arr['join'] as $row){ + $group[] = $row; + } + } + return $group; + } elseif($arr['ec']==1 || $arr['ec']==4) { + session('qq_cookie_qun', null); + throw new Exception('当前QQ登录状态已失效,请重新登录!'); + } else { + throw new Exception('QQ群列表获取失败!'.$arr['em']); + } + } + + //QQ群成员列表 + public function groupmemberlist($groupid, $start, $end){ + $url='https://qun.qq.com/cgi-bin/qun_mgr/search_group_members'; + $post='gc='.$groupid.'&st='.$start.'&end='.$end.'&sort=0&bkn='.$this->gtk; + $data = get_curl($url,$post,'https://qun.qq.com/member.html',$this->cookie,0,$this->ua); + $arr = json_decode($data,true); + if (!$arr) { + throw new Exception('QQ群成员获取失败!'); + }elseif ($arr["ec"] == 1) { + throw new Exception('SKEY已失效!'); + }elseif ($arr["ec"]!=0){ + throw new Exception('QQ群成员获取失败!'.$arr['em']); + } + $data = array(); + $data['code'] = 0; + $data['count'] = $arr['count']; + $data['mems'] = $arr['mems']; + if($end<$arr['count'])$data['start'] = $end+1; + else $data['start'] = 0; + return $data; + } + + //群公告列表 + public function announcelist($groupid, $start){ + $url='https://web.qun.qq.com/cgi-bin/announce/list_announce'; + $post='bkn='.$this->gtk.'&qid='.$groupid.'&ft=23&s='.$start.'&n=10&ni=1&i=1'; + $data = get_curl($url,$post,'https://web.qun.qq.com/announce/index.html',$this->cookie,0,$this->ua); + $arr = json_decode($data,true); + if (!$arr) { + throw new Exception('公告列表获取失败!'); + }elseif ($arr["ec"] == 1) { + session('qq_cookie_qun', null); + throw new Exception('当前QQ登录状态已失效,请重新登录!'); + }elseif ($arr["ec"]!=0){ + throw new Exception('公告列表获取失败!'.$arr['em']); + } + if(!isset($arr['feeds']) || !$arr['feeds'])return []; + $uinlist = []; + foreach($arr['ui'] as $uin => $row){ + $uinlist[$uin] = $row['n']; + } + $list = []; + foreach($arr['feeds'] as $row){ + $msg = $row['msg']['text']; + if(mb_strlen($msg, 'utf-8')>30)$msg=mb_substr($msg, 0, 30, 'utf-8').'...'; + if($row['pinned']==1)$msg = '[顶]'.$msg; + $list[] = ['fid'=>$row['fid'], 'uin'=>$row['u'], 'nick'=>$uinlist[$row['u']]?$uinlist[$row['u']]:$row['u'], 'time'=>date("Y-m-d H:i:s", $row['pubt']), 'msg'=>$msg]; + } + return $list; + } + + //删除群公告 + public function delannounce($groupid, $fid){ + $url='https://web.qun.qq.com/cgi-bin/announce/del_feed'; + $post='fid='.$fid.'&ft=23&bkn='.$this->gtk.'&qid='.$groupid.'&op=0'; + $data = get_curl($url,$post,'https://web.qun.qq.com/announce/index.html',$this->cookie,0,$this->ua); + $arr = json_decode($data,true); + if(isset($arr["ec"]) && ($arr["ec"]==0 || $arr["ec"]==14)){ + return true; + }elseif ($arr["ec"] == 1) { + throw new Exception('SKEY已失效!'); + }else{ + throw new Exception('公告删除失败!'.$arr['em']); + } + } + + //解散群 + public function dismissgroup($groupuin){ + $resultarr = array(11=>'需要验证码', 13=>'号码异常,暂时不允许解散', 15=>'为了企业信息安全,请登录企业帐户中心进行解散操作。', 16=>'公益群暂不支持解散。', 17=>'该群被转让不足28天,暂时还不能解散。', 25=>'付费2000人群不可解散。', 51=>'您的群已绑定了教育机构,如需进行此操作,请先与机构解绑。'); + + $url = 'https://id.qq.com/qun/dismiss_group'; + $referrer = 'https://id.qq.com/proxy.html'; + $post = 'vc=undefined&gc='.$groupuin.'&uin='.$this->uin.'&s=1&bkn='.$this->gtk; + $data = get_curl($url,$post,$referrer,$this->cookie,0,$this->ua); + $arr = json_decode($data,true); + if(isset($arr["ec"]) && $arr["ec"]==0){ + return true; + }elseif ($arr["ec"] == 1) { + session('qq_cookie_qqid', null); + throw new Exception('当前QQ登录状态已失效,请重新登录!'); + }elseif(isset($arr['ec']) && array_key_exists($arr['ec'],$resultarr)){ + throw new Exception($resultarr[$arr['ec']]); + }else{ + throw new Exception('解散群失败,可能非群主或群不存在。返回信息:'.$data); + } + } + + //获取加群链接 + public function getjoinlink($groupuin){ + $url = 'https://admin.qun.qq.com/cgi-bin/qun_admin/get_join_link'; + $referrer = 'https://admin.qun.qq.com/create/share/index.html?ptlang=2052&groupUin='.$groupuin; + $post = 'gc='.$groupuin.'&type=1&bkn='.$this->gtk; + $data = get_curl($url,$post,$referrer,$this->cookie); + $arr = json_decode($data,true); + if (isset($arr["ec"]) && $arr['ec']==0) { + return $arr['url']; + }elseif($arr['ec']==1){ + session('qq_cookie_qun', null); + throw new Exception('加群链接获取失败,原因:SKEY已失效'); + }else{ + throw new Exception('加群链接获取失败 '.$arr['em']); + } + } +} \ No newline at end of file diff --git a/app/lib/QQLogin.php b/app/lib/QQLogin.php new file mode 100644 index 0000000..7fd8031 --- /dev/null +++ b/app/lib/QQLogin.php @@ -0,0 +1,148 @@ +-1,'msg'=>'daid不能为空'); + if($daid == '5'){ + $url='https://ssl.ptlogin2.qq.com/ptqrshow?appid=549000912&e=2&l=M&s=4&d=72&v=4&t=0.5409099'.time().'&daid=5&pt_3rd_aid=0&u1=https%3A%2F%2Fqzs.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone'; + $referer='https://xui.ptlogin2.qq.com/cgi-bin/xlogin?proxy_url=https%3A//qzs.qq.com/qzone/v6/portal/proxy.html&daid=5&&hide_title_bar=1&low_login=0&qlogin_auto_login=1&no_verifyimg=1&link_target=blank&appid=549000912&style=22&target=self&s_url=https%3A%2F%2Fqzs.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone'; + }else{ + $url='https://ssl.ptlogin2.qq.com/ptqrshow?appid=716027609&e=2&l=M&s=4&d=72&v=4&t=0.5409099'.time().'&daid='.$daid.'&pt_3rd_aid=100384226'; + $referer='https://xui.ptlogin2.qq.com/cgi-bin/xlogin?daid='.$daid.'&hide_title_bar=1&low_login=0&qlogin_auto_login=1&no_verifyimg=1&link_target=blank&target=self&s_url=https:%2F%2Fqzs.qq.com%2Fqzone%2Fv5%2Floginsucc.html?para%3Dizone&pt_no_auth=0&appid=716027609&pt_3rd_aid=100384226'; + } + $arr=$this->get_curl_split($url,$referer); + preg_match('/qrsig=(.*?);/',$arr['header'],$match); + if($qrsig=$match[1]){ + $qrcode = new QrReader($arr['body'], QrReader::SOURCE_TYPE_BLOB); + $code_url = $qrcode->text(); + return array('saveOK'=>0,'qrsig'=>$qrsig,'data'=>base64_encode($arr['body']),'url'=>$code_url); + }else{ + return array('saveOK'=>1,'msg'=>'二维码获取失败'); + } + } + public function qrlogin($daid,$s_url,$qrsig){ + if(empty($daid)||empty($s_url))return array('saveOK'=>-1,'msg'=>'daid和s_url不能为空'); + if(empty($qrsig))return array('saveOK'=>-1,'msg'=>'qrsig不能为空'); + if($daid == '5'){ + $url='https://ssl.ptlogin2.qq.com/ptqrlogin?u1=https%3A%2F%2Fqzs.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&ptqrtoken='.$this->getqrtoken($qrsig).'&ptredirect=0&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=0-0-'.time().'000&js_ver=23042119&js_type=1&login_sig=&pt_uistyle=40&aid=549000912&daid=5&'; + }else{ + $url='https://ssl.ptlogin2.qq.com/ptqrlogin?u1='.urlencode($s_url).'&ptqrtoken='.$this->getqrtoken($qrsig).'&ptredirect=0&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=0-0-'.time().'0000&js_ver=10194&js_type=1&login_sig=&pt_uistyle=40&aid=716027609&daid='.$daid.'&pt_3rd_aid=100384226&'; + } + $ret = $this->get_curl($url,0,'https://xui.ptlogin2.qq.com/','qrsig='.$qrsig.'; ',1); + if(preg_match("/ptuiCB\('(.*?)'\)/", $ret, $arr)){ + $r=explode("','",str_replace("', '","','",$arr[1])); + if($r[0]==0){ + preg_match('/uin=(\d+)&/',$ret,$uin); + $uin=$uin[1]; + preg_match('/skey=@(.{9});/',$ret,$skey); + preg_match('/superkey=(.*?);/',$ret,$superkey); + $data=$this->get_curl($r[2],0,0,0,1); + if($data) { + preg_match_all('/Set-Cookie: (.*?);/i',$data,$matchs); + $cookie=''; + foreach ($matchs[1] as $val) { + if(substr($val,-1)=='=')continue; + $cookie.=$val.'; '; + } + $cookie = substr($cookie,0,-2); + } + if($cookie){ + return array('saveOK'=>0,'uin'=>$uin,'cookie'=>$cookie,'nickname'=>$r[5]); + }else{ + return array('saveOK'=>6,'msg'=>'登录成功,获取相关信息失败!'.$r[2]); + } + }elseif($r[0]==65){ + return array('saveOK'=>1,'msg'=>'二维码已失效。'); + }elseif($r[0]==66){ + return array('saveOK'=>2,'msg'=>'二维码未失效。'); + }elseif($r[0]==67){ + return array('saveOK'=>3,'msg'=>'正在验证二维码。'); + }else{ + return array('saveOK'=>6,'msg'=>$r[4]); + } + }else{ + return array('saveOK'=>6,'msg'=>$ret); + } + } + private function getqrtoken($qrsig){ + $len = strlen($qrsig); + $hash = 0; + for($i = 0; $i < $len; $i++){ + $hash += (($hash << 5) & 2147483647) + ord($qrsig[$i]) & 2147483647; + $hash &= 2147483647; + } + return $hash & 2147483647; + } + private function get_curl($url,$post=0,$referer=0,$cookie=0,$header=0,$ua=0,$nobaody=0,$noproxy=0){ + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL,$url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + $httpheader[] = "Accept: application/json"; + $httpheader[] = "Accept-Encoding: gzip,deflate,sdch"; + $httpheader[] = "Accept-Language: zh-CN,zh;q=0.8"; + $httpheader[] = "Connection: keep-alive"; + curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader); + if($post){ + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, $post); + } + if($header){ + curl_setopt($ch, CURLOPT_HEADER, TRUE); + } + if($cookie){ + curl_setopt($ch, CURLOPT_COOKIE, $cookie); + } + if($referer){ + curl_setopt($ch, CURLOPT_REFERER, $referer); + } + if($ua){ + curl_setopt($ch, CURLOPT_USERAGENT,$ua); + }else{ + curl_setopt($ch, CURLOPT_USERAGENT,$this->ua); + } + if($nobaody){ + curl_setopt($ch, CURLOPT_NOBODY,1); + + } + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + curl_setopt($ch, CURLOPT_ENCODING, "gzip"); + curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); + $ret = curl_exec($ch); + curl_close($ch); + return $ret; + } + private function get_curl_split($url,$referer=0){ + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL,$url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + $httpheader[] = "Accept: */*"; + $httpheader[] = "Accept-Encoding: gzip,deflate,sdch"; + $httpheader[] = "Accept-Language: zh-CN,zh;q=0.8"; + $httpheader[] = "Connection: keep-alive"; + curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader); + curl_setopt($ch, CURLOPT_HEADER, TRUE); + curl_setopt($ch, CURLOPT_USERAGENT,$this->ua); + if($referer){ + curl_setopt($ch, CURLOPT_REFERER, $referer); + } + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + curl_setopt($ch, CURLOPT_ENCODING, "gzip"); + curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); + $ret = curl_exec($ch); + $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE); + $header = substr($ret, 0, $headerSize); + $body = substr($ret, $headerSize); + $ret=array(); + $ret['header']=$header; + $ret['body']=$body; + curl_close($ch); + return $ret; + } +} \ No newline at end of file diff --git a/app/lib/QQTool.php b/app/lib/QQTool.php new file mode 100644 index 0000000..eb7a669 --- /dev/null +++ b/app/lib/QQTool.php @@ -0,0 +1,209 @@ +uin=$uin; + $this->cookie=$cookie; + if($is_skey){ + $this->skey=getSubstr($cookie, 'skey=', ';'); + $this->gtk=$this->getGTK($this->skey); + }else{ + $pskey=getSubstr($cookie, 'p_skey=', ';'); + $this->gtk=$this->getGTK($pskey); + } + } + + private function getGTK($skey){ + $len = strlen($skey); + $hash = 5381; + for ($i = 0; $i < $len; $i++) { + $hash += ($hash << 5 & 2147483647) + ord($skey[$i]) & 2147483647; + $hash &= 2147483647; + } + return $hash & 2147483647; + } + + private function getGTK2($skey){ + $salt = 5381; + $md5key = 'tencentQQVIP123443safde&!%^%1282'; + $hash = array(); + $hash[] = ($salt << 5); + for($i = 0; $i < strlen($skey); $i ++) + { + $ASCIICode = mb_convert_encoding($skey[$i], 'UTF-32BE', 'UTF-8'); + $ASCIICode = hexdec(bin2hex($ASCIICode)); + $hash[] = (($salt << 5) + $ASCIICode); + $salt = $ASCIICode; + } + $md5str = md5(implode($hash) . $md5key); + return $md5str; + } + + //好友与分组列表 + public function friendlist(){ + $url = 'https://mobile.qzone.qq.com/friend/mfriend_list?g_tk='.$this->gtk.'&res_uin='.$this->uin.'&res_type=normal&format=json&count_per_page=10&page_index=0&page_type=0&mayknowuin=&qqmailstat='; + $json = get_curl($url,0,1,$this->cookie); + $json = mb_convert_encoding($json, "UTF-8", "UTF-8"); + $arr = json_decode($json, true); + if(!$arr){ + throw new Exception('好友列表获取失败!'); + }elseif(isset($arr['code']) && $arr['code']==0){ + return $arr["data"]; + }elseif ($arr["code"] == -3000) { + session('qq_cookie_qzone', null); + throw new Exception('当前QQ登录状态已失效,请重新登录!'); + }elseif (isset($arr["message"])) { + throw new Exception('好友列表获取失败!'.$arr["message"]); + }else{ + throw new Exception('好友列表获取失败!'); + } + } + + //说说列表 + public function shuoshuolist($count){ + $url='https://mobile.qzone.qq.com/list?g_tk='.$this->gtk.'&res_attach=&format=json&list_type=shuoshuo&action=0&res_uin='.$this->uin.'&count='.$count; + $data = get_curl($url,0,1,$this->cookie); + $arr=json_decode($data,true); + if (isset($arr['code']) && $arr['code']==0) { + if(isset($arr['data']['vFeeds'])) + return $arr['data']['vFeeds']; + else + return $arr['data']['feeds']['vFeeds']; + }elseif ($arr["code"] == -3000) { + session('qq_cookie_qzone', null); + throw new Exception('当前QQ登录状态已失效,请重新登录!'); + }elseif (isset($arr["message"])) { + throw new Exception('说说列表获取失败!'.$arr["message"]); + }else{ + throw new Exception('说说列表获取失败!'); + } + } + + //说说最多点赞数 + public function shuoshuozancount($count){ + $zan = 0; + $list = $this->shuoshuolist($count); + foreach($list as $row){ + if($row['like']['num']>$zan) $zan=$row['like']['num']; + } + return $zan; + } + + //秒赞检测 + public function mzjc(){ + $arr = $this->friendlist(); + $friend=$arr["list"]; + $gpnames=$arr["gpnames"]; + + foreach($gpnames as $gprow){ + $gpid=$gprow['gpid']; + $gpname[$gpid]=$gprow['gpname']; + } + + $arr = $this->shuoshuolist('5'); + $qqrow=array(); + $qquins=array(); + foreach ($arr as $row ) { + $url='https://users.qzone.qq.com/cgi-bin/likes/get_like_list_app?uin='.$this->uin.'&unikey='.urlencode($row['comm']['curlikekey']).'&begin_uin=0&query_count=200&if_first_page=1&g_tk='.$this->gtk; + $data2 = get_curl($url,0,'https://user.qzone.qq.com/',$this->cookie); + if(!$data2){ + throw new Exception('说说点赞列表获取失败!可更新SKEY后重试'); + } + preg_match('/_Callback\((.*?)\)\;/is',$data2,$json); + $arr2=json_decode($json[1],true); + $data2=$arr2['data']['like_uin_info']; + foreach ($data2 as $row2 ) { + $fuin=$row2['fuin']; + if(isset($qqrow[$fuin])){$qqrow[$fuin]++;} + else {$qqrow[$fuin]=1;$qquins[]=$fuin;} + } + } + + $mzcount=count($qqrow); + foreach ($friend as $row3 ) { + $fuin=$row3['uin']; + if(isset($qqrow[$fuin]))$list['mz']=$qqrow[$fuin]; + else $list['mz']=0; + $list['uin']=$row3['uin']; + $list['name']=$row3['nick']; + if($row3['remark'])$list['remark']=$row3['remark']; + else $list['remark']=$row3['nick']; + $list['groupid']=$row3['groupid']; + $result['friend'][]=$list; + unset($list); + } + rsort($result['friend']); + $friend=$result['friend']; + $fcount=count($friend); + $array=array(); + foreach($friend as $nrow){ + if($nrow['mz']) $array[$nrow['groupid']]['mzcount']=$array[$nrow['groupid']]['mzcount']+1; + $array[$nrow['groupid']][]=$nrow; + } + $friend=$array; + + return [$fcount, $mzcount, $friend, $gpnames]; + } + + //查询当前是否VIP + public function getisvip(){ + $data=get_curl('https://cgi.vip.qq.com/unipay/init?format=json&aid=vipminipay.pingtai.vipsite.nav_new&platform=pc&version=-1&isbreak=0&g_tk='.$this->getGTK2($this->skey),0,'https://vip.qq.com/',$this->cookie); + $arr=json_decode($data,true); + if($arr['ret']==-7) { + throw new Exception('SKEY已失效!'); + } + $isqqvip=$arr['recParam']['is_vip']; + return $isqqvip; + } + + //修改QQ昵称 + public function setnickname($nickname){ + $url="https://h5.qzone.qq.com/proxy/domain/w.qzone.qq.com/cgi-bin/user/cgi_apply_updateuserinfo_new?g_tk=".$this->gtk; + $data="qzreferrer=http%3A%2F%2Fctc.qzs.qq.com%2Fqzone%2Fv6%2Fsetting%2Fprofile%2Fprofile.html%3Ftab%3Dbase&nickname=".urlencode($nickname)."&emoji=&sex=1&birthday=2015-01-01&province=0&city=PAR&country=FRA&marriage=6&bloodtype=5&hp=0&hc=PAR&hco=FRA&career=&company=&cp=0&cc=0&cb=&cco=0&lover=&islunar=0&mb=1&uin=".$this->uin."&pageindex=1&nofeeds=1&fupdate=1&format=json"; + $return=get_curl($url,$data,$url,$this->cookie); + $arr=json_decode($return,true); + if(!$arr){ + throw new Exception('更换昵称失败'); + }elseif(isset($arr['code']) && $arr['code']==0){ + return true; + }elseif($arr["code"] == -3000) { + session('qq_cookie_qzone', null); + throw new Exception('当前QQ登录状态已失效,请重新登录!'); + }elseif(isset($arr['message'])){ + throw new Exception($arr['message']); + }else{ + throw new Exception('更换昵称失败'); + } + } + + public function set_online_status($model, $desc, $imei){ + $pt4_token = getSubstr($this->cookie, 'pt4_token=', ';'); + $ua = 'Mozilla/5.0 (Linux; Android 12; IN2010 Build/RKQ1.211119.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/97.0.4692.98 Mobile Safari/537.36 V1_AND_SQ_8.8.68_2538_YYB_D A_8086800 QQ/8.8.88 NetType/4G'; + $data = json_encode(['13031'=>['req'=>['sModel'=>$model, 'iAppType'=>3, 'sIMei'=>$imei, 'sVer'=>'8.8.88', 'sManu'=>'', 'lUin'=>intval($this->uin), 'bShowInfo'=>true, 'sDesc'=>$desc, 'sModelShow'=> $model]]]); + $url = 'https://proxy.vac.qq.com/cgi-bin/srfentry.fcgi?ts='.time().'000&g_tk='.$this->gtk.'&data='.rawurlencode($data).'&pt4_token='.urlencode($pt4_token); + $data = get_curl($url, 0, 'https://proxy.vac.qq.com/', $this->cookie, 0, $ua); + $arr = json_decode($data, true); + if(!$arr){ + throw new Exception('修改在线状态失败'); + }elseif(isset($arr['ecode']) && $arr['ecode']==0){ + if(isset($arr['13031']['ret']) && $arr['13031']['ret']==0){ + return true; + }else{ + throw new Exception('修改在线状态失败,'.$arr['13031']['msg']); + } + }else{ + throw new Exception('修改在线状态失败,'.$data); + } + } +} \ No newline at end of file diff --git a/app/lib/QQWry.dat b/app/lib/QQWry.dat new file mode 100644 index 0000000..0dda788 Binary files /dev/null and b/app/lib/QQWry.dat differ diff --git a/app/lib/XdbSearcher.php b/app/lib/XdbSearcher.php new file mode 100644 index 0000000..0216a9c --- /dev/null +++ b/app/lib/XdbSearcher.php @@ -0,0 +1,370 @@ + +// @Date 2022/06/21 + +class XdbSearcher +{ + const HeaderInfoLength = 256; + const VectorIndexRows = 256; + const VectorIndexCols = 256; + const VectorIndexSize = 8; + const SegmentIndexSize = 14; + + // xdb file handle + private $handle = null; + + // header info + private $header = null; + private $ioCount = 0; + + // vector index in binary string. + // string decode will be faster than the map based Array. + private $vectorIndex = null; + + // xdb content buffer + private $contentBuff = null; + + // --- + // static function to create searcher + + /** + * @throws Exception + */ + public static function newWithFileOnly($dbFile) + { + return new XdbSearcher($dbFile, null, null); + } + + /** + * @throws Exception + */ + public static function newWithVectorIndex($dbFile, $vIndex) + { + return new XdbSearcher($dbFile, $vIndex); + } + + /** + * @throws Exception + */ + public static function newWithBuffer($cBuff) + { + return new XdbSearcher(null, null, $cBuff); + } + + // --- End of static creator + + /** + * initialize the xdb searcher + * @throws Exception + */ + function __construct($dbFile = null, $vectorIndex = null, $cBuff = null) + { + // check the content buffer first + if ($cBuff != null) { + $this->vectorIndex = null; + $this->contentBuff = $cBuff; + } else { + // 加载默认数据文件 by Anyon + if (is_null($dbFile)) { + $dbFile = __DIR__ . DIRECTORY_SEPARATOR . 'ip2region.xdb'; + } + // open the xdb binary file + $this->handle = fopen($dbFile, "r"); + if ($this->handle === false) { + throw new Exception("failed to open xdb file '%s'", $dbFile); + } + + $this->vectorIndex = $vectorIndex; + } + } + + function close() + { + if ($this->handle != null) { + fclose($this->handle); + } + } + + function getIOCount() + { + return $this->ioCount; + } + + /** + * find the region info for the specified ip address + * @throws Exception + */ + function search($ip) + { + // check and convert the sting ip to a 4-bytes long + if (is_string($ip)) { + $t = self::ip2long($ip); + if ($t === null) { + throw new Exception("invalid ip address `$ip`"); + } + $ip = $t; + } + + // reset the global counter + $this->ioCount = 0; + + // locate the segment index block based on the vector index + $il0 = ($ip >> 24) & 0xFF; + $il1 = ($ip >> 16) & 0xFF; + $idx = $il0 * self::VectorIndexCols * self::VectorIndexSize + $il1 * self::VectorIndexSize; + if ($this->vectorIndex != null) { + $sPtr = self::getLong($this->vectorIndex, $idx); + $ePtr = self::getLong($this->vectorIndex, $idx + 4); + } elseif ($this->contentBuff != null) { + $sPtr = self::getLong($this->contentBuff, self::HeaderInfoLength + $idx); + $ePtr = self::getLong($this->contentBuff, self::HeaderInfoLength + $idx + 4); + } else { + // read the vector index block + $buff = $this->read(self::HeaderInfoLength + $idx, 8); + if ($buff === null) { + throw new Exception("failed to read vector index at ${idx}"); + } + + $sPtr = self::getLong($buff, 0); + $ePtr = self::getLong($buff, 4); + } + + // printf("sPtr: %d, ePtr: %d\n", $sPtr, $ePtr); + + // binary search the segment index to get the region info + $dataLen = 0; + $dataPtr = null; + $l = 0; + $h = ($ePtr - $sPtr) / self::SegmentIndexSize; + while ($l <= $h) { + $m = ($l + $h) >> 1; + $p = $sPtr + $m * self::SegmentIndexSize; + + // read the segment index + $buff = $this->read($p, self::SegmentIndexSize); + if ($buff == null) { + throw new Exception("failed to read segment index at ${p}"); + } + + $sip = self::getLong($buff, 0); + if ($ip < $sip) { + $h = $m - 1; + } else { + $eip = self::getLong($buff, 4); + if ($ip > $eip) { + $l = $m + 1; + } else { + $dataLen = self::getShort($buff, 8); + $dataPtr = self::getLong($buff, 10); + break; + } + } + } + + // match nothing interception. + // @TODO: could this even be a case ? + // printf("dataLen: %d, dataPtr: %d\n", $dataLen, $dataPtr); + if ($dataPtr == null) { + return null; + } + + // load and return the region data + $buff = $this->read($dataPtr, $dataLen); + if ($buff == null) { + return null; + } + + return $buff; + } + + // read specified bytes from the specified index + private function read($offset, $len) + { + // check the in-memory buffer first + if ($this->contentBuff != null) { + return substr($this->contentBuff, $offset, $len); + } + + // read from the file + $r = fseek($this->handle, $offset); + if ($r == -1) { + return null; + } + + $this->ioCount++; + $buff = fread($this->handle, $len); + if ($buff === false) { + return null; + } + + if (strlen($buff) != $len) { + return null; + } + + return $buff; + } + + // --- static util functions ---- + + // convert a string ip to long + public static function ip2long($ip) + { + $ip = ip2long($ip); + if ($ip === false) { + return null; + } + + // convert signed int to unsigned int if on 32 bit operating system + if ($ip < 0 && PHP_INT_SIZE == 4) { + $ip = sprintf("%u", $ip); + } + + return $ip; + } + + // read a 4bytes long from a byte buffer + public static function getLong($b, $idx) + { + $val = (ord($b[$idx])) | (ord($b[$idx + 1]) << 8) + | (ord($b[$idx + 2]) << 16) | (ord($b[$idx + 3]) << 24); + + // convert signed int to unsigned int if on 32 bit operating system + if ($val < 0 && PHP_INT_SIZE == 4) { + $val = sprintf("%u", $val); + } + + return $val; + } + + // read a 2bytes short from a byte buffer + public static function getShort($b, $idx) + { + return ((ord($b[$idx])) | (ord($b[$idx + 1]) << 8)); + } + + // load header info from a specified file handle + public static function loadHeader($handle) + { + if (fseek($handle, 0) == -1) { + return null; + } + + $buff = fread($handle, self::HeaderInfoLength); + if ($buff === false) { + return null; + } + + // read bytes length checking + if (strlen($buff) != self::HeaderInfoLength) { + return null; + } + + // return the decoded header info + return [ + 'version' => self::getShort($buff, 0), + 'indexPolicy' => self::getShort($buff, 2), + 'createdAt' => self::getLong($buff, 4), + 'startIndexPtr' => self::getLong($buff, 8), + 'endIndexPtr' => self::getLong($buff, 12) + ]; + } + + // load header info from the specified xdb file path + public static function loadHeaderFromFile($dbFile) + { + $handle = fopen($dbFile, 'r'); + if ($handle === false) { + return null; + } + + $header = self::loadHeader($handle); + fclose($handle); + return $header; + } + + // load vector index from a file handle + public static function loadVectorIndex($handle) + { + if (fseek($handle, self::HeaderInfoLength) == -1) { + return null; + } + + $rLen = self::VectorIndexRows * self::VectorIndexCols * self::SegmentIndexSize; + $buff = fread($handle, $rLen); + if ($buff === false) { + return null; + } + + if (strlen($buff) != $rLen) { + return null; + } + + return $buff; + } + + // load vector index from a specified xdb file path + public static function loadVectorIndexFromFile($dbFile) + { + $handle = fopen($dbFile, 'r'); + if ($handle === false) { + return null; + } + + $vIndex = self::loadVectorIndex($handle); + fclose($handle); + return $vIndex; + } + + // load the xdb content from a file handle + public static function loadContent($handle) + { + if (fseek($handle, 0, SEEK_END) == -1) { + return null; + } + + $size = ftell($handle); + if ($size === false) { + return null; + } + + // seek to the head for reading + if (fseek($handle, 0) == -1) { + return null; + } + + $buff = fread($handle, $size); + if ($buff === false) { + return null; + } + + // read length checking + if (strlen($buff) != $size) { + return null; + } + + return $buff; + } + + // load the xdb content from a file path + public static function loadContentFromFile($dbFile) + { + $str = file_get_contents($dbFile, false); + if ($str === false) { + return null; + } else { + return $str; + } + } + + public static function now() + { + return (microtime(true) * 1000); + } + +} \ No newline at end of file diff --git a/app/middleware.php b/app/middleware.php new file mode 100644 index 0000000..ce8b761 --- /dev/null +++ b/app/middleware.php @@ -0,0 +1,10 @@ +time()) { + $islogin = true; + } + } + } + if (!$islogin) { + if ($request->isAjax() || !$request->isGet()) { + return msg('error', '请登录')->code(401); + } + return redirect((string)url('/admin/login.html')); + } + return $next($request); + } +} diff --git a/app/middleware/AuthUser.php b/app/middleware/AuthUser.php new file mode 100644 index 0000000..12b5fcf --- /dev/null +++ b/app/middleware/AuthUser.php @@ -0,0 +1,41 @@ +where('id', $uid)->find(); + if($user && $user['enable']==1){ + $session=md5($user['id'].$user['password']); + if($session==$sid && $expiretime>time()) { + if(!$user['avatar_url']) $user['avatar_url'] = '/static/images/user.png'; + $islogin = true; + } + }elseif($user && $user['enable']==0 && !session('user_block')){ + session('user_block', '1'); + } + } + } + $request->islogin = $islogin; + $request->user = $user; + /*if (!$islogin) { + if ($request->isAjax() || !$request->isGet()) { + return msg('error','请登录'); + } + return redirect((string)url('/login')); + }*/ + return $next($request); + } +} diff --git a/app/middleware/LoadConfig.php b/app/middleware/LoadConfig.php new file mode 100644 index 0000000..dd5f6ed --- /dev/null +++ b/app/middleware/LoadConfig.php @@ -0,0 +1,29 @@ +getRootPath().'.env')){ + return redirect((string)url('/install')); + } + + $res = Db::name('config')->cache('configs',0)->column('value','key'); + Config::set($res, 'sys'); + + return $next($request); + } +} diff --git a/app/middleware/RefererCheck.php b/app/middleware/RefererCheck.php new file mode 100644 index 0000000..7282761 --- /dev/null +++ b/app/middleware/RefererCheck.php @@ -0,0 +1,24 @@ +islogin); + View::assign('user', $request->user); + View::assign('cdn_cdnjs', config_get('cdn_cdnjs', '//cdn.staticfile.org/')); + View::assign('cdn_npm', config_get('cdn_npm', 'https://unpkg.com/')); + View::config(['view_path' => template_path_get()]); + return $next($request)->header([ + 'Cache-Control' => 'no-store, no-cache, must-revalidate', + 'Pragma' => 'no-cache', + ]); + } +} diff --git a/app/provider.php b/app/provider.php new file mode 100644 index 0000000..f50c367 --- /dev/null +++ b/app/provider.php @@ -0,0 +1,9 @@ + Request::class, + 'think\exception\Handle' => ExceptionHandle::class, +]; diff --git a/app/service.php b/app/service.php new file mode 100644 index 0000000..7a4c574 --- /dev/null +++ b/app/service.php @@ -0,0 +1,10 @@ +extend('is_json', function ($value) { + if (!is_string($value)) { + $value = json_encode($value); + } + json_decode($value); + return json_last_error() == JSON_ERROR_NONE; + }); + $validate->extend('is_legal_plugin_class', function ($value) { + if (!is_string($value)){ + return false; + } + $arr = explode('\\', $value); + return count($arr) === 2; + }); + }); + } +} diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..875dcf4 --- /dev/null +++ b/composer.json @@ -0,0 +1,47 @@ +{ + "name": "cccyun/toolbox", + "description": "CCCYUN TOOLBOX", + "type": "project", + "keywords": [ + "aoaostar", + "toolbox" + ], + "homepage": "http://tool.cccyun.cc/", + "license": "GPL-3.0-only", + "require": { + "php": ">=7.3.5", + "topthink/framework": "^6.0.0", + "topthink/think-orm": "^2.0", + "topthink/think-view": "^1.0", + "topthink/think-migration": "^3.0", + "cccyun/think-captcha": "^3.0", + "ext-curl": "*", + "ext-json": "*", + "ext-zip": "*", + "ext-pdo": "*", + "ext-iconv": "*", + "khanamiryan/qrcode-detector-decoder": "1.0.5.2" + }, + "require-dev": { + "symfony/var-dumper": "^4.2", + "topthink/think-trace": "^1.0" + }, + "autoload": { + "psr-4": { + "app\\": "app", + "plugin\\": "plugin" + }, + "psr-0": { + "": "extend/" + } + }, + "config": { + "preferred-install": "dist" + }, + "scripts": { + "post-autoload-dump": [ + "@php think service:discover", + "@php think vendor:publish" + ] + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..0e56a7c --- /dev/null +++ b/composer.lock @@ -0,0 +1,1020 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "90b52d33a495d2606004dc98c6c983ae", + "packages": [ + { + "name": "cccyun/think-captcha", + "version": "3.0.7", + "source": { + "type": "git", + "url": "https://github.com/netcccyun/think-captcha.git", + "reference": "ba2997f1c3fbcf2aae3dd5a80c8285a957121523" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/netcccyun/think-captcha/zipball/ba2997f1c3fbcf2aae3dd5a80c8285a957121523", + "reference": "ba2997f1c3fbcf2aae3dd5a80c8285a957121523", + "shasum": "" + }, + "require": { + "topthink/framework": "^6.0.0" + }, + "type": "library", + "extra": { + "think": { + "services": [ + "think\\captcha\\CaptchaService" + ], + "config": { + "captcha": "src/config.php" + } + } + }, + "autoload": { + "files": [ + "src/helper.php" + ], + "psr-4": { + "think\\captcha\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "yunwuxin", + "email": "448901948@qq.com" + } + ], + "description": "captcha package for thinkphp", + "support": { + "source": "https://github.com/netcccyun/think-captcha/tree/3.0.7" + }, + "time": "2022-10-21T03:33:53+00:00" + }, + { + "name": "khanamiryan/qrcode-detector-decoder", + "version": "1.0.5.2", + "source": { + "type": "git", + "url": "https://github.com/khanamiryan/php-qrcode-detector-decoder.git", + "reference": "04fdd58d86a387065f707dc6d3cc304c719910c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/khanamiryan/php-qrcode-detector-decoder/zipball/04fdd58d86a387065f707dc6d3cc304c719910c1", + "reference": "04fdd58d86a387065f707dc6d3cc304c719910c1", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 | ^7.5 | ^8.0 | ^9.0" + }, + "type": "library", + "autoload": { + "files": [ + "lib/Common/customFunctions.php" + ], + "psr-4": { + "Zxing\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT", + "Apache-2.0" + ], + "authors": [ + { + "name": "Ashot Khanamiryan", + "email": "a.khanamiryan@gmail.com", + "homepage": "https://github.com/khanamiryan", + "role": "Developer" + } + ], + "description": "QR code decoder / reader", + "homepage": "https://github.com/khanamiryan/php-qrcode-detector-decoder/", + "keywords": [ + "barcode", + "qr", + "zxing" + ], + "support": { + "issues": "https://github.com/khanamiryan/php-qrcode-detector-decoder/issues", + "source": "https://github.com/khanamiryan/php-qrcode-detector-decoder/tree/1.0.5.2" + }, + "time": "2021-07-13T18:46:38+00:00" + }, + { + "name": "psr/container", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/log", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, + "time": "2021-05-03T11:20:27+00:00" + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/master" + }, + "time": "2017-10-23T01:57:42+00:00" + }, + { + "name": "topthink/framework", + "version": "v6.1.2", + "source": { + "type": "git", + "url": "https://github.com/top-think/framework.git", + "reference": "67235be5b919aaaf1de5aed9839f65d8e766aca3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/top-think/framework/zipball/67235be5b919aaaf1de5aed9839f65d8e766aca3", + "reference": "67235be5b919aaaf1de5aed9839f65d8e766aca3", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": ">=7.2.5", + "psr/container": "~1.0", + "psr/http-message": "^1.0", + "psr/log": "~1.0", + "psr/simple-cache": "^1.0", + "topthink/think-helper": "^3.1.1", + "topthink/think-orm": "^2.0|^3.0" + }, + "require-dev": { + "guzzlehttp/psr7": "^2.1.0", + "mikey179/vfsstream": "^1.6", + "mockery/mockery": "^1.2", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "autoload": { + "files": [], + "psr-4": { + "think\\": "src/think/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "liu21st", + "email": "liu21st@gmail.com" + }, + { + "name": "yunwuxin", + "email": "448901948@qq.com" + } + ], + "description": "The ThinkPHP Framework.", + "homepage": "http://thinkphp.cn/", + "keywords": [ + "framework", + "orm", + "thinkphp" + ], + "support": { + "issues": "https://github.com/top-think/framework/issues", + "source": "https://github.com/top-think/framework/tree/v6.1.2" + }, + "time": "2023-02-08T02:24:01+00:00" + }, + { + "name": "topthink/think-helper", + "version": "v3.1.6", + "source": { + "type": "git", + "url": "https://github.com/top-think/think-helper.git", + "reference": "769acbe50a4274327162f9c68ec2e89a38eb2aff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/top-think/think-helper/zipball/769acbe50a4274327162f9c68ec2e89a38eb2aff", + "reference": "769acbe50a4274327162f9c68ec2e89a38eb2aff", + "shasum": "" + }, + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/helper.php" + ], + "psr-4": { + "think\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "yunwuxin", + "email": "448901948@qq.com" + } + ], + "description": "The ThinkPHP6 Helper Package", + "support": { + "issues": "https://github.com/top-think/think-helper/issues", + "source": "https://github.com/top-think/think-helper/tree/v3.1.6" + }, + "time": "2021-12-15T04:27:55+00:00" + }, + { + "name": "topthink/think-migration", + "version": "v3.0.5", + "source": { + "type": "git", + "url": "https://github.com/top-think/think-migration.git", + "reference": "7a5ec3952ea97bf1a5d8872e1bd10f2abf6294ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/top-think/think-migration/zipball/7a5ec3952ea97bf1a5d8872e1bd10f2abf6294ca", + "reference": "7a5ec3952ea97bf1a5d8872e1bd10f2abf6294ca", + "shasum": "" + }, + "require": { + "topthink/framework": "^6.0", + "topthink/think-helper": "^3.0.3" + }, + "require-dev": { + "fzaninotto/faker": "^1.8" + }, + "suggest": { + "fzaninotto/faker": "Required to use the factory builder (^1.8)." + }, + "type": "library", + "extra": { + "think": { + "services": [ + "think\\migration\\Service" + ] + } + }, + "autoload": { + "psr-4": { + "Phinx\\": "phinx/src/Phinx", + "think\\migration\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "yunwuxin", + "email": "448901948@qq.com" + } + ], + "support": { + "issues": "https://github.com/top-think/think-migration/issues", + "source": "https://github.com/top-think/think-migration/tree/v3.0.5" + }, + "time": "2023-02-26T13:16:22+00:00" + }, + { + "name": "topthink/think-orm", + "version": "v2.0.60", + "source": { + "type": "git", + "url": "https://github.com/top-think/think-orm.git", + "reference": "8bc34a4307fa27186c0e96a9b3de3cb23aa1ed46" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/top-think/think-orm/zipball/8bc34a4307fa27186c0e96a9b3de3cb23aa1ed46", + "reference": "8bc34a4307fa27186c0e96a9b3de3cb23aa1ed46", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-pdo": "*", + "php": ">=7.1.0", + "psr/log": "^1.0|^2.0", + "psr/simple-cache": "^1.0|^2.0", + "topthink/think-helper": "^3.1" + }, + "require-dev": { + "phpunit/phpunit": "^7|^8|^9.5" + }, + "type": "library", + "autoload": { + "files": [ + "stubs/load_stubs.php" + ], + "psr-4": { + "think\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "liu21st", + "email": "liu21st@gmail.com" + } + ], + "description": "think orm", + "keywords": [ + "database", + "orm" + ], + "support": { + "issues": "https://github.com/top-think/think-orm/issues", + "source": "https://github.com/top-think/think-orm/tree/v2.0.60" + }, + "time": "2023-03-19T04:51:56+00:00" + }, + { + "name": "topthink/think-template", + "version": "v2.0.9", + "source": { + "type": "git", + "url": "https://github.com/top-think/think-template.git", + "reference": "6d25642ae0e306166742fd7073dc7a159e18073c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/top-think/think-template/zipball/6d25642ae0e306166742fd7073dc7a159e18073c", + "reference": "6d25642ae0e306166742fd7073dc7a159e18073c", + "shasum": "" + }, + "require": { + "php": ">=7.1.0", + "psr/simple-cache": "^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "think\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "liu21st", + "email": "liu21st@gmail.com" + } + ], + "description": "the php template engine", + "support": { + "issues": "https://github.com/top-think/think-template/issues", + "source": "https://github.com/top-think/think-template/tree/v2.0.9" + }, + "time": "2023-02-14T10:50:39+00:00" + }, + { + "name": "topthink/think-view", + "version": "v1.0.14", + "source": { + "type": "git", + "url": "https://github.com/top-think/think-view.git", + "reference": "edce0ae2c9551ab65f9e94a222604b0dead3576d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/top-think/think-view/zipball/edce0ae2c9551ab65f9e94a222604b0dead3576d", + "reference": "edce0ae2c9551ab65f9e94a222604b0dead3576d", + "shasum": "" + }, + "require": { + "php": ">=7.1.0", + "topthink/think-template": "^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "think\\view\\driver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "liu21st", + "email": "liu21st@gmail.com" + } + ], + "description": "thinkphp template driver", + "support": { + "issues": "https://github.com/top-think/think-view/issues", + "source": "https://github.com/top-think/think-view/tree/v1.0.14" + }, + "time": "2019-11-06T11:40:13+00:00" + } + ], + "packages-dev": [ + { + "name": "symfony/polyfill-mbstring", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v4.4.47", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "1069c7a3fca74578022fab6f81643248d02f8e63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/1069c7a3fca74578022fab6f81643248d02f8e63", + "reference": "1069c7a3fca74578022fab6f81643248d02f8e63", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php72": "~1.5", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/console": "<3.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^3.4|^4.0|^5.0", + "symfony/process": "^4.4|^5.0", + "twig/twig": "^1.43|^2.13|^3.0.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v4.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-10-03T15:15:11+00:00" + }, + { + "name": "topthink/think-trace", + "version": "v1.6", + "source": { + "type": "git", + "url": "https://github.com/top-think/think-trace.git", + "reference": "136cd5d97e8bdb780e4b5c1637c588ed7ca3e142" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/top-think/think-trace/zipball/136cd5d97e8bdb780e4b5c1637c588ed7ca3e142", + "reference": "136cd5d97e8bdb780e4b5c1637c588ed7ca3e142", + "shasum": "" + }, + "require": { + "php": ">=7.1.0", + "topthink/framework": "^6.0|^8.0" + }, + "type": "library", + "extra": { + "think": { + "services": [ + "think\\trace\\Service" + ], + "config": { + "trace": "src/config.php" + } + } + }, + "autoload": { + "psr-4": { + "think\\trace\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "liu21st", + "email": "liu21st@gmail.com" + } + ], + "description": "thinkphp debug trace", + "support": { + "issues": "https://github.com/top-think/think-trace/issues", + "source": "https://github.com/top-think/think-trace/tree/v1.6" + }, + "time": "2023-02-07T08:36:32+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=7.3.5", + "ext-curl": "*", + "ext-json": "*", + "ext-zip": "*", + "ext-pdo": "*", + "ext-iconv": "*" + }, + "platform-dev": [], + "plugin-api-version": "2.3.0" +} diff --git a/config/app.php b/config/app.php new file mode 100644 index 0000000..a5c02db --- /dev/null +++ b/config/app.php @@ -0,0 +1,37 @@ + env('app.host', ''), + // 应用的命名空间 + 'app_namespace' => '', + // 是否启用路由 + 'with_route' => true, + // 默认应用 + 'default_app' => 'index', + // 默认时区 + 'default_timezone' => 'Asia/Shanghai', + + // 应用映射(自动多应用模式有效) + 'app_map' => [], + // 域名绑定(自动多应用模式有效) + 'domain_bind' => [], + // 禁止URL访问的应用列表(自动多应用模式有效) + 'deny_app_list' => [], + + // 异常页面的模板文件 + 'exception_tmpl' => app()->getThinkPath() . 'tpl/think_exception.tpl', + + // 错误显示信息,非调试模式有效 + 'error_message' => '页面错误!请稍后再试~', + // 显示错误信息 + 'show_error_msg' => true, + 'http_exception_template' => [ + // 定义404错误的模板文件地址 + 404 => \think\facade\App::getRootPath() . 'public/404.html', + ], + 'version' => '1.6', + 'ver' => 1060 +]; diff --git a/config/cache.php b/config/cache.php new file mode 100644 index 0000000..00e928b --- /dev/null +++ b/config/cache.php @@ -0,0 +1,40 @@ + env('cache.driver', 'file'), + + // 缓存连接方式配置 + 'stores' => [ + 'file' => [ + // 驱动方式 + 'type' => 'File', + // 缓存保存目录 + 'path' => '', + // 缓存前缀 + 'prefix' => '', + // 缓存有效期 0表示永久缓存 + 'expire' => 3600, + // 缓存标签前缀 + 'tag_prefix' => 'tag:', + // 序列化机制 例如 ['serialize', 'unserialize'] + 'serialize' => [], + ], + 'redis' => [ + // 驱动方式 + 'type' => 'Redis', + 'host' => '127.0.0.1', + 'port' => 6379, + 'password' => '', + 'select' => 0, + // 缓存有效期 0表示永久缓存 + 'expire' => 3600, + 'prefix' => '', + ], + // 更多的缓存连接 + ], +]; diff --git a/config/captcha.php b/config/captcha.php new file mode 100644 index 0000000..6ec80f6 --- /dev/null +++ b/config/captcha.php @@ -0,0 +1,39 @@ + 4, + // 验证码字符集合 + 'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY', + // 验证码过期时间 + 'expire' => 1800, + // 是否使用中文验证码 + 'useZh' => false, + // 是否使用算术验证码 + 'math' => false, + // 是否使用背景图 + 'useImgBg' => false, + //验证码字符大小 + 'fontSize' => 25, + // 是否使用混淆曲线 + 'useCurve' => true, + //是否添加杂点 + 'useNoise' => true, + // 验证码字体 不设置则随机 + 'fontttf' => '', + //背景颜色 + 'bg' => [243, 251, 254], + // 验证码图片高度 + 'imageH' => 0, + // 验证码图片宽度 + 'imageW' => 0, + + // 添加额外的验证码设置 + // verify => [ + // 'length'=>4, + // ... + //], +]; diff --git a/config/console.php b/config/console.php new file mode 100644 index 0000000..fa80611 --- /dev/null +++ b/config/console.php @@ -0,0 +1,12 @@ + [ + + 'plugin:package' => 'app\command\PluginPackage', + 'cron' => 'app\command\Cron', + ], +]; diff --git a/config/cookie.php b/config/cookie.php new file mode 100644 index 0000000..5d4b881 --- /dev/null +++ b/config/cookie.php @@ -0,0 +1,20 @@ + 0, + // cookie 保存路径 + 'path' => '/', + // cookie 有效域名 + 'domain' => '', + // cookie 启用安全传输 + 'secure' => false, + // httponly设置 + 'httponly' => false, + // 是否使用 setcookie + 'setcookie' => true, + // samesite 设置,支持 'strict' 'lax' + 'samesite' => '', +]; diff --git a/config/database.php b/config/database.php new file mode 100644 index 0000000..0372637 --- /dev/null +++ b/config/database.php @@ -0,0 +1,63 @@ + env('database.driver', 'mysql'), + + // 自定义时间查询规则 + 'time_query_rule' => [], + + // 自动写入时间戳字段 + // true为自动识别类型 false关闭 + // 字符串则明确指定时间字段类型 支持 int timestamp datetime date + 'auto_timestamp' => true, + + // 时间字段取出后的默认时间格式 + 'datetime_format' => 'Y-m-d H:i:s', + + // 时间字段配置 配置格式:create_time,update_time + 'datetime_field' => '', + + // 数据库连接配置信息 + 'connections' => [ + 'mysql' => [ + // 数据库类型 + 'type' => env('database.type', 'mysql'), + // 服务器地址 + 'hostname' => env('database.hostname', '127.0.0.1'), + // 数据库名 + 'database' => env('database.database', ''), + // 用户名 + 'username' => env('database.username', 'root'), + // 密码 + 'password' => env('database.password', ''), + // 端口 + 'hostport' => env('database.hostport', '3306'), + // 数据库连接参数 + 'params' => [], + // 数据库编码默认采用utf8 + 'charset' => env('database.charset', 'utf8mb4'), + // 数据库表前缀 + 'prefix' => env('database.prefix', ''), + + // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) + 'deploy' => 0, + // 数据库读写是否分离 主从式有效 + 'rw_separate' => false, + // 读写分离后 主服务器数量 + 'master_num' => 1, + // 指定从服务器序号 + 'slave_no' => '', + // 是否严格检查字段是否存在 + 'fields_strict' => true, + // 是否需要断线重连 + 'break_reconnect' => false, + // 监听SQL + 'trigger_sql' => env('app_debug', true), + // 开启字段缓存 + 'fields_cache' => false, + ], + + // 更多的数据库配置信息 + ], +]; diff --git a/config/filesystem.php b/config/filesystem.php new file mode 100644 index 0000000..d4b02ab --- /dev/null +++ b/config/filesystem.php @@ -0,0 +1,30 @@ + env('filesystem.driver', 'local'), + // 磁盘列表 + 'disks' => [ + 'local' => [ + 'type' => 'local', + 'root' => app()->getRuntimePath() . 'storage', + ], + 'public' => [ + // 磁盘类型 + 'type' => 'local', + // 磁盘路径 + 'root' => app()->getRootPath() . 'public/storage', + // 磁盘路径对应的外部URL路径 + 'url' => '/storage', + // 可见性 + 'visibility' => 'public', + ], + 'tmp' => [ + // 磁盘类型 + 'type' => 'local', + // 磁盘路径 + 'root' => app()->getRuntimePath() . 'tmp', + ], + // 更多的磁盘配置信息 + ], +]; diff --git a/config/lang.php b/config/lang.php new file mode 100644 index 0000000..762120c --- /dev/null +++ b/config/lang.php @@ -0,0 +1,27 @@ + env('lang.default_lang', 'zh-cn'), + // 允许的语言列表 + 'allow_lang_list' => [], + // 多语言自动侦测变量名 + 'detect_var' => 'lang', + // 是否使用Cookie记录 + 'use_cookie' => true, + // 多语言cookie变量 + 'cookie_var' => 'think_lang', + // 多语言header变量 + 'header_var' => 'think-lang', + // 扩展语言包 + 'extend_list' => [], + // Accept-Language转义为对应语言包名称 + 'accept_language' => [ + 'zh-hans-cn' => 'zh-cn', + ], + // 是否支持语言分组 + 'allow_group' => false, +]; diff --git a/config/log.php b/config/log.php new file mode 100644 index 0000000..001870a --- /dev/null +++ b/config/log.php @@ -0,0 +1,45 @@ + env('log.channel', 'file'), + // 日志记录级别 + 'level' => [], + // 日志类型记录的通道 ['error'=>'email',...] + 'type_channel' => [], + // 关闭全局日志写入 + 'close' => false, + // 全局日志处理 支持闭包 + 'processor' => null, + + // 日志通道列表 + 'channels' => [ + 'file' => [ + // 日志记录方式 + 'type' => 'File', + // 日志保存目录 + 'path' => '', + // 单文件日志写入 + 'single' => false, + // 独立日志级别 + 'apart_level' => [], + // 最大日志文件数量 + 'max_files' => 0, + // 使用JSON格式记录 + 'json' => false, + // 日志处理 + 'processor' => null, + // 关闭通道日志写入 + 'close' => false, + // 日志输出格式化 + 'format' => '[%s][%s] %s', + // 是否实时写入 + 'realtime_write' => false, + ], + // 其它日志通道配置 + ], + +]; diff --git a/config/middleware.php b/config/middleware.php new file mode 100644 index 0000000..bd3502e --- /dev/null +++ b/config/middleware.php @@ -0,0 +1,8 @@ + [], + // 优先级设置,此数组中的中间件会按照数组中的顺序优先执行 + 'priority' => [], +]; diff --git a/config/route.php b/config/route.php new file mode 100644 index 0000000..6ce67f0 --- /dev/null +++ b/config/route.php @@ -0,0 +1,45 @@ + '/', + // URL伪静态后缀 + 'url_html_suffix' => '', + // URL普通方式参数 用于自动生成 + 'url_common_param' => true, + // 是否开启路由延迟解析 + 'url_lazy_route' => false, + // 是否强制使用路由 + 'url_route_must' => false, + // 合并路由规则 + 'route_rule_merge' => false, + // 路由是否完全匹配 + 'route_complete_match' => false, + // 访问控制器层名称 + 'controller_layer' => 'controller', + // 空控制器名 + 'empty_controller' => 'Error', + // 是否使用控制器后缀 + 'controller_suffix' => false, + // 默认的路由变量规则 + 'default_route_pattern' => '[\w\.]+', + // 是否开启请求缓存 true自动缓存 支持设置请求缓存规则 + 'request_cache_key' => false, + // 请求缓存有效期 + 'request_cache_expire' => null, + // 全局请求缓存排除规则 + 'request_cache_except' => [], + // 默认控制器名 + 'default_controller' => 'Index', + // 默认操作名 + 'default_action' => 'index', + // 操作方法后缀 + 'action_suffix' => '', + // 默认JSONP格式返回的处理方法 + 'default_jsonp_handler' => 'jsonpReturn', + // 默认JSONP处理方法 + 'var_jsonp_handler' => 'callback', +]; diff --git a/config/session.php b/config/session.php new file mode 100644 index 0000000..ae8d095 --- /dev/null +++ b/config/session.php @@ -0,0 +1,19 @@ + 'PHPSESSID', + // SESSION_ID的提交变量,解决flash上传跨域 + 'var_session_id' => '', + // 驱动方式 支持file cache + 'type' => 'file', + // 存储连接标识 当type使用cache的时候有效 + 'store' => null, + // 过期时间 + 'expire' => 21600, + // 前缀 + 'prefix' => '', +]; diff --git a/config/trace.php b/config/trace.php new file mode 100644 index 0000000..0fd4b4c --- /dev/null +++ b/config/trace.php @@ -0,0 +1,10 @@ + 'Html', + // 读取的日志通道名 + 'channel' => '', +]; diff --git a/config/version.php b/config/version.php new file mode 100644 index 0000000..0c54464 --- /dev/null +++ b/config/version.php @@ -0,0 +1,6 @@ + 'Think', + // 默认模板渲染规则 1 解析为小写+下划线 2 全部转换小写 3 保持操作方法 + 'auto_rule' => 1, + // 模板目录名 + 'view_dir_name' => 'view', + // 模板后缀 + 'view_suffix' => 'html', + // 模板文件名分隔符 + 'view_depr' => DIRECTORY_SEPARATOR, + // 模板引擎普通标签开始标记 + 'tpl_begin' => '{', + // 模板引擎普通标签结束标记 + 'tpl_end' => '}', + // 标签库标签开始标记 + 'taglib_begin' => '{', + // 标签库标签结束标记 + 'taglib_end' => '}', +]; diff --git a/install.sql b/install.sql new file mode 100644 index 0000000..4c4ab96 --- /dev/null +++ b/install.sql @@ -0,0 +1,230 @@ +DROP TABLE IF EXISTS `toolbox_category`; +CREATE TABLE `toolbox_category` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `title` varchar(255) NOT NULL COMMENT '标题', + `icon` varchar(40) DEFAULT NULL, + `weight` int(11) NOT NULL DEFAULT '0' COMMENT '权重', + `enable` tinyint(1) NOT NULL DEFAULT '1', + `create_time` datetime NOT NULL COMMENT '安装时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + + +INSERT INTO `toolbox_category` (`id`, `title`, `icon`, `weight`, `enable`, `create_time`, `update_time`) VALUES +(1, '站长工具', 'icon ni ni-setting', 9, 1, '2022-04-17 17:55:20', '2022-04-23 20:03:41'), +(2, '开发工具', 'icon ni ni-code', 8, 1, '2022-04-17 17:55:28', '2022-04-23 20:03:33'), +(3, '实用工具', 'icon ni ni-map', 7, 1, '2022-04-17 17:55:38', '2022-04-23 14:40:49'), +(4, '娱乐工具', 'icon ni ni-aperture', 5, 1, '2022-04-17 17:55:45', '2022-05-18 15:49:11'), +(5, 'QQ工具', 'icon ni ni-chat-circle-fill', 6, 1, '2022-05-18 15:48:31', '2022-05-18 15:52:57'); + + +DROP TABLE IF EXISTS `toolbox_comment`; +CREATE TABLE `toolbox_comment` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `uid` int(11) NOT NULL, + `email` varchar(255) DEFAULT NULL, + `ip` varchar(20) DEFAULT NULL, + `content` text, + `reply` text, + `enable` tinyint(1) NOT NULL DEFAULT '0', + `create_time` datetime NOT NULL COMMENT '创建时间', + `update_time` datetime NOT NULL COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `uid` (`uid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + + +DROP TABLE IF EXISTS `toolbox_config`; +CREATE TABLE `toolbox_config` ( + `key` varchar(32) NOT NULL COMMENT '标题', + `value` TEXT DEFAULT NULL COMMENT '值', + PRIMARY KEY (`key`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +INSERT INTO `toolbox_config` (`key`, `value`) VALUES +('admin_password', ''), +('admin_username', ''), +('captcha_id', ''), +('captcha_key', ''), +('ip_type', '0'), +('cdn_cdnjs', '//cdn.staticfile.org/'), +('cdn_npm', 'https://unpkg.com/'), +('description', '这是一个非常Nice的在线工具箱'), +('foot_code', ''), +('keywords', '彩虹工具网,源码查看器原创,在线,工具'), +('oauth_appid', '1000'), +('oauth_appkey', ''), +('oauth_appurl', ''), +('oauth_openqq', '1'), +('oauth_openwx', '1'), +('subtitle', '免费手机工具 站长工具 源代码查看器'), +('syskey', ''), +('template', 'default'), +('title', '彩虹工具网'); + + +DROP TABLE IF EXISTS `toolbox_link`; +CREATE TABLE `toolbox_link` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(120) NOT NULL COMMENT '链接文字', + `url` varchar(255) NOT NULL COMMENT '链接地址', + `weight` int(11) NOT NULL DEFAULT '0' COMMENT '权重', + `enable` tinyint(1) NOT NULL DEFAULT '0' COMMENT '链接状态', + `create_time` datetime NOT NULL COMMENT '创建时间', + `update_time` datetime NOT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +INSERT INTO `toolbox_link` (`id`, `name`, `url`, `weight`, `enable`, `create_time`, `update_time`) VALUES +(1, '彩虹云主机', 'https://www.cccyun.net/', 8, 1, '2022-04-21 22:24:16', '2022-04-22 22:01:01'), +(2, '缤纷彩虹天地', 'https://blog.cccyun.cn/', 9, 1, '2022-04-22 22:00:37', '2022-05-04 17:06:11'), +(4, '彩虹聚合登录', 'https://u.cccyun.cc/', 4, 1, '2022-04-22 22:02:06', '2022-04-22 22:02:06'), +(5, '彩虹网址导航', 'http://www.cccyun.cn/', 7, 1, '2022-05-04 17:06:23', '2022-05-04 17:09:23'); + + +DROP TABLE IF EXISTS `toolbox_plugin`; +CREATE TABLE `toolbox_plugin` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `title` varchar(255) NOT NULL COMMENT '插件标题', + `alias` varchar(128) NOT NULL COMMENT '插件名', + `class` varchar(128) NOT NULL COMMENT '插件类', + `keyword` varchar(255) DEFAULT NULL, + `weight` int(11) NOT NULL DEFAULT '0' COMMENT '权重', + `enable` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否启用', + `level` int(11) NOT NULL DEFAULT '0', + `login` tinyint(1) NOT NULL DEFAULT '0', + `request_count` int(11) NOT NULL DEFAULT '0' COMMENT '接口请求次数', + `category_id` int(11) NOT NULL DEFAULT '0' COMMENT '分类', + `desc` text, + `create_time` datetime NOT NULL COMMENT '安装时间', + `update_time` datetime NOT NULL COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `alias` (`alias`), + UNIQUE KEY `class` (`class`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +INSERT INTO `toolbox_plugin` (`id`, `title`, `alias`, `class`, `keyword`, `weight`, `enable`, `level`, `login`, `request_count`, `category_id`, `desc`, `create_time`, `update_time`) VALUES +(2, '随机密码生成', 'rand_password', 'utility\\rand_password', 'suijimimashengcheng,sjmmsc', 86, 1, 0, 0, 0, 3, '', '2022-04-17 17:54:49', '2022-05-04 17:27:36'), +(3, '支付宝到账语音', 'alipay_arrival', 'fun\\alipay_arrival', 'zhifubaodaozhangyuyin,zfbdzyy', 7, 1, 0, 0, 0, 4, '', '2022-04-17 18:09:43', '2022-05-04 17:29:50'), +(5, '让流量消失', 'bandwidth_waste', 'fun\\bandwidth_waste', 'rangliuliangxiaoshi,rllxs', 6, 1, 0, 0, 0, 4, '', '2022-04-17 18:10:15', '2022-05-04 17:29:53'), +(13, 'emoji表情', 'emoji', 'utility\\emoji', 'emojibiaoqing,emojibq', 79, 1, 0, 0, 0, 3, '', '2022-04-21 17:51:49', '2022-05-04 17:28:09'), +(19, 'CSS格式化/压缩', 'code_css', 'dev\\code_css', 'cssgeshihuayasuo,cssgshys', 87, 1, 0, 0, 0, 2, '', '2022-04-25 10:59:11', '2022-05-04 17:25:00'), +(20, 'Html格式化/压缩', 'code_html', 'dev\\code_html', 'htmlgeshihuayasuo,htmlgshys', 88, 1, 0, 0, 0, 2, '', '2022-04-25 14:52:26', '2022-05-04 17:24:56'), +(21, 'JavaScript格式化/压缩', 'code_js', 'dev\\code_js', 'javascriptgeshihuayasuo,jsgshys', 89, 1, 0, 0, 0, 2, '', '2022-04-25 15:05:53', '2022-05-04 17:24:53'), +(22, '字节计算器', 'byte_calc', 'dev\\byte_calc', 'zijiejisuanqi,zjjsq', 98, 1, 0, 0, 0, 2, '', '2022-04-25 15:28:28', '2022-05-04 17:23:24'), +(23, '文章生成器', 'bullshit_generator', 'fun\\bullshit_generator', 'wenzhangshengchengqi,wzscq', 8, 1, 0, 0, 0, 4, '', '2022-04-25 15:51:35', '2022-05-04 17:29:49'), +(24, 'base64编码/解码', 'base64', 'dev\\base64', 'base64bianmajiema,base64bmjm', 0, 1, 0, 0, 0, 2, '', '2022-04-25 16:14:16', '2022-04-25 16:14:16'), +(25, 'ASCII艺术字生成', 'ascii_art', 'fun\\ascii_art', 'asciiyishuzishengcheng,asciiyszsc', 9, 1, 0, 0, 0, 4, '', '2022-04-25 16:30:03', '2022-05-04 17:29:42'), +(26, '对称加密解密', 'encrypt', 'dev\\encrypt', 'duichenjiamijiemi,dcjmjm', 94, 1, 0, 0, 0, 2, '', '2022-04-26 16:53:45', '2022-05-04 17:24:28'), +(27, '文件哈希计算', 'file_hash', 'utility\\file_hash', 'wenjianhaxijisuan,wenjianhashjisuan,wjhxjs', 84, 1, 0, 0, 0, 2, '', '2022-04-26 17:50:55', '2022-10-21 17:38:34'), +(28, 'GitHub下载加速', 'github', 'dev\\github', 'github,xiazaijiasu,xzjs', 96, 1, 0, 0, 0, 2, '', '2022-04-27 16:43:06', '2022-05-04 17:23:49'), +(29, '聚合高速图床', 'imghosting', 'utility\\imghosting', 'qqbaidugaosutuchuang,qqbdgstc', 99, 1, 0, 0, 1, 3, '', '2022-04-27 17:21:50', '2023-05-20 21:06:21'), +(31, '网站Favicon获取', 'favicon', 'web\\favicon', 'wangzhanfaviconhuoqu,wzfaviconhq', 92, 1, 0, 0, 0, 1, '', '2022-04-28 19:01:36', '2022-05-04 17:22:01'), +(32, '字符串哈希计算', 'str_hash', 'utility\\str_hash', 'zifuchuanhaxijisuan,zfchxjs', 84, 1, 0, 0, 0, 2, '', '2022-04-29 18:12:57', '2022-05-04 17:27:44'), +(33, '在线进制转换', 'hex_convert', 'dev\\hex_convert', 'zaixianjinzhizhuanhuan,zxjzzh', 97, 1, 0, 0, 0, 2, '', '2022-04-29 19:19:26', '2022-05-04 17:24:15'), +(34, 'ICP备案查询', 'icp', 'web\\icp', 'icpbeianchaxun,icpbacx', 97, 1, 0, 0, 0, 1, '', '2022-04-30 16:49:34', '2022-05-04 17:21:39'), +(35, 'IP地址查询', 'ip', 'web\\ip', 'ipdizhichaxun,ipquery,ipdzcx', 98, 1, 0, 0, 0, 1, '', '2022-05-01 10:41:15', '2022-05-04 17:21:37'), +(36, '域名Whois查询', 'whois', 'web\\whois', 'yumingwhoischaxun,ymwhoiscx', 96, 1, 0, 0, 0, 1, '', '2022-05-02 10:40:21', '2022-05-04 17:21:42'), +(37, '在线图片编辑', 'image_editor', 'utility\\image_editor', 'zaixiantupianbianji,zxtpbj', 64, 1, 0, 0, 0, 3, '', '2022-05-02 11:42:03', '2022-10-21 17:37:48'), +(38, '图片转base64', 'image2base64', 'utility\\image2base64', 'tupianzhuanbase64,tpzbase64', 87, 1, 0, 0, 0, 2, '', '2022-05-02 12:09:00', '2022-05-04 17:27:29'), +(39, 'JSON解析格式化', 'json', 'dev\\json', 'jsonjiexigeshihua,jsonjxgsh', 90, 1, 0, 0, 0, 2, '', '2022-05-02 12:44:30', '2022-05-04 17:24:51'), +(40, 'Linux命令查询', 'linux_command', 'dev\\linux_command', 'linuxminglingchaxun,linuxmlcx', 91, 1, 0, 0, 0, 2, '', '2022-05-02 14:52:25', '2022-05-04 17:24:45'), +(41, 'Markdown在线编辑', 'markdown', 'dev\\markdown', 'markdownzaixianbianji,markdownzxbj', 92, 1, 0, 0, 0, 2, '', '2022-05-02 16:42:06', '2022-05-04 17:24:42'), +(42, 'MimeType类型表', 'mime_type', 'dev\\mime_type', 'mimetypeleixingbiao,mimetypelxb', 85, 1, 0, 0, 0, 2, '', '2022-05-02 16:50:24', '2022-05-04 17:25:07'), +(43, '在线钢琴', 'piano', 'fun\\piano', 'zaixiangangqin,piano,zxgq', 5, 1, 0, 0, 0, 4, '', '2022-05-02 17:03:13', '2022-05-04 17:29:54'), +(44, '二维码生成', 'qrcode', 'utility\\qrcode', 'erweimashengcheng,ewmsc,qrcode', 87, 1, 0, 0, 0, 3, '', '2022-05-02 17:12:05', '2022-10-21 17:36:31'), +(45, 'RSA公私钥生成', 'rsa', 'dev\\rsa', 'rsagongsiyueshengcheng,rsagsysc', 95, 1, 0, 0, 0, 2, '', '2022-05-02 17:43:38', '2022-05-04 17:24:08'), +(46, '短网址生成', 'short_url', 'utility\\short_url', 'duanwangzhishengcheng,shorturl,dwzsc', 83, 1, 0, 0, 0, 3, '', '2022-05-02 18:24:35', '2022-05-04 17:27:54'), +(47, '特殊符号大全', 'special_symbols', 'utility\\special_symbols', 'teshufuhaodaquan,tsfhdq', 78, 1, 0, 0, 0, 3, '', '2022-05-02 20:22:10', '2022-05-04 17:28:11'), +(48, '在线语音合成', 'speech_synthesis', 'fun\\speech_synthesis', 'zaixianyuyinhecheng,zxyyhc', 10, 1, 0, 0, 0, 4, '', '2022-05-02 20:25:56', '2022-05-04 17:29:40'), +(49, '字数统计与排版', 'text_count', 'utility\\text_count', 'zishutongjiyupaiban,zstjypb', 77, 1, 0, 0, 0, 3, '', '2022-05-02 20:49:16', '2023-09-28 15:30:34'), +(50, 'Unix时间戳转换', 'timestamp', 'utility\\timestamp', 'unixshijianchuozhuanhuan,unixsjczh', 82, 1, 0, 0, 0, 2, '', '2022-05-03 09:29:08', '2022-05-04 17:27:57'), +(51, 'UUID生成器', 'uuid', 'dev\\uuid', 'uuidshengchengqi,guid,uuidscq', 93, 1, 0, 0, 0, 2, '', '2022-05-03 15:48:04', '2022-05-04 17:24:35'), +(52, '中文简繁体转化', 'zh_convert', 'utility\\zh_convert', 'zhongwenjianfantizhuanhua,zwjftzh', 80, 1, 0, 0, 0, 3, '', '2022-05-03 16:16:50', '2022-05-04 17:28:02'), +(53, '中文域名转码', 'punycode', 'web\\punycode', 'zhongwenyumingzhuanma,zwymzm,punycode', 91, 1, 0, 0, 0, 1, '', '2022-05-03 16:25:30', '2022-05-04 17:22:04'), +(54, '编码解码器', 'decode', 'dev\\decode', 'bianmajiemaqi,bmjmq', 99, 1, 0, 0, 0, 2, '', '2022-05-03 17:15:14', '2022-05-04 17:23:20'), +(55, '腾讯域名拦截查询', 'checkurl', 'web\\checkurl', 'yuminglanjiechaxun,ymljcx', 94, 1, 0, 0, 0, 1, '', '2022-05-03 18:31:42', '2023-09-28 15:28:07'), +(57, '手机在线FTP', 'http://ftp.cccyun.cc/', 'web\\ftp', 'shoujizaixianftp,sjzxftp', 89, 1, 0, 0, 0, 1, '', '2022-05-03 20:01:40', '2022-05-04 17:22:18'), +(58, 'MySQL管理器', '/tool/mysql/', 'web\\mysql', 'mysqlguanliqi,mysqlglq', 90, 1, 0, 0, 0, 1, '', '2022-05-03 20:05:08', '2022-05-04 17:22:15'), +(59, '百度BDUSS获取', '/tool/bduss/', 'utility\\bduss', 'baidubdusshuoqu,bdbdusshq', 96, 0, 0, 0, 0, 3, '', '2022-05-03 20:06:37', '2022-05-04 17:26:10'), +(60, 'QQ获取COOKIE', '/tool/newsid/', 'utility\\newsid', 'qqhuoqucookie,qqhqcookie', 97, 0, 0, 0, 0, 3, '', '2022-05-03 20:07:13', '2022-08-24 20:34:52'), +(61, '全网音乐搜索', 'http://music.hi.cn/', 'utility\\musictool', 'quanwangyinyuesousuo,qwyyss,music', 94, 1, 0, 0, 0, 3, '', '2022-05-03 20:07:48', '2023-09-28 15:29:21'), +(62, '百度网盘秒传', '/tool/bdpan/', 'utility\\bdpan', 'baiduwangpanfenxiang,bdwpfx', 72, 1, 0, 0, 0, 3, '', '2022-05-03 20:08:20', '2023-09-28 15:32:11'), +(63, '手机归属地查询', 'mobile', 'utility\\mobile', 'shoujiguishudichaxun,sjgsdcx', 91, 1, 0, 0, 0, 3, '', '2022-05-03 20:39:06', '2022-05-04 17:26:52'), +(64, '身份证归属地查询', 'idcard', 'utility\\idcard', 'shenfenzhengguishudichaxun,sfzgsdcx', 90, 1, 0, 0, 0, 3, '', '2022-05-03 20:56:37', '2022-05-04 17:26:55'), +(65, '网页源代码查看', 'viewhtml', 'web\\viewhtml', 'wangyeyuandaimachakan,wyydmck', 99, 1, 0, 0, 0, 1, '', '2022-05-04 09:11:50', '2022-05-04 17:21:32'), +(66, '数字IP地址转换', 'ip_num', 'web\\ip_num', 'shuziipdizhizhuanhuan,szipdzzh', 93, 1, 0, 0, 0, 1, '', '2022-05-04 15:18:31', '2022-05-04 17:21:55'), +(67, 'RGB颜色对照表', 'rgb_color', 'dev\\rgb_color', 'rgbyanseduizhaobiao,rgbysdzb', 86, 1, 0, 0, 0, 2, '', '2022-05-04 16:15:31', '2022-05-04 17:25:04'), +(68, '查看HTTP请求', 'http', 'web\\http', 'chakanhttpqingqiu,ckhttpqq', 88, 1, 0, 0, 0, 1, '', '2022-05-04 16:26:15', '2022-05-04 17:22:20'), +(69, '音乐外链转换', 'https://link.hhtjim.com/', 'utility\\music_link', 'yinyuewailianzhuanhuan,yywlzh', 92, 1, 0, 0, 0, 3, '', '2022-05-04 17:11:49', '2023-09-28 15:29:24'), +(70, 'SEO综合查询', 'https://seo.chinaz.com/', 'web\\seo', 'seozonghechaxun,seozhcx', 86, 1, 0, 0, 0, 1, '', '2022-05-04 17:18:00', '2022-05-04 17:22:26'), +(71, 'PING网站测速', 'https://ping.chinaz.com/', 'web\\ping', 'pingwangzhancesu,pingwzcs', 87, 1, 0, 0, 0, 1, '', '2022-05-04 17:18:32', '2022-05-04 17:22:24'), +(72, '音乐文件解锁', 'http://unlock.music.hi.cn/', 'utility\\unlockmusic', 'yinyuewenjianjiesuo,yywjjs', 93, 1, 0, 0, 0, 3, '', '2022-05-04 17:19:40', '2023-09-28 15:29:22'), +(73, 'HTTP状态查询', 'http_status', 'web\\http_status', 'httpzhuangtaichaxun,httpztcx', 0, 1, 0, 0, 0, 1, '', '2022-05-05 18:40:33', '2022-05-05 18:40:33'), +(74, '域名DNS查询', 'dns', 'web\\dns', 'yumingdnschaxun,ymdnscx', 95, 1, 0, 0, 0, 1, '', '2022-05-07 17:12:38', '2023-09-28 15:28:10'), +(75, '提取群成员', 'group_members', 'wqq\\group_members', 'tiquqqqunchengyuan,tqqqqcy', 88, 1, 0, 0, 0, 5, '', '2022-05-17 17:41:22', '2022-05-18 15:58:54'), +(76, '批量删除群公告', 'group_announce', 'wqq\\group_announce', 'piliangshanchuqungonggao,plscqgg', 87, 1, 0, 0, 0, 5, '', '2022-05-17 18:11:49', '2022-05-18 15:58:56'), +(77, '自助解散群', 'group_dismiss', 'wqq\\group_dismiss', 'zizhujiesanqqqun,zzjsqqq', 86, 1, 0, 0, 0, 5, '', '2022-05-17 18:33:38', '2022-05-18 15:58:57'), +(78, '单向好友检测', 'friend_check', 'wqq\\friend_check', 'qqdanxianghaoyoujiance,qqdxhyjc', 97, 1, 0, 0, 0, 5, '', '2022-05-17 20:07:22', '2022-05-18 15:58:50'), +(79, 'QQ强制聊天', 'qqchat', 'wqq\\qqchat', 'qqqiangzhiliaotian,qqqzlt', 99, 1, 0, 0, 0, 5, '', '2022-05-17 23:13:21', '2022-05-18 15:58:47'), +(80, '生成加群链接', 'group_join', 'wqq\\group_join', 'shengchengjiaqunlianjie', 89, 1, 0, 0, 0, 5, '', '2022-05-18 10:32:39', '2022-05-18 15:58:52'), +(81, '设置空白昵称', 'setqqnick', 'wqq\\setqqnick', 'shezhikongbainicheng,szkbnc', 96, 1, 0, 0, 0, 5, '', '2022-05-18 11:20:50', '2022-05-18 15:58:51'), +(83, '自定义在线机型', 'online_device', 'wqq\\online_device', 'zidingyizaixianjixing,zdyzxjx', 98, 1, 0, 0, 0, 5, '', '2022-05-18 12:28:58', '2022-12-05 14:24:34'), +(84, '小米运动步数修改', 'sport', 'utility\\sport', 'xiaomiyundongbushuxiugai,xmydbsxg', 77, 1, 0, 1, 0, 3, '', '2022-05-19 20:28:23', '2023-09-28 15:39:27'), +(85, '短网址还原', 'unshorturl', 'utility\\unshorturl', 'duanwangzhihuanyuan,dwzhy', 83, 1, 0, 0, 0, 3, '', '2022-05-20 11:42:03', '2022-05-20 11:42:03'), +(86, 'B站视频解析', 'bili_video', 'utility\\bili_video', 'bzhanshipinjiexi,bzspjx', 69, 1, 0, 0, 0, 3, '', '2022-05-21 20:08:09', '2022-08-09 20:34:40'), +(87, '查B站弹幕发送者', 'bili_danmu', 'utility\\bili_danmu', 'chabzhandanmufasongzhe,cbzdmfsz', 68, 1, 0, 0, 0, 3, '', '2022-05-21 20:08:25', '2022-08-09 20:34:42'), +(91, '国庆头像生成', '/tool/gq_avatar/', 'fun\\gq_avatar', 'guoqingtouxiangshengcheng,gqtxsc', 4, 1, 0, 0, 0, 4, '', '2022-10-13 10:24:09', '2022-10-13 10:24:14'), +(92, '银行卡归属地查询', 'bankcard', 'utility\\bankcard', 'yinhangkaguishudichaxun,yhkgsdcx', 89, 1, 0, 0, 0, 3, '', '2022-10-14 16:55:08', '2022-10-21 17:35:56'), +(93, '微博图片反查', 'wbimg', 'utility\\wbimg', 'weibotupianfancha,wbtpfc', 67, 1, 0, 0, 0, 3, '', '2022-10-21 17:34:20', '2022-11-08 22:06:30'), +(94, 'QQ等级查询', 'qqlevel', 'wqq\\qqlevel', 'qqdengjichaxun,qqdjcx', 0, 0, 0, 0, 0, 5, '', '2023-04-23 18:06:05', '2023-04-23 18:06:05'), +(95, '短视频去水印解析', 'videoparse', 'utility\\videoparse', 'duanshipinqushuiyinjiexi,dspqsyjx', 95, 1, 0, 0, 0, 3, '', '2023-09-22 23:25:17', '2023-09-28 15:29:46'); + + +DROP TABLE IF EXISTS `toolbox_querycache`; +CREATE TABLE `toolbox_querycache` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `type` varchar(32) NOT NULL, + `key` varchar(128) NOT NULL, + `subkey` varchar(128) DEFAULT NULL, + `content` text, + `uptime` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `cachekey` (`key`,`type`), + KEY `cachekey2` (`subkey`,`type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + + +DROP TABLE IF EXISTS `toolbox_user`; +CREATE TABLE `toolbox_user` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `username` varchar(255) NOT NULL COMMENT '用户名', + `password` varchar(64) NOT NULL, + `stars` text DEFAULT NULL COMMENT '标星', + `avatar_url` varchar(255) NOT NULL COMMENT '头像', + `type` varchar(20) NOT NULL, + `openid` varchar(150) NOT NULL, + `enable` tinyint(1) NOT NULL DEFAULT '1', + `regip` varchar(20) DEFAULT NULL, + `loginip` varchar(20) DEFAULT NULL, + `level` int(11) NOT NULL DEFAULT '0', + `create_time` datetime NOT NULL COMMENT '创建时间', + `update_time` datetime NOT NULL COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `openid` (`openid`,`type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1000; + + +DROP TABLE IF EXISTS `toolbox_uploadlog`; +CREATE TABLE `toolbox_uploadlog` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `uid` int(11) NOT NULL DEFAULT '0', + `type` varchar(20) NOT NULL, + `source` varchar(32) NOT NULL, + `filename` varchar(300) DEFAULT NULL, + `fileurl` varchar(500) DEFAULT NULL, + `ip` varchar(20) NOT NULL, + `addtime` datetime NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/plugin/dev/base64/App.php b/plugin/dev/base64/App.php new file mode 100644 index 0000000..80ec833 --- /dev/null +++ b/plugin/dev/base64/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/dev/base64/index.html b/plugin/dev/base64/index.html new file mode 100644 index 0000000..c584734 --- /dev/null +++ b/plugin/dev/base64/index.html @@ -0,0 +1,85 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} +
+
+
+
+
+ base64编码/解码 +
+
+ +
+ +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+ +
+
+
+
+
+
+{/block} +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/plugin/dev/byte_calc/App.php b/plugin/dev/byte_calc/App.php new file mode 100644 index 0000000..80e6c9c --- /dev/null +++ b/plugin/dev/byte_calc/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/dev/byte_calc/index.html b/plugin/dev/byte_calc/index.html new file mode 100644 index 0000000..b4af448 --- /dev/null +++ b/plugin/dev/byte_calc/index.html @@ -0,0 +1,110 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ 字节计算器 +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+
+{/block} +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/plugin/dev/code_css/App.php b/plugin/dev/code_css/App.php new file mode 100644 index 0000000..520b6df --- /dev/null +++ b/plugin/dev/code_css/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/dev/code_css/index.html b/plugin/dev/code_css/index.html new file mode 100644 index 0000000..6857416 --- /dev/null +++ b/plugin/dev/code_css/index.html @@ -0,0 +1,72 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="head"} + + + + + + +{/block} +{block name="main"} +
+
+
+
+ CSS 格式化/压缩 +
+
+ +
+ +
+
+ + + + +
+
+
+{/block} +{block name="script"} + +{/block} \ No newline at end of file diff --git a/plugin/dev/code_html/App.php b/plugin/dev/code_html/App.php new file mode 100644 index 0000000..22aa51a --- /dev/null +++ b/plugin/dev/code_html/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/dev/code_html/index.html b/plugin/dev/code_html/index.html new file mode 100644 index 0000000..6ab040e --- /dev/null +++ b/plugin/dev/code_html/index.html @@ -0,0 +1,108 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="head"} + + + + + + + + + + + +{/block} +{block name="main"} +
+
+
+
+ Html 格式化/加密/压缩 +
+
+ +
+ +
+
+ + + + + +
+
+
+{/block} +{block name="script"} + +{/block} \ No newline at end of file diff --git a/plugin/dev/code_js/App.php b/plugin/dev/code_js/App.php new file mode 100644 index 0000000..f331929 --- /dev/null +++ b/plugin/dev/code_js/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/dev/code_js/index.html b/plugin/dev/code_js/index.html new file mode 100644 index 0000000..a39e9d6 --- /dev/null +++ b/plugin/dev/code_js/index.html @@ -0,0 +1,98 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="head"} + + + + + + +{/block} +{block name="main"} +
+
+
+
+ JavaScript 格式化/混淆/压缩 +
+
+ +
+ +
+
+ + + + + +
+
+
+{/block} +{block name="script"} + +{/block} \ No newline at end of file diff --git a/plugin/dev/decode/App.php b/plugin/dev/decode/App.php new file mode 100644 index 0000000..d1459ef --- /dev/null +++ b/plugin/dev/decode/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/dev/decode/index.html b/plugin/dev/decode/index.html new file mode 100644 index 0000000..4d1a07c --- /dev/null +++ b/plugin/dev/decode/index.html @@ -0,0 +1,198 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} +
+
+
+
+
+ 编码解码器 +
+
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+ +
+ +
+
+
+
+
+
+{/block} +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/plugin/dev/encrypt/App.php b/plugin/dev/encrypt/App.php new file mode 100644 index 0000000..238394b --- /dev/null +++ b/plugin/dev/encrypt/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/dev/encrypt/index.html b/plugin/dev/encrypt/index.html new file mode 100644 index 0000000..16025d2 --- /dev/null +++ b/plugin/dev/encrypt/index.html @@ -0,0 +1,109 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} +
+
+
+
+
+ 对称加密解密 +
+
+ +
+ +
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+ +
+ +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+ +
+
+
+
+
+
+{/block} +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/plugin/dev/github/App.php b/plugin/dev/github/App.php new file mode 100644 index 0000000..b686c6f --- /dev/null +++ b/plugin/dev/github/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/dev/github/index.html b/plugin/dev/github/index.html new file mode 100644 index 0000000..489ef75 --- /dev/null +++ b/plugin/dev/github/index.html @@ -0,0 +1,142 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} +
+
+
+
+
+ GitHub下载加速 +
+
有些节点不支持某些文件的下载,切换节点即可解决
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+{/block} +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/plugin/dev/hex_convert/App.php b/plugin/dev/hex_convert/App.php new file mode 100644 index 0000000..a85ce67 --- /dev/null +++ b/plugin/dev/hex_convert/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/dev/hex_convert/index.html b/plugin/dev/hex_convert/index.html new file mode 100644 index 0000000..75aee70 --- /dev/null +++ b/plugin/dev/hex_convert/index.html @@ -0,0 +1,169 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ 在线进制转换 +
+
+
+
+
+
+
+
+
+ +
+
+
+
转换数字
+
+
+
+
+
+
+
+
+
+ +
+
+
+
转换结果
+
+
+
+
+
+
+ 说明 +
+ 支持在2~36进制之间进行任意转换,支持浮点型 +
+
+
+
+{/block} +{block name="script"} + +{/block} \ No newline at end of file diff --git a/plugin/dev/json/App.php b/plugin/dev/json/App.php new file mode 100644 index 0000000..01fcca0 --- /dev/null +++ b/plugin/dev/json/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/dev/json/index.html b/plugin/dev/json/index.html new file mode 100644 index 0000000..27f0644 --- /dev/null +++ b/plugin/dev/json/index.html @@ -0,0 +1,73 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="head"} + + + +{/block} +{block name="main"} +
+
+
+
+ JSON解析格式化 +
+
+
+
+
+
+
+
+{/block} +{block name="script"} + +{/block} \ No newline at end of file diff --git a/plugin/dev/linux_command/App.php b/plugin/dev/linux_command/App.php new file mode 100644 index 0000000..d4df6a0 --- /dev/null +++ b/plugin/dev/linux_command/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/dev/linux_command/index.html b/plugin/dev/linux_command/index.html new file mode 100644 index 0000000..463e90a --- /dev/null +++ b/plugin/dev/linux_command/index.html @@ -0,0 +1,123 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + + +
+
+
+
+
+ Linux命令查询 +
+
+ +
+ +
+
+
+
搜索结果(点击查看详情)
+ + + + + + + + + + + + + +
CommandDescription
{{commands[item].n}}{{commands[item].d}}
+
+
+
+
+
+{/block} +{block name="script"} + + + + +{/block} \ No newline at end of file diff --git a/plugin/dev/markdown/App.php b/plugin/dev/markdown/App.php new file mode 100644 index 0000000..f8e2f0b --- /dev/null +++ b/plugin/dev/markdown/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/dev/markdown/index.html b/plugin/dev/markdown/index.html new file mode 100644 index 0000000..6bc1696 --- /dev/null +++ b/plugin/dev/markdown/index.html @@ -0,0 +1,48 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ Markdown在线编辑 +
+
+
+
+
+
+
+{/block} +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/plugin/dev/mime_type/App.php b/plugin/dev/mime_type/App.php new file mode 100644 index 0000000..a3dbaee --- /dev/null +++ b/plugin/dev/mime_type/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/dev/mime_type/index.html b/plugin/dev/mime_type/index.html new file mode 100644 index 0000000..732bcb4 --- /dev/null +++ b/plugin/dev/mime_type/index.html @@ -0,0 +1,2629 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} +
+
+
+
+
+ MimeType类型速查 +
+
请使用 Ctrl+F 查找所需信息。 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
后缀Content-Type(Mime-Type)
.3dmx-world/x-3dmf
.3dmfx-world/x-3dmf
.aapplication/octet-stream
.aabapplication/x-authorware-bin
.aamapplication/x-authorware-map
.aasapplication/x-authorware-seg
.abctext/vnd.abc
.acgitext/html
.aflvideo/animaflex
.aiapplication/postscript
.aifaudio/aiff
.aifaudio/x-aiff
.aifcaudio/aiff
.aifcaudio/x-aiff
.aiffaudio/aiff
.aiffaudio/x-aiff
.aimapplication/x-aim
.aiptext/x-audiosoft-intra
.aniapplication/x-navi-animation
.aosapplication/x-nokia-9000-communicator-add-on-software
.apsapplication/mime
.arcapplication/octet-stream
.arjapplication/arj
.arjapplication/octet-stream
.artimage/x-jg
.asfvideo/x-ms-asf
.asmtext/x-asm
.asptext/asp
.asxapplication/x-mplayer2
.asxvideo/x-ms-asf
.asxvideo/x-ms-asf-plugin
.auaudio/basic
.auaudio/x-au
.aviapplication/x-troff-msvideo
.avivideo/avi
.avivideo/msvideo
.avivideo/x-msvideo
.avsvideo/avs-video
.bcpioapplication/x-bcpio
.binapplication/mac-binary
.binapplication/macbinary
.binapplication/octet-stream
.binapplication/x-binary
.binapplication/x-macbinary
.bmimage/bmp
.bmpimage/bmp
.bmpimage/x-windows-bmp
.booapplication/book
.bookapplication/book
.bozapplication/x-bzip2
.bshapplication/x-bsh
.bzapplication/x-bzip
.bz2application/x-bzip2
.ctext/plain
.ctext/x-c
.c++text/plain
.catapplication/vnd.ms-pki.seccat
.cctext/plain
.cctext/x-c
.ccadapplication/clariscad
.ccoapplication/x-cocoa
.cdfapplication/cdf
.cdfapplication/x-cdf
.cdfapplication/x-netcdf
.cerapplication/pkix-cert
.cerapplication/x-x509-ca-cert
.chaapplication/x-chat
.chatapplication/x-chat
.classapplication/java
.classapplication/java-byte-code
.classapplication/x-java-class
.comapplication/octet-stream
.comtext/plain
.conftext/plain
.cpioapplication/x-cpio
.cpptext/x-c
.cptapplication/mac-compactpro
.cptapplication/x-compactpro
.cptapplication/x-cpt
.crlapplication/pkcs-crl
.crlapplication/pkix-crl
.crtapplication/pkix-cert
.crtapplication/x-x509-ca-cert
.crtapplication/x-x509-user-cert
.cshapplication/x-csh
.cshtext/x-script.csh
.cssapplication/x-pointplus
.csstext/css
.cxxtext/plain
.dcrapplication/x-director
.deepvapplication/x-deepv
.deftext/plain
.derapplication/x-x509-ca-cert
.difvideo/x-dv
.dirapplication/x-director
.dlvideo/dl
.dlvideo/x-dl
.docapplication/msword
.dotapplication/msword
.dpapplication/commonground
.drwapplication/drafting
.dumpapplication/octet-stream
.dvvideo/x-dv
.dviapplication/x-dvi
.dwfdrawing/x-dwf (old)
.dwfmodel/vnd.dwf
.dwgapplication/acad
.dwgimage/vnd.dwg
.dwgimage/x-dwg
.dxfapplication/dxf
.dxfimage/vnd.dwg
.dxfimage/x-dwg
.dxrapplication/x-director
.eltext/x-script.elisp
.elcapplication/x-bytecode.elisp (compiled elisp)
.elcapplication/x-elc
.envapplication/x-envoy
.epsapplication/postscript
.esapplication/x-esrehber
.etxtext/x-setext
.evyapplication/envoy
.evyapplication/x-envoy
.exeapplication/octet-stream
.ftext/plain
.ftext/x-fortran
.f77text/x-fortran
.f90text/plain
.f90text/x-fortran
.fdfapplication/vnd.fdf
.fifapplication/fractals
.fifimage/fif
.flivideo/fli
.flivideo/x-fli
.floimage/florian
.flxtext/vnd.fmi.flexstor
.fmfvideo/x-atomic3d-feature
.fortext/plain
.fortext/x-fortran
.fpximage/vnd.fpx
.fpximage/vnd.net-fpx
.frlapplication/freeloader
.funkaudio/make
.gtext/plain
.g3image/g3fax
.gifimage/gif
.glvideo/gl
.glvideo/x-gl
.gsdaudio/x-gsm
.gsmaudio/x-gsm
.gspapplication/x-gsp
.gssapplication/x-gss
.gtarapplication/x-gtar
.gzapplication/x-compressed
.gzapplication/x-gzip
.gzipapplication/x-gzip
.gzipmultipart/x-gzip
.htext/plain
.htext/x-h
.hdfapplication/x-hdf
.helpapplication/x-helpfile
.hglapplication/vnd.hp-hpgl
.hhtext/plain
.hhtext/x-h
.hlbtext/x-script
.hlpapplication/hlp
.hlpapplication/x-helpfile
.hlpapplication/x-winhelp
.hpgapplication/vnd.hp-hpgl
.hpglapplication/vnd.hp-hpgl
.hqxapplication/binhex
.hqxapplication/binhex4
.hqxapplication/mac-binhex
.hqxapplication/mac-binhex40
.hqxapplication/x-binhex40
.hqxapplication/x-mac-binhex40
.htaapplication/hta
.htctext/x-component
.htmtext/html
.htmltext/html
.htmlstext/html
.htttext/webviewhtml
.htxtext/html
.icex-conference/x-cooltalk
.icoimage/x-icon
.idctext/plain
.iefimage/ief
.iefsimage/ief
.igesapplication/iges
.igesmodel/iges
.igsapplication/iges
.igsmodel/iges
.imaapplication/x-ima
.imapapplication/x-httpd-imap
.infapplication/inf
.insapplication/x-internett-signup
.ipapplication/x-ip2
.isuvideo/x-isvideo
.itaudio/it
.ivapplication/x-inventor
.ivri-world/i-vrml
.ivyapplication/x-livescreen
.jamaudio/x-jam
.javtext/plain
.javtext/x-java-source
.javatext/plain
.javatext/x-java-source
.jcmapplication/x-java-commerce
.jfifimage/jpeg
.jfifimage/pjpeg
.jfif-tbnlimage/jpeg
.jpeimage/jpeg
.jpeimage/pjpeg
.jpegimage/jpeg
.jpegimage/pjpeg
.jpgimage/jpeg
.jpgimage/pjpeg
.jpsimage/x-jps
.jsapplication/x-javascript
.jsapplication/javascript
.jsapplication/ecmascript
.jstext/javascript
.jstext/ecmascript
.jutimage/jutvision
.karaudio/midi
.karmusic/x-karaoke
.kshapplication/x-ksh
.kshtext/x-script.ksh
.laaudio/nspaudio
.laaudio/x-nspaudio
.lamaudio/x-liveaudio
.latexapplication/x-latex
.lhaapplication/lha
.lhaapplication/octet-stream
.lhaapplication/x-lha
.lhxapplication/octet-stream
.listtext/plain
.lmaaudio/nspaudio
.lmaaudio/x-nspaudio
.logtext/plain
.lspapplication/x-lisp
.lsptext/x-script.lisp
.lsttext/plain
.lsxtext/x-la-asf
.ltxapplication/x-latex
.lzhapplication/octet-stream
.lzhapplication/x-lzh
.lzxapplication/lzx
.lzxapplication/octet-stream
.lzxapplication/x-lzx
.mtext/plain
.mtext/x-m
.m1vvideo/mpeg
.m2aaudio/mpeg
.m2vvideo/mpeg
.m3uaudio/x-mpequrl
.manapplication/x-troff-man
.mapapplication/x-navimap
.martext/plain
.mbdapplication/mbedlet
.mc$application/x-magic-cap-package-1.0
.mcdapplication/mcad
.mcdapplication/x-mathcad
.mcfimage/vasa
.mcftext/mcf
.mcpapplication/netmc
.meapplication/x-troff-me
.mhtmessage/rfc822
.mhtmlmessage/rfc822
.midapplication/x-midi
.midaudio/midi
.midaudio/x-mid
.midaudio/x-midi
.midmusic/crescendo
.midx-music/x-midi
.midiapplication/x-midi
.midiaudio/midi
.midiaudio/x-mid
.midiaudio/x-midi
.midimusic/crescendo
.midix-music/x-midi
.mifapplication/x-frame
.mifapplication/x-mif
.mimemessage/rfc822
.mimewww/mime
.mjfaudio/x-vnd.audioexplosion.mjuicemediafile
.mjpgvideo/x-motion-jpeg
.mmapplication/base64
.mmapplication/x-meme
.mmeapplication/base64
.modaudio/mod
.modaudio/x-mod
.moovvideo/quicktime
.movvideo/quicktime
.movievideo/x-sgi-movie
.mp2audio/mpeg
.mp2audio/x-mpeg
.mp2video/mpeg
.mp2video/x-mpeg
.mp2video/x-mpeq2a
.mp3audio/mpeg3
.mp3audio/x-mpeg-3
.mp3video/mpeg
.mp3video/x-mpeg
.mpaaudio/mpeg
.mpavideo/mpeg
.mpcapplication/x-project
.mpevideo/mpeg
.mpegvideo/mpeg
.mpgaudio/mpeg
.mpgvideo/mpeg
.mpgaaudio/mpeg
.mppapplication/vnd.ms-project
.mptapplication/x-project
.mpvapplication/x-project
.mpxapplication/x-project
.mrcapplication/marc
.msapplication/x-troff-ms
.mvvideo/x-sgi-movie
.myaudio/make
.mzzapplication/x-vnd.audioexplosion.mzz
.napimage/naplps
.naplpsimage/naplps
.ncapplication/x-netcdf
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
后缀Content-Type(Mime-Type)
.ncmapplication/vnd.nokia.configuration-message
.nifimage/x-niff
.niffimage/x-niff
.nixapplication/x-mix-transfer
.nscapplication/x-conference
.nvdapplication/x-navidoc
.oapplication/octet-stream
.odaapplication/oda
.omcapplication/x-omc
.omcdapplication/x-omcdatamaker
.omcrapplication/x-omcregerator
.ptext/x-pascal
.p10application/pkcs10
.p10application/x-pkcs10
.p12application/pkcs-12
.p12application/x-pkcs12
.p7aapplication/x-pkcs7-signature
.p7capplication/pkcs7-mime
.p7capplication/x-pkcs7-mime
.p7mapplication/pkcs7-mime
.p7mapplication/x-pkcs7-mime
.p7rapplication/x-pkcs7-certreqresp
.p7sapplication/pkcs7-signature
.partapplication/pro_eng
.pastext/pascal
.pbmimage/x-portable-bitmap
.pclapplication/vnd.hp-pcl
.pclapplication/x-pcl
.pctimage/x-pict
.pcximage/x-pcx
.pdbchemical/x-pdb
.pdfapplication/pdf
.pfunkaudio/make
.pfunkaudio/make.my.funk
.pgmimage/x-portable-graymap
.pgmimage/x-portable-greymap
.picimage/pict
.pictimage/pict
.pkgapplication/x-newton-compatible-pkg
.pkoapplication/vnd.ms-pki.pko
.pltext/plain
.pltext/x-script.perl
.plxapplication/x-pixclscript
.pmimage/x-xpixmap
.pmtext/x-script.perl-module
.pm4application/x-pagemaker
.pm5application/x-pagemaker
.pngimage/png
.pnmapplication/x-portable-anymap
.pnmimage/x-portable-anymap
.potapplication/mspowerpoint
.potapplication/vnd.ms-powerpoint
.povmodel/x-pov
.ppaapplication/vnd.ms-powerpoint
.ppmimage/x-portable-pixmap
.ppsapplication/mspowerpoint
.ppsapplication/vnd.ms-powerpoint
.pptapplication/mspowerpoint
.pptapplication/powerpoint
.pptapplication/vnd.ms-powerpoint
.pptapplication/x-mspowerpoint
.ppzapplication/mspowerpoint
.preapplication/x-freelance
.prtapplication/pro_eng
.psapplication/postscript
.psdapplication/octet-stream
.pvupaleovu/x-pv
.pwzapplication/vnd.ms-powerpoint
.pytext/x-script.phyton
.pycapplication/x-bytecode.python
.qcpaudio/vnd.qcelp
.qd3x-world/x-3dmf
.qd3dx-world/x-3dmf
.qifimage/x-quicktime
.qtvideo/quicktime
.qtcvideo/x-qtc
.qtiimage/x-quicktime
.qtifimage/x-quicktime
.raaudio/x-pn-realaudio
.raaudio/x-pn-realaudio-plugin
.raaudio/x-realaudio
.ramaudio/x-pn-realaudio
.rasapplication/x-cmu-raster
.rasimage/cmu-raster
.rasimage/x-cmu-raster
.rastimage/cmu-raster
.rexxtext/x-script.rexx
.rfimage/vnd.rn-realflash
.rgbimage/x-rgb
.rmapplication/vnd.rn-realmedia
.rmaudio/x-pn-realaudio
.rmiaudio/mid
.rmmaudio/x-pn-realaudio
.rmpaudio/x-pn-realaudio
.rmpaudio/x-pn-realaudio-plugin
.rngapplication/ringing-tones
.rngapplication/vnd.nokia.ringing-tone
.rnxapplication/vnd.rn-realplayer
.roffapplication/x-troff
.rpimage/vnd.rn-realpix
.rpmaudio/x-pn-realaudio-plugin
.rttext/richtext
.rttext/vnd.rn-realtext
.rtfapplication/rtf
.rtfapplication/x-rtf
.rtftext/richtext
.rtxapplication/rtf
.rtxtext/richtext
.rvvideo/vnd.rn-realvideo
.stext/x-asm
.s3maudio/s3m
.savemeapplication/octet-stream
.sbkapplication/x-tbook
.scmapplication/x-lotusscreencam
.scmtext/x-script.guile
.scmtext/x-script.scheme
.scmvideo/x-scm
.sdmltext/plain
.sdpapplication/sdp
.sdpapplication/x-sdp
.sdrapplication/sounder
.seaapplication/sea
.seaapplication/x-sea
.setapplication/set
.sgmtext/sgml
.sgmtext/x-sgml
.sgmltext/sgml
.sgmltext/x-sgml
.shapplication/x-bsh
.shapplication/x-sh
.shapplication/x-shar
.shtext/x-script.sh
.sharapplication/x-bsh
.sharapplication/x-shar
.shtmltext/html
.shtmltext/x-server-parsed-html
.sidaudio/x-psid
.sitapplication/x-sit
.sitapplication/x-stuffit
.skdapplication/x-koan
.skmapplication/x-koan
.skpapplication/x-koan
.sktapplication/x-koan
.slapplication/x-seelogo
.smiapplication/smil
.smilapplication/smil
.sndaudio/basic
.sndaudio/x-adpcm
.solapplication/solids
.spcapplication/x-pkcs7-certificates
.spctext/x-speech
.splapplication/futuresplash
.sprapplication/x-sprite
.spriteapplication/x-sprite
.srcapplication/x-wais-source
.ssitext/x-server-parsed-html
.ssmapplication/streamingmedia
.sstapplication/vnd.ms-pki.certstore
.stepapplication/step
.stlapplication/sla
.stlapplication/vnd.ms-pki.stl
.stlapplication/x-navistyle
.stpapplication/step
.sv4cpioapplication/x-sv4cpio
.sv4crcapplication/x-sv4crc
.svfimage/vnd.dwg
.svfimage/x-dwg
.svrapplication/x-world
.svrx-world/x-svr
.swfapplication/x-shockwave-flash
.tapplication/x-troff
.talktext/x-speech
.tarapplication/x-tar
.tbkapplication/toolbook
.tbkapplication/x-tbook
.tclapplication/x-tcl
.tcltext/x-script.tcl
.tcshtext/x-script.tcsh
.texapplication/x-tex
.texiapplication/x-texinfo
.texinfoapplication/x-texinfo
.textapplication/plain
.texttext/plain
.tgzapplication/gnutar
.tgzapplication/x-compressed
.tifimage/tiff
.tifimage/x-tiff
.tiffimage/tiff
.tiffimage/x-tiff
.trapplication/x-troff
.tsiaudio/tsp-audio
.tspapplication/dsptype
.tspaudio/tsplayer
.tsvtext/tab-separated-values
.turbotimage/florian
.txttext/plain
.uiltext/x-uil
.unitext/uri-list
.unistext/uri-list
.unvapplication/i-deas
.uritext/uri-list
.uristext/uri-list
.ustarapplication/x-ustar
.ustarmultipart/x-ustar
.uuapplication/octet-stream
.uutext/x-uuencode
.uuetext/x-uuencode
.vcdapplication/x-cdlink
.vcstext/x-vcalendar
.vdaapplication/vda
.vdovideo/vdo
.vewapplication/groupwise
.vivvideo/vivo
.vivvideo/vnd.vivo
.vivovideo/vivo
.vivovideo/vnd.vivo
.vmdapplication/vocaltec-media-desc
.vmfapplication/vocaltec-media-file
.vocaudio/voc
.vocaudio/x-voc
.vosvideo/vosaic
.voxaudio/voxware
.vqeaudio/x-twinvq-plugin
.vqfaudio/x-twinvq
.vqlaudio/x-twinvq-plugin
.vrmlapplication/x-vrml
.vrmlmodel/vrml
.vrmlx-world/x-vrml
.vrtx-world/x-vrt
.vsdapplication/x-visio
.vstapplication/x-visio
.vswapplication/x-visio
.w60application/wordperfect6.0
.w61application/wordperfect6.1
.w6wapplication/msword
.wavaudio/wav
.wavaudio/x-wav
.wb1application/x-qpro
.wbmpimage/vnd.wap.wbmp
.webapplication/vnd.xara
.wizapplication/msword
.wk1application/x-123
.wmfwindows/metafile
.wmltext/vnd.wap.wml
.wmlcapplication/vnd.wap.wmlc
.wmlstext/vnd.wap.wmlscript
.wmlscapplication/vnd.wap.wmlscriptc
.wordapplication/msword
.wpapplication/wordperfect
.wp5application/wordperfect
.wp5application/wordperfect6.0
.wp6application/wordperfect
.wpdapplication/wordperfect
.wpdapplication/x-wpwin
.wq1application/x-lotus
.wriapplication/mswrite
.wriapplication/x-wri
.wrlapplication/x-world
.wrlmodel/vrml
.wrlx-world/x-vrml
.wrzmodel/vrml
.wrzx-world/x-vrml
.wsctext/scriplet
.wsrcapplication/x-wais-source
.wtkapplication/x-wintalk
.xbmimage/x-xbitmap
.xbmimage/x-xbm
.xbmimage/xbm
.xdrvideo/x-amt-demorun
.xgzxgl/drawing
.xifimage/vnd.xiff
.xlapplication/excel
.xlaapplication/excel
.xlaapplication/x-excel
.xlaapplication/x-msexcel
.xlbapplication/excel
.xlbapplication/vnd.ms-excel
.xlbapplication/x-excel
.xlcapplication/excel
.xlcapplication/vnd.ms-excel
.xlcapplication/x-excel
.xldapplication/excel
.xldapplication/x-excel
.xlkapplication/excel
.xlkapplication/x-excel
.xllapplication/excel
.xllapplication/vnd.ms-excel
.xllapplication/x-excel
.xlmapplication/excel
.xlmapplication/vnd.ms-excel
.xlmapplication/x-excel
.xlsapplication/excel
.xlsapplication/vnd.ms-excel
.xlsapplication/x-excel
.xlsapplication/x-msexcel
.xltapplication/excel
.xltapplication/x-excel
.xlvapplication/excel
.xlvapplication/x-excel
.xlwapplication/excel
.xlwapplication/vnd.ms-excel
.xlwapplication/x-excel
.xlwapplication/x-msexcel
.xmaudio/xm
.xmlapplication/xml
.xmltext/xml
.xmzxgl/movie
.xpixapplication/x-vnd.ls-xpix
.xpmimage/x-xpixmap
.xpmimage/xpm
.x-pngimage/png
.xsrvideo/x-amt-showrun
.xwdimage/x-xwd
.xwdimage/x-xwindowdump
.xyzchemical/x-pdb
.zapplication/x-compress
.zapplication/x-compressed
.zipapplication/x-compressed
.zipapplication/x-zip-compressed
.zipapplication/zip
.zipmultipart/x-zip
.zooapplication/octet-stream
.zshtext/x-script.zsh
+
+
+
+
+
+
+{/block} +{block name="script"} +{/block} \ No newline at end of file diff --git a/plugin/dev/rgb_color/App.php b/plugin/dev/rgb_color/App.php new file mode 100644 index 0000000..858d946 --- /dev/null +++ b/plugin/dev/rgb_color/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/dev/rgb_color/index.html b/plugin/dev/rgb_color/index.html new file mode 100644 index 0000000..97a4c59 --- /dev/null +++ b/plugin/dev/rgb_color/index.html @@ -0,0 +1,2318 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} +
+
+
+
+
+ RGB颜色对照表 +
+
快速查找颜色请按 Ctrl+F +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
实色效果英文名称 R.G.B 16色
 Snow 255 250 250 #FFFAFA
 GhostWhite248 248 255 #F8F8FF
 WhiteSmoke245 245 245 #F5F5F5
 Gainsboro220 220 220#DCDCDC
 FloralWhite255 250 240 #FFFAF0
 OldLace253 245 230 #FDF5E6
 Linen250 240 230 #FAF0E6
 AntiqueWhite250 235 215 #FAEBD7
 PapayaWhip255 239 213 #FFEFD5
 BlanchedAlmond255 235 205 #FFEBCD
 Bisque255 228 196 #FFE4C4
 PeachPuff255 218 185 #FFDAB9
 NavajoWhite255 222 173 #FFDEAD
 Moccasin255 228 181 #FFE4B5
 Cornsilk255 248 220 #FFF8DC
 Ivory255 255 240 #FFFFF0
 LemonChiffon255 250 205 #FFFACD
 Seashell255 245 238 #FFF5EE
 Honeydew240 255 240 #F0FFF0
 MintCream245 255 250 #F5FFFA
 Azure240 255 255 #F0FFFF
 AliceBlue240 248 255 #F0F8FF
 lavender230 230 250 #E6E6FA
 LavenderBlush255 240 245 #FFF0F5
 MistyRose255 228 225 #FFE4E1
 White255 255 255 #FFFFFF
 Black0 0 0 #000000
 DarkSlateGray47 79 79 #2F4F4F
 DimGrey105 105 105 #696969
 SlateGrey112 128 144 #708090
 LightSlateGray119 136 153 #778899
 Grey190 190 190 #BEBEBE
 LightGray211 211 211 #D3D3D3
 MidnightBlue25 25 112 #191970
 NavyBlue0 0 128 #000080
 CornflowerBlue100 149 237 #6495ED
 DarkSlateBlue72 61 139 #483D8B
 SlateBlue106 90 205 #6A5ACD
 MediumSlateBlue123 104 238 #7B68EE
 LightSlateBlue132 112 255 #8470FF
 MediumBlue0 0 205 #0000CD
 RoyalBlue65 105 225 #4169E1
 Blue 0 0 255 #0000FF
 DodgerBlue30 144 255 #1E90FF
 DeepSkyBlue0 191 255 #00BFFF
 SkyBlue135 206 235 #87CEEB
 LightSkyBlue135 206 250 #87CEFA
 SteelBlue70 130 180 #4682B4
 LightSteelBlue176 196 222 #B0C4DE
 LightBlue173 216 230 #ADD8E6
 PowderBlue176 224 230 #B0E0E6
 PaleTurquoise175 238 238 #AFEEEE
 DarkTurquoise0 206 209 #00CED1
 MediumTurquoise72 209 204 #48D1CC
 Turquoise64 224 208 #40E0D0
 Cyan 0 255 255 #00FFFF
 LightCyan224 255 255 #E0FFFF
 CadetBlue95 158 160 #5F9EA0
 MediumAquamarine102 205 170 #66CDAA
 Aquamarine127 255 212 #7FFFD4
 DarkGreen0 100 0 #006400
 DarkOliveGreen85 107 47 #556B2F
 DarkSeaGreen143 188 143 #8FBC8F
 SeaGreen46 139 87 #2E8B57
 MediumSeaGreen60 179 113 #3CB371
 LightSeaGreen32 178 170 #20B2AA
 PaleGreen152 251 152 #98FB98
 SpringGreen0 255 127 #00FF7F
 LawnGreen124 252 0 #7CFC00
 Green0 255 0 #00FF00
 Chartreuse127 255 0 #7FFF00
 MedSpringGreen0 250 154 #00FA9A
 GreenYellow173 255 47 #ADFF2F
 LimeGreen50 205 50 #32CD32
 YellowGreen154 205 50 #9ACD32
 ForestGreen34 139 34 #228B22
 OliveDrab107 142 35 #6B8E23
 DarkKhaki189 183 107 #BDB76B
 PaleGoldenrod238 232 170 #EEE8AA
 LtGoldenrodYello250 250 210 #FAFAD2
 LightYellow255 255 224 #FFFFE0
 Yellow255 255 0 #FFFF00
 Gold 255 215 0 #FFD700
 LightGoldenrod238 221 130 #EEDD82
 goldenrod218 165 32 #DAA520
 DarkGoldenrod184 134 11 #B8860B
 RosyBrown188 143 143 #BC8F8F
 IndianRed205 92 92 #CD5C5C
 SaddleBrown139 69 19 #8B4513
 Sienna160 82 45 #A0522D
 Peru 205 133 63 #CD853F
 Burlywood222 184 135 #DEB887
 Beige245 245 220 #F5F5DC
 Wheat245 222 179 #F5DEB3
 SandyBrown244 164 96 #F4A460
 Tan 210 180 140 #D2B48C
 Chocolate210 105 30 #D2691E
 Firebrick178 34 34 #B22222
 Brown165 42 42 #A52A2A
 DarkSalmon233 150 122 #E9967A
 Salmon250 128 114 #FA8072
 LightSalmon255 160 122 #FFA07A
 Orange255 165 0 #FFA500
 DarkOrange255 140 0 #FF8C00
 Coral255 127 80 #FF7F50
 LightCoral240 128 128 #F08080
 Tomato255 99 71 #FF6347
 OrangeRed255 69 0 #FF4500
 Red 255 0 0 #FF0000
 HotPink255 105 180 #FF69B4
 DeepPink255 20 147 #FF1493
 Pink 255 192 203 #FFC0CB
 LightPink255 182 193 #FFB6C1
 PaleVioletRed219 112 147 #DB7093
 Maroon176 48 96 #B03060
 MediumVioletRed199 21 133 #C71585
 VioletRed208 32 144 #D02090
 Magenta255 0 255 #FF00FF
 Violet238 130 238 #EE82EE
 Plum 221 160 221 #DDA0DD
 Orchid218 112 214 #DA70D6
 MediumOrchid186 85 211 #BA55D3
 DarkOrchid153 50 204 #9932CC
 DarkViolet148 0 211 #9400D3
 BlueViolet138 43 226 #8A2BE2
 Purple160 32 240 #A020F0
 MediumPurple147 112 219 #9370DB
 Thistle216 191 216 #D8BFD8
 Snow1255 250 250 #FFFAFA
 Snow2238 233 233 #EEE9E9
 Snow3205 201 201 #CDC9C9
 Snow4139 137 137 #8B8989
 Seashell1255 245 238 #FFF5EE
 Seashell2238 229 222 #EEE5DE
 Seashell3205 197 191 #CDC5BF
 Seashell4139 134 130 #8B8682
 AntiqueWhite1255 239 219 #FFEFDB
 AntiqueWhite2238 223 204 #EEDFCC
 AntiqueWhite3205 192 176 #CDC0B0
 AntiqueWhite4139 131 120 #8B8378
 Bisque1255 228 196 #FFE4C4
 Bisque2238 213 183 #EED5B7
 Bisque3205 183 158 #CDB79E
 Bisque4139 125 107 #8B7D6B
 PeachPuff1255 218 185 #FFDAB9
 PeachPuff2238 203 173 #EECBAD
 PeachPuff3205 175 149 #CDAF95
 PeachPuff4139 119 101 #8B7765
 NavajoWhite1255 222 173 #FFDEAD
 NavajoWhite2238 207 161 #EECFA1
 NavajoWhite3205 179 139 #CDB38B
 NavajoWhite4139 121 94 #8B795E
 LemonChiffon1255 250 205 #FFFACD
 LemonChiffon2238 233 191 #EEE9BF
 LemonChiffon3205 201 165 #CDC9A5
 LemonChiffon4139 137 112 #8B8970
 Cornsilk1255 248 220 #FFF8DC
 Cornsilk2238 232 205 #EEE8CD
 Cornsilk3205 200 177 #CDC8B1
 Cornsilk4139 136 120 #8B8878
 Ivory1255 255 240 #FFFFF0
 Ivory2238 238 224 #EEEEE0
 Ivory3205 205 193 #CDCDC1
 Ivory4139 139 131 #8B8B83
 Honeydew1240 255 240 #F0FFF0
 Honeydew2224 238 224 #E0EEE0
 Honeydew3193 205 193 #C1CDC1
 Honeydew4131 139 131 #838B83
 LavenderBlush1255 240 245 #FFF0F5
 LavenderBlush2238 224 229 #EEE0E5
 LavenderBlush3205 193 197 #CDC1C5
 LavenderBlush4139 131 134 #8B8386
 MistyRose1255 228 225 #FFE4E1
 MistyRose2238 213 210 #EED5D2
 MistyRose3205 183 181 #CDB7B5
 MistyRose4139 125 123 #8B7D7B
 Azure1240 255 255 #F0FFFF
 Azure2224 238 238 #E0EEEE
 Azure3193 205 205 #C1CDCD
 Azure4131 139 139 #838B8B
 SlateBlue1131 111 255 #836FFF
 SlateBlue2122 103 238 #7A67EE
 SlateBlue3105 89 205 #6959CD
 SlateBlue471 60 139 #473C8B
 RoyalBlue172 118 255 #4876FF
 RoyalBlue267 110 238 #436EEE
 RoyalBlue358 95 205 #3A5FCD
 RoyalBlue439 64 139 #27408B
 Blue10 0 255 #0000FF
 Blue20 0 238 #0000EE
 Blue30 0 205 #0000CD
 Blue40 0 139 #00008B
 DodgerBlue130 144 255 #1E90FF
 DodgerBlue228 134 238 #1C86EE
 DodgerBlue324 116 205 #1874CD
 DodgerBlue416 78 139 #104E8B
 SteelBlue199 184 255 #63B8FF
 SteelBlue292 172 238 #5CACEE
 SteelBlue379 148 205 #4F94CD
 SteelBlue454 100 139 #36648B
 DeepSkyBlue10 191 255 #00BFFF
 DeepSkyBlue20 178 238 #00B2EE
 DeepSkyBlue30 154 205 #009ACD
 DeepSkyBlue40 104 139 #00688B
 SkyBlue1135 206 255 #87CEFF
 SkyBlue2126 192 238 #7EC0EE
 SkyBlue3108 166 205 #6CA6CD
 SkyBlue474 112 139 #4A708B
 LightSkyBlue1176 226 255 #B0E2FF
 LightSkyBlue2164 211 238 #A4D3EE
 LightSkyBlue3141 182 205 #8DB6CD
 LightSkyBlue496 123 139 #607B8B
 SlateGray1198 226 255 #C6E2FF
 SlateGray2185 211 238 #B9D3EE
 SlateGray3159 182 205 #9FB6CD
 SlateGray4108 123 139 #6C7B8B
 LightSteelBlue1202 225 255 #CAE1FF
 LightSteelBlue2188 210 238 #BCD2EE
 LightSteelBlue3162 181 205 #A2B5CD
 LightSteelBlue4110 123 139 #6E7B8B
 LightBlue1191 239 255 #BFEFFF
 LightBlue2178 223 238 #B2DFEE
 LightBlue3154 192 205 #9AC0CD
 LightBlue4104 131 139 #68838B
 LightCyan1224 255 255 #E0FFFF
 LightCyan2209 238 238 #D1EEEE
 LightCyan3180 205 205 #B4CDCD
 LightCyan4122 139 139 #7A8B8B
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
实色效果英文名称 R.G.B 16色
 PaleTurquoise1187 255 255 #BBFFFF
 PaleTurquoise2174 238 238 #AEEEEE
 PaleTurquoise3150 205 205 #96CDCD
 PaleTurquoise4102 139 139 #668B8B
 CadetBlue1152 245 255 #98F5FF
 CadetBlue2142 229 238 #8EE5EE
 CadetBlue3122 197 205 #7AC5CD
 CadetBlue483 134 139 #53868B
 Turquoise10 245 255 #00F5FF
 Turquoise20 229 238 #00E5EE
 Turquoise30 197 205 #00C5CD
 Turquoise40 134 139 #00868B
 Cyan10 255 255 #00FFFF
 Cyan20 238 238 #00EEEE
 Cyan30 205 205 #00CDCD
 Cyan40 139 139 #008B8B
 DarkSlateGray1151 255 255 #97FFFF
 DarkSlateGray2141 238 238 #8DEEEE
 DarkSlateGray3121 205 205 #79CDCD
 DarkSlateGray482 139 139 #528B8B
 Aquamarine1127 255 212 #7FFFD4
 Aquamarine2118 238 198 #76EEC6
 Aquamarine3102 205 170 #66CDAA
 Aquamarine469 139 116 #458B74
 DarkSeaGreen1193 255 193 #C1FFC1
 DarkSeaGreen2180 238 180 #B4EEB4
 DarkSeaGreen3155 205 155 #9BCD9B
 DarkSeaGreen4105 139 105 #698B69
 SeaGreen184 255 159 #54FF9F
 SeaGreen278 238 148 #4EEE94
 SeaGreen367 205 128 #43CD80
 SeaGreen446 139 87 #2E8B57
 PaleGreen1154 255 154 #9AFF9A
 PaleGreen2144 238 144 #90EE90
 PaleGreen3124 205 124 #7CCD7C
 PaleGreen484 139 84 #548B54
 SpringGreen10 255 127 #00FF7F
 SpringGreen20 238 118 #00EE76
 SpringGreen30 205 102 #00CD66
 SpringGreen40 139 69 #008B45
 Green10 255 0 #00FF00
 Green20 238 0 #00EE00
 Green30 205 0 #00CD00
 Green40 139 0 #008B00
 Chartreuse1127 255 0 #7FFF00
 Chartreuse2118 238 0 #76EE00
 Chartreuse3102 205 0 #66CD00
 Chartreuse469 139 0 #458B00
 OliveDrab1192 255 62 #C0FF3E
 OliveDrab2179 238 58 #B3EE3A
 OliveDrab3154 205 50 #9ACD32
 OliveDrab4105 139 34 #698B22
 DarkOliveGreen1202 255 112 #CAFF70
 DarkOliveGreen2188 238 104 #BCEE68
 DarkOliveGreen3162 205 90 #A2CD5A
 DarkOliveGreen4110 139 61 #6E8B3D
 Khaki1255 246 143 #FFF68F
 Khaki2238 230 133 #EEE685
 Khaki3205 198 115 #CDC673
 Khaki4139 134 78 #8B864E
 LightGoldenrod1255 236 139 #FFEC8B
 LightGoldenrod2238 220 130 #EEDC82
 LightGoldenrod3205 190 112 #CDBE70
 LightGoldenrod4139 129 76 #8B814C
 LightYellow1255 255 224 #FFFFE0
 LightYellow2238 238 209 #EEEED1
 LightYellow3205 205 180 #CDCDB4
 LightYellow4139 139 122 #8B8B7A
 Yellow1255 255 0 #FFFF00
 Yellow2238 238 0 #EEEE00
 Yellow3205 205 0 #CDCD00
 Yellow4139 139 0 #8B8B00
 Gold1255 215 0 #FFD700
 Gold2238 201 0 #EEC900
 Gold3205 173 0 #CDAD00
 Gold4139 117 0 #8B7500
 Goldenrod1255 193 37 #FFC125
 Goldenrod2238 180 34 #EEB422
 Goldenrod3205 155 29 #CD9B1D
 Goldenrod4139 105 20 #8B6914
 DarkGoldenrod1255 185 15 #FFB90F
 DarkGoldenrod2238 173 14 #EEAD0E
 DarkGoldenrod3205 149 12 #CD950C
 DarkGoldenrod4139 101 8 #8B658B
 RosyBrown1255 193 193 #FFC1C1
 RosyBrown2238 180 180 #EEB4B4
 RosyBrown3205 155 155 #CD9B9B
 RosyBrown4139 105 105 #8B6969
 IndianRed1255 106 106 #FF6A6A
 IndianRed2238 99 99 #EE6363
 IndianRed3205 85 85 #CD5555
 IndianRed4139 58 58 #8B3A3A
 Sienna1255 130 71 #FF8247
 Sienna2238 121 66 #EE7942
 Sienna3205 104 57 #CD6839
 Sienna4139 71 38 #8B4726
 Burlywood1255 211 155 #FFD39B
 Burlywood2238 197 145 #EEC591
 Burlywood3205 170 125 #CDAA7D
 Burlywood4139 115 85 #8B7355
 Wheat1255 231 186 #FFE7BA
 Wheat2238 216 174 #EED8AE
 Wheat3205 186 150 #CDBA96
 Wheat4139 126 102 #8B7E66
 Tan1 255 165 79 #FFA54F
 Tan2 238 154 73 #EE9A49
 Tan3 205 133 63 #CD853F
 Tan4 139 90 43 #8B5A2B
 Chocolate1255 127 36 #FF7F24
 Chocolate2238 118 33 #EE7621
 Chocolate3205 102 29 #CD661D
 Chocolate4139 69 19 #8B4513
 Firebrick1255 48 48 #FF3030
 Firebrick2238 44 44 #EE2C2C
 Firebrick3205 38 38 #CD2626
 Firebrick4139 26 26 #8B1A1A
 Brown1255 64 64 #FF4040
 Brown2238 59 59 #EE3B3B
 Brown3205 51 51 #CD3333
 Brown4139 35 35 #8B2323
 Salmon1255 140 105 #FF8C69
 Salmon2238 130 98 #EE8262
 Salmon3205 112 84 #CD7054
 Salmon4139 76 57 #8B4C39
 LightSalmon1255 160 122 #FFA07A
 LightSalmon2238 149 114 #EE9572
 LightSalmon3205 129 98 #CD8162
 LightSalmon4139 87 66 #8B5742
 Orange1255 165 0 #FFA500
 Orange2238 154 0 #EE9A00
 Orange3205 133 0 #CD8500
 Orange4139 90 0 #8B5A00
 DarkOrange1255 127 0 #FF7F00
 DarkOrange2238 118 0 #EE7600
 DarkOrange3205 102 0 #CD6600
 DarkOrange4139 69 0 #8B4500
 Coral1255 114 86 #FF7256
 Coral2238 106 80 #EE6A50
 Coral3205 91 69 #CD5B45
 Coral4139 62 47 #8B3E2F
 Tomato1255 99 71 #FF6347
 Tomato2238 92 66 #EE5C42
 Tomato3205 79 57 #CD4F39
 Tomato4139 54 38 #8B3626
 OrangeRed1255 69 0 #FF4500
 OrangeRed2238 64 0 #EE4000
 OrangeRed3205 55 0 #CD3700
 OrangeRed4139 37 0 #8B2500
 Red1 255 0 0 #FF0000
 Red2 238 0 0 #EE0000
 Red3 205 0 0 #CD0000
 Red4 139 0 0 #8B0000
 DeepPink1255 20 147 #FF1493
 DeepPink2238 18 137 #EE1289
 DeepPink3205 16 118 #CD1076
 DeepPink4139 10 80 #8B0A50
 HotPink1255 110 180 #FF6EB4
 HotPink2238 106 167 #EE6AA7
 HotPink3205 96 144 #CD6090
 HotPink4139 58 98 #8B3A62
 Pink1255 181 197 #FFB5C5
 Pink2238 169 184 #EEA9B8
 Pink3205 145 158 #CD919E
 Pink4139 99 108 #8B636C
 LightPink1255 174 185 #FFAEB9
 LightPink2238 162 173 #EEA2AD
 LightPink3205 140 149 #CD8C95
 LightPink4139 95 101 #8B5F65
 PaleVioletRed1255 130 171 #FF82AB
 PaleVioletRed2238 121 159 #EE799F
 PaleVioletRed3205 104 137 #CD6889
 PaleVioletRed4139 71 93 #8B475D
 Maroon1255 52 179 #FF34B3
 Maroon2238 48 167 #EE30A7
 Maroon3205 41 144 #CD2990
 Maroon4139 28 98 #8B1C62
 VioletRed1255 62 150 #FF3E96
 VioletRed2238 58 140 #EE3A8C
 VioletRed3205 50 120 #CD3278
 VioletRed4139 34 82 #8B2252
 Magenta1255 0 255 #FF00FF
 Magenta2238 0 238 #EE00EE
 Magenta3205 0 205 #CD00CD
 Magenta4139 0 139 #8B008B
 Orchid1255 131 250 #FF83FA
 Orchid2238 122 233 #EE7AE9
 Orchid3205 105 201 #CD69C9
 Orchid4139 71 137 #8B4789
 Plum1255 187 255 #FFBBFF
 Plum2238 174 238 #EEAEEE
 Plum3205 150 205 #CD96CD
 Plum4139 102 139 #8B668B
 MediumOrchid1224 102 255 #E066FF
 MediumOrchid2209 95 238 #D15FEE
 MediumOrchid3180 82 205 #B452CD
 MediumOrchid4122 55 139 #7A378B
 DarkOrchid1191 62 255 #BF3EFF
 DarkOrchid2178 58 238 #B23AEE
 DarkOrchid3154 50 205 #9A32CD
 DarkOrchid4104 34 139 #68228B
 Purple1155 48 255 #9B30FF
 Purple2145 44 238 #912CEE
 Purple3125 38 205 #7D26CD
 Purple485 26 139 #551A8B
 MediumPurple1171 130 255 #AB82FF
 MediumPurple2159 121 238 #9F79EE
 MediumPurple3137 104 205 #8968CD
 MediumPurple493 71 139 #5D478B
 Thistle1255 225 255 #FFE1FF
 Thistle2238 210 238 #EED2EE
 Thistle3205 181 205 #CDB5CD
 Thistle4139 123 139 #8B7B8B
 grey1128 28 28 #1C1C1C
 grey2154 54 54 #363636
 grey3179 79 79 #4F4F4F
 grey41105 105 105 #696969
 grey51130 130 130 #828282
 grey61156 156 156 #9C9C9C
 grey71181 181 181 #B5B5B5
 gray81207 207 207 #CFCFCF
 gray91232 232 232 #E8E8E8
 DarkGrey169 169 169 #A9A9A9
 DarkBlue0 0 139 #00008B
 DarkCyan0 139 139 #008B8B
 DarkMagenta139 0 139 #8B008B
 DarkRed139 0 0 #8B0000
 LightGreen144 238 144 #90EE90
+
+
+
+
+
+
+{/block} +{block name="script"} +{/block} \ No newline at end of file diff --git a/plugin/dev/rsa/App.php b/plugin/dev/rsa/App.php new file mode 100644 index 0000000..bb8b005 --- /dev/null +++ b/plugin/dev/rsa/App.php @@ -0,0 +1,256 @@ + 1024, + //选择在创建CSR时应该使用哪些扩展。可选值有 OPENSSL_KEYTYPE_DSA, OPENSSL_KEYTYPE_DH, OPENSSL_KEYTYPE_RSA 或 OPENSSL_KEYTYPE_EC. 默认值是 OPENSSL_KEYTYPE_RSA. + "private_key_type" => OPENSSL_KEYTYPE_RSA, + ]; + private $passPhrase; + private $rsaPrivateKey; + private $rsaPublicKey; + private $data; + private $sign; + private $origin; + private $coded; + private $opensslPadding; + + + public function __construct() + { + $this->passPhrase = request()->param("pass_phrase"); + if($this->passPhrase == '') $this->passPhrase = null; + $this->rsaPrivateKey = request()->param("private_key"); + $this->rsaPublicKey = request()->param("public_key"); + $this->config["private_key_bits"] = request()->param("private_key_bits"); + $this->data = request()->param("data"); + $this->origin = request()->param("origin"); + $this->coded = request()->param("coded"); + $this->sign = request()->param("sign"); + $this->opensslPadding = request()->param("openssl_padding"); + } + + public function index() + { + return $this->view(); + } + + /** + * 生成密钥对 + */ + public function generate() + { + // 生成公钥私钥资源 + $res = openssl_pkey_new($this->config); + $privateKey = ''; + // 导出私钥 + openssl_pkey_export($res, $privateKey, $this->passPhrase, $this->config); + // 导出公钥 + $pubKey = openssl_pkey_get_details($res); + openssl_pkey_free($res); + + return msg('ok', 'success', [ + "public_key" => $pubKey["key"], + "private_key" => $privateKey, + ]); + } + + /** + * 私钥加密 + * @param string $data + * @return null|string + */ + public function private_encrypt() + { + if (!is_string($this->origin)) { + return msg('error', '加密失败'); + } + try { + if (openssl_private_encrypt($this->origin, $encrypted, $this->getRsaPrivateKey(), $this->opensslPadding)) { + return msg('ok', 'success', base64_encode($encrypted)); + } + return msg('error', '加密失败'); + } catch (\Exception $e) { + return msg('error', $e->getMessage()); + } + } + + /** + * 公钥加密 + * @param string $data + * @return null|string + */ + public function public_encrypt() + { + if (!is_string($this->origin)) { + return msg('error', '加密失败'); + } + $dataLength = mb_strlen($this->origin); + $offet = 0; + $length = 128; + $i = 0; + $string = ''; + try { + while ($dataLength - $offet > 0) { + if ($dataLength - $offet > $length) { + $str = mb_substr($this->origin, $offet, $length); + } else { + $str = mb_substr($this->origin, $offet, $dataLength - $offet); + } + $encrypted = ''; + openssl_public_encrypt($str, $encrypted, $this->rsaPublicKey, $this->opensslPadding); + $string .= $encrypted; + $i++; + $offet = $i * $length; + } + + if ($string) { + return msg('ok', 'success', base64_encode($string)); + } + return msg('error', '加密失败'); + } catch (\Exception $e) { + return msg('error', $e->getMessage()); + } + } + + /** + * 私钥解密 + * @param string $encrypted + * @return null + */ + public function private_decrypt() + { + if (!is_string($this->coded)) { + return msg('error', '解密失败'); + } + try { + if (openssl_private_decrypt(base64_decode($this->coded), $decrypted, $this->getRsaPrivateKey(), $this->opensslPadding)) { + return msg('ok', 'success', $decrypted); + } + return msg('error', '解密失败'); + } catch (\Exception $e) { + return msg('error', $e->getMessage()); + } + + } + + /** + * 公钥解密 + * @param string $encrypted + * @return null + */ + public function public_decrypt() + { + if (!is_string($this->coded)) { + return msg('error', '解密失败'); + } + + try { + if (openssl_public_decrypt(base64_decode($this->coded), $decrypted, $this->rsaPublicKey, $this->opensslPadding)) { + return msg('ok', 'success', $decrypted); + } + return msg('error', '解密失败'); + } catch (\Exception $e) { + return msg('error', $e->getMessage()); + } + } + + /** + * 生成签名 + * + * @param string 签名材料 + * @param string 签名编码(base64/hex/bin) + * @return string 签名值 + */ + public function sign() + { + try { + if (openssl_sign($this->data, $ret, $this->getRsaPrivateKey())) { + $ret = base64_encode($ret); + return msg('ok', 'success', $ret); + } + return msg('error', '签名失败'); + } catch (\Exception $e) { + return msg('error', $e->getMessage()); + } + } + + /** + * 验证签名 + * + * @param string 签名材料 + * @param string 签名值 + * @param string 签名编码(base64/hex/bin) + * @return \think\response\Json + */ + public function verify() + { + try { + $ret = false; + $sign = base64_decode($this->sign); + if ($sign !== false) { + if (openssl_verify($this->data, $sign, $this->rsaPublicKey) === 1) { + $ret = true; + } + } + if ($ret) { + return msg('ok', '验签成功,签名正确', $ret); + } + return msg('error', '验签失败,签名不正确'); + } catch (\Exception $e) { + return msg('error', $e->getMessage()); + } + } + + public function check() + { + try { + openssl_sign('cccyun', $ret, $this->getRsaPrivateKey()); + if (openssl_verify('cccyun', $ret, $this->rsaPublicKey) === 1) { + return msg('ok', '验证成功,公私钥匹配'); + } + return msg('error', '公私钥不匹配'); + } catch (\Exception $e) { + return msg('error', $e->getMessage()); + } + } + + public function output() + { + try { + $openssl_pkey_get_details = openssl_pkey_get_details($this->getRsaPrivateKey()); + if ($openssl_pkey_get_details && !empty($openssl_pkey_get_details['key'])) { + return msg('ok', '导出成功', $openssl_pkey_get_details['key']); + } + return msg('error', '导出失败,私钥不正确'); + } catch (\Exception $e) { + return msg('error', $e->getMessage()); + } + } + + /** + * @return array|mixed|null + */ + public function getRsaPrivateKey() + { + $privateKey = openssl_pkey_get_private($this->rsaPrivateKey, $this->passPhrase); + if ($privateKey === false) { + throw new \Exception('私钥不正确或密码错误'); + } + return $privateKey; + } +} \ No newline at end of file diff --git a/plugin/dev/rsa/index.html b/plugin/dev/rsa/index.html new file mode 100644 index 0000000..d6416df --- /dev/null +++ b/plugin/dev/rsa/index.html @@ -0,0 +1,388 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} +
+
+
+
+
+ RSA公私钥生成、验证、加密和解密 +
+ +
+
+
+ + +
+
+ +
+ +
+
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+
+ + +
+
+ + +
+
+ +
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+
+ +
+ +
+
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+
+
+
+
+{/block} +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/plugin/dev/uuid/App.php b/plugin/dev/uuid/App.php new file mode 100644 index 0000000..5972b36 --- /dev/null +++ b/plugin/dev/uuid/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/dev/uuid/index.html b/plugin/dev/uuid/index.html new file mode 100644 index 0000000..0be31ba --- /dev/null +++ b/plugin/dev/uuid/index.html @@ -0,0 +1,122 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} +
+
+
+
+
+ UUID生成器 +
+
+ +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+
+
+
+
+
+{/block} +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/plugin/fun/alipay_arrival/App.php b/plugin/fun/alipay_arrival/App.php new file mode 100644 index 0000000..a894de6 --- /dev/null +++ b/plugin/fun/alipay_arrival/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/fun/alipay_arrival/index.html b/plugin/fun/alipay_arrival/index.html new file mode 100644 index 0000000..e5ea817 --- /dev/null +++ b/plugin/fun/alipay_arrival/index.html @@ -0,0 +1,151 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} +
+
+
+
+
+ 支付宝到账语音 +
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+
工具说明
+
+

在线生成支付宝到账音效,输入金额,即刻到账!

+
+
+
+
+
+{/block} +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/plugin/fun/ascii_art/App.php b/plugin/fun/ascii_art/App.php new file mode 100644 index 0000000..455c86e --- /dev/null +++ b/plugin/fun/ascii_art/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/fun/ascii_art/index.html b/plugin/fun/ascii_art/index.html new file mode 100644 index 0000000..32d4669 --- /dev/null +++ b/plugin/fun/ascii_art/index.html @@ -0,0 +1,143 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+ ASCII艺术字生成 +
+
+ +
+ +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
{{line}}
+
+
+
+
+{/block} +{block name="script"} + + + +{/block} \ No newline at end of file diff --git a/plugin/fun/bandwidth_waste/App.php b/plugin/fun/bandwidth_waste/App.php new file mode 100644 index 0000000..1b628fc --- /dev/null +++ b/plugin/fun/bandwidth_waste/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/fun/bandwidth_waste/index.html b/plugin/fun/bandwidth_waste/index.html new file mode 100644 index 0000000..73ac93b --- /dev/null +++ b/plugin/fun/bandwidth_waste/index.html @@ -0,0 +1,214 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ 让流量消失 +
+
+ +
+ +
+
+
+ +
+ + + +
+
+
+
+
+ + +
+
+
+ +
+
+
+
已消失的流量
+
{{changeFilesize(waste)}}
+
+
+
+
每秒实时流量
+
{{speed}}
+
+
+
+
运行时长
+
{{secToTime(spend)}}
+
+
+
+
+
+
+
工具说明
+
+

此工具可以以浪费的形式消耗你的流量

+

注意:无法请求跨域链接

+
+
+
+
+
+{/block} +{block name="script"} + + + +{/block} \ No newline at end of file diff --git a/plugin/fun/bullshit_generator/App.php b/plugin/fun/bullshit_generator/App.php new file mode 100644 index 0000000..0ad81ac --- /dev/null +++ b/plugin/fun/bullshit_generator/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/fun/bullshit_generator/index.html b/plugin/fun/bullshit_generator/index.html new file mode 100644 index 0000000..78fc5a5 --- /dev/null +++ b/plugin/fun/bullshit_generator/index.html @@ -0,0 +1,273 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} +
+
+
+
+ 狗屁不通文章生成器 +
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+{/block} +{block name="script"} + +{/block} \ No newline at end of file diff --git a/plugin/fun/piano/App.php b/plugin/fun/piano/App.php new file mode 100644 index 0000000..6524336 --- /dev/null +++ b/plugin/fun/piano/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/fun/piano/index.html b/plugin/fun/piano/index.html new file mode 100644 index 0000000..2c98b0a --- /dev/null +++ b/plugin/fun/piano/index.html @@ -0,0 +1,27 @@ +{literal} + + + + + + + + + 自由钢琴 - 在线钢琴,键盘钢琴,模拟钢琴,多种乐器选择,好听又好玩 + + + + +
+ + + + + + +{/literal} \ No newline at end of file diff --git a/plugin/fun/speech_synthesis/App.php b/plugin/fun/speech_synthesis/App.php new file mode 100644 index 0000000..c8e0e5e --- /dev/null +++ b/plugin/fun/speech_synthesis/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/fun/speech_synthesis/index.html b/plugin/fun/speech_synthesis/index.html new file mode 100644 index 0000000..9a3302b --- /dev/null +++ b/plugin/fun/speech_synthesis/index.html @@ -0,0 +1,113 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} +
+
+
+
+
+ 在线语音合成 +
+
本地生成,由于浏览器的不同,音色会有不同
+
+ +
+ +
+
+
+ +
+ +
+
+
+ {{set.rate}} +
+ +
+
+
+ {{set.pitch}} +
+ +
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+{/block} +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/plugin/utility/bankcard/App.php b/plugin/utility/bankcard/App.php new file mode 100644 index 0000000..23d0dff --- /dev/null +++ b/plugin/utility/bankcard/App.php @@ -0,0 +1,50 @@ +view(); + } + + public function query(){ + $cardnum = input('post.cardnum', null, 'trim'); + if(!$cardnum) return msg('error','no cardnum'); + + if(strlen($cardnum) <8){ + return msg('error', '银行卡号有误,请输入正确的银行卡号'); + } + + $msg['card_num'] = $cardnum; + $res = $this->getBankCardInfo($cardnum); + $msg['validated'] = $res['validated']; + if($res['validated']){ + $bank_arr = json_decode(file_get_contents(dirname(__FILE__).'/bank.json'), true); + $type_arr = ['DC'=>'储蓄卡', 'CC'=>'信用卡']; + $msg['bank_code'] = $res['bank']; + $msg['bank_name'] = $bank_arr[$res['bank']] ? $bank_arr[$res['bank']] : $res['bank']; + $msg['card_type'] = $type_arr[$res['cardType']]; + }else{ + $msg['error'] = $res['messages'][0]['errorCodes']; + } + + return msg('ok','success',$msg); + } + + private function getBankCardInfo($cardNum){ + $url = 'https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&cardNo='.$cardNum.'&cardBinCheck=true'; + $data = get_curl($url); + $arr = json_decode($data, true); + return $arr; + } + +} \ No newline at end of file diff --git a/plugin/utility/bankcard/bank.json b/plugin/utility/bankcard/bank.json new file mode 100644 index 0000000..b4aec10 --- /dev/null +++ b/plugin/utility/bankcard/bank.json @@ -0,0 +1 @@ +{"ICBC":"\u4e2d\u56fd\u5de5\u5546\u94f6\u884c","ABC":"\u4e2d\u56fd\u519c\u4e1a\u94f6\u884c","CCB":"\u4e2d\u56fd\u5efa\u8bbe\u94f6\u884c","PSBC":"\u4e2d\u56fd\u90ae\u653f\u50a8\u84c4\u94f6\u884c","BOC":"\u4e2d\u56fd\u94f6\u884c","CMB":"\u62db\u5546\u94f6\u884c","COMM":"\u4ea4\u901a\u94f6\u884c","CEB":"\u4e2d\u56fd\u5149\u5927\u94f6\u884c","SPABANK":"\u5e73\u5b89\u94f6\u884c","CMBC":"\u4e2d\u56fd\u6c11\u751f\u94f6\u884c","CIB":"\u5174\u4e1a\u94f6\u884c","CITIC":"\u4e2d\u4fe1\u94f6\u884c","SPDB":"\u6d66\u53d1\u94f6\u884c","GDB":"\u5e7f\u53d1\u94f6\u884c","ESUN_MMK_S7":"7-ELEVEN","ANZHK":"ANZ, Hong Kong Branch","AEON":"AEON","BBP":"BARCLAYS BANK PLC","BOCLHK":"BOC (HONG KONG) LIMITED","BBVAHKB":"BBVA, Hong Kong Branch","BOCS":"BOC, Singapore Branch","CNAHK":"Citibank N.A. Hong Kong Branch","DBLHK":"DBS BANK LTD., HONG KONG BRANCH","DBAGHK":"DB AG, Hong Kong Branch","IBNVHK":"ING Bank N.V. Hong Kong Branch","JPMHK":"JPM, Hong Kong Branch","MZHK":"Mizuho, Hong Kong Branch","SGHK":"SocGen, Hong Kong Branch","SCBLHK":"SCB (HONG KONG) LIMITED","SAXO":"SAXOBANK","VTB":"VTB\u94f6\u884c","ALSRCC":"\u963f\u62c9\u5584\u519c\u6751\u5546\u4e1a\u94f6\u884c","ARQRCC":"\u963f\u8363\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JSLSTSCZYH":"\u5b89\u56fd\u4e2d\u6210\u6751\u9547\u94f6\u884c","TCYTHTCZYH":"\u5b89\u5fbd\u5de2\u6e56\u626c\u5b50\u6751\u9547\u94f6\u884c","AHDTXHBANK":"\u5b89\u5fbd\u5f53\u6d82\u65b0\u534e\u6751\u9547\u94f6\u884c","AHFCJXCB":"\u5b89\u5fbd\u7e41\u660c\u5efa\u4fe1\u6751\u9547\u94f6\u884c","AHFCRCC":"\u5b89\u5fbd\u7e41\u660c\u519c\u6751\u5546\u4e1a\u94f6\u884c","GZZCCJCZYH":"\u5b89\u5fbd\u80a5\u897f\u77f3\u94f6\u6751\u9547\u94f6\u884c","WDXFCZYH":"\u5b89\u5fbd\u51e4\u53f0\u901a\u5546\u6751\u9547\u94f6\u884c","NJLHJYCZYH":"\u5b89\u5fbd\u51e4\u9633\u5229\u6c11\u6751\u9547\u94f6\u884c","AHSSRCC":"\u5b89\u5fbd\u5bbf\u677e\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHNLRCC":"\u5b89\u5fbd\u5357\u9675\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHJZRCC":"\u5b89\u5fbd\u91d1\u5be8\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHLXKQPRCC":"\u5b89\u5fbd\u90ce\u6eaa\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHGZXHHCZYH":"\u5b89\u5fbd\u56fa\u9547\u65b0\u6dee\u6cb3\u6751\u9547\u94f6\u884c","AHHNRCC":"\u5b89\u5fbd\u6000\u5b81\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHHYRCC":"\u5b89\u5fbd\u6000\u8fdc\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHFYRCC":"\u5b89\u5fbd\u51e4\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHFNRCC":"\u5b89\u5fbd\u961c\u5357\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHHXRCC":"\u5b89\u5fbd\u548c\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","ADXFCB":"\u5b89\u8fbe\u5e78\u798f\u6751\u9547\u94f6\u884c","AHFTRCC":"\u5b89\u5fbd\u51e4\u53f0\u519c\u6751\u5546\u4e1a\u94f6\u884c","NBSHSGMCZYH":"\u5b89\u5fbd\u9ec4\u5c71\u91d1\u6865\u6751\u9547\u94f6\u884c","KSLCCZYH":"\u5b89\u5fbd\u5fbd\u5dde\u94dc\u6e90\u6751\u9547\u94f6\u884c","AHQMRCC":"\u5b89\u5fbd\u7941\u95e8\u519c\u6751\u5546\u4e1a\u94f6\u884c","NXYCHFCZYH":"\u5b89\u5fbd\u6f5c\u5c71\u6c5f\u6dee\u6751\u9547\u94f6\u884c","AHQJRCC":"\u5b89\u5fbd\u5168\u6912\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHDYRCC":"\u5b89\u5fbd\u5b9a\u8fdc\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHHSZMURCC":"\u5b89\u5fbd\u542b\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHHQLHCB":"\u5b89\u5fbd\u970d\u90b1\u8054\u5408\u6751\u9547\u94f6\u884c","AGSRCC":"\u5b89\u56fd\u5e02\u519c\u6751\u4fe1\u7528\u8054\u793e","AHGDRCC":"\u5b89\u5fbd\u5e7f\u5fb7\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNXHXLCZYH":"\u5b89\u5fbd\u5e7f\u5fb7\u626c\u5b50\u6751\u9547\u94f6\u884c","IWPXNCSYQZG":"\u5b89\u5fbd\u6b59\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHSTRCC":"\u5b89\u5fbd\u77f3\u53f0\u519c\u6751\u5546\u4e1a\u94f6\u884c","TZZYFDCZYH":"\u5b89\u5fbd\u5bbf\u677e\u6c11\u4e30\u6751\u9547\u94f6\u884c","AHSZHHCB":"\u5b89\u5fbd\u5bbf\u5dde\u6dee\u6d77\u6751\u9547\u94f6\u884c","PSZJCZYH":"\u5b89\u5fbd\u94dc\u9675\u94dc\u6e90\u6751\u9547\u94f6\u884c","BJYAHWYHSCZYH":"\u5b89\u5fbd\u6da1\u9633\u6e56\u5546\u6751\u9547\u94f6\u884c","VSQXNCSYVFE":"\u5b89\u5fbd\u9edf\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHCFRCC":"\u5b89\u5fbd\u957f\u4e30\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHTCDFXRCC":"\u5b89\u5fbd\u6850\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHMGRCC":"\u5b89\u5fbd\u660e\u5149\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHXABANK":"\u5b89\u5fbd\u65b0\u5b89\u94f6\u884c","AYCB":"\u5b89\u9633\u94f6\u884c","AHLBRCB":"\u5b89\u5fbd\u7075\u74a7\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHZYRCC":"\u5b89\u5fbd\u679e\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHWHRCC":"\u5b89\u5fbd\u4e94\u6cb3\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHSCRCC":"\u5b89\u5fbd\u8212\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHZCHSCB":"\u5b89\u5fbd\u8c2f\u57ce\u6e56\u5546\u6751\u9547\u94f6\u884c","AKTXRCC":"\u963f\u514b\u9676\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","AHXXRCB":"\u5b89\u5fbd\u8427\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","ADSRCC":"\u5b89\u8fbe\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ABZRCC":"\u963f\u575d\u5dde\u519c\u6751\u4fe1\u7528\u8054\u793e","AHFDRCC":"\u5b89\u5fbd\u80a5\u4e1c\u519c\u6751\u5546\u4e1a\u94f6\u884c","JSJDJYCZYH":"\u5b89\u5fbd\u6000\u8fdc\u672c\u5bcc\u6751\u9547\u94f6\u884c","CNZCCZYH":"\u5b89\u5fbd\u91d1\u5be8\u6c5f\u6dee\u6751\u9547\u94f6\u884c","AHWHYTCZYXCYZ":"\u5b89\u5fbd\u4e94\u6cb3\u6c38\u6cf0\u6751\u9547\u94f6\u884c","SXLNYGCZYH":"\u5b89\u5fbd\u4f11\u5b81\u5927\u5730\u6751\u9547\u94f6\u884c","ZHJYCZYH":"\u5b89\u9646\u695a\u519c\u5546\u6751\u9547\u94f6\u884c","BCDMMA":"\u6fb3\u95e8\u5546\u4e1a\u94f6\u884c","AHHSTZFRCC":"\u5b89\u5fbd\u970d\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","ASXHNMCZYH":"\u5b89\u987a\u897f\u822a\u5357\u9a6c\u6751\u9547\u94f6\u884c","AHNGRCC":"\u5b89\u5fbd\u5b81\u56fd\u519c\u6751\u5546\u4e1a\u94f6\u884c","EEDSSTXMYCZYH":"\u5b89\u5fbd\u5cb3\u897f\u6e56\u5546\u6751\u9547\u94f6\u884c","AHCFKYCB":"\u5b89\u5fbd\u957f\u4e30\u79d1\u6e90\u6751\u9547\u94f6\u884c","AHTSRCB":"\u5b89\u5fbd\u7800\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","NBZZNCSYYOW":"\u5b89\u5fbd\u56fa\u9547\u519c\u6751\u5546\u4e1a\u94f6\u884c","WNFMCZYH":"\u5b89\u5fbd\u8212\u57ce\u6b63\u5174\u6751\u9547\u94f6\u884c","ZQBNPFCZYH":"\u5b89\u9f99\u5174\u9f99\u6751\u9547\u94f6\u884c","AXMSCZYH":"\u5b89\u6eaa\u6c11\u751f\u6751\u9547\u94f6\u884c","ASCB":"\u978d\u5c71\u94f6\u884c","AQNCRCC":"\u5b89\u5e86\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHSXJYCZYH":"\u5b89\u5fbd\u6b59\u53bf\u5609\u94f6\u6751\u9547\u94f6\u884c","AHLQRCC":"\u5b89\u5fbd\u4e34\u6cc9\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHMASRCC":"\u5b89\u5fbd\u9a6c\u978d\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHJXRCC":"\u5b89\u5fbd\u7ee9\u6eaa\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHYJRCC":"\u5b89\u5fbd\u53f6\u96c6\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHMGMFCZYH":"\u5b89\u5fbd\u660e\u5149\u6c11\u4e30\u6751\u9547\u94f6\u884c","AXDSCB":"\u5b89\u65b0\u5927\u5546\u6751\u9547\u94f6\u884c","AHYXRCC":"\u5b89\u5fbd\u5cb3\u897f\u519c\u6751\u5546\u4e1a\u94f6\u884c","AKNCRCC":"\u5b89\u5eb7\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHZXCATRCC":"\u5b89\u5fbd\u6fc9\u6eaa\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHFXRCC":"\u5b89\u5fbd\u80a5\u897f\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHZDRCC":"\u5b89\u5fbd\u65cc\u5fb7\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHHQRCC":"\u5b89\u5fbd\u970d\u90b1\u519c\u6751\u5546\u4e1a\u94f6\u884c","AKSHSKZRCC":"\u963f\u514b\u585e\u54c8\u8428\u514b\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","AHLXPPYRCC":"\u5b89\u5fbd\u5229\u8f9b\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXSLFMCZYH":"\u5b89\u5fbd\u9752\u9633\u4e5d\u534e\u6751\u9547\u94f6\u884c","AXXNKZRCC":"\u5b89\u65b0\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","FDCZYH":"\u963f\u62c9\u5584\u5de6\u65d7\u65b9\u5927\u6751\u9547\u94f6\u884c","AHDZRCC":"\u5b89\u5fbd\u4e1c\u81f3\u519c\u6751\u5546\u4e1a\u94f6\u884c","ALSZQHHCZYH":"\u963f\u62c9\u5584\u5de6\u65d7\u9ec4\u6cb3\u6751\u9547\u94f6\u884c","PXWWZSBHCZYH":"\u5b89\u5fbd\u8499\u57ce\u6e56\u5546\u6751\u9547\u94f6\u884c","NFJDCZYH":"\u5b89\u5fbd\u592a\u6e56\u6c5f\u6dee\u6751\u9547\u94f6\u884c","ASRZB":"\u5b89\u987a\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHSZRCC":"\u5b89\u5fbd\u5bbf\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHQSRCC":"\u5b89\u5fbd\u6f5c\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHTHMMXRCC":"\u5b89\u5fbd\u592a\u548c\u519c\u6751\u5546\u4e1a\u94f6\u884c","AZXRCC":"\u5b89\u6cfd\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ABGQRCC":"\u963f\u5df4\u560e\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","AHQYRCC":"\u5b89\u5fbd\u9752\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHTHAVSRCC":"\u5b89\u5fbd\u592a\u6e56\u519c\u6751\u5546\u4e1a\u94f6\u884c","ADLYXXLBANK":"\u6fb3\u5927\u5229\u4e9a\u548c\u65b0\u897f\u5170\u94f6\u884c\uff08\u4e2d\u56fd\uff09\u6709\u9650\u516c\u53f8","ALSYQRCC":"\u963f\u62c9\u5584\u53f3\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","AHMCRCC":"\u5b89\u5fbd\u8499\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHJSRCC":"\u5b89\u5fbd\u754c\u9996\u519c\u6751\u5546\u4e1a\u94f6\u884c","AXRCC":"\u5b89\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","AHLARCC":"\u5b89\u5fbd\u6765\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHTCVDPRCC":"\u5b89\u5fbd\u5929\u957f\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHTCJHCB":"\u5b89\u5fbd\u6850\u57ce\u6c5f\u6dee\u6751\u9547\u94f6\u884c","ATSSRCC":"\u963f\u56fe\u4ec0\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","WLMQMDPFCZYH":"\u5b89\u4e18\u5317\u6d77\u6751\u9547\u94f6\u884c","AHWJRCC":"\u5b89\u5fbd\u671b\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHZSRCC":"\u5b89\u5fbd\u988d\u4e0a\u519c\u6751\u5546\u4e1a\u94f6\u884c","CLZYCZYH":"\u5b89\u9633\u73e0\u6c5f\u6751\u9547\u94f6\u884c","AHQRCC":"\u6556\u6c49\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","AYXRCC":"\u5b89\u5cb3\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","AWTXRCC":"\u963f\u74e6\u63d0\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","AHZXWYXRCC":"\u5b89\u5fbd\u6cd7\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","ANZ":"\u6fb3\u65b0\u94f6\u884c","AHSXRCC":"\u5b89\u5fbd\u5bff\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","APHMCZYH":"\u5b89\u5e73\u60e0\u6c11\u6751\u9547\u94f6\u884c","ALEJHCB":"\u963f\u62c9\u5c14\u6d25\u6c47\u6751\u9547\u94f6\u884c","ABCHK":"ABC, Hong Kong Branch","HNJSXHCZYH":"\u5b89\u5fbd\u80a5\u4e1c\u6e56\u5546\u6751\u9547\u94f6\u884c","AHQMTYCB":"\u5b89\u5fbd\u7941\u95e8\u94dc\u6e90\u6751\u9547\u94f6\u884c","AHLJRCC":"\u5b89\u5fbd\u5e90\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","TRWSCZCZYH":"\u5df4\u5f66\u6dd6\u5c14\u5e02\u4e34\u6cb3\u9ec4\u6cb3\u6751\u9547\u94f6\u884c","GUAWAXHMCZYH":"\u5305\u5934\u5e02\u4e5d\u539f\u7acb\u519c\u6751\u9547\u94f6\u884c","GDSHTLCZYH":"\u5b89\u5fbd\u5229\u8f9b\u6e56\u5546\u6751\u9547\u94f6\u884c","JJHTCZYH":"\u4fdd\u5b9a\u6ee1\u57ce\u533a\u5229\u4e30\u6751\u9547\u94f6\u884c","BPSDCZYH":"\u5317\u7968\u76db\u90fd\u6751\u9547\u94f6\u884c","BJJTQRCC":"\u5b9d\u9e21\u5e02\u91d1\u53f0\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BTNCRCC":"\u5305\u5934\u519c\u6751\u5546\u4e1a\u94f6\u884c","BDXSQRCC":"\u4fdd\u5b9a\u5e02\u5f90\u6c34\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BZBZRCC":"\u5df4\u4e2d\u5e02\u5df4\u5dde\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","BLKHSKRCC":"\u5df4\u91cc\u5764\u54c8\u8428\u514b\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","BCRCB":"\u767d\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","BYRXCB":"\u5df4\u5f66\u878d\u5174\u6751\u9547\u94f6\u884c","BMYZRCC":"\u5df4\u9a6c\u7476\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BLZQRCC":"\u5df4\u6797\u5de6\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BSJYHHCZYH":"\u767d\u5c71\u6c5f\u6e90\u6c47\u6052\u6751\u9547\u94f6\u884c","BSJYNSB":"\u767d\u5c71\u6c5f\u6e90\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","BCTBHMCZYH":"\u767d\u57ce\u6d2e\u5317\u60e0\u6c11\u6751\u9547\u94f6\u884c","BYQRCC":"\u767d\u94f6\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJYHYXCZYH":"\u767e\u8272\u9756\u897f\u957f\u6c5f\u6751\u9547\u94f6\u884c","FNMSCZYH":"\u767e\u8272\u53f3\u6c5f\u534e\u6da6\u6751\u9547\u94f6\u884c","BAYERN":"\u5df4\u4f10\u5229\u4e9a\u5dde\u94f6\u884c","BJCCQRCC":"\u5b9d\u9e21\u5e02\u9648\u4ed3\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BYXBXWRCC":"\u767d\u7389\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BTQSHRCB":"\u5305\u5934\u9752\u5c71\u6cb3\u5957\u6751\u9547\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","BDSSQRCC":"\u4fdd\u5b9a\u5e02\u5e02\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GXLCLYCZYH":"\u4fdd\u5eb7\u695a\u519c\u5546\u6751\u9547\u94f6\u884c","HNDKTNSCZYH":"\u4fdd\u5c71\u660c\u5b81\u957f\u6c5f\u6751\u9547\u94f6\u884c","JSRDRXCZYH":"\u4fdd\u5c71\u9f99\u9675\u957f\u6c5f\u6751\u9547\u94f6\u884c","FJJYRSCZYH":"\u4fdd\u5c71\u9686\u9633\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","FJSSYNSCZYH":"\u5df4\u4e2d\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","XWZMQBSHFCZYH":"\u5317\u4eac\u660c\u5e73\u5305\u5546\u6751\u9547\u94f6\u884c","FJNHCGCZYH":"\u5317\u4eac\u5927\u5174\u534e\u590f\u6751\u9547\u94f6\u884c","KMSLZCCZYH":"\u5317\u4eac\u5e73\u8c37\u65b0\u534e\u6751\u9547\u94f6\u884c","HPGMCZYH":"\u672c\u6eaa\u4e30\u6cf0\u6751\u9547\u94f6\u884c","HBXAWNSCZYH":"\u672c\u6eaa\u4e30\u4e1a\u6751\u9547\u94f6\u884c","BXSGTZRCC":"\u672c\u6eaa\u5e02\u9ad8\u53f0\u5b50\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","BXSWTSRCC":"\u672c\u6eaa\u5e02\u6b6a\u5934\u5c71\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","BXSQTDRCC":"\u672c\u6eaa\u5e02\u5e02\u533a\u901a\u8fbe\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","HGXJRCZYH":"\u5bbe\u9633\u5317\u90e8\u6e7e\u6751\u9547\u94f6\u884c","BOHAIB":"\u6e24\u6d77\u94f6\u884c","BLXRCC":"\u52c3\u5229\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BXXWBMRCC":"\u67cf\u4e61\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","BZSQBRRCC":"\u5317\u9547\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BSLYQRCC":"\u4fdd\u5c71\u5e02\u9686\u9633\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BXSQDXRCC":"\u672c\u6eaa\u5e02\u5e02\u533a\u4e1c\u5174\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","BYXMYURCC":"\u5bbe\u9633\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BBXRCC":"\u535a\u767d\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BSHJHTCZYXABT":"\u767d\u5c71\u6d51\u6c5f\u6052\u6cf0\u6751\u9547\u94f6\u884c","BXSSQRCC":"\u672c\u6eaa\u5e02\u5e02\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u793e","BZSVDNRCC":"\u9738\u5dde\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BYSBYQRCC":"\u767d\u94f6\u5e02\u767d\u94f6\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BSSDCJCB":"\u4fdd\u5c71\u65bd\u7538\u957f\u6c5f\u6751\u9547\u94f6\u884c","BXSQDFRCC":"\u672c\u6eaa\u5e02\u5e02\u533a\u4e1c\u98ce\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","BTNJRCC":"\u5305\u5934\u5e02\u5357\u90ca\u519c\u6751\u4fe1\u7528\u8054\u793e","BCXZDGRCC":"\u62dc\u57ce\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BXSSQZRCC":"\u672c\u6eaa\u5e02\u77f3\u6865\u5b50\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","BJBANK":"\u5317\u4eac\u94f6\u884c","BHSRCC":"\u5317\u6d77\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","BTRCB":"\u5305\u5934\u519c\u5546\u94f6\u884c","BXSWLRCC":"\u672c\u6eaa\u5e02\u5367\u9f99\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","BTRCC":"\u5317\u5c6f\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZXBXBANK":"\u767e\u4fe1\u94f6\u884c","BLYQRCC":"\u5df4\u6797\u53f3\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BXXWZGRCC":"\u5b9d\u5174\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","BJBANKHZ":"\u5317\u4eac\u94f6\u884c\u676d\u5dde\u5206\u884c","BQXOPQRCC":"\u5b9d\u6e05\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BPSRCC":"\u5317\u7968\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","BYSPCQRCC":"\u767d\u94f6\u5e02\u5e73\u5ddd\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SSZJCZYH":"\u672c\u6eaa\u540c\u76db\u6751\u9547\u94f6\u884c","SJZXHHSCZYH":"\u5317\u5c6f\u56fd\u6c11\u6751\u9547\u94f6\u884c","BXSQFJRCC":"\u672c\u6eaa\u5e02\u5e02\u533a\u5bcc\u4f73\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","AHSCZXCZYH":"\u6bd5\u8282\u53d1\u5c55\u6751\u9547\u94f6\u884c","AHWWRCC":"\u5b89\u5fbd\u65e0\u4e3a\u519c\u6751\u5546\u4e1a\u94f6\u884c","ANSRCC":"\u5b89\u5b81\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","AHXNRCC":"\u5b89\u5fbd\u4f11\u5b81\u519c\u6751\u5546\u4e1a\u94f6\u884c","BZSFCB":"\u9738\u5dde\u821c\u4e30\u6751\u9547\u94f6\u884c","BZRCC":"\u6ee8\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","BDQYQXNSCZYH":"\u4fdd\u5b9a\u6e05\u82d1\u533a\u90a2\u519c\u5546\u6751\u9547\u94f6\u884c","BZRCU":"\u5df4\u4e2d\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","BCQZRCC":"\u5317\u5ddd\u7f8c\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","KBCG":"\u6bd4\u5229\u65f6\u8054\u5408\u94f6\u884c","BZHHCB":"\u6ee8\u5dde\u6cb3\u6d77\u6751\u9547\u94f6\u884c","ZGCBANK":"\u5317\u4eac\u4e2d\u5173\u6751\u94f6\u884c","ZPHNSCZYH":"\u535a\u4e50\u56fd\u6c11\u6751\u9547\u94f6\u884c","YYBSCB":"\u535a\u5546\u94f6\u884c","BXRXCZYH":"\u67cf\u4e61\u878d\u4fe1\u6751\u9547\u94f6\u884c","BEJXRCC":"\u5e03\u5c14\u6d25\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BDXHRCZYH":"\u4fdd\u5fb7\u53bf\u6167\u878d\u6751\u9547\u94f6\u884c","BDQYRCC":"\u4fdd\u5b9a\u5e02\u6e05\u82d1\u533a\u519c\u6751\u4fe1\u7528\u8054\u793e","BCXZVNRCC":"\u5df4\u695a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JZTHJYCZYH":"\u5b9d\u6e05\u5e7f\u76ca\u6751\u9547\u94f6\u884c","HBHACJCZYH":"\u5317\u4eac\u6000\u67d4\u878d\u5174\u6751\u9547\u94f6\u884c","BJRCB":"\u5317\u4eac\u519c\u5546\u884c","BJSYYZCZYH":"\u5317\u4eac\u987a\u4e49\u94f6\u5ea7\u6751\u9547\u94f6\u884c","BTLZMZRCC":"\u4fdd\u4ead\u9ece\u65cf\u82d7\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054","ZJQTJXHQCZYH":"\u672c\u6eaa\u79be\u4e30\u6751\u9547\u94f6\u884c","BXSBTRCC":"\u672c\u6eaa\u5e02\u5317\u53f0\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","BXNXTRCC":"\u672c\u6eaa\u5e02\u5e02\u533a\u725b\u5fc3\u53f0\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","AMBZJDYFMCZYH":"\u5305\u5934\u5e02\u6606\u90fd\u4ed1\u8499\u94f6\u6751\u9547\u94f6\u884c","BDCBANK":"\u4fdd\u5b9a\u94f6\u884c","BXSQTRCC":"\u672c\u6eaa\u5e02\u6865\u5934\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","BYXOOMRCC":"\u535a\u91ce\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","BXBANK":"\u672c\u6eaa\u5e02\u5546\u4e1a\u94f6\u884c","BPSWJFRCC":"\u5317\u7968\u5e02\u4e94\u95f4\u623f\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","BXSQPSRCC":"\u672c\u6eaa\u5e02\u5e02\u533a\u5e73\u5c71\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","BYNEHTRCC":"\u5df4\u5f66\u6dd6\u5c14\u6cb3\u5957\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZGXGRKRCC":"\u5c91\u5de9\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJHYCZYXOJV":"\u6ca7\u5dde\u76d0\u5c71\u65b0\u534e\u6751\u9547\u94f6\u884c","ZJXJFMCZYH":"\u5df4\u5f66\u6dd6\u5c14\u5e02\u4e4c\u62c9\u7279\u6751\u9547\u94f6\u884c","BJBANKCC":"\u5317\u4eac\u94f6\u884c\u4fe1\u7528\u5361\u4e2d\u5fc3","CLXPGCRCC":"\u660c\u9ece\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CJLZRCC":"\u660c\u6c5f\u9ece\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JZSZQHFCZYH":"\u660c\u56fe\u6c11\u7965\u6751\u9547\u94f6\u884c","JDLZYFDCZYH":"\u5317\u4eac\u901a\u5dde\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","JNGXBHCZYH":"\u767d\u94f6\u5e73\u5ddd\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","BXSQXDRCC":"\u672c\u6eaa\u5e02\u5e02\u533a\u5174\u8fbe\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","BSXRCC":"\u767d\u6c34\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","AHZXTYCZYH":"\u660c\u9091\u5317\u6d77\u6751\u9547\u94f6\u884c","QHDZCZYH":"\u5e38\u5b81\u73e0\u6c5f\u6751\u9547\u94f6\u884c","BCS":"\u957f\u6c99\u5e02\u5546\u4e1a\u94f6\u884c","CBCEXRCC":"\u5bdf\u5e03\u67e5\u5c14\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJLQMTCZYH":"\u5e38\u5dde\u65b0\u5317\u4e2d\u6210\u6751\u9547\u94f6\u884c","CYLCCZYH":"\u671d\u9633\u67f3\u57ce\u6751\u9547\u94f6\u884c","LCQDQZRCC":"\u671d\u9633\u5e02\u9f99\u57ce\u533a\u4e03\u9053\u6cc9\u5b50\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","RQYLSKLCZYH":"\u6210\u5b89\u9f50\u9c81\u6751\u9547\u94f6\u884c","CAXRCC":"\u6210\u5b89\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CRJYCZYH":"\u5317\u4eac\u5bc6\u4e91\u6c47\u4e30\u6751\u9547\u94f6\u884c","GXPBGMCZYH":"\u627f\u5fb7\u53bf\u6052\u5347\u6751\u9547\u94f6\u884c","CBYYCZYH":"\u6210\u90fd\u90eb\u90fd\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","CCC":"\u57ce\u5e02\u4fe1\u7528\u793e","CFYBSRCC":"\u8d64\u5cf0\u5143\u5b9d\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","CYLCQRCC":"\u671d\u9633\u5e02\u9f99\u57ce\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CGXRCC":"\u57ce\u56fa\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CXEAWRCC":"\u6210\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CCXOGWRCC":"\u8d64\u57ce\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","CSSRCC":"\u8d64\u6c34\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CCJYCZYH":"\u8d64\u57ce\u5bb6\u94f6\u6751\u9547\u94f6\u884c","CDSRCB":"\u5e38\u5fb7\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","CRCB":"\u957f\u6c99\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","LCXDYZRCC":"\u671d\u9633\u5e02\u9f99\u57ce\u533a\u897f\u5927\u8425\u5b50\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","BOCD":"\u627f\u5fb7\u94f6\u884c","BOCZ":"\u6ca7\u5dde\u94f6\u884c","BOCY":"\u671d\u9633\u94f6\u884c","CCXYQCRCC":"\u6f84\u57ce\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CZCAQRCC":"\u6f6e\u5dde\u5e02\u6f6e\u5b89\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CSCB":"\u957f\u6c99\u94f6\u884c","CYXXHLRCC":"\u671d\u9633\u53bf\u65b0\u534e\u8def\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","CLHNSCZYH":"\u5e38\u5dde\u949f\u697c\u957f\u6c5f\u6751\u9547\u94f6\u884c","ZZZCCZYH":"\u91cd\u5e86\u74a7\u5c71\u5de5\u94f6\u6751\u9547\u94f6\u884c","ZMWZQPSMTCZYH":"\u91cd\u5e86\u5f6d\u6c34\u6c11\u6cf0\u6751\u9547\u94f6\u884c","LYHNSCZYH":"\u91cd\u5e86\u5e02\u9149\u9633\u878d\u5174\u6751\u9547\u94f6\u884c","JRSNCZYH":"\u91cd\u5e86\u94dc\u6881\u6d66\u53d1\u6751\u9547\u94f6\u884c","ZXPFCZYH":"\u91cd\u5e86\u4e07\u5dde\u5efa\u4fe1\u6751\u9547\u94f6\u884c","CHBHK":"\u521b\u5174\u94f6\u884c","CXNCRCC":"\u6ca7\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","CYCNSRCC":"\u5d07\u9633\u695a\u519c\u5546\u6751\u9547\u94f6\u884c","CQWXCB":"\u91cd\u5e86\u5deb\u6eaa\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","CLJYCZYH":"\u660c\u9ece\u5bb6\u94f6\u6751\u9547\u94f6\u884c","CQRCB":"\u91cd\u5e86\u519c\u5546\u94f6\u884c","CYXLCRCC":"\u671d\u9633\u53bf\u67f3\u57ce\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","ZQNCSYCZYH":"\u91cd\u5e86\u5357\u5ddd\u77f3\u94f6\u6751\u9547\u94f6\u884c","NXHNHLSCZYH":"\u91cd\u5e86\u5fe0\u53bf\u7a20\u5dde\u6751\u9547\u94f6\u884c","CZSYCZYH":"\u5d07\u5dde\u4e0a\u94f6\u6751\u9547\u94f6\u884c","YLGMCZYH":"\u6df3\u5316\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","CXQIURCC":"\u78c1\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CCPZGXFCZYH":"\u5d07\u4ec1\u4e5d\u94f6\u6751\u9547\u94f6\u884c","CHANGLE":"\u660c\u4e50\u6751\u9547\u94f6\u884c","CJGMCB":"\u660c\u5409\u56fd\u6c11\u6751\u9547\u94f6\u884c","CDXRCC":"\u627f\u5fb7\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HNZXTNSCZYH":"\u6ca7\u53bf\u5409\u94f6\u6751\u9547\u94f6\u884c","CWSTCB":"\u82cd\u68a7\u6df1\u901a\u6751\u9547\u94f6\u884c","CWXRCC":"\u82cd\u68a7\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CZSRCC":"\u6ca7\u5dde\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","CZSRCB":"\u90f4\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","FSNHXHCZYH":"\u6210\u90fd\u53cc\u6d41\u8bda\u6c11\u6751\u9547\u94f6\u884c","CFSHSQRCC":"\u8d64\u5cf0\u5e02\u7ea2\u5c71\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CDCB":"\u6210\u90fd\u94f6\u884c","CZJTXFCB":"\u5e38\u5dde\u91d1\u575b\u5174\u798f\u6751\u9547\u94f6\u884c","CSRCB":"\u5e38\u719f\u519c\u5546\u94f6\u884c","CDSJQRCC":"\u627f\u5fb7\u5e02\u90ca\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CYSTQRCC":"\u671d\u9633\u5e02\u53cc\u5854\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CHNCRCC":"\u5de2\u6e56\u519c\u6751\u5546\u4e1a\u94f6\u884c","CHFMCB":"\u518c\u4ea8\u5bcc\u6c11\u6751\u9547\u94f6\u884c","YNXYYNSCZYH":"\u91cd\u5e86\u5df4\u5357\u6d66\u53d1\u6751\u9547\u94f6\u884c","TYXFCZYH":"\u91cd\u5e86\u5317\u789a\u7a20\u5dde\u6751\u9547\u94f6\u884c","JSJHMTCZYH":"\u91cd\u5e86\u57ce\u53e3\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","LSZYFDCZYH":"\u4ece\u6c5f\u6708\u660e\u6751\u9547\u94f6\u884c","CB":"\u6751\u9547\u94f6\u884c","CTXQCKRCC":"\u660c\u56fe\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CLXMPKRCC":"\u7b56\u52d2\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","CYXRCC":"\u671d\u9633\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","CQFM":"\u91cd\u5e86\u5bcc\u6c11\u94f6\u884c","CRCBANK":"\u91cd\u5e86\u519c\u6751\u5546\u4e1a\u94f6\u884c","CLPFCB":"\u8336\u9675\u6d66\u53d1\u6751\u9547\u94f6\u884c","CJXRCC":"\u6f84\u6c5f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CHXNGGRCC":"\u518c\u4ea8\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CDRCB":"\u6210\u90fd\u519c\u5546\u94f6\u884c","HBSZZDHFCZYH":"\u91cd\u5e86\u6c38\u5ddd\u5317\u94f6\u6751\u9547\u94f6\u884c","WJQGMCZYH":"\u5d07\u5de6\u5927\u65b0\u957f\u6c5f\u6751\u9547\u94f6\u884c","CXQLCB":"\u78c1\u53bf\u9f50\u9c81\u6751\u9547\u94f6\u884c","CHBB":"\u671d\u5174\u94f6\u884c","ZJLYYSCZYH":"\u8fbe\u5c14\u7f55\u8302\u660e\u5b89\u8054\u5408\u65d7\u5305\u5546\u6751\u9547\u94f6\u884c","ZCBHCZYH":"\u91cd\u5e86\u57ab\u6c5f\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","TAHNSCZYH":"\u91cd\u5e86\u5357\u5cb8\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","WLMQXLFCZYH":"\u91cd\u5e86\u9ed4\u6c5f\u94f6\u5ea7\u6751\u9547\u94f6\u884c","RCJYCZYH":"\u91cd\u5e86\u5e02\u5927\u6e21\u53e3\u878d\u5174\u6751\u9547\u94f6\u884c","WFDCXCZYH":"\u91cd\u5e86\u5e02\u6c99\u576a\u575d\u878d\u5174\u6751\u9547\u94f6\u884c","HNHRXLCZYH":"\u91cd\u5e86\u5e02\u6b66\u9686\u878d\u5174\u6751\u9547\u94f6\u884c","HNBTRXCZYH":"\u91cd\u5e86\u6daa\u9675\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","FJZYFDCZYH":"\u91cd\u5e86\u79c0\u5c71\u5317\u94f6\u6751\u9547\u94f6\u884c","TJBHYZCZYH":"\u91cd\u5e86\u957f\u5bff\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","CZWDRCC":"\u6ec1\u5dde\u7696\u4e1c\u519c\u6751\u5546\u4e1a\u94f6\u884c","CHXFJXRCC":"\u6df3\u5316\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","CYNCRCC":"\u5d07\u4e49\u519c\u6751\u5546\u4e1a\u94f6\u884c","CBEHQRCC":"\u9648\u5df4\u5c14\u864e\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NNWMLJCZYH":"\u8d64\u5cf0\u5e02\u5143\u5b9d\u5c71\u7389\u9f99\u6751\u9547\u94f6\u884c","XCZYFDCZYH":"\u8fbe\u62c9\u7279\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","AHXNDDCZYH":"\u8fbe\u5dde\u8fbe\u5ddd\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","DZSDCQRCC":"\u8fbe\u5dde\u5e02\u8fbe\u5ddd\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ALCNSCZYH":"\u5927\u5382\u56de\u65cf\u81ea\u6cbb\u53bf\u65b0\u534e\u6751\u9547\u94f6\u884c","DGXQNSRCC":"\u5927\u5173\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","TCKLCZYH":"\u5927\u7406\u6d31\u6e90\u957f\u6c5f\u6751\u9547\u94f6\u884c","BSYJHRCZYH":"\u5927\u7406\u5dcd\u5c71\u957f\u6c5f\u6751\u9547\u94f6\u884c","BTSRCC":"\u6cca\u5934\u5e02\u519c\u6751\u4fe1\u7528\u8054\u793e","SXYLHSHFCZYH":"\u5927\u540d\u6052\u5347\u6751\u9547\u94f6\u884c","SYNJHMCZYH":"\u5927\u8fde\u91d1\u5dde\u8054\u4e30\u6751\u9547\u94f6\u884c","SDCWHYCZYH":"\u5927\u8fde\u4fdd\u7a0e\u533a\u73e0\u6c5f\u6751\u9547\u94f6\u884c","AHSSMFCZYH":"\u5927\u8fde\u65c5\u987a\u53e3\u8499\u94f6\u6751\u9547\u94f6\u884c","DTXBPURCC":"\u5927\u7530\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HZZZDYCZYH":"\u5927\u901a\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","DYXLETRCC":"\u5927\u59da\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XJQLCZYH":"\u4e39\u6c5f\u53e3\u695a\u519c\u5546\u6751\u9547\u94f6\u884c","DZRCC":"\u5fb7\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","BDB":"\u5fb7\u5bcc\u6cf0\u94f6\u884c\u6709\u9650\u516c\u53f8","DZCBANK":"\u8fbe\u5dde\u5e02\u5546\u4e1a\u94f6\u884c","DZSTCQRCC":"\u8fbe\u5dde\u5e02\u901a\u5ddd\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DCXHEORCC":"\u90f8\u57ce\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZCXUBVRCC":"\u5b95\u660c\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DLNSCB":"\u4e1c\u8fbd\u519c\u5546\u6751\u9547\u94f6\u884c","DZXIHVRCC":"\u9053\u5b5a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BOD":"\u4e1c\u839e\u94f6\u884c","DXTWLSRCC":"\u5b9a\u897f\u5e02\u901a\u6e2d\u53bf\u9647\u5c71\u4fe1\u7528\u793e","DLTQRCC":"\u8fbe\u62c9\u7279\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DYTYCB":"\u4e1c\u6e90\u6cf0\u4e1a\u6751\u9547\u94f6\u884c","CAI":"\u4e1c\u65b9\u6c47\u7406\u94f6\u884c","DEBTRSCZYH":"\u9102\u5c14\u591a\u65af\u5e02\u4e1c\u80dc\u8499\u94f6\u6751\u9547\u94f6\u884c","DXHDCZYH":"\u4ee3\u53bf\u6cd3\u90fd\u6751\u9547\u94f6\u884c","DZZCCB":"\u5b9a\u5dde\u4e2d\u6210\u6751\u9547\u94f6\u884c","COMMMERZ":"\u5fb7\u56fd\u5546\u4e1a\u94f6\u884c","DLRCB":"\u5927\u8fde\u519c\u6751\u5546\u4e1a\u94f6\u884c","DBXPAIRCC":"\u5fb7\u4fdd\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","PDHF":"\u5927\u6d3c\u6052\u4e30\u6751\u9547\u94f6\u884c","DRXJMRCC":"\u8fbe\u65e5\u53bf\u5409\u8fc8\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","DEUTSCHE":"\u5fb7\u610f\u5fd7\u94f6\u884c","HYZJCZYH":"\u767b\u5c01\u9f50\u9c81\u6751\u9547\u94f6\u884c","DBSHMCZYH":"\u8c03\u5175\u5c71\u60e0\u6c11\u6751\u9547\u94f6\u884c","DZXICZRCC":"\u5927\u7af9\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","DXTWBLRCC":"\u5b9a\u897f\u5e02\u901a\u6e2d\u53bf\u699c\u7f57\u4fe1\u7528\u793e","DBXAIARCC":"\u4e39\u5df4\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZZSILZRCC":"\u510b\u5dde\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZNCTHCZYH":"\u6556\u6c49\u60e0\u519c\u6751\u9547\u94f6\u884c","DFHFCZYH":"\u4e1c\u65b9\u60e0\u4e30\u6751\u9547\u94f6\u884c","TZGGXFCZYH":"\u4e1c\u839e\u5927\u6717\u4e1c\u76c8\u6751\u9547\u94f6\u884c","TAYLCQNCYOV":"\u671d\u9633\u5e02\u9f99\u57ce\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","CBUJNRSCZYH":"\u4e1c\u839e\u957f\u5b89\u6751\u9547\u94f6\u884c","CFSSRCC":"\u8d64\u5cf0\u677e\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","DSRXCZYH":"\u4e1c\u5c71\u6da6\u946b\u6751\u9547\u94f6\u884c","DNRSCZYH":"\u4e1c\u5b81\u6da6\u751f\u6751\u9547\u94f6\u884c","DJCZCZYH":"\u5fb7\u6c5f\u957f\u5f81\u6751\u9547\u94f6\u884c","DYZYRCC":"\u5fb7\u9633\u5e02\u65cc\u9633\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","DLBSQZJCZYH":"\u6f6e\u5dde\u6f6e\u5b89\u957f\u6c5f\u6751\u9547\u94f6\u884c","EIS":"\u7535\u5b50\u8054\u884c\u8f6c\u6362\u4e2d\u5fc3","DGTHCB":"\u4e1c\u6e2f\u540c\u5408\u6751\u9547\u94f6\u884c","DYBANK":"\u5fb7\u9633\u5546\u4e1a\u94f6\u884c","FIRB":"\u7b2c\u4e00\u94f6\u884c","WNGMCZYH":"\u4e1c\u839e\u539a\u8857\u534e\u4e1a\u6751\u9547\u94f6\u884c","VLFNCXYHRTP":"\u4e1c\u8fbd\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CDQBJRXCZYH":"\u4e1c\u4e4c\u73e0\u7a46\u6c81\u519c\u4fe1\u5f00\u5143\u6751\u9547\u94f6\u884c","DWZMQQRCC":"\u4e1c\u4e4c\u73e0\u7a46\u6c81\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DCSFCZYH":"\u5927\u57ce\u821c\u4e30\u6751\u9547\u94f6\u884c","DTXQSVRCC":"\u5927\u540c\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BEAHK":"\u4e1c\u4e9a\u94f6\u884c\u6709\u9650\u516c\u53f8","DJXRCC":"\u5fb7\u6c5f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DXTWYGRCC":"\u5b9a\u897f\u5e02\u901a\u6e2d\u53bf\u4e49\u5c97\u4fe1\u7528\u793e","DXZZZXRCC":"\u4e1c\u4e61\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DXTWCGRCC":"\u5b9a\u897f\u5e02\u901a\u6e2d\u53bf\u57ce\u5173\u4fe1\u7528\u793e","DEHMMARCC":"\u8fbe\u5c14\u7f55\u8302\u660e\u5b89\u8054\u5408\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","TETDGQLCZYH":"\u4e1c\u5149\u9752\u9686\u6751\u9547\u94f6\u884c","DAYZRCC":"\u90fd\u5b89\u7476\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DQXSAQRCC":"\u5fb7\u94a6\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DDDYCZYH":"\u4e39\u4e1c\u798f\u6c47\u6751\u9547\u94f6\u884c","DBSSRCC":"\u8c03\u5175\u5c71\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","DXZXSCRCC":"\u5b9a\u897f\u5e02\u6f33\u53bf\u4e09\u5c94\u4fe1\u7528\u793e","DYXFCZYH":"\u4e39\u4e1c\u9f0e\u5143\u6751\u9547\u94f6\u884c","DYNCRCB":"\u5fb7\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","HKBEA":"\u4e1c\u4e9a\u94f6\u884c","BODD":"\u4e39\u4e1c\u94f6\u884c","DBXTTWRCC":"\u8fed\u90e8\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DLCZB":"\u5927\u8fde\u5f00\u53d1\u533a\u946b\u6c47\u6751\u9547\u94f6\u884c","DZBANK":"\u5fb7\u5dde\u94f6\u884c","DXALRCB":"\u5927\u5174\u5b89\u5cad\u519c\u5546\u884c","DJYJDCZYH":"\u5b89\u798f\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","DWCNSCB":"\u5927\u609f\u695a\u519c\u5546\u6751\u9547\u94f6\u884c","XJRZDXYYH":"\u5927\u897f\u6d0b\u94f6\u884c","DHYZRCC":"\u5927\u5316\u7476\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JFZWTLSCZYH":"\u5927\u51b6\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","NYHNSCZYH":"\u5927\u9091\u4ea4\u94f6\u5174\u6c11\u6751\u9547\u94f6\u884c","DXRCC":"\u4ee3\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DZXHW":"\u8fbe\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","QHMYDTCZYH":"\u9053\u771f\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","DXZXXSRCC":"\u5b9a\u897f\u5e02\u6f33\u53bf\u65b0\u5bfa\u4fe1\u7528\u793e","DXRCB":"\u5b9a\u897f\u519c\u6751\u5546\u4e1a\u94f6\u884c","JEPJMKPCJCZYH":"\u4e1c\u839e\u9ec4\u6c5f\u73e0\u6c5f\u6751\u9547\u94f6\u884c","DLXCOARCC":"\u4e1c\u5170\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GXGPCZYH":"\u4e1c\u660e\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","DYCCB":"\u4e1c\u8425\u94f6\u884c","DTSNJQJDCZYH":"\u5927\u540c\u5e02\u5357\u90ca\u533a\u4eac\u90fd\u6751\u9547\u94f6\u884c","DAQLCZYH":"\u4e1c\u8425\u6cb3\u53e3\u4e2d\u6210\u6751\u9547\u94f6\u884c","NORDLB":"\u5fb7\u56fd\u5317\u5fb7\u610f\u5fd7\u5dde\u94f6\u884c","DSBHK":"\u5927\u65b0\u94f6\u884c","DQNCRCC":"\u5927\u5e86\u519c\u6751\u5546\u4e1a\u94f6\u884c","DSBCN":"\u5927\u65b0\u94f6\u884c\uff08\u4e2d\u56fd\uff09","DGXWVCRCC":"\u5fb7\u683c\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DHMSCJCZYH":"\u91cd\u5e86\u8363\u660c\u6c47\u4e30\u6751\u9547\u94f6\u884c","DHXRCC":"\u5fb7\u5316\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DMHSCZYH":"\u6ca7\u5dde\u6d77\u5174\u65b0\u534e\u6751\u9547\u94f6\u884c","DCXZHZRCC":"\u5927\u57ce\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DCXVYERCC":"\u7a3b\u57ce\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","QXQLCZYH":"\u5fb7\u5b8f\u8292\u5e02\u957f\u6c5f\u6751\u9547\u94f6\u884c","WZZYFDCZYXYUQ":"\u4e1c\u963f\u9752\u9686\u6751\u9547\u94f6\u884c","WXVCNCSYRKH":"\u5fb7\u5dde\u9675\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","WCDZCZYH":"\u78f4\u53e3\u8499\u94f6\u6751\u9547\u94f6\u884c","DYLSCB":"\u4e1c\u8425\u83b1\u5546\u6751\u9547\u94f6\u884c","YPSHMCZYH":"\u90fd\u660c\u4e5d\u94f6\u6751\u9547\u94f6\u884c","TJBHJHCZYH":"\u90fd\u6c5f\u5830\u91d1\u90fd\u6751\u9547\u94f6\u884c","PTFMCZYH":"\u90fd\u5300\u878d\u901a\u6751\u9547\u94f6\u884c","DAHFCB":"\u5b9a\u5b89\u5408\u4e30\u6751\u9547\u94f6\u884c","DXFYCB":"\u5b9a\u5174\u4e30\u6e90\u6751\u9547\u94f6\u884c","NXPLXSHCZYH":"\u6566\u5316\u6c5f\u5357\u6751\u9547\u94f6\u884c","NBCXJXCZYH":"\u4e1c\u5e73\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","DSXRCC":"\u4e1c\u5c71\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LJBANK":"\u5927\u5e86\u5e02\u5546\u4e1a\u94f6\u884c","DYNRCB":"\u4e1c\u8425\u519c\u6751\u5546\u4e1a\u94f6\u884c","DRCBCL":"\u4e1c\u839e\u519c\u6751\u5546\u4e1a\u94f6\u884c","DXTWJCRCC":"\u5b9a\u897f\u5e02\u901a\u6e2d\u53bf\u9e21\u5ddd\u4fe1\u7528\u793e","CTTZHCZYH":"\u675c\u5c14\u4f2f\u7279\u6da6\u751f\u6751\u9547\u94f6\u884c","DLXZTARCC":"\u591a\u4f26\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DYXOVBRCC":"\u5927\u82f1\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","DBXXEQRCC":"\u7535\u767d\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DHJNCZYH":"\u695a\u96c4\u5174\u5f5d\u6751\u9547\u94f6\u884c","DQXNUCRCC":"\u5fb7\u5e86\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DRXRCC":"\u5f97\u8363\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DGXPJNRCC":"\u4e1c\u5149\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","DZXAADRCC":"\u4e39\u5be8\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DLWSCJCZYH":"\u4e1c\u839e\u864e\u95e8\u957f\u6c5f\u6751\u9547\u94f6\u884c","DLXOHRRCC":"\u5927\u8354\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","AHHNJHCZYH":"\u5927\u8fde\u666e\u5170\u5e97\u6c47\u4e30\u6751\u9547\u94f6\u884c","SYYHYACZYH":"\u5fb7\u5174\u84dd\u6d77\u6751\u9547\u94f6\u884c","EBYZRCC":"\u5ce8\u8fb9\u5f5d\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","EEGNSRCC":"\u989d\u5c14\u53e4\u7eb3\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","VTBBANK(PJSC)":"\u4fc4\u7f57\u65af\u5916\u8d38\u94f6\u884c","VQTSNCSYTLG":"\u9102\u5c14\u591a\u65af\u519c\u6751\u5546\u4e1a\u94f6\u884c","EEDSSKBSCZYH":"\u9102\u5c14\u591a\u65af\u5e02\u5eb7\u5df4\u4ec0\u6751\u9547\u94f6\u884c","EEDSSHTCZYH":"\u9102\u5c14\u591a\u65af\u5e02\u7f55\u53f0\u6751\u9547\u94f6\u884c","ESYZRCC":"\u5ce8\u5c71\u5f5d\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJJSLHCZYH":"\u9102\u5c14\u591a\u65af\u5e02\u5929\u9a84\u8499\u94f6\u6751\u9547\u94f6\u884c","YJYCCJCZYH":"\u9102\u5c14\u591a\u65af\u5e02\u94c1\u897f\u8499\u94f6\u6751\u9547\u94f6\u884c","YXHTQXHCZYH":"\u6566\u714c\u5e02\u91d1\u76db\u6751\u9547\u94f6\u884c","ETKXSYCZYH":"\u9102\u6258\u514b\u5174\u751f\u6e90\u6751\u9547\u94f6\u884c","EJNQRCC":"\u989d\u6d4e\u7eb3\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","EMXRCC":"\u989d\u654f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","EWWZMZZZHBX":"\u4fdd\u4ead\u9ece\u65cf\u82d7\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XHBSCZYH":"\u6210\u90fd\u9752\u767d\u6c5f\u878d\u5174\u6751\u9547\u94f6\u884c","ORBANK":"\u9102\u5c14\u591a\u65af\u94f6\u884c","ETKQHZCB":"\u9102\u6258\u514b\u65d7\u6c47\u6cfd\u6751\u9547\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","EMSSRCC":"\u5ce8\u7709\u5c71\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","CXZYFDCZYH":"\u9102\u6e29\u514b\u5305\u5546\u6751\u9547\u94f6\u884c","CYBHCZYH":"\u9102\u6258\u514b\u524d\u65d7\u8499\u94f6\u6751\u9547\u94f6\u884c","UNIONRCB":"\u6751\u9547\u8054\u5408\u94f6\u884c","AHGDYZCZYH":"\u4e1c\u8425\u878d\u548c\u6751\u9547\u94f6\u884c","EWKZRCC":"\u9102\u6e29\u514b\u65cf\u81ea\u6cbb\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","RLHNSCZYH":"\u8303\u53bf\u5fb7\u5546\u6751\u9547\u94f6\u884c","JJLSZYCZYH":"\u5206\u5b9c\u4e5d\u94f6\u6751\u9547\u94f6\u884c","JCXTXCZYH":"\u6148\u5229\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","SZSSYCZYH":"\u5927\u7406\u5bbe\u5ddd\u957f\u6c5f\u6751\u9547\u94f6\u884c","DXXRCC":"\u5b9a\u5174\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","WCLNCZYXAJA":"\u6c7e\u897f\u53bf\u592a\u884c\u6751\u9547\u94f6\u884c","HHHTSXCMYCZYH":"\u6c7e\u897f\u53bf\u4ebf\u901a\u6751\u9547\u94f6\u884c","FCSYCB":"\u4e30\u57ce\u987a\u94f6\u6751\u9547\u94f6\u884c","FLNSCZYH":"\u5b89\u5fbd\u77f3\u53f0\u626c\u5b50\u6751\u9547\u94f6\u884c","XDGCCZYH":"\u5b89\u5fbd\u5ba3\u5dde\u6e56\u5546\u6751\u9547\u94f6\u884c","HNXTXHCZYH":"\u5b89\u56fe\u519c\u5546\u6751\u9547\u94f6\u884c","BJDXJYCZYH":"\u51e4\u5188\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","BYXNDYRCC":"\u5df4\u5f66\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CYLCSCRCC":"\u671d\u9633\u5e02\u9f99\u57ce\u533a\u6c88\u627f\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","AHFYLMCZYH":"\u91cd\u5e86\u4e5d\u9f99\u5761\u6c11\u6cf0\u6751\u9547\u94f6\u884c","AHQXRCC":"\u963f\u5408\u5947\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","FZSRCC":"\u4e30\u9547\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FXLZCB":"\u8d39\u53bf\u6881\u90b9\u6751\u9547\u94f6\u884c","TJXQZYFDCZYH":"\u7e41\u5cd9\u53bf\u65b0\u7530\u6751\u9547\u94f6\u884c","TGXXTCZYH":"\u51e4\u7fd4\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","BTSKDLMYCZYH":"\u5949\u65b0\u4e5d\u94f6\u6751\u9547\u94f6\u884c","FSRCU":"\u4f5b\u5c71\u5e02\u987a\u5fb7\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FRCB":"\u4f5b\u5c71\u519c\u5546\u884c","BDMCQLFCZYH":"\u798f\u5efa\u798f\u5b89\u6e1d\u519c\u5546\u6751\u9547\u94f6\u884c","FJHACXCZYH":"\u798f\u5efa\u534e\u5b89\u957f\u4fe1\u6751\u9547\u94f6\u884c","SPLHZYCZYH":"\u798f\u5efa\u5efa\u9633\u745e\u72ee\u6751\u9547\u94f6\u884c","ZDMSCZYH":"\u798f\u5efa\u9f99\u6d77\u6cf0\u9686\u6751\u9547\u94f6\u884c","ZSDFZJCZYH":"\u4e39\u5be8\u5bcc\u6c11\u6751\u9547\u94f6\u884c","RZYCCZYH":"\u5ce8\u7709\u5c71\u4e2d\u6210\u6751\u9547\u94f6\u884c","GJHNSCZYH":"\u798f\u5efa\u5357\u5b89\u6c47\u901a\u6751\u9547\u94f6\u884c","FJPTRCB":"\u798f\u5efa\u8386\u7530\u519c\u6751\u5546\u4e1a\u94f6\u884c","FJPTRCC":"\u798f\u5efa\u5e73\u6f6d\u519c\u6751\u5546\u4e1a\u94f6\u884c","FPXEMKRCC":"\u4f5b\u576a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJWLLHCZYH":"\u798f\u5efa\u6c99\u53bf\u6e1d\u519c\u5546\u6751\u9547\u94f6\u884c","YJHLJGCZYH":"\u798f\u5efa\u77f3\u72ee\u6e1d\u519c\u5546\u6751\u9547\u94f6\u884c","FJZZRCB":"\u798f\u5efa\u6f33\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","FJLJNCCB":"\u798f\u5efa\u8fde\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","SCOTIA":"\u4e30\u4e1a\u94f6\u884c","FJFDHXCB":"\u798f\u5efa\u798f\u9f0e\u6052\u5174\u6751\u9547\u94f6\u884c","ZZPFCZYH":"\u798f\u5efa\u5b81\u5316\u6210\u529f\u6751\u9547\u94f6\u884c","FJZAHTCB":"\u798f\u5efa\u8bcf\u5b89\u6c47\u901a\u6751\u9547\u94f6\u884c","FJNPRCB":"\u798f\u5efa\u5357\u5e73\u519c\u6751\u5546\u4e1a\u94f6\u884c","FGXSHVRCC":"\u6276\u6c9f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FJYTCXCZYH":"\u798f\u5efa\u6c38\u6cf0\u957f\u4fe1\u6751\u9547\u94f6\u884c","FQXRCC":"\u5c01\u4e18\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FKXRBXRCC":"\u5c01\u5f00\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FCGSQRCC":"\u9632\u57ce\u6e2f\u5e02\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DZHJZJCZYH":"\u4f5b\u5c71\u5357\u6d77\u65b0\u534e\u6751\u9547\u94f6\u884c","FJSXRCB":"\u798f\u5efa\u6c99\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","FJSMRCB":"\u798f\u5efa\u4e09\u660e\u519c\u6751\u5546\u4e1a\u94f6\u884c","FJZPRCC":"\u798f\u5efa\u6f33\u5e73\u519c\u6751\u5546\u4e1a\u94f6\u884c","FJDHCGCZYH":"\u5bdf\u54c8\u5c14\u53f3\u7ffc\u524d\u65d7\u8499\u94f6\u6751\u9547\u94f6\u884c","HNLHXJCZYH":"\u6d6e\u6881\u519c\u5546\u6751\u9547\u94f6\u884c","DZHMCJCZYH":"\u6276\u7ee5\u6df1\u901a\u6751\u9547\u94f6\u884c","DLXFLWRCC":"\u4e39\u68f1\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","UOB":"\u5927\u534e\u94f6\u884c","DAXRCC":"\u5b9a\u5b89\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DTXRRCC":"\u5927\u540c\u5e02\u65b0\u8363\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e\u53cb\u8c0a\u4fe1\u7528\u793e","TRFYCZYH":"\u798f\u5efa\u5efa\u74ef\u745e\u72ee\u6751\u9547\u94f6\u884c","HNYYCZYXYYK":"\u629a\u987a\u987a\u57ce\u629a\u94f6\u6751\u9547\u94f6\u884c","YAYCHMCZYH":"\u629a\u987a\u671b\u82b1\u629a\u94f6\u6751\u9547\u94f6\u884c","FCJYCZYH":"\u961c\u57ce\u5bb6\u94f6\u6751\u9547\u94f6\u884c","FZNCRCC":"\u629a\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","FYHMCZYH":"\u6276\u4f59\u60e0\u6c11\u6751\u9547\u94f6\u884c","FSXSMRCC":"\u629a\u987a\u53bf\u4e0a\u9a6c\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","FCXRCC":"\u65b9\u57ce\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","KMDCZCCZYH":"\u5bcc\u6c11\u6d66\u53d1\u6751\u9547\u94f6\u884c","FNZYFDCB":"\u961c\u5357\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","FXCB":"\u961c\u65b0\u94f6\u884c","FSXWZJRCC":"\u51e4\u5c71\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FJLYRCC":"\u798f\u5efa\u9f99\u5ca9\u519c\u6751\u5546\u4e1a\u94f6\u884c","FJQZJNCB":"\u798f\u5efa\u6cc9\u5dde\u53f0\u5546\u6295\u8d44\u533a\u664b\u519c\u5546\u6751\u9547\u94f6\u884c","RFSFSSQYCZYH":"\u629a\u987a\u5e02\u6e05\u539f\u6751\u9547\u94f6\u884c","FYXUUBRCC":"\u5bcc\u6e90\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LCL":"\u6cd5\u56fd\u91cc\u6602\u4fe1\u8d37\u94f6\u884c","FJJJRCC":"\u798f\u5efa\u664b\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","FSXLGRCC":"\u629a\u987a\u53bf\u62c9\u53e4\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","FXXEFPRCC":"\u5949\u65b0\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FJSRCC":"\u5bcc\u9526\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FJWPHXCZYH":"\u798f\u5efa\u6b66\u5e73\u676d\u5174\u6751\u9547\u94f6\u884c","FPXDDARCC":"\u961c\u5e73\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FGXAIXRCC":"\u4f5b\u5188\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FYSJDCZYH":"\u6c7e\u9633\u5e02\u4e5d\u90fd\u6751\u9547\u94f6\u884c","FYSNDARCC":"\u6276\u4f59\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YXCJZCCZYH":"\u629a\u987a\u4e1c\u6d32\u629a\u94f6\u6751\u9547\u94f6\u884c","FYZQRCC":"\u961c\u9633\u988d\u6cc9\u519c\u6751\u5546\u4e1a\u94f6\u884c","FXMGZRCC":"\u961c\u65b0\u8499\u53e4\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FSXBFYCZYH":"\u6ca7\u5dde\u5e02\u8fd0\u6cb3\u9752\u9686\u6751\u9547\u94f6\u884c","ZSSYCZYH":"\u57ce\u56fa\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","FDSRCC":"\u798f\u9f0e\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FBBHK":"\u5bcc\u90a6\u94f6\u884c\uff08\u9999\u6e2f\uff09","FXRCB":"\u961c\u65b0\u519c\u6751\u5546\u4e1a\u94f6\u884c","FXRCC":"\u8303\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FSXSVQRCC":"\u65b9\u5c71\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","TJBHDSCZYH":"\u798f\u5efa\u8fde\u57ce\u676d\u5174\u6751\u9547\u94f6\u884c","FDB":"\u5bcc\u6ec7\u94f6\u884c","BNPP":"\u6cd5\u56fd\u5df4\u9ece\u94f6\u884c","FJFQHTRCC":"\u798f\u5efa\u798f\u6e05\u6c47\u901a\u519c\u6751\u5546\u4e1a\u94f6\u884c","FKXZDORCC":"\u6cd5\u5e93\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","EEDSSTJMYCZYH":"\u623f\u53bf\u695a\u519c\u5546\u6751\u9547\u94f6\u884c","FJHXBC":"\u798f\u5efa\u6d77\u5ce1\u94f6\u884c","FJAX":"\u798f\u5efa\u5b89\u6eaa\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SXZSCYCZYH":"\u798f\u5efa\u8fde\u6c5f\u6052\u6b23\u6751\u9547\u94f6\u884c","FSDZFYCZYH":"\u798f\u5efa\u95fd\u6e05\u745e\u72ee\u6751\u9547\u94f6\u884c","FSXSWRCC":"\u629a\u987a\u53bf\u77f3\u6587\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","HMZYFDCZYH":"\u961c\u5b81\u6c11\u751f\u6751\u9547\u94f6\u884c","FYZHRCC":"\u961c\u9633\u988d\u6dee\u519c\u6751\u5546\u4e1a\u94f6\u884c","FAB":"\u798f\u5efa\u4e9a\u6d32\u94f6\u884c","SGLE":"\u6cd5\u56fd\u5174\u4e1a\u94f6\u884c","FHXRCC":"\u798f\u6d77\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FXXSJZRCC":"\u961c\u65b0\u53bf\u5341\u5bb6\u5b50\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","FSXGDXRCC":"\u5bcc\u987a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FASRCC":"\u798f\u5b89\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FYXPNARCC":"\u5bcc\u8574\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FJJLCGCB":"\u798f\u5efa\u5c06\u4e50\u6210\u529f\u6751\u9547\u94f6\u884c","FJNX":"\u798f\u5efa\u7701\u519c\u6751\u4fe1\u7528\u793e\u8054\u5408\u793e","FSCB":"\u629a\u987a\u94f6\u884c","FMXRCC":"\u5bcc\u6c11\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FYXQOHRCC":"\u5bcc\u88d5\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FSXZDRCC":"\u629a\u987a\u53bf\u7ae0\u515a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","FJMHMBCB":"\u798f\u5efa\u95fd\u4faf\u6c11\u672c\u6751\u9547\u94f6\u884c","FSVB":"\u4e30\u5357\u821c\u4e30\u6751\u9547\u94f6\u884c","FJLYHRCZYH":"\u8d64\u6c34\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","WSMGCJCZYH":"\u5949\u8282\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","YNXGLLYNSCZYH":"\u798f\u5efa\u6cf0\u5b81\u664b\u519c\u5546\u6751\u9547\u94f6\u884c","FNXCWNRCC":"\u629a\u5b81\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","FZDXFMCZYH":"\u629a\u5dde\u4e1c\u4e61\u5bcc\u6c11\u6751\u9547\u94f6\u884c","FBBANK":"\u5bcc\u90a6\u534e\u4e00\u94f6\u884c","FNXMNLRCC":"\u5bcc\u5b81\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FJFQTLCZYH":"\u798f\u5efa\u798f\u6e05\u6cf0\u9686\u6751\u9547\u94f6\u884c","FJXLJNSCZYH":"\u798f\u5efa\u65b0\u7f57\u664b\u519c\u5546\u6751\u9547\u94f6\u884c","NATIXIS":"\u6cd5\u56fd\u5916\u8d38\u94f6\u884c","FSXDSLRCC":"\u629a\u987a\u53bf\u4e1c\u56db\u8def\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","FJXFCZYH":"\u5bcc\u9526\u5e78\u798f\u6751\u9547\u94f6\u884c","FYSCVMRCC":"\u6c7e\u9633\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","PLZZRXCZYH":"\u798f\u5efa\u6c38\u5b89\u6c47\u4e30\u6751\u9547\u94f6\u884c","FUBB":"\u5bcc\u90a6\u94f6\u884c","FJNDRCC":"\u798f\u5efa\u5b81\u5fb7\u519c\u6751\u5546\u4e1a\u94f6\u884c","FCGFCQRCC":"\u9632\u57ce\u6e2f\u5e02\u9632\u57ce\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FJCLRCC":"\u798f\u5efa\u957f\u4e50\u519c\u6751\u5546\u4e1a\u94f6\u884c","FSGMSYCB":"\u4f5b\u5c71\u9ad8\u660e\u987a\u94f6\u6751\u9547\u94f6\u884c","FXXXMZRCC":"\u80a5\u4e61\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZYHTCZYH":"\u798f\u5efa\u5fb7\u5316\u6210\u529f\u6751\u9547\u94f6\u884c","FJSXCXCZYH":"\u798f\u5efa\u677e\u6eaa\u957f\u4fe1\u6751\u9547\u94f6\u884c","FJLHRCB":"\u798f\u5efa\u9f99\u6d77\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","FGZYCB":"\u6276\u6c9f\u90d1\u94f6\u6751\u9547\u94f6\u884c","SHBSFMCZYH":"\u798f\u5efa\u4ed9\u6e38\u745e\u72ee\u6751\u9547\u94f6\u884c","FJZPMTCB":"\u798f\u5efa\u6f33\u5e73\u6c11\u6cf0\u6751\u9547\u94f6\u884c","KMMJPZCCZYH":"\u798f\u5efa\u957f\u4e50\u6cf0\u9686\u6751\u9547\u94f6\u884c","FPXTYURCC":"\u5bcc\u5e73\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FQFMCB":"\u798f\u6cc9\u5bcc\u6c11\u6751\u9547\u94f6\u884c","FGXBQYRCC":"\u798f\u8d21\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FJNARCC":"\u798f\u5efa\u5357\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","FJDTJNSCZYH":"\u798f\u5efa\u5927\u7530\u664b\u519c\u5546\u6751\u9547\u94f6\u884c","QWXXTCZYH":"\u961c\u5e73\u5927\u5546\u6751\u9547\u94f6\u884c","FJJZRSCZYH":"\u9102\u5c14\u591a\u65af\u5e02\u5854\u62c9\u58d5\u91d1\u8c37\u6751\u9547\u94f6\u884c","FSXSCXRCC":"\u629a\u677e\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FJFZRCB":"\u798f\u5efa\u798f\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","FCRCB":"\u51e4\u57ce\u5e02\u57ce\u5e02\u4fe1\u7528\u793e","FSSSCQRCC":"\u629a\u987a\u5e02\u987a\u57ce\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FJSSRCB":"\u798f\u5efa\u77f3\u72ee\u519c\u6751\u5546\u4e1a\u94f6\u884c","FJSHRCB":"\u798f\u5efa\u4e0a\u676d\u519c\u6751\u5546\u4e1a\u94f6\u884c","FFXRCC":"\u6276\u98ce\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DPHNSCZYH":"\u798f\u5efa\u653f\u548c\u6cf0\u9686\u6751\u9547\u94f6\u884c","PGPFKJHCZYH":"\u961c\u5eb7\u6d25\u6c47\u6751\u9547\u94f6\u884c","YFHDCZYH":"\u961c\u65b0\u519c\u5546\u6751\u9547\u94f6\u884c","LZGLXHCZYH":"\u5bcc\u8574\u4e2d\u6210\u6751\u9547\u94f6\u884c","CCEDNSCZYH":"\u7518\u8083\u6cfe\u5ddd\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","JYRCU":"\u7518\u8083\u9756\u8fdc\u519c\u6751\u5546\u4e1a\u94f6\u884c","GZTXRCB":"\u8d35\u5dde\u6850\u6893\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GDYJRCB":"\u5e7f\u4e1c\u9633\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","NYBANK":"\u5e7f\u4e1c\u5357\u7ca4\u94f6\u884c","BGB":"\u5e7f\u897f\u5317\u90e8\u6e7e\u94f6\u884c","GDLCRCB":"\u5e7f\u4e1c\u9f99\u5ddd\u519c\u6751\u5546\u4e1a\u94f6\u884c","GXMSIDMRCC":"\u5e7f\u897f\u9a6c\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","GZSCSJSCCC":"\u76d6\u5dde\u5e02\u57ce\u5e02\u5efa\u8bbe\u4fe1\u7528\u5408\u4f5c\u793e","CSFMCZYH":"\u7518\u8083\u897f\u56fa\u91d1\u57ce\u6751\u9547\u94f6\u884c","GZSRCC":"\u9ad8\u5dde\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HJRHCZYH":"\u4e2a\u65e7\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","FJSXYNSCZYH":"\u8c37\u57ce\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","GAXQB":"\u8d35\u5b89\u65b0\u533a\u53d1\u5c55\u6751\u9547\u94f6\u884c","GDQXRCB":"\u5e7f\u4e1c\u6e05\u65b0\u519c\u6751\u5546\u4e1a\u94f6\u884c","GLGMCZYH":"\u6842\u6797\u56fd\u6c11\u6751\u9547\u94f6\u884c","GXFCRCC":"\u5e7f\u897f\u5bcc\u5ddd\u519c\u6751\u5546\u4e1a\u94f6\u884c","GXGLLJRCC":"\u5e7f\u897f\u6842\u6797\u6f13\u6c5f\u519c\u6751\u5408\u4f5c\u94f6\u884c","GZSCCC":"\u76d6\u5dde\u5e02\u57ce\u5e02\u4fe1\u7528\u5408\u4f5c\u793e","GSZLRCB":"\u7518\u8083\u5e84\u6d6a\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GSGLRCB":"\u7518\u8083\u53e4\u6d6a\u519c\u6751\u5546\u4e1a\u94f6\u884c","GSNXRCC":"\u7518\u8083\u5b81\u53bf\u519c\u6751\u5408\u4f5c\u94f6\u884c","GSYMRCB":"\u7518\u8083\u7389\u95e8\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SDJXLHCZYH":"\u516c\u4e3b\u5cad\u6d66\u53d1\u6751\u9547\u94f6\u884c","GXYZRCC":"\u5e7f\u897f\u5b9c\u5dde\u519c\u6751\u5408\u4f5c\u94f6\u884c","GDHSCZYH":"\u5f53\u9633\u5174\u798f\u6751\u9547\u94f6\u884c","FMBANK":"\u4e30\u6ee1\u60e0\u6c11\u6751\u9547\u94f6\u884c","GHXRCC":"\u5e7f\u6cb3\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GZNCSYYH":"\u7518\u5b5c\u519c\u6751\u5546\u4e1a\u94f6\u884c","GTCTHCB":"\u53e4\u7530\u523a\u6850\u7ea2\u6751\u9547\u94f6\u884c","GSSDRCB":"\u7518\u8083\u5c71\u4e39\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GYXEVIRCC":"\u9ad8\u9633\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","GDDPRCB":"\u5e7f\u4e1c\u5927\u57d4\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GSCXRCB":"\u7518\u8083\u5d07\u4fe1\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GHB":"\u5e7f\u4e1c\u534e\u5174\u94f6\u884c","GAXRCC":"\u56fa\u5b89\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GLXAIURCC":"\u768b\u5170\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GZB":"\u8d63\u5dde\u94f6\u884c","GZNCRCC":"\u8d63\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZLLFCZYH":"\u56fa\u9633\u5305\u5546\u6751\u9547\u94f6\u884c","GLHSCB":"\u5173\u5cad\u6052\u5347\u6751\u9547\u94f6\u884c","GLXCDZRCC":"\u5de9\u7559\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XDZCCZYH":"\u5e7f\u660c\u5357\u94f6\u6751\u9547\u94f6\u884c","HPXASXRCC":"\u5e7f\u4e1c\u548c\u5e73\u519c\u6751\u5546\u4e1a\u94f6\u884c","DDFHCZYH":"\u5e7f\u4e1c\u666e\u5b81\u6c47\u6210\u6751\u9547\u94f6\u884c","JAHZCZYH":"\u5e7f\u4e1c\u82f1\u5fb7\u6cf0\u9686\u6751\u9547\u94f6\u884c","GXLCHRRRCC":"\u5e7f\u897f\u7075\u5ddd\u519c\u6751\u5408\u4f5c\u94f6\u884c","GPXRCC":"\u5e7f\u5e73\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GJSHZCZYH":"\u53e4\u4ea4\u5e02\u6c47\u6cfd\u6751\u9547\u94f6\u884c","GDHJRCB":"\u5e7f\u4e1c\u6000\u96c6\u519c\u6751\u5546\u4e1a\u94f6\u884c","GSMQRCB":"\u7518\u8083\u6c11\u52e4\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GSLZRCB":"\u7518\u8083\u4e34\u6d2e\u519c\u6751\u5546\u4e1a\u94f6\u884c","GSKXRCB":"\u7518\u8083\u5eb7\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","JZHSCZYH":"\u5e7f\u897f\u6d66\u5317\u56fd\u6c11\u6751\u9547\u94f6\u884c","JKHGXSLGMCZYH":"\u5e7f\u897f\u4e0a\u6797\u56fd\u6c11\u6751\u9547\u94f6\u884c","JSZHDWCZYH":"\u5149\u6cfd\u523a\u6850\u7ea2\u6751\u9547\u94f6\u884c","GXXZRCC":"\u5e7f\u897f\u8c61\u5dde\u519c\u6751\u5408\u4f5c\u94f6\u884c","GDZJRCB":"\u5e7f\u4e1c\u7d2b\u91d1\u519c\u6751\u5546\u4e1a\u94f6\u884c","LMRBANK":"\u5e7f\u4e1c\u9f99\u95e8\u519c\u6751\u5546\u4e1a\u94f6\u884c","GHSRCC":"\u6839\u6cb3\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GDXYRCB":"\u5e7f\u4e1c\u4fe1\u5b9c\u519c\u6751\u5546\u4e1a\u94f6\u884c","GDOYNSB":"\u5e7f\u4e1c\u7fc1\u6e90\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GSJNRCB":"\u7518\u8083\u9759\u5b81\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GXMSJGDRCC":"\u5e7f\u897f\u8499\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","GSJCRCB":"\u7518\u8083\u6cfe\u5ddd\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GHXSJJRCC":"\u5e7f\u6cb3\u53bf\u4e09\u7532\u96c6\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","NJMSCZYH":"\u56fa\u59cb\u5929\u9a84\u6751\u9547\u94f6\u884c","GSLXRCU":"\u7518\u8083\u9647\u897f\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","DCJYCZYH":"\u5e7f\u897f\u9646\u5ddd\u67f3\u94f6\u6751\u9547\u94f6\u884c","GXRSLYCB":"\u5e7f\u897f\u878d\u6c34\u67f3\u94f6\u6751\u9547\u94f6\u884c","GXRXGYCZYH":"\u5e7f\u897f\u5bb9\u53bf\u6842\u94f6\u6751\u9547\u94f6\u884c","WHYRCZYH":"\u5e7f\u897f\u85e4\u53bf\u6842\u94f6\u6751\u9547\u94f6\u884c","GXYFRCC":"\u5e7f\u897f\u6c38\u798f\u519c\u6751\u5408\u4f5c\u94f6\u884c","GXTDRQGRCC":"\u5e7f\u897f\u7530\u4e1c\u519c\u6751\u5546\u4e1a\u94f6\u884c","GZCTHCZYH":"\u5e7f\u897f\u5174\u4e1a\u67f3\u94f6\u6751\u9547\u94f6\u884c","GSLXRCB":"\u7518\u8083\u793c\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GSQARCB":"\u7518\u8083\u79e6\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GASGAQRCC":"\u5e7f\u5b89\u5e02\u5e7f\u5b89\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GDLZRCB":"\u5e7f\u4e1c\u96f7\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","GDFSRCB":"\u5e7f\u4e1c\u4e30\u987a\u519c\u6751\u5546\u4e1a\u94f6\u884c","FCFYCZYH":"\u5e7f\u4e1c\u56db\u4f1a\u6cf0\u9686\u6751\u9547\u94f6\u884c","GXPXRCC":"\u5e7f\u897f\u51ed\u7965\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHSTYZCZYH":"\u5e7f\u5dde\u767d\u4e91\u6c11\u6cf0\u6751\u9547\u94f6\u884c","KLMYJLGMCZYH":"\u5e7f\u5dde\u82b1\u90fd\u7a20\u5dde\u6751\u9547\u94f6\u884c","SCHMCZYH":"\u8d35\u5b9a\u6052\u5347\u6751\u9547\u94f6\u884c","YCYLXFCZYH":"\u6842\u9633\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","YYBSCZYH":"\u53e4\u4ea4\u5e02\u961c\u6c11\u6751\u9547\u94f6\u884c","JSJNSYCZYH":"\u5e7f\u4e1c\u6069\u5e73\u6c47\u4e30\u6751\u9547\u94f6\u884c","GZYQBANK":"\u8d35\u5dde\u4f59\u5e86\u519c\u6751\u5546\u4e1a\u94f6\u884c","GXHZGDRCC":"\u5e7f\u897f\u8d3a\u5dde\u6842\u4e1c\u519c\u6751\u5408\u4f5c\u94f6\u884c","GASYRCB":"\u5e7f\u5b89\u601d\u6e90\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GXPLRCC":"\u5e7f\u897f\u5e73\u4e50\u519c\u6751\u5408\u4f5c\u94f6\u884c","GDJLRCB":"\u5e7f\u4e1c\u8549\u5cad\u519c\u6751\u5546\u4e1a\u94f6\u884c","YQXHMCZYH":"\u5e7f\u5dde\u4ece\u5316\u67f3\u94f6\u6751\u9547\u94f6\u884c","YZGLZCCZYH":"\u5e7f\u4e30\u5e7f\u4fe1\u6751\u9547\u94f6\u884c","BJFZCZYH":"\u5e7f\u897f\u535a\u767d\u67f3\u94f6\u6751\u9547\u94f6\u884c","BQXPMTRCC":"\u62dc\u6cc9\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HZBBDYCZYH":"\u6148\u6eaa\u6c11\u751f\u6751\u9547\u94f6\u884c","GZMJRCB":"\u8d35\u5dde\u9ebb\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","KBS":"\u56fd\u6c11\u94f6\u884c\uff08\u4e2d\u56fd\uff09\u6709\u9650\u516c\u53f8","GZRC":"\u8d35\u5dde\u9ed4\u897f\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GSYZRCC":"\u7518\u8083\u6986\u4e2d\u519c\u6751\u5408\u4f5c\u94f6\u884c","GSDHRCB":"\u7518\u8083\u6566\u714c\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GXTLRCC":"\u5e7f\u897f\u7530\u6797\u519c\u6751\u5546\u4e1a\u94f6\u884c","GRCB":"\u5e7f\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","GXZXRCC":"\u5e7f\u897f\u5c91\u6eaa\u519c\u6751\u5546\u4e1a\u94f6\u884c","GDHYRCB":"\u5e7f\u4e1c\u6cb3\u6e90\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GYXRCB":"\u6842\u9633\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GYBYDXCZYH":"\u8d35\u9633\u767d\u4e91\u5fb7\u4fe1\u6751\u9547\u94f6\u884c","GNXDXMRCC":"\u5e7f\u5b81\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GDMMRCB":"\u5e7f\u4e1c\u8302\u540d\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","CDB":"\u56fd\u5bb6\u5f00\u53d1\u94f6\u884c","GZALBANK":"\u8d35\u5dde\u5b89\u9f99\u519c\u6751\u5546\u4e1a\u94f6\u884c","GCJYCZYH":"\u6545\u57ce\u5bb6\u94f6\u6751\u9547\u94f6\u884c","GDJXRCB":"\u5e7f\u4e1c\u63ed\u897f\u519c\u6751\u5546\u4e1a\u94f6\u884c","CGB":"\u5e7f\u53d1\u94f6\u884c\u501f\u5457","GZHPRCB":"\u8d35\u5dde\u9ec4\u5e73\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GXXARCC":"\u5e7f\u897f\u5174\u5b89\u519c\u6751\u5408\u4f5c\u94f6\u884c","GXLGRCC":"\u5e7f\u897f\u4e34\u6842\u519c\u6751\u5546\u4e1a\u94f6\u884c","GSMXRCB":"\u7518\u8083\u5cb7\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","GXXLRCC":"\u5e7f\u897f\u897f\u6797\u519c\u6751\u5546\u4e1a\u94f6\u884c","GZSCZCSCCC":"\u76d6\u5dde\u5e02\u8fb0\u5dde\u57ce\u5e02\u4fe1\u7528\u5408\u4f5c\u793e","GXRCU":"\u5e7f\u897f\u58ee\u65cf\u81ea\u6cbb\u533a\u519c\u6751\u4fe1\u7528\u793e\u8054\u5408\u793e","GXRCC":"\u53e4\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XHSNCZYH":"\u5e7f\u897f\u6842\u5e73\u6842\u94f6\u6751\u9547\u94f6\u884c","GXZPRCC":"\u5e7f\u897f\u662d\u5e73\u519c\u6751\u5546\u4e1a\u94f6\u884c","PSXBPJYCZYH":"\u5e7f\u5143\u5e02\u5305\u5546\u8d35\u6c11\u6751\u9547\u94f6\u884c","FJCLTLCZYH":"\u5e7f\u5143\u5e02\u8d35\u5546\u6751\u9547\u94f6\u884c","ZJDHDSCZYH":"\u5e7f\u5dde\u9ec4\u57d4\u878d\u548c\u6751\u9547\u94f6\u884c","GTSHBANK":"\u56fd\u6cf0\u4e16\u534e\u94f6\u884c\uff08\u4e2d\u56fd\uff09\u6709\u9650\u516c\u53f8","ZJRCB":"\u8d35\u5dde\u7ec7\u91d1\u519c\u6751\u5546\u4e1a\u94f6\u884c","GZQZRCB":"\u8d35\u5dde\u6e05\u9547\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GZSHRCB":"\u8d35\u5dde\u4e09\u7a57\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GZDJNCSYYH":"\u8d35\u5dde\u5fb7\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","GXDXCTERCC":"\u5e7f\u897f\u5927\u65b0\u519c\u6751\u5546\u4e1a\u94f6\u884c","GDPYRCB":"\u5e7f\u4e1c\u5e73\u8fdc\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GDPNRCB":"\u5e7f\u4e1c\u666e\u5b81\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GSGTRCB":"\u7518\u8083\u9ad8\u53f0\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GYXFRMRCC":"\u9ad8\u9091\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","GFGXCB":"\u5e7f\u4e30\u5e7f\u4fe1\u6751\u9547\u94f6\u884c\u5e7f\u573a\u652f\u884c","WSMFCZYH":"\u5e7f\u897f\u6842\u5e73\u6751\u9547\u94f6\u884c","QJFYFDCZYH":"\u5e7f\u897f\u5e73\u5357\u6842\u94f6\u6751\u9547\u94f6\u884c","GZXRRCB":"\u8d35\u5dde\u5174\u4ec1\u519c\u6751\u5546\u4e1a\u94f6\u884c","GZHPHMCZYH":"\u5e7f\u5dde\u9ec4\u57d4\u60e0\u6c11\u6751\u9547\u94f6\u884c","GSCNSCZYH":"\u5b89\u5fbd\u90ce\u6eaa\u65b0\u534e\u6751\u9547\u94f6\u884c","GLRCC":"\u679c\u6d1b\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GQNCRCB":"\u5171\u9752\u519c\u6751\u5546\u4e1a\u94f6\u884c","GXBSYJRCC":"\u5e7f\u897f\u767e\u8272\u53f3\u6c5f\u519c\u6751\u5408\u4f5c\u94f6\u884c","GXHXGSCB":"\u5e7f\u897f\u6a2a\u53bf\u6842\u5546\u6751\u9547\u94f6\u884c","GXJYCZYH":"\u8d35\u6eaa\u4e5d\u94f6\u6751\u9547\u94f6\u884c","GTXXAWRCC":"\u53e4\u7530\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GXSLRCC":"\u5e7f\u897f\u4e0a\u6797\u519c\u6751\u5546\u4e1a\u94f6\u884c","GSHNRCB":"\u7518\u8083\u4f1a\u5b81\u519c\u6751\u5546\u4e1a\u94f6\u884c","GDXOBURCC":"\u8d35\u5fb7\u53bf\u4fe1\u7528\u8054\u793e","GSDLZNZRCC":"\u8d21\u5c71\u72ec\u9f99\u65cf\u6012\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GYGSB":"\u5e7f\u5143\u8d35\u5546\u6751\u9547\u94f6\u884c","GCXRCC":"\u6545\u57ce\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","GHZJCB":"\u5e7f\u6c49\u73e0\u6c5f\u6751\u9547\u94f6\u884c","GZZYHHGNCB":"\u8d35\u5dde\u9075\u4e49\u7ea2\u82b1\u5c97\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GZZYHCNCB":"\u8d35\u5dde\u9075\u4e49\u6c47\u5ddd\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GDDYRCB":"\u5e7f\u4e1c\u4e1c\u6e90\u519c\u6751\u5546\u4e1a\u94f6\u884c","GXJXRCC":"\u5e7f\u897f\u9756\u897f\u519c\u6751\u5546\u4e1a\u94f6\u884c","GXTYRCC":"\u5e7f\u897f\u7530\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","DYRCB":"\u8d35\u5dde\u90fd\u5300\u519c\u6751\u5546\u4e1a\u94f6\u884c","GDGYRCB":"\u5e7f\u4e1c\u9ad8\u8981\u519c\u6751\u5546\u4e1a\u94f6\u884c","GZSNRCB":"\u8d35\u5dde\u601d\u5357\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GYZHQRCC":"\u5e7f\u5143\u5e02\u662d\u5316\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GDGNRCB":"\u5e7f\u4e1c\u5e7f\u5b81\u519c\u6751\u5546\u4e1a\u94f6\u884c","GZBJRCB":"\u8d35\u5dde\u6bd5\u8282\u519c\u6751\u5546\u4e1a\u94f6\u884c","GXNMRCC":"\u5e7f\u897f\u5b81\u660e\u519c\u6751\u5546\u4e1a\u94f6\u884c","GDJDRCB":"\u5e7f\u4e1c\u63ed\u4e1c\u519c\u6751\u5546\u4e1a\u94f6\u884c","GSLTRCB":"\u7518\u8083\u7075\u53f0\u519c\u6751\u5546\u4e1a\u94f6\u884c","GXLBGZRCC":"\u5e7f\u897f\u6765\u5bbe\u6842\u4e2d\u519c\u6751\u5408\u4f5c\u94f6\u884c","GXLARCC":"\u5e7f\u897f\u9686\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","GXLLRCC":"\u5e7f\u897f\u9686\u6797\u519c\u6751\u5546\u4e1a\u94f6\u884c","GDRCC":"\u5e7f\u4e1c\u7701\u519c\u6751\u4fe1\u7528\u793e\u8054\u5408\u793e","GLZRCB":"\u7518\u8083\u4e34\u6cfd\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SZGMHNSCZYH":"\u5e7f\u5dde\u589e\u57ce\u957f\u6c5f\u6751\u9547\u94f6\u884c","GZGLRCB":"\u8d35\u5dde\u5173\u5cad\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GZWCRCB":"\u8d35\u5dde\u52a1\u5ddd\u519c\u6751\u5546\u4e1a\u94f6\u884c","GSSKLXRCC":"\u7518\u8083\u7701\u5eb7\u4e50\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GXNPRCC":"\u5e7f\u897f\u90a3\u5761\u519c\u6751\u5546\u4e1a\u94f6\u884c","GDXDKRCC":"\u7518\u5fb7\u53bf\u4e1c\u67ef\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","GSHTRCB":"\u7518\u8083\u534e\u4ead\u519c\u6751\u5546\u4e1a\u94f6\u884c","ICBCHZXH":"\u5de5\u884c\u676d\u5dde\u897f\u6e56","GZSDRCB":"\u8d35\u5dde\u4e09\u90fd\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GZHZRCB":"\u8d35\u5dde\u8d6b\u7ae0\u519c\u6751\u5546\u4e1a\u94f6\u884c","GSGZB":"\u7518\u8083\u74dc\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GZDAF":"\u8d35\u5dde\u5927\u65b9\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","ZYRCB":"\u8d35\u5dde\u7d2b\u4e91\u519c\u6751\u5546\u4e1a\u94f6\u884c","GXTDHPLRCC":"\u5e7f\u897f\u5929\u7b49\u519c\u6751\u5546\u4e1a\u94f6\u884c","GYWDFMCZYH":"\u8d35\u9633\u4e4c\u5f53\u5bcc\u6c11\u6751\u9547\u94f6\u884c","GZXMPMRCC":"\u53e4\u853a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","GLBANK":"\u6842\u6797\u94f6\u884c","GXLCIDHRCC":"\u5e7f\u897f\u67f3\u57ce\u519c\u6751\u5408\u4f5c\u94f6\u884c","GDJYRCB":"\u5e7f\u4e1c\u63ed\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","GYRCB":"\u8d35\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","GYRCC":"\u5e7f\u5143\u519c\u6751\u5546\u4e1a\u94f6\u884c","LBRCB":"\u8d35\u5dde\u8354\u6ce2\u519c\u6751\u5546\u4e1a\u94f6\u884c","GDYCRCB":"\u5e7f\u4e1c\u9633\u6625\u519c\u6751\u5546\u4e1a\u94f6\u884c","GCB":"\u5e7f\u5dde\u94f6\u884c","GXDXDLFRCC":"\u5e7f\u897f\u4e1c\u5174\u519c\u6751\u5546\u4e1a\u94f6\u884c","KYHNSCZYH":"\u56fd\u6c11\u6751\u9547\u94f6\u884c","XXSCZYH":"\u56fa\u5b89\u6052\u5347\u6751\u9547\u94f6\u884c","GXRXRCC":"\u5e7f\u897f\u5bb9\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","GMRBANK":"\u5e7f\u4e1c\u9ad8\u660e\u519c\u6751\u5546\u4e1a\u94f6\u884c","GXYSRCC":"\u5e7f\u897f\u9633\u6714\u519c\u6751\u5408\u4f5c\u94f6\u884c","GZFGRCB":"\u8d35\u5dde\u51e4\u5188\u519c\u6751\u5546\u4e1a\u94f6\u884c","GXFSRCC":"\u5e7f\u897f\u6276\u7ee5\u519c\u6751\u5546\u4e1a\u94f6\u884c","CATB":"\u56fd\u6cf0\u94f6\u884c","GZWDRCB":"\u8d35\u5dde\u4e4c\u5f53\u519c\u6751\u5546\u4e1a\u94f6\u884c","GZDZRCB":"\u8d35\u5dde\u9053\u771f\u519c\u6751\u5546\u4e1a\u94f6\u884c","GDXCTKRCC":"\u8d35\u5b9a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GXRARCC":"\u5e7f\u897f\u878d\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","GDXUSYRCC":"\u8d35\u5fb7\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GZCJRCB":"\u8d35\u5dde\u4ece\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GYB":"\u8d35\u9633\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8(\u5f03\u7528\uff09","GYLZQRCC":"\u5e7f\u5143\u5e02\u5229\u5dde\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GZYPRCC":"\u8d35\u5dde\u7389\u5c4f\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GZXFBJRCC":"\u5149\u6cfd\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GSXHB":"\u7518\u8083\u897f\u548c\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GRLZCZYH":"\u5e7f\u9976\u6881\u90b9\u6751\u9547\u94f6\u884c","GZLHXCB":"\u516c\u4e3b\u5cad\u534e\u5174\u6751\u9547\u94f6\u884c","GYCTRCC":"\u5e7f\u5143\u5e02\u671d\u5929\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","GSTZRCB":"\u7518\u8083\u5929\u795d\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","CHZYFDCZYH":"\u5e7f\u897f\u67f3\u6c5f\u67f3\u94f6\u6751\u9547\u94f6\u884c","CCFCCB":"\u57ce\u5e02\u5546\u4e1a\u94f6\u884c\u8d44\u91d1\u6e05\u7b97\u4e2d\u5fc3","GZFZXHCB":"\u5e7f\u5dde\u756a\u79ba\u65b0\u534e\u6751\u9547\u94f6\u884c","GZTZRCB":"\u8d35\u5dde\u5929\u67f1\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GDHDRCB":"\u5e7f\u4e1c\u60e0\u4e1c\u519c\u6751\u5546\u4e1a\u94f6\u884c","GSMLRCB":"\u7518\u8083\u6c11\u4e50\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GZKLBANK":"\u8d35\u5dde\u51ef\u91cc\u519c\u6751\u5546\u4e1a\u94f6\u884c","XXNSYH":"\u5e7f\u4e1c\u65b0\u5174\u519c\u6751\u5546\u4e1a\u94f6\u884c","GXLYFUERCC":"\u5e7f\u897f\u4e50\u4e1a\u519c\u6751\u5546\u4e1a\u94f6\u884c","GZXWRCB":"\u8d35\u5dde\u4fee\u6587\u519c\u6751\u5546\u4e1a\u94f6\u884c","GXLJRCC":"\u5e7f\u897f\u67f3\u6c5f\u519c\u6751\u5408\u4f5c\u94f6\u884c","GZNXB":"\u8d35\u5dde\u5e73\u5858\u519c\u6751\u5546\u4e1a\u94f6\u884c","GSYCRCB":"\u7518\u8083\u6c38\u660c\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GYCB":"\u8d35\u9633\u94f6\u884c","GXSSRCC":"\u5e7f\u897f\u4e0a\u601d\u519c\u6751\u5546\u4e1a\u94f6\u884c","HXRCB":"\u8d35\u5dde\u82b1\u6eaa\u519c\u6751\u5546\u4e1a\u94f6\u884c","GZPDRCB":"\u8d35\u5dde\u666e\u5b9a\u519c\u6751\u5546\u4e1a\u94f6\u884c","GXZYRCC":"\u5e7f\u897f\u8d44\u6e90\u519c\u6751\u5546\u4e1a\u94f6\u884c","GXLZAZVRCC":"\u5e7f\u897f\u9e7f\u5be8\u519c\u6751\u5546\u4e1a\u94f6\u884c","GXGCRCC":"\u5e7f\u897f\u606d\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","GXLYJWERCC":"\u5e7f\u897f\u51cc\u4e91\u519c\u6751\u5546\u4e1a\u94f6\u884c","BRCBANK":"\u5e7f\u4e1c\u535a\u7f57\u519c\u6751\u5546\u4e1a\u94f6\u884c","GXGYRCC":"\u5e7f\u897f\u704c\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","GXQZRCC":"\u5e7f\u897f\u5168\u5dde\u519c\u6751\u5408\u4f5c\u94f6\u884c","ZYCBANK":"\u8d35\u5dde\u94f6\u884c","GZMTRCB":"\u8d35\u5dde\u6e44\u6f6d\u519c\u6751\u5546\u4e1a\u94f6\u884c","GZYJNCCB":"\u8d35\u5dde\u5370\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","GZPARCB":"\u8d35\u5dde\u666e\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","GPSRCC":"\u6842\u5e73\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GSSWYXRCC":"\u7518\u8083\u7701\u6e2d\u6e90\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZBZCBHCZYH":"\u9ad8\u7891\u5e97\u4e2d\u6210\u6751\u9547\u94f6\u884c","GNXAINRCC":"\u5e7f\u5357\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GTXFEFRCC":"\u9986\u9676\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GXLPRCC":"\u5e7f\u897f\u8354\u6d66\u519c\u6751\u5408\u4f5c\u94f6\u884c","GXCZGNRCC":"\u5e7f\u897f\u5d07\u5de6\u6842\u5357\u519c\u6751\u5546\u4e1a\u94f6\u884c","GXYFXHCZYH":"\u5e7f\u897f\u9c7c\u5cf0\u4fe1\u5408\u6751\u9547\u94f6\u884c","GHRCB":"\u5e7f\u4e1c\u6cb3\u6e90\u519c\u6751\u5546\u4e1a\u94f6\u884c","GSRCU":"\u7518\u8083\u7701\u519c\u6751\u4fe1\u7528\u793e","FQRCB":"\u8d35\u5dde\u798f\u6cc9\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GZZFBANK":"\u8d35\u5dde\u8d1e\u4e30\u519c\u6751\u5546\u4e1a\u94f6\u884c","BJCPBSCZYH":"\u54c8\u5c14\u6ee8\u963f\u57ce\u519c\u5546\u6751\u9547\u94f6\u884c","JACZCZYH":"\u6d77\u53e3\u82cf\u5357\u6751\u9547\u94f6\u884c","JXZYJHCZYH":"\u54c8\u5c14\u6ee8\u5e78\u798f\u6751\u9547\u94f6\u884c","CWZYFDCZYH":"\u6d77\u5357\u6f84\u8fc8\u957f\u6c5f\u6751\u9547\u94f6\u884c","SNJCNSCZYH":"\u6d77\u5357\u510b\u5dde\u7eff\u8272\u6751\u9547\u94f6\u884c","SXHZNZHFCZYH":"\u6d77\u5357\u5c6f\u660c\u957f\u6c5f\u6751\u9547\u94f6\u884c","SCBCQZFMCZYH":"\u54c8\u5bc6\u7ea2\u661f\u56fd\u6c11\u6751\u9547\u94f6\u884c","SXZZNKCZYH":"\u8d35\u9633\u89c2\u5c71\u6e56\u5bcc\u6c11\u6751\u9547\u94f6\u884c","JMXHXHCZYH":"\u54c8\u5c14\u6ee8\u547c\u5170\u6d66\u53d1\u6751\u9547\u94f6\u884c","SPTDDFCZYH":"\u54c8\u5c14\u6ee8\u519c\u4fe1\u6751\u9547\u94f6\u884c","MHKMSCZYH":"\u6d77\u9633\u73e0\u6c5f\u6751\u9547\u94f6\u884c","ZQFLZYFDCZYH":"\u97e9\u57ce\u6d66\u53d1\u6751\u9547\u94f6\u884c","SYLZFMCZYH":"\u90af\u90f8\u90af\u5c71\u9f50\u9c81\u6751\u9547\u94f6\u884c","HSHMCB":"\u542b\u5c71\u60e0\u6c11\u6751\u9547\u94f6\u884c","HBLLRCB":"\u6cb3\u5317\u5362\u9f99\u519c\u6751\u5546\u4e1a\u94f6\u884c","HKRCB":"\u6d77\u53e3\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLSKWERCC":"\u6d77\u6797\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XTALYTYCZYH":"\u6d77\u4f26\u60e0\u4e30\u6751\u9547\u94f6\u884c","ETKQQMYCZYH":"\u6d77\u5357\u743c\u4e2d\u957f\u6c5f\u6751\u9547\u94f6\u884c","WJMZQPSMTCZYH":"\u90af\u90f8\u6c38\u5e74\u9f50\u9c81\u6751\u9547\u94f6\u884c","HFKJRCC":"\u5408\u80a5\u79d1\u6280\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZLHNSCZYH":"\u6cb3\u5357\u683e\u5ddd\u6c11\u4e30\u6751\u9547\u94f6\u884c","ZYRXCZYH":"\u676d\u9526\u5927\u4f17\u6751\u9547\u94f6\u884c","AYSD":"\u6cb3\u5357\u7701\u5b89\u9633\u5546\u90fd\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHXZHSCZYH":"\u676d\u9526\u540e\u65d7\u6cb3\u5957\u6751\u9547\u94f6\u884c","LCRCU":"\u6cb3\u5317\u4e34\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","LQHNSCZYH":"\u5e7f\u5b89\u6052\u4e30\u6751\u9547\u94f6\u884c","HNMZRCC":"\u6cb3\u5357\u5b5f\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNWSRCC":"\u6cb3\u5357\u5c09\u6c0f\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNLSCGTRCC":"\u6cb3\u5357\u7f57\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBCDRHRCB":"\u6cb3\u5317\u627f\u5fb7\u70ed\u6cb3\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNTCRCC":"\u6d77\u5357\u5c6f\u660c\u519c\u6751\u5546\u4e1a\u94f6\u884c","HZSHTQRCC":"\u6c49\u4e2d\u5e02\u6c49\u53f0\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HBGZRCB":"\u6cb3\u5317\u5e7f\u5b97\u519c\u6751\u5546\u4e1a\u94f6\u884c","HJQRCC":"\u676d\u9526\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HNBSRCB":"\u6d77\u5357\u767d\u6c99\u519c\u6751\u5546\u4e1a\u94f6\u884c","BZZYFDCZYH":"\u6cb3\u5357\u65b0\u91ce\u5efa\u4fe1\u6751\u9547\u94f6\u884c","QKIZNCSYRHN":"\u6cb3\u5357\u65b0\u90d1\u519c\u6751\u5546\u4e1a\u94f6\u884c","QKMDGQLCZYH":"\u6cb3\u5357\u5546\u6c34\u53a6\u519c\u5546\u6751\u9547\u94f6\u884c","HLJFJSRCC":"\u9ed1\u9f99\u6c5f\u7701\u5bcc\u9526\u5e02\u519c\u6751\u4fe1\u7528\u8054\u793e","HLDYCZYH":"\u548c\u9f99\u6566\u94f6\u6751\u9547\u94f6\u884c","HBZLRCB":"\u6cb3\u5317\u6dbf\u9e7f\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBCZRCB":"\u6cb3\u5317\u6ca7\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNNXRCC":"\u6cb3\u5357\u5185\u4e61\u519c\u6751\u5546\u4e1a\u94f6\u884c","RNTLCZYH":"\u6cb3\u5357\u6c5d\u5357\u6cf0\u9686\u6751\u9547\u94f6\u884c","HLJJXPYERCC":"\u9ed1\u9f99\u6c5f\u96c6\u8d24\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBZZRCB":"\u6cb3\u5317\u6dbf\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBBXRCB":"\u6cb3\u5317\u67cf\u4e61\u519c\u6751\u5546\u4e1a\u94f6\u884c","MDJCJGHYRCC":"\u9ed1\u9f99\u6c5f\u7701\u7261\u4e39\u6c5f\u5e02\u57ce\u90ca\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HSB":"\u6052\u751f\u94f6\u884c","BYGZNCSYGNL":"\u6e56\u5317\u9102\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBGACB":"\u6e56\u5317\u516c\u5b89\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","HNZXRCB":"\u6e56\u5357\u8d44\u5174\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNZMRCB":"\u6cb3\u5357\u4e2d\u725f\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNHRRCB":"\u6e56\u5357\u534e\u5bb9\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNLDRCB":"\u6e56\u5357\u5a04\u5e95\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HARCB":"\u6d77\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","HXBANK":"\u534e\u590f\u94f6\u884c","HLDB":"\u846b\u82a6\u5c9b\u94f6\u884c","HNXTRCB":"\u6e56\u5357\u65b0\u7530\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNNHRCB":"\u6cb3\u5317\u5357\u548c\u519c\u5546\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HLRCB":"\u6cb3\u5317\u6000\u6765\u519c\u6751\u5546\u4e1a\u94f6\u884c","BHB":"\u6cb3\u5317\u94f6\u884c","HLJLKXRCC":"\u9ed1\u9f99\u6c5f\u7701\u6797\u53e3\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","HCXDKLRCC":"\u970d\u57ce\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HNWGRCC":"\u6cb3\u5357\u821e\u94a2\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNWGRCB":"\u6e56\u5357\u6b66\u5188\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNMQRCC":"\u6cb3\u5357\u6c11\u6743\u519c\u6751\u5546\u4e1a\u94f6\u884c","KDB":"\u97e9\u56fd\u4ea7\u4e1a\u94f6\u884c","GYNMFMCZYH":"\u6cb3\u5317\u4e30\u5b81\u5efa\u4fe1\u6751\u9547\u94f6\u884c","GDWCRCB":"\u5e7f\u4e1c\u5434\u5ddd\u519c\u5546\u884c","XHKJRCB":"\u8d35\u9633\u5c0f\u6cb3\u79d1\u6280\u6751\u9547\u94f6\u884c","HJXTWURCC":"\u548c\u9759\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HBXXRCB":"\u6cb3\u5317\u732e\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","HDSLDQRCC":"\u6d77\u4e1c\u5e02\u4e50\u90fd\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HXXRCC":"\u6d77\u5174\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","HNMGZRCC":"\u6cb3\u5357\u8499\u53e4\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HNXHXNSCZYH":"\u6cb3\u5357\u897f\u534e\u53a6\u519c\u5546\u6751\u9547\u94f6\u884c","HMTSCZYH":"\u54c8\u5bc6\u5929\u5c71\u6751\u9547\u94f6\u884c","HBZQRCB":"\u6cb3\u5317\u67a3\u5f3a\u519c\u6751\u5546\u4e1a\u94f6\u884c","RABO":"\u8377\u5170\u5408\u4f5c\u94f6\u884c\uff08\u4e2d\u56fd\uff09\u6709\u9650\u516c\u53f8","HNSQBGSRCC":"\u6cb3\u5357\u6c88\u4e18\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBKCRCB":"\u6cb3\u5317\u5bbd\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","WNHHCZYH":"\u5408\u5ddd\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","ZQYCBYCZYH":"\u6a2a\u5cf0\u6052\u901a\u6751\u9547\u94f6\u884c","HYXLJPRCC":"\u6d2a\u96c5\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","HBYARCC":"\u6e56\u5317\u8fdc\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBXJRCB":"\u6cb3\u5317\u8f9b\u96c6\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBLSRCB":"\u6cb3\u5317\u6d9e\u6c34\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HLJTYXRCC":"\u9ed1\u9f99\u6c5f\u7701\u6c64\u539f\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","HLJZHRCC":"\u9ed1\u9f99\u6c5f\u8bb7\u6cb3\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBJZRCU":"\u6cb3\u5317\u5180\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBZYRCC":"\u6e56\u5317\u67a3\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBDYYETRCC":"\u6e56\u5317\u5927\u51b6\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBZCRCC":"\u6e56\u5317\u8572\u6625\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNLSJRCB":"\u6e56\u5357\u51b7\u6c34\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HBAPRCB":"\u6cb3\u5317\u5b89\u5e73\u519c\u6751\u5546\u4e1a\u94f6\u884c","HVNCZGCMSCZYH":"\u4e1c\u5174\u56fd\u6c11\u6751\u9547\u94f6\u884c","GZZYRCB":"\u8d35\u5dde\u9075\u4e49\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HBYDRCC":"\u6e56\u5317\u5b9c\u90fd\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBHHRCC":"\u6e56\u5317\u6d2a\u6e56\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBSZUCDRCC":"\u6e56\u5317\u677e\u6ecb\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLJHMRCC":"\u9ed1\u9f99\u6c5f\u547c\u739b\u519c\u6751\u5546\u4e1a\u94f6\u884c","HSSYMTRCC":"\u5408\u5c71\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HZSUZNRCC":"\u970d\u5dde\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HBJLRCB":"\u6cb3\u5317\u5de8\u9e7f\u519c\u6751\u5546\u4e1a\u94f6\u884c","HZSCFGRCC":"\u5408\u4f5c\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HBTSCFDRCB":"\u6cb3\u5317\u5510\u5c71\u66f9\u5983\u7538\u519c\u6751\u5546\u4e1a\u94f6\u884c","HSSSFHRCC":"\u9e64\u5c71\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HMBANK":"\u54c8\u5bc6\u5e02\u5546\u4e1a\u94f6\u884c","CMBCN":"\u534e\u5546\u94f6\u884c","HNSDRCB":"\u6e56\u5357\u90b5\u4e1c\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNSYSYRCB":"\u6e56\u5357\u90b5\u9633\u662d\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HBLHKRCC":"\u6e56\u5317\u8001\u6cb3\u53e3\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLJLBRCC":"\u9ed1\u9f99\u6c5f\u841d\u5317\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLBERCC":"\u547c\u4f26\u8d1d\u5c14\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLJKSXRCC":"\u9ed1\u9f99\u6c5f\u7701\u514b\u5c71\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","HLJZCXRCC":"\u9ed1\u9f99\u6c5f\u7701\u6866\u5ddd\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","HEBNCRCC":"\u54c8\u5c14\u6ee8\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLJBZRCC":"\u9ed1\u9f99\u6c5f\u5bbe\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLJWKXRCC":"\u9ed1\u9f99\u6c5f\u7701\u671b\u594e\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","HTSRCC":"\u548c\u7530\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","HLJJYXRCC":"\u9ed1\u9f99\u6c5f\u7701\u5609\u836b\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","HQXRCC":"\u9e64\u5e86\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HLJBARCC":"\u9ed1\u9f99\u6c5f\u5317\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","KNWSMDJSDDH":"\u9ed1\u9f99\u6c5f\u7701\u7261\u4e39\u6c5f\u5e02\u57ce\u90ca\u519c\u6751\u4fe1\u7528\u8054\u793e","HDXHDCZYH":"\u6d2a\u6d1e\u53bf\u6d2a\u90fd\u6751\u9547\u94f6\u884c","HLSUVFRCC":"\u6d77\u4f26\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZIPGXBLLYCZYH":"\u547c\u548c\u6d69\u7279\u91d1\u6865\u6cb3\u5957\u6751\u9547\u94f6\u884c","HBTSRCC":"\u6e56\u5317\u901a\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBTSRCB":"\u6cb3\u5317\u5510\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBHFRCC":"\u6e56\u5317\u9e64\u5cf0\u519c\u6751\u5546\u4e1a\u94f6\u884c","CZXBZCCZYH":"\u6e56\u5317\u54b8\u5b89\u957f\u6c5f\u6751\u9547\u94f6\u884c","GFSXNCSYOGA":"\u6e56\u5317\u949f\u7965\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNJHRCB":"\u6e56\u5357\u6c5f\u534e\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNSNXNCZYH":"\u6e56\u5357\u7ee5\u5b81\u6e58\u519c\u6751\u9547\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HBXERCC":"\u6e56\u5317\u5ba3\u6069\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNFHRCB":"\u6e56\u5357\u51e4\u51f0\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HLJTJRCC":"\u9ed1\u9f99\u6c5f\u540c\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNLLRCB":"\u6e56\u5357\u91b4\u9675\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HBQJRCC":"\u6e56\u5317\u6f5c\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNBJRCB":"\u6e56\u5357\u4fdd\u9756\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HBZJRCC":"\u6e56\u5317\u679d\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNCLRCB":"\u6e56\u5357\u8336\u9675\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HZVGXGMCZYH":"\u798f\u5efa\u6c38\u5b9a\u745e\u72ee\u6751\u9547\u94f6\u884c","GZLLRCB":"\u8d35\u5dde\u9f99\u91cc\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HBYSRCC":"\u6e56\u5317\u82f1\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","TMTYQMYCZYH":"\u6e56\u5357\u6e58\u6f6d\u6e58\u6dee\u6751\u9547\u94f6\u884c","HNXSSRCB":"\u6e56\u5357\u661f\u6c99\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HLJQAXRCC":"\u9ed1\u9f99\u6c5f\u7701\u5e86\u5b89\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","HNPJRCB":"\u6e56\u5357\u5e73\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNGYRCU":"\u6e56\u5357\u6842\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBHMRCC":"\u6e56\u5317\u9ec4\u6885\u519c\u6751\u5546\u4e1a\u94f6\u884c","HZBLCJCZYH":"\u629a\u987a\u65b0\u5bbe\u629a\u94f6\u6751\u9547\u94f6\u884c","GARCU":"\u5e7f\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNGYRCB":"\u6cb3\u5357\u5de9\u4e49\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNRCU":"\u6cb3\u5357\u7701\u519c\u6751\u4fe1\u7528\u793e","HNRCRCB":"\u6e56\u5357\u6c5d\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNAHXHCZYH":"\u6e56\u5357\u5b89\u5316\u6e58\u6dee\u6751\u9547\u94f6\u884c","HNSSRCB":"\u6e56\u5357\u97f6\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNLSTHBRCC":"\u6cb3\u5357\u5362\u6c0f\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNSSRCC":"\u6cb3\u5357\u5546\u6c34\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNTJRCB":"\u6e56\u5357\u6843\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNHJXNRCC":"\u6e56\u5357\u6d2a\u6c5f\u6e58\u519c\u6751\u9547\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","XXHDCZYH":"\u6e56\u5357\u6e86\u6d66\u6e58\u6c5f\u6751\u9547\u94f6\u884c","ZZZJRCC":"\u6e56\u5357\u682a\u6d32\u73e0\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","HMYH":"\u534e\u7f8e\u94f6\u884c\uff08\u4e2d\u56fd\uff09\u6709\u9650\u516c\u53f8","HLJNASRCC":"\u9ed1\u9f99\u6c5f\u7701\u5b81\u5b89\u5e02\u519c\u6751\u4fe1\u7528\u8054\u793e","HYXFIXRCC":"\u6c49\u6e90\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","HNZJRCB":"\u6e56\u5357\u82b7\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNDZRCC":"\u6cb3\u5357\u9093\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","NPRCB":"\u6cb3\u5317\u5357\u76ae\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBWCRCB":"\u6cb3\u5317\u56f4\u573a\u519c\u6751\u5546\u4e1a\u94f6\u884c","QXKNCXYHHUM":"\u534e\u5b81\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","HZSZIIRCC":"\u534e\u84e5\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","HNYSRCB":"\u6e56\u5357\u6c38\u987a\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNMYRCC":"\u6cb3\u5357\u6ccc\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNCBRCB":"\u6e56\u5357\u57ce\u6b65\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HSXEUPRCC":"\u5408\u6c34\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XSBNZHCJCZYH":"\u58f6\u5173\u53bf\u664b\u878d\u6751\u9547\u94f6\u884c","HLJADSRCC":"\u9ed1\u9f99\u6c5f\u7701\u5b89\u8fbe\u5e02\u519c\u6751\u4fe1\u7528\u8054\u793e","HLJZYRCC":"\u9ed1\u9f99\u6c5f\u8087\u6e90\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNAYSDRCC":"\u6cb3\u5357\u5b89\u9633\u5546\u90fd\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBDCRCB":"\u6cb3\u5317\u5927\u5382\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNCXRCB":"\u6e56\u5357\u8fb0\u6eaa\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNWZRCB":"\u6cb3\u5357\u6b66\u965f\u519c\u5546\u884c","HLJGNRCC":"\u9ed1\u9f99\u6c5f\u7518\u5357\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNCMRCC":"\u6d77\u5357\u6f84\u8fc8\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNBJ":"\u6cb3\u5357\u6c74\u4eac\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","QHSRB":"\u9ec4\u5c9b\u821c\u4e30\u6751\u9547\u94f6\u884c","HBSXRCC":"\u6e56\u5317\u4e09\u5ce1\u519c\u6751\u5546\u4e1a\u94f6\u884c","HYSRCC":"\u534e\u9634\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HBYXKPPRCC":"\u6e56\u5317\u90e7\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNLSSNCZYH":"\u83cf\u6cfd\u7261\u4e39\u5317\u6d77\u6751\u9547\u94f6\u884c","HNRLRCB":"\u6e56\u5357\u6c85\u9675\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNAHRCB":"\u6e56\u5357\u5b89\u5316\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HLJLXXRCC":"\u9ed1\u9f99\u6c5f\u7701\u5170\u897f\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","HNXMRCB":"\u6cb3\u5357\u65b0\u5bc6\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","FSB":"\u534e\u4e00\u94f6\u884c","CITI":"\u82b1\u65d7\u94f6\u884c","HSBQRCC":"\u7ea2\u5bfa\u5821\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","HBRXRCB":"\u6cb3\u5317\u4efb\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBHDRCB":"\u6cb3\u5317\u90af\u90f8\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNJZRCB":"\u6e56\u5357\u9756\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HBSZRCB":"\u6cb3\u5317\u6df1\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBXSRCC":"\u6e56\u5317\u5174\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNJXRCC":"\u6cb3\u5357\u6d5a\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBXHRCC":"\u6cb3\u5317\u9999\u6cb3\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLJZDSRCC":"\u9ed1\u9f99\u6c5f\u7701\u8087\u4e1c\u5e02\u519c\u6751\u4fe1\u7528\u8054\u793e","HBZDRCB":"\u6cb3\u5317\u6b63\u5b9a\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNZCAALRCC":"\u6cb3\u5357\u6e11\u6c60\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLJHLSRCC":"\u9ed1\u9f99\u6c5f\u7701\u6d77\u6797\u5e02\u519c\u6751\u4fe1\u7528\u8054\u793e","EGBANK":"\u6052\u4e30\u94f6\u884c","HLJTHSNBRCC":"\u9ed1\u9f99\u6c5f\u901a\u6cb3\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNLYRCU":"\u6cb3\u5357\u9e7f\u9091\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNZLRCC":"\u6cb3\u5357\u9122\u9675\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLJRHRCC":"\u9ed1\u9f99\u6c5f\u9976\u6cb3\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNZCSKRRCC":"\u6cb3\u5357\u683e\u5ddd\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNRZRCC":"\u6cb3\u5357\u6c5d\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","HZLHRCC":"\u676d\u5dde\u8054\u5408\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNAYXZRCC":"\u6cb3\u5357\u5b89\u9633\u76f8\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","HEBEIXTRCB":"\u6cb3\u5317\u90a2\u53f0\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNYYUFERCC":"\u6cb3\u5357\u539f\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","SHBLQAURRCC":"\u9ed1\u9f99\u6c5f\u7701\u7ee5\u5316\u5e02\u5317\u6797\u533a\u519c\u6751\u4fe1\u7528\u8054\u793e","HLJYYRCC":"\u9ed1\u9f99\u6c5f\u53cb\u8c0a\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNGSIXGRCC":"\u6cb3\u5357\u56fa\u59cb\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHLXXHCZYH":"\u547c\u548c\u6d69\u7279\u5e02\u8d5b\u7f55\u8499\u94f6\u6751\u9547\u94f6\u884c","NBJBFMCZYH":"\u6e56\u5317\u7ea2\u5b89\u957f\u6c5f\u6751\u9547\u94f6\u884c","HBTCRCC":"\u6e56\u5317\u901a\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNPFCZYH":"\u8861\u5357\u6d66\u53d1\u6751\u9547\u94f6\u884c","HBLFRCC":"\u6e56\u5317\u6765\u51e4\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBWARCB":"\u6cb3\u5317\u6587\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNXCICKRCC":"\u6cb3\u5357\u8944\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLGERCC":"\u548c\u6797\u683c\u5c14\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HDFFKQRCC":"\u90af\u90f8\u5e02\u5cf0\u5cf0\u77ff\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JSWJJXCZYH":"\u5408\u6d66\u56fd\u6c11\u6751\u9547\u94f6\u884c","FZXXTCZYH":"\u9ec4\u6885\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","FJJCNCSYNFJ":"\u6e56\u5317\u5b9c\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","DLJZLFCZYH":"\u6e56\u5357\u6d1e\u53e3\u6f6d\u519c\u5546\u6751\u9547\u94f6\u884c","DAHMCB":"\u5927\u5b89\u60e0\u6c11\u6751\u9547\u94f6\u884c","YZSTCZYH":"\u6e56\u5357\u534e\u5bb9\u661f\u9f99\u6751\u9547\u94f6\u884c","XXCXCZYH":"\u6e56\u5357\u6c5f\u534e\u65b0\u9633\u6751\u9547\u94f6\u884c","DYRHCZYH":"\u6e56\u5357\u84dd\u5c71\u795e\u519c\u6751\u9547\u94f6\u884c","HNXPRCB":"\u6e56\u5357\u6e86\u6d66\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNXPRCC":"\u6cb3\u5357\u897f\u5e73\u519c\u6751\u5546\u4e1a\u94f6\u884c","HZSHXSRCC":"\u5316\u5dde\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HLYDCZYH":"\u6d77\u6797\u8fdc\u4e1c\u6751\u9547\u94f6\u884c","HNSQWVORCC":"\u6cb3\u5357\u793e\u65d7\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLJNJRCC":"\u9ed1\u9f99\u6c5f\u5ae9\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","HSXJCCB":"\u5408\u6c34\u53bf\u91d1\u57ce\u6751\u9547\u94f6\u884c","HLJMHRCC":"\u9ed1\u9f99\u6c5f\u6f20\u6cb3\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLJBLXRCC":"\u9ed1\u9f99\u6c5f\u7701\u52c3\u5229\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","SBJDCZYH":"\u547c\u548c\u6d69\u7279\u5e02\u65b0\u57ce\u8499\u94f6\u6751\u9547\u94f6\u884c","AHDZYZCZYH":"\u6e56\u5317\u5927\u51b6\u6cf0\u9686\u6751\u9547\u94f6\u884c","HNXJRCB":"\u6e56\u5357\u6e58\u4e61\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HXOPHRCC":"\u534e\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HBXTRCB":"\u6e56\u5317\u4ed9\u6843\u4eac\u90fd\u6751\u9547\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNXXHWERCC":"\u6cb3\u5357\u606f\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNDKRCB":"\u6e56\u5357\u6d1e\u53e3\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HBFCRCB":"\u6cb3\u5317\u961c\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","HZCB":"\u676d\u5dde\u94f6\u884c","HBFNRCB":"\u6cb3\u5317\u4e30\u5b81\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HLJSBXRCC":"\u9ed1\u9f99\u6c5f\u7701\u7ee5\u6ee8\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","HBZXRCC":"\u6e56\u5317\u7af9\u6eaa\u519c\u6751\u5546\u4e1a\u94f6\u884c","HSXSTURCC":"\u548c\u987a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HBYCRCC":"\u6e56\u5317\u5e94\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNTYRCB":"\u6e56\u5357\u6843\u6e90\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNTYRCC":"\u6cb3\u5357\u6c64\u9634\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLJTLSRCC":"\u9ed1\u9f99\u6c5f\u7701\u94c1\u529b\u5e02\u519c\u6751\u4fe1\u7528\u8054\u793e","HWB":"\u8377\u5170\u4e07\u8d1d\u94f6\u884c","HEBHLQRCC":"\u54c8\u5c14\u6ee8\u5e02\u547c\u5170\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HZBK":"\u6e56\u5dde\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","CITICN":"\u82b1\u65d7\u94f6\u884c(\u4e2d\u56fd)","HNYXRCB":"\u6e56\u5357\u6538\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNYXRCC":"\u6cb3\u5357\u53f6\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLJRCU":"\u9ed1\u9f99\u6c5f\u7701\u519c\u6751\u4fe1\u7528\u793e\u8054\u5408\u793e","HNXHSRCB":"\u6e56\u5357\u65b0\u6643\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNYMRCC":"\u6cb3\u5357\u4e49\u9a6c\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLJYSRCC":"\u9ed1\u9f99\u6c5f\u5ef6\u5bff\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBGBDRCB":"\u6cb3\u5317\u9ad8\u7891\u5e97\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HSCZB":"\u6e56\u5546\u6751\u9547\u94f6\u884c","LMGBANK":"\u547c\u548c\u6d69\u7279\u5e02\u5546\u4e1a\u94f6\u884c","HBNJRCB":"\u6cb3\u5317\u5b81\u664b\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNXYRCB":"\u6e56\u5357\u6e58\u9634\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNNXRCB":"\u6e56\u5357\u5b81\u4e61\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HSBK":"\u8861\u6c34\u5e02\u5546\u4e1a\u94f6\u884c","HNYXTLCZYH":"\u6cb3\u5357\u53f6\u53bf\u6cf0\u9686\u6751\u9547\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HSXTIFRCC":"\u9ed1\u5c71\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HBLCRCC":"\u6e56\u5317\u5229\u5ddd\u519c\u6751\u5546\u4e1a\u94f6\u884c","HHXRCC":"\u7ea2\u6cb3\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HNLXSRCB":"\u6e56\u5357\u6cf8\u6eaa\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HBJLJNYRCC":"\u6e56\u5317\u76d1\u5229\u519c\u6751\u5546\u4e1a\u94f6\u884c","HHHTSRYMYCZYH":"\u54c8\u5c14\u6ee8\u5bbe\u6d32\u6751\u9547\u94f6\u884c","QYBANK":"\u97e9\u56fd\u4f01\u4e1a\u94f6\u884c","HNZYPBWRCC":"\u6cb3\u5357\u6b63\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNHTRCB":"\u6e56\u5357\u4f1a\u540c\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HLJMSELHRCC":"\u9ed1\u9f99\u6c5f\u660e\u6c34\u519c\u6751\u5546\u4e1a\u94f6\u884c","HGSSQBHDRCC":"\u9e64\u5c97\u5e02\u5e02\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ING":"\u8377\u5170\u5546\u4e1a\u94f6\u884c","HNQSRCC":"\u6cb3\u5357\u786e\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNLNRCC":"\u6cb3\u5357\u6d1b\u5b81\u519c\u6751\u5546\u4e1a\u94f6\u884c","DEBTRCC":"\u9ed1\u9f99\u6c5f\u675c\u5c14\u4f2f\u7279\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBMCHFCB":"\u6e56\u5317\u9ebb\u57ce\u6c47\u4e30\u6751\u9547\u94f6\u884c","HLJTLRCC":"\u9ed1\u9f99\u6c5f\u6cf0\u6765\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNLYRCC":"\u6e56\u5357\u8012\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNLYRCB":"\u6e56\u5357\u6d4f\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","WHBMA":"\u534e\u4fa8\u6c38\u4ea8\u94f6\u884c\uff08\u6fb3\u95e8\uff09","WHBHK":"\u534e\u4fa8\u6c38\u4ea8\u94f6\u884c\uff08\u9999\u6e2f\uff09","HLJBQRCB":"\u9ed1\u9f99\u6c5f\u5b9d\u6e05\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNXSRCB":"\u6e56\u5357\u65b0\u90b5\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNYJRCC":"\u6cb3\u5357\u5ef6\u6d25\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNYJRCB":"\u6e56\u5357\u6c85\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNHSCZYH":"\u5b89\u5eb7\u6c49\u6ee8\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","CCSYJYCZYH":"\u6ed1\u53bf\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","CFSSLNCB":"\u8d64\u5cf0\u5e02\u677e\u5c71\u7acb\u519c\u6751\u9547\u94f6\u884c","HBRCB":"\u9e64\u58c1\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNGZRCB":"\u6e56\u5357\u53e4\u4e08\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNGDRCB":"\u6e56\u5357\u6842\u4e1c\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNSFRCB":"\u6e56\u5357\u53cc\u5cf0\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HBLTRCC":"\u6e56\u5317\u7f57\u7530\u519c\u6751\u5546\u4e1a\u94f6\u884c","HEBNXCZYXXDH":"\u9ad8\u5e73\u5e02\u592a\u884c\u6751\u9547\u94f6\u884c","HBYMRCC":"\u6e56\u5317\u4e91\u68a6\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNCGRCC":"\u6cb3\u5357\u957f\u845b\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNZYDMJRCC":"\u6cb3\u5357\u8365\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZNRXCB":"\u6866\u5357\u878d\u5174\u6751\u9547\u94f6\u884c","ZCRXCB":"\u6866\u5ddd\u878d\u5174\u6751\u9547\u94f6\u884c","NABYCZYH":"\u9ec4\u5e73\u632f\u5174\u6751\u9547\u94f6\u884c","HSTPRCC":"\u9ec4\u5c71\u592a\u5e73\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNYXNCCZYH":"\u6e56\u5357\u6c5f\u6c38\u6e58\u519c\u6751\u9547\u94f6\u884c","HBGARCC":"\u6e56\u5317\u516c\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBSNJRCC":"\u6e56\u5317\u795e\u519c\u67b6\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBHYRCB":"\u6cb3\u5317\u9ec4\u9a85\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HBSYRCC":"\u6e56\u5317\u5341\u5830\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLJJXTONRCC":"\u9ed1\u9f99\u6c5f\u9e21\u897f\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBESRCC":"\u6e56\u5317\u6069\u65bd\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNHDRCC":"\u6e56\u5357\u8861\u4e1c\u519c\u6751\u5546\u4e1a\u94f6\u884c","HEBACQRCC":"\u54c8\u5c14\u6ee8\u5e02\u963f\u57ce\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HNSZRCB":"\u6e56\u5357\u6851\u690d\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HZRCC":"\u83cf\u6cfd\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBHCRCC":"\u6e56\u5317\u6c49\u5ddd\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNTQRCC":"\u6cb3\u5357\u53f0\u524d\u519c\u6751\u5546\u884c\u94f6\u884c","HNRCB":"\u5409\u6797\u8f89\u5357\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBCYXVYRCC":"\u6e56\u5317\u5d07\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNRCC":"\u6e56\u5357\u7701\u519c\u6751\u4fe1\u7528\u793e","HYRCB":"\u8861\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNRNRCC":"\u6cb3\u5357\u6c5d\u5357\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBDYTLCZYH":"\u5c91\u6eaa\u5e02\u5317\u90e8\u6e7e\u6751\u9547\u94f6\u884c","HBHXRCC":"\u54c8\u5df4\u6cb3\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HNSPRCC":"\u6cb3\u5357\u9042\u5e73\u519c\u6751\u5546\u4e1a\u94f6\u884c","BIYMNCSYBHJ":"\u6e56\u5317\u8346\u95e8\u519c\u6751\u5546\u4e1a\u94f6\u884c","HSTXRCC":"\u9ec4\u5c71\u5c6f\u6eaa\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNHXPDQRCC":"\u6cb3\u5357\u8f89\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNHBRCC":"\u6cb3\u5357\u6dee\u6ee8\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBJYRCC":"\u6e56\u5317\u5609\u9c7c\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBGSRCC":"\u6e56\u5317\u5e7f\u6c34\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLJJDRCC":"\u9ed1\u9f99\u6c5f\u9e21\u4e1c\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBWXRCC":"\u6e56\u5317\u6b66\u7a74\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNBANK":"\u6d77\u5357\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HBDMRCB":"\u6cb3\u5317\u5927\u540d\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","DXLHCZYH":"\u846b\u82a6\u5c9b\u56fd\u4fe1\u6751\u9547\u94f6\u884c","XSBFCZYH":"\u6e56\u5357\u5b89\u4ec1\u65b0\u9633\u6751\u9547\u94f6\u884c","HNLSSRCB":"\u6e56\u5357\u9f99\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HEBACNSCZYH":"\u5de9\u4e49\u6d66\u53d1\u6751\u9547\u94f6\u884c","HDYNQLCZYH":"\u6853\u53f0\u9752\u9686\u6751\u9547\u94f6\u884c","HSXGDCZYH":"\u548c\u987a\u53bf\u8d35\u90fd\u6751\u9547\u94f6\u884c","HNCNRCB":"\u6e56\u5357\u5e38\u5b81\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HLJFZRCC":"\u9ed1\u9f99\u6c5f\u65b9\u6b63\u519c\u6751\u5546\u4e1a\u94f6\u884c","HPTGNGMCZYH":"\u5e7f\u897f\u94a6\u5dde\u5e02\u94a6\u5357\u56fd\u6c11\u6751\u9547\u94f6\u884c","HMSTXCZYH":"\u5b89\u5fbd\u6000\u5b81\u6c5f\u6dee\u6751\u9547\u94f6\u884c","XMXAMSCZYH":"\u957f\u6c99\u661f\u6c99\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","HSHZRCC":"\u9ec4\u5c71\u5fbd\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLJTYRCB":"\u9ed1\u9f99\u6c5f\u6c64\u539f\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBZBRCB":"\u6cb3\u5317\u5f20\u5317\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNYXSRCB":"\u6e56\u5357\u6c38\u5174\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HLJSLRCC":"\u9ed1\u9f99\u6c5f\u7ee5\u68f1\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNXCFNARCC":"\u6cb3\u5357\u9879\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","KZRTNCSYAQZ":"\u6e56\u5317\u4ed9\u6843\u519c\u6751\u5546\u4e1a\u94f6\u884c","HDBSCB":"\u5316\u5fb7\u5305\u5546\u6751\u9547\u94f6\u884c","HLJQGXRCC":"\u9ed1\u9f99\u6c5f\u7701\u9752\u5188\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","HLJSWRCC":"\u9ed1\u9f99\u6c5f\u5b59\u5434\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLJMSQNORCC":"\u9ed1\u9f99\u6c5f\u5bc6\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","GAHFCZYH":"\u6dee\u5b89\u6dee\u9634\u5174\u798f\u6751\u9547\u94f6\u884c","SZWZZJCZYH":"\u8f89\u5357\u6986\u94f6\u6751\u9547\u94f6\u884c","HSBANK":"\u5fbd\u5546\u94f6\u884c","HNHJBANK":"\u6cb3\u5357\u83b7\u5609\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBALRCC":"\u6e56\u5317\u5b89\u9646\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNZXJDMRCC":"\u6cb3\u5357\u675e\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNTXRCC":"\u6cb3\u5357\u901a\u8bb8\u519c\u6751\u5546\u4e1a\u94f6\u884c","GZHPRHCZYH":"\u6e56\u5357\u4e1c\u5b89\u661f\u9f99\u6751\u9547\u94f6\u884c","HHJRCB":"\u6e56\u5357\u6d2a\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HAXDUPRCC":"\u6000\u5b89\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","HNLLSRCB":"\u6e56\u5357\u4e34\u6fa7\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HBLZRCB":"\u6cb3\u5317\u6ee6\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLJHLRCC":"\u9ed1\u9f99\u6c5f\u864e\u6797\u519c\u6751\u5546\u4e1a\u94f6\u884c","EFEYNCSYVFS":"\u6e56\u5317\u6c99\u6d0b\u519c\u6751\u5546\u4e1a\u94f6\u884c","NXHNSCZYH":"\u6e56\u5357\u6d4f\u9633\u6c5f\u6dee\u6751\u9547\u94f6\u884c","FJHTBANK":"\u534e\u901a\u94f6\u884c","HNYZRCB":"\u6e56\u5357\u5b9c\u7ae0\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNAXRCB":"\u6e56\u5357\u5b89\u4e61\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNXXAQNRCC":"\u6cb3\u5357\u65b0\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNZFRCB":"\u6e56\u5357\u4e2d\u65b9\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HAQPXFCZYH":"\u6276\u98ce\u6d66\u53d1\u6751\u9547\u94f6\u884c","HYXTRERCC":"\u6d77\u539f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HNSZXNCZYH":"\u6e56\u5357\u6851\u690d\u6e58\u519c\u6751\u9547\u94f6\u884c","HAXLKNRCC":"\u60e0\u5b89\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HBBYRCB":"\u6cb3\u5317\u8821\u5dde\u5317\u94f6\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNTBRCC":"\u6cb3\u5357\u6850\u67cf\u519c\u6751\u5546\u4e1a\u94f6\u884c","HHRCC":"\u6000\u5316\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNSPXNCZYH":"\u6e56\u5357\u53cc\u724c\u6e58\u519c\u6751\u9547\u94f6\u884c","HSRCB":"\u6cb3\u5317\u8861\u6c34\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBHGRCC":"\u6e56\u5317\u9ec4\u5188\u519c\u6751\u5546\u4e1a\u94f6\u884c","HDBANK":"\u90af\u90f8\u94f6\u884c","HBDYLDHRCC":"\u6e56\u5317\u5f53\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","HKB":"\u6c49\u53e3\u94f6\u884c","HNQYJNCB":"\u6cb3\u5357\u6c81\u9633\u6c5f\u5357\u6751\u9547\u94f6\u884c","HNHSRCB":"\u6e56\u5357\u6c49\u5bff\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNHSRCC":"\u6e56\u5357\u8861\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBFXRCC":"\u6e56\u5317\u623f\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLJMLSRCC":"\u9ed1\u9f99\u6c5f\u7701\u7a46\u68f1\u5e02\u519c\u6751\u4fe1\u7528\u8054\u793e","HLJLJXRCC":"\u9ed1\u9f99\u6c5f\u7701\u9f99\u6c5f\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","HBWQRCB":"\u6cb3\u5317\u4e07\u5168\u519c\u6751\u5546\u4e1a\u94f6\u884c","HURCB":"\u6e56\u5317\u7701\u519c\u4fe1\u793e","AHQYJHCZYH":"\u6e56\u5357\u6c85\u9675\u65b0\u9633\u6751\u9547\u94f6\u884c","HSBC":"\u6c47\u4e30\u94f6\u884c\uff08\u4e2d\u56fd\uff09","HLHZRCC":"\u5316\u9686\u56de\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u793e\u8054\u793e","HBJMDDBSCZYH":"\u5e7f\u897f\u5174\u5b89\u6c11\u5174\u6751\u9547\u94f6\u884c","HBDJKRCC":"\u6e56\u5317\u4e39\u6c5f\u53e3\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLJLDRCC":"\u9ed1\u9f99\u6c5f\u6797\u7538\u519c\u6751\u5546\u4e1a\u94f6\u884c","HPXDDWRCC":"\u5408\u6d66\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HXBANKCC":"\u534e\u590f\u94f6\u884c\u4fe1\u7528\u5361\u4e2d\u5fc3","HNXHRCB":"\u6e56\u5357\u65b0\u5316\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNXXYGBRCC":"\u6cb3\u5357\u897f\u5ce1\u519c\u6751\u5546\u4e1a\u94f6\u884c","HCSQRCC":"\u6cb3\u6c60\u5e02\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HBDWRCC":"\u6e56\u5317\u5927\u609f\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBZGRCC":"\u6e56\u5317\u79ed\u5f52\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBJLGYPRCC":"\u6e56\u5317\u6c5f\u9675\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLJYAXRCC":"\u9ed1\u9f99\u6c5f\u7701\u4f9d\u5b89\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","HLJFYRCB":"\u9ed1\u9f99\u6c5f\u5bcc\u88d5\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLJFYRCC":"\u9ed1\u9f99\u6c5f\u629a\u8fdc\u519c\u6751\u5546\u4e1a\u94f6\u884c","HSJZFYCB":"\u8861\u6c34\u5180\u5dde\u4e30\u6e90\u6751\u9547\u94f6\u884c","HXRDTRCC":"\u6a2a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HBQHRCB":"\u6cb3\u5317\u6e05\u6cb3\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNBSCJCZYH":"\u91cd\u5e86\u5927\u8db3\u6c47\u4e30\u6751\u9547\u94f6\u884c","GMDZZZRCC":"\u803f\u9a6c\u50a3\u65cf\u4f64\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DXZYFDCZYH":"\u8861\u9633\u53bf\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","PXZYFDCZYH":"\u6e56\u5317\u6c49\u5ddd\u519c\u94f6\u6751\u9547\u94f6\u884c","HJMNZRCC":"\u73af\u6c5f\u6bdb\u5357\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HNTKRCC":"\u6cb3\u5357\u592a\u5eb7\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBKSEMGRCC":"\u548c\u5e03\u514b\u8d5b\u5c14\u8499\u53e4\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HYXTBERCC":"\u6dee\u9633\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HBKSEXRCC":"\u548c\u5e03\u514b\u8d5b\u5c14\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HNZXWVDRCC":"\u6cb3\u5357\u5d69\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","FSSTCZYH":"\u9ec4\u9a85\u9752\u9686\u6751\u9547\u94f6\u884c","WHQLSHTCZYH":"\u4f1a\u5b81\u4f1a\u5e08\u6751\u9547\u94f6\u884c","WSQBCJCZYH":"\u798f\u5efa\u6c38\u6625\u6f33\u519c\u5546\u6751\u9547\u94f6\u884c","HKSRCC":"\u6d77\u53e3\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SDWDJXCZYH":"\u60e0\u5dde\u535a\u7f57\u957f\u6c5f\u6751\u9547\u94f6\u884c","QYSXFRXCZYH":"\u970d\u6797\u90ed\u52d2\u8499\u94f6\u6751\u9547\u94f6\u884c","QLRXCZYH":"\u6e56\u5357\u6538\u53bf\u6f6d\u519c\u5546\u6751\u9547\u94f6\u884c","HDHMCB":"\u60e0\u4e1c\u60e0\u6c11\u6751\u9547\u94f6\u884c","HNHNRCB":"\u6e56\u5357\u8861\u5357\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HBYSCJCB":"\u6e56\u5317\u82f1\u5c71\u957f\u6c5f\u6751\u9547\u94f6\u884c","HLGLSRCC":"\u970d\u6797\u90ed\u52d2\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","HRXJB":"\u534e\u878d\u6e58\u6c5f\u94f6\u884c","HNWCRCC":"\u6d77\u5357\u6587\u660c\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBDZRCB":"\u6cb3\u5317\u5b9a\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HBHARCC":"\u6e56\u5317\u7ea2\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNTSRCC":"\u6dee\u5357\u901a\u5546\u519c\u6751\u5546\u4e1a\u94f6\u884c","HSNCRCC":"\u9ec4\u77f3\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNGSOHYRCC":"\u6cb3\u5357\u5149\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNLKRCC":"\u6cb3\u5357\u5170\u8003\u519c\u6751\u5546\u4e1a\u94f6\u884c","WHBCN":"\u534e\u4fa8\u6c38\u4ea8\u94f6\u884c\uff08\u4e2d\u56fd\uff09","HBXFRCC":"\u6e56\u5317\u54b8\u4e30\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBCBRCC":"\u6e56\u5317\u8d64\u58c1\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBBKRCC":"\u6e56\u5317\u4fdd\u5eb7\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNXCIQXRCC":"\u6cb3\u5357\u65b0\u8521\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLJZZRCC":"\u9ed1\u9f99\u6c5f\u8087\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","DVSLNSSCZYH":"\u6e56\u5357\u51b7\u6c34\u6c5f\u6e58\u6dee\u6751\u9547\u94f6\u884c","SCJYHXCZYH":"\u6e56\u5357\u5cb3\u9633\u6e58\u6c5f\u6751\u9547\u94f6\u884c","ZJCNJXCZYH":"\u6c5f\u82cf\u76f1\u7719\u73e0\u6c5f\u6751\u9547\u94f6\u884c","ZZXWYSRCC":"\u6e5f\u4e2d\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJLAZXCZYH":"\u6e56\u5357\u5357\u53bf\u6e58\u6c5f\u6751\u9547\u94f6\u884c","ZJSYFMCZYH":"\u5e7f\u897f\u9e7f\u5be8\u6e1d\u519c\u5546\u6751\u9547\u94f6\u884c","HZXABNRCC":"\u4f1a\u6cfd\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HBNZRCC":"\u6e56\u5317\u5357\u6f33\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNMYRCB":"\u6e56\u5357\u9ebb\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HBXZRCB":"\u6cb3\u5317\u90a2\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","QEKHRXHRCZYH":"\u6000\u4ec1\u53bf\u6167\u878d\u6751\u9547\u94f6\u884c","HEBYLRCC":"\u54c8\u5c14\u6ee8\u5e02\u4f9d\u5170\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","HNYYVVCRCC":"\u6cb3\u5357\u5b9c\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","HJXNYBRCC":"\u6000\u96c6\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HNBARCC":"\u6cb3\u5357\u535a\u7231\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLHFLCB":"\u6d77\u4f26\u60e0\u4e30\u6751\u9547\u94f6\u884c\u96f7","HNXXXXCZYH":"\u6cb3\u5357\u65b0\u4e61\u65b0\u5174\u6751\u9547\u94f6\u884c","HNLXRCB":"\u6e56\u5357\u6fa7\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HLXJJDRCC":"\u9ec4\u9675\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HBGYRCB":"\u6cb3\u5317\u6cbd\u6e90\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HBXGRCC":"\u6e56\u5317\u5b5d\u611f\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBGCRCC":"\u6e56\u5317\u8c37\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNARRCB":"\u6e56\u5357\u5b89\u4ec1\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HTPZJLCZYH":"\u6c49\u4e2d\u6c49\u53f0\u94fa\u9547\u805a\u5229\u6751\u9547\u94f6\u884c","HHHTSYQMYCZYH":"\u547c\u548c\u6d69\u7279\u5e02\u7389\u6cc9\u8499\u94f6\u6751\u9547\u94f6\u884c","MIHNCXYHEFJ":"\u9ec4\u9f99\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HLXJKFRCC":"\u60e0\u6765\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HBYTRCB":"\u6cb3\u5317\u7389\u7530\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNDXRCB":"\u6e56\u5357\u9053\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SDFCMFCZYH":"\u60e0\u5dde\u4ef2\u607a\u4e1c\u76c8\u6751\u9547\u94f6\u884c","HYXPSJRCC":"\u6d51\u6e90\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HNSMRCB":"\u6e56\u5357\u77f3\u95e8\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HPZXCZYH":"\u8d6b\u7ae0\u5bcc\u6c11\u6751\u9547\u94f6\u884c","NHNX":"\u6d77\u5357\u7701\u519c\u6751\u4fe1\u7528\u793e\u8054\u5408\u793e","HLJTHJGXRCC":"\u9ed1\u9f99\u6c5f\u5854\u6cb3\u519c\u6751\u5546\u4e1a\u94f6\u884c","HANABANK":"\u97e9\u4e9a\u94f6\u884c","HBSZYLDRCC":"\u6e56\u5317\u968f\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNXZRCB":"\u6cb3\u5357\u65b0\u90d1\u519c\u5546\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HBZJKXTRCB":"\u6cb3\u5317\u5f20\u5bb6\u53e3\u5ba3\u6cf0\u519c\u6751\u5546\u4e1a\u94f6\u884c","CAQLCZYH":"\u6e56\u5357\u8861\u5c71\u6f6d\u519c\u5546\u6751\u9547\u94f6\u884c","ZJXCPFCZYH":"\u6e56\u5357\u5e73\u6c5f\u6c47\u4e30\u6751\u9547\u94f6\u884c","HNTDRCB":"\u6e56\u5357\u901a\u9053\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HCXWAXRCC":"\u534e\u6c60\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HNJYRCC":"\u6cb3\u5357\u6d4e\u6e90\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNJYRCB":"\u6e56\u5357\u6c5f\u6c38\u519c\u6751\u5546\u4e1a\u94f6\u884c","OCBC":"\u534e\u4fa8\u94f6\u884c","HRBANK":"\u54c8\u5c14\u6ee8\u94f6\u884c","HNYCRCB":"\u6cb3\u5357\u6c38\u57ce\u519c\u5546\u884c","HNYCRCC":"\u6cb3\u5357\u4f0a\u5ddd\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLJSFHRCC":"\u9ed1\u9f99\u6c5f\u7ee5\u82ac\u6cb3\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNYNRCB":"\u6e56\u5357\u7ee5\u5b81\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNXWRCC":"\u6cb3\u5357\u4fee\u6b66\u519c\u6751\u5546\u4e1a\u94f6\u884c","HZCCB":"\u6e56\u5dde\u94f6\u884c","HNXRCC":"\u6866\u5357\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HNXARCC":"\u6cb3\u5357\u65b0\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNXCXDRCC":"\u6cb3\u5357\u8bb8\u660c\u8bb8\u90fd\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNLGRCC":"\u6d77\u5357\u4e34\u9ad8\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZCXEEERCC":"\u6866\u5ddd\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YYXCQCZYH":"\u8f89\u53bf\u73e0\u6c5f\u6751\u9547\u94f6\u884c","SHSJMSCZYH":"\u60e0\u6c34\u6052\u5347\u6751\u9547\u94f6\u884c","HCJYCZYH":"\u73f2\u6625\u5409\u94f6\u6751\u9547\u94f6\u884c","HLJDNRCC":"\u9ed1\u9f99\u6c5f\u4e1c\u5b81\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNMLRCB":"\u6e56\u5357\u6c68\u7f57\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNLXSSRCB":"\u6e56\u5357\u4e34\u6e58\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HBSSRCC":"\u6e56\u5317\u77f3\u9996\u519c\u6751\u5546\u4e1a\u94f6\u884c","HSBCHK":"HSBC, Hong Kong Branch","CYZZRCC":"\u6ca7\u6e90\u4f64\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HNNYRCC":"\u6e56\u5357\u5357\u5cb3\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNNYRCB":"\u6e56\u5357\u5b81\u8fdc\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HBSHRCB":"\u6cb3\u5317\u6c99\u6cb3\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","YZHFCZYH":"\u6d51\u6e90\u53bf\u6167\u878d\u6751\u9547\u94f6\u884c","HBYXROERCC":"\u6e56\u5317\u90e7\u897f\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNXJXQRCB":"\u6e56\u5357\u6e58\u6c5f\u65b0\u533a\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HBZSKZIRCC":"\u6e56\u5317\u7af9\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNZSRCC":"\u6cb3\u5357\u5043\u5e08\u519c\u6751\u5546\u4e1a\u94f6\u884c","WQRCB":"\u6cb3\u5317\u6b66\u5f3a\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HBZSSQORCC":"\u6e56\u5317\u6d60\u6c34\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBJSRCC":"\u6e56\u5317\u5efa\u59cb\u519c\u6751\u5546\u4e1a\u94f6\u884c","HJSRCC":"\u6cb3\u95f4\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HLJJSJRCC":"\u9ed1\u9f99\u6c5f\u5efa\u4e09\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNSCRCC":"\u6cb3\u5357\u4e0a\u8521\u519c\u6751\u5546\u4e1a\u94f6\u884c","HDXYCZYH":"\u6e56\u5357\u8861\u4e1c\u65b0\u9633\u6751\u9547\u94f6\u884c","ZJSMYZCZYH":"\u6dee\u5b89\u6e05\u6cb3\u5174\u798f\u6751\u9547\u94f6\u884c","XXRHCZYH":"\u6dee\u9633\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","NKGSCZYH":"\u6d4e\u5357\u9ad8\u65b0\u5317\u6d77\u6751\u9547\u94f6\u884c","VTYCSYYXHWU":"\u6d4e\u5357\u519c\u6751\u5546\u4e1a\u94f6\u884c","LFXJNRSCZYH":"\u6d4e\u5b81\u5112\u5546\u6751\u9547\u94f6\u884c","JXHCRCC":"\u6c5f\u897f\u4f1a\u660c\u519c\u6751\u5546\u4e1a\u94f6\u884c","JSB":"\u664b\u5546\u94f6\u884c","JSZJMTCZYH":"\u6e56\u5317\u54b8\u5b89\u6b66\u519c\u5546\u6751\u9547\u94f6\u884c","JAXCQRCC":"\u5409\u5b89\u53bf\u57ce\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","JXGARCC":"\u6c5f\u897f\u9ad8\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXGXIQVRCC":"\u6c5f\u897f\u5e7f\u4fe1\u519c\u6751\u5546\u4e1a\u94f6\u884c","JZZL":"\u7126\u4f5c\u4e2d\u65c5\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","JKXXPTRCC":"\u6c5f\u53e3\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GZLRCB":"\u5409\u6797\u516c\u4e3b\u5cad\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","UMLJNLHCZYH":"\u6d4e\u5b81\u84dd\u6d77\u6751\u9547\u94f6\u884c","JPXXCRRCC":"\u5efa\u5e73\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YGHNSCZYH":"\u5efa\u6c34\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","JXSYRCC":"\u6c5f\u897f\u4e0a\u72b9\u519c\u6751\u5546\u4e1a\u94f6\u884c","JSZJRCB":"\u6c5f\u82cf\u9547\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","BTO":"\u5efa\u4e1c\u94f6\u884c","JLLRCB":"\u5409\u6797\u9f99\u4e95\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","JYQFCZYH":"\u6e56\u5317\u8346\u95e8\u6387\u5200\u5305\u5546\u6751\u9547\u94f6\u884c","JXDNRCC":"\u6c5f\u897f\u5b9a\u5357\u519c\u6751\u5546\u4e1a\u94f6\u884c","JLJHRCB":"\u5409\u6797\u86df\u6cb3\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXDCRCC":"\u6c5f\u897f\u90fd\u660c\u519c\u6751\u5546\u4e1a\u94f6\u884c","JZGXRCC":"\u4e5d\u5be8\u6c9f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","JSHZRCB":"\u6c5f\u82cf\u6d2a\u6cfd\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXDYRCC":"\u6c5f\u897f\u5927\u4f59\u519c\u6751\u5546\u4e1a\u94f6\u884c","JMSSJQWMRRCC":"\u9ed1\u9f99\u6c5f\u7701\u4f73\u6728\u65af\u5e02\u90ca\u533a\u519c\u6751\u4fe1\u7528\u8054\u793e","HNLYSRCB":"\u6e56\u5357\u6d9f\u6e90\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SDPYHYCZYH":"\u6e56\u5357\u6e58\u9634\u661f\u9f99\u6751\u9547\u94f6\u884c","HXXCARCC":"\u73af\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HBLPRCB":"\u6cb3\u5317\u6ee6\u5e73\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXWNQHXRCC":"\u6c5f\u897f\u6b66\u5b81\u519c\u6751\u5546\u4e1a\u94f6\u884c","JLXNLLRCC":"\u5c06\u4e50\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GYNCB":"\u6c5f\u82cf\u8d63\u6986\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXNDRCC":"\u6c5f\u897f\u5b81\u90fd\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXHKRCC":"\u6c5f\u897f\u6e56\u53e3\u519c\u6751\u5546\u4e1a\u94f6\u884c","JNGXCZYH":"\u6d4e\u5b81\u9ad8\u65b0\u6751\u9547\u94f6\u884c","JNHYHNSCZYH":"\u6d2a\u6e56\u878d\u5174\u6751\u9547\u94f6\u884c","YNHQYNSCZYH":"\u6c5f\u82cf\u5b9d\u5e94\u9526\u7a0b\u6751\u9547\u94f6\u884c","YXHMCZYH":"\u6e56\u5357\u9686\u56de\u6e58\u6c5f\u6751\u9547\u94f6\u884c","SZSYCZYH":"\u6e56\u5357\u5b81\u8fdc\u6f6d\u519c\u5546\u6751\u9547\u94f6\u884c","AHYXHSCZYH":"\u5409\u6797\u660c\u9091\u6986\u94f6\u6751\u9547\u94f6\u884c","NXZNQYCZYH":"\u728d\u4e3a\u4e2d\u6210\u6751\u9547\u94f6\u884c","JYSRCC":"\u6c5f\u6cb9\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JLYSRCB":"\u5409\u6797\u6986\u6811\u519c\u6751\u5546\u4e1a\u94f6\u884c","TCRCB":"\u6c5f\u82cf\u592a\u4ed3\u519c\u6751\u5546\u4e1a\u94f6\u884c","jygrcb":"\u5609\u5cea\u5173\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","RDRCB":"\u6c5f\u82cf\u5982\u4e1c\u519c\u6751\u5546\u4e1a\u94f6\u884c","LRCB":"\u6c5f\u82cf\u6ea7\u6c34\u519c\u6751\u5546\u4e1a\u94f6\u884c","JNXRODRCC":"\u5efa\u5b81\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BTSJYLNCZYH":"\u6c5f\u82cf\u5bbf\u8c6b\u4e1c\u5434\u6751\u9547\u94f6\u884c","JXAYAHERCC":"\u6c5f\u897f\u5b89\u8fdc\u519c\u6751\u5546\u4e1a\u94f6\u884c","JLNANSB":"\u5409\u6797\u519c\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","JXCRRCC":"\u6c5f\u897f\u5d07\u4ec1\u519c\u6751\u5546\u4e1a\u94f6\u884c","JZXKZBRCC":"\u9e21\u6cfd\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YZNSHRCB":"\u6c5f\u82cf\u626c\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","JLLHNSB":"\u5409\u6797\u67f3\u6cb3\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","JJXRCC":"\u5939\u6c5f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JSJYRCB":"\u6c5f\u82cf\u59dc\u5830\u519c\u6751\u5546\u4e1a\u94f6\u884c","JSTZRCB":"\u6c5f\u82cf\u6cf0\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","JSSXRCC":"\u79ef\u77f3\u5c71\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JLHLRCB":"\u5409\u6797\u548c\u9f99\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","AHQSJHCZYH":"\u6c5f\u82cf\u6ea7\u6c34\u6c11\u4e30\u6751\u9547\u94f6\u884c","JXFXRCC":"\u6c5f\u897f\u5949\u65b0\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXHFRCC":"\u6c5f\u897f\u6a2a\u5cf0\u519c\u6751\u5546\u4e1a\u94f6\u884c","XHZCCZYH":"\u6c5f\u897f\u83b2\u82b1\u5bcc\u6c11\u6751\u9547\u94f6\u884c","JKXRDCZYH":"\u4ea4\u53e3\u53bf\u878d\u90fd\u6751\u9547\u94f6\u884c","ZJFYHTCZYH":"\u86df\u6cb3\u5409\u94f6\u6751\u9547\u94f6\u884c","JLDARCB":"\u5409\u6797\u5927\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","XYNSRCB":"\u6c5f\u82cf\u65b0\u6c82\u519c\u6751\u5546\u4e1a\u94f6\u884c","JSFNRCB":"\u6c5f\u82cf\u961c\u5b81\u519c\u6751\u5546\u4e1a\u94f6\u884c","JNBANK":"\u6d4e\u5b81\u94f6\u884c","JXXJYCPRCC":"\u6c5f\u897f\u65b0\u5efa\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXSCTCRRCC":"\u6c5f\u897f\u77f3\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","JSHMRCB":"\u6c5f\u82cf\u6d77\u95e8\u519c\u6751\u5546\u4e1a\u94f6\u884c","JSGCWJZJXCZYH":"\u6e56\u5357\u90b5\u9633\u6e58\u6c5f\u6751\u9547\u94f6\u884c","HNZFXYCZYH":"\u6e56\u5357\u4e2d\u65b9\u65b0\u9633\u6751\u9547\u94f6\u884c","HNSPRCB":"\u6e56\u5357\u53cc\u724c\u519c\u6751\u5546\u4e1a\u94f6\u884c","JLGELSB":"\u5409\u6797\u90ed\u5c14\u7f57\u65af\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GZXRKSRCC":"\u7518\u5b5c\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HNRYRCC":"\u6cb3\u5357\u6c5d\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","JLWQRCB":"\u5409\u6797\u6c6a\u6e05\u519c\u6751\u5546\u4e1a\u94f6\u884c","JLCCNSB":"\u5409\u6797\u6625\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","JLZLRCB":"\u5409\u6797\u9547\u8d49\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","CYBC":"\u96c6\u53cb\u94f6\u884c","IELZSXHDCZYH":"\u7a37\u5c71\u53bf\u6cb3\u4e1c\u6751\u9547\u94f6\u884c","JXRCB":"\u90cf\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JMRCB":"\u6c5f\u95e8\u519c\u6751\u5546\u4e1a\u94f6\u884c","JHXHRLRCC":"\u5251\u6cb3\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZLZYFDCZYH":"\u5efa\u5b81\u523a\u6850\u7ea2\u6751\u9547\u94f6\u884c","FXZYFDCZYH":"\u6c5f\u82cf\u5927\u4e30\u6c5f\u5357\u6751\u9547\u94f6\u884c","SZBAGYCZYH":"\u6c5f\u82cf\u4e30\u53bf\u6c11\u4e30\u6751\u9547\u94f6\u884c","JSGYRCB":"\u6c5f\u82cf\u704c\u4e91\u519c\u6751\u5546\u4e1a\u94f6\u884c","JSGCRCB":"\u6c5f\u82cf\u9ad8\u6df3\u519c\u6751\u5546\u4e1a\u94f6\u884c","SYZYFDCZYH":"\u6c5f\u82cf\u9097\u6c5f\u6c11\u6cf0\u6751\u9547\u94f6\u884c","AFZYFDCZYH":"\u6c5f\u82cf\u6c5f\u5b81\u4e0a\u94f6\u6751\u9547\u94f6\u884c","GWAJSJJRFCZYH":"\u6c5f\u82cf\u9756\u6c5f\u6da6\u4e30\u6751\u9547\u94f6\u884c","RGRCB":"\u6c5f\u82cf\u5982\u768b\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","XAYTHTCZYH":"\u6c5f\u897f\u5174\u56fd\u65b0\u534e\u6751\u9547\u94f6\u884c","JPXOLXRCC":"\u91d1\u5e73\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JSBYRCB":"\u6c5f\u82cf\u5b9d\u5e94\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXXSRCC":"\u6c5f\u897f\u4fee\u6c34\u519c\u6751\u5546\u4e1a\u94f6\u884c","SYRCBBANK":"\u6c5f\u82cf\u6cd7\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXLNRCC":"\u6c5f\u897f\u9f99\u5357\u519c\u6751\u5546\u4e1a\u94f6\u884c","JZCBANK":"\u7126\u4f5c\u4e2d\u65c5\u94f6\u884c","JZJFRCC":"\u7126\u4f5c\u89e3\u653e\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXRCRCC":"\u6c5f\u897f\u745e\u660c\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXLXRCC":"\u6c5f\u897f\u82a6\u6eaa\u519c\u6751\u5546\u4e1a\u94f6\u884c","JCJNCXYHIQK":"\u548c\u7530\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","JXYMYH":"\u6c5f\u897f\u88d5\u6c11\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","JZSYQRCC":"\u7126\u4f5c\u5e02\u5c71\u9633\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NTRCB":"\u6c5f\u82cf\u5357\u901a\u519c\u6751\u5546\u4e1a\u94f6\u884c","JCXAVZRCC":"\u5251\u5ddd\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JLSYRCB":"\u5409\u6797\u53cc\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","JSSRCC":"\u79ef\u77f3\u5c71\u4fdd\u5b89\u65cf\u4e1c\u4e61\u65cf\u6492\u62c9\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JSZSMFCZYH":"\u6c5f\u82cf\u704c\u4e91\u6c11\u4e30\u6751\u9547\u94f6\u884c","JLJARCB":"\u5409\u6797\u96c6\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","ZJMSCZYH":"\u754c\u9996\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","ZNHSCZYH":"\u5409\u6c34\u5e90\u9675\u6751\u9547\u94f6\u884c","JCXBJZRCC":"\u5efa\u660c\u53bf\u516b\u5bb6\u5b50\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","JXBANK":"\u5609\u5174\u94f6\u884c","PGGMCZYH":"\u6c5f\u5ddd\u5174\u798f\u6751\u9547\u94f6\u884c","HNZCMFCZYH":"\u6c5f\u82cf\u704c\u5357\u6c11\u4e30\u6751\u9547\u94f6\u884c","HNHHRCB":"\u6e56\u5357\u82b1\u57a3\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNYLRCB":"\u6e56\u5357\u708e\u9675\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNHHRCC":"\u6dee\u5357\u6dee\u6cb3\u519c\u6751\u5546\u4e1a\u94f6\u884c","HXZYFDCZYH":"\u91cd\u5e86\u6e1d\u5317\u94f6\u5ea7\u6751\u9547\u94f6\u884c","BJHRRXCZYH":"\u6c5f\u82cf\u6d77\u5b89\u76d0\u6d77\u6751\u9547\u94f6\u884c","BYPCZYFDCZYH":"\u96c6\u5b89\u60e0\u946b\u6751\u9547\u94f6\u884c","GZLPFCZYH":"\u6d4e\u9633\u5317\u6d77\u6751\u9547\u94f6\u884c","WRXHMCZYH":"\u6c5f\u82cf\u5c04\u9633\u592a\u5546\u6751\u9547\u94f6\u884c","JSSNRCB":"\u6c5f\u82cf\u7762\u5b81\u519c\u6751\u5546\u4e1a\u94f6\u884c","AKHBZYFDCZYH":"\u6c5f\u82cf\u65b0\u6c82\u6c49\u6e90\u6751\u9547\u94f6\u884c","JSYZRCB":"\u6c5f\u82cf\u626c\u4e2d\u519c\u6751\u5546\u4e1a\u94f6\u884c","KIBJXXZJHCZYH":"\u6c5f\u897f\u4fe1\u5dde\u6c5f\u6dee\u6751\u9547\u94f6\u884c","JGRCB":"\u91d1\u8c37\u519c\u5546\u94f6\u884c","JTXPYVRCC":"\u91d1\u5854\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JSHRCB":"\u6c5f\u82cf\u76d0\u57ce\u9ec4\u6d77\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXVLZRCC":"\u5409\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JSJDRCB":"\u6c5f\u82cf\u6c5f\u90fd\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXFCRCC":"\u6c5f\u897f\u4e30\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","HANCB":"\u6c5f\u82cf\u6dee\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","QDRCB":"\u6c5f\u82cf\u542f\u4e1c\u519c\u6751\u5546\u4e1a\u94f6\u884c","PXRCB":"\u6c5f\u82cf\u6c9b\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","JYQLCZYH":"\u6c5f\u82cf\u4e1c\u53f0\u7a20\u5dde\u6751\u9547\u94f6\u884c","JTHJCZYH":"\u91d1\u5802\u6c47\u91d1\u6751\u9547\u94f6\u884c","JPHSCB":"\u5efa\u5e73\u7ea2\u5c71\u6751\u9547\u94f6\u884c","JSHSMTCB":"\u6c5f\u82cf\u60e0\u5c71\u6c11\u6cf0\u6751\u9547\u94f6\u884c","ZJTZLQFMCZYH":"\u6c5f\u82cf\u6cd7\u9633\u4e1c\u5434\u6751\u9547\u94f6\u884c","AYRXCZYH":"\u6c5f\u82cf\u94dc\u5c71\u9521\u5dde\u6751\u9547\u94f6\u884c","WCMZMZXHSCZYH":"\u91d1\u6eaa\u629a\u5546\u6751\u9547\u94f6\u884c","JJBANK":"\u4e5d\u6c5f\u94f6\u884c","JZTQRCB":"\u9526\u5dde\u5929\u6865\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXXRCC":"\u8fdb\u8d24\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JLDFRCB":"\u5409\u6797\u4e1c\u4e30\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","JXJZRCC":"\u6c5f\u897f\u6c5f\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","JNXLLNRCC":"\u664b\u5b81\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GYNSH":"\u6c5f\u82cf\u9ad8\u90ae\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXYZRCC":"\u91d1\u79c0\u7476\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JXGCERRRCC":"\u6c5f\u897f\u8d63\u660c\u519c\u6751\u5546\u4e1a\u94f6\u884c","NCB":"\u6c5f\u897f\u94f6\u884c","JXXGKYXRCC":"\u6c5f\u897f\u5174\u56fd\u519c\u6751\u5546\u4e1a\u94f6\u884c","JZMCQRCC":"\u7126\u4f5c\u5e02\u9a6c\u6751\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JIANGSU":"\u6c5f\u82cf\u91d1\u6e56\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXLHRCC":"\u6c5f\u897f\u83b2\u82b1\u519c\u6751\u5546\u4e1a\u94f6\u884c","WSQBSCZYH":"\u6c5f\u82cf\u6c5f\u90fd\u5409\u94f6\u6751\u9547\u94f6\u884c","JXLSRCC":"\u6c5f\u897f\u5e90\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","JLTHRCB":"\u5409\u6797\u901a\u5316\u6d77\u79d1\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","CJCCB":"\u6c5f\u82cf\u957f\u6c5f\u5546\u4e1a\u94f6\u884c","JYXLYERCC":"\u5609\u836b\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JXWNSBWRCC":"\u6c5f\u897f\u4e07\u5e74\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXYWRCC":"\u6c5f\u897f\u5bfb\u4e4c\u519c\u6751\u5546\u4e1a\u94f6\u884c","BOJZ":"\u9526\u5dde\u94f6\u884c","NARXCZYH":"\u664b\u5dde\u6052\u5347\u6751\u9547\u94f6\u884c","JDMSCZYH":"\u65cc\u5fb7\u6c11\u5546\u6751\u9547\u94f6\u884c","JXZXRCC":"\u6c5f\u897f\u8d44\u6eaa\u519c\u6751\u5546\u4e1a\u94f6\u884c","JSYZBSCZYH":"\u6c5f\u82cf\u4eea\u5f81\u5305\u5546\u6751\u9547\u94f6\u884c","JXGCIEORCC":"\u6c5f\u897f\u5e7f\u660c\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXDXLZERCC":"\u6c5f\u897f\u5fb7\u5174\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXZSRCC":"\u6c5f\u897f\u6a1f\u6811\u519c\u6751\u5546\u4e1a\u94f6\u884c","ICFCC":"\u91d1\u878d\u7535\u5b50\u5316\u516c\u53f8","BSLLCJCZYH":"\u8346\u95e8\u4e1c\u5b9d\u60e0\u6c11\u6751\u9547\u94f6\u884c","ZYXMLYRCC":"\u6cfe\u9633\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HNTCCJCZYH":"\u666f\u5fb7\u9547\u660c\u6c5f\u4e5d\u94f6\u6751\u9547\u94f6\u884c","HLHFCZYH":"\u4ea4\u57ce\u53bf\u592a\u884c\u6751\u9547\u94f6\u884c","HNJHXLCZYH":"\u6e56\u5357\u5609\u79be\u661f\u9f99\u6751\u9547\u94f6\u884c","HBWDSRCC":"\u6e56\u5317\u6b66\u5f53\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","JDZNCRCC":"\u666f\u5fb7\u9547\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXJXYGXRCC":"\u6c5f\u897f\u8fdb\u8d24\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXNFRCC":"\u6c5f\u897f\u5357\u4e30\u519c\u6751\u5546\u4e1a\u94f6\u884c","COMMHK":"\u4ea4\u901a\u94f6\u884c\u9999\u6e2f\u5206\u884c","YMCNSCZYH":"\u666f\u6d2a\u6c11\u751f\u6751\u9547\u94f6\u884c","JAJYCB":"\u9756\u5b89\u4e5d\u94f6\u6751\u9547\u94f6\u884c","JSGNRCB":"\u6c5f\u82cf\u704c\u5357\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","YJRCB":"\u5409\u6797\u6c38\u5409\u519c\u6751\u5546\u4e1a\u94f6\u884c","JJNCRCC":"\u4e5d\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","JTXNEPRCC":"\u666f\u6cf0\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JMRHRCB":"\u6c5f\u95e8\u878d\u548c\u519c\u6751\u5546\u4e1a\u94f6\u884c","ITPZXZYCZYH":"\u6c5f\u82cf\u9097\u6c5f\u8054\u5408\u6751\u9547\u94f6\u884c","YZRCB":"\u6c5f\u82cf\u4eea\u5f81\u519c\u6751\u5546\u4e1a\u94f6\u884c","SYRCB":"\u6c5f\u82cf\u5c04\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","JSDFRCB":"\u6c5f\u82cf\u5927\u4e30\u519c\u6751\u5546\u4e1a\u94f6\u884c","JZRCU":"\u6cb3\u5317\u664b\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","JZRCB":"\u9526\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","LSRCB":"\u6c5f\u82cf\u6d9f\u6c34\u519c\u6751\u5546\u4e1a\u94f6\u884c","JLDHRCB":"\u5409\u6797\u5fb7\u60e0\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","BSJXCJCZYH":"\u6c5f\u82cf\u6d2a\u6cfd\u91d1\u9633\u5149\u6751\u9547\u94f6\u884c","JXTGRCC":"\u6c5f\u897f\u94dc\u9f13\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXRJGDCB":"\u6c5f\u897f\u745e\u91d1\u5149\u5927\u6751\u9547\u94f6\u884c","JSSYDWCZYH":"\u6d77\u5357\u660c\u6c5f\u957f\u6c5f\u6751\u9547\u94f6\u884c","JXYXCXVRCC":"\u6c5f\u897f\u6c38\u65b0\u519c\u6751\u5546\u4e1a\u94f6\u884c","JCXRCRRCC":"\u5efa\u660c\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","JXXTCB":"\u5409\u53bf\u65b0\u7530\u6751\u9547\u94f6\u884c","ZWXEIORCC":"\u728d\u4e3a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","JPXNIQRCC":"\u9526\u5c4f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JSHMJXCZYH":"\u6c5f\u82cf\u6d77\u95e8\u5efa\u4fe1\u6751\u9547\u94f6\u884c","DHRCB":"\u6c5f\u82cf\u4e1c\u6d77\u519c\u6751\u5546\u4e1a\u94f6\u884c","JLJTRCB":"\u5409\u6797\u4e5d\u53f0\u519c\u6751\u5546\u4e1a\u94f6\u884c","JSDYRCB":"\u6c5f\u82cf\u4e39\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXSCVKKRCC":"\u6c5f\u897f\u9042\u5ddd\u519c\u6751\u5546\u4e1a\u94f6\u884c","JLRCU":"\u5409\u6797\u7701\u519c\u6751\u4fe1\u7528\u793e\u8054\u5408\u793e","JXZYRQLRCC":"\u6c5f\u897f\u5a7a\u6e90\u519c\u6751\u5546\u4e1a\u94f6\u884c","JSYXRCB":"\u6c5f\u82cf\u5b9c\u5174\u519c\u6751\u5546\u4e1a\u94f6\u884c","YHFSCZYH":"\u664b\u4e2d\u5e02\u5de6\u6743\u534e\u4e30\u6751\u9547\u94f6\u884c","TZXHDCZYH":"\u4eac\u5c71\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","ICBCgrwj02":"\u97a0\u54e5\u6c28\u6d4b\u8bd5\u96f6\u4e8c\u7684\u516c\u53f8","JLRXCZYH":"\u5de8\u9e7f\u878d\u4fe1\u6751\u9547\u94f6\u884c","JYZYFDCZYH":"\u5de8\u91ce\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","JCRCU":"\u91d1\u660c\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","JNRCC":"\u6d4e\u5b81\u519c\u6751\u5546\u4e1a\u94f6\u884c","JNRCB":"\u6d4e\u5357\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","JZZZQRCC":"\u7126\u4f5c\u5e02\u4e2d\u7ad9\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JCRCB":"\u664b\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","NTHSCB":"\u6c5f\u82cf\u901a\u5dde\u534e\u5546\u6751\u9547\u94f6\u884c","JYRCB":"\u5409\u6797\u9756\u5b87\u519c\u6751\u5546\u4e1a\u94f6\u884c","JMSEXRCC":"\u5409\u6728\u8428\u5c14\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SHYRCB":"\u6c5f\u82cf\u6cad\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXWARCC":"\u6c5f\u897f\u4e07\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","JSBHRCB":"\u6c5f\u82cf\u6ee8\u6d77\u519c\u6751\u5546\u4e1a\u94f6\u884c","PZRCB":"\u6c5f\u82cf\u90b3\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","JLLJRCB":"\u5409\u6797\u4e34\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","JCXLMDRCC":"\u5efa\u660c\u53bf\u5587\u561b\u6d1e\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","JSDTRCB":"\u6c5f\u82cf\u4e1c\u53f0\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXRSCB":"\u96c6\u8d24\u6da6\u751f\u6751\u9547\u94f6\u884c","ZGZCCZYH":"\u6d4e\u5357\u957f\u6e05\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","LTSFCZYH":"\u5251\u6cb3\u5bcc\u6c11\u6751\u9547\u94f6\u884c","LCRHCZYH":"\u6cb3\u95f4\u878d\u60e0\u6751\u9547\u94f6\u884c","HNXNCNNHRCC":"\u6cb3\u5357\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","LLXFCZYH":"\u6e56\u5357\u65b0\u5b81\u6f6d\u519c\u5546\u6751\u9547\u94f6\u884c","XMZYCZYH":"\u6c5f\u82cf\u9ad8\u6df3\u6b66\u5bb6\u5634\u5efa\u4fe1\u6751\u9547\u94f6\u884c","HKSNCZYH":"\u6c5f\u82cf\u5982\u4e1c\u878d\u5174\u6751\u9547\u94f6\u884c","JSBANK":"\u6c5f\u82cf\u94f6\u884c","JXGAFMCZYH":"\u6c5f\u897f\u9ad8\u5b89\u5bcc\u6c11\u6751\u9547\u94f6\u884c","JXWZFMCZYH":"\u6c5f\u897f\u4e07\u8f7d\u5bcc\u6c11\u6751\u9547\u94f6\u884c","JHBANK":"\u91d1\u534e\u94f6\u884c","JSFXRCB":"\u6c5f\u82cf\u4e30\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXZYWZYRCC":"\u6c5f\u897f\u9131\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","JMSSJQFJGRCC":"\u4f73\u6728\u65af\u5e02\u90ca\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JSXRCC":"\u91d1\u6c99\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JSXHRCB":"\u6c5f\u82cf\u5174\u5316\u519c\u6751\u5546\u4e1a\u94f6\u884c","JZRCBANK":"\u6c5f\u82cf\u7d2b\u91d1\u519c\u6751\u5546\u4e1a\u94f6\u884c","XSNSRCB":"\u6c5f\u82cf\u54cd\u6c34\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXQSRCC":"\u6c5f\u897f\u94c5\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","JZSRCC":"\u5efa\u74ef\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","MFRCB":"\u6c5f\u82cf\u6c11\u4e30\u519c\u6751\u5546\u4e1a\u94f6\u884c","JLCNSCB":"\u6c5f\u9675\u695a\u519c\u5546\u6751\u9547\u94f6\u884c","JLHJRCB":"\u5409\u6797\u6d51\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GZBYMTCZYH":"\u9104\u57ce\u5305\u5546\u6751\u9547\u94f6\u884c","GFGXCZYH":"\u6c5f\u82cf\u90b3\u5dde\u9647\u6d77\u6751\u9547\u94f6\u884c","JXRJRCC":"\u6c5f\u897f\u745e\u91d1\u519c\u6751\u5546\u4e1a\u94f6\u884c","JSZZZJCZYH":"\u548c\u653f\u795e\u821f\u6751\u9547\u94f6\u884c","JLCYHMCZYH":"\u5409\u6797\u8239\u8425\u60e0\u6c11\u6751\u9547\u94f6\u884c","JZKFQRCC":"\u664b\u4e2d\u5f00\u53d1\u533a\u519c\u6751\u5546\u4e1a\u94f6\u884c","JLDHB":"\u5409\u6797\u6566\u5316\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXSLRCC":"\u6c5f\u897f\u4e0a\u6817\u519c\u6751\u5546\u4e1a\u94f6\u884c","FXCNSCZYH":"\u90cf\u53bf\u5e7f\u5929\u6751\u9547\u94f6\u884c","YLBANK":"\u5409\u6797\u4ebf\u8054\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","ZZZJCZYH":"\u6c5f\u897f\u4e0a\u6817\u5bcc\u6c11\u6751\u9547\u94f6\u884c","JZHYBANK":"\u91d1\u5be8\u5fbd\u94f6\u6751\u9547\u94f6\u884c","JXXFRCC":"\u6c5f\u897f\u4fe1\u4e30\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXWZRCC":"\u6c5f\u897f\u4e07\u8f7d\u519c\u6751\u5546\u4e1a\u94f6\u884c","JSTXJXCZYH":"\u6c5f\u897f\u82a6\u6eaa\u5bcc\u6c11\u6751\u9547\u94f6\u884c","JSHAGDCZB":"\u6c5f\u82cf\u6dee\u5b89\u5149\u5927\u6751\u9547\u94f6\u884c","JMNXRCC":"\u5409\u6728\u4e43\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JSHARCB":"\u6c5f\u82cf\u6d77\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXYFUSQRCC":"\u6c5f\u897f\u5b9c\u4e30\u519c\u6751\u5546\u4e1a\u94f6\u884c","DMZYFDCZYH":"\u8fdb\u8d24\u745e\u4e30\u6751\u9547\u94f6\u884c","LWPFCZYH":"\u5fb7\u5e86\u534e\u6da6\u6751\u9547\u94f6\u884c","JZBANK":"\u664b\u4e2d\u94f6\u884c","JSXYRCB":"\u6c5f\u82cf\u76f1\u7719\u519c\u6751\u5546\u4e1a\u94f6\u884c","JLATRCB":"\u5409\u6797\u5b89\u56fe\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXQNRCC":"\u6c5f\u897f\u5168\u5357\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXJSRCC":"\u6c5f\u897f\u5409\u6c34\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXFYCZYH":"\u666f\u53bf\u4e30\u6e90\u6751\u9547\u94f6\u884c","JLHCNCB":"\u5409\u6797\u73f2\u6625\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","LTHYCZYH":"\u5409\u6797\u9f99\u6f6d\u534e\u76ca\u6751\u9547\u94f6\u884c","MYYCCZYH":"\u6c5f\u82cf\u6cd7\u6d2a\u4e1c\u5434\u6751\u9547\u94f6\u884c","JYXAVCRCC":"\u4e95\u7814\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JXLLRCC":"\u6c5f\u897f\u5e90\u9675\u519c\u6751\u5546\u4e1a\u94f6\u884c","jsycrcb":"\u6c5f\u82cf\u76d0\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXJXSGNRCC":"\u6c5f\u897f\u91d1\u6eaa\u519c\u6751\u5546\u4e1a\u94f6\u884c","JRCB":"\u6c5f\u82cf\u6c5f\u9634\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXSGFMCZYH":"\u6c5f\u897f\u4e0a\u9ad8\u5bcc\u6c11\u6751\u9547\u94f6\u884c","JXYHRCC":"\u6c5f\u897f\u5b9c\u9ec4\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXYSRCC":"\u6c5f\u897f\u7389\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXZYFDCZYH":"\u6c5f\u82cf\u91d1\u6e56\u6c11\u6cf0\u6751\u9547\u94f6\u884c","JXXGRVPRCC":"\u6c5f\u897f\u65b0\u5e72\u519c\u6751\u5546\u4e1a\u94f6\u884c","YHCZCZYH":"\u4e5d\u6c5f\u5171\u9752\u6751\u9547\u94f6\u884c","QJZYXFCZYH":"\u4e5d\u6c5f\u5e90\u5c71\u6d54\u94f6\u6751\u9547\u94f6\u884c","JQRCB":"\u9152\u6cc9\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXSGRCC":"\u6c5f\u897f\u4e0a\u9ad8\u519c\u6751\u5546\u4e1a\u94f6\u884c","JZXHKARCC":"\u5c16\u624e\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u5408\u793e","AHMCHSCZYH":"\u5580\u5587\u6c81\u7389\u9f99\u6751\u9547\u94f6\u884c","KFSDRCC":"\u5f00\u5c01\u5b8b\u90fd\u519c\u6751\u5546\u4e1a\u94f6\u884c","KFXDFBANK":"\u5f00\u5c01\u65b0\u4e1c\u65b9\u6751\u9547\u94f6\u884c","KZZJMKPCJCZYH":"\u6c5f\u95e8\u5f00\u5e73\u957f\u6c5f\u6751\u9547\u94f6\u884c","JMXHRCB":"\u6c5f\u95e8\u65b0\u4f1a\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZQFYCZYH":"\u6c5f\u82cf\u542f\u4e1c\u73e0\u6c5f\u6751\u9547\u94f6\u884c","JXTHRCC":"\u6c5f\u897f\u6cf0\u548c\u519c\u6751\u5546\u4e1a\u94f6\u884c","JSDYBDCZYH":"\u6c5f\u82cf\u6cf0\u5174\u5efa\u4fe1\u6751\u9547\u94f6\u884c","JLHDRCB":"\u5409\u6797\u6866\u7538\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","WFSHTQMYCZYH":"\u6c5f\u9634\u6d66\u53d1\u6751\u9547\u94f6\u884c","ZYXWLQRCC":"\u6cfe\u6e90\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","KPSRCC":"\u5f00\u5e73\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJTXMTCZYH":"\u5f00\u53bf\u6cf0\u4e1a\u6751\u9547\u94f6\u884c","ZKXBTGRCC":"\u78f4\u53e3\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HNRCXYCZYH":"\u5f00\u9633\u5bcc\u6c11\u6751\u9547\u94f6\u884c","HBNCRCC":"\u6dee\u5317\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZZRXCZYH":"\u9756\u5b87\u4e7e\u4e30\u6751\u9547\u94f6\u884c","ZLFJSPXHYCZYH":"\u6c5f\u82cf\u6c9b\u53bf\u6c49\u6e90\u6751\u9547\u94f6\u884c","JLXNNNRCC":"\u4e5d\u9f99\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JXGFRCC":"\u6c5f\u897f\u5e7f\u4e30\u519c\u6751\u5546\u4e1a\u94f6\u884c","JJRCB":"\u6c5f\u82cf\u9756\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXYFFNXRCC":"\u6c5f\u897f\u6c38\u4e30\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXXJFXORCC":"\u6c5f\u897f\u5ce1\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","JSNFRCB":"\u6c5f\u82cf\u6c11\u4e30","CZRCB":"\u6c5f\u5357\u519c\u6751\u5546\u4e1a\u94f6\u884c","JLPSRCB":"\u5409\u6797\u78d0\u77f3\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","JZZJCZYH":"\u5609\u7965\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","JPXZLKRCC":"\u5efa\u5e73\u53bf\u6731\u788c\u79d1\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","JXJARCC":"\u6c5f\u897f\u9756\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","JSZYDWCPHU":"\u6c5f\u82cf\u6cad\u9633\u4e1c\u5434\u6751\u9547\u94f6\u884c","SCHDCZYH":"\u9526\u5dde\u592a\u548c\u9526\u94f6\u6751\u9547\u94f6\u884c","BANKJDZ":"\u666f\u5fb7\u9547\u5e02\u5546\u4e1a\u94f6\u884c","JXPZRCC":"\u6c5f\u897f\u5f6d\u6cfd\u519c\u6751\u5546\u4e1a\u94f6\u884c","XYYSXHCZYH":"\u4e5d\u6c5f\u6052\u901a\u6751\u9547\u94f6\u884c","UYXNCXYHBYV":"\u5580\u5de6\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","KBXRCC":"\u5eb7\u4fdd\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","KDXRCC":"\u5eb7\u5b9a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","KZXRCC":"\u5580\u5de6\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","KBYFCZYH":"\u5eb7\u4fdd\u94f6\u4e30\u6751\u9547\u94f6\u884c","KYXRCC":"\u5f00\u9633\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","KJXRCC":"\u5f00\u6c5f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DSSNCXYHEAU":"\u5eb7\u5e73\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JRCZYZQNEDW":"\u79d1\u5c14\u6c81\u5de6\u7ffc\u4e2d\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YNXPBYCZYH":"\u514b\u62c9\u739b\u4f9d\u91d1\u9f99\u56fd\u6c11\u6751\u9547\u94f6\u884c","KDCITY":"\u5bbd\u7538\u53bf\u57ce\u5e02\u4fe1\u7528\u793e","KCRXCZYH":"\u5bbd\u57ce\u878d\u5174\u6751\u9547\u94f6\u884c","KYSXOPRCC":"\u5f00\u539f\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WDZCCZYH":"\u594e\u5c6f\u56fd\u6c11\u6751\u9547\u94f6\u884c","KMGDRCC":"\u6606\u660e\u5b98\u6e21\u519c\u6751\u5408\u4f5c\u94f6\u884c","KDBFCZYH":"\u5bbd\u7538\u767e\u4e30\u6751\u9547\u94f6\u884c","KELFMCZ":"\u5e93\u5c14\u52d2\u5bcc\u6c11\u6751\u9547\u94f6\u884c","KCGMCB":"\u5e93\u8f66\u56fd\u6c11\u6751\u9547\u94f6\u884c","KTBANK":"\u5f00\u6cf0\u94f6\u884c\uff08\u4e2d\u56fd\uff09\u6709\u9650\u516c\u53f8","XXFYCZYH":"\u6606\u660e\u9a6c\u91d1\u94fa\u4e2d\u6210\u6751\u9547\u94f6\u884c","ZBBSBHCZYH":"\u6606\u660e\u77f3\u6797\u4e2d\u6210\u6751\u9547\u94f6\u884c","KMDCQRCC":"\u6606\u660e\u5e02\u4e1c\u5ddd\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","KMWHQRCC":"\u6606\u660e\u5e02\u4e94\u534e\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YXHYCZYH":"\u6606\u660e\u4e94\u534e\u957f\u6c5f\u6751\u9547\u94f6\u884c","KMYLRFCZYH":"\u6606\u660e\u5b9c\u826f\u878d\u4e30\u6751\u9547\u94f6\u884c","KSXRCC":"\u514b\u5c71\u53bf\u519c\u6751\u5408\u4f5c\u4fe1\u7528\u8054\u793e","KMPLQRCC":"\u6606\u660e\u5e02\u76d8\u9f99\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","KMSJNQRCB":"\u6606\u660e\u5e02\u664b\u5b81\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","KLLACB":"\u57a6\u5229\u4e50\u5b89\u6751\u9547\u94f6\u884c","KYSAKGRCC":"\u5f00\u8fdc\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","KLXECCRCC":"\u5f00\u9c81\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","KLXZMMRCC":"\u5eb7\u4e50\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YDMSCZYH":"\u514b\u5c71\u6da6\u751f\u6751\u9547\u94f6\u884c","ZXXIBRCC":"\u5c9a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJPYPFCZYH":"\u5170\u5dde\u5b89\u5b81\u795e\u821f\u6751\u9547\u94f6\u884c","ZGEQBSCZYH":"\u6606\u660e\u4e1c\u5ddd\u4e2d\u6210\u6751\u9547\u94f6\u884c","XJLZGMCZYH":"\u6606\u5c71\u9e7f\u57ce\u6751\u9547\u94f6\u884c","DLBCCJCZYH":"\u83b1\u829c\u4e2d\u6210\u6751\u9547\u94f6\u884c","CSZYFDCZYH":"\u5170\u5dde\u6c38\u767b\u65b0\u534e\u6751\u9547\u94f6\u884c","HBCBCJCZYH":"\u8001\u6cb3\u53e3\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","HNXNRCB":"\u6e56\u5357\u65b0\u5b81\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HHRXCZYH":"\u5170\u897f\u519c\u5546\u6751\u9547\u94f6\u884c","LNFRCB":"\u8fbd\u5b81\u51e4\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","LHXYKRRCC":"\u83b2\u82b1\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LNJPRCB":"\u8fbd\u5b81\u5efa\u5e73\u519c\u6751\u5546\u4e1a\u94f6\u884c","BOB":"\u84dd\u6d77\u94f6\u884c","LZZJCZYH":"\u83b1\u5dde\u73e0\u6c5f\u6751\u9547\u94f6\u884c","GCNYCZYH":"\u8fbd\u5b81\u51cc\u6d77\u9526\u94f6\u6751\u9547\u94f6\u884c","KMLQZCCZYH":"\u8fbd\u5b81\u6c88\u4e1c\u6751\u9547\u94f6\u884c","KLB":"\u6606\u4ed1\u94f6\u884c","KRL":"\u5e93\u5c14\u52d2\u94f6\u884c","YCRXCZYH":"\u4e50\u4ead\u821c\u4e30\u6751\u9547\u94f6\u884c","DZLCYRCZYH":"\u9675\u57ce\u5706\u878d\u6751\u9547\u94f6\u884c","LNXUDZRCC":"\u6d1b\u5357\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","BDR":"\u7f57\u9a6c\u94f6\u884c","LYZYFDCB":"\u4e34\u9091\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","BOL":"\u6d1b\u9633\u94f6\u884c","LHSYCBSCZYH":"\u6f2f\u6cb3\u5e02\u90fe\u57ce\u5305\u5546\u6751\u9547\u94f6\u884c","LDSRCC":"\u7f57\u5b9a\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LNHLRCB":"\u8fbd\u5b81\u6853\u4ec1\u519c\u6751\u5546\u4e1a\u94f6\u884c","LZSMMTRCC":"\u6797\u5dde\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LNKDRCB":"\u8fbd\u5b81\u5bbd\u7538\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","LYCB":"\u8fbd\u9633\u94f6\u884c","DGRCB":"\u8fbd\u5b81\u4e1c\u6e2f\u519c\u6751\u5546\u4e1a\u94f6\u884c","LNDWRCB":"\u8fbd\u5b81\u5927\u6d3c\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","LSSRCB":"\u51c9\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","LXXFPKRCC":"\u5170\u897f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ATNSCZYH":"\u8fbd\u5b81\u706f\u5854\u6751\u9547\u94f6\u884c","SFRCB":"\u8fbd\u5b81\u6c88\u629a\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","LZANSZCZYH":"\u5317\u4eac\u623f\u5c71\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","LYB":"\u8fbd\u9633\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","BYNESWLTCZYH":"\u8fbd\u6e90\u9f99\u5c71\u6986\u94f6\u6751\u9547\u94f6\u884c","LZCCB":"\u67f3\u5dde\u94f6\u884c","LFSHCB":"\u5a04\u70e6\u4e09\u79be\u6751\u9547\u94f6\u884c","LAZYFDCB":"\u6765\u5b89\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","LCSRCC":"\u4e50\u660c\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LNKZJYCB":"\u8fbd\u5b81\u5580\u5de6\u9526\u94f6\u6751\u9547\u94f6\u884c","LSBANK":"\u83b1\u5546\u94f6\u884c","LANGFB":"\u5eca\u574a\u94f6\u884c","LQXAFXRCC":"\u793c\u6cc9\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LZXBNGRCC":"\u4e34\u6f33\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LNHCJHCZYH":"\u8fbd\u5b81\u6d77\u57ce\u91d1\u6d77\u6751\u9547\u94f6\u884c","LYYDQRCC":"\u9f99\u5ca9\u5e02\u6c38\u5b9a\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LZTQRCC":"\u516d\u679d\u7279\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LYHDQSRCB":"\u4e34\u6c82\u6cb3\u4e1c\u9f50\u5546\u6751\u9547\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","LXHRCZYH":"\u5c9a\u53bf\u6167\u878d\u6751\u9547\u94f6\u884c","LLVB":"\u5170\u9675\u6751\u9547\u94f6\u884c","LWZJCB":"\u83b1\u829c\u73e0\u6c5f\u6751\u9547\u94f6\u884c","ZQSSPBRXCZYH":"\u4e50\u5b89\u6d2a\u90fd\u6751\u9547\u94f6\u884c","ZZSXKSRCC":"\u9606\u4e2d\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJCSLHCZYH":"\u6e56\u5357\u6d25\u5e02\u6e58\u6dee\u6751\u9547\u94f6\u884c","HNZYJHCZYH":"\u5362\u6c0f\u4e2d\u539f\u6751\u9547\u94f6\u884c","HBTMHFCZYH":"\u8fbd\u5b81\u9ed1\u5c71\u9526\u94f6\u6751\u9547\u94f6\u884c","HLLFCZYH":"\u6000\u6765\u5229\u4e30\u6751\u9547\u94f6\u884c","LSNCSYYXGFYXGS":"\u4e50\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","LNSBRCB":"\u8fbd\u5b81\u6c88\u672c\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","LDLZRCC":"\u4e50\u4e1c\u9ece\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LNSDCZYH":"\u798f\u5efa\u5e73\u6f6d\u6e1d\u519c\u5546\u6751\u9547\u94f6\u884c","LJGCFDCZYH":"\u4e3d\u6c5f\u53e4\u57ce\u5bcc\u6ec7\u6751\u9547\u94f6\u884c","LCXKJHRCC":"\u8fde\u57ce\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LXNSCZYH":"\u5b89\u5fbd\u548c\u53bf\u65b0\u534e\u6751\u9547\u94f6\u884c","GDYDRCB":"\u5e7f\u4e1c\u9633\u4e1c\u519c\u6751\u5546\u4e1a\u94f6\u884c","GZRCU":"\u8d35\u5dde\u7701\u519c\u6751\u4fe1\u7528\u793e\u8054\u5408\u793e","LZHMCZYH":"\u96f7\u5dde\u60e0\u6c11\u6751\u9547\u94f6\u884c","LSWTQRCC":"\u4e50\u5c71\u5e02\u4e94\u901a\u6865\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","LSCCB":"\u4e50\u5c71\u5e02\u5546\u4e1a\u94f6\u884c","LPXILURCC":"\u5170\u576a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NXXJHFCZYH":"\u5170\u5dde\u768b\u5170\u65b0\u534e\u6751\u9547\u94f6\u884c","HNPJHFCZYH":"\u8354\u6ce2\u5bcc\u6c11\u6751\u9547\u94f6\u884c","HNZZLSCZYH":"\u9ece\u5ddd\u629a\u5546\u6751\u9547\u94f6\u884c","HSXSFFRCC":"\u9ed1\u6c34\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SZLHLHCZYH":"\u68a8\u6811\u6e90\u6cf0\u6751\u9547\u94f6\u884c","LNHCRCB":"\u8fbd\u5b81\u6d77\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","LSJZMFCZYH":"\u664b\u4e2d\u5e02\u6986\u6b21\u878d\u4fe1\u6751\u9547\u94f6\u884c","ZQJJSYCZYH":"\u4e95\u5188\u5c71\u4e5d\u94f6\u6751\u9547\u94f6\u884c","KLQZYRCC":"\u8fbd\u5b81\u7701\u5580\u5587\u6c81\u5de6\u7ffc\u8499\u53e4\u65cf\u81ea\u6cbb\u53bf\u516c\u8425\u5b50\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","KMNCRCC":"\u6606\u660e\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","KSRB":"\u6606\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","KCXRCC":"\u5e93\u8f66\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LCLZZRCC":"\u6f9c\u6ca7\u62c9\u795c\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ACHMCB":"\u5eca\u574a\u5e02\u5b89\u6b21\u533a\u60e0\u6c11\u6751\u9547\u94f6\u884c","LHXHQGRCC":"\u6881\u6cb3\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LJGCRCC":"\u4e3d\u6c5f\u53e4\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZYPFCB":"\u6ea7\u9633\u6d66\u53d1\u6751\u9547\u94f6\u884c","DYJYXMCZYH":"\u804a\u57ce\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","LNCZHTCB":"\u8fbd\u5b81\u8fb0\u5dde\u6c47\u901a\u6751\u9547\u94f6\u884c","WWILNSSCZYH":"\u8fbd\u5b81\u9996\u5c71\u6751\u9547\u94f6\u884c","FPDSCZYH":"\u8fbd\u5b81\u592a\u5b50\u6cb3\u6751\u9547\u94f6\u884c","FGZYFDCZYH":"\u6c5f\u82cf\u5357\u901a\u5982\u768b\u5305\u5546\u6751\u9547\u94f6\u884c","KLQQRCC":"\u5580\u5587\u6c81\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DZBKMCGHXCZYH":"\u6606\u660e\u5448\u8d21\u534e\u590f\u6751\u9547\u94f6\u884c","BLGMCZYH":"\u8fbd\u5b81\u5f70\u6b66\u91d1\u901a\u6751\u9547\u94f6\u884c","YXLLCZYXJTT":"\u4e34\u6ca7\u4e34\u7fd4\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","YJJQCZYH":"\u8fbd\u6e90\u897f\u5b89\u533a\u6986\u94f6\u6751\u9547\u94f6\u884c","YNXSBYCZYH":"\u5927\u8fde\u7518\u4e95\u5b50\u6d66\u53d1\u6751\u9547\u94f6\u884c","HUAMINGBANK":"\u534e\u660e\u6751\u9547\u94f6\u884c","JSTXRCB":"\u6c5f\u82cf\u6cf0\u5174\u519c\u6751\u5546\u4e1a\u94f6\u884c","LDXYGMRCC":"\u9686\u5fb7\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LLXTDMRCC":"\u9f99\u9675\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LPSZSLDCZYH":"\u516d\u76d8\u6c34\u949f\u5c71\u51c9\u90fd\u6751\u9547\u94f6\u884c","LLXERURCC":"\u5362\u9f99\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DAQINGB":"\u9f99\u6c5f\u94f6\u884c","LKXRCC":"\u6797\u53e3\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LNTAJACZYH":"\u8fbd\u5b81\u53f0\u5b89\u91d1\u5b89\u6751\u9547\u94f6\u884c","LSBC":"\u4e34\u5546\u94f6\u884c","LSXJEXRCC":"\u7075\u5bff\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","LNYXJYCB":"\u8fbd\u5b81\u4e49\u53bf\u9526\u94f6\u6751\u9547\u94f6\u884c","LYXAQYYCZYH":"\u5317\u4eac\u5ef6\u5e86\u6751\u9547\u94f6\u884c","LTXYEORCC":"\u4e50\u4ead\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CSXSHNSCZYH":"\u4e34\u6d2e\u53bf\u91d1\u57ce\u6751\u9547\u94f6\u884c","LXRCB":"\u4e34\u590f\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","THDCYYCZYH":"\u4e34\u988d\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","TQDSCZYH":"\u6e56\u5357\u65b0\u90b5\u6e58\u6dee\u6751\u9547\u94f6\u884c","BJMYHFCZYH":"\u7075\u5ddd\u6df1\u901a\u6751\u9547\u94f6\u884c","HLSXNCXYHZCLZ":"\u82a6\u5c71\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e\u56ed\u533a\u4fe1\u7528\u793e","HBSRCB":"\u6cb3\u5317\u6d89\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","LSXSAARCC":"\u82a6\u5c71\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","LXXFXBRCC":"\u4e34\u590f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LSYH":"\u8fbd\u6c88\u94f6\u884c","LCRCB":"\u804a\u57ce\u519c\u5546\u884c","LCRCC":"\u804a\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","LNRCC":"\u8fbd\u5b81\u7701\u519c\u6751\u4fe1\u7528\u793e","QXJSCZYH":"\u4e34\u9ad8\u60e0\u4e30\u6751\u9547\u94f6\u884c","WHJXMSCZYH":"\u4e34\u6cc9\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","LSXGFCRCC":"\u90bb\u6c34\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","CIVLYTYCZYH":"\u51cc\u6e90\u5929\u5143\u6751\u9547\u94f6\u884c","CTMXCZYH":"\u516d\u76d8\u6c34\u516d\u679d\u5bcc\u6c11\u6751\u9547\u94f6\u884c","ZSSRCC":"\u6cf8\u6c34\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZXYTCB":"\u6cf8\u53bf\u5143\u901a\u6751\u9547\u94f6\u884c","ZSZCCZYXJWA":"\u6cf8\u6c34\u4e2d\u6210\u6751\u9547\u94f6\u884c","ZDXBITRCC":"\u6cf8\u5b9a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LZLMRCB":"\u6cf8\u5dde\u9f99\u9a6c\u6f6d\u519c\u6751\u5546\u4e1a\u94f6\u884c","LDXNALRCC":"\u9c81\u7538\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LHXKADRCC":"\u9646\u6cb3\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LLJYCZYH":"\u5362\u9f99\u5bb6\u94f6\u6751\u9547\u94f6\u884c","LCFSCZYH":"\u6c5f\u82cf\u4e39\u5f92\u8499\u94f6\u6751\u9547\u94f6\u884c","LSTYCZYH":"\u5f00\u9c81\u8499\u94f6\u6751\u9547\u94f6\u884c","KEQZYHQRCB":"\u79d1\u5c14\u6c81\u5de6\u7ffc\u540e\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","KORLABANK":"\u5e93\u5c14\u52d2\u5e02\u5546\u4e1a\u94f6\u884c","JXXGXHCZYH":"\u6606\u660e\u7984\u529d\u4e2d\u6210\u6751\u9547\u94f6\u884c","JXRCU":"\u6c5f\u897f\u7701\u519c\u6751\u4fe1\u7528\u793e","XZZYCZYH":"\u91b4\u9675\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","TDBBWCZYH":"\u9646\u826f\u5174\u798f\u6751\u9547\u94f6\u884c","LXZCCZYH":"\u6ee6\u53bf\u4e2d\u6210\u6751\u9547\u94f6\u884c","GXXYLYCZYH":"\u7f57\u7538\u53d1\u5c55\u6751\u9547\u94f6\u884c","YCBHXFCZYH":"\u7f57\u7530\u695a\u519c\u5546\u6751\u9547\u94f6\u884c","LBMZCQNCOFF":"\u6f2f\u6cb3\u5e02\u90fe\u57ce\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZHZLQRCC":"\u6f2f\u6cb3\u5e02\u53ec\u9675\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LHBANK":"\u6f2f\u6cb3\u94f6\u884c","LNXFCB":"\u6d1b\u5b81\u5174\u798f\u6751\u9547\u94f6\u884c","LUZBANK":"\u6cf8\u5dde\u5e02\u5546\u4e1a\u94f6\u884c","LYRCB":"\u8fbd\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","LLLSQRCC":"\u5415\u6881\u5e02\u79bb\u77f3\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LQXXDORCC":"\u7075\u4e18\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LYSRCC":"\u51cc\u6e90\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","LYSRCB":"\u6d1b\u9633\u519c\u5546\u884c","LRXRCB":"\u9686\u5c27\u90a2\u519c\u5546\u6751\u9547\u94f6\u884c","LSXFJRRCC":"\u96f7\u5c71\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LNQSJQCZYH":"\u8fbd\u5b81\u5343\u5c71\u91d1\u6cc9\u6751\u9547\u94f6\u884c","LLYRCZYH":"\u4e50\u9675\u5706\u878d\u6751\u9547\u94f6\u884c","DTZYFDCZYH":"\u8302\u540d\u7535\u767d\u957f\u6c5f\u6751\u9547\u94f6\u884c","DLTZYFDCZYH":"\u4e34\u6e05\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","LANCRCC":"\u516d\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","LSLFCZYH":"\u6d9e\u6c34\u5229\u4e30\u6751\u9547\u94f6\u884c","LDLPSCB":"\u9686\u5fb7\u516d\u76d8\u5c71\u6751\u9547\u94f6\u884c","LZMSCB":"\u6797\u829d\u6c11\u751f\u6751\u9547\u94f6\u884c","LYCGZRCC":"\u51cc\u6e90\u5e02\u57ce\u5173\u9547\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","LFSYDQHDCZYH":"\u4e34\u6c7e\u5e02\u5c27\u90fd\u533a\u60e0\u90fd\u6751\u9547\u94f6\u884c","LNXBRCB":"\u8fbd\u5b81\u65b0\u5bbe\u519c\u6751\u5546\u4e1a\u94f6\u884c","LNXMRCB":"\u8fbd\u5b81\u65b0\u6c11\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","THRDCZYXSOO":"\u9f99\u4e95\u6986\u94f6\u6751\u9547\u94f6\u884c","RZLHCZYH":"\u9f99\u91cc\u56fd\u4e30\u6751\u9547\u94f6\u884c","ZXXMOJRCC":"\u6cf8\u897f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LFSRCC":"\u9646\u4e30\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LDNSH":"\u8fbd\u9633\u8fbd\u4e1c\u519c\u6751\u5546\u4e1a\u94f6\u884c","LZXGKCRCC":"\u4e50\u81f3\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GEJCXYHZXMI":"\u6cf8\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","GYHXJSCZYH":"\u5e90\u5c71\u4e5d\u94f6\u827a\u672f\u6751\u9547\u94f6\u884c","FYZCCZYH":"\u9e7f\u6cc9\u6052\u5347\u6751\u9547\u94f6\u884c","LCXWCHRCC":"\u7eff\u6625\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LZNXRCC":"\u6cf8\u5dde\u5e02\u7eb3\u6eaa\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","LTSFRB":"\u4e50\u4ead\u6751\u9547\u94f6\u884c","LDXSXMRCC":"\u7f57\u7538\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LNYZRCC":"\u8fde\u5357\u7476\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GYSFCB":"\u5eca\u574a\u5e02\u5e7f\u9633\u821c\u4e30\u6751\u9547\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","LZSNWURCC":"\u8fde\u5dde\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LSSJRCC":"\u4e50\u5c71\u4e09\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","LTXNPZRCC":"\u8f6e\u53f0\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LSXCBQRCC":"\u9c81\u5c71\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LSXPPQRCC":"\u7075\u5c71\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LSXOMIRCC":"\u68a8\u6811\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LDHFCZYH":"\u4e50\u4e1c\u60e0\u4e30\u6751\u9547\u94f6\u884c","LJXTERRCC":"\u9f99\u6c5f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LXXWSBRCC":"\u6797\u897f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LCXTXCZYH":"\u9675\u5ddd\u53bf\u592a\u884c\u6751\u9547\u94f6\u884c","EMSZCCZYH":"\u9f99\u53e3\u4e2d\u94f6\u5bcc\u767b\u5357\u5c71\u6751\u9547\u94f6\u884c","CZDXCJCZYXPYB":"\u9647\u897f\u795e\u821f\u6751\u9547\u94f6\u884c","SZPSZJCZYH":"\u5a04\u70e6\u53bf\u4e09\u79be\u6751\u9547\u94f6\u884c","LQYZMZRCC":"\u7984\u529d\u5f5d\u65cf\u82d7\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LJHMCB":"\u5e90\u6c5f\u60e0\u6c11\u6751\u9547\u94f6\u884c","JSZZLHCZYH":"\u8fbd\u5b81\u5927\u77f3\u6865\u9686\u4e30\u6751\u9547\u94f6\u884c","LHXWCGRCC":"\u9686\u5316\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LZRCU":"\u6cf8\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","LZRCB":"\u5170\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","LYGDFRCB":"\u8fde\u4e91\u6e2f\u4e1c\u65b9\u519c\u6751\u5546\u4e1a\u94f6\u884c","LNDTRCB":"\u8fbd\u5b81\u706f\u5854\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","LYXIFFRCC":"\u7f57\u6e90\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LNBPRCC":"\u8fbd\u5b81\u7701\u5317\u7968\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NXPYHLSCZYH":"\u4e34\u6fa7\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","LBXRCC":"\u7559\u575d\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LJXXQERCC":"\u8fde\u6c5f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LCXVVLRCC":"\u9f99\u5ddd\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LYXTCZYH":"\u4e34\u7317\u65b0\u7530\u6751\u9547\u94f6\u884c","LCXCZJRCC":"\u9675\u5ddd\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LHXEOORCC":"\u7089\u970d\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LNGZRCB":"\u8fbd\u5b81\u76d6\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","LNBZJYCZYH":"\u6e56\u5317\u968f\u5dde\u66fe\u90fd\u6c47\u4e30\u6751\u9547\u94f6\u884c","LYBANK":"\u6d1b\u9633\u5e02\u5546\u4e1a\u94f6\u884c","HSHSCZYH":"\u6885\u6cb3\u53e3\u6c11\u751f\u6751\u9547\u94f6\u884c","ZTZYFDCSZJ":"\u6e44\u6f6d\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","BOA":"\u7f8e\u56fd\u94f6\u884c","BOO":"\u7f8e\u4e00\u94f6\u884c","BSB":"\u8499\u5546\u94f6\u884c","MBYZRCC":"\u9a6c\u8fb9\u5f5d\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","MZMJQRCC":"\u6885\u5dde\u5e02\u6885\u6c5f\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","MZRCB":"\u6885\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","BXFTCZYH":"\u8499\u81ea\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","MCHZZZXRXCZYH":"\u5b5f\u6751\u56de\u65cf\u81ea\u6cbb\u53bf\u878d\u4fe1\u6751\u9547\u94f6\u884c","MXFCBRCC":"\u8302\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","XRZXCZYH":"\u5b5f\u6d25\u6c11\u4e30\u6751\u9547\u94f6\u884c","JSHZJYGCZYH":"\u5b5f\u5dde\u5c04\u9633\u6751\u9547\u94f6\u884c","JSJHRCB":"\u6c5f\u82cf\u5efa\u6e56\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHDYMFCZYH":"\u6ccc\u9633\u7389\u5ddd\u6751\u9547\u94f6\u884c","CYXFCZYH":"\u7ef5\u7af9\u6d66\u53d1\u6751\u9547\u94f6\u884c","MQXJGKRCC":"\u95fd\u6e05\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","MXRCB":"\u52c9\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","MONTREAL":"\u8499\u7279\u5229\u5c14\u94f6\u884c","XJRZMLYYHSH":"\u9a6c\u6765\u4e0a\u5206","ZHXGQLRCC":"\u52d0\u6d77\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","MYYXRCC":"\u7ef5\u9633\u5e02\u6e38\u4ed9\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","MSRCB":"\u7709\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","MQXHVRRCC":"\u739b\u66f2\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","MGXRCC":"\u9a6c\u5173\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ANTCON":"\u8682\u8681\u8fde\u63a5\u5668\u865a\u62df\u673a\u6784","MLDWDRCC":"\u83ab\u529b\u8fbe\u74e6\u8fbe\u65a1\u5c14\u65cf\u81ea\u6cbb\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","MDXFFJRCC":"\u725f\u5b9a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","MXXRCC":"\u660e\u6eaa\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","MHKSRCC":"\u6885\u6cb3\u53e3\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","MSMYCB":"\u5bc6\u5c71\u6c11\u610f\u6751\u9547\u94f6\u884c","MEKXRCC":"\u9a6c\u5c14\u5eb7\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","MFXRCC":"\u6c11\u4e30\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","MYFCQRCC":"\u7ef5\u9633\u5e02\u6daa\u57ce\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","KJCZYH":"\u6885\u53bf\u5ba2\u5bb6\u6751\u9547\u94f6\u884c","WCHMCZYH":"\u6e11\u6c60\u9f50\u9c81\u6751\u9547\u94f6\u884c","MQRXCB":"\u6c11\u52e4\u878d\u4fe1\u6751\u9547\u94f6\u884c","MYXRCC":"\u58a8\u7389\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","MLPXRCC":"\u9ebb\u6817\u5761\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JPMC":"\u6469\u6839\u5927\u901a\u94f6\u884c","MYBANK":"\u7ef5\u9633\u5e02\u5546\u4e1a\u94f6\u884c","MPJDCZYH":"\u725f\u5e73\u80f6\u4e1c\u6751\u9547\u94f6\u884c","MMGZCJCB":"\u8302\u540d\u9ad8\u5dde\u957f\u6c5f\u6751\u9547\u94f6\u884c","MMSCQRCC":"\u8302\u540d\u5e02\u57ce\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","MSDPRCC":"\u7709\u5c71\u5e02\u4e1c\u5761\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","MNSXRCC":"\u739b\u7eb3\u65af\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZCXGJGRCC":"\u6c90\u5ddd\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","ZLXPGRRCC":"\u52d0\u814a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","MLYDCZYH":"\u7a46\u68f1\u8fdc\u4e1c\u6751\u9547\u94f6\u884c","MZKSB":"\u6885\u5dde\u5ba2\u5546\u94f6\u884c","MZLRCC":"\u6ee1\u6d32\u91cc\u519c\u6751\u5546\u4e1a\u94f6\u884c","MLRCC":"\u5b5f\u8fde\u50a3\u65cf\u62c9\u795c\u65cf\u4f64\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","MHHZTZRCC":"\u6c11\u548c\u56de\u65cf\u571f\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u793e","NCFMCZYH":"\u5357\u57ce\u5bcc\u6c11\u6751\u9547\u94f6\u884c","GYHNSCZYH":"\u5357\u5145\u5609\u9675\u4e2d\u6210\u6751\u9547\u94f6\u884c","HAQHXFCZYH":"\u5357\u534e\u5174\u798f\u6751\u9547\u94f6\u884c","HBJZRCC":"\u6e56\u5317\u8346\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNBFRCC":"\u6cb3\u5357\u5b9d\u4e30\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBJZRCB":"\u6cb3\u5317\u666f\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNQYRCB":"\u6e56\u5357\u7941\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNNXXRCB":"\u6e56\u5357\u5357\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNQYRCC":"\u6cb3\u5357\u6c81\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZXMSCZYH":"\u5357\u4eac\u6d66\u53e3\u9756\u53d1\u6751\u9547\u94f6\u884c","LNHSJYCZYH":"\u5357\u5b81\u9686\u5b89\u957f\u6c5f\u6751\u9547\u94f6\u884c","LSHMCZYH":"\u91d1\u6c99\u5bcc\u6c11\u6751\u9547\u94f6\u884c","KLBJSZX":"\u6606\u4ed1\u94f6\u884c\u56fd\u9645\u4e1a\u52a1\u7ed3\u7b97\u4e2d\u5fc3","LXCAJRCC":"\u7406\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","LSYTCZYH":"\u8fbd\u5b81\u5317\u9547\u9526\u94f6\u6751\u9547\u94f6\u884c","HJDZCZYH":"\u8fbd\u5b81\u6853\u4ec1\u9526\u94f6\u6751\u9547\u94f6\u884c","LUZRCB":"\u6cf8\u5dde\u6c5f\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","LNWDRCC":"\u9647\u5357\u6b66\u90fd\u519c\u6751\u5408\u4f5c\u94f6\u884c","SDLCYRCZYH":"\u5386\u57ce\u5706\u878d\u6751\u9547\u94f6\u884c","LZMFCB":"\u4e34\u6cad\u6c11\u4e30\u6751\u9547\u94f6\u884c","LQXJIERCC":"\u788c\u66f2\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LTXRBURCC":"\u7406\u5858\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LYJDCZYH":"\u83b1\u9633\u80f6\u4e1c\u6751\u9547\u94f6\u884c","FXJYCZYH":"\u4e50\u5c71\u5609\u5dde\u6c11\u5bcc\u6751\u9547\u94f6\u884c","LZXSEZRCC":"\u4e34\u988d\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LNXYJYCZYH":"\u8fbd\u5b81\u5cab\u5ca9\u91d1\u7389\u6751\u9547\u94f6\u884c","LQRB":"\u4e34\u6710\u6751\u9547\u94f6\u884c","LCPFCB":"\u4e34\u5ddd\u6d66\u53d1\u6751\u9547\u94f6\u884c","HTQLCZYH":"\u9675\u6c34\u60e0\u6c11\u6751\u9547\u94f6\u884c","HNJHRCU":"\u6e56\u5357\u5609\u79be\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNJSRCB":"\u6e56\u5357\u6d25\u5e02\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","LHMYCB":"\u67f3\u6cb3\u8499\u94f6\u6751\u9547\u94f6\u884c","LAUXPYNCCQK":"\u6cb3\u5357\u65b0\u4e61\u5e73\u539f\u519c\u6751\u5546\u4e1a\u94f6\u884c","TGJYCZYH":"\u9f99\u5ddd\u878d\u548c\u6751\u9547\u94f6\u884c","LLSRCC":"\u5415\u6881\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","LZLMTRCC":"\u6cf8\u5dde\u5e02\u9f99\u9a6c\u6f6d\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","LHLHRCB":"\u7f57\u6e56\u84dd\u6d77\u6751\u9547\u94f6\u884c","LFLCFDCB":"\u7984\u4e30\u9f99\u57ce\u5bcc\u6ec7\u6751\u9547\u94f6\u884c","LNXEONRCC":"\u6ee6\u5357\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LSZZYZRCC":"\u8fde\u5c71\u58ee\u65cf\u7476\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JHZCCZYH":"\u5415\u6881\u5b5d\u4e49\u6c47\u901a\u6751\u9547\u94f6\u884c","MHXRCC":"\u95fd\u4faf\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FJYAHFCZYH":"\u83ab\u529b\u8fbe\u74e6\u5305\u5546\u6751\u9547\u94f6\u884c","SDFMCZYH":"\u5357\u6f33\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","BIN":"\u5b81\u6ce2\u56fd\u9645\u94f6\u884c","NMGNXS":"\u5185\u8499\u53e4\u519c\u6751\u4fe1\u7528\u793e\u8054\u5408\u793e","NNLACJCZYH":"\u5357\u5eb7\u8d63\u5546\u6751\u9547\u94f6\u884c","BNY":"\u5357\u9633\u5e02\u5546\u4e1a\u94f6\u884c","NBXRCC":"\u5357\u90e8\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NMAESRCC":"\u5185\u8499\u53e4\u963f\u5c14\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","NMGBTGYRCB":"\u5185\u8499\u53e4\u5305\u5934\u5e02\u56fa\u9633\u53bf\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","NDXRCC":"\u5357\u4e39\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJZZRFCZYH":"\u5357\u4e30\u6854\u90fd\u6751\u9547\u94f6\u884c","NKSRCC":"\u5357\u5eb7\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NYSYBANK":"\u5357\u6d0b\u5546\u4e1a\u94f6\u884c\u6709\u9650\u516c\u53f8","ZCQLCZYH":"\u8bb7\u6cb3\u878d\u5174\u6751\u9547\u94f6\u884c","CHEYYQQRCC":"\u5185\u8499\u53e4\u5bdf\u54c8\u5c14\u53f3\u7ffc\u524d\u65d7\u519c\u6751\u5546\u4e1a\u94f6\u884c","GHHLBRCC":"\u5185\u8499\u53e4\u6839\u6cb3\u5e02\u597d\u91cc\u5821\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","GSTJCZYH":"\u830c\u5e73\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","GDYF":"\u5e7f\u4e1c\u4e91\u6d6e\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","GXLSRCC":"\u5e7f\u897f\u9f99\u80dc\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZYXRJURCC":"\u6e5f\u6e90\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HXROZRCC":"\u5fbd\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FJLHTLCZYH":"\u5185\u8499\u53e4\u548c\u6797\u683c\u5c14\u5305\u5546\u6751\u9547\u94f6\u884c","SXBEHYQRCC":"\u5185\u8499\u53e4\u547c\u4f26\u8d1d\u5c14\u5e02\u65b0\u5df4\u5c14\u864e\u53f3\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","TLKLQRCC":"\u5185\u8499\u53e4\u901a\u8fbd\u5e02\u5e93\u4f26\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","TLSKEQQRCC":"\u5185\u8499\u53e4\u901a\u8fbd\u5e02\u79d1\u5c14\u6c81\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","KLMYCZYH":"\u5185\u8499\u53e4\u6258\u514b\u6258\u7acb\u519c\u6751\u9547\u94f6\u884c","KEQYYQQRCC":"\u5185\u8499\u53e4\u5174\u5b89\u76df\u79d1\u5c14\u6c81\u53f3\u7ffc\u524d\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","ZJKQLHCZYH":"\u5b81\u6ce2\u6c5f\u5317\u5bcc\u6c11\u6751\u9547\u94f6\u884c","XHCMCZYH":"\u5b81\u6ce2\u5e02\u6d77\u66d9\u56fd\u6c11\u6751\u9547\u94f6\u884c","NEHNZYZRCC":"\u5b81\u6d31\u54c8\u5c3c\u65cf\u5f5d\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JWLBJFDCZYH":"\u5b81\u9675\u5fb7\u5546\u6751\u9547\u94f6\u884c","AHFXSYCZYH":"\u5b81\u590f\u8d3a\u5170\u56de\u5546\u6751\u9547\u94f6\u884c","NXXJRCC":"\u5b81\u590f\u897f\u5409\u519c\u6751\u5546\u4e1a\u94f6\u884c","NXZNRCC":"\u5b81\u590f\u4e2d\u5b81\u519c\u6751\u5546\u4e1a\u94f6\u884c","NXSRCC":"\u5357\u96c4\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NBFHLMCZYH":"\u5b81\u6ce2\u5949\u5316\u7f57\u8499\u6751\u9547\u94f6\u884c","NCDFCZYH":"\u5357\u660c\u5927\u4e30\u6751\u9547\u94f6\u884c","NMETKRCC":"\u5185\u8499\u53e4\u9102\u6258\u514b\u519c\u6751\u5546\u4e1a\u94f6\u884c","NXGYRCC":"\u5b81\u590f\u56fa\u539f\u519c\u6751\u5546\u4e1a\u94f6\u884c","NMTPSRCC":"\u5185\u8499\u53e4\u592a\u4ec6\u5bfa\u519c\u6751\u5546\u4e1a\u94f6\u884c","NXHLHSCZYH":"\u4e34\u7317\u53bf\u65b0\u7530\u6751\u9547\u94f6\u884c","NXRCU":"\u5b81\u590f\u9ec4\u6cb3\u519c\u6751\u5546\u4e1a\u94f6\u884c","H3CB":"\u5185\u8499\u53e4\u94f6\u884c","NYFMCZYH":"\u7eb3\u96cd\u5bcc\u6c11\u6751\u9547\u94f6\u884c","NMGHLGEBSCZYH":"\u6c11\u6743\u5fb7\u5546\u6751\u9547\u94f6\u884c","NBBANK":"\u5b81\u6ce2\u94f6\u884c","NMELCRCC":"\u5185\u8499\u53e4\u9102\u4f26\u6625\u519c\u6751\u5546\u4e1a\u94f6\u884c","NCCDJYCZYH":"\u5357\u660c\u660c\u4e1c\u4e5d\u94f6\u6751\u9547\u94f6\u884c","NCJLRCC":"\u5357\u5145\u5e02\u5609\u9675\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","NHRXCZYH":"\u5357\u548c\u878d\u4fe1\u6751\u9547\u94f6\u884c","NJDXRCC":"\u5185\u6c5f\u5e02\u4e1c\u5174\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","CHEYYZQRCC":"\u5185\u8499\u53e4\u4e4c\u5170\u5bdf\u5e03\u5e02\u5bdf\u54c8\u5c14\u53f3\u7ffc\u4e2d\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","NMXWZMQRCC":"\u5185\u8499\u53e4\u897f\u4e4c\u73e0\u7a46\u6c81\u519c\u6751\u5546\u4e1a\u94f6\u884c","XCCXCZYH":"\u5b81\u57ce\u5305\u5546\u6751\u9547\u94f6\u884c","XAMZZTQRCC":"\u5185\u8499\u53e4\u5174\u5b89\u76df\u624e\u8d49\u7279\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","GYGSHFMCZYH":"\u5b81\u56fd\u6c11\u751f\u6751\u9547\u94f6\u884c","AYZJCZYH":"\u5b81\u590f\u7ea2\u5bfa\u5821\u6c47\u53d1\u6751\u9547\u94f6\u884c","AHYXXHHCZYH":"\u5b89\u5fbd\u9edf\u53bf\u65b0\u6dee\u6cb3\u6751\u9547\u94f6\u884c","GDCHCSCB":"\u5e7f\u4e1c\u6f84\u6d77\u6f6e\u5546\u6751\u9547\u94f6\u884c","GZLPRCB":"\u8d35\u5dde\u9ece\u5e73\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","NXQTXRCC":"\u5b81\u590f\u9752\u94dc\u5ce1\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NYXRCC":"\u7eb3\u96cd\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NMTKTRCC":"\u5185\u8499\u53e4\u6258\u514b\u6258\u519c\u6751\u5546\u4e1a\u94f6\u884c","NXYZJHCB":"\u5b81\u590f\u539f\u5dde\u6d25\u6c47\u6751\u9547\u94f6\u884c","NMWYRCC":"\u5185\u8499\u53e4\u4e94\u539f\u519c\u6751\u5546\u4e1a\u94f6\u884c","NXTXJHCB":"\u5b81\u590f\u540c\u5fc3\u6d25\u6c47\u6751\u9547\u94f6\u884c","NBSSQRCC":"\u5b81\u6ce2\u5e02\u5e02\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NBZHCB":"\u5b81\u6ce2\u9547\u6d77\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","NJXXQTRCC":"\u5357\u6c5f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","NASRCC":"\u5b81\u5b89\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NXZWRCC":"\u5b81\u590f\u4e2d\u536b\u519c\u6751\u5546\u4e1a\u94f6\u884c","NJJDCZYH":"\u5b81\u6d25\u80f6\u4e1c\u6751\u9547\u94f6\u884c","NMNCRCC":"\u5185\u8499\u53e4\u5b81\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","NXHYXRCC":"\u5b81\u590f\u6d77\u539f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NNWMQRCC":"\u5357\u5b81\u5e02\u6b66\u9e23\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NZXRCC":"\u5357\u53ec\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NYCB":"\u5357\u9633\u6751\u9547\u94f6\u884c","ZYTYCZYH":"\u5b81\u590f\u897f\u5409\u6c47\u53d1\u6751\u9547\u94f6\u884c","NJRCB":"\u5185\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","NCNCRCC":"\u5357\u660c\u519c\u6751\u5546\u4e1a\u94f6\u884c","NCBANK":"\u5357\u6d0b\u5546\u4e1a\u94f6\u884c","NXZYXRCC":"\u5b81\u590f\u6cfe\u6e90\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NXTXRCC":"\u5b81\u590f\u540c\u5fc3\u519c\u6751\u5546\u4e1a\u94f6\u884c","NXLDXRCC":"\u5b81\u590f\u9686\u5fb7\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NQXCHFRCC":"\u5b81\u5f3a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","OJASZCFCZYH":"\u5b81\u590f\u5f6d\u9633\u8d3a\u5170\u5c71\u6751\u9547\u94f6\u884c","NBYYRCC":"\u5b81\u6ce2\u4f59\u59da\u519c\u6751\u5546\u4e1a\u94f6\u884c","HYXHNSCZYH":"\u5b81\u590f\u6c38\u5b81\u6c47\u53d1\u6751\u9547\u94f6\u884c","NXHLRCC":"\u5b81\u590f\u8d3a\u5170\u519c\u6751\u5546\u4e1a\u94f6\u884c","NBZHRCC":"\u5b81\u6ce2\u9547\u6d77\u519c\u6751\u5546\u4e1a\u94f6\u884c","NXYNHFCZYH":"\u6e56\u5357\u65b0\u5316\u661f\u9f99\u6751\u9547\u94f6\u884c","NJCB":"\u5357\u4eac\u94f6\u884c","NBNHRCC":"\u5b81\u6ce2\u5b81\u6d77\u519c\u6751\u5546\u4e1a\u94f6\u884c","NXJYRCC":"\u5b81\u590f\u6cfe\u6e90\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","NLKXRCC":"\u5c3c\u52d2\u514b\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NLXJFJRCC":"\u5b81\u9675\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NBCXRCB":"\u5b81\u6ce2\u6148\u6eaa\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNHSTNSCZYH":"\u5b81\u590f\u5b81\u4e1c\u672c\u5bcc\u6751\u9547\u94f6\u884c","HBTFRCC":"\u6e56\u5317\u56e2\u98ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","HYHMCZYH":"\u5408\u9633\u60e0\u6c11\u6751\u9547\u94f6\u884c","HLJKDRCC":"\u9ed1\u9f99\u6c5f\u514b\u4e1c\u519c\u6751\u5546\u4e1a\u94f6\u884c","BOHN":"\u6d77\u5357\u7701\u519c\u6751\u4fe1\u7528\u793e","BOHB":"\u9e64\u58c1\u94f6\u884c","ZJTTMSCZYH":"\u5b81\u4e61\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","ZJWCBYCZYH":"\u5185\u9ec4\u5174\u798f\u6751\u9547\u94f6\u884c","ZJGYNSCB":"\u6c5f\u82cf\u5f20\u5bb6\u6e2f\u6e1d\u519c\u5546\u6751\u9547\u94f6\u884c","JHXMBCRCC":"\u7cbe\u6cb3\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DCHZZZXXHCZYH":"\u53e5\u5bb9\u82cf\u5357\u6751\u9547\u94f6\u884c","KMCGQRCC":"\u6606\u660e\u5e02\u5448\u8d21\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LNZCCZYH":"\u5170\u8003\u9f50\u9c81\u6751\u9547\u94f6\u884c","LYXWVWRCC":"\u9686\u5c27\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LNLHJYCZYH":"\u6d4e\u6e90\u9f50\u9c81\u6751\u9547\u94f6\u884c","CXMSCZYH":"\u6ee6\u5357\u4e2d\u6210\u6751\u9547\u94f6\u884c","MYCZBANK":"\u7ef5\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","XPCFCZYH":"\u5357\u5b81\u9a6c\u5c71\u957f\u6c5f\u6751\u9547\u94f6\u884c","NMWLTRCC":"\u5185\u8499\u53e4\u4e4c\u62c9\u7279\u519c\u6751\u5546\u4e1a\u94f6\u884c","NCGPRCC":"\u5357\u5145\u5e02\u9ad8\u576a\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","NMKSKTRCC":"\u5185\u8499\u53e4\u514b\u4ec0\u514b\u817e\u519c\u6751\u5546\u4e1a\u94f6\u884c","WLCBSHDXRCC":"\u5185\u8499\u53e4\u4e4c\u5170\u5bdf\u5e03\u5e02\u5316\u5fb7\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","WZNLSKLCZYH":"\u4e50\u5c71\u6606\u4ed1\u6751\u9547\u94f6\u884c","ZHYHQRCC":"\u6f2f\u6cb3\u5e02\u6e90\u6c47\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NMYKSRCC":"\u5185\u8499\u53e4\u7259\u514b\u77f3\u519c\u6751\u5546\u4e1a\u94f6\u884c","XXHLSCB":"\u5b81\u590f\u897f\u590f\u8d3a\u5170\u5c71\u6751\u9547\u94f6\u884c","YTDSCZYH":"\u5b81\u590f\u4e2d\u5b81\u9752\u94f6\u6751\u9547\u94f6\u884c","NGSRCC":"\u5357\u5bab\u5e02\u519c\u6751\u4fe1\u7528\u8054\u793e","XAMTQXRCC":"\u5185\u8499\u53e4\u5174\u5b89\u76df\u7a81\u6cc9\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","JLZYFDCZYH":"\u5b81\u5b89\u878d\u5174\u6751\u9547\u94f6\u884c","NXPYRCC":"\u5b81\u590f\u5f6d\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","NBNHJXCB":"\u5b81\u6ce2\u5b81\u6d77\u5efa\u4fe1\u6751\u9547\u94f6\u884c","NMSBRCC":"\u5185\u8499\u53e4\u9655\u575d\u519c\u6751\u5546\u4e1a\u94f6\u884c","NXQTXHLSCZYH":"\u5b81\u590f\u9752\u94dc\u5ce1\u8d3a\u5170\u5c71\u6751\u9547\u94f6\u884c","NLTPCB":"\u5357\u9675\u592a\u5e73\u6751\u9547\u94f6\u884c","NBYZ":"\u5b81\u6ce2\u911e\u5dde\u519c\u5546\u884c","NXYCRCC":"\u5b81\u590f\u76d0\u6c60\u519c\u6751\u5546\u4e1a\u94f6\u884c","NBFHRCC":"\u5b81\u6ce2\u5949\u5316\u519c\u6751\u5546\u4e1a\u94f6\u884c","NPRXCB":"\u5357\u76ae\u878d\u4fe1\u6751\u9547\u94f6\u884c","NXBANK":"\u5b81\u590f\u94f6\u884c","NPJYQRCC":"\u5357\u5e73\u5e02\u5efa\u9633\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NJNKCZYH":"\u5357\u6c5f\u519c\u79d1\u6751\u9547\u94f6\u884c","NJXLCB":"\u5185\u6c5f\u5174\u9686\u6751\u9547\u94f6\u884c","NHXYQDRCC":"\u5185\u9ec4\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BNYC":"\u7ebd\u7ea6\u94f6\u884c","YPYALKEQPXV":"\u5185\u8499\u53e4\u963f\u9c81\u79d1\u5c14\u6c81\u519c\u6751\u5546\u4e1a\u94f6\u884c","XLGLMXHQRCC":"\u5185\u8499\u53e4\u9521\u6797\u90ed\u52d2\u76df\u9576\u9ec4\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","KEQYYZQRCC":"\u5185\u8499\u53e4\u5174\u5b89\u76df\u79d1\u5c14\u6c81\u53f3\u7ffc\u4e2d\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","NWBANK":"\u632a\u5a01\u94f6\u884c","NBCBANK":"\u5b81\u6ce2\u901a\u5546\u94f6\u884c","NQXPIVRCC":"\u5185\u4e18\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XYZJCZYH":"\u5b81\u664b\u6c11\u751f\u6751\u9547\u94f6\u884c","NWXRDCZYH":"\u5b81\u6b66\u53bf\u745e\u90fd\u6751\u9547\u94f6\u884c","NNJNGMCZYH":"\u5357\u5b81\u6c5f\u5357\u56fd\u6c11\u6751\u9547\u94f6\u884c","NYWCQRCC":"\u5357\u9633\u5e02\u5b9b\u57ce\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NMGTMTRCB":"\u5185\u8499\u53e4\u571f\u9ed8\u7279\u53f3\u65d7\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","NZYZRCC":"\u5b81\u8497\u5f5d\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NNZNQRCC":"\u5357\u5b81\u5e02\u9095\u5b81\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","RCC":"\u519c\u6751\u4fe1\u7528\u793e","RCP":"\u519c\u6751\u5408\u4f5c\u94f6\u884c","NJYZRCC":"\u5357\u6da7\u5f5d\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NNSQRCC":"\u5357\u5b81\u5e02\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WLTZQMYCZYH":"\u5357\u5b81\u5174\u5b81\u957f\u6c5f\u6751\u9547\u94f6\u884c","NMETKQQRCC":"\u5185\u8499\u53e4\u9102\u6258\u514b\u524d\u65d7\u519c\u6751\u5546\u4e1a\u94f6\u884c","NCRCB":"\u5357\u5145\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","CHEYYHQRCC":"\u5185\u8499\u53e4\u4e4c\u5170\u5bdf\u5e03\u5e02\u5bdf\u54c8\u5c14\u53f3\u7ffc\u540e\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","DYZYFDCZYH":"\u5b81\u6ce2\u6148\u6eaa\u5efa\u4fe1\u6751\u9547\u94f6\u884c","NDHB":"\u5b81\u6ce2\u4e1c\u6d77\u94f6\u884c","NAXRCC":"\u5357\u6fb3\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NXPLRCC":"\u5b81\u590f\u5e73\u7f57\u519c\u6751\u5546\u4e1a\u94f6\u884c","NHXNUZRCC":"\u5b81\u5316\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NXLWRCC":"\u5b81\u590f\u7075\u6b66\u519c\u6751\u5546\u4e1a\u94f6\u884c","NXWZRCC":"\u5b81\u590f\u5434\u5fe0\u519c\u6751\u5546\u4e1a\u94f6\u884c","ABCHZ":"\u519c\u4e1a\u94f6\u884c\u676d\u5dde\u5206\u884c","TCSXLTQNQJV":"\u76d8\u9526\u5e02\u5174\u9686\u53f0\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","TSMJRXCZYH":"\u5b81\u6d77\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","YNMLBYCZYH":"\u5b81\u590f\u60e0\u519c\u8d3a\u5170\u5c71\u6751\u9547\u94f6\u884c","PSPYLMRCC":"\u76ae\u5c71\u53bf\u76ae\u4e9a\u52d2\u739b\u4e61\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","BKB":"\u76d8\u8c37\u94f6\u884c","BOP":"\u5e73\u9876\u5c71\u94f6\u884c","PSXBCIRCC":"\u76ae\u5c71\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","PCXXUPRCC":"\u5e73\u660c\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","PLRCB":"\u5e73\u51c9\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","PZJYCZYH":"\u5f6d\u6cfd\u4e5d\u94f6\u6751\u9547\u94f6\u884c","PDXCDCZYH":"\u5e73\u5b9a\u53bf\u660c\u90fd\u6751\u9547\u94f6\u884c","PDSSJRCC":"\u5e73\u9876\u5c71\u5e02\u5e02\u90ca\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","PSKKTRKRCC":"\u76ae\u5c71\u53bf\u79d1\u514b\u94c1\u70ed\u514b\u4e61\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","PDXIJZRCC":"\u5e73\u5b9a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","PSMJXRCC":"\u76ae\u5c71\u53bf\u6728\u5409\u4e61\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","PDSSLQRCC":"\u5e73\u9876\u5c71\u5e02\u77f3\u9f99\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NLDSCZYH":"\u5e73\u679c\u56fd\u6c11\u6751\u9547\u94f6\u884c","NHB":"\u5357\u6d77\u519c\u5546\u94f6\u884c","HEBHLPFCZYH":"\u5e73\u5858\u5bcc\u6c11\u6751\u9547\u94f6\u884c","PDXNCJRCC":"\u666e\u5b9a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","PZMSCZYH":"\u5f6d\u5dde\u6c11\u751f\u6751\u9547\u94f6\u884c","PWXRCC":"\u5e73\u6b66\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","PZHRCB":"\u6500\u679d\u82b1\u519c\u6751\u5546\u4e1a\u94f6\u884c","PBXKLORCC":"\u6d66\u5317\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","PHXRCC":"\u5e73\u548c\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","PCXBWRRCC":"\u6d66\u57ce\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZZZYFDCZYH":"\u5e73\u9065\u53bf\u664b\u878d\u6751\u9547\u94f6\u884c","PBDLCZYH":"\u5e73\u575d\u9f0e\u7acb\u6751\u9547\u94f6\u884c","PAXNCXYHZS":"\u84ec\u5b89\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","PYYRCZYH":"\u5e73\u539f\u5706\u878d\u6751\u9547\u94f6\u884c","WAHDCZYH":"\u5e73\u9634\u84dd\u6d77\u6751\u9547\u94f6\u884c","PJSTZQRCC":"\u76d8\u9526\u5e02\u53cc\u53f0\u5b50\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","PSXDABRCC":"\u76d8\u5c71\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","PSATCZYH":"\u76d8\u5c71\u5b89\u6cf0\u6751\u9547\u94f6\u884c","DZFMCZYH":"\u76d8\u5dde\u4e07\u548c\u6751\u9547\u94f6\u884c","HNARXYCZYH":"\u84ec\u6eaa\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","HNJSSRCB":"\u6e56\u5357\u5409\u9996\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SPABANKSZ":"\u5e73\u5b89\u6df1\u5733\u5206\u884c","PNXCNMRCC":"\u5c4f\u5357\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","PXCLERCC":"\u84b2\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","PQSRCC":"\u5e73\u6cc9\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","PSKLYXRCC":"\u76ae\u5c71\u53bf\u514b\u91cc\u9633\u4e61\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","PSXSZRRCC":"\u5f6d\u5c71\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","PCXRQXRCC":"\u84b2\u57ce\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","PLJNCJCB":"\u5e73\u51c9\u5e02\u9759\u5b81\u6210\u7eaa\u6751\u9547\u94f6\u884c","PSXNCRCC":"\u76ae\u5c71\u53bf\u519c\u573a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","PXXMVNRCC":"\u5e73\u4e61\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","PBXCIPRCC":"\u5c4f\u8fb9\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HEBXFCZYH":"\u5e73\u8206\u7389\u5ddd\u6751\u9547\u94f6\u884c","PDSXHQRCC":"\u5e73\u9876\u5c71\u5e02\u65b0\u534e\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","PJNC":"\u76d8\u9526\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SPABANKCZ":"\u5e73\u5b89\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8\u5e38\u5dde\u5206\u884c","PXJBARCC":"\u76d8\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","PXXITFRCC":"\u84ec\u6eaa\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","PSDWZRCC":"\u76ae\u5c71\u53bf\u675c\u74e6\u9547\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","LYLSYYCZYH":"\u6d66\u57ce\u4e2d\u6210\u6751\u9547\u94f6\u884c","LNDSQLFCZYH":"\u5f6d\u5c71\u73e0\u6c5f\u6751\u9547\u94f6\u884c","PCNKCZYH":"\u5e73\u660c\u519c\u79d1\u6751\u9547\u94f6\u884c","PSMKLXRCC":"\u76ae\u5c71\u53bf\u6728\u594e\u62c9\u4e61\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","LNDTCZYH":"\u840d\u4e61\u5b89\u6e90\u5bcc\u6c11\u6751\u9547\u94f6\u884c","CZSYHQLCZYH":"\u84b2\u57ce\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","ZSXSSJRCC":"\u5c90\u5c71\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZYXUSURCC":"\u6fee\u9633\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","ZYSSQRCC":"\u6fee\u9633\u5e02\u5e02\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","PYBANK":"\u6fee\u9633\u94f6\u884c","PDSWDRCC":"\u5e73\u9876\u5c71\u536b\u4e1c\u519c\u6751\u5546\u4e1a\u94f6\u884c","PHRFCZYH":"\u5e73\u548c\u6da6\u4e30\u6751\u9547\u94f6\u884c","SHZGMCZYH":"\u5e73\u9646\u53bf\u6cb3\u4e1c\u6751\u9547\u94f6\u884c","PXNCRCC":"\u840d\u4e61\u519c\u6751\u5546\u4e1a\u94f6\u884c","PYXRCC":"\u5e73\u8206\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","PNXYCFRCC":"\u5e73\u5357\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","PSSZXRCC":"\u76ae\u5c71\u53bf\u6851\u682a\u4e61\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","WYSBFCZYH":"\u666e\u5b9a\u5bcc\u6c11\u6751\u9547\u94f6\u884c","WYXNSCZYH":"\u5e73\u6cc9\u6052\u5347\u6751\u9547\u94f6\u884c","TSQZCYCZYH":"\u666e\u6d31\u6c11\u751f\u6751\u9547\u94f6\u884c","DZCPXHCZYH":"\u8572\u6625\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","LLBJSJJRFCZYH":"\u4e1c\u4e30\u5409\u94f6\u6751\u9547\u94f6\u884c","XJRZDXYYHGDHQ":"\u5927\u897f\u6d0b\u6a2a\u5206","GZZBW":"\u8d35\u5dde\u72ec\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNGDXLCZYH":"\u6e56\u5357\u6842\u4e1c\u661f\u9f99\u6751\u9547\u94f6\u884c","HKJYCZYH":"\u6e56\u53e3\u4e5d\u94f6\u6751\u9547\u94f6\u884c","NXHSBHFCZYH":"\u7da6\u6c5f\u6c11\u751f\u6751\u9547\u94f6\u884c","QXLGFRCC":"\u6c81\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","QXGSORCC":"\u4e7e\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","QHHYRCB":"\u5b81\u590f\u6d77\u539f\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","TEGZSSHNPPH":"\u5b81\u590f\u77f3\u5634\u5c71\u5e02\u60e0\u519c\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","QHDSQRCC":"\u79e6\u7687\u5c9b\u5e02\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SHJDMSCZYH":"\u7941\u53bf\u664b\u878d\u6751\u9547\u94f6\u884c","ZXHUIRCC":"\u6dc7\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CERZXZYCZYH":"\u6dc7\u53bf\u4e2d\u539f\u6751\u9547\u94f6\u884c","LNZWJTCZYH":"\u9752\u5c9b\u83b1\u897f\u5143\u6cf0\u6751\u9547\u94f6\u884c","DDDACZYH":"\u9752\u5c9b\u5d02\u5c71\u4ea4\u94f6\u6751\u9547\u94f6\u884c","QYQXHMCZYH":"\u6e05\u8fdc\u6e05\u65b0\u60e0\u6c11\u6751\u9547\u94f6\u884c","QWXTYH":"\u66f2\u6c83\u65b0\u7530\u6751\u9547\u94f6\u884c","QHHYRCC":"\u9752\u6d77\u7701\u6e5f\u6e90\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","QLMZRCC":"\u9752\u9f99\u6ee1\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","QTHSQRCC":"\u4e03\u53f0\u6cb3\u5e02\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","QAXLCB":"\u8fc1\u5b89\u8944\u9686\u6751\u9547\u94f6\u884c","QYXCQCZYH":"\u6c81\u6e90\u53bf\u957f\u9752\u6751\u9547\u94f6\u884c","QHJZRCC":"\u9752\u6d77\u5c16\u624e\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","QHJRCB":"\u6e05\u6cb3\u91d1\u519c\u6751\u9547\u94f6\u884c","QAXSGJRCC":"\u4e7e\u5b89\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","QHHDPARCC":"\u9752\u6d77\u6d77\u4e1c\u5e73\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","QHDLRCC":"\u9752\u6d77\u90fd\u5170\u519c\u6751\u5546\u4e1a\u94f6\u884c","QSXLORRCC":"\u6e05\u6c34\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","QDHFCZYH":"\u7941\u4e1c\u60e0\u4e30\u6751\u9547\u94f6\u884c","QDRCU":"\u9752\u5c9b\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","QZHSCZYH":"\u9131\u9633\u6052\u901a\u6751\u9547\u94f6\u884c","ZZXRXCZYH":"\u9752\u5c9b\u5e73\u5ea6\u60e0\u6c11\u6751\u9547\u94f6\u884c","QHMYRCC":"\u9752\u6d77\u95e8\u6e90\u519c\u6751\u5546\u4e1a\u94f6\u884c","QHDBANK":"\u79e6\u7687\u5c9b\u94f6\u884c","QHTDRCC":"\u9752\u6d77\u540c\u5fb7\u519c\u6751\u5546\u4e1a\u94f6\u884c","QXXRCC":"\u8fc1\u897f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","QASRCC":"\u8fc1\u5b89\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WZSYCZYH":"\u4e7e\u5b89\u60e0\u6c11\u6751\u9547\u94f6\u884c","RSTJCZYH":"\u9752\u53bf\u9752\u9686\u6751\u9547\u94f6\u884c","QYLLCB":"\u9752\u539f\u5e90\u9675\u6751\u9547\u94f6\u884c","QSXRORRCC":"\u6c81\u6c34\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","QYCRCB":"\u7941\u9633\u6751\u9547\u94f6\u884c","YFZYFDCZYH":"\u6674\u9686\u5174\u5b89\u6751\u9547\u94f6\u884c","QCXQQBRCC":"\u5e86\u57ce\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","QYRCB":"\u5e86\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","QGXRCC":"\u9752\u5188\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CZZLCJCZYH":"\u743c\u6d77\u5927\u4f17\u6751\u9547\u94f6\u884c","ZJQZQJSYCZYH":"\u8862\u6c5f\u4e0a\u94f6\u6751\u9547\u94f6\u884c","ZBCB":"\u9f50\u5546\u94f6\u884c","QXZYFMMMRCC":"\u4e7e\u53bf\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","QXINDRCC":"\u9752\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","QHRC":"\u9752\u6d77\u7701\u519c\u6751\u4fe1\u7528\u793e","QHXHRCC":"\u9752\u6d77\u5174\u6d77\u519c\u6751\u5546\u4e1a\u94f6\u884c","QHHLRCC":"\u9752\u6d77\u5316\u9686\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","QHJDCZYH":"\u9f50\u6cb3\u80f6\u4e1c\u6751\u9547\u94f6\u884c","QZSRCC":"\u94a6\u5dde\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NWCCXYHZADU":"\u6e20\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NXSZSRCC":"\u5b81\u590f\u77f3\u5634\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","XJSHZSJYCZYH":"\u66f2\u9756\u4f1a\u6cfd\u957f\u6c5f\u6751\u9547\u94f6\u884c","QZXRCC":"\u66f2\u5468\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","QJQLRCC":"\u66f2\u9756\u5e02\u9e92\u9e9f\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","QYZCCB":"\u66f2\u9633\u4e2d\u6210\u6751\u9547\u94f6\u884c","QLBANK":"\u9f50\u9c81\u94f6\u884c","QHXRCC":"\u9752\u6cb3\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","QTLFCZYH":"\u5947\u53f0\u5229\u4e30\u6751\u9547\u94f6\u884c","QZXBCZYH":"\u6e05\u9547\u5174\u90a6\u6751\u9547\u94f6\u884c","QTXSRCC":"\u9752\u94dc\u5ce1\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","QJZYRCC":"\u66f2\u9756\u5e02\u6cbe\u76ca\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","QJXWCJCZYH":"\u66f2\u9756\u5ba3\u5a01\u957f\u6c5f\u6751\u9547\u94f6\u884c","ESUN_MMK_SF":"\u5168\u5bb6","QRCB":"\u6cc9\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","QHDTRCC":"\u9752\u6d77\u5927\u901a\u519c\u6751\u5546\u4e1a\u94f6\u884c","QHHZSNKRCC":"\u9752\u6d77\u4e92\u52a9\u519c\u6751\u5546\u4e1a\u94f6\u884c","QHHDNCBANK":"\u9752\u6d77\u6d77\u4e1c\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","QLXRCC":"\u6e05\u6d41\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JSSYTSCZYH":"\u6e05\u5f90\u60e0\u6c11\u6751\u9547\u94f6\u884c","BOQZ":"\u6cc9\u5dde\u94f6\u884c","BOQH":"\u9752\u6d77\u94f6\u884c","QJCCB":"\u66f2\u9756\u5e02\u5546\u4e1a\u94f6\u884c","QHSRCC":"\u743c\u6d77\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","QHYSRCC":"\u9752\u6d77\u7389\u6811\u519c\u6751\u5546\u4e1a\u94f6\u884c","QXURYRCC":"\u90b1\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","QHYYRCB":"\u9752\u6d77\u6e5f\u6e90\u519c\u6751\u5546\u4e1a\u94f6\u884c","QYMZZXCCC":"\u6e05\u539f\u6ee1\u65cf\u81ea\u6cbb\u53bf\u4e2d\u5fc3\u57ce\u5e02\u4fe1\u7528\u5408\u4f5c\u793e","QHDFNJYCZYH":"\u79e6\u7687\u5c9b\u629a\u5b81\u5bb6\u94f6\u6751\u9547\u94f6\u884c","QMXRCC":"\u4e14\u672b\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CDZDZYFDCZYH":"\u9752\u5c9b\u5373\u58a8\u60e0\u6c11\u6751\u9547\u94f6\u884c","QAXLRCRCC":"\u5e86\u5b89\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","QBXRCC":"\u90b1\u5317\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","QDCCB":"\u9752\u5c9b\u94f6\u884c","QLCZYH":"\u9752\u9686\u6751\u9547\u94f6\u884c","QHHZCZVRCC":"\u9752\u6d77\u6d77\u664f\u519c\u6751\u5546\u4e1a\u94f6\u884c","QDCB":"\u9752\u5c9b\u5e02\u5546\u4e1a\u94f6\u884c","QHGCRCC":"\u9752\u6d77\u521a\u5bdf\u519c\u6751\u5546\u4e1a\u94f6\u884c","QHGNRCC":"\u9752\u6d77\u8d35\u5357\u519c\u6751\u5546\u4e1a\u94f6\u884c","IBK":"\u4f01\u4e1a\u94f6\u884c","QFXRCC":"\u6e05\u4e30\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","QCXDOVRCC":"\u9752\u5ddd\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","QSHXRCC":"\u6e05\u6c34\u6cb3\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","QXZYFLKXRCC":"\u6816\u971e\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","QJXRCC":"\u5de7\u5bb6\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","QHGHRCC":"\u9752\u6d77\u5171\u548c\u519c\u6751\u5546\u4e1a\u94f6\u884c","DZHJHYCZYH":"\u6e05\u5f90\u664b\u5546\u6751\u9547\u94f6\u884c","QCXJCCB":"\u5e86\u57ce\u53bf\u91d1\u57ce\u6751\u9547\u94f6\u884c","GYSBSGMCZYH":"\u66f2\u961c\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","QJHMCB":"\u66f2\u9756\u60e0\u6c11\u6751\u9547\u94f6\u884c","SZWMYCZYH":"\u66f2\u6c83\u53bf\u65b0\u7530\u6751\u9547\u94f6\u884c","QYXRCC":"\u66f2\u9633\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","QHCDMRCC":"\u9752\u6d77\u67f4\u8fbe\u6728\u519c\u6751\u5546\u4e1a\u94f6\u884c","QHTJRCC":"\u9752\u6d77\u5929\u5cfb\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","QHZKRCC":"\u9752\u6d77\u6cfd\u5e93\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","QHLDSJCZYH":"\u9752\u6d77\u4e50\u90fd\u4e09\u6c5f\u6751\u9547\u94f6\u884c","KMALHNSCZYH":"\u5e86\u9633\u5e02\u897f\u5cf0\u745e\u4fe1\u6751\u9547\u94f6\u884c","PSJYCZYH":"\u5168\u6912\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","HYXHRCZYH":"\u9976\u5e73\u878d\u548c\u6751\u9547\u94f6\u884c","HZMDBHCZYH":"\u66f2\u9756\u5bcc\u6e90\u5bcc\u6ec7\u6751\u9547\u94f6\u884c","HLJWCRCC":"\u9ed1\u9f99\u6c5f\u4e94\u5e38\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNXYXLCZYH":"\u786e\u5c71\u90d1\u94f6\u6751\u9547\u94f6\u884c","HNJHXYCZYH":"\u66f2\u9756\u6cbe\u76ca\u5174\u798f\u6751\u9547\u94f6\u884c","HNDFRCC":"\u6cb3\u5357\u767b\u5c01\u519c\u6751\u5546\u4e1a\u94f6\u884c","HGSSQRTLRCC":"\u9ed1\u9f99\u6c5f\u7701\u9e64\u5c97\u5e02\u5e02\u533a\u519c\u6751\u4fe1\u7528\u8054\u793e","ADRCB":"\u6e56\u5357\u4e1c\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","AHFDHSCZYH":"\u5e7f\u897f\u94f6\u6d77\u56fd\u6c11\u6751\u9547\u94f6\u884c","HNFCFYCZYH":"\u6dee\u5b89\u6e05\u6d66\u5174\u798f\u6751\u9547\u94f6\u884c","HBJXRCB":"\u6cb3\u5317\u4e95\u9649\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBXCRCC":"\u6e56\u5317\u5b5d\u660c\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXGXDYNRCC":"\u6c5f\u897f\u8d63\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","LZSQRCC":"\u67f3\u5dde\u5e02\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LINZRCB":"\u6797\u5dde\u5fb7\u4e30\u6751\u9547\u94f6\u884c","LXQDCZYH":"\u4e34\u53bf\u6cc9\u90fd\u6751\u9547\u94f6\u884c","LPSYCB":"\u6ee6\u5e73\u76db\u9633\u6751\u9547\u94f6\u884c","LSSWQRCC":"\u4e50\u5c71\u5e02\u6c99\u6e7e\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","MGTXRCC":"\u9ea6\u76d6\u63d0\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","PZBANK":"\u76d8\u9526\u94f6\u884c","PBXSZGRCC":"\u5e73\u575d\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BXTSCZYH":"\u66f2\u5468\u6052\u5347\u6751\u9547\u94f6\u884c","RPXRCC":"\u9976\u5e73\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LPSLZFMCZYH":"\u9976\u9633\u6c11\u5546\u6751\u9547\u94f6\u884c","LNQYRCB":"\u8fbd\u5b81\u6e05\u539f\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","RCXRCC":"\u5bb9\u57ce\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","RYXRCC":"\u9976\u9633\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","ZHRHCZYH":"\u4ec1\u5bff\u6c11\u5bcc\u6751\u9547\u94f6\u884c","YARSCZYH":"\u6c5d\u9633\u5174\u798f\u6751\u9547\u94f6\u884c","SEB":"\u745e\u5178\u5317\u6b27\u65af\u5b89\u94f6\u884c\u6709\u9650\u516c\u53f8","RMZZZZXNERE":"\u5b5f\u6751\u56de\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","RHMYCZYH":"\u4ec1\u6000\u8499\u94f6\u6751\u9547\u94f6\u884c","SWEDB":"\u745e\u5178\u94f6\u884c\u6709\u9650\u516c\u53f8","HBFNJXCZYH":"\u4e73\u5c71\u5929\u9a84\u6751\u9547\u94f6\u884c","RQCZYH":"\u4efb\u4e18\u6751\u9547\u94f6\u884c","HAHYXFCZYH":"\u745e\u4e3d\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","HNXYJXCZYH":"\u65e5\u7167\u84dd\u6d77\u6751\u9547\u94f6\u884c","RLSRCC":"\u745e\u4e3d\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","RXBANK":"\u745e\u4fe1\u6751\u9547\u94f6\u884c","UBS":"\u745e\u58eb\u94f6\u884c(\u4e2d\u56fd)\u6709\u9650\u516c\u53f8","MCB":"\u745e\u7a57\u94f6\u884c","RXKXLRCC":"\u5bb9\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","RHXRCC":"\u4ec1\u5316\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","RZDGRCC":"\u65e5\u7167\u4e1c\u6e2f\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJXSWNRCC":"\u6995\u6c5f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","RSMZRCC":"\u878d\u6c34\u82d7\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","RSXRCC":"\u4ec1\u5bff\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","RXNTMRCC":"\u8363\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","REGXRCC":"\u82e5\u5c14\u76d6\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","RYYZRCC":"\u4e73\u6e90\u7476\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CSFB":"\u745e\u58eb\u4fe1\u8d37\u7b2c\u4e00\u6ce2\u58eb\u987f\u94f6\u884c","RXNCXYHZLS":"\u8363\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YXHHCZYH":"\u745e\u660c\u4e5d\u94f6\u6751\u9547\u94f6\u884c","SHBAB":"\u745e\u5178\u5546\u4e1a\u94f6\u884c\u516c\u5171\u6709\u9650\u516c\u53f8","RZB":"\u65e5\u7167\u94f6\u884c","RQXRCC":"\u82e5\u7f8c\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","PXAYFMCZYH":"\u4e09\u90fd\u5bcc\u6c11\u6751\u9547\u94f6\u884c","PAPHCB":"\u666e\u5b89\u666e\u60e0\u6751\u9547\u94f6\u884c","FJYDRSCZYH":"\u4e09\u6c34\u73e0\u6c5f\u6751\u9547\u94f6\u884c","TFCNSCZYH":"\u5c71\u4e1c\u6210\u6b66\u6c49\u6e90\u6751\u9547\u94f6\u884c","SXJLXRCC":"\u5c71\u897f\u7701\u9759\u4e50\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SDFCRCC":"\u5c71\u4e1c\u80a5\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDB":"\u6df1\u5733\u53d1\u5c55\u94f6\u884c","SDGXQFCZYH":"\u5c71\u4e1c\u51a0\u53bf\u9f50\u4e30\u6751\u9547\u94f6\u884c","STSJSRCC":"\u6c55\u5934\u5e02\u91d1\u7802\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","CXRCB":"\u56db\u5ddd\u82cd\u6eaa\u519c\u6751\u5546\u4e1a\u94f6\u884c","SCDZNCB":"\u56db\u5ddd\u5927\u7af9\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SDJYRCTRCC":"\u5c71\u4e1c\u6d4e\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","SCWYCCB":"\u56db\u5ddd\u4e07\u6e90\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SGNCRCC":"\u97f6\u5173\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXPLMDDRCC":"\u9655\u897f\u5e73\u5229\u519c\u6751\u5546\u4e1a\u94f6\u884c","SCSHRCB":"\u56db\u5ddd\u5c04\u6d2a\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SXZCRCC":"\u5c71\u897f\u82ae\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDRCU":"\u5c71\u4e1c\u7701\u519c\u6751\u4fe1\u7528\u793e\u8054\u5408\u793e","SXZYXRCC":"\u5c71\u897f\u7701\u4e2d\u9633\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SDQFRCC":"\u5c71\u4e1c\u66f2\u961c\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXLFXRCC":"\u5c71\u897f\u7701\u5a04\u70e6\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SDLYSFDRCC":"\u5c71\u4e1c\u4e34\u9091\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXYLRCC":"\u9655\u897f\u6768\u51cc\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXSYXRCC":"\u5c71\u897f\u7701\u5e94\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXASJXCZYH":"\u65e5\u7167\u4e5d\u94f6\u6751\u9547\u94f6\u884c","SMBC":"\u4e09\u4e95\u4f4f\u53cb\u94f6\u884c","BTMU":"\u4e09\u83f1\u4e1c\u4eac\u65e5\u8054\u94f6\u884c","SDLJB":"\u5c71\u4e1c\u5229\u6d25\u821c\u4e30\u6751\u9547\u94f6\u884c","SDJNZZRCC":"\u5c71\u4e1c\u6d4e\u5b81\u5156\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDDARCC":"\u5c71\u4e1c\u4e1c\u963f\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDLLCB":"\u5c71\u4e1c\u5170\u9675\u6751\u9547\u94f6\u884c","IKNQNCSYIAA":"\u5c71\u4e1c\u4e34\u6e05\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNTJJXCZYH":"\u5c71\u4e1c\u4e34\u6710\u805a\u4e30\u6751\u9547\u94f6\u884c","USAYHDNCIRM":"\u5c71\u4e1c\u4e34\u6c82\u6cb3\u4e1c\u519c\u6751\u5546\u4e1a\u94f6\u884c","LYLZRCB":"\u5c71\u4e1c\u4e34\u6c82\u7f57\u5e84\u519c\u6751\u5546\u4e1a\u94f6\u884c","PCKYNCSYXIW":"\u5c71\u4e1c\u5b81\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","MZSYCZYH":"\u5c71\u4e1c\u5e73\u9091\u6c49\u6e90\u6751\u9547\u94f6\u884c","MLHSKRCC":"\u6728\u5792\u54c8\u8428\u514b\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXJLRCC":"\u5c71\u897f\u9759\u4e50\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SDZFQFCZYH":"\u5c71\u4e1c\u829d\u7f58\u9f50\u4e30\u6751\u9547\u94f6\u884c","SDMYQFCZYH":"\u5c71\u4e1c\u8499\u9634\u9f50\u4e30\u6751\u9547\u94f6\u884c","SXLZRCC":"\u5c71\u897f\u4e34\u7317\u519c\u6751\u5546\u4e1a\u94f6\u884c","SQSCXFCZYH":"\u6c5f\u95e8\u65b0\u4f1a\u65b0\u534e\u6751\u9547\u94f6\u884c","SXLLRCC":"\u5c71\u897f\u67f3\u6797\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXHDRCC":"\u5c71\u897f\u6d2a\u6d1e\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDLSRCC":"\u5c71\u4e1c\u6881\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","DTSXRQRCC":"\u5c71\u897f\u7701\u5927\u540c\u5e02\u65b0\u8363\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXDXXRCC":"\u5c71\u897f\u7701\u5b9a\u8944\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXZSNFNRCC":"\u5c71\u897f\u7a37\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","SRZYFDCZYH":"\u8392\u53bf\u91d1\u8c37\u6751\u9547\u94f6\u884c","KMJNRFCZYH":"\u6606\u660e\u664b\u5b81\u878d\u4e30\u6751\u9547\u94f6\u884c","SDPYJBKRCC":"\u5c71\u4e1c\u5e73\u539f\u519c\u6751\u5546\u4e1a\u94f6\u884c","SCCB":"\u4e09\u95e8\u5ce1\u94f6\u884c","FYYCRCC":"\u5c71\u897f\u7701\u6c7e\u9633\u5e02\u9633\u57ce\u519c\u6751\u4fe1\u7528\u793e","FYJCRCC":"\u5c71\u897f\u7701\u6c7e\u9633\u5e02\u5180\u6751\u519c\u6751\u4fe1\u7528\u793e","FYCXRCC":"\u5c71\u897f\u7701\u6c7e\u9633\u5e02\u57ce\u897f\u519c\u6751\u4fe1\u7528\u793e","FJLCHXCZYH":"\u6c99\u6d0b\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","TJJHXHCZYH":"\u5c71\u4e1c\u80a5\u57ce\u6c11\u4e30\u6751\u9547\u94f6\u884c","SDPYXPJRCC":"\u5c71\u4e1c\u5e73\u9634\u519c\u6751\u5546\u4e1a\u94f6\u884c","NMCZNCSYXTZ":"\u5c71\u4e1c\u65e0\u68e3\u519c\u6751\u5546\u4e1a\u94f6\u884c","QDCYZJCZYH":"\u5c71\u4e1c\u5468\u6751\u9752\u9686\u6751\u9547\u94f6\u884c","FYWFRCC":"\u5c71\u897f\u7701\u6c7e\u9633\u5e02\u6587\u5cf0\u519c\u6751\u4fe1\u7528\u793e","JKXSCRCC":"\u5c71\u897f\u7701\u5415\u6881\u5e02\u4ea4\u53e3\u53bf\u53cc\u6c60\u519c\u6751\u4fe1\u7528\u793e","LSQMXRCC":"\u5c71\u897f\u7701\u5415\u6881\u5e02\u79bb\u77f3\u533a\u6c11\u4fe1\u519c\u6751\u4fe1\u7528\u793e","LZZYFDCZYH":"\u9752\u9f99\u878d\u5174\u6751\u9547\u94f6\u884c","HCPFCZYH":"\u65e5\u7167\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","RZZSRCC":"\u65e5\u7167\u5c9a\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","RZJYCZYH":"\u5409\u5dde\u73e0\u6c5f\u6751\u9547\u94f6\u884c","FJNAHTCZYH":"\u9606\u4e2d\u878d\u5174\u6751\u9547\u94f6\u884c","LSQCGRCC":"\u5c71\u897f\u7701\u5415\u6881\u5e02\u79bb\u77f3\u533a\u57ce\u5173\u519c\u6751\u4fe1\u7528\u793e","LYJQRCB":"\u8fbd\u6e90\u519c\u6751\u5546\u4e1a\u94f6\u884c","LBXZCJCB":"\u6765\u5bbe\u8c61\u5dde\u957f\u6c5f\u6751\u9547\u94f6\u884c","QDJZZCCB":"\u9752\u5c9b\u80f6\u5dde\u4e2d\u6210\u6751\u9547\u94f6\u884c","LLSLSQRCC":"\u5c71\u897f\u7701\u5415\u6881\u5e02\u79bb\u77f3\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LQXCQCZYH":"\u7075\u4e18\u53bf\u957f\u9752\u6751\u9547\u94f6\u884c","LCZLZRCC":"\u7f57\u57ce\u4eeb\u4f6c\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LPXFCB":"\u7f57\u5e73\u5174\u798f\u6751\u9547\u94f6\u884c","MXPWURCC":"\u6885\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NJSZRCC":"\u5185\u6c5f\u5e02\u5e02\u4e2d\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","PYYCCZYH":"\u9752\u5dde\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","WSXFCRCC":"\u5c71\u897f\u7701\u5415\u6881\u5e02\u6587\u6c34\u53bf\u51e4\u57ce\u519c\u6751\u4fe1\u7528\u793e","WSCGDYRCC":"\u5c71\u897f\u7701\u5415\u6881\u5e02\u6587\u6c34\u53bf\u57ce\u5173\u7b2c\u4e00\u519c\u6751\u4fe1\u7528\u793e","WSXKZRCC":"\u5c71\u897f\u7701\u5415\u6881\u5e02\u6587\u6c34\u53bf\u5f00\u6805\u519c\u6751\u4fe1\u7528\u793e","WSXXYRCC":"\u5c71\u897f\u7701\u5415\u6881\u5e02\u6587\u6c34\u53bf\u5b5d\u4e49\u519c\u6751\u4fe1\u7528\u793e","ZYXJLRCC":"\u5c71\u897f\u7701\u5415\u6881\u5e02\u4e2d\u9633\u53bf\u91d1\u7f57\u519c\u6751\u4fe1\u7528\u793e","XCRCB":"\u56db\u5ddd\u897f\u5145\u519c\u6751\u5546\u4e1a\u94f6\u884c","YJHLLLCZYH":"\u795e\u6c60\u53bf\u6cb3\u4e1c\u6751\u9547\u94f6\u884c","SXLCDAARCC":"\u5c71\u897f\u9ece\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","BQGYCZYH":"\u9655\u897f\u5468\u81f3\u519c\u79d1\u6751\u9547\u94f6\u884c","SDLZOSWRCC":"\u5c71\u4e1c\u83b1\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDRSRCC":"\u5c71\u4e1c\u4e73\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","HSZJCZYH":"\u5c71\u4e1c\u6587\u767b\u5efa\u4fe1\u6751\u9547\u94f6\u884c","SZXUJURCC":"\u6df1\u6cfd\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","SZBARXCZYH":"\u6df1\u5733\u5b9d\u5b89\u878d\u5174\u6751\u9547\u94f6\u884c","SDZPRCB":"\u5c71\u4e1c\u90b9\u5e73\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDZPRCC":"\u5c71\u4e1c\u830c\u5e73\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDZCQRMRCC":"\u5c71\u4e1c\u90ef\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDYCRCB":"\u5c71\u4e1c\u79b9\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDYNRCC":"\u5c71\u4e1c\u6c82\u5357\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDZXGLARCC":"\u5c71\u4e1c\u8392\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXFXUOQRCC":"\u9655\u897f\u5bcc\u53bf\u519c\u6751\u5408\u4f5c\u94f6\u884c","YLHZCZYH":"\u9655\u897f\u5c90\u5c71\u957f\u94f6\u6751\u9547\u94f6\u884c","SXNWXRCC":"\u5c71\u897f\u7701\u5b81\u6b66\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SZLFCZYH":"\u51c9\u57ce\u53bf\u4e4c\u62c9\u7279\u6751\u9547\u94f6\u884c","SXTGRCC":"\u5c71\u897f\u592a\u8c37\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXQWRCC":"\u5c71\u897f\u66f2\u6c83\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXMZRCC":"\u9655\u897f\u7c73\u8102\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXHMRCC":"\u5c71\u897f\u4faf\u9a6c\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDXTQFCZYH":"\u5c71\u4e1c\u65b0\u6cf0\u9f50\u4e30\u6751\u9547\u94f6\u884c","SXBJWBRCC":"\u9655\u897f\u5b9d\u9e21\u6e2d\u6ee8\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXJXIUDRCC":"\u5c71\u897f\u4ecb\u4f11\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDCYRCC":"\u5c71\u4e1c\u660c\u9091\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDDPRCC":"\u5c71\u4e1c\u4e1c\u5e73\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXDBRCC":"\u9655\u897f\u5b9a\u8fb9\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXHRXRCC":"\u5c71\u897f\u7701\u6000\u4ec1\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","RYMSCZYH":"\u9655\u897f\u5434\u8d77\u6c47\u53d1\u6751\u9547\u94f6\u884c","XYWCHFCB":"\u9655\u897f\u54b8\u9633\u6e2d\u57ce\u6c47\u53d1\u6751\u9547\u94f6\u884c","SXZPRCC":"\u9655\u897f\u9547\u576a\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDLLVRNRCC":"\u5c71\u4e1c\u5170\u9675\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXHJRCC":"\u5c71\u897f\u6cb3\u6d25\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXZSJLCZYH":"\u9655\u897f\u67de\u6c34\u805a\u5229\u6751\u9547\u94f6\u884c","SQHSRCC":"\u5546\u4e18\u534e\u5546\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXSCXRCC":"\u5c71\u897f\u7701\u795e\u6c60\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXXZRCC":"\u5c71\u897f\u5ffb\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","LZXXTCZYH":"\u90b5\u6b66\u523a\u6850\u7ea2\u6751\u9547\u94f6\u884c","HXZJCZYH":"\u6df1\u6cfd\u5229\u4e30\u6751\u9547\u94f6\u884c","HZSZCZYH":"\u6c88\u9633\u6cd5\u5e93\u5bcc\u6c11\u6751\u9547\u94f6\u884c","YXYXCZYH":"\u6c88\u9633\u65b0\u6c11\u5bcc\u6c11\u6751\u9547\u94f6\u884c","SZXKOKRCC":"\u5e08\u5b97\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SDHMRCC":"\u5c71\u4e1c\u60e0\u6c11\u519c\u6751\u5546\u4e1a\u94f6\u884c","SJZZCQYIRCC":"\u77f3\u5bb6\u5e84\u5e02\u683e\u57ce\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SHBANK":"\u4e0a\u6d77\u94f6\u884c","SDRCRCC":"\u5c71\u4e1c\u8363\u6210\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXCCB":"\u7ecd\u5174\u5e02\u5546\u4e1a\u94f6\u884c","SDLZEJERCC":"\u5c71\u4e1c\u4e34\u6710\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXWBRCC":"\u9655\u897f\u5434\u5821\u519c\u6751\u5546\u4e1a\u94f6\u884c","SHQPCTHCZYH":"\u6d89\u53bf\u9f50\u9c81\u6751\u9547\u94f6\u884c","SJZKQRCC":"\u77f3\u5bb6\u5e84\u5e02\u77ff\u533a\u519c\u6751\u4fe1\u7528\u8054\u793e","SDYGRCB":"\u5c71\u4e1c\u9633\u8c37\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDCWRCC":"\u5c71\u4e1c\u6210\u6b66\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXXYKODRCC":"\u5c71\u897f\u8944\u57a3\u519c\u6751\u5546\u4e1a\u94f6\u884c","SHHR":"\u4e0a\u6d77\u534e\u745e\u94f6\u884c","STHYNCSYYH":"\u6c55\u5934\u6d77\u6e7e\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXBHRCC":"\u9655\u897f\u767d\u6cb3\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXYDB":"\u5c71\u897f\u5c27\u90fd\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SDCDRCC":"\u5c71\u4e1c\u957f\u5c9b\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXLZHSCB":"\u9655\u897f\u4e34\u6f7c\u6d77\u4e1d\u6751\u9547\u94f6\u884c","SXPGXRCC":"\u5c71\u897f\u7701\u504f\u5173\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXZYBJRRCC":"\u9655\u897f\u7d2b\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXWTRCC":"\u5c71\u897f\u4e94\u53f0\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXLCYFXRCC":"\u5c71\u897f\u6f5e\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDZCIUBRCC":"\u5c71\u4e1c\u5468\u6751\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDYXRCC":"\u5c71\u4e1c\u9633\u4fe1\u519c\u6751\u5546\u4e1a\u94f6\u884c","WSCGDERCC":"\u5c71\u897f\u7701\u5415\u6881\u5e02\u6587\u6c34\u53bf\u57ce\u5173\u7b2c\u4e8c\u519c\u6751\u4fe1\u7528\u793e","SXZZGAVRCC":"\u9655\u897f\u5b50\u6d32\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDZDRCC":"\u5c71\u4e1c\u5f20\u5e97\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXYYXRCC":"\u5c71\u897f\u7701\u53f3\u7389\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXHQXRCC":"\u5c71\u897f\u7701\u6cb3\u66f2\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SYXMFMCZYH":"\u9752\u6d77\u95e8\u6e90\u5927\u901a\u6751\u9547\u94f6\u884c","QHQLRCC":"\u9752\u6d77\u7941\u8fde\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXYCBMCRCC":"\u5c71\u897f\u6986\u6b21\u519c\u6751\u5546\u4e1a\u94f6\u884c","SYHMCB":"\u4e09\u4e9a\u60e0\u6c11\u6751\u9547\u94f6\u884c","SXLYRCC":"\u9655\u897f\u9e9f\u6e38\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXXXRCB":"\u5c71\u897f\u590f\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SDMYRCC":"\u5c71\u4e1c\u8499\u9634\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXZZOAQRCC":"\u5c71\u897f\u6cfd\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDLCRCRCB":"\u5c71\u4e1c\u804a\u57ce\u6da6\u660c\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDYSRCC":"\u5c71\u4e1c\u6c82\u6c34\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXKFRCB":"\u5c71\u897f\u5ca2\u5c9a\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXBANK":"\u4e09\u6e58\u94f6\u884c","ZSXLLXRCC":"\u912f\u5584\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZYXCGRCC":"\u5c71\u897f\u7701\u5415\u6881\u5e02\u4e2d\u9633\u53bf\u57ce\u5173\u519c\u6751\u4fe1\u7528\u793e","PYXJRCZYH":"\u9655\u897f\u9647\u53bf\u957f\u94f6\u6751\u9547\u94f6\u884c","SXMXRCC":"\u9655\u897f\u7709\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHTHJHCZYH":"\u6c55\u5934\u9f99\u6e56\u957f\u6c5f\u6751\u9547\u94f6\u884c","STSDSRCC":"\u6c55\u5934\u5e02\u7910\u77f3\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","SDKLRCC":"\u5c71\u4e1c\u57a6\u5229\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXJBRCC":"\u9655\u897f\u9756\u8fb9\u519c\u6751\u5546\u4e1a\u94f6\u884c","CFSHSYLCZYH":"\u4e0a\u6d77\u91d1\u5c71\u60e0\u6c11\u6751\u9547\u94f6\u884c","SHCBHK":"\u4e0a\u6d77\u5546\u4e1a\u94f6\u884c","STXRCC":"\u4e09\u53f0\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","ZWZCCZYH":"\u4e0a\u6d77\u677e\u6c5f\u5bcc\u660e\u6751\u9547\u94f6\u884c","ZQZXCZCZYH":"\u4e0a\u6d77\u677e\u6c5f\u6c11\u751f\u6751\u9547\u94f6\u884c","LJZYCZYH":"\u6df1\u5733\u798f\u7530\u94f6\u5ea7\u6751\u9547\u94f6\u884c","CDSLCMCZYH":"\u795e\u519c\u67b6\u695a\u519c\u5546\u6751\u9547\u94f6\u884c","NCJLZCCZYH":"\u77f3\u5bb6\u5e84\u65b0\u534e\u6052\u5347\u6751\u9547\u94f6\u884c","JCHCCZYH":"\u77f3\u95e8\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","WSGNCJCZYH":"\u77f3\u9996\u695a\u519c\u5546\u6751\u9547\u94f6\u884c","XCBFCZYH":"\u77f3\u5634\u5c71\u5e02\u5927\u6b66\u53e3\u77f3\u94f6\u6751\u9547\u94f6\u884c","FSSCFYCZYH":"\u53cc\u57ce\u60e0\u6c11\u6751\u9547\u94f6\u884c","JYBHCZYH":"\u53cc\u5cf0\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","SXXNSPRCC":"\u677e\u6eaa\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SCMZRCC":"\u56db\u5ddd\u7ef5\u7af9\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SDEB":"\u987a\u5fb7\u519c\u5546\u94f6\u884c","SXYGXRCC":"\u5c71\u897f\u7701\u9633\u9ad8\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SDLSMFCZYH":"\u5b81\u6ce2\u6d77\u66d9\u6d66\u53d1\u6751\u9547\u94f6\u884c","GXGPGYCZYH":"\u5e73\u5c71\u897f\u67cf\u5761\u5180\u94f6\u6751\u9547\u94f6\u884c","SPZYCZYH":"\u5c1a\u5fd7\u60e0\u946b\u6751\u9547\u94f6\u884c","SXLXRCC":"\u9655\u897f\u9647\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXLXRCB":"\u5c71\u897f\u5c9a\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SZSHNQRCC":"\u77f3\u5634\u5c71\u5e02\u60e0\u519c\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXSYHSCB":"\u9655\u897f\u4e09\u539f\u6d77\u4e1d\u6751\u9547\u94f6\u884c","SDJXTJMRCC":"\u5c71\u4e1c\u5609\u7965\u519c\u6751\u5546\u4e1a\u94f6\u884c","SCHSABANK":"\u6851\u5766\u5fb7\u94f6\u884c","FYSQRCC":"\u5c71\u897f\u7701\u6c7e\u9633\u5e02\u4e09\u6cc9\u519c\u6751\u4fe1\u7528\u793e","MBZG":"\u9996\u90fd\u94f6\u884c\uff08\u4e2d\u56fd\uff09\u6709\u9650\u516c\u53f8","SWRCB":"\u6c55\u5c3e\u519c\u6751\u5546\u4e1a\u94f6\u884c","KYWTMGJHCZYH":"\u53cc\u8fbd\u5409\u94f6\u6751\u9547\u94f6\u884c","SDHYRCC":"\u5c71\u4e1c\u6d77\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXLTRCB":"\u9655\u897f\u84dd\u7530\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXZGRCC":"\u9655\u897f\u5c9a\u768b\u519c\u6751\u5546\u4e1a\u94f6\u884c","GMHMCZYH":"\u601d\u5357\u957f\u5f81\u6751\u9547\u94f6\u884c","GYPFCZYH":"\u4e0a\u6d77\u6d66\u4e1c\u5efa\u4fe1\u6751\u9547\u94f6\u884c","BCQZFMCB":"\u56db\u5ddd\u5317\u5ddd\u7f8c\u65cf\u81ea\u6cbb\u53bf\u5bcc\u6c11\u6751\u9547\u94f6\u884c","KYXYSCZYXUDZ":"\u56db\u5ddd\u6210\u90fd\u84b2\u6c5f\u6c11\u5bcc\u6751\u9547\u94f6\u884c","SCLXRCB":"\u56db\u5ddd\u6cf8\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SCWYRCB":"\u56db\u5ddd\u5a01\u8fdc\u519c\u6751\u5546\u4e1a\u94f6\u884c","SCDLRCC":"\u56db\u5ddd\u4e39\u68f1\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","STSTPRCC":"\u6c55\u5934\u5e02\u9b80\u6d66\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","SCTQNCSYYH":"\u56db\u5ddd\u5929\u5168\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SRBANK":"\u4e0a\u9976\u94f6\u884c","HNZLXYCZYH":"\u56db\u5e73\u94c1\u4e1c\u5fb7\u4e30\u6751\u9547\u94f6\u884c","HBBDRCC":"\u6e56\u5317\u5df4\u4e1c\u519c\u6751\u5546\u4e1a\u94f6\u884c","QYQXRCC":"\u6e05\u8fdc\u5e02\u6e05\u65b0\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SZHZCZYH":"\u7762\u53bf\u5fb7\u5546\u6751\u9547\u94f6\u884c","SBXNQERCC":"\u65bd\u79c9\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YSRCBANK":"\u56db\u5ddd\u8425\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","SNSSZRCC":"\u9042\u5b81\u5e02\u9042\u5dde\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SLSZRCC":"\u5546\u6d1b\u5e02\u5546\u5dde\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","STCZCZYH":"\u9752\u6d77\u5e73\u5b89\u5927\u901a\u6751\u9547\u94f6\u884c","ZTNSH":"\u56db\u5ddd\u6893\u6f7c\u519c\u6751\u5546\u4e1a\u94f6\u884c","CJYMCZYH":"\u6c99\u6cb3\u8944\u901a\u6751\u9547\u94f6\u884c","SYNJQRCC":"\u677e\u539f\u5e02\u5b81\u6c5f\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SCQSCB":"\u56db\u5ddd\u9752\u795e\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SZSSCQRCC":"\u5c71\u897f\u7701\u6714\u5dde\u5e02\u6714\u57ce\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXHXRCB":"\u9655\u897f\u6237\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDLJRCC":"\u5c71\u4e1c\u5229\u6d25\u519c\u6751\u5546\u4e1a\u94f6\u884c","YBJJRCB":"\u56db\u5ddd\u5b9c\u5bbe\u91d1\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDLZJFCZYH":"\u6d77\u5357\u4fdd\u4ead\u878d\u5174\u6751\u9547\u94f6\u884c","SHXRCC":"\u5c04\u6d2a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","SLSCCC":"\u53cc\u8fbd\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXXYCCIRCC":"\u9655\u897f\u65ec\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","SRNCRCC":"\u4e0a\u9976\u519c\u6751\u5546\u4e1a\u94f6\u884c","SJJHR":"\u77f3\u5bb6\u5e84\u6c47\u878d\u519c\u6751\u5408\u4f5c\u94f6\u884c","GXRCB":"\u56db\u5ddd\u73d9\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","SCLSRCB":"\u56db\u5ddd\u90bb\u6c34\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SDDMRCC":"\u5c71\u4e1c\u4e1c\u660e\u519c\u6751\u5546\u4e1a\u94f6\u884c","SPSCQRCC":"\u56db\u5e73\u5e02\u57ce\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SZCSJXCZYH":"\u82cf\u5dde\u5e38\u719f\u5efa\u4fe1\u6751\u9547\u94f6\u884c","SCWSRCB":"\u56db\u5ddd\u6b66\u80dc\u519c\u6751\u5546\u4e1a\u94f6\u884c","SCXGCKRCC":"\u6c34\u57ce\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","KXTYCZYH":"\u56db\u5ddd\u5927\u7af9\u6e1d\u519c\u5546\u6751\u9547\u94f6\u884c","RBSB":"\u82cf\u683c\u5170\u7687\u5bb6\u94f6\u884c","SCJGRCB":"\u56db\u5ddd\u5251\u9601\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXYQPDSM":"\u5c71\u897f\u7701\u9633\u6cc9\u5e02\u5e73\u5b9a\u53bf\u77f3\u95e8\u53e3\u519c\u6751\u4fe1\u7528\u793e","SXBEHZQRCC":"\u5185\u8499\u53e4\u547c\u4f26\u8d1d\u5c14\u5e02\u65b0\u5df4\u5c14\u864e\u5de6\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","SXRCCU":"\u9655\u897f\u7701\u519c\u4fe1\u793e","SNTYQRCC":"\u82cf\u5c3c\u7279\u53f3\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NBIZJZSCZCZYH":"\u677e\u6843\u957f\u5f81\u6751\u9547\u94f6\u884c","SCSFRCB":"\u56db\u5ddd\u4ec0\u90a1\u519c\u6751\u5546\u4e1a\u94f6\u884c","CGNB":"\u56db\u5ddd\u5929\u5e9c\u94f6\u884c","GARCB":"\u56db\u5ddd\u9ad8\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","GLRCB":"\u56db\u5ddd\u53e4\u853a\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDXSGBRCC":"\u65bd\u7538\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SPXOJYRCC":"\u677e\u6f58\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","SXSYDIWRCC":"\u5c71\u897f\u5c71\u9634\u519c\u6751\u5546\u4e1a\u94f6\u884c","SZXMDYRCC":"\u77f3\u9621\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXCNSCZYH":"\u91cd\u5e86\u4e30\u90fd\u6c47\u4e30\u6751\u9547\u94f6\u884c","SXYXRCC":"\u5c71\u897f\u76c2\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","SJBANK":"\u76db\u4eac\u94f6\u884c","SDFXRCC":"\u5c71\u4e1c\u8d39\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","SYCTRCB":"\u6c88\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","FJZHTLCZYH":"\u6c88\u9633\u4e8e\u6d2a\u6c38\u5b89\u6751\u9547\u94f6\u884c","GZHDCZCZYH":"\u65bd\u79c9\u91d1\u9f0e\u6751\u9547\u94f6\u884c","ZYMSCZYXCMW":"\u5bff\u5149\u5f20\u519c\u5546\u6751\u9547\u94f6\u884c","SCQCRCB":"\u56db\u5ddd\u9752\u5ddd\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SCPWRCB":"\u56db\u5ddd\u5e73\u6b66\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SXXYWCRCC":"\u9655\u897f\u54b8\u9633\u6e2d\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","SCFSRCB":"\u56db\u5ddd\u5bcc\u987a\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXPYRCC":"\u5c71\u897f\u5e73\u9065\u519c\u6751\u5546\u4e1a\u94f6\u884c","SZSHRXRCC":"\u5c71\u897f\u7701\u6714\u5dde\u5e02\u6000\u4ec1\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SDDTRCC":"\u5c71\u4e1c\u5b9a\u9676\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXSNJLCB":"\u9655\u897f\u5546\u5357\u805a\u5229\u6751\u9547\u94f6\u884c","SXJKXRCC":"\u5c71\u897f\u7701\u4ea4\u53e3\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SDRCHFCB":"\u5c71\u4e1c\u8363\u6210\u6c47\u4e30\u6751\u9547\u94f6\u884c","HZQLCZYH":"\u9655\u897f\u592a\u767d\u957f\u94f6\u6751\u9547\u94f6\u884c","HNZCCJPRCC":"\u6cb3\u5357\u6f62\u5ddd\u519c\u6751\u5546\u4e1a\u94f6\u884c","JDZCJJYCZYH":"\u677e\u539f\u5b81\u6c5f\u60e0\u6c11\u6751\u9547\u94f6\u884c","JSGYTSCZYH":"\u56db\u5ddd\u4eea\u9647\u60e0\u6c11\u6751\u9547\u94f6\u884c","LSZRCB":"\u56db\u5ddd\u94f6\u884c\uff08\u51c9\u5c71\u5206\u884c\uff09","XNXRCC":"\u8083\u5357\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","SJXFRHRCC":"\u7ee5\u6c5f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SCGHNCB":"\u56db\u5ddd\u5e7f\u6c49\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SJXADJRCC":"\u53cc\u6c5f\u62c9\u795c\u65cf\u4f64\u65cf\u5e03\u6717\u65cf\u50a3\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXZZXRCC":"\u5c71\u897f\u7701\u5ca2\u5c9a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SDSHRCC":"\u5c71\u4e1c\u5546\u6cb3\u519c\u6751\u5546\u4e1a\u94f6\u884c","SZNSBSCZYH":"\u5c71\u4e1c\u90b9\u5e73\u9752\u9686\u6751\u9547\u94f6\u884c","SXFXIGARCC":"\u9655\u897f\u51e4\u7fd4\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXSZXRCC":"\u5c71\u897f\u7701\u5c9a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SCBBANK":"\u5546\u4e18\u5e02\u5546\u4e1a\u94f6\u884c","STSCYRCC":"\u6c55\u5934\u5e02\u6f6e\u9633\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SDSHHJCZYH":"\u5c71\u4e1c\u5546\u6cb3\u6c47\u91d1\u6751\u9547\u94f6\u884c","SDZNRCC":"\u5c71\u4e1c\u8392\u5357\u519c\u6751\u5546\u4e1a\u94f6\u884c","JCSLCXRCC":"\u5c71\u897f\u7701\u664b\u57ce\u5e02\u9675\u5ddd\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXYCIPMRCC":"\u5c71\u897f\u9633\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDZYJXCB":"\u5c71\u4e1c\u62db\u8fdc\u5efa\u4fe1\u6751\u9547\u94f6\u884c","SXPLLFRRCC":"\u5c71\u897f\u5e73\u9646\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDZHQYCZYH":"\u5c71\u4e1c\u6cbe\u5316\u9752\u4e91\u6751\u9547\u94f6\u884c","SDLYRKCRCC":"\u5c71\u4e1c\u83b1\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDQZRCB":"\u5c71\u4e1c\u9752\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SXCZLDRCC":"\u5c71\u897f\u957f\u6cbb\u9ece\u90fd\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDZQRCC":"\u5c71\u4e1c\u7ae0\u4e18\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXYSRCC":"\u5c71\u897f\u6986\u793e\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXJXZOXRCC":"\u9655\u897f\u4f73\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXTZXRCC":"\u5c71\u897f\u7701\u5929\u9547\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXYCAOLRCC":"\u5c71\u897f\u8fd0\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDGTRCC":"\u5c71\u4e1c\u9ad8\u5510\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXXFRCC":"\u5c71\u897f\u8944\u6c7e\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXGLXRCC":"\u5c71\u897f\u7701\u5e7f\u7075\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SDZSXDERCC":"\u5c71\u4e1c\u6cd7\u6c34\u519c\u6751\u5546\u4e1a\u94f6\u884c","JYTLCZYH":"\u9655\u897f\u6cfe\u9633\u6cf0\u9686\u6751\u9547\u94f6\u884c","OPPFSSQYCZYH":"\u9655\u897f\u6d1b\u5357\u9633\u5149\u6751\u9547\u94f6\u884c","FJXYRSCZYH":"\u9655\u897f\u6986\u6797\u6a2a\u5c71\u6c47\u53d1\u6751\u9547\u94f6\u884c","SXZBRCC":"\u9655\u897f\u9547\u5df4\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXBA":"\u5c71\u897f\u94f6\u884c","SXYQIBZRCC":"\u5c71\u897f\u9633\u66f2\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZSZCCB":"\u912f\u5584\u4e2d\u6210\u6751\u9547\u94f6\u884c","BJPGXHCZYH":"\u6c55\u5934\u6f6e\u9633\u878d\u548c\u6751\u9547\u94f6\u884c","SHJDHDCZYH":"\u4e0a\u6d77\u5609\u5b9a\u6d2a\u90fd\u6751\u9547\u94f6\u884c","SDSSQFCZYH":"\u5c71\u4e1c\u6cd7\u6c34\u9f50\u4e30\u6751\u9547\u94f6\u884c","STSCHRCC":"\u6c55\u5934\u5e02\u6f84\u6d77\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SDGQRCC":"\u5c71\u4e1c\u9ad8\u9752\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXWRRCB":"\u5c71\u897f\u4e07\u8363\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","CYMSCZYH":"\u6df1\u5733\u5149\u660e\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","XNZJCZYH":"\u6df1\u5733\u9f99\u5c97\u9f0e\u4e1a\u6751\u9547\u94f6\u884c","HAZCCZYH":"\u6c88\u9633\u8fbd\u4e2d\u5bcc\u6c11\u6751\u9547\u94f6\u884c","HAXBSTRCC":"\u534e\u5b89\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LYXIGGRCC":"\u7565\u9633\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SCEMSNCB":"\u56db\u5ddd\u5ce8\u7709\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SZZYFDCB":"\u77f3\u67f1\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","SDZYRCC":"\u5c71\u4e1c\u62db\u8fdc\u519c\u6751\u5546\u4e1a\u94f6\u884c","SYSBFMCB":"\u6c88\u9633\u6c88\u5317\u5bcc\u6c11\u6751\u9547\u94f6\u884c","SXBDXRCC":"\u5c71\u897f\u7701\u4fdd\u5fb7\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","STSZSRCC":"\u6c55\u5934\u5e02\u5c90\u5c71\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","SXSDXRCC":"\u5c71\u897f\u7701\u4ee3\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HLJZDJXCZYH":"\u4ec0\u90a1\u5e02\u601d\u6e90\u6751\u9547\u94f6\u884c","LGHFCZYH":"\u77f3\u6cb3\u5b50\u56fd\u6c11\u6751\u9547\u94f6\u884c","AUESQLCZYH":"\u77f3\u5bb6\u5e84\u683e\u57ce\u9f50\u9c81\u6751\u9547\u94f6\u884c","NJPKJFCZYH":"\u6714\u5dde\u5e02\u6714\u57ce\u533a\u8499\u94f6\u6751\u9547\u94f6\u884c","SCAYRCB":"\u56db\u5ddd\u5b89\u5cb3\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXXXZYFRCC":"\u9655\u897f\u897f\u4e61\u519c\u6751\u5546\u4e1a\u94f6\u884c","PAXRCC":"\u56db\u5ddd\u84ec\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","SCQXRCB":"\u56db\u5ddd\u6e20\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","SZWQRCC":"\u56db\u5b50\u738b\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXNSRCC":"\u9655\u897f\u5b81\u9655\u519c\u6751\u5546\u4e1a\u94f6\u884c","SCSTRCB":"\u56db\u5ddd\u4e09\u53f0\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SNCTHCB":"\u5bff\u5b81\u523a\u6850\u7ea2\u6751\u9547\u94f6\u884c","SYXHDCZYH":"\u5bff\u9633\u53bf\u6c47\u90fd\u6751\u9547\u94f6\u884c","SZSBK":"\u77f3\u5634\u5c71\u94f6\u884c","SDXZBBRCC":"\u8272\u8fbe\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SMHNSCZYH":"\u5bb9\u57ce\u90a2\u519c\u5546\u6751\u9547\u94f6\u884c","LQRCU":"\u5c71\u4e1c\u4e34\u6e05\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SXQNRCB":"\u9655\u897f\u79e6\u519c\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SXLCIMHRCC":"\u9655\u897f\u6d1b\u5ddd\u519c\u6751\u5546\u4e1a\u94f6\u884c","GXXAMXCZYH":"\u677e\u6ecb\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","GZCHLYCZYH":"\u4e0a\u9976\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","SYSRCB":"\u90b5\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SCMSJCCZYH":"\u82cf\u5dde\u5434\u4e2d\u73e0\u6c5f\u6751\u9547\u94f6\u884c","SCXHRCB":"\u56db\u5ddd\u5ba3\u6c49\u519c\u6751\u5546\u4e1a\u94f6\u884c","KMWHCJCZYH":"\u5d69\u53bf\u5174\u798f\u6751\u9547\u94f6\u884c","JNXLUVRCC":"\u8083\u5b81\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","JSDTCZCZYH":"\u4ec0\u90a1\u601d\u6e90\u6751\u9547\u94f6\u884c","JGDZYZRCC":"\u666f\u8c37\u50a3\u65cf\u5f5d\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JSHNSCZYH":"\u5317\u4eac\u95e8\u5934\u6c9f\u73e0\u6c5f\u6751\u9547\u94f6\u884c","SBXGTSRCC":"\u7ee5\u6ee8\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SZSCQRCC":"\u6714\u5dde\u5e02\u6714\u57ce\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXSMRCC":"\u9655\u897f\u795e\u6728\u519c\u6751\u5546\u4e1a\u94f6\u884c","SHBLQZXRCB":"\u7ee5\u5316\u5e02\u5317\u6797\u533a\u4e2d\u5fc3\u519c\u6751\u4fe1\u7528\u793e","SYQBCB":"\u7ee5\u9633\u9ed4\u5317\u6751\u9547\u94f6\u884c","SNRCB":"\u9042\u5b81\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SDZXMPIRCC":"\u5c71\u4e1c\u8398\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","SCRCU":"\u56db\u5ddd\u7701\u519c\u6751\u4fe1\u7528\u793e\u8054\u5408\u793e","SXHGRCC":"\u5c71\u897f\u58f6\u5173\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDWHRCC":"\u5c71\u4e1c\u5a01\u6d77\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXGPRCC":"\u5c71\u897f\u9ad8\u5e73\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDWSRCC":"\u5c71\u4e1c\u5fae\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDXJRCB":"\u5c71\u4e1c\u590f\u6d25\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJPFCZYH":"\u5c71\u4e1c\u90b9\u57ce\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","XYTLCZYH":"\u9655\u897f\u65ec\u9633\u6cf0\u9686\u6751\u9547\u94f6\u884c","WHSHBWHHCZYH":"\u4e0a\u6d77\u6d66\u4e1c\u6c5f\u5357\u6751\u9547\u94f6\u884c","PSRCB":"\u56db\u5ddd\u5c4f\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","SMXSZRCC":"\u4e09\u95e8\u5ce1\u9655\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","SCDYRCB":"\u56db\u5ddd\u5927\u82f1\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXXHDTRCC":"\u9042\u6eaa\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SJZLQRCC":"\u77f3\u5bb6\u5e84\u5e02\u9e7f\u6cc9\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SNCCB":"\u9042\u5b81\u94f6\u884c","BOSZ":"\u82cf\u5dde\u94f6\u884c","SDQXRCC":"\u5c71\u4e1c\u6816\u971e\u519c\u6751\u5546\u4e1a\u94f6\u884c","SGSQRCC":"\u97f6\u5173\u5e02\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXWXJSWRCC":"\u5c71\u897f\u6b66\u4e61\u519c\u6751\u5546\u4e1a\u94f6\u884c","SZLGDYCZYH":"\u6c68\u7f57\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","MJHNZRCC":"\u58a8\u6c5f\u54c8\u5c3c\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JLRCB":"\u56db\u5ddd\u7b60\u8fde\u519c\u6751\u5546\u4e1a\u94f6\u884c","JARCB":"\u56db\u5ddd\u6c5f\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","YMB":"\u5c71\u53e3\u94f6\u884c","SPXVGFRCC":"\u987a\u5e73\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","JWRCB":"\u56db\u5ddd\u728d\u4e3a\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SQNSNCSYUIH":"\u6e56\u5317\u4eac\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBWFRCC":"\u6e56\u5317\u4e94\u5cf0\u519c\u6751\u5546\u4e1a\u94f6\u884c","HYXPTMRCC":"\u5408\u9633\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXQXRCC":"\u5c71\u897f\u6e05\u5f90\u519c\u6751\u5546\u4e1a\u94f6\u884c","SHFXPFCB":"\u4e0a\u6d77\u5949\u8d24\u6d66\u53d1\u6751\u9547\u94f6\u884c","SDAQRCC":"\u5c71\u4e1c\u5b89\u4e18\u519c\u6751\u5546\u4e1a\u94f6\u884c","SMXRCC":"\u4e09\u95e8\u5ce1\u6e56\u6ee8\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","ZJXBAFRCC":"\u56db\u5ddd\u4e2d\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","WJRCB":"\u82cf\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXFSXRCC":"\u5c71\u897f\u7701\u65b9\u5c71\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SZFYCZYH":"\u6df1\u5dde\u4e30\u6e90\u6751\u9547\u94f6\u884c","SDHTRCC":"\u5c71\u4e1c\u6853\u53f0\u519c\u6751\u5546\u4e1a\u94f6\u884c","SCXICRRCC":"\u987a\u660c\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXZARCC":"\u9655\u897f\u9547\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXDFRCC":"\u9655\u897f\u4e39\u51e4\u519c\u6751\u5546\u4e1a\u94f6\u884c","JSXSJXCZYH":"\u5c71\u4e1c\u6c82\u5357\u84dd\u6d77\u6751\u9547\u94f6\u884c","SZSQVIRCC":"\u4ec0\u90a1\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","SCAZRCB":"\u56db\u5ddd\u5b89\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SXCZRCC":"\u5c71\u897f\u957f\u5b50\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDLZRGKRCC":"\u5c71\u4e1c\u4e34\u6dc4\u519c\u6751\u5546\u4e1a\u94f6\u884c","VQXZNCSYJFA":"\u5c71\u4e1c\u9752\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXYJRCC":"\u5c71\u897f\u6c38\u6d4e\u519c\u6751\u5546\u4e1a\u94f6\u884c","SCXNCRRCC":"\u838e\u8f66\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SLJYCZYH":"\u8212\u5170\u5409\u94f6\u6751\u9547\u94f6\u884c","SXSYQCORCC":"\u5c71\u897f\u5bff\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","SCCDLQZCZCZYH":"\u56db\u5ddd\u6210\u90fd\u9f99\u6cc9\u9a7f\u7a20\u5dde\u6751\u9547\u94f6\u884c","SXHYXRCC":"\u5c71\u897f\u7701\u6d51\u6e90\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXSNRCC":"\u9655\u897f\u5546\u5357\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXSYSSXRCC":"\u9655\u897f\u5c71\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","WXRCB":"\u56db\u5ddd\u5174\u6587\u77f3\u6d77\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXQJRCC":"\u9655\u897f\u6e05\u6da7\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXPSRCC":"\u5c71\u897f\u5e73\u987a\u519c\u6751\u5546\u4e1a\u94f6\u884c","SYNCRCC":"\u4e09\u4e9a\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDCXRCC":"\u5c71\u4e1c\u66f9\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","SPABANKCC":"\u5e73\u5b89\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8\u4fe1\u7528\u5361\u4e2d\u5fc3","SXLXCYCZYH":"\u9752\u5c9b\u80f6\u5357\u6d77\u6c47\u6751\u9547\u94f6\u884c","QZLZMZRCC":"\u743c\u4e2d\u9ece\u65cf\u82d7\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FJYCZNSCZYH":"\u5c71\u9634\u53bf\u592a\u884c\u6751\u9547\u94f6\u884c","SCMYCZYH":"\u6c34\u57ce\u8499\u94f6\u6751\u9547\u94f6\u884c","SCHMRCB":"\u4e0a\u8521\u60e0\u6c11\u6751\u9547\u94f6\u884c","SXYLYYRCC":"\u9655\u897f\u6986\u6797\u6986\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXYQJJGRCC":"\u5c71\u897f\u57a3\u66f2\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXWXFUMRCC":"\u5c71\u897f\u95fb\u559c\u519c\u6751\u5546\u4e1a\u94f6\u884c","WSLFCZYH":"\u9655\u897f\u6237\u53bf\u6d77\u4e1d\u6751\u9547\u94f6\u884c","RZHNSCZYH":"\u4e0a\u6d77\u5609\u5b9a\u6c11\u751f\u6751\u9547\u94f6\u884c","SGQJRCC":"\u97f6\u5173\u5e02\u66f2\u6c5f\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SWSRCC":"\u90b5\u6b66\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SZFTYZCZYH":"\u60e0\u5b89\u4e2d\u6210\u6751\u9547\u94f6\u884c","SXDTXRCC":"\u5c71\u897f\u7701\u5927\u540c\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SHBANKHZ":"\u4e0a\u6d77\u94f6\u884c\u676d\u5dde\u5206\u884c","WAFMCZYH":"\u6df1\u5733\u576a\u5c71\u73e0\u6c5f\u6751\u9547\u94f6\u884c","JZSSNSCZYH":"\u7762\u5b81\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","JSLLCZYH":"\u56db\u5e73\u8fbd\u6cb3\u86df\u94f6\u6751\u9547\u94f6\u884c","JXYXOGDRCC":"\u6c5f\u897f\u6c38\u4fee\u519c\u6751\u5546\u4e1a\u94f6\u884c","SZXWJRCC":"\u7ee5\u4e2d\u53bf\u4e07\u5bb6\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","SYSJTQRCC":"\u6c88\u9633\u5e02\u82cf\u5bb6\u5c6f\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SDNJRCC":"\u5c71\u4e1c\u5b81\u6d25\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXWQRCC":"\u9655\u897f\u5434\u8d77\u519c\u6751\u5408\u4f5c\u94f6\u884c","SDXKVZRCC":"\u5546\u90fd\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WHSWLTCZYH":"\u6c88\u9633\u5eb7\u5e73\u629a\u94f6\u6751\u9547\u94f6\u884c","SQXRCC":"\u77f3\u6e20\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BOSZJS":"\u82cf\u5dde\u94f6\u884c\u5361\u901a","SDBXXHCZYH":"\u4e3d\u6c5f\u6c38\u80dc\u957f\u6c5f\u6751\u9547\u94f6\u884c","SCLZRCB":"\u56db\u5ddd\u9606\u4e2d\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SDLYLSRCC":"\u5c71\u4e1c\u4e34\u6c82\u5170\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXNZRCC":"\u9655\u897f\u5357\u90d1\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXHCRCC":"\u9655\u897f\u97e9\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXXXSJKRCC":"\u5c71\u897f\u5174\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","SYXDRORCC":"\u4e09\u539f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","PCZYFDCZYH":"\u4e0a\u6d77\u5b9d\u5c71\u5bcc\u6c11\u6751\u9547\u94f6\u884c","SBMGZRCC":"\u8083\u5317\u8499\u53e4\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SMXNCRCC":"\u77f3\u68c9\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","SDQYRCC":"\u5c71\u4e1c\u5e86\u4e91\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDZSGENRCC":"\u5c71\u4e1c\u6c76\u4e0a\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDPLRCC":"\u5c71\u4e1c\u84ec\u83b1\u519c\u6751\u5546\u4e1a\u94f6\u884c","SZYYRCC":"\u5c71\u897f\u7701\u6714\u5dde\u5e02\u53f3\u7389\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXWZXRCC":"\u5c71\u897f\u7701\u4e94\u5be8\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SDZCERHRCC":"\u5c71\u4e1c\u90d3\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","WUSXZSNCFDK":"\u5c71\u897f\u7701\u5ffb\u5dde\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","SXQYORZRCC":"\u9655\u897f\u5343\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDLZYKMRCC":"\u5c71\u4e1c\u4e34\u6cad\u519c\u6751\u5546\u4e1a\u94f6\u884c","SZSPLQRCC":"\u5c71\u897f\u7701\u6714\u5dde\u5e02\u5e73\u9c81\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SHMHSYCZYH":"\u4e0a\u6d77\u95f5\u884c\u4e0a\u94f6\u6751\u9547\u94f6\u884c","SDLZHJCZYH":"\u5c71\u4e1c\u4e34\u6dc4\u6c47\u91d1\u6751\u9547\u94f6\u884c","SXGQRCC":"\u9655\u897f\u7518\u6cc9\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXLSRCC":"\u5c71\u897f\u7075\u77f3\u519c\u6751\u5546\u4e1a\u94f6\u884c","SJDZRCC":"\u4e09\u6c5f\u4f97\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SDJXTVZRCC":"\u5c71\u4e1c\u91d1\u4e61\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDPYFRLRCC":"\u5c71\u4e1c\u5e73\u9091\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXFZRCC":"\u5c71\u897f\u7e41\u5cd9\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHZXHSCZYH":"\u5e08\u5b97\u5174\u798f\u6751\u9547\u94f6\u884c","PZHCCB":"\u56db\u5ddd\u94f6\u884c","ZHRCB":"\u56db\u5ddd\u957f\u5b81\u7af9\u6d77\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDZCCHHRCC":"\u5c71\u4e1c\u8bf8\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","SHMYCB":"\u4e09\u6cb3\u8499\u94f6\u6751\u9547\u94f6\u884c","SPXFDYRCC":"\u77f3\u5c4f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SDGMRCC":"\u5c71\u4e1c\u9ad8\u5bc6\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXTBCYCZYH":"\u5b89\u5fbd\u4e1c\u81f3\u626c\u5b50\u6751\u9547\u94f6\u884c","PSXIQBRCC":"\u5e73\u5c71\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","QHGEMRCC":"\u9752\u6d77\u683c\u5c14\u6728\u519c\u6751\u5546\u4e1a\u94f6\u884c","SHSRCC":"\u4e09\u6cb3\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SCXRFKRCC":"\u5546\u57ce\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXSLXYCCRCC":"\u5c71\u897f\u7701\u77f3\u697c\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JLCYYYCZYH":"\u56db\u5b50\u738b\u8499\u94f6\u6751\u9547\u94f6\u884c","HMHXGMCZYH":"\u5bbf\u8fc1\u5bbf\u57ce\u5174\u798f\u6751\u9547\u94f6\u884c","SYXOANRCC":"\u7ee5\u9633\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXTBRCC":"\u9655\u897f\u592a\u767d\u519c\u6751\u5546\u4e1a\u94f6\u884c","SNTZQRCC":"\u82cf\u5c3c\u7279\u5de6\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXZZNCRCB":"\u9655\u897f\u5468\u81f3\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDXTRCC":"\u5c71\u4e1c\u65b0\u6cf0\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXZQRCC":"\u5c71\u897f\u5de6\u6743\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXYDRCC":"\u5c71\u897f\u5c27\u90fd\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDZZJXCZYH":"\u5b81\u590f\u76d0\u6c60\u6c47\u53d1\u6751\u9547\u94f6\u884c","YTFSZJCZYH":"\u6c5d\u5dde\u7389\u5ddd\u6751\u9547\u94f6\u884c","SZLGZYFDCZYH":"\u6df1\u5733\u9f99\u5c97\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","SXXYQDRCC":"\u9655\u897f\u54b8\u9633\u79e6\u90fd\u519c\u6751\u5546\u4e1a\u94f6\u884c","SYXGDMRCC":"\u6c99\u96c5\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HJRCB":"\u56db\u5ddd\u5408\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZXMXGRCC":"\u7762\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","TSKEGXRCC":"\u5854\u4ec0\u5e93\u5c14\u5e72\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","EXNSNCSYBNY":"\u6cf0\u5b89\u6cf0\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","QZZYFDCZYH":"\u592a\u548c\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","QXEPLRCC":"\u7941\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJQYTLCZYH":"\u9655\u897f\u5b89\u585e\u5efa\u4fe1\u6751\u9547\u94f6\u884c","ZQDJZYFDCZYH":"\u5b89\u4e49\u878d\u5174\u6751\u9547\u94f6\u884c","QHPADTCZYH":"\u6cf0\u548c\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","CNZJCZYH":"\u592a\u4ec6\u5bfa\u65d7\u946b\u6e90\u6751\u9547\u94f6\u884c","KZSJCPQYQTR":"\u592a\u539f\u5e02\u5c16\u8349\u576a\u533a\u9633\u66f2\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","NQPJYQJYRUT":"\u592a\u539f\u5e02\u664b\u6e90\u533a\u664b\u6e90\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","TZJYXZCB":"\u6cf0\u5dde\u59dc\u5830\u9521\u5dde\u6751\u9547\u94f6\u884c","TJWQCZYH":"\u9655\u897f\u5bcc\u5e73\u6c47\u53d1\u6751\u9547\u94f6\u884c","SZSTDZRCC":"\u5c1a\u5fd7\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXHSRCC":"\u9655\u897f\u6a2a\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDRCB":"\u987a\u5fb7\u519c\u6751\u4fe1\u7528\u8054\u793e","BOT":"\u53f0\u6e7e\u94f6\u884c","TJNHCZYH":"\u5929\u6d25\u5b81\u6cb3\u6751\u9547\u94f6\u884c","TJFMCZYH":"\u968f\u53bf\u695a\u519c\u5546\u6751\u9547\u94f6\u884c","SZXGLRCC":"\u7ee5\u4e2d\u53bf\u9ad8\u5cad\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","SCYLRCB":"\u56db\u5ddd\u4eea\u9647\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXFXQPERCC":"\u9655\u897f\u51e4\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXLQXRCC":"\u5c71\u897f\u7701\u7075\u4e18\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","TNXRCC":"\u6cf0\u5b81\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","TAZYRCC":"\u6cf0\u5b89\u5cb1\u5cb3\u519c\u6751\u5546\u4e1a\u94f6\u884c","MHWJYQJSLQL":"\u592a\u539f\u5e02\u664b\u6e90\u533a\u91d1\u80dc\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","LEUJYQJZWZQ":"\u592a\u539f\u5e02\u664b\u6e90\u533a\u664b\u7960\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","TYXDBGRCC":"\u592a\u539f\u5e02\u5c0f\u5e97\u533a\u5317\u683c\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","TYXDLJBRCC":"\u592a\u539f\u5e02\u5c0f\u5e97\u533a\u5218\u5bb6\u5821\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","TYWBLDSRCC":"\u592a\u539f\u5e02\u4e07\u67cf\u6797\u533a\u4e1c\u793e\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","TCMSAIRCC":"\u592a\u4ed3\u6c11\u751f\u6751\u9547\u94f6\u884c","XHLQYJYRCC":"\u592a\u539f\u5e02\u674f\u82b1\u5cad\u533a\u6768\u5bb6\u5cea\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","AHHYBFCZYH":"\u6cf0\u5dde\u9ad8\u6e2f\u5174\u798f\u6751\u9547\u94f6\u884c","TNHMCZYH":"\u6d2e\u5357\u60e0\u6c11\u6751\u9547\u94f6\u884c","TSBANK":"\u5510\u5c71\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","TJJNCZYH":"\u5929\u6d25\u6ee8\u6d77\u5fb7\u5546\u6751\u9547\u94f6\u884c","TATSRCB":"\u6cf0\u5b89\u6cf0\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","TYXDQXRCC":"\u592a\u539f\u5e02\u5c0f\u5e97\u533a\u4eb2\u8d24\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","TYSCQWUQRCC":"\u5c71\u897f\u7701\u592a\u539f\u5e02\u57ce\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXYPSRCC":"\u5c71\u897f\u7701\u539f\u5e73\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SCXYRCB":"\u56db\u5ddd\u53d9\u6c38\u519c\u6751\u5546\u4e1a\u94f6\u884c","SCNBRCB":"\u56db\u5ddd\u5357\u90e8\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SHRCB":"\u4e0a\u6d77\u519c\u5546\u94f6\u884c","SLXYKDRCC":"\u758f\u52d2\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SNBANK":"\u82cf\u5b81\u94f6\u884c","SZLHXHCZYH":"\u51ef\u91cc\u4e1c\u5357\u6751\u9547\u94f6\u884c","JSHAYHCZYH":"\u5929\u6d25\u6ee8\u6d77\u6c5f\u6dee\u6751\u9547\u94f6\u884c","HEBBZCZYH":"\u5929\u6d25\u6ee8\u6d77\u626c\u5b50\u6751\u9547\u94f6\u884c","DTHHCZYH":"\u5929\u6d25\u9759\u6d77\u65b0\u534e\u6751\u9547\u94f6\u884c","ZQYBYZCZYH":"\u7530\u4e1c\u5317\u90e8\u6e7e\u6751\u9547\u94f6\u884c","ZZGMCZYH":"\u5929\u6d25\u897f\u9752\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","ZKMYCZYH":"\u5510\u5c71\u5e02\u4e30\u5357\u821c\u4e30\u6751\u9547\u94f6\u884c","NGMSCZYH":"\u7530\u9633\u5174\u9633\u6751\u9547\u94f6\u884c","TLXXCZYH":"\u94c1\u5cad\u65b0\u661f\u6751\u9547\u94f6\u884c","TYYZQHZRCC":"\u592a\u539f\u5e02\u8fce\u6cfd\u533a\u90dd\u5e84\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","TLJGCZYH":"\u6c88\u4e18\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","TLNSCB":"\u94c1\u5cad\u519c\u5546\u6751\u9547\u94f6\u884c","TSSKPHJCZYH":"\u5510\u5c71\u5e02\u5f00\u5e73\u6c47\u91d1\u6751\u9547\u94f6\u884c","LPRXCZYH":"\u901a\u8fbd\u91d1\u8c37\u6751\u9547\u94f6\u884c","TSCNSRCC":"\u901a\u5c71\u695a\u519c\u5546\u6751\u9547\u94f6\u884c","TQXRCC":"\u5929\u5168\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","TCCB":"\u5929\u6d25\u94f6\u884c","TYLFXRCC":"\u592a\u539f\u5e02\u5a04\u70e6\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","TUASHZCCZYH":"\u4e0a\u676d\u4e2d\u6210\u6751\u9547\u94f6\u884c","SLXLUGRCC":"\u77f3\u697c\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SHBLQCNXRCC":"\u7ee5\u5316\u5e02\u5317\u6797\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXXNRCC":"\u5c71\u897f\u4e61\u5b81\u519c\u6751\u5546\u4e1a\u94f6\u884c","SFXRCC":"\u758f\u9644\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXWQHFCZYH":"\u4e0a\u6d77\u6d66\u4e1c\u6052\u901a\u6751\u9547\u94f6\u884c","STSHPRCC":"\u6c55\u5934\u5e02\u6cb3\u6d66\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","STTQRCC":"\u6c55\u5934\u7ecf\u6d4e\u7279\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","TSMJRCC":"\u5929\u6c34\u9ea6\u79ef\u519c\u6751\u5408\u4f5c\u94f6\u884c","WZYTMGJHCZYH":"\u94c1\u95e8\u5173\u6d25\u6c47\u6751\u9547\u94f6\u884c","BTSGXYTCZYH":"\u901a\u6986\u519c\u5546\u6751\u9547\u94f6\u884c","TMTZQRCC":"\u571f\u9ed8\u7279\u5de6\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","TAXXFRCC":"\u53f0\u5b89\u53bf\u897f\u4f5b\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","TJXTFQRCC":"\u901a\u6c5f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","TACCB":"\u6cf0\u5b89\u94f6\u884c","TCWYRCC":"\u94dc\u5ddd\u5e02\u738b\u76ca\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","TYXDXDRCC":"\u592a\u539f\u5e02\u5c0f\u5e97\u533a\u5c0f\u5e97\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","TKSXRCC":"\u7279\u514b\u65af\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","KTB":"\u6cf0\u4eac\u94f6\u884c","TLFSRCC":"\u5410\u9c81\u756a\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","TCHMCZYH":"\u901a\u57ce\u60e0\u6c11\u6751\u9547\u94f6\u884c","HNXNTNSCZYH":"\u94dc\u4ec1\u4e07\u5c71\u957f\u5f81\u6751\u9547\u94f6\u884c","TZB":"\u53f0\u5dde\u5e02\u5546\u4e1a\u94f6\u884c","TCYZRCC":"\u94dc\u5ddd\u5e02\u8000\u5dde\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","TLNMRCC":"\u901a\u8fbd\u5948\u66fc\u519c\u6751\u5408\u4f5c\u94f6\u884c","TYWBLSGRCC":"\u592a\u539f\u5e02\u4e07\u67cf\u6797\u533a\u6c99\u6c9f\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","TAXTAZRCC":"\u53f0\u5b89\u53bf\u53f0\u5b89\u9547\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","TCYTRCC":"\u94dc\u5ddd\u5e02\u5370\u53f0\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","TYXDXWZRCC":"\u592a\u539f\u5e02\u5c0f\u5e97\u533a\u897f\u6e29\u5e84\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","THRCB":"\u901a\u5316\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZGXMZFRCC":"\u6f7c\u5173\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GXBBLYCZYH":"\u6850\u6893\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","LANDBANK":"\u571f\u5730\u94f6\u884c","TXRXCZYH":"\u901a\u8bb8\u878d\u4fe1\u6751\u9547\u94f6\u884c","TEXRCC":"\u5929\u5ce8\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","TLSYZQRCC":"\u94c1\u5cad\u5e02\u94f6\u5dde\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FUBON":"\u53f0\u5317\u5bcc\u90a6\u94f6\u884c","XACAXHCZYH":"\u53f0\u6c5f\u5bcc\u6c11\u6751\u9547\u94f6\u884c","SHPDHTCZYH":"\u53f0\u524d\u5fb7\u5546\u6751\u9547\u94f6\u884c","SSGDCZYH":"\u97f6\u5c71\u5149\u5927\u6751\u9547\u94f6\u884c","TYWBLXMRCC":"\u592a\u539f\u5e02\u4e07\u67cf\u6797\u533a\u897f\u94ed\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","TCYZXHCZYH":"\u94dc\u5ddd\u5370\u53f0\u6052\u901a\u6751\u9547\u94f6\u884c","TGYXTXXNSCZYH":"\u5305\u5934\u5e02\u4e1c\u6cb3\u91d1\u8c37\u6751\u9547\u94f6\u884c","HBYXWLTRCC":"\u6e56\u5317\u9633\u65b0\u519c\u6751\u5546\u4e1a\u94f6\u884c","HLJBQXRCC":"\u9ed1\u9f99\u6c5f\u7701\u5b9d\u6e05\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","HDXRCC":"\u90af\u90f8\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JXWLRCC":"\u6c5f\u897f\u6e7e\u91cc\u519c\u6751\u5546\u4e1a\u94f6\u884c","ASXXFMCZYH":"\u5357\u5b81\u6b66\u9e23\u6f13\u6c5f\u6751\u9547\u94f6\u884c","SCJYRCB":"\u56db\u5ddd\u7b80\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDGRRCC":"\u5c71\u4e1c\u5e7f\u9976\u519c\u6751\u5546\u4e1a\u94f6\u884c","TWXRCC":"\u901a\u6e2d\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","TYJYYCRCC":"\u592a\u539f\u5e02\u664b\u6e90\u533a\u59da\u6751\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","ZQRCHFCZYH":"\u6c64\u9634\u5174\u798f\u6751\u9547\u94f6\u884c","TCMKKGRCC":"\u5929\u957f\u6c11\u751f\u6751\u9547\u94f6\u884c","TXHZCZYH":"\u5510\u53bf\u6c47\u6cfd\u6751\u9547\u94f6\u884c","TSSRCC":"\u53f0\u5c71\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NBBLZYFDCZYH":"\u5929\u6d25\u534e\u660e\u6751\u9547\u94f6\u884c","NMYJHLRCC":"\u5185\u8499\u53e4\u4f0a\u91d1\u970d\u6d1b\u519c\u6751\u5546\u4e1a\u94f6\u884c","PSCGXRCC":"\u76ae\u5c71\u53bf\u85cf\u6842\u4e61\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","PDFMCZYH":"\u5929\u6d25\u6b66\u6e05\u6751\u9547\u94f6\u884c","LQHSCZYH":"\u901a\u5316\u4e8c\u9053\u6c5f\u745e\u4e30\u6751\u9547\u94f6\u884c","TMTZZYXEIP":"\u901a\u5316\u878d\u8fbe\u6751\u9547\u94f6\u884c","THXRCC":"\u5510\u6cb3\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","TJBHB":"\u5929\u6d25\u6ee8\u6d77\u519c\u6751\u5546\u4e1a\u94f6\u884c","TLBANK":"\u94c1\u5cad\u94f6\u884c","JXRFCZYH":"\u94dc\u9f13\u4e5d\u94f6\u6751\u9547\u94f6\u884c","TLWJRCC":"\u94dc\u9675\u7696\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","THXCQRCC":"\u6cf0\u548c\u53bf\u57ce\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","TCHFBANK":"\u5854\u57ce\u6d25\u6c47\u6751\u9547\u94f6\u884c\u6709\u9650\u8d23\u4efb\u516c\u53f8","TAXCJRCC":"\u53f0\u5b89\u53bf\u57ce\u90ca\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","KASIKORNBANK":"\u6cf0\u534e\u519c\u6c11\u94f6\u884c","SHCMHNSCZYH":"\u6f7c\u5357\u6c11\u751f\u6751\u9547\u94f6\u884c","SDWDRCC":"\u5c71\u4e1c\u6587\u767b\u519c\u6751\u5546\u4e1a\u94f6\u884c","TRRCB":"\u94dc\u4ec1\u519c\u6751\u5546\u4e1a\u94f6\u884c","DZCACZYH":"\u7a81\u6cc9\u8499\u94f6\u6751\u9547\u94f6\u884c","NHZYFDCZYH":"\u571f\u9ed8\u7279\u5de6\u65d7\u91d1\u8c37\u6751\u9547\u94f6\u884c","GAHSCZYH":"\u56e2\u98ce\u695a\u519c\u5546\u6751\u9547\u94f6\u884c","TLSHCB":"\u5c6f\u7559\u4e09\u79be\u6751\u9547\u94f6\u884c","TAHNSCB":"\u6cf0\u5b89\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","TAIS":"\u53f0\u65b0\u94f6\u884c","TJHXCZYH":"\u540c\u6c5f\u6c47\u946b\u6751\u9547\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","TYXDCYRCC":"\u592a\u539f\u5e02\u5c0f\u5e97\u533a\u671d\u9633\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","ZQQLCZYH":"\u5929\u9547\u53bf\u6cb3\u4e1c\u6751\u9547\u94f6\u884c","MMDBCJCZYH":"\u5929\u6c34\u79e6\u5dde\u957f\u94f6\u6751\u9547\u94f6\u884c","FISC":"\u53f0\u7063\u91d1\u878d\u5361","TLXFHRCC":"\u94c1\u5cad\u53bf\u51e1\u6cb3\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","TYSJCPQXDCZYH":"\u592a\u539f\u5e02\u5c16\u8349\u576a\u533a\u4fe1\u90fd\u6751\u9547\u94f6\u884c","TXTUMRCC":"\u85e4\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","TYXNPSRCC":"\u6c64\u539f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","TZQCSQRCC":"\u571f\u5de6\u65d7\u5bdf\u7d20\u9f50\u4fe1\u7528\u793e","TSQZRCC":"\u5929\u6c34\u79e6\u5dde\u519c\u6751\u5408\u4f5c\u94f6\u884c","KCBEBANK":"\u5929\u6d25\u91d1\u57ce\u94f6\u884c","TJXALRRCC":"\u5929\u5cfb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","HNSDXHCZYH":"\u5c6f\u7559\u53bf\u4e09\u79be\u6751\u9547\u94f6\u884c","TKYXRCC":"\u6258\u514b\u900a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","TLXZZQRCC":"\u6258\u91cc\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YTYHHTCZYH":"\u74e6\u623f\u5e97\u957f\u5174\u6751\u9547\u94f6\u884c","WRXJCRCC":"\u4e07\u8363\u53bf\u8d3e\u6751\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","WRXPZRCC":"\u4e07\u8363\u53bf\u88f4\u5e84\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","WRXRHRCC":"\u4e07\u8363\u53bf\u8363\u6cb3\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","WBLQXJYRCC":"\u592a\u539f\u5e02\u4e07\u67cf\u6797\u533a\u5c0f\u4e95\u5cea\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","KLQYLCZYH":"\u671b\u8c1f\u5bcc\u6c11\u6751\u9547\u94f6\u884c","WSXWEARCC":"\u5dcd\u5c71\u5f5d\u65cf\u56de\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WDLCHFCZYH":"\u9655\u897f\u6c49\u4e2d\u5357\u90d1\u6c47\u53d1\u6751\u9547\u94f6\u884c","TAXGLFRCC":"\u53f0\u5b89\u53bf\u9ad8\u529b\u623f\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","WYSRCC":"\u4e07\u6e90\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","WRXRCC":"\u4e07\u8363\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","WXXNCZYH":"\u5a01\u53bf\u90a2\u519c\u5546\u6751\u9547\u94f6\u884c","WSHYBANK":"\u5c09\u6c0f\u5408\u76ca\u6751\u9547\u94f6\u884c","ANTBANK":"\u7f51\u5546\u94f6\u884c","WXCYYRCC":"\u9b4f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BANKWF":"\u6f4d\u574a\u94f6\u884c","WRXGCRCC":"\u4e07\u8363\u53bf\u9ad8\u6751\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","WHCCB":"\u5a01\u6d77\u5e02\u5546\u4e1a\u94f6\u884c","AHHSJQCZYH":"\u5fae\u5c71\u5317\u6d77\u6751\u9547\u94f6\u884c","YZPFCZYH":"\u536b\u8f89\u5bcc\u6c11\u6751\u9547\u94f6\u884c","QWKWAXHMCZYH":"\u6587\u5b89\u53bf\u60e0\u6c11\u6751\u9547\u94f6\u884c","WHBANK":"\u4e4c\u6d77\u94f6\u884c","KEB":"\u5916\u6362\u94f6\u884c","WRXHFRCC":"\u4e07\u8363\u53bf\u7687\u752b\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","WNSLWQRCC":"\u6e2d\u5357\u5e02\u4e34\u6e2d\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WRXSWRCC":"\u4e07\u8363\u53bf\u4e09\u6587\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","WHFMCZYH":"\u5a01\u6d77\u5bcc\u6c11\u6751\u9547\u94f6\u884c","WSFNCJCZYH":"\u6f4d\u574a\u5e02\u6f4d\u57ce\u533a\u5317\u6d77\u6751\u9547\u94f6\u884c","WRXCGRCC":"\u4e07\u8363\u53bf\u57ce\u5173\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","WHDXHYZCZYH":"\u671b\u90fd\u4e2d\u6210\u6751\u9547\u94f6\u884c","WRXTHRCC":"\u4e07\u8363\u53bf\u901a\u5316\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","WKXRCC":"\u671b\u594e\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","MZYAHWYHSCZYH":"\u5a01\u5b81\u5bcc\u6c11\u6751\u9547\u94f6\u884c","SHBSYZCZYH":"\u6e29\u53bf\u9f50\u9c81\u6751\u9547\u94f6\u884c","HNHSXLCZYH":"\u6587\u5c71\u5bcc\u5b81\u957f\u6c5f\u6751\u9547\u94f6\u884c","WXAANRCC":"\u6587\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WCXYMURCC":"\u65fa\u82cd\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WSYSCJCZYH":"\u6587\u5c71\u781a\u5c71\u957f\u6c5f\u6751\u9547\u94f6\u884c","ZCXHYVRCC":"\u6c76\u5ddd\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","ZDHSCZYH":"\u901a\u5316\u4e1c\u660c\u6986\u94f6\u6751\u9547\u94f6\u884c","ZNSRCC":"\u6d2e\u5357\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HLDGXCZYH":"\u6f4d\u574a\u5e02\u594e\u6587\u533a\u4e2d\u6210\u6751\u9547\u94f6\u884c","HZWXRCC":"\u6e56\u5dde\u5434\u5174\u519c\u6751\u5546\u4e1a\u94f6\u884c","LNHRJYCZYH":"\u7fc1\u725b\u7279\u7acb\u519c\u6751\u9547\u94f6\u884c","LJSRCC":"\u5ec9\u6c5f\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HLGLMYCZYH":"\u5929\u6d25\u6d25\u5357\u6751\u9547\u94f6\u884c","TYXXMQRCC":"\u901a\u6986\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","TYXDHLRCC":"\u592a\u539f\u5e02\u5c0f\u5e97\u533a\u9ec4\u9675\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","NNXNCJCZYH":"\u94dc\u4ec1\u4e30\u6e90\u6751\u9547\u94f6\u884c","ZQCSZYFDCZYH":"\u4e4c\u5170\u5bdf\u5e03\u5e02\u96c6\u5b81\u5305\u5546\u6751\u9547\u94f6\u884c","ZYXUOSRCC":"\u6d9e\u6e90\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","BJDXHXCZYH":"\u4e4c\u9c81\u6728\u9f50\u7c73\u4e1c\u6d66\u53d1\u6751\u9547\u94f6\u884c","BJMTGZJCZYH":"\u4e0a\u6d77\u9752\u6d66\u523a\u6850\u7ea2\u6751\u9547\u94f6\u884c","PZWHCZYH":"\u6df1\u5733\u5357\u5c71\u5b9d\u751f\u6751\u9547\u94f6\u884c","BNU":"\u8461\u56fd\u50a8\u84c4\u4fe1\u8d37\u94f6\u884c","SCPXRCB":"\u56db\u5ddd\u84ec\u6eaa\u519c\u6751\u5546\u4e1a\u94f6\u884c","SPZYCB":"\u9042\u5e73\u4e2d\u539f\u6751\u9547\u94f6\u884c","SHPDJXCZYH":"\u9042\u5ddd\u6d2a\u90fd\u6751\u9547\u94f6\u884c","TYSCQPTHRCC":"\u592a\u539f\u5e02\u57ce\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SGZNSCZYH":"\u4e4c\u5ba1\u65d7\u5305\u5546\u6751\u9547\u94f6\u884c","HNSSXNSCZYH":"\u5c71\u4e1c\u91d1\u4e61\u84dd\u6d77\u6751\u9547\u94f6\u884c","SXSDRCC":"\u9655\u897f\u7ee5\u5fb7\u519c\u6751\u5546\u4e1a\u94f6\u884c","SNAJRXCZYH":"\u9042\u5b81\u5b89\u5c45\u878d\u5174\u6751\u9547\u94f6\u884c","SDLKRCC":"\u5c71\u4e1c\u9f99\u53e3\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDWCRCC":"\u5c71\u4e1c\u6b66\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXFSRCC":"\u5c71\u897f\u6d6e\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c\u6709\u9650\u8d23\u4efb\u516c\u53f8","STSZCRCC":"\u6c55\u5934\u5e02\u73e0\u6c60\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","SDZCHYCB":"\u5c71\u4e1c\u90ef\u57ce\u6c49\u6e90\u6751\u9547\u94f6\u884c","SXGJRCC":"\u5c71\u897f\u53e4\u4ea4\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDCLRCC":"\u5c71\u4e1c\u660c\u4e50\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDBXRCC":"\u5c71\u4e1c\u535a\u5174\u519c\u6751\u5546\u4e1a\u94f6\u884c","JCSQSXRCC":"\u5c71\u897f\u7701\u664b\u57ce\u5e02\u6c81\u6c34\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SCBANK":"\u56db\u5ddd\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SCLZBANK":"\u56db\u5ddd\u4e50\u81f3\u519c\u6751\u5546\u4e1a\u94f6\u884c","SZXFCZYH":"\u9b4f\u53bf\u9f50\u9c81\u6751\u9547\u94f6\u884c","SFHNSCZYH":"\u4e4c\u9c81\u6728\u9f50\u53bf\u5229\u4e30\u6751\u9547\u94f6\u884c","SCCDPJMFCZYH":"\u4e4c\u82cf\u5229\u4e30\u6751\u9547\u94f6\u884c","SCHYNCB":"\u56db\u5ddd\u534e\u84e5\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","STSXPRCC":"\u6c55\u5934\u5e02\u4e0b\u84ec\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","SXCWRCC":"\u9655\u897f\u957f\u6b66\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXXYUARRCC":"\u5c71\u897f\u5b5d\u4e49\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDHMB":"\u5c71\u4e1c\u60e0\u6c11\u821c\u4e30\u6751\u9547\u94f6\u884c","SDLSQFCZYH":"\u5c71\u4e1c\u83b1\u5c71\u9f50\u4e30\u6751\u9547\u94f6\u884c","SXZSMNRRCC":"\u9655\u897f\u67de\u6c34\u519c\u6751\u5546\u4e1a\u94f6\u884c","BTGMCZYH":"\u5355\u53bf\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","ANTZ":"\u6570\u5b57\u8d27\u5e01\u8fd0\u8425\u673a\u6784","SXXUFQRCC":"\u59cb\u5174\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SCRSRCB":"\u56db\u5ddd\u4ec1\u5bff\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","STMZRCC":"\u677e\u6843\u82d7\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SNYGZRCC":"\u8083\u5357\u88d5\u56fa\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SDJYQCWRCC":"\u5c71\u4e1c\u5de8\u91ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","SLYZRCC":"\u77f3\u6797\u5f5d\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXASRCC":"\u9655\u897f\u5b89\u585e\u519c\u6751\u5546\u4e1a\u94f6\u884c","SPTXDYCZYH":"\u56db\u5e73\u94c1\u897f\u6566\u94f6\u6751\u9547\u94f6\u884c","SDJNCB":"\u5c71\u4e1c\u8392\u5357\u6751\u9547\u94f6\u884c","SDLLXXGRCC":"\u5c71\u4e1c\u4e50\u9675\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDLWRCC":"\u5c71\u4e1c\u83b1\u829c\u519c\u6751\u5546\u4e1a\u94f6\u884c","SBXNCPRCC":"\u53cc\u67cf\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","STCYRHCZYH":"\u6e56\u5357\u6c5d\u57ce\u65b0\u9633\u6751\u9547\u94f6\u884c","TLSQHQRCC":"\u94c1\u5cad\u5e02\u6e05\u6cb3\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","TLNCRCC":"\u94dc\u9675\u519c\u6751\u5546\u4e1a\u94f6\u884c","TWBANK":"\u53f0\u6e7e\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","TAXRCC":"\u53f0\u5b89\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","LWZCCZYH":"\u817e\u51b2\u6c11\u751f\u6751\u9547\u94f6\u884c","FXXTXCZYH":"\u4e07\u5e74\u9ec4\u6cb3\u6751\u9547\u94f6\u884c","DLLSKMYCZYH":"\u65e0\u9521\u6ee8\u6e56\u5174\u798f\u6751\u9547\u94f6\u884c","XEPWZSBHCZYH":"\u5434\u5fe0\u5e02\u6ee8\u6cb3\u6751\u9547\u94f6\u884c","WSXYNJRCC":"\u6b66\u80dc\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","WRXZDRCC":"\u4e07\u8363\u53bf\u57dd\u5e95\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","WQXJWQRCC":"\u5434\u6865\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","WZSQRCC":"\u68a7\u5dde\u5e02\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WLTHQRCC":"\u4e4c\u62c9\u7279\u540e\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WQXGHCRCC":"\u4e4c\u6070\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","WZCB":"\u6e29\u5dde\u94f6\u884c","WNSRCC":"\u4e07\u5b81\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WSXRDCZYH":"\u6587\u6c34\u53bf\u6da6\u90fd\u6751\u9547\u94f6\u884c","LDFZCZYH":"\u5deb\u5c71\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","WDXRCC":"\u6b66\u5b9a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WCSRCC":"\u5434\u5ddd\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WRCB":"\u65e0\u9521\u519c\u6751\u5546\u4e1a\u94f6\u884c","WCYRCZYH":"\u6b66\u57ce\u5706\u878d\u6751\u9547\u94f6\u884c","XSJYCZYH":"\u6b66\u5188\u5305\u5546\u6751\u9547\u94f6\u884c","WGXRCC":"\u6b66\u529f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WYMYCZYH":"\u798f\u5efa\u7f57\u6e90\u6c47\u878d\u6751\u9547\u94f6\u884c","WZXRCC":"\u671b\u8c1f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FSWHFYCZYH":"\u4e94\u5bb6\u6e20\u56fd\u6c11\u6751\u9547\u94f6\u884c","WSXXURRCC":"\u6b66\u5c71\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WRXWXRCC":"\u4e07\u8363\u53bf\u738b\u663e\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","WLHTSRCC":"\u4e4c\u5170\u6d69\u7279\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WYXHFKRCC":"\u6e2d\u6e90\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WSQRCC":"\u4e4c\u5ba1\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WJXCGRCC":"\u65e0\u6781\u53bf\u57ce\u5173\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","WXLSZRCC":"\u7ef4\u897f\u5088\u50f3\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WLRXCZYH":"\u6df1\u5733\u5b9d\u5b89\u6842\u94f6\u6751\u9547\u94f6\u884c","WRXHXRCC":"\u4e07\u8363\u53bf\u6c49\u859b\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","BSCNCJCZYH":"\u4e07\u5dde\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","WXZJXRCC":"\u6e29\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LCHNSCZYH":"\u6b66\u6c49\u4e1c\u897f\u6e56\u626c\u5b50\u6751\u9547\u94f6\u884c","LBRCU":"\u7075\u5b9d\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LQZYFDCZYH":"\u6587\u660c\u5927\u4f17\u6751\u9547\u94f6\u884c","LZXJCCZYH":"\u6587\u5c71\u5e7f\u5357\u957f\u6c5f\u6751\u9547\u94f6\u884c","LJYSCJCZYH":"\u95fb\u559c\u53bf\u664b\u878d\u6751\u9547\u94f6\u884c","GZWARCB":"\u74ee\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","SYKPFYCZYH":"\u4e4c\u6d77\u5e02\u6d77\u52c3\u6e7e\u9ec4\u6cb3\u6751\u9547\u94f6\u884c","DZDLDYCZYH":"\u4e4c\u6d77\u5e02\u4e4c\u62c9\u7279\u6751\u9547\u94f6\u884c","AHHNCZYH":"\u65e0\u68e3\u4e2d\u6210\u6751\u9547\u94f6\u884c","AXXESSRCC":"\u5b89\u6eaa\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DFSRCC":"\u4e1c\u65b9\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WASRCC":"\u6b66\u5b89\u5e02\u519c\u6751\u4fe1\u7528\u8054\u793e","WXXSB":"\u65e0\u9521\u9521\u5546\u94f6\u884c","WGBSCZYH":"\u6e56\u5357\u82b7\u6c5f\u6e58\u6c5f\u6751\u9547\u94f6\u884c","QDZSJYCZYH":"\u6b66\u80dc\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","WWRCB":"\u6b66\u5a01\u519c\u6751\u5546\u4e1a\u94f6\u884c","WXIWJRCC":"\u5a01\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WYMWTLSCZYH":"\u4e94\u53f0\u83b1\u5546\u6751\u9547\u94f6\u884c","WLRXCB":"\u6b66\u9686\u878d\u5174\u6751\u9547\u94f6\u884c","WHSRCC":"\u536b\u8f89\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WNSHZQRCC":"\u6e2d\u5357\u5e02\u534e\u5dde\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","TZJYXZCZYH":"\u6587\u5c71\u6c11\u4e30\u6751\u9547\u94f6\u884c","YCTSCZYH":"\u6c76\u4e0a\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","CSSXJJXCGCZYH":"\u74ee\u5b89\u5bcc\u6c11\u6751\u9547\u94f6\u884c","AHYASPCZYH":"\u4e4c\u62c9\u7279\u4e2d\u65d7\u8499\u94f6\u6751\u9547\u94f6\u884c","WLCBRCC":"\u4e4c\u5170\u5bdf\u5e03\u519c\u6751\u5546\u4e1a\u94f6\u884c","WPXRCC":"\u6b66\u5e73\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WDLCRCC":"\u9ed1\u9f99\u6c5f\u4e94\u5927\u8fde\u6c60\u519c\u6751\u5546\u4e1a\u94f6\u884c","SWCTHCZYH":"\u84ec\u83b1\u6c11\u751f\u6751\u9547\u94f6\u884c","WCXZRORCC":"\u6b66\u5ddd\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WEBANK":"\u5fae\u4f17\u94f6\u884c","WLTZQRCC":"\u4e4c\u62c9\u7279\u4e2d\u65d7\u519c\u4fe1\u793e","WWHYCZYH":"\u65e0\u4e3a\u5fbd\u94f6\u6751\u9547\u94f6\u884c","WSXIVMRCC":"\u4e4c\u4ec0\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LZQSQRCC":"\u6b66\u5a01\u5e02\u51c9\u5dde\u533a\u4e0a\u6cc9\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","WXXZDCZYH":"\u6b66\u4e61\u53bf\u6cfd\u90fd\u6751\u9547\u94f6\u884c","WLDXJYCZYH":"\u5c09\u7281\u8fbe\u897f\u5180\u94f6\u6751\u9547\u94f6\u884c","WFSKWQZCCZYH":"\u5434\u6c5f\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","WRXNZRCC":"\u4e07\u8363\u53bf\u5357\u5f20\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","WDXNCRCC":"\u671b\u90fd\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","WHYZRCC":"\u829c\u6e56\u626c\u5b50\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDZPQLCZYH":"\u829c\u6e56\u5706\u878d\u6751\u9547\u94f6\u884c","W\u7a74ZYFDCB":"\u6b66\u7a74\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","WXCHDFXHSCZYH":"\u90af\u90f8\u80a5\u4e61\u6052\u5347\u6751\u9547\u94f6\u884c","MXTLCZYH":"\u9655\u897f\u7709\u53bf\u6cf0\u9686\u6751\u9547\u94f6\u884c","WLZYFDCZYH":"\u6b66\u5937\u5c71\u672c\u5bcc\u6751\u9547\u94f6\u884c","WDLCHFCB":"\u4e94\u5927\u8fde\u6c60\u60e0\u4e30\u6751\u9547\u94f6\u884c","WNXRCC":"\u5a01\u5b81\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WACZYH":"\u6b66\u5b89\u6751\u9547\u94f6\u884c","WQRXCB":"\u5434\u6865\u878d\u4fe1\u6751\u9547\u94f6\u884c","BYNESLHHHCZYH":"\u6b66\u5b9a\u5174\u798f\u6751\u9547\u94f6\u884c","FORTIS":"\u6bd4\u5229\u65f6\u5bcc\u901a\u94f6\u884c","LTCNSCZYH":"\u4e3d\u6c5f\u7389\u9f99\u957f\u6c5f\u6751\u9547\u94f6\u884c","FCGFCGMCZYH":"\u6b66\u9091\u90a2\u519c\u5546\u6751\u9547\u94f6\u884c","HBXACJCZYH":"\u4e94\u539f\u8499\u94f6\u6751\u9547\u94f6\u884c","WCZYFDCB":"\u52a1\u5ddd\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","WHJSRCC":"\u829c\u6e56\u6d25\u76db\u519c\u6751\u5546\u4e1a\u94f6\u884c","WNTLNCZYH":"\u6df1\u5733\u9f99\u534e\u65b0\u534e\u6751\u9547\u94f6\u884c","TJBHHMCZYH":"\u5929\u6d25\u6ee8\u6d77\u60e0\u6c11\u6751\u9547\u94f6\u884c","TRCB":"\u5929\u6d25\u519c\u5546\u94f6\u884c","CFSYBSYLCZYH":"\u671b\u6c5f\u65b0\u534e\u6751\u9547\u94f6\u884c","WNTQRCC":"\u7fc1\u725b\u7279\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WYYCCZYH":"\u821e\u9633\u7389\u5ddd\u6751\u9547\u94f6\u884c","WHTSCZYH":"\u829c\u6e56\u6cf0\u5bff\u6751\u9547\u94f6\u884c(\u5df2\u5e9f\u5f03)","WHJXMSCB":"\u6b66\u6c49\u6c5f\u590f\u6c11\u751f\u6751\u9547\u94f6\u884c","WYXOQMRCC":"\u5a01\u8fdc\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WRXLWRCC":"\u4e07\u8363\u53bf\u91cc\u671b\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","WSXJQMRCC":"\u6e29\u5bbf\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WLXRCC":"\u4e4c\u5170\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","WXXPEQRCC":"\u6b66\u5ba3\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WQXFLRRCC":"\u6e29\u6cc9\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WFJGCZYH":"\u4e94\u5cf0\u91d1\u8c37\u6751\u9547\u94f6\u884c","WSMGCJCB":"\u6587\u5c71\u9a6c\u5173\u957f\u6c5f\u6751\u9547\u94f6\u884c","WYXKUORCC":"\u6b66\u9091\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","WHXRCC":"\u4e94\u534e\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WFRCC":"\u6f4d\u574a\u519c\u6751\u5546\u4e1a\u94f6\u884c","WFRCB":"\u6f4d\u574a\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","ZNZYFDCZYH":"\u897f\u5b89\u9ad8\u9675\u9633\u5149\u6751\u9547\u94f6\u884c","ZJAJJYCZYH":"\u4e94\u5e38\u60e0\u6c11\u6751\u9547\u94f6\u884c","XCJXCZYH":"\u897f\u660c\u91d1\u4fe1\u6751\u9547\u94f6\u884c","XGLLXRCC":"\u9999\u683c\u91cc\u62c9\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XPCFCB":"\u897f\u5e73\u8d22\u5bcc\u6751\u9547\u94f6\u884c","XACARCC":"\u897f\u5b89\u5e02\u957f\u5b89\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","XACAZWRCC":"\u897f\u5b89\u5e02\u957f\u5b89\u533a\u5b50\u5348\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","WFSWCQBHCZYH":"\u897f\u4e30\u9e7f\u57ce\u6751\u9547\u94f6\u884c","WLXCKRCC":"\u4e4c\u5170\u53bf\u8336\u5361\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","WSBHCZYH":"\u6b66\u965f\u5c04\u9633\u6751\u9547\u94f6\u884c","WQJYCZYH":"\u6b66\u5f3a\u5bb6\u94f6\u6751\u9547\u94f6\u884c","URMQCCB":"\u4e4c\u9c81\u6728\u9f50\u94f6\u884c","WYXDSZRCC":"\u821e\u9633\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WHHMCZYH":"\u4e94\u534e\u60e0\u6c11\u6751\u9547\u94f6\u884c","WZSSRCC":"\u4e94\u6307\u5c71\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XCXXAYRCC":"\u897f\u7574\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SZSSDWKSYCZYH":"\u6d60\u6c34\u695a\u519c\u5546\u6751\u9547\u94f6\u884c","SRCB":"\u6df1\u5733\u519c\u6751\u5546\u4e1a\u94f6\u884c","TLSRCC":"\u94c1\u529b\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WZMSBANK":"\u6e29\u5dde\u6c11\u5546\u94f6\u884c","WSRCB":"\u6587\u6c34\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WHRCB":"\u6b66\u6c49\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZCZYFDCZYH":"\u4e60\u6c34\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","ZXLLPRCC":"\u96b0\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","AHCHYZCZYH":"\u971e\u6d66\u523a\u6850\u7ea2\u6751\u9547\u94f6\u884c","XCXYMMRCC":"\u4e61\u57ce\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XACADDRCC":"\u897f\u5b89\u5e02\u957f\u5b89\u533a\u4e1c\u5927\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","ZXCNSCZYH":"\u897f\u53cc\u7248\u7eb3\u52d0\u6d77\u957f\u6c5f\u6751\u9547\u94f6\u884c","SHJSHMCZYH":"\u6e58\u4e61\u5e02\u6751\u9547\u94f6\u884c","XYRCB":"\u7965\u4e91\u519c\u4fe1\u793e","JSZJLHCZYH":"\u54cd\u6c34\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","XJALTRCC":"\u65b0\u7586\u963f\u52d2\u6cf0\u519c\u6751\u5546\u4e1a\u94f6\u884c","XYRCU":"\u65b0\u91ce\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XYXUCORCC":"\u5174\u4e1a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XLHTRCC":"\u9521\u6797\u6d69\u7279\u519c\u6751\u5408\u4f5c\u94f6\u884c","XJKELRCB":"\u65b0\u7586\u5e93\u5c14\u52d2\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","XJWSRCC":"\u65b0\u7586\u4e4c\u82cf\u519c\u6751\u5546\u4e1a\u94f6\u884c","XZPCRCB":"\u5f90\u5dde\u5f6d\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","XJBLRCC":"\u65b0\u7586\u535a\u4e50\u519c\u6751\u5546\u4e1a\u94f6\u884c","XJYLRCC":"\u65b0\u7586\u4f0a\u7281\u519c\u6751\u5546\u4e1a\u94f6\u884c","XZBANK":"\u897f\u85cf\u94f6\u884c","XYKMJCGCB":"\u65b0\u4f59\u5b54\u76ee\u6c5f\u6210\u529f\u6751\u9547\u94f6\u884c","XACAYZRCC":"\u897f\u5b89\u5e02\u957f\u5b89\u533a\u5f15\u9547\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","XSGMCZYH":"\u732e\u53bf\u878d\u548c\u6751\u9547\u94f6\u884c","XZXBZRCC":"\u65b0\u7edb\u53bf\u5317\u5f20\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","XJQTRCC":"\u65b0\u7586\u5947\u53f0\u519c\u6751\u5546\u4e1a\u94f6\u884c","XACAMDRCC":"\u897f\u5b89\u5e02\u957f\u5b89\u533a\u9e23\u728a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","QLXACZYH":"\u96b0\u53bf\u65b0\u7530\u6751\u9547\u94f6\u884c","XACACQRCC":"\u897f\u5b89\u5e02\u957f\u5b89\u533a\u57ce\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","XCZYFDCB":"\u9879\u57ce\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","XCDLMTCZYH":"\u8c61\u5c71\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","XACADQRCC":"\u897f\u5b89\u5e02\u957f\u5b89\u533a\u675c\u66f2\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","ZZMYCZYH":"\u5b5d\u660c\u672c\u5bcc\u6751\u9547\u94f6\u884c","MBOXGZYFDCZYH":"\u65b0\u5e72\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","XZXLQRCC":"\u65b0\u7edb\u53bf\u67f3\u6cc9\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","XACADMRCC":"\u897f\u5b89\u5e02\u957f\u5b89\u533a\u6597\u95e8\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","XHXZGERCC":"\u65b0\u6cb3\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XZXNSRCC":"\u65b0\u7edb\u53bf\u5357\u793e\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","XJRCU":"\u65b0\u7586\u519c\u6751\u4fe1\u7528\u793e","XYZJCB":"\u4fe1\u9633\u73e0\u6c5f\u6751\u9547\u94f6\u884c","HHHTSSHMYCZYH":"\u5174\u4ec1\u632f\u5174\u6751\u9547\u94f6\u884c","HBHCNYCZYH":"\u897f\u5b89\u96c1\u5854\u6052\u901a\u6751\u9547\u94f6\u884c","XJXRCC":"\u5c0f\u91d1\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","XJJXCGCB":"\u65b0\u7586\u5efa\u65b0\u6210\u529f\u6751\u9547\u94f6\u884c","XZXQZRCC":"\u65b0\u7edb\u53bf\u6cc9\u638c\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","XXXXTCZYH":"\u65b0\u7edb\u53bf\u65b0\u7530\u6751\u9547\u94f6\u884c","XZXYWRCC":"\u65b0\u7edb\u53bf\u9633\u738b\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","DXGMCZYH":"\u8398\u53bf\u9752\u9686\u6751\u9547\u94f6\u884c","XCYH":"\u8bb8\u660c\u94f6\u884c","XCXPCZYH":"\u8bb8\u660c\u65b0\u6d66\u6751\u9547\u94f6\u884c","XACAWQSEQRCC":"\u897f\u5b89\u5e02\u957f\u5b89\u533a\u97e6\u66f2\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","XYSHQRCC":"\u4fe1\u9633\u5e02\u6d49\u6cb3\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XZXLXRCC":"\u65b0\u7edb\u53bf\u9f99\u5174\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","DBS":"\u661f\u5c55\u94f6\u884c\uff08\u56fd\u9645\uff09","XJKSRCC":"\u65b0\u7586\u5580\u4ec0\u519c\u6751\u5546\u4e1a\u94f6\u884c","XXHZCZYH":"\u5174\u53bf\u6c47\u6cfd\u6751\u9547\u94f6\u884c","XZXZZRCC":"\u65b0\u7edb\u53bf\u6cfd\u638c\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","XACAJYRCC":"\u897f\u5b89\u5e02\u957f\u5b89\u533a\u7eaa\u9633\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","XZXCGRCC":"\u65b0\u7edb\u53bf\u57ce\u5173\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","XFXBNXRCC":"\u606f\u70fd\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XZXDTRCC":"\u65b0\u7edb\u53bf\u5e97\u5934\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","XXCXCB":"\u6e58\u897f\u957f\u884c\u6751\u9547\u94f6\u884c","XZXHQRCC":"\u65b0\u7edb\u53bf\u6a2a\u6865\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","XHXFVYRCC":"\u65b0\u548c\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XNNSYHRCC":"\u897f\u5b81\u519c\u5546\u94f6\u884c","WDB":"\u897f\u5fb7\u610f\u5fd7\u94f6\u884c","XACATYGRCC":"\u897f\u5b89\u5e02\u957f\u5b89\u533a\u592a\u4e59\u5bab\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","JGSJYCZYH":"\u8f9b\u96c6\u9f50\u9c81\u6751\u9547\u94f6\u884c","GBDZCCZYH":"\u65b0\u6d25\u73e0\u6c5f\u6751\u9547\u94f6\u884c","LBFMCZYH":"\u65b0\u5bc6\u90d1\u94f6\u6751\u9547\u94f6\u884c","LBRF":"\u7075\u5b9d\u878d\u4e30\u6751\u9547\u94f6\u884c","XWBANK":"\u65b0\u7f51\u94f6\u884c","XACANYRCC":"\u897f\u5b89\u5e02\u957f\u5b89\u533a\u5185\u82d1\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","XHXVBORCC":"\u590f\u6cb3\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XHLQZJHRCC":"\u592a\u539f\u5e02\u674f\u82b1\u5cad\u533a\u4e2d\u6da7\u6cb3\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","XACAWMRCC":"\u897f\u5b89\u5e02\u957f\u5b89\u533a\u738b\u83bd\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","AHTLTYCZYH":"\u53a6\u95e8\u7fd4\u5b89\u6c11\u751f\u6751\u9547\u94f6\u884c","XJYNRCC":"\u65b0\u7586\u4f0a\u5b81\u519c\u6751\u5546\u4e1a\u94f6\u884c","XXSFQQRCC":"\u65b0\u4e61\u5e02\u51e4\u6cc9\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XZXSQRCC":"\u65b0\u7edb\u53bf\u4e09\u6cc9\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","XACALZRCC":"\u897f\u5b89\u5e02\u957f\u5b89\u533a\u6ee6\u9547\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","XYZYFDCZYH":"\u6e56\u5317\u8d64\u58c1\u957f\u6c5f\u6751\u9547\u94f6\u884c","GCZYFDCZYH":"\u5174\u5316\u82cf\u5357\u6751\u9547\u94f6\u884c","XNSRCC":"\u5174\u5b81\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XYNCRCC":"\u65b0\u4f59\u519c\u6751\u5546\u4e1a\u94f6\u884c","XZXRCC":"\u65b0\u7edb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u5408\u793e","XLUYCSNCKKP":"\u5c71\u897f\u7701\u8fd0\u57ce\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","SXCB":"\u7ecd\u5174\u94f6\u884c","XWSRCC":"\u5ba3\u5a01\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XPXRCC":"\u971e\u6d66\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XCDLMTCB":"\u897f\u85cf\u5806\u9f99\u6c11\u6cf0\u6751\u9547\u94f6\u884c","XJTCRCC":"\u65b0\u7586\u5854\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","XJSWRCC":"\u65b0\u7586\u6c99\u6e7e\u519c\u6751\u5546\u4e1a\u94f6\u884c","XACADZRCC":"\u897f\u5b89\u5e02\u957f\u5b89\u533a\u5927\u5146\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","XXBANK":"\u65b0\u4e61\u94f6\u884c","XYPQZYCZYH":"\u4fe1\u9633\u5e73\u6865\u4e2d\u539f\u6751\u9547\u94f6\u884c","XYWFCZYH":"\u65b0\u7586\u5e93\u5c14\u52d2\u5bcc\u6c11\u6751\u9547\u94f6\u884c","XJHTBRCC":"\u65b0\u7586\u547c\u56fe\u58c1\u519c\u6751\u5546\u4e1a\u94f6\u884c","XJBHRCC":"\u65b0\u7586\u535a\u6e56\u519c\u6751\u5546\u4e1a\u94f6\u884c","XIB":"\u53a6\u95e8\u56fd\u9645\u94f6\u884c","BOSH":"\u65b0\u97e9\u94f6\u884c","XJCJRCC":"\u65b0\u7586\u660c\u5409\u519c\u6751\u5546\u4e1a\u94f6\u884c","XJB":"\u65b0\u7586\u94f6\u884c","HNCMCJCZYH":"\u590f\u53bf\u6cb3\u4e1c\u6751\u9547\u94f6\u884c","XLXSUPRCC":"\u65b0\u9f99\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XJWLRCC":"\u65b0\u7586\u5c09\u7281\u519c\u6751\u5546\u4e1a\u94f6\u884c","XZXGJRCC":"\u65b0\u7edb\u53bf\u53e4\u4ea4\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","XXRCC":"\u96c4\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XZXWARCC":"\u65b0\u7edb\u53bf\u4e07\u5b89\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","XCWDRCB":"\u8bb8\u660c\u9b4f\u90fd\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","XACAWTRCC":"\u897f\u5b89\u5e02\u957f\u5b89\u533a\u4e94\u53f0\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","XJHDCZYH":"\u5ce1\u6c5f\u6d2a\u90fd\u6751\u9547\u94f6\u884c","XACAWQCKRRCC":"\u897f\u5b89\u5e02\u957f\u5b89\u533a\u738b\u66f2\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","BOHUIHE":"\u65b0\u7586\u6c47\u548c\u94f6\u884c","XBMZSSCCC":"\u65b0\u5bbe\u6ee1\u65cf\u81ea\u6cbb\u53bf\u82cf\u6c34\u57ce\u5e02\u4fe1\u7528\u5408\u4f5c\u793e","XSBNZLCJCZYH":"\u9ed1\u9f99\u6c5f\u8087\u4e1c\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","XYXKYBRCC":"\u4ed9\u6e38\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DFFMCZYH":"\u65b0\u4f59\u6e1d\u6c34\u6e58\u6dee\u6751\u9547\u94f6\u884c","DLPLDHFCZYH":"\u65b0\u90fd\u6842\u57ce\u6751\u9547\u94f6\u884c","CIBJN":"\u5174\u4e1a\u94f6\u884c\u6d4e\u5357\u5206\u884c","XLBANK":"\u5c0f\u6984\u94f6\u884c","XYXUXIRCC":"\u590f\u9091\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XABANK":"\u897f\u5b89\u94f6\u884c","XAMKEQBSCB":"\u5174\u5b89\u76df\u79d1\u5c14\u6c81\u5305\u5546\u6751\u9547\u94f6\u884c","FXNSCZYH":"\u5174\u4e49\u4e07\u4e30\u6751\u9547\u94f6\u884c","FSSSSQRCC":"\u4f5b\u5c71\u5e02\u4e09\u6c34\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CCKCRHCZYH":"\u6e56\u5357\u6843\u6c5f\u5efa\u4fe1\u6751\u9547\u94f6\u884c","JLBANK":"\u5409\u6797\u94f6\u884c","JXNCRCC":"\u6c5f\u897f\u5357\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","KMPLXFCZYH":"\u6606\u660e\u76d8\u9f99\u5174\u798f\u6751\u9547\u94f6\u884c","LSLZRCC":"\u9675\u6c34\u9ece\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJZYLHCZYH":"\u4fee\u6587\u6c5f\u6d77\u6751\u9547\u94f6\u884c","XSJYCB":"\u4fee\u6c34\u4e5d\u94f6\u6751\u9547\u94f6\u884c","XZHHRCB":"\u5f90\u5dde\u6dee\u6d77\u519c\u6751\u5546\u4e1a\u94f6\u884c","XCXMEZRCC":"\u5ffb\u57ce\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XFXEDDRCC":"\u65b0\u4e30\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XYXTVVRCC":"\u65b0\u6e90\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","QAHMCZYH":"\u5bfb\u7538\u4e2d\u6210\u6751\u9547\u94f6\u884c","QXHMCZYH":"\u5854\u57ce\u6606\u4ed1\u6751\u9547\u94f6\u884c","XHSLZRCC":"\u5faa\u5316\u6492\u62c9\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XHXUKKRCC":"\u897f\u534e\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XTRCB":"\u6e58\u6f6d\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","XJSHZRCC":"\u65b0\u7586\u77f3\u6cb3\u5b50\u519c\u6751\u5408\u4f5c\u94f6\u884c","XACAGDRCC":"\u897f\u5b89\u5e02\u957f\u5b89\u533a\u90ed\u675c\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","XJTSRCC":"\u65b0\u7586\u5929\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","XYBANK":"\u4fe1\u9633\u94f6\u884c","XCWNRCC":"\u5ba3\u57ce\u7696\u5357\u519c\u6751\u5546\u4e1a\u94f6\u884c","XFBSQLCZYH":"\u606f\u70fd\u5305\u5546\u9ed4\u9686\u6751\u9547\u94f6\u884c","XGXCQRCC":"\u65b0\u5e72\u53bf\u57ce\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","XMBANK":"\u53a6\u95e8\u94f6\u884c","ACB":"\u65b0\u8054\u5546\u4e1a\u94f6\u884c","XYXCOVRCC":"\u6614\u9633\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XXXRCC":"\u65b0\u4e61\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XWXROFRCC":"\u4fee\u6587\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XYSMGRCC":"\u4fe1\u9633\u5e02\u660e\u6e2f\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XFXXFZRCC":"\u897f\u4e30\u53bf\u897f\u4e30\u9547\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","XLSRCC":"\u65b0\u4e50\u5e02\u519c\u6751\u4fe1\u7528\u8054\u793e","XYRHCZYH":"\u8944\u57a3\u53bf\u878d\u6c47\u6751\u9547\u94f6\u884c","XARXCB":"\u65b0\u5b89\u878d\u5174\u6751\u9547\u94f6\u884c","XFXWDCZYH":"\u8944\u6c7e\u53bf\u4e07\u90fd\u6751\u9547\u94f6\u884c","LAHDCZYH":"\u65b0\u7586\u77f3\u6cb3\u5b50\u4ea4\u94f6\u6751\u9547\u94f6\u884c","GYSGSCZYH":"\u5174\u57ce\u957f\u5174\u6751\u9547\u94f6\u884c","DBSCN":"\u661f\u5c55\u94f6\u884c","XZTSRCB":"\u5f90\u5dde\u94dc\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","XHCZYH":"\u65b0\u534e\u6751\u9547\u94f6\u884c","XJCB":"\u65b0\u7586\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","XPSRCC":"\u5174\u5e73\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XCXMFLRCC":"\u897f\u5145\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","XYPQRCB":"\u4fe1\u9633\u5e02\u5e73\u6865\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XMXRCC":"\u897f\u76df\u53bf\u519c\u6751\u4fe1\u7528\u793e","ZQLPAXCZYH":"\u5174\u5e73\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","DHSJSCZYH":"\u5ba3\u6c49\u8bda\u6c11\u6751\u9547\u94f6\u884c","KLDNCZYH":"\u65ec\u9091\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","JXNOZRCC":"\u6d5a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JTFJCPQXCCM":"\u592a\u539f\u5e02\u5c16\u8349\u576a\u533a\u5411\u9633\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","OWLXTXXNSCZYH":"\u90a2\u53f0\u53bf\u90a2\u519c\u5546\u6751\u9547\u94f6\u884c","XWXLELRCC":"\u5f90\u95fb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XZNCRCB":"\u5f90\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","XJWLMQRCC":"\u65b0\u7586\u4e4c\u9c81\u6728\u9f50\u519c\u6751\u5546\u4e1a\u94f6\u884c","XCHRBANK":"\u8944\u57ce\u6c47\u6d66\u6751\u9547\u94f6\u884c","SXQLCZYH":"\u5ba3\u5316\u4e2d\u6210\u6751\u9547\u94f6\u884c","SBNPP":"\u4e0a\u6d77—\u5df4\u9ece\u56fd\u9645\u94f6\u884c","XHXLSRCC":"\u5faa\u5316\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u793e","XLXMOWRCC":"\u5174\u9686\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CONCORD":"\u534f\u548c\u94f6\u884c","XCNCRCC":"\u8bb8\u660c\u519c\u6751\u5546\u4e1a\u94f6\u884c","XACAXLRCC":"\u897f\u5b89\u5e02\u957f\u5b89\u533a\u7ec6\u67f3\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","XJZJCZYH":"\u8d64\u5cf0\u5e02\u7ea2\u5c71\u7389\u9f99\u6751\u9547\u94f6\u884c","BQRXCZYH":"\u5b9a\u9676\u6cb3\u6d77\u6751\u9547\u94f6\u884c","QHHZSJCZYH":"\u6e5f\u4e2d\u4e09\u6c5f\u6751\u9547\u94f6\u884c","HBLXRCB":"\u6cb3\u5317\u4e34\u897f\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","LCLXHNSCZYH":"\u5b81\u6ce2\u5317\u4ed1\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","XFXSBERCC":"\u897f\u4e30\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","XACASDRCC":"\u897f\u5b89\u5e02\u957f\u5b89\u533a\u7533\u5e97\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","IKUNCXYHOBK":"\u65b0\u91ce\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","JSFXMFCZYH":"\u6d5a\u53bf\u90d1\u94f6\u6751\u9547\u94f6\u884c","YGXXDCZYH":"\u9633\u9ad8\u53bf\u5174\u90fd\u6751\u9547\u94f6\u884c","YAYCHMCB":"\u96c5\u5b89\u96e8\u57ce\u60e0\u6c11\u6751\u9547\u94f6\u884c","ZXDSCZYH":"\u70df\u53f0\u798f\u5c71\u73e0\u6c5f\u6751\u9547\u94f6\u884c","ZJDQHSCZYH":"\u5927\u7406\u53e4\u57ce\u4e2d\u6210\u6751\u9547\u94f6\u884c","GZHSNCB":"\u8d35\u5dde\u60e0\u6c34\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HUADBANK":"\u6866\u7538\u60e0\u6c11\u94f6\u884c","JCXGEWRCC":"\u91d1\u5ddd\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","ZFXZCZYH":"\u897f\u4e4c\u73e0\u7a46\u6c81\u5305\u5546\u60e0\u4e30\u6751\u9547\u94f6\u884c","ZQBZCZCZYH":"\u4e0a\u6d77\u5b9d\u5c71\u626c\u5b50\u6751\u9547\u94f6\u884c","ZJXZDSCZYH":"\u65b0\u7586\u77f3\u6cb3\u5b50\u5e02\u4ea4\u94f6\u6751\u9547\u94f6\u884c","KYFMCZYH":"\u65b0\u90d1\u90d1\u94f6\u6751\u9547\u94f6\u884c","JSGNMFCZYH":"\u5174\u548c\u5305\u5546\u6751\u9547\u94f6\u884c","XJKELFMCZYH":"\u5174\u5c71\u672c\u5bcc\u6751\u9547\u94f6\u884c","XHXINPRCC":"\u5174\u548c\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XTXRCC":"\u884c\u5510\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","HNYYXJCZYH":"\u76d0\u57ce\u6ee8\u6d77\u5174\u798f\u6751\u9547\u94f6\u884c","PCZCCZYH":"\u9633\u8c37\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","EEDSSDSMYCZYH":"\u9633\u6c5f\u9633\u6625\u957f\u6c5f\u6751\u9547\u94f6\u884c","JSFMCZYH":"\u9633\u66f2\u53bf\u6c47\u6c11\u6751\u9547\u94f6\u884c","FMPFCZYH":"\u9633\u65b0\u6c49\u94f6\u6751\u9547\u94f6\u884c","YZHFCB":"\u626c\u4e2d\u6052\u4e30\u6751\u9547\u94f6\u884c","YCXSHCZYH":"\u9633\u57ce\u53bf\u4e09\u79be\u6751\u9547\u94f6\u884c","YZNSH":"\u626c\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","YKHCCZYH":"\u884c\u5510\u5229\u4e30\u6751\u9547\u94f6\u884c","YZYZRCC":"\u6f3e\u6fde\u5f5d\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DLGJZPFCZYH":"\u4f0a\u5ddd\u9f50\u9c81\u6751\u9547\u94f6\u884c","RYXFCZYH":"\u4f0a\u901a\u6986\u94f6\u6751\u9547\u94f6\u884c","NXRCB":"\u5b9c\u5bbe\u5357\u6eaa\u519c\u6751\u5546\u4e1a\u94f6\u884c","LZHNSCZYH":"\u5b9c\u660c\u5937\u9675\u5174\u798f\u6751\u9547\u94f6\u884c","YLXUFVRCC":"\u5f5d\u826f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YSXTNQRCC":"\u9633\u5c71\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YARCB":"\u96c5\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","YCNCJVPRCC":"\u5b9c\u6625\u519c\u6751\u5546\u4e1a\u94f6\u884c","YWXRCC":"\u4f0a\u543e\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HNNXXJCZYH":"\u6c82\u6c34\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","JCXFCZYH":"\u6c82\u6e90\u535a\u5546\u6751\u9547\u94f6\u884c","JJGSSQNCNJX":"\u53cc\u9e2d\u5c71\u5e02\u5e02\u533a\u519c\u6751\u4fe1\u7528\u8054\u793e","HKYSZCFCZYH":"\u7ee5\u4e2d\u957f\u4e30\u6751\u9547\u94f6\u884c","GYYYFMCZYH":"\u5b9c\u5dde\u6df1\u901a\u6751\u9547\u94f6\u884c","BANCAINTESA":"\u610f\u5927\u5229\u8054\u5408\u5546\u4e1a\u94f6\u884c","DJKCNSCZYH":"\u5e94\u57ce\u878d\u5174\u6751\u9547\u94f6\u884c","YTXOMRRCC":"\u4e8e\u7530\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","YCXZOFRCC":"\u6c38\u6625\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YJXBZIRCC":"\u5143\u6c5f\u54c8\u5c3c\u65cf\u5f5d\u65cf\u50a3\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YTYYCZYH":"\u5b89\u5fbd\u5bff\u53bf\u8054\u5408\u6751\u9547\u94f6\u884c","BBNCRCC":"\u868c\u57e0\u519c\u6751\u5546\u4e1a\u94f6\u884c","FFPFCZYH":"\u8d35\u9633\u5357\u660e\u5bcc\u6c11\u6751\u9547\u94f6\u884c","CCJYYYCZYH":"\u6e56\u5357\u6c49\u5bff\u661f\u9f99\u6751\u9547\u94f6\u884c","YFXRCC":"\u6c38\u4e30\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YNXBQWRCC":"\u6c38\u5b81\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JJGQCZYH":"\u539f\u5e73\u5e02\u6c47\u6c11\u6751\u9547\u94f6\u884c","YNYLRGMRCC":"\u4e91\u5357\u7389\u9f99\u519c\u6751\u5546\u4e1a\u94f6\u884c","YJXJCCZYH":"\u6c38\u9756\u53bf\u91d1\u57ce\u6751\u9547\u94f6\u884c","ZCBSCZYH":"\u9633\u4fe1\u6cb3\u6d77\u6751\u9547\u94f6\u884c","YNYJBYCZYH":"\u6986\u4e2d\u6d66\u53d1\u6751\u9547\u94f6\u884c","WXNCRCC":"\u851a\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","YSXRCZYH":"\u5143\u6c0f\u4fe1\u878d\u6751\u9547\u94f6\u884c","RRCB":"\u4e91\u5357\u745e\u4e3d\u5357\u5c4f\u519c\u6751\u5546\u4e1a\u94f6\u884c","YNGNRCC":"\u4e91\u5357\u5e7f\u5357\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","YJXYGXRCC":"\u6c38\u9756\u53bf\u76d0\u9505\u5ce1\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","YFSYCQRCC":"\u4e91\u6d6e\u5e02\u4e91\u57ce\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YCXDZORCC":"\u5ef6\u957f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YANCRCC":"\u5ef6\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","CPRCB":"\u5b9c\u5bbe\u7fe0\u5c4f\u519c\u6751\u5546\u4e1a\u94f6\u884c","YJSHLQRCC":"\u9633\u6c5f\u5e02\u6d77\u9675\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NCBSCZYH":"\u4f9d\u5170\u60e0\u946b\u6751\u9547\u94f6\u884c","FJLJHXCZYH":"\u9c7c\u53f0\u9752\u9686\u6751\u9547\u94f6\u884c","YNWSRCB":"\u4e91\u5357\u5dcd\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","YNDYRCB":"\u4e91\u5357\u5927\u59da\u519c\u6751\u5546\u4e1a\u94f6\u884c","YQCCB":"\u9633\u6cc9\u5e02\u5546\u4e1a\u94f6\u884c","YXSJCQRCC":"\u7389\u6eaa\u5e02\u6c5f\u5ddd\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YQZYFDCZYH":"\u4f59\u5e86\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","YBSNXQRCC":"\u5b9c\u5bbe\u5e02\u5357\u6eaa\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YLGMCB":"\u4f0a\u7281\u56fd\u6c11\u6751\u9547\u94f6\u884c","YNJSRCC":"\u4e91\u5357\u5efa\u6c34\u519c\u6751\u5546\u4e1a\u94f6\u884c","YNDLSRCC":"\u4e91\u5357\u5927\u7406\u5e02\u519c\u6751\u5546\u4e1a\u94f6\u884c","YNJHRCC":"\u4e91\u5357\u666f\u6d2a\u519c\u6751\u5546\u4e1a\u94f6\u884c","YJXRPHRCC":"\u6c38\u9756\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YFSYAQRCC":"\u4e91\u6d6e\u5e02\u4e91\u5b89\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YTRCC":"\u70df\u53f0\u519c\u6751\u5546\u4e1a\u94f6\u884c","YTDSCB":"\u7389\u7530\u5927\u5546\u6751\u9547\u94f6\u884c","YXDRQRCC":"\u6d0b\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YSXJUCRCC":"\u781a\u5c71\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YTMZRCC":"\u4f0a\u901a\u6ee1\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YQXHDCZYH":"\u78d0\u77f3\u5409\u94f6\u6751\u9547\u94f6\u884c","SHFXPFCZYH":"\u5370\u6c5f\u957f\u5f81\u6751\u9547\u94f6\u884c","YHXRCC":"\u6c38\u548c\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YJSXRCC":"\u82f1\u5409\u6c99\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WXBHXFCZYH":"\u6c38\u6e05\u5409\u94f6\u6751\u9547\u94f6\u884c","YDRCB":"\u5c27\u90fd\u519c\u6751\u5546\u4e1a\u94f6\u884c","YCXASHRCC":"\u7ffc\u57ce\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YKXYCCC":"\u8425\u53e3\u7ecf\u6d4e\u6280\u672f\u5f00\u53d1\u533a\u718a\u5cb3\u57ce\u5e02\u4fe1\u7528\u5408\u4f5c\u793e","YNXZUKRCC":"\u6c38\u5e74\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","YXTRZRCC":"\u4e49\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YEYJCPQXXSD":"\u592a\u539f\u5e02\u5c16\u8349\u576a\u533a\u65b0\u57ce\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","ZXGTCZYH":"\u6986\u6811\u878d\u5174\u6751\u9547\u94f6\u884c","YNPESMRCC":"\u4e91\u5357\u666e\u6d31\u601d\u8305\u519c\u6751\u5546\u4e1a\u94f6\u884c","YNSDRCB":"\u4e91\u5357\u65bd\u7538\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","YYXFCZYH":"\u91cd\u5e86\u6c5f\u5317\u6052\u4e30\u6751\u9547\u94f6\u884c","HBMCRCC":"\u6e56\u5317\u9ebb\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","HZXHLCRCC":"\u548c\u653f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DQHRCZYH":"\u4e91\u5357\u897f\u5c71\u6e1d\u519c\u5546\u6751\u9547\u94f6\u884c","DZDCZYFDCZYH":"\u5efa\u660c\u6052\u660c\u6751\u9547\u94f6\u884c","SNXRCC":"\u5bff\u5b81\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YNYDRCC":"\u4e91\u5357\u5bfb\u7538\u519c\u6751\u5546\u4e1a\u94f6\u884c","YXRFCZYH":"\u4e91\u9704\u6da6\u53d1\u6751\u9547\u94f6\u884c","YASRCC":"\u6c38\u5b89\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YYXEMVRCC":"\u9633\u539f\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","YQSJQRCC":"\u9633\u6cc9\u5e02\u90ca\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YNXPRCC":"\u4e91\u5357\u65b0\u5e73\u519c\u6751\u5546\u4e1a\u94f6\u884c","YTQLCZYH":"\u4e39\u4e1c\u9f0e\u5b89\u6751\u9547\u94f6\u884c","YXXRXQRCC":"\u5c24\u6eaa\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YTHHDFXHSCZYH":"\u5357\u9756\u4e2d\u6210\u6751\u9547\u94f6\u884c","RTXRCC":"\u58e4\u5858\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YZCXCB":"\u5b9c\u7ae0\u957f\u884c\u6751\u9547\u94f6\u884c","YSXPKXRCC":"\u76d0\u5c71\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","YKYHCCB":"\u8425\u53e3\u6cbf\u6d77\u94f6\u884c","YDNSCZYH":"\u5c27\u90fd\u519c\u5546\u94f6\u884c\u6751\u9547\u94f6\u884c","YSXSLYRCC":"\u8425\u5c71\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","BOYK":"\u8425\u53e3\u94f6\u884c","YXNCRCC":"\u6613\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","ZQZSGYCZYH":"\u865e\u57ce\u901a\u5546\u6751\u9547\u94f6\u884c","YNHKRCC":"\u4e91\u5357\u6cb3\u53e3\u519c\u6751\u5546\u4e1a\u94f6\u884c","YJHRCZYH":"\u5ef6\u5409\u548c\u6da6\u6751\u9547\u94f6\u884c","YSLJYCZYH":"\u4f9d\u5b89\u6da6\u751f\u6751\u9547\u94f6\u884c","FYYDRCB":"\u988d\u4e1c\u519c\u5546\u94f6\u884c","YQXRCC":"\u6c38\u6e05\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","YYTJCB":"\u4f59\u59da\u901a\u6d4e\u6751\u9547\u94f6\u884c","YBCCB":"\u5b9c\u5bbe\u5e02\u5546\u4e1a\u94f6\u884c","HNNYTNSCZYH":"\u5b9c\u90fd\u6c11\u751f\u6751\u9547\u94f6\u884c","TJHMCZYH":"\u988d\u4e0a\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","JYPFCZYH":"\u6c38\u5bff\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","YZSRCC":"\u79b9\u5dde\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YCXSLJRCC":"\u5ef6\u5ddd\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","PLMSCZYH":"\u5cb3\u6c60\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","PBQCZGCMSCZYH":"\u6c60\u5dde\u8d35\u6c60\u6c11\u751f\u6751\u9547\u94f6\u884c","FSXNVTRCC":"\u629a\u987a\u53bf\u519c\u6751\u4fe1\u7528\u793e\u5408\u4f5c\u793e\u8054\u5408\u793e","HNLWRCB":"\u6e56\u5357\u4e34\u6b66\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","JLSLRCB":"\u5409\u6797\u8212\u5170\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXLCRCC":"\u6c5f\u897f\u9ece\u5ddd\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXAYNCORCC":"\u6c5f\u897f\u5b89\u4e49\u519c\u6751\u5546\u4e1a\u94f6\u884c","YXJMURCC":"\u4e91\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YANBRCB":"\u5ef6\u8fb9\u519c\u6751\u5546\u4e1a\u94f6\u884c","KSRSCZYH":"\u5043\u5e08\u878d\u5174\u6751\u9547\u94f6\u884c","YLYYMSCZYH":"\u6986\u6797\u6986\u9633\u6c11\u751f\u6751\u9547\u94f6\u884c","XJRZYDLSBL":"\u610f\u5723\u94f6\u884c","YJXFUURCC":"\u5370\u6c5f\u571f\u5bb6\u65cf\u82d7\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HHHTSSHJGCZYH":"\u6c38\u57ce\u9f50\u9c81\u6751\u9547\u94f6\u884c","YNYLUICRCC":"\u4e91\u5357\u4e91\u9f99\u519c\u6751\u5546\u4e1a\u94f6\u884c","YQJYCZYH":"\u8d35\u9633\u4e91\u5ca9\u5bcc\u6c11\u6751\u9547\u94f6\u884c","YNTHRCC":"\u4e91\u5357\u901a\u6d77\u519c\u6751\u5546\u4e1a\u94f6\u884c","YNSFRCC":"\u4e91\u5357\u6c34\u5bcc\u519c\u6751\u5546\u4e1a\u94f6\u884c","YXJDCZYH":"\u5e94\u53bf\u91d1\u90fd\u6751\u9547\u94f6\u884c","YJXCHSRCC":"\u76d0\u6d25\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YNYXHTRCC":"\u4e91\u5357\u7389\u6eaa\u7ea2\u5854\u519c\u6751\u5546\u4e1a\u94f6\u884c","YZCXCZYH":"\u5c71\u4e1c\u8bf8\u57ce\u5efa\u4fe1\u6751\u9547\u94f6\u884c","TLXEKTRCC":"\u94c1\u5cad\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","TMDYCZYH":"\u56fe\u4eec\u6566\u94f6\u6751\u9547\u94f6\u884c","XYFRCB":"\u4fe1\u6613\u4ed8","YNYJRCC":"\u4e91\u5357\u76c8\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","YNZLRCC":"\u4e91\u5357\u52d0\u814a\u519c\u6751\u5546\u4e1a\u94f6\u884c","YNEYRCC":"\u4e91\u5357\u6d31\u6e90\u519c\u6751\u5546\u4e1a\u94f6\u884c","YCXULYRCC":"\u865e\u57ce\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BJYQCZYH":"\u6cbf\u6cb3\u957f\u5f81\u6751\u9547\u94f6\u884c","YZBANK":"\u94f6\u5ea7\u6751\u9547\u94f6\u884c","XJRZYDLSBLSH":"\u610f\u5723\u4e0a\u5206","YTXCIHRCC":"\u76d0\u4ead\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","YBRCB":"\u5b9c\u5bbe\u519c\u6751\u5546\u4e1a\u94f6\u884c","YAXEQFRCC":"\u4f9d\u5b89\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","AHLZBFCZYH":"\u5b9c\u5174\u9633\u7fa1\u6751\u9547\u94f6\u884c","YXCCB":"\u4e91\u5357\u7ea2\u5854\u94f6\u884c","YMXRHARCC":"\u88d5\u6c11\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YWHXGZYFDCZYH":"\u5305\u5934\u5e02\u9ad8\u65b0\u94f6\u901a\u6751\u9547\u94f6\u884c","DTCBANK":"\u5927\u540c\u5e02\u5546\u4e1a\u94f6\u884c","SQZYFDCZYH":"\u8d35\u9633\u82b1\u6eaa\u5efa\u8bbe\u6751\u9547\u94f6\u884c","GZXYRCB":"\u8d35\u5dde\u5174\u4e49\u519c\u6751\u5546\u4e1a\u94f6\u884c","UBCHN":"\u6d77\u53e3\u8054\u5408\u519c\u5546\u94f6\u884c","PEMSCZYH":"\u6d77\u5357\u767d\u6c99\u957f\u6c5f\u6751\u9547\u94f6\u884c","HNQZCJCZYH":"\u6d77\u5357\u4e94\u6307\u5c71\u957f\u6c5f\u6751\u9547\u94f6\u884c","DZZYFDCZYH":"\u547c\u548c\u6d69\u7279\u5e02\u5982\u610f\u8499\u94f6\u6751\u9547\u94f6\u884c","HNLSRCB":"\u6e56\u5357\u84dd\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","MDJCJMDKRCC":"\u7261\u4e39\u6c5f\u5e02\u57ce\u90ca\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","MJMFCZYH":"\u5b89\u5fbd\u88d5\u5b89\u76db\u5e73\u6751\u9547\u94f6\u884c","HNMJRCC":"\u6cb3\u5357\u5b5f\u6d25\u519c\u6751\u5546\u4e1a\u94f6\u884c","WJZYFDCZYH":"\u56f4\u573a\u6ee1\u65cf\u8499\u53e4\u65cf\u81ea\u6cbb\u53bf\u534e\u5546\u6751\u9547\u94f6\u884c","JZSYCRXCZYH":"\u4e94\u83b2\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","YBF":"\u8c6b\u4e30\u6751\u9547\u94f6\u884c","YXZYCZYH":"\u592a\u8c37\u53bf\u5174\u6cf0\u6751\u9547\u94f6\u884c","XZSXFQXDCZYH":"\u5ffb\u5dde\u5e02\u5ffb\u5e9c\u533a\u79c0\u90fd\u6751\u9547\u94f6\u884c","SINO":"\u6c38\u4e30\u94f6\u884c","YNBCRCC":"\u4e91\u5357\u5bbe\u5ddd\u519c\u6751\u5546\u4e1a\u94f6\u884c","YJHLQKQRCC":"\u4f0a\u91d1\u970d\u6d1b\u65d7\u77ff\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YNFQRCC":"\u4e91\u5357\u51e4\u5e86\u519c\u6751\u5546\u4e1a\u94f6\u884c","YCCB":"\u5b9c\u660c\u5e02\u5546\u4e1a\u94f6\u884c","YKRSBANK":"\u8425\u53e3\u878d\u751f\u519c\u6751\u5546\u4e1a\u94f6\u884c","RXCB":"\u6986\u6b21\u878d\u4fe1\u6751\u9547\u94f6\u884c","YCNCSXSRCC":"\u4f0a\u6625\u519c\u6751\u5546\u4e1a\u94f6\u884c","YHTJZRCC":"\u6cbf\u6cb3\u571f\u5bb6\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YCZZSYCZYH":"\u909b\u5d03\u56fd\u6c11\u6751\u9547\u94f6\u884c","YZGLZCCB":"\u626c\u5dde\u5e7f\u9675\u4e2d\u6210\u6751\u9547\u94f6\u884c","YNMLRCC":"\u4e91\u5357\u5f25\u52d2\u519c\u6751\u5546\u4e1a\u94f6\u884c","YCRCB":"\u6c38\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","YNRCC":"\u4e91\u5357\u7701\u519c\u6751\u4fe1\u7528\u793e","YXXEZWRCC":"\u9633\u897f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YJXTDQRCC":"\u96c5\u6c5f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YJXADRRCC":"\u5b9c\u541b\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YCXAMURCC":"\u53f6\u57ce\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YLXSDHRCC":"\u5b9c\u826f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YSSQSCZYH":"\u59cb\u5174\u5927\u4f17\u6751\u9547\u94f6\u884c","YACCB":"\u96c5\u5b89\u5e02\u5546\u4e1a\u94f6\u884c","JSQDZJCZYH":"\u5156\u5dde\u4e2d\u6210\u6751\u9547\u94f6\u884c","WLCBSJNBSCZYH":"\u9e70\u6f6d\u6708\u6e56\u6052\u901a\u6751\u9547\u94f6\u884c","TJSJZCZYH":"\u6c38\u4e30\u6d2a\u90fd\u6751\u9547\u94f6\u884c","TYWBLHWRCC":"\u592a\u539f\u5e02\u4e07\u67cf\u6797\u533a\u540e\u738b\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","AQBHCZYH":"\u6f4d\u574a\u5e02\u5bd2\u4ead\u533a\u8499\u94f6\u6751\u9547\u94f6\u884c","YXHMCB":"\u76c2\u53bf\u6c47\u6c11\u6751\u9547\u94f6\u884c","WOORI":"\u53cb\u5229\u94f6\u884c","YZXMSCZYH":"\u79b9\u5dde\u65b0\u6c11\u751f\u6751\u9547\u94f6\u884c","YCSHCB":"\u9633\u57ce\u4e09\u79be\u6751\u9547\u94f6\u884c","HDHSQLCZYH":"\u6c85\u6c5f\u6d66\u53d1\u6751\u9547\u94f6\u884c","HNXNCBFWRCC":"\u534e\u5b81\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YNMZRCC":"\u4e91\u5357\u8499\u81ea\u519c\u6751\u5546\u4e1a\u94f6\u884c","YNCNRCC":"\u4e91\u5357\u660c\u5b81\u519c\u6751\u5546\u4e1a\u94f6\u884c","YXBANK":"\u610f\u5927\u5229\u88d5\u4fe1\u94f6\u884c","YYXNFJRCC":"\u5cb3\u9633\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YQRCB":"\u9633\u6cc9\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNXSXHCZYH":"\u4e91\u5357\u9e64\u5e86\u6e1d\u519c\u5546\u6751\u9547\u94f6\u884c","HJHQHTCZYH":"\u4f0a\u91d1\u970d\u6d1b\u91d1\u8c37\u6751\u9547\u94f6\u884c","HNDAXLCZYH":"\u96c4\u53bf\u4e30\u6e90\u6751\u9547\u94f6\u884c","DLEYCJCZYXNWP":"\u5b9c\u9ec4\u629a\u5546\u6751\u9547\u94f6\u884c","PLSHCZYH":"\u4e91\u5357\u77f3\u5c4f\u5317\u94f6\u6751\u9547\u94f6\u884c","YNWXRCB":"\u4e91\u5357\u5a01\u4fe1\u519c\u6751\u5546\u4e1a\u94f6\u884c","YMXATDRCC":"\u5143\u8c0b\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","YCJDCZYH":"\u79b9\u57ce\u80f6\u4e1c\u6751\u9547\u94f6\u884c","YXHTXHCB":"\u7389\u6eaa\u7ea2\u5854\u533a\u5174\u548c\u6751\u9547\u94f6\u884c","YNLCLXRCC":"\u4e91\u5357\u4e34\u6ca7\u4e34\u7fd4\u519c\u6751\u5546\u4e1a\u94f6\u884c","OCOZSXHDCZYH":"\u4e91\u5357\u9999\u683c\u91cc\u62c9\u6e1d\u519c\u5546\u6751\u9547\u94f6\u884c","YNXYRCC":"\u4e91\u5357\u7965\u4e91\u519c\u6751\u5546\u4e1a\u94f6\u884c","YNLLRCC":"\u4e91\u5357\u9646\u826f\u519c\u6751\u5546\u4e1a\u94f6\u884c","TYXYCZYH":"\u53f3\u7389\u53bf\u957f\u9752\u6751\u9547\u94f6\u884c","YSXZISRCC":"\u5143\u6c0f\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","ZPXPOSRCC":"\u6cfd\u666e\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJKSCJRCB":"\u5f20\u5bb6\u53e3\u5e02\u57ce\u90ca\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XJRZZYSYYH":"\u5f70\u94f6\u94f6\u884c","ZZYH":"\u67a3\u5e84\u94f6\u884c","ZXSBBWCZYH":"\u8012\u9633\u878d\u5174\u6751\u9547\u94f6\u884c","LHSRCC":"\u51cc\u6d77\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","PNCTHCZYH":"\u5c4f\u5357\u523a\u6850\u7ea2\u6751\u9547\u94f6\u884c","YGCB":"\u524d\u90ed\u53bf\u9633\u5149\u6751\u9547\u94f6\u884c","SJZZCGFGRCC":"\u77f3\u5bb6\u5e84\u5e02\u85c1\u57ce\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","UFJ":"\u4e09\u83f1\u65e5\u8054","ZNMSCZYH":"\u4e07\u8363\u53bf\u6c47\u6c11\u6751\u9547\u94f6\u884c","YNJDRCC":"\u4e91\u5357\u666f\u4e1c\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHHZTYCZYH":"\u4e91\u5357\u9a6c\u9f99\u5317\u94f6\u6751\u9547\u94f6\u884c","AHWYRCC":"\u5b89\u5fbd\u6da1\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","BDMCRCC":"\u4fdd\u5b9a\u5e02\u6ee1\u57ce\u533a\u519c\u6751\u4fe1\u7528\u8054\u793e","DNXRCC":"\u5927\u5b81\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JKXZAORCC":"\u4ea4\u53e3\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JXJGSRCC":"\u6c5f\u897f\u4e95\u5188\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","EWKBSCZYH":"\u6606\u660e\u963f\u62c9\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","SXJCRCC":"\u5c71\u897f\u4ea4\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","TLXXTZRCC":"\u94c1\u5cad\u53bf\u65b0\u53f0\u5b50\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","YNLCRCC":"\u4e91\u5357\u9647\u5ddd\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZXJWCRCC":"\u6f33\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJLJCJCZYH":"\u6e5b\u6c5f\u5ec9\u6c5f\u957f\u6c5f\u6751\u9547\u94f6\u884c","ZQNAZYFDCZYH":"\u5b9c\u9633\u5174\u798f\u6751\u9547\u94f6\u884c","ZJRAHSCZYH":"\u4e91\u5357\u65b0\u5e73\u5317\u94f6\u6751\u9547\u94f6\u884c","YNYSRCC":"\u4e91\u5357\u6c38\u80dc\u519c\u6751\u5546\u4e1a\u94f6\u884c","LTZYFDCZYH":"\u4e91\u5357\u5143\u6c5f\u5317\u94f6\u6751\u9547\u94f6\u884c","PYLHCZYH":"\u90e7\u53bf\u695a\u519c\u5546\u6751\u9547\u94f6\u884c","YXXVZIRCC":"\u4e91\u9704\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YNZTZYRCC":"\u4e91\u5357\u662d\u901a\u662d\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","YTXAHCRCC":"\u6c38\u6cf0\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YTBANK":"\u70df\u53f0\u94f6\u884c","YDSRCC":"\u82f1\u5fb7\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YPDZRCC":"\u7389\u5c4f\u4f97\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YLSQRCC":"\u7389\u6797\u5e02\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YXZYCB":"\u6c38\u4fee\u6d54\u94f6\u6751\u9547\u94f6\u884c","YAHMCZYH":"\u4e91\u5b89\u60e0\u6c11\u6751\u9547\u94f6\u884c","YCXQVRRCC":"\u5cb3\u6c60\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","ESUN":"\u7389\u5c71\u94f6\u884c","YTNCRCC":"\u9e70\u6f6d\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZCBHCB":"\u90d3\u57ce\u5317\u6d77\u6751\u9547\u94f6\u884c","JXFSCZYH":"\u67a3\u5f3a\u4e30\u6e90\u6751\u9547\u94f6\u884c","SCBHK":"\u6e23\u6253\u94f6\u884c\uff08\u9999\u6e2f\uff09","AHFTTSCZYH":"\u624e\u8d49\u7279\u8499\u94f6\u6751\u9547\u94f6\u884c","AGZCCZYH":"\u4f0a\u91d1\u970d\u6d1b\u516d\u83f1\u6751\u9547\u94f6\u884c","ZBXDCZYH":"\u5f20\u5317\u4fe1\u8fbe\u6751\u9547\u94f6\u884c","ZQQLCB":"\u7ae0\u4e18\u9f50\u9c81\u6751\u9547\u94f6\u884c","ZJSCKQRCC":"\u6e5b\u6c5f\u5e02\u8d64\u574e\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZXXFCZYH":"\u4f59\u5e72\u6052\u901a\u6751\u9547\u94f6\u884c","YNZMRCC":"\u4e91\u5357\u5d69\u660e\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJKXHJYCZYH":"\u5f20\u5bb6\u53e3\u5ba3\u5316\u5bb6\u94f6\u6751\u9547\u94f6\u884c","ZJKXHRCB":"\u5f20\u5bb6\u53e3\u5e02\u5ba3\u5316\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","QDJMHMCZYH":"\u6f33\u6d66\u6c11\u751f\u6751\u9547\u94f6\u884c","JXLHFMCZYH":"\u6a1f\u6811\u987a\u94f6\u6751\u9547\u94f6\u884c","JXLARCC":"\u6c5f\u897f\u4e50\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","FYCGRCC":"\u5c71\u897f\u7701\u6c7e\u9633\u5e02\u57ce\u5173\u519c\u6751\u4fe1\u7528\u793e","SNHCRCC":"\u5f20\u6396\u5e02\u8083\u5357\u53bf\u7687\u57ce\u4fe1\u7528\u793e","SWJZYLHCZYH":"\u5f0b\u9633\u84dd\u6d77\u6751\u9547\u94f6\u884c","SXRCU":"\u5c71\u897f\u7701\u519c\u6751\u4fe1\u7528\u793e","QDLXYTCZYH":"\u56db\u5ddd\u6c5f\u6cb9\u534e\u590f\u6751\u9547\u94f6\u884c","YDGJYH":"\u5370\u5ea6\u56fd\u5bb6\u94f6\u884c","YLFCZYH":"\u8365\u9633\u5229\u4e30\u6751\u9547\u94f6\u884c","YNANCZCZYH":"\u7389\u5c71\u4e09\u6e05\u5c71\u6751\u9547\u94f6\u884c","YBXYCZYH":"\u5b9c\u5bbe\u5174\u5b9c\u6751\u9547\u94f6\u884c","MZHNSCZYH":"\u7389\u6eaa\u6f84\u6c5f\u4e2d\u6210\u6751\u9547\u94f6\u884c","WXYTCZYH":"\u851a\u53bf\u94f6\u6cf0\u6751\u9547\u94f6\u884c","WRXXCRCC":"\u4e07\u8363\u53bf\u897f\u6751\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","FJYXCGCZYH":"\u4e91\u5357\u5b89\u5b81\u7a20\u5dde\u6751\u9547\u94f6\u884c","YNXSYNSCZYH":"\u957f\u767d\u6986\u94f6\u6751\u9547\u94f6\u884c","YYXQTARCC":"\u5143\u9633\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JKRFCZYH":"\u957f\u6625\u7ecf\u5f00\u878d\u4e30\u6751\u9547\u94f6\u884c","CCHRCZYH":"\u957f\u6625\u671d\u9633\u548c\u6da6\u6751\u9547\u94f6\u884c","GXHMVB":"\u957f\u6625\u9ad8\u65b0\u60e0\u6c11","CABANK":"\u957f\u5b89\u94f6\u884c","HFHTCZYH":"\u957f\u6625\u5bbd\u57ce\u878d\u6c47\u6751\u9547\u94f6\u884c","HNTYXHCZYH":"\u4e91\u5357\u5927\u7406\u6e1d\u519c\u5546\u6751\u9547\u94f6\u884c","YNYMRCC":"\u4e91\u5357\u6613\u95e8\u519c\u6751\u5546\u4e1a\u94f6\u884c","YNYXRCB":"\u4e91\u5357\u4e91\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","YNTCRCC":"\u4e91\u5357\u817e\u51b2\u519c\u6751\u5546\u4e1a\u94f6\u884c","YKHCCB":"\u8425\u53e3\u5b8f\u8bda\u6751\u9547\u94f6\u884c","YMXFCB":"\u5143\u8c0b\u5174\u798f\u6751\u9547\u94f6\u884c","RHCZBANK":"\u957f\u5b50\u53bf\u878d\u6c47\u6751\u9547\u94f6\u884c","CTXZZGRCC":"\u957f\u6cf0\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CZXTDCZYH":"\u957f\u6cbb\u53bf\u6cf0\u90fd\u6751\u9547\u94f6\u884c","CZZZRCC":"\u957f\u6cbb\u6f33\u6cfd\u519c\u6751\u5546\u4e1a\u94f6\u884c","CWZYFDCB":"\u957f\u6b66\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","CGXYYH":"\u957f\u845b\u8f69\u8f95\u6751\u9547\u94f6\u884c","CCBHKB":"CCB, Hong Kong Branch","DTBDRCC":"\u5927\u540c\u5317\u90fd\u519c\u6751\u5546\u4e1a\u94f6\u884c","JSRCU":"\u6c5f\u82cf\u7701\u519c\u6751\u4fe1\u7528\u793e\u8054\u5408\u793e","JANCRCC":"\u5409\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","KTGMCZYH":"\u4e34\u6b66\u6d66\u53d1\u6751\u9547\u94f6\u884c","CBMNSH":"\u957f\u767d\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","CTXEZURCC":"\u957f\u6c40\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BSLYHNSCZYH":"\u957f\u6625\u53cc\u9633\u5409\u94f6\u6751\u9547\u94f6\u884c","CEBHKB":"CEB, Hong Kong Branch","ZJHNDSCZYH":"\u5317\u4eac\u5927\u5174\u4e5d\u94f6\u6751\u9547\u94f6\u884c","CQBANK":"\u91cd\u5e86\u94f6\u884c","DBAG":"\u5fb7\u7d2f\u65af\u987f\u94f6\u884c","GDLPRCB":"\u5e7f\u4e1c\u8fde\u5e73\u519c\u6751\u5546\u4e1a\u94f6\u884c","NBHSPFCZYH":"\u4faf\u9a6c\u5e02\u592a\u884c\u6751\u9547\u94f6\u884c","HNHYHZRCC":"\u6e56\u5357\u8861\u9633\u8861\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","LPXGWZRCC":"\u6d1b\u6d66\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","LZYH":"\u5170\u5dde\u94f6\u884c","LPSNCB":"\u516d\u76d8\u6c34\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","URB":"\u8054\u5408\u6751\u9547\u94f6\u884c","MLHNSCZYH":"\u5f25\u52d2\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","MBB":"\u9a6c\u6765\u4e9a\u94f6\u884c","NJXFCZYH":"\u5ae9\u6c5f\u5e78\u798f\u6751\u9547\u94f6\u884c","CLXERQRCC":"\u957f\u5cad\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CCCB":"\u957f\u6625\u519c\u6751\u5546\u4e1a\u94f6\u884c","CZYSXHCZYH":"\u62dc\u6cc9\u878d\u5174\u6751\u9547\u94f6\u884c","CCQTGB":"\u91cd\u5e86\u4e09\u5ce1\u94f6\u884c","LKAGXBLLYCZYH":"\u5e7f\u897f\u5317\u6d41\u67f3\u94f6\u6751\u9547\u94f6\u884c","HJXQHERCC":"\u5408\u6c5f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","HSXQXZRCC":"\u548c\u7855\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LFSCJRCC":"\u5eca\u574a\u5e02\u57ce\u90ca\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LXEABRCC":"\u4e34\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","TSSFNSFCZYH":"\u662d\u901a\u662d\u9633\u5bcc\u6ec7\u6751\u9547\u94f6\u884c","THEDJRFCZYH":"\u5b81\u9633\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","QXNYLPFCB":"\u9ed4\u897f\u5357\u4e49\u9f99\u6d66\u53d1\u6751\u9547\u94f6\u884c","SXZYPSRRCC":"\u5c71\u897f\u5de6\u4e91\u519c\u6751\u5546\u4e1a\u94f6\u884c","TZCB":"\u53f0\u5dde\u94f6\u884c","TXQEKRCC":"\u5510\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GXTXGYCZYH":"\u957f\u6625\u5357\u5173\u60e0\u6c11\u6751\u9547\u94f6\u884c","CSXRCC":"\u957f\u987a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LYRTCZYH":"\u957f\u6625\u7eff\u56ed\u878d\u6cf0\u6751\u9547\u94f6\u884c","HWHFMCZYH":"\u957f\u987a\u5bcc\u6c11\u6751\u9547\u94f6\u884c","GDYDTLCZYH":"\u957f\u6c40\u6c40\u5dde\u7ea2\u6751\u9547\u94f6\u884c","GYBSCZYH":"\u957f\u57a3\u6c11\u751f\u6751\u9547\u94f6\u884c","ZSXJHRRCC":"\u662d\u82cf\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZZJSXNSCZYH":"\u6c5f\u82cf\u4e39\u9633\u4fdd\u5f97\u6751\u9547\u94f6\u884c","AHHXXHCZYH":"\u6d59\u6c5f\u82cd\u5357\u5efa\u4fe1\u6751\u9547\u94f6\u884c","ARCU":"\u5b89\u5fbd\u7701\u519c\u6751\u4fe1\u7528\u793e","ELHTRCC":"\u4e8c\u8fde\u6d69\u7279\u519c\u6751\u5408\u4f5c\u94f6\u884c","GGXRCC":"\u7518\u8c37\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","GDSKRCB":"\u5e7f\u4e1c\u56db\u4f1a\u519c\u6751\u5546\u4e1a\u94f6\u884c","HPXATCRCC":"\u534e\u576a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DEHMQBSCZYH":"\u6d59\u6c5f\u6df3\u5b89\u5efa\u4fe1\u6751\u9547\u94f6\u884c","JSXYHYCZYH":"\u6d59\u6c5f\u5bcc\u9633\u6052\u901a\u6751\u9547\u94f6\u884c","YNDLYNSCZYH":"\u6d59\u6c5f\u6d77\u76d0\u6e56\u5546\u6751\u9547\u94f6\u884c","BXHFCZYH":"\u57a3\u66f2\u53bf\u6cb3\u4e1c\u6751\u9547\u94f6\u884c","YDXGGWRCC":"\u6c38\u5fb7\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YNMSRCC":"\u4e91\u5357\u8292\u5e02\u519c\u6751\u5546\u4e1a\u94f6\u884c","YNWSSRCC":"\u4e91\u5357\u6587\u5c71\u5e02\u519c\u6751\u5546\u4e1a\u94f6\u884c","YCXPFORCC":"\u5b9c\u5ddd\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YNLFRCC":"\u4e91\u5357\u7984\u4e30\u519c\u6751\u5546\u4e1a\u94f6\u884c","YRXRCC":"\u6c38\u4ec1\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YJSHCB":"\u6c38\u6d4e\u5e02\u4e09\u79be\u6751\u9547\u94f6\u884c\u6709\u9650\u8d23\u4efb\u516c\u53f8","ACCB":"\u4e9a\u6d32\u5546\u4e1a\u94f6\u884c","SYSBFMCZYH":"\u6d59\u6c5f\u5efa\u5fb7\u6e56\u5546\u6751\u9547\u94f6\u884c","LSJYYSCZYH":"\u6d59\u6c5f\u6c5f\u5c71\u5efa\u4fe1\u6751\u9547\u94f6\u884c","FJFAYNSCZYH":"\u6d59\u6c5f\u67ef\u6865\u8054\u5408\u6751\u9547\u94f6\u884c","FSXZIKRCC":"\u4e30\u987a\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","FSXJBRCC":"\u629a\u987a\u53bf\u6551\u5175\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","SYQBCZYH":"\u6c5f\u82cf\u9521\u5c71\u5efa\u4fe1\u6751\u9547\u94f6\u884c","ALXLCZYH":"\u6d59\u6c5f\u9f99\u6e38\u4e49\u5546\u6751\u9547\u94f6\u884c","ZJTZLQRCC":"\u6d59\u6c5f\u53f0\u5dde\u8def\u6865\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZDSRCC":"\u8087\u4e1c\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJXSRCC":"\u6d59\u6c5f\u8427\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJXCRCC":"\u6d59\u6c5f\u65b0\u660c\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJWZZHRCC":"\u6d59\u6c5f\u6e29\u5dde\u74ef\u6d77\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJDQRCC":"\u6d59\u6c5f\u5fb7\u6e05\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJPAZSCZYH":"\u5c71\u4e1c\u6ed5\u5dde\u5efa\u4fe1\u6751\u9547\u94f6\u884c","ZLTMYCB":"\u624e\u5170\u5c6f\u8499\u94f6\u6751\u9547\u94f6\u884c","ZJJHCTRCC":"\u6d59\u6c5f\u91d1\u534e\u6210\u6cf0\u519c\u6751\u5546\u4e1a\u94f6\u884c","RSMFCZYH":"\u6d59\u6c5f\u4e3d\u6c34\u83b2\u90fd\u5efa\u4fe1\u6751\u9547\u94f6\u884c","XPZYFDCZYH":"\u6d59\u6c5f\u4e34\u6d77\u6e56\u5546\u6751\u9547\u94f6\u884c","MTBANK":"\u6d59\u6c5f\u6c11\u6cf0\u5546\u4e1a\u94f6\u884c","ZJJNRCC":"\u6d59\u6c5f\u666f\u5b81\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZRCBANK":"\u5f20\u5bb6\u6e2f\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZQRCB":"\u8087\u5e86\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","ZWXFJRCC":"\u5f70\u6b66\u53bf\u51af\u5bb6\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","ZXJYCZYH":"\u5b9c\u4e30\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","MLDWBSCZYH":"\u94f6\u5ddd\u638c\u653f\u77f3\u94f6\u6751\u9547\u94f6\u884c","HNSYXJCZYH":"\u6d59\u6c5f\u5e73\u6e56\u5de5\u94f6\u6751\u9547\u94f6\u884c","HHNCRCC":"\u9ed1\u6cb3\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXFYSRCC":"\u5c71\u897f\u7701\u6c7e\u9633\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","TLXPDBRCC":"\u94c1\u5cad\u53bf\u5e73\u9876\u5821\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","FXDSCZYH":"\u6b66\u5ddd\u7acb\u519c\u6751\u9547\u94f6\u884c","SZSSCQMYCZYH":"\u957f\u5cad\u86df\u94f6\u6751\u9547\u94f6\u884c","RDUZKCNCDES":"\u6d59\u6c5f\u8862\u5dde\u67ef\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJSXRFRCC":"\u6d59\u6c5f\u7ecd\u5174\u745e\u4e30\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZMHNSCZYH":"\u897f\u53cc\u7248\u7eb3\u52d0\u814a\u957f\u6c5f\u6751\u9547\u94f6\u884c","ZDRCBANK":"\u8087\u5e86\u7aef\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJZZNBGRCC":"\u6d59\u6c5f\u5d4a\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZKXRPMRCC":"\u6cfd\u5e93\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","ZJSXHXRCC":"\u6d59\u6c5f\u7ecd\u5174\u6052\u4fe1\u519c\u6751\u5408\u4f5c\u94f6\u884c","ZXXTCZYH":"\u76d1\u5229\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","ZJQYTLCB":"\u6d59\u6c5f\u5e86\u5143\u6cf0\u9686\u6751\u9547\u94f6\u884c","YXHNSCZYH":"\u6d59\u6c5f\u6cf0\u987a\u6e29\u94f6\u6751\u9547\u94f6\u884c","YSXIMZRCC":"\u6c38\u5584\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YFXXDYCB":"\u4e91\u6d6e\u65b0\u5174\u4e1c\u76c8\u6751\u9547\u94f6\u884c","YAJGCZYH":"\u8fdc\u5b89\u91d1\u8c37\u6751\u9547\u94f6\u884c","BARCLAYS":"\u82f1\u56fd\u5df4\u514b\u83b1\u94f6\u884c\u6709\u9650\u516c\u53f8","YDXMKHRCC":"\u6c38\u767b\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YPXRCC":"\u6c38\u5e73\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YYRCB":"\u76ca\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","YYRCU":"\u6e56\u5357\u5cb3\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","LFKFQRSCZYH":"\u5eca\u574a\u5f00\u53d1\u533a\u878d\u5546\u6751\u9547\u94f6\u884c","PSKSTGRCC":"\u76ae\u5c71\u53bf\u9614\u4ec0\u5854\u683c\u4e61\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","QXJRCZYH":"\u6c38\u5174\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","YNNHRCC":"\u4e91\u5357\u5357\u534e\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNZJXJCZYH":"\u90e7\u897f\u695a\u519c\u5546\u6751\u9547\u94f6\u884c","HNWZSCJCZYH":"\u91cd\u5e86\u6881\u5e73\u6fb3\u65b0\u6751\u9547\u94f6\u884c","HNCBXNCZYH":"\u6e56\u5357\u57ce\u6b65\u6e58\u519c\u6751\u9547\u94f6\u884c","HBC":"\u6e56\u5317\u94f6\u884c","FXXYTCZYH":"\u67a3\u9633\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","CZCCB":"\u957f\u6cbb\u94f6\u884c","BJFSHNSCZYH":"\u6d59\u6c5f\u5929\u53f0\u6c11\u751f\u6751\u9547\u94f6\u884c","BYBBWCZYH":"\u66f9\u53bf\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","LTXBDCRCC":"\u4e34\u6f6d\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LNZXBANK":"\u8fbd\u5b81\u632f\u5174\u94f6\u884c","SNCTHCZYH":"\u7389\u5c4f\u957f\u5f81\u6751\u9547\u94f6\u884c","SCYLHMCZYH":"\u4e07\u5b81\u56fd\u6c11\u6751\u9547\u94f6\u884c","SXFPHFCZYH":"\u6d59\u6c5f\u6850\u5e90\u6052\u4e30\u6751\u9547\u94f6\u884c","CDXHSCZYH":"\u6d59\u6c5f\u6c38\u5609\u6052\u5347\u6751\u9547\u94f6\u884c","CZSQRCC":"\u6f6e\u5dde\u5e02\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","RXRCB":"\u6ca7\u5dde\u878d\u4fe1\u519c\u6751\u5546\u4e1a\u94f6\u884c","DDRCB":"\u4e39\u4e1c\u519c\u6751\u5546\u4e1a\u94f6\u884c","YZGYXFCZYH":"\u9ad8\u5bc6\u60e0\u6c11\u6751\u9547\u94f6\u884c","HBTMRCC":"\u6e56\u5317\u5929\u95e8\u519c\u6751\u5546\u4e1a\u94f6\u884c","HJSLDCZYH":"\u6cb3\u6d25\u5e02\u9f99\u90fd\u6751\u9547\u94f6\u884c","ZSGZNYCZYH":"\u6d4e\u5357\u69d0\u836b\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","JXYGRCC":"\u6c5f\u897f\u4f59\u5e72\u519c\u6751\u5546\u4e1a\u94f6\u884c","JSLDRCB":"\u7518\u8083\u4e24\u5f53\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","MZPFCZYH":"\u4e50\u5e73\u878d\u5174\u6751\u9547\u94f6\u884c","AHLXHSCZYH":"\u7075\u77f3\u53bf\u6c47\u6c11\u6751\u9547\u94f6\u884c","NLXFFRRCC":"\u5357\u4e50\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","TYNSCZYH":"\u5c71\u4e1c\u535a\u5174\u65b0\u534e\u6751\u9547\u94f6\u884c","SDZCHMGRCC":"\u5c71\u4e1c\u90b9\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","LKQLCZYH":"\u65b0\u7586\u7eff\u6d32\u56fd\u6c11\u6751\u9547\u94f6\u884c","LZGJSPXHYCZYH":"\u6e56\u5357\u9053\u53bf\u795e\u519c\u6751\u9547\u94f6\u884c","LLHZCZYH":"\u67f3\u6797\u6c47\u6cfd\u6751\u9547\u94f6\u884c","DFQLCZYH":"\u6d59\u6c5f\u821f\u5c71\u666e\u9640\u7a20\u5dde\u6751\u9547\u94f6\u884c","DHB":"\u9053\u4ea8\u94f6\u884c","HFXRCC":"\u6d77\u4e30\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ASNYCZYH":"\u6e56\u5357\u90b5\u4e1c\u6e58\u6dee\u6751\u9547\u94f6\u884c","QJMLRCC":"\u66f2\u9756\u5e02\u9a6c\u9f99\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SCSRCC":"\u53cc\u57ce\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SDYTRCC":"\u5c71\u4e1c\u9c7c\u53f0\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJZSPTRCC":"\u6d59\u6c5f\u821f\u5c71\u666e\u9640\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJYJRCC":"\u6d59\u6c5f\u6c38\u5609\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZDHMCZYH":"\u6866\u7538\u60e0\u6c11\u6751\u9547\u94f6\u884c","LSJKHQRCC":"\u4e50\u5c71\u5e02\u91d1\u53e3\u6cb3\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HDCB":"\u9ed4\u897f\u82b1\u90fd\u6751\u9547\u94f6\u884c","JXLXFMCZYXUKJ":"\u9752\u5c9b\u57ce\u9633\u73e0\u6c5f\u6751\u9547\u94f6\u884c","XYYNSCB":"\u4e91\u5357\u7965\u4e91\u6e1d\u519c\u5546\u6751\u9547\u94f6\u884c","XGXRCC":"\u65b0\u5e72\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XJWSRCB":"\u65b0\u7586\u6e29\u5bbf\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJTZJJRCC":"\u6d59\u6c5f\u53f0\u5dde\u6912\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","CZBANK":"\u6d59\u5546\u94f6\u884c","ZCXUVBRCC":"\u67d8\u57ce\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJSDHDRCC":"\u6e5b\u6c5f\u5e02\u4e1c\u6d77\u5c9b\u7ecf\u6d4e\u5f00\u53d1\u8bd5\u9a8c\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","TQMYCZYH":"\u6d59\u6c5f\u6d1e\u5934\u5bcc\u6c11\u6751\u9547\u94f6\u884c","ZJLYRCC":"\u6d59\u6c5f\u9f99\u6e38\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJTZHYRCC":"\u6d59\u6c5f\u53f0\u5dde\u9ec4\u5ca9\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZQWXZYFDCZYH":"\u5b89\u5fbd\u6cfe\u53bf\u94dc\u6e90\u6751\u9547\u94f6\u884c","GTQLCZYH":"\u8d1e\u4e30\u5174\u8d1e\u6751\u9547\u94f6\u884c","GXLZYNSCZYH":"\u4e0a\u6d77\u5d07\u660e\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","GXPGRCC":"\u5e7f\u897f\u5e73\u679c\u519c\u6751\u5408\u4f5c\u94f6\u884c","JLXLNGRCC":"\u8549\u5cad\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJJSBHARCC":"\u6d59\u6c5f\u5609\u5584\u519c\u6751\u5546\u4e1a\u94f6\u884c","RXXNSCZYH":"\u6d59\u6c5f\u5e73\u9633\u6d66\u53d1\u6751\u9547\u94f6\u884c","LORJNCSYSUY":"\u6d59\u6c5f\u6d66\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","JKCZCZYH":"\u6d59\u6c5f\u4e91\u548c\u8054\u5408\u6751\u9547\u94f6\u884c","SHPDJNCZYH":"\u9547\u5b81\u6c47\u5546\u6751\u9547\u94f6\u884c","ZZJSXNSCB":"\u90d1\u5dde\u91d1\u6c34\u53a6\u519c\u5546\u6751\u9547\u94f6\u884c","ZJSPTQRCC":"\u6e5b\u6c5f\u5e02\u5761\u5934\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJZJLHCB":"\u6d59\u6c5f\u8bf8\u66a8\u8054\u5408\u6751\u9547\u94f6\u884c","ZJAJRCC":"\u6d59\u6c5f\u5b89\u5409\u519c\u6751\u5546\u4e1a\u94f6\u884c","RIES":"\u652f\u4ed8\u6e05\u7b97\u534f\u4f1a","NBXZCCZYH":"\u4e2d\u6210\u6751\u9547\u94f6\u884c","ZHHTCZYH":"\u5e84\u6cb3\u6c47\u901a\u6751\u9547\u94f6\u884c","ZAXYUZRCC":"\u6b63\u5b89\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SGB":"\u4e2d\u5fb7\u4f4f\u623f\u50a8\u84c4\u94f6\u884c","ZGRCB":"\u81ea\u8d21\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","ZXZYFDCB":"\u675e\u53bf\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","GSZYRCB":"\u5f20\u6396\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","LJYYCZYH":"\u957f\u5b81\u4e2d\u6210\u6751\u9547\u94f6\u884c","ICBCqhalgrwj":"\u8d75\u5ed6\u65b9\u6d4b\u8bd5\u7684\u516c\u53f8","ZBBSBHCB":"\u6dc4\u535a\u535a\u5c71\u5317\u6d77\u6751\u9547\u94f6\u884c","ZMDRCB":"\u9a7b\u9a6c\u5e97\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZPPFCZYH":"\u5b89\u5fbd\u970d\u5c71\u8054\u5408\u6751\u9547\u94f6\u884c","ZJWLRCC":"\u6d59\u6c5f\u6e29\u5cad\u519c\u6751\u5546\u4e1a\u94f6\u884c","ICBCJX":"\u4e2d\u56fd\u5de5\u5546\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8\u6c5f\u897f\u7701\u5206\u884c","ZRXRCC":"\u67d8\u8363\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJYHJPHRCC":"\u6d59\u6c5f\u4e91\u548c\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJYHMJDRCC":"\u6d59\u6c5f\u7389\u73af\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZHNPCZYH":"\u56db\u5ddd\u540d\u5c71\u9526\u7a0b\u6751\u9547\u94f6\u884c","SXKJXXZJHCZYH":"\u4e2d\u5c71\u53e4\u9547\u5357\u7ca4\u6751\u9547\u94f6\u884c","SDGQHJCZYH":"\u5c71\u4e1c\u9ad8\u9752\u6c47\u91d1\u6751\u9547\u94f6\u884c","SXSLXVPLRCC":"\u5c71\u897f\u7701\u4e34\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SDNYRCB":"\u5c71\u4e1c\u5b81\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SCBCQXFMCZYH":"\u9632\u57ce\u6e2f\u9632\u57ce\u56fd\u6c11\u6751\u9547\u94f6\u884c","HZRCB":"\u60e0\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDDXRCC":"\u5c71\u4e1c\u5355\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","SYFKFMCZYH":"\u7075\u5c71\u6cf0\u4e1a\u6751\u9547\u94f6\u884c","SZXJIWRCC":"\u7ee5\u4e2d\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","ZJZSPTCZCZYH":"\u5929\u6d25\u5b9d\u577b\u6d66\u53d1\u6751\u9547\u94f6\u884c","WRXWQRCC":"\u4e07\u8363\u53bf\u4e07\u6cc9\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","HNLSJXHCZYH":"\u897f\u5b89\u957f\u5b89\u65b0\u534e\u6751\u9547\u94f6\u884c","XJAKSRCC":"\u65b0\u7586\u963f\u514b\u82cf\u519c\u6751\u5546\u4e1a\u94f6\u884c","XACADLRCC":"\u897f\u5b89\u5e02\u957f\u5b89\u533a\u675c\u9675\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","XTB":"\u90a2\u53f0\u94f6\u884c","FYJYCZYH":"\u6613\u95e8\u5174\u798f\u6751\u9547\u94f6\u884c","ZBBANK":"\u4f17\u90a6\u94f6\u884c","ZHNSB":"\u73e0\u6d77\u519c\u6751\u5546\u4e1a\u94f6\u884c","RBOZ":"\u73e0\u6d77\u534e\u6da6\u94f6\u884c","ZGCCB":"\u81ea\u8d21\u94f6\u884c","ZQSWLRXCZYH":"\u5927\u65b9\u5bcc\u6c11\u6751\u9547\u94f6\u884c","DFJYCZYH":"\u547c\u548c\u6d69\u7279\u5e02\u8d5b\u7f55\u91d1\u8c37\u6751\u9547\u94f6\u884c","KMXSQRCC":"\u6606\u660e\u5e02\u897f\u5c71\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LZXXISRCC":"\u8fbd\u4e2d\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJLSLDJXCZYH":"\u90bb\u6c34\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","ZYHHGFMCZYH":"\u6c5f\u82cf\u4e1c\u6d77\u5f20\u519c\u5546\u6751\u9547\u94f6\u884c","XJRZPFGGYH":"\u6d66\u53d1\u7845\u8c37","JXZYCZYH":"\u5174\u5b81\u73e0\u6c5f\u6751\u9547\u94f6\u884c","XYXBRNRCC":"\u53d9\u6c38\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","YNXCZERCC":"\u90c1\u5357\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZPRCU":"\u9547\u5e73\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CTBC":"\u4e2d\u56fd\u4fe1\u6258\u5546\u4e1a\u94f6\u884c","ZYXTZRRCC":"\u9547\u539f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJJDRCC":"\u6d59\u6c5f\u5efa\u5fb7\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJSYRCC":"\u6d59\u6c5f\u4e0a\u865e\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZSRXCZYH":"\u9ad8\u5510\u9752\u9686\u6751\u9547\u94f6\u884c","JXAFRCC":"\u6c5f\u897f\u5b89\u798f\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZQJLPMTCZYH":"\u9526\u5dde\u677e\u5c71\u519c\u5546\u6751\u9547\u94f6\u884c","SCXHDCZYH":"\u6d9f\u6e90\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","RQSRCC":"\u4efb\u4e18\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YYTJCZYH":"\u4e2d\u536b\u9999\u5c71\u6751\u9547\u94f6\u884c","YPHXRCC":"\u5cb3\u666e\u6e56\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJRXCZYH":"\u6dbf\u9e7f\u5229\u4e30\u6751\u9547\u94f6\u884c","BOCI":"\u4e2d\u94f6\u5361\u53f8","ZJZSRCC":"\u6d59\u6c5f\u5cb1\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZXNCRCC":"\u8d75\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","TSSQAZXCZYH":"\u6d59\u6c5f\u6d77\u5b81\u5fb7\u5546\u6751\u9547\u94f6\u884c","TQAZJZSCZCZYH":"\u6d59\u6c5f\u5cb1\u5c71\u7a20\u5dde\u6751\u9547\u94f6\u884c","QSAZJDYFMCZYH":"\u6d59\u6c5f\u4e1c\u9633\u5bcc\u6c11\u6751\u9547\u94f6\u884c","SCDZYNSCZYH":"\u6d59\u6c5f\u7f19\u4e91\u8054\u5408\u6751\u9547\u94f6\u884c","SDZCZVLRCC":"\u5c71\u4e1c\u9104\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDZZRCC":"\u5c71\u4e1c\u6ed5\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","YNCXSRCC":"\u4e91\u5357\u695a\u96c4\u5e02\u519c\u6751\u5546\u4e1a\u94f6\u884c","ICBCHK":"\u4e2d\u56fd\u5de5\u5546\u94f6\u884c\uff08\u4e9a\u6d32\uff09\u6709\u9650\u516c\u53f8","ZJRXCB":"\u4e2d\u6c5f\u878d\u5174\u6751\u9547\u94f6\u884c","ZKRCC":"\u5468\u53e3\u5e02\u5e02\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJKHRCC":"\u6d59\u6c5f\u5f00\u5316\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJSMZQRCC":"\u6e5b\u6c5f\u5e02\u9ebb\u7ae0\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZHXFDMRCC":"\u8d5e\u7687\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DLGCZCCZYH":"\u957f\u6625\u51c0\u6708\u6986\u94f6\u6751\u9547\u94f6\u884c","ZJLQTUQRCC":"\u6d59\u6c5f\u4e50\u6e05\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZYXTXCZYH":"\u6e56\u5317\u5929\u95e8\u6c47\u4e30\u6751\u9547\u94f6\u884c","TLXSHCZYH":"\u6c5f\u897f\u5a7a\u6e90\u6c5f\u6dee\u6751\u9547\u94f6\u884c","SXSQRCC":"\u9655\u897f\u77f3\u6cc9\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDQHRCC":"\u5c71\u4e1c\u9f50\u6cb3\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXBXRCC":"\u9655\u897f\u5f6c\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","YPCZCZYH":"\u6d59\u6c5f\u9f99\u6cc9\u6c11\u6cf0\u6751\u9547\u94f6\u884c","HYZYFDCZYH":"\u6d59\u6c5f\u4e0a\u865e\u5bcc\u6c11\u6751\u9547\u94f6\u884c","WZZCCZYH":"\u6d59\u6c5f\u53f0\u5dde\u8def\u6865\u5bcc\u6c11\u6751\u9547\u94f6\u884c","JHMSCZYH":"\u6d59\u6c5f\u6b66\u4e49\u5efa\u4fe1\u6751\u9547\u94f6\u884c","ZNXUUVRCC":"\u5468\u5b81\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJXLAIRCC":"\u8365\u7ecf\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","ZZZCCZYXABC":"\u6dbf\u5dde\u4e2d\u6210\u6751\u9547\u94f6\u884c","ZJHZYHRCC":"\u6d59\u6c5f\u676d\u5dde\u4f59\u676d\u519c\u6751\u5546\u4e1a\u94f6\u884c","UFXM":"\u4e2d\u56fd\u94f6\u884c\u95f4\u5916\u6c47\u4ea4\u6613\u4e2d\u5fc3","ZJSMRCC":"\u6d59\u6c5f\u4e09\u95e8\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJZZSDLRCC":"\u6d59\u6c5f\u5d4a\u6cd7\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJTLCB":"\u6d59\u6c5f\u6cf0\u9686\u5546\u4e1a\u94f6\u884c","ZJCXLHCB":"\u6d59\u6c5f\u957f\u5174\u8054\u5408\u6751\u9547\u94f6\u884c","LKZYFDNSCZYH":"\u6b63\u5b9a\u6052\u5347\u6751\u9547\u94f6\u884c","ZZBANK":"\u90d1\u5dde\u94f6\u884c","CXXYCZYXTTV":"\u4e2d\u9633\u53bf\u592a\u884c\u6751\u9547\u94f6\u884c","CIMBBANK":"CIMB Bank","ZJTSWYCZYH":"\u5b89\u5fbd\u6fc9\u6eaa\u6e56\u5546\u6751\u9547\u94f6\u884c","RHNSH":"\u8d35\u5dde\u4ec1\u6000\u8305\u53f0\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNQDRCC":"\u6e56\u5357\u7941\u4e1c\u519c\u6751\u5546\u4e1a\u94f6\u884c","WRXGHRCC":"\u4e07\u8363\u53bf\u5149\u534e\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","ZXCNSCB":"\u7af9\u6eaa\u695a\u519c\u5546\u6751\u9547\u94f6\u884c","ZSZCCZYH":"\u51e4\u57ce\u4e30\u76ca\u6751\u9547\u94f6\u884c","GXLCERFRCC":"\u5e7f\u897f\u9646\u5ddd\u519c\u6751\u5546\u4e1a\u94f6\u884c","CBKF":"\u5f00\u5c01\u5e02\u5546\u4e1a\u94f6\u884c","ZBBSRCC":"\u6dc4\u535a\u535a\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZCHSCZYH":"\u5b89\u5fbd\u5b9a\u8fdc\u6c11\u4e30\u6751\u9547\u94f6\u884c","BTXRCC":"\u5df4\u5858\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SHNRCB":"\u6c5f\u82cf\u6cd7\u6d2a\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXZYBSSRCC":"\u6c5f\u897f\u5f0b\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","JCHNZYZRCC":"\u6c5f\u57ce\u54c8\u5c3c\u65cf\u5f5d\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","MLXRCC":"\u6728\u5170\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NCSQRCC":"\u5357\u5145\u5e02\u987a\u5e86\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","QHTRRCC":"\u9752\u6d77\u540c\u4ec1\u519c\u6751\u5546\u4e1a\u94f6\u884c","SCLCNCB":"\u56db\u5ddd\u9686\u660c\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","XJRZTGTJYHDZKM":"\u6cf0\u4eac\u6606\u5206","XYVB":"\u9999\u6cb3\u76ca\u6c11\u6751\u9547\u94f6\u884c","ZJDYRCC":"\u6d59\u6c5f\u4e1c\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJSCRCC":"\u6d59\u6c5f\u9042\u660c\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZCXWNSRCC":"\u6dc5\u5ddd\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XJJDCZYH":"\u590f\u6d25\u80f6\u4e1c\u6751\u9547\u94f6\u884c","XYXJZBRCC":"\u65ec\u9091\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJHMCZYH":"\u626c\u5dde\u9ad8\u90ae\u5174\u798f\u6751\u9547\u94f6\u884c","ZZYDRCC":"\u4eb3\u5dde\u836f\u90fd\u519c\u6751\u5546\u4e1a\u94f6\u884c","GGSQRCC":"\u8d35\u6e2f\u5e02\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LXSZCZYH":"\u5b81\u590f\u5e73\u7f57\u53bf\u6c99\u6e56\u6751\u9547\u94f6\u884c","ZWNCXYHZLSHCX":"\u5f70\u6b66\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u56db\u5408\u57ce\u4fe1\u7528\u793e","CCFZNCB":"\u957f\u6625\u53d1\u5c55\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","ZJLSLDRCC":"\u6d59\u6c5f\u4e3d\u6c34\u83b2\u90fd\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJCSLHCB":"\u6d59\u6c5f\u5e38\u5c71\u8054\u5408\u6751\u9547\u94f6\u884c","CMBWLBGZ":"\u62db\u5546\u6c38\u9686\u94f6\u884c\u6709\u9650\u516c\u53f8\u5e7f\u5dde\u5206\u884c","ZJLQLHCZYH":"\u91cd\u5e86\u6c5f\u6d25\u77f3\u94f6\u6751\u9547\u94f6\u884c","GDNHRCB":"\u5e7f\u4e1c\u5357\u6d77\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBRCU":"\u6cb3\u5317\u7701\u519c\u6751\u4fe1\u7528\u793e","HLJYKRCC":"\u9ed1\u9f99\u6c5f\u900a\u514b\u519c\u6751\u5546\u4e1a\u94f6\u884c","NCXJHTCZYH":"\u5357\u660c\u65b0\u5efa\u6052\u901a\u6751\u9547\u94f6\u884c","WRBJRCC":"\u5c71\u897f\u7701\u8fd0\u57ce\u5e02\u4e07\u8363\u53bf\u5b9d\u4e95\u4fe1\u7528\u793e","SZCZCZYH":"\u6d59\u6c5f\u78d0\u5b89\u5a7a\u5546\u6751\u9547\u94f6\u884c","SLSRCC":"\u53cc\u8fbd\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","ZJPHRCC":"\u6d59\u6c5f\u5e73\u6e56\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZXQLCZYH":"\u4e91\u68a6\u695a\u519c\u5546\u6751\u9547\u94f6\u884c","ZQSDHQRCC":"\u8087\u5e86\u5e02\u9f0e\u6e56\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JSDTMYCZYH":"\u6d59\u6c5f\u4e09\u95e8\u94f6\u5ea7\u6751\u9547\u94f6\u884c","JLFMHMCZYH":"\u6d59\u6c5f\u5609\u5584\u8054\u5408\u6751\u9547\u94f6\u884c","JSJRCB":"\u6c5f\u82cf\u53e5\u5bb9\u519c\u6751\u5546\u4e1a\u94f6\u884c","HZFMCZYH":"\u6c5f\u82cf\u6d9f\u6c34\u592a\u5546\u6751\u9547\u94f6\u884c","SSCNSCZYH":"\u5f00\u8fdc\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","JTLJCZYH":"\u519c\u5b89\u5317\u94f6\u6751\u9547\u94f6\u884c","AUUJNLHCZYH":"\u81ea\u8d21\u4e2d\u6210\u6751\u9547\u94f6\u884c","AHZXWOYRCC":"\u5b89\u5fbd\u6cfe\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","KKB":"\u5965\u5730\u5229\u4e2d\u592e\u5408\u4f5c\u94f6\u884c","CLLACB":"\u660c\u4e50\u4e50\u5b89\u6751\u9547\u94f6\u884c","FJMQRSCZYH":"\u6e56\u5357\u6843\u6e90\u6e58\u6dee\u6751\u9547\u94f6\u884c","GVZFKJHCZYH":"\u6c5f\u82cf\u8d63\u6986\u901a\u5546\u6751\u9547\u94f6\u884c","SDYYRCC":"\u5c71\u4e1c\u6c82\u6e90\u519c\u6751\u5546\u4e1a\u94f6\u884c","MBTC":"\u9996\u90fd\u94f6\u884c\u53ca\u4fe1\u6258\u516c\u53f8","SXQYWJERCC":"\u5c71\u897f\u6c81\u6e90\u519c\u6751\u5546\u4e1a\u94f6\u884c","AHHSLHCZYH":"\u94dc\u5ddd\u8000\u5dde\u65b0\u534e\u6751\u9547\u94f6\u884c","ABXRCC":"\u963f\u575d\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","BLSRCC":"\u5317\u6d41\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","DXTWCHRCC":"\u5b9a\u897f\u5e02\u901a\u6e2d\u53bf\u5e38\u6cb3\u4fe1\u7528\u793e","DEUTSCHEZG":"\u5fb7\u610f\u5fd7\u94f6\u884c(\u4e2d\u56fd)\u6709\u9650\u516c\u53f8","YZHZRCC":"\u7109\u8006\u56de\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","AHSXLHCZYH":"\u6c38\u65b0\u5e90\u9675\u6751\u9547\u94f6\u884c","GJSFMCZYH":"\u6d59\u6c5f\u666f\u5b81\u94f6\u5ea7\u6751\u9547\u94f6\u884c","GDQYRCB":"\u5e7f\u4e1c\u6e05\u8fdc\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBCYSKDRCC":"\u6e56\u5317\u957f\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","HBXNRCC":"\u6e56\u5317\u54b8\u5b81\u519c\u6751\u5546\u4e1a\u94f6\u884c","HYXMBYRCC":"\u7ea2\u539f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","XJRZHNSYYHSZ":"\u534e\u5546\u6df1\u5206","HBXYRCC":"\u6e56\u5317\u8944\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXHXHSCZYH":"\u5efa\u6e56\u4e2d\u6210\u6751\u9547\u94f6\u884c","MLSRCC":"\u7a46\u68f1\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","MDXJABRCC":"\u5f25\u6e21\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","TLHJGCZYH":"\u6d59\u6c5f\u53f0\u5dde\u9ec4\u5ca9\u6052\u5347\u6751\u9547\u94f6\u884c","TJBCB":"\u5929\u6d25\u5e02\u5317\u8fb0\u6751\u9547\u94f6\u884c","TLSZLTQRCC":"\u5185\u8499\u53e4\u901a\u8fbd\u5e02\u624e\u9c81\u7279\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","SDSGRCC":"\u5c71\u4e1c\u5bff\u5149\u519c\u6751\u5546\u4e1a\u94f6\u884c","WNHTCB":"\u6b66\u5b81\u6052\u901a\u6751\u9547\u94f6\u884c","WJXRCC":"\u65e0\u6781\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","XTBXNCSYHRB":"\u6d59\u6c5f\u5170\u6eaa\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZXXFOTRCC":"\u9547\u96c4\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJNRCB":"\u6e5b\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","ZJRARCC":"\u6d59\u6c5f\u745e\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","PSBCCD":"\u4e2d\u56fd\u90ae\u50a8\u94f6\u884c\u6210\u90fd\u5206\u884c","ZJTXRCC":"\u6d59\u6c5f\u6850\u4e61\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJLQTADRCC":"\u6d59\u6c5f\u9f99\u6cc9\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJDTFMCZYH":"\u4e1c\u839e\u5e38\u5e73\u65b0\u534e\u6751\u9547\u94f6\u884c","CFQGXSLGMCZYH":"\u8d44\u9633\u6c11\u751f\u6751\u9547\u94f6\u884c","CXJYCZYH":"\u4efb\u53bf\u90a2\u519c\u5546\u6751\u9547\u94f6\u884c","CZJHRCC":"\u6c60\u5dde\u4e5d\u534e\u519c\u6751\u5546\u4e1a\u94f6\u884c","DSFMCZYH":"\u72ec\u5c71\u5bcc\u6c11\u6751\u9547\u94f6\u884c","SDWLRCC":"\u5c71\u4e1c\u4e94\u83b2\u519c\u6751\u5546\u4e1a\u94f6\u884c","SDWLRCB":"\u5c71\u4e1c\u65e0\u68e3\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","CBCXZRCC":"\u957f\u767d\u671d\u9c9c\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZYHCQXCZYH":"\u9075\u4e49\u6c47\u5ddd\u9ed4\u5174\u6751\u9547\u94f6\u884c","ZQSDDKRXCZYH":"\u9075\u5316\u878d\u548c\u6751\u9547\u94f6\u884c","ZYYCCZYH":"\u6b63\u9633\u7389\u5ddd\u6751\u9547\u94f6\u884c","ZJJSJXCZYH":"\u5b89\u585e\u519c\u94f6\u6751\u9547\u94f6\u884c","DZCB":"\u8fbe\u5dde\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","FJJCCTHCB":"\u798f\u5efa\u8549\u57ce\u523a\u6850\u7ea2\u6751\u9547\u94f6\u884c","GZZRCC":"\u7518\u5b5c\u5dde\u519c\u6751\u4fe1\u7528\u8054\u793e","SNCZCZYH":"\u85c1\u57ce\u6052\u5347\u6751\u9547\u94f6\u884c","GZQRRCB":"\u8d35\u5dde\u6674\u9686\u519c\u6751\u5546\u4e1a\u94f6\u884c","DYRTCZYH":"\u8d3a\u5dde\u516b\u6b65\u4e1c\u76c8\u6751\u9547\u94f6\u884c","HNCLSRCB":"\u6e56\u5357\u6148\u5229\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","HNXTTYRCB":"\u6e56\u5357\u6e58\u6f6d\u5929\u6613\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","JXDXMZSRCC":"\u6c5f\u897f\u4e1c\u4e61\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXSHDCZYH":"\u4ecb\u4f11\u5e02\u534e\u90fd\u6751\u9547\u94f6\u884c","BTSDHJGCZYH":"\u6c5f\u53e3\u957f\u5f81\u6751\u9547\u94f6\u884c","LNXYRCB":"\u8fbd\u5b81\u5cab\u5ca9\u519c\u6751\u5546\u4e1a\u94f6\u884c","LJYLCJCZYH":"\u5e73\u7f57\u6c99\u6e56\u6751\u9547\u94f6\u884c","LNXCRCB":"\u8fbd\u5b81\u5174\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","QYLACZYH":"\u5e86\u4e91\u4e50\u5b89\u6751\u9547\u94f6\u884c","TJXJSBRCC":"\u53f0\u6c5f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YNLPRCC":"\u4e91\u5357\u7f57\u5e73\u519c\u6751\u5546\u4e1a\u94f6\u884c","YAXHSKRCC":"\u59da\u5b89\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZYXMGZRCC":"\u9547\u6c85\u5f5d\u65cf\u54c8\u5c3c\u65cf\u62c9\u795c\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJJSXMVRCC":"\u6d59\u6c5f\u6c5f\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJRAHSCB":"\u6d59\u6c5f\u745e\u5b89\u6e56\u5546\u6751\u9547\u94f6\u884c","ZWDLJZRCC":"\u5f70\u6b66\u53bf\u4e1c\u516d\u5bb6\u5b50\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","ZYFMCZYH":"\u7ec7\u91d1\u60e0\u6c11\u6751\u9547\u94f6\u884c","ZJJNYZCZYH":"\u6cb3\u5357\u65b9\u57ce\u51e4\u88d5\u6751\u9547\u94f6\u884c","HHHTJQHTCZYH":"\u6cfd\u5dde\u6d66\u53d1\u6751\u9547\u94f6\u884c","ZJNZRCC":"\u6d59\u6c5f\u5357\u6d54\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJSYHTCZYH":"\u6d59\u6c5f\u677e\u9633\u6052\u901a\u6751\u9547\u94f6\u884c","ZJZYRCC":"\u6d59\u6c5f\u7f19\u4e91\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJLQLHCB":"\u6d59\u6c5f\u4e50\u6e05\u8054\u5408\u6751\u9547\u94f6\u884c","ZJJDHSCZYH":"\u957f\u6625\u9ad8\u65b0\u60e0\u6c11\u6751\u9547\u94f6\u884c","SCB":"\u6e23\u6253\u94f6\u884c","ZLZYCB":"\u9122\u9675\u90d1\u94f6\u6751\u9547\u94f6\u884c","CGZYFDCZYH":"\u6d59\u6c5f\u9752\u7530\u4e2d\u94f6\u5bcc\u767b\u534e\u4fa8\u6751\u9547\u94f6\u884c","DYCB":"\u957f\u57ce\u534e\u897f\u94f6\u884c","CZLZRCB":"\u957f\u6cbb\u6f5e\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","ZCHHCZYH":"\u67d8\u57ce\u9ec4\u6dee\u6751\u9547\u94f6\u884c","ZJLAZXCB":"\u6d59\u6c5f\u4e34\u5b89\u4e2d\u4fe1\u6751\u9547\u94f6\u884c","ZJKCLRCB":"\u5f20\u5bb6\u53e3\u5d07\u793c\u90a2\u519c\u5546\u6751\u9547\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","ZJLHRCC":"\u6d59\u6c5f\u4e34\u6d77\u519c\u6751\u5546\u4e1a\u94f6\u884c","SFKZZJNCHXS":"\u6d59\u6c5f\u8862\u5dde\u8862\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","NJZCCZYH":"\u7af9\u5c71\u695a\u519c\u5546\u6751\u9547\u94f6\u884c","NZZYFDCZYH":"\u6d59\u6c5f\u5d4a\u5dde\u745e\u4e30\u6751\u9547\u94f6\u884c","MMCYNCSYXTE":"\u6d59\u6c5f\u677e\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","XTLFCZYH":"\u6d59\u6c5f\u7389\u73af\u6c38\u5174\u6751\u9547\u94f6\u884c","XAGLYGCZYH":"\u6d59\u6c5f\u4ed9\u5c45\u5bcc\u6c11\u6751\u9547\u94f6\u884c","XSXUPXRCC":"\u8c61\u5c71\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","YSXDJWRCC":"\u6c38\u5bff\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXDZCZYH":"\u6d59\u6c5f\u8427\u5c71\u6e56\u5546\u6751\u9547\u94f6\u884c","SXFGRCC":"\u9655\u897f\u5e9c\u8c37\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXSZYXRCC":"\u5c71\u897f\u7701\u6714\u5dde\u5e02\u5e94\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","CCNGHMCZYH":"\u6d59\u6c5f\u79c0\u6d32\u5fb7\u5546\u6751\u9547\u94f6\u884c","NNMSCJCZYH":"\u67d8\u8363\u523a\u6850\u7ea2\u6751\u9547\u94f6\u884c","NJXLRB":"\u5185\u6c5f\u6751\u9547\u94f6\u884c","WTNSQNCXIQZ":"\u90d1\u5dde\u5e02\u5e02\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","LNTZHCZYH":"\u90b9\u5e73\u6d66\u53d1\u6751\u9547\u94f6\u884c","LZYDXHCZYH":"\u90d1\u5dde\u73e0\u6c5f\u6751\u9547\u94f6\u884c","ZHSRCC":"\u9075\u5316\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZNXIYFRCC":"\u6b63\u5b81\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZAXEIQRCC":"\u8bcf\u5b89\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BOCCCL":"\u4e2d\u56fd\u94f6\u884c\u603b\u884c","ZJPYRCC":"\u6d59\u6c5f\u5e73\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJQYRCC":"\u6d59\u6c5f\u5e86\u5143\u519c\u6751\u5546\u4e1a\u94f6\u884c","GXPNGYCZYH":"\u6d59\u6c5f\u6587\u6210\u5317\u94f6\u6751\u9547\u94f6\u884c","GXLJLYCZYH":"\u9e64\u5c71\u73e0\u6c5f\u6751\u9547\u94f6\u884c","HBJYWJCB":"\u6e56\u5317\u5609\u9c7c\u5434\u6c5f\u6751\u9547\u94f6\u884c","HNCB":"\u534e\u5357\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","LZQLHXHCZYH":"\u4e2d\u725f\u90d1\u94f6\u6751\u9547\u94f6\u884c","LLXYHTCZYH":"\u6c5f\u82cf\u6b66\u8fdb\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","NJXIZYRCC":"\u5357\u9756\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","DYHKZCCZYH":"\u4e2d\u5c71\u4e1c\u51e4\u73e0\u6c5f\u6751\u9547\u94f6\u884c","SYXTXCZYH":"\u73e0\u6d77\u5357\u5c4f\u6751\u9547\u94f6\u884c","LJRCB":"\u56db\u5ddd\u7f57\u6c5f\u519c\u6751\u5546\u4e1a\u94f6\u884c","QDJNHHCZYH":"\u5353\u8d44\u8499\u94f6\u6751\u9547\u94f6\u884c","PQHSCZYH":"\u8d44\u6eaa\u4e5d\u94f6\u6751\u9547\u94f6\u884c","PXXDHHCB":"\u840d\u4e61\u6e58\u4e1c\u9ec4\u6d77\u6751\u9547\u94f6\u884c","XMRCB":"\u53a6\u95e8\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZYRCU":"\u8d44\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJCNRCC":"\u6d59\u6c5f\u82cd\u5357\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJTLHFCZYH":"\u798f\u5efa\u5c24\u6eaa\u6210\u529f\u6751\u9547\u94f6\u884c","HNLHRCB":"\u6e56\u5357\u9686\u56de\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","ZPMSCZYH":"\u4e91\u5357\u897f\u5c71\u5317\u94f6\u6751\u9547\u94f6\u884c","ZJCAJXCZYH":"\u6c38\u5409\u5409\u5e86\u6751\u9547\u94f6\u884c","WXZYFDCZYH":"\u9075\u4e49\u7ea2\u82b1\u5c97\u5bcc\u6c11\u6751\u9547\u94f6\u884c","WXXJRCZYH":"\u6d59\u6c5f\u65b0\u660c\u6d66\u53d1\u6751\u9547\u94f6\u884c","ZYXCQRCB":"\u5de6\u4e91\u53bf\u957f\u9752\u6751\u9547\u94f6\u884c","ZQYYHFCZYH":"\u91cd\u5e86\u4e91\u9633\u6052\u4e30\u6751\u9547\u94f6\u884c","DLB":"\u5927\u8fde\u94f6\u884c","YNSPBYCZYH":"\u5e7f\u6c34\u695a\u519c\u5546\u6751\u9547\u94f6\u884c","LCXEBYRCC":"\u51c9\u57ce\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JSDFJNCZYH":"\u4e34\u6c5f\u86df\u94f6\u6751\u9547\u94f6\u884c","SYXDXIRCC":"\u5c1a\u4e49\u53bf\u519c\u6751\u4fe1\u7528\u8054\u793e","WLTQQDZCZYH":"\u4e4c\u62c9\u7279\u524d\u65d7\u5927\u4f17\u6751\u9547\u94f6\u884c","XSXQMXRCC":"\u4e60\u6c34\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","JMDBHMCZYH":"\u5b9c\u57ce\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","ZJPARCC":"\u6d59\u6c5f\u78d0\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJNX":"\u6d59\u6c5f\u519c\u5546\u8054\u5408\u94f6\u884c","BOCFCB":"\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","ZZXGLJRCC":"\u6893\u6f7c\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJTZHYHSCZYH":"\u5409\u6797\u4e30\u6ee1\u60e0\u6c11\u6751\u9547\u94f6\u884c","JXGZYZCB":"\u6c5f\u897f\u8d63\u5dde\u94f6\u5ea7\u6751\u9547\u94f6\u884c\uff08\u4e0b\u7ebf\uff09","FJTNJNSCZYH":"\u5e73\u51c9\u5d06\u5cd2\u878d\u5174\u6751\u9547\u94f6\u884c","WCLJCPQCWWQ":"\u592a\u539f\u5e02\u5c16\u8349\u576a\u533a\u67f4\u6751\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","XMTANYCZYH":"\u53a6\u95e8\u540c\u5b89\u519c\u94f6\u6751\u9547\u94f6\u884c","ZNXPNURCC":"\u5353\u5c3c\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","ZJZJRCC":"\u6d59\u6c5f\u8bf8\u66a8\u519c\u6751\u5546\u4e1a\u94f6\u884c","QSBANK":"\u6dc4\u535a\u5e02\u5546\u4e1a\u94f6\u884c","ZQWZJXCZYH":"\u5929\u6c34\u9ea6\u79ef\u878d\u5174\u6751\u9547\u94f6\u884c","ZSXGLKRCC":"\u949f\u5c71\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZWXHETRCC":"\u5f70\u6b66\u53bf\u54c8\u5c14\u5957\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","ZKXLHBRCC":"\u9547\u5eb7\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ICBCMA":"\u4e2d\u56fd\u5de5\u5546\u94f6\u884c\uff08\u6fb3\u95e8\uff09","XWJHCZYH":"\u949f\u7965\u6c11\u751f\u6751\u9547\u94f6\u884c","JSDHZZYXRCJ":"\u51c6\u683c\u5c14\u65d7\u5305\u5546\u6751\u9547\u94f6\u884c","ZCXMYSRCC":"\u5b50\u957f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZLQHZCZYH":"\u6b63\u84dd\u65d7\u6c47\u6cfd\u6751\u9547\u94f6\u884c","ZJWZLCRCC":"\u6d59\u6c5f\u6e29\u5dde\u9e7f\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJTLRCC":"\u6d59\u6c5f\u6850\u5e90\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJFYRCC":"\u6d59\u6c5f\u5bcc\u9633\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZYXZKRCC":"\u5c71\u897f\u7701\u5415\u6881\u5e02\u4e2d\u9633\u53bf\u679d\u67ef\u519c\u6751\u4fe1\u7528\u793e","QDPDHMCZYH":"\u4e07\u5b89\u6d2a\u90fd\u6751\u9547\u94f6\u884c","ZQXCGKGBRCC":"\u821f\u66f2\u53bf\u57ce\u5173\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","ZHLXCZYH":"\u8d5e\u7687\u9686\u5174\u6751\u9547\u94f6\u884c","ZZXMFNRCC":"\u5353\u8d44\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZQXRCC":"\u821f\u66f2\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJYKNYCZYH":"\u6d59\u6c5f\u6c38\u5eb7\u519c\u94f6\u6751\u9547\u94f6\u884c","ZZTMYCZYH":"\u5d69\u660e\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","ZJWYJXCZYH":"\u9547\u6c5f\u6da6\u5dde\u957f\u6c5f\u6751\u9547\u94f6\u884c","ZQQJYZCZYH":"\u4e4c\u6d77\u5343\u91cc\u5c71\u6cb3\u5957\u6751\u9547\u94f6\u884c","XACAWXRCC":"\u897f\u5b89\u5e02\u957f\u5b89\u533a\u4e94\u661f\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","TEIBC":"\u4e2d\u56fd\u8fdb\u51fa\u53e3\u94f6\u884c","ZQCKZYFDCZYH":"\u5929\u6c34\u5e02\u79e6\u5b89\u4f17\u4fe1\u6751\u9547\u94f6\u884c","ZWXSCZYH":"\u5b89\u987a\u897f\u79c0\u5bcc\u6c11\u6751\u9547\u94f6\u884c","ESXFCB":"\u6069\u65bd\u5174\u798f\u6751\u9547\u94f6\u884c","GJSRCC":"\u4e2a\u65e7\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZYXZQCRCC":"\u4e2d\u9633\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZZSJRCU":"\u90d1\u5dde\u5e02\u5e02\u90ca\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","HTBJHCZYH":"\u6dc4\u535a\u6dc4\u5ddd\u5317\u6d77\u6751\u9547\u94f6\u884c","QFZYFDCZYH":"\u547c\u56fe\u58c1\u6d25\u6c47\u6751\u9547\u94f6\u884c","HNCYRCC":"\u6cb3\u5357\u957f\u57a3\u519c\u6751\u5546\u4e1a\u94f6\u884c","FJPTYNSCZYH":"\u84dd\u7530\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","ZQDZHFCZYH":"\u5c71\u4e1c\u6881\u5c71\u6c11\u4e30\u6751\u9547\u94f6\u884c","SYSSQRCC":"\u53cc\u9e2d\u5c71\u5e02\u5e02\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXTLRCC":"\u5c71\u897f\u5c6f\u7559\u519c\u6751\u5546\u4e1a\u94f6\u884c","XACAMWRCC":"\u897f\u5b89\u5e02\u957f\u5b89\u533a\u9a6c\u738b\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","YLZCCB":"\u7b60\u8fde\u4e2d\u6210\u6751\u9547\u94f6\u884c","CITICTY":"\u4e2d\u4fe1\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8\u592a\u539f\u5206\u884c","MSB":"\u73e0\u6d77\u5357\u901a\u94f6\u884c","ZJCSRCC":"\u6d59\u6c5f\u5e38\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJLXYSCZYH":"\u6d59\u6c5f\u5170\u6eaa\u8d8a\u5546\u6751\u9547\u94f6\u884c","ZQXCGLPHRCC":"\u821f\u66f2\u53bf\u63d2\u5c97\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","ZBZCRCC":"\u6dc4\u535a\u6dc4\u5ddd\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJRZCJCZYH":"\u5b89\u5fbd\u7075\u74a7\u672c\u5bcc\u6751\u9547\u94f6\u884c","ASRCB":"\u978d\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","DHDYCZYH":"\u5fb7\u60e0\u6566\u94f6\u6751\u9547\u94f6\u884c","FSYYCZYH":"\u629a\u677e\u6986\u94f6\u6751\u9547\u94f6\u884c","FJWYSRCC":"\u798f\u5efa\u6b66\u5937\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","GSBANK":"\u7518\u8083\u94f6\u884c","HNZPRCC":"\u6cb3\u5357\u9547\u5e73\u519c\u6751\u5546\u4e1a\u94f6\u884c","HNHXEDTRCC":"\u6cb3\u5357\u6ed1\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","JXYDRCC":"\u6c5f\u897f\u4e8e\u90fd\u519c\u6751\u5546\u4e1a\u94f6\u884c","JLHCRCB":"\u5409\u6797\u73af\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","STLHCJCZYH":"\u5170\u5dde\u4e03\u91cc\u6cb3\u65b0\u534e\u6751\u9547\u94f6\u884c","LCXRLNRCC":"\u9686\u660c\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","NCXRCC":"\u5357\u57ce\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","NBBLRCC":"\u5b81\u6ce2\u5317\u4ed1\u519c\u6751\u5546\u4e1a\u94f6\u884c","SXZXRCC":"\u5c71\u897f\u7edb\u53bf\u519c\u6751\u5546\u4e1a\u94f6\u884c","GDEPHFCZYH":"\u571f\u9ed8\u7279\u53f3\u65d7\u8499\u94f6\u6751\u9547\u94f6\u884c","GXLZAQSRCC":"\u5e7f\u897f\u9f99\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c","WQHRCZYH":"\u6c6a\u6e05\u548c\u6da6\u6751\u9547\u94f6\u884c","XJFKRCC":"\u65b0\u7586\u961c\u5eb7\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZQFDHFCZYH":"\u5468\u5b81\u523a\u6850\u7ea2\u6751\u9547\u94f6\u884c","ZYZYCB":"\u6fee\u9633\u4e2d\u539f\u6751\u9547\u94f6\u884c","MQDSCZYH":"\u5929\u6d25\u5e02\u84df\u5dde\u6751\u9547\u94f6\u884c","WLBHK":"\u6c38\u9686\u94f6\u884c","ZJCXRCC":"\u6d59\u6c5f\u957f\u5174\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJYHDSCZYH":"\u4e5d\u53f0\u9f99\u5609\u6751\u9547\u94f6\u884c","TVKESSQNRTY":"\u9f50\u9f50\u54c8\u5c14\u5e02\u5e02\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WXXDSJRCC":"\u5a01\u4fe1\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","WRXCBRCC":"\u4e07\u8363\u53bf\u57ce\u5317\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","YBRCC":"\u5ef6\u8fb9\u519c\u5546\u884c","ZLQRCC":"\u6b63\u84dd\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJWZDTRCC":"\u6d59\u6c5f\u6e29\u5dde\u6d1e\u5934\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZZRCC":"\u67a3\u5e84\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZZRCB":"\u682a\u6d32\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJPHGYCZYH":"\u6df1\u5733\u7f57\u6e56\u84dd\u6d77\u6751\u9547\u94f6\u884c","LFXSHCZYH":"\u5ef6\u5bff\u878d\u5174\u6751\u9547\u94f6\u884c","ZLTSRCC":"\u624e\u5170\u5c6f\u5e02\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZSEBANK":"\u4e2d\u5c71\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJKWQ":"\u5f20\u5bb6\u53e3\u4e07\u5168\u5bb6\u94f6\u6751\u9547\u94f6\u884c","ZJYHLHCZYXZBL":"\u679d\u6c5f\u6c49\u94f6\u6751\u9547\u94f6\u884c","ZWXMRSRCC":"\u5f70\u6b66\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZXHNSCZYH":"\u6fa7\u53bf\u6caa\u519c\u5546\u6751\u9547\u94f6\u884c","ZJLARCC":"\u6d59\u6c5f\u4e34\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJJRCB":"\u5f20\u5bb6\u754c\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","ZWXHXQRCC":"\u5f70\u6b66\u53bf\u540e\u65b0\u79cb\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e","GXYHGMCZYH":"\u957f\u6625\u4e8c\u9053\u519c\u5546\u6751\u9547\u94f6\u884c","HCZYFDCZYH":"\u6d59\u6c5f\u9042\u660c\u5bcc\u6c11\u6751\u9547\u94f6\u884c","NXNDBFCZYH":"\u6d59\u6c5f\u6850\u4e61\u6c11\u6cf0\u6751\u9547\u94f6\u884c","NYWLQRCC":"\u5357\u9633\u5e02\u5367\u9f99\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJYKRCC":"\u6d59\u6c5f\u6c38\u5eb7\u519c\u6751\u5546\u4e1a\u94f6\u884c","CZCB":"\u6d59\u6c5f\u7a20\u5dde\u5546\u4e1a\u94f6\u884c","LSXHMCZYH":"\u6d59\u6c5f\u4f59\u676d\u5fb7\u5546\u6751\u9547\u94f6\u884c","DSQRCB":"\u8fbd\u5b81\u5927\u77f3\u6865\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","XFCZYH":"\u5174\u798f\u6751\u9547\u94f6\u884c","QJHZCJCZYH":"\u5fd7\u4e39\u6c11\u751f\u6751\u9547\u94f6\u884c","ZHRXCZYH":"\u7d2b\u4e91\u5bcc\u6c11\u6751\u9547\u94f6\u884c","ZJTTRCC":"\u6d59\u6c5f\u5929\u53f0\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZDXDKKRCC":"\u5fd7\u4e39\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZLXKZVRCC":"\u6dbf\u9e7f\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZXJGCZYH":"\u56db\u5ddd\u5317\u5ddd\u7f8c\u65cf\u5bcc\u6c11\u6751\u9547\u94f6\u884c","ZJYWLHCZYH":"\u6d59\u6c5f\u4e49\u4e4c\u8054\u5408\u6751\u9547\u94f6\u884c","ZSDHHYRCC":"\u6d59\u6c5f\u821f\u5c71\u5b9a\u6d77\u6d77\u6d0b\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZYYJRCC":"\u8d44\u9633\u96c1\u6c5f\u519c\u6751\u5408\u4f5c\u94f6\u884c","ZYXUHVRCC":"\u9547\u8fdc\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZSXKLERCC":"\u4f3d\u5e08\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","SXHYRCC":"\u9655\u897f\u6c49\u9634\u519c\u6751\u5546\u4e1a\u94f6\u884c","RCXNSCZYH":"\u77f3\u9621\u957f\u5f81\u6751\u9547\u94f6\u884c","TJBZPFCZYH":"\u6587\u5c71\u4e18\u5317\u957f\u6c5f\u6751\u9547\u94f6\u884c","YXIZGXFCZYH":"\u79ed\u5f52\u5174\u798f\u6751\u9547\u94f6\u884c","YGHTCZYH":"\u6d59\u6c5f\u5b89\u5409\u4ea4\u94f6\u6751\u9547\u94f6\u884c","YKRCB":"\u8425\u53e3\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZGSZXRCC":"\u81ea\u8d21\u5e02\u4e2d\u65b0\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJKCCB":"\u5f20\u5bb6\u53e3\u94f6\u884c","ZJCARCC":"\u6d59\u6c5f\u6df3\u5b89\u519c\u6751\u5546\u4e1a\u94f6\u884c","GPSTXCZYH":"\u679e\u9633\u6cf0\u4e1a\u6751\u9547\u94f6\u884c","GSZCZYFDCZYH":"\u6d59\u6c5f\u5fb7\u6e05\u6e56\u5546\u6751\u9547\u94f6\u884c","ADBC":"\u4e2d\u56fd\u519c\u4e1a\u53d1\u5c55\u94f6\u884c","ZJWZLWRCC":"\u6d59\u6c5f\u6e29\u5dde\u9f99\u6e7e\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZAZYFDCZYH":"\u6b63\u5b89\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","BOZK":"\u5468\u53e3\u94f6\u884c","ZQSYYRXCZYH":"\u5f00\u539f\u8c61\u7259\u5c71\u6751\u9547\u94f6\u884c","LNBQNFRCB":"\u8fbd\u5b81\u672c\u6eaa\u5357\u82ac\u519c\u6751\u5546\u4e1a\u94f6\u884c","QJZYFDCNZH":"\u6f5c\u6c5f\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","ZZZYFDCB":"\u9547\u8d49\u4e2d\u94f6\u5bcc\u767b\u6751\u9547\u94f6\u884c","ZJQTRCC":"\u6d59\u6c5f\u9752\u7530\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJYJHSCZYH":"\u5409\u5b89\u7a20\u5dde\u6751\u9547\u94f6\u884c","AHJZJHCZYH":"\u5357\u4eac\u516d\u5408\u4e5d\u94f6\u6751\u9547\u94f6\u884c","ZJXJRCC":"\u6d59\u6c5f\u4ed9\u5c45\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZGEQRCC":"\u51c6\u683c\u5c14\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJKRCB":"\u5f20\u5bb6\u53e3\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJHYRCC":"\u6d59\u6c5f\u6d77\u76d0\u519c\u6751\u5546\u4e1a\u94f6\u884c","GSXGJCCZYH":"\u6d59\u6c5f\u6e29\u5cad\u8054\u5408\u6751\u9547\u94f6\u884c","CCBEPAY":"\u4e2d\u56fd\u5efa\u8bbe\u94f6\u884c\u4e0a\u6d77\u5206\u884c\u5361\u901a","ZJYWRCC":"\u6d59\u6c5f\u4e49\u4e4c\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJHCRCC":"\u6d59\u6c5f\u79be\u57ce\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZJHNRCC":"\u6d59\u6c5f\u6d77\u5b81\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZHHQCZYH":"\u73e0\u6d77\u6a2a\u7434\u6751\u9547\u94f6\u884c","ZJTSRCC":"\u6d59\u6c5f\u6cf0\u987a\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZXBQRCC":"\u6b63\u9576\u767d\u65d7\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","BZMD":"\u9a7b\u9a6c\u5e97\u94f6\u884c","ZSXLCZB":"\u4e2d\u5c71\u5c0f\u6984\u6751\u9547\u94f6\u884c","CHEYYQQMYCZYH":"\u8d44\u5174\u6d66\u53d1\u6751\u9547\u94f6\u884c","ZGSDAQRCC":"\u81ea\u8d21\u5e02\u5927\u5b89\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZYBZHLCZYH":"\u9075\u4e49\u64ad\u5dde\u6c47\u9686\u6751\u9547\u94f6\u884c","ZGYTRCC":"\u81ea\u8d21\u5e02\u6cbf\u6ee9\u533a\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u793e\u8054\u5408\u793e","ZPXODDRCC":"\u6f33\u6d66\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJSCFMCZYH":"\u957f\u9633\u5174\u798f\u6751\u9547\u94f6\u884c","WJXHCZYH":"\u6d59\u6c5f\u5b9a\u6d77\u5fb7\u5546\u6751\u9547\u94f6\u884c","ZZXMVWRCC":"\u8d44\u4e2d\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZNXINIRCC":"\u9547\u5b81\u5e03\u4f9d\u65cf\u82d7\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJCHZRCC":"\u5f20\u5bb6\u5ddd\u56de\u65cf\u81ea\u6cbb\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJWCRCC":"\u6d59\u6c5f\u6587\u6210\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZHXIHHRCC":"\u653f\u548c\u53bf\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZJWYRCC":"\u6d59\u6c5f\u6b66\u4e49\u519c\u6751\u5546\u4e1a\u94f6\u884c","ZYB":"\u4e2d\u539f\u94f6\u884c","ZJPJJYCZYH":"\u6d59\u6c5f\u6d66\u6c5f\u5609\u94f6\u6751\u9547\u94f6\u884c","ZZNCB":"\u90d1\u5dde\u519c\u6751\u5546\u4e1a\u94f6\u884c\u80a1\u4efd\u6709\u9650\u516c\u53f8","SYESHZCCZYH":"\u682a\u6d32\u53bf\u878d\u5174\u6751\u9547\u94f6\u884c","ZYXPCZCB":"\u9075\u4e49\u65b0\u84b2\u957f\u5f81\u6751\u9547\u94f6\u884c","ZGEMTRCC":"\u51c6\u683c\u5c14\u7164\u7530\u519c\u6751\u4fe1\u7528\u5408\u4f5c\u8054\u793e","ZQLJRCC":"\u821f\u66f2\u53bf\u7acb\u8282\u519c\u6751\u4fe1\u7528\u793e","BOCMA":"\u4e2d\u56fd\u94f6\u884c\u6fb3\u95e8\u5206\u884c","BOCHK":"\u4e2d\u94f6\u9999\u6e2f","CCBHK":"\u4e2d\u56fd\u5efa\u8bbe\u94f6\u884c\uff08\u4e9a\u6d32\uff09"} \ No newline at end of file diff --git a/plugin/utility/bankcard/index.html b/plugin/utility/bankcard/index.html new file mode 100644 index 0000000..6668a7b --- /dev/null +++ b/plugin/utility/bankcard/index.html @@ -0,0 +1,96 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ 银行卡归属地查询 +
+
+ +
+ +
+
+ +
+
+ +
+
+{/block} +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/plugin/utility/bili_danmu/App.php b/plugin/utility/bili_danmu/App.php new file mode 100644 index 0000000..9067668 --- /dev/null +++ b/plugin/utility/bili_danmu/App.php @@ -0,0 +1,103 @@ +view(); + } + + public function query(){ + $video_url = input('post.video_url', null, 'trim'); + $danmu_kw = input('post.danmu_kw', null, 'trim'); + if(!$video_url) return msg('error','视频链接不能为空'); + + $vid = $video_url; + $type = 'ugc'; + $page = 1; + if(strpos($video_url,'http://')!==false || strpos($video_url,'https://')!==false){ + if(preg_match('!/BV(\w+)!i',$video_url,$match)){ + $vid = 'BV'.$match[1]; + $querystring = 'bvid='.$vid; + }elseif(preg_match('!/av(\d{1,})!',$video_url,$match)){ + $vid = $match[1]; + $querystring = 'aid='.$vid; + }elseif(preg_match('!/ep(\d{1,})!',$video_url,$match)){ + $vid = $match[1]; + $type = 'pgc'; + if(strpos($video_url,'/cheese/')!==false){ + $type = 'pugv'; + } + }elseif(preg_match('!/ss(\d{1,})!',$video_url,$match)){ + $vid = $match[1]; + $type = 'pgc_ss'; + }else{ + return msg('error','视频链接输入格式错误'); + } + if($type == 'ugc' && preg_match('!p=(\d{1,})!',$video_url,$match)){ + $page = $match[1]; + } + }else{ + if(substr($vid,0,2) == 'av' && is_numeric(substr($vid,2))){ + $querystring = 'aid='.substr($vid,2); + }elseif(substr($vid,0,2) == 'ep' && is_numeric(substr($vid,2))){ + $vid = substr($vid,2); + $type = 'pgc'; + }elseif(substr($vid,0,2) == 'ss' && is_numeric(substr($vid,2))){ + $vid = substr($vid,2); + $type = 'pgc_ss'; + }elseif(substr($vid,0,2) == 'BV' && preg_match('/^[a-zA-Z0-9]+$/',$vid)){ + $querystring = 'bvid='.$vid; + }else{ + return msg('error','视频链接输入格式错误'); + } + } + + $bilibili = new BilibiliHelper(); + try{ + if($type == 'pgc'){ + $video_info = $bilibili->pgc_video_info($vid); + }elseif($type == 'pgc_ss'){ + $video_info = $bilibili->pgc_video_info_by_ssid($vid); + }elseif($type == 'pugv'){ + $video_info = $bilibili->pugv_video_info($vid); + }else{ + $video_info = $bilibili->ugc_video_info($querystring); + if(count($video_info['pages']) > 1){ + foreach($video_info['pages'] as $pagerow){ + if($page == $pagerow['page']){ + $video_info['cid'] = $pagerow['cid']; + continue; + } + } + } + } + $result = $bilibili->get_video_comment($video_info['cid']); + + $danmu_list = []; + foreach($result as $row){ + if(!empty($danmu_kw)){ + if(strpos($row['#text'], $danmu_kw)===false) continue; + } + $arr = explode(',',$row['p']); + $danmu_list[] = ['time'=>$arr[0],'content'=>$row['#text'],'hash'=>$arr[6]]; + } + array_multisort(array_column($danmu_list, 'time'), SORT_ASC, $danmu_list); + + return msg('ok','success', $danmu_list); + + }catch(\Exception $e){ + return msg('error',$e->getMessage()); + } + } + +} diff --git a/plugin/utility/bili_danmu/index.html b/plugin/utility/bili_danmu/index.html new file mode 100644 index 0000000..1891cc3 --- /dev/null +++ b/plugin/utility/bili_danmu/index.html @@ -0,0 +1,166 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ 查B站弹幕发送者 +
+ +
+
+
+
+
视频链接
+ +
+
+
+
+
弹幕关键词
+ +
+
+ + +
+
+
+
+
加密的mid
+ +
+
+
+ + +
+
+ +
+
+
+
+
工具说明
+
+

使用此工具可查询B站视频弹幕的真实发送者

+
+
+
+
+
+ +{/block} +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/plugin/utility/bili_video/App.php b/plugin/utility/bili_video/App.php new file mode 100644 index 0000000..4b2389d --- /dev/null +++ b/plugin/utility/bili_video/App.php @@ -0,0 +1,157 @@ +view(); + } + + public function test(){ + $bilibili = new BilibiliHelper(); + $play_info = $bilibili->pgc_video_parse_tv('7419870', '12131254', '97499'); + return json($play_info); + } + + public function query(){ + $video_url = input('post.video_url', null, 'trim'); + if(!$video_url) return msg('error','视频链接不能为空'); + + $vid = $video_url; + $type = 'ugc'; + $page = 1; + if(strpos($video_url,'http://')!==false || strpos($video_url,'https://')!==false){ + if(preg_match('!/BV(\w+)!i',$video_url,$match)){ + $vid = 'BV'.$match[1]; + $querystring = 'bvid='.$vid; + }elseif(preg_match('!/av(\d{1,})!',$video_url,$match)){ + $vid = $match[1]; + $querystring = 'aid='.$vid; + }elseif(preg_match('!/ep(\d{1,})!',$video_url,$match)){ + $vid = $match[1]; + $type = 'pgc'; + if(strpos($video_url,'/cheese/')!==false){ + $type = 'pugv'; + } + }elseif(preg_match('!/ss(\d{1,})!',$video_url,$match)){ + $vid = $match[1]; + $type = 'pgc_ss'; + }elseif(preg_match('!/au(\d{1,})!',$video_url,$match)){ + $vid = $match[1]; + $type = 'audio'; + }else{ + return msg('error','视频链接输入格式错误'); + } + if($type == 'ugc' && preg_match('!p=(\d{1,})!',$video_url,$match)){ + $page = $match[1]; + } + }else{ + if(substr($vid,0,2) == 'av' && is_numeric(substr($vid,2))){ + $querystring = 'aid='.substr($vid,2); + }elseif(substr($vid,0,2) == 'ep' && is_numeric(substr($vid,2))){ + $vid = substr($vid,2); + $type = 'pgc'; + }elseif(substr($vid,0,2) == 'ss' && is_numeric(substr($vid,2))){ + $vid = substr($vid,2); + $type = 'pgc_ss'; + }elseif(substr($vid,0,2) == 'BV' && preg_match('/^[a-zA-Z0-9]+$/',$vid)){ + $querystring = 'bvid='.$vid; + }elseif(substr($vid,0,2) == 'au' && is_numeric(substr($vid,2))){ + $vid = substr($vid,2); + $type = 'audio'; + }else{ + return msg('error','视频链接输入格式错误'); + } + } + + $bilibili = new BilibiliHelper(); + try{ + if($type == 'ugc'){ + $video_info = $bilibili->ugc_video_info($querystring); + $link = 'https://www.bilibili.com/video/'.$video_info['bvid']; + if(count($video_info['pages']) > 1){ + foreach($video_info['pages'] as $pagerow){ + if($page == $pagerow['page']){ + $video_info['cid'] = $pagerow['cid']; + $video_info['duration'] = $pagerow['duration']; + $video_info['title'] .= ' - '.$pagerow['part']; + $link .= '?p='.$page; + continue; + } + } + } + $play_info = $bilibili->get_video_url($video_info['aid'], $video_info['cid']); + + $result = [ + 'type' => 0, + 'aid' => $video_info['aid'], + 'cid' => $video_info['cid'], + 'bvid' => $video_info['bvid'], + 'link' => $link, + 'danmu' => 'https://comment.bilibili.com/'.$video_info['cid'].'.xml', + 'title' => $video_info['title'], + 'desc' => $video_info['desc'], + 'pic' => $video_info['pic'], + 'duration' => $video_info['duration'], + 'owner' => isset($video_info['owner'])?$video_info['owner']:null, + 'video' => $play_info, + ]; + }elseif($type == 'pgc' || $type == 'pgc_ss'){ + $video_info = $type == 'pgc_ss' ? $bilibili->pgc_video_info_by_ssid($vid) : $bilibili->pgc_video_info($vid); + + $result = [ + 'type' => 0, + 'aid' => $video_info['aid'], + 'cid' => $video_info['cid'], + 'bvid' => $video_info['bvid'], + 'link' => $video_info['link'], + 'danmu' => 'https://comment.bilibili.com/'.$video_info['cid'].'.xml', + 'title' => $video_info['share_copy'], + 'desc' => null, + 'pic' => $video_info['cover'], + 'duration' => $video_info['duration'], + 'owner' => false, + 'video' => false, + ]; + }elseif($type == 'audio'){ + $audio_info = $bilibili->get_audio_info($vid); + $link = 'https://www.bilibili.com/audio/au'.$audio_info['id']; + $play_info = $bilibili->get_audio_url($audio_info['id']); + + $result = [ + 'type' => 1, + 'aid' => $audio_info['id'], + 'link' => $link, + 'lyric' => $audio_info['lyric'], + 'title' => $audio_info['title'], + 'desc' => $audio_info['intro'], + 'pic' => $audio_info['cover'], + 'duration' => $audio_info['duration'], + 'owner' => ['mid'=>$audio_info['uid'], 'name'=>$audio_info['uname']], + 'video' => $play_info, + ]; + }else{ + return msg('error','该视频类型不支持在线解析'); + } + + return msg('ok', 'success', $result); + + }catch(\Exception $e){ + return msg('error',$e->getMessage()); + } + + + + + } + +} \ No newline at end of file diff --git a/plugin/utility/bili_video/index.html b/plugin/utility/bili_video/index.html new file mode 100644 index 0000000..749b9f6 --- /dev/null +++ b/plugin/utility/bili_video/index.html @@ -0,0 +1,205 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} +
+
+
+
+
+ B站视频解析 +
+
+
+
视频链接
+ +
+
+ +
+
+ + +
+
+{/block} +{block name="script"} + + + +{/block} \ No newline at end of file diff --git a/plugin/utility/emoji/App.php b/plugin/utility/emoji/App.php new file mode 100644 index 0000000..96356df --- /dev/null +++ b/plugin/utility/emoji/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/utility/emoji/index.html b/plugin/utility/emoji/index.html new file mode 100644 index 0000000..7443c8b --- /dev/null +++ b/plugin/utility/emoji/index.html @@ -0,0 +1,1519 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+ emoji表情 +
+
如需搜索中文, 请点击 + + 后按 Ctrl+F 搜索。 +
+
+ 面部表情: +
    +
  • 😀笑嘻嘻
  • +
  • 😁笑嘻嘻的脸,含笑的眼睛
  • +
  • 😂脸上带着喜悦的泪水
  • +
  • 😃开口笑脸
  • +
  • 😄开口笑脸和微笑的眼睛
  • +
  • 😅笑脸淌冷汗
  • +
  • 😆开口笑紧闭的眼睛
  • +
  • 😉眨眼表情
  • +
  • 😊面带微笑的眼睛
  • +
  • 😋品尝美味食物表情
  • +
  • 😎太阳镜笑脸
  • +
  • 😍面带心形眼睛
  • +
  • 😘飞吻表情
  • +
  • 😗亲吻表情
  • +
  • 😙含笑亲吻表情
  • +
  • 😚闭眼亲吻表情
  • +
  • 笑脸
  • +
  • 😇光环笑脸
  • +
  • 😐中性面
  • +
  • 😑面无表情
  • +
  • 😶没有嘴的脸
  • +
  • 😏傻笑
  • +
  • 😣坚持
  • +
  • 😥失望得到宽慰的脸
  • +
  • 😮张着嘴
  • +
  • 😯安静的脸
  • +
  • 😪
  • +
  • 😫疲惫
  • +
  • 😴熟睡
  • +
  • 😌安心
  • +
  • 😛吐舌头
  • +
  • 😜吐舌头,眨眼眼
  • +
  • 😝闭眼吐舌头
  • +
  • 😒垂头丧气
  • +
  • 😓冷汗
  • +
  • 😔沉思
  • +
  • 😕困惑
  • +
  • 😲惊讶
  • +
  • 😷戴口罩
  • +
  • 😖被打败
  • +
  • 😞失望
  • +
  • 😟忧伤
  • +
  • 😤面带胜利
  • +
  • 😢哭泣的脸
  • +
  • 😭大声哭泣的脸
  • +
  • 😦张嘴哭
  • +
  • 😧痛苦
  • +
  • 😨恐惧
  • +
  • 😬狰狞
  • +
  • 😰淌冷汗
  • +
  • 😱尖叫恐惧
  • +
  • 😳红扑扑的脸蛋
  • +
  • 😵
  • +
  • 😡噘嘴
  • +
  • 😠愤怒
  • +
  • 😈长角的笑脸
  • +
  • 👿恶魔
  • +
  • 👹日本食人魔
  • +
  • 👺日本哥布林
  • +
  • 💀头骨
  • +
  • 骷髅头
  • +
  • 👻
  • +
  • 👽外星异形
  • +
+
+
+ 人物: +
    +
  • 👦男孩
  • +
  • 👧女孩
  • +
  • 👨男人
  • +
  • 👩女人
  • +
  • 👴老年男性
  • +
  • 👵老年女性
  • +
  • 👶宝宝
  • +
  • 👱金发男子
  • +
  • 👮警官
  • +
  • 👲戴瓜皮帽的男子
  • +
  • 👳戴头巾的男人
  • +
  • 👷建筑工人
  • +
  • 👸公主
  • +
  • 💂近卫兵
  • +
  • 🎅圣诞老人
  • +
  • 👰戴面纱的新娘
  • +
  • 👼宝贝天使
  • +
  • 💆面部按摩
  • +
  • 💇理发
  • +
  • 🙍皱眉
  • +
  • 🙎噘嘴
  • +
  • 🙅面对没有良好的姿态
  • +
  • 🙆面对OK的手势
  • +
  • 💁服务台的人
  • +
  • 🙋快乐的人举起一只手
  • +
  • 🙇深鞠躬
  • +
  • 🙌举双手欢庆
  • +
  • 🙏双手合十
  • +
  • 👤胸围剪影
  • +
  • 👥在半身剪影
  • +
  • 🚶行人
  • +
  • 🏃跑步者
  • +
  • 👯兔女郎
  • +
  • 💃舞蹈家
  • +
  • 👫男人和女人手牵着手
  • +
  • 👬两个男人牵手
  • +
  • 👭两个女人牵手
  • +
  • 💏
  • +
  • 💑夫妇重点
  • +
  • 👪家庭
  • +
+ +
+ +
+ 手: +
    +
  • 💪二头肌
  • +
  • 👈指向左边的手指
  • +
  • 👉指向右边的手指
  • +
  • 指向上边的手指
  • +
  • 👆指向上边的手指
  • +
  • 👇指向下边的手指
  • +
  • 胜利手势
  • +
  • 举手,手掌
  • +
  • 👌OK手势
  • +
  • 👍大拇指,称赞
  • +
  • 👎大拇指朝下,鄙视
  • +
  • 举起拳头
  • +
  • 👊击拳
  • +
  • 👋挥手
  • +
  • 👏拍手,鼓掌
  • +
  • 👐张开的双手
  • +
  • 正在写字的手
  • +
+
+
+ 日常: +
    +
  • 👣足迹
  • +
  • 👀眼睛
  • +
  • 👂耳朵
  • +
  • 👃鼻子
  • +
  • 👅舌头
  • +
  • 👄
  • +
  • 💋吻痕
  • +
  • 👓眼镜
  • +
  • 👔领带
  • +
  • 👕T恤
  • +
  • 👖牛仔裤
  • +
  • 👗连衣裙
  • +
  • 👘和服
  • +
  • 👙比基尼泳装
  • +
  • 👚女子服装
  • +
  • 👛钱包
  • +
  • 👜手提包
  • +
  • 👝
  • +
  • 🎒书包
  • +
  • 💼公文包
  • +
  • 👞芒鞋
  • +
  • 👟运动鞋
  • +
  • 👠高跟鞋
  • +
  • 👡女子凉鞋
  • +
  • 👢女子靴
  • +
  • 👑皇冠
  • +
  • 👒女性帽子
  • +
  • 🎩高帽
  • +
  • 🎓毕业帽
  • +
  • 💄口红
  • +
  • 💅指甲油
  • +
  • 💍钻戒
  • +
  • 🌂收拢的伞
  • +
+
+
+ 动物: +
    +
  • 🙈非礼勿视猴
  • +
  • 🙉非礼勿听猴
  • +
  • 🙊非礼勿言猴
  • +
  • 🐵
  • +
  • 🐒猴子
  • +
  • 🐶
  • +
  • 🐕
  • +
  • 🐩贵宾犬
  • +
  • 🐺
  • +
  • 🐱
  • +
  • 😺微笑的猫
  • +
  • 😸笑嘻嘻的猫含笑的眼睛
  • +
  • 😹猫喜悦的泪水
  • +
  • 😻微笑的猫,心形眼睛
  • +
  • 😼苦笑的猫
  • +
  • 😽闭眼亲吻的猫
  • +
  • 🙀疲倦的猫
  • +
  • 😿哭泣的猫
  • +
  • 😾噘嘴的猫
  • +
  • 🐈
  • +
  • 🐯老虎
  • +
  • 🐅老虎
  • +
  • 🐆豹子
  • +
  • 🐴
  • +
  • 🐎
  • +
  • 🐮
  • +
  • 🐂
  • +
  • 🐃水牛
  • +
  • 🐄
  • +
  • 🐷
  • +
  • 🐖
  • +
  • 🐗公猪
  • +
  • 🐽猪鼻子
  • +
  • 🐏绵羊
  • +
  • 🐑
  • +
  • 🐐山羊
  • +
  • 🐪单峰骆驼
  • +
  • 🐫双峰驼
  • +
  • 🐘大象
  • +
  • 🐭老鼠
  • +
  • 🐁老鼠
  • +
  • 🐀老鼠
  • +
  • 🐹仓鼠
  • +
  • 🐰兔子
  • +
  • 🐇兔子
  • +
  • 🐻
  • +
  • 🐨考拉
  • +
  • 🐼熊猫脸
  • +
  • 🐾掌印
  • +
  • 🐔
  • +
  • 🐓公鸡
  • +
  • 🐣刚出壳的小鸡
  • +
  • 🐤小鸡
  • +
  • 🐥小鸡
  • +
  • 🐦
  • +
  • 🐧企鹅
  • +
  • 🐸青蛙
  • +
  • 🐊鳄鱼
  • +
  • 🐢乌龟
  • +
  • 🐍
  • +
  • 🐲
  • +
  • 🐉
  • +
  • 🐳鲸鱼喷水
  • +
  • 🐋
  • +
  • 🐬海豚
  • +
  • 🐟
  • +
  • 🐠热带鱼
  • +
  • 🐡河豚
  • +
  • 🐙章鱼
  • +
  • 🐚
  • +
  • 🐌蜗牛
  • +
  • 🐛臭虫
  • +
  • 🐜蚂蚁
  • +
  • 🐝蜜蜂
  • +
  • 🐞瓢虫
  • +
  • 🦋蝴蝶
  • +
+
+ +
+ 植物: +
    +
  • 💐花束
  • +
  • 🌸樱花
  • +
  • 💮白花
  • +
  • 🌹玫瑰
  • +
  • 🌺槿
  • +
  • 🌻向日葵
  • +
  • 🌼开花
  • +
  • 🌷郁金香
  • +
  • 🌱幼苗
  • +
  • 🌲长青树
  • +
  • 🌳落叶乔木
  • +
  • 🌴棕榈
  • +
  • 🌵仙人掌
  • +
  • 🌾水稻穗
  • +
  • 🌿草本植物
  • +
  • 三叶草
  • +
  • 🍀四叶草
  • +
  • 🍁枫叶
  • +
  • 🍂落叶
  • +
  • 🍃叶子在风中飘落
  • +
+
+ +
+ 饮食: +
    +
  • 🍇葡萄
  • +
  • 🍈
  • +
  • 🍉西瓜
  • +
  • 🍊柑橘
  • +
  • 🍋柠檬
  • +
  • 🍌香蕉
  • +
  • 🍍菠萝
  • +
  • 🍎红苹果
  • +
  • 🍏青苹果
  • +
  • 🍐
  • +
  • 🍑桃子
  • +
  • 🍒樱桃
  • +
  • 🍓草莓
  • +
  • 🍅番茄
  • +
  • 🍆茄子
  • +
  • 🌽玉米
  • +
  • 🍄蘑菇
  • +
  • 🌰板栗
  • +
  • 🍞面包
  • +
  • 🍖排骨
  • +
  • 🍗鸡腿
  • +
  • 🍔汉堡包
  • +
  • 🍟炸薯条
  • +
  • 🍕一片披萨
  • +
  • 🍳煎鸡蛋
  • +
  • 🍲沙锅
  • +
  • 🍱便当盒
  • +
  • 🍘米果
  • +
  • 🍙饭团
  • +
  • 🍚熟米饭
  • +
  • 🍛咖喱饭
  • +
  • 🍜一碗热气腾腾的面条
  • +
  • 🍝意大利面
  • +
  • 🍠烤地瓜
  • +
  • 🍢奥登
  • +
  • 🍣寿司
  • +
  • 🍤炒虾仁
  • +
  • 🍥螺旋图案的炸鱼饼
  • +
  • 🍡一串团子
  • +
  • 🍦软冰淇淋
  • +
  • 🍧刨冰
  • +
  • 🍨冰淇淋
  • +
  • 🍩甜甜圈
  • +
  • 🍪曲奇饼
  • +
  • 🎂生日蛋糕
  • +
  • 🍰
  • +
  • 🍫巧克力
  • +
  • 🍬糖果
  • +
  • 🍭棒棒糖
  • +
  • 🍮卡仕达酱
  • +
  • 🍯蜜罐
  • +
  • 🍼婴儿奶瓶
  • +
  • 热饮料
  • +
  • 🍵茶杯不带提手
  • +
  • 🍶清酒瓶子和杯子
  • +
  • 🍷红酒杯
  • +
  • 🍸鸡尾酒杯
  • +
  • 🍹果汁
  • +
  • 🍺啤酒杯
  • +
  • 🍻啤酒杯碰杯
  • +
  • 🍴刀叉
  • +
+
+ +
+ 文体: +
    +
  • 🎪马戏团的帐篷
  • +
  • 🎭表演艺术
  • +
  • 🎨调色板
  • +
  • 🎰老虎机
  • +
  • 🚣划艇
  • +
  • 🛀浴缸里洗澡
  • +
  • 🎫
  • +
  • 🏆奖杯
  • +
  • 足球
  • +
  • 棒球
  • +
  • 🏀篮球
  • +
  • 🏈美式足球
  • +
  • 🏉橄榄球
  • +
  • 🎾网球
  • +
  • 🎱台球
  • +
  • 🎳保龄球
  • +
  • 旗洞
  • +
  • 🎣钓竿和鱼
  • +
  • 🎽运行衬衫搭配腰带
  • +
  • 🎿滑雪板和滑雪靴
  • +
  • 🏂滑雪板
  • +
  • 🏄冲浪
  • +
  • 🏇骑马
  • +
  • 🏊游泳
  • +
  • 🚴骑自行车
  • +
  • 🚵山地自行车运动员
  • +
  • 🎯射中靶子
  • +
  • 🎮游戏手柄
  • +
  • 🎲骰子
  • +
  • 🎷萨克斯
  • +
  • 🎸吉他
  • +
  • 🎺喇叭
  • +
  • 🎻小提琴
  • +
  • 🎬场记板
  • +
  • 👾外星怪物
  • +
+
+
+ 旅游: +
    +
  • 🌋火山
  • +
  • 🗻富士山
  • +
  • 🏠房屋建筑
  • +
  • 🏡房带花园
  • +
  • 🏢办公楼
  • +
  • 🏣日本邮局
  • +
  • 🏤欧洲邮政局
  • +
  • 🏥医院
  • +
  • 🏦银行
  • +
  • 🏨饭店
  • +
  • 🏩爱情酒店
  • +
  • 🏪便利店
  • +
  • 🏫学校
  • +
  • 🏬百货商店
  • +
  • 🏭工厂
  • +
  • 🏯日本城堡
  • +
  • 🏰欧洲古堡
  • +
  • 💒婚礼
  • +
  • 🗼东京塔
  • +
  • 🗽自由女神像
  • +
  • 教堂
  • +
  • 喷泉
  • +
  • 🌁
  • +
  • 🌃夜晚的星星
  • +
  • 🌆黄昏时的城市风光
  • +
  • 🌇日落建筑物
  • +
  • 🌉晚上的桥
  • +
  • 🌌银河
  • +
  • 🎠旋转木马
  • +
  • 🎡摩天轮
  • +
  • 🎢过山车
  • +
  • 🚂蒸汽机车
  • +
  • 🚃有轨电车
  • +
  • 🚄高速火车
  • +
  • 🚅高速子弹头列车
  • +
  • 🚆火车
  • +
  • 🚇地铁
  • +
  • 🚈轻轨列车
  • +
  • 🚉火车站
  • +
  • 🚊电车
  • +
  • 🚝单轨
  • +
  • 🚞山区铁路
  • +
  • 🚋电车
  • +
  • 🚌公交车
  • +
  • 🚍迎面而来的公交车
  • +
  • 🚎电车
  • +
  • 🚏公交车站
  • +
  • 🚐小巴
  • +
  • 🚑救护车
  • +
  • 🚒消防车
  • +
  • 🚓警车
  • +
  • 🚔迎面而来的警车
  • +
  • 🚕出租车
  • +
  • 🚖迎面而来的出租车
  • +
  • 🚗汽车
  • +
  • 🚘迎面而来的汽车
  • +
  • 🚚送货车
  • +
  • 🚛拖车
  • +
  • 🚜拖拉机
  • +
  • 🚲自行车
  • +
  • 加油站
  • +
  • 🚨警车旋转灯
  • +
  • 🚥横向交通灯
  • +
  • 🚦垂直交通灯
  • +
  • 🚧建筑符号
  • +
  • +
  • 帆船
  • +
  • 🚣划艇
  • +
  • 🚤快艇
  • +
  • 🚢
  • +
  • 飞机
  • +
  • 💺座位
  • +
  • 🚁直升机
  • +
  • 🚟高架铁路
  • +
  • 🚠缆车
  • +
  • 🚡空中缆车
  • +
  • 🚀火箭
  • +
  • 🎑赏月仪式
  • +
  • 🗿摩艾
  • +
  • 🛂护照控制
  • +
  • 🛃海关
  • +
  • 🛄行李认领
  • +
  • 🛅左行李
  • +
+
+
+ 物品: +
    +
  • 💌情书
  • +
  • 💎宝石
  • +
  • 🔪厨房用刀
  • +
  • 💈理发店招牌
  • +
  • 🚪
  • +
  • 🚽厕所
  • +
  • 🚿淋浴
  • +
  • 🛁浴缸
  • +
  • 沙漏
  • +
  • 沙流动的沙漏
  • +
  • +
  • 闹钟
  • +
  • 🎈气球
  • +
  • 🎉派对彩带
  • +
  • 🎊五彩纸屑球
  • +
  • 🎎日本娃娃
  • +
  • 🎏鲤鱼旗
  • +
  • 🎐风铃
  • +
  • 🎀色带
  • +
  • 🎁包装好的礼物
  • +
  • 📯邮政号角
  • +
  • 📻收音机
  • +
  • 📱移动电话
  • +
  • 📲箭头指向左的手机
  • +
  • 黑色电话
  • +
  • 📞电话话筒
  • +
  • 📟呼叫器
  • +
  • 📠传真机
  • +
  • 🔋电池
  • +
  • 🔌插头
  • +
  • 💻个人电脑
  • +
  • 💽迷你光碟
  • +
  • 💾软盘
  • +
  • 💿光盘
  • +
  • 📀DVD
  • +
  • 🎥摄像机
  • +
  • 📺电视
  • +
  • 📷相机
  • +
  • 📹录影机
  • +
  • 📼录像带
  • +
  • 🔍向左的放大镜
  • +
  • 🔎向右的放大镜
  • +
  • 🔬显微镜
  • +
  • 🔭望远镜
  • +
  • 📡卫星天线
  • +
  • 💡电灯泡
  • +
  • 🔦手电筒
  • +
  • 🏮居酒屋灯笼
  • +
  • 📔护套笔记本
  • +
  • 📕合上的书
  • +
  • 📖打开的书
  • +
  • 📗绿皮书
  • +
  • 📘蓝皮书
  • +
  • 📙黄皮书
  • +
  • 📚图书
  • +
  • 📓笔记本
  • +
  • 📃页面卷曲
  • +
  • 📜卷轴
  • +
  • 📄页面朝上
  • +
  • 📰报纸
  • +
  • 📑书签标签
  • +
  • 🔖书签
  • +
  • 💰钱袋子
  • +
  • 💴日元
  • +
  • 💵美元
  • +
  • 💶欧元
  • +
  • 💷英镑
  • +
  • 💸带翅膀的钱
  • +
  • 💳信用卡
  • +
  • 信封
  • +
  • 📧电子邮件符号
  • +
  • 📨新邮件
  • +
  • 📩箭头向下的信封
  • +
  • 📤发件箱托盘
  • +
  • 📥收件箱托盘
  • +
  • 📦包裹
  • +
  • 📫标志上位的关闭邮箱
  • +
  • 📪标志下位的关闭邮箱
  • +
  • 📬标志上位的打开邮箱
  • +
  • 📭标志下位的打开邮箱
  • +
  • 📮邮箱
  • +
  • 铅笔
  • +
  • 黑色的笔尖
  • +
  • 📝备忘录
  • +
  • 📁文件夹
  • +
  • 📂打开的文件夹
  • +
  • 📅日历
  • +
  • 📆撕下的日历
  • +
  • 📇证指数
  • +
  • 📈向上趋势的图
  • +
  • 📉向下趋势的图
  • +
  • 📊条形图
  • +
  • 📋剪贴板
  • +
  • 📌图钉
  • +
  • 📍圆图钉
  • +
  • 📎回形针
  • +
  • 📏直尺
  • +
  • 📐三角尺
  • +
  • 黑色剪刀
  • +
  • 🔒
  • +
  • 🔓打开的锁
  • +
  • 🔏锁着的锁和钢笔
  • +
  • 🔐锁着的锁和钥匙
  • +
  • 🔑钥匙
  • +
  • 🔨锤子
  • +
  • 🔫手枪
  • +
  • 🔧扳手
  • +
  • 🔩螺母和螺栓
  • +
  • 🔗链接符号
  • +
  • 💉注射器
  • +
  • 💊胶囊
  • +
  • 🚬吸烟标志
  • +
  • 🗿摩艾
  • +
  • 🔮水晶球
  • +
  • 🚩向后的三角旗
  • +
  • 🎌交叉标志
  • +
  • 💦汗水飞溅符号
  • +
  • 💨猛冲
  • +
  • 💣炸弹
  • +
  • 💩一坨翔
  • +
+
+ +
+ 时钟: +
    +
  • 🕛十二点
  • +
  • 🕧十二点半
  • +
  • 🕐一点钟
  • +
  • 🕜一点半
  • +
  • 🕑两点
  • +
  • 🕝两点半
  • +
  • 🕒三点钟
  • +
  • 🕞三点半
  • +
  • 🕓四点钟
  • +
  • 🕟四点半
  • +
  • 🕔五时
  • +
  • 🕠五点半
  • +
  • 🕕六点
  • +
  • 🕡六点半
  • +
  • 🕖七点
  • +
  • 🕢七点半
  • +
  • 🕗八点
  • +
  • 🕣八点半
  • +
  • 🕘九点钟
  • +
  • 🕤九点半
  • +
  • 🕙的十点
  • +
  • 🕥十点半
  • +
  • 🕚十一点
  • +
  • 🕦十一点半
  • +
  • 沙漏
  • +
  • 沙流动的沙漏
  • +
  • +
  • 闹钟
  • +
  • 跑表
  • +
  • 定时器时钟
  • +
  • 🕰壁炉钟
  • +
+
+ +
+ 心形: +
    +
  • 💘丘比特之箭射中心
  • +
  • +
  • 💓跳动的心
  • +
  • 💔破碎的心
  • +
  • 💕两颗心
  • +
  • 💖闪光的心
  • +
  • 💗成长的心
  • +
  • 💙蓝色心
  • +
  • 💚绿色心
  • +
  • 💛黄色心
  • +
  • 💜紫色心
  • +
  • 💝扎丝带的心形礼盒
  • +
  • 💞旋转心
  • +
  • 💟心形装饰
  • +
  • 心情沉重感叹号饰品
  • +
+
+
+ 花: +
    +
  • 💐花束
  • +
  • 🌸樱花
  • +
  • 💮白花
  • +
  • 🌹玫瑰
  • +
  • 🌺槿
  • +
  • 🌻向日葵
  • +
  • 🌼开花
  • +
  • 🌷郁金香
  • +
+
+ +
+ 月亮: +
    +
  • 🌑新月符号
  • +
  • 🌒娥眉月符号
  • +
  • 🌓上弦月符号
  • +
  • 🌔残月符号
  • +
  • 🌕满月符号
  • +
  • 🌖残月符号
  • +
  • 🌗下弦月符号
  • +
  • 🌘残月符号
  • +
  • 🌙月牙儿
  • +
  • 🌚新月人脸
  • +
  • 🌛上弦月人脸
  • +
  • 🌜下弦月人脸
  • +
  • 🌝圆月人脸
  • +
+
+ +
+ 水果: +
    +
  • 🍇葡萄
  • +
  • 🍈
  • +
  • 🍉西瓜
  • +
  • 🍊柑橘
  • +
  • 🍋柠檬
  • +
  • 🍌香蕉
  • +
  • 🍍菠萝
  • +
  • 🍎红苹果
  • +
  • 🍏青苹果
  • +
  • 🍐
  • +
  • 🍑桃子
  • +
  • 🍒樱桃
  • +
  • 🍓草莓
  • +
+
+ +
+ 办公: +
    +
  • 📱移动电话
  • +
  • 📲箭头指向左的手机
  • +
  • 电话机
  • +
  • 📞电话话筒
  • +
  • 📟传呼机
  • +
  • 📠传真机
  • +
  • 🔋电池
  • +
  • 🔌插头
  • +
  • 💻个人电脑
  • +
  • 💽迷你光盘
  • +
  • 💾软盘
  • +
  • 💿光盘
  • +
  • 📀DVD
  • +
  • 🎥摄像机
  • +
  • 📺电视
  • +
  • 📷相机
  • +
  • 📹录影机
  • +
  • 📼录像带
  • +
  • 🔍向左的放大镜
  • +
  • 🔎向右的放大镜
  • +
  • 🔬显微镜
  • +
  • 🔭望远镜
  • +
  • 📡卫星天线
  • +
  • 📔护套笔记本
  • +
  • 📕合上的书
  • +
  • 📖打开的书
  • +
  • 📗绿皮书
  • +
  • 📘蓝皮书
  • +
  • 📙黄皮书
  • +
  • 📚图书
  • +
  • 📓笔记本
  • +
  • 📃页面卷曲
  • +
  • 📜卷轴
  • +
  • 📄页面朝上
  • +
  • 📰报纸
  • +
  • 📑书签标签
  • +
  • 🔖书签
  • +
  • 💳信用卡
  • +
  • 信封
  • +
  • 📧电子邮件符号
  • +
  • 📨新邮件
  • +
  • 📩箭头向下的信封
  • +
  • 📤发件箱托盘
  • +
  • 📥收件箱托盘
  • +
  • 📦包裹
  • +
  • 📫标志上位的关闭邮箱
  • +
  • 📪标志下位的关闭邮箱
  • +
  • 📬标志上位的打开邮箱
  • +
  • 📭标志下位的打开邮箱
  • +
  • 📮邮箱
  • +
  • 铅笔
  • +
  • 黑色的笔尖
  • +
  • 📝备忘录
  • +
  • 📁文件夹
  • +
  • 📂打开的文件夹
  • +
  • 📅日历
  • +
  • 📆撕下的日历
  • +
  • 📇证指数
  • +
  • 📈向上趋势的图
  • +
  • 📉向下趋势的图
  • +
  • 📊条形图
  • +
  • 📋剪贴板
  • +
  • 📌图钉
  • +
  • 📍圆图钉
  • +
  • 📎回形针
  • +
  • 📏直尺
  • +
  • 📐三角尺
  • +
  • 黑色剪刀
  • +
  • 🔒
  • +
  • 🔓打开的锁
  • +
  • 🔏锁着的锁和钢笔
  • +
  • 🔐锁着的锁和钥匙
  • +
  • 🔑钥匙
  • +
+
+ + +
+ 箭头: +
    +
  • 向上箭头
  • +
  • 向右上箭头
  • +
  • 向右箭头
  • +
  • 向右下箭头
  • +
  • 向下箭头
  • +
  • 向左下箭头
  • +
  • 向左箭头
  • +
  • 向左上箭头
  • +
  • 上下箭头
  • +
  • 左右箭头
  • +
  • 弯曲的向左箭头
  • +
  • 弯曲的向右箭头
  • +
  • 向右往上弯的箭头
  • +
  • 向左往下弯的箭头
  • +
  • 🔃首尾相接的圆形顺时针箭头
  • +
  • 🔄首尾相接的圆形逆时针箭头
  • +
  • 🔙向左的返回箭头
  • +
  • 🔚向左的终点箭头
  • +
  • 🔛继续感叹号左右箭头
  • +
  • 🔜快速右箭头
  • +
  • 🔝顶部向上箭头
  • +
  • 🔀交叉的箭头,随机播放
  • +
  • 🔁顺时针箭头,顺序播放
  • +
  • 🔂顺时针箭头,顺序播放一次
  • +
  • 向右的三角,播放
  • +
  • 向右的双三角,快进
  • +
  • 向左的三角
  • +
  • 向左的双三角,倒带
  • +
  • 🔼向上的小三角形
  • +
  • 向上的双三角
  • +
  • 🔽向下的小三角形
  • +
  • 向下的双三角
  • +
+
+ +
+ 手机: +
    +
  • 📱手机,移动电话
  • +
  • 📲箭头指向左的手机
  • +
  • 📶带信号的天线
  • +
  • 📳振动模式
  • +
  • 📴手机关机
  • +
  • 黑色电话
  • +
  • 📞电话话筒
  • +
  • 📟呼叫器
  • +
  • 📠传真机
  • +
+
+ +
+ 公共场合: +
    +
  • 可回收标志
  • +
  • 🏧自动取款机
  • +
  • 🚮垃圾箱
  • +
  • 🚰饮用水符号
  • +
  • 轮椅符号
  • +
  • 🚹男,男卫生间
  • +
  • 🚺女,女卫生间
  • +
  • 🚻卫生间
  • +
  • 🚼婴儿符号
  • +
  • 🚾洗手间
  • +
  • 警告牌
  • +
  • 🚸儿童通道
  • +
  • 禁止入内
  • +
  • 🚫禁止进入标志
  • +
  • 🚳自行车禁行
  • +
  • 🚭禁止吸烟标志
  • +
  • 🚯不乱扔垃圾符号
  • +
  • 🚱非饮用水符号
  • +
  • 🚷行人禁止通行
  • +
  • 🔞未满18岁不得进入
  • +
  • 💈理发店招牌
  • +
+
+ +
+ 交通: +
    +
  • 🚂蒸汽机车
  • +
  • 🚃有轨电车
  • +
  • 🚄高速火车
  • +
  • 🚅高速子弹头列车
  • +
  • 🚆火车
  • +
  • 🚇地铁
  • +
  • 🚈轻轨列车
  • +
  • 🚉火车站
  • +
  • 🚊电车
  • +
  • 🚝单轨
  • +
  • 🚞山区铁路
  • +
  • 🚋电车
  • +
  • 🚌公交车
  • +
  • 🚍迎面而来的公交车
  • +
  • 🚎电车
  • +
  • 🚏公交车站
  • +
  • 🚐小巴
  • +
  • 🚑救护车
  • +
  • 🚒消防车
  • +
  • 🚓警车
  • +
  • 🚔迎面而来的警车
  • +
  • 🚕出租车
  • +
  • 🚖迎面而来的出租车
  • +
  • 🚗汽车
  • +
  • 🚘迎面而来的汽车
  • +
  • 🚚送货车
  • +
  • 🚛拖车
  • +
  • 🚜拖拉机
  • +
  • 🚲自行车
  • +
  • 加油站
  • +
  • 🚨警车旋转灯
  • +
  • 🚥横向交通灯
  • +
  • 🚦垂直交通灯
  • +
  • 🚧道路施工
  • +
  • +
  • 帆船
  • +
  • 🚣划艇
  • +
  • 🚤快艇
  • +
  • 🚢
  • +
  • 飞机
  • +
  • 💺座位
  • +
  • 🚁直升机
  • +
  • 🚟高架铁路
  • +
  • 🚠缆车
  • +
  • 🚡空中缆车
  • +
  • 🚀火箭
  • +
+
+ +
+ 建筑: +
    +
  • 🏠房屋建筑
  • +
  • 🏡房带花园
  • +
  • 🏢办公楼
  • +
  • 🏣日本邮局
  • +
  • 🏤欧洲邮政局
  • +
  • 🏥医院
  • +
  • 🏦银行
  • +
  • 🏨饭店
  • +
  • 🏩爱情酒店
  • +
  • 🏪便利店
  • +
  • 🏫学校
  • +
  • 🏬百货商店
  • +
  • 🏭工厂
  • +
  • 🏯日本城堡
  • +
  • 🏰欧洲古堡
  • +
  • 💒举行婚礼的教堂
  • +
  • 🗼东京塔
  • +
  • 🗽自由女神像
  • +
  • 教堂
  • +
  • 🌆黄昏时的城市风光
  • +
  • 🌇日落建筑物
  • +
  • 🌉晚上的桥
  • +
+
+ +
+ 货币: +
    +
  • 💴日元
  • +
  • 💵美元
  • +
  • 💶欧元
  • +
  • 💷英镑
  • +
  • 💰钱袋子
  • +
  • 💸带翅膀的钱
  • +
  • 💳信用卡
  • +
+
+ +
+ 叶子: +
    +
  • 🌿枝叶
  • +
  • 🍀四叶草
  • +
  • 🍁枫叶
  • +
  • 🍂落叶
  • +
  • 🍃叶子在风中飘落
  • +
  • 三叶草(酢浆草)
  • +
+
+ +
+ 标志: +
    +
  • 黑桃
  • +
  • 红心
  • +
  • 黑桃
  • +
  • 梅花
  • +
  • 🀄麻将牌红中
  • +
  • 🎴花扑克牌
  • +
  • 🔇关闭扬声器
  • +
  • 🔈扬声器
  • +
  • 🔉一声波音箱
  • +
  • 🔊三声波音箱
  • +
  • 📢喇叭
  • +
  • 📣助威喇叭
  • +
  • 📯邮政号角
  • +
  • 💤睡觉符号
  • +
  • 💢愤怒符号
  • +
  • 💬语音气球
  • +
  • 💭思想气球
  • +
  • 💮白花
  • +
  • 温泉
  • +
  • 🌀飓风
  • +
  • 🔔
  • +
  • 🔕关闭的钟
  • +
  • 大卫之星
  • +
  • 拉丁十字形
  • +
  • 🔯中间有点的六角星
  • +
  • 📛姓名卡
  • +
  • 🔰日本新手司机标志
  • +
  • 🔱三叉戟符号
  • +
  • 加粗圆圈
  • +
  • 白色加粗对勾
  • +
  • 带对勾的方框
  • +
  • 黑色加粗对勾
  • +
  • 黑色加粗叉(乘号)
  • +
  • 乘号
  • +
  • 带叉的黑方框
  • +
  • 粗加号
  • +
  • 粗减号
  • +
  • 粗除号
  • +
  • 一个绳圈
  • +
  • 两个绳圈
  • +
  • 日本音乐中的交替标记
  • +
  • 八条线组成的星号
  • +
  • 八个箭头组成的星号
  • +
  • 星号
  • +
  • 双感叹号
  • +
  • 感叹号问号
  • +
  • 黑色问号
  • +
  • 白色问号
  • +
  • 白色感叹号
  • +
  • 黑色感叹号
  • +
  • ©版权符号
  • +
  • ®注册符号
  • +
  • 商标符号
  • +
  • 🎦电影
  • +
  • 🔅低亮度符号
  • +
  • 🔆高亮度符号
  • +
  • #️⃣键帽符号#
  • +
  • 0️⃣键帽数字0
  • +
  • 1️⃣键帽数字1
  • +
  • 2️⃣键帽数字2
  • +
  • 3️⃣键帽数字3
  • +
  • 4️⃣键帽数字4
  • +
  • 5️⃣键帽数字5
  • +
  • 6️⃣键帽数字6
  • +
  • 7️⃣键帽数字7
  • +
  • 8️⃣键帽数字8
  • +
  • 9️⃣键帽数字9
  • +
  • 🔟键帽数字10
  • +
  • 💯一百分符号
  • +
  • 🔠输入符号拉丁大写字母
  • +
  • 🔡输入符号拉丁小写字母
  • +
  • 🔢输入数字
  • +
  • 🔣输入符号
  • +
  • 🔤输入拉丁字母
  • +
  • 🅰带黑色方块的字母A
  • +
  • 🆎带黑色方块的字母AB
  • +
  • 🅱带黑色方块的字母B
  • +
  • 🆑带方框的字母CL,清空
  • +
  • 🆒带方框COOL
  • +
  • 🆓带方框的FREE
  • +
  • 信息来源
  • +
  • 🆔带方框的ID
  • +
  • 带圆圈的字母M
  • +
  • 🆕带方框的NEW
  • +
  • 🆖带方框的NG
  • +
  • 🅾带黑色方框的字母O
  • +
  • 🆗带方框的OK的方框
  • +
  • 🅿带黑色方框的字母P
  • +
  • 🆘带方框的SOS
  • +
  • 🆙带方框的UP!
  • +
  • 🆚带方框的VS
  • +
  • 🈁带方框的ココ,这里
  • +
  • 🈂带方框的サ,免费
  • +
  • 🈷带方框的月
  • +
  • 🈶带方框的有
  • +
  • 🈯带方框的指
  • +
  • 🉐带圆圈的得,日语中便宜货
  • +
  • 🈹带方框的割,日语中降价
  • +
  • 🈚带方框的无
  • +
  • 🈲带方框的禁
  • +
  • 🉑带圆圈的可
  • +
  • 🈸带方框的申
  • +
  • 🈴带方框的合
  • +
  • 🈳带方框的空
  • +
  • 带圆圈的祝
  • +
  • 带圆圈的秘
  • +
  • 🈺带方框的营
  • +
  • 🈵带方框的满
  • +
  • 黑色小方块
  • +
  • 白色的小方块
  • +
  • 白色中型方块
  • +
  • 黑色中方块
  • +
  • 白中小方块
  • +
  • 黑色中小方块
  • +
  • 黑色大方块
  • +
  • 白色大方块
  • +
  • 🔶橙色大菱形
  • +
  • 🔷蓝色大菱形
  • +
  • 🔸橙色小菱形
  • +
  • 🔹蓝色小菱形
  • +
  • 🔺向上的三角
  • +
  • 🔻向下的三角
  • +
  • 💠里面有圆点的菱形
  • +
  • 🔲黑色方形按钮
  • +
  • 🔳白色方形按钮
  • +
  • 白色中等圆圈
  • +
  • 黑色中等圆圈
  • +
  • 🔴红色的大圆圈
  • +
  • 🔵蓝色的大圆圈
  • +
+
+ +
+ 星座: +
    +
  • 白羊座
  • +
  • 金牛座
  • +
  • 双子座
  • +
  • 巨蟹座
  • +
  • 狮子座
  • +
  • 处女座
  • +
  • 天秤座
  • +
  • 天蝎座
  • +
  • 射手座
  • +
  • 摩羯座
  • +
  • 水瓶座
  • +
  • 双鱼座
  • +
  • 蛇夫座
  • +
+
+ +
+ 播放符号: +
    +
  • 🔀交叉的箭头,随机播放
  • +
  • 🔁顺时针箭头,顺序播放
  • +
  • 🔂顺时针箭头,顺序播放一次
  • +
  • 向右的三角,播放
  • +
  • 向右的双三角,快进
  • +
  • 向左的三角
  • +
  • 向左的双三角,倒带
  • +
  • 🔼向上的小三角形
  • +
  • 向上的双三角
  • +
  • 🔽向下的小三角形
  • +
  • 向下的双三角
  • +
  • 黑色方框,停止
  • +
+
+ +
+ 自然: +
    +
  • 🌍地球欧洲-非洲
  • +
  • 🌎地球美洲
  • +
  • 🌏地球亚洲-澳洲
  • +
  • 🌐地球仪经络
  • +
  • 🌑新月符号
  • +
  • 🌒娥眉月符号
  • +
  • 🌓上弦月符号
  • +
  • 🌔残月符号
  • +
  • 🌕满月符号
  • +
  • 🌖残月符号
  • +
  • 🌗下弦月符号
  • +
  • 🌘残月符号
  • +
  • 🌙月牙儿
  • +
  • 🌚新月人脸
  • +
  • 🌛上弦月人脸
  • +
  • 🌜下弦月人脸
  • +
  • 太阳光芒四射
  • +
  • 🌝圆月人脸
  • +
  • 🌞太阳人脸
  • +
  • 星星,五角星
  • +
  • 🌟发光的星星
  • +
  • 🌠彗星
  • +
  • +
  • 多云
  • +
  • 雨点落在伞上
  • +
  • 雷电
  • +
  • 雪花
  • +
  • 🔥
  • +
  • 💧水滴
  • +
  • 🌊水波
  • +
+
+ +
+ 国旗: + 注:国旗在电脑中显示为字母,在手机或头像昵称中正常 +
    +
  • 🇦🇨阿森松岛
  • +
  • 🇦🇩安道尔
  • +
  • 🇦🇪阿联酋
  • +
  • 🇦🇫阿富汗
  • +
  • 🇦🇬安提瓜和巴布达
  • +
  • 🇦🇮安圭拉
  • +
  • 🇦🇱阿尔巴尼亚
  • +
  • 🇦🇲亚美尼亚
  • +
  • 🇦🇴安哥拉
  • +
  • 🇦🇶南极洲
  • +
  • 🇦🇷阿根廷
  • +
  • 🇦🇸美属萨摩亚群岛
  • +
  • 🇦🇹奥地利
  • +
  • 🇦🇺澳大利亚
  • +
  • 🇦🇼阿鲁巴
  • +
  • 🇦🇽奥兰群岛
  • +
  • 🇦🇿阿塞拜疆
  • +
  • 🇧🇦波黑
  • +
  • 🇧🇧巴多斯
  • +
  • 🇧🇩孟加拉国
  • +
  • 🇧🇪为比利时
  • +
  • 🇧🇫布基纳法索
  • +
  • 🇧🇬保加利亚
  • +
  • 🇧🇭巴林
  • +
  • 🇧🇮布隆迪
  • +
  • 🇧🇯贝宁
  • +
  • 🇧🇱圣巴泰勒米
  • +
  • 🇧🇲百慕大
  • +
  • 🇧🇳文莱
  • +
  • 🇧🇴玻利维亚
  • +
  • 🇧🇶荷兰加勒比
  • +
  • 🇧🇷巴西
  • +
  • 🇧🇸巴哈马
  • +
  • 🇧🇹不丹
  • +
  • 🇧🇻布维岛
  • +
  • 🇧🇼博茨瓦纳
  • +
  • 🇧🇾白俄罗斯
  • +
  • 🇧🇿伯利兹
  • +
  • 🇨🇦加拿大
  • +
  • 🇨🇨科科斯群岛
  • +
  • 🇨🇩刚果(金)
  • +
  • 🇨🇫中非共和国
  • +
  • 🇨🇬刚果(布)
  • +
  • 🇨🇭瑞士
  • +
  • 🇨🇮科特迪瓦
  • +
  • 🇨🇰库克群岛
  • +
  • 🇨🇱智利
  • +
  • 🇨🇲喀麦隆
  • +
  • 🇨🇳中国
  • +
  • 🇨🇴哥伦比亚
  • +
  • 🇨🇵克利珀顿岛
  • +
  • 🇨🇷哥斯达黎加
  • +
  • 🇨🇺古巴
  • +
  • 🇨🇻佛得角
  • +
  • 🇨🇼库拉索
  • +
  • 🇨🇽圣诞岛
  • +
  • 🇨🇾塞浦路斯
  • +
  • 🇨🇿捷克共和国
  • +
  • 🇩🇪德国
  • +
  • 🇩🇬迪戈加西亚
  • +
  • 🇩🇯吉布提
  • +
  • 🇩🇰丹麦
  • +
  • 🇩🇲多米尼加
  • +
  • 🇩🇴多明尼加共和国
  • +
  • 🇩🇿阿尔及利亚
  • +
  • 🇪🇦休达和梅利利亚
  • +
  • 🇪🇨厄瓜多尔
  • +
  • 🇪🇪爱沙尼亚
  • +
  • 🇪🇬埃及
  • +
  • 🇪🇭西撒哈拉
  • +
  • 🇪🇷厄立特里亚
  • +
  • 🇪🇸西班牙
  • +
  • 🇪🇹埃塞俄比亚
  • +
  • 🇪🇺欧盟
  • +
  • 🇫🇮芬兰
  • +
  • 🇫🇯斐济
  • +
  • 🇫🇰福克兰群岛
  • +
  • 🇫🇲密克罗尼西亚
  • +
  • 🇫🇴法罗群岛
  • +
  • 🇫🇷法国
  • +
  • 🇬🇦加蓬
  • +
  • 🇬🇧英国
  • +
  • 🇬🇩格林纳达
  • +
  • 🇬🇪格鲁吉亚
  • +
  • 🇬🇫法属圭亚那
  • +
  • 🇬🇬根西岛
  • +
  • 🇬🇭加纳
  • +
  • 🇬🇮直布罗陀
  • +
  • 🇬🇱格陵兰
  • +
  • 🇬🇲冈比亚
  • +
  • 🇬🇳几内亚
  • +
  • 🇬🇵瓜德罗普岛
  • +
  • 🇬🇶赤道几内亚
  • +
  • 🇬🇷希腊
  • +
  • 🇬🇸南乔治亚岛和南桑威奇群岛
  • +
  • 🇬🇹危地马拉
  • +
  • 🇬🇺关岛
  • +
  • 🇬🇼几内亚比绍
  • +
  • 🇬🇾圭亚那
  • +
  • 🇭🇰香港区旗
  • +
  • 🇭🇲赫德与麦克唐纳群岛
  • +
  • 🇭🇳洪都拉斯
  • +
  • 🇭🇷克罗地亚
  • +
  • 🇭🇹海地
  • +
  • 🇭🇺匈牙利
  • +
  • 🇮🇨加那利群岛
  • +
  • 🇮🇩印尼
  • +
  • 🇮🇪爱尔兰
  • +
  • 🇮🇱为以色列
  • +
  • 🇮🇲曼岛
  • +
  • 🇮🇳印度
  • +
  • 🇮🇴英属印度洋领地
  • +
  • 🇮🇶伊拉克
  • +
  • 🇮🇷伊朗
  • +
  • 🇮🇸冰岛
  • +
  • 🇮🇹意大利
  • +
  • 🇯🇪泽西
  • +
  • 🇯🇲牙买加
  • +
  • 🇯🇴约旦
  • +
  • 🇯🇵日本
  • +
  • 🇰🇪肯尼亚
  • +
  • 🇰🇬吉尔吉斯斯坦
  • +
  • 🇰🇭柬埔寨
  • +
  • 🇰🇮基里巴斯
  • +
  • 🇰🇲科摩罗
  • +
  • 🇰🇳圣基茨和尼维斯
  • +
  • 🇰🇵朝鲜
  • +
  • 🇰🇷为韩国
  • +
  • 🇰🇼科威特
  • +
  • 🇰🇾开曼群岛
  • +
  • 🇰🇿哈萨克斯坦
  • +
  • 🇱🇦老挝
  • +
  • 🇱🇧黎巴嫩
  • +
  • 🇱🇨圣卢西亚
  • +
  • 🇱🇮列支敦士登
  • +
  • 🇱🇰斯里兰卡
  • +
  • 🇱🇷利比里亚
  • +
  • 🇱🇸莱索托
  • +
  • 🇱🇹立陶宛
  • +
  • 🇱🇺卢森堡
  • +
  • 🇱🇻拉脱维亚
  • +
  • 🇱🇾利比亚
  • +
  • 🇲🇦摩洛哥
  • +
  • 🇲🇨摩纳哥
  • +
  • 🇲🇩摩尔多瓦
  • +
  • 🇲🇪黑山
  • +
  • 🇲🇫圣马丁
  • +
  • 🇲🇬马达加斯加
  • +
  • 🇲🇭马绍尔群岛
  • +
  • 🇲🇰马其顿
  • +
  • 🇲🇱马里
  • +
  • 🇲🇲缅甸
  • +
  • 🇲🇳蒙古
  • +
  • 🇲🇴澳门区旗
  • +
  • 🇲🇵北马里亚纳群岛
  • +
  • 🇲🇶马提尼克岛
  • +
  • 🇲🇷毛里塔尼亚
  • +
  • 🇲🇸蒙特塞拉特
  • +
  • 🇲🇹马耳他
  • +
  • 🇲🇺毛里求斯
  • +
  • 🇲🇻马尔代夫
  • +
  • 🇲🇼马拉维
  • +
  • 🇲🇽墨西哥
  • +
  • 🇲🇾马来西亚
  • +
  • 🇲🇿莫桑比克
  • +
  • 🇳🇦纳米比亚
  • +
  • 🇳🇨新喀里多尼亚
  • +
  • 🇳🇪尼日尔
  • +
  • 🇳🇫诺福克岛
  • +
  • 🇳🇬尼日利亚
  • +
  • 🇳🇮尼加拉瓜
  • +
  • 🇳🇱荷兰
  • +
  • 🇳🇴挪威
  • +
  • 🇳🇵尼泊尔
  • +
  • 🇳🇷瑙鲁
  • +
  • 🇳🇺纽埃
  • +
  • 🇳🇿新西兰
  • +
  • 🇴🇲阿曼
  • +
  • 🇵🇦巴拿马
  • +
  • 🇵🇪秘鲁
  • +
  • 🇵🇫法属波利尼西亚
  • +
  • 🇵🇬巴布亚新几内亚
  • +
  • 🇵🇭菲律宾
  • +
  • 🇵🇰巴基斯坦
  • +
  • 🇵🇱波兰
  • +
  • 🇵🇲圣皮埃尔和密克隆群岛
  • +
  • 🇵🇳皮特凯恩群岛
  • +
  • 🇵🇷波多黎各
  • +
  • 🇵🇸巴勒斯坦领土
  • +
  • 🇵🇹葡萄牙
  • +
  • 🇵🇼帕劳
  • +
  • 🇵🇾巴拉圭
  • +
  • 🇶🇦卡塔尔
  • +
  • 🇷🇪团圆
  • +
  • 🇷🇴罗马尼亚
  • +
  • 🇷🇸塞尔维亚
  • +
  • 🇷🇺俄罗斯
  • +
  • 🇷🇼卢旺达
  • +
  • 🇸🇦沙特阿拉伯
  • +
  • 🇸🇧所罗门群岛
  • +
  • 🇸🇨塞舌尔
  • +
  • 🇸🇩苏丹
  • +
  • 🇸🇪瑞典
  • +
  • 🇸🇬新加坡
  • +
  • 🇸🇭圣赫勒拿
  • +
  • 🇸🇮斯洛文尼亚
  • +
  • 🇸🇯斯瓦尔巴群岛和扬马延
  • +
  • 🇸🇰斯洛伐克
  • +
  • 🇸🇱塞拉利昂
  • +
  • 🇸🇲圣马力诺
  • +
  • 🇸🇳塞内加尔
  • +
  • 🇸🇴索马里
  • +
  • 🇸🇷苏里南
  • +
  • 🇸🇸南苏丹
  • +
  • 🇸🇹圣多美和普林西比
  • +
  • 🇸🇻萨尔瓦多
  • +
  • 🇸🇽圣马丁岛
  • +
  • 🇸🇾叙利亚
  • +
  • 🇸🇿斯威士兰
  • +
  • 🇹🇦特里斯坦 - 达库尼亚群岛
  • +
  • 🇹🇨特克斯和凯科斯群岛
  • +
  • 🇹🇩乍得
  • +
  • 🇹🇫法国南方的领土
  • +
  • 🇹🇬多哥
  • +
  • 🇹🇭泰国
  • +
  • 🇹🇯塔吉克斯坦
  • +
  • 🇹🇰托克劳
  • +
  • 🇹🇱东帝汶
  • +
  • 🇹🇲土库曼斯坦
  • +
  • 🇹🇳突尼斯
  • +
  • 🇹🇴汤加
  • +
  • 🇹🇷土耳其
  • +
  • 🇹🇹特立尼达和多巴哥
  • +
  • 🇹🇻图瓦卢
  • +
  • 🇹🇼台湾地区旗
  • +
  • 🇹🇿坦桑尼亚
  • +
  • 🇺🇦乌克兰
  • +
  • 🇺🇬乌干达
  • +
  • 🇺🇲美国离岛
  • +
  • 🇺🇸美国
  • +
  • 🇺🇾乌拉圭
  • +
  • 🇺🇿乌兹别克斯坦
  • +
  • 🇻🇦梵蒂冈城
  • +
  • 🇻🇨圣文森特和格林纳丁斯
  • +
  • 🇻🇪委内瑞拉
  • +
  • 🇻🇬英属维尔京群岛
  • +
  • 🇻🇮美属维尔京群岛
  • +
  • 🇻🇳越南
  • +
  • 🇻🇺瓦努阿图
  • +
  • 🇼🇫瓦利斯和富图纳群岛
  • +
  • 🇼🇸萨摩亚
  • +
  • 🇽🇰科索沃
  • +
  • 🇾🇪也门
  • +
  • 🇾🇹马约特
  • +
  • 🇿🇦南非
  • +
  • 🇿🇲赞比亚
  • +
  • 🇿🇼津巴布韦
  • +
+
+
+
+
+{/block} +{block name="script"} + +{/block} \ No newline at end of file diff --git a/plugin/utility/file_hash/App.php b/plugin/utility/file_hash/App.php new file mode 100644 index 0000000..f2fdfd4 --- /dev/null +++ b/plugin/utility/file_hash/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/utility/file_hash/index.html b/plugin/utility/file_hash/index.html new file mode 100644 index 0000000..e8d6ef3 --- /dev/null +++ b/plugin/utility/file_hash/index.html @@ -0,0 +1,223 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ 文件哈希计算 +
+
+
{{progress}}%
+
+
+ +
+
拖拽文件到这里或者点击选择文件 + +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+
+
+
+
+
+
工具说明
+
+

可同时选择多个文件计算

+

使用crypto-js 本地计算,文件不会被上传到服务器

+
+
+
+
+
+{/block} +{block name="script"} + + + + +{/block} \ No newline at end of file diff --git a/plugin/utility/idcard/App.php b/plugin/utility/idcard/App.php new file mode 100644 index 0000000..8afa44f --- /dev/null +++ b/plugin/utility/idcard/App.php @@ -0,0 +1,124 @@ +view(); + } + + public function query(){ + $idcard = input('post.idcard', null, 'trim'); + if(!$idcard) return msg('error','no idcard'); + + if(strlen($idcard) != 18 && strlen($idcard) != 15){ + return msg('error', '身份证号码有误,请输入正确的号码'); + } + + $id_arr = strlen($idcard) == 18 ? array(substr($idcard,0,6),substr($idcard,6,4),substr($idcard,10,2),substr($idcard,12,2),substr($idcard,16,1)) : array(substr($idcard,0,6),'19'.substr($idcard,6,2),substr($idcard,8,2),substr($idcard,10,2),substr($idcard,14,1)); + + $msg['身份证号码'] = $idcard; + $msg['性别'] = $id_arr[4]%2==1 ? '男' : '女'; + $msg['出生日期'] = $id_arr[1].'年'.$id_arr[2].'月'.$id_arr[3].'日'; + $msg['发证地'] = $this->getareabycode(substr($idcard, 0, 6)); + + if(strlen($idcard) == 18 && !$this->is_idcard($idcard)){ + $msg['提示'] = '该18位身份证号校验位不正确'; + } + + return msg('ok','success',$msg); + } + + private function getareabycode($code){ + $codedata = include(dirname(__FILE__).'/data.php'); + $code = preg_replace('/(00)+$/', '', $code); + $codeLength = strlen($code); + if ($codeLength < 2 || $codeLength > 6 || $codeLength % 2 !== 0) { + return null; + } + + $provinceCode = substr($code, 0, 2) . '0000'; + + if (!isset($codedata[$provinceCode])) { + return null; + } + + $province = $codedata[$provinceCode]; + + if ($codeLength === 2) { + return $province; + } + + $prefectureCode = substr($code, 0, 4) . '00'; + + if (!isset($codedata[$prefectureCode])) { + return $province; + } + + $area = $codedata[$prefectureCode]; + + if ($codeLength === 4) { + return $province . ' ' . $area; + } + + if (!isset($codedata[$code])) { + return $province . ' ' . $area; + } + + $name = $codedata[$code]; + + return $province . ' ' . $area . ' ' . $name; + } + + private function is_idcard( $id ) + { + $id = strtoupper($id); + $regx = "/(^\d{17}([0-9]|X)$)/"; + $arr_split = array(); + if(strlen($id)!=18 || !preg_match($regx, $id)) + { + return false; + } + $regx = "/^(\d{6})+(\d{4})+(\d{2})+(\d{2})+(\d{3})([0-9]|X)$/"; + @preg_match($regx, $id, $arr_split); + $dtm_birth = $arr_split[2] . '/' . $arr_split[3]. '/' .$arr_split[4]; + if(!strtotime($dtm_birth)) //检查生日日期是否正确 + { + return false; + } + else + { + //检验18位身份证的校验码是否正确。 + //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。 + $arr_int = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); + $arr_ch = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); + $sign = 0; + for ( $i = 0; $i < 17; $i++ ) + { + $b = (int) $id[$i]; + $w = $arr_int[$i]; + $sign += $b * $w; + } + $n = $sign % 11; + $val_num = $arr_ch[$n]; + if ($val_num != substr($id,17, 1)) + { + return false; + } + else + { + return true; + } + } + } + +} \ No newline at end of file diff --git a/plugin/utility/idcard/data.php b/plugin/utility/idcard/data.php new file mode 100644 index 0000000..8dd415b --- /dev/null +++ b/plugin/utility/idcard/data.php @@ -0,0 +1,7016 @@ + '北京市', + '110100' => '市辖区', + '110101' => '东城区', + '110102' => '西城区', + '110103' => '崇文区', + '110104' => '宣武区', + '110105' => '朝阳区', + '110106' => '丰台区', + '110107' => '石景山区', + '110108' => '海淀区', + '110109' => '门头沟区', + '110110' => '燕山区', + '110111' => '房山区', + '110112' => '通州区', + '110113' => '顺义区', + '110114' => '昌平区', + '110115' => '大兴区', + '110116' => '怀柔区', + '110117' => '平谷区', + '110118' => '密云区', + '110119' => '延庆区', + '110221' => '昌平县', + '110222' => '顺义县', + '110223' => '通县', + '110224' => '大兴县', + '110225' => '房山县', + '110226' => '平谷县', + '110227' => '怀柔县', + '110228' => '密云县', + '110229' => '延庆县', + '120000' => '天津市', + '120100' => '市辖区', + '120101' => '和平区', + '120102' => '河东区', + '120103' => '河西区', + '120104' => '南开区', + '120105' => '河北区', + '120106' => '红桥区', + '120107' => '塘沽区', + '120108' => '汉沽区', + '120109' => '大港区', + '120110' => '东丽区', + '120111' => '西青区', + '120112' => '津南区', + '120113' => '北辰区', + '120114' => '武清区', + '120115' => '宝坻区', + '120116' => '滨海新区', + '120117' => '宁河区', + '120118' => '静海区', + '120119' => '蓟州区', + '120221' => '宁河县', + '120222' => '武清县', + '120223' => '静海县', + '120224' => '宝坻县', + '120225' => '蓟县', + '130000' => '河北省', + '130100' => '石家庄市', + '130101' => '市辖区', + '130102' => '长安区', + '130103' => '桥东区', + '130104' => '桥西区', + '130105' => '新华区', + '130106' => '郊区', + '130107' => '井陉矿区', + '130108' => '裕华区', + '130109' => '藁城区', + '130110' => '鹿泉区', + '130111' => '栾城区', + '130121' => '井陉县', + '130122' => '获鹿县', + '130123' => '正定县', + '130124' => '栾城县', + '130125' => '行唐县', + '130126' => '灵寿县', + '130127' => '高邑县', + '130128' => '深泽县', + '130129' => '赞皇县', + '130130' => '无极县', + '130131' => '平山县', + '130132' => '元氏县', + '130133' => '赵县', + '130181' => '辛集市', + '130182' => '藁城市', + '130183' => '晋州市', + '130184' => '新乐市', + '130185' => '鹿泉市', + '130200' => '唐山市', + '130201' => '市辖区', + '130202' => '路南区', + '130203' => '路北区', + '130204' => '古冶区', + '130205' => '开平区', + '130206' => '新区', + '130207' => '丰南区', + '130208' => '丰润区', + '130209' => '曹妃甸区', + '130221' => '丰润县', + '130222' => '丰南县', + '130223' => '滦县', + '130224' => '滦南县', + '130225' => '乐亭县', + '130226' => '迁安县', + '130227' => '迁西县', + '130228' => '遵化县', + '130229' => '玉田县', + '130230' => '唐海县', + '130281' => '遵化市', + '130282' => '丰南市', + '130283' => '迁安市', + '130284' => '滦州市', + '130300' => '秦皇岛市', + '130301' => '市辖区', + '130302' => '海港区', + '130303' => '山海关区', + '130304' => '北戴河区', + '130305' => '郊区', + '130306' => '抚宁区', + '130321' => '青龙满族自治县', + '130322' => '昌黎县', + '130323' => '抚宁县', + '130324' => '卢龙县', + '130400' => '邯郸市', + '130401' => '市辖区', + '130402' => '邯山区', + '130403' => '丛台区', + '130404' => '复兴区', + '130405' => '郊区', + '130406' => '峰峰矿区', + '130407' => '肥乡区', + '130408' => '永年区', + '130421' => '邯郸县', + '130422' => '武安县', + '130423' => '临漳县', + '130424' => '成安县', + '130425' => '大名县', + '130426' => '涉县', + '130427' => '磁县', + '130428' => '肥乡县', + '130429' => '永年县', + '130430' => '邱县', + '130431' => '鸡泽县', + '130432' => '广平县', + '130433' => '馆陶县', + '130434' => '魏县', + '130435' => '曲周县', + '130481' => '武安市', + '130500' => '邢台市', + '130501' => '市辖区', + '130502' => '襄都区', + '130503' => '信都区', + '130504' => '郊区', + '130505' => '任泽区', + '130506' => '南和区', + '130521' => '邢台县', + '130522' => '临城县', + '130523' => '内丘县', + '130524' => '柏乡县', + '130525' => '隆尧县', + '130526' => '任县', + '130527' => '南和县', + '130528' => '宁晋县', + '130529' => '巨鹿县', + '130530' => '新河县', + '130531' => '广宗县', + '130532' => '平乡县', + '130533' => '威县', + '130534' => '清河县', + '130535' => '临西县', + '130581' => '南宫市', + '130582' => '沙河市', + '130600' => '保定市', + '130601' => '市辖区', + '130602' => '竞秀区', + '130603' => '北市区', + '130604' => '南市区', + '130605' => '郊区', + '130606' => '莲池区', + '130607' => '满城区', + '130608' => '清苑区', + '130609' => '徐水区', + '130621' => '满城县', + '130622' => '清苑县', + '130623' => '涞水县', + '130624' => '阜平县', + '130625' => '徐水县', + '130626' => '定兴县', + '130627' => '唐县', + '130628' => '高阳县', + '130629' => '容城县', + '130630' => '涞源县', + '130631' => '望都县', + '130632' => '安新县', + '130633' => '易县', + '130634' => '曲阳县', + '130635' => '蠡县', + '130636' => '顺平县', + '130637' => '博野县', + '130638' => '雄县', + '130681' => '涿州市', + '130682' => '定州市', + '130683' => '安国市', + '130684' => '高碑店市', + '130700' => '张家口市', + '130701' => '市辖区', + '130702' => '桥东区', + '130703' => '桥西区', + '130704' => '茶坊区', + '130705' => '宣化区', + '130706' => '下花园区', + '130707' => '庞家堡区', + '130708' => '万全区', + '130709' => '崇礼区', + '130721' => '宣化县', + '130722' => '张北县', + '130723' => '康保县', + '130724' => '沽源县', + '130725' => '尚义县', + '130726' => '蔚县', + '130727' => '阳原县', + '130728' => '怀安县', + '130729' => '万全县', + '130730' => '怀来县', + '130731' => '涿鹿县', + '130732' => '赤城县', + '130733' => '崇礼县', + '130800' => '承德市', + '130801' => '市辖区', + '130802' => '双桥区', + '130803' => '双滦区', + '130804' => '鹰手营子矿区', + '130821' => '承德县', + '130822' => '兴隆县', + '130823' => '平泉县', + '130824' => '滦平县', + '130825' => '隆化县', + '130826' => '丰宁满族自治县', + '130827' => '宽城满族自治县', + '130828' => '围场满族蒙古族自治县', + '130881' => '平泉市', + '130900' => '沧州市', + '130901' => '市辖区', + '130902' => '新华区', + '130903' => '运河区', + '130904' => '郊区', + '130921' => '沧县', + '130922' => '青县', + '130923' => '东光县', + '130924' => '海兴县', + '130925' => '盐山县', + '130926' => '肃宁县', + '130927' => '南皮县', + '130928' => '吴桥县', + '130929' => '献县', + '130930' => '孟村回族自治县', + '130981' => '泊头市', + '130982' => '任丘市', + '130983' => '黄骅市', + '130984' => '河间市', + '131000' => '廊坊市', + '131001' => '市辖区', + '131002' => '安次区', + '131003' => '广阳区', + '131021' => '三河县', + '131022' => '固安县', + '131023' => '永清县', + '131024' => '香河县', + '131025' => '大城县', + '131026' => '文安县', + '131027' => '霸县', + '131028' => '大厂回族自治县', + '131081' => '霸州市', + '131082' => '三河市', + '131100' => '衡水市', + '131101' => '市辖区', + '131102' => '桃城区', + '131103' => '冀州区', + '131121' => '枣强县', + '131122' => '武邑县', + '131123' => '武强县', + '131124' => '饶阳县', + '131125' => '安平县', + '131126' => '故城县', + '131127' => '景县', + '131128' => '阜城县', + '131181' => '冀州市', + '131182' => '深州市', + '132100' => '邯郸地区', + '132101' => '邯郸市', + '132121' => '大名县', + '132122' => '魏县', + '132123' => '曲周县', + '132124' => '丘县', + '132125' => '鸡泽县', + '132126' => '肥乡县', + '132127' => '广平县', + '132128' => '成安县', + '132129' => '临漳县', + '132130' => '磁县', + '132131' => '武安县', + '132132' => '涉县', + '132133' => '永年县', + '132134' => '邯郸县', + '132135' => '馆陶县', + '132200' => '邢台地区', + '132201' => '南宫市', + '132202' => '沙河市', + '132221' => '邢台县', + '132222' => '沙河县', + '132223' => '临城县', + '132224' => '内丘县', + '132225' => '柏乡县', + '132226' => '隆尧县', + '132227' => '任县', + '132228' => '南和县', + '132229' => '宁晋县', + '132230' => '南宫县', + '132231' => '巨鹿县', + '132232' => '新河县', + '132233' => '广宗县', + '132234' => '平乡县', + '132235' => '威县', + '132236' => '清河县', + '132237' => '临西县', + '132300' => '石家庄地区', + '132301' => '辛集市', + '132302' => '藁城市', + '132303' => '晋州市', + '132304' => '新乐市', + '132321' => '束鹿县', + '132322' => '晋县', + '132323' => '深泽县', + '132324' => '无极县', + '132325' => '藁城县', + '132326' => '赵县', + '132327' => '栾城县', + '132328' => '正定县', + '132329' => '新乐县', + '132330' => '高邑县', + '132331' => '元氏县', + '132332' => '赞皇县', + '132333' => '井陉县', + '132334' => '获鹿县', + '132335' => '平山县', + '132336' => '灵寿县', + '132337' => '行唐县', + '132400' => '保定地区', + '132401' => '定州市', + '132402' => '涿州市', + '132403' => '安国市', + '132404' => '高碑店市', + '132421' => '易县', + '132422' => '满城县', + '132423' => '徐水县', + '132424' => '涞源县', + '132425' => '定兴县', + '132426' => '完县', + '132427' => '唐县', + '132428' => '望都县', + '132429' => '涞水县', + '132430' => '涿县', + '132431' => '清苑县', + '132432' => '高阳县', + '132433' => '安新县', + '132434' => '雄县', + '132435' => '容城县', + '132436' => '新城县', + '132437' => '曲阳县', + '132438' => '阜平县', + '132439' => '定县', + '132440' => '安国县', + '132441' => '博野县', + '132442' => '蠡县', + '132500' => '张家口地区', + '132501' => '张家口市', + '132521' => '张北县', + '132522' => '康保县', + '132523' => '沽源县', + '132524' => '尚义县', + '132525' => '蔚县', + '132526' => '阳原县', + '132527' => '怀安县', + '132528' => '万全县', + '132529' => '怀来县', + '132530' => '涿鹿县', + '132531' => '宣化县', + '132532' => '赤城县', + '132533' => '崇礼县', + '132600' => '承德地区', + '132601' => '承德市', + '132621' => '青龙县', + '132622' => '宽城满族自治县', + '132623' => '兴隆县', + '132624' => '平泉县', + '132625' => '承德县', + '132626' => '滦平县', + '132627' => '丰宁满族自治县', + '132628' => '隆化县', + '132629' => '围场满族蒙古族自治县', + '132700' => '唐山地区', + '132701' => '秦皇岛市', + '132721' => '丰润县', + '132722' => '丰南县', + '132723' => '滦县', + '132724' => '滦南县', + '132725' => '乐亭县', + '132726' => '昌黎县', + '132727' => '抚宁县', + '132728' => '卢龙县', + '132729' => '迁安县', + '132730' => '迁西县', + '132731' => '遵化县', + '132732' => '玉田县', + '132800' => '廊坊地区', + '132801' => '廊坊市', + '132821' => '三河县', + '132822' => '大厂回族自治县', + '132823' => '香河县', + '132824' => '安次县', + '132825' => '永清县', + '132826' => '固安县', + '132827' => '霸县', + '132828' => '文安县', + '132829' => '大城县', + '132900' => '沧州地区', + '132901' => '沧州市', + '132902' => '泊头市', + '132903' => '任丘市', + '132904' => '黄骅市', + '132905' => '河间市', + '132921' => '沧县', + '132922' => '河间县', + '132923' => '肃宁县', + '132924' => '献县', + '132925' => '交河县', + '132926' => '吴桥县', + '132927' => '东光县', + '132928' => '南皮县', + '132929' => '盐山县', + '132930' => '黄骅县', + '132931' => '孟村回族自治县', + '132932' => '青县', + '132933' => '任丘县', + '132934' => '海兴县', + '133000' => '衡水地区', + '133001' => '衡水市', + '133002' => '冀州市', + '133003' => '深州市', + '133021' => '衡水县', + '133022' => '冀县', + '133023' => '枣强县', + '133024' => '武邑县', + '133025' => '深县', + '133026' => '武强县', + '133027' => '饶阳县', + '133028' => '安平县', + '133029' => '故城县', + '133030' => '景县', + '133031' => '阜城县', + '139000' => '省直辖县级行政区划', + '139001' => '武安市', + '139002' => '霸州市', + '139003' => '遵化市', + '139004' => '辛集市', + '139005' => '藁城市', + '139006' => '晋州市', + '139007' => '新乐市', + '139008' => '泊头市', + '139009' => '任丘市', + '139010' => '黄骅市', + '139011' => '河间市', + '139012' => '三河市', + '139013' => '南宫市', + '139014' => '沙河市', + '139015' => '定州市', + '139016' => '涿州市', + '139017' => '安国市', + '139018' => '高碑店市', + '139019' => '鹿泉市', + '139020' => '丰南市', + '140000' => '山西省', + '140100' => '太原市', + '140101' => '市辖区', + '140102' => '南城区', + '140103' => '北城区', + '140104' => '河西区', + '140105' => '小店区', + '140106' => '迎泽区', + '140107' => '杏花岭区', + '140108' => '尖草坪区', + '140109' => '万柏林区', + '140110' => '晋源区', + '140111' => '古交工矿区', + '140112' => '南郊区', + '140113' => '北郊区', + '140120' => '市区', + '140121' => '清徐县', + '140122' => '阳曲县', + '140123' => '娄烦县', + '140181' => '古交市', + '140200' => '大同市', + '140201' => '市辖区', + '140202' => '城区', + '140203' => '矿区', + '140211' => '南郊区', + '140212' => '新荣区', + '140213' => '平城区', + '140214' => '云冈区', + '140215' => '云州区', + '140221' => '阳高县', + '140222' => '天镇县', + '140223' => '广灵县', + '140224' => '灵丘县', + '140225' => '浑源县', + '140226' => '左云县', + '140227' => '大同县', + '140300' => '阳泉市', + '140301' => '市辖区', + '140302' => '城区', + '140303' => '矿区', + '140311' => '郊区', + '140321' => '平定县', + '140322' => '盂县', + '140400' => '长治市', + '140401' => '市辖区', + '140402' => '城区', + '140403' => '潞州区', + '140404' => '上党区', + '140405' => '屯留区', + '140406' => '潞城区', + '140411' => '郊区', + '140421' => '长治县', + '140422' => '潞城县', + '140423' => '襄垣县', + '140424' => '屯留县', + '140425' => '平顺县', + '140426' => '黎城县', + '140427' => '壶关县', + '140428' => '长子县', + '140429' => '武乡县', + '140430' => '沁县', + '140431' => '沁源县', + '140481' => '潞城市', + '140500' => '晋城市', + '140501' => '市辖区', + '140502' => '城区', + '140511' => '郊区', + '140521' => '沁水县', + '140522' => '阳城县', + '140523' => '高平县', + '140524' => '陵川县', + '140525' => '泽州县', + '140581' => '高平市', + '140600' => '朔州市', + '140601' => '市辖区', + '140602' => '朔城区', + '140603' => '平鲁区', + '140621' => '山阴县', + '140622' => '应县', + '140623' => '右玉县', + '140624' => '怀仁县', + '140681' => '怀仁市', + '140700' => '晋中市', + '140701' => '市辖区', + '140702' => '榆次区', + '140703' => '太谷区', + '140721' => '榆社县', + '140722' => '左权县', + '140723' => '和顺县', + '140724' => '昔阳县', + '140725' => '寿阳县', + '140726' => '太谷县', + '140727' => '祁县', + '140728' => '平遥县', + '140729' => '灵石县', + '140781' => '介休市', + '140800' => '运城市', + '140801' => '市辖区', + '140802' => '盐湖区', + '140821' => '临猗县', + '140822' => '万荣县', + '140823' => '闻喜县', + '140824' => '稷山县', + '140825' => '新绛县', + '140826' => '绛县', + '140827' => '垣曲县', + '140828' => '夏县', + '140829' => '平陆县', + '140830' => '芮城县', + '140881' => '永济市', + '140882' => '河津市', + '140900' => '忻州市', + '140901' => '市辖区', + '140902' => '忻府区', + '140921' => '定襄县', + '140922' => '五台县', + '140923' => '代县', + '140924' => '繁峙县', + '140925' => '宁武县', + '140926' => '静乐县', + '140927' => '神池县', + '140928' => '五寨县', + '140929' => '岢岚县', + '140930' => '河曲县', + '140931' => '保德县', + '140932' => '偏关县', + '140981' => '原平市', + '141000' => '临汾市', + '141001' => '市辖区', + '141002' => '尧都区', + '141021' => '曲沃县', + '141022' => '翼城县', + '141023' => '襄汾县', + '141024' => '洪洞县', + '141025' => '古县', + '141026' => '安泽县', + '141027' => '浮山县', + '141028' => '吉县', + '141029' => '乡宁县', + '141030' => '大宁县', + '141031' => '隰县', + '141032' => '永和县', + '141033' => '蒲县', + '141034' => '汾西县', + '141081' => '侯马市', + '141082' => '霍州市', + '141100' => '吕梁市', + '141101' => '市辖区', + '141102' => '离石区', + '141121' => '文水县', + '141122' => '交城县', + '141123' => '兴县', + '141124' => '临县', + '141125' => '柳林县', + '141126' => '石楼县', + '141127' => '岚县', + '141128' => '方山县', + '141129' => '中阳县', + '141130' => '交口县', + '141181' => '孝义市', + '141182' => '汾阳市', + '142100' => '雁北地区', + '142121' => '阳高县', + '142122' => '天镇县', + '142123' => '广灵县', + '142124' => '灵丘县', + '142125' => '浑源县', + '142126' => '应县', + '142127' => '山阴县', + '142128' => '朔县', + '142129' => '平鲁县', + '142130' => '左云县', + '142131' => '右玉县', + '142132' => '大同县', + '142133' => '怀仁县', + '142200' => '忻州地区', + '142201' => '忻州市', + '142202' => '原平市', + '142221' => '忻县', + '142222' => '定襄县', + '142223' => '五台县', + '142224' => '原平县', + '142225' => '代县', + '142226' => '繁峙县', + '142227' => '宁武县', + '142228' => '静乐县', + '142229' => '神池县', + '142230' => '五寨县', + '142231' => '岢岚县', + '142232' => '河曲县', + '142233' => '保德县', + '142234' => '偏关县', + '142300' => '吕梁地区', + '142301' => '孝义市', + '142302' => '离石市', + '142303' => '汾阳市', + '142321' => '汾阳县', + '142322' => '文水县', + '142323' => '交城县', + '142324' => '孝义县', + '142325' => '兴县', + '142326' => '临县', + '142327' => '柳林县', + '142328' => '石楼县', + '142329' => '岚县', + '142330' => '方山县', + '142331' => '离石县', + '142332' => '中阳县', + '142333' => '交口县', + '142400' => '晋中地区', + '142401' => '榆次市', + '142402' => '介休市', + '142421' => '榆社县', + '142422' => '左权县', + '142423' => '和顺县', + '142424' => '昔阳县', + '142425' => '平定县', + '142426' => '盂县', + '142427' => '寿阳县', + '142428' => '榆次县', + '142429' => '太谷县', + '142430' => '祁县', + '142431' => '平遥县', + '142432' => '介休县', + '142433' => '灵石县', + '142500' => '晋东南地区', + '142501' => '晋城市', + '142521' => '长治县', + '142522' => '潞城县', + '142523' => '屯留县', + '142524' => '长子县', + '142525' => '沁水县', + '142526' => '阳城县', + '142527' => '晋城县', + '142528' => '高平县', + '142529' => '陵川县', + '142530' => '壶关县', + '142531' => '平顺县', + '142532' => '黎城县', + '142533' => '武乡县', + '142534' => '襄垣县', + '142535' => '沁县', + '142536' => '沁源县', + '142600' => '临汾地区', + '142601' => '临汾市', + '142602' => '侯马市', + '142603' => '霍州市', + '142621' => '曲沃县', + '142622' => '翼城县', + '142623' => '襄汾县', + '142624' => '临汾县', + '142625' => '洪洞县', + '142626' => '霍县', + '142627' => '古县', + '142628' => '安泽县', + '142629' => '浮山县', + '142630' => '吉县', + '142631' => '乡宁县', + '142632' => '蒲县', + '142633' => '大宁县', + '142634' => '永和县', + '142635' => '隰县', + '142636' => '汾西县', + '142700' => '运城地区', + '142701' => '运城市', + '142702' => '永济市', + '142703' => '河津市', + '142721' => '运城县', + '142722' => '永济县', + '142723' => '芮城县', + '142724' => '临猗县', + '142725' => '万荣县', + '142726' => '新绛县', + '142727' => '稷山县', + '142728' => '河津县', + '142729' => '闻喜县', + '142730' => '夏县', + '142731' => '绛县', + '142732' => '平陆县', + '142733' => '垣曲县', + '149000' => '省直辖县级行政区划', + '149001' => '古交市', + '149002' => '高平市', + '149003' => '潞城市', + '150000' => '内蒙古自治区', + '150100' => '呼和浩特市', + '150101' => '市辖区', + '150102' => '新城区', + '150103' => '回民区', + '150104' => '玉泉区', + '150105' => '赛罕区', + '150120' => '市区', + '150121' => '土默特左旗', + '150122' => '托克托县', + '150123' => '和林格尔县', + '150124' => '清水河县', + '150125' => '武川县', + '150200' => '包头市', + '150201' => '市辖区', + '150202' => '东河区', + '150203' => '昆都仑区', + '150204' => '青山区', + '150205' => '石拐区', + '150206' => '白云鄂博矿区', + '150207' => '九原区', + '150220' => '市区', + '150221' => '土默特右旗', + '150222' => '固阳县', + '150223' => '达尔罕茂明安联合旗', + '150300' => '乌海市', + '150301' => '市辖区', + '150302' => '海勃湾区', + '150303' => '海南区', + '150304' => '乌达区', + '150400' => '赤峰市', + '150401' => '市辖区', + '150402' => '红山区', + '150403' => '元宝山区', + '150404' => '松山区', + '150421' => '阿鲁科尔沁旗', + '150422' => '巴林左旗', + '150423' => '巴林右旗', + '150424' => '林西县', + '150425' => '克什克腾旗', + '150426' => '翁牛特旗', + '150427' => '赤峰县', + '150428' => '喀喇沁旗', + '150429' => '宁城县', + '150430' => '敖汉旗', + '150500' => '通辽市', + '150501' => '市辖区', + '150502' => '科尔沁区', + '150521' => '科尔沁左翼中旗', + '150522' => '科尔沁左翼后旗', + '150523' => '开鲁县', + '150524' => '库伦旗', + '150525' => '奈曼旗', + '150526' => '扎鲁特旗', + '150581' => '霍林郭勒市', + '150600' => '鄂尔多斯市', + '150601' => '市辖区', + '150602' => '东胜区', + '150603' => '康巴什区', + '150621' => '达拉特旗', + '150622' => '准格尔旗', + '150623' => '鄂托克前旗', + '150624' => '鄂托克旗', + '150625' => '杭锦旗', + '150626' => '乌审旗', + '150627' => '伊金霍洛旗', + '150700' => '呼伦贝尔市', + '150701' => '市辖区', + '150702' => '海拉尔区', + '150703' => '扎赉诺尔区', + '150721' => '阿荣旗', + '150722' => '莫力达瓦达斡尔族自治旗', + '150723' => '鄂伦春自治旗', + '150724' => '鄂温克族自治旗', + '150725' => '陈巴尔虎旗', + '150726' => '新巴尔虎左旗', + '150727' => '新巴尔虎右旗', + '150781' => '满洲里市', + '150782' => '牙克石市', + '150783' => '扎兰屯市', + '150784' => '额尔古纳市', + '150785' => '根河市', + '150800' => '巴彦淖尔市', + '150801' => '市辖区', + '150802' => '临河区', + '150821' => '五原县', + '150822' => '磴口县', + '150823' => '乌拉特前旗', + '150824' => '乌拉特中旗', + '150825' => '乌拉特后旗', + '150826' => '杭锦后旗', + '150900' => '乌兰察布市', + '150901' => '市辖区', + '150902' => '集宁区', + '150921' => '卓资县', + '150922' => '化德县', + '150923' => '商都县', + '150924' => '兴和县', + '150925' => '凉城县', + '150926' => '察哈尔右翼前旗', + '150927' => '察哈尔右翼中旗', + '150928' => '察哈尔右翼后旗', + '150929' => '四子王旗', + '150981' => '丰镇市', + '152100' => '呼伦贝尔盟', + '152101' => '海拉尔市', + '152102' => '满洲里市', + '152103' => '扎兰屯市', + '152104' => '牙克石市', + '152105' => '根河市', + '152106' => '额尔古纳市', + '152121' => '布特哈旗', + '152122' => '阿荣旗', + '152123' => '莫力达瓦达斡尔族自治旗', + '152124' => '喜桂图旗', + '152125' => '额尔古纳右旗', + '152126' => '额尔古纳左旗', + '152127' => '鄂伦春自治旗', + '152128' => '鄂温克族自治旗', + '152129' => '新巴尔虎右旗', + '152130' => '新巴尔虎左旗', + '152131' => '陈巴尔虎旗', + '152200' => '兴安盟', + '152201' => '乌兰浩特市', + '152202' => '阿尔山市', + '152221' => '科尔沁右翼前旗', + '152222' => '科尔沁右翼中旗', + '152223' => '扎赉特旗', + '152224' => '突泉县', + '152300' => '哲里木盟', + '152301' => '通辽市', + '152302' => '霍林郭勒市', + '152321' => '通辽县', + '152322' => '科尔沁左翼中旗', + '152323' => '科尔沁左翼后旗', + '152324' => '开鲁县', + '152325' => '库伦旗', + '152326' => '奈曼旗', + '152327' => '扎鲁特旗', + '152400' => '昭乌达盟', + '152401' => '赤峰市', + '152421' => '阿鲁科尔沁旗', + '152422' => '巴林左旗', + '152423' => '巴林右旗', + '152424' => '林西县', + '152425' => '克什克腾旗', + '152426' => '翁牛特旗', + '152427' => '赤峰县', + '152428' => '喀喇沁旗', + '152429' => '宁城县', + '152430' => '敖汉旗', + '152500' => '锡林郭勒盟', + '152501' => '二连浩特市', + '152502' => '锡林浩特市', + '152521' => '阿巴哈纳尔旗', + '152522' => '阿巴嘎旗', + '152523' => '苏尼特左旗', + '152524' => '苏尼特右旗', + '152525' => '东乌珠穆沁旗', + '152526' => '西乌珠穆沁旗', + '152527' => '太仆寺旗', + '152528' => '镶黄旗', + '152529' => '正镶白旗', + '152530' => '正蓝旗', + '152531' => '多伦县', + '152600' => '乌兰察布盟', + '152601' => '集宁市', + '152602' => '丰镇市', + '152621' => '武川县', + '152622' => '和林格尔县', + '152623' => '清水河县', + '152624' => '卓资县', + '152625' => '化德县', + '152626' => '商都县', + '152627' => '兴和县', + '152628' => '丰镇县', + '152629' => '凉城县', + '152630' => '察哈尔右翼前旗', + '152631' => '察哈尔右翼中旗', + '152632' => '察哈尔右翼后旗', + '152633' => '达尔罕茂明安联合旗', + '152634' => '四子王旗', + '152700' => '伊克昭盟', + '152701' => '东胜市', + '152721' => '东胜县', + '152722' => '达拉特旗', + '152723' => '准格尔旗', + '152724' => '鄂托克前旗', + '152725' => '鄂托克旗', + '152726' => '杭锦旗', + '152727' => '乌审旗', + '152728' => '伊金霍洛旗', + '152800' => '巴彦淖尔盟', + '152801' => '临河市', + '152821' => '临河县', + '152822' => '五原县', + '152823' => '磴口县', + '152824' => '乌拉特前旗', + '152825' => '乌拉特中旗', + '152826' => '乌拉特后旗', + '152827' => '杭锦后旗', + '152900' => '阿拉善盟', + '152921' => '阿拉善左旗', + '152922' => '阿拉善右旗', + '152923' => '额济纳旗', + '210000' => '辽宁省', + '210100' => '沈阳市', + '210101' => '市辖区', + '210102' => '和平区', + '210103' => '沈河区', + '210104' => '大东区', + '210105' => '皇姑区', + '210106' => '铁西区', + '210111' => '苏家屯区', + '210112' => '浑南区', + '210113' => '沈北新区', + '210114' => '于洪区', + '210115' => '辽中区', + '210120' => '市区', + '210121' => '新民县', + '210122' => '辽中县', + '210123' => '康平县', + '210124' => '法库县', + '210181' => '新民市', + '210200' => '大连市', + '210201' => '市辖区', + '210202' => '中山区', + '210203' => '西岗区', + '210204' => '沙河口区', + '210211' => '甘井子区', + '210212' => '旅顺口区', + '210213' => '金州区', + '210214' => '普兰店区', + '210219' => '瓦房店市', + '210220' => '市区', + '210221' => '金县', + '210222' => '新金县', + '210223' => '复县', + '210224' => '长海县', + '210225' => '庄河县', + '210281' => '瓦房店市', + '210282' => '普兰店市', + '210283' => '庄河市', + '210300' => '鞍山市', + '210301' => '市辖区', + '210302' => '铁东区', + '210303' => '铁西区', + '210304' => '立山区', + '210311' => '千山区', + '210319' => '海城市', + '210320' => '市区', + '210321' => '台安县', + '210322' => '海城县', + '210323' => '岫岩满族自治县', + '210381' => '海城市', + '210400' => '抚顺市', + '210401' => '市辖区', + '210402' => '新抚区', + '210403' => '东洲区', + '210404' => '望花区', + '210411' => '顺城区', + '210420' => '市区', + '210421' => '抚顺县', + '210422' => '新宾满族自治县', + '210423' => '清原满族自治县', + '210500' => '本溪市', + '210501' => '市辖区', + '210502' => '平山区', + '210503' => '溪湖区', + '210504' => '明山区', + '210505' => '南芬区', + '210511' => '立新区', + '210520' => '市区', + '210521' => '本溪满族自治县', + '210522' => '桓仁满族自治县', + '210600' => '丹东市', + '210601' => '市辖区', + '210602' => '元宝区', + '210603' => '振兴区', + '210604' => '振安区', + '210620' => '市区', + '210621' => '凤城满族自治县', + '210622' => '岫岩满族自治县', + '210623' => '东沟县', + '210624' => '宽甸满族自治县', + '210681' => '东港市', + '210682' => '凤城市', + '210700' => '锦州市', + '210701' => '市辖区', + '210702' => '古塔区', + '210703' => '凌河区', + '210704' => '南票区', + '210705' => '葫芦岛区', + '210711' => '太和区', + '210719' => '锦西市', + '210720' => '市区', + '210721' => '锦西县', + '210722' => '兴城县', + '210723' => '绥中县', + '210724' => '锦县', + '210725' => '北镇满族自治县', + '210726' => '黑山县', + '210727' => '义县', + '210781' => '凌海市', + '210782' => '北镇市', + '210800' => '营口市', + '210801' => '市辖区', + '210802' => '站前区', + '210803' => '西市区', + '210804' => '鲅鱼圈区', + '210811' => '老边区', + '210812' => '鲅鱼圈区', + '210820' => '市区', + '210821' => '营口县', + '210822' => '盘山县', + '210823' => '大洼县', + '210824' => '盖县', + '210881' => '盖州市', + '210882' => '大石桥市', + '210900' => '阜新市', + '210901' => '市辖区', + '210902' => '海州区', + '210903' => '新邱区', + '210904' => '太平区', + '210905' => '清河门区', + '210911' => '细河区', + '210920' => '市区', + '210921' => '阜新蒙古族自治县', + '210922' => '彰武县', + '211000' => '辽阳市', + '211001' => '市辖区', + '211002' => '白塔区', + '211003' => '文圣区', + '211004' => '宏伟区', + '211005' => '弓长岭区', + '211011' => '太子河区', + '211020' => '市区', + '211021' => '辽阳县', + '211022' => '灯塔县', + '211081' => '灯塔市', + '211100' => '盘锦市', + '211101' => '市辖区', + '211102' => '双台子区', + '211103' => '兴隆台区', + '211104' => '大洼区', + '211111' => '郊区', + '211121' => '大洼县', + '211122' => '盘山县', + '211200' => '铁岭市', + '211201' => '市辖区', + '211202' => '银州区', + '211203' => '铁法区', + '211204' => '清河区', + '211221' => '铁岭县', + '211222' => '开原县', + '211223' => '西丰县', + '211224' => '昌图县', + '211225' => '康平县', + '211226' => '法库县', + '211281' => '调兵山市', + '211282' => '开原市', + '211300' => '朝阳市', + '211301' => '市辖区', + '211302' => '双塔区', + '211303' => '龙城区', + '211319' => '北票市', + '211321' => '朝阳县', + '211322' => '建平县', + '211323' => '凌源县', + '211324' => '喀喇沁左翼蒙古族自治县', + '211325' => '建昌县', + '211326' => '北票县', + '211381' => '北票市', + '211382' => '凌源市', + '211400' => '葫芦岛市', + '211401' => '市辖区', + '211402' => '连山区', + '211403' => '龙港区', + '211404' => '南票区', + '211421' => '绥中县', + '211422' => '建昌县', + '211481' => '兴城市', + '212100' => '铁岭地区', + '212101' => '铁岭市', + '212102' => '铁法市', + '212121' => '铁岭县', + '212122' => '开原县', + '212123' => '西丰县', + '212124' => '昌图县', + '212125' => '康平县', + '212126' => '法库县', + '212200' => '朝阳地区', + '212201' => '朝阳市', + '212221' => '朝阳县', + '212222' => '建平县', + '212223' => '凌源县', + '212224' => '喀喇沁左翼蒙古族自治县', + '212225' => '建昌县', + '212226' => '北票县', + '219000' => '省直辖县级行政区划', + '219001' => '瓦房店市', + '219002' => '海城市', + '219003' => '锦西市', + '219004' => '兴城市', + '219005' => '铁法市', + '219006' => '北票市', + '219007' => '开原市', + '219008' => '普兰店市', + '219009' => '凌源市', + '219010' => '庄河市', + '219011' => '大石桥市', + '219012' => '盖州市', + '219013' => '新民市', + '219014' => '东港市', + '219015' => '凌海市', + '219016' => '凤城市', + '220000' => '吉林省', + '220100' => '长春市', + '220101' => '市辖区', + '220102' => '南关区', + '220103' => '宽城区', + '220104' => '朝阳区', + '220105' => '二道区', + '220106' => '绿园区', + '220111' => '郊区', + '220112' => '双阳区', + '220113' => '九台区', + '220120' => '市区', + '220121' => '榆树市', + '220122' => '农安县', + '220123' => '九台县', + '220124' => '德惠县', + '220125' => '双阳县', + '220181' => '九台市', + '220182' => '榆树市', + '220183' => '德惠市', + '220184' => '公主岭市', + '220200' => '吉林市', + '220201' => '市辖区', + '220202' => '昌邑区', + '220203' => '龙潭区', + '220204' => '船营区', + '220205' => '丰满区', + '220211' => '丰满区', + '220220' => '市区', + '220221' => '永吉县', + '220222' => '舒兰县', + '220223' => '磐石县', + '220224' => '蛟河县', + '220225' => '桦甸县', + '220281' => '蛟河市', + '220282' => '桦甸市', + '220283' => '舒兰市', + '220284' => '磐石市', + '220300' => '四平市', + '220301' => '市辖区', + '220302' => '铁西区', + '220303' => '铁东区', + '220319' => '公主岭市', + '220321' => '怀德县', + '220322' => '梨树县', + '220323' => '伊通满族自治县', + '220324' => '双辽县', + '220381' => '公主岭市', + '220382' => '双辽市', + '220400' => '辽源市', + '220401' => '市辖区', + '220402' => '龙山区', + '220403' => '西安区', + '220421' => '东丰县', + '220422' => '东辽县', + '220500' => '通化市', + '220501' => '市辖区', + '220502' => '东昌区', + '220503' => '二道江区', + '220519' => '梅河口市', + '220521' => '通化县', + '220522' => '集安县', + '220523' => '辉南县', + '220524' => '柳河县', + '220581' => '梅河口市', + '220582' => '集安市', + '220600' => '白山市', + '220601' => '市辖区', + '220602' => '浑江区', + '220603' => '三岔子区', + '220604' => '临江区', + '220605' => '江源区', + '220621' => '抚松县', + '220622' => '靖宇县', + '220623' => '长白朝鲜族自治县', + '220624' => '临江县', + '220625' => '江源县', + '220681' => '临江市', + '220700' => '松原市', + '220701' => '市辖区', + '220702' => '宁江区', + '220721' => '前郭尔罗斯蒙古族自治县', + '220722' => '长岭县', + '220723' => '乾安县', + '220724' => '扶余县', + '220781' => '扶余市', + '220800' => '白城市', + '220801' => '市辖区', + '220802' => '洮北区', + '220821' => '镇赉县', + '220822' => '通榆县', + '220881' => '洮南市', + '220882' => '大安市', + '222100' => '四平地区', + '222101' => '四平市', + '222102' => '辽源市', + '222121' => '怀德县', + '222122' => '梨树县', + '222123' => '伊通县', + '222124' => '双辽县', + '222125' => '东丰县', + '222200' => '通化地区', + '222201' => '通化市', + '222202' => '浑江市', + '222221' => '海龙县', + '222222' => '通化县', + '222223' => '柳河县', + '222224' => '辉南县', + '222225' => '集安县', + '222226' => '抚松县', + '222227' => '靖宇县', + '222228' => '长白朝鲜族自治县', + '222300' => '白城地区', + '222301' => '白城市', + '222302' => '洮南市', + '222303' => '扶余市', + '222304' => '大安市', + '222321' => '扶余县', + '222322' => '洮安县', + '222323' => '长岭县', + '222324' => '前郭尔罗斯蒙古族自治县', + '222325' => '大安县', + '222326' => '镇赉县', + '222327' => '通榆县', + '222328' => '乾安县', + '222400' => '延边朝鲜族自治州', + '222401' => '延吉市', + '222402' => '图们市', + '222403' => '敦化市', + '222404' => '珲春市', + '222405' => '龙井市', + '222406' => '和龙市', + '222421' => '龙井县', + '222422' => '敦化县', + '222423' => '和龙县', + '222424' => '汪清县', + '222425' => '珲春县', + '222426' => '安图县', + '229000' => '省直辖县级行政区划', + '229001' => '公主岭市', + '229002' => '梅河口市', + '229003' => '集安市', + '229004' => '桦甸市', + '229005' => '九台市', + '229006' => '蛟河市', + '229007' => '榆树市', + '229008' => '舒兰市', + '229009' => '大安市', + '229010' => '洮南市', + '229011' => '临江市', + '229012' => '德惠市', + '230000' => '黑龙江省', + '230100' => '哈尔滨市', + '230101' => '市辖区', + '230102' => '道里区', + '230103' => '南岗区', + '230104' => '道外区', + '230105' => '太平区', + '230106' => '香坊区', + '230107' => '动力区', + '230108' => '平房区', + '230109' => '松北区', + '230110' => '香坊区', + '230111' => '呼兰区', + '230112' => '阿城区', + '230113' => '双城区', + '230119' => '阿城市', + '230121' => '呼兰县', + '230122' => '阿城县', + '230123' => '依兰县', + '230124' => '方正县', + '230125' => '宾县', + '230126' => '巴彦县', + '230127' => '木兰县', + '230128' => '通河县', + '230129' => '延寿县', + '230181' => '阿城市', + '230182' => '双城市', + '230183' => '尚志市', + '230184' => '五常市', + '230200' => '齐齐哈尔市', + '230201' => '市辖区', + '230202' => '龙沙区', + '230203' => '建华区', + '230204' => '铁锋区', + '230205' => '昂昂溪区', + '230206' => '富拉尔基区', + '230207' => '碾子山区', + '230208' => '梅里斯达斡尔族区', + '230221' => '龙江县', + '230222' => '讷河县', + '230223' => '依安县', + '230224' => '泰来县', + '230225' => '甘南县', + '230226' => '杜尔伯特蒙古族自治县', + '230227' => '富裕县', + '230228' => '林甸县', + '230229' => '克山县', + '230230' => '克东县', + '230231' => '拜泉县', + '230281' => '讷河市', + '230300' => '鸡西市', + '230301' => '市辖区', + '230302' => '鸡冠区', + '230303' => '恒山区', + '230304' => '滴道区', + '230305' => '梨树区', + '230306' => '城子河区', + '230307' => '麻山区', + '230321' => '鸡东县', + '230322' => '虎林县', + '230381' => '虎林市', + '230382' => '密山市', + '230400' => '鹤岗市', + '230401' => '市辖区', + '230402' => '向阳区', + '230403' => '工农区', + '230404' => '南山区', + '230405' => '兴安区', + '230406' => '东山区', + '230407' => '兴山区', + '230421' => '萝北县', + '230422' => '绥滨县', + '230500' => '双鸭山市', + '230501' => '市辖区', + '230502' => '尖山区', + '230503' => '岭东区', + '230504' => '岭西区', + '230505' => '四方台区', + '230506' => '宝山区', + '230521' => '集贤县', + '230522' => '友谊县', + '230523' => '宝清县', + '230524' => '饶河县', + '230600' => '大庆市', + '230601' => '市辖区', + '230602' => '萨尔图区', + '230603' => '龙凤区', + '230604' => '让胡路区', + '230605' => '红岗区', + '230606' => '大同区', + '230621' => '肇州县', + '230622' => '肇源县', + '230623' => '林甸县', + '230624' => '杜尔伯特蒙古族自治县', + '230700' => '伊春市', + '230701' => '市辖区', + '230702' => '伊春区', + '230703' => '南岔区', + '230704' => '友好区', + '230705' => '西林区', + '230706' => '翠峦区', + '230707' => '新青区', + '230708' => '美溪区', + '230709' => '金山屯区', + '230710' => '五营区', + '230711' => '乌马河区', + '230712' => '汤旺河区', + '230713' => '带岭区', + '230714' => '乌伊岭区', + '230715' => '红星区', + '230716' => '上甘岭区', + '230717' => '伊美区', + '230718' => '乌翠区', + '230719' => '友好区', + '230720' => '市区', + '230721' => '铁力县', + '230722' => '嘉荫县', + '230723' => '汤旺县', + '230724' => '丰林县', + '230725' => '南岔县', + '230726' => '大箐山县', + '230751' => '金林区', + '230781' => '铁力市', + '230800' => '佳木斯市', + '230801' => '市辖区', + '230802' => '永红区', + '230803' => '向阳区', + '230804' => '前进区', + '230805' => '东风区', + '230811' => '郊区', + '230821' => '富锦县', + '230822' => '桦南县', + '230823' => '依兰县', + '230824' => '勃利县', + '230825' => '集贤县', + '230826' => '桦川县', + '230827' => '宝清县', + '230828' => '汤原县', + '230829' => '绥滨县', + '230830' => '萝北县', + '230831' => '同江县', + '230832' => '饶河县', + '230833' => '抚远县', + '230834' => '友谊县', + '230881' => '同江市', + '230882' => '富锦市', + '230883' => '抚远市', + '230900' => '七台河市', + '230901' => '市辖区', + '230902' => '新兴区', + '230903' => '桃山区', + '230904' => '茄子河区', + '230921' => '勃利县', + '231000' => '牡丹江市', + '231001' => '市辖区', + '231002' => '东安区', + '231003' => '阳明区', + '231004' => '爱民区', + '231005' => '西安区', + '231011' => '郊区', + '231019' => '镜泊湖市', + '231020' => '绥芬河市', + '231021' => '宁安县', + '231022' => '海林县', + '231023' => '穆棱县', + '231024' => '东宁县', + '231025' => '林口县', + '231026' => '密山县', + '231027' => '虎林县', + '231081' => '绥芬河市', + '231082' => '密山市', + '231083' => '海林市', + '231084' => '宁安市', + '231085' => '穆棱市', + '231086' => '东宁市', + '231100' => '黑河市', + '231101' => '市辖区', + '231102' => '爱辉区', + '231121' => '嫩江县', + '231122' => '德都县', + '231123' => '逊克县', + '231124' => '孙吴县', + '231181' => '北安市', + '231182' => '五大连池市', + '231183' => '嫩江市', + '231200' => '绥化市', + '231201' => '市辖区', + '231202' => '北林区', + '231221' => '望奎县', + '231222' => '兰西县', + '231223' => '青冈县', + '231224' => '庆安县', + '231225' => '明水县', + '231226' => '绥棱县', + '231281' => '安达市', + '231282' => '肇东市', + '231283' => '海伦市', + '232100' => '松花江地区', + '232101' => '双城市', + '232102' => '尚志市', + '232103' => '五常市', + '232121' => '阿城县', + '232122' => '宾县', + '232123' => '呼兰县', + '232124' => '双城县', + '232125' => '五常县', + '232126' => '巴彦县', + '232127' => '木兰县', + '232128' => '通河县', + '232129' => '尚志县', + '232130' => '方正县', + '232131' => '延寿县', + '232200' => '嫩江地区', + '232221' => '龙江县', + '232222' => '讷河县', + '232223' => '依安县', + '232224' => '泰来县', + '232225' => '甘南县', + '232226' => '杜尔伯特蒙古族自治县', + '232227' => '富裕县', + '232228' => '林甸县', + '232229' => '克山县', + '232230' => '克东县', + '232231' => '拜泉县', + '232300' => '绥化地区', + '232301' => '绥化市', + '232302' => '安达市', + '232303' => '肇东市', + '232304' => '海伦市', + '232321' => '海伦县', + '232322' => '肇东县', + '232323' => '绥化县', + '232324' => '望奎县', + '232325' => '兰西县', + '232326' => '青冈县', + '232327' => '安达县', + '232328' => '肇源县', + '232329' => '肇州县', + '232330' => '庆安县', + '232331' => '明水县', + '232332' => '绥棱县', + '232400' => '合江地区', + '232401' => '佳木斯市', + '232402' => '七台河市', + '232421' => '富锦县', + '232422' => '桦南县', + '232423' => '依兰县', + '232424' => '勃利县', + '232425' => '集贤县', + '232426' => '桦川县', + '232427' => '宝清县', + '232428' => '汤原县', + '232429' => '绥滨县', + '232430' => '萝北县', + '232431' => '同江县', + '232432' => '饶河县', + '232433' => '抚远县', + '232500' => '牡丹江地区', + '232501' => '牡丹江市', + '232502' => '绥芬河市', + '232521' => '宁安县', + '232522' => '海林县', + '232523' => '穆棱县', + '232524' => '东宁县', + '232525' => '林口县', + '232526' => '鸡东县', + '232527' => '密山县', + '232528' => '虎林县', + '232600' => '黑河地区', + '232601' => '黑河市', + '232602' => '北安市', + '232603' => '五大连池市', + '232621' => '北安县', + '232622' => '嫩江县', + '232623' => '德都县', + '232624' => '爱辉县', + '232625' => '逊克县', + '232626' => '孙吴县', + '232700' => '呼中区', + '232701' => '漠河市', + '232721' => '呼玛县', + '232722' => '塔河县', + '232723' => '漠河县', + '232724' => '漠河县', + '239000' => '省直辖县级行政区划', + '239001' => '绥芬河市', + '239002' => '阿城市', + '239003' => '同江市', + '239004' => '富锦市', + '239005' => '铁力市', + '239006' => '密山市', + '239007' => '海林市', + '239008' => '讷河市', + '239009' => '北安市', + '239010' => '五大连池市', + '239011' => '宁安市', + '310000' => '上海市', + '310100' => '市辖区', + '310101' => '黄浦区', + '310102' => '南市区', + '310103' => '卢湾区', + '310104' => '徐汇区', + '310105' => '长宁区', + '310106' => '静安区', + '310107' => '普陀区', + '310108' => '闸北区', + '310109' => '虹口区', + '310110' => '杨浦区', + '310111' => '吴淞区', + '310112' => '闵行区', + '310113' => '宝山区', + '310114' => '嘉定区', + '310115' => '浦东新区', + '310116' => '金山区', + '310117' => '松江区', + '310118' => '青浦区', + '310119' => '南汇区', + '310120' => '奉贤区', + '310151' => '崇明区', + '310221' => '上海县', + '310222' => '嘉定县', + '310223' => '宝山县', + '310224' => '川沙县', + '310225' => '南汇县', + '310226' => '奉贤县', + '310227' => '松江县', + '310228' => '金山县', + '310229' => '青浦县', + '310230' => '崇明县', + '320000' => '江苏省', + '320100' => '南京市', + '320101' => '市辖区', + '320102' => '玄武区', + '320103' => '白下区', + '320104' => '秦淮区', + '320105' => '建邺区', + '320106' => '鼓楼区', + '320107' => '下关区', + '320111' => '浦口区', + '320112' => '大厂区', + '320113' => '栖霞区', + '320114' => '雨花台区', + '320115' => '江宁区', + '320116' => '六合区', + '320117' => '溧水区', + '320118' => '高淳区', + '320120' => '市区', + '320121' => '江宁县', + '320122' => '江浦县', + '320123' => '六合县', + '320124' => '溧水县', + '320125' => '高淳县', + '320200' => '无锡市', + '320201' => '市辖区', + '320202' => '崇安区', + '320203' => '南长区', + '320204' => '北塘区', + '320205' => '锡山区', + '320206' => '惠山区', + '320211' => '滨湖区', + '320212' => '马山区', + '320213' => '梁溪区', + '320214' => '新吴区', + '320219' => '江阴市', + '320221' => '江阴县', + '320222' => '无锡县', + '320223' => '宜兴县', + '320281' => '江阴市', + '320282' => '宜兴市', + '320283' => '锡山市', + '320300' => '徐州市', + '320301' => '市辖区', + '320302' => '鼓楼区', + '320303' => '云龙区', + '320304' => '九里区', + '320305' => '贾汪区', + '320311' => '泉山区', + '320312' => '铜山区', + '320321' => '丰县', + '320322' => '沛县', + '320323' => '铜山县', + '320324' => '睢宁县', + '320325' => '邳县', + '320326' => '新沂县', + '320381' => '新沂市', + '320382' => '邳州市', + '320400' => '常州市', + '320401' => '市辖区', + '320402' => '天宁区', + '320403' => '广化区', + '320404' => '钟楼区', + '320405' => '戚墅堰区', + '320411' => '新北区', + '320412' => '武进区', + '320413' => '金坛区', + '320419' => '武进市', + '320421' => '武进县', + '320422' => '金坛县', + '320423' => '溧阳县', + '320481' => '溧阳市', + '320482' => '金坛市', + '320483' => '武进市', + '320500' => '苏州市', + '320501' => '市辖区', + '320502' => '沧浪区', + '320503' => '平江区', + '320504' => '金阊区', + '320505' => '虎丘区', + '320506' => '吴中区', + '320507' => '相城区', + '320508' => '姑苏区', + '320509' => '吴江区', + '320511' => '郊区', + '320520' => '常熟市', + '320521' => '沙洲县', + '320522' => '太仓县', + '320523' => '昆山县', + '320524' => '吴县', + '320525' => '吴江县', + '320581' => '常熟市', + '320582' => '张家港市', + '320583' => '昆山市', + '320584' => '吴江市', + '320585' => '太仓市', + '320586' => '吴县市', + '320600' => '南通市', + '320601' => '市辖区', + '320602' => '崇川区', + '320611' => '港闸区', + '320612' => '通州区', + '320613' => '海门区', + '320621' => '海安县', + '320622' => '如皋县', + '320623' => '如东县', + '320624' => '南通县', + '320625' => '海门县', + '320626' => '启东县', + '320681' => '启东市', + '320682' => '如皋市', + '320683' => '通州市', + '320684' => '海门市', + '320685' => '海安市', + '320700' => '连云港市', + '320701' => '市辖区', + '320702' => '新海区', + '320703' => '连云区', + '320704' => '云台区', + '320705' => '新浦区', + '320706' => '海州区', + '320707' => '赣榆区', + '320721' => '赣榆县', + '320722' => '东海县', + '320723' => '灌云县', + '320724' => '灌南县', + '320800' => '淮安市', + '320801' => '市辖区', + '320802' => '清河区', + '320803' => '淮安区', + '320804' => '淮阴区', + '320811' => '清浦区', + '320812' => '清江浦区', + '320813' => '洪泽区', + '320819' => '宿迁市', + '320821' => '淮阴县', + '320822' => '灌南县', + '320823' => '沭阳县', + '320824' => '宿迁县', + '320825' => '泗阳县', + '320826' => '涟水县', + '320827' => '泗洪县', + '320828' => '淮安县', + '320829' => '洪泽县', + '320830' => '盱眙县', + '320831' => '金湖县', + '320881' => '宿迁市', + '320882' => '淮安市', + '320900' => '盐城市', + '320901' => '市辖区', + '320902' => '亭湖区', + '320903' => '盐都区', + '320904' => '大丰区', + '320911' => '郊区', + '320919' => '东台市', + '320921' => '响水县', + '320922' => '滨海县', + '320923' => '阜宁县', + '320924' => '射阳县', + '320925' => '建湖县', + '320926' => '大丰县', + '320927' => '东台县', + '320928' => '盐都县', + '320981' => '东台市', + '320982' => '大丰市', + '321000' => '扬州市', + '321001' => '市辖区', + '321002' => '广陵区', + '321003' => '邗江区', + '321011' => '维扬区', + '321012' => '江都区', + '321019' => '仪征市', + '321020' => '泰州市', + '321021' => '兴化县', + '321022' => '高邮县', + '321023' => '宝应县', + '321024' => '靖江县', + '321025' => '泰兴县', + '321026' => '江都县', + '321027' => '邗江县', + '321028' => '泰县', + '321029' => '仪征县', + '321081' => '仪征市', + '321082' => '泰州市', + '321083' => '兴化市', + '321084' => '高邮市', + '321085' => '泰兴市', + '321086' => '靖江市', + '321087' => '姜堰市', + '321088' => '江都市', + '321100' => '镇江市', + '321101' => '市辖区', + '321102' => '京口区', + '321111' => '润州区', + '321112' => '丹徒区', + '321119' => '丹阳市', + '321121' => '丹徒县', + '321122' => '丹阳县', + '321123' => '句容县', + '321124' => '扬中县', + '321181' => '丹阳市', + '321182' => '扬中市', + '321183' => '句容市', + '321200' => '泰州市', + '321201' => '市辖区', + '321202' => '海陵区', + '321203' => '高港区', + '321204' => '姜堰区', + '321281' => '兴化市', + '321282' => '靖江市', + '321283' => '泰兴市', + '321284' => '姜堰市', + '321300' => '宿迁市', + '321301' => '市辖区', + '321302' => '宿城区', + '321311' => '宿豫区', + '321321' => '宿豫县', + '321322' => '沭阳县', + '321323' => '泗阳县', + '321324' => '泗洪县', + '322100' => '徐州地区', + '322121' => '丰县', + '322122' => '沛县', + '322123' => '铜山县', + '322124' => '睢宁县', + '322125' => '邳县', + '322126' => '新沂县', + '322127' => '东海县', + '322128' => '赣榆县', + '322200' => '淮阴地区', + '322201' => '清江市', + '322221' => '淮阴县', + '322222' => '灌云县', + '322223' => '灌南县', + '322224' => '沭阳县', + '322225' => '宿迁县', + '322226' => '泗阳县', + '322227' => '涟水县', + '322228' => '泗洪县', + '322229' => '淮安县', + '322230' => '洪泽县', + '322231' => '盱眙县', + '322232' => '金湖县', + '322300' => '盐城地区', + '322321' => '响水县', + '322322' => '滨海县', + '322323' => '阜宁县', + '322324' => '射阳县', + '322325' => '建湖县', + '322326' => '盐城县', + '322327' => '大丰县', + '322328' => '东台县', + '322400' => '扬州地区', + '322401' => '扬州市', + '322402' => '泰州市', + '322421' => '兴化县', + '322422' => '高邮县', + '322423' => '宝应县', + '322424' => '靖江县', + '322425' => '泰兴县', + '322426' => '江都县', + '322427' => '邗江县', + '322428' => '泰县', + '322429' => '仪征县', + '322500' => '南通地区', + '322521' => '海安县', + '322522' => '如皋县', + '322523' => '如东县', + '322524' => '通州县', + '322525' => '海门县', + '322526' => '启东县', + '322600' => '镇江地区', + '322601' => '镇江市', + '322621' => '丹徒县', + '322622' => '武进县', + '322623' => '丹阳县', + '322624' => '句容县', + '322625' => '金坛县', + '322626' => '溧水县', + '322627' => '高淳县', + '322628' => '溧阳县', + '322629' => '宜兴县', + '322630' => '扬中县', + '322700' => '苏州地区', + '322721' => '江阴县', + '322722' => '无锡县', + '322723' => '沙洲县', + '322724' => '常熟县', + '322725' => '太仓县', + '322726' => '昆山县', + '322727' => '吴县', + '322728' => '吴江县', + '329000' => '省直辖县级行政区划', + '329001' => '泰州市', + '329002' => '仪征市', + '329003' => '常熟市', + '329004' => '张家港市', + '329005' => '江阴市', + '329006' => '宿迁市', + '329007' => '丹阳市', + '329008' => '东台市', + '329009' => '兴化市', + '329010' => '淮安市', + '329011' => '宜兴市', + '329012' => '昆山市', + '329013' => '启东市', + '329014' => '新沂市', + '329015' => '溧阳市', + '329016' => '如皋市', + '329017' => '高邮市', + '329018' => '吴江市', + '329019' => '邳州市', + '329020' => '泰兴市', + '329021' => '通州市', + '329022' => '太仓市', + '329023' => '靖江市', + '329024' => '金坛市', + '329025' => '江都市', + '329026' => '海门市', + '329027' => '扬中市', + '329028' => '姜堰市', + '330000' => '浙江省', + '330100' => '杭州市', + '330101' => '市辖区', + '330102' => '上城区', + '330103' => '下城区', + '330104' => '江干区', + '330105' => '拱墅区', + '330106' => '西湖区', + '330107' => '半山区', + '330108' => '滨江区', + '330109' => '萧山区', + '330110' => '余杭区', + '330111' => '富阳区', + '330112' => '临安区', + '330113' => '临平区', + '330114' => '钱塘区', + '330120' => '市区', + '330121' => '萧山县', + '330122' => '桐庐县', + '330123' => '富阳县', + '330124' => '临安县', + '330125' => '余杭县', + '330126' => '建德县', + '330127' => '淳安县', + '330181' => '萧山市', + '330182' => '建德市', + '330183' => '富阳市', + '330184' => '余杭市', + '330185' => '临安市', + '330200' => '宁波市', + '330201' => '市辖区', + '330202' => '镇明区', + '330203' => '海曙区', + '330204' => '江东区', + '330205' => '江北区', + '330206' => '北仑区', + '330211' => '镇海区', + '330212' => '鄞州区', + '330213' => '奉化区', + '330219' => '余姚市', + '330220' => '市区', + '330221' => '镇海县', + '330222' => '慈溪县', + '330223' => '余姚县', + '330224' => '奉化县', + '330225' => '象山县', + '330226' => '宁海县', + '330227' => '鄞县', + '330281' => '余姚市', + '330282' => '慈溪市', + '330283' => '奉化市', + '330300' => '温州市', + '330301' => '市辖区', + '330302' => '鹿城区', + '330303' => '龙湾区', + '330304' => '瓯海区', + '330305' => '洞头区', + '330320' => '市区', + '330321' => '瓯海县', + '330322' => '洞头县', + '330323' => '乐清县', + '330324' => '永嘉县', + '330325' => '瑞安县', + '330326' => '平阳县', + '330327' => '苍南县', + '330328' => '文成县', + '330329' => '泰顺县', + '330381' => '瑞安市', + '330382' => '乐清市', + '330383' => '龙港市', + '330400' => '嘉兴市', + '330401' => '市辖区', + '330402' => '南湖区', + '330411' => '秀洲区', + '330419' => '海宁市', + '330421' => '嘉善县', + '330422' => '平湖县', + '330423' => '海宁县', + '330424' => '海盐县', + '330425' => '桐乡县', + '330481' => '海宁市', + '330482' => '平湖市', + '330483' => '桐乡市', + '330500' => '湖州市', + '330501' => '市辖区', + '330502' => '吴兴区', + '330503' => '南浔区', + '330511' => '郊区', + '330521' => '德清县', + '330522' => '长兴县', + '330523' => '安吉县', + '330600' => '绍兴市', + '330601' => '市辖区', + '330602' => '越城区', + '330603' => '柯桥区', + '330604' => '上虞区', + '330621' => '绍兴县', + '330622' => '上虞县', + '330623' => '嵊县', + '330624' => '新昌县', + '330625' => '诸暨县', + '330681' => '诸暨市', + '330682' => '上虞市', + '330683' => '嵊州市', + '330700' => '金华市', + '330701' => '市辖区', + '330702' => '婺城区', + '330703' => '金东区', + '330719' => '兰溪市', + '330721' => '金华县', + '330722' => '永康县', + '330723' => '武义县', + '330724' => '东阳县', + '330725' => '义乌县', + '330726' => '浦江县', + '330727' => '磐安县', + '330781' => '兰溪市', + '330782' => '义乌市', + '330783' => '东阳市', + '330784' => '永康市', + '330800' => '衢州市', + '330801' => '市辖区', + '330802' => '柯城区', + '330803' => '衢江区', + '330821' => '衢县', + '330822' => '常山县', + '330823' => '江山县', + '330824' => '开化县', + '330825' => '龙游县', + '330881' => '江山市', + '330900' => '舟山市', + '330901' => '市辖区', + '330902' => '定海区', + '330903' => '普陀区', + '330921' => '岱山县', + '330922' => '嵊泗县', + '331000' => '台州市', + '331001' => '市辖区', + '331002' => '椒江区', + '331003' => '黄岩区', + '331004' => '路桥区', + '331021' => '玉环县', + '331022' => '三门县', + '331023' => '天台县', + '331024' => '仙居县', + '331081' => '温岭市', + '331082' => '临海市', + '331083' => '玉环市', + '331100' => '丽水市', + '331101' => '市辖区', + '331102' => '莲都区', + '331121' => '青田县', + '331122' => '缙云县', + '331123' => '遂昌县', + '331124' => '松阳县', + '331125' => '云和县', + '331126' => '庆元县', + '331127' => '景宁畲族自治县', + '331181' => '龙泉市', + '332100' => '嘉兴地区', + '332101' => '湖州市', + '332102' => '嘉兴市', + '332121' => '嘉善县', + '332122' => '平湖县', + '332123' => '海宁县', + '332124' => '海盐县', + '332125' => '桐乡县', + '332126' => '德清县', + '332127' => '长兴县', + '332128' => '安吉县', + '332200' => '宁波地区', + '332221' => '慈溪县', + '332222' => '余姚县', + '332223' => '奉化县', + '332224' => '象山县', + '332225' => '宁海县', + '332226' => '鄞县', + '332300' => '绍兴地区', + '332301' => '绍兴市', + '332321' => '上虞县', + '332322' => '嵊县', + '332323' => '新昌县', + '332324' => '诸暨县', + '332400' => '金华地区', + '332401' => '金华市', + '332402' => '衢州市', + '332421' => '兰溪县', + '332422' => '永康县', + '332423' => '武义县', + '332424' => '东阳县', + '332425' => '义乌县', + '332426' => '浦江县', + '332427' => '常山县', + '332428' => '江山县', + '332429' => '开化县', + '332430' => '龙游县', + '332431' => '磐安县', + '332500' => '丽水地区', + '332501' => '丽水市', + '332502' => '龙泉市', + '332521' => '丽水县', + '332522' => '青田县', + '332523' => '云和县', + '332524' => '龙泉县', + '332525' => '庆元县', + '332526' => '缙云县', + '332527' => '遂昌县', + '332528' => '松阳县', + '332529' => '景宁畲族自治县', + '332600' => '台州地区', + '332601' => '椒江市', + '332602' => '临海市', + '332603' => '黄岩市', + '332604' => '温岭市', + '332621' => '临海县', + '332622' => '黄岩县', + '332623' => '温岭县', + '332624' => '仙居县', + '332625' => '天台县', + '332626' => '三门县', + '332627' => '玉环县', + '332700' => '舟山地区', + '332721' => '定海县', + '332722' => '普陀县', + '332723' => '岱山县', + '332724' => '嵊泗县', + '339000' => '省直辖县级行政区划', + '339001' => '余姚市', + '339002' => '海宁市', + '339003' => '兰溪市', + '339004' => '瑞安市', + '339005' => '萧山市', + '339006' => '江山市', + '339007' => '义乌市', + '339008' => '东阳市', + '339009' => '慈溪市', + '339010' => '奉化市', + '339011' => '诸暨市', + '339012' => '平湖市', + '339013' => '建德市', + '339014' => '永康市', + '339015' => '上虞市', + '339016' => '桐乡市', + '339017' => '乐清市', + '339018' => '临海市', + '339019' => '富阳市', + '339020' => '温岭市', + '339021' => '余杭市', + '340000' => '安徽省', + '340100' => '合肥市', + '340101' => '市辖区', + '340102' => '瑶海区', + '340103' => '庐阳区', + '340104' => '蜀山区', + '340111' => '包河区', + '340120' => '市区', + '340121' => '长丰县', + '340122' => '肥东县', + '340123' => '肥西县', + '340124' => '庐江县', + '340181' => '巢湖市', + '340200' => '芜湖市', + '340201' => '市辖区', + '340202' => '镜湖区', + '340203' => '弋江区', + '340204' => '新芜区', + '340205' => '裕溪口区', + '340206' => '四褐山区', + '340207' => '鸠江区', + '340208' => '三山区', + '340209' => '湾沚区', + '340210' => '繁昌区', + '340211' => '郊区', + '340220' => '市区', + '340221' => '芜湖县', + '340222' => '繁昌县', + '340223' => '南陵县', + '340224' => '青阳县', + '340225' => '无为县', + '340281' => '无为市', + '340300' => '蚌埠市', + '340301' => '市辖区', + '340302' => '龙子湖区', + '340303' => '蚌山区', + '340304' => '禹会区', + '340311' => '淮上区', + '340321' => '怀远县', + '340322' => '五河县', + '340323' => '固镇县', + '340400' => '淮南市', + '340401' => '市辖区', + '340402' => '大通区', + '340403' => '田家庵区', + '340404' => '谢家集区', + '340405' => '八公山区', + '340406' => '潘集区', + '340420' => '市区', + '340421' => '凤台县', + '340422' => '寿县', + '340500' => '马鞍山市', + '340501' => '市辖区', + '340502' => '金家庄区', + '340503' => '花山区', + '340504' => '雨山区', + '340505' => '向山区', + '340506' => '博望区', + '340521' => '当涂县', + '340522' => '含山县', + '340523' => '和县', + '340600' => '淮北市', + '340601' => '市辖区', + '340602' => '杜集区', + '340603' => '相山区', + '340604' => '烈山区', + '340611' => '郊区', + '340620' => '市区', + '340621' => '濉溪县', + '340700' => '铜陵市', + '340701' => '市辖区', + '340702' => '铜官山区', + '340703' => '狮子山区', + '340704' => '铜山区', + '340705' => '铜官区', + '340706' => '义安区', + '340711' => '郊区', + '340720' => '市区', + '340721' => '铜陵县', + '340722' => '枞阳县', + '340800' => '安庆市', + '340801' => '市辖区', + '340802' => '迎江区', + '340803' => '大观区', + '340811' => '宜秀区', + '340821' => '桐城县', + '340822' => '怀宁县', + '340823' => '枞阳县', + '340824' => '潜山县', + '340825' => '太湖县', + '340826' => '宿松县', + '340827' => '望江县', + '340828' => '岳西县', + '340881' => '桐城市', + '340882' => '潜山市', + '340900' => '直辖行政单位', + '340901' => '黄山市', + '341000' => '黄山市', + '341001' => '市辖区', + '341002' => '屯溪区', + '341003' => '黄山区', + '341004' => '徽州区', + '341021' => '歙县', + '341022' => '休宁县', + '341023' => '黟县', + '341024' => '祁门县', + '341100' => '滁州市', + '341101' => '市辖区', + '341102' => '琅琊区', + '341103' => '南谯区', + '341121' => '天长县', + '341122' => '来安县', + '341123' => '滁县', + '341124' => '全椒县', + '341125' => '定远县', + '341126' => '凤阳县', + '341127' => '嘉山县', + '341181' => '天长市', + '341182' => '明光市', + '341200' => '阜阳市', + '341201' => '市辖区', + '341202' => '颍州区', + '341203' => '颍东区', + '341204' => '颍泉区', + '341221' => '临泉县', + '341222' => '太和县', + '341223' => '涡阳县', + '341224' => '蒙城县', + '341225' => '阜南县', + '341226' => '颍上县', + '341227' => '利辛县', + '341281' => '亳州市', + '341282' => '界首市', + '341300' => '宿州市', + '341301' => '市辖区', + '341302' => '埇桥区', + '341321' => '砀山县', + '341322' => '萧县', + '341323' => '灵璧县', + '341324' => '泗县', + '341400' => '巢湖市', + '341401' => '市辖区', + '341402' => '居巢区', + '341421' => '庐江县', + '341422' => '无为县', + '341423' => '含山县', + '341424' => '和县', + '341500' => '六安市', + '341501' => '市辖区', + '341502' => '金安区', + '341503' => '裕安区', + '341504' => '叶集区', + '341521' => '寿县', + '341522' => '霍邱县', + '341523' => '舒城县', + '341524' => '金寨县', + '341525' => '霍山县', + '341600' => '亳州市', + '341601' => '市辖区', + '341602' => '谯城区', + '341621' => '涡阳县', + '341622' => '蒙城县', + '341623' => '利辛县', + '341700' => '池州市', + '341701' => '市辖区', + '341702' => '贵池区', + '341721' => '东至县', + '341722' => '石台县', + '341723' => '青阳县', + '341800' => '宣城市', + '341801' => '市辖区', + '341802' => '宣州区', + '341821' => '郎溪县', + '341822' => '广德县', + '341823' => '泾县', + '341824' => '绩溪县', + '341825' => '旌德县', + '341881' => '宁国市', + '341882' => '广德市', + '342100' => '阜阳地区', + '342101' => '阜阳市', + '342102' => '亳州市', + '342103' => '界首市', + '342121' => '阜阳县', + '342122' => '临泉县', + '342123' => '太和县', + '342124' => '涡阳县', + '342125' => '蒙城县', + '342126' => '亳县', + '342127' => '阜南县', + '342128' => '颍上县', + '342129' => '界首县', + '342130' => '利辛县', + '342200' => '宿县地区', + '342201' => '宿州市', + '342221' => '砀山县', + '342222' => '萧县', + '342223' => '宿县', + '342224' => '灵璧县', + '342225' => '泗县', + '342226' => '怀远县', + '342227' => '五河县', + '342228' => '固镇县', + '342300' => '滁县地区', + '342301' => '滁州市', + '342321' => '天长县', + '342322' => '来安县', + '342323' => '滁县', + '342324' => '全椒县', + '342325' => '定远县', + '342326' => '凤阳县', + '342327' => '嘉山县', + '342400' => '六安地区', + '342401' => '六安市', + '342421' => '六安县', + '342422' => '寿县', + '342423' => '霍邱县', + '342424' => '肥西县', + '342425' => '舒城县', + '342426' => '金寨县', + '342427' => '霍山县', + '342500' => '宣城地区', + '342501' => '宣州市', + '342502' => '宁国市', + '342521' => '宣城县', + '342522' => '郎溪县', + '342523' => '广德县', + '342524' => '宁国县', + '342525' => '当涂县', + '342526' => '繁昌县', + '342527' => '南陵县', + '342528' => '青阳县', + '342529' => '泾县', + '342530' => '旌德县', + '342531' => '绩溪县', + '342600' => '巢湖地区', + '342601' => '巢湖市', + '342621' => '肥东县', + '342622' => '庐江县', + '342623' => '无为县', + '342624' => '巢县', + '342625' => '含山县', + '342626' => '和县', + '342700' => '徽州地区', + '342701' => '屯溪市', + '342721' => '绩溪县', + '342722' => '旌德县', + '342723' => '歙县', + '342724' => '休宁县', + '342725' => '黟县', + '342726' => '祁门县', + '342727' => '太平县', + '342728' => '石台县', + '342800' => '安庆地区', + '342821' => '怀宁县', + '342822' => '桐城县', + '342823' => '枞阳县', + '342824' => '潜山县', + '342825' => '太湖县', + '342826' => '宿松县', + '342827' => '望江县', + '342828' => '岳西县', + '342829' => '东至县', + '342830' => '贵池县', + '342900' => '池州地区', + '342901' => '贵池市', + '342921' => '东至县', + '342922' => '石台县', + '342923' => '青阳县', + '342931' => '石台县', + '349000' => '省直辖县级行政区划', + '349001' => '天长市', + '349002' => '明光市', + '350000' => '福建省', + '350100' => '福州市', + '350101' => '市辖区', + '350102' => '鼓楼区', + '350103' => '台江区', + '350104' => '仓山区', + '350105' => '马尾区', + '350111' => '晋安区', + '350112' => '长乐区', + '350120' => '市区', + '350121' => '闽侯县', + '350122' => '连江县', + '350123' => '罗源县', + '350124' => '闽清县', + '350125' => '永泰县', + '350126' => '长乐县', + '350127' => '福清县', + '350128' => '平潭县', + '350181' => '福清市', + '350182' => '长乐市', + '350200' => '厦门市', + '350201' => '市辖区', + '350202' => '鼓浪屿区', + '350203' => '思明区', + '350204' => '开元区', + '350205' => '海沧区', + '350206' => '湖里区', + '350211' => '集美区', + '350212' => '同安区', + '350213' => '翔安区', + '350220' => '市区', + '350221' => '同安县', + '350300' => '莆田市', + '350301' => '市辖区', + '350302' => '城厢区', + '350303' => '涵江区', + '350304' => '荔城区', + '350305' => '秀屿区', + '350321' => '莆田县', + '350322' => '仙游县', + '350400' => '三明市', + '350401' => '市辖区', + '350402' => '梅列区', + '350403' => '三元区', + '350404' => '沙县区', + '350420' => '永安市', + '350421' => '明溪县', + '350422' => '永安县', + '350423' => '清流县', + '350424' => '宁化县', + '350425' => '大田县', + '350426' => '尤溪县', + '350427' => '沙县', + '350428' => '将乐县', + '350429' => '泰宁县', + '350430' => '建宁县', + '350481' => '永安市', + '350500' => '泉州市', + '350501' => '市辖区', + '350502' => '鲤城区', + '350503' => '丰泽区', + '350504' => '洛江区', + '350505' => '泉港区', + '350521' => '惠安县', + '350522' => '晋江县', + '350523' => '南安县', + '350524' => '安溪县', + '350525' => '永春县', + '350526' => '德化县', + '350527' => '金门县', + '350581' => '石狮市', + '350582' => '晋江市', + '350583' => '南安市', + '350600' => '漳州市', + '350601' => '市辖区', + '350602' => '芗城区', + '350603' => '龙文区', + '350604' => '龙海区', + '350605' => '长泰区', + '350621' => '龙海县', + '350622' => '云霄县', + '350623' => '漳浦县', + '350624' => '诏安县', + '350625' => '长泰县', + '350626' => '东山县', + '350627' => '南靖县', + '350628' => '平和县', + '350629' => '华安县', + '350681' => '龙海市', + '350700' => '南平市', + '350701' => '市辖区', + '350702' => '延平区', + '350703' => '建阳区', + '350721' => '顺昌县', + '350722' => '浦城县', + '350723' => '光泽县', + '350724' => '松溪县', + '350725' => '政和县', + '350781' => '邵武市', + '350782' => '武夷山市', + '350783' => '建瓯市', + '350784' => '建阳市', + '350800' => '龙岩市', + '350801' => '市辖区', + '350802' => '新罗区', + '350803' => '永定区', + '350821' => '长汀县', + '350822' => '永定县', + '350823' => '上杭县', + '350824' => '武平县', + '350825' => '连城县', + '350881' => '漳平市', + '350900' => '宁德市', + '350901' => '市辖区', + '350902' => '蕉城区', + '350921' => '霞浦县', + '350922' => '古田县', + '350923' => '屏南县', + '350924' => '寿宁县', + '350925' => '周宁县', + '350926' => '柘荣县', + '350981' => '福安市', + '350982' => '福鼎市', + '352100' => '南平地区', + '352101' => '南平市', + '352102' => '邵武市', + '352103' => '武夷山市', + '352104' => '建瓯市', + '352105' => '建阳市', + '352121' => '顺昌县', + '352122' => '建阳县', + '352123' => '建瓯县', + '352124' => '浦城县', + '352125' => '邵武县', + '352126' => '崇安县', + '352127' => '光泽县', + '352128' => '松溪县', + '352129' => '政和县', + '352200' => '宁德地区', + '352201' => '宁德市', + '352202' => '福安市', + '352203' => '福鼎市', + '352221' => '宁德县', + '352222' => '连江县', + '352223' => '罗源县', + '352224' => '福鼎县', + '352225' => '霞浦县', + '352226' => '福安县', + '352227' => '古田县', + '352228' => '屏南县', + '352229' => '寿宁县', + '352230' => '周宁县', + '352231' => '柘荣县', + '352300' => '莆田地区', + '352321' => '闽清县', + '352322' => '永泰县', + '352323' => '长乐县', + '352324' => '福清县', + '352325' => '平潭县', + '352326' => '莆田县', + '352327' => '仙游县', + '352400' => '晋江地区', + '352401' => '泉州市', + '352421' => '惠安县', + '352422' => '晋江县', + '352423' => '南安县', + '352424' => '安溪县', + '352425' => '永春县', + '352426' => '德化县', + '352427' => '金门县', + '352500' => '龙溪地区', + '352501' => '漳州市', + '352521' => '龙海县', + '352522' => '云霄县', + '352523' => '漳浦县', + '352524' => '诏安县', + '352525' => '长泰县', + '352526' => '东山县', + '352527' => '南靖县', + '352528' => '平和县', + '352529' => '华安县', + '352600' => '龙岩地区', + '352601' => '龙岩市', + '352602' => '漳平市', + '352621' => '龙岩县', + '352622' => '长汀县', + '352623' => '永定县', + '352624' => '上杭县', + '352625' => '武平县', + '352626' => '漳平县', + '352627' => '连城县', + '352700' => '三明地区', + '352701' => '三明市', + '352721' => '明溪县', + '352722' => '永安县', + '352723' => '清流县', + '352724' => '宁化县', + '352725' => '大田县', + '352726' => '尤溪县', + '352727' => '沙县', + '352728' => '将乐县', + '352729' => '泰宁县', + '352730' => '建宁县', + '359000' => '省直辖县级行政区划', + '359001' => '永安市', + '359002' => '石狮市', + '359003' => '福清市', + '359004' => '晋江市', + '359005' => '南安市', + '359006' => '龙海市', + '359007' => '邵武市', + '359008' => '武夷山市', + '359009' => '建瓯市', + '359010' => '建阳市', + '359011' => '长乐市', + '360000' => '江西省', + '360100' => '南昌市', + '360101' => '市辖区', + '360102' => '东湖区', + '360103' => '西湖区', + '360104' => '青云谱区', + '360105' => '湾里区', + '360111' => '青山湖区', + '360112' => '新建区', + '360113' => '红谷滩区', + '360120' => '市区', + '360121' => '南昌县', + '360122' => '新建县', + '360123' => '安义县', + '360124' => '进贤县', + '360200' => '景德镇市', + '360201' => '市辖区', + '360202' => '昌江区', + '360203' => '珠山区', + '360211' => '鹅湖区', + '360212' => '蛟潭区', + '360221' => '乐平县', + '360222' => '浮梁县', + '360281' => '乐平市', + '360300' => '萍乡市', + '360301' => '市辖区', + '360302' => '安源区', + '360311' => '上栗区', + '360312' => '芦溪区', + '360313' => '湘东区', + '360321' => '莲花县', + '360322' => '上栗县', + '360323' => '芦溪县', + '360400' => '九江市', + '360401' => '市辖区', + '360402' => '濂溪区', + '360403' => '浔阳区', + '360404' => '柴桑区', + '360421' => '九江县', + '360422' => '瑞昌县', + '360423' => '武宁县', + '360424' => '修水县', + '360425' => '永修县', + '360426' => '德安县', + '360427' => '星子县', + '360428' => '都昌县', + '360429' => '湖口县', + '360430' => '彭泽县', + '360481' => '瑞昌市', + '360482' => '共青城市', + '360483' => '庐山市', + '360500' => '新余市', + '360501' => '市辖区', + '360502' => '渝水区', + '360521' => '分宜县', + '360600' => '鹰潭市', + '360601' => '市辖区', + '360602' => '月湖区', + '360603' => '余江区', + '360621' => '贵溪县', + '360622' => '余江县', + '360681' => '贵溪市', + '360700' => '赣州市', + '360701' => '市辖区', + '360702' => '章贡区', + '360703' => '南康区', + '360704' => '赣县区', + '360721' => '赣县', + '360722' => '信丰县', + '360723' => '大余县', + '360724' => '上犹县', + '360725' => '崇义县', + '360726' => '安远县', + '360727' => '龙南县', + '360728' => '定南县', + '360729' => '全南县', + '360730' => '宁都县', + '360731' => '于都县', + '360732' => '兴国县', + '360733' => '会昌县', + '360734' => '寻乌县', + '360735' => '石城县', + '360781' => '瑞金市', + '360782' => '南康市', + '360783' => '龙南市', + '360800' => '吉安市', + '360801' => '市辖区', + '360802' => '吉州区', + '360803' => '青原区', + '360821' => '吉安县', + '360822' => '吉水县', + '360823' => '峡江县', + '360824' => '新干县', + '360825' => '永丰县', + '360826' => '泰和县', + '360827' => '遂川县', + '360828' => '万安县', + '360829' => '安福县', + '360830' => '永新县', + '360881' => '井冈山市', + '360900' => '宜春市', + '360901' => '市辖区', + '360902' => '袁州区', + '360921' => '奉新县', + '360922' => '万载县', + '360923' => '上高县', + '360924' => '宜丰县', + '360925' => '靖安县', + '360926' => '铜鼓县', + '360981' => '丰城市', + '360982' => '樟树市', + '360983' => '高安市', + '361000' => '抚州市', + '361001' => '市辖区', + '361002' => '临川区', + '361003' => '东乡区', + '361021' => '南城县', + '361022' => '黎川县', + '361023' => '南丰县', + '361024' => '崇仁县', + '361025' => '乐安县', + '361026' => '宜黄县', + '361027' => '金溪县', + '361028' => '资溪县', + '361029' => '东乡县', + '361030' => '广昌县', + '361100' => '上饶市', + '361101' => '市辖区', + '361102' => '信州区', + '361103' => '广丰区', + '361104' => '广信区', + '361121' => '上饶县', + '361122' => '广丰县', + '361123' => '玉山县', + '361124' => '铅山县', + '361125' => '横峰县', + '361126' => '弋阳县', + '361127' => '余干县', + '361128' => '鄱阳县', + '361129' => '万年县', + '361130' => '婺源县', + '361181' => '德兴市', + '362100' => '赣州地区', + '362101' => '赣州市', + '362102' => '瑞金市', + '362103' => '南康市', + '362121' => '赣县', + '362122' => '南康县', + '362123' => '信丰县', + '362124' => '大余县', + '362125' => '上犹县', + '362126' => '崇义县', + '362127' => '安远县', + '362128' => '龙南县', + '362129' => '定南县', + '362130' => '全南县', + '362131' => '宁都县', + '362132' => '于都县', + '362133' => '兴国县', + '362134' => '瑞金县', + '362135' => '会昌县', + '362136' => '寻乌县', + '362137' => '石城县', + '362138' => '广昌县', + '362200' => '宜春地区', + '362201' => '宜春市', + '362202' => '丰城市', + '362203' => '樟树市', + '362204' => '高安市', + '362221' => '丰城县', + '362222' => '高安县', + '362223' => '清江县', + '362224' => '新余县', + '362225' => '宜春县', + '362226' => '奉新县', + '362227' => '万载县', + '362228' => '上高县', + '362229' => '宜丰县', + '362230' => '分宜县', + '362231' => '安义县', + '362232' => '靖安县', + '362233' => '铜鼓县', + '362300' => '上饶地区', + '362301' => '上饶市', + '362302' => '德兴市', + '362321' => '上饶县', + '362322' => '广丰县', + '362323' => '玉山县', + '362324' => '铅山县', + '362325' => '横峰县', + '362326' => '弋阳县', + '362327' => '贵溪县', + '362328' => '余江县', + '362329' => '余干县', + '362330' => '波阳县', + '362331' => '万年县', + '362332' => '乐平县', + '362333' => '德兴县', + '362334' => '婺源县', + '362400' => '吉安地区', + '362401' => '吉安市', + '362402' => '井冈山市', + '362421' => '吉安县', + '362422' => '吉水县', + '362423' => '峡江县', + '362424' => '新干县', + '362425' => '永丰县', + '362426' => '泰和县', + '362427' => '遂川县', + '362428' => '万安县', + '362429' => '安福县', + '362430' => '永新县', + '362431' => '莲花县', + '362432' => '宁冈县', + '362433' => '井冈山县', + '362500' => '抚州地区', + '362501' => '抚州市', + '362502' => '临川市', + '362521' => '临川县', + '362522' => '南城县', + '362523' => '黎川县', + '362524' => '南丰县', + '362525' => '崇仁县', + '362526' => '乐安县', + '362527' => '宜黄县', + '362528' => '金溪县', + '362529' => '资溪县', + '362530' => '进贤县', + '362531' => '东乡县', + '362532' => '广昌县', + '362600' => '九江地区', + '362621' => '九江县', + '362622' => '瑞昌县', + '362623' => '武宁县', + '362624' => '修水县', + '362625' => '永修县', + '362626' => '德安县', + '362627' => '星子县', + '362628' => '都昌县', + '362629' => '湖口县', + '362630' => '彭泽县', + '369000' => '省直辖县级行政区划', + '369001' => '瑞昌市', + '369002' => '乐平市', + '370000' => '山东省', + '370100' => '济南市', + '370101' => '市辖区', + '370102' => '历下区', + '370103' => '市中区', + '370104' => '槐荫区', + '370105' => '天桥区', + '370111' => '郊区', + '370112' => '历城区', + '370113' => '长清区', + '370114' => '章丘区', + '370115' => '济阳区', + '370116' => '莱芜区', + '370117' => '钢城区', + '370120' => '市区', + '370121' => '历城县', + '370122' => '章丘县', + '370123' => '长清县', + '370124' => '平阴县', + '370125' => '济阳县', + '370126' => '商河县', + '370181' => '章丘市', + '370200' => '青岛市', + '370201' => '市辖区', + '370202' => '市南区', + '370203' => '市北区', + '370204' => '台东区', + '370205' => '四方区', + '370206' => '沧口区', + '370208' => '李沧区', + '370209' => '城阳区', + '370211' => '黄岛区', + '370212' => '崂山区', + '370213' => '李沧区', + '370214' => '城阳区', + '370215' => '即墨区', + '370220' => '市区', + '370221' => '崂山县', + '370222' => '即墨县', + '370223' => '胶南县', + '370224' => '胶县', + '370225' => '莱西县', + '370226' => '平度县', + '370281' => '胶州市', + '370282' => '即墨市', + '370283' => '平度市', + '370284' => '胶南市', + '370285' => '莱西市', + '370300' => '淄博市', + '370301' => '市辖区', + '370302' => '淄川区', + '370303' => '张店区', + '370304' => '博山区', + '370305' => '临淄区', + '370306' => '周村区', + '370321' => '桓台县', + '370322' => '高青县', + '370323' => '沂源县', + '370400' => '枣庄市', + '370401' => '市辖区', + '370402' => '市中区', + '370403' => '薛城区', + '370404' => '峄城区', + '370405' => '台儿庄区', + '370406' => '山亭区', + '370420' => '市区', + '370421' => '滕县', + '370481' => '滕州市', + '370500' => '东营市', + '370501' => '市辖区', + '370502' => '东营区', + '370503' => '河口区', + '370504' => '牛庄区', + '370505' => '垦利区', + '370521' => '垦利县', + '370522' => '利津县', + '370523' => '广饶县', + '370600' => '烟台市', + '370601' => '市辖区', + '370602' => '芝罘区', + '370611' => '福山区', + '370612' => '牟平区', + '370613' => '莱山区', + '370614' => '蓬莱区', + '370619' => '龙口市', + '370620' => '威海市', + '370621' => '福山县', + '370622' => '蓬莱县', + '370623' => '黄县', + '370624' => '招远县', + '370625' => '掖县', + '370626' => '莱西县', + '370627' => '莱阳县', + '370628' => '栖霞县', + '370629' => '海阳县', + '370630' => '乳山县', + '370631' => '牟平县', + '370632' => '文登县', + '370633' => '荣成县', + '370634' => '长岛县', + '370681' => '龙口市', + '370682' => '莱阳市', + '370683' => '莱州市', + '370684' => '蓬莱市', + '370685' => '招远市', + '370686' => '栖霞市', + '370687' => '海阳市', + '370700' => '潍坊市', + '370701' => '市辖区', + '370702' => '潍城区', + '370703' => '寒亭区', + '370704' => '坊子区', + '370705' => '奎文区', + '370719' => '青州市', + '370721' => '益都县', + '370722' => '安丘县', + '370723' => '寿光县', + '370724' => '临朐县', + '370725' => '昌乐县', + '370726' => '昌邑县', + '370727' => '高密县', + '370728' => '诸城县', + '370729' => '五莲县', + '370781' => '青州市', + '370782' => '诸城市', + '370783' => '寿光市', + '370784' => '安丘市', + '370785' => '高密市', + '370786' => '昌邑市', + '370800' => '济宁市', + '370801' => '市辖区', + '370802' => '市中区', + '370811' => '任城区', + '370812' => '兖州区', + '370819' => '曲阜市', + '370821' => '济宁县', + '370822' => '兖州县', + '370823' => '曲阜县', + '370824' => '泗水县', + '370825' => '邹县', + '370826' => '微山县', + '370827' => '鱼台县', + '370828' => '金乡县', + '370829' => '嘉祥县', + '370830' => '汶上县', + '370831' => '泗水县', + '370832' => '梁山县', + '370881' => '曲阜市', + '370882' => '兖州市', + '370883' => '邹城市', + '370900' => '泰安市', + '370901' => '市辖区', + '370902' => '泰山区', + '370903' => '岱岳区', + '370911' => '岱岳区', + '370919' => '莱芜市', + '370920' => '新泰市', + '370921' => '宁阳县', + '370922' => '肥城县', + '370923' => '东平县', + '370981' => '莱芜市', + '370982' => '新泰市', + '370983' => '肥城市', + '371000' => '威海市', + '371001' => '市辖区', + '371002' => '环翠区', + '371003' => '文登区', + '371021' => '乳山县', + '371022' => '文登县', + '371081' => '文登市', + '371082' => '荣成市', + '371083' => '乳山市', + '371100' => '日照市', + '371101' => '市辖区', + '371102' => '东港区', + '371103' => '岚山区', + '371121' => '五莲县', + '371122' => '莒县', + '371200' => '莱芜市', + '371201' => '市辖区', + '371202' => '莱城区', + '371203' => '钢城区', + '371300' => '临沂市', + '371301' => '市辖区', + '371302' => '兰山区', + '371311' => '罗庄区', + '371312' => '河东区', + '371321' => '沂南县', + '371322' => '郯城县', + '371323' => '沂水县', + '371324' => '兰陵县', + '371325' => '费县', + '371326' => '平邑县', + '371327' => '莒南县', + '371328' => '蒙阴县', + '371329' => '临沭县', + '371400' => '德州市', + '371401' => '市辖区', + '371402' => '德城区', + '371403' => '陵城区', + '371421' => '陵县', + '371422' => '宁津县', + '371423' => '庆云县', + '371424' => '临邑县', + '371425' => '齐河县', + '371426' => '平原县', + '371427' => '夏津县', + '371428' => '武城县', + '371481' => '乐陵市', + '371482' => '禹城市', + '371500' => '聊城市', + '371501' => '市辖区', + '371502' => '东昌府区', + '371503' => '茌平区', + '371521' => '阳谷县', + '371522' => '莘县', + '371523' => '茌平县', + '371524' => '东阿县', + '371525' => '冠县', + '371526' => '高唐县', + '371581' => '临清市', + '371600' => '滨州市', + '371601' => '市辖区', + '371602' => '滨城区', + '371603' => '沾化区', + '371621' => '惠民县', + '371622' => '阳信县', + '371623' => '无棣县', + '371624' => '沾化县', + '371625' => '博兴县', + '371626' => '邹平县', + '371681' => '邹平市', + '371700' => '菏泽市', + '371701' => '市辖区', + '371702' => '牡丹区', + '371703' => '定陶区', + '371721' => '曹县', + '371722' => '单县', + '371723' => '成武县', + '371724' => '巨野县', + '371725' => '郓城县', + '371726' => '鄄城县', + '371727' => '定陶县', + '371728' => '东明县', + '372100' => '烟台地区', + '372101' => '烟台市', + '372102' => '威海市', + '372121' => '福山县', + '372122' => '蓬莱县', + '372123' => '黄县', + '372124' => '招远县', + '372125' => '掖县', + '372126' => '莱西县', + '372127' => '莱阳县', + '372128' => '栖霞县', + '372129' => '海阳县', + '372130' => '乳山县', + '372131' => '牟平县', + '372132' => '文登县', + '372133' => '荣成县', + '372134' => '长岛县', + '372200' => '潍坊地区', + '372201' => '潍坊市', + '372221' => '益都县', + '372222' => '安丘县', + '372223' => '寿光县', + '372224' => '临朐县', + '372225' => '昌乐县', + '372226' => '昌邑县', + '372227' => '高密县', + '372228' => '诸城县', + '372229' => '五莲县', + '372230' => '平度县', + '372231' => '潍县', + '372300' => '滨州地区', + '372301' => '滨州市', + '372321' => '惠民县', + '372322' => '滨县', + '372323' => '阳信县', + '372324' => '无棣县', + '372325' => '沾化县', + '372326' => '利津县', + '372327' => '广饶县', + '372328' => '博兴县', + '372329' => '桓台县', + '372330' => '邹平县', + '372331' => '高青县', + '372332' => '垦利县', + '372400' => '德州地区', + '372401' => '德州市', + '372402' => '乐陵市', + '372403' => '禹城市', + '372421' => '陵县', + '372422' => '平原县', + '372423' => '夏津县', + '372424' => '武城县', + '372425' => '齐河县', + '372426' => '禹城县', + '372427' => '乐陵县', + '372428' => '临邑县', + '372429' => '商河县', + '372430' => '济阳县', + '372431' => '宁津县', + '372432' => '庆云县', + '372500' => '聊城地区', + '372501' => '聊城市', + '372502' => '临清市', + '372521' => '聊城县', + '372522' => '阳谷县', + '372523' => '莘县', + '372524' => '茌平县', + '372525' => '东阿县', + '372526' => '冠县', + '372527' => '高唐县', + '372528' => '临清县', + '372600' => '泰安地区', + '372601' => '泰安市', + '372602' => '莱芜市', + '372603' => '新泰市', + '372621' => '泰安县', + '372622' => '莱芜县', + '372623' => '新泰县', + '372624' => '宁阳县', + '372625' => '肥城县', + '372626' => '东平县', + '372627' => '平阴县', + '372628' => '新汶县', + '372629' => '汶上县', + '372630' => '泗水县', + '372700' => '济宁地区', + '372701' => '济宁市', + '372721' => '济宁县', + '372722' => '兖州县', + '372723' => '曲阜县', + '372724' => '泗水县', + '372725' => '邹县', + '372726' => '微山县', + '372727' => '鱼台县', + '372728' => '金乡县', + '372729' => '嘉祥县', + '372730' => '汶上县', + '372800' => '临沂地区', + '372801' => '临沂市', + '372802' => '日照市', + '372821' => '临沂县', + '372822' => '郯城县', + '372823' => '苍山县', + '372824' => '莒南县', + '372825' => '日照县', + '372826' => '莒县', + '372827' => '沂水县', + '372828' => '沂源县', + '372829' => '蒙阴县', + '372830' => '平邑县', + '372831' => '费县', + '372832' => '沂南县', + '372833' => '临沭县', + '372900' => '菏泽地区', + '372901' => '菏泽市', + '372921' => '菏泽县', + '372922' => '曹县', + '372923' => '定陶县', + '372924' => '成武县', + '372925' => '单县', + '372926' => '巨野县', + '372927' => '梁山县', + '372928' => '郓城县', + '372929' => '鄄城县', + '372930' => '东明县', + '379000' => '省直辖县级行政区划', + '379001' => '青州市', + '379002' => '龙口市', + '379003' => '曲阜市', + '379004' => '莱芜市', + '379005' => '新泰市', + '379006' => '胶州市', + '379007' => '诸城市', + '379008' => '莱阳市', + '379009' => '莱州市', + '379010' => '滕州市', + '379011' => '文登市', + '379012' => '荣成市', + '379013' => '即墨市', + '379014' => '平度市', + '379015' => '莱西市', + '379016' => '胶南市', + '379017' => '兖州市', + '379018' => '邹城市', + '379019' => '寿光市', + '379020' => '乳山市', + '379021' => '乐陵市', + '379022' => '禹城市', + '379023' => '安丘市', + '379024' => '昌邑市', + '379025' => '高密市', + '410000' => '河南省', + '410100' => '郑州市', + '410101' => '市辖区', + '410102' => '中原区', + '410103' => '二七区', + '410104' => '管城回族区', + '410105' => '金水区', + '410106' => '上街区', + '410107' => '新密区', + '410108' => '惠济区', + '410111' => '金海区', + '410112' => '郊区', + '410120' => '市区', + '410121' => '荥阳县', + '410122' => '中牟县', + '410123' => '新郑县', + '410124' => '巩县', + '410125' => '登封县', + '410126' => '密县', + '410181' => '巩义市', + '410182' => '荥阳市', + '410183' => '新密市', + '410184' => '新郑市', + '410185' => '登封市', + '410200' => '开封市', + '410201' => '市辖区', + '410202' => '龙亭区', + '410203' => '顺河回族区', + '410204' => '鼓楼区', + '410205' => '禹王台区', + '410211' => '金明区', + '410212' => '祥符区', + '410221' => '杞县', + '410222' => '通许县', + '410223' => '尉氏县', + '410224' => '开封县', + '410225' => '兰考县', + '410300' => '洛阳市', + '410301' => '市辖区', + '410302' => '老城区', + '410303' => '西工区', + '410304' => '瀍河回族区', + '410305' => '涧西区', + '410306' => '吉利区', + '410307' => '洛龙区', + '410308' => '开发区', + '410311' => '洛龙区', + '410312' => '偃师区', + '410313' => '孟津区', + '410321' => '偃师县', + '410322' => '孟津县', + '410323' => '新安县', + '410324' => '栾川县', + '410325' => '嵩县', + '410326' => '汝阳县', + '410327' => '宜阳县', + '410328' => '洛宁县', + '410329' => '伊川县', + '410381' => '偃师市', + '410400' => '平顶山市', + '410401' => '市辖区', + '410402' => '新华区', + '410403' => '卫东区', + '410404' => '石龙区', + '410411' => '湛河区', + '410412' => '舞钢区', + '410421' => '宝丰县', + '410422' => '叶县', + '410423' => '鲁山县', + '410424' => '临汝县', + '410425' => '郏县', + '410426' => '襄城县', + '410481' => '舞钢市', + '410482' => '汝州市', + '410500' => '安阳市', + '410501' => '市辖区', + '410502' => '文峰区', + '410503' => '北关区', + '410504' => '铁西区', + '410505' => '殷都区', + '410506' => '龙安区', + '410511' => '郊区', + '410521' => '林县', + '410522' => '安阳县', + '410523' => '汤阴县', + '410524' => '淇县', + '410525' => '浚县', + '410526' => '滑县', + '410527' => '内黄县', + '410581' => '林州市', + '410600' => '鹤壁市', + '410601' => '市辖区', + '410602' => '鹤山区', + '410603' => '山城区', + '410611' => '淇滨区', + '410621' => '浚县', + '410622' => '淇县', + '410700' => '新乡市', + '410701' => '市辖区', + '410702' => '红旗区', + '410703' => '卫滨区', + '410704' => '凤泉区', + '410711' => '牧野区', + '410721' => '新乡县', + '410722' => '汲县', + '410723' => '辉县', + '410724' => '获嘉县', + '410725' => '原阳县', + '410726' => '延津县', + '410727' => '封丘县', + '410728' => '长垣县', + '410781' => '卫辉市', + '410782' => '辉县市', + '410783' => '长垣市', + '410800' => '焦作市', + '410801' => '市辖区', + '410802' => '解放区', + '410803' => '中站区', + '410804' => '马村区', + '410811' => '山阳区', + '410821' => '修武县', + '410822' => '博爱县', + '410823' => '武陟县', + '410824' => '沁阳县', + '410825' => '温县', + '410826' => '孟县', + '410827' => '济源县', + '410881' => '济源市', + '410882' => '沁阳市', + '410883' => '孟州市', + '410900' => '濮阳市', + '410901' => '市辖区', + '410902' => '华龙区', + '410911' => '郊区', + '410921' => '滑县', + '410922' => '清丰县', + '410923' => '南乐县', + '410924' => '内黄县', + '410925' => '长垣县', + '410926' => '范县', + '410927' => '台前县', + '410928' => '濮阳县', + '411000' => '许昌市', + '411001' => '市辖区', + '411002' => '魏都区', + '411003' => '建安区', + '411021' => '禹县', + '411022' => '长葛县', + '411023' => '许昌县', + '411024' => '鄢陵县', + '411025' => '襄城县', + '411081' => '禹州市', + '411082' => '长葛市', + '411100' => '漯河市', + '411101' => '市辖区', + '411102' => '源汇区', + '411103' => '郾城区', + '411104' => '召陵区', + '411121' => '舞阳县', + '411122' => '临颍县', + '411123' => '郾城县', + '411200' => '三门峡市', + '411201' => '市辖区', + '411202' => '湖滨区', + '411203' => '陕州区', + '411219' => '义马市', + '411221' => '渑池县', + '411222' => '陕县', + '411223' => '灵宝县', + '411224' => '卢氏县', + '411281' => '义马市', + '411282' => '灵宝市', + '411300' => '南阳市', + '411301' => '市辖区', + '411302' => '宛城区', + '411303' => '卧龙区', + '411321' => '南召县', + '411322' => '方城县', + '411323' => '西峡县', + '411324' => '镇平县', + '411325' => '内乡县', + '411326' => '淅川县', + '411327' => '社旗县', + '411328' => '唐河县', + '411329' => '新野县', + '411330' => '桐柏县', + '411381' => '邓州市', + '411400' => '商丘市', + '411401' => '市辖区', + '411402' => '梁园区', + '411403' => '睢阳区', + '411421' => '民权县', + '411422' => '睢县', + '411423' => '宁陵县', + '411424' => '柘城县', + '411425' => '虞城县', + '411426' => '夏邑县', + '411481' => '永城市', + '411500' => '信阳市', + '411501' => '市辖区', + '411502' => '浉河区', + '411503' => '平桥区', + '411521' => '罗山县', + '411522' => '光山县', + '411523' => '新县', + '411524' => '商城县', + '411525' => '固始县', + '411526' => '潢川县', + '411527' => '淮滨县', + '411528' => '息县', + '411600' => '周口市', + '411601' => '市辖区', + '411602' => '川汇区', + '411603' => '淮阳区', + '411621' => '扶沟县', + '411622' => '西华县', + '411623' => '商水县', + '411624' => '沈丘县', + '411625' => '郸城县', + '411626' => '淮阳县', + '411627' => '太康县', + '411628' => '鹿邑县', + '411681' => '项城市', + '411700' => '驻马店市', + '411701' => '市辖区', + '411702' => '驿城区', + '411721' => '西平县', + '411722' => '上蔡县', + '411723' => '平舆县', + '411724' => '正阳县', + '411725' => '确山县', + '411726' => '泌阳县', + '411727' => '汝南县', + '411728' => '遂平县', + '411729' => '新蔡县', + '412100' => '安阳地区', + '412121' => '林县', + '412122' => '安阳县', + '412123' => '汤阴县', + '412124' => '浚县', + '412125' => '淇县', + '412126' => '濮阳县', + '412127' => '滑县', + '412128' => '清丰县', + '412129' => '南乐县', + '412130' => '内黄县', + '412131' => '长垣县', + '412132' => '范县', + '412133' => '台前县', + '412200' => '新乡地区', + '412201' => '新乡市', + '412221' => '沁阳县', + '412222' => '博爱县', + '412223' => '济源县', + '412224' => '孟县', + '412225' => '温县', + '412226' => '武陟县', + '412227' => '修武县', + '412228' => '获嘉县', + '412229' => '新乡县', + '412230' => '辉县', + '412231' => '汲县', + '412232' => '原阳县', + '412233' => '延津县', + '412234' => '封丘县', + '412300' => '商丘地区', + '412301' => '商丘市', + '412302' => '永城市', + '412321' => '虞城县', + '412322' => '商丘县', + '412323' => '民权县', + '412324' => '宁陵县', + '412325' => '睢县', + '412326' => '夏邑县', + '412327' => '柘城县', + '412328' => '永城县', + '412400' => '开封地区', + '412421' => '杞县', + '412422' => '通许县', + '412423' => '尉氏县', + '412424' => '开封县', + '412425' => '中牟县', + '412426' => '新郑县', + '412427' => '巩县', + '412428' => '登封县', + '412429' => '密县', + '412430' => '兰考县', + '412500' => '洛阳地区', + '412501' => '三门峡市', + '412502' => '义马市', + '412521' => '偃师县', + '412522' => '孟津县', + '412523' => '新安县', + '412524' => '渑池县', + '412525' => '陕县', + '412526' => '灵宝县', + '412527' => '伊川县', + '412528' => '汝阳县', + '412529' => '嵩县', + '412530' => '洛宁县', + '412531' => '卢氏县', + '412532' => '栾川县', + '412533' => '临汝县', + '412534' => '宜阳县', + '412535' => '义马矿区', + '412600' => '许昌地区', + '412601' => '许昌市', + '412602' => '漯河市', + '412621' => '长葛县', + '412622' => '禹县', + '412623' => '鄢陵县', + '412624' => '许昌县', + '412625' => '郏县', + '412626' => '临颍县', + '412627' => '襄城县', + '412628' => '宝丰县', + '412629' => '郾城县', + '412630' => '叶县', + '412631' => '鲁山县', + '412632' => '舞阳县', + '412700' => '周口地区', + '412701' => '周口市', + '412702' => '项城市', + '412721' => '扶沟县', + '412722' => '西华县', + '412723' => '商水县', + '412724' => '太康县', + '412725' => '鹿邑县', + '412726' => '郸城县', + '412727' => '淮阳县', + '412728' => '沈丘县', + '412729' => '项城县', + '412800' => '驻马店地区', + '412801' => '驻马店市', + '412821' => '确山县', + '412822' => '泌阳县', + '412823' => '遂平县', + '412824' => '西平县', + '412825' => '上蔡县', + '412826' => '汝南县', + '412827' => '平舆县', + '412828' => '新蔡县', + '412829' => '正阳县', + '412900' => '南阳地区', + '412901' => '南阳市', + '412902' => '邓州市', + '412921' => '南召县', + '412922' => '方城县', + '412923' => '西峡县', + '412924' => '南阳县', + '412925' => '镇平县', + '412926' => '内乡县', + '412927' => '淅川县', + '412928' => '社旗县', + '412929' => '唐河县', + '412930' => '邓县', + '412931' => '新野县', + '412932' => '桐柏县', + '413000' => '信阳地区', + '413001' => '信阳市', + '413021' => '息县', + '413022' => '淮滨县', + '413023' => '信阳县', + '413024' => '潢川县', + '413025' => '光山县', + '413026' => '固始县', + '413027' => '商城县', + '413028' => '罗山县', + '413029' => '新县', + '419000' => '省直辖县级行政区划', + '419001' => '义马市', + '419002' => '汝州市', + '419003' => '济源市', + '419004' => '禹州市', + '419005' => '卫辉市', + '419006' => '辉县市', + '419007' => '沁阳市', + '419008' => '舞钢市', + '419009' => '巩义市', + '419010' => '灵宝市', + '419011' => '长葛市', + '419012' => '偃师市', + '419013' => '邓州市', + '419014' => '林州市', + '419015' => '新密市', + '419016' => '荥阳市', + '419017' => '新郑市', + '419018' => '登封市', + '420000' => '湖北省', + '420100' => '武汉市', + '420101' => '市辖区', + '420102' => '江岸区', + '420103' => '江汉区', + '420104' => '硚口区', + '420105' => '汉阳区', + '420106' => '武昌区', + '420107' => '青山区', + '420111' => '洪山区', + '420112' => '东西湖区', + '420113' => '汉南区', + '420114' => '蔡甸区', + '420115' => '江夏区', + '420116' => '黄陂区', + '420117' => '新洲区', + '420120' => '市区', + '420121' => '汉阳县', + '420122' => '武昌县', + '420123' => '黄陂县', + '420124' => '新洲县', + '420200' => '黄石市', + '420201' => '市辖区', + '420202' => '黄石港区', + '420203' => '西塞山区', + '420204' => '下陆区', + '420205' => '铁山区', + '420211' => '郊区', + '420220' => '市区', + '420221' => '大冶县', + '420222' => '阳新县', + '420281' => '大冶市', + '420300' => '十堰市', + '420301' => '市辖区', + '420302' => '茅箭区', + '420303' => '张湾区', + '420304' => '郧阳区', + '420321' => '郧县', + '420322' => '郧西县', + '420323' => '竹山县', + '420324' => '竹溪县', + '420325' => '房县', + '420381' => '丹江口市', + '420400' => '沙市市', + '420500' => '宜昌市', + '420501' => '市辖区', + '420502' => '西陵区', + '420503' => '伍家岗区', + '420504' => '点军区', + '420505' => '猇亭区', + '420506' => '夷陵区', + '420521' => '宜昌县', + '420523' => '枝江县', + '420525' => '远安县', + '420526' => '兴山县', + '420527' => '秭归县', + '420528' => '长阳土家族自治县', + '420529' => '五峰土家族自治县', + '420581' => '宜都市', + '420582' => '当阳市', + '420583' => '枝江市', + '420600' => '襄阳市', + '420601' => '市辖区', + '420602' => '襄城区', + '420603' => '樊东区', + '420604' => '樊西区', + '420605' => '郊区', + '420606' => '樊城区', + '420607' => '襄州区', + '420619' => '随州市', + '420620' => '老河口市', + '420621' => '襄阳县', + '420622' => '枣阳县', + '420623' => '宜城县', + '420624' => '南漳县', + '420625' => '谷城县', + '420626' => '保康县', + '420681' => '随州市', + '420682' => '老河口市', + '420683' => '枣阳市', + '420684' => '宜城市', + '420700' => '鄂州市', + '420701' => '市辖区', + '420702' => '梁子湖区', + '420703' => '华容区', + '420704' => '鄂城区', + '420709' => '黄州区', + '420800' => '荆门市', + '420801' => '市辖区', + '420802' => '东宝区', + '420803' => '沙洋区', + '420804' => '掇刀区', + '420821' => '京山县', + '420822' => '沙洋县', + '420881' => '钟祥市', + '420882' => '京山市', + '420900' => '孝感市', + '420901' => '市辖区', + '420902' => '孝南区', + '420921' => '孝昌县', + '420922' => '大悟县', + '420923' => '云梦县', + '420924' => '汉川县', + '420981' => '应城市', + '420982' => '安陆市', + '420983' => '广水市', + '420984' => '汉川市', + '421000' => '荆州市', + '421001' => '市辖区', + '421002' => '沙市区', + '421003' => '荆州区', + '421004' => '江陵区', + '421021' => '松滋县', + '421022' => '公安县', + '421023' => '监利县', + '421024' => '京山县', + '421081' => '石首市', + '421082' => '钟祥市', + '421083' => '洪湖市', + '421084' => '天门市', + '421085' => '潜江市', + '421086' => '仙桃市', + '421087' => '松滋市', + '421088' => '监利市', + '421100' => '黄冈市', + '421101' => '市辖区', + '421102' => '黄州区', + '421121' => '团风县', + '421122' => '红安县', + '421123' => '罗田县', + '421124' => '英山县', + '421125' => '浠水县', + '421126' => '蕲春县', + '421127' => '黄梅县', + '421181' => '麻城市', + '421182' => '武穴市', + '421200' => '咸宁市', + '421201' => '市辖区', + '421202' => '咸安区', + '421221' => '嘉鱼县', + '421222' => '通城县', + '421223' => '崇阳县', + '421224' => '通山县', + '421281' => '赤壁市', + '421300' => '随州市', + '421301' => '市辖区', + '421302' => '曾都区', + '421303' => '曾都区', + '421321' => '随县', + '421381' => '广水市', + '422100' => '黄冈地区', + '422101' => '麻城市', + '422102' => '武穴市', + '422103' => '黄州市', + '422121' => '黄冈县', + '422122' => '新洲县', + '422123' => '红安县', + '422124' => '麻城县', + '422125' => '罗田县', + '422126' => '英山县', + '422127' => '浠水县', + '422128' => '蕲春县', + '422129' => '广济县', + '422130' => '黄梅县', + '422131' => '鄂城县', + '422200' => '孝感地区', + '422201' => '孝感市', + '422202' => '应城市', + '422203' => '安陆市', + '422204' => '广水市', + '422221' => '孝感县', + '422222' => '黄陂县', + '422223' => '大悟县', + '422224' => '应山县', + '422225' => '安陆县', + '422226' => '云梦县', + '422227' => '应城县', + '422228' => '汉川县', + '422300' => '咸宁地区', + '422301' => '咸宁市', + '422302' => '蒲圻市', + '422321' => '咸宁县', + '422322' => '嘉鱼县', + '422323' => '蒲圻县', + '422324' => '通城县', + '422325' => '崇阳县', + '422326' => '通山县', + '422327' => '阳新县', + '422400' => '荆州地区', + '422401' => '仙桃市', + '422402' => '石首市', + '422403' => '洪湖市', + '422404' => '天门市', + '422405' => '潜江市', + '422406' => '钟祥市', + '422421' => '江陵县', + '422422' => '松滋县', + '422423' => '公安县', + '422424' => '石首县', + '422425' => '监利县', + '422426' => '洪湖县', + '422427' => '沔阳县', + '422428' => '天门县', + '422429' => '潜江县', + '422430' => '荆门县', + '422431' => '钟祥县', + '422432' => '京山县', + '422500' => '襄阳地区', + '422501' => '随州市', + '422502' => '老河口市', + '422521' => '襄阳县', + '422522' => '枣阳县', + '422523' => '随县', + '422524' => '宜城县', + '422525' => '南漳县', + '422526' => '光化县', + '422527' => '谷城县', + '422528' => '保康县', + '422600' => '郧阳地区', + '422601' => '丹江口市', + '422621' => '均县', + '422622' => '郧县', + '422623' => '郧西县', + '422624' => '竹山县', + '422625' => '竹溪县', + '422626' => '房县', + '422627' => '神农架林区', + '422700' => '宜昌地区', + '422701' => '枝城市', + '422702' => '当阳市', + '422721' => '宜昌县', + '422722' => '宜都县', + '422723' => '枝江县', + '422724' => '当阳县', + '422725' => '远安县', + '422726' => '兴山县', + '422727' => '秭归县', + '422728' => '长阳土家族自治县', + '422729' => '五峰土家族自治县', + '422800' => '恩施土家族苗族自治州', + '422801' => '恩施市', + '422802' => '利川市', + '422821' => '恩施县', + '422822' => '建始县', + '422823' => '巴东县', + '422824' => '利川县', + '422825' => '宣恩县', + '422826' => '咸丰县', + '422827' => '来凤县', + '422828' => '鹤峰县', + '422900' => '林区', + '422921' => '神农架林区', + '429000' => '省直辖县级行政区划', + '429001' => '随州市', + '429002' => '老河口市', + '429003' => '枣阳市', + '429004' => '仙桃市', + '429005' => '潜江市', + '429006' => '天门市', + '429007' => '枝城市', + '429008' => '当阳市', + '429009' => '应城市', + '429010' => '安陆市', + '429011' => '广水市', + '429012' => '石首市', + '429013' => '洪湖市', + '429014' => '钟祥市', + '429015' => '丹江口市', + '429016' => '大冶市', + '429017' => '宜城市', + '429021' => '神农架林区', + '430000' => '湖南省', + '430100' => '长沙市', + '430101' => '市辖区', + '430102' => '芙蓉区', + '430103' => '天心区', + '430104' => '岳麓区', + '430105' => '开福区', + '430111' => '雨花区', + '430112' => '望城区', + '430120' => '市区', + '430121' => '长沙县', + '430122' => '望城县', + '430123' => '浏阳县', + '430124' => '宁乡县', + '430181' => '浏阳市', + '430182' => '宁乡市', + '430200' => '株洲市', + '430201' => '市辖区', + '430202' => '荷塘区', + '430203' => '芦淞区', + '430204' => '石峰区', + '430211' => '天元区', + '430212' => '渌口区', + '430219' => '醴陵市', + '430220' => '市区', + '430221' => '株洲县', + '430222' => '醴陵县', + '430223' => '攸县', + '430224' => '茶陵县', + '430225' => '炎陵县', + '430281' => '醴陵市', + '430300' => '湘潭市', + '430301' => '市辖区', + '430302' => '雨湖区', + '430303' => '湘江区', + '430304' => '岳塘区', + '430305' => '板塘区', + '430306' => '韶山区', + '430311' => '郊区', + '430312' => '韶山区', + '430321' => '湘潭县', + '430322' => '湘乡县', + '430381' => '湘乡市', + '430382' => '韶山市', + '430400' => '衡阳市', + '430401' => '市辖区', + '430402' => '江东区', + '430403' => '城南区', + '430404' => '城北区', + '430405' => '珠晖区', + '430406' => '雁峰区', + '430407' => '石鼓区', + '430408' => '蒸湘区', + '430411' => '郊区', + '430412' => '南岳区', + '430419' => '耒阳市', + '430421' => '衡阳县', + '430422' => '衡南县', + '430423' => '衡山县', + '430424' => '衡东县', + '430425' => '常宁县', + '430426' => '祁东县', + '430427' => '耒阳县', + '430481' => '耒阳市', + '430482' => '常宁市', + '430500' => '邵阳市', + '430501' => '市辖区', + '430502' => '双清区', + '430503' => '大祥区', + '430504' => '桥头区', + '430511' => '北塔区', + '430521' => '邵东县', + '430522' => '新邵县', + '430523' => '邵阳县', + '430524' => '隆回县', + '430525' => '洞口县', + '430526' => '武冈县', + '430527' => '绥宁县', + '430528' => '新宁县', + '430529' => '城步苗族自治县', + '430581' => '武冈市', + '430582' => '邵东市', + '430600' => '岳阳市', + '430601' => '市辖区', + '430602' => '岳阳楼区', + '430603' => '云溪区', + '430611' => '君山区', + '430621' => '岳阳县', + '430622' => '临湘县', + '430623' => '华容县', + '430624' => '湘阴县', + '430625' => '汨罗县', + '430626' => '平江县', + '430681' => '汨罗市', + '430682' => '临湘市', + '430700' => '常德市', + '430701' => '市辖区', + '430702' => '武陵区', + '430703' => '鼎城区', + '430721' => '安乡县', + '430722' => '汉寿县', + '430723' => '澧县', + '430724' => '临澧县', + '430725' => '桃源县', + '430726' => '石门县', + '430727' => '慈利县', + '430781' => '津市市', + '430800' => '张家界市', + '430801' => '市辖区', + '430802' => '永定区', + '430811' => '武陵源区', + '430821' => '慈利县', + '430822' => '桑植县', + '430900' => '益阳市', + '430901' => '市辖区', + '430902' => '资阳区', + '430903' => '赫山区', + '430921' => '南县', + '430922' => '桃江县', + '430923' => '安化县', + '430981' => '沅江市', + '431000' => '郴州市', + '431001' => '市辖区', + '431002' => '北湖区', + '431003' => '苏仙区', + '431021' => '桂阳县', + '431022' => '宜章县', + '431023' => '永兴县', + '431024' => '嘉禾县', + '431025' => '临武县', + '431026' => '汝城县', + '431027' => '桂东县', + '431028' => '安仁县', + '431081' => '资兴市', + '431100' => '永州市', + '431101' => '市辖区', + '431102' => '零陵区', + '431103' => '冷水滩区', + '431121' => '祁阳县', + '431122' => '东安县', + '431123' => '双牌县', + '431124' => '道县', + '431125' => '江永县', + '431126' => '宁远县', + '431127' => '蓝山县', + '431128' => '新田县', + '431129' => '江华瑶族自治县', + '431181' => '祁阳市', + '431200' => '怀化市', + '431201' => '市辖区', + '431202' => '鹤城区', + '431221' => '中方县', + '431222' => '沅陵县', + '431223' => '辰溪县', + '431224' => '溆浦县', + '431225' => '会同县', + '431226' => '麻阳苗族自治县', + '431227' => '新晃侗族自治县', + '431228' => '芷江侗族自治县', + '431229' => '靖州苗族侗族自治县', + '431230' => '通道侗族自治县', + '431240' => '洪江区', + '431281' => '洪江市', + '431300' => '娄底市', + '431301' => '市辖区', + '431302' => '娄星区', + '431321' => '双峰县', + '431322' => '新化县', + '431381' => '冷水江市', + '431382' => '涟源市', + '432100' => '湘潭地区', + '432121' => '湘潭县', + '432122' => '湘乡县', + '432123' => '醴陵县', + '432124' => '浏阳县', + '432125' => '攸县', + '432126' => '茶陵县', + '432127' => '酃县', + '432128' => '韶山区', + '432200' => '岳阳地区', + '432201' => '岳阳市', + '432221' => '岳阳县', + '432222' => '平江县', + '432223' => '湘阴县', + '432224' => '汨罗县', + '432225' => '临湘县', + '432226' => '华容县', + '432300' => '益阳地区', + '432301' => '益阳市', + '432302' => '沅江市', + '432321' => '益阳县', + '432322' => '南县', + '432323' => '沅江县', + '432324' => '宁乡县', + '432325' => '桃江县', + '432326' => '安化县', + '432400' => '常德地区', + '432401' => '常德市', + '432402' => '津市市', + '432421' => '常德县', + '432422' => '安乡县', + '432423' => '汉寿县', + '432424' => '澧县', + '432425' => '临澧县', + '432426' => '桃源县', + '432427' => '石门县', + '432428' => '慈利县', + '432500' => '娄底地区', + '432501' => '娄底市', + '432502' => '冷水江市', + '432503' => '涟源市', + '432521' => '涟源县', + '432522' => '双峰县', + '432523' => '邵东县', + '432524' => '新化县', + '432525' => '新邵县', + '432600' => '邵阳地区', + '432621' => '邵阳县', + '432622' => '隆回县', + '432623' => '武冈县', + '432624' => '洞口县', + '432625' => '新宁县', + '432626' => '绥宁县', + '432627' => '城步苗族自治县', + '432700' => '衡阳地区', + '432721' => '衡阳县', + '432722' => '衡南县', + '432723' => '衡山县', + '432724' => '衡东县', + '432725' => '常宁县', + '432726' => '祁东县', + '432727' => '祁阳县', + '432800' => '郴州地区', + '432801' => '郴州市', + '432802' => '资兴市', + '432821' => '郴县', + '432822' => '桂阳县', + '432823' => '永兴县', + '432824' => '宜章县', + '432825' => '资兴县', + '432826' => '嘉禾县', + '432827' => '临武县', + '432828' => '汝城县', + '432829' => '桂东县', + '432830' => '耒阳县', + '432831' => '安仁县', + '432900' => '零陵地区', + '432901' => '永州市', + '432902' => '冷水滩市', + '432921' => '零陵县', + '432922' => '东安县', + '432923' => '道县', + '432924' => '宁远县', + '432925' => '江永县', + '432926' => '江华瑶族自治县', + '432927' => '蓝山县', + '432928' => '新田县', + '432929' => '双牌县', + '432930' => '祁阳县', + '433000' => '怀化地区', + '433001' => '怀化市', + '433002' => '洪江市', + '433021' => '黔阳县', + '433022' => '沅陵县', + '433023' => '辰溪县', + '433024' => '溆浦县', + '433025' => '麻阳苗族自治县', + '433026' => '新晃侗族自治县', + '433027' => '芷江侗族自治县', + '433028' => '怀化县', + '433029' => '会同县', + '433030' => '靖州苗族侗族自治县', + '433031' => '通道侗族自治县', + '433100' => '湘西土家族苗族自治州', + '433101' => '吉首市', + '433102' => '大庸市', + '433121' => '吉首县', + '433122' => '泸溪县', + '433123' => '凤凰县', + '433124' => '花垣县', + '433125' => '保靖县', + '433126' => '古丈县', + '433127' => '永顺县', + '433128' => '大庸县', + '433129' => '桑植县', + '433130' => '龙山县', + '439000' => '省直辖县级行政区划', + '439001' => '醴陵市', + '439002' => '湘乡市', + '439003' => '耒阳市', + '439004' => '汨罗市', + '439005' => '津市市', + '439006' => '韶山市', + '439007' => '临湘市', + '439008' => '浏阳市', + '439009' => '资兴市', + '439010' => '沅江市', + '439011' => '武冈市', + '440000' => '广东省', + '440100' => '广州市', + '440101' => '市辖区', + '440102' => '东山区', + '440103' => '荔湾区', + '440104' => '越秀区', + '440105' => '海珠区', + '440106' => '天河区', + '440107' => '芳村区', + '440111' => '白云区', + '440112' => '黄埔区', + '440113' => '番禺区', + '440114' => '花都区', + '440115' => '南沙区', + '440116' => '萝岗区', + '440117' => '从化区', + '440118' => '增城区', + '440120' => '市区', + '440121' => '花县', + '440122' => '从化县', + '440123' => '新丰县', + '440124' => '龙门县', + '440125' => '增城县', + '440126' => '番禺县', + '440127' => '清远县', + '440128' => '佛冈县', + '440181' => '番禺市', + '440182' => '花都市', + '440183' => '增城市', + '440184' => '从化市', + '440200' => '韶关市', + '440201' => '市辖区', + '440202' => '北江区', + '440203' => '武江区', + '440204' => '浈江区', + '440205' => '曲江区', + '440220' => '市区', + '440221' => '曲江县', + '440222' => '始兴县', + '440223' => '南雄县', + '440224' => '仁化县', + '440225' => '乐昌县', + '440226' => '连县', + '440227' => '阳山县', + '440228' => '英德县', + '440229' => '翁源县', + '440230' => '连山壮族瑶族自治县', + '440231' => '连南瑶族自治县', + '440232' => '乳源瑶族自治县', + '440233' => '新丰县', + '440281' => '乐昌市', + '440282' => '南雄市', + '440300' => '深圳市', + '440301' => '市辖区', + '440302' => '沙头角区', + '440303' => '罗湖区', + '440304' => '福田区', + '440305' => '南山区', + '440306' => '宝安区', + '440307' => '龙岗区', + '440308' => '盐田区', + '440309' => '龙华区', + '440310' => '坪山区', + '440311' => '光明区', + '440320' => '市区', + '440321' => '宝安县', + '440400' => '珠海市', + '440401' => '市辖区', + '440402' => '香洲区', + '440403' => '斗门区', + '440404' => '金湾区', + '440421' => '斗门县', + '440500' => '汕头市', + '440501' => '市辖区', + '440502' => '同平区', + '440503' => '安平区', + '440504' => '公园区', + '440505' => '金沙区', + '440506' => '达濠区', + '440507' => '龙湖区', + '440508' => '金园区', + '440509' => '升平区', + '440510' => '河浦区', + '440511' => '金平区', + '440512' => '濠江区', + '440513' => '潮阳区', + '440514' => '潮南区', + '440515' => '澄海区', + '440520' => '潮州市', + '440521' => '澄海县', + '440522' => '饶平县', + '440523' => '南澳县', + '440524' => '潮阳县', + '440525' => '揭阳县', + '440526' => '揭西县', + '440527' => '普宁县', + '440528' => '惠来县', + '440581' => '潮州市', + '440582' => '潮阳市', + '440583' => '澄海市', + '440600' => '佛山市', + '440601' => '市辖区', + '440602' => '城区', + '440603' => '石湾区', + '440604' => '禅城区', + '440605' => '南海区', + '440606' => '顺德区', + '440607' => '三水区', + '440608' => '高明区', + '440620' => '中山市', + '440621' => '三水县', + '440622' => '南海县', + '440623' => '顺德县', + '440624' => '高明县', + '440681' => '顺德市', + '440682' => '南海市', + '440683' => '三水市', + '440684' => '高明市', + '440700' => '江门市', + '440701' => '市辖区', + '440702' => '江海区', + '440703' => '蓬江区', + '440704' => '江海区', + '440705' => '新会区', + '440711' => '蓬江区', + '440721' => '新会县', + '440722' => '台山县', + '440723' => '恩平县', + '440724' => '开平县', + '440725' => '鹤山县', + '440726' => '阳江县', + '440727' => '阳春县', + '440781' => '台山市', + '440782' => '新会市', + '440783' => '开平市', + '440784' => '鹤山市', + '440785' => '恩平市', + '440800' => '湛江市', + '440801' => '市辖区', + '440802' => '赤坎区', + '440803' => '霞山区', + '440804' => '坡头区', + '440811' => '麻章区', + '440821' => '吴川县', + '440822' => '廉江县', + '440823' => '遂溪县', + '440824' => '海康县', + '440825' => '徐闻县', + '440881' => '廉江市', + '440882' => '雷州市', + '440883' => '吴川市', + '440900' => '茂名市', + '440901' => '市辖区', + '440902' => '茂南区', + '440903' => '茂港区', + '440904' => '电白区', + '440921' => '信宜县', + '440922' => '高州县', + '440923' => '电白县', + '440924' => '化州县', + '440981' => '高州市', + '440982' => '化州市', + '440983' => '信宜市', + '441000' => '海口市', + '441100' => '三亚市', + '441200' => '肇庆市', + '441201' => '市辖区', + '441202' => '端州区', + '441203' => '鼎湖区', + '441204' => '高要区', + '441221' => '高要县', + '441222' => '四会县', + '441223' => '广宁县', + '441224' => '怀集县', + '441225' => '封开县', + '441226' => '德庆县', + '441227' => '云浮县', + '441228' => '新兴县', + '441229' => '郁南县', + '441230' => '罗定县', + '441281' => '云浮市', + '441282' => '罗定市', + '441283' => '高要市', + '441284' => '四会市', + '441300' => '惠州市', + '441301' => '市辖区', + '441302' => '惠城区', + '441303' => '惠阳区', + '441321' => '惠阳县', + '441322' => '博罗县', + '441323' => '惠东县', + '441324' => '龙门县', + '441381' => '惠阳市', + '441400' => '梅州市', + '441401' => '市辖区', + '441402' => '梅江区', + '441403' => '梅县区', + '441421' => '梅县', + '441422' => '大埔县', + '441423' => '丰顺县', + '441424' => '五华县', + '441425' => '兴宁县', + '441426' => '平远县', + '441427' => '蕉岭县', + '441481' => '兴宁市', + '441500' => '汕尾市', + '441501' => '市辖区', + '441502' => '城区', + '441521' => '海丰县', + '441522' => '陆丰县', + '441523' => '陆河县', + '441581' => '陆丰市', + '441600' => '河源市', + '441601' => '市辖区', + '441602' => '源城区', + '441611' => '郊区', + '441621' => '紫金县', + '441622' => '龙川县', + '441623' => '连平县', + '441624' => '和平县', + '441625' => '东源县', + '441700' => '阳江市', + '441701' => '市辖区', + '441702' => '江城区', + '441703' => '阳东区', + '441704' => '阳东区', + '441721' => '阳西县', + '441722' => '阳春县', + '441723' => '阳东县', + '441781' => '阳春市', + '441800' => '清远市', + '441801' => '市辖区', + '441802' => '清城区', + '441803' => '清新区', + '441811' => '清郊区', + '441821' => '佛冈县', + '441822' => '英德县', + '441823' => '阳山县', + '441824' => '连县', + '441825' => '连山壮族瑶族自治县', + '441826' => '连南瑶族自治县', + '441827' => '清新县', + '441881' => '英德市', + '441882' => '连州市', + '441900' => '东莞市', + '442000' => '中山市', + '442100' => '海南行政区', + '442101' => '海口市', + '442121' => '琼山县', + '442122' => '文昌县', + '442123' => '琼海县', + '442124' => '万宁县', + '442125' => '定安县', + '442126' => '屯昌县', + '442127' => '澄迈县', + '442128' => '临高县', + '442129' => '儋县', + '442200' => '海南黎族苗族自治州', + '442201' => '三亚市', + '442202' => '通什市', + '442221' => '崖县', + '442222' => '东方县', + '442223' => '乐东县', + '442224' => '琼中县', + '442225' => '保亭县', + '442226' => '陵水县', + '442227' => '白沙县', + '442228' => '昌江县', + '442229' => '西沙、南沙、中沙群岛', + '442300' => '汕头地区', + '442301' => '汕头市', + '442302' => '潮州市', + '442321' => '潮安县', + '442322' => '澄海县', + '442323' => '饶平县', + '442324' => '南澳县', + '442325' => '潮阳县', + '442326' => '揭阳县', + '442327' => '揭西县', + '442328' => '普宁县', + '442329' => '惠来县', + '442330' => '陆丰县', + '442331' => '海丰县', + '442400' => '梅县地区', + '442401' => '梅县市', + '442421' => '梅县', + '442422' => '大埔县', + '442423' => '丰顺县', + '442424' => '五华县', + '442425' => '兴宁县', + '442426' => '平远县', + '442427' => '蕉岭县', + '442500' => '惠阳地区', + '442501' => '惠州市', + '442502' => '东莞市', + '442521' => '惠阳县', + '442522' => '紫金县', + '442523' => '和平县', + '442524' => '连平县', + '442525' => '河源县', + '442526' => '博罗县', + '442527' => '东莞县', + '442528' => '惠东县', + '442529' => '龙川县', + '442530' => '陆丰县', + '442531' => '海丰县', + '442600' => '韶关地区', + '442621' => '始兴县', + '442622' => '南雄县', + '442623' => '仁化县', + '442624' => '乐昌县', + '442625' => '连县', + '442626' => '阳山县', + '442627' => '英德县', + '442628' => '清远县', + '442629' => '佛冈县', + '442630' => '翁源县', + '442631' => '连山壮族瑶族自治县', + '442632' => '连南瑶族自治县', + '442633' => '乳源瑶族自治县', + '442700' => '佛山地区', + '442701' => '佛山市', + '442702' => '江门市', + '442721' => '三水县', + '442722' => '南海县', + '442723' => '顺德县', + '442724' => '中山县', + '442725' => '斗门县', + '442726' => '新会县', + '442727' => '台山县', + '442728' => '恩平县', + '442729' => '开平县', + '442730' => '高鹤县', + '442731' => '高明县', + '442732' => '鹤山县', + '442800' => '肇庆地区', + '442801' => '肇庆市', + '442821' => '高要县', + '442822' => '四会县', + '442823' => '广宁县', + '442824' => '怀集县', + '442825' => '封开县', + '442826' => '德庆县', + '442827' => '云浮县', + '442828' => '新兴县', + '442829' => '郁南县', + '442830' => '罗定县', + '442900' => '湛江地区', + '442901' => '湛江市', + '442902' => '茂名市', + '442921' => '阳江县', + '442922' => '阳春县', + '442923' => '信宜县', + '442924' => '高州县', + '442925' => '电白县', + '442926' => '吴川县', + '442927' => '化州县', + '442928' => '廉江县', + '442929' => '遂溪县', + '442930' => '海康县', + '442931' => '徐闻县', + '445100' => '潮州市', + '445101' => '市辖区', + '445102' => '湘桥区', + '445103' => '潮安区', + '445121' => '潮安县', + '445122' => '饶平县', + '445200' => '揭阳市', + '445201' => '市辖区', + '445202' => '榕城区', + '445203' => '揭东区', + '445221' => '揭东县', + '445222' => '揭西县', + '445223' => '普宁县', + '445224' => '惠来县', + '445281' => '普宁市', + '445300' => '云浮市', + '445301' => '市辖区', + '445302' => '云城区', + '445303' => '云安区', + '445321' => '新兴县', + '445322' => '郁南县', + '445323' => '云安县', + '445381' => '罗定市', + '449000' => '省直辖县级行政区划', + '449001' => '顺德市', + '449002' => '台山市', + '449003' => '番禺市', + '449004' => '南海市', + '449005' => '云浮市', + '449006' => '新会市', + '449007' => '开平市', + '449008' => '三水市', + '449009' => '普宁市', + '449010' => '罗定市', + '449011' => '潮阳市', + '449012' => '高州市', + '449013' => '花都市', + '449014' => '高要市', + '449015' => '鹤山市', + '449016' => '四会市', + '449017' => '增城市', + '449018' => '廉江市', + '449019' => '英德市', + '449020' => '恩平市', + '449021' => '从化市', + '449022' => '澄海市', + '449023' => '高明市', + '449024' => '连州市', + '449025' => '雷州市', + '449026' => '乐昌市', + '449027' => '阳春市', + '449028' => '惠阳市', + '449029' => '吴川市', + '449030' => '兴宁市', + '449031' => '化州市', + '450000' => '广西壮族自治区', + '450100' => '南宁市', + '450101' => '市辖区', + '450102' => '兴宁区', + '450103' => '青秀区', + '450104' => '城北区', + '450105' => '江南区', + '450106' => '永新区', + '450107' => '西乡塘区', + '450108' => '良庆区', + '450109' => '邕宁区', + '450110' => '武鸣区', + '450111' => '市郊区', + '450121' => '邕宁县', + '450122' => '武鸣县', + '450123' => '隆安县', + '450124' => '马山县', + '450125' => '上林县', + '450126' => '宾阳县', + '450127' => '横县', + '450181' => '横州市', + '450200' => '柳州市', + '450201' => '市辖区', + '450202' => '城中区', + '450203' => '鱼峰区', + '450204' => '柳南区', + '450205' => '柳北区', + '450206' => '柳江区', + '450211' => '市郊区', + '450221' => '柳江县', + '450222' => '柳城县', + '450223' => '鹿寨县', + '450224' => '融安县', + '450225' => '融水苗族自治县', + '450226' => '三江侗族自治县', + '450300' => '桂林市', + '450301' => '市辖区', + '450302' => '秀峰区', + '450303' => '叠彩区', + '450304' => '象山区', + '450305' => '七星区', + '450311' => '雁山区', + '450312' => '临桂区', + '450320' => '市区', + '450321' => '阳朔县', + '450322' => '临桂县', + '450323' => '灵川县', + '450324' => '全州县', + '450325' => '兴安县', + '450326' => '永福县', + '450327' => '灌阳县', + '450328' => '龙胜各族自治县', + '450329' => '资源县', + '450330' => '平乐县', + '450331' => '荔浦县', + '450332' => '恭城瑶族自治县', + '450381' => '荔浦市', + '450400' => '梧州市', + '450401' => '市辖区', + '450402' => '白云区', + '450403' => '万秀区', + '450404' => '蝶山区', + '450405' => '长洲区', + '450406' => '龙圩区', + '450411' => '市郊区', + '450421' => '苍梧县', + '450422' => '藤县', + '450423' => '蒙山县', + '450481' => '岑溪市', + '450500' => '北海市', + '450501' => '市辖区', + '450502' => '海城区', + '450503' => '银海区', + '450504' => '铁山港区', + '450511' => '市郊区', + '450512' => '铁山港区', + '450521' => '合浦县', + '450600' => '防城港市', + '450601' => '市辖区', + '450602' => '港口区', + '450603' => '防城区', + '450621' => '上思县', + '450622' => '浦北县', + '450681' => '东兴市', + '450700' => '钦州市', + '450701' => '市辖区', + '450702' => '钦南区', + '450703' => '钦北区', + '450721' => '灵山县', + '450722' => '浦北县', + '450800' => '贵港市', + '450801' => '市辖区', + '450802' => '港北区', + '450803' => '港南区', + '450804' => '覃塘区', + '450821' => '平南县', + '450881' => '桂平市', + '450900' => '玉林市', + '450901' => '市辖区', + '450902' => '玉州区', + '450903' => '福绵区', + '450921' => '容县', + '450922' => '陆川县', + '450923' => '博白县', + '450924' => '兴业县', + '450981' => '北流市', + '451000' => '百色市', + '451001' => '市辖区', + '451002' => '右江区', + '451003' => '田阳区', + '451021' => '田阳县', + '451022' => '田东县', + '451023' => '平果县', + '451024' => '德保县', + '451025' => '靖西县', + '451026' => '那坡县', + '451027' => '凌云县', + '451028' => '乐业县', + '451029' => '田林县', + '451030' => '西林县', + '451031' => '隆林各族自治县', + '451081' => '靖西市', + '451082' => '平果市', + '451100' => '贺州市', + '451101' => '市辖区', + '451102' => '八步区', + '451103' => '平桂区', + '451119' => '平桂管理区', + '451121' => '昭平县', + '451122' => '钟山县', + '451123' => '富川瑶族自治县', + '451200' => '河池市', + '451201' => '市辖区', + '451202' => '金城江区', + '451203' => '宜州区', + '451221' => '南丹县', + '451222' => '天峨县', + '451223' => '凤山县', + '451224' => '东兰县', + '451225' => '罗城仫佬族自治县', + '451226' => '环江毛南族自治县', + '451227' => '巴马瑶族自治县', + '451228' => '都安瑶族自治县', + '451229' => '大化瑶族自治县', + '451281' => '宜州市', + '451300' => '来宾市', + '451301' => '市辖区', + '451302' => '兴宾区', + '451321' => '忻城县', + '451322' => '象州县', + '451323' => '武宣县', + '451324' => '金秀瑶族自治县', + '451381' => '合山市', + '451400' => '崇左市', + '451401' => '市辖区', + '451402' => '江州区', + '451421' => '扶绥县', + '451422' => '宁明县', + '451423' => '龙州县', + '451424' => '大新县', + '451425' => '天等县', + '451481' => '凭祥市', + '452100' => '南宁地区', + '452101' => '凭祥市', + '452121' => '邕宁县', + '452122' => '横县', + '452123' => '宾阳县', + '452124' => '上林县', + '452125' => '武鸣县', + '452126' => '隆安县', + '452127' => '马山县', + '452128' => '扶绥县', + '452129' => '崇左县', + '452130' => '大新县', + '452131' => '天等县', + '452132' => '宁明县', + '452133' => '龙州县', + '452200' => '柳州地区', + '452201' => '合山市', + '452221' => '柳江县', + '452222' => '柳城县', + '452223' => '鹿寨县', + '452224' => '象州县', + '452225' => '武宣县', + '452226' => '来宾县', + '452227' => '融安县', + '452228' => '三江侗族自治县', + '452229' => '融水苗族自治县', + '452230' => '金秀瑶族自治县', + '452231' => '忻城县', + '452300' => '桂林地区', + '452321' => '临桂县', + '452322' => '灵川县', + '452323' => '全州县', + '452324' => '兴安县', + '452325' => '永福县', + '452326' => '阳朔县', + '452327' => '灌阳县', + '452328' => '龙胜各族自治县', + '452329' => '资源县', + '452330' => '平乐县', + '452331' => '荔蒲县', + '452332' => '恭城瑶族自治县', + '452400' => '贺州地区', + '452402' => '贺州市', + '452421' => '岑溪县', + '452422' => '苍梧县', + '452423' => '藤县', + '452424' => '昭平县', + '452425' => '蒙山县', + '452426' => '贺县', + '452427' => '钟山县', + '452428' => '富川瑶族自治县', + '452500' => '玉林地区', + '452501' => '玉林市', + '452502' => '贵港市', + '452503' => '北流市', + '452504' => '桂平市', + '452521' => '玉林县', + '452522' => '贵县', + '452523' => '桂平县', + '452524' => '平南县', + '452525' => '容县', + '452526' => '北流县', + '452527' => '陆川县', + '452528' => '博白县', + '452600' => '百色地区', + '452601' => '百色市', + '452621' => '百色县', + '452622' => '田阳县', + '452623' => '田东县', + '452624' => '平果县', + '452625' => '德保县', + '452626' => '靖西县', + '452627' => '那坡县', + '452628' => '凌云县', + '452629' => '乐业县', + '452630' => '田林县', + '452631' => '隆林各族自治县', + '452632' => '西林县', + '452700' => '河池地区', + '452701' => '河池市', + '452702' => '宜州市', + '452721' => '河池县', + '452722' => '宜山县', + '452723' => '罗城仫佬族自治县', + '452724' => '环江毛南族自治县', + '452725' => '南丹县', + '452726' => '天峨县', + '452727' => '凤山县', + '452728' => '东兰县', + '452729' => '巴马瑶族自治县', + '452730' => '都安瑶族自治县', + '452731' => '大化瑶族自治县', + '452800' => '钦州地区', + '452801' => '北海市', + '452802' => '钦州市', + '452821' => '上思县', + '452822' => '防城各族自治县', + '452823' => '钦州县', + '452824' => '灵山县', + '452825' => '合浦县', + '452826' => '浦北县', + '460000' => '海南省', + '460001' => '通什市', + '460002' => '琼海市', + '460003' => '儋州市', + '460004' => '琼山市', + '460005' => '文昌市', + '460006' => '万宁市', + '460007' => '东方市', + '460021' => '琼山县', + '460022' => '文昌县', + '460023' => '琼海县', + '460024' => '万宁县', + '460025' => '定安县', + '460026' => '屯昌县', + '460027' => '澄迈县', + '460028' => '临高县', + '460029' => '儋县', + '460030' => '白沙黎族自治县', + '460031' => '昌江黎族自治县', + '460032' => '东方黎族自治县', + '460033' => '乐东黎族自治县', + '460034' => '陵水黎族自治县', + '460035' => '保亭黎族苗族自治县', + '460036' => '琼中黎族苗族自治县', + '460037' => '西沙群岛', + '460038' => '南沙群岛', + '460039' => '中沙群岛的岛礁及其海域', + '460100' => '海口市', + '460101' => '市辖区', + '460102' => '振东区', + '460103' => '新华区', + '460104' => '秀英区', + '460105' => '秀英区', + '460106' => '龙华区', + '460107' => '琼山区', + '460108' => '美兰区', + '460200' => '三亚市', + '460201' => '市辖区', + '460202' => '海棠区', + '460203' => '吉阳区', + '460204' => '天涯区', + '460205' => '崖州区', + '460300' => '三沙市', + '460301' => '市辖区', + '460302' => '西沙区', + '460303' => '南沙区', + '460400' => '儋州市', + '469000' => '省直辖县级行政区划', + '469001' => '五指山市', + '469002' => '琼海市', + '469003' => '儋州市', + '469004' => '琼山市', + '469005' => '文昌市', + '469006' => '万宁市', + '469007' => '东方市', + '469021' => '定安县', + '469022' => '屯昌县', + '469023' => '澄迈县', + '469024' => '临高县', + '469025' => '白沙黎族自治县', + '469026' => '昌江黎族自治县', + '469027' => '乐东黎族自治县', + '469028' => '陵水黎族自治县', + '469029' => '保亭黎族苗族自治县', + '469030' => '琼中黎族苗族自治县', + '469031' => '西沙群岛', + '469032' => '南沙群岛', + '469033' => '中沙群岛的岛礁及其海域', + '500000' => '重庆市', + '500100' => '市辖区', + '500101' => '万州区', + '500102' => '涪陵区', + '500103' => '渝中区', + '500104' => '大渡口区', + '500105' => '江北区', + '500106' => '沙坪坝区', + '500107' => '九龙坡区', + '500108' => '南岸区', + '500109' => '北碚区', + '500110' => '綦江区', + '500111' => '大足区', + '500112' => '渝北区', + '500113' => '巴南区', + '500114' => '黔江区', + '500115' => '长寿区', + '500116' => '江津区', + '500117' => '合川区', + '500118' => '永川区', + '500119' => '南川区', + '500120' => '璧山区', + '500151' => '铜梁区', + '500152' => '潼南区', + '500153' => '荣昌区', + '500154' => '开州区', + '500155' => '梁平区', + '500156' => '武隆区', + '500221' => '长寿县', + '500222' => '綦江县', + '500223' => '潼南县', + '500224' => '铜梁县', + '500225' => '大足县', + '500226' => '荣昌县', + '500227' => '璧山县', + '500228' => '梁平县', + '500229' => '城口县', + '500230' => '丰都县', + '500231' => '垫江县', + '500232' => '武隆县', + '500233' => '忠县', + '500234' => '开县', + '500235' => '云阳县', + '500236' => '奉节县', + '500237' => '巫山县', + '500238' => '巫溪县', + '500239' => '黔江土家族苗族自治县', + '500240' => '石柱土家族自治县', + '500241' => '秀山土家族苗族自治县', + '500242' => '酉阳土家族苗族自治县', + '500243' => '彭水苗族土家族自治县', + '500300' => '市', + '500381' => '江津市', + '500382' => '合川市', + '500383' => '永川市', + '500384' => '南川市', + '510000' => '四川省', + '510100' => '成都市', + '510101' => '市辖区', + '510102' => '东城区', + '510103' => '西城区', + '510104' => '锦江区', + '510105' => '青羊区', + '510106' => '金牛区', + '510107' => '武侯区', + '510108' => '成华区', + '510111' => '金牛区', + '510112' => '龙泉驿区', + '510113' => '青白江区', + '510114' => '新都区', + '510115' => '温江区', + '510116' => '双流区', + '510117' => '郫都区', + '510118' => '新津区', + '510120' => '市区', + '510121' => '金堂县', + '510122' => '双流县', + '510123' => '温江县', + '510124' => '郫县', + '510125' => '新都县', + '510126' => '彭县', + '510127' => '灌县', + '510128' => '崇庆县', + '510129' => '大邑县', + '510130' => '邛崃县', + '510131' => '蒲江县', + '510132' => '新津县', + '510181' => '都江堰市', + '510182' => '彭州市', + '510183' => '邛崃市', + '510184' => '崇州市', + '510185' => '简阳市', + '510200' => '重庆市', + '510201' => '市辖区', + '510202' => '渝中区', + '510203' => '大渡口区', + '510211' => '江北区', + '510212' => '沙坪坝区', + '510213' => '九龙坡区', + '510214' => '南岸区', + '510215' => '北碚区', + '510216' => '万盛区', + '510217' => '双桥区', + '510218' => '渝北区', + '510219' => '巴南区', + '510220' => '市区', + '510221' => '长寿县', + '510222' => '巴县', + '510223' => '綦江县', + '510224' => '江北县', + '510225' => '江津县', + '510226' => '合川县', + '510227' => '潼南县', + '510228' => '铜梁县', + '510229' => '永川县', + '510230' => '大足县', + '510231' => '荣昌县', + '510232' => '璧山县', + '510281' => '永川市', + '510282' => '江津市', + '510283' => '合川市', + '510300' => '自贡市', + '510301' => '市辖区', + '510302' => '自流井区', + '510303' => '贡井区', + '510304' => '大安区', + '510311' => '沿滩区', + '510320' => '市区', + '510321' => '荣县', + '510322' => '富顺县', + '510400' => '攀枝花市', + '510401' => '市辖区', + '510402' => '东区', + '510403' => '西区', + '510411' => '仁和区', + '510420' => '市区', + '510421' => '米易县', + '510422' => '盐边县', + '510500' => '泸州市', + '510501' => '市辖区', + '510502' => '江阳区', + '510503' => '纳溪区', + '510504' => '龙马潭区', + '510521' => '泸县', + '510522' => '合江县', + '510523' => '纳溪县', + '510524' => '叙永县', + '510525' => '古蔺县', + '510600' => '德阳市', + '510601' => '市辖区', + '510602' => '市中区', + '510603' => '旌阳区', + '510604' => '罗江区', + '510621' => '德阳县', + '510622' => '绵竹县', + '510623' => '中江县', + '510624' => '广汉县', + '510625' => '什邡县', + '510626' => '罗江县', + '510681' => '广汉市', + '510682' => '什邡市', + '510683' => '绵竹市', + '510700' => '绵阳市', + '510701' => '市辖区', + '510702' => '市中区', + '510703' => '涪城区', + '510704' => '游仙区', + '510705' => '安州区', + '510721' => '江油县', + '510722' => '三台县', + '510723' => '盐亭县', + '510724' => '安县', + '510725' => '梓潼县', + '510726' => '北川羌族自治县', + '510727' => '平武县', + '510781' => '江油市', + '510800' => '广元市', + '510801' => '市辖区', + '510802' => '利州区', + '510811' => '昭化区', + '510812' => '朝天区', + '510821' => '旺苍县', + '510822' => '青川县', + '510823' => '剑阁县', + '510824' => '苍溪县', + '510900' => '遂宁市', + '510901' => '市辖区', + '510902' => '市中区', + '510903' => '船山区', + '510904' => '安居区', + '510921' => '蓬溪县', + '510922' => '射洪县', + '510923' => '大英县', + '510981' => '射洪市', + '511000' => '内江市', + '511001' => '市辖区', + '511002' => '市中区', + '511011' => '东兴区', + '511021' => '内江县', + '511022' => '乐至县', + '511023' => '安岳县', + '511024' => '威远县', + '511025' => '资中县', + '511026' => '资阳县', + '511027' => '简阳县', + '511028' => '隆昌县', + '511081' => '资阳市', + '511082' => '简阳市', + '511083' => '隆昌市', + '511100' => '乐山市', + '511101' => '市辖区', + '511102' => '市中区', + '511111' => '沙湾区', + '511112' => '五通桥区', + '511113' => '金口河区', + '511121' => '仁寿县', + '511122' => '眉山县', + '511123' => '犍为县', + '511124' => '井研县', + '511125' => '峨眉县', + '511126' => '夹江县', + '511127' => '洪雅县', + '511128' => '彭山县', + '511129' => '沐川县', + '511130' => '青神县', + '511131' => '丹稜县', + '511132' => '峨边彝族自治县', + '511133' => '马边彝族自治县', + '511181' => '峨眉山市', + '511200' => '万县市', + '511201' => '市辖区', + '511202' => '龙宝区', + '511203' => '天城区', + '511204' => '五桥区', + '511221' => '开县', + '511222' => '忠县', + '511223' => '梁平县', + '511224' => '云阳县', + '511225' => '奉节县', + '511226' => '巫山县', + '511227' => '巫溪县', + '511228' => '城口县', + '511300' => '南充市', + '511301' => '市辖区', + '511302' => '顺庆区', + '511303' => '高坪区', + '511304' => '嘉陵区', + '511321' => '南部县', + '511322' => '营山县', + '511323' => '蓬安县', + '511324' => '仪陇县', + '511325' => '西充县', + '511381' => '阆中市', + '511400' => '眉山市', + '511401' => '市辖区', + '511402' => '东坡区', + '511403' => '彭山区', + '511421' => '仁寿县', + '511422' => '彭山县', + '511423' => '洪雅县', + '511424' => '丹棱县', + '511425' => '青神县', + '511500' => '宜宾市', + '511501' => '市辖区', + '511502' => '翠屏区', + '511503' => '南溪区', + '511504' => '叙州区', + '511521' => '宜宾县', + '511522' => '南溪县', + '511523' => '江安县', + '511524' => '长宁县', + '511525' => '高县', + '511526' => '珙县', + '511527' => '筠连县', + '511528' => '兴文县', + '511529' => '屏山县', + '511600' => '广安市', + '511601' => '市辖区', + '511602' => '广安区', + '511603' => '前锋区', + '511621' => '岳池县', + '511622' => '武胜县', + '511623' => '邻水县', + '511681' => '华蓥市', + '511700' => '达州市', + '511701' => '市辖区', + '511702' => '通川区', + '511703' => '达川区', + '511721' => '达县', + '511722' => '宣汉县', + '511723' => '开江县', + '511724' => '大竹县', + '511725' => '渠县', + '511781' => '万源市', + '511800' => '雅安市', + '511801' => '市辖区', + '511802' => '雨城区', + '511803' => '名山区', + '511821' => '名山县', + '511822' => '荥经县', + '511823' => '汉源县', + '511824' => '石棉县', + '511825' => '天全县', + '511826' => '芦山县', + '511827' => '宝兴县', + '511900' => '巴中市', + '511901' => '市辖区', + '511902' => '巴州区', + '511903' => '恩阳区', + '511921' => '通江县', + '511922' => '南江县', + '511923' => '平昌县', + '512000' => '资阳市', + '512001' => '市辖区', + '512002' => '雁江区', + '512021' => '安岳县', + '512022' => '乐至县', + '512081' => '简阳市', + '512100' => '永川地区', + '512121' => '江津县', + '512122' => '合川县', + '512123' => '潼南县', + '512124' => '铜梁县', + '512125' => '永川县', + '512126' => '大足县', + '512127' => '荣昌县', + '512128' => '璧山县', + '512200' => '万县地区', + '512201' => '万县市', + '512221' => '万县', + '512222' => '开县', + '512223' => '忠县', + '512224' => '梁平县', + '512225' => '云阳县', + '512226' => '奉节县', + '512227' => '巫山县', + '512228' => '巫溪县', + '512229' => '城口县', + '512300' => '涪陵地区', + '512301' => '涪陵市', + '512302' => '南川市', + '512321' => '涪陵县', + '512322' => '垫江县', + '512323' => '南川县', + '512324' => '丰都县', + '512325' => '石柱土家族自治县', + '512326' => '武隆县', + '512327' => '彭水苗族土家族自治县', + '512328' => '黔江土家族苗族自治县', + '512329' => '酉阳土家族苗族自治县', + '512330' => '秀山土家族苗族自治县', + '512400' => '内江地区', + '512401' => '内江市', + '512402' => '泸州市', + '512421' => '内江县', + '512422' => '资中县', + '512423' => '资阳县', + '512424' => '简阳县', + '512425' => '威远县', + '512426' => '隆昌县', + '512427' => '安岳县', + '512428' => '乐至县', + '512500' => '宜宾地区', + '512501' => '宜宾市', + '512502' => '泸州市', + '512521' => '泸县', + '512522' => '富顺县', + '512523' => '合江县', + '512524' => '纳溪县', + '512525' => '叙永县', + '512526' => '古蔺县', + '512527' => '宜宾县', + '512528' => '南溪县', + '512529' => '江安县', + '512530' => '长宁县', + '512531' => '高县', + '512532' => '筠连县', + '512533' => '珙县', + '512534' => '兴文县', + '512535' => '屏山县', + '512600' => '乐山地区', + '512601' => '乐山市', + '512621' => '仁寿县', + '512622' => '眉山县', + '512623' => '犍为县', + '512624' => '井研县', + '512625' => '峨眉县', + '512626' => '夹江县', + '512627' => '洪雅县', + '512628' => '彭山县', + '512629' => '沐川县', + '512630' => '青神县', + '512631' => '丹稜县', + '512632' => '峨边彝族自治县', + '512633' => '马边彝族自治县', + '512634' => '金口河工农区', + '512700' => '温江地区', + '512721' => '温江县', + '512722' => '郫县', + '512723' => '新都县', + '512724' => '广汉县', + '512725' => '什邡县', + '512726' => '彭县', + '512727' => '灌县', + '512728' => '崇庆县', + '512729' => '大邑县', + '512730' => '邛崃县', + '512731' => '蒲江县', + '512732' => '新津县', + '512800' => '绵阳地区', + '512801' => '绵阳市', + '512821' => '德阳县', + '512822' => '绵竹县', + '512823' => '安县', + '512824' => '江油县', + '512825' => '梓潼县', + '512826' => '剑阁县', + '512827' => '广元县', + '512828' => '旺苍县', + '512829' => '青川县', + '512830' => '平武县', + '512831' => '北川县', + '512832' => '遂宁县', + '512833' => '三台县', + '512834' => '中江县', + '512835' => '蓬溪县', + '512836' => '射洪县', + '512837' => '盐亭县', + '512900' => '南充地区', + '512901' => '南充市', + '512902' => '华市', + '512903' => '阆中市', + '512921' => '南充县', + '512922' => '南部县', + '512923' => '岳池县', + '512924' => '营山县', + '512925' => '广安县', + '512926' => '蓬安县', + '512927' => '仪陇县', + '512928' => '武胜县', + '512929' => '西充县', + '512930' => '阆中县', + '512931' => '苍溪县', + '512932' => '华云工农区', + '513000' => '达川地区', + '513001' => '达川市', + '513002' => '万源市', + '513003' => '万源市', + '513021' => '达县', + '513022' => '宣汉县', + '513023' => '开江县', + '513024' => '万源县', + '513025' => '通江县', + '513026' => '南江县', + '513027' => '巴中县', + '513028' => '平昌县', + '513029' => '大竹县', + '513030' => '渠县', + '513031' => '邻水县', + '513032' => '白沙工农区', + '513100' => '雅安地区', + '513101' => '雅安市', + '513121' => '雅安县', + '513122' => '名山县', + '513123' => '荥经县', + '513124' => '汉源县', + '513125' => '石棉县', + '513126' => '天全县', + '513127' => '芦山县', + '513128' => '宝兴县', + '513200' => '阿坝藏族羌族自治州', + '513201' => '马尔康市', + '513221' => '汶川县', + '513222' => '理县', + '513223' => '茂县', + '513224' => '松潘县', + '513225' => '九寨沟县', + '513226' => '金川县', + '513227' => '小金县', + '513228' => '黑水县', + '513229' => '马尔康县', + '513230' => '壤塘县', + '513231' => '阿坝县', + '513232' => '若尔盖县', + '513233' => '红原县', + '513300' => '甘孜藏族自治州', + '513301' => '康定市', + '513321' => '康定县', + '513322' => '泸定县', + '513323' => '丹巴县', + '513324' => '九龙县', + '513325' => '雅江县', + '513326' => '道孚县', + '513327' => '炉霍县', + '513328' => '甘孜县', + '513329' => '新龙县', + '513330' => '德格县', + '513331' => '白玉县', + '513332' => '石渠县', + '513333' => '色达县', + '513334' => '理塘县', + '513335' => '巴塘县', + '513336' => '乡城县', + '513337' => '稻城县', + '513338' => '得荣县', + '513400' => '凉山彝族自治州', + '513401' => '西昌市', + '513402' => '会理市', + '513421' => '西昌县', + '513422' => '木里藏族自治县', + '513423' => '盐源县', + '513424' => '德昌县', + '513425' => '会理县', + '513426' => '会东县', + '513427' => '宁南县', + '513428' => '普格县', + '513429' => '布拖县', + '513430' => '金阳县', + '513431' => '昭觉县', + '513432' => '喜德县', + '513433' => '冕宁县', + '513434' => '越西县', + '513435' => '甘洛县', + '513436' => '美姑县', + '513437' => '雷波县', + '513500' => '黔江地区', + '513521' => '石柱土家族自治县', + '513522' => '秀山土家族苗族自治县', + '513523' => '黔江土家族苗族自治县', + '513524' => '酉阳土家族苗族自治县', + '513525' => '彭水苗族土家族自治县', + '513600' => '广安地区', + '513601' => '华市', + '513621' => '广安县', + '513622' => '岳池县', + '513623' => '武胜县', + '513624' => '邻水县', + '513700' => '巴中地区', + '513701' => '巴中市', + '513721' => '通江县', + '513722' => '南江县', + '513723' => '平昌县', + '513800' => '眉山地区', + '513821' => '眉山县', + '513822' => '仁寿县', + '513823' => '彭山县', + '513824' => '洪雅县', + '513825' => '丹棱县', + '513826' => '青神县', + '513900' => '资阳地区', + '513901' => '资阳市', + '513902' => '简阳市', + '513921' => '安岳县', + '513922' => '乐至县', + '519000' => '省直辖县级行政区划', + '519001' => '广汉市', + '519002' => '江油市', + '519003' => '都江堰市', + '519004' => '峨眉山市', + '519005' => '永川市', + '519006' => '合川市', + '519007' => '江津市', + '519008' => '阆中市', + '519009' => '资阳市', + '519010' => '彭州市', + '519011' => '简阳市', + '519012' => '邛崃市', + '519013' => '崇州市', + '520000' => '贵州省', + '520100' => '贵阳市', + '520101' => '市辖区', + '520102' => '南明区', + '520103' => '云岩区', + '520111' => '花溪区', + '520112' => '乌当区', + '520113' => '白云区', + '520114' => '小河区', + '520115' => '观山湖区', + '520121' => '开阳县', + '520122' => '息烽县', + '520123' => '修文县', + '520181' => '清镇市', + '520200' => '六盘水市', + '520201' => '钟山区', + '520202' => '盘县特区', + '520203' => '六枝特区', + '520204' => '水城区', + '520221' => '水城县', + '520222' => '盘县', + '520281' => '盘州市', + '520300' => '遵义市', + '520301' => '市辖区', + '520302' => '红花岗区', + '520303' => '汇川区', + '520304' => '播州区', + '520321' => '遵义县', + '520322' => '桐梓县', + '520323' => '绥阳县', + '520324' => '正安县', + '520325' => '道真仡佬族苗族自治县', + '520326' => '务川仡佬族苗族自治县', + '520327' => '凤冈县', + '520328' => '湄潭县', + '520329' => '余庆县', + '520330' => '习水县', + '520381' => '赤水市', + '520382' => '仁怀市', + '520400' => '安顺市', + '520401' => '市辖区', + '520402' => '西秀区', + '520403' => '平坝区', + '520421' => '平坝县', + '520422' => '普定县', + '520423' => '镇宁布依族苗族自治县', + '520424' => '关岭布依族苗族自治县', + '520425' => '紫云苗族布依族自治县', + '520500' => '毕节市', + '520501' => '市辖区', + '520502' => '七星关区', + '520521' => '大方县', + '520522' => '黔西县', + '520523' => '金沙县', + '520524' => '织金县', + '520525' => '纳雍县', + '520526' => '威宁彝族回族苗族自治县', + '520527' => '赫章县', + '520581' => '黔西市', + '520600' => '铜仁市', + '520601' => '市辖区', + '520602' => '碧江区', + '520603' => '万山区', + '520621' => '江口县', + '520622' => '玉屏侗族自治县', + '520623' => '石阡县', + '520624' => '思南县', + '520625' => '印江土家族苗族自治县', + '520626' => '德江县', + '520627' => '沿河土家族自治县', + '520628' => '松桃苗族自治县', + '522100' => '遵义地区', + '522101' => '遵义市', + '522102' => '赤水市', + '522103' => '仁怀市', + '522121' => '遵义县', + '522122' => '桐梓县', + '522123' => '绥阳县', + '522124' => '正安县', + '522125' => '道真仡佬族苗族自治县', + '522126' => '务川仡佬族苗族自治县', + '522127' => '凤冈县', + '522128' => '湄潭县', + '522129' => '余庆县', + '522130' => '仁怀县', + '522131' => '赤水县', + '522132' => '习水县', + '522200' => '铜仁地区', + '522201' => '铜仁市', + '522221' => '铜仁县', + '522222' => '江口县', + '522223' => '玉屏侗族自治县', + '522224' => '石阡县', + '522225' => '思南县', + '522226' => '印江土家族苗族自治县', + '522227' => '德江县', + '522228' => '沿河土家族自治县', + '522229' => '松桃苗族自治县', + '522230' => '万山特区', + '522300' => '黔西南布依族苗族自治州', + '522301' => '兴义市', + '522302' => '兴仁市', + '522321' => '兴义县', + '522322' => '兴仁县', + '522323' => '普安县', + '522324' => '晴隆县', + '522325' => '贞丰县', + '522326' => '望谟县', + '522327' => '册亨县', + '522328' => '安龙县', + '522400' => '毕节地区', + '522401' => '毕节市', + '522421' => '毕节县', + '522422' => '大方县', + '522423' => '黔西县', + '522424' => '金沙县', + '522425' => '织金县', + '522426' => '纳雍县', + '522427' => '威宁彝族回族苗族自治县', + '522428' => '赫章县', + '522500' => '安顺地区', + '522501' => '安顺市', + '522502' => '清镇市', + '522521' => '安顺县', + '522522' => '开阳县', + '522523' => '息烽县', + '522524' => '修文县', + '522525' => '清镇县', + '522526' => '平坝县', + '522527' => '普定县', + '522528' => '关岭布依族苗族自治县', + '522529' => '镇宁布依族苗族自治县', + '522530' => '紫云苗族布依族自治县', + '522600' => '黔东南苗族侗族自治州', + '522601' => '凯里市', + '522621' => '凯里县', + '522622' => '黄平县', + '522623' => '施秉县', + '522624' => '三穗县', + '522625' => '镇远县', + '522626' => '岑巩县', + '522627' => '天柱县', + '522628' => '锦屏县', + '522629' => '剑河县', + '522630' => '台江县', + '522631' => '黎平县', + '522632' => '榕江县', + '522633' => '从江县', + '522634' => '雷山县', + '522635' => '麻江县', + '522636' => '丹寨县', + '522700' => '黔南布依族苗族自治州', + '522701' => '都匀市', + '522702' => '福泉市', + '522721' => '都匀县', + '522722' => '荔波县', + '522723' => '贵定县', + '522724' => '福泉县', + '522725' => '瓮安县', + '522726' => '独山县', + '522727' => '平塘县', + '522728' => '罗甸县', + '522729' => '长顺县', + '522730' => '龙里县', + '522731' => '惠水县', + '522732' => '三都水族自治县', + '530000' => '云南省', + '530100' => '昆明市', + '530101' => '市辖区', + '530102' => '五华区', + '530103' => '盘龙区', + '530111' => '官渡区', + '530112' => '西山区', + '530113' => '东川区', + '530114' => '呈贡区', + '530115' => '晋宁区', + '530120' => '市区', + '530121' => '呈贡县', + '530122' => '晋宁县', + '530123' => '安宁县', + '530124' => '富民县', + '530125' => '宜良县', + '530126' => '石林彝族自治县', + '530127' => '嵩明县', + '530128' => '禄劝彝族苗族自治县', + '530129' => '寻甸回族彝族自治县', + '530181' => '安宁市', + '530200' => '东川市', + '530201' => '市辖区', + '530300' => '曲靖市', + '530301' => '市辖区', + '530302' => '麒麟区', + '530303' => '沾益区', + '530304' => '马龙区', + '530321' => '马龙县', + '530322' => '陆良县', + '530323' => '师宗县', + '530324' => '罗平县', + '530325' => '富源县', + '530326' => '会泽县', + '530327' => '寻甸县', + '530328' => '沾益县', + '530381' => '宣威市', + '530400' => '玉溪市', + '530401' => '市辖区', + '530402' => '红塔区', + '530403' => '江川区', + '530421' => '江川县', + '530422' => '澄江县', + '530423' => '通海县', + '530424' => '华宁县', + '530425' => '易门县', + '530426' => '峨山彝族自治县', + '530427' => '新平彝族傣族自治县', + '530428' => '元江哈尼族彝族傣族自治县', + '530481' => '澄江市', + '530500' => '保山市', + '530501' => '市辖区', + '530502' => '隆阳区', + '530521' => '施甸县', + '530522' => '腾冲县', + '530523' => '龙陵县', + '530524' => '昌宁县', + '530581' => '腾冲市', + '530600' => '昭通市', + '530601' => '市辖区', + '530602' => '昭阳区', + '530621' => '鲁甸县', + '530622' => '巧家县', + '530623' => '盐津县', + '530624' => '大关县', + '530625' => '永善县', + '530626' => '绥江县', + '530627' => '镇雄县', + '530628' => '彝良县', + '530629' => '威信县', + '530630' => '水富县', + '530681' => '水富市', + '530700' => '丽江市', + '530701' => '市辖区', + '530702' => '古城区', + '530721' => '玉龙纳西族自治县', + '530722' => '永胜县', + '530723' => '华坪县', + '530724' => '宁蒗彝族自治县', + '530800' => '普洱市', + '530801' => '市辖区', + '530802' => '思茅区', + '530821' => '宁洱哈尼族彝族自治县', + '530822' => '墨江哈尼族自治县', + '530823' => '景东彝族自治县', + '530824' => '景谷傣族彝族自治县', + '530825' => '镇沅彝族哈尼族拉祜族自治县', + '530826' => '江城哈尼族彝族自治县', + '530827' => '孟连傣族拉祜族佤族自治县', + '530828' => '澜沧拉祜族自治县', + '530829' => '西盟佤族自治县', + '530900' => '临沧市', + '530901' => '市辖区', + '530902' => '临翔区', + '530921' => '凤庆县', + '530922' => '云县', + '530923' => '永德县', + '530924' => '镇康县', + '530925' => '双江拉祜族佤族布朗族傣族自治县', + '530926' => '耿马傣族佤族自治县', + '530927' => '沧源佤族自治县', + '530928' => '果敢县', + '532100' => '昭通地区', + '532101' => '昭通市', + '532121' => '昭通县', + '532122' => '鲁甸县', + '532123' => '巧家县', + '532124' => '盐津县', + '532125' => '大关县', + '532126' => '永善县', + '532127' => '绥江县', + '532128' => '镇雄县', + '532129' => '彝良县', + '532130' => '威信县', + '532131' => '水富县', + '532200' => '曲靖地区', + '532201' => '曲靖市', + '532202' => '宣威市', + '532221' => '曲靖县', + '532222' => '沾益县', + '532223' => '马龙县', + '532224' => '宣威县', + '532225' => '富源县', + '532226' => '罗平县', + '532227' => '师宗县', + '532228' => '陆良县', + '532229' => '宜良县', + '532230' => '路南彝族自治县', + '532231' => '寻甸回族彝族自治县', + '532232' => '嵩明县', + '532233' => '会泽县', + '532300' => '楚雄彝族自治州', + '532301' => '楚雄市', + '532302' => '禄丰市', + '532321' => '楚雄县', + '532322' => '双柏县', + '532323' => '牟定县', + '532324' => '南华县', + '532325' => '姚安县', + '532326' => '大姚县', + '532327' => '永仁县', + '532328' => '元谋县', + '532329' => '武定县', + '532330' => '禄劝县', + '532331' => '禄丰县', + '532400' => '玉溪地区', + '532401' => '玉溪市', + '532421' => '玉溪县', + '532422' => '江川县', + '532423' => '澄江县', + '532424' => '通海县', + '532425' => '华宁县', + '532426' => '易门县', + '532427' => '峨山彝族自治县', + '532428' => '新平彝族傣族自治县', + '532429' => '元江哈尼族彝族傣族自治县', + '532500' => '红河哈尼族彝族自治州', + '532501' => '个旧市', + '532502' => '开远市', + '532503' => '蒙自市', + '532504' => '弥勒市', + '532521' => '开远县', + '532522' => '蒙自县', + '532523' => '屏边苗族自治县', + '532524' => '建水县', + '532525' => '石屏县', + '532526' => '弥勒县', + '532527' => '泸西县', + '532528' => '元阳县', + '532529' => '红河县', + '532530' => '金平苗族瑶族傣族自治县', + '532531' => '绿春县', + '532532' => '河口瑶族自治县', + '532600' => '文山壮族苗族自治州', + '532601' => '文山市', + '532621' => '文山县', + '532622' => '砚山县', + '532623' => '西畴县', + '532624' => '麻栗坡县', + '532625' => '马关县', + '532626' => '丘北县', + '532627' => '广南县', + '532628' => '富宁县', + '532700' => '思茅地区', + '532701' => '思茅市', + '532721' => '思茅县', + '532722' => '普洱哈尼族彝族自治县', + '532723' => '墨江哈尼族自治县', + '532724' => '景东彝族自治县', + '532725' => '景谷傣族彝族自治县', + '532726' => '镇沅彝族哈尼族拉祜族自治县', + '532727' => '江城哈尼族彝族自治县', + '532728' => '孟连傣族拉祜族佤族自治县', + '532729' => '澜沧拉祜族自治县', + '532730' => '西盟佤族自治县', + '532800' => '西双版纳傣族自治州', + '532801' => '景洪市', + '532821' => '景洪县', + '532822' => '勐海县', + '532823' => '勐腊县', + '532900' => '大理白族自治州', + '532901' => '大理市', + '532921' => '大理县', + '532922' => '漾濞彝族自治县', + '532923' => '祥云县', + '532924' => '宾川县', + '532925' => '弥渡县', + '532926' => '南涧彝族自治县', + '532927' => '巍山彝族回族自治县', + '532928' => '永平县', + '532929' => '云龙县', + '532930' => '洱源县', + '532931' => '剑川县', + '532932' => '鹤庆县', + '533000' => '保山地区', + '533001' => '保山市', + '533021' => '保山县', + '533022' => '施甸县', + '533023' => '腾冲县', + '533024' => '龙陵县', + '533025' => '昌宁县', + '533100' => '德宏傣族景颇族自治州', + '533101' => '畹町市', + '533102' => '瑞丽市', + '533103' => '芒市', + '533121' => '潞西县', + '533122' => '梁河县', + '533123' => '盈江县', + '533124' => '陇川县', + '533125' => '瑞丽县', + '533126' => '畹町镇', + '533200' => '丽江地区', + '533221' => '丽江纳西族自治县', + '533222' => '永胜县', + '533223' => '华坪县', + '533224' => '宁蒗彝族自治县', + '533300' => '怒江傈僳族自治州', + '533301' => '泸水市', + '533321' => '泸水县', + '533322' => '碧江县', + '533323' => '福贡县', + '533324' => '贡山独龙族怒族自治县', + '533325' => '兰坪白族普米族自治县', + '533400' => '迪庆藏族自治州', + '533401' => '香格里拉市', + '533421' => '香格里拉县', + '533422' => '德钦县', + '533423' => '维西傈僳族自治县', + '533500' => '临沧地区', + '533521' => '临沧县', + '533522' => '凤庆县', + '533523' => '云县', + '533524' => '永德县', + '533525' => '镇康县', + '533526' => '双江拉祜族佤族布朗族傣族自治县', + '533527' => '耿马傣族佤族自治县', + '533528' => '沧源佤族自治县', + '534000' => '克钦景颇族自治州', + '534021' => '密支那县', + '534022' => '八莫县', + '534023' => '葡萄县', + '534024' => '莫因县', + '534100' => '掸东佤族自治州', + '534101' => '邦康区', + '534102' => '南邓区', + '534121' => '勐冒县', + '534122' => '勐能县', + '534123' => '勐波县', + '534124' => '勐拉县', + '534200' => '掸北德昂族自治州', + '534300' => '掸中傣族自治州', + '534400' => '掸南佤族自治州', + '540000' => '西藏自治区', + '540100' => '拉萨市', + '540101' => '市辖区', + '540102' => '城关区', + '540103' => '堆龙德庆区', + '540104' => '达孜区', + '540120' => '市区', + '540121' => '林周县', + '540122' => '当雄县', + '540123' => '尼木县', + '540124' => '曲水县', + '540125' => '堆龙德庆县', + '540126' => '达孜县', + '540127' => '墨竹工卡县', + '540128' => '工布江达县', + '540129' => '林芝县', + '540130' => '米林县', + '540131' => '墨脱县', + '540200' => '日喀则市', + '540201' => '市辖区', + '540202' => '桑珠孜区', + '540221' => '南木林县', + '540222' => '江孜县', + '540223' => '定日县', + '540224' => '萨迦县', + '540225' => '拉孜县', + '540226' => '昂仁县', + '540227' => '谢通门县', + '540228' => '白朗县', + '540229' => '仁布县', + '540230' => '康马县', + '540231' => '定结县', + '540232' => '仲巴县', + '540233' => '亚东县', + '540234' => '吉隆县', + '540235' => '聂拉木县', + '540236' => '萨嘎县', + '540237' => '岗巴县', + '540300' => '昌都市', + '540301' => '市辖区', + '540302' => '卡若区', + '540321' => '江达县', + '540322' => '贡觉县', + '540323' => '类乌齐县', + '540324' => '丁青县', + '540325' => '察雅县', + '540326' => '八宿县', + '540327' => '左贡县', + '540328' => '芒康县', + '540329' => '洛隆县', + '540330' => '边坝县', + '540400' => '林芝市', + '540401' => '市辖区', + '540402' => '巴宜区', + '540421' => '工布江达县', + '540422' => '米林县', + '540423' => '墨脱县', + '540424' => '波密县', + '540425' => '察隅县', + '540426' => '朗县', + '540500' => '山南市', + '540501' => '市辖区', + '540502' => '乃东区', + '540521' => '扎囊县', + '540522' => '贡嘎县', + '540523' => '桑日县', + '540524' => '琼结县', + '540525' => '曲松县', + '540526' => '措美县', + '540527' => '洛扎县', + '540528' => '加查县', + '540529' => '隆子县', + '540530' => '错那县', + '540531' => '浪卡子县', + '540600' => '那曲市', + '540601' => '市辖区', + '540602' => '色尼区', + '540621' => '嘉黎县', + '540622' => '比如县', + '540623' => '聂荣县', + '540624' => '安多县', + '540625' => '申扎县', + '540626' => '索县', + '540627' => '班戈县', + '540628' => '巴青县', + '540629' => '尼玛县', + '540630' => '双湖县', + '542100' => '昌都地区', + '542121' => '昌都县', + '542122' => '江达县', + '542123' => '贡觉县', + '542124' => '类乌齐县', + '542125' => '丁青县', + '542126' => '察雅县', + '542127' => '八宿县', + '542128' => '左贡县', + '542129' => '芒康县', + '542130' => '波密县', + '542131' => '察隅县', + '542132' => '洛隆县', + '542133' => '边坝县', + '542134' => '盐井县', + '542135' => '碧土县', + '542136' => '妥坝县', + '542137' => '生达县', + '542200' => '山南地区', + '542221' => '乃东县', + '542222' => '扎囊县', + '542223' => '贡嘎县', + '542224' => '桑日县', + '542225' => '琼结县', + '542226' => '曲松县', + '542227' => '措美县', + '542228' => '洛扎县', + '542229' => '加查县', + '542230' => '朗县', + '542231' => '隆子县', + '542232' => '错那县', + '542233' => '浪卡子县', + '542300' => '日喀则地区', + '542301' => '日喀则市', + '542321' => '日喀则县', + '542322' => '南木林县', + '542323' => '江孜县', + '542324' => '定日县', + '542325' => '萨迦县', + '542326' => '拉孜县', + '542327' => '昂仁县', + '542328' => '谢通门县', + '542329' => '白朗县', + '542330' => '仁布县', + '542331' => '康马县', + '542332' => '定结县', + '542333' => '仲巴县', + '542334' => '亚东县', + '542335' => '吉隆县', + '542336' => '聂拉木县', + '542337' => '萨嘎县', + '542338' => '岗巴县', + '542400' => '那曲地区', + '542421' => '那曲县', + '542422' => '嘉黎县', + '542423' => '比如县', + '542424' => '聂荣县', + '542425' => '安多县', + '542426' => '申扎县', + '542427' => '索县', + '542428' => '班戈县', + '542429' => '巴青县', + '542430' => '尼玛县', + '542431' => '双湖县', + '542500' => '阿里地区', + '542521' => '普兰县', + '542522' => '札达县', + '542523' => '噶尔县', + '542524' => '日土县', + '542525' => '革吉县', + '542526' => '改则县', + '542527' => '措勤县', + '542528' => '隆格尔县', + '542600' => '林芝地区', + '542621' => '林芝县', + '542622' => '工布江达县', + '542623' => '米林县', + '542624' => '墨脱县', + '542625' => '波密县', + '542626' => '察隅县', + '542627' => '朗县', + '542700' => '江孜地区', + '542721' => '江孜县', + '542722' => '浪卡子县', + '542723' => '白朗县', + '542724' => '仁布县', + '542725' => '康马县', + '542726' => '亚东县', + '542727' => '岗巴县', + '610000' => '陕西省', + '610100' => '西安市', + '610101' => '市辖区', + '610102' => '新城区', + '610103' => '碑林区', + '610104' => '莲湖区', + '610111' => '灞桥区', + '610112' => '未央区', + '610113' => '雁塔区', + '610114' => '阎良区', + '610115' => '临潼区', + '610116' => '长安区', + '610117' => '高陵区', + '610118' => '鄠邑区', + '610120' => '市区', + '610121' => '长安县', + '610122' => '蓝田县', + '610123' => '临潼县', + '610124' => '周至县', + '610125' => '户县', + '610126' => '高陵县', + '610200' => '铜川市', + '610201' => '市辖区', + '610202' => '王益区', + '610203' => '印台区', + '610204' => '耀州区', + '610220' => '市区', + '610221' => '耀县', + '610222' => '宜君县', + '610300' => '宝鸡市', + '610301' => '市辖区', + '610302' => '渭滨区', + '610303' => '金台区', + '610304' => '陈仓区', + '610305' => '凤翔区', + '610320' => '市区', + '610321' => '宝鸡县', + '610322' => '凤翔县', + '610323' => '岐山县', + '610324' => '扶风县', + '610325' => '武功县', + '610326' => '眉县', + '610327' => '陇县', + '610328' => '千阳县', + '610329' => '麟游县', + '610330' => '凤县', + '610331' => '太白县', + '610400' => '咸阳市', + '610401' => '市辖区', + '610402' => '秦都区', + '610403' => '杨陵区', + '610404' => '渭城区', + '610421' => '兴平县', + '610422' => '三原县', + '610423' => '泾阳县', + '610424' => '乾县', + '610425' => '礼泉县', + '610426' => '永寿县', + '610427' => '彬县', + '610428' => '长武县', + '610429' => '旬邑县', + '610430' => '淳化县', + '610431' => '武功县', + '610481' => '兴平市', + '610482' => '彬州市', + '610500' => '渭南市', + '610501' => '市辖区', + '610502' => '临渭区', + '610503' => '华州区', + '610521' => '华县', + '610522' => '潼关县', + '610523' => '大荔县', + '610524' => '合阳县', + '610525' => '澄城县', + '610526' => '蒲城县', + '610527' => '白水县', + '610528' => '富平县', + '610581' => '韩城市', + '610582' => '华阴市', + '610600' => '延安市', + '610601' => '市辖区', + '610602' => '宝塔区', + '610603' => '安塞区', + '610621' => '延长县', + '610622' => '延川县', + '610623' => '子长县', + '610624' => '安塞县', + '610625' => '志丹县', + '610626' => '吴起县', + '610627' => '甘泉县', + '610628' => '富县', + '610629' => '洛川县', + '610630' => '宜川县', + '610631' => '黄龙县', + '610632' => '黄陵县', + '610681' => '子长市', + '610700' => '汉中市', + '610701' => '市辖区', + '610702' => '汉台区', + '610703' => '南郑区', + '610721' => '南郑县', + '610722' => '城固县', + '610723' => '洋县', + '610724' => '西乡县', + '610725' => '勉县', + '610726' => '宁强县', + '610727' => '略阳县', + '610728' => '镇巴县', + '610729' => '留坝县', + '610730' => '佛坪县', + '610800' => '榆林市', + '610801' => '市辖区', + '610802' => '榆阳区', + '610803' => '横山区', + '610821' => '神木县', + '610822' => '府谷县', + '610823' => '横山县', + '610824' => '靖边县', + '610825' => '定边县', + '610826' => '绥德县', + '610827' => '米脂县', + '610828' => '佳县', + '610829' => '吴堡县', + '610830' => '清涧县', + '610831' => '子洲县', + '610881' => '神木市', + '610900' => '安康市', + '610901' => '市辖区', + '610902' => '汉滨区', + '610921' => '汉阴县', + '610922' => '石泉县', + '610923' => '宁陕县', + '610924' => '紫阳县', + '610925' => '岚皋县', + '610926' => '平利县', + '610927' => '镇坪县', + '610928' => '旬阳县', + '610929' => '白河县', + '610981' => '旬阳市', + '611000' => '商洛市', + '611001' => '市辖区', + '611002' => '商州区', + '611021' => '洛南县', + '611022' => '丹凤县', + '611023' => '商南县', + '611024' => '山阳县', + '611025' => '镇安县', + '611026' => '柞水县', + '612100' => '渭南地区', + '612101' => '渭南市', + '612102' => '韩城市', + '612103' => '华阴市', + '612121' => '蓝田县', + '612122' => '临潼县', + '612123' => '渭南县', + '612124' => '华县', + '612125' => '华阴县', + '612126' => '潼关县', + '612127' => '大荔县', + '612128' => '蒲城县', + '612129' => '澄城县', + '612130' => '白水县', + '612131' => '韩城县', + '612132' => '合阳县', + '612133' => '富平县', + '612200' => '咸阳地区', + '612201' => '咸阳市', + '612221' => '兴平县', + '612222' => '周至县', + '612223' => '户县', + '612224' => '三原县', + '612225' => '泾阳县', + '612226' => '高陵县', + '612227' => '乾县', + '612228' => '礼泉县', + '612229' => '永寿县', + '612230' => '彬县', + '612231' => '长武县', + '612232' => '旬邑县', + '612233' => '淳化县', + '612300' => '汉中地区', + '612301' => '汉中市', + '612321' => '南郑县', + '612322' => '城固县', + '612323' => '洋县', + '612324' => '西乡县', + '612325' => '勉县', + '612326' => '宁强县', + '612327' => '略阳县', + '612328' => '镇巴县', + '612329' => '留坝县', + '612330' => '佛坪县', + '612400' => '安康地区', + '612401' => '安康市', + '612421' => '安康县', + '612422' => '汉阴县', + '612423' => '石泉县', + '612424' => '宁陕县', + '612425' => '紫阳县', + '612426' => '岚皋县', + '612427' => '平利县', + '612428' => '镇坪县', + '612429' => '旬阳县', + '612430' => '白河县', + '612500' => '商洛地区', + '612501' => '商州市', + '612521' => '商县', + '612522' => '洛南县', + '612523' => '丹凤县', + '612524' => '商南县', + '612525' => '山阳县', + '612526' => '镇安县', + '612527' => '柞水县', + '612600' => '延安地区', + '612601' => '延安市', + '612621' => '延长县', + '612622' => '延川县', + '612623' => '子长县', + '612624' => '安塞县', + '612625' => '志丹县', + '612626' => '吴旗县', + '612627' => '甘泉县', + '612628' => '富县', + '612629' => '洛川县', + '612630' => '宜川县', + '612631' => '黄龙县', + '612632' => '黄陵县', + '612633' => '宜君县', + '612700' => '榆林地区', + '612701' => '榆林市', + '612721' => '榆林县', + '612722' => '神木县', + '612723' => '府谷县', + '612724' => '横山县', + '612725' => '靖边县', + '612726' => '定边县', + '612727' => '绥德县', + '612728' => '米脂县', + '612729' => '佳县', + '612730' => '吴堡县', + '612731' => '清涧县', + '612732' => '子洲县', + '619000' => '省直辖县级行政区划', + '619001' => '兴平市', + '619002' => '韩城市', + '619003' => '华阴市', + '620000' => '甘肃省', + '620100' => '兰州市', + '620101' => '市辖区', + '620102' => '城关区', + '620103' => '七里河区', + '620104' => '西固区', + '620105' => '安宁区', + '620111' => '红古区', + '620112' => '白银区', + '620120' => '市区', + '620121' => '永登县', + '620122' => '皋兰县', + '620123' => '榆中县', + '620200' => '嘉峪关市', + '620201' => '市辖区', + '620300' => '金昌市', + '620301' => '市辖区', + '620302' => '金川区', + '620320' => '市区', + '620321' => '永昌县', + '620400' => '白银市', + '620401' => '市辖区', + '620402' => '白银区', + '620403' => '平川区', + '620421' => '靖远县', + '620422' => '会宁县', + '620423' => '景泰县', + '620500' => '天水市', + '620501' => '市辖区', + '620502' => '秦州区', + '620503' => '麦积区', + '620521' => '清水县', + '620522' => '秦安县', + '620523' => '甘谷县', + '620524' => '武山县', + '620525' => '张家川回族自治县', + '620600' => '武威市', + '620601' => '市辖区', + '620602' => '凉州区', + '620621' => '民勤县', + '620622' => '古浪县', + '620623' => '天祝藏族自治县', + '620700' => '张掖市', + '620701' => '市辖区', + '620702' => '甘州区', + '620721' => '肃南裕固族自治县', + '620722' => '民乐县', + '620723' => '临泽县', + '620724' => '高台县', + '620725' => '山丹县', + '620800' => '平凉市', + '620801' => '市辖区', + '620802' => '崆峒区', + '620821' => '泾川县', + '620822' => '灵台县', + '620823' => '崇信县', + '620824' => '华亭县', + '620825' => '庄浪县', + '620826' => '静宁县', + '620881' => '华亭市', + '620900' => '酒泉市', + '620901' => '市辖区', + '620902' => '肃州区', + '620921' => '金塔县', + '620922' => '瓜州县', + '620923' => '肃北蒙古族自治县', + '620924' => '阿克塞哈萨克族自治县', + '620981' => '玉门市', + '620982' => '敦煌市', + '621000' => '庆阳市', + '621001' => '市辖区', + '621002' => '西峰区', + '621021' => '庆城县', + '621022' => '环县', + '621023' => '华池县', + '621024' => '合水县', + '621025' => '正宁县', + '621026' => '宁县', + '621027' => '镇原县', + '621100' => '定西市', + '621101' => '市辖区', + '621102' => '安定区', + '621121' => '通渭县', + '621122' => '陇西县', + '621123' => '渭源县', + '621124' => '临洮县', + '621125' => '漳县', + '621126' => '岷县', + '621200' => '陇南市', + '621201' => '市辖区', + '621202' => '武都区', + '621221' => '成县', + '621222' => '文县', + '621223' => '宕昌县', + '621224' => '康县', + '621225' => '西和县', + '621226' => '礼县', + '621227' => '徽县', + '621228' => '两当县', + '622100' => '酒泉地区', + '622101' => '玉门市', + '622102' => '酒泉市', + '622103' => '敦煌市', + '622121' => '酒泉县', + '622122' => '敦煌县', + '622123' => '金塔县', + '622124' => '肃北蒙古族自治县', + '622125' => '阿克塞哈萨克族自治县', + '622126' => '安西县', + '622200' => '张掖地区', + '622201' => '张掖市', + '622221' => '张掖县', + '622222' => '肃南裕固族自治县', + '622223' => '民乐县', + '622224' => '临泽县', + '622225' => '高台县', + '622226' => '山丹县', + '622300' => '武威地区', + '622301' => '武威市', + '622321' => '武威县', + '622322' => '民勤县', + '622323' => '古浪县', + '622324' => '景泰县', + '622325' => '永昌县', + '622326' => '天祝藏族自治县', + '622400' => '定西地区', + '622421' => '定西县', + '622422' => '靖远县', + '622423' => '会宁县', + '622424' => '通渭县', + '622425' => '陇西县', + '622426' => '渭源县', + '622427' => '临洮县', + '622428' => '漳县', + '622429' => '岷县', + '622500' => '天水地区', + '622501' => '天水市', + '622521' => '张家川回族自治县', + '622522' => '天水县', + '622523' => '清水县', + '622524' => '徽县', + '622525' => '两当县', + '622526' => '礼县', + '622527' => '西和县', + '622528' => '武山县', + '622529' => '甘谷县', + '622530' => '秦安县', + '622531' => '漳县', + '622600' => '陇南地区', + '622621' => '武都县', + '622622' => '岷县', + '622623' => '宕昌县', + '622624' => '成县', + '622625' => '康县', + '622626' => '文县', + '622627' => '西和县', + '622628' => '礼县', + '622629' => '两当县', + '622630' => '徽县', + '622700' => '平凉地区', + '622701' => '平凉市', + '622721' => '平凉县', + '622722' => '泾川县', + '622723' => '灵台县', + '622724' => '崇信县', + '622725' => '华亭县', + '622726' => '庄浪县', + '622727' => '静宁县', + '622800' => '庆阳地区', + '622801' => '西峰市', + '622821' => '庆阳县', + '622822' => '环县', + '622823' => '华池县', + '622824' => '合水县', + '622825' => '正宁县', + '622826' => '宁县', + '622827' => '镇原县', + '622900' => '临夏回族自治州', + '622901' => '临夏市', + '622921' => '临夏县', + '622922' => '康乐县', + '622923' => '永靖县', + '622924' => '广河县', + '622925' => '和政县', + '622926' => '东乡族自治县', + '622927' => '积石山保安族东乡族撒拉族自治县', + '623000' => '甘南藏族自治州', + '623001' => '合作市', + '623021' => '临潭县', + '623022' => '卓尼县', + '623023' => '舟曲县', + '623024' => '迭部县', + '623025' => '玛曲县', + '623026' => '碌曲县', + '623027' => '夏河县', + '630000' => '青海省', + '630100' => '西宁市', + '630101' => '市辖区', + '630102' => '城东区', + '630103' => '城中区', + '630104' => '城西区', + '630105' => '城北区', + '630106' => '湟中区', + '630111' => '郊区', + '630120' => '市区', + '630121' => '大通回族土族自治县', + '630122' => '湟中县', + '630123' => '湟源县', + '630200' => '海东市', + '630201' => '市辖区', + '630202' => '乐都区', + '630203' => '平安区', + '630221' => '平安县', + '630222' => '民和回族土族自治县', + '630223' => '互助土族自治县', + '630224' => '化隆回族自治县', + '630225' => '循化撒拉族自治县', + '632100' => '海东地区', + '632121' => '平安县', + '632122' => '民和回族土族自治县', + '632123' => '乐都县', + '632124' => '湟中县', + '632125' => '湟源县', + '632126' => '互助土族自治县', + '632127' => '化隆回族自治县', + '632128' => '循化撒拉族自治县', + '632200' => '海北藏族自治州', + '632221' => '门源回族自治县', + '632222' => '祁连县', + '632223' => '海晏县', + '632224' => '刚察县', + '632300' => '黄南藏族自治州', + '632301' => '同仁市', + '632321' => '同仁县', + '632322' => '尖扎县', + '632323' => '泽库县', + '632324' => '河南蒙古族自治县', + '632400' => '直辖行政单位', + '632421' => '河南蒙古族自治县', + '632500' => '海南藏族自治州', + '632521' => '共和县', + '632522' => '同德县', + '632523' => '贵德县', + '632524' => '兴海县', + '632525' => '贵南县', + '632600' => '果洛藏族自治州', + '632621' => '玛沁县', + '632622' => '班玛县', + '632623' => '甘德县', + '632624' => '达日县', + '632625' => '久治县', + '632626' => '玛多县', + '632700' => '玉树藏族自治州', + '632701' => '玉树市', + '632721' => '玉树县', + '632722' => '杂多县', + '632723' => '称多县', + '632724' => '治多县', + '632725' => '囊谦县', + '632726' => '曲麻莱县', + '632800' => '海西蒙古族藏族自治州', + '632801' => '格尔木市', + '632802' => '德令哈市', + '632803' => '茫崖市', + '632821' => '乌兰县', + '632822' => '都兰县', + '632823' => '天峻县', + '632825' => '大柴旦行政委员会', + '640000' => '宁夏回族自治区', + '640100' => '银川市', + '640101' => '市辖区', + '640102' => '城区', + '640103' => '新城区', + '640104' => '兴庆区', + '640105' => '西夏区', + '640106' => '金凤区', + '640111' => '郊区', + '640120' => '市区', + '640121' => '永宁县', + '640122' => '贺兰县', + '640181' => '灵武市', + '640200' => '石嘴山市', + '640201' => '市辖区', + '640202' => '大武口区', + '640203' => '石嘴山区', + '640204' => '石炭井区', + '640205' => '惠农区', + '640211' => '郊区', + '640220' => '市区', + '640221' => '平罗县', + '640222' => '陶乐县', + '640223' => '惠农县', + '640300' => '吴忠市', + '640301' => '市辖区', + '640302' => '利通区', + '640303' => '红寺堡区', + '640321' => '中卫县', + '640322' => '中宁县', + '640323' => '盐池县', + '640324' => '同心县', + '640381' => '青铜峡市', + '640382' => '灵武市', + '640400' => '固原市', + '640401' => '市辖区', + '640402' => '原州区', + '640421' => '海原县', + '640422' => '西吉县', + '640423' => '隆德县', + '640424' => '泾源县', + '640425' => '彭阳县', + '640500' => '中卫市', + '640501' => '市辖区', + '640502' => '沙坡头区', + '640521' => '中宁县', + '640522' => '海原县', + '642100' => '银南地区', + '642101' => '吴忠市', + '642102' => '青铜峡市', + '642103' => '灵武市', + '642121' => '吴忠县', + '642122' => '青铜峡县', + '642123' => '中卫县', + '642124' => '中宁县', + '642125' => '灵武县', + '642126' => '盐池县', + '642127' => '同心县', + '642200' => '固原地区', + '642221' => '固原县', + '642222' => '海原县', + '642223' => '西吉县', + '642224' => '隆德县', + '642225' => '泾源县', + '642226' => '彭阳县', + '650000' => '新疆维吾尔自治区', + '650100' => '乌鲁木齐市', + '650101' => '市辖区', + '650102' => '天山区', + '650103' => '沙依巴克区', + '650104' => '新市区', + '650105' => '水磨沟区', + '650106' => '头屯河区', + '650107' => '达坂城区', + '650108' => '东山区', + '650109' => '米东区', + '650120' => '市区', + '650121' => '乌鲁木齐县', + '650200' => '克拉玛依市', + '650201' => '市辖区', + '650202' => '独山子区', + '650203' => '克拉玛依区', + '650204' => '白碱滩区', + '650205' => '乌尔禾区', + '650300' => '石河子市', + '650400' => '吐鲁番市', + '650401' => '市辖区', + '650402' => '高昌区', + '650421' => '鄯善县', + '650422' => '托克逊县', + '650500' => '哈密市', + '650501' => '市辖区', + '650502' => '伊州区', + '650521' => '巴里坤哈萨克自治县', + '650522' => '伊吾县', + '652100' => '吐鲁番地区', + '652101' => '吐鲁番市', + '652121' => '吐鲁番县', + '652122' => '鄯善县', + '652123' => '托克逊县', + '652200' => '哈密地区', + '652201' => '哈密市', + '652221' => '哈密县', + '652222' => '巴里坤哈萨克自治县', + '652223' => '伊吾县', + '652300' => '昌吉回族自治州', + '652301' => '昌吉市', + '652302' => '阜康市', + '652303' => '米泉市', + '652321' => '昌吉县', + '652322' => '米泉县', + '652323' => '呼图壁县', + '652324' => '玛纳斯县', + '652325' => '奇台县', + '652326' => '阜康县', + '652327' => '吉木萨尔县', + '652328' => '木垒哈萨克自治县', + '652400' => '伊犁哈萨克自治州', + '652401' => '伊宁市', + '652402' => '奎屯市', + '652421' => '伊宁县', + '652422' => '察布查尔锡伯自治县', + '652423' => '霍城县', + '652424' => '巩留县', + '652425' => '新源县', + '652426' => '昭苏县', + '652427' => '特克斯县', + '652428' => '尼勒克县', + '652500' => '塔城地区', + '652521' => '塔城县', + '652522' => '额敏县', + '652523' => '乌苏县', + '652524' => '沙湾县', + '652525' => '托里县', + '652526' => '裕民县', + '652527' => '和布克赛尔蒙古自治县', + '652600' => '阿勒泰地区', + '652621' => '阿勒泰县', + '652622' => '布尔津县', + '652623' => '富蕴县', + '652624' => '福海县', + '652625' => '哈巴河县', + '652626' => '青河县', + '652627' => '吉木乃县', + '652700' => '博尔塔拉蒙古自治州', + '652701' => '博乐市', + '652702' => '阿拉山口市', + '652721' => '博乐县', + '652722' => '精河县', + '652723' => '温泉县', + '652800' => '巴音郭楞蒙古自治州', + '652801' => '库尔勒市', + '652821' => '库尔勒县', + '652822' => '轮台县', + '652823' => '尉犁县', + '652824' => '若羌县', + '652825' => '且末县', + '652826' => '焉耆回族自治县', + '652827' => '和静县', + '652828' => '和硕县', + '652829' => '博湖县', + '652900' => '阿克苏地区', + '652901' => '阿克苏市', + '652902' => '库车市', + '652921' => '阿克苏县', + '652922' => '温宿县', + '652923' => '库车县', + '652924' => '沙雅县', + '652925' => '新和县', + '652926' => '拜城县', + '652927' => '乌什县', + '652928' => '阿瓦提县', + '652929' => '柯坪县', + '653000' => '克孜勒苏柯尔克孜自治州', + '653001' => '阿图什市', + '653021' => '阿图什县', + '653022' => '阿克陶县', + '653023' => '阿合奇县', + '653024' => '乌恰县', + '653100' => '喀什地区', + '653101' => '喀什市', + '653121' => '疏附县', + '653122' => '疏勒县', + '653123' => '英吉沙县', + '653124' => '泽普县', + '653125' => '莎车县', + '653126' => '叶城县', + '653127' => '麦盖提县', + '653128' => '岳普湖县', + '653129' => '伽师县', + '653130' => '巴楚县', + '653131' => '塔什库尔干塔吉克自治县', + '653200' => '和田地区', + '653201' => '和田市', + '653221' => '和田县', + '653222' => '墨玉县', + '653223' => '皮山县', + '653224' => '洛浦县', + '653225' => '策勒县', + '653226' => '于田县', + '653227' => '民丰县', + '654000' => '伊犁哈萨克自治州', + '654001' => '奎屯市', + '654002' => '伊宁市', + '654003' => '奎屯市', + '654004' => '霍尔果斯市', + '654021' => '伊宁县', + '654022' => '察布查尔锡伯自治县', + '654023' => '霍城县', + '654024' => '巩留县', + '654025' => '新源县', + '654026' => '昭苏县', + '654027' => '特克斯县', + '654028' => '尼勒克县', + '654100' => '伊犁地区', + '654101' => '伊宁市', + '654121' => '伊宁县', + '654122' => '察布查尔锡伯自治县', + '654123' => '霍城县', + '654124' => '巩留县', + '654125' => '新源县', + '654126' => '昭苏县', + '654127' => '特克斯县', + '654128' => '尼勒克县', + '654200' => '塔城地区', + '654201' => '塔城市', + '654202' => '乌苏市', + '654203' => '沙湾市', + '654221' => '额敏县', + '654222' => '乌苏县', + '654223' => '沙湾县', + '654224' => '托里县', + '654225' => '裕民县', + '654226' => '和布克赛尔蒙古自治县', + '654300' => '阿勒泰地区', + '654301' => '阿勒泰市', + '654321' => '布尔津县', + '654322' => '富蕴县', + '654323' => '福海县', + '654324' => '哈巴河县', + '654325' => '青河县', + '654326' => '吉木乃县', + '659000' => '自治区直辖县级行政区划', + '659001' => '石河子市', + '659002' => '阿拉尔市', + '659003' => '图木舒克市', + '659004' => '五家渠市', + '659005' => '北屯市', + '659006' => '铁门关市', + '659007' => '双河市', + '659008' => '可克达拉市', + '659009' => '昆玉市', + '659010' => '胡杨河市', + '659011' => '新星市', + '710000' => '台湾省', + '810000' => '香港特别行政区', + '820000' => '澳门特别行政区', + '830000' => '台湾省', +]; \ No newline at end of file diff --git a/plugin/utility/idcard/index.html b/plugin/utility/idcard/index.html new file mode 100644 index 0000000..1d9f2df --- /dev/null +++ b/plugin/utility/idcard/index.html @@ -0,0 +1,92 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ 身份证号码归属地查询 +
+
+ +
+ +
+
+ +
+
+ +
+
+{/block} +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/plugin/utility/image2base64/App.php b/plugin/utility/image2base64/App.php new file mode 100644 index 0000000..b2db08b --- /dev/null +++ b/plugin/utility/image2base64/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/utility/image2base64/index.html b/plugin/utility/image2base64/index.html new file mode 100644 index 0000000..25f9b98 --- /dev/null +++ b/plugin/utility/image2base64/index.html @@ -0,0 +1,124 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ 图片转base64 +
+
+
+
拖拽文件到这里或者点击选择文件 + +
+
+ +
+ +
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+ +
+ +
+
+
+ +
+
+
+
+{/block} +{block name="script"} + + + +{/block} \ No newline at end of file diff --git a/plugin/utility/image_editor/App.php b/plugin/utility/image_editor/App.php new file mode 100644 index 0000000..0910687 --- /dev/null +++ b/plugin/utility/image_editor/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/utility/image_editor/index.html b/plugin/utility/image_editor/index.html new file mode 100644 index 0000000..b5dd864 --- /dev/null +++ b/plugin/utility/image_editor/index.html @@ -0,0 +1,181 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + + + +
+
+
+
+
+ 在线图片编辑 +
+
+
+
+
+
+{/block} +{block name="script"} + + + + + + +{/block} \ No newline at end of file diff --git a/plugin/utility/imghosting/App.php b/plugin/utility/imghosting/App.php new file mode 100644 index 0000000..b52268e --- /dev/null +++ b/plugin/utility/imghosting/App.php @@ -0,0 +1,97 @@ +view(); + } + + public function upload(){ + if(!isset($_FILES['file']))return json(['code'=>-1, 'msg'=>'请选择文件']); + $filepath = $_FILES["file"]["tmp_name"]; + $filename = $_FILES["file"]["name"]; + if($_FILES['file']['error']>0 || $filepath == ""){ + return json(['code'=>-1, 'msg'=>'文件损坏!']); + } + if($_FILES['file']['size']>10*1024*1024){ + return json(['code'=>-1, 'msg'=>'文件最大10M']); + } + $apitype = input('?post.apitype')?input('post.apitype'):'qq'; + + $classname = 'plugin\\utility\\imghosting\\api\\'.$apitype; + if(class_exists($classname)){ + $instance = new $classname(); + try{ + $result = $instance->upload($filepath, $filename); + + Db::name('uploadlog')->insert([ + 'uid' => request()->islogin ? request()->user['id'] : 0, + 'type' => 'image', + 'source' => $apitype, + 'filename' => $filename, + 'fileurl' => $result['url'], + 'ip' => $this->clientip, + 'addtime' => date("Y-m-d H:i:s") + ]); + + return json(['code'=>0, 'msg'=>'success', 'data'=>$result]); + }catch(Exception $e){ + return json(['code'=>-1, 'msg'=>$e->getMessage()]); + } + }else{ + return json(['code'=>-1, 'msg'=>'该上传类型不存在']); + } + } + + public function uploadurl(){ + exit; + $url = input('post.url'); + if(!$url) return json(['code'=>-1, 'msg'=>'no url']); + $apitype = input('?post.apitype')?input('post.apitype'):'qq'; + + $file_data = get_curl($url); + if(!$file_data) return json(['code'=>-1, 'msg'=>'获取图片数据失败']); + $filepath = tempnam(sys_get_temp_dir(), 'IMG'); + file_put_contents($filepath, $file_data); + $filename = time().'.jpg'; + + $classname = 'plugin\\utility\\imghosting\\api\\'.$apitype; + if(class_exists($classname)){ + $instance = new $classname(); + try{ + $result = $instance->upload($filepath, $filename); + unlink($filepath); + + Db::name('uploadlog')->insert([ + 'uid' => request()->islogin ? request()->user['id'] : 0, + 'type' => 'image', + 'source' => $apitype, + 'filename' => $filename, + 'fileurl' => $result['url'], + 'ip' => $this->clientip, + 'addtime' => date("Y-m-d H:i:s") + ]); + + return json(['code'=>0, 'msg'=>'success', 'data'=>$result]); + }catch(Exception $e){ + unlink($filepath); + return json(['code'=>-1, 'msg'=>$e->getMessage()]); + } + }else{ + unlink($filepath); + return json(['code'=>-1, 'msg'=>'该上传类型不存在']); + } + } +} \ No newline at end of file diff --git a/plugin/utility/imghosting/api.php b/plugin/utility/imghosting/api.php new file mode 100644 index 0000000..d9425cc --- /dev/null +++ b/plugin/utility/imghosting/api.php @@ -0,0 +1,8 @@ + $imgdata, + 'Pic-Encoding' => 'base64', + 'Pic-Path' => '/nowater/webim/big/', + 'Pic-Size' => '0*0' + ]; + $data = get_curl($url,json_encode($params),$referer,0,0,0,0,['application/json']); + if(strpos($data, 'n_v2')!==false){ + $imgurl = 'https://pic'.rand(1,8).'.58cdn.com.cn/nowater/webim/big/'.$data; + return ['url'=>$imgurl]; + }else{ + throw new Exception('上传失败!接口错误'); + } + } +} \ No newline at end of file diff --git a/plugin/utility/imghosting/api/dianping.php b/plugin/utility/imghosting/api/dianping.php new file mode 100644 index 0000000..6c070dc --- /dev/null +++ b/plugin/utility/imghosting/api/dianping.php @@ -0,0 +1,64 @@ +setPostFilename($filename); + $param = [ + 'files' => $file, + 'fileName' => $filename, + 'part' => '0', + 'partSize' => '1', + 'fileID' => time().rand(111,999) + ]; + $header = [ + 'CSC-VisitId: '.$this->getvisitid() + ]; + $data = get_curl($url,$param,'https://h5.dianping.com/',0,0,0,0,$header); + $arr = json_decode($data,true); + if(isset($arr['code']) && $arr['code'] == 200){ + $picurl = str_replace('http://','https://',$arr['data']['uploadPath']); + return ['url'=>$picurl]; + }elseif(isset($arr['errMsg'])){ + throw new Exception('上传失败!'.$arr['errMsg']); + }else{ + throw new Exception('上传失败!接口错误'); + } + } + + private function getvisitid(){ + $visitid = cache('dianping_visitid'); + if($visitid) return $visitid; + $url = 'https://kf.dianping.com/csCenter/access/dealOrder_Help_DP_PC'; + $url = $this->get_location_url($url); + if($url){ + $visitid = getSubstr($url, 'visitId=', '&'); + if($visitid){ + cache('dianping_visitid', $visitid, 86400); + return $visitid; + } + } + throw new Exception('上传失败!获取visitId异常'); + } + + private function get_location_url($url){ + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"); + curl_exec($ch); + $final_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); + curl_close($ch); + return $final_url; + } +} \ No newline at end of file diff --git a/plugin/utility/imghosting/api/imgdd.php b/plugin/utility/imghosting/api/imgdd.php new file mode 100644 index 0000000..eb56550 --- /dev/null +++ b/plugin/utility/imghosting/api/imgdd.php @@ -0,0 +1,28 @@ +setPostFilename($filename); + $param = [ + 'image' => $file, + ]; + $data = get_curl($url,$param,$referer); + $arr = json_decode($data,true); + if(isset($arr['url'])){ + return ['url'=>$arr['url']]; + }elseif(isset($arr['message'])){ + throw new Exception('上传失败请重试('.$arr['message'].')'); + }else{ + throw new Exception('上传失败!接口错误'); + } + } +} \ No newline at end of file diff --git a/plugin/utility/imghosting/api/netease.php b/plugin/utility/imghosting/api/netease.php new file mode 100644 index 0000000..95f0add --- /dev/null +++ b/plugin/utility/imghosting/api/netease.php @@ -0,0 +1,28 @@ +setPostFilename($filename); + $param = [ + 'file' => $file, + 'from' => 'neteasecode_mp', + ]; + $data = get_curl($url,$param,$url); + $arr = json_decode($data,true); + if(isset($arr['code']) && $arr['code']==200){ + return ['url'=>str_replace('http://','https://',$arr['data']['url'])]; + }elseif(isset($arr['msg'])){ + throw new Exception('上传失败请重试('.$arr['msg'].')'); + }else{ + throw new Exception('上传失败!接口错误'); + } + } +} \ No newline at end of file diff --git a/plugin/utility/imghosting/api/oppo.php b/plugin/utility/imghosting/api/oppo.php new file mode 100644 index 0000000..5d5bec4 --- /dev/null +++ b/plugin/utility/imghosting/api/oppo.php @@ -0,0 +1,28 @@ +setPostFilename($filename); + $param = [ + 'file' => $file, + 'type' => 'feedback', + ]; + $data = get_curl($url,$param,$url); + $arr = json_decode($data,true); + if(isset($arr['errno']) && $arr['errno']==0){ + return ['url'=>str_replace('store2.heytapimage.com', 'store.heytapimage.com', $arr['data']['url'])]; + }elseif(isset($arr['data']['message'])){ + throw new Exception('上传失败请重试('.$arr['data']['message'].')'); + }else{ + throw new Exception('上传失败!接口错误'); + } + } +} \ No newline at end of file diff --git a/plugin/utility/imghosting/api/pngcm.php b/plugin/utility/imghosting/api/pngcm.php new file mode 100644 index 0000000..3ff1ccb --- /dev/null +++ b/plugin/utility/imghosting/api/pngcm.php @@ -0,0 +1,31 @@ +setPostFilename($filename); + $param = [ + 'name' => $filename, + 'uuid' => 'o_'.Str::random(27), + 'sign' => time(), + 'file' => $file, + ]; + $data = get_curl($url,$param,'https://png.cm/'); + $arr = json_decode($data,true); + if(isset($arr['code']) && $arr['code']==200){ + return ['url'=>$arr['url']]; + }elseif(isset($arr['message'])){ + throw new Exception('上传失败请重试('.$arr['message'].')'); + }else{ + throw new Exception('上传失败!接口错误'); + } + } +} \ No newline at end of file diff --git a/plugin/utility/imghosting/api/vipkid.php b/plugin/utility/imghosting/api/vipkid.php new file mode 100644 index 0000000..eb83dbe --- /dev/null +++ b/plugin/utility/imghosting/api/vipkid.php @@ -0,0 +1,28 @@ +setPostFilename($filename); + $param = [ + 'file' => $file, + 'uploadType' => 'IM' + ]; + $data = get_curl($url,$param,$url,0,0,0,0,['vk-cr-code: kr']); + $arr = json_decode($data,true); + if(isset($arr['code']) && $arr['code']==200){ + return ['url'=>$arr['data']['url']]; + }elseif(isset($arr['msg'])){ + throw new Exception('上传失败请重试('.$arr['msg'].')'); + }else{ + throw new Exception('上传失败!接口错误'); + } + } +} \ No newline at end of file diff --git a/plugin/utility/imghosting/index.html b/plugin/utility/imghosting/index.html new file mode 100644 index 0000000..ac13fe2 --- /dev/null +++ b/plugin/utility/imghosting/index.html @@ -0,0 +1,329 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ 聚合高速图床 +
+
+ +
+
+ + +
+
+
+
+
{{progress}}%
+
+
+
+
点击选择文件/Ctrl+V粘贴/拖拽到此处 + +
+ {if false}{/if} +
+ +
+
+ +
+
+ +
+
    
+
+
+
+
+
+
工具说明
+
+

文件格式支持:jpg,jpeg,png,gif,webp,大小不能超过10M

+

OPPO:图片域名store.heytapimage.com,原图无压缩

+

58同城:图片域名58cdn.com.cn,原图无压缩

+

大众点评:图片域名p1.meituan.net,原图无压缩

+
+
+
+
+{if false}{/if} +
+{/block} +{block name="script"} + + + +{/block} \ No newline at end of file diff --git a/plugin/utility/mobile/App.php b/plugin/utility/mobile/App.php new file mode 100644 index 0000000..5366352 --- /dev/null +++ b/plugin/utility/mobile/App.php @@ -0,0 +1,49 @@ +view(); + } + + public function query(){ + $mobile = input('post.mobile', null, 'trim'); + if(!$mobile) return msg('error','no mobile'); + + if(!is_numeric($mobile) || strlen($mobile)>11){ + return msg('error', '手机号码格式不正确!'); + } + + $result = $this->queryapi($mobile); + if(!$result){ + return msg('error', '查询失败'); + } + $msg['归属地'] = $result['province'].' '.$result['city']; + $msg['运营商'] = $result['sp']; + + return msg('ok','success',$msg); + } + + private function queryapi($mobile){ + $url = 'https://cx.shouji.360.cn/phonearea.php?number='.$mobile; + $data = get_curl($url); + $arr = json_decode($data, true); + if(isset($arr['code']) && $arr['code']==0){ + return $arr['data']; + } + return false; + } + +} \ No newline at end of file diff --git a/plugin/utility/mobile/index.html b/plugin/utility/mobile/index.html new file mode 100644 index 0000000..95c8d76 --- /dev/null +++ b/plugin/utility/mobile/index.html @@ -0,0 +1,93 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ 手机号码归属地查询 +
+
+ +
+ +
+
+ +
+
+ +
+
+{/block} +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/plugin/utility/qrcode/App.php b/plugin/utility/qrcode/App.php new file mode 100644 index 0000000..57982aa --- /dev/null +++ b/plugin/utility/qrcode/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/utility/qrcode/index.html b/plugin/utility/qrcode/index.html new file mode 100644 index 0000000..287032d --- /dev/null +++ b/plugin/utility/qrcode/index.html @@ -0,0 +1,172 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} +
+
+
+
+
+ 二维码生成 +
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+
+ +
+
+ +
+
+
+
+
+ + +
+
+
+
+
+
+
+{/block} +{block name="script"} + + + +{/block} \ No newline at end of file diff --git a/plugin/utility/rand_password/App.php b/plugin/utility/rand_password/App.php new file mode 100644 index 0000000..7501fcf --- /dev/null +++ b/plugin/utility/rand_password/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/utility/rand_password/index.html b/plugin/utility/rand_password/index.html new file mode 100644 index 0000000..65ff53e --- /dev/null +++ b/plugin/utility/rand_password/index.html @@ -0,0 +1,179 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ 随机密码生成 +
+
+ +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+
+
+
+
+
+
工具说明
+
+

可根据自身需要选择生成密码所包含的字符以及密码长度,随机密码一键生成,简单易用,生成安全、随机的密码以保证网络账号的安全。

+
+
+
+
+
+{/block} +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/plugin/utility/short_url/App.php b/plugin/utility/short_url/App.php new file mode 100644 index 0000000..1f3c6c1 --- /dev/null +++ b/plugin/utility/short_url/App.php @@ -0,0 +1,49 @@ +view(); + } + + public function generate(){ + $params = request()->param(); + $validate = Validate::rule([ + 'apitype' => 'require', + 'url' => 'require|url' + ]); + if (!$validate->check($params)) { + return msg('error', $validate->getError()); + } + + $captcha_result = verify_captcha4_slide(); + if($captcha_result !== true){ + return msg('error', $captcha_result); + } + + $classname = 'plugin\\utility\\short_url\\api\\'.$params['apitype']; + if(class_exists($classname)){ + $instance = new $classname(); + try{ + $shortUrl = $instance->create($params['url']); + return json(['code'=>0, 'msg'=>'success', 'data'=>$shortUrl]); + }catch(Exception $e){ + return json(['code'=>-1, 'msg'=>$e->getMessage()]); + } + }else{ + return json(['code'=>-1, 'msg'=>'该接口不存在']); + } + } + +} \ No newline at end of file diff --git a/plugin/utility/short_url/api.php b/plugin/utility/short_url/api.php new file mode 100644 index 0000000..10f1c2a --- /dev/null +++ b/plugin/utility/short_url/api.php @@ -0,0 +1,8 @@ + $url]; + $data = get_curl('https://d.naccl.top/generate', http_build_query($post)); + $json = json_decode($data); + if (!empty($json) && !empty($json->data) && $json->code === 200) { + return $json->data; + } + if (!empty($json->msg)) { + throw new \Exception($json->msg); + } + throw new \Exception('生成失败'); + + } +} \ No newline at end of file diff --git a/plugin/utility/short_url/api/dwz_tax.php b/plugin/utility/short_url/api/dwz_tax.php new file mode 100644 index 0000000..f615046 --- /dev/null +++ b/plugin/utility/short_url/api/dwz_tax.php @@ -0,0 +1,30 @@ + 'k9ah7rn36d1dsu51jpjeboopg4', + 'longurl' => $url, + 'alias' => '', + 'expiry' => '', + 'password' => '', + ]; + $data = get_curl('https://dwz.tax/api/shorten', http_build_query($post), 'https://dwz.tax/'); + $json = json_decode($data); + if (!empty($json) && !empty($json->short)) { + return $json->short; + } + if (!empty($json->msg)) { + throw new \Exception($json->msg); + } + throw new \Exception('生成失败'); + + } +} \ No newline at end of file diff --git a/plugin/utility/short_url/api/gg_gg.php b/plugin/utility/short_url/api/gg_gg.php new file mode 100644 index 0000000..c60d352 --- /dev/null +++ b/plugin/utility/short_url/api/gg_gg.php @@ -0,0 +1,25 @@ + '', + 'use_norefs' => '0', + 'long_url' => $url, + 'app' => 'site', + 'version' => '0.1', + ]; + $data = get_curl('http://gg.gg/create', http_build_query($post), 'http://gg.gg/'); + if (!empty($data)) { + return $data; + } + throw new \Exception('生成失败'); + } +} \ No newline at end of file diff --git a/plugin/utility/short_url/api/is_gd.php b/plugin/utility/short_url/api/is_gd.php new file mode 100644 index 0000000..ce9e07a --- /dev/null +++ b/plugin/utility/short_url/api/is_gd.php @@ -0,0 +1,23 @@ +shorturl)) { + return $json->shorturl; + } + if (!empty($json->errormessage)) { + throw new \Exception($json->errormessage); + } + throw new \Exception('生成失败'); + + } +} \ No newline at end of file diff --git a/plugin/utility/short_url/api/lnks_tools.php b/plugin/utility/short_url/api/lnks_tools.php new file mode 100644 index 0000000..a5194f0 --- /dev/null +++ b/plugin/utility/short_url/api/lnks_tools.php @@ -0,0 +1,22 @@ + $url, + ])); + $json = json_decode($data); + if (!empty($json) && !empty($json->key)) { + return 'https://lnks.tools' . $json->key; + } + throw new \Exception('生成失败'); + + } +} \ No newline at end of file diff --git a/plugin/utility/short_url/api/moelink_org.php b/plugin/utility/short_url/api/moelink_org.php new file mode 100644 index 0000000..13f9ae9 --- /dev/null +++ b/plugin/utility/short_url/api/moelink_org.php @@ -0,0 +1,26 @@ + $url, + ]; + $data = get_curl('https://moelink.org/shorten', http_build_query($post)); + $json = json_decode($data); + if (!empty($json) && !empty($json->data->shorturl) && $json->error === false) { + return $json->data->shorturl; + } + if (!empty($json->message)) { + throw new \Exception($json->message); + } + throw new \Exception('生成失败'); + + } +} \ No newline at end of file diff --git a/plugin/utility/short_url/api/p_sogou_com.php b/plugin/utility/short_url/api/p_sogou_com.php new file mode 100644 index 0000000..36bc9c8 --- /dev/null +++ b/plugin/utility/short_url/api/p_sogou_com.php @@ -0,0 +1,20 @@ + base64_encode($url), + ]; + $data = get_curl('https://suo.yt/short', http_build_query($post)); + $json = json_decode($data); + if (!empty($json) && !empty($json->ShortUrl)) { + return $json->ShortUrl; + } + if (!empty($json->Message)) { + throw new \Exception($json->Message); + } + throw new \Exception('生成失败'); + + } +} \ No newline at end of file diff --git a/plugin/utility/short_url/api/tinyurl_com.php b/plugin/utility/short_url/api/tinyurl_com.php new file mode 100644 index 0000000..db32977 --- /dev/null +++ b/plugin/utility/short_url/api/tinyurl_com.php @@ -0,0 +1,22 @@ + $url, + 'format' => 'json', + ]; + $get = get_curl('https://tinyurl.com/api-create.php', http_build_query($post)); + if (is_valid_url($get)) { + return $get; + } + throw new \Exception('生成失败'); + } +} \ No newline at end of file diff --git a/plugin/utility/short_url/api/zm_cx.php b/plugin/utility/short_url/api/zm_cx.php new file mode 100644 index 0000000..2a97550 --- /dev/null +++ b/plugin/utility/short_url/api/zm_cx.php @@ -0,0 +1,26 @@ + $url, + ]); + $data = get_curl('https://zm.cx/api/set.php', $post); + $json = json_decode($data); + if (!empty($json) && !empty($json->content->url)) { + return $json->content->url; + } + if (!empty($json->content)) { + throw new \Exception($json->content); + } + throw new \Exception('生成失败'); + + } +} \ No newline at end of file diff --git a/plugin/utility/short_url/index.html b/plugin/utility/short_url/index.html new file mode 100644 index 0000000..6a1412b --- /dev/null +++ b/plugin/utility/short_url/index.html @@ -0,0 +1,168 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} +
+
+
+
+
+ 短网址生成 +
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+
+
+
+
+
+
工具说明
+
+

部分短网址接口不稳定,请勿频繁生成

+

短网址还原

+
+
+
+
+
+{/block} +{block name="script"} + + + +{/block} \ No newline at end of file diff --git a/plugin/utility/special_symbols/App.php b/plugin/utility/special_symbols/App.php new file mode 100644 index 0000000..0a2a866 --- /dev/null +++ b/plugin/utility/special_symbols/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/utility/special_symbols/index.html b/plugin/utility/special_symbols/index.html new file mode 100644 index 0000000..aa49f49 --- /dev/null +++ b/plugin/utility/special_symbols/index.html @@ -0,0 +1,1787 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+ 特殊符号大全 +
+
本页汇总了一些可打印的特殊符号,可用于微博聊天等情景使用。 +
+

热门符号

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

爱心符号

+
+ + + + + + + + +
+

手符号

+
+ + + + + + + +
+

国际象棋符号

+
+ + + + + + + + + + + +
+

音符符号

+

+
+ + + + + + +
+

+

天气符号

+
+ ϟ + + + + + + + + + + + + + +
+

文化符号

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

办公室符号

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + © + ® + + § +
+

技术符号

+
+ + + + + + + + + + + + ᴴᴰ
+

星座符号

+
+ + + + + + + + + + + +
+

打钩符号

+
+ ˇ + + + + + + + + + + +
+

扑克符号

+
+ + + + + + + +
+

人的符号

+
+ + + + + + + + + + + + + ü + ت
+

星星符号

+
+ + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

箭头符号

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

方块符号

+
+ ˍ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

三角形符号

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

线段符号

+
+ ` + ˊ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

数学计数符号

+
+ ¼ + ½ + ¾ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ° + ÷ + + + + + + + + + + + π + ± + + + + ×
+

单位符号

+
+ + + + + + + + + + + + + + °
+

上标&下标

+
+ ¹ + ² + ³ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

数字符号

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

拉丁符号

+
+ ą + č + Ĥ + ħ + ĩ + Ň + Ř + Ť + Ŵ + Ž + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + á + â + æ + à + å + ã + ä + ç + é + ê + è + ð + ë + í + î + ì + ï + ñ + ó + ô + ò + ø + õ + ö + ß + þ + ú + û + ù + ü + ý + ÿ + + ʙ + + + + ғ + ɢ + ʜ + ɪ + + + ʟ + + ɴ + + + + ǫ + ʀ + s + + + + + x + ʏ + + 🅰 + 🅱 + 🅾 + 🅿 +
+

中文符号

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

日文符号

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

韩文符号

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

希腊符号

+
+ α + β + χ + δ + ε + η + γ + ι + κ + λ + μ + ν + ω + ο + φ + π + ψ + ρ + σ + τ + θ + υ + ξ + ζ +
+

标点符号

+
+ ˙ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ¿ + + + · + + + +
+

括号符号

+
+ + + + + + + + + + + + + + + + + + + + + + + + + ︿ + + + + + + + + + + + + + + + + + + + + + + +
+

货币符号

+
+ + + + + ฿ + + + + + + + + + + + + + + + + + + + + + + + + ¢ + ¤ + + ƒ + £ + ¥ +
+
+
+
+{/block} +{block name="script"} + +{/block} \ No newline at end of file diff --git a/plugin/utility/sport/App.php b/plugin/utility/sport/App.php new file mode 100644 index 0000000..406f02e --- /dev/null +++ b/plugin/utility/sport/App.php @@ -0,0 +1,55 @@ +view(); + } + + public function login(){ + $username = input('post.username'); + $password = input('post.password'); + if(!$username || !$password) return msg('error','参数不能为空'); + + if((strlen($username)!=11 || !is_numeric($username)) && !filter_var($username,FILTER_VALIDATE_EMAIL)) return msg('error','手机号或邮箱不正确'); + + try{ + $sport = new XiaomiSport(); + $result = $sport->login($username, $password); + }catch(Exception $e){ + return msg('error',$e->getMessage()); + } + + return msg('ok','success',$result); + } + + public function submit(){ + $userid = input('post.userid'); + $token = input('post.token'); + $step = input('post.step'); + if(!$userid || !$token || !$step) return msg('error','参数不能为空'); + if(!is_numeric($step) || $step<0) return msg('error','步数不正确'); + + try{ + $sport = new XiaomiSport(); + $sport->step($userid, $token, $step); + }catch(Exception $e){ + return msg('error',$e->getMessage()); + } + + return msg(); + } + +} \ No newline at end of file diff --git a/plugin/utility/sport/XiaomiSport.php b/plugin/utility/sport/XiaomiSport.php new file mode 100644 index 0000000..f2eddce --- /dev/null +++ b/plugin/utility/sport/XiaomiSport.php @@ -0,0 +1,109 @@ +curl($url, $data); + preg_match("/access=(.*?)&/", $response['header'], $access); + if(isset($access[1])){ + return $access[1]; + }elseif(strpos($response['header'], 'error=')){ + throw new Exception('账号或密码错误!'); + }else{ + throw new Exception('登录token接口请求失败'); + } + } + + public function login($username, $password){ + $access = $this->getAccess($username, $password); + $url = 'https://account.huami.com/v2/client/login'; + $data = [ + 'app_name' => 'com.xiaomi.hm.health', + 'app_version' => '4.6.0', + 'code' => $access, + 'country_code' => 'CN', + 'device_id' => '2C8B4939-0CCD-4E94-8CBA-CB8EA6E613A1', + 'device_model' => 'phone', + 'grant_type' => 'access_token', + 'third_name' => 'huami', + ]; + $response = $this->curl($url, $data); + $arr = json_decode($response['body'], true); + if(!$arr){ + throw new Exception('登录接口请求失败'); + }elseif(isset($arr['result']) && $arr['result']=='ok'){ + $token = $arr['token_info']['app_token']; + $userid = $arr['token_info']['user_id']; + return ['token' => $token, 'userid' => $userid]; + }else{ + throw new Exception('登录失败'.$response['body']); + } + } + + public function step($userid, $token, $step){ + $url = "https://api-mifit-cn.huami.com/v1/data/band_data.json?&t=" . time(); + + $json = '[{"data_hr":"\/\/\/\/\/\/9L\/\/\/\/\/\/\/\/\/\/\/\/Vv\/\/\/\/\/\/\/\/\/\/\/0v\/\/\/\/\/\/\/\/\/\/\/9e\/\/\/\/\/0n\/a\/\/\/S\/\/\/\/\/\/\/\/\/\/\/\/0b\/\/\/\/\/\/\/\/\/\/1FK\/\/\/\/\/\/\/\/\/\/\/\/R\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/9PTFFpaf9L\/\/\/\/\/\/\/\/\/\/\/\/R\/\/\/\/\/\/\/\/\/\/\/\/0j\/\/\/\/\/\/\/\/\/\/\/9K\/\/\/\/\/\/\/\/\/\/\/\/Ov\/\/\/\/\/\/\/\/\/\/\/zf\/\/\/86\/zr\/Ov88\/zf\/Pf\/\/\/0v\/S\/8\/\/\/\/\/\/\/\/\/\/\/\/\/Sf\/\/\/\/\/\/\/\/\/\/\/z3\/\/\/\/\/\/0r\/Ov\/\/\/\/\/\/S\/9L\/zb\/Sf9K\/0v\/Rf9H\/zj\/Sf9K\/0\/\/N\/\/\/\/0D\/Sf83\/zr\/Pf9M\/0v\/Ov9e\/\/\/\/\/\/\/\/\/\/\/\/S\/\/\/\/\/\/\/\/\/\/\/\/zv\/\/z7\/O\/83\/zv\/N\/83\/zr\/N\/86\/z\/\/Nv83\/zn\/Xv84\/zr\/PP84\/zj\/N\/9e\/zr\/N\/89\/03\/P\/89\/z3\/Q\/9N\/0v\/Tv9C\/0H\/Of9D\/zz\/Of88\/z\/\/PP9A\/zr\/N\/86\/zz\/Nv87\/0D\/Ov84\/0v\/O\/84\/zf\/MP83\/zH\/Nv83\/zf\/N\/84\/zf\/Of82\/zf\/OP83\/zb\/Mv81\/zX\/R\/9L\/0v\/O\/9I\/0T\/S\/9A\/zn\/Pf89\/zn\/Nf9K\/07\/N\/83\/zn\/Nv83\/zv\/O\/9A\/0H\/Of8\/\/zj\/PP83\/zj\/S\/87\/zj\/Nv84\/zf\/Of83\/zf\/Of83\/zb\/Nv9L\/zj\/Nv82\/zb\/N\/85\/zf\/N\/9J\/zf\/Nv83\/zj\/Nv84\/0r\/Sv83\/zf\/MP\/\/\/zb\/Mv82\/zb\/Of85\/z7\/Nv8\/\/0r\/S\/85\/0H\/QP9B\/0D\/Nf89\/zj\/Ov83\/zv\/Nv8\/\/0f\/Sv9O\/0ZeXv\/\/\/\/\/\/\/\/\/\/\/1X\/\/\/\/\/\/\/\/\/\/\/9B\/\/\/\/\/\/\/\/\/\/\/\/TP\/\/\/1b\/\/\/\/\/\/0\/\/\/\/\/\/\/\/\/\/\/\/9N\/\/\/\/\/\/\/\/\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+\/v7+","date":"' . date('Y-m-d') . '","data":[{"start":0,"stop":1439,"value":"UA8AUBQAUAwAUBoAUAEAYCcAUBkAUB4AUBgAUCAAUAEAUBkAUAwAYAsAYB8AYB0AYBgAYCoAYBgAYB4AUCcAUBsAUB8AUBwAUBIAYBkAYB8AUBoAUBMAUCEAUCIAYBYAUBwAUCAAUBgAUCAAUBcAYBsAYCUAATIPYD0KECQAYDMAYB0AYAsAYCAAYDwAYCIAYB0AYBcAYCQAYB0AYBAAYCMAYAoAYCIAYCEAYCYAYBsAYBUAYAYAYCIAYCMAUB0AUCAAUBYAUCoAUBEAUC8AUB0AUBYAUDMAUDoAUBkAUC0AUBQAUBwAUA0AUBsAUAoAUCEAUBYAUAwAUB4AUAwAUCcAUCYAUCwKYDUAAUUlEC8IYEMAYEgAYDoAYBAAUAMAUBkAWgAAWgAAWgAAWgAAWgAAUAgAWgAAUBAAUAQAUA4AUA8AUAkAUAIAUAYAUAcAUAIAWgAAUAQAUAkAUAEAUBkAUCUAWgAAUAYAUBEAWgAAUBYAWgAAUAYAWgAAWgAAWgAAWgAAUBcAUAcAWgAAUBUAUAoAUAIAWgAAUAQAUAYAUCgAWgAAUAgAWgAAWgAAUAwAWwAAXCMAUBQAWwAAUAIAWgAAWgAAWgAAWgAAWgAAWgAAWgAAWgAAWREAWQIAUAMAWSEAUDoAUDIAUB8AUCEAUC4AXB4AUA4AWgAAUBIAUA8AUBAAUCUAUCIAUAMAUAEAUAsAUAMAUCwAUBYAWgAAWgAAWgAAWgAAWgAAWgAAUAYAWgAAWgAAWgAAUAYAWwAAWgAAUAYAXAQAUAMAUBsAUBcAUCAAWwAAWgAAWgAAWgAAWgAAUBgAUB4AWgAAUAcAUAwAWQIAWQkAUAEAUAIAWgAAUAoAWgAAUAYAUB0AWgAAWgAAUAkAWgAAWSwAUBIAWgAAUC4AWSYAWgAAUAYAUAoAUAkAUAIAUAcAWgAAUAEAUBEAUBgAUBcAWRYAUA0AWSgAUB4AUDQAUBoAXA4AUA8AUBwAUA8AUA4AUA4AWgAAUAIAUCMAWgAAUCwAUBgAUAYAUAAAUAAAUAAAUAAAUAAAUAAAUAAAUAAAUAAAWwAAUAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAeSEAeQ8AcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcBcAcAAAcAAAcCYOcBUAUAAAUAAAUAAAUAAAUAUAUAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcCgAeQAAcAAAcAAAcAAAcAAAcAAAcAYAcAAAcBgAeQAAcAAAcAAAegAAegAAcAAAcAcAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcCkAeQAAcAcAcAAAcAAAcAwAcAAAcAAAcAIAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcCIAeQAAcAAAcAAAcAAAcAAAcAAAeRwAeQAAWgAAUAAAUAAAUAAAUAAAUAAAcAAAcAAAcBoAeScAeQAAegAAcBkAeQAAUAAAUAAAUAAAUAAAUAAAUAAAcAAAcAAAcAAAcAAAcAAAcAAAegAAegAAcAAAcAAAcBgAeQAAcAAAcAAAcAAAcAAAcAAAcAkAegAAegAAcAcAcAAAcAcAcAAAcAAAcAAAcAAAcA8AeQAAcAAAcAAAeRQAcAwAUAAAUAAAUAAAUAAAUAAAUAAAcAAAcBEAcA0AcAAAWQsAUAAAUAAAUAAAUAAAUAAAcAAAcAoAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAYAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcBYAegAAcAAAcAAAegAAcAcAcAAAcAAAcAAAcAAAcAAAeRkAegAAegAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAEAcAAAcAAAcAAAcAUAcAQAcAAAcBIAeQAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcBsAcAAAcAAAcBcAeQAAUAAAUAAAUAAAUAAAUAAAUBQAcBYAUAAAUAAAUAoAWRYAWTQAWQAAUAAAUAAAUAAAcAAAcAAAcAAAcAAAcAAAcAMAcAAAcAQAcAAAcAAAcAAAcDMAeSIAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcBQAeQwAcAAAcAAAcAAAcAMAcAAAeSoAcA8AcDMAcAYAeQoAcAwAcFQAcEMAeVIAaTYAbBcNYAsAYBIAYAIAYAIAYBUAYCwAYBMAYDYAYCkAYDcAUCoAUCcAUAUAUBAAWgAAYBoAYBcAYCgAUAMAUAYAUBYAUA4AUBgAUAgAUAgAUAsAUAsAUA4AUAMAUAYAUAQAUBIAASsSUDAAUDAAUBAAYAYAUBAAUAUAUCAAUBoAUCAAUBAAUAoAYAIAUAQAUAgAUCcAUAsAUCIAUCUAUAoAUA4AUB8AUBkAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAA","tz":32,"did":"DA932FFFFE8816E7","src":24}],"summary":"{\"v\":6,\"slp\":{\"st\":1628296479,\"ed\":1628296479,\"dp\":0,\"lt\":0,\"wk\":0,\"usrSt\":-1440,\"usrEd\":-1440,\"wc\":0,\"is\":0,\"lb\":0,\"to\":0,\"dt\":0,\"rhr\":0,\"ss\":0},\"stp\":{\"ttl\":' . $step . ',\"dis\":10627,\"cal\":510,\"wk\":41,\"rn\":50,\"runDist\":7654,\"runCal\":397,\"stage\":[{\"start\":327,\"stop\":341,\"mode\":1,\"dis\":481,\"cal\":13,\"step\":680},{\"start\":342,\"stop\":367,\"mode\":3,\"dis\":2295,\"cal\":95,\"step\":2874},{\"start\":368,\"stop\":377,\"mode\":4,\"dis\":1592,\"cal\":88,\"step\":1664},{\"start\":378,\"stop\":386,\"mode\":3,\"dis\":1072,\"cal\":51,\"step\":1245},{\"start\":387,\"stop\":393,\"mode\":4,\"dis\":1036,\"cal\":57,\"step\":1124},{\"start\":394,\"stop\":398,\"mode\":3,\"dis\":488,\"cal\":19,\"step\":607},{\"start\":399,\"stop\":414,\"mode\":4,\"dis\":2220,\"cal\":120,\"step\":2371},{\"start\":415,\"stop\":427,\"mode\":3,\"dis\":1268,\"cal\":59,\"step\":1489},{\"start\":428,\"stop\":433,\"mode\":1,\"dis\":152,\"cal\":4,\"step\":238},{\"start\":434,\"stop\":444,\"mode\":3,\"dis\":2295,\"cal\":95,\"step\":2874},{\"start\":445,\"stop\":455,\"mode\":4,\"dis\":1592,\"cal\":88,\"step\":1664},{\"start\":456,\"stop\":466,\"mode\":3,\"dis\":1072,\"cal\":51,\"step\":1245},{\"start\":467,\"stop\":477,\"mode\":4,\"dis\":1036,\"cal\":57,\"step\":1124},{\"start\":478,\"stop\":488,\"mode\":3,\"dis\":488,\"cal\":19,\"step\":607},{\"start\":489,\"stop\":499,\"mode\":4,\"dis\":2220,\"cal\":120,\"step\":2371},{\"start\":500,\"stop\":511,\"mode\":3,\"dis\":1268,\"cal\":59,\"step\":1489},{\"start\":512,\"stop\":522,\"mode\":1,\"dis\":152,\"cal\":4,\"step\":238}]},\"goal\":8000,\"tz\":\"28800\"}","source":24,"type":0}]'; + + $data = [ + 'data_json' => $json, + 'userid' => $userid, + 'device_type' => '0', + 'last_sync_data_time' => time().'', + 'last_deviceid' => 'DA932FFFFE8816E7', + ]; + + $response = $this->curl($url, $data, $token); + $arr = json_decode($response['body'], true); + if(!$arr){ + throw new Exception('修改步数接口请求失败'); + }elseif(isset($arr['code']) && $arr['code']==1){ + return true; + }else{ + throw new Exception('修改步数失败,'.isset($arr['message'])?$arr['message']:$response['body']); + } + } + + + private function curl($url, $data=null, $app_token=null){ + $ch=curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + $httpheader[] = "Accept: application/json"; + $httpheader[] = "Accept-Language: zh-CN,zh;q=0.8"; + $httpheader[] = "Connection: keep-alive"; + if($app_token){ + $httpheader[] = "apptoken: ".$app_token; + } + curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader); + if($data){ + if(is_array($data)) $data=http_build_query($data); + curl_setopt($ch, CURLOPT_POSTFIELDS, $data); + curl_setopt($ch, CURLOPT_POST,1); + } + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); + curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.12(0x17000c2d) NetType/WIFI Language/zh_CN'); + curl_setopt($ch, CURLOPT_HEADER, 1); + $ret = curl_exec($ch); + $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE); + $header = substr($ret, 0, $headerSize); + $body = substr($ret, $headerSize); + $ret = array(); + $ret['header'] = $header; + $ret['body'] = $body; + curl_close($ch); + return $ret; + } +} \ No newline at end of file diff --git a/plugin/utility/sport/index.html b/plugin/utility/sport/index.html new file mode 100644 index 0000000..6dc253a --- /dev/null +++ b/plugin/utility/sport/index.html @@ -0,0 +1,115 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ 小米运动步数修改 +
+
+
+
Zepp Life账号
+ +
+
+
+
+
+
Zepp Life密码
+ +
+
+ +
+
+
+
+
要修改的步数
+ +
+
+
每日步数最大98000,超过将无法增加
+ + +
+
+
+
+
+
+ 使用方法 +
+

1、在应用商店中下载【Zepp Life】APP,打开软件并选择'没有账号立即注册',一定要新注册,不能用小米手机的账号。

+

2、进入"Zepp Life" APP,依次点击:我的->第三方接入->绑定你想同步数据的平台。

+

3、在当前页面登录后进行修改步数.

+

注:修改步数可能存在延时,提交后等待十分钟左右再查看同步情况。

+

若微信未同步请取消“华米科技”公众号关注,重新到zepp life app中绑定微信。

+
+
+
+
+{/block} +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/plugin/utility/str_hash/App.php b/plugin/utility/str_hash/App.php new file mode 100644 index 0000000..6370cbb --- /dev/null +++ b/plugin/utility/str_hash/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/utility/str_hash/index.html b/plugin/utility/str_hash/index.html new file mode 100644 index 0000000..dcc8a41 --- /dev/null +++ b/plugin/utility/str_hash/index.html @@ -0,0 +1,94 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ 字符串哈希计算 +
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+ + + + + + + + + + + + + +
哈希类型结果值
{{k}}{{v}}
+
+
+
+
+
+{/block} +{block name="script"} + + + +{/block} \ No newline at end of file diff --git a/plugin/utility/text_count/App.php b/plugin/utility/text_count/App.php new file mode 100644 index 0000000..cfcda24 --- /dev/null +++ b/plugin/utility/text_count/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/utility/text_count/index.html b/plugin/utility/text_count/index.html new file mode 100644 index 0000000..ee1f38e --- /dev/null +++ b/plugin/utility/text_count/index.html @@ -0,0 +1,221 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} +
+
+
+
+
+ 在线字数统计与排版 +
+
+
+
+
+ +
+
+
+
+ +
+
+
+ + + +
+
+
+ +
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
总字数 + 0 (个)
总行数 + 0 (行)
中文字数 + 0 (个)
中文标点 + 0 (个)
字母个数 + 0 (个)
单词个数 + 0 (个)
英文标点 + 0 (个)
数字个数 + 0 (个)
数字组 + 0 (个)
+
+
+
+
+
+
+{/block} +{block name="script"} + +{/block} \ No newline at end of file diff --git a/plugin/utility/timestamp/App.php b/plugin/utility/timestamp/App.php new file mode 100644 index 0000000..1c5664a --- /dev/null +++ b/plugin/utility/timestamp/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/utility/timestamp/index.html b/plugin/utility/timestamp/index.html new file mode 100644 index 0000000..580df2c --- /dev/null +++ b/plugin/utility/timestamp/index.html @@ -0,0 +1,176 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ Unix时间戳转换 +
+
+ +
+ +
+ +
+
+ + +
+
+
+ +
+ +
+ + +
+
+
+
+ +
+ +
+ +
+
+
+
+ + + 年 + + 月 + + 日 + + 时 + + 分 + + 秒 + +
+
+
+
+
+
+{/block} +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/plugin/utility/unicloud/App.php b/plugin/utility/unicloud/App.php new file mode 100644 index 0000000..d37c4b7 --- /dev/null +++ b/plugin/utility/unicloud/App.php @@ -0,0 +1,87 @@ +view(); + } + + public function preUpload(){ + if(!input('?post.filename'))exit('{"code":-1,"msg":"请选择文件"}'); + + try{ + $this->getSession(); + } catch (Exception $e) { + return ['code'=>-1, 'msg'=>'获取AccessToken失败:' . $e->getMessage()]; + } + + try{ + $result = $this->unicloud->pre_upload_file(input('post.filename')); + $fileurl = 'https://'.$result['cdnDomain'].'/'.$result['ossPath']; + session('unicloud_filename', input('post.filename')); + session('unicloud_fileurl', $fileurl); + return json(['code'=>0, 'data'=>$result]); + } catch (Exception $e) { + return json(['code'=>-1, 'msg'=>'准备文件上传失败:' . $e->getMessage()]); + } + } + + public function completeUpload(){ + if(!input('?post.id'))exit('{"code":-1,"msg":"no id"}'); + + try{ + $this->getSession(); + } catch (Exception $e) { + return ['code'=>-1, 'msg'=>'获取AccessToken失败:' . $e->getMessage()]; + } + + try{ + $result = $this->unicloud->complete_upload_file(input('post.id')); + + Db::name('uploadlog')->insert([ + 'uid' => request()->islogin ? request()->user['id'] : 0, + 'type' => 'file', + 'source' => 'unicloud', + 'filename' => session('unicloud_filename'), + 'fileurl' => session('unicloud_fileurl'), + 'ip' => $this->clientip, + 'addtime' => date("Y-m-d H:i:s") + ]); + session('unicloud_filename', null); + session('unicloud_fileurl', null); + + return json(['code'=>0, 'data'=>$result]); + } catch (Exception $e) { + return json(['code'=>-1, 'msg'=>'完成文件上传失败:' . $e->getMessage()]); + } + } + + private function getSession(){ + include dirname(__FILE__).'/config.php'; + $this->unicloud = new UnicloudClient($spaceId, $clientSecret); + if(session('access_token') && session('access_token_expire') && session('access_token_expire')>time()){ + $access_token = session('access_token'); + $this->unicloud->set_access_token($access_token); + }else{ + $access_token = $this->unicloud->get_access_token(); + session('access_token', $access_token); + session('access_token_expire', time()+600); + } + return null; + } + +} \ No newline at end of file diff --git a/plugin/utility/unicloud/UnicloudClient.php b/plugin/utility/unicloud/UnicloudClient.php new file mode 100644 index 0000000..214dee8 --- /dev/null +++ b/plugin/utility/unicloud/UnicloudClient.php @@ -0,0 +1,144 @@ +spaceId = $spaceId; + $this->clientSecret = $clientSecret; + } + + public function set_access_token($accessToken){ + $this->accessToken = $accessToken; + } + + // 获取AccessToken + public function get_access_token(){ + if(!empty($this->accessToken)) return $this->accessToken; + $param = [ + 'method' => 'serverless.auth.user.anonymousAuthorize', + 'params' => '{}', + 'spaceId' => $this->spaceId, + 'timestamp' => $this->msec_time() + ]; + $sign = $this->get_sign($param); + $payload = json_encode($param); + $header = [ + 'x-serverless-sign: '.$sign + ]; + $result = $this->curl_post($payload, $header); + $this->accessToken = $result['accessToken']; + return $this->accessToken; + } + + // 获取文件上传信息 + public function pre_upload_file($filename){ + $method = 'serverless.file.resource.generateProximalSign'; + $params = [ + 'env' => 'public', + 'filename' => $filename + ]; + $result = $this->send_request($method, $params); + return $result; + } + + // 完成文件上传 + public function complete_upload_file($id){ + $method = 'serverless.file.resource.report'; + $params = [ + 'id' => $id + ]; + $this->send_request($method, $params); + return true; + } + + // 删除文件(不支持阿里云) + public function delete_file($id){ + $method = 'serverless.file.resource.delete'; + $params = [ + 'id' => $id + ]; + $this->send_request($method, $params); + return true; + } + + private function send_request($method, $params){ + $access_token = $this->get_access_token(); + $postparam = [ + 'method' => $method, + 'params' => json_encode($params), + 'spaceId' => $this->spaceId, + 'timestamp' => $this->msec_time(), + 'token' => $access_token + ]; + $sign = $this->get_sign($postparam); + $payload = json_encode($postparam); + $header = [ + 'x-basement-token: '.$access_token, + 'x-serverless-sign: '.$sign + ]; + $result = $this->curl_post($payload, $header); + return $result; + } + + private function get_sign($param){ + $signPars = ""; + ksort($param); + foreach ($param as $k => $v) { + if ($v != '') { + $signPars .= $k . '=' . $v . '&'; + } + } + $signPars = substr($signPars, 0, -1); + $sign = hash_hmac('md5', $signPars, $this->clientSecret); + return $sign; + } + + private function msec_time() { + list($msec, $sec) = explode(' ', microtime()); + $msectime = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000); + return $msectime; + } + + private function curl_post($payload, $header){ + $url = $this->endpoint.'/client'; + $httpheader[] = "accept: */*"; + $httpheader[] = "accept-encoding: gzip,deflate,sdch"; + $httpheader[] = "accept-language: zh-CN,zh;q=0.8"; + $httpheader[] = "cache-control: no-cache"; + $httpheader[] = "content-type: application/json"; + $httpheader[] = "pragma: no-cache"; + $httpheader[] = "connection: close"; + $httpheader = array_merge($httpheader, $header); + $ch=curl_init($url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); + curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'); + $json=curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + if($httpCode==200){ + $arr=json_decode($json,true); + if($arr['success'] == true){ + return $arr['data']; + }else{ + throw new Exception($arr['error']['message'] ? $arr['error']['message'] : '未知错误'); + } + }else{ + throw new Exception('curl error! httpcode='.$httpCode); + } + } +} diff --git a/plugin/utility/unicloud/config.php b/plugin/utility/unicloud/config.php new file mode 100644 index 0000000..dea8b8a --- /dev/null +++ b/plugin/utility/unicloud/config.php @@ -0,0 +1,5 @@ + +.btn-block { + white-space:normal; +} +.btn-active {background-color: #1c2b46;color: #fff;} + +
+
+
+
+
+ uniCloud文件快传 +
+
+
{{progress}}%
+
+
+
+
点击选择文件/Ctrl+V粘贴/拖拽到此处 + +
+
+ +
+
+ +
+
+ +
+
    
+
+
+
+
+
+
工具说明
+
+

uniCloud文件快传底层使用阿里云OSS存储,支持任何格式的文件,也可以当图床使用。

+

一次只能上传1个文件,文件大小限制100M。一经上传,将无法删除,本站也不会保存。

+
+
+
+
+
+{/block} +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/plugin/utility/unshorturl/App.php b/plugin/utility/unshorturl/App.php new file mode 100644 index 0000000..8df47fd --- /dev/null +++ b/plugin/utility/unshorturl/App.php @@ -0,0 +1,62 @@ +view(); + } + + public function query(){ + $url = input('post.url', null, 'trim'); + if(!$url) return msg('error','no url'); + if(!filter_var($url,FILTER_VALIDATE_URL)){ + return msg('error','输入的URL不符合规范'); + } + + $captcha_result = verify_captcha4(); + if($captcha_result !== true){ + return msg('error', '验证失败,请重新验证'); + } + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + $httpheader[] = "Accept: */*"; + $httpheader[] = "Accept-Language: zh-CN,zh;q=0.8"; + $httpheader[] = "Connection: close"; + curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'); + curl_setopt($ch, CURLOPT_HEADER, true); + curl_setopt($ch, CURLOPT_NOBODY, true); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); + curl_setopt($ch, CURLOPT_TIMEOUT, 5); + $data = curl_exec($ch); + $errno = curl_errno($ch); + if ($errno) { + $msg = '短网址还原失败:' . curl_error($ch); + return msg('error',$msg); + } + $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + if($httpcode >= 300 && $httpcode < 400){ + preg_match("/location:(.*?)\r\n/i", $data, $match); + if(isset($match[1])){ + $longurl = trim($match[1]); + return msg('ok','success',$longurl); + } + } + return msg('error','短网址还原失败('.$httpcode.')'); + } + +} \ No newline at end of file diff --git a/plugin/utility/unshorturl/index.html b/plugin/utility/unshorturl/index.html new file mode 100644 index 0000000..b10d1ca --- /dev/null +++ b/plugin/utility/unshorturl/index.html @@ -0,0 +1,126 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ 短网址还原 +
+
+
+
短网址
+ +
+
+ +
+
短网址还原成功:
+ +
+
+
+
+
+
+{/block} +{block name="script"} + + + +{/block} \ No newline at end of file diff --git a/plugin/utility/videoparse/App.php b/plugin/utility/videoparse/App.php new file mode 100644 index 0000000..01bbdeb --- /dev/null +++ b/plugin/utility/videoparse/App.php @@ -0,0 +1,52 @@ +view(); + } + + public function query(){ + $video_url = input('post.video_url', null, 'trim'); + if(!$video_url) return msg('error','视频链接不能为空'); + + try{ + $result = $this->parse($video_url); + return json(['code'=>0, 'msg'=>'success', 'data'=>$result]); + }catch(\Exception $e){ + return json(['code'=>-1, 'msg'=>$e->getMessage()]); + } + } + + public function parse($url){ + $url = 'https://yuanxiapi.cn/api/jiexi_video/?url='.urlencode($url); + $data = get_curl($url); + $arr = json_decode($data, true); + if(isset($arr['code']) && $arr['code']==200){ + if(isset($arr['video'])){ + $resurl = $arr['video']; + }elseif(isset($arr['images'])){ + $resurl = $arr['images']; + }else{ + throw new \Exception('解析url返回异常'); + } + return [ + 'title' => $arr['desc'], + 'cover' => $arr['cover'], + 'url' => $resurl, + ]; + }else{ + throw new \Exception('视频解析失败'); + } + } + +} \ No newline at end of file diff --git a/plugin/utility/videoparse/index.html b/plugin/utility/videoparse/index.html new file mode 100644 index 0000000..06fb7fc --- /dev/null +++ b/plugin/utility/videoparse/index.html @@ -0,0 +1,145 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} +
+
+
+
+
+ 短视频去水印解析 +
+
+
+
视频链接
+ +
+
+ +
+
+ +
+
+
工具说明
+
+

本工具可解析短视频去除水印的下载链接。
目前已支持的视频平台:抖音、头条、西瓜、快手、微博、皮皮虾、小红书、微视、虎牙、秒拍、全民K歌、Acfun等

+
+
+
+
+
+ +{/block} +{block name="script"} + + + +{/block} \ No newline at end of file diff --git a/plugin/utility/wbimg/App.php b/plugin/utility/wbimg/App.php new file mode 100644 index 0000000..4ef7749 --- /dev/null +++ b/plugin/utility/wbimg/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/utility/wbimg/index.html b/plugin/utility/wbimg/index.html new file mode 100644 index 0000000..9ea6a77 --- /dev/null +++ b/plugin/utility/wbimg/index.html @@ -0,0 +1,105 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ 微博图片反查 +
+
+
+ +
+
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+
+ 工具简介 +
+

该工具可以根据图片地址逆推出发图人,只要你的图片来自微博图床,就算没有水印也能找出是谁发的图。

+

微博图片地址指的是类似这种链接:

+
http://wx1.sinaimg.cn/mw690/0072Vf1pgy1foxkfv4t7bj31hc0u018w.jpg
+

可在图片上 点击右键 -> 复制图片地址 获取

+
+
+
+
+{/block} +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/plugin/utility/zh_convert/App.php b/plugin/utility/zh_convert/App.php new file mode 100644 index 0000000..586a390 --- /dev/null +++ b/plugin/utility/zh_convert/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/utility/zh_convert/index.html b/plugin/utility/zh_convert/index.html new file mode 100644 index 0000000..9e924b3 --- /dev/null +++ b/plugin/utility/zh_convert/index.html @@ -0,0 +1,98 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} +
+
+
+
+
+ 中文简繁体转化 +
+
+ +
+ +
+
+
+ + + + + +
+
+ +
+ +
+
+
+
+
+
+{/block} +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/plugin/web/checkurl/App.php b/plugin/web/checkurl/App.php new file mode 100644 index 0000000..ddaf81f --- /dev/null +++ b/plugin/web/checkurl/App.php @@ -0,0 +1,150 @@ +view(); + } + + public function query(){ + $link = input('post.url', null, 'trim'); + $type = input('post.type'); + if(!$link) return msg('error','no url'); + + $captcha_result = verify_captcha4(); + if($captcha_result !== true){ + return msg('error', '验证失败,请重新验证'); + } + + try{ + if($type == 'wx'){ + $msg = $this->query_wx($link); + }else{ + $msg = $this->query_qq($link); + } + }catch(Exception $e){ + return msg('error', $e->getMessage()); + } + + return msg('ok','success',$msg); + } + + private function query_qq_old($link){ + $url = 'https://cgi.urlsec.qq.com/index.php?m=gwComplainMergeIntoWechat&a=checkBlackStatus&callback=url_query&url='.urlencode($link); + $data=$this->guanjia_curl($url); + $arr = jsonp_decode($data, true); + if(!$arr) throw new Exception('查询接口返回数据解析失败'); + $msg['检测URL'] = $link; + if($arr['reCode']==0 && $arr['data']==1) { + $msg['域名状态'] = '已拦截'; + }elseif($arr['reCode']==-202){ + $msg['域名状态'] = '未拦截'; + }elseif($arr['reCode']==-203){ + $msg['域名状态'] = '仅微信拦截'; + }else{ + $msg['查询失败'] = ''.$arr['data']; + } + + return $msg; + } + + private function query_qq($link){ + $url='https://cgi.urlsec.qq.com/index.php?m=check&a=check&callback=url_query&url='.urlencode($link); + $data=$this->guanjia_curl($url); + $arr = jsonp_decode($data, true); + if(!$arr) throw new Exception('查询接口返回数据解析失败'); + if(isset($arr['reCode']) && $arr['reCode']==0) { + $arr = $arr['data']['results']; + //print_r($arr); + $msg['检测URL'] = $arr['url']; + + if($arr['whitetype']==3||$arr['whitetype']==4){ + $msg['域名状态'] = '白名单'; + }elseif($arr['whitetype']==2){ + $msg['域名状态'] = '已拦截'; + $msg['拦截原因'] = $arr['WordingTitle']; + $msg['拦截详情'] = $arr['Wording']; + }elseif($arr['whitetype']==1){ + if($arr['eviltype']!=0){ + if($arr['eviltype']==2800 || $arr['eviltype']==2804) + $msg['域名状态'] = 'QQ内拦截'; + else + $msg['域名状态'] = '其他拦截('.$arr['eviltype'].')'; + }else{ + $msg['域名状态'] = '未拦截
'; + } + $msg['安全联盟认证'] = ($arr['certify']==1?'是':'否'); + } + if($arr['detect_time']!=0){ + $msg['记录时间'] = date("Y-m-d H:i:s", $arr['detect_time']); + } + if($arr['isDomainICPOk']==1){ + $msg['是否已备案'] = '是'; + $msg['备案主体'] = $arr['Orgnization']; + $msg['备案号'] = $arr['ICPSerial']; + }else{ + $msg['是否已备案'] = '否'; + } + + }else{ + $msg['检测URL'] = $arr['url']; + $msg['查询失败'] = $arr['data']; + } + + return $msg; + } + + private function query_wx($link){ + $url = 'https://mp.weixinbridge.com/mp/wapredirect?url='.urlencode($link); + $data=get_curl($url,0,0,0,1); + $msg['检测URL'] = $link; + if(strpos($data,'https://weixin110.qq.com/')!==false){ + preg_match('/location: (.*?)\r\n/i', $data, $match); + $data = get_curl($match[1]); + preg_match('/var cgiData = (.*?)};/', $data, $match); + if($arr = json_decode($match[1].'}', true)){ + if($arr['type']=='block'){ + $msg['微信拦截状态'] = '已拦截'; + $msg['微信拦截原因'] = $arr['desc']; + }else{ + $msg['微信拦截状态'] = '未拦截'; + } + }else{ + $msg['微信拦截状态'] = '已拦截'; + } + }else{ + $msg['微信拦截状态'] = '未拦截'; + } + + return $msg; + } + + private function guanjia_curl($url) + { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + $httpheader[] = "Accept: application/json"; + $httpheader[] = "Accept-Language: zh-CN,zh;q=0.8"; + $httpheader[] = "Connection: close"; + curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader); + curl_setopt($ch, CURLOPT_REFERER, 'https://urlsec.qq.com/check.html'); + curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + $ret = curl_exec($ch); + curl_close($ch); + return $ret; + } + +} \ No newline at end of file diff --git a/plugin/web/checkurl/index.html b/plugin/web/checkurl/index.html new file mode 100644 index 0000000..352ef30 --- /dev/null +++ b/plugin/web/checkurl/index.html @@ -0,0 +1,129 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} +
+
+
+
+
+ 腾讯域名拦截查询 +
+
+ +
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+{/block} +{block name="script"} + + + +{/block} \ No newline at end of file diff --git a/plugin/web/dns/App.php b/plugin/web/dns/App.php new file mode 100644 index 0000000..9438851 --- /dev/null +++ b/plugin/web/dns/App.php @@ -0,0 +1,90 @@ + [ + 'url' => 'https://dns.alidns.com/resolve', + 'isproxy' => false, + ], + 'dnspod' => [ + 'url' => 'https://doh.pub/resolve', + 'isproxy' => false, + ], + '360' => [ + 'url' => 'https://doh.360.cn/resolve', + 'isproxy' => false, + ], + 'google' => [ + 'url' => 'https://dns.google/resolve', + 'isproxy' => true, + ], + ]; + + const DNS_TYPE = [ + 1 => 'A', + 5 => 'CNAME', + 16 => 'TXT', + 28 => 'AAAA', + 2 => 'NS', + 6 => 'SOA', + ]; + + public function index() + { + return $this->view(); + } + + public function query(){ + $name = input('post.name', null, 'trim'); + $type = input('post.type/d'); + $doh = input('?post.doh') ? input('post.doh', null, 'trim') : 'alidns'; + if(!$name || !$type) return msg('error','no name'); + + try{ + $result = $this->doh_resolve($doh, $type, $name); + $list = []; + foreach($result as $row){ + $row['typename'] = isset(self::DNS_TYPE[$row['type']]) ? self::DNS_TYPE[$row['type']] : $row['type']; + $list[] = $row; + } + }catch(Exception $e){ + return msg('error', $e->getMessage()); + } + + + return msg('ok','success',$list); + } + + + private function doh_resolve($doh, $type, $name){ + if(!array_key_exists($doh, self::DOH_API)) throw new Exception('不存在该DNS服务器'); + $url = self::DOH_API[$doh]['url'].'?name='.urlencode($name).'&type='.$type; + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + $data = curl_exec($ch); + curl_close($ch); + $arr = json_decode($data, true); + if(!$arr){ + throw new Exception('DOH接口查询失败'); + }else{ + if(isset($arr['Answer'])){ + return $arr['Answer']; + }else{ + return []; + } + } + } +} \ No newline at end of file diff --git a/plugin/web/dns/index.html b/plugin/web/dns/index.html new file mode 100644 index 0000000..8a9483a --- /dev/null +++ b/plugin/web/dns/index.html @@ -0,0 +1,170 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ 域名DNS查询 +
+
+
+
+
+ 域名 +
+ +
+
+
+
+
+
+
+ 解析类型 +
+ +
+
+
+
+
+
+
+ DNS服务器 +
+ +
+ +
+
+
+
+ +
+
+ +
+
+{/block} +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/plugin/web/favicon/App.php b/plugin/web/favicon/App.php new file mode 100644 index 0000000..d4fc252 --- /dev/null +++ b/plugin/web/favicon/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/web/favicon/index.html b/plugin/web/favicon/index.html new file mode 100644 index 0000000..e88a7d8 --- /dev/null +++ b/plugin/web/favicon/index.html @@ -0,0 +1,72 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} +
+
+
+
+
+ 网站Favicon获取 +
+
+ +
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+
+
说明
+
+

Favicon获取接口:

+

https://favicon.cccyun.cc/要获取的网址

+

例如:

+

https://favicon.cccyun.cc/http://tool.cccyun.cc/

+

注:接口有来源校验,空来源将被禁止访问

+

如果网站变更了favicon,可以点击清除缓存,然后点获取,在跳转后的页面按Ctrl+F5即可显示最新的图标

+
+
+
+
+
+{/block} +{block name="script"} + +{/block} \ No newline at end of file diff --git a/plugin/web/http/App.php b/plugin/web/http/App.php new file mode 100644 index 0000000..c057665 --- /dev/null +++ b/plugin/web/http/App.php @@ -0,0 +1,52 @@ +getlocation($ip); + $location = ''; + if($arr){ + $location = $arr['province'].$arr['city'].' '.$arr['area']; + } + + $cookie = ''; + foreach($_COOKIE as $cookie_key=>$cookie_value){ + if($cookie_key == 'admin_token' || $cookie_key == 'user_token' || $cookie_key == 'PHPSESSID') continue; + $cookie .= $cookie_key.'='.$cookie_value.'; '; + } + $_SERVER['HTTP_COOKIE'] = $cookie; + + $line = [''.$_SERVER['REQUEST_METHOD'].' '.$_SERVER['REQUEST_URI'].' '.$_SERVER['SERVER_PROTOCOL']]; + + foreach ($_SERVER as $name => $value) + { + if (substr($name, 0, 5) == 'HTTP_') + { + $name = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5))))); + $line[] = ''.$name.': '.$value; + } + } + + if($_SERVER['REQUEST_METHOD'] == 'POST'){ + $line[] = ''; + $line[] = file_get_contents('php://input'); + } + + View::assign('ip', $ip); + View::assign('location', $location); + View::assign('line', $line); + return $this->view(); + } +} \ No newline at end of file diff --git a/plugin/web/http/index.html b/plugin/web/http/index.html new file mode 100644 index 0000000..f89064a --- /dev/null +++ b/plugin/web/http/index.html @@ -0,0 +1,25 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} +
+
+
+
+
+ 查看HTTP请求 +
+ IP地址:{$ip}({$location}) +
HTTP请求行: +
+ {volist name="line" id="vo"} + {$vo|raw}
+ {/volist} +
+
+
+
+
+{/block} +{block name="script"} + +{/block} \ No newline at end of file diff --git a/plugin/web/http_status/App.php b/plugin/web/http_status/App.php new file mode 100644 index 0000000..c471571 --- /dev/null +++ b/plugin/web/http_status/App.php @@ -0,0 +1,67 @@ +view(); + } + + public function query(){ + $url = input('post.url', null, 'trim'); + if(!$url) return msg('error','no url'); + if(!filter_var($url,FILTER_VALIDATE_URL)){ + return msg('error','输入的URL不符合规范'); + } + + $captcha_result = verify_captcha4(); + if($captcha_result !== true){ + return msg('error', '验证失败,请重新验证'); + } + + $url_arr = parse_url($url); + $ip = gethostbyname($url_arr['host']); + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + $httpheader[] = "Accept: */*"; + $httpheader[] = "Accept-Language: zh-CN,zh;q=0.8"; + $httpheader[] = "Connection: close"; + curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'); + curl_setopt($ch, CURLOPT_HEADER, true); + curl_setopt($ch, CURLOPT_NOBODY, true); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); + curl_setopt($ch, CURLOPT_TIMEOUT, 5); + $data = curl_exec($ch); + $errno = curl_errno($ch); + if ($errno) { + $msg = 'Curl error: ' . curl_error($ch); + return msg('error',$msg); + } + $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + $header = explode("\r\n", trim($data)); + + $msg['ip'] = $ip; + $msg['code'] = $httpcode; + $msg['head'] = implode('
', $header); + + return msg('ok','success',$msg); + } + +} \ No newline at end of file diff --git a/plugin/web/http_status/index.html b/plugin/web/http_status/index.html new file mode 100644 index 0000000..65ff8c7 --- /dev/null +++ b/plugin/web/http_status/index.html @@ -0,0 +1,144 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ HTTP状态查询 +
+
+ +
+ +
+
+ +
+
+ +
+
+
简介
+
+

HTTP状态码(HTTP Status Code)

+

一些常见的状态码为:200 - 服务器成功返回网页 404 - 请求的网页不存在 503 - 服务不可用

+

所有状态解释:点击查看

+
+
+
+
+
+{/block} +{block name="script"} + + + +{/block} \ No newline at end of file diff --git a/plugin/web/icp/App.php b/plugin/web/icp/App.php new file mode 100644 index 0000000..2152f2e --- /dev/null +++ b/plugin/web/icp/App.php @@ -0,0 +1,151 @@ +view(); + } + + public function query(){ + $domain = input('post.domain', null, 'trim'); + if(!$domain) return msg('error','no domain'); + if(strpos($domain,'.') && !checkdomain($domain)){ + return msg('error', '域名格式不正确!'); + } + + $captcha_result = verify_captcha4(); + if($captcha_result !== true){ + return msg('error', '验证失败,请重新验证'); + } + + $cache = Db::name('querycache')->where('type', 'icplist')->where('key|subkey', $domain)->find(); + if($cache && time() - strtotime($cache['uptime']) <= self::CACHE_TIME){ + $array = json_decode($cache['content'], true); + $data = Db::name('querycache')->where('type', 'icpitem')->whereIn('id', implode(',',$array['list']))->select(); + $list = []; + foreach($data as $row){ + $list[] = json_decode($row['content'], true); + } + return msg('ok','success',['total'=>$array['total'], 'list'=>$list]); + } + + $cache = Db::name('querycache')->where('type', 'icpitem')->where('key|subkey', $domain)->find(); + if($cache && time() - strtotime($cache['uptime']) <= self::CACHE_TIME){ + $array = json_decode($cache['content'], true); + return msg('ok','success',['total'=>1, 'list'=>[$array]]); + } + + try{ + $result = $this->execapi($domain); + }catch(Exception $e){ + return msg('error', $e->getMessage()); + } + + if($result['total'] > 1 && count($result['data']) > 1){ + $i = 0; + foreach($result['data'] as $row){ + $id = Db::name('querycache')->duplicate([ + 'subkey' => $row['webLicence'], + 'content' => json_encode($row), + 'uptime' => date('Y-m-d H:i:s') + ])->insertGetId([ + 'type' => 'icpitem', + 'key' => $row['domain'], + 'subkey' => $row['webLicence'], + 'content' => json_encode($row), + 'uptime' => date('Y-m-d H:i:s') + ]); + $result['data'][$i++]['id'] = $id; + $ids[] = $id; + } + Db::name('querycache')->duplicate([ + 'subkey' => $result['data'][0]['mainLicence'], + 'content' => json_encode(['total'=>$result['total'], 'list'=>$ids]), + 'uptime' => date('Y-m-d H:i:s') + ])->insert([ + 'type' => 'icplist', + 'key' => $result['data'][0]['unitName'], + 'subkey' => $result['data'][0]['mainLicence'], + 'content' => json_encode(['total'=>$result['total'], 'list'=>$ids]), + 'uptime' => date('Y-m-d H:i:s') + ]); + }elseif($result['total'] == 1 && count($result['data']) > 0){ + $id = Db::name('querycache')->duplicate([ + 'subkey' => $result['data'][0]['webLicence'], + 'content' => json_encode($result['data'][0]), + 'uptime' => date('Y-m-d H:i:s') + ])->insertGetId([ + 'type' => 'icpitem', + 'key' => $result['data'][0]['domain'], + 'subkey' => $result['data'][0]['webLicence'], + 'content' => json_encode($result['data'][0]), + 'uptime' => date('Y-m-d H:i:s') + ]); + $result['data'][0]['id'] = $id; + } + + return msg('ok','success',['total'=>$result['total'], 'list'=>$result['data']]); + } + + public function item(){ + $id = input('post.id'); + if(!$id) return msg('error','no id'); + $cache = Db::name('querycache')->where('id', $id)->find(); + if($cache){ + $array = json_decode($cache['content'], true); + return msg('ok','success',['total'=>1, 'list'=>[$array]]); + }else{ + return msg('ok','success',['total'=>0, 'list'=>[]]); + } + } + + private function execapi($domain){ + $timeStamp = time(); + $authKey = md5("testtest" . $timeStamp); + $referer = 'https://beian.miit.gov.cn/'; + $headers = ['Origin: https://beian.miit.gov.cn']; + $url = 'https://hlwicpfwc.miit.gov.cn/icpproject_query/api/auth'; + $post = 'authKey='.$authKey.'&timeStamp='.$timeStamp; + $response = get_curl($url, $post, $referer, 0, 0, 0, 0, $headers); + $arr = json_decode($response, true); + if(isset($arr['code']) && $arr['code']==200){ + $token = $arr['params']['bussiness']; + + $url = 'https://hlwicpfwc.miit.gov.cn/icpproject_query/api/icpAbbreviateInfo/queryByCondition'; + $post = json_encode(['pageNum'=>'','pageSize'=>'','unitName'=>$domain,'serviceType'=>1]); + $headers[] = 'Content-Type: application/json; charset=UTF-8'; + $headers[] = 'token: '.$token; + $response = get_curl($url, $post, $referer, 0, 0, 0, 0, $headers); + $arr = json_decode($response, true); + if(isset($arr['code']) && $arr['code']==200){ + $list = []; + foreach($arr['params']['list'] as $row){ + $list[] = ['domain'=>$row['domain'], 'mainLicence'=>$row['mainLicence'], 'webLicence'=>$row['serviceLicence'], 'unitName'=>$row['unitName'], 'unitType'=>$row['natureName'], 'updateTime'=>$row['updateRecordTime'], 'limitAccess'=>$row['limitAccess'], 'contentTypeName'=>$row['contentTypeName']]; + } + return ['code'=>0, 'total'=>$arr['params']['total'], 'data'=>$list]; + }elseif(isset($arr['msg'])){ + throw new Exception($arr['msg']); + }else{ + throw new Exception('查询接口(query)请求失败'); + } + + }elseif(isset($arr['msg'])){ + throw new Exception($arr['msg']); + }else{ + throw new Exception('查询接口(auth)请求失败'); + } + } +} \ No newline at end of file diff --git a/plugin/web/icp/index.html b/plugin/web/icp/index.html new file mode 100644 index 0000000..b656a88 --- /dev/null +++ b/plugin/web/icp/index.html @@ -0,0 +1,200 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ ICP备案查询 +
+
+ +
+ +
+
+ +
+
+ +
+
+
简介
+
+

支持输入域名、网站备案号、主体备案号、单位名称(个人姓名、企业名称)进行查询

+

此ICP查询工具直接对接工信部官网,非第三方接口。查询源码下载,请勿对本站进行恶意抓取

+
+
+
+
+
+{/block} +{block name="script"} + + + +{/block} \ No newline at end of file diff --git a/plugin/web/icp/python/cmd.txt b/plugin/web/icp/python/cmd.txt new file mode 100644 index 0000000..94dc4f6 --- /dev/null +++ b/plugin/web/icp/python/cmd.txt @@ -0,0 +1,12 @@ +yum -y install python3 +yum -y install mesa-libGL + +python3 -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip +pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple + +pip3 install opencv-python==4.3.0.38 +pip3 install requests +pip3 install flask +pip3 install gevent + +nohup python3 ./server.py >> ./server.log 2>&1 & diff --git a/plugin/web/icp/python/icp.py b/plugin/web/icp/python/icp.py new file mode 100644 index 0000000..f81b587 --- /dev/null +++ b/plugin/web/icp/python/icp.py @@ -0,0 +1,165 @@ +# -*- coding: utf-8 -*- +import requests,hashlib,time,base64,cv2,os +def icpquery(info): + if(info == None or len(info) == 0): + return {'code':-1,'msg':'no domain'} + info_data = { + 'pageNum':'', + 'pageSize':'', + 'unitName':info, + 'serviceType':1 + } + + #构造AuthKey + timeStamp = int(round(time.time()*1000)) + authSecret = 'testtest' + str(timeStamp) + authKey = hashlib.md5(authSecret.encode(encoding='UTF-8')).hexdigest() + #获取Cookie + cookie_headers = { + 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', + 'accept-encoding': 'gzip, deflate, br', + 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', + 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36 Edg/90.0.818.42' + } + cookie = requests.utils.dict_from_cookiejar(requests.get('https://beian.miit.gov.cn/',headers=cookie_headers,verify=False).cookies)['__jsluid_s'] + #请求获取Token + t_url = 'https://hlwicpfwc.miit.gov.cn/icpproject_query/api/auth' + t_headers = { + 'Host': 'hlwicpfwc.miit.gov.cn', + 'Connection': 'keep-alive', + 'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="90", "Microsoft Edge";v="90"', + 'Accept': '*/*', + 'DNT': '1', + 'sec-ch-ua-mobile': '?0', + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36 Edg/90.0.818.46', + 'Origin': 'https://beian.miit.gov.cn', + 'Sec-Fetch-Site': 'same-site', + 'Sec-Fetch-Mode': 'cors', + 'Sec-Fetch-Dest': 'empty', + 'Referer': 'https://beian.miit.gov.cn/', + 'Accept-Encoding': 'gzip, deflate, br', + 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', + 'Cookie': '__jsluid_s=' + cookie + } + data = { + 'authKey': authKey, + 'timeStamp': timeStamp + } + t_response = requests.post(t_url,data=data,headers=t_headers,verify=False) + try: + get_token = t_response.json()['params']['bussiness'] + except: + return {'code':-1,'msg':'请求被禁止,请稍后或更换头部与IP后再试('+t_response.status_code+')'} + + #获取验证图像、UUID + p_url = 'https://hlwicpfwc.miit.gov.cn/icpproject_query/api/image/getCheckImage' + p_headers = { + 'Host': 'hlwicpfwc.miit.gov.cn', + 'Connection': 'keep-alive', + 'Content-Length': '0', + 'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="90", "Microsoft Edge";v="90"', + 'Accept': 'application/json, text/plain, */*', + 'DNT': '1', + 'sec-ch-ua-mobile': '?0', + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36 Edg/90.0.818.46', + 'token': get_token, + 'Origin': 'https://beian.miit.gov.cn', + 'Sec-Fetch-Site': 'same-site', + 'Sec-Fetch-Mode': 'cors', + 'Sec-Fetch-Dest': 'empty', + 'Referer': 'https://beian.miit.gov.cn/', + 'Accept-Encoding': 'gzip, deflate, br', + 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', + 'Cookie': '__jsluid_s=' + cookie + } + p_request = requests.post(p_url,data='',headers=p_headers,verify=False) + try: + p_uuid = p_request.json()['params']['uuid'] + big_image = p_request.json()['params']['bigImage'] + small_image = p_request.json()['params']['smallImage'] + except KeyError: + return {'code':-1,'msg':'获取验证图像失败,请重试('+p_request.status_code+')'} + + #解码图片,写入并计算图片缺口位置 + with open('bigImage.jpg','wb') as f: + f.write(base64.b64decode(big_image)) + f.close() + with open('smallImage.jpg','wb') as f: + f.write(base64.b64decode(small_image)) + f.close() + background_image = cv2.imread('bigImage.jpg',cv2.COLOR_GRAY2RGB) + fill_image = cv2.imread('smallImage.jpg',cv2.COLOR_GRAY2RGB) + background_image_canny = cv2.Canny(background_image, 100, 200) + fill_image_canny = cv2.Canny(fill_image, 100, 300) + position_match = cv2.matchTemplate(background_image, fill_image, cv2.TM_CCOEFF_NORMED) + min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(position_match) + position = max_loc + mouse_length = position[0]+1 + os.remove('bigImage.jpg') + os.remove('smallImage.jpg') + + #通过拼图验证,获取sign + check_url = 'https://hlwicpfwc.miit.gov.cn/icpproject_query/api/image/checkImage' + check_headers = { + 'Host': 'hlwicpfwc.miit.gov.cn', + 'Accept': 'application/json, text/plain, */*', + 'Connection': 'keep-alive', + 'Content-Length': '60', + 'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="90", "Microsoft Edge";v="90"', + 'DNT': '1', + 'sec-ch-ua-mobile': '?0', + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36 Edg/90.0.818.42', + 'token': get_token, + 'Content-Type': 'application/json', + 'Origin': 'https://beian.miit.gov.cn', + 'Sec-Fetch-Site': 'same-site', + 'Sec-Fetch-Mode': 'cors', + 'Sec-Fetch-Dest': 'empty', + 'Referer': 'https://beian.miit.gov.cn/', + 'Accept-Encoding': 'gzip, deflate, br', + 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', + 'Cookie': '__jsluid_s=' + cookie + } + check_data = { + 'key':p_uuid, + 'value':mouse_length + } + check_request = requests.post(check_url,json=check_data,headers=check_headers,verify=False) + try: + sign = check_request.json()['params'] + except Exception: + return {'code':-1,'msg':'校验图片信息失败,请重试('+check_request.status_code+')'} + + + #获取备案信息 + info_url = 'https://hlwicpfwc.miit.gov.cn/icpproject_query/api/icpAbbreviateInfo/queryByCondition' + info_headers = { + 'Host': 'hlwicpfwc.miit.gov.cn', + 'Connection': 'keep-alive', + 'Content-Length': '78', + 'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="90", "Microsoft Edge";v="90"', + 'DNT': '1', + 'sec-ch-ua-mobile': '?0', + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36 Edg/90.0.818.42', + 'Content-Type': 'application/json', + 'Accept': 'application/json, text/plain, */*', + 'uuid': p_uuid, + 'token': get_token, + 'sign': sign, + 'Origin': 'https://beian.miit.gov.cn', + 'Sec-Fetch-Site': 'same-site', + 'Sec-Fetch-Mode': 'cors', + 'Sec-Fetch-Dest': 'empty', + 'Referer': 'https://beian.miit.gov.cn/', + 'Accept-Encoding': 'gzip, deflate, br', + 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', + 'Cookie': '__jsluid_s=' + cookie + } + info_request = requests.post(info_url,json=info_data,headers=info_headers,verify=False) + domain_total = info_request.json()['params']['total'] + result_list = [] + + for info_base in info_request.json()['params']['list']: + result_list.append({'domain':info_base['domain'], 'mainLicence':info_base['mainLicence'], 'webLicence':info_base['serviceLicence'], 'unitName':info_base['unitName'], 'unitType':info_base['natureName'], 'updateTime':info_base['updateRecordTime'], 'limitAccess':info_base['limitAccess'], 'contentTypeName':info_base['contentTypeName']}) + + return {'code':0,'msg':'success','data':result_list, 'total':domain_total} diff --git a/plugin/web/icp/python/server.py b/plugin/web/icp/python/server.py new file mode 100644 index 0000000..8980ad2 --- /dev/null +++ b/plugin/web/icp/python/server.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +import icp,json,flask + +HOST='127.0.0.1' +PORT=9088 + +app = flask.Flask(__name__) +json_header = {'Content-Type':'application/json; charset=utf-8'} + +@app.route('/',methods=['GET']) +def home(): + domain = flask.request.args.get('domain') + result = icp.icpquery(domain) + return flask.Response(json.dumps(result),headers=json_header) + +@app.errorhandler(404) +def notfound(e): + errorStr = ''' +404 Not Found + +

404 Not Found

+
server
+ +''' + headers = { + "Content-Type":"text/html" + } + return flask.Response(errorStr,status=404,headers=headers) + +if __name__ == '__main__': + from gevent.pywsgi import WSGIServer + http_server = WSGIServer((HOST, PORT), app) + http_server.serve_forever() + #app.run(port=PORT,host=HOST) diff --git a/plugin/web/ip/App.php b/plugin/web/ip/App.php new file mode 100644 index 0000000..eff8bcd --- /dev/null +++ b/plugin/web/ip/App.php @@ -0,0 +1,97 @@ +view(); + } + + public function query(){ + $ip = input('post.ip', null, 'trim'); + $apitype = input('?post.apitype')?input('post.apitype'):'pconline'; + if(!$ip || !$apitype) return msg('error','no ip'); + if(is_numeric($ip)) $ip = long2ip($ip); + if(filter_var($ip, FILTER_VALIDATE_IP)){ + $type = 'ip'; + }elseif(checkdomain($ip)){ + $type = 'domain'; + }else{ + return msg('error', 'IP或域名格式不正确!'); + } + + $captcha_result = verify_captcha4(); + if($captcha_result !== true){ + return msg('error', '验证失败,请重新验证'); + } + + if($type == 'domain'){ + $ip = gethostbyname($ip); + if(!$ip || !filter_var($ip, FILTER_VALIDATE_IP)){ + return msg('error', '未查询到该域名的解析记录'); + } + } + $ipnum = bindec(decbin(ip2long($ip))); + + if(self::CACHE_TIME > 0){ + $cache = Db::name('querycache')->where('type', 'ip')->where('key', $apitype.'-'.$ip)->find(); + if($cache && time() - strtotime($cache['uptime']) <= self::CACHE_TIME){ + $array = json_decode($cache['content'], true); + return msg('ok','success',['data'=>$array, 'ip'=>$ip, 'ipnum'=>$ipnum, 'type'=>$type]); + } + } + + + $classname = 'plugin\\web\\ip\\api\\'.$apitype; + if(class_exists($classname)){ + $instance = new $classname(); + try{ + $result = $instance->query($ip); + }catch(Exception $e){ + return msg('error', $e->getMessage()); + } + }else{ + return msg('error', '该查询接口不存在'); + } + + if(self::CACHE_TIME > 0 && $apitype != 'chunzhen' && $apitype != 'ip2regoin'){ + Db::name('querycache')->duplicate([ + 'content' => json_encode($result), + 'uptime' => date('Y-m-d H:i:s') + ])->insertGetId([ + 'type' => 'ip', + 'key' => $apitype.'-'.$ip, + 'content' => json_encode($result), + 'uptime' => date('Y-m-d H:i:s') + ]); + } + + return msg('ok','success',['data'=>$result, 'ip'=>$ip, 'ipnum'=>$ipnum, 'type'=>$type]); + } + + public function item(){ + $id = input('post.id'); + if(!$id) return msg('error','no id'); + $cache = Db::name('querycache')->where('id', $id)->find(); + if($cache){ + $array = json_decode($cache['content'], true); + return msg('ok','success',$array); + }else{ + return msg('error','记录不存在'); + } + } +} \ No newline at end of file diff --git a/plugin/web/ip/api.php b/plugin/web/ip/api.php new file mode 100644 index 0000000..c89bf8e --- /dev/null +++ b/plugin/web/ip/api.php @@ -0,0 +1,8 @@ +0) { + return ['IP所在地'=>$arr['data'][0]['location']]; + }else{ + throw new Exception('接口查询失败,返回结果错误'); + } + } +} \ No newline at end of file diff --git a/plugin/web/ip/api/baota.php b/plugin/web/ip/api/baota.php new file mode 100644 index 0000000..8ae96c4 --- /dev/null +++ b/plugin/web/ip/api/baota.php @@ -0,0 +1,23 @@ +$arr[$ip]['country'].''.$arr[$ip]['province'].''.$arr[$ip]['city'].''.$arr[$ip]['region'], 'ISP运营商'=>$arr[$ip]['carrier'], '经纬度'=>$arr[$ip]['longitude'].','.$arr[$ip]['latitude']]; + }else{ + throw new Exception('接口查询失败,返回结果错误'); + } + } +} \ No newline at end of file diff --git a/plugin/web/ip/api/chunzhen.php b/plugin/web/ip/api/chunzhen.php new file mode 100644 index 0000000..59b7e29 --- /dev/null +++ b/plugin/web/ip/api/chunzhen.php @@ -0,0 +1,22 @@ +getlocation($ip); + if($arr){ + return ['IP所在地'=>$arr['province'].$arr['city'], '运营商'=>$arr['area']]; + }else{ + throw new Exception('查无此IP数据'); + } + } +} \ No newline at end of file diff --git a/plugin/web/ip/api/ip138.php b/plugin/web/ip/api/ip138.php new file mode 100644 index 0000000..bba5e09 --- /dev/null +++ b/plugin/web/ip/api/ip138.php @@ -0,0 +1,68 @@ +query_ipv6($ip); + } + //return $this->query_chinaz($ip); + $url = 'https://m.ip138.com/iplookup.asp?ip='.$ip.'&action=2'; + $data = get_curl($url); + preg_match('!ASN归属地(.*?)!', $data, $match); + if (isset($match[1])) { + return ['IP所在地'=>$match[1]]; + }else{ + throw new Exception('接口查询失败,返回结果错误'); + } + } + + public function query_chinaz($ip){ + $url = 'http://mip.chinaz.com/?query='.$ip; + $data = get_curl($url); + if(strpos($data,'错误的IP地址')){ + throw new Exception('错误的IP地址'); + } + $data = getSubstr($data, '物理地址', ''); + $data = getSubstr($data, '', '
'); + $data = trim(str_replace('&',' ',$data)); + if ($data) { + return ['IP所在地'=>$data]; + }else{ + throw new Exception('接口查询失败,返回结果错误'); + } + } + + public function query_ipv6($ip){ + $url = 'http://ip.zxinc.org/api.php?type=json&ip='.$ip; + $data = get_curl($url); + $arr = json_decode($data, true); + if (isset($arr['code']) && $arr['code']==0) { + return ['IP所在地'=>$arr['data']['location']]; + }else{ + throw new Exception('接口查询失败,返回结果错误'); + } + } + + public function query_api($ip){ + $url = 'http://api.ip138.com/ip/?ip='.$ip; + $header = ['token: c10d9edc249963398634d009413758f4']; + $data = get_curl($url,0,0,0,0,0,0,$header); + $arr = json_decode($data, true); + if (isset($arr['ret']) && $arr['ret']=='ok') { + return ['IP所在地'=>$arr['data'][0].$arr['data'][1].$arr['data'][2].$arr['data'][3].' '.$arr['data'][4]]; + }elseif (isset($arr['msg'])) { + throw new Exception('接口查询失败:'.$arr['msg']); + }else{ + throw new Exception('接口查询失败,返回结果错误'); + } + } +} \ No newline at end of file diff --git a/plugin/web/ip/api/ip2regoin.php b/plugin/web/ip/api/ip2regoin.php new file mode 100644 index 0000000..a874773 --- /dev/null +++ b/plugin/web/ip/api/ip2regoin.php @@ -0,0 +1,26 @@ +search($ip); + if($region){ + $region = explode('|',$region); + return [ + 'IP所在地'=>($region[1]?$region[1]:'').($region[2]?$region[2]:'').($region[3]?$region[3]:'').($region[4]?$region[4]:''), + '运营商'=>($region[11]?$region[11]:''), + ]; + }else{ + throw new Exception('查无此IP数据'); + } + } +} \ No newline at end of file diff --git a/plugin/web/ip/api/ipapi.php b/plugin/web/ip/api/ipapi.php new file mode 100644 index 0000000..2af2c85 --- /dev/null +++ b/plugin/web/ip/api/ipapi.php @@ -0,0 +1,25 @@ +$arr['country'].' '.$arr['regionName'].' '.$arr['city'], 'AS编号'=>$arr['as'], 'ISP运营商'=>$arr['isp'], '当地时区'=>$arr['timezone']]; + }elseif (isset($arr['message'])) { + throw new Exception('接口查询失败:'.$arr['message']); + }else{ + throw new Exception('接口查询失败,返回结果错误'); + } + } +} \ No newline at end of file diff --git a/plugin/web/ip/api/ipip.php b/plugin/web/ip/api/ipip.php new file mode 100644 index 0000000..7059577 --- /dev/null +++ b/plugin/web/ip/api/ipip.php @@ -0,0 +1,23 @@ +$arr['data']['country'].''.$arr['data']['province'].''.$arr['data']['city'], 'ISP运营商'=>$arr['data']['isp'], 'AS编号'=>$arr['data']['asn'][0]]; + }else{ + throw new Exception('接口查询失败,返回结果错误'); + } + } +} \ No newline at end of file diff --git a/plugin/web/ip/api/pconline.php b/plugin/web/ip/api/pconline.php new file mode 100644 index 0000000..5d45f8b --- /dev/null +++ b/plugin/web/ip/api/pconline.php @@ -0,0 +1,24 @@ +$arr['addr']]; + }else{ + throw new Exception('接口查询失败,返回结果错误'); + } + } +} \ No newline at end of file diff --git a/plugin/web/ip/api/taobao.php b/plugin/web/ip/api/taobao.php new file mode 100644 index 0000000..6e4df64 --- /dev/null +++ b/plugin/web/ip/api/taobao.php @@ -0,0 +1,26 @@ +$arr['data']['country'].$arr['data']['region'].$arr['data']['city'], '运营商'=>$arr['data']['isp']]; + }elseif (isset($arr['msg'])) { + throw new Exception('接口查询失败:'.$arr['msg']); + }else{ + throw new Exception('接口查询失败,返回结果错误'); + } + } +} \ No newline at end of file diff --git a/plugin/web/ip/api/tencent.php b/plugin/web/ip/api/tencent.php new file mode 100644 index 0000000..1cd4c3c --- /dev/null +++ b/plugin/web/ip/api/tencent.php @@ -0,0 +1,27 @@ +$address, '经纬度'=>$location]; + }else{ + throw new Exception('接口查询失败:'.$arr['message']); + } + } +} \ No newline at end of file diff --git a/plugin/web/ip/index.html b/plugin/web/ip/index.html new file mode 100644 index 0000000..a295e0f --- /dev/null +++ b/plugin/web/ip/index.html @@ -0,0 +1,233 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ IP地址查询 +
+
+
我的IP:{$myip}
+
+ +
+
+
+ +
+
+ + +
+
+
+ +
+
+ +
+
+
简介
+
+ IP138:查询准确性极高,部分精确到县,速度快,含运营商(支持IPv6)
+ 高德地图:查询准确性极高,部分精确到县,速度快,含运营商、经纬度(支持IPv6)
+ 腾讯地图:宽带IP的查询准确性较高,部分精确到县,IDC的IP不准确,速度快(支持IPv6)
+ 太平洋电脑网:查询准确性较高,速度快,含运营商(支持IPv6)
+ IPIP:查询准确性极高,速度快,含运营商、AS号(支持IPv6)
+ IP-API:国外IP查询准确性较高,国外接口延迟高,含运营商、AS号(支持IPv6)
+ 宝塔:查询准确性较高,部分精确到县,速度快,含运营商、经纬度
+ 淘宝:查询准确性一般,速度较快,有调用频率限制,含运营商
+ 纯真:本地IP数据库,查询准确性一般,速度最快,含运营商
+
+
+
+
+
+{/block} +{block name="script"} + + + + +{/block} \ No newline at end of file diff --git a/plugin/web/ip_num/App.php b/plugin/web/ip_num/App.php new file mode 100644 index 0000000..f88d0ff --- /dev/null +++ b/plugin/web/ip_num/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/web/ip_num/index.html b/plugin/web/ip_num/index.html new file mode 100644 index 0000000..67fc326 --- /dev/null +++ b/plugin/web/ip_num/index.html @@ -0,0 +1,87 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} +
+
+
+
+
+ 数字IP地址转换 +
+
+
+
+ +
+ +
+
+
+
+ + + +
+
+
+ +
+ +
+
+
+
+
+
+
+
+{/block} +{block name="script"} + +{/block} \ No newline at end of file diff --git a/plugin/web/punycode/App.php b/plugin/web/punycode/App.php new file mode 100644 index 0000000..3ad5871 --- /dev/null +++ b/plugin/web/punycode/App.php @@ -0,0 +1,17 @@ +view(); + } +} \ No newline at end of file diff --git a/plugin/web/punycode/index.html b/plugin/web/punycode/index.html new file mode 100644 index 0000000..7f2f39b --- /dev/null +++ b/plugin/web/punycode/index.html @@ -0,0 +1,94 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} +
+
+
+
+
+ 中文域名转码 +
+
+ +
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+
简介
+
+

中文域名在解析的时候,须转换为 xn-xxxxxxxx.xxx 形式的Punycode码。本工具支持GBK编码和Punycode编码的相互转换。

+
+
+
+
+
+{/block} +{block name="script"} + + + +{/block} \ No newline at end of file diff --git a/plugin/web/viewhtml/App.php b/plugin/web/viewhtml/App.php new file mode 100644 index 0000000..a7bc9fe --- /dev/null +++ b/plugin/web/viewhtml/App.php @@ -0,0 +1,115 @@ + 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36', + 'android' => 'Mozilla/5.0 (Linux; U; Android 10; zh-cn; Mi 10 Build/QKQ1.191117.002) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/10.2 Mobile Safari/537.36', + 'ios' => 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', + 'harmonyos' => 'Mozilla/5.0 (Linux; Android 10; HarmonyOS; LYA-AL00; HMSCore 6.4.0.312; GMSCore 20.15.16) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.105 HuaweiBrowser/12.0.5.302 Mobile Safari/537.36', + 'wechat' => 'Mozilla/5.0 (Linux; Android 11; M2011K2C Build/RKQ1.200928.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045713 Mobile Safari/537.36 MMWEBID/2820 MicroMessenger/8.0.11.1980(0x28000B3B) Process/tools WeChat/arm64 Weixin NetType/5G Language/zh_CN ABI/arm64', + 'qq' => 'Mozilla/5.0 (Linux; Android 12; IN2010 Build/RKQ1.211119.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/97.0.4692.98 Mobile Safari/537.36 V1_AND_SQ_8.8.68_2538_YYB_D A_8086800 QQ/8.8.68.7265 NetType/4G WebP/0.4.1 Pixel/1080 StatusBarHeight/108 SimpleUISwitch/0 QQTheme/3445 InMagicWin/0 StudyMode/0 CurrentMode/0 CurrentFontScale/1.0 GlobalDensityScale/0.90000004 AppId/537112599', + 'alipay' => 'Mozilla/5.0 (Linux; U; Android 11; zh-CN; MI 10 Build/RKQ1.200928.002) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/69.0.3497.100 UWS/3.22.2.19 Mobile Safari/537.36 UCBS/3.22.2.19_210818212654 NebulaSDK/1.8.100112 Nebula AlipayDefined(nt:3G,ws:411|0|2.625) AliApp(AP/10.2.30.7000) AlipayClient/10.2.30.7000 Language/zh-Hans useStatusBar/true isConcaveScreen/true Region/CN NebulaX/1.0.0 Ariver/1.0.0', + 'baidu' => 'Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)', + 'mbaidu' => 'Mozilla/5.0 (Linux;u;Android 4.2.2;zh-cn;) AppleWebKit/534.46 (KHTML,like Gecko) Version/5.1 Mobile Safari/10600.6.3 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)', + 'google' => 'Googlebot/2.1 (+http://www.googlebot.com/bot.html)', + 'qqmgr' => 'Mozilla/5.0 (Linux; U; Android 4.4.2; zh-cn; GT-I9500 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko)Version/4.0 MQQBrowser/5.0 QQ-URL-Manager', + ]; + + public function index() + { + return $this->view(); + } + + public function getdata(){ + $url = input('post.url', null, 'trim'); + $ua = input('post.ua'); + $useragent = $ua == 'diy' ? input('post.uastr', null, 'trim') : self::ualist[$ua]; + $referer = input('post.referer', null, 'trim'); + $post = input('post.post'); + $cookie = input('post.cookie'); + + if(!$url) return msg('error','no url'); + if(!filter_var($url,FILTER_VALIDATE_URL)){ + return msg('error','输入的URL不符合规范'); + } + + $captcha_result = verify_captcha4(); + if($captcha_result !== true){ + return msg('error', '验证失败,请重新验证'); + } + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + $httpheader[] = "Accept: */*"; + $httpheader[] = "Accept-Language: zh-CN,zh;q=0.8"; + $httpheader[] = "Connection: close"; + if(!empty($post) && substr($post, 0, 1) == '{' && substr($post, -1 ,1) == '}'){ + $httpheader[] = "Content-Type: application/json; charset=utf-8"; + } + curl_setopt($ch, CURLOPT_USERAGENT, $useragent); + if(input('post.header')=='1'){ + curl_setopt($ch, CURLOPT_HEADER, true); + } + if(!empty($referer)){ + curl_setopt($ch, CURLOPT_REFERER, $referer); + } + if(!empty($cookie)){ + curl_setopt($ch, CURLOPT_COOKIE, $cookie); + } + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); + curl_setopt($ch, CURLOPT_TIMEOUT, 5); + if(!empty($post)){ + curl_setopt($ch,CURLOPT_POST, 1); + curl_setopt($ch,CURLOPT_POSTFIELDS, $post); + } + $data = curl_exec($ch); + $errno = curl_errno($ch); + if ($errno) { + $msg = 'Curl error: ' . curl_error($ch); + return msg('error',$msg); + } + curl_close($ch); + + + $data = (input('post.encoding')=='') ? $data : mb_convert_encoding($data, 'UTF-8', input('post.encoding')); + switch(input('post.text')){ + case 'links': + preg_match_all("'<\s*a\s.*?href\s*=\s* # find ]+)) # if quote found, match up to next matching + # quote, otherwise match up to next space + 'isx",$data,$links); + $data = ''; + foreach($links[2] as $val){ + if(!empty($val)) $data .= $val."\n"; + } + foreach($links[3] as $val){ + if(!empty($val)) $data .= $val."\n"; + } + break; + case 'form': + preg_match_all("'<\/?(FORM|INPUT|SELECT|TEXTAREA|(OPTION))[^<>]*>(?(2)(.*(?=<\/?(option|select)[^<>]*>[\r\n]*)|(?=[\r\n]*))|(?=[\r\n]*))'Usi",$data,$elements); + $data = implode("\r\n",$elements[0]); + break; + case 'text': + $data = strip_tags($data); + break; + } + + return msg('ok','success',$data); + } + +} \ No newline at end of file diff --git a/plugin/web/viewhtml/index.html b/plugin/web/viewhtml/index.html new file mode 100644 index 0000000..3656fdc --- /dev/null +++ b/plugin/web/viewhtml/index.html @@ -0,0 +1,264 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + + +
+
+
+
+
+ 网页源代码查看 +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+{/block} +{block name="script"} + + + + + +{/block} \ No newline at end of file diff --git a/plugin/web/whois/App.php b/plugin/web/whois/App.php new file mode 100644 index 0000000..27d6bb2 --- /dev/null +++ b/plugin/web/whois/App.php @@ -0,0 +1,50 @@ +'正常状态', 'addPeriod'=>'域名新注册期', 'clientDeleteProhibited'=>'注册商设置禁止删除', 'serverDeleteProhibited'=>'注册局设置禁止删除', 'clientUpdateProhibited'=>'注册商设置禁止更新', 'serverUpdateProhibited'=>'注册局设置禁止更新', 'clientTransferProhibited'=>'注册商设置禁止转移', 'serverTransferProhibited'=>'注册局设置禁止转移', 'pendingVerification'=>'注册信息审核期', 'clientHold'=>'注册商设置暂停解析', 'serverHold'=>'注册局设置暂停解析', 'inactive'=>'非激活状态', 'clientRenewProhibited'=>'注册商设置禁止续费', 'serverRenewProhibited'=>'注册局设置禁止续费', 'pendingTransfer'=>'转移过程中', 'redemptionPeriod'=>'赎回期', 'pendingDelete'=>'待删除']; + + public function index() + { + return $this->view(); + } + + public function query(){ + $domain = input('post.domain', null, 'trim'); + if(!$domain) return msg('error','no domain'); + if(filter_var($domain, FILTER_VALIDATE_IP)){ + $type = 'ip'; + }elseif(checkdomain($domain)){ + $type = 'domain'; + }else{ + return msg('error', '域名或IP格式不正确!'); + } + + $captcha_result = verify_captcha4(); + if($captcha_result !== true){ + return msg('error', '验证失败,请重新验证'); + } + + + $url = 'https://whois.aite.xyz/?ajax&domain='.urlencode($domain); + $data = get_curl($url,0,'https://whois.aite.xyz/'); + if(!$data) return msg('error', '查询失败,接口返回内容错误'); + + if(strpos($data,'For more information on')){ + $data = substr($data, 0, strpos($data,'For more information on')); + } + + return msg('ok','success',$data); + } + +} \ No newline at end of file diff --git a/plugin/web/whois/index.html b/plugin/web/whois/index.html new file mode 100644 index 0000000..4cfd819 --- /dev/null +++ b/plugin/web/whois/index.html @@ -0,0 +1,136 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ 域名Whois查询 +
+
+ +
+
+ +
+
+
+
+
+
+ +
+
+{/block} +{block name="script"} + + + +{/block} \ No newline at end of file diff --git a/plugin/wqq/friend_check/App.php b/plugin/wqq/friend_check/App.php new file mode 100644 index 0000000..d609f58 --- /dev/null +++ b/plugin/wqq/friend_check/App.php @@ -0,0 +1,42 @@ +friendlist(); + $list = $res["list"]; + }catch(Exception $e){ + $error = $e->getMessage(); + } + View::assign('list', $list); + }else{ + View::assign('isqqlogin', 0); + } + View::assign('error', $error); + return $this->view(); + } + +} \ No newline at end of file diff --git a/plugin/wqq/friend_check/index.html b/plugin/wqq/friend_check/index.html new file mode 100644 index 0000000..e9fbe88 --- /dev/null +++ b/plugin/wqq/friend_check/index.html @@ -0,0 +1,304 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+ + {if $isqqlogin && !$error} +
+
+

+

+
+ + + +
+
+
+ +
+
+ + + + + + + + + + {foreach $list as $row}{/foreach} + +
QQ昵称结果删除
总共{:count($list)}个好友,其中0个单项,已删除0个!导出全部
{$row.uin}{$row.remark}检测删除
+
+
+ {/if} +
+
+{/block} +{block name="script"} + +{if $isqqlogin} + +{/if} +{/block} \ No newline at end of file diff --git a/plugin/wqq/group_announce/App.php b/plugin/wqq/group_announce/App.php new file mode 100644 index 0000000..bea067f --- /dev/null +++ b/plugin/wqq/group_announce/App.php @@ -0,0 +1,86 @@ +grouplist(true); + }catch(Exception $e){ + $error = $e->getMessage(); + } + View::assign('group', $group); + }else{ + View::assign('isqqlogin', 0); + } + View::assign('groupid', input('get.groupid')); + View::assign('error', $error); + return $this->view(); + } + + public function list(){ + $groupid = input('get.groupid', null, 'trim'); + if(!$groupid) return msg('error','no groupid'); + $start=input('?get.start')?input('get.start/d'):-1; + + $logininfo = session('qq_cookie_qun'); + if(!$logininfo){ + return msg('error', '请先登录'); + } + + try{ + $qqgroup = new \app\lib\QQGroup($logininfo['uin'], $logininfo['cookie']); + $list = $qqgroup->announcelist($groupid, $start); + }catch(Exception $e){ + return msg('error', $e->getMessage()); + } + + $data = array(); + $data['code'] = 0; + $data['count'] = count($list); + $data['data'] = $list; + $data['next'] = count($list)>=10; + + return msg('ok','success',$data); + } + + public function del(){ + $groupid = input('get.groupid', null, 'trim'); + if(!$groupid) return msg('error','no groupid'); + $fid = input('get.fid', null, 'trim'); + if(!$fid) return msg('error','no fid'); + + $logininfo = session('qq_cookie_qun'); + if(!$logininfo){ + return msg('error', '请先登录'); + } + + try{ + $qqgroup = new \app\lib\QQGroup($logininfo['uin'], $logininfo['cookie']); + $qqgroup->delannounce($groupid, $fid); + }catch(Exception $e){ + return msg('error', $e->getMessage()); + } + + return msg(); + } + + +} \ No newline at end of file diff --git a/plugin/wqq/group_announce/index.html b/plugin/wqq/group_announce/index.html new file mode 100644 index 0000000..eb3f5e2 --- /dev/null +++ b/plugin/wqq/group_announce/index.html @@ -0,0 +1,143 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ 批量删除群公告 +
+ {if $isqqlogin==0} +

当前登录的账号:未登录   立即登录

+ {else} +

当前登录的账号:{$logininfo.nickname|raw}({$logininfo.uin})   更换账号

+ {if $error} +
{$error}
+ {/if} +
+
QQ群列表
+ +
+
+ +
+ {/if} +
+
+ +
+
+{/block} +{block name="script"} + +{/block} \ No newline at end of file diff --git a/plugin/wqq/group_dismiss/App.php b/plugin/wqq/group_dismiss/App.php new file mode 100644 index 0000000..4af8bca --- /dev/null +++ b/plugin/wqq/group_dismiss/App.php @@ -0,0 +1,52 @@ +view(); + } + + public function dismiss(){ + $groupid = input('get.groupid', null, 'trim'); + if(!$groupid) return msg('error','no groupid'); + if(!is_numeric($groupid)){ + return msg('error','群号不正确'); + } + + $logininfo = session('qq_cookie_qqid'); + if(!$logininfo){ + return msg('error', '请先登录'); + } + + try{ + $qqgroup = new \app\lib\QQGroup($logininfo['uin'], $logininfo['cookie']); + $qqgroup->dismissgroup($groupid); + }catch(Exception $e){ + return msg('error', $e->getMessage()); + } + + return msg(); + } + +} \ No newline at end of file diff --git a/plugin/wqq/group_dismiss/index.html b/plugin/wqq/group_dismiss/index.html new file mode 100644 index 0000000..32cdaf6 --- /dev/null +++ b/plugin/wqq/group_dismiss/index.html @@ -0,0 +1,55 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ 自助解散QQ群 +
+
支持解散被封的群。
+ {if $isqqlogin==0} +

当前登录的账号:未登录   立即登录

+ {else} +

当前登录的账号:{$logininfo.nickname|raw}({$logininfo.uin})   更换账号

+ {/if} +
+
+
QQ群号
+ +
+
+
+ +
+ +
+
+
+
+{/block} +{block name="script"} + +{/block} \ No newline at end of file diff --git a/plugin/wqq/group_join/App.php b/plugin/wqq/group_join/App.php new file mode 100644 index 0000000..24dac2d --- /dev/null +++ b/plugin/wqq/group_join/App.php @@ -0,0 +1,52 @@ +view(); + } + + public function getlink(){ + $groupid = input('get.groupid', null, 'trim'); + if(!$groupid) return msg('error','no groupid'); + if(!is_numeric($groupid)){ + return msg('error','群号不正确'); + } + + $logininfo = session('qq_cookie_qun'); + if(!$logininfo){ + return msg('error', '请先登录'); + } + + try{ + $qqgroup = new \app\lib\QQGroup($logininfo['uin'], $logininfo['cookie']); + $joinlink = $qqgroup->getjoinlink($groupid); + }catch(Exception $e){ + return msg('error', $e->getMessage()); + } + + return msg('ok', 'success', $joinlink); + } + +} \ No newline at end of file diff --git a/plugin/wqq/group_join/index.html b/plugin/wqq/group_join/index.html new file mode 100644 index 0000000..1ee1516 --- /dev/null +++ b/plugin/wqq/group_join/index.html @@ -0,0 +1,74 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ 获取加群链接 +
+ {if $isqqlogin==0} +

当前登录的账号:未登录   立即登录

+ {else} +

当前登录的账号:{$logininfo.nickname|raw}({$logininfo.uin})   更换账号

+ {/if} +
+
+
QQ群号
+ +
+
+
+ +
+ +
+
+
+
+
工具说明
+
+

只要知道群号就能生成任意群的加群链接。不允许被搜索的群通过此工具也可直接申请加群。

+
+
+
+
+
+{/block} +{block name="script"} + +{/block} \ No newline at end of file diff --git a/plugin/wqq/group_members/App.php b/plugin/wqq/group_members/App.php new file mode 100644 index 0000000..8701092 --- /dev/null +++ b/plugin/wqq/group_members/App.php @@ -0,0 +1,59 @@ +grouplist(); + }catch(Exception $e){ + $error = $e->getMessage(); + } + View::assign('group', $group); + }else{ + View::assign('isqqlogin', 0); + } + View::assign('groupid', input('get.groupid')); + View::assign('error', $error); + return $this->view(); + } + + public function list(){ + $groupid = input('get.groupid', null, 'trim'); + if(!$groupid) return msg('error','no groupid'); + $start=input('?get.start')?input('get.start'):0; + $end=$start+40; + + $logininfo = session('qq_cookie_qun'); + if(!$logininfo){ + return msg('error', '请先登录'); + } + + try{ + $qqgroup = new \app\lib\QQGroup($logininfo['uin'], $logininfo['cookie']); + $data = $qqgroup->groupmemberlist($groupid, $start, $end); + }catch(Exception $e){ + return msg('error', $e->getMessage()); + } + + return msg('ok','success',$data); + } + +} \ No newline at end of file diff --git a/plugin/wqq/group_members/index.html b/plugin/wqq/group_members/index.html new file mode 100644 index 0000000..ebc315d --- /dev/null +++ b/plugin/wqq/group_members/index.html @@ -0,0 +1,107 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ 提取QQ群成员 +
+ {if $isqqlogin==0} +

当前登录的账号:未登录   立即登录

+ {else} +

当前登录的账号:{$logininfo.nickname|raw}({$logininfo.uin})   更换账号

+ {if $error} +
{$error}
+ {/if} +
+
QQ群列表
+ +
+
+ +
+ {/if} +
+
+ +
+
+{/block} +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/plugin/wqq/online_device/App.php b/plugin/wqq/online_device/App.php new file mode 100644 index 0000000..e8b3ceb --- /dev/null +++ b/plugin/wqq/online_device/App.php @@ -0,0 +1,52 @@ +view(); + } + + public function change(){ + $model = input('post.model', null, 'trim'); + if(!$model) return msg('error','自定义机型不能为空'); + $desc = input('post.desc', null, 'trim'); + $imei = input('post.imei', null, 'trim'); + if(!$imei) return msg('error','IMEI不能为空'); + + $logininfo = session('qq_cookie_qzone'); + if(!$logininfo){ + return msg('error', '请先登录'); + } + + try{ + $qqtool = new \app\lib\QQTool($logininfo['uin'], $logininfo['cookie'], true); + $qqtool->set_online_status($model, $desc, $imei); + }catch(Exception $e){ + return msg('error', $e->getMessage()); + } + + return msg(); + } + +} \ No newline at end of file diff --git a/plugin/wqq/online_device/index.html b/plugin/wqq/online_device/index.html new file mode 100644 index 0000000..303aab4 --- /dev/null +++ b/plugin/wqq/online_device/index.html @@ -0,0 +1,128 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ QQ自定义在线机型 +
+
此工具可自定义QQ在线状态设备名,需要SVIP
+ {if $isqqlogin==0} +

当前登录的账号:未登录   立即登录

+ {else} +

当前登录的账号:{$logininfo.nickname|raw}({$logininfo.uin})   更换账号

+ {/if} +
+
+
自定义机型
+ +
+
+
+
+
自定义前缀
+ +
+
+
+
+
手机IMEI
+ +
+
+

在线状态预览:{{desc}}{{model}}在线

+
+ + +
+
+
+
+
+
+ +{/block} +{block name="script"} + + + + +{/block} \ No newline at end of file diff --git a/plugin/wqq/qqchat/App.php b/plugin/wqq/qqchat/App.php new file mode 100644 index 0000000..1c94711 --- /dev/null +++ b/plugin/wqq/qqchat/App.php @@ -0,0 +1,18 @@ +view(); + } + +} \ No newline at end of file diff --git a/plugin/wqq/qqchat/index.html b/plugin/wqq/qqchat/index.html new file mode 100644 index 0000000..42aae08 --- /dev/null +++ b/plugin/wqq/qqchat/index.html @@ -0,0 +1,86 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} +
+
+
+
+
+ QQ强制聊天 +
+
+
+
QQ号码
+ +
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
工具说明
+
+

跳转聊天界面:一般只支持已开启临时会话的QQ

+

跳转加好友界面:可解决QQ设置不允许被搜索后无法加好友的问题

+

WPA临时会话:从网页跳转聊天界面,与第一个按钮功能差不多

+
+
+
+
+
+{/block} +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/plugin/wqq/qqlevel/App.php b/plugin/wqq/qqlevel/App.php new file mode 100644 index 0000000..c67d5b5 --- /dev/null +++ b/plugin/wqq/qqlevel/App.php @@ -0,0 +1,94 @@ +view(); + } + + public function query(){ + $uin = input('post.uin', null, 'trim'); + if(!$uin) return msg('error','no uin'); + + if(!is_numeric($uin) || strlen($uin)>11){ + return msg('error', 'QQ号码格式不正确!'); + } + + $captcha_result = verify_captcha4(); + if($captcha_result !== true){ + return msg('error', '验证失败,请重新验证'); + } + + try{ + $result = $this->queryapi($uin); + }catch(Exception $e){ + return msg('error', $e->getMessage()); + } + + $msg['QQ号码'] = $uin; + $msg['QQ昵称'] = $result['sNickName']; + $msg['QQ等级'] = $result['iQQLevel'].'级'; + $msg['等级图标'] = $this->Level($result['iQQLevel']); + $msg['注册时长'] = $result['iTotalActiveDay'].'天'; + $msg['下次升级天数'] = $result['iNextLevelDay'].'天'; + $msg['今日成长天数'] = $result['iRealDays'].'天'; + $Time = @round((($result['iNoHideOnlineTime'] + $result['iPCQQOnlineTime']) / 60 / 60) , 2); + $msg['今日在线时长'] = $Time.'小时'; + + return msg('ok','success',$msg); + } + + private function queryapi($uin){ + //此处需填写QQAPI的接口地址(https://github.com/netcccyun/qqapi) + $url = 'http://qqapiurl/api.php?act=getqqlevel'; + $post = 'key=查询密钥&uin='.$uin; + $data = get_curl($url, $post); + $arr = json_decode($data, true); + if(isset($arr['code']) && $arr['code']==0){ + return $arr['data']; + }elseif(isset($arr['msg'])){ + throw new Exception($arr['msg']); + }else{ + throw new Exception('接口请求失败'); + } + } + + private function Level($Level){ + if($Level == 0){ + return '☆'; + } + $String = ''; + $h = Intval($Level / 64); + $Level_h = Intval($Level - ($h * 64)); + $t = Intval($Level_h / 16); + $Level_t = Intval($Level_h - ($t * 16)); + $y = Intval($Level_t / 4); + $Level_y = Intval($Level_t - ($y * 4)); + $x = Intval($Level_y); + $Level_t = Intval($Level_h - $x); + for($i = 0 ; $i < $h ; $i++){ + $String .= '👑'; + } + for($i = 0 ; $i < $t ; $i++){ + $String .= '☀️'; + } + for($i = 0 ; $i < $y ; $i++){ + $String .= '🌙'; + } + for($i = 0 ; $i < $x ; $i++){ + $String .= '⭐'; + } + return $String; + } + +} \ No newline at end of file diff --git a/plugin/wqq/qqlevel/index.html b/plugin/wqq/qqlevel/index.html new file mode 100644 index 0000000..0ac1c8e --- /dev/null +++ b/plugin/wqq/qqlevel/index.html @@ -0,0 +1,117 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ QQ等级查询 +
+
+ +
+ +
+
+ +
+
+ +
+
+{/block} +{block name="script"} + + + +{/block} \ No newline at end of file diff --git a/plugin/wqq/setqqnick/App.php b/plugin/wqq/setqqnick/App.php new file mode 100644 index 0000000..90e02ab --- /dev/null +++ b/plugin/wqq/setqqnick/App.php @@ -0,0 +1,49 @@ +view(); + } + + public function setnick(){ + $nickname = input('post.nickname', null); + if(!$nickname) return msg('error','新昵称不能为空'); + + $logininfo = session('qq_cookie_qzone'); + if(!$logininfo){ + return msg('error', '请先登录'); + } + + try{ + $qqtool = new \app\lib\QQTool($logininfo['uin'], $logininfo['cookie']); + $qqtool->setnickname($nickname); + }catch(Exception $e){ + return msg('error', $e->getMessage()); + } + + return msg(); + } + +} \ No newline at end of file diff --git a/plugin/wqq/setqqnick/index.html b/plugin/wqq/setqqnick/index.html new file mode 100644 index 0000000..11b8dbe --- /dev/null +++ b/plugin/wqq/setqqnick/index.html @@ -0,0 +1,55 @@ +{extend name="common/plugin_layout" /} +{block name="title"}{$plugin.title} - {:config_get('title')}{/block} +{block name="main"} + +
+
+
+
+
+ 设置空白昵称 +
+
如需设置空白昵称只需输入空格即可。
+ {if $isqqlogin==0} +

当前登录的账号:未登录   立即登录

+ {else} +

当前登录的账号:{$logininfo.nickname|raw}({$logininfo.uin})   更换账号

+ {/if} +
+
+
新昵称
+ +
+
+
+ +
+ +
+
+
+
+{/block} +{block name="script"} + +{/block} \ No newline at end of file diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..6c1d8c1 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,8 @@ + + Options +FollowSymlinks + RewriteEngine On + + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] + \ No newline at end of file diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000..b5491f5 --- /dev/null +++ b/public/404.html @@ -0,0 +1,229 @@ + + + + + 404 Not Found + + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+ +

404 Not Found

+ + 返回首页 + + + + \ No newline at end of file diff --git a/public/admin/css/layuimini.css b/public/admin/css/layuimini.css new file mode 100644 index 0000000..4f8c2ac --- /dev/null +++ b/public/admin/css/layuimini.css @@ -0,0 +1,927 @@ +/** +配色方案(如有需要,请自行配置) + */ +/**头部-配色*/ +.layui-layout-admin .layui-header { + background-color: #1aa094 !important; +} + +.layui-header > ul > .layui-nav-item.layui-this, .layuimini-tool i:hover { + background-color: #197971 !important; +} + +.layui-header .layuimini-header-content > ul > .layui-nav-item.layui-this, .layuimini-tool i:hover { + background-color: #197971 !important; +} + +/**logo-配色*/ +.layui-layout-admin .layuimini-logo { + background-color: #243346 !important; +} + +/**左侧-配色*/ +.layui-side.layui-bg-black, .layui-side.layui-bg-black > .layuimini-menu-left > ul { + background-color: #2f4056 !important; +} + +.layuimini-menu-left .layui-nav .layui-nav-child a:hover:not(.layui-this) { + background-color: #3b3f4b; +} + +/**左侧菜单选中-配色*/ +.layui-layout-admin .layui-nav-tree .layui-this, .layui-layout-admin .layui-nav-tree .layui-this > a, .layui-layout-admin .layui-nav-tree .layui-nav-child dd.layui-this, .layui-layout-admin .layui-nav-tree .layui-nav-child dd.layui-this a { + background-color: #1aa094 !important; +} + + +/**头部样式 */ +.layui-layout-admin .header { + position: fixed; + left: 0; + right: 0; + top: 0; + bottom: 0; +} + +.layuimini-header-menu, .layui-header { + height: 60px !important; +} + +.layuimini-header-menu > .layui-nav-item { + color: #1b1d21; + height: 60px !important; + line-height: 60px !important; +} + +.layui-header > .layui-layout-right > .layui-nav-item { + height: 60px !important; + line-height: 60px !important; +} + +.layui-layout-left { + left: 295px !important; +} + +.layui-nav.layui-layout-left.layuimini-header-menu.layuimini-pc-show { + font-weight: bold; + transition: all .2s; +} + + +/**logo演示(通用) */ +.layui-layout-admin .layuimini-logo { + font-weight: bold; + color: #ffffff !important; + height: 60px !important; + line-height: 60px !important; + overflow: hidden; + line-height: 64px; + transition: all .2s !important; +} + +.layui-layout-admin .layuimini-logo img { + display: inline-block; + height: 40px; + vertical-align: middle; +} + +.layui-layout-admin .layuimini-logo h1 { + display: inline-block; + margin: 0 0 0 12px; + color: #ffffff; + font-weight: 600; + font-size: 20px; + font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif; + vertical-align: middle; +} + +/**缩放工具(通用) */ +.layuimini-tool { + position: absolute !important; + top: 0; + left: 235px; + width: 60px; + height: 100%; + line-height: 60px; + text-align: center; + color: #ffffff !important; + transition: all .2s; +} + +/**缩放工具(缩放) */ +.layuimini-tool i { + display: block; + color: #bbe3df; + width: 32px; + height: 32px; + line-height: 32px; + border-radius: 3px; + text-align: center; + margin-top: 15px; + cursor: pointer; +} + +/**tab选项卡 */ +.layuimini-tab { + margin: 0px; + overflow: hidden; + height: 100% !important; +} + +.layuimini-tab .layui-tab-content { + height: calc(100% - 37px) !important; +} + +.layuimini-tab .layui-tab-content .layui-tab-item { + height: 100%; +} + +.layuimini-tab .layui-tab-content { + padding: 0px; +} + +.layuimini-tab .layui-tab-title { + border: none; + border: 1px solid whitesmoke; + background-color: white; +} + +.layuimini-tab .layui-tab-title li { + border-right: 1px solid whitesmoke; + color: dimgray; +} + +.layuimini-tab .layui-tab-title .layui-tab-bar { + display: none; +} + +.layuimini-tab .layui-tab-title .layui-this:after { + display: none; +} + +.layuimini-tab .layui-tab-title .layuimini-tab-active { + display: inline-block; + background-color: lightgray; + width: 9px; + height: 9px; + border-radius: 30px; + margin-right: 5px; +} + +.layuimini-tab .layui-tab-title .layui-this .layuimini-tab-active { + background-color: #1aa094; +} + +.layuimini-tab > .layui-tab-title, .layuimini-tab > .close-box { + height: 35px !important; +} + +.layuimini-tab > .layui-tab-title li, .layuimini-tab > .close-box li { + line-height: 35px !important; +} + +.layuimini-tab .layui-tab-title span { + color: #acafb1; +} + +.layuimini-tab .layui-tab-title .layui-this span { + color: dimgray; +} + +.layuimini-tab .layui-tab-title .layui-tab-close { + font-size: 12px !important; + width: 14px !important; + height: 14px !important; + line-height: 16px !important; +} + +.layuimini-tab .layui-tab-title .layui-tab-close:hover { + border-radius: 4em; + background: #ff5722; +} + +.layuimini-tab .layui-tab-title .disable-close + .layui-tab-close { + display: none; +} + +.layuimini-tab .layui-tab-title .able-close + .layui-tab-close { + display: inline-block; +} + +.layuimini-tab .layui-tab-control > li { + position: absolute; + top: 0px; + height: 35px; + line-height: 35px; + width: 35px; + text-align: center; + background-color: white; + border-top: whitesmoke 1px solid; + border-bottom: whitesmoke 1px solid; +} + +.layuimini-tab .layuimini-tab-roll-left { + left: 0px; + border-right: whitesmoke 1px solid; + border-left: whitesmoke 1px solid; +} + +.layuimini-tab .layuimini-tab-roll-right { + right: 35px; + border-left: 1px solid whitesmoke; +} + +.layuimini-tab .layui-tab-tool { + right: 0px; + border-left: 1px solid whitesmoke; +} + +.layuimini-tab .layui-tab-control .layui-tab-tool, +.layuimini-tab .layui-tab-control .layuimini-tab-roll-left, +.layuimini-tab .layui-tab-control .layuimini-tab-roll-right { + display: none; +} + +.layuimini-tab.layui-tab-roll .layui-tab-control .layuimini-tab-roll-left, +.layuimini-tab.layui-tab-roll .layui-tab-control .layuimini-tab-roll-right { + display: block; +} + +.layuimini-tab.layui-tab-roll .layui-tab-control .layuimini-tab-roll-right { + right: 0px; + border-right: 1px solid whitesmoke; +} + +.layuimini-tab.layui-tab-roll .layui-tab-title { + padding-left: 35px; + padding-right: 35px; +} + + +.layuimini-tab.layui-tab-tool .layui-tab-control .layui-tab-tool { + display: block; +} + +.layuimini-tab.layui-tab-tool .layui-tab-title { + padding-left: 0px; + padding-right: 35px; +} + + +.layuimini-tab.layui-tab-rollTool .layui-tab-title { + padding-left: 35px; + padding-right: 80px; +} + +.layuimini-tab.layui-tab-rollTool .layui-tab-control .layuimini-tab-roll-left, +.layuimini-tab.layui-tab-rollTool .layui-tab-control .layuimini-tab-roll-right, +.layuimini-tab.layui-tab-rollTool .layui-tab-control .layui-tab-tool { + display: block; +} + +.layuimini-tab .layui-tab-tool .layui-nav { + position: absolute; + height: 43px !important; + top: 0; + width: 100%; + height: 100%; + padding: 0; + background: 0 0; +} + +.layuimini-tab .layui-tab-tool .layui-nav-item { + height: 35px; +} + +.layuimini-tab .layui-tab-tool .layui-nav-bar { + display: none; +} + +.layuimini-tab .layui-tab-tool .layui-nav-child { + left: auto; + top: 45px; + right: 3px; + width: 120px; + border: 1px solid whitesmoke; +} + +.layuimini-tab .layui-tab-tool .layui-this a { + background-color: #009688; +} + +.layuimini-tab-loading { + position: absolute; + display: none; + width: 100%; + height: calc(100% - 37px); + top: 37px; + z-index: 19; + background-color: #fff +} + +.layuimini-tab-loading.close { + animation: close 1s; + -webkit-animation: close 1s; + animation-fill-mode: forwards; +} + +/**左侧菜单栏 (通用) */ +.layui-side.layui-bg-black { + transition: all .2s; +} + +.layui-side.layui-bg-black > .layuimini-menu-left > ul { + transition: all .2s; +} + +.layui-side.layui-bg-black > .layuimini-menu-left > ul > .layui-nav-item:first-child { + border-top: 1px solid #4b5461; +} + +.layuimini-menu-left .layui-nav .layui-nav-item a { + height: 40px; + line-height: 40px; + padding-right: 30px; +} + +.layuimini-menu-left .layui-nav .layui-nav-item > a { + padding-top: 5px; + padding-bottom: 5px; +} + +.layuimini-menu-left .layui-nav .layui-nav-child .layui-nav-child { + background: 0 0 !important +} + +.layuimini-menu-left .layui-nav .layui-nav-more { + right: 15px; +} + +.layuimini-menu-left .layui-nav .layui-nav-item a:hover { + background-color: transparent !important; +} + +.layuimini-menu-left .layui-nav { + background-color: transparent !important; +} + + +/**左侧菜单栏 (正常) */ +.layui-layout-body .layui-nav-itemed .layui-nav-child a, .layui-layout-body .layuimini-menu-left .layui-nav .layui-nav-child a { + padding-left: 35px; +} + +.layui-layout-body .layuimini-menu-left .layui-nav .layui-nav-child .layui-nav-child a { + padding-left: 45px; +} + +.layui-layout-body .layuimini-menu-left .layui-nav .layui-nav-child .layui-nav-child .layui-nav-child a { + padding-left: 55px; +} + +.layui-layout-body .layuimini-menu-left .layui-nav .layui-nav-child .layui-nav-child .layui-nav-child .layui-nav-child a { + padding-left: 65px; +} + +.layui-layout-body .layuimini-menu-left .layui-nav .layui-nav-itemed > .layui-nav-child { + padding: 5px 0; +} + +/**内容主体(通用) */ +.layui-layout-admin .layui-body { + overflow: hidden; + bottom: 0px !important; + top: 60px !important; + transition: all .2s; +} + +/**选择配色方案 */ +.layuimini-color .color-title { + padding: 10px 0 10px 20px; + border-bottom: 1px solid #d9dada; + margin-bottom: 8px; +} + +.layuimini-color .color-content { + padding: 10px 5px 0 5px; +} + +.layuimini-color .color-content ul { + list-style: none; + text-align: center; +} + +.layuimini-color .color-content ul li { + position: relative; + display: inline-block; + vertical-align: top; + width: 80px; + height: 50px; + margin: 0 15px 15px 0; + padding: 2px 2px 4px 2px; + background-color: #f2f2f2; + cursor: pointer; + font-size: 12px; + color: #666; +} + +.layuimini-color .color-content li.layui-this:after, .layuimini-color .color-content li:hover:after { + width: 100%; + height: 100%; + padding: 4px; + top: -5px; + left: -5px; + border-color: #d8d8d8; + opacity: 1; +} + +.layuimini-color .color-content li:after { + content: ''; + position: absolute; + z-index: 20; + top: 50%; + left: 50%; + width: 1px; + height: 0; + border: 1px solid #f2f2f2; + transition: all .3s; + -webkit-transition: all .3s; + opacity: 0; +} + + +/**其它 */ +.layui-tab-item { + width: 100% !important; + height: 100% !important; +} + +.layui-nav-item.layui-this { + background-color: #1b1d21; +} + +.layui-width-height { + width: 100%; + height: 95%; +} + +.layui-tab { + margin: 0 0 0 0; + z-index: 99999; +} + +.text-center { + height: 30px !important; + line-height: 30px !important; + text-align: center !important; +} + +.layui-nav { + padding: 0 !important; +} + +.layui-nav .layui-this:after, .layui-nav-bar, .layui-nav-tree .layui-nav-itemed:after { + width: 0 !important; + height: 0 !important; +} + +.layui-layout-admin .layui-side { + top: 60px !important; +} + +.layui-tab-card { + box-shadow: 0px 0px 0px #888888; + border-bottom: 0; +} + + +/**自定义滚动条样式 */ +::-webkit-scrollbar { + display: none +} + + +/*移动端遮罩层*/ +.layuimini-make { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 1000; + background: rgba(0, 0, 0, .5); + display: none; +} + +.layuimini-mini .layui-header { + z-index: 1001; +} + +/**初始化加载层*/ +.layuimini-loader { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: #ffffff; + z-index: 999999; +} + +.layuimini-loader .layuimini-loader-inner { + display: block; + position: relative; + left: 50%; + top: 50%; + width: 150px; + height: 150px; + margin: -75px 0 0 -75px; + border-radius: 50%; + border: 3px solid transparent; + border-top-color: #1E9FFF; + animation: spin 2s linear infinite; +} + +.layuimini-loader .layuimini-loader-inner:before { + content: ""; + position: absolute; + top: 5px; + left: 5px; + right: 5px; + bottom: 5px; + border-radius: 50%; + border: 3px solid transparent; + border-top-color: #1E9FFF; + animation: spin 3s linear infinite; +} + +.layuimini-loader .layuimini-loader-inner:after { + content: ""; + position: absolute; + top: 15px; + left: 15px; + right: 15px; + bottom: 15px; + border-radius: 50%; + border: 3px solid transparent; + border-top-color: #1E9FFF; + animation: spin 1.5s linear infinite; +} + +@keyframes spin { + 0% { + transform: rotate(0deg); + } + to { + transform: rotate(1turn); + } +} + +/*系统设置*/ + +.layuimini-color .layui-word-aux { + position: absolute; + left: 60px; + top: 12px; + font-size: 12px; +} + +.layuimini-color .layui-input-block { + margin-left: 15px; + min-height: 36px; +} + +.layuimini-color .more-menu-list { + width: 100%; + margin-top: 30px; +} + + +.layuimini-color .more-menu-item:first-child { + border-top: 1px solid #e8e8e8; +} + +.layuimini-color .more-menu-item .layui-icon { + font-size: 18px; + padding-right: 10px; +} + +.layuimini-color .more-menu-item { + color: #595959; + height: 50px; + line-height: 50px; + font-size: 16px; + padding: 0 25px; + border-bottom: 1px solid #e8e8e8; + font-style: normal; + display: block; +} + +.layuimini-color .more-menu-item:hover { + background-color: whitesmoke; +} + +.layuimini-color .more-menu-item:after { + color: #8c8c8c; + right: 16px; + content: "\e602"; + position: absolute; + font-family: layui-icon !important; +} + +/** +鼠标右键 + */ +.layuimini-tab-mousedown { + display: none; + width: 80px; + position: absolute; + top: 0px !important; + left: 0px !important; +} + +.layuimini-tab-mousedown dd a { + padding: 0 15px; + color: #484545; +} + +.layuimini-tab-make{ + position: absolute; + top: 36px; + bottom: 0px; + width: 100%; + background: rgb(255, 255, 255,0); + padding: 0px; + overflow: hidden; +} + +/** +菜单缩放 + */ +.popup-tips .layui-layer-TipsG{ + display: none; +} +.popup-tips.layui-layer-tips .layui-layer-content{ + padding: 0; +} +.popup-tips .layui-nav-tree{ + width: 150px; + border-radius: 10px; +} + +/**左侧菜单字体间距*/ +.layuimini-menu-left .layui-nav-item a span { + letter-spacing: 1px; +} + +/**头部菜单字体间距*/ +.layui-layout-admin .layui-header .layuimini-header-menu.layuimini-pc-show,.layui-layout-admin .layui-header .layuimini-header-menu.layuimini-mobile-show { + letter-spacing: 1px; +} + + +/**左侧菜单更多下拉样式*/ +.layuimini-menu-left .layui-nav-more,.layuimini-menu-left-zoom .layui-nav-more { + font-family: layui-icon !important; + font-size: 12px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + overflow: hidden; + width: auto; + height: auto; + line-height: normal; + border: none; + display: inline-block; + margin-top: -6px !important; +} + +.layuimini-menu-left .layui-nav-child .layui-nav-more { + margin-top: -6px !important; +} + +.layuimini-menu-left .layui-nav .layui-nav-mored,.layuimini-menu-left .layui-nav-itemed>a .layui-nav-more{ + margin-top: -9px!important; +} + +.layuimini-menu-left-zoom.layui-nav .layui-nav-mored,.layuimini-menu-left-zoom.layui-nav-itemed>a .layui-nav-more{ + margin-top: -9px!important; +} + +.layuimini-menu-left .layui-nav-more:before,.layuimini-menu-left-zoom .layui-nav-more:before { + content: "\e61a"; +} +.layuimini-menu-left .layui-nav-itemed > a > .layui-nav-more,.layuimini-menu-left-zoom .layui-nav-itemed > a > .layui-nav-more { + transform: rotate(180deg); + -ms-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -webkit-transform: rotate(180deg); + -o-transform: rotate(180deg); + width: 12px; + text-align: center; + border-style:none; +} + +.layuimini-menu-left .layui-nav-itemed > a > .layui-nav-more:before,.layuimini-menu-left-zoom .layui-nav-itemed > a > .layui-nav-more:before { + content: '\e61a'; + background-color: transparent; + display: inline-block; + vertical-align: middle; +} + +/**修复左侧菜单字体不对齐的问题*/ +.layuimini-menu-left .layui-nav-item a .fa,.layuimini-menu-left .layui-nav-item a .layui-icon{ + width: 20px; +} + + +/** + PC版样式 + */ +@media screen and (min-width: 1025px) { + /**头部样式(缩放) */ + .layuimini-mini .layui-layout-left.layuimini-header-menu.layuimini-pc-show { + left: 155px !important; + } + + /**logo演示(缩放) */ + .layuimini-mini .layui-layout-admin .layuimini-logo { + width: 60px !important; + } + + .layuimini-mini .layui-layout-admin .layuimini-logo h1 { + display: none; + } + + /**左侧菜单栏(缩放) */ + .layuimini-mini .layuimini-menu-left { + width: 80px !important; + } + + .layuimini-mini .layui-side.layui-bg-black, .layuimini-mini .layuimini-menu-left > ul, .layuimini-mini .layuimini-menu-left > ul li i { + width: 60px !important; + } + + .layuimini-mini .layuimini-menu-left > ul li span:first-child { + display: none; + } + + .layuimini-mini .layuimini-menu-left > ul li span:last-child { + float: right; + right: 7px; + } + + .layuimini-mini .layuimini-menu-left .layui-nav .layui-nav-item a { + height: 40px; + line-height: 40px; + padding-right: 0px !important; + } + + /**内容主体(缩放) */ + .layuimini-mini .layui-layout-admin .layui-body { + left: 60px !important; + } + + .layuimini-mini .layuimini-tool { + left: 95px !important; + } + + .layuimini-pc-show{ + display: block; + } + .layuimini-mobile-show{ + display: none; + } + + /**菜单缩放*/ + .layuimini-mini .layuimini-menu-left .layui-nav-more,.layuimini-mini .layuimini-menu-left .layui-nav-child{ + display: none;!important; + } +} + +/** + 手机自适应样式 +*/ +@media screen and (max-width: 1024px) { + + /** + todo 修复低版本IOS不能滑动问题, 但还是有问题, 低版本IOS部分情况下子页面无法自适应 + */ + .layuimini-tab .layui-tab-content .layui-tab-item { + -webkit-overflow-scrolling: touch; + overflow: scroll; + width: 100%; + height: 100%; + } + + .layuimini-tab .layui-tab-content .layui-tab-item iframe { + height: 100%; + width: 100%; + } + + .layuimini-pc-show{ + display: none; + } + .layuimini-mobile-show{ + display: block; + } + .layuimini-header-content { + left: 0; + } + + .layui-layout-admin .layui-body .layui-tab-item.layui-show { + border-top: 1px solid #e2e2e2; + } + + .layuimini-all .layui-layout-left.layuimini-header-menu { + left: 15px !important + } + + .layuimini-mini .layui-layout-left.layuimini-header-menu { + left: 205px !important + } + + .layui-layout-admin .layui-nav.layui-layout-right > li:not(.layuimini-setting) { + width: 40px !important; + } + + .layui-layout-admin .layui-nav.layui-layout-right > li:not(.layuimini-setting) a { + padding: 0 15px; + } + + .layuimini-all .layui-layout-admin .layui-body { + left: 0px !important; + } + + .layuimini-mini .layui-layout-admin .layuimini-menu-left, .layuimini-mini .layui-header .layuimini-logo { + left: 0; + transition: left .2s; + z-index: 1001 !important; + } + + .layuimini-all .layui-layout-admin .layuimini-menu-left, .layuimini-all .layui-header .layuimini-logo { + left: -200px; + transition: left .2s; + top: 0; + z-index: 1002; + } + + .layuimini-mini .layui-layout-admin .layui-body { + left: 0!important; + transition: left .2s; + top: 0; + z-index: 998; + } + + .layuimini-mini .layuimini-make { + display: block; + } + + .layuimini-multi-module .layuimini-header-content .layuimini-tool { + display: none; + } + + .layuimini-single-module .layuimini-header-content .layuimini-tool { + left: 15px; + } + + .layuimini-mini .layuimini-site-mobile { + display: none !important; + } + + .layuimini-site-mobile { + display: block !important; + position: fixed; + z-index: 100000; + bottom: 15px; + left: 15px; + width: 40px; + height: 40px; + line-height: 40px; + border-radius: 2px; + text-align: center; + background-color: rgba(0, 0, 0, .7); + color: #fff; + } + + .layuimini-header-content { + z-index: 997; + } + + /*修复UC之类的浏览器点击无效*/ + .layuimini-make { + cursor: pointer; + } + + .layuimini-site-mobile { + cursor: pointer; + } +} + +@media screen and (max-width: 550px){ + + /**头部右侧数据*/ + .layuimini-multi-module.layuimini-mini .layuimini-header-content .layui-layout-right { + display: none; + } +} diff --git a/public/admin/css/public.css b/public/admin/css/public.css new file mode 100644 index 0000000..65285a0 --- /dev/null +++ b/public/admin/css/public.css @@ -0,0 +1,70 @@ +body { + margin: 15px 15px 15px 15px; + background: #f2f2f2; +} + +.layuimini-container { + border: 1px solid #f2f2f2; + border-radius: 5px; + background-color: #ffffff +} + +.layuimini-main { + margin: 10px 10px 10px 10px; +} + +/**必填红点 */ +.layuimini-form > .layui-form-item > .required:after { + content: '*'; + color: red; + position: absolute; + margin-left: 4px; + font-weight: bold; + line-height: 1.8em; + top: 6px; + right: 5px; +} + +.layuimini-form > .layui-form-item > .layui-form-label { + width: 120px !important; +} + +.layuimini-form > .layui-form-item > .layui-input-block { + margin-left: 150px !important; +} + +.layuimini-form > .layui-form-item > .layui-input-block > tip { + display: inline-block; + margin-top: 10px; + line-height: 10px; + font-size: 10px; + color: #a29c9c; +} + +/**搜索框*/ +.layuimini-container .table-search-fieldset { + margin: 0; + border: 1px solid #e6e6e6; + padding: 10px 20px 5px 20px; + color: #6b6b6b; +} + +/**自定义滚动条样式 */ +::-webkit-scrollbar { + width: 6px; + height: 6px +} + +::-webkit-scrollbar-track { + background-color: transparent; + -webkit-border-radius: 2em; + -moz-border-radius: 2em; + border-radius: 2em; +} + +::-webkit-scrollbar-thumb { + background-color: #9c9da0; + -webkit-border-radius: 2em; + -moz-border-radius: 2em; + border-radius: 2em +} diff --git a/public/admin/css/themes/default.css b/public/admin/css/themes/default.css new file mode 100644 index 0000000..a586d1d --- /dev/null +++ b/public/admin/css/themes/default.css @@ -0,0 +1,95 @@ +/*头部右侧背景色 headerRightBg */ +.layui-layout-admin .layui-header { + background-color: #ffffff !important; +} + +/*头部右侧选中背景色 headerRightBgThis */ +.layui-layout-admin .layui-header .layuimini-header-content > ul > .layui-nav-item.layui-this, .layuimini-tool i:hover { + background-color: #e4e4e4 !important; +} + +/*头部右侧字体颜色 headerRightColor */ +.layui-layout-admin .layui-header .layui-nav .layui-nav-item a { + color: rgba(107, 107, 107, 0.7); +} + +/**头部右侧下拉字体颜色 headerRightChildColor */ +.layui-layout-admin .layui-header .layui-nav .layui-nav-item .layui-nav-child a { + color: rgba(107, 107, 107, 0.7) !important; +} + +/*头部右侧鼠标选中 headerRightColorThis */ +.layui-header .layuimini-menu-header-pc.layui-nav .layui-nav-item a:hover, .layui-header .layuimini-header-menu.layuimini-pc-show.layui-nav .layui-this a { + color: #565656 !important; +} + +/*头部右侧更多下拉颜色 headerRightNavMore */ +.layui-header .layui-nav .layui-nav-more { + border-top-color: rgba(160, 160, 160, 0.7) !important; +} + +/*头部右侧更多下拉颜色 headerRightNavMore */ +.layui-header .layui-nav .layui-nav-mored, .layui-header .layui-nav-itemed > a .layui-nav-more { + border-color: transparent transparent rgba(160, 160, 160, 0.7) !important; +} + +/**头部右侧更多下拉配置色 headerRightNavMoreBg headerRightNavMoreColor */ +.layui-header .layui-nav .layui-nav-child dd.layui-this a, .layui-header .layui-nav-child dd.layui-this, .layui-layout-admin .layui-header .layui-nav .layui-nav-item .layui-nav-child .layui-this a { + background-color: #1E9FFF !important; + color: #ffffff !important; +} + +/*头部缩放按钮样式 headerRightToolColor */ +.layui-layout-admin .layui-header .layuimini-tool i { + color: #565656; +} + +/*logo背景颜色 headerLogoBg */ +.layui-layout-admin .layuimini-logo { + background-color: #192027 !important; +} + +/*logo字体颜色 headerLogoColor */ +.layui-layout-admin .layuimini-logo h1 { + color: rgb(191, 187, 187); +} + +/*左侧菜单更多下拉样式 leftMenuNavMore */ +.layuimini-menu-left .layui-nav .layui-nav-more, .layuimini-menu-left-zoom.layui-nav .layui-nav-more { + border-top-color: rgb(191, 187, 187); +} + +/*左侧菜单更多下拉样式 leftMenuNavMore */ +.layuimini-menu-left .layui-nav .layui-nav-mored, .layuimini-menu-left .layui-nav-itemed > a .layui-nav-more, .layuimini-menu-left-zoom.layui-nav .layui-nav-mored, .layuimini-menu-left-zoom.layui-nav-itemed > a .layui-nav-more { + border-color: transparent transparent rgb(191, 187, 187) !important; +} + +/*左侧菜单背景 leftMenuBg */ +.layui-side.layui-bg-black, .layui-side.layui-bg-black > .layuimini-menu-left > ul, .layuimini-menu-left-zoom > ul { + background-color: #28333E !important; +} + +/*左侧菜单选中背景 leftMenuBgThis */ +.layuimini-menu-left .layui-nav-tree .layui-this, .layuimini-menu-left .layui-nav-tree .layui-this > a, .layuimini-menu-left .layui-nav-tree .layui-nav-child dd.layui-this, .layuimini-menu-left .layui-nav-tree .layui-nav-child dd.layui-this a, .layuimini-menu-left-zoom.layui-nav-tree .layui-this, .layuimini-menu-left-zoom.layui-nav-tree .layui-this > a, .layuimini-menu-left-zoom.layui-nav-tree .layui-nav-child dd.layui-this, .layuimini-menu-left-zoom.layui-nav-tree .layui-nav-child dd.layui-this a { + background-color: #1E9FFF !important +} + +/*左侧菜单子菜单背景 leftMenuChildBg */ +.layuimini-menu-left .layui-nav-itemed > .layui-nav-child { + background-color: #0c0f13 !important; +} + +/*左侧菜单字体颜色 leftMenuColor */ +.layuimini-menu-left .layui-nav .layui-nav-item a, .layuimini-menu-left-zoom.layui-nav .layui-nav-item a { + color: rgb(191, 187, 187) !important; +} + +/*左侧菜单选中字体颜色 leftMenuColorThis */ +.layuimini-menu-left .layui-nav .layui-nav-item a:hover, .layuimini-menu-left .layui-nav .layui-this a, .layuimini-menu-left-zoom.layui-nav .layui-nav-item a:hover, .layuimini-menu-left-zoom.layui-nav .layui-this a { + color: #ffffff !important; +} + +/**tab选项卡选中颜色 tabActiveColor */ +.layuimini-tab .layui-tab-title .layui-this .layuimini-tab-active { + background-color: #1e9fff; +} diff --git a/public/admin/images/bg.jpg b/public/admin/images/bg.jpg new file mode 100644 index 0000000..d5870f5 Binary files /dev/null and b/public/admin/images/bg.jpg differ diff --git a/public/admin/images/captcha.jpg b/public/admin/images/captcha.jpg new file mode 100644 index 0000000..92b2a33 Binary files /dev/null and b/public/admin/images/captcha.jpg differ diff --git a/public/admin/images/favicon.ico b/public/admin/images/favicon.ico new file mode 100644 index 0000000..e2a42b0 Binary files /dev/null and b/public/admin/images/favicon.ico differ diff --git a/public/admin/images/home.png b/public/admin/images/home.png new file mode 100644 index 0000000..348ff27 Binary files /dev/null and b/public/admin/images/home.png differ diff --git a/public/admin/images/icon-login.png b/public/admin/images/icon-login.png new file mode 100644 index 0000000..1db2f96 Binary files /dev/null and b/public/admin/images/icon-login.png differ diff --git a/public/admin/images/loginbg.png b/public/admin/images/loginbg.png new file mode 100644 index 0000000..675c74b Binary files /dev/null and b/public/admin/images/loginbg.png differ diff --git a/public/admin/index.html b/public/admin/index.html new file mode 100644 index 0000000..9d1e34d --- /dev/null +++ b/public/admin/index.html @@ -0,0 +1,179 @@ + + + + + 后台管理中心 - 彩虹工具网 + + + + + + + + + + + + + + + + +
+ +
+ + +
+ +
+
+ + +
    +
+ + + + + +
+
+ + +
+
+ + +
+
+
+ + +
+ + +
+ +
+ +
+
    +
  • +
+
+
  • +
  • +
  • + +
  • +
    +
    +
    +
    +
    + +
    +
    + + + + + + diff --git a/public/admin/js/api.js b/public/admin/js/api.js new file mode 100644 index 0000000..1a3da79 --- /dev/null +++ b/public/admin/js/api.js @@ -0,0 +1,76 @@ +const $ = layui.jquery; + +const request = (url, data, params) => { + + return new Promise((resolve, reject) => { + contentType = 'application/x-www-form-urlencoded'; + if (data !== null && data !== undefined && (data.length > 0 || Object.keys(data).length > 0) && typeof data == 'object') { + data = JSON.stringify(data) + contentType = 'application/json' + } + $.ajax({ + url: url, + type: params && params.type || 'post', + dataType: params && params.dataType || 'JSON', + contentType: contentType, + data: data, + success: function (res) { + resolve(res) + }, + error: function (res) { + reject(res.message) + } + }); + }); + +} +const httpGet = (url) => { + return request(url, {}, { + type: 'GET', + }).then(res => { + if (res.status !== 'ok') { + $message.error(res.message); + } + return res + }) +} +const httpDelete = (url, data) => { + return request(url, data, { + type: 'DELETE', + }).then(res => { + if (res.status !== 'ok') { + $message.error(res.message); + } + return res + }) +} +const httpPost = (url, data) => { + return request(url, data, { + type: 'POST', + }).then(res => { + if (res.status !== 'ok') { + $message.error(res.message); + } + return res + }) +} +const httpPut = (url, data) => { + return request(url, data, { + type: 'PUT', + }).then(res => { + if (res.status !== 'ok') { + $message.error(res.message); + } + return res + }) +} +const httpPatch = (url, data) => { + return request(url, data, { + type: 'PATCH', + }).then(res => { + if (res.status !== 'ok') { + $message.error(res.message); + } + return res + }) +} diff --git a/public/admin/js/common.js b/public/admin/js/common.js new file mode 100644 index 0000000..c5fdda3 --- /dev/null +++ b/public/admin/js/common.js @@ -0,0 +1,113 @@ +const parse_table = { + parseData: function (res) { //res 即为原始返回的数据 + return { + "status": res.status, //解析接口状态 + "message": res.message, //解析提示文本 + "total": res.data.total, //解析数据长度 + "data": res.data.items //解析数据列表 + } + }, + response: { + statusName: 'status' //规定数据状态的字段名称,默认:code + , statusCode: 'ok' //规定成功的状态码,默认:0 + , msgName: 'message' //规定状态信息的字段名称,默认:msg + , countName: 'total' //规定数据总数的字段名称,默认:count + , dataName: 'data' //规定数据列表的字段名称,默认:data + }, +}; + +const imagePreview = (url) => { + layer.open({ + type: 1, + title: false, + closeBtn: 0, + shadeClose: true, + skin: 'layui-layer-molv', + content: `` + }); +} +const getQueryString = (name) => { + var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i'); + var r = window.location.search.substr(1).match(reg); + if (r != null) { + return unescape(r[2]); + } + return null; +} + +const $message = { + success: (message = 'success', callback = () => { + }) => { + message = ''+message+'' + layer.msg(message, { + icon: 1, + time: 800 + }, callback) + }, + error: (message = 'error', callback = () => { + }) => { + message = ''+message+'' + layer.msg(message, {icon: 2}, callback); + }, + +} + +const dateFormat = (date, format = 'YYYY-MM-DD HH:mm:ss') => { + const config = { + YYYY: date.getFullYear(), + MM: date.getMonth() < 9 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1, + DD: date.getDate() < 10 ? '0' + date.getDate() : date.getDate(), + HH: date.getHours() < 10 ? '0' + date.getHours() : date.getHours(), + mm: date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes(), + ss: date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds(), + } + for (const key in config) { + format = format.replace(key, config[key]) + } + return format +} + +window.onscroll = function () { + var scrollTop = document.documentElement.scrollTop ? + document.documentElement.scrollTop : + document.body.scrollTop; + let dom = document.getElementById('back-to-top') + if (dom) { + if (scrollTop > 200) { + dom.style.visibility = "visible" + } else { + dom.style.visibility = "hidden" + } + } +} +const scrollTopSmooth = () => { + const easeout = (position, destination, rate, callback) => { + if (position === destination || typeof destination !== 'number') { + return false; + } + destination = destination || 0; + rate = rate || 2; + + // 不存在原生`requestAnimationFrame`,用`setTimeout`模拟替代 + if (!window.requestAnimationFrame) { + window.requestAnimationFrame = function (fn) { + return setTimeout(fn, 17); + } + } + const step = function () { + position = position + (destination - position) / rate; + if (position < 1) { + callback(destination, true); + return; + } + callback(position, false); + requestAnimationFrame(step); + }; + step(); + } + // 当前滚动高度 + const scrollTop = document.documentElement.scrollTop || document.body.scrollTop; + easeout(scrollTop, 0, 5, function (val) { + window.scrollTo(0, val); + }); +} diff --git a/public/admin/js/lay-config.js b/public/admin/js/lay-config.js new file mode 100644 index 0000000..c664f04 --- /dev/null +++ b/public/admin/js/lay-config.js @@ -0,0 +1,30 @@ +/** + * date:2019/08/16 + * author:Mr.Chung + * description:此处放layui自定义扩展 + * version:2.0.4 + */ + +window.rootPath = (function (src) { + src = document.scripts[document.scripts.length - 1].src; + return src.substring(0, src.lastIndexOf("/") + 1); +})(); + +layui.config({ + base: rootPath + "lay-module/", + version: true +}).extend({ + miniAdmin: "layuimini/miniAdmin", // layuimini后台扩展 + miniMenu: "layuimini/miniMenu", // layuimini菜单扩展 + miniTab: "layuimini/miniTab", // layuimini tab扩展 + miniTheme: "layuimini/miniTheme", // layuimini 主题扩展 + miniTongji: "layuimini/miniTongji", // layuimini 统计扩展 + step: 'step-lay/step', // 分步表单扩展 + treetable: 'treetable-lay/treetable', //table树形扩展 + tableSelect: 'tableSelect/tableSelect', // table选择扩展 + iconPickerFa: 'iconPicker/iconPickerFa', // fa图标选择扩展 + echarts: 'echarts/echarts', // echarts图表扩展 + echartsTheme: 'echarts/echartsTheme', // echarts图表主题扩展 + wangEditor: 'wangEditor/wangEditor', // wangEditor富文本扩展 + layarea: 'layarea/layarea', // 省市县区三级联动下拉选择器 +}); diff --git a/public/admin/js/lay-module/echarts/echarts.js b/public/admin/js/lay-module/echarts/echarts.js new file mode 100644 index 0000000..2713e4d --- /dev/null +++ b/public/admin/js/lay-module/echarts/echarts.js @@ -0,0 +1,19 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e(t.echarts={})}(this,function(t){"use strict";function e(t){var e={},i={},n=t.match(/Firefox\/([\d.]+)/),r=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),a=t.match(/Edge\/([\d.]+)/),o=/micromessenger/i.test(t);return n&&(i.firefox=!0,i.version=n[1]),r&&(i.ie=!0,i.version=r[1]),a&&(i.edge=!0,i.version=a[1]),o&&(i.weChat=!0),{browser:i,os:e,node:!1,canvasSupported:!!document.createElement("canvas").getContext,svgSupported:"undefined"!=typeof SVGRect,touchEventsSupported:"ontouchstart"in window&&!i.ie&&!i.edge,pointerEventsSupported:"onpointerdown"in window&&(i.edge||i.ie&&i.version>=11),domSupported:"undefined"!=typeof document}}function i(t,e){"createCanvas"===t&&(dg=null),ug[t]=e}function n(t){if(null==t||"object"!=typeof t)return t;var e=t,i=ng.call(t);if("[object Array]"===i){if(!R(t)){e=[];for(var r=0,a=t.length;a>r;r++)e[r]=n(t[r])}}else if(ig[i]){if(!R(t)){var o=t.constructor;if(t.constructor.from)e=o.from(t);else{e=new o(t.length);for(var r=0,a=t.length;a>r;r++)e[r]=n(t[r])}}}else if(!eg[i]&&!R(t)&&!T(t)){e={};for(var s in t)t.hasOwnProperty(s)&&(e[s]=n(t[s]))}return e}function r(t,e,i){if(!S(e)||!S(t))return i?n(e):t;for(var a in e)if(e.hasOwnProperty(a)){var o=t[a],s=e[a];!S(s)||!S(o)||_(s)||_(o)||T(s)||T(o)||M(s)||M(o)||R(s)||R(o)?!i&&a in t||(t[a]=n(e[a],!0)):r(o,s,i)}return t}function a(t,e){for(var i=t[0],n=1,a=t.length;a>n;n++)i=r(i,t[n],e);return i}function o(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t}function s(t,e,i){for(var n in e)e.hasOwnProperty(n)&&(i?null!=e[n]:null==t[n])&&(t[n]=e[n]);return t}function l(){return dg||(dg=cg().getContext("2d")),dg}function h(t,e){if(t){if(t.indexOf)return t.indexOf(e);for(var i=0,n=t.length;n>i;i++)if(t[i]===e)return i}return-1}function u(t,e){function i(){}var n=t.prototype;i.prototype=e.prototype,t.prototype=new i;for(var r in n)t.prototype[r]=n[r];t.prototype.constructor=t,t.superClass=e}function c(t,e,i){t="prototype"in t?t.prototype:t,e="prototype"in e?e.prototype:e,s(t,e,i)}function d(t){return t?"string"==typeof t?!1:"number"==typeof t.length:void 0}function f(t,e,i){if(t&&e)if(t.forEach&&t.forEach===ag)t.forEach(e,i);else if(t.length===+t.length)for(var n=0,r=t.length;r>n;n++)e.call(i,t[n],n,t);else for(var a in t)t.hasOwnProperty(a)&&e.call(i,t[a],a,t)}function p(t,e,i){if(t&&e){if(t.map&&t.map===lg)return t.map(e,i);for(var n=[],r=0,a=t.length;a>r;r++)n.push(e.call(i,t[r],r,t));return n}}function g(t,e,i,n){if(t&&e){if(t.reduce&&t.reduce===hg)return t.reduce(e,i,n);for(var r=0,a=t.length;a>r;r++)i=e.call(n,i,t[r],r,t);return i}}function v(t,e,i){if(t&&e){if(t.filter&&t.filter===og)return t.filter(e,i);for(var n=[],r=0,a=t.length;a>r;r++)e.call(i,t[r],r,t)&&n.push(t[r]);return n}}function m(t,e,i){if(t&&e)for(var n=0,r=t.length;r>n;n++)if(e.call(i,t[n],n,t))return t[n]}function y(t,e){var i=sg.call(arguments,2);return function(){return t.apply(e,i.concat(sg.call(arguments)))}}function x(t){var e=sg.call(arguments,1);return function(){return t.apply(this,e.concat(sg.call(arguments)))}}function _(t){return"[object Array]"===ng.call(t)}function w(t){return"function"==typeof t}function b(t){return"[object String]"===ng.call(t)}function S(t){var e=typeof t;return"function"===e||!!t&&"object"==e}function M(t){return!!eg[ng.call(t)]}function I(t){return!!ig[ng.call(t)]}function T(t){return"object"==typeof t&&"number"==typeof t.nodeType&&"object"==typeof t.ownerDocument}function C(t){return t!==t}function A(){for(var t=0,e=arguments.length;e>t;t++)if(null!=arguments[t])return arguments[t]}function D(t,e){return null!=t?t:e}function k(t,e,i){return null!=t?t:null!=e?e:i}function P(){return Function.call.apply(sg,arguments)}function L(t){if("number"==typeof t)return[t,t,t,t];var e=t.length;return 2===e?[t[0],t[1],t[0],t[1]]:3===e?[t[0],t[1],t[2],t[1]]:t}function O(t,e){if(!t)throw new Error(e)}function z(t){return null==t?null:"function"==typeof t.trim?t.trim():t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}function E(t){t[fg]=!0}function R(t){return t[fg]}function B(t){function e(t,e){i?n.set(t,e):n.set(e,t)}var i=_(t);this.data={};var n=this;t instanceof B?t.each(e):t&&f(t,e)}function N(t){return new B(t)}function F(t,e){for(var i=new t.constructor(t.length+e.length),n=0;n=0;if(r){var a="touchend"!=n?e.targetTouches[0]:e.changedTouches[0];a&&de(t,a,e,i)}else de(t,e,e,i),e.zrDelta=e.wheelDelta?e.wheelDelta/120:-(e.detail||0)/3;var o=e.button;return null==e.which&&void 0!==o&&Mg.test(e.type)&&(e.which=1&o?1:2&o?3:4&o?2:0),e}function ge(t,e,i){Sg?t.addEventListener(e,i):t.attachEvent("on"+e,i)}function ve(t,e,i){Sg?t.removeEventListener(e,i):t.detachEvent("on"+e,i)}function me(t){return t.which>1}function ye(t,e,i){return{type:t,event:i,target:e.target,topTarget:e.topTarget,cancelBubble:!1,offsetX:i.zrX,offsetY:i.zrY,gestureEvent:i.gestureEvent,pinchX:i.pinchX,pinchY:i.pinchY,pinchScale:i.pinchScale,wheelDelta:i.zrDelta,zrByTouch:i.zrByTouch,which:i.which,stop:xe}}function xe(){Ig(this.event)}function _e(){}function we(t,e,i){if(t[t.rectHover?"rectContain":"contain"](e,i)){for(var n,r=t;r;){if(r.clipPath&&!r.clipPath.contain(e,i))return!1;r.silent&&(n=!0),r=r.parent}return n?Tg:!0}return!1}function be(){var t=new Dg(6);return Se(t),t}function Se(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t}function Me(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t}function Ie(t,e,i){var n=e[0]*i[0]+e[2]*i[1],r=e[1]*i[0]+e[3]*i[1],a=e[0]*i[2]+e[2]*i[3],o=e[1]*i[2]+e[3]*i[3],s=e[0]*i[4]+e[2]*i[5]+e[4],l=e[1]*i[4]+e[3]*i[5]+e[5];return t[0]=n,t[1]=r,t[2]=a,t[3]=o,t[4]=s,t[5]=l,t}function Te(t,e,i){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+i[0],t[5]=e[5]+i[1],t}function Ce(t,e,i){var n=e[0],r=e[2],a=e[4],o=e[1],s=e[3],l=e[5],h=Math.sin(i),u=Math.cos(i);return t[0]=n*u+o*h,t[1]=-n*h+o*u,t[2]=r*u+s*h,t[3]=-r*h+u*s,t[4]=u*a+h*l,t[5]=u*l-h*a,t}function Ae(t,e,i){var n=i[0],r=i[1];return t[0]=e[0]*n,t[1]=e[1]*r,t[2]=e[2]*n,t[3]=e[3]*r,t[4]=e[4]*n,t[5]=e[5]*r,t}function De(t,e){var i=e[0],n=e[2],r=e[4],a=e[1],o=e[3],s=e[5],l=i*o-a*n;return l?(l=1/l,t[0]=o*l,t[1]=-a*l,t[2]=-n*l,t[3]=i*l,t[4]=(n*s-o*r)*l,t[5]=(a*r-i*s)*l,t):null}function ke(t){var e=be();return Me(e,t),e}function Pe(t){return t>Lg||-Lg>t}function Le(t){this._target=t.target,this._life=t.life||1e3,this._delay=t.delay||0,this._initialized=!1,this.loop=null==t.loop?!1:t.loop,this.gap=t.gap||0,this.easing=t.easing||"Linear",this.onframe=t.onframe,this.ondestroy=t.ondestroy,this.onrestart=t.onrestart,this._pausedTime=0,this._paused=!1}function Oe(t){return t=Math.round(t),0>t?0:t>255?255:t}function ze(t){return t=Math.round(t),0>t?0:t>360?360:t}function Ee(t){return 0>t?0:t>1?1:t}function Re(t){return Oe(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100*255:parseInt(t,10))}function Be(t){return Ee(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100:parseFloat(t))}function Ne(t,e,i){return 0>i?i+=1:i>1&&(i-=1),1>6*i?t+(e-t)*i*6:1>2*i?e:2>3*i?t+(e-t)*(2/3-i)*6:t}function Fe(t,e,i){return t+(e-t)*i}function Ve(t,e,i,n,r){return t[0]=e,t[1]=i,t[2]=n,t[3]=r,t}function We(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}function Ge(t,e){Yg&&We(Yg,e),Yg=Xg.put(t,Yg||e.slice())}function He(t,e){if(t){e=e||[];var i=Xg.get(t);if(i)return We(e,i);t+="";var n=t.replace(/ /g,"").toLowerCase();if(n in Zg)return We(e,Zg[n]),Ge(t,e),e;if("#"!==n.charAt(0)){var r=n.indexOf("("),a=n.indexOf(")");if(-1!==r&&a+1===n.length){var o=n.substr(0,r),s=n.substr(r+1,a-(r+1)).split(","),l=1;switch(o){case"rgba":if(4!==s.length)return void Ve(e,0,0,0,1);l=Be(s.pop());case"rgb":return 3!==s.length?void Ve(e,0,0,0,1):(Ve(e,Re(s[0]),Re(s[1]),Re(s[2]),l),Ge(t,e),e);case"hsla":return 4!==s.length?void Ve(e,0,0,0,1):(s[3]=Be(s[3]),Ze(s,e),Ge(t,e),e);case"hsl":return 3!==s.length?void Ve(e,0,0,0,1):(Ze(s,e),Ge(t,e),e);default:return}}Ve(e,0,0,0,1)}else{if(4===n.length){var h=parseInt(n.substr(1),16);return h>=0&&4095>=h?(Ve(e,(3840&h)>>4|(3840&h)>>8,240&h|(240&h)>>4,15&h|(15&h)<<4,1),Ge(t,e),e):void Ve(e,0,0,0,1)}if(7===n.length){var h=parseInt(n.substr(1),16);return h>=0&&16777215>=h?(Ve(e,(16711680&h)>>16,(65280&h)>>8,255&h,1),Ge(t,e),e):void Ve(e,0,0,0,1)}}}}function Ze(t,e){var i=(parseFloat(t[0])%360+360)%360/360,n=Be(t[1]),r=Be(t[2]),a=.5>=r?r*(n+1):r+n-r*n,o=2*r-a;return e=e||[],Ve(e,Oe(255*Ne(o,a,i+1/3)),Oe(255*Ne(o,a,i)),Oe(255*Ne(o,a,i-1/3)),1),4===t.length&&(e[3]=t[3]),e}function Xe(t){if(t){var e,i,n=t[0]/255,r=t[1]/255,a=t[2]/255,o=Math.min(n,r,a),s=Math.max(n,r,a),l=s-o,h=(s+o)/2;if(0===l)e=0,i=0;else{i=.5>h?l/(s+o):l/(2-s-o);var u=((s-n)/6+l/2)/l,c=((s-r)/6+l/2)/l,d=((s-a)/6+l/2)/l;n===s?e=d-c:r===s?e=1/3+u-d:a===s&&(e=2/3+c-u),0>e&&(e+=1),e>1&&(e-=1)}var f=[360*e,i,h];return null!=t[3]&&f.push(t[3]),f}}function Ye(t,e){var i=He(t);if(i){for(var n=0;3>n;n++)i[n]=0>e?i[n]*(1-e)|0:(255-i[n])*e+i[n]|0,i[n]>255?i[n]=255:t[n]<0&&(i[n]=0);return Qe(i,4===i.length?"rgba":"rgb")}}function je(t){var e=He(t);return e?((1<<24)+(e[0]<<16)+(e[1]<<8)+ +e[2]).toString(16).slice(1):void 0}function qe(t,e,i){if(e&&e.length&&t>=0&&1>=t){i=i||[];var n=t*(e.length-1),r=Math.floor(n),a=Math.ceil(n),o=e[r],s=e[a],l=n-r;return i[0]=Oe(Fe(o[0],s[0],l)),i[1]=Oe(Fe(o[1],s[1],l)),i[2]=Oe(Fe(o[2],s[2],l)),i[3]=Ee(Fe(o[3],s[3],l)),i}}function Ue(t,e,i){if(e&&e.length&&t>=0&&1>=t){var n=t*(e.length-1),r=Math.floor(n),a=Math.ceil(n),o=He(e[r]),s=He(e[a]),l=n-r,h=Qe([Oe(Fe(o[0],s[0],l)),Oe(Fe(o[1],s[1],l)),Oe(Fe(o[2],s[2],l)),Ee(Fe(o[3],s[3],l))],"rgba");return i?{color:h,leftIndex:r,rightIndex:a,value:n}:h}}function $e(t,e,i,n){return t=He(t),t?(t=Xe(t),null!=e&&(t[0]=ze(e)),null!=i&&(t[1]=Be(i)),null!=n&&(t[2]=Be(n)),Qe(Ze(t),"rgba")):void 0}function Ke(t,e){return t=He(t),t&&null!=e?(t[3]=Ee(e),Qe(t,"rgba")):void 0}function Qe(t,e){if(t&&t.length){var i=t[0]+","+t[1]+","+t[2];return("rgba"===e||"hsva"===e||"hsla"===e)&&(i+=","+t[3]),e+"("+i+")"}}function Je(t,e){return t[e]}function ti(t,e,i){t[e]=i}function ei(t,e,i){return(e-t)*i+t}function ii(t,e,i){return i>.5?e:t}function ni(t,e,i,n,r){var a=t.length;if(1==r)for(var o=0;a>o;o++)n[o]=ei(t[o],e[o],i);else for(var s=a&&t[0].length,o=0;a>o;o++)for(var l=0;s>l;l++)n[o][l]=ei(t[o][l],e[o][l],i)}function ri(t,e,i){var n=t.length,r=e.length;if(n!==r){var a=n>r;if(a)t.length=r;else for(var o=n;r>o;o++)t.push(1===i?e[o]:$g.call(e[o]))}for(var s=t[0]&&t[0].length,o=0;ol;l++)isNaN(t[o][l])&&(t[o][l]=e[o][l])}function ai(t,e,i){if(t===e)return!0;var n=t.length;if(n!==e.length)return!1;if(1===i){for(var r=0;n>r;r++)if(t[r]!==e[r])return!1}else for(var a=t[0].length,r=0;n>r;r++)for(var o=0;a>o;o++)if(t[r][o]!==e[r][o])return!1;return!0}function oi(t,e,i,n,r,a,o,s,l){var h=t.length;if(1==l)for(var u=0;h>u;u++)s[u]=si(t[u],e[u],i[u],n[u],r,a,o);else for(var c=t[0].length,u=0;h>u;u++)for(var d=0;c>d;d++)s[u][d]=si(t[u][d],e[u][d],i[u][d],n[u][d],r,a,o)}function si(t,e,i,n,r,a,o){var s=.5*(i-t),l=.5*(n-e);return(2*(e-i)+s+l)*o+(-3*(e-i)-2*s-l)*a+s*r+e}function li(t){if(d(t)){var e=t.length;if(d(t[0])){for(var i=[],n=0;e>n;n++)i.push($g.call(t[n]));return i}return $g.call(t)}return t}function hi(t){return t[0]=Math.floor(t[0]),t[1]=Math.floor(t[1]),t[2]=Math.floor(t[2]),"rgba("+t.join(",")+")"}function ui(t){var e=t[t.length-1].value;return d(e&&e[0])?2:1}function ci(t,e,i,n,r,a){var o=t._getter,s=t._setter,l="spline"===e,h=n.length;if(h){var u,c=n[0].value,f=d(c),p=!1,g=!1,v=f?ui(n):0;n.sort(function(t,e){return t.time-e.time}),u=n[h-1].time;for(var m=[],y=[],x=n[0].value,_=!0,w=0;h>w;w++){m.push(n[w].time/u);var b=n[w].value;if(f&&ai(b,x,v)||!f&&b===x||(_=!1),x=b,"string"==typeof b){var S=He(b);S?(b=S,p=!0):g=!0}y.push(b)}if(a||!_){for(var M=y[h-1],w=0;h-1>w;w++)f?ri(y[w],M,v):!isNaN(y[w])||isNaN(M)||g||p||(y[w]=M);f&&ri(o(t._target,r),M,v);var I,T,C,A,D,k,P=0,L=0;if(p)var O=[0,0,0,0];var z=function(t,e){var i;if(0>e)i=0;else if(L>e){for(I=Math.min(P+1,h-1),i=I;i>=0&&!(m[i]<=e);i--);i=Math.min(i,h-2)}else{for(i=P;h>i&&!(m[i]>e);i++);i=Math.min(i-1,h-2)}P=i,L=e;var n=m[i+1]-m[i];if(0!==n)if(T=(e-m[i])/n,l)if(A=y[i],C=y[0===i?i:i-1],D=y[i>h-2?h-1:i+1],k=y[i>h-3?h-1:i+2],f)oi(C,A,D,k,T,T*T,T*T*T,o(t,r),v);else{var a;if(p)a=oi(C,A,D,k,T,T*T,T*T*T,O,1),a=hi(O);else{if(g)return ii(A,D,T);a=si(C,A,D,k,T,T*T,T*T*T)}s(t,r,a)}else if(f)ni(y[i],y[i+1],T,o(t,r),v);else{var a;if(p)ni(y[i],y[i+1],T,O,1),a=hi(O);else{if(g)return ii(y[i],y[i+1],T);a=ei(y[i],y[i+1],T)}s(t,r,a)}},E=new Le({target:t._target,life:u,loop:t._loop,delay:t._delay,onframe:z,ondestroy:i});return e&&"spline"!==e&&(E.easing=e),E}}}function di(t,e,i,n,r,a,o,s){function l(){u--,u||a&&a()}b(n)?(a=r,r=n,n=0):w(r)?(a=r,r="linear",n=0):w(n)?(a=n,n=0):w(i)?(a=i,i=500):i||(i=500),t.stopAnimation(),fi(t,"",t,e,i,n,s);var h=t.animators.slice(),u=h.length;u||a&&a();for(var c=0;c0&&t.animate(e,!1).when(null==r?500:r,s).delay(a||0)}function pi(t,e,i,n){if(e){var r={};r[e]={},r[e][i]=n,t.attr(r)}else t.attr(i,n)}function gi(t,e,i,n){0>i&&(t+=i,i=-i),0>n&&(e+=n,n=-n),this.x=t,this.y=e,this.width=i,this.height=n}function vi(t){for(var e=0;t>=hv;)e|=1&t,t>>=1;return t+e}function mi(t,e,i,n){var r=e+1;if(r===i)return 1;if(n(t[r++],t[e])<0){for(;i>r&&n(t[r],t[r-1])<0;)r++;yi(t,e,r)}else for(;i>r&&n(t[r],t[r-1])>=0;)r++;return r-e}function yi(t,e,i){for(i--;i>e;){var n=t[e];t[e++]=t[i],t[i--]=n}}function xi(t,e,i,n,r){for(n===e&&n++;i>n;n++){for(var a,o=t[n],s=e,l=n;l>s;)a=s+l>>>1,r(o,t[a])<0?l=a:s=a+1;var h=n-s;switch(h){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;h>0;)t[s+h]=t[s+h-1],h--}t[s]=o}}function _i(t,e,i,n,r,a){var o=0,s=0,l=1;if(a(t,e[i+r])>0){for(s=n-r;s>l&&a(t,e[i+r+l])>0;)o=l,l=(l<<1)+1,0>=l&&(l=s);l>s&&(l=s),o+=r,l+=r}else{for(s=r+1;s>l&&a(t,e[i+r-l])<=0;)o=l,l=(l<<1)+1,0>=l&&(l=s);l>s&&(l=s);var h=o;o=r-l,l=r-h}for(o++;l>o;){var u=o+(l-o>>>1);a(t,e[i+u])>0?o=u+1:l=u}return l}function wi(t,e,i,n,r,a){var o=0,s=0,l=1;if(a(t,e[i+r])<0){for(s=r+1;s>l&&a(t,e[i+r-l])<0;)o=l,l=(l<<1)+1,0>=l&&(l=s);l>s&&(l=s);var h=o;o=r-l,l=r-h}else{for(s=n-r;s>l&&a(t,e[i+r+l])>=0;)o=l,l=(l<<1)+1,0>=l&&(l=s);l>s&&(l=s),o+=r,l+=r}for(o++;l>o;){var u=o+(l-o>>>1);a(t,e[i+u])<0?l=u:o=u+1}return l}function bi(t,e){function i(t,e){l[c]=t,h[c]=e,c+=1}function n(){for(;c>1;){var t=c-2;if(t>=1&&h[t-1]<=h[t]+h[t+1]||t>=2&&h[t-2]<=h[t]+h[t-1])h[t-1]h[t+1])break;a(t)}}function r(){for(;c>1;){var t=c-2;t>0&&h[t-1]=r?o(n,r,a,u):s(n,r,a,u)))}function o(i,n,r,a){var o=0;for(o=0;n>o;o++)d[o]=t[i+o];var s=0,l=r,h=i;if(t[h++]=t[l++],0!==--a){if(1===n){for(o=0;a>o;o++)t[h+o]=t[l+o];return void(t[h+a]=d[s])}for(var c,f,p,g=u;;){c=0,f=0,p=!1;do if(e(t[l],d[s])<0){if(t[h++]=t[l++],f++,c=0,0===--a){p=!0;break}}else if(t[h++]=d[s++],c++,f=0,1===--n){p=!0;break}while(g>(c|f));if(p)break;do{if(c=wi(t[l],d,s,n,0,e),0!==c){for(o=0;c>o;o++)t[h+o]=d[s+o];if(h+=c,s+=c,n-=c,1>=n){p=!0;break}}if(t[h++]=t[l++],0===--a){p=!0;break}if(f=_i(d[s],t,l,a,0,e),0!==f){for(o=0;f>o;o++)t[h+o]=t[l+o];if(h+=f,l+=f,a-=f,0===a){p=!0;break}}if(t[h++]=d[s++],1===--n){p=!0;break}g--}while(c>=uv||f>=uv);if(p)break;0>g&&(g=0),g+=2}if(u=g,1>u&&(u=1),1===n){for(o=0;a>o;o++)t[h+o]=t[l+o];t[h+a]=d[s]}else{if(0===n)throw new Error;for(o=0;n>o;o++)t[h+o]=d[s+o]}}else for(o=0;n>o;o++)t[h+o]=d[s+o]}function s(i,n,r,a){var o=0;for(o=0;a>o;o++)d[o]=t[r+o];var s=i+n-1,l=a-1,h=r+a-1,c=0,f=0;if(t[h--]=t[s--],0!==--n){if(1===a){for(h-=n,s-=n,f=h+1,c=s+1,o=n-1;o>=0;o--)t[f+o]=t[c+o];return void(t[h]=d[l])}for(var p=u;;){var g=0,v=0,m=!1;do if(e(d[l],t[s])<0){if(t[h--]=t[s--],g++,v=0,0===--n){m=!0;break}}else if(t[h--]=d[l--],v++,g=0,1===--a){m=!0;break}while(p>(g|v));if(m)break;do{if(g=n-wi(d[l],t,i,n,n-1,e),0!==g){for(h-=g,s-=g,n-=g,f=h+1,c=s+1,o=g-1;o>=0;o--)t[f+o]=t[c+o];if(0===n){m=!0;break}}if(t[h--]=d[l--],1===--a){m=!0;break}if(v=a-_i(t[s],d,0,a,a-1,e),0!==v){for(h-=v,l-=v,a-=v,f=h+1,c=l+1,o=0;v>o;o++)t[f+o]=d[c+o];if(1>=a){m=!0;break}}if(t[h--]=t[s--],0===--n){m=!0;break}p--}while(g>=uv||v>=uv);if(m)break;0>p&&(p=0),p+=2}if(u=p,1>u&&(u=1),1===a){for(h-=n,s-=n,f=h+1,c=s+1,o=n-1;o>=0;o--)t[f+o]=t[c+o];t[h]=d[l]}else{if(0===a)throw new Error;for(c=h-(a-1),o=0;a>o;o++)t[c+o]=d[o]}}else for(c=h-(a-1),o=0;a>o;o++)t[c+o]=d[o]}var l,h,u=uv,c=0,d=[];l=[],h=[],this.mergeRuns=n,this.forceMergeRuns=r,this.pushRun=i}function Si(t,e,i,n){i||(i=0),n||(n=t.length);var r=n-i;if(!(2>r)){var a=0;if(hv>r)return a=mi(t,i,n,e),void xi(t,i,n,i+a,e);var o=new bi(t,e),s=vi(r);do{if(a=mi(t,i,n,e),s>a){var l=r;l>s&&(l=s),xi(t,i,i+l,i+a,e),a=l}o.pushRun(i,a),o.mergeRuns(),r-=a,i+=a}while(0!==r);o.forceMergeRuns()}}function Mi(t,e){return t.zlevel===e.zlevel?t.z===e.z?t.z2-e.z2:t.z-e.z:t.zlevel-e.zlevel}function Ii(t,e,i){var n=null==e.x?0:e.x,r=null==e.x2?1:e.x2,a=null==e.y?0:e.y,o=null==e.y2?0:e.y2;e.global||(n=n*i.width+i.x,r=r*i.width+i.x,a=a*i.height+i.y,o=o*i.height+i.y),n=isNaN(n)?0:n,r=isNaN(r)?1:r,a=isNaN(a)?0:a,o=isNaN(o)?0:o;var s=t.createLinearGradient(n,a,r,o);return s}function Ti(t,e,i){var n=i.width,r=i.height,a=Math.min(n,r),o=null==e.x?.5:e.x,s=null==e.y?.5:e.y,l=null==e.r?.5:e.r;e.global||(o=o*n+i.x,s=s*r+i.y,l*=a);var h=t.createRadialGradient(o,s,0,o,s,l);return h}function Ci(){return!1}function Ai(t,e,i){var n=cg(),r=e.getWidth(),a=e.getHeight(),o=n.style;return o&&(o.position="absolute",o.left=0,o.top=0,o.width=r+"px",o.height=a+"px",n.setAttribute("data-zr-dom-id",t)),n.width=r*i,n.height=a*i,n}function Di(t){if("string"==typeof t){var e=bv.get(t);return e&&e.image}return t}function ki(t,e,i,n,r){if(t){if("string"==typeof t){if(e&&e.__zrImageSrc===t||!i)return e;var a=bv.get(t),o={hostEl:i,cb:n,cbPayload:r};return a?(e=a.image,!Li(e)&&a.pending.push(o)):(!e&&(e=new Image),e.onload=e.onerror=Pi,bv.put(t,e.__cachedImgObj={image:e,pending:[o]}),e.src=e.__zrImageSrc=t),e}return t}return e}function Pi(){var t=this.__cachedImgObj;this.onload=this.onerror=this.__cachedImgObj=null;for(var e=0;ea;a++)r=Math.max(Yi(n[a],e).width,r);return Mv>Iv&&(Mv=0,Sv={}),Mv++,Sv[i]=r,r}function Ei(t,e,i,n,r,a,o){return a?Bi(t,e,i,n,r,a,o):Ri(t,e,i,n,r,o)}function Ri(t,e,i,n,r,a){var o=ji(t,e,r,a),s=zi(t,e);r&&(s+=r[1]+r[3]);var l=o.outerHeight,h=Ni(0,s,i),u=Fi(0,l,n),c=new gi(h,u,s,l);return c.lineHeight=o.lineHeight,c}function Bi(t,e,i,n,r,a,o){var s=qi(t,{rich:a,truncate:o,font:e,textAlign:i,textPadding:r}),l=s.outerWidth,h=s.outerHeight,u=Ni(0,l,i),c=Fi(0,h,n);return new gi(u,c,l,h)}function Ni(t,e,i){return"right"===i?t-=e:"center"===i&&(t-=e/2),t}function Fi(t,e,i){return"middle"===i?t-=e/2:"bottom"===i&&(t-=e),t}function Vi(t,e,i){var n=e.x,r=e.y,a=e.height,o=e.width,s=a/2,l="left",h="top";switch(t){case"left":n-=i,r+=s,l="right",h="middle";break;case"right":n+=i+o,r+=s,h="middle";break;case"top":n+=o/2,r-=i,l="center",h="bottom";break;case"bottom":n+=o/2,r+=a+i,l="center";break;case"inside":n+=o/2,r+=s,l="center",h="middle";break;case"insideLeft":n+=i,r+=s,h="middle";break;case"insideRight":n+=o-i,r+=s,l="right",h="middle";break;case"insideTop":n+=o/2,r+=i,l="center";break;case"insideBottom":n+=o/2,r+=a-i,l="center",h="bottom";break;case"insideTopLeft":n+=i,r+=i;break;case"insideTopRight":n+=o-i,r+=i,l="right";break;case"insideBottomLeft":n+=i,r+=a-i,h="bottom";break;case"insideBottomRight":n+=o-i,r+=a-i,l="right",h="bottom"}return{x:n,y:r,textAlign:l,textVerticalAlign:h}}function Wi(t,e,i,n,r){if(!e)return"";var a=(t+"").split("\n");r=Gi(e,i,n,r);for(var o=0,s=a.length;s>o;o++)a[o]=Hi(a[o],r);return a.join("\n")}function Gi(t,e,i,n){n=o({},n),n.font=e;var i=D(i,"...");n.maxIterations=D(n.maxIterations,2);var r=n.minChar=D(n.minChar,0);n.cnCharWidth=zi("国",e);var a=n.ascCharWidth=zi("a",e);n.placeholder=D(n.placeholder,"");for(var s=t=Math.max(0,t-1),l=0;r>l&&s>=a;l++)s-=a;var h=zi(i);return h>s&&(i="",h=0),s=t-h,n.ellipsis=i,n.ellipsisWidth=h,n.contentWidth=s,n.containerWidth=t,n}function Hi(t,e){var i=e.containerWidth,n=e.font,r=e.contentWidth;if(!i)return"";var a=zi(t,n);if(i>=a)return t;for(var o=0;;o++){if(r>=a||o>=e.maxIterations){t+=e.ellipsis;break}var s=0===o?Zi(t,r,e.ascCharWidth,e.cnCharWidth):a>0?Math.floor(t.length*r/a):0;t=t.substr(0,s),a=zi(t,n)}return""===t&&(t=e.placeholder),t}function Zi(t,e,i,n){for(var r=0,a=0,o=t.length;o>a&&e>r;a++){var s=t.charCodeAt(a);r+=s>=0&&127>=s?i:n}return a}function Xi(t){return zi("国",t)}function Yi(t,e){return Av.measureText(t,e)}function ji(t,e,i,n){null!=t&&(t+="");var r=Xi(e),a=t?t.split("\n"):[],o=a.length*r,s=o;if(i&&(s+=i[0]+i[2]),t&&n){var l=n.outerHeight,h=n.outerWidth;if(null!=l&&s>l)t="",a=[];else if(null!=h)for(var u=Gi(h-(i?i[1]+i[3]:0),e,n.ellipsis,{minChar:n.minChar,placeholder:n.placeholder}),c=0,d=a.length;d>c;c++)a[c]=Hi(a[c],u)}return{lines:a,height:o,outerHeight:s,lineHeight:r}}function qi(t,e){var i={lines:[],width:0,height:0};if(null!=t&&(t+=""),!t)return i;for(var n,r=Tv.lastIndex=0;null!=(n=Tv.exec(t));){var a=n.index;a>r&&Ui(i,t.substring(r,a)),Ui(i,n[2],n[1]),r=Tv.lastIndex}rf)return{lines:[],width:0,height:0};x.textWidth=zi(x.text,b);var M=_.textWidth,I=null==M||"auto"===M;if("string"==typeof M&&"%"===M.charAt(M.length-1))x.percentWidth=M,h.push(x),M=0;else{if(I){M=x.textWidth;var T=_.textBackgroundColor,C=T&&T.image;C&&(C=Di(C),Li(C)&&(M=Math.max(M,C.width*S/C.height)))}var A=w?w[1]+w[3]:0;M+=A;var P=null!=d?d-m:null;null!=P&&M>P&&(!I||A>P?(x.text="",x.textWidth=M=0):(x.text=Wi(x.text,P-A,b,c.ellipsis,{minChar:c.minChar}),x.textWidth=zi(x.text,b),M=x.textWidth+A))}m+=x.width=M,_&&(v=Math.max(v,x.lineHeight))}g.width=m,g.lineHeight=v,s+=v,l=Math.max(l,m)}i.outerWidth=i.width=D(e.textWidth,l),i.outerHeight=i.height=D(e.textHeight,s),u&&(i.outerWidth+=u[1]+u[3],i.outerHeight+=u[0]+u[2]);for(var p=0;pl&&(o+=l,l=-l),0>h&&(s+=h,h=-h),"number"==typeof u?i=n=r=a=u:u instanceof Array?1===u.length?i=n=r=a=u[0]:2===u.length?(i=r=u[0],n=a=u[1]):3===u.length?(i=u[0],n=a=u[1],r=u[2]):(i=u[0],n=u[1],r=u[2],a=u[3]):i=n=r=a=0;var c;i+n>l&&(c=i+n,i*=l/c,n*=l/c),r+a>l&&(c=r+a,r*=l/c,a*=l/c),n+r>h&&(c=n+r,n*=h/c,r*=h/c),i+a>h&&(c=i+a,i*=h/c,a*=h/c),t.moveTo(o+i,s),t.lineTo(o+l-n,s),0!==n&&t.arc(o+l-n,s+n,n,-Math.PI/2,0),t.lineTo(o+l,s+h-r),0!==r&&t.arc(o+l-r,s+h-r,r,0,Math.PI/2),t.lineTo(o+a,s+h),0!==a&&t.arc(o+a,s+h-a,a,Math.PI/2,Math.PI),t.lineTo(o,s+i),0!==i&&t.arc(o+i,s+i,i,Math.PI,1.5*Math.PI)}function Qi(t){return Ji(t),f(t.rich,Ji),t}function Ji(t){if(t){t.font=$i(t);var e=t.textAlign;"middle"===e&&(e="center"),t.textAlign=null==e||Dv[e]?e:"left";var i=t.textVerticalAlign||t.textBaseline;"center"===i&&(i="middle"),t.textVerticalAlign=null==i||kv[i]?i:"top";var n=t.textPadding;n&&(t.textPadding=L(t.textPadding))}}function tn(t,e,i,n,r,a){n.rich?nn(t,e,i,n,r):en(t,e,i,n,r,a)}function en(t,e,i,n,r,a){var o=a&&a.style,s=o&&"text"===a.type,l=n.font||Cv;s&&l===(o.font||Cv)||(e.font=l);var h=t.__computedFont;t.__styleFont!==l&&(t.__styleFont=l,h=t.__computedFont=e.font);var u=n.textPadding,c=t.__textCotentBlock;(!c||t.__dirtyText)&&(c=t.__textCotentBlock=ji(i,h,u,n.truncate));var d=c.outerHeight,f=c.lines,p=c.lineHeight,g=un(d,n,r),v=g.baseX,m=g.baseY,y=g.textAlign||"left",x=g.textVerticalAlign;an(e,n,r,v,m);var _=Fi(m,d,x),w=v,b=_,S=sn(n);if(S||u){var M=zi(i,h),I=M;u&&(I+=u[1]+u[3]);var T=Ni(v,I,y);S&&ln(t,e,n,T,_,I,d),u&&(w=gn(v,y,u),b+=u[0])}e.textAlign=y,e.textBaseline="middle";for(var C=0;CT&&(_=b[T],!_.textAlign||"left"===_.textAlign);)on(t,e,_,n,M,m,C,"left"),I-=_.width,C+=_.width,T++;for(;D>=0&&(_=b[D],"right"===_.textAlign);)on(t,e,_,n,M,m,A,"right"),I-=_.width,A-=_.width,D--;for(C+=(a-(C-v)-(y-A)-I)/2;D>=T;)_=b[T],on(t,e,_,n,M,m,C+_.width/2,"center"),C+=_.width,T++;m+=M}}function an(t,e,i,n,r){if(i&&e.textRotation){var a=e.textOrigin;"center"===a?(n=i.width/2+i.x,r=i.height/2+i.y):a&&(n=a[0]+i.x,r=a[1]+i.y),t.translate(n,r),t.rotate(-e.textRotation),t.translate(-n,-r)}}function on(t,e,i,n,r,a,o,s){var l=n.rich[i.styleName]||{};l.text=i.text;var h=i.textVerticalAlign,u=a+r/2;"top"===h?u=a+i.height/2:"bottom"===h&&(u=a+r-i.height/2),!i.isLineHolder&&sn(l)&&ln(t,e,l,"right"===s?o-i.width:"center"===s?o-i.width/2:o,u-i.height/2,i.width,i.height);var c=i.textPadding;c&&(o=gn(o,s,c),u-=i.height/2-c[2]-i.textHeight/2),cn(e,"shadowBlur",k(l.textShadowBlur,n.textShadowBlur,0)),cn(e,"shadowColor",l.textShadowColor||n.textShadowColor||"transparent"),cn(e,"shadowOffsetX",k(l.textShadowOffsetX,n.textShadowOffsetX,0)),cn(e,"shadowOffsetY",k(l.textShadowOffsetY,n.textShadowOffsetY,0)),cn(e,"textAlign",s),cn(e,"textBaseline","middle"),cn(e,"font",i.font||Cv);var d=dn(l.textStroke||n.textStroke,p),f=fn(l.textFill||n.textFill),p=D(l.textStrokeWidth,n.textStrokeWidth);d&&(cn(e,"lineWidth",p),cn(e,"strokeStyle",d),e.strokeText(i.text,o,u)),f&&(cn(e,"fillStyle",f),e.fillText(i.text,o,u))}function sn(t){return t.textBackgroundColor||t.textBorderWidth&&t.textBorderColor}function ln(t,e,i,n,r,a,o){var s=i.textBackgroundColor,l=i.textBorderWidth,h=i.textBorderColor,u=b(s);if(cn(e,"shadowBlur",i.textBoxShadowBlur||0),cn(e,"shadowColor",i.textBoxShadowColor||"transparent"),cn(e,"shadowOffsetX",i.textBoxShadowOffsetX||0),cn(e,"shadowOffsetY",i.textBoxShadowOffsetY||0),u||l&&h){e.beginPath();var c=i.textBorderRadius;c?Ki(e,{x:n,y:r,width:a,height:o,r:c}):e.rect(n,r,a,o),e.closePath()}if(u)if(cn(e,"fillStyle",s),null!=i.fillOpacity){var d=e.globalAlpha;e.globalAlpha=i.fillOpacity*i.opacity,e.fill(),e.globalAlpha=d}else e.fill();else if(w(s))cn(e,"fillStyle",s(i)),e.fill();else if(S(s)){var f=s.image;f=ki(f,null,t,hn,s),f&&Li(f)&&e.drawImage(f,n,r,a,o)}if(l&&h)if(cn(e,"lineWidth",l),cn(e,"strokeStyle",h),null!=i.strokeOpacity){var d=e.globalAlpha;e.globalAlpha=i.strokeOpacity*i.opacity,e.stroke(),e.globalAlpha=d}else e.stroke()}function hn(t,e){e.image=t}function un(t,e,i){var n=e.x||0,r=e.y||0,a=e.textAlign,o=e.textVerticalAlign;if(i){var s=e.textPosition;if(s instanceof Array)n=i.x+pn(s[0],i.width),r=i.y+pn(s[1],i.height);else{var l=Vi(s,i,e.textDistance);n=l.x,r=l.y,a=a||l.textAlign,o=o||l.textVerticalAlign}var h=e.textOffset;h&&(n+=h[0],r+=h[1])}return{baseX:n,baseY:r,textAlign:a,textVerticalAlign:o}}function cn(t,e,i){return t[e]=fv(t,e,i),t[e]}function dn(t,e){return null==t||0>=e||"transparent"===t||"none"===t?null:t.image||t.colorStops?"#000":t}function fn(t){return null==t||"none"===t?null:t.image||t.colorStops?"#000":t}function pn(t,e){return"string"==typeof t?t.lastIndexOf("%")>=0?parseFloat(t)/100*e:parseFloat(t):t}function gn(t,e,i){return"right"===e?t-i[1]:"center"===e?t+i[3]/2-i[1]/2:t+i[3]}function vn(t,e){return null!=t&&(t||e.textBackgroundColor||e.textBorderWidth&&e.textBorderColor||e.textPadding)}function mn(t){t=t||{},rv.call(this,t);for(var e in t)t.hasOwnProperty(e)&&"style"!==e&&(this[e]=t[e]);this.style=new gv(t.style,this),this._rect=null,this.__clipPaths=[] +}function yn(t){mn.call(this,t)}function xn(t){return parseInt(t,10)}function _n(t){return t?t.__builtin__?!0:"function"!=typeof t.resize||"function"!=typeof t.refresh?!1:!0:!1}function wn(t,e,i){return Nv.copy(t.getBoundingRect()),t.transform&&Nv.applyTransform(t.transform),Fv.width=e,Fv.height=i,!Nv.intersect(Fv)}function bn(t,e){if(t==e)return!1;if(!t||!e||t.length!==e.length)return!0;for(var i=0;in;n++){var a=i[n];!t.emphasis[e].hasOwnProperty(a)&&t[e].hasOwnProperty(a)&&(t.emphasis[e][a]=t[e][a])}}}function Vn(t){return!rm(t)||am(t)||t instanceof Date?t:t.value}function Wn(t){return rm(t)&&!(t instanceof Array)}function Gn(t,e){e=(e||[]).slice();var i=p(t||[],function(t){return{exist:t}});return nm(e,function(t,n){if(rm(t)){for(var r=0;r=i.length&&i.push({option:t})}}),i}function Hn(t){var e=N();nm(t,function(t){var i=t.exist;i&&e.set(i.id,t)}),nm(t,function(t){var i=t.option;O(!i||null==i.id||!e.get(i.id)||e.get(i.id)===t,"id duplicates: "+(i&&i.id)),i&&null!=i.id&&e.set(i.id,t),!t.keyInfo&&(t.keyInfo={})}),nm(t,function(t,i){var n=t.exist,r=t.option,a=t.keyInfo;if(rm(r)){if(a.name=null!=r.name?r.name+"":n?n.name:om+i,n)a.id=n.id;else if(null!=r.id)a.id=r.id+"";else{var o=0;do a.id="\x00"+a.name+"\x00"+o++;while(e.get(a.id))}e.set(a.id,t)}})}function Zn(t){var e=t.name;return!(!e||!e.indexOf(om))}function Xn(t){return rm(t)&&t.id&&0===(t.id+"").indexOf("\x00_ec_\x00")}function Yn(t,e){return null!=e.dataIndexInside?e.dataIndexInside:null!=e.dataIndex?_(e.dataIndex)?p(e.dataIndex,function(e){return t.indexOfRawIndex(e)}):t.indexOfRawIndex(e.dataIndex):null!=e.name?_(e.name)?p(e.name,function(e){return t.indexOfName(e)}):t.indexOfName(e.name):void 0}function jn(){var t="__\x00ec_inner_"+lm++ +"_"+Math.random().toFixed(5);return function(e){return e[t]||(e[t]={})}}function qn(t,e,i){if(b(e)){var n={};n[e+"Index"]=0,e=n}var r=i&&i.defaultMainType;!r||Un(e,r+"Index")||Un(e,r+"Id")||Un(e,r+"Name")||(e[r+"Index"]=0);var a={};return nm(e,function(n,r){var n=e[r];if("dataIndex"===r||"dataIndexInside"===r)return void(a[r]=n);var o=r.match(/^(\w+)(Index|Id|Name)$/)||[],s=o[1],l=(o[2]||"").toLowerCase();if(!(!s||!l||null==n||"index"===l&&"none"===n||i&&i.includeMainTypes&&h(i.includeMainTypes,s)<0)){var u={mainType:s};("index"!==l||"all"!==n)&&(u[l]=n);var c=t.queryComponents(u);a[s+"Models"]=c,a[s+"Model"]=c[0]}}),a}function Un(t,e){return t&&t.hasOwnProperty(e)}function $n(t,e,i){t.setAttribute?t.setAttribute(e,i):t[e]=i}function Kn(t,e){return t.getAttribute?t.getAttribute(e):t[e]}function Qn(t){return"auto"===t?tg.domSupported?"html":"richText":t||"html"}function Jn(t){var e={main:"",sub:""};return t&&(t=t.split(hm),e.main=t[0]||"",e.sub=t[1]||""),e}function tr(t){O(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(t),'componentType "'+t+'" illegal')}function er(t){t.$constructor=t,t.extend=function(t){var e=this,i=function(){t.$constructor?t.$constructor.apply(this,arguments):e.apply(this,arguments)};return o(i.prototype,t),i.extend=this.extend,i.superCall=nr,i.superApply=rr,u(i,this),i.superClass=e,i}}function ir(t){var e=["__\x00is_clz",cm++,Math.random().toFixed(3)].join("_");t.prototype[e]=!0,t.isInstance=function(t){return!(!t||!t[e])}}function nr(t,e){var i=P(arguments,2);return this.superClass.prototype[e].apply(t,i)}function rr(t,e,i){return this.superClass.prototype[e].apply(t,i)}function ar(t,e){function i(t){var e=n[t.main];return e&&e[um]||(e=n[t.main]={},e[um]=!0),e}e=e||{};var n={};if(t.registerClass=function(t,e){if(e)if(tr(e),e=Jn(e),e.sub){if(e.sub!==um){var r=i(e);r[e.sub]=t}}else n[e.main]=t;return t},t.getClass=function(t,e,i){var r=n[t];if(r&&r[um]&&(r=e?r[e]:null),i&&!r)throw new Error(e?"Component "+t+"."+(e||"")+" not exists. Load it first.":t+".type should be specified.");return r},t.getClassesByMainType=function(t){t=Jn(t);var e=[],i=n[t.main];return i&&i[um]?f(i,function(t,i){i!==um&&e.push(t)}):e.push(i),e},t.hasClass=function(t){return t=Jn(t),!!n[t.main]},t.getAllClassMainTypes=function(){var t=[];return f(n,function(e,i){t.push(i)}),t},t.hasSubTypes=function(t){t=Jn(t);var e=n[t.main];return e&&e[um]},t.parseClassType=Jn,e.registerWhenExtend){var r=t.extend;r&&(t.extend=function(e){var i=r.call(this,e);return t.registerClass(i,e.type)})}return t}function or(t){return t>-xm&&xm>t}function sr(t){return t>xm||-xm>t}function lr(t,e,i,n,r){var a=1-r;return a*a*(a*t+3*r*e)+r*r*(r*n+3*a*i)}function hr(t,e,i,n,r){var a=1-r;return 3*(((e-t)*a+2*(i-e)*r)*a+(n-i)*r*r)}function ur(t,e,i,n,r,a){var o=n+3*(e-i)-t,s=3*(i-2*e+t),l=3*(e-t),h=t-r,u=s*s-3*o*l,c=s*l-9*o*h,d=l*l-3*s*h,f=0;if(or(u)&&or(c))if(or(s))a[0]=0;else{var p=-l/s;p>=0&&1>=p&&(a[f++]=p)}else{var g=c*c-4*u*d;if(or(g)){var v=c/u,p=-s/o+v,m=-v/2;p>=0&&1>=p&&(a[f++]=p),m>=0&&1>=m&&(a[f++]=m)}else if(g>0){var y=ym(g),x=u*s+1.5*o*(-c+y),_=u*s+1.5*o*(-c-y);x=0>x?-mm(-x,bm):mm(x,bm),_=0>_?-mm(-_,bm):mm(_,bm);var p=(-s-(x+_))/(3*o);p>=0&&1>=p&&(a[f++]=p)}else{var w=(2*u*s-3*o*c)/(2*ym(u*u*u)),b=Math.acos(w)/3,S=ym(u),M=Math.cos(b),p=(-s-2*S*M)/(3*o),m=(-s+S*(M+wm*Math.sin(b)))/(3*o),I=(-s+S*(M-wm*Math.sin(b)))/(3*o);p>=0&&1>=p&&(a[f++]=p),m>=0&&1>=m&&(a[f++]=m),I>=0&&1>=I&&(a[f++]=I)}}return f}function cr(t,e,i,n,r){var a=6*i-12*e+6*t,o=9*e+3*n-3*t-9*i,s=3*e-3*t,l=0;if(or(o)){if(sr(a)){var h=-s/a;h>=0&&1>=h&&(r[l++]=h)}}else{var u=a*a-4*o*s;if(or(u))r[0]=-a/(2*o);else if(u>0){var c=ym(u),h=(-a+c)/(2*o),d=(-a-c)/(2*o);h>=0&&1>=h&&(r[l++]=h),d>=0&&1>=d&&(r[l++]=d)}}return l}function dr(t,e,i,n,r,a){var o=(e-t)*r+t,s=(i-e)*r+e,l=(n-i)*r+i,h=(s-o)*r+o,u=(l-s)*r+s,c=(u-h)*r+h;a[0]=t,a[1]=o,a[2]=h,a[3]=c,a[4]=c,a[5]=u,a[6]=l,a[7]=n}function fr(t,e,i,n,r,a,o,s,l,h,u){var c,d,f,p,g,v=.005,m=1/0;Sm[0]=l,Sm[1]=h;for(var y=0;1>y;y+=.05)Mm[0]=lr(t,i,r,o,y),Mm[1]=lr(e,n,a,s,y),p=xg(Sm,Mm),m>p&&(c=y,m=p);m=1/0;for(var x=0;32>x&&!(_m>v);x++)d=c-v,f=c+v,Mm[0]=lr(t,i,r,o,d),Mm[1]=lr(e,n,a,s,d),p=xg(Mm,Sm),d>=0&&m>p?(c=d,m=p):(Im[0]=lr(t,i,r,o,f),Im[1]=lr(e,n,a,s,f),g=xg(Im,Sm),1>=f&&m>g?(c=f,m=g):v*=.5);return u&&(u[0]=lr(t,i,r,o,c),u[1]=lr(e,n,a,s,c)),ym(m)}function pr(t,e,i,n){var r=1-n;return r*(r*t+2*n*e)+n*n*i}function gr(t,e,i,n){return 2*((1-n)*(e-t)+n*(i-e))}function vr(t,e,i,n,r){var a=t-2*e+i,o=2*(e-t),s=t-n,l=0;if(or(a)){if(sr(o)){var h=-s/o;h>=0&&1>=h&&(r[l++]=h)}}else{var u=o*o-4*a*s;if(or(u)){var h=-o/(2*a);h>=0&&1>=h&&(r[l++]=h)}else if(u>0){var c=ym(u),h=(-o+c)/(2*a),d=(-o-c)/(2*a);h>=0&&1>=h&&(r[l++]=h),d>=0&&1>=d&&(r[l++]=d)}}return l}function mr(t,e,i){var n=t+i-2*e;return 0===n?.5:(t-e)/n}function yr(t,e,i,n,r){var a=(e-t)*n+t,o=(i-e)*n+e,s=(o-a)*n+a;r[0]=t,r[1]=a,r[2]=s,r[3]=s,r[4]=o,r[5]=i}function xr(t,e,i,n,r,a,o,s,l){var h,u=.005,c=1/0;Sm[0]=o,Sm[1]=s;for(var d=0;1>d;d+=.05){Mm[0]=pr(t,i,r,d),Mm[1]=pr(e,n,a,d);var f=xg(Sm,Mm);c>f&&(h=d,c=f)}c=1/0;for(var p=0;32>p&&!(_m>u);p++){var g=h-u,v=h+u;Mm[0]=pr(t,i,r,g),Mm[1]=pr(e,n,a,g);var f=xg(Mm,Sm);if(g>=0&&c>f)h=g,c=f;else{Im[0]=pr(t,i,r,v),Im[1]=pr(e,n,a,v);var m=xg(Im,Sm);1>=v&&c>m?(h=v,c=m):u*=.5}}return l&&(l[0]=pr(t,i,r,h),l[1]=pr(e,n,a,h)),ym(c)}function _r(t,e,i){if(0!==t.length){var n,r=t[0],a=r[0],o=r[0],s=r[1],l=r[1];for(n=1;nu;u++){var p=d(t,i,r,o,zm[u]);l[0]=Tm(p,l[0]),h[0]=Cm(p,h[0])}for(f=c(e,n,a,s,Em),u=0;f>u;u++){var g=d(e,n,a,s,Em[u]);l[1]=Tm(g,l[1]),h[1]=Cm(g,h[1])}l[0]=Tm(t,l[0]),h[0]=Cm(t,h[0]),l[0]=Tm(o,l[0]),h[0]=Cm(o,h[0]),l[1]=Tm(e,l[1]),h[1]=Cm(e,h[1]),l[1]=Tm(s,l[1]),h[1]=Cm(s,h[1])}function Sr(t,e,i,n,r,a,o,s){var l=mr,h=pr,u=Cm(Tm(l(t,i,r),1),0),c=Cm(Tm(l(e,n,a),1),0),d=h(t,i,r,u),f=h(e,n,a,c);o[0]=Tm(t,r,d),o[1]=Tm(e,a,f),s[0]=Cm(t,r,d),s[1]=Cm(e,a,f)}function Mr(t,e,i,n,r,a,o,s,l){var h=oe,u=se,c=Math.abs(r-a);if(1e-4>c%km&&c>1e-4)return s[0]=t-i,s[1]=e-n,l[0]=t+i,void(l[1]=e+n);if(Pm[0]=Dm(r)*i+t,Pm[1]=Am(r)*n+e,Lm[0]=Dm(a)*i+t,Lm[1]=Am(a)*n+e,h(s,Pm,Lm),u(l,Pm,Lm),r%=km,0>r&&(r+=km),a%=km,0>a&&(a+=km),r>a&&!o?a+=km:a>r&&o&&(r+=km),o){var d=a;a=r,r=d}for(var f=0;a>f;f+=Math.PI/2)f>r&&(Om[0]=Dm(f)*i+t,Om[1]=Am(f)*n+e,h(s,Om,s),u(l,Om,l))}function Ir(t,e,i,n,r,a,o){if(0===r)return!1;var s=r,l=0,h=t;if(o>e+s&&o>n+s||e-s>o&&n-s>o||a>t+s&&a>i+s||t-s>a&&i-s>a)return!1;if(t===i)return Math.abs(a-t)<=s/2;l=(e-n)/(t-i),h=(t*n-i*e)/(t-i);var u=l*a-o+h,c=u*u/(l*l+1);return s/2*s/2>=c}function Tr(t,e,i,n,r,a,o,s,l,h,u){if(0===l)return!1;var c=l;if(u>e+c&&u>n+c&&u>a+c&&u>s+c||e-c>u&&n-c>u&&a-c>u&&s-c>u||h>t+c&&h>i+c&&h>r+c&&h>o+c||t-c>h&&i-c>h&&r-c>h&&o-c>h)return!1;var d=fr(t,e,i,n,r,a,o,s,h,u,null);return c/2>=d}function Cr(t,e,i,n,r,a,o,s,l){if(0===o)return!1;var h=o;if(l>e+h&&l>n+h&&l>a+h||e-h>l&&n-h>l&&a-h>l||s>t+h&&s>i+h&&s>r+h||t-h>s&&i-h>s&&r-h>s)return!1;var u=xr(t,e,i,n,r,a,s,l,null);return h/2>=u}function Ar(t){return t%=Um,0>t&&(t+=Um),t}function Dr(t,e,i,n,r,a,o,s,l){if(0===o)return!1;var h=o;s-=t,l-=e;var u=Math.sqrt(s*s+l*l);if(u-h>i||i>u+h)return!1;if(Math.abs(n-r)%$m<1e-4)return!0;if(a){var c=n;n=Ar(r),r=Ar(c)}else n=Ar(n),r=Ar(r);n>r&&(r+=$m);var d=Math.atan2(l,s);return 0>d&&(d+=$m),d>=n&&r>=d||d+$m>=n&&r>=d+$m}function kr(t,e,i,n,r,a){if(a>e&&a>n||e>a&&n>a)return 0;if(n===e)return 0;var o=e>n?1:-1,s=(a-e)/(n-e);(1===s||0===s)&&(o=e>n?.5:-.5);var l=s*(i-t)+t;return l===r?1/0:l>r?o:0}function Pr(t,e){return Math.abs(t-e)e&&h>n&&h>a&&h>s||e>h&&n>h&&a>h&&s>h)return 0;var u=ur(e,n,a,s,h,ty);if(0===u)return 0;for(var c,d,f=0,p=-1,g=0;u>g;g++){var v=ty[g],m=0===v||1===v?.5:1,y=lr(t,i,r,o,v);l>y||(0>p&&(p=cr(e,n,a,s,ey),ey[1]1&&Lr(),c=lr(e,n,a,s,ey[0]),p>1&&(d=lr(e,n,a,s,ey[1]))),f+=2==p?vc?m:-m:vd?m:-m:d>s?m:-m:vc?m:-m:c>s?m:-m)}return f}function zr(t,e,i,n,r,a,o,s){if(s>e&&s>n&&s>a||e>s&&n>s&&a>s)return 0;var l=vr(e,n,a,s,ty);if(0===l)return 0;var h=mr(e,n,a);if(h>=0&&1>=h){for(var u=0,c=pr(e,n,a,h),d=0;l>d;d++){var f=0===ty[d]||1===ty[d]?.5:1,p=pr(t,i,r,ty[d]);o>p||(u+=ty[d]c?f:-f:c>a?f:-f)}return u}var f=0===ty[0]||1===ty[0]?.5:1,p=pr(t,i,r,ty[0]);return o>p?0:e>a?f:-f}function Er(t,e,i,n,r,a,o,s){if(s-=e,s>i||-i>s)return 0;var l=Math.sqrt(i*i-s*s);ty[0]=-l,ty[1]=l;var h=Math.abs(n-r);if(1e-4>h)return 0;if(1e-4>h%Qm){n=0,r=Qm;var u=a?1:-1;return o>=ty[0]+t&&o<=ty[1]+t?u:0}if(a){var l=n;n=Ar(r),r=Ar(l)}else n=Ar(n),r=Ar(r);n>r&&(r+=Qm);for(var c=0,d=0;2>d;d++){var f=ty[d];if(f+t>o){var p=Math.atan2(s,f),u=a?1:-1;0>p&&(p=Qm+p),(p>=n&&r>=p||p+Qm>=n&&r>=p+Qm)&&(p>Math.PI/2&&p<1.5*Math.PI&&(u=-u),c+=u)}}return c}function Rr(t,e,i,n,r){for(var a=0,o=0,s=0,l=0,h=0,u=0;u1&&(i||(a+=kr(o,s,l,h,n,r))),1==u&&(o=t[u],s=t[u+1],l=o,h=s),c){case Km.M:l=t[u++],h=t[u++],o=l,s=h;break;case Km.L:if(i){if(Ir(o,s,t[u],t[u+1],e,n,r))return!0}else a+=kr(o,s,t[u],t[u+1],n,r)||0;o=t[u++],s=t[u++];break;case Km.C:if(i){if(Tr(o,s,t[u++],t[u++],t[u++],t[u++],t[u],t[u+1],e,n,r))return!0}else a+=Or(o,s,t[u++],t[u++],t[u++],t[u++],t[u],t[u+1],n,r)||0;o=t[u++],s=t[u++];break;case Km.Q:if(i){if(Cr(o,s,t[u++],t[u++],t[u],t[u+1],e,n,r))return!0}else a+=zr(o,s,t[u++],t[u++],t[u],t[u+1],n,r)||0;o=t[u++],s=t[u++];break;case Km.A:var d=t[u++],f=t[u++],p=t[u++],g=t[u++],v=t[u++],m=t[u++],y=(t[u++],1-t[u++]),x=Math.cos(v)*p+d,_=Math.sin(v)*g+f;u>1?a+=kr(o,s,x,_,n,r):(l=x,h=_);var w=(n-d)*g/p+d;if(i){if(Dr(d,f,g,v,v+m,y,e,w,r))return!0}else a+=Er(d,f,g,v,v+m,y,w,r);o=Math.cos(v+m)*p+d,s=Math.sin(v+m)*g+f;break;case Km.R:l=o=t[u++],h=s=t[u++];var b=t[u++],S=t[u++],x=l+b,_=h+S;if(i){if(Ir(l,h,x,h,e,n,r)||Ir(x,h,x,_,e,n,r)||Ir(x,_,l,_,e,n,r)||Ir(l,_,l,h,e,n,r))return!0}else a+=kr(x,h,x,_,n,r),a+=kr(l,_,l,h,n,r);break;case Km.Z:if(i){if(Ir(o,s,l,h,e,n,r))return!0}else a+=kr(o,s,l,h,n,r);o=l,s=h}}return i||Pr(s,h)||(a+=kr(o,s,l,h,n,r)||0),0!==a}function Br(t,e,i){return Rr(t,0,!1,e,i)}function Nr(t,e,i,n){return Rr(t,e,!0,i,n)}function Fr(t){mn.call(this,t),this.path=null}function Vr(t,e,i,n,r,a,o,s,l,h,u){var c=l*(fy/180),d=dy(c)*(t-i)/2+cy(c)*(e-n)/2,f=-1*cy(c)*(t-i)/2+dy(c)*(e-n)/2,p=d*d/(o*o)+f*f/(s*s);p>1&&(o*=uy(p),s*=uy(p));var g=(r===a?-1:1)*uy((o*o*s*s-o*o*f*f-s*s*d*d)/(o*o*f*f+s*s*d*d))||0,v=g*o*f/s,m=g*-s*d/o,y=(t+i)/2+dy(c)*v-cy(c)*m,x=(e+n)/2+cy(c)*v+dy(c)*m,_=vy([1,0],[(d-v)/o,(f-m)/s]),w=[(d-v)/o,(f-m)/s],b=[(-1*d-v)/o,(-1*f-m)/s],S=vy(w,b);gy(w,b)<=-1&&(S=fy),gy(w,b)>=1&&(S=0),0===a&&S>0&&(S-=2*fy),1===a&&0>S&&(S+=2*fy),u.addData(h,y,x,o,s,_,S,c,a)}function Wr(t){if(!t)return new qm;for(var e,i=0,n=0,r=i,a=n,o=new qm,s=qm.CMD,l=t.match(my),h=0;hg;g++)f[g]=parseFloat(f[g]);for(var v=0;p>v;){var m,y,x,_,w,b,S,M=i,I=n;switch(d){case"l":i+=f[v++],n+=f[v++],u=s.L,o.addData(u,i,n);break;case"L":i=f[v++],n=f[v++],u=s.L,o.addData(u,i,n);break;case"m":i+=f[v++],n+=f[v++],u=s.M,o.addData(u,i,n),r=i,a=n,d="l";break;case"M":i=f[v++],n=f[v++],u=s.M,o.addData(u,i,n),r=i,a=n,d="L";break;case"h":i+=f[v++],u=s.L,o.addData(u,i,n);break;case"H":i=f[v++],u=s.L,o.addData(u,i,n);break;case"v":n+=f[v++],u=s.L,o.addData(u,i,n);break;case"V":n=f[v++],u=s.L,o.addData(u,i,n);break;case"C":u=s.C,o.addData(u,f[v++],f[v++],f[v++],f[v++],f[v++],f[v++]),i=f[v-2],n=f[v-1];break;case"c":u=s.C,o.addData(u,f[v++]+i,f[v++]+n,f[v++]+i,f[v++]+n,f[v++]+i,f[v++]+n),i+=f[v-2],n+=f[v-1];break;case"S":m=i,y=n;var T=o.len(),C=o.data;e===s.C&&(m+=i-C[T-4],y+=n-C[T-3]),u=s.C,M=f[v++],I=f[v++],i=f[v++],n=f[v++],o.addData(u,m,y,M,I,i,n);break;case"s":m=i,y=n;var T=o.len(),C=o.data;e===s.C&&(m+=i-C[T-4],y+=n-C[T-3]),u=s.C,M=i+f[v++],I=n+f[v++],i+=f[v++],n+=f[v++],o.addData(u,m,y,M,I,i,n);break;case"Q":M=f[v++],I=f[v++],i=f[v++],n=f[v++],u=s.Q,o.addData(u,M,I,i,n);break;case"q":M=f[v++]+i,I=f[v++]+n,i+=f[v++],n+=f[v++],u=s.Q,o.addData(u,M,I,i,n);break;case"T":m=i,y=n;var T=o.len(),C=o.data;e===s.Q&&(m+=i-C[T-4],y+=n-C[T-3]),i=f[v++],n=f[v++],u=s.Q,o.addData(u,m,y,i,n);break;case"t":m=i,y=n;var T=o.len(),C=o.data;e===s.Q&&(m+=i-C[T-4],y+=n-C[T-3]),i+=f[v++],n+=f[v++],u=s.Q,o.addData(u,m,y,i,n);break;case"A":x=f[v++],_=f[v++],w=f[v++],b=f[v++],S=f[v++],M=i,I=n,i=f[v++],n=f[v++],u=s.A,Vr(M,I,i,n,b,S,x,_,w,u,o);break;case"a":x=f[v++],_=f[v++],w=f[v++],b=f[v++],S=f[v++],M=i,I=n,i+=f[v++],n+=f[v++],u=s.A,Vr(M,I,i,n,b,S,x,_,w,u,o)}}("z"===d||"Z"===d)&&(u=s.Z,o.addData(u),i=r,n=a),e=u}return o.toStatic(),o}function Gr(t,e){var i=Wr(t);return e=e||{},e.buildPath=function(t){if(t.setData){t.setData(i.data);var e=t.getContext();e&&t.rebuildPath(e)}else{var e=t;i.rebuildPath(e)}},e.applyTransform=function(t){hy(i,t),this.dirty(!0)},e}function Hr(t,e){return new Fr(Gr(t,e))}function Zr(t,e){return Fr.extend(Gr(t,e))}function Xr(t,e){for(var i=[],n=t.length,r=0;n>r;r++){var a=t[r];a.path||a.createPathProxy(),a.__dirtyPath&&a.buildPath(a.path,a.shape,!0),i.push(a.path)}var o=new Fr(e);return o.createPathProxy(),o.buildPath=function(t){t.appendPath(i);var e=t.getContext();e&&t.rebuildPath(e)},o}function Yr(t,e,i,n,r,a,o){var s=.5*(i-t),l=.5*(n-e);return(2*(e-i)+s+l)*o+(-3*(e-i)-2*s-l)*a+s*r+e}function jr(t,e,i){var n=e.points,r=e.smooth;if(n&&n.length>=2){if(r&&"spline"!==r){var a=Ty(n,r,i,e.smoothConstraint);t.moveTo(n[0][0],n[0][1]);for(var o=n.length,s=0;(i?o:o-1)>s;s++){var l=a[2*s],h=a[2*s+1],u=n[(s+1)%o];t.bezierCurveTo(l[0],l[1],h[0],h[1],u[0],u[1])}}else{"spline"===r&&(n=Iy(n,i)),t.moveTo(n[0][0],n[0][1]);for(var s=1,c=n.length;c>s;s++)t.lineTo(n[s][0],n[s][1])}i&&t.closePath()}}function qr(t,e,i){var n=t.cpx2,r=t.cpy2;return null===n||null===r?[(i?hr:lr)(t.x1,t.cpx1,t.cpx2,t.x2,e),(i?hr:lr)(t.y1,t.cpy1,t.cpy2,t.y2,e)]:[(i?gr:pr)(t.x1,t.cpx1,t.x2,e),(i?gr:pr)(t.y1,t.cpy1,t.y2,e)]}function Ur(t){mn.call(this,t),this._displayables=[],this._temporaryDisplayables=[],this._cursor=0,this.notClear=!0}function $r(t){return Fr.extend(t)}function Kr(t,e){return Zr(t,e)}function Qr(t,e,i,n){var r=Hr(t,e);return i&&("center"===n&&(i=ta(i,r.getBoundingRect())),ea(r,i)),r}function Jr(t,e,i){var n=new yn({style:{image:t,x:e.x,y:e.y,width:e.width,height:e.height},onload:function(t){if("center"===i){var r={width:t.width,height:t.height};n.setStyle(ta(e,r))}}});return n}function ta(t,e){var i,n=e.width/e.height,r=t.height*n;r<=t.width?i=t.height:(r=t.width,i=r/n);var a=t.x+t.width/2,o=t.y+t.height/2;return{x:a-r/2,y:o-i/2,width:r,height:i}}function ea(t,e){if(t.applyTransform){var i=t.getBoundingRect(),n=i.calculateTransform(e);t.applyTransform(n)}}function ia(t){var e=t.shape,i=t.style.lineWidth;return Fy(2*e.x1)===Fy(2*e.x2)&&(e.x1=e.x2=ra(e.x1,i,!0)),Fy(2*e.y1)===Fy(2*e.y2)&&(e.y1=e.y2=ra(e.y1,i,!0)),t}function na(t){var e=t.shape,i=t.style.lineWidth,n=e.x,r=e.y,a=e.width,o=e.height;return e.x=ra(e.x,i,!0),e.y=ra(e.y,i,!0),e.width=Math.max(ra(n+a,i,!1)-e.x,0===a?0:1),e.height=Math.max(ra(r+o,i,!1)-e.y,0===o?0:1),t}function ra(t,e,i){var n=Fy(2*t);return(n+Fy(e))%2===0?n/2:(n+(i?1:-1))/2}function aa(t){return null!=t&&"none"!==t}function oa(t){if("string"!=typeof t)return t;var e=Zy.get(t);return e||(e=Ye(t,-.1),1e4>Xy&&(Zy.set(t,e),Xy++)),e}function sa(t){if(t.__hoverStlDirty){t.__hoverStlDirty=!1;var e=t.__hoverStl;if(!e)return void(t.__normalStl=null);var i=t.__normalStl={},n=t.style;for(var r in e)null!=e[r]&&(i[r]=n[r]);i.fill=n.fill,i.stroke=n.stroke}}function la(t){var e=t.__hoverStl;if(e&&!t.__highlighted){var i=t.useHoverLayer;t.__highlighted=i?"layer":"plain";var n=t.__zr;if(n||!i){var r=t,a=t.style;i&&(r=n.addHover(t),a=r.style),Da(a),i||sa(r),a.extendFrom(e),ha(a,e,"fill"),ha(a,e,"stroke"),Aa(a),i||(t.dirty(!1),t.z2+=1)}}}function ha(t,e,i){!aa(e[i])&&aa(t[i])&&(t[i]=oa(t[i]))}function ua(t){t.__highlighted&&(ca(t),t.__highlighted=!1)}function ca(t){var e=t.__highlighted;if("layer"===e)t.__zr&&t.__zr.removeHover(t);else if(e){var i=t.style,n=t.__normalStl;n&&(Da(i),t.setStyle(n),Aa(i),t.z2-=1)}}function da(t,e){t.isGroup?t.traverse(function(t){!t.isGroup&&e(t)}):e(t)}function fa(t,e){e=t.__hoverStl=e!==!1&&(e||{}),t.__hoverStlDirty=!0,t.__highlighted&&(ua(t),la(t))}function pa(t){return t&&t.__isEmphasisEntered}function ga(t){this.__hoverSilentOnTouch&&t.zrByTouch||!this.__isEmphasisEntered&&da(this,la)}function va(t){this.__hoverSilentOnTouch&&t.zrByTouch||!this.__isEmphasisEntered&&da(this,ua)}function ma(){this.__isEmphasisEntered=!0,da(this,la)}function ya(){this.__isEmphasisEntered=!1,da(this,ua)}function xa(t,e,i){t.isGroup?t.traverse(function(t){!t.isGroup&&fa(t,t.hoverStyle||e)}):fa(t,t.hoverStyle||e),_a(t,i)}function _a(t,e){var i=e===!1;if(t.__hoverSilentOnTouch=null!=e&&e.hoverSilentOnTouch,!i||t.__hoverStyleTrigger){var n=i?"off":"on";t[n]("mouseover",ga)[n]("mouseout",va),t[n]("emphasis",ma)[n]("normal",ya),t.__hoverStyleTrigger=!i}}function wa(t,e,i,n,r,a,o){r=r||Gy;var s,l=r.labelFetcher,h=r.labelDataIndex,u=r.labelDimIndex,c=i.getShallow("show"),d=n.getShallow("show");(c||d)&&(l&&(s=l.getFormattedLabel(h,"normal",null,u)),null==s&&(s=w(r.defaultText)?r.defaultText(h,r):r.defaultText));var f=c?s:null,p=d?D(l?l.getFormattedLabel(h,"emphasis",null,u):null,s):null;(null!=f||null!=p)&&(ba(t,i,a,r),ba(e,n,o,r,!0)),t.text=f,e.text=p}function ba(t,e,i,n,r){return Ma(t,e,n,r),i&&o(t,i),t}function Sa(t,e,i){var n,r={isRectText:!0};i===!1?n=!0:r.autoColor=i,Ma(t,e,r,n)}function Ma(t,e,i,n){if(i=i||Gy,i.isRectText){var r=e.getShallow("position")||(n?null:"inside");"outside"===r&&(r="top"),t.textPosition=r,t.textOffset=e.getShallow("offset");var a=e.getShallow("rotate");null!=a&&(a*=Math.PI/180),t.textRotation=a,t.textDistance=D(e.getShallow("distance"),n?null:5)}var o,s=e.ecModel,l=s&&s.option.textStyle,h=Ia(e);if(h){o={};for(var u in h)if(h.hasOwnProperty(u)){var c=e.getModel(["rich",u]);Ta(o[u]={},c,l,i,n)}}return t.rich=o,Ta(t,e,l,i,n,!0),i.forceRich&&!i.textStyle&&(i.textStyle={}),t}function Ia(t){for(var e;t&&t!==t.ecModel;){var i=(t.option||Gy).rich;if(i){e=e||{};for(var n in i)i.hasOwnProperty(n)&&(e[n]=1)}t=t.parentModel}return e}function Ta(t,e,i,n,r,a){i=!r&&i||Gy,t.textFill=Ca(e.getShallow("color"),n)||i.color,t.textStroke=Ca(e.getShallow("textBorderColor"),n)||i.textBorderColor,t.textStrokeWidth=D(e.getShallow("textBorderWidth"),i.textBorderWidth),t.insideRawTextPosition=t.textPosition,r||(a&&(t.insideRollbackOpt=n,Aa(t)),null==t.textFill&&(t.textFill=n.autoColor)),t.fontStyle=e.getShallow("fontStyle")||i.fontStyle,t.fontWeight=e.getShallow("fontWeight")||i.fontWeight,t.fontSize=e.getShallow("fontSize")||i.fontSize,t.fontFamily=e.getShallow("fontFamily")||i.fontFamily,t.textAlign=e.getShallow("align"),t.textVerticalAlign=e.getShallow("verticalAlign")||e.getShallow("baseline"),t.textLineHeight=e.getShallow("lineHeight"),t.textWidth=e.getShallow("width"),t.textHeight=e.getShallow("height"),t.textTag=e.getShallow("tag"),a&&n.disableBox||(t.textBackgroundColor=Ca(e.getShallow("backgroundColor"),n),t.textPadding=e.getShallow("padding"),t.textBorderColor=Ca(e.getShallow("borderColor"),n),t.textBorderWidth=e.getShallow("borderWidth"),t.textBorderRadius=e.getShallow("borderRadius"),t.textBoxShadowColor=e.getShallow("shadowColor"),t.textBoxShadowBlur=e.getShallow("shadowBlur"),t.textBoxShadowOffsetX=e.getShallow("shadowOffsetX"),t.textBoxShadowOffsetY=e.getShallow("shadowOffsetY")),t.textShadowColor=e.getShallow("textShadowColor")||i.textShadowColor,t.textShadowBlur=e.getShallow("textShadowBlur")||i.textShadowBlur,t.textShadowOffsetX=e.getShallow("textShadowOffsetX")||i.textShadowOffsetX,t.textShadowOffsetY=e.getShallow("textShadowOffsetY")||i.textShadowOffsetY}function Ca(t,e){return"auto"!==t?t:e&&e.autoColor?e.autoColor:null}function Aa(t){var e=t.insideRollbackOpt;if(e&&null==t.textFill){var i,n=e.useInsideStyle,r=t.insideRawTextPosition,a=e.autoColor;n!==!1&&(n===!0||e.isRectText&&r&&"string"==typeof r&&r.indexOf("inside")>=0)?(i={textFill:null,textStroke:t.textStroke,textStrokeWidth:t.textStrokeWidth},t.textFill="#fff",null==t.textStroke&&(t.textStroke=a,null==t.textStrokeWidth&&(t.textStrokeWidth=2))):null!=a&&(i={textFill:null},t.textFill=a),i&&(t.insideRollback=i)}}function Da(t){var e=t.insideRollback;e&&(t.textFill=e.textFill,t.textStroke=e.textStroke,t.textStrokeWidth=e.textStrokeWidth,t.insideRollback=null)}function ka(t,e){var i=e||e.getModel("textStyle");return z([t.fontStyle||i&&i.getShallow("fontStyle")||"",t.fontWeight||i&&i.getShallow("fontWeight")||"",(t.fontSize||i&&i.getShallow("fontSize")||12)+"px",t.fontFamily||i&&i.getShallow("fontFamily")||"sans-serif"].join(" "))}function Pa(t,e,i,n,r,a){"function"==typeof r&&(a=r,r=null);var o=n&&n.isAnimationEnabled();if(o){var s=t?"Update":"",l=n.getShallow("animationDuration"+s),h=n.getShallow("animationEasing"+s),u=n.getShallow("animationDelay"+s);"function"==typeof u&&(u=u(r,n.getAnimationDelayParams?n.getAnimationDelayParams(e,r):null)),"function"==typeof l&&(l=l(r)),l>0?e.animateTo(i,l,u||0,h,a,!!a):(e.stopAnimation(),e.attr(i),a&&a())}else e.stopAnimation(),e.attr(i),a&&a()}function La(t,e,i,n,r){Pa(!0,t,e,i,n,r)}function Oa(t,e,i,n,r){Pa(!1,t,e,i,n,r)}function za(t,e){for(var i=Se([]);t&&t!==e;)Ie(i,t.getLocalTransform(),i),t=t.parent;return i}function Ea(t,e,i){return e&&!d(e)&&(e=Og.getLocalTransform(e)),i&&(e=De([],e)),ae([],t,e)}function Ra(t,e,i){var n=0===e[4]||0===e[5]||0===e[0]?1:Math.abs(2*e[4]/e[0]),r=0===e[4]||0===e[5]||0===e[2]?1:Math.abs(2*e[4]/e[2]),a=["left"===t?-n:"right"===t?n:0,"top"===t?-r:"bottom"===t?r:0];return a=Ea(a,e,i),Math.abs(a[0])>Math.abs(a[1])?a[0]>0?"right":"left":a[1]>0?"bottom":"top"}function Ba(t,e,i){function n(t){var e={};return t.traverse(function(t){!t.isGroup&&t.anid&&(e[t.anid]=t)}),e}function r(t){var e={position:H(t.position),rotation:t.rotation};return t.shape&&(e.shape=o({},t.shape)),e}if(t&&e){var a=n(t);e.traverse(function(t){if(!t.isGroup&&t.anid){var e=a[t.anid];if(e){var n=r(t);t.attr(r(e)),La(t,n,i,t.dataIndex)}}})}}function Na(t,e){return p(t,function(t){var i=t[0];i=Vy(i,e.x),i=Wy(i,e.x+e.width);var n=t[1];return n=Vy(n,e.y),n=Wy(n,e.y+e.height),[i,n]})}function Fa(t,e){var i=Vy(t.x,e.x),n=Wy(t.x+t.width,e.x+e.width),r=Vy(t.y,e.y),a=Wy(t.y+t.height,e.y+e.height);return n>=i&&a>=r?{x:i,y:r,width:n-i,height:a-r}:void 0}function Va(t,e,i){e=o({rectHover:!0},e);var n=e.style={strokeNoScale:!0};return i=i||{x:-1,y:-1,width:2,height:2},t?0===t.indexOf("image://")?(n.image=t.slice(8),s(n,i),new yn(e)):Qr(t.replace("path://",""),e,i,"center"):void 0}function Wa(t,e,i){this.parentModel=e,this.ecModel=i,this.option=t}function Ga(t,e,i){for(var n=0;n=0&&i.push(t)}),i}t.topologicalTravel=function(t,e,n,r){function a(t){l[t].entryCount--,0===l[t].entryCount&&h.push(t)}function o(t){u[t]=!0,a(t)}if(t.length){var s=i(e),l=s.graph,h=s.noEntryList,u={};for(f(t,function(t){u[t]=!0});h.length;){var c=h.pop(),d=l[c],p=!!u[c];p&&(n.call(r,c,d.originalDeps.slice()),delete u[c]),f(d.successor,p?o:a)}f(u,function(){throw new Error("Circle dependency may exists")})}}}function ja(t){return t.replace(/^\s+/,"").replace(/\s+$/,"")}function qa(t,e,i,n){var r=e[1]-e[0],a=i[1]-i[0];if(0===r)return 0===a?i[0]:(i[0]+i[1])/2;if(n)if(r>0){if(t<=e[0])return i[0];if(t>=e[1])return i[1]}else{if(t>=e[0])return i[0];if(t<=e[1])return i[1]}else{if(t===e[0])return i[0];if(t===e[1])return i[1]}return(t-e[0])/r*a+i[0]}function Ua(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return"string"==typeof t?ja(t).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?0/0:+t}function $a(t,e,i){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),i?t:+t}function Ka(t){return t.sort(function(t,e){return t-e}),t}function Qa(t){if(t=+t,isNaN(t))return 0;for(var e=1,i=0;Math.round(t*e)/e!==t;)e*=10,i++;return i}function Ja(t){var e=t.toString(),i=e.indexOf("e");if(i>0){var n=+e.slice(i+1);return 0>n?-n:0}var r=e.indexOf(".");return 0>r?0:e.length-1-r}function to(t,e){var i=Math.log,n=Math.LN10,r=Math.floor(i(t[1]-t[0])/n),a=Math.round(i(Math.abs(e[1]-e[0]))/n),o=Math.min(Math.max(-r+a,0),20);return isFinite(o)?o:20}function eo(t,e,i){if(!t[e])return 0;var n=g(t,function(t,e){return t+(isNaN(e)?0:e)},0);if(0===n)return 0;for(var r=Math.pow(10,i),a=p(t,function(t){return(isNaN(t)?0:t)/n*r*100}),o=100*r,s=p(a,function(t){return Math.floor(t)}),l=g(s,function(t,e){return t+e},0),h=p(a,function(t,e){return t-s[e]});o>l;){for(var u=Number.NEGATIVE_INFINITY,c=null,d=0,f=h.length;f>d;++d)h[d]>u&&(u=h[d],c=d);++s[c],h[c]=0,++l}return s[e]/r}function io(t){var e=2*Math.PI;return(t%e+e)%e}function no(t){return t>-tx&&tx>t}function ro(t){if(t instanceof Date)return t;if("string"==typeof t){var e=ix.exec(t);if(!e)return new Date(0/0);if(e[8]){var i=+e[4]||0;return"Z"!==e[8].toUpperCase()&&(i-=e[8].slice(0,3)),new Date(Date.UTC(+e[1],+(e[2]||1)-1,+e[3]||1,i,+(e[5]||0),+e[6]||0,+e[7]||0))}return new Date(+e[1],+(e[2]||1)-1,+e[3]||1,+e[4]||0,+(e[5]||0),+e[6]||0,+e[7]||0)}return new Date(null==t?0/0:Math.round(t))}function ao(t){return Math.pow(10,oo(t))}function oo(t){return Math.floor(Math.log(t)/Math.LN10)}function so(t,e){var i,n=oo(t),r=Math.pow(10,n),a=t/r;return i=e?1.5>a?1:2.5>a?2:4>a?3:7>a?5:10:1>a?1:2>a?2:3>a?3:5>a?5:10,t=i*r,n>=-20?+t.toFixed(0>n?-n:0):t}function lo(t,e){var i=(t.length-1)*e+1,n=Math.floor(i),r=+t[n-1],a=i-n;return a?r+a*(t[n]-r):r}function ho(t){function e(t,i,n){return t.interval[n]s;s++)a[s]<=i&&(a[s]=i,o[s]=s?1:1-n),i=a[s],n=o[s];a[0]===a[1]&&o[0]*o[1]!==1?t.splice(r,1):r++}return t}function uo(t){return t-parseFloat(t)>=0}function co(t){return isNaN(t)?"-":(t=(t+"").split("."),t[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(t.length>1?"."+t[1]:""))}function fo(t,e){return t=(t||"").toLowerCase().replace(/-(.)/g,function(t,e){return e.toUpperCase()}),e&&t&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t}function po(t){return null==t?"":(t+"").replace(ax,function(t,e){return ox[e]})}function go(t,e,i){_(e)||(e=[e]);var n=e.length;if(!n)return"";for(var r=e[0].$vars||[],a=0;as;s++)for(var l=0;l':'':{renderMode:r,content:"{marker"+a+"|} ",style:{color:i}}:"" +}function yo(t,e){return t+="","0000".substr(0,e-t.length)+t}function xo(t,e,i){("week"===t||"month"===t||"quarter"===t||"half-year"===t||"year"===t)&&(t="MM-dd\nyyyy");var n=ro(e),r=i?"UTC":"",a=n["get"+r+"FullYear"](),o=n["get"+r+"Month"]()+1,s=n["get"+r+"Date"](),l=n["get"+r+"Hours"](),h=n["get"+r+"Minutes"](),u=n["get"+r+"Seconds"](),c=n["get"+r+"Milliseconds"]();return t=t.replace("MM",yo(o,2)).replace("M",o).replace("yyyy",a).replace("yy",a%100).replace("dd",yo(s,2)).replace("d",s).replace("hh",yo(l,2)).replace("h",l).replace("mm",yo(h,2)).replace("m",h).replace("ss",yo(u,2)).replace("s",u).replace("SSS",yo(c,3))}function _o(t){return t?t.charAt(0).toUpperCase()+t.substr(1):t}function wo(t,e,i,n,r){var a=0,o=0;null==n&&(n=1/0),null==r&&(r=1/0);var s=0;e.eachChild(function(l,h){var u,c,d=l.position,f=l.getBoundingRect(),p=e.childAt(h+1),g=p&&p.getBoundingRect();if("horizontal"===t){var v=f.width+(g?-g.x+f.x:0);u=a+v,u>n||l.newline?(a=0,u=v,o+=s+i,s=f.height):s=Math.max(s,f.height)}else{var m=f.height+(g?-g.y+f.y:0);c=o+m,c>r||l.newline?(a+=s+i,o=0,c=m,s=f.width):s=Math.max(s,f.width)}l.newline||(d[0]=a,d[1]=o,"horizontal"===t?a=u+i:o=c+i)})}function bo(t,e,i){i=rx(i||0);var n=e.width,r=e.height,a=Ua(t.left,n),o=Ua(t.top,r),s=Ua(t.right,n),l=Ua(t.bottom,r),h=Ua(t.width,n),u=Ua(t.height,r),c=i[2]+i[0],d=i[1]+i[3],f=t.aspect;switch(isNaN(h)&&(h=n-s-d-a),isNaN(u)&&(u=r-l-c-o),null!=f&&(isNaN(h)&&isNaN(u)&&(f>n/r?h=.8*n:u=.8*r),isNaN(h)&&(h=f*u),isNaN(u)&&(u=h/f)),isNaN(a)&&(a=n-s-h-d),isNaN(o)&&(o=r-l-u-c),t.left||t.right){case"center":a=n/2-h/2-i[3];break;case"right":a=n-h-d}switch(t.top||t.bottom){case"middle":case"center":o=r/2-u/2-i[0];break;case"bottom":o=r-u-c}a=a||0,o=o||0,isNaN(h)&&(h=n-d-a-(s||0)),isNaN(u)&&(u=r-c-o-(l||0));var p=new gi(a+i[3],o+i[0],h,u);return p.margin=i,p}function So(t,e,i){function n(i,n){var o={},l=0,h={},u=0,c=2;if(dx(i,function(e){h[e]=t[e]}),dx(i,function(t){r(e,t)&&(o[t]=h[t]=e[t]),a(o,t)&&l++,a(h,t)&&u++}),s[n])return a(e,i[1])?h[i[2]]=null:a(e,i[2])&&(h[i[1]]=null),h;if(u!==c&&l){if(l>=c)return o;for(var d=0;dn;n++)if(t[n].length>e)return t[n];return t[i-1]}function Ao(t){var e=t.get("coordinateSystem"),i={coordSysName:e,coordSysDims:[],axisMap:N(),categoryAxisMap:N()},n=Mx[e];return n?(n(t,i,i.axisMap,i.categoryAxisMap),i):void 0}function Do(t){return"category"===t.get("type")}function ko(t){this.fromDataset=t.fromDataset,this.data=t.data||(t.sourceFormat===Ax?{}:[]),this.sourceFormat=t.sourceFormat||Dx,this.seriesLayoutBy=t.seriesLayoutBy||Px,this.dimensionsDefine=t.dimensionsDefine,this.encodeDefine=t.encodeDefine&&N(t.encodeDefine),this.startIndex=t.startIndex||0,this.dimensionsDetectCount=t.dimensionsDetectCount}function Po(t){var e=t.option.source,i=Dx;if(I(e))i=kx;else if(_(e)){0===e.length&&(i=Tx);for(var n=0,r=e.length;r>n;n++){var a=e[n];if(null!=a){if(_(a)){i=Tx;break}if(S(a)){i=Cx;break}}}}else if(S(e)){for(var o in e)if(e.hasOwnProperty(o)&&d(e[o])){i=Ax;break}}else if(null!=e)throw new Error("Invalid data");Ox(t).sourceFormat=i}function Lo(t){return Ox(t).source}function Oo(t){Ox(t).datasetMap=N()}function zo(t){var e=t.option,i=e.data,n=I(i)?kx:Ix,r=!1,a=e.seriesLayoutBy,o=e.sourceHeader,s=e.dimensions,l=Vo(t);if(l){var h=l.option;i=h.source,n=Ox(l).sourceFormat,r=!0,a=a||h.seriesLayoutBy,null==o&&(o=h.sourceHeader),s=s||h.dimensions}var u=Eo(i,n,a,o,s),c=e.encode;!c&&l&&(c=Fo(t,l,i,n,a,u)),Ox(t).source=new ko({data:i,fromDataset:r,seriesLayoutBy:a,sourceFormat:n,dimensionsDefine:u.dimensionsDefine,startIndex:u.startIndex,dimensionsDetectCount:u.dimensionsDetectCount,encodeDefine:c})}function Eo(t,e,i,n,r){if(!t)return{dimensionsDefine:Ro(r)};var a,o,s;if(e===Tx)"auto"===n||null==n?Bo(function(t){null!=t&&"-"!==t&&(b(t)?null==o&&(o=1):o=0)},i,t,10):o=n?1:0,r||1!==o||(r=[],Bo(function(t,e){r[e]=null!=t?t:""},i,t)),a=r?r.length:i===Lx?t.length:t[0]?t[0].length:null;else if(e===Cx)r||(r=No(t),s=!0);else if(e===Ax)r||(r=[],s=!0,f(t,function(t,e){r.push(e)}));else if(e===Ix){var l=Vn(t[0]);a=_(l)&&l.length||1}var h;return s&&f(r,function(t,e){"name"===(S(t)?t.name:t)&&(h=e)}),{startIndex:o,dimensionsDefine:Ro(r),dimensionsDetectCount:a,potentialNameDimIndex:h}}function Ro(t){if(t){var e=N();return p(t,function(t){if(t=o({},S(t)?t:{name:t}),null==t.name)return t;t.name+="",null==t.displayName&&(t.displayName=t.name);var i=e.get(t.name);return i?t.name+="-"+i.count++:e.set(t.name,{count:1}),t})}}function Bo(t,e,i,n){if(null==n&&(n=1/0),e===Lx)for(var r=0;rr;r++)t(i[r]?i[r][0]:null,r);else for(var a=i[0]||[],r=0;rr;r++)t(a[r],r)}function No(t){for(var e,i=0;ix&&null==y;x++)Go(i,n,r,a.dimensionsDefine,a.startIndex,x)||(y=x);if(null!=y){s.value=y;var _=a.potentialNameDimIndex||Math.max(y-1,0);h.push(_),l.push(_)}}return l.length&&(s.itemName=l),h.length&&(s.seriesName=h),s}function Vo(t){var e=t.option,i=e.data;return i?void 0:t.ecModel.getComponent("dataset",e.datasetIndex||0)}function Wo(t,e){return Go(t.data,t.sourceFormat,t.seriesLayoutBy,t.dimensionsDefine,t.startIndex,e)}function Go(t,e,i,n,r,a){function o(t){return null!=t&&isFinite(t)&&""!==t?!1:b(t)&&"-"!==t?!0:void 0}var s,l=5;if(I(t))return!1;var h;if(n&&(h=n[a],h=S(h)?h.name:h),e===Tx)if(i===Lx){for(var u=t[a],c=0;c<(u||[]).length&&l>c;c++)if(null!=(s=o(u[r+c])))return s}else for(var c=0;cc;c++){var d=t[r+c];if(d&&null!=(s=o(d[a])))return s}else if(e===Cx){if(!h)return;for(var c=0;cc;c++){var f=t[c];if(f&&null!=(s=o(f[h])))return s}}else if(e===Ax){if(!h)return;var u=t[h];if(!u||I(u))return!1;for(var c=0;cc;c++)if(null!=(s=o(u[c])))return s}else if(e===Ix)for(var c=0;cc;c++){var f=t[c],p=Vn(f);if(!_(p))return!1;if(null!=(s=o(p[a])))return s}return!1}function Ho(t,e){if(e){var i=e.seiresIndex,n=e.seriesId,r=e.seriesName;return null!=i&&t.componentIndex!==i||null!=n&&t.id!==n||null!=r&&t.name!==r}}function Zo(t,e){var i=t.color&&!t.colorLayer;f(e,function(e,a){"colorLayer"===a&&i||yx.hasClass(a)||("object"==typeof e?t[a]=t[a]?r(t[a],e,!1):n(e):null==t[a]&&(t[a]=e))})}function Xo(t){t=t,this.option={},this.option[zx]=1,this._componentsMap=N({series:[]}),this._seriesIndices,this._seriesIndicesMap,Zo(t,this._theme.option),r(t,_x,!1),this.mergeOption(t)}function Yo(t,e){_(e)||(e=e?[e]:[]);var i={};return f(e,function(e){i[e]=(t.get(e)||[]).slice()}),i}function jo(t,e,i){var n=e.type?e.type:i?i.subType:yx.determineSubType(t,e);return n}function qo(t,e){t._seriesIndicesMap=N(t._seriesIndices=p(e,function(t){return t.componentIndex})||[])}function Uo(t,e){return e.hasOwnProperty("subType")?v(t,function(t){return t.subType===e.subType}):t}function $o(t){f(Rx,function(e){this[e]=y(t[e],t)},this)}function Ko(){this._coordinateSystems=[]}function Qo(t){this._api=t,this._timelineOptions=[],this._mediaList=[],this._mediaDefault,this._currentMediaIndices=[],this._optionBackup,this._newBaseOption}function Jo(t,e,i){var n,r,a=[],o=[],s=t.timeline;if(t.baseOption&&(r=t.baseOption),(s||t.options)&&(r=r||{},a=(t.options||[]).slice()),t.media){r=r||{};var l=t.media;Nx(l,function(t){t&&t.option&&(t.query?o.push(t):n||(n=t))})}return r||(r=t),r.timeline||(r.timeline=s),Nx([r].concat(a).concat(p(o,function(t){return t.option})),function(t){Nx(e,function(e){e(t,i)})}),{baseOption:r,timelineOptions:a,mediaDefault:n,mediaList:o}}function ts(t,e,i){var n={width:e,height:i,aspectratio:e/i},r=!0;return f(t,function(t,e){var i=e.match(Gx);if(i&&i[1]&&i[2]){var a=i[1],o=i[2].toLowerCase();es(n[o],t,a)||(r=!1)}}),r}function es(t,e,i){return"min"===i?t>=e:"max"===i?e>=t:t===e}function is(t,e){return t.join(",")===e.join(",")}function ns(t,e){e=e||{},Nx(e,function(e,i){if(null!=e){var n=t[i];if(yx.hasClass(i)){e=Nn(e),n=Nn(n);var r=Gn(n,e);t[i]=Vx(r,function(t){return t.option&&t.exist?Wx(t.exist,t.option,!0):t.exist||t.option})}else t[i]=Wx(n,e,!0)}})}function rs(t){var e=t&&t.itemStyle;if(e)for(var i=0,n=Xx.length;n>i;i++){var a=Xx[i],o=e.normal,s=e.emphasis;o&&o[a]&&(t[a]=t[a]||{},t[a].normal?r(t[a].normal,o[a]):t[a].normal=o[a],o[a]=null),s&&s[a]&&(t[a]=t[a]||{},t[a].emphasis?r(t[a].emphasis,s[a]):t[a].emphasis=s[a],s[a]=null)}}function as(t,e,i){if(t&&t[e]&&(t[e].normal||t[e].emphasis)){var n=t[e].normal,r=t[e].emphasis;n&&(i?(t[e].normal=t[e].emphasis=null,s(t[e],n)):t[e]=n),r&&(t.emphasis=t.emphasis||{},t.emphasis[e]=r)}}function os(t){as(t,"itemStyle"),as(t,"lineStyle"),as(t,"areaStyle"),as(t,"label"),as(t,"labelLine"),as(t,"upperLabel"),as(t,"edgeLabel")}function ss(t,e){var i=Zx(t)&&t[e],n=Zx(i)&&i.textStyle;if(n)for(var r=0,a=sm.length;a>r;r++){var e=sm[r];n.hasOwnProperty(e)&&(i[e]=n[e])}}function ls(t){t&&(os(t),ss(t,"label"),t.emphasis&&ss(t.emphasis,"label"))}function hs(t){if(Zx(t)){rs(t),os(t),ss(t,"label"),ss(t,"upperLabel"),ss(t,"edgeLabel"),t.emphasis&&(ss(t.emphasis,"label"),ss(t.emphasis,"upperLabel"),ss(t.emphasis,"edgeLabel"));var e=t.markPoint;e&&(rs(e),ls(e));var i=t.markLine;i&&(rs(i),ls(i));var n=t.markArea;n&&ls(n);var r=t.data;if("graph"===t.type){r=r||t.nodes;var a=t.links||t.edges;if(a&&!I(a))for(var o=0;o=0;p--){var g=t[p];if(s||(d=g.data.rawIndexOf(g.stackedByDimension,c)),d>=0){var v=g.data.getByRawIndex(g.stackResultDimension,d);if(u>=0&&v>0||0>=u&&0>v){u+=v,f=v;break}}}return n[0]=u,n[1]=f,n});o.hostModel.setData(l),e.data=l})}function vs(t,e){ko.isInstance(t)||(t=ko.seriesDataToSource(t)),this._source=t;var i=this._data=t.data,n=t.sourceFormat;n===kx&&(this._offset=0,this._dimSize=e,this._data=i);var r=Qx[n===Tx?n+"_"+t.seriesLayoutBy:n];o(this,r)}function ms(){return this._data.length}function ys(t){return this._data[t]}function xs(t){for(var e=0;ee.outputData.count()&&e.model.getRawData().cloneShallow(e.outputData)}function zs(t,e){f(t.CHANGABLE_METHODS,function(i){t.wrapMethod(i,x(Es,e))})}function Es(t){var e=Rs(t);e&&e.setOutputEnd(this.count())}function Rs(t){var e=(t.ecModel||{}).scheduler,i=e&&e.getPipeline(t.uid);if(i){var n=i.currentTask;if(n){var r=n.agentStubMap;r&&(n=r.get(t.uid))}return n}}function Bs(){this.group=new lv,this.uid=Za("viewChart"),this.renderTask=Is({plan:Vs,reset:Ws}),this.renderTask.context={view:this}}function Ns(t,e){if(t&&(t.trigger(e),"group"===t.type))for(var i=0;i=0?n():c=setTimeout(n,-a),h=r};return d.clear=function(){c&&(clearTimeout(c),c=null)},d.debounceNextCall=function(t){l=t},d}function Hs(t,e,i,n){var r=t[e];if(r){var a=r[p_]||r,o=r[v_],s=r[g_];if(s!==i||o!==n){if(null==i||!n)return t[e]=a;r=t[e]=Gs(a,i,"debounce"===n),r[p_]=a,r[v_]=n,r[g_]=i}return r}}function Zs(t,e){var i=t[e];i&&i[p_]&&(t[e]=i[p_])}function Xs(t,e,i,n){this.ecInstance=t,this.api=e,this.unfinished;var i=this._dataProcessorHandlers=i.slice(),n=this._visualHandlers=n.slice();this._allHandlers=i.concat(n),this._stageTaskMap=N()}function Ys(t,e,i,n,r){function a(t,e){return t.setDirty&&(!t.dirtyMap||t.dirtyMap.get(e.__pipeline.id))}r=r||{};var o;f(e,function(e){if(!r.visualType||r.visualType===e.visualType){var s=t._stageTaskMap.get(e.uid),l=s.seriesTaskMap,h=s.overallTask;if(h){var u,c=h.agentStubMap;c.each(function(t){a(r,t)&&(t.dirty(),u=!0)}),u&&h.dirty(),S_(h,n);var d=t.getPerformArgs(h,r.block);c.each(function(t){t.perform(d)}),o|=h.perform(d)}else l&&l.each(function(s){a(r,s)&&s.dirty();var l=t.getPerformArgs(s,r.block);l.skip=!e.performRawSeries&&i.isSeriesFiltered(s.context.model),S_(s,n),o|=s.perform(l)})}}),t.unfinished|=o}function js(t,e,i,n,r){function a(i){var a=i.uid,s=o.get(a)||o.set(a,Is({plan:Js,reset:tl,count:il}));s.context={model:i,ecModel:n,api:r,useClearVisual:e.isVisual&&!e.isLayout,plan:e.plan,reset:e.reset,scheduler:t},nl(t,i,s)}var o=i.seriesTaskMap||(i.seriesTaskMap=N()),s=e.seriesType,l=e.getTargetSeries;e.createOnAllSeries?n.eachRawSeries(a):s?n.eachRawSeriesByType(s,a):l&&l(n,r).each(a);var h=t._pipelineMap;o.each(function(t,e){h.get(e)||(t.dispose(),o.removeKey(e))})}function qs(t,e,i,n,r){function a(e){var i=e.uid,n=s.get(i);n||(n=s.set(i,Is({reset:$s,onDirty:Qs})),o.dirty()),n.context={model:e,overallProgress:u,modifyOutputEnd:c},n.agent=o,n.__block=u,nl(t,e,n)}var o=i.overallTask=i.overallTask||Is({reset:Us});o.context={ecModel:n,api:r,overallReset:e.overallReset,scheduler:t};var s=o.agentStubMap=o.agentStubMap||N(),l=e.seriesType,h=e.getTargetSeries,u=!0,c=e.modifyOutputEnd;l?n.eachRawSeriesByType(l,a):h?h(n,r).each(a):(u=!1,f(n.getSeries(),a));var d=t._pipelineMap;s.each(function(t,e){d.get(e)||(t.dispose(),o.dirty(),s.removeKey(e))})}function Us(t){t.overallReset(t.ecModel,t.api,t.payload)}function $s(t){return t.overallProgress&&Ks}function Ks(){this.agent.dirty(),this.getDownstream().dirty()}function Qs(){this.agent&&this.agent.dirty()}function Js(t){return t.plan&&t.plan(t.model,t.ecModel,t.api,t.payload)}function tl(t){t.useClearVisual&&t.data.clearAllVisual();var e=t.resetDefines=Nn(t.reset(t.model,t.ecModel,t.api,t.payload));return e.length>1?p(e,function(t,e){return el(e)}):M_}function el(t){return function(e,i){var n=i.data,r=i.resetDefines[t];if(r&&r.dataEach)for(var a=e.start;a0?parseInt(n,10)/100:n?parseFloat(n):0;var r=i.getAttribute("stop-color")||"#000000";e.addColorStop(n,r)}i=i.nextSibling}}function hl(t,e){t&&t.__inheritedStyle&&(e.__inheritedStyle||(e.__inheritedStyle={}),s(e.__inheritedStyle,t.__inheritedStyle))}function ul(t){for(var e=z(t).split(E_),i=[],n=0;n0;a-=2){var o=r[a],s=r[a-1];switch(n=n||be(),s){case"translate":o=z(o).split(E_),Te(n,n,[parseFloat(o[0]),parseFloat(o[1]||0)]);break;case"scale":o=z(o).split(E_),Ae(n,n,[parseFloat(o[0]),parseFloat(o[1]||o[0])]);break;case"rotate":o=z(o).split(E_),Ce(n,n,parseFloat(o[0]));break;case"skew":o=z(o).split(E_),console.warn("Skew transform is not supported yet");break;case"matrix":var o=z(o).split(E_);n[0]=parseFloat(o[0]),n[1]=parseFloat(o[1]),n[2]=parseFloat(o[2]),n[3]=parseFloat(o[3]),n[4]=parseFloat(o[4]),n[5]=parseFloat(o[5])}}}e.setLocalTransform(n)}function pl(t){var e=t.getAttribute("style"),i={};if(!e)return i;var n={};W_.lastIndex=0;for(var r;null!=(r=W_.exec(e));)n[r[1]]=r[2];for(var a in N_)N_.hasOwnProperty(a)&&null!=n[a]&&(i[N_[a]]=n[a]);return i}function gl(t,e,i){var n=e/t.width,r=i/t.height,a=Math.min(n,r),o=[a,a],s=[-(t.x+t.width/2)*a+e/2,-(t.y+t.height/2)*a+i/2];return{scale:o,position:s}}function vl(t){return function(e,i,n){e=e&&e.toLowerCase(),bg.prototype[t].call(this,e,i,n)}}function ml(){bg.call(this)}function yl(t,e,i){function r(t,e){return t.__prio-e.__prio}i=i||{},"string"==typeof e&&(e=xw[e]),this.id,this.group,this._dom=t;var a="canvas",o=this._zr=On(t,{renderer:i.renderer||a,devicePixelRatio:i.devicePixelRatio,width:i.width,height:i.height});this._throttledZrFlush=Gs(y(o.flush,o),17);var e=n(e);e&&Ux(e,!0),this._theme=e,this._chartsViews=[],this._chartsMap={},this._componentsViews=[],this._componentsMap={},this._coordSysMgr=new Ko;var s=this._api=Rl(this);Si(yw,r),Si(gw,r),this._scheduler=new Xs(this,s,gw,yw),bg.call(this,this._ecEventProcessor=new Bl),this._messageCenter=new ml,this._initEvents(),this.resize=y(this.resize,this),this._pendingActions=[],o.animation.on("frame",this._onframe,this),Tl(o,this),E(this)}function xl(t,e,i){var n,r=this._model,a=this._coordSysMgr.getCoordinateSystems();e=qn(r,e);for(var o=0;oe.get("hoverLayerThreshold")&&!tg.node&&i.traverse(function(t){t.isGroup||(t.useHoverLayer=!0)})}function zl(t,e){var i=t.get("blendMode")||null;e.group.traverse(function(t){t.isGroup||t.style.blend!==i&&t.setStyle("blend",i),t.eachPendingDisplayable&&t.eachPendingDisplayable(function(t){t.setStyle("blend",i)})})}function El(t,e){var i=t.get("z"),n=t.get("zlevel");e.group.traverse(function(t){"group"!==t.type&&(null!=i&&(t.z=i),null!=n&&(t.zlevel=n))})}function Rl(t){var e=t._coordSysMgr;return o(new $o(t),{getCoordinateSystems:y(e.getCoordinateSystems,e),getComponentByElement:function(e){for(;e;){var i=e.__ecComponentInfo;if(null!=i)return t._model.getComponent(i.mainType,i.index);e=e.parent}}})}function Bl(){this.eventInfo}function Nl(t){function e(t,e){for(var i=0;i65535?Ow:zw}function vh(t){var e=t.constructor;return e===Array?t.slice():new e(t)}function mh(t,e){f(Ew.concat(e.__wrappedMethods||[]),function(i){e.hasOwnProperty(i)&&(t[i]=e[i])}),t.__wrappedMethods=e.__wrappedMethods,f(Rw,function(i){t[i]=n(e[i])}),t._calculationInfo=o(e._calculationInfo)}function yh(t){var e=t._invertedIndicesMap;f(e,function(i,n){var r=t._dimensionInfos[n],a=r.ordinalMeta;if(a){i=e[n]=new Ow(a.categories.length);for(var o=0;o=0?this._indices[t]:-1}function bh(t,e){var i=t._idList[e];return null==i&&(i=xh(t,t._idDimIdx,e)),null==i&&(i=Pw+e),i}function Sh(t){return _(t)||(t=[t]),t}function Mh(t,e){var i=t.dimensions,n=new Bw(p(i,t.getDimensionInfo,t),t.hostModel);mh(n,t);for(var r=n._storage={},a=t._storage,o=0;o=0?(r[s]=Ih(a[s]),n._rawExtent[s]=Th(),n._extent[s]=null):r[s]=a[s])}return n}function Ih(t){for(var e=new Array(t.length),i=0;ip;p++){var g=a[p]=o({},S(a[p])?a[p]:{name:a[p]}),v=g.name,m=c[p]={otherDims:{}};null!=v&&null==h.get(v)&&(m.name=m.displayName=v,h.set(v,p)),null!=g.type&&(m.type=g.type),null!=g.displayName&&(m.displayName=g.displayName)}l.each(function(t,e){if(t=Nn(t).slice(),1===t.length&&t[0]<0)return void l.set(e,!1);var i=l.set(e,[]);f(t,function(t,n){b(t)&&(t=h.get(t)),null!=t&&d>t&&(i[n]=t,r(c[t],e,n))})});var y=0;f(t,function(t){var e,t,i,a;if(b(t))e=t,t={};else{e=t.name;var o=t.ordinalMeta;t.ordinalMeta=null,t=n(t),t.ordinalMeta=o,i=t.dimsDef,a=t.otherDims,t.name=t.coordDim=t.coordDimIndex=t.dimsDef=t.otherDims=null}var h=l.get(e);if(h!==!1){var h=Nn(h);if(!h.length)for(var u=0;u<(i&&i.length||1);u++){for(;yI;I++){var m=c[I]=c[I]||{},T=m.coordDim;null==T&&(m.coordDim=Dh(M,u,w),m.coordDimIndex=0,(!x||0>=_)&&(m.isExtraCoord=!0),_--),null==m.name&&(m.name=Dh(m.coordDim,h)),null==m.type&&Wo(e,I,m.name)&&(m.type="ordinal")}return c}function Ah(t,e,i,n){var r=Math.max(t.dimensionsDetectCount||1,e.length,i.length,n||0);return f(e,function(t){var e=t.dimsDef;e&&(r=Math.max(r,e.length)) +}),r}function Dh(t,e,i){if(i||null!=e.get(t)){for(var n=0;null!=e.get(t+n);)n++;t+=n}return e.set(t,!0),t}function kh(t,e,i){i=i||{};var n,r,a,o,s=i.byIndex,l=i.stackedCoordDimension,h=!(!t||!t.get("stack"));if(f(e,function(t,i){b(t)&&(e[i]=t={name:t}),h&&!t.isExtraCoord&&(s||n||!t.ordinalMeta||(n=t),r||"ordinal"===t.type||"time"===t.type||l&&l!==t.coordDim||(r=t))}),!r||s||n||(s=!0),r){a="__\x00ecstackresult",o="__\x00ecstackedover",n&&(n.createInvertedIndices=!0);var u=r.coordDim,c=r.type,d=0;f(e,function(t){t.coordDim===u&&d++}),e.push({name:a,coordDim:u,coordDimIndex:d,type:c,isExtraCoord:!0,isCalculationCoord:!0}),d++,e.push({name:o,coordDim:o,coordDimIndex:d,type:c,isExtraCoord:!0,isCalculationCoord:!0})}return{stackedDimension:r&&r.name,stackedByDimension:n&&n.name,isStackedByIndex:s,stackedOverDimension:o,stackResultDimension:a}}function Ph(t,e){return!!e&&e===t.getCalculationInfo("stackedDimension")}function Lh(t,e){return Ph(t,e)?t.getCalculationInfo("stackResultDimension"):e}function Oh(t,e,i){i=i||{},ko.isInstance(t)||(t=ko.seriesDataToSource(t));var n,r=e.get("coordinateSystem"),a=Ko.get(r),o=Ao(e);o&&(n=p(o.coordSysDims,function(t){var e={name:t},i=o.axisMap.get(t);if(i){var n=i.get("type");e.type=fh(n)}return e})),n||(n=a&&(a.getDimensionsInfo?a.getDimensionsInfo():a.dimensions.slice())||["x","y"]);var s,l,h=Vw(t,{coordDimensions:n,generateCoord:i.generateCoord});o&&f(h,function(t,e){var i=t.coordDim,n=o.categoryAxisMap.get(i);n&&(null==s&&(s=e),t.ordinalMeta=n.getOrdinalMeta()),null!=t.otherDims.itemName&&(l=!0)}),l||null==s||(h[s].otherDims.itemName=0);var u=kh(e,h),c=new Bw(h,e);c.setCalculationInfo(u);var d=null!=s&&zh(t)?function(t,e,i,n){return n===s?i:this.defaultDimValueGetter(t,e,i,n)}:null;return c.hasItemOption=!1,c.initData(t,null,d),c}function zh(t){if(t.sourceFormat===Ix){var e=Eh(t.data||[]);return null!=e&&!_(Vn(e))}}function Eh(t){for(var e=0;eo&&(o=r.interval=i),null!=n&&o>n&&(o=r.interval=n);var s=r.intervalPrecision=Wh(o),l=r.niceTickExtent=[Zw(Math.ceil(t[0]/o)*o,s),Zw(Math.floor(t[1]/o)*o,s)];return Hh(l,t),r}function Wh(t){return Ja(t)+2}function Gh(t,e,i){t[e]=Math.max(Math.min(t[e],i[1]),i[0])}function Hh(t,e){!isFinite(t[0])&&(t[0]=e[0]),!isFinite(t[1])&&(t[1]=e[1]),Gh(t,0,e),Gh(t,1,e),t[0]>t[1]&&(t[0]=t[1])}function Zh(t,e,i,n){var r=[];if(!t)return r;var a=1e4;e[0]a)return[];return e[1]>(r.length?r[r.length-1]:i[1])&&r.push(e[1]),r}function Xh(t){return t.get("stack")||jw+t.seriesIndex}function Yh(t){return t.dim+t.index}function jh(t){var e=[],i=t.axis,n="axis0";if("category"===i.type){for(var r=i.getBandWidth(),a=0;ae&&(e=Math.min(e,s),t.width&&(e=Math.min(e,t.width)),s-=e,t.width=e,l--)}),h=(s-a)/(l+(l-1)*o),h=Math.max(h,0);var u,c=0;f(n,function(t){t.width||(t.width=h),u=t,c+=t.width*(1+o)}),u&&(c-=u.width*o);var d=-c/2;f(n,function(t,n){i[e][n]=i[e][n]||{offset:d,width:t.width},d+=t.width*(1+o)})}),i}function Kh(t,e,i){if(t&&e){var n=t[Yh(e)];return null!=n&&null!=i&&(n=n[Xh(i)]),n}}function Qh(t,e){var i=qh(t,e),n=Uh(i),r={};f(i,function(t){var e=t.getData(),i=t.coordinateSystem,a=i.getBaseAxis(),o=Xh(t),s=n[Yh(a)][o],l=s.offset,h=s.width,u=i.getOtherAxis(a),c=t.get("barMinHeight")||0;r[o]=r[o]||[],e.setLayout({offset:l,size:h});for(var d=e.mapDimension(u.dim),f=e.mapDimension(a.dim),p=Ph(e,d),g=u.isHorizontal(),v=eu(a,u,p),m=0,y=e.count();y>m;m++){var x=e.get(d,m),_=e.get(f,m);if(!isNaN(x)){var w=x>=0?"p":"n",b=v;p&&(r[o][_]||(r[o][_]={p:v,n:v}),b=r[o][_][w]);var S,M,I,T;if(g){var C=i.dataToPoint([x,_]);S=b,M=C[1]+l,I=C[0]-v,T=h,Math.abs(I)I?-1:1)*c),p&&(r[o][_][w]+=I)}else{var C=i.dataToPoint([_,x]);S=C[0]+l,M=b,I=h,T=C[1]-v,Math.abs(T)=T?-1:1)*c),p&&(r[o][_][w]+=T)}e.setItemLayout(m,{x:S,y:M,width:I,height:T})}}},this)}function Jh(t){return t.coordinateSystem&&"cartesian2d"===t.coordinateSystem.type}function tu(t){return t.pipelineContext&&t.pipelineContext.large}function eu(t,e){var i,n,r=e.getGlobalExtent();r[0]>r[1]?(i=r[1],n=r[0]):(i=r[0],n=r[1]);var a=e.toGlobalCoord(e.dataToCoord(0));return i>a&&(a=i),a>n&&(a=n),a}function iu(t,e){return ub(t,hb(e))}function nu(t,e){var i,n,r,a=t.type,o=e.getMin(),s=e.getMax(),l=null!=o,h=null!=s,u=t.getExtent();"ordinal"===a?i=e.getCategories().length:(n=e.get("boundaryGap"),_(n)||(n=[n||0,n||0]),"boolean"==typeof n[0]&&(n=[0,0]),n[0]=Ua(n[0],1),n[1]=Ua(n[1],1),r=u[1]-u[0]||Math.abs(u[0])),null==o&&(o="ordinal"===a?i?0:0/0:u[0]-n[0]*r),null==s&&(s="ordinal"===a?i?i-1:0/0:u[1]+n[1]*r),"dataMin"===o?o=u[0]:"function"==typeof o&&(o=o({min:u[0],max:u[1]})),"dataMax"===s?s=u[1]:"function"==typeof s&&(s=s({min:u[0],max:u[1]})),(null==o||!isFinite(o))&&(o=0/0),(null==s||!isFinite(s))&&(s=0/0),t.setBlank(C(o)||C(s)||"ordinal"===a&&!t.getOrdinalMeta().categories.length),e.getNeedCrossZero()&&(o>0&&s>0&&!l&&(o=0),0>o&&0>s&&!h&&(s=0));var c=e.ecModel;if(c&&"time"===a){var d,p=qh("bar",c);if(f(p,function(t){d|=t.getBaseAxis()===e.axis}),d){var g=Uh(p),v=ru(o,s,e,g);o=v.min,s=v.max}}return[o,s]}function ru(t,e,i,n){var r=i.axis.getExtent(),a=r[1]-r[0],o=Kh(n,i.axis);if(void 0===o)return{min:t,max:e};var s=1/0;f(o,function(t){s=Math.min(t.offset,s)});var l=-1/0;f(o,function(t){l=Math.max(t.offset+t.width,l)}),s=Math.abs(s),l=Math.abs(l);var h=s+l,u=e-t,c=1-(s+l)/a,d=u/c-u;return e+=d*(l/h),t-=d*(s/h),{min:t,max:e}}function au(t,e){var i=nu(t,e),n=null!=e.getMin(),r=null!=e.getMax(),a=e.get("splitNumber");"log"===t.type&&(t.base=e.get("logBase"));var o=t.type;t.setExtent(i[0],i[1]),t.niceExtent({splitNumber:a,fixMin:n,fixMax:r,minInterval:"interval"===o||"time"===o?e.get("minInterval"):null,maxInterval:"interval"===o||"time"===o?e.get("maxInterval"):null});var s=e.get("interval");null!=s&&t.setInterval&&t.setInterval(s)}function ou(t,e){if(e=e||t.get("type"))switch(e){case"category":return new Hw(t.getOrdinalMeta?t.getOrdinalMeta():t.getCategories(),[1/0,-1/0]);case"value":return new Yw;default:return(Rh.getClass(e)||Yw).create(t)}}function su(t){var e=t.scale.getExtent(),i=e[0],n=e[1];return!(i>0&&n>0||0>i&&0>n)}function lu(t){var e=t.getLabelModel().get("formatter"),i="category"===t.type?t.scale.getExtent()[0]:null;return"string"==typeof e?e=function(e){return function(i){return i=t.scale.getLabel(i),e.replace("{value}",null!=i?i:"")}}(e):"function"==typeof e?function(n,r){return null!=i&&(r=n-i),e(hu(t,n),r)}:function(e){return t.scale.getLabel(e)}}function hu(t,e){return"category"===t.type?t.scale.getLabel(e):e}function uu(t){var e=t.model,i=t.scale;if(e.get("axisLabel.show")&&!i.isBlank()){var n,r,a="category"===t.type,o=i.getExtent();a?r=i.count():(n=i.getTicks(),r=n.length);var s,l=t.getLabelModel(),h=lu(t),u=1;r>40&&(u=Math.ceil(r/40));for(var c=0;r>c;c+=u){var d=n?n[c]:o[0]+c,f=h(d),p=l.getTextRect(f),g=cu(p,l.get("rotate")||0);s?s.union(g):s=g}return s}}function cu(t,e){var i=e*Math.PI/180,n=t.plain(),r=n.width,a=n.height,o=r*Math.cos(i)+a*Math.sin(i),s=r*Math.sin(i)+a*Math.cos(i),l=new gi(n.x,n.y,o,s);return l}function du(t,e){if("image"!==this.type){var i=this.style,n=this.shape;n&&"line"===n.symbolType?i.stroke=t:this.__isEmptyBrush?(i.stroke=t,i.fill=e||"#fff"):(i.fill&&(i.fill=t),i.stroke&&(i.stroke=t)),this.dirty(!1)}}function fu(t,e,i,n,r,a,o){var s=0===t.indexOf("empty");s&&(t=t.substr(5,1).toLowerCase()+t.substr(6));var l;return l=0===t.indexOf("image://")?Jr(t.slice(8),new gi(e,i,n,r),o?"center":"cover"):0===t.indexOf("path://")?Qr(t.slice(7),{},new gi(e,i,n,r),o?"center":"cover"):new Mb({shape:{symbolType:t,x:e,y:i,width:n,height:r}}),l.__isEmptyBrush=s,l.setColor=du,l.setColor(a),l}function pu(t){return Oh(t.getSource(),t)}function gu(t,e){var i=e;Wa.isInstance(e)||(i=new Wa(e),c(i,vb));var n=ou(i);return n.setExtent(t[0],t[1]),au(n,i),n}function vu(t){c(t,vb)}function mu(t,e){return Math.abs(t-e)>1^-(1&s),l=l>>1^-(1&l),s+=r,l+=a,r=s,a=l,n.push([s/i,l/i])}return n}function bu(t){return"category"===t.type?Mu(t):Cu(t)}function Su(t,e){return"category"===t.type?Tu(t,e):{ticks:t.scale.getTicks()}}function Mu(t){var e=t.getLabelModel(),i=Iu(t,e);return!e.get("show")||t.scale.isBlank()?{labels:[],labelCategoryInterval:i.labelCategoryInterval}:i}function Iu(t,e){var i=Au(t,"labels"),n=Ru(e),r=Du(i,n);if(r)return r;var a,o;return w(n)?a=Eu(t,n):(o="auto"===n?Pu(t):n,a=zu(t,o)),ku(i,n,{labels:a,labelCategoryInterval:o})}function Tu(t,e){var i=Au(t,"ticks"),n=Ru(e),r=Du(i,n);if(r)return r;var a,o;if((!e.get("show")||t.scale.isBlank())&&(a=[]),w(n))a=Eu(t,n,!0);else if("auto"===n){var s=Iu(t,t.getLabelModel());o=s.labelCategoryInterval,a=p(s.labels,function(t){return t.tickValue})}else o=n,a=zu(t,o,!0);return ku(i,n,{ticks:a,tickCategoryInterval:o})}function Cu(t){var e=t.scale.getTicks(),i=lu(t);return{labels:p(e,function(e,n){return{formattedLabel:i(e,n),rawLabel:t.scale.getLabel(e),tickValue:e}})}}function Au(t,e){return Db(t)[e]||(Db(t)[e]=[])}function Du(t,e){for(var i=0;i40&&(s=Math.max(1,Math.floor(o/40)));for(var l=a[0],h=t.dataToCoord(l+1)-t.dataToCoord(l),u=Math.abs(h*Math.cos(n)),c=Math.abs(h*Math.sin(n)),d=0,f=0;l<=a[1];l+=s){var p=0,g=0,v=Ei(i(l),e.font,"center","top");p=1.3*v.width,g=1.3*v.height,d=Math.max(d,p,7),f=Math.max(f,g,7)}var m=d/u,y=f/c;isNaN(m)&&(m=1/0),isNaN(y)&&(y=1/0);var x=Math.max(0,Math.floor(Math.min(m,y))),_=Db(t.model),w=_.lastAutoInterval,b=_.lastTickCount;return null!=w&&null!=b&&Math.abs(w-x)<=1&&Math.abs(b-o)<=1&&w>x?x=w:(_.lastTickCount=o,_.lastAutoInterval=x),x}function Ou(t){var e=t.getLabelModel();return{axisRotate:t.getRotate?t.getRotate():t.isHorizontal&&!t.isHorizontal()?90:0,labelRotate:e.get("rotate")||0,font:e.getFont()}}function zu(t,e,i){function n(t){l.push(i?t:{formattedLabel:r(t),rawLabel:a.getLabel(t),tickValue:t})}var r=lu(t),a=t.scale,o=a.getExtent(),s=t.getLabelModel(),l=[],h=Math.max((e||0)+1,1),u=o[0],c=a.count();0!==u&&h>1&&c/h>2&&(u=Math.round(Math.ceil(u/h)*h));var d={min:s.get("showMinLabel"),max:s.get("showMaxLabel")};d.min&&u!==o[0]&&n(o[0]);for(var f=u;f<=o[1];f+=h)n(f);return d.max&&f!==o[1]&&n(o[1]),l}function Eu(t,e,i){var n=t.scale,r=lu(t),a=[];return f(n.getTicks(),function(t){var o=n.getLabel(t);e(t,o)&&a.push(i?t:{formattedLabel:r(t),rawLabel:o,tickValue:t})}),a}function Ru(t){var e=t.get("interval");return null==e?"auto":e}function Bu(t,e){var i=t[1]-t[0],n=e,r=i/n/2;t[0]+=r,t[1]-=r}function Nu(t,e,i,n,r){function a(t,e){return u?t>e:e>t}var o=e.length;if(t.onBand&&!n&&o){var s,l=t.getExtent();if(1===o)e[0].coord=l[0],s=e[1]={coord:l[0]};else{var h=e[1].coord-e[0].coord;f(e,function(t){t.coord-=h/2;var e=e||0;e%2>0&&(t.coord-=h/(2*(e+1)))}),s={coord:e[o-1].coord+h},e.push(s)}var u=l[0]>l[1];a(e[0].coord,l[0])&&(r?e[0].coord=l[0]:e.shift()),r&&a(l[0],e[0].coord)&&e.unshift({coord:l[0]}),a(l[1],s.coord)&&(r?s.coord=l[1]:e.pop()),r&&a(s.coord,l[1])&&e.push({coord:l[1]})}}function Fu(t){return this._axes[t]}function Vu(t){Eb.call(this,t)}function Wu(t,e){return e.type||(e.data?"category":"value")}function Gu(t,e){return t.getCoordSysModel()===e}function Hu(t,e,i){this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this._initCartesian(t,e,i),this.model=t}function Zu(t,e,i,n){function r(t){return t.dim+"_"+t.index}i.getAxesOnZeroOf=function(){return a?[a]:[]};var a,o=t[e],s=i.model,l=s.get("axisLine.onZero"),h=s.get("axisLine.onZeroAxisIndex");if(l){if(null!=h)Xu(o[h])&&(a=o[h]);else for(var u in o)if(o.hasOwnProperty(u)&&Xu(o[u])&&!n[r(o[u])]){a=o[u];break}a&&(n[r(a)]=!0)}}function Xu(t){return t&&"category"!==t.type&&"time"!==t.type&&su(t)}function Yu(t,e){var i=t.getExtent(),n=i[0]+i[1];t.toGlobalCoord="x"===t.dim?function(t){return t+e}:function(t){return n-t+e},t.toLocalCoord="x"===t.dim?function(t){return t-e}:function(t){return n-t+e}}function ju(t){return p(Zb,function(e){var i=t.getReferringComponents(e)[0];return i})}function qu(t){return"cartesian2d"===t.get("coordinateSystem")}function Uu(t,e){var i=t.mapDimension("defaultedLabel",!0),n=i.length;if(1===n)return Ss(t,e,i[0]);if(n){for(var r=[],a=0;a0?"bottom":"top":r.width>0?"left":"right";l||$u(t.style,d,n,h,a,i,p),xa(t,d)}function ec(t,e){var i=t.get(qb)||0;return Math.min(i,Math.abs(e.width),Math.abs(e.height))}function ic(t,e,i){var n=t.getData(),r=[],a=n.getLayout("valueAxisHorizontal")?1:0;r[1-a]=n.getLayout("valueAxisStart");var o=new Kb({shape:{points:n.getLayout("largePoints")},incremental:!!i,__startPoint:r,__valueIdx:a});e.add(o),nc(o,t,n)}function nc(t,e,i){var n=i.getVisual("borderColor")||i.getVisual("color"),r=e.getModel("itemStyle").getItemStyle(["color","borderColor"]);t.useStyle(r),t.style.fill=null,t.style.stroke=n,t.style.lineWidth=i.getLayout("barWidth")}function rc(t){var e={componentType:t.mainType,componentIndex:t.componentIndex};return e[t.mainType+"Index"]=t.componentIndex,e}function ac(t,e,i,n){var r,a,o=io(i-t.rotation),s=n[0]>n[1],l="start"===e&&!s||"start"!==e&&s;return no(o-Qb/2)?(a=l?"bottom":"top",r="center"):no(o-1.5*Qb)?(a=l?"top":"bottom",r="center"):(a="middle",r=1.5*Qb>o&&o>Qb/2?l?"left":"right":l?"right":"left"),{rotation:o,textAlign:r,textVerticalAlign:a}}function oc(t){var e=t.get("tooltip");return t.get("silent")||!(t.get("triggerEvent")||e&&e.show)}function sc(t,e,i){var n=t.get("axisLabel.showMinLabel"),r=t.get("axisLabel.showMaxLabel");e=e||[],i=i||[];var a=e[0],o=e[1],s=e[e.length-1],l=e[e.length-2],h=i[0],u=i[1],c=i[i.length-1],d=i[i.length-2];n===!1?(lc(a),lc(h)):hc(a,o)&&(n?(lc(o),lc(u)):(lc(a),lc(h))),r===!1?(lc(s),lc(c)):hc(l,s)&&(r?(lc(l),lc(d)):(lc(s),lc(c)))}function lc(t){t&&(t.ignore=!0)}function hc(t,e){var i=t&&t.getBoundingRect().clone(),n=e&&e.getBoundingRect().clone();if(i&&n){var r=Se([]);return Ce(r,r,-t.rotation),i.applyTransform(Ie([],r,t.getLocalTransform())),n.applyTransform(Ie([],r,e.getLocalTransform())),i.intersect(n)}}function uc(t){return"middle"===t||"center"===t}function cc(t,e,i){var n=e.axis;if(e.get("axisTick.show")&&!n.scale.isBlank()){for(var r=e.getModel("axisTick"),a=r.getModel("lineStyle"),o=r.get("length"),l=n.getTicksCoords(),h=[],u=[],c=t._transform,d=[],f=0;f=0||t===e}function xc(t){var e=_c(t);if(e){var i=e.axisPointerModel,n=e.axis.scale,r=i.option,a=i.get("status"),o=i.get("value");null!=o&&(o=n.parse(o));var s=bc(i);null==a&&(r.status=s?"show":"hide");var l=n.getExtent().slice();l[0]>l[1]&&l.reverse(),(null==o||o>l[1])&&(o=l[1]),o0?i=n[0]:n[1]<0&&(i=n[1]),i}function Vc(t,e,i,n){var r=0/0;t.stacked&&(r=i.get(i.getCalculationInfo("stackedOverDimension"),n)),isNaN(r)&&(r=t.valueStart);var a=t.baseDataOffset,o=[];return o[a]=i.get(t.baseDim,n),o[1-a]=r,e.dataToPoint(o)}function Wc(t,e){var i=[];return e.diff(t).add(function(t){i.push({cmd:"+",idx:t})}).update(function(t,e){i.push({cmd:"=",idx:e,idx1:t})}).remove(function(t){i.push({cmd:"-",idx:t})}).execute(),i}function Gc(t){return isNaN(t[0])||isNaN(t[1])}function Hc(t,e,i,n,r,a,o,s,l,h){return"none"!==h&&h?Zc.apply(this,arguments):Xc.apply(this,arguments)}function Zc(t,e,i,n,r,a,o,s,l,h,u){for(var c=0,d=i,f=0;n>f;f++){var p=e[d];if(d>=r||0>d)break;if(Gc(p)){if(u){d+=a;continue}break}if(d===i)t[a>0?"moveTo":"lineTo"](p[0],p[1]);else if(l>0){var g=e[c],v="y"===h?1:0,m=(p[v]-g[v])*l;_S(bS,g),bS[v]=g[v]+m,_S(SS,p),SS[v]=p[v]-m,t.bezierCurveTo(bS[0],bS[1],SS[0],SS[1],p[0],p[1])}else t.lineTo(p[0],p[1]);c=d,d+=a}return f}function Xc(t,e,i,n,r,a,o,s,l,h,u){for(var c=0,d=i,f=0;n>f;f++){var p=e[d];if(d>=r||0>d)break;if(Gc(p)){if(u){d+=a;continue}break}if(d===i)t[a>0?"moveTo":"lineTo"](p[0],p[1]),_S(bS,p);else if(l>0){var g=d+a,v=e[g];if(u)for(;v&&Gc(e[g]);)g+=a,v=e[g];var m=.5,y=e[c],v=e[g];if(!v||Gc(v))_S(SS,p);else{Gc(v)&&!u&&(v=p),j(wS,v,y);var x,_;if("x"===h||"y"===h){var w="x"===h?0:1;x=Math.abs(p[w]-y[w]),_=Math.abs(p[w]-v[w])}else x=yg(p,y),_=yg(p,v);m=_/(_+x),xS(SS,p,wS,-l*(1-m))}mS(bS,bS,s),yS(bS,bS,o),mS(SS,SS,s),yS(SS,SS,o),t.bezierCurveTo(bS[0],bS[1],SS[0],SS[1],p[0],p[1]),xS(bS,p,wS,l*m)}else t.lineTo(p[0],p[1]);c=d,d+=a}return f}function Yc(t,e){var i=[1/0,1/0],n=[-1/0,-1/0];if(e)for(var r=0;rn[0]&&(n[0]=a[0]),a[1]>n[1]&&(n[1]=a[1])}return{min:e?i:n,max:e?n:i}}function jc(t,e){if(t.length===e.length){for(var i=0;ie[0]?1:-1;e[0]+=n*i,e[1]-=n*i}return e}function $c(t,e,i){if(!i.valueDim)return[];for(var n=[],r=0,a=e.count();a>r;r++)n.push(Vc(i,t,e,r));return n}function Kc(t,e,i,n){var r=Uc(t.getAxis("x")),a=Uc(t.getAxis("y")),o=t.getBaseAxis().isHorizontal(),s=Math.min(r[0],r[1]),l=Math.min(a[0],a[1]),h=Math.max(r[0],r[1])-s,u=Math.max(a[0],a[1])-l;if(i)s-=.5,h+=.5,l-=.5,u+=.5;else{var c=n.get("lineStyle.width")||2,d=n.get("clipOverflow")?c/2:Math.max(h,u);o?(l-=d,u+=2*d):(s-=d,h+=2*d)}var f=new Dy({shape:{x:s,y:l,width:h,height:u}});return e&&(f.shape[o?"width":"height"]=0,Oa(f,{shape:{width:h,height:u}},n)),f}function Qc(t,e,i,n){var r=t.getAngleAxis(),a=t.getRadiusAxis(),o=a.getExtent().slice();o[0]>o[1]&&o.reverse();var s=r.getExtent(),l=Math.PI/180;i&&(o[0]-=.5,o[1]+=.5);var h=new Sy({shape:{cx:$a(t.cx,1),cy:$a(t.cy,1),r0:$a(o[0],1),r:$a(o[1],1),startAngle:-s[0]*l,endAngle:-s[1]*l,clockwise:r.inverse}});return e&&(h.shape.endAngle=-s[0]*l,Oa(h,{shape:{endAngle:-s[1]*l}},n)),h}function Jc(t,e,i,n){return"polar"===t.type?Qc(t,e,i,n):Kc(t,e,i,n)}function td(t,e,i){for(var n=e.getBaseAxis(),r="x"===n.dim||"radius"===n.dim?0:1,a=[],o=0;o=0;a--){var o=i[a].dimension,s=t.dimensions[o],l=t.getDimensionInfo(s);if(n=l&&l.coordDim,"x"===n||"y"===n){r=i[a];break}}if(r){var h=e.getAxis(n),u=p(r.stops,function(t){return{coord:h.toGlobalCoord(h.dataToCoord(t.value)),color:t.color}}),c=u.length,d=r.outerColors.slice();c&&u[0].coord>u[c-1].coord&&(u.reverse(),d.reverse());var g=10,v=u[0].coord-g,m=u[c-1].coord+g,y=m-v;if(.001>y)return"transparent";f(u,function(t){t.offset=(t.coord-v)/y}),u.push({offset:c?u[c-1].offset:.5,color:d[1]||"transparent"}),u.unshift({offset:c?u[0].offset:.5,color:d[0]||"transparent"});var x=new Ry(0,0,0,0,u,!0);return x[n]=v,x[n+"2"]=m,x}}}function id(t,e,i){var n=t.get("showAllSymbol"),r="auto"===n;if(!n||r){var a=i.getAxesByScale("ordinal")[0];if(a&&(!r||!nd(a,e))){var o=e.mapDimension(a.dim),s={};return f(a.getViewLabels(),function(t){s[t.tickValue]=1}),function(t){return!s.hasOwnProperty(e.get(o,t))}}}}function nd(t,e){var i=t.getExtent(),n=Math.abs(i[1]-i[0])/t.scale.count();isNaN(n)&&(n=0);for(var r=e.count(),a=Math.max(1,Math.round(r/5)),o=0;r>o;o+=a)if(1.5*Cc.getSymbolSize(e,o)[t.isHorizontal()?1:0]>n)return!1;return!0}function rd(t,e,i,n){var r=e.getData(),a=this.dataIndex,o=r.getName(a),s=e.get("selectedOffset");n.dispatchAction({type:"pieToggleSelect",from:t,name:o,seriesId:e.id}),r.each(function(t){ad(r.getItemGraphicEl(t),r.getItemLayout(t),e.isSelected(r.getName(t)),s,i)})}function ad(t,e,i,n,r){var a=(e.startAngle+e.endAngle)/2,o=Math.cos(a),s=Math.sin(a),l=i?n:0,h=[o*l,s*l];r?t.animate().when(200,{position:h}).start("bounceOut"):t.attr("position",h)}function od(t,e){function i(){a.ignore=a.hoverIgnore,o.ignore=o.hoverIgnore}function n(){a.ignore=a.normalIgnore,o.ignore=o.normalIgnore}lv.call(this);var r=new Sy({z2:2}),a=new Ay,o=new xy;this.add(r),this.add(a),this.add(o),this.updateData(t,e,!0),this.on("emphasis",i).on("normal",n).on("mouseover",i).on("mouseout",n)}function sd(t,e,i,n,r,a,o){function s(e,i,n){for(var r=e;i>r;r++)if(t[r].y+=n,r>e&&i>r+1&&t[r+1].y>t[r].y+t[r].height)return void l(r,n/2);l(i-1,n/2)}function l(e,i){for(var n=e;n>=0&&(t[n].y-=i,!(n>0&&t[n].y>t[n-1].y+t[n-1].height));n--);}function h(t,e,i,n,r,a){for(var o=a>0?e?Number.MAX_VALUE:0:e?Number.MAX_VALUE:0,s=0,l=t.length;l>s;s++)if("center"!==t[s].position){var h=Math.abs(t[s].y-n),u=t[s].len,c=t[s].len2,d=r+u>h?Math.sqrt((r+u+c)*(r+u+c)-h*h):Math.abs(t[s].x-i);e&&d>=o&&(d=o-10),!e&&o>=d&&(d=o+10),t[s].x=i+d*a,o=d}}t.sort(function(t,e){return t.y-e.y});for(var u,c=0,d=t.length,f=[],p=[],g=0;d>g;g++)u=t[g].y-c,0>u&&s(g,d,-u,r),c=t[g].y+t[g].height;0>o-c&&l(d-1,c-o);for(var g=0;d>g;g++)t[g].y>=i?p.push(t[g]):f.push(t[g]);h(f,!1,e,i,n,r),h(p,!0,e,i,n,r)}function ld(t,e,i,n,r,a){for(var o=[],s=[],l=0;lu;u++)a[u]&&xd(t.childAt(u),e,a[u],n,t,r)}}function wd(t){new uh(t.oldChildren,t.newChildren,bd,bd,t).add(Sd).update(Sd).remove(Md).execute()}function bd(t,e){var i=t&&t.name;return null!=i?i:KS+e}function Sd(t,e){var i=this.context,n=null!=t?i.newChildren[t]:null,r=null!=e?i.oldChildren[e]:null;xd(r,i.dataIndex,n,i.animatableModel,i.group,i.data)}function Md(t){var e=this.context,i=e.oldChildren[t];i&&e.group.remove(i)}function Id(t){return t&&(t.pathData||t.d)}function Td(t){return t&&(t.hasOwnProperty("pathData")||t.hasOwnProperty("d"))}function Cd(t,e){return t&&t.hasOwnProperty(e)}function Ad(t,e,i){var n,r={},a="toggleSelected"===t;return i.eachComponent("legend",function(i){a&&null!=n?i[n?"select":"unSelect"](e.name):(i[t](e.name),n=i.isSelected(e.name));var o=i.getData();f(o,function(t){var e=t.get("name");if("\n"!==e&&""!==e){var n=i.isSelected(e);r[e]=r.hasOwnProperty(e)?r[e]&&n:n}})}),{name:e.name,selected:r}}function Dd(t,e){var i=rx(e.get("padding")),n=e.getItemStyle(["color","opacity"]);n.fill=e.get("backgroundColor");var t=new Dy({shape:{x:t.x-i[3],y:t.y-i[0],width:t.width+i[1]+i[3],height:t.height+i[0]+i[2],r:e.get("borderRadius")},style:n,silent:!0,z2:-1});return t}function kd(t,e){e.dispatchAction({type:"legendToggleSelect",name:t})}function Pd(t,e,i,n){var r=i.getZr().storage.getDisplayList()[0];r&&r.useHoverLayer||i.dispatchAction({type:"highlight",seriesName:t,name:e,excludeSeriesId:n})}function Ld(t,e,i,n){var r=i.getZr().storage.getDisplayList()[0];r&&r.useHoverLayer||i.dispatchAction({type:"downplay",seriesName:t,name:e,excludeSeriesId:n})}function Od(t,e,i){var n=t.getOrient(),r=[1,1];r[n.index]=0,So(e,i,{type:"box",ignoreSize:r})}function zd(t,e,i,n,r){var a=t.axis;if(!a.scale.isBlank()&&a.containData(e)){if(!t.involveSeries)return void i.showPointer(t,e);var s=Ed(e,t),l=s.payloadBatch,h=s.snapToValue;l[0]&&null==r.seriesIndex&&o(r,l[0]),!n&&t.snap&&a.containData(h)&&null!=h&&(e=h),i.showPointer(t,e,l,r),i.showTooltip(t,s,h)}}function Ed(t,e){var i=e.axis,n=i.dim,r=t,a=[],o=Number.MAX_VALUE,s=-1;return cM(e.seriesModels,function(e){var l,h,u=e.getData().mapDimension(n,!0);if(e.getAxisTooltipData){var c=e.getAxisTooltipData(u,t,i);h=c.dataIndices,l=c.nestestValue}else{if(h=e.getData().indicesOfNearest(u[0],t,"category"===i.type?.5:null),!h.length)return;l=e.getData().get(u[0],h[0])}if(null!=l&&isFinite(l)){var d=t-l,f=Math.abs(d);o>=f&&((o>f||d>=0&&0>s)&&(o=f,s=d,r=l,a.length=0),cM(h,function(t){a.push({seriesIndex:e.seriesIndex,dataIndexInside:t,dataIndex:e.getData().getRawIndex(t)})}))}}),{payloadBatch:a,snapToValue:r}}function Rd(t,e,i,n){t[e.key]={value:i,payloadBatch:n}}function Bd(t,e,i,n){var r=i.payloadBatch,a=e.axis,o=a.model,s=e.axisPointerModel;if(e.triggerTooltip&&r.length){var l=e.coordSys.model,h=Sc(l),u=t.map[h];u||(u=t.map[h]={coordSysId:l.id,coordSysIndex:l.componentIndex,coordSysType:l.type,coordSysMainType:l.mainType,dataByAxis:[]},t.list.push(u)),u.dataByAxis.push({axisDim:a.dim,axisIndex:o.componentIndex,axisType:o.type,axisId:o.id,value:n,valueLabelOpt:{precision:s.get("label.precision"),formatter:s.get("label.formatter")},seriesDataIndices:r.slice()})}}function Nd(t,e,i){var n=i.axesInfo=[];cM(e,function(e,i){var r=e.axisPointerModel.option,a=t[i];a?(!e.useHandle&&(r.status="show"),r.value=a.value,r.seriesDataIndices=(a.payloadBatch||[]).slice()):!e.useHandle&&(r.status="hide"),"show"===r.status&&n.push({axisDim:e.axis.dim,axisIndex:e.axis.model.componentIndex,value:r.value})})}function Fd(t,e,i,n){if(Hd(e)||!t.list.length)return void n({type:"hideTip"});var r=((t.list[0].dataByAxis[0]||{}).seriesDataIndices||[])[0]||{};n({type:"showTip",escapeConnect:!0,x:e[0],y:e[1],tooltipOption:i.tooltipOption,position:i.position,dataIndexInside:r.dataIndexInside,dataIndex:r.dataIndex,seriesIndex:r.seriesIndex,dataByCoordSys:t.list})}function Vd(t,e,i){var n=i.getZr(),r="axisPointerLastHighlights",a=fM(n)[r]||{},o=fM(n)[r]={};cM(t,function(t){var e=t.axisPointerModel.option;"show"===e.status&&cM(e.seriesDataIndices,function(t){var e=t.seriesIndex+" | "+t.dataIndex;o[e]=t})});var s=[],l=[];f(a,function(t,e){!o[e]&&l.push(t)}),f(o,function(t,e){!a[e]&&s.push(t)}),l.length&&i.dispatchAction({type:"downplay",escapeConnect:!0,batch:l}),s.length&&i.dispatchAction({type:"highlight",escapeConnect:!0,batch:s})}function Wd(t,e){for(var i=0;i<(t||[]).length;i++){var n=t[i];if(e.axis.dim===n.axisDim&&e.axis.model.componentIndex===n.axisIndex)return n}}function Gd(t){var e=t.axis.model,i={},n=i.axisDim=t.axis.dim;return i.axisIndex=i[n+"AxisIndex"]=e.componentIndex,i.axisName=i[n+"AxisName"]=e.name,i.axisId=i[n+"AxisId"]=e.id,i}function Hd(t){return!t||null==t[0]||isNaN(t[0])||null==t[1]||isNaN(t[1])}function Zd(t,e,i){if(!tg.node){var n=e.getZr();gM(n).records||(gM(n).records={}),Xd(n,e);var r=gM(n).records[t]||(gM(n).records[t]={});r.handler=i}}function Xd(t,e){function i(i,n){t.on(i,function(i){var r=Ud(e);vM(gM(t).records,function(t){t&&n(t,i,r.dispatchAction)}),Yd(r.pendings,e)})}gM(t).initialized||(gM(t).initialized=!0,i("click",x(qd,"click")),i("mousemove",x(qd,"mousemove")),i("globalout",jd))}function Yd(t,e){var i,n=t.showTip.length,r=t.hideTip.length;n?i=t.showTip[n-1]:r&&(i=t.hideTip[r-1]),i&&(i.dispatchAction=null,e.dispatchAction(i))}function jd(t,e,i){t.handler("leave",null,i)}function qd(t,e,i,n){e.handler(t,i,n)}function Ud(t){var e={showTip:[],hideTip:[]},i=function(n){var r=e[n.type];r?r.push(n):(n.dispatchAction=i,t.dispatchAction(n))};return{dispatchAction:i,pendings:e}}function $d(t,e){if(!tg.node){var i=e.getZr(),n=(gM(i).records||{})[t];n&&(gM(i).records[t]=null)}}function Kd(){}function Qd(t,e,i,n){Jd(yM(i).lastProp,n)||(yM(i).lastProp=n,e?La(i,n,t):(i.stopAnimation(),i.attr(n)))}function Jd(t,e){if(S(t)&&S(e)){var i=!0;return f(e,function(e,n){i=i&&Jd(t[n],e)}),!!i}return t===e}function tf(t,e){t[e.get("label.show")?"show":"hide"]()}function ef(t){return{position:t.position.slice(),rotation:t.rotation||0}}function nf(t,e,i){var n=e.get("z"),r=e.get("zlevel");t&&t.traverse(function(t){"group"!==t.type&&(null!=n&&(t.z=n),null!=r&&(t.zlevel=r),t.silent=i)})}function rf(t){var e,i=t.get("type"),n=t.getModel(i+"Style");return"line"===i?(e=n.getLineStyle(),e.fill=null):"shadow"===i&&(e=n.getAreaStyle(),e.stroke=null),e}function af(t,e,i,n,r){var a=i.get("value"),o=sf(a,e.axis,e.ecModel,i.get("seriesDataIndices"),{precision:i.get("label.precision"),formatter:i.get("label.formatter")}),s=i.getModel("label"),l=rx(s.get("padding")||0),h=s.getFont(),u=Ei(o,h),c=r.position,d=u.width+l[1]+l[3],f=u.height+l[0]+l[2],p=r.align;"right"===p&&(c[0]-=d),"center"===p&&(c[0]-=d/2);var g=r.verticalAlign;"bottom"===g&&(c[1]-=f),"middle"===g&&(c[1]-=f/2),of(c,d,f,n);var v=s.get("backgroundColor");v&&"auto"!==v||(v=e.get("axisLine.lineStyle.color")),t.label={shape:{x:0,y:0,width:d,height:f,r:s.get("borderRadius")},position:c.slice(),style:{text:o,textFont:h,textFill:s.getTextColor(),textPosition:"inside",fill:v,stroke:s.get("borderColor")||"transparent",lineWidth:s.get("borderWidth")||0,shadowBlur:s.get("shadowBlur"),shadowColor:s.get("shadowColor"),shadowOffsetX:s.get("shadowOffsetX"),shadowOffsetY:s.get("shadowOffsetY")},z2:10}}function of(t,e,i,n){var r=n.getWidth(),a=n.getHeight();t[0]=Math.min(t[0]+e,r)-e,t[1]=Math.min(t[1]+i,a)-i,t[0]=Math.max(t[0],0),t[1]=Math.max(t[1],0)}function sf(t,e,i,n,r){t=e.scale.parse(t);var a=e.scale.getLabel(t,{precision:r.precision}),o=r.formatter;if(o){var s={value:hu(e,t),seriesData:[]};f(n,function(t){var e=i.getSeriesByIndex(t.seriesIndex),n=t.dataIndexInside,r=e&&e.getDataParams(n);r&&s.seriesData.push(r)}),b(o)?a=o.replace("{value}",a):w(o)&&(a=o(s))}return a}function lf(t,e,i){var n=be();return Ce(n,n,i.rotation),Te(n,n,i.position),Ea([t.dataToCoord(e),(i.labelOffset||0)+(i.labelDirection||1)*(i.labelMargin||0)],n)}function hf(t,e,i,n,r,a){var o=Jb.innerTextLayout(i.rotation,0,i.labelDirection);i.labelMargin=r.get("label.margin"),af(e,n,r,a,{position:lf(n.axis,t,i),align:o.textAlign,verticalAlign:o.textVerticalAlign})}function uf(t,e,i){return i=i||0,{x1:t[i],y1:t[1-i],x2:e[i],y2:e[1-i]}}function cf(t,e,i){return i=i||0,{x:t[i],y:t[1-i],width:e[i],height:e[1-i]}}function df(t,e){var i={};return i[e.dim+"AxisIndex"]=e.index,t.getCartesian(i)}function ff(t){return"x"===t.dim?0:1}function pf(t){var e="cubic-bezier(0.23, 1, 0.32, 1)",i="left "+t+"s "+e+",top "+t+"s "+e;return p(IM,function(t){return t+"transition:"+i}).join(";")}function gf(t){var e=[],i=t.get("fontSize"),n=t.getTextColor();return n&&e.push("color:"+n),e.push("font:"+t.getFont()),i&&e.push("line-height:"+Math.round(3*i/2)+"px"),SM(["decoration","align"],function(i){var n=t.get(i);n&&e.push("text-"+i+":"+n)}),e.join(";")}function vf(t){var e=[],i=t.get("transitionDuration"),n=t.get("backgroundColor"),r=t.getModel("textStyle"),a=t.get("padding");return i&&e.push(pf(i)),n&&(tg.canvasSupported?e.push("background-Color:"+n):(e.push("background-Color:#"+je(n)),e.push("filter:alpha(opacity=70)"))),SM(["width","color","radius"],function(i){var n="border-"+i,r=MM(n),a=t.get(r);null!=a&&e.push(n+":"+a+("color"===i?"":"px"))}),e.push(gf(r)),null!=a&&e.push("padding:"+rx(a).join("px ")+"px"),e.join(";")+";"}function mf(t,e){if(tg.wxa)return null;var i=document.createElement("div"),n=this._zr=e.getZr();this.el=i,this._x=e.getWidth()/2,this._y=e.getHeight()/2,t.appendChild(i),this._container=t,this._show=!1,this._hideTimeout;var r=this;i.onmouseenter=function(){r._enterable&&(clearTimeout(r._hideTimeout),r._show=!0),r._inContent=!0},i.onmousemove=function(e){if(e=e||window.event,!r._enterable){var i=n.handler;pe(t,e,!0),i.dispatch("mousemove",e)}},i.onmouseleave=function(){r._enterable&&r._show&&r.hideLater(r._hideDelay),r._inContent=!1}}function yf(t){this._zr=t.getZr(),this._show=!1,this._hideTimeout}function xf(t){for(var e=t.pop();t.length;){var i=t.pop();i&&(Wa.isInstance(i)&&(i=i.get("tooltip",!0)),"string"==typeof i&&(i={formatter:i}),e=new Wa(i,e,e.ecModel))}return e}function _f(t,e){return t.dispatchAction||y(e.dispatchAction,e)}function wf(t,e,i,n,r,a,o){var s=i.getOuterSize(),l=s.width,h=s.height;return null!=a&&(t+l+a>n?t-=l+a:t+=a),null!=o&&(e+h+o>r?e-=h+o:e+=o),[t,e]}function bf(t,e,i,n,r){var a=i.getOuterSize(),o=a.width,s=a.height;return t=Math.min(t+o,n)-o,e=Math.min(e+s,r)-s,t=Math.max(t,0),e=Math.max(e,0),[t,e]}function Sf(t,e,i){var n=i[0],r=i[1],a=5,o=0,s=0,l=e.width,h=e.height;switch(t){case"inside":o=e.x+l/2-n/2,s=e.y+h/2-r/2;break;case"top":o=e.x+l/2-n/2,s=e.y-r-a;break;case"bottom":o=e.x+l/2-n/2,s=e.y+h+a;break;case"left":o=e.x-n-a,s=e.y+h/2-r/2;break;case"right":o=e.x+l+a,s=e.y+h/2-r/2}return[o,s]}function Mf(t){return"center"===t||"middle"===t}function If(t){Fn(t,"label",["show"])}function Tf(t){return!(isNaN(parseFloat(t.x))&&isNaN(parseFloat(t.y)))}function Cf(t){return!isNaN(parseFloat(t.x))&&!isNaN(parseFloat(t.y))}function Af(t,e,i,n,r,a){var o=[],s=Ph(e,n),l=s?e.getCalculationInfo("stackResultDimension"):n,h=zf(e,l,t),u=e.indicesOfNearest(l,h)[0];o[r]=e.get(i,u),o[a]=e.get(n,u);var c=Qa(e.get(n,u));return c=Math.min(c,20),c>=0&&(o[a]=+o[a].toFixed(c)),o}function Df(t,e){var i=t.getData(),r=t.coordinateSystem;if(e&&!Cf(e)&&!_(e.coord)&&r){var a=r.dimensions,o=kf(e,i,r,t);if(e=n(e),e.type&&RM[e.type]&&o.baseAxis&&o.valueAxis){var s=zM(a,o.baseAxis.dim),l=zM(a,o.valueAxis.dim);e.coord=RM[e.type](i,o.baseDataDim,o.valueDataDim,s,l),e.value=e.coord[l]}else{for(var h=[null!=e.xAxis?e.xAxis:e.radiusAxis,null!=e.yAxis?e.yAxis:e.angleAxis],u=0;2>u;u++)RM[h[u]]&&(h[u]=zf(i,i.mapDimension(a[u]),h[u]));e.coord=h}}return e}function kf(t,e,i,n){var r={};return null!=t.valueIndex||null!=t.valueDim?(r.valueDataDim=null!=t.valueIndex?e.getDimension(t.valueIndex):t.valueDim,r.valueAxis=i.getAxis(Pf(n,r.valueDataDim)),r.baseAxis=i.getOtherAxis(r.valueAxis),r.baseDataDim=e.mapDimension(r.baseAxis.dim)):(r.baseAxis=n.getBaseAxis(),r.valueAxis=i.getOtherAxis(r.baseAxis),r.baseDataDim=e.mapDimension(r.baseAxis.dim),r.valueDataDim=e.mapDimension(r.valueAxis.dim)),r}function Pf(t,e){var i=t.getData(),n=i.dimensions;e=i.getDimension(e);for(var r=0;rn?t.coord&&t.coord[n]:t.value}function zf(t,e,i){if("average"===i){var n=0,r=0;return t.each(e,function(t){isNaN(t)||(n+=t,r++)}),n/r}return"median"===i?t.getMedian(e):t.getDataExtent(e,!0)["max"===i?1:0]}function Ef(t,e,i){var n=e.coordinateSystem;t.each(function(r){var a,o=t.getItemModel(r),s=Ua(o.get("x"),i.getWidth()),l=Ua(o.get("y"),i.getHeight());if(isNaN(s)||isNaN(l)){if(e.getMarkerPosition)a=e.getMarkerPosition(t.getValues(t.dimensions,r));else if(n){var h=t.get(n.dimensions[0],r),u=t.get(n.dimensions[1],r);a=n.dataToPoint([h,u])}}else a=[s,l];isNaN(s)||(a[0]=s),isNaN(l)||(a[1]=l),t.setItemLayout(r,a)})}function Rf(t,e,i){var n;n=t?p(t&&t.dimensions,function(t){var i=e.getData().getDimensionInfo(e.getData().mapDimension(t))||{};return s({name:t},i)}):[{name:"value",type:"float"}];var r=new Bw(n,i),a=p(i.get("data"),x(Df,e));return t&&(a=v(a,x(Lf,t))),r.initData(a,null,t?Of:function(t){return t.value}),r}function Bf(t){return isNaN(+t.cpx1)||isNaN(+t.cpy1)}function Nf(t){return"_"+t+"Type"}function Ff(t,e,i){var n=e.getItemVisual(i,"color"),r=e.getItemVisual(i,t),a=e.getItemVisual(i,t+"Size");if(r&&"none"!==r){_(a)||(a=[a,a]);var o=fu(r,-a[0]/2,-a[1]/2,a[0],a[1],n);return o.name=t,o}}function Vf(t){var e=new VM({name:"line"});return Wf(e.shape,t),e}function Wf(t,e){var i=e[0],n=e[1],r=e[2];t.x1=i[0],t.y1=i[1],t.x2=n[0],t.y2=n[1],t.percent=1,r?(t.cpx1=r[0],t.cpy1=r[1]):(t.cpx1=0/0,t.cpy1=0/0)}function Gf(){var t=this,e=t.childOfName("fromSymbol"),i=t.childOfName("toSymbol"),n=t.childOfName("label");if(e||i||!n.ignore){for(var r=1,a=this.parent;a;)a.scale&&(r/=a.scale[0]),a=a.parent;var o=t.childOfName("line");if(this.__dirty||o.__dirty){var s=o.shape.percent,l=o.pointAt(0),h=o.pointAt(s),u=j([],h,l);if(te(u,u),e){e.attr("position",l);var c=o.tangentAt(0);e.attr("rotation",Math.PI/2-Math.atan2(c[1],c[0])),e.attr("scale",[r*s,r*s])}if(i){i.attr("position",h);var c=o.tangentAt(1);i.attr("rotation",-Math.PI/2-Math.atan2(c[1],c[0])),i.attr("scale",[r*s,r*s])}if(!n.ignore){n.attr("position",h);var d,f,p,g=5*r;if("end"===n.__position)d=[u[0]*g+h[0],u[1]*g+h[1]],f=u[0]>.8?"left":u[0]<-.8?"right":"center",p=u[1]>.8?"top":u[1]<-.8?"bottom":"middle";else if("middle"===n.__position){var v=s/2,c=o.tangentAt(v),m=[c[1],-c[0]],y=o.pointAt(v);m[1]>0&&(m[0]=-m[0],m[1]=-m[1]),d=[y[0]+m[0]*g,y[1]+m[1]*g],f="center",p="bottom";var x=-Math.atan2(c[1],c[0]);h[0].8?"right":u[0]<-.8?"left":"center",p=u[1]>.8?"bottom":u[1]<-.8?"top":"middle";n.attr({style:{textVerticalAlign:n.__verticalAlign||p,textAlign:n.__textAlign||f},position:d,scale:[r,r]})}}}}function Hf(t,e,i){lv.call(this),this._createLine(t,e,i)}function Zf(t){this._ctor=t||Hf,this.group=new lv}function Xf(t,e,i,n){var r=e.getItemLayout(i);if(Uf(r)){var a=new t._ctor(e,i,n);e.setItemGraphicEl(i,a),t.group.add(a)}}function Yf(t,e,i,n,r,a){var o=e.getItemGraphicEl(n);return Uf(i.getItemLayout(r))?(o?o.updateData(i,r,a):o=new t._ctor(i,r,a),i.setItemGraphicEl(r,o),void t.group.add(o)):void t.group.remove(o)}function jf(t){var e=t.hostModel;return{lineStyle:e.getModel("lineStyle").getLineStyle(),hoverLineStyle:e.getModel("emphasis.lineStyle").getLineStyle(),labelModel:e.getModel("label"),hoverLabelModel:e.getModel("emphasis.label")}}function qf(t){return isNaN(t[0])||isNaN(t[1])}function Uf(t){return!qf(t[0])&&!qf(t[1])}function $f(t){return!isNaN(t)&&!isFinite(t)}function Kf(t,e,i,n){var r=1-t,a=n.dimensions[t];return $f(e[r])&&$f(i[r])&&e[t]===i[t]&&n.getAxis(a).containData(e[t])}function Qf(t,e){if("cartesian2d"===t.type){var i=e[0].coord,n=e[1].coord;if(i&&n&&(Kf(1,i,n,t)||Kf(0,i,n,t)))return!0}return Lf(t,e[0])&&Lf(t,e[1])}function Jf(t,e,i,n,r){var a,o=n.coordinateSystem,s=t.getItemModel(e),l=Ua(s.get("x"),r.getWidth()),h=Ua(s.get("y"),r.getHeight());if(isNaN(l)||isNaN(h)){if(n.getMarkerPosition)a=n.getMarkerPosition(t.getValues(t.dimensions,e));else{var u=o.dimensions,c=t.get(u[0],e),d=t.get(u[1],e);a=o.dataToPoint([c,d])}if("cartesian2d"===o.type){var f=o.getAxis("x"),p=o.getAxis("y"),u=o.dimensions;$f(t.get(u[0],e))?a[0]=f.toGlobalCoord(f.getExtent()[i?0:1]):$f(t.get(u[1],e))&&(a[1]=p.toGlobalCoord(p.getExtent()[i?0:1]))}isNaN(l)||(a[0]=l),isNaN(h)||(a[1]=h)}else a=[l,h];t.setItemLayout(e,a)}function tp(t,e,i){var n;n=t?p(t&&t.dimensions,function(t){var i=e.getData().getDimensionInfo(e.getData().mapDimension(t))||{};return s({name:t},i)}):[{name:"value",type:"float"}];var r=new Bw(n,i),a=new Bw(n,i),o=new Bw([],i),l=p(i.get("data"),x(ZM,e,t,i));t&&(l=v(l,x(Qf,t)));var h=t?Of:function(t){return t.value};return r.initData(p(l,function(t){return t[0]}),null,h),a.initData(p(l,function(t){return t[1]}),null,h),o.initData(p(l,function(t){return t[2]})),o.hasItemOption=!0,{from:r,to:a,line:o}}function ep(t){return!isNaN(t)&&!isFinite(t)}function ip(t,e,i){var n=1-t;return ep(e[n])&&ep(i[n])}function np(t,e){var i=e.coord[0],n=e.coord[1];return"cartesian2d"===t.type&&i&&n&&(ip(1,i,n,t)||ip(0,i,n,t))?!0:Lf(t,{coord:i,x:e.x0,y:e.y0})||Lf(t,{coord:n,x:e.x1,y:e.y1})}function rp(t,e,i,n,r){var a,o=n.coordinateSystem,s=t.getItemModel(e),l=Ua(s.get(i[0]),r.getWidth()),h=Ua(s.get(i[1]),r.getHeight());if(isNaN(l)||isNaN(h)){if(n.getMarkerPosition)a=n.getMarkerPosition(t.getValues(i,e));else{var u=t.get(i[0],e),c=t.get(i[1],e),d=[u,c];o.clampData&&o.clampData(d,d),a=o.dataToPoint(d,!0)}if("cartesian2d"===o.type){var f=o.getAxis("x"),p=o.getAxis("y"),u=t.get(i[0],e),c=t.get(i[1],e);ep(u)?a[0]=f.toGlobalCoord(f.getExtent()["x0"===i[0]?0:1]):ep(c)&&(a[1]=p.toGlobalCoord(p.getExtent()["y0"===i[1]?0:1]))}isNaN(l)||(a[0]=l),isNaN(h)||(a[1]=h)}else a=[l,h];return a}function ap(t,e,i){var n,r,a=["x0","y0","x1","y1"];t?(n=p(t&&t.dimensions,function(t){var i=e.getData(),n=i.getDimensionInfo(i.mapDimension(t))||{};return s({name:t},n)}),r=new Bw(p(a,function(t,e){return{name:t,type:n[e%2].type}}),i)):(n=[{name:"value",type:"float"}],r=new Bw(n,i));var o=p(i.get("data"),x(XM,e,t,i));t&&(o=v(o,x(np,t)));var l=t?function(t,e,i,n){return t.coord[Math.floor(n/2)][n%2]}:function(t){return t.value};return r.initData(o,null,l),r.hasItemOption=!0,r}function op(t){var e=t.type,i={number:"value",time:"time"};if(i[e]&&(t.axisType=i[e],delete t.type),sp(t),lp(t,"controlPosition")){var n=t.controlStyle||(t.controlStyle={});lp(n,"position")||(n.position=t.controlPosition),"none"!==n.position||lp(n,"show")||(n.show=!1,delete n.position),delete t.controlPosition}f(t.data||[],function(t){S(t)&&!_(t)&&(!lp(t,"value")&&lp(t,"name")&&(t.value=t.name),sp(t))})}function sp(t){var e=t.itemStyle||(t.itemStyle={}),i=e.emphasis||(e.emphasis={}),n=t.label||t.label||{},r=n.normal||(n.normal={}),a={normal:1,emphasis:1};f(n,function(t,e){a[e]||lp(r,e)||(r[e]=t)}),i.label&&!lp(n,"emphasis")&&(n.emphasis=i.label,delete i.label)}function lp(t,e){return t.hasOwnProperty(e)}function hp(t,e){return bo(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()},t.get("padding"))}function up(t,e,i,r){var a=Qr(t.get(e).replace(/^path:\/\//,""),n(r||{}),new gi(i[0],i[1],i[2],i[3]),"center");return a}function cp(t,e,i,n,a,o){var s=e.get("color");if(a)a.setColor(s),i.add(a),o&&o.onUpdate(a);else{var l=t.get("symbol");a=fu(l,-1,-1,2,2,s),a.setStyle("strokeNoScale",!0),i.add(a),o&&o.onCreate(a)}var h=e.getItemStyle(["color","symbol","symbolSize"]);a.setStyle(h),n=r({rectHover:!0,z2:100},n,!0);var u=t.get("symbolSize");u=u instanceof Array?u.slice():[+u,+u],u[0]/=2,u[1]/=2,n.scale=u;var c=t.get("symbolOffset");if(c){var d=n.position=n.position||[0,0];d[0]+=Ua(c[0],u[0]),d[1]+=Ua(c[1],u[1])}var f=t.get("symbolRotate");return n.rotation=(f||0)*Math.PI/180||0,a.attr(n),a.updateTransform(),a}function dp(t,e,i,n,r){if(!t.dragging){var a=n.getModel("checkpointStyle"),o=i.dataToCoord(n.getData().get(["value"],e));r||!a.get("animation",!0)?t.attr({position:[o,0]}):(t.stopAnimation(!0),t.animateTo({position:[o,0]},a.get("animationDuration",!0),a.get("animationEasing",!0)))}}function fp(t){return h(iI,t)>=0}function pp(t,e){t=t.slice();var i=p(t,_o);e=(e||[]).slice();var n=p(e,_o);return function(r,a){f(t,function(t,o){for(var s={name:t,capital:i[o]},l=0;l=0}function r(t,n){var r=!1;return e(function(e){f(i(t,e)||[],function(t){n.records[e.name][t]&&(r=!0)})}),r}function a(t,n){n.nodes.push(t),e(function(e){f(i(t,e)||[],function(t){n.records[e.name][t]=!0})})}return function(i){function o(t){!n(t,s)&&r(t,s)&&(a(t,s),l=!0)}var s={nodes:[],records:{}};if(e(function(t){s.records[t.name]={}}),!i)return s;a(i,s);var l;do l=!1,t(o);while(l);return s}}function vp(t,e,i){var n=[1/0,-1/0];return rI(i,function(t){var i=t.getData();i&&rI(i.mapDimension(e,!0),function(t){var e=i.getApproximateExtent(t);e[0]n[1]&&(n[1]=e[1])})}),n[1]0?0:0/0);var o=i.getMax(!0);return null!=o&&"dataMax"!==o&&"function"!=typeof o?e[1]=o:r&&(e[1]=a>0?a-1:0/0),i.get("scale",!0)||(e[0]>0&&(e[0]=0),e[1]<0&&(e[1]=0)),e}function yp(t,e){var i=t.getAxisModel(),n=t._percentWindow,r=t._valueWindow;if(n){var a=to(r,[0,500]);a=Math.min(a,20);var o=e||0===n[0]&&100===n[1];i.setRange(o?null:+r[0].toFixed(a),o?null:+r[1].toFixed(a))}}function xp(t){var e=t._minMaxSpan={},i=t._dataZoomModel;rI(["min","max"],function(n){e[n+"Span"]=i.get(n+"Span");var r=i.get(n+"ValueSpan");if(null!=r&&(e[n+"ValueSpan"]=r,r=t.getAxisModel().axis.scale.parse(r),null!=r)){var a=t._dataExtent;e[n+"Span"]=qa(a[0]+r,a,[0,100],!0)}})}function _p(t){var e={};return sI(["start","end","startValue","endValue","throttle"],function(i){t.hasOwnProperty(i)&&(e[i]=t[i])}),e}function wp(t,e){var i=t._rangePropMode,n=t.get("rangeMode");sI([["start","startValue"],["end","endValue"]],function(t,r){var a=null!=e[t[0]],o=null!=e[t[1]];a&&!o?i[r]="percent":!a&&o?i[r]="value":n?i[r]=n[r]:a&&(i[r]="percent")})}function bp(t,e){var i=t[e]-t[1-e];return{span:Math.abs(i),sign:i>0?-1:0>i?1:e?-1:1}}function Sp(t,e){return Math.min(e[1],Math.max(e[0],t))}function Mp(t){var e={x:"y",y:"x",radius:"angle",angle:"radius"};return e[t]}function Ip(t){return"vertical"===t?"ns-resize":"ew-resize"}function Tp(t,e){return!!Cp(t)[e]}function Cp(t){return t[II]||(t[II]={})}function Ap(t){this.pointerChecker,this._zr=t,this._opt={};var e=y,i=e(Dp,this),r=e(kp,this),a=e(Pp,this),o=e(Lp,this),l=e(Op,this);bg.call(this),this.setPointerChecker=function(t){this.pointerChecker=t},this.enable=function(e,h){this.disable(),this._opt=s(n(h)||{},{zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!1,preventDefaultMouseMove:!0}),null==e&&(e=!0),(e===!0||"move"===e||"pan"===e)&&(t.on("mousedown",i),t.on("mousemove",r),t.on("mouseup",a)),(e===!0||"scale"===e||"zoom"===e)&&(t.on("mousewheel",o),t.on("pinch",l))},this.disable=function(){t.off("mousedown",i),t.off("mousemove",r),t.off("mouseup",a),t.off("mousewheel",o),t.off("pinch",l)},this.dispose=this.disable,this.isDragging=function(){return this._dragging},this.isPinching=function(){return this._pinching}}function Dp(t){if(!(me(t)||t.target&&t.target.draggable)){var e=t.offsetX,i=t.offsetY;this.pointerChecker&&this.pointerChecker(t,e,i)&&(this._x=e,this._y=i,this._dragging=!0)}}function kp(t){if(!me(t)&&Rp("moveOnMouseMove",t,this._opt)&&this._dragging&&"pinch"!==t.gestureEvent&&!Tp(this._zr,"globalPan")){var e=t.offsetX,i=t.offsetY,n=this._x,r=this._y,a=e-n,o=i-r;this._x=e,this._y=i,this._opt.preventDefaultMouseMove&&Ig(t.event),Ep(this,"pan","moveOnMouseMove",t,{dx:a,dy:o,oldX:n,oldY:r,newX:e,newY:i})}}function Pp(t){me(t)||(this._dragging=!1)}function Lp(t){var e=Rp("zoomOnMouseWheel",t,this._opt),i=Rp("moveOnMouseWheel",t,this._opt),n=t.wheelDelta,r=Math.abs(n),a=t.offsetX,o=t.offsetY;if(0!==n&&(e||i)){if(e){var s=r>3?1.4:r>1?1.2:1.1,l=n>0?s:1/s;zp(this,"zoom","zoomOnMouseWheel",t,{scale:l,originX:a,originY:o})}if(i){var h=Math.abs(n),u=(n>0?1:-1)*(h>3?.4:h>1?.15:.05);zp(this,"scrollMove","moveOnMouseWheel",t,{scrollDelta:u,originX:a,originY:o})}}}function Op(t){if(!Tp(this._zr,"globalPan")){var e=t.pinchScale>1?1.1:1/1.1;zp(this,"zoom",null,t,{scale:e,originX:t.pinchX,originY:t.pinchY})}}function zp(t,e,i,n,r){t.pointerChecker&&t.pointerChecker(n,r.originX,r.originY)&&(Ig(n.event),Ep(t,e,i,n,r))}function Ep(t,e,i,n,r){r.isAvailableBehavior=y(Rp,null,i,n),t.trigger(e,r)}function Rp(t,e,i){var n=i[t];return!t||n&&(!b(n)||e.event[n+"Key"])}function Bp(t,e){var i=Vp(t),n=e.dataZoomId,r=e.coordId;f(i,function(t){var i=t.dataZoomInfos;i[n]&&h(e.allCoordIds,r)<0&&(delete i[n],t.count--)}),Gp(i);var a=i[r];a||(a=i[r]={coordId:r,dataZoomInfos:{},count:0},a.controller=Wp(t,a),a.dispatchAction=x(Hp,t)),!a.dataZoomInfos[n]&&a.count++,a.dataZoomInfos[n]=e;var o=Zp(a.dataZoomInfos);a.controller.enable(o.controlType,o.opt),a.controller.setPointerChecker(e.containsPoint),Hs(a,"dispatchAction",e.dataZoomModel.get("throttle",!0),"fixRate")}function Np(t,e){var i=Vp(t);f(i,function(t){t.controller.dispose();var i=t.dataZoomInfos;i[e]&&(delete i[e],t.count--)}),Gp(i)}function Fp(t){return t.type+"\x00_"+t.id}function Vp(t){var e=t.getZr();return e[TI]||(e[TI]={})}function Wp(t,e){var i=new Ap(t.getZr());return f(["pan","zoom","scrollMove"],function(t){i.on(t,function(i){var n=[];f(e.dataZoomInfos,function(r){if(i.isAvailableBehavior(r.dataZoomModel.option)){var a=(r.getRange||{})[t],o=a&&a(e.controller,i);!r.dataZoomModel.get("disabled",!0)&&o&&n.push({dataZoomId:r.dataZoomId,start:o[0],end:o[1]})}}),n.length&&e.dispatchAction(n)})}),i}function Gp(t){f(t,function(e,i){e.count||(e.controller.dispose(),delete t[i])})}function Hp(t,e){t.dispatchAction({type:"dataZoom",batch:e})}function Zp(t){var e,i="type_",n={type_true:2,type_move:1,type_false:0,type_undefined:-1},r=!0;return f(t,function(t){var a=t.dataZoomModel,o=a.get("disabled",!0)?!1:a.get("zoomLock",!0)?"move":!0;n[i+o]>n[i+e]&&(e=o),r&=a.get("preventDefaultMouseMove",!0)}),{controlType:e,opt:{zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!0,preventDefaultMouseMove:!!r}}}function Xp(t){return function(e,i,n,r){var a=this._range,o=a.slice(),s=e.axisModels[0];if(s){var l=t(o,s,e,i,n,r);return cI(l,o,[0,100],"all"),this._range=o,a[0]!==o[0]||a[1]!==o[1]?o:void 0}}}function Yp(t){return PI(t)}function jp(){if(!zI&&EI){zI=!0;var t=EI.styleSheets;t.length<31?EI.createStyleSheet().addRule(".zrvml","behavior:url(#default#VML)"):t[0].addRule(".zrvml","behavior:url(#default#VML)")}}function qp(t){return parseInt(t,10)}function Up(t,e){jp(),this.root=t,this.storage=e;var i=document.createElement("div"),n=document.createElement("div");i.style.cssText="display:inline-block;overflow:hidden;position:relative;width:300px;height:150px;",n.style.cssText="position:absolute;left:0;top:0;",t.appendChild(i),this._vmlRoot=n,this._vmlViewport=i,this.resize();var r=e.delFromStorage,a=e.addToStorage;e.delFromStorage=function(t){r.call(e,t),t&&t.onRemove&&t.onRemove(n)},e.addToStorage=function(t){t.onAdd&&t.onAdd(n),a.call(e,t) +},this._firstPaint=!0}function $p(t){return function(){iv('In IE8.0 VML mode painter not support method "'+t+'"')}}var Kp=2311,Qp=function(){return Kp++},Jp={};Jp="object"==typeof wx&&"function"==typeof wx.getSystemInfoSync?{browser:{},os:{},node:!1,wxa:!0,canvasSupported:!0,svgSupported:!1,touchEventsSupported:!0,domSupported:!1}:"undefined"==typeof document&&"undefined"!=typeof self?{browser:{},os:{},node:!1,worker:!0,canvasSupported:!0,domSupported:!1}:"undefined"==typeof navigator?{browser:{},os:{},node:!0,worker:!1,canvasSupported:!0,svgSupported:!0,domSupported:!1}:e(navigator.userAgent);var tg=Jp,eg={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1,"[object CanvasPattern]":1,"[object Image]":1,"[object Canvas]":1},ig={"[object Int8Array]":1,"[object Uint8Array]":1,"[object Uint8ClampedArray]":1,"[object Int16Array]":1,"[object Uint16Array]":1,"[object Int32Array]":1,"[object Uint32Array]":1,"[object Float32Array]":1,"[object Float64Array]":1},ng=Object.prototype.toString,rg=Array.prototype,ag=rg.forEach,og=rg.filter,sg=rg.slice,lg=rg.map,hg=rg.reduce,ug={},cg=function(){return ug.createCanvas()};ug.createCanvas=function(){return document.createElement("canvas")};var dg,fg="__ec_primitive__";B.prototype={constructor:B,get:function(t){return this.data.hasOwnProperty(t)?this.data[t]:null},set:function(t,e){return this.data[t]=e},each:function(t,e){void 0!==e&&(t=y(t,e));for(var i in this.data)this.data.hasOwnProperty(i)&&t(this.data[i],i)},removeKey:function(t){delete this.data[t]}};var pg=(Object.freeze||Object)({$override:i,clone:n,merge:r,mergeAll:a,extend:o,defaults:s,createCanvas:cg,getContext:l,indexOf:h,inherits:u,mixin:c,isArrayLike:d,each:f,map:p,reduce:g,filter:v,find:m,bind:y,curry:x,isArray:_,isFunction:w,isString:b,isObject:S,isBuiltInObject:M,isTypedArray:I,isDom:T,eqNaN:C,retrieve:A,retrieve2:D,retrieve3:k,slice:P,normalizeCssArray:L,assert:O,trim:z,setAsPrimitive:E,isPrimitive:R,createHashMap:N,concatArray:F,noop:V}),gg="undefined"==typeof Float32Array?Array:Float32Array,vg=q,mg=U,yg=ee,xg=ie,_g=(Object.freeze||Object)({create:W,copy:G,clone:H,set:Z,add:X,scaleAndAdd:Y,sub:j,len:q,length:vg,lenSquare:U,lengthSquare:mg,mul:$,div:K,dot:Q,scale:J,normalize:te,distance:ee,dist:yg,distanceSquare:ie,distSquare:xg,negate:ne,lerp:re,applyTransform:ae,min:oe,max:se});le.prototype={constructor:le,_dragStart:function(t){var e=t.target;e&&e.draggable&&(this._draggingTarget=e,e.dragging=!0,this._x=t.offsetX,this._y=t.offsetY,this.dispatchToElement(he(e,t),"dragstart",t.event))},_drag:function(t){var e=this._draggingTarget;if(e){var i=t.offsetX,n=t.offsetY,r=i-this._x,a=n-this._y;this._x=i,this._y=n,e.drift(r,a,t),this.dispatchToElement(he(e,t),"drag",t.event);var o=this.findHover(i,n,e).target,s=this._dropTarget;this._dropTarget=o,e!==o&&(s&&o!==s&&this.dispatchToElement(he(s,t),"dragleave",t.event),o&&o!==s&&this.dispatchToElement(he(o,t),"dragenter",t.event))}},_dragEnd:function(t){var e=this._draggingTarget;e&&(e.dragging=!1),this.dispatchToElement(he(e,t),"dragend",t.event),this._dropTarget&&this.dispatchToElement(he(this._dropTarget,t),"drop",t.event),this._draggingTarget=null,this._dropTarget=null}};var wg=Array.prototype.slice,bg=function(t){this._$handlers={},this._$eventProcessor=t};bg.prototype={constructor:bg,one:function(t,e,i,n){var r=this._$handlers;if("function"==typeof e&&(n=i,i=e,e=null),!i||!t)return this;e=ue(this,e),r[t]||(r[t]=[]);for(var a=0;ar;r++)i[t][r].h!==e&&n.push(i[t][r]);i[t]=n}i[t]&&0===i[t].length&&delete i[t]}else delete i[t];return this},trigger:function(t){var e=this._$handlers[t],i=this._$eventProcessor;if(e){var n=arguments,r=n.length;r>3&&(n=wg.call(n,1));for(var a=e.length,o=0;a>o;){var s=e[o];if(i&&i.filter&&null!=s.query&&!i.filter(t,s.query))o++;else{switch(r){case 1:s.h.call(s.ctx);break;case 2:s.h.call(s.ctx,n[1]);break;case 3:s.h.call(s.ctx,n[1],n[2]);break;default:s.h.apply(s.ctx,n)}s.one?(e.splice(o,1),a--):o++}}}return i&&i.afterTrigger&&i.afterTrigger(t),this},triggerWithContext:function(t){var e=this._$handlers[t],i=this._$eventProcessor;if(e){var n=arguments,r=n.length;r>4&&(n=wg.call(n,1,n.length-1));for(var a=n[n.length-1],o=e.length,s=0;o>s;){var l=e[s];if(i&&i.filter&&null!=l.query&&!i.filter(t,l.query))s++;else{switch(r){case 1:l.h.call(a);break;case 2:l.h.call(a,n[1]);break;case 3:l.h.call(a,n[1],n[2]);break;default:l.h.apply(a,n)}l.one?(e.splice(s,1),o--):s++}}}return i&&i.afterTrigger&&i.afterTrigger(t),this}};var Sg="undefined"!=typeof window&&!!window.addEventListener,Mg=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ig=Sg?function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0}:function(t){t.returnValue=!1,t.cancelBubble=!0},Tg="silent";_e.prototype.dispose=function(){};var Cg=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],Ag=function(t,e,i,n){bg.call(this),this.storage=t,this.painter=e,this.painterRoot=n,i=i||new _e,this.proxy=null,this._hovered={},this._lastTouchMoment,this._lastX,this._lastY,le.call(this),this.setHandlerProxy(i)};Ag.prototype={constructor:Ag,setHandlerProxy:function(t){this.proxy&&this.proxy.dispose(),t&&(f(Cg,function(e){t.on&&t.on(e,this[e],this)},this),t.handler=this),this.proxy=t},mousemove:function(t){var e=t.zrX,i=t.zrY,n=this._hovered,r=n.target;r&&!r.__zr&&(n=this.findHover(n.x,n.y),r=n.target);var a=this._hovered=this.findHover(e,i),o=a.target,s=this.proxy;s.setCursor&&s.setCursor(o?o.cursor:"default"),r&&o!==r&&this.dispatchToElement(n,"mouseout",t),this.dispatchToElement(a,"mousemove",t),o&&o!==r&&this.dispatchToElement(a,"mouseover",t)},mouseout:function(t){this.dispatchToElement(this._hovered,"mouseout",t);var e,i=t.toElement||t.relatedTarget;do i=i&&i.parentNode;while(i&&9!=i.nodeType&&!(e=i===this.painterRoot));!e&&this.trigger("globalout",{event:t})},resize:function(){this._hovered={}},dispatch:function(t,e){var i=this[t];i&&i.call(this,e)},dispose:function(){this.proxy.dispose(),this.storage=this.proxy=this.painter=null},setCursorStyle:function(t){var e=this.proxy;e.setCursor&&e.setCursor(t)},dispatchToElement:function(t,e,i){t=t||{};var n=t.target;if(!n||!n.silent){for(var r="on"+e,a=ye(e,t,i);n&&(n[r]&&(a.cancelBubble=n[r].call(n,a)),n.trigger(e,a),n=n.parent,!a.cancelBubble););a.cancelBubble||(this.trigger(e,a),this.painter&&this.painter.eachOtherLayer(function(t){"function"==typeof t[r]&&t[r].call(t,a),t.trigger&&t.trigger(e,a)}))}},findHover:function(t,e,i){for(var n=this.storage.getDisplayList(),r={x:t,y:e},a=n.length-1;a>=0;a--){var o;if(n[a]!==i&&!n[a].ignore&&(o=we(n[a],t,e))&&(!r.topTarget&&(r.topTarget=n[a]),o!==Tg)){r.target=n[a];break}}return r}},f(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(t){Ag.prototype[t]=function(e){var i=this.findHover(e.zrX,e.zrY),n=i.target;if("mousedown"===t)this._downEl=n,this._downPoint=[e.zrX,e.zrY],this._upEl=n;else if("mouseup"===t)this._upEl=n;else if("click"===t){if(this._downEl!==this._upEl||!this._downPoint||yg(this._downPoint,[e.zrX,e.zrY])>4)return;this._downPoint=null}this.dispatchToElement(i,t,e)}}),c(Ag,bg),c(Ag,le);var Dg="undefined"==typeof Float32Array?Array:Float32Array,kg=(Object.freeze||Object)({create:be,identity:Se,copy:Me,mul:Ie,translate:Te,rotate:Ce,scale:Ae,invert:De,clone:ke}),Pg=Se,Lg=5e-5,Og=function(t){t=t||{},t.position||(this.position=[0,0]),null==t.rotation&&(this.rotation=0),t.scale||(this.scale=[1,1]),this.origin=this.origin||null},zg=Og.prototype;zg.transform=null,zg.needLocalTransform=function(){return Pe(this.rotation)||Pe(this.position[0])||Pe(this.position[1])||Pe(this.scale[0]-1)||Pe(this.scale[1]-1)};var Eg=[];zg.updateTransform=function(){var t=this.parent,e=t&&t.transform,i=this.needLocalTransform(),n=this.transform;if(!i&&!e)return void(n&&Pg(n));n=n||be(),i?this.getLocalTransform(n):Pg(n),e&&(i?Ie(n,t.transform,n):Me(n,t.transform)),this.transform=n;var r=this.globalScaleRatio;if(null!=r&&1!==r){this.getGlobalScale(Eg);var a=Eg[0]<0?-1:1,o=Eg[1]<0?-1:1,s=((Eg[0]-a)*r+a)/Eg[0]||0,l=((Eg[1]-o)*r+o)/Eg[1]||0;n[0]*=s,n[1]*=s,n[2]*=l,n[3]*=l}this.invTransform=this.invTransform||be(),De(this.invTransform,n)},zg.getLocalTransform=function(t){return Og.getLocalTransform(this,t)},zg.setTransform=function(t){var e=this.transform,i=t.dpr||1;e?t.setTransform(i*e[0],i*e[1],i*e[2],i*e[3],i*e[4],i*e[5]):t.setTransform(i,0,0,i,0,0)},zg.restoreTransform=function(t){var e=t.dpr||1;t.setTransform(e,0,0,e,0,0)};var Rg=[],Bg=be();zg.setLocalTransform=function(t){if(t){var e=t[0]*t[0]+t[1]*t[1],i=t[2]*t[2]+t[3]*t[3],n=this.position,r=this.scale;Pe(e-1)&&(e=Math.sqrt(e)),Pe(i-1)&&(i=Math.sqrt(i)),t[0]<0&&(e=-e),t[3]<0&&(i=-i),n[0]=t[4],n[1]=t[5],r[0]=e,r[1]=i,this.rotation=Math.atan2(-t[1]/i,t[0]/e)}},zg.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(Ie(Rg,t.invTransform,e),e=Rg);var i=this.origin;i&&(i[0]||i[1])&&(Bg[4]=i[0],Bg[5]=i[1],Ie(Rg,e,Bg),Rg[4]-=i[0],Rg[5]-=i[1],e=Rg),this.setLocalTransform(e)}},zg.getGlobalScale=function(t){var e=this.transform;return t=t||[],e?(t[0]=Math.sqrt(e[0]*e[0]+e[1]*e[1]),t[1]=Math.sqrt(e[2]*e[2]+e[3]*e[3]),e[0]<0&&(t[0]=-t[0]),e[3]<0&&(t[1]=-t[1]),t):(t[0]=1,t[1]=1,t)},zg.transformCoordToLocal=function(t,e){var i=[t,e],n=this.invTransform;return n&&ae(i,i,n),i},zg.transformCoordToGlobal=function(t,e){var i=[t,e],n=this.transform;return n&&ae(i,i,n),i},Og.getLocalTransform=function(t,e){e=e||[],Pg(e);var i=t.origin,n=t.scale||[1,1],r=t.rotation||0,a=t.position||[0,0];return i&&(e[4]-=i[0],e[5]-=i[1]),Ae(e,e,n),r&&Ce(e,e,r),i&&(e[4]+=i[0],e[5]+=i[1]),e[4]+=a[0],e[5]+=a[1],e};var Ng={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(-Math.pow(2,-10*(t-1))+2)},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,i=.1,n=.4;return 0===t?0:1===t?1:(!i||1>i?(i=1,e=n/4):e=n*Math.asin(1/i)/(2*Math.PI),-(i*Math.pow(2,10*(t-=1))*Math.sin(2*(t-e)*Math.PI/n)))},elasticOut:function(t){var e,i=.1,n=.4;return 0===t?0:1===t?1:(!i||1>i?(i=1,e=n/4):e=n*Math.asin(1/i)/(2*Math.PI),i*Math.pow(2,-10*t)*Math.sin(2*(t-e)*Math.PI/n)+1)},elasticInOut:function(t){var e,i=.1,n=.4;return 0===t?0:1===t?1:(!i||1>i?(i=1,e=n/4):e=n*Math.asin(1/i)/(2*Math.PI),(t*=2)<1?-.5*i*Math.pow(2,10*(t-=1))*Math.sin(2*(t-e)*Math.PI/n):i*Math.pow(2,-10*(t-=1))*Math.sin(2*(t-e)*Math.PI/n)*.5+1)},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?.5*t*t*((e+1)*t-e):.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(t){return 1-Ng.bounceOut(1-t)},bounceOut:function(t){return 1/2.75>t?7.5625*t*t:2/2.75>t?7.5625*(t-=1.5/2.75)*t+.75:2.5/2.75>t?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return.5>t?.5*Ng.bounceIn(2*t):.5*Ng.bounceOut(2*t-1)+.5}};Le.prototype={constructor:Le,step:function(t,e){if(this._initialized||(this._startTime=t+this._delay,this._initialized=!0),this._paused)return void(this._pausedTime+=e);var i=(t-this._startTime-this._pausedTime)/this._life;if(!(0>i)){i=Math.min(i,1);var n=this.easing,r="string"==typeof n?Ng[n]:n,a="function"==typeof r?r(i):i;return this.fire("frame",a),1==i?this.loop?(this.restart(t),"restart"):(this._needsRemove=!0,"destroy"):null}},restart:function(t){var e=(t-this._startTime-this._pausedTime)%this._life;this._startTime=t-e+this.gap,this._pausedTime=0,this._needsRemove=!1},fire:function(t,e){t="on"+t,this[t]&&this[t](this._target,e)},pause:function(){this._paused=!0},resume:function(){this._paused=!1}};var Fg=function(){this.head=null,this.tail=null,this._len=0},Vg=Fg.prototype;Vg.insert=function(t){var e=new Wg(t);return this.insertEntry(e),e},Vg.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,t.next=null,this.tail=t):this.head=this.tail=t,this._len++},Vg.remove=function(t){var e=t.prev,i=t.next;e?e.next=i:this.head=i,i?i.prev=e:this.tail=e,t.next=t.prev=null,this._len--},Vg.len=function(){return this._len},Vg.clear=function(){this.head=this.tail=null,this._len=0};var Wg=function(t){this.value=t,this.next,this.prev},Gg=function(t){this._list=new Fg,this._map={},this._maxSize=t||10,this._lastRemovedEntry=null},Hg=Gg.prototype;Hg.put=function(t,e){var i=this._list,n=this._map,r=null;if(null==n[t]){var a=i.len(),o=this._lastRemovedEntry;if(a>=this._maxSize&&a>0){var s=i.head;i.remove(s),delete n[s.key],r=s.value,this._lastRemovedEntry=s}o?o.value=e:o=new Wg(e),o.key=t,i.insertEntry(o),n[t]=o}return r},Hg.get=function(t){var e=this._map[t],i=this._list;return null!=e?(e!==i.tail&&(i.remove(e),i.insertEntry(e)),e.value):void 0},Hg.clear=function(){this._list.clear(),this._map={}};var Zg={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]},Xg=new Gg(20),Yg=null,jg=qe,qg=Ue,Ug=(Object.freeze||Object)({parse:He,lift:Ye,toHex:je,fastLerp:qe,fastMapToColor:jg,lerp:Ue,mapToColor:qg,modifyHSL:$e,modifyAlpha:Ke,stringify:Qe}),$g=Array.prototype.slice,Kg=function(t,e,i,n){this._tracks={},this._target=t,this._loop=e||!1,this._getter=i||Je,this._setter=n||ti,this._clipCount=0,this._delay=0,this._doneList=[],this._onframeList=[],this._clipList=[]};Kg.prototype={when:function(t,e){var i=this._tracks;for(var n in e)if(e.hasOwnProperty(n)){if(!i[n]){i[n]=[];var r=this._getter(this._target,n);if(null==r)continue;0!==t&&i[n].push({time:0,value:li(r)})}i[n].push({time:t,value:e[n]})}return this},during:function(t){return this._onframeList.push(t),this},pause:function(){for(var t=0;ti;i++)t[i].call(this)},start:function(t,e){var i,n=this,r=0,a=function(){r--,r||n._doneCallback()};for(var o in this._tracks)if(this._tracks.hasOwnProperty(o)){var s=ci(this,t,a,this._tracks[o],o,e);s&&(this._clipList.push(s),r++,this.animation&&this.animation.addClip(s),i=s)}if(i){var l=i.onframe;i.onframe=function(t,e){l(t,e);for(var i=0;i1&&(ev=function(){for(var t in arguments)console.log(arguments[t])});var iv=ev,nv=function(){this.animators=[]};nv.prototype={constructor:nv,animate:function(t,e){var i,n=!1,r=this,a=this.__zr;if(t){var o=t.split("."),s=r;n="shape"===o[0];for(var l=0,u=o.length;u>l;l++)s&&(s=s[o[l]]);s&&(i=s)}else i=r;if(!i)return void iv('Property "'+t+'" is not existed in element '+r.id);var c=r.animators,d=new Kg(i,e);return d.during(function(){r.dirty(n)}).done(function(){c.splice(h(c,d),1)}),c.push(d),a&&a.animation.addAnimator(d),d},stopAnimation:function(t){for(var e=this.animators,i=e.length,n=0;i>n;n++)e[n].stop(t);return e.length=0,this},animateTo:function(t,e,i,n,r,a){di(this,t,e,i,n,r,a)},animateFrom:function(t,e,i,n,r,a){di(this,t,e,i,n,r,a,!0)}};var rv=function(t){Og.call(this,t),bg.call(this,t),nv.call(this,t),this.id=t.id||Qp()};rv.prototype={type:"element",name:"",__zr:null,ignore:!1,clipPath:null,isGroup:!1,drift:function(t,e){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var i=this.transform;i||(i=this.transform=[1,0,0,1,0,0]),i[4]+=t,i[5]+=e,this.decomposeTransform(),this.dirty(!1)},beforeUpdate:function(){},afterUpdate:function(){},update:function(){this.updateTransform()},traverse:function(){},attrKV:function(t,e){if("position"===t||"scale"===t||"origin"===t){if(e){var i=this[t];i||(i=this[t]=[]),i[0]=e[0],i[1]=e[1]}}else this[t]=e},hide:function(){this.ignore=!0,this.__zr&&this.__zr.refresh()},show:function(){this.ignore=!1,this.__zr&&this.__zr.refresh()},attr:function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(S(t))for(var i in t)t.hasOwnProperty(i)&&this.attrKV(i,t[i]);return this.dirty(!1),this},setClipPath:function(t){var e=this.__zr;e&&t.addSelfToZr(e),this.clipPath&&this.clipPath!==t&&this.removeClipPath(),this.clipPath=t,t.__zr=e,t.__clipTarget=this,this.dirty(!1)},removeClipPath:function(){var t=this.clipPath;t&&(t.__zr&&t.removeSelfFromZr(t.__zr),t.__zr=null,t.__clipTarget=null,this.clipPath=null,this.dirty(!1))},addSelfToZr:function(t){this.__zr=t;var e=this.animators;if(e)for(var i=0;in||i>s||l>a||r>h)},contain:function(t,e){var i=this;return t>=i.x&&t<=i.x+i.width&&e>=i.y&&e<=i.y+i.height},clone:function(){return new gi(this.x,this.y,this.width,this.height)},copy:function(t){this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height},plain:function(){return{x:this.x,y:this.y,width:this.width,height:this.height}}},gi.create=function(t){return new gi(t.x,t.y,t.width,t.height)};var lv=function(t){t=t||{},rv.call(this,t);for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e]);this._children=[],this.__storage=null,this.__dirty=!0};lv.prototype={constructor:lv,isGroup:!0,type:"group",silent:!1,children:function(){return this._children.slice()},childAt:function(t){return this._children[t]},childOfName:function(t){for(var e=this._children,i=0;i=0&&(i.splice(n,0,t),this._doAdd(t))}return this},_doAdd:function(t){t.parent&&t.parent.remove(t),t.parent=this;var e=this.__storage,i=this.__zr;e&&e!==t.__storage&&(e.addToStorage(t),t instanceof lv&&t.addChildrenToStorage(e)),i&&i.refresh()},remove:function(t){var e=this.__zr,i=this.__storage,n=this._children,r=h(n,t);return 0>r?this:(n.splice(r,1),t.parent=null,i&&(i.delFromStorage(t),t instanceof lv&&t.delChildrenFromStorage(i)),e&&e.refresh(),this)},removeAll:function(){var t,e,i=this._children,n=this.__storage;for(e=0;en;n++)this._updateAndAddDisplayable(e[n],null,t);i.length=this._displayListLen,tg.canvasSupported&&Si(i,Mi)},_updateAndAddDisplayable:function(t,e,i){if(!t.ignore||i){t.beforeUpdate(),t.__dirty&&t.update(),t.afterUpdate();var n=t.clipPath;if(n){e=e?e.slice():[];for(var r=n,a=t;r;)r.parent=a,r.updateTransform(),e.push(r),a=r,r=r.clipPath}if(t.isGroup){for(var o=t._children,s=0;se;e++)this.delRoot(t[e]);else{var r=h(this._roots,t);r>=0&&(this.delFromStorage(t),this._roots.splice(r,1),t instanceof lv&&t.delChildrenFromStorage(this))}},addToStorage:function(t){return t&&(t.__storage=this,t.dirty(!1)),this},delFromStorage:function(t){return t&&(t.__storage=null),this},dispose:function(){this._renderList=this._roots=null},displayableSortFunc:Mi};var dv={shadowBlur:1,shadowOffsetX:1,shadowOffsetY:1,textShadowBlur:1,textShadowOffsetX:1,textShadowOffsetY:1,textBoxShadowBlur:1,textBoxShadowOffsetX:1,textBoxShadowOffsetY:1},fv=function(t,e,i){return dv.hasOwnProperty(e)?i*=t.dpr:i},pv=[["shadowBlur",0],["shadowOffsetX",0],["shadowOffsetY",0],["shadowColor","#000"],["lineCap","butt"],["lineJoin","miter"],["miterLimit",10]],gv=function(t){this.extendFrom(t,!1)};gv.prototype={constructor:gv,fill:"#000",stroke:null,opacity:1,fillOpacity:null,strokeOpacity:null,lineDash:null,lineDashOffset:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,lineWidth:1,strokeNoScale:!1,text:null,font:null,textFont:null,fontStyle:null,fontWeight:null,fontSize:null,fontFamily:null,textTag:null,textFill:"#000",textStroke:null,textWidth:null,textHeight:null,textStrokeWidth:0,textLineHeight:null,textPosition:"inside",textRect:null,textOffset:null,textAlign:null,textVerticalAlign:null,textDistance:5,textShadowColor:"transparent",textShadowBlur:0,textShadowOffsetX:0,textShadowOffsetY:0,textBoxShadowColor:"transparent",textBoxShadowBlur:0,textBoxShadowOffsetX:0,textBoxShadowOffsetY:0,transformText:!1,textRotation:0,textOrigin:null,textBackgroundColor:null,textBorderColor:null,textBorderWidth:0,textBorderRadius:0,textPadding:null,rich:null,truncate:null,blend:null,bind:function(t,e,i){for(var n=this,r=i&&i.style,a=!r,o=0;o0},extendFrom:function(t,e){if(t)for(var i in t)!t.hasOwnProperty(i)||e!==!0&&(e===!1?this.hasOwnProperty(i):null==t[i])||(this[i]=t[i])},set:function(t,e){"string"==typeof t?this[t]=e:this.extendFrom(t,!0)},clone:function(){var t=new this.constructor;return t.extendFrom(this,!0),t},getGradient:function(t,e,i){for(var n="radial"===e.type?Ti:Ii,r=n(t,e,i),a=e.colorStops,o=0;o=0&&i.splice(n,1),t.__hoverMir=null},clearHover:function(){for(var t=this._hoverElements,e=0;er;){var a=t[r],o=a.__from;o&&o.__zr?(r++,o.invisible||(a.transform=o.transform,a.invTransform=o.invTransform,a.__clipPaths=o.__clipPaths,this._doPaintEl(a,i,!0,n))):(t.splice(r,1),o.__hoverMir=null,e--)}i.ctx.restore()}},getHoverLayer:function(){return this.getLayer(zv)},_paintList:function(t,e,i){if(this._redrawId===i){e=e||!1,this._updateLayerStatus(t);var n=this._doPaintList(t,e);if(this._needsManuallyCompositing&&this._compositeManually(),!n){var r=this;wv(function(){r._paintList(t,e,i)})}}},_compositeManually:function(){var t=this.getLayer(Ev).ctx,e=this._domRoot.width,i=this._domRoot.height;t.clearRect(0,0,e,i),this.eachBuiltinLayer(function(n){n.virtual&&t.drawImage(n.dom,0,0,e,i)})},_doPaintList:function(t,e){for(var i=[],n=0;n15)break}}a.__drawIndex=v,a.__drawIndex0&&t>n[0]){for(o=0;r-1>o&&!(n[o]t);o++);a=i[n[o]]}if(n.splice(o+1,0,t),i[t]=e,!e.virtual)if(a){var l=a.dom;l.nextSibling?s.insertBefore(e.dom,l.nextSibling):s.appendChild(e.dom)}else s.firstChild?s.insertBefore(e.dom,s.firstChild):s.appendChild(e.dom)},eachLayer:function(t,e){var i,n,r=this._zlevelList;for(n=0;n0?Rv:0),this._needsManuallyCompositing),o.__builtin__||iv("ZLevel "+s+" has been used by unkown layer "+o.id),o!==r&&(o.__used=!0,o.__startIndex!==i&&(o.__dirty=!0),o.__startIndex=i,o.__drawIndex=o.incremental?-1:i,e(i),r=o),n.__dirty&&(o.__dirty=!0,o.incremental&&o.__drawIndex<0&&(o.__drawIndex=i))}e(i),this.eachBuiltinLayer(function(t){!t.__used&&t.getElementCount()>0&&(t.__dirty=!0,t.__startIndex=t.__endIndex=t.__drawIndex=0),t.__dirty&&t.__drawIndex<0&&(t.__drawIndex=t.__startIndex)})},clear:function(){return this.eachBuiltinLayer(this._clearLayer),this},_clearLayer:function(t){t.clear()},setBackgroundColor:function(t){this._backgroundColor=t},configLayer:function(t,e){if(e){var i=this._layerConfig;i[t]?r(i[t],e,!0):i[t]=e;for(var n=0;n=0&&this._clips.splice(e,1)},removeAnimator:function(t){for(var e=t.getClips(),i=0;io;o++){var s=i[o],l=s.step(t,e);l&&(r.push(l),a.push(s))}for(var o=0;n>o;)i[o]._needsRemove?(i[o]=i[n-1],i.pop(),n--):o++;n=r.length;for(var o=0;n>o;o++)a[o].fire(r[o]);this._time=t,this.onframe(e),this.trigger("frame",e),this.stage.update&&this.stage.update()},_startLoop:function(){function t(){e._running&&(wv(t),!e._paused&&e._update())}var e=this;this._running=!0,wv(t)},start:function(){this._time=(new Date).getTime(),this._pausedTime=0,this._startLoop()},stop:function(){this._running=!1},pause:function(){this._paused||(this._pauseStart=(new Date).getTime(),this._paused=!0)},resume:function(){this._paused&&(this._pausedTime+=(new Date).getTime()-this._pauseStart,this._paused=!1)},clear:function(){this._clips=[]},isFinished:function(){return!this._clips.length},animate:function(t,e){e=e||{};var i=new Kg(t,e.loop,e.getter,e.setter);return this.addAnimator(i),i}},c(Wv,bg);var Gv=function(){this._track=[]};Gv.prototype={constructor:Gv,recognize:function(t,e,i){return this._doTrack(t,e,i),this._recognize(t)},clear:function(){return this._track.length=0,this},_doTrack:function(t,e,i){var n=t.touches;if(n){for(var r={points:[],touches:[],target:e,event:t},a=0,o=n.length;o>a;a++){var s=n[a],l=de(i,s,{});r.points.push([l.zrX,l.zrY]),r.touches.push(s)}this._track.push(r)}},_recognize:function(t){for(var e in Hv)if(Hv.hasOwnProperty(e)){var i=Hv[e](this._track,t);if(i)return i}}};var Hv={pinch:function(t,e){var i=t.length;if(i){var n=(t[i-1]||{}).points,r=(t[i-2]||{}).points||n;if(r&&r.length>1&&n&&n.length>1){var a=In(n)/In(r);!isFinite(a)&&(a=1),e.pinchScale=a;var o=Tn(n);return e.pinchX=o[0],e.pinchY=o[1],{type:"pinch",target:t[0].target,event:e}}}}},Zv=300,Xv=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],Yv=["touchstart","touchend","touchmove"],jv={pointerdown:1,pointerup:1,pointermove:1,pointerout:1},qv=p(Xv,function(t){var e=t.replace("mouse","pointer");return jv[e]?e:t}),Uv={mousemove:function(t){t=pe(this.dom,t),this.trigger("mousemove",t)},mouseout:function(t){t=pe(this.dom,t);var e=t.toElement||t.relatedTarget;if(e!=this.dom)for(;e&&9!=e.nodeType;){if(e===this.dom)return;e=e.parentNode}this.trigger("mouseout",t)},touchstart:function(t){t=pe(this.dom,t),t.zrByTouch=!0,this._lastTouchMoment=new Date,An(this,t,"start"),Uv.mousemove.call(this,t),Uv.mousedown.call(this,t),Dn(this)},touchmove:function(t){t=pe(this.dom,t),t.zrByTouch=!0,An(this,t,"change"),Uv.mousemove.call(this,t),Dn(this)},touchend:function(t){t=pe(this.dom,t),t.zrByTouch=!0,An(this,t,"end"),Uv.mouseup.call(this,t),+new Date-this._lastTouchMoment=0||n&&h(n,o)<0)){var s=e.getShallow(o);null!=s&&(r[t[a][0]]=s)}}return r}},fm=dm([["lineWidth","width"],["stroke","color"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]),pm={getLineStyle:function(t){var e=fm(this,t),i=this.getLineDash(e.lineWidth);return i&&(e.lineDash=i),e},getLineDash:function(t){null==t&&(t=1);var e=this.get("type"),i=Math.max(t,2),n=4*t;return"solid"===e||null==e?null:"dashed"===e?[n,n]:[i,i]}},gm=dm([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]]),vm={getAreaStyle:function(t,e){return gm(this,t,e)}},mm=Math.pow,ym=Math.sqrt,xm=1e-8,_m=1e-4,wm=ym(3),bm=1/3,Sm=W(),Mm=W(),Im=W(),Tm=Math.min,Cm=Math.max,Am=Math.sin,Dm=Math.cos,km=2*Math.PI,Pm=W(),Lm=W(),Om=W(),zm=[],Em=[],Rm={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},Bm=[],Nm=[],Fm=[],Vm=[],Wm=Math.min,Gm=Math.max,Hm=Math.cos,Zm=Math.sin,Xm=Math.sqrt,Ym=Math.abs,jm="undefined"!=typeof Float32Array,qm=function(t){this._saveData=!t,this._saveData&&(this.data=[]),this._ctx=null};qm.prototype={constructor:qm,_xi:0,_yi:0,_x0:0,_y0:0,_ux:0,_uy:0,_len:0,_lineDash:null,_dashOffset:0,_dashIdx:0,_dashSum:0,setScale:function(t,e){this._ux=Ym(1/tv/t)||0,this._uy=Ym(1/tv/e)||0},getContext:function(){return this._ctx},beginPath:function(t){return this._ctx=t,t&&t.beginPath(),t&&(this.dpr=t.dpr),this._saveData&&(this._len=0),this._lineDash&&(this._lineDash=null,this._dashOffset=0),this},moveTo:function(t,e){return this.addData(Rm.M,t,e),this._ctx&&this._ctx.moveTo(t,e),this._x0=t,this._y0=e,this._xi=t,this._yi=e,this},lineTo:function(t,e){var i=Ym(t-this._xi)>this._ux||Ym(e-this._yi)>this._uy||this._len<5;return this.addData(Rm.L,t,e),this._ctx&&i&&(this._needsDash()?this._dashedLineTo(t,e):this._ctx.lineTo(t,e)),i&&(this._xi=t,this._yi=e),this},bezierCurveTo:function(t,e,i,n,r,a){return this.addData(Rm.C,t,e,i,n,r,a),this._ctx&&(this._needsDash()?this._dashedBezierTo(t,e,i,n,r,a):this._ctx.bezierCurveTo(t,e,i,n,r,a)),this._xi=r,this._yi=a,this},quadraticCurveTo:function(t,e,i,n){return this.addData(Rm.Q,t,e,i,n),this._ctx&&(this._needsDash()?this._dashedQuadraticTo(t,e,i,n):this._ctx.quadraticCurveTo(t,e,i,n)),this._xi=i,this._yi=n,this},arc:function(t,e,i,n,r,a){return this.addData(Rm.A,t,e,i,i,n,r-n,0,a?0:1),this._ctx&&this._ctx.arc(t,e,i,n,r,a),this._xi=Hm(r)*i+t,this._yi=Zm(r)*i+e,this},arcTo:function(t,e,i,n,r){return this._ctx&&this._ctx.arcTo(t,e,i,n,r),this},rect:function(t,e,i,n){return this._ctx&&this._ctx.rect(t,e,i,n),this.addData(Rm.R,t,e,i,n),this},closePath:function(){this.addData(Rm.Z);var t=this._ctx,e=this._x0,i=this._y0;return t&&(this._needsDash()&&this._dashedLineTo(e,i),t.closePath()),this._xi=e,this._yi=i,this},fill:function(t){t&&t.fill(),this.toStatic()},stroke:function(t){t&&t.stroke(),this.toStatic()},setLineDash:function(t){if(t instanceof Array){this._lineDash=t,this._dashIdx=0;for(var e=0,i=0;ii;i++)this.data[i]=t[i];this._len=e},appendPath:function(t){t instanceof Array||(t=[t]);for(var e=t.length,i=0,n=this._len,r=0;e>r;r++)i+=t[r].len();jm&&this.data instanceof Float32Array&&(this.data=new Float32Array(n+i));for(var r=0;e>r;r++)for(var a=t[r].data,o=0;oe.length&&(this._expandData(),e=this.data);for(var i=0;ia&&(a=r+a),a%=r,f-=a*u,p-=a*c;u>0&&t>=f||0>u&&f>=t||0==u&&(c>0&&e>=p||0>c&&p>=e);)n=this._dashIdx,i=o[n],f+=u*i,p+=c*i,this._dashIdx=(n+1)%g,u>0&&l>f||0>u&&f>l||c>0&&h>p||0>c&&p>h||s[n%2?"moveTo":"lineTo"](u>=0?Wm(f,t):Gm(f,t),c>=0?Wm(p,e):Gm(p,e));u=f-t,c=p-e,this._dashOffset=-Xm(u*u+c*c)},_dashedBezierTo:function(t,e,i,n,r,a){var o,s,l,h,u,c=this._dashSum,d=this._dashOffset,f=this._lineDash,p=this._ctx,g=this._xi,v=this._yi,m=lr,y=0,x=this._dashIdx,_=f.length,w=0;for(0>d&&(d=c+d),d%=c,o=0;1>o;o+=.1)s=m(g,t,i,r,o+.1)-m(g,t,i,r,o),l=m(v,e,n,a,o+.1)-m(v,e,n,a,o),y+=Xm(s*s+l*l);for(;_>x&&(w+=f[x],!(w>d));x++);for(o=(w-d)/y;1>=o;)h=m(g,t,i,r,o),u=m(v,e,n,a,o),x%2?p.moveTo(h,u):p.lineTo(h,u),o+=f[x]/y,x=(x+1)%_;x%2!==0&&p.lineTo(r,a),s=r-h,l=a-u,this._dashOffset=-Xm(s*s+l*l)},_dashedQuadraticTo:function(t,e,i,n){var r=i,a=n;i=(i+2*t)/3,n=(n+2*e)/3,t=(this._xi+2*t)/3,e=(this._yi+2*e)/3,this._dashedBezierTo(t,e,i,n,r,a)},toStatic:function(){var t=this.data;t instanceof Array&&(t.length=this._len,jm&&(this.data=new Float32Array(t)))},getBoundingRect:function(){Bm[0]=Bm[1]=Fm[0]=Fm[1]=Number.MAX_VALUE,Nm[0]=Nm[1]=Vm[0]=Vm[1]=-Number.MAX_VALUE;for(var t=this.data,e=0,i=0,n=0,r=0,a=0;ac;){var d=s[c++];switch(1==c&&(n=s[c],r=s[c+1],e=n,i=r),d){case Rm.M:e=n=s[c++],i=r=s[c++],t.moveTo(n,r);break;case Rm.L:a=s[c++],o=s[c++],(Ym(a-n)>l||Ym(o-r)>h||c===u-1)&&(t.lineTo(a,o),n=a,r=o);break;case Rm.C:t.bezierCurveTo(s[c++],s[c++],s[c++],s[c++],s[c++],s[c++]),n=s[c-2],r=s[c-1];break;case Rm.Q:t.quadraticCurveTo(s[c++],s[c++],s[c++],s[c++]),n=s[c-2],r=s[c-1];break;case Rm.A:var f=s[c++],p=s[c++],g=s[c++],v=s[c++],m=s[c++],y=s[c++],x=s[c++],_=s[c++],w=g>v?g:v,b=g>v?1:g/v,S=g>v?v/g:1,M=Math.abs(g-v)>.001,I=m+y;M?(t.translate(f,p),t.rotate(x),t.scale(b,S),t.arc(0,0,w,m,I,1-_),t.scale(1/b,1/S),t.rotate(-x),t.translate(-f,-p)):t.arc(f,p,w,m,I,1-_),1==c&&(e=Hm(m)*g+f,i=Zm(m)*v+p),n=Hm(I)*g+f,r=Zm(I)*v+p;break;case Rm.R:e=n=s[c],i=r=s[c+1],t.rect(s[c++],s[c++],s[c++],s[c++]);break;case Rm.Z:t.closePath(),n=e,r=i}}}},qm.CMD=Rm;var Um=2*Math.PI,$m=2*Math.PI,Km=qm.CMD,Qm=2*Math.PI,Jm=1e-4,ty=[-1,-1,-1],ey=[-1,-1],iy=xv.prototype.getCanvasPattern,ny=Math.abs,ry=new qm(!0);Fr.prototype={constructor:Fr,type:"path",__dirtyPath:!0,strokeContainThreshold:5,brush:function(t,e){var i=this.style,n=this.path||ry,r=i.hasStroke(),a=i.hasFill(),o=i.fill,s=i.stroke,l=a&&!!o.colorStops,h=r&&!!s.colorStops,u=a&&!!o.image,c=r&&!!s.image;if(i.bind(t,this,e),this.setTransform(t),this.__dirty){var d;l&&(d=d||this.getBoundingRect(),this._fillGradient=i.getGradient(t,o,d)),h&&(d=d||this.getBoundingRect(),this._strokeGradient=i.getGradient(t,s,d))}l?t.fillStyle=this._fillGradient:u&&(t.fillStyle=iy.call(o,t)),h?t.strokeStyle=this._strokeGradient:c&&(t.strokeStyle=iy.call(s,t));var f=i.lineDash,p=i.lineDashOffset,g=!!t.setLineDash,v=this.getGlobalScale();if(n.setScale(v[0],v[1]),this.__dirtyPath||f&&!g&&r?(n.beginPath(t),f&&!g&&(n.setLineDash(f),n.setLineDashOffset(p)),this.buildPath(n,this.shape,!1),this.path&&(this.__dirtyPath=!1)):(t.beginPath(),this.path.rebuildPath(t)),a)if(null!=i.fillOpacity){var m=t.globalAlpha;t.globalAlpha=i.fillOpacity*i.opacity,n.fill(t),t.globalAlpha=m}else n.fill(t);if(f&&g&&(t.setLineDash(f),t.lineDashOffset=p),r)if(null!=i.strokeOpacity){var m=t.globalAlpha;t.globalAlpha=i.strokeOpacity*i.opacity,n.stroke(t),t.globalAlpha=m}else n.stroke(t);f&&g&&t.setLineDash([]),null!=i.text&&(this.restoreTransform(t),this.drawRectText(t,this.getBoundingRect()))},buildPath:function(){},createPathProxy:function(){this.path=new qm},getBoundingRect:function(){var t=this._rect,e=this.style,i=!t;if(i){var n=this.path;n||(n=this.path=new qm),this.__dirtyPath&&(n.beginPath(),this.buildPath(n,this.shape,!1)),t=n.getBoundingRect()}if(this._rect=t,e.hasStroke()){var r=this._rectWithStroke||(this._rectWithStroke=t.clone());if(this.__dirty||i){r.copy(t);var a=e.lineWidth,o=e.strokeNoScale?this.getLineScale():1;e.hasFill()||(a=Math.max(a,this.strokeContainThreshold||4)),o>1e-10&&(r.width+=a/o,r.height+=a/o,r.x-=a/o/2,r.y-=a/o/2)}return r}return t},contain:function(t,e){var i=this.transformCoordToLocal(t,e),n=this.getBoundingRect(),r=this.style;if(t=i[0],e=i[1],n.contain(t,e)){var a=this.path.data;if(r.hasStroke()){var o=r.lineWidth,s=r.strokeNoScale?this.getLineScale():1;if(s>1e-10&&(r.hasFill()||(o=Math.max(o,this.strokeContainThreshold)),Nr(a,o/s,t,e)))return!0}if(r.hasFill())return Br(a,t,e)}return!1},dirty:function(t){null==t&&(t=!0),t&&(this.__dirtyPath=t,this._rect=null),this.__dirty=this.__dirtyText=!0,this.__zr&&this.__zr.refresh(),this.__clipTarget&&this.__clipTarget.dirty()},animateShape:function(t){return this.animate("shape",t)},attrKV:function(t,e){"shape"===t?(this.setShape(e),this.__dirtyPath=!0,this._rect=null):mn.prototype.attrKV.call(this,t,e)},setShape:function(t,e){var i=this.shape;if(i){if(S(t))for(var n in t)t.hasOwnProperty(n)&&(i[n]=t[n]);else i[t]=e;this.dirty(!0)}return this},getLineScale:function(){var t=this.transform;return t&&ny(t[0]-1)>1e-10&&ny(t[3]-1)>1e-10?Math.sqrt(ny(t[0]*t[3]-t[2]*t[1])):1}},Fr.extend=function(t){var e=function(e){Fr.call(this,e),t.style&&this.style.extendFrom(t.style,!1);var i=t.shape;if(i){this.shape=this.shape||{};var n=this.shape;for(var r in i)!n.hasOwnProperty(r)&&i.hasOwnProperty(r)&&(n[r]=i[r])}t.init&&t.init.call(this,e)};u(e,Fr);for(var i in t)"style"!==i&&"shape"!==i&&(e.prototype[i]=t[i]);return e},u(Fr,mn);var ay=qm.CMD,oy=[[],[],[]],sy=Math.sqrt,ly=Math.atan2,hy=function(t,e){var i,n,r,a,o,s,l=t.data,h=ay.M,u=ay.C,c=ay.L,d=ay.R,f=ay.A,p=ay.Q;for(r=0,a=0;ro;o++){var s=oy[o];s[0]=l[r++],s[1]=l[r++],ae(s,s,e),l[a++]=s[0],l[a++]=s[1]}}},uy=Math.sqrt,cy=Math.sin,dy=Math.cos,fy=Math.PI,py=function(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])},gy=function(t,e){return(t[0]*e[0]+t[1]*e[1])/(py(t)*py(e))},vy=function(t,e){return(t[0]*e[1]=11?function(){var e,i=this.__clipPaths,n=this.style;if(i)for(var r=0;ra;a++)r+=ee(t[a-1],t[a]);var o=r/2;o=i>o?i:o;for(var a=0;o>a;a++){var s,l,h,u=a/(o-1)*(e?i:i-1),c=Math.floor(u),d=u-c,f=t[c%i];e?(s=t[(c-1+i)%i],l=t[(c+1)%i],h=t[(c+2)%i]):(s=t[0===c?c:c-1],l=t[c>i-2?i-1:c+1],h=t[c>i-3?i-1:c+2]);var p=d*d,g=d*p;n.push([Yr(s[0],f[0],l[0],h[0],d,p,g),Yr(s[1],f[1],l[1],h[1],d,p,g)])}return n},Ty=function(t,e,i,n){var r,a,o,s,l=[],h=[],u=[],c=[];if(n){o=[1/0,1/0],s=[-1/0,-1/0];for(var d=0,f=t.length;f>d;d++)oe(o,o,t[d]),se(s,s,t[d]);oe(o,o,n[0]),se(s,s,n[1])}for(var d=0,f=t.length;f>d;d++){var p=t[d];if(i)r=t[d?d-1:f-1],a=t[(d+1)%f];else{if(0===d||d===f-1){l.push(H(t[d]));continue}r=t[d-1],a=t[d+1]}j(h,a,r),J(h,h,e);var g=ee(p,r),v=ee(p,a),m=g+v;0!==m&&(g/=m,v/=m),J(u,h,-g),J(c,h,v);var y=X([],p,u),x=X([],p,c);n&&(se(y,y,o),oe(y,y,s),se(x,x,o),oe(x,x,s)),l.push(y),l.push(x)}return i&&l.push(l.shift()),l},Cy=Fr.extend({type:"polygon",shape:{points:null,smooth:!1,smoothConstraint:null},buildPath:function(t,e){jr(t,e,!0)}}),Ay=Fr.extend({type:"polyline",shape:{points:null,smooth:!1,smoothConstraint:null},style:{stroke:"#000",fill:null},buildPath:function(t,e){jr(t,e,!1)}}),Dy=Fr.extend({type:"rect",shape:{r:0,x:0,y:0,width:0,height:0},buildPath:function(t,e){var i=e.x,n=e.y,r=e.width,a=e.height;e.r?Ki(t,e):t.rect(i,n,r,a),t.closePath()}}),ky=Fr.extend({type:"line",shape:{x1:0,y1:0,x2:0,y2:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var i=e.x1,n=e.y1,r=e.x2,a=e.y2,o=e.percent;0!==o&&(t.moveTo(i,n),1>o&&(r=i*(1-o)+r*o,a=n*(1-o)+a*o),t.lineTo(r,a))},pointAt:function(t){var e=this.shape;return[e.x1*(1-t)+e.x2*t,e.y1*(1-t)+e.y2*t]}}),Py=[],Ly=Fr.extend({type:"bezier-curve",shape:{x1:0,y1:0,x2:0,y2:0,cpx1:0,cpy1:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var i=e.x1,n=e.y1,r=e.x2,a=e.y2,o=e.cpx1,s=e.cpy1,l=e.cpx2,h=e.cpy2,u=e.percent;0!==u&&(t.moveTo(i,n),null==l||null==h?(1>u&&(yr(i,o,r,u,Py),o=Py[1],r=Py[2],yr(n,s,a,u,Py),s=Py[1],a=Py[2]),t.quadraticCurveTo(o,s,r,a)):(1>u&&(dr(i,o,l,r,u,Py),o=Py[1],l=Py[2],r=Py[3],dr(n,s,h,a,u,Py),s=Py[1],h=Py[2],a=Py[3]),t.bezierCurveTo(o,s,l,h,r,a)))},pointAt:function(t){return qr(this.shape,t,!1)},tangentAt:function(t){var e=qr(this.shape,t,!0);return te(e,e)}}),Oy=Fr.extend({type:"arc",shape:{cx:0,cy:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},style:{stroke:"#000",fill:null},buildPath:function(t,e){var i=e.cx,n=e.cy,r=Math.max(e.r,0),a=e.startAngle,o=e.endAngle,s=e.clockwise,l=Math.cos(a),h=Math.sin(a);t.moveTo(l*r+i,h*r+n),t.arc(i,n,r,a,o,!s)}}),zy=Fr.extend({type:"compound",shape:{paths:null},_updatePathDirty:function(){for(var t=this.__dirtyPath,e=this.shape.paths,i=0;i"'])/g,ox={"&":"&","<":"<",">":">",'"':""","'":"'"},sx=["a","b","c","d","e","f","g"],lx=function(t,e){return"{"+t+(null==e?"":e)+"}"},hx=Wi,ux=Ei,cx=(Object.freeze||Object)({addCommas:co,toCamelCase:fo,normalizeCssArray:rx,encodeHTML:po,formatTpl:go,formatTplSimple:vo,getTooltipMarker:mo,formatTime:xo,capitalFirst:_o,truncateText:hx,getTextRect:ux}),dx=f,fx=["left","right","top","bottom","width","height"],px=[["width","left","right"],["height","top","bottom"]],gx=wo,vx=(x(wo,"vertical"),x(wo,"horizontal"),{getBoxLayoutParams:function(){return{left:this.get("left"),top:this.get("top"),right:this.get("right"),bottom:this.get("bottom"),width:this.get("width"),height:this.get("height")}}}),mx=jn(),yx=Wa.extend({type:"component",id:"",name:"",mainType:"",subType:"",componentIndex:0,defaultOption:null,ecModel:null,dependentModels:[],uid:null,layoutMode:null,$constructor:function(t,e,i,n){Wa.call(this,t,e,i,n),this.uid=Za("ec_cpt_model")},init:function(t,e,i){this.mergeDefaultAndTheme(t,i)},mergeDefaultAndTheme:function(t,e){var i=this.layoutMode,n=i?Mo(t):{},a=e.getTheme();r(t,a.get(this.mainType)),r(t,this.getDefaultOption()),i&&So(t,n,i)},mergeOption:function(t){r(this.option,t,!0);var e=this.layoutMode;e&&So(this.option,t,e)},optionUpdated:function(){},getDefaultOption:function(){var t=mx(this);if(!t.defaultOption){for(var e=[],i=this.constructor;i;){var n=i.prototype.defaultOption;n&&e.push(n),i=i.superClass}for(var a={},o=e.length-1;o>=0;o--)a=r(a,e[o],!0);t.defaultOption=a}return t.defaultOption},getReferringComponents:function(t){return this.ecModel.queryComponents({mainType:t,index:this.get(t+"Index",!0),id:this.get(t+"Id",!0)})}});ar(yx,{registerWhenExtend:!0}),Xa(yx),Ya(yx,To),c(yx,vx);var xx="";"undefined"!=typeof navigator&&(xx=navigator.platform||"");var _x={color:["#c23531","#2f4554","#61a0a8","#d48265","#91c7ae","#749f83","#ca8622","#bda29a","#6e7074","#546570","#c4ccd3"],gradientColor:["#f6efa6","#d88273","#bf444c"],textStyle:{fontFamily:xx.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},blendMode:null,animation:"auto",animationDuration:1e3,animationDurationUpdate:300,animationEasing:"exponentialOut",animationEasingUpdate:"cubicOut",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3,useUTC:!1},bx=jn(),Sx={clearColorPalette:function(){bx(this).colorIdx=0,bx(this).colorNameMap={}},getColorFromPalette:function(t,e,i){e=e||this;var n=bx(e),r=n.colorIdx||0,a=n.colorNameMap=n.colorNameMap||{};if(a.hasOwnProperty(t))return a[t];var o=Nn(this.get("color",!0)),s=this.get("colorLayer",!0),l=null!=i&&s?Co(s,i):o;if(l=l||o,l&&l.length){var h=l[r];return t&&(a[t]=h),n.colorIdx=(r+1)%l.length,h}}},Mx={cartesian2d:function(t,e,i,n){var r=t.getReferringComponents("xAxis")[0],a=t.getReferringComponents("yAxis")[0];e.coordSysDims=["x","y"],i.set("x",r),i.set("y",a),Do(r)&&(n.set("x",r),e.firstCategoryDimIndex=0),Do(a)&&(n.set("y",a),e.firstCategoryDimIndex=1)},singleAxis:function(t,e,i,n){var r=t.getReferringComponents("singleAxis")[0];e.coordSysDims=["single"],i.set("single",r),Do(r)&&(n.set("single",r),e.firstCategoryDimIndex=0)},polar:function(t,e,i,n){var r=t.getReferringComponents("polar")[0],a=r.findAxisModel("radiusAxis"),o=r.findAxisModel("angleAxis");e.coordSysDims=["radius","angle"],i.set("radius",a),i.set("angle",o),Do(a)&&(n.set("radius",a),e.firstCategoryDimIndex=0),Do(o)&&(n.set("angle",o),e.firstCategoryDimIndex=1)},geo:function(t,e){e.coordSysDims=["lng","lat"]},parallel:function(t,e,i,n){var r=t.ecModel,a=r.getComponent("parallel",t.get("parallelIndex")),o=e.coordSysDims=a.dimensions.slice();f(a.parallelAxisIndex,function(t,a){var s=r.getComponent("parallelAxis",t),l=o[a];i.set(l,s),Do(s)&&null==e.firstCategoryDimIndex&&(n.set(l,s),e.firstCategoryDimIndex=a)})}},Ix="original",Tx="arrayRows",Cx="objectRows",Ax="keyedColumns",Dx="unknown",kx="typedArray",Px="column",Lx="row";ko.seriesDataToSource=function(t){return new ko({data:t,sourceFormat:I(t)?kx:Ix,fromDataset:!1})},ir(ko);var Ox=jn(),zx="\x00_ec_inner",Ex=Wa.extend({init:function(t,e,i,n){i=i||{},this.option=null,this._theme=new Wa(i),this._optionManager=n},setOption:function(t,e){O(!(zx in t),"please use chart.getOption()"),this._optionManager.setOption(t,e),this.resetOption(null)},resetOption:function(t){var e=!1,i=this._optionManager;if(!t||"recreate"===t){var n=i.mountOption("recreate"===t);this.option&&"recreate"!==t?(this.restoreData(),this.mergeOption(n)):Xo.call(this,n),e=!0}if(("timeline"===t||"media"===t)&&this.restoreData(),!t||"recreate"===t||"timeline"===t){var r=i.getTimelineOption(this);r&&(this.mergeOption(r),e=!0)}if(!t||"recreate"===t||"media"===t){var a=i.getMediaOption(this,this._api);a.length&&f(a,function(t){this.mergeOption(t,e=!0)},this)}return e},mergeOption:function(t){function e(e,n){var r=Nn(t[e]),s=Gn(a.get(e),r);Hn(s),f(s,function(t){var i=t.option;S(i)&&(t.keyInfo.mainType=e,t.keyInfo.subType=jo(e,i,t.exist))});var l=Yo(a,n);i[e]=[],a.set(e,[]),f(s,function(t,n){var r=t.exist,s=t.option;if(O(S(s)||r,"Empty component definition"),s){var h=yx.getClass(e,t.keyInfo.subType,!0);if(r&&r instanceof h)r.name=t.keyInfo.name,r.mergeOption(s,this),r.optionUpdated(s,!1);else{var u=o({dependentModels:l,componentIndex:n},t.keyInfo);r=new h(s,this,this,u),o(r,u),r.init(s,this,this,u),r.optionUpdated(null,!0)}}else r.mergeOption({},this),r.optionUpdated({},!1);a.get(e)[n]=r,i[e][n]=r.option},this),"series"===e&&qo(this,a.get("series"))}var i=this.option,a=this._componentsMap,s=[];Oo(this),f(t,function(t,e){null!=t&&(yx.hasClass(e)?e&&s.push(e):i[e]=null==i[e]?n(t):r(i[e],t,!0))}),yx.topologicalTravel(s,yx.getAllClassMainTypes(),e,this),this._seriesIndicesMap=N(this._seriesIndices=this._seriesIndices||[])},getOption:function(){var t=n(this.option);return f(t,function(e,i){if(yx.hasClass(i)){for(var e=Nn(e),n=e.length-1;n>=0;n--)Xn(e[n])&&e.splice(n,1);t[i]=e}}),delete t[zx],t},getTheme:function(){return this._theme},getComponent:function(t,e){var i=this._componentsMap.get(t);return i?i[e||0]:void 0},queryComponents:function(t){var e=t.mainType;if(!e)return[];var i=t.index,n=t.id,r=t.name,a=this._componentsMap.get(e);if(!a||!a.length)return[];var o;if(null!=i)_(i)||(i=[i]),o=v(p(i,function(t){return a[t]}),function(t){return!!t});else if(null!=n){var s=_(n);o=v(a,function(t){return s&&h(n,t.id)>=0||!s&&t.id===n})}else if(null!=r){var l=_(r);o=v(a,function(t){return l&&h(r,t.name)>=0||!l&&t.name===r})}else o=a.slice();return Uo(o,t)},findComponents:function(t){function e(t){var e=r+"Index",i=r+"Id",n=r+"Name";return!t||null==t[e]&&null==t[i]&&null==t[n]?null:{mainType:r,index:t[e],id:t[i],name:t[n]}}function i(e){return t.filter?v(e,t.filter):e}var n=t.query,r=t.mainType,a=e(n),o=a?this.queryComponents(a):this._componentsMap.get(r);return i(Uo(o,t))},eachComponent:function(t,e,i){var n=this._componentsMap;if("function"==typeof t)i=e,e=t,n.each(function(t,n){f(t,function(t,r){e.call(i,n,t,r)})});else if(b(t))f(n.get(t),e,i);else if(S(t)){var r=this.findComponents(t);f(r,e,i)}},getSeriesByName:function(t){var e=this._componentsMap.get("series");return v(e,function(e){return e.name===t})},getSeriesByIndex:function(t){return this._componentsMap.get("series")[t]},getSeriesByType:function(t){var e=this._componentsMap.get("series");return v(e,function(e){return e.subType===t})},getSeries:function(){return this._componentsMap.get("series").slice()},getSeriesCount:function(){return this._componentsMap.get("series").length},eachSeries:function(t,e){f(this._seriesIndices,function(i){var n=this._componentsMap.get("series")[i];t.call(e,n,i)},this)},eachRawSeries:function(t,e){f(this._componentsMap.get("series"),t,e)},eachSeriesByType:function(t,e,i){f(this._seriesIndices,function(n){var r=this._componentsMap.get("series")[n];r.subType===t&&e.call(i,r,n)},this)},eachRawSeriesByType:function(t,e,i){return f(this.getSeriesByType(t),e,i)},isSeriesFiltered:function(t){return null==this._seriesIndicesMap.get(t.componentIndex)},getCurrentSeriesIndices:function(){return(this._seriesIndices||[]).slice()},filterSeries:function(t,e){var i=v(this._componentsMap.get("series"),t,e);qo(this,i)},restoreData:function(t){var e=this._componentsMap;qo(this,e.get("series"));var i=[];e.each(function(t,e){i.push(e)}),yx.topologicalTravel(i,yx.getAllClassMainTypes(),function(i){f(e.get(i),function(e){("series"!==i||!Ho(e,t))&&e.restoreData()})})}});c(Ex,Sx);var Rx=["getDom","getZr","getWidth","getHeight","getDevicePixelRatio","dispatchAction","isDisposed","on","off","getDataURL","getConnectedDataURL","getModel","getOption","getViewOfComponentModel","getViewOfSeriesModel"],Bx={};Ko.prototype={constructor:Ko,create:function(t,e){var i=[];f(Bx,function(n){var r=n.create(t,e);i=i.concat(r||[])}),this._coordinateSystems=i},update:function(t,e){f(this._coordinateSystems,function(i){i.update&&i.update(t,e)})},getCoordinateSystems:function(){return this._coordinateSystems.slice()}},Ko.register=function(t,e){Bx[t]=e},Ko.get=function(t){return Bx[t]};var Nx=f,Fx=n,Vx=p,Wx=r,Gx=/^(min|max)?(.+)$/;Qo.prototype={constructor:Qo,setOption:function(t,e){t&&f(Nn(t.series),function(t){t&&t.data&&I(t.data)&&E(t.data)}),t=Fx(t,!0);var i=this._optionBackup,n=Jo.call(this,t,e,!i);this._newBaseOption=n.baseOption,i?(ns(i.baseOption,n.baseOption),n.timelineOptions.length&&(i.timelineOptions=n.timelineOptions),n.mediaList.length&&(i.mediaList=n.mediaList),n.mediaDefault&&(i.mediaDefault=n.mediaDefault)):this._optionBackup=n},mountOption:function(t){var e=this._optionBackup;return this._timelineOptions=Vx(e.timelineOptions,Fx),this._mediaList=Vx(e.mediaList,Fx),this._mediaDefault=Fx(e.mediaDefault),this._currentMediaIndices=[],Fx(t?e.baseOption:this._newBaseOption)},getTimelineOption:function(t){var e,i=this._timelineOptions;if(i.length){var n=t.getComponent("timeline");n&&(e=Fx(i[n.getCurrentIndex()],!0))}return e},getMediaOption:function(){var t=this._api.getWidth(),e=this._api.getHeight(),i=this._mediaList,n=this._mediaDefault,r=[],a=[];if(!i.length&&!n)return a;for(var o=0,s=i.length;s>o;o++)ts(i[o].query,t,e)&&r.push(o);return!r.length&&n&&(r=[-1]),r.length&&!is(r,this._currentMediaIndices)&&(a=Vx(r,function(t){return Fx(-1===t?n.option:i[t].option)})),this._currentMediaIndices=r,a}};var Hx=f,Zx=S,Xx=["areaStyle","lineStyle","nodeStyle","linkStyle","chordStyle","label","labelLine"],Yx=function(t,e){Hx(us(t.series),function(t){Zx(t)&&hs(t)});var i=["xAxis","yAxis","radiusAxis","angleAxis","singleAxis","parallelAxis","radar"];e&&i.push("valueAxis","categoryAxis","logAxis","timeAxis"),Hx(i,function(e){Hx(us(t[e]),function(t){t&&(ss(t,"axisLabel"),ss(t.axisPointer,"label"))})}),Hx(us(t.parallel),function(t){var e=t&&t.parallelAxisDefault;ss(e,"axisLabel"),ss(e&&e.axisPointer,"label")}),Hx(us(t.calendar),function(t){as(t,"itemStyle"),ss(t,"dayLabel"),ss(t,"monthLabel"),ss(t,"yearLabel")}),Hx(us(t.radar),function(t){ss(t,"name")}),Hx(us(t.geo),function(t){Zx(t)&&(ls(t),Hx(us(t.regions),function(t){ls(t)}))}),Hx(us(t.timeline),function(t){ls(t),as(t,"label"),as(t,"itemStyle"),as(t,"controlStyle",!0);var e=t.data;_(e)&&f(e,function(t){S(t)&&(as(t,"label"),as(t,"itemStyle"))})}),Hx(us(t.toolbox),function(t){as(t,"iconStyle"),Hx(t.feature,function(t){as(t,"iconStyle")})}),ss(cs(t.axisPointer),"label"),ss(cs(t.tooltip).axisPointer,"label")},jx=[["x","left"],["y","top"],["x2","right"],["y2","bottom"]],qx=["grid","geo","parallel","legend","toolbox","title","visualMap","dataZoom","timeline"],Ux=function(t,e){Yx(t,e),t.series=Nn(t.series),f(t.series,function(t){if(S(t)){var e=t.type;if(("pie"===e||"gauge"===e)&&null!=t.clockWise&&(t.clockwise=t.clockWise),"gauge"===e){var i=ds(t,"pointer.color");null!=i&&fs(t,"itemStyle.normal.color",i)}ps(t)}}),t.dataRange&&(t.visualMap=t.dataRange),f(qx,function(e){var i=t[e];i&&(_(i)||(i=[i]),f(i,function(t){ps(t)}))})},$x=function(t){var e=N();t.eachSeries(function(t){var i=t.get("stack");if(i){var n=e.get(i)||e.set(i,[]),r=t.getData(),a={stackResultDimension:r.getCalculationInfo("stackResultDimension"),stackedOverDimension:r.getCalculationInfo("stackedOverDimension"),stackedDimension:r.getCalculationInfo("stackedDimension"),stackedByDimension:r.getCalculationInfo("stackedByDimension"),isStackedByIndex:r.getCalculationInfo("isStackedByIndex"),data:r,seriesModel:t};if(!a.stackedDimension||!a.isStackedByIndex&&!a.stackedByDimension)return;n.length&&r.setCalculationInfo("stackedOnSeries",n[n.length-1].seriesModel),n.push(a)}}),e.each(gs)},Kx=vs.prototype;Kx.pure=!1,Kx.persistent=!0,Kx.getSource=function(){return this._source};var Qx={arrayRows_column:{pure:!0,count:function(){return Math.max(0,this._data.length-this._source.startIndex)},getItem:function(t){return this._data[t+this._source.startIndex]},appendData:xs},arrayRows_row:{pure:!0,count:function(){var t=this._data[0];return t?Math.max(0,t.length-this._source.startIndex):0},getItem:function(t){t+=this._source.startIndex;for(var e=[],i=this._data,n=0;n=1)&&(t=1),t}var i=this._upstream,n=t&&t.skip;if(this._dirty&&i){var r=this.context;r.data=r.outputData=i.context.outputData}this.__pipeline&&(this.__pipeline.currentTask=this);var a;this._plan&&!n&&(a=this._plan(this.context));var o=e(this._modBy),s=this._modDataCount||0,l=e(t&&t.modBy),h=t&&t.modDataCount||0;(o!==l||s!==h)&&(a="reset");var u;(this._dirty||"reset"===a)&&(this._dirty=!1,u=As(this,n)),this._modBy=l,this._modDataCount=h;var c=t&&t.step;if(this._dueEnd=i?i._outputDueEnd:this._count?this._count(this.context):1/0,this._progress){var d=this._dueIndex,f=Math.min(null!=c?this._dueIndex+c:1/0,this._dueEnd);if(!n&&(u||f>d)){var p=this._progress;if(_(p))for(var g=0;gn?n++:null}function e(){var t=n%o*r+Math.ceil(n/o),e=n>=i?null:a>t?t:n;return n++,e}var i,n,r,a,o,s={reset:function(l,h,u,c){n=l,i=h,r=u,a=c,o=Math.ceil(a/r),s.next=r>1&&a>0?e:t}};return s}();n_.dirty=function(){this._dirty=!0,this._onDirty&&this._onDirty(this.context)},n_.unfinished=function(){return this._progress&&this._dueIndex":"",v=p+s.join(p||", ");return{renderMode:n,content:v,style:h}}function a(t){return{renderMode:n,content:po(co(t)),style:h}}var o=this;n=n||"html";var s="html"===n?"
    ":"\n",l="richText"===n,h={},u=0,c=this.getData(),d=c.mapDimension("defaultedTooltip",!0),p=d.length,v=this.getRawValue(t),m=_(v),y=c.getItemVisual(t,"color");S(y)&&y.colorStops&&(y=(y.colorStops[0]||{}).color),y=y||"transparent";var x=p>1||m&&!p?r(v):a(p?Ss(c,t,d[0]):m?v[0]:v),w=x.content,b=o.seriesIndex+"at"+u,M=mo({color:y,type:"item",renderMode:n,markerId:b});h[b]=y,++u;var I=c.getName(t),T=this.name;Zn(this)||(T=""),T=T?po(T)+(e?": ":s):"";var C="string"==typeof M?M:M.content,A=e?C+T+w:T+C+(I?po(I)+": "+w:w);return{html:A,markers:h}},isAnimationEnabled:function(){if(tg.node)return!1;var t=this.getShallow("animation");return t&&this.getData().count()>this.getShallow("animationThreshold")&&(t=!1),t},restoreData:function(){this.dataTask.dirty()},getColorFromPalette:function(t,e,i){var n=this.ecModel,r=Sx.getColorFromPalette.call(this,t,e,i);return r||(r=n.getColorFromPalette(t,e,i)),r},coordDimToDataDim:function(t){return this.getRawData().mapDimension(t,!0)},getProgressive:function(){return this.get("progressive")},getProgressiveThreshold:function(){return this.get("progressiveThreshold")},getAxisTooltipData:null,getTooltipPosition:null,pipeTask:null,preventIncremental:null,pipelineContext:null});c(o_,i_),c(o_,Sx);var s_=function(){this.group=new lv,this.uid=Za("viewComponent")};s_.prototype={constructor:s_,init:function(){},render:function(){},dispose:function(){},filterForExposedEvent:null};var l_=s_.prototype;l_.updateView=l_.updateLayout=l_.updateVisual=function(){},er(s_),ar(s_,{registerWhenExtend:!0});var h_=function(){var t=jn();return function(e){var i=t(e),n=e.pipelineContext,r=i.large,a=i.progressiveRender,o=i.large=n.large,s=i.progressiveRender=n.progressiveRender;return!!(r^o||a^s)&&"reset"}},u_=jn(),c_=h_();Bs.prototype={type:"chart",init:function(){},render:function(){},highlight:function(t,e,i,n){Fs(t.getData(),n,"emphasis")},downplay:function(t,e,i,n){Fs(t.getData(),n,"normal")},remove:function(){this.group.removeAll()},dispose:function(){},incrementalPrepareRender:null,incrementalRender:null,updateTransform:null,filterForExposedEvent:null};var d_=Bs.prototype;d_.updateView=d_.updateLayout=d_.updateVisual=function(t,e,i,n){this.render(t,e,i,n)},er(Bs,["dispose"]),ar(Bs,{registerWhenExtend:!0}),Bs.markUpdateMethod=function(t,e){u_(t).updateMethod=e +};var f_={incrementalPrepareRender:{progress:function(t,e){e.view.incrementalRender(t,e.model,e.ecModel,e.api,e.payload)}},render:{forceFirstProgress:!0,progress:function(t,e){e.view.render(e.model,e.ecModel,e.api,e.payload)}}},p_="\x00__throttleOriginMethod",g_="\x00__throttleRate",v_="\x00__throttleType",m_={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){var i=t.getData(),n=(t.visualColorAccessPath||"itemStyle.color").split("."),r=t.get(n)||t.getColorFromPalette(t.name,null,e.getSeriesCount());if(i.setVisual("color",r),!e.isSeriesFiltered(t)){"function"!=typeof r||r instanceof Ey||i.each(function(e){i.setItemVisual(e,"color",r(t.getDataParams(e)))});var a=function(t,e){var i=t.getItemModel(e),r=i.get(n,!0);null!=r&&t.setItemVisual(e,"color",r)};return{dataEach:i.hasItemOption?a:null}}}},y_={toolbox:{brush:{title:{rect:"矩形选择",polygon:"圈选",lineX:"横向选择",lineY:"纵向选择",keep:"保持选择",clear:"清除选择"}},dataView:{title:"数据视图",lang:["数据视图","关闭","刷新"]},dataZoom:{title:{zoom:"区域缩放",back:"区域缩放还原"}},magicType:{title:{line:"切换为折线图",bar:"切换为柱状图",stack:"切换为堆叠",tiled:"切换为平铺"}},restore:{title:"还原"},saveAsImage:{title:"保存为图片",lang:["右键另存为图片"]}},series:{typeNames:{pie:"饼图",bar:"柱状图",line:"折线图",scatter:"散点图",effectScatter:"涟漪散点图",radar:"雷达图",tree:"树图",treemap:"矩形树图",boxplot:"箱型图",candlestick:"K线图",k:"K线图",heatmap:"热力图",map:"地图",parallel:"平行坐标图",lines:"线图",graph:"关系图",sankey:"桑基图",funnel:"漏斗图",gauge:"仪表盘图",pictorialBar:"象形柱图",themeRiver:"主题河流图",sunburst:"旭日图"}},aria:{general:{withTitle:"这是一个关于“{title}”的图表。",withoutTitle:"这是一个图表,"},series:{single:{prefix:"",withName:"图表类型是{seriesType},表示{seriesName}。",withoutName:"图表类型是{seriesType}。"},multiple:{prefix:"它由{seriesCount}个图表系列组成。",withName:"第{seriesId}个系列是一个表示{seriesName}的{seriesType},",withoutName:"第{seriesId}个系列是一个{seriesType},",separator:{middle:";",end:"。"}}},data:{allData:"其数据是——",partialData:"其中,前{displayCnt}项是——",withName:"{name}的数据是{value}",withoutName:"{value}",separator:{middle:",",end:""}}}},x_=function(t,e){function i(t,e){if("string"!=typeof t)return t;var i=t;return f(e,function(t,e){i=i.replace(new RegExp("\\{\\s*"+e+"\\s*\\}","g"),t)}),i}function n(t){var e=o.get(t);if(null==e){for(var i=t.split("."),n=y_.aria,r=0;rs)){var d=r();l=d?i(n("general.withTitle"),{title:d}):n("general.withoutTitle");var p=[],g=s>1?"series.multiple.prefix":"series.single.prefix";l+=i(n(g),{seriesCount:s}),e.eachSeries(function(t,e){if(c>e){var r,o=t.get("name"),l="series."+(s>1?"multiple":"single")+".";r=n(o?l+"withName":l+"withoutName"),r=i(r,{seriesId:t.seriesIndex,seriesName:t.get("name"),seriesType:a(t.subType)});var u=t.getData();window.data=u,r+=u.count()>h?i(n("data.partialData"),{displayCnt:h}):n("data.allData");for(var d=[],f=0;ff){var g=u.getName(f),v=Ss(u,f);d.push(i(n(g?"data.withName":"data.withoutName"),{name:g,value:v}))}r+=d.join(n("data.separator.middle"))+n("data.separator.end"),p.push(r)}}),l+=p.join(n("series.multiple.separator.middle"))+n("series.multiple.separator.end"),t.setAttribute("aria-label",l)}}},__=Math.PI,w_=function(t,e){e=e||{},s(e,{text:"loading",color:"#c23531",textColor:"#000",maskColor:"rgba(255, 255, 255, 0.8)",zlevel:0});var i=new Dy({style:{fill:e.maskColor},zlevel:e.zlevel,z:1e4}),n=new Oy({shape:{startAngle:-__/2,endAngle:-__/2+.1,r:10},style:{stroke:e.color,lineCap:"round",lineWidth:5},zlevel:e.zlevel,z:10001}),r=new Dy({style:{fill:"none",text:e.text,textPosition:"right",textDistance:10,textFill:e.textColor},zlevel:e.zlevel,z:10001});n.animateShape(!0).when(1e3,{endAngle:3*__/2}).start("circularInOut"),n.animateShape(!0).when(1e3,{startAngle:3*__/2}).delay(300).start("circularInOut");var a=new lv;return a.add(n),a.add(r),a.add(i),a.resize=function(){var e=t.getWidth()/2,a=t.getHeight()/2;n.setShape({cx:e,cy:a});var o=n.shape.r;r.setShape({x:e-o,y:a-o,width:2*o,height:2*o}),i.setShape({x:0,y:0,width:t.getWidth(),height:t.getHeight()})},a.resize(),a},b_=Xs.prototype;b_.restoreData=function(t,e){t.restoreData(e),this._stageTaskMap.each(function(t){var e=t.overallTask;e&&e.dirty()})},b_.getPerformArgs=function(t,e){if(t.__pipeline){var i=this._pipelineMap.get(t.__pipeline.id),n=i.context,r=!e&&i.progressiveEnabled&&(!n||n.progressiveRender)&&t.__idxInPipeline>i.blockIndex,a=r?i.step:null,o=n&&n.modDataCount,s=null!=o?Math.ceil(o/a):null;return{step:a,modBy:s,modDataCount:o}}},b_.getPipeline=function(t){return this._pipelineMap.get(t)},b_.updateStreamModes=function(t,e){var i=this._pipelineMap.get(t.uid),n=t.getData(),r=n.count(),a=i.progressiveEnabled&&e.incrementalPrepareRender&&r>=i.threshold,o=t.get("large")&&r>=t.get("largeThreshold"),s="mod"===t.get("progressiveChunkMode")?r:null;t.pipelineContext=i.context={progressiveRender:a,modDataCount:s,large:o}},b_.restorePipelines=function(t){var e=this,i=e._pipelineMap=N();t.eachSeries(function(t){var n=t.getProgressive(),r=t.uid;i.set(r,{id:r,head:null,tail:null,threshold:t.getProgressiveThreshold(),progressiveEnabled:n&&!(t.preventIncremental&&t.preventIncremental()),blockIndex:-1,step:Math.round(n||700),count:0}),nl(e,t,t.dataTask)})},b_.prepareStageTasks=function(){var t=this._stageTaskMap,e=this.ecInstance.getModel(),i=this.api;f(this._allHandlers,function(n){var r=t.get(n.uid)||t.set(n.uid,[]);n.reset&&js(this,n,r,e,i),n.overallReset&&qs(this,n,r,e,i)},this)},b_.prepareView=function(t,e,i,n){var r=t.renderTask,a=r.context;a.model=e,a.ecModel=i,a.api=n,r.__block=!t.incrementalPrepareRender,nl(this,e,r)},b_.performDataProcessorTasks=function(t,e){Ys(this,this._dataProcessorHandlers,t,e,{block:!0})},b_.performVisualTasks=function(t,e,i){Ys(this,this._visualHandlers,t,e,i)},b_.performSeriesTasks=function(t){var e;t.eachSeries(function(t){e|=t.dataTask.perform()}),this.unfinished|=e},b_.plan=function(){this._pipelineMap.each(function(t){var e=t.tail;do{if(e.__block){t.blockIndex=e.__idxInPipeline;break}e=e.getUpstream()}while(e)})};var S_=b_.updatePayload=function(t,e){"remain"!==e&&(t.context.payload=e)},M_=el(0);Xs.wrapStageHandler=function(t,e){return w(t)&&(t={overallReset:t,seriesType:rl(t)}),t.uid=Za("stageHandler"),e&&(t.visualType=e),t};var I_,T_={},C_={};al(T_,Ex),al(C_,$o),T_.eachSeriesByType=T_.eachRawSeriesByType=function(t){I_=t},T_.eachComponent=function(t){"series"===t.mainType&&t.subType&&(I_=t.subType)};var A_=["#37A2DA","#32C5E9","#67E0E3","#9FE6B8","#FFDB5C","#ff9f7f","#fb7293","#E062AE","#E690D1","#e7bcf3","#9d96f5","#8378EA","#96BFFF"],D_={color:A_,colorLayer:[["#37A2DA","#ffd85c","#fd7b5f"],["#37A2DA","#67E0E3","#FFDB5C","#ff9f7f","#E062AE","#9d96f5"],["#37A2DA","#32C5E9","#9FE6B8","#FFDB5C","#ff9f7f","#fb7293","#e7bcf3","#8378EA","#96BFFF"],A_]},k_="#eee",P_=function(){return{axisLine:{lineStyle:{color:k_}},axisTick:{lineStyle:{color:k_}},axisLabel:{textStyle:{color:k_}},splitLine:{lineStyle:{type:"dashed",color:"#aaa"}},splitArea:{areaStyle:{color:k_}}}},L_=["#dd6b66","#759aa0","#e69d87","#8dc1a9","#ea7e53","#eedd78","#73a373","#73b9bc","#7289ab","#91ca8c","#f49f42"],O_={color:L_,backgroundColor:"#333",tooltip:{axisPointer:{lineStyle:{color:k_},crossStyle:{color:k_}}},legend:{textStyle:{color:k_}},textStyle:{color:k_},title:{textStyle:{color:k_}},toolbox:{iconStyle:{normal:{borderColor:k_}}},dataZoom:{textStyle:{color:k_}},visualMap:{textStyle:{color:k_}},timeline:{lineStyle:{color:k_},itemStyle:{normal:{color:L_[1]}},label:{normal:{textStyle:{color:k_}}},controlStyle:{normal:{color:k_,borderColor:k_}}},timeAxis:P_(),logAxis:P_(),valueAxis:P_(),categoryAxis:P_(),line:{symbol:"circle"},graph:{color:L_},gauge:{title:{textStyle:{color:k_}}},candlestick:{itemStyle:{normal:{color:"#FD1050",color0:"#0CF49B",borderColor:"#FD1050",borderColor0:"#0CF49B"}}}};O_.categoryAxis.splitLine.show=!1,yx.extend({type:"dataset",defaultOption:{seriesLayoutBy:Px,sourceHeader:null,dimensions:null,source:null},optionUpdated:function(){Po(this)}}),s_.extend({type:"dataset"});var z_=Fr.extend({type:"ellipse",shape:{cx:0,cy:0,rx:0,ry:0},buildPath:function(t,e){var i=.5522848,n=e.cx,r=e.cy,a=e.rx,o=e.ry,s=a*i,l=o*i;t.moveTo(n-a,r),t.bezierCurveTo(n-a,r-l,n-s,r-o,n,r-o),t.bezierCurveTo(n+s,r-o,n+a,r-l,n+a,r),t.bezierCurveTo(n+a,r+l,n+s,r+o,n,r+o),t.bezierCurveTo(n-s,r+o,n-a,r+l,n-a,r),t.closePath()}}),E_=/[\s,]+/;sl.prototype.parse=function(t,e){e=e||{};var i=ol(t);if(!i)throw new Error("Illegal svg");var n=new lv;this._root=n;var r=i.getAttribute("viewBox")||"",a=parseFloat(i.getAttribute("width")||e.width),o=parseFloat(i.getAttribute("height")||e.height);isNaN(a)&&(a=null),isNaN(o)&&(o=null),cl(i,n,null,!0);for(var s=i.firstChild;s;)this._parseNode(s,n),s=s.nextSibling;var l,h;if(r){var u=z(r).split(E_);u.length>=4&&(l={x:parseFloat(u[0]||0),y:parseFloat(u[1]||0),width:parseFloat(u[2]),height:parseFloat(u[3])})}if(l&&null!=a&&null!=o&&(h=gl(l,a,o),!e.ignoreViewBox)){var c=n;n=new lv,n.add(c),c.scale=h.scale.slice(),c.position=h.position.slice()}return e.ignoreRootClip||null==a||null==o||n.setClipPath(new Dy({shape:{x:0,y:0,width:a,height:o}})),{root:n,width:a,height:o,viewBoxRect:l,viewBoxTransform:h}},sl.prototype._parseNode=function(t,e){var i=t.nodeName.toLowerCase();"defs"===i?this._isDefine=!0:"text"===i&&(this._isText=!0);var n;if(this._isDefine){var r=B_[i];if(r){var a=r.call(this,t),o=t.getAttribute("id");o&&(this._defs[o]=a)}}else{var r=R_[i];r&&(n=r.call(this,t,e),e.add(n))}for(var s=t.firstChild;s;)1===s.nodeType&&this._parseNode(s,n),3===s.nodeType&&this._isText&&this._parseText(s,n),s=s.nextSibling;"defs"===i?this._isDefine=!1:"text"===i&&(this._isText=!1)},sl.prototype._parseText=function(t,e){if(1===t.nodeType){var i=t.getAttribute("dx")||0,n=t.getAttribute("dy")||0;this._textX+=parseFloat(i),this._textY+=parseFloat(n)}var r=new xy({style:{text:t.textContent,transformText:!0},position:[this._textX||0,this._textY||0]});hl(e,r),cl(t,r,this._defs);var a=r.style.fontSize;a&&9>a&&(r.style.fontSize=9,r.scale=r.scale||[1,1],r.scale[0]*=a/9,r.scale[1]*=a/9);var o=r.getBoundingRect();return this._textX+=o.width,e.add(r),r};var R_={g:function(t,e){var i=new lv;return hl(e,i),cl(t,i,this._defs),i},rect:function(t,e){var i=new Dy;return hl(e,i),cl(t,i,this._defs),i.setShape({x:parseFloat(t.getAttribute("x")||0),y:parseFloat(t.getAttribute("y")||0),width:parseFloat(t.getAttribute("width")||0),height:parseFloat(t.getAttribute("height")||0)}),i},circle:function(t,e){var i=new _y;return hl(e,i),cl(t,i,this._defs),i.setShape({cx:parseFloat(t.getAttribute("cx")||0),cy:parseFloat(t.getAttribute("cy")||0),r:parseFloat(t.getAttribute("r")||0)}),i},line:function(t,e){var i=new ky;return hl(e,i),cl(t,i,this._defs),i.setShape({x1:parseFloat(t.getAttribute("x1")||0),y1:parseFloat(t.getAttribute("y1")||0),x2:parseFloat(t.getAttribute("x2")||0),y2:parseFloat(t.getAttribute("y2")||0)}),i},ellipse:function(t,e){var i=new z_;return hl(e,i),cl(t,i,this._defs),i.setShape({cx:parseFloat(t.getAttribute("cx")||0),cy:parseFloat(t.getAttribute("cy")||0),rx:parseFloat(t.getAttribute("rx")||0),ry:parseFloat(t.getAttribute("ry")||0)}),i},polygon:function(t,e){var i=t.getAttribute("points");i&&(i=ul(i));var n=new Cy({shape:{points:i||[]}});return hl(e,n),cl(t,n,this._defs),n},polyline:function(t,e){var i=new Fr;hl(e,i),cl(t,i,this._defs);var n=t.getAttribute("points");n&&(n=ul(n));var r=new Ay({shape:{points:n||[]}});return r},image:function(t,e){var i=new yn;return hl(e,i),cl(t,i,this._defs),i.setStyle({image:t.getAttribute("xlink:href"),x:t.getAttribute("x"),y:t.getAttribute("y"),width:t.getAttribute("width"),height:t.getAttribute("height")}),i},text:function(t,e){var i=t.getAttribute("x")||0,n=t.getAttribute("y")||0,r=t.getAttribute("dx")||0,a=t.getAttribute("dy")||0;this._textX=parseFloat(i)+parseFloat(r),this._textY=parseFloat(n)+parseFloat(a);var o=new lv;return hl(e,o),cl(t,o,this._defs),o},tspan:function(t,e){var i=t.getAttribute("x"),n=t.getAttribute("y");null!=i&&(this._textX=parseFloat(i)),null!=n&&(this._textY=parseFloat(n));var r=t.getAttribute("dx")||0,a=t.getAttribute("dy")||0,o=new lv;return hl(e,o),cl(t,o,this._defs),this._textX+=r,this._textY+=a,o},path:function(t,e){var i=t.getAttribute("d")||"",n=Hr(i);return hl(e,n),cl(t,n,this._defs),n}},B_={lineargradient:function(t){var e=parseInt(t.getAttribute("x1")||0,10),i=parseInt(t.getAttribute("y1")||0,10),n=parseInt(t.getAttribute("x2")||10,10),r=parseInt(t.getAttribute("y2")||0,10),a=new Ry(e,i,n,r);return ll(t,a),a},radialgradient:function(){}},N_={fill:"fill",stroke:"stroke","stroke-width":"lineWidth",opacity:"opacity","fill-opacity":"fillOpacity","stroke-opacity":"strokeOpacity","stroke-dasharray":"lineDash","stroke-dashoffset":"lineDashOffset","stroke-linecap":"lineCap","stroke-linejoin":"lineJoin","stroke-miterlimit":"miterLimit","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight","text-align":"textAlign","alignment-baseline":"textBaseline"},F_=/url\(\s*#(.*?)\)/,V_=/(translate|scale|rotate|skewX|skewY|matrix)\(([\-\s0-9\.e,]*)\)/g,W_=/([^\s:;]+)\s*:\s*([^:;]+)/g,G_=N(),H_={registerMap:function(t,e,i){var n;return _(e)?n=e:e.svg?n=[{type:"svg",source:e.svg,specialAreas:e.specialAreas}]:(e.geoJson&&!e.features&&(i=e.specialAreas,e=e.geoJson),n=[{type:"geoJSON",source:e,specialAreas:i}]),f(n,function(t){var e=t.type;"geoJson"===e&&(e=t.type="geoJSON");var i=Z_[e];i(t)}),G_.set(t,n)},retrieveMap:function(t){return G_.get(t)}},Z_={geoJSON:function(t){var e=t.source;t.geoJSON=b(e)?"undefined"!=typeof JSON&&JSON.parse?JSON.parse(e):new Function("return ("+e+");")():e},svg:function(t){t.svgXML=ol(t.source)}},X_=O,Y_=f,j_=w,q_=S,U_=yx.parseClassType,$_="4.2.0",K_={zrender:"4.0.5"},Q_=1,J_=1e3,tw=5e3,ew=1e3,iw=2e3,nw=3e3,rw=4e3,aw=5e3,ow={PROCESSOR:{FILTER:J_,STATISTIC:tw},VISUAL:{LAYOUT:ew,GLOBAL:iw,CHART:nw,COMPONENT:rw,BRUSH:aw}},sw="__flagInMainProcess",lw="__optionUpdated",hw=/^[a-zA-Z0-9_]+$/;ml.prototype.on=vl("on"),ml.prototype.off=vl("off"),ml.prototype.one=vl("one"),c(ml,bg);var uw=yl.prototype;uw._onframe=function(){if(!this._disposed){var t=this._scheduler;if(this[lw]){var e=this[lw].silent;this[sw]=!0,_l(this),cw.update.call(this),this[sw]=!1,this[lw]=!1,Ml.call(this,e),Il.call(this,e)}else if(t.unfinished){var i=Q_,n=this._model,r=this._api;t.unfinished=!1;do{var a=+new Date;t.performSeriesTasks(n),t.performDataProcessorTasks(n),bl(this,n),t.performVisualTasks(n),Pl(this,this._model,r,"remain"),i-=+new Date-a}while(i>0&&t.unfinished);t.unfinished||this._zr.flush()}}},uw.getDom=function(){return this._dom},uw.getZr=function(){return this._zr},uw.setOption=function(t,e,i){var n;if(q_(e)&&(i=e.lazyUpdate,n=e.silent,e=e.notMerge),this[sw]=!0,!this._model||e){var r=new Qo(this._api),a=this._theme,o=this._model=new Ex(null,null,a,r);o.scheduler=this._scheduler,o.init(null,null,a,r)}this._model.setOption(t,vw),i?(this[lw]={silent:n},this[sw]=!1):(_l(this),cw.update.call(this),this._zr.flush(),this[lw]=!1,this[sw]=!1,Ml.call(this,n),Il.call(this,n))},uw.setTheme=function(){console.error("ECharts#setTheme() is DEPRECATED in ECharts 3.0")},uw.getModel=function(){return this._model},uw.getOption=function(){return this._model&&this._model.getOption()},uw.getWidth=function(){return this._zr.getWidth()},uw.getHeight=function(){return this._zr.getHeight()},uw.getDevicePixelRatio=function(){return this._zr.painter.dpr||window.devicePixelRatio||1},uw.getRenderedCanvas=function(t){if(tg.canvasSupported){t=t||{},t.pixelRatio=t.pixelRatio||1,t.backgroundColor=t.backgroundColor||this._model.get("backgroundColor");var e=this._zr;return e.painter.getRenderedCanvas(t)}},uw.getSvgDataUrl=function(){if(tg.svgSupported){var t=this._zr,e=t.storage.getDisplayList();return f(e,function(t){t.stopAnimation(!0)}),t.painter.pathToDataUrl()}},uw.getDataURL=function(t){t=t||{};var e=t.excludeComponents,i=this._model,n=[],r=this;Y_(e,function(t){i.eachComponent({mainType:t},function(t){var e=r._componentsMap[t.__viewId];e.group.ignore||(n.push(e),e.group.ignore=!0)})});var a="svg"===this._zr.painter.getType()?this.getSvgDataUrl():this.getRenderedCanvas(t).toDataURL("image/"+(t&&t.type||"png"));return Y_(n,function(t){t.group.ignore=!1}),a},uw.getConnectedDataURL=function(t){if(tg.canvasSupported){var e=this.group,i=Math.min,r=Math.max,a=1/0;if(bw[e]){var o=a,s=a,l=-a,h=-a,u=[],c=t&&t.pixelRatio||1;f(ww,function(a){if(a.group===e){var c=a.getRenderedCanvas(n(t)),d=a.getDom().getBoundingClientRect();o=i(d.left,o),s=i(d.top,s),l=r(d.right,l),h=r(d.bottom,h),u.push({dom:c,left:d.left,top:d.top})}}),o*=c,s*=c,l*=c,h*=c;var d=l-o,p=h-s,g=cg();g.width=d,g.height=p;var v=On(g);return Y_(u,function(t){var e=new yn({style:{x:t.left*c-o,y:t.top*c-s,image:t.dom}});v.add(e)}),v.refreshImmediately(),g.toDataURL("image/"+(t&&t.type||"png"))}return this.getDataURL(t)}},uw.convertToPixel=x(xl,"convertToPixel"),uw.convertFromPixel=x(xl,"convertFromPixel"),uw.containPixel=function(t,e){var i,n=this._model;return t=qn(n,t),f(t,function(t,n){n.indexOf("Models")>=0&&f(t,function(t){var r=t.coordinateSystem;if(r&&r.containPoint)i|=!!r.containPoint(e);else if("seriesModels"===n){var a=this._chartsMap[t.__viewId];a&&a.containPoint&&(i|=a.containPoint(e,t))}},this)},this),!!i},uw.getVisual=function(t,e){var i=this._model;t=qn(i,t,{defaultMainType:"series"});var n=t.seriesModel,r=n.getData(),a=t.hasOwnProperty("dataIndexInside")?t.dataIndexInside:t.hasOwnProperty("dataIndex")?r.indexOfRawIndex(t.dataIndex):null;return null!=a?r.getItemVisual(a,e):r.getVisual(e)},uw.getViewOfComponentModel=function(t){return this._componentsMap[t.__viewId]},uw.getViewOfSeriesModel=function(t){return this._chartsMap[t.__viewId]};var cw={prepareAndUpdate:function(t){_l(this),cw.update.call(this,t)},update:function(t){var e=this._model,i=this._api,n=this._zr,r=this._coordSysMgr,a=this._scheduler;if(e){a.restoreData(e,t),a.performSeriesTasks(e),r.create(e,i),a.performDataProcessorTasks(e,t),bl(this,e),r.update(e,i),Al(e),a.performVisualTasks(e,t),Dl(this,e,i,t);var o=e.get("backgroundColor")||"transparent";if(tg.canvasSupported)n.setBackgroundColor(o);else{var s=He(o);o=Qe(s,"rgb"),0===s[3]&&(o="transparent")}Ll(e,i)}},updateTransform:function(t){var e=this._model,i=this,n=this._api;if(e){var r=[];e.eachComponent(function(a,o){var s=i.getViewOfComponentModel(o);if(s&&s.__alive)if(s.updateTransform){var l=s.updateTransform(o,e,n,t);l&&l.update&&r.push(s)}else r.push(s)});var a=N();e.eachSeries(function(r){var o=i._chartsMap[r.__viewId];if(o.updateTransform){var s=o.updateTransform(r,e,n,t);s&&s.update&&a.set(r.uid,1)}else a.set(r.uid,1)}),Al(e),this._scheduler.performVisualTasks(e,t,{setDirty:!0,dirtyMap:a}),Pl(i,e,n,t,a),Ll(e,this._api)}},updateView:function(t){var e=this._model;e&&(Bs.markUpdateMethod(t,"updateView"),Al(e),this._scheduler.performVisualTasks(e,t,{setDirty:!0}),Dl(this,this._model,this._api,t),Ll(e,this._api))},updateVisual:function(t){cw.update.call(this,t)},updateLayout:function(t){cw.update.call(this,t)}};uw.resize=function(t){this._zr.resize(t);var e=this._model;if(this._loadingFX&&this._loadingFX.resize(),e){var i=e.resetOption("media"),n=t&&t.silent;this[sw]=!0,i&&_l(this),cw.update.call(this),this[sw]=!1,Ml.call(this,n),Il.call(this,n)}},uw.showLoading=function(t,e){if(q_(t)&&(e=t,t=""),t=t||"default",this.hideLoading(),_w[t]){var i=_w[t](this._api,e),n=this._zr;this._loadingFX=i,n.add(i)}},uw.hideLoading=function(){this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null},uw.makeActionFromEvent=function(t){var e=o({},t);return e.type=pw[t.type],e},uw.dispatchAction=function(t,e){if(q_(e)||(e={silent:!!e}),fw[t.type]&&this._model){if(this[sw])return void this._pendingActions.push(t);Sl.call(this,t,e.silent),e.flush?this._zr.flush(!0):e.flush!==!1&&tg.browser.weChat&&this._throttledZrFlush(),Ml.call(this,e.silent),Il.call(this,e.silent)}},uw.appendData=function(t){var e=t.seriesIndex,i=this.getModel(),n=i.getSeriesByIndex(e);n.appendData(t),this._scheduler.unfinished=!0},uw.on=vl("on"),uw.off=vl("off"),uw.one=vl("one");var dw=["click","dblclick","mouseover","mouseout","mousemove","mousedown","mouseup","globalout","contextmenu"];uw._initEvents=function(){Y_(dw,function(t){this._zr.on(t,function(e){var i,n=this.getModel(),r=e.target,a="globalout"===t;if(a)i={};else if(r&&null!=r.dataIndex){var s=r.dataModel||n.getSeriesByIndex(r.seriesIndex);i=s&&s.getDataParams(r.dataIndex,r.dataType,r)||{}}else r&&r.eventData&&(i=o({},r.eventData));if(i){var l=i.componentType,h=i.componentIndex;("markLine"===l||"markPoint"===l||"markArea"===l)&&(l="series",h=i.seriesIndex);var u=l&&null!=h&&n.getComponent(l,h),c=u&&this["series"===u.mainType?"_chartsMap":"_componentsMap"][u.__viewId];i.event=e,i.type=t,this._ecEventProcessor.eventInfo={targetEl:r,packedEvent:i,model:u,view:c},this.trigger(t,i)}},this)},this),Y_(pw,function(t,e){this._messageCenter.on(e,function(t){this.trigger(e,t)},this)},this)},uw.isDisposed=function(){return this._disposed},uw.clear=function(){this.setOption({series:[]},!0)},uw.dispose=function(){if(!this._disposed){this._disposed=!0,$n(this.getDom(),Iw,"");var t=this._api,e=this._model;Y_(this._componentsViews,function(i){i.dispose(e,t)}),Y_(this._chartsViews,function(i){i.dispose(e,t)}),this._zr.dispose(),delete ww[this.id]}},c(yl,bg),Bl.prototype={constructor:Bl,normalizeQuery:function(t){var e={},i={},n={};if(b(t)){var r=U_(t);e.mainType=r.main||null,e.subType=r.sub||null}else{var a=["Index","Name","Id"],o={name:1,dataIndex:1,dataType:1};f(t,function(t,r){for(var s=!1,l=0;l0&&u===r.length-h.length){var c=r.slice(0,u);"data"!==c&&(e.mainType=c,e[h.toLowerCase()]=t,s=!0)}}o.hasOwnProperty(r)&&(i[r]=t,s=!0),s||(n[r]=t)})}return{cptQuery:e,dataQuery:i,otherQuery:n}},filter:function(t,e){function i(t,e,i,n){return null==t[i]||e[n||i]===t[i]}var n=this.eventInfo;if(!n)return!0;var r=n.targetEl,a=n.packedEvent,o=n.model,s=n.view;if(!o||!s)return!0;var l=e.cptQuery,h=e.dataQuery;return i(l,o,"mainType")&&i(l,o,"subType")&&i(l,o,"index","componentIndex")&&i(l,o,"name")&&i(l,o,"id")&&i(h,a,"name")&&i(h,a,"dataIndex")&&i(h,a,"dataType")&&(!s.filterForExposedEvent||s.filterForExposedEvent(t,e.otherQuery,r,a))},afterTrigger:function(){this.eventInfo=null}};var fw={},pw={},gw=[],vw=[],mw=[],yw=[],xw={},_w={},ww={},bw={},Sw=new Date-0,Mw=new Date-0,Iw="_echarts_instance_",Tw=Wl;Jl(iw,m_),Yl(Ux),jl(tw,$x),eh("default",w_),Ul({type:"highlight",event:"highlight",update:"highlight"},V),Ul({type:"downplay",event:"downplay",update:"downplay"},V),Xl("light",D_),Xl("dark",O_);var Cw={};uh.prototype={constructor:uh,add:function(t){return this._add=t,this},update:function(t){return this._update=t,this},remove:function(t){return this._remove=t,this},execute:function(){var t,e=this._old,i=this._new,n={},r={},a=[],o=[];for(ch(e,n,a,"_oldKeyGetter",this),ch(i,r,o,"_newKeyGetter",this),t=0;tu;u++)this._add&&this._add(l[u]);else this._add&&this._add(l)}}}};var Aw=N(["tooltip","label","itemName","itemId","seriesName"]),Dw=S,kw="undefined",Pw="e\x00\x00",Lw={"float":typeof Float64Array===kw?Array:Float64Array,"int":typeof Int32Array===kw?Array:Int32Array,ordinal:Array,number:Array,time:Array},Ow=typeof Uint32Array===kw?Array:Uint32Array,zw=typeof Uint16Array===kw?Array:Uint16Array,Ew=["hasItemOption","_nameList","_idList","_invertedIndicesMap","_rawData","_chunkSize","_chunkCount","_dimValueGetter","_count","_rawCount","_nameDimIdx","_idDimIdx"],Rw=["_extent","_approximateExtent","_rawExtent"],Bw=function(t,e){t=t||["x","y"];for(var i={},n=[],r={},a=0;a=e)){for(var i,n=this._chunkSize,r=this._rawData,a=this._storage,o=this.dimensions,s=o.length,l=this._dimensionInfos,h=this._nameList,u=this._idList,c=this._rawExtent,d=this._nameRepeatCount={},f=this._chunkCount,p=f-1,g=0;s>g;g++){var v=o[g];c[v]||(c[v]=Th());var m=l[v];0===m.otherDims.itemName&&(i=this._nameDimIdx=g),0===m.otherDims.itemId&&(this._idDimIdx=g);var y=Lw[m.type];a[v]||(a[v]=[]);var x=a[v][p];if(x&&x.lengthb;b+=n)a[v].push(new y(Math.min(e-b,n)));this._chunkCount=a[v].length}for(var S=new Array(s),M=t;e>M;M++){S=r.getItem(M,S);for(var I=Math.floor(M/n),T=M%n,b=0;s>b;b++){var v=o[b],C=a[v][I],A=this._dimValueGetter(S,v,M,b);C[T]=A;var D=c[v];AD[1]&&(D[1]=A)}if(!r.pure){var k=h[M];if(S&&null==k)if(null!=S.name)h[M]=k=S.name;else if(null!=i){var P=o[i],L=a[P][I];if(L){k=L[T];var O=l[P].ordinalMeta;O&&O.categories.length&&(k=O.categories[k])}}var z=null==S?null:S.id;null==z&&null!=k&&(d[k]=d[k]||0,z=k,d[k]>0&&(z+="__ec__"+d[k]),d[k]++),null!=z&&(u[M]=z)}}!r.persistent&&r.clean&&r.clean(),this._rawCount=this._count=e,this._extent={},yh(this)}},Nw.count=function(){return this._count},Nw.getIndices=function(){var t,e=this._indices;if(e){var i=e.constructor,n=this._count;if(i===Array){t=new i(n);for(var r=0;n>r;r++)t[r]=e[r]}else t=new i(e.buffer,0,n)}else for(var i=gh(this),t=new i(this.count()),r=0;r=0&&e=0&&en;n++)i.push(this.get(t[n],e));return i},Nw.hasValue=function(t){for(var e=this._dimensionsSummary.dataDimsOnCoord,i=this._dimensionInfos,n=0,r=e.length;r>n;n++)if("ordinal"!==i[e[n]].type&&isNaN(this.get(e[n],t)))return!1;return!0},Nw.getDataExtent=function(t){t=this.getDimension(t);var e=this._storage[t],i=Th();if(!e)return i;var n,r=this.count(),a=!this._indices;if(a)return this._rawExtent[t].slice();if(n=this._extent[t])return n.slice();n=i;for(var o=n[0],s=n[1],l=0;r>l;l++){var h=this._getFast(t,this.getRawIndex(l));o>h&&(o=h),h>s&&(s=h)}return n=[o,s],this._extent[t]=n,n},Nw.getApproximateExtent=function(t){return t=this.getDimension(t),this._approximateExtent[t]||this.getDataExtent(t)},Nw.setApproximateExtent=function(t,e){e=this.getDimension(e),this._approximateExtent[e]=t.slice()},Nw.getCalculationInfo=function(t){return this._calculationInfo[t]},Nw.setCalculationInfo=function(t,e){Dw(t)?o(this._calculationInfo,t):this._calculationInfo[t]=e},Nw.getSum=function(t){var e=this._storage[t],i=0;if(e)for(var n=0,r=this.count();r>n;n++){var a=this.get(t,n);isNaN(a)||(i+=a)}return i},Nw.getMedian=function(t){var e=[];this.each(t,function(t){isNaN(t)||e.push(t)});var i=[].concat(e).sort(function(t,e){return t-e}),n=this.count();return 0===n?0:n%2===1?i[(n-1)/2]:(i[n/2]+i[n/2-1])/2},Nw.rawIndexOf=function(t,e){var i=t&&this._invertedIndicesMap[t],n=i[e];return null==n||isNaN(n)?-1:n},Nw.indexOfName=function(t){for(var e=0,i=this.count();i>e;e++)if(this.getName(e)===t)return e;return-1},Nw.indexOfRawIndex=function(t){if(!this._indices)return t;if(t>=this._rawCount||0>t)return-1;var e=this._indices,i=e[t];if(null!=i&&i=n;){var a=(n+r)/2|0;if(e[a]t))return a;r=a-1}}return-1},Nw.indicesOfNearest=function(t,e,i){var n=this._storage,r=n[t],a=[];if(!r)return a;null==i&&(i=1/0);for(var o=Number.MAX_VALUE,s=-1,l=0,h=this.count();h>l;l++){var u=e-this.get(t,l),c=Math.abs(u);i>=u&&o>=c&&((o>c||u>=0&&0>s)&&(o=c,s=u,a.length=0),a.push(l))}return a},Nw.getRawIndex=_h,Nw.getRawDataItem=function(t){if(this._rawData.persistent)return this._rawData.getItem(this.getRawIndex(t));for(var e=[],i=0;io;o++)s[o]=this.get(t[o],a);s[o]=a,e.apply(i,s)}}},Nw.filterSelf=function(t,e,i,n){if(this._count){"function"==typeof t&&(n=i,i=e,e=t,t=[]),i=i||n||this,t=p(Sh(t),this.getDimension,this);for(var r=this.count(),a=gh(this),o=new a(r),s=[],l=t.length,h=0,u=t[0],c=0;r>c;c++){var d,f=this.getRawIndex(c);if(0===l)d=e.call(i,c);else if(1===l){var g=this._getFast(u,f);d=e.call(i,g,c)}else{for(var v=0;l>v;v++)s[v]=this._getFast(u,f);s[v]=c,d=e.apply(i,s)}d&&(o[h++]=f)}return r>h&&(this._indices=o),this._count=h,this._extent={},this.getRawIndex=this._indices?wh:_h,this}},Nw.selectRange=function(t){if(this._count){var e=[];for(var i in t)t.hasOwnProperty(i)&&e.push(i);var n=e.length;if(n){var r=this.count(),a=gh(this),o=new a(r),s=0,l=e[0],h=t[l][0],u=t[l][1],c=!1;if(!this._indices){var d=0;if(1===n){for(var f=this._storage[e[0]],p=0;pm;m++){var y=g[m];(y>=h&&u>=y||isNaN(y))&&(o[s++]=d),d++}c=!0}else if(2===n){for(var f=this._storage[l],x=this._storage[e[1]],_=t[e[1]][0],w=t[e[1]][1],p=0;pm;m++){var y=g[m],S=b[m]; + (y>=h&&u>=y||isNaN(y))&&(S>=_&&w>=S||isNaN(S))&&(o[s++]=d),d++}c=!0}}if(!c)if(1===n)for(var m=0;r>m;m++){var M=this.getRawIndex(m),y=this._getFast(l,M);(y>=h&&u>=y||isNaN(y))&&(o[s++]=M)}else for(var m=0;r>m;m++){for(var I=!0,M=this.getRawIndex(m),p=0;n>p;p++){var T=e[p],y=this._getFast(i,M);(yt[T][1])&&(I=!1)}I&&(o[s++]=this.getRawIndex(m))}return r>s&&(this._indices=o),this._count=s,this._extent={},this.getRawIndex=this._indices?wh:_h,this}}},Nw.mapArray=function(t,e,i,n){"function"==typeof t&&(n=i,i=e,e=t,t=[]),i=i||n||this;var r=[];return this.each(t,function(){r.push(e&&e.apply(this,arguments))},i),r},Nw.map=function(t,e,i,n){i=i||n||this,t=p(Sh(t),this.getDimension,this);var r=Mh(this,t);r._indices=this._indices,r.getRawIndex=r._indices?wh:_h;for(var a=r._storage,o=[],s=this._chunkSize,l=t.length,h=this.count(),u=[],c=r._rawExtent,d=0;h>d;d++){for(var f=0;l>f;f++)u[f]=this.get(t[f],d);u[l]=d;var g=e&&e.apply(i,u);if(null!=g){"object"!=typeof g&&(o[0]=g,g=o);for(var v=this.getRawIndex(d),m=Math.floor(v/s),y=v%s,x=0;xb[1]&&(b[1]=w)}}}return r},Nw.downSample=function(t,e,i,n){for(var r=Mh(this,[t]),a=r._storage,o=[],s=Math.floor(1/e),l=a[t],h=this.count(),u=this._chunkSize,c=r._rawExtent[t],d=new(gh(this))(h),f=0,p=0;h>p;p+=s){s>h-p&&(s=h-p,o.length=s);for(var g=0;s>g;g++){var v=this.getRawIndex(p+g),m=Math.floor(v/u),y=v%u;o[g]=l[m][y]}var x=i(o),_=this.getRawIndex(Math.min(p+n(o,x)||0,h-1)),w=Math.floor(_/u),b=_%u;l[w][b]=x,xc[1]&&(c[1]=x),d[f++]=_}return r._count=f,r._indices=d,r.getRawIndex=wh,r},Nw.getItemModel=function(t){var e=this.hostModel;return new Wa(this.getRawDataItem(t),e,e&&e.ecModel)},Nw.diff=function(t){var e=this;return new uh(t?t.getIndices():[],this.getIndices(),function(e){return bh(t,e)},function(t){return bh(e,t)})},Nw.getVisual=function(t){var e=this._visual;return e&&e[t]},Nw.setVisual=function(t,e){if(Dw(t))for(var i in t)t.hasOwnProperty(i)&&this.setVisual(i,t[i]);else this._visual=this._visual||{},this._visual[t]=e},Nw.setLayout=function(t,e){if(Dw(t))for(var i in t)t.hasOwnProperty(i)&&this.setLayout(i,t[i]);else this._layout[t]=e},Nw.getLayout=function(t){return this._layout[t]},Nw.getItemLayout=function(t){return this._itemLayouts[t]},Nw.setItemLayout=function(t,e,i){this._itemLayouts[t]=i?o(this._itemLayouts[t]||{},e):e},Nw.clearItemLayouts=function(){this._itemLayouts.length=0},Nw.getItemVisual=function(t,e,i){var n=this._itemVisuals[t],r=n&&n[e];return null!=r||i?r:this.getVisual(e)},Nw.setItemVisual=function(t,e,i){var n=this._itemVisuals[t]||{},r=this.hasItemVisual;if(this._itemVisuals[t]=n,Dw(e))for(var a in e)e.hasOwnProperty(a)&&(n[a]=e[a],r[a]=!0);else n[e]=i,r[e]=!0},Nw.clearAllVisual=function(){this._visual={},this._itemVisuals=[],this.hasItemVisual={}};var Fw=function(t){t.seriesIndex=this.seriesIndex,t.dataIndex=this.dataIndex,t.dataType=this.dataType};Nw.setItemGraphicEl=function(t,e){var i=this.hostModel;e&&(e.dataIndex=t,e.dataType=this.dataType,e.seriesIndex=i&&i.seriesIndex,"group"===e.type&&e.traverse(Fw,e)),this._graphicEls[t]=e},Nw.getItemGraphicEl=function(t){return this._graphicEls[t]},Nw.eachItemGraphicEl=function(t,e){f(this._graphicEls,function(i,n){i&&t&&t.call(e,i,n)})},Nw.cloneShallow=function(t){if(!t){var e=p(this.dimensions,this.getDimensionInfo,this);t=new Bw(e,this.hostModel)}if(t._storage=this._storage,mh(t,this),this._indices){var i=this._indices.constructor;t._indices=new i(this._indices)}else t._indices=null;return t.getRawIndex=t._indices?wh:_h,t},Nw.wrapMethod=function(t,e){var i=this[t];"function"==typeof i&&(this.__wrappedMethods=this.__wrappedMethods||[],this.__wrappedMethods.push(t),this[t]=function(){var t=i.apply(this,arguments);return e.apply(this,[t].concat(P(arguments)))})},Nw.TRANSFERABLE_METHODS=["cloneShallow","downSample","map"],Nw.CHANGABLE_METHODS=["filterSelf","selectRange"];var Vw=function(t,e){return e=e||{},Ch(e.coordDimensions||[],t,{dimsDef:e.dimensionsDefine||t.dimensionsDefine,encodeDef:e.encodeDefine||t.encodeDefine,dimCount:e.dimensionsCount,generateCoord:e.generateCoord,generateCoordCount:e.generateCoordCount})};Rh.prototype.parse=function(t){return t},Rh.prototype.getSetting=function(t){return this._setting[t]},Rh.prototype.contain=function(t){var e=this._extent;return t>=e[0]&&t<=e[1]},Rh.prototype.normalize=function(t){var e=this._extent;return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])},Rh.prototype.scale=function(t){var e=this._extent;return t*(e[1]-e[0])+e[0]},Rh.prototype.unionExtent=function(t){var e=this._extent;t[0]e[1]&&(e[1]=t[1])},Rh.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},Rh.prototype.getExtent=function(){return this._extent.slice()},Rh.prototype.setExtent=function(t,e){var i=this._extent;isNaN(t)||(i[0]=t),isNaN(e)||(i[1]=e)},Rh.prototype.isBlank=function(){return this._isBlank},Rh.prototype.setBlank=function(t){this._isBlank=t},Rh.prototype.getLabel=null,er(Rh),ar(Rh,{registerWhenExtend:!0}),Bh.createByAxisModel=function(t){var e=t.option,i=e.data,n=i&&p(i,Fh);return new Bh({categories:n,needCollect:!n,deduplication:e.dedplication!==!1})};var Ww=Bh.prototype;Ww.getOrdinal=function(t){return Nh(this).get(t)},Ww.parseAndCollect=function(t){var e,i=this._needCollect;if("string"!=typeof t&&!i)return t;if(i&&!this._deduplication)return e=this.categories.length,this.categories[e]=t,e;var n=Nh(this);return e=n.get(t),null==e&&(i?(e=this.categories.length,this.categories[e]=t,n.set(t,e)):e=0/0),e};var Gw=Rh.prototype,Hw=Rh.extend({type:"ordinal",init:function(t,e){(!t||_(t))&&(t=new Bh({categories:t})),this._ordinalMeta=t,this._extent=e||[0,t.categories.length-1]},parse:function(t){return"string"==typeof t?this._ordinalMeta.getOrdinal(t):Math.round(t)},contain:function(t){return t=this.parse(t),Gw.contain.call(this,t)&&null!=this._ordinalMeta.categories[t]},normalize:function(t){return Gw.normalize.call(this,this.parse(t))},scale:function(t){return Math.round(Gw.scale.call(this,t))},getTicks:function(){for(var t=[],e=this._extent,i=e[0];i<=e[1];)t.push(i),i++;return t},getLabel:function(t){return this.isBlank()?void 0:this._ordinalMeta.categories[t]},count:function(){return this._extent[1]-this._extent[0]+1},unionExtentFromData:function(t,e){this.unionExtent(t.getApproximateExtent(e))},getOrdinalMeta:function(){return this._ordinalMeta},niceTicks:V,niceExtent:V});Hw.create=function(){return new Hw};var Zw=$a,Xw=$a,Yw=Rh.extend({type:"interval",_interval:0,_intervalPrecision:2,setExtent:function(t,e){var i=this._extent;isNaN(t)||(i[0]=parseFloat(t)),isNaN(e)||(i[1]=parseFloat(e))},unionExtent:function(t){var e=this._extent;t[0]e[1]&&(e[1]=t[1]),Yw.prototype.setExtent.call(this,e[0],e[1])},getInterval:function(){return this._interval},setInterval:function(t){this._interval=t,this._niceExtent=this._extent.slice(),this._intervalPrecision=Wh(t)},getTicks:function(){return Zh(this._interval,this._extent,this._niceExtent,this._intervalPrecision)},getLabel:function(t,e){if(null==t)return"";var i=e&&e.precision;return null==i?i=Ja(t)||0:"auto"===i&&(i=this._intervalPrecision),t=Xw(t,i,!0),co(t)},niceTicks:function(t,e,i){t=t||5;var n=this._extent,r=n[1]-n[0];if(isFinite(r)){0>r&&(r=-r,n.reverse());var a=Vh(n,t,e,i);this._intervalPrecision=a.intervalPrecision,this._interval=a.interval,this._niceExtent=a.niceTickExtent}},niceExtent:function(t){var e=this._extent;if(e[0]===e[1])if(0!==e[0]){var i=e[0];t.fixMax?e[0]-=i/2:(e[1]+=i/2,e[0]-=i/2)}else e[1]=1;var n=e[1]-e[0];isFinite(n)||(e[0]=0,e[1]=1),this.niceTicks(t.splitNumber,t.minInterval,t.maxInterval);var r=this._interval;t.fixMin||(e[0]=Xw(Math.floor(e[0]/r)*r)),t.fixMax||(e[1]=Xw(Math.ceil(e[1]/r)*r))}});Yw.create=function(){return new Yw};var jw="__ec_stack_",qw=.5,Uw="undefined"!=typeof Float32Array?Float32Array:Array,$w={seriesType:"bar",plan:h_(),reset:function(t){function e(t,e){for(var i,c=new Uw(2*t.count),d=[],f=[],p=0;null!=(i=t.next());)f[h]=e.get(o,i),f[1-h]=e.get(s,i),d=n.dataToPoint(f,null,d),c[p++]=d[0],c[p++]=d[1];e.setLayout({largePoints:c,barWidth:u,valueAxisStart:eu(r,a,!1),valueAxisHorizontal:l})}if(Jh(t)&&tu(t)){var i=t.getData(),n=t.coordinateSystem,r=n.getBaseAxis(),a=n.getOtherAxis(r),o=i.mapDimension(a.dim),s=i.mapDimension(r.dim),l=a.isHorizontal(),h=l?0:1,u=Kh(Uh([t]),r,t).width;return u>qw||(u=qw),{progress:e}}}},Kw=Yw.prototype,Qw=Math.ceil,Jw=Math.floor,tb=1e3,eb=60*tb,ib=60*eb,nb=24*ib,rb=function(t,e,i,n){for(;n>i;){var r=i+n>>>1;t[r][1]a&&(a=e),null!=i&&a>i&&(a=i);var o=ob.length,s=rb(ob,a,0,o),l=ob[Math.min(s,o-1)],h=l[1];if("year"===l[0]){var u=r/h,c=so(u/t,!0);h*=c}var d=this.getSetting("useUTC")?0:60*new Date(+n[0]||+n[1]).getTimezoneOffset()*1e3,f=[Math.round(Qw((n[0]-d)/h)*h+d),Math.round(Jw((n[1]-d)/h)*h+d)];Hh(f,n),this._stepLvl=l,this._interval=h,this._niceExtent=f},parse:function(t){return+ro(t)}});f(["contain","normalize"],function(t){ab.prototype[t]=function(e){return Kw[t].call(this,this.parse(e))}});var ob=[["hh:mm:ss",tb],["hh:mm:ss",5*tb],["hh:mm:ss",10*tb],["hh:mm:ss",15*tb],["hh:mm:ss",30*tb],["hh:mm\nMM-dd",eb],["hh:mm\nMM-dd",5*eb],["hh:mm\nMM-dd",10*eb],["hh:mm\nMM-dd",15*eb],["hh:mm\nMM-dd",30*eb],["hh:mm\nMM-dd",ib],["hh:mm\nMM-dd",2*ib],["hh:mm\nMM-dd",6*ib],["hh:mm\nMM-dd",12*ib],["MM-dd\nyyyy",nb],["MM-dd\nyyyy",2*nb],["MM-dd\nyyyy",3*nb],["MM-dd\nyyyy",4*nb],["MM-dd\nyyyy",5*nb],["MM-dd\nyyyy",6*nb],["week",7*nb],["MM-dd\nyyyy",10*nb],["week",14*nb],["week",21*nb],["month",31*nb],["week",42*nb],["month",62*nb],["week",70*nb],["quarter",95*nb],["month",31*nb*4],["month",31*nb*5],["half-year",380*nb/2],["month",31*nb*8],["month",31*nb*10],["year",380*nb]];ab.create=function(t){return new ab({useUTC:t.ecModel.get("useUTC")})};var sb=Rh.prototype,lb=Yw.prototype,hb=Ja,ub=$a,cb=Math.floor,db=Math.ceil,fb=Math.pow,pb=Math.log,gb=Rh.extend({type:"log",base:10,$constructor:function(){Rh.apply(this,arguments),this._originalScale=new Yw},getTicks:function(){var t=this._originalScale,e=this._extent,i=t.getExtent();return p(lb.getTicks.call(this),function(n){var r=$a(fb(this.base,n));return r=n===e[0]&&t.__fixMin?iu(r,i[0]):r,r=n===e[1]&&t.__fixMax?iu(r,i[1]):r},this)},getLabel:lb.getLabel,scale:function(t){return t=sb.scale.call(this,t),fb(this.base,t)},setExtent:function(t,e){var i=this.base;t=pb(t)/pb(i),e=pb(e)/pb(i),lb.setExtent.call(this,t,e)},getExtent:function(){var t=this.base,e=sb.getExtent.call(this);e[0]=fb(t,e[0]),e[1]=fb(t,e[1]);var i=this._originalScale,n=i.getExtent();return i.__fixMin&&(e[0]=iu(e[0],n[0])),i.__fixMax&&(e[1]=iu(e[1],n[1])),e},unionExtent:function(t){this._originalScale.unionExtent(t);var e=this.base;t[0]=pb(t[0])/pb(e),t[1]=pb(t[1])/pb(e),sb.unionExtent.call(this,t)},unionExtentFromData:function(t,e){this.unionExtent(t.getApproximateExtent(e))},niceTicks:function(t){t=t||10;var e=this._extent,i=e[1]-e[0];if(!(1/0===i||0>=i)){var n=ao(i),r=t/i*n;for(.5>=r&&(n*=10);!isNaN(n)&&Math.abs(n)<1&&Math.abs(n)>0;)n*=10;var a=[$a(db(e[0]/n)*n),$a(cb(e[1]/n)*n)];this._interval=n,this._niceExtent=a}},niceExtent:function(t){lb.niceExtent.call(this,t);var e=this._originalScale;e.__fixMin=t.fixMin,e.__fixMax=t.fixMax}});f(["contain","normalize"],function(t){gb.prototype[t]=function(e){return e=pb(e)/pb(this.base),sb[t].call(this,e)}}),gb.create=function(){return new gb};var vb={getMin:function(t){var e=this.option,i=t||null==e.rangeStart?e.min:e.rangeStart;return this.axis&&null!=i&&"dataMin"!==i&&"function"!=typeof i&&!C(i)&&(i=this.axis.scale.parse(i)),i},getMax:function(t){var e=this.option,i=t||null==e.rangeEnd?e.max:e.rangeEnd;return this.axis&&null!=i&&"dataMax"!==i&&"function"!=typeof i&&!C(i)&&(i=this.axis.scale.parse(i)),i},getNeedCrossZero:function(){var t=this.option;return null!=t.rangeStart||null!=t.rangeEnd?!1:!t.scale},getCoordSysModel:V,setRange:function(t,e){this.option.rangeStart=t,this.option.rangeEnd=e},resetRange:function(){this.option.rangeStart=this.option.rangeEnd=null}},mb=$r({type:"triangle",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var i=e.cx,n=e.cy,r=e.width/2,a=e.height/2;t.moveTo(i,n-a),t.lineTo(i+r,n+a),t.lineTo(i-r,n+a),t.closePath()}}),yb=$r({type:"diamond",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var i=e.cx,n=e.cy,r=e.width/2,a=e.height/2;t.moveTo(i,n-a),t.lineTo(i+r,n),t.lineTo(i,n+a),t.lineTo(i-r,n),t.closePath()}}),xb=$r({type:"pin",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var i=e.x,n=e.y,r=e.width/5*3,a=Math.max(r,e.height),o=r/2,s=o*o/(a-o),l=n-a+o+s,h=Math.asin(s/o),u=Math.cos(h)*o,c=Math.sin(h),d=Math.cos(h),f=.6*o,p=.7*o;t.moveTo(i-u,l+s),t.arc(i,l,o,Math.PI-h,2*Math.PI+h),t.bezierCurveTo(i+u-c*f,l+s+d*f,i,n-p,i,n),t.bezierCurveTo(i,n-p,i-u+c*f,l+s+d*f,i-u,l+s),t.closePath()}}),_b=$r({type:"arrow",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var i=e.height,n=e.width,r=e.x,a=e.y,o=n/3*2;t.moveTo(r,a),t.lineTo(r+o,a+i),t.lineTo(r,a+i/4*3),t.lineTo(r-o,a+i),t.lineTo(r,a),t.closePath()}}),wb={line:ky,rect:Dy,roundRect:Dy,square:Dy,circle:_y,diamond:yb,pin:xb,arrow:_b,triangle:mb},bb={line:function(t,e,i,n,r){r.x1=t,r.y1=e+n/2,r.x2=t+i,r.y2=e+n/2},rect:function(t,e,i,n,r){r.x=t,r.y=e,r.width=i,r.height=n},roundRect:function(t,e,i,n,r){r.x=t,r.y=e,r.width=i,r.height=n,r.r=Math.min(i,n)/4},square:function(t,e,i,n,r){var a=Math.min(i,n);r.x=t,r.y=e,r.width=a,r.height=a},circle:function(t,e,i,n,r){r.cx=t+i/2,r.cy=e+n/2,r.r=Math.min(i,n)/2},diamond:function(t,e,i,n,r){r.cx=t+i/2,r.cy=e+n/2,r.width=i,r.height=n},pin:function(t,e,i,n,r){r.x=t+i/2,r.y=e+n/2,r.width=i,r.height=n},arrow:function(t,e,i,n,r){r.x=t+i/2,r.y=e+n/2,r.width=i,r.height=n},triangle:function(t,e,i,n,r){r.cx=t+i/2,r.cy=e+n/2,r.width=i,r.height=n}},Sb={};f(wb,function(t,e){Sb[e]=new t});var Mb=$r({type:"symbol",shape:{symbolType:"",x:0,y:0,width:0,height:0},beforeBrush:function(){var t=this.style,e=this.shape;"pin"===e.symbolType&&"inside"===t.textPosition&&(t.textPosition=["50%","40%"],t.textAlign="center",t.textVerticalAlign="middle")},buildPath:function(t,e,i){var n=e.symbolType,r=Sb[n];"none"!==e.symbolType&&(r||(n="rect",r=Sb[n]),bb[n](e.x,e.y,e.width,e.height,r.shape),r.buildPath(t,r.shape,i))}}),Ib={isDimensionStacked:Ph,enableDataStack:kh,getStackedDimension:Lh},Tb=(Object.freeze||Object)({createList:pu,getLayoutRect:bo,dataStack:Ib,createScale:gu,mixinAxisModelCommonMethods:vu,completeDimensions:Ch,createDimensions:Vw,createSymbol:fu}),Cb=1e-8;xu.prototype={constructor:xu,properties:null,getBoundingRect:function(){var t=this._rect;if(t)return t;for(var e=Number.MAX_VALUE,i=[e,e],n=[-e,-e],r=[],a=[],o=this.geometries,s=0;sn;n++)if("polygon"===i[n].type){var a=i[n].exterior,o=i[n].interiors;if(yu(a,t[0],t[1])){for(var s=0;s<(o?o.length:0);s++)if(yu(o[s]))continue t;return!0}}return!1},transformTo:function(t,e,i,n){var r=this.getBoundingRect(),a=r.width/r.height;i?n||(n=i/a):i=a*n;for(var o=new gi(t,e,i,n),s=r.calculateTransform(o),l=this.geometries,h=0;h0}),function(t){var e=t.properties,i=t.geometry,n=i.coordinates,r=[];"Polygon"===i.type&&r.push({type:"polygon",exterior:n[0],interiors:n.slice(1)}),"MultiPolygon"===i.type&&f(n,function(t){t[0]&&r.push({type:"polygon",exterior:t[0],interiors:t.slice(1)})});var a=new xu(e.name,r,e.cp);return a.properties=e,a})},Db=jn(),kb=[0,1],Pb=function(t,e,i){this.dim=t,this.scale=e,this._extent=i||[0,0],this.inverse=!1,this.onBand=!1};Pb.prototype={constructor:Pb,contain:function(t){var e=this._extent,i=Math.min(e[0],e[1]),n=Math.max(e[0],e[1]);return t>=i&&n>=t},containData:function(t){return this.contain(this.dataToCoord(t))},getExtent:function(){return this._extent.slice()},getPixelPrecision:function(t){return to(t||this.scale.getExtent(),this._extent)},setExtent:function(t,e){var i=this._extent;i[0]=t,i[1]=e},dataToCoord:function(t,e){var i=this._extent,n=this.scale;return t=n.normalize(t),this.onBand&&"ordinal"===n.type&&(i=i.slice(),Bu(i,n.count())),qa(t,kb,i,e)},coordToData:function(t,e){var i=this._extent,n=this.scale;this.onBand&&"ordinal"===n.type&&(i=i.slice(),Bu(i,n.count()));var r=qa(t,i,kb,e);return this.scale.scale(r)},pointToData:function(){},getTicksCoords:function(t){t=t||{};var e=t.tickModel||this.getTickModel(),i=Su(this,e),n=i.ticks,r=p(n,function(t){return{coord:this.dataToCoord(t),tickValue:t}},this),a=e.get("alignWithLabel");return Nu(this,r,i.tickCategoryInterval,a,t.clamp),r},getViewLabels:function(){return bu(this).labels},getLabelModel:function(){return this.model.getModel("axisLabel")},getTickModel:function(){return this.model.getModel("axisTick")},getBandWidth:function(){var t=this._extent,e=this.scale.getExtent(),i=e[1]-e[0]+(this.onBand?1:0);0===i&&(i=1);var n=Math.abs(t[1]-t[0]);return Math.abs(n)/i},isHorizontal:null,getRotate:null,calculateCategoryInterval:function(){return Lu(this)}};var Lb=Ab,Ob={};f(["map","each","filter","indexOf","inherits","reduce","filter","bind","curry","isArray","isString","isObject","isFunction","extend","defaults","clone","merge"],function(t){Ob[t]=pg[t]});var zb={};f(["extendShape","extendPath","makePath","makeImage","mergePath","resizePath","createIcon","setHoverStyle","setLabelStyle","setTextStyle","setText","getFont","updateProps","initProps","getTransform","clipPointsByRect","clipRectByRect","Group","Image","Text","Circle","Sector","Ring","Polygon","Polyline","Rect","Line","BezierCurve","Arc","IncrementalDisplayable","CompoundPath","LinearGradient","RadialGradient","BoundingRect"],function(t){zb[t]=Yy[t]});var Eb=function(t){this._axes={},this._dimList=[],this.name=t||""};Eb.prototype={constructor:Eb,type:"cartesian",getAxis:function(t){return this._axes[t]},getAxes:function(){return p(this._dimList,Fu,this)},getAxesByScale:function(t){return t=t.toLowerCase(),v(this.getAxes(),function(e){return e.scale.type===t})},addAxis:function(t){var e=t.dim;this._axes[e]=t,this._dimList.push(e)},dataToCoord:function(t){return this._dataCoordConvert(t,"dataToCoord")},coordToData:function(t){return this._dataCoordConvert(t,"coordToData")},_dataCoordConvert:function(t,e){for(var i=this._dimList,n=t instanceof Array?[]:{},r=0;re[1]&&e.reverse(),e},getOtherAxis:function(){this.grid.getOtherAxis()},pointToData:function(t,e){return this.coordToData(this.toLocalCoord(t["x"===this.dim?0:1]),e)},toLocalCoord:null,toGlobalCoord:null},u(Rb,Pb);var Bb={show:!0,zlevel:0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,onZeroAxisIndex:null,lineStyle:{color:"#333",width:1,type:"solid"},symbol:["none","none"],symbolSize:[10,15]},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,fontSize:12},splitLine:{show:!0,lineStyle:{color:["#ccc"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.3)","rgba(200,200,200,0.3)"]}}},Nb={};Nb.categoryAxis=r({boundaryGap:!0,deduplication:null,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},Bb),Nb.valueAxis=r({boundaryGap:[0,0],splitNumber:5},Bb),Nb.timeAxis=s({scale:!0,min:"dataMin",max:"dataMax"},Nb.valueAxis),Nb.logAxis=s({scale:!0,logBase:10},Nb.valueAxis);var Fb=["value","category","time","log"],Vb=function(t,e,i,n){f(Fb,function(o){e.extend({type:t+"Axis."+o,mergeDefaultAndTheme:function(e,n){var a=this.layoutMode,s=a?Mo(e):{},l=n.getTheme();r(e,l.get(o+"Axis")),r(e,this.getDefaultOption()),e.type=i(t,e),a&&So(e,s,a)},optionUpdated:function(){var t=this.option;"category"===t.type&&(this.__ordinalMeta=Bh.createByAxisModel(this))},getCategories:function(t){var e=this.option;return"category"===e.type?t?e.data:this.__ordinalMeta.categories:void 0},getOrdinalMeta:function(){return this.__ordinalMeta},defaultOption:a([{},Nb[o+"Axis"],n],!0)})}),yx.registerSubTypeDefaulter(t+"Axis",x(i,t))},Wb=yx.extend({type:"cartesian2dAxis",axis:null,init:function(){Wb.superApply(this,"init",arguments),this.resetRange()},mergeOption:function(){Wb.superApply(this,"mergeOption",arguments),this.resetRange()},restoreData:function(){Wb.superApply(this,"restoreData",arguments),this.resetRange()},getCoordSysModel:function(){return this.ecModel.queryComponents({mainType:"grid",index:this.option.gridIndex,id:this.option.gridId})[0]}});r(Wb.prototype,vb);var Gb={offset:0};Vb("x",Wb,Wu,Gb),Vb("y",Wb,Wu,Gb),yx.extend({type:"grid",dependencies:["xAxis","yAxis"],layoutMode:"box",coordinateSystem:null,defaultOption:{show:!1,zlevel:0,z:0,left:"10%",top:60,right:"10%",bottom:60,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"}});var Hb=Hu.prototype;Hb.type="grid",Hb.axisPointerEnabled=!0,Hb.getRect=function(){return this._rect},Hb.update=function(t,e){var i=this._axesMap;this._updateScale(t,this.model),f(i.x,function(t){au(t.scale,t.model)}),f(i.y,function(t){au(t.scale,t.model)});var n={};f(i.x,function(t){Zu(i,"y",t,n)}),f(i.y,function(t){Zu(i,"x",t,n)}),this.resize(this.model,e)},Hb.resize=function(t,e,i){function n(){f(a,function(t){var e=t.isHorizontal(),i=e?[0,r.width]:[0,r.height],n=t.inverse?1:0;t.setExtent(i[n],i[1-n]),Yu(t,e?r.x:r.y)})}var r=bo(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()});this._rect=r;var a=this._axesList;n(),!i&&t.get("containLabel")&&(f(a,function(t){if(!t.model.get("axisLabel.inside")){var e=uu(t);if(e){var i=t.isHorizontal()?"height":"width",n=t.model.get("axisLabel.margin");r[i]-=e[i]+n,"top"===t.position?r.y+=e.height+n:"left"===t.position&&(r.x+=e.width+n)}}}),n())},Hb.getAxis=function(t,e){var i=this._axesMap[t];if(null!=i){if(null==e)for(var n in i)if(i.hasOwnProperty(n))return i[n];return i[e]}},Hb.getAxes=function(){return this._axesList.slice()},Hb.getCartesian=function(t,e){if(null!=t&&null!=e){var i="x"+t+"y"+e;return this._coordsMap[i]}S(t)&&(e=t.yAxisIndex,t=t.xAxisIndex);for(var n=0,r=this._coordsList;nt&&(t=e),t}});var Yb=dm([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["stroke","barBorderColor"],["lineWidth","barBorderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]),jb={getBarItemStyle:function(t){var e=Yb(this,t);if(this.getBorderLineDash){var i=this.getBorderLineDash();i&&(e.lineDash=i)}return e}},qb=["itemStyle","barBorderWidth"];o(Wa.prototype,jb),ah({type:"bar",render:function(t,e,i){this._updateDrawMode(t);var n=t.get("coordinateSystem");return("cartesian2d"===n||"polar"===n)&&(this._isLargeDraw?this._renderLarge(t,e,i):this._renderNormal(t,e,i)),this.group},incrementalPrepareRender:function(t){this._clear(),this._updateDrawMode(t)},incrementalRender:function(t,e){this._incrementalRenderLarge(t,e)},_updateDrawMode:function(t){var e=t.pipelineContext.large;(null==this._isLargeDraw||e^this._isLargeDraw)&&(this._isLargeDraw=e,this._clear())},_renderNormal:function(t){var e,i=this.group,n=t.getData(),r=this._data,a=t.coordinateSystem,o=a.getBaseAxis();"cartesian2d"===a.type?e=o.isHorizontal():"polar"===a.type&&(e="angle"===o.dim);var s=t.isAnimationEnabled()?t:null;n.diff(r).add(function(r){if(n.hasValue(r)){var o=n.getItemModel(r),l=$b[a.type](n,r,o),h=Ub[a.type](n,r,o,l,e,s);n.setItemGraphicEl(r,h),i.add(h),tc(h,n,r,o,l,t,e,"polar"===a.type)}}).update(function(o,l){var h=r.getItemGraphicEl(l);if(!n.hasValue(o))return void i.remove(h);var u=n.getItemModel(o),c=$b[a.type](n,o,u);h?La(h,{shape:c},s,o):h=Ub[a.type](n,o,u,c,e,s,!0),n.setItemGraphicEl(o,h),i.add(h),tc(h,n,o,u,c,t,e,"polar"===a.type)}).remove(function(t){var e=r.getItemGraphicEl(t);"cartesian2d"===a.type?e&&Qu(t,s,e):e&&Ju(t,s,e)}).execute(),this._data=n},_renderLarge:function(t){this._clear(),ic(t,this.group)},_incrementalRenderLarge:function(t,e){ic(e,this.group,!0)},dispose:V,remove:function(t){this._clear(t)},_clear:function(t){var e=this.group,i=this._data;t&&t.get("animation")&&i&&!this._isLargeDraw?i.eachItemGraphicEl(function(e){"sector"===e.type?Ju(e.dataIndex,t,e):Qu(e.dataIndex,t,e)}):e.removeAll(),this._data=null}});var Ub={cartesian2d:function(t,e,i,n,r,a,s){var l=new Dy({shape:o({},n)});if(a){var h=l.shape,u=r?"height":"width",c={};h[u]=0,c[u]=n[u],Yy[s?"updateProps":"initProps"](l,{shape:c},a,e)}return l},polar:function(t,e,i,n,r,a,o){var l=n.startAngle0?1:-1,o=n.height>0?1:-1;return{x:n.x+a*r/2,y:n.y+o*r/2,width:n.width-a*r,height:n.height-o*r}},polar:function(t,e){var i=t.getItemLayout(e);return{cx:i.cx,cy:i.cy,r0:i.r0,r:i.r,startAngle:i.startAngle,endAngle:i.endAngle}}},Kb=Fr.extend({type:"largeBar",shape:{points:[]},buildPath:function(t,e){for(var i=e.points,n=this.__startPoint,r=this.__valueIdx,a=0;ah[1]?-1:1,c=["start"===r?h[0]-u*l:"end"===r?h[1]+u*l:(h[0]+h[1])/2,uc(r)?t.labelOffset+a*l:0],d=e.get("nameRotate");null!=d&&(d=d*Qb/180);var f;uc(r)?n=eS(t.rotation,null!=d?d:t.rotation,a):(n=ac(t,r,d||0,h),f=t.axisNameAvailableWidth,null!=f&&(f=Math.abs(f/Math.sin(n.rotation)),!isFinite(f)&&(f=null)));var p=s.getFont(),g=e.get("nameTruncate",!0)||{},v=g.ellipsis,m=A(t.nameTruncateMaxWidth,g.maxWidth,f),y=null!=v&&null!=m?hx(i,m,p,v,{minChar:2,placeholder:g.placeholder}):i,x=e.get("tooltip",!0),_=e.mainType,w={componentType:_,name:i,$vars:["name"]};w[_+"Index"]=e.componentIndex;var b=new xy({anid:"name",__fullText:i,__truncatedText:y,position:c,rotation:n.rotation,silent:oc(e),z2:1,tooltip:x&&x.show?o({content:i,formatter:function(){return i},formatterParams:w},x):null});ba(b.style,s,{text:y,textFont:p,textFill:s.getTextColor()||e.get("axisLine.lineStyle.color"),textAlign:n.textAlign,textVerticalAlign:n.textVerticalAlign}),e.get("triggerEvent")&&(b.eventData=rc(e),b.eventData.targetType="axisName",b.eventData.name=i),this._dumbGroup.add(b),b.updateTransform(),this.group.add(b),b.decomposeTransform()}}},eS=Jb.innerTextLayout=function(t,e,i){var n,r,a=io(e-t);return no(a)?(r=i>0?"top":"bottom",n="center"):no(a-Qb)?(r=i>0?"bottom":"top",n="center"):(r="middle",n=a>0&&Qb>a?i>0?"right":"left":i>0?"left":"right"),{rotation:a,textAlign:n,textVerticalAlign:r}},iS=f,nS=x,rS=nh({type:"axis",_axisPointer:null,axisPointerClass:null,render:function(t,e,i,n){this.axisPointerClass&&xc(t),rS.superApply(this,"render",arguments),Mc(this,t,e,i,n,!0)},updateAxisPointer:function(t,e,i,n){Mc(this,t,e,i,n,!1)},remove:function(t,e){var i=this._axisPointer;i&&i.remove(e),rS.superApply(this,"remove",arguments)},dispose:function(t,e){Ic(this,e),rS.superApply(this,"dispose",arguments)}}),aS=[];rS.registerAxisPointerClass=function(t,e){aS[t]=e},rS.getAxisPointerClass=function(t){return t&&aS[t]};var oS=["axisLine","axisTickLabel","axisName"],sS=["splitArea","splitLine"],lS=rS.extend({type:"cartesianAxis",axisPointerClass:"CartesianAxisPointer",render:function(t,e,i,n){this.group.removeAll();var r=this._axisGroup;if(this._axisGroup=new lv,this.group.add(this._axisGroup),t.get("show")){var a=t.getCoordSysModel(),o=Tc(a,t),s=new Jb(t,o);f(oS,s.add,s),this._axisGroup.add(s.getGroup()),f(sS,function(e){t.get(e+".show")&&this["_"+e](t,a)},this),Ba(r,this._axisGroup,t),lS.superCall(this,"render",t,e,i,n)}},remove:function(){this._splitAreaColors=null},_splitLine:function(t,e){var i=t.axis;if(!i.scale.isBlank()){var n=t.getModel("splitLine"),r=n.getModel("lineStyle"),a=r.get("color");a=_(a)?a:[a];for(var o=e.coordinateSystem.getRect(),l=i.isHorizontal(),h=0,u=i.getTicksCoords({tickModel:n}),c=[],d=[],f=r.getLineStyle(),p=0;p0&&Gc(i[r-1]);r--);for(;r>n&&Gc(i[n]);n++);}for(;r>n;)n+=Hc(t,i,n,r,r,1,a.min,a.max,e.smooth,e.smoothMonotone,e.connectNulls)+1}}),IS=Fr.extend({type:"ec-polygon",shape:{points:[],stackedOnPoints:[],smooth:0,stackedOnSmooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},brush:by(Fr.prototype.brush),buildPath:function(t,e){var i=e.points,n=e.stackedOnPoints,r=0,a=i.length,o=e.smoothMonotone,s=Yc(i,e.smoothConstraint),l=Yc(n,e.smoothConstraint);if(e.connectNulls){for(;a>0&&Gc(i[a-1]);a--);for(;a>r&&Gc(i[r]);r++);}for(;a>r;){var h=Hc(t,i,r,a,a,1,s.min,s.max,e.smooth,o,e.connectNulls);Hc(t,n,r+h-1,h,a,-1,l.min,l.max,e.stackedOnSmooth,o,e.connectNulls),r+=h+1,t.closePath()}}});Bs.extend({type:"line",init:function(){var t=new lv,e=new zc;this.group.add(e.group),this._symbolDraw=e,this._lineGroup=t},render:function(t,e,i){var n=t.coordinateSystem,r=this.group,a=t.getData(),o=t.getModel("lineStyle"),l=t.getModel("areaStyle"),h=a.mapArray(a.getItemLayout),u="polar"===n.type,c=this._coordSys,d=this._symbolDraw,f=this._polyline,p=this._polygon,g=this._lineGroup,v=t.get("animation"),m=!l.isEmpty(),y=l.get("origin"),x=Nc(n,a,y),_=$c(n,a,x),w=t.get("showSymbol"),b=w&&!u&&id(t,a,n),S=this._data;S&&S.eachItemGraphicEl(function(t,e){t.__temp&&(r.remove(t),S.setItemGraphicEl(e,null))}),w||d.remove(),r.add(g);var M=!u&&t.get("step");f&&c.type===n.type&&M===this._step?(m&&!p?p=this._newPolygon(h,_,n,v):p&&!m&&(g.remove(p),p=this._polygon=null),g.setClipPath(Jc(n,!1,!1,t)),w&&d.updateData(a,{isIgnore:b,clipShape:Jc(n,!1,!0,t)}),a.eachItemGraphicEl(function(t){t.stopAnimation(!0)}),jc(this._stackedOnPoints,_)&&jc(this._points,h)||(v?this._updateAnimation(a,_,n,i,M,y):(M&&(h=td(h,n,M),_=td(_,n,M)),f.setShape({points:h}),p&&p.setShape({points:h,stackedOnPoints:_})))):(w&&d.updateData(a,{isIgnore:b,clipShape:Jc(n,!1,!0,t)}),M&&(h=td(h,n,M),_=td(_,n,M)),f=this._newPolyline(h,n,v),m&&(p=this._newPolygon(h,_,n,v)),g.setClipPath(Jc(n,!0,!1,t)));var I=ed(a,n)||a.getVisual("color");f.useStyle(s(o.getLineStyle(),{fill:"none",stroke:I,lineJoin:"bevel"}));var T=t.get("smooth");if(T=qc(t.get("smooth")),f.setShape({smooth:T,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")}),p){var C=a.getCalculationInfo("stackedOnSeries"),A=0;p.useStyle(s(l.getAreaStyle(),{fill:I,opacity:.7,lineJoin:"bevel"})),C&&(A=qc(C.get("smooth"))),p.setShape({smooth:T,stackedOnSmooth:A,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")})}this._data=a,this._coordSys=n,this._stackedOnPoints=_,this._points=h,this._step=M,this._valueOrigin=y},dispose:function(){},highlight:function(t,e,i,n){var r=t.getData(),a=Yn(r,n);if(!(a instanceof Array)&&null!=a&&a>=0){var o=r.getItemGraphicEl(a);if(!o){var s=r.getItemLayout(a);if(!s)return;o=new Cc(r,a),o.position=s,o.setZ(t.get("zlevel"),t.get("z")),o.ignore=isNaN(s[0])||isNaN(s[1]),o.__temp=!0,r.setItemGraphicEl(a,o),o.stopSymbolAnimation(!0),this.group.add(o)}o.highlight()}else Bs.prototype.highlight.call(this,t,e,i,n)},downplay:function(t,e,i,n){var r=t.getData(),a=Yn(r,n);if(null!=a&&a>=0){var o=r.getItemGraphicEl(a);o&&(o.__temp?(r.setItemGraphicEl(a,null),this.group.remove(o)):o.downplay())}else Bs.prototype.downplay.call(this,t,e,i,n)},_newPolyline:function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new MS({shape:{points:t},silent:!0,z2:10}),this._lineGroup.add(e),this._polyline=e,e},_newPolygon:function(t,e){var i=this._polygon;return i&&this._lineGroup.remove(i),i=new IS({shape:{points:t,stackedOnPoints:e},silent:!0}),this._lineGroup.add(i),this._polygon=i,i},_updateAnimation:function(t,e,i,n,r,a){var o=this._polyline,s=this._polygon,l=t.hostModel,h=vS(this._data,t,this._stackedOnPoints,e,this._coordSys,i,this._valueOrigin,a),u=h.current,c=h.stackedOnCurrent,d=h.next,f=h.stackedOnNext;r&&(u=td(h.current,i,r),c=td(h.stackedOnCurrent,i,r),d=td(h.next,i,r),f=td(h.stackedOnNext,i,r)),o.shape.__points=h.current,o.shape.points=u,La(o,{shape:{points:d}},l),s&&(s.setShape({points:u,stackedOnPoints:c}),La(s,{shape:{points:d,stackedOnPoints:f}},l));for(var p=[],g=h.status,v=0;ve&&(e=t[i]);return isFinite(e)?e:0/0},min:function(t){for(var e=1/0,i=0;i1){var h;"string"==typeof i?h=AS[i]:"function"==typeof i&&(h=i),h&&t.setData(e.downSample(e.mapDimension(a.dim),1/l,h,DS))}}}}};Jl(TS("line","circle","line")),Ql(CS("line")),jl(ow.PROCESSOR.STATISTIC,kS("line"));var PS=function(t,e,i){e=_(e)&&{coordDimensions:e}||o({},e);var n=t.getSource(),r=Vw(n,e),a=new Bw(r,t);return a.initData(n,i),a},LS={updateSelectedMap:function(t){this._targetList=_(t)?t.slice():[],this._selectTargetMap=g(t||[],function(t,e){return t.set(e.name,e),t},N())},select:function(t,e){var i=null!=e?this._targetList[e]:this._selectTargetMap.get(t),n=this.get("selectedMode");"single"===n&&this._selectTargetMap.each(function(t){t.selected=!1}),i&&(i.selected=!0)},unSelect:function(t,e){var i=null!=e?this._targetList[e]:this._selectTargetMap.get(t);i&&(i.selected=!1)},toggleSelected:function(t,e){var i=null!=e?this._targetList[e]:this._selectTargetMap.get(t);return null!=i?(this[i.selected?"unSelect":"select"](t,e),i.selected):void 0},isSelected:function(t,e){var i=null!=e?this._targetList[e]:this._selectTargetMap.get(t);return i&&i.selected}},OS=rh({type:"series.pie",init:function(t){OS.superApply(this,"init",arguments),this.legendDataProvider=function(){return this.getRawData()},this.updateSelectedMap(this._createSelectableList()),this._defaultLabelLine(t)},mergeOption:function(t){OS.superCall(this,"mergeOption",t),this.updateSelectedMap(this._createSelectableList())},getInitialData:function(){return PS(this,["value"])},_createSelectableList:function(){for(var t=this.getRawData(),e=t.mapDimension("value"),i=[],n=0,r=t.count();r>n;n++)i.push({name:t.getName(n),value:t.get(e,n),selected:Ms(t,n,"selected")});return i},getDataParams:function(t){var e=this.getData(),i=OS.superCall(this,"getDataParams",t),n=[];return e.each(e.mapDimension("value"),function(t){n.push(t)}),i.percent=eo(n,t,e.hostModel.get("percentPrecision")),i.$vars.push("percent"),i},_defaultLabelLine:function(t){Fn(t,"labelLine",["show"]);var e=t.labelLine,i=t.emphasis.labelLine;e.show=e.show&&t.label.show,i.show=i.show&&t.emphasis.label.show},defaultOption:{zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,selectedOffset:10,hoverOffset:10,avoidLabelOverlap:!0,percentPrecision:2,stillShowZeroSum:!0,label:{rotate:!1,show:!0,position:"outer"},labelLine:{show:!0,length:15,length2:15,smooth:!1,lineStyle:{width:1,type:"solid"}},itemStyle:{borderWidth:1},animationType:"expansion",animationEasing:"cubicOut"}});c(OS,LS);var zS=od.prototype;zS.updateData=function(t,e,i){function n(){a.stopAnimation(!0),a.animateTo({shape:{r:u.r+l.get("hoverOffset")}},300,"elasticOut")}function r(){a.stopAnimation(!0),a.animateTo({shape:{r:u.r}},300,"elasticOut")}var a=this.childAt(0),l=t.hostModel,h=t.getItemModel(e),u=t.getItemLayout(e),c=o({},u);if(c.label=null,i){a.setShape(c);var d=l.getShallow("animationType");"scale"===d?(a.shape.r=u.r0,Oa(a,{shape:{r:u.r}},l,e)):(a.shape.endAngle=u.startAngle,La(a,{shape:{endAngle:u.endAngle}},l,e))}else La(a,{shape:c},l,e);var f=t.getItemVisual(e,"color");a.useStyle(s({lineJoin:"bevel",fill:f},h.getModel("itemStyle").getItemStyle())),a.hoverStyle=h.getModel("emphasis.itemStyle").getItemStyle();var p=h.getShallow("cursor");p&&a.attr("cursor",p),ad(this,t.getItemLayout(e),l.isSelected(null,e),l.get("selectedOffset"),l.get("animation")),a.off("mouseover").off("mouseout").off("emphasis").off("normal"),h.get("hoverAnimation")&&l.isAnimationEnabled()&&a.on("mouseover",n).on("mouseout",r).on("emphasis",n).on("normal",r),this._updateLabel(t,e),xa(this)},zS._updateLabel=function(t,e){var i=this.childAt(1),n=this.childAt(2),r=t.hostModel,a=t.getItemModel(e),o=t.getItemLayout(e),s=o.label,l=t.getItemVisual(e,"color");La(i,{shape:{points:s.linePoints||[[s.x,s.y],[s.x,s.y],[s.x,s.y]]}},r,e),La(n,{style:{x:s.x,y:s.y}},r,e),n.attr({rotation:s.rotation,origin:[s.x,s.y],z2:10});var h=a.getModel("label"),u=a.getModel("emphasis.label"),c=a.getModel("labelLine"),d=a.getModel("emphasis.labelLine"),l=t.getItemVisual(e,"color");wa(n.style,n.hoverStyle={},h,u,{labelFetcher:t.hostModel,labelDataIndex:e,defaultText:t.getName(e),autoColor:l,useInsideStyle:!!s.inside},{textAlign:s.textAlign,textVerticalAlign:s.verticalAlign,opacity:t.getItemVisual(e,"opacity")}),n.ignore=n.normalIgnore=!h.get("show"),n.hoverIgnore=!u.get("show"),i.ignore=i.normalIgnore=!c.get("show"),i.hoverIgnore=!d.get("show"),i.setStyle({stroke:l,opacity:t.getItemVisual(e,"opacity")}),i.setStyle(c.getModel("lineStyle").getLineStyle()),i.hoverStyle=d.getModel("lineStyle").getLineStyle();var f=c.get("smooth");f&&f===!0&&(f=.4),i.setShape({smooth:f})},u(od,lv);var ES=(Bs.extend({type:"pie",init:function(){var t=new lv;this._sectorGroup=t},render:function(t,e,i,n){if(!n||n.from!==this.uid){var r=t.getData(),a=this._data,o=this.group,s=e.get("animation"),l=!a,h=t.get("animationType"),u=x(rd,this.uid,t,s,i),c=t.get("selectedMode");if(r.diff(a).add(function(t){var e=new od(r,t);l&&"scale"!==h&&e.eachChild(function(t){t.stopAnimation(!0)}),c&&e.on("click",u),r.setItemGraphicEl(t,e),o.add(e)}).update(function(t,e){var i=a.getItemGraphicEl(e);i.updateData(r,t),i.off("click"),c&&i.on("click",u),o.add(i),r.setItemGraphicEl(t,i)}).remove(function(t){var e=a.getItemGraphicEl(t);o.remove(e)}).execute(),s&&l&&r.count()>0&&"scale"!==h){var d=r.getItemLayout(0),f=Math.max(i.getWidth(),i.getHeight())/2,p=y(o.removeClipPath,o);o.setClipPath(this._createClipPath(d.cx,d.cy,f,d.startAngle,d.clockwise,p,t))}else o.removeClipPath();this._data=r}},dispose:function(){},_createClipPath:function(t,e,i,n,r,a,o){var s=new Sy({shape:{cx:t,cy:e,r0:0,r:i,startAngle:n,endAngle:n,clockwise:r}});return Oa(s,{shape:{endAngle:n+(r?1:-1)*Math.PI*2}},o,a),s},containPoint:function(t,e){var i=e.getData(),n=i.getItemLayout(0);if(n){var r=t[0]-n.cx,a=t[1]-n.cy,o=Math.sqrt(r*r+a*a);return o<=n.r&&o>=n.r0}}}),function(t,e){f(e,function(e){e.update="updateView",Ul(e,function(i,n){var r={};return n.eachComponent({mainType:"series",subType:t,query:i},function(t){t[e.method]&&t[e.method](i.name,i.dataIndex);var n=t.getData();n.each(function(e){var i=n.getName(e);r[i]=t.isSelected(i)||!1})}),{name:i.name,selected:r}})})}),RS=function(t){return{getTargetSeries:function(e){var i={},n=N();return e.eachSeriesByType(t,function(t){t.__paletteScope=i,n.set(t.uid,t)}),n},reset:function(t){var e=t.getRawData(),i={},n=t.getData();n.each(function(t){var e=n.getRawIndex(t);i[e]=t}),e.each(function(r){var a=i[r],o=null!=a&&n.getItemVisual(a,"color",!0);if(o)e.setItemVisual(r,"color",o);else{var s=e.getItemModel(r),l=s.get("itemStyle.color")||t.getColorFromPalette(e.getName(r)||r+"",t.__paletteScope,e.count());e.setItemVisual(r,"color",l),null!=a&&n.setItemVisual(a,"color",l)}})}}},BS=function(t,e,i,n){var r,a,o=t.getData(),s=[],l=!1;o.each(function(i){var n,h,u,c,d=o.getItemLayout(i),f=o.getItemModel(i),p=f.getModel("label"),g=p.get("position")||f.get("emphasis.label.position"),v=f.getModel("labelLine"),m=v.get("length"),y=v.get("length2"),x=(d.startAngle+d.endAngle)/2,_=Math.cos(x),w=Math.sin(x);r=d.cx,a=d.cy;var b="inside"===g||"inner"===g;if("center"===g)n=d.cx,h=d.cy,c="center";else{var S=(b?(d.r+d.r0)/2*_:d.r*_)+r,M=(b?(d.r+d.r0)/2*w:d.r*w)+a;if(n=S+3*_,h=M+3*w,!b){var I=S+_*(m+e-d.r),T=M+w*(m+e-d.r),C=I+(0>_?-1:1)*y,A=T;n=C+(0>_?-5:5),h=A,u=[[S,M],[I,T],[C,A]]}c=b?"center":_>0?"left":"right"}var D=p.getFont(),k=p.get("rotate")?0>_?-x+Math.PI:-x:0,P=t.getFormattedLabel(i,"normal")||o.getName(i),L=Ei(P,D,c,"top");l=!!k,d.label={x:n,y:h,position:g,height:L.height,len:m,len2:y,linePoints:u,textAlign:c,verticalAlign:"middle",rotation:k,inside:b},b||s.push(d.label)}),!l&&t.get("avoidLabelOverlap")&&ld(s,r,a,e,i,n)},NS=2*Math.PI,FS=Math.PI/180,VS=function(t,e,i){e.eachSeriesByType(t,function(t){var e=t.getData(),n=e.mapDimension("value"),r=t.get("center"),a=t.get("radius");_(a)||(a=[0,a]),_(r)||(r=[r,r]);var o=i.getWidth(),s=i.getHeight(),l=Math.min(o,s),h=Ua(r[0],o),u=Ua(r[1],s),c=Ua(a[0],l/2),d=Ua(a[1],l/2),f=-t.get("startAngle")*FS,p=t.get("minAngle")*FS,g=0;e.each(n,function(t){!isNaN(t)&&g++});var v=e.getSum(n),m=Math.PI/(v||g)*2,y=t.get("clockwise"),x=t.get("roseType"),w=t.get("stillShowZeroSum"),b=e.getDataExtent(n);b[0]=0;var S=NS,M=0,I=f,T=y?1:-1;if(e.each(n,function(t,i){var n;if(isNaN(t))return void e.setItemLayout(i,{angle:0/0,startAngle:0/0,endAngle:0/0,clockwise:y,cx:h,cy:u,r0:c,r:x?0/0:d});n="area"!==x?0===v&&w?m:t*m:NS/g,p>n?(n=p,S-=p):M+=t;var r=I+T*n;e.setItemLayout(i,{angle:n,startAngle:I,endAngle:r,clockwise:y,cx:h,cy:u,r0:c,r:x?qa(t,b,[c,d]):d}),I=r}),NS>S&&g)if(.001>=S){var C=NS/g;e.each(n,function(t,i){if(!isNaN(t)){var n=e.getItemLayout(i);n.angle=C,n.startAngle=f+T*i*C,n.endAngle=f+T*(i+1)*C}})}else m=S/M,I=f,e.each(n,function(t,i){if(!isNaN(t)){var n=e.getItemLayout(i),r=n.angle===p?p:t*m;n.startAngle=I,n.endAngle=I+T*r,I+=T*r}});BS(t,d,o,s)})},WS=function(t){return{seriesType:t,reset:function(t,e){var i=e.findComponents({mainType:"legend"});if(i&&i.length){var n=t.getData();n.filterSelf(function(t){for(var e=n.getName(t),r=0;rn[1]&&n.reverse(),{coordSys:{type:"polar",cx:t.cx,cy:t.cy,r:n[1],r0:n[0]},api:{coord:y(function(n){var r=e.dataToRadius(n[0]),a=i.dataToAngle(n[1]),o=t.coordToPoint([r,a]);return o.push(r,a*Math.PI/180),o}),size:y(dd,t)}}},YS=function(t){var e=t.getRect(),i=t.getRangeInfo();return{coordSys:{type:"calendar",x:e.x,y:e.y,width:e.width,height:e.height,cellWidth:t.getCellWidth(),cellHeight:t.getCellHeight(),rangeInfo:{start:i.start,end:i.end,weeks:i.weeks,dayCount:i.allDay}},api:{coord:function(e,i){return t.dataToPoint(e,i)}}}},jS=["itemStyle"],qS=["emphasis","itemStyle"],US=["label"],$S=["emphasis","label"],KS="e\x00\x00",QS={cartesian2d:GS,geo:HS,singleAxis:ZS,polar:XS,calendar:YS};o_.extend({type:"series.custom",dependencies:["grid","polar","geo","singleAxis","calendar"],defaultOption:{coordinateSystem:"cartesian2d",zlevel:0,z:2,legendHoverLink:!0,useTransform:!0},getInitialData:function(){return Oh(this.getSource(),this)},getDataParams:function(t,e,i){var n=o_.prototype.getDataParams.apply(this,arguments);return i&&(n.info=i.info),n}}),Bs.extend({type:"custom",_data:null,render:function(t,e,i,n){var r=this._data,a=t.getData(),o=this.group,s=vd(t,a,e,i);a.diff(r).add(function(e){yd(null,e,s(e,n),t,o,a)}).update(function(e,i){var l=r.getItemGraphicEl(i);yd(l,e,s(e,n),t,o,a)}).remove(function(t){var e=r.getItemGraphicEl(t);e&&o.remove(e)}).execute(),this._data=a},incrementalPrepareRender:function(){this.group.removeAll(),this._data=null},incrementalRender:function(t,e,i,n,r){function a(t){t.isGroup||(t.incremental=!0,t.useHoverLayer=!0)}for(var o=e.getData(),s=vd(e,o,i,n),l=t.start;l=0},defaultOption:{zlevel:0,z:4,show:!0,orient:"horizontal",left:"center",top:0,align:"auto",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderRadius:0,borderWidth:0,padding:5,itemGap:10,itemWidth:25,itemHeight:14,inactiveColor:"#ccc",textStyle:{color:"#333"},selectedMode:!0,tooltip:{show:!1}}});Ul("legendToggleSelect","legendselectchanged",x(Ad,"toggleSelected")),Ul("legendSelect","legendselected",x(Ad,"select")),Ul("legendUnSelect","legendunselected",x(Ad,"unSelect"));var tM=x,eM=f,iM=lv,nM=nh({type:"legend.plain",newlineDisabled:!1,init:function(){this.group.add(this._contentGroup=new iM),this._backgroundEl},getContentGroup:function(){return this._contentGroup},render:function(t,e,i){if(this.resetInner(),t.get("show",!0)){var n=t.get("align");n&&"auto"!==n||(n="right"===t.get("left")&&"vertical"===t.get("orient")?"right":"left"),this.renderInner(n,t,e,i);var r=t.getBoxLayoutParams(),a={width:i.getWidth(),height:i.getHeight()},o=t.get("padding"),l=bo(r,a,o),h=this.layoutInner(t,n,l),u=bo(s({width:h.width,height:h.height},r),a,o);this.group.attr("position",[u.x-h.x,u.y-h.y]),this.group.add(this._backgroundEl=Dd(h,t))}},resetInner:function(){this.getContentGroup().removeAll(),this._backgroundEl&&this.group.remove(this._backgroundEl)},renderInner:function(t,e,i,n){var r=this.getContentGroup(),a=N(),o=e.get("selectedMode"),s=[];i.eachRawSeries(function(t){!t.get("legendHoverLink")&&s.push(t.id)}),eM(e.getData(),function(l,h){var u=l.get("name");if(!this.newlineDisabled&&(""===u||"\n"===u))return void r.add(new iM({newline:!0}));var c=i.getSeriesByName(u)[0];if(!a.get(u))if(c){var d=c.getData(),f=d.getVisual("color");"function"==typeof f&&(f=f(c.getDataParams(0)));var p=d.getVisual("legendSymbol")||"roundRect",g=d.getVisual("symbol"),v=this._createItem(u,h,l,e,p,g,t,f,o);v.on("click",tM(kd,u,n)).on("mouseover",tM(Pd,c.name,null,n,s)).on("mouseout",tM(Ld,c.name,null,n,s)),a.set(u,!0)}else i.eachRawSeries(function(i){if(!a.get(u)&&i.legendDataProvider){var r=i.legendDataProvider(),c=r.indexOfName(u);if(0>c)return;var d=r.getItemVisual(c,"color"),f="roundRect",p=this._createItem(u,h,l,e,f,null,t,d,o);p.on("click",tM(kd,u,n)).on("mouseover",tM(Pd,null,u,n,s)).on("mouseout",tM(Ld,null,u,n,s)),a.set(u,!0)}},this)},this)},_createItem:function(t,e,i,n,r,a,s,l,h){var u=n.get("itemWidth"),c=n.get("itemHeight"),d=n.get("inactiveColor"),f=n.get("symbolKeepAspect"),p=n.isSelected(t),g=new iM,v=i.getModel("textStyle"),m=i.get("icon"),y=i.getModel("tooltip"),x=y.parentModel;if(r=m||r,g.add(fu(r,0,0,u,c,p?l:d,null==f?!0:f)),!m&&a&&(a!==r||"none"===a)){var _=.8*c;"none"===a&&(a="circle"),g.add(fu(a,(u-_)/2,(c-_)/2,_,_,p?l:d,null==f?!0:f))}var w="left"===s?u+5:-5,b=s,S=n.get("formatter"),M=t;"string"==typeof S&&S?M=S.replace("{name}",null!=t?t:""):"function"==typeof S&&(M=S(t)),g.add(new xy({style:ba({},v,{text:M,x:w,y:c/2,textFill:p?v.getTextColor():d,textAlign:b,textVerticalAlign:"middle"})}));var I=new Dy({shape:g.getBoundingRect(),invisible:!0,tooltip:y.get("show")?o({content:t,formatter:x.get("formatter",!0)||function(){return t},formatterParams:{componentType:"legend",legendIndex:n.componentIndex,name:t,$vars:["name"]}},y.option):null});return g.add(I),g.eachChild(function(t){t.silent=!0}),I.silent=!h,this.getContentGroup().add(g),xa(g),g.__legendDataIndex=e,g},layoutInner:function(t,e,i){var n=this.getContentGroup();gx(t.get("orient"),n,t.get("itemGap"),i.width,i.height);var r=n.getBoundingRect();return n.attr("position",[-r.x,-r.y]),this.group.getBoundingRect()}}),rM=function(t){var e=t.findComponents({mainType:"legend"});e&&e.length&&t.filterSeries(function(t){for(var i=0;ii[s],f=[-u.x,-u.y];f[o]=n.position[o];var p=[0,0],g=[-c.x,-c.y],v=D(t.get("pageButtonGap",!0),t.get("itemGap",!0));if(d){var m=t.get("pageButtonPosition",!0);"end"===m?g[o]+=i[s]-c[s]:p[o]+=c[s]+v}g[1-o]+=u[l]/2-c[l]/2,n.attr("position",f),r.attr("position",p),a.attr("position",g);var y=this.group.getBoundingRect(),y={x:0,y:0};if(y[s]=d?i[s]:u[s],y[l]=Math.max(u[l],c[l]),y[h]=Math.min(0,c[h]+g[1-o]),r.__rectSize=i[s],d){var x={x:0,y:0};x[s]=Math.max(i[s]-c[s]-v,0),x[l]=y[l],r.setClipPath(new Dy({shape:x})),r.__rectSize=x[s]}else a.eachChild(function(t){t.attr({invisible:!0,silent:!0})});var _=this._getPageInfo(t);return null!=_.pageIndex&&La(n,{position:_.contentPosition},d?t:!1),this._updatePageInfoView(t,_),y},_pageGo:function(t,e,i){var n=this._getPageInfo(e)[t];null!=n&&i.dispatchAction({type:"legendScroll",scrollDataIndex:n,legendId:e.id})},_updatePageInfoView:function(t,e){var i=this._controllerGroup;f(["pagePrev","pageNext"],function(n){var r=null!=e[n+"DataIndex"],a=i.childOfName(n);a&&(a.setStyle("fill",r?t.get("pageIconColor",!0):t.get("pageIconInactiveColor",!0)),a.cursor=r?"pointer":"default")});var n=i.childOfName("pageText"),r=t.get("pageFormatter"),a=e.pageIndex,o=null!=a?a+1:0,s=e.pageCount;n&&r&&n.setStyle("text",b(r)?r.replace("{current}",o).replace("{total}",s):r({current:o,total:s}))},_getPageInfo:function(t){function e(t){var e=t.getBoundingRect().clone();return e[f]+=t.position[u],e}var i,n,r,a,o=t.get("scrollDataIndex",!0),s=this.getContentGroup(),l=s.getBoundingRect(),h=this._containerGroup.__rectSize,u=t.getOrient().index,c=sM[u],d=sM[1-u],f=lM[u],p=s.position.slice();this._showController?s.eachChild(function(t){t.__legendDataIndex===o&&(a=t)}):a=s.childAt(0);var g=h?Math.ceil(l[c]/h):0;if(a){var v=a.getBoundingRect(),m=a.position[u]+v[f];p[u]=-m-l[f],i=Math.floor(g*(m+v[f]+h/2)/l[c]),i=l[c]&&g?Math.max(0,Math.min(g-1,i)):-1;var y={x:0,y:0};y[c]=h,y[d]=l[d],y[f]=-p[u]-l[f];var x,_=s.children();if(s.eachChild(function(t,i){var n=e(t);n.intersect(y)&&(null==x&&(x=i),r=t.__legendDataIndex),i===_.length-1&&n[f]+n[c]<=y[f]+y[c]&&(r=null)}),null!=x){var w=_[x],b=e(w);if(y[f]=b[f]+b[c]-y[c],0>=x&&b[f]>=y[f])n=null;else{for(;x>0&&e(_[x-1]).intersect(y);)x--;n=_[x].__legendDataIndex}}}return{contentPosition:p,pageIndex:i,pageCount:g,pagePrevDataIndex:n,pageNextDataIndex:r}}});Ul("legendScroll","legendscroll",function(t,e){var i=t.scrollDataIndex;null!=i&&e.eachComponent({mainType:"legend",subType:"scroll",query:t},function(t){t.setScrollDataIndex(i)})});var uM=function(t,e){var i,n=[],r=t.seriesIndex;if(null==r||!(i=e.getSeriesByIndex(r)))return{point:[]};var a=i.getData(),o=Yn(a,t);if(null==o||0>o||_(o))return{point:[]};var s=a.getItemGraphicEl(o),l=i.coordinateSystem;if(i.getTooltipPosition)n=i.getTooltipPosition(o)||[];else if(l&&l.dataToPoint)n=l.dataToPoint(a.getValues(p(l.dimensions,function(t){return a.mapDimension(t)}),o,!0))||[];else if(s){var h=s.getBoundingRect().clone();h.applyTransform(s.transform),n=[h.x+h.width/2,h.y+h.height/2]}return{point:n,el:s}},cM=f,dM=x,fM=jn(),pM=function(t,e,i){var n=t.currTrigger,r=[t.x,t.y],a=t,o=t.dispatchAction||y(i.dispatchAction,i),s=e.getComponent("axisPointer").coordSysAxesInfo;if(s){Hd(r)&&(r=uM({seriesIndex:a.seriesIndex,dataIndex:a.dataIndex},e).point);var l=Hd(r),h=a.axesInfo,u=s.axesInfo,c="leave"===n||Hd(r),d={},f={},p={list:[],map:{}},g={showPointer:dM(Rd,f),showTooltip:dM(Bd,p)};cM(s.coordSysMap,function(t,e){var i=l||t.containPoint(r);cM(s.coordSysAxesInfo[e],function(t){var e=t.axis,n=Wd(h,t);if(!c&&i&&(!h||n)){var a=n&&n.value;null!=a||l||(a=e.pointToData(r)),null!=a&&zd(t,a,g,!1,d)}})});var v={};return cM(u,function(t,e){var i=t.linkGroup;i&&!f[e]&&cM(i.axesInfo,function(e,n){var r=f[n];if(e!==t&&r){var a=r.value;i.mapper&&(a=t.axis.scale.parse(i.mapper(a,Gd(e),Gd(t)))),v[t.key]=a}})}),cM(v,function(t,e){zd(u[e],t,g,!0,d)}),Nd(f,u,d),Fd(p,r,t,o),Vd(u,o,i),d}},gM=(ih({type:"axisPointer",coordSysAxesInfo:null,defaultOption:{show:"auto",triggerOn:null,zlevel:0,z:50,type:"line",snap:!1,triggerTooltip:!0,value:null,status:null,link:[],animation:null,animationDurationUpdate:200,lineStyle:{color:"#aaa",width:1,type:"solid"},shadowStyle:{color:"rgba(150,150,150,0.3)"},label:{show:!0,formatter:null,precision:"auto",margin:3,color:"#fff",padding:[5,7,5,7],backgroundColor:"auto",borderColor:null,borderWidth:0,shadowBlur:3,shadowColor:"#aaa"},handle:{show:!1,icon:"M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z",size:45,margin:50,color:"#333",shadowBlur:3,shadowColor:"#aaa",shadowOffsetX:0,shadowOffsetY:2,throttle:40}}}),jn()),vM=f,mM=nh({type:"axisPointer",render:function(t,e,i){var n=e.getComponent("tooltip"),r=t.get("triggerOn")||n&&n.get("triggerOn")||"mousemove|click";Zd("axisPointer",i,function(t,e,i){"none"!==r&&("leave"===t||r.indexOf(t)>=0)&&i({type:"updateAxisPointer",currTrigger:t,x:e&&e.offsetX,y:e&&e.offsetY})})},remove:function(t,e){$d(e.getZr(),"axisPointer"),mM.superApply(this._model,"remove",arguments)},dispose:function(t,e){$d("axisPointer",e),mM.superApply(this._model,"dispose",arguments)}}),yM=jn(),xM=n,_M=y;Kd.prototype={_group:null,_lastGraphicKey:null,_handle:null,_dragging:!1,_lastValue:null,_lastStatus:null,_payloadInfo:null,animationThreshold:15,render:function(t,e,i,n){var r=e.get("value"),a=e.get("status");if(this._axisModel=t,this._axisPointerModel=e,this._api=i,n||this._lastValue!==r||this._lastStatus!==a){this._lastValue=r,this._lastStatus=a;var o=this._group,s=this._handle;if(!a||"hide"===a)return o&&o.hide(),void(s&&s.hide());o&&o.show(),s&&s.show();var l={};this.makeElOption(l,r,t,e,i);var h=l.graphicKey;h!==this._lastGraphicKey&&this.clear(i),this._lastGraphicKey=h;var u=this._moveAnimation=this.determineAnimation(t,e);if(o){var c=x(Qd,e,u);this.updatePointerEl(o,l,c,e),this.updateLabelEl(o,l,c,e)}else o=this._group=new lv,this.createPointerEl(o,l,t,e),this.createLabelEl(o,l,t,e),i.getZr().add(o);nf(o,e,!0),this._renderHandle(r)}},remove:function(t){this.clear(t)},dispose:function(t){this.clear(t)},determineAnimation:function(t,e){var i=e.get("animation"),n=t.axis,r="category"===n.type,a=e.get("snap");if(!a&&!r)return!1;if("auto"===i||null==i){var o=this.animationThreshold;if(r&&n.getBandWidth()>o)return!0;if(a){var s=_c(t).seriesDataCount,l=n.getExtent();return Math.abs(l[0]-l[1])/s>o}return!1}return i===!0},makeElOption:function(){},createPointerEl:function(t,e){var i=e.pointer;if(i){var n=yM(t).pointerEl=new Yy[i.type](xM(e.pointer));t.add(n)}},createLabelEl:function(t,e,i,n){if(e.label){var r=yM(t).labelEl=new Dy(xM(e.label));t.add(r),tf(r,n)}},updatePointerEl:function(t,e,i){var n=yM(t).pointerEl;n&&(n.setStyle(e.pointer.style),i(n,{shape:e.pointer.shape}))},updateLabelEl:function(t,e,i,n){var r=yM(t).labelEl;r&&(r.setStyle(e.label.style),i(r,{shape:e.label.shape,position:e.label.position}),tf(r,n))},_renderHandle:function(t){if(!this._dragging&&this.updateHandleTransform){var e=this._axisPointerModel,i=this._api.getZr(),n=this._handle,r=e.getModel("handle"),a=e.get("status");if(!r.get("show")||!a||"hide"===a)return n&&i.remove(n),void(this._handle=null);var o;this._handle||(o=!0,n=this._handle=Va(r.get("icon"),{cursor:"move",draggable:!0,onmousemove:function(t){Ig(t.event)},onmousedown:_M(this._onHandleDragMove,this,0,0),drift:_M(this._onHandleDragMove,this),ondragend:_M(this._onHandleDragEnd,this)}),i.add(n)),nf(n,e,!1);var s=["color","borderColor","borderWidth","opacity","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"];n.setStyle(r.getItemStyle(null,s));var l=r.get("size");_(l)||(l=[l,l]),n.attr("scale",[l[0]/2,l[1]/2]),Hs(this,"_doDispatchAxisPointer",r.get("throttle")||0,"fixRate"),this._moveHandleToValue(t,o)}},_moveHandleToValue:function(t,e){Qd(this._axisPointerModel,!e&&this._moveAnimation,this._handle,ef(this.getHandleTransform(t,this._axisModel,this._axisPointerModel)))},_onHandleDragMove:function(t,e){var i=this._handle;if(i){this._dragging=!0;var n=this.updateHandleTransform(ef(i),[t,e],this._axisModel,this._axisPointerModel);this._payloadInfo=n,i.stopAnimation(),i.attr(ef(n)),yM(i).lastProp=null,this._doDispatchAxisPointer()}},_doDispatchAxisPointer:function(){var t=this._handle;if(t){var e=this._payloadInfo,i=this._axisModel;this._api.dispatchAction({type:"updateAxisPointer",x:e.cursorPoint[0],y:e.cursorPoint[1],tooltipOption:e.tooltipOption,axesInfo:[{axisDim:i.axis.dim,axisIndex:i.componentIndex}]})}},_onHandleDragEnd:function(){this._dragging=!1;var t=this._handle;if(t){var e=this._axisPointerModel.get("value");this._moveHandleToValue(e),this._api.dispatchAction({type:"hideTip"})}},getHandleTransform:null,updateHandleTransform:null,clear:function(t){this._lastValue=null,this._lastStatus=null;var e=t.getZr(),i=this._group,n=this._handle;e&&i&&(this._lastGraphicKey=null,i&&e.remove(i),n&&e.remove(n),this._group=null,this._handle=null,this._payloadInfo=null)},doClear:function(){},buildLabel:function(t,e,i){return i=i||0,{x:t[i],y:t[1-i],width:e[i],height:e[1-i]}}},Kd.prototype.constructor=Kd,er(Kd);var wM=Kd.extend({makeElOption:function(t,e,i,n,r){var a=i.axis,o=a.grid,s=n.get("type"),l=df(o,a).getOtherAxis(a).getGlobalExtent(),h=a.toGlobalCoord(a.dataToCoord(e,!0));if(s&&"none"!==s){var u=rf(n),c=bM[s](a,h,l,u);c.style=u,t.graphicKey=c.type,t.pointer=c}var d=Tc(o.model,i);hf(e,t,d,i,n,r)},getHandleTransform:function(t,e,i){var n=Tc(e.axis.grid.model,e,{labelInside:!1});return n.labelMargin=i.get("handle.margin"),{position:lf(e.axis,t,n),rotation:n.rotation+(n.labelDirection<0?Math.PI:0)}},updateHandleTransform:function(t,e,i){var n=i.axis,r=n.grid,a=n.getGlobalExtent(!0),o=df(r,n).getOtherAxis(n).getGlobalExtent(),s="x"===n.dim?0:1,l=t.position;l[s]+=e[s],l[s]=Math.min(a[1],l[s]),l[s]=Math.max(a[0],l[s]);var h=(o[1]+o[0])/2,u=[h,h];u[s]=l[s];var c=[{verticalAlign:"middle"},{align:"center"}];return{position:l,rotation:t.rotation,cursorPoint:u,tooltipOption:c[s]}}}),bM={line:function(t,e,i,n){var r=uf([e,i[0]],[e,i[1]],ff(t));return ia({shape:r,style:n}),{type:"Line",shape:r}},shadow:function(t,e,i){var n=Math.max(1,t.getBandWidth()),r=i[1]-i[0];return{type:"Rect",shape:cf([e-n/2,i[0]],[n,r],ff(t))}}};rS.registerAxisPointerClass("CartesianAxisPointer",wM),Yl(function(t){if(t){(!t.axisPointer||0===t.axisPointer.length)&&(t.axisPointer={});var e=t.axisPointer.link;e&&!_(e)&&(t.axisPointer.link=[e])}}),jl(ow.PROCESSOR.STATISTIC,function(t,e){t.getComponent("axisPointer").coordSysAxesInfo=fc(t,e)}),Ul({type:"updateAxisPointer",event:"updateAxisPointer",update:":updateAxisPointer"},pM),ih({type:"tooltip",dependencies:["axisPointer"],defaultOption:{zlevel:0,z:60,show:!0,showContent:!0,trigger:"item",triggerOn:"mousemove|click",alwaysShowContent:!1,displayMode:"single",renderMode:"auto",confine:!1,showDelay:0,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:"rgba(50,50,50,0.7)",borderColor:"#333",borderRadius:4,borderWidth:0,padding:5,extraCssText:"",axisPointer:{type:"line",axis:"auto",animation:"auto",animationDurationUpdate:200,animationEasingUpdate:"exponentialOut",crossStyle:{color:"#999",width:1,type:"dashed",textStyle:{}}},textStyle:{color:"#fff",fontSize:14}}});var SM=f,MM=fo,IM=["","-webkit-","-moz-","-o-"],TM="position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;";mf.prototype={constructor:mf,_enterable:!0,update:function(){var t=this._container,e=t.currentStyle||document.defaultView.getComputedStyle(t),i=t.style;"absolute"!==i.position&&"absolute"!==e.position&&(i.position="relative")},show:function(t){clearTimeout(this._hideTimeout);var e=this.el;e.style.cssText=TM+vf(t)+";left:"+this._x+"px;top:"+this._y+"px;"+(t.get("extraCssText")||""),e.style.display=e.innerHTML?"block":"none",e.style.pointerEvents=this._enterable?"auto":"none",this._show=!0},setContent:function(t){this.el.innerHTML=null==t?"":t},setEnterable:function(t){this._enterable=t},getSize:function(){var t=this.el;return[t.clientWidth,t.clientHeight]},moveTo:function(t,e){var i,n=this._zr;n&&n.painter&&(i=n.painter.getViewportRootOffset())&&(t+=i.offsetLeft,e+=i.offsetTop);var r=this.el.style;r.left=t+"px",r.top=e+"px",this._x=t,this._y=e},hide:function(){this.el.style.display="none",this._show=!1},hideLater:function(t){!this._show||this._inContent&&this._enterable||(t?(this._hideDelay=t,this._show=!1,this._hideTimeout=setTimeout(y(this.hide,this),t)):this.hide())},isShow:function(){return this._show},getOuterSize:function(){var t=this.el.clientWidth,e=this.el.clientHeight;if(document.defaultView&&document.defaultView.getComputedStyle){var i=document.defaultView.getComputedStyle(this.el);i&&(t+=parseInt(i.paddingLeft,10)+parseInt(i.paddingRight,10)+parseInt(i.borderLeftWidth,10)+parseInt(i.borderRightWidth,10),e+=parseInt(i.paddingTop,10)+parseInt(i.paddingBottom,10)+parseInt(i.borderTopWidth,10)+parseInt(i.borderBottomWidth,10))}return{width:t,height:e}}},yf.prototype={constructor:yf,_enterable:!0,update:function(){},show:function(){this._hideTimeout&&clearTimeout(this._hideTimeout),this.el.attr("show",!0),this._show=!0},setContent:function(t,e,i){this.el&&this._zr.remove(this.el);for(var n={},r=t,a="{marker",o="|}",s=r.indexOf(a);s>=0;){var l=r.indexOf(o),h=r.substr(s+a.length,l-s-a.length);n["marker"+h]=h.indexOf("sub")>-1?{textWidth:4,textHeight:4,textBorderRadius:2,textBackgroundColor:e[h],textOffset:[3,0]}:{textWidth:10,textHeight:10,textBorderRadius:5,textBackgroundColor:e[h]},r=r.substr(l+1),s=r.indexOf("{marker")}this.el=new xy({style:{rich:n,text:t,textLineHeight:20,textBackgroundColor:i.get("backgroundColor"),textBorderRadius:i.get("borderRadius"),textFill:i.get("textStyle.color"),textPadding:i.get("padding")},z:i.get("z")}),this._zr.add(this.el);var u=this;this.el.on("mouseover",function(){u._enterable&&(clearTimeout(u._hideTimeout),u._show=!0),u._inContent=!0}),this.el.on("mouseout",function(){u._enterable&&u._show&&u.hideLater(u._hideDelay),u._inContent=!1})},setEnterable:function(t){this._enterable=t},getSize:function(){var t=this.el.getBoundingRect();return[t.width,t.height]},moveTo:function(t,e){this.el&&this.el.attr("position",[t,e])},hide:function(){this.el.hide(),this._show=!1},hideLater:function(t){!this._show||this._inContent&&this._enterable||(t?(this._hideDelay=t,this._show=!1,this._hideTimeout=setTimeout(y(this.hide,this),t)):this.hide())},isShow:function(){return this._show},getOuterSize:function(){return this.getSize()}};var CM=y,AM=f,DM=Ua,kM=new Dy({shape:{x:-1,y:-1,width:2,height:2}});nh({type:"tooltip",init:function(t,e){if(!tg.node){var i=t.getComponent("tooltip"),n=i.get("renderMode");this._renderMode=Qn(n);var r;"html"===this._renderMode?(r=new mf(e.getDom(),e),this._newLine="
    "):(r=new yf(e),this._newLine="\n"),this._tooltipContent=r}},render:function(t,e,i){if(!tg.node){this.group.removeAll(),this._tooltipModel=t,this._ecModel=e,this._api=i,this._lastDataByCoordSys=null,this._alwaysShowContent=t.get("alwaysShowContent");var n=this._tooltipContent;n.update(),n.setEnterable(t.get("enterable")),this._initGlobalListener(),this._keepShow()}},_initGlobalListener:function(){var t=this._tooltipModel,e=t.get("triggerOn");Zd("itemTooltip",this._api,CM(function(t,i,n){"none"!==e&&(e.indexOf(t)>=0?this._tryShow(i,n):"leave"===t&&this._hide(n))},this))},_keepShow:function(){var t=this._tooltipModel,e=this._ecModel,i=this._api;if(null!=this._lastX&&null!=this._lastY&&"none"!==t.get("triggerOn")){var n=this;clearTimeout(this._refreshUpdateTimeout),this._refreshUpdateTimeout=setTimeout(function(){n.manuallyShowTip(t,e,i,{x:n._lastX,y:n._lastY})})}},manuallyShowTip:function(t,e,i,n){if(n.from!==this.uid&&!tg.node){var r=_f(n,i);this._ticket="";var a=n.dataByCoordSys;if(n.tooltip&&null!=n.x&&null!=n.y){var o=kM;o.position=[n.x,n.y],o.update(),o.tooltip=n.tooltip,this._tryShow({offsetX:n.x,offsetY:n.y,target:o},r)}else if(a)this._tryShow({offsetX:n.x,offsetY:n.y,position:n.position,event:{},dataByCoordSys:n.dataByCoordSys,tooltipOption:n.tooltipOption},r);else if(null!=n.seriesIndex){if(this._manuallyAxisShowTip(t,e,i,n))return;var s=uM(n,e),l=s.point[0],h=s.point[1];null!=l&&null!=h&&this._tryShow({offsetX:l,offsetY:h,position:n.position,target:s.el,event:{}},r)}else null!=n.x&&null!=n.y&&(i.dispatchAction({type:"updateAxisPointer",x:n.x,y:n.y}),this._tryShow({offsetX:n.x,offsetY:n.y,position:n.position,target:i.getZr().findHover(n.x,n.y).target,event:{}},r))}},manuallyHideTip:function(t,e,i,n){var r=this._tooltipContent;!this._alwaysShowContent&&this._tooltipModel&&r.hideLater(this._tooltipModel.get("hideDelay")),this._lastX=this._lastY=null,n.from!==this.uid&&this._hide(_f(n,i))},_manuallyAxisShowTip:function(t,e,i,n){var r=n.seriesIndex,a=n.dataIndex,o=e.getComponent("axisPointer").coordSysAxesInfo;if(null!=r&&null!=a&&null!=o){var s=e.getSeriesByIndex(r);if(s){var l=s.getData(),t=xf([l.getItemModel(a),s,(s.coordinateSystem||{}).model,t]);if("axis"===t.get("trigger"))return i.dispatchAction({type:"updateAxisPointer",seriesIndex:r,dataIndex:a,position:n.position}),!0}}},_tryShow:function(t,e){var i=t.target,n=this._tooltipModel;if(n){this._lastX=t.offsetX,this._lastY=t.offsetY;var r=t.dataByCoordSys;r&&r.length?this._showAxisTooltip(r,t):i&&null!=i.dataIndex?(this._lastDataByCoordSys=null,this._showSeriesItemTooltip(t,i,e)):i&&i.tooltip?(this._lastDataByCoordSys=null,this._showComponentItemTooltip(t,i,e)):(this._lastDataByCoordSys=null,this._hide(e))}},_showOrMove:function(t,e){var i=t.get("showDelay");e=y(e,this),clearTimeout(this._showTimout),i>0?this._showTimout=setTimeout(e,i):e()},_showAxisTooltip:function(t,e){var i=this._ecModel,n=this._tooltipModel,a=[e.offsetX,e.offsetY],o=[],s=[],l=xf([e.tooltipOption,n]),h=this._renderMode,u=this._newLine,c={};AM(t,function(t){AM(t.dataByAxis,function(t){var e=i.getComponent(t.axisDim+"Axis",t.axisIndex),n=t.value,a=[];if(e&&null!=n){var l=sf(n,e.axis,i,t.seriesDataIndices,t.valueLabelOpt);f(t.seriesDataIndices,function(o){var u=i.getSeriesByIndex(o.seriesIndex),d=o.dataIndexInside,f=u&&u.getDataParams(d);if(f.axisDim=t.axisDim,f.axisIndex=t.axisIndex,f.axisType=t.axisType,f.axisId=t.axisId,f.axisValue=hu(e.axis,n),f.axisValueLabel=l,f){s.push(f);var p,g=u.formatTooltip(d,!0,null,h);if(S(g)){p=g.html;var v=g.markers;r(c,v)}else p=g;a.push(p)}});var d=l;o.push("html"!==h?a.join(u):(d?po(d)+u:"")+a.join(u))}})},this),o.reverse(),o=o.join(this._newLine+this._newLine);var d=e.position;this._showOrMove(l,function(){this._updateContentNotChangedOnAxis(t)?this._updatePosition(l,d,a[0],a[1],this._tooltipContent,s):this._showTooltipContent(l,o,s,Math.random(),a[0],a[1],d,void 0,c)})},_showSeriesItemTooltip:function(t,e,i){var n=this._ecModel,r=e.seriesIndex,a=n.getSeriesByIndex(r),o=e.dataModel||a,s=e.dataIndex,l=e.dataType,h=o.getData(),u=xf([h.getItemModel(s),o,a&&(a.coordinateSystem||{}).model,this._tooltipModel]),c=u.get("trigger");if(null==c||"item"===c){var d,f,p=o.getDataParams(s,l),g=o.formatTooltip(s,!1,l,this._renderMode);S(g)?(d=g.html,f=g.markers):(d=g,f=null);var v="item_"+o.name+"_"+s;this._showOrMove(u,function(){this._showTooltipContent(u,d,p,v,t.offsetX,t.offsetY,t.position,t.target,f)}),i({type:"showTip",dataIndexInside:s,dataIndex:h.getRawIndex(s),seriesIndex:r,from:this.uid})}},_showComponentItemTooltip:function(t,e,i){var n=e.tooltip;if("string"==typeof n){var r=n;n={content:r,formatter:r}}var a=new Wa(n,this._tooltipModel,this._ecModel),o=a.get("content"),s=Math.random();this._showOrMove(a,function(){this._showTooltipContent(a,o,a.get("formatterParams")||{},s,t.offsetX,t.offsetY,t.position,e)}),i({type:"showTip",from:this.uid})},_showTooltipContent:function(t,e,i,n,r,a,o,s,l){if(this._ticket="",t.get("showContent")&&t.get("show")){var h=this._tooltipContent,u=t.get("formatter");o=o||t.get("position");var c=e;if(u&&"string"==typeof u)c=go(u,i,!0);else if("function"==typeof u){var d=CM(function(e,n){e===this._ticket&&(h.setContent(n,l,t),this._updatePosition(t,o,r,a,h,i,s))},this);this._ticket=n,c=u(i,n,d)}h.setContent(c,l,t),h.show(t),this._updatePosition(t,o,r,a,h,i,s)}},_updatePosition:function(t,e,i,n,r,a,o){var s=this._api.getWidth(),l=this._api.getHeight();e=e||t.get("position");var h=r.getSize(),u=t.get("align"),c=t.get("verticalAlign"),d=o&&o.getBoundingRect().clone();if(o&&d.applyTransform(o.transform),"function"==typeof e&&(e=e([i,n],a,r.el,d,{viewSize:[s,l],contentSize:h.slice()})),_(e))i=DM(e[0],s),n=DM(e[1],l);else if(S(e)){e.width=h[0],e.height=h[1];var f=bo(e,{width:s,height:l});i=f.x,n=f.y,u=null,c=null}else if("string"==typeof e&&o){var p=Sf(e,d,h);i=p[0],n=p[1]}else{var p=wf(i,n,r,s,l,u?null:20,c?null:20);i=p[0],n=p[1]}if(u&&(i-=Mf(u)?h[0]/2:"right"===u?h[0]:0),c&&(n-=Mf(c)?h[1]/2:"bottom"===c?h[1]:0),t.get("confine")){var p=bf(i,n,r,s,l);i=p[0],n=p[1]}r.moveTo(i,n)},_updateContentNotChangedOnAxis:function(t){var e=this._lastDataByCoordSys,i=!!e&&e.length===t.length;return i&&AM(e,function(e,n){var r=e.dataByAxis||{},a=t[n]||{},o=a.dataByAxis||[];i&=r.length===o.length,i&&AM(r,function(t,e){var n=o[e]||{},r=t.seriesDataIndices||[],a=n.seriesDataIndices||[];i&=t.value===n.value&&t.axisType===n.axisType&&t.axisId===n.axisId&&r.length===a.length,i&&AM(r,function(t,e){var n=a[e];i&=t.seriesIndex===n.seriesIndex&&t.dataIndex===n.dataIndex})})}),this._lastDataByCoordSys=t,!!i},_hide:function(t){this._lastDataByCoordSys=null,t({type:"hideTip",from:this.uid})},dispose:function(t,e){tg.node||(this._tooltipContent.hide(),$d("itemTooltip",e))}}),Ul({type:"showTip",event:"showTip",update:"tooltip:manuallyShowTip"},function(){}),Ul({type:"hideTip",event:"hideTip",update:"tooltip:manuallyHideTip"},function(){});var PM=co,LM=po,OM=ih({type:"marker",dependencies:["series","grid","polar","geo"],init:function(t,e,i,n){this.mergeDefaultAndTheme(t,i),this.mergeOption(t,i,n.createdBySelf,!0)},isAnimationEnabled:function(){if(tg.node)return!1;var t=this.__hostSeries;return this.getShallow("animation")&&t&&t.isAnimationEnabled()},mergeOption:function(t,e,i,n){var r=this.constructor,a=this.mainType+"Model";i||e.eachSeries(function(t){var i=t.get(this.mainType,!0),s=t[a];return i&&i.data?(s?s.mergeOption(i,e,!0):(n&&If(i),f(i.data,function(t){t instanceof Array?(If(t[0]),If(t[1])):If(t)}),s=new r(i,this,e),o(s,{mainType:this.mainType,seriesIndex:t.seriesIndex,name:t.name,createdBySelf:!0}),s.__hostSeries=t),void(t[a]=s)):void(t[a]=null)},this)},formatTooltip:function(t){var e=this.getData(),i=this.getRawValue(t),n=_(i)?p(i,PM).join(", "):PM(i),r=e.getName(t),a=LM(this.name);return(null!=i||r)&&(a+="
    "),r&&(a+=LM(r),null!=i&&(a+=" : ")),null!=i&&(a+=LM(n)),a},getData:function(){return this._data},setData:function(t){this._data=t}});c(OM,i_),OM.extend({type:"markPoint",defaultOption:{zlevel:0,z:5,symbol:"pin",symbolSize:50,tooltip:{trigger:"item"},label:{show:!0,position:"inside"},itemStyle:{borderWidth:2},emphasis:{label:{show:!0}}}});var zM=h,EM=x,RM={min:EM(Af,"min"),max:EM(Af,"max"),average:EM(Af,"average")},BM=nh({type:"marker",init:function(){this.markerGroupMap=N()},render:function(t,e,i){var n=this.markerGroupMap;n.each(function(t){t.__keep=!1});var r=this.type+"Model";e.eachSeries(function(t){var n=t[r];n&&this.renderSeries(t,n,e,i)},this),n.each(function(t){!t.__keep&&this.group.remove(t.group)},this)},renderSeries:function(){}});BM.extend({type:"markPoint",updateTransform:function(t,e,i){e.eachSeries(function(t){var e=t.markPointModel;e&&(Ef(e.getData(),t,i),this.markerGroupMap.get(t.id).updateLayout(e))},this)},renderSeries:function(t,e,i,n){var r=t.coordinateSystem,a=t.id,o=t.getData(),s=this.markerGroupMap,l=s.get(a)||s.set(a,new zc),h=Rf(r,t,e);e.setData(h),Ef(e.getData(),t,n),h.each(function(t){var i=h.getItemModel(t),n=i.getShallow("symbolSize");"function"==typeof n&&(n=n(e.getRawValue(t),e.getDataParams(t))),h.setItemVisual(t,{symbolSize:n,color:i.get("itemStyle.color")||o.getVisual("color"),symbol:i.getShallow("symbol")})}),l.updateData(h),this.group.add(l.group),h.eachItemGraphicEl(function(t){t.traverse(function(t){t.dataModel=e + })}),l.__keep=!0,l.group.silent=e.get("silent")||t.get("silent")}}),Yl(function(t){t.markPoint=t.markPoint||{}}),OM.extend({type:"markLine",defaultOption:{zlevel:0,z:5,symbol:["circle","arrow"],symbolSize:[8,16],precision:2,tooltip:{trigger:"item"},label:{show:!0,position:"end"},lineStyle:{type:"dashed"},emphasis:{label:{show:!0},lineStyle:{width:3}},animationEasing:"linear"}});var NM=ky.prototype,FM=Ly.prototype,VM=$r({type:"ec-line",style:{stroke:"#000",fill:null},shape:{x1:0,y1:0,x2:0,y2:0,percent:1,cpx1:null,cpy1:null},buildPath:function(t,e){(Bf(e)?NM:FM).buildPath(t,e)},pointAt:function(t){return Bf(this.shape)?NM.pointAt.call(this,t):FM.pointAt.call(this,t)},tangentAt:function(t){var e=this.shape,i=Bf(e)?[e.x2-e.x1,e.y2-e.y1]:FM.tangentAt.call(this,t);return te(i,i)}}),WM=["fromSymbol","toSymbol"],GM=Hf.prototype;GM.beforeUpdate=Gf,GM._createLine=function(t,e,i){var n=t.hostModel,r=t.getItemLayout(e),a=Vf(r);a.shape.percent=0,Oa(a,{shape:{percent:1}},n,e),this.add(a);var o=new xy({name:"label"});this.add(o),f(WM,function(i){var n=Ff(i,t,e);this.add(n),this[Nf(i)]=t.getItemVisual(e,i)},this),this._updateCommonStl(t,e,i)},GM.updateData=function(t,e,i){var n=t.hostModel,r=this.childOfName("line"),a=t.getItemLayout(e),o={shape:{}};Wf(o.shape,a),La(r,o,n,e),f(WM,function(i){var n=t.getItemVisual(e,i),r=Nf(i);if(this[r]!==n){this.remove(this.childOfName(i));var a=Ff(i,t,e);this.add(a)}this[r]=n},this),this._updateCommonStl(t,e,i)},GM._updateCommonStl=function(t,e,i){var n=t.hostModel,r=this.childOfName("line"),a=i&&i.lineStyle,o=i&&i.hoverLineStyle,l=i&&i.labelModel,h=i&&i.hoverLabelModel;if(!i||t.hasItemOption){var u=t.getItemModel(e);a=u.getModel("lineStyle").getLineStyle(),o=u.getModel("emphasis.lineStyle").getLineStyle(),l=u.getModel("label"),h=u.getModel("emphasis.label")}var c=t.getItemVisual(e,"color"),d=k(t.getItemVisual(e,"opacity"),a.opacity,1);r.useStyle(s({strokeNoScale:!0,fill:"none",stroke:c,opacity:d},a)),r.hoverStyle=o,f(WM,function(t){var e=this.childOfName(t);e&&(e.setColor(c),e.setStyle({opacity:d}))},this);var p,g,v=l.getShallow("show"),m=h.getShallow("show"),y=this.childOfName("label");if((v||m)&&(p=c||"#000",g=n.getFormattedLabel(e,"normal",t.dataType),null==g)){var x=n.getRawValue(e);g=null==x?t.getName(e):isFinite(x)?$a(x):x}var _=v?g:null,w=m?D(n.getFormattedLabel(e,"emphasis",t.dataType),g):null,b=y.style;(null!=_||null!=w)&&(ba(y.style,l,{text:_},{autoColor:p}),y.__textAlign=b.textAlign,y.__verticalAlign=b.textVerticalAlign,y.__position=l.get("position")||"middle"),y.hoverStyle=null!=w?{text:w,textFill:h.getTextColor(!0),fontStyle:h.getShallow("fontStyle"),fontWeight:h.getShallow("fontWeight"),fontSize:h.getShallow("fontSize"),fontFamily:h.getShallow("fontFamily")}:{text:null},y.ignore=!v&&!m,xa(this)},GM.highlight=function(){this.trigger("emphasis")},GM.downplay=function(){this.trigger("normal")},GM.updateLayout=function(t,e){this.setLinePoints(t.getItemLayout(e))},GM.setLinePoints=function(t){var e=this.childOfName("line");Wf(e.shape,t),e.dirty()},u(Hf,lv);var HM=Zf.prototype;HM.isPersistent=function(){return!0},HM.updateData=function(t){var e=this,i=e.group,n=e._lineData;e._lineData=t,n||i.removeAll();var r=jf(t);t.diff(n).add(function(i){Xf(e,t,i,r)}).update(function(i,a){Yf(e,n,t,a,i,r)}).remove(function(t){i.remove(n.getItemGraphicEl(t))}).execute()},HM.updateLayout=function(){var t=this._lineData;t&&t.eachItemGraphicEl(function(e,i){e.updateLayout(t,i)},this)},HM.incrementalPrepareUpdate=function(t){this._seriesScope=jf(t),this._lineData=null,this.group.removeAll()},HM.incrementalUpdate=function(t,e){function i(t){t.isGroup||(t.incremental=t.useHoverLayer=!0)}for(var n=t.start;n=0&&"number"==typeof c&&(c=+c.toFixed(Math.min(m,20))),g.coord[f]=v.coord[f]=c,a=[g,v,{type:l,valueIndex:a.valueIndex,value:c}]}return a=[Df(t,a[0]),Df(t,a[1]),o({},a[2])],a[2].type=a[2].type||"",r(a[2],a[0]),r(a[2],a[1]),a};BM.extend({type:"markLine",updateTransform:function(t,e,i){e.eachSeries(function(t){var e=t.markLineModel;if(e){var n=e.getData(),r=e.__from,a=e.__to;r.each(function(e){Jf(r,e,!0,t,i),Jf(a,e,!1,t,i)}),n.each(function(t){n.setItemLayout(t,[r.getItemLayout(t),a.getItemLayout(t)])}),this.markerGroupMap.get(t.id).updateLayout()}},this)},renderSeries:function(t,e,i,n){function r(e,i,r){var a=e.getItemModel(i);Jf(e,i,r,t,n),e.setItemVisual(i,{symbolSize:a.get("symbolSize")||g[r?0:1],symbol:a.get("symbol",!0)||p[r?0:1],color:a.get("itemStyle.color")||s.getVisual("color")})}var a=t.coordinateSystem,o=t.id,s=t.getData(),l=this.markerGroupMap,h=l.get(o)||l.set(o,new Zf);this.group.add(h.group);var u=tp(a,t,e),c=u.from,d=u.to,f=u.line;e.__from=c,e.__to=d,e.setData(f);var p=e.get("symbol"),g=e.get("symbolSize");_(p)||(p=[p,p]),"number"==typeof g&&(g=[g,g]),u.from.each(function(t){r(c,t,!0),r(d,t,!1)}),f.each(function(t){var e=f.getItemModel(t).get("lineStyle.color");f.setItemVisual(t,{color:e||c.getItemVisual(t,"color")}),f.setItemLayout(t,[c.getItemLayout(t),d.getItemLayout(t)]),f.setItemVisual(t,{fromSymbolSize:c.getItemVisual(t,"symbolSize"),fromSymbol:c.getItemVisual(t,"symbol"),toSymbolSize:d.getItemVisual(t,"symbolSize"),toSymbol:d.getItemVisual(t,"symbol")})}),h.updateData(f),u.line.eachItemGraphicEl(function(t){t.traverse(function(t){t.dataModel=e})}),h.__keep=!0,h.group.silent=e.get("silent")||t.get("silent")}}),Yl(function(t){t.markLine=t.markLine||{}}),OM.extend({type:"markArea",defaultOption:{zlevel:0,z:1,tooltip:{trigger:"item"},animation:!1,label:{show:!0,position:"top"},itemStyle:{borderWidth:0},emphasis:{label:{show:!0,position:"top"}}}});var XM=function(t,e,i,n){var r=Df(t,n[0]),o=Df(t,n[1]),s=A,l=r.coord,h=o.coord;l[0]=s(l[0],-1/0),l[1]=s(l[1],-1/0),h[0]=s(h[0],1/0),h[1]=s(h[1],1/0);var u=a([{},r,o]);return u.coord=[r.coord,o.coord],u.x0=r.x,u.y0=r.y,u.x1=o.x,u.y1=o.y,u},YM=[["x0","y0"],["x1","y0"],["x1","y1"],["x0","y1"]];BM.extend({type:"markArea",updateTransform:function(t,e,i){e.eachSeries(function(t){var e=t.markAreaModel;if(e){var n=e.getData();n.each(function(e){var r=p(YM,function(r){return rp(n,e,r,t,i)});n.setItemLayout(e,r);var a=n.getItemGraphicEl(e);a.setShape("points",r)})}},this)},renderSeries:function(t,e,i,n){var r=t.coordinateSystem,a=t.id,o=t.getData(),l=this.markerGroupMap,h=l.get(a)||l.set(a,{group:new lv});this.group.add(h.group),h.__keep=!0;var u=ap(r,t,e);e.setData(u),u.each(function(e){u.setItemLayout(e,p(YM,function(i){return rp(u,e,i,t,n)})),u.setItemVisual(e,{color:o.getVisual("color")})}),u.diff(h.__data).add(function(t){var e=new Cy({shape:{points:u.getItemLayout(t)}});u.setItemGraphicEl(t,e),h.group.add(e)}).update(function(t,i){var n=h.__data.getItemGraphicEl(i);La(n,{shape:{points:u.getItemLayout(t)}},e,t),h.group.add(n),u.setItemGraphicEl(t,n)}).remove(function(t){var e=h.__data.getItemGraphicEl(t);h.group.remove(e)}).execute(),u.eachItemGraphicEl(function(t,i){var n=u.getItemModel(i),r=n.getModel("label"),a=n.getModel("emphasis.label"),o=u.getItemVisual(i,"color");t.useStyle(s(n.getModel("itemStyle").getItemStyle(),{fill:Ke(o,.4),stroke:o})),t.hoverStyle=n.getModel("emphasis.itemStyle").getItemStyle(),wa(t.style,t.hoverStyle,r,a,{labelFetcher:e,labelDataIndex:i,defaultText:u.getName(i)||"",isRectText:!0,autoColor:o}),xa(t,{}),t.dataModel=e}),h.__data=u,h.group.silent=e.get("silent")||t.get("silent")}}),Yl(function(t){t.markArea=t.markArea||{}});var jM=function(t){var e=t&&t.timeline;_(e)||(e=e?[e]:[]),f(e,function(t){t&&op(t)})};yx.registerSubTypeDefaulter("timeline",function(){return"slider"}),Ul({type:"timelineChange",event:"timelineChanged",update:"prepareAndUpdate"},function(t,e){var i=e.getComponent("timeline");return i&&null!=t.currentIndex&&(i.setCurrentIndex(t.currentIndex),!i.get("loop",!0)&&i.isIndexMax()&&i.setPlayState(!1)),e.resetOption("timeline"),s({currentIndex:i.option.currentIndex},t)}),Ul({type:"timelinePlayChange",event:"timelinePlayChanged",update:"update"},function(t,e){var i=e.getComponent("timeline");i&&null!=t.playState&&i.setPlayState(t.playState)});var qM=yx.extend({type:"timeline",layoutMode:"box",defaultOption:{zlevel:0,z:4,show:!0,axisType:"time",realtime:!0,left:"20%",top:null,right:"20%",bottom:0,width:null,height:40,padding:5,controlPosition:"left",autoPlay:!1,rewind:!1,loop:!0,playInterval:2e3,currentIndex:0,itemStyle:{},label:{color:"#000"},data:[]},init:function(t,e,i){this._data,this._names,this.mergeDefaultAndTheme(t,i),this._initData()},mergeOption:function(){qM.superApply(this,"mergeOption",arguments),this._initData()},setCurrentIndex:function(t){null==t&&(t=this.option.currentIndex);var e=this._data.count();this.option.loop?t=(t%e+e)%e:(t>=e&&(t=e-1),0>t&&(t=0)),this.option.currentIndex=t},getCurrentIndex:function(){return this.option.currentIndex},isIndexMax:function(){return this.getCurrentIndex()>=this._data.count()-1},setPlayState:function(t){this.option.autoPlay=!!t},getPlayState:function(){return!!this.option.autoPlay},_initData:function(){var t=this.option,e=t.data||[],i=t.axisType,r=this._names=[];if("category"===i){var a=[];f(e,function(t,e){var i,o=Vn(t);S(t)?(i=n(t),i.value=e):i=e,a.push(i),b(o)||null!=o&&!isNaN(o)||(o=""),r.push(o+"")}),e=a}var o={category:"ordinal",time:"time"}[i]||"number",s=this._data=new Bw([{name:"value",type:o}],this);s.initData(e,r)},getData:function(){return this._data},getCategories:function(){return"category"===this.get("axisType")?this._names.slice():void 0}}),UM=qM.extend({type:"timeline.slider",defaultOption:{backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,orient:"horizontal",inverse:!1,tooltip:{trigger:"item"},symbol:"emptyCircle",symbolSize:10,lineStyle:{show:!0,width:2,color:"#304654"},label:{position:"auto",show:!0,interval:"auto",rotate:0,color:"#304654"},itemStyle:{color:"#304654",borderWidth:1},checkpointStyle:{symbol:"circle",symbolSize:13,color:"#c23531",borderWidth:5,borderColor:"rgba(194,53,49, 0.5)",animation:!0,animationDuration:300,animationEasing:"quinticInOut"},controlStyle:{show:!0,showPlayBtn:!0,showPrevBtn:!0,showNextBtn:!0,itemSize:22,itemGap:12,position:"left",playIcon:"path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z",stopIcon:"path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z",nextIcon:"path://M18.6,50.8l22.5-22.5c0.2-0.2,0.3-0.4,0.3-0.7c0-0.3-0.1-0.5-0.3-0.7L18.7,4.4c-0.1-0.1-0.2-0.3-0.2-0.5 c0-0.4,0.3-0.8,0.8-0.8c0.2,0,0.5,0.1,0.6,0.3l23.5,23.5l0,0c0.2,0.2,0.3,0.4,0.3,0.7c0,0.3-0.1,0.5-0.3,0.7l-0.1,0.1L19.7,52 c-0.1,0.1-0.3,0.2-0.5,0.2c-0.4,0-0.8-0.3-0.8-0.8C18.4,51.2,18.5,51,18.6,50.8z",prevIcon:"path://M43,52.8L20.4,30.3c-0.2-0.2-0.3-0.4-0.3-0.7c0-0.3,0.1-0.5,0.3-0.7L42.9,6.4c0.1-0.1,0.2-0.3,0.2-0.5 c0-0.4-0.3-0.8-0.8-0.8c-0.2,0-0.5,0.1-0.6,0.3L18.3,28.8l0,0c-0.2,0.2-0.3,0.4-0.3,0.7c0,0.3,0.1,0.5,0.3,0.7l0.1,0.1L41.9,54 c0.1,0.1,0.3,0.2,0.5,0.2c0.4,0,0.8-0.3,0.8-0.8C43.2,53.2,43.1,53,43,52.8z",color:"#304654",borderColor:"#304654",borderWidth:1},emphasis:{label:{show:!0,color:"#c23531"},itemStyle:{color:"#c23531"},controlStyle:{color:"#c23531",borderColor:"#c23531",borderWidth:2}},data:[]}});c(UM,i_);var $M=s_.extend({type:"timeline"}),KM=function(t,e,i,n){Pb.call(this,t,e,i),this.type=n||"value",this.model=null};KM.prototype={constructor:KM,getLabelModel:function(){return this.model.getModel("label")},isHorizontal:function(){return"horizontal"===this.model.get("orient")}},u(KM,Pb);var QM=y,JM=f,tI=Math.PI;$M.extend({type:"timeline.slider",init:function(t,e){this.api=e,this._axis,this._viewRect,this._timer,this._currentPointer,this._mainGroup,this._labelGroup},render:function(t,e,i){if(this.model=t,this.api=i,this.ecModel=e,this.group.removeAll(),t.get("show",!0)){var n=this._layout(t,i),r=this._createGroup("mainGroup"),a=this._createGroup("labelGroup"),o=this._axis=this._createAxis(n,t);t.formatTooltip=function(t){return po(o.scale.getLabel(t))},JM(["AxisLine","AxisTick","Control","CurrentPointer"],function(e){this["_render"+e](n,r,o,t)},this),this._renderAxisLabel(n,a,o,t),this._position(n,t)}this._doPlayStop()},remove:function(){this._clearTimer(),this.group.removeAll()},dispose:function(){this._clearTimer()},_layout:function(t,e){var i=t.get("label.position"),n=t.get("orient"),r=hp(t,e);null==i||"auto"===i?i="horizontal"===n?r.y+r.height/2=0||"+"===i?"left":"right"},o={horizontal:i>=0||"+"===i?"top":"bottom",vertical:"middle"},s={horizontal:0,vertical:tI/2},l="vertical"===n?r.height:r.width,h=t.getModel("controlStyle"),u=h.get("show",!0),c=u?h.get("itemSize"):0,d=u?h.get("itemGap"):0,f=c+d,p=t.get("label.rotate")||0;p=p*tI/180;var g,v,m,y,x=h.get("position",!0),_=u&&h.get("showPlayBtn",!0),w=u&&h.get("showPrevBtn",!0),b=u&&h.get("showNextBtn",!0),S=0,M=l;return"left"===x||"bottom"===x?(_&&(g=[0,0],S+=f),w&&(v=[S,0],S+=f),b&&(m=[M-c,0],M-=f)):(_&&(g=[M-c,0],M-=f),w&&(v=[0,0],S+=f),b&&(m=[M-c,0],M-=f)),y=[S,M],t.get("inverse")&&y.reverse(),{viewRect:r,mainLength:l,orient:n,rotation:s[n],labelRotation:p,labelPosOpt:i,labelAlign:t.get("label.align")||a[n],labelBaseline:t.get("label.verticalAlign")||t.get("label.baseline")||o[n],playPosition:g,prevBtnPosition:v,nextBtnPosition:m,axisExtent:y,controlSize:c,controlGap:d}},_position:function(t){function e(t){var e=t.position;t.origin=[u[0][0]-e[0],u[1][0]-e[1]]}function i(t){return[[t.x,t.x+t.width],[t.y,t.y+t.height]]}function n(t,e,i,n,r){t[n]+=i[n][r]-e[n][r]}var r=this._mainGroup,a=this._labelGroup,o=t.viewRect;if("vertical"===t.orient){var s=be(),l=o.x,h=o.y+o.height;Te(s,s,[-l,-h]),Ce(s,s,-tI/2),Te(s,s,[l,h]),o=o.clone(),o.applyTransform(s)}var u=i(o),c=i(r.getBoundingRect()),d=i(a.getBoundingRect()),f=r.position,p=a.position;p[0]=f[0]=u[0][0];var g=t.labelPosOpt;if(isNaN(g)){var v="+"===g?0:1;n(f,c,u,1,v),n(p,d,u,1,1-v)}else{var v=g>=0?0:1;n(f,c,u,1,v),p[1]=f[1]+g}r.attr("position",f),a.attr("position",p),r.rotation=a.rotation=t.rotation,e(r),e(a)},_createAxis:function(t,e){var i=e.getData(),n=e.get("axisType"),r=ou(e,n);r.getTicks=function(){return i.mapArray(["value"],function(t){return t})};var a=i.getDataExtent("value");r.setExtent(a[0],a[1]),r.niceTicks();var o=new KM("value",r,t.axisExtent,n);return o.model=e,o},_createGroup:function(t){var e=this["_"+t]=new lv;return this.group.add(e),e},_renderAxisLine:function(t,e,i,n){var r=i.getExtent();n.get("lineStyle.show")&&e.add(new ky({shape:{x1:r[0],y1:0,x2:r[1],y2:0},style:o({lineCap:"round"},n.getModel("lineStyle").getLineStyle()),silent:!0,z2:1}))},_renderAxisTick:function(t,e,i,n){var r=n.getData(),a=i.scale.getTicks();JM(a,function(t){var a=i.dataToCoord(t),o=r.getItemModel(t),s=o.getModel("itemStyle"),l=o.getModel("emphasis.itemStyle"),h={position:[a,0],onclick:QM(this._changeTimeline,this,t)},u=cp(o,s,e,h);xa(u,l.getItemStyle()),o.get("tooltip")?(u.dataIndex=t,u.dataModel=n):u.dataIndex=u.dataModel=null},this)},_renderAxisLabel:function(t,e,i,n){var r=i.getLabelModel();if(r.get("show")){var a=n.getData(),o=i.getViewLabels();JM(o,function(n){var r=n.tickValue,o=a.getItemModel(r),s=o.getModel("label"),l=o.getModel("emphasis.label"),h=i.dataToCoord(n.tickValue),u=new xy({position:[h,0],rotation:t.labelRotation-t.rotation,onclick:QM(this._changeTimeline,this,r),silent:!1});ba(u.style,s,{text:n.formattedLabel,textAlign:t.labelAlign,textVerticalAlign:t.labelBaseline}),e.add(u),xa(u,ba({},l))},this)}},_renderControl:function(t,e,i,n){function r(t,i,r,u){if(t){var c={position:t,origin:[a/2,0],rotation:u?-o:0,rectHover:!0,style:s,onclick:r},d=up(n,i,h,c);e.add(d),xa(d,l)}}var a=t.controlSize,o=t.rotation,s=n.getModel("controlStyle").getItemStyle(),l=n.getModel("emphasis.controlStyle").getItemStyle(),h=[0,-a/2,a,a],u=n.getPlayState(),c=n.get("inverse",!0);r(t.nextBtnPosition,"controlStyle.nextIcon",QM(this._changeTimeline,this,c?"-":"+")),r(t.prevBtnPosition,"controlStyle.prevIcon",QM(this._changeTimeline,this,c?"+":"-")),r(t.playPosition,"controlStyle."+(u?"stopIcon":"playIcon"),QM(this._handlePlayClick,this,!u),!0)},_renderCurrentPointer:function(t,e,i,n){var r=n.getData(),a=n.getCurrentIndex(),o=r.getItemModel(a).getModel("checkpointStyle"),s=this,l={onCreate:function(t){t.draggable=!0,t.drift=QM(s._handlePointerDrag,s),t.ondragend=QM(s._handlePointerDragend,s),dp(t,a,i,n,!0)},onUpdate:function(t){dp(t,a,i,n)}};this._currentPointer=cp(o,o,this._mainGroup,{},this._currentPointer,l)},_handlePlayClick:function(t){this._clearTimer(),this.api.dispatchAction({type:"timelinePlayChange",playState:t,from:this.uid})},_handlePointerDrag:function(t,e,i){this._clearTimer(),this._pointerChangeTimeline([i.offsetX,i.offsetY])},_handlePointerDragend:function(t){this._pointerChangeTimeline([t.offsetX,t.offsetY],!0)},_pointerChangeTimeline:function(t,e){var i=this._toAxisCoord(t)[0],n=this._axis,r=Ka(n.getExtent().slice());i>r[1]&&(i=r[1]),is&&(n=s,e=a)}),e},_clearTimer:function(){this._timer&&(clearTimeout(this._timer),this._timer=null)},_changeTimeline:function(t){var e=this.model.getCurrentIndex();"+"===t?t=e+1:"-"===t&&(t=e-1),this.api.dispatchAction({type:"timelineChange",currentIndex:t,from:this.uid})}}),Yl(jM),yx.registerSubTypeDefaulter("dataZoom",function(){return"slider"});var eI=["x","y","z","radius","angle","single"],iI=["cartesian2d","polar","singleAxis"],nI=pp(eI,["axisIndex","axis","index","id"]),rI=f,aI=Ka,oI=function(t,e,i,n){this._dimName=t,this._axisIndex=e,this._valueWindow,this._percentWindow,this._dataExtent,this._minMaxSpan,this.ecModel=n,this._dataZoomModel=i};oI.prototype={constructor:oI,hostedBy:function(t){return this._dataZoomModel===t},getDataValueWindow:function(){return this._valueWindow.slice()},getDataPercentWindow:function(){return this._percentWindow.slice()},getTargetSeriesModels:function(){var t=[],e=this.ecModel;return e.eachSeries(function(i){if(fp(i.get("coordinateSystem"))){var n=this._dimName,r=e.queryComponents({mainType:n+"Axis",index:i.get(n+"AxisIndex"),id:i.get(n+"AxisId")})[0];this._axisIndex===(r&&r.componentIndex)&&t.push(i)}},this),t},getAxisModel:function(){return this.ecModel.getComponent(this._dimName+"Axis",this._axisIndex)},getOtherAxisModel:function(){var t,e,i=this._dimName,n=this.ecModel,r=this.getAxisModel(),a="x"===i||"y"===i;a?(e="gridIndex",t="x"===i?"y":"x"):(e="polarIndex",t="angle"===i?"radius":"angle");var o;return n.eachComponent(t+"Axis",function(t){(t.get(e)||0)===(r.get(e)||0)&&(o=t)}),o},getMinMaxSpan:function(){return n(this._minMaxSpan)},calculateDataWindow:function(t){var e=this._dataExtent,i=this.getAxisModel(),n=i.axis.scale,r=this._dataZoomModel.getRangePropMode(),a=[0,100],o=[t.start,t.end],s=[];return rI(["startValue","endValue"],function(e){s.push(null!=t[e]?n.parse(t[e]):null)}),rI([0,1],function(t){var i=s[t],l=o[t];"percent"===r[t]?(null==l&&(l=a[t]),i=n.parse(qa(l,a,e,!0))):l=qa(i,e,a,!0),s[t]=i,o[t]=l}),{valueWindow:aI(s),percentWindow:aI(o)}},reset:function(t){if(t===this._dataZoomModel){var e=this.getTargetSeriesModels();this._dataExtent=vp(this,this._dimName,e);var i=this.calculateDataWindow(t.option);this._valueWindow=i.valueWindow,this._percentWindow=i.percentWindow,xp(this),yp(this)}},restore:function(t){t===this._dataZoomModel&&(this._valueWindow=this._percentWindow=null,yp(this,!0))},filterData:function(t){function e(t){return t>=a[0]&&t<=a[1]}if(t===this._dataZoomModel){var i=this._dimName,n=this.getTargetSeriesModels(),r=t.get("filterMode"),a=this._valueWindow;"none"!==r&&rI(n,function(t){var n=t.getData(),o=n.mapDimension(i,!0);o.length&&("weakFilter"===r?n.filterSelf(function(t){for(var e,i,r,s=0;sa[1];if(h&&!u&&!c)return!0;h&&(r=!0),u&&(e=!0),c&&(i=!0)}return r&&e&&i}):rI(o,function(i){if("empty"===r)t.setData(n.map(i,function(t){return e(t)?t:0/0}));else{var o={};o[i]=a,n.selectRange(o)}}),rI(o,function(t){n.setApproximateExtent(a,t)}))})}}};var sI=f,lI=nI,hI=ih({type:"dataZoom",dependencies:["xAxis","yAxis","zAxis","radiusAxis","angleAxis","singleAxis","series"],defaultOption:{zlevel:0,z:4,orient:null,xAxisIndex:null,yAxisIndex:null,filterMode:"filter",throttle:null,start:0,end:100,startValue:null,endValue:null,minSpan:null,maxSpan:null,minValueSpan:null,maxValueSpan:null,rangeMode:null},init:function(t,e,i){this._dataIntervalByAxis={},this._dataInfo={},this._axisProxies={},this.textStyleModel,this._autoThrottle=!0,this._rangePropMode=["percent","percent"];var n=_p(t);this.mergeDefaultAndTheme(t,i),this.doInit(n)},mergeOption:function(t){var e=_p(t);r(this.option,t,!0),this.doInit(e)},doInit:function(t){var e=this.option;tg.canvasSupported||(e.realtime=!1),this._setDefaultThrottle(t),wp(this,t),sI([["start","startValue"],["end","endValue"]],function(t,i){"value"===this._rangePropMode[i]&&(e[t[0]]=null)},this),this.textStyleModel=this.getModel("textStyle"),this._resetTarget(),this._giveAxisProxies()},_giveAxisProxies:function(){var t=this._axisProxies;this.eachTargetAxis(function(e,i,n,r){var a=this.dependentModels[e.axis][i],o=a.__dzAxisProxy||(a.__dzAxisProxy=new oI(e.name,i,this,r));t[e.name+"_"+i]=o},this)},_resetTarget:function(){var t=this.option,e=this._judgeAutoMode();lI(function(e){var i=e.axisIndex;t[i]=Nn(t[i])},this),"axisIndex"===e?this._autoSetAxisIndex():"orient"===e&&this._autoSetOrient()},_judgeAutoMode:function(){var t=this.option,e=!1;lI(function(i){null!=t[i.axisIndex]&&(e=!0)},this);var i=t.orient;return null==i&&e?"orient":e?void 0:(null==i&&(t.orient="horizontal"),"axisIndex")},_autoSetAxisIndex:function(){var t=!0,e=this.get("orient",!0),i=this.option,n=this.dependentModels;if(t){var r="vertical"===e?"y":"x";n[r+"Axis"].length?(i[r+"AxisIndex"]=[0],t=!1):sI(n.singleAxis,function(n){t&&n.get("orient",!0)===e&&(i.singleAxisIndex=[n.componentIndex],t=!1)})}t&&lI(function(e){if(t){var n=[],r=this.dependentModels[e.axis];if(r.length&&!n.length)for(var a=0,o=r.length;o>a;a++)"category"===r[a].get("type")&&n.push(a);i[e.axisIndex]=n,n.length&&(t=!1)}},this),t&&this.ecModel.eachSeries(function(t){this._isSeriesHasAllAxesTypeOf(t,"value")&&lI(function(e){var n=i[e.axisIndex],r=t.get(e.axisIndex),a=t.get(e.axisId),o=t.ecModel.queryComponents({mainType:e.axis,index:r,id:a})[0];r=o.componentIndex,h(n,r)<0&&n.push(r)})},this)},_autoSetOrient:function(){var t;this.eachTargetAxis(function(e){!t&&(t=e.name)},this),this.option.orient="y"===t?"vertical":"horizontal"},_isSeriesHasAllAxesTypeOf:function(t,e){var i=!0;return lI(function(n){var r=t.get(n.axisIndex),a=this.dependentModels[n.axis][r];a&&a.get("type")===e||(i=!1)},this),i},_setDefaultThrottle:function(t){if(t.hasOwnProperty("throttle")&&(this._autoThrottle=!1),this._autoThrottle){var e=this.ecModel.option;this.option.throttle=e.animation&&e.animationDurationUpdate>0?100:20}},getFirstTargetAxisModel:function(){var t;return lI(function(e){if(null==t){var i=this.get(e.axisIndex);i.length&&(t=this.dependentModels[e.axis][i[0]])}},this),t},eachTargetAxis:function(t,e){var i=this.ecModel;lI(function(n){sI(this.get(n.axisIndex),function(r){t.call(e,n,r,this,i)},this)},this)},getAxisProxy:function(t,e){return this._axisProxies[t+"_"+e]},getAxisModel:function(t,e){var i=this.getAxisProxy(t,e);return i&&i.getAxisModel()},setRawRange:function(t,e){var i=this.option;sI([["start","startValue"],["end","endValue"]],function(e){(null!=t[e[0]]||null!=t[e[1]])&&(i[e[0]]=t[e[0]],i[e[1]]=t[e[1]])},this),!e&&wp(this,t)},getPercentRange:function(){var t=this.findRepresentativeAxisProxy();return t?t.getDataPercentWindow():void 0},getValueRange:function(t,e){if(null!=t||null!=e)return this.getAxisProxy(t,e).getDataValueWindow();var i=this.findRepresentativeAxisProxy();return i?i.getDataValueWindow():void 0},findRepresentativeAxisProxy:function(t){if(t)return t.__dzAxisProxy;var e=this._axisProxies;for(var i in e)if(e.hasOwnProperty(i)&&e[i].hostedBy(this))return e[i];for(var i in e)if(e.hasOwnProperty(i)&&!e[i].hostedBy(this))return e[i]},getRangePropMode:function(){return this._rangePropMode.slice()}}),uI=s_.extend({type:"dataZoom",render:function(t,e,i){this.dataZoomModel=t,this.ecModel=e,this.api=i},getTargetCoordInfo:function(){function t(t,e,i,n){for(var r,a=0;aa&&(e[1-n]=e[n]+u.sign*a),e}),dI=Dy,fI=qa,pI=Ka,gI=y,vI=f,mI=7,yI=1,xI=30,_I="horizontal",wI="vertical",bI=5,SI=["line","bar","candlestick","scatter"],MI=uI.extend({type:"dataZoom.slider",init:function(t,e){this._displayables={},this._orient,this._range,this._handleEnds,this._size,this._handleWidth,this._handleHeight,this._location,this._dragging,this._dataShadowInfo,this.api=e},render:function(t,e,i,n){return MI.superApply(this,"render",arguments),Hs(this,"_dispatchZoomAction",this.dataZoomModel.get("throttle"),"fixRate"),this._orient=t.get("orient"),this.dataZoomModel.get("show")===!1?void this.group.removeAll():(n&&"dataZoom"===n.type&&n.from===this.uid||this._buildView(),void this._updateView())},remove:function(){MI.superApply(this,"remove",arguments),Zs(this,"_dispatchZoomAction")},dispose:function(){MI.superApply(this,"dispose",arguments),Zs(this,"_dispatchZoomAction")},_buildView:function(){var t=this.group;t.removeAll(),this._resetLocation(),this._resetInterval();var e=this._displayables.barGroup=new lv;this._renderBackground(),this._renderHandle(),this._renderDataShadow(),t.add(e),this._positionGroup()},_resetLocation:function(){var t=this.dataZoomModel,e=this.api,i=this._findCoordRect(),n={width:e.getWidth(),height:e.getHeight()},r=this._orient===_I?{right:n.width-i.x-i.width,top:n.height-xI-mI,width:i.width,height:xI}:{right:mI,top:i.y,width:xI,height:i.height},a=Mo(t.option);f(["right","top","width","height"],function(t){"ph"===a[t]&&(a[t]=r[t])});var o=bo(a,n,t.padding);this._location={x:o.x,y:o.y},this._size=[o.width,o.height],this._orient===wI&&this._size.reverse()},_positionGroup:function(){var t=this.group,e=this._location,i=this._orient,n=this.dataZoomModel.getFirstTargetAxisModel(),r=n&&n.get("inverse"),a=this._displayables.barGroup,o=(this._dataShadowInfo||{}).otherAxisInverse;a.attr(i!==_I||r?i===_I&&r?{scale:o?[-1,1]:[-1,-1]}:i!==wI||r?{scale:o?[-1,-1]:[-1,1],rotation:Math.PI/2}:{scale:o?[1,-1]:[1,1],rotation:Math.PI/2}:{scale:o?[1,1]:[1,-1]});var s=t.getBoundingRect([a]);t.attr("position",[e.x-s.x,e.y-s.y])},_getViewExtent:function(){return[0,this._size[0]]},_renderBackground:function(){var t=this.dataZoomModel,e=this._size,i=this._displayables.barGroup;i.add(new dI({silent:!0,shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:t.get("backgroundColor")},z2:-40})),i.add(new dI({shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:"transparent"},z2:0,onclick:y(this._onClickPanelClick,this)}))},_renderDataShadow:function(){var t=this._dataShadowInfo=this._prepareDataShadowInfo();if(t){var e=this._size,i=t.series,n=i.getRawData(),r=i.getShadowDim?i.getShadowDim():t.otherDim;if(null!=r){var a=n.getDataExtent(r),o=.3*(a[1]-a[0]);a=[a[0]-o,a[1]+o];var l,h=[0,e[1]],u=[0,e[0]],c=[[e[0],0],[0,0]],d=[],f=u[1]/(n.count()-1),p=0,g=Math.round(n.count()/e[0]);n.each([r],function(t,e){if(g>0&&e%g)return void(p+=f);var i=null==t||isNaN(t)||""===t,n=i?0:fI(t,a,h,!0);i&&!l&&e?(c.push([c[c.length-1][0],0]),d.push([d[d.length-1][0],0])):!i&&l&&(c.push([p,0]),d.push([p,0])),c.push([p,n]),d.push([p,n]),p+=f,l=i});var v=this.dataZoomModel;this._displayables.barGroup.add(new Cy({shape:{points:c},style:s({fill:v.get("dataBackgroundColor")},v.getModel("dataBackground.areaStyle").getAreaStyle()),silent:!0,z2:-20})),this._displayables.barGroup.add(new Ay({shape:{points:d},style:v.getModel("dataBackground.lineStyle").getLineStyle(),silent:!0,z2:-19}))}}},_prepareDataShadowInfo:function(){var t=this.dataZoomModel,e=t.get("showDataShadow");if(e!==!1){var i,n=this.ecModel;return t.eachTargetAxis(function(r,a){var o=t.getAxisProxy(r.name,a).getTargetSeriesModels();f(o,function(t){if(!(i||e!==!0&&h(SI,t.get("type"))<0)){var o,s=n.getComponent(r.axis,a).axis,l=Mp(r.name),u=t.coordinateSystem;null!=l&&u.getOtherAxis&&(o=u.getOtherAxis(s).inverse),l=t.getData().mapDimension(l),i={thisAxis:s,series:t,thisDim:r.name,otherDim:l,otherAxisInverse:o}}},this)},this),i}},_renderHandle:function(){var t=this._displayables,e=t.handles=[],i=t.handleLabels=[],n=this._displayables.barGroup,r=this._size,a=this.dataZoomModel;n.add(t.filler=new dI({draggable:!0,cursor:Ip(this._orient),drift:gI(this._onDragMove,this,"all"),onmousemove:function(t){Ig(t.event)},ondragstart:gI(this._showDataInfo,this,!0),ondragend:gI(this._onDragEnd,this),onmouseover:gI(this._showDataInfo,this,!0),onmouseout:gI(this._showDataInfo,this,!1),style:{fill:a.get("fillerColor"),textPosition:"inside"}})),n.add(new dI(na({silent:!0,shape:{x:0,y:0,width:r[0],height:r[1]},style:{stroke:a.get("dataBackgroundColor")||a.get("borderColor"),lineWidth:yI,fill:"rgba(0,0,0,0)"}}))),vI([0,1],function(t){var r=Va(a.get("handleIcon"),{cursor:Ip(this._orient),draggable:!0,drift:gI(this._onDragMove,this,t),onmousemove:function(t){Ig(t.event) + },ondragend:gI(this._onDragEnd,this),onmouseover:gI(this._showDataInfo,this,!0),onmouseout:gI(this._showDataInfo,this,!1)},{x:-1,y:0,width:2,height:2}),o=r.getBoundingRect();this._handleHeight=Ua(a.get("handleSize"),this._size[1]),this._handleWidth=o.width/o.height*this._handleHeight,r.setStyle(a.getModel("handleStyle").getItemStyle());var s=a.get("handleColor");null!=s&&(r.style.fill=s),n.add(e[t]=r);var l=a.textStyleModel;this.group.add(i[t]=new xy({silent:!0,invisible:!0,style:{x:0,y:0,text:"",textVerticalAlign:"middle",textAlign:"center",textFill:l.getTextColor(),textFont:l.getFont()},z2:10}))},this)},_resetInterval:function(){var t=this._range=this.dataZoomModel.getPercentRange(),e=this._getViewExtent();this._handleEnds=[fI(t[0],[0,100],e,!0),fI(t[1],[0,100],e,!0)]},_updateInterval:function(t,e){var i=this.dataZoomModel,n=this._handleEnds,r=this._getViewExtent(),a=i.findRepresentativeAxisProxy().getMinMaxSpan(),o=[0,100];cI(e,n,r,i.get("zoomLock")?"all":t,null!=a.minSpan?fI(a.minSpan,o,r,!0):null,null!=a.maxSpan?fI(a.maxSpan,o,r,!0):null);var s=this._range,l=this._range=pI([fI(n[0],r,o,!0),fI(n[1],r,o,!0)]);return!s||s[0]!==l[0]||s[1]!==l[1]},_updateView:function(t){var e=this._displayables,i=this._handleEnds,n=pI(i.slice()),r=this._size;vI([0,1],function(t){var n=e.handles[t],a=this._handleHeight;n.attr({scale:[a/2,a/2],position:[i[t],r[1]/2-a/2]})},this),e.filler.setShape({x:n[0],y:0,width:n[1]-n[0],height:r[1]}),this._updateDataInfo(t)},_updateDataInfo:function(t){function e(t){var e=za(n.handles[t].parent,this.group),i=Ra(0===t?"right":"left",e),s=this._handleWidth/2+bI,l=Ea([c[t]+(0===t?-s:s),this._size[1]/2],e);r[t].setStyle({x:l[0],y:l[1],textVerticalAlign:a===_I?"middle":i,textAlign:a===_I?i:"center",text:o[t]})}var i=this.dataZoomModel,n=this._displayables,r=n.handleLabels,a=this._orient,o=["",""];if(i.get("showDetail")){var s=i.findRepresentativeAxisProxy();if(s){var l=s.getAxisModel().axis,h=this._range,u=t?s.calculateDataWindow({start:h[0],end:h[1]}).valueWindow:s.getDataValueWindow();o=[this._formatLabel(u[0],l),this._formatLabel(u[1],l)]}}var c=pI(this._handleEnds.slice());e.call(this,0),e.call(this,1)},_formatLabel:function(t,e){var i=this.dataZoomModel,n=i.get("labelFormatter"),r=i.get("labelPrecision");(null==r||"auto"===r)&&(r=e.getPixelPrecision());var a=null==t||isNaN(t)?"":"category"===e.type||"time"===e.type?e.scale.getLabel(Math.round(t)):t.toFixed(Math.min(r,20));return w(n)?n(t,a):b(n)?n.replace("{value}",a):a},_showDataInfo:function(t){t=this._dragging||t;var e=this._displayables.handleLabels;e[0].attr("invisible",!t),e[1].attr("invisible",!t)},_onDragMove:function(t,e,i){this._dragging=!0;var n=this._displayables.barGroup.getLocalTransform(),r=Ea([e,i],n,!0),a=this._updateInterval(t,r[0]),o=this.dataZoomModel.get("realtime");this._updateView(!o),a&&o&&this._dispatchZoomAction()},_onDragEnd:function(){this._dragging=!1,this._showDataInfo(!1);var t=this.dataZoomModel.get("realtime");!t&&this._dispatchZoomAction()},_onClickPanelClick:function(t){var e=this._size,i=this._displayables.barGroup.transformCoordToLocal(t.offsetX,t.offsetY);if(!(i[0]<0||i[0]>e[0]||i[1]<0||i[1]>e[1])){var n=this._handleEnds,r=(n[0]+n[1])/2,a=this._updateInterval("all",i[0]-r);this._updateView(),a&&this._dispatchZoomAction()}},_dispatchZoomAction:function(){var t=this._range;this.api.dispatchAction({type:"dataZoom",from:this.uid,dataZoomId:this.dataZoomModel.id,start:t[0],end:t[1]})},_findCoordRect:function(){var t;if(vI(this.getTargetCoordInfo(),function(e){if(!t&&e.length){var i=e[0].model.coordinateSystem;t=i.getRect&&i.getRect()}}),!t){var e=this.api.getWidth(),i=this.api.getHeight();t={x:.2*e,y:.2*i,width:.6*e,height:.6*i}}return t}});hI.extend({type:"dataZoom.inside",defaultOption:{disabled:!1,zoomLock:!1,zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!1,preventDefaultMouseMove:!0}});var II="\x00_ec_interaction_mutex";Ul({type:"takeGlobalCursor",event:"globalCursorTaken",update:"update"},function(){}),c(Ap,bg);var TI="\x00_ec_dataZoom_roams",CI=y,AI=uI.extend({type:"dataZoom.inside",init:function(){this._range},render:function(t,e,i){AI.superApply(this,"render",arguments),this._range=t.getPercentRange(),f(this.getTargetCoordInfo(),function(e,n){var r=p(e,function(t){return Fp(t.model)});f(e,function(e){var a=e.model,o={};f(["pan","zoom","scrollMove"],function(t){o[t]=CI(DI[t],this,e,n)},this),Bp(i,{coordId:Fp(a),allCoordIds:r,containsPoint:function(t,e,i){return a.coordinateSystem.containPoint([e,i])},dataZoomId:t.id,dataZoomModel:t,getRange:o})},this)},this)},dispose:function(){Np(this.api,this.dataZoomModel.id),AI.superApply(this,"dispose",arguments),this._range=null}}),DI={zoom:function(t,e,i,n){var r=this._range,a=r.slice(),o=t.axisModels[0];if(o){var s=kI[e](null,[n.originX,n.originY],o,i,t),l=(s.signal>0?s.pixelStart+s.pixelLength-s.pixel:s.pixel-s.pixelStart)/s.pixelLength*(a[1]-a[0])+a[0],h=Math.max(1/n.scale,0);a[0]=(a[0]-l)*h+l,a[1]=(a[1]-l)*h+l;var u=this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();return cI(0,a,[0,100],0,u.minSpan,u.maxSpan),this._range=a,r[0]!==a[0]||r[1]!==a[1]?a:void 0}},pan:Xp(function(t,e,i,n,r,a){var o=kI[n]([a.oldX,a.oldY],[a.newX,a.newY],e,r,i);return o.signal*(t[1]-t[0])*o.pixel/o.pixelLength}),scrollMove:Xp(function(t,e,i,n,r,a){var o=kI[n]([0,0],[a.scrollDelta,a.scrollDelta],e,r,i);return o.signal*(t[1]-t[0])*a.scrollDelta})},kI={grid:function(t,e,i,n,r){var a=i.axis,o={},s=r.model.coordinateSystem.getRect();return t=t||[0,0],"x"===a.dim?(o.pixel=e[0]-t[0],o.pixelLength=s.width,o.pixelStart=s.x,o.signal=a.inverse?1:-1):(o.pixel=e[1]-t[1],o.pixelLength=s.height,o.pixelStart=s.y,o.signal=a.inverse?-1:1),o},polar:function(t,e,i,n,r){var a=i.axis,o={},s=r.model.coordinateSystem,l=s.getRadiusAxis().getExtent(),h=s.getAngleAxis().getExtent();return t=t?s.pointToCoord(t):[0,0],e=s.pointToCoord(e),"radiusAxis"===i.mainType?(o.pixel=e[0]-t[0],o.pixelLength=l[1]-l[0],o.pixelStart=l[0],o.signal=a.inverse?1:-1):(o.pixel=e[1]-t[1],o.pixelLength=h[1]-h[0],o.pixelStart=h[0],o.signal=a.inverse?-1:1),o},singleAxis:function(t,e,i,n,r){var a=i.axis,o=r.model.coordinateSystem.getRect(),s={};return t=t||[0,0],"horizontal"===a.orient?(s.pixel=e[0]-t[0],s.pixelLength=o.width,s.pixelStart=o.x,s.signal=a.inverse?1:-1):(s.pixel=e[1]-t[1],s.pixelLength=o.height,s.pixelStart=o.y,s.signal=a.inverse?-1:1),s}};jl({getTargetSeries:function(t){var e=N();return t.eachComponent("dataZoom",function(t){t.eachTargetAxis(function(t,i,n){var r=n.getAxisProxy(t.name,i);f(r.getTargetSeriesModels(),function(t){e.set(t.uid,t)})})}),e},modifyOutputEnd:!0,overallReset:function(t,e){t.eachComponent("dataZoom",function(t){t.eachTargetAxis(function(t,i,n){n.getAxisProxy(t.name,i).reset(n,e)}),t.eachTargetAxis(function(t,i,n){n.getAxisProxy(t.name,i).filterData(n,e)})}),t.eachComponent("dataZoom",function(t){var e=t.findRepresentativeAxisProxy(),i=e.getDataPercentWindow(),n=e.getDataValueWindow();t.setRawRange({start:i[0],end:i[1],startValue:n[0],endValue:n[1]},!0)})}}),Ul("dataZoom",function(t,e){var i=gp(y(e.eachComponent,e,"dataZoom"),nI,function(t,e){return t.get(e.axisIndex)}),n=[];e.eachComponent({mainType:"dataZoom",query:t},function(t){n.push.apply(n,i(t).nodes)}),f(n,function(e){e.setRawRange({start:t.start,end:t.end,startValue:t.startValue,endValue:t.endValue})})});var PI,LI="urn:schemas-microsoft-com:vml",OI="undefined"==typeof window?null:window,zI=!1,EI=OI&&OI.document;if(EI&&!tg.canvasSupported)try{!EI.namespaces.zrvml&&EI.namespaces.add("zrvml",LI),PI=function(t){return EI.createElement("')}}catch(RI){PI=function(t){return EI.createElement("<"+t+' xmlns="'+LI+'" class="zrvml">')}}var BI=qm.CMD,NI=Math.round,FI=Math.sqrt,VI=Math.abs,WI=Math.cos,GI=Math.sin,HI=Math.max;if(!tg.canvasSupported){var ZI=",",XI="progid:DXImageTransform.Microsoft",YI=21600,jI=YI/2,qI=1e5,UI=1e3,$I=function(t){t.style.cssText="position:absolute;left:0;top:0;width:1px;height:1px;",t.coordsize=YI+","+YI,t.coordorigin="0,0"},KI=function(t){return String(t).replace(/&/g,"&").replace(/"/g,""")},QI=function(t,e,i){return"rgb("+[t,e,i].join(",")+")"},JI=function(t,e){e&&t&&e.parentNode!==t&&t.appendChild(e)},tT=function(t,e){e&&t&&e.parentNode===t&&t.removeChild(e)},eT=function(t,e,i){return(parseFloat(t)||0)*qI+(parseFloat(e)||0)*UI+i},iT=function(t,e){return"string"==typeof t?t.lastIndexOf("%")>=0?parseFloat(t)/100*e:parseFloat(t):t},nT=function(t,e,i){var n=He(e);i=+i,isNaN(i)&&(i=1),n&&(t.color=QI(n[0],n[1],n[2]),t.opacity=i*n[3])},rT=function(t){var e=He(t);return[QI(e[0],e[1],e[2]),e[3]]},aT=function(t,e,i){var n=e.fill;if(null!=n)if(n instanceof Ey){var r,a=0,o=[0,0],s=0,l=1,h=i.getBoundingRect(),u=h.width,c=h.height;if("linear"===n.type){r="gradient";var d=i.transform,f=[n.x*u,n.y*c],p=[n.x2*u,n.y2*c];d&&(ae(f,f,d),ae(p,p,d));var g=p[0]-f[0],v=p[1]-f[1];a=180*Math.atan2(g,v)/Math.PI,0>a&&(a+=360),1e-6>a&&(a=0)}else{r="gradientradial";var f=[n.x*u,n.y*c],d=i.transform,m=i.scale,y=u,x=c;o=[(f[0]-h.x)/y,(f[1]-h.y)/x],d&&ae(f,f,d),y/=m[0]*YI,x/=m[1]*YI;var _=HI(y,x);s=0/_,l=2*n.r/_-s}var w=n.colorStops.slice();w.sort(function(t,e){return t.offset-e.offset});for(var b=w.length,S=[],M=[],I=0;b>I;I++){var T=w[I],C=rT(T.color);M.push(T.offset*l+s+" "+C[0]),(0===I||I===b-1)&&S.push(C)}if(b>=2){var A=S[0][0],D=S[1][0],k=S[0][1]*e.opacity,P=S[1][1]*e.opacity;t.type=r,t.method="none",t.focus="100%",t.angle=a,t.color=A,t.color2=D,t.colors=M.join(","),t.opacity=P,t.opacity2=k}"radial"===r&&(t.focusposition=o.join(","))}else nT(t,n,e.opacity)},oT=function(t,e){null!=e.lineDash&&(t.dashstyle=e.lineDash.join(" ")),null==e.stroke||e.stroke instanceof Ey||nT(t,e.stroke,e.opacity)},sT=function(t,e,i,n){var r="fill"==e,a=t.getElementsByTagName(e)[0];null!=i[e]&&"none"!==i[e]&&(r||!r&&i.lineWidth)?(t[r?"filled":"stroked"]="true",i[e]instanceof Ey&&tT(t,a),a||(a=Yp(e)),r?aT(a,i,n):oT(a,i),JI(t,a)):(t[r?"filled":"stroked"]="false",tT(t,a))},lT=[[],[],[]],hT=function(t,e){var i,n,r,a,o,s,l=BI.M,h=BI.C,u=BI.L,c=BI.A,d=BI.Q,f=[],p=t.data,g=t.len();for(a=0;g>a;){switch(r=p[a++],n="",i=0,r){case l:n=" m ",i=1,o=p[a++],s=p[a++],lT[0][0]=o,lT[0][1]=s;break;case u:n=" l ",i=1,o=p[a++],s=p[a++],lT[0][0]=o,lT[0][1]=s;break;case d:case h:n=" c ",i=3;var v,m,y=p[a++],x=p[a++],_=p[a++],w=p[a++];r===d?(v=_,m=w,_=(_+2*y)/3,w=(w+2*x)/3,y=(o+2*y)/3,x=(s+2*x)/3):(v=p[a++],m=p[a++]),lT[0][0]=y,lT[0][1]=x,lT[1][0]=_,lT[1][1]=w,lT[2][0]=v,lT[2][1]=m,o=v,s=m;break;case c:var b=0,S=0,M=1,I=1,T=0;e&&(b=e[4],S=e[5],M=FI(e[0]*e[0]+e[1]*e[1]),I=FI(e[2]*e[2]+e[3]*e[3]),T=Math.atan2(-e[1]/I,e[0]/M));var C=p[a++],A=p[a++],D=p[a++],k=p[a++],P=p[a++]+T,L=p[a++]+P+T;a++;var O=p[a++],z=C+WI(P)*D,E=A+GI(P)*k,y=C+WI(L)*D,x=A+GI(L)*k,R=O?" wa ":" at ";Math.abs(z-y)<1e-4&&(Math.abs(L-P)>.01?O&&(z+=270/YI):Math.abs(E-A)<1e-4?O&&C>z||!O&&z>C?x-=270/YI:x+=270/YI:O&&A>E||!O&&E>A?y+=270/YI:y-=270/YI),f.push(R,NI(((C-D)*M+b)*YI-jI),ZI,NI(((A-k)*I+S)*YI-jI),ZI,NI(((C+D)*M+b)*YI-jI),ZI,NI(((A+k)*I+S)*YI-jI),ZI,NI((z*M+b)*YI-jI),ZI,NI((E*I+S)*YI-jI),ZI,NI((y*M+b)*YI-jI),ZI,NI((x*I+S)*YI-jI)),o=y,s=x;break;case BI.R:var B=lT[0],N=lT[1];B[0]=p[a++],B[1]=p[a++],N[0]=B[0]+p[a++],N[1]=B[1]+p[a++],e&&(ae(B,B,e),ae(N,N,e)),B[0]=NI(B[0]*YI-jI),N[0]=NI(N[0]*YI-jI),B[1]=NI(B[1]*YI-jI),N[1]=NI(N[1]*YI-jI),f.push(" m ",B[0],ZI,B[1]," l ",N[0],ZI,B[1]," l ",N[0],ZI,N[1]," l ",B[0],ZI,N[1]);break;case BI.Z:f.push(" x ")}if(i>0){f.push(n);for(var F=0;i>F;F++){var V=lT[F];e&&ae(V,V,e),f.push(NI(V[0]*YI-jI),ZI,NI(V[1]*YI-jI),i-1>F?ZI:"")}}}return f.join("")};Fr.prototype.brushVML=function(t){var e=this.style,i=this._vmlEl;i||(i=Yp("shape"),$I(i),this._vmlEl=i),sT(i,"fill",e,this),sT(i,"stroke",e,this);var n=this.transform,r=null!=n,a=i.getElementsByTagName("stroke")[0];if(a){var o=e.lineWidth;if(r&&!e.strokeNoScale){var s=n[0]*n[3]-n[1]*n[2];o*=FI(VI(s))}a.weight=o+"px"}var l=this.path||(this.path=new qm);this.__dirtyPath&&(l.beginPath(),this.buildPath(l,this.shape),l.toStatic(),this.__dirtyPath=!1),i.path=hT(l,this.transform),i.style.zIndex=eT(this.zlevel,this.z,this.z2),JI(t,i),null!=e.text?this.drawRectText(t,this.getBoundingRect()):this.removeRectText(t)},Fr.prototype.onRemove=function(t){tT(t,this._vmlEl),this.removeRectText(t)},Fr.prototype.onAdd=function(t){JI(t,this._vmlEl),this.appendRectText(t)};var uT=function(t){return"object"==typeof t&&t.tagName&&"IMG"===t.tagName.toUpperCase()};yn.prototype.brushVML=function(t){var e,i,n=this.style,r=n.image;if(uT(r)){var a=r.src;if(a===this._imageSrc)e=this._imageWidth,i=this._imageHeight;else{var o=r.runtimeStyle,s=o.width,l=o.height;o.width="auto",o.height="auto",e=r.width,i=r.height,o.width=s,o.height=l,this._imageSrc=a,this._imageWidth=e,this._imageHeight=i}r=a}else r===this._imageSrc&&(e=this._imageWidth,i=this._imageHeight);if(r){var h=n.x||0,u=n.y||0,c=n.width,d=n.height,f=n.sWidth,p=n.sHeight,g=n.sx||0,v=n.sy||0,m=f&&p,y=this._vmlEl;y||(y=EI.createElement("div"),$I(y),this._vmlEl=y);var x,_=y.style,w=!1,b=1,S=1;if(this.transform&&(x=this.transform,b=FI(x[0]*x[0]+x[1]*x[1]),S=FI(x[2]*x[2]+x[3]*x[3]),w=x[1]||x[2]),w){var M=[h,u],I=[h+c,u],T=[h,u+d],C=[h+c,u+d];ae(M,M,x),ae(I,I,x),ae(T,T,x),ae(C,C,x);var A=HI(M[0],I[0],T[0],C[0]),D=HI(M[1],I[1],T[1],C[1]),k=[];k.push("M11=",x[0]/b,ZI,"M12=",x[2]/S,ZI,"M21=",x[1]/b,ZI,"M22=",x[3]/S,ZI,"Dx=",NI(h*b+x[4]),ZI,"Dy=",NI(u*S+x[5])),_.padding="0 "+NI(A)+"px "+NI(D)+"px 0",_.filter=XI+".Matrix("+k.join("")+", SizingMethod=clip)"}else x&&(h=h*b+x[4],u=u*S+x[5]),_.filter="",_.left=NI(h)+"px",_.top=NI(u)+"px";var P=this._imageEl,L=this._cropEl;P||(P=EI.createElement("div"),this._imageEl=P);var O=P.style;if(m){if(e&&i)O.width=NI(b*e*c/f)+"px",O.height=NI(S*i*d/p)+"px";else{var z=new Image,E=this;z.onload=function(){z.onload=null,e=z.width,i=z.height,O.width=NI(b*e*c/f)+"px",O.height=NI(S*i*d/p)+"px",E._imageWidth=e,E._imageHeight=i,E._imageSrc=r},z.src=r}L||(L=EI.createElement("div"),L.style.overflow="hidden",this._cropEl=L);var R=L.style;R.width=NI((c+g*c/f)*b),R.height=NI((d+v*d/p)*S),R.filter=XI+".Matrix(Dx="+-g*c/f*b+",Dy="+-v*d/p*S+")",L.parentNode||y.appendChild(L),P.parentNode!=L&&L.appendChild(P)}else O.width=NI(b*c)+"px",O.height=NI(S*d)+"px",y.appendChild(P),L&&L.parentNode&&(y.removeChild(L),this._cropEl=null);var B="",N=n.opacity;1>N&&(B+=".Alpha(opacity="+NI(100*N)+") "),B+=XI+".AlphaImageLoader(src="+r+", SizingMethod=scale)",O.filter=B,y.style.zIndex=eT(this.zlevel,this.z,this.z2),JI(t,y),null!=n.text&&this.drawRectText(t,this.getBoundingRect())}},yn.prototype.onRemove=function(t){tT(t,this._vmlEl),this._vmlEl=null,this._cropEl=null,this._imageEl=null,this.removeRectText(t)},yn.prototype.onAdd=function(t){JI(t,this._vmlEl),this.appendRectText(t)};var cT,dT="normal",fT={},pT=0,gT=100,vT=document.createElement("div"),mT=function(t){var e=fT[t];if(!e){pT>gT&&(pT=0,fT={});var i,n=vT.style;try{n.font=t,i=n.fontFamily.split(",")[0]}catch(r){}e={style:n.fontStyle||dT,variant:n.fontVariant||dT,weight:n.fontWeight||dT,size:0|parseFloat(n.fontSize||12),family:i||"Microsoft YaHei"},fT[t]=e,pT++}return e};Oi("measureText",function(t,e){var i=EI;cT||(cT=i.createElement("div"),cT.style.cssText="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;",EI.body.appendChild(cT));try{cT.style.font=e}catch(n){}return cT.innerHTML="",cT.appendChild(i.createTextNode(t)),{width:cT.offsetWidth}});for(var yT=new gi,xT=function(t,e,i,n){var r=this.style;this.__dirty&&Qi(r,!0);var a=r.text;if(null!=a&&(a+=""),a){if(r.rich){var o=qi(a,r);a=[];for(var s=0;s'; + + oriIcon += ''; + + var selectHtml = '
    ' + + '
    ' + + '
    ' + + '' + + oriIcon + + '' + + '' + + '
    ' + + '
    ' + + '
    ' + + '123' + + '
    '; + $(elem).after(selectHtml); + return a; + }, + /** + * 展开/折叠下拉框 + */ + toggleSelect: function () { + var item = '#' + TITLE_ID + ' .layui-iconpicker-item,#' + TITLE_ID + ' .layui-iconpicker-item .layui-edge'; + a.event('click', item, function (e) { + var $icon = $('#' + ICON_BODY); + if ($icon.hasClass(selected)) { + $icon.removeClass(selected).addClass(unselect); + } else { + // 隐藏其他picker + $('.layui-form-select').removeClass(selected); + // 显示当前picker + $icon.addClass(selected).removeClass(unselect); + } + e.stopPropagation(); + }); + return a; + }, + /** + * 绘制主体部分 + */ + createBody: function () { + // 获取数据 + var searchHtml = ''; + + if (search) { + searchHtml = ''; + } + + // 组合dom + var bodyHtml = '
    ' + + searchHtml + + '
    ' + + '
    '; + $('#' + ICON_BODY).find('.layui-anim').eq(0).html(bodyHtml); + a.search().createList().check().page(); + + return a; + }, + /** + * 绘制图标列表 + * @param text 模糊查询关键字 + * @returns {string} + */ + createList: function (text) { + var d = data, + l = d.length, + pageHtml = '', + listHtml = $('
    ')//'
    '; + + // 计算分页数据 + var _limit = limit, // 每页显示数量 + _pages = l % _limit === 0 ? l / _limit : parseInt(l / _limit + 1), // 总计多少页 + _id = PAGE_ID; + + // 图标列表 + var icons = []; + + for (var i = 0; i < l; i++) { + var obj = d[i]; + + // 判断是否模糊查询 + if (text && obj.indexOf(text) === -1) { + continue; + } + + // 是否自定义格子宽度 + var style = ''; + if (cellWidth !== null) { + style += ' style="width:' + cellWidth + '"'; + } + + // 每个图标dom + var icon = '
    '; + + icon += ''; + + icon += '
    '; + + icons.push(icon); + } + + // 查询出图标后再分页 + l = icons.length; + _pages = l % _limit === 0 ? l / _limit : parseInt(l / _limit + 1); + for (var i = 0; i < _pages; i++) { + // 按limit分块 + var lm = $('
    '); + + for (var j = i * _limit; j < (i + 1) * _limit && j < l; j++) { + lm.append(icons[j]); + } + + listHtml.append(lm); + } + + // 无数据 + if (l === 0) { + listHtml.append('

    无数据

    '); + } + + // 判断是否分页 + if (page) { + $('#' + PICKER_BODY).addClass('layui-iconpicker-body-page'); + pageHtml = '
    ' + + '
    ' + + '1/' + + '' + _pages + '' + + ' (' + l + ')' + + '
    ' + + '
    ' + + ' ' + + ' ' + + '
    ' + + '
    '; + } + + + $('#' + ICON_BODY).find('.layui-anim').find('.' + LIST_BOX).html('').append(listHtml).append(pageHtml); + return a; + }, + // 阻止Layui的一些默认事件 + preventEvent: function () { + var item = '#' + ICON_BODY + ' .layui-anim'; + a.event('click', item, function (e) { + e.stopPropagation(); + }); + return a; + }, + // 分页 + page: function () { + var icon = '#' + PAGE_ID + ' .layui-iconpicker-page-operate .layui-icon'; + + $(icon).unbind('click'); + a.event('click', icon, function (e) { + var elem = e.currentTarget, + total = parseInt($('#' + PAGE_ID + '-pages').html()), + isPrev = $(elem).attr('prev') !== undefined, + // 按钮上标的页码 + index = parseInt($(elem).attr('data-index')), + $cur = $('#' + PAGE_ID + '-current'), + // 点击时正在显示的页码 + current = parseInt($cur.html()); + + // 分页数据 + if (isPrev && current > 1) { + current = current - 1; + $(icon + '[prev]').attr('data-index', current); + } else if (!isPrev && current < total) { + current = current + 1; + $(icon + '[next]').attr('data-index', current); + } + $cur.html(current); + + // 图标数据 + $('#' + ICON_BODY + ' .layui-iconpicker-icon-limit').hide(); + $('#layui-iconpicker-icon-limit-' + tmp + current).show(); + e.stopPropagation(); + }); + return a; + }, + /** + * 搜索 + */ + search: function () { + var item = '#' + PICKER_BODY + ' .layui-iconpicker-search .layui-input'; + a.event('input propertychange', item, function (e) { + var elem = e.target, + t = $(elem).val(); + a.createList(t); + }); + return a; + }, + /** + * 点击选中图标 + */ + check: function () { + var item = '#' + PICKER_BODY + ' .layui-iconpicker-icon-item'; + a.event('click', item, function (e) { + var el = $(e.currentTarget).find('.fa'), + icon = ''; + + var clsArr = el.attr('class').split(/[\s\n]/), + cls = clsArr[1], + icon = cls; + $('#' + TITLE_ID).find('.layui-iconpicker-item .fa').html('').attr('class', clsArr.join(' ')); + + + $('#' + ICON_BODY).removeClass(selected).addClass(unselect); + $(elem).val(icon).attr('value', icon); + // 回调 + if (click) { + click({ + icon: icon + }); + } + + }); + return a; + }, + // 监听原始input数值改变 + inputListen: function () { + var el = $(elem); + a.event('change', elem, function () { + var value = el.val(); + }) + // el.change(function(){ + + // }); + return a; + }, + event: function (evt, el, fn) { + $(BODY).on(evt, el, fn); + } + }; + + var common = { + /** + * 加载样式表 + */ + loadCss: function () { + var css = '.layui-iconpicker {max-width: 280px;}.layui-iconpicker .layui-anim{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:899;min-width:100%;border:1px solid #d2d2d2;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12);box-sizing:border-box;}.layui-iconpicker-item{border:1px solid #e6e6e6;width:90px;height:38px;border-radius:4px;cursor:pointer;position:relative;}.layui-iconpicker-icon{border-right:1px solid #e6e6e6;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;width:60px;height:100%;float:left;text-align:center;background:#fff;transition:all .3s;}.layui-iconpicker-icon i{line-height:38px;font-size:18px;}.layui-iconpicker-item > .layui-edge{left:70px;}.layui-iconpicker-item:hover{border-color:#D2D2D2!important;}.layui-iconpicker-item:hover .layui-iconpicker-icon{border-color:#D2D2D2!important;}.layui-iconpicker.layui-form-selected .layui-anim{display:block;}.layui-iconpicker-body{padding:6px;}.layui-iconpicker .layui-iconpicker-list{background-color:#fff;border:1px solid #ccc;border-radius:4px;}.layui-iconpicker .layui-iconpicker-icon-item{display:inline-block;width:21.1%;line-height:36px;text-align:center;cursor:pointer;vertical-align:top;height:36px;margin:4px;border:1px solid #ddd;border-radius:2px;transition:300ms;}.layui-iconpicker .layui-iconpicker-icon-item i.layui-icon{font-size:17px;}.layui-iconpicker .layui-iconpicker-icon-item:hover{background-color:#eee;border-color:#ccc;-webkit-box-shadow:0 0 2px #aaa,0 0 2px #fff inset;-moz-box-shadow:0 0 2px #aaa,0 0 2px #fff inset;box-shadow:0 0 2px #aaa,0 0 2px #fff inset;text-shadow:0 0 1px #fff;}.layui-iconpicker-search{position:relative;margin:0 0 6px 0;border:1px solid #e6e6e6;border-radius:2px;transition:300ms;}.layui-iconpicker-search:hover{border-color:#D2D2D2!important;}.layui-iconpicker-search .layui-input{cursor:text;display:inline-block;width:86%;border:none;padding-right:0;margin-top:1px;}.layui-iconpicker-search .layui-icon{position:absolute;top:11px;right:4%;}.layui-iconpicker-tips{text-align:center;padding:8px 0;cursor:not-allowed;}.layui-iconpicker-page{margin-top:6px;margin-bottom:-6px;font-size:12px;padding:0 2px;}.layui-iconpicker-page-count{display:inline-block;}.layui-iconpicker-page-operate{display:inline-block;float:right;cursor:default;}.layui-iconpicker-page-operate .layui-icon{font-size:12px;cursor:pointer;}.layui-iconpicker-body-page .layui-iconpicker-icon-limit{display:none;}.layui-iconpicker-body-page .layui-iconpicker-icon-limit:first-child{display:block;}'; + var $style = $('head').find('style[iconpicker]'); + if ($style.length === 0) { + $('head').append(''); + } + }, + + /** + * 获取数据 + */ + getData: function (url) { + var iconlist = []; + $.ajax({ + url: url, + type: 'get', + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + async: false, + success: function (ret) { + var exp = /fa-var-(.*):/ig; + var result; + while ((result = exp.exec(ret)) != null) { + iconlist.push('fa-' + result[1]); + } + }, + error: function (xhr, textstatus, thrown) { + layer.msg('fa图标接口有误'); + } + }); + return iconlist; + } + }; + + a.init(); + return new IconPicker(); + }; + + /** + * 选中图标 + * @param filter lay-filter + * @param iconName 图标名称,自动识别fontClass/unicode + */ + IconPicker.prototype.checkIcon = function (filter, iconName) { + var el = $('*[lay-filter=' + filter + ']'), + p = el.next().find('.layui-iconpicker-item .fa'), + c = iconName; + + if (c.indexOf('#xe') > 0) { + p.html(c); + } else { + p.html('').attr('class', 'fa ' + c); + } + el.attr('value', c).val(c); + }; + + var iconPicker = new IconPicker(); + exports(_MOD, iconPicker); +}); \ No newline at end of file diff --git a/public/admin/js/lay-module/layarea/layarea.js b/public/admin/js/lay-module/layarea/layarea.js new file mode 100644 index 0000000..1368a62 --- /dev/null +++ b/public/admin/js/lay-module/layarea/layarea.js @@ -0,0 +1,4040 @@ +layui.define(['layer', 'form', 'laytpl'], function (exports) { + "use strict"; + + let $ = layui.$ + , form = layui.form + , layarea = { + _id: 0 + , config: {} + , set: function (options) { + let that = this; + that.config = $.extend({}, that.config, options); + return that; + } + , on: function (events, callback) { + return layui.onevent.call(this, 'layarea', events, callback); + } + } + , thisArea = function () { + let that = this; + return { + layarea: function (files) { + that.layarea.call(that, files); + } + , config: that.config + } + } + , Class = function (options) { + let that = this; + that.config = $.extend({}, that.config, layarea.config, options); + that.render(); + }; + + let areaList = { + province_list: { + 110000: '北京市', + 120000: '天津市', + 130000: '河北省', + 140000: '山西省', + 150000: '内蒙古自治区', + 210000: '辽宁省', + 220000: '吉林省', + 230000: '黑龙江省', + 310000: '上海市', + 320000: '江苏省', + 330000: '浙江省', + 340000: '安徽省', + 350000: '福建省', + 360000: '江西省', + 370000: '山东省', + 410000: '河南省', + 420000: '湖北省', + 430000: '湖南省', + 440000: '广东省', + 450000: '广西壮族自治区', + 460000: '海南省', + 500000: '重庆市', + 510000: '四川省', + 520000: '贵州省', + 530000: '云南省', + 540000: '西藏自治区', + 610000: '陕西省', + 620000: '甘肃省', + 630000: '青海省', + 640000: '宁夏回族自治区', + 650000: '新疆维吾尔自治区', + 710000: '台湾省', + 810000: '香港特别行政区', + 820000: '澳门特别行政区', + 900000: '海外' + }, + city_list: { + 110100: '北京市', + 120100: '天津市', + 130100: '石家庄市', + 130200: '唐山市', + 130300: '秦皇岛市', + 130400: '邯郸市', + 130500: '邢台市', + 130600: '保定市', + 130700: '张家口市', + 130800: '承德市', + 130900: '沧州市', + 131000: '廊坊市', + 131100: '衡水市', + 139000: '省直辖县', + 140100: '太原市', + 140200: '大同市', + 140300: '阳泉市', + 140400: '长治市', + 140500: '晋城市', + 140600: '朔州市', + 140700: '晋中市', + 140800: '运城市', + 140900: '忻州市', + 141000: '临汾市', + 141100: '吕梁市', + 150100: '呼和浩特市', + 150200: '包头市', + 150300: '乌海市', + 150400: '赤峰市', + 150500: '通辽市', + 150600: '鄂尔多斯市', + 150700: '呼伦贝尔市', + 150800: '巴彦淖尔市', + 150900: '乌兰察布市', + 152200: '兴安盟', + 152500: '锡林郭勒盟', + 152900: '阿拉善盟', + 210100: '沈阳市', + 210200: '大连市', + 210300: '鞍山市', + 210400: '抚顺市', + 210500: '本溪市', + 210600: '丹东市', + 210700: '锦州市', + 210800: '营口市', + 210900: '阜新市', + 211000: '辽阳市', + 211100: '盘锦市', + 211200: '铁岭市', + 211300: '朝阳市', + 211400: '葫芦岛市', + 220100: '长春市', + 220200: '吉林市', + 220300: '四平市', + 220400: '辽源市', + 220500: '通化市', + 220600: '白山市', + 220700: '松原市', + 220800: '白城市', + 222400: '延边朝鲜族自治州', + 230100: '哈尔滨市', + 230200: '齐齐哈尔市', + 230300: '鸡西市', + 230400: '鹤岗市', + 230500: '双鸭山市', + 230600: '大庆市', + 230700: '伊春市', + 230800: '佳木斯市', + 230900: '七台河市', + 231000: '牡丹江市', + 231100: '黑河市', + 231200: '绥化市', + 232700: '大兴安岭地区', + 310100: '上海市', + 320100: '南京市', + 320200: '无锡市', + 320300: '徐州市', + 320400: '常州市', + 320500: '苏州市', + 320600: '南通市', + 320700: '连云港市', + 320800: '淮安市', + 320900: '盐城市', + 321000: '扬州市', + 321100: '镇江市', + 321200: '泰州市', + 321300: '宿迁市', + 330100: '杭州市', + 330200: '宁波市', + 330300: '温州市', + 330400: '嘉兴市', + 330500: '湖州市', + 330600: '绍兴市', + 330700: '金华市', + 330800: '衢州市', + 330900: '舟山市', + 331000: '台州市', + 331100: '丽水市', + 340100: '合肥市', + 340200: '芜湖市', + 340300: '蚌埠市', + 340400: '淮南市', + 340500: '马鞍山市', + 340600: '淮北市', + 340700: '铜陵市', + 340800: '安庆市', + 341000: '黄山市', + 341100: '滁州市', + 341200: '阜阳市', + 341300: '宿州市', + 341500: '六安市', + 341600: '亳州市', + 341700: '池州市', + 341800: '宣城市', + 350100: '福州市', + 350200: '厦门市', + 350300: '莆田市', + 350400: '三明市', + 350500: '泉州市', + 350600: '漳州市', + 350700: '南平市', + 350800: '龙岩市', + 350900: '宁德市', + 360100: '南昌市', + 360200: '景德镇市', + 360300: '萍乡市', + 360400: '九江市', + 360500: '新余市', + 360600: '鹰潭市', + 360700: '赣州市', + 360800: '吉安市', + 360900: '宜春市', + 361000: '抚州市', + 361100: '上饶市', + 370100: '济南市', + 370200: '青岛市', + 370300: '淄博市', + 370400: '枣庄市', + 370500: '东营市', + 370600: '烟台市', + 370700: '潍坊市', + 370800: '济宁市', + 370900: '泰安市', + 371000: '威海市', + 371100: '日照市', + 371200: '莱芜市', + 371300: '临沂市', + 371400: '德州市', + 371500: '聊城市', + 371600: '滨州市', + 371700: '菏泽市', + 410100: '郑州市', + 410200: '开封市', + 410300: '洛阳市', + 410400: '平顶山市', + 410500: '安阳市', + 410600: '鹤壁市', + 410700: '新乡市', + 410800: '焦作市', + 410900: '濮阳市', + 411000: '许昌市', + 411100: '漯河市', + 411200: '三门峡市', + 411300: '南阳市', + 411400: '商丘市', + 411500: '信阳市', + 411600: '周口市', + 411700: '驻马店市', + 419000: '省直辖县', + 420100: '武汉市', + 420200: '黄石市', + 420300: '十堰市', + 420500: '宜昌市', + 420600: '襄阳市', + 420700: '鄂州市', + 420800: '荆门市', + 420900: '孝感市', + 421000: '荆州市', + 421100: '黄冈市', + 421200: '咸宁市', + 421300: '随州市', + 422800: '恩施土家族苗族自治州', + 429000: '省直辖县', + 430100: '长沙市', + 430200: '株洲市', + 430300: '湘潭市', + 430400: '衡阳市', + 430500: '邵阳市', + 430600: '岳阳市', + 430700: '常德市', + 430800: '张家界市', + 430900: '益阳市', + 431000: '郴州市', + 431100: '永州市', + 431200: '怀化市', + 431300: '娄底市', + 433100: '湘西土家族苗族自治州', + 440100: '广州市', + 440200: '韶关市', + 440300: '深圳市', + 440400: '珠海市', + 440500: '汕头市', + 440600: '佛山市', + 440700: '江门市', + 440800: '湛江市', + 440900: '茂名市', + 441200: '肇庆市', + 441300: '惠州市', + 441400: '梅州市', + 441500: '汕尾市', + 441600: '河源市', + 441700: '阳江市', + 441800: '清远市', + 441900: '东莞市', + 442000: '中山市', + 445100: '潮州市', + 445200: '揭阳市', + 445300: '云浮市', + 450100: '南宁市', + 450200: '柳州市', + 450300: '桂林市', + 450400: '梧州市', + 450500: '北海市', + 450600: '防城港市', + 450700: '钦州市', + 450800: '贵港市', + 450900: '玉林市', + 451000: '百色市', + 451100: '贺州市', + 451200: '河池市', + 451300: '来宾市', + 451400: '崇左市', + 460100: '海口市', + 460200: '三亚市', + 460300: '三沙市', + 460400: '儋州市', + 469000: '省直辖县', + 500100: '重庆市', + 500200: '县', + 510100: '成都市', + 510300: '自贡市', + 510400: '攀枝花市', + 510500: '泸州市', + 510600: '德阳市', + 510700: '绵阳市', + 510800: '广元市', + 510900: '遂宁市', + 511000: '内江市', + 511100: '乐山市', + 511300: '南充市', + 511400: '眉山市', + 511500: '宜宾市', + 511600: '广安市', + 511700: '达州市', + 511800: '雅安市', + 511900: '巴中市', + 512000: '资阳市', + 513200: '阿坝藏族羌族自治州', + 513300: '甘孜藏族自治州', + 513400: '凉山彝族自治州', + 520100: '贵阳市', + 520200: '六盘水市', + 520300: '遵义市', + 520400: '安顺市', + 520500: '毕节市', + 520600: '铜仁市', + 522300: '黔西南布依族苗族自治州', + 522600: '黔东南苗族侗族自治州', + 522700: '黔南布依族苗族自治州', + 530100: '昆明市', + 530300: '曲靖市', + 530400: '玉溪市', + 530500: '保山市', + 530600: '昭通市', + 530700: '丽江市', + 530800: '普洱市', + 530900: '临沧市', + 532300: '楚雄彝族自治州', + 532500: '红河哈尼族彝族自治州', + 532600: '文山壮族苗族自治州', + 532800: '西双版纳傣族自治州', + 532900: '大理白族自治州', + 533100: '德宏傣族景颇族自治州', + 533300: '怒江傈僳族自治州', + 533400: '迪庆藏族自治州', + 540100: '拉萨市', + 540200: '日喀则市', + 540300: '昌都市', + 540400: '林芝市', + 540500: '山南市', + 540600: '那曲市', + 542500: '阿里地区', + 610100: '西安市', + 610200: '铜川市', + 610300: '宝鸡市', + 610400: '咸阳市', + 610500: '渭南市', + 610600: '延安市', + 610700: '汉中市', + 610800: '榆林市', + 610900: '安康市', + 611000: '商洛市', + 620100: '兰州市', + 620200: '嘉峪关市', + 620300: '金昌市', + 620400: '白银市', + 620500: '天水市', + 620600: '武威市', + 620700: '张掖市', + 620800: '平凉市', + 620900: '酒泉市', + 621000: '庆阳市', + 621100: '定西市', + 621200: '陇南市', + 622900: '临夏回族自治州', + 623000: '甘南藏族自治州', + 630100: '西宁市', + 630200: '海东市', + 632200: '海北藏族自治州', + 632300: '黄南藏族自治州', + 632500: '海南藏族自治州', + 632600: '果洛藏族自治州', + 632700: '玉树藏族自治州', + 632800: '海西蒙古族藏族自治州', + 640100: '银川市', + 640200: '石嘴山市', + 640300: '吴忠市', + 640400: '固原市', + 640500: '中卫市', + 650100: '乌鲁木齐市', + 650200: '克拉玛依市', + 650400: '吐鲁番市', + 650500: '哈密市', + 652300: '昌吉回族自治州', + 652700: '博尔塔拉蒙古自治州', + 652800: '巴音郭楞蒙古自治州', + 652900: '阿克苏地区', + 653000: '克孜勒苏柯尔克孜自治州', + 653100: '喀什地区', + 653200: '和田地区', + 654000: '伊犁哈萨克自治州', + 654200: '塔城地区', + 654300: '阿勒泰地区', + 659000: '自治区直辖县级行政区划', + 710100: '台北市', + 710200: '高雄市', + 710300: '台南市', + 710400: '台中市', + 710500: '金门县', + 710600: '南投县', + 710700: '基隆市', + 710800: '新竹市', + 710900: '嘉义市', + 711100: '新北市', + 711200: '宜兰县', + 711300: '新竹县', + 711400: '桃园县', + 711500: '苗栗县', + 711700: '彰化县', + 711900: '嘉义县', + 712100: '云林县', + 712400: '屏东县', + 712500: '台东县', + 712600: '花莲县', + 712700: '澎湖县', + 712800: '连江县', + 810100: '香港岛', + 810200: '九龙', + 810300: '新界', + 820100: '澳门半岛', + 820200: '离岛', + 912400: '加拿大', + 941000: '韩国', + 984000: '美国' + }, + county_list: { + 110101: '东城区', + 110102: '西城区', + 110105: '朝阳区', + 110106: '丰台区', + 110107: '石景山区', + 110108: '海淀区', + 110109: '门头沟区', + 110111: '房山区', + 110112: '通州区', + 110113: '顺义区', + 110114: '昌平区', + 110115: '大兴区', + 110116: '怀柔区', + 110117: '平谷区', + 110118: '密云区', + 110119: '延庆区', + 120101: '和平区', + 120102: '河东区', + 120103: '河西区', + 120104: '南开区', + 120105: '河北区', + 120106: '红桥区', + 120110: '东丽区', + 120111: '西青区', + 120112: '津南区', + 120113: '北辰区', + 120114: '武清区', + 120115: '宝坻区', + 120116: '滨海新区', + 120117: '宁河区', + 120118: '静海区', + 120119: '蓟州区', + 130102: '长安区', + 130104: '桥西区', + 130105: '新华区', + 130107: '井陉矿区', + 130108: '裕华区', + 130109: '藁城区', + 130110: '鹿泉区', + 130111: '栾城区', + 130121: '井陉县', + 130123: '正定县', + 130125: '行唐县', + 130126: '灵寿县', + 130127: '高邑县', + 130128: '深泽县', + 130129: '赞皇县', + 130130: '无极县', + 130131: '平山县', + 130132: '元氏县', + 130133: '赵县', + 130181: '辛集市', + 130183: '晋州市', + 130184: '新乐市', + 130202: '路南区', + 130203: '路北区', + 130204: '古冶区', + 130205: '开平区', + 130207: '丰南区', + 130208: '丰润区', + 130209: '曹妃甸区', + 130223: '滦县', + 130224: '滦南县', + 130225: '乐亭县', + 130227: '迁西县', + 130229: '玉田县', + 130281: '遵化市', + 130283: '迁安市', + 130302: '海港区', + 130303: '山海关区', + 130304: '北戴河区', + 130306: '抚宁区', + 130321: '青龙满族自治县', + 130322: '昌黎县', + 130324: '卢龙县', + 130390: '经济技术开发区', + 130402: '邯山区', + 130403: '丛台区', + 130404: '复兴区', + 130406: '峰峰矿区', + 130407: '肥乡区', + 130408: '永年区', + 130423: '临漳县', + 130424: '成安县', + 130425: '大名县', + 130426: '涉县', + 130427: '磁县', + 130430: '邱县', + 130431: '鸡泽县', + 130432: '广平县', + 130433: '馆陶县', + 130434: '魏县', + 130435: '曲周县', + 130481: '武安市', + 130502: '桥东区', + 130503: '桥西区', + 130521: '邢台县', + 130522: '临城县', + 130523: '内丘县', + 130524: '柏乡县', + 130525: '隆尧县', + 130526: '任县', + 130527: '南和县', + 130528: '宁晋县', + 130529: '巨鹿县', + 130530: '新河县', + 130531: '广宗县', + 130532: '平乡县', + 130533: '威县', + 130534: '清河县', + 130535: '临西县', + 130581: '南宫市', + 130582: '沙河市', + 130602: '竞秀区', + 130606: '莲池区', + 130607: '满城区', + 130608: '清苑区', + 130609: '徐水区', + 130623: '涞水县', + 130624: '阜平县', + 130626: '定兴县', + 130627: '唐县', + 130628: '高阳县', + 130629: '容城县', + 130630: '涞源县', + 130631: '望都县', + 130632: '安新县', + 130633: '易县', + 130634: '曲阳县', + 130635: '蠡县', + 130636: '顺平县', + 130637: '博野县', + 130638: '雄县', + 130681: '涿州市', + 130682: '定州市', + 130683: '安国市', + 130684: '高碑店市', + 130702: '桥东区', + 130703: '桥西区', + 130705: '宣化区', + 130706: '下花园区', + 130708: '万全区', + 130709: '崇礼区', + 130722: '张北县', + 130723: '康保县', + 130724: '沽源县', + 130725: '尚义县', + 130726: '蔚县', + 130727: '阳原县', + 130728: '怀安县', + 130730: '怀来县', + 130731: '涿鹿县', + 130732: '赤城县', + 130802: '双桥区', + 130803: '双滦区', + 130804: '鹰手营子矿区', + 130821: '承德县', + 130822: '兴隆县', + 130824: '滦平县', + 130825: '隆化县', + 130826: '丰宁满族自治县', + 130827: '宽城满族自治县', + 130828: '围场满族蒙古族自治县', + 130881: '平泉市', + 130902: '新华区', + 130903: '运河区', + 130921: '沧县', + 130922: '青县', + 130923: '东光县', + 130924: '海兴县', + 130925: '盐山县', + 130926: '肃宁县', + 130927: '南皮县', + 130928: '吴桥县', + 130929: '献县', + 130930: '孟村回族自治县', + 130981: '泊头市', + 130982: '任丘市', + 130983: '黄骅市', + 130984: '河间市', + 131002: '安次区', + 131003: '广阳区', + 131022: '固安县', + 131023: '永清县', + 131024: '香河县', + 131025: '大城县', + 131026: '文安县', + 131028: '大厂回族自治县', + 131081: '霸州市', + 131082: '三河市', + 131090: '开发区', + 131102: '桃城区', + 131103: '冀州区', + 131121: '枣强县', + 131122: '武邑县', + 131123: '武强县', + 131124: '饶阳县', + 131125: '安平县', + 131126: '故城县', + 131127: '景县', + 131128: '阜城县', + 131182: '深州市', + 140105: '小店区', + 140106: '迎泽区', + 140107: '杏花岭区', + 140108: '尖草坪区', + 140109: '万柏林区', + 140110: '晋源区', + 140121: '清徐县', + 140122: '阳曲县', + 140123: '娄烦县', + 140181: '古交市', + 140202: '城区', + 140203: '矿区', + 140211: '南郊区', + 140212: '新荣区', + 140221: '阳高县', + 140222: '天镇县', + 140223: '广灵县', + 140224: '灵丘县', + 140225: '浑源县', + 140226: '左云县', + 140227: '大同县', + 140302: '城区', + 140303: '矿区', + 140311: '郊区', + 140321: '平定县', + 140322: '盂县', + 140402: '城区', + 140411: '郊区', + 140421: '长治县', + 140423: '襄垣县', + 140424: '屯留县', + 140425: '平顺县', + 140426: '黎城县', + 140427: '壶关县', + 140428: '长子县', + 140429: '武乡县', + 140430: '沁县', + 140431: '沁源县', + 140481: '潞城市', + 140502: '城区', + 140521: '沁水县', + 140522: '阳城县', + 140524: '陵川县', + 140525: '泽州县', + 140581: '高平市', + 140602: '朔城区', + 140603: '平鲁区', + 140621: '山阴县', + 140622: '应县', + 140623: '右玉县', + 140624: '怀仁县', + 140702: '榆次区', + 140721: '榆社县', + 140722: '左权县', + 140723: '和顺县', + 140724: '昔阳县', + 140725: '寿阳县', + 140726: '太谷县', + 140727: '祁县', + 140728: '平遥县', + 140729: '灵石县', + 140781: '介休市', + 140802: '盐湖区', + 140821: '临猗县', + 140822: '万荣县', + 140823: '闻喜县', + 140824: '稷山县', + 140825: '新绛县', + 140826: '绛县', + 140827: '垣曲县', + 140828: '夏县', + 140829: '平陆县', + 140830: '芮城县', + 140881: '永济市', + 140882: '河津市', + 140902: '忻府区', + 140921: '定襄县', + 140922: '五台县', + 140923: '代县', + 140924: '繁峙县', + 140925: '宁武县', + 140926: '静乐县', + 140927: '神池县', + 140928: '五寨县', + 140929: '岢岚县', + 140930: '河曲县', + 140931: '保德县', + 140932: '偏关县', + 140981: '原平市', + 141002: '尧都区', + 141021: '曲沃县', + 141022: '翼城县', + 141023: '襄汾县', + 141024: '洪洞县', + 141025: '古县', + 141026: '安泽县', + 141027: '浮山县', + 141028: '吉县', + 141029: '乡宁县', + 141030: '大宁县', + 141031: '隰县', + 141032: '永和县', + 141033: '蒲县', + 141034: '汾西县', + 141081: '侯马市', + 141082: '霍州市', + 141102: '离石区', + 141121: '文水县', + 141122: '交城县', + 141123: '兴县', + 141124: '临县', + 141125: '柳林县', + 141126: '石楼县', + 141127: '岚县', + 141128: '方山县', + 141129: '中阳县', + 141130: '交口县', + 141181: '孝义市', + 141182: '汾阳市', + 150102: '新城区', + 150103: '回民区', + 150104: '玉泉区', + 150105: '赛罕区', + 150121: '土默特左旗', + 150122: '托克托县', + 150123: '和林格尔县', + 150124: '清水河县', + 150125: '武川县', + 150202: '东河区', + 150203: '昆都仑区', + 150204: '青山区', + 150205: '石拐区', + 150206: '白云鄂博矿区', + 150207: '九原区', + 150221: '土默特右旗', + 150222: '固阳县', + 150223: '达尔罕茂明安联合旗', + 150302: '海勃湾区', + 150303: '海南区', + 150304: '乌达区', + 150402: '红山区', + 150403: '元宝山区', + 150404: '松山区', + 150421: '阿鲁科尔沁旗', + 150422: '巴林左旗', + 150423: '巴林右旗', + 150424: '林西县', + 150425: '克什克腾旗', + 150426: '翁牛特旗', + 150428: '喀喇沁旗', + 150429: '宁城县', + 150430: '敖汉旗', + 150502: '科尔沁区', + 150521: '科尔沁左翼中旗', + 150522: '科尔沁左翼后旗', + 150523: '开鲁县', + 150524: '库伦旗', + 150525: '奈曼旗', + 150526: '扎鲁特旗', + 150581: '霍林郭勒市', + 150602: '东胜区', + 150603: '康巴什区', + 150621: '达拉特旗', + 150622: '准格尔旗', + 150623: '鄂托克前旗', + 150624: '鄂托克旗', + 150625: '杭锦旗', + 150626: '乌审旗', + 150627: '伊金霍洛旗', + 150702: '海拉尔区', + 150703: '扎赉诺尔区', + 150721: '阿荣旗', + 150722: '莫力达瓦达斡尔族自治旗', + 150723: '鄂伦春自治旗', + 150724: '鄂温克族自治旗', + 150725: '陈巴尔虎旗', + 150726: '新巴尔虎左旗', + 150727: '新巴尔虎右旗', + 150781: '满洲里市', + 150782: '牙克石市', + 150783: '扎兰屯市', + 150784: '额尔古纳市', + 150785: '根河市', + 150802: '临河区', + 150821: '五原县', + 150822: '磴口县', + 150823: '乌拉特前旗', + 150824: '乌拉特中旗', + 150825: '乌拉特后旗', + 150826: '杭锦后旗', + 150902: '集宁区', + 150921: '卓资县', + 150922: '化德县', + 150923: '商都县', + 150924: '兴和县', + 150925: '凉城县', + 150926: '察哈尔右翼前旗', + 150927: '察哈尔右翼中旗', + 150928: '察哈尔右翼后旗', + 150929: '四子王旗', + 150981: '丰镇市', + 152201: '乌兰浩特市', + 152202: '阿尔山市', + 152221: '科尔沁右翼前旗', + 152222: '科尔沁右翼中旗', + 152223: '扎赉特旗', + 152224: '突泉县', + 152501: '二连浩特市', + 152502: '锡林浩特市', + 152522: '阿巴嘎旗', + 152523: '苏尼特左旗', + 152524: '苏尼特右旗', + 152525: '东乌珠穆沁旗', + 152526: '西乌珠穆沁旗', + 152527: '太仆寺旗', + 152528: '镶黄旗', + 152529: '正镶白旗', + 152530: '正蓝旗', + 152531: '多伦县', + 152921: '阿拉善左旗', + 152922: '阿拉善右旗', + 152923: '额济纳旗', + 210102: '和平区', + 210103: '沈河区', + 210104: '大东区', + 210105: '皇姑区', + 210106: '铁西区', + 210111: '苏家屯区', + 210112: '浑南区', + 210113: '沈北新区', + 210114: '于洪区', + 210115: '辽中区', + 210123: '康平县', + 210124: '法库县', + 210181: '新民市', + 210190: '经济技术开发区', + 210202: '中山区', + 210203: '西岗区', + 210204: '沙河口区', + 210211: '甘井子区', + 210212: '旅顺口区', + 210213: '金州区', + 210214: '普兰店区', + 210224: '长海县', + 210281: '瓦房店市', + 210283: '庄河市', + 210302: '铁东区', + 210303: '铁西区', + 210304: '立山区', + 210311: '千山区', + 210321: '台安县', + 210323: '岫岩满族自治县', + 210381: '海城市', + 210390: '高新区', + 210402: '新抚区', + 210403: '东洲区', + 210404: '望花区', + 210411: '顺城区', + 210421: '抚顺县', + 210422: '新宾满族自治县', + 210423: '清原满族自治县', + 210502: '平山区', + 210503: '溪湖区', + 210504: '明山区', + 210505: '南芬区', + 210521: '本溪满族自治县', + 210522: '桓仁满族自治县', + 210602: '元宝区', + 210603: '振兴区', + 210604: '振安区', + 210624: '宽甸满族自治县', + 210681: '东港市', + 210682: '凤城市', + 210702: '古塔区', + 210703: '凌河区', + 210711: '太和区', + 210726: '黑山县', + 210727: '义县', + 210781: '凌海市', + 210782: '北镇市', + 210793: '经济技术开发区', + 210802: '站前区', + 210803: '西市区', + 210804: '鲅鱼圈区', + 210811: '老边区', + 210881: '盖州市', + 210882: '大石桥市', + 210902: '海州区', + 210903: '新邱区', + 210904: '太平区', + 210905: '清河门区', + 210911: '细河区', + 210921: '阜新蒙古族自治县', + 210922: '彰武县', + 211002: '白塔区', + 211003: '文圣区', + 211004: '宏伟区', + 211005: '弓长岭区', + 211011: '太子河区', + 211021: '辽阳县', + 211081: '灯塔市', + 211102: '双台子区', + 211103: '兴隆台区', + 211104: '大洼区', + 211122: '盘山县', + 211202: '银州区', + 211204: '清河区', + 211221: '铁岭县', + 211223: '西丰县', + 211224: '昌图县', + 211281: '调兵山市', + 211282: '开原市', + 211302: '双塔区', + 211303: '龙城区', + 211321: '朝阳县', + 211322: '建平县', + 211324: '喀喇沁左翼蒙古族自治县', + 211381: '北票市', + 211382: '凌源市', + 211402: '连山区', + 211403: '龙港区', + 211404: '南票区', + 211421: '绥中县', + 211422: '建昌县', + 211481: '兴城市', + 215090: '工业园区', + 220102: '南关区', + 220103: '宽城区', + 220104: '朝阳区', + 220105: '二道区', + 220106: '绿园区', + 220112: '双阳区', + 220113: '九台区', + 220122: '农安县', + 220182: '榆树市', + 220183: '德惠市', + 220192: '经济技术开发区', + 220202: '昌邑区', + 220203: '龙潭区', + 220204: '船营区', + 220211: '丰满区', + 220221: '永吉县', + 220281: '蛟河市', + 220282: '桦甸市', + 220283: '舒兰市', + 220284: '磐石市', + 220302: '铁西区', + 220303: '铁东区', + 220322: '梨树县', + 220323: '伊通满族自治县', + 220381: '公主岭市', + 220382: '双辽市', + 220402: '龙山区', + 220403: '西安区', + 220421: '东丰县', + 220422: '东辽县', + 220502: '东昌区', + 220503: '二道江区', + 220521: '通化县', + 220523: '辉南县', + 220524: '柳河县', + 220581: '梅河口市', + 220582: '集安市', + 220602: '浑江区', + 220605: '江源区', + 220621: '抚松县', + 220622: '靖宇县', + 220623: '长白朝鲜族自治县', + 220681: '临江市', + 220702: '宁江区', + 220721: '前郭尔罗斯蒙古族自治县', + 220722: '长岭县', + 220723: '乾安县', + 220781: '扶余市', + 220802: '洮北区', + 220821: '镇赉县', + 220822: '通榆县', + 220881: '洮南市', + 220882: '大安市', + 221090: '工业园区', + 222401: '延吉市', + 222402: '图们市', + 222403: '敦化市', + 222404: '珲春市', + 222405: '龙井市', + 222406: '和龙市', + 222424: '汪清县', + 222426: '安图县', + 230102: '道里区', + 230103: '南岗区', + 230104: '道外区', + 230108: '平房区', + 230109: '松北区', + 230110: '香坊区', + 230111: '呼兰区', + 230112: '阿城区', + 230113: '双城区', + 230123: '依兰县', + 230124: '方正县', + 230125: '宾县', + 230126: '巴彦县', + 230127: '木兰县', + 230128: '通河县', + 230129: '延寿县', + 230183: '尚志市', + 230184: '五常市', + 230202: '龙沙区', + 230203: '建华区', + 230204: '铁锋区', + 230205: '昂昂溪区', + 230206: '富拉尔基区', + 230207: '碾子山区', + 230208: '梅里斯达斡尔族区', + 230221: '龙江县', + 230223: '依安县', + 230224: '泰来县', + 230225: '甘南县', + 230227: '富裕县', + 230229: '克山县', + 230230: '克东县', + 230231: '拜泉县', + 230281: '讷河市', + 230302: '鸡冠区', + 230303: '恒山区', + 230304: '滴道区', + 230305: '梨树区', + 230306: '城子河区', + 230307: '麻山区', + 230321: '鸡东县', + 230381: '虎林市', + 230382: '密山市', + 230402: '向阳区', + 230403: '工农区', + 230404: '南山区', + 230405: '兴安区', + 230406: '东山区', + 230407: '兴山区', + 230421: '萝北县', + 230422: '绥滨县', + 230502: '尖山区', + 230503: '岭东区', + 230505: '四方台区', + 230506: '宝山区', + 230521: '集贤县', + 230522: '友谊县', + 230523: '宝清县', + 230524: '饶河县', + 230602: '萨尔图区', + 230603: '龙凤区', + 230604: '让胡路区', + 230605: '红岗区', + 230606: '大同区', + 230621: '肇州县', + 230622: '肇源县', + 230623: '林甸县', + 230624: '杜尔伯特蒙古族自治县', + 230702: '伊春区', + 230703: '南岔区', + 230704: '友好区', + 230705: '西林区', + 230706: '翠峦区', + 230707: '新青区', + 230708: '美溪区', + 230709: '金山屯区', + 230710: '五营区', + 230711: '乌马河区', + 230712: '汤旺河区', + 230713: '带岭区', + 230714: '乌伊岭区', + 230715: '红星区', + 230716: '上甘岭区', + 230722: '嘉荫县', + 230781: '铁力市', + 230803: '向阳区', + 230804: '前进区', + 230805: '东风区', + 230811: '郊区', + 230822: '桦南县', + 230826: '桦川县', + 230828: '汤原县', + 230881: '同江市', + 230882: '富锦市', + 230883: '抚远市', + 230902: '新兴区', + 230903: '桃山区', + 230904: '茄子河区', + 230921: '勃利县', + 231002: '东安区', + 231003: '阳明区', + 231004: '爱民区', + 231005: '西安区', + 231025: '林口县', + 231081: '绥芬河市', + 231083: '海林市', + 231084: '宁安市', + 231085: '穆棱市', + 231086: '东宁市', + 231102: '爱辉区', + 231121: '嫩江县', + 231123: '逊克县', + 231124: '孙吴县', + 231181: '北安市', + 231182: '五大连池市', + 231202: '北林区', + 231221: '望奎县', + 231222: '兰西县', + 231223: '青冈县', + 231224: '庆安县', + 231225: '明水县', + 231226: '绥棱县', + 231281: '安达市', + 231282: '肇东市', + 231283: '海伦市', + 232721: '呼玛县', + 232722: '塔河县', + 232723: '漠河县', + 232790: '松岭区', + 232791: '呼中区', + 232792: '加格达奇区', + 232793: '新林区', + 310101: '黄浦区', + 310104: '徐汇区', + 310105: '长宁区', + 310106: '静安区', + 310107: '普陀区', + 310109: '虹口区', + 310110: '杨浦区', + 310112: '闵行区', + 310113: '宝山区', + 310114: '嘉定区', + 310115: '浦东新区', + 310116: '金山区', + 310117: '松江区', + 310118: '青浦区', + 310120: '奉贤区', + 310151: '崇明区', + 320102: '玄武区', + 320104: '秦淮区', + 320105: '建邺区', + 320106: '鼓楼区', + 320111: '浦口区', + 320113: '栖霞区', + 320114: '雨花台区', + 320115: '江宁区', + 320116: '六合区', + 320117: '溧水区', + 320118: '高淳区', + 320205: '锡山区', + 320206: '惠山区', + 320211: '滨湖区', + 320213: '梁溪区', + 320214: '新吴区', + 320281: '江阴市', + 320282: '宜兴市', + 320302: '鼓楼区', + 320303: '云龙区', + 320305: '贾汪区', + 320311: '泉山区', + 320312: '铜山区', + 320321: '丰县', + 320322: '沛县', + 320324: '睢宁县', + 320381: '新沂市', + 320382: '邳州市', + 320391: '工业园区', + 320402: '天宁区', + 320404: '钟楼区', + 320411: '新北区', + 320412: '武进区', + 320413: '金坛区', + 320481: '溧阳市', + 320505: '虎丘区', + 320506: '吴中区', + 320507: '相城区', + 320508: '姑苏区', + 320509: '吴江区', + 320581: '常熟市', + 320582: '张家港市', + 320583: '昆山市', + 320585: '太仓市', + 320590: '工业园区', + 320591: '高新区', + 320602: '崇川区', + 320611: '港闸区', + 320612: '通州区', + 320621: '海安县', + 320623: '如东县', + 320681: '启东市', + 320682: '如皋市', + 320684: '海门市', + 320691: '高新区', + 320703: '连云区', + 320706: '海州区', + 320707: '赣榆区', + 320722: '东海县', + 320723: '灌云县', + 320724: '灌南县', + 320803: '淮安区', + 320804: '淮阴区', + 320812: '清江浦区', + 320813: '洪泽区', + 320826: '涟水县', + 320830: '盱眙县', + 320831: '金湖县', + 320890: '经济开发区', + 320902: '亭湖区', + 320903: '盐都区', + 320904: '大丰区', + 320921: '响水县', + 320922: '滨海县', + 320923: '阜宁县', + 320924: '射阳县', + 320925: '建湖县', + 320981: '东台市', + 321002: '广陵区', + 321003: '邗江区', + 321012: '江都区', + 321023: '宝应县', + 321081: '仪征市', + 321084: '高邮市', + 321090: '经济开发区', + 321102: '京口区', + 321111: '润州区', + 321112: '丹徒区', + 321181: '丹阳市', + 321182: '扬中市', + 321183: '句容市', + 321202: '海陵区', + 321203: '高港区', + 321204: '姜堰区', + 321281: '兴化市', + 321282: '靖江市', + 321283: '泰兴市', + 321302: '宿城区', + 321311: '宿豫区', + 321322: '沭阳县', + 321323: '泗阳县', + 321324: '泗洪县', + 330102: '上城区', + 330103: '下城区', + 330104: '江干区', + 330105: '拱墅区', + 330106: '西湖区', + 330108: '滨江区', + 330109: '萧山区', + 330110: '余杭区', + 330111: '富阳区', + 330112: '临安区', + 330122: '桐庐县', + 330127: '淳安县', + 330182: '建德市', + 330203: '海曙区', + 330205: '江北区', + 330206: '北仑区', + 330211: '镇海区', + 330212: '鄞州区', + 330213: '奉化区', + 330225: '象山县', + 330226: '宁海县', + 330281: '余姚市', + 330282: '慈溪市', + 330302: '鹿城区', + 330303: '龙湾区', + 330304: '瓯海区', + 330305: '洞头区', + 330324: '永嘉县', + 330326: '平阳县', + 330327: '苍南县', + 330328: '文成县', + 330329: '泰顺县', + 330381: '瑞安市', + 330382: '乐清市', + 330402: '南湖区', + 330411: '秀洲区', + 330421: '嘉善县', + 330424: '海盐县', + 330481: '海宁市', + 330482: '平湖市', + 330483: '桐乡市', + 330502: '吴兴区', + 330503: '南浔区', + 330521: '德清县', + 330522: '长兴县', + 330523: '安吉县', + 330602: '越城区', + 330603: '柯桥区', + 330604: '上虞区', + 330624: '新昌县', + 330681: '诸暨市', + 330683: '嵊州市', + 330702: '婺城区', + 330703: '金东区', + 330723: '武义县', + 330726: '浦江县', + 330727: '磐安县', + 330781: '兰溪市', + 330782: '义乌市', + 330783: '东阳市', + 330784: '永康市', + 330802: '柯城区', + 330803: '衢江区', + 330822: '常山县', + 330824: '开化县', + 330825: '龙游县', + 330881: '江山市', + 330902: '定海区', + 330903: '普陀区', + 330921: '岱山县', + 330922: '嵊泗县', + 331002: '椒江区', + 331003: '黄岩区', + 331004: '路桥区', + 331022: '三门县', + 331023: '天台县', + 331024: '仙居县', + 331081: '温岭市', + 331082: '临海市', + 331083: '玉环市', + 331102: '莲都区', + 331121: '青田县', + 331122: '缙云县', + 331123: '遂昌县', + 331124: '松阳县', + 331125: '云和县', + 331126: '庆元县', + 331127: '景宁畲族自治县', + 331181: '龙泉市', + 340102: '瑶海区', + 340103: '庐阳区', + 340104: '蜀山区', + 340111: '包河区', + 340121: '长丰县', + 340122: '肥东县', + 340123: '肥西县', + 340124: '庐江县', + 340181: '巢湖市', + 340190: '高新技术开发区', + 340191: '经济技术开发区', + 340202: '镜湖区', + 340203: '弋江区', + 340207: '鸠江区', + 340208: '三山区', + 340221: '芜湖县', + 340222: '繁昌县', + 340223: '南陵县', + 340225: '无为县', + 340302: '龙子湖区', + 340303: '蚌山区', + 340304: '禹会区', + 340311: '淮上区', + 340321: '怀远县', + 340322: '五河县', + 340323: '固镇县', + 340402: '大通区', + 340403: '田家庵区', + 340404: '谢家集区', + 340405: '八公山区', + 340406: '潘集区', + 340421: '凤台县', + 340422: '寿县', + 340503: '花山区', + 340504: '雨山区', + 340506: '博望区', + 340521: '当涂县', + 340522: '含山县', + 340523: '和县', + 340602: '杜集区', + 340603: '相山区', + 340604: '烈山区', + 340621: '濉溪县', + 340705: '铜官区', + 340706: '义安区', + 340711: '郊区', + 340722: '枞阳县', + 340802: '迎江区', + 340803: '大观区', + 340811: '宜秀区', + 340822: '怀宁县', + 340824: '潜山县', + 340825: '太湖县', + 340826: '宿松县', + 340827: '望江县', + 340828: '岳西县', + 340881: '桐城市', + 341002: '屯溪区', + 341003: '黄山区', + 341004: '徽州区', + 341021: '歙县', + 341022: '休宁县', + 341023: '黟县', + 341024: '祁门县', + 341102: '琅琊区', + 341103: '南谯区', + 341122: '来安县', + 341124: '全椒县', + 341125: '定远县', + 341126: '凤阳县', + 341181: '天长市', + 341182: '明光市', + 341202: '颍州区', + 341203: '颍东区', + 341204: '颍泉区', + 341221: '临泉县', + 341222: '太和县', + 341225: '阜南县', + 341226: '颍上县', + 341282: '界首市', + 341302: '埇桥区', + 341321: '砀山县', + 341322: '萧县', + 341323: '灵璧县', + 341324: '泗县', + 341390: '经济开发区', + 341502: '金安区', + 341503: '裕安区', + 341504: '叶集区', + 341522: '霍邱县', + 341523: '舒城县', + 341524: '金寨县', + 341525: '霍山县', + 341602: '谯城区', + 341621: '涡阳县', + 341622: '蒙城县', + 341623: '利辛县', + 341702: '贵池区', + 341721: '东至县', + 341722: '石台县', + 341723: '青阳县', + 341802: '宣州区', + 341821: '郎溪县', + 341822: '广德县', + 341823: '泾县', + 341824: '绩溪县', + 341825: '旌德县', + 341881: '宁国市', + 350102: '鼓楼区', + 350103: '台江区', + 350104: '仓山区', + 350105: '马尾区', + 350111: '晋安区', + 350112: '长乐区', + 350121: '闽侯县', + 350122: '连江县', + 350123: '罗源县', + 350124: '闽清县', + 350125: '永泰县', + 350128: '平潭县', + 350181: '福清市', + 350203: '思明区', + 350205: '海沧区', + 350206: '湖里区', + 350211: '集美区', + 350212: '同安区', + 350213: '翔安区', + 350302: '城厢区', + 350303: '涵江区', + 350304: '荔城区', + 350305: '秀屿区', + 350322: '仙游县', + 350402: '梅列区', + 350403: '三元区', + 350421: '明溪县', + 350423: '清流县', + 350424: '宁化县', + 350425: '大田县', + 350426: '尤溪县', + 350427: '沙县', + 350428: '将乐县', + 350429: '泰宁县', + 350430: '建宁县', + 350481: '永安市', + 350502: '鲤城区', + 350503: '丰泽区', + 350504: '洛江区', + 350505: '泉港区', + 350521: '惠安县', + 350524: '安溪县', + 350525: '永春县', + 350526: '德化县', + 350527: '金门县', + 350581: '石狮市', + 350582: '晋江市', + 350583: '南安市', + 350602: '芗城区', + 350603: '龙文区', + 350622: '云霄县', + 350623: '漳浦县', + 350624: '诏安县', + 350625: '长泰县', + 350626: '东山县', + 350627: '南靖县', + 350628: '平和县', + 350629: '华安县', + 350681: '龙海市', + 350702: '延平区', + 350703: '建阳区', + 350721: '顺昌县', + 350722: '浦城县', + 350723: '光泽县', + 350724: '松溪县', + 350725: '政和县', + 350781: '邵武市', + 350782: '武夷山市', + 350783: '建瓯市', + 350802: '新罗区', + 350803: '永定区', + 350821: '长汀县', + 350823: '上杭县', + 350824: '武平县', + 350825: '连城县', + 350881: '漳平市', + 350902: '蕉城区', + 350921: '霞浦县', + 350922: '古田县', + 350923: '屏南县', + 350924: '寿宁县', + 350925: '周宁县', + 350926: '柘荣县', + 350981: '福安市', + 350982: '福鼎市', + 360102: '东湖区', + 360103: '西湖区', + 360104: '青云谱区', + 360105: '湾里区', + 360111: '青山湖区', + 360112: '新建区', + 360121: '南昌县', + 360123: '安义县', + 360124: '进贤县', + 360190: '经济技术开发区', + 360192: '高新区', + 360202: '昌江区', + 360203: '珠山区', + 360222: '浮梁县', + 360281: '乐平市', + 360302: '安源区', + 360313: '湘东区', + 360321: '莲花县', + 360322: '上栗县', + 360323: '芦溪县', + 360402: '濂溪区', + 360403: '浔阳区', + 360404: '柴桑区', + 360423: '武宁县', + 360424: '修水县', + 360425: '永修县', + 360426: '德安县', + 360428: '都昌县', + 360429: '湖口县', + 360430: '彭泽县', + 360481: '瑞昌市', + 360482: '共青城市', + 360483: '庐山市', + 360490: '经济技术开发区', + 360502: '渝水区', + 360521: '分宜县', + 360602: '月湖区', + 360622: '余江县', + 360681: '贵溪市', + 360702: '章贡区', + 360703: '南康区', + 360704: '赣县区', + 360722: '信丰县', + 360723: '大余县', + 360724: '上犹县', + 360725: '崇义县', + 360726: '安远县', + 360727: '龙南县', + 360728: '定南县', + 360729: '全南县', + 360730: '宁都县', + 360731: '于都县', + 360732: '兴国县', + 360733: '会昌县', + 360734: '寻乌县', + 360735: '石城县', + 360781: '瑞金市', + 360802: '吉州区', + 360803: '青原区', + 360821: '吉安县', + 360822: '吉水县', + 360823: '峡江县', + 360824: '新干县', + 360825: '永丰县', + 360826: '泰和县', + 360827: '遂川县', + 360828: '万安县', + 360829: '安福县', + 360830: '永新县', + 360881: '井冈山市', + 360902: '袁州区', + 360921: '奉新县', + 360922: '万载县', + 360923: '上高县', + 360924: '宜丰县', + 360925: '靖安县', + 360926: '铜鼓县', + 360981: '丰城市', + 360982: '樟树市', + 360983: '高安市', + 361002: '临川区', + 361003: '东乡区', + 361021: '南城县', + 361022: '黎川县', + 361023: '南丰县', + 361024: '崇仁县', + 361025: '乐安县', + 361026: '宜黄县', + 361027: '金溪县', + 361028: '资溪县', + 361030: '广昌县', + 361102: '信州区', + 361103: '广丰区', + 361121: '上饶县', + 361123: '玉山县', + 361124: '铅山县', + 361125: '横峰县', + 361126: '弋阳县', + 361127: '余干县', + 361128: '鄱阳县', + 361129: '万年县', + 361130: '婺源县', + 361181: '德兴市', + 370102: '历下区', + 370103: '市中区', + 370104: '槐荫区', + 370105: '天桥区', + 370112: '历城区', + 370113: '长清区', + 370114: '章丘区', + 370124: '平阴县', + 370125: '济阳县', + 370126: '商河县', + 370190: '高新区', + 370202: '市南区', + 370203: '市北区', + 370211: '黄岛区', + 370212: '崂山区', + 370213: '李沧区', + 370214: '城阳区', + 370215: '即墨区', + 370281: '胶州市', + 370283: '平度市', + 370285: '莱西市', + 370290: '开发区', + 370302: '淄川区', + 370303: '张店区', + 370304: '博山区', + 370305: '临淄区', + 370306: '周村区', + 370321: '桓台县', + 370322: '高青县', + 370323: '沂源县', + 370402: '市中区', + 370403: '薛城区', + 370404: '峄城区', + 370405: '台儿庄区', + 370406: '山亭区', + 370481: '滕州市', + 370502: '东营区', + 370503: '河口区', + 370505: '垦利区', + 370522: '利津县', + 370523: '广饶县', + 370602: '芝罘区', + 370611: '福山区', + 370612: '牟平区', + 370613: '莱山区', + 370634: '长岛县', + 370681: '龙口市', + 370682: '莱阳市', + 370683: '莱州市', + 370684: '蓬莱市', + 370685: '招远市', + 370686: '栖霞市', + 370687: '海阳市', + 370690: '开发区', + 370702: '潍城区', + 370703: '寒亭区', + 370704: '坊子区', + 370705: '奎文区', + 370724: '临朐县', + 370725: '昌乐县', + 370781: '青州市', + 370782: '诸城市', + 370783: '寿光市', + 370784: '安丘市', + 370785: '高密市', + 370786: '昌邑市', + 370790: '开发区', + 370791: '高新区', + 370811: '任城区', + 370812: '兖州区', + 370826: '微山县', + 370827: '鱼台县', + 370828: '金乡县', + 370829: '嘉祥县', + 370830: '汶上县', + 370831: '泗水县', + 370832: '梁山县', + 370881: '曲阜市', + 370883: '邹城市', + 370890: '高新区', + 370902: '泰山区', + 370911: '岱岳区', + 370921: '宁阳县', + 370923: '东平县', + 370982: '新泰市', + 370983: '肥城市', + 371002: '环翠区', + 371003: '文登区', + 371082: '荣成市', + 371083: '乳山市', + 371091: '经济技术开发区', + 371102: '东港区', + 371103: '岚山区', + 371121: '五莲县', + 371122: '莒县', + 371202: '莱城区', + 371203: '钢城区', + 371302: '兰山区', + 371311: '罗庄区', + 371312: '河东区', + 371321: '沂南县', + 371322: '郯城县', + 371323: '沂水县', + 371324: '兰陵县', + 371325: '费县', + 371326: '平邑县', + 371327: '莒南县', + 371328: '蒙阴县', + 371329: '临沭县', + 371402: '德城区', + 371403: '陵城区', + 371422: '宁津县', + 371423: '庆云县', + 371424: '临邑县', + 371425: '齐河县', + 371426: '平原县', + 371427: '夏津县', + 371428: '武城县', + 371481: '乐陵市', + 371482: '禹城市', + 371502: '东昌府区', + 371521: '阳谷县', + 371522: '莘县', + 371523: '茌平县', + 371524: '东阿县', + 371525: '冠县', + 371526: '高唐县', + 371581: '临清市', + 371602: '滨城区', + 371603: '沾化区', + 371621: '惠民县', + 371622: '阳信县', + 371623: '无棣县', + 371625: '博兴县', + 371626: '邹平县', + 371702: '牡丹区', + 371703: '定陶区', + 371721: '曹县', + 371722: '单县', + 371723: '成武县', + 371724: '巨野县', + 371725: '郓城县', + 371726: '鄄城县', + 371728: '东明县', + 410102: '中原区', + 410103: '二七区', + 410104: '管城回族区', + 410105: '金水区', + 410106: '上街区', + 410108: '惠济区', + 410122: '中牟县', + 410181: '巩义市', + 410182: '荥阳市', + 410183: '新密市', + 410184: '新郑市', + 410185: '登封市', + 410190: '高新技术开发区', + 410191: '经济技术开发区', + 410202: '龙亭区', + 410203: '顺河回族区', + 410204: '鼓楼区', + 410205: '禹王台区', + 410212: '祥符区', + 410221: '杞县', + 410222: '通许县', + 410223: '尉氏县', + 410225: '兰考县', + 410302: '老城区', + 410303: '西工区', + 410304: '瀍河回族区', + 410305: '涧西区', + 410306: '吉利区', + 410311: '洛龙区', + 410322: '孟津县', + 410323: '新安县', + 410324: '栾川县', + 410325: '嵩县', + 410326: '汝阳县', + 410327: '宜阳县', + 410328: '洛宁县', + 410329: '伊川县', + 410381: '偃师市', + 410402: '新华区', + 410403: '卫东区', + 410404: '石龙区', + 410411: '湛河区', + 410421: '宝丰县', + 410422: '叶县', + 410423: '鲁山县', + 410425: '郏县', + 410481: '舞钢市', + 410482: '汝州市', + 410502: '文峰区', + 410503: '北关区', + 410505: '殷都区', + 410506: '龙安区', + 410522: '安阳县', + 410523: '汤阴县', + 410526: '滑县', + 410527: '内黄县', + 410581: '林州市', + 410590: '开发区', + 410602: '鹤山区', + 410603: '山城区', + 410611: '淇滨区', + 410621: '浚县', + 410622: '淇县', + 410702: '红旗区', + 410703: '卫滨区', + 410704: '凤泉区', + 410711: '牧野区', + 410721: '新乡县', + 410724: '获嘉县', + 410725: '原阳县', + 410726: '延津县', + 410727: '封丘县', + 410728: '长垣县', + 410781: '卫辉市', + 410782: '辉县市', + 410802: '解放区', + 410803: '中站区', + 410804: '马村区', + 410811: '山阳区', + 410821: '修武县', + 410822: '博爱县', + 410823: '武陟县', + 410825: '温县', + 410882: '沁阳市', + 410883: '孟州市', + 410902: '华龙区', + 410922: '清丰县', + 410923: '南乐县', + 410926: '范县', + 410927: '台前县', + 410928: '濮阳县', + 411002: '魏都区', + 411003: '建安区', + 411024: '鄢陵县', + 411025: '襄城县', + 411081: '禹州市', + 411082: '长葛市', + 411102: '源汇区', + 411103: '郾城区', + 411104: '召陵区', + 411121: '舞阳县', + 411122: '临颍县', + 411202: '湖滨区', + 411203: '陕州区', + 411221: '渑池县', + 411224: '卢氏县', + 411281: '义马市', + 411282: '灵宝市', + 411302: '宛城区', + 411303: '卧龙区', + 411321: '南召县', + 411322: '方城县', + 411323: '西峡县', + 411324: '镇平县', + 411325: '内乡县', + 411326: '淅川县', + 411327: '社旗县', + 411328: '唐河县', + 411329: '新野县', + 411330: '桐柏县', + 411381: '邓州市', + 411402: '梁园区', + 411403: '睢阳区', + 411421: '民权县', + 411422: '睢县', + 411423: '宁陵县', + 411424: '柘城县', + 411425: '虞城县', + 411426: '夏邑县', + 411481: '永城市', + 411502: '浉河区', + 411503: '平桥区', + 411521: '罗山县', + 411522: '光山县', + 411523: '新县', + 411524: '商城县', + 411525: '固始县', + 411526: '潢川县', + 411527: '淮滨县', + 411528: '息县', + 411602: '川汇区', + 411621: '扶沟县', + 411622: '西华县', + 411623: '商水县', + 411624: '沈丘县', + 411625: '郸城县', + 411626: '淮阳县', + 411627: '太康县', + 411628: '鹿邑县', + 411681: '项城市', + 411690: '经济开发区', + 411702: '驿城区', + 411721: '西平县', + 411722: '上蔡县', + 411723: '平舆县', + 411724: '正阳县', + 411725: '确山县', + 411726: '泌阳县', + 411727: '汝南县', + 411728: '遂平县', + 411729: '新蔡县', + 419001: '济源市', + 420102: '江岸区', + 420103: '江汉区', + 420104: '硚口区', + 420105: '汉阳区', + 420106: '武昌区', + 420107: '青山区', + 420111: '洪山区', + 420112: '东西湖区', + 420113: '汉南区', + 420114: '蔡甸区', + 420115: '江夏区', + 420116: '黄陂区', + 420117: '新洲区', + 420202: '黄石港区', + 420203: '西塞山区', + 420204: '下陆区', + 420205: '铁山区', + 420222: '阳新县', + 420281: '大冶市', + 420302: '茅箭区', + 420303: '张湾区', + 420304: '郧阳区', + 420322: '郧西县', + 420323: '竹山县', + 420324: '竹溪县', + 420325: '房县', + 420381: '丹江口市', + 420502: '西陵区', + 420503: '伍家岗区', + 420504: '点军区', + 420505: '猇亭区', + 420506: '夷陵区', + 420525: '远安县', + 420526: '兴山县', + 420527: '秭归县', + 420528: '长阳土家族自治县', + 420529: '五峰土家族自治县', + 420581: '宜都市', + 420582: '当阳市', + 420583: '枝江市', + 420590: '经济开发区', + 420602: '襄城区', + 420606: '樊城区', + 420607: '襄州区', + 420624: '南漳县', + 420625: '谷城县', + 420626: '保康县', + 420682: '老河口市', + 420683: '枣阳市', + 420684: '宜城市', + 420702: '梁子湖区', + 420703: '华容区', + 420704: '鄂城区', + 420802: '东宝区', + 420804: '掇刀区', + 420821: '京山县', + 420822: '沙洋县', + 420881: '钟祥市', + 420902: '孝南区', + 420921: '孝昌县', + 420922: '大悟县', + 420923: '云梦县', + 420981: '应城市', + 420982: '安陆市', + 420984: '汉川市', + 421002: '沙市区', + 421003: '荆州区', + 421022: '公安县', + 421023: '监利县', + 421024: '江陵县', + 421081: '石首市', + 421083: '洪湖市', + 421087: '松滋市', + 421102: '黄州区', + 421121: '团风县', + 421122: '红安县', + 421123: '罗田县', + 421124: '英山县', + 421125: '浠水县', + 421126: '蕲春县', + 421127: '黄梅县', + 421181: '麻城市', + 421182: '武穴市', + 421202: '咸安区', + 421221: '嘉鱼县', + 421222: '通城县', + 421223: '崇阳县', + 421224: '通山县', + 421281: '赤壁市', + 421303: '曾都区', + 421321: '随县', + 421381: '广水市', + 422801: '恩施市', + 422802: '利川市', + 422822: '建始县', + 422823: '巴东县', + 422825: '宣恩县', + 422826: '咸丰县', + 422827: '来凤县', + 422828: '鹤峰县', + 429004: '仙桃市', + 429005: '潜江市', + 429006: '天门市', + 429021: '神农架林区', + 430102: '芙蓉区', + 430103: '天心区', + 430104: '岳麓区', + 430105: '开福区', + 430111: '雨花区', + 430112: '望城区', + 430121: '长沙县', + 430181: '浏阳市', + 430182: '宁乡市', + 430202: '荷塘区', + 430203: '芦淞区', + 430204: '石峰区', + 430211: '天元区', + 430221: '株洲县', + 430223: '攸县', + 430224: '茶陵县', + 430225: '炎陵县', + 430281: '醴陵市', + 430302: '雨湖区', + 430304: '岳塘区', + 430321: '湘潭县', + 430381: '湘乡市', + 430382: '韶山市', + 430405: '珠晖区', + 430406: '雁峰区', + 430407: '石鼓区', + 430408: '蒸湘区', + 430412: '南岳区', + 430421: '衡阳县', + 430422: '衡南县', + 430423: '衡山县', + 430424: '衡东县', + 430426: '祁东县', + 430481: '耒阳市', + 430482: '常宁市', + 430502: '双清区', + 430503: '大祥区', + 430511: '北塔区', + 430521: '邵东县', + 430522: '新邵县', + 430523: '邵阳县', + 430524: '隆回县', + 430525: '洞口县', + 430527: '绥宁县', + 430528: '新宁县', + 430529: '城步苗族自治县', + 430581: '武冈市', + 430602: '岳阳楼区', + 430603: '云溪区', + 430611: '君山区', + 430621: '岳阳县', + 430623: '华容县', + 430624: '湘阴县', + 430626: '平江县', + 430681: '汨罗市', + 430682: '临湘市', + 430702: '武陵区', + 430703: '鼎城区', + 430721: '安乡县', + 430722: '汉寿县', + 430723: '澧县', + 430724: '临澧县', + 430725: '桃源县', + 430726: '石门县', + 430781: '津市市', + 430802: '永定区', + 430811: '武陵源区', + 430821: '慈利县', + 430822: '桑植县', + 430902: '资阳区', + 430903: '赫山区', + 430921: '南县', + 430922: '桃江县', + 430923: '安化县', + 430981: '沅江市', + 431002: '北湖区', + 431003: '苏仙区', + 431021: '桂阳县', + 431022: '宜章县', + 431023: '永兴县', + 431024: '嘉禾县', + 431025: '临武县', + 431026: '汝城县', + 431027: '桂东县', + 431028: '安仁县', + 431081: '资兴市', + 431102: '零陵区', + 431103: '冷水滩区', + 431121: '祁阳县', + 431122: '东安县', + 431123: '双牌县', + 431124: '道县', + 431125: '江永县', + 431126: '宁远县', + 431127: '蓝山县', + 431128: '新田县', + 431129: '江华瑶族自治县', + 431202: '鹤城区', + 431221: '中方县', + 431222: '沅陵县', + 431223: '辰溪县', + 431224: '溆浦县', + 431225: '会同县', + 431226: '麻阳苗族自治县', + 431227: '新晃侗族自治县', + 431228: '芷江侗族自治县', + 431229: '靖州苗族侗族自治县', + 431230: '通道侗族自治县', + 431281: '洪江市', + 431302: '娄星区', + 431321: '双峰县', + 431322: '新化县', + 431381: '冷水江市', + 431382: '涟源市', + 433101: '吉首市', + 433122: '泸溪县', + 433123: '凤凰县', + 433124: '花垣县', + 433125: '保靖县', + 433126: '古丈县', + 433127: '永顺县', + 433130: '龙山县', + 440103: '荔湾区', + 440104: '越秀区', + 440105: '海珠区', + 440106: '天河区', + 440111: '白云区', + 440112: '黄埔区', + 440113: '番禺区', + 440114: '花都区', + 440115: '南沙区', + 440117: '从化区', + 440118: '增城区', + 440203: '武江区', + 440204: '浈江区', + 440205: '曲江区', + 440222: '始兴县', + 440224: '仁化县', + 440229: '翁源县', + 440232: '乳源瑶族自治县', + 440233: '新丰县', + 440281: '乐昌市', + 440282: '南雄市', + 440303: '罗湖区', + 440304: '福田区', + 440305: '南山区', + 440306: '宝安区', + 440307: '龙岗区', + 440308: '盐田区', + 440309: '龙华区', + 440310: '坪山区', + 440402: '香洲区', + 440403: '斗门区', + 440404: '金湾区', + 440507: '龙湖区', + 440511: '金平区', + 440512: '濠江区', + 440513: '潮阳区', + 440514: '潮南区', + 440515: '澄海区', + 440523: '南澳县', + 440604: '禅城区', + 440605: '南海区', + 440606: '顺德区', + 440607: '三水区', + 440608: '高明区', + 440703: '蓬江区', + 440704: '江海区', + 440705: '新会区', + 440781: '台山市', + 440783: '开平市', + 440784: '鹤山市', + 440785: '恩平市', + 440802: '赤坎区', + 440803: '霞山区', + 440804: '坡头区', + 440811: '麻章区', + 440823: '遂溪县', + 440825: '徐闻县', + 440881: '廉江市', + 440882: '雷州市', + 440883: '吴川市', + 440890: '经济技术开发区', + 440902: '茂南区', + 440904: '电白区', + 440981: '高州市', + 440982: '化州市', + 440983: '信宜市', + 441202: '端州区', + 441203: '鼎湖区', + 441204: '高要区', + 441223: '广宁县', + 441224: '怀集县', + 441225: '封开县', + 441226: '德庆县', + 441284: '四会市', + 441302: '惠城区', + 441303: '惠阳区', + 441322: '博罗县', + 441323: '惠东县', + 441324: '龙门县', + 441402: '梅江区', + 441403: '梅县区', + 441422: '大埔县', + 441423: '丰顺县', + 441424: '五华县', + 441426: '平远县', + 441427: '蕉岭县', + 441481: '兴宁市', + 441502: '城区', + 441521: '海丰县', + 441523: '陆河县', + 441581: '陆丰市', + 441602: '源城区', + 441621: '紫金县', + 441622: '龙川县', + 441623: '连平县', + 441624: '和平县', + 441625: '东源县', + 441702: '江城区', + 441704: '阳东区', + 441721: '阳西县', + 441781: '阳春市', + 441802: '清城区', + 441803: '清新区', + 441821: '佛冈县', + 441823: '阳山县', + 441825: '连山壮族瑶族自治县', + 441826: '连南瑶族自治县', + 441881: '英德市', + 441882: '连州市', + 441901: '中堂镇', + 441903: '南城区', + 441904: '长安镇', + 441905: '东坑镇', + 441906: '樟木头镇', + 441907: '莞城区', + 441908: '石龙镇', + 441909: '桥头镇', + 441910: '万江区', + 441911: '麻涌镇', + 441912: '虎门镇', + 441913: '谢岗镇', + 441914: '石碣镇', + 441915: '茶山镇', + 441916: '东城区', + 441917: '洪梅镇', + 441918: '道滘镇', + 441919: '高埗镇', + 441920: '企石镇', + 441921: '凤岗镇', + 441922: '大岭山镇', + 441923: '松山湖', + 441924: '清溪镇', + 441925: '望牛墩镇', + 441926: '厚街镇', + 441927: '常平镇', + 441928: '寮步镇', + 441929: '石排镇', + 441930: '横沥镇', + 441931: '塘厦镇', + 441932: '黄江镇', + 441933: '大朗镇', + 441990: '沙田镇', + 442001: '南头镇', + 442002: '神湾镇', + 442003: '东凤镇', + 442004: '五桂山镇', + 442005: '黄圃镇', + 442006: '小榄镇', + 442007: '石岐区街道', + 442008: '横栏镇', + 442009: '三角镇', + 442010: '三乡镇', + 442011: '港口镇', + 442012: '沙溪镇', + 442013: '板芙镇', + 442014: '沙朗镇', + 442015: '东升镇', + 442016: '阜沙镇', + 442017: '民众镇', + 442018: '东区街道', + 442019: '火炬开发区', + 442020: '西区街道', + 442021: '南区街道', + 442022: '古镇', + 442023: '坦洲镇', + 442024: '大涌镇', + 442025: '南朗镇', + 445102: '湘桥区', + 445103: '潮安区', + 445122: '饶平县', + 445202: '榕城区', + 445203: '揭东区', + 445222: '揭西县', + 445224: '惠来县', + 445281: '普宁市', + 445302: '云城区', + 445303: '云安区', + 445321: '新兴县', + 445322: '郁南县', + 445381: '罗定市', + 450102: '兴宁区', + 450103: '青秀区', + 450105: '江南区', + 450107: '西乡塘区', + 450108: '良庆区', + 450109: '邕宁区', + 450110: '武鸣区', + 450123: '隆安县', + 450124: '马山县', + 450125: '上林县', + 450126: '宾阳县', + 450127: '横县', + 450202: '城中区', + 450203: '鱼峰区', + 450204: '柳南区', + 450205: '柳北区', + 450206: '柳江区', + 450222: '柳城县', + 450223: '鹿寨县', + 450224: '融安县', + 450225: '融水苗族自治县', + 450226: '三江侗族自治县', + 450302: '秀峰区', + 450303: '叠彩区', + 450304: '象山区', + 450305: '七星区', + 450311: '雁山区', + 450312: '临桂区', + 450321: '阳朔县', + 450323: '灵川县', + 450324: '全州县', + 450325: '兴安县', + 450326: '永福县', + 450327: '灌阳县', + 450328: '龙胜各族自治县', + 450329: '资源县', + 450330: '平乐县', + 450331: '荔浦县', + 450332: '恭城瑶族自治县', + 450403: '万秀区', + 450405: '长洲区', + 450406: '龙圩区', + 450421: '苍梧县', + 450422: '藤县', + 450423: '蒙山县', + 450481: '岑溪市', + 450502: '海城区', + 450503: '银海区', + 450512: '铁山港区', + 450521: '合浦县', + 450602: '港口区', + 450603: '防城区', + 450621: '上思县', + 450681: '东兴市', + 450702: '钦南区', + 450703: '钦北区', + 450721: '灵山县', + 450722: '浦北县', + 450802: '港北区', + 450803: '港南区', + 450804: '覃塘区', + 450821: '平南县', + 450881: '桂平市', + 450902: '玉州区', + 450903: '福绵区', + 450921: '容县', + 450922: '陆川县', + 450923: '博白县', + 450924: '兴业县', + 450981: '北流市', + 451002: '右江区', + 451021: '田阳县', + 451022: '田东县', + 451023: '平果县', + 451024: '德保县', + 451026: '那坡县', + 451027: '凌云县', + 451028: '乐业县', + 451029: '田林县', + 451030: '西林县', + 451031: '隆林各族自治县', + 451081: '靖西市', + 451102: '八步区', + 451103: '平桂区', + 451121: '昭平县', + 451122: '钟山县', + 451123: '富川瑶族自治县', + 451202: '金城江区', + 451203: '宜州区', + 451221: '南丹县', + 451222: '天峨县', + 451223: '凤山县', + 451224: '东兰县', + 451225: '罗城仫佬族自治县', + 451226: '环江毛南族自治县', + 451227: '巴马瑶族自治县', + 451228: '都安瑶族自治县', + 451229: '大化瑶族自治县', + 451302: '兴宾区', + 451321: '忻城县', + 451322: '象州县', + 451323: '武宣县', + 451324: '金秀瑶族自治县', + 451381: '合山市', + 451402: '江州区', + 451421: '扶绥县', + 451422: '宁明县', + 451423: '龙州县', + 451424: '大新县', + 451425: '天等县', + 451481: '凭祥市', + 460105: '秀英区', + 460106: '龙华区', + 460107: '琼山区', + 460108: '美兰区', + 460202: '海棠区', + 460203: '吉阳区', + 460204: '天涯区', + 460205: '崖州区', + 460321: '西沙群岛', + 460322: '南沙群岛', + 460323: '中沙群岛的岛礁及其海域', + 460401: '那大镇', + 460402: '和庆镇', + 460403: '南丰镇', + 460404: '大成镇', + 460405: '雅星镇', + 460406: '兰洋镇', + 460407: '光村镇', + 460408: '木棠镇', + 460409: '海头镇', + 460410: '峨蔓镇', + 460411: '王五镇', + 460412: '白马井镇', + 460413: '中和镇', + 460414: '排浦镇', + 460415: '东成镇', + 460416: '新州镇', + 469001: '五指山市', + 469002: '琼海市', + 469005: '文昌市', + 469006: '万宁市', + 469007: '东方市', + 469021: '定安县', + 469022: '屯昌县', + 469023: '澄迈县', + 469024: '临高县', + 469025: '白沙黎族自治县', + 469026: '昌江黎族自治县', + 469027: '乐东黎族自治县', + 469028: '陵水黎族自治县', + 469029: '保亭黎族苗族自治县', + 469030: '琼中黎族苗族自治县', + 500101: '万州区', + 500102: '涪陵区', + 500103: '渝中区', + 500104: '大渡口区', + 500105: '江北区', + 500106: '沙坪坝区', + 500107: '九龙坡区', + 500108: '南岸区', + 500109: '北碚区', + 500110: '綦江区', + 500111: '大足区', + 500112: '渝北区', + 500113: '巴南区', + 500114: '黔江区', + 500115: '长寿区', + 500116: '江津区', + 500117: '合川区', + 500118: '永川区', + 500119: '南川区', + 500120: '璧山区', + 500151: '铜梁区', + 500152: '潼南区', + 500153: '荣昌区', + 500154: '开州区', + 500155: '梁平区', + 500156: '武隆区', + 500229: '城口县', + 500230: '丰都县', + 500231: '垫江县', + 500233: '忠县', + 500235: '云阳县', + 500236: '奉节县', + 500237: '巫山县', + 500238: '巫溪县', + 500240: '石柱土家族自治县', + 500241: '秀山土家族苗族自治县', + 500242: '酉阳土家族苗族自治县', + 500243: '彭水苗族土家族自治县', + 510104: '锦江区', + 510105: '青羊区', + 510106: '金牛区', + 510107: '武侯区', + 510108: '成华区', + 510112: '龙泉驿区', + 510113: '青白江区', + 510114: '新都区', + 510115: '温江区', + 510116: '双流区', + 510117: '郫都区', + 510121: '金堂县', + 510129: '大邑县', + 510131: '蒲江县', + 510132: '新津县', + 510181: '都江堰市', + 510182: '彭州市', + 510183: '邛崃市', + 510184: '崇州市', + 510185: '简阳市', + 510191: '高新区', + 510302: '自流井区', + 510303: '贡井区', + 510304: '大安区', + 510311: '沿滩区', + 510321: '荣县', + 510322: '富顺县', + 510402: '东区', + 510403: '西区', + 510411: '仁和区', + 510421: '米易县', + 510422: '盐边县', + 510502: '江阳区', + 510503: '纳溪区', + 510504: '龙马潭区', + 510521: '泸县', + 510522: '合江县', + 510524: '叙永县', + 510525: '古蔺县', + 510603: '旌阳区', + 510604: '罗江区', + 510623: '中江县', + 510681: '广汉市', + 510682: '什邡市', + 510683: '绵竹市', + 510703: '涪城区', + 510704: '游仙区', + 510705: '安州区', + 510722: '三台县', + 510723: '盐亭县', + 510725: '梓潼县', + 510726: '北川羌族自治县', + 510727: '平武县', + 510781: '江油市', + 510791: '高新区', + 510802: '利州区', + 510811: '昭化区', + 510812: '朝天区', + 510821: '旺苍县', + 510822: '青川县', + 510823: '剑阁县', + 510824: '苍溪县', + 510903: '船山区', + 510904: '安居区', + 510921: '蓬溪县', + 510922: '射洪县', + 510923: '大英县', + 511002: '市中区', + 511011: '东兴区', + 511024: '威远县', + 511025: '资中县', + 511083: '隆昌市', + 511102: '市中区', + 511111: '沙湾区', + 511112: '五通桥区', + 511113: '金口河区', + 511123: '犍为县', + 511124: '井研县', + 511126: '夹江县', + 511129: '沐川县', + 511132: '峨边彝族自治县', + 511133: '马边彝族自治县', + 511181: '峨眉山市', + 511302: '顺庆区', + 511303: '高坪区', + 511304: '嘉陵区', + 511321: '南部县', + 511322: '营山县', + 511323: '蓬安县', + 511324: '仪陇县', + 511325: '西充县', + 511381: '阆中市', + 511402: '东坡区', + 511403: '彭山区', + 511421: '仁寿县', + 511423: '洪雅县', + 511424: '丹棱县', + 511425: '青神县', + 511502: '翠屏区', + 511503: '南溪区', + 511521: '宜宾县', + 511523: '江安县', + 511524: '长宁县', + 511525: '高县', + 511526: '珙县', + 511527: '筠连县', + 511528: '兴文县', + 511529: '屏山县', + 511602: '广安区', + 511603: '前锋区', + 511621: '岳池县', + 511622: '武胜县', + 511623: '邻水县', + 511681: '华蓥市', + 511702: '通川区', + 511703: '达川区', + 511722: '宣汉县', + 511723: '开江县', + 511724: '大竹县', + 511725: '渠县', + 511781: '万源市', + 511802: '雨城区', + 511803: '名山区', + 511822: '荥经县', + 511823: '汉源县', + 511824: '石棉县', + 511825: '天全县', + 511826: '芦山县', + 511827: '宝兴县', + 511902: '巴州区', + 511903: '恩阳区', + 511921: '通江县', + 511922: '南江县', + 511923: '平昌县', + 512002: '雁江区', + 512021: '安岳县', + 512022: '乐至县', + 513201: '马尔康市', + 513221: '汶川县', + 513222: '理县', + 513223: '茂县', + 513224: '松潘县', + 513225: '九寨沟县', + 513226: '金川县', + 513227: '小金县', + 513228: '黑水县', + 513230: '壤塘县', + 513231: '阿坝县', + 513232: '若尔盖县', + 513233: '红原县', + 513301: '康定市', + 513322: '泸定县', + 513323: '丹巴县', + 513324: '九龙县', + 513325: '雅江县', + 513326: '道孚县', + 513327: '炉霍县', + 513328: '甘孜县', + 513329: '新龙县', + 513330: '德格县', + 513331: '白玉县', + 513332: '石渠县', + 513333: '色达县', + 513334: '理塘县', + 513335: '巴塘县', + 513336: '乡城县', + 513337: '稻城县', + 513338: '得荣县', + 513401: '西昌市', + 513422: '木里藏族自治县', + 513423: '盐源县', + 513424: '德昌县', + 513425: '会理县', + 513426: '会东县', + 513427: '宁南县', + 513428: '普格县', + 513429: '布拖县', + 513430: '金阳县', + 513431: '昭觉县', + 513432: '喜德县', + 513433: '冕宁县', + 513434: '越西县', + 513435: '甘洛县', + 513436: '美姑县', + 513437: '雷波县', + 520102: '南明区', + 520103: '云岩区', + 520111: '花溪区', + 520112: '乌当区', + 520113: '白云区', + 520115: '观山湖区', + 520121: '开阳县', + 520122: '息烽县', + 520123: '修文县', + 520181: '清镇市', + 520201: '钟山区', + 520203: '六枝特区', + 520221: '水城县', + 520281: '盘州市', + 520302: '红花岗区', + 520303: '汇川区', + 520304: '播州区', + 520322: '桐梓县', + 520323: '绥阳县', + 520324: '正安县', + 520325: '道真仡佬族苗族自治县', + 520326: '务川仡佬族苗族自治县', + 520327: '凤冈县', + 520328: '湄潭县', + 520329: '余庆县', + 520330: '习水县', + 520381: '赤水市', + 520382: '仁怀市', + 520402: '西秀区', + 520403: '平坝区', + 520422: '普定县', + 520423: '镇宁布依族苗族自治县', + 520424: '关岭布依族苗族自治县', + 520425: '紫云苗族布依族自治县', + 520502: '七星关区', + 520521: '大方县', + 520522: '黔西县', + 520523: '金沙县', + 520524: '织金县', + 520525: '纳雍县', + 520526: '威宁彝族回族苗族自治县', + 520527: '赫章县', + 520602: '碧江区', + 520603: '万山区', + 520621: '江口县', + 520622: '玉屏侗族自治县', + 520623: '石阡县', + 520624: '思南县', + 520625: '印江土家族苗族自治县', + 520626: '德江县', + 520627: '沿河土家族自治县', + 520628: '松桃苗族自治县', + 522301: '兴义市', + 522322: '兴仁县', + 522323: '普安县', + 522324: '晴隆县', + 522325: '贞丰县', + 522326: '望谟县', + 522327: '册亨县', + 522328: '安龙县', + 522601: '凯里市', + 522622: '黄平县', + 522623: '施秉县', + 522624: '三穗县', + 522625: '镇远县', + 522626: '岑巩县', + 522627: '天柱县', + 522628: '锦屏县', + 522629: '剑河县', + 522630: '台江县', + 522631: '黎平县', + 522632: '榕江县', + 522633: '从江县', + 522634: '雷山县', + 522635: '麻江县', + 522636: '丹寨县', + 522701: '都匀市', + 522702: '福泉市', + 522722: '荔波县', + 522723: '贵定县', + 522725: '瓮安县', + 522726: '独山县', + 522727: '平塘县', + 522728: '罗甸县', + 522729: '长顺县', + 522730: '龙里县', + 522731: '惠水县', + 522732: '三都水族自治县', + 530102: '五华区', + 530103: '盘龙区', + 530111: '官渡区', + 530112: '西山区', + 530113: '东川区', + 530114: '呈贡区', + 530115: '晋宁区', + 530124: '富民县', + 530125: '宜良县', + 530126: '石林彝族自治县', + 530127: '嵩明县', + 530128: '禄劝彝族苗族自治县', + 530129: '寻甸回族彝族自治县', + 530181: '安宁市', + 530302: '麒麟区', + 530303: '沾益区', + 530321: '马龙县', + 530322: '陆良县', + 530323: '师宗县', + 530324: '罗平县', + 530325: '富源县', + 530326: '会泽县', + 530381: '宣威市', + 530402: '红塔区', + 530403: '江川区', + 530422: '澄江县', + 530423: '通海县', + 530424: '华宁县', + 530425: '易门县', + 530426: '峨山彝族自治县', + 530427: '新平彝族傣族自治县', + 530428: '元江哈尼族彝族傣族自治县', + 530502: '隆阳区', + 530521: '施甸县', + 530523: '龙陵县', + 530524: '昌宁县', + 530581: '腾冲市', + 530602: '昭阳区', + 530621: '鲁甸县', + 530622: '巧家县', + 530623: '盐津县', + 530624: '大关县', + 530625: '永善县', + 530626: '绥江县', + 530627: '镇雄县', + 530628: '彝良县', + 530629: '威信县', + 530630: '水富县', + 530702: '古城区', + 530721: '玉龙纳西族自治县', + 530722: '永胜县', + 530723: '华坪县', + 530724: '宁蒗彝族自治县', + 530802: '思茅区', + 530821: '宁洱哈尼族彝族自治县', + 530822: '墨江哈尼族自治县', + 530823: '景东彝族自治县', + 530824: '景谷傣族彝族自治县', + 530825: '镇沅彝族哈尼族拉祜族自治县', + 530826: '江城哈尼族彝族自治县', + 530827: '孟连傣族拉祜族佤族自治县', + 530828: '澜沧拉祜族自治县', + 530829: '西盟佤族自治县', + 530902: '临翔区', + 530921: '凤庆县', + 530922: '云县', + 530923: '永德县', + 530924: '镇康县', + 530925: '双江拉祜族佤族布朗族傣族自治县', + 530926: '耿马傣族佤族自治县', + 530927: '沧源佤族自治县', + 532301: '楚雄市', + 532322: '双柏县', + 532323: '牟定县', + 532324: '南华县', + 532325: '姚安县', + 532326: '大姚县', + 532327: '永仁县', + 532328: '元谋县', + 532329: '武定县', + 532331: '禄丰县', + 532501: '个旧市', + 532502: '开远市', + 532503: '蒙自市', + 532504: '弥勒市', + 532523: '屏边苗族自治县', + 532524: '建水县', + 532525: '石屏县', + 532527: '泸西县', + 532528: '元阳县', + 532529: '红河县', + 532530: '金平苗族瑶族傣族自治县', + 532531: '绿春县', + 532532: '河口瑶族自治县', + 532601: '文山市', + 532622: '砚山县', + 532623: '西畴县', + 532624: '麻栗坡县', + 532625: '马关县', + 532626: '丘北县', + 532627: '广南县', + 532628: '富宁县', + 532801: '景洪市', + 532822: '勐海县', + 532823: '勐腊县', + 532901: '大理市', + 532922: '漾濞彝族自治县', + 532923: '祥云县', + 532924: '宾川县', + 532925: '弥渡县', + 532926: '南涧彝族自治县', + 532927: '巍山彝族回族自治县', + 532928: '永平县', + 532929: '云龙县', + 532930: '洱源县', + 532931: '剑川县', + 532932: '鹤庆县', + 533102: '瑞丽市', + 533103: '芒市', + 533122: '梁河县', + 533123: '盈江县', + 533124: '陇川县', + 533301: '泸水市', + 533323: '福贡县', + 533324: '贡山独龙族怒族自治县', + 533325: '兰坪白族普米族自治县', + 533401: '香格里拉市', + 533422: '德钦县', + 533423: '维西傈僳族自治县', + 540102: '城关区', + 540103: '堆龙德庆区', + 540104: '达孜区', + 540121: '林周县', + 540122: '当雄县', + 540123: '尼木县', + 540124: '曲水县', + 540127: '墨竹工卡县', + 540202: '桑珠孜区', + 540221: '南木林县', + 540222: '江孜县', + 540223: '定日县', + 540224: '萨迦县', + 540225: '拉孜县', + 540226: '昂仁县', + 540227: '谢通门县', + 540228: '白朗县', + 540229: '仁布县', + 540230: '康马县', + 540231: '定结县', + 540232: '仲巴县', + 540233: '亚东县', + 540234: '吉隆县', + 540235: '聂拉木县', + 540236: '萨嘎县', + 540237: '岗巴县', + 540302: '卡若区', + 540321: '江达县', + 540322: '贡觉县', + 540323: '类乌齐县', + 540324: '丁青县', + 540325: '察雅县', + 540326: '八宿县', + 540327: '左贡县', + 540328: '芒康县', + 540329: '洛隆县', + 540330: '边坝县', + 540402: '巴宜区', + 540421: '工布江达县', + 540422: '米林县', + 540423: '墨脱县', + 540424: '波密县', + 540425: '察隅县', + 540426: '朗县', + 540502: '乃东区', + 540521: '扎囊县', + 540522: '贡嘎县', + 540523: '桑日县', + 540524: '琼结县', + 540525: '曲松县', + 540526: '措美县', + 540527: '洛扎县', + 540528: '加查县', + 540529: '隆子县', + 540530: '错那县', + 540531: '浪卡子县', + 540602: '色尼区', + 542421: '那曲县', + 542422: '嘉黎县', + 542423: '比如县', + 542424: '聂荣县', + 542425: '安多县', + 542426: '申扎县', + 542427: '索县', + 542428: '班戈县', + 542429: '巴青县', + 542430: '尼玛县', + 542431: '双湖县', + 542521: '普兰县', + 542522: '札达县', + 542523: '噶尔县', + 542524: '日土县', + 542525: '革吉县', + 542526: '改则县', + 542527: '措勤县', + 610102: '新城区', + 610103: '碑林区', + 610104: '莲湖区', + 610111: '灞桥区', + 610112: '未央区', + 610113: '雁塔区', + 610114: '阎良区', + 610115: '临潼区', + 610116: '长安区', + 610117: '高陵区', + 610118: '鄠邑区', + 610122: '蓝田县', + 610124: '周至县', + 610202: '王益区', + 610203: '印台区', + 610204: '耀州区', + 610222: '宜君县', + 610302: '渭滨区', + 610303: '金台区', + 610304: '陈仓区', + 610322: '凤翔县', + 610323: '岐山县', + 610324: '扶风县', + 610326: '眉县', + 610327: '陇县', + 610328: '千阳县', + 610329: '麟游县', + 610330: '凤县', + 610331: '太白县', + 610402: '秦都区', + 610403: '杨陵区', + 610404: '渭城区', + 610422: '三原县', + 610423: '泾阳县', + 610424: '乾县', + 610425: '礼泉县', + 610426: '永寿县', + 610427: '彬县', + 610428: '长武县', + 610429: '旬邑县', + 610430: '淳化县', + 610431: '武功县', + 610481: '兴平市', + 610502: '临渭区', + 610503: '华州区', + 610522: '潼关县', + 610523: '大荔县', + 610524: '合阳县', + 610525: '澄城县', + 610526: '蒲城县', + 610527: '白水县', + 610528: '富平县', + 610581: '韩城市', + 610582: '华阴市', + 610602: '宝塔区', + 610603: '安塞区', + 610621: '延长县', + 610622: '延川县', + 610623: '子长县', + 610625: '志丹县', + 610626: '吴起县', + 610627: '甘泉县', + 610628: '富县', + 610629: '洛川县', + 610630: '宜川县', + 610631: '黄龙县', + 610632: '黄陵县', + 610702: '汉台区', + 610703: '南郑区', + 610722: '城固县', + 610723: '洋县', + 610724: '西乡县', + 610725: '勉县', + 610726: '宁强县', + 610727: '略阳县', + 610728: '镇巴县', + 610729: '留坝县', + 610730: '佛坪县', + 610802: '榆阳区', + 610803: '横山区', + 610822: '府谷县', + 610824: '靖边县', + 610825: '定边县', + 610826: '绥德县', + 610827: '米脂县', + 610828: '佳县', + 610829: '吴堡县', + 610830: '清涧县', + 610831: '子洲县', + 610881: '神木市', + 610902: '汉滨区', + 610921: '汉阴县', + 610922: '石泉县', + 610923: '宁陕县', + 610924: '紫阳县', + 610925: '岚皋县', + 610926: '平利县', + 610927: '镇坪县', + 610928: '旬阳县', + 610929: '白河县', + 611002: '商州区', + 611021: '洛南县', + 611022: '丹凤县', + 611023: '商南县', + 611024: '山阳县', + 611025: '镇安县', + 611026: '柞水县', + 620102: '城关区', + 620103: '七里河区', + 620104: '西固区', + 620105: '安宁区', + 620111: '红古区', + 620121: '永登县', + 620122: '皋兰县', + 620123: '榆中县', + 620201: '市辖区', + 620290: '雄关区', + 620291: '长城区', + 620292: '镜铁区', + 620293: '新城镇', + 620294: '峪泉镇', + 620295: '文殊镇', + 620302: '金川区', + 620321: '永昌县', + 620402: '白银区', + 620403: '平川区', + 620421: '靖远县', + 620422: '会宁县', + 620423: '景泰县', + 620502: '秦州区', + 620503: '麦积区', + 620521: '清水县', + 620522: '秦安县', + 620523: '甘谷县', + 620524: '武山县', + 620525: '张家川回族自治县', + 620602: '凉州区', + 620621: '民勤县', + 620622: '古浪县', + 620623: '天祝藏族自治县', + 620702: '甘州区', + 620721: '肃南裕固族自治县', + 620722: '民乐县', + 620723: '临泽县', + 620724: '高台县', + 620725: '山丹县', + 620802: '崆峒区', + 620821: '泾川县', + 620822: '灵台县', + 620823: '崇信县', + 620824: '华亭县', + 620825: '庄浪县', + 620826: '静宁县', + 620902: '肃州区', + 620921: '金塔县', + 620922: '瓜州县', + 620923: '肃北蒙古族自治县', + 620924: '阿克塞哈萨克族自治县', + 620981: '玉门市', + 620982: '敦煌市', + 621002: '西峰区', + 621021: '庆城县', + 621022: '环县', + 621023: '华池县', + 621024: '合水县', + 621025: '正宁县', + 621026: '宁县', + 621027: '镇原县', + 621102: '安定区', + 621121: '通渭县', + 621122: '陇西县', + 621123: '渭源县', + 621124: '临洮县', + 621125: '漳县', + 621126: '岷县', + 621202: '武都区', + 621221: '成县', + 621222: '文县', + 621223: '宕昌县', + 621224: '康县', + 621225: '西和县', + 621226: '礼县', + 621227: '徽县', + 621228: '两当县', + 622901: '临夏市', + 622921: '临夏县', + 622922: '康乐县', + 622923: '永靖县', + 622924: '广河县', + 622925: '和政县', + 622926: '东乡族自治县', + 622927: '积石山保安族东乡族撒拉族自治县', + 623001: '合作市', + 623021: '临潭县', + 623022: '卓尼县', + 623023: '舟曲县', + 623024: '迭部县', + 623025: '玛曲县', + 623026: '碌曲县', + 623027: '夏河县', + 630102: '城东区', + 630103: '城中区', + 630104: '城西区', + 630105: '城北区', + 630121: '大通回族土族自治县', + 630122: '湟中县', + 630123: '湟源县', + 630202: '乐都区', + 630203: '平安区', + 630222: '民和回族土族自治县', + 630223: '互助土族自治县', + 630224: '化隆回族自治县', + 630225: '循化撒拉族自治县', + 632221: '门源回族自治县', + 632222: '祁连县', + 632223: '海晏县', + 632224: '刚察县', + 632321: '同仁县', + 632322: '尖扎县', + 632323: '泽库县', + 632324: '河南蒙古族自治县', + 632521: '共和县', + 632522: '同德县', + 632523: '贵德县', + 632524: '兴海县', + 632525: '贵南县', + 632621: '玛沁县', + 632622: '班玛县', + 632623: '甘德县', + 632624: '达日县', + 632625: '久治县', + 632626: '玛多县', + 632701: '玉树市', + 632722: '杂多县', + 632723: '称多县', + 632724: '治多县', + 632725: '囊谦县', + 632726: '曲麻莱县', + 632801: '格尔木市', + 632802: '德令哈市', + 632821: '乌兰县', + 632822: '都兰县', + 632823: '天峻县', + 640104: '兴庆区', + 640105: '西夏区', + 640106: '金凤区', + 640121: '永宁县', + 640122: '贺兰县', + 640181: '灵武市', + 640202: '大武口区', + 640205: '惠农区', + 640221: '平罗县', + 640302: '利通区', + 640303: '红寺堡区', + 640323: '盐池县', + 640324: '同心县', + 640381: '青铜峡市', + 640402: '原州区', + 640422: '西吉县', + 640423: '隆德县', + 640424: '泾源县', + 640425: '彭阳县', + 640502: '沙坡头区', + 640521: '中宁县', + 640522: '海原县', + 650102: '天山区', + 650103: '沙依巴克区', + 650104: '新市区', + 650105: '水磨沟区', + 650106: '头屯河区', + 650107: '达坂城区', + 650109: '米东区', + 650121: '乌鲁木齐县', + 650202: '独山子区', + 650203: '克拉玛依区', + 650204: '白碱滩区', + 650205: '乌尔禾区', + 650402: '高昌区', + 650421: '鄯善县', + 650422: '托克逊县', + 650502: '伊州区', + 650521: '巴里坤哈萨克自治县', + 650522: '伊吾县', + 652301: '昌吉市', + 652302: '阜康市', + 652323: '呼图壁县', + 652324: '玛纳斯县', + 652325: '奇台县', + 652327: '吉木萨尔县', + 652328: '木垒哈萨克自治县', + 652701: '博乐市', + 652702: '阿拉山口市', + 652722: '精河县', + 652723: '温泉县', + 652801: '库尔勒市', + 652822: '轮台县', + 652823: '尉犁县', + 652824: '若羌县', + 652825: '且末县', + 652826: '焉耆回族自治县', + 652827: '和静县', + 652828: '和硕县', + 652829: '博湖县', + 652901: '阿克苏市', + 652922: '温宿县', + 652923: '库车县', + 652924: '沙雅县', + 652925: '新和县', + 652926: '拜城县', + 652927: '乌什县', + 652928: '阿瓦提县', + 652929: '柯坪县', + 653001: '阿图什市', + 653022: '阿克陶县', + 653023: '阿合奇县', + 653024: '乌恰县', + 653101: '喀什市', + 653121: '疏附县', + 653122: '疏勒县', + 653123: '英吉沙县', + 653124: '泽普县', + 653125: '莎车县', + 653126: '叶城县', + 653127: '麦盖提县', + 653128: '岳普湖县', + 653129: '伽师县', + 653130: '巴楚县', + 653131: '塔什库尔干塔吉克自治县', + 653201: '和田市', + 653221: '和田县', + 653222: '墨玉县', + 653223: '皮山县', + 653224: '洛浦县', + 653225: '策勒县', + 653226: '于田县', + 653227: '民丰县', + 654002: '伊宁市', + 654003: '奎屯市', + 654004: '霍尔果斯市', + 654021: '伊宁县', + 654022: '察布查尔锡伯自治县', + 654023: '霍城县', + 654024: '巩留县', + 654025: '新源县', + 654026: '昭苏县', + 654027: '特克斯县', + 654028: '尼勒克县', + 654201: '塔城市', + 654202: '乌苏市', + 654221: '额敏县', + 654223: '沙湾县', + 654224: '托里县', + 654225: '裕民县', + 654226: '和布克赛尔蒙古自治县', + 654301: '阿勒泰市', + 654321: '布尔津县', + 654322: '富蕴县', + 654323: '福海县', + 654324: '哈巴河县', + 654325: '青河县', + 654326: '吉木乃县', + 659001: '石河子市', + 659002: '阿拉尔市', + 659003: '图木舒克市', + 659004: '五家渠市', + 659005: '北屯市', + 659006: '铁门关市', + 659007: '双河市', + 659008: '可克达拉市', + 659009: '昆玉市', + 710101: '中正区', + 710102: '大同区', + 710103: '中山区', + 710104: '松山区', + 710105: '大安区', + 710106: '万华区', + 710107: '信义区', + 710108: '士林区', + 710109: '北投区', + 710110: '内湖区', + 710111: '南港区', + 710112: '文山区', + 710199: '其它区', + 710201: '新兴区', + 710202: '前金区', + 710203: '芩雅区', + 710204: '盐埕区', + 710205: '鼓山区', + 710206: '旗津区', + 710207: '前镇区', + 710208: '三民区', + 710209: '左营区', + 710210: '楠梓区', + 710211: '小港区', + 710241: '苓雅区', + 710242: '仁武区', + 710243: '大社区', + 710244: '冈山区', + 710245: '路竹区', + 710246: '阿莲区', + 710247: '田寮区', + 710248: '燕巢区', + 710249: '桥头区', + 710250: '梓官区', + 710251: '弥陀区', + 710252: '永安区', + 710253: '湖内区', + 710254: '凤山区', + 710255: '大寮区', + 710256: '林园区', + 710257: '鸟松区', + 710258: '大树区', + 710259: '旗山区', + 710260: '美浓区', + 710261: '六龟区', + 710262: '内门区', + 710263: '杉林区', + 710264: '甲仙区', + 710265: '桃源区', + 710266: '那玛夏区', + 710267: '茂林区', + 710268: '茄萣区', + 710299: '其它区', + 710301: '中西区', + 710302: '东区', + 710303: '南区', + 710304: '北区', + 710305: '安平区', + 710306: '安南区', + 710339: '永康区', + 710340: '归仁区', + 710341: '新化区', + 710342: '左镇区', + 710343: '玉井区', + 710344: '楠西区', + 710345: '南化区', + 710346: '仁德区', + 710347: '关庙区', + 710348: '龙崎区', + 710349: '官田区', + 710350: '麻豆区', + 710351: '佳里区', + 710352: '西港区', + 710353: '七股区', + 710354: '将军区', + 710355: '学甲区', + 710356: '北门区', + 710357: '新营区', + 710358: '后壁区', + 710359: '白河区', + 710360: '东山区', + 710361: '六甲区', + 710362: '下营区', + 710363: '柳营区', + 710364: '盐水区', + 710365: '善化区', + 710366: '大内区', + 710367: '山上区', + 710368: '新市区', + 710369: '安定区', + 710399: '其它区', + 710401: '中区', + 710402: '东区', + 710403: '南区', + 710404: '西区', + 710405: '北区', + 710406: '北屯区', + 710407: '西屯区', + 710408: '南屯区', + 710431: '太平区', + 710432: '大里区', + 710433: '雾峰区', + 710434: '乌日区', + 710435: '丰原区', + 710436: '后里区', + 710437: '石冈区', + 710438: '东势区', + 710439: '和平区', + 710440: '新社区', + 710441: '潭子区', + 710442: '大雅区', + 710443: '神冈区', + 710444: '大肚区', + 710445: '沙鹿区', + 710446: '龙井区', + 710447: '梧栖区', + 710448: '清水区', + 710449: '大甲区', + 710450: '外埔区', + 710451: '大安区', + 710499: '其它区', + 710507: '金沙镇', + 710508: '金湖镇', + 710509: '金宁乡', + 710510: '金城镇', + 710511: '烈屿乡', + 710512: '乌坵乡', + 710614: '南投市', + 710615: '中寮乡', + 710616: '草屯镇', + 710617: '国姓乡', + 710618: '埔里镇', + 710619: '仁爱乡', + 710620: '名间乡', + 710621: '集集镇', + 710622: '水里乡', + 710623: '鱼池乡', + 710624: '信义乡', + 710625: '竹山镇', + 710626: '鹿谷乡', + 710701: '仁爱区', + 710702: '信义区', + 710703: '中正区', + 710704: '中山区', + 710705: '安乐区', + 710706: '暖暖区', + 710707: '七堵区', + 710799: '其它区', + 710801: '东区', + 710802: '北区', + 710803: '香山区', + 710899: '其它区', + 710901: '东区', + 710902: '西区', + 710999: '其它区', + 711130: '万里区', + 711132: '板桥区', + 711133: '汐止区', + 711134: '深坑区', + 711136: '瑞芳区', + 711137: '平溪区', + 711138: '双溪区', + 711140: '新店区', + 711141: '坪林区', + 711142: '乌来区', + 711143: '永和区', + 711144: '中和区', + 711145: '土城区', + 711146: '三峡区', + 711147: '树林区', + 711149: '三重区', + 711150: '新庄区', + 711151: '泰山区', + 711152: '林口区', + 711154: '五股区', + 711155: '八里区', + 711156: '淡水区', + 711157: '三芝区', + 711287: '宜兰市', + 711288: '头城镇', + 711289: '礁溪乡', + 711290: '壮围乡', + 711291: '员山乡', + 711292: '罗东镇', + 711293: '三星乡', + 711294: '大同乡', + 711295: '五结乡', + 711296: '冬山乡', + 711297: '苏澳镇', + 711298: '南澳乡', + 711299: '钓鱼台', + 711387: '竹北市', + 711388: '湖口乡', + 711389: '新丰乡', + 711390: '新埔镇', + 711391: '关西镇', + 711392: '芎林乡', + 711393: '宝山乡', + 711394: '竹东镇', + 711395: '五峰乡', + 711396: '横山乡', + 711397: '尖石乡', + 711398: '北埔乡', + 711399: '峨眉乡', + 711487: '中坜市', + 711488: '平镇市', + 711489: '龙潭乡', + 711490: '杨梅市', + 711491: '新屋乡', + 711492: '观音乡', + 711493: '桃园市', + 711494: '龟山乡', + 711495: '八德市', + 711496: '大溪镇', + 711497: '复兴乡', + 711498: '大园乡', + 711499: '芦竹乡', + 711582: '竹南镇', + 711583: '头份镇', + 711584: '三湾乡', + 711585: '南庄乡', + 711586: '狮潭乡', + 711587: '后龙镇', + 711588: '通霄镇', + 711589: '苑里镇', + 711590: '苗栗市', + 711591: '造桥乡', + 711592: '头屋乡', + 711593: '公馆乡', + 711594: '大湖乡', + 711595: '泰安乡', + 711596: '铜锣乡', + 711597: '三义乡', + 711598: '西湖乡', + 711599: '卓兰镇', + 711774: '彰化市', + 711775: '芬园乡', + 711776: '花坛乡', + 711777: '秀水乡', + 711778: '鹿港镇', + 711779: '福兴乡', + 711780: '线西乡', + 711781: '和美镇', + 711782: '伸港乡', + 711783: '员林镇', + 711784: '社头乡', + 711785: '永靖乡', + 711786: '埔心乡', + 711787: '溪湖镇', + 711788: '大村乡', + 711789: '埔盐乡', + 711790: '田中镇', + 711791: '北斗镇', + 711792: '田尾乡', + 711793: '埤头乡', + 711794: '溪州乡', + 711795: '竹塘乡', + 711796: '二林镇', + 711797: '大城乡', + 711798: '芳苑乡', + 711799: '二水乡', + 711982: '番路乡', + 711983: '梅山乡', + 711984: '竹崎乡', + 711985: '阿里山乡', + 711986: '中埔乡', + 711987: '大埔乡', + 711988: '水上乡', + 711989: '鹿草乡', + 711990: '太保市', + 711991: '朴子市', + 711992: '东石乡', + 711993: '六脚乡', + 711994: '新港乡', + 711995: '民雄乡', + 711996: '大林镇', + 711997: '溪口乡', + 711998: '义竹乡', + 711999: '布袋镇', + 712180: '斗南镇', + 712181: '大埤乡', + 712182: '虎尾镇', + 712183: '土库镇', + 712184: '褒忠乡', + 712185: '东势乡', + 712186: '台西乡', + 712187: '仑背乡', + 712188: '麦寮乡', + 712189: '斗六市', + 712190: '林内乡', + 712191: '古坑乡', + 712192: '莿桐乡', + 712193: '西螺镇', + 712194: '二仑乡', + 712195: '北港镇', + 712196: '水林乡', + 712197: '口湖乡', + 712198: '四湖乡', + 712199: '元长乡', + 712467: '屏东市', + 712468: '三地门乡', + 712469: '雾台乡', + 712470: '玛家乡', + 712471: '九如乡', + 712472: '里港乡', + 712473: '高树乡', + 712474: '盐埔乡', + 712475: '长治乡', + 712476: '麟洛乡', + 712477: '竹田乡', + 712478: '内埔乡', + 712479: '万丹乡', + 712480: '潮州镇', + 712481: '泰武乡', + 712482: '来义乡', + 712483: '万峦乡', + 712484: '莰顶乡', + 712485: '新埤乡', + 712486: '南州乡', + 712487: '林边乡', + 712488: '东港镇', + 712489: '琉球乡', + 712490: '佳冬乡', + 712491: '新园乡', + 712492: '枋寮乡', + 712493: '枋山乡', + 712494: '春日乡', + 712495: '狮子乡', + 712496: '车城乡', + 712497: '牡丹乡', + 712498: '恒春镇', + 712499: '满州乡', + 712584: '台东市', + 712585: '绿岛乡', + 712586: '兰屿乡', + 712587: '延平乡', + 712588: '卑南乡', + 712589: '鹿野乡', + 712590: '关山镇', + 712591: '海端乡', + 712592: '池上乡', + 712593: '东河乡', + 712594: '成功镇', + 712595: '长滨乡', + 712596: '金峰乡', + 712597: '大武乡', + 712598: '达仁乡', + 712599: '太麻里乡', + 712686: '花莲市', + 712687: '新城乡', + 712688: '太鲁阁', + 712689: '秀林乡', + 712690: '吉安乡', + 712691: '寿丰乡', + 712692: '凤林镇', + 712693: '光复乡', + 712694: '丰滨乡', + 712695: '瑞穗乡', + 712696: '万荣乡', + 712697: '玉里镇', + 712698: '卓溪乡', + 712699: '富里乡', + 712794: '马公市', + 712795: '西屿乡', + 712796: '望安乡', + 712797: '七美乡', + 712798: '白沙乡', + 712799: '湖西乡', + 712896: '南竿乡', + 712897: '北竿乡', + 712898: '东引乡', + 712899: '莒光乡', + 810101: '中西区', + 810102: '湾仔', + 810103: '东区', + 810104: '南区', + 810201: '九龙城区', + 810202: '油尖旺区', + 810203: '深水埗区', + 810204: '黄大仙区', + 810205: '观塘区', + 810301: '北区', + 810302: '大埔区', + 810303: '沙田区', + 810304: '西贡区', + 810305: '元朗区', + 810306: '屯门区', + 810307: '荃湾区', + 810308: '葵青区', + 810309: '离岛区', + 820101: '澳门半岛', + 820201: '离岛' + } + }; + + + Class.prototype.config = { + elem: '', + data: { + province: '', + city: '', + county: '', + provinceCode: 0, + cityCode: 0, + countyCode: 0, + }, + change: function(result){} + }; + + Class.prototype.index = 0; + + Class.prototype.render = function () { + let that = this, options = that.config; + options.elem = $(options.elem); + options.bindAction = $(options.bindAction); + + that.events(); + }; + + Class.prototype.events = function () { + let that = this, options = that.config, index; + let provinceFilter = 'province-' + layarea._id; + let cityFilter = 'city-' + layarea._id; + let countyFilter = 'county-' + layarea._id; + + let provinceEl = options.elem.find('.province-selector'); + let cityEl = options.elem.find('.city-selector'); + let countyEl = options.elem.find('.county-selector'); + + //filter + if(provinceEl.attr('lay-filter')){ + provinceFilter = provinceEl.attr('lay-filter'); + } + if(cityEl.attr('lay-filter')){ + cityFilter = cityEl.attr('lay-filter'); + } + if(countyEl.attr('lay-filter')){ + countyFilter = countyEl.attr('lay-filter'); + } + provinceEl.attr('lay-filter', provinceFilter); + cityEl.attr('lay-filter', cityFilter); + countyEl.attr('lay-filter', countyFilter); + + //获取默认值 + if(provinceEl.data('value')){ + options.data.province = provinceEl.data('value'); + options.data.provinceCode = getCode('province', options.data.province); + } + if(cityEl.data('value')){ + options.data.city = cityEl.data('value'); + let code = getCode('city', options.data.city, options.data.provinceCode.slice(0, 2)); + options.data.cityCode = code; + } + if(countyEl.data('value')){ + options.data.county = countyEl.data('value'); + options.data.countyCode = getCode('county', options.data.county, options.data.cityCode.slice(0, 4)); + } + provinceEl.attr('lay-filter', provinceFilter); + cityEl.attr('lay-filter', cityFilter); + countyEl.attr('lay-filter', countyFilter); + + //监听结果 + form.on('select('+provinceFilter+')', function(data){ + options.data.province = data.value; + options.data.provinceCode = getCode('province', data.value); + renderCity(options.data.provinceCode); + + options.change(options.data); + }); + form.on('select('+cityFilter+')', function(data){ + options.data.city = data.value; + if(options.data.provinceCode){ + options.data.cityCode = getCode('city', data.value, options.data.provinceCode.slice(0, 2)); + renderCounty(options.data.cityCode); + } + + options.change(options.data); + }); + form.on('select('+countyFilter+')', function(data){ + options.data.county = data.value; + if(options.data.cityCode){ + options.data.countyCode = getCode('county', data.value, options.data.cityCode.slice(0, 4)); + } + options.change(options.data); + }); + + renderProvince(); + + //查找province + function renderProvince(){ + let tpl = ''; + let provinceList = getList("province"); + let currentCode = ''; + let currentName = ''; + provinceList.forEach(function(_item){ + // if (!currentCode){ + // currentCode = _item.code; + // currentName = _item.name; + // } + if(_item.name === options.data.province){ + currentCode = _item.code; + currentName = _item.name; + } + tpl += ''; + }); + provinceEl.html(tpl); + provinceEl.val(options.data.province); + form.render('select'); + renderCity(currentCode); + } + + function renderCity(provinceCode){ + let tpl = ''; + let cityList = getList('city', provinceCode.slice(0, 2)); + let currentCode = ''; + let currentName = ''; + cityList.forEach(function(_item){ + // if (!currentCode){ + // currentCode = _item.code; + // currentName = _item.name; + // } + if(_item.name === options.data.city){ + currentCode = _item.code; + currentName = _item.name; + } + tpl += ''; + }); + options.data.city = currentName; + cityEl.html(tpl); + cityEl.val(options.data.city); + form.render('select'); + renderCounty(currentCode); + } + + function renderCounty(cityCode){ + let tpl = ''; + let countyList = getList('county', cityCode.slice(0, 4)); + let currentCode = ''; + let currentName = ''; + countyList.forEach(function(_item){ + // if (!currentCode){ + // currentCode = _item.code; + // currentName = _item.name; + // } + if(_item.name === options.data.county){ + currentCode = _item.code; + currentName = _item.name; + } + tpl += ''; + }); + options.data.county = currentName; + countyEl.html(tpl); + countyEl.val(options.data.county); + + form.render('select'); + } + + function getList(type, code) { + let result = []; + + if (type !== 'province' && !code) { + return result; + } + + let list = areaList[type + "_list"] || {}; + result = Object.keys(list).map(function (code) { + return { + code: code, + name: list[code] + }; + }); + + if (code) { + // oversea code + if (code[0] === '9' && type === 'city') { + code = '9'; + } + + result = result.filter(function (item) { + return item.code.indexOf(code) === 0; + }); + } + + return result; + } + + function getCode(type, name, parentCode = 0){ + let code = ''; + let list = areaList[type + "_list"] || {}; + let result = {}; + Object.keys(list).map(function (_code) { + if(parentCode){ + if(_code.indexOf(parentCode) === 0){ + result[_code] = list[_code]; + } + }else{ + result[_code] = list[_code]; + } + }); + layui.each(result, function(_code, _name){ + if(_name === name){ + code = _code; + } + }); + + return code; + } + }; + + layarea.render = function (options) { + let inst = new Class(options); + layarea._id++; + return thisArea.call(inst); + }; + + //暴露接口 + exports('layarea', layarea); +}); \ No newline at end of file diff --git a/public/admin/js/lay-module/layuimini/miniAdmin.js b/public/admin/js/lay-module/layuimini/miniAdmin.js new file mode 100644 index 0000000..f145caa --- /dev/null +++ b/public/admin/js/lay-module/layuimini/miniAdmin.js @@ -0,0 +1,351 @@ +/** + * date:2020/02/27 + * author:Mr.Chung + * version:2.0 + * description:layuimini 主体框架扩展 + */ +layui.define(["jquery", "miniMenu", "element", "miniTab", "miniTheme"], function (exports) { + var $ = layui.$, + layer = layui.layer, + miniMenu = layui.miniMenu, + miniTheme = layui.miniTheme, + element = layui.element, + miniTab = layui.miniTab; + + if (!/http(s*):\/\//.test(location.href)) { + var tips = "请先将项目部署至web容器(Apache/Tomcat/Nginx/IIS/等),否则部分数据将无法显示"; + return layer.alert(tips); + } + + var miniAdmin = { + + /** + * 后台框架初始化 + * @param options.iniUrl 后台初始化接口地址 + * @param options.clearUrl 后台清理缓存接口 + * @param options.urlHashLocation URL地址hash定位 + * @param options.bgColorDefault 默认皮肤 + * @param options.multiModule 是否开启多模块 + * @param options.menuChildOpen 是否展开子菜单 + * @param options.loadingTime 初始化加载时间 + * @param options.pageAnim iframe窗口动画 + * @param options.maxTabNum 最大的tab打开数量 + */ + render: function (options) { + options.iniUrl = options.iniUrl || null; + options.clearUrl = options.clearUrl || null; + options.urlHashLocation = options.urlHashLocation || false; + options.bgColorDefault = options.bgColorDefault || 0; + options.multiModule = options.multiModule || false; + options.menuChildOpen = options.menuChildOpen || false; + options.loadingTime = options.loadingTime || 1; + options.pageAnim = options.pageAnim || false; + options.maxTabNum = options.maxTabNum || 20; + $.getJSON(options.iniUrl, function (data) { + if (data == null) { + miniAdmin.error('暂无菜单信息') + } else { + miniAdmin.renderLogo(data.logoInfo); + miniAdmin.renderClear(options.clearUrl); + miniAdmin.renderHome(data.homeInfo); + miniAdmin.renderAnim(options.pageAnim); + miniAdmin.listen(); + miniMenu.render({ + menuList: data.menuInfo, + multiModule: options.multiModule, + menuChildOpen: options.menuChildOpen + }); + miniTab.render({ + filter: 'layuiminiTab', + urlHashLocation: options.urlHashLocation, + multiModule: options.multiModule, + menuChildOpen: options.menuChildOpen, + maxTabNum: options.maxTabNum, + menuList: data.menuInfo, + homeInfo: data.homeInfo, + listenSwichCallback: function () { + miniAdmin.renderDevice(); + } + }); + miniTheme.render({ + bgColorDefault: options.bgColorDefault, + listen: true, + }); + miniAdmin.deleteLoader(options.loadingTime); + } + }).fail(function () { + // miniAdmin.error('菜单接口有误'); + }); + }, + + /** + * 初始化logo + * @param data + */ + renderLogo: function (data) { + // var html = 'logo

    ' + data.title + '

    '; + var html = '

    ' + data.title + '

    '; + $('.layuimini-logo').html(html); + }, + + /** + * 初始化首页 + * @param data + */ + renderHome: function (data) { + sessionStorage.setItem('layuiminiHomeHref', data.href); + $('#layuiminiHomeTabId').html('' + data.title + ''); + $('#layuiminiHomeTabId').attr('lay-id', data.href); + $('#layuiminiHomeTabIframe').html(''); + }, + + /** + * 初始化缓存地址 + * @param clearUrl + */ + renderClear: function (clearUrl) { + $('.layuimini-clear').attr('data-href', clearUrl); + }, + + /** + * 初始化iframe窗口动画 + * @param anim + */ + renderAnim: function (anim) { + if (anim) { + $('#layuimini-bg-color').after(''); + } + }, + + fullScreen: function () { + var el = document.documentElement; + var rfs = el.requestFullScreen || el.webkitRequestFullScreen; + if (typeof rfs != "undefined" && rfs) { + rfs.call(el); + } else if (typeof window.ActiveXObject != "undefined") { + var wscript = new ActiveXObject("WScript.Shell"); + if (wscript != null) { + wscript.SendKeys("{F11}"); + } + } else if (el.msRequestFullscreen) { + el.msRequestFullscreen(); + } else if (el.oRequestFullscreen) { + el.oRequestFullscreen(); + } else if (el.webkitRequestFullscreen) { + el.webkitRequestFullscreen(); + } else if (el.mozRequestFullScreen) { + el.mozRequestFullScreen(); + } else { + miniAdmin.error('浏览器不支持全屏调用!'); + } + }, + + /** + * 退出全屏 + */ + exitFullScreen: function () { + var el = document; + var cfs = el.cancelFullScreen || el.webkitCancelFullScreen || el.exitFullScreen; + if (typeof cfs != "undefined" && cfs) { + cfs.call(el); + } else if (typeof window.ActiveXObject != "undefined") { + var wscript = new ActiveXObject("WScript.Shell"); + if (wscript != null) { + wscript.SendKeys("{F11}"); + } + } else if (el.msExitFullscreen) { + el.msExitFullscreen(); + } else if (el.oRequestFullscreen) { + el.oCancelFullScreen(); + } else if (el.mozCancelFullScreen) { + el.mozCancelFullScreen(); + } else if (el.webkitCancelFullScreen) { + el.webkitCancelFullScreen(); + } else { + miniAdmin.error('浏览器不支持全屏调用!'); + } + }, + + /** + * 初始化设备端 + */ + renderDevice: function () { + if (miniAdmin.checkMobile()) { + $('.layuimini-tool i').attr('data-side-fold', 1); + $('.layuimini-tool i').attr('class', 'fa fa-outdent'); + $('.layui-layout-body').removeClass('layuimini-mini'); + $('.layui-layout-body').addClass('layuimini-all'); + } + }, + + + /** + * 初始化加载时间 + * @param loadingTime + */ + deleteLoader: function (loadingTime) { + setTimeout(function () { + $('.layuimini-loader').fadeOut(); + }, loadingTime * 1000) + }, + + /** + * 成功 + * @param title + * @returns {*} + */ + success: function (title) { + return layer.msg(title, {icon: 1, shade: this.shade, scrollbar: false, time: 2000, shadeClose: true}); + }, + + /** + * 失败 + * @param title + * @returns {*} + */ + error: function (title) { + return layer.msg(title, {icon: 2, shade: this.shade, scrollbar: false, time: 3000, shadeClose: true}); + }, + + /** + * 判断是否为手机 + * @returns {boolean} + */ + checkMobile: function () { + var ua = navigator.userAgent.toLocaleLowerCase(); + var pf = navigator.platform.toLocaleLowerCase(); + var isAndroid = (/android/i).test(ua) || ((/iPhone|iPod|iPad/i).test(ua) && (/linux/i).test(pf)) + || (/ucweb.*linux/i.test(ua)); + var isIOS = (/iPhone|iPod|iPad/i).test(ua) && !isAndroid; + var isWinPhone = (/Windows Phone|ZuneWP7/i).test(ua); + var clientWidth = document.documentElement.clientWidth; + if (!isAndroid && !isIOS && !isWinPhone && clientWidth > 1024) { + return false; + } else { + return true; + } + }, + + /** + * 监听 + */ + listen: function () { + + /** + * 清理 + */ + $('body').on('click', '[data-clear]', function () { + var loading = layer.load(0, {shade: false, time: 2 * 1000}); + sessionStorage.clear(); + + // 判断是否清理服务端 + var clearUrl = $(this).attr('data-href'); + if (clearUrl != undefined && clearUrl != '' && clearUrl != null) { + $.getJSON(clearUrl, function (data, status) { + layer.close(loading); + if (data.status !== 'ok') { + return miniAdmin.error(data.message); + } else { + return miniAdmin.success('清除缓存成功'); + } + }).fail(function () { + layer.close(loading); + return miniAdmin.error('清理缓存接口有误'); + }); + } else { + layer.close(loading); + return miniAdmin.success('清除缓存成功'); + } + }); + + /** + * 刷新 + */ + $('body').on('click', '[data-refresh]', function () { + $(".layui-tab-item.layui-show").find("iframe")[0].contentWindow.location.reload(); + miniAdmin.success('刷新成功'); + }); + + /** + * 监听提示信息 + */ + $("body").on("mouseenter", ".layui-nav-tree .menu-li", function () { + if (miniAdmin.checkMobile()) { + return false; + } + var classInfo = $(this).attr('class'), + tips = $(this).prop("innerHTML"), + isShow = $('.layuimini-tool i').attr('data-side-fold'); + if (isShow == 0 && tips) { + tips = "
    • " + tips + "
    "; + window.openTips = layer.tips(tips, $(this), { + tips: [2, '#2f4056'], + time: 300000, + skin: "popup-tips", + success: function (el) { + var left = $(el).position().left - 10; + $(el).css({left: left}); + element.render(); + } + }); + } + }); + + $("body").on("mouseleave", ".popup-tips", function () { + if (miniAdmin.checkMobile()) { + return false; + } + var isShow = $('.layuimini-tool i').attr('data-side-fold'); + if (isShow == 0) { + try { + layer.close(window.openTips); + } catch (e) { + console.log(e.message); + } + } + }); + + + /** + * 全屏 + */ + $('body').on('click', '[data-check-screen]', function () { + var check = $(this).attr('data-check-screen'); + if (check == 'full') { + miniAdmin.fullScreen(); + $(this).attr('data-check-screen', 'exit'); + $(this).html(''); + } else { + miniAdmin.exitFullScreen(); + $(this).attr('data-check-screen', 'full'); + $(this).html(''); + } + }); + + /** + * 点击遮罩层 + */ + $('body').on('click', '.layuimini-make', function () { + miniAdmin.renderDevice(); + }); + + } + }; + + + exports("miniAdmin", miniAdmin); +}); diff --git a/public/admin/js/lay-module/layuimini/miniMenu.js b/public/admin/js/lay-module/layuimini/miniMenu.js new file mode 100644 index 0000000..e0555d2 --- /dev/null +++ b/public/admin/js/lay-module/layuimini/miniMenu.js @@ -0,0 +1,250 @@ +/** + * date:2020/02/27 + * author:Mr.Chung + * version:2.0 + * description:layuimini 菜单框架扩展 + */ +layui.define(["element","laytpl" ,"jquery"], function (exports) { + var element = layui.element, + $ = layui.$, + laytpl = layui.laytpl, + layer = layui.layer; + + var miniMenu = { + + /** + * 菜单初始化 + * @param options.menuList 菜单数据信息 + * @param options.multiModule 是否开启多模块 + * @param options.menuChildOpen 是否展开子菜单 + */ + render: function (options) { + options.menuList = options.menuList || []; + options.multiModule = options.multiModule || false; + options.menuChildOpen = options.menuChildOpen || false; + if (options.multiModule) { + miniMenu.renderMultiModule(options.menuList, options.menuChildOpen); + } else { + miniMenu.renderSingleModule(options.menuList, options.menuChildOpen); + } + miniMenu.listen(); + }, + + /** + * 单模块 + * @param menuList 菜单数据 + * @param menuChildOpen 是否默认展开 + */ + renderSingleModule: function (menuList, menuChildOpen) { + menuList = menuList || []; + var leftMenuHtml = '', + childOpenClass = '', + leftMenuCheckDefault = 'layui-this'; + var me = this ; + if (menuChildOpen) childOpenClass = ' layui-nav-itemed'; + leftMenuHtml = this.renderLeftMenu(menuList,{ childOpenClass:childOpenClass }) ; + $('.layui-layout-body').addClass('layuimini-single-module'); //单模块标识 + $('.layuimini-header-menu').remove(); + $('.layuimini-menu-left').html(leftMenuHtml); + + element.init(); + }, + + /** + * 渲染一级菜单 + */ + compileMenu: function(menu,isSub){ + var menuHtml = '' ; + if(isSub){ + menuHtml = '' + } + return laytpl(menuHtml).render(menu); + }, + compileMenuContainer :function(menu,isSub){ + var wrapperHtml = '
      {{d.children}}
    ' ; + if(isSub){ + wrapperHtml = '
    {{d.children}}
    ' ; + } + if(!menu.children){ + return ""; + } + return laytpl(wrapperHtml).render(menu); + }, + + each:function(list,callback){ + var _list = []; + for(var i = 0 ,length = list.length ; i= options.maxTabNum) { + layer.msg('Tab窗口已达到限定数量,请先关闭部分Tab'); + return false; + } + var ele = element; + if (options.isIframe) ele = parent.layui.element; + ele.tabAdd('layuiminiTab', { + title: '' + options.title + '' //用于演示 + , content: '' + , id: options.tabId + }); + $('.layuimini-menu-left').attr('layuimini-tab-tag', 'add'); + sessionStorage.setItem('layuiminimenu_' + options.tabId, options.title); + }, + + + /** + * 切换选项卡 + * @param tabId + */ + change: function (tabId) { + element.tabChange('layuiminiTab', tabId); + }, + + /** + * 删除tab窗口 + * @param tabId + * @param isParent + */ + delete: function (tabId, isParent) { + // todo 未知BUG,不知道是不是layui问题,必须先删除元素 + $(".layuimini-tab .layui-tab-title .layui-unselect.layui-tab-bar").remove(); + + if (isParent === true) { + parent.layui.element.tabDelete('layuiminiTab', tabId); + } else { + element.tabDelete('layuiminiTab', tabId); + } + }, + + /** + * 在iframe层打开新tab方法 + */ + openNewTabByIframe: function (options) { + options.href = options.href || null; + options.title = options.title || null; + var loading = parent.layer.load(0, {shade: false, time: 2 * 1000}); + if (options.href === null || options.href === undefined) options.href = new Date().getTime(); + options.tabId = options.tabId || options.href; + var checkTab = miniTab.check(options.tabId, true); + if (!checkTab) { + miniTab.create({ + tabId: options.tabId, + href: options.href, + title: options.title, + isIframe: true, + }); + } + parent.layui.element.tabChange('layuiminiTab', options.tabId); + parent.layer.close(loading); + }, + + /** + * 在iframe层关闭当前tab方法 + */ + deleteCurrentByIframe: function () { + var ele = $(".layuimini-tab .layui-tab-title li.layui-this", parent.document); + if (ele.length > 0) { + var layId = $(ele[0]).attr('lay-id'); + miniTab.delete(layId, true); + } + }, + + /** + * 判断tab窗口 + */ + check: function (tabId, isIframe) { + // 判断选项卡上是否有 + var checkTab = false; + if (isIframe === undefined || isIframe === false) { + $(".layui-tab-title li").each(function () { + var checkTabId = $(this).attr('lay-id'); + if (checkTabId != null && checkTabId === tabId) { + checkTab = true; + } + }); + } else { + parent.layui.$(".layui-tab-title li").each(function () { + var checkTabId = $(this).attr('lay-id'); + if (checkTabId != null && checkTabId === tabId) { + checkTab = true; + } + }); + } + return checkTab; + }, + + /** + * 开启tab右键菜单 + * @param tabId + * @param left + */ + openTabRignMenu: function (tabId, left) { + miniTab.closeTabRignMenu(); + var menuHtml = '
    \n' + + '
    \n' + + '
    关 闭 当 前
    \n' + + '
    关 闭 其 他
    \n' + + '
    关 闭 全 部
    \n' + + '
    \n' + + '
    '; + var makeHtml = '
    '; + $('.layuimini-tab .layui-tab-title').after(menuHtml); + $('.layuimini-tab .layui-tab-content').after(makeHtml); + }, + + /** + * 关闭tab右键菜单 + */ + closeTabRignMenu: function () { + $('.layuimini-tab-mousedown').remove(); + $('.layuimini-tab-make').remove(); + }, + + /** + * 查询菜单信息 + * @param href + * @param menuList + */ + searchMenu: function (href, menuList) { + var menu; + for (key in menuList) { + var item = menuList[key]; + if (item.href === href) { + menu = item; + break; + } + if (item.child) { + newMenu = miniTab.searchMenu(href, item.child); + if (newMenu) { + menu = newMenu; + break; + } + } + } + return menu; + }, + + /** + * 监听 + * @param options + */ + listen: function (options) { + options = options || {}; + options.maxTabNum = options.maxTabNum || 20; + + /** + * 打开新窗口 + */ + $('body').on('click', '[layuimini-href]', function () { + var loading = layer.load(0, {shade: false, time: 2 * 1000}); + var tabId = $(this).attr('layuimini-href'), + href = $(this).attr('layuimini-href'), + title = $(this).text(), + target = $(this).attr('target'); + + var el = $("[layuimini-href='" + href + "']", ".layuimini-menu-left"); + layer.close(window.openTips); + if (el.length) { + $(el).closest(".layui-nav-tree").find(".layui-this").removeClass("layui-this"); + $(el).parent().addClass("layui-this"); + } + + if (target === '_blank') { + layer.close(loading); + window.open(href, "_blank"); + return false; + } + + if (tabId === null || tabId === undefined) tabId = new Date().getTime(); + var checkTab = miniTab.check(tabId); + if (!checkTab) { + miniTab.create({ + tabId: tabId, + href: href, + title: title, + isIframe: false, + maxTabNum: options.maxTabNum, + }); + } + element.tabChange('layuiminiTab', tabId); + layer.close(loading); + }); + + /** + * 在iframe子菜单上打开新窗口 + */ + $('body').on('click', '[layuimini-content-href]', function () { + var loading = parent.layer.load(0, {shade: false, time: 2 * 1000}); + var tabId = $(this).attr('layuimini-content-href'), + href = $(this).attr('layuimini-content-href'), + title = $(this).attr('data-title'), + target = $(this).attr('target'); + if (target === '_blank') { + parent.layer.close(loading); + window.open(href, "_blank"); + return false; + } + if (tabId === null || tabId === undefined) tabId = new Date().getTime(); + var checkTab = miniTab.check(tabId, true); + if (!checkTab) { + miniTab.create({ + tabId: tabId, + href: href, + title: title, + isIframe: true, + maxTabNum: options.maxTabNum, + }); + } + parent.layui.element.tabChange('layuiminiTab', tabId); + parent.layer.close(loading); + }); + + /** + * 关闭选项卡 + **/ + $('body').on('click', '.layuimini-tab .layui-tab-title .layui-tab-close', function () { + var loading = layer.load(0, {shade: false, time: 2 * 1000}); + var $parent = $(this).parent(); + var tabId = $parent.attr('lay-id'); + if (tabId !== undefined || tabId !== null) { + miniTab.delete(tabId); + } + layer.close(loading); + }); + + /** + * 选项卡操作 + */ + $('body').on('click', '[layuimini-tab-close]', function () { + var loading = layer.load(0, {shade: false, time: 2 * 1000}); + var closeType = $(this).attr('layuimini-tab-close'); + $(".layuimini-tab .layui-tab-title li").each(function () { + var tabId = $(this).attr('lay-id'); + var id = $(this).attr('id'); + var isCurrent = $(this).hasClass('layui-this'); + if (id !== 'layuiminiHomeTabId') { + if (closeType === 'all') { + miniTab.delete(tabId); + } else { + if (closeType === 'current' && isCurrent) { + miniTab.delete(tabId); + } else if (closeType === 'other' && !isCurrent) { + miniTab.delete(tabId); + } + } + } + }); + layer.close(loading); + }); + + /** + * 禁用网页右键 + */ + $(".layuimini-tab .layui-tab-title").unbind("mousedown").bind("contextmenu", function (e) { + e.preventDefault(); + return false; + }); + + /** + * 注册鼠标右键 + */ + $('body').on('mousedown', '.layuimini-tab .layui-tab-title li', function (e) { + var left = $(this).offset().left - $('.layuimini-tab ').offset().left + ($(this).width() / 2), + tabId = $(this).attr('lay-id'); + if (e.which === 3) { + miniTab.openTabRignMenu(tabId, left); + } + }); + + /** + * 关闭tab右键菜单 + */ + $('body').on('click', '.layui-body,.layui-header,.layuimini-menu-left,.layuimini-tab-make', function () { + miniTab.closeTabRignMenu(); + }); + + /** + * tab右键选项卡操作 + */ + $('body').on('click', '[layuimini-tab-menu-close]', function () { + var loading = layer.load(0, {shade: false, time: 2 * 1000}); + var closeType = $(this).attr('layuimini-tab-menu-close'), + currentTabId = $('.layuimini-tab-mousedown').attr('data-tab-id'); + $(".layuimini-tab .layui-tab-title li").each(function () { + var tabId = $(this).attr('lay-id'); + var id = $(this).attr('id'); + if (id !== 'layuiminiHomeTabId') { + if (closeType === 'all') { + miniTab.delete(tabId); + } else { + if (closeType === 'current' && currentTabId === tabId) { + miniTab.delete(tabId); + } else if (closeType === 'other' && currentTabId !== tabId) { + miniTab.delete(tabId); + } + } + } + }); + miniTab.closeTabRignMenu(); + layer.close(loading); + }); + }, + + /** + * 监听tab切换 + * @param options + */ + listenSwitch: function (options) { + options.filter = options.filter || null; + options.multiModule = options.multiModule || false; + options.urlHashLocation = options.urlHashLocation || false; + options.listenSwichCallback = options.listenSwichCallback || function () { + + }; + element.on('tab(' + options.filter + ')', function (data) { + var tabId = $(this).attr('lay-id'); + if (options.urlHashLocation) { + location.hash = '/' + tabId; + } + if (typeof options.listenSwichCallback === 'function') { + options.listenSwichCallback(); + } + // 判断是否为新增窗口 + if ($('.layuimini-menu-left').attr('layuimini-tab-tag') === 'add') { + $('.layuimini-menu-left').attr('layuimini-tab-tag', 'no') + } else { + $("[layuimini-href]").parent().removeClass('layui-this'); + if (options.multiModule) { + miniTab.listenSwitchMultiModule(tabId); + } else { + miniTab.listenSwitchSingleModule(tabId); + } + } + miniTab.rollPosition(); + }); + }, + + /** + * 监听hash变化 + * @param options + * @returns {boolean} + */ + listenHash: function (options) { + options.urlHashLocation = options.urlHashLocation || false; + options.maxTabNum = options.maxTabNum || 20; + options.homeInfo = options.homeInfo || {}; + options.menuList = options.menuList || []; + if (!options.urlHashLocation) return false; + var tabId = location.hash.replace(/^#\//, ''); + if (tabId === null || tabId === undefined || tabId ==='') return false; + + // 判断是否为首页 + if(tabId ===options.homeInfo.href) return false; + + // 判断是否为右侧菜单 + var menu = miniTab.searchMenu(tabId, options.menuList); + if (menu !== undefined) { + miniTab.create({ + tabId: tabId, + href: tabId, + title: menu.title, + isIframe: false, + maxTabNum: options.maxTabNum, + }); + $('.layuimini-menu-left').attr('layuimini-tab-tag', 'no'); + element.tabChange('layuiminiTab', tabId); + return false; + } + + // 判断是否为快捷菜单 + var isSearchMenu = false; + $("[layuimini-content-href]").each(function () { + if ($(this).attr("layuimini-content-href") === tabId) { + var title = $(this).attr("data-title"); + miniTab.create({ + tabId: tabId, + href: tabId, + title: title, + isIframe: false, + maxTabNum: options.maxTabNum, + }); + $('.layuimini-menu-left').attr('layuimini-tab-tag', 'no'); + element.tabChange('layuiminiTab', tabId); + isSearchMenu = true; + return false; + } + }); + if (isSearchMenu) return false; + + // 既不是右侧菜单、快捷菜单,就直接打开 + var title = sessionStorage.getItem('layuiminimenu_' + tabId) === null ? tabId : sessionStorage.getItem('layuiminimenu_' + tabId); + miniTab.create({ + tabId: tabId, + href: tabId, + title: title, + isIframe: false, + maxTabNum: options.maxTabNum, + }); + element.tabChange('layuiminiTab', tabId); + return false; + }, + + /** + * 监听滚动 + */ + listenRoll: function () { + $(".layuimini-tab-roll-left").click(function () { + miniTab.rollClick("left"); + }); + $(".layuimini-tab-roll-right").click(function () { + miniTab.rollClick("right"); + }); + }, + + /** + * 单模块切换 + * @param tabId + */ + listenSwitchSingleModule: function (tabId) { + $("[layuimini-href]").each(function () { + if ($(this).attr("layuimini-href") === tabId) { + // 自动展开菜单栏 + var addMenuClass = function ($element, type) { + if (type === 1) { + $element.addClass('layui-this'); + if ($element.hasClass('layui-nav-item') && $element.hasClass('layui-this')) { + $(".layuimini-header-menu li").attr('class', 'layui-nav-item'); + } else { + addMenuClass($element.parent().parent(), 2); + } + } else { + $element.addClass('layui-nav-itemed'); + if ($element.hasClass('layui-nav-item') && $element.hasClass('layui-nav-itemed')) { + $(".layuimini-header-menu li").attr('class', 'layui-nav-item'); + } else { + addMenuClass($element.parent().parent(), 2); + } + } + }; + addMenuClass($(this).parent(), 1); + return false; + } + }); + }, + + /** + * 多模块切换 + * @param tabId + */ + listenSwitchMultiModule: function (tabId) { + $("[layuimini-href]").each(function () { + if ($(this).attr("layuimini-href") === tabId) { + + // 自动展开菜单栏 + var addMenuClass = function ($element, type) { + if (type === 1) { + $element.addClass('layui-this'); + if ($element.hasClass('layui-nav-item') && $element.hasClass('layui-this')) { + var moduleId = $element.parent().attr('id'); + $(".layuimini-header-menu li").attr('class', 'layui-nav-item'); + $("#" + moduleId + "HeaderId").addClass("layui-this"); + $(".layuimini-menu-left .layui-nav.layui-nav-tree").attr('class', 'layui-nav layui-nav-tree layui-hide'); + $("#" + moduleId).attr('class', 'layui-nav layui-nav-tree layui-this'); + } else { + addMenuClass($element.parent().parent(), 2); + } + } else { + $element.addClass('layui-nav-itemed'); + if ($element.hasClass('layui-nav-item') && $element.hasClass('layui-nav-itemed')) { + var moduleId = $element.parent().attr('id'); + $(".layuimini-header-menu li").attr('class', 'layui-nav-item'); + $("#" + moduleId + "HeaderId").addClass("layui-this"); + $(".layuimini-menu-left .layui-nav.layui-nav-tree").attr('class', 'layui-nav layui-nav-tree layui-hide'); + $("#" + moduleId).attr('class', 'layui-nav layui-nav-tree layui-this'); + } else { + addMenuClass($element.parent().parent(), 2); + } + } + }; + addMenuClass($(this).parent(), 1); + return false; + } + }); + }, + + /** + * 自动定位 + */ + rollPosition: function () { + var $tabTitle = $('.layuimini-tab .layui-tab-title'); + var autoLeft = 0; + $tabTitle.children("li").each(function () { + if ($(this).hasClass('layui-this')) { + return false; + } else { + autoLeft += $(this).outerWidth(); + } + }); + $tabTitle.animate({ + scrollLeft: autoLeft - $tabTitle.width() / 3 + }, 200); + }, + + /** + * 点击滚动 + * @param direction + */ + rollClick: function (direction) { + var $tabTitle = $('.layuimini-tab .layui-tab-title'); + var left = $tabTitle.scrollLeft(); + if ('left' === direction) { + $tabTitle.animate({ + scrollLeft: left - 450 + }, 200); + } else { + $tabTitle.animate({ + scrollLeft: left + 450 + }, 200); + } + } + + }; + + exports("miniTab", miniTab); +}); diff --git a/public/admin/js/lay-module/layuimini/miniTheme.js b/public/admin/js/lay-module/layuimini/miniTheme.js new file mode 100644 index 0000000..e293e1e --- /dev/null +++ b/public/admin/js/lay-module/layuimini/miniTheme.js @@ -0,0 +1,473 @@ +/** + * date:2020/02/28 + * author:Mr.Chung + * version:2.0 + * description:layuimini tab框架扩展 + */ +layui.define(["jquery", "layer"], function (exports) { + var $ = layui.$, + layer = layui.layer; + + var miniTheme = { + + /** + * 主题配置项 + * @param bgcolorId + * @returns {{headerLogo, menuLeftHover, headerRight, menuLeft, headerRightThis, menuLeftThis}|*|*[]} + */ + config: function (bgcolorId) { + var bgColorConfig = [ + { + headerRightBg: '#ffffff', //头部右侧背景色 + headerRightBgThis: '#e4e4e4', //头部右侧选中背景色, + headerRightColor: 'rgba(107, 107, 107, 0.7)', //头部右侧字体颜色, + headerRightChildColor: 'rgba(107, 107, 107, 0.7)', //头部右侧下拉字体颜色, + headerRightColorThis: '#565656', //头部右侧鼠标选中, + headerRightNavMore: 'rgba(160, 160, 160, 0.7)', //头部右侧更多下拉颜色, + headerRightNavMoreBg: '#1E9FFF', //头部右侧更多下拉列表选中背景色, + headerRightNavMoreColor: '#ffffff', //头部右侧更多下拉列表字体色, + headerRightToolColor: '#565656', //头部缩放按钮样式, + headerLogoBg: '#192027', //logo背景颜色, + headerLogoColor: 'rgb(191, 187, 187)', //logo字体颜色, + leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式, + leftMenuBg: '#28333E', //左侧菜单背景, + leftMenuBgThis: '#1E9FFF', //左侧菜单选中背景, + leftMenuChildBg: '#0c0f13', //左侧菜单子菜单背景, + leftMenuColor: 'rgb(191, 187, 187)', //左侧菜单字体颜色, + leftMenuColorThis: '#ffffff', //左侧菜单选中字体颜色, + tabActiveColor: '#1e9fff', //tab选项卡选中颜色, + }, + { + headerRightBg: '#23262e', //头部右侧背景色 + headerRightBgThis: '#0c0c0c', //头部右侧选中背景色, + headerRightColor: 'rgba(255,255,255,.7)', //头部右侧字体颜色, + headerRightChildColor: '#676767', //头部右侧下拉字体颜色, + headerRightColorThis: '#ffffff', //头部右侧鼠标选中, + headerRightNavMore: 'rgba(255,255,255,.7)', //头部右侧更多下拉颜色, + headerRightNavMoreBg: '#1aa094', //头部右侧更多下拉列表选中背景色, + headerRightNavMoreColor: '#ffffff', //头部右侧更多下拉列表字体色, + headerRightToolColor: '#bbe3df', //头部缩放按钮样式, + headerLogoBg: '#0c0c0c', //logo背景颜色, + headerLogoColor: '#ffffff', //logo字体颜色, + leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式, + leftMenuBg: '#23262e', //左侧菜单背景, + leftMenuBgThis: '#737373', //左侧菜单选中背景, + leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景, + leftMenuColor: 'rgb(191, 187, 187)', //左侧菜单字体颜色, + leftMenuColorThis: '#ffffff', //左侧菜单选中字体颜色, + tabActiveColor: '#23262e', //tab选项卡选中颜色, + }, + { + headerRightBg: '#ffa4d1', //头部右侧背景色 + headerRightBgThis: '#bf7b9d', //头部右侧选中背景色, + headerRightColor: 'rgba(255,255,255,.7)', //头部右侧字体颜色, + headerRightChildColor: '#676767', //头部右侧下拉字体颜色, + headerRightColorThis: '#ffffff', //头部右侧鼠标选中, + headerRightNavMore: 'rgba(255,255,255,.7)', //头部右侧更多下拉颜色, + headerRightNavMoreBg: '#ffa4d1', //头部右侧更多下拉列表选中背景色, + headerRightNavMoreColor: '#ffffff', //头部右侧更多下拉列表字体色, + headerRightToolColor: '#bbe3df', //头部缩放按钮样式, + headerLogoBg: '#e694bd', //logo背景颜色, + headerLogoColor: '#ffffff', //logo字体颜色, + leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式, + leftMenuBg: '#1f1f1f', //左侧菜单背景, + leftMenuBgThis: '#737373', //左侧菜单选中背景, + leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景, + leftMenuColor: 'rgb(191, 187, 187)', //左侧菜单字体颜色, + leftMenuColorThis: '#ffffff', //左侧菜单选中字体颜色, + tabActiveColor: '#ffa4d1', //tab选项卡选中颜色, + }, + { + headerRightBg: '#1aa094', //头部右侧背景色 + headerRightBgThis: '#197971', //头部右侧选中背景色, + headerRightColor: 'rgba(255,255,255,.7)', //头部右侧字体颜色, + headerRightChildColor: '#676767', //头部右侧下拉字体颜色, + headerRightColorThis: '#ffffff', //头部右侧鼠标选中, + headerRightNavMore: 'rgba(255,255,255,.7)', //头部右侧更多下拉颜色, + headerRightNavMoreBg: '#1aa094', //头部右侧更多下拉列表选中背景色, + headerRightNavMoreColor: '#ffffff', //头部右侧更多下拉列表字体色, + headerRightToolColor: '#bbe3df', //头部缩放按钮样式, + headerLogoBg: '#0c0c0c', //logo背景颜色, + headerLogoColor: '#ffffff', //logo字体颜色, + leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式, + leftMenuBg: '#23262e', //左侧菜单背景, + leftMenuBgThis: '#1aa094', //左侧菜单选中背景, + leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景, + leftMenuColor: 'rgb(191, 187, 187)', //左侧菜单字体颜色, + leftMenuColorThis: '#ffffff', //左侧菜单选中字体颜色, + tabActiveColor: '#1aa094', //tab选项卡选中颜色, + }, + { + headerRightBg: '#1e9fff', //头部右侧背景色 + headerRightBgThis: '#0069b7', //头部右侧选中背景色, + headerRightColor: 'rgba(255,255,255,.7)', //头部右侧字体颜色, + headerRightChildColor: '#676767', //头部右侧下拉字体颜色, + headerRightColorThis: '#ffffff', //头部右侧鼠标选中, + headerRightNavMore: 'rgba(255,255,255,.7)', //头部右侧更多下拉颜色, + headerRightNavMoreBg: '#1e9fff', //头部右侧更多下拉列表选中背景色, + headerRightNavMoreColor: '#ffffff', //头部右侧更多下拉列表字体色, + headerRightToolColor: '#bbe3df', //头部缩放按钮样式, + headerLogoBg: '#0c0c0c', //logo背景颜色, + headerLogoColor: '#ffffff', //logo字体颜色, + leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式, + leftMenuBg: '#1f1f1f', //左侧菜单背景, + leftMenuBgThis: '#1e9fff', //左侧菜单选中背景, + leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景, + leftMenuColor: 'rgb(191, 187, 187)', //左侧菜单字体颜色, + leftMenuColorThis: '#ffffff', //左侧菜单选中字体颜色, + tabActiveColor: '#1e9fff', //tab选项卡选中颜色, + }, + { + headerRightBg: '#ffb800', //头部右侧背景色 + headerRightBgThis: '#d09600', //头部右侧选中背景色, + headerRightColor: 'rgba(255,255,255,.7)', //头部右侧字体颜色, + headerRightChildColor: '#676767', //头部右侧下拉字体颜色, + headerRightColorThis: '#ffffff', //头部右侧鼠标选中, + headerRightNavMore: 'rgba(255,255,255,.7)', //头部右侧更多下拉颜色, + headerRightNavMoreBg: '#d09600', //头部右侧更多下拉列表选中背景色, + headerRightNavMoreColor: '#ffffff', //头部右侧更多下拉列表字体色, + headerRightToolColor: '#bbe3df', //头部缩放按钮样式, + headerLogoBg: '#243346', //logo背景颜色, + headerLogoColor: '#ffffff', //logo字体颜色, + leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式, + leftMenuBg: '#2f4056', //左侧菜单背景, + leftMenuBgThis: '#8593a7', //左侧菜单选中背景, + leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景, + leftMenuColor: 'rgb(191, 187, 187)', //左侧菜单字体颜色, + leftMenuColorThis: '#ffffff', //左侧菜单选中字体颜色, + tabActiveColor: '#ffb800', //tab选项卡选中颜色, + }, + { + headerRightBg: '#e82121', //头部右侧背景色 + headerRightBgThis: '#ae1919', //头部右侧选中背景色, + headerRightColor: 'rgba(255,255,255,.7)', //头部右侧字体颜色, + headerRightChildColor: '#676767', //头部右侧下拉字体颜色, + headerRightColorThis: '#ffffff', //头部右侧鼠标选中, + headerRightNavMore: 'rgba(255,255,255,.7)', //头部右侧更多下拉颜色, + headerRightNavMoreBg: '#ae1919', //头部右侧更多下拉列表选中背景色, + headerRightNavMoreColor: '#ffffff', //头部右侧更多下拉列表字体色, + headerRightToolColor: '#bbe3df', //头部缩放按钮样式, + headerLogoBg: '#0c0c0c', //logo背景颜色, + headerLogoColor: '#ffffff', //logo字体颜色, + leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式, + leftMenuBg: '#1f1f1f', //左侧菜单背景, + leftMenuBgThis: '#3b3f4b', //左侧菜单选中背景, + leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景, + leftMenuColor: 'rgb(191, 187, 187)', //左侧菜单字体颜色, + leftMenuColorThis: '#ffffff', //左侧菜单选中字体颜色, + tabActiveColor: '#e82121', //tab选项卡选中颜色, + }, + { + headerRightBg: '#963885', //头部右侧背景色 + headerRightBgThis: '#772c6a', //头部右侧选中背景色, + headerRightColor: 'rgba(255,255,255,.7)', //头部右侧字体颜色, + headerRightChildColor: '#676767', //头部右侧下拉字体颜色, + headerRightColorThis: '#ffffff', //头部右侧鼠标选中, + headerRightNavMore: 'rgba(255,255,255,.7)', //头部右侧更多下拉颜色, + headerRightNavMoreBg: '#772c6a', //头部右侧更多下拉列表选中背景色, + headerRightNavMoreColor: '#ffffff', //头部右侧更多下拉列表字体色, + headerRightToolColor: '#bbe3df', //头部缩放按钮样式, + headerLogoBg: '#243346', //logo背景颜色, + headerLogoColor: '#ffffff', //logo字体颜色, + leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式, + leftMenuBg: '#2f4056', //左侧菜单背景, + leftMenuBgThis: '#586473', //左侧菜单选中背景, + leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景, + leftMenuColor: 'rgb(191, 187, 187)', //左侧菜单字体颜色, + leftMenuColorThis: '#ffffff', //左侧菜单选中字体颜色, + tabActiveColor: '#963885', //tab选项卡选中颜色, + }, + { + headerRightBg: '#2D8CF0', //头部右侧背景色 + headerRightBgThis: '#0069b7', //头部右侧选中背景色, + headerRightColor: 'rgba(255,255,255,.7)', //头部右侧字体颜色, + headerRightChildColor: '#676767', //头部右侧下拉字体颜色, + headerRightColorThis: '#ffffff', //头部右侧鼠标选中, + headerRightNavMore: 'rgba(255,255,255,.7)', //头部右侧更多下拉颜色, + headerRightNavMoreBg: '#0069b7', //头部右侧更多下拉列表选中背景色, + headerRightNavMoreColor: '#ffffff', //头部右侧更多下拉列表字体色, + headerRightToolColor: '#bbe3df', //头部缩放按钮样式, + headerLogoBg: '#0069b7', //logo背景颜色, + headerLogoColor: '#ffffff', //logo字体颜色, + leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式, + leftMenuBg: '#1f1f1f', //左侧菜单背景, + leftMenuBgThis: '#2D8CF0', //左侧菜单选中背景, + leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景, + leftMenuColor: 'rgb(191, 187, 187)', //左侧菜单字体颜色, + leftMenuColorThis: '#ffffff', //左侧菜单选中字体颜色, + tabActiveColor: '#2d8cf0', //tab选项卡选中颜色, + }, + { + headerRightBg: '#ffb800', //头部右侧背景色 + headerRightBgThis: '#d09600', //头部右侧选中背景色, + headerRightColor: 'rgba(255,255,255,.7)', //头部右侧字体颜色, + headerRightChildColor: '#676767', //头部右侧下拉字体颜色, + headerRightColorThis: '#ffffff', //头部右侧鼠标选中, + headerRightNavMore: 'rgba(255,255,255,.7)', //头部右侧更多下拉颜色, + headerRightNavMoreBg: '#d09600', //头部右侧更多下拉列表选中背景色, + headerRightNavMoreColor: '#ffffff', //头部右侧更多下拉列表字体色, + headerRightToolColor: '#bbe3df', //头部缩放按钮样式, + headerLogoBg: '#d09600', //logo背景颜色, + headerLogoColor: '#ffffff', //logo字体颜色, + leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式, + leftMenuBg: '#2f4056', //左侧菜单背景, + leftMenuBgThis: '#3b3f4b', //左侧菜单选中背景, + leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景, + leftMenuColor: 'rgb(191, 187, 187)', //左侧菜单字体颜色, + leftMenuColorThis: '#ffffff', //左侧菜单选中字体颜色, + tabActiveColor: '#ffb800', //tab选项卡选中颜色, + }, + { + headerRightBg: '#e82121', //头部右侧背景色 + headerRightBgThis: '#ae1919', //头部右侧选中背景色, + headerRightColor: 'rgba(255,255,255,.7)', //头部右侧字体颜色, + headerRightChildColor: '#676767', //头部右侧下拉字体颜色, + headerRightColorThis: '#ffffff', //头部右侧鼠标选中, + headerRightNavMore: 'rgba(255,255,255,.7)', //头部右侧更多下拉颜色, + headerRightNavMoreBg: '#ae1919', //头部右侧更多下拉列表选中背景色, + headerRightNavMoreColor: '#ffffff', //头部右侧更多下拉列表字体色, + headerRightToolColor: '#bbe3df', //头部缩放按钮样式, + headerLogoBg: '#d91f1f', //logo背景颜色, + headerLogoColor: '#ffffff', //logo字体颜色, + leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式, + leftMenuBg: '#1f1f1f', //左侧菜单背景, + leftMenuBgThis: '#3b3f4b', //左侧菜单选中背景, + leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景, + leftMenuColor: 'rgb(191, 187, 187)', //左侧菜单字体颜色, + leftMenuColorThis: '#ffffff', //左侧菜单选中字体颜色, + tabActiveColor: '#e82121', //tab选项卡选中颜色, + }, + { + headerRightBg: '#963885', //头部右侧背景色 + headerRightBgThis: '#772c6a', //头部右侧选中背景色, + headerRightColor: 'rgba(255,255,255,.7)', //头部右侧字体颜色, + headerRightChildColor: '#676767', //头部右侧下拉字体颜色, + headerRightColorThis: '#ffffff', //头部右侧鼠标选中, + headerRightNavMore: 'rgba(255,255,255,.7)', //头部右侧更多下拉颜色, + headerRightNavMoreBg: '#772c6a', //头部右侧更多下拉列表选中背景色, + headerRightNavMoreColor: '#ffffff', //头部右侧更多下拉列表字体色, + headerRightToolColor: '#bbe3df', //头部缩放按钮样式, + headerLogoBg: '#772c6a', //logo背景颜色, + headerLogoColor: '#ffffff', //logo字体颜色, + leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式, + leftMenuBg: '#2f4056', //左侧菜单背景, + leftMenuBgThis: '#626f7f', //左侧菜单选中背景, + leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景, + leftMenuColor: 'rgb(191, 187, 187)', //左侧菜单字体颜色, + leftMenuColorThis: '#ffffff', //左侧菜单选中字体颜色, + tabActiveColor: '#963885', //tab选项卡选中颜色, + } + ]; + if (bgcolorId === undefined) { + return bgColorConfig; + } else { + return bgColorConfig[bgcolorId]; + } + }, + + /** + * 初始化 + * @param options + */ + render: function (options) { + options.bgColorDefault = options.bgColorDefault || false; + options.listen = options.listen || false; + var bgcolorId = sessionStorage.getItem('layuiminiBgcolorId'); + if (bgcolorId === null || bgcolorId === undefined || bgcolorId === '') { + bgcolorId = options.bgColorDefault; + } + miniTheme.buildThemeCss(bgcolorId); + if (options.listen) miniTheme.listen(options); + }, + + /** + * 构建主题样式 + * @param bgcolorId + * @returns {boolean} + */ + buildThemeCss: function (bgcolorId) { + if (!bgcolorId) { + return false; + } + var bgcolorData = miniTheme.config(bgcolorId); + var styleHtml = '/*头部右侧背景色 headerRightBg */\n' + + '.layui-layout-admin .layui-header {\n' + + ' background-color: ' + bgcolorData.headerRightBg + ' !important;\n' + + '}\n' + + '\n' + + '/*头部右侧选中背景色 headerRightBgThis */\n' + + '.layui-layout-admin .layui-header .layuimini-header-content > ul > .layui-nav-item.layui-this, .layuimini-tool i:hover {\n' + + ' background-color: ' + bgcolorData.headerRightBgThis + ' !important;\n' + + '}\n' + + '\n' + + '/*头部右侧字体颜色 headerRightColor */\n' + + '.layui-layout-admin .layui-header .layui-nav .layui-nav-item a {\n' + + ' color: ' + bgcolorData.headerRightColor + ';\n' + + '}\n' + + '/**头部右侧下拉字体颜色 headerRightChildColor */\n' + + '.layui-layout-admin .layui-header .layui-nav .layui-nav-item .layui-nav-child a {\n' + + ' color: ' + bgcolorData.headerRightChildColor + '!important;\n' + + '}\n' + + '\n' + + '/*头部右侧鼠标选中 headerRightColorThis */\n' + + '.layui-header .layuimini-menu-header-pc.layui-nav .layui-nav-item a:hover, .layui-header .layuimini-header-menu.layuimini-pc-show.layui-nav .layui-this a {\n' + + ' color: ' + bgcolorData.headerRightColorThis + ' !important;\n' + + '}\n' + + '\n' + + '/*头部右侧更多下拉颜色 headerRightNavMore */\n' + + '.layui-header .layui-nav .layui-nav-more {\n' + + ' border-top-color: ' + bgcolorData.headerRightNavMore + ' !important;\n' + + '}\n' + + '\n' + + '/*头部右侧更多下拉颜色 headerRightNavMore */\n' + + '.layui-header .layui-nav .layui-nav-mored, .layui-header .layui-nav-itemed > a .layui-nav-more {\n' + + ' border-color: transparent transparent ' + bgcolorData.headerRightNavMore + ' !important;\n' + + '}\n' + + '\n' + + '/**头部右侧更多下拉配置色 headerRightNavMoreBg headerRightNavMoreColor */\n' + + '.layui-header .layui-nav .layui-nav-child dd.layui-this a, .layui-header .layui-nav-child dd.layui-this, .layui-layout-admin .layui-header .layui-nav .layui-nav-item .layui-nav-child .layui-this a {\n' + + ' background-color: ' + bgcolorData.headerRightNavMoreBg + ' !important;\n' + + ' color:' + bgcolorData.headerRightNavMoreColor + ' !important;\n' + + '}\n' + + '\n' + + '/*头部缩放按钮样式 headerRightToolColor */\n' + + '.layui-layout-admin .layui-header .layuimini-tool i {\n' + + ' color: ' + bgcolorData.headerRightToolColor + ';\n' + + '}\n' + + '\n' + + '/*logo背景颜色 headerLogoBg */\n' + + '.layui-layout-admin .layuimini-logo {\n' + + ' background-color: ' + bgcolorData.headerLogoBg + ' !important;\n' + + '}\n' + + '\n' + + '/*logo字体颜色 headerLogoColor */\n' + + '.layui-layout-admin .layuimini-logo h1 {\n' + + ' color: ' + bgcolorData.headerLogoColor + ';\n' + + '}\n' + + '\n' + + '/*左侧菜单更多下拉样式 leftMenuNavMore */\n' + + '.layuimini-menu-left .layui-nav .layui-nav-more,.layuimini-menu-left-zoom.layui-nav .layui-nav-more {\n' + + ' border-top-color: ' + bgcolorData.leftMenuNavMore + ';\n' + + '}\n' + + '\n' + + '/*左侧菜单更多下拉样式 leftMenuNavMore */\n' + + '.layuimini-menu-left .layui-nav .layui-nav-mored, .layuimini-menu-left .layui-nav-itemed > a .layui-nav-more, .layuimini-menu-left-zoom.layui-nav .layui-nav-mored, .layuimini-menu-left-zoom.layui-nav-itemed > a .layui-nav-more {\n' + + ' border-color: transparent transparent ' + bgcolorData.leftMenuNavMore + ' !important;\n' + + '}\n' + + '\n' + + '/*左侧菜单背景 leftMenuBg */\n' + + '.layui-side.layui-bg-black, .layui-side.layui-bg-black > .layuimini-menu-left > ul, .layuimini-menu-left-zoom > ul {\n' + + ' background-color: ' + bgcolorData.leftMenuBg + ' !important;\n' + + '}\n' + + '\n' + + '/*左侧菜单选中背景 leftMenuBgThis */\n' + + '.layuimini-menu-left .layui-nav-tree .layui-this, .layuimini-menu-left .layui-nav-tree .layui-this > a, .layuimini-menu-left .layui-nav-tree .layui-nav-child dd.layui-this, .layuimini-menu-left .layui-nav-tree .layui-nav-child dd.layui-this a, .layuimini-menu-left-zoom.layui-nav-tree .layui-this, .layuimini-menu-left-zoom.layui-nav-tree .layui-this > a, .layuimini-menu-left-zoom.layui-nav-tree .layui-nav-child dd.layui-this, .layuimini-menu-left-zoom.layui-nav-tree .layui-nav-child dd.layui-this a {\n' + + ' background-color: ' + bgcolorData.leftMenuBgThis + ' !important\n' + + '}\n' + + '\n' + + '/*左侧菜单子菜单背景 leftMenuChildBg */\n' + + '.layuimini-menu-left .layui-nav-itemed > .layui-nav-child{\n' + + ' background-color: ' + bgcolorData.leftMenuChildBg + ' !important;\n' + + '}\n' + + '\n' + + '/*左侧菜单字体颜色 leftMenuColor */\n' + + '.layuimini-menu-left .layui-nav .layui-nav-item a, .layuimini-menu-left-zoom.layui-nav .layui-nav-item a {\n' + + ' color: ' + bgcolorData.leftMenuColor + ' !important;\n' + + '}\n' + + '\n' + + '/*左侧菜单选中字体颜色 leftMenuColorThis */\n' + + '.layuimini-menu-left .layui-nav .layui-nav-item a:hover, .layuimini-menu-left .layui-nav .layui-this a, .layuimini-menu-left-zoom.layui-nav .layui-nav-item a:hover, .layuimini-menu-left-zoom.layui-nav .layui-this a {\n' + + ' color:' + bgcolorData.leftMenuColorThis + ' !important;\n' + + '}\n' + + '\n' + + '/**tab选项卡选中颜色 tabActiveColor */\n' + + '.layuimini-tab .layui-tab-title .layui-this .layuimini-tab-active {\n' + + ' background-color: ' + bgcolorData.tabActiveColor + ';\n' + + '}\n'; + $('#layuimini-bg-color').html(styleHtml); + }, + + /** + * 构建主题选择html + * @param options + * @returns {string} + */ + buildBgColorHtml: function (options) { + options.bgColorDefault = options.bgColorDefault || 0; + var bgcolorId = parseInt(sessionStorage.getItem('layuiminiBgcolorId')); + if (isNaN(bgcolorId)) bgcolorId = options.bgColorDefault; + var bgColorConfig = miniTheme.config(); + var html = ''; + $.each(bgColorConfig, function (key, val) { + if (key === bgcolorId) { + html += '
  • \n'; + } else { + html += '
  • \n'; + } + html += '\n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
  • '; + }); + return html; + }, + + /** + * 监听 + * @param options + */ + listen: function (options) { + $('body').on('click', '[data-bgcolor]', function () { + var loading = layer.load(0, {shade: false, time: 2 * 1000}); + var clientHeight = (document.documentElement.clientHeight) - 60; + var bgColorHtml = miniTheme.buildBgColorHtml(options); + var html = '
    \n' + + '
    \n' + + '配色方案\n' + + '
    \n' + + '
    \n' + + '
      \n' + bgColorHtml + '
    \n' + + '
    \n' + + '
    \n' + + ' 开发文档\n' + + ' 开源地址\n' + + ' 官方网站\n' + + '
    '; + layer.open({ + type: 1, + title: false, + closeBtn: 0, + shade: 0.2, + anim: 2, + shadeClose: true, + id: 'layuiminiBgColor', + area: ['340px', clientHeight + 'px'], + offset: 'rb', + content: html, + success: function (index, layero) { + }, + end: function () { + $('.layuimini-select-bgcolor').removeClass('layui-this'); + } + }); + layer.close(loading); + }); + + $('body').on('click', '[data-select-bgcolor]', function () { + var bgcolorId = $(this).attr('data-select-bgcolor'); + $('.layuimini-color .color-content ul .layui-this').attr('class', ''); + $(this).attr('class', 'layui-this'); + sessionStorage.setItem('layuiminiBgcolorId', bgcolorId); + miniTheme.render({ + bgColorDefault: bgcolorId, + listen: false, + }); + }); + } + }; + + exports("miniTheme", miniTheme); + +}) +; \ No newline at end of file diff --git a/public/admin/js/lay-module/step-lay/step.css b/public/admin/js/lay-module/step-lay/step.css new file mode 100644 index 0000000..87c6bb3 --- /dev/null +++ b/public/admin/js/lay-module/step-lay/step.css @@ -0,0 +1,79 @@ +.lay-step { + font-size: 0; + width: 400px; + margin: 0 auto; + max-width: 100%; + padding-left: 200px; +} + +.step-item { + display: inline-block; + line-height: 26px; + position: relative; + font-size: 14px; +} + +.step-item-tail { + width: 100%; + padding: 0 10px; + position: absolute; + left: 0; + top: 13px; +} + +.step-item-tail i { + display: inline-block; + width: 100%; + height: 1px; + vertical-align: top; + background: #c2c2c2; + position: relative; +} + +.step-item-tail .step-item-tail-done { + background: #009688; +} + +.step-item-head { + position: relative; + display: inline-block; + height: 26px; + width: 26px; + text-align: center; + vertical-align: top; + color: #009688; + border: 1px solid #009688; + border-radius: 50%; + background: #ffffff; +} + +.step-item-head.step-item-head-active { + background: #009688; + color: #ffffff; +} + +.step-item-main { + display: block; + position: relative; + margin-left: -50%; + margin-right: 50%; + padding-left: 26px; + text-align: center; +} + +.step-item-main-title { + font-weight: bolder; + color: #555555; +} + +.step-item-main-desc { + color: #aaaaaa; +} + +.lay-step + [carousel-item]:before { + display: none; +} + +.lay-step + [carousel-item] > * { + background-color: transparent; +} \ No newline at end of file diff --git a/public/admin/js/lay-module/step-lay/step.js b/public/admin/js/lay-module/step-lay/step.js new file mode 100644 index 0000000..6cfedc2 --- /dev/null +++ b/public/admin/js/lay-module/step-lay/step.js @@ -0,0 +1,101 @@ +layui.define(['layer', 'carousel'], function (exports) { + var $ = layui.jquery; + var layer = layui.layer; + var carousel = layui.carousel; + + // 添加步骤条dom节点 + var renderDom = function (elem, stepItems, postion) { + var stepDiv = '
    '; + for (var i = 0; i < stepItems.length; i++) { + stepDiv += '
    '; + // 线 + if (i < (stepItems.length - 1)) { + if (i < postion) { + stepDiv += '
    '; + } else { + stepDiv += '
    '; + } + } + + // 数字 + var number = stepItems[i].number; + if (!number) { + number = i + 1; + } + if (i == postion) { + stepDiv += '
    ' + number + '
    '; + } else if (i < postion) { + stepDiv += '
    '; + } else { + stepDiv += '
    ' + number + '
    '; + } + + // 标题和描述 + var title = stepItems[i].title; + var desc = stepItems[i].desc; + if (title || desc) { + stepDiv += '
    '; + if (title) { + stepDiv += '
    ' + title + '
    '; + } + if (desc) { + stepDiv += '
    ' + desc + '
    '; + } + stepDiv += '
    '; + } + stepDiv += '
    '; + } + stepDiv += '
    '; + + $(elem).prepend(stepDiv); + + // 计算每一个条目的宽度 + var bfb = 100 / stepItems.length; + $('.step-item').css('width', bfb + '%'); + }; + + var step = { + // 渲染步骤条 + render: function (param) { + param.indicator = 'none'; // 不显示指示器 + param.arrow = 'always'; // 始终显示箭头 + param.autoplay = false; // 关闭自动播放 + if (!param.stepWidth) { + param.stepWidth = '400px'; + } + + // 渲染轮播图 + carousel.render(param); + + // 渲染步骤条 + var stepItems = param.stepItems; + renderDom(param.elem, stepItems, 0); + $('.lay-step').css('width', param.stepWidth); + + //监听轮播切换事件 + carousel.on('change(' + param.filter + ')', function (obj) { + $(param.elem).find('.lay-step').remove(); + renderDom(param.elem, stepItems, obj.index); + $('.lay-step').css('width', param.stepWidth); + }); + + // 隐藏左右箭头按钮 + $(param.elem).find('.layui-carousel-arrow').css('display', 'none'); + + // 去掉轮播图的背景颜色 + $(param.elem).css('background-color', 'transparent'); + }, + // 下一步 + next: function (elem) { + $(elem).find('.layui-carousel-arrow[lay-type=add]').trigger('click'); + }, + // 上一步 + pre: function (elem) { + $(elem).find('.layui-carousel-arrow[lay-type=sub]').trigger('click'); + } + }; + + layui.link(layui.cache.base + 'step-lay/step.css'); + + exports('step', step); +}); diff --git a/public/admin/js/lay-module/tableSelect/tableSelect.js b/public/admin/js/lay-module/tableSelect/tableSelect.js new file mode 100644 index 0000000..f9d03e4 --- /dev/null +++ b/public/admin/js/lay-module/tableSelect/tableSelect.js @@ -0,0 +1,272 @@ +layui.define(['table', 'jquery', 'form'], function (exports) { + "use strict"; + + var MOD_NAME = 'tableSelect', + $ = layui.jquery, + table = layui.table, + form = layui.form; + var tableSelect = function () { + this.v = '1.1.0'; + }; + + /** + * 初始化表格选择器 + */ + tableSelect.prototype.render = function (opt) { + var elem = $(opt.elem); + var tableDone = opt.table.done || function(){}; + + //默认设置 + opt.searchKey = opt.searchKey || 'keyword'; + opt.searchPlaceholder = opt.searchPlaceholder || '关键词搜索'; + opt.checkedKey = opt.checkedKey; + opt.table.page = opt.table.page || true; + opt.table.height = opt.height || 315; + + //最小宽度 + opt.width = opt.width || '530'; + + //多搜索条件 + opt.searchType = opt.searchType || 'one'; + opt.searchList = opt.searchList || [{key: opt.searchKey, placeholder: opt.searchPlaceholder}]; + + elem.off('click').on('click', function(e) { + e.stopPropagation(); + + if($('div.tableSelect').length >= 1){ + return false; + } + + var t = elem.offset().top + elem.outerHeight()+"px"; + var l = elem.offset().left +"px"; + var tableName = "tableSelect_table_" + new Date().getTime(); + var tableBox = '
    '; + tableBox += '
    '; + tableBox += '
    '; + + //判断是否多搜索条件 + if(opt.searchType == 'more'){ + $.each(opt.searchList, function (index, item) { + tableBox += ''; + }); + }else{ + tableBox += ''; + } + + tableBox += ''; + tableBox += '
    '; + tableBox += ''; + tableBox += '
    '; + tableBox += '
    '; + tableBox += '
    '; + tableBox = $(tableBox); + $('body').append(tableBox); + + //数据缓存 + var checkedData = []; + + //渲染TABLE + opt.table.elem = "#"+tableName; + opt.table.id = tableName; + opt.table.done = function(res, curr, count){ + defaultChecked(res, curr, count); + setChecked(res, curr, count); + tableDone(res, curr, count); + }; + var tableSelect_table = table.render(opt.table); + + //分页选中保存数组 + table.on('radio('+tableName+')', function(obj){ + if(opt.checkedKey){ + checkedData = table.checkStatus(tableName).data + } + updataButton(table.checkStatus(tableName).data.length) + }) + table.on('checkbox('+tableName+')', function(obj){ + if(opt.checkedKey){ + if(obj.checked){ + for (var i=0;i $(window).height(); + var overWidth = (elem.offset().left + tableBox.outerWidth()) > $(window).width(); + overHeight && tableBox.css({'top':'auto','bottom':'0px'}); + overWidth && tableBox.css({'left':'auto','right':'5px'}) + + //关键词搜索 + form.on('submit(tableSelect_btn_search)', function(data){ + tableSelect_table.reload({ + where: data.field, + page: { + curr: 1 + } + }); + return false; + }); + + //双击行选中 + table.on('rowDouble('+tableName+')', function(obj){ + var checkStatus = {data:[obj.data]}; + selectDone(checkStatus); + }) + + //按钮选中 + tableBox.find('.tableSelect_btn_select').on('click', function() { + var checkStatus = table.checkStatus(tableName); + if(checkedData.length > 1){ + checkStatus.data = checkedData; + } + selectDone(checkStatus); + }) + + //写值回调和关闭 + function selectDone (checkStatus){ + if(opt.checkedKey){ + var selected = []; + for(var i=0;i 0 && mData[len - 1].id == s_pid) { + mData[len - 1].isParent = true; + } + mData.push(data[i]); + sort(data[i].id, data); + } + } + }; + sort(param.treeSpid, tNodes); + + // 重写参数 + param.url = undefined; + param.data = mData; + param.page = { + count: param.data.length, + limit: param.data.length + }; + param.cols[0][param.treeColIndex].templet = function (d) { + var mId = d.id; + var mPid = d.pid; + var isDir = d.isParent; + var emptyNum = treetable.getEmptyNum(mPid, mData); + var iconHtml = ''; + for (var i = 0; i < emptyNum; i++) { + iconHtml += ''; + } + if (isDir) { + iconHtml += ' '; + } else { + iconHtml += ''; + } + iconHtml += '  '; + var ttype = isDir ? 'dir' : 'file'; + var vg = ''; + return vg + iconHtml + d[param.cols[0][param.treeColIndex].field] + '' + }; + + param.done = function (res, curr, count) { + $(param.elem).next().addClass('treeTable'); + $('.treeTable .layui-table-page').css('display', 'none'); + $(param.elem).next().attr('treeLinkage', param.treeLinkage); + // 绑定事件换成对body绑定 + /*$('.treeTable .treeTable-icon').click(function () { + treetable.toggleRows($(this), param.treeLinkage); + });*/ + if (param.treeDefaultClose) { + treetable.foldAll(param.elem); + } + if (doneCallback) { + doneCallback(res, curr, count); + } + }; + + // 渲染表格 + table.render(param); + }, + // 计算缩进的数量 + getEmptyNum: function (pid, data) { + var num = 0; + if (!pid) { + return num; + } + var tPid; + for (var i = 0; i < data.length; i++) { + if (pid == data[i].id) { + num += 1; + tPid = data[i].pid; + break; + } + } + return num + treetable.getEmptyNum(tPid, data); + }, + // 展开/折叠行 + toggleRows: function ($dom, linkage) { + var type = $dom.attr('lay-ttype'); + if ('file' == type) { + return; + } + var mId = $dom.attr('lay-tid'); + var isOpen = $dom.hasClass('open'); + if (isOpen) { + $dom.removeClass('open'); + } else { + $dom.addClass('open'); + } + $dom.closest('tbody').find('tr').each(function () { + var $ti = $(this).find('.treeTable-icon'); + var pid = $ti.attr('lay-tpid'); + var ttype = $ti.attr('lay-ttype'); + var tOpen = $ti.hasClass('open'); + if (mId == pid) { + if (isOpen) { + $(this).hide(); + if ('dir' == ttype && tOpen == isOpen) { + $ti.trigger('click'); + } + } else { + $(this).show(); + if (linkage && 'dir' == ttype && tOpen == isOpen) { + $ti.trigger('click'); + } + } + } + }); + }, + // 检查参数 + checkParam: function (param) { + if (!param.treeSpid && param.treeSpid != 0) { + layer.msg('参数treeSpid不能为空', {icon: 5}); + return false; + } + + if (!param.treeColIndex && param.treeColIndex != 0) { + layer.msg('参数treeColIndex不能为空', {icon: 5}); + return false; + } + return true; + }, + // 展开所有 + expandAll: function (dom) { + $(dom).next('.treeTable').find('.layui-table-body tbody tr').each(function () { + var $ti = $(this).find('.treeTable-icon'); + var ttype = $ti.attr('lay-ttype'); + var tOpen = $ti.hasClass('open'); + if ('dir' == ttype && !tOpen) { + $ti.trigger('click'); + } + }); + }, + // 折叠所有 + foldAll: function (dom) { + $(dom).next('.treeTable').find('.layui-table-body tbody tr').each(function () { + var $ti = $(this).find('.treeTable-icon'); + var ttype = $ti.attr('lay-ttype'); + var tOpen = $ti.hasClass('open'); + if ('dir' == ttype && tOpen) { + $ti.trigger('click'); + } + }); + } + }; + + layui.link(layui.cache.base + 'treetable-lay/treetable.css'); + + // 给图标列绑定事件 + $('body').on('click', '.treeTable .treeTable-icon', function () { + var treeLinkage = $(this).parents('.treeTable').attr('treeLinkage'); + if ('true' == treeLinkage) { + treetable.toggleRows($(this), true); + } else { + treetable.toggleRows($(this), false); + } + }); + + exports('treetable', treetable); +}); diff --git a/public/admin/js/lay-module/wangEditor/fonts/w-e-icon.woff b/public/admin/js/lay-module/wangEditor/fonts/w-e-icon.woff new file mode 100644 index 0000000..6dc5b5a Binary files /dev/null and b/public/admin/js/lay-module/wangEditor/fonts/w-e-icon.woff differ diff --git a/public/admin/js/lay-module/wangEditor/wangEditor.css b/public/admin/js/lay-module/wangEditor/wangEditor.css new file mode 100644 index 0000000..d449327 --- /dev/null +++ b/public/admin/js/lay-module/wangEditor/wangEditor.css @@ -0,0 +1,411 @@ +.w-e-toolbar, +.w-e-text-container, +.w-e-menu-panel { + padding: 0; + margin: 0; + box-sizing: border-box; +} +.w-e-toolbar *, +.w-e-text-container *, +.w-e-menu-panel * { + padding: 0; + margin: 0; + box-sizing: border-box; +} +.w-e-clear-fix:after { + content: ""; + display: table; + clear: both; +} + +.w-e-toolbar .w-e-droplist { + position: absolute; + left: 0; + top: 0; + background-color: #fff; + border: 1px solid #f1f1f1; + border-right-color: #ccc; + border-bottom-color: #ccc; +} +.w-e-toolbar .w-e-droplist .w-e-dp-title { + text-align: center; + color: #999; + line-height: 2; + border-bottom: 1px solid #f1f1f1; + font-size: 13px; +} +.w-e-toolbar .w-e-droplist ul.w-e-list { + list-style: none; + line-height: 1; +} +.w-e-toolbar .w-e-droplist ul.w-e-list li.w-e-item { + color: #333; + padding: 5px 0; +} +.w-e-toolbar .w-e-droplist ul.w-e-list li.w-e-item:hover { + background-color: #f1f1f1; +} +.w-e-toolbar .w-e-droplist ul.w-e-block { + list-style: none; + text-align: left; + padding: 5px; +} +.w-e-toolbar .w-e-droplist ul.w-e-block li.w-e-item { + display: inline-block; + *display: inline; + *zoom: 1; + padding: 3px 5px; +} +.w-e-toolbar .w-e-droplist ul.w-e-block li.w-e-item:hover { + background-color: #f1f1f1; +} + +@font-face { + font-family: 'w-e-icon'; + src: url(data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAABhQAAsAAAAAGAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgDxIPBGNtYXAAAAFoAAABBAAAAQQrSf4BZ2FzcAAAAmwAAAAIAAAACAAAABBnbHlmAAACdAAAEvAAABLwfpUWUWhlYWQAABVkAAAANgAAADYQp00kaGhlYQAAFZwAAAAkAAAAJAfEA+FobXR4AAAVwAAAAIQAAACEeAcD7GxvY2EAABZEAAAARAAAAERBSEX+bWF4cAAAFogAAAAgAAAAIAAsALZuYW1lAAAWqAAAAYYAAAGGmUoJ+3Bvc3QAABgwAAAAIAAAACAAAwAAAAMD3gGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA8fwDwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEAOgAAAA2ACAABAAWAAEAIOkG6Q3pEulH6Wbpd+m56bvpxunL6d/qDepc6l/qZepo6nHqefAN8BTxIPHc8fz//f//AAAAAAAg6QbpDekS6UfpZel36bnpu+nG6cvp3+oN6lzqX+pi6mjqcep38A3wFPEg8dzx/P/9//8AAf/jFv4W+Bb0FsAWoxaTFlIWURZHFkMWMBYDFbUVsxWxFa8VpxWiEA8QCQ7+DkMOJAADAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAACAAD/wAQAA8AABAATAAABNwEnAQMuAScTNwEjAQMlATUBBwGAgAHAQP5Anxc7MmOAAYDA/oDAAoABgP6ATgFAQAHAQP5A/p0yOxcBEU4BgP6A/YDAAYDA/oCAAAQAAAAABAADgAAQACEALQA0AAABOAExETgBMSE4ATEROAExITUhIgYVERQWMyEyNjURNCYjBxQGIyImNTQ2MzIWEyE1EwEzNwPA/IADgPyAGiYmGgOAGiYmGoA4KCg4OCgoOED9AOABAEDgA0D9AAMAQCYa/QAaJiYaAwAaJuAoODgoKDg4/biAAYD+wMAAAAIAAABABAADQAA4ADwAAAEmJy4BJyYjIgcOAQcGBwYHDgEHBhUUFx4BFxYXFhceARcWMzI3PgE3Njc2Nz4BNzY1NCcuAScmJwERDQED1TY4OXY8PT8/PTx2OTg2CwcICwMDAwMLCAcLNjg5djw9Pz89PHY5ODYLBwgLAwMDAwsIBwv9qwFA/sADIAgGBggCAgICCAYGCCkqKlktLi8vLi1ZKiopCAYGCAICAgIIBgYIKSoqWS0uLy8uLVkqKin94AGAwMAAAAAAAgDA/8ADQAPAABsAJwAAASIHDgEHBhUUFx4BFxYxMDc+ATc2NTQnLgEnJgMiJjU0NjMyFhUUBgIAQjs6VxkZMjJ4MjIyMngyMhkZVzo7QlBwcFBQcHADwBkZVzo7Qnh9fcxBQUFBzH19eEI7OlcZGf4AcFBQcHBQUHAAAAEAAAAABAADgAArAAABIgcOAQcGBycRISc+ATMyFx4BFxYVFAcOAQcGBxc2Nz4BNzY1NCcuAScmIwIANTIyXCkpI5YBgJA1i1BQRUZpHh4JCSIYGB5VKCAgLQwMKCiLXl1qA4AKCycbHCOW/oCQNDweHmlGRVArKClJICEaYCMrK2I2NjlqXV6LKCgAAQAAAAAEAAOAACoAABMUFx4BFxYXNyYnLgEnJjU0Nz4BNzYzMhYXByERByYnLgEnJiMiBw4BBwYADAwtICAoVR4YGCIJCR4eaUZFUFCLNZABgJYjKSlcMjI1al1eiygoAYA5NjZiKysjYBohIEkpKCtQRUZpHh48NJABgJYjHBsnCwooKIteXQAAAAACAAAAQAQBAwAAJgBNAAATMhceARcWFRQHDgEHBiMiJy4BJyY1JzQ3PgE3NjMVIgYHDgEHPgEhMhceARcWFRQHDgEHBiMiJy4BJyY1JzQ3PgE3NjMVIgYHDgEHPgHhLikpPRESEhE9KSkuLikpPRESASMjelJRXUB1LQkQBwgSAkkuKSk9ERISET0pKS4uKSk9ERIBIyN6UlFdQHUtCRAHCBICABIRPSkpLi4pKT0REhIRPSkpLiBdUVJ6IyOAMC4IEwoCARIRPSkpLi4pKT0REhIRPSkpLiBdUVJ6IyOAMC4IEwoCAQAABgBA/8AEAAPAAAMABwALABEAHQApAAAlIRUhESEVIREhFSEnESM1IzUTFTMVIzU3NSM1MxUVESM1MzUjNTM1IzUBgAKA/YACgP2AAoD9gMBAQECAwICAwMCAgICAgIACAIACAIDA/wDAQP3yMkCSPDJAku7+wEBAQEBAAAYAAP/ABAADwAADAAcACwAXACMALwAAASEVIREhFSERIRUhATQ2MzIWFRQGIyImETQ2MzIWFRQGIyImETQ2MzIWFRQGIyImAYACgP2AAoD9gAKA/YD+gEs1NUtLNTVLSzU1S0s1NUtLNTVLSzU1SwOAgP8AgP8AgANANUtLNTVLS/61NUtLNTVLS/61NUtLNTVLSwADAAAAAAQAA6AAAwANABQAADchFSElFSE1EyEVITUhJQkBIxEjEQAEAPwABAD8AIABAAEAAQD9YAEgASDggEBAwEBAAQCAgMABIP7g/wABAAAAAAACAB7/zAPiA7QAMwBkAAABIiYnJicmNDc2PwE+ATMyFhcWFxYUBwYPAQYiJyY0PwE2NCcuASMiBg8BBhQXFhQHDgEjAyImJyYnJjQ3Nj8BNjIXFhQPAQYUFx4BMzI2PwE2NCcmNDc2MhcWFxYUBwYPAQ4BIwG4ChMIIxISEhIjwCNZMTFZIyMSEhISI1gPLA8PD1gpKRQzHBwzFMApKQ8PCBMKuDFZIyMSEhISI1gPLA8PD1gpKRQzHBwzFMApKQ8PDysQIxISEhIjwCNZMQFECAckLS1eLS0kwCIlJSIkLS1eLS0kVxAQDysPWCl0KRQVFRTAKXQpDysQBwj+iCUiJC0tXi0tJFcQEA8rD1gpdCkUFRUUwCl0KQ8rEA8PJC0tXi0tJMAiJQAAAAAFAAD/wAQAA8AAGwA3AFMAXwBrAAAFMjc+ATc2NTQnLgEnJiMiBw4BBwYVFBceARcWEzIXHgEXFhUUBw4BBwYjIicuAScmNTQ3PgE3NhMyNz4BNzY3BgcOAQcGIyInLgEnJicWFx4BFxYnNDYzMhYVFAYjIiYlNDYzMhYVFAYjIiYCAGpdXosoKCgoi15dampdXosoKCgoi15dalZMTHEgISEgcUxMVlZMTHEgISEgcUxMVisrKlEmJiMFHBtWODc/Pzc4VhscBSMmJlEqK9UlGxslJRsbJQGAJRsbJSUbGyVAKCiLXl1qal1eiygoKCiLXl1qal1eiygoA6AhIHFMTFZWTExxICEhIHFMTFZWTExxICH+CQYGFRAQFEM6OlYYGRkYVjo6QxQQEBUGBvcoODgoKDg4KCg4OCgoODgAAAMAAP/ABAADwAAbADcAQwAAASIHDgEHBhUUFx4BFxYzMjc+ATc2NTQnLgEnJgMiJy4BJyY1NDc+ATc2MzIXHgEXFhUUBw4BBwYTBycHFwcXNxc3JzcCAGpdXosoKCgoi15dampdXosoKCgoi15dalZMTHEgISEgcUxMVlZMTHEgISEgcUxMSqCgYKCgYKCgYKCgA8AoKIteXWpqXV6LKCgoKIteXWpqXV6LKCj8YCEgcUxMVlZMTHEgISEgcUxMVlZMTHEgIQKgoKBgoKBgoKBgoKAAAQBl/8ADmwPAACkAAAEiJiMiBw4BBwYVFBYzLgE1NDY3MAcGAgcGBxUhEzM3IzceATMyNjcOAQMgRGhGcVNUbRobSUgGDWVKEBBLPDxZAT1sxizXNC1VJi5QGB09A7AQHh1hPj9BTTsLJjeZbwN9fv7Fj5AjGQIAgPYJDzdrCQcAAAAAAgAAAAAEAAOAAAkAFwAAJTMHJzMRIzcXIyURJyMRMxUhNTMRIwcRA4CAoKCAgKCggP8AQMCA/oCAwEDAwMACAMDAwP8AgP1AQEACwIABAAADAMAAAANAA4AAFgAfACgAAAE+ATU0Jy4BJyYjIREhMjc+ATc2NTQmATMyFhUUBisBEyMRMzIWFRQGAsQcIBQURi4vNf7AAYA1Ly5GFBRE/oRlKjw8KWafn58sPj4B2yJULzUvLkYUFPyAFBRGLi81RnQBRks1NUv+gAEASzU1SwAAAAACAMAAAANAA4AAHwAjAAABMxEUBw4BBwYjIicuAScmNREzERQWFx4BMzI2Nz4BNQEhFSECwIAZGVc6O0JCOzpXGRmAGxgcSSgoSRwYG/4AAoD9gAOA/mA8NDVOFhcXFk41NDwBoP5gHjgXGBsbGBc4Hv6ggAAAAAABAIAAAAOAA4AACwAAARUjATMVITUzASM1A4CA/sCA/kCAAUCAA4BA/QBAQAMAQAABAAAAAAQAA4AAPQAAARUjHgEVFAYHDgEjIiYnLgE1MxQWMzI2NTQmIyE1IS4BJy4BNTQ2Nz4BMzIWFx4BFSM0JiMiBhUUFjMyFhcEAOsVFjUwLHE+PnEsMDWAck5OcnJO/gABLAIEATA1NTAscT4+cSwwNYByTk5yck47bisBwEAdQSI1YiQhJCQhJGI1NExMNDRMQAEDASRiNTViJCEkJCEkYjU0TEw0NEwhHwAAAAcAAP/ABAADwAADAAcACwAPABMAGwAjAAATMxUjNzMVIyUzFSM3MxUjJTMVIwMTIRMzEyETAQMhAyMDIQMAgIDAwMABAICAwMDAAQCAgBAQ/QAQIBACgBD9QBADABAgEP2AEAHAQEBAQEBAQEBAAkD+QAHA/oABgPwAAYD+gAFA/sAAAAoAAAAABAADgAADAAcACwAPABMAFwAbAB8AIwAnAAATESERATUhFR0BITUBFSE1IxUhNREhFSElIRUhETUhFQEhFSEhNSEVAAQA/YABAP8AAQD/AED/AAEA/wACgAEA/wABAPyAAQD/AAKAAQADgPyAA4D9wMDAQMDAAgDAwMDA/wDAwMABAMDA/sDAwMAAAAUAAAAABAADgAADAAcACwAPABMAABMhFSEVIRUhESEVIREhFSERIRUhAAQA/AACgP2AAoD9gAQA/AAEAPwAA4CAQID/AIABQID/AIAAAAAABQAAAAAEAAOAAAMABwALAA8AEwAAEyEVIRchFSERIRUhAyEVIREhFSEABAD8AMACgP2AAoD9gMAEAPwABAD8AAOAgECA/wCAAUCA/wCAAAAFAAAAAAQAA4AAAwAHAAsADwATAAATIRUhBSEVIREhFSEBIRUhESEVIQAEAPwAAYACgP2AAoD9gP6ABAD8AAQA/AADgIBAgP8AgAFAgP8AgAAAAAABAD8APwLmAuYALAAAJRQPAQYjIi8BBwYjIi8BJjU0PwEnJjU0PwE2MzIfATc2MzIfARYVFA8BFxYVAuYQThAXFxCoqBAXFhBOEBCoqBAQThAWFxCoqBAXFxBOEBCoqBDDFhBOEBCoqBAQThAWFxCoqBAXFxBOEBCoqBAQThAXFxCoqBAXAAAABgAAAAADJQNuABQAKAA8AE0AVQCCAAABERQHBisBIicmNRE0NzY7ATIXFhUzERQHBisBIicmNRE0NzY7ATIXFhcRFAcGKwEiJyY1ETQ3NjsBMhcWExEhERQXFhcWMyEyNzY3NjUBIScmJyMGBwUVFAcGKwERFAcGIyEiJyY1ESMiJyY9ATQ3NjsBNzY3NjsBMhcWHwEzMhcWFQElBgUIJAgFBgYFCCQIBQaSBQUIJQgFBQUFCCUIBQWSBQUIJQgFBQUFCCUIBQVJ/gAEBAUEAgHbAgQEBAT+gAEAGwQGtQYEAfcGBQg3Ghsm/iUmGxs3CAUFBQUIsSgIFxYXtxcWFgkosAgFBgIS/rcIBQUFBQgBSQgFBgYFCP63CAUFBQUIAUkIBQYGBQj+twgFBQUFCAFJCAUGBgX+WwId/eMNCwoFBQUFCgsNAmZDBQICBVUkCAYF/eMwIiMhIi8CIAUGCCQIBQVgFQ8PDw8VYAUFCAACAAcASQO3Aq8AGgAuAAAJAQYjIi8BJjU0PwEnJjU0PwE2MzIXARYVFAcBFRQHBiMhIicmPQE0NzYzITIXFgFO/vYGBwgFHQYG4eEGBh0FCAcGAQoGBgJpBQUI/dsIBQUFBQgCJQgFBQGF/vYGBhwGCAcG4OEGBwcGHQUF/vUFCAcG/vslCAUFBQUIJQgFBQUFAAAAAQAjAAAD3QNuALMAACUiJyYjIgcGIyInJjU0NzY3Njc2NzY9ATQnJiMhIgcGHQEUFxYXFjMWFxYVFAcGIyInJiMiBwYjIicmNTQ3Njc2NzY3Nj0BETQ1NDU0JzQnJicmJyYnJicmIyInJjU0NzYzMhcWMzI3NjMyFxYVFAcGIwYHBgcGHQEUFxYzITI3Nj0BNCcmJyYnJjU0NzYzMhcWMzI3NjMyFxYVFAcGByIHBgcGFREUFxYXFhcyFxYVFAcGIwPBGTMyGhkyMxkNCAcJCg0MERAKEgEHFf5+FgcBFQkSEw4ODAsHBw4bNTUaGDExGA0HBwkJCwwQDwkSAQIBAgMEBAUIEhENDQoLBwcOGjU1GhgwMRgOBwcJCgwNEBAIFAEHDwGQDgcBFAoXFw8OBwcOGTMyGRkxMRkOBwcKCg0NEBEIFBQJEREODQoLBwcOAAICAgIMCw8RCQkBAQMDBQxE4AwFAwMFDNRRDQYBAgEICBIPDA0CAgICDAwOEQgJAQIDAwUNRSEB0AINDQgIDg4KCgsLBwcDBgEBCAgSDwwNAgICAg0MDxEICAECAQYMULYMBwEBBwy2UAwGAQEGBxYPDA0CAgICDQwPEQgIAQECBg1P/eZEDAYCAgEJCBEPDA0AAAIAAP+3A/8DtwATADkAAAEyFxYVFAcCBwYjIicmNTQ3ATYzARYXFh8BFgcGIyInJicmJyY1FhcWFxYXFjMyNzY3Njc2NzY3NjcDmygeHhq+TDdFSDQ0NQFtISn9+BcmJy8BAkxMe0c2NiEhEBEEExQQEBIRCRcIDxITFRUdHR4eKQO3GxooJDP+mUY0NTRJSTABSx/9sSsfHw0oek1MGhsuLzo6RAMPDgsLCgoWJRsaEREKCwQEAgABAAAAAAAA9evv618PPPUACwQAAAAAANbEBFgAAAAA1sQEWAAA/7cEAQPAAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAD//wQBAAEAAAAAAAAAAAAAAAAAAAAhBAAAAAAAAAAAAAAAAgAAAAQAAAAEAAAABAAAAAQAAMAEAAAABAAAAAQAAAAEAABABAAAAAQAAAAEAAAeBAAAAAQAAAAEAABlBAAAAAQAAMAEAADABAAAgAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAMlAD8DJQAAA74ABwQAACMD/wAAAAAAAAAKABQAHgBMAJQA+AE2AXwBwgI2AnQCvgLoA34EHgSIBMoE8gU0BXAFiAXgBiIGagaSBroG5AcoB+AIKgkcCXgAAQAAACEAtAAKAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGljb21vb24AaQBjAG8AbQBvAG8AblZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGljb21vb24AaQBjAG8AbQBvAG8Abmljb21vb24AaQBjAG8AbQBvAG8AblJlZ3VsYXIAUgBlAGcAdQBsAGEAcmljb21vb24AaQBjAG8AbQBvAG8AbkZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=) format('truetype'); + font-weight: normal; + font-style: normal; +} +[class^="w-e-icon-"], +[class*=" w-e-icon-"] { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'w-e-icon' !important; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.w-e-icon-close:before { + content: "\f00d"; +} +.w-e-icon-upload2:before { + content: "\e9c6"; +} +.w-e-icon-trash-o:before { + content: "\f014"; +} +.w-e-icon-header:before { + content: "\f1dc"; +} +.w-e-icon-pencil2:before { + content: "\e906"; +} +.w-e-icon-paint-brush:before { + content: "\f1fc"; +} +.w-e-icon-image:before { + content: "\e90d"; +} +.w-e-icon-play:before { + content: "\e912"; +} +.w-e-icon-location:before { + content: "\e947"; +} +.w-e-icon-undo:before { + content: "\e965"; +} +.w-e-icon-redo:before { + content: "\e966"; +} +.w-e-icon-quotes-left:before { + content: "\e977"; +} +.w-e-icon-list-numbered:before { + content: "\e9b9"; +} +.w-e-icon-list2:before { + content: "\e9bb"; +} +.w-e-icon-link:before { + content: "\e9cb"; +} +.w-e-icon-happy:before { + content: "\e9df"; +} +.w-e-icon-bold:before { + content: "\ea62"; +} +.w-e-icon-underline:before { + content: "\ea63"; +} +.w-e-icon-italic:before { + content: "\ea64"; +} +.w-e-icon-strikethrough:before { + content: "\ea65"; +} +.w-e-icon-table2:before { + content: "\ea71"; +} +.w-e-icon-paragraph-left:before { + content: "\ea77"; +} +.w-e-icon-paragraph-center:before { + content: "\ea78"; +} +.w-e-icon-paragraph-right:before { + content: "\ea79"; +} +.w-e-icon-terminal:before { + content: "\f120"; +} +.w-e-icon-page-break:before { + content: "\ea68"; +} +.w-e-icon-cancel-circle:before { + content: "\ea0d"; +} +.w-e-icon-font:before { + content: "\ea5c"; +} +.w-e-icon-text-heigh:before { + content: "\ea5f"; +} + +.w-e-toolbar { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + padding: 0 5px; + /* flex-wrap: wrap; */ + /* 单个菜单 */ +} +.w-e-toolbar .w-e-menu { + position: relative; + text-align: center; + padding: 5px 10px; + cursor: pointer; +} +.w-e-toolbar .w-e-menu i { + color: #999; +} +.w-e-toolbar .w-e-menu:hover i { + color: #333; +} +.w-e-toolbar .w-e-active i { + color: #1e88e5; +} +.w-e-toolbar .w-e-active:hover i { + color: #1e88e5; +} + +.w-e-text-container .w-e-panel-container { + position: absolute; + top: 0; + left: 50%; + border: 1px solid #ccc; + border-top: 0; + box-shadow: 1px 1px 2px #ccc; + color: #333; + background-color: #fff; + /* 为 emotion panel 定制的样式 */ + /* 上传图片的 panel 定制样式 */ +} +.w-e-text-container .w-e-panel-container .w-e-panel-close { + position: absolute; + right: 0; + top: 0; + padding: 5px; + margin: 2px 5px 0 0; + cursor: pointer; + color: #999; +} +.w-e-text-container .w-e-panel-container .w-e-panel-close:hover { + color: #333; +} +.w-e-text-container .w-e-panel-container .w-e-panel-tab-title { + list-style: none; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + font-size: 14px; + margin: 2px 10px 0 10px; + border-bottom: 1px solid #f1f1f1; +} +.w-e-text-container .w-e-panel-container .w-e-panel-tab-title .w-e-item { + padding: 3px 5px; + color: #999; + cursor: pointer; + margin: 0 3px; + position: relative; + top: 1px; +} +.w-e-text-container .w-e-panel-container .w-e-panel-tab-title .w-e-active { + color: #333; + border-bottom: 1px solid #333; + cursor: default; + font-weight: 700; +} +.w-e-text-container .w-e-panel-container .w-e-panel-tab-content { + padding: 10px 15px 10px 15px; + font-size: 16px; + /* 输入框的样式 */ + /* 按钮的样式 */ +} +.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input:focus, +.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea:focus, +.w-e-text-container .w-e-panel-container .w-e-panel-tab-content button:focus { + outline: none; +} +.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea { + width: 100%; + border: 1px solid #ccc; + padding: 5px; +} +.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea:focus { + border-color: #1e88e5; +} +.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text] { + border: none; + border-bottom: 1px solid #ccc; + font-size: 14px; + height: 20px; + color: #333; + text-align: left; +} +.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text].small { + width: 30px; + text-align: center; +} +.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text].block { + display: block; + width: 100%; + margin: 10px 0; +} +.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text]:focus { + border-bottom: 2px solid #1e88e5; +} +.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button { + font-size: 14px; + color: #1e88e5; + border: none; + padding: 5px 10px; + background-color: #fff; + cursor: pointer; + border-radius: 3px; +} +.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.left { + float: left; + margin-right: 10px; +} +.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.right { + float: right; + margin-left: 10px; +} +.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.gray { + color: #999; +} +.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.red { + color: #c24f4a; +} +.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button:hover { + background-color: #f1f1f1; +} +.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container:after { + content: ""; + display: table; + clear: both; +} +.w-e-text-container .w-e-panel-container .w-e-emoticon-container .w-e-item { + cursor: pointer; + font-size: 18px; + padding: 0 3px; + display: inline-block; + *display: inline; + *zoom: 1; +} +.w-e-text-container .w-e-panel-container .w-e-up-img-container { + text-align: center; +} +.w-e-text-container .w-e-panel-container .w-e-up-img-container .w-e-up-btn { + display: inline-block; + *display: inline; + *zoom: 1; + color: #999; + cursor: pointer; + font-size: 60px; + line-height: 1; +} +.w-e-text-container .w-e-panel-container .w-e-up-img-container .w-e-up-btn:hover { + color: #333; +} + +.w-e-text-container { + position: relative; +} +.w-e-text-container .w-e-progress { + position: absolute; + background-color: #1e88e5; + bottom: 0; + left: 0; + height: 1px; +} +.w-e-text { + padding: 0 10px; + overflow-y: scroll; +} +.w-e-text p, +.w-e-text h1, +.w-e-text h2, +.w-e-text h3, +.w-e-text h4, +.w-e-text h5, +.w-e-text table, +.w-e-text pre { + margin: 10px 0; + line-height: 1.5; +} +.w-e-text ul, +.w-e-text ol { + margin: 10px 0 10px 20px; +} +.w-e-text blockquote { + display: block; + border-left: 8px solid #d0e5f2; + padding: 5px 10px; + margin: 10px 0; + line-height: 1.4; + font-size: 100%; + background-color: #f1f1f1; +} +.w-e-text code { + display: inline-block; + *display: inline; + *zoom: 1; + background-color: #f1f1f1; + border-radius: 3px; + padding: 3px 5px; + margin: 0 3px; +} +.w-e-text pre code { + display: block; +} +.w-e-text table { + border-top: 1px solid #ccc; + border-left: 1px solid #ccc; +} +.w-e-text table td, +.w-e-text table th { + border-bottom: 1px solid #ccc; + border-right: 1px solid #ccc; + padding: 3px 5px; +} +.w-e-text table th { + border-bottom: 2px solid #ccc; + text-align: center; +} +.w-e-text:focus { + outline: none; +} +.w-e-text img { + cursor: pointer; +} +.w-e-text img:hover { + box-shadow: 0 0 5px #333; +} diff --git a/public/admin/js/lay-module/wangEditor/wangEditor.js b/public/admin/js/lay-module/wangEditor/wangEditor.js new file mode 100644 index 0000000..f597bb7 --- /dev/null +++ b/public/admin/js/lay-module/wangEditor/wangEditor.js @@ -0,0 +1,4678 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.wangEditor = factory()); +}(this, (function () { 'use strict'; + +/* + poly-fill +*/ + +var polyfill = function () { + + // Object.assign + if (typeof Object.assign != 'function') { + Object.assign = function (target, varArgs) { + // .length of function is 2 + if (target == null) { + // TypeError if undefined or null + throw new TypeError('Cannot convert undefined or null to object'); + } + + var to = Object(target); + + for (var index = 1; index < arguments.length; index++) { + var nextSource = arguments[index]; + + if (nextSource != null) { + // Skip over if undefined or null + for (var nextKey in nextSource) { + // Avoid bugs when hasOwnProperty is shadowed + if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) { + to[nextKey] = nextSource[nextKey]; + } + } + } + } + return to; + }; + } + + // IE 中兼容 Element.prototype.matches + if (!Element.prototype.matches) { + Element.prototype.matches = Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector || function (s) { + var matches = (this.document || this.ownerDocument).querySelectorAll(s), + i = matches.length; + while (--i >= 0 && matches.item(i) !== this) {} + return i > -1; + }; + } +}; + +/* + DOM 操作 API +*/ + +// 根据 html 代码片段创建 dom 对象 +function createElemByHTML(html) { + var div = void 0; + div = document.createElement('div'); + div.innerHTML = html; + return div.children; +} + +// 是否是 DOM List +function isDOMList(selector) { + if (!selector) { + return false; + } + if (selector instanceof HTMLCollection || selector instanceof NodeList) { + return true; + } + return false; +} + +// 封装 document.querySelectorAll +function querySelectorAll(selector) { + var result = document.querySelectorAll(selector); + if (isDOMList(result)) { + return result; + } else { + return [result]; + } +} + +// 记录所有的事件绑定 +var eventList = []; + +// 创建构造函数 +function DomElement(selector) { + if (!selector) { + return; + } + + // selector 本来就是 DomElement 对象,直接返回 + if (selector instanceof DomElement) { + return selector; + } + + this.selector = selector; + var nodeType = selector.nodeType; + + // 根据 selector 得出的结果(如 DOM,DOM List) + var selectorResult = []; + if (nodeType === 9) { + // document 节点 + selectorResult = [selector]; + } else if (nodeType === 1) { + // 单个 DOM 节点 + selectorResult = [selector]; + } else if (isDOMList(selector) || selector instanceof Array) { + // DOM List 或者数组 + selectorResult = selector; + } else if (typeof selector === 'string') { + // 字符串 + selector = selector.replace('/\n/mg', '').trim(); + if (selector.indexOf('<') === 0) { + // 如
    + selectorResult = createElemByHTML(selector); + } else { + // 如 #id .class + selectorResult = querySelectorAll(selector); + } + } + + var length = selectorResult.length; + if (!length) { + // 空数组 + return this; + } + + // 加入 DOM 节点 + var i = void 0; + for (i = 0; i < length; i++) { + this[i] = selectorResult[i]; + } + this.length = length; +} + +// 修改原型 +DomElement.prototype = { + constructor: DomElement, + + // 类数组,forEach + forEach: function forEach(fn) { + var i = void 0; + for (i = 0; i < this.length; i++) { + var elem = this[i]; + var result = fn.call(elem, elem, i); + if (result === false) { + break; + } + } + return this; + }, + + // clone + clone: function clone(deep) { + var cloneList = []; + this.forEach(function (elem) { + cloneList.push(elem.cloneNode(!!deep)); + }); + return $(cloneList); + }, + + // 获取第几个元素 + get: function get(index) { + var length = this.length; + if (index >= length) { + index = index % length; + } + return $(this[index]); + }, + + // 第一个 + first: function first() { + return this.get(0); + }, + + // 最后一个 + last: function last() { + var length = this.length; + return this.get(length - 1); + }, + + // 绑定事件 + on: function on(type, selector, fn) { + // selector 不为空,证明绑定事件要加代理 + if (!fn) { + fn = selector; + selector = null; + } + + // type 是否有多个 + var types = []; + types = type.split(/\s+/); + + return this.forEach(function (elem) { + types.forEach(function (type) { + if (!type) { + return; + } + + // 记录下,方便后面解绑 + eventList.push({ + elem: elem, + type: type, + fn: fn + }); + + if (!selector) { + // 无代理 + elem.addEventListener(type, fn); + return; + } + + // 有代理 + elem.addEventListener(type, function (e) { + var target = e.target; + if (target.matches(selector)) { + fn.call(target, e); + } + }); + }); + }); + }, + + // 取消事件绑定 + off: function off(type, fn) { + return this.forEach(function (elem) { + elem.removeEventListener(type, fn); + }); + }, + + // 获取/设置 属性 + attr: function attr(key, val) { + if (val == null) { + // 获取值 + return this[0].getAttribute(key); + } else { + // 设置值 + return this.forEach(function (elem) { + elem.setAttribute(key, val); + }); + } + }, + + // 添加 class + addClass: function addClass(className) { + if (!className) { + return this; + } + return this.forEach(function (elem) { + var arr = void 0; + if (elem.className) { + // 解析当前 className 转换为数组 + arr = elem.className.split(/\s/); + arr = arr.filter(function (item) { + return !!item.trim(); + }); + // 添加 class + if (arr.indexOf(className) < 0) { + arr.push(className); + } + // 修改 elem.class + elem.className = arr.join(' '); + } else { + elem.className = className; + } + }); + }, + + // 删除 class + removeClass: function removeClass(className) { + if (!className) { + return this; + } + return this.forEach(function (elem) { + var arr = void 0; + if (elem.className) { + // 解析当前 className 转换为数组 + arr = elem.className.split(/\s/); + arr = arr.filter(function (item) { + item = item.trim(); + // 删除 class + if (!item || item === className) { + return false; + } + return true; + }); + // 修改 elem.class + elem.className = arr.join(' '); + } + }); + }, + + // 修改 css + css: function css(key, val) { + var currentStyle = key + ':' + val + ';'; + return this.forEach(function (elem) { + var style = (elem.getAttribute('style') || '').trim(); + var styleArr = void 0, + resultArr = []; + if (style) { + // 将 style 按照 ; 拆分为数组 + styleArr = style.split(';'); + styleArr.forEach(function (item) { + // 对每项样式,按照 : 拆分为 key 和 value + var arr = item.split(':').map(function (i) { + return i.trim(); + }); + if (arr.length === 2) { + resultArr.push(arr[0] + ':' + arr[1]); + } + }); + // 替换或者新增 + resultArr = resultArr.map(function (item) { + if (item.indexOf(key) === 0) { + return currentStyle; + } else { + return item; + } + }); + if (resultArr.indexOf(currentStyle) < 0) { + resultArr.push(currentStyle); + } + // 结果 + elem.setAttribute('style', resultArr.join('; ')); + } else { + // style 无值 + elem.setAttribute('style', currentStyle); + } + }); + }, + + // 显示 + show: function show() { + return this.css('display', 'block'); + }, + + // 隐藏 + hide: function hide() { + return this.css('display', 'none'); + }, + + // 获取子节点 + children: function children() { + var elem = this[0]; + if (!elem) { + return null; + } + + return $(elem.children); + }, + + // 获取子节点(包括文本节点) + childNodes: function childNodes() { + var elem = this[0]; + if (!elem) { + return null; + } + + return $(elem.childNodes); + }, + + // 增加子节点 + append: function append($children) { + return this.forEach(function (elem) { + $children.forEach(function (child) { + elem.appendChild(child); + }); + }); + }, + + // 移除当前节点 + remove: function remove() { + return this.forEach(function (elem) { + if (elem.remove) { + elem.remove(); + } else { + var parent = elem.parentElement; + parent && parent.removeChild(elem); + } + }); + }, + + // 是否包含某个子节点 + isContain: function isContain($child) { + var elem = this[0]; + var child = $child[0]; + return elem.contains(child); + }, + + // 尺寸数据 + getSizeData: function getSizeData() { + var elem = this[0]; + return elem.getBoundingClientRect(); // 可得到 bottom height left right top width 的数据 + }, + + // 封装 nodeName + getNodeName: function getNodeName() { + var elem = this[0]; + return elem.nodeName; + }, + + // 从当前元素查找 + find: function find(selector) { + var elem = this[0]; + return $(elem.querySelectorAll(selector)); + }, + + // 获取当前元素的 text + text: function text(val) { + if (!val) { + // 获取 text + var elem = this[0]; + return elem.innerHTML.replace(/<.*?>/g, function () { + return ''; + }); + } else { + // 设置 text + return this.forEach(function (elem) { + elem.innerHTML = val; + }); + } + }, + + // 获取 html + html: function html(value) { + var elem = this[0]; + if (value == null) { + return elem.innerHTML; + } else { + elem.innerHTML = value; + return this; + } + }, + + // 获取 value + val: function val() { + var elem = this[0]; + return elem.value.trim(); + }, + + // focus + focus: function focus() { + return this.forEach(function (elem) { + elem.focus(); + }); + }, + + // parent + parent: function parent() { + var elem = this[0]; + return $(elem.parentElement); + }, + + // parentUntil 找到符合 selector 的父节点 + parentUntil: function parentUntil(selector, _currentElem) { + var results = document.querySelectorAll(selector); + var length = results.length; + if (!length) { + // 传入的 selector 无效 + return null; + } + + var elem = _currentElem || this[0]; + if (elem.nodeName === 'BODY') { + return null; + } + + var parent = elem.parentElement; + var i = void 0; + for (i = 0; i < length; i++) { + if (parent === results[i]) { + // 找到,并返回 + return $(parent); + } + } + + // 继续查找 + return this.parentUntil(selector, parent); + }, + + // 判断两个 elem 是否相等 + equal: function equal($elem) { + if ($elem.nodeType === 1) { + return this[0] === $elem; + } else { + return this[0] === $elem[0]; + } + }, + + // 将该元素插入到某个元素前面 + insertBefore: function insertBefore(selector) { + var $referenceNode = $(selector); + var referenceNode = $referenceNode[0]; + if (!referenceNode) { + return this; + } + return this.forEach(function (elem) { + var parent = referenceNode.parentNode; + parent.insertBefore(elem, referenceNode); + }); + }, + + // 将该元素插入到某个元素后面 + insertAfter: function insertAfter(selector) { + var $referenceNode = $(selector); + var referenceNode = $referenceNode[0]; + if (!referenceNode) { + return this; + } + return this.forEach(function (elem) { + var parent = referenceNode.parentNode; + if (parent.lastChild === referenceNode) { + // 最后一个元素 + parent.appendChild(elem); + } else { + // 不是最后一个元素 + parent.insertBefore(elem, referenceNode.nextSibling); + } + }); + } +}; + +// new 一个对象 +function $(selector) { + return new DomElement(selector); +} + +// 解绑所有事件,用于销毁编辑器 +$.offAll = function () { + eventList.forEach(function (item) { + var elem = item.elem; + var type = item.type; + var fn = item.fn; + // 解绑 + elem.removeEventListener(type, fn); + }); +}; + +/* + 配置信息 +*/ + +var config = { + + // 默认菜单配置 + menus: ['head', 'bold', 'fontSize', 'fontName', 'italic', 'underline', 'strikeThrough', 'foreColor', 'backColor', 'link', 'list', 'justify', 'quote', 'emoticon', 'image', 'table', 'video', 'code', 'undo', 'redo'], + + fontNames: ['宋体', '微软雅黑', 'Arial', 'Tahoma', 'Verdana'], + + colors: ['#000000', '#eeece0', '#1c487f', '#4d80bf', '#c24f4a', '#8baa4a', '#7b5ba1', '#46acc8', '#f9963b', '#ffffff'], + + // // 语言配置 + // lang: { + // '设置标题': 'title', + // '正文': 'p', + // '链接文字': 'link text', + // '链接': 'link', + // '插入': 'insert', + // '创建': 'init' + // }, + + // 表情 + emotions: [{ + // tab 的标题 + title: '默认', + // type -> 'emoji' / 'image' + type: 'image', + // content -> 数组 + content: [{ + alt: '[坏笑]', + src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/50/pcmoren_huaixiao_org.png' + }, { + alt: '[舔屏]', + src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/40/pcmoren_tian_org.png' + }, { + alt: '[污]', + src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/3c/pcmoren_wu_org.png' + }] + }, { + // tab 的标题 + title: '新浪', + // type -> 'emoji' / 'image' + type: 'image', + // content -> 数组 + content: [{ + src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/7a/shenshou_thumb.gif', + alt: '[草泥马]' + }, { + src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/60/horse2_thumb.gif', + alt: '[神马]' + }, { + src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/bc/fuyun_thumb.gif', + alt: '[浮云]' + }] + }, { + // tab 的标题 + title: 'emoji', + // type -> 'emoji' / 'image' + type: 'emoji', + // content -> 数组 + content: '😀 😃 😄 😁 😆 😅 😂 😊 😇 🙂 🙃 😉 😓 😪 😴 🙄 🤔 😬 🤐'.split(/\s/) + }], + + // 编辑区域的 z-index + zIndex: 10000, + + // 是否开启 debug 模式(debug 模式下错误会 throw error 形式抛出) + debug: false, + + // 插入链接时候的格式校验 + linkCheck: function linkCheck(text, link) { + // text 是插入的文字 + // link 是插入的链接 + return true; // 返回 true 即表示成功 + // return '校验失败' // 返回字符串即表示失败的提示信息 + }, + + // 插入网络图片的校验 + linkImgCheck: function linkImgCheck(src) { + // src 即图片的地址 + return true; // 返回 true 即表示成功 + // return '校验失败' // 返回字符串即表示失败的提示信息 + }, + + // 粘贴过滤样式,默认开启 + pasteFilterStyle: true, + + // 粘贴内容时,忽略图片。默认关闭 + pasteIgnoreImg: false, + + // 对粘贴的文字进行自定义处理,返回处理后的结果。编辑器会将处理后的结果粘贴到编辑区域中。 + // IE 暂时不支持 + pasteTextHandle: function pasteTextHandle(content) { + // content 即粘贴过来的内容(html 或 纯文本),可进行自定义处理然后返回 + return content; + }, + + // onchange 事件 + // onchange: function (html) { + // // html 即变化之后的内容 + // console.log(html) + // }, + + // 是否显示添加网络图片的 tab + showLinkImg: true, + + // 插入网络图片的回调 + linkImgCallback: function linkImgCallback(url) { + // console.log(url) // url 即插入图片的地址 + }, + + // 默认上传图片 max size: 5M + uploadImgMaxSize: 5 * 1024 * 1024, + + // 配置一次最多上传几个图片 + // uploadImgMaxLength: 5, + + // 上传图片,是否显示 base64 格式 + uploadImgShowBase64: false, + + // 上传图片,server 地址(如果有值,则 base64 格式的配置则失效) + // uploadImgServer: '/upload', + + // 自定义配置 filename + uploadFileName: '', + + // 上传图片的自定义参数 + uploadImgParams: { + // token: 'abcdef12345' + }, + + // 上传图片的自定义header + uploadImgHeaders: { + // 'Accept': 'text/x-json' + }, + + // 配置 XHR withCredentials + withCredentials: false, + + // 自定义上传图片超时时间 ms + uploadImgTimeout: 10000, + + // 上传图片 hook + uploadImgHooks: { + // customInsert: function (insertLinkImg, result, editor) { + // console.log('customInsert') + // // 图片上传并返回结果,自定义插入图片的事件,而不是编辑器自动插入图片 + // const data = result.data1 || [] + // data.forEach(link => { + // insertLinkImg(link) + // }) + // }, + before: function before(xhr, editor, files) { + // 图片上传之前触发 + + // 如果返回的结果是 {prevent: true, msg: 'xxxx'} 则表示用户放弃上传 + // return { + // prevent: true, + // msg: '放弃上传' + // } + }, + success: function success(xhr, editor, result) { + // 图片上传并返回结果,图片插入成功之后触发 + }, + fail: function fail(xhr, editor, result) { + // 图片上传并返回结果,但图片插入错误时触发 + }, + error: function error(xhr, editor) { + // 图片上传出错时触发 + }, + timeout: function timeout(xhr, editor) { + // 图片上传超时时触发 + } + }, + + // 是否上传七牛云,默认为 false + qiniu: false + +}; + +/* + 工具 +*/ + +// 和 UA 相关的属性 +var UA = { + _ua: navigator.userAgent, + + // 是否 webkit + isWebkit: function isWebkit() { + var reg = /webkit/i; + return reg.test(this._ua); + }, + + // 是否 IE + isIE: function isIE() { + return 'ActiveXObject' in window; + } +}; + +// 遍历对象 +function objForEach(obj, fn) { + var key = void 0, + result = void 0; + for (key in obj) { + if (obj.hasOwnProperty(key)) { + result = fn.call(obj, key, obj[key]); + if (result === false) { + break; + } + } + } +} + +// 遍历类数组 +function arrForEach(fakeArr, fn) { + var i = void 0, + item = void 0, + result = void 0; + var length = fakeArr.length || 0; + for (i = 0; i < length; i++) { + item = fakeArr[i]; + result = fn.call(fakeArr, item, i); + if (result === false) { + break; + } + } +} + +// 获取随机数 +function getRandom(prefix) { + return prefix + Math.random().toString().slice(2); +} + +// 替换 html 特殊字符 +function replaceHtmlSymbol(html) { + if (html == null) { + return ''; + } + return html.replace(//gm, '>').replace(/"/gm, '"').replace(/(\r\n|\r|\n)/g, '
    '); +} + +// 返回百分比的格式 + + +// 判断是不是 function +function isFunction(fn) { + return typeof fn === 'function'; +} + +/* + bold-menu +*/ +// 构造函数 +function Bold(editor) { + this.editor = editor; + this.$elem = $('
    \n \n
    '); + this.type = 'click'; + + // 当前是否 active 状态 + this._active = false; +} + +// 原型 +Bold.prototype = { + constructor: Bold, + + // 点击事件 + onClick: function onClick(e) { + // 点击菜单将触发这里 + + var editor = this.editor; + var isSeleEmpty = editor.selection.isSelectionEmpty(); + + if (isSeleEmpty) { + // 选区是空的,插入并选中一个“空白” + editor.selection.createEmptyRange(); + } + + // 执行 bold 命令 + editor.cmd.do('bold'); + + if (isSeleEmpty) { + // 需要将选取折叠起来 + editor.selection.collapseRange(); + editor.selection.restoreSelection(); + } + }, + + // 试图改变 active 状态 + tryChangeActive: function tryChangeActive(e) { + var editor = this.editor; + var $elem = this.$elem; + if (editor.cmd.queryCommandState('bold')) { + this._active = true; + $elem.addClass('w-e-active'); + } else { + this._active = false; + $elem.removeClass('w-e-active'); + } + } +}; + +/* + 替换多语言 + */ + +var replaceLang = function (editor, str) { + var langArgs = editor.config.langArgs || []; + var result = str; + + langArgs.forEach(function (item) { + var reg = item.reg; + var val = item.val; + + if (reg.test(result)) { + result = result.replace(reg, function () { + return val; + }); + } + }); + + return result; +}; + +/* + droplist +*/ +var _emptyFn = function _emptyFn() {}; + +// 构造函数 +function DropList(menu, opt) { + var _this = this; + + // droplist 所依附的菜单 + var editor = menu.editor; + this.menu = menu; + this.opt = opt; + // 容器 + var $container = $('
    '); + + // 标题 + var $title = opt.$title; + var titleHtml = void 0; + if ($title) { + // 替换多语言 + titleHtml = $title.html(); + titleHtml = replaceLang(editor, titleHtml); + $title.html(titleHtml); + + $title.addClass('w-e-dp-title'); + $container.append($title); + } + + var list = opt.list || []; + var type = opt.type || 'list'; // 'list' 列表形式(如“标题”菜单) / 'inline-block' 块状形式(如“颜色”菜单) + var onClick = opt.onClick || _emptyFn; + + // 加入 DOM 并绑定事件 + var $list = $('
      '); + $container.append($list); + list.forEach(function (item) { + var $elem = item.$elem; + + // 替换多语言 + var elemHtml = $elem.html(); + elemHtml = replaceLang(editor, elemHtml); + $elem.html(elemHtml); + + var value = item.value; + var $li = $('
    • '); + if ($elem) { + $li.append($elem); + $list.append($li); + $li.on('click', function (e) { + onClick(value); + + // 隐藏 + _this.hideTimeoutId = setTimeout(function () { + _this.hide(); + }, 0); + }); + } + }); + + // 绑定隐藏事件 + $container.on('mouseleave', function (e) { + _this.hideTimeoutId = setTimeout(function () { + _this.hide(); + }, 0); + }); + + // 记录属性 + this.$container = $container; + + // 基本属性 + this._rendered = false; + this._show = false; +} + +// 原型 +DropList.prototype = { + constructor: DropList, + + // 显示(插入DOM) + show: function show() { + if (this.hideTimeoutId) { + // 清除之前的定时隐藏 + clearTimeout(this.hideTimeoutId); + } + + var menu = this.menu; + var $menuELem = menu.$elem; + var $container = this.$container; + if (this._show) { + return; + } + if (this._rendered) { + // 显示 + $container.show(); + } else { + // 加入 DOM 之前先定位位置 + var menuHeight = $menuELem.getSizeData().height || 0; + var width = this.opt.width || 100; // 默认为 100 + $container.css('margin-top', menuHeight + 'px').css('width', width + 'px'); + + // 加入到 DOM + $menuELem.append($container); + this._rendered = true; + } + + // 修改属性 + this._show = true; + }, + + // 隐藏(移除DOM) + hide: function hide() { + if (this.showTimeoutId) { + // 清除之前的定时显示 + clearTimeout(this.showTimeoutId); + } + + var $container = this.$container; + if (!this._show) { + return; + } + // 隐藏并需改属性 + $container.hide(); + this._show = false; + } +}; + +/* + menu - header +*/ +// 构造函数 +function Head(editor) { + var _this = this; + + this.editor = editor; + this.$elem = $('
      '); + this.type = 'droplist'; + + // 当前是否 active 状态 + this._active = false; + + // 初始化 droplist + this.droplist = new DropList(this, { + width: 100, + $title: $('

      设置标题

      '), + type: 'list', // droplist 以列表形式展示 + list: [{ $elem: $('

      H1

      '), value: '

      ' }, { $elem: $('

      H2

      '), value: '

      ' }, { $elem: $('

      H3

      '), value: '

      ' }, { $elem: $('

      H4

      '), value: '

      ' }, { $elem: $('

      H5
      '), value: '
      ' }, { $elem: $('

      正文

      '), value: '

      ' }], + onClick: function onClick(value) { + // 注意 this 是指向当前的 Head 对象 + _this._command(value); + } + }); +} + +// 原型 +Head.prototype = { + constructor: Head, + + // 执行命令 + _command: function _command(value) { + var editor = this.editor; + + var $selectionElem = editor.selection.getSelectionContainerElem(); + if (editor.$textElem.equal($selectionElem)) { + // 不能选中多行来设置标题,否则会出现问题 + // 例如选中的是

      xxx

      yyy

      来设置标题,设置之后会成为

      xxx
      yyy

      不符合预期 + return; + } + + editor.cmd.do('formatBlock', value); + }, + + // 试图改变 active 状态 + tryChangeActive: function tryChangeActive(e) { + var editor = this.editor; + var $elem = this.$elem; + var reg = /^h/i; + var cmdValue = editor.cmd.queryCommandValue('formatBlock'); + if (reg.test(cmdValue)) { + this._active = true; + $elem.addClass('w-e-active'); + } else { + this._active = false; + $elem.removeClass('w-e-active'); + } + } +}; + +/* + menu - fontSize +*/ + +// 构造函数 +function FontSize(editor) { + var _this = this; + + this.editor = editor; + this.$elem = $('
      '); + this.type = 'droplist'; + + // 当前是否 active 状态 + this._active = false; + + // 初始化 droplist + this.droplist = new DropList(this, { + width: 160, + $title: $('

      字号

      '), + type: 'list', // droplist 以列表形式展示 + list: [{ $elem: $('x-small'), value: '1' }, { $elem: $('small'), value: '2' }, { $elem: $('normal'), value: '3' }, { $elem: $('large'), value: '4' }, { $elem: $('x-large'), value: '5' }, { $elem: $('xx-large'), value: '6' }], + onClick: function onClick(value) { + // 注意 this 是指向当前的 FontSize 对象 + _this._command(value); + } + }); +} + +// 原型 +FontSize.prototype = { + constructor: FontSize, + + // 执行命令 + _command: function _command(value) { + var editor = this.editor; + editor.cmd.do('fontSize', value); + } +}; + +/* + menu - fontName +*/ + +// 构造函数 +function FontName(editor) { + var _this = this; + + this.editor = editor; + this.$elem = $('
      '); + this.type = 'droplist'; + + // 当前是否 active 状态 + this._active = false; + + // 获取配置的字体 + var config = editor.config; + var fontNames = config.fontNames || []; + + // 初始化 droplist + this.droplist = new DropList(this, { + width: 100, + $title: $('

      字体

      '), + type: 'list', // droplist 以列表形式展示 + list: fontNames.map(function (fontName) { + return { $elem: $('' + fontName + ''), value: fontName }; + }), + onClick: function onClick(value) { + // 注意 this 是指向当前的 FontName 对象 + _this._command(value); + } + }); +} + +// 原型 +FontName.prototype = { + constructor: FontName, + + _command: function _command(value) { + var editor = this.editor; + editor.cmd.do('fontName', value); + } +}; + +/* + panel +*/ + +var emptyFn = function emptyFn() {}; + +// 记录已经显示 panel 的菜单 +var _isCreatedPanelMenus = []; + +// 构造函数 +function Panel(menu, opt) { + this.menu = menu; + this.opt = opt; +} + +// 原型 +Panel.prototype = { + constructor: Panel, + + // 显示(插入DOM) + show: function show() { + var _this = this; + + var menu = this.menu; + if (_isCreatedPanelMenus.indexOf(menu) >= 0) { + // 该菜单已经创建了 panel 不能再创建 + return; + } + + var editor = menu.editor; + var $body = $('body'); + var $textContainerElem = editor.$textContainerElem; + var opt = this.opt; + + // panel 的容器 + var $container = $('
      '); + var width = opt.width || 300; // 默认 300px + $container.css('width', width + 'px').css('margin-left', (0 - width) / 2 + 'px'); + + // 添加关闭按钮 + var $closeBtn = $(''); + $container.append($closeBtn); + $closeBtn.on('click', function () { + _this.hide(); + }); + + // 准备 tabs 容器 + var $tabTitleContainer = $('
        '); + var $tabContentContainer = $('
        '); + $container.append($tabTitleContainer).append($tabContentContainer); + + // 设置高度 + var height = opt.height; + if (height) { + $tabContentContainer.css('height', height + 'px').css('overflow-y', 'auto'); + } + + // tabs + var tabs = opt.tabs || []; + var tabTitleArr = []; + var tabContentArr = []; + tabs.forEach(function (tab, tabIndex) { + if (!tab) { + return; + } + var title = tab.title || ''; + var tpl = tab.tpl || ''; + + // 替换多语言 + title = replaceLang(editor, title); + tpl = replaceLang(editor, tpl); + + // 添加到 DOM + var $title = $('
      • ' + title + '
      • '); + $tabTitleContainer.append($title); + var $content = $(tpl); + $tabContentContainer.append($content); + + // 记录到内存 + $title._index = tabIndex; + tabTitleArr.push($title); + tabContentArr.push($content); + + // 设置 active 项 + if (tabIndex === 0) { + $title._active = true; + $title.addClass('w-e-active'); + } else { + $content.hide(); + } + + // 绑定 tab 的事件 + $title.on('click', function (e) { + if ($title._active) { + return; + } + // 隐藏所有的 tab + tabTitleArr.forEach(function ($title) { + $title._active = false; + $title.removeClass('w-e-active'); + }); + tabContentArr.forEach(function ($content) { + $content.hide(); + }); + + // 显示当前的 tab + $title._active = true; + $title.addClass('w-e-active'); + $content.show(); + }); + }); + + // 绑定关闭事件 + $container.on('click', function (e) { + // 点击时阻止冒泡 + e.stopPropagation(); + }); + $body.on('click', function (e) { + _this.hide(); + }); + + // 添加到 DOM + $textContainerElem.append($container); + + // 绑定 opt 的事件,只有添加到 DOM 之后才能绑定成功 + tabs.forEach(function (tab, index) { + if (!tab) { + return; + } + var events = tab.events || []; + events.forEach(function (event) { + var selector = event.selector; + var type = event.type; + var fn = event.fn || emptyFn; + var $content = tabContentArr[index]; + $content.find(selector).on(type, function (e) { + e.stopPropagation(); + var needToHide = fn(e); + // 执行完事件之后,是否要关闭 panel + if (needToHide) { + _this.hide(); + } + }); + }); + }); + + // focus 第一个 elem + var $inputs = $container.find('input[type=text],textarea'); + if ($inputs.length) { + $inputs.get(0).focus(); + } + + // 添加到属性 + this.$container = $container; + + // 隐藏其他 panel + this._hideOtherPanels(); + // 记录该 menu 已经创建了 panel + _isCreatedPanelMenus.push(menu); + }, + + // 隐藏(移除DOM) + hide: function hide() { + var menu = this.menu; + var $container = this.$container; + if ($container) { + $container.remove(); + } + + // 将该 menu 记录中移除 + _isCreatedPanelMenus = _isCreatedPanelMenus.filter(function (item) { + if (item === menu) { + return false; + } else { + return true; + } + }); + }, + + // 一个 panel 展示时,隐藏其他 panel + _hideOtherPanels: function _hideOtherPanels() { + if (!_isCreatedPanelMenus.length) { + return; + } + _isCreatedPanelMenus.forEach(function (menu) { + var panel = menu.panel || {}; + if (panel.hide) { + panel.hide(); + } + }); + } +}; + +/* + menu - link +*/ +// 构造函数 +function Link(editor) { + this.editor = editor; + this.$elem = $('
        '); + this.type = 'panel'; + + // 当前是否 active 状态 + this._active = false; +} + +// 原型 +Link.prototype = { + constructor: Link, + + // 点击事件 + onClick: function onClick(e) { + var editor = this.editor; + var $linkelem = void 0; + + if (this._active) { + // 当前选区在链接里面 + $linkelem = editor.selection.getSelectionContainerElem(); + if (!$linkelem) { + return; + } + // 将该元素都包含在选取之内,以便后面整体替换 + editor.selection.createRangeByElem($linkelem); + editor.selection.restoreSelection(); + // 显示 panel + this._createPanel($linkelem.text(), $linkelem.attr('href')); + } else { + // 当前选区不在链接里面 + if (editor.selection.isSelectionEmpty()) { + // 选区是空的,未选中内容 + this._createPanel('', ''); + } else { + // 选中内容了 + this._createPanel(editor.selection.getSelectionText(), ''); + } + } + }, + + // 创建 panel + _createPanel: function _createPanel(text, link) { + var _this = this; + + // panel 中需要用到的id + var inputLinkId = getRandom('input-link'); + var inputTextId = getRandom('input-text'); + var btnOkId = getRandom('btn-ok'); + var btnDelId = getRandom('btn-del'); + + // 是否显示“删除链接” + var delBtnDisplay = this._active ? 'inline-block' : 'none'; + + // 初始化并显示 panel + var panel = new Panel(this, { + width: 300, + // panel 中可包含多个 tab + tabs: [{ + // tab 的标题 + title: '链接', + // 模板 + tpl: '
        \n \n \n
        \n \n \n
        \n
        ', + // 事件绑定 + events: [ + // 插入链接 + { + selector: '#' + btnOkId, + type: 'click', + fn: function fn() { + // 执行插入链接 + var $link = $('#' + inputLinkId); + var $text = $('#' + inputTextId); + var link = $link.val(); + var text = $text.val(); + _this._insertLink(text, link); + + // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 + return true; + } + }, + // 删除链接 + { + selector: '#' + btnDelId, + type: 'click', + fn: function fn() { + // 执行删除链接 + _this._delLink(); + + // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 + return true; + } + }] + } // tab end + ] // tabs end + }); + + // 显示 panel + panel.show(); + + // 记录属性 + this.panel = panel; + }, + + // 删除当前链接 + _delLink: function _delLink() { + if (!this._active) { + return; + } + var editor = this.editor; + var $selectionELem = editor.selection.getSelectionContainerElem(); + if (!$selectionELem) { + return; + } + var selectionText = editor.selection.getSelectionText(); + editor.cmd.do('insertHTML', '' + selectionText + ''); + }, + + // 插入链接 + _insertLink: function _insertLink(text, link) { + var editor = this.editor; + var config = editor.config; + var linkCheck = config.linkCheck; + var checkResult = true; // 默认为 true + if (linkCheck && typeof linkCheck === 'function') { + checkResult = linkCheck(text, link); + } + if (checkResult === true) { + editor.cmd.do('insertHTML', '' + text + ''); + } else { + alert(checkResult); + } + }, + + // 试图改变 active 状态 + tryChangeActive: function tryChangeActive(e) { + var editor = this.editor; + var $elem = this.$elem; + var $selectionELem = editor.selection.getSelectionContainerElem(); + if (!$selectionELem) { + return; + } + if ($selectionELem.getNodeName() === 'A') { + this._active = true; + $elem.addClass('w-e-active'); + } else { + this._active = false; + $elem.removeClass('w-e-active'); + } + } +}; + +/* + italic-menu +*/ +// 构造函数 +function Italic(editor) { + this.editor = editor; + this.$elem = $('
        \n \n
        '); + this.type = 'click'; + + // 当前是否 active 状态 + this._active = false; +} + +// 原型 +Italic.prototype = { + constructor: Italic, + + // 点击事件 + onClick: function onClick(e) { + // 点击菜单将触发这里 + + var editor = this.editor; + var isSeleEmpty = editor.selection.isSelectionEmpty(); + + if (isSeleEmpty) { + // 选区是空的,插入并选中一个“空白” + editor.selection.createEmptyRange(); + } + + // 执行 italic 命令 + editor.cmd.do('italic'); + + if (isSeleEmpty) { + // 需要将选取折叠起来 + editor.selection.collapseRange(); + editor.selection.restoreSelection(); + } + }, + + // 试图改变 active 状态 + tryChangeActive: function tryChangeActive(e) { + var editor = this.editor; + var $elem = this.$elem; + if (editor.cmd.queryCommandState('italic')) { + this._active = true; + $elem.addClass('w-e-active'); + } else { + this._active = false; + $elem.removeClass('w-e-active'); + } + } +}; + +/* + redo-menu +*/ +// 构造函数 +function Redo(editor) { + this.editor = editor; + this.$elem = $('
        \n \n
        '); + this.type = 'click'; + + // 当前是否 active 状态 + this._active = false; +} + +// 原型 +Redo.prototype = { + constructor: Redo, + + // 点击事件 + onClick: function onClick(e) { + // 点击菜单将触发这里 + + var editor = this.editor; + + // 执行 redo 命令 + editor.cmd.do('redo'); + } +}; + +/* + strikeThrough-menu +*/ +// 构造函数 +function StrikeThrough(editor) { + this.editor = editor; + this.$elem = $('
        \n \n
        '); + this.type = 'click'; + + // 当前是否 active 状态 + this._active = false; +} + +// 原型 +StrikeThrough.prototype = { + constructor: StrikeThrough, + + // 点击事件 + onClick: function onClick(e) { + // 点击菜单将触发这里 + + var editor = this.editor; + var isSeleEmpty = editor.selection.isSelectionEmpty(); + + if (isSeleEmpty) { + // 选区是空的,插入并选中一个“空白” + editor.selection.createEmptyRange(); + } + + // 执行 strikeThrough 命令 + editor.cmd.do('strikeThrough'); + + if (isSeleEmpty) { + // 需要将选取折叠起来 + editor.selection.collapseRange(); + editor.selection.restoreSelection(); + } + }, + + // 试图改变 active 状态 + tryChangeActive: function tryChangeActive(e) { + var editor = this.editor; + var $elem = this.$elem; + if (editor.cmd.queryCommandState('strikeThrough')) { + this._active = true; + $elem.addClass('w-e-active'); + } else { + this._active = false; + $elem.removeClass('w-e-active'); + } + } +}; + +/* + underline-menu +*/ +// 构造函数 +function Underline(editor) { + this.editor = editor; + this.$elem = $('
        \n \n
        '); + this.type = 'click'; + + // 当前是否 active 状态 + this._active = false; +} + +// 原型 +Underline.prototype = { + constructor: Underline, + + // 点击事件 + onClick: function onClick(e) { + // 点击菜单将触发这里 + + var editor = this.editor; + var isSeleEmpty = editor.selection.isSelectionEmpty(); + + if (isSeleEmpty) { + // 选区是空的,插入并选中一个“空白” + editor.selection.createEmptyRange(); + } + + // 执行 underline 命令 + editor.cmd.do('underline'); + + if (isSeleEmpty) { + // 需要将选取折叠起来 + editor.selection.collapseRange(); + editor.selection.restoreSelection(); + } + }, + + // 试图改变 active 状态 + tryChangeActive: function tryChangeActive(e) { + var editor = this.editor; + var $elem = this.$elem; + if (editor.cmd.queryCommandState('underline')) { + this._active = true; + $elem.addClass('w-e-active'); + } else { + this._active = false; + $elem.removeClass('w-e-active'); + } + } +}; + +/* + undo-menu +*/ +// 构造函数 +function Undo(editor) { + this.editor = editor; + this.$elem = $('
        \n \n
        '); + this.type = 'click'; + + // 当前是否 active 状态 + this._active = false; +} + +// 原型 +Undo.prototype = { + constructor: Undo, + + // 点击事件 + onClick: function onClick(e) { + // 点击菜单将触发这里 + + var editor = this.editor; + + // 执行 undo 命令 + editor.cmd.do('undo'); + } +}; + +/* + menu - list +*/ +// 构造函数 +function List(editor) { + var _this = this; + + this.editor = editor; + this.$elem = $('
        '); + this.type = 'droplist'; + + // 当前是否 active 状态 + this._active = false; + + // 初始化 droplist + this.droplist = new DropList(this, { + width: 120, + $title: $('

        设置列表

        '), + type: 'list', // droplist 以列表形式展示 + list: [{ $elem: $(' 有序列表'), value: 'insertOrderedList' }, { $elem: $(' 无序列表'), value: 'insertUnorderedList' }], + onClick: function onClick(value) { + // 注意 this 是指向当前的 List 对象 + _this._command(value); + } + }); +} + +// 原型 +List.prototype = { + constructor: List, + + // 执行命令 + _command: function _command(value) { + var editor = this.editor; + var $textElem = editor.$textElem; + editor.selection.restoreSelection(); + if (editor.cmd.queryCommandState(value)) { + return; + } + editor.cmd.do(value); + + // 验证列表是否被包裹在

        之内 + var $selectionElem = editor.selection.getSelectionContainerElem(); + if ($selectionElem.getNodeName() === 'LI') { + $selectionElem = $selectionElem.parent(); + } + if (/^ol|ul$/i.test($selectionElem.getNodeName()) === false) { + return; + } + if ($selectionElem.equal($textElem)) { + // 证明是顶级标签,没有被

        包裹 + return; + } + var $parent = $selectionElem.parent(); + if ($parent.equal($textElem)) { + // $parent 是顶级标签,不能删除 + return; + } + + $selectionElem.insertAfter($parent); + $parent.remove(); + }, + + // 试图改变 active 状态 + tryChangeActive: function tryChangeActive(e) { + var editor = this.editor; + var $elem = this.$elem; + if (editor.cmd.queryCommandState('insertUnOrderedList') || editor.cmd.queryCommandState('insertOrderedList')) { + this._active = true; + $elem.addClass('w-e-active'); + } else { + this._active = false; + $elem.removeClass('w-e-active'); + } + } +}; + +/* + menu - justify +*/ +// 构造函数 +function Justify(editor) { + var _this = this; + + this.editor = editor; + this.$elem = $('

        '); + this.type = 'droplist'; + + // 当前是否 active 状态 + this._active = false; + + // 初始化 droplist + this.droplist = new DropList(this, { + width: 100, + $title: $('

        对齐方式

        '), + type: 'list', // droplist 以列表形式展示 + list: [{ $elem: $(' 靠左'), value: 'justifyLeft' }, { $elem: $(' 居中'), value: 'justifyCenter' }, { $elem: $(' 靠右'), value: 'justifyRight' }], + onClick: function onClick(value) { + // 注意 this 是指向当前的 List 对象 + _this._command(value); + } + }); +} + +// 原型 +Justify.prototype = { + constructor: Justify, + + // 执行命令 + _command: function _command(value) { + var editor = this.editor; + editor.cmd.do(value); + } +}; + +/* + menu - Forecolor +*/ +// 构造函数 +function ForeColor(editor) { + var _this = this; + + this.editor = editor; + this.$elem = $('
        '); + this.type = 'droplist'; + + // 获取配置的颜色 + var config = editor.config; + var colors = config.colors || []; + + // 当前是否 active 状态 + this._active = false; + + // 初始化 droplist + this.droplist = new DropList(this, { + width: 120, + $title: $('

        文字颜色

        '), + type: 'inline-block', // droplist 内容以 block 形式展示 + list: colors.map(function (color) { + return { $elem: $(''), value: color }; + }), + onClick: function onClick(value) { + // 注意 this 是指向当前的 ForeColor 对象 + _this._command(value); + } + }); +} + +// 原型 +ForeColor.prototype = { + constructor: ForeColor, + + // 执行命令 + _command: function _command(value) { + var editor = this.editor; + editor.cmd.do('foreColor', value); + } +}; + +/* + menu - BackColor +*/ +// 构造函数 +function BackColor(editor) { + var _this = this; + + this.editor = editor; + this.$elem = $('
        '); + this.type = 'droplist'; + + // 获取配置的颜色 + var config = editor.config; + var colors = config.colors || []; + + // 当前是否 active 状态 + this._active = false; + + // 初始化 droplist + this.droplist = new DropList(this, { + width: 120, + $title: $('

        背景色

        '), + type: 'inline-block', // droplist 内容以 block 形式展示 + list: colors.map(function (color) { + return { $elem: $(''), value: color }; + }), + onClick: function onClick(value) { + // 注意 this 是指向当前的 BackColor 对象 + _this._command(value); + } + }); +} + +// 原型 +BackColor.prototype = { + constructor: BackColor, + + // 执行命令 + _command: function _command(value) { + var editor = this.editor; + editor.cmd.do('backColor', value); + } +}; + +/* + menu - quote +*/ +// 构造函数 +function Quote(editor) { + this.editor = editor; + this.$elem = $('
        \n \n
        '); + this.type = 'click'; + + // 当前是否 active 状态 + this._active = false; +} + +// 原型 +Quote.prototype = { + constructor: Quote, + + onClick: function onClick(e) { + var editor = this.editor; + var $selectionElem = editor.selection.getSelectionContainerElem(); + var nodeName = $selectionElem.getNodeName(); + + if (!UA.isIE()) { + if (nodeName === 'BLOCKQUOTE') { + // 撤销 quote + editor.cmd.do('formatBlock', '

        '); + } else { + // 转换为 quote + editor.cmd.do('formatBlock', '

        '); + } + return; + } + + // IE 中不支持 formatBlock
        ,要用其他方式兼容 + var content = void 0, + $targetELem = void 0; + if (nodeName === 'P') { + // 将 P 转换为 quote + content = $selectionElem.text(); + $targetELem = $('
        ' + content + '
        '); + $targetELem.insertAfter($selectionElem); + $selectionElem.remove(); + return; + } + if (nodeName === 'BLOCKQUOTE') { + // 撤销 quote + content = $selectionElem.text(); + $targetELem = $('

        ' + content + '

        '); + $targetELem.insertAfter($selectionElem); + $selectionElem.remove(); + } + }, + + tryChangeActive: function tryChangeActive(e) { + var editor = this.editor; + var $elem = this.$elem; + var reg = /^BLOCKQUOTE$/i; + var cmdValue = editor.cmd.queryCommandValue('formatBlock'); + if (reg.test(cmdValue)) { + this._active = true; + $elem.addClass('w-e-active'); + } else { + this._active = false; + $elem.removeClass('w-e-active'); + } + } +}; + +/* + menu - code +*/ +// 构造函数 +function Code(editor) { + this.editor = editor; + this.$elem = $('
        \n \n
        '); + this.type = 'panel'; + + // 当前是否 active 状态 + this._active = false; +} + +// 原型 +Code.prototype = { + constructor: Code, + + onClick: function onClick(e) { + var editor = this.editor; + var $startElem = editor.selection.getSelectionStartElem(); + var $endElem = editor.selection.getSelectionEndElem(); + var isSeleEmpty = editor.selection.isSelectionEmpty(); + var selectionText = editor.selection.getSelectionText(); + var $code = void 0; + + if (!$startElem.equal($endElem)) { + // 跨元素选择,不做处理 + editor.selection.restoreSelection(); + return; + } + if (!isSeleEmpty) { + // 选取不是空,用 包裹即可 + $code = $('' + selectionText + ''); + editor.cmd.do('insertElem', $code); + editor.selection.createRangeByElem($code, false); + editor.selection.restoreSelection(); + return; + } + + // 选取是空,且没有夸元素选择,则插入
        
        +        if (this._active) {
        +            // 选中状态,将编辑内容
        +            this._createPanel($startElem.html());
        +        } else {
        +            // 未选中状态,将创建内容
        +            this._createPanel();
        +        }
        +    },
        +
        +    _createPanel: function _createPanel(value) {
        +        var _this = this;
        +
        +        // value - 要编辑的内容
        +        value = value || '';
        +        var type = !value ? 'new' : 'edit';
        +        var textId = getRandom('texxt');
        +        var btnId = getRandom('btn');
        +
        +        var panel = new Panel(this, {
        +            width: 500,
        +            // 一个 Panel 包含多个 tab
        +            tabs: [{
        +                // 标题
        +                title: '插入代码',
        +                // 模板
        +                tpl: '
        \n \n
        \n \n
        \n
        ', + // 事件绑定 + events: [ + // 插入代码 + { + selector: '#' + btnId, + type: 'click', + fn: function fn() { + var $text = $('#' + textId); + var text = $text.val() || $text.html(); + text = replaceHtmlSymbol(text); + if (type === 'new') { + // 新插入 + _this._insertCode(text); + } else { + // 编辑更新 + _this._updateCode(text); + } + + // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 + return true; + } + }] + } // first tab end + ] // tabs end + }); // new Panel end + + // 显示 panel + panel.show(); + + // 记录属性 + this.panel = panel; + }, + + // 插入代码 + _insertCode: function _insertCode(value) { + var editor = this.editor; + editor.cmd.do('insertHTML', '
        ' + value + '


        '); + }, + + // 更新代码 + _updateCode: function _updateCode(value) { + var editor = this.editor; + var $selectionELem = editor.selection.getSelectionContainerElem(); + if (!$selectionELem) { + return; + } + $selectionELem.html(value); + editor.selection.restoreSelection(); + }, + + // 试图改变 active 状态 + tryChangeActive: function tryChangeActive(e) { + var editor = this.editor; + var $elem = this.$elem; + var $selectionELem = editor.selection.getSelectionContainerElem(); + if (!$selectionELem) { + return; + } + var $parentElem = $selectionELem.parent(); + if ($selectionELem.getNodeName() === 'CODE' && $parentElem.getNodeName() === 'PRE') { + this._active = true; + $elem.addClass('w-e-active'); + } else { + this._active = false; + $elem.removeClass('w-e-active'); + } + } +}; + +/* + menu - emoticon +*/ +// 构造函数 +function Emoticon(editor) { + this.editor = editor; + this.$elem = $('
        \n \n
        '); + this.type = 'panel'; + + // 当前是否 active 状态 + this._active = false; +} + +// 原型 +Emoticon.prototype = { + constructor: Emoticon, + + onClick: function onClick() { + this._createPanel(); + }, + + _createPanel: function _createPanel() { + var _this = this; + + var editor = this.editor; + var config = editor.config; + // 获取表情配置 + var emotions = config.emotions || []; + + // 创建表情 dropPanel 的配置 + var tabConfig = []; + emotions.forEach(function (emotData) { + var emotType = emotData.type; + var content = emotData.content || []; + + // 这一组表情最终拼接出来的 html + var faceHtml = ''; + + // emoji 表情 + if (emotType === 'emoji') { + content.forEach(function (item) { + if (item) { + faceHtml += '' + item + ''; + } + }); + } + // 图片表情 + if (emotType === 'image') { + content.forEach(function (item) { + var src = item.src; + var alt = item.alt; + if (src) { + // 加一个 data-w-e 属性,点击图片的时候不再提示编辑图片 + faceHtml += '' + alt + ''; + } + }); + } + + tabConfig.push({ + title: emotData.title, + tpl: '
        ' + faceHtml + '
        ', + events: [{ + selector: 'span.w-e-item', + type: 'click', + fn: function fn(e) { + var target = e.target; + var $target = $(target); + var nodeName = $target.getNodeName(); + + var insertHtml = void 0; + if (nodeName === 'IMG') { + // 插入图片 + insertHtml = $target.parent().html(); + } else { + // 插入 emoji + insertHtml = '' + $target.html() + ''; + } + + _this._insert(insertHtml); + // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 + return true; + } + }] + }); + }); + + var panel = new Panel(this, { + width: 300, + height: 200, + // 一个 Panel 包含多个 tab + tabs: tabConfig + }); + + // 显示 panel + panel.show(); + + // 记录属性 + this.panel = panel; + }, + + // 插入表情 + _insert: function _insert(emotHtml) { + var editor = this.editor; + editor.cmd.do('insertHTML', emotHtml); + } +}; + +/* + menu - table +*/ +// 构造函数 +function Table(editor) { + this.editor = editor; + this.$elem = $('
        '); + this.type = 'panel'; + + // 当前是否 active 状态 + this._active = false; +} + +// 原型 +Table.prototype = { + constructor: Table, + + onClick: function onClick() { + if (this._active) { + // 编辑现有表格 + this._createEditPanel(); + } else { + // 插入新表格 + this._createInsertPanel(); + } + }, + + // 创建插入新表格的 panel + _createInsertPanel: function _createInsertPanel() { + var _this = this; + + // 用到的 id + var btnInsertId = getRandom('btn'); + var textRowNum = getRandom('row'); + var textColNum = getRandom('col'); + + var panel = new Panel(this, { + width: 250, + // panel 包含多个 tab + tabs: [{ + // 标题 + title: '插入表格', + // 模板 + tpl: '
        \n

        \n \u521B\u5EFA\n \n \u884C\n \n \u5217\u7684\u8868\u683C\n

        \n
        \n \n
        \n
        ', + // 事件绑定 + events: [{ + // 点击按钮,插入表格 + selector: '#' + btnInsertId, + type: 'click', + fn: function fn() { + var rowNum = parseInt($('#' + textRowNum).val()); + var colNum = parseInt($('#' + textColNum).val()); + + if (rowNum && colNum && rowNum > 0 && colNum > 0) { + // form 数据有效 + _this._insert(rowNum, colNum); + } + + // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 + return true; + } + }] + } // first tab end + ] // tabs end + }); // panel end + + // 展示 panel + panel.show(); + + // 记录属性 + this.panel = panel; + }, + + // 插入表格 + _insert: function _insert(rowNum, colNum) { + // 拼接 table 模板 + var r = void 0, + c = void 0; + var html = ''; + for (r = 0; r < rowNum; r++) { + html += ''; + if (r === 0) { + for (c = 0; c < colNum; c++) { + html += ''; + } + } else { + for (c = 0; c < colNum; c++) { + html += ''; + } + } + html += ''; + } + html += '
          


        '; + + // 执行命令 + var editor = this.editor; + editor.cmd.do('insertHTML', html); + + // 防止 firefox 下出现 resize 的控制点 + editor.cmd.do('enableObjectResizing', false); + editor.cmd.do('enableInlineTableEditing', false); + }, + + // 创建编辑表格的 panel + _createEditPanel: function _createEditPanel() { + var _this2 = this; + + // 可用的 id + var addRowBtnId = getRandom('add-row'); + var addColBtnId = getRandom('add-col'); + var delRowBtnId = getRandom('del-row'); + var delColBtnId = getRandom('del-col'); + var delTableBtnId = getRandom('del-table'); + + // 创建 panel 对象 + var panel = new Panel(this, { + width: 320, + // panel 包含多个 tab + tabs: [{ + // 标题 + title: '编辑表格', + // 模板 + tpl: '
        \n
        \n \n \n \n \n
        \n
        \n \n \n
        ', + // 事件绑定 + events: [{ + // 增加行 + selector: '#' + addRowBtnId, + type: 'click', + fn: function fn() { + _this2._addRow(); + // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 + return true; + } + }, { + // 增加列 + selector: '#' + addColBtnId, + type: 'click', + fn: function fn() { + _this2._addCol(); + // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 + return true; + } + }, { + // 删除行 + selector: '#' + delRowBtnId, + type: 'click', + fn: function fn() { + _this2._delRow(); + // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 + return true; + } + }, { + // 删除列 + selector: '#' + delColBtnId, + type: 'click', + fn: function fn() { + _this2._delCol(); + // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 + return true; + } + }, { + // 删除表格 + selector: '#' + delTableBtnId, + type: 'click', + fn: function fn() { + _this2._delTable(); + // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 + return true; + } + }] + }] + }); + // 显示 panel + panel.show(); + }, + + // 获取选中的单元格的位置信息 + _getLocationData: function _getLocationData() { + var result = {}; + var editor = this.editor; + var $selectionELem = editor.selection.getSelectionContainerElem(); + if (!$selectionELem) { + return; + } + var nodeName = $selectionELem.getNodeName(); + if (nodeName !== 'TD' && nodeName !== 'TH') { + return; + } + + // 获取 td index + var $tr = $selectionELem.parent(); + var $tds = $tr.children(); + var tdLength = $tds.length; + $tds.forEach(function (td, index) { + if (td === $selectionELem[0]) { + // 记录并跳出循环 + result.td = { + index: index, + elem: td, + length: tdLength + }; + return false; + } + }); + + // 获取 tr index + var $tbody = $tr.parent(); + var $trs = $tbody.children(); + var trLength = $trs.length; + $trs.forEach(function (tr, index) { + if (tr === $tr[0]) { + // 记录并跳出循环 + result.tr = { + index: index, + elem: tr, + length: trLength + }; + return false; + } + }); + + // 返回结果 + return result; + }, + + // 增加行 + _addRow: function _addRow() { + // 获取当前单元格的位置信息 + var locationData = this._getLocationData(); + if (!locationData) { + return; + } + var trData = locationData.tr; + var $currentTr = $(trData.elem); + var tdData = locationData.td; + var tdLength = tdData.length; + + // 拼接即将插入的字符串 + var newTr = document.createElement('tr'); + var tpl = '', + i = void 0; + for (i = 0; i < tdLength; i++) { + tpl += ' '; + } + newTr.innerHTML = tpl; + // 插入 + $(newTr).insertAfter($currentTr); + }, + + // 增加列 + _addCol: function _addCol() { + // 获取当前单元格的位置信息 + var locationData = this._getLocationData(); + if (!locationData) { + return; + } + var trData = locationData.tr; + var tdData = locationData.td; + var tdIndex = tdData.index; + var $currentTr = $(trData.elem); + var $trParent = $currentTr.parent(); + var $trs = $trParent.children(); + + // 遍历所有行 + $trs.forEach(function (tr) { + var $tr = $(tr); + var $tds = $tr.children(); + var $currentTd = $tds.get(tdIndex); + var name = $currentTd.getNodeName().toLowerCase(); + + // new 一个 td,并插入 + var newTd = document.createElement(name); + $(newTd).insertAfter($currentTd); + }); + }, + + // 删除行 + _delRow: function _delRow() { + // 获取当前单元格的位置信息 + var locationData = this._getLocationData(); + if (!locationData) { + return; + } + var trData = locationData.tr; + var $currentTr = $(trData.elem); + $currentTr.remove(); + }, + + // 删除列 + _delCol: function _delCol() { + // 获取当前单元格的位置信息 + var locationData = this._getLocationData(); + if (!locationData) { + return; + } + var trData = locationData.tr; + var tdData = locationData.td; + var tdIndex = tdData.index; + var $currentTr = $(trData.elem); + var $trParent = $currentTr.parent(); + var $trs = $trParent.children(); + + // 遍历所有行 + $trs.forEach(function (tr) { + var $tr = $(tr); + var $tds = $tr.children(); + var $currentTd = $tds.get(tdIndex); + // 删除 + $currentTd.remove(); + }); + }, + + // 删除表格 + _delTable: function _delTable() { + var editor = this.editor; + var $selectionELem = editor.selection.getSelectionContainerElem(); + if (!$selectionELem) { + return; + } + var $table = $selectionELem.parentUntil('table'); + if (!$table) { + return; + } + $table.remove(); + }, + + // 试图改变 active 状态 + tryChangeActive: function tryChangeActive(e) { + var editor = this.editor; + var $elem = this.$elem; + var $selectionELem = editor.selection.getSelectionContainerElem(); + if (!$selectionELem) { + return; + } + var nodeName = $selectionELem.getNodeName(); + if (nodeName === 'TD' || nodeName === 'TH') { + this._active = true; + $elem.addClass('w-e-active'); + } else { + this._active = false; + $elem.removeClass('w-e-active'); + } + } +}; + +/* + menu - video +*/ +// 构造函数 +function Video(editor) { + this.editor = editor; + this.$elem = $('
        '); + this.type = 'panel'; + + // 当前是否 active 状态 + this._active = false; +} + +// 原型 +Video.prototype = { + constructor: Video, + + onClick: function onClick() { + this._createPanel(); + }, + + _createPanel: function _createPanel() { + var _this = this; + + // 创建 id + var textValId = getRandom('text-val'); + var btnId = getRandom('btn'); + + // 创建 panel + var panel = new Panel(this, { + width: 350, + // 一个 panel 多个 tab + tabs: [{ + // 标题 + title: '插入视频', + // 模板 + tpl: '
        \n \n
        \n \n
        \n
        ', + // 事件绑定 + events: [{ + selector: '#' + btnId, + type: 'click', + fn: function fn() { + var $text = $('#' + textValId); + var val = $text.val().trim(); + + // 测试用视频地址 + // + + if (val) { + // 插入视频 + _this._insert(val); + } + + // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 + return true; + } + }] + } // first tab end + ] // tabs end + }); // panel end + + // 显示 panel + panel.show(); + + // 记录属性 + this.panel = panel; + }, + + // 插入视频 + _insert: function _insert(val) { + var editor = this.editor; + editor.cmd.do('insertHTML', val + '


        '); + } +}; + +/* + menu - img +*/ +// 构造函数 +function Image(editor) { + this.editor = editor; + var imgMenuId = getRandom('w-e-img'); + this.$elem = $('
        '); + editor.imgMenuId = imgMenuId; + this.type = 'panel'; + + // 当前是否 active 状态 + this._active = false; +} + +// 原型 +Image.prototype = { + constructor: Image, + + onClick: function onClick() { + var editor = this.editor; + var config = editor.config; + if (config.qiniu) { + return; + } + if (this._active) { + this._createEditPanel(); + } else { + this._createInsertPanel(); + } + }, + + _createEditPanel: function _createEditPanel() { + var editor = this.editor; + + // id + var width30 = getRandom('width-30'); + var width50 = getRandom('width-50'); + var width100 = getRandom('width-100'); + var delBtn = getRandom('del-btn'); + + // tab 配置 + var tabsConfig = [{ + title: '编辑图片', + tpl: '
        \n
        \n \u6700\u5927\u5BBD\u5EA6\uFF1A\n \n \n \n
        \n
        \n \n \n
        ', + events: [{ + selector: '#' + width30, + type: 'click', + fn: function fn() { + var $img = editor._selectedImg; + if ($img) { + $img.css('max-width', '30%'); + } + // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 + return true; + } + }, { + selector: '#' + width50, + type: 'click', + fn: function fn() { + var $img = editor._selectedImg; + if ($img) { + $img.css('max-width', '50%'); + } + // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 + return true; + } + }, { + selector: '#' + width100, + type: 'click', + fn: function fn() { + var $img = editor._selectedImg; + if ($img) { + $img.css('max-width', '100%'); + } + // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 + return true; + } + }, { + selector: '#' + delBtn, + type: 'click', + fn: function fn() { + var $img = editor._selectedImg; + if ($img) { + $img.remove(); + } + // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 + return true; + } + }] + }]; + + // 创建 panel 并显示 + var panel = new Panel(this, { + width: 300, + tabs: tabsConfig + }); + panel.show(); + + // 记录属性 + this.panel = panel; + }, + + _createInsertPanel: function _createInsertPanel() { + var editor = this.editor; + var uploadImg = editor.uploadImg; + var config = editor.config; + + // id + var upTriggerId = getRandom('up-trigger'); + var upFileId = getRandom('up-file'); + var linkUrlId = getRandom('link-url'); + var linkBtnId = getRandom('link-btn'); + + // tabs 的配置 + var tabsConfig = [{ + title: '上传图片', + tpl: '
        \n
        \n \n
        \n
        \n \n
        \n
        ', + events: [{ + // 触发选择图片 + selector: '#' + upTriggerId, + type: 'click', + fn: function fn() { + var $file = $('#' + upFileId); + var fileElem = $file[0]; + if (fileElem) { + fileElem.click(); + } else { + // 返回 true 可关闭 panel + return true; + } + } + }, { + // 选择图片完毕 + selector: '#' + upFileId, + type: 'change', + fn: function fn() { + var $file = $('#' + upFileId); + var fileElem = $file[0]; + if (!fileElem) { + // 返回 true 可关闭 panel + return true; + } + + // 获取选中的 file 对象列表 + var fileList = fileElem.files; + if (fileList.length) { + uploadImg.uploadImg(fileList); + } + + // 返回 true 可关闭 panel + return true; + } + }] + }, // first tab end + { + title: '网络图片', + tpl: '
        \n \n
        \n \n
        \n
        ', + events: [{ + selector: '#' + linkBtnId, + type: 'click', + fn: function fn() { + var $linkUrl = $('#' + linkUrlId); + var url = $linkUrl.val().trim(); + + if (url) { + uploadImg.insertLinkImg(url); + } + + // 返回 true 表示函数执行结束之后关闭 panel + return true; + } + }] + } // second tab end + ]; // tabs end + + // 判断 tabs 的显示 + var tabsConfigResult = []; + if ((config.uploadImgShowBase64 || config.uploadImgServer || config.customUploadImg) && window.FileReader) { + // 显示“上传图片” + tabsConfigResult.push(tabsConfig[0]); + } + if (config.showLinkImg) { + // 显示“网络图片” + tabsConfigResult.push(tabsConfig[1]); + } + + // 创建 panel 并显示 + var panel = new Panel(this, { + width: 300, + tabs: tabsConfigResult + }); + panel.show(); + + // 记录属性 + this.panel = panel; + }, + + // 试图改变 active 状态 + tryChangeActive: function tryChangeActive(e) { + var editor = this.editor; + var $elem = this.$elem; + if (editor._selectedImg) { + this._active = true; + $elem.addClass('w-e-active'); + } else { + this._active = false; + $elem.removeClass('w-e-active'); + } + } +}; + +/* + 所有菜单的汇总 +*/ + +// 存储菜单的构造函数 +var MenuConstructors = {}; + +MenuConstructors.bold = Bold; + +MenuConstructors.head = Head; + +MenuConstructors.fontSize = FontSize; + +MenuConstructors.fontName = FontName; + +MenuConstructors.link = Link; + +MenuConstructors.italic = Italic; + +MenuConstructors.redo = Redo; + +MenuConstructors.strikeThrough = StrikeThrough; + +MenuConstructors.underline = Underline; + +MenuConstructors.undo = Undo; + +MenuConstructors.list = List; + +MenuConstructors.justify = Justify; + +MenuConstructors.foreColor = ForeColor; + +MenuConstructors.backColor = BackColor; + +MenuConstructors.quote = Quote; + +MenuConstructors.code = Code; + +MenuConstructors.emoticon = Emoticon; + +MenuConstructors.table = Table; + +MenuConstructors.video = Video; + +MenuConstructors.image = Image; + +/* + 菜单集合 +*/ +// 构造函数 +function Menus(editor) { + this.editor = editor; + this.menus = {}; +} + +// 修改原型 +Menus.prototype = { + constructor: Menus, + + // 初始化菜单 + init: function init() { + var _this = this; + + var editor = this.editor; + var config = editor.config || {}; + var configMenus = config.menus || []; // 获取配置中的菜单 + + // 根据配置信息,创建菜单 + configMenus.forEach(function (menuKey) { + var MenuConstructor = MenuConstructors[menuKey]; + if (MenuConstructor && typeof MenuConstructor === 'function') { + // 创建单个菜单 + _this.menus[menuKey] = new MenuConstructor(editor); + } + }); + + // 添加到菜单栏 + this._addToToolbar(); + + // 绑定事件 + this._bindEvent(); + }, + + // 添加到菜单栏 + _addToToolbar: function _addToToolbar() { + var editor = this.editor; + var $toolbarElem = editor.$toolbarElem; + var menus = this.menus; + var config = editor.config; + // config.zIndex 是配置的编辑区域的 z-index,菜单的 z-index 得在其基础上 +1 + var zIndex = config.zIndex + 1; + objForEach(menus, function (key, menu) { + var $elem = menu.$elem; + if ($elem) { + // 设置 z-index + $elem.css('z-index', zIndex); + $toolbarElem.append($elem); + } + }); + }, + + // 绑定菜单 click mouseenter 事件 + _bindEvent: function _bindEvent() { + var menus = this.menus; + var editor = this.editor; + objForEach(menus, function (key, menu) { + var type = menu.type; + if (!type) { + return; + } + var $elem = menu.$elem; + var droplist = menu.droplist; + var panel = menu.panel; + + // 点击类型,例如 bold + if (type === 'click' && menu.onClick) { + $elem.on('click', function (e) { + if (editor.selection.getRange() == null) { + return; + } + menu.onClick(e); + }); + } + + // 下拉框,例如 head + if (type === 'droplist' && droplist) { + $elem.on('mouseenter', function (e) { + if (editor.selection.getRange() == null) { + return; + } + // 显示 + droplist.showTimeoutId = setTimeout(function () { + droplist.show(); + }, 200); + }).on('mouseleave', function (e) { + // 隐藏 + droplist.hideTimeoutId = setTimeout(function () { + droplist.hide(); + }, 0); + }); + } + + // 弹框类型,例如 link + if (type === 'panel' && menu.onClick) { + $elem.on('click', function (e) { + e.stopPropagation(); + if (editor.selection.getRange() == null) { + return; + } + // 在自定义事件中显示 panel + menu.onClick(e); + }); + } + }); + }, + + // 尝试修改菜单状态 + changeActive: function changeActive() { + var menus = this.menus; + objForEach(menus, function (key, menu) { + if (menu.tryChangeActive) { + setTimeout(function () { + menu.tryChangeActive(); + }, 100); + } + }); + } +}; + +/* + 粘贴信息的处理 +*/ + +// 获取粘贴的纯文本 +function getPasteText(e) { + var clipboardData = e.clipboardData || e.originalEvent && e.originalEvent.clipboardData; + var pasteText = void 0; + if (clipboardData == null) { + pasteText = window.clipboardData && window.clipboardData.getData('text'); + } else { + pasteText = clipboardData.getData('text/plain'); + } + + return replaceHtmlSymbol(pasteText); +} + +// 获取粘贴的html +function getPasteHtml(e, filterStyle, ignoreImg) { + var clipboardData = e.clipboardData || e.originalEvent && e.originalEvent.clipboardData; + var pasteText = void 0, + pasteHtml = void 0; + if (clipboardData == null) { + pasteText = window.clipboardData && window.clipboardData.getData('text'); + } else { + pasteText = clipboardData.getData('text/plain'); + pasteHtml = clipboardData.getData('text/html'); + } + if (!pasteHtml && pasteText) { + pasteHtml = '

        ' + replaceHtmlSymbol(pasteText) + '

        '; + } + if (!pasteHtml) { + return; + } + + // 过滤word中状态过来的无用字符 + var docSplitHtml = pasteHtml.split(''); + if (docSplitHtml.length === 2) { + pasteHtml = docSplitHtml[0]; + } + + // 过滤无用标签 + pasteHtml = pasteHtml.replace(/<(meta|script|link).+?>/igm, ''); + // 去掉注释 + pasteHtml = pasteHtml.replace(//mg, ''); + // 过滤 data-xxx 属性 + pasteHtml = pasteHtml.replace(/\s?data-.+?=('|").+?('|")/igm, ''); + + if (ignoreImg) { + // 忽略图片 + pasteHtml = pasteHtml.replace(//igm, ''); + } + + if (filterStyle) { + // 过滤样式 + pasteHtml = pasteHtml.replace(/\s?(class|style)=('|").*?('|")/igm, ''); + } else { + // 保留样式 + pasteHtml = pasteHtml.replace(/\s?class=('|").*?('|")/igm, ''); + } + + return pasteHtml; +} + +// 获取粘贴的图片文件 +function getPasteImgs(e) { + var result = []; + var txt = getPasteText(e); + if (txt) { + // 有文字,就忽略图片 + return result; + } + + var clipboardData = e.clipboardData || e.originalEvent && e.originalEvent.clipboardData || {}; + var items = clipboardData.items; + if (!items) { + return result; + } + + objForEach(items, function (key, value) { + var type = value.type; + if (/image/i.test(type)) { + result.push(value.getAsFile()); + } + }); + + return result; +} + +/* + 编辑区域 +*/ + +// 获取一个 elem.childNodes 的 JSON 数据 +function getChildrenJSON($elem) { + var result = []; + var $children = $elem.childNodes() || []; // 注意 childNodes() 可以获取文本节点 + $children.forEach(function (curElem) { + var elemResult = void 0; + var nodeType = curElem.nodeType; + + // 文本节点 + if (nodeType === 3) { + elemResult = curElem.textContent; + elemResult = replaceHtmlSymbol(elemResult); + } + + // 普通 DOM 节点 + if (nodeType === 1) { + elemResult = {}; + + // tag + elemResult.tag = curElem.nodeName.toLowerCase(); + // attr + var attrData = []; + var attrList = curElem.attributes || {}; + var attrListLength = attrList.length || 0; + for (var i = 0; i < attrListLength; i++) { + var attr = attrList[i]; + attrData.push({ + name: attr.name, + value: attr.value + }); + } + elemResult.attrs = attrData; + // children(递归) + elemResult.children = getChildrenJSON($(curElem)); + } + + result.push(elemResult); + }); + return result; +} + +// 构造函数 +function Text(editor) { + this.editor = editor; +} + +// 修改原型 +Text.prototype = { + constructor: Text, + + // 初始化 + init: function init() { + // 绑定事件 + this._bindEvent(); + }, + + // 清空内容 + clear: function clear() { + this.html('


        '); + }, + + // 获取 设置 html + html: function html(val) { + var editor = this.editor; + var $textElem = editor.$textElem; + var html = void 0; + if (val == null) { + html = $textElem.html(); + // 未选中任何内容的时候点击“加粗”或者“斜体”等按钮,就得需要一个空的占位符 ​ ,这里替换掉 + html = html.replace(/\u200b/gm, ''); + return html; + } else { + $textElem.html(val); + + // 初始化选取,将光标定位到内容尾部 + editor.initSelection(); + } + }, + + // 获取 JSON + getJSON: function getJSON() { + var editor = this.editor; + var $textElem = editor.$textElem; + return getChildrenJSON($textElem); + }, + + // 获取 设置 text + text: function text(val) { + var editor = this.editor; + var $textElem = editor.$textElem; + var text = void 0; + if (val == null) { + text = $textElem.text(); + // 未选中任何内容的时候点击“加粗”或者“斜体”等按钮,就得需要一个空的占位符 ​ ,这里替换掉 + text = text.replace(/\u200b/gm, ''); + return text; + } else { + $textElem.text('

        ' + val + '

        '); + + // 初始化选取,将光标定位到内容尾部 + editor.initSelection(); + } + }, + + // 追加内容 + append: function append(html) { + var editor = this.editor; + var $textElem = editor.$textElem; + $textElem.append($(html)); + + // 初始化选取,将光标定位到内容尾部 + editor.initSelection(); + }, + + // 绑定事件 + _bindEvent: function _bindEvent() { + // 实时保存选取 + this._saveRangeRealTime(); + + // 按回车建时的特殊处理 + this._enterKeyHandle(); + + // 清空时保留


        + this._clearHandle(); + + // 粘贴事件(粘贴文字,粘贴图片) + this._pasteHandle(); + + // tab 特殊处理 + this._tabHandle(); + + // img 点击 + this._imgHandle(); + + // 拖拽事件 + this._dragHandle(); + }, + + // 实时保存选取 + _saveRangeRealTime: function _saveRangeRealTime() { + var editor = this.editor; + var $textElem = editor.$textElem; + + // 保存当前的选区 + function saveRange(e) { + // 随时保存选区 + editor.selection.saveRange(); + // 更新按钮 ative 状态 + editor.menus.changeActive(); + } + // 按键后保存 + $textElem.on('keyup', saveRange); + $textElem.on('mousedown', function (e) { + // mousedown 状态下,鼠标滑动到编辑区域外面,也需要保存选区 + $textElem.on('mouseleave', saveRange); + }); + $textElem.on('mouseup', function (e) { + saveRange(); + // 在编辑器区域之内完成点击,取消鼠标滑动到编辑区外面的事件 + $textElem.off('mouseleave', saveRange); + }); + }, + + // 按回车键时的特殊处理 + _enterKeyHandle: function _enterKeyHandle() { + var editor = this.editor; + var $textElem = editor.$textElem; + + function insertEmptyP($selectionElem) { + var $p = $('


        '); + $p.insertBefore($selectionElem); + editor.selection.createRangeByElem($p, true); + editor.selection.restoreSelection(); + $selectionElem.remove(); + } + + // 将回车之后生成的非

        的顶级标签,改为

        + function pHandle(e) { + var $selectionElem = editor.selection.getSelectionContainerElem(); + var $parentElem = $selectionElem.parent(); + + if ($parentElem.html() === '
        ') { + // 回车之前光标所在一个

        .....

        ,忽然回车生成一个空的


        + // 而且继续回车跳不出去,因此只能特殊处理 + insertEmptyP($selectionElem); + return; + } + + if (!$parentElem.equal($textElem)) { + // 不是顶级标签 + return; + } + + var nodeName = $selectionElem.getNodeName(); + if (nodeName === 'P') { + // 当前的标签是 P ,不用做处理 + return; + } + + if ($selectionElem.text()) { + // 有内容,不做处理 + return; + } + + // 插入

        ,并将选取定位到

        ,删除当前标签 + insertEmptyP($selectionElem); + } + + $textElem.on('keyup', function (e) { + if (e.keyCode !== 13) { + // 不是回车键 + return; + } + // 将回车之后生成的非

        的顶级标签,改为

        + pHandle(e); + }); + + //

        回车时 特殊处理 + function codeHandle(e) { + var $selectionElem = editor.selection.getSelectionContainerElem(); + if (!$selectionElem) { + return; + } + var $parentElem = $selectionElem.parent(); + var selectionNodeName = $selectionElem.getNodeName(); + var parentNodeName = $parentElem.getNodeName(); + + if (selectionNodeName !== 'CODE' || parentNodeName !== 'PRE') { + // 不符合要求 忽略 + return; + } + + if (!editor.cmd.queryCommandSupported('insertHTML')) { + // 必须原生支持 insertHTML 命令 + return; + } + + // 处理:光标定位到代码末尾,联系点击两次回车,即跳出代码块 + if (editor._willBreakCode === true) { + // 此时可以跳出代码块 + // 插入

        ,并将选取定位到

        + var $p = $('


        '); + $p.insertAfter($parentElem); + editor.selection.createRangeByElem($p, true); + editor.selection.restoreSelection(); + + // 修改状态 + editor._willBreakCode = false; + + e.preventDefault(); + return; + } + + var _startOffset = editor.selection.getRange().startOffset; + + // 处理:回车时,不能插入
        而是插入 \n ,因为是在 pre 标签里面 + editor.cmd.do('insertHTML', '\n'); + editor.selection.saveRange(); + if (editor.selection.getRange().startOffset === _startOffset) { + // 没起作用,再来一遍 + editor.cmd.do('insertHTML', '\n'); + } + + var codeLength = $selectionElem.html().length; + if (editor.selection.getRange().startOffset + 1 === codeLength) { + // 说明光标在代码最后的位置,执行了回车操作 + // 记录下来,以便下次回车时候跳出 code + editor._willBreakCode = true; + } + + // 阻止默认行为 + e.preventDefault(); + } + + $textElem.on('keydown', function (e) { + if (e.keyCode !== 13) { + // 不是回车键 + // 取消即将跳转代码块的记录 + editor._willBreakCode = false; + return; + } + //
        回车时 特殊处理 + codeHandle(e); + }); + }, + + // 清空时保留


        + _clearHandle: function _clearHandle() { + var editor = this.editor; + var $textElem = editor.$textElem; + + $textElem.on('keydown', function (e) { + if (e.keyCode !== 8) { + return; + } + var txtHtml = $textElem.html().toLowerCase().trim(); + if (txtHtml === '


        ') { + // 最后剩下一个空行,就不再删除了 + e.preventDefault(); + return; + } + }); + + $textElem.on('keyup', function (e) { + if (e.keyCode !== 8) { + return; + } + var $p = void 0; + var txtHtml = $textElem.html().toLowerCase().trim(); + + // firefox 时用 txtHtml === '
        ' 判断,其他用 !txtHtml 判断 + if (!txtHtml || txtHtml === '
        ') { + // 内容空了 + $p = $('


        '); + $textElem.html(''); // 一定要先清空,否则在 firefox 下有问题 + $textElem.append($p); + editor.selection.createRangeByElem($p, false, true); + editor.selection.restoreSelection(); + } + }); + }, + + // 粘贴事件(粘贴文字 粘贴图片) + _pasteHandle: function _pasteHandle() { + var editor = this.editor; + var config = editor.config; + var pasteFilterStyle = config.pasteFilterStyle; + var pasteTextHandle = config.pasteTextHandle; + var ignoreImg = config.pasteIgnoreImg; + var $textElem = editor.$textElem; + + // 粘贴图片、文本的事件,每次只能执行一个 + // 判断该次粘贴事件是否可以执行 + var pasteTime = 0; + function canDo() { + var now = Date.now(); + var flag = false; + if (now - pasteTime >= 100) { + // 间隔大于 100 ms ,可以执行 + flag = true; + } + pasteTime = now; + return flag; + } + function resetTime() { + pasteTime = 0; + } + + // 粘贴文字 + $textElem.on('paste', function (e) { + if (UA.isIE()) { + return; + } else { + // 阻止默认行为,使用 execCommand 的粘贴命令 + e.preventDefault(); + } + + // 粘贴图片和文本,只能同时使用一个 + if (!canDo()) { + return; + } + + // 获取粘贴的文字 + var pasteHtml = getPasteHtml(e, pasteFilterStyle, ignoreImg); + var pasteText = getPasteText(e); + pasteText = pasteText.replace(/\n/gm, '
        '); + + var $selectionElem = editor.selection.getSelectionContainerElem(); + if (!$selectionElem) { + return; + } + var nodeName = $selectionElem.getNodeName(); + + // code 中只能粘贴纯文本 + if (nodeName === 'CODE' || nodeName === 'PRE') { + if (pasteTextHandle && isFunction(pasteTextHandle)) { + // 用户自定义过滤处理粘贴内容 + pasteText = '' + (pasteTextHandle(pasteText) || ''); + } + editor.cmd.do('insertHTML', '

        ' + pasteText + '

        '); + return; + } + + // 先放开注释,有问题再追查 ———— + // // 表格中忽略,可能会出现异常问题 + // if (nodeName === 'TD' || nodeName === 'TH') { + // return + // } + + if (!pasteHtml) { + // 没有内容,可继续执行下面的图片粘贴 + resetTime(); + return; + } + try { + // firefox 中,获取的 pasteHtml 可能是没有
          包裹的
        • + // 因此执行 insertHTML 会报错 + if (pasteTextHandle && isFunction(pasteTextHandle)) { + // 用户自定义过滤处理粘贴内容 + pasteHtml = '' + (pasteTextHandle(pasteHtml) || ''); + } + editor.cmd.do('insertHTML', pasteHtml); + } catch (ex) { + // 此时使用 pasteText 来兼容一下 + if (pasteTextHandle && isFunction(pasteTextHandle)) { + // 用户自定义过滤处理粘贴内容 + pasteText = '' + (pasteTextHandle(pasteText) || ''); + } + editor.cmd.do('insertHTML', '

          ' + pasteText + '

          '); + } + }); + + // 粘贴图片 + $textElem.on('paste', function (e) { + if (UA.isIE()) { + return; + } else { + e.preventDefault(); + } + + // 粘贴图片和文本,只能同时使用一个 + if (!canDo()) { + return; + } + + // 获取粘贴的图片 + var pasteFiles = getPasteImgs(e); + if (!pasteFiles || !pasteFiles.length) { + return; + } + + // 获取当前的元素 + var $selectionElem = editor.selection.getSelectionContainerElem(); + if (!$selectionElem) { + return; + } + var nodeName = $selectionElem.getNodeName(); + + // code 中粘贴忽略 + if (nodeName === 'CODE' || nodeName === 'PRE') { + return; + } + + // 上传图片 + var uploadImg = editor.uploadImg; + uploadImg.uploadImg(pasteFiles); + }); + }, + + // tab 特殊处理 + _tabHandle: function _tabHandle() { + var editor = this.editor; + var $textElem = editor.$textElem; + + $textElem.on('keydown', function (e) { + if (e.keyCode !== 9) { + return; + } + if (!editor.cmd.queryCommandSupported('insertHTML')) { + // 必须原生支持 insertHTML 命令 + return; + } + var $selectionElem = editor.selection.getSelectionContainerElem(); + if (!$selectionElem) { + return; + } + var $parentElem = $selectionElem.parent(); + var selectionNodeName = $selectionElem.getNodeName(); + var parentNodeName = $parentElem.getNodeName(); + + if (selectionNodeName === 'CODE' && parentNodeName === 'PRE') { + //
           里面
          +                editor.cmd.do('insertHTML', '    ');
          +            } else {
          +                // 普通文字
          +                editor.cmd.do('insertHTML', '    ');
          +            }
          +
          +            e.preventDefault();
          +        });
          +    },
          +
          +    // img 点击
          +    _imgHandle: function _imgHandle() {
          +        var editor = this.editor;
          +        var $textElem = editor.$textElem;
          +
          +        // 为图片增加 selected 样式
          +        $textElem.on('click', 'img', function (e) {
          +            var img = this;
          +            var $img = $(img);
          +
          +            if ($img.attr('data-w-e') === '1') {
          +                // 是表情图片,忽略
          +                return;
          +            }
          +
          +            // 记录当前点击过的图片
          +            editor._selectedImg = $img;
          +
          +            // 修改选区并 restore ,防止用户此时点击退格键,会删除其他内容
          +            editor.selection.createRangeByElem($img);
          +            editor.selection.restoreSelection();
          +        });
          +
          +        // 去掉图片的 selected 样式
          +        $textElem.on('click  keyup', function (e) {
          +            if (e.target.matches('img')) {
          +                // 点击的是图片,忽略
          +                return;
          +            }
          +            // 删除记录
          +            editor._selectedImg = null;
          +        });
          +    },
          +
          +    // 拖拽事件
          +    _dragHandle: function _dragHandle() {
          +        var editor = this.editor;
          +
          +        // 禁用 document 拖拽事件
          +        var $document = $(document);
          +        $document.on('dragleave drop dragenter dragover', function (e) {
          +            e.preventDefault();
          +        });
          +
          +        // 添加编辑区域拖拽事件
          +        var $textElem = editor.$textElem;
          +        $textElem.on('drop', function (e) {
          +            e.preventDefault();
          +            var files = e.dataTransfer && e.dataTransfer.files;
          +            if (!files || !files.length) {
          +                return;
          +            }
          +
          +            // 上传图片
          +            var uploadImg = editor.uploadImg;
          +            uploadImg.uploadImg(files);
          +        });
          +    }
          +};
          +
          +/*
          +    命令,封装 document.execCommand
          +*/
          +
          +// 构造函数
          +function Command(editor) {
          +    this.editor = editor;
          +}
          +
          +// 修改原型
          +Command.prototype = {
          +    constructor: Command,
          +
          +    // 执行命令
          +    do: function _do(name, value) {
          +        var editor = this.editor;
          +
          +        // 使用 styleWithCSS
          +        if (!editor._useStyleWithCSS) {
          +            document.execCommand('styleWithCSS', null, true);
          +            editor._useStyleWithCSS = true;
          +        }
          +
          +        // 如果无选区,忽略
          +        if (!editor.selection.getRange()) {
          +            return;
          +        }
          +
          +        // 恢复选取
          +        editor.selection.restoreSelection();
          +
          +        // 执行
          +        var _name = '_' + name;
          +        if (this[_name]) {
          +            // 有自定义事件
          +            this[_name](value);
          +        } else {
          +            // 默认 command
          +            this._execCommand(name, value);
          +        }
          +
          +        // 修改菜单状态
          +        editor.menus.changeActive();
          +
          +        // 最后,恢复选取保证光标在原来的位置闪烁
          +        editor.selection.saveRange();
          +        editor.selection.restoreSelection();
          +
          +        // 触发 onchange
          +        editor.change && editor.change();
          +    },
          +
          +    // 自定义 insertHTML 事件
          +    _insertHTML: function _insertHTML(html) {
          +        var editor = this.editor;
          +        var range = editor.selection.getRange();
          +
          +        if (this.queryCommandSupported('insertHTML')) {
          +            // W3C
          +            this._execCommand('insertHTML', html);
          +        } else if (range.insertNode) {
          +            // IE
          +            range.deleteContents();
          +            range.insertNode($(html)[0]);
          +        } else if (range.pasteHTML) {
          +            // IE <= 10
          +            range.pasteHTML(html);
          +        }
          +    },
          +
          +    // 插入 elem
          +    _insertElem: function _insertElem($elem) {
          +        var editor = this.editor;
          +        var range = editor.selection.getRange();
          +
          +        if (range.insertNode) {
          +            range.deleteContents();
          +            range.insertNode($elem[0]);
          +        }
          +    },
          +
          +    // 封装 execCommand
          +    _execCommand: function _execCommand(name, value) {
          +        document.execCommand(name, false, value);
          +    },
          +
          +    // 封装 document.queryCommandValue
          +    queryCommandValue: function queryCommandValue(name) {
          +        return document.queryCommandValue(name);
          +    },
          +
          +    // 封装 document.queryCommandState
          +    queryCommandState: function queryCommandState(name) {
          +        return document.queryCommandState(name);
          +    },
          +
          +    // 封装 document.queryCommandSupported
          +    queryCommandSupported: function queryCommandSupported(name) {
          +        return document.queryCommandSupported(name);
          +    }
          +};
          +
          +/*
          +    selection range API
          +*/
          +
          +// 构造函数
          +function API(editor) {
          +    this.editor = editor;
          +    this._currentRange = null;
          +}
          +
          +// 修改原型
          +API.prototype = {
          +    constructor: API,
          +
          +    // 获取 range 对象
          +    getRange: function getRange() {
          +        return this._currentRange;
          +    },
          +
          +    // 保存选区
          +    saveRange: function saveRange(_range) {
          +        if (_range) {
          +            // 保存已有选区
          +            this._currentRange = _range;
          +            return;
          +        }
          +
          +        // 获取当前的选区
          +        var selection = window.getSelection();
          +        if (selection.rangeCount === 0) {
          +            return;
          +        }
          +        var range = selection.getRangeAt(0);
          +
          +        // 判断选区内容是否在编辑内容之内
          +        var $containerElem = this.getSelectionContainerElem(range);
          +        if (!$containerElem) {
          +            return;
          +        }
          +
          +        // 判断选区内容是否在不可编辑区域之内
          +        if ($containerElem.attr('contenteditable') === 'false' || $containerElem.parentUntil('[contenteditable=false]')) {
          +            return;
          +        }
          +
          +        var editor = this.editor;
          +        var $textElem = editor.$textElem;
          +        if ($textElem.isContain($containerElem)) {
          +            // 是编辑内容之内的
          +            this._currentRange = range;
          +        }
          +    },
          +
          +    // 折叠选区
          +    collapseRange: function collapseRange(toStart) {
          +        if (toStart == null) {
          +            // 默认为 false
          +            toStart = false;
          +        }
          +        var range = this._currentRange;
          +        if (range) {
          +            range.collapse(toStart);
          +        }
          +    },
          +
          +    // 选中区域的文字
          +    getSelectionText: function getSelectionText() {
          +        var range = this._currentRange;
          +        if (range) {
          +            return this._currentRange.toString();
          +        } else {
          +            return '';
          +        }
          +    },
          +
          +    // 选区的 $Elem
          +    getSelectionContainerElem: function getSelectionContainerElem(range) {
          +        range = range || this._currentRange;
          +        var elem = void 0;
          +        if (range) {
          +            elem = range.commonAncestorContainer;
          +            return $(elem.nodeType === 1 ? elem : elem.parentNode);
          +        }
          +    },
          +    getSelectionStartElem: function getSelectionStartElem(range) {
          +        range = range || this._currentRange;
          +        var elem = void 0;
          +        if (range) {
          +            elem = range.startContainer;
          +            return $(elem.nodeType === 1 ? elem : elem.parentNode);
          +        }
          +    },
          +    getSelectionEndElem: function getSelectionEndElem(range) {
          +        range = range || this._currentRange;
          +        var elem = void 0;
          +        if (range) {
          +            elem = range.endContainer;
          +            return $(elem.nodeType === 1 ? elem : elem.parentNode);
          +        }
          +    },
          +
          +    // 选区是否为空
          +    isSelectionEmpty: function isSelectionEmpty() {
          +        var range = this._currentRange;
          +        if (range && range.startContainer) {
          +            if (range.startContainer === range.endContainer) {
          +                if (range.startOffset === range.endOffset) {
          +                    return true;
          +                }
          +            }
          +        }
          +        return false;
          +    },
          +
          +    // 恢复选区
          +    restoreSelection: function restoreSelection() {
          +        var selection = window.getSelection();
          +        selection.removeAllRanges();
          +        selection.addRange(this._currentRange);
          +    },
          +
          +    // 创建一个空白(即 ​ 字符)选区
          +    createEmptyRange: function createEmptyRange() {
          +        var editor = this.editor;
          +        var range = this.getRange();
          +        var $elem = void 0;
          +
          +        if (!range) {
          +            // 当前无 range
          +            return;
          +        }
          +        if (!this.isSelectionEmpty()) {
          +            // 当前选区必须没有内容才可以
          +            return;
          +        }
          +
          +        try {
          +            // 目前只支持 webkit 内核
          +            if (UA.isWebkit()) {
          +                // 插入 ​
          +                editor.cmd.do('insertHTML', '​');
          +                // 修改 offset 位置
          +                range.setEnd(range.endContainer, range.endOffset + 1);
          +                // 存储
          +                this.saveRange(range);
          +            } else {
          +                $elem = $('');
          +                editor.cmd.do('insertElem', $elem);
          +                this.createRangeByElem($elem, true);
          +            }
          +        } catch (ex) {
          +            // 部分情况下会报错,兼容一下
          +        }
          +    },
          +
          +    // 根据 $Elem 设置选区
          +    createRangeByElem: function createRangeByElem($elem, toStart, isContent) {
          +        // $elem - 经过封装的 elem
          +        // toStart - true 开始位置,false 结束位置
          +        // isContent - 是否选中Elem的内容
          +        if (!$elem.length) {
          +            return;
          +        }
          +
          +        var elem = $elem[0];
          +        var range = document.createRange();
          +
          +        if (isContent) {
          +            range.selectNodeContents(elem);
          +        } else {
          +            range.selectNode(elem);
          +        }
          +
          +        if (typeof toStart === 'boolean') {
          +            range.collapse(toStart);
          +        }
          +
          +        // 存储 range
          +        this.saveRange(range);
          +    }
          +};
          +
          +/*
          +    上传进度条
          +*/
          +
          +function Progress(editor) {
          +    this.editor = editor;
          +    this._time = 0;
          +    this._isShow = false;
          +    this._isRender = false;
          +    this._timeoutId = 0;
          +    this.$textContainer = editor.$textContainerElem;
          +    this.$bar = $('
          '); +} + +Progress.prototype = { + constructor: Progress, + + show: function show(progress) { + var _this = this; + + // 状态处理 + if (this._isShow) { + return; + } + this._isShow = true; + + // 渲染 + var $bar = this.$bar; + if (!this._isRender) { + var $textContainer = this.$textContainer; + $textContainer.append($bar); + } else { + this._isRender = true; + } + + // 改变进度(节流,100ms 渲染一次) + if (Date.now() - this._time > 100) { + if (progress <= 1) { + $bar.css('width', progress * 100 + '%'); + this._time = Date.now(); + } + } + + // 隐藏 + var timeoutId = this._timeoutId; + if (timeoutId) { + clearTimeout(timeoutId); + } + timeoutId = setTimeout(function () { + _this._hide(); + }, 500); + }, + + _hide: function _hide() { + var $bar = this.$bar; + $bar.remove(); + + // 修改状态 + this._time = 0; + this._isShow = false; + this._isRender = false; + } +}; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { + return typeof obj; +} : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; +}; + +/* + 上传图片 +*/ + +// 构造函数 +function UploadImg(editor) { + this.editor = editor; +} + +// 原型 +UploadImg.prototype = { + constructor: UploadImg, + + // 根据 debug 弹出不同的信息 + _alert: function _alert(alertInfo, debugInfo) { + var editor = this.editor; + var debug = editor.config.debug; + var customAlert = editor.config.customAlert; + + if (debug) { + throw new Error('wangEditor: ' + (debugInfo || alertInfo)); + } else { + if (customAlert && typeof customAlert === 'function') { + customAlert(alertInfo); + } else { + alert(alertInfo); + } + } + }, + + // 根据链接插入图片 + insertLinkImg: function insertLinkImg(link) { + var _this2 = this; + + if (!link) { + return; + } + var editor = this.editor; + var config = editor.config; + + // 校验格式 + var linkImgCheck = config.linkImgCheck; + var checkResult = void 0; + if (linkImgCheck && typeof linkImgCheck === 'function') { + checkResult = linkImgCheck(link); + if (typeof checkResult === 'string') { + // 校验失败,提示信息 + alert(checkResult); + return; + } + } + + editor.cmd.do('insertHTML', ''); + + // 验证图片 url 是否有效,无效的话给出提示 + var img = document.createElement('img'); + img.onload = function () { + var callback = config.linkImgCallback; + if (callback && typeof callback === 'function') { + callback(link); + } + + img = null; + }; + img.onerror = function () { + img = null; + // 无法成功下载图片 + _this2._alert('插入图片错误', 'wangEditor: \u63D2\u5165\u56FE\u7247\u51FA\u9519\uFF0C\u56FE\u7247\u94FE\u63A5\u662F "' + link + '"\uFF0C\u4E0B\u8F7D\u8BE5\u94FE\u63A5\u5931\u8D25'); + return; + }; + img.onabort = function () { + img = null; + }; + img.src = link; + }, + + // 上传图片 + uploadImg: function uploadImg(files) { + var _this3 = this; + + if (!files || !files.length) { + return; + } + + // ------------------------------ 获取配置信息 ------------------------------ + var editor = this.editor; + var config = editor.config; + var uploadImgServer = config.uploadImgServer; + var uploadImgShowBase64 = config.uploadImgShowBase64; + + var maxSize = config.uploadImgMaxSize; + var maxSizeM = maxSize / 1024 / 1024; + var maxLength = config.uploadImgMaxLength || 10000; + var uploadFileName = config.uploadFileName || ''; + var uploadImgParams = config.uploadImgParams || {}; + var uploadImgParamsWithUrl = config.uploadImgParamsWithUrl; + var uploadImgHeaders = config.uploadImgHeaders || {}; + var hooks = config.uploadImgHooks || {}; + var timeout = config.uploadImgTimeout || 3000; + var withCredentials = config.withCredentials; + if (withCredentials == null) { + withCredentials = false; + } + var customUploadImg = config.customUploadImg; + + if (!customUploadImg) { + // 没有 customUploadImg 的情况下,需要如下两个配置才能继续进行图片上传 + if (!uploadImgServer && !uploadImgShowBase64) { + return; + } + } + + // ------------------------------ 验证文件信息 ------------------------------ + var resultFiles = []; + var errInfo = []; + arrForEach(files, function (file) { + var name = file.name; + var size = file.size; + + // chrome 低版本 name === undefined + if (!name || !size) { + return; + } + + if (/\.(jpg|jpeg|png|bmp|gif|webp)$/i.test(name) === false) { + // 后缀名不合法,不是图片 + errInfo.push('\u3010' + name + '\u3011\u4E0D\u662F\u56FE\u7247'); + return; + } + if (maxSize < size) { + // 上传图片过大 + errInfo.push('\u3010' + name + '\u3011\u5927\u4E8E ' + maxSizeM + 'M'); + return; + } + + // 验证通过的加入结果列表 + resultFiles.push(file); + }); + // 抛出验证信息 + if (errInfo.length) { + this._alert('图片验证未通过: \n' + errInfo.join('\n')); + return; + } + if (resultFiles.length > maxLength) { + this._alert('一次最多上传' + maxLength + '张图片'); + return; + } + + // ------------------------------ 自定义上传 ------------------------------ + if (customUploadImg && typeof customUploadImg === 'function') { + customUploadImg(resultFiles, this.insertLinkImg.bind(this)); + + // 阻止以下代码执行 + return; + } + + // 添加图片数据 + var formdata = new FormData(); + arrForEach(resultFiles, function (file) { + var name = uploadFileName || file.name; + formdata.append(name, file); + }); + + // ------------------------------ 上传图片 ------------------------------ + if (uploadImgServer && typeof uploadImgServer === 'string') { + // 添加参数 + var uploadImgServerArr = uploadImgServer.split('#'); + uploadImgServer = uploadImgServerArr[0]; + var uploadImgServerHash = uploadImgServerArr[1] || ''; + objForEach(uploadImgParams, function (key, val) { + // 因使用者反应,自定义参数不能默认 encode ,由 v3.1.1 版本开始注释掉 + // val = encodeURIComponent(val) + + // 第一,将参数拼接到 url 中 + if (uploadImgParamsWithUrl) { + if (uploadImgServer.indexOf('?') > 0) { + uploadImgServer += '&'; + } else { + uploadImgServer += '?'; + } + uploadImgServer = uploadImgServer + key + '=' + val; + } + + // 第二,将参数添加到 formdata 中 + formdata.append(key, val); + }); + if (uploadImgServerHash) { + uploadImgServer += '#' + uploadImgServerHash; + } + + // 定义 xhr + var xhr = new XMLHttpRequest(); + xhr.open('POST', uploadImgServer); + + // 设置超时 + xhr.timeout = timeout; + xhr.ontimeout = function () { + // hook - timeout + if (hooks.timeout && typeof hooks.timeout === 'function') { + hooks.timeout(xhr, editor); + } + + _this3._alert('上传图片超时'); + }; + + // 监控 progress + if (xhr.upload) { + xhr.upload.onprogress = function (e) { + var percent = void 0; + // 进度条 + var progressBar = new Progress(editor); + if (e.lengthComputable) { + percent = e.loaded / e.total; + progressBar.show(percent); + } + }; + } + + // 返回数据 + xhr.onreadystatechange = function () { + var result = void 0; + if (xhr.readyState === 4) { + if (xhr.status < 200 || xhr.status >= 300) { + // hook - error + if (hooks.error && typeof hooks.error === 'function') { + hooks.error(xhr, editor); + } + + // xhr 返回状态错误 + _this3._alert('上传图片发生错误', '\u4E0A\u4F20\u56FE\u7247\u53D1\u751F\u9519\u8BEF\uFF0C\u670D\u52A1\u5668\u8FD4\u56DE\u72B6\u6001\u662F ' + xhr.status); + return; + } + + result = xhr.responseText; + if ((typeof result === 'undefined' ? 'undefined' : _typeof(result)) !== 'object') { + try { + result = JSON.parse(result); + } catch (ex) { + // hook - fail + if (hooks.fail && typeof hooks.fail === 'function') { + hooks.fail(xhr, editor, result); + } + + _this3._alert('上传图片失败', '上传图片返回结果错误,返回结果是: ' + result); + return; + } + } + if (!hooks.customInsert && result.errno != '0') { + // hook - fail + if (hooks.fail && typeof hooks.fail === 'function') { + hooks.fail(xhr, editor, result); + } + + // 数据错误 + _this3._alert('上传图片失败', '上传图片返回结果错误,返回结果 errno=' + result.errno); + } else { + if (hooks.customInsert && typeof hooks.customInsert === 'function') { + // 使用者自定义插入方法 + hooks.customInsert(_this3.insertLinkImg.bind(_this3), result, editor); + } else { + // 将图片插入编辑器 + var data = result.data || []; + data.forEach(function (link) { + _this3.insertLinkImg(link); + }); + } + + // hook - success + if (hooks.success && typeof hooks.success === 'function') { + hooks.success(xhr, editor, result); + } + } + } + }; + + // hook - before + if (hooks.before && typeof hooks.before === 'function') { + var beforeResult = hooks.before(xhr, editor, resultFiles); + if (beforeResult && (typeof beforeResult === 'undefined' ? 'undefined' : _typeof(beforeResult)) === 'object') { + if (beforeResult.prevent) { + // 如果返回的结果是 {prevent: true, msg: 'xxxx'} 则表示用户放弃上传 + this._alert(beforeResult.msg); + return; + } + } + } + + // 自定义 headers + objForEach(uploadImgHeaders, function (key, val) { + xhr.setRequestHeader(key, val); + }); + + // 跨域传 cookie + xhr.withCredentials = withCredentials; + + // 发送请求 + xhr.send(formdata); + + // 注意,要 return 。不去操作接下来的 base64 显示方式 + return; + } + + // ------------------------------ 显示 base64 格式 ------------------------------ + if (uploadImgShowBase64) { + arrForEach(files, function (file) { + var _this = _this3; + var reader = new FileReader(); + reader.readAsDataURL(file); + reader.onload = function () { + _this.insertLinkImg(this.result); + }; + }); + } + } +}; + +/* + 编辑器构造函数 +*/ + +// id,累加 +var editorId = 1; + +// 构造函数 +function Editor(toolbarSelector, textSelector) { + if (toolbarSelector == null) { + // 没有传入任何参数,报错 + throw new Error('错误:初始化编辑器时候未传入任何参数,请查阅文档'); + } + // id,用以区分单个页面不同的编辑器对象 + this.id = 'wangEditor-' + editorId++; + + this.toolbarSelector = toolbarSelector; + this.textSelector = textSelector; + + // 自定义配置 + this.customConfig = {}; +} + +// 修改原型 +Editor.prototype = { + constructor: Editor, + + // 初始化配置 + _initConfig: function _initConfig() { + // _config 是默认配置,this.customConfig 是用户自定义配置,将它们 merge 之后再赋值 + var target = {}; + this.config = Object.assign(target, config, this.customConfig); + + // 将语言配置,生成正则表达式 + var langConfig = this.config.lang || {}; + var langArgs = []; + objForEach(langConfig, function (key, val) { + // key 即需要生成正则表达式的规则,如“插入链接” + // val 即需要被替换成的语言,如“insert link” + langArgs.push({ + reg: new RegExp(key, 'img'), + val: val + + }); + }); + this.config.langArgs = langArgs; + }, + + // 初始化 DOM + _initDom: function _initDom() { + var _this = this; + + var toolbarSelector = this.toolbarSelector; + var $toolbarSelector = $(toolbarSelector); + var textSelector = this.textSelector; + + var config$$1 = this.config; + var zIndex = config$$1.zIndex; + + // 定义变量 + var $toolbarElem = void 0, + $textContainerElem = void 0, + $textElem = void 0, + $children = void 0; + + if (textSelector == null) { + // 只传入一个参数,即是容器的选择器或元素,toolbar 和 text 的元素自行创建 + $toolbarElem = $('
          '); + $textContainerElem = $('
          '); + + // 将编辑器区域原有的内容,暂存起来 + $children = $toolbarSelector.children(); + + // 添加到 DOM 结构中 + $toolbarSelector.append($toolbarElem).append($textContainerElem); + + // 自行创建的,需要配置默认的样式 + $toolbarElem.css('background-color', '#f1f1f1').css('border', '1px solid #ccc'); + $textContainerElem.css('border', '1px solid #ccc').css('border-top', 'none').css('height', '300px'); + } else { + // toolbar 和 text 的选择器都有值,记录属性 + $toolbarElem = $toolbarSelector; + $textContainerElem = $(textSelector); + // 将编辑器区域原有的内容,暂存起来 + $children = $textContainerElem.children(); + } + + // 编辑区域 + $textElem = $('
          '); + $textElem.attr('contenteditable', 'true').css('width', '100%').css('height', '100%'); + + // 初始化编辑区域内容 + if ($children && $children.length) { + $textElem.append($children); + } else { + $textElem.append($('


          ')); + } + + // 编辑区域加入DOM + $textContainerElem.append($textElem); + + // 设置通用的 class + $toolbarElem.addClass('w-e-toolbar'); + $textContainerElem.addClass('w-e-text-container'); + $textContainerElem.css('z-index', zIndex); + $textElem.addClass('w-e-text'); + + // 添加 ID + var toolbarElemId = getRandom('toolbar-elem'); + $toolbarElem.attr('id', toolbarElemId); + var textElemId = getRandom('text-elem'); + $textElem.attr('id', textElemId); + + // 记录属性 + this.$toolbarElem = $toolbarElem; + this.$textContainerElem = $textContainerElem; + this.$textElem = $textElem; + this.toolbarElemId = toolbarElemId; + this.textElemId = textElemId; + + // 记录输入法的开始和结束 + var compositionEnd = true; + $textContainerElem.on('compositionstart', function () { + // 输入法开始输入 + compositionEnd = false; + }); + $textContainerElem.on('compositionend', function () { + // 输入法结束输入 + compositionEnd = true; + }); + + // 绑定 onchange + $textContainerElem.on('click keyup', function () { + // 输入法结束才出发 onchange + compositionEnd && _this.change && _this.change(); + }); + $toolbarElem.on('click', function () { + this.change && this.change(); + }); + + //绑定 onfocus 与 onblur 事件 + if (config$$1.onfocus || config$$1.onblur) { + // 当前编辑器是否是焦点状态 + this.isFocus = false; + + $(document).on('click', function (e) { + //判断当前点击元素是否在编辑器内 + var isChild = $textElem.isContain($(e.target)); + + //判断当前点击元素是否为工具栏 + var isToolbar = $toolbarElem.isContain($(e.target)); + var isMenu = $toolbarElem[0] == e.target ? true : false; + + if (!isChild) { + //若为选择工具栏中的功能,则不视为成blur操作 + if (isToolbar && !isMenu) { + return; + } + + if (_this.isFocus) { + _this.onblur && _this.onblur(); + } + _this.isFocus = false; + } else { + if (!_this.isFocus) { + _this.onfocus && _this.onfocus(); + } + _this.isFocus = true; + } + }); + } + }, + + // 封装 command + _initCommand: function _initCommand() { + this.cmd = new Command(this); + }, + + // 封装 selection range API + _initSelectionAPI: function _initSelectionAPI() { + this.selection = new API(this); + }, + + // 添加图片上传 + _initUploadImg: function _initUploadImg() { + this.uploadImg = new UploadImg(this); + }, + + // 初始化菜单 + _initMenus: function _initMenus() { + this.menus = new Menus(this); + this.menus.init(); + }, + + // 添加 text 区域 + _initText: function _initText() { + this.txt = new Text(this); + this.txt.init(); + }, + + // 初始化选区,将光标定位到内容尾部 + initSelection: function initSelection(newLine) { + var $textElem = this.$textElem; + var $children = $textElem.children(); + if (!$children.length) { + // 如果编辑器区域无内容,添加一个空行,重新设置选区 + $textElem.append($('


          ')); + this.initSelection(); + return; + } + + var $last = $children.last(); + + if (newLine) { + // 新增一个空行 + var html = $last.html().toLowerCase(); + var nodeName = $last.getNodeName(); + if (html !== '
          ' && html !== '' || nodeName !== 'P') { + // 最后一个元素不是


          ,添加一个空行,重新设置选区 + $textElem.append($('


          ')); + this.initSelection(); + return; + } + } + + this.selection.createRangeByElem($last, false, true); + this.selection.restoreSelection(); + }, + + // 绑定事件 + _bindEvent: function _bindEvent() { + // -------- 绑定 onchange 事件 -------- + var onChangeTimeoutId = 0; + var beforeChangeHtml = this.txt.html(); + var config$$1 = this.config; + + // onchange 触发延迟时间 + var onchangeTimeout = config$$1.onchangeTimeout; + onchangeTimeout = parseInt(onchangeTimeout, 10); + if (!onchangeTimeout || onchangeTimeout <= 0) { + onchangeTimeout = 200; + } + + var onchange = config$$1.onchange; + if (onchange && typeof onchange === 'function') { + // 触发 change 的有三个场景: + // 1. $textContainerElem.on('click keyup') + // 2. $toolbarElem.on('click') + // 3. editor.cmd.do() + this.change = function () { + // 判断是否有变化 + var currentHtml = this.txt.html(); + + if (currentHtml.length === beforeChangeHtml.length) { + // 需要比较每一个字符 + if (currentHtml === beforeChangeHtml) { + return; + } + } + + // 执行,使用节流 + if (onChangeTimeoutId) { + clearTimeout(onChangeTimeoutId); + } + onChangeTimeoutId = setTimeout(function () { + // 触发配置的 onchange 函数 + onchange(currentHtml); + beforeChangeHtml = currentHtml; + }, onchangeTimeout); + }; + } + + // -------- 绑定 onblur 事件 -------- + var onblur = config$$1.onblur; + if (onblur && typeof onblur === 'function') { + this.onblur = function () { + var currentHtml = this.txt.html(); + onblur(currentHtml); + }; + } + + // -------- 绑定 onfocus 事件 -------- + var onfocus = config$$1.onfocus; + if (onfocus && typeof onfocus === 'function') { + this.onfocus = function () { + onfocus(); + }; + } + }, + + // 创建编辑器 + create: function create() { + // 初始化配置信息 + this._initConfig(); + + // 初始化 DOM + this._initDom(); + + // 封装 command API + this._initCommand(); + + // 封装 selection range API + this._initSelectionAPI(); + + // 添加 text + this._initText(); + + // 初始化菜单 + this._initMenus(); + + // 添加 图片上传 + this._initUploadImg(); + + // 初始化选区,将光标定位到内容尾部 + this.initSelection(true); + + // 绑定事件 + this._bindEvent(); + }, + + // 解绑所有事件(暂时不对外开放) + _offAllEvent: function _offAllEvent() { + $.offAll(); + } +}; + +// 检验是否浏览器环境 +try { + document; +} catch (ex) { + throw new Error('请在浏览器环境下运行'); +} + +// polyfill +polyfill(); + +// 这里的 `inlinecss` 将被替换成 css 代码的内容,详情可去 ./gulpfile.js 中搜索 `inlinecss` 关键字 +var inlinecss = '.w-e-toolbar,.w-e-text-container,.w-e-menu-panel { padding: 0; margin: 0; box-sizing: border-box;}.w-e-toolbar *,.w-e-text-container *,.w-e-menu-panel * { padding: 0; margin: 0; box-sizing: border-box;}.w-e-clear-fix:after { content: ""; display: table; clear: both;}.w-e-toolbar .w-e-droplist { position: absolute; left: 0; top: 0; background-color: #fff; border: 1px solid #f1f1f1; border-right-color: #ccc; border-bottom-color: #ccc;}.w-e-toolbar .w-e-droplist .w-e-dp-title { text-align: center; color: #999; line-height: 2; border-bottom: 1px solid #f1f1f1; font-size: 13px;}.w-e-toolbar .w-e-droplist ul.w-e-list { list-style: none; line-height: 1;}.w-e-toolbar .w-e-droplist ul.w-e-list li.w-e-item { color: #333; padding: 5px 0;}.w-e-toolbar .w-e-droplist ul.w-e-list li.w-e-item:hover { background-color: #f1f1f1;}.w-e-toolbar .w-e-droplist ul.w-e-block { list-style: none; text-align: left; padding: 5px;}.w-e-toolbar .w-e-droplist ul.w-e-block li.w-e-item { display: inline-block; *display: inline; *zoom: 1; padding: 3px 5px;}.w-e-toolbar .w-e-droplist ul.w-e-block li.w-e-item:hover { background-color: #f1f1f1;}@font-face { font-family: \'w-e-icon\'; src: url(data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAABhQAAsAAAAAGAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgDxIPBGNtYXAAAAFoAAABBAAAAQQrSf4BZ2FzcAAAAmwAAAAIAAAACAAAABBnbHlmAAACdAAAEvAAABLwfpUWUWhlYWQAABVkAAAANgAAADYQp00kaGhlYQAAFZwAAAAkAAAAJAfEA+FobXR4AAAVwAAAAIQAAACEeAcD7GxvY2EAABZEAAAARAAAAERBSEX+bWF4cAAAFogAAAAgAAAAIAAsALZuYW1lAAAWqAAAAYYAAAGGmUoJ+3Bvc3QAABgwAAAAIAAAACAAAwAAAAMD3gGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA8fwDwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEAOgAAAA2ACAABAAWAAEAIOkG6Q3pEulH6Wbpd+m56bvpxunL6d/qDepc6l/qZepo6nHqefAN8BTxIPHc8fz//f//AAAAAAAg6QbpDekS6UfpZel36bnpu+nG6cvp3+oN6lzqX+pi6mjqcep38A3wFPEg8dzx/P/9//8AAf/jFv4W+Bb0FsAWoxaTFlIWURZHFkMWMBYDFbUVsxWxFa8VpxWiEA8QCQ7+DkMOJAADAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAACAAD/wAQAA8AABAATAAABNwEnAQMuAScTNwEjAQMlATUBBwGAgAHAQP5Anxc7MmOAAYDA/oDAAoABgP6ATgFAQAHAQP5A/p0yOxcBEU4BgP6A/YDAAYDA/oCAAAQAAAAABAADgAAQACEALQA0AAABOAExETgBMSE4ATEROAExITUhIgYVERQWMyEyNjURNCYjBxQGIyImNTQ2MzIWEyE1EwEzNwPA/IADgPyAGiYmGgOAGiYmGoA4KCg4OCgoOED9AOABAEDgA0D9AAMAQCYa/QAaJiYaAwAaJuAoODgoKDg4/biAAYD+wMAAAAIAAABABAADQAA4ADwAAAEmJy4BJyYjIgcOAQcGBwYHDgEHBhUUFx4BFxYXFhceARcWMzI3PgE3Njc2Nz4BNzY1NCcuAScmJwERDQED1TY4OXY8PT8/PTx2OTg2CwcICwMDAwMLCAcLNjg5djw9Pz89PHY5ODYLBwgLAwMDAwsIBwv9qwFA/sADIAgGBggCAgICCAYGCCkqKlktLi8vLi1ZKiopCAYGCAICAgIIBgYIKSoqWS0uLy8uLVkqKin94AGAwMAAAAAAAgDA/8ADQAPAABsAJwAAASIHDgEHBhUUFx4BFxYxMDc+ATc2NTQnLgEnJgMiJjU0NjMyFhUUBgIAQjs6VxkZMjJ4MjIyMngyMhkZVzo7QlBwcFBQcHADwBkZVzo7Qnh9fcxBQUFBzH19eEI7OlcZGf4AcFBQcHBQUHAAAAEAAAAABAADgAArAAABIgcOAQcGBycRISc+ATMyFx4BFxYVFAcOAQcGBxc2Nz4BNzY1NCcuAScmIwIANTIyXCkpI5YBgJA1i1BQRUZpHh4JCSIYGB5VKCAgLQwMKCiLXl1qA4AKCycbHCOW/oCQNDweHmlGRVArKClJICEaYCMrK2I2NjlqXV6LKCgAAQAAAAAEAAOAACoAABMUFx4BFxYXNyYnLgEnJjU0Nz4BNzYzMhYXByERByYnLgEnJiMiBw4BBwYADAwtICAoVR4YGCIJCR4eaUZFUFCLNZABgJYjKSlcMjI1al1eiygoAYA5NjZiKysjYBohIEkpKCtQRUZpHh48NJABgJYjHBsnCwooKIteXQAAAAACAAAAQAQBAwAAJgBNAAATMhceARcWFRQHDgEHBiMiJy4BJyY1JzQ3PgE3NjMVIgYHDgEHPgEhMhceARcWFRQHDgEHBiMiJy4BJyY1JzQ3PgE3NjMVIgYHDgEHPgHhLikpPRESEhE9KSkuLikpPRESASMjelJRXUB1LQkQBwgSAkkuKSk9ERISET0pKS4uKSk9ERIBIyN6UlFdQHUtCRAHCBICABIRPSkpLi4pKT0REhIRPSkpLiBdUVJ6IyOAMC4IEwoCARIRPSkpLi4pKT0REhIRPSkpLiBdUVJ6IyOAMC4IEwoCAQAABgBA/8AEAAPAAAMABwALABEAHQApAAAlIRUhESEVIREhFSEnESM1IzUTFTMVIzU3NSM1MxUVESM1MzUjNTM1IzUBgAKA/YACgP2AAoD9gMBAQECAwICAwMCAgICAgIACAIACAIDA/wDAQP3yMkCSPDJAku7+wEBAQEBAAAYAAP/ABAADwAADAAcACwAXACMALwAAASEVIREhFSERIRUhATQ2MzIWFRQGIyImETQ2MzIWFRQGIyImETQ2MzIWFRQGIyImAYACgP2AAoD9gAKA/YD+gEs1NUtLNTVLSzU1S0s1NUtLNTVLSzU1SwOAgP8AgP8AgANANUtLNTVLS/61NUtLNTVLS/61NUtLNTVLSwADAAAAAAQAA6AAAwANABQAADchFSElFSE1EyEVITUhJQkBIxEjEQAEAPwABAD8AIABAAEAAQD9YAEgASDggEBAwEBAAQCAgMABIP7g/wABAAAAAAACAB7/zAPiA7QAMwBkAAABIiYnJicmNDc2PwE+ATMyFhcWFxYUBwYPAQYiJyY0PwE2NCcuASMiBg8BBhQXFhQHDgEjAyImJyYnJjQ3Nj8BNjIXFhQPAQYUFx4BMzI2PwE2NCcmNDc2MhcWFxYUBwYPAQ4BIwG4ChMIIxISEhIjwCNZMTFZIyMSEhISI1gPLA8PD1gpKRQzHBwzFMApKQ8PCBMKuDFZIyMSEhISI1gPLA8PD1gpKRQzHBwzFMApKQ8PDysQIxISEhIjwCNZMQFECAckLS1eLS0kwCIlJSIkLS1eLS0kVxAQDysPWCl0KRQVFRTAKXQpDysQBwj+iCUiJC0tXi0tJFcQEA8rD1gpdCkUFRUUwCl0KQ8rEA8PJC0tXi0tJMAiJQAAAAAFAAD/wAQAA8AAGwA3AFMAXwBrAAAFMjc+ATc2NTQnLgEnJiMiBw4BBwYVFBceARcWEzIXHgEXFhUUBw4BBwYjIicuAScmNTQ3PgE3NhMyNz4BNzY3BgcOAQcGIyInLgEnJicWFx4BFxYnNDYzMhYVFAYjIiYlNDYzMhYVFAYjIiYCAGpdXosoKCgoi15dampdXosoKCgoi15dalZMTHEgISEgcUxMVlZMTHEgISEgcUxMVisrKlEmJiMFHBtWODc/Pzc4VhscBSMmJlEqK9UlGxslJRsbJQGAJRsbJSUbGyVAKCiLXl1qal1eiygoKCiLXl1qal1eiygoA6AhIHFMTFZWTExxICEhIHFMTFZWTExxICH+CQYGFRAQFEM6OlYYGRkYVjo6QxQQEBUGBvcoODgoKDg4KCg4OCgoODgAAAMAAP/ABAADwAAbADcAQwAAASIHDgEHBhUUFx4BFxYzMjc+ATc2NTQnLgEnJgMiJy4BJyY1NDc+ATc2MzIXHgEXFhUUBw4BBwYTBycHFwcXNxc3JzcCAGpdXosoKCgoi15dampdXosoKCgoi15dalZMTHEgISEgcUxMVlZMTHEgISEgcUxMSqCgYKCgYKCgYKCgA8AoKIteXWpqXV6LKCgoKIteXWpqXV6LKCj8YCEgcUxMVlZMTHEgISEgcUxMVlZMTHEgIQKgoKBgoKBgoKBgoKAAAQBl/8ADmwPAACkAAAEiJiMiBw4BBwYVFBYzLgE1NDY3MAcGAgcGBxUhEzM3IzceATMyNjcOAQMgRGhGcVNUbRobSUgGDWVKEBBLPDxZAT1sxizXNC1VJi5QGB09A7AQHh1hPj9BTTsLJjeZbwN9fv7Fj5AjGQIAgPYJDzdrCQcAAAAAAgAAAAAEAAOAAAkAFwAAJTMHJzMRIzcXIyURJyMRMxUhNTMRIwcRA4CAoKCAgKCggP8AQMCA/oCAwEDAwMACAMDAwP8AgP1AQEACwIABAAADAMAAAANAA4AAFgAfACgAAAE+ATU0Jy4BJyYjIREhMjc+ATc2NTQmATMyFhUUBisBEyMRMzIWFRQGAsQcIBQURi4vNf7AAYA1Ly5GFBRE/oRlKjw8KWafn58sPj4B2yJULzUvLkYUFPyAFBRGLi81RnQBRks1NUv+gAEASzU1SwAAAAACAMAAAANAA4AAHwAjAAABMxEUBw4BBwYjIicuAScmNREzERQWFx4BMzI2Nz4BNQEhFSECwIAZGVc6O0JCOzpXGRmAGxgcSSgoSRwYG/4AAoD9gAOA/mA8NDVOFhcXFk41NDwBoP5gHjgXGBsbGBc4Hv6ggAAAAAABAIAAAAOAA4AACwAAARUjATMVITUzASM1A4CA/sCA/kCAAUCAA4BA/QBAQAMAQAABAAAAAAQAA4AAPQAAARUjHgEVFAYHDgEjIiYnLgE1MxQWMzI2NTQmIyE1IS4BJy4BNTQ2Nz4BMzIWFx4BFSM0JiMiBhUUFjMyFhcEAOsVFjUwLHE+PnEsMDWAck5OcnJO/gABLAIEATA1NTAscT4+cSwwNYByTk5yck47bisBwEAdQSI1YiQhJCQhJGI1NExMNDRMQAEDASRiNTViJCEkJCEkYjU0TEw0NEwhHwAAAAcAAP/ABAADwAADAAcACwAPABMAGwAjAAATMxUjNzMVIyUzFSM3MxUjJTMVIwMTIRMzEyETAQMhAyMDIQMAgIDAwMABAICAwMDAAQCAgBAQ/QAQIBACgBD9QBADABAgEP2AEAHAQEBAQEBAQEBAAkD+QAHA/oABgPwAAYD+gAFA/sAAAAoAAAAABAADgAADAAcACwAPABMAFwAbAB8AIwAnAAATESERATUhFR0BITUBFSE1IxUhNREhFSElIRUhETUhFQEhFSEhNSEVAAQA/YABAP8AAQD/AED/AAEA/wACgAEA/wABAPyAAQD/AAKAAQADgPyAA4D9wMDAQMDAAgDAwMDA/wDAwMABAMDA/sDAwMAAAAUAAAAABAADgAADAAcACwAPABMAABMhFSEVIRUhESEVIREhFSERIRUhAAQA/AACgP2AAoD9gAQA/AAEAPwAA4CAQID/AIABQID/AIAAAAAABQAAAAAEAAOAAAMABwALAA8AEwAAEyEVIRchFSERIRUhAyEVIREhFSEABAD8AMACgP2AAoD9gMAEAPwABAD8AAOAgECA/wCAAUCA/wCAAAAFAAAAAAQAA4AAAwAHAAsADwATAAATIRUhBSEVIREhFSEBIRUhESEVIQAEAPwAAYACgP2AAoD9gP6ABAD8AAQA/AADgIBAgP8AgAFAgP8AgAAAAAABAD8APwLmAuYALAAAJRQPAQYjIi8BBwYjIi8BJjU0PwEnJjU0PwE2MzIfATc2MzIfARYVFA8BFxYVAuYQThAXFxCoqBAXFhBOEBCoqBAQThAWFxCoqBAXFxBOEBCoqBDDFhBOEBCoqBAQThAWFxCoqBAXFxBOEBCoqBAQThAXFxCoqBAXAAAABgAAAAADJQNuABQAKAA8AE0AVQCCAAABERQHBisBIicmNRE0NzY7ATIXFhUzERQHBisBIicmNRE0NzY7ATIXFhcRFAcGKwEiJyY1ETQ3NjsBMhcWExEhERQXFhcWMyEyNzY3NjUBIScmJyMGBwUVFAcGKwERFAcGIyEiJyY1ESMiJyY9ATQ3NjsBNzY3NjsBMhcWHwEzMhcWFQElBgUIJAgFBgYFCCQIBQaSBQUIJQgFBQUFCCUIBQWSBQUIJQgFBQUFCCUIBQVJ/gAEBAUEAgHbAgQEBAT+gAEAGwQGtQYEAfcGBQg3Ghsm/iUmGxs3CAUFBQUIsSgIFxYXtxcWFgkosAgFBgIS/rcIBQUFBQgBSQgFBgYFCP63CAUFBQUIAUkIBQYGBQj+twgFBQUFCAFJCAUGBgX+WwId/eMNCwoFBQUFCgsNAmZDBQICBVUkCAYF/eMwIiMhIi8CIAUGCCQIBQVgFQ8PDw8VYAUFCAACAAcASQO3Aq8AGgAuAAAJAQYjIi8BJjU0PwEnJjU0PwE2MzIXARYVFAcBFRQHBiMhIicmPQE0NzYzITIXFgFO/vYGBwgFHQYG4eEGBh0FCAcGAQoGBgJpBQUI/dsIBQUFBQgCJQgFBQGF/vYGBhwGCAcG4OEGBwcGHQUF/vUFCAcG/vslCAUFBQUIJQgFBQUFAAAAAQAjAAAD3QNuALMAACUiJyYjIgcGIyInJjU0NzY3Njc2NzY9ATQnJiMhIgcGHQEUFxYXFjMWFxYVFAcGIyInJiMiBwYjIicmNTQ3Njc2NzY3Nj0BETQ1NDU0JzQnJicmJyYnJicmIyInJjU0NzYzMhcWMzI3NjMyFxYVFAcGIwYHBgcGHQEUFxYzITI3Nj0BNCcmJyYnJjU0NzYzMhcWMzI3NjMyFxYVFAcGByIHBgcGFREUFxYXFhcyFxYVFAcGIwPBGTMyGhkyMxkNCAcJCg0MERAKEgEHFf5+FgcBFQkSEw4ODAsHBw4bNTUaGDExGA0HBwkJCwwQDwkSAQIBAgMEBAUIEhENDQoLBwcOGjU1GhgwMRgOBwcJCgwNEBAIFAEHDwGQDgcBFAoXFw8OBwcOGTMyGRkxMRkOBwcKCg0NEBEIFBQJEREODQoLBwcOAAICAgIMCw8RCQkBAQMDBQxE4AwFAwMFDNRRDQYBAgEICBIPDA0CAgICDAwOEQgJAQIDAwUNRSEB0AINDQgIDg4KCgsLBwcDBgEBCAgSDwwNAgICAg0MDxEICAECAQYMULYMBwEBBwy2UAwGAQEGBxYPDA0CAgICDQwPEQgIAQECBg1P/eZEDAYCAgEJCBEPDA0AAAIAAP+3A/8DtwATADkAAAEyFxYVFAcCBwYjIicmNTQ3ATYzARYXFh8BFgcGIyInJicmJyY1FhcWFxYXFjMyNzY3Njc2NzY3NjcDmygeHhq+TDdFSDQ0NQFtISn9+BcmJy8BAkxMe0c2NiEhEBEEExQQEBIRCRcIDxITFRUdHR4eKQO3GxooJDP+mUY0NTRJSTABSx/9sSsfHw0oek1MGhsuLzo6RAMPDgsLCgoWJRsaEREKCwQEAgABAAAAAAAA9evv618PPPUACwQAAAAAANbEBFgAAAAA1sQEWAAA/7cEAQPAAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAD//wQBAAEAAAAAAAAAAAAAAAAAAAAhBAAAAAAAAAAAAAAAAgAAAAQAAAAEAAAABAAAAAQAAMAEAAAABAAAAAQAAAAEAABABAAAAAQAAAAEAAAeBAAAAAQAAAAEAABlBAAAAAQAAMAEAADABAAAgAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAMlAD8DJQAAA74ABwQAACMD/wAAAAAAAAAKABQAHgBMAJQA+AE2AXwBwgI2AnQCvgLoA34EHgSIBMoE8gU0BXAFiAXgBiIGagaSBroG5AcoB+AIKgkcCXgAAQAAACEAtAAKAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGljb21vb24AaQBjAG8AbQBvAG8AblZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGljb21vb24AaQBjAG8AbQBvAG8Abmljb21vb24AaQBjAG8AbQBvAG8AblJlZ3VsYXIAUgBlAGcAdQBsAGEAcmljb21vb24AaQBjAG8AbQBvAG8AbkZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=) format(\'truetype\'); font-weight: normal; font-style: normal;}[class^="w-e-icon-"],[class*=" w-e-icon-"] { /* use !important to prevent issues with browser extensions that change fonts */ font-family: \'w-e-icon\' !important; speak: none; font-style: normal; font-weight: normal; font-variant: normal; text-transform: none; line-height: 1; /* Better Font Rendering =========== */ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;}.w-e-icon-close:before { content: "\\f00d";}.w-e-icon-upload2:before { content: "\\e9c6";}.w-e-icon-trash-o:before { content: "\\f014";}.w-e-icon-header:before { content: "\\f1dc";}.w-e-icon-pencil2:before { content: "\\e906";}.w-e-icon-paint-brush:before { content: "\\f1fc";}.w-e-icon-image:before { content: "\\e90d";}.w-e-icon-play:before { content: "\\e912";}.w-e-icon-location:before { content: "\\e947";}.w-e-icon-undo:before { content: "\\e965";}.w-e-icon-redo:before { content: "\\e966";}.w-e-icon-quotes-left:before { content: "\\e977";}.w-e-icon-list-numbered:before { content: "\\e9b9";}.w-e-icon-list2:before { content: "\\e9bb";}.w-e-icon-link:before { content: "\\e9cb";}.w-e-icon-happy:before { content: "\\e9df";}.w-e-icon-bold:before { content: "\\ea62";}.w-e-icon-underline:before { content: "\\ea63";}.w-e-icon-italic:before { content: "\\ea64";}.w-e-icon-strikethrough:before { content: "\\ea65";}.w-e-icon-table2:before { content: "\\ea71";}.w-e-icon-paragraph-left:before { content: "\\ea77";}.w-e-icon-paragraph-center:before { content: "\\ea78";}.w-e-icon-paragraph-right:before { content: "\\ea79";}.w-e-icon-terminal:before { content: "\\f120";}.w-e-icon-page-break:before { content: "\\ea68";}.w-e-icon-cancel-circle:before { content: "\\ea0d";}.w-e-icon-font:before { content: "\\ea5c";}.w-e-icon-text-heigh:before { content: "\\ea5f";}.w-e-toolbar { display: -webkit-box; display: -ms-flexbox; display: flex; padding: 0 5px; /* flex-wrap: wrap; */ /* 单个菜单 */}.w-e-toolbar .w-e-menu { position: relative; text-align: center; padding: 5px 10px; cursor: pointer;}.w-e-toolbar .w-e-menu i { color: #999;}.w-e-toolbar .w-e-menu:hover i { color: #333;}.w-e-toolbar .w-e-active i { color: #1e88e5;}.w-e-toolbar .w-e-active:hover i { color: #1e88e5;}.w-e-text-container .w-e-panel-container { position: absolute; top: 0; left: 50%; border: 1px solid #ccc; border-top: 0; box-shadow: 1px 1px 2px #ccc; color: #333; background-color: #fff; /* 为 emotion panel 定制的样式 */ /* 上传图片的 panel 定制样式 */}.w-e-text-container .w-e-panel-container .w-e-panel-close { position: absolute; right: 0; top: 0; padding: 5px; margin: 2px 5px 0 0; cursor: pointer; color: #999;}.w-e-text-container .w-e-panel-container .w-e-panel-close:hover { color: #333;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-title { list-style: none; display: -webkit-box; display: -ms-flexbox; display: flex; font-size: 14px; margin: 2px 10px 0 10px; border-bottom: 1px solid #f1f1f1;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-title .w-e-item { padding: 3px 5px; color: #999; cursor: pointer; margin: 0 3px; position: relative; top: 1px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-title .w-e-active { color: #333; border-bottom: 1px solid #333; cursor: default; font-weight: 700;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content { padding: 10px 15px 10px 15px; font-size: 16px; /* 输入框的样式 */ /* 按钮的样式 */}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input:focus,.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea:focus,.w-e-text-container .w-e-panel-container .w-e-panel-tab-content button:focus { outline: none;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea { width: 100%; border: 1px solid #ccc; padding: 5px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea:focus { border-color: #1e88e5;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text] { border: none; border-bottom: 1px solid #ccc; font-size: 14px; height: 20px; color: #333; text-align: left;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text].small { width: 30px; text-align: center;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text].block { display: block; width: 100%; margin: 10px 0;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text]:focus { border-bottom: 2px solid #1e88e5;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button { font-size: 14px; color: #1e88e5; border: none; padding: 5px 10px; background-color: #fff; cursor: pointer; border-radius: 3px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.left { float: left; margin-right: 10px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.right { float: right; margin-left: 10px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.gray { color: #999;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.red { color: #c24f4a;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button:hover { background-color: #f1f1f1;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container:after { content: ""; display: table; clear: both;}.w-e-text-container .w-e-panel-container .w-e-emoticon-container .w-e-item { cursor: pointer; font-size: 18px; padding: 0 3px; display: inline-block; *display: inline; *zoom: 1;}.w-e-text-container .w-e-panel-container .w-e-up-img-container { text-align: center;}.w-e-text-container .w-e-panel-container .w-e-up-img-container .w-e-up-btn { display: inline-block; *display: inline; *zoom: 1; color: #999; cursor: pointer; font-size: 60px; line-height: 1;}.w-e-text-container .w-e-panel-container .w-e-up-img-container .w-e-up-btn:hover { color: #333;}.w-e-text-container { position: relative;}.w-e-text-container .w-e-progress { position: absolute; background-color: #1e88e5; bottom: 0; left: 0; height: 1px;}.w-e-text { padding: 0 10px; overflow-y: scroll;}.w-e-text p,.w-e-text h1,.w-e-text h2,.w-e-text h3,.w-e-text h4,.w-e-text h5,.w-e-text table,.w-e-text pre { margin: 10px 0; line-height: 1.5;}.w-e-text ul,.w-e-text ol { margin: 10px 0 10px 20px;}.w-e-text blockquote { display: block; border-left: 8px solid #d0e5f2; padding: 5px 10px; margin: 10px 0; line-height: 1.4; font-size: 100%; background-color: #f1f1f1;}.w-e-text code { display: inline-block; *display: inline; *zoom: 1; background-color: #f1f1f1; border-radius: 3px; padding: 3px 5px; margin: 0 3px;}.w-e-text pre code { display: block;}.w-e-text table { border-top: 1px solid #ccc; border-left: 1px solid #ccc;}.w-e-text table td,.w-e-text table th { border-bottom: 1px solid #ccc; border-right: 1px solid #ccc; padding: 3px 5px;}.w-e-text table th { border-bottom: 2px solid #ccc; text-align: center;}.w-e-text:focus { outline: none;}.w-e-text img { cursor: pointer;}.w-e-text img:hover { box-shadow: 0 0 5px #333;}'; + +// 将 css 代码添加到 + + +
          + +
          + + + + + + \ No newline at end of file diff --git a/public/admin/page/404.html b/public/admin/page/404.html new file mode 100644 index 0000000..eeb0a33 --- /dev/null +++ b/public/admin/page/404.html @@ -0,0 +1,110 @@ + + + + + 404 + + + + + + + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + +
          +
          +
          +
          + +
          +
          +
          OH! + +
          +
          +

          很抱歉,你访问的页面找不到了

          +
          +
          +
          + + + + \ No newline at end of file diff --git a/public/admin/page/account.html b/public/admin/page/account.html new file mode 100644 index 0000000..8a4c112 --- /dev/null +++ b/public/admin/page/account.html @@ -0,0 +1,101 @@ + + + + + 管理员配置 + + + + + + + + +
          +
          +
          +
          +
          管理员配置
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          + +
          +
          + +
          +
          + +
          +
          +
          +
          + + + + + + + \ No newline at end of file diff --git a/public/admin/page/category.html b/public/admin/page/category.html new file mode 100644 index 0000000..cb70c1c --- /dev/null +++ b/public/admin/page/category.html @@ -0,0 +1,239 @@ + + + + + 分类管理 + + + + + + + + +
          +
          + +
          + 搜索信息 +
          +
          +
          +
          + +
          + +
          +
          +
          + + +
          +
          +
          +
          +
          + + + +
          + + + +
          +
          + + + + + \ No newline at end of file diff --git a/public/admin/page/category/add.html b/public/admin/page/category/add.html new file mode 100644 index 0000000..d957492 --- /dev/null +++ b/public/admin/page/category/add.html @@ -0,0 +1,84 @@ + + + + + 添加分类 + + + + + + + + +
          +
          + +
          + + 分类标题,随便取一个吧,相信天才的你一定能都做到 +
          +
          +
          + +
          + + 填写示例:icon ni ni-box,查询地址 +
          +
          +
          + +
          + + 填数字,数字越大排名越前。 +
          +
          + +
          +
          + +
          +
          +
          + + + + + + \ No newline at end of file diff --git a/public/admin/page/category/edit.html b/public/admin/page/category/edit.html new file mode 100644 index 0000000..f51cece --- /dev/null +++ b/public/admin/page/category/edit.html @@ -0,0 +1,99 @@ + + + + + 编辑分类 + + + + + + + + +
          + +
          + +
          + + 分类标题,随便取一个吧,相信天才的你一定能都做到 +
          +
          +
          + +
          + + 填写示例:icon ni ni-box,查询地址 +
          +
          +
          + +
          + + 填数字,数字越大排名越前。 +
          +
          + +
          +
          + +
          +
          +
          + + + + + + \ No newline at end of file diff --git a/public/admin/page/comment.html b/public/admin/page/comment.html new file mode 100644 index 0000000..08768ee --- /dev/null +++ b/public/admin/page/comment.html @@ -0,0 +1,238 @@ + + + + + 留言管理 + + + + + + + + +
          +
          + +
          + 搜索信息 +
          +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + + +
          +
          +
          +
          +
          + + + +
          + + + + + +
          +
          + + + + + + \ No newline at end of file diff --git a/public/admin/page/comment/edit.html b/public/admin/page/comment/edit.html new file mode 100644 index 0000000..93774d2 --- /dev/null +++ b/public/admin/page/comment/edit.html @@ -0,0 +1,99 @@ + + + + + 编辑留言 + + + + + + + + +
          + +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          + +
          +
          +
          + + + + + + \ No newline at end of file diff --git a/public/admin/page/dashboard.html b/public/admin/page/dashboard.html new file mode 100644 index 0000000..2ad263f --- /dev/null +++ b/public/admin/page/dashboard.html @@ -0,0 +1,225 @@ + + + + + 主页 + + + + + + + + + +
          + +
          +
          + +
          +
            工具总数
          +
          +
          +
          + 0 +
          +
          +
          +
          + +
          +
          + +
          +
            留言总数
          +
          +
          +
          + 0 +
          +
          +
          +
          + +
          +
          + +
          +
            用户总数
          +
          +
          +
          + 0 +
          +
          +
          +
          + +
          +
          + +
          +
            今日新增用户
          +
          +
          +
          + 0 +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
            服务器信息
          +
          +
          +
          +
          +
          +
          +
            版本信息
          +
          +
          +
          +
          +
          + + +
          + + + + + + + + + + diff --git a/public/admin/page/link.html b/public/admin/page/link.html new file mode 100644 index 0000000..a98253c --- /dev/null +++ b/public/admin/page/link.html @@ -0,0 +1,243 @@ + + + + + 友链管理 + + + + + + + + +
          +
          + +
          + 搜索信息 +
          +
          +
          +
          + +
          + +
          +
          +
          + + +
          +
          +
          +
          +
          + + + +
          + + + +
          +
          + + + + + \ No newline at end of file diff --git a/public/admin/page/link/add.html b/public/admin/page/link/add.html new file mode 100644 index 0000000..9b3b848 --- /dev/null +++ b/public/admin/page/link/add.html @@ -0,0 +1,82 @@ + + + + + 添加友链 + + + + + + + + +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + + 填数字,数字越大排名越前。 +
          +
          +
          + +
          + +
          +
          +
          +
          + +
          +
          +
          + + + + + + \ No newline at end of file diff --git a/public/admin/page/link/edit.html b/public/admin/page/link/edit.html new file mode 100644 index 0000000..6d6033a --- /dev/null +++ b/public/admin/page/link/edit.html @@ -0,0 +1,97 @@ + + + + + 编辑友链 + + + + + + + + +
          + +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + + 填数字,数字越大排名越前。 +
          +
          +
          + +
          + +
          +
          +
          +
          + +
          +
          +
          + + + + + + \ No newline at end of file diff --git a/public/admin/page/plugin.html b/public/admin/page/plugin.html new file mode 100644 index 0000000..fe3925b --- /dev/null +++ b/public/admin/page/plugin.html @@ -0,0 +1,331 @@ + + + + + 插件管理 + + + + + + + + + +
          +
          + +
          + 搜索信息 +
          +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + + +
          +
          +
          +
          +
          + + + + + +
          + + + +
          +
          + + + + + + \ No newline at end of file diff --git a/public/admin/page/plugin/add.html b/public/admin/page/plugin/add.html new file mode 100644 index 0000000..ac516d6 --- /dev/null +++ b/public/admin/page/plugin/add.html @@ -0,0 +1,164 @@ + + + + + 添加插件 + + + + + + + + +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + + 也就是浏览器地址栏,域名后面的那一串 +
          +
          +
          + +
          + + 插件的类名,包名+插件名,例如:utility\example。 +
          +
          +
          + +
          + + 用于搜索的关键词,多个用英文逗号,隔开 +
          +
          +
          + +
          + + 填数字,数字越大排名越前。 +
          +
          + +
          + +
          + +
          +
          +
          + +
          + + 用户等级小于该数字的不会显示该工具 +
          +
          + +
          +
          + +
          +
          +
          + + + + + + + + \ No newline at end of file diff --git a/public/admin/page/plugin/edit.html b/public/admin/page/plugin/edit.html new file mode 100644 index 0000000..5b5b2f5 --- /dev/null +++ b/public/admin/page/plugin/edit.html @@ -0,0 +1,173 @@ + + + + + 编辑插件 + + + + + + + + +
          + +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + + 也就是浏览器地址栏,域名后面的那一串 +
          +
          +
          + +
          + + 插件的类名,包名+插件名,例如:utility\example。 +
          +
          +
          + +
          + + 用于搜索的关键词,多个用英文逗号,隔开 +
          +
          +
          + +
          + + 填数字,数字越大排名越前。 +
          +
          + +
          + +
          + +
          +
          +
          + +
          + + 用户等级小于该数字的不会显示该工具 +
          +
          + +
          +
          + +
          +
          +
          + + + + + + + + \ No newline at end of file diff --git a/public/admin/page/plugin/install.html b/public/admin/page/plugin/install.html new file mode 100644 index 0000000..9906a27 --- /dev/null +++ b/public/admin/page/plugin/install.html @@ -0,0 +1,213 @@ + + + + + 安装新插件 + + + + + + + + +
          +
          + +
          +
          +
          + +
          +
          +

          说明


          +

          安装新插件

          +

          上传符合插件格式的zip压缩包

          +
          +
          +
          +
          + +
          +
          + + + + + + + + \ No newline at end of file diff --git a/public/admin/page/system.html b/public/admin/page/system.html new file mode 100644 index 0000000..7357884 --- /dev/null +++ b/public/admin/page/system.html @@ -0,0 +1,236 @@ + + + + + 系统配置 + + + + + + + + +
          +
          +
          +
          +
          系统配置
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          模板选择
          +
          + +
          + +
          +
          +
          登录配置
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          极验滑动验证码V4配置
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          CDN地址配置 +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          + +
          +
          + +
          +
          + +
          +
          +
          +
          + + + + + + + \ No newline at end of file diff --git a/public/admin/page/update.html b/public/admin/page/update.html new file mode 100644 index 0000000..2461d41 --- /dev/null +++ b/public/admin/page/update.html @@ -0,0 +1,167 @@ + + + + + 在线升级 + + + + + + + + +
          +
          +
          +
          +
          在线升级
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          + + +
          +
          + +
          +
          +
          +
          + + + + + + \ No newline at end of file diff --git a/public/admin/page/uploadlog.html b/public/admin/page/uploadlog.html new file mode 100644 index 0000000..414f16d --- /dev/null +++ b/public/admin/page/uploadlog.html @@ -0,0 +1,154 @@ + + + + + 上传记录 + + + + + + + + +
          +
          + +
          + 搜索信息 +
          +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + + +
          +
          +
          +
          +
          + + + +
          + + + + + + + +
          +
          + + + + + + \ No newline at end of file diff --git a/public/admin/page/user.html b/public/admin/page/user.html new file mode 100644 index 0000000..998b94f --- /dev/null +++ b/public/admin/page/user.html @@ -0,0 +1,227 @@ + + + + + 用户管理 + + + + + + + + +
          +
          + +
          + 搜索信息 +
          +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + + +
          +
          +
          +
          +
          + + + +
          + + + + +
          +
          + + + + + + \ No newline at end of file diff --git a/public/assets/alipay_arrival/diaoluo_da.mp3 b/public/assets/alipay_arrival/diaoluo_da.mp3 new file mode 100644 index 0000000..313f2f1 Binary files /dev/null and b/public/assets/alipay_arrival/diaoluo_da.mp3 differ diff --git a/public/assets/alipay_arrival/tts_0.mp3 b/public/assets/alipay_arrival/tts_0.mp3 new file mode 100644 index 0000000..dd3ac36 Binary files /dev/null and b/public/assets/alipay_arrival/tts_0.mp3 differ diff --git a/public/assets/alipay_arrival/tts_1.mp3 b/public/assets/alipay_arrival/tts_1.mp3 new file mode 100644 index 0000000..99ad676 Binary files /dev/null and b/public/assets/alipay_arrival/tts_1.mp3 differ diff --git a/public/assets/alipay_arrival/tts_2.mp3 b/public/assets/alipay_arrival/tts_2.mp3 new file mode 100644 index 0000000..a153ae3 Binary files /dev/null and b/public/assets/alipay_arrival/tts_2.mp3 differ diff --git a/public/assets/alipay_arrival/tts_3.mp3 b/public/assets/alipay_arrival/tts_3.mp3 new file mode 100644 index 0000000..baa147f Binary files /dev/null and b/public/assets/alipay_arrival/tts_3.mp3 differ diff --git a/public/assets/alipay_arrival/tts_4.mp3 b/public/assets/alipay_arrival/tts_4.mp3 new file mode 100644 index 0000000..617438a Binary files /dev/null and b/public/assets/alipay_arrival/tts_4.mp3 differ diff --git a/public/assets/alipay_arrival/tts_5.mp3 b/public/assets/alipay_arrival/tts_5.mp3 new file mode 100644 index 0000000..2ee5ee0 Binary files /dev/null and b/public/assets/alipay_arrival/tts_5.mp3 differ diff --git a/public/assets/alipay_arrival/tts_6.mp3 b/public/assets/alipay_arrival/tts_6.mp3 new file mode 100644 index 0000000..94deb89 Binary files /dev/null and b/public/assets/alipay_arrival/tts_6.mp3 differ diff --git a/public/assets/alipay_arrival/tts_7.mp3 b/public/assets/alipay_arrival/tts_7.mp3 new file mode 100644 index 0000000..baebe24 Binary files /dev/null and b/public/assets/alipay_arrival/tts_7.mp3 differ diff --git a/public/assets/alipay_arrival/tts_8.mp3 b/public/assets/alipay_arrival/tts_8.mp3 new file mode 100644 index 0000000..65ee4e7 Binary files /dev/null and b/public/assets/alipay_arrival/tts_8.mp3 differ diff --git a/public/assets/alipay_arrival/tts_9.mp3 b/public/assets/alipay_arrival/tts_9.mp3 new file mode 100644 index 0000000..b7d5312 Binary files /dev/null and b/public/assets/alipay_arrival/tts_9.mp3 differ diff --git a/public/assets/alipay_arrival/tts_dot.mp3 b/public/assets/alipay_arrival/tts_dot.mp3 new file mode 100644 index 0000000..e763b0e Binary files /dev/null and b/public/assets/alipay_arrival/tts_dot.mp3 differ diff --git a/public/assets/alipay_arrival/tts_hundred.mp3 b/public/assets/alipay_arrival/tts_hundred.mp3 new file mode 100644 index 0000000..166a2fe Binary files /dev/null and b/public/assets/alipay_arrival/tts_hundred.mp3 differ diff --git a/public/assets/alipay_arrival/tts_koubei_daibo.mp3 b/public/assets/alipay_arrival/tts_koubei_daibo.mp3 new file mode 100644 index 0000000..53d717f Binary files /dev/null and b/public/assets/alipay_arrival/tts_koubei_daibo.mp3 differ diff --git a/public/assets/alipay_arrival/tts_success.mp3 b/public/assets/alipay_arrival/tts_success.mp3 new file mode 100644 index 0000000..6a7fa05 Binary files /dev/null and b/public/assets/alipay_arrival/tts_success.mp3 differ diff --git a/public/assets/alipay_arrival/tts_ten.mp3 b/public/assets/alipay_arrival/tts_ten.mp3 new file mode 100644 index 0000000..670c233 Binary files /dev/null and b/public/assets/alipay_arrival/tts_ten.mp3 differ diff --git a/public/assets/alipay_arrival/tts_ten_million.mp3 b/public/assets/alipay_arrival/tts_ten_million.mp3 new file mode 100644 index 0000000..a0b2d4c Binary files /dev/null and b/public/assets/alipay_arrival/tts_ten_million.mp3 differ diff --git a/public/assets/alipay_arrival/tts_ten_thousand.mp3 b/public/assets/alipay_arrival/tts_ten_thousand.mp3 new file mode 100644 index 0000000..7e99650 Binary files /dev/null and b/public/assets/alipay_arrival/tts_ten_thousand.mp3 differ diff --git a/public/assets/alipay_arrival/tts_thousand.mp3 b/public/assets/alipay_arrival/tts_thousand.mp3 new file mode 100644 index 0000000..7cbdd75 Binary files /dev/null and b/public/assets/alipay_arrival/tts_thousand.mp3 differ diff --git a/public/assets/alipay_arrival/tts_yuan.mp3 b/public/assets/alipay_arrival/tts_yuan.mp3 new file mode 100644 index 0000000..d445bd9 Binary files /dev/null and b/public/assets/alipay_arrival/tts_yuan.mp3 differ diff --git a/public/assets/piano/static/css/app.218482323009eabe26ecb9ee84758303.css b/public/assets/piano/static/css/app.218482323009eabe26ecb9ee84758303.css new file mode 100644 index 0000000..58b9158 --- /dev/null +++ b/public/assets/piano/static/css/app.218482323009eabe26ecb9ee84758303.css @@ -0,0 +1 @@ +/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}.icon,.icon-alipay{background-image:url(/static/img/sprite.3c2f760.png)}.icon-alipay{display:inline-block;width:64px;height:64px;background-position:0 0;vertical-align:top}.icon-cherry{background-position:-64px -64px;background-image:url(/static/img/sprite.3c2f760.png)}.icon-cherry,.icon-heartbeat{display:inline-block;width:32px;height:32px;vertical-align:top}.icon-heartbeat{background-position:-96px -64px}.icon-heartbeat,.icon-hot{background-image:url(/static/img/sprite.3c2f760.png)}.icon-hot{background-position:-64px -96px}.icon-hot,.icon-pause{display:inline-block;width:32px;height:32px;vertical-align:top}.icon-pause{background-position:-96px -96px}.icon-pause,.icon-piano{background-image:url(/static/img/sprite.3c2f760.png)}.icon-piano{width:64px;height:64px;background-position:-64px 0}.icon-piano,.icon-star{display:inline-block;vertical-align:top}.icon-star{width:32px;height:32px;background-position:-128px 0}.icon-star,.icon-wxpay{background-image:url(/static/img/sprite.3c2f760.png)}.icon-wxpay{display:inline-block;width:64px;height:64px;background-position:0 -64px;vertical-align:top}@media screen and (max-width:1365px){#app .responsive-section-a{width:90%}}@media screen and (min-width:1366px) and (max-width:1599px){#app .responsive-section-a{width:87.5%}}@media screen and (min-width:1600px) and (max-width:1919px){#app .responsive-section-a{width:85%}}@media screen and (min-width:1920px){#app .responsive-section-a{width:80%}#app .component-autopiano .piano-wrap .piano-band{height:45px;line-height:45px;background-size:135px 45px}}.clearfix{clear:both;*zoom:1}.clearfix:before{content:"";display:block}.clearfix:after{content:"";display:table;height:0;clear:both}::-webkit-scrollbar{width:0;height:0;background-color:#f5f5f5;display:none}*{margin:0;padding:0;box-sizing:border-box;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;-webkit-overflow-scrolling:touch;scrollbar-width:none}*,body,html{-webkit-user-select:none;-ms-user-select:none;user-select:none}body,html{position:relative;overflow-x:scroll;overflow-y:hidden;color:#373737}#app,body,html{width:100%;height:100%}a{text-decoration:none;color:#373737} \ No newline at end of file diff --git a/public/assets/piano/static/css/share.min.css b/public/assets/piano/static/css/share.min.css new file mode 100644 index 0000000..fc7285b --- /dev/null +++ b/public/assets/piano/static/css/share.min.css @@ -0,0 +1 @@ +@font-face{font-family:"socialshare";src:url("../fonts/iconfont.eot");src:url("../fonts/iconfont.eot?#iefix") format("embedded-opentype"),url("../fonts/iconfont.woff") format("woff"),url("../fonts/iconfont.ttf") format("truetype"),url("../fonts/iconfont.svg#iconfont") format("svg")}.social-share{font-family:"socialshare" !important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-webkit-text-stroke-width:0.2px;-moz-osx-font-smoothing:grayscale}.social-share *{font-family:"socialshare" !important}.social-share .icon-tencent:before{content:"\f07a"}.social-share .icon-qq:before{content:"\f11a"}.social-share .icon-weibo:before{content:"\f12a"}.social-share .icon-wechat:before{content:"\f09a"}.social-share .icon-douban:before{content:"\f10a"}.social-share .icon-heart:before{content:"\f20a"}.social-share .icon-like:before{content:"\f00a"}.social-share .icon-qzone:before{content:"\f08a"}.social-share .icon-linkedin:before{content:"\f01a"}.social-share .icon-diandian:before{content:"\f05a"}.social-share .icon-facebook:before{content:"\f03a"}.social-share .icon-google:before{content:"\f04a"}.social-share .icon-twitter:before{content:"\f06a"}.social-share a{position:relative;text-decoration:none;margin:4px;display:inline-block;outline:none}.social-share .social-share-icon{position:relative;display:inline-block;width:32px;height:32px;font-size:20px;border-radius:50%;line-height:32px;border:1px solid #666;color:#666;text-align:center;vertical-align:middle;transition:background 0.6s ease-out 0s}.social-share .social-share-icon:hover{background:#666;color:#fff}.social-share .icon-weibo{color:#ff763b;border-color:#ff763b}.social-share .icon-weibo:hover{background:#ff763b}.social-share .icon-tencent{color:#56b6e7;border-color:#56b6e7}.social-share .icon-tencent:hover{background:#56b6e7}.social-share .icon-qq{color:#56b6e7;border-color:#56b6e7}.social-share .icon-qq:hover{background:#56b6e7}.social-share .icon-qzone{color:#FDBE3D;border-color:#FDBE3D}.social-share .icon-qzone:hover{background:#FDBE3D}.social-share .icon-douban{color:#33b045;border-color:#33b045}.social-share .icon-douban:hover{background:#33b045}.social-share .icon-linkedin{color:#0077B5;border-color:#0077B5}.social-share .icon-linkedin:hover{background:#0077B5}.social-share .icon-facebook{color:#44619D;border-color:#44619D}.social-share .icon-facebook:hover{background:#44619D}.social-share .icon-google{color:#db4437;border-color:#db4437}.social-share .icon-google:hover{background:#db4437}.social-share .icon-twitter{color:#55acee;border-color:#55acee}.social-share .icon-twitter:hover{background:#55acee}.social-share .icon-diandian{color:#307DCA;border-color:#307DCA}.social-share .icon-diandian:hover{background:#307DCA}.social-share .icon-wechat{position:relative;color:#7bc549;border-color:#7bc549}.social-share .icon-wechat:hover{background:#7bc549}.social-share .icon-wechat .wechat-qrcode{display:none;border:1px solid #eee;position:absolute;z-index:9;top:-205px;left:-84px;width:200px;height:192px;color:#666;font-size:12px;text-align:center;background-color:#fff;box-shadow:0 2px 10px #aaa;transition:all 200ms;-webkit-tansition:all 350ms;-moz-transition:all 350ms}.social-share .icon-wechat .wechat-qrcode.bottom{top:40px;left:-84px}.social-share .icon-wechat .wechat-qrcode.bottom:after{display:none}.social-share .icon-wechat .wechat-qrcode h4{font-weight:normal;height:26px;line-height:26px;font-size:12px;background-color:#f3f3f3;margin:0;padding:0;color:#777}.social-share .icon-wechat .wechat-qrcode .qrcode{width:105px;margin:10px auto}.social-share .icon-wechat .wechat-qrcode .qrcode table{margin:0 !important}.social-share .icon-wechat .wechat-qrcode .help p{font-weight:normal;line-height:16px;padding:0;margin:0}.social-share .icon-wechat .wechat-qrcode:after{content:'';position:absolute;left:50%;margin-left:-6px;bottom:-13px;width:0;height:0;border-width:8px 6px 6px 6px;border-style:solid;border-color:#fff transparent transparent transparent}.social-share .icon-wechat:hover .wechat-qrcode{display:block} diff --git a/public/assets/piano/static/data/goods.json b/public/assets/piano/static/data/goods.json new file mode 100644 index 0000000..b1d96af --- /dev/null +++ b/public/assets/piano/static/data/goods.json @@ -0,0 +1,92 @@ +[{ + "esite": "jd", + "name": "简谱钢琴即兴伴奏教程", + "price": "¥26.7", + "salePerMonth": 132, + "seller": "湖南文艺出版社", + "pic": "5b3b338fNad1559cd.jpg", + "link": "https://union-click.jd.com/jdc?e=&p=AyIGZRtYFAcXBFIZWR0yEgdQGlwdBBo3EUQDS10iXhBeGlcJDBkNXg9JHU4YDk5ER1xOGRNLGEEcVV8BXURFUFdfC0RVU1JRUy1OVxUCFwZSE10dMnZfHlkMZVdHZCZTAlN2VkcBSARvWlQLWStaJQITBlUdWBMDEgVlK1sSMkBpja3tzaejG4Gx1MCKhTdUK1sRBRYEXBpeEgUQA1wrXBULIkwMRR9OWktXC0AOJTIiBGUraxUyETcXdQlGVUIOVRJYRwcSD1AcD0YLRVNQHF0XABdTVExeQAYWN1caWhEL", + "valid": true +}, { + "esite": "jd", + "name": "钢琴即兴弹奏流行歌曲100首(简谱版)", + "price": "¥31.10", + "salePerMonth": 57, + "seller": "化学工业出版社", + "pic": "5d4808c716acb007.jpg", + "link": "https://union-click.jd.com/jdc?e=&p=AyIGZRtYFAcXBFIZWR0yEgRRGFgdBxY3EUQDS10iXhBeGlcJDBkNXg9JHU4YDk5ER1xOGRNLGEEcVV8BXURFUFdfC0RVU1JRUy1OVxUBFgRWE14RMhdaEX0ZS2lLZU8BHXdpFGIeUDlLUWILWStaJQITBlUdWBMDEgVlK1sSMkBpja3tzaejG4Gx1MCKhTdUK1sRBRYFURteHAsSBFMrXBULIkwMRR9OWktXC0AOJTIiBGUraxUyETcXdVlCUUZXBh5eQQAUBVAYXUdRFABWHgsSUBZSBRJdEQVFN1caWhEL", + "valid": true +}, { + "esite": "jd", + "name": "拿起就会!流行钢琴曲超精选", + "price": "¥33.8", + "salePerMonth": 147, + "seller": "湖南文艺出版社", + "pic": "bc56ea5a17a35998.jpg", + "link": "https://union-click.jd.com/jdc?e=&p=AyIGZRtYFAcXBFIZWR0yEgRQHlITBRc3EUQDS10iXhBeGlcJDBkNXg9JHU4YDk5ER1xOGRNLGEEcVV8BXURFUFdfC0RVU1JRUy1OVxUBFwJcHVwQMm9HKxs4SloWZQNlIF1QVV4HQyZjGEQLWStaJQITBlUdWBMDEgVlK1sSMkBpja3tzaejG4Gx1MCKhTdUK1sRBRYFURtdEAobBVMrXBULIkwMRR9OWktXC0AOJTIiBGUraxUyETcXdV0XBBNTAk8OQQISBlAdX0ULQldcSFoUChIGVhkIHAFHN1caWhEL", + "valid": true +}, { + "esite": "jd", + "name": "卡西欧(CASIO)电子琴 CTK-2500", + "price": "¥699", + "salePerMonth": 684, + "seller": "卡西欧京东自营旗舰店", + "pic": "b8b5a95542c993d2.jpg", + "link": "https://union-click.jd.com/jdc?e=&p=AyIGZRtcFwYUBVQcWBEyFwJWEl0TBCJDCkMFSjJLQhBaGR4cDF8QTwcKXg1cAAQJS14MQQVYDwtFSlMTBAtHR0pZChUdRUFGfwAXXhABGwFTHWtpZHIGNnguQ2BvUzZZQVFcZ2IKbVhlDh43VCtbFAMSAVYdWhUAIjdVHGtXbMa7xcLPm9WPkYCT%2BsGqi9Leho%2Bjtcq2%2FszgsdW3iGUaaxUGFQNWHV8TCxEEVhprEgIbNx5CBVFZSl4FRQBAMiI3VitrJQIiBGVZNRRRFAYFGlgTARMDUx4OEgFBBAYSXkIEFAVTH1MRBhFSZRlaFAYb", + "valid": true +}, { + "esite": "jd", + "name": "雅马哈(YAMAHA)PSR-E363", + "price": "¥945", + "salePerMonth": 690, + "seller": "雅马哈(YAMAHA)京东自营专卖店", + "pic": "05d7da9f7a83f31b.jpg", + "link": "https://union-click.jd.com/jdc?e=&p=AyIGZRprEQARB1cbWCVGTV8LRGtMR1dGFxBFC1pXUwkEBwpZRxgHRQcLREJEAQUcTVZUGAVJHk1cTQkTSxhBekcLURlYFQASBGVnE11%2BeV01bD5wfGdxPl4CSxhhTB1NVxkyEzdVGloVBBEBVBtZJTISAGVNNRUDEwZUHVgSChE3VCtbEQUWAFUZXhIFGwVXK1wVCyJMDEUfTlpLVwtADiUyIgRlK2sVMhE3F3ULHFUQVAAbCBdXQQ9QSA8SURFXU0lfHFcaUwZLX0AGFzdXGloRCw%3D%3D", + "valid": true +}, { + "esite": "jd", + "name": "卡西欧(CASIO)电子琴CT-X800", + "price": "¥1698", + "salePerMonth": 638, + "seller": "卡西欧京东自营旗舰店", + "pic": "ebfbb3b6ba6b7e3f.jpg", + "link": "https://union-click.jd.com/jdc?e=&p=AyIGZRtcFwYUBVQcWBEyEgZUGloVCxoGUhpSJUZNXwtEa0xHV0YXEEULWldTCQQHCllHGAdFBwtEQkQBBRxNVlQYBUkeTVxNCRNLGEF6RwtVGloUAxIOXRpcFAsiWRJ5W0B5R3U2cy0VdWEGCUktcEdrUVkXaxQyEgZUG10WBBMHVytrFQUiRTvP54XbhomChs3AirPT%2FYKOnp%2FGseLD6r7VqaOCvtQlAyIHURxfEgIXBFEcWxYFIgBVEmteW0xDDkMCRVxJUmUraxYyIjdVK1glQHxUVUheFQoRAgYcWkUHQgQGE1MUURACVxhSE1EbB1FIDiUAEwZREg%3D%3D", + "valid": true +}, { + "esite": "jd", + "name": "雅马哈(YAMAHA)F620 民谣吉他", + "price": "¥1199", + "salePerMonth": 2576, + "seller": "雅马哈(YAMAHA)京东自营专卖店", + "pic": "5aa22eceN5c6ce109.jpg", + "link": "https://union-click.jd.com/jdc?e=&p=AyIGZRprEAURAlcbUyVGTV8LRGtMR1dGFxBFC1pXUwkEBwpZRxgHRQcLREJEAQUcTVZUGAVJHk1cTQkTSxhBekcLUBxYEAASD2UZC09yUkwVeDhvQhJCNU0QUwZBUAN7VxkyEzdVGloVBBEBVBtZJTISAGVNNRUDEwZUHVgSChE3VCtbEQUWAFUeUxAKFw9dK1wVCyJMDEUfTlpLVwtADiUyIgRlK2sVMhE3F3UIEQoXUlAZC0cEGw9QTgxFURBTXRpZFVIXAlQbXkFXEDdXGloRCw%3D%3D", + "valid": true +},{ + "esite": "jd", + "name": "卡西欧(CASIO)专业级电子琴 CT-X5000", + "price": "¥3198", + "salePerMonth": 527, + "seller": "卡西欧京东自营旗舰店", + "pic": "28026c18dc573bd5.jpg", + "link": "https://union-click.jd.com/jdc?e=&p=AyIGZRtcFwYUBVQcWBEyEgZUGloWARsGVR1eJUZNXwtEa0xHV0YXEEULWldTCQQHCllHGAdFBwtEQkQBBRxNVlQYBUkeTVxNCRNLGEF6RwtVGloUAxEEXBpbEwciT1EBGkBmVn41GkFeY2xmNF4jRnxQd1kXaxQyEgZUG10WBBMHVytrFQUiRTvP54XbhomChs3AirPT%2FYKOnp%2FGseLD6r7VqaOCvtQlAyIHURxfFgQbAFATXRQAIgBVEmteW0xDDkMCRVxJUmUraxYyIjdVK1glQHxVURlaEAVFUgYbCUEHR1IBEloWUUcBAhhZQgYTBwUdXiUAEwZREg%3D%3D", + "valid": true +}, { + "esite": "jd", + "name": "卡西欧(CASIO)电钢琴 PX-160BK", + "price": "¥3268", + "salePerMonth": 535, + "seller": "卡西欧京东自营旗舰店", + "pic": "2817ecd689819de3.jpg", + "link": "https://union-click.jd.com/jdc?e=&p=AyIGZRtcFwYUBVQcWBEyEgBSHVIUBSJDCkMFSjJLQhBaGR4cDF8QTwcKXg1cAAQJS14MQQVYDwtFSlMTBAtHR0pZChUdRUFGfwAXWxIFFA5UHGtceGdyNlsaFGFAdRdEX1UCTgIJSz5lDh43VCtbFAMSAVYdWhUAIjdVHGtXbMa7xcLPm9WPkYCT%2BsGqi9Leho%2Bjtcq2%2FszgsdW3iGUaaxUGFQNXH1kXCxEEUR5rEgIbNx5CBVFZSl4FRQBAMiI3VitrJQIiBGVZNRZRQQQGHAgXBUACUh5fFVYaUgAdC0ZXElNVTlsQBkcHZRlaFAYb", + "coupon": "https://union-click.jd.com/jdc?e=&p=AyIGZRtcFwYUBVQcWBEyEgBSHVIUBSJDCkMFSjJLQhBaGR4cDFwNRA1CVk0YDk5ER1xOGQ1eD0kdS0IJRlVXWFYLVRxcEwsTAEJbV2F7emAhUltRdRNwIngSdRYRcCJyCXZiS39QeBNta2tkKR0tbFdgcxxOH2IAamQiGisQdmtSJ285dkBmfgNLL3ZhV3ExbAZAe0wBM3kzd2VlDxRjIm1rZXQiRSxsakJ%2BJQ9ZYBYQcmUcBxYCUFwTaT5PQlpjLmZSCwdxeTZdVxkyEzdVGloVBBEBVBtZJTISAGVZNcG%2Bgt7BlYyIlMeP9M%2FzjNeZmoGt7M2zudDuv4ywjSIGZRtfEgYQA1cZUhYBFQ9lHFscMlleC18ATVtCWQ5OayUyETdlK1sWMhE3F3VYRlERVFJIWRJQFwBQH1tBCkdSU0sIQAJGBwAbXhFXEjdXGloRCw%3D%3D", + "valid": true +}, { + "esite": "jd", + "name": "德国布鲁诺高端立式钢琴UP122", + "price": "¥12989", + "salePerMonth": 396, + "seller": "BRUNO布鲁诺京东自营旗舰店", + "pic": "3c59fe8440c05e15.jpg", + "link": "https://union-click.jd.com/jdc?e=&p=AyIGZRprEwoWBFwSWyVGTV8LRGtMR1dGFxBFC1pXUwkEBwpZRxgHRQcLREJEAQUcTVZUGAVJHk1cTQkTSxhBekcLUxNfFgsbB2VJAhxqFQcCEz5SdG9dI0k8HEISV1J7VxkyEzdVGloVBBEBVBtZJTISAGVNNRUDEwZVGlwcARE3VCtbEQUWBFwaWhIKFQRTK1wVCyJMDEUfTlpLVwtADiUyIgRlK2sVMhE3F3VSHQFCD1xJC0FVRldQGQhCChNUVB0MFwoVB1dPDxcLETdXGloRCw%3D%3D", + "valid": true +}] \ No newline at end of file diff --git a/public/assets/piano/static/data/links.json b/public/assets/piano/static/data/links.json new file mode 100644 index 0000000..45a3c97 --- /dev/null +++ b/public/assets/piano/static/data/links.json @@ -0,0 +1,41 @@ +[{ + "title": "自由钢琴 - AutoPiano", + "desc": "让你听见内心的声音", + "url": "https://www.autopiano.cn" +}, { + "title": "网易云音乐", + "desc": "音乐的力量 music.163.com", + "url": "https://music.163.com/" +}, { + "title": "阮一峰的网络日志", + "desc": "https://www.ruanyifeng.com/blog/", + "url": "https://www.ruanyifeng.com/blog/" +}, { + "title": "吾爱分享网", + "desc": "分享是一种态度", + "url": "http://52sharing.cn" +}, { + "title": "梯云博客", + "desc": "求知若饥 虚心若愚", + "url": "http://www.teenshare.club" +}, { + "title": "兔八哥-凉夜博客", + "desc": "设计&前端开发博主博客", + "url": "http://www.ls1314.cn" +}, { + "title": "踏雕上月", + "desc": "设计&web开发博主博客", + "url": "https://www.zsxcool.com" +}, { + "title": "四个空格", + "desc": "感受代码之美", + "url": "https://www.4spaces.org/" +}, { + "title": "花似", + "desc": "https://subei.me/", + "url": "https://subei.me/" +}, { + "title": "空缺中...", + "desc": "waiting for you", + "url": "javascript:;" +}] \ No newline at end of file diff --git a/public/assets/piano/static/fonts/iconfont.eot b/public/assets/piano/static/fonts/iconfont.eot new file mode 100644 index 0000000..cfa57e1 Binary files /dev/null and b/public/assets/piano/static/fonts/iconfont.eot differ diff --git a/public/assets/piano/static/fonts/iconfont.svg b/public/assets/piano/static/fonts/iconfont.svg new file mode 100644 index 0000000..0c1b8ac --- /dev/null +++ b/public/assets/piano/static/fonts/iconfont.svg @@ -0,0 +1,88 @@ + + + + +Created by FontForge 20120731 at Sat Nov 28 22:48:50 2015 + By Ads + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/piano/static/fonts/iconfont.ttf b/public/assets/piano/static/fonts/iconfont.ttf new file mode 100644 index 0000000..515b493 Binary files /dev/null and b/public/assets/piano/static/fonts/iconfont.ttf differ diff --git a/public/assets/piano/static/fonts/iconfont.woff b/public/assets/piano/static/fonts/iconfont.woff new file mode 100644 index 0000000..ed12916 Binary files /dev/null and b/public/assets/piano/static/fonts/iconfont.woff differ diff --git a/public/assets/piano/static/goodsImgs/05d7da9f7a83f31b.jpg b/public/assets/piano/static/goodsImgs/05d7da9f7a83f31b.jpg new file mode 100644 index 0000000..d0a9552 Binary files /dev/null and b/public/assets/piano/static/goodsImgs/05d7da9f7a83f31b.jpg differ diff --git a/public/assets/piano/static/goodsImgs/28026c18dc573bd5.jpg b/public/assets/piano/static/goodsImgs/28026c18dc573bd5.jpg new file mode 100644 index 0000000..5d53833 Binary files /dev/null and b/public/assets/piano/static/goodsImgs/28026c18dc573bd5.jpg differ diff --git a/public/assets/piano/static/goodsImgs/2817ecd689819de3.jpg b/public/assets/piano/static/goodsImgs/2817ecd689819de3.jpg new file mode 100644 index 0000000..7f95441 Binary files /dev/null and b/public/assets/piano/static/goodsImgs/2817ecd689819de3.jpg differ diff --git a/public/assets/piano/static/goodsImgs/3c59fe8440c05e15.jpg b/public/assets/piano/static/goodsImgs/3c59fe8440c05e15.jpg new file mode 100644 index 0000000..0ef0249 Binary files /dev/null and b/public/assets/piano/static/goodsImgs/3c59fe8440c05e15.jpg differ diff --git a/public/assets/piano/static/goodsImgs/5aa22eceN5c6ce109.jpg b/public/assets/piano/static/goodsImgs/5aa22eceN5c6ce109.jpg new file mode 100644 index 0000000..0d71328 Binary files /dev/null and b/public/assets/piano/static/goodsImgs/5aa22eceN5c6ce109.jpg differ diff --git a/public/assets/piano/static/goodsImgs/5b3b338fNad1559cd.jpg b/public/assets/piano/static/goodsImgs/5b3b338fNad1559cd.jpg new file mode 100644 index 0000000..055a69a Binary files /dev/null and b/public/assets/piano/static/goodsImgs/5b3b338fNad1559cd.jpg differ diff --git a/public/assets/piano/static/goodsImgs/5d4808c716acb007.jpg b/public/assets/piano/static/goodsImgs/5d4808c716acb007.jpg new file mode 100644 index 0000000..0a7b9e6 Binary files /dev/null and b/public/assets/piano/static/goodsImgs/5d4808c716acb007.jpg differ diff --git a/public/assets/piano/static/goodsImgs/b8b5a95542c993d2.jpg b/public/assets/piano/static/goodsImgs/b8b5a95542c993d2.jpg new file mode 100644 index 0000000..4db12af Binary files /dev/null and b/public/assets/piano/static/goodsImgs/b8b5a95542c993d2.jpg differ diff --git a/public/assets/piano/static/goodsImgs/bc56ea5a17a35998.jpg b/public/assets/piano/static/goodsImgs/bc56ea5a17a35998.jpg new file mode 100644 index 0000000..0b2c019 Binary files /dev/null and b/public/assets/piano/static/goodsImgs/bc56ea5a17a35998.jpg differ diff --git a/public/assets/piano/static/goodsImgs/ebfbb3b6ba6b7e3f.jpg b/public/assets/piano/static/goodsImgs/ebfbb3b6ba6b7e3f.jpg new file mode 100644 index 0000000..a383d23 Binary files /dev/null and b/public/assets/piano/static/goodsImgs/ebfbb3b6ba6b7e3f.jpg differ diff --git a/public/assets/piano/static/images/bg_default.jpg b/public/assets/piano/static/images/bg_default.jpg new file mode 100644 index 0000000..93773d7 Binary files /dev/null and b/public/assets/piano/static/images/bg_default.jpg differ diff --git a/public/assets/piano/static/images/bg_eiffel.jpg b/public/assets/piano/static/images/bg_eiffel.jpg new file mode 100644 index 0000000..6165608 Binary files /dev/null and b/public/assets/piano/static/images/bg_eiffel.jpg differ diff --git a/public/assets/piano/static/images/bg_girl.jpg b/public/assets/piano/static/images/bg_girl.jpg new file mode 100644 index 0000000..4cf6c49 Binary files /dev/null and b/public/assets/piano/static/images/bg_girl.jpg differ diff --git a/public/assets/piano/static/img/aliqr.7bf1e6c.png b/public/assets/piano/static/img/aliqr.7bf1e6c.png new file mode 100644 index 0000000..acc00ac Binary files /dev/null and b/public/assets/piano/static/img/aliqr.7bf1e6c.png differ diff --git a/public/assets/piano/static/img/sprite.3c2f760.png b/public/assets/piano/static/img/sprite.3c2f760.png new file mode 100644 index 0000000..ea8d339 Binary files /dev/null and b/public/assets/piano/static/img/sprite.3c2f760.png differ diff --git a/public/assets/piano/static/img/wxqr.543cb70.png b/public/assets/piano/static/img/wxqr.543cb70.png new file mode 100644 index 0000000..6e1cbfa Binary files /dev/null and b/public/assets/piano/static/img/wxqr.543cb70.png differ diff --git a/public/assets/piano/static/js/0.8f4fc729fc7dd13c1151.js b/public/assets/piano/static/js/0.8f4fc729fc7dd13c1151.js new file mode 100644 index 0000000..3741dfb --- /dev/null +++ b/public/assets/piano/static/js/0.8f4fc729fc7dd13c1151.js @@ -0,0 +1,7 @@ +webpackJsonp([0],{"+MLA":function(t,e,i){var n=i("EqjI"),o=i("06OY").onFreeze;i("uqUo")("freeze",function(t){return function(e){return t&&n(e)?t(o(e)):e}})},"+OXj":function(t,e,i){"use strict";var n=i("pFYg"),o=i.n(n),a=i("VSxz"),r=i("2uFj");e.a={name:"AutoPlayScoreList",data:function(){return{ScoreNum:r.b,ScoreXml:r.c,ScoreMidi:r.d,playingItem:{name:""},currentView:"LIST"}},mounted:function(){var t=this;a.a.$on(r.e.MUSIC_END,function(){setTimeout(function(){t.stopMusicPlayer()},2e3)})},methods:{clickScoreItem:function(t,e){t&&t.name&&t!=this.playingItem&&(this.playingItem&&this.stopMusicPlayer(this.playingItem),t.playing=!0,this.playingItem=t,"numscore"===e?a.a.$emit(r.e.AUTO_PLAY_NUM_SCORE,t.name):"midi"===e?(a.a.$emit(r.e.SHOW_GLOBAL_LOADING),a.a.$emit(r.e.AUTO_PLAY_MIDI,t.url)):"musicxml"===e&&(a.a.$emit(r.e.SHOW_GLOBAL_LOADING),$.ajax({type:"GET",url:t.url||"",success:function(t){t&&t&&"object"==(void 0===t?"undefined":o()(t))&&setTimeout(function(){a.a.$emit(r.e.HIDE_GLOBAL_LOADING),a.a.$emit(r.e.AUTO_PLAY_XML_SCORE,t)},200)},fail:function(){alert("加载乐谱出错,请检查网络")}})))},stopMusicPlayer:function(t){t=t||this.playingItem,t.playing=!1,this.currentView="LIST",a.a.$emit(r.e.STOP_AUTO_PLAY,t),this.playingItem={name:"",url:""}}}}},"+ZRt":function(t,e,i){"use strict";function n(t){i("nql0")}var o=i("XYsL"),a=i("dW9l"),r=i("VU/8"),s=n,l=r(o.a,a.a,!1,s,null,null);e.a=l.exports},"+tPU":function(t,e,i){i("xGkn");for(var n=i("7KvD"),o=i("hJx8"),a=i("/bQp"),r=i("dSzd")("toStringTag"),s="CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList".split(","),l=0;l+
          1",url:n+"b49.mp3",type:"black"},{id:37,name:"D#2",keyCode:"b50",key:"⇧
          +
          2",url:n+"b50.mp3",type:"black"},{id:38,name:"F#2",keyCode:"b52",key:"⇧
          +
          4",url:n+"b52.mp3",type:"black"},{id:39,name:"G#2",keyCode:"b53",key:"⇧
          +
          5",url:n+"b53.mp3",type:"black"},{id:40,name:"A#2",keyCode:"b54",key:"⇧
          +
          6",url:n+"b54.mp3",type:"black"},{id:41,name:"C#3",keyCode:"b56",key:"⇧
          +
          8",url:n+"b56.mp3",type:"black"},{id:42,name:"D#3",keyCode:"b57",key:"⇧
          +
          9",url:n+"b57.mp3",type:"black"},{id:43,name:"F#3",keyCode:"b81",key:"⇧
          +
          Q",url:n+"b81.mp3",type:"black"},{id:44,name:"G#3",keyCode:"b87",key:"⇧
          +
          W",url:n+"b87.mp3",type:"black"},{id:45,name:"A#3",keyCode:"b69",key:"⇧
          +
          E",url:n+"b69.mp3",type:"black"},{id:46,name:"C#4",keyCode:"b84",key:"⇧
          +
          T",url:n+"b84.mp3",type:"black"},{id:47,name:"D#4",keyCode:"b89",key:"⇧
          +
          Y",url:n+"b89.mp3",type:"black"},{id:48,name:"F#4",keyCode:"b73",key:"⇧
          +
          I",url:n+"b73.mp3",type:"black"},{id:49,name:"G#4",keyCode:"b79",key:"⇧
          +
          O",url:n+"b79.mp3",type:"black"},{id:50,name:"A#4",keyCode:"b80",key:"⇧
          +
          P",url:n+"b80.mp3",type:"black"},{id:51,name:"C#5",keyCode:"b83",key:"⇧
          +
          S",url:n+"b83.mp3",type:"black"},{id:52,name:"D#5",keyCode:"b68",key:"⇧
          +
          D",url:n+"b68.mp3",type:"black"},{id:53,name:"F#5",keyCode:"b71",key:"⇧
          +
          G",url:n+"b71.mp3",type:"black"},{id:54,name:"G#5",keyCode:"b72",key:"⇧
          +
          H",url:n+"b72.mp3",type:"black"},{id:55,name:"A#5",keyCode:"b74",key:"⇧
          +
          J",url:n+"b74.mp3",type:"black"},{id:56,name:"C#6",keyCode:"b76",key:"⇧
          +
          L",url:n+"b76.mp3",type:"black"},{id:57,name:"D#6",keyCode:"b90",key:"⇧
          +
          Z",url:n+"b90.mp3",type:"black"},{id:58,name:"F#6",keyCode:"b67",key:"⇧
          +
          C",url:n+"b67.mp3",type:"black"},{id:59,name:"G#6",keyCode:"b86",key:"⇧
          +
          V",url:n+"b86.mp3",type:"black"},{id:60,name:"A#6",keyCode:"b66",key:"⇧
          +
          B",url:n+"b66.mp3",type:"black"}];var o=[{name:"C2",file:"a49.mp3"},{name:"D2",file:"a50.mp3"},{name:"E2",file:"a51.mp3"},{name:"F2",file:"a52.mp3"},{name:"G2",file:"a53.mp3"},{name:"A2",file:"a54.mp3"},{name:"B2",file:"a55.mp3"},{name:"C3",file:"a56.mp3"},{name:"D3",file:"a57.mp3"},{name:"E3",file:"a48.mp3"},{name:"F3",file:"a81.mp3"},{name:"G3",file:"a87.mp3"},{name:"A3",file:"a69.mp3"},{name:"B3",file:"a82.mp3"},{name:"C4",file:"a84.mp3"},{name:"D4",file:"a89.mp3"},{name:"E4",file:"a85.mp3"},{name:"F4",file:"a73.mp3"},{name:"G4",file:"a79.mp3"},{name:"A4",file:"a80.mp3"},{name:"B4",file:"a65.mp3"},{name:"C5",file:"a83.mp3"},{name:"D5",file:"a68.mp3"},{name:"E5",file:"a70.mp3"},{name:"F5",file:"a71.mp3"},{name:"G5",file:"a72.mp3"},{name:"A5",file:"a74.mp3"},{name:"B5",file:"a75.mp3"},{name:"C6",file:"a76.mp3"},{name:"D6",file:"a90.mp3"},{name:"E6",file:"a88.mp3"},{name:"F6",file:"a67.mp3"},{name:"G6",file:"a86.mp3"},{name:"A6",file:"a66.mp3"},{name:"B6",file:"a78.mp3"},{name:"C7",file:"a77.mp3"},{name:"C#2",file:"b49.mp3"},{name:"D#2",file:"b50.mp3"},{name:"F#2",file:"b52.mp3"},{name:"G#2",file:"b53.mp3"},{name:"A#2",file:"b54.mp3"},{name:"C#3",file:"b56.mp3"},{name:"D#3",file:"b57.mp3"},{name:"F#3",file:"b81.mp3"},{name:"G#3",file:"b87.mp3"},{name:"A#3",file:"b69.mp3"},{name:"C#4",file:"b84.mp3"},{name:"D#4",file:"b89.mp3"},{name:"F#4",file:"b73.mp3"},{name:"G#4",file:"b79.mp3"},{name:"A#4",file:"b80.mp3"},{name:"C#5",file:"b83.mp3"},{name:"D#5",file:"b68.mp3"},{name:"F#5",file:"b71.mp3"},{name:"G#5",file:"b72.mp3"},{name:"A#5",file:"b74.mp3"},{name:"C#6",file:"b76.mp3"},{name:"D#6",file:"b90.mp3"},{name:"F#6",file:"b67.mp3"},{name:"G#6",file:"b86.mp3"},{name:"A#6",file:"b66.mp3"}]},"/U6I":function(t,e,i){"use strict";var n=i("VSxz"),o=i("0xDb"),a=i("2uFj"),r=i("nVdG");i.n(r);e.a={data:function(){return{currentMidiData:null,midiNotes:[],midiStop:!1}},computed:{shouldShowNoteRain:function(){return!window.isMobile}},mounted:function(){var t=this;n.a.$on(a.e.PLAY_MIDI_NOTE,function(e){setTimeout(function(){i.i(o.a)(e.name)&&(t.playNote(e.name,"1n",e.velocity),$('[data-name="'+e.name+'"]').addClass("auto-key-active"),setTimeout(function(){$('[data-name="'+e.name+'"]').removeClass("auto-key-active")},900*e.duration))},0)})},methods:{loadMidiAndPlay:function(t){var e=this;r.Midi.fromUrl(t).then(function(t){e.currentMidiData=t,e.midiOffset=0,e.playMidi()})},playMidi:function(){var t=this;this.currentMidiData&&(console.info("current midi data",this.currentMidiData),this.midiStop=!1,this.midiNotes=[],this.currentMidiData.tracks.forEach(function(e,i){console.info("current track instrument",i,e.instrument.family,e.instrument.name),t.midiNotes=t.midiNotes.concat(e.notes)}),this.startTime=+new Date,this.playLoop(),console.log(this.midiNotes.length),n.a.$emit(a.e.HIDE_GLOBAL_LOADING))},playLoop:function(){var t=this;if(!this.midiStop){var e=this.midiNotes.filter(function(t){return!t.played});if(e.length<=0)return void n.a.$emit(a.e.MUSIC_END);var i=+new Date,o=i-this.startTime;e.forEach(function(t){o>=1e3*t.time&&!t.played&&(t.played=!0,n.a.$emit(a.e.PLAY_MIDI_NOTE,t))}),setTimeout(function(){t.playLoop()},30)}},stopMidiPlay:function(){this.midiStop=!0,this.currentMidiData=null,this.midiNotes=[]}}}},"/bQp":function(t,e){t.exports={}},"/n6Q":function(t,e,i){i("zQR9"),i("+tPU"),t.exports=i("Kh4W").f("iterator")},"06OY":function(t,e,i){var n=i("3Eo+")("meta"),o=i("EqjI"),a=i("D2L2"),r=i("evD5").f,s=0,l=Object.isExtensible||function(){return!0},u=!i("S82l")(function(){return l(Object.preventExtensions({}))}),c=function(t){r(t,n,{value:{i:"O"+ ++s,w:{}}})},f=function(t,e){if(!o(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!a(t,n)){if(!l(t))return"F";if(!e)return"E";c(t)}return t[n].i},d=function(t,e){if(!a(t,n)){if(!l(t))return!0;if(!e)return!1;c(t)}return t[n].w},h=function(t){return u&&p.NEED&&l(t)&&!a(t,n)&&c(t),t},p=t.exports={KEY:n,NEED:!1,fastKey:f,getWeak:d,onFreeze:h}},"0Rnz":function(t,e,i){"use strict";function n(t){i("3jXb")}var o=i("Y6yI"),a=i("erkj"),r=i("VU/8"),s=n,l=r(o.a,a.a,!1,s,null,null);e.a=l.exports},"0xDb":function(t,e,i){"use strict";i.d(e,"a",function(){return o});var n=i("2uFj"),o=function(t){return n.g.some(function(e){return e.name==t})}},"1H6C":function(t,e,i){var n=function(){return this}()||Function("return this")(),o=n.regeneratorRuntime&&Object.getOwnPropertyNames(n).indexOf("regeneratorRuntime")>=0,a=o&&n.regeneratorRuntime;if(n.regeneratorRuntime=void 0,t.exports=i("HhN8"),o)n.regeneratorRuntime=a;else try{delete n.regeneratorRuntime}catch(t){n.regeneratorRuntime=void 0}},"1kS7":function(t,e){e.f=Object.getOwnPropertySymbols},"2KxR":function(t,e){t.exports=function(t,e,i,n){if(!(t instanceof e)||void 0!==n&&n in t)throw TypeError(i+": incorrect invocation!");return t}},"2uFj":function(t,e,i){"use strict";i.d(e,"g",function(){return d}),i.d(e,"h",function(){return h}),i.d(e,"i",function(){return p}),i.d(e,"f",function(){return m}),i.d(e,"b",function(){return y}),i.d(e,"c",function(){return g}),i.d(e,"d",function(){return _}),i.d(e,"a",function(){return v}),i.d(e,"e",function(){return b});var n=i("//Im"),o=i("PT5K"),a=i("b56o"),r=i("aOM9"),s=i("FwAT"),l=i("ja8J"),u=i("3KBG"),c=i("FNIq"),f=i("bqBI"),d=n.a,h=o.a,p=a.a,m=(r.a,s.a),y=l.a,g=u.a,_=c.a,v=f.a,b={SHOW_GLOBAL_LOADING:"SHOW_GLOBAL_LOADING",HIDE_GLOBAL_LOADING:"HIDE_GLOBAL_LOADING",CHANGE_WALLPAPER:"CHANGE_WALLPAPER",INSTRUMENT_LOADED:"INSTRUMENT_LOADED",AUTO_PLAY_NUM_SCORE:"AUTO_PLAY_NUM_SCORE",AUTO_PLAY_XML_SCORE:"AUTO_PLAY_XML_SCORE",AUTO_PLAY_MIDI:"AUTO_PLAY_MIDI",START_NOTE_RAIN:"START_NOTE_RAIN",PLAY_MIDI_NOTE:"PLAY_MIDI_NOTE",STOP_AUTO_PLAY:"STOP_AUTO_PLAY",MUSIC_END:"MUSIC_END"}},"3Eo+":function(t,e){var i=0,n=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++i+n).toString(36))}},"3KBG":function(t,e,i){"use strict";var n=[{name:"成都",url:"/assets/piano/static/xmlscore/成都.json",degree:5},{name:"千与千寻 - Always With Me",url:"/assets/piano/static/xmlscore/千与千寻.json",degree:4},{name:"后来",url:"/assets/piano/static/xmlscore/后来.json",degree:3},{name:"告白气球",url:"/assets/piano/static/xmlscore/告白气球.json",degree:2},{name:"蒲公英的约定",url:"/assets/piano/static/xmlscore/蒲公英的约定.json",degree:5},{name:"时间煮雨",url:"/assets/piano/static/xmlscore/时间煮雨.json",degree:4},{name:"下一个天亮",url:"/assets/piano/static/xmlscore/下一个天亮.json",degree:2},{name:"海角七号 1945",url:"/assets/piano/static/xmlscore/海角七号.json",degree:3}];n.forEach(function(t){t.playing=!1}),e.a=n},"3YeD":function(t,e,i){"use strict";var n=function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{ref:"LyricComponent",staticClass:"component-random-lyric"},[i("div",{staticClass:"lyric",attrs:{id:"randomLyric"},on:{click:t.searchLyric}},[t._v(t._s(t.randomLyric))])])},o=[],a={render:n,staticRenderFns:o};e.a=a},"3fs2":function(t,e,i){var n=i("RY/4"),o=i("dSzd")("iterator"),a=i("/bQp");t.exports=i("FeBl").getIteratorMethod=function(t){if(void 0!=t)return t[o]||t["@@iterator"]||a[n(t)]}},"3jXb":function(t,e,i){var n=i("IISb");"string"==typeof n&&(n=[[t.i,n,""]]),n.locals&&(t.exports=n.locals);i("rjj0")("a301e842",n,!0,{})},"3rLr":function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=i("adPX"),o=new WeakMap,a=function(){function t(t,e){if(this.number=0,o.set(this,e),this.number=0,t){var i=t.find(function(t){return"programChange"===t.type});i&&(this.number=i.programNumber)}}return Object.defineProperty(t.prototype,"name",{get:function(){return this.percussion?n.DrumKitByPatchID[this.number]:n.instrumentByPatchID[this.number]},set:function(t){var e=n.instrumentByPatchID.indexOf(t);-1!==e&&(this.number=e)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"family",{get:function(){return this.percussion?"drums":n.InstrumentFamilyByID[Math.floor(this.number/8)]},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"percussion",{get:function(){return 9===o.get(this).channel},enumerable:!0,configurable:!0}),t.prototype.toJSON=function(){return{family:this.family,name:this.name,number:this.number}},t.prototype.fromJSON=function(t){this.number=t.number},t}();e.Instrument=a},"4mcu":function(t,e){t.exports=function(){}},"52gC":function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},"5JHN":function(t,e,i){"use strict";function n(t){i("uHpY")}var o=i("CRtL"),a=i("3YeD"),r=i("VU/8"),s=n,l=r(o.a,a.a,!1,s,null,null);e.a=l.exports},"5QVw":function(t,e,i){t.exports={default:i("BwfY"),__esModule:!0}},"7UMu":function(t,e,i){var n=i("R9M2");t.exports=Array.isArray||function(t){return"Array"==n(t)}},"82Mu":function(t,e,i){var n=i("7KvD"),o=i("L42u").set,a=n.MutationObserver||n.WebKitMutationObserver,r=n.process,s=n.Promise,l="process"==i("R9M2")(r);t.exports=function(){var t,e,i,u=function(){var n,o;for(l&&(n=r.domain)&&n.exit();t;){o=t.fn,t=t.next;try{o()}catch(n){throw t?i():e=void 0,n}}e=void 0,n&&n.enter()};if(l)i=function(){r.nextTick(u)};else if(!a||n.navigator&&n.navigator.standalone)if(s&&s.resolve){var c=s.resolve(void 0);i=function(){c.then(u)}}else i=function(){o.call(n,u)};else{var f=!0,d=document.createTextNode("");new a(u).observe(d,{characterData:!0}),i=function(){d.data=f=!f}}return function(n){var o={fn:n,next:void 0};e&&(e.next=o),t||(t=o,i()),e=o}}},"880/":function(t,e,i){t.exports=i("hJx8")},"8CHm":function(t,e,i){"use strict";function n(t,e,i){void 0===i&&(i="ticks");var n=0,o=t.length,a=o;if(o>0&&t[o-1][i]<=e)return o-1;for(;ne)return r;s[i]>e?a=r:s[i]0&&(t.xmlPlayQueue.shift(),t.xmlPlayQueue[0]&&t.playXMLScore(t.xmlPlayQueue[0]))}),setTimeout(function(){},1e3)},methods:{addToPlayQueue:function(t){this.xmlPlayQueue.length<=0&&this.playXMLScore(t),this.xmlPlayQueue.push(t)},initXMLPlayState:function(){this.xmlstop=!1,this.measures=[],this.measures_len=0,this.lastNote={noteName:""}},pauseXMLPlay:function(){this.xmlstop=!0,$(".piano-key").removeClass("auto-key-active")},playXMLScore:function(t){var e=this;return l()(o.a.mark(function i(){var n,a,s,l,c,f,d,h;return o.a.wrap(function(i){for(;;)switch(i.prev=i.next){case 0:e.initXMLPlayState(),e.measures=t.measures,e.measures_len=e.measures.length,n=0;case 4:if(!(n=s){l.forEach(function(t){t&&t.noteName&&$('[data-name="'+t.noteName+'"]').removeClass("auto-key-active")}),l=[];var n=t[a];if(!n||!n.duration)return;var o=n.duration?n.duration:0;if(s+=o,n.rest);else if("start"!=n.tie&&n.noteName==e.lastNote.noteName);else if(n&&n.noteName){for(var c=0;c=t.length){clearInterval(u),u=null;var h=Math.floor(t[a-1].duration||0);setTimeout(function(){i(),l.forEach(function(t){t&&t.noteName&&$('[data-name="'+t.noteName+'"]').removeClass("auto-key-active")})},h)}}}var a=0,r=new Date,s=0,l=[],u=setInterval(function(){o()},17)})}}}},"9OEs":function(t,e,i){"use strict";var n=i("2uFj");e.a={data:function(){return{ScoreNum:n.b,playTimers:[],StepMap:{C:{"1>>":"C2","2>>":"D2","3>>":"E2","4>>":"F2","5>>":"G2","6>>":"A2","7>>":"B2","1>":"C3","2>":"D3","3>":"E3","4>":"F3","5>":"G3","6>":"A3","7>":"B3",1:"C4",2:"D4",3:"E4",4:"F4",5:"G4",6:"A4",7:"B4","1<":"C5","2<":"D5","3<":"E5","4<":"F5","5<":"G5","6<":"A5","7<":"B5","1<<":"C6","2<<":"D6","3<<":"E56","4<<":"F6","5<<":"G6","6<<":"A6","7<<":"B6"},D:{"1>>":"D2","2>>":"E2","3>>":"F#2","4>>":"G2","5>>":"A2","6>>":"B2","7>>":"C#3","1>":"D3","2>":"E3","3>":"F#3","4>":"G3","5>":"A3","6>":"B3","7>":"C#4",1:"D4",2:"E4",3:"F#4",4:"G4",5:"A4",6:"B4",7:"C#5","1<":"D5","2<":"E5","3<":"F#5","4<":"G5","5<":"A5","6<":"B5","7<":"C#6","1<<":"D6","2<<":"E6","3<<":"F#6","4<<":"G6","5<<":"A6","6<<":"B6","7<<":"C#7"}}}},methods:{mapNum2NoteName:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=e.match(/[#b]*[0-7][\<\>]*/g)[0];if(i&&t&&this.StepMap[t]){var n=this.StepMap[t];if(n&&n[i]){return n[i]}}return""},getNoteDuration:function(t,e){var i=1;return t.match(/\([0-9.]*\)/g)&&(i=t.match(/\([0-9.]*\)/g)[0].replace(/[\)\(]/g,"")),e*+i},autoPlayNumberScore:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"C",e=this,i=arguments[1],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:75;$(".piano-key").removeClass("auto-key-active");var o=6e4/n,a=new Date,r=0,s=0,l=void 0,u=function(){if(new Date-a>s){l&&$("[data-keyCode="+l.keyCode+"]").removeClass("auto-key-active");var n=i[r],u=e.mapNum2NoteName(t,n);if(l=e.getNoteByName(u),l&&$("[data-keyCode="+l.keyCode+"]").addClass("auto-key-active"),e.playNote(u),s+=e.getNoteDuration(n,o),++r>=i.length)return setTimeout(function(){$(".piano-key").removeClass("auto-key-active")},1e3),void clearInterval(c)}},c=setInterval(function(){u()},20);this.playTimers.push(c)},playScoreByName:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"天空之城",e=void 0;for(var i in this.ScoreNum){var n=this.ScoreNum[i];if(n.name==t){e=n;break}}if(e){this.pauseAutoPlay();var o=e.step,a=e.speed;this.StepMap[o]&&(this.autoPlayNumberScore(o,e.mainTrack,a),e.backingTrack&&this.autoPlayNumberScore(o,e.backingTrack,a))}},pauseAutoPlay:function(){$(".piano-key").removeClass("auto-key-active"),this.playTimers.forEach(function(t){clearInterval(t),t=null}),this.playTimers.splice(0)}}}},Achj:function(t,e,i){"use strict";var n=i("2uFj");e.a={name:"ManualPlayScoreList",data:function(){return{scores:n.f,sectionTitle:"快速入门",showItem:{},listShow:!0}},mounted:function(){this.showItem=this.scores[0]},methods:{clickScoreItem:function(t){t&&(this.toggleListShow(),this.showItem=t,this.showItem.content=t.content.toUpperCase(),this.sectionTitle=t.name||"快速入门")},toggleListShow:function(){this.listShow=!this.listShow,this.listShow&&(this.sectionTitle="快速入门")}}}},BwfY:function(t,e,i){i("fWfb"),i("M6a0"),i("OYls"),i("QWe/"),t.exports=i("FeBl").Symbol},C1HX:function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=i("8CHm"),o=i("dh+D"),a=i("DgcQ"),r=i("KUTN"),s=i("3rLr"),l=i("DoIZ"),u=new WeakMap,c=function(){function t(t,e){var i=this;if(this.name="",this.notes=[],this.controlChanges=a.createControlChanges(),this.pitchBends=[],u.set(this,e),t){var n=t.find(function(t){return"trackName"===t.type});this.name=n?n.text:""}if(this.instrument=new s.Instrument(t,this),this.channel=0,t){for(var o=t.filter(function(t){return"noteOn"===t.type}),r=t.filter(function(t){return"noteOff"===t.type}),l=this;o.length;)!function(){var t=o.shift();l.channel=t.channel;var e=r.findIndex(function(e){return e.noteNumber===t.noteNumber&&e.absoluteTime>=t.absoluteTime});if(-1!==e){var i=r.splice(e,1)[0];l.addNote({durationTicks:i.absoluteTime-t.absoluteTime,midi:t.noteNumber,noteOffVelocity:i.velocity/127,ticks:t.absoluteTime,velocity:t.velocity/127})}}();t.filter(function(t){return"controller"===t.type}).forEach(function(t){i.addCC({number:t.controllerType,ticks:t.absoluteTime,value:t.value/127})});t.filter(function(t){return"pitchBend"===t.type}).forEach(function(t){i.addPitchBend({ticks:t.absoluteTime,value:t.value/Math.pow(2,13)})});var c=t.find(function(t){return"endOfTrack"===t.type});this.endOfTrackTicks=void 0!==c?c.absoluteTime:void 0}}return t.prototype.addNote=function(t){var e=u.get(this),i=new l.Note({midi:0,ticks:0,velocity:1},{ticks:0,velocity:0},e);return Object.assign(i,t),n.insert(this.notes,i,"ticks"),this},t.prototype.addCC=function(t){var e=u.get(this),i=new o.ControlChange({controllerType:t.number},e);return delete t.number,Object.assign(i,t),Array.isArray(this.controlChanges[i.number])||(this.controlChanges[i.number]=[]),n.insert(this.controlChanges[i.number],i,"ticks"),this},t.prototype.addPitchBend=function(t){var e=u.get(this),i=new r.PitchBend({},e);return Object.assign(i,t),n.insert(this.pitchBends,i,"ticks"),this},Object.defineProperty(t.prototype,"duration",{get:function(){if(!this.notes.length)return 0;for(var t=this.notes[this.notes.length-1].time+this.notes[this.notes.length-1].duration,e=0;ea;)!function(e){var i,a,r,s=o?e.ok:e.fail,l=e.resolve,u=e.reject,c=e.domain;try{s?(o||(2==t._h&&R(t),t._h=1),!0===s?i=n:(c&&c.enter(),i=s(n),c&&(c.exit(),r=!0)),i===e.promise?u(w("Promise-chain cycle")):(a=E(i))?a.call(i,l,u):l(i)):u(n)}catch(t){c&&!r&&c.exit(),u(t)}}(i[a++]);t._c=[],t._n=!1,e&&!t._h&&I(t)})}},I=function(t){g.call(l,function(){var e,i,n,o=t._v,a=M(t);if(a&&(e=b(function(){P?A.emit("unhandledRejection",o,t):(i=l.onunhandledrejection)?i({promise:t,reason:o}):(n=l.console)&&n.error&&n.error("Unhandled promise rejection",o)}),t._h=P||M(t)?2:1),t._a=void 0,a&&e.e)throw e.v})},M=function(t){return 1!==t._h&&0===(t._a||t._c).length},R=function(t){g.call(l,function(){var e;P?A.emit("rejectionHandled",t):(e=l.onrejectionhandled)&&e({promise:t,reason:t._v})})},N=function(t){var e=this;e._d||(e._d=!0,e=e._w||e,e._v=t,e._s=2,e._a||(e._a=e._c.slice()),U(e,!0))},L=function(t){var e,i=this;if(!i._d){i._d=!0,i=i._w||i;try{if(i===t)throw w("Promise can't be resolved itself");(e=E(t))?_(function(){var n={_w:i,_d:!1};try{e.call(t,u(L,n,1),u(N,n,1))}catch(t){N.call(n,t)}}):(i._v=t,i._s=1,U(i,!1))}catch(t){N.call({_w:i,_d:!1},t)}}};D||(x=function(t){p(this,x,"Promise","_h"),h(t),n.call(this);try{t(u(L,this,1),u(N,this,1))}catch(t){N.call(this,t)}},n=function(t){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1},n.prototype=i("xH/j")(x.prototype,{then:function(t,e){var i=C(y(this,x));return i.ok="function"!=typeof t||t,i.fail="function"==typeof e&&e,i.domain=P?A.domain:void 0,this._c.push(i),this._a&&this._a.push(i),this._s&&U(this,!1),i.promise},catch:function(t){return this.then(void 0,t)}}),a=function(){var t=new n;this.promise=t,this.resolve=u(L,t,1),this.reject=u(N,t,1)},v.f=C=function(t){return t===x||t===r?new a(t):o(t)}),f(f.G+f.W+f.F*!D,{Promise:x}),i("e6n0")(x,"Promise"),i("bRrM")("Promise"),r=i("FeBl").Promise,f(f.S+f.F*!D,"Promise",{reject:function(t){var e=C(this);return(0,e.reject)(t),e.promise}}),f(f.S+f.F*(s||!D),"Promise",{resolve:function(t){return T(s&&this===r?x:this,t)}}),f(f.S+f.F*!(D&&i("dY0y")(function(t){x.all(t).catch(F)})),"Promise",{all:function(t){var e=this,i=C(e),n=i.resolve,o=i.reject,a=b(function(){var i=[],a=0,r=1;m(t,!1,function(t){var s=a++,l=!1;i.push(void 0),r++,e.resolve(t).then(function(t){l||(l=!0,i[s]=t,--r||n(i))},o)}),--r||n(i)});return a.e&&o(a.v),i.promise},race:function(t){var e=this,i=C(e),n=i.reject,o=b(function(){m(t,!1,function(t){e.resolve(t).then(i.resolve,n)})});return o.e&&n(o.v),i.promise}})},Cdx3:function(t,e,i){var n=i("sB3e"),o=i("lktj");i("uqUo")("keys",function(){return function(t){return o(n(t))}})},"CjT/":function(t,e,i){"use strict";function n(t){i("XAdE")}var o=i("+OXj"),a=i("LQpA"),r=i("VU/8"),s=n,l=r(o.a,a.a,!1,s,null,null);e.a=l.exports},Dd8w:function(t,e,i){"use strict";e.__esModule=!0;var n=i("woOf"),o=function(t){return t&&t.__esModule?t:{default:t}}(n);e.default=o.default||function(t){for(var e=1;e0&&void 0!==arguments[0]?arguments[0]:"C4",e=void 0,i=this.Notes.length||0,n=0;n0&&void 0!==arguments[0]?arguments[0]:"C4",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"1n";if(this.synth)try{this.synth.triggerAttackRelease(t,e)}catch(t){}}}}},FwAT:function(t,e,i){"use strict";e.a=[{name:"祝你生日快乐",content:"oopo sa
          oopo ds
          oo h f s a p
          gg f s d s
          \n oopo sa
          oopo ds
          oo h f s a p
          gg f s d fs",degree:1,lyrics:"Happy Birthday to You
          \n Happy Birthday to You
          \n Happy Birthday to You
          \n Happy Birthday to You
          ",author:"棱镜jh",authorLink:"https://github.com/WarpPrism/AutoPiano"},{name:"小星星",content:"sshhjjh ggffdds
          hhggffd hhggffd
          sshhjjh ggffdds",degree:1,lyrics:"Little Star
          \n Twinkle, twinkle, little star
          \n How I wonder what you are
          \n Up above the world so high
          \n Like a diamond in the sky
          \n When the blazing sun is gone",author:"棱镜jh",authorLink:"https://github.com/WarpPrism/AutoPiano"},{name:"新年好",content:"ssso fffs sfhhgfd dfgg fdfs sfdo ads
          ssso fffs sfhhgfd dfgg fdfs sfdo ads",degree:1,lyrics:"新年好呀,新年好呀
          \n 祝贺大家新年好
          \n 我们唱歌,我们跳舞
          \n 祝贺大家新年好",author:"棱镜jh",authorLink:"https://github.com/WarpPrism/AutoPiano"},{name:"因为爱情",content:"opsspsdfd spfdpfdsp passpfd fdd dff
          opsspsdfd spfdpfdsp passpfd spsfhd
          dfhf hhfdhh jklllklkkhf
          hfhj hjhhs psfdpfdpjh
          dfhf hhfdhh jklllklkkhf
          hfhj hjhhs psfdpfdpfd fdfs",degree:3,lyrics:"",author:"棱镜jh",authorLink:"https://github.com/WarpPrism/AutoPiano"},{name:"隐形的翅膀",content:"osf hf dsss spoo
          osf hhh jh hdfd sdd
          jhf hhhjh fdsdp
          ops fd fs
          fhl lk jhjl fds ss sl jh fd sdd
          停顿
          fhl lk jhjl fds ss sl jh fd ds s",degree:2,lyrics:"",author:"棱镜jh",authorLink:"https://github.com/WarpPrism/AutoPiano"},{name:"蒲公英的约定",content:" uio ooo pas ~ sadp ooo dsdf
          sdff fgf df s ~ pasd ssp fg d
          uo sf f gd dhas fghs sdf
          uo sf f gd dhas fghs sd s
          jh fds fgd jh as fghs sdf
          uo sf f gd dhas fghs s d s",author:"棱镜jh",authorLink:"https://github.com/WarpPrism/AutoPiano"},{name:"纸短情长",content:"o fffd fs ddds dh ~ ss spsp o dddf po
          \n gggf gs ddds dh ~ sssp sp o fddss
          \n ssd f ff fds a jh ~ hjkl ff lkl kfh
          \n hjlh j ~ jhg hf ds ~ ps fdds dh sd
          \n ssd ffdf fds hhfh ~ hjk llll lkjk jf h
          \n hjlh j jhg hf ds ~ ps fdds dsps",degree:4,lyrics:"纸短情长
          \n 你陪我步入蝉夏 越过城市喧嚣
          \n 歌声在游走 你榴花般的双眸
          \n 不见你的温柔 丢失花间欢笑
          \n 岁月无法停留 流云的等候
          \n 我真的好想你 在每一个雨季
          \n 你选择遗忘的 是我最不舍的
          \n 纸短情长啊 道不尽太多涟漪
          \n 我的故事都是关于你呀
          \n 怎么会爱上了他 并决定跟他回家
          \n 放弃了我的所有我的一切无所谓
          \n 纸短情长啊 诉不完当时年少
          \n 我的故事还是关于你啊
          \n 我真的好想你 在每一个雨季
          \n 你选择遗忘的 是我最不舍的
          \n 纸短情长啊 道不尽太多涟漪
          \n 我的故事都是关于你呀
          \n 关于你呀
          \n 怎么会爱上了他 并决定跟他回家
          \n 放弃了我的所有我的一切无所谓
          \n 纸短情长啊 诉不完当时年少
          \n 我的故事还是关于你啊",author:"棱镜jh",authorLink:"https://github.com/WarpPrism/AutoPiano"},{name:"同桌的你",content:"ooo oui o a ~ ppp pip o
          \n ooo oap i i ~ iii iuy t
          \n sss sop s f ~ ddd d s ap
          \n aaa aas d o ~ aas d s as\n sss sop s f ~ ddd d s ap
          \n aaa aas d o ~ aas d s as",degree:1,author:"棱镜jh",authorLink:"https://github.com/WarpPrism/AutoPiano"},{name:"晴天",content:"fdgf shk lkhs ~ sjj jhh hgf dfgf
          \n fghf ghk zkll ~ llh hjhg dfgh js j kk
          \n fdgf shk lkhs ~ sjj jhh hgf dfgf
          \n fghf ghk zkll ~ llh hjhg pasd fd s s
          ",degree:2,lyrics:"晴天 ~ 周杰伦
          \n 刮风这天我试过握着你手
          \n 但偏偏雨渐渐大到我看你不见
          \n 还要多久我才能在你身边
          \n 等到放晴的那天也许我会比较好一点
          \n 从前从前有个人爱你很久
          \n 但偏偏风渐渐把距离吹得好远
          \n 好不容易又能再多爱一天
          \n 但故事的最后你好像还是说了拜拜",author:"棱镜jh",authorLink:"https://github.com/WarpPrism/AutoPiano"},{name:"千与千寻主题曲",content:"fg hhhh hjhg ffff fgfd ss sapa as d dfdf d
          \n fg hhhh hjhg ffff fgfd ss sapa asos df d ddss
          \n sdfs h f dhd spf sa sapa asos dfg gfds d
          \n sdfs h f dhd spp aso o p a sdos dfd ddss",degree:3,author:"棱镜jh",authorLink:"https://github.com/WarpPrism/AutoPiano"},{name:"We Wish You A Merry Christmas",content:"o s sdsa ppp ~ d dfds aoo
          \n f fgfd s p ~ oo pdas
          \n s s sa a s a p o ~ d f d s h o
          \n oo pdas ~",degree:1,author:"棱镜jh",authorLink:"https://github.com/WarpPrism/AutoPiano"},{name:"明天你好",content:"fhhfdhh sffsaff pssp ossf gfdsd
          \n ssdfd hh as ~ ppasa ff op
          \n psgf fs d fd ofd ~ ssdfd hh as
          \n ppasa ff op psgf hs dfg fgfgh fd ~
          \n o dsf ssfjh hjkl llkjh hjkl llkjh hfs psdfd
          \n o dsf ssfjh hjkl llkjh hjkl llkjh hfs fd s a s ~",degree:4,lyrics:"明天你好
          \n 看昨天的我们 走远了
          \n 在命运广场中央 等待
          \n 那模糊的 肩膀
          \n 越奔跑 越渺小
          \n 曾经 并肩往前的 伙伴
          \n 在举杯 祝福后都 走散
          \n 只是那个 夜晚
          \n 我深深 的都留藏在心坎
          \n 长大以后 我只能奔跑
          \n 我多害怕 黑暗中跌倒
          \n 明天你好 含着泪微笑
          \n 越美好 越害怕得到
          \n 每一次哭 又笑着 奔跑
          \n 一边失去 一边在寻找
          \n 明天你好 声音多渺小
          \n 却提醒我 勇敢是什么
          \n ...",author:"棱镜jh",authorLink:"https://github.com/WarpPrism/AutoPiano"},{name:"青花瓷",content:"hhfdfdsp dfdso dfdsp sd of
          \n sdfh hf f d s ds p sdf h
          \n dsps sps spspo dsps sps sfdss
          \n opff fdf fdfhf fff dddd dsfd
          \n dsps sps spspo opfh hfh hfdss
          \n dsd fdds d sp dssp s s s
          \n hhfdfp dfhfd hhfdfo dfhds
          \n sdf hjhf hffd d sds d sd f hf
          \n hhfdfp dfhfd hhfdfo dfhds
          \n sdf hjhf hffd d o fd ds~",degree:4,author:"棱镜jh",authorLink:"https://github.com/WarpPrism/AutoPiano"},{name:"一直很安静",content:"fhdfs sa s p gf d~ fhdfs osd ss ss
          \n fhdfs ss j j jh f~ fhdfs df gfds psas s~
          \n fhlk lh j h f~ fgfds hhh df
          \n fhlk lh j h f~ fgfds s ass~
          \n\n fhdfs sa s p gf d~ fhdfs osd ss ss
          \n fhdfs ss j j jh f~ fhdfs df gfds psas s~
          \n fhlk lh j h f~ fgfds hhh jf~
          \n fhlk l z x x~ fgfds s ass~",degree:3,author:"棱镜jh",authorLink:"https://github.com/WarpPrism/AutoPiano"},{name:"好好",content:"fosf dgfd sdfs o~ gpsg fdgs spsf d
          \n dfg hhhd sp jf gfgh j~ jjkl lljs ddf gpsf f d ~
          \n 停顿
          \n fosf dgfd sdfs o~ gpsg fdgs spsf d
          \n dfg hhhd sp jf gfgh j~ jjkl lljl ll j xz~
          \n 高潮
          \n hlz xhcx zlz lk lf zl kjh jsgj jhh kl
          \n h cxzl h~
          \n hlz xhcx zlz lk lf zl kjh jsgj jhh kl
          \n h cxzl z~
          \n hlz xhcx zlz lk lf vv bv jsgj jhh kl
          \n h cxzl xz bn m mmmmm~",degree:5,author:"棱镜jh",authorLink:"https://github.com/WarpPrism/AutoPiano"},{name:"突然好想你(选段)",content:"W U UT YT R T~ T I IU IU I O Y
          \n T R T PP A D S A P OO P U
          \n T R T O OO I E R T
          \n W U UT YT R T~ T I IU IU I O Y
          \n T R T P~ P A DSAP O OPU
          \n T R T O OO IERT
          \n P A S F D
          \n S D O D S
          \n P A S F D S F
          \n P A S F D
          \n H D G FDFS
          \n P A S F D S S",degree:2,lyrics:"\n 最怕空气突然安静
          \n 最怕朋友突然的关心
          \n 最怕回忆突然翻滚
          \n 绞痛着不平息
          \n 最怕突然听到你的消息
          \n 想念如果会有声音
          \n 不愿那是悲伤的哭泣
          \n 事到如今
          \n 终於让自已属於我自已
          \n 只剩眼泪还骗不过自己
          \n 突然好想你
          \n 你会在哪里
          \n 过的快乐或委屈
          \n 突然好想你
          \n 突然锋利的回忆
          \n 突然模糊的眼睛",author:"YuetAu",authorLink:"https://yuetau.net/"},{name:"送别",content:"O UOS P S O
          \n O TYU YTY
          \n O UOS AP S O
          \n O YUI RT
          \n PSS A PAS
          \n PASPPOUTY
          \n O UOS AP SO
          \n O YUI RT",degree:1,lyrics:"长亭外,古道边,
          \n 芳草碧连天。
          \n 晚风拂柳笛声残,
          \n 夕阳山外山。
          \n 天之涯,地之角,
          \n 知交半零落;
          \n 一壶浊酒尽余欢,
          \n 今宵别梦寒。
          \n 长亭外,古道边,
          \n 芳草碧连天。
          \n 问君此去几时还,
          \n 来时莫徘徊。
          \n 天之涯,地之角,
          \n 知交半零落;
          \n 人生难得是欢聚,
          \n 惟有别离多。",author:"Fake"},{name:"天之大",content:"JH JLJH LZX ZLJL
          \n JHJLZXZLZ
          \n JH JLJH LZX ZLJL
          \n JHJLZXZLL
          \n XVV XVBMB XXVZL
          \n XVV XVBMBXZ
          \n XVV XVBMB XXVZL
          \n JHJLZXZLL",degree:1,lyrics:"妈妈 月光之下 静静的 我想你了
          \n 静静淌在血里的牵挂
          \n 妈妈 你的怀抱 我一生 爱的襁褓
          \n 有你晒过的衣服味道
          \n 天之大 唯有你的爱 是完美无瑕
          \n 天之大 记得你用心传话
          \n 天之大 唯有你的爱 我交给了他
          \n 让他的笑像极了 妈妈",author:"翾"},{name:"天空之城",content:"PAS ASFA~ UP OPSO~ IUI UISU SSSA (^I) IAA
          \n\n PAS ASFA~ UP OPSO~ YUI SA SD FS~ SAP AOP
          \n \n SDF DFHD OOS ASFF
          \n \n PAS ASD SOO~ GFDSF~ F J J H H FDS
          \n \n S DS DHF~ F J J H H FDS ~ S DS DAP",degree:2,author:"ShawNa"},{name:"小幸运",content:"uuo ossa apup~ ppa affa aouo
          \n uuo ossa apup~ pa pa f d s
          \n uuo ossa apup~ ppa affa aouo
          \n uuo ossa asup~ pa pa f d s
          \n fdsa pppp pf d~ dsap ooou od s~
          \n sso ot u yp~ ppp sp sp ssss fd d~
          \n o fdsd fodf odf~ dd fgfda sups upa~
          \n aaf hfsa pgg~ hgf off~ gfs idd~ dsf ds f d s~
          \n fodf odf~ dd fghda sups upa~
          \n aaf hfsa pgg~ hgf off~ gfs idd~ fss f d s~",degree:4,author:"棱镜jh",authorLink:"https://github.com/WarpPrism/AutoPiano"},{name:"莫斯科郊外的晚上",content:"t(^y)o(^y)i ~ (^y)y oit
          \n (^y)o(^p)(^p)s(^p)(^o)o
          \n padso
          \n ytoi(^o)
          \n (^p)(^o)oi(^y) oit",degree:2,lyrics:"《莫斯科郊外的晚上》
          \n 深夜花园里四处静悄悄
          \n 只有树叶在沙沙响
          \n 夜色多么好
          \n 令人心神往
          \n 多么迷人的晚上
          \n 我的心上人坐在我身旁
          \n 悄悄看着我不声响
          \n 我愿对你讲
          \n 不知怎样讲
          \n 多少话儿留在心上
          \n 长夜快过去天色蒙蒙亮
          \n 衷心祝福你好姑娘
          \n 但愿从今后
          \n 你我永不忘
          \n 莫斯科郊外的晚上",author:"LalalalavaZ"},{name:"Lemon【Unnatural主题曲】",content:"SDF SP D A OU APOT OU
          \n YUI S ASO IUI S APO
          \n SD F SP D A OU A P OT O U
          \n YUI O IO U O S F D DD SS
          \n P AS AP OFF D FG FD SDO
          \n I OP OI UOSS A AP AS
          \n DFDS PS FH DS DFDS PS FH DS
          \n DFDS PS FH JH HI KH FH D
          \n DFDS PS FH DS SSDF GFDAS
          \n SA PASD SOUO PDA SS
          \n SA PASD SOSD FGD SS",degree:3,author:"Fake"},{name:"西海情歌",content:"\n U OP SP D~ S DF FD DSP~
          \n U O PS D D D DS D DF FD DSP~
          \n U OP SP D~ DS S DF FD DSP~
          \n SS DF HHHF HJJH JJJHF HJLLLL LJJL JJJHF
          \n HFDDDSP SDD DFHJJHF
          \n SDHHHFHJJHJJJHF HJLLLLLJJLJJJHF
          \n HFDDDSP SDD DFD S~ P~",degree:2,author:"javacBT"},{name:"绿色",content:"\n fdfp ppph d dd
          \n fdfooouoh f ff
          \n fhfspss
          \n fhfspsd
          \n sdsgffddsdsg fdf",lyrics:"\n 若不是你突然闯进 我生活
          \n\n 我怎会把死守的寂寞 放任了
          \n \n 爱我的话你都说
          \n \n 爱我的事你不做
          \n \n 我却把甜言蜜语当做你爱我的躯壳\n ",degree:1,author:"iPeng6"},{name:"我的中国心",content:"e uyutre upo uytyu uop apouy ttyu yurewe
          \n e uyutre upo uytyu uop apouy ttyu yurewe
          \n uouu uspp pspo tytyu
          \n uspp psdf fdaop
          \n e u yutre upouytyu
          \n uop apo uy ttyu y u apop",degree:2,author:"HesperusArcher",authorLink:"https://github.com/HesperusArcher",lyrics:"河山只在我梦萦
          \n 祖国已多年未亲近
          \n 可是不管怎样也改变不了
          \n 我的中国心
          \n 洋装虽然穿在身
          \n 我心依然是中国心
          \n 我的祖先早已把我的一切
          \n 烙上中国印
          \n 长江 长城 黄山 黄河
          \n 在我心中重千斤
          \n 无论何时 无论何地
          \n 心中一样亲
          \n 流在心里的血
          \n 澎湃着中华的声音
          \n 就算身在他乡也改变不了
          \n 我的中国心"},{name:"伊莎贝拉之歌《约定的梦幻岛》OST",content:"\n E(^T)YUPOIU TURYE
          \n WEUIOUYAO UOPUOPUYEOU
          \n E(^T)YUPOIU TURYE
          \n WEUIOUYAO UOPUOPUYEOU
          \n (^T)YUPOIU TUOUP
          \n PSAOUPFA OPASAPASDAF
          \n UPASAPOUYYTOU ERTYTYIUYU
          \n UPASASDODGFDS ERTYUEWE
          \n UPASAPOUYYTOU ERTYTYIUYU
          \n UPASASDODGFDS HSPFAODAAP",lyrics:"",degree:3,author:"HikamaiC",authorLink:"https://github.com/Gu-Miao"},{name:"cannon in D",content:"\n [tf] [wd] [es] [0a] [qp] [8o] [qp] [wa]
          \n [tsf] o [wad] o [eps] u [0oa] u [qip] t [8uo] t [qip] t [woa] y
          \n [tus] a s [wa] [es] f [0h] j [qg] f d g [8f] d s a [qp] o i u [wy] u i
          \n [tuo] o [wo] p o i [etu] u [0u] i u y [qt] E e E [8t] t [qt] E e t [wr] t y
          \n [8wu] [5ry] [6et] [3r] [4e] [1w] [4e] [5t] r [18wtu]",lyrics:"",degree:3,author:"iamjiangmioamiao",authorLink:""},{name:"遇见",content:"OU OY UYT TRERTRTYU
          OU OD SAS TRERTRTYT
          OPASASAPOPO TYUIUIOTYU
          OPASASADSDSFO TYUIUIUYTRT
          OPASASDSAPO TYUIUIOTTPO
          OPASASDSDFO TYUIUIOTTPO
          OPASASDSDFO TYUYUYOTYUT
          OPASASPAOIO
          UUUIOUWW YYYUIYWW
          TTTYUYRT RERTR
          EWEPO YIUYT
          TREYYTEERT ",degree:3,author:"",authorLink:"",lyrics:""},{name:"婚礼进行曲",content:"TIII TOUI TIAAPOIUIO TIII TOUI TIPSPIYOPIAPOYY UIOO APOYY UIOO TIII TOUI TIPSPIYOPIYOPII ",degree:1,author:"",authorLink:"",lyrics:""},{name:"童话",content:"OSASO OSASO OSAS SSPPOOSASO OFDDS OSASP PPSJH DDGGFF FFADSSAS SASG OHGFDDDGGFF FFLKJKL LDSJ JJHHHOHGFFGF FGF GFDSSFHJ JJHDDGF SFHJ JJHDDGFGFDS DFPPSSAS",degree:1,author:"",authorLink:"",lyrics:""},{name:"菊花台",content:"UUYU UOUYU TTYUOU YYTY
          U OUPO POOUO WUYYOUYYYTY
          UUYU UOUYU TTYUOU YYTY
          U OUPO POOUO UYUOUYYT
          TYUUOP PFFDSPO POUYT ETYYTY
          TYUUOP PFDSSDS OOUASTYUYT ",degree:1,author:"",authorLink:"",lyrics:""},{name:"北京欢迎你",content:"FHFDFDFFDPS FD
          DSPSDFHDFJHHDS
          DSPSDFHDFJHHF
          DFDSHJFPFDDS
          FHLHJJH FF HH FH JL ZL HF D H F F
          FH LH JL ZL HF HLJ FD FH XZ LL
          ",degree:1,author:"",authorLink:"",lyrics:""},{name:"致爱丽斯",content:"FDFDFADSPTUPAUOASUFDFDFADSPTUPAUSAPASDFOGFDIFDSUDSAAUFFFFDFDFADSPTUPAUOASUFDFDFADSPTUPAUSAPSGFFDDGJHGFDSAPPOPASDDFGPSDASDFHDASDFHDAFFFFFD ",degree:2,author:"",authorLink:"",lyrics:""},{name:"约定",content:"OSDFDSFDOO UPASAPSAUO POOIISUUDS
          DFGFFDSPD OSDFDSFDAO FPASAPSAUO
          POOIISDFS PASPSJHH DSHF FDSASPUP
          SDSJG GFGPASD FGHHHJS
          HADS DFPSGFGHD DSHF FDSASPUP
          SDSJG GFGPASD FGHHHJS
          HADS DFGPGFSDS ",degree:1,author:"",authorLink:"",lyrics:""},{name:"美丽的神话",content:"PFA PSDSF PJHJHDGF
          PJHDFGF S PFDAP
          PFAPSDSF PJHJHDGF
          PJHDFGFDS PDSAP
          PASDFSAO PSDFF
          PASDFSAOPSDSS PDSAP
          PASDFSAO PSDFF
          PASDFSAOPSDSS SSDFSAOSAPAJ",degree:2,author:"",authorLink:"",lyrics:""},{name:"有没有人告诉你",content:"UPPPPPPPPUIOI UOOOOOOOPAAU
          UPPPPPPPPFFD AAAAAUSASA
          UPPPPPPPPUIOI YOOOOOOOPAAU
          UPPPPPPPPFFD AAAAAAAPAP
          FJFFFFSPUUFD UHHHHHHHJKKF
          FJFFFFSPUUFD DDDDDUAAP ",degree:2,author:"",authorLink:"",lyrics:""},{name:"好好恋爱",content:"UIOOOOOIUYYO AASASSSDFAAO
          TPPPUPSOOOOUT IIIUIOPPPSPO
          UIUUIOOOOUYTTS APOPO
          UTTPPOOOIU SSSSASDD
          OGFOOGDOGFGFGFDS SAPPFPFPOOFOFO
          GFGFSD OGFOOGHDOGFFFGFDF
          SAPPFPFPOOFOFDSP SDAPAPAFDSS",degree:1,author:"",authorLink:"",lyrics:""},{name:"安静-周杰伦",content:"FFFFDSADDDS OFDSSSOFDSSD
          FFFFDSADDDS OFDSSSOFDSSDDFG
          GGGGFDSSSDD OHHHGFDDDFF
          PGFGFDSSASO FGFGFDSDH
          OFGHGFHOFGHGFH OFGHGFSDDDFS
          HHSSASSHHSSASS GGFFDDSGGFFDDS
          OFGHGFHOFGHGFH OFGHGFSDDDFS
          HHSSASSHHSSASS GGFFDDSSGFDSPSS",degree:2,author:"",authorLink:"",lyrics:""},{name:"月亮代表我的心",content:"OSFHSAFH HJKLJH FDSSS FDSSS DFDSPDFD OSFHSAFH HJKLJH
          DSSS FDSSS DFDPASDS FHFDSHA PAPAPOF HFDSHA PASSSDFD OSFHSAFH HJKLJH
          FDSSS FDSSS DFDPASDS",degree:2,author:"",authorLink:"",lyrics:""},{name:"卡农 (括号是一起按) ",content:"T-UOS W-YOA E-TUP 0-RYO
          Q-ETI 8-WTU Q-ETI W-RYO
          (TF)-UOS (WD)-RYO (SE)-TUP (A0)-RUO
          (PQ)-ETI (O8)-0WT (PQ)-ETI (AW)-RYO
          SAST (R 9 )OYU (0T)SAP (0A)FHJ
          (QG)FDG (F8)DSA (QP)OIU (WY)IUY
          (WT)YUI (WR)YOI (EU)POI (0O)IUY
          (QT)EPA (8S)APO (QI)UYP OPO
          (HU)FGH-FG(HW)OPASDFG
          (EF)SDF-UI(RO)POIOUIO
          (EI)POI-UY(UW)YTYUIOP
          (EI)POP-AS(RO)PASDFGH
          (HY)FGH-FG(HW)OPASDFG
          (EF)SDF-UI(RO)POIOUIO
          (EI)POI-UY(WU)YTYUIOP
          (EI)POP-AS(RO)PASDFGH
          (TF)-UOS (WD)-RYO (SE)-TUP (A0)-RUO
          (PQ)-ETI (O8)-0WT (PQ)-ETI (AW)-",degree:5,author:"",authorLink:"",lyrics:""},{name:"不能说的秘密",content:"WTTT WRRR WTTT WYYY WTTT WRRR WTTT WYYY WIIII IUU IIIOUYTRRT
          WOOOO OII OOOOOIIUUY WIIII IUU IIIOUYTRRYT ETOPT OOOOOIIUUY
          TSASSOOOOIIU TSASSOOOODDS TSASAPTAPAPO TPOPOIIUIOPPO
          TSASSOOOOIIU TSASSOOOODDS TSASAP TAPAPO TPOPOIIUIOPPO TOTIU TTOTIUT",degree:1,author:"",authorLink:"",lyrics:""},{name:"往事难忘",content:"T TYU UIO POU OIUY IUYT
          T TYU UIO POU OIUY UYT
          OIUY WWIUYT OIUY IUYT
          T TYU UIO POU OIUY UYT",degree:1,author:"",authorLink:"",lyrics:""},{name:"梁祝",content:"OUYT YREW
          APAOPIUO YUOYUIUYT
          ORYETW ETW
          0WETY ETW
          OSPOUOY
          YUREWETY0TEWETW
          UORYETW 0W0WERYE
          WETYOUYUYTEW0T ETEW0WETW
          UOYUYTREW",degree:1,author:"",authorLink:"",lyrics:""},{name:"大海",content:"EWTTTT WETTYT ETYYYY TEYYUY
          UOPPOP OUYUYTE WETTTTYT
          UOPPPPSPOOPO UYTTTTYU
          UYTTTTSPOOPO UOPSSPO
          UOPPPPSPOOPO UYTTTTOU
          UYTTTTYUOOUO UOP EUYTT",degree:1,author:"",authorLink:"",lyrics:""},{name:"虫儿飞",content:"UUUIOUYY TTTYUURR EUY EUY EUYTT
          UUUIOUYY TTTYUURR EUY EUY EUYTT
          UYO IUY OIUIOUY TEUY TEYT IUIUT TIUIUTYT",degree:2,author:"",authorLink:"",lyrics:""},{name:"雪绒花",content:"0WY TWQ 000QWEW
          0WY TWQ 0WWERTT
          Y WWREW0WT
          ETYTRW
          0WY TWQ
          0WWERTT",degree:1,author:"",authorLink:"",lyrics:""},{name:"痴心绝对",content:"SDFFFGFDDSDDHD SASSSFFSSPAAFA
          POPPPGGFHS POPPPGGSSPD
          SSDFFFGFDDSDDHD SASSSFFSSPAAFA
          POPPGGFHS POPPPGGSSSAS",degree:3,author:"",authorLink:"",lyrics:""},{name:"画心",content:"OUU YTYYOU OUUYTYOmU OUUYTYTRTYRWE 0WE EUYTRWE WWEETREW90 00WERTWTYU
          OUU YTYTRTYRWE 0WEEUYTRWE 0WETREWE0 0WEERTWTYU OUU YTYTRTYRWE 0WEEUYTRWE
          OUU YTYTRTYRWE 0WEEUYTRWE OUUYTYYOU OUUYTYOmU OUUYTYTRTYRWE 0WEEUYTRWE",degree:1,author:"",authorLink:"",lyrics:""},{name:"蜗牛",content:"U UUIUYUYT TTI IYTTYU TTO OPOIUI RT WWU UIUYUT WWT TWTYUIO TSAA ASAPPAOTIOP PASDFO WEOI IOIUYTY WWT TWTYUIO TSAA ASAPPAO TIOP PASDFO WEOI IUYTTRT
          ",degree:1,author:"",authorLink:"",lyrics:""},{name:"神秘园",content:"UPAS AS SDAPA ASPOP OU UPAS AS SDAPA ASPOP OP ASHJ JKHGH ASFG GHFDF ASHJ JKHGH HJGFG GHFDF UPAS AS SDAPA ASPOP OU UPAS AS SDAPA ASPOP OP",degree:1,author:"",authorLink:"",lyrics:""},{name:"无赖",content:"TYUUYUIUYRW ERTTYUUPOUO UOPPPOI UIOOIU UIIOITY TYUUYUIUYRW ERTTYUUPOUO UOPPPOI UIOOIU UIUTYT TTWERTTYUTW WQQEWQW WEERUYYTRT TTEWER WWWUYTTYUTO UUOPPASOU UUOPPPIPAPOIOU UIUIOPOO WUYTTYUTO UUOPPASAU UUOPPPIPAPOUYT UIUIOPOOUYTT",degree:1,author:"",authorLink:"",lyrics:""},{name:"海阔天空",content:"FDS DFHHHHJH JKLLLLLLKJHJ
          JHH HFDS FGFDDFDD FDDDSSSS DSS
          JKLLLLLLKJHHHFDS
          LLLLZZZLZX XZL
          LLLLZZ HHXZL
          LLLLZZZZLKL
          JJKJKL LLZLZX XZXL",degree:1,author:"",authorLink:"",lyrics:""},{name:"下一站天后",content:"FFFHD DHSSSFP GFGJF GHDDPSD FDFHHDFLKHHJ GFGHPSFDS
          FHKLKJHH FGHJGGFD DSDFHH FJFDSD PSFDDFH
          LKJKJ HHSFHH JJJGFD DDKH FFHS FFDDD JFH LKJKJHH SFHH JJJJLKJKLHHFHJHHGPAS",degree:3,author:"",authorLink:"",lyrics:""},{name:"红河谷",content:"WTUUUUYUYT
          WTUTUOIUY
          OIUUYTYUOI
          EEWRTYUYT
          OTUUUYUYT
          WTUUUOIUY
          OIUUYTYUOII
          EEWRYUYT",degree:1,author:"",authorLink:"",lyrics:""},{name:"一千年以后",content:"STYUPO IUTUY STYUPAO UP AAASDSA SASFF
          APAO PPASDSDGFDDFS SASF APAOPS

          SSSDFGFSFD OSD FDSOD FDSAPUA

          SAPASDOFF FGFSDD OSD FDSOD DFDSAPDA

          SAPOPSODS FFGFD SDFDSDSODS",degree:3,author:"",authorLink:"",lyrics:""},{name:"男儿当自强",content:"PSPSPOP
          PSPSOPD
          FSDH FDFS
          DFSDP
          SDPSO
          PSDSPO PSO
          PSPOP SDSPO
          PSOPD FHDFJ
          FJHGFHFDF
          FHJKJHF FHJKHJK
          JKJHFHJKJHFHD
          FDSDHGFHD
          DFHJFHFDS PDS
          PSDFA AFDAP
          PSPOP
          PSPOP
          FHDFJ
          ",degree:3,author:"",authorLink:"",lyrics:""},{name:"回到过去 ",content:"TUUYYTRT
          TRREEW0E
          EWWTTUUY
          YTTTREW
          TUUYYTRYT
          TRREEW0R
          EWWW
          WQ0WQ
          TUUY
          YYYTYUUY
          WRTTRTPO
          TYTUTTRWW
          WTYTUTIIUY
          WTYUU
          UYUIIUUY
          YTUUUYYTRT
          TYTUUUU
          TTOOUUU
          TTYYTTTETETY
          WTYRT",degree:1,author:"",authorLink:"",lyrics:""},{name:"亲爱的那不是爱情 ",content:"SSSAPPOPOOIUO
          TPPPPOSUUYYTY
          UYTRTOO
          OTPOOO
          PASSSOIUYTT
          SSSAPPOPOOIUO
          TPPPPOSUUYYTY
          UYTRTOO
          OTPOOO
          PASSSOIUYTT
          UUODFOAASP
          IIPHGPSSDA
          OOUDSDFDSU
          SAOSAAOFFGD
          UUODFOAASP
          IIPHGPSSDA
          OOUDSDFDSS
          PSHGFDSS",degree:3,author:"",authorLink:"",lyrics:""},{name:"哆啦A梦主题曲",content:"WTTUPUO
          OPOUIUY
          EYYIAAPOIIUERTY
          WTTUPUO
          OPOUIUY
          EYYIAAPOIIUERYT
          PPOIOPO
          YUIYO
          POIYAPOPOI
          OPUYT",degree:3,author:"",authorLink:"",lyrics:""},{name:"想唱就唱",content:"SASDSO UIIIOU
          SASDSO OPPPSA
          SASDFSOU SDSOU
          SASDFSOS GFDSF
          FGHJ SSDFD
          DFGH HGFDF
          FGHJHH KKLKHDF GFGH
          FGHJ SSDFD
          DFH FKKFL LKLJHSS JHGFGH JH
          FGHJ SSDFD
          DFGH HGFDF
          FGHJHH KKLKHDF GFGH
          FGHJ SSDFD
          DFH FKKFL LKLJHSS JHGFGH",degree:3,author:"",authorLink:"",lyrics:""},{name:"星语心愿",content:"JLKJHJF JHJLKLKJKL  
          LZXXXXZ LKJKH JLKJHJ  
          FHJXZLKL LKJJJJHHJF  
          HHJXZLKLL LKJJHKJ",degree:2,author:"",authorLink:"",lyrics:""},{name:"千千阙歌",content:"TTYU OPSAAAOU YYYUI PSFDDAOTTYU OPSAAAOU YYYUI PSFDDAOPOPOPAAPA DDDDASDFFFDDDSF AOPOPSDFFDF FDSD SPP OPSD FFDF FHJHFFFFDDSDSP FFGFDSD FF F DDSD SPSS",degree:3,author:"",authorLink:"",lyrics:""},{name:"欢乐颂",content:"U U I O O I U Y T T Y U U Y YU U I O O I U Y T T Y U Y T T Y Y U T Y U I U T Y U I U Y T Y W U U I O O I U Y T T Y U Y T T ",degree:1,author:"",authorLink:"",lyrics:""},{name:"会呼吸的痛",content:"HJLJXXJZ ZZLKLZXZHL LKJKLGGGLLZLHHH HCXZXX HJLJXXJZ ZZLKLZXZHLL LKJKLGGGLLZLHHH HJKLLKLL ",degree:3,author:"",authorLink:"",lyrics:""},{name:"夜曲",content:"PA SSSSAFF JJJHGHSS
          GGGHFAFD DSASSA
          SSSSAFF JJJHGHSS
          GGG FDASP",degree:2,author:"",authorLink:"",lyrics:""},{name:"暗香",content:"UIURTUP SAOU UIURTUP
          SAOF PPPSFOIPD DFGDFGF
          PDFGDFGP PFGHFGHP DFGPG
          HIDFDFGF
          UIURTUPSAOU
          UIURTUPSAOP ",degree:3,author:"",authorLink:"",lyrics:""},{name:"美丽的神话 ",content:"PFA PSDSF PJHJHDGF
          PJHDFGF S PFDAP
          PFAPSDSF PJHJHDGF
          PJHDFGFDS PDSAP
          PASDFSAO PSDFF
          PASDFSAOPSDSS PDSAP
          PASDFSAO PSDFF
          PASDFSAOPSDSS SSDFSAOSAPAJ",degree:2,author:"",authorLink:"",lyrics:""}]},HMrw:function(t,e,i){e=t.exports=i("FZ+f")(!1),e.push([t.i,'.score-container.component-auto-list{width:40%;min-width:500px;padding-bottom:50%;font-size:14px;overflow:hidden;background:hsla(0,0%,100%,.6);border-radius:5px;border:1px solid #ddd;position:relative}.score-container.component-auto-list .list-view{width:100%;height:100%;position:absolute;top:0;left:0;padding:20px 15px;overflow-y:scroll}.score-container.component-auto-list .component-title{margin:0 0 10px;font-size:18px;font-weight:700;line-height:26px;position:relative}.score-container.component-auto-list .component-title .title-img{display:inline-block;width:26px;vertical-align:middle}.score-container.component-auto-list .component-title .title{vertical-align:middle;margin-left:5px}.score-container.component-auto-list .component-title .degree{width:150px;float:right;text-align:left}.score-container.component-auto-list .list{width:100%;padding-left:25px;padding-bottom:10px;line-height:32px}.score-container.component-auto-list .list .list-item{height:32px;line-height:32px;list-style:none}.score-container.component-auto-list .list .list-item a{display:inline-block;min-width:120px;cursor:pointer}.score-container.component-auto-list .list .list-item .icon-pause{display:inline-block;-webkit-transform:scale(.6);transform:scale(.6);cursor:pointer}.score-container.component-auto-list .list .list-item .icon-pause:hover{opacity:.8}.score-container.component-auto-list .list .list-item a:hover{color:#1295db;text-decoration:underline}.score-container.component-auto-list .list .list-item .num{float:left;width:35px;height:32px;font-size:16px;margin-left:-35px;text-align:center;color:#ef496f}.score-container.component-auto-list .list .list-item .difficulty-degree{width:150px;float:right;text-align:left}.score-container.component-auto-list .list .list-item .difficulty-degree .icon-heartbeat{display:inline-block;-webkit-transform:scale(.7);transform:scale(.7);margin-left:-6px}.score-container.component-auto-list .player-view{font-size:16px;width:100%;height:100%;position:absolute;top:0;left:0;padding:20px 15px;overflow-y:scroll}.score-container.component-auto-list .player-view .top-bar .return-btn{cursor:pointer;width:80px;height:32px;line-height:32px;font-size:14px;color:#1f6fb5}.score-container.component-auto-list .player-view .top-bar .return-btn:hover{text-decoration:underline;color:#1295db}.score-container.component-auto-list .player-view .top-bar h2{font-size:18px}.score-container.component-auto-list .player-view .cd-box{width:400px;margin:15% auto 10px;padding:10px;border-radius:15px;position:relative}.score-container.component-auto-list .player-view .cd-box .cd-reader-1{width:100px;height:10px;border-radius:5px;background:-webkit-gradient(linear,left top,right top,from(#333),color-stop(#aaa),to(#333));background:linear-gradient(90deg,#333,#aaa,#333);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:rotate(60deg);transform:rotate(60deg);position:absolute;top:10px;left:10px}.score-container.component-auto-list .player-view .cd-box .cd-reader-1:before{content:"";width:20px;height:20px;border-radius:50%;background:#888;position:absolute;top:-6px;left:-6px;border:2px solid #444}.score-container.component-auto-list .player-view .cd-box .cd-reader-2{width:80px;height:10px;border-radius:5px;background:-webkit-gradient(linear,left top,right top,from(#333),color-stop(#666),to(#888));background:linear-gradient(90deg,#333,#666,#888);-webkit-transform:rotate(20deg);transform:rotate(20deg);position:absolute;top:105px;left:50px;z-index:10}.score-container.component-auto-list .player-view .cd-box .cd{width:220px;height:220px;margin:0 auto;border-radius:50%;border:5px solid #ccc;background:-webkit-gradient(linear,left top,right top,from(#000),color-stop(#555),to(#000));background:linear-gradient(90deg,#000,#555,#000);position:relative}.score-container.component-auto-list .player-view .cd-box .cd .cd-inner{width:70px;height:70px;line-height:65px;border-radius:50%;border:3px solid #aaa;background:#cd3f11;position:absolute;top:0;left:0;bottom:0;right:0;margin:auto;text-align:center;color:#fff;font-size:12px}.score-container.component-auto-list .player-view .music-name{text-align:center;padding:15px 0 5px;font-size:20px;font-weight:700}.score-container.component-auto-list .player-view .difficulty-degree{text-align:center}.score-container.component-auto-list .player-view .difficulty-degree .icon-heartbeat{display:inline-block;-webkit-transform:scale(.7);transform:scale(.7);margin-left:-6px}.score-container.component-auto-list .player-view .control-bar{width:100%;text-align:center;padding:15px 0}.score-container.component-auto-list .player-view .control-bar .stop-btn{display:inline-block;width:70px;height:30px;line-height:30px;background:#ef496f;color:#fff;cursor:pointer}.score-container.component-auto-list .player-view .control-bar .stop-btn:hover{opacity:.8}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}',""])},HhN8:function(t,e){!function(e){"use strict";function i(t,e,i,n){var a=e&&e.prototype instanceof o?e:o,r=Object.create(a.prototype),s=new h(n||[]);return r._invoke=u(t,i,s),r}function n(t,e,i){try{return{type:"normal",arg:t.call(e,i)}}catch(t){return{type:"throw",arg:t}}}function o(){}function a(){}function r(){}function s(t){["next","throw","return"].forEach(function(e){t[e]=function(t){return this._invoke(e,t)}})}function l(t){function e(i,o,a,r){var s=n(t[i],t,o);if("throw"!==s.type){var l=s.arg,u=l.value;return u&&"object"==typeof u&&_.call(u,"__await")?Promise.resolve(u.__await).then(function(t){e("next",t,a,r)},function(t){e("throw",t,a,r)}):Promise.resolve(u).then(function(t){l.value=t,a(l)},r)}r(s.arg)}function i(t,i){function n(){return new Promise(function(n,o){e(t,i,n,o)})}return o=o?o.then(n,n):n()}var o;this._invoke=i}function u(t,e,i){var o=k;return function(a,r){if(o===x)throw new Error("Generator is already running");if(o===P){if("throw"===a)throw r;return m()}for(i.method=a,i.arg=r;;){var s=i.delegate;if(s){var l=c(s,i);if(l){if(l===F)continue;return l}}if("next"===i.method)i.sent=i._sent=i.arg;else if("throw"===i.method){if(o===k)throw o=P,i.arg;i.dispatchException(i.arg)}else"return"===i.method&&i.abrupt("return",i.arg);o=x;var u=n(t,e,i);if("normal"===u.type){if(o=i.done?P:O,u.arg===F)continue;return{value:u.arg,done:i.done}}"throw"===u.type&&(o=P,i.method="throw",i.arg=u.arg)}}}function c(t,e){var i=t.iterator[e.method];if(i===y){if(e.delegate=null,"throw"===e.method){if(t.iterator.return&&(e.method="return",e.arg=y,c(t,e),"throw"===e.method))return F;e.method="throw",e.arg=new TypeError("The iterator does not provide a 'throw' method")}return F}var o=n(i,t.iterator,e.arg);if("throw"===o.type)return e.method="throw",e.arg=o.arg,e.delegate=null,F;var a=o.arg;return a?a.done?(e[t.resultName]=a.value,e.next=t.nextLoc,"return"!==e.method&&(e.method="next",e.arg=y),e.delegate=null,F):a:(e.method="throw",e.arg=new TypeError("iterator result is not an object"),e.delegate=null,F)}function f(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function d(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function h(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(f,this),this.reset(!0)}function p(t){if(t){var e=t[b];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var i=-1,n=function e(){for(;++i=0;--n){var o=this.tryEntries[n],a=o.completion;if("root"===o.tryLoc)return e("end");if(o.tryLoc<=this.prev){var r=_.call(o,"catchLoc"),s=_.call(o,"finallyLoc");if(r&&s){if(this.prev=0;--i){var n=this.tryEntries[i];if(n.tryLoc<=this.prev&&_.call(n,"finallyLoc")&&this.prev=0;--e){var i=this.tryEntries[e];if(i.finallyLoc===t)return this.complete(i.completion,i.afterLoc),d(i),F}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var i=this.tryEntries[e];if(i.tryLoc===t){var n=i.completion;if("throw"===n.type){var o=n.arg;d(i)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,i){return this.delegate={iterator:p(t),resultName:e,nextLoc:i},"next"===this.method&&(this.arg=y),F}}}(function(){return this}()||Function("return this")())},HmLE:function(t,e,i){e=t.exports=i("FZ+f")(!1),e.push([t.i,'.component-page-header{width:100%;height:60px;line-height:60px;margin:10px auto;padding:0 5%}.component-page-header .trade-mark{display:block;width:350px;position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:center;-ms-flex-align:center;align-items:center;float:left}.component-page-header .trade-mark .icon-piano{display:block;-webkit-transform:scale(.7);transform:scale(.7);-webkit-transform-origin:50% 30%;transform-origin:50% 30%}.component-page-header .trade-mark .trade-mark-txt{font-size:28px;font-weight:500;color:#000;margin:0 0 0 10px}.component-page-header .trade-mark .trade-mark-txt .trade-mark-txt--en{font-style:italic;font-size:20px;color:#666;margin-left:7px}.component-page-header .menu{float:right;height:45px;line-height:45px;margin-top:5px}.component-page-header .menu .menu-item{display:inline-block;width:80px;margin:0 7px;text-align:center;position:relative;cursor:pointer}.component-page-header .menu .menu-item:before{height:1px;-webkit-transform:scaleX(1);transform:scaleX(1);background:#ccc}.component-page-header .menu .menu-item:after,.component-page-header .menu .menu-item:before{content:"";width:100%;position:absolute;left:0;bottom:0;-webkit-transition:.3s;transition:.3s}.component-page-header .menu .menu-item:after{height:5px;-webkit-transform:scaleX(0);transform:scaleX(0);background:#1295db}.component-page-header .menu .menu-item-active:after,.component-page-header .menu .menu-item:hover:after{-webkit-transform:scaleX(1);transform:scaleX(1)}',""])},IISb:function(t,e,i){e=t.exports=i("FZ+f")(!1),e.push([t.i,".component-commodity-card{display:inline-block;width:100%;height:auto;font-size:14px;text-align:left;background:#fff}.component-commodity-card .pic-wrap{width:100%;padding:10px 20px;overflow:hidden}.component-commodity-card .pic-wrap .pic{width:100%}.component-commodity-card .card-section{padding:5px 8px}.component-commodity-card .commodity-name{display:block;width:100%;font-weight:700;text-overflow:ellipsis;overflow:hidden;word-break:break-all;white-space:nowrap}.component-commodity-card .commodity-name:hover{text-decoration:underline}.component-commodity-card .em{color:#ef496f;font-weight:700}.component-commodity-card .price{float:left}.component-commodity-card .price .price-info{font-size:12px;color:#888}.component-commodity-card .sale-count{float:right}.component-commodity-card .seller-name{font-size:12px;color:#888}.component-commodity-card .btn-wrap{text-align:center;padding:5px 0 15px}.component-commodity-card .link-btn{display:inline-block;width:100px;height:26px;line-height:26px;border-radius:13px;background:#ef496f;color:#fff;text-align:center;cursor:pointer}.component-commodity-card .link-btn:hover{opacity:.8}",""])},IRP5:function(t,e,i){e=t.exports=i("FZ+f")(!1),e.push([t.i,".component-commodity-list{width:100%;height:auto;margin:30px auto;padding:0;text-align:center;letter-spacing:-20px;background:hsla(0,0%,100%,.6);border-radius:5px;overflow:visible;white-space:nowrap;position:relative}.component-commodity-list .scroll-wrap{width:100%;padding:20px 0;overflow:scroll}.component-commodity-list .card-wrap{display:inline-block;width:20%;margin:0 2.5%;-webkit-box-shadow:1px 1px 10px 1px #ddd;box-shadow:1px 1px 10px 1px #ddd;border-radius:5px;overflow:hidden;letter-spacing:normal}.component-commodity-list .arrow{width:35px;height:35px;border-top:6px solid rgba(239,73,111,.5);border-right:6px solid rgba(239,73,111,.5);position:absolute;top:calc(50% - 17.5px);cursor:pointer}.component-commodity-list .arrow:hover{border-color:rgba(239,73,111,.8)}.component-commodity-list .left-arrow{left:-10px;-webkit-transform:rotate(225deg);transform:rotate(225deg)}.component-commodity-list .right-arrow{right:-10px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}",""])},IVAj:function(t,e,i){"use strict";function n(t){if(!Array.isArray(t))throw new TypeError("Expected value to be an array");return o(t)}function o(t){return s(t,[])}function a(t,e){if(!Array.isArray(t))throw new TypeError("Expected value to be an array");return r(t,e)}function r(t,e){if("number"!=typeof e)throw new TypeError("Expected the depth to be a number");return l(t,[],e)}function s(t,e){for(var i=0;i-1&&Array.isArray(o)?l(o,e,i):e.push(o)}return e}t.exports=n,t.exports.from=o,t.exports.depth=a,t.exports.fromDepth=r},Ibhu:function(t,e,i){var n=i("D2L2"),o=i("TcQ7"),a=i("vFc/")(!1),r=i("ax3d")("IE_PROTO");t.exports=function(t,e){var i,s=o(t),l=0,u=[];for(i in s)i!=r&&n(s,i)&&u.push(i);for(;e.length>l;)n(s,i=e[l++])&&(~a(u,i)||u.push(i));return u}},"Is+7":function(t,e){function i(t,e){if("object"!=typeof t)throw"Invalid MIDI data";e=e||{};var i,a=t.header||{},s=t.tracks||[],l=s.length,u=new r;for(n(u,a,l),i=0;i>7&127;t.writeUInt8(h),t.writeUInt8(p);break;default:throw"Unrecognized event type: "+o}return l}function r(){this.buffer=[]}r.prototype.writeUInt8=function(t){this.buffer.push(255&t)},r.prototype.writeInt8=r.prototype.writeUInt8,r.prototype.writeUInt16=function(t){var e=t>>8&255,i=255&t;this.writeUInt8(e),this.writeUInt8(i)},r.prototype.writeInt16=r.prototype.writeUInt16,r.prototype.writeUInt24=function(t){var e=t>>16&255,i=t>>8&255,n=255&t;this.writeUInt8(e),this.writeUInt8(i),this.writeUInt8(n)},r.prototype.writeInt24=r.prototype.writeUInt24,r.prototype.writeUInt32=function(t){var e=t>>24&255,i=t>>16&255,n=t>>8&255,o=255&t;this.writeUInt8(e),this.writeUInt8(i),this.writeUInt8(n),this.writeUInt8(o)},r.prototype.writeInt32=r.prototype.writeUInt32,r.prototype.writeBytes=function(t){this.buffer=this.buffer.concat(Array.prototype.slice.call(t,0))},r.prototype.writeString=function(t){var e,i=t.length,n=[];for(e=0;e>=7;e;){var n=127&e|128;i.push(n),e>>=7}this.writeBytes(i.reverse())}},r.prototype.writeChunk=function(t,e){this.writeString(t),this.writeUInt32(e.length),this.writeBytes(e)},t.exports=i},"J1/g":function(t,e){function i(t){var e=new a(t),i=e.readChunk();if("MThd"!=i.id)throw"Bad MIDI file. Expected 'MHdr', got: '"+i.id+"'";for(var r=n(i.data),s=[],l=0;!e.eof()&&l>8),o.ticksPerFrame=255&r):o.ticksPerBeat=r,o}function o(t){for(var e=new a(t),i=[];!e.eof();){var n=function(){var t={};t.deltaTime=e.readVarInt();var i=e.readUInt8();if(240==(240&i)){if(255!==i){if(240==i){t.type="sysEx";var n=e.readVarInt();return t.data=e.readBytes(n),t}if(247==i){t.type="endSysEx";var n=e.readVarInt();return t.data=e.readBytes(n),t}throw"Unrecognised MIDI event type byte: "+i}t.meta=!0;var a=e.readUInt8(),n=e.readVarInt();switch(a){case 0:if(t.type="sequenceNumber",2!==n)throw"Expected length for sequenceNumber event is 2, got "+n;return t.number=e.readUInt16(),t;case 1:return t.type="text",t.text=e.readString(n),t;case 2:return t.type="copyrightNotice",t.text=e.readString(n),t;case 3:return t.type="trackName",t.text=e.readString(n),t;case 4:return t.type="instrumentName",t.text=e.readString(n),t;case 5:return t.type="lyrics",t.text=e.readString(n),t;case 6:return t.type="marker",t.text=e.readString(n),t;case 7:return t.type="cuePoint",t.text=e.readString(n),t;case 32:if(t.type="channelPrefix",1!=n)throw"Expected length for channelPrefix event is 1, got "+n;return t.channel=e.readUInt8(),t;case 33:if(t.type="portPrefix",1!=n)throw"Expected length for portPrefix event is 1, got "+n;return t.port=e.readUInt8(),t;case 47:if(t.type="endOfTrack",0!=n)throw"Expected length for endOfTrack event is 0, got "+n;return t;case 81:if(t.type="setTempo",3!=n)throw"Expected length for setTempo event is 3, got "+n;return t.microsecondsPerBeat=e.readUInt24(),t;case 84:if(t.type="smpteOffset",5!=n)throw"Expected length for smpteOffset event is 5, got "+n;var r=e.readUInt8(),s={0:24,32:25,64:29,96:30};return t.frameRate=s[96&r],t.hour=31&r,t.min=e.readUInt8(),t.sec=e.readUInt8(),t.frame=e.readUInt8(),t.subFrame=e.readUInt8(),t;case 88:if(t.type="timeSignature",4!=n)throw"Expected length for timeSignature event is 4, got "+n;return t.numerator=e.readUInt8(),t.denominator=1<>4;switch(t.channel=15&i,u){case 8:return t.type="noteOff",t.noteNumber=l,t.velocity=e.readUInt8(),t;case 9:var c=e.readUInt8();return t.type=0===c?"noteOff":"noteOn",t.noteNumber=l,t.velocity=c,0===c&&(t.byte9=!0),t;case 10:return t.type="noteAftertouch",t.noteNumber=l,t.amount=e.readUInt8(),t;case 11:return t.type="controller",t.controllerType=l,t.value=e.readUInt8(),t;case 12:return t.type="programChange",t.programNumber=l,t;case 13:return t.type="channelAftertouch",t.amount=l,t;case 14:return t.type="pitchBend",t.value=l+(e.readUInt8()<<7)-8192,t;default:throw"Unrecognised MIDI event type: "+u}}}();i.push(n)}return i;var o}function a(t){this.buffer=t,this.bufferLen=this.buffer.length,this.pos=0}a.prototype.eof=function(){return this.pos>=this.bufferLen},a.prototype.readUInt8=function(){var t=this.buffer[this.pos];return this.pos+=1,t},a.prototype.readInt8=function(){var t=this.readUInt8();return 128&t?t-256:t},a.prototype.readUInt16=function(){return(this.readUInt8()<<8)+this.readUInt8()},a.prototype.readInt16=function(){var t=this.readUInt16();return 32768&t?t-65536:t},a.prototype.readUInt24=function(){return(this.readUInt8()<<16)+(this.readUInt8()<<8)+this.readUInt8()},a.prototype.readInt24=function(){var t=this.readUInt24();return 8388608&t?t-16777216:t},a.prototype.readUInt32=function(){return(this.readUInt8()<<24)+(this.readUInt8()<<16)+(this.readUInt8()<<8)+this.readUInt8()},a.prototype.readBytes=function(t){var e=this.buffer.slice(this.pos,this.pos+t);return this.pos+=t,e},a.prototype.readString=function(t){var e=this.readBytes(t);return String.fromCharCode.apply(null,e)},a.prototype.readVarInt=function(){for(var t=0;!this.eof();){var e=this.readUInt8();if(!(128&e))return t+e;t+=127&e,t<<=7}return t},a.prototype.readChunk=function(){var t=this.readString(4),e=this.readUInt32();return{id:t,length:e,data:this.readBytes(e)}},t.exports=i},KUTN:function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=new WeakMap,o=function(){function t(t,e){n.set(this,e),this.ticks=t.absoluteTime,this.value=t.value}return Object.defineProperty(t.prototype,"time",{get:function(){return n.get(this).ticksToSeconds(this.ticks)},set:function(t){var e=n.get(this);this.ticks=e.secondsToTicks(t)},enumerable:!0,configurable:!0}),t.prototype.toJSON=function(){return{ticks:this.ticks,time:this.time,value:this.value}},t}();e.PitchBend=o},Kh4W:function(t,e,i){e.f=i("dSzd")},Kh5d:function(t,e,i){var n=i("sB3e"),o=i("PzxK");i("uqUo")("getPrototypeOf",function(){return function(t){return o(n(t))}})},L42u:function(t,e,i){var n,o,a,r=i("+ZMJ"),s=i("knuC"),l=i("RPLV"),u=i("ON07"),c=i("7KvD"),f=c.process,d=c.setImmediate,h=c.clearImmediate,p=c.MessageChannel,m=c.Dispatch,y=0,g={},_=function(){var t=+this;if(g.hasOwnProperty(t)){var e=g[t];delete g[t],e()}},v=function(t){_.call(t.data)};d&&h||(d=function(t){for(var e=[],i=1;arguments.length>i;)e.push(arguments[i++]);return g[++y]=function(){s("function"==typeof t?t:Function(t),e)},n(y),y},h=function(t){delete g[t]},"process"==i("R9M2")(f)?n=function(t){f.nextTick(r(_,t,1))}:m&&m.now?n=function(t){m.now(r(_,t,1))}:p?(o=new p,a=o.port2,o.port1.onmessage=v,n=r(a.postMessage,a,1)):c.addEventListener&&"function"==typeof postMessage&&!c.importScripts?(n=function(t){c.postMessage(t+"","*")},c.addEventListener("message",v,!1)):n="onreadystatechange"in u("script")?function(t){l.appendChild(u("script")).onreadystatechange=function(){l.removeChild(this),_.call(t)}}:function(t){setTimeout(r(_,t,1),0)}),t.exports={set:d,clear:h}},LAuN:function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABiCAMAAACRZYZ7AAAC+lBMVEUAAADT1djq6+zU1ti5vcIqUIIlSn0tVYS8wMS8wMUvU4TZ290pT4ErUIJsgqO7v8MUTYMpT4IqUIIqUILJzM3R0dpLaZIrUIK9wsbs7O28wcUoT4IrUYMkRH0nUIO9wcW9wcUqT4Lq6+wpUILp6uu9wsbs7e6/wsfr7Ozq6+y8wcW9wcYpT4K9wsYoT4G1ur7q6+wAKHUqUILt7u/r7O29wsW8wMTp6uwpT4Lr6+y+wsbp6uy7v8W8wMXp6eopUILp6uvp6+u9wcTp6+snT4Gcpbfu7+/o7OzS19wpT4K9wcQAO3nY2tyeqbuOma3s7u4oToEAAFhtgaAyVIQUT4Tb3d82V4UANnrEyMuttcGBk6tabJF+iKMADm/p6uv////n6er+/v6h0v6j1P/r7O3q6+zt7e78/f6l1v/u7+/m6OkAQnwsVIgAPnrx8vHw8PCm2P8uVIUAQ34iSn2n2f8qUobh4+a6vsIcSn8lTIAuUoPCxck3VoU0VIMpTYAfR3wAN3nz9PXd4eUxU4QaRXoANHj5+/z19vfY3eK9wcUAOnvj5urDyMwyVogBRX83XY33+PouV4svT4Cxusm/w8e8wMS7v8MAPn0VQXfP0tVSeadAZpU5WYgQRHvv8fTAyNO1vswASIEIRHybzPfFzdnLz9KTobd+j6onSXuYyPTf4+jFyc2lscOGla5geJxFa5sXSH4fQnfV2uHR1t7X2t3J0NrHy86tt8d3iqdyhaRlfJ5acpdUbpUzWoskUIQOSYAAMHeez/uGtN/O09tfiLUeU4gDTIQAIHLr7vPU19q4wM2qs8J/i6RPbpcfToIAO3ip2//n6/CUxPC9xdGircCJmbFrf6A7YJAAKXWOvOjZ3uaBrtrEy9WPnrYLPncTPXSRwOzc3uB8qNS4wtFpk79lj7tDY48EN3LJzdF4pNB0n8uptceeqbxagq9LcqFAW4fIzM+ap7yKuONvmsaWpLuapLdLZI1/k68AEW+r1v20wNBtlsNslL+ZqcAUuoz/AAAAXnRSTlMAAvsF/f4OCPzafA7HcP74/vS/rRcK/qIxvIhFOh4U/ejap5liRTYi4czBrWJcT/318bZrT0/y7u7Vz4CAai3rxLKShSrGiiMdzXb52NWjmo496+rp6NHDvrqugm9sQn89ewAAEgRJREFUaN61mgVcG2cUwCEkG6wrsK3t1lknlXXWbmvn7u4uIcDdESEJJBCFJEQIEoK7u1uRQtHiMmAtXkptdVttvv1+e98lkIY1+3VsfRBCjtz98+R7733vsPtPYm93/43w879dwyz/wKB5/0eKgwVmk+Gr8b578RTEcLhp89NPP7NmGVzFFkOp1fgvngKn3XSfvNRgMNTf8aYDvLwkY2/KoT2+pC6LY9g/7XLGkYok7sy9N8GBhW94kOablJLr04Uoi9XjxfpQF3mtiL0/n+pYf8cCCry69TpfbUox09Oz64gvWGxRkAdKHalH9W5IRAmOhicdFrzjtju9lZXFPh4enp6HkkAX+0UwljjJqfXBbu4khU2Nlz+DVLG3BPXD3tLJnT4engD5AyA3Xr0IyJpSx9AgYJikn1p6r52Dg4P9fOAt9ZZJz/khBvMQmOsyF4u9vRXkZjk12cyAJx5Vfsc68urLly1bstze7qo7I46c9yEZB/doLm9B2ls9IblPThUhgAkSVRr66ANrV7901wsrn1+/8oW7Xv3StaiymAmmYp6H4EKMy1FiyZrNy8jfLBC227wE51NXfbKR7xWs1wcFBemD9dskyuPIWD4HtLLLY8Cyu9fFcZXLk2ssB1+UU/dbNNHLxXI2izIn2G5VzGSxp6cHszhS2nIDXOIyMA88WhovFofK4252mI/gemq+BcKiJhgY9HnBxnOEXUwEOZQU8dnl+WONPI4al5xsoK46+iYEDnls3aPx4nA3d3A9PLzOiBOSMQsFa2rTdjDBWPsiY3qcHkFJ57a7b/tHFloS+VHu7sH91NBHYWWbKC8edYkjTJp49VPjQ0X4PANX/yShFQPE78BeTmEGb/1au9s+jb72dtsUsExoQmkwaZZkl+Q35yDr7jA4xquDooL1xFFqKLXfwmAQuyOUlblM8HtXdfZWHpvHeu/rtwL8r73KFgXMc7NhgwjsDt90x9L7QHfT4TWPhq6C3JhfKhbHi5OBMQ9hZbUqU7aDR3JPayPzCDBj1BPvPpTmjSi2IPflb8CBAMJfJX9yyRxk2dul4oR4MVUMIQF6XAw50Vbd5YFiKzV9xRbkKzZ/4ysPpZG62IC8WLoh3KQJw9Fg0gQerz3BEyUb4uND40qTwR+XgvgUR6Y3h+AMOIIR2CsP2bQYHHwmLgFSIZJkl/ybzYy19+gpOMbev3+/iE0Awwqy1dWsSSWpCYOf2cnC+e+Axa4HyiUhy5ziqMlB7u5REESr1sAB0O7Ze4IoOJ1Bx0DgaQFk4CKf7CbYWGZPcw3BQBR/m5TNhjhqfH5yKNUx/2kT43VgmC4IMn9xs7CxvDRTdG0/Vd2zlYWHRGolJAUsZoMC8oyjIR5iSC5/ETyCisl6PTCshEHHMRafh4TPZ/9U5Q/p0cPv2N6wH3lsfGBYltNcw6ITtilk7loVGrrKabM5C90VRVmAwAmMUVc2W/7tt9+Wj58dbZJop2Exftch5DaW4HRWVpsmvbmTIB57960A7+tR/TK51joL2y/b/MA6BzuTsR7hU6wRDFZ4/1iTrE3A4QhAsodlMu1xgDB3phb11PEZdCJWEJgOFgta+dVwxDUmxsvwbH+pemJy+kYWxVoN1u6GbI5EIeS29/7yS6+OI6TJlCkoQfp1FbVvJRhA2SoIzGmuowS/+o2JAT1A9N86JXsQM+4FvTWDKDnrygkQcNqaZrM6Q0Lqto4PSaTSyGIEmaEJh0QYHVGMAVOz8NtauATJ8A2wVZTh4KYgawarxlmVxs2eOLEjystcwoJ3VEikx/ygMG6fVHAzMQYK9hO6RhFO4T0Pl0AMb5rKFgUi6wkrjzD4oy3pgbqGPBPA3cuLTEDf9xad8gRhHlRWOWMEUHB6bC0Lwp2/2m45YgjTynUWygLIamtFwKUyyfBAFMo67oBA4u7lpu4J9J4GVZg7W2m08U4CLVkWDgyK/nnEiIgR1LldmArwRmXz75D1fCtbDXb/NLJCDTUFvkEHk3h5BZeH7T2OGgnPg3s1qh8KB0RsFoEjIfSbPvgoggYMN7ezvRqg/D1bbqJgFzNiwwIqnHeADmSR7CtR71KrSzKQvRJjUnN9YD1OD8sCJMa2yPLRTnV4eHjJlrwP29KquuvIE05wgHLVgghzsFqHDCIvO5BbEeVmQmwZHApr750K69k2uLvPa5sxaYaJ3AINtywnXchpd50oLCxsGDJKaO0rQkxpPRMgUDGtGyNI8BmUeQYmqpBUDfW5BSPErnL/KaWSI+BwtdopQXNBo0Ra6YGiuMM/pqqgUWPkatNHOFyuksOJLMswfa7v22WIYX/xely+7qrVwRSGxVhnVYGtJeAOKAS/uXJjBC3bvgWp6A5LV4bRZDTtMbL1ShFy/3TbETve1N0jEPS0NJ7oc0N6ACMs0PsNa8aym+91crqjloHPG6uuJyAsCxjQrozpNBLXgrwSPo/PU48ONvSoqmga7entKIpnlNLDqP3fUdOZl9e5JRhFOnz9nQEl3eloaWhcnPjMXBnEGT9zBROmxv4CxNhEHcbCUabH+bySmthtRolmz4Hv0IJMVRi/vzj2AAIvsoBhbSuoXGdcHA1ycQL1jNle2BZXjSCPVOR73Q/d5eEE3Vxb2HQ6C2NnNg+j0gWU49WJheh9XkgAgR59BbqA6IVZ/+Z8l3pcH8SWJ4hrMQZprbM5kgovpHpJhGykMBwzw/mD4zgOHF5nGi3pHIrifa0x3ruAAu81P3ZkTY5A8C5gLHeKi88w7aqoyWaXTLTpvif1n1VJtqkxlDrgBzYmaC/HYXGzWYWC6kMQX1Agi7izUW5zElV3ckWvIuK6pQsKit3roQkGd+QuXhy1no2j+K35SZFIBxu47TIGdu9GaQlTAwobV/2gKmRA+0BkDiuic1HtOjaiGW5uvBCbl5f3258NTa0qaaTshpetGcgljgly03ZHbobws7qVFRnIhVm9xnKCZDhX7CIY+LgOKKAUzmiWCGdQSzwdqZDlCIwcJAJjeo7O9eEHLQiLuZ6MWzVnrnzSubwyo6oAeV2/Tdk6gBRhNOo4EyEEHZtFFDZQLnCFp3zQTiglSRYp4HI4OTkcTlh3Y+bTFoSV4+tdDIwoL5YhIWE/xkCQk4m9sUiRjGjJT2ocxfSgMZA7EYIxiAKgNLAxojOsqNITrfpDQm5B7e6ssoKCsoHOEJHbI3YOl97tHnURx8cnxFPzcZMmP3J/yUTRn5Fd1UwegurHDZinhDWoWSGpwshpiC+fYwrOz9BrkEIQlOCnbDRfNznVy+MSwFhsC2Q3gvBVkibyEE7HtnICudtCCAarICynKYQoaeBID/gBpIMmaRLhDHPbQQl+yQpinVbukNejtLJAEyOCgJthpUC/gCgYUJrULDZ2sl15HBY9c5+v8LAIm8tHFK+nwFy2NsDLHmOZEKRPOHM+qfpJBGt8LLUWLmum0HFAsnmxU9XnUWbJjZC2AMTcolG8HrGzRYEG4DEWg2GG8MuydRdQdAUNKdN2E/iYquowUIg5i4FxANJe/YcZEmGGYKL+5P7Pn1lne9t1D58gMJPwBrrTnYMAEjzOzS7j07OyAyWTNaBLrEBDUpC2oMnv1prg/XFUMbU0/44HbLjlaruVfSH9WWOzZ0+Mdu7PPCyM7kP22t3LKWex+QNGE4WI5QTmVJB7H/xHnXCBT/LFaB+9gSo33GyjJb7ti/FuLmpFocJlD6VppkpQWglJVDRvIdj80WyZJLKTxcBijQrVKPSNmLpCS5tB0TVDk1SEQ3RgteJQar4IF52hhsZttlAsiJfvvjORE6MQIikqKtIqNCMnUKbJcNYmDvDYDF5mtkzY0kkwiNjhLIysaomK1Fy0GM8Lc35m4wycbYAkjtJwcO0Gw5Pg5IWMpY9Ht8QkSSdPnzp08GBXZWqklFa1zR3VoEFdTjl8TtClRyPrroHr1+I4GIvdmK7s8vEAyKki3VYMqZYgrveCuPdC05iFgzjowa/39lUcST04U8w0yfadx3ylmnCkyq40RU8NgaIp01VXEYLyPdlnnORoWveRM4PJmMRkFhyupYprzUWldkPoA3YO1jPLx6NpSakHdvr5ec6JD/NUUeIYWRkbBNwCFvSIQGlUsximdc0f4ETsOU/29seTJBW7gI33U8X7zZD9GwzPIIiFsZTmK5Qez/VB0z6POWF27BVMRKH4yuNoXAtCcBbBxskCCTiMlZk6WX0aNnVofxqjGuMzQLf9VHEynIBaj2Sxy2YEsTD8fbWT55hMEuHjh8THkzw5EdIXuLFJKONEzh4NIfgsBhKCry5zlZ5O3YcSvc+xvcMrtpAVRxSaEM8mKzCdHMPZWzMqdyIt4AyfnR0zMzMd0x7fMf3OJ3ELSVUye9NkUq5q6MesOgyaIrxzsCJMoxjeB2sEtlvRMg5SBARPFsMUBk5hyB2tFgowZNrTuaZZn0dHV2qrVCv1b0k52OE5HRmo20XmryGlTCaMkeoSDzdCe9d4WCcJTIo85/Prr3DWKaWkGTaOJIQtFzu6GPKPOlLrnZbbWTGSTAxAnJZqY2KEUqEwpkhJizxUqeCOk51U1lRAS0pqUnWMQpCYmCigxeyN6NoJ/eOvvzJ/3xNgzCTMaR4XGeKOxolD60ut5tVgK2ifmKjf9Di0R0jzNkYPDQ2tyG5PVyiKFDRZNjn16oMJ17niAwcr048kVVfvPZL6+7QfOgeaiCNpuguYZUyV8fZ9To863fu01eT9fggs0iHM7adgviu98cmQLSDJsYUtOQJJoIY7i2LF7WRiUYrnd8zi6Y4Dx4/NnNvpA2og+55PTdU1sC8auLFW2627ad3yBUX+QRiHR+7zYeamAOPaW+026QkkGFsdW3hYRZMcJqc74b5S4TRY1M8PFqqPHxnroPvBPYHREyILg8JbaR6YWS92RBG27NsODP/30Z/u0lMgQ2A4hrFqCtIC28vI5vDnHOEhuDQZgugnAk6n7ElTkX3fvKDdL4gFYaF4aysR4xo7ch//GIvCHxjE6IDilQkUzeROa0t7TKUHEwgmEKiz84/oIo2qUXQRgxL1qp2tGzq3gC5aYJinBatZ+IC3DigQLeoKRW8dWepTpbIDHts9mX5gMc/tuR1dkUmBnNaT7IsZQc8vsVURr7a75XFvYJhf2YPBGtoDwsowVPzOCtJ/DkYbjrGpACGsngMd5zoO/J4SrVTGSMKc8wj8IgZr41oyk9jS5TlvM+Oq66+BKdEOZy6ioJb4B0V2H6pddVMBNGkRhO+RI3urixTDVaqKrHBTtrREFsmwTVlqZlwb7b8U5l0kZRBRnKu4v5EbiEmpxr/NaBQkgmS3/tA4KuLjFzEo9KBHbNjKUrTmFPGmAeU1oHBIClbGySlEkOBvR9rKYi/MlhfCOOrkqJoO0ykrhv4p5NPLkqsfBso1MB/sm4CmdIyB9RurmrxQavlRNTUQxOLz0VyNBXNJhLAw8KCnLvv2mf0c5fUndjiPhJVjmHqFMm0XcsoJzkgBwyxWANLnxCO2GbYpS1b2NZbTcTy8IWc4D0G+z+YUQqm/lFCCNm4ibfWvKQ6vqjPQ0Hd2pI3c3Oa1pjuLsEsh6MHr19pi2KbcQFLsNq0PIij0syrBVgSpa02fKMEugeBRXlpCxu7iKMufekyPFYxkZ5k0qdr2NwiFEsRauRbyxGJul5IUGIs+e9djP3NdM1H2Gm1LbwjHFyL065HH7Rd3w/QGb//rXkYfcM2KKlN0bRVwx9m45fp0gh/Ee371EhNikRTag2RS/kDa1kQ2kidV7YMYxSx4hp6/8YmXnl1ustRiKVfdavrt+oiRMvI2YAM3rMYN3ZyLinLXb7xn5VPgCkBY1Fg8a6lvTPcOZK0tPYEf3wc3GuE243svrd70mnnQ+58BUAQepKX1ZpF9Z2zv5A129g5Llix3MP15ETrYKmcB3AY92XqlKnzvB6rp+g4OoMP/xojIGYJqAl9Z7RF3Xm1n9Z8Z/xujKjKcbOz7WhTeSy0Z8H9lcLxLSIZbOTfiDbDV/y7QXkhWhJsYY6pAWDb2/z/k1ud8pYd3kcPF38ICo9+/Egx7oESk96Ax8qhRFn391QhyJSiPRwi7Q9wyjTTLzPKKUDgrylqFLddeCYbFYr40Hc10h/pKydWgi2/AlWNYdLnSDHJJPvyfGX8BoxjtwOPqk94AAAAASUVORK5CYII="},LKZe:function(t,e,i){var n=i("NpIQ"),o=i("X8DO"),a=i("TcQ7"),r=i("MmMw"),s=i("D2L2"),l=i("SfB7"),u=Object.getOwnPropertyDescriptor;e.f=i("+E39")?u:function(t,e){if(t=a(t),e=r(e,!0),l)try{return u(t,e)}catch(t){}if(s(t,e))return o(!n.f.call(t,e),t[e])}},LQpA:function(t,e,i){"use strict";var n=function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"score-container component-auto-list"},[i("div",{directives:[{name:"show",rawName:"v-show",value:"LIST"==t.currentView,expression:"currentView=='LIST'"}],staticClass:"list-view"},[t._m(0),t._v(" "),i("ol",{staticClass:"list score-list"},t._l(t.ScoreNum,function(e,n){return i("li",{key:n,staticClass:"list-item score-item"},[i("span",{staticClass:"num"},[t._v(t._s(n+1))]),t._v(" "),i("a",{attrs:{href:"javascript:;"},on:{click:function(i){return t.clickScoreItem(e,"numscore")}}},[t._v("\n "+t._s(e.name)+"\n ")]),t._v(" "),i("i",{directives:[{name:"show",rawName:"v-show",value:e.playing,expression:"item.playing"}],staticClass:"pause icon-pause",on:{click:function(i){return t.stopMusicPlayer(e)}}}),t._v(" "),i("span",{staticClass:"difficulty-degree"},t._l(new Array(e.degree),function(t,e){return i("i",{key:e,staticClass:"icon-heartbeat"})}),0)])}),0),t._v(" "),t._m(1),t._v(" "),i("ol",{staticClass:"list score-list"},t._l(t.ScoreMidi,function(e,n){return i("li",{key:n,staticClass:"list-item score-item"},[i("span",{staticClass:"num"},[t._v(t._s(n+1))]),t._v(" "),i("a",{attrs:{href:"javascript:;"},on:{click:function(i){return t.clickScoreItem(e,"midi")}}},[t._v("\n "+t._s(e.name)+"\n ")]),t._v(" "),i("i",{directives:[{name:"show",rawName:"v-show",value:e.playing,expression:"item.playing"}],staticClass:"pause icon-pause",on:{click:function(i){return t.stopMusicPlayer(e)}}}),t._v(" "),i("span",{staticClass:"difficulty-degree"},t._l(new Array(e.degree),function(t,e){return i("i",{key:e,staticClass:"icon-heartbeat"})}),0)])}),0),t._v(" "),t._m(2),t._v(" "),i("ol",{staticClass:"list score-list"},t._l(t.ScoreXml,function(e,n){return i("li",{key:n,staticClass:"list-item score-item"},[i("span",{staticClass:"num"},[t._v(t._s(n+1))]),t._v(" "),i("a",{attrs:{href:"javascript:;"},on:{click:function(i){return t.clickScoreItem(e,"musicxml")}}},[t._v("\n "+t._s(e.name)+"\n ")]),t._v(" "),i("i",{directives:[{name:"show",rawName:"v-show",value:e.playing,expression:"item.playing"}],staticClass:"pause icon-pause",on:{click:function(i){return t.stopMusicPlayer(e)}}}),t._v(" "),i("span",{staticClass:"difficulty-degree"},t._l(new Array(e.degree),function(t,e){return i("i",{key:e,staticClass:"icon-heartbeat"})}),0)])}),0)]),t._v(" "),i("div",{directives:[{name:"show",rawName:"v-show",value:"PLAYER"==t.currentView,expression:"currentView=='PLAYER'"}],staticClass:"player-view"},[t._m(3),t._v(" "),t._m(4),t._v(" "),i("h2",{staticClass:"music-name"},[t._v(t._s(t.playingItem.name))]),t._v(" "),i("div",{staticClass:"difficulty-degree"},t._l(new Array(t.playingItem.degree),function(t,e){return i("i",{key:e,staticClass:"icon-heartbeat"})}),0),t._v(" "),i("div",{staticClass:"control-bar"},[i("a",{staticClass:"stop-btn",on:{click:function(e){return e.stopPropagation(),t.stopMusicPlayer()}}},[t._v("停止")])])])])},o=[function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("p",{staticClass:"component-title"},[n("img",{staticClass:"title-img",attrs:{src:i("EuRD"),alt:""}}),t._v(" "),n("span",{staticClass:"title"},[t._v("演奏示例")]),t._v(" "),n("span",{staticClass:"degree"},[t._v("热度")])])},function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("p",{staticClass:"component-title"},[n("img",{staticClass:"title-img",attrs:{src:i("z2su"),alt:""}}),t._v(" "),n("span",{staticClass:"title"},[t._v("Midi实验室")])])},function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("p",{staticClass:"component-title"},[n("img",{staticClass:"title-img",attrs:{src:i("LAuN"),alt:""}}),t._v(" "),n("span",{staticClass:"title"},[t._v("MusicXML实验室"),n("span",{staticStyle:{"font-size":"12px"}},[t._v(" beta")])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"top-bar"},[i("h2",[t._v("AutoPiano正在播放...")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"cd-box"},[i("div",{staticClass:"cd-reader-1"}),t._v(" "),i("div",{staticClass:"cd-reader-2"}),t._v(" "),i("div",{staticClass:"cd"},[i("div",{staticClass:"cd-inner"},[t._v("AutoPiano")])])])}],a={render:n,staticRenderFns:o};e.a=a},M6a0:function(t,e){},MU5D:function(t,e,i){var n=i("R9M2");t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==n(t)?t.split(""):Object(t)}},Mhyx:function(t,e,i){var n=i("/bQp"),o=i("dSzd")("iterator"),a=Array.prototype;t.exports=function(t){return void 0!==t&&(n.Array===t||a[o]===t)}},"NWt+":function(t,e,i){var n=i("+ZMJ"),o=i("msXi"),a=i("Mhyx"),r=i("77Pl"),s=i("QRG4"),l=i("3fs2"),u={},c={},e=t.exports=function(t,e,i,f,d){var h,p,m,y,g=d?function(){return t}:l(t),_=n(i,f,e?2:1),v=0;if("function"!=typeof g)throw TypeError(t+" is not iterable!");if(a(g)){for(h=s(t.length);h>v;v++)if((y=e?_(r(p=t[v])[0],p[1]):_(t[v]))===u||y===c)return y}else for(m=g.call(t);!(p=m.next()).done;)if((y=o(m,_,p.value,e))===u||y===c)return y};e.BREAK=u,e.RETURN=c},NeAu:function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANIAAAA9BAMAAAAqpSomAAAAMFBMVEUAAAD///8gICB/f38/Pz+/v7+fn5/f399eXl7r6+uMjIxXV1e3t7fPz8+bm5tzc3N0mYyLAAAEjUlEQVRYw+1Xy5LSQBS9Nh0mZZWlGeSxzBgFl+HhyDI45VDlijAwuuQ16FIYX8vM4KALN36Cn+DSjVX+med2EgyRLDK4cMGtoh803eee++qGdrKTnexkJxvkaNo3k9YeHvb7/fHlP8GRZ41sJ3Ft/ATd/eUJbS/6iSnOE9bKJ2YIOebWcrYBOjfpwtu89nQSYTciytjbmO6dSdm7CYxG0VnGERPaQs4cEs+dzWzfrM9ri22A2jY+881r8SDY87YAyvSgenFzhD9QB1tn/cBmYpLWS5FzxSma6mZKQtnuuIG48BGOaZQKRwyN8xVWBWpnEyhV+OuyAnmlvGZTOj9dFD4f5sK4Y7XdBC/11Om+Hbmpg1yq7CmY0DSoCFcYawmUsuylwEMazwfQMg3Sga0giILNIonSMdvO/IM0ZY+mQZr6zAbcjtkwCZSoCy3CWFsSoTA+dGZp4mEfTWAWzWZKCeVBQhcr4rKXtKzJYho32RT6WLzg3kgomVnnD6VMB/Wq7JFWSIGUdcIaRhUeuiXaLBp+E45bJlW9Edy0nwJJC604UBGuGV7yD0NKsoSIhWrSsK+BRIM2Uxrmkn8ozTADbWrNNc5Eug7S4ZxtaQyi0TLrRsxsrkY5rHiaeWzY10L6xCdV82vlJzqT4bH6e4e0PMlZsUdpJFRVTvkQo7NGKToLq6l0MRjuY1kW090SXnBtZzmmimYSJcS/oxi5EzSwW3IlpuSE5K6joTEiWWsdGud1J0pxioxavq9xBSsGLFNJx6dEGkisZe1VPl5O8M57pWjMoFF6aQZlD0huLmpWN+nFF43Q1MG3RL9+gJgmewEReh2Rtv9q09QBEvEmZkit4+Gc0L7fEMm6wUutAq+PG3voZd2GXz0+7eVbJw6w+mLi3xZlyQdcgEkFH/2QKT3NO5m/kVrsTp1T4NMH0ocwREO+1j35mlOgR/F0dgur6DXVbbrgeMiAjro3mkM0DxDMOsVFqHi4KmI9b9IeDGGZlW6NKrAGe9qLpdHMMEN2vZ6i5pZ852hAzJbRyBlq7n2CqDNDqRge9g/nWAedagf2F7MFFyhqF5EIMetpVWM1Hqq1U8SDVQUlRqwNS0TfARvYwjXsdUpNaNLK+U/Dj1DEpnaBlP3j5tYelFYxOwEnKAgz/MR+NtkzHXrf/trFvnsKwgjCMqwjonWXxNcBZnO66RArB4I/mHnNillvxVF+oDKgNOiT+Yb9j3OkewdQ9wsf2WwSy3OMg40+Jkx1K89haIqautQQgvovprTwYm7thkCn/Ag7fYKAskauQw+rA5jDHVDmgPcFAO2VXrOewsPFUcX6VYks/56u2nRZZEoUl7ZPSvZVLx8Zxf5E5Eh6bxFKlCdhH3iRm6IbFvIPqt/r0Ges65WB9FQI0QlZ9wB4RH+J6F+iOTr1AeHMNyaJO9QQ+9LmB1OTbpBoUihlVfCOZhN/esOxnBtQ5MBsEKnXVEe36Q5ZHm2AeoT/xY1wtqfeD/W6SWP+boyBXm9G/0af9Z+/HTuht1AUMq8apNVVVvBWbFvUPdrJTnayk/9OfgPpX7vwWLh13gAAAABJRU5ErkJggg=="},NpIQ:function(t,e){e.f={}.propertyIsEnumerable},O4R0:function(t,e,i){i("+MLA"),t.exports=i("FeBl").Object.freeze},O4g8:function(t,e){t.exports=!0},"OY+1":function(t,e,i){"use strict";var n=function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"page-pc"},[i("div",{staticClass:"app-bg",style:t.appBgStyle}),t._v(" "),i("div",{staticClass:"app-content"},[i("PageHeader"),t._v(" "),i("RandomLyric"),t._v(" "),i("Piano"),t._v(" "),i("div",{staticClass:"score-section responsive-section-a"},[i("ManualPlayScoreList"),t._v(" "),i("AutoPlayScoreList")],1),t._v(" "),i("div",{staticClass:"right-drawer",class:{show:t.rightDrawerShow}},[i("div",{staticClass:"trigger",on:{click:t.toggleRightDrawer}},[t._v("歌曲列表")]),t._v(" "),i("div",{staticClass:"close",on:{click:t.hideRightDrawer}},[t._v("X")]),t._v(" "),i("ManualPlayScoreList")],1),t._v(" "),i("div",{staticClass:"blank-page-pc",staticStyle:{height:"200px"}}),t._v(" "),i("PageFooter")],1)])},o=[],a={render:n,staticRenderFns:o};e.a=a},OYls:function(t,e,i){i("crlp")("asyncIterator")},PT5K:function(t,e,i){"use strict";var n=["长亭外,古道边,芳草碧连天,晚风拂柳笛声残,夕阳山外山...","你可知Macau,不是我真姓...","what time will you be here now? it's a quater past seven now...","君の前前前世から仆は, 君を探しはじめたよ","你会不会忽然的出现,在街角的咖啡店","时间它总说谎,我从不曾失去那些肩膀。","不怕要多少时间多少代价,青春是我的筹码。","如果还有梦就追,至少不会遗憾后悔","Believe me I can fly I'm singing in the sky","我相信十年后的八月 我们还能再相遇 你最后一直在心底呼喊著『谢谢你』","长大后 世界像一张网 网住我们的翅膀","有了你开心D 乜都称心满意 咸鱼白菜也好好味","Now please don't go Most nights I hardly sleep when I'm alone ","我依然爱你 就是唯一的退路 我依然珍惜 时时刻刻的幸福","只会傻傻的看着天上的星星 你就是那么的纯静","我的眼睛望向窗外 幻想我对你的表白","让蜡烛代替所有灯 让音乐代替话语声 此时无声胜有声","当你觉得外面的世界很精彩 我会在这里衷心的祝福你","苦海翻起爱恨 在世间难逃避命运","不管按怎过按怎变 按怎的人 永远的永远我是彼个人","Rage your dream 風も 光満ちてゆく Rage your dream 忘れないでいて ","我喜欢 入学时我们稚气的脸庞 我喜欢 毕业季上写满留言的墙","如今这里荒草丛生 没有了鲜花 好在曾经拥有你们的春秋和冬夏","白云山高 珠江水长 吾校矗立 蔚为国光","突然好想你 突然锋利的回忆 突然模糊的眼睛","我站在你左侧,却像隔着银河","多少人曾爱慕你年轻时的容颜,可知谁愿承受岁月无情的变迁。","往事不要再提,人生已多风雨","天空海阔你与我,可会变","一生何求,常判断放弃与拥有","让我再看你一眼 星空和黑夜 西去而旋转的飞鸟","但是每一天,当我在左转,你便行向右,终不会遇见","回忆这理想不够理想 沿途逛世间一趟只有向上","模糊的迷恋你一场就当风雨下潮涨","如蝴蝶破茧吹过春风 我展翅 可不可得到认同","剪影的你轮廓太好看 凝住眼泪才敢细看","山顶一起俯瞰过 这花花世界灯火处处","彼此之间即使各有车票 失散于凡嚣 灰风的初吻 至少感动 一两秒","静待紫色天空 闪出清风 有降雪跳动","你未忘 我未忘 犹胜伴在旁","冷雨狂风历尽,人格更光耀,披荆斩棘汉子心里磊落永不折腰","你是空气但是好闻胜过了空气,你是阳光但是却能照进半夜里","我心如月拂过长夜未有声 久照长门流光只影向一人","所谓的彩虹,不过就是光,只要心还透明,就能折射希望","本来就一无所有,才会幻想它是白鸽,飞到渴望的尽头,坠落到无名的山丘","我若是游子,你便是人间","我把美梦放冰箱 长大再拿行不行","天空好想下雨 我好想住你隔壁","许多年前 你有一双清澈的双眼 奔跑起来 像是一道春天的闪电","乱世慷慨我行歌,千万人中有相和","将心愿种在出发之前,我们说好走多远也不改变","春烟柳绿,不如望你。叹这天下谁人不识君","时间是星星的眼睛 望穿我的困惑","确认过眼神,我遇上对的人","如果全世界都对你恶语相加,我就对你说上一世情话","走在地安门外,没有人不动真情","我未入过繁华之境 未听过喧嚣的声音","问君此去几时还,来时莫徘徊。","乘着风游荡在蓝天边 一片云掉落在我面前","那些你很冒险的梦,我陪你去疯。","风筝有风 海豚有海 而你有我","沿路旅途如歌变幻 在游览,还给大地昨天的喜怒和烦忧","天雨粟,鬼夜哭,思念漫太古","永远自由自我,永远高唱我歌,走遍千里","檐下窗棂斜映枝丫 与你席地对坐饮茶","情深深雨蒙蒙 多少楼台烟雨中 记得当初你侬我侬 车如流水马如龙"];e.a=n},PnkT:function(t,e,i){e=t.exports=i("FZ+f")(!1),e.push([t.i,".page-pc{min-width:1280px;padding:1px;font-family:Avenir,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#2c3e50;overflow-x:scroll}.page-pc,.page-pc .app-bg{width:100%;height:100%;position:absolute;top:0;left:0}.page-pc .app-bg{z-index:-100;opacity:.5;background-size:cover;background-repeat:no-repeat;-webkit-transition:all .5s linear;transition:all .5s linear}.page-pc .app-content{width:100%;height:100%;overflow-y:scroll;position:relative}.page-pc .app-content .piano-scroll-wrap{overflow:hidden}.page-pc .app-content .score-section{width:100%;margin:0 auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.page-pc .app-content .section-title{margin:30px auto 20px;font-size:28px;font-weight:500;color:#333}.page-pc .app-content .right-drawer{width:500px;height:100%;position:fixed;top:0;right:-500px;z-index:100;border-left:1px solid #ccc;-webkit-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.page-pc .app-content .right-drawer .trigger{width:30px;height:86px;font-size:16px;padding-top:7px;top:50%;left:-32px}.page-pc .app-content .right-drawer .close,.page-pc .app-content .right-drawer .trigger{text-align:center;position:absolute;background:#ef496f;color:#fff;cursor:pointer;z-index:101}.page-pc .app-content .right-drawer .close{width:20px;height:20px;line-height:20px;top:10px;right:15px}.page-pc .app-content .right-drawer .component-manual-list{width:100%;height:100%;background:hsla(0,0%,100%,.9);border-radius:0;border:none}.page-pc .app-content .right-drawer.show{right:0}",""])},PzxK:function(t,e,i){var n=i("D2L2"),o=i("sB3e"),a=i("ax3d")("IE_PROTO"),r=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=o(t),n(t,a)?t[a]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?r:null}},QRG4:function(t,e,i){var n=i("UuGF"),o=Math.min;t.exports=function(t){return t>0?o(n(t),9007199254740991):0}},"QWe/":function(t,e,i){i("crlp")("observable")},R4wc:function(t,e,i){var n=i("kM2E");n(n.S+n.F,"Object",{assign:i("To3L")})},R9M2:function(t,e){var i={}.toString;t.exports=function(t){return i.call(t).slice(8,-1)}},RPLV:function(t,e,i){var n=i("7KvD").document;t.exports=n&&n.documentElement},RPVc:function(t,e,i){e.parseMidi=i("J1/g"),e.writeMidi=i("Is+7")},"RY/4":function(t,e,i){var n=i("R9M2"),o=i("dSzd")("toStringTag"),a="Arguments"==n(function(){return arguments}()),r=function(t,e){try{return t[e]}catch(t){}};t.exports=function(t){var e,i,s;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(i=r(e=Object(t),o))?i:a?n(e):"Object"==(s=n(e))&&"function"==typeof e.callee?"Arguments":s}},Rrel:function(t,e,i){var n=i("TcQ7"),o=i("n0T6").f,a={}.toString,r="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return o(t)}catch(t){return r.slice()}};t.exports.f=function(t){return r&&"[object Window]"==a.call(t)?s(t):o(n(t))}},TVmP:function(t,e,i){"use strict";function n(t){i("s4sV")}var o=i("UthT"),a=i("bjqT"),r=i("VU/8"),s=n,l=r(o.a,a.a,!1,s,null,null);e.a=l.exports},TcQ7:function(t,e,i){var n=i("MU5D"),o=i("52gC");t.exports=function(t){return n(o(t))}},To3L:function(t,e,i){"use strict";var n=i("+E39"),o=i("lktj"),a=i("1kS7"),r=i("NpIQ"),s=i("sB3e"),l=i("MU5D"),u=Object.assign;t.exports=!u||i("S82l")(function(){var t={},e={},i=Symbol(),n="abcdefghijklmnopqrst";return t[i]=7,n.split("").forEach(function(t){e[t]=t}),7!=u({},t)[i]||Object.keys(u({},e)).join("")!=n})?function(t,e){for(var i=s(t),u=arguments.length,c=1,f=a.f,d=r.f;u>c;)for(var h,p=l(arguments[c++]),m=f?o(p).concat(f(p)):o(p),y=m.length,g=0;y>g;)h=m[g++],n&&!d.call(p,h)||(i[h]=p[h]);return i}:u},U5ju:function(t,e,i){i("M6a0"),i("zQR9"),i("+tPU"),i("CXw9"),i("EqBC"),i("jKW+"),t.exports=i("FeBl").Promise},UthT:function(t,e,i){"use strict";e.a={name:"PageFooter",data:function(){return{supportShow:!1,payType:"WXPAY",aliPaySrc:i("WyC5"),wxPaySrc:i("uTwv")}},mounted:function(){},methods:{togglePayType:function(t){this.payType=t},toggleSupportShow:function(){this.supportShow=!this.supportShow}}}},UuGF:function(t,e){var i=Math.ceil,n=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?n:i)(t)}},V3tA:function(t,e,i){i("R4wc"),t.exports=i("FeBl").Object.assign},VN1t:function(t,e,i){"use strict";var n=function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{ref:"listWrap",staticClass:"component-commodity-list responsive-section-a"},[i("div",{staticClass:"arrow left-arrow",on:{click:function(e){return t.scrollList("left")}}}),t._v(" "),i("div",{ref:"scroll",staticClass:"scroll-wrap"},t._l(t.ValidGoods,function(t,e){return i("div",{key:e,staticClass:"card-wrap"},[i("CommodityCard",{attrs:{product:t}})],1)}),0),t._v(" "),i("div",{staticClass:"arrow right-arrow",on:{click:function(e){return t.scrollList("right")}}})])},o=[],a={render:n,staticRenderFns:o};e.a=a},VSxz:function(t,e,i){"use strict";var n=i("7+uW"),o=new n.a;e.a=o},WyC5:function(t,e,i){t.exports=i.p+"static/img/aliqr.7bf1e6c.png"},XAdE:function(t,e,i){var n=i("HMrw");"string"==typeof n&&(n=[[t.i,n,""]]),n.locals&&(t.exports=n.locals);i("rjj0")("946ebe3a",n,!0,{})},XYsL:function(t,e,i){"use strict";var n=i("Dd8w"),o=i.n(n),a=i("VSxz"),r=i("NYxO"),s=i("2uFj");e.a={name:"PageHeader",components:{},mixins:[],props:[],data:function(){return{wallpaperLoading:!1}},computed:{},mounted:function(){var t=this;a.a.$on(s.e.CHANGE_WALLPAPER,function(){t.setRandomWallPaper()})},watch:{},methods:o()({},i.i(r.c)(["$setWallpaper"]),{emitChangeWallPaper:function(){this.wallpaperLoading||a.a.$emit(s.e.CHANGE_WALLPAPER)},setRandomWallPaper:function(){var t=this;this.wallpaperLoading=!0;var e=s.i.length,i="";do{var n=Math.floor(Math.random()*e);i=s.i[n]}while(!i||i==this.$currentWallpaper);var o=new Image;o.src=i,o.onload=function(){t.wallpaperLoading=!1,t.$setWallpaper(i),o=null}}})}},Xc4G:function(t,e,i){var n=i("lktj"),o=i("1kS7"),a=i("NpIQ");t.exports=function(t){var e=n(t),i=o.f;if(i)for(var r,s=i(t),l=a.f,u=0;s.length>u;)l.call(t,r=s[u++])&&e.push(r);return e}},Xxa5:function(t,e,i){t.exports=i("1H6C")},Y3FW:function(t,e,i){"use strict";var n=i("fZjL"),o=i.n(n),a=i("ZnLv"),r=i.n(a),s=i("//Im"),l=function(t){var e="";return s.b.forEach(function(i){i.name==t&&(e=i.file)}),e},u={minify:!1,ext:".[mp3|ogg]",baseUrl:"/assets/piano/static/samples/",list:["bass-electric","bassoon","cello","clarinet","contrabass","flute","french-horn","guitar-acoustic","guitar-electric","guitar-nylon","harmonium","harp","organ","piano","saxophone","trombone","trumpet","tuba","violin","xylophone"],onload:null,setExt:function(t){var e;for(e=0;e<=this.list.length-1;e++)for(var i in this[this.list[e]])this[this.list[e]][i]=this[this.list[e]][i].replace(this.ext,t);return this.ext=t,console.log("sample extensions set to "+this.ext)},load:function(t){var e,i,n;if(e=t||{},e.instruments=e.instruments||this.list,e.baseUrl=e.baseUrl||this.baseUrl,e.onload=e.onload||this.onload,e.ext&&(e.ext!=this.ext&&this.setExt(e.ext),e.ext=this.ext),i={},Array.isArray(e.instruments)){for(n=0;n<=e.instruments.length-1;n++){var a=this[e.instruments[n]];if(!0===this.minify||!0===e.minify){var s=1;o()(a).length>=17&&(s=2),o()(a).length>=33&&(s=4),o()(a).length>=49&&(s=6);var l=o()(a).filter(function(t,e){return e%s!=0});l.forEach(function(t){delete a[t]})}i[e.instruments[n]]=new r.a.Sampler(a,{baseUrl:e.baseUrl+e.instruments[n]+"/",onload:e.onload})}return i}return a=this[e.instruments],!0!==this.minify&&!0!==e.minify||(s=1,o()(a).length>=17&&(s=2),o()(a).length>=33&&(s=4),o()(a).length>=49&&(s=6),l=o()(a).filter(function(t,e){return e%s!=0}),l.forEach(function(t){delete a[t]})),new r.a.Sampler(a,{baseUrl:e.baseUrl+e.instruments+"/",onload:e.onload})},"bass-electric":{"A#2":"As2.[mp3|ogg]","A#3":"As3.[mp3|ogg]","A#4":"As4.[mp3|ogg]","A#5":"As5.[mp3|ogg]","C#2":"Cs2.[mp3|ogg]","C#3":"Cs3.[mp3|ogg]","C#4":"Cs4.[mp3|ogg]","C#5":"Cs5.[mp3|ogg]",E2:"E2.[mp3|ogg]",E3:"E3.[mp3|ogg]",E4:"E4.[mp3|ogg]",E5:"E5.[mp3|ogg]",G2:"G2.[mp3|ogg]",G3:"G3.[mp3|ogg]",G4:"G4.[mp3|ogg]",G5:"G5.[mp3|ogg]"},bassoon:{A3:"A3.[mp3|ogg]",C2:"C2.[mp3|ogg]",C3:"C3.[mp3|ogg]",C4:"C4.[mp3|ogg]",E3:"E3.[mp3|ogg]",G1:"G1.[mp3|ogg]",G2:"G2.[mp3|ogg]",G3:"G3.[mp3|ogg]",A1:"A1.[mp3|ogg]",A2:"A2.[mp3|ogg]"},cello:{E3:"E3.[mp3|ogg]",E4:"E4.[mp3|ogg]",F2:"F2.[mp3|ogg]",F3:"F3.[mp3|ogg]",F4:"F4.[mp3|ogg]","F#3":"Fs3.[mp3|ogg]","F#4":"Fs4.[mp3|ogg]",G2:"G2.[mp3|ogg]",G3:"G3.[mp3|ogg]",G4:"G4.[mp3|ogg]","G#2":"Gs2.[mp3|ogg]","G#3":"Gs3.[mp3|ogg]","G#4":"Gs4.[mp3|ogg]",A2:"A2.[mp3|ogg]",A3:"A3.[mp3|ogg]",A4:"A4.[mp3|ogg]","A#2":"As2.[mp3|ogg]","A#3":"As3.[mp3|ogg]","A#4":"As4.[mp3|ogg]",B2:"B2.[mp3|ogg]",B3:"B3.[mp3|ogg]",B4:"B4.[mp3|ogg]",C2:"C2.[mp3|ogg]",C3:"C3.[mp3|ogg]",C4:"C4.[mp3|ogg]",C5:"C5.[mp3|ogg]","C#3":"Cs3.[mp3|ogg]","C#4":"Cs4.[mp3|ogg]",D2:"D2.[mp3|ogg]",D3:"D3.[mp3|ogg]",D4:"D4.[mp3|ogg]","D#2":"Ds2.[mp3|ogg]","D#3":"Ds3.[mp3|ogg]","D#4":"Ds4.[mp3|ogg]",E2:"E2.[mp3|ogg]"},clarinet:{D3:"D3.[mp3|ogg]",D4:"D4.[mp3|ogg]",D5:"D5.[mp3|ogg]",F2:"F2.[mp3|ogg]",F3:"F3.[mp3|ogg]",F4:"F4.[mp3|ogg]","F#5":"Fs5.[mp3|ogg]","A#2":"As2.[mp3|ogg]","A#3":"As3.[mp3|ogg]","A#4":"As4.[mp3|ogg]",D2:"D2.[mp3|ogg]"},contrabass:{C1:"C1.[mp3|ogg]","C#2":"Cs2.[mp3|ogg]",D1:"D1.[mp3|ogg]",E1:"E1.[mp3|ogg]",E2:"E2.[mp3|ogg]","F#0":"Fs0.[mp3|ogg]","F#1":"Fs1.[mp3|ogg]",G0:"G0.[mp3|ogg]","G#1":"Gs1.[mp3|ogg]","G#2":"Gs2.[mp3|ogg]",A1:"A1.[mp3|ogg]","A#0":"As0.[mp3|ogg]",B2:"B2.[mp3|ogg]"},flute:{A5:"A5.[mp3|ogg]",C3:"C3.[mp3|ogg]",C4:"C4.[mp3|ogg]",C5:"C5.[mp3|ogg]",C6:"C6.[mp3|ogg]",E3:"E3.[mp3|ogg]",E4:"E4.[mp3|ogg]",E5:"E5.[mp3|ogg]",A3:"A3.[mp3|ogg]",A4:"A4.[mp3|ogg]"},"french-horn":{D2:"D2.[mp3|ogg]",D4:"D4.[mp3|ogg]","D#1":"Ds1.[mp3|ogg]",F2:"F2.[mp3|ogg]",F4:"F4.[mp3|ogg]",G1:"G1.[mp3|ogg]",A0:"A0.[mp3|ogg]",A2:"A2.[mp3|ogg]",C1:"C1.[mp3|ogg]",C3:"C3.[mp3|ogg]"},"guitar-acoustic":{F3:"F3.[mp3|ogg]","F#1":"Fs1.[mp3|ogg]","F#2":"Fs2.[mp3|ogg]","F#3":"Fs3.[mp3|ogg]",G1:"G1.[mp3|ogg]",G2:"G2.[mp3|ogg]",G3:"G3.[mp3|ogg]","G#1":"Gs1.[mp3|ogg]","G#2":"Gs2.[mp3|ogg]","G#3":"Gs3.[mp3|ogg]",A1:"A1.[mp3|ogg]",A2:"A2.[mp3|ogg]",A3:"A3.[mp3|ogg]","A#1":"As1.[mp3|ogg]","A#2":"As2.[mp3|ogg]","A#3":"As3.[mp3|ogg]",B1:"B1.[mp3|ogg]",B2:"B2.[mp3|ogg]",B3:"B3.[mp3|ogg]",C2:"C2.[mp3|ogg]",C3:"C3.[mp3|ogg]",C4:"C4.[mp3|ogg]","C#2":"Cs2.[mp3|ogg]","C#3":"Cs3.[mp3|ogg]","C#4":"Cs4.[mp3|ogg]",D1:"D1.[mp3|ogg]",D2:"D2.[mp3|ogg]",D3:"D3.[mp3|ogg]",D4:"D4.[mp3|ogg]","D#1":"Ds1.[mp3|ogg]","D#2":"Ds2.[mp3|ogg]","D#3":"Ds3.[mp3|ogg]",E1:"E1.[mp3|ogg]",E2:"E2.[mp3|ogg]",E3:"E3.[mp3|ogg]",F1:"F1.[mp3|ogg]",F2:"F2.[mp3|ogg]"},"guitar-electric":{"D#3":"Ds3.[mp3|ogg]","D#4":"Ds4.[mp3|ogg]","D#5":"Ds5.[mp3|ogg]",E2:"E2.[mp3|ogg]","F#2":"Fs2.[mp3|ogg]","F#3":"Fs3.[mp3|ogg]","F#4":"Fs4.[mp3|ogg]","F#5":"Fs5.[mp3|ogg]",A2:"A2.[mp3|ogg]",A3:"A3.[mp3|ogg]",A4:"A4.[mp3|ogg]",A5:"A5.[mp3|ogg]",C3:"C3.[mp3|ogg]",C4:"C4.[mp3|ogg]",C5:"C5.[mp3|ogg]",C6:"C6.[mp3|ogg]","C#2":"Cs2.[mp3|ogg]"},"guitar-nylon":{"F#2":"Fs2.[mp3|ogg]","F#3":"Fs3.[mp3|ogg]","F#4":"Fs4.[mp3|ogg]","F#5":"Fs5.[mp3|ogg]",G3:"G3.[mp3|ogg]",G5:"G3.[mp3|ogg]","G#2":"Gs2.[mp3|ogg]","G#4":"Gs4.[mp3|ogg]","G#5":"Gs5.[mp3|ogg]",A2:"A2.[mp3|ogg]",A3:"A3.[mp3|ogg]",A4:"A4.[mp3|ogg]",A5:"A5.[mp3|ogg]","A#5":"As5.[mp3|ogg]",B1:"B1.[mp3|ogg]",B2:"B2.[mp3|ogg]",B3:"B3.[mp3|ogg]",B4:"B4.[mp3|ogg]","C#3":"Cs3.[mp3|ogg]","C#4":"Cs4.[mp3|ogg]","C#5":"Cs5.[mp3|ogg]",D2:"D2.[mp3|ogg]",D3:"D3.[mp3|ogg]",D5:"D5.[mp3|ogg]","D#4":"Ds4.[mp3|ogg]",E2:"E2.[mp3|ogg]",E3:"E3.[mp3|ogg]",E4:"E4.[mp3|ogg]",E5:"E5.[mp3|ogg]"},harmonium:{C2:"C2.[mp3|ogg]",C3:"C3.[mp3|ogg]",C4:"C4.[mp3|ogg]",C5:"C5.[mp3|ogg]","C#2":"Cs2.[mp3|ogg]","C#3":"Cs3.[mp3|ogg]","C#4":"Cs4.[mp3|ogg]","C#5":"Cs5.[mp3|ogg]",D2:"D2.[mp3|ogg]",D3:"D3.[mp3|ogg]",D4:"D4.[mp3|ogg]",D5:"D5.[mp3|ogg]","D#2":"Ds2.[mp3|ogg]","D#3":"Ds3.[mp3|ogg]","D#4":"Ds4.[mp3|ogg]",E2:"E2.[mp3|ogg]",E3:"E3.[mp3|ogg]",E4:"E4.[mp3|ogg]",F2:"F2.[mp3|ogg]",F3:"F3.[mp3|ogg]",F4:"F4.[mp3|ogg]","F#2":"Fs2.[mp3|ogg]","F#3":"Fs3.[mp3|ogg]",G2:"G2.[mp3|ogg]",G3:"G3.[mp3|ogg]",G4:"G4.[mp3|ogg]","G#2":"Gs2.[mp3|ogg]","G#3":"Gs3.[mp3|ogg]","G#4":"Gs4.[mp3|ogg]",A2:"A2.[mp3|ogg]",A3:"A3.[mp3|ogg]",A4:"A4.[mp3|ogg]","A#2":"As2.[mp3|ogg]","A#3":"As3.[mp3|ogg]","A#4":"As4.[mp3|ogg]"},harp:{C5:"C5.[mp3|ogg]",D2:"D2.[mp3|ogg]",D4:"D4.[mp3|ogg]",D6:"D6.[mp3|ogg]",D7:"D7.[mp3|ogg]",E1:"E1.[mp3|ogg]",E3:"E3.[mp3|ogg]",E5:"E5.[mp3|ogg]",F2:"F2.[mp3|ogg]",F4:"F4.[mp3|ogg]",F6:"F6.[mp3|ogg]",F7:"F7.[mp3|ogg]",G1:"G1.[mp3|ogg]",G3:"G3.[mp3|ogg]",G5:"G5.[mp3|ogg]",A2:"A2.[mp3|ogg]",A4:"A4.[mp3|ogg]",A6:"A6.[mp3|ogg]",B1:"B1.[mp3|ogg]",B3:"B3.[mp3|ogg]",B5:"B5.[mp3|ogg]",B6:"B6.[mp3|ogg]",C3:"C3.[mp3|ogg]"},organ:{C3:"C3.[mp3|ogg]",C4:"C4.[mp3|ogg]",C5:"C5.[mp3|ogg]",C6:"C6.[mp3|ogg]","D#1":"Ds1.[mp3|ogg]","D#2":"Ds2.[mp3|ogg]","D#3":"Ds3.[mp3|ogg]","D#4":"Ds4.[mp3|ogg]","D#5":"Ds5.[mp3|ogg]","F#1":"Fs1.[mp3|ogg]","F#2":"Fs2.[mp3|ogg]","F#3":"Fs3.[mp3|ogg]","F#4":"Fs4.[mp3|ogg]","F#5":"Fs5.[mp3|ogg]",A1:"A1.[mp3|ogg]",A2:"A2.[mp3|ogg]",A3:"A3.[mp3|ogg]",A4:"A4.[mp3|ogg]",A5:"A5.[mp3|ogg]",C1:"C1.[mp3|ogg]",C2:"C2.[mp3|ogg]"},piano:{A2:l("A2"),A3:l("A3"),A4:l("A4"),A5:l("A5"),A6:l("A6"),"A#3":l("A#3"),"A#4":l("A#4"),"A#5":l("A#5"),"A#6":l("A#6"),B2:l("B2"),B3:l("B3"),B4:l("B4"),B5:l("B5"),B6:l("B6"),C2:l("C2"),C3:l("C3"),C4:l("C4"),C5:l("C5"),C6:l("C6"),C7:l("C7"),"C#2":l("C#2"),"C#3":l("C#3"),"C#4":l("C#4"),"C#5":l("C#5"),"C#6":l("C#6"),D0:l("D0"),D1:l("D1"),D2:l("D2"),D3:l("D3"),D4:l("D4"),D5:l("D5"),D6:l("D6"),"D#2":l("D#2"),"D#3":l("D#3"),"D#4":l("D#4"),"D#5":l("D#5"),"D#6":l("D#6"),E2:l("E2"),E3:l("E3"),E4:l("E4"),E5:l("E5"),E6:l("E6"),F2:l("F2"),F3:l("F3"),F4:l("F4"),F5:l("F5"),F6:l("F6"),"F#2":l("F#2"),"F#3":l("F#3"),"F#4":l("F#4"),"F#5":l("F#5"),"F#6":l("F#6"),G2:l("G2"),G3:l("G3"),G4:l("G4"),G5:l("G5"),G6:l("G6"),"G#2":l("G#2"),"G#3":l("G#3"),"G#4":l("G#4"),"G#5":l("G#5"),"G#6":l("G#6")},saxophone:{"D#4":"Ds4.[mp3|ogg]",E2:"E2.[mp3|ogg]",E3:"E3.[mp3|ogg]",E4:"E4.[mp3|ogg]",F2:"F2.[mp3|ogg]",F3:"F3.[mp3|ogg]",F4:"F4.[mp3|ogg]","F#2":"Fs2.[mp3|ogg]","F#3":"Fs3.[mp3|ogg]","F#4":"Fs4.[mp3|ogg]",G2:"G2.[mp3|ogg]",G3:"G3.[mp3|ogg]",G4:"G4.[mp3|ogg]","G#2":"Gs2.[mp3|ogg]","G#3":"Gs3.[mp3|ogg]","G#4":"Gs4.[mp3|ogg]",A3:"A3.[mp3|ogg]",A4:"A4.[mp3|ogg]","A#2":"As2.[mp3|ogg]","A#3":"As3.[mp3|ogg]",B2:"B2.[mp3|ogg]",B3:"B3.[mp3|ogg]",C3:"C3.[mp3|ogg]",C4:"C4.[mp3|ogg]","C#2":"Cs2.[mp3|ogg]","C#3":"Cs3.[mp3|ogg]","C#4":"Cs4.[mp3|ogg]",D2:"D2.[mp3|ogg]",D3:"D3.[mp3|ogg]",D4:"D4.[mp3|ogg]","D#2":"Ds2.[mp3|ogg]","D#3":"Ds3.[mp3|ogg]"},trombone:{"A#2":"As2.[mp3|ogg]",C2:"C2.[mp3|ogg]",C3:"C3.[mp3|ogg]","C#1":"Cs1.[mp3|ogg]","C#3":"Cs3.[mp3|ogg]",D2:"D2.[mp3|ogg]",D3:"D3.[mp3|ogg]","D#1":"Ds1.[mp3|ogg]","D#2":"Ds2.[mp3|ogg]","D#3":"Ds3.[mp3|ogg]",F1:"F1.[mp3|ogg]",F2:"F2.[mp3|ogg]",F3:"F3.[mp3|ogg]","G#1":"Gs1.[mp3|ogg]","G#2":"Gs2.[mp3|ogg]","A#0":"As0.[mp3|ogg]","A#1":"As1.[mp3|ogg]"},trumpet:{C5:"C5.[mp3|ogg]",D4:"D4.[mp3|ogg]","D#3":"Ds3.[mp3|ogg]",F2:"F2.[mp3|ogg]",F3:"F3.[mp3|ogg]",F4:"F4.[mp3|ogg]",G3:"G3.[mp3|ogg]",A2:"A2.[mp3|ogg]",A4:"A4.[mp3|ogg]","A#3":"As3.[mp3|ogg]",C3:"C3.[mp3|ogg]"},tuba:{"A#1":"As1.[mp3|ogg]","A#2":"As2.[mp3|ogg]",D2:"D2.[mp3|ogg]",D3:"D3.[mp3|ogg]","D#1":"Ds1.[mp3|ogg]",F0:"F0.[mp3|ogg]",F1:"F1.[mp3|ogg]",F2:"F2.[mp3|ogg]","A#0":"As0.[mp3|ogg]"},violin:{A3:"A3.[mp3|ogg]",A4:"A4.[mp3|ogg]",A5:"A5.[mp3|ogg]",A6:"A6.[mp3|ogg]",C4:"C4.[mp3|ogg]",C5:"C5.[mp3|ogg]",C6:"C6.[mp3|ogg]",C7:"C7.[mp3|ogg]",E4:"E4.[mp3|ogg]",E5:"E5.[mp3|ogg]",E6:"E6.[mp3|ogg]",G4:"G4.[mp3|ogg]",G5:"G5.[mp3|ogg]",G6:"G6.[mp3|ogg]"},xylophone:{C7:"C7.[mp3|ogg]",G3:"G3.[mp3|ogg]",G4:"G4.[mp3|ogg]",G5:"G5.[mp3|ogg]",G6:"G6.[mp3|ogg]",C4:"C4.[mp3|ogg]",C5:"C5.[mp3|ogg]",C6:"C6.[mp3|ogg]"}};e.a=u},Y6yI:function(t,e,i){"use strict";e.a={name:"CommodityCard",components:{},mixins:[],props:["product"],data:function(){return{}},computed:{},watch:{},mounted:function(){},methods:{}}},Yobk:function(t,e,i){var n=i("77Pl"),o=i("qio6"),a=i("xnc9"),r=i("ax3d")("IE_PROTO"),s=function(){},l=function(){var t,e=i("ON07")("iframe"),n=a.length;for(e.style.display="none",i("RPLV").appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write(" + + + + + + + + + + \ No newline at end of file diff --git a/public/tool/bdpan/do.php b/public/tool/bdpan/do.php new file mode 100644 index 0000000..788744d --- /dev/null +++ b/public/tool/bdpan/do.php @@ -0,0 +1,37 @@ +rapidupload($path,$link_arr['content_md5'],$link_arr['slice_md5'],$link_arr['content_crc32'],$link_arr['content_length'])){ + $result=array('code'=>0,'filename'=>$link_arr['filename'],'msg'=>'转存成功','path'=>$result); +}else{ + $result=array('code'=>-2,'filename'=>$link_arr['filename'],'msg'=>$x->msg); +} +echo json_encode($result); + +}elseif($act=='check'){ + $bduss=trim(daddslashes($_POST['bduss'])); + $x=new Baidupan($bduss); + if($x->checkcookie()){ + exit('{"code":0}'); + }else{ + exit('{"code":-1}'); + } +} \ No newline at end of file diff --git a/public/tool/bdpan/favicon.ico b/public/tool/bdpan/favicon.ico new file mode 100644 index 0000000..cf14a71 Binary files /dev/null and b/public/tool/bdpan/favicon.ico differ diff --git a/public/tool/bdpan/help.html b/public/tool/bdpan/help.html new file mode 100644 index 0000000..b2b886e --- /dev/null +++ b/public/tool/bdpan/help.html @@ -0,0 +1,89 @@ + + + + + + + 百度网盘免和谐分享 + + + + + + + + +
          +
          +

          帮助与介绍

          +
          +
          +
          +
          +
          +

          百度网盘免和谐分享介绍

          +
          百度网盘免和谐分享利用百度网盘秒传机制,实现任意文件分享链接生成与批量转存。在一键分享页面可以生成bdpan://专用链,该专用链包含文件的特征值;在一键转存页面可以输入别人分享的bdpan://专用链,批量转存到自己的网盘。 +
          +

          生成分享链接时浏览器卡住

          +
          生成分享链接需要 Chrome 、Edge 或 Chromium 内核的浏览器,不支持IE浏览器。如果文件太大请耐心等待,具体生成时间与电脑配置有关。 +
          +

          一键转存时提示"该链接已失效"

          +
          说明该链接是无效链接,分享者在生成该链接的时候没有先将文件上传到百度网盘,或者百度网盘已经屏蔽该文件的上传。 +
          +

          如何分享多个文件夹

          +
          生成分享链接之后,在开头增加一条链接 bdfolder://文件夹名称 ,这样这一条链接下面跟着的所有bdpan://链接都会转存到该文件夹,直到出现下一个bdfolder://链接定义新的目录为止。支持多级目录,例如 bdfolder://我的应用/游戏/策略类游戏 ,转到根目录为 bdfolder:// +
          +

          手动获取BDUSS的方法

          +
          1.使用 Chrome 或 Chromium 内核的浏览器 +

          2.下载插件 EditThisCookie 立即下载 +

          下载该插件并运行,提示添加(无法添加说明浏览器不支持),添加完成后浏览器右上角会多个饼干图标 +

          3.打开百度登录页面 立即下载 +

          4.在登录页面登录后,点击浏览器右上角的饼干图标,找到BDUSS,复制内容即可 +

          + +
          +
          +
          +
          + + + + + + \ No newline at end of file diff --git a/public/tool/bdpan/inc.php b/public/tool/bdpan/inc.php new file mode 100644 index 0000000..afe8ee6 --- /dev/null +++ b/public/tool/bdpan/inc.php @@ -0,0 +1,38 @@ + $val) { + $string[$key] = daddslashes($val, $force, $strip); + } + } else { + $string = addslashes($strip ? stripslashes($string) : $string); + } + } + return $string; +} + +function parselink($link){ + if(substr($link,0,8)!='bdpan://')return false; + $arr = explode('|',$link); + $filename = $arr[1]; + $content_md5 = $arr[2]; + $slice_md5 = $arr[3]; + $content_crc32 = $arr[4]; + $content_length = $arr[5]; + if($filename && $content_md5 && $slice_md5 && $content_crc32 && $content_length){ + return array('filename'=>$filename, 'content_md5'=>$content_md5, 'slice_md5'=>$slice_md5, 'content_crc32'=>$content_crc32, 'content_length'=>$content_length); + }else{ + return false; + } +} \ No newline at end of file diff --git a/public/tool/bdpan/index.html b/public/tool/bdpan/index.html new file mode 100644 index 0000000..8c84ada --- /dev/null +++ b/public/tool/bdpan/index.html @@ -0,0 +1,210 @@ + + + + + + + 百度网盘免和谐分享 + + + + + + + + + +
          +
          +
          +
          +

          bdpan://分享链接一键转存

          +
          +
          +
          +
          +
          BDUSS
          + + +

          +
          +
          网盘路径
          + +

          +
          +
          分享链接
          + +

          + +
          +
          + + + + + + +
          +
          + +
          +
          +
          + + + + + + + + \ No newline at end of file diff --git a/public/tool/bduss/base.js b/public/tool/bduss/base.js new file mode 100644 index 0000000..4f8f79d --- /dev/null +++ b/public/tool/bduss/base.js @@ -0,0 +1,304 @@ +function BarrettMu(t) { + this.modulus = biCopy(t), this.k = biHighIndex(this.modulus) + 1; + var e = new BigInt; + e.digits[2 * this.k] = 1, this.mu = biDivide(e, this.modulus), this.bkplus1 = new BigInt, this.bkplus1.digits[this.k + 1] = 1, this.modulo = BarrettMu_modulo, this.multiplyMod = BarrettMu_multiplyMod, this.powMod = BarrettMu_powMod +} +function BarrettMu_modulo(t) { + var e = biDivideByRadixPower(t, this.k - 1), + i = biMultiply(e, this.mu), + n = biDivideByRadixPower(i, this.k + 1), + r = biModuloByRadixPower(t, this.k + 1), + o = biMultiply(n, this.modulus), + s = biModuloByRadixPower(o, this.k + 1), + a = biSubtract(r, s); + a.isNeg && (a = biAdd(a, this.bkplus1)); + for (var u = biCompare(a, this.modulus) >= 0; u;) a = biSubtract(a, this.modulus), u = biCompare(a, this.modulus) >= 0; + return a +} +function BarrettMu_multiplyMod(t, e) { + var i = biMultiply(t, e); + return this.modulo(i) +} +function BarrettMu_powMod(t, e) { + var i = new BigInt; + i.digits[0] = 1; + for (var n = t, r = e; 0 != (1 & r.digits[0]) && (i = this.multiplyMod(i, n)), r = biShiftRight(r, 1), 0 != r.digits[0] || 0 != biHighIndex(r);) n = this.multiplyMod(n, n); + return i +} +function setMaxDigits(t) { + maxDigits = t, ZERO_ARRAY = new Array(maxDigits); + for (var e = 0; e < ZERO_ARRAY.length; e++) ZERO_ARRAY[e] = 0; + bigZero = new BigInt, bigOne = new BigInt, bigOne.digits[0] = 1 +} +function BigInt(t) { + this.digits = "boolean" == typeof t && 1 == t ? null : ZERO_ARRAY.slice(0), this.isNeg = !1 +} +function biFromDecimal(t) { + for (var e, i = "-" == t.charAt(0), n = i ? 1 : 0; n < t.length && "0" == t.charAt(n);)++n; + if (n == t.length) e = new BigInt; + else { + var r = t.length - n, + o = r % dpl10; + for (0 == o && (o = dpl10), e = biFromNumber(Number(t.substr(n, o))), n += o; n < t.length;) e = biAdd(biMultiply(e, lr10), biFromNumber(Number(t.substr(n, dpl10)))), n += dpl10; + e.isNeg = i + } + return e +} +function biCopy(t) { + var e = new BigInt(!0); + return e.digits = t.digits.slice(0), e.isNeg = t.isNeg, e +} +function biFromNumber(t) { + var e = new BigInt; + e.isNeg = 0 > t, t = Math.abs(t); + for (var i = 0; t > 0;) e.digits[i++] = t & maxDigitVal, t >>= biRadixBits; + return e +} +function reverseStr(t) { + for (var e = "", i = t.length - 1; i > -1; --i) e += t.charAt(i); + return e +} +function biToString(t, e) { + var i = new BigInt; + i.digits[0] = e; + for (var n = biDivideModulo(t, i), r = hexatrigesimalToChar[n[1].digits[0]]; 1 == biCompare(n[0], bigZero);) n = biDivideModulo(n[0], i), digit = n[1].digits[0], r += hexatrigesimalToChar[n[1].digits[0]]; + return (t.isNeg ? "-" : "") + reverseStr(r) +} +function biToDecimal(t) { + var e = new BigInt; + e.digits[0] = 10; + for (var i = biDivideModulo(t, e), n = String(i[1].digits[0]); 1 == biCompare(i[0], bigZero);) i = biDivideModulo(i[0], e), n += String(i[1].digits[0]); + return (t.isNeg ? "-" : "") + reverseStr(n) +} +function digitToHex(t) { + var e = 15, + n = ""; + for (i = 0; 4 > i; ++i) n += hexToChar[t & e], t >>>= 4; + return reverseStr(n) +} +function biToHex(t) { + for (var e = "", i = (biHighIndex(t), biHighIndex(t)); i > -1; --i) e += digitToHex(t.digits[i]); + return e +} +function charToHex(t) { + var e, i = 48, + n = i + 9, + r = 97, + o = r + 25, + s = 65, + a = 90; + return e = t >= i && n >= t ? t - i : t >= s && a >= t ? 10 + t - s : t >= r && o >= t ? 10 + t - r : 0 +} +function hexToDigit(t) { + for (var e = 0, i = Math.min(t.length, 4), n = 0; i > n; ++n) e <<= 4, e |= charToHex(t.charCodeAt(n)); + return e +} +function biFromHex(t) { + for (var e = new BigInt, i = t.length, n = i, r = 0; n > 0; n -= 4, ++r) e.digits[r] = hexToDigit(t.substr(Math.max(n - 4, 0), Math.min(n, 4))); + return e +} +function biFromString(t, e) { + var i = "-" == t.charAt(0), + n = i ? 1 : 0, + r = new BigInt, + o = new BigInt; + o.digits[0] = 1; + for (var s = t.length - 1; s >= n; s--) { + var a = t.charCodeAt(s), + u = charToHex(a), + c = biMultiplyDigit(o, u); + r = biAdd(r, c), o = biMultiplyDigit(o, e) + } + return r.isNeg = i, r +} +function biDump(t) { + return (t.isNeg ? "-" : "") + t.digits.join(" ") +} +function biAdd(t, e) { + var i; + if (t.isNeg != e.isNeg) e.isNeg = !e.isNeg, i = biSubtract(t, e), e.isNeg = !e.isNeg; + else { + i = new BigInt; + for (var n, r = 0, o = 0; o < t.digits.length; ++o) n = t.digits[o] + e.digits[o] + r, i.digits[o] = 65535 & n, r = Number(n >= biRadix); + i.isNeg = t.isNeg + } + return i +} +function biSubtract(t, e) { + var i; + if (t.isNeg != e.isNeg) e.isNeg = !e.isNeg, i = biAdd(t, e), e.isNeg = !e.isNeg; + else { + i = new BigInt; + var n, r; + r = 0; + for (var o = 0; o < t.digits.length; ++o) n = t.digits[o] - e.digits[o] + r, i.digits[o] = 65535 & n, i.digits[o] < 0 && (i.digits[o] += biRadix), r = 0 - Number(0 > n); + if (-1 == r) { + r = 0; + for (var o = 0; o < t.digits.length; ++o) n = 0 - i.digits[o] + r, i.digits[o] = 65535 & n, i.digits[o] < 0 && (i.digits[o] += biRadix), r = 0 - Number(0 > n); + i.isNeg = !t.isNeg + } else i.isNeg = t.isNeg + } + return i +} +function biHighIndex(t) { + for (var e = t.digits.length - 1; e > 0 && 0 == t.digits[e];)--e; + return e +} +function biNumBits(t) { + var e, i = biHighIndex(t), + n = t.digits[i], + r = (i + 1) * bitsPerDigit; + for (e = r; e > r - bitsPerDigit && 0 == (32768 & n); --e) n <<= 1; + return e +} +function biMultiply(t, e) { + for (var i, n, r, o = new BigInt, s = biHighIndex(t), a = biHighIndex(e), u = 0; a >= u; ++u) { + for (i = 0, r = u, j = 0; s >= j; ++j, ++r) n = o.digits[r] + t.digits[j] * e.digits[u] + i, o.digits[r] = n & maxDigitVal, i = n >>> biRadixBits; + o.digits[u + s + 1] = i + } + return o.isNeg = t.isNeg != e.isNeg, o +} +function biMultiplyDigit(t, e) { + var i, n, r; + result = new BigInt, i = biHighIndex(t), n = 0; + for (var o = 0; i >= o; ++o) r = result.digits[o] + t.digits[o] * e + n, result.digits[o] = r & maxDigitVal, n = r >>> biRadixBits; + return result.digits[1 + i] = n, result +} +function arrayCopy(t, e, i, n, r) { + for (var o = Math.min(e + r, t.length), s = e, a = n; o > s; ++s, ++a) i[a] = t[s] +} +function biShiftLeft(t, e) { + var i = Math.floor(e / bitsPerDigit), + n = new BigInt; + arrayCopy(t.digits, 0, n.digits, i, n.digits.length - i); + for (var r = e % bitsPerDigit, o = bitsPerDigit - r, s = n.digits.length - 1, a = s - 1; s > 0; --s, --a) n.digits[s] = n.digits[s] << r & maxDigitVal | (n.digits[a] & highBitMasks[r]) >>> o; + return n.digits[0] = n.digits[s] << r & maxDigitVal, n.isNeg = t.isNeg, n +} +function biShiftRight(t, e) { + var i = Math.floor(e / bitsPerDigit), + n = new BigInt; + arrayCopy(t.digits, i, n.digits, 0, t.digits.length - i); + for (var r = e % bitsPerDigit, o = bitsPerDigit - r, s = 0, a = s + 1; s < n.digits.length - 1; ++s, ++a) n.digits[s] = n.digits[s] >>> r | (n.digits[a] & lowBitMasks[r]) << o; + return n.digits[n.digits.length - 1] >>>= r, n.isNeg = t.isNeg, n +} +function biMultiplyByRadixPower(t, e) { + var i = new BigInt; + return arrayCopy(t.digits, 0, i.digits, e, i.digits.length - e), i +} +function biDivideByRadixPower(t, e) { + var i = new BigInt; + return arrayCopy(t.digits, e, i.digits, 0, i.digits.length - e), i +} +function biModuloByRadixPower(t, e) { + var i = new BigInt; + return arrayCopy(t.digits, 0, i.digits, 0, e), i +} +function biCompare(t, e) { + if (t.isNeg != e.isNeg) return 1 - 2 * Number(t.isNeg); + for (var i = t.digits.length - 1; i >= 0; --i) if (t.digits[i] != e.digits[i]) return t.isNeg ? 1 - 2 * Number(t.digits[i] > e.digits[i]) : 1 - 2 * Number(t.digits[i] < e.digits[i]); + return 0 +} +function biDivideModulo(t, e) { + var i, n, r = biNumBits(t), + o = biNumBits(e), + s = e.isNeg; + if (o > r) return t.isNeg ? (i = biCopy(bigOne), i.isNeg = !e.isNeg, t.isNeg = !1, e.isNeg = !1, n = biSubtract(e, t), t.isNeg = !0, e.isNeg = s) : (i = new BigInt, n = biCopy(t)), new Array(i, n); + i = new BigInt, n = t; + for (var a = Math.ceil(o / bitsPerDigit) - 1, u = 0; e.digits[a] < biHalfRadix;) e = biShiftLeft(e, 1), ++u, ++o, a = Math.ceil(o / bitsPerDigit) - 1; + n = biShiftLeft(n, u), r += u; + for (var c = Math.ceil(r / bitsPerDigit) - 1, l = biMultiplyByRadixPower(e, c - a); - 1 != biCompare(n, l);)++i.digits[c - a], n = biSubtract(n, l); + for (var d = c; d > a; --d) { + var f = d >= n.digits.length ? 0 : n.digits[d], + h = d - 1 >= n.digits.length ? 0 : n.digits[d - 1], + g = d - 2 >= n.digits.length ? 0 : n.digits[d - 2], + p = a >= e.digits.length ? 0 : e.digits[a], + m = a - 1 >= e.digits.length ? 0 : e.digits[a - 1]; + i.digits[d - a - 1] = f == p ? maxDigitVal : Math.floor((f * biRadix + h) / p); + for (var v = i.digits[d - a - 1] * (p * biRadix + m), b = f * biRadixSquared + (h * biRadix + g); v > b;)--i.digits[d - a - 1], v = i.digits[d - a - 1] * (p * biRadix | m), b = f * biRadix * biRadix + (h * biRadix + g); + l = biMultiplyByRadixPower(e, d - a - 1), n = biSubtract(n, biMultiplyDigit(l, i.digits[d - a - 1])), n.isNeg && (n = biAdd(n, l), --i.digits[d - a - 1]) + } + return n = biShiftRight(n, u), i.isNeg = t.isNeg != s, t.isNeg && (i = s ? biAdd(i, bigOne) : biSubtract(i, bigOne), e = biShiftRight(e, u), n = biSubtract(e, n)), 0 == n.digits[0] && 0 == biHighIndex(n) && (n.isNeg = !1), new Array(i, n) +} +function biDivide(t, e) { + return biDivideModulo(t, e)[0] +} +function biModulo(t, e) { + return biDivideModulo(t, e)[1] +} +function biMultiplyMod(t, e, i) { + return biModulo(biMultiply(t, e), i) +} +function biPow(t, e) { + for (var i = bigOne, n = t; 0 != (1 & e) && (i = biMultiply(i, n)), e >>= 1, 0 != e;) n = biMultiply(n, n); + return i +} +function biPowMod(t, e, i) { + for (var n = bigOne, r = t, o = e; 0 != (1 & o.digits[0]) && (n = biMultiplyMod(n, r, i)), o = biShiftRight(o, 1), 0 != o.digits[0] || 0 != biHighIndex(o);) r = biMultiplyMod(r, r, i); + return n +} +function RSAKeyPair(t, e, i) { + this.e = biFromHex(t), this.d = biFromHex(e), this.m = biFromHex(i), this.chunkSize = 2 * biHighIndex(this.m), this.radix = 16, this.barrett = new BarrettMu(this.m) +} +function twoDigit(t) { + return (10 > t ? "0" : "") + String(t) +} +function encryptedString(t, e) { + for (var i = new Array, n = e.length, r = 0; n > r;) i[r] = e.charCodeAt(r), r++; + for (; i.length % t.chunkSize != 0;) i[r++] = 0; + var o, s, a, u = i.length, + c = ""; + for (r = 0; u > r; r += t.chunkSize) { + for (a = new BigInt, o = 0, s = r; s < r + t.chunkSize; ++o) a.digits[o] = i[s++], a.digits[o] += i[s++] << 8; + var l = t.barrett.powMod(a, t.e), + d = 16 == t.radix ? biToHex(l) : biToString(l, t.radix); + c += d + " " + } + return c.substring(0, c.length - 1) +} +function decryptedString(t, e) { + var i, n, r, o = e.split(" "), + s = ""; + for (i = 0; i < o.length; ++i) { + var a; + for (a = 16 == t.radix ? biFromHex(o[i]) : biFromString(o[i], t.radix), r = t.barrett.powMod(a, t.d), n = 0; n <= biHighIndex(r); ++n) s += String.fromCharCode(255 & r.digits[n], r.digits[n] >> 8) + } + return 0 == s.charCodeAt(s.length - 1) && (s = s.substring(0, s.length - 1)), s +}! +function(t) { + String.prototype.trim === t && (String.prototype.trim = function() { + return this.replace(/^\s+|\s+$/g, "") + }), Array.prototype.reduce === t && (Array.prototype.reduce = function(e) { + if (void 0 === this || null === this) throw new TypeError; + var i, n = Object(this), + r = n.length >>> 0, + o = 0; + if ("function" != typeof e) throw new TypeError; + if (0 == r && 1 == arguments.length) throw new TypeError; + if (arguments.length >= 2) i = arguments[1]; + else for (;;) { + if (o in n) { + i = n[o++]; + break + } + if (++o >= r) throw new TypeError + } + for (; r > o;) o in n && (i = e.call(t, i, n[o], o, n)), o++; + return i + }) +}(); +var biRadixBase = 2, + biRadixBits = 16, + bitsPerDigit = biRadixBits, + biRadix = 65536, + biHalfRadix = biRadix >>> 1, + biRadixSquared = biRadix * biRadix, + maxDigitVal = biRadix - 1, + maxInteger = 9999999999999998, + maxDigits, ZERO_ARRAY, bigZero, bigOne; +setMaxDigits(20); +var dpl10 = 15, + lr10 = biFromNumber(1e15), + hexatrigesimalToChar = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"), + hexToChar = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"), + highBitMasks = new Array(0, 32768, 49152, 57344, 61440, 63488, 64512, 65024, 65280, 65408, 65472, 65504, 65520, 65528, 65532, 65534, 65535), + lowBitMasks = new Array(0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535); \ No newline at end of file diff --git a/public/tool/bduss/index.html b/public/tool/bduss/index.html new file mode 100644 index 0000000..83f87ca --- /dev/null +++ b/public/tool/bduss/index.html @@ -0,0 +1,315 @@ + + + + + + + 获取百度BDUSS + + + + + + + +
          +
          +
          +

          + 获取百度BDUSS +

          +
          +
          + +
          + +
          +
          +
          帐号
          + +
          +
          +
          密码
          + +
          + + +
          + +
          点此重新登录 +
          +
          +
          +
          +
          + + + \ No newline at end of file diff --git a/public/tool/bduss/index2.html b/public/tool/bduss/index2.html new file mode 100644 index 0000000..cb93af7 --- /dev/null +++ b/public/tool/bduss/index2.html @@ -0,0 +1,117 @@ + + + + + + + 获取百度BDUSS + + + + + + +
          +
          +
          +

          + 获取百度BDUSS +

          +
          +
          + +
          +
          + 正在加载. +
          + +
          点此重新登录 +
          +
          +
          +
          +
          + + + \ No newline at end of file diff --git a/public/tool/bduss/index3.html b/public/tool/bduss/index3.html new file mode 100644 index 0000000..b0e3edb --- /dev/null +++ b/public/tool/bduss/index3.html @@ -0,0 +1,252 @@ + + + + + + + 获取百度BDUSS + + + + + + +
          +
          +
          +

          + 获取百度BDUSS +

          +
          +
          + +
          + +
          +
          +
          手机号
          + +
          + + + +
          +
          点此重新登录 +
          +
          +
          +
          +
          + + + \ No newline at end of file diff --git a/public/tool/bduss/index4.html b/public/tool/bduss/index4.html new file mode 100644 index 0000000..8ffa63b --- /dev/null +++ b/public/tool/bduss/index4.html @@ -0,0 +1,175 @@ + + + + + + + 获取百度BDUSS + + + + + + +
          +
          +
          +

          + 获取百度BDUSS +

          +
          +
          + +
          + +
          + 使用QQ手机版扫描二维码. +
          +
          +
          + +
          点此重新登录 +
          +
          +
          +
          +
          + + + \ No newline at end of file diff --git a/public/tool/bduss/index5.html b/public/tool/bduss/index5.html new file mode 100644 index 0000000..c960892 --- /dev/null +++ b/public/tool/bduss/index5.html @@ -0,0 +1,121 @@ + + + + + + + 获取百度BDUSS + + + + + + +
          +
          +
          +

          + 获取百度BDUSS +

          +
          +
          + +
          + +
          + 请使用微信扫描二维码登录. +
          +
          +
          +
          点此重新登录 +
          +
          +
          +
          +
          + + + \ No newline at end of file diff --git a/public/tool/bduss/login.class.php b/public/tool/bduss/login.class.php new file mode 100644 index 0000000..56b1e75 --- /dev/null +++ b/public/tool/bduss/login.class.php @@ -0,0 +1,341 @@ +get_curl($url,0,$this->referrer); + $arr=json_decode($data,true); + if($arr['errno']==110000){ + return array('code'=>0,'time'=>$arr['time']); + }else{ + return array('code'=>-1,'msg'=>$arr['errmsg']); + } + } + //获取验证码图片 + public function getvcpic($vcodestr){ + $url='https://wappass.baidu.com/cgi-bin/genimage?'.$vcodestr.'&v='.time().'0000'; + return $this->get_curl($url,0,$this->referrer); + } + //普通登录操作 + public function login($time,$user,$pwd,$p,$vcode=null,$vcodestr=null,$BAIDUID=null){ + if(empty($user))return array('code'=>-1,'msg'=>'用户名不能为空'); + if(empty($pwd))return array('code'=>-1,'msg'=>'pwd不能为空'); + if(empty($p))return array('code'=>-1,'msg'=>'密码不能为空'); + if($vcode=='null')$vcode=''; + if($vcodestr=='null')$vcodestr=''; + + $cookie='BAIDUID='.$BAIDUID.'; '; + $url='https://passport.baidu.com/viewlog?ak=1e3f2dd1c81f2075171a547893391274&v='.rand(1111,9999); + $data = $this->get_curl($url,0,$this->referrer,$cookie,1); + preg_match("/pplogid=(.*?);/", $data, $pplogid); + $cookie.='pplogid='.$pplogid[1].'; '; + $data = substr($data, strpos($data,'{"code"')); + $arr=json_decode($data,true); + + $url='https://wappass.baidu.com/wp/api/login?v='.time().'0000'; + $post='username='.$user.'&code=&password='.$p.'&verifycode='.$vcode.'&clientfrom=&tpl=tb&login_share_strategy=choice&client=&adapter=0&t='.time().'0000&loginLink=0&smsLoginLink=1&lPFastRegLink=0&fastRegLink=1&lPlayout=0&loginInitType=0&lang=zh-cn®Link=1&action=login&loginmerge=1&isphone=0&dialogVerifyCode=&dialogVcodestr=&dialogVcodesign=&gid=660BDF6-30E5-4A83-8EAC-F0B4752E1C4B&vcodestr='.$vcodestr.'&countrycode=&servertime='.$time.'&logLoginType=wap_loginTouch&passAppHash=&passAppVersion=&dv='.urlencode($arr['data']['dv']).'&ds='.urlencode($arr['data']['ds']).'&tk='.urlencode($arr['data']['tk']); + $data = $this->get_curl($url,$post,$this->referrer,$cookie); + $arr=json_decode($data,true); + if(array_key_exists('errInfo',$arr) && $arr['errInfo']['no']=='0'){ + if(!empty($arr['data']['loginProxy'])){ + $data = $this->get_curl($arr['data']['loginProxy'],0,$this->referrer,$cookie); + $arr=json_decode($data,true); + } + $data=$arr['data']['xml']; + preg_match('!(.*?)!i',$data,$bduss); + preg_match('!(.*?)!i',$data,$ptoken); + preg_match('!(.*?)!i',$data,$stoken); + $cookie = 'BDUSS='.$bduss[1].';'; + $userInfo = $this->getUserInfo($cookie); + return array('code'=>0,'uid'=>$userInfo['id'],'user'=>$userInfo['name'],'displayname'=>$userInfo['name_show'],'face'=>$userInfo['portrait_url'],'bduss'=>$bduss[1],'ptoken'=>$ptoken[1],'stoken'=>$stoken[1]); + }elseif($arr['errInfo']['no']=='310006'||$arr['errInfo']['no']=='500001'||$arr['errInfo']['no']=='500002'){ + return array('code'=>$arr['errInfo']['no'],'msg'=>$arr['errInfo']['msg'],'vcodestr'=>$arr['data']['codeString']); + }elseif($arr['errInfo']['no']=='400023'){ + $query = parse_url($arr['data']['gotoUrl'], PHP_URL_QUERY); + parse_str($query, $tokenData); + $token = $tokenData['token']; + if($arr['data']['showType'] == 'phone'){ + $account = $arr['data']['phone']; + $arr['data']['showType'] = 'mobile'; + }else{ + $account = $arr['data']['email']; + } + $lurl = $arr['data']['loginProxy']; + return array('code'=>$arr['errInfo']['no'],'msg'=>$arr['errInfo']['msg'],'type'=>$arr['data']['showType'],'account'=>$account,'token'=>$token,'lurl'=>$lurl); + }elseif(array_key_exists('errInfo',$arr)){ + return array('code'=>$arr['errInfo']['no'],'msg'=>$arr['errInfo']['msg']); + }else{ + return array('code'=>-1,'msg'=>'登录失败,原因未知'); + } + } + //登录异常时发送手机/邮件验证码 + public function sendcode($type,$token,$lurl,$BAIDUID){ + if(empty($token))return array('code'=>-1,'msg'=>'token不能为空'); + + $cookie='BAIDUID='.$BAIDUID.';'; + /*$url = 'https://wappass.baidu.com/v3/api/auth/widget'; + $post = json_encode(['action'=>'send', 'authField'=>$type, 'authParams'=>['banktype'=>'','secret'=>'','type'=>'vcode'], 'authType'=>'check', 'authid'=>$authid, 'client'=>'', 'clientfrom'=>'', 'tpl'=>'tb']); + $addheader = array("Content-Type: application/json; charset=utf-8"); + $data=$this->get_curl($url,$post,$this->referrer,$cookie,0,0,0,$addheader); + $arr=json_decode($data,true); + if(array_key_exists('code',$arr) && $arr['code']==110000){ + return array('code'=>0); + }elseif(array_key_exists('message',$arr)){ + return array('code'=>$arr['code'],'msg'=>$arr['message']); + }else{ + return array('code'=>-1,'msg'=>'发生验证码失败,原因未知'); + }*/ + + $url = 'https://wappass.baidu.com/passport/authwidget?action=send&type='.$type.'&u='.urlencode($lurl).'&ori_u=&tpl=tb&lstr=<oken=&token='.urlencode($token).'&from=&isnew=true&adapter=0&skin=&finance=&isnew=true&callback=jsonp4'; + $data=$this->get_curl($url,0,$this->referrer,$cookie); + preg_match("/jsonp4\((.*?)\)/is", $data, $match); + $arr=json_decode(str_replace("''","null",$match[1]),true); + if(array_key_exists('errInfo',$arr) && $arr['errInfo']['no']=='0'){ + return array('code'=>0); + }elseif(array_key_exists('errInfo',$arr)){ + return array('code'=>$arr['errInfo']['no'],'msg'=>$arr['errInfo']['msg']); + }else{ + return array('code'=>-1,'msg'=>'发生验证码失败,原因未知'); + } + } + //登录异常时登录操作 + public function login2($type,$token,$lurl,$BAIDUID,$vcode){ + if(empty($type))return array('code'=>-1,'msg'=>'type不能为空'); + if(empty($token))return array('code'=>-1,'msg'=>'token不能为空'); + if(empty($lurl))return array('code'=>-1,'msg'=>'lurl不能为空'); + if(empty($vcode))return array('code'=>-1,'msg'=>'vcode不能为空'); + + $cookie='BAIDUID='.$BAIDUID.';'; + /*$url = 'https://wappass.baidu.com/v3/api/auth/widget'; + $post = json_encode(['action'=>'check', 'authField'=>$type, 'authParams'=>['banktype'=>'','secret'=>'','type'=>'vcode','vcode'=>$vcode], 'authType'=>'check', 'authid'=>$authid, 'client'=>'', 'clientfrom'=>'', 'tpl'=>'tb']); + $addheader = array("Content-Type: application/json; charset=utf-8"); + $data = $this->get_curl($url,$post,$this->referrer,$cookie,0,0,0,$addheader); + $arr=json_decode($data,true); + if(array_key_exists('code',$arr) && $arr['code']==110000){ + $data = $this->get_curl($lurl,0,$this->referrer,$cookie,1); + preg_match('!BDUSS=(.*?);!i',$data,$bduss); + preg_match('!PTOKEN=(.*?);!i',$data,$ptoken); + preg_match('!STOKEN=(.*?);!i',$data,$stoken); + if($bduss[1]){ + $cookie = 'BDUSS='.$bduss[1].';'; + $userInfo = $this->getUserInfo($cookie); + return array('code'=>0,'uid'=>$userInfo['id'],'user'=>$userInfo['name'],'displayname'=>$userInfo['name_show'],'face'=>$userInfo['portrait_url'],'bduss'=>$bduss[1],'ptoken'=>$ptoken[1],'stoken'=>$stoken[1]); + }else{ + preg_match('/(.*?)<\/span>/',$data,$match); + if($match[1]){ + return array('code'=>-1,'msg'=>$match[1]); + }else{ + return array('code'=>-1,'msg'=>'登录失败,原因未知'); + } + } + }elseif(array_key_exists('message',$arr)){ + return array('code'=>$arr['code'],'msg'=>$arr['message']); + }else{ + return array('code'=>-1,'msg'=>'验证失败,原因未知'); + }*/ + + $url = 'https://wappass.baidu.com/passport/authwidget?v='.time().'000&vcode='.$vcode.'&token='.urlencode($token).'&action=check&type='.$type.'&u='.urlencode($lurl).'&ori_u=&lstr=<oken=&tpl=tb&skin=&clientfrom=&adapter=0&updatessn=&bindToSmsLogin=&isnew=true&finance=&callback=jsonp1'; + $data = $this->get_curl($url,0,$this->referrer,$cookie); + preg_match("/jsonp1\((.*?)\)/is", $data, $match); + $arr=json_decode(str_replace("''","null",$match[1]),true); + if(array_key_exists('errInfo',$arr) && $arr['errInfo']['no']=='0'){ + $data = $this->get_curl($arr['data']['u'],0,$this->referrer,$cookie,1); + preg_match('!BDUSS=(.*?);!i',$data,$bduss); + preg_match('!PTOKEN=(.*?);!i',$data,$ptoken); + preg_match('!STOKEN=(.*?);!i',$data,$stoken); + $cookie = 'BDUSS='.$bduss[1].';'; + $userInfo = $this->getUserInfo($cookie); + return array('code'=>0,'uid'=>$userInfo['id'],'user'=>$userInfo['name'],'displayname'=>$userInfo['name_show'],'face'=>$userInfo['portrait_url'],'bduss'=>$bduss[1],'ptoken'=>$ptoken[1],'stoken'=>$stoken[1]); + }elseif(array_key_exists('errInfo',$arr)){ + return array('code'=>$arr['errInfo']['no'],'msg'=>$arr['errInfo']['msg']); + }else{ + return array('code'=>-1,'msg'=>'登录失败,原因未知'); + } + } + //检测是否需要验证码 + public function checkvc($user){ + if(empty($user))return array('saveOK'=>-1,'msg'=>'请先输入用户名'); + $url='https://wappass.baidu.com/wp/api/login/check?tt='.time().'9117&username='.$user.'&countrycode=&clientfrom=wap&sub_source=leadsetpwd&tpl=tb'; + $data = $this->get_curl($url,0,$this->referrer,0,1); + preg_match("/BAIDUID=(.*?);/", $data, $BAIDUID); + $arr=json_decode(substr($data,strpos($data,'{')),true); + if($arr['errInfo'] && $arr['errInfo']['no']=='0' && empty($arr['data']['codeString'])){ + return array('code'=>0, 'BAIDUID'=>$BAIDUID[1]); + }elseif($arr['errInfo'] && $arr['errInfo']['no']=='0'){ + return array('code'=>1,'vcodestr'=>$arr['data']['codeString'], 'BAIDUID'=>$BAIDUID[1]); + }else{ + return array('code'=>$arr['errInfo']['no'],'msg'=>$arr['errInfo']['msg'], 'BAIDUID'=>$BAIDUID[1]); + } + } + //手机验证码登录,获取手机号是否存在 + public function getphone($phone){ + if(empty($phone))return array('saveOK'=>-1,'msg'=>'请先输入手机号'); + if(strlen($phone)!=11)return array('saveOK'=>-1,'msg'=>'请输入正确的手机号'); + $phone2=''; + for($i=0;$i<11;$i++){ + $phone2.=$phone[$i]; + if($i==2||$i==6)$phone2.='+'; + } + $url='https://wappass.baidu.com/wp/api/security/getphonestatus?v='.time().'0000'; + $post='mobilenum='.$phone2.'&clientfrom=&tpl=tb&login_share_strategy=&client=&adapter=0&t='.time().'0000&act=bind_mobile&loginLink=0&smsLoginLink=1&lPFastRegLink=0&fastRegLink=1&lPlayout=0&lang=zh-cn®Link=1&action=login&loginmerge=1&isphone=0&dialogVerifyCode=&dialogVcodestr=&dialogVcodesign=&gid=E528690-4ADF-47A5-BA87-1FD76D2583EA&agreement=1&vcodesign=&vcodestr=&sms=1&username='.$phone.'&countrycode='; + $data=$this->get_curl($url,$post,$this->referrer); + $arr=json_decode($data,true); + if($arr['errInfo'] && $arr['errInfo']['no']=='0'){ + return array('code'=>0,'msg'=>$arr['errInfo']['msg']); + }else{ + return array('code'=>$arr['errInfo']['no'],'msg'=>$arr['errInfo']['msg']); + } + } + //手机验证码登录,发送验证码 + public function sendsms($phone,$BAIDUID,$vcode=null,$vcodestr=null,$vcodesign=null){ + if(empty($phone))return array('saveOK'=>-1,'msg'=>'请先输入手机号'); + if(strlen($phone)!=11)return array('saveOK'=>-1,'msg'=>'请输入正确的手机号'); + if($vcode=='null')$vcode=''; + if($vcodestr=='null')$vcodestr=''; + if($vcodesign=='null')$vcodesign=''; + $cookie='BAIDUID='.$BAIDUID.';'; + $url='https://wappass.baidu.com/wp/api/login/sms?v='.time().'0000'; + $post='username='.$phone.'&tpl=tb&clientfrom=&countrycode=&gid=E528690-4ADF-47A5-BA87-1FD76D2583EA&dialogVerifyCode='.$vcode.'&vcodesign='.$vcodesign.'&vcodestr='.$vcodestr; + $data=$this->get_curl($url,$post,$this->referrer,$cookie); + $arr=json_decode($data,true); + if($arr['errInfo'] && $arr['errInfo']['no']=='0'){ + return array('code'=>0,'msg'=>$arr['errInfo']['msg']); + }elseif($arr['errInfo']['no']=='50020'){ + return array('code'=>$arr['errInfo']['no'],'msg'=>$arr['errInfo']['msg'],'vcodestr'=>$arr['data']['vcodestr'],'vcodesign'=>$arr['data']['vcodesign']); + }else{ + return array('code'=>$arr['errInfo']['no'],'msg'=>$arr['errInfo']['msg']); + } + } + //手机验证码登录操作 + public function login3($phone,$BAIDUID,$smsvc){ + if(empty($phone))return array('code'=>-1,'msg'=>'手机号不能为空'); + if(empty($smsvc))return array('code'=>-1,'msg'=>'验证码不能为空'); + $cookie='BAIDUID='.$BAIDUID.';'; + $url='https://wappass.baidu.com/wp/api/login?v='.time().'0000'; + $post='smsvc='.$smsvc.'&clientfrom=&tpl=tb&login_share_strategy=&client=&adapter=0&t='.time().'0000&loginLink=0&smsLoginLink=1&lPFastRegLink=0&fastRegLink=1&lPlayout=0&lang=zh-cn®Link=1&action=login&loginmerge=&isphone=0&dialogVerifyCode=&dialogVcodestr=&dialogVcodesign=&gid=E528690-4ADF-47A5-BA87-1FD76D2583EA&agreement=1&vcodesign=&vcodestr=&smsverify=1&sms=1&mobilenum='.$phone.'&username='.$phone.'&countrycode=&passAppHash=&passAppVersion='; + $data = $this->get_curl($url,$post,$this->referrer,$cookie,1); + $data2 = substr($data, strpos($data,'{')); + $arr=json_decode($data2,true); + if(array_key_exists('errInfo',$arr) && $arr['errInfo']['no']=='0'){ + if(!empty($arr['data']['loginProxy'])){ + $data = $this->get_curl($arr['data']['loginProxy'],0,$this->referrer,1); + $arr=json_decode($data,true); + } + preg_match('!BDUSS=(.*?);!i',$data,$bduss); + preg_match('!PTOKEN=(.*?);!i',$data,$ptoken); + preg_match('!STOKEN=(.*?);!i',$data,$stoken); + $cookie = 'BDUSS='.$bduss[1].';'; + $userInfo = $this->getUserInfo($cookie); + return array('code'=>0,'uid'=>$userInfo['id'],'user'=>$userInfo['name'],'displayname'=>$userInfo['name_show'],'face'=>$userInfo['portrait_url'],'bduss'=>$bduss[1],'ptoken'=>$ptoken[1],'stoken'=>$stoken[1]); + }elseif(array_key_exists('errInfo',$arr)){ + return array('code'=>$arr['errInfo']['no'],'msg'=>$arr['errInfo']['msg']); + }else{ + return array('code'=>-1,'msg'=>'登录失败,原因未知'); + } + } + //获取扫码登录二维码 + public function getqrcode(){ + $url='https://passport.baidu.com/v2/api/getqrcode?lp=pc&gid=07D9D20-91EB-43D8-8553-16A98A0B24AA&apiver=v3&tt='.time().'0000'; + $data=$this->get_curl($url,0,'https://passport.baidu.com/v2/?login'); + $arr=json_decode($data,true); + if(array_key_exists('errno',$arr) && $arr['errno']==0){ + return array('code'=>0,'imgurl'=>$arr['imgurl'],'sign'=>$arr['sign'],'link'=>'https://wappass.baidu.com/wp/?qrlogin&t='.time().'&error=0&sign='.$arr['sign'].'&cmd=login&lp=pc&tpl=&uaonly='); + }else{ + return array('code'=>$arr['errno'],'msg'=>'获取二维码失败'); + } + } + //扫码登录操作 + public function qrlogin($sign){ + if(empty($sign))return array('code'=>-1,'msg'=>'sign不能为空'); + $url='https://passport.baidu.com/channel/unicast?channel_id='.$sign.'&tpl=pp&gid=07D9D20-91EB-43D8-8553-16A98A0B24AA&apiver=v3&tt='.time().'0000'; + $data=$this->get_curl($url,0,'https://passport.baidu.com/v2/?login'); + $arr=json_decode($data,true); + if(array_key_exists('errno',$arr) && $arr['errno']==0){ + $arr=json_decode($arr['channel_v'],true); + if($arr['status'] == 0){ + $data=$this->get_curl('https://passport.baidu.com/v3/login/main/qrbdusslogin?v='.time().'000&bduss='.$arr['v'].'&u=https%3A%2F%2Fpassport.baidu.com%2F&loginVersion=v4&qrcode=1&tpl=pp&apiver=v3&tt='.time().'0000&callback=callback',0,'https://passport.baidu.com/v2/?login',0,1); + preg_match('/callback\((.*?)\)/',$data,$match); + $arr=json_decode(str_replace(array("'data'",'\"'),array('"data"',''),$match[1]),true); + if(array_key_exists('errInfo',$arr) && $arr['errInfo']['no']=='0'){ + $data=str_replace('=deleted','',$data); + preg_match('!BDUSS=(.*?);!i',$data,$bduss); + preg_match('!PTOKEN=(.*?);!i',$data,$ptoken); + preg_match('!STOKEN=(.*?);!i',$data,$stoken); + $cookie = 'BDUSS='.$bduss[1].';'; + $userInfo = $this->getUserInfo($cookie); + return array('code'=>0,'uid'=>$userInfo['id'],'user'=>$userInfo['name'],'displayname'=>$userInfo['name_show'],'face'=>$userInfo['portrait_url'],'bduss'=>$bduss[1],'ptoken'=>$ptoken[1],'stoken'=>$stoken[1]); + }elseif(array_key_exists('errInfo',$arr)){ + return array('code'=>$arr['errInfo']['no'],'msg'=>$arr['errInfo']['msg']); + }else{ + return array('code'=>'-1','msg'=>'登录失败2,原因未知'); + } + }else{ + return array('code'=>2); + } + }elseif(array_key_exists('errno',$arr)){ + return array('code'=>$arr['errno']); + }else{ + return array('code'=>'-1','msg'=>'登录失败,原因未知'); + } + } + private function getUserid($uname){ + $ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'; + $data = $this->get_curl('https://tieba.baidu.com/home/get/panel?ie=utf-8&un='.urlencode($uname),0,0,0,0,$ua); + $arr = json_decode($data,true); + $userid = $arr['data']['id']; + return $userid; + } + private function getUserInfo($cookie){ + $data = $this->get_curl('https://tieba.baidu.com/mo/q/newmoindex?need_user=1',0,'https://tieba.baidu.com/index/tbwise/forum?shownew=1',$cookie); + $arr = json_decode($data,true); + return $arr['data']; + } + private function get_curl($url,$post=0,$referer=1,$cookie=0,$header=0,$ua=0,$nobaody=0,$addheader=0){ + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL,$url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + $httpheader[] = "Accept:application/json"; + $httpheader[] = "Accept-Encoding:gzip,deflate,sdch"; + $httpheader[] = "Accept-Language:zh-CN,zh;q=0.8"; + $httpheader[] = "Connection:close"; + if($addheader){ + $httpheader = array_merge($httpheader, $addheader); + } + curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader); + if($post){ + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, $post); + } + if($header){ + curl_setopt($ch, CURLOPT_HEADER, TRUE); + } + if($cookie){ + curl_setopt($ch, CURLOPT_COOKIE, $cookie); + } + if($referer){ + curl_setopt($ch, CURLOPT_REFERER, "https://wappass.baidu.com/"); + } + if($ua){ + curl_setopt($ch, CURLOPT_USERAGENT,$ua); + }else{ + curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Linux; Android 4.4.2; H650 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36'); + } + if($nobaody){ + curl_setopt($ch, CURLOPT_NOBODY,1); + + } + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + curl_setopt($ch, CURLOPT_ENCODING, "gzip"); + curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); + $ret = curl_exec($ch); + curl_close($ch); + return $ret; + } +} \ No newline at end of file diff --git a/public/tool/bduss/login.php b/public/tool/bduss/login.php new file mode 100644 index 0000000..0ad5fc2 --- /dev/null +++ b/public/tool/bduss/login.php @@ -0,0 +1,46 @@ +servertime(); +} +if($_GET['do']=='checkvc'){ + $array=$login->checkvc($_POST['user']); +} +if($_GET['do']=='sendcode'){ + $array=$login->sendcode($_POST['type'],$_POST['token'],$_POST['lurl'],$_POST['BAIDUID']); +} +if($_GET['do']=='login'){ + $array=$login->login($_POST['time'],$_POST['user'],$_POST['pwd'],$_POST['p'],$_POST['vcode'],$_POST['vcodestr'],$_POST['BAIDUID']); +} +if($_GET['do']=='login2'){ + $array=$login->login2($_POST['type'],$_POST['token'],$_POST['lurl'],$_POST['BAIDUID'],$_POST['vcode']); +} +if($_GET['do']=='getvcpic'){ + header('content-type:image/jpeg'); + echo $login->getvcpic($_GET['vcodestr']); + exit; +} +if($_GET['do']=='getphone'){ + $array=$login->getphone($_POST['phone']); +} +if($_GET['do']=='sendsms'){ + $array=$login->sendsms($_POST['phone'],$_POST['BAIDUID'],$_POST['vcode'],$_POST['vcodestr'],$_POST['vcodesign']); +} +if($_GET['do']=='login3'){ + $array=$login->login3($_POST['phone'],$_POST['BAIDUID'],$_POST['smsvc']); +} +if($_GET['do']=='getqrcode'){ + $array=$login->getqrcode(); +} +if($_GET['do']=='qrlogin'){ + $array=$login->qrlogin($_POST['sign']); +} +echo json_encode($array); \ No newline at end of file diff --git a/public/tool/bduss/qqlogin.class.php b/public/tool/bduss/qqlogin.class.php new file mode 100644 index 0000000..92d5f77 --- /dev/null +++ b/public/tool/bduss/qqlogin.class.php @@ -0,0 +1,202 @@ +get_curl($url); + preg_match('!connect/qrcode/(.*?)\"!',$ret,$match); + if($uuid = $match[1]) + return array('code'=>0,'uuid'=>$uuid,'imgurl'=>'https://open.weixin.qq.com/connect/qrcode/'.$uuid); + else + return array('code'=>1,'msg'=>'获取二维码失败'); + } + public function wxlogin($uuid, $last=null){ + if(empty($uuid))return array('code'=>-1,'msg'=>'uuid不能为空'); + $last=$last?'&last='.$last:null; + $url='https://long.open.weixin.qq.com/connect/l/qrconnect?uuid='.$uuid.$last.'&_='.time().'000'; + $ret = $this->get_curl($url,0,'https://open.weixin.qq.com/connect/qrconnect'); + if(preg_match("/wx_errcode=(\d+);window.wx_code=\'(.*?)\'/", $ret, $match)){ + $errcode = $match[1]; + $code = $match[2]; + if($errcode == 408){ + return array('code'=>'1','msg'=>'二维码未失效'); + }elseif($errcode == 404){ + return array('code'=>'2','msg'=>'请在微信中点击确认即可登录'); + }elseif($errcode == 402){ + return array('code'=>'3','msg'=>'二维码已失效'); + }elseif($errcode == 405){ + $data=$this->get_curl('https://passport.baidu.com/phoenix/account/startlogin?type=42&tpl=pp&u=https%3A%2F%2Fpassport.baidu.com%2F&display=popup&act=optional',0,0,0,1); + preg_match('/mkey=(.*?);/',$data,$mkey); + if($mkey = $mkey[1]){ + $url = 'https://passport.baidu.com/phoenix/account/afterauth?mkey='.$mkey.'&appid=wx85f17c29f3e648bf&traceid=&code='.$code.'&state='.time(); + $data=$this->get_curl($url,0,0,'mkey='.$mkey.';',1); + preg_match('/BDUSS=(.*?);/',$data,$BDUSS); + preg_match('/STOKEN=(.*?);/',$data,$STOKEN); + preg_match('/PTOKEN=(.*?);/',$data,$PTOKEN); + preg_match('/passport_uname: \'(.*?)\'/',$data,$uname); + preg_match('/displayname: \'(.*?)\'/',$data,$displayname); + }else{ + return array('code'=>-1,'msg'=>'登录成功,获取mkey失败!'); + } + if($BDUSS[1] && $STOKEN[1] && $PTOKEN[1]){ + return array('code'=>0,'uid'=>$this->getUserid($uname[1]),'user'=>$uname[1],'displayname'=>$displayname[1],'bduss'=>$BDUSS[1],'ptoken'=>$PTOKEN[1],'stoken'=>$STOKEN[1]); + }else{ + return array('code'=>-1,'msg'=>'登录成功,回调百度失败!'); + } + }else{ + return array('code'=>-1,'msg'=>$ret); + } + }elseif($ret){ + return array('code'=>-1,'msg'=>$ret); + }else{ + return array('code'=>1); + } + } + + public function getqrpic(){ + $url='https://ssl.ptlogin2.qq.com/ptqrshow?appid=716027609&e=2&l=M&s=4&d=72&v=4&t=0.2616844'.time().'&daid=383&pt_3rd_aid=100312028'; + $arr=$this->get_curl($url,0,'https://xui.ptlogin2.qq.com/cgi-bin/xlogin?appid=716027609&daid=383&style=33&theme=2&login_text=%E6%8E%88%E6%9D%83%E5%B9%B6%E7%99%BB%E5%BD%95&hide_title_bar=1&hide_border=1&target=self&s_url=https%3A%2F%2Fgraph.qq.com%2Foauth2.0%2Flogin_jump&pt_3rd_aid=100312028&pt_feedback_link=https%3A%2F%2Fsupport.qq.com%2Fproducts%2F77942%3FcustomInfo%3Dwww.baidu.com.appid100312028',0,1,0,0,1); + preg_match('/qrsig=(.*?);/',$arr['header'],$match); + if($qrsig=$match[1]) + return array('code'=>0,'qrsig'=>$qrsig,'data'=>base64_encode($arr['body'])); + else + return array('code'=>-1,'msg'=>'二维码获取失败'); + } + public function qrlogin($qrsig){ + if(empty($qrsig))return array('code'=>-1,'msg'=>'qrsig不能为空'); + $url='https://ssl.ptlogin2.qq.com/ptqrlogin?u1=https%3A%2F%2Fgraph.qq.com%2Foauth2.0%2Flogin_jump&ptqrtoken='.$this->getqrtoken($qrsig).'&ptredirect=0&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=1-0-'.time().'000&js_ver=10289&js_type=1&login_sig=fCmEYUeoOds1DTeFIFt2IpGUVa471vZXwy6vQlhx2bOL1CnNRtnCe8J0kv9fTQ1Y&pt_uistyle=40&aid=716027609&daid=383&pt_3rd_aid=100312028&'; + $ret = $this->get_curl($url,0,'https://xui.ptlogin2.qq.com/cgi-bin/xlogin','qrsig='.$qrsig.'; ',1); + if(preg_match("/ptuiCB\('(.*?)'\)/", $ret, $arr)){ + $r=explode("','",str_replace("', '","','",$arr[1])); + if($r[0]==0){ + preg_match('/uin=(\d+)&/',$ret,$uin); + $uin=$uin[1]; + $data=$this->get_curl($r[2],0,'https://xui.ptlogin2.qq.com/cgi-bin/xlogin',0,1); + if($data) { + $cookie=''; + preg_match_all('/Set-Cookie: (.*);/iU',$data,$matchs); + foreach ($matchs[1] as $val) { + if(substr($val,-1)=='=')continue; + $cookie.=$val.'; '; + } + preg_match('/p_skey=(.*?);/',$cookie,$pskey); + $cookie = substr($cookie,0,-2); + $data=$this->get_curl('https://passport.baidu.com/phoenix/account/startlogin?type=15&tpl=pp&u=https%3A%2F%2Fpassport.baidu.com%2F&display=popup&act=optional',0,0,0,1); + preg_match('/mkey=(.*?);/',$data,$mkey); + if($mkey = $mkey[1]){ + $url = 'https://graph.qq.com/oauth2.0/authorize'; + $post = 'response_type=code&client_id=100312028&redirect_uri=https%3A%2F%2Fpassport.baidu.com%2Fphoenix%2Faccount%2Fafterauth%3Fmkey%3D'.$mkey.'&scope=get_user_info%2Cadd_share%2Cget_other_info%2Cget_fanslist%2Cget_idollist%2Cadd_idol%2Cget_simple_userinfo&state='.time().'&switch=&from_ptlogin=1&src=1&update_auth=1&openapi=80901010&g_tk='.$this->getGTK($pskey[1]).'&auth_time='.time().'928&ui=D693AB27-C4CD-4C11-A090-A3EFE7C218EC'; + $data=$this->get_curl($url,$post,0,$cookie,1); + preg_match("/(Location:|location:) (.*?)\r\n/", $data, $match); + if($match[2]){ + return array('code'=>0,'msg'=>'succ','uin'=>$uin,'redirect_uri'=>$match[2],'mkey'=>$mkey); + }else{ + return array('code'=>-1,'uin'=>$uin,'msg'=>'登录QQ成功,回调网站失败!'); + } + }else{ + return array('code'=>-1,'msg'=>'登录QQ成功,获取mkey失败!'); + } + }else{ + return array('code'=>-1,'uin'=>$uin,'msg'=>'登录QQ成功,获取相关信息失败!'); + } + }elseif($r[0]==65){ + return array('code'=>1,'uin'=>$uin,'msg'=>'二维码已失效。'); + }elseif($r[0]==66){ + return array('code'=>2,'uin'=>$uin,'msg'=>'二维码未失效。'); + }elseif($r[0]==67){ + return array('code'=>3,'uin'=>$uin,'msg'=>'正在验证二维码。'); + }else{ + return array('code'=>-1,'uin'=>$uin,'msg'=>$r[4]); + } + }else{ + return array('code'=>-1,'msg'=>$ret); + } + } + public function qqconnect($redirect_uri, $mkey){ + $url_arr = parse_url($redirect_uri); + if(empty($redirect_uri) || $url_arr['host']!='passport.baidu.com')return array('code'=>-1,'msg'=>'回调地址错误'); + if(empty($mkey))return array('code'=>-1,'msg'=>'mkey不能为空'); + $data=$this->get_curl($redirect_uri,0,0,'mkey='.$mkey.';',1); + preg_match('/BDUSS=(.*?);/',$data,$BDUSS); + preg_match('/STOKEN=(.*?);/',$data,$STOKEN); + preg_match('/PTOKEN=(.*?);/',$data,$PTOKEN); + preg_match('/passport_uname: \'(.*?)\'/',$data,$uname); + preg_match('/displayname: \'(.*?)\'/',$data,$displayname); + if($BDUSS[1] && $STOKEN[1] && $PTOKEN[1]){ + return array('code'=>0,'msg'=>'succ','uid'=>$this->getUserid($uname[1]),'user'=>$uname[1],'displayname'=>$displayname[1],'bduss'=>$BDUSS[1],'ptoken'=>$STOKEN[1],'stoken'=>$PTOKEN[1]); + }else{ + return array('code'=>-1,'msg'=>'登录QQ成功,获取百度登录信息失败!'); + } + } + private function getqrtoken($qrsig){ + $len = strlen($qrsig); + $hash = 0; + for($i = 0; $i < $len; $i++){ + $hash += (($hash << 5) & 2147483647) + ord($qrsig[$i]) & 2147483647; + $hash &= 2147483647; + } + return $hash & 2147483647; + } + private function getUserid($uname){ + $ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'; + $data = $this->get_curl('https://tieba.baidu.com/home/get/panel?ie=utf-8&un='.urlencode($uname),0,0,0,0,$ua); + $arr = json_decode($data,true); + $userid = $arr['data']['id']; + return $userid; + } + private function getGTK($skey){ + $len = strlen($skey); + $hash = 5381; + for ($i = 0; $i < $len; $i++) { + $hash += ($hash << 5 & 2147483647) + ord($skey[$i]) & 2147483647; + $hash &= 2147483647; + } + return $hash & 2147483647; + } + private function get_curl($url,$post=0,$referer=0,$cookie=0,$header=0,$ua=0,$nobaody=0,$split=0){ + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL,$url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + $httpheader[] = "Accept: application/json"; + $httpheader[] = "Accept-Encoding: gzip,deflate,sdch"; + $httpheader[] = "Accept-Language: zh-CN,zh;q=0.8"; + $httpheader[] = "Connection: close"; + curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader); + if($post){ + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, $post); + } + if($header){ + curl_setopt($ch, CURLOPT_HEADER, TRUE); + } + if($cookie){ + curl_setopt($ch, CURLOPT_COOKIE, $cookie); + } + if($referer){ + curl_setopt($ch, CURLOPT_REFERER, $referer); + } + if($ua){ + curl_setopt($ch, CURLOPT_USERAGENT,$ua); + }else{ + curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36'); + } + if($nobaody){ + curl_setopt($ch, CURLOPT_NOBODY,1); + + } + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + curl_setopt($ch, CURLOPT_ENCODING, "gzip"); + curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); + $ret = curl_exec($ch); + if ($split) { + $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE); + $header = substr($ret, 0, $headerSize); + $body = substr($ret, $headerSize); + $ret=array(); + $ret['header']=$header; + $ret['body']=$body; + } + curl_close($ch); + return $ret; + } +} \ No newline at end of file diff --git a/public/tool/bduss/qqlogin.php b/public/tool/bduss/qqlogin.php new file mode 100644 index 0000000..5786ac9 --- /dev/null +++ b/public/tool/bduss/qqlogin.php @@ -0,0 +1,21 @@ +getqrpic(); +} +if($_GET['do']=='qrlogin'){ + $array = $login->qrlogin($_GET['qrsig']); +} +if($_GET['do']=='qqconnect'){ + $array = $login->qqconnect($_POST['redirect_uri'], $_POST['mkey']); +} +if($_GET['do']=='getwxpic'){ + $array = $login->getwxpic(); +} +if($_GET['do']=='wxlogin'){ + $array = $login->wxlogin($_GET['uuid'], $_GET['last']); +} +echo json_encode($array); \ No newline at end of file diff --git a/public/tool/bduss/qrcode.php b/public/tool/bduss/qrcode.php new file mode 100644 index 0000000..4dde65a --- /dev/null +++ b/public/tool/bduss/qrcode.php @@ -0,0 +1,29 @@ + \ No newline at end of file diff --git a/public/tool/gq_avatar/index.php b/public/tool/gq_avatar/index.php new file mode 100644 index 0000000..2220934 --- /dev/null +++ b/public/tool/gq_avatar/index.php @@ -0,0 +1,192 @@ + + + + +国庆头像生成 - 彩虹工具网 + + + + + + + +
          + +
          +
          +
          +
          +
          + +
          +
          + +
          +
          + +
          +国庆专属头像 +
          + + + + +
          +
          + +
          +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + + \ No newline at end of file diff --git a/public/tool/gq_avatar/static/css/jqery.css b/public/tool/gq_avatar/static/css/jqery.css new file mode 100644 index 0000000..abe4289 --- /dev/null +++ b/public/tool/gq_avatar/static/css/jqery.css @@ -0,0 +1 @@ +.animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}@-webkit-keyframes bounceInDown{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes bounceInDown{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.bounceInDown{-webkit-animation-name:bounceInDown;animation-name:bounceInDown}@-webkit-keyframes pulse{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes pulse{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}.pulse{-webkit-animation-name:pulse;animation-name:pulse;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}@-webkit-keyframes right-top{0%{-webkit-transform:translate3d(.25rem,-.25rem,0);transform:translate3d(.25rem,-.25rem,0)}50%{-webkit-transform:translate3d(.5rem,-1rem,0);transform:translate3d(.5rem,-1rem,0)}to{-webkit-transform:translate3d(.25rem,-.25rem,0);transform:translate3d(.25rem,-.25rem,0)}}@keyframes right-top{0%{-webkit-transform:translate3d(.25rem,-.25rem,0);transform:translate3d(.25rem,-.25rem,0)}50%{-webkit-transform:translate3d(.5rem,-1rem,0);transform:translate3d(.5rem,-1rem,0)}to{-webkit-transform:translate3d(.25rem,-.25rem,0);transform:translate3d(.25rem,-.25rem,0)}}.right-top{-webkit-animation-name:right-top;animation-name:right-top;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}@-webkit-keyframes left-btm{0%{-webkit-transform:translate3d(-.25rem,.25rem,0) rotate(180deg);transform:translate3d(-.25rem,.25rem,0) rotate(180deg)}50%{-webkit-transform:translate3d(-.5rem,1rem,0) rotate(180deg);transform:translate3d(-.5rem,1rem,0) rotate(180deg)}to{-webkit-transform:translate3d(-.25rem,.25rem,0) rotate(180deg);transform:translate3d(-.25rem,.25rem,0) rotate(180deg)}}@keyframes left-btm{0%{-webkit-transform:translate3d(-.25rem,.25rem,0) rotate(180deg);transform:translate3d(-.25rem,.25rem,0) rotate(180deg)}50%{-webkit-transform:translate3d(-.5rem,1rem,0) rotate(180deg);transform:translate3d(-.5rem,1rem,0) rotate(180deg)}to{-webkit-transform:translate3d(-.25rem,.25rem,0) rotate(180deg);transform:translate3d(-.25rem,.25rem,0) rotate(180deg)}}.left-btm{-webkit-animation-name:left-btm;animation-name:left-btm;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}article,body,div,h1,h2,h3,html,i,img,p,section,span{margin:0;padding:0;-webkit-box-sizing:border-box;box-sizing:border-box}body,html{font-size:16px;line-height:1.5;font-family:-apple-system,BlinkMacSystemFont,Helvetica Neue,Arial,PingFang SC,Hiragino Sans GB,STHeiti,Microsoft YaHei,Microsoft JhengHei,Source Han Sans SC,Noto Sans CJK SC,Source Han Sans CN,Noto Sans SC,Source Han Sans TC,Noto Sans CJK TC,WenQuanYi Micro Hei,SimSun,sans-serif;background-color:#fff}.icon{display:inline-block}.txt-ellipsis{display:block;white-space:nowrap}.txt-ellipsis,.txt-ellipsis-two{text-overflow:ellipsis;overflow:hidden}.txt-ellipsis-two{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;word-break:break-all}.flex-hcenter{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.flex-hcenter,.flex-vcenter{display:-webkit-box;display:-ms-flexbox;display:flex}.flex-vcenter{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.g-vcenter{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.g-hcenter{-webkit-transform:translateX(-50%);transform:translateX(-50%)}.g-center,.g-hcenter{position:absolute;left:50%}.g-center{top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.g-flex-center{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.center,.g-flex-center,.long-press,.long-press .l-img,.long-press .l-tips,.operation-box,.operation-btns,.operation-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}#app,body,html{min-height:100%;width:100%;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.wrapper{position:relative;overflow-x:hidden;width:100%;min-height:100vh;max-width:500px;margin:0 auto;background-image:url(../img/20190829-bg.png);background-repeat:no-repeat;background-size:cover}.operation-number{margin-top:.4rem;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;text-align:center;color:#fff;font-size:14px}.operation-number span{display:inline-block;padding:1px 5px;border-radius:25px;background-color:#ea4727;color:#feee92}.operation-header{margin-top:1.8rem;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.operation-header div{background-size:contain;background-repeat:no-repeat}.operation-header .h-logo{text-align:center}.operation-header .h-logo img{height:1.5rem}.operation-header .h-title{margin-top:.5rem;width:13.125rem;height:6.3rem;background-image:url(../img/20190906-logo2.png)}.operation-header .h-slogan{margin-top:.125rem;width:9.35rem;height:1.05rem;background-image:url(../img/20190906-logo3.png)}.operation-box{margin-top:.5rem}.operation-box .next,.operation-box .prev{background-image:url(../img/20190829-btn.png);background-size:contain;border-radius:50%;width:2.275rem;height:2.275rem}.operation-box .prev{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.operation-box .operation-img{margin:0 .75rem;background:#fff;border:.25rem solid #fbe6b5;border-radius:.75rem;font-size:0}.operation-box .operation-img .cropper-content{border-radius:.5rem;position:relative;width:9.5rem;height:9.5rem;margin-left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);overflow:hidden}.operation-box .operation-img .cropper-content .vue-cropper{background:#d8d8d8}.operation-btns{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin-top:.75rem}.operation-btns .o-btn{background-size:100% 100%}.operation-btns .o-btn1{width:11.6rem;height:3.325rem;background-image:url(../img/btn1.png)}.operation-btns .o-btn2{position:relative;width:11.6rem;height:3.75rem;background-image:url(../img/save-btn.png)}.operation-btns .o-btn3{width:11.625rem;height:3.75rem;background-image:url(../img/btn3.png)}.operation-tips{text-align:center}.operation-tips p{background-image:radial-gradient(circle at 7% 0,#fff,#feff74);font-size:14px;font-weight:400;font-style:normal;font-stretch:normal;line-height:normal;letter-spacing:1.7px;text-align:center;-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}.operation-logo{text-align:center}.operation-logo img{height:1rem}.operation-done{text-align:center}.operation-done .act-done-text{margin:1.25rem 0 2rem;height:.75rem}.operation-done .act-done-happy{margin-bottom:2.5rem;height:5.15rem}@media screen and (min-height:600px){.operation-box{margin-top:1rem;margin-bottom:1rem}}@media screen and (min-height:700px){.operation-box{margin-top:1.5rem;margin-bottom:1.5rem}.operation-btns{margin-bottom:.5rem}.operation-header .h-logo{margin-top:.75rem}.operation-header .h-title{margin-top:1rem}}.cropper-drag-box{position:relative;z-index:9999999}.frame-image{position:absolute;right:0;bottom:0;z-index:999;width:100%;height:100%}.van-popup{background-color:hsla(0,0%,100%,0)}.long-press{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:12.975rem;height:16.25rem;background-image:url(../img/20190829-longpress.svg);background-size:cover}.long-press .l-img{width:100%;height:13.375rem}.long-press .l-img img{width:10.7rem;height:10.7rem}.long-press .l-tips{-webkit-box-flex:1;-ms-flex:1;flex:1;font-size:1rem;font-weight:700}.first-tips{position:relative;margin-top:18.25rem;margin-left:50%;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0);width:4.575rem;height:6.975rem}.first-tips .center-bg{position:absolute;left:0;top:0;width:4.575rem;height:6.975rem;background-size:contain}.first-tips .top-arrow{right:0;top:0}.first-tips .bottom-arrow,.first-tips .top-arrow{position:absolute;width:.825rem;height:px22rem(41)}.first-tips .bottom-arrow{left:0;bottom:0}.first-text{color:#fff;font-size:20px;text-align:center}.cropper-box-canvas{width:132px;height:132px;-webkit-transform:scale(1.43939) translate3d(20.1474px,20.1474px,0) rotate(0deg);transform:scale(1.43939) translate3d(20.1474px,20.1474px,0) rotate(0deg)}.cropper-box-canvas img{width:100%}.fade-enter-active,.fade-leave-active{-webkit-transition:opacity .5s;transition:opacity .5s}.fade-enter,.fade-leave-to{opacity:0} \ No newline at end of file diff --git a/public/tool/gq_avatar/static/img/20190829-bg.png b/public/tool/gq_avatar/static/img/20190829-bg.png new file mode 100644 index 0000000..a5d86bb Binary files /dev/null and b/public/tool/gq_avatar/static/img/20190829-bg.png differ diff --git a/public/tool/gq_avatar/static/img/20190829-btn.png b/public/tool/gq_avatar/static/img/20190829-btn.png new file mode 100644 index 0000000..b7dd716 Binary files /dev/null and b/public/tool/gq_avatar/static/img/20190829-btn.png differ diff --git a/public/tool/gq_avatar/static/img/20190829-longpress.svg b/public/tool/gq_avatar/static/img/20190829-longpress.svg new file mode 100644 index 0000000..775dd3a --- /dev/null +++ b/public/tool/gq_avatar/static/img/20190829-longpress.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/public/tool/gq_avatar/static/img/20190906-logo2.png b/public/tool/gq_avatar/static/img/20190906-logo2.png new file mode 100644 index 0000000..018327e Binary files /dev/null and b/public/tool/gq_avatar/static/img/20190906-logo2.png differ diff --git a/public/tool/gq_avatar/static/img/20190906-logo3.png b/public/tool/gq_avatar/static/img/20190906-logo3.png new file mode 100644 index 0000000..d900f23 Binary files /dev/null and b/public/tool/gq_avatar/static/img/20190906-logo3.png differ diff --git a/public/tool/gq_avatar/static/img/btn1.png b/public/tool/gq_avatar/static/img/btn1.png new file mode 100644 index 0000000..08e3f9d Binary files /dev/null and b/public/tool/gq_avatar/static/img/btn1.png differ diff --git a/public/tool/gq_avatar/static/img/btn3.png b/public/tool/gq_avatar/static/img/btn3.png new file mode 100644 index 0000000..ec06c94 Binary files /dev/null and b/public/tool/gq_avatar/static/img/btn3.png differ diff --git a/public/tool/gq_avatar/static/img/hat1.png b/public/tool/gq_avatar/static/img/hat1.png new file mode 100644 index 0000000..f9d34bd Binary files /dev/null and b/public/tool/gq_avatar/static/img/hat1.png differ diff --git a/public/tool/gq_avatar/static/img/hat10.png b/public/tool/gq_avatar/static/img/hat10.png new file mode 100644 index 0000000..5efc681 Binary files /dev/null and b/public/tool/gq_avatar/static/img/hat10.png differ diff --git a/public/tool/gq_avatar/static/img/hat11.png b/public/tool/gq_avatar/static/img/hat11.png new file mode 100644 index 0000000..28bed49 Binary files /dev/null and b/public/tool/gq_avatar/static/img/hat11.png differ diff --git a/public/tool/gq_avatar/static/img/hat12.png b/public/tool/gq_avatar/static/img/hat12.png new file mode 100644 index 0000000..275ae3a Binary files /dev/null and b/public/tool/gq_avatar/static/img/hat12.png differ diff --git a/public/tool/gq_avatar/static/img/hat13.png b/public/tool/gq_avatar/static/img/hat13.png new file mode 100644 index 0000000..969e69e Binary files /dev/null and b/public/tool/gq_avatar/static/img/hat13.png differ diff --git a/public/tool/gq_avatar/static/img/hat14.png b/public/tool/gq_avatar/static/img/hat14.png new file mode 100644 index 0000000..12f3200 Binary files /dev/null and b/public/tool/gq_avatar/static/img/hat14.png differ diff --git a/public/tool/gq_avatar/static/img/hat15.png b/public/tool/gq_avatar/static/img/hat15.png new file mode 100644 index 0000000..04bb511 Binary files /dev/null and b/public/tool/gq_avatar/static/img/hat15.png differ diff --git a/public/tool/gq_avatar/static/img/hat16.png b/public/tool/gq_avatar/static/img/hat16.png new file mode 100644 index 0000000..a91074b Binary files /dev/null and b/public/tool/gq_avatar/static/img/hat16.png differ diff --git a/public/tool/gq_avatar/static/img/hat17.png b/public/tool/gq_avatar/static/img/hat17.png new file mode 100644 index 0000000..8ae773b Binary files /dev/null and b/public/tool/gq_avatar/static/img/hat17.png differ diff --git a/public/tool/gq_avatar/static/img/hat18.png b/public/tool/gq_avatar/static/img/hat18.png new file mode 100644 index 0000000..36868b3 Binary files /dev/null and b/public/tool/gq_avatar/static/img/hat18.png differ diff --git a/public/tool/gq_avatar/static/img/hat19.png b/public/tool/gq_avatar/static/img/hat19.png new file mode 100644 index 0000000..a6f4411 Binary files /dev/null and b/public/tool/gq_avatar/static/img/hat19.png differ diff --git a/public/tool/gq_avatar/static/img/hat2.png b/public/tool/gq_avatar/static/img/hat2.png new file mode 100644 index 0000000..af51ee9 Binary files /dev/null and b/public/tool/gq_avatar/static/img/hat2.png differ diff --git a/public/tool/gq_avatar/static/img/hat20.png b/public/tool/gq_avatar/static/img/hat20.png new file mode 100644 index 0000000..af5a00a Binary files /dev/null and b/public/tool/gq_avatar/static/img/hat20.png differ diff --git a/public/tool/gq_avatar/static/img/hat21.png b/public/tool/gq_avatar/static/img/hat21.png new file mode 100644 index 0000000..57990a2 Binary files /dev/null and b/public/tool/gq_avatar/static/img/hat21.png differ diff --git a/public/tool/gq_avatar/static/img/hat22.png b/public/tool/gq_avatar/static/img/hat22.png new file mode 100644 index 0000000..2b2428a Binary files /dev/null and b/public/tool/gq_avatar/static/img/hat22.png differ diff --git a/public/tool/gq_avatar/static/img/hat23.png b/public/tool/gq_avatar/static/img/hat23.png new file mode 100644 index 0000000..a0f0dff Binary files /dev/null and b/public/tool/gq_avatar/static/img/hat23.png differ diff --git a/public/tool/gq_avatar/static/img/hat24.png b/public/tool/gq_avatar/static/img/hat24.png new file mode 100644 index 0000000..e0173c3 Binary files /dev/null and b/public/tool/gq_avatar/static/img/hat24.png differ diff --git a/public/tool/gq_avatar/static/img/hat25.png b/public/tool/gq_avatar/static/img/hat25.png new file mode 100644 index 0000000..720ee63 Binary files /dev/null and b/public/tool/gq_avatar/static/img/hat25.png differ diff --git a/public/tool/gq_avatar/static/img/hat3.png b/public/tool/gq_avatar/static/img/hat3.png new file mode 100644 index 0000000..67605fd Binary files /dev/null and b/public/tool/gq_avatar/static/img/hat3.png differ diff --git a/public/tool/gq_avatar/static/img/hat4.png b/public/tool/gq_avatar/static/img/hat4.png new file mode 100644 index 0000000..61265f5 Binary files /dev/null and b/public/tool/gq_avatar/static/img/hat4.png differ diff --git a/public/tool/gq_avatar/static/img/hat5.png b/public/tool/gq_avatar/static/img/hat5.png new file mode 100644 index 0000000..7c367d9 Binary files /dev/null and b/public/tool/gq_avatar/static/img/hat5.png differ diff --git a/public/tool/gq_avatar/static/img/hat6.png b/public/tool/gq_avatar/static/img/hat6.png new file mode 100644 index 0000000..93a4b9a Binary files /dev/null and b/public/tool/gq_avatar/static/img/hat6.png differ diff --git a/public/tool/gq_avatar/static/img/hat7.png b/public/tool/gq_avatar/static/img/hat7.png new file mode 100644 index 0000000..8d103ea Binary files /dev/null and b/public/tool/gq_avatar/static/img/hat7.png differ diff --git a/public/tool/gq_avatar/static/img/hat8.png b/public/tool/gq_avatar/static/img/hat8.png new file mode 100644 index 0000000..7a280b5 Binary files /dev/null and b/public/tool/gq_avatar/static/img/hat8.png differ diff --git a/public/tool/gq_avatar/static/img/hat9.png b/public/tool/gq_avatar/static/img/hat9.png new file mode 100644 index 0000000..1bacb29 Binary files /dev/null and b/public/tool/gq_avatar/static/img/hat9.png differ diff --git a/public/tool/gq_avatar/static/img/logo.png b/public/tool/gq_avatar/static/img/logo.png new file mode 100644 index 0000000..13131e3 Binary files /dev/null and b/public/tool/gq_avatar/static/img/logo.png differ diff --git a/public/tool/gq_avatar/static/img/save-btn.png b/public/tool/gq_avatar/static/img/save-btn.png new file mode 100644 index 0000000..2d4e7cb Binary files /dev/null and b/public/tool/gq_avatar/static/img/save-btn.png differ diff --git a/public/tool/gq_avatar/static/js/fabric.min.js b/public/tool/gq_avatar/static/js/fabric.min.js new file mode 100644 index 0000000..e121dce --- /dev/null +++ b/public/tool/gq_avatar/static/js/fabric.min.js @@ -0,0 +1 @@ +function resizeCanvasIfNeeded(t){var e=t.targetCanvas,i=e.width,r=e.height,n=t.destinationWidth,s=t.destinationHeight;i===n&&r===s||(e.width=n,e.height=s)}function copyGLTo2DDrawImage(t,e){var i=t.canvas,r=e.targetCanvas,n=r.getContext("2d");n.translate(0,r.height),n.scale(1,-1);var s=i.height-r.height;n.drawImage(i,0,s,r.width,r.height,0,0,r.width,r.height)}function copyGLTo2DPutImageData(t,e){var i=e.targetCanvas.getContext("2d"),r=e.destinationWidth,n=e.destinationHeight,s=r*n*4,o=new Uint8Array(this.imageBuffer,0,s),a=new Uint8ClampedArray(this.imageBuffer,0,s);t.readPixels(0,0,r,n,t.RGBA,t.UNSIGNED_BYTE,o);var h=new ImageData(a,r,n);i.putImageData(h,0,0)}var fabric=fabric||{version:"2.0.0-rc.3"};"undefined"!=typeof exports&&(exports.fabric=fabric),"undefined"!=typeof document&&"undefined"!=typeof window?(fabric.document=document,fabric.window=window):(fabric.document=require("jsdom").jsdom(decodeURIComponent("%3C!DOCTYPE%20html%3E%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody%3E%3C%2Fbody%3E%3C%2Fhtml%3E"),{features:{FetchExternalResources:["img"]}}),fabric.jsdomImplForWrapper=require("jsdom/lib/jsdom/living/generated/utils").implForWrapper,fabric.window=fabric.document.defaultView,DOMParser=require("xmldom").DOMParser),fabric.isTouchSupported="ontouchstart"in fabric.window,fabric.isLikelyNode="undefined"!=typeof Buffer&&"undefined"==typeof window,fabric.SHARED_ATTRIBUTES=["display","transform","fill","fill-opacity","fill-rule","opacity","stroke","stroke-dasharray","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","id","paint-order","instantiated_by_use"],fabric.DPI=96,fabric.reNum="(?:[-+]?(?:\\d+|\\d*\\.\\d+)(?:e[-+]?\\d+)?)",fabric.fontPaths={},fabric.iMatrix=[1,0,0,1,0,0],fabric.canvasModule="canvas",fabric.perfLimitSizeTotal=2097152,fabric.maxCacheSideLimit=4096,fabric.minCacheSideLimit=256,fabric.charWidthsCache={},fabric.textureSize=2048,fabric.enableGLFiltering=!0,fabric.devicePixelRatio=fabric.window.devicePixelRatio||fabric.window.webkitDevicePixelRatio||fabric.window.mozDevicePixelRatio||1,fabric.browserShadowBlurConstant=1,fabric.initFilterBackend=function(){return fabric.enableGLFiltering&&fabric.isWebglSupported&&fabric.isWebglSupported(fabric.textureSize)?(console.log("max texture size: "+fabric.maxTextureSize),new fabric.WebglFilterBackend({tileSize:fabric.textureSize})):fabric.Canvas2dFilterBackend?new fabric.Canvas2dFilterBackend:void 0},"undefined"!=typeof document&&"undefined"!=typeof window&&(window.fabric=fabric),function(){function t(t,e){if(this.__eventListeners[t]){var i=this.__eventListeners[t];e?i[i.indexOf(e)]=!1:fabric.util.array.fill(i,!1)}}function e(t,e){if(this.__eventListeners||(this.__eventListeners={}),1===arguments.length)for(var i in t)this.on(i,t[i]);else this.__eventListeners[t]||(this.__eventListeners[t]=[]),this.__eventListeners[t].push(e);return this}function i(e,i){if(this.__eventListeners){if(0===arguments.length)for(e in this.__eventListeners)t.call(this,e);else if(1===arguments.length&&"object"==typeof arguments[0])for(var r in e)t.call(this,r,e[r]);else t.call(this,e,i);return this}}function r(t,e){if(this.__eventListeners){var i=this.__eventListeners[t];if(i){for(var r=0,n=i.length;r-1},complexity:function(){return this.getObjects().reduce(function(t,e){return t+=e.complexity?e.complexity():0},0)}},fabric.CommonMethods={_setOptions:function(t){for(var e in t)this.set(e,t[e])},_initGradient:function(t,e){!t||!t.colorStops||t instanceof fabric.Gradient||this.set(e,new fabric.Gradient(t))},_initPattern:function(t,e,i){!t||!t.source||t instanceof fabric.Pattern?i&&i():this.set(e,new fabric.Pattern(t,i))},_initClipping:function(t){if(t.clipTo&&"string"==typeof t.clipTo){var e=fabric.util.getFunctionBody(t.clipTo);void 0!==e&&(this.clipTo=new Function("ctx",e))}},_setObject:function(t){for(var e in t)this._set(e,t[e])},set:function(t,e){return"object"==typeof t?this._setObject(t):"function"==typeof e&&"clipTo"!==t?this._set(t,e(this.get(t))):this._set(t,e),this},_set:function(t,e){this[t]=e},toggle:function(t){var e=this.get(t);return"boolean"==typeof e&&this.set(t,!e),this},get:function(t){return this[t]}},function(t){var e=Math.sqrt,i=Math.atan2,r=Math.pow,n=Math.abs,s=Math.PI/180;fabric.util={removeFromArray:function(t,e){var i=t.indexOf(e);return-1!==i&&t.splice(i,1),t},getRandomInt:function(t,e){return Math.floor(Math.random()*(e-t+1))+t},degreesToRadians:function(t){return t*s},radiansToDegrees:function(t){return t/s},rotatePoint:function(t,e,i){t.subtractEquals(e);var r=fabric.util.rotateVector(t,i);return new fabric.Point(r.x,r.y).addEquals(e)},rotateVector:function(t,e){var i=Math.sin(e),r=Math.cos(e);return{x:t.x*r-t.y*i,y:t.x*i+t.y*r}},transformPoint:function(t,e,i){return i?new fabric.Point(e[0]*t.x+e[2]*t.y,e[1]*t.x+e[3]*t.y):new fabric.Point(e[0]*t.x+e[2]*t.y+e[4],e[1]*t.x+e[3]*t.y+e[5])},makeBoundingBoxFromPoints:function(t){var e=[t[0].x,t[1].x,t[2].x,t[3].x],i=fabric.util.array.min(e),r=fabric.util.array.max(e)-i,n=[t[0].y,t[1].y,t[2].y,t[3].y],s=fabric.util.array.min(n);return{left:i,top:s,width:r,height:fabric.util.array.max(n)-s}},invertTransform:function(t){var e=1/(t[0]*t[3]-t[1]*t[2]),i=[e*t[3],-e*t[1],-e*t[2],e*t[0]],r=fabric.util.transformPoint({x:t[4],y:t[5]},i,!0);return i[4]=-r.x,i[5]=-r.y,i},toFixed:function(t,e){return parseFloat(Number(t).toFixed(e))},parseUnit:function(t,e){var i=/\D{0,2}$/.exec(t),r=parseFloat(t);switch(e||(e=fabric.Text.DEFAULT_SVG_FONT_SIZE),i[0]){case"mm":return r*fabric.DPI/25.4;case"cm":return r*fabric.DPI/2.54;case"in":return r*fabric.DPI;case"pt":return r*fabric.DPI/72;case"pc":return r*fabric.DPI/72*12;case"em":return r*e;default:return r}},falseFunction:function(){return!1},getKlass:function(t,e){return t=fabric.util.string.camelize(t.charAt(0).toUpperCase()+t.slice(1)),fabric.util.resolveNamespace(e)[t]},getSvgAttributes:function(t){var e=["instantiated_by_use","style","id","class"];switch(t){case"linearGradient":e=e.concat(["x1","y1","x2","y2","gradientUnits","gradientTransform"]);break;case"radialGradient":e=e.concat(["gradientUnits","gradientTransform","cx","cy","r","fx","fy","fr"]);break;case"stop":e=e.concat(["offset","stop-color","stop-opacity"])}return e},resolveNamespace:function(e){if(!e)return fabric;var i,r=e.split("."),n=r.length,s=t||fabric.window;for(i=0;ir;)(r+=a[d++%f])>l&&(r=l),t[g?"lineTo":"moveTo"](r,0),g=!g;t.restore()},createCanvasElement:function(){return fabric.document.createElement("canvas")},createImage:function(){return fabric.document.createElement("img")},clipContext:function(t,e){e.save(),e.beginPath(),t.clipTo(e),e.clip()},multiplyTransformMatrices:function(t,e,i){return[t[0]*e[0]+t[2]*e[1],t[1]*e[0]+t[3]*e[1],t[0]*e[2]+t[2]*e[3],t[1]*e[2]+t[3]*e[3],i?0:t[0]*e[4]+t[2]*e[5]+t[4],i?0:t[1]*e[4]+t[3]*e[5]+t[5]]},qrDecompose:function(t){var n=i(t[1],t[0]),o=r(t[0],2)+r(t[1],2),a=e(o),h=(t[0]*t[3]-t[2]*t[1])/a,c=i(t[0]*t[2]+t[1]*t[3],o);return{angle:n/s,scaleX:a,scaleY:h,skewX:c/s,skewY:0,translateX:t[4],translateY:t[5]}},customTransformMatrix:function(t,e,i){var r=[1,0,n(Math.tan(i*s)),1],o=[n(t),0,0,n(e)];return fabric.util.multiplyTransformMatrices(o,r,!0)},resetObjectTransform:function(t){t.scaleX=1,t.scaleY=1,t.skewX=0,t.skewY=0,t.flipX=!1,t.flipY=!1,t.rotate(0)},getFunctionBody:function(t){return(String(t).match(/function[^{]*\{([\s\S]*)\}/)||{})[1]},isTransparent:function(t,e,i,r){r>0&&(e>r?e-=r:e=0,i>r?i-=r:i=0);var n,s,o=!0,a=t.getImageData(e,i,2*r||1,2*r||1),h=a.data.length;for(n=3;n0?P-=2*f:1===c&&P<0&&(P+=2*f);for(var M=Math.ceil(Math.abs(P/f*2)),F=[],I=P/M,L=8/3*Math.sin(I/4)*Math.sin(I/4)/Math.sin(I/2),R=A+I,B=0;B=n?s-n:2*Math.PI-(n-s)}function r(t,e,i,r,n,s,h,c){var l=a.call(arguments);if(o[l])return o[l];var u,f,d,g,p,v,m,b,_=Math.sqrt,y=Math.min,x=Math.max,C=Math.abs,S=[],w=[[],[]];f=6*t-12*i+6*n,u=-3*t+9*i-9*n+3*h,d=3*i-3*t;for(var T=0;T<2;++T)if(T>0&&(f=6*e-12*r+6*s,u=-3*e+9*r-9*s+3*c,d=3*r-3*e),C(u)<1e-12){if(C(f)<1e-12)continue;0<(g=-d/f)&&g<1&&S.push(g)}else(m=f*f-4*d*u)<0||(0<(p=(-f+(b=_(m)))/(2*u))&&p<1&&S.push(p),0<(v=(-f-b)/(2*u))&&v<1&&S.push(v));for(var O,k,D,j=S.length,E=j;j--;)O=(D=1-(g=S[j]))*D*D*t+3*D*D*g*i+3*D*g*g*n+g*g*g*h,w[0][j]=O,k=D*D*D*e+3*D*D*g*r+3*D*g*g*s+g*g*g*c,w[1][j]=k;w[0][E]=t,w[1][E]=e,w[0][E+1]=h,w[1][E+1]=c;var A=[{x:y.apply(null,w[0]),y:y.apply(null,w[1])},{x:x.apply(null,w[0]),y:x.apply(null,w[1])}];return o[l]=A,A}var n={},s={},o={},a=Array.prototype.join;fabric.util.drawArc=function(e,i,r,n){for(var s=n[0],o=n[1],a=n[2],h=n[3],c=n[4],l=[[],[],[],[]],u=t(n[5]-i,n[6]-r,s,o,h,c,a),f=0,d=u.length;f=e})}}}(),function(){function t(e,i,r){if(r)if(!fabric.isLikelyNode&&i instanceof Element)e=i;else if(i instanceof Array){e=[];for(var n=0,s=i.length;n57343)return t.charAt(e);if(55296<=i&&i<=56319){if(t.length<=e+1)throw"High surrogate without following low surrogate";var r=t.charCodeAt(e+1);if(56320>r||r>57343)throw"High surrogate without following low surrogate";return t.charAt(e)+t.charAt(e+1)}if(0===e)throw"Low surrogate without preceding high surrogate";var n=t.charCodeAt(e-1);if(55296>n||n>56319)throw"Low surrogate without preceding high surrogate";return!1}fabric.util.string={camelize:function(t){return t.replace(/-+(.)?/g,function(t,e){return e?e.toUpperCase():""})},capitalize:function(t,e){return t.charAt(0).toUpperCase()+(e?t.slice(1):t.slice(1).toLowerCase())},escapeXml:function(t){return t.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">")},graphemeSplit:function(e){var i,r=0,n=[];for(r=0,i;r1?e.apply(this,i.call(arguments,1)):e.call(this):console.log("tried to callSuper "+t+", method not found in prototype chain",this)}var i=Array.prototype.slice,r=function(){},n=function(){for(var t in{toString:1})if("toString"===t)return!1;return!0}(),s=function(t,e,i){for(var r in e)r in t.prototype&&"function"==typeof t.prototype[r]&&(e[r]+"").indexOf("callSuper")>-1?t.prototype[r]=function(t){return function(){var r=this.constructor.superclass;this.constructor.superclass=i;var n=e[t].apply(this,arguments);if(this.constructor.superclass=r,"initialize"!==t)return n}}(r):t.prototype[r]=e[r],n&&(e.toString!==Object.prototype.toString&&(t.prototype.toString=e.toString),e.valueOf!==Object.prototype.valueOf&&(t.prototype.valueOf=e.valueOf))};fabric.util.createClass=function(){function n(){this.initialize.apply(this,arguments)}var o=null,a=i.call(arguments,0);"function"==typeof a[0]&&(o=a.shift()),n.superclass=o,n.subclasses=[],o&&(t.prototype=o.prototype,n.prototype=new t,o.subclasses.push(n));for(var h=0,c=a.length;h=.9999?"":"alpha(opacity="+100*e+")",i.filter=i.filter.replace(r,e)):i.filter+=" alpha(opacity="+100*e+")",t}),fabric.util.setStyle=function(t,e){var i=t.style;if(!i)return t;if("string"==typeof e)return t.style.cssText+=";"+e,e.indexOf("opacity")>-1?n(t,e.match(/opacity:\s*(\d?\.?\d*)/)[1]):t;for(var r in e)"opacity"===r?n(t,e[r]):i["float"===r||"cssFloat"===r?void 0===i.styleFloat?"cssFloat":"styleFloat":r]=e[r];return t}}(),function(){function t(t,e){var i=fabric.document.createElement(t);for(var r in e)"class"===r?i.className=e[r]:"for"===r?i.htmlFor=e[r]:i.setAttribute(r,e[r]);return i}function e(t){for(var e=0,i=0,r=fabric.document.documentElement,n=fabric.document.body||{scrollLeft:0,scrollTop:0};t&&(t.parentNode||t.host)&&((t=t.parentNode||t.host)===fabric.document?(e=n.scrollLeft||r.scrollLeft||0,i=n.scrollTop||r.scrollTop||0):(e+=t.scrollLeft||0,i+=t.scrollTop||0),1!==t.nodeType||"fixed"!==fabric.util.getElementStyle(t,"position")););return{left:e,top:i}}var i,r=Array.prototype.slice,n=function(t){return r.call(t,0)};try{i=n(fabric.document.childNodes)instanceof Array}catch(t){}i||(n=function(t){for(var e=new Array(t.length),i=t.length;i--;)e[i]=t[i];return e});var s;s=fabric.document.defaultView&&fabric.document.defaultView.getComputedStyle?function(t,e){var i=fabric.document.defaultView.getComputedStyle(t,null);return i?i[e]:void 0}:function(t,e){var i=t.style[e];return!i&&t.currentStyle&&(i=t.currentStyle[e]),i},function(){var t=fabric.document.documentElement.style,e="userSelect"in t?"userSelect":"MozUserSelect"in t?"MozUserSelect":"WebkitUserSelect"in t?"WebkitUserSelect":"KhtmlUserSelect"in t?"KhtmlUserSelect":"";fabric.util.makeElementUnselectable=function(t){return void 0!==t.onselectstart&&(t.onselectstart=fabric.util.falseFunction),e?t.style[e]="none":"string"==typeof t.unselectable&&(t.unselectable="on"),t},fabric.util.makeElementSelectable=function(t){return void 0!==t.onselectstart&&(t.onselectstart=null),e?t.style[e]="":"string"==typeof t.unselectable&&(t.unselectable=""),t}}(),function(){fabric.util.getScript=function(t,e){var i=fabric.document.getElementsByTagName("head")[0],r=fabric.document.createElement("script"),n=!0;r.onload=r.onreadystatechange=function(t){if(n){if("string"==typeof this.readyState&&"loaded"!==this.readyState&&"complete"!==this.readyState)return;n=!1,e(t||fabric.window.event),r=r.onload=r.onreadystatechange=null}},r.src=t,i.appendChild(r)}}(),fabric.util.getById=function(t){return"string"==typeof t?fabric.document.getElementById(t):t},fabric.util.toArray=n,fabric.util.makeElement=t,fabric.util.addClass=function(t,e){t&&-1===(" "+t.className+" ").indexOf(" "+e+" ")&&(t.className+=(t.className?" ":"")+e)},fabric.util.wrapElement=function(e,i,r){return"string"==typeof i&&(i=t(i,r)),e.parentNode&&e.parentNode.replaceChild(i,e),i.appendChild(e),i},fabric.util.getScrollLeftTop=e,fabric.util.getElementOffset=function(t){var i,r,n=t&&t.ownerDocument,o={left:0,top:0},a={left:0,top:0},h={borderLeftWidth:"left",borderTopWidth:"top",paddingLeft:"left",paddingTop:"top"};if(!n)return a;for(var c in h)a[h[c]]+=parseInt(s(t,c),10)||0;return i=n.documentElement,void 0!==t.getBoundingClientRect&&(o=t.getBoundingClientRect()),r=e(t),{left:o.left+r.left-(i.clientLeft||0)+a.left,top:o.top+r.top-(i.clientTop||0)+a.top}},fabric.util.getElementStyle=s}(),function(){function t(t,e){return t+(/\?/.test(t)?"&":"?")+e}function e(){}var i=function(){for(var t=[function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP.3.0")},function(){return new XMLHttpRequest}],e=t.length;e--;)try{if(t[e]())return t[e]}catch(t){}}();fabric.util.request=function(r,n){n||(n={});var s=n.method?n.method.toUpperCase():"GET",o=n.onComplete||function(){},a=i(),h=n.body||n.parameters;return a.onreadystatechange=function(){4===a.readyState&&(o(a),a.onreadystatechange=e)},"GET"===s&&(h=null,"string"==typeof n.parameters&&(r=t(r,n.parameters))),a.open(s,r,!0),"POST"!==s&&"PUT"!==s||a.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),a.send(h),a}}(),fabric.log=function(){},fabric.warn=function(){},"undefined"!=typeof console&&["log","warn"].forEach(function(t){void 0!==console[t]&&"function"==typeof console[t].apply&&(fabric[t]=function(){return console[t].apply(console,arguments)})}),function(){function t(){return!1}function e(){return i.apply(fabric.window,arguments)}var i=fabric.window.requestAnimationFrame||fabric.window.webkitRequestAnimationFrame||fabric.window.mozRequestAnimationFrame||fabric.window.oRequestAnimationFrame||fabric.window.msRequestAnimationFrame||function(t){return fabric.window.setTimeout(t,1e3/60)},r=fabric.window.cancelAnimationFrame||fabric.window.clearTimeout;fabric.util.animate=function(i){e(function(r){i||(i={});var n,s=r||+new Date,o=i.duration||500,a=s+o,h=i.onChange||t,c=i.abort||t,l=i.onComplete||t,u=i.easing||function(t,e,i,r){return-i*Math.cos(t/r*(Math.PI/2))+i+e},f="startValue"in i?i.startValue:0,d="endValue"in i?i.endValue:100,g=i.byValue||d-f;i.onStart&&i.onStart(),function t(r){if(c())l(d,1,1);else{var p=(n=r||+new Date)>a?o:n-s,v=p/o,m=u(p,f,g,o),b=Math.abs((m-f)/g);h(m,b,v),n>a?i.onComplete&&i.onComplete():e(t)}}(s)})},fabric.util.requestAnimFrame=e,fabric.util.cancelAnimFrame=function(){return r.apply(fabric.window,arguments)}}(),function(){function t(t,e,i){var r="rgba("+parseInt(t[0]+i*(e[0]-t[0]),10)+","+parseInt(t[1]+i*(e[1]-t[1]),10)+","+parseInt(t[2]+i*(e[2]-t[2]),10);return r+=","+(t&&e?parseFloat(t[3]+i*(e[3]-t[3])):1),r+=")"}fabric.util.animateColor=function(e,i,r,n){var s=new fabric.Color(e).getSource(),o=new fabric.Color(i).getSource();n=n||{},fabric.util.animate(fabric.util.object.extend(n,{duration:r||500,startValue:s,endValue:o,byValue:o,easing:function(e,i,r,s){return t(i,r,n.colorEasing?n.colorEasing(e,s):1-Math.cos(e/s*(Math.PI/2)))}}))}}(),function(){function t(t,e,i,r){return t-1&&a>-1&&a-1&&(e="stroke")}else n=s?e.map(y):y(e,r);else e="";return!s&&isNaN(n)?e:n}function r(t){return new RegExp("^("+t.join("|")+")\\b","i")}function n(t){for(var e in k)if(void 0!==t[k[e]]&&""!==t[e]){if(void 0===t[e]){if(!v.Object.prototype[e])continue;t[e]=v.Object.prototype[e]}if(0!==t[e].indexOf("url(")){var i=new v.Color(t[e]);t[e]=i.setAlpha(_(i.getAlpha()*t[k[e]],2)).toRgba()}}return t}function s(t,e){var i,r,n,s,o=[];for(n=0,s=e.length;na?a:o),1===o&&1===a&&0===h&&0===c&&0===f&&0===d)return _;if((f||d)&&(x=" translate("+y(f)+" "+y(d)+") "),r=x+" matrix("+o+" 0 0 "+a+" "+h*o+" "+c*a+") ","svg"===t.nodeName){for(n=t.ownerDocument.createElement("g");t.firstChild;)n.appendChild(t.firstChild);t.appendChild(n)}else r=(n=t).getAttribute("transform")+r;return n.setAttribute("transform",r),_}function p(t,e){for(;t&&(t=t.parentNode);)if(t.nodeName&&e.test(t.nodeName.replace("svg:",""))&&!t.getAttribute("instantiated_by_use"))return!0;return!1}var v=t.fabric||(t.fabric={}),m=v.util.object.extend,b=v.util.object.clone,_=v.util.toFixed,y=v.util.parseUnit,x=v.util.multiplyTransformMatrices,C=["path","circle","polygon","polyline","ellipse","rect","line","image","text","linearGradient","radialGradient","stop"],S=["symbol","image","marker","pattern","view","svg"],w=["pattern","defs","symbol","metadata","clipPath","mask","desc"],T=["symbol","g","a","svg"],O={cx:"left",x:"left",r:"radius",cy:"top",y:"top",display:"visible",visibility:"visible",transform:"transformMatrix","fill-opacity":"fillOpacity","fill-rule":"fillRule","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight","paint-order":"paintFirst","stroke-dasharray":"strokeDashArray","stroke-linecap":"strokeLineCap","stroke-linejoin":"strokeLineJoin","stroke-miterlimit":"strokeMiterLimit","stroke-opacity":"strokeOpacity","stroke-width":"strokeWidth","text-decoration":"textDecoration","text-anchor":"textAnchor",opacity:"opacity"},k={stroke:"strokeOpacity",fill:"fillOpacity"};v.svgValidTagNamesRegEx=r(C),v.svgViewBoxElementsRegEx=r(S),v.svgInvalidAncestorsRegEx=r(w),v.svgValidParentsRegEx=r(T),v.cssRules={},v.gradientDefs={},v.parseTransformAttribute=function(){function t(t,e){var i=Math.cos(e[0]),r=Math.sin(e[0]),n=0,s=0;3===e.length&&(n=e[1],s=e[2]),t[0]=i,t[1]=r,t[2]=-r,t[3]=i,t[4]=n-(i*n-r*s),t[5]=s-(r*n+i*s)}function e(t,e){var i=e[0],r=2===e.length?e[1]:e[0];t[0]=i,t[3]=r}function i(t,e,i){t[i]=Math.tan(v.util.degreesToRadians(e[0]))}function r(t,e){t[4]=e[0],2===e.length&&(t[5]=e[1])}var n=[1,0,0,1,0,0],s=v.reNum,o="(?:\\s+,?\\s*|,\\s*)",a="(?:"+("(?:(matrix)\\s*\\(\\s*("+s+")"+o+"("+s+")"+o+"("+s+")"+o+"("+s+")"+o+"("+s+")"+o+"("+s+")\\s*\\))")+"|"+("(?:(translate)\\s*\\(\\s*("+s+")(?:"+o+"("+s+"))?\\s*\\))")+"|"+("(?:(scale)\\s*\\(\\s*("+s+")(?:"+o+"("+s+"))?\\s*\\))")+"|"+("(?:(rotate)\\s*\\(\\s*("+s+")(?:"+o+"("+s+")"+o+"("+s+"))?\\s*\\))")+"|"+("(?:(skewX)\\s*\\(\\s*("+s+")\\s*\\))")+"|"+("(?:(skewY)\\s*\\(\\s*("+s+")\\s*\\))")+")",h="^\\s*(?:"+("(?:"+a+"(?:"+o+"*"+a+")*)")+"?)\\s*$",c=new RegExp(h),l=new RegExp(a,"g");return function(s){var o=n.concat(),h=[];if(!s||s&&!c.test(s))return o;s.replace(l,function(s){var c=new RegExp(a).exec(s).filter(function(t){return!!t}),l=c[1],u=c.slice(2).map(parseFloat);switch(l){case"translate":r(o,u);break;case"rotate":u[0]=v.util.degreesToRadians(u[0]),t(o,u);break;case"scale":e(o,u);break;case"skewX":i(o,u,2);break;case"skewY":i(o,u,1);break;case"matrix":o=u}h.push(o.concat()),o=n.concat()});for(var u=h[0];h.length>1;)h.shift(),u=v.util.multiplyTransformMatrices(u,h[0]);return u}}();var D=new RegExp("^\\s*("+v.reNum+"+)\\s*,?\\s*("+v.reNum+"+)\\s*,?\\s*("+v.reNum+"+)\\s*,?\\s*("+v.reNum+"+)\\s*$");v.parseSVGDocument=function(t,e,i,r){if(t){d(t);var n,s,o=v.Object.__uid++,a=g(t),h=v.util.toArray(t.getElementsByTagName("*"));if(a.crossOrigin=r&&r.crossOrigin,a.svgUid=o,0===h.length&&v.isLikelyNode){var c=[];for(n=0,s=(h=t.selectNodes('//*[name(.)!="svg"]')).length;n/i,""))),n&&n.documentElement||e&&e(null),v.parseSVGDocument(n.documentElement,function(t,i,r,n){e&&e(t,i,r,n)},i,r)}})},loadSVGFromString:function(t,e,i,r){t=t.trim();var n;if("undefined"!=typeof DOMParser){var s=new DOMParser;s&&s.parseFromString&&(n=s.parseFromString(t,"text/xml"))}else v.window.ActiveXObject&&((n=new ActiveXObject("Microsoft.XMLDOM")).async="false",n.loadXML(t.replace(//i,"")));v.parseSVGDocument(n.documentElement,function(t,i,r,n){e(t,i,r,n)},i,r)}})}("undefined"!=typeof exports?exports:this),fabric.ElementsParser=function(t,e,i,r,n){this.elements=t,this.callback=e,this.options=i,this.reviver=r,this.svgUid=i&&i.svgUid||0,this.parsingOptions=n},fabric.ElementsParser.prototype.parse=function(){this.instances=new Array(this.elements.length),this.numElements=this.elements.length,this.createObjects()},fabric.ElementsParser.prototype.createObjects=function(){for(var t=0,e=this.elements.length;tt.x&&this.y>t.y},gte:function(t){return this.x>=t.x&&this.y>=t.y},lerp:function(t,i){return void 0===i&&(i=.5),i=Math.max(Math.min(1,i),0),new e(this.x+(t.x-this.x)*i,this.y+(t.y-this.y)*i)},distanceFrom:function(t){var e=this.x-t.x,i=this.y-t.y;return Math.sqrt(e*e+i*i)},midPointFrom:function(t){return this.lerp(t)},min:function(t){return new e(Math.min(this.x,t.x),Math.min(this.y,t.y))},max:function(t){return new e(Math.max(this.x,t.x),Math.max(this.y,t.y))},toString:function(){return this.x+","+this.y},setXY:function(t,e){return this.x=t,this.y=e,this},setX:function(t){return this.x=t,this},setY:function(t){return this.y=t,this},setFromPoint:function(t){return this.x=t.x,this.y=t.y,this},swap:function(t){var e=this.x,i=this.y;this.x=t.x,this.y=t.y,t.x=e,t.y=i},clone:function(){return new e(this.x,this.y)}})}("undefined"!=typeof exports?exports:this),function(t){"use strict";function e(t){this.status=t,this.points=[]}var i=t.fabric||(t.fabric={});i.Intersection?i.warn("fabric.Intersection is already defined"):(i.Intersection=e,i.Intersection.prototype={constructor:e,appendPoint:function(t){return this.points.push(t),this},appendPoints:function(t){return this.points=this.points.concat(t),this}},i.Intersection.intersectLineLine=function(t,r,n,s){var o,a=(s.x-n.x)*(t.y-n.y)-(s.y-n.y)*(t.x-n.x),h=(r.x-t.x)*(t.y-n.y)-(r.y-t.y)*(t.x-n.x),c=(s.y-n.y)*(r.x-t.x)-(s.x-n.x)*(r.y-t.y);if(0!==c){var l=a/c,u=h/c;0<=l&&l<=1&&0<=u&&u<=1?(o=new e("Intersection")).appendPoint(new i.Point(t.x+l*(r.x-t.x),t.y+l*(r.y-t.y))):o=new e}else o=new e(0===a||0===h?"Coincident":"Parallel");return o},i.Intersection.intersectLinePolygon=function(t,i,r){var n,s,o,a,h=new e,c=r.length;for(a=0;a0&&(h.status="Intersection"),h},i.Intersection.intersectPolygonPolygon=function(t,i){var r,n=new e,s=t.length;for(r=0;r0&&(n.status="Intersection"),n},i.Intersection.intersectPolygonRectangle=function(t,r,n){var s=r.min(n),o=r.max(n),a=new i.Point(o.x,s.y),h=new i.Point(s.x,o.y),c=e.intersectLinePolygon(s,a,t),l=e.intersectLinePolygon(a,o,t),u=e.intersectLinePolygon(o,h,t),f=e.intersectLinePolygon(h,s,t),d=new e;return d.appendPoints(c.points),d.appendPoints(l.points),d.appendPoints(u.points),d.appendPoints(f.points),d.points.length>0&&(d.status="Intersection"),d})}("undefined"!=typeof exports?exports:this),function(t){"use strict";function e(t){t?this._tryParsingColor(t):this.setSource([0,0,0,1])}function i(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+(e-t)*(2/3-i)*6:t}var r=t.fabric||(t.fabric={});r.Color?r.warn("fabric.Color is already defined."):(r.Color=e,r.Color.prototype={_tryParsingColor:function(t){var i;t in e.colorNameMap&&(t=e.colorNameMap[t]),"transparent"===t&&(i=[255,255,255,0]),i||(i=e.sourceFromHex(t)),i||(i=e.sourceFromRgb(t)),i||(i=e.sourceFromHsl(t)),i||(i=[0,0,0,1]),i&&this.setSource(i)},_rgbToHsl:function(t,e,i){t/=255,e/=255,i/=255;var n,s,o,a=r.util.array.max([t,e,i]),h=r.util.array.min([t,e,i]);if(o=(a+h)/2,a===h)n=s=0;else{var c=a-h;switch(s=o>.5?c/(2-a-h):c/(a+h),a){case t:n=(e-i)/c+(e1?1:o,s){var a=s.split(/\s*;\s*/);for(""===a[a.length-1]&&a.pop(),n=a.length;n--;){var h=a[n].split(/\s*:\s*/),c=h[0].trim(),l=h[1].trim();"stop-color"===c?e=l:"stop-opacity"===c&&(r=l)}}return e||(e=t.getAttribute("stop-color")||"rgb(0,0,0)"),r||(r=t.getAttribute("stop-opacity")),e=new fabric.Color(e),i=e.getAlpha(),r=isNaN(parseFloat(r))?1:parseFloat(r),r*=i,{offset:o,color:e.toRgb(),opacity:r}}function e(t){return{x1:t.getAttribute("x1")||0,y1:t.getAttribute("y1")||0,x2:t.getAttribute("x2")||"100%",y2:t.getAttribute("y2")||0}}function i(t){return{x1:t.getAttribute("fx")||t.getAttribute("cx")||"50%",y1:t.getAttribute("fy")||t.getAttribute("cy")||"50%",r1:0,x2:t.getAttribute("cx")||"50%",y2:t.getAttribute("cy")||"50%",r2:t.getAttribute("r")||"50%"}}function r(t,e,i){var r,n=0,s=1,o="";for(var a in e)"Infinity"===e[a]?e[a]=1:"-Infinity"===e[a]&&(e[a]=0),r=parseFloat(e[a],10),s="string"==typeof e[a]&&/^\d+%$/.test(e[a])?.01:1,"x1"===a||"x2"===a||"r2"===a?(s*="objectBoundingBox"===i?t.width:1,n="objectBoundingBox"===i?t.left||0:0):"y1"!==a&&"y2"!==a||(s*="objectBoundingBox"===i?t.height:1,n="objectBoundingBox"===i?t.top||0:0),e[a]=r*s+n;if("ellipse"===t.type&&null!==e.r2&&"objectBoundingBox"===i&&t.rx!==t.ry){var h=t.ry/t.rx;o=" scale(1, "+h+")",e.y1&&(e.y1/=h),e.y2&&(e.y2/=h)}return o}var n=fabric.util.object.clone;fabric.Gradient=fabric.util.createClass({offsetX:0,offsetY:0,initialize:function(t){t||(t={});var e={};this.id=fabric.Object.__uid++,this.type=t.type||"linear",e={x1:t.coords.x1||0,y1:t.coords.y1||0,x2:t.coords.x2||0,y2:t.coords.y2||0},"radial"===this.type&&(e.r1=t.coords.r1||0,e.r2=t.coords.r2||0),this.coords=e,this.colorStops=t.colorStops.slice(),t.gradientTransform&&(this.gradientTransform=t.gradientTransform),this.offsetX=t.offsetX||this.offsetX,this.offsetY=t.offsetY||this.offsetY},addColorStop:function(t){for(var e in t){var i=new fabric.Color(t[e]);this.colorStops.push({offset:parseFloat(e),color:i.toRgb(),opacity:i.getAlpha()})}return this},toObject:function(t){var e={type:this.type,coords:this.coords,colorStops:this.colorStops,offsetX:this.offsetX,offsetY:this.offsetY,gradientTransform:this.gradientTransform?this.gradientTransform.concat():this.gradientTransform};return fabric.util.populateWithProperties(this,e,t),e},toSVG:function(t){var e,i,r,s,o=n(this.coords,!0),a=n(this.colorStops,!0),h=o.r1>o.r2,c=t.width/2,l=t.height/2;a.sort(function(t,e){return t.offset-e.offset}),"path"===t.type&&(c-=t.pathOffset.x,l-=t.pathOffset.y);for(var u in o)"x1"===u||"x2"===u?o[u]+=this.offsetX-c:"y1"!==u&&"y2"!==u||(o[u]+=this.offsetY-l);if(s='id="SVGID_'+this.id+'" gradientUnits="userSpaceOnUse"',this.gradientTransform&&(s+=' gradientTransform="matrix('+this.gradientTransform.join(" ")+')" '),"linear"===this.type?r=["\n']:"radial"===this.type&&(r=["\n']),"radial"===this.type){if(h)for((a=a.concat()).reverse(),e=0,i=a.length;e0){var d=f/Math.max(o.r1,o.r2);for(e=0,i=a.length;e\n')}return r.push("linear"===this.type?"\n":"\n"),r.join("")},toLive:function(t){var e,i,r,n=fabric.util.object.clone(this.coords);if(this.type){for("linear"===this.type?e=t.createLinearGradient(n.x1,n.y1,n.x2,n.y2):"radial"===this.type&&(e=t.createRadialGradient(n.x1,n.y1,n.r1,n.x2,n.y2,n.r2)),i=0,r=this.colorStops.length;i\n\n\n'},setOptions:function(t){for(var e in t)this[e]=t[e]},toLive:function(t){var e="function"==typeof this.source?this.source():this.source;if(!e)return"";if(void 0!==e.src){if(!e.complete)return"";if(0===e.naturalWidth||0===e.naturalHeight)return""}return t.createPattern(e,this.repeat)}})}(),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.toFixed;e.Shadow?e.warn("fabric.Shadow is already defined."):(e.Shadow=e.util.createClass({color:"rgb(0,0,0)",blur:0,offsetX:0,offsetY:0,affectStroke:!1,includeDefaultValues:!0,initialize:function(t){"string"==typeof t&&(t=this._parseShadow(t));for(var i in t)this[i]=t[i];this.id=e.Object.__uid++},_parseShadow:function(t){var i=t.trim(),r=e.Shadow.reOffsetsAndBlur.exec(i)||[];return{color:(i.replace(e.Shadow.reOffsetsAndBlur,"")||"rgb(0,0,0)").trim(),offsetX:parseInt(r[1],10)||0,offsetY:parseInt(r[2],10)||0,blur:parseInt(r[3],10)||0}},toString:function(){return[this.offsetX,this.offsetY,this.blur,this.color].join("px ")},toSVG:function(t){var r=40,n=40,s=e.Object.NUM_FRACTION_DIGITS,o=e.util.rotateVector({x:this.offsetX,y:this.offsetY},e.util.degreesToRadians(-t.angle));return t.width&&t.height&&(r=100*i((Math.abs(o.x)+this.blur)/t.width,s)+20,n=100*i((Math.abs(o.y)+this.blur)/t.height,s)+20),t.flipX&&(o.x*=-1),t.flipY&&(o.y*=-1),'\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\n\t\n\n'},toObject:function(){if(this.includeDefaultValues)return{color:this.color,blur:this.blur,offsetX:this.offsetX,offsetY:this.offsetY,affectStroke:this.affectStroke};var t={},i=e.Shadow.prototype;return["color","blur","offsetX","offsetY","affectStroke"].forEach(function(e){this[e]!==i[e]&&(t[e]=this[e])},this),t}}),e.Shadow.reOffsetsAndBlur=/(?:\s|^)(-?\d+(?:px)?(?:\s?|$))?(-?\d+(?:px)?(?:\s?|$))?(\d+(?:px)?)?(?:\s?|$)(?:$|\s)/)}("undefined"!=typeof exports?exports:this),function(){"use strict";if(fabric.StaticCanvas)fabric.warn("fabric.StaticCanvas is already defined.");else{var t=fabric.util.object.extend,e=fabric.util.getElementOffset,i=fabric.util.removeFromArray,r=fabric.util.toFixed,n=fabric.util.transformPoint,s=fabric.util.invertTransform,o=new Error("Could not initialize `canvas` element");fabric.StaticCanvas=fabric.util.createClass(fabric.CommonMethods,{initialize:function(t,e){e||(e={}),this.renderAndResetBound=this.renderAndReset.bind(this),this.requestRenderAllBound=this.requestRenderAll.bind(this),this._initStatic(t,e)},backgroundColor:"",backgroundImage:null,overlayColor:"",overlayImage:null,includeDefaultValues:!0,stateful:!1,renderOnAddRemove:!0,clipTo:null,controlsAboveOverlay:!1,allowTouchScrolling:!1,imageSmoothingEnabled:!0,viewportTransform:fabric.iMatrix.concat(),backgroundVpt:!0,overlayVpt:!0,onBeforeScaleRotate:function(){},enableRetinaScaling:!0,vptCoords:{},skipOffscreen:!0,_initStatic:function(t,e){var i=this.requestRenderAllBound;this._objects=[],this._createLowerCanvas(t),this._initOptions(e),this._setImageSmoothing(),this.interactive||this._initRetinaScaling(),e.overlayImage&&this.setOverlayImage(e.overlayImage,i),e.backgroundImage&&this.setBackgroundImage(e.backgroundImage,i),e.backgroundColor&&this.setBackgroundColor(e.backgroundColor,i),e.overlayColor&&this.setOverlayColor(e.overlayColor,i),this.calcOffset()},_isRetinaScaling:function(){return 1!==fabric.devicePixelRatio&&this.enableRetinaScaling},getRetinaScaling:function(){return this._isRetinaScaling()?fabric.devicePixelRatio:1},_initRetinaScaling:function(){this._isRetinaScaling()&&(this.lowerCanvasEl.setAttribute("width",this.width*fabric.devicePixelRatio),this.lowerCanvasEl.setAttribute("height",this.height*fabric.devicePixelRatio),this.contextContainer.scale(fabric.devicePixelRatio,fabric.devicePixelRatio))},calcOffset:function(){return this._offset=e(this.lowerCanvasEl),this},setOverlayImage:function(t,e,i){return this.__setBgOverlayImage("overlayImage",t,e,i)},setBackgroundImage:function(t,e,i){return this.__setBgOverlayImage("backgroundImage",t,e,i)},setOverlayColor:function(t,e){return this.__setBgOverlayColor("overlayColor",t,e)},setBackgroundColor:function(t,e){return this.__setBgOverlayColor("backgroundColor",t,e)},_setImageSmoothing:function(){var t=this.getContext();t.imageSmoothingEnabled=t.imageSmoothingEnabled||t.webkitImageSmoothingEnabled||t.mozImageSmoothingEnabled||t.msImageSmoothingEnabled||t.oImageSmoothingEnabled,t.imageSmoothingEnabled=this.imageSmoothingEnabled},__setBgOverlayImage:function(t,e,i,r){return"string"==typeof e?fabric.util.loadImage(e,function(e){e&&(this[t]=new fabric.Image(e,r)),i&&i(e)},this,r&&r.crossOrigin):(r&&e.setOptions(r),this[t]=e,i&&i(e)),this},__setBgOverlayColor:function(t,e,i){return this[t]=e,this._initGradient(e,t),this._initPattern(e,t,i),this},_createCanvasElement:function(){var t=fabric.util.createCanvasElement();if(!t)throw o;if(t.style||(t.style={}),void 0===t.getContext)throw o;return t},_initOptions:function(t){this._setOptions(t),this.width=this.width||parseInt(this.lowerCanvasEl.width,10)||0,this.height=this.height||parseInt(this.lowerCanvasEl.height,10)||0,this.lowerCanvasEl.style&&(this.lowerCanvasEl.width=this.width,this.lowerCanvasEl.height=this.height,this.lowerCanvasEl.style.width=this.width+"px",this.lowerCanvasEl.style.height=this.height+"px",this.viewportTransform=this.viewportTransform.slice())},_createLowerCanvas:function(t){t&&t.getContext?this.lowerCanvasEl=t:this.lowerCanvasEl=fabric.util.getById(t)||this._createCanvasElement(),fabric.util.addClass(this.lowerCanvasEl,"lower-canvas"),this.interactive&&this._applyCanvasStyle(this.lowerCanvasEl),this.contextContainer=this.lowerCanvasEl.getContext("2d")},getWidth:function(){return this.width},getHeight:function(){return this.height},setWidth:function(t,e){return this.setDimensions({width:t},e)},setHeight:function(t,e){return this.setDimensions({height:t},e)},setDimensions:function(t,e){var i;e=e||{};for(var r in t)i=t[r],e.cssOnly||(this._setBackstoreDimension(r,t[r]),i+="px"),e.backstoreOnly||this._setCssDimension(r,i);return this._initRetinaScaling(),this._setImageSmoothing(),this.calcOffset(),e.cssOnly||this.requestRenderAll(),this},_setBackstoreDimension:function(t,e){return this.lowerCanvasEl[t]=e,this.upperCanvasEl&&(this.upperCanvasEl[t]=e),this.cacheCanvasEl&&(this.cacheCanvasEl[t]=e),this[t]=e,this},_setCssDimension:function(t,e){return this.lowerCanvasEl.style[t]=e,this.upperCanvasEl&&(this.upperCanvasEl.style[t]=e),this.wrapperEl&&(this.wrapperEl.style[t]=e),this},getZoom:function(){return this.viewportTransform[0]},setViewportTransform:function(t){var e,i,r,n=this._activeObject;for(this.viewportTransform=t,i=0,r=this._objects.length;i"),i.join("")},_setSVGPreamble:function(t,e){e.suppressPreamble||t.push('\n','\n')},_setSVGHeader:function(t,e){var i,n=e.width||this.width,s=e.height||this.height,o='viewBox="0 0 '+this.width+" "+this.height+'" ',a=fabric.Object.NUM_FRACTION_DIGITS;e.viewBox?o='viewBox="'+e.viewBox.x+" "+e.viewBox.y+" "+e.viewBox.width+" "+e.viewBox.height+'" ':this.svgViewportTransformation&&(i=this.viewportTransform,o='viewBox="'+r(-i[4]/i[0],a)+" "+r(-i[5]/i[3],a)+" "+r(this.width/i[0],a)+" "+r(this.height/i[3],a)+'" '),t.push("\n',"Created with Fabric.js ",fabric.version,"\n","\n",this.createSVGFontFacesMarkup(),this.createSVGRefElementsMarkup(),"\n")},createSVGRefElementsMarkup:function(){var t=this;return["backgroundColor","overlayColor"].map(function(e){var i=t[e];if(i&&i.toLive)return i.toSVG(t,!1)}).join("")},createSVGFontFacesMarkup:function(){var t,e,i,r,n,s,o,a,h="",c={},l=fabric.fontPaths,u=this.getObjects();for(o=0,a=u.length;o',"\n",h,"","\n"].join("")),h},_setSVGObjects:function(t,e){var i,r,n,s=this.getObjects();for(r=0,n=s.length;r\n")}else t.push('\n")},sendToBack:function(t){if(!t)return this;var e,r,n,s=this._activeObject;if(t===s&&"activeSelection"===t.type)for(e=(n=s._objects).length;e--;)r=n[e],i(this._objects,r),this._objects.unshift(r);else i(this._objects,t),this._objects.unshift(t);return this.renderOnAddRemove&&this.requestRenderAll(),this},bringToFront:function(t){if(!t)return this;var e,r,n,s=this._activeObject;if(t===s&&"activeSelection"===t.type)for(n=s._objects,e=0;e0+c&&(o=s-1,i(this._objects,n),this._objects.splice(o,0,n)),c++;else 0!==(s=this._objects.indexOf(t))&&(o=this._findNewLowerIndex(t,s,e),i(this._objects,t),this._objects.splice(o,0,t));return this.renderOnAddRemove&&this.requestRenderAll(),this},_findNewLowerIndex:function(t,e,i){var r,n;if(i){for(r=e,n=e-1;n>=0;--n)if(t.intersectsWithObject(this._objects[n])||t.isContainedWithinObject(this._objects[n])||this._objects[n].isContainedWithinObject(t)){r=n;break}}else r=e-1;return r},bringForward:function(t,e){if(!t)return this;var r,n,s,o,a,h=this._activeObject,c=0;if(t===h&&"activeSelection"===t.type)for(r=(a=h._objects).length;r--;)n=a[r],(s=this._objects.indexOf(n))"}}),t(fabric.StaticCanvas.prototype,fabric.Observable),t(fabric.StaticCanvas.prototype,fabric.Collection),t(fabric.StaticCanvas.prototype,fabric.DataURLExporter),t(fabric.StaticCanvas,{EMPTY_JSON:'{"objects": [], "background": "white"}',supports:function(t){var e=fabric.util.createCanvasElement();if(!e||!e.getContext)return null;var i=e.getContext("2d");if(!i)return null;switch(t){case"getImageData":return void 0!==i.getImageData;case"setLineDash":return void 0!==i.setLineDash;case"toDataURL":return void 0!==e.toDataURL;case"toDataURLWithQuality":try{return e.toDataURL("image/jpeg",0),!0}catch(t){}return!1;default:return null}}}),fabric.StaticCanvas.prototype.toJSON=fabric.StaticCanvas.prototype.toObject,fabric.isLikelyNode&&(fabric.StaticCanvas.prototype.createPNGStream=function(){var t=fabric.jsdomImplForWrapper(this.lowerCanvasEl);return t&&t.createPNGStream()},fabric.StaticCanvas.prototype.createJPEGStream=function(t){var e=fabric.jsdomImplForWrapper(this.lowerCanvasEl);return e&&e.createJPEGStream(t)})}}(),fabric.BaseBrush=fabric.util.createClass({color:"rgb(0, 0, 0)",width:1,shadow:null,strokeLineCap:"round",strokeLineJoin:"round",strokeMiterLimit:10,strokeDashArray:null,setShadow:function(t){return this.shadow=new fabric.Shadow(t),this},_setBrushStyles:function(){var t=this.canvas.contextTop;t.strokeStyle=this.color,t.lineWidth=this.width,t.lineCap=this.strokeLineCap,t.miterLimit=this.strokeMiterLimit,t.lineJoin=this.strokeLineJoin,this.strokeDashArray&&fabric.StaticCanvas.supports("setLineDash")&&t.setLineDash(this.strokeDashArray)},_setShadow:function(){if(this.shadow){var t=this.canvas.contextTop,e=this.canvas.getZoom();t.shadowColor=this.shadow.color,t.shadowBlur=this.shadow.blur*e,t.shadowOffsetX=this.shadow.offsetX*e,t.shadowOffsetY=this.shadow.offsetY*e}},_resetShadow:function(){var t=this.canvas.contextTop;t.shadowColor="",t.shadowBlur=t.shadowOffsetX=t.shadowOffsetY=0}}),fabric.PencilBrush=fabric.util.createClass(fabric.BaseBrush,{initialize:function(t){this.canvas=t,this._points=[]},onMouseDown:function(t){this._prepareForDrawing(t),this._captureDrawingPath(t),this._render()},onMouseMove:function(t){this._captureDrawingPath(t),this.canvas.clearContext(this.canvas.contextTop),this._render()},onMouseUp:function(){this._finalizeAndAddPath()},_prepareForDrawing:function(t){var e=new fabric.Point(t.x,t.y);this._reset(),this._addPoint(e),this.canvas.contextTop.moveTo(e.x,e.y)},_addPoint:function(t){this._points.length>1&&t.eq(this._points[this._points.length-1])||this._points.push(t)},_reset:function(){this._points.length=0,this._setBrushStyles(),this._setShadow()},_captureDrawingPath:function(t){var e=new fabric.Point(t.x,t.y);this._addPoint(e)},_render:function(){var t,e,i=this.canvas.contextTop,r=this.canvas.viewportTransform,n=this._points[0],s=this._points[1];if(i.save(),i.transform(r[0],r[1],r[2],r[3],r[4],r[5]),i.beginPath(),2===this._points.length&&n.x===s.x&&n.y===s.y){var o=this.width/1e3;n=new fabric.Point(n.x,n.y),s=new fabric.Point(s.x,s.y),n.x-=o,s.x+=o}for(i.moveTo(n.x,n.y),t=1,e=this._points.length;t2;for(c&&(a=t[2].xt[e-2].x?1:n.x===t[e-2].x?0:-1,h=n.y>t[e-2].y?1:n.y===t[e-2].y?0:-1),i.push("L ",n.x+a*r," ",n.y+h*r),i},createPath:function(t){var e=new fabric.Path(t,{fill:null,stroke:this.color,strokeWidth:this.width,strokeLineCap:this.strokeLineCap,strokeMiterLimit:this.strokeMiterLimit,strokeLineJoin:this.strokeLineJoin,strokeDashArray:this.strokeDashArray}),i=new fabric.Point(e.left+e.width/2,e.top+e.height/2);return i=e.translateToGivenOrigin(i,"center","center",e.originX,e.originY),e.top=i.y,e.left=i.x,this.shadow&&(this.shadow.affectStroke=!0,e.setShadow(this.shadow)),e},_finalizeAndAddPath:function(){this.canvas.contextTop.closePath();var t=this.convertPointsToSVGPath(this._points).join("");if("M 0 0 Q 0 0 0 0 L 0 0"!==t){var e=this.createPath(t);this.canvas.clearContext(this.canvas.contextTop),this.canvas.add(e),this.canvas.renderAll(),e.setCoords(),this._resetShadow(),this.canvas.fire("path:created",{path:e})}else this.canvas.requestRenderAll()}}),fabric.CircleBrush=fabric.util.createClass(fabric.BaseBrush,{width:10,initialize:function(t){this.canvas=t,this.points=[]},drawDot:function(t){var e=this.addPoint(t),i=this.canvas.contextTop,r=this.canvas.viewportTransform;i.save(),i.transform(r[0],r[1],r[2],r[3],r[4],r[5]),i.fillStyle=e.fill,i.beginPath(),i.arc(e.x,e.y,e.radius,0,2*Math.PI,!1),i.closePath(),i.fill(),i.restore()},onMouseDown:function(t){this.points.length=0,this.canvas.clearContext(this.canvas.contextTop),this._setShadow(),this.drawDot(t)},onMouseMove:function(t){this.drawDot(t)},onMouseUp:function(){var t,e,i=this.canvas.renderOnAddRemove;this.canvas.renderOnAddRemove=!1;var r=[];for(t=0,e=this.points.length;t0&&!this.preserveObjectStacking){e=[],i=[];for(var n=0,s=this._objects.length;n1&&(this._activeObject._objects=i),e.push.apply(e,i)}else e=this._objects;return e},renderAll:function(){!this.contextTopDirty||this._groupSelector||this.isDrawingMode||(this.clearContext(this.contextTop),this.contextTopDirty=!1);var t=this.contextContainer;return this.renderCanvas(t,this._chooseObjectsToRender()),this},renderTop:function(){var t=this.contextTop;return this.clearContext(t),this.selection&&this._groupSelector&&this._drawSelection(t),this.fire("after:render"),this.contextTopDirty=!0,this},_resetCurrentTransform:function(){var t=this._currentTransform;t.target.set({scaleX:t.original.scaleX,scaleY:t.original.scaleY,skewX:t.original.skewX,skewY:t.original.skewY,left:t.original.left,top:t.original.top}),this._shouldCenterTransform(t.target)?"rotate"===t.action?this._setOriginToCenter(t.target):("center"!==t.originX&&("right"===t.originX?t.mouseXSign=-1:t.mouseXSign=1),"center"!==t.originY&&("bottom"===t.originY?t.mouseYSign=-1:t.mouseYSign=1),t.originX="center",t.originY="center"):(t.originX=t.original.originX,t.originY=t.original.originY)},containsPoint:function(t,e,i){var r,n=i||this.getPointer(t,!0);return r=e.group&&e.group===this._activeObject&&"activeSelection"===e.group.type?this._normalizePointer(e.group,n):{x:n.x,y:n.y},e.containsPoint(r)||e._findTargetCorner(n)},_normalizePointer:function(t,e){var i=t.calcTransformMatrix(),r=fabric.util.invertTransform(i),n=this.restorePointerVpt(e);return fabric.util.transformPoint(n,r)},isTargetTransparent:function(t,e,i){var r=this.contextCache,n=t.selectionBackgroundColor,s=this.viewportTransform;return t.selectionBackgroundColor="",this.clearContext(r),r.save(),r.transform(s[0],s[1],s[2],s[3],s[4],s[5]),t.render(r),r.restore(),t===this._activeObject&&t._renderControls(r,{hasBorders:!1,transparentCorners:!1},{hasBorders:!1}),t.selectionBackgroundColor=n,fabric.util.isTransparent(r,e,i,this.targetFindTolerance)},_isSelectionKeyPressed:function(t){return"[object Array]"===Object.prototype.toString.call(this.selectionKey)?!!this.selectionKey.find(function(e){return!0===t[e]}):t[this.selectionKey]},_shouldClearSelection:function(t,e){var i=this.getActiveObjects(),r=this._activeObject;return!e||e&&r&&i.length>1&&-1===i.indexOf(e)&&r!==e&&!this._isSelectionKeyPressed(t)||e&&!e.evented||e&&!e.selectable&&r&&r!==e},_shouldCenterTransform:function(t){if(t){var e,i=this._currentTransform;return"scale"===i.action||"scaleX"===i.action||"scaleY"===i.action?e=this.centeredScaling||t.centeredScaling:"rotate"===i.action&&(e=this.centeredRotation||t.centeredRotation),e?!i.altKey:i.altKey}},_getOriginFromCorner:function(t,e){var i={x:t.originX,y:t.originY};return"ml"===e||"tl"===e||"bl"===e?i.x="right":"mr"!==e&&"tr"!==e&&"br"!==e||(i.x="left"),"tl"===e||"mt"===e||"tr"===e?i.y="bottom":"bl"!==e&&"mb"!==e&&"br"!==e||(i.y="top"),i},_getActionFromCorner:function(t,e,i){if(!e)return"drag";switch(e){case"mtr":return"rotate";case"ml":case"mr":return i[this.altActionKey]?"skewY":"scaleX";case"mt":case"mb":return i[this.altActionKey]?"skewX":"scaleY";default:return"scale"}},_setupCurrentTransform:function(t,i){if(i){var r=this.getPointer(t),n=i._findTargetCorner(this.getPointer(t,!0)),s=this._getActionFromCorner(i,n,t),o=this._getOriginFromCorner(i,n);this._currentTransform={target:i,action:s,corner:n,scaleX:i.scaleX,scaleY:i.scaleY,skewX:i.skewX,skewY:i.skewY,offsetX:r.x-i.left,offsetY:r.y-i.top,originX:o.x,originY:o.y,ex:r.x,ey:r.y,lastX:r.x,lastY:r.y,left:i.left,top:i.top,theta:e(i.angle),width:i.width*i.scaleX,mouseXSign:1,mouseYSign:1,shiftKey:t.shiftKey,altKey:t[this.centeredKey]},this._currentTransform.original={left:i.left,top:i.top,scaleX:i.scaleX,scaleY:i.scaleY,skewX:i.skewX,skewY:i.skewY,originX:o.x,originY:o.y},this._resetCurrentTransform()}},_translateObject:function(t,e){var i=this._currentTransform,r=i.target,n=t-i.offsetX,s=e-i.offsetY,o=!r.get("lockMovementX")&&r.left!==n,a=!r.get("lockMovementY")&&r.top!==s;return o&&r.set("left",n),a&&r.set("top",s),o||a},_changeSkewTransformOrigin:function(t,e,i){var r="originX",n={0:"center"},s=e.target.skewX,o="left",a="right",h="mt"===e.corner||"ml"===e.corner?1:-1,c=1;t=t>0?1:-1,"y"===i&&(s=e.target.skewY,o="top",a="bottom",r="originY"),n[-1]=o,n[1]=a,e.target.flipX&&(c*=-1),e.target.flipY&&(c*=-1),0===s?(e.skewSign=-h*t*c,e[r]=n[-t]):(s=s>0?1:-1,e.skewSign=s,e[r]=n[s*h*c])},_skewObject:function(t,e,i){var r=this._currentTransform,n=r.target,s=!1,o=n.get("lockSkewingX"),a=n.get("lockSkewingY");if(o&&"x"===i||a&&"y"===i)return!1;var h,c,l=n.getCenterPoint(),u=n.toLocalPoint(new fabric.Point(t,e),"center","center")[i],f=n.toLocalPoint(new fabric.Point(r.lastX,r.lastY),"center","center")[i],d=n._getTransformedDimensions();return this._changeSkewTransformOrigin(u-f,r,i),h=n.toLocalPoint(new fabric.Point(t,e),r.originX,r.originY)[i],c=n.translateToOriginPoint(l,r.originX,r.originY),s=this._setObjectSkew(h,r,i,d),r.lastX=t,r.lastY=e,n.setPositionByOrigin(c,r.originX,r.originY),s},_setObjectSkew:function(t,e,i,r){var n,s,o,a,h,c,l,u,f,d=e.target,g=!1,p=e.skewSign;return"x"===i?(a="y",h="Y",c="X",u=0,f=d.skewY):(a="x",h="X",c="Y",u=d.skewX,f=0),o=d._getTransformedDimensions(u,f),(l=2*Math.abs(t)-o[i])<=2?n=0:(n=p*Math.atan(l/d["scale"+c]/(o[a]/d["scale"+h])),n=fabric.util.radiansToDegrees(n)),g=d["skew"+c]!==n,d.set("skew"+c,n),0!==d["skew"+h]&&(s=d._getTransformedDimensions(),n=r[a]/s[a]*d["scale"+h],d.set("scale"+h,n)),g},_scaleObject:function(t,e,i){var r=this._currentTransform,n=r.target,s=n.get("lockScalingX"),o=n.get("lockScalingY"),a=n.get("lockScalingFlip");if(s&&o)return!1;var h=n.translateToOriginPoint(n.getCenterPoint(),r.originX,r.originY),c=n.toLocalPoint(new fabric.Point(t,e),r.originX,r.originY),l=n._getTransformedDimensions(),u=!1;return this._setLocalMouse(c,r),u=this._setObjectScale(c,r,s,o,i,a,l),n.setPositionByOrigin(h,r.originX,r.originY),u},_setObjectScale:function(t,e,i,r,n,s,o){var a,h,c,l,u=e.target,f=!1,d=!1,g=!1;return c=t.x*u.scaleX/o.x,l=t.y*u.scaleY/o.y,a=u.scaleX!==c,h=u.scaleY!==l,s&&c<=0&&cs?t.x<0?t.x+=s:t.x-=s:t.x=0,n(t.y)>s?t.y<0?t.y+=s:t.y-=s:t.y=0},_rotateObject:function(t,e){var n=this._currentTransform;if(n.target.get("lockRotation"))return!1;var s=r(n.ey-n.top,n.ex-n.left),o=r(e-n.top,t-n.left),a=i(o-s+n.theta),h=!0;if(n.target.snapAngle>0){var c=n.target.snapAngle,l=n.target.snapThreshold||c,u=Math.ceil(a/c)*c,f=Math.floor(a/c)*c;Math.abs(a-f)0?0:-i),e.ey-(r>0?0:-r),o,a)),this.selectionLineWidth&&this.selectionBorderColor)if(t.lineWidth=this.selectionLineWidth,t.strokeStyle=this.selectionBorderColor,this.selectionDashArray.length>1&&!s){var h=e.ex+.5-(i>0?0:o),c=e.ey+.5-(r>0?0:a);t.beginPath(),fabric.util.drawDashedLine(t,h,c,h+o,c,this.selectionDashArray),fabric.util.drawDashedLine(t,h,c+a-1,h+o,c+a-1,this.selectionDashArray),fabric.util.drawDashedLine(t,h,c,h,c+a,this.selectionDashArray),fabric.util.drawDashedLine(t,h+o-1,c,h+o-1,c+a,this.selectionDashArray),t.closePath(),t.stroke()}else fabric.Object.prototype._setLineDash.call(this,t,this.selectionDashArray),t.strokeRect(e.ex+.5-(i>0?0:o),e.ey+.5-(r>0?0:a),o,a)},findTarget:function(t,e){if(!this.skipTargetFind){var i,r,n=this.getPointer(t,!0),s=this._activeObject,o=this.getActiveObjects();if(this.targets=[],o.length>1&&!e&&s===this._searchPossibleTargets([s],n))return s;if(1===o.length&&s._findTargetCorner(n))return s;if(1===o.length&&s===this._searchPossibleTargets([s],n)){if(!this.preserveObjectStacking)return s;i=s,r=this.targets,this.targets=[]}var a=this._searchPossibleTargets(this._objects,n);return t[this.altSelectionKey]&&a&&i&&a!==i&&(a=i,this.targets=r),a}},_checkTarget:function(t,e){if(e&&e.visible&&e.evented&&this.containsPoint(null,e,t)){if(!this.perPixelTargetFind&&!e.perPixelTargetFind||e.isEditing)return!0;if(!this.isTargetTransparent(e,t.x,t.y))return!0}},_searchPossibleTargets:function(t,e){for(var i,r,n,s=t.length;s--;)if(this._checkTarget(e,t[s])){"group"===(i=t[s]).type&&i.subTargetCheck&&(r=this._normalizePointer(i,e),(n=this._searchPossibleTargets(i._objects,r))&&this.targets.push(n));break}return i},restorePointerVpt:function(t){return fabric.util.transformPoint(t,fabric.util.invertTransform(this.viewportTransform))},getPointer:function(e,i,r){r||(r=this.upperCanvasEl);var n,s=t(e),o=r.getBoundingClientRect(),a=o.width||0,h=o.height||0;return a&&h||("top"in o&&"bottom"in o&&(h=Math.abs(o.top-o.bottom)),"right"in o&&"left"in o&&(a=Math.abs(o.right-o.left))),this.calcOffset(),s.x=s.x-this._offset.left,s.y=s.y-this._offset.top,i||(s=this.restorePointerVpt(s)),n=0===a||0===h?{width:1,height:1}:{width:r.width/a,height:r.height/h},{x:s.x*n.width,y:s.y*n.height}},_createUpperCanvas:function(){var t=this.lowerCanvasEl.className.replace(/\s*lower-canvas\s*/,"");this.upperCanvasEl?this.upperCanvasEl.className="":this.upperCanvasEl=this._createCanvasElement(),fabric.util.addClass(this.upperCanvasEl,"upper-canvas "+t),this.wrapperEl.appendChild(this.upperCanvasEl),this._copyCanvasStyle(this.lowerCanvasEl,this.upperCanvasEl),this._applyCanvasStyle(this.upperCanvasEl),this.contextTop=this.upperCanvasEl.getContext("2d")},_createCacheCanvas:function(){this.cacheCanvasEl=this._createCanvasElement(),this.cacheCanvasEl.setAttribute("width",this.width),this.cacheCanvasEl.setAttribute("height",this.height),this.contextCache=this.cacheCanvasEl.getContext("2d")},_initWrapperElement:function(){this.wrapperEl=fabric.util.wrapElement(this.lowerCanvasEl,"div",{class:this.containerClass}),fabric.util.setStyle(this.wrapperEl,{width:this.width+"px",height:this.height+"px",position:"relative"}),fabric.util.makeElementUnselectable(this.wrapperEl)},_applyCanvasStyle:function(t){var e=this.width||t.width,i=this.height||t.height;fabric.util.setStyle(t,{position:"absolute",width:e+"px",height:i+"px",left:0,top:0,"touch-action":"none"}),t.width=e,t.height=i,fabric.util.makeElementUnselectable(t)},_copyCanvasStyle:function(t,e){e.style.cssText=t.style.cssText},getSelectionContext:function(){return this.contextTop},getSelectionElement:function(){return this.upperCanvasEl},getActiveObject:function(){return this._activeObject},getActiveObjects:function(){var t=this._activeObject;return t?"activeSelection"===t.type&&t._objects?t._objects.slice(0):[t]:[]},_onObjectRemoved:function(t){t===this._activeObject&&(this.fire("before:selection:cleared",{target:t}),this._discardActiveObject(),this.fire("selection:cleared",{target:t}),t.fire("deselected")),this._hoveredTarget===t&&(this._hoveredTarget=null),this.callSuper("_onObjectRemoved",t)},_fireSelectionEvents:function(t,e){var i=!1,r=this.getActiveObjects(),n=[],s=[],o={e:e};t.forEach(function(t){-1===r.indexOf(t)&&(i=!0,t.fire("deselected",o),s.push(t))}),r.forEach(function(e){-1===t.indexOf(e)&&(i=!0,e.fire("selected",o),n.push(e))}),t.length>0&&r.length>0?(o.selected=n,o.deselected=s,o.updated=n[0]||s[0],o.target=this._activeObject,i&&this.fire("selection:updated",o)):r.length>0?(1===r.length&&(o.target=n[0],this.fire("object:selected",o)),o.selected=n,o.target=this._activeObject,this.fire("selection:created",o)):t.length>0&&(o.deselected=s,this.fire("selection:cleared",o))},setActiveObject:function(t,e){var i=this.getActiveObjects();return this._setActiveObject(t,e),this._fireSelectionEvents(i,e),this},_setActiveObject:function(t,e){return this._activeObject!==t&&(!!this._discardActiveObject(e,t)&&(!t.onSelect({e:e})&&(this._activeObject=t,!0)))},_discardActiveObject:function(t,e){var i=this._activeObject;if(i){if(i.onDeselect({e:t,object:e}))return!1;this._activeObject=null}return!0},discardActiveObject:function(t){var e=this.getActiveObjects();return e.length&&this.fire("before:selection:cleared",{target:e[0],e:t}),this._discardActiveObject(t),this._fireSelectionEvents(e,t),this},dispose:function(){var t=this.wrapperEl;return this.removeListeners(),t.removeChild(this.upperCanvasEl),t.removeChild(this.lowerCanvasEl),delete this.upperCanvasEl,t.parentNode&&t.parentNode.replaceChild(this.lowerCanvasEl,this.wrapperEl),delete this.wrapperEl,fabric.StaticCanvas.prototype.dispose.call(this),this},clear:function(){return this.discardActiveObject(),this.clearContext(this.contextTop),this.callSuper("clear")},drawControls:function(t){var e=this._activeObject;e&&e._renderControls(t)},_toObject:function(t,e,i){var r=this._realizeGroupTransformOnObject(t),n=this.callSuper("_toObject",t,e,i);return this._unwindGroupTransformOnObject(t,r),n},_realizeGroupTransformOnObject:function(t){if(t.group&&"activeSelection"===t.group.type&&this._activeObject===t.group){var e={};return["angle","flipX","flipY","left","scaleX","scaleY","skewX","skewY","top"].forEach(function(i){e[i]=t[i]}),this._activeObject.realizeTransform(t),e}return null},_unwindGroupTransformOnObject:function(t,e){e&&t.set(e)},_setSVGObject:function(t,e,i){var r=this._realizeGroupTransformOnObject(e);this.callSuper("_setSVGObject",t,e,i),this._unwindGroupTransformOnObject(e,r)}});for(var o in fabric.StaticCanvas)"prototype"!==o&&(fabric.Canvas[o]=fabric.StaticCanvas[o]);fabric.isTouchSupported&&(fabric.Canvas.prototype._setCursorFromEvent=function(){})}(),function(){function t(t,e){return"which"in t?t.which===e:t.button===e-1}var e={mt:0,tr:1,mr:2,br:3,mb:4,bl:5,ml:6,tl:7},i=fabric.util.addListener,r=fabric.util.removeListener;fabric.util.object.extend(fabric.Canvas.prototype,{cursorMap:["n-resize","ne-resize","e-resize","se-resize","s-resize","sw-resize","w-resize","nw-resize"],_initEventListeners:function(){this.removeListeners(),this._bindEvents(),i(fabric.window,"resize",this._onResize),i(this.upperCanvasEl,"mousedown",this._onMouseDown),i(this.upperCanvasEl,"dblclick",this._onDoubleClick),i(this.upperCanvasEl,"mousemove",this._onMouseMove),i(this.upperCanvasEl,"mouseout",this._onMouseOut),i(this.upperCanvasEl,"mouseenter",this._onMouseEnter),i(this.upperCanvasEl,"wheel",this._onMouseWheel),i(this.upperCanvasEl,"contextmenu",this._onContextMenu),i(this.upperCanvasEl,"touchstart",this._onMouseDown,{passive:!1}),i(this.upperCanvasEl,"touchmove",this._onMouseMove,{passive:!1}),"undefined"!=typeof eventjs&&"add"in eventjs&&(eventjs.add(this.upperCanvasEl,"gesture",this._onGesture),eventjs.add(this.upperCanvasEl,"drag",this._onDrag),eventjs.add(this.upperCanvasEl,"orientation",this._onOrientationChange),eventjs.add(this.upperCanvasEl,"shake",this._onShake),eventjs.add(this.upperCanvasEl,"longpress",this._onLongPress))},_bindEvents:function(){this.eventsBinded||(this._onMouseDown=this._onMouseDown.bind(this),this._onMouseMove=this._onMouseMove.bind(this),this._onMouseUp=this._onMouseUp.bind(this),this._onResize=this._onResize.bind(this),this._onGesture=this._onGesture.bind(this),this._onDrag=this._onDrag.bind(this),this._onShake=this._onShake.bind(this),this._onLongPress=this._onLongPress.bind(this),this._onOrientationChange=this._onOrientationChange.bind(this),this._onMouseWheel=this._onMouseWheel.bind(this),this._onMouseOut=this._onMouseOut.bind(this),this._onMouseEnter=this._onMouseEnter.bind(this),this._onContextMenu=this._onContextMenu.bind(this),this._onDoubleClick=this._onDoubleClick.bind(this),this.eventsBinded=!0)},removeListeners:function(){r(fabric.window,"resize",this._onResize),r(this.upperCanvasEl,"mousedown",this._onMouseDown),r(this.upperCanvasEl,"mousemove",this._onMouseMove),r(this.upperCanvasEl,"mouseout",this._onMouseOut),r(this.upperCanvasEl,"mouseenter",this._onMouseEnter),r(this.upperCanvasEl,"wheel",this._onMouseWheel),r(this.upperCanvasEl,"contextmenu",this._onContextMenu),r(this.upperCanvasEl,"doubleclick",this._onDoubleClick),r(this.upperCanvasEl,"touchstart",this._onMouseDown),r(this.upperCanvasEl,"touchmove",this._onMouseMove),"undefined"!=typeof eventjs&&"remove"in eventjs&&(eventjs.remove(this.upperCanvasEl,"gesture",this._onGesture),eventjs.remove(this.upperCanvasEl,"drag",this._onDrag),eventjs.remove(this.upperCanvasEl,"orientation",this._onOrientationChange),eventjs.remove(this.upperCanvasEl,"shake",this._onShake),eventjs.remove(this.upperCanvasEl,"longpress",this._onLongPress))},_onGesture:function(t,e){this.__onTransformGesture&&this.__onTransformGesture(t,e)},_onDrag:function(t,e){this.__onDrag&&this.__onDrag(t,e)},_onMouseWheel:function(t){this.__onMouseWheel(t)},_onMouseOut:function(t){var e=this._hoveredTarget;this.fire("mouse:out",{target:e,e:t}),this._hoveredTarget=null,e&&e.fire("mouseout",{e:t}),this._iTextInstances&&this._iTextInstances.forEach(function(t){t.isEditing&&t.hiddenTextarea.focus()})},_onMouseEnter:function(t){this.findTarget(t)||(this.fire("mouse:over",{target:null,e:t}),this._hoveredTarget=null)},_onOrientationChange:function(t,e){this.__onOrientationChange&&this.__onOrientationChange(t,e)},_onShake:function(t,e){this.__onShake&&this.__onShake(t,e)},_onLongPress:function(t,e){this.__onLongPress&&this.__onLongPress(t,e)},_onContextMenu:function(t){return this.stopContextMenu&&(t.stopPropagation(),t.preventDefault()),!1},_onDoubleClick:function(t){this._handleEvent(t,"dblclick",void 0)},_onMouseDown:function(t){this.__onMouseDown(t),i(fabric.document,"touchend",this._onMouseUp,{passive:!1}),i(fabric.document,"touchmove",this._onMouseMove,{passive:!1}),r(this.upperCanvasEl,"mousemove",this._onMouseMove),r(this.upperCanvasEl,"touchmove",this._onMouseMove),"touchstart"===t.type?r(this.upperCanvasEl,"mousedown",this._onMouseDown):(i(fabric.document,"mouseup",this._onMouseUp),i(fabric.document,"mousemove",this._onMouseMove))},_onMouseUp:function(t){if(this.__onMouseUp(t),r(fabric.document,"mouseup",this._onMouseUp),r(fabric.document,"touchend",this._onMouseUp),r(fabric.document,"mousemove",this._onMouseMove),r(fabric.document,"touchmove",this._onMouseMove),i(this.upperCanvasEl,"mousemove",this._onMouseMove),i(this.upperCanvasEl,"touchmove",this._onMouseMove,{passive:!1}),"touchend"===t.type){var e=this;setTimeout(function(){i(e.upperCanvasEl,"mousedown",e._onMouseDown)},400)}},_onMouseMove:function(t){!this.allowTouchScrolling&&t.preventDefault&&t.preventDefault(),this.__onMouseMove(t)},_onResize:function(){this.calcOffset()},_shouldRender:function(t,e){var i=this._activeObject;return(!i||!i.isEditing||t!==i)&&!!(t&&(t.isMoving||t!==i)||!t&&i||!t&&!i&&!this._groupSelector||e&&this._previousPointer&&this.selection&&(e.x!==this._previousPointer.x||e.y!==this._previousPointer.y))},__onMouseUp:function(e){var i,r=!0,n=this._currentTransform,s=this._groupSelector,o=!s||0===s.left&&0===s.top;if(t(e,3))this.fireRightClick&&this._handleEvent(e,"up",i,3,o);else if(t(e,2))this.fireMiddleClick&&this._handleEvent(e,"up",i,2,o);else if(this.isDrawingMode&&this._isCurrentlyDrawing)this._onMouseUpInDrawingMode(e);else{n&&(this._finalizeCurrentTransform(e),r=!n.actionPerformed),i=r?this.findTarget(e,!0):n.target;var a=this._shouldRender(i,this.getPointer(e));i||!o?this._maybeGroupObjects(e):(this._groupSelector=null,this._currentTransform=null),i&&(i.isMoving=!1),this._setCursorFromEvent(e,i),this._handleEvent(e,"up",i||null,1,o),i&&(i.__corner=0),a&&this.requestRenderAll()}},_handleEvent:function(t,e,i,r,n){var s=void 0===i?this.findTarget(t):i,o=this.targets||[],a={e:t,target:s,subTargets:o,button:r||1,isClick:n||!1};this.fire("mouse:"+e,a),s&&s.fire("mouse"+e,a);for(var h=0;h1)){var r=this._groupSelector;r?(i=this.getPointer(t,!0),r.left=i.x-r.ex,r.top=i.y-r.ey,this.renderTop()):this._currentTransform?this._transformObject(t):(e=this.findTarget(t),this._setCursorFromEvent(t,e),this._fireOverOutEvents(e,t)),this._handleEvent(t,"move",this._currentTransform?null:e)}},_fireOverOutEvents:function(t,e){var i,r,n=this._hoveredTarget;n!==t&&(i={e:e,target:t,previousTarget:this._hoveredTarget},r={e:e,target:this._hoveredTarget,nextTarget:t},this._hoveredTarget=t),t?n!==t&&(n&&(this.fire("mouse:out",r),n.fire("mouseout",r)),this.fire("mouse:over",i),t.fire("mouseover",i)):n&&(this.fire("mouse:out",r),n.fire("mouseout",r))},__onMouseWheel:function(t){this._handleEvent(t,"wheel")},_transformObject:function(t){var e=this.getPointer(t),i=this._currentTransform;i.reset=!1,i.target.isMoving=!0,i.shiftKey=t.shiftKey,i.altKey=t[this.centeredKey],this._beforeScaleTransform(t,i),this._performTransformAction(t,i,e),i.actionPerformed&&this.requestRenderAll()},_performTransformAction:function(t,e,i){var r=i.x,n=i.y,s=e.target,o=e.action,a=!1;"rotate"===o?(a=this._rotateObject(r,n))&&this._fire("rotating",s,t):"scale"===o?(a=this._onScale(t,e,r,n))&&this._fire("scaling",s,t):"scaleX"===o?(a=this._scaleObject(r,n,"x"))&&this._fire("scaling",s,t):"scaleY"===o?(a=this._scaleObject(r,n,"y"))&&this._fire("scaling",s,t):"skewX"===o?(a=this._skewObject(r,n,"x"))&&this._fire("skewing",s,t):"skewY"===o?(a=this._skewObject(r,n,"y"))&&this._fire("skewing",s,t):(a=this._translateObject(r,n))&&(this._fire("moving",s,t),this.setCursor(s.moveCursor||this.moveCursor)),e.actionPerformed=e.actionPerformed||a},_fire:function(t,e,i){this.fire("object:"+t,{target:e,e:i}),e.fire(t,{e:i})},_beforeScaleTransform:function(t,e){if("scale"===e.action||"scaleX"===e.action||"scaleY"===e.action){var i=this._shouldCenterTransform(e.target);(i&&("center"!==e.originX||"center"!==e.originY)||!i&&"center"===e.originX&&"center"===e.originY)&&(this._resetCurrentTransform(),e.reset=!0)}},_onScale:function(t,e,i,r){return this._isUniscalePossible(t,e.target)?(e.currentAction="scale",this._scaleObject(i,r)):(e.reset||"scale"!==e.currentAction||this._resetCurrentTransform(),e.currentAction="scaleEqually",this._scaleObject(i,r,"equally"))},_isUniscalePossible:function(t,e){return(t[this.uniScaleKey]||this.uniScaleTransform)&&!e.get("lockUniScaling")},_setCursorFromEvent:function(t,e){if(!e)return this.setCursor(this.defaultCursor),!1;var i=e.hoverCursor||this.hoverCursor,r=this._activeObject&&"activeSelection"===this._activeObject.type?this._activeObject:null,n=(!r||!r.contains(e))&&e._findTargetCorner(this.getPointer(t,!0));n?this.setCursor(this.getCornerCursor(n,e,t)):this.setCursor(i)},getCornerCursor:function(t,i,r){return this.actionIsDisabled(t,i,r)?this.notAllowedCursor:t in e?this._getRotatedCornerCursor(t,i,r):"mtr"===t&&i.hasRotatingPoint?this.rotationCursor:this.defaultCursor},actionIsDisabled:function(t,e,i){return"mt"===t||"mb"===t?i[this.altActionKey]?e.lockSkewingX:e.lockScalingY:"ml"===t||"mr"===t?i[this.altActionKey]?e.lockSkewingY:e.lockScalingX:"mtr"===t?e.lockRotation:this._isUniscalePossible(i,e)?e.lockScalingX&&e.lockScalingY:e.lockScalingX||e.lockScalingY},_getRotatedCornerCursor:function(t,i,r){var n=Math.round(i.angle%360/45);return n<0&&(n+=8),n+=e[t],r[this.altActionKey]&&e[t]%2==0&&(n+=2),n%=8,this.cursorMap[n]}})}(),function(){var t=Math.min,e=Math.max;fabric.util.object.extend(fabric.Canvas.prototype,{_shouldGroup:function(t,e){var i=this._activeObject;return i&&this._isSelectionKeyPressed(t)&&e&&e.selectable&&this.selection&&(i!==e||"activeSelection"===i.type)},_handleGrouping:function(t,e){var i=this._activeObject;i.__corner||(e!==i||(e=this.findTarget(t,!0)))&&(i&&"activeSelection"===i.type?this._updateActiveSelection(e,t):this._createActiveSelection(e,t))},_updateActiveSelection:function(t,e){var i=this._activeObject,r=i._objects.slice(0);i.contains(t)?(i.removeWithUpdate(t),this._hoveredTarget=t,1===i.size()&&this._setActiveObject(i.item(0),e)):(i.addWithUpdate(t),this._hoveredTarget=i),this._fireSelectionEvents(r,e)},_createActiveSelection:function(t,e){var i=this.getActiveObjects(),r=this._createGroup(t);this._hoveredTarget=r,this._setActiveObject(r,e),this._fireSelectionEvents(i,e)},_createGroup:function(t){var e=this.getObjects(),i=e.indexOf(this._activeObject)1&&(e=new fabric.ActiveSelection(i.reverse(),{canvas:this}),this.setActiveObject(e,t))},_collectObjects:function(){for(var i,r=[],n=this._groupSelector.ex,s=this._groupSelector.ey,o=n+this._groupSelector.left,a=s+this._groupSelector.top,h=new fabric.Point(t(n,o),t(s,a)),c=new fabric.Point(e(n,o),e(s,a)),l=n===o&&s===a,u=this._objects.length;u--&&!((i=this._objects[u])&&i.selectable&&i.visible&&(i.intersectsWithRect(h,c)||i.isContainedWithinRect(h,c)||i.containsPoint(h)||i.containsPoint(c))&&(r.push(i),l)););return r},_maybeGroupObjects:function(t){this.selection&&this._groupSelector&&this._groupSelectedObjects(t),this.setCursor(this.defaultCursor),this._groupSelector=null,this._currentTransform=null}})}(),function(){var t=fabric.StaticCanvas.supports("toDataURLWithQuality");fabric.util.object.extend(fabric.StaticCanvas.prototype,{toDataURL:function(t){t||(t={});var e=t.format||"png",i=t.quality||1,r=t.multiplier||1,n={left:t.left||0,top:t.top||0,width:t.width||0,height:t.height||0};return this.__toDataURLWithMultiplier(e,i,n,r)},__toDataURLWithMultiplier:function(t,e,i,r){var n=this.width,s=this.height,o=(i.width||this.width)*r,a=(i.height||this.height)*r,h=this.getZoom()*r,c=this.viewportTransform,l=[h,0,0,h,(c[4]-i.left)*r,(c[5]-i.top)*r],u=this.interactive,f=this.skipOffscreen,d=n!==o||s!==a;this.viewportTransform=l,this.skipOffscreen=!1,this.interactive=!1,d&&this.setDimensions({width:o,height:a},{backstoreOnly:!0}),this.renderAll();var g=this.__toDataURL(t,e,i);return this.interactive=u,this.skipOffscreen=f,this.viewportTransform=c,d&&this.setDimensions({width:n,height:s},{backstoreOnly:!0}),this.renderAll(),g},__toDataURL:function(e,i){var r=this.contextContainer.canvas;return"jpg"===e&&(e="jpeg"),t?r.toDataURL("image/"+e,i):r.toDataURL("image/"+e)}})}(),fabric.util.object.extend(fabric.StaticCanvas.prototype,{loadFromDatalessJSON:function(t,e,i){return this.loadFromJSON(t,e,i)},loadFromJSON:function(t,e,i){if(t){var r="string"==typeof t?JSON.parse(t):fabric.util.object.clone(t),n=this,s=this.renderOnAddRemove;return this.renderOnAddRemove=!1,this._enlivenObjects(r.objects,function(t){n.clear(),n._setBgOverlay(r,function(){t.forEach(function(t,e){n.insertAt(t,e)}),n.renderOnAddRemove=s,delete r.objects,delete r.backgroundImage,delete r.overlayImage,delete r.background,delete r.overlay,n._setOptions(r),n.renderAll(),e&&e()})},i),this}},_setBgOverlay:function(t,e){var i={backgroundColor:!1,overlayColor:!1,backgroundImage:!1,overlayImage:!1};if(t.backgroundImage||t.overlayImage||t.background||t.overlay){var r=function(){i.backgroundImage&&i.overlayImage&&i.backgroundColor&&i.overlayColor&&e&&e()};this.__setBgOverlay("backgroundImage",t.backgroundImage,i,r),this.__setBgOverlay("overlayImage",t.overlayImage,i,r),this.__setBgOverlay("backgroundColor",t.background,i,r),this.__setBgOverlay("overlayColor",t.overlay,i,r)}else e&&e()},__setBgOverlay:function(t,e,i,r){var n=this;if(!e)return i[t]=!0,void(r&&r());"backgroundImage"===t||"overlayImage"===t?fabric.util.enlivenObjects([e],function(e){n[t]=e[0],i[t]=!0,r&&r()}):this["set"+fabric.util.string.capitalize(t,!0)](e,function(){i[t]=!0,r&&r()})},_enlivenObjects:function(t,e,i){t&&0!==t.length?fabric.util.enlivenObjects(t,function(t){e&&e(t)},null,i):e&&e([])},_toDataURL:function(t,e){this.clone(function(i){e(i.toDataURL(t))})},_toDataURLWithMultiplier:function(t,e,i){this.clone(function(r){i(r.toDataURLWithMultiplier(t,e))})},clone:function(t,e){var i=JSON.stringify(this.toJSON(e));this.cloneWithoutData(function(e){e.loadFromJSON(i,function(){t&&t(e)})})},cloneWithoutData:function(t){var e=fabric.document.createElement("canvas");e.width=this.width,e.height=this.height;var i=new fabric.Canvas(e);i.clipTo=this.clipTo,this.backgroundImage?(i.setBackgroundImage(this.backgroundImage.src,function(){i.renderAll(),t&&t(i)}),i.backgroundImageOpacity=this.backgroundImageOpacity,i.backgroundImageStretch=this.backgroundImageStretch):t&&t(i)}}),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend,r=e.util.object.clone,n=e.util.toFixed,s=e.util.string.capitalize,o=e.util.degreesToRadians,a=e.StaticCanvas.supports("setLineDash"),h=!e.isLikelyNode;e.Object||(e.Object=e.util.createClass(e.CommonMethods,{type:"object",originX:"left",originY:"top",top:0,left:0,width:0,height:0,scaleX:1,scaleY:1,flipX:!1,flipY:!1,opacity:1,angle:0,skewX:0,skewY:0,cornerSize:13,transparentCorners:!0,hoverCursor:null,moveCursor:null,padding:0,borderColor:"rgba(102,153,255,0.75)",borderDashArray:null,cornerColor:"rgba(102,153,255,0.5)",cornerStrokeColor:null,cornerStyle:"rect",cornerDashArray:null,centeredScaling:!1,centeredRotation:!0,fill:"rgb(0,0,0)",fillRule:"nonzero",globalCompositeOperation:"source-over",backgroundColor:"",selectionBackgroundColor:"",stroke:null,strokeWidth:1,strokeDashArray:null,strokeLineCap:"butt",strokeLineJoin:"miter",strokeMiterLimit:10,shadow:null,borderOpacityWhenMoving:.4,borderScaleFactor:1,transformMatrix:null,minScaleLimit:0,selectable:!0,evented:!0,visible:!0,hasControls:!0,hasBorders:!0,hasRotatingPoint:!0,rotatingPointOffset:40,perPixelTargetFind:!1,includeDefaultValues:!0,clipTo:null,lockMovementX:!1,lockMovementY:!1,lockRotation:!1,lockScalingX:!1,lockScalingY:!1,lockUniScaling:!1,lockSkewingX:!1,lockSkewingY:!1,lockScalingFlip:!1,excludeFromExport:!1,objectCaching:h,statefullCache:!1,noScaleCache:!0,dirty:!0,__corner:0,paintFirst:"fill",stateProperties:"top left width height scaleX scaleY flipX flipY originX originY transformMatrix stroke strokeWidth strokeDashArray strokeLineCap strokeLineJoin strokeMiterLimit angle opacity fill globalCompositeOperation shadow clipTo visible backgroundColor skewX skewY fillRule paintFirst".split(" "),cacheProperties:"fill stroke strokeWidth strokeDashArray width height paintFirst strokeLineCap strokeLineJoin strokeMiterLimit backgroundColor".split(" "),initialize:function(t){t&&this.setOptions(t)},_createCacheCanvas:function(){this._cacheProperties={},this._cacheCanvas=e.document.createElement("canvas"),this._cacheContext=this._cacheCanvas.getContext("2d"),this._updateCacheCanvas()},_limitCacheSize:function(t){var i=e.perfLimitSizeTotal,r=t.width,n=t.height,s=e.maxCacheSideLimit,o=e.minCacheSideLimit;if(r<=s&&n<=s&&r*n<=i)return rl&&(t.zoomX/=r/l,t.width=l,t.capped=!0),n>u&&(t.zoomY/=n/u,t.height=u,t.capped=!0),t},_getCacheCanvasDimensions:function(){var t=this.canvas&&this.canvas.getZoom()||1,i=this.getObjectScaling(),r=this.canvas&&this.canvas._isRetinaScaling()?e.devicePixelRatio:1,n=this._getNonTransformedDimensions(),s=i.scaleX*t*r,o=i.scaleY*t*r;return{width:n.x*s+2,height:n.y*o+2,zoomX:s,zoomY:o,x:n.x,y:n.y}},_updateCacheCanvas:function(){if(this.noScaleCache&&this.canvas&&this.canvas._currentTransform){var t=this.canvas._currentTransform.target,i=this.canvas._currentTransform.action;if(this===t&&i.slice&&"scale"===i.slice(0,5))return!1}var r,n,s=this._cacheCanvas,o=this._limitCacheSize(this._getCacheCanvasDimensions()),a=e.minCacheSideLimit,h=o.width,c=o.height,l=o.zoomX,u=o.zoomY,f=h!==this.cacheWidth||c!==this.cacheHeight,d=this.zoomX!==l||this.zoomY!==u,g=f||d,p=0,v=0,m=!1;if(f){var b=this._cacheCanvas.width,_=this._cacheCanvas.height,y=h>b||c>_,x=(h<.9*b||c<.9*_)&&b>a&&_>a;m=y||x,y&&!o.capped&&(h>a||c>a)&&(p=.1*h,v=.1*c)}return!!g&&(m?(s.width=Math.ceil(h+p),s.height=Math.ceil(c+v)):(this._cacheContext.setTransform(1,0,0,1,0,0),this._cacheContext.clearRect(0,0,s.width,s.height)),r=o.x*l/2,n=o.y*u/2,this.cacheTranslationX=Math.round(s.width/2-r)+r,this.cacheTranslationY=Math.round(s.height/2-n)+n,this.cacheWidth=h,this.cacheHeight=c,this._cacheContext.translate(this.cacheTranslationX,this.cacheTranslationY),this._cacheContext.scale(l,u),this.zoomX=l,this.zoomY=u,!0)},setOptions:function(t){this._setOptions(t),this._initGradient(t.fill,"fill"),this._initGradient(t.stroke,"stroke"),this._initClipping(t),this._initPattern(t.fill,"fill"),this._initPattern(t.stroke,"stroke")},transform:function(t){var e;e=this.group&&!this.group._transformDone?this.calcTransformMatrix():this.calcOwnMatrix(),t.transform(e[0],e[1],e[2],e[3],e[4],e[5])},toObject:function(t){var i=e.Object.NUM_FRACTION_DIGITS,r={type:this.type,version:e.version,originX:this.originX,originY:this.originY,left:n(this.left,i),top:n(this.top,i),width:n(this.width,i),height:n(this.height,i),fill:this.fill&&this.fill.toObject?this.fill.toObject():this.fill,stroke:this.stroke&&this.stroke.toObject?this.stroke.toObject():this.stroke,strokeWidth:n(this.strokeWidth,i),strokeDashArray:this.strokeDashArray?this.strokeDashArray.concat():this.strokeDashArray,strokeLineCap:this.strokeLineCap,strokeLineJoin:this.strokeLineJoin,strokeMiterLimit:n(this.strokeMiterLimit,i),scaleX:n(this.scaleX,i),scaleY:n(this.scaleY,i),angle:n(this.angle,i),flipX:this.flipX,flipY:this.flipY,opacity:n(this.opacity,i),shadow:this.shadow&&this.shadow.toObject?this.shadow.toObject():this.shadow,visible:this.visible,clipTo:this.clipTo&&String(this.clipTo),backgroundColor:this.backgroundColor,fillRule:this.fillRule,paintFirst:this.paintFirst,globalCompositeOperation:this.globalCompositeOperation,transformMatrix:this.transformMatrix?this.transformMatrix.concat():null,skewX:n(this.skewX,i),skewY:n(this.skewY,i)};return e.util.populateWithProperties(this,r,t),this.includeDefaultValues||(r=this._removeDefaultValues(r)),r},toDatalessObject:function(t){return this.toObject(t)},_removeDefaultValues:function(t){var i=e.util.getKlass(t.type).prototype;return i.stateProperties.forEach(function(e){t[e]===i[e]&&delete t[e],"[object Array]"===Object.prototype.toString.call(t[e])&&"[object Array]"===Object.prototype.toString.call(i[e])&&0===t[e].length&&0===i[e].length&&delete t[e]}),t},toString:function(){return"#"},getObjectScaling:function(){var t=this.scaleX,e=this.scaleY;if(this.group){var i=this.group.getObjectScaling();t*=i.scaleX,e*=i.scaleY}return{scaleX:t,scaleY:e}},getObjectOpacity:function(){var t=this.opacity;return this.group&&(t*=this.group.getObjectOpacity()),t},_set:function(t,i){var r="scaleX"===t||"scaleY"===t,n=this[t]!==i,s=!1;return r&&(i=this._constrainScale(i)),"scaleX"===t&&i<0?(this.flipX=!this.flipX,i*=-1):"scaleY"===t&&i<0?(this.flipY=!this.flipY,i*=-1):"shadow"!==t||!i||i instanceof e.Shadow?"dirty"===t&&this.group&&this.group.set("dirty",i):i=new e.Shadow(i),this[t]=i,n&&(s=this.group&&this.group.isOnACache(),this.cacheProperties.indexOf(t)>-1?(this.dirty=!0,s&&this.group.set("dirty",!0)):s&&this.stateProperties.indexOf(t)>-1&&this.group.set("dirty",!0)),this},setOnGroup:function(){},getViewportTransform:function(){return this.canvas&&this.canvas.viewportTransform?this.canvas.viewportTransform:e.iMatrix.concat()},isNotVisible:function(){return 0===this.opacity||0===this.width&&0===this.height||!this.visible},render:function(t){this.isNotVisible()||this.canvas&&this.canvas.skipOffscreen&&!this.group&&!this.isOnScreen()||(t.save(),this._setupCompositeOperation(t),this.drawSelectionBackground(t),this.transform(t),this._setOpacity(t),this._setShadow(t,this),this.transformMatrix&&t.transform.apply(t,this.transformMatrix),this.clipTo&&e.util.clipContext(this,t),this.shouldCache()?(this._cacheCanvas||this._createCacheCanvas(),this.isCacheDirty()&&(this.statefullCache&&this.saveState({propertySet:"cacheProperties"}),this.drawObject(this._cacheContext),this.dirty=!1),this.drawCacheOnCanvas(t)):(this._removeCacheCanvas(),this.dirty=!1,this.drawObject(t),this.objectCaching&&this.statefullCache&&this.saveState({propertySet:"cacheProperties"})),this.clipTo&&t.restore(),t.restore())},_removeCacheCanvas:function(){this._cacheCanvas=null,this.cacheWidth=0,this.cacheHeight=0},needsItsOwnCache:function(){return"stroke"===this.paintFirst&&"object"==typeof this.shadow},shouldCache:function(){return this.ownCaching=this.objectCaching&&(!this.group||this.needsItsOwnCache()||!this.group.isOnACache()),this.ownCaching},willDrawShadow:function(){return!!this.shadow&&(0!==this.shadow.offsetX||0!==this.shadow.offsetY)},drawObject:function(t){this._renderBackground(t),this._setStrokeStyles(t,this),this._setFillStyles(t,this),this._render(t)},drawCacheOnCanvas:function(t){t.scale(1/this.zoomX,1/this.zoomY),t.drawImage(this._cacheCanvas,-this.cacheTranslationX,-this.cacheTranslationY)},isCacheDirty:function(t){if(this.isNotVisible())return!1;if(this._cacheCanvas&&!t&&this._updateCacheCanvas())return!0;if(this.dirty||this.statefullCache&&this.hasStateChanged("cacheProperties")){if(this._cacheCanvas&&!t){var e=this.cacheWidth/this.zoomX,i=this.cacheHeight/this.zoomY;this._cacheContext.clearRect(-e/2,-i/2,e,i)}return!0}return!1},_renderBackground:function(t){if(this.backgroundColor){var e=this._getNonTransformedDimensions();t.fillStyle=this.backgroundColor,t.fillRect(-e.x/2,-e.y/2,e.x,e.y),this._removeShadow(t)}},_setOpacity:function(t){this.group&&!this.group._transformDone?t.globalAlpha=this.getObjectOpacity():t.globalAlpha*=this.opacity},_setStrokeStyles:function(t,e){e.stroke&&(t.lineWidth=e.strokeWidth,t.lineCap=e.strokeLineCap,t.lineJoin=e.strokeLineJoin,t.miterLimit=e.strokeMiterLimit,t.strokeStyle=e.stroke.toLive?e.stroke.toLive(t,this):e.stroke)},_setFillStyles:function(t,e){e.fill&&(t.fillStyle=e.fill.toLive?e.fill.toLive(t,this):e.fill)},_setLineDash:function(t,e,i){e&&(1&e.length&&e.push.apply(e,e),a?t.setLineDash(e):i&&i(t))},_renderControls:function(t,i){var r,n,s,a=this.getViewportTransform(),h=this.calcTransformMatrix();n=void 0!==(i=i||{}).hasBorders?i.hasBorders:this.hasBorders,s=void 0!==i.hasControls?i.hasControls:this.hasControls,h=e.util.multiplyTransformMatrices(a,h),r=e.util.qrDecompose(h),t.save(),t.translate(r.translateX,r.translateY),t.lineWidth=1*this.borderScaleFactor,this.group||(t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1),i.forActiveSelection?(t.rotate(o(r.angle)),n&&this.drawBordersInGroup(t,r,i)):(t.rotate(o(this.angle)),n&&this.drawBorders(t,i)),s&&this.drawControls(t,i),t.restore()},_setShadow:function(t){if(this.shadow){var i=this.canvas&&this.canvas.viewportTransform[0]||1,r=this.canvas&&this.canvas.viewportTransform[3]||1,n=this.getObjectScaling();this.canvas&&this.canvas._isRetinaScaling()&&(i*=e.devicePixelRatio,r*=e.devicePixelRatio),t.shadowColor=this.shadow.color,t.shadowBlur=this.shadow.blur*e.browserShadowBlurConstant*(i+r)*(n.scaleX+n.scaleY)/4,t.shadowOffsetX=this.shadow.offsetX*i*n.scaleX,t.shadowOffsetY=this.shadow.offsetY*r*n.scaleY}},_removeShadow:function(t){this.shadow&&(t.shadowColor="",t.shadowBlur=t.shadowOffsetX=t.shadowOffsetY=0)},_applyPatternGradientTransform:function(t,e){if(!e||!e.toLive)return{offsetX:0,offsetY:0};var i=e.gradientTransform||e.patternTransform,r=-this.width/2+e.offsetX||0,n=-this.height/2+e.offsetY||0;return t.translate(r,n),i&&t.transform(i[0],i[1],i[2],i[3],i[4],i[5]),{offsetX:r,offsetY:n}},_renderPaintInOrder:function(t){"stroke"===this.paintFirst?(this._renderStroke(t),this._renderFill(t)):(this._renderFill(t),this._renderStroke(t))},_renderFill:function(t){this.fill&&(t.save(),this._applyPatternGradientTransform(t,this.fill),"evenodd"===this.fillRule?t.fill("evenodd"):t.fill(),t.restore())},_renderStroke:function(t){this.stroke&&0!==this.strokeWidth&&(this.shadow&&!this.shadow.affectStroke&&this._removeShadow(t),t.save(),this._setLineDash(t,this.strokeDashArray,this._renderDashedStroke),this._applyPatternGradientTransform(t,this.stroke),t.stroke(),t.restore())},_findCenterFromElement:function(){return{x:this.left+this.width/2,y:this.top+this.height/2}},_assignTransformMatrixProps:function(){if(this.transformMatrix){var t=e.util.qrDecompose(this.transformMatrix);this.flipX=!1,this.flipY=!1,this.set("scaleX",t.scaleX),this.set("scaleY",t.scaleY),this.angle=t.angle,this.skewX=t.skewX,this.skewY=0}},_removeTransformMatrix:function(t){var i=this._findCenterFromElement();this.transformMatrix&&(this._assignTransformMatrixProps(),i=e.util.transformPoint(i,this.transformMatrix)),this.transformMatrix=null,t&&(this.scaleX*=t.scaleX,this.scaleY*=t.scaleY,this.cropX=t.cropX,this.cropY=t.cropY,i.x+=t.offsetLeft,i.y+=t.offsetTop,this.width=t.width,this.height=t.height),this.setPositionByOrigin(i,"center","center")},clone:function(t,i){var r=this.toObject(i);this.constructor.fromObject?this.constructor.fromObject(r,t):e.Object._fromObject("Object",r,t)},cloneAsImage:function(t,i){var r=this.toDataURL(i);return e.util.loadImage(r,function(i){t&&t(new e.Image(i))}),this},toDataURL:function(t){t||(t={});var i=e.util.createCanvasElement(),r=this.getBoundingRect();i.width=r.width,i.height=r.height,e.util.wrapElement(i,"div");var n=new e.StaticCanvas(i,{enableRetinaScaling:t.enableRetinaScaling});"jpg"===t.format&&(t.format="jpeg"),"jpeg"===t.format&&(n.backgroundColor="#fff");var s={left:this.left,top:this.top};this.setPositionByOrigin(new e.Point(n.width/2,n.height/2),"center","center");var o=this.canvas;n.add(this);var a=n.toDataURL(t);return this.set(s).setCoords(),this.canvas=o,n.dispose(),n=null,a},isType:function(t){return this.type===t},complexity:function(){return 1},toJSON:function(t){return this.toObject(t)},setGradient:function(t,i){i||(i={});var r={colorStops:[]};return r.type=i.type||(i.r1||i.r2?"radial":"linear"),r.coords={x1:i.x1,y1:i.y1,x2:i.x2,y2:i.y2},(i.r1||i.r2)&&(r.coords.r1=i.r1,r.coords.r2=i.r2),r.gradientTransform=i.gradientTransform,e.Gradient.prototype.addColorStop.call(r,i.colorStops),this.set(t,e.Gradient.forObject(this,r))},setPatternFill:function(t){return this.set("fill",new e.Pattern(t))},setShadow:function(t){return this.set("shadow",t?new e.Shadow(t):null)},setColor:function(t){return this.set("fill",t),this},rotate:function(t){var e=("center"!==this.originX||"center"!==this.originY)&&this.centeredRotation;return e&&this._setOriginToCenter(),this.set("angle",t),e&&this._resetOrigin(),this},centerH:function(){return this.canvas&&this.canvas.centerObjectH(this),this},viewportCenterH:function(){return this.canvas&&this.canvas.viewportCenterObjectH(this),this},centerV:function(){return this.canvas&&this.canvas.centerObjectV(this),this},viewportCenterV:function(){return this.canvas&&this.canvas.viewportCenterObjectV(this),this},center:function(){return this.canvas&&this.canvas.centerObject(this),this},viewportCenter:function(){return this.canvas&&this.canvas.viewportCenterObject(this),this},getLocalPointer:function(t,i){i=i||this.canvas.getPointer(t);var r=new e.Point(i.x,i.y),n=this._getLeftTopCoords();return this.angle&&(r=e.util.rotatePoint(r,n,o(-this.angle))),{x:r.x-n.x,y:r.y-n.y}},_setupCompositeOperation:function(t){this.globalCompositeOperation&&(t.globalCompositeOperation=this.globalCompositeOperation)}}),e.util.createAccessors&&e.util.createAccessors(e.Object),i(e.Object.prototype,e.Observable),e.Object.NUM_FRACTION_DIGITS=2,e.Object._fromObject=function(t,i,n,s){var o=e[t];i=r(i,!0),e.util.enlivenPatterns([i.fill,i.stroke],function(t){void 0!==t[0]&&(i.fill=t[0]),void 0!==t[1]&&(i.stroke=t[1]);var e=s?new o(i[s],i):new o(i);n&&n(e)})},e.Object.__uid=0)}("undefined"!=typeof exports?exports:this),function(){var t=fabric.util.degreesToRadians,e={left:-.5,center:0,right:.5},i={top:-.5,center:0,bottom:.5};fabric.util.object.extend(fabric.Object.prototype,{translateToGivenOrigin:function(t,r,n,s,o){var a,h,c,l=t.x,u=t.y;return"string"==typeof r?r=e[r]:r-=.5,"string"==typeof s?s=e[s]:s-=.5,a=s-r,"string"==typeof n?n=i[n]:n-=.5,"string"==typeof o?o=i[o]:o-=.5,h=o-n,(a||h)&&(c=this._getTransformedDimensions(),l=t.x+a*c.x,u=t.y+h*c.y),new fabric.Point(l,u)},translateToCenterPoint:function(e,i,r){var n=this.translateToGivenOrigin(e,i,r,"center","center");return this.angle?fabric.util.rotatePoint(n,e,t(this.angle)):n},translateToOriginPoint:function(e,i,r){var n=this.translateToGivenOrigin(e,"center","center",i,r);return this.angle?fabric.util.rotatePoint(n,e,t(this.angle)):n},getCenterPoint:function(){var t=new fabric.Point(this.left,this.top);return this.translateToCenterPoint(t,this.originX,this.originY)},getPointByOrigin:function(t,e){var i=this.getCenterPoint();return this.translateToOriginPoint(i,t,e)},toLocalPoint:function(e,i,r){var n,s,o=this.getCenterPoint();return n=void 0!==i&&void 0!==r?this.translateToGivenOrigin(o,"center","center",i,r):new fabric.Point(this.left,this.top),s=new fabric.Point(e.x,e.y),this.angle&&(s=fabric.util.rotatePoint(s,o,-t(this.angle))),s.subtractEquals(n)},setPositionByOrigin:function(t,e,i){var r=this.translateToCenterPoint(t,e,i),n=this.translateToOriginPoint(r,this.originX,this.originY);this.set("left",n.x),this.set("top",n.y)},adjustPosition:function(i){var r,n,s=t(this.angle),o=this.getScaledWidth(),a=Math.cos(s)*o,h=Math.sin(s)*o;r="string"==typeof this.originX?e[this.originX]:this.originX-.5,n="string"==typeof i?e[i]:i-.5,this.left+=a*(n-r),this.top+=h*(n-r),this.setCoords(),this.originX=i},_setOriginToCenter:function(){this._originalOriginX=this.originX,this._originalOriginY=this.originY;var t=this.getCenterPoint();this.originX="center",this.originY="center",this.left=t.x,this.top=t.y},_resetOrigin:function(){var t=this.translateToOriginPoint(this.getCenterPoint(),this._originalOriginX,this._originalOriginY);this.originX=this._originalOriginX,this.originY=this._originalOriginY,this.left=t.x,this.top=t.y,this._originalOriginX=null,this._originalOriginY=null},_getLeftTopCoords:function(){return this.translateToOriginPoint(this.getCenterPoint(),"left","top")},onDeselect:function(){}})}(),function(){function t(t){return[new fabric.Point(t.tl.x,t.tl.y),new fabric.Point(t.tr.x,t.tr.y),new fabric.Point(t.br.x,t.br.y),new fabric.Point(t.bl.x,t.bl.y)]}var e=fabric.util.degreesToRadians,i=fabric.util.multiplyTransformMatrices;fabric.util.object.extend(fabric.Object.prototype,{oCoords:null,aCoords:null,ownMatrixCache:null,matrixCache:null,getCoords:function(e,i){this.oCoords||this.setCoords();var r=e?this.aCoords:this.oCoords;return t(i?this.calcCoords(e):r)},intersectsWithRect:function(t,e,i,r){var n=this.getCoords(i,r);return"Intersection"===fabric.Intersection.intersectPolygonRectangle(n,t,e).status},intersectsWithObject:function(t,e,i){return"Intersection"===fabric.Intersection.intersectPolygonPolygon(this.getCoords(e,i),t.getCoords(e,i)).status||t.isContainedWithinObject(this,e,i)||this.isContainedWithinObject(t,e,i)},isContainedWithinObject:function(t,e,i){for(var r=this.getCoords(e,i),n=0,s=t._getImageLines(i?t.calcCoords(e):e?t.aCoords:t.oCoords);n<4;n++)if(!t.containsPoint(r[n],s))return!1;return!0},isContainedWithinRect:function(t,e,i,r){var n=this.getBoundingRect(i,r);return n.left>=t.x&&n.left+n.width<=e.x&&n.top>=t.y&&n.top+n.height<=e.y},containsPoint:function(t,e,i,r){var e=e||this._getImageLines(r?this.calcCoords(i):i?this.aCoords:this.oCoords),n=this._findCrossPoints(t,e);return 0!==n&&n%2==1},isOnScreen:function(t){if(!this.canvas)return!1;for(var e,i=this.canvas.vptCoords.tl,r=this.canvas.vptCoords.br,n=this.getCoords(!0,t),s=0;s<4;s++)if((e=n[s]).x<=r.x&&e.x>=i.x&&e.y<=r.y&&e.y>=i.y)return!0;if(this.intersectsWithRect(i,r,!0))return!0;var o={x:(i.x+r.x)/2,y:(i.y+r.y)/2};return!!this.containsPoint(o,null,!0)},_getImageLines:function(t){return{topline:{o:t.tl,d:t.tr},rightline:{o:t.tr,d:t.br},bottomline:{o:t.br,d:t.bl},leftline:{o:t.bl,d:t.tl}}},_findCrossPoints:function(t,e){var i,r,n,s,o=0;for(var a in e)if(!((s=e[a]).o.y=t.y&&s.d.y>=t.y||(s.o.x===s.d.x&&s.o.x>=t.x?n=s.o.x:(i=0,r=(s.d.y-s.o.y)/(s.d.x-s.o.x),n=-(t.y-i*t.x-(s.o.y-r*s.o.x))/(i-r)),n>=t.x&&(o+=1),2!==o)))break;return o},getBoundingRect:function(t,e){var i=this.getCoords(t,e);return fabric.util.makeBoundingBoxFromPoints(i)},getScaledWidth:function(){return this._getTransformedDimensions().x},getScaledHeight:function(){return this._getTransformedDimensions().y},_constrainScale:function(t){return Math.abs(t)0?Math.atan(o/s):0,l=s/Math.cos(c)/2,u=Math.cos(c+i)*l,f=Math.sin(c+i)*l,d=this.getCenterPoint(),g=t?d:fabric.util.transformPoint(d,r),p=new fabric.Point(g.x-u,g.y-f),v=new fabric.Point(p.x+s*h,p.y+s*a),m=new fabric.Point(p.x-o*a,p.y+o*h),b=new fabric.Point(g.x+u,g.y+f);if(!t)var _=new fabric.Point((p.x+m.x)/2,(p.y+m.y)/2),y=new fabric.Point((v.x+p.x)/2,(v.y+p.y)/2),x=new fabric.Point((b.x+v.x)/2,(b.y+v.y)/2),C=new fabric.Point((b.x+m.x)/2,(b.y+m.y)/2),S=new fabric.Point(y.x+a*this.rotatingPointOffset,y.y-h*this.rotatingPointOffset);g={tl:p,tr:v,br:b,bl:m};return t||(g.ml=_,g.mt=y,g.mr=x,g.mb=C,g.mtr=S),g},setCoords:function(t,e){return this.oCoords=this.calcCoords(t),e||(this.aCoords=this.calcCoords(!0)),t||this._setCornerCoords&&this._setCornerCoords(),this},_calcRotateMatrix:function(){if(this.angle){var t=e(this.angle),i=Math.cos(t),r=Math.sin(t);return 6.123233995736766e-17!==i&&-1.8369701987210297e-16!==i||(i=0),[i,r,-r,i,0,0]}return fabric.iMatrix.concat()},transformMatrixKey:function(t){var e="";return!t&&this.group&&(e=this.group.transformMatrixKey(t)+"_"),e+this.top+"_"+this.left+"_"+this.scaleX+"_"+this.scaleY+"_"+this.skewX+"_"+this.skewY+"_"+this.angle+"_"+this.flipX+"_"+this.flipY+"_"+this.width+"_"+this.height},calcTransformMatrix:function(t){if(t)return this.calcOwnMatrix();var e=this.transformMatrixKey(),r=this.matrixCache||(this.matrixCache={});if(r.key===e)return r.value;var n=this.calcOwnMatrix();return this.group&&(n=i(this.group.calcTransformMatrix(),n)),r.key=e,r.value=n,n},calcOwnMatrix:function(){var t=this.transformMatrixKey(!0),e=this.ownMatrixCache||(this.ownMatrixCache={});if(e.key===t)return e.value;var r,n=this.getCenterPoint(),s=[1,0,0,1,n.x,n.y],o=this._calcDimensionsTransformMatrix(this.skewX,this.skewY,!0);return this.angle&&(r=this._calcRotateMatrix(),s=i(s,r)),s=i(s,o),e.key=t,e.value=s,s},_calcDimensionsTransformMatrix:function(t,r,n){var s,o=[this.scaleX*(n&&this.flipX?-1:1),0,0,this.scaleY*(n&&this.flipY?-1:1),0,0];return t&&(s=[1,0,Math.tan(e(t)),1],o=i(o,s,!0)),r&&(s=[1,Math.tan(e(r)),0,1],o=i(o,s,!0)),o},_getNonTransformedDimensions:function(){var t=this.strokeWidth;return{x:this.width+t,y:this.height+t}},_getTransformedDimensions:function(t,e){void 0===t&&(t=this.skewX),void 0===e&&(e=this.skewY);var i,r,n=this._getNonTransformedDimensions(),s=n.x/2,o=n.y/2,a=[{x:-s,y:-o},{x:s,y:-o},{x:-s,y:o},{x:s,y:o}],h=this._calcDimensionsTransformMatrix(t,e,!1);for(i=0;i\n')},_createBaseSVGMarkup:function(){var t=[];return this.fill&&this.fill.toLive&&t.push(this.fill.toSVG(this,!1)),this.stroke&&this.stroke.toLive&&t.push(this.stroke.toSVG(this,!1)),this.shadow&&t.push(this.shadow.toSVG(this)),t},addPaintOrder:function(){return"fill"!==this.paintFirst?' paint-order="'+this.paintFirst+'" ':""}})}(),function(){function t(t,e,r){var n={};r.forEach(function(e){n[e]=t[e]}),i(t[e],n,!0)}function e(t,i,r){if(t===i)return!0;if(Array.isArray(t)){if(t.length!==i.length)return!1;for(var n=0,s=t.length;n\n'),t?t(e.join("")):e.join("")}}),i.Line.ATTRIBUTE_NAMES=i.SHARED_ATTRIBUTES.concat("x1 y1 x2 y2".split(" ")),i.Line.fromElement=function(t,e,n){n=n||{};var s=i.parseAttributes(t,i.Line.ATTRIBUTE_NAMES),o=[s.x1||0,s.y1||0,s.x2||0,s.y2||0];e(new i.Line(o,r(s,n)))},i.Line.fromObject=function(t,e){var r=n(t,!0);r.points=[t.x1,t.y1,t.x2,t.y2],i.Object._fromObject("Line",r,function(t){delete t.points,e&&e(t)},"points")})}("undefined"!=typeof exports?exports:this),function(t){"use strict";function e(t){return"radius"in t&&t.radius>=0}var i=t.fabric||(t.fabric={}),r=Math.PI,n=i.util.object.extend;i.Circle?i.warn("fabric.Circle is already defined."):(i.Circle=i.util.createClass(i.Object,{type:"circle",radius:0,startAngle:0,endAngle:2*r,cacheProperties:i.Object.prototype.cacheProperties.concat("radius"),initialize:function(t){this.callSuper("initialize",t),this.set("radius",t&&t.radius||0)},_set:function(t,e){return this.callSuper("_set",t,e),"radius"===t&&this.setRadius(e),this},toObject:function(t){return this.callSuper("toObject",["radius","startAngle","endAngle"].concat(t))},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=(this.endAngle-this.startAngle)%(2*r);if(0===i)e.push("\n");else{var n=Math.cos(this.startAngle)*this.radius,s=Math.sin(this.startAngle)*this.radius,o=Math.cos(this.endAngle)*this.radius,a=Math.sin(this.endAngle)*this.radius,h=i>r?"1":"0";e.push('\n')}return t?t(e.join("")):e.join("")},_render:function(t){t.beginPath(),t.arc(0,0,this.radius,this.startAngle,this.endAngle,!1),this._renderPaintInOrder(t)},getRadiusX:function(){return this.get("radius")*this.get("scaleX")},getRadiusY:function(){return this.get("radius")*this.get("scaleY")},setRadius:function(t){return this.radius=t,this.set("width",2*t).set("height",2*t)}}),i.Circle.ATTRIBUTE_NAMES=i.SHARED_ATTRIBUTES.concat("cx cy r".split(" ")),i.Circle.fromElement=function(t,r,s){s||(s={});var o=i.parseAttributes(t,i.Circle.ATTRIBUTE_NAMES);if(!e(o))throw new Error("value of `r` attribute is required and can not be negative");o.left=(o.left||0)-o.radius,o.top=(o.top||0)-o.radius,r(new i.Circle(n(o,s)))},i.Circle.fromObject=function(t,e){return i.Object._fromObject("Circle",t,e)})}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={});e.Triangle?e.warn("fabric.Triangle is already defined"):(e.Triangle=e.util.createClass(e.Object,{type:"triangle",initialize:function(t){this.callSuper("initialize",t),this.set("width",t&&t.width||100).set("height",t&&t.height||100)},_render:function(t){var e=this.width/2,i=this.height/2;t.beginPath(),t.moveTo(-e,i),t.lineTo(0,-i),t.lineTo(e,i),t.closePath(),this._renderPaintInOrder(t)},_renderDashedStroke:function(t){var i=this.width/2,r=this.height/2;t.beginPath(),e.util.drawDashedLine(t,-i,r,0,-r,this.strokeDashArray),e.util.drawDashedLine(t,0,-r,i,r,this.strokeDashArray),e.util.drawDashedLine(t,i,r,-i,r,this.strokeDashArray),t.closePath()},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=this.width/2,r=this.height/2,n=[-i+" "+r,"0 "+-r,i+" "+r].join(",");return e.push(""),t?t(e.join("")):e.join("")}}),e.Triangle.fromObject=function(t,i){return e.Object._fromObject("Triangle",t,i)})}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=2*Math.PI,r=e.util.object.extend;e.Ellipse?e.warn("fabric.Ellipse is already defined."):(e.Ellipse=e.util.createClass(e.Object,{type:"ellipse",rx:0,ry:0,cacheProperties:e.Object.prototype.cacheProperties.concat("rx","ry"),initialize:function(t){this.callSuper("initialize",t),this.set("rx",t&&t.rx||0),this.set("ry",t&&t.ry||0)},_set:function(t,e){switch(this.callSuper("_set",t,e),t){case"rx":this.rx=e,this.set("width",2*e);break;case"ry":this.ry=e,this.set("height",2*e)}return this},getRx:function(){return this.get("rx")*this.get("scaleX")},getRy:function(){return this.get("ry")*this.get("scaleY")},toObject:function(t){return this.callSuper("toObject",["rx","ry"].concat(t))},toSVG:function(t){var e=this._createBaseSVGMarkup();return e.push("\n"),t?t(e.join("")):e.join("")},_render:function(t){t.beginPath(),t.save(),t.transform(1,0,0,this.ry/this.rx,0,0),t.arc(0,0,this.rx,0,i,!1),t.restore(),this._renderPaintInOrder(t)}}),e.Ellipse.ATTRIBUTE_NAMES=e.SHARED_ATTRIBUTES.concat("cx cy rx ry".split(" ")),e.Ellipse.fromElement=function(t,i,n){n||(n={});var s=e.parseAttributes(t,e.Ellipse.ATTRIBUTE_NAMES);s.left=(s.left||0)-s.rx,s.top=(s.top||0)-s.ry,i(new e.Ellipse(r(s,n)))},e.Ellipse.fromObject=function(t,i){return e.Object._fromObject("Ellipse",t,i)})}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend;e.Rect?e.warn("fabric.Rect is already defined"):(e.Rect=e.util.createClass(e.Object,{stateProperties:e.Object.prototype.stateProperties.concat("rx","ry"),type:"rect",rx:0,ry:0,cacheProperties:e.Object.prototype.cacheProperties.concat("rx","ry"),initialize:function(t){this.callSuper("initialize",t),this._initRxRy()},_initRxRy:function(){this.rx&&!this.ry?this.ry=this.rx:this.ry&&!this.rx&&(this.rx=this.ry)},_render:function(t){if(1!==this.width||1!==this.height){var e=this.rx?Math.min(this.rx,this.width/2):0,i=this.ry?Math.min(this.ry,this.height/2):0,r=this.width,n=this.height,s=-this.width/2,o=-this.height/2,a=0!==e||0!==i,h=.4477152502;t.beginPath(),t.moveTo(s+e,o),t.lineTo(s+r-e,o),a&&t.bezierCurveTo(s+r-h*e,o,s+r,o+h*i,s+r,o+i),t.lineTo(s+r,o+n-i),a&&t.bezierCurveTo(s+r,o+n-h*i,s+r-h*e,o+n,s+r-e,o+n),t.lineTo(s+e,o+n),a&&t.bezierCurveTo(s+h*e,o+n,s,o+n-h*i,s,o+n-i),t.lineTo(s,o+i),a&&t.bezierCurveTo(s,o+h*i,s+h*e,o,s+e,o),t.closePath(),this._renderPaintInOrder(t)}else t.fillRect(-.5,-.5,1,1)},_renderDashedStroke:function(t){var i=-this.width/2,r=-this.height/2,n=this.width,s=this.height;t.beginPath(),e.util.drawDashedLine(t,i,r,i+n,r,this.strokeDashArray),e.util.drawDashedLine(t,i+n,r,i+n,r+s,this.strokeDashArray),e.util.drawDashedLine(t,i+n,r+s,i,r+s,this.strokeDashArray),e.util.drawDashedLine(t,i,r+s,i,r,this.strokeDashArray),t.closePath()},toObject:function(t){return this.callSuper("toObject",["rx","ry"].concat(t))},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=-this.width/2,r=-this.height/2;return e.push("\n"),t?t(e.join("")):e.join("")}}),e.Rect.ATTRIBUTE_NAMES=e.SHARED_ATTRIBUTES.concat("x y rx ry width height".split(" ")),e.Rect.fromElement=function(t,r,n){if(!t)return r(null);n=n||{};var s=e.parseAttributes(t,e.Rect.ATTRIBUTE_NAMES);s.left=s.left||0,s.top=s.top||0;var o=new e.Rect(i(n?e.util.object.clone(n):{},s));o.visible=o.visible&&o.width>0&&o.height>0,r(o)},e.Rect.fromObject=function(t,i){return e.Object._fromObject("Rect",t,i)})}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend,r=e.util.array.min,n=e.util.array.max,s=e.util.toFixed,o=e.Object.NUM_FRACTION_DIGITS;e.Polyline?e.warn("fabric.Polyline is already defined"):(e.Polyline=e.util.createClass(e.Object,{type:"polyline",points:null,cacheProperties:e.Object.prototype.cacheProperties.concat("points"),initialize:function(t,e){e=e||{},this.points=t||[],this.callSuper("initialize",e);var i=this._calcDimensions();void 0===e.left&&(this.left=i.left),void 0===e.top&&(this.top=i.top),this.width=i.width,this.height=i.height,this.pathOffset={x:i.left+this.width/2,y:i.top+this.height/2}},_calcDimensions:function(){var t=this.points,e=r(t,"x")||0,i=r(t,"y")||0;return{left:e,top:i,width:(n(t,"x")||0)-e,height:(n(t,"y")||0)-i}},toObject:function(t){return i(this.callSuper("toObject",t),{points:this.points.concat()})},toSVG:function(t){for(var e=[],i=this.pathOffset.x,r=this.pathOffset.y,n=this._createBaseSVGMarkup(),a=0,h=this.points.length;a\n"),t?t(n.join("")):n.join("")},commonRender:function(t){var e,i=this.points.length,r=this.pathOffset.x,n=this.pathOffset.y;if(!i||isNaN(this.points[i-1].y))return!1;t.beginPath(),t.moveTo(this.points[0].x-r,this.points[0].y-n);for(var s=0;s"},toObject:function(t){return n(this.callSuper("toObject",t),{path:this.path.map(function(t){return t.slice()}),top:this.top,left:this.left})},toDatalessObject:function(t){var e=this.toObject(["sourcePath"].concat(t));return e.sourcePath&&delete e.path,e},toSVG:function(t){for(var e=[],i=this._createBaseSVGMarkup(),r="",n=0,s=this.path.length;n\n"),t?t(i.join("")):i.join("")},complexity:function(){return this.path.length},_parsePath:function(){for(var t,e,i,r,n,s=[],o=[],c=/([-+]?((\d+\.\d+)|((\d+)|(\.\d+)))(?:e[-+]?\d+)?)/gi,l=0,u=this.path.length;lp)for(var m=1,b=n.length;m"},addWithUpdate:function(t){return this._restoreObjectsState(),e.util.resetObjectTransform(this),t&&(this._objects.push(t),t.group=this,t._set("canvas",this.canvas)),this._calcBounds(),this._updateObjectsCoords(),this.setCoords(),this.dirty=!0,this},removeWithUpdate:function(t){return this._restoreObjectsState(),e.util.resetObjectTransform(this),this.remove(t),this._calcBounds(),this._updateObjectsCoords(),this.setCoords(),this.dirty=!0,this},_onObjectAdded:function(t){this.dirty=!0,t.group=this,t._set("canvas",this.canvas)},_onObjectRemoved:function(t){this.dirty=!0,delete t.group},_set:function(t,e){var i=this._objects.length;if(this.useSetOnGroup)for(;i--;)this._objects[i].setOnGroup(t,e);if("canvas"===t)for(i=this._objects.length;i--;)this._objects[i]._set(t,e);this.callSuper("_set",t,e)},toObject:function(t){var e=this.getObjects().map(function(e){var i=e.includeDefaultValues;e.includeDefaultValues=e.group.includeDefaultValues;var r=e.toObject(t);return e.includeDefaultValues=i,r});return i(this.callSuper("toObject",t),{objects:e})},toDatalessObject:function(t){var e,r=this.sourcePath;return e=r||this.getObjects().map(function(e){var i=e.includeDefaultValues;e.includeDefaultValues=e.group.includeDefaultValues;var r=e.toDatalessObject(t);return e.includeDefaultValues=i,r}),i(this.callSuper("toDatalessObject",t),{objects:e})},render:function(t){this._transformDone=!0,this.callSuper("render",t),this._transformDone=!1},shouldCache:function(){var t=this.objectCaching&&(!this.group||this.needsItsOwnCache()||!this.group.isOnACache());if(this.ownCaching=t,t)for(var e=0,i=this._objects.length;e\n');for(var i=0,r=this._objects.length;i\n"),t?t(e.join("")):e.join("")}}),e.Group.fromObject=function(t,i){e.util.enlivenObjects(t.objects,function(r){var n=e.util.object.clone(t,!0);delete n.objects,i&&i(new e.Group(r,n,!0))})})}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={});e.ActiveSelection||(e.ActiveSelection=e.util.createClass(e.Group,{type:"activeSelection",initialize:function(t,i){i=i||{},this._objects=t||[];for(var r=this._objects.length;r--;)this._objects[r].group=this;i.originX&&(this.originX=i.originX),i.originY&&(this.originY=i.originY),this._calcBounds(),this._updateObjectsCoords(),e.Object.prototype.initialize.call(this,i),this.setCoords()},toGroup:function(){var t=this._objects;this._objects=[];var i=this.toObject(),r=new e.Group([]);if(delete i.objects,r.set(i),r.type="group",t.forEach(function(t){t.group=r,t.canvas.remove(t)}),r._objects=t,!this.canvas)return r;var n=this.canvas;return n.add(r),n._activeObject=r,r.setCoords(),r},onDeselect:function(){return this.destroy(),!1},toString:function(){return"#"},_set:function(t,i){var r=this._objects.length;if("canvas"===t)for(;r--;)this._objects[r].set(t,i);if(this.useSetOnGroup)for(;r--;)this._objects[r].setOnGroup(t,i);e.Object.prototype._set.call(this,t,i)},shouldCache:function(){return!1},willDrawShadow:function(){if(this.shadow)return this.callSuper("willDrawShadow");for(var t=0,e=this._objects.length;t\n');var n=["\t\n'];if("fill"===this.paintFirst&&Array.prototype.push.apply(e,n),this.stroke||this.strokeDashArray){var s=this.fill;this.fill=null,e.push("\t\n'),this.fill=s}return"fill"!==this.paintFirst&&Array.prototype.push.apply(e,n),e.push("\n"),t?t(e.join("")):e.join("")},getSrc:function(t){var e=t?this._element:this._originalElement;return e?e.toDataURL?e.toDataURL():e.src:this.src||""},setSrc:function(t,e,i){return fabric.util.loadImage(t,function(t){this.setElement(t,i),e(this)},this,i&&i.crossOrigin),this},toString:function(){return'#'},applyResizeFilters:function(){var t=this.resizeFilter,e=this.canvas?this.canvas.getRetinaScaling():1,i=this.minimumScaleTrigger,r=this.scaleX*e,n=this.scaleY*e,s=this._filteredEl||this._originalElement;if(!t||r>i&&n>i)return this._element=s,this._filterScalingX=1,void(this._filterScalingY=1);fabric.filterBackend||(fabric.filterBackend=fabric.initFilterBackend());var o=fabric.util.createCanvasElement(),a=this._filteredEl?this.cacheKey:this.cacheKey+"_filtered",h=s.width,c=s.height;o.width=h,o.height=c,this._element=o,t.scaleX=r,t.scaleY=n,fabric.filterBackend.applyFilters([t],s,h,c,this._element,a),this._filterScalingX=o.width/this._originalElement.width,this._filterScalingY=o.height/this._originalElement.height},applyFilters:function(t){if(t=t||this.filters||[],0===(t=t.filter(function(t){return t})).length)return this._element=this._originalElement,this._filteredEl=null,this._filterScalingX=1,this._filterScalingY=1,this;var e=this._originalElement,i=e.naturalWidth||e.width,r=e.naturalHeight||e.height;if(this._element===this._originalElement){var n=fabric.util.createCanvasElement();n.width=i,n.height=r,this._element=n,this._filteredEl=n}else this._element.getContext("2d").clearRect(0,0,i,r);return fabric.filterBackend||(fabric.filterBackend=fabric.initFilterBackend()),fabric.filterBackend.applyFilters(t,this._originalElement,i,r,this._element,this.cacheKey),this._originalElement.width===this._element.width&&this._originalElement.height===this._element.height||(this._filterScalingX=this._element.width/this._originalElement.width,this._filterScalingY=this._element.height/this._originalElement.height),this},_render:function(t){!1===this.isMoving&&this.resizeFilter&&this._needsResize()&&(this._lastScaleX=this.scaleX,this._lastScaleY=this.scaleY,this.applyResizeFilters()),this._stroke(t),this._renderPaintInOrder(t)},_renderFill:function(t){var e=this.width,i=this.height,r=e*this._filterScalingX,n=i*this._filterScalingY,s=-e/2,o=-i/2,a=this._element;a&&t.drawImage(a,this.cropX*this._filterScalingX,this.cropY*this._filterScalingY,r,n,s,o,e,i)},_needsResize:function(){return this.scaleX!==this._lastScaleX||this.scaleY!==this._lastScaleY},_resetWidthHeight:function(){var t=this.getElement();this.set("width",t.width),this.set("height",t.height)},_initElement:function(t,e){this.setElement(fabric.util.getById(t),e),fabric.util.addClass(this.getElement(),fabric.Image.CSS_CANVAS)},_initConfig:function(t){t||(t={}),this.setOptions(t),this._setWidthHeight(t),this._element&&this.crossOrigin&&(this._element.crossOrigin=this.crossOrigin)},_initFilters:function(t,e){t&&t.length?fabric.util.enlivenObjects(t,function(t){e&&e(t)},"fabric.Image.filters"):e&&e()},_setWidthHeight:function(t){this.width="width"in t?t.width:this.getElement()?this.getElement().width||0:0,this.height="height"in t?t.height:this.getElement()?this.getElement().height||0:0},parsePreserveAspectRatioAttribute:function(){var t,e=fabric.util.parsePreserveAspectRatioAttribute(this.preserveAspectRatio||""),i=this._element.width,r=this._element.height,n=1,s=1,o=0,a=0,h=0,c=0,l=this.width,u=this.height,f={width:l,height:u};return!e||"none"===e.alignX&&"none"===e.alignY?(n=l/i,s=u/r):("meet"===e.meetOrSlice&&(t=(l-i*(n=s=fabric.util.findScaleToFit(this._element,f)))/2,"Min"===e.alignX&&(o=-t),"Max"===e.alignX&&(o=t),t=(u-r*s)/2,"Min"===e.alignY&&(a=-t),"Max"===e.alignY&&(a=t)),"slice"===e.meetOrSlice&&(t=i-l/(n=s=fabric.util.findScaleToCover(this._element,f)),"Mid"===e.alignX&&(h=t/2),"Max"===e.alignX&&(h=t),t=r-u/s,"Mid"===e.alignY&&(c=t/2),"Max"===e.alignY&&(c=t),i=l/n,r=u/s)),{width:i,height:r,scaleX:n,scaleY:s,offsetLeft:o,offsetTop:a,cropX:h,cropY:c}}}),fabric.Image.CSS_CANVAS="canvas-img",fabric.Image.prototype.getSvgSrc=fabric.Image.prototype.getSrc,fabric.Image.fromObject=function(t,e){fabric.util.loadImage(t.src,function(i,r){r?e&&e(null,r):fabric.Image.prototype._initFilters.call(t,t.filters,function(r){t.filters=r||[],fabric.Image.prototype._initFilters.call(t,[t.resizeFilter],function(r){t.resizeFilter=r[0];var n=new fabric.Image(i,t);e(n)})})},null,t.crossOrigin)},fabric.Image.fromURL=function(t,e,i){fabric.util.loadImage(t,function(t){e&&e(new fabric.Image(t,i))},null,i&&i.crossOrigin)},fabric.Image.ATTRIBUTE_NAMES=fabric.SHARED_ATTRIBUTES.concat("x y width height preserveAspectRatio xlink:href crossOrigin".split(" ")),fabric.Image.fromElement=function(t,i,r){var n=fabric.parseAttributes(t,fabric.Image.ATTRIBUTE_NAMES);fabric.Image.fromURL(n["xlink:href"],i,e(r?fabric.util.object.clone(r):{},n))})}("undefined"!=typeof exports?exports:this),fabric.util.object.extend(fabric.Object.prototype,{_getAngleValueForStraighten:function(){var t=this.angle%360;return t>0?90*Math.round((t-1)/90):90*Math.round(t/90)},straighten:function(){return this.rotate(this._getAngleValueForStraighten()),this},fxStraighten:function(t){var e=function(){},i=(t=t||{}).onComplete||e,r=t.onChange||e,n=this;return fabric.util.animate({startValue:this.get("angle"),endValue:this._getAngleValueForStraighten(),duration:this.FX_DURATION,onChange:function(t){n.rotate(t),r()},onComplete:function(){n.setCoords(),i()}}),this}}),fabric.util.object.extend(fabric.StaticCanvas.prototype,{straightenObject:function(t){return t.straighten(),this.requestRenderAll(),this},fxStraightenObject:function(t){return t.fxStraighten({onChange:this.requestRenderAllBound}),this}}),function(){"use strict";function t(t,e){var i="precision "+e+" float;\nvoid main(){}",r=t.createShader(t.FRAGMENT_SHADER);return t.shaderSource(r,i),t.compileShader(r),!!t.getShaderParameter(r,t.COMPILE_STATUS)}function e(t){t&&t.tileSize&&(this.tileSize=t.tileSize),this.setupGLContext(this.tileSize,this.tileSize),this.captureGPUInfo()}fabric.isWebglSupported=function(e){if(fabric.isLikelyNode)return!1;e=e||fabric.WebglFilterBackend.prototype.tileSize;var i=document.createElement("canvas"),r=i.getContext("webgl")||i.getContext("experimental-webgl"),n=!1;if(r){fabric.maxTextureSize=r.getParameter(r.MAX_TEXTURE_SIZE),n=fabric.maxTextureSize>=e;for(var s=["highp","mediump","lowp"],o=0;o<3;o++)if(t(r,s[o])){fabric.webGlPrecision=s[o];break}}return this.isSupported=n,n},fabric.WebglFilterBackend=e,e.prototype={tileSize:2048,resources:{},setupGLContext:function(t,e){this.dispose(),this.createWebGLCanvas(t,e),this.aPosition=new Float32Array([0,0,0,1,1,0,1,1]),this.chooseFastestCopyGLTo2DMethod(t,e)},chooseFastestCopyGLTo2DMethod:function(t,e){var i,r=void 0!==window.performance;try{new ImageData(1,1),i=!0}catch(t){i=!1}var n="undefined"!=typeof ArrayBuffer,s="undefined"!=typeof Uint8ClampedArray;if(r&&i&&n&&s){var o,a,h=fabric.util.createCanvasElement(),c=new ArrayBuffer(t*e*4),l={imageBuffer:c,destinationWidth:t,destinationHeight:e,targetCanvas:h};h.width=t,h.height=e,o=window.performance.now(),copyGLTo2DDrawImage.call(l,this.gl,l),a=window.performance.now()-o,o=window.performance.now(),copyGLTo2DPutImageData.call(l,this.gl,l),a>window.performance.now()-o?(this.imageBuffer=c,this.copyGLTo2D=copyGLTo2DPutImageData):this.copyGLTo2D=copyGLTo2DDrawImage}},createWebGLCanvas:function(t,e){var i=fabric.util.createCanvasElement();i.width=t,i.height=e;var r={premultipliedAlpha:!1},n=i.getContext("webgl",r);n||(n=i.getContext("experimental-webgl",r)),n&&(n.clearColor(0,0,0,0),this.canvas=i,this.gl=n)},applyFilters:function(t,e,i,r,n,s){var o,a=this.gl;s&&(o=this.getCachedTexture(s,e));var h={originalWidth:e.width||e.originalWidth,originalHeight:e.height||e.originalHeight,sourceWidth:i,sourceHeight:r,destinationWidth:i,destinationHeight:r,context:a,sourceTexture:this.createTexture(a,i,r,!o&&e),targetTexture:this.createTexture(a,i,r),originalTexture:o||this.createTexture(a,i,r,!o&&e),passes:t.length,webgl:!0,aPosition:this.aPosition,programCache:this.programCache,pass:0,filterBackend:this,targetCanvas:n},c=a.createFramebuffer();return a.bindFramebuffer(a.FRAMEBUFFER,c),t.forEach(function(t){t&&t.applyTo(h)}),resizeCanvasIfNeeded(h),this.copyGLTo2D(a,h),a.bindTexture(a.TEXTURE_2D,null),a.deleteTexture(h.sourceTexture),a.deleteTexture(h.targetTexture),a.deleteFramebuffer(c),n.getContext("2d").setTransform(1,0,0,1,0,0),h},applyFiltersDebug:function(t,e,i,r,n,s){var o=this.gl,a=this.applyFilters(t,e,i,r,n,s),h=o.getError();if(h!==o.NO_ERROR){var c=this.glErrorToString(o,h),l=new Error("WebGL Error "+c);throw l.glErrorCode=h,l}return a},glErrorToString:function(t,e){if(!t)return"Context undefined for error code: "+e;if("number"!=typeof e)return"Error code is not a number";switch(e){case t.NO_ERROR:return"NO_ERROR";case t.INVALID_ENUM:return"INVALID_ENUM";case t.INVALID_VALUE:return"INVALID_VALUE";case t.INVALID_OPERATION:return"INVALID_OPERATION";case t.INVALID_FRAMEBUFFER_OPERATION:return"INVALID_FRAMEBUFFER_OPERATION";case t.OUT_OF_MEMORY:return"OUT_OF_MEMORY";case t.CONTEXT_LOST_WEBGL:return"CONTEXT_LOST_WEBGL";default:return"UNKNOWN_ERROR"}},dispose:function(){this.canvas&&(this.canvas=null,this.gl=null),this.clearWebGLCaches()},clearWebGLCaches:function(){this.programCache={},this.textureCache={}},createTexture:function(t,e,i,r){var n=t.createTexture();return t.bindTexture(t.TEXTURE_2D,n),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),r?t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,r):t.texImage2D(t.TEXTURE_2D,0,t.RGBA,e,i,0,t.RGBA,t.UNSIGNED_BYTE,null),n},getCachedTexture:function(t,e){if(this.textureCache[t])return this.textureCache[t];var i=this.createTexture(this.gl,e.width,e.height,e);return this.textureCache[t]=i,i},evictCachesForKey:function(t){this.textureCache[t]&&(this.gl.deleteTexture(this.textureCache[t]),delete this.textureCache[t])},copyGLTo2D:copyGLTo2DDrawImage,captureGPUInfo:function(){if(this.gpuInfo)return this.gpuInfo;var t=this.gl,e=t.getExtension("WEBGL_debug_renderer_info"),i={renderer:"",vendor:""};if(e){var r=t.getParameter(e.UNMASKED_RENDERER_WEBGL),n=t.getParameter(e.UNMASKED_VENDOR_WEBGL);r&&(i.renderer=r.toLowerCase()),n&&(i.vendor=n.toLowerCase())}return this.gpuInfo=i,i}}}(),function(){"use strict";function t(){}var e=function(){};fabric.Canvas2dFilterBackend=t,t.prototype={evictCachesForKey:e,dispose:e,clearWebGLCaches:e,resources:{},applyFilters:function(t,e,i,r,n){var s=n.getContext("2d");s.drawImage(e,0,0,i,r);var o={sourceWidth:i,sourceHeight:r,imageData:s.getImageData(0,0,i,r),originalEl:e,originalImageData:s.getImageData(0,0,i,r),canvasEl:n,ctx:s,filterBackend:this};return t.forEach(function(t){t.applyTo(o)}),o.imageData.width===i&&o.imageData.height===r||(n.width=o.imageData.width,n.height=o.imageData.height),s.putImageData(o.imageData,0,0),o}}}(),fabric.Image.filters=fabric.Image.filters||{},fabric.Image.filters.BaseFilter=fabric.util.createClass({type:"BaseFilter",vertexSource:"attribute vec2 aPosition;\nvarying vec2 vTexCoord;\nvoid main() {\nvTexCoord = aPosition;\ngl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n}",fragmentSource:"precision highp float;\nvarying vec2 vTexCoord;\nuniform sampler2D uTexture;\nvoid main() {\ngl_FragColor = texture2D(uTexture, vTexCoord);\n}",initialize:function(t){t&&this.setOptions(t)},setOptions:function(t){for(var e in t)this[e]=t[e]},createProgram:function(t,e,i){e=e||this.fragmentSource,i=i||this.vertexSource,"highp"!==fabric.webGlPrecision&&(e=e.replace(/precision highp float/g,"precision "+fabric.webGlPrecision+" float"));var r=t.createShader(t.VERTEX_SHADER);if(t.shaderSource(r,i),t.compileShader(r),!t.getShaderParameter(r,t.COMPILE_STATUS))throw new Error("Vertex shader compile error for "+this.type+": "+t.getShaderInfoLog(r));var n=t.createShader(t.FRAGMENT_SHADER);if(t.shaderSource(n,e),t.compileShader(n),!t.getShaderParameter(n,t.COMPILE_STATUS))throw new Error("Fragment shader compile error for "+this.type+": "+t.getShaderInfoLog(n));var s=t.createProgram();if(t.attachShader(s,r),t.attachShader(s,n),t.linkProgram(s),!t.getProgramParameter(s,t.LINK_STATUS))throw new Error('Shader link error for "${this.type}" '+t.getProgramInfoLog(s));var o=this.getAttributeLocations(t,s),a=this.getUniformLocations(t,s)||{};return a.uStepW=t.getUniformLocation(s,"uStepW"),a.uStepH=t.getUniformLocation(s,"uStepH"),{program:s,attributeLocations:o,uniformLocations:a}},getAttributeLocations:function(t,e){return{aPosition:t.getAttribLocation(e,"aPosition")}},getUniformLocations:function(){return{}},sendAttributeData:function(t,e,i){var r=e.aPostion,n=t.createBuffer();t.bindBuffer(t.ARRAY_BUFFER,n),t.enableVertexAttribArray(r),t.vertexAttribPointer(r,2,t.FLOAT,!1,0,0),t.bufferData(t.ARRAY_BUFFER,i,t.STATIC_DRAW)},_setupFrameBuffer:function(t){var e,i,r=t.context;t.passes>1?(e=t.destinationWidth,i=t.destinationHeight,t.sourceWidth===e&&t.sourceHeight===i||(r.deleteTexture(t.targetTexture),t.targetTexture=t.filterBackend.createTexture(r,e,i)),r.framebufferTexture2D(r.FRAMEBUFFER,r.COLOR_ATTACHMENT0,r.TEXTURE_2D,t.targetTexture,0)):(r.bindFramebuffer(r.FRAMEBUFFER,null),r.finish())},_swapTextures:function(t){t.passes--,t.pass++;var e=t.targetTexture;t.targetTexture=t.sourceTexture,t.sourceTexture=e},isNeutralState:function(){return!1},applyTo:function(t){if(t.webgl){if(t.passes>1&&this.isNeutralState(t))return;this._setupFrameBuffer(t),this.applyToWebGL(t),this._swapTextures(t)}else this.isNeutralState()||this.applyTo2d(t)},retrieveShader:function(t){return t.programCache.hasOwnProperty(this.type)||(t.programCache[this.type]=this.createProgram(t.context)),t.programCache[this.type]},applyToWebGL:function(t){var e=t.context,i=this.retrieveShader(t);0===t.pass&&t.originalTexture?e.bindTexture(e.TEXTURE_2D,t.originalTexture):e.bindTexture(e.TEXTURE_2D,t.sourceTexture),e.useProgram(i.program),this.sendAttributeData(e,i.attributeLocations,t.aPosition),e.uniform1f(i.uniformLocations.uStepW,1/t.sourceWidth),e.uniform1f(i.uniformLocations.uStepH,1/t.sourceHeight),this.sendUniformData(e,i.uniformLocations),e.viewport(0,0,t.destinationWidth,t.destinationHeight),e.drawArrays(e.TRIANGLE_STRIP,0,4)},bindAdditionalTexture:function(t,e,i){t.activeTexture(i),t.bindTexture(t.TEXTURE_2D,e),t.activeTexture(t.TEXTURE0)},unbindAdditionalTexture:function(t,e){t.activeTexture(e),t.bindTexture(t.TEXTURE_2D,null),t.activeTexture(t.TEXTURE0)},getMainParameter:function(){return this[this.mainParameter]},setMainParameter:function(t){this[this.mainParameter]=t},sendUniformData:function(){},createHelpLayer:function(t){if(!t.helpLayer){var e=document.createElement("canvas");e.width=t.sourceWidth,e.height=t.sourceHeight,t.helpLayer=e}},toObject:function(){var t={type:this.type},e=this.mainParameter;return e&&(t[e]=this[e]),t},toJSON:function(){return this.toObject()}}),fabric.Image.filters.BaseFilter.fromObject=function(t,e){var i=new fabric.Image.filters[t.type](t);return e&&e(i),i},function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.Image.filters,r=e.util.createClass;i.ColorMatrix=r(i.BaseFilter,{type:"ColorMatrix",fragmentSource:"precision highp float;\nuniform sampler2D uTexture;\nvarying vec2 vTexCoord;\nuniform mat4 uColorMatrix;\nuniform vec4 uConstants;\nvoid main() {\nvec4 color = texture2D(uTexture, vTexCoord);\ncolor *= uColorMatrix;\ncolor += uConstants;\ngl_FragColor = color;\n}",matrix:[1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0],mainParameter:"matrix",colorsOnly:!0,initialize:function(t){this.callSuper("initialize",t),this.matrix=this.matrix.slice(0)},isNeutralState:function(){for(var t=i.ColorMatrix,e=20;e--;)if(this.matrix[e]!==t.prototype.matrix[e])return!1;return!0},applyTo2d:function(t){var e,i,r,n,s,o=t.imageData.data,a=o.length,h=this.matrix,c=this.colorsOnly;for(s=0;sy||o<0||o>_||(h=4*(a*_+o),c=v[d*m+f],e+=p[h]*c,i+=p[h+1]*c,r+=p[h+2]*c,S||(n+=p[h+3]*c));C[s]=e,C[s+1]=i,C[s+2]=r,C[s+3]=S?p[s+3]:n}t.imageData=x},getUniformLocations:function(t,e){return{uMatrix:t.getUniformLocation(e,"uMatrix"),uOpaque:t.getUniformLocation(e,"uOpaque"),uHalfSize:t.getUniformLocation(e,"uHalfSize"),uSize:t.getUniformLocation(e,"uSize")}},sendUniformData:function(t,e){t.uniform1fv(e.uMatrix,this.matrix)},toObject:function(){return i(this.callSuper("toObject"),{opaque:this.opaque,matrix:this.matrix})}}),e.Image.filters.Convolute.fromObject=e.Image.filters.BaseFilter.fromObject}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.Image.filters,r=e.util.createClass;i.Grayscale=r(i.BaseFilter,{type:"Grayscale",fragmentSource:{average:"precision highp float;\nuniform sampler2D uTexture;\nvarying vec2 vTexCoord;\nvoid main() {\nvec4 color = texture2D(uTexture, vTexCoord);\nfloat average = (color.r + color.b + color.g) / 3.0;\ngl_FragColor = vec4(average, average, average, color.a);\n}",lightness:"precision highp float;\nuniform sampler2D uTexture;\nuniform int uMode;\nvarying vec2 vTexCoord;\nvoid main() {\nvec4 col = texture2D(uTexture, vTexCoord);\nfloat average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;\ngl_FragColor = vec4(average, average, average, col.a);\n}",luminosity:"precision highp float;\nuniform sampler2D uTexture;\nuniform int uMode;\nvarying vec2 vTexCoord;\nvoid main() {\nvec4 col = texture2D(uTexture, vTexCoord);\nfloat average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;\ngl_FragColor = vec4(average, average, average, col.a);\n}"},mode:"average",mainParameter:"mode",applyTo2d:function(t){var e,i,r=t.imageData.data,n=r.length,s=this.mode;for(e=0;ec[0]&&n>c[1]&&s>c[2]&&r1&&this.isNeutralState(t))return;t.passes++,this.width=t.sourceWidth,this.horizontal=!0,this.dW=Math.round(this.width*this.scaleX),this.dH=t.sourceHeight,this.tempScale=this.dW/this.width,this.taps=this.getTaps(),t.destinationWidth=this.dW,this._setupFrameBuffer(t),this.applyToWebGL(t),this._swapTextures(t),t.sourceWidth=t.destinationWidth,this.height=t.sourceHeight,this.horizontal=!1,this.dH=Math.round(this.height*this.scaleY),this.tempScale=this.dH/this.height,this.taps=this.getTaps(),t.destinationHeight=this.dH,this._setupFrameBuffer(t),this.applyToWebGL(t),this._swapTextures(t),t.sourceHeight=t.destinationHeight}else this.isNeutralState(t)||this.applyTo2d(t)},isNeutralState:function(t){var e=t.scaleX||this.scaleX,i=t.scaleY||this.scaleY;return 1===e&&1===i},lanczosCreate:function(t){return function(e){if(e>=t||e<=-t)return 0;if(e<1.1920929e-7&&e>-1.1920929e-7)return 1;var i=(e*=Math.PI)/t;return a(e)/e*a(i)/i}},applyTo2d:function(t){var e=t.imageData,i=this.scaleX,r=this.scaleY;this.rcpScaleX=1/i,this.rcpScaleY=1/r;var n,s=e.width,a=e.height,h=o(s*i),c=o(a*r);"sliceHack"===this.resizeType?n=this.sliceByTwo(t,s,a,h,c):"hermite"===this.resizeType?n=this.hermiteFastResize(t,s,a,h,c):"bilinear"===this.resizeType?n=this.bilinearFiltering(t,s,a,h,c):"lanczos"===this.resizeType&&(n=this.lanczosResize(t,s,a,h,c)),t.imageData=n},sliceByTwo:function(t,i,n,s,o){var a,h,c=t.imageData,l=!1,u=!1,f=.5*i,d=.5*n,g=e.filterBackend.resources,p=0,v=0,m=i,b=0;for(g.sliceByTwo||(g.sliceByTwo=document.createElement("canvas")),((a=g.sliceByTwo).width<1.5*i||a.height=e)){P=r(1e3*s(w-C.x)),x[P]||(x[P]={});for(var F=S.y-y;F<=S.y+y;F++)F<0||F>=o||(M=r(1e3*s(F-C.y)),x[P][M]||(x[P][M]=g(n(i(P*m,2)+i(M*b,2))/1e3)),(T=x[P][M])>0&&(k+=T,D+=T*u[O=4*(F*e+w)],j+=T*u[O+1],E+=T*u[O+2],A+=T*u[O+3]))}d[O=4*(h*a+t)]=D/k,d[O+1]=j/k,d[O+2]=E/k,d[O+3]=A/k}return++t1&&M<-1||(_=2*M*M*M-3*M*M+1)>0&&(T+=_*d[(P=4*(A+k*e))+3],x+=_,d[P+3]<255&&(_=_*d[P+3]/250),C+=_*d[P],S+=_*d[P+1],w+=_*d[P+2],y+=_)}p[b]=C/y,p[b+1]=S/y,p[b+2]=w/y,p[b+3]=T/x}return g},toObject:function(){return{type:this.type,scaleX:this.scaleX,scaleY:this.scaleY,resizeType:this.resizeType,lanczosLobes:this.lanczosLobes}}}),e.Image.filters.Resize.fromObject=e.Image.filters.BaseFilter.fromObject}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.Image.filters,r=e.util.createClass;i.Contrast=r(i.BaseFilter,{type:"Contrast",fragmentSource:"precision highp float;\nuniform sampler2D uTexture;\nuniform float uContrast;\nvarying vec2 vTexCoord;\nvoid main() {\nvec4 color = texture2D(uTexture, vTexCoord);\nfloat contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\ncolor.rgb = contrastF * (color.rgb - 0.5) + 0.5;\ngl_FragColor = color;\n}",contrast:0,mainParameter:"contrast",applyTo2d:function(t){if(0!==this.contrast){var e,i=t.imageData.data,r=i.length,n=Math.floor(255*this.contrast),s=259*(n+255)/(255*(259-n));for(e=0;e1&&(e=1/this.aspectRatio):this.aspectRatio<1&&(e=this.aspectRatio),t=e*this.blur*.12,this.horizontal?i[0]=t:i[1]=t,i}}),i.Blur.fromObject=e.Image.filters.BaseFilter.fromObject}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.Image.filters,r=e.util.createClass;i.Gamma=r(i.BaseFilter,{type:"Gamma",fragmentSource:"precision highp float;\nuniform sampler2D uTexture;\nuniform vec3 uGamma;\nvarying vec2 vTexCoord;\nvoid main() {\nvec4 color = texture2D(uTexture, vTexCoord);\nvec3 correction = (1.0 / uGamma);\ncolor.r = pow(color.r, correction.r);\ncolor.g = pow(color.g, correction.g);\ncolor.b = pow(color.b, correction.b);\ngl_FragColor = color;\ngl_FragColor.rgb *= color.a;\n}",gamma:[1,1,1],mainParameter:"gamma",applyTo2d:function(t){var e,i=t.imageData.data,r=this.gamma,n=i.length,s=1/r[0],o=1/r[1],a=1/r[2];for(this.rVals||(this.rVals=new Uint8Array(256),this.gVals=new Uint8Array(256),this.bVals=new Uint8Array(256)),e=0,n=256;e'},_getCacheCanvasDimensions:function(){var t=this.callSuper("_getCacheCanvasDimensions"),e=this.fontSize;return t.width+=e*t.zoomX,t.height+=e*t.zoomY,t},_render:function(t){this._setTextStyles(t),this._renderTextLinesBackground(t),this._renderTextDecoration(t,"underline"),this._renderText(t),this._renderTextDecoration(t,"overline"),this._renderTextDecoration(t,"linethrough")},_renderText:function(t){"stroke"===this.paintFirst?(this._renderTextStroke(t),this._renderTextFill(t)):(this._renderTextFill(t),this._renderTextStroke(t))},_setTextStyles:function(t,e,i){t.textBaseline="alphabetic",t.font=this._getFontDeclaration(e,i)},calcTextWidth:function(){for(var t=this.getLineWidth(0),e=1,i=this._textLines.length;et&&(t=r)}return t},_renderTextLine:function(t,e,i,r,n,s){this._renderChars(t,e,i,r,n,s)},_renderTextLinesBackground:function(t){if(this.textBackgroundColor||this.styleHas("textBackgroundColor")){for(var e,i,r,n,s,o,a=0,h=t.fillStyle,c=this._getLeftOffset(),l=this._getTopOffset(),u=0,f=0,d=0,g=this._textLines.length;dn)){var d=a-n;h[t]=a,h[c]+=d,n=a}return{width:n*u,kernedWidth:a*u}},getHeightOfChar:function(t,e){return this.getValueOfPropertyAt(t,e,"fontSize")},measureLine:function(t){var e=this._measureLine(t);return 0!==this.charSpacing&&(e.width-=this._getWidthOfCharSpacing()),e.width<0&&(e.width=0),e},_measureLine:function(t){var e,i,r,n,s=0,o=this._textLines[t],a=new Array(o.length);for(this.__charBounds[t]=a,e=0;e0&&!n){var u=this.__charBounds[e][i-1];l.left=u.left+u.width+a.kernedWidth-a.width}return l},getHeightOfLine:function(t){if(this.__lineHeights[t])return this.__lineHeights[t];for(var e=this._textLines[t],i=this.getHeightOfChar(t,0),r=1,n=e.length;ri&&(i=s)}return this.__lineHeights[t]=i*this.lineHeight*this._fontSizeMult,this.__lineHeights[t]},calcTextHeight:function(){for(var t,e=0,i=0,r=this._textLines.length;i0?(t.fillStyle=f,s&&f&&t.fillRect(d+r+o,g+l*(1-this._fontSizeFraction)+this.offsets[e]*this.fontSize,a,this.fontSize/15),o=h.left,a=h.width,s=c,f=u):a+=h.kernedWidth;t.fillStyle=u,c&&u&&t.fillRect(d+r+o,g+l*(1-this._fontSizeFraction)+this.offsets[e]*this.fontSize,a,this.fontSize/15),g+=i}else g+=i;this._removeShadow(t)}},_getFontDeclaration:function(t,i){var r=t||this;return[e.isLikelyNode?r.fontWeight:r.fontStyle,e.isLikelyNode?r.fontStyle:r.fontWeight,i?"200px":r.fontSize+"px",e.isLikelyNode?'"'+r.fontFamily+'"':r.fontFamily].join(" ")},render:function(t){this.visible&&(this.canvas&&this.canvas.skipOffscreen&&!this.group&&!this.isOnScreen()||(this._shouldClearDimensionCache()&&this.initDimensions(),this.callSuper("render",t)))},_splitTextIntoLines:function(t){for(var i=t.split(this._reNewline),r=new Array(i.length),n=["\n"],s=[],o=0;o-1&&(t.underline=!0),t.textDecoration.indexOf("line-through")>-1&&(t.linethrough=!0),t.textDecoration.indexOf("overline")>-1&&(t.overline=!0),delete t.textDecoration)}fabric.IText=fabric.util.createClass(fabric.Text,fabric.Observable,{type:"i-text",selectionStart:0,selectionEnd:0,selectionColor:"rgba(17,119,255,0.3)",isEditing:!1,editable:!0,editingBorderColor:"rgba(102,153,255,0.25)",cursorWidth:2,cursorColor:"#333",cursorDelay:1e3,cursorDuration:600,caching:!0,_reSpace:/\s|\n/,_currentCursorOpacity:0,_selectionDirection:null,_abortCursorAnimation:!1,__widthOfSpace:[],inCompositionMode:!1,initialize:function(t,e){this.callSuper("initialize",t,e),this.initBehavior()},setSelectionStart:function(t){t=Math.max(t,0),this._updateAndFire("selectionStart",t)},setSelectionEnd:function(t){t=Math.min(t,this.text.length),this._updateAndFire("selectionEnd",t)},_updateAndFire:function(t,e){this[t]!==e&&(this._fireSelectionChanged(),this[t]=e),this._updateTextarea()},_fireSelectionChanged:function(){this.fire("selection:changed"),this.canvas&&this.canvas.fire("text:selection:changed",{target:this})},initDimensions:function(){this.isEditing&&this.initDelayedCursor(),this.clearContextTop(),this.callSuper("initDimensions")},render:function(t){this.clearContextTop(),this.callSuper("render",t),this.cursorOffsetCache={},this.renderCursorOrSelection()},_render:function(t){this.callSuper("_render",t)},clearContextTop:function(t){if(this.isEditing&&this.canvas&&this.canvas.contextTop){var e=this.canvas.contextTop,i=this.canvas.viewportTransform;e.save(),e.transform(i[0],i[1],i[2],i[3],i[4],i[5]),this.transform(e),this.transformMatrix&&e.transform.apply(e,this.transformMatrix),this._clearTextArea(e),t||e.restore()}},renderCursorOrSelection:function(){if(this.isEditing&&this.canvas){var t,e=this._getCursorBoundaries();this.canvas&&this.canvas.contextTop?(t=this.canvas.contextTop,this.clearContextTop(!0)):(t=this.canvas.contextContainer).save(),this.selectionStart===this.selectionEnd?this.renderCursor(e,t):this.renderSelection(e,t),t.restore()}},_clearTextArea:function(t){var e=this.width+4,i=this.height+4;t.clearRect(-e/2,-i/2,e,i)},_getCursorBoundaries:function(t){void 0===t&&(t=this.selectionStart);var e=this._getLeftOffset(),i=this._getTopOffset(),r=this._getCursorBoundariesOffsets(t);return{left:e,top:i,leftOffset:r.left,topOffset:r.top}},_getCursorBoundariesOffsets:function(t){if(this.cursorOffsetCache&&"top"in this.cursorOffsetCache)return this.cursorOffsetCache;for(var e,i,r=0,n=0,s=this.get2DCursorLocation(t),o=0;o0?n:0)},this.cursorOffsetCache=i,this.cursorOffsetCache},renderCursor:function(t,e){var i=this.get2DCursorLocation(),r=i.lineIndex,n=i.charIndex>0?i.charIndex-1:0,s=this.getValueOfPropertyAt(r,n,"fontSize"),o=this.scaleX*this.canvas.getZoom(),a=this.cursorWidth/o,h=t.topOffset;h+=(1-this._fontSizeFraction)*this.getHeightOfLine(r)/this.lineHeight-s*(1-this._fontSizeFraction),this.inCompositionMode&&this.renderSelection(t,e),e.fillStyle=this.getValueOfPropertyAt(r,n,"fill"),e.globalAlpha=this.__isMousedown?1:this._currentCursorOpacity,e.fillRect(t.left+t.leftOffset-a/2,h+t.top,a,s)},renderSelection:function(t,e){for(var i=this.inCompositionMode?this.hiddenTextarea.selectionStart:this.selectionStart,r=this.inCompositionMode?this.hiddenTextarea.selectionEnd:this.selectionEnd,n=-1!==this.textAlign.indexOf("justify"),s=this.get2DCursorLocation(i),o=this.get2DCursorLocation(r),a=s.lineIndex,h=o.lineIndex,c=s.charIndex<0?0:s.charIndex,l=o.charIndex<0?0:o.charIndex,u=a;u<=h;u++){var f=this._getLineLeftOffset(u)||0,d=this.getHeightOfLine(u),g=0,p=0,v=0;u===a&&(p=this.__charBounds[a][c].left),u>=a&&u1)&&(d/=this.lineHeight),this.inCompositionMode?(e.fillStyle=this.compositionColor||"black",e.fillRect(t.left+f+p,t.top+t.topOffset+d,v-p,1)):(e.fillStyle=this.selectionColor,e.fillRect(t.left+f+p,t.top+t.topOffset,v-p,d)),t.topOffset+=g}},getCurrentCharFontSize:function(){var t=this._getCurrentCharIndex();return this.getValueOfPropertyAt(t.l,t.c,"fontSize")},getCurrentCharColor:function(){var t=this._getCurrentCharIndex();return this.getValueOfPropertyAt(t.l,t.c,"fill")},_getCurrentCharIndex:function(){var t=this.get2DCursorLocation(this.selectionStart,!0),e=t.charIndex>0?t.charIndex-1:0;return{l:t.lineIndex,c:e}}}),fabric.IText.fromObject=function(e,i){if(t(e),e.styles)for(var r in e.styles)for(var n in e.styles[r])t(e.styles[r][n]);fabric.Object._fromObject("IText",e,i,"text")}}(),function(){var t=fabric.util.object.clone;fabric.util.object.extend(fabric.IText.prototype,{initBehavior:function(){this.initAddedHandler(),this.initRemovedHandler(),this.initCursorSelectionHandlers(),this.initDoubleClickSimulation(),this.mouseMoveHandler=this.mouseMoveHandler.bind(this)},onDeselect:function(t){this.isEditing&&this.exitEditing(),this.selected=!1,fabric.Object.prototype.onDeselect.call(this,t)},initAddedHandler:function(){var t=this;this.on("added",function(){var e=t.canvas;e&&(e._hasITextHandlers||(e._hasITextHandlers=!0,t._initCanvasHandlers(e)),e._iTextInstances=e._iTextInstances||[],e._iTextInstances.push(t))})},initRemovedHandler:function(){var t=this;this.on("removed",function(){var e=t.canvas;e&&(e._iTextInstances=e._iTextInstances||[],fabric.util.removeFromArray(e._iTextInstances,t),0===e._iTextInstances.length&&(e._hasITextHandlers=!1,t._removeCanvasHandlers(e)))})},_initCanvasHandlers:function(t){t._mouseUpITextHandler=function(){t._iTextInstances&&t._iTextInstances.forEach(function(t){t.__isMousedown=!1})}.bind(this),t.on("mouse:up",t._mouseUpITextHandler)},_removeCanvasHandlers:function(t){t.off("mouse:up",t._mouseUpITextHandler)},_tick:function(){this._currentTickState=this._animateCursor(this,1,this.cursorDuration,"_onTickComplete")},_animateCursor:function(t,e,i,r){var n;return n={isAborted:!1,abort:function(){this.isAborted=!0}},t.animate("_currentCursorOpacity",e,{duration:i,onComplete:function(){n.isAborted||t[r]()},onChange:function(){t.canvas&&t.selectionStart===t.selectionEnd&&t.renderCursorOrSelection()},abort:function(){return n.isAborted}}),n},_onTickComplete:function(){var t=this;this._cursorTimeout1&&clearTimeout(this._cursorTimeout1),this._cursorTimeout1=setTimeout(function(){t._currentTickCompleteState=t._animateCursor(t,0,this.cursorDuration/2,"_tick")},100)},initDelayedCursor:function(t){var e=this,i=t?0:this.cursorDelay;this.abortCursorAnimation(),this._currentCursorOpacity=1,this._cursorTimeout2=setTimeout(function(){e._tick()},i)},abortCursorAnimation:function(){var t=this._currentTickState||this._currentTickCompleteState,e=this.canvas;this._currentTickState&&this._currentTickState.abort(),this._currentTickCompleteState&&this._currentTickCompleteState.abort(),clearTimeout(this._cursorTimeout1),clearTimeout(this._cursorTimeout2),this._currentCursorOpacity=0,t&&e&&e.clearContext(e.contextTop||e.contextContainer)},selectAll:function(){return this.selectionStart=0,this.selectionEnd=this._text.length,this._fireSelectionChanged(),this._updateTextarea(),this},getSelectedText:function(){return this._text.slice(this.selectionStart,this.selectionEnd).join("")},findWordBoundaryLeft:function(t){var e=0,i=t-1;if(this._reSpace.test(this._text[i]))for(;this._reSpace.test(this._text[i]);)e++,i--;for(;/\S/.test(this._text[i])&&i>-1;)e++,i--;return t-e},findWordBoundaryRight:function(t){var e=0,i=t;if(this._reSpace.test(this._text[i]))for(;this._reSpace.test(this._text[i]);)e++,i++;for(;/\S/.test(this._text[i])&&i-1;)e++,i--;return t-e},findLineBoundaryRight:function(t){for(var e=0,i=t;!/\n/.test(this._text[i])&&i0&&ithis.__selectionStartOnMouseDown?(this.selectionStart=this.__selectionStartOnMouseDown,this.selectionEnd=e):(this.selectionStart=e,this.selectionEnd=this.__selectionStartOnMouseDown),this.selectionStart===i&&this.selectionEnd===r||(this.restartCursorIfNeeded(),this._fireSelectionChanged(),this._updateTextarea(),this.renderCursorOrSelection()))}},_setEditingProps:function(){this.hoverCursor="text",this.canvas&&(this.canvas.defaultCursor=this.canvas.moveCursor="text"),this.borderColor=this.editingBorderColor,this.hasControls=this.selectable=!1,this.lockMovementX=this.lockMovementY=!0},fromStringToGraphemeSelection:function(t,e,i){var r=i.slice(0,t),n=fabric.util.string.graphemeSplit(r).length;if(t===e)return{selectionStart:n,selectionEnd:n};var s=i.slice(t,e);return{selectionStart:n,selectionEnd:n+fabric.util.string.graphemeSplit(s).length}},fromGraphemeToStringSelection:function(t,e,i){var r=i.slice(0,t).join("").length;return t===e?{selectionStart:r,selectionEnd:r}:{selectionStart:r,selectionEnd:r+i.slice(t,e).join("").length}},_updateTextarea:function(){if(this.cursorOffsetCache={},this.hiddenTextarea){if(!this.inCompositionMode){var t=this.fromGraphemeToStringSelection(this.selectionStart,this.selectionEnd,this._text);this.hiddenTextarea.selectionStart=t.selectionStart,this.hiddenTextarea.selectionEnd=t.selectionEnd}this.updateTextareaPosition()}},updateFromTextArea:function(){if(this.hiddenTextarea){this.cursorOffsetCache={},this.text=this.hiddenTextarea.value,this._shouldClearDimensionCache()&&(this.initDimensions(),this.setCoords());var t=this.fromStringToGraphemeSelection(this.hiddenTextarea.selectionStart,this.hiddenTextarea.selectionEnd,this.hiddenTextarea.value);this.selectionEnd=this.selectionStart=t.selectionEnd,this.inCompositionMode||(this.selectionStart=t.selectionStart),this.updateTextareaPosition()}},updateTextareaPosition:function(){if(this.selectionStart===this.selectionEnd){var t=this._calcTextareaPosition();this.hiddenTextarea.style.left=t.left,this.hiddenTextarea.style.top=t.top}},_calcTextareaPosition:function(){if(!this.canvas)return{x:1,y:1};var t=this.inCompositionMode?this.compositionStart:this.selectionStart,e=this._getCursorBoundaries(t),i=this.get2DCursorLocation(t),r=i.lineIndex,n=i.charIndex,s=this.getValueOfPropertyAt(r,n,"fontSize")*this.lineHeight,o=e.leftOffset,a=this.calcTransformMatrix(),h={x:e.left+o,y:e.top+e.topOffset+s},c=this.canvas.upperCanvasEl,l=c.width-s,u=c.height-s;return h=fabric.util.transformPoint(h,a),(h=fabric.util.transformPoint(h,this.canvas.viewportTransform)).x<0&&(h.x=0),h.x>l&&(h.x=l),h.y<0&&(h.y=0),h.y>u&&(h.y=u),h.x+=this.canvas._offset.left,h.y+=this.canvas._offset.top,{left:h.x+"px",top:h.y+"px",fontSize:s+"px",charHeight:s}},_saveEditingProps:function(){this._savedProps={hasControls:this.hasControls,borderColor:this.borderColor,lockMovementX:this.lockMovementX,lockMovementY:this.lockMovementY,hoverCursor:this.hoverCursor,defaultCursor:this.canvas&&this.canvas.defaultCursor,moveCursor:this.canvas&&this.canvas.moveCursor}},_restoreEditingProps:function(){this._savedProps&&(this.hoverCursor=this._savedProps.hoverCursor,this.hasControls=this._savedProps.hasControls,this.borderColor=this._savedProps.borderColor,this.lockMovementX=this._savedProps.lockMovementX,this.lockMovementY=this._savedProps.lockMovementY,this.canvas&&(this.canvas.defaultCursor=this._savedProps.defaultCursor,this.canvas.moveCursor=this._savedProps.moveCursor))},exitEditing:function(){var t=this._textBeforeEdit!==this.text;return this.selected=!1,this.isEditing=!1,this.selectable=!0,this.selectionEnd=this.selectionStart,this.hiddenTextarea&&(this.hiddenTextarea.blur&&this.hiddenTextarea.blur(),this.canvas&&this.hiddenTextarea.parentNode.removeChild(this.hiddenTextarea),this.hiddenTextarea=null),this.abortCursorAnimation(),this._restoreEditingProps(),this._currentCursorOpacity=0,this._shouldClearDimensionCache()&&(this.initDimensions(),this.setCoords()),this.fire("editing:exited"),t&&this.fire("modified"),this.canvas&&(this.canvas.off("mouse:move",this.mouseMoveHandler),this.canvas.fire("text:editing:exited",{target:this}),t&&this.canvas.fire("object:modified",{target:this})),this},_removeExtraneousStyles:function(){for(var t in this.styles)this._textLines[t]||delete this.styles[t]},removeStyleFromTo:function(t,e){var i,r,n=this.get2DCursorLocation(t,!0),s=this.get2DCursorLocation(e,!0),o=n.lineIndex,a=n.charIndex,h=s.lineIndex,c=s.charIndex;if(o!==h){if(this.styles[o])for(i=a;i=c&&(r[l-f]=r[u],delete r[u])}},shiftLineStyles:function(e,i){var r=t(this.styles);for(var n in this.styles){var s=parseInt(n,10);s>e&&(this.styles[s+i]=r[s],r[s-i]||delete this.styles[s])}},restartCursorIfNeeded:function(){this._currentTickState&&!this._currentTickState.isAborted&&this._currentTickCompleteState&&!this._currentTickCompleteState.isAborted||this.initDelayedCursor()},insertNewlineStyleObject:function(e,i,r,n){var s,o={},a=!1;r||(r=1),this.shiftLineStyles(e,r),this.styles[e]&&(s=this.styles[e][0===i?i:i-1]);for(var h in this.styles[e]){var c=parseInt(h,10);c>=i&&(a=!0,o[c-i]=this.styles[e][h],delete this.styles[e][h])}for(a?this.styles[e+r]=o:delete this.styles[e+r];r>1;)r--,n&&n[r]?this.styles[e+r]={0:t(n[r])}:s?this.styles[e+r]={0:t(s)}:delete this.styles[e+r];this._forceClearCache=!0},insertCharStyleObject:function(e,i,r,n){this.styles||(this.styles={});var s=this.styles[e],o=s?t(s):{};r||(r=1);for(var a in o){var h=parseInt(a,10);h>=i&&(s[h+r]=o[h],o[h-r]||delete s[h])}if(this._forceClearCache=!0,n)for(;r--;)Object.keys(n[r]).length&&(this.styles[e]||(this.styles[e]={}),this.styles[e][i+r]=t(n[r]));else if(s)for(var c=s[i?i-1:1];c&&r--;)this.styles[e][i+r]=t(c)},insertNewStyleBlock:function(t,e,i){for(var r=this.get2DCursorLocation(e,!0),n=[0],s=0,o=0;o0&&(this.insertCharStyleObject(r.lineIndex,r.charIndex,n[0],i),i=i&&i.slice(n[0]+1)),s&&this.insertNewlineStyleObject(r.lineIndex,r.charIndex+n[0],s);for(o=1;o0&&this.insertCharStyleObject(r.lineIndex+o,0,n[o],i)},setSelectionStartEndWithShift:function(t,e,i){i<=t?(e===t?this._selectionDirection="left":"right"===this._selectionDirection&&(this._selectionDirection="left",this.selectionEnd=t),this.selectionStart=i):i>t&&it?this.selectionStart=t:this.selectionStart<0&&(this.selectionStart=0),this.selectionEnd>t?this.selectionEnd=t:this.selectionEnd<0&&(this.selectionEnd=0)}})}(),fabric.util.object.extend(fabric.IText.prototype,{initDoubleClickSimulation:function(){this.__lastClickTime=+new Date,this.__lastLastClickTime=+new Date,this.__lastPointer={},this.on("mousedown",this.onMouseDown.bind(this))},onMouseDown:function(t){this.__newClickTime=+new Date;var e=this.canvas.getPointer(t.e);this.isTripleClick(e,t.e)&&(this.fire("tripleclick",t),this._stopEvent(t.e)),this.__lastLastClickTime=this.__lastClickTime,this.__lastClickTime=this.__newClickTime,this.__lastPointer=e,this.__lastIsEditing=this.isEditing,this.__lastSelected=this.selected},isTripleClick:function(t){return this.__newClickTime-this.__lastClickTime<500&&this.__lastClickTime-this.__lastLastClickTime<500&&this.__lastPointer.x===t.x&&this.__lastPointer.y===t.y},_stopEvent:function(t){t.preventDefault&&t.preventDefault(),t.stopPropagation&&t.stopPropagation()},initCursorSelectionHandlers:function(){this.initMousedownHandler(),this.initMouseupHandler(),this.initClicks()},initClicks:function(){this.on("mousedblclick",function(t){this.selectWord(this.getSelectionStartFromPointer(t.e))}),this.on("tripleclick",function(t){this.selectLine(this.getSelectionStartFromPointer(t.e))})},initMousedownHandler:function(){this.on("mousedown",function(t){if(this.editable&&(!t.e.button||1===t.e.button)){var e=this.canvas.getPointer(t.e);this.__mousedownX=e.x,this.__mousedownY=e.y,this.__isMousedown=!0,this.selected&&this.setCursorByClick(t.e),this.isEditing&&(this.__selectionStartOnMouseDown=this.selectionStart,this.selectionStart===this.selectionEnd&&this.abortCursorAnimation(),this.renderCursorOrSelection())}})},_isObjectMoved:function(t){var e=this.canvas.getPointer(t);return this.__mousedownX!==e.x||this.__mousedownY!==e.y},initMouseupHandler:function(){this.on("mouseup",function(t){this.__isMousedown=!1,!this.editable||this._isObjectMoved(t.e)||t.e.button&&1!==t.e.button||(this.__lastSelected&&!this.__corner&&(this.enterEditing(t.e),this.selectionStart===this.selectionEnd?this.initDelayedCursor(!0):this.renderCursorOrSelection()),this.selected=!0)})},setCursorByClick:function(t){var e=this.getSelectionStartFromPointer(t),i=this.selectionStart,r=this.selectionEnd;t.shiftKey?this.setSelectionStartEndWithShift(i,r,e):(this.selectionStart=e,this.selectionEnd=e),this.isEditing&&(this._fireSelectionChanged(),this._updateTextarea())},getSelectionStartFromPointer:function(t){for(var e,i=this.getLocalPointer(t),r=0,n=0,s=0,o=0,a=0,h=0,c=this._textLines.length;h0&&(o+=this._textLines[h-1].length+1);n=this._getLineLeftOffset(a)*this.scaleX;for(var l=0,u=(e=this._textLines[a]).length;ls||o<0?0:1);return this.flipX&&(a=n-a),a>this._text.length&&(a=this._text.length),a}}),fabric.util.object.extend(fabric.IText.prototype,{initHiddenTextarea:function(){this.hiddenTextarea=fabric.document.createElement("textarea"),this.hiddenTextarea.setAttribute("autocapitalize","off"),this.hiddenTextarea.setAttribute("autocorrect","off"),this.hiddenTextarea.setAttribute("autocomplete","off"),this.hiddenTextarea.setAttribute("spellcheck","false"),this.hiddenTextarea.setAttribute("data-fabric-hiddentextarea",""),this.hiddenTextarea.setAttribute("wrap","off");var t=this._calcTextareaPosition();this.hiddenTextarea.style.cssText="position: absolute; top: "+t.top+"; left: "+t.left+"; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; line-height: 1px; paddingーtop: "+t.fontSize+";",fabric.document.body.appendChild(this.hiddenTextarea),fabric.util.addListener(this.hiddenTextarea,"keydown",this.onKeyDown.bind(this)),fabric.util.addListener(this.hiddenTextarea,"keyup",this.onKeyUp.bind(this)),fabric.util.addListener(this.hiddenTextarea,"input",this.onInput.bind(this)),fabric.util.addListener(this.hiddenTextarea,"copy",this.copy.bind(this)),fabric.util.addListener(this.hiddenTextarea,"cut",this.copy.bind(this)),fabric.util.addListener(this.hiddenTextarea,"paste",this.paste.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionstart",this.onCompositionStart.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionupdate",this.onCompositionUpdate.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionend",this.onCompositionEnd.bind(this)),!this._clickHandlerInitialized&&this.canvas&&(fabric.util.addListener(this.canvas.upperCanvasEl,"click",this.onClick.bind(this)),this._clickHandlerInitialized=!0)},keysMap:{9:"exitEditing",27:"exitEditing",33:"moveCursorUp",34:"moveCursorDown",35:"moveCursorRight",36:"moveCursorLeft",37:"moveCursorLeft",38:"moveCursorUp",39:"moveCursorRight",40:"moveCursorDown"},ctrlKeysMapUp:{67:"copy",88:"cut"},ctrlKeysMapDown:{65:"selectAll"},onClick:function(){this.hiddenTextarea&&this.hiddenTextarea.focus()},onKeyDown:function(t){if(this.isEditing&&!this.inCompositionMode){if(t.keyCode in this.keysMap)this[this.keysMap[t.keyCode]](t);else{if(!(t.keyCode in this.ctrlKeysMapDown&&(t.ctrlKey||t.metaKey)))return;this[this.ctrlKeysMapDown[t.keyCode]](t)}t.stopImmediatePropagation(),t.preventDefault(),t.keyCode>=33&&t.keyCode<=40?(this.clearContextTop(),this.renderCursorOrSelection()):this.canvas&&this.canvas.requestRenderAll()}},onKeyUp:function(t){!this.isEditing||this._copyDone||this.inCompositionMode?this._copyDone=!1:t.keyCode in this.ctrlKeysMapUp&&(t.ctrlKey||t.metaKey)&&(this[this.ctrlKeysMapUp[t.keyCode]](t),t.stopImmediatePropagation(),t.preventDefault(),this.canvas&&this.canvas.requestRenderAll())},onInput:function(t){var e=this.fromPaste;if(this.fromPaste=!1,t&&t.stopPropagation(),this.isEditing){var i,r,n=this._splitTextIntoLines(this.hiddenTextarea.value).graphemeText,s=this._text.length,o=n.length,a=o-s;if(""===this.hiddenTextarea.value)return this.styles={},this.updateFromTextArea(),this.fire("changed"),void(this.canvas&&(this.canvas.fire("text:changed",{target:this}),this.canvas.requestRenderAll()));var h=this.fromStringToGraphemeSelection(this.hiddenTextarea.selectionStart,this.hiddenTextarea.selectionEnd,this.hiddenTextarea.value),c=this.selectionStart>h.selectionStart;this.selectionStart!==this.selectionEnd?(i=this._text.slice(this.selectionStart,this.selectionEnd),a+=this.selectionEnd-this.selectionStart):o0&&(r+=(i=this.__charBounds[t][e-1]).left+i.width),r},getDownCursorOffset:function(t,e){var i=this._getSelectionForOffset(t,e),r=this.get2DCursorLocation(i),n=r.lineIndex;if(n===this._textLines.length-1||t.metaKey||34===t.keyCode)return this._text.length-i;var s=r.charIndex,o=this._getWidthBeforeCursor(n,s),a=this._getIndexOnLine(n+1,o);return this._textLines[n].slice(s).length+a+2},_getSelectionForOffset:function(t,e){return t.shiftKey&&this.selectionStart!==this.selectionEnd&&e?this.selectionEnd:this.selectionStart},getUpCursorOffset:function(t,e){var i=this._getSelectionForOffset(t,e),r=this.get2DCursorLocation(i),n=r.lineIndex;if(0===n||t.metaKey||33===t.keyCode)return-i;var s=r.charIndex,o=this._getWidthBeforeCursor(n,s),a=this._getIndexOnLine(n-1,o),h=this._textLines[n].slice(0,s);return-this._textLines[n-1].length+a-h.length},_getIndexOnLine:function(t,e){for(var i,r,n=this._textLines[t],s=this._getLineLeftOffset(t),o=0,a=0,h=n.length;ae){r=!0;var c=s-i,l=s,u=Math.abs(c-e);o=Math.abs(l-e)=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorUpOrDown("Down",t)},moveCursorUp:function(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorUpOrDown("Up",t)},_moveCursorUpOrDown:function(t,e){var i=this["get"+t+"CursorOffset"](e,"right"===this._selectionDirection);e.shiftKey?this.moveCursorWithShift(i):this.moveCursorWithoutShift(i),0!==i&&(this.setSelectionInBoundaries(),this.abortCursorAnimation(),this._currentCursorOpacity=1,this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea())},moveCursorWithShift:function(t){var e="left"===this._selectionDirection?this.selectionStart+t:this.selectionEnd+t;return this.setSelectionStartEndWithShift(this.selectionStart,this.selectionEnd,e),0!==t},moveCursorWithoutShift:function(t){return t<0?(this.selectionStart+=t,this.selectionEnd=this.selectionStart):(this.selectionEnd+=t,this.selectionStart=this.selectionEnd),0!==t},moveCursorLeft:function(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorLeftOrRight("Left",t)},_move:function(t,e,i){var r;if(t.altKey)r=this["findWordBoundary"+i](this[e]);else{if(!t.metaKey&&35!==t.keyCode&&36!==t.keyCode)return this[e]+="Left"===i?-1:1,!0;r=this["findLineBoundary"+i](this[e])}if(void 0!==typeof r&&this[e]!==r)return this[e]=r,!0},_moveLeft:function(t,e){return this._move(t,e,"Left")},_moveRight:function(t,e){return this._move(t,e,"Right")},moveCursorLeftWithoutShift:function(t){var e=!0;return this._selectionDirection="left",this.selectionEnd===this.selectionStart&&0!==this.selectionStart&&(e=this._moveLeft(t,"selectionStart")),this.selectionEnd=this.selectionStart,e},moveCursorLeftWithShift:function(t){return"right"===this._selectionDirection&&this.selectionStart!==this.selectionEnd?this._moveLeft(t,"selectionEnd"):0!==this.selectionStart?(this._selectionDirection="left",this._moveLeft(t,"selectionStart")):void 0},moveCursorRight:function(t){this.selectionStart>=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorLeftOrRight("Right",t)},_moveCursorLeftOrRight:function(t,e){var i="moveCursor"+t+"With";this._currentCursorOpacity=1,e.shiftKey?i+="Shift":i+="outShift",this[i](e)&&(this.abortCursorAnimation(),this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea())},moveCursorRightWithShift:function(t){return"left"===this._selectionDirection&&this.selectionStart!==this.selectionEnd?this._moveRight(t,"selectionStart"):this.selectionEnd!==this._text.length?(this._selectionDirection="right",this._moveRight(t,"selectionEnd")):void 0},moveCursorRightWithoutShift:function(t){var e=!0;return this._selectionDirection="right",this.selectionStart===this.selectionEnd?(e=this._moveRight(t,"selectionStart"),this.selectionEnd=this.selectionStart):this.selectionStart=this.selectionEnd,e},removeChars:function(t,e){void 0===e&&(e=t+1),this.removeStyleFromTo(t,e),this._text.splice(t,e-t),this.text=this._text.join(""),this.set("dirty",!0),this._removeExtraneousStyles(),this._shouldClearDimensionCache()&&(this.initDimensions(),this.setCoords())}}),function(){var t=fabric.util.toFixed,e=fabric.Object.NUM_FRACTION_DIGITS;fabric.util.object.extend(fabric.Text.prototype,{toSVG:function(t){var e=this._createBaseSVGMarkup(),i=this._getSVGLeftTopOffsets(),r=this._getSVGTextAndBg(i.textTop,i.textLeft);return this._wrapSVGTextAndBg(e,r),t?t(e.join("")):e.join("")},_getSVGLeftTopOffsets:function(){return{textLeft:-this.width/2,textTop:-this.height/2,lineTop:this.getHeightOfLine(0)}},_wrapSVGTextAndBg:function(t,e){var i=this.getSvgFilter(),r=""===i?"":' style="'+i+'"',n=this.getSvgTextDecoration(this);t.push("\t\n",e.textBgRects.join(""),'\t\t\n",e.textSpans.join(""),"\t\t\n","\t\n")},_getSVGTextAndBg:function(t,e){var i,r=[],n=[],s=t;this._setSVGBg(n);for(var o=0,a=this._textLines.length;o",fabric.util.string.escapeXml(i),"\n"].join("")},_setSVGTextLineText:function(t,e,i,r){var n,s,o,a,h,c=this.getHeightOfLine(e),l=-1!==this.textAlign.indexOf("justify"),u="",f=0,d=this._textLines[e];r+=c*(1-this._fontSizeFraction)/this.lineHeight;for(var g=0,p=d.length-1;g<=p;g++)h=g===p||this.charSpacing,u+=d[g],o=this.__charBounds[e][g],0===f?(i+=o.kernedWidth-o.width,f+=o.width):f+=o.kernedWidth,l&&!h&&this._reSpaceAndTab.test(d[g])&&(h=!0),h||(n=n||this.getCompleteStyleDeclaration(e,g),s=this.getCompleteStyleDeclaration(e,g+1),h=this._hasStyleChangedForSvg(n,s)),h&&(a=this._getStyleDeclaration(e,g)||{},t.push(this._createTextCharSpan(u,a,i,r)),u="",n=s,i+=f,f=0)},_pushTextBgRect:function(i,r,n,s,o,a){i.push("\t\t\n')},_setSVGTextLineBg:function(t,e,i,r){for(var n,s,o=this._textLines[e],a=this.getHeightOfLine(e)/this.lineHeight,h=0,c=0,l=this.getValueOfPropertyAt(e,0,"textBackgroundColor"),u=0,f=o.length;uthis.width&&this._set("width",this.dynamicMinWidth),-1!==this.textAlign.indexOf("justify")&&this.enlargeSpaces(),this.height=this.calcTextHeight(),this.saveState({propertySet:"_dimensionAffectingProps"}))},_generateStyleMap:function(t){for(var e=0,i=0,r=0,n={},s=0;s0?(i=0,r++,e++):this._reSpaceAndTab.test(t.graphemeText[r])&&s>0&&(i++,r++),n[s]={line:e,offset:i},r+=t.graphemeLines[s].length,i+=t.graphemeLines[s].length;return n},styleHas:function(t,i){if(this._styleMap&&!this.isWrapping){var r=this._styleMap[i];r&&(i=r.line)}return e.Text.prototype.styleHas.call(this,t,i)},_getStyleDeclaration:function(t,e){if(this._styleMap&&!this.isWrapping){var i=this._styleMap[t];if(!i)return null;t=i.line,e=i.offset+e}return this.callSuper("_getStyleDeclaration",t,e)},_setStyleDeclaration:function(t,e,i){var r=this._styleMap[t];t=r.line,e=r.offset+e,this.styles[t][e]=i},_deleteStyleDeclaration:function(t,e){var i=this._styleMap[t];t=i.line,e=i.offset+e,delete this.styles[t][e]},_getLineStyle:function(t){var e=this._styleMap[t];return this.styles[e.line]},_setLineStyle:function(t,e){var i=this._styleMap[t];this.styles[i.line]=e},_deleteLineStyle:function(t){var e=this._styleMap[t];delete this.styles[e.line]},_wrapText:function(t,e){var i,r=[];for(this.isWrapping=!0,i=0;i=r&&!d&&(s.push(o),o=[],n=l,d=!0),d||o.push(" "),o=o.concat(h),u=this._measureWord([" "],i,c),c++,d=!1,l>f&&(f=l);return p&&s.push(o),f>this.dynamicMinWidth&&(this.dynamicMinWidth=f-g),s},isEndOfWrapping:function(t){return!this._styleMap[t+1]||this._styleMap[t+1].line!==this._styleMap[t].line},_splitTextIntoLines:function(t){for(var i=e.Text.prototype._splitTextIntoLines.call(this,t),r=this._wrapText(i.lines,this.width),n=new Array(r.length),s=0;s=h.getMinWidth()?(h.set("width",l),!0):void 0},fabric.util.object.extend(fabric.Textbox.prototype,{_removeExtraneousStyles:function(){for(var t in this._styleMap)this._textLines[t]||delete this.styles[this._styleMap[t].line]}})}(); \ No newline at end of file diff --git a/public/tool/mysql/Change_Log.txt b/public/tool/mysql/Change_Log.txt new file mode 100644 index 0000000..695bff9 --- /dev/null +++ b/public/tool/mysql/Change_Log.txt @@ -0,0 +1,50 @@ +** v 2.0.3 ** +Date: 7-January-2012 + +- number of tables per page option added +- rename table option added +- multiple table rename option added +- search in table option added +- some bugs fixed +- size of the table and number of rows info added +- language pack option added (english only for now) + + +_______________________________ +** v 2.0.2 ** +Date: 22-Octomber-2011 + +- multiple drop,empty and export table option added +- small bugs fixed +- pagination in table list added + + +_______________________________ +** v 2.0.1 REBUILD ** + +* SINCE IS A REBUILD VERSION THIS IS THE FIRST RELESE * +Date: 05-July-2011 + +wap phpmyadmin 2.0.1 REBUILD can: + +- view tables list +- add tables +- execute sql code +- export database in .sql file, you can also zip it +- upload and execute sql file +- import via url and execute sql file +- view a file list with backup files from export +- view table structure +- add column +- copy table +- insert data +- browse table +- edit data +- clear table +- drop table +- edit column +- browse column +- drop column +- multiple delete records, tables, columns + +please report bugs at ionutvmi@yahoo.com \ No newline at end of file diff --git a/public/tool/mysql/LICENSE.txt b/public/tool/mysql/LICENSE.txt new file mode 100644 index 0000000..b860267 --- /dev/null +++ b/public/tool/mysql/LICENSE.txt @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/public/tool/mysql/README.txt b/public/tool/mysql/README.txt new file mode 100644 index 0000000..24b1f5a --- /dev/null +++ b/public/tool/mysql/README.txt @@ -0,0 +1,24 @@ +/******************** +* * +* ionutvmi * +* wap phpmyadmin * +* v 2.0.3 * +* * +********************/ + +/*** REQUIREMENTS **/ +You need a database already created so you can use this. + + +/****** INSTALL ****/ +1. unzip wap_phpmyadmin_2_0_3.zip file +2. chmod data folder 777 +3. ENJOY AND USE IT + + +/******* bugs ******/ +I'M STILL TESTING THIS SCRIPT SO IF YOU FIND ANY BUGS PLEASE REPORT IT AT ionutvmi@gmail.com + + +Thank you, +ionutvmi \ No newline at end of file diff --git a/public/tool/mysql/addcol.php b/public/tool/mysql/addcol.php new file mode 100644 index 0000000..a903046 --- /dev/null +++ b/public/tool/mysql/addcol.php @@ -0,0 +1,301 @@ +".$lang["CREATE_COLUMN"]."

          ".$lang["tables"].">$tb>".$lang["add_column"]."
          - - -
          "; +if (!$vmi) { +echo " +

          +".$lang["colunm_name"].":
          ".$lang["type"].": "; +print '
          +".$lang["Length"].":
          "; +print $lang["Collation"].':
          '.$lang["Attributes"].':
          NULL
          '.$lang["Default"].':
          '.$lang["Extra"].':
          '.$lang["Field_Key"].':
          '; +print "".$lang["At_End_Of_Table"]."
          +".$lang["At_Beginning_Of_Table"]."
          +".$lang["After"]."
          "; +} else { +$tc=trim($_POST['tc']); +$ct=trim($_POST['ct']); +$lg=trim($_POST['lg']); +$co=trim($_POST['co']); +$at=trim($_POST['at']); +$nu=trim($_POST['nu']); +$df=trim($_POST['df']); +if($df !="") $df="DEFAULT '$df'"; +$ex=trim($_POST['ex']); +$fk=trim($_POST['fk']); +if($fk==0) $fkk=""; +if($fk==1) $fkk=",PRIMARY KEY(`$tc`)"; +if($fk==2) $fkk=",INDEX(`$tc`)"; +if($fk==3) $fkk=",UNIQUE(`$tc`)"; +if($lg !="") $lg="($lg)"; + +$po=$_POST["pos"]; +if($po == "AFTER") $po = "AFTER `".$_POST["afp"]."`"; +$sql="ALTER TABLE `$tb` ADD `$tc` $ct $lg $co $at $nu $df $ex $fkk $po"; +$create=mysqli_query($conn, $sql); +print "
          ".$lang["Query"].": ".htmlspecialchars($sql)."
          "; +if ($create) { +printf($lang["column_created"],$tc); +} else { +echo $lang["Error"].": "; +echo mysqli_error($conn); +} +} +echo '
        '; +include('foot.php'); +?> \ No newline at end of file diff --git a/public/tool/mysql/addtable.php b/public/tool/mysql/addtable.php new file mode 100644 index 0000000..c8d91fd --- /dev/null +++ b/public/tool/mysql/addtable.php @@ -0,0 +1,292 @@ +".$lang["ADD_TABLE"]."

        ".$lang["tables"].">".strtolower($lang["ADD_TABLE"])."
        - - -
        "; +if (!$vmi) { +echo " +

        +".$lang["table_name"].":
        +".$lang["colunm_name"].":
        ".$lang["type"].": "; +print '
        +".$lang["Length"].":
        "; +print $lang["Collation"].':
        '.$lang["Attributes"].':
        NULL
        '.$lang["Default"].':
        '.$lang["Extra"].':
        '.$lang["Field_Key"].':
        '; +print "
        "; +} else { +$tn=trim($_POST['tn']); +$tc=trim($_POST['tc']); +$ct=trim($_POST['ct']); +$lg=trim($_POST['lg']); +$co=trim($_POST['co']); +$at=trim($_POST['at']); +$nu=trim($_POST['nu']); +$df=trim($_POST['df']); +if($df !="") $df="DEFAULT '$df'"; +$ex=trim($_POST['ex']); +$fk=trim($_POST['fk']); +if($fk==0) $fkk=""; +if($fk==1) $fkk=",PRIMARY KEY(`$tc`)"; +if($fk==2) $fkk=",INDEX(`$tc`)"; +if($fk==3) $fkk=",UNIQUE(`$tc`)"; +if($lg !="") $lg="($lg)"; +$sql ="CREATE TABLE `$tn` ( +`$tc` $ct $lg $co $at $nu $df $ex $fkk)"; +echo "
        ".$lang["Query"].": ".htmlspecialchars($sql)."

        "; +$create=mysqli_query($conn,"$sql"); +if ($create) { +printf($lang["table_created"],$tn); +} else { +echo $lang["Error"].": "; +echo mysqli_error($conn); +} +} +echo '

        '; +include('foot.php'); +?> diff --git a/public/tool/mysql/br.php b/public/tool/mysql/br.php new file mode 100644 index 0000000..f141406 --- /dev/null +++ b/public/tool/mysql/br.php @@ -0,0 +1,183 @@ +".strtoupper($lang["Browse"])."
        ".$lang["Query"].": ".htmlspecialchars($sql)."

        ".$lang["tables"].">$tb
        - - -
        ".$lang["Browse"]." |".$lang["Structure"]." | ".$lang["Search"]." | ".$lang["Insert"]." | ".$lang["Clear"]." | ".$lang["Drop"]."
        - - -
        +"; +printf($lang["table_not_exists"],$tb); +} else { + + +$xx = mysqli_query($conn,"SHOW INDEXES FROM `$tb` WHERE Key_name = 'PRIMARY'"); +$nrr=mysqli_num_rows($xx); + +if($nrr>0){ +while ($row = mysqli_fetch_array($xx)) { +$cvn= $row['Column_name']; +$cv[]=$cvn."``0"; +} +} else { +$i=0; +while ($i < mysqli_num_fields($result)) { + $meta = mysqli_fetch_field_direct($result, $i); +$cvn=$meta->name; +$cv[]=$cvn."``1"; +$i++; +} +} + +// get column + +$nnm=$_GET['nm']; +if(!$nnm) { +$meta = mysqli_fetch_field_direct($result, 0); +$nm=$meta->name; +}else{ +$nm= trim(base64_decode($nnm)); +} +// get nr of columns +// $val=mysqli_query($conn,"SELECT * FROM `$tb`"); +$nr=mysqli_num_rows($result); +if ($nr >0) { +// get psge + +if(!isset($_GET['page'])){ +$page = 1; +} else { +$page = (int)$_GET['page']; +} + +if($page <= 0) $page=1; +$perp = (int)$_GET['perp']; +if(!$perp) $perp=10; +if($perp <= 0) $perp=10; +$from = (($page * $perp) - $perp); +$total_pages = ceil($nr / $perp); +if ($page>$total_pages) { +die("error"); } +$or=$_GET['or']; +if(!$or) $or=0; +if ($or==0) { +$ord='asc'; } else { +$ord='desc'; } +$sql="SELECT * FROM `$tb` ORDER BY `$nm` $ord LIMIT $from, $perp"; +$val=mysqli_query($conn,$sql); +echo "

        ".strtoupper($lang["Browse"])."
        ".$lang["Query"].": ".htmlspecialchars($sql)."

        ".$lang["tables"].">$tb
        - - -
        ".$lang["Browse"]." |".$lang["Structure"]." | ".$lang["Search"]." | ".$lang["Insert"]." | ".$lang["Clear"]." | ".$lang["Drop"]."
        - - -
        +"; +// column list +$col=mysqli_query($conn,"SHOW COLUMNS FROM `$tb`"); +while ($r = mysqli_fetch_array($col)){ +$nn[]=$r['Field']; +} +echo "

        + + + + +
        - - -

        "; + +// asc/desc + +if ($ord=='asc') { +echo $lang["Asc"]." | ".$lang["Desc"]."

        "; } else { +echo "".$lang["Asc"]." | ".$lang["Desc"]."

        "; } + +// column values +echo "

        "; +while ($row = mysqli_fetch_array($val)) { +$v=$row["$nm"]; +$pri=""; +foreach ($cv as $c){ +$cc=explode("``",$c); +$c=$cc[0]; +$pv= $row["$c"]; +if($cc[1] == 0) { +$cc="`$tb`.`$c`"; +} else { +$cc= "CONVERT(`$tb`.`$c` USING utf8)"; +} +$pri.=" $cc = '$pv' AND"; +} +$pri=substr($pri,0,-3); +$pri=base64_encode($pri); + + +echo " - ".htmlspecialchars($v).""; +echo "
        +"; +} + + +echo "
        - - -

        - - -
        "; +mysqli_free_result($val); + + +// pagination function +function pag($total,$currentPage,$baseLink,$nextPrev=true,$limit=10) { +global $lang; +if(!$total OR !$currentPage OR !$baseLink) { +return false; } //Total Number of pages +$totalPages = ceil($total/$limit); //Text to use after number of pages +$txtPagesAfter = ($totalPages==1)? " page": " pages"; //Start off the list. +$txtPageList = '
        ' .$totalPages.$txtPagesAfter .':
        ' ; //Show only 3 pages before current page(so that we don't have too many pages) +$min = ($currentPage - 3 < $totalPages && $currentPage-3 > 0) ? $currentPage-3 : 1; //Show only 3 pages after current page(so that we don't have too many pages) +$max = ($currentPage + 3 > $totalPages) ? $totalPages : $currentPage+3; //Variable for the actual page links +$pageLinks = ""; //Loop to generate the page links +for($i=$min;$i<=$max ;$i++) { +if($currentPage==$i) { //Current Page +$pageLinks .= ' '.$i.' ' ; } +else { $pageLinks .= ' '.$i.' ' ; } } +if($nextPrev ) { //Next and previous links +$next = ($currentPage + 1 > $totalPages) ? false : ''.$lang["Next"].'' ; +$prev = ($currentPage - 1 <= 0 ) ? false : ''.$lang["Prev"].'' ; } +$first= ($currentPage > 2) ? ''.$lang["First"].' ': false ; + + $last= ($currentPage < ($totalPages - 2)) ? " ".$lang["Last"]." " : false ; + +return $txtPageList.$first.$prev.$pageLinks.$next.$last; } + // end pagination + +// show pages +if($total_pages != 1) +echo pag($nr,$page,"?or=$or&nm=$nnm&k=$k&perp=$perp&tb=$tb&page=",true,$perp); +else +echo "1 page
        - - -"; + +if ($total_pages>2) { +echo "

        "; +if ($ord=='desc') echo ""; +echo "
        - - -
        "; +} + +echo "

        ".$lang["Show"]." + +"; +echo "
        "; + +} else { +echo "
        ".strtoupper($lang["Browse"])."
        ".$lang["Query"].": ".htmlspecialchars($sql)."

        ".$lang["tables"].">$tb
        - - -
        ".$lang["Browse"]." |".$lang["Structure"]." | ".$lang["Search"]." | ".$lang["Insert"]." | ".$lang["Clear"]." | ".$lang["Drop"]."
        - - -
        +"; +echo $lang["No_values_inserted"]."
        "; +} +} +echo "

        $nr ".$lang["records"]."

        "; +include('foot.php'); +?> \ No newline at end of file diff --git a/public/tool/mysql/br2.php b/public/tool/mysql/br2.php new file mode 100644 index 0000000..60f8b3d --- /dev/null +++ b/public/tool/mysql/br2.php @@ -0,0 +1,44 @@ +".$lang["INFO"]."

        ".$lang["tables"].">$tb>".$lang["Browse"].">".$lang["INFO"]."
        - - -
        ".$lang["Edit"]." | ".$lang["Drop"]." (".$lang["delete"].")
        - - - +"; +$result = mysqli_query($conn,"SELECT * FROM `$tb`"); +if (!$result) { +printf($lang["table_not_exists"],$tb); } else { + +$de = mysqli_query($conn,"SHOW COLUMNS FROM `$tb`"); +$nr=@mysqli_num_rows($de); +if ($nr >0) { +$i = 0; +echo ""; +while ($row = mysqli_fetch_array($de)) { +$meta = mysqli_fetch_field_direct($result, $i); +$nm=$meta->name; +$ga = mysqli_query($conn,"SELECT `$nm` FROM `$tb` WHERE $pri"); +$r = mysqli_fetch_array($ga); +$rr=$r["$nm"]; +echo ""; +echo ""; +$i++; +} +echo "
        ".strtoupper($lang["Column"])."".strtoupper($lang["Value"])."
        ".htmlentities($nm)." ".htmlentities($rr)."
        "; +} else { +echo $lang["No_values_inserted"]; +} + +} +echo "

        "; +include('foot.php'); +?> \ No newline at end of file diff --git a/public/tool/mysql/col.php b/public/tool/mysql/col.php new file mode 100644 index 0000000..d187d51 --- /dev/null +++ b/public/tool/mysql/col.php @@ -0,0 +1,20 @@ + +$cl

        +".$lang["tables"].">$tb>$cl
        - - -
        ".$lang["Edit"]."

        ".$lang["Browse"]."

        ".$lang["Copy"]."

        ".$lang["Drop"]." (".$lang["delete"].") +

        "; +include('foot.php'); +?> diff --git a/public/tool/mysql/config.php b/public/tool/mysql/config.php new file mode 100644 index 0000000..01cea97 --- /dev/null +++ b/public/tool/mysql/config.php @@ -0,0 +1,25 @@ + \ No newline at end of file diff --git a/public/tool/mysql/copyc.php b/public/tool/mysql/copyc.php new file mode 100644 index 0000000..c1392d3 --- /dev/null +++ b/public/tool/mysql/copyc.php @@ -0,0 +1,31 @@ + +COPY - $cl

        ".$lang["tables"].">$tb>$cl
        - - -
        "; +if(!$vmi) { +echo "

        +".$lang["Copy_to"].":
        +
        "; +} else { +$nm=trim($_POST['nm']); +$d=mysqli_query($conn,"ALTER TABLE `$tb` ADD `$nm` TEXT NOT NULL;"); +$d=mysqli_query($conn,"UPDATE `$tb` SET `$nm` = `$cl`;"); +if ($d) { +echo " +$cl ".$lang["copyed_to"]." $nm !"; } else { +echo $lang["Error"].": "; +echo mysqli_error($conn); +} +} +echo "
        "; +include('foot.php'); +?> diff --git a/public/tool/mysql/copyt.php b/public/tool/mysql/copyt.php new file mode 100644 index 0000000..7669260 --- /dev/null +++ b/public/tool/mysql/copyt.php @@ -0,0 +1,40 @@ + +COPY - $tb

        ".$lang["tables"].""; +if(!$vmi) { +echo ">$tb
        - - -

        +".$lang["Copy_to"].":
        +
        "; +} else { +$tp=trim($_POST['tp']); $nm=trim($_POST['nm']); +if ($tp=='1') { +$d=mysqli_query($conn,"CREATE TABLE `$nm` SELECT * FROM `$tb`"); +if ($d) { +echo "
        - - -
        +$tb ".$lang["copyed_to"]." $nm !"; } else { +echo "
        - - -
        ".$lang["Error"].": "; +echo mysqli_error($conn); +} +} elseif ($tp=='2') { +$d=mysqli_query($conn,"CREATE TABLE `$nm` LIKE `$tb`"); +if ($d) { +echo "
        - - -
        +$tb ".$lang["structure"]." ".$lang["copyed_to"]." $nm !"; } else { +echo "
        - - -
        ".$lang["Error"].": "; +echo mysqli_error($conn); +} +} + +} +echo "
        "; +include('foot.php'); +?> diff --git a/public/tool/mysql/data/default.css b/public/tool/mysql/data/default.css new file mode 100644 index 0000000..d2d0a23 --- /dev/null +++ b/public/tool/mysql/data/default.css @@ -0,0 +1,62 @@ +body +{ +font-size:small; +margin-top :0; +margin-left :0; +margin-right :0; +text-align :center; +line-height:100%; +color:black; +background-color :#ffffff; +vertical-align: middle; +max-width:480px; +margin: 0 auto; +} + +.logo +{ +padding:4px; +margin:3px; +border:1px dotted lime; +background-color:#000000; +text-align:center +} + +.header, .footer +{ +background:#888; +font-weight:bold; +margin:3px; +border:1px solid black; +padding:3px; +color:white; +-moz-border-radius:4px; +-webkit-border-radius:4px; +} + +.shout +{ +margin:3px; +background:#f3f3f3; +border:1px solid black; +-moz-border-radius:4px; +-webkit-border-radius:4px; +text-align:center; +padding:3px; +} +a:link, a:visited, a:active +{ +color : #235a81; +text-decoration : none; +font-weight : bold; +} +a:hover +{ + text-decoration: underline; + color: #235a81; +} + +.header,.footer a +{ +color: white; +} \ No newline at end of file diff --git a/public/tool/mysql/data/index.php b/public/tool/mysql/data/index.php new file mode 100644 index 0000000..bbfd921 --- /dev/null +++ b/public/tool/mysql/data/index.php @@ -0,0 +1,30 @@ +".strtoupper($lang["Files"]." ".$lang["saved"])."

        ".$lang["tables"]."
        - - -
        "; +$ac=$_GET['ac']; +if (!$ac) { +if ($handle = opendir('.')) { +$q=0; +while (false !=($file=readdir($handle))) { +if ($file !='.' && $file !='..' && $file !='index.php' && $file !='default.css') { +echo "» $file - (".$lang["delete"].")
        "; +$q++; } } +if ($q==0) { +echo $lang["No_files"]." !"; } +closedir($handle); +} else { +echo $lang["Error"].": Folder can not be open !"; } +} else { +$f=$_GET['f']; +unlink($f); +echo "$f ".$lang["deleted"]." !

        ".$lang["Back"].""; +} +echo "

        "; +include('../foot.php'); +?> \ No newline at end of file diff --git a/public/tool/mysql/default.css b/public/tool/mysql/default.css new file mode 100644 index 0000000..d2d0a23 --- /dev/null +++ b/public/tool/mysql/default.css @@ -0,0 +1,62 @@ +body +{ +font-size:small; +margin-top :0; +margin-left :0; +margin-right :0; +text-align :center; +line-height:100%; +color:black; +background-color :#ffffff; +vertical-align: middle; +max-width:480px; +margin: 0 auto; +} + +.logo +{ +padding:4px; +margin:3px; +border:1px dotted lime; +background-color:#000000; +text-align:center +} + +.header, .footer +{ +background:#888; +font-weight:bold; +margin:3px; +border:1px solid black; +padding:3px; +color:white; +-moz-border-radius:4px; +-webkit-border-radius:4px; +} + +.shout +{ +margin:3px; +background:#f3f3f3; +border:1px solid black; +-moz-border-radius:4px; +-webkit-border-radius:4px; +text-align:center; +padding:3px; +} +a:link, a:visited, a:active +{ +color : #235a81; +text-decoration : none; +font-weight : bold; +} +a:hover +{ + text-decoration: underline; + color: #235a81; +} + +.header,.footer a +{ +color: white; +} \ No newline at end of file diff --git a/public/tool/mysql/drop_rec.php b/public/tool/mysql/drop_rec.php new file mode 100644 index 0000000..cce48af --- /dev/null +++ b/public/tool/mysql/drop_rec.php @@ -0,0 +1,31 @@ + +DROP - $v

        ".$lang["tables"].""; +if (!$vmi) +{ +echo ">$tb>$v>".$lang["Drop"]."

        - - -
        ".$lang["DROP_DELETE_this_record"]."

        ".$lang["Yes"]." | ".$lang["No"]." +"; } else { +$d=mysqli_query($conn,"DELETE FROM `$tb` WHERE $pri LIMIT 1"); +if ($d) { +echo "
        - - -
        ".htmlspecialchars("DELETE FROM `$tb` WHERE $pri LIMIT 1")." +

        ".$lang["Record_droped"]; } else { +echo "
        - - -
        ".$lang["Error"].": "; +echo mysqli_error($conn); +} +} +echo "

        "; +include('foot.php'); +?> \ No newline at end of file diff --git a/public/tool/mysql/dropc.php b/public/tool/mysql/dropc.php new file mode 100644 index 0000000..6b5048d --- /dev/null +++ b/public/tool/mysql/dropc.php @@ -0,0 +1,28 @@ + +DROP - $cl

        Tables"; +if (!$vmi) +{ +echo ">$tb>$cl>Drop

        - - -
        ".$lang["DROP_DELETE_COLUMN"]." $cl ?
        ".$lang["Yes"]." | ".$lang["No"]." +"; } else { +$d=mysqli_query($conn,"ALTER TABLE `$tb` DROP `$cl`"); +if ($d) { +echo ">$tb
        - - -
        +Column $cl droped !"; } else { +echo "
        - - -
        ".$lang["Error"].": "; +echo mysqli_error($conn); +} +} +echo "

        "; +include('foot.php'); +?> diff --git a/public/tool/mysql/dropt.php b/public/tool/mysql/dropt.php new file mode 100644 index 0000000..e4d2537 --- /dev/null +++ b/public/tool/mysql/dropt.php @@ -0,0 +1,31 @@ + +DROP - $tb

        Tables"; +if (!$vmi) +{ +echo ">$tb>Drop

        - - -
        ".$lang["DROP_DELETE_TABLE"]." $tb ?

        ".$lang["Yes"]." | ".$lang["No"]." +"; } else { +$sql="DROP TABLE `$tb`"; +$d=mysqli_query($conn,$sql); +if ($d) { +echo "
        - - -

        ".$lang["Query"].": ".htmlspecialchars($sql)."

        "; +printf($lang["Table_droped"],$tb); + } else { +echo "
        - - -

        ".$lang["Query"].": ".htmlspecialchars($sql)."

        ".$lang["Error"].": "; +echo mysqli_error($conn); +} +} +echo "

        "; +include('foot.php'); +?> diff --git a/public/tool/mysql/edit_col.php b/public/tool/mysql/edit_col.php new file mode 100644 index 0000000..4095d23 --- /dev/null +++ b/public/tool/mysql/edit_col.php @@ -0,0 +1,293 @@ +".$lang["MODIFY_COLUMN"]."
        $cl

        ".$lang["tables"].">$tb"; +if (!$vmi) { +echo ">$cl>".$lang["edit_column"]."
        - - -
        "; +echo " +

        +".$lang["colunm_name"].":
        ".$lang["type"].": "; +/// get column details +$xx=mysqli_query($conn,"SHOW COLUMNS FROM `$tb`"); +while ($r = mysqli_fetch_array($xx)){ +if ($r["Field"] == $cl){ +$t=$r["Type"]; +$t=explode("(",$t); +$type = $t[0]; +$l=explode(")",$t[1]); +$lh=$l[0]; +$uns=$l[1]; +$null=0; +if ($r["Null"] == "NO") $null=1; +$avmi=$r["Default"]; +if ($avmi != "") $df=$avmi; +echo $r["Extra"]; +if($r["Extra"] == "auto_increment") $zx="SELECTED"; +} +} +print '
        +".$lang["Length"].":
        "; +print $lang["Collation"].':
        '.$lang["Attributes"].':
        NULL
        '.$lang["Default"].':
        '.$lang["Extra"].':
        '; +print "
        "; +} else { +$tc=trim($_POST['tc']); +$ct=trim($_POST['ct']); +$lg=trim($_POST['lg']); +$co=trim($_POST['co']); +$at=trim($_POST['at']); +$nu=trim($_POST['nu']); +$df=trim($_POST['df']); +$ex=trim($_POST['ex']); +if($lg !="") $lg="($lg)"; +$create=mysqli_query($conn,"ALTER TABLE `$tb` CHANGE `$cl` `$tc` $ct $lg $co $at $nu $df $ex"); +if ($create) { +echo ">$tc>".$lang["edit_column"]."
        - - -
        "; +printf($lang["Column_saved"],$tc); +} else { +echo ">$cl>".$lang["edit_column"]."
        - - -
        ".$lang["Error"].": "; +echo mysqli_error($conn); +} +} +echo '
        '; +include('foot.php'); +?> diff --git a/public/tool/mysql/edit_rec.php b/public/tool/mysql/edit_rec.php new file mode 100644 index 0000000..a5d144c --- /dev/null +++ b/public/tool/mysql/edit_rec.php @@ -0,0 +1,75 @@ +".$lang["INFO"]."

        ".$lang["tables"].">$tb
        - - -
        "; +$result = mysqli_query($conn,"SELECT * FROM `$tb`"); +if (!$result) { +printf($lang["table_not_exists"],$tb); } else { +if (!$vmi) { +echo "

        "; +$de = mysqli_query($conn,"SHOW COLUMNS FROM `$tb`"); +$nr=@mysqli_num_rows($de); +if ($nr >0) { +$i = 0; +while ($row = mysqli_fetch_array($de)) { +$meta = mysqli_fetch_field_direct($result, $i); +$nm=$meta->name; +$ga = mysqli_query($conn,"SELECT `$nm` FROM `$tb` WHERE $pri"); +$r = mysqli_fetch_array($ga); +$rr=$r["$nm"]; +echo "» $nm:
        "; +echo "
        "; +$i++; +} +echo "
        "; +} else { +echo $lang["No_values_inserted"]; +} +} else { +$de = mysqli_query($conn,"SHOW COLUMNS FROM `$tb`"); +$updt=""; +$i=0; +while ($row = mysqli_fetch_array($de)) { +$meta = mysqli_fetch_field_direct($result, $i); +$nm=$meta->name; // column name +$ga = mysqli_query($conn,"SELECT `$nm` FROM `$tb` WHERE $pri"); +$r = mysqli_fetch_array($ga); +$rr=$r["$nm"]; // original value +$nv =mysqli_real_escape_string($conn,trim($_POST["$nm"])); // new value +// check if is anything to change +$nvv=stripslashes($nv); +if($rr != $nvv){ +$updt.= " `$nm`='$nv',"; +} +$i++; +} +if($updt !="") { +$updt=substr($updt,"0","-1"); +$dosql = "UPDATE `$tb` SET $updt WHERE $pri LIMIT 1"; +echo "".htmlspecialchars($dosql)."
        "; +$do = mysqli_query($conn,$dosql); +if (!$do) +echo mysqli_error($conn); +else +echo $lang["saved"]." !"; + } else { + echo $lang["Nothing_to_change"]; + + } +} +} +echo ""; +include('foot.php'); +?> diff --git a/public/tool/mysql/export.php b/public/tool/mysql/export.php new file mode 100644 index 0000000..14e0772 --- /dev/null +++ b/public/tool/mysql/export.php @@ -0,0 +1,108 @@ +".strtoupper($lang["Export"])."

        ".$lang["tables"].">".$lang["Export"]."
        - - -
        "; +if (!$vmi) { +echo "

        ".$lang["Export"].":


        ".$lang["Zip_sql_file"]."
        + +"; +} elseif ($vmi=='ionutvmi') { +/* backup the db OR just a table */ +function backup_tables($tables = '*',$dt,$zx) +{ + global $k,$lang,$conn; + + //get all of the tables + if($tables == '*') + { + $tables = array(); + $result = mysqli_query($conn,'SHOW TABLES'); + while($row = mysqli_fetch_row($result)) + { + $tables[] = $row[0]; + } + } + else + { + $tables = is_array($tables) ? $tables : explode(',',$tables); + } + + //cycle through + foreach($tables as $table) + { + $result = mysqli_query($conn,'SELECT * FROM `'.$table.'`'); + $num_fields = mysqli_num_fields($result); + $return.= 'DROP TABLE `'.$table.'`;'; + $row2 = mysqli_fetch_row(mysqli_query($conn,'SHOW CREATE TABLE `'.$table.'`')); + $return.= "\n\n".$row2[1].";\n\n"; + if($dt=="full"){ + for ($i = 0; $i < $num_fields; $i++) + { + while($row = mysqli_fetch_row($result)) + { + $return.= 'INSERT INTO `'.$table.'` VALUES('; + for($j=0; $j<$num_fields; $j++) + { + $row[$j] = addslashes($row[$j]); + $row[$j] = str_replace("\n","\\n",$row[$j]); + if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; } + if ($j<($num_fields-1)) { $return.= ','; } + } + $return.= ");\n"; + } + } } + $return.="\n\n\n"; + } + //save file + $dd="backup-".date('d_M_Y')."_".time().".sql"; + + $handle = fopen("data/$dd","w+"); + fwrite($handle,$return); + fclose($handle); +if ($zx==1) { +fopen("data/$dd.zip","w"); + +$zip = new ZipArchive; +if ($zip->open("data/$dd.zip") === TRUE) { +$zip->addFile("data/$dd", "$dd") or die('error'); +} +$zip->close(); +echo "- ".$lang["File"]." $dd.zip ".$lang["created"].".

        - ".$lang["DOWNLOAD"]." $dd.zip

        - ".$lang["delete"]." ".$lang["File"]." $dd.zip
        "; +} else { +echo "- ".$lang["File"]." $dd ".$lang["created"].".

        - ".$lang["DOWNLOAD"]." $dd

        - ".$lang["delete"]." ".$lang["File"]." $dd
        "; +} + + echo $f; + } + $tbs=$_POST['extb']; +if(!$tbs) die($lang["No_Table_Selected"]); +$z=0; +if (isset($_POST['zip'])) { +$z=1; +} +// echo $_POST['tp']; +backup_tables($tbs,$_POST['tp'],$z); + +} +if ($vmi=='del') { +$f=$_GET['f']; +$g= @unlink("data/$f"); +if ($g) { +printf($lang["FILE_DELETED"],$f); } else { +echo $lang["Error"]; +} +} +echo ""; +include('foot.php'); +?> \ No newline at end of file diff --git a/public/tool/mysql/foot.php b/public/tool/mysql/foot.php new file mode 100644 index 0000000..8edaf03 --- /dev/null +++ b/public/tool/mysql/foot.php @@ -0,0 +1,5 @@ +©ionutvmi | ".$lang["Check_for_updates"]." | 7-Jan-2012 + +"; +?> \ No newline at end of file diff --git a/public/tool/mysql/head.php b/public/tool/mysql/head.php new file mode 100644 index 0000000..1d8720b --- /dev/null +++ b/public/tool/mysql/head.php @@ -0,0 +1,14 @@ + '; +echo "wap phpmyadmin by ionutvmi"; +echo ""; + +function err($txt){ +print "
        $txt
        "; +include 'foot.php'; +exit; +} + + +?> \ No newline at end of file diff --git a/public/tool/mysql/import.php b/public/tool/mysql/import.php new file mode 100644 index 0000000..e52c7d6 --- /dev/null +++ b/public/tool/mysql/import.php @@ -0,0 +1,62 @@ +".$lang["IMPORT_SQL"]."

        ".$lang["tables"].">".strtolower($lang["IMPORT_SQL"])."
        - - -
        "; +if(!$vmi) { +print "- ".$lang["only_sql_files"].".

        ".$lang["Url"].":

        ".$lang["Separator"].":


        "; + +} else { +if($vmi==''||$vmi=='http://') die($lang["enter_url"]); +$ext= end(explode('.', $vmi)); +if($ext !="sql") die($lang["file_must_be_sql"]); +$sep=trim($_POST['sep']); +$shw=$_POST['shw']; +if(!$sep) die($lang["enter_separator"]); +$filename="import".rand(1,100).".sql"; +$dir="data/".$filename; +if(!copy($vmi,$dir)) { +die($lang["ERROR_File_NOT_copyed"]); } else { +// IF FILE IS UPLOAD +$handle = fopen("data/$filename", "r"); +$contents = fread($handle, filesize("data/$filename")); +fclose($handle); +echo "- $filename uploaded !
        "; +$sql=str_replace("\r\n","\n",$contents); $sql=str_replace("\n","\r",$sql); +$sql=preg_replace("~(--|##)[^\r]*\r~","\r",$sql); +$sql=preg_replace("~\r\s*\r~","\r",$sql); + +$contents=explode($sep,$sql); +$q=0; +foreach($contents as $coo) { +if(!empty($coo)) { +$do=mysqli_query($conn,$coo); +$cop=htmlspecialchars(substr($coo, 0, 40)); +if ($do) { +$q++; +if($shw=="yes") { +echo ">$cop... ".$lang["executed"]."!
        "; } +} else { +if($shw=="yes") { +echo ">$cop... ".$lang["not_executed"]." ! ".$lang["Error"].": "; +echo mysqli_error($conn)."
        "; } +} } +} +echo "
        $q ".strtolower($lang["Query"]." ".$lang["executed"])." !"; +if ($_POST['del'] == "yes") { +unlink("data/$filename"); +echo "
        - ".$lang["deleted"]." !"; } else { +echo "
        - ".$lang["saved"]."!"; } + + +}} +echo ""; +include('foot.php'); +?> diff --git a/public/tool/mysql/in.php b/public/tool/mysql/in.php new file mode 100644 index 0000000..c3c6451 --- /dev/null +++ b/public/tool/mysql/in.php @@ -0,0 +1,53 @@ +".strtoupper($lang["Insert"])."
        ".$lang["Query"].": ".htmlspecialchars($sql)."

        ".$lang["tables"].">$tb
        - - -
        ".$lang["Browse"]." | ".$lang["Structure"]." | ".$lang["Search"]." | ".$lang["Insert"]." | ".$lang["Clear"]." | ".$lang["Drop"]."
        - - -
        +"; +$result = mysqli_query($conn,$sql); +if (!$result) { +printf($lang["table_not_exists"],$tb); +} else { +if (!$vmi) { +echo " +"; +$i = 0; +while ($i < mysqli_num_fields($result)) { +$meta = mysqli_fetch_field_direct($result, $i); +echo "".htmlspecialchars($meta->name).""; +echo ":
        +"; +$i++; +} +echo "

        "; +mysqli_free_result($result); +} else { +$i = 0; $wh=""; $val=""; +$nrf= mysqli_num_fields($result) - 1; +while ($i < mysqli_num_fields($result)) { +$meta = mysqli_fetch_field_direct($result, $i); +$t=$_POST[$meta->name]; +if($i == $nrf) { +$wh.="`$meta->name`"; +$val.="'$t'"; } else { +$wh.="`$meta->name`,"; +$val.="'$t',"; } +$i++; +} +$do = mysqli_query($conn,"INSERT INTO `$tb` ($wh) VALUES ($val)"); +$sqll="INSERT INTO `$tb` ($wh) VALUES ($val)"; +if($do) +echo "
        ".$lang["Query"].": ".htmlspecialchars($sqll)."



        ".$lang["Done"]." !"; +else +echo "

        ".$lang["Query"].": ".htmlspecialchars($sqll)."


        ".$lang["Error"].": ".mysqli_error($conn); +} } +echo ""; +include('foot.php'); +?> \ No newline at end of file diff --git a/public/tool/mysql/index.php b/public/tool/mysql/index.php new file mode 100644 index 0000000..03c7cae --- /dev/null +++ b/public/tool/mysql/index.php @@ -0,0 +1,37 @@ + +

        +".$lang["Database_Server"].":

        +".$lang["Database_Port"].":

        +".$lang["Database_User"].":

        +".$lang["Database_Password"].":

        +".$lang["Database_Name"].":

        +
        +
        "; +} +else{ +$a=trim($_GET['dbs']); +$b=trim($_GET['dbu']); +$c=trim($_GET['dbp']); +$d=trim($_GET['dbn']); +$e=trim($_GET['port']); +if($a=="" || $b=="" || $c=="" || $d=="" || $e=="") err("Something is blank"); +$e=base64_encode($a."^^^".$b."^^^".$c."^^^".$d."^^^".$e); +print"
        ".$lang["WELCOME"]." $dbu
        +
        » ".$lang["ENTER"]." « +
        "; +} + +include 'foot.php'; +?> \ No newline at end of file diff --git a/public/tool/mysql/lang/Read_Me.txt b/public/tool/mysql/lang/Read_Me.txt new file mode 100644 index 0000000..2f235e6 --- /dev/null +++ b/public/tool/mysql/lang/Read_Me.txt @@ -0,0 +1,9 @@ +**** wap phpmyadmin **** +**** Thanks to Mr. Hu from China **** + +** INSTALL ** +Replace the lang/index.php file with the index.php file from this archive + + +- to translate wap phpmyadmin in your language edit `index.php` file from current folder +- if you want to share your translation and make it available for other users send the translated version at ionutvmi@gmail.com \ No newline at end of file diff --git a/public/tool/mysql/lang/index.php b/public/tool/mysql/lang/index.php new file mode 100644 index 0000000..192cbd5 --- /dev/null +++ b/public/tool/mysql/lang/index.php @@ -0,0 +1,172 @@ +%s 已创建!"; // keep %s unchanged +$lang["ADD_TABLE"] = "新建表格"; +$lang["table_name"] = "表格名称"; +$lang["table_created"] = "表格 %s 成功被创建"; // keep %s unchanged +$lang["Browse"] = "浏览"; +$lang["Structure"] = "结构"; +$lang["Search"] = "搜索"; +$lang["Insert"] = "插入"; +$lang["Clear"] = "清除"; +$lang["Drop"] = "删除"; +$lang["table_not_exists"] = "表格 %s 不存在"; // keep %s unchanged +$lang["Asc"] = "递增"; // short for ascending +$lang["Desc"] = "递减"; // short for descending +$lang["DELETE_SELECTED"] = "删除选项"; +$lang["Jump"] = "跳"; +$lang["No_values_inserted"] = "没有任何值"; +$lang["records"] = "记录"; +$lang["INFO"] = "信息"; +$lang["Edit"] = "修改"; +$lang["Column"] = "栏"; +$lang["Value"] = "值"; +$lang["No_connection_to_mysql"] = "没有连接到数据库"; +$lang["ERROR_WRONG_DB_NAME"] = "错误的数据名字"; +$lang["Copy_to"] = "复制到"; +$lang["Copy"] = "复制"; +$lang["copyed_to"] = "复制到"; +$lang["Copy_structure_and_data"] = "复制结构+数据"; +$lang["Copy_structure"] = "复制结构"; +$lang["structure"] = "结构"; +$lang["DROP_DELETE_this_record"] = "删除这个记录 ?"; +$lang["Yes"] = "是"; +$lang["No"] = "否"; +$lang["Record_droped"] = "记录已删除 !"; +$lang["DROP_DELETE_COLUMN"] = "删除此项吗?"; +$lang["DROP_DELETE_TABLE"] = "删除此数据库表吗?"; +$lang["Table_droped"] = "已经删除%s 表!"; // keep %s unchanged +$lang["MODIFY_COLUMN"] = "修改列"; +$lang["edit_column"] = "修改列"; +$lang["Column_saved"] = "保存 %s 列 !"; // keep %s unchanged +$lang["Nothing_to_change"] = "没有任何变动"; +$lang["structure_only"] = "结构"; +$lang["structure_data"] = "结构和数据"; +$lang["Zip_sql_file"] = "备份并打包"; +$lang["F"] = "文件创建成功,下载后请删除"; +$lang["DD"] = "下载文件"; +$lang["123"] = "这将清空表内所有内容"; +$lang["ok"] = "确定"; +$lang["File"] = "文件"; +$lang["created"] = "创建"; +$lang["DOWNLOAD"] = "下载"; +$lang["No_Table_Selected"] = "没有选择表 !!!"; +$lang["FILE_DELETED"] = "文件 %s 删除"; // keep %s unchanged +$dat=date('Y-m-d'); +$lang["title"] = "wap-phpmyadmin中文版(由糖果技术维护制作)"; +$lang["tops"] = "wap-phpmyadmin中文V2"; +$lang["Check_for_updates"] = "wap-phpmyadmin中文版由糖果技术维护制作
        ".$dat.""; +$lang["IMPORT_SQL"] = "导入sql"; +$lang["only_sql_files"] = "仅仅sql文件"; +$lang["Url"] = "网址"; +$lang["Separator"] = "分离器"; +$lang["Delete_after_execute"] = "执行语句后删除sql文件"; +$lang["Save_after_execute"] = "执行语句后保存sql文件"; +$lang["HIDE_MESSAGES"] = "隐藏消息"; +$lang["SHOW_MESSAGES"] = "显示消息"; +$lang["Execute"] = "执行"; +$lang["enter_url"] = "输入网址"; +$lang["file_must_be_sql"] = "文件必须是sql"; +$lang["enter_separator"] = "进入分离器"; +$lang["ERROR_File_NOT_copyed"] = "错误.文件不能复制"; +$lang["executed"] = "执行"; +$lang["not_executed"] = "不执行"; +$lang["Done"] = "完成"; +$lang["Database_Server"] = "数据库地址"; +$lang["Database_Port"] = "数据库端口"; +$lang["Database_User"] = "数据库用户"; +$lang["Database_Password"] = "数据库密码"; +$lang["Database_Name"] = "数据库名称"; +$lang["ENTER_DB"] = "执行数据库"; +$lang["WELCOME"] = "欢迎回来!登陆管理成功"; +$lang["ENTER"] = "进入管理数据库"; +$lang["You_selected_records"] = "你选择了 %s 记录"; // keep %s unchanged +$lang["You_selected_columns"] = "你选择了 %s 列"; // keep %s unchanged +$lang["You_selected_tables"] = "你选择了 %s 数据库表"; // keep %s unchanged +$lang["DO_YOU_WANT_TO_DELETE_RECORDS"] = "确认删除记录?"; +$lang["DO_YOU_WANT_TO_DELETE_COLUMNS"] = "确认删除此列?"; +$lang["DO_YOU_WANT_TO_ACT_TABLE"] = "确认操作此数据库表?"; +$lang["Nothing_selected"] = "没有选择 !"; +$lang["Column_cl_droped"] = "
        %s 删除!"; // keep %s unchanged +$lang["SELECTED"] = "已选"; +$lang["Table"] = "数据库表"; +$lang["Was_emptyed"] = "被成功清空"; +$lang["was_renamed_to"] = "更名为"; +$lang["Rename_to"] = "更名为"; +$lang["renamed_to"] = "更名为"; +$lang["No_condition_to_search"] = "没有条件进行搜索!"; +$lang["Search_has_been_submited_wait"] = "搜索已提交等待重定向或点击这里!"; // keep %s unchanged +$lang["No_results_search"] = "
        你的搜索没有结果,请尝试返回重新测试!"; // keep %s unchanged +$lang["No_records_search"] = "表必须包含一些数据,然后才可以使用搜索选项 !
        "; +$lang["DO_NOT_USE_THIS_IF_YOU_DO_NOT_KNOW_HOW"] = "如果你不知道这是什么,请不要使用这个"; +$lang["DO_NOT_FORGET_TO_INCLUDE_SEPARATOR_IN SQL_CODE"] = "如果你不知道这是什么,请不要使用这个"; +$lang["copy_table"] = "复制表"; +$lang["rename_table"] = "重命名表"; +$lang["TRUNCATE_TABLE"] = "清空数据库表"; +$lang["UPLOAD_SQL"] = "上传sql文件"; +$lang["Upload"] = "上传"; +$lang["Max"] = "限制"; // as in maximum +$lang["only_sql_files"] = "请上传后缀为sql的文件!"; +$lang["ERROR_NO_FILE_SELECTED"] = "错误!没有选定的文件"; +$lang["EXT_NOT_ALLOWED"] = "未获准续期"; +$lang["FILE_IS_TO_BIG_Maxim"] = "文件太大,超出预设值"; +$lang["File_name_already_exists"] = "名字重复,请重试"; +$lang["ERROR_Try_again"] = "出错,请重试"; +$lang["row"] = "行"; +$lang["rows"] = "行"; + + + + diff --git a/public/tool/mysql/mdelc.php b/public/tool/mysql/mdelc.php new file mode 100644 index 0000000..0e40538 --- /dev/null +++ b/public/tool/mysql/mdelc.php @@ -0,0 +1,45 @@ +".$lang["DELETE_SELECTED"]; +$result = mysqli_query($conn,"SELECT * FROM `$tb`"); +if (!$result) { +printf($lang["table_not_exists"],$tb); } else { +$vmi=$_GET['vmi']; +echo "

        ".$lang["tables"].">$tb
        - - -
        "; +if (!$vmi) { +$rec=$_POST['i']; +$nrs=count($rec); +printf($lang["You_selected_records"],$nrs); +echo " !

        "; +echo $lang["DO_YOU_WANT_TO_DELETE_RECORDS"]."


        +

        "; +foreach ($rec as $files) { +echo ""; +} +echo "
        ".$lang["Back"].""; +} else { +$fl=$_POST['i']; +foreach ($fl as $clm) { +$pri=base64_decode($clm); +$d=mysqli_query($conn,"DELETE FROM `$tb` WHERE $pri"); +if ($d) { +echo "
        ".$lang["Record_droped"]; } else { +echo "
        ".$lang["Error"].": "; +echo mysqli_error($conn); } +} +} +} + +echo "
        "; +include('foot.php'); +?> \ No newline at end of file diff --git a/public/tool/mysql/mdelcl.php b/public/tool/mysql/mdelcl.php new file mode 100644 index 0000000..5dc56f6 --- /dev/null +++ b/public/tool/mysql/mdelcl.php @@ -0,0 +1,49 @@ +".$lang["DELETE_SELECTED"]; +$result = mysqli_query($conn,"SELECT * FROM `$tb`"); +if (!$result) { +printf($lang["table_not_exists"],$tb); } else { +$vmi=$_GET['vmi']; +echo "

        ".$lang["tables"].">$tb
        - - -
        "; +if (!$vmi) { +$rec=$_POST['i']; +if(!$rec) { +echo $lang["Nothing_selected"]; +} else { +$nrs=count($nrs); +printf($lang["You_selected_columns"],$nrs); +echo ":

        "; +foreach ($rec as $ag) { +echo "$ag
        "; +} +echo $lang["DO_YOU_WANT_TO_DELETE_COLUMNS"]."


        +

        "; +foreach ($rec as $files) { +echo ""; +} +echo "
        ".$lang["Back"].""; +} +} else { +$fl=$_POST['i']; +foreach ($fl as $clm) { +$d=mysqli_query($conn,"ALTER TABLE `$tb` DROP `$clm`"); +if ($d) { +printf($lang["Column_cl_droped"],$clm); } else { +echo "
        ".$lang["Error"].": "; +echo mysqli_error($conn); } +} +} +} + +echo ""; +include('foot.php'); +?> \ No newline at end of file diff --git a/public/tool/mysql/mtb.php b/public/tool/mysql/mtb.php new file mode 100644 index 0000000..3bf8560 --- /dev/null +++ b/public/tool/mysql/mtb.php @@ -0,0 +1,89 @@ +$act ".$lang["SELECTED"]." +

        ".$lang["tables"]."
        - - -
        "; + +if (!$vmi) { + $rec=$_POST['tb']; + if($rec && $act) + { + if($act == 'RENAME') + { + echo "

        "; + foreach($rec as $o) + { + echo "$o to
        "; + } + echo " "; + } else + { + $nrs=count($rec); + printf($lang["You_selected_tables"],$nrs); + echo ":

        "; + foreach ($rec as $ag) { + echo "$ag
        "; + } + printf($lang["DO_YOU_WANT_TO_ACT_TABLE"],$act); + echo "

        "; + + if($act !='EXPORT') { + echo ""; } else { + echo " +
        ".$lang["Zip_sql_file"]."
        + "; + } + foreach ($rec as $files) { + echo ""; + } + + echo "
        "; + } + } else { + echo $lang["Nothing_selected"]; + } +echo "
        ".$lang["Back"].""; +} else { + $fl=$_POST['extb']; + $new=$_POST['new']; + $i=0; + foreach ($fl as $clm) { + if($act=="DROP") { + $d=mysqli_query($conn,"DROP TABLE `$clm`"); + if ($d) { + echo "
        ".$lang["Table"]." ".htmlspecialchars($clm)." ".$lang["deleted"]." !"; } else { + echo "
        ".$lang["Error"].": "; + echo mysqli_error($conn); } + } elseif($act=="EMPTY") { + $d=mysqli_query($conn,"TRUNCATE TABLE `$clm`"); + if ($d) { + echo "
        ".$lang["Table"]." ".htmlspecialchars($clm)." ".$lang["Was_emptyed"]." !"; } else { + echo "
        ".$lang["Error"].": "; + echo mysqli_error($conn); } + } elseif ($act=='RENAME') { + $new_name=$new[$i]; ++$i; + $d=mysqli_query($conn,"ALTER TABLE `$clm` RENAME `$new_name`"); + if ($d) + { + echo "
        $clm ".$lang["was_renamed_to"]." $new_name "; + } else + { + echo "
        ".$lang["Error"].": "; + echo mysqli_error($conn); + } + } + + } +} +echo ""; +include('foot.php'); +?> \ No newline at end of file diff --git a/public/tool/mysql/pagination.class.php b/public/tool/mysql/pagination.class.php new file mode 100644 index 0000000..b96c131 --- /dev/null +++ b/public/tool/mysql/pagination.class.php @@ -0,0 +1,111 @@ +perPage = $perPage; + + // Assign the page variable + if (!empty($_GET['page'])) { + $this->page = $_GET['page']; // using the get method + } else { + $this->page = 1; // if we don't have a page number then assume we are on the first page + } + + // Take the length of the array + $this->length = count($array); + + // Get the number of pages + $this->pages = ceil($this->length / $this->perPage); + + // Calculate the starting point + $this->start = ceil(($this->page - 1) * $this->perPage); + + // Return the part of the array we have requested + return array_slice($array, $this->start, $this->perPage); + } + + function links() + { + global $lang; + // Initiate the links array + $plinks = array(); + $links = array(); + $slinks = array(); + + // Concatenate the get variables to add to the page numbering string + if (count($_GET)) { + $queryURL = ''; + foreach ($_GET as $key => $value) { + if ($key != 'page') { + $queryURL .= '&'.$key.'='.$value; + } + } + } + + // If we have more then one pages + if (($this->pages) > 1) + { + // Assign the 'previous page' link into the array if we are not on the first page + if ($this->page != 1) { + if ($this->showFirstAndLast) { + $plinks[] = ' «« '.$lang["First"].' '; + } + $plinks[] = ' « '.$lang["Prev"].' '; + } + + // Assign all the page numbers & links to the array + for ($j = 1; $j < ($this->pages + 1); $j++) { + if ($this->page == $j) { + $links[] = ' '.$j.' '; // If we are on the same page as the current item + } else { + $links[] = ' '.$j.' '; // add the link to the array + } + } + + // Assign the 'next page' if we are not on the last page + if ($this->page < $this->pages) { + $slinks[] = ' '.$lang["Next"].' » '; + if ($this->showFirstAndLast) { + $slinks[] = ' '.$lang["Last"].' »» '; + } + } + + // Push the array into a string using any some glue + return implode(' ', $plinks).implode($this->implodeBy, $links).implode(' ', $slinks); + } + return; + } + } +?> \ No newline at end of file diff --git a/public/tool/mysql/rename.php b/public/tool/mysql/rename.php new file mode 100644 index 0000000..a2530ed --- /dev/null +++ b/public/tool/mysql/rename.php @@ -0,0 +1,30 @@ + +".$lang["Rename"]." - $tb

        ".$lang["tables"].""; +if(!$vmi) { +echo ">$tb
        - - -

        +".$lang["Rename_to"].":
        +
        "; +} else { +$tp=trim($_POST['tp']); $nm=trim($_POST['nm']); + +$d=mysqli_query($conn,"ALTER TABLE `$tb` RENAME `$nm`"); +if ($d) { +echo "
        - - -
        +$tb ".$lang["renamed_to"]." $nm !"; } else { +echo "
        - - -
        ".$lang["Error"].": "; +echo mysqli_error($conn); +} +} +echo ""; +include('foot.php'); +?> \ No newline at end of file diff --git a/public/tool/mysql/search.php b/public/tool/mysql/search.php new file mode 100644 index 0000000..5b4a775 --- /dev/null +++ b/public/tool/mysql/search.php @@ -0,0 +1,354 @@ +".strtoupper($lang["Search"])."
        ".$lang["Query"].": ".htmlspecialchars($sql)."

        ".$lang["tables"].">$tb
        - - -
        ".$lang["Browse"]." | ".$lang["Structure"]." | ".$lang["Search"]." | ".$lang["Insert"]." | ".$lang["Clear"]." | ".$lang["Drop"]."
        - - -
        "; +printf($lang["table_not_exists"],$tb); +} else { + + +$xx = mysqli_query($conn,"SHOW INDEXES FROM `$tb` WHERE Key_name = 'PRIMARY'"); +$nrr=mysqli_num_rows($xx); + +if($nrr>0){ +while ($row = mysqli_fetch_array($xx)) { +$cvn= $row['Column_name']; +$cv[]=$cvn."``0"; +} +} else { +$i=0; +while ($i < mysqli_num_fields($result)) { + $meta = mysqli_fetch_field_direct($result, $i); +$cvn=$meta->name; +$cv[]=$cvn."``1"; +$i++; +} +} + +// get column + +$nnm=$_GET['nm']; +if(!$nnm) { +$meta = mysqli_fetch_field_direct($result, 0); +$nm=$meta->name; +}else{ +$nm= trim(base64_decode($nnm)); +} +// get nr of columns +// $val=mysqli_query($conn,"SELECT * FROM `$tb`"); +$nr=mysqli_num_rows($result); +if ($nr >0) { + + +$vmi=$_GET["vmi"]; + +if(!$vmi) { +echo "

        ".strtoupper($lang["Search"])."
        ".$lang["Query"].": ".htmlspecialchars($sql)."

        ".$lang["tables"].">$tb
        - - -
        ".$lang["Browse"]." | ".$lang["Structure"]." | ".$lang["Search"]." | ".$lang["Insert"]." | ".$lang["Clear"]." | ".$lang["Drop"]."
        - - -
        "; + +echo "

        +"; +$i = 0; +while ($i < mysqli_num_fields($result)) { +$meta = mysqli_fetch_field_direct($result, $i); + +echo "".htmlspecialchars($meta->name).""; +echo ''; + +echo "
        "; +$i++; +} +echo "
        "; +mysqli_free_result($result); + +} else { +if($_POST['q']) { + +$fun=$_POST['func']; +$nm=$_POST['nm']; +$sq=$_POST['sq']; +$vi=0; +$cond=''; +foreach($fun as $fu) +{ + if(trim($sq[$vi]) != '' || $fu=='13' || $fu=='14' || $fu=='19' || $fu=='20') + { + if($fu == '1') + { + $cond.=" AND `".$nm[$vi]."` > ".$sq[$vi]; + } + if($fu == '2') + { + $cond.=" AND `".$nm[$vi]."` >= ".$sq[$vi]; + } + if($fu == '3') + { + $cond.=" AND `".$nm[$vi]."` < ".$sq[$vi]; + } + if($fu == '4') + { + $cond.=" AND `".$nm[$vi]."` <= ".$sq[$vi]; + } + if($fu == '5') + { + $cond.=" AND `".$nm[$vi]."` LIKE '".$sq[$vi]."'"; + } + if($fu == '6') + { + $cond.=" AND `".$nm[$vi]."` LIKE '%".$sq[$vi]."%'"; + } + if($fu == '7') + { + $cond.=" AND `".$nm[$vi]."` NOT LIKE '".$sq[$vi]."'"; + } + if($fu == '8') + { + $cond.=" AND `".$nm[$vi]."` = '".$sq[$vi]."'"; + } + if($fu == '9') + { + $cond.=" AND `".$nm[$vi]."` != '".$sq[$vi]."'"; + } + if($fu == '10') + { + $cond.=" AND `".$nm[$vi]."` REGEXP '".$sq[$vi]."'"; + } + if($fu == '11') + { + $cond.=" AND `".$nm[$vi]."` REGEXP '^".$sq[$vi]."$'"; + } + if($fu == '12') + { + $cond.=" AND `".$nm[$vi]."` NOT REGEXP '".$sq[$vi]."'"; + } + if($fu == '13') + { + $cond.=" AND `".$nm[$vi]."` =''"; + } + if($fu == '14') + { + $cond.=" AND `".$nm[$vi]."` !=''"; + } + if($fu == '15') + { + $cond.=" AND `".$nm[$vi]."` IN (".$sq[$vi].")"; + } + if($fu == '16') + { + $cond.=" AND `".$nm[$vi]."` NOT IN (".$sq[$vi].")"; + } + if($fu == '17') + { + $cond.=" AND `".$nm[$vi]."` BETWEEN ".str_replace(',',' AND ',$sq[$vi]); + } + if($fu == '18') + { + $cond.=" AND `".$nm[$vi]."` NOT BETWEEN ".str_replace(',',' AND ',$sq[$vi]); + } + if($fu == '19') + { + $cond.=" AND `".$nm[$vi]."` IS NULL "; + } + if($fu == '20') + { + $cond.=" AND `".$nm[$vi]."` IS NOT NULL "; + } + + } +++$vi; +} +$cond= base64_encode(substr($cond, 4)); +$link="?k=$k&tb=$tb&vmi=ionutvmi&cc=$cond"; + +echo "
        +"; +printf($lang["Search_has_been_submited_wait"],$link); +echo "
        +
        "; +include "foot.php"; +exit; +} + +if(!$_GET['cc']) die($lang["No_condition_to_search"]); + +$ccod=trim($_GET["cc"]); +$cond= base64_decode($ccod); +$cond= "WHERE (".$cond.")"; +// number of results +$nr = mysqli_num_rows(mysqli_query($conn,"SELECT * FROM `$tb` $cond")); + +if($nr > 0) { +// get psge +if(!isset($_GET['page'])){ +$page = 1; +} else { +$page = (int)$_GET['page']; +} +if($page <= 0) $page=1; +$perp = (int)$_GET['perp']; +if(!$perp) $perp=10; +if($perp <= 0) $perp=10; +$from = (($page * $perp) - $perp); +$total_pages = ceil($nr / $perp); +if ($page>$total_pages) { +die("error"); } +$or=$_GET['or']; +if(!$or) $or=0; +if ($or==0) { +$ord='asc'; } else { +$ord='desc'; } +$sql="SELECT * FROM `$tb` $cond ORDER BY `$nm` $ord LIMIT $from, $perp"; +$val=mysqli_query($conn,$sql); +echo "
        ".strtoupper($lang["Search"])."
        ".$lang["Query"].": ".htmlspecialchars($sql)."

        ".$lang["tables"].">$tb
        - - -
        ".$lang["Browse"]." | ".$lang["Structure"]." | ".$lang["Search"]." | ".$lang["Insert"]." | ".$lang["Clear"]." | ".$lang["Drop"]."
        - - -
        "; +// column list +$col=mysqli_query($conn,"SHOW COLUMNS FROM `$tb`"); +while ($r = mysqli_fetch_array($col)){ +$nn[]=$r['Field']; +} +echo "

        + + + + + + +
        - - -

        "; + +// asc/desc + +if ($ord=='asc') { +echo $lang["Asc"]." | ".$lang["Desc"]."

        "; } else { +echo "".$lang["Asc"]." | ".$lang["Desc"]."

        "; } + +// column values +echo "

        "; +while ($row = mysqli_fetch_array($val)) { +$v=$row["$nm"]; +$pri=""; +foreach ($cv as $c){ +$cc=explode("``",$c); +$c=$cc[0]; +$pv= $row["$c"]; +if($cc[1] == 0) { +$cc="`$tb`.`$c`"; +} else { +$cc= "CONVERT(`$tb`.`$c` USING utf8)"; +} +$pri.=" $cc = '$pv' AND"; +} +$pri=substr($pri,0,-3); +$pri=base64_encode($pri); + + +echo " - ".htmlspecialchars($v).""; +echo "
        +"; +} + + +echo "
        - - -

        - - -
        "; +mysqli_free_result($val); + + +// pagination function +function pag($total,$currentPage,$baseLink,$nextPrev=true,$limit=10) { +global $lang; +if(!$total OR !$currentPage OR !$baseLink) { +return false; } //Total Number of pages +$totalPages = ceil($total/$limit); //Text to use after number of pages +$txtPagesAfter = ($totalPages==1)? " page": " pages"; //Start off the list. +$txtPageList = '
        ' .$totalPages.$txtPagesAfter .':
        ' ; //Show only 3 pages before current page(so that we don't have too many pages) +$min = ($currentPage - 3 < $totalPages && $currentPage-3 > 0) ? $currentPage-3 : 1; //Show only 3 pages after current page(so that we don't have too many pages) +$max = ($currentPage + 3 > $totalPages) ? $totalPages : $currentPage+3; //Variable for the actual page links +$pageLinks = ""; //Loop to generate the page links +for($i=$min;$i<=$max ;$i++) { +if($currentPage==$i) { //Current Page +$pageLinks .= ' '.$i.' ' ; } +else { $pageLinks .= ' '.$i.' ' ; } } +if($nextPrev ) { //Next and previous links +$next = ($currentPage + 1 > $totalPages) ? false : ''.$lang["Next"].'' ; +$prev = ($currentPage - 1 <= 0 ) ? false : ''.$lang["Prev"].'' ; } +$first= ($currentPage > 2) ? ''.$lang["First"].' ': false ; + + $last= ($currentPage < ($totalPages - 2)) ? " ".$lang["Last"]." " : false ; + +return $txtPageList.$first.$prev.$pageLinks.$next.$last; } + // end pagination + +// show pages +if($total_pages != 1) +echo pag($nr,$page,"?or=$or&nm=$nnm&k=$k&perp=$perp&tb=$tb&cc=$ccod&vmi=ionutvmi&page=",true,$perp); +else +echo "1 page
        - - -"; + +if ($total_pages>2) { +echo "

        + + +"; +if ($ord=='desc') echo ""; +echo "
        - - -
        "; +} + +echo "

        ".$lang["Show"]." + + + + +"; +echo "
        "; + + } else { +printf($lang["No_results_search"],"?k=$k&tb=$tb"); + } + +} +} else { +echo "
        ".strtoupper($lang["Search"])."
        ".$lang["Query"].": ".htmlspecialchars($sql)."

        ".$lang["tables"].">$tb
        - - -
        ".$lang["Browse"]." | ".$lang["Structure"]." | ".$lang["Search"]." | ".$lang["Insert"]." | ".$lang["Clear"]." | ".$lang["Drop"]."
        - - -
        "; +echo $lang["No_records_search"]; +} +} +echo "

        $nr ".$lang["records"]."

        "; +include('foot.php'); +?> \ No newline at end of file diff --git a/public/tool/mysql/sql.php b/public/tool/mysql/sql.php new file mode 100644 index 0000000..1aa7b34 --- /dev/null +++ b/public/tool/mysql/sql.php @@ -0,0 +1,39 @@ +".strtoupper($lang["Sql_code"])."

        ".$lang["tables"].">".$lang["Sql_code"]."
        - - -
        "; +$k=$_GET['k']; +$vmi=$_GET['vmi']; +if (!$vmi) { +echo "

        +(!) ".$lang["DO_NOT_USE_THIS_IF_YOU_DO_NOT_KNOW_HOW"]." !
        (!) ".$lang["DO_NOT_FORGET_TO_INCLUDE_SEPARATOR_IN SQL_CODE"]."
        +Code:
        + +
        ".$lang["Separator"].":
        +
        +"; +} else { +$sql=stripslashes($_POST['sql']); $sep=trim($_POST['sep']); +$sql=str_replace("\r\n","\n",$sql); $sql=str_replace("\n","\r",$sql); +$sql=preg_replace("~(--|##)[^\r]*\r~","\r",$sql); +$sql=preg_replace("~\r\s*\r~","\r",$sql); +$sq=explode($sep,$sql); +foreach ($sq as $sql) { +if(!empty($sql)){ +$do= mysqli_query($conn,$sql); +$wp=htmlspecialchars(substr($sql,0,40)); +if ($do) { +echo "$wp... ".$lang["Done"]." !
        "; } else { +echo "$wp... ".$lang["Error"].": "; +echo mysqli_error($conn)."
        "; +} } +} +} +echo '
        '; +include('foot.php'); +?> \ No newline at end of file diff --git a/public/tool/mysql/table.php b/public/tool/mysql/table.php new file mode 100644 index 0000000..4a6aecd --- /dev/null +++ b/public/tool/mysql/table.php @@ -0,0 +1,70 @@ +$tb
        ".$lang["Query"].": ".htmlspecialchars($sql)."

        +".$lang["tables"].">$tb
        - - -
        "; +$result = mysqli_query($conn,$sql); +if ($result) { +echo "".$lang["Browse"]." | ".$lang["Structure"]." | ".$lang["Search"]." | ".$lang["Insert"]." | ".$lang["Clear"]." | ".$lang["Drop"]."
        - - -
        +"; + +function mysqli_result($res, $row, $field=0) { + $res->data_seek($row); + $datarow = $res->fetch_array(); + return $datarow[$field]; +} +function mysql_fetch_fields($tb) { +global $conn; +// LIMIT 1 means to only read rows before row 1 (0-indexed) +$result = mysqli_query($conn,"SELECT * FROM `$tb` LIMIT 0"); +$describe = mysqli_query($conn,"SHOW COLUMNS FROM `$tb`"); +$num = mysqli_num_fields($result); +$output = array(); +for ($i = 0; $i < $num; ++$i) { +$field = mysqli_fetch_field_direct($result, $i); +// Analyze 'extra' field +$field->auto_increment = (strpos(mysqli_result($describe, $i, 'Extra'), 'auto_increment') === FALSE ? 0 : 1); +// Create the column_definition +$field->definition = mysqli_result($describe, $i, 'Type'); +if ($field->not_null && !$field->primary_key) $field->definition .= ' NOT NULL'; +$avmi=mysqli_result($describe, $i, 'Default'); +if ( $avmi != "" && $avmi != "NULL") +$field->def=$avmi; +else +$field->def=false; +if ($field->def) $field->definition .= " DEFAULT '" . mysqli_real_escape_string($conn,$field->def) . "'"; +if ($field->auto_increment) $field->definition .= ' AUTO_INCREMENT'; +if ($key = mysqli_result($describe, $i, 'Key')) { +if ($field->primary_key) $field->definition .= ' PRIMARY KEY'; +else $field->definition .= ' UNIQUE KEY'; +} +// Create the field length +//$field->len = mysqli_fetch_field_direct($result, $i); +// Store the field into the output +$output[$field->name] = $field; +} +return $output; +} +// Show +echo "

        "; +$fields = mysql_fetch_fields("$tb"); +foreach ($fields as $key => $field) { +echo "» ".htmlspecialchars($field->name)." "; +echo htmlspecialchars($field->definition)."
        "; +} +echo "
        - - -
        +".$lang["add_column"]." | +".$lang["copy_table"]." | +".$lang["rename_table"].""; +} else { +printf($lang["table_not_exists"],$tb); } +echo "
        "; +include('foot.php'); +?> diff --git a/public/tool/mysql/tables.php b/public/tool/mysql/tables.php new file mode 100644 index 0000000..8173b42 --- /dev/null +++ b/public/tool/mysql/tables.php @@ -0,0 +1,69 @@ +".$lang["tables"]."
        ".$lang["Query"].": ".htmlentities($sql)."

        "; +$result = mysqli_query($conn,$sql); +$nr = mysqli_num_rows($result); +if ($nr =='0') { +echo $lang["no_tables"]." !"; +} else { +echo "

        "; +while ($row = mysqli_fetch_row($result)) { +$vmi[]=$row[0]; +} +// calculate tbl size and rows +$result = mysqli_query($conn,"SHOW TABLE STATUS"); +function convert($size) +{ +$unit=array('B','KB','MB','GB','TB','PB'); +return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i]; +} +while($row = mysqli_fetch_array($result)) { + + $total_size = convert($row[ "Data_length" ] + $row[ "Index_length" ]); + $size[$row['Name']] = $total_size."^".$row['Rows']; +} +include 'pagination.class.php'; +$pagination = new pagination; +$vmi = $pagination->generate($vmi,$perp); + +foreach($vmi as $tb) { +$a= explode("^",$size[$tb]); +echo " ".htmlentities($tb)." | ".$a[0]." | ".($a[1] == 1 ? '1 '.$lang["row"]: $a[1].' '.$lang["rows"])."
        "; + +} +echo "
        + +

        "; +echo $pagination->links(); +mysqli_free_result($result); +} +echo "
        - - -
        +

        ".$lang["Show"]."

        +".$lang["Add_table"]." | +".$lang["Sql_code"]." | +".$lang["Export"]." | +".$lang["Upload_sql"]." | +".$lang["Import_sql"]." | +".$lang["Files"]."
        +
        $nr ".strtolower($lang["tables"])." +"; + +include('foot.php'); +?> \ No newline at end of file diff --git a/public/tool/mysql/trun.php b/public/tool/mysql/trun.php new file mode 100644 index 0000000..e09ef81 --- /dev/null +++ b/public/tool/mysql/trun.php @@ -0,0 +1,29 @@ + +CLEAR - $tb

        ".$lang["tables"].">$tb>".$lang["Clear"].""; +if (!$vmi) +{ +echo "

        - - -
        - This will delete all records !
        ".$lang["TRUNCATE_TABLE"]." ".htmlspecialchars($tb)." ?

        ".$lang["Yes"]." | ".$lang["No"].""; } else { +$sql="TRUNCATE TABLE `$tb`"; +$d=mysqli_query($conn,$sql); +if ($d) { +echo "
        - - -

        ".$lang["Query"].": ".htmlspecialchars($sql)."

        +Table $tb cleared !"; } else { +echo "
        - - -

        ".$lang["Query"].": ".htmlspecialchars($sql)."

        ".$lang["Error"].": "; +echo mysqli_error($conn); +} +} +echo ""; +include('foot.php'); +?> \ No newline at end of file diff --git a/public/tool/mysql/upl.php b/public/tool/mysql/upl.php new file mode 100644 index 0000000..a090afa --- /dev/null +++ b/public/tool/mysql/upl.php @@ -0,0 +1,108 @@ +".$lang["UPLOAD_SQL"]."

        ".$lang["tables"].">".$lang["Upload"]."
        - - -
        "; +if (!$vmi) { +echo "- ".$lang["Max"].": $mb MB
        - ".$lang["only_sql_files"]; +echo '

        '; +echo '
        '; +echo '
        '.$lang["Separator"].':
        +
        +'; +echo '
        '; +include('foot.php'); +} +if($vmi=="add"){ +$upload_dir='data/'; +$filename = $_FILES['filetoupload']['name']; +$size = $_FILES['filetoupload']['size']; +$extlimit = "yes"; //yes/no +$ext = strrchr($_FILES['filetoupload']['name'],'.'); +if (!is_uploaded_file($_FILES['filetoupload']['tmp_name'])) +{ +echo $lang["ERROR_NO_FILE_SELECTED"]."!
        "; +echo ""; +include("foot.php"); +exit(); +} +//IF EXT IS ALLOWED +if (($extlimit == "yes") && ($ext !=".sql")) { +echo($lang["EXT_NOT_ALLOWED"]."
        "); +echo ""; +include('foot.php'); +exit(); } +// check file size +if ($size > $size_bytes) { +$kb = $size_bytes / 1024; +echo $lang["FILE_IS_TO_BIG_Maxim"]." $kb KB.
        "; +echo ""; +include("foot.php"); +exit(); +} +//IF FILE EXIST +if (file_exists("$upload_dir/$filename")) +{ +echo($lang["File_name_already_exists"]); +echo ""; +include("foot.php"); +exit(); +} +if (move_uploaded_file($_FILES['filetoupload']['tmp_name'],$upload_dir.$filename)) +{ +// IF FILE IS UPLOAD +$handle = fopen("data/$filename", "r"); +$contents = fread($handle, filesize("data/$filename")); +fclose($handle); +echo "- $filename uploaded !
        "; +$sep=trim($_POST['sep']); +$shw=$_POST['shw']; +$sql=str_replace("\r\n","\n",$contents); $sql=str_replace("\n","\r",$sql); +$sql=preg_replace("~(--|##)[^\r]*\r~","\r",$sql); +$sql=preg_replace("~\r\s*\r~","\r",$sql); + +$contents=explode($sep,$sql); +$q=0; +foreach($contents as $coo) { +if(!empty($coo)) { +$do=mysqli_query($conn,$coo); +$cop=htmlspecialchars(substr($coo, 0, 40)); +if ($do) { +$q++; +if($shw=="yes") { +echo ">$cop... ".$lang["executed"]." !
        "; } +} else { +if($shw=="yes") { +echo ">$cop... ".$lang["not_executed"]." ! ".$lang["Error"].": "; +echo mysqli_error($conn)."
        "; } +} } +} +echo "
        $q ".strtolower($lang["Query"]." ".$lang["executed"])." !"; +if ($_POST['del'] == "yes") { +unlink("data/$filename"); +echo "
        - ".$lang["deleted"]." !"; } else { +echo "
        - ".$lang["saved"]." !"; } +echo ""; +include("foot.php"); +exit(); +} +else +{ +//IF IS ERROR +echo $lang["ERROR_Try_again"]."
        "; +echo ""; +include("foot.php"); +exit(); +} +} +?> \ No newline at end of file diff --git a/public/tool/newsid/cap_frame.php b/public/tool/newsid/cap_frame.php new file mode 100644 index 0000000..f1fec2c --- /dev/null +++ b/public/tool/newsid/cap_frame.php @@ -0,0 +1,36 @@ + + + + + + + + 滑块验证码 + +
        + + + + \ No newline at end of file diff --git a/public/tool/newsid/getsid.js b/public/tool/newsid/getsid.js new file mode 100644 index 0000000..3229663 --- /dev/null +++ b/public/tool/newsid/getsid.js @@ -0,0 +1,272 @@ +var xiha={ + postData: function(url, parameter, callback, dataType, ajaxType) { + if(!dataType) dataType='json'; + $.ajax({ + type: "POST", + url: url, + async: true, + dataType: dataType, + json: "callback", + data: parameter, + success: function(data) { + if (callback == null) { + return; + } + callback(data); + }, + error: function(error) { + alert('创建连接失败'); + } + }); + } +} +var captcha_frame; + +function trim(str){ //去掉头尾空格 + return str.replace(/(^\s*)|(\s*$)/g, ""); +} + +function invokeSettime(obj){ + var countdown=60; + settime(obj); + function settime(obj) { + if (countdown == 0) { + $(obj).attr("data-lock", "false"); + $(obj).text("获取验证码"); + countdown = 60; + return; + } else { + $(obj).attr("data-lock", "true"); + $(obj).attr("disabled",true); + $(obj).text("重发(" + countdown + ")"); + countdown--; + } + setTimeout(function() { + settime(obj) } + ,1000) + } +} + +function send_sms_code(){ + var uin=trim($('#uin').val()); + var sms_ticket=$('#sms_code').attr('sms_ticket'); + var cookie=$('#uin').attr('cookie'); + var getvcurl="login.php?do=smscode&r="+Math.random(1); + var param = {uin: uin, sms_ticket: sms_ticket, cookie: cookie}; + xiha.postData(getvcurl, param, function(d) { + if(d.saveOK == 0){ + new invokeSettime("#sendsms"); + alert('发送成功,请注意查收!'); + $('#sms_code').attr('issend','true'); + }else{ + alert(d.msg); + } + }); +} + +function login(uin,pwd){ + var vcode = $('#uin').attr('vcode'); + var pt_verifysession = $('#uin').attr('pt_verifysession'); + var sid = $('#uin').attr('sid'); + var isMd5=$("input:radio[name='ismd5']:checked").val() || 0; + var p=getmd5(uin,pwd,vcode,isMd5); + var cookie=$('#uin').attr('cookie'); + var loginurl="login.php?do=qqlogin&r="+Math.random(1); + var param = {uin: uin, pwd: pwd, p: p, vcode: vcode, pt_verifysession: pt_verifysession, sid: sid, cookie: cookie}; + if($('.smscode').is(":visible")){ + if($('#sms_code').attr('issend')=='false'){ + alert('请先发送短信验证码'); + return; + } + var sms_code = trim($('#sms_code').val()); + if(sms_code==''){ + alert('短信验证码不能为空!'); + return; + } + var sms_ticket = $('#sms_code').attr('sms_ticket'); + Object.assign(param, {sms_code: sms_code, sms_ticket: sms_ticket}); + } + $('#load').html('正在登录,请稍等...'); + xiha.postData(loginurl, param, function(d) { + if(d.saveOK ==0){ + $('#login').hide(); + $('.code').hide(); + $('#submit').hide(); + $('#load').html('
        登录成功!'+decodeURIComponent(d.nick)+'
        QQ帐号

        SKEY

        P_skey

        superkey

        一键登录QQ空间

        返回重新获取'); + }else if(d.saveOK ==4){ + $('#load').html('验证码错误,请重新登录。'); + $('#submit').attr('do','submit'); + $('#code').val(""); + $('.code').hide(); + $('.smscode').hide(); + $('.qqlogin').show(); + $('#login').show(); + }else if(d.saveOK ==3){ + $('#load').html('您输入的帐号或密码不正确,请重新输入密码!'); + $('#submit').attr('do','submit'); + $('#pwd').val(''); + $('.code').hide(); + $('.smscode').hide(); + $('.qqlogin').show(); + $('#login').show(); + }else if(d.saveOK ==10009){ + $('#sms_code').attr('sms_ticket',d.sms_ticket); + $('#uin').attr('cookie',d.cookie); + $('#sms_code').attr('issend','false'); + $('#load').html(d.msg); + $('#submit').attr('do','login'); + $('.qqlogin').hide(); + $('.smscode').show(); + $('#login').show(); + }else if(d.saveOK ==10010 || d.saveOK ==10005){ + $('#submit').attr('do','login'); + $('#load').html(d.msg); + }else if(d.msg =='pwd不能为空'){ + $('#load').html('请输入密码!'); + $('#submit').attr('do','submit'); + $('.code').hide(); + $('.smscode').hide(); + $('.qqlogin').show(); + $('#login').show(); + }else{ + $('#load').html(d.msg); + $('#submit').attr('do','submit'); + } + }); + +} +function getvc(uin,sig,sess,sid,websig){ + $('#load').html('获取验证码,请稍等...'); + sess = sess||0; + sid = sid||null; + websig = websig||null; + var getvcurl="login.php?do=getvc&r="+Math.random(1); + var param = {uin: uin, sig: sig, sess: sess, sid: sid, websig: websig}; + xiha.postData(getvcurl, param, function(d) { + if(d.saveOK ==0){ + $('#load').html('请输入验证码'); + $('#codeimg').attr('vc',d.vc); + $('#codeimg').attr('sess',d.sess); + $('#codeimg').attr('cdata',d.cdata); + $('#codeimg').attr('websig',d.websig); + $('#codeimg').attr('sid',d.sid); + $('#codeimg').html(''); + $('#submit').attr('do','code'); + $('#code').val(''); + $('.code').show(); + }else if(d.saveOK ==2){ + $('#codeimg').attr('vc',d.vc); + $('#codeimg').attr('sess',d.sess); + $('#codeimg').attr('cdata',d.cdata); + $('#codeimg').attr('websig',d.websig); + $('#codeimg').attr('sid',d.sid); + dovc(uin,d.ans,d.vc); + }else{ + alert(d.msg); + } + }); + +} +function dovc(uin,code,vc){ + $('#load').html('验证验证码,请稍等...'); + var cap_cd=$('#uin').attr('cap_cd'); + var sess=$('#codeimg').attr('sess'); + var cdata=$('#codeimg').attr('cdata'); + var sid=$('#codeimg').attr('sid'); + var websig=$('#codeimg').attr('websig'); + var getvcurl="login.php?do=dovc&r="+Math.random(1); + var param = {uin: uin, ans: code, sig: vc, cap_cd: cap_cd, sess: sess, websig: websig, cdata: cdata, sid: sid}; + xiha.postData(getvcurl, param, function(d) { + if(d.rcode == 0){ + var pwd=$('#pwd').val(); + $('#uin').attr('vcode',d.randstr.toUpperCase()); + $('#uin').attr('pt_verifysession',d.sig); + login(uin,pwd); + }else if(d.rcode == 50){ + $('#load').html('验证码错误,重新生成验证码,请稍等...'); + getvc(uin,cap_cd,d.sess,sid,websig); + }else if(d.rcode == 12){ + $('#codeimg').attr('sess',d.sess); + $('#load').html('验证失败,请重试。'); + }else{ + $('#codeimg').attr('sess',d.sess); + $('#load').html('验证失败,请重试或使用扫码登录。'); + //getvc(uin,cap_cd,d.sess,sid,websig); + } + }); + +} +function checkvc(){ + var uin=trim($('#uin').val()), + pwd=trim($('#pwd').val()); + if(uin==''||pwd=='') { + $('#load').html('请输入密码!'); + $('.qqlogin').show(); + $('#login').show(); + return false; + } + $('#load').html('登录中,请稍候...'); + var getvcurl="login.php?do=checkvc&r="+Math.random(1); + var param = {uin: uin}; + xiha.postData(getvcurl, param, function(d) { + if(d.saveOK ==0){ + $('#uin').attr('cookie',d.cookie); + $('#uin').attr('vcode',d.vcode); + $('#uin').attr('sid',d.sid); + $('#uin').attr('pt_verifysession',d.pt_verifysession); + login(uin,pwd); + }else if(d.saveOK ==1){ + $('#uin').attr('cap_cd',d.sig); + $('#uin').attr('sid',d.sid); + $('#uin').attr('cookie',d.cookie); + //getvc(uin,d.sig,0,d.sid);return; + var jumpurl = 'cap_frame.php?sid='+d.sid+'&aid=549000912&uin='+uin; + captcha_frame = layer.open({ + type: 2, + title: '滑块验证码', + shade: 0.6, + area: [$(window).width() > 450 ? '450px' : '100%', $(window).width() > 450 ? '450px' : '380px'], + content: jumpurl, + cancel: function(){ + $('#load').hide(); + } + }); + }else{ + alert(d.msg); + $('#load').html(''); + } + }); +} +window.onqqlogin = function(d){ + layer.close(captcha_frame); + $('#uin').attr('vcode',d.randstr); + $('#uin').attr('pt_verifysession',d.ticket); + var uin=trim($('#uin').val()), + pwd=trim($('#pwd').val()); + login(uin,pwd); + $('#uin').attr("data-lock", "false"); +} +$(document).ready(function(){ + $('#submit').click(function(){ + var self=$(this); + var uin=trim($('#uin').val()), + pwd=trim($('#pwd').val()); + if(uin==''||pwd=='') { + alert("请确保每项不能为空!"); + return false; + } + $('#load').show(); + if(self.attr('do') == 'code'){ + var vcode=trim($('#code').val()), + vc=$('#codeimg').attr('vc'); + dovc(uin,vcode,vc); + }else if(self.attr('do') == 'login'){ + login(uin,pwd); + }else{ + if (self.attr("data-lock") === "true") return; + else self.attr("data-lock", "true"); + checkvc(); + self.attr("data-lock", "false"); + } + }); +}); \ No newline at end of file diff --git a/public/tool/newsid/index.html b/public/tool/newsid/index.html new file mode 100644 index 0000000..2394797 --- /dev/null +++ b/public/tool/newsid/index.html @@ -0,0 +1,65 @@ + + + + + + + QQ提取SID&SKEY&P_skey + + + + + + + + + +
        +
        +
        +

        + QQ提取SID&SKEY&P_skey +

        +
        +
        + +
        + +
        +
        +
        QQ帐号
        + +
        +
        +
        QQ密码
        + +
        +
        +
        QQ密码形式: +   +
        + + + +
        返回重新获取 +
        +
        +
        +
        +
        +
        + + \ No newline at end of file diff --git a/public/tool/newsid/index2.html b/public/tool/newsid/index2.html new file mode 100644 index 0000000..cb402fd --- /dev/null +++ b/public/tool/newsid/index2.html @@ -0,0 +1,40 @@ + + + + + + + 二维码提取SKEY + + + + + + + +
        +
        +
        +

        + 扫描二维码提取SKEY +

        +
        +
        + +
        +
        + 使用QQ手机版扫描二维码. +
        +
        +
        + +
        +
        +
        +
        +
        + + \ No newline at end of file diff --git a/public/tool/newsid/login.class.php b/public/tool/newsid/login.class.php new file mode 100644 index 0000000..06cd9d7 --- /dev/null +++ b/public/tool/newsid/login.class.php @@ -0,0 +1,513 @@ +loginapi = $url; + } + public function dovc($uin,$sig,$ans,$cap_cd,$sess,$websig,$cdata,$sid){ + if(empty($uin))return array('saveOK'=>-1,'msg'=>'QQ不能为空'); + if(empty($ans))return array('saveOK'=>-1,'msg'=>'验证码不能为空'); + if(empty($cap_cd))return array('saveOK'=>-1,'msg'=>'cap_cd不能为空'); + if(empty($sess))return array('saveOK'=>-1,'msg'=>'sess不能为空'); + if(empty($sid))return array('saveOK'=>-1,'msg'=>'sid不能为空'); + $width = explode(',',$ans); + $width = $width[0]; + + //$collect=$this->getcollect($width, $sid); + //$cookie = 'TDC_itoken='.urlencode($collect['TDC_itoken']); + + $url='https://t.captcha.qq.com/cap_union_new_verify'; + $post='aid=549000912&captype=&protocol=https&clientype=2&disturblevel=&apptype=2&noheader=0&color=&showtype=&fb=1&theme=&lang=2052&ua='.urlencode(base64_encode($this->ua)).'&grayscale=1&subsid=2&sess='.$sess.'&fwidth=0&sid='.$sid.'&forcestyle=0&wxLang=&tcScale=1&uid='.$uin.'&cap_cd='.$cap_cd.'&rnd='.rand(100000,999999).'&TCapIframeLoadTime=99&prehandleLoadTime=48&createIframeStart='.time().'758&rand=0.330608'.time().'&subcapclass=&vsig='.$sig.'&ans='.$ans.'&collect='.$collect['collectdata'].'&websig='.$websig.'&cdata='.$cdata.'&eks='.$collect['eks'].'&tlg='.strlen($collect['collectdata']).'&vlg=0_0_1'; + $data=$this->get_curl($url,$post,$this->referrer); + $arr=json_decode($data,true); + if(array_key_exists('errorCode',$arr) && $arr['errorCode']==0){ + return array('rcode'=>0,'randstr'=>$arr['randstr'],'sig'=>$arr['ticket']); + }elseif($arr['errorCode']==50){ + return array('rcode'=>50,'errmsg'=>'验证码输入错误!','sess'=>$arr['sess']); + }elseif($arr['errorCode']==12){ + return array('rcode'=>12,'errmsg'=>$arr['errMessage'],'sess'=>$arr['sess']); + }else{ + return array('rcode'=>9,'errmsg'=>$arr['errMessage'],'sess'=>$arr['sess']); + } + } + public function getvcpic($uin,$sig,$cap_cd,$sess,$sid){ + if(empty($uin))return array('saveOK'=>-1,'msg'=>'QQ不能为空'); + if(empty($sig))return array('saveOK'=>-1,'msg'=>'sig不能为空'); + $url='https://ssl.captcha.qq.com/cap_union_new_getcapbysig?aid=549000912&captype=&protocol=https&clientype=2&disturblevel=&apptype=2&noheader=0&uid='.$uin.'&color=&showtype=&fb=1&lang=2052&ua='.urlencode(base64_encode($this->ua)).'&grayscale=1&cap_cd='.$cap_cd.'&rnd='.rand(100000,999999).'&rand=0.02398118'.time().'&sess='.$sess.'&sid='.$sid.'&vsig='.$sig.'&ischartype=1'; + return $this->get_curl($url); + } + public function getvcpic2($uin,$imageid,$cap_cd,$sess,$sid,$img_index=0){ + if(empty($uin))return array('saveOK'=>-1,'msg'=>'QQ不能为空'); + if(empty($imageid))return array('saveOK'=>-1,'msg'=>'imageid不能为空'); + $url='https://t.captcha.qq.com/hycdn?index='.$img_index.'&image='.$imageid.'?aid=549000912&captype=&curenv=inner&protocol=https&clientype=2&disturblevel=&apptype=2&noheader=0&color=&showtype=&fb=1&theme=&lang=2052&ua='.urlencode(base64_encode($this->ua)).'&enableDarkMode=0&grayscale=1&subsid=3&sess='.$sess.'&fwidth=0&sid='.$sid.'&forcestyle=undefined&wxLang=&tcScale=1&uid='.$uin.'&cap_cd='.$cap_cd.'&rnd='.rand(100000,999999).'&TCapIframeLoadTime=60&prehandleLoadTime=135&createIframeStart='.time().'487&rand='.rand(100000,999999).'&websig=&vsig=&img_index='.$img_index; + return $url; + } + public function qqlogin($uin,$pwd,$p,$vcode,$pt_verifysession,$sid,$cookie,$sms_code=null,$sms_ticket=null){ + if(empty($uin))return array('saveOK'=>-1,'msg'=>'QQ不能为空'); + if(empty($pwd))return array('saveOK'=>-1,'msg'=>'pwd不能为空'); + if(empty($p))return array('saveOK'=>-1,'msg'=>'密码不能为空'); + if(empty($vcode))return array('saveOK'=>-1,'msg'=>'验证码不能为空'); + if(empty($pt_verifysession))return array('saveOK'=>-1,'msg'=>'pt_verifysession不能为空'); + if(strpos($vcode,'!')!==false){ + $v1=0; + }else{ + $v1=1; + } + preg_match("/pt_login_sig=(.*?);/", $cookie, $match); + $pt_login_sig = $match[1]; + preg_match("/ptdrvs=(.*?);/", $cookie, $match); + $ptdrvs = $match[1]; + $url='https://ssl.ptlogin2.qq.com/login?u='.$uin.'&verifycode='.$vcode.'&pt_vcode_v1='.$v1.'&pt_verifysession_v1='.$pt_verifysession.'&p='.$p.'&pt_randsalt=2&u1=https%3A%2F%2Fqzs.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&ptredirect=0&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=5-10-'.time().'487&js_ver=22030810&js_type=1&login_sig='.$pt_login_sig.'&pt_uistyle=40&aid=549000912&daid=5&ptdrvs='.$ptdrvs.'&sid='.$sid; + if(!empty($sms_code)){ + $url.='&pt_sms_code='.$sms_code; + $cookie.='pt_sms_ticket='.$sms_ticket.'; pt_sms='.$sms_code.';'; + } + $referrer='https://xui.ptlogin2.qq.com/cgi-bin/xlogin?proxy_url=https%3A//qzs.qq.com/qzone/v6/portal/proxy.html&daid=5&&hide_title_bar=1&low_login=0&qlogin_auto_login=0&no_verifyimg=1&link_target=blank&appid=549000912&style=22&target=self&s_url=https%3A%2F%2Fqzs.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&pt_no_auth=0'; + $ret = $this->get_curl($url,0,$referrer,$cookie,1); + if(preg_match("/ptuiCB\('(.*?)'\)/", $ret, $arr)){ + $r=explode("','",str_replace("', '","','",$arr[1])); + if($r[0]==0){ + preg_match('/skey=@(.{9});/',$ret,$skey); + preg_match('/superkey=(.*?);/',$ret,$superkey); + $data=$this->get_curl($r[2],0,0,0,1); + if($data) { + preg_match("/p_skey=(.*?);/", $data, $matchs); + $pskey = $matchs[1]; + } + if($skey[1] && $pskey){ + return array('saveOK'=>0,'uin'=>$uin,'skey'=>'@'.$skey[1],'pskey'=>$pskey,'superkey'=>$superkey[1],'nick'=>urlencode($r[5]),'loginurl'=>$r[2]); + }else{ + if(!$pskey) + return array('saveOK'=>-3,'msg'=>'登录成功,获取P_skey失败!'.$r[2]); + elseif(!$skey[1]) + return array('saveOK'=>-3,'msg'=>'登录成功,获取Skey失败!'); + } + }elseif($r[0]==4){ + return array('saveOK'=>4,'msg'=>'验证码错误'); + }elseif($r[0]==3){ + return array('saveOK'=>3,'msg'=>'密码错误'); + }elseif($r[0]==19){ + return array('saveOK'=>19,'uin'=>$uin,'msg'=>'您的帐号暂时无法登录,请到 http://aq.qq.com/007 恢复正常使用'); + }elseif($r[0]==10009){ + preg_match('/pt_sms_ticket=(.*?);/',$ret,$sms_ticket); + preg_match('/ptdrvs=(.*?);/',$ret,$ptdrvs_new); + $cookie = str_replace($ptdrvs, $ptdrvs_new[1], $cookie); + return array('saveOK'=>10009,'sms_ticket'=>$sms_ticket[1],'cookie'=>$cookie,'msg'=>'请通过密保手机'.$r[4].'获取短信验证码'); + }elseif($r[0]==10010){ + return array('saveOK'=>10010,'msg'=>$r[4]); + }elseif($r[0]==10005||$r[0]==10006||$r[0]==22009){ + return array('saveOK'=>10005,'msg'=>'登录环境异常(异地登录或IP存在风险),请使用QQ手机版扫码登录!'); + }else{ + return array('saveOK'=>-6,'msg'=>$r[4]); + } + }else{ + return array('saveOK'=>-2,'msg'=>$ret); + } + } + public function send_sms_code($uin, $sms_ticket, $cookie){ + if(empty($uin))return array('saveOK'=>-1,'msg'=>'QQ不能为空'); + if(empty($sms_ticket))return array('saveOK'=>-1,'msg'=>'sms_ticket不能为空'); + $cookie .= '; pt_sms_ticket='.$sms_ticket; + $url = 'https://ssl.ptlogin2.qq.com/send_sms_code?bkn=&uin='.$uin.'&aid=549000912&pt_sms_ticket='.$sms_ticket; + $data=$this->get_curl($url,0,'https://ui.ptlogin2.qq.com/web/verify/iframe?uin='.$uin.'&appid=549000912',$cookie); + if(preg_match("/ptui_sendSMS_CB\('(.*?)'\)/", $data, $arr)){ + $r=explode("', '",$arr[1]); + if($r[0]=='10012'){ + return array('saveOK'=>0,'msg'=>'短信发送成功!'); + }else{ + if(!empty($r[1])) + return array('saveOK'=>-1,'msg'=>$r[1]); + else + return array('saveOK'=>-1,'msg'=>'短信发送失败,请刷新重试'); + } + }else{ + return array('saveOK'=>-2,'msg'=>$data); + } + } + public function getvc($uin,$sig,$sess,$sid,$websig){ + if(empty($uin))return array('saveOK'=>-1,'msg'=>'请先输入QQ号码'); + if(empty($sig))return array('saveOK'=>-1,'msg'=>'SIG不能为空'); + if(!preg_match("/^[1-9][0-9]{4,11}$/",$uin)) exit('{"saveOK":-2,"msg":"QQ号码不正确"}'); + if($sess=='0'){ + $url='https://t.captcha.qq.com/cap_union_prehandle?aid=549000912&captype=&protocol=https&clientype=2&disturblevel=&apptype=2&noheader=0&color=&showtype=&fb=1&theme=&lang=2052&ua='.urlencode(base64_encode($this->ua)).'&grayscale=1&sid='.$sid.'&cap_cd='.$sig.'&uid='.$uin.'&subsid=1&callback=&sess='; + $data=$this->get_curl($url,0,'https://xui.ptlogin2.qq.com/cgi-bin/xlogin'); + $data=substr($data,1,-1); + $arr=json_decode($data,true); + $sess=$arr['sess']; + $sid=$arr['sid']; + if(!$sess)return array('saveOK'=>-3,'msg'=>'获取验证码参数失败'); + + $url='https://t.captcha.qq.com/cap_union_new_show?aid=549000912&captype=&protocol=https&clientype=2&disturblevel=&apptype=2&noheader=0&color=&showtype=&fb=1&theme=&lang=2052&ua='.urlencode(base64_encode($this->ua)).'&enableDarkMode=0&grayscale=1&subsid=2&sess='.$sess.'&fwidth=0&sid='.$sid.'&forcestyle=0&wxLang=&tcScale=1&uid='.$uin.'&cap_cd='.$sig.'&rnd='.rand(100000,999999).'&TCapIframeLoadTime=48&prehandleLoadTime=46&createIframeStart='.time().'353'; + $this->referrer = $url; + $data=$this->get_curl($url,0,'https://xui.ptlogin2.qq.com/cgi-bin/xlogin'); + if(preg_match("/sess:\"([0-9a-zA-Z\*\_\-]+)\"/", $data, $match1) && preg_match('/spt:\"(\d+)\"/', $data, $Number)){ + $sess = $match1[1]; + $height = $Number[1]; + preg_match('/&image=(\d+)\"/', $data, $imageid); + preg_match('/collectdata:\"([0-9a-zA-Z]+)\"/', $data, $collectname); + preg_match("/vsig:\"([0-9a-zA-Z\*\_\-]+)\"/", $data, $vsig); + preg_match('/websig:\"([0-9a-f]{128})\"/', $data, $websig); + $cdata=0; + $imgA = $this->getvcpic2($uin,$imageid[1],$sig,$sess,$sid,1); + $imgB = $this->getvcpic2($uin,$imageid[1],$sig,$sess,$sid,0); + $width = $this->captcha($imgA, $imgB); + $ans = $width.','.$height.';'; + return array('saveOK'=>2,'vc'=>$vsig[1],'sess'=>$sess,'collectname'=>$collectname[1],'websig'=>$websig[1],'ans'=>$ans,'cdata'=>$cdata,'sid'=>$sid); + }else{ + return array('saveOK'=>-3,'msg'=>'获取验证码失败'); + } + }else{ + $url='https://t.captcha.qq.com/cap_union_new_getsig'; + $post='aid=549000912&captype=&protocol=https&clientype=2&disturblevel=&apptype=2&noheader=0&color=&showtype=&fb=1&theme=&lang=2052&ua='.urlencode(base64_encode($this->ua)).'&enableDarkMode=0&grayscale=1&subsid=2&sess='.$sess.'&sid='.$sid.'&uid='.$uin.'&cap_cd='.$sig.'&rnd='.rand(100000,999999).'&TCapIframeLoadTime=99&prehandleLoadTime=48&createIframeStart='.time().'758&rand=0.3944965'.time(); + $referrer='https://t.captcha.qq.com/cap_union_new_show?aid=549000912&captype=&protocol=https&clientype=2&disturblevel=&apptype=2&noheader=0&color=&showtype=&fb=1&theme=&lang=2052&ua='.urlencode(base64_encode($this->ua)).'&grayscale=1&subsid=2&sess='.$sess.'&fwidth=0&sid='.$sid.'&forcestyle=0&wxLang=&tcScale=1&uid='.$uin.'&cap_cd='.$sig.'&rnd='.rand(100000,999999).'&TCapIframeLoadTime=48&prehandleLoadTime=46&createIframeStart='.time().'353'; + $this->referrer = $referrer; + $data=$this->get_curl($url,$post,$referrer); + $arr=json_decode($data,true); + $cdata=0; + if($arr['initx'] && $arr['inity']){ + $sess = $arr['sess']; + $height = $arr['inity']; + $imageid = substr($arr['cdnPic1'], strpos($arr['cdnPic1'], '&image=')+7); + $imgA = $this->getvcpic2($uin,$imageid,$sig,$sess,$sid,1); + $imgB = $this->getvcpic2($uin,$imageid,$sig,$sess,$sid,0); + $width = $this->captcha($imgA, $imgB); + $ans = $width.','.$height.';'; + return array('saveOK'=>2,'vc'=>null,'sess'=>$sess,'ans'=>$ans,'cdata'=>$cdata); + }elseif($arr['vsig']){ + $image = $this->getvcpic($uin,$arr['vsig'],$sig,$sess,$sid); + return array('saveOK'=>0,'vc'=>$arr['vsig'],'sess'=>$sess,'cdata'=>$cdata,'image'=>base64_encode($image)); + }else{ + return array('saveOK'=>-3,'msg'=>'获取验证码失败'); + } + } + } + public function checkvc($uin){ + if(empty($uin))return array('saveOK'=>-1,'msg'=>'请先输入QQ号码'); + if(!preg_match("/^[1-9][0-9]{4,13}$/",$uin)) exit('{"saveOK":-2,"msg":"QQ号码不正确"}'); + $url='https://xui.ptlogin2.qq.com/cgi-bin/xlogin?proxy_url=https%3A//qzs.qq.com/qzone/v6/portal/proxy.html&daid=5&&hide_title_bar=1&low_login=0&qlogin_auto_login=1&no_verifyimg=1&link_target=blank&appid=549000912&style=22&target=self&s_url=https%3A%2F%2Fqzs.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&pt_no_auth=0'; + $data=$this->get_curl($url,0,0,0,1); + $cookie=''; + preg_match_all('/Set-Cookie: (.*?);/i',$data,$matchs); + foreach ($matchs[1] as $val) { + $cookie.=$val.'; '; + } + preg_match("/pt_login_sig=(.*?);/", $cookie, $match); + $pt_login_sig = $match[1]; + preg_match("/ver\/(\d+)/", $data, $match); + $js_ver = $match[1]; + $url2='https://ssl.ptlogin2.qq.com/check?regmaster=&pt_tea=2&pt_vcode=1&uin='.$uin.'&appid=549000912&js_ver='.$js_ver.'&js_type=1&login_sig='.$pt_login_sig.'&u1=https%3A%2F%2Fqzs.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&r=0.'.time().'722706&pt_uistyle=25'; + $data=$this->get_curl($url2,0,$url,$cookie,1); + if(preg_match("/ptui_checkVC\('(.*?)'\)/", $data, $arr)){ + preg_match_all('/Set-Cookie: (.*);/iU',$data,$matchs); + foreach ($matchs[1] as $val) { + $cookie.=$val.'; '; + } + $r=explode("','",$arr[1]); + if($r[0]==0){ + return array('saveOK'=>0,'uin'=>$uin,'vcode'=>$r[1],'pt_verifysession'=>$r[3],'sid'=>$r[6],'cookie'=>$cookie); + }else{ + return array('saveOK'=>1,'uin'=>$uin,'sig'=>$r[1],'sid'=>$r[6],'cookie'=>$cookie); + } + }else{ + return array('saveOK'=>-3,'msg'=>'获取验证码失败'.$data); + } + } + public function getqrpic(){ + require 'qrcodedecoder/bootstrap.php'; + $url='https://ssl.ptlogin2.qq.com/ptqrshow?appid=716027609&e=2&l=M&s=4&d=72&v=4&t=0.5409099'.time().'&daid=5&pt_3rd_aid=100384226'; + $referer='https://xui.ptlogin2.qq.com/cgi-bin/xlogin?daid=5&hide_title_bar=1&low_login=0&qlogin_auto_login=1&no_verifyimg=1&link_target=blank&target=self&s_url=https:%2F%2Fqzs.qq.com%2Fqzone%2Fv5%2Floginsucc.html?para%3Dizone&pt_no_auth=0&appid=716027609&pt_3rd_aid=100384226'; + $arr=$this->get_curl_split($url,$referer); + preg_match('/qrsig=(.*?);/',$arr['header'],$match); + if($qrsig=$match[1]){ + $qrcode = new Zxing\QrReader($arr['body'], Zxing\QrReader::SOURCE_TYPE_BLOB); + $code_url = $qrcode->text(); + return array('saveOK'=>0,'qrsig'=>$qrsig,'data'=>base64_encode($arr['body']),'url'=>$code_url); + }else{ + return array('saveOK'=>1,'msg'=>'二维码获取失败'); + } + } + public function qrlogin($qrsig){ + if(empty($qrsig))return array('saveOK'=>-1,'msg'=>'qrsig不能为空'); + $url='https://ssl.ptlogin2.qq.com/ptqrlogin?u1=https%3A%2F%2Fqzs.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&ptqrtoken='.$this->getqrtoken($qrsig).'&ptredirect=0&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=0-0-'.time().'0000&js_ver=21073010&js_type=1&login_sig='.$sig.'&pt_uistyle=40&aid=716027609&daid=5&pt_3rd_aid=100384226&'; + $cookie = 'qrsig='.$qrsig.'; '; + $ret = $this->get_curl($url,0,$url,$cookie,1); + if(preg_match("/ptuiCB\('(.*?)'\)/", $ret, $arr)){ + $r=explode("','",str_replace("', '","','",$arr[1])); + if($r[0]==0){ + preg_match('/uin=(\d+)&/',$ret,$uin); + $uin=$uin[1]; + preg_match('/skey=@(.{9});/',$ret,$skey); + preg_match('/superkey=(.*?);/',$ret,$superkey); + $data=$this->get_curl($r[2],0,0,0,1); + if($data) { + preg_match("/p_skey=(.*?);/", $data, $matchs); + $pskey = $matchs[1]; + } + if($pskey){ + if(isset($_GET['findpwd'])){ + $_SESSION['findpwd_qq']=$uin; + } + return array('saveOK'=>0,'uin'=>$uin,'skey'=>'@'.$skey[1],'pskey'=>$pskey,'superkey'=>$superkey[1],'nick'=>$r[5]); + }else{ + return array('saveOK'=>6,'msg'=>'登录成功,获取相关信息失败!'.$r[2]); + } + }elseif($r[0]==65){ + return array('saveOK'=>1,'msg'=>'二维码已失效。'); + }elseif($r[0]==66){ + return array('saveOK'=>2,'msg'=>'二维码未失效。'); + }elseif($r[0]==67){ + return array('saveOK'=>3,'msg'=>'正在验证二维码。'); + }elseif($r[0]==10009){ + return array('saveOK'=>6,'msg'=>'需要手机验证码才能登录,此次登录失败'); + }else{ + return array('saveOK'=>6,'msg'=>$r[4]); + } + }else{ + return array('saveOK'=>6,'msg'=>$ret); + } + } + public function getqrpic3rd($daid,$appid){ + require 'qrcodedecoder/bootstrap.php'; + if(empty($daid)||empty($appid))return array('saveOK'=>-1,'msg'=>'daid和appid不能为空'); + $url='https://ssl.ptlogin2.qq.com/ptqrshow?appid=716027609&e=2&l=M&s=4&d=72&v=4&t=0.5409099'.time().'&daid='.$daid.'&pt_3rd_aid=100384226'; + $referer='https://xui.ptlogin2.qq.com/cgi-bin/xlogin?daid='.$daid.'&hide_title_bar=1&low_login=0&qlogin_auto_login=1&no_verifyimg=1&link_target=blank&target=self&s_url=https:%2F%2Fqzs.qq.com%2Fqzone%2Fv5%2Floginsucc.html?para%3Dizone&pt_no_auth=0&appid=716027609&pt_3rd_aid=100384226'; + $arr=$this->get_curl_split($url,$referer); + preg_match('/qrsig=(.*?);/',$arr['header'],$match); + if($qrsig=$match[1]){ + $qrcode = new Zxing\QrReader($arr['body'], Zxing\QrReader::SOURCE_TYPE_BLOB); + $code_url = $qrcode->text(); + return array('saveOK'=>0,'qrsig'=>$qrsig,'data'=>base64_encode($arr['body']),'url'=>$code_url); + }else{ + return array('saveOK'=>1,'msg'=>'二维码获取失败'); + } + } + public function qrlogin3rd($daid,$appid,$qrsig){ + if(empty($daid)||empty($appid))return array('saveOK'=>-1,'msg'=>'daid和appid不能为空'); + if(empty($qrsig))return array('saveOK'=>-1,'msg'=>'qrsig不能为空'); + if($daid==73)$s_url = 'https://qun.qq.com/'; + else if($daid==1)$s_url = 'https://id.qq.com/index.html'; + else $s_url = 'https://qzs.qq.com/qzone/v5/loginsucc.html'; + $url='https://ssl.ptlogin2.qq.com/ptqrlogin?u1='.urlencode($s_url).'&ptqrtoken='.$this->getqrtoken($qrsig).'&ptredirect=0&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=0-0-'.time().'0000&js_ver=10194&js_type=1&login_sig='.$sig.'&pt_uistyle=40&aid=716027609&daid='.$daid.'&pt_3rd_aid=100384226&'; + $ret = $this->get_curl($url,0,$url,'qrsig='.$qrsig.'; ',1); + if(preg_match("/ptuiCB\('(.*?)'\)/", $ret, $arr)){ + $r=explode("','",str_replace("', '","','",$arr[1])); + if($r[0]==0){ + preg_match('/uin=(\d+)&/',$ret,$uin); + $uin=$uin[1]; + preg_match('/skey=@(.{9});/',$ret,$skey); + preg_match('/superkey=(.*?);/',$ret,$superkey); + $data=$this->get_curl($r[2],0,0,0,1); + if($data) { + preg_match_all('/Set-Cookie: (.*?);/i',$data,$matchs); + $cookie=''; + foreach ($matchs[1] as $val) { + if(substr($val,-1)=='=')continue; + $cookie.=$val.'; '; + } + $cookie = substr($cookie,0,-2); + } + if($cookie){ + return array('saveOK'=>0,'uin'=>$uin,'cookie'=>$cookie,'nickname'=>$r[5]); + }else{ + return array('saveOK'=>6,'msg'=>'登录成功,获取相关信息失败!'.$r[2]); + } + }elseif($r[0]==65){ + return array('saveOK'=>1,'msg'=>'二维码已失效。'); + }elseif($r[0]==66){ + return array('saveOK'=>2,'msg'=>'二维码未失效。'); + }elseif($r[0]==67){ + return array('saveOK'=>3,'msg'=>'正在验证二维码。'); + }else{ + return array('saveOK'=>6,'msg'=>$r[4]); + } + }else{ + return array('saveOK'=>6,'msg'=>$ret); + } + } + private function getqrtoken($qrsig){ + $len = strlen($qrsig); + $hash = 0; + for($i = 0; $i < $len; $i++){ + $hash += (($hash << 5) & 2147483647) + ord($qrsig[$i]) & 2147483647; + $hash &= 2147483647; + } + return $hash & 2147483647; + } + private function captcha($imgAurl,$imgBurl){ + $imgA = imagecreatefromstring($this->get_curl($imgAurl,0,$this->referrer)); + $imgB = imagecreatefromstring($this->get_curl($imgBurl,0,$this->referrer)); + $imgWidth = imagesx($imgA); + $imgHeight = imagesy($imgA); + + $t=0;$r=0; + for ($y=20; $y<$imgHeight-20; $y++){ + for ($x=20; $x<$imgWidth-20; $x++){ + $rgbA = imagecolorat($imgA,$x,$y); + $rgbB = imagecolorat($imgB,$x,$y); + if(abs($rgbA-$rgbB)>1800000){ + $t++; + $r+=$x; + } + } + } + return round($r/$t)-55; + } + private function getcdata($ans,$M,$randstr){ + for ($r = 0; $r < $M && $r < 1000; $r++) { + $c = $randstr . $r; + $d = md5 ($c); + if ($ans == $d) { + $a = $r; + break; + } + } + return $a; + } + private function generate_slideValue($width){ + $sx = rand(700,730); + $sy = rand(295,300); + $this->trace_x=$sx; + $this->trace_y=$sy; + $ex = $sx+intval(($width-55)/2); + $stime = rand(100,300); + $res = '['.$sx.','.$sy.','.$stime.'],'; + $randy = array(0,0,0,0,0,0,1,1,1,2,3,-1,-1,-1,-2); + while($sx<$ex){ + $x=rand(3,9); + $sx+=$x; + $y=$randy[array_rand($randy)]; + $time=rand(9,18); + $stime+=$time; + $res .= '['.$x.','.$y.','.$time.'],'; + } + $res .= '[0,0,'.rand(10,25).']'; + return $res; + } + private function generate_mousemove($width){ + $sx = rand(720,810); + $sy = rand(270,290); + $stime = rand(800,1000); + $res = '['.$sx.','.$sy.','.$stime.'],'; + while($sx>$this->trace_x || $sy<$this->trace_y){ + if($sx>$this->trace_x)$x=rand(-5,-1); + else $x=0; + if($sy<$this->trace_y)$y=rand(1,2); + else $y=0; + $sx+=$x; + $sy+=$y; + $time=rand(9,16); + $stime+=$time; + $res .= '['.$x.','.$y.','.$time.'],'; + } + $ex = $this->trace_x+intval(($width-55)/2); + while($sx<$ex){ + $x=rand(1,6); + $sx+=$x; + $y=0; + $time=rand(9,16); + $stime+=$time; + $res .= '['.$x.','.$y.','.$time.'],'; + } + $res = substr($res,0,-1); + $this->trace_time=ceil($stime/1000); + $this->trace_x=$sx; + $this->trace_y=$sy; + return $res; + } + public function getcollect($width, $sid){ + $slideValue = $this->generate_slideValue($width); + return $this->tdcData($sid, $slideValue); + } + private function tdcData($sid, $slideValue){ + $script = $this->get_curl('https://t.captcha.qq.com/tdc.js?app_data='.$sid.'&t='.time(), 0, 0, 0, 0, 0, 0, 1); + $data = $this->get_curl('http://collect.qqzzz.net/',array('script'=>$script, 'slideValue'=>$slideValue, 'sid'=>$sid), 0, 0, 0, 0, 0, 1); + return json_decode($data, true); + } + private function get_curl($url,$post=0,$referer=0,$cookie=0,$header=0,$ua=0,$nobaody=0,$noproxy=0){ + if($this->loginapi && $noproxy==0)return $this->get_curl_proxy($url,$post,$referer,$cookie,$header,$ua,$nobaody); + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL,$url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + $httpheader[] = "Accept: application/json"; + $httpheader[] = "Accept-Encoding: gzip,deflate,sdch"; + $httpheader[] = "Accept-Language: zh-CN,zh;q=0.8"; + $httpheader[] = "Connection: keep-alive"; + curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader); + if($post){ + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, $post); + } + if($header){ + curl_setopt($ch, CURLOPT_HEADER, TRUE); + } + if($cookie){ + curl_setopt($ch, CURLOPT_COOKIE, $cookie); + } + if($referer){ + curl_setopt($ch, CURLOPT_REFERER, $referer); + } + if($ua){ + curl_setopt($ch, CURLOPT_USERAGENT,$ua); + }else{ + curl_setopt($ch, CURLOPT_USERAGENT,$this->ua); + } + if($nobaody){ + curl_setopt($ch, CURLOPT_NOBODY,1); + + } + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + curl_setopt($ch, CURLOPT_ENCODING, "gzip"); + curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); + $ret = curl_exec($ch); + curl_close($ch); + return $ret; + } + private function get_curl_split($url,$referer=0){ + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL,$url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + $httpheader[] = "Accept: */*"; + $httpheader[] = "Accept-Encoding: gzip,deflate,sdch"; + $httpheader[] = "Accept-Language: zh-CN,zh;q=0.8"; + $httpheader[] = "Connection: keep-alive"; + curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader); + curl_setopt($ch, CURLOPT_HEADER, TRUE); + curl_setopt($ch, CURLOPT_USERAGENT,$this->ua); + if($referer){ + curl_setopt($ch, CURLOPT_REFERER, $referer); + } + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + curl_setopt($ch, CURLOPT_ENCODING, "gzip"); + curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); + $ret = curl_exec($ch); + $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE); + $header = substr($ret, 0, $headerSize); + $body = substr($ret, $headerSize); + $ret=array(); + $ret['header']=$header; + $ret['body']=$body; + curl_close($ch); + return $ret; + } + private function get_curl_proxy($url,$post=0,$referer=0,$cookie=0,$header=0,$ua=0,$nobaody=0){ + $data = array('url'=>$url, 'post'=>$post, 'referer'=>$referer, 'cookie'=>$cookie, 'header'=>$header, 'ua'=>$ua, 'nobaody'=>$nobaody); + $ch = curl_init(); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($ch, CURLOPT_URL,$this->loginapi); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, $data); + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); + $ret = curl_exec($ch); + curl_close($ch); + return $ret; + } +} \ No newline at end of file diff --git a/public/tool/newsid/login.js b/public/tool/newsid/login.js new file mode 100644 index 0000000..1ef7893 --- /dev/null +++ b/public/tool/newsid/login.js @@ -0,0 +1,919 @@ +$.RSA = function() { +function t(t, e) { + return new a(t, e) +} +function e(t, e) { + if (e < t.length + 11) return uv_alert("Message too long for RSA"), + null; + for (var n = new Array, + i = t.length - 1; i >= 0 && e > 0;) { + var o = t.charCodeAt(i--); + n[--e] = o + } + n[--e] = 0; + for (var r = new Y, + p = new Array; e > 2;) { + for (p[0] = 0; 0 == p[0];) r.nextBytes(p); + n[--e] = p[0] + } + return n[--e] = 2, + n[--e] = 0, + new a(n) +} +function n() { + this.n = null, + this.e = 0, + this.d = null, + this.p = null, + this.q = null, + this.dmp1 = null, + this.dmq1 = null, + this.coeff = null +} +function i(e, n) { + null != e && null != n && e.length > 0 && n.length > 0 ? (this.n = t(e, 16), this.e = parseInt(n, 16)) : uv_alert("Invalid RSA public key") +} +function o(t) { + return t.modPowInt(this.e, this.n) +} +function r(t) { + var n = e(t, this.n.bitLength() + 7 >> 3); + if (null == n) return null; + var i = this.doPublic(n); + if (null == i) return null; + var o = i.toString(16); + return 0 == (1 & o.length) ? o: "0" + o +} +function a(t, e, n) { + null != t && ("number" == typeof t ? this.fromNumber(t, e, n) : null == e && "string" != typeof t ? this.fromString(t, 256) : this.fromString(t, e)) +} +function p() { + return new a(null) +} +function s(t, e, n, i, o, r) { + for (; --r >= 0;) { + var a = e * this[t++] + n[i] + o; + o = Math.floor(a / 67108864), + n[i++] = 67108863 & a + } + return o +} +function c(t, e, n, i, o, r) { + for (var a = 32767 & e, + p = e >> 15; --r >= 0;) { + var s = 32767 & this[t], + c = this[t++] >> 15, + u = p * s + c * a; + s = a * s + ((32767 & u) << 15) + n[i] + (1073741823 & o), + o = (s >>> 30) + (u >>> 15) + p * c + (o >>> 30), + n[i++] = 1073741823 & s + } + return o +} +function u(t, e, n, i, o, r) { + for (var a = 16383 & e, + p = e >> 14; --r >= 0;) { + var s = 16383 & this[t], + c = this[t++] >> 14, + u = p * s + c * a; + s = a * s + ((16383 & u) << 14) + n[i] + o, + o = (s >> 28) + (u >> 14) + p * c, + n[i++] = 268435455 & s + } + return o +} +function l(t) { + return lt.charAt(t) +} +function d(t, e) { + var n = dt[t.charCodeAt(e)]; + return null == n ? -1 : n +} +function f(t) { + for (var e = this.t - 1; e >= 0; --e) t[e] = this[e]; + t.t = this.t, + t.s = this.s +} +function h(t) { + this.t = 1, + this.s = 0 > t ? -1 : 0, + t > 0 ? this[0] = t: -1 > t ? this[0] = t + DV: this.t = 0 +} +function g(t) { + var e = p(); + return e.fromInt(t), + e +} +function w(t, e) { + var n; + if (16 == e) n = 4; + else if (8 == e) n = 3; + else if (256 == e) n = 8; + else if (2 == e) n = 1; + else if (32 == e) n = 5; + else { + if (4 != e) return void this.fromRadix(t, e); + n = 2 + } + this.t = 0, + this.s = 0; + for (var i = t.length, + o = !1, + r = 0; --i >= 0;) { + var p = 8 == n ? 255 & t[i] : d(t, i); + 0 > p ? "-" == t.charAt(i) && (o = !0) : (o = !1, 0 == r ? this[this.t++] = p: r + n > this.DB ? (this[this.t - 1] |= (p & (1 << this.DB - r) - 1) << r, this[this.t++] = p >> this.DB - r) : this[this.t - 1] |= p << r, r += n, r >= this.DB && (r -= this.DB)) + } + 8 == n && 0 != (128 & t[0]) && (this.s = -1, r > 0 && (this[this.t - 1] |= (1 << this.DB - r) - 1 << r)), + this.clamp(), + o && a.ZERO.subTo(this, this) +} +function m() { + for (var t = this.s & this.DM; this.t > 0 && this[this.t - 1] == t;)--this.t +} +function _(t) { + if (this.s < 0) return "-" + this.negate().toString(t); + var e; + if (16 == t) e = 4; + else if (8 == t) e = 3; + else if (2 == t) e = 1; + else if (32 == t) e = 5; + else { + if (4 != t) return this.toRadix(t); + e = 2 + } + var n, i = (1 << e) - 1, + o = !1, + r = "", + a = this.t, + p = this.DB - a * this.DB % e; + if (a-->0) for (p < this.DB && (n = this[a] >> p) > 0 && (o = !0, r = l(n)); a >= 0;) e > p ? (n = (this[a] & (1 << p) - 1) << e - p, n |= this[--a] >> (p += this.DB - e)) : (n = this[a] >> (p -= e) & i, 0 >= p && (p += this.DB, --a)), + n > 0 && (o = !0), + o && (r += l(n)); + return o ? r: "0" +} +function v() { + var t = p(); + return a.ZERO.subTo(this, t), + t +} +function y() { + return this.s < 0 ? this.negate() : this +} +function b(t) { + var e = this.s - t.s; + if (0 != e) return e; + var n = this.t; + if (e = n - t.t, 0 != e) return e; + for (; --n >= 0;) if (0 != (e = this[n] - t[n])) return e; + return 0 +} +function k(t) { + var e, n = 1; + return 0 != (e = t >>> 16) && (t = e, n += 16), + 0 != (e = t >> 8) && (t = e, n += 8), + 0 != (e = t >> 4) && (t = e, n += 4), + 0 != (e = t >> 2) && (t = e, n += 2), + 0 != (e = t >> 1) && (t = e, n += 1), + n +} +function $() { + return this.t <= 0 ? 0 : this.DB * (this.t - 1) + k(this[this.t - 1] ^ this.s & this.DM) +} +function q(t, e) { + var n; + for (n = this.t - 1; n >= 0; --n) e[n + t] = this[n]; + for (n = t - 1; n >= 0; --n) e[n] = 0; + e.t = this.t + t, + e.s = this.s +} +function S(t, e) { + for (var n = t; n < this.t; ++n) e[n - t] = this[n]; + e.t = Math.max(this.t - t, 0), + e.s = this.s +} +function T(t, e) { + var n, i = t % this.DB, + o = this.DB - i, + r = (1 << o) - 1, + a = Math.floor(t / this.DB), + p = this.s << i & this.DM; + for (n = this.t - 1; n >= 0; --n) e[n + a + 1] = this[n] >> o | p, + p = (this[n] & r) << i; + for (n = a - 1; n >= 0; --n) e[n] = 0; + e[a] = p, + e.t = this.t + a + 1, + e.s = this.s, + e.clamp() +} +function I(t, e) { + e.s = this.s; + var n = Math.floor(t / this.DB); + if (n >= this.t) return void(e.t = 0); + var i = t % this.DB, + o = this.DB - i, + r = (1 << i) - 1; + e[0] = this[n] >> i; + for (var a = n + 1; a < this.t; ++a) e[a - n - 1] |= (this[a] & r) << o, + e[a - n] = this[a] >> i; + i > 0 && (e[this.t - n - 1] |= (this.s & r) << o), + e.t = this.t - n, + e.clamp() +} +function A(t, e) { + for (var n = 0, + i = 0, + o = Math.min(t.t, this.t); o > n;) i += this[n] - t[n], + e[n++] = i & this.DM, + i >>= this.DB; + if (t.t < this.t) { + for (i -= t.s; n < this.t;) i += this[n], + e[n++] = i & this.DM, + i >>= this.DB; + i += this.s + } else { + for (i += this.s; n < t.t;) i -= t[n], + e[n++] = i & this.DM, + i >>= this.DB; + i -= t.s + } + e.s = 0 > i ? -1 : 0, + -1 > i ? e[n++] = this.DV + i: i > 0 && (e[n++] = i), + e.t = n, + e.clamp() +} +function E(t, e) { + var n = this.abs(), + i = t.abs(), + o = n.t; + for (e.t = o + i.t; --o >= 0;) e[o] = 0; + for (o = 0; o < i.t; ++o) e[o + n.t] = n.am(0, i[o], e, o, 0, n.t); + e.s = 0, + e.clamp(), + this.s != t.s && a.ZERO.subTo(e, e) +} +function C(t) { + for (var e = this.abs(), n = t.t = 2 * e.t; --n >= 0;) t[n] = 0; + for (n = 0; n < e.t - 1; ++n) { + var i = e.am(n, e[n], t, 2 * n, 0, 1); (t[n + e.t] += e.am(n + 1, 2 * e[n], t, 2 * n + 1, i, e.t - n - 1)) >= e.DV && (t[n + e.t] -= e.DV, t[n + e.t + 1] = 1) + } + t.t > 0 && (t[t.t - 1] += e.am(n, e[n], t, 2 * n, 0, 1)), + t.s = 0, + t.clamp() +} +function D(t, e, n) { + var i = t.abs(); + if (! (i.t <= 0)) { + var o = this.abs(); + if (o.t < i.t) return null != e && e.fromInt(0), + void(null != n && this.copyTo(n)); + null == n && (n = p()); + var r = p(), + s = this.s, + c = t.s, + u = this.DB - k(i[i.t - 1]); + u > 0 ? (i.lShiftTo(u, r), o.lShiftTo(u, n)) : (i.copyTo(r), o.copyTo(n)); + var l = r.t, + d = r[l - 1]; + if (0 != d) { + var f = d * (1 << this.F1) + (l > 1 ? r[l - 2] >> this.F2: 0), + h = this.FV / f, + g = (1 << this.F1) / f, + w = 1 << this.F2, + m = n.t, + _ = m - l, + v = null == e ? p() : e; + for (r.dlShiftTo(_, v), n.compareTo(v) >= 0 && (n[n.t++] = 1, n.subTo(v, n)), a.ONE.dlShiftTo(l, v), v.subTo(r, r); r.t < l;) r[r.t++] = 0; + for (; --_ >= 0;) { + var y = n[--m] == d ? this.DM: Math.floor(n[m] * h + (n[m - 1] + w) * g); + if ((n[m] += r.am(0, y, n, _, 0, l)) < y) for (r.dlShiftTo(_, v), n.subTo(v, n); n[m] < --y;) n.subTo(v, n) + } + null != e && (n.drShiftTo(l, e), s != c && a.ZERO.subTo(e, e)), + n.t = l, + n.clamp(), + u > 0 && n.rShiftTo(u, n), + 0 > s && a.ZERO.subTo(n, n) + } + } +} +function M(t) { + var e = p(); + return this.abs().divRemTo(t, null, e), + this.s < 0 && e.compareTo(a.ZERO) > 0 && t.subTo(e, e), + e +} +function x(t) { + this.m = t +} +function L(t) { + return t.s < 0 || t.compareTo(this.m) >= 0 ? t.mod(this.m) : t +} +function B(t) { + return t +} +function R(t) { + t.divRemTo(this.m, null, t) +} +function O(t, e, n) { + t.multiplyTo(e, n), + this.reduce(n) +} +function H(t, e) { + t.squareTo(e), + this.reduce(e) +} +function K() { + if (this.t < 1) return 0; + var t = this[0]; + if (0 == (1 & t)) return 0; + var e = 3 & t; + return e = e * (2 - (15 & t) * e) & 15, + e = e * (2 - (255 & t) * e) & 255, + e = e * (2 - ((65535 & t) * e & 65535)) & 65535, + e = e * (2 - t * e % this.DV) % this.DV, + e > 0 ? this.DV - e: -e +} +function U(t) { + this.m = t, + this.mp = t.invDigit(), + this.mpl = 32767 & this.mp, + this.mph = this.mp >> 15, + this.um = (1 << t.DB - 15) - 1, + this.mt2 = 2 * t.t +} +function N(t) { + var e = p(); + return t.abs().dlShiftTo(this.m.t, e), + e.divRemTo(this.m, null, e), + t.s < 0 && e.compareTo(a.ZERO) > 0 && this.m.subTo(e, e), + e +} +function P(t) { + var e = p(); + return t.copyTo(e), + this.reduce(e), + e +} +function Q(t) { + for (; t.t <= this.mt2;) t[t.t++] = 0; + for (var e = 0; e < this.m.t; ++e) { + var n = 32767 & t[e], + i = n * this.mpl + ((n * this.mph + (t[e] >> 15) * this.mpl & this.um) << 15) & t.DM; + for (n = e + this.m.t, t[n] += this.m.am(0, i, t, e, 0, this.m.t); t[n] >= t.DV;) t[n] -= t.DV, + t[++n]++ + } + t.clamp(), + t.drShiftTo(this.m.t, t), + t.compareTo(this.m) >= 0 && t.subTo(this.m, t) +} +function j(t, e) { + t.squareTo(e), + this.reduce(e) +} +function F(t, e, n) { + t.multiplyTo(e, n), + this.reduce(n) +} +function V() { + return 0 == (this.t > 0 ? 1 & this[0] : this.s) +} +function z(t, e) { + if (t > 4294967295 || 1 > t) return a.ONE; + var n = p(), + i = p(), + o = e.convert(this), + r = k(t) - 1; + for (o.copyTo(n); --r >= 0;) if (e.sqrTo(n, i), (t & 1 << r) > 0) e.mulTo(i, o, n); + else { + var s = n; + n = i, + i = s + } + return e.revert(n) +} +function J(t, e) { + var n; + return n = 256 > t || e.isEven() ? new x(e) : new U(e), + this.exp(t, n) +} +function G(t) { + ht[gt++] ^= 255 & t, + ht[gt++] ^= t >> 8 & 255, + ht[gt++] ^= t >> 16 & 255, + ht[gt++] ^= t >> 24 & 255, + gt >= _t && (gt -= _t) +} +function W() { + G((new Date).getTime()) +} +function X() { + if (null == ft) { + for (W(), ft = it(), ft.init(ht), gt = 0; gt < ht.length; ++gt) ht[gt] = 0; + gt = 0 + } + return ft.next() +} +function Z(t) { + var e; + for (e = 0; e < t.length; ++e) t[e] = X() +} +function Y() {} +function tt() { + this.i = 0, + this.j = 0, + this.S = new Array +} +function et(t) { + var e, n, i; + for (e = 0; 256 > e; ++e) this.S[e] = e; + for (n = 0, e = 0; 256 > e; ++e) n = n + this.S[e] + t[e % t.length] & 255, + i = this.S[e], + this.S[e] = this.S[n], + this.S[n] = i; + this.i = 0, + this.j = 0 +} +function nt() { + var t; + return this.i = this.i + 1 & 255, + this.j = this.j + this.S[this.i] & 255, + t = this.S[this.i], + this.S[this.i] = this.S[this.j], + this.S[this.j] = t, + this.S[t + this.S[this.i] & 255] +} +function it() { + return new tt +} +function ot(t, e, i) { + e = "e9a815ab9d6e86abbf33a4ac64e9196d5be44a09bd0ed6ae052914e1a865ac8331fed863de8ea697e9a7f63329e5e23cda09c72570f46775b7e39ea9670086f847d3c9c51963b131409b1e04265d9747419c635404ca651bbcbc87f99b8008f7f5824653e3658be4ba73e4480156b390bb73bc1f8b33578e7a4e12440e9396f2552c1aff1c92e797ebacdc37c109ab7bce2367a19c56a033ee04534723cc2558cb27368f5b9d32c04d12dbd86bbd68b1d99b7c349a8453ea75d1b2e94491ab30acf6c46a36a75b721b312bedf4e7aad21e54e9bcbcf8144c79b6e3c05eb4a1547750d224c0085d80e6da3907c3d945051c13c7c1dcefd6520ee8379c4f5231ed", + i = "10001"; + var o = new n; + return o.setPublic(e, i), + o.encrypt(t) +} + n.prototype.doPublic = o, + n.prototype.setPublic = i, + n.prototype.encrypt = r; + var rt, at = 0xdeadbeefcafe, pt = 15715070 == (16777215 & at); + pt && "Microsoft Internet Explorer" == navigator.appName ? (a.prototype.am = c, + rt = 30) : pt && "Netscape" != navigator.appName ? (a.prototype.am = s, + rt = 26) : (a.prototype.am = u, + rt = 28), + a.prototype.DB = rt, + a.prototype.DM = (1 << rt) - 1, + a.prototype.DV = 1 << rt; + var st = 52; + a.prototype.FV = Math.pow(2, st), + a.prototype.F1 = st - rt, + a.prototype.F2 = 2 * rt - st; + var ct, ut, lt = "0123456789abcdefghijklmnopqrstuvwxyz", dt = new Array; + for (ct = "0".charCodeAt(0), + ut = 0; 9 >= ut; ++ut) + dt[ct++] = ut; + for (ct = "a".charCodeAt(0), + ut = 10; 36 > ut; ++ut) + dt[ct++] = ut; + for (ct = "A".charCodeAt(0), + ut = 10; 36 > ut; ++ut) + dt[ct++] = ut; + x.prototype.convert = L, + x.prototype.revert = B, + x.prototype.reduce = R, + x.prototype.mulTo = O, + x.prototype.sqrTo = H, + U.prototype.convert = N, + U.prototype.revert = P, + U.prototype.reduce = Q, + U.prototype.mulTo = F, + U.prototype.sqrTo = j, + a.prototype.copyTo = f, + a.prototype.fromInt = h, + a.prototype.fromString = w, + a.prototype.clamp = m, + a.prototype.dlShiftTo = q, + a.prototype.drShiftTo = S, + a.prototype.lShiftTo = T, + a.prototype.rShiftTo = I, + a.prototype.subTo = A, + a.prototype.multiplyTo = E, + a.prototype.squareTo = C, + a.prototype.divRemTo = D, + a.prototype.invDigit = K, + a.prototype.isEven = V, + a.prototype.exp = z, + a.prototype.toString = _, + a.prototype.negate = v, + a.prototype.abs = y, + a.prototype.compareTo = b, + a.prototype.bitLength = $, + a.prototype.mod = M, + a.prototype.modPowInt = J, + a.ZERO = g(0), + a.ONE = g(1); + var ft, ht, gt; + if (null == ht) { + ht = new Array, + gt = 0; + var wt; + if ("Netscape" == navigator.appName && navigator.appVersion < "5" && window.crypto && window.crypto.random) { + var mt = window.crypto.random(32); + for (wt = 0; wt < mt.length; ++wt) + ht[gt++] = 255 & mt.charCodeAt(wt) + } + for (; _t > gt; ) + wt = Math.floor(65536 * Math.random()), + ht[gt++] = wt >>> 8, + ht[gt++] = 255 & wt; + gt = 0, + W() + } + Y.prototype.nextBytes = Z, + tt.prototype.init = et, + tt.prototype.next = nt; + var _t = 256; + return { + rsa_encrypt: ot + } +}(), +function(t) { +function e() { + return Math.round(4294967295 * Math.random()) +} +function n(t, e, n) { (!n || n > 4) && (n = 4); + for (var i = 0, + o = e; e + n > o; o++) i <<= 8, + i |= t[o]; + return (4294967295 & i) >>> 0 +} +function i(t, e, n) { + t[e + 3] = n >> 0 & 255, + t[e + 2] = n >> 8 & 255, + t[e + 1] = n >> 16 & 255, + t[e + 0] = n >> 24 & 255 +} +function o(t) { + if (!t) return ""; + for (var e = "", + n = 0; n < t.length; n++) { + var i = Number(t[n]).toString(16); + 1 == i.length && (i = "0" + i), + e += i + } + return e +} +function r(t) { + for (var e = "", + n = 0; n < t.length; n += 2) e += String.fromCharCode(parseInt(t.substr(n, 2), 16)); + return e +} +function a(t, e) { + if (!t) return ""; + e && (t = p(t)); + for (var n = [], i = 0; i < t.length; i++) n[i] = t.charCodeAt(i); + return o(n) +} +function p(t) { + var e, n, i = [], + o = t.length; + for (e = 0; o > e; e++) n = t.charCodeAt(e), + n > 0 && 127 >= n ? i.push(t.charAt(e)) : n >= 128 && 2047 >= n ? i.push(String.fromCharCode(192 | n >> 6 & 31), String.fromCharCode(128 | 63 & n)) : n >= 2048 && 65535 >= n && i.push(String.fromCharCode(224 | n >> 12 & 15), String.fromCharCode(128 | n >> 6 & 63), String.fromCharCode(128 | 63 & n)); + return i.join("") +} +function s(t) { + m = new Array(8), + _ = new Array(8), + v = y = 0, + $ = !0, + w = 0; + var n = t.length, + i = 0; + w = (n + 10) % 8, + 0 != w && (w = 8 - w), + b = new Array(n + w + 10), + m[0] = 255 & (248 & e() | w); + for (var o = 1; w >= o; o++) m[o] = 255 & e(); + w++; + for (var o = 0; 8 > o; o++) _[o] = 0; + for (i = 1; 2 >= i;) 8 > w && (m[w++] = 255 & e(), i++), + 8 == w && u(); + for (var o = 0; n > 0;) 8 > w && (m[w++] = t[o++], n--), + 8 == w && u(); + for (i = 1; 7 >= i;) 8 > w && (m[w++] = 0, i++), + 8 == w && u(); + return b +} +function c(t) { + var e = 0, + n = new Array(8), + i = t.length; + if (k = t, i % 8 != 0 || 16 > i) return null; + if (_ = d(t), w = 7 & _[0], e = i - w - 10, 0 > e) return null; + for (var o = 0; o < n.length; o++) n[o] = 0; + b = new Array(e), + y = 0, + v = 8, + w++; + for (var r = 1; 2 >= r;) if (8 > w && (w++, r++), 8 == w && (n = t, !f())) return null; + for (var o = 0; 0 != e;) if (8 > w && (b[o] = 255 & (n[y + w] ^ _[w]), o++, e--, w++), 8 == w && (n = t, y = v - 8, !f())) return null; + for (r = 1; 8 > r; r++) { + if (8 > w) { + if (0 != (n[y + w] ^ _[w])) return null; + w++ + } + if (8 == w && (n = t, y = v, !f())) return null + } + return b +} +function u() { + for (var t = 0; 8 > t; t++) m[t] ^= $ ? _[t] : b[y + t]; + for (var e = l(m), t = 0; 8 > t; t++) b[v + t] = e[t] ^ _[t], + _[t] = m[t]; + y = v, + v += 8, + w = 0, + $ = !1 +} +function l(t) { + for (var e = 16, + o = n(t, 0, 4), r = n(t, 4, 4), a = n(g, 0, 4), p = n(g, 4, 4), s = n(g, 8, 4), c = n(g, 12, 4), u = 0, l = 2654435769; e-->0;) u += l, + u = (4294967295 & u) >>> 0, + o += (r << 4) + a ^ r + u ^ (r >>> 5) + p, + o = (4294967295 & o) >>> 0, + r += (o << 4) + s ^ o + u ^ (o >>> 5) + c, + r = (4294967295 & r) >>> 0; + var d = new Array(8); + return i(d, 0, o), + i(d, 4, r), + d +} +function d(t) { + for (var e = 16, + o = n(t, 0, 4), r = n(t, 4, 4), a = n(g, 0, 4), p = n(g, 4, 4), s = n(g, 8, 4), c = n(g, 12, 4), u = 3816266640, l = 2654435769; e-->0;) r -= (o << 4) + s ^ o + u ^ (o >>> 5) + c, + r = (4294967295 & r) >>> 0, + o -= (r << 4) + a ^ r + u ^ (r >>> 5) + p, + o = (4294967295 & o) >>> 0, + u -= l, + u = (4294967295 & u) >>> 0; + var d = new Array(8); + return i(d, 0, o), + i(d, 4, r), + d +} +function f() { + for (var t = (k.length, 0); 8 > t; t++) _[t] ^= k[v + t]; + return _ = d(_), + v += 8, + w = 0, + !0 +} +function h(t, e) { + var n = []; + if (e) for (var i = 0; i < t.length; i++) n[i] = 255 & t.charCodeAt(i); + else for (var o = 0, + i = 0; i < t.length; i += 2) n[o++] = parseInt(t.substr(i, 2), 16); + return n +} +var g = "", +w = 0, +m = [], +_ = [], +v = 0, +y = 0, +b = [], +k = [], +$ = !0; +TEA = { + encrypt: function(t, e) { + var n = h(t, e), + i = s(n); + return o(i) + }, + enAsBase64: function(t, e) { + for (var n = h(t, e), i = s(n), o = "", r = 0; r < i.length; r++) o += String.fromCharCode(i[r]); + return btoa(o) + }, + decrypt: function(t) { + var e = h(t, !1), + n = c(e); + return o(n) + }, + initkey: function(t, e) { + g = h(t, e) + }, + bytesToStr: r, + strToBytes: a, + bytesInStr: o, + dataFromStr: h +}; +var q = {}; +q.PADCHAR = "=", +q.ALPHA = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", +q.getbyte = function(t, e) { + var n = t.charCodeAt(e); + if (n > 255) throw "INVALID_CHARACTER_ERR: DOM Exception 5"; + return n +}, +q.encode = function(t) { + if (1 != arguments.length) throw "SyntaxError: Not enough arguments"; + var e, n, i = q.PADCHAR, + o = q.ALPHA, + r = q.getbyte, + a = []; + t = "" + t; + var p = t.length - t.length % 3; + if (0 == t.length) return t; + for (e = 0; p > e; e += 3) n = r(t, e) << 16 | r(t, e + 1) << 8 | r(t, e + 2), + a.push(o.charAt(n >> 18)), + a.push(o.charAt(n >> 12 & 63)), + a.push(o.charAt(n >> 6 & 63)), + a.push(o.charAt(63 & n)); + switch (t.length - p) { + case 1: + n = r(t, e) << 16, + a.push(o.charAt(n >> 18) + o.charAt(n >> 12 & 63) + i + i); + break; + case 2: + n = r(t, e) << 16 | r(t, e + 1) << 8, + a.push(o.charAt(n >> 18) + o.charAt(n >> 12 & 63) + o.charAt(n >> 6 & 63) + i) + } + return a.join("") +}, +btoa =window.btoa = q.encode; +} (window), +$ = window.$ || {}, +$pt = window.$pt || {}, +$.Encryption = $pt.Encryption = function() { +function t(t) { + return e(t) +} +function e(t) { + return l(n(u(t), t.length * m)) +} +function n(t, e) { + t[e >> 5] |= 128 << ((e) % 32), + t[(e + 64 >>> 9 << 4) + 14] = e; + for (var n = 1732584193, + i = -271733879, + c = -1732584194, + u = 271733878, + l = 0; l < t.length; l += 16) { + var d = n, + f = i, + h = c, + g = u; + n = o(n, i, c, u, t[l + 0], 7, -680876936), + u = o(u, n, i, c, t[l + 1], 12, -389564586), + c = o(c, u, n, i, t[l + 2], 17, 606105819), + i = o(i, c, u, n, t[l + 3], 22, -1044525330), + n = o(n, i, c, u, t[l + 4], 7, -176418897), + u = o(u, n, i, c, t[l + 5], 12, 1200080426), + c = o(c, u, n, i, t[l + 6], 17, -1473231341), + i = o(i, c, u, n, t[l + 7], 22, -45705983), + n = o(n, i, c, u, t[l + 8], 7, 1770035416), + u = o(u, n, i, c, t[l + 9], 12, -1958414417), + c = o(c, u, n, i, t[l + 10], 17, -42063), + i = o(i, c, u, n, t[l + 11], 22, -1990404162), + n = o(n, i, c, u, t[l + 12], 7, 1804603682), + u = o(u, n, i, c, t[l + 13], 12, -40341101), + c = o(c, u, n, i, t[l + 14], 17, -1502002290), + i = o(i, c, u, n, t[l + 15], 22, 1236535329), + n = r(n, i, c, u, t[l + 1], 5, -165796510), + u = r(u, n, i, c, t[l + 6], 9, -1069501632), + c = r(c, u, n, i, t[l + 11], 14, 643717713), + i = r(i, c, u, n, t[l + 0], 20, -373897302), + n = r(n, i, c, u, t[l + 5], 5, -701558691), + u = r(u, n, i, c, t[l + 10], 9, 38016083), + c = r(c, u, n, i, t[l + 15], 14, -660478335), + i = r(i, c, u, n, t[l + 4], 20, -405537848), + n = r(n, i, c, u, t[l + 9], 5, 568446438), + u = r(u, n, i, c, t[l + 14], 9, -1019803690), + c = r(c, u, n, i, t[l + 3], 14, -187363961), + i = r(i, c, u, n, t[l + 8], 20, 1163531501), + n = r(n, i, c, u, t[l + 13], 5, -1444681467), + u = r(u, n, i, c, t[l + 2], 9, -51403784), + c = r(c, u, n, i, t[l + 7], 14, 1735328473), + i = r(i, c, u, n, t[l + 12], 20, -1926607734), + n = a(n, i, c, u, t[l + 5], 4, -378558), + u = a(u, n, i, c, t[l + 8], 11, -2022574463), + c = a(c, u, n, i, t[l + 11], 16, 1839030562), + i = a(i, c, u, n, t[l + 14], 23, -35309556), + n = a(n, i, c, u, t[l + 1], 4, -1530992060), + u = a(u, n, i, c, t[l + 4], 11, 1272893353), + c = a(c, u, n, i, t[l + 7], 16, -155497632), + i = a(i, c, u, n, t[l + 10], 23, -1094730640), + n = a(n, i, c, u, t[l + 13], 4, 681279174), + u = a(u, n, i, c, t[l + 0], 11, -358537222), + c = a(c, u, n, i, t[l + 3], 16, -722521979), + i = a(i, c, u, n, t[l + 6], 23, 76029189), + n = a(n, i, c, u, t[l + 9], 4, -640364487), + u = a(u, n, i, c, t[l + 12], 11, -421815835), + c = a(c, u, n, i, t[l + 15], 16, 530742520), + i = a(i, c, u, n, t[l + 2], 23, -995338651), + n = p(n, i, c, u, t[l + 0], 6, -198630844), + u = p(u, n, i, c, t[l + 7], 10, 1126891415), + c = p(c, u, n, i, t[l + 14], 15, -1416354905), + i = p(i, c, u, n, t[l + 5], 21, -57434055), + n = p(n, i, c, u, t[l + 12], 6, 1700485571), + u = p(u, n, i, c, t[l + 3], 10, -1894986606), + c = p(c, u, n, i, t[l + 10], 15, -1051523), + i = p(i, c, u, n, t[l + 1], 21, -2054922799), + n = p(n, i, c, u, t[l + 8], 6, 1873313359), + u = p(u, n, i, c, t[l + 15], 10, -30611744), + c = p(c, u, n, i, t[l + 6], 15, -1560198380), + i = p(i, c, u, n, t[l + 13], 21, 1309151649), + n = p(n, i, c, u, t[l + 4], 6, -145523070), + u = p(u, n, i, c, t[l + 11], 10, -1120210379), + c = p(c, u, n, i, t[l + 2], 15, 718787259), + i = p(i, c, u, n, t[l + 9], 21, -343485551), + n = s(n, d), + i = s(i, f), + c = s(c, h), + u = s(u, g) + } + return 16 == _ ? Array(i, c) : Array(n, i, c, u); + +} +function i(t, e, n, i, o, r) { + return s(c(s(s(e, t), s(i, r)), o), n) +} +function o(t, e, n, o, r, a, p) { + return i(e & n | ~e & o, t, e, r, a, p) +} +function r(t, e, n, o, r, a, p) { + return i(e & o | n & ~o, t, e, r, a, p) +} +function a(t, e, n, o, r, a, p) { + return i(e ^ n ^ o, t, e, r, a, p) +} +function p(t, e, n, o, r, a, p) { + return i(n ^ (e | ~o), t, e, r, a, p) +} +function s(t, e) { + var n = (65535 & t) + (65535 & e), + i = (t >> 16) + (e >> 16) + (n >> 16); + return i << 16 | 65535 & n +} +function c(t, e) { + return t << e | t >>> 32 - e +} +function u(t) { + for (var e = Array(), n = (1 << m) - 1, i = 0; i < t.length * m; i += m) e[i >> 5] |= (t.charCodeAt(i / m) & n) << i % 32; + return e +} +function l(t) { + for (var e = w ? "0123456789ABCDEF": "0123456789abcdef", n = "", i = 0; i < 4 * t.length; i++) n += e.charAt(t[i >> 2] >> i % 4 * 8 + 4 & 15) + e.charAt(t[i >> 2] >> i % 4 * 8 & 15); + return n +} +function d(t) { + for (var e = [], n = 0; n < t.length; n += 2) e.push(String.fromCharCode(parseInt(t.substr(n, 2), 16))); + return e.join("") +} +function h(e, n, i, o) { + i = i || "", + e = e || ""; + for (var r = o ? t(e): e, a = d(r), p = t(a + n), s = TEA.strToBytes(i.toUpperCase(), !0), c = Number(s.length / 2).toString(16); c.length < 4;) c = "0" + c; + TEA.initkey(p); + var u = TEA.encrypt(r + TEA.strToBytes(n) + c + s); + TEA.initkey(""); + for (var l = Number(u.length / 2).toString(16); l.length < 4;) l = "0" + l; + var h = $.RSA.rsa_encrypt(d(l + u)); + return btoa(d(h)).replace(/[\/\+=]/g, + function(t) { + return { + "/": "-", + "+": "*", + "=": "_" + } [t] + }) +} +function g(e, n, i) { + var o = i ? e: t(e), + r = o + n.toUpperCase(), + a = $.RSA.rsa_encrypt(r); + return a +} +var w = 1, +m = 8, +_ = 32; +return { + getEncryption: h, + getRSAEncryption: g, + md5: t +} +} (); +function uin2hex(str) { + var maxLength = 16; + str = parseInt(str); + for (var hex = str.toString(16), len = hex.length, i = len; maxLength > i; i++) + hex = "0" + hex; + for (var arr = [], j = 0; maxLength > j; j += 2) + arr.push("\\x" + hex.substr(j, 2)); + var result = arr.join(""); + return eval('result="' + result + '"'), + result +} + +function getmd5(u, p, code, isMd5) { + var p = $.Encryption.getEncryption(p, uin2hex(u), code, isMd5); + return p +} diff --git a/public/tool/newsid/login.php b/public/tool/newsid/login.php new file mode 100644 index 0000000..d065860 --- /dev/null +++ b/public/tool/newsid/login.php @@ -0,0 +1,34 @@ +checkvc($_POST['uin']); +} +elseif($_GET['do']=='dovc'){ + $array=$login->dovc($_POST['uin'],$_POST['sig'],$_POST['ans'],$_POST['cap_cd'],$_POST['sess'],$_POST['websig'],$_POST['cdata'],$_POST['sid']); +} +elseif($_GET['do']=='getvc'){ + $array=$login->getvc($_POST['uin'],$_POST['sig'],$_POST['sess'],$_POST['sid'],$_POST['websig']); +} +elseif($_GET['do']=='qqlogin'){ + $array=$login->qqlogin($_POST['uin'],$_POST['pwd'],$_POST['p'],$_POST['vcode'],$_POST['pt_verifysession'],$_POST['sid'],$_POST['cookie'],$_POST['sms_code'],$_POST['sms_ticket']); +} +elseif($_GET['do']=='smscode'){ + $array=$login->send_sms_code($_POST['uin'],$_POST['sms_ticket'],$_POST['cookie']); +} +elseif($_GET['do']=='getqrpic'){ + $array=$login->getqrpic(); +} +elseif($_GET['do']=='qrlogin'){ + if(isset($_GET['findpwd']))session_start(); + $array=$login->qrlogin($_GET['qrsig']); +} +elseif($_GET['do']=='getqrpic3rd'){ + $array=$login->getqrpic3rd($_GET['daid'],$_GET['appid']); +} +elseif($_GET['do']=='qrlogin3rd'){ + $array=$login->qrlogin3rd($_GET['daid'],$_GET['appid'],$_GET['qrsig']); +} +echo json_encode($array); \ No newline at end of file diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Binarizer.php b/public/tool/newsid/qrcodedecoder/Zxing/Binarizer.php new file mode 100644 index 0000000..056890c --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Binarizer.php @@ -0,0 +1,96 @@ +source = $source; + } + + /** + * @return LuminanceSource + */ + public final function getLuminanceSource() + { + return $this->source; + } + + /** + * Converts one row of luminance data to 1 bit data. May actually do the conversion, or return + * cached data. Callers should assume this method is expensive and call it as seldom as possible. + * This method is intended for decoding 1D barcodes and may choose to apply sharpening. + * For callers which only examine one row of pixels at a time, the same BitArray should be reused + * and passed in with each call for performance. However it is legal to keep more than one row + * at a time if needed. + * + * @param y The row to fetch, which must be in [0, bitmap height) + * @param row An optional preallocated array. If null or too small, it will be ignored. + * If used, the Binarizer will call BitArray.clear(). Always use the returned object. + * + * @return array The array of bits for this row (true means black). + * @throws NotFoundException if row can't be binarized + */ + public abstract function getBlackRow($y, $row); + + /** + * Converts a 2D array of luminance data to 1 bit data. As above, assume this method is expensive + * and do not call it repeatedly. This method is intended for decoding 2D barcodes and may or + * may not apply sharpening. Therefore, a row from this matrix may not be identical to one + * fetched using getBlackRow(), so don't mix and match between them. + * + * @return BitMatrix The 2D array of bits for the image (true means black). + * @throws NotFoundException if image can't be binarized to make a matrix + */ + public abstract function getBlackMatrix(); + + /** + * Creates a new object with the same type as this Binarizer implementation, but with pristine + * state. This is needed because Binarizer implementations may be stateful, e.g. keeping a cache + * of 1 bit data. See Effective Java for why we can't use Java's clone() method. + * + * @param source The LuminanceSource this Binarizer will operate on. + * + * @return Binarizer A new concrete Binarizer implementation object. + */ + public abstract function createBinarizer($source); + + public final function getWidth() + { + return $this->source->getWidth(); + } + + public final function getHeight() + { + return $this->source->getHeight(); + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/BinaryBitmap.php b/public/tool/newsid/qrcodedecoder/Zxing/BinaryBitmap.php new file mode 100644 index 0000000..b23cb5f --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/BinaryBitmap.php @@ -0,0 +1,166 @@ +binarizer = $binarizer; + } + + /** + * @return int The width of the bitmap. + */ + public function getWidth() + { + return $this->binarizer->getWidth(); + } + + /** + * @return int The height of the bitmap. + */ + public function getHeight() + { + return $this->binarizer->getHeight(); + } + + /** + * Converts one row of luminance data to 1 bit data. May actually do the conversion, or return + * cached data. Callers should assume this method is expensive and call it as seldom as possible. + * This method is intended for decoding 1D barcodes and may choose to apply sharpening. + * + * @param y The row to fetch, which must be in [0, bitmap height) + * @param row An optional preallocated array. If null or too small, it will be ignored. + * If used, the Binarizer will call BitArray.clear(). Always use the returned object. + * + * @return array The array of bits for this row (true means black). + * @throws NotFoundException if row can't be binarized + */ + public function getBlackRow($y, $row) + { + return $this->binarizer->getBlackRow($y, $row); + } + + /** + * @return bool Whether this bitmap can be cropped. + */ + public function isCropSupported() + { + return $this->binarizer->getLuminanceSource()->isCropSupported(); + } + + /** + * Returns a new object with cropped image data. Implementations may keep a reference to the + * original data rather than a copy. Only callable if isCropSupported() is true. + * + * @param left The left coordinate, which must be in [0,getWidth()) + * @param top The top coordinate, which must be in [0,getHeight()) + * @param width The width of the rectangle to crop. + * @param height The height of the rectangle to crop. + * + * @return BinaryBitmap A cropped version of this object. + */ + public function crop($left, $top, $width, $height) + { + $newSource = $this->binarizer->getLuminanceSource()->crop($left, $top, $width, $height); + + return new BinaryBitmap($this->binarizer->createBinarizer($newSource)); + } + + /** + * @return Whether this bitmap supports counter-clockwise rotation. + */ + public function isRotateSupported() + { + return $this->binarizer->getLuminanceSource()->isRotateSupported(); + } + + /** + * Returns a new object with rotated image data by 90 degrees counterclockwise. + * Only callable if {@link #isRotateSupported()} is true. + * + * @return BinaryBitmap A rotated version of this object. + */ + public function rotateCounterClockwise() + { + $newSource = $this->binarizer->getLuminanceSource()->rotateCounterClockwise(); + + return new BinaryBitmap($this->binarizer->createBinarizer($newSource)); + } + + /** + * Returns a new object with rotated image data by 45 degrees counterclockwise. + * Only callable if {@link #isRotateSupported()} is true. + * + * @return BinaryBitmap A rotated version of this object. + */ + public function rotateCounterClockwise45() + { + $newSource = $this->binarizer->getLuminanceSource()->rotateCounterClockwise45(); + + return new BinaryBitmap($this->binarizer->createBinarizer($newSource)); + } + + public function toString() + { + try { + return $this->getBlackMatrix()->toString(); + } catch (NotFoundException $e) { + } + + return ''; + } + + /** + * Converts a 2D array of luminance data to 1 bit. As above, assume this method is expensive + * and do not call it repeatedly. This method is intended for decoding 2D barcodes and may or + * may not apply sharpening. Therefore, a row from this matrix may not be identical to one + * fetched using getBlackRow(), so don't mix and match between them. + * + * @return BitMatrix The 2D array of bits for the image (true means black). + * @throws NotFoundException if image can't be binarized to make a matrix + */ + public function getBlackMatrix() + { + // The matrix is created on demand the first time it is requested, then cached. There are two + // reasons for this: + // 1. This work will never be done if the caller only installs 1D Reader objects, or if a + // 1D Reader finds a barcode before the 2D Readers run. + // 2. This work will only be done once even if the caller installs multiple 2D Readers. + if ($this->matrix === null) { + $this->matrix = $this->binarizer->getBlackMatrix(); + } + + return $this->matrix; + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/ChecksumException.php b/public/tool/newsid/qrcodedecoder/Zxing/ChecksumException.php new file mode 100644 index 0000000..ea23209 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/ChecksumException.php @@ -0,0 +1,42 @@ +strict = $strict; + $this->change($initialValue); + } + + /** + * Changes the value of the enum. + * + * @param mixed $value + * + * @return void + */ + public function change($value) + { + if (!in_array($value, $this->getConstList(), $this->strict)) { + throw new \UnexpectedValueException('Value not a const in enum ' . get_class($this)); + } + $this->value = $value; + } + + /** + * Gets all constants (possible values) as an array. + * + * @param boolean $includeDefault + * + * @return array + */ + public function getConstList($includeDefault = true) + { + if ($this->constants === null) { + $reflection = new ReflectionClass($this); + $this->constants = $reflection->getConstants(); + } + if ($includeDefault) { + return $this->constants; + } + $constants = $this->constants; + unset($constants['__default']); + + return $constants; + } + + /** + * Gets current value. + * + * @return mixed + */ + public function get() + { + return $this->value; + } + + /** + * Gets the name of the enum. + * + * @return string + */ + public function __toString() + { + return (string)array_search($this->value, $this->getConstList()); + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Common/BitArray.php b/public/tool/newsid/qrcodedecoder/Zxing/Common/BitArray.php new file mode 100644 index 0000000..4ab5a4c --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Common/BitArray.php @@ -0,0 +1,422 @@ +A simple, fast array of bits, represented compactly by an array of ints internally.

        + * + * @author Sean Owen + */ + +final class BitArray +{ + + private $bits; + private $size; + + + public function __construct($bits = [], $size = 0) + { + + if (!$bits && !$size) { + $this->$size = 0; + $this->bits = []; + } elseif ($bits && !$size) { + $this->size = $bits; + $this->bits = $this->makeArray($bits); + } else { + $this->bits = $bits; + $this->size = $size; + } + + } + + private static function makeArray($size) + { + return []; + } + + public function getSize() + { + return $this->size; + } + + public function getSizeInBytes() + { + return ($this->size + 7) / 8; + } + + /** + * Sets bit i. + * + * @param i bit to set + */ + public function set($i) + { + $this->bits[(int)($i / 32)] |= 1 << ($i & 0x1F); + $this->bits[(int)($i / 32)] = ($this->bits[(int)($i / 32)]); + } + + /** + * Flips bit i. + * + * @param i bit to set + */ + public function flip($i) + { + $this->bits[(int)($i / 32)] ^= 1 << ($i & 0x1F); + $this->bits[(int)($i / 32)] = ($this->bits[(int)($i / 32)]); + } + + /** + * @param from first bit to check + * + * @return index of first bit that is set, starting from the given index, or size if none are set + * at or beyond this given index + * @see #getNextUnset(int) + */ + public function getNextSet($from) + { + if ($from >= $this->size) { + return $this->size; + } + $bitsOffset = (int)($from / 32); + $currentBits = (int)$this->bits[$bitsOffset]; + // mask off lesser bits first + $currentBits &= ~((1 << ($from & 0x1F)) - 1); + while ($currentBits == 0) { + if (++$bitsOffset == count($this->bits)) { + return $this->size; + } + $currentBits = $this->bits[$bitsOffset]; + } + $result = ($bitsOffset * 32) + numberOfTrailingZeros($currentBits); //numberOfTrailingZeros + + return $result > $this->size ? $this->size : $result; + } + + /** + * @param from index to start looking for unset bit + * + * @return index of next unset bit, or {@code size} if none are unset until the end + * @see #getNextSet(int) + */ + public function getNextUnset($from) + { + if ($from >= $this->size) { + return $this->size; + } + $bitsOffset = (int)($from / 32); + $currentBits = ~$this->bits[$bitsOffset]; + // mask off lesser bits first + $currentBits &= ~((1 << ($from & 0x1F)) - 1); + while ($currentBits == 0) { + if (++$bitsOffset == count($this->bits)) { + return $this->size; + } + $currentBits = (~$this->bits[$bitsOffset]); + } + $result = ($bitsOffset * 32) + numberOfTrailingZeros($currentBits); + + return $result > $this->size ? $this->size : $result; + } + + /** + * Sets a block of 32 bits, starting at bit i. + * + * @param i first bit to set + * @param newBits the new value of the next 32 bits. Note again that the least-significant bit + * corresponds to bit i, the next-least-significant to i+1, and so on. + */ + public function setBulk($i, $newBits) + { + $this->bits[(int)($i / 32)] = $newBits; + } + + /** + * Sets a range of bits. + * + * @param start start of range, inclusive. + * @param end end of range, exclusive + */ + public function setRange($start, $end) + { + if ($end < $start) { + throw new \InvalidArgumentException(); + } + if ($end == $start) { + return; + } + $end--; // will be easier to treat this as the last actually set bit -- inclusive + $firstInt = (int)($start / 32); + $lastInt = (int)($end / 32); + for ($i = $firstInt; $i <= $lastInt; $i++) { + $firstBit = $i > $firstInt ? 0 : $start & 0x1F; + $lastBit = $i < $lastInt ? 31 : $end & 0x1F; + $mask = 0; + if ($firstBit == 0 && $lastBit == 31) { + $mask = -1; + } else { + $mask = 0; + for ($j = $firstBit; $j <= $lastBit; $j++) { + $mask |= 1 << $j; + } + } + $this->bits[$i] = ($this->bits[$i] | $mask); + } + } + + /** + * Clears all bits (sets to false). + */ + public function clear() + { + $max = count($this->bits); + for ($i = 0; $i < $max; $i++) { + $this->bits[$i] = 0; + } + } + + /** + * Efficient method to check if a range of bits is set, or not set. + * + * @param start start of range, inclusive. + * @param end end of range, exclusive + * @param value if true, checks that bits in range are set, otherwise checks that they are not set + * + * @return true iff all bits are set or not set in range, according to value argument + * @throws InvalidArgumentException if end is less than or equal to start + */ + public function isRange($start, $end, $value) + { + if ($end < $start) { + throw new \InvalidArgumentException(); + } + if ($end == $start) { + return true; // empty range matches + } + $end--; // will be easier to treat this as the last actually set bit -- inclusive + $firstInt = (int)($start / 32); + $lastInt = (int)($end / 32); + for ($i = $firstInt; $i <= $lastInt; $i++) { + $firstBit = $i > $firstInt ? 0 : $start & 0x1F; + $lastBit = $i < $lastInt ? 31 : $end & 0x1F; + $mask = 0; + if ($firstBit == 0 && $lastBit == 31) { + $mask = -1; + } else { + $mask = 0; + for ($j = $firstBit; $j <= $lastBit; $j++) { + $mask = ($mask | (1 << $j)); + } + } + + // Return false if we're looking for 1s and the masked bits[i] isn't all 1s (that is, + // equals the mask, or we're looking for 0s and the masked portion is not all 0s + if (($this->bits[$i] & $mask) != ($value ? $mask : 0)) { + return false; + } + } + + return true; + } + + /** + * Appends the least-significant bits, from value, in order from most-significant to + * least-significant. For example, appending 6 bits from 0x000001E will append the bits + * 0, 1, 1, 1, 1, 0 in that order. + * + * @param value {@code int} containing bits to append + * @param numBits bits from value to append + */ + public function appendBits($value, $numBits) + { + if ($numBits < 0 || $numBits > 32) { + throw new \InvalidArgumentException("Num bits must be between 0 and 32"); + } + $this->ensureCapacity($this->size + $numBits); + for ($numBitsLeft = $numBits; $numBitsLeft > 0; $numBitsLeft--) { + $this->appendBit((($value >> ($numBitsLeft - 1)) & 0x01) == 1); + } + } + + private function ensureCapacity($size) + { + if ($size > count($this->bits) * 32) { + $newBits = $this->makeArray($size); + $newBits = arraycopy($this->bits, 0, $newBits, 0, count($this->bits)); + $this->bits = $newBits; + } + } + + public function appendBit($bit) + { + $this->ensureCapacity($this->size + 1); + if ($bit) { + $this->bits[(int)($this->size / 32)] |= 1 << ($this->size & 0x1F); + } + $this->size++; + } + + public function appendBitArray($other) + { + $otherSize = $other->size; + $this->ensureCapacity($this->size + $otherSize); + for ($i = 0; $i < $otherSize; $i++) { + $this->appendBit($other->get($i)); + } + } + + public function _xor($other) + { + if (count($this->bits) !== count($other->bits)) { + throw new \InvalidArgumentException("Sizes don't match"); + } + $count = count($this->bits); + for ($i = 0; $i < $count; $i++) { + // The last byte could be incomplete (i.e. not have 8 bits in + // it) but there is no problem since 0 XOR 0 == 0. + $this->bits[$i] ^= $other->bits[$i]; + } + } + + /** + * + * @param bitOffset first bit to start writing + * @param array array to write into. Bytes are written most-significant byte first. This is the opposite + * of the internal representation, which is exposed by {@link #getBitArray()} + * @param offset position in array to start writing + * @param numBytes how many bytes to write + */ + public function toBytes($bitOffset, &$array, $offset, $numBytes) + { + for ($i = 0; $i < $numBytes; $i++) { + $theByte = 0; + for ($j = 0; $j < 8; $j++) { + if ($this->get($bitOffset)) { + $theByte |= 1 << (7 - $j); + } + $bitOffset++; + } + $array[(int)($offset + $i)] = $theByte; + } + } + + /** + * @param $i ; bit to get + * + * @return true iff bit i is set + */ + public function get($i) + { + $key = (int)($i / 32); + + return ($this->bits[$key] & (1 << ($i & 0x1F))) != 0; + } + + /** + * @return array underlying array of ints. The first element holds the first 32 bits, and the least + * significant bit is bit 0. + */ + public function getBitArray() + { + return $this->bits; + } + + /** + * Reverses all bits in the array. + */ + public function reverse() + { + $newBits = []; + // reverse all int's first + $len = (($this->size - 1) / 32); + $oldBitsLen = $len + 1; + for ($i = 0; $i < $oldBitsLen; $i++) { + $x = $this->bits[$i];/* + $x = (($x >> 1) & 0x55555555L) | (($x & 0x55555555L) << 1); + $x = (($x >> 2) & 0x33333333L) | (($x & 0x33333333L) << 2); + $x = (($x >> 4) & 0x0f0f0f0fL) | (($x & 0x0f0f0f0fL) << 4); + $x = (($x >> 8) & 0x00ff00ffL) | (($x & 0x00ff00ffL) << 8); + $x = (($x >> 16) & 0x0000ffffL) | (($x & 0x0000ffffL) << 16);*/ + $x = (($x >> 1) & 0x55555555) | (($x & 0x55555555) << 1); + $x = (($x >> 2) & 0x33333333) | (($x & 0x33333333) << 2); + $x = (($x >> 4) & 0x0f0f0f0f) | (($x & 0x0f0f0f0f) << 4); + $x = (($x >> 8) & 0x00ff00ff) | (($x & 0x00ff00ff) << 8); + $x = (($x >> 16) & 0x0000ffff) | (($x & 0x0000ffff) << 16); + $newBits[(int)$len - $i] = (int)$x; + } + // now correct the int's if the bit size isn't a multiple of 32 + if ($this->size != $oldBitsLen * 32) { + $leftOffset = $oldBitsLen * 32 - $this->size; + $mask = 1; + for ($i = 0; $i < 31 - $leftOffset; $i++) { + $mask = ($mask << 1) | 1; + } + $currentInt = ($newBits[0] >> $leftOffset) & $mask; + for ($i = 1; $i < $oldBitsLen; $i++) { + $nextInt = $newBits[$i]; + $currentInt |= $nextInt << (32 - $leftOffset); + $newBits[(int)($i) - 1] = $currentInt; + $currentInt = ($nextInt >> $leftOffset) & $mask; + } + $newBits[(int)($oldBitsLen) - 1] = $currentInt; + } +// $bits = $newBits; + } + + public function equals($o) + { + if (!($o instanceof BitArray)) { + return false; + } + $other = $o; + + return $this->size == $other->size && $this->bits === $other->bits; + } + + public function hashCode() + { + return 31 * $this->size + hashCode($this->bits); + } + + public function toString() + { + $result = ''; + for ($i = 0; $i < $this->size; $i++) { + if (($i & 0x07) == 0) { + $result .= ' '; + } + $result .= ($this->get($i) ? 'X' : '.'); + } + + return (string)$result; + } + + public function _clone() + { + return new BitArray($this->bits, $this->size); + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Common/BitMatrix.php b/public/tool/newsid/qrcodedecoder/Zxing/Common/BitMatrix.php new file mode 100644 index 0000000..dec4509 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Common/BitMatrix.php @@ -0,0 +1,458 @@ +width = $width; + $this->height = $height; + $this->rowSize = $rowSize; + $this->bits = $bits; + } + + public static function parse($stringRepresentation, $setString, $unsetString) + { + if (!$stringRepresentation) { + throw new \InvalidArgumentException(); + } + $bits = []; + $bitsPos = 0; + $rowStartPos = 0; + $rowLength = -1; + $nRows = 0; + $pos = 0; + while ($pos < strlen($stringRepresentation)) { + if ($stringRepresentation[$pos] == '\n' || + $stringRepresentation->{$pos} == '\r') { + if ($bitsPos > $rowStartPos) { + if ($rowLength == -1) { + $rowLength = $bitsPos - $rowStartPos; + } else if ($bitsPos - $rowStartPos != $rowLength) { + throw new \InvalidArgumentException("row lengths do not match"); + } + $rowStartPos = $bitsPos; + $nRows++; + } + $pos++; + } else if (substr($stringRepresentation, $pos, strlen($setString)) == $setString) { + $pos += strlen($setString); + $bits[$bitsPos] = true; + $bitsPos++; + } else if (substr($stringRepresentation, $pos + strlen($unsetString)) == $unsetString) { + $pos += strlen($unsetString); + $bits[$bitsPos] = false; + $bitsPos++; + } else { + throw new \InvalidArgumentException( + "illegal character encountered: " . substr($stringRepresentation, $pos)); + } + } + + // no EOL at end? + if ($bitsPos > $rowStartPos) { + if ($rowLength == -1) { + $rowLength = $bitsPos - $rowStartPos; + } else if ($bitsPos - $rowStartPos != $rowLength) { + throw new \InvalidArgumentException("row lengths do not match"); + } + $nRows++; + } + + $matrix = new BitMatrix($rowLength, $nRows); + for ($i = 0; $i < $bitsPos; $i++) { + if ($bits[$i]) { + $matrix->set($i % $rowLength, $i / $rowLength); + } + } + + return $matrix; + } + + /** + *

        Sets the given bit to true.

        + * + * @param $x ; The horizontal component (i.e. which column) + * @param $y ; The vertical component (i.e. which row) + */ + public function set($x, $y) + { + $offset = (int)($y * $this->rowSize + ($x / 32)); + if (!isset($this->bits[$offset])) { + $this->bits[$offset] = 0; + } + //$this->bits[$offset] = $this->bits[$offset]; + + // if($this->bits[$offset]>200748364){ + //$this->bits= array(0,0,-16777216,-1,-1,-1,-1,65535,0,0,0,0,0,0,0,-16777216,-1,-1,-1,-1,65535,0,0,0,0,0,0,0,-16777216,-1,-1,-1,-1,65535,0,0,0,0,0,0,0,-16777216,-1,-1,-1,-1,65535,0,0,0,0,0,0,0,-16777216,-1,-1,-1,-1,65535,0,0,0,0,0,0,0,-16777216,-1,-1,-1,-1,65535,0,0,0,0,0,0,0,-16777216,-1,-1,-1,-1,65535,0,0,0,0,0,0,0,-16777216,-1,-1,-1,-1,65535,0,0,0,0,0,0,0,-16777216,-1,-1,-1,-1,65535,0,0,0,0,0,0,0,-16777216,-1,-1,-1,-1,65535,0,0,0,0,0,0,0,-16777216,-1,-1,-1,-1,65535,0,0,0,0,0,0,0,-1090519040,-1,-1,-1,-1,65535,0,0,0,0,0,0,0,1056964608,-1,-1,-1,-1,65535,0,0,0,0,0,0,0,-1358954496,-1,-1,-1,-1,65535,0,0,0,0,0,0,0,117440512,-1,-1,-1,-1,65535,0,0,0,0,0,0,0,50331648,-1,-1,-1,-1,65535,0,0,0,0,0,0,0,33554432,-1,-1,536870911,-4096,65279,0,0,0,0,0,0,0,0,-1,-1,65535,-4096,65535,0,0,0,0,0,0,0,0,-193,536870911,0,-4096,65279,0,0,0,0,0,0,0,0,-254,32767,0,-4096,61951,0,0,0,0,0,0,0,0,20913920,0,0,-4096,50175,0,0,0,0,0,0,0,0,0,0,0,-4096,60159,0,0,0,0,0,0,0,0,0,0,0,-4096,64255,0,0,0,0,0,0,0,0,0,0,0,-8192,56319,0,0,0,0,0,0,0,0,0,0,0,-4096,16777215,0,0,0,0,0,0,0,0,0,0,0,-4096,16777215,0,0,0,0,0,0,0,0,0,0,0,-4096,16777215,0,0,0,0,0,0,0,0,0,0,0,-4096,16777215,0,0,0,0,0,0,0,0,0,0,0,-4096,16777215,0,0,0,0,0,0,0,0,0,0,0,-4096,16777215,0,0,0,0,0,0,0,0,0,0,0,-4096,16777215,0,0,0,0,0,0,0,0,0,0,0,-4096,16777215,0,0,0,0,0,0,0,251658240,0,0,0,-4096,-1,255,0,256,0,0,0,0,117440512,0,0,0,-4096,-1,255,0,512,0,0,0,0,117440512,0,0,0,-4096,-1,255,0,1024,0,0,0,0,117440512,0,0,0,-4096,-1,223,0,256,0,0,0,0,117440512,0,0,33030144,-4096,-1,191,0,256,0,0,0,0,117440512,0,0,33554428,-4096,-1,255,0,768,0,0,0,0,117440512,0,402849792,67108862,-8192,-1,255,0,768,0,0,0,0,117440512,0,470278396,63045630,-8192,-1,255,0,256,0,0,0,0,251658240,-8388608,470278399,58720286,-8192,-1,2686975,0,3842,0,0,0,0,251658240,-131072,1007149567,58720286,-8192,-1,2031615,0,3879,0,0,0,0,251658240,536739840,1007092192,58720286,-8192,-1,851967,0,3840,0,0,0,0,251658240,917504,1007092192,58720284,-8192,-1,2031615,0,3968,0,0,0,0,251658240,917504,1007092160,59244060,-8192,-1,65535,0,7936,0,0,0,0,251658240,917504,1009779136,59244060,-8192,-1,9371647,0,1792,0,0,0,0,251658240,917504,946921920,59244060,-8192,-1,8585215,0,1792,0,0,0,0,117440512,-15859712,477159875,59244060,-8192,-1,65535,0,12032,0,0,0,0,251658240,-15859712,52490691,59244060,-8192,-1,-1,0,65408,0,0,0,0,251658240,-15859712,58778051,59244060,-8192,-1,-1,0,65473,0,0,0,0,251658240,-15859712,125886915,59244060,-8192,-1,-1,0,65472,0,0,0,0,251658240,-15859712,58778051,59244060,-8192,-1,-1,0,65408,0,0,0,0,251658240,-15859712,8380867,59244060,-8192,-1,-1,0,65473,0,0,0,0,251658240,-15859712,8380867,59244060,-8192,-1,-1,0,131011,0,0,0,0,251658240,-15859712,8380867,58720284,-8192,-1,-1,0,130947,0,0,0,0,251658240,-15859712,2089411,58720284,-8192,-1,-1,0,130947,0,0,0,0,251658240,-32636928,449,58720284,-8192,-1,-1,33554431,131015,0,0,0,0,251658240,786432,448,62914588,-8192,-1,-1,16777215,131015,0,0,0,0,251658240,786432,448,67108860,-8192,-1,-1,553648127,131015,0,0,0,0,251658240,786432,946864576,67108860,-8192,-1,-1,32505855,131015,0,0,0,0,251658240,786432,946921976,8388604,-8192,-1,-1,8191999,131015,0,0,0,0,251658240,-262144,946921983,248,-8192,-1,-1,8126463,196551,0,0,0,0,251658240,-262144,7397887,0,-8192,-1,-1,16777215,262087,0,0,0,0,251658240,-262144,8257543,0,-8192,-1,-1,-2121269249,262095,0,0,0,0,520093696,0,8257536,0,-8192,-1,-1,-201326593,262095,0,0,0,0,520290304,0,8257536,117963776,-8192,-1,-1,-201326593,262095,0,0,0,0,520093696,0,-2140143616,118488579,-8192,-1,-1,-201326593,131023,0,0,0,0,520093696,0,-2131697280,118488579,-8192,-1,-1,-503316481,131023,0,0,0,0,520093696,2145386496,-2131631232,118484995,-16384,-1,-1,-469762049,262095,0,0,0,0,520093696,2147221504,552649600,118481344,-16384,-1,-1,-469762049,131023,0,0,0,0,520290304,2147221504,2029002240,118481344,-16384,-1,-1,-469762049,262031,0,0,0,0,520290304,-266600448,2029001791,125952960,-16384,-1,-1,-469762049,262031,0,0,0,0,1057423360,-266600448,2027953215,133177312,-16384,-1,-1,-134217729,262111,0,0,0,0,1058471936,-266600448,-119531393,133177343,-16384,-1,-1,-134217729,262111,0,0,0,0,1058471936,-2145648640,-253754369,66068479,-16384,-1,-1,-134217729,262111,0,0,0,0,1058471936,236716032,-253754369,15729663,-16384,-1,-1,-134217729,262095,0,0,0,0,1057947648,236716032,-253754369,6348807,-16384,-1,-1,-134217729,262095,0,0,0,0,524222464,236716032,-253690305,6348803,-16384,-1,-1,-134217729,262111,0,0,0,0,521076736,2115764224,-253625344,14737411,-16384,-1,-1,-134217729,262095,0,0,0,0,522125312,2115764224,-253625344,14743555,-16384,-1,-1,-134217729,262111,0,0,16772608,0,1073676288,-31719424,-2014283776,14810115,-16384,-1,-1,-1,262143,0,0,16776704,0,1065287680,-1642594304,-1879178880,14810115,-16384,-1,-1,-1,524287,0,0,16776192,0,2139029504,264241152,-2013396089,14809091,-16384,-1,-1,-1,262095,0,0,16776192,0,2139029504,264241152,-2080636025,14803335,-16384,-1,-1,-1,262087,0,0,16776192,0,2147418112,264241152,-2132803581,14803847,-16384,-1,-1,-402653185,524259,0,0,8386048,0,2147418112,0,-2132688896,123783,-16384,-1,-1,1207959551,262112,0,0,16775168,0,2147418112,0,14794752,1046535,-16384,-1,-1,268435455,262128,0,0,16775168,0,2147418112,0,14712832,1047615,-16384,-1,-1,536870911,524284,0,0,16776705,0,2147418112,0,14680832,1047615,-16384,-1,-1,-1,524287,0,0,16776704,0,2147418112,-1048576,14681087,1046591,-32768,-1,-1,-1,524287,0,0,16776704,0,2147418112,-524288,-2132802561,2080831,-32768,-1,-1,-1,524287,0,0,16776705,0,2147418112,-524288,-31718401,2080831,-32768,-1,-1,-1,1048575,0,0,16776193,0,2147418112,3670016,-31718528,2080831,-32768,-1,-1,-1,524287,0,0,16776195,0,2147418112,3670016,-31718528,134086719,-32768,-1,-1,-1,524287,0,0,16776195,0,2147418112,3670016,253494144,268173368,-32768,-1,-1,-1,524287,0,0,16775171,0,2147418112,3670016,268174208,268173368,-32768,-1,-1,-1,1048575,0,0,16771072,0,2147418112,-63438848,268174223,31457328,-32768,-1,-1,-1,1048575,0,0,10418176,0,-65536,-63438848,133957519,14807040,-32768,-1,-1,-1,2097151,0,0,15923200,0,2147418112,-63438848,1968015,14809095,-32768,-1,-1,-1,1048575,0,0,12808192,0,2147418112,-63438848,2082703,12711943,-32768,-1,-1,-1,2097151,0,0,6420480,0,2147418112,-63438848,2082703,14343,-32768,-1,-1,-1,2097151,0,0,15202304,0,-65536,-63438848,2082703,1849351,-32768,-1,-1,-1,2097151,0,0,15464448,0,-65536,-63438848,264472335,1849351,-32768,-1,-1,-1,4194303,0,0,16371712,0,-65536,-63438848,264472335,14343,-32768,-1,-1,-1,8388607,0,0,0,0,-65536,-63438848,532907791,235010048,-32768,-1,-1,-1,16777215,0,0,0,0,-65536,-63438848,-1603833,235010160,-32768,-1,-1,-1,16777215,0,0,0,0,-65536,3670016,-30976,67238000,-32768,-1,-1,-1,16777215,0,0,0,0,-65536,3670016,-30976,48,-32768,-1,-1,-1,16777215,0,0,0,0,-65536,3670016,-29391104,768,-32768,-1,-1,-1,16777215,0,0,0,0,-65536,3670016,-29391104,768,-32768,-1,-1,-1,16777215,0,0,0,0,-65536,-524287,-65042433,768,-32768,-1,-1,-1,16777215,0,0,0,0,-65536,-524287,2082441215,0,-65536,-1,-1,-1,16777215,0,0,0,0,-13697024,-524287,511,0,-65536,-1,-1,-1,16777215,0,0,0,0,-12648448,1,0,0,-65536,-1,-1,-1,14680063,0,0,0,0,-12648448,1,0,0,-65536,-1,-1,-1,16777215,0,0,0,0,-65536,1,0,0,-65536,-1,-1,-1,14680063,0,0,0,0,-8454144,1,0,0,-65536,-1,-1,-1,12582911,0,0,0,0,-12648448,1,0,0,-65536,-1,-1,-1,2097151,0,0,0,0,-12648448,1,0,0,-65536,-1,-1,-1,1048575,0,0,0,0,-14745600,1,0,0,-65536,-1,-1,-1,3145727,0,0,0,0,1056964608,1,0,0,-65536,-1,-1,-1,1048575,0,0,0,0,1056964608,1,0,0,-65536,-1,-1,-1,1048575,0,0,0,0,1056964608,1,0,0,-65536,-1,-1,-1,524287,0,0,0,0,2130706432,1,0,0,-65536,-1,-1,-1,1048575,0,0,0,0,1056964608,1,0,0,-65536,-1,-1,-1,524287,0,0,0,0,2130706432,1,0,0,-65536,-1,-1,-1,524287,0,0,0,0,2130706432,1,0,0,-65536,-1,-1,-1,1048575,0,0,0,0,2130706432,1,0,0,-65536,-1,-1,-1,1048575,0,0,0,0,50331648,1,0,0,-65536,-1,-1,-1,1048575,0,0,0,0,117440512,1,0,-268435456,-1,-1,-1,-1,524287,0,0,0,0,251658240,1,0,-320,-1,-1,-1,-1,262143,0,0,0,0,520093696,1,-2048,-1,-1,-1,-1,-1,262143,0,0,0,0,1056964608,-16777213,-1,-1,-1,-1,-1,-1,131071,0,0,0,0,-16777216,-121,-1,-1,-1,-1,-1,-1,131071,0,0,0,0,-16777216,-1,-1,-1,-1,-1,-1,-1,131071,0,0,0,0,-16777216,-1,-1,-1,-1,-1,-1,-1,131071,0,0,0,0,-16777216,-1,-1,-1,-1,-1,-1,-1,131071,0,0,0,0,-16777216,-1,-1,-1,-1,-1,-1,-1,65535,0,0,0,0,-16777216,-1,-1,-1,-1,-1,-1,-1,65535,0,0,0,0,-16777216,-1,-1,-1,-1,-1,-1,-1,131071,0,0,0,0,-16777216,-1,-1,-1,-1,-1,-1,-1,262143,0,0,0,0,-16777216,-1,-1,-1,-1,-1,-1,-1,524287,0,0,0,0,-16777216,-1,-1,-1,-1,-1,-1,-1,524287,0,0,0,0,-16777216,-1,-1,-1,-1,-1,-1,-1,589823,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,8179,0,0,0,0,50331648,-1,-1,-1,-1,-1,-1,-1,4080,0,0,0,0,117440512,-1,-1,-1,-1,-1,-1,-1,1016,0,0,0,0,251658240,-1,-1,-1,-1,-1,-1,1073741823,1020,0,0,0,0,50331648,-1,-1,-1,-1,-1,-1,536870911,254,0,0,0,0,50331648,-1,-1,-1,-1,-1,-1,536870911,255,0,0,0,0,50331648,-1,-1,-1,-1,-1,-1,-1879048193,127,0,0,0,0,50331648,-1,-1,-1,-1,-1,-1,-469762049,63,0,0,0,0,1191182336,-1,-1,-1,-1,1023999,0,-520093712,15,0,0,0,0,-218103808,-1,-1,-1,-1,0,-8454144,-260046849,7,0,0,0,0,0,-193,-1,-1,-1057947649,-2147483648,-1,-58720257,1,0,0,0,0,0,-251,-1,-1,-1057423361,-2074,-1,-1,0,0,0,0,0,0,-59648,-1,-1,-1,-1,-1,1073741823,0,0,0,0,0,0,-65536,-1,-1,-1,-1,-1,268435455,0,0,0,0,0,0,-65536,-1,-1,-1,-1,-1,67108863,0,0,0,0,0,0,-65536,-1,-1,-1,-1,-1,8388607,0,0,0,0,0,0,0,-403603456,-1,-1,-1,-1,262143,0,0,0,8388656,0,0,0,-1891434496,-1,-1,-1,-1,16383,0,0,0,8388608,0,0,0,-1612513280,-1,-1,-1,-1,63,0,0,0,0,0,0,0,-24320,-1,-1,-1,8388607,0,0,0,0,0,0,0,0,-256,-1,-1,1073741823,1,0,0,0,0,0,0,0,1610612736,-15,-1,-1,16383,0,0,0,0,0,0,0,0,-16646144,-1,-1,251658239,0,0,0,0,0,0,0,0,0,-51200,-1,-1,40959,0,0,0,0,0,0,268419584,103809024,-12713984,-1,-2147483137,4194303,0,0,0,0,0,0,0,402620416,-2144010240,-13631487,-32513,3,20480,0,0,0,0,0,0,0,419299328,0,-262144,-1,0,0,0,0,0,0,0,0,0,0,0,-5832704,268049407,0,0,0,0,0,0,0,0,0,0,0,0,33030144,0,0,0,0,0,0,0,0,0,0,0,0,3670016,0,0,0,0,0,0,0,0,0,0,0,0,1572864,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,458752,0,0,0,0,0,0,0,0,0,0,0,0,229376,0,0,0,0,0,0,0,0,0,0,0,0,32768,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8192,0,0,0,0,0,0,0,0,0,0,0,0,8192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31744,0,0,0,0,0,0,0,0,0,0,0,0,31744,0,0,0,0,0,0,0,0,0,0,0,0,64512,0,0,0,0,0,0,0,0,0,0,0,0,15872,0,0,0,0,0,0,0,0,0,0,0,0,3584,0,0,0,0,0,0,0,0,0,0,0,0,7680,0,0,0,0,0,0,0,0,0,0,0,0,512,0,0,0,0,0,0,0,0,0,0,0,0,3968,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3840,0,0,0,0,0,0,0,0,0,0,0,0,1855,0,0,0,0,0,0,0,0,0,0,0,0,63,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134217728,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,124,0,0,0,0,0,0,0,0,0,0,0,-260046848,63,0,0,0,0,0,0,0,0,0,0,0,-17301504,127,0,0,0,0,0,0,0,0,0,0,0,-524288,127,0,0,0,0,0,0,0,0,0,0,0,-262144,127,0,0,0,0,0,0,0,0,0,0,0,-262144,63,0,0,0,0,0,0,0,0,0,0,0,-262144,63,0,0,0,0,0,0,0,0,0,0,0,-262144,63,0,0,0,0,0,0,0,0,0,0,0,-262144,31,0,0,0,0,0,0,0,0,0,0,0,-262144,63,0,0,0,0,3,0,0,0,0,0,0,-262144,63,0,0,0,0,7,0,0,0,0,0,0,-262144,63,0,0,0,0,63,0,0,0,0,0,0,-262144,63,0,0,0,0,511,0,0,0,0,0,0,-524288,31,0,0,0,0,8191,0,0,0,0,0,0,-1048576,63,0,0,0,0,131071,0,0,0,0,0,0,-524288,63,0,0,0,0,262143,0,0,0,0,0,0,-524288,63,0,0,0,0,131071,0,0,0,0,0,0,-1048576,63,0,0,0,0,262143,0,0,0,0,0,0,-1048576,63,0,0,0,0,262143,0,0,0,0,0,0,-1048576,63,0,0,0,0,262143,0,0,0,0,0,0,-1048576,63,0,0,0,0,262143,0,0,0,0,0,0,-2097152,127,0,0,0,0,262143,0,0,0,0,0,0,-2097152,127,0,0,0,0,262143,0,0,0,0,0,0,-1048576,127,0,0,0,0,262143,0,0,0,0,0,0,-1048576,127,0,0,0,0,262143,0,0,0,0,0,0,-2097152,255,0,0,0,0,262143,0,0,0,0,0,0,-2097152,255,0,0,0,0,262142,0,0,0,0,0,0,-2097152,255,0,0,0,0,262142,0,0,0,0,0,0,-2097152,255,0,0,0,0,262142,0,0,0,0,0,0,-2097152,255,0,0,0,0,262140,0,0,0,0,0,0,-2097152,255,0,0,0,0,131068,0,0,0,0,0,0,-4194304,255,0,0,0,0,131068,0,0,0,0,0,0,-4194304,255,0,0,0,0,65528,0,0,0,0,0,0,-8388608,255,0,0,0,0,65528,0,0,0,0,0,0,-8388608,255,0,0,0,0,65528,0,0,0,0,0,0,-8388608,255,0,0,0,0,32760,0,0,0,0,0,0,-8388608,255,0,0,0,0,32760,0,0,0,0,0,0,-16777216,255,0,0,-2147483648,255,16368,0,0,0,0,0,0,-16777216,255,0,0,-536870912,1023,16368,0,0,0,0,0,0,-33554432,255,0,0,-16777216,4095,16352,0,0,0,0,0,0,-33554432,255,0,0,-8388608,262143,16352,0,0,0,0,0,0,-33554432,255,0,0,-1048576,2097151,16352,0,0,0,0,0,0,-67108864,255,0,0,-524288,8388607,16352,0,0,0,0,0,0,-67108864,255,0,0,-262144,16777215,16320,0,0,0,0,0,0,-67108864,255,0,0,-131072,16777215,100679648,0,0,0,0,0,0,-67108864,255,0,0,-16384,16776959,125861824,0,0,0,0,0,0,-134217728,255,0,0,-4096,16773121,62930880,0,0,0,0,0,0,-134217728,127,0,0,2147482624,16252928,32704,0,0,0,0,0,0,-134217728,127,0,0,268435200,14680064,16320,0,0,0,0,0,0,-134217728,127,0,0,134217600,0,32704,0,0,0,0,0,0,-33554432,127,0,1056964608,67108736,0,32704,0,0,0,0,0,0,-33554432,127,0,2130706432,33554368,0,65408,0,0,0,0,0,0,-33554432,127,0,-16777216,8388576,0,32640,0,0,0,0,0,0,-134217728,127,0,-16777216,2097136,0,32640,0,0,0,0,0,0,-134217728,63,0,-16776960,1048573,0,32640,0,0,0,0,0,0,-536870912,63,0,-16776448,1048575,0,32640,0,0,0,0,0,0,-536870912,63,0,-33553664,6291455,66752,32640,0,0,0,0,0,0,-536870912,63,0,2013266688,2097148,229376,32640,0,0,0,0,0,0,-536870912,63,0,256,4194300,229376,32640,0,0,0,0,0,0,-536870912,63,0,0,524280,196608,32512,0,0,8,0,0,0,-1073741824,63,0,0,-200,15,65280,0,0,24,0,0,0,-1073741824,63,0,0,-1867768,127,32512,0,0,56,0,0,0,-1073741824,63,0,0,-1056768,4095,32512,0,0,124,0,0,0,-1073741824,63,0,0,-1050624,8191,32512,0,0,508,0,0,0,-2147483648,31,0,0,-7866368,8191,32512,0,0,1020,0,0,0,-2147483648,31,0,0,-33030656,8095,32512,0,0,2046,0,0,0,-2147483648,63,0,0,-66586624,771,32512,0,0,4094,0,0,0,0,63,0,0,-134184960,1,32256,0,0,8190,0,0,0,0,63,0,0,1610612736,0,32256,0,0,16382,0,0,0,-2147483648,63,0,0,0,0,15872,0,0,32767,0,0,0,-2147483648,31,0,0,0,0,15872,0,-2147483648,65535,0,0,0,-2147483648,31,0,0,0,0,7680,0,0,65535,0,0,0,-2147483648,31,0,0,134217728,0,7680,0,-2147483648,65535,0,0,0,-2147483648,31,0,0,0,0,7680,0,-2147483648,65535,0,0,0,-2147483648,31,0,0,0,0,7680,0,-1073741824,65535,0,0,0,-2147483648,31,0,0,0,0,3072,0,-1073741824,65535,0,0,0,-2147483648,31,0,0,0,0,3072,0,-1073741824,65535,0,0,0,-2147483648,31,0,0,0,0,0,0,-2147483648,65535,0,0,0,-2147483648,31,0,0,0,0,0,0,-1073741824,65535,0,0,0,0,31,0,0,0,0,0,0,-1073741824,65535,0,0,0,0,31,0,0,0,0,0,0,-2147483648,65535,0,0,0,0,30,0,0,0,0,0,0,-1073741824,65535,0,0,0,0,30,0,0,0,0,0,0,-2147483648,65535,0,0,0,0,30,0,0,0,0,0,0,0,65535,0,0,0,0,28,0,0,0,0,0,0,0,65535,0,0,0,0,28,0,0,0,0,0,0,0,65535,0,0,0,0,28,0,0,0,0,0,0,0,65535,0,0,0,0,24,0,0,0,0,0,0,-2147483648,65535,0,0,0,0,0,0,0,0,0,0,0,-536870912,65535);//[$offset] |= intval32bits(1 << ($x & 0x1f)); + $bob = $this->bits[$offset]; + $bob |= 1 << ($x & 0x1f); + $this->bits[$offset] |= ($bob); + //$this->bits[$offset] = intval32bits($this->bits[$offset]); + + //} +//16777216 + } + + public function _unset($x, $y) + {//было unset, php не позволяет использовать unset + $offset = (int)($y * $this->rowSize + ($x / 32)); + $this->bits[$offset] &= ~(1 << ($x & 0x1f)); + } + + /**1 << (249 & 0x1f) + *

        Flips the given bit.

        + * + * @param $x ; The horizontal component (i.e. which column) + * @param $y ; The vertical component (i.e. which row) + */ + public function flip($x, $y) + { + $offset = $y * $this->rowSize + (int)($x / 32); + + $this->bits[$offset] = ($this->bits[$offset] ^ (1 << ($x & 0x1f))); + } + + /** + * Exclusive-or (XOR): Flip the bit in this {@code BitMatrix} if the corresponding + * mask bit is set. + * + * @param $mask ; XOR mask + */ + public function _xor($mask) + {//было xor, php не позволяет использовать xor + if ($this->width != $mask->getWidth() || $this->height != $mask->getHeight() + || $this->rowSize != $mask->getRowSize()) { + throw new \InvalidArgumentException("input matrix dimensions do not match"); + } + $rowArray = new BitArray($this->width / 32 + 1); + for ($y = 0; $y < $this->height; $y++) { + $offset = $y * $this->rowSize; + $row = $mask->getRow($y, $rowArray)->getBitArray(); + for ($x = 0; $x < $this->rowSize; $x++) { + $this->bits[$offset + $x] ^= $row[$x]; + } + } + } + + /** + * Clears all bits (sets to false). + */ + public function clear() + { + $max = count($this->bits); + for ($i = 0; $i < $max; $i++) { + $this->bits[$i] = 0; + } + } + + /** + *

        Sets a square region of the bit matrix to true.

        + * + * @param $left ; The horizontal position to begin at (inclusive) + * @param $top ; The vertical position to begin at (inclusive) + * @param $width ; The width of the region + * @param $height ; The height of the region + */ + public function setRegion($left, $top, $width, $height) + { + if ($top < 0 || $left < 0) { + throw new \InvalidArgumentException("Left and top must be nonnegative"); + } + if ($height < 1 || $width < 1) { + throw new \InvalidArgumentException("Height and width must be at least 1"); + } + $right = $left + $width; + $bottom = $top + $height; + if ($bottom > $this->height || $right > $this->width) { //> this.height || right > this.width + throw new \InvalidArgumentException("The region must fit inside the matrix"); + } + for ($y = $top; $y < $bottom; $y++) { + $offset = $y * $this->rowSize; + for ($x = $left; $x < $right; $x++) { + $this->bits[$offset + (int)($x / 32)] = ($this->bits[$offset + (int)($x / 32)] |= 1 << ($x & 0x1f)); + } + } + } + + /** + * Modifies this {@code BitMatrix} to represent the same but rotated 180 degrees + */ + public function rotate180() + { + $width = $this->getWidth(); + $height = $this->getHeight(); + $topRow = new BitArray($width); + $bottomRow = new BitArray($width); + for ($i = 0; $i < ($height + 1) / 2; $i++) { + $topRow = $this->getRow($i, $topRow); + $bottomRow = $this->getRow($height - 1 - $i, $bottomRow); + $topRow->reverse(); + $bottomRow->reverse(); + $this->setRow($i, $bottomRow); + $this->setRow($height - 1 - $i, $topRow); + } + } + + /** + * @return The width of the matrix + */ + public function getWidth() + { + return $this->width; + } + + /** + * A fast method to retrieve one row of data from the matrix as a BitArray. + * + * @param $y ; The row to retrieve + * @param $row ; An optional caller-allocated BitArray, will be allocated if null or too small + * + * @return The resulting BitArray - this reference should always be used even when passing + * your own row + */ + public function getRow($y, $row) + { + if ($row == null || $row->getSize() < $this->width) { + $row = new BitArray($this->width); + } else { + $row->clear(); + } + $offset = $y * $this->rowSize; + for ($x = 0; $x < $this->rowSize; $x++) { + $row->setBulk($x * 32, $this->bits[$offset + $x]); + } + + return $row; + } + + /** + * @param $y ; row to set + * @param $row ; {@link BitArray} to copy from + */ + public function setRow($y, $row) + { + $this->bits = arraycopy($row->getBitArray(), 0, $this->bits, $y * $this->rowSize, $this->rowSize); + } + + /** + * This is useful in detecting the enclosing rectangle of a 'pure' barcode. + * + * @return {@code left,top,width,height} enclosing rectangle of all 1 bits, or null if it is all white + */ + public function getEnclosingRectangle() + { + $left = $this->width; + $top = $this->height; + $right = -1; + $bottom = -1; + + for ($y = 0; $y < $this->height; $y++) { + for ($x32 = 0; $x32 < $this->rowSize; $x32++) { + $theBits = $this->bits[$y * $this->rowSize + $x32]; + if ($theBits != 0) { + if ($y < $top) { + $top = $y; + } + if ($y > $bottom) { + $bottom = $y; + } + if ($x32 * 32 < $left) { + $bit = 0; + while (($theBits << (31 - $bit)) == 0) { + $bit++; + } + if (($x32 * 32 + $bit) < $left) { + $left = $x32 * 32 + $bit; + } + } + if ($x32 * 32 + 31 > $right) { + $bit = 31; + while ((sdvig3($theBits, $bit)) == 0) {//>>> + $bit--; + } + if (($x32 * 32 + $bit) > $right) { + $right = $x32 * 32 + $bit; + } + } + } + } + } + + $width = $right - $left; + $height = $bottom - $top; + + if ($width < 0 || $height < 0) { + return null; + } + + return [$left, $top, $width, $height]; + } + + /** + * This is useful in detecting a corner of a 'pure' barcode. + * + * @return {@code x,y} coordinate of top-left-most 1 bit, or null if it is all white + */ + public function getTopLeftOnBit() + { + $bitsOffset = 0; + while ($bitsOffset < count($this->bits) && $this->bits[$bitsOffset] == 0) { + $bitsOffset++; + } + if ($bitsOffset == count($this->bits)) { + return null; + } + $y = $bitsOffset / $this->rowSize; + $x = ($bitsOffset % $this->rowSize) * 32; + + $theBits = $this->bits[$bitsOffset]; + $bit = 0; + while (($theBits << (31 - $bit)) == 0) { + $bit++; + } + $x += $bit; + + return [$x, $y]; + } + + public function getBottomRightOnBit() + { + $bitsOffset = count($this->bits) - 1; + while ($bitsOffset >= 0 && $this->bits[$bitsOffset] == 0) { + $bitsOffset--; + } + if ($bitsOffset < 0) { + return null; + } + + $y = $bitsOffset / $this->rowSize; + $x = ($bitsOffset % $this->rowSize) * 32; + + $theBits = $this->bits[$bitsOffset]; + $bit = 31; + while ((sdvig3($theBits, $bit)) == 0) {//>>> + $bit--; + } + $x += $bit; + + return [$x, $y]; + } + + /** + * @return The height of the matrix + */ + public function getHeight() + { + return $this->height; + } + + /** + * @return The row size of the matrix + */ + public function getRowSize() + { + return $this->rowSize; + } + + public function equals($o) + { + if (!($o instanceof BitMatrix)) { + return false; + } + $other = $o; + + return $this->width == $other->width + && $this->height == $other->height + && $this->rowSize == $other->rowSize + && $this->bits === $other->bits; + } + + //@Override + + public function hashCode() + { + $hash = $this->width; + $hash = 31 * $hash + $this->width; + $hash = 31 * $hash + $this->height; + $hash = 31 * $hash + $this->rowSize; + $hash = 31 * $hash + hashCode($this->bits); + + return $hash; + } + + //@Override + + public function toString($setString = '', $unsetString = '', $lineSeparator = '') + { + if (!$setString || !$unsetString) { + return (string)'X ' . ' '; + } + if ($lineSeparator && $lineSeparator !== "\n") { + return $this->toString_($setString, $unsetString, $lineSeparator); + } + + return (string)($setString . $unsetString . "\n"); + } + + public function toString_($setString, $unsetString, $lineSeparator) + { + //$result = new StringBuilder(height * (width + 1)); + $result = ''; + for ($y = 0; $y < $this->height; $y++) { + for ($x = 0; $x < $this->width; $x++) { + $result .= ($this->get($x, $y) ? $setString : $unsetString); + } + $result .= ($lineSeparator); + } + + return (string)$result; + } + + /** + * @deprecated call {@link #toString(String,String)} only, which uses \n line separator always + */ + // @Deprecated + /** + *

        Gets the requested bit, where true means black.

        + * + * @param $x ; The horizontal component (i.e. which column) + * @param $y ; The vertical component (i.e. which row) + * + * @return value of given bit in matrix + */ + public function get($x, $y) + { + + $offset = (int)($y * $this->rowSize + ($x / 32)); + if (!isset($this->bits[$offset])) { + $this->bits[$offset] = 0; + } + + // return (($this->bits[$offset] >> ($x & 0x1f)) & 1) != 0; + return (uRShift($this->bits[$offset], ($x & 0x1f)) & 1) != 0;//было >>> вместо >>, не знаю как эмулировать беззнаковый сдвиг + } + +// @Override + + public function _clone() + { + return new BitMatrix($this->width, $this->height, $this->rowSize, $this->bits); + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Common/BitSource.php b/public/tool/newsid/qrcodedecoder/Zxing/Common/BitSource.php new file mode 100644 index 0000000..d18d164 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Common/BitSource.php @@ -0,0 +1,118 @@ +This provides an easy abstraction to read bits at a time from a sequence of bytes, where the + * number of bits read is not often a multiple of 8.

        + * + *

        This class is thread-safe but not reentrant -- unless the caller modifies the bytes array + * it passed in, in which case all bets are off.

        + * + * @author Sean Owen + */ +final class BitSource +{ + + private $bytes; + private $byteOffset = 0; + private $bitOffset = 0; + + /** + * @param bytes bytes from which this will read bits. Bits will be read from the first byte first. + * Bits are read within a byte from most-significant to least-significant bit. + */ + public function __construct($bytes) + { + $this->bytes = $bytes; + } + + /** + * @return index of next bit in current byte which would be read by the next call to {@link #readBits(int)}. + */ + public function getBitOffset() + { + return $this->bitOffset; + } + + /** + * @return index of next byte in input byte array which would be read by the next call to {@link #readBits(int)}. + */ + public function getByteOffset() + { + return $this->byteOffset; + } + + /** + * @param numBits number of bits to read + * + * @return int representing the bits read. The bits will appear as the least-significant + * bits of the int + * @throws InvalidArgumentException if numBits isn't in [1,32] or more than is available + */ + public function readBits($numBits) + { + if ($numBits < 1 || $numBits > 32 || $numBits > $this->available()) { + throw new \InvalidArgumentException(strval($numBits)); + } + + $result = 0; + + // First, read remainder from current byte + if ($this->bitOffset > 0) { + $bitsLeft = 8 - $this->bitOffset; + $toRead = $numBits < $bitsLeft ? $numBits : $bitsLeft; + $bitsToNotRead = $bitsLeft - $toRead; + $mask = (0xFF >> (8 - $toRead)) << $bitsToNotRead; + $result = ($this->bytes[$this->byteOffset] & $mask) >> $bitsToNotRead; + $numBits -= $toRead; + $this->bitOffset += $toRead; + if ($this->bitOffset == 8) { + $this->bitOffset = 0; + $this->byteOffset++; + } + } + + // Next read whole bytes + if ($numBits > 0) { + while ($numBits >= 8) { + $result = ($result << 8) | ($this->bytes[$this->byteOffset] & 0xFF); + $this->byteOffset++; + $numBits -= 8; + } + + // Finally read a partial byte + if ($numBits > 0) { + $bitsToNotRead = 8 - $numBits; + $mask = (0xFF >> $bitsToNotRead) << $bitsToNotRead; + $result = ($result << $numBits) | (($this->bytes[$this->byteOffset] & $mask) >> $bitsToNotRead); + $this->bitOffset += $numBits; + } + } + + return $result; + } + + /** + * @return number of bits that can be read successfully + */ + public function available() + { + return 8 * (count($this->bytes) - $this->byteOffset) - $this->bitOffset; + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Common/CharacterSetECI.php b/public/tool/newsid/qrcodedecoder/Zxing/Common/CharacterSetECI.php new file mode 100644 index 0000000..086d593 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Common/CharacterSetECI.php @@ -0,0 +1,158 @@ + self::ISO8859_1, + 'ISO-8859-2' => self::ISO8859_2, + 'ISO-8859-3' => self::ISO8859_3, + 'ISO-8859-4' => self::ISO8859_4, + 'ISO-8859-5' => self::ISO8859_5, + 'ISO-8859-6' => self::ISO8859_6, + 'ISO-8859-7' => self::ISO8859_7, + 'ISO-8859-8' => self::ISO8859_8, + 'ISO-8859-9' => self::ISO8859_9, + 'ISO-8859-10' => self::ISO8859_10, + 'ISO-8859-11' => self::ISO8859_11, + 'ISO-8859-12' => self::ISO8859_12, + 'ISO-8859-13' => self::ISO8859_13, + 'ISO-8859-14' => self::ISO8859_14, + 'ISO-8859-15' => self::ISO8859_15, + 'ISO-8859-16' => self::ISO8859_16, + 'SHIFT-JIS' => self::SJIS, + 'WINDOWS-1250' => self::CP1250, + 'WINDOWS-1251' => self::CP1251, + 'WINDOWS-1252' => self::CP1252, + 'WINDOWS-1256' => self::CP1256, + 'UTF-16BE' => self::UNICODE_BIG_UNMARKED, + 'UTF-8' => self::UTF8, + 'ASCII' => self::ASCII, + 'GBK' => self::GB18030, + 'EUC-KR' => self::EUC_KR, + ]; + /**#@-*/ + /** + * Additional possible values for character sets. + * + * @var array + */ + protected static $additionalValues = [ + self::CP437 => 2, + self::ASCII => 170, + ]; + private static $name = null; + + /** + * Gets character set ECI by value. + * + * @param string $name + * + * @return CharacterSetEci|null + */ + public static function getCharacterSetECIByValue($value) + { + if ($value < 0 || $value >= 900) { + throw new \InvalidArgumentException('Value must be between 0 and 900'); + } + if (false !== ($key = array_search($value, self::$additionalValues))) { + $value = $key; + } + array_search($value, self::$nameToEci); + try { + self::setName($value); + + return new self($value); + } catch (\UnexpectedValueException $e) { + return null; + } + } + + private static function setName($value) + { + foreach (self::$nameToEci as $name => $key) { + if ($key == $value) { + self::$name = $name; + + return true; + } + } + if (self::$name == null) { + foreach (self::$additionalValues as $name => $key) { + if ($key == $value) { + self::$name = $name; + + return true; + } + } + } + } + + /** + * Gets character set ECI name. + * + * @return character set ECI name|null + */ + public static function name() + { + return self::$name; + } + + /** + * Gets character set ECI by name. + * + * @param string $name + * + * @return CharacterSetEci|null + */ + public static function getCharacterSetECIByName($name) + { + $name = strtoupper($name); + if (isset(self::$nameToEci[$name])) { + return new self(self::$nameToEci[$name]); + } + + return null; + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Common/DecoderResult.php b/public/tool/newsid/qrcodedecoder/Zxing/Common/DecoderResult.php new file mode 100644 index 0000000..22aee04 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Common/DecoderResult.php @@ -0,0 +1,122 @@ +Encapsulates the result of decoding a matrix of bits. This typically + * applies to 2D barcode formats. For now it contains the raw bytes obtained, + * as well as a String interpretation of those bytes, if applicable.

        + * + * @author Sean Owen + */ +final class DecoderResult +{ + + private $rawBytes; + private $text; + private $byteSegments; + private $ecLevel; + private $errorsCorrected; + private $erasures; + private $other; + private $structuredAppendParity; + private $structuredAppendSequenceNumber; + + + public function __construct( + $rawBytes, + $text, + $byteSegments, + $ecLevel, + $saSequence = -1, + $saParity = -1 + ) { + $this->rawBytes = $rawBytes; + $this->text = $text; + $this->byteSegments = $byteSegments; + $this->ecLevel = $ecLevel; + $this->structuredAppendParity = $saParity; + $this->structuredAppendSequenceNumber = $saSequence; + } + + public function getRawBytes() + { + return $this->rawBytes; + } + + public function getText() + { + return $this->text; + } + + public function getByteSegments() + { + return $this->byteSegments; + } + + public function getECLevel() + { + return $this->ecLevel; + } + + public function getErrorsCorrected() + { + return $this->errorsCorrected; + } + + public function setErrorsCorrected($errorsCorrected) + { + $this->errorsCorrected = $errorsCorrected; + } + + public function getErasures() + { + return $this->erasures; + } + + public function setErasures($erasures) + { + $this->erasures = $erasures; + } + + public function getOther() + { + return $this->other; + } + + public function setOther($other) + { + $this->other = $other; + } + + public function hasStructuredAppend() + { + return $this->structuredAppendParity >= 0 && $this->structuredAppendSequenceNumber >= 0; + } + + public function getStructuredAppendParity() + { + return $this->structuredAppendParity; + } + + public function getStructuredAppendSequenceNumber() + { + return $this->structuredAppendSequenceNumber; + } + +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Common/DefaultGridSampler.php b/public/tool/newsid/qrcodedecoder/Zxing/Common/DefaultGridSampler.php new file mode 100644 index 0000000..d2326d3 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Common/DefaultGridSampler.php @@ -0,0 +1,93 @@ +sampleGrid_($image, $dimensionX, $dimensionY, $transform); + } + +//@Override + public function sampleGrid_( + $image, + $dimensionX, + $dimensionY, + $transform + ) { + if ($dimensionX <= 0 || $dimensionY <= 0) { + throw NotFoundException::getNotFoundInstance(); + } + $bits = new BitMatrix($dimensionX, $dimensionY); + $points = fill_array(0, 2 * $dimensionX, 0.0); + for ($y = 0; $y < $dimensionY; $y++) { + $max = count($points); + $iValue = (float)$y + 0.5; + for ($x = 0; $x < $max; $x += 2) { + $points[$x] = (float)($x / 2) + 0.5; + $points[$x + 1] = $iValue; + } + $transform->transformPoints($points); +// Quick check to see if points transformed to something inside the image; +// sufficient to check the endpoints + $this->checkAndNudgePoints($image, $points); + try { + for ($x = 0; $x < $max; $x += 2) { + if ($image->get((int)$points[$x], (int)$points[$x + 1])) { +// Black(-ish) pixel + $bits->set($x / 2, $y); + } + } + } catch (\Exception $aioobe) {//ArrayIndexOutOfBoundsException +// This feels wrong, but, sometimes if the finder patterns are misidentified, the resulting +// transform gets "twisted" such that it maps a straight line of points to a set of points +// whose endpoints are in bounds, but others are not. There is probably some mathematical +// way to detect this about the transformation that I don't know yet. +// This results in an ugly runtime exception despite our clever checks above -- can't have +// that. We could check each point's coordinates but that feels duplicative. We settle for +// catching and wrapping ArrayIndexOutOfBoundsException. + throw NotFoundException::getNotFoundInstance(); + } + } + + return $bits; + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Common/Detector/MathUtils.php b/public/tool/newsid/qrcodedecoder/Zxing/Common/Detector/MathUtils.php new file mode 100644 index 0000000..e88cfc8 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Common/Detector/MathUtils.php @@ -0,0 +1,49 @@ +A somewhat generic detector that looks for a barcode-like rectangular region within an image. + * It looks within a mostly white region of an image for a region of black and white, but mostly + * black. It returns the four corners of the region, as best it can determine.

        + * + * @author Sean Owen + * @port Ashot Khanamiryan + */ +class MonochromeRectangleDetector +{ + private static $MAX_MODULES = 32; + private $image; + + public function __construct(BinaryBitmap $image) + { + $this->image = $image; + + } + + /** + *

        Detects a rectangular region of black and white -- mostly black -- with a region of mostly + * white, in an image.

        + * + * @return {@link ResultPoint}[] describing the corners of the rectangular region. The first and + * last points are opposed on the diagonal, as are the second and third. The first point will be + * the topmost point and the last, the bottommost. The second point will be leftmost and the + * third, the rightmost + * @throws NotFoundException if no Data Matrix Code can be found + */ + public function detect() + { + + $height = $this->image->getHeight(); + $width = $this->image->getWidth(); + $halfHeight = $height / 2; + $halfWidth = $width / 2; + + $deltaY = max(1, $height / (self::$MAX_MODULES * 8)); + $deltaX = max(1, $width / (self::$MAX_MODULES * 8)); + + + $top = 0; + $bottom = $height; + $left = 0; + $right = $width; + $pointA = $this->findCornerFromCenter($halfWidth, 0, $left, $right, + $halfHeight, -$deltaY, $top, $bottom, $halfWidth / 2); + $top = (int)$pointA->getY() - 1; + $pointB = $this->findCornerFromCenter($halfWidth, -$deltaX, $left, $right, + $halfHeight, 0, $top, $bottom, $halfHeight / 2); + $left = (int)$pointB->getX() - 1; + $pointC = $this->findCornerFromCenter($halfWidth, $deltaX, $left, $right, + $halfHeight, 0, $top, $bottom, $halfHeight / 2); + $right = (int)$pointC->getX() + 1; + $pointD = $this->findCornerFromCenter($halfWidth, 0, $left, $right, + $halfHeight, $deltaY, $top, $bottom, $halfWidth / 2); + $bottom = (int)$pointD->getY() + 1; + + // Go try to find po$A again with better information -- might have been off at first. + $pointA = $this->findCornerFromCenter($halfWidth, 0, $left, $right, + $halfHeight, -$deltaY, $top, $bottom, $halfWidth / 4); + + return new ResultPoint($pointA, $pointB, $pointC, $pointD); + + } + + + /** + * Attempts to locate a corner of the barcode by scanning up, down, left or right from a center + * point which should be within the barcode. + * + * @param float $centerX center's x component (horizontal) + * @param float $deltaX same as deltaY but change in x per step instead + * @param float $left minimum value of x + * @param float $right maximum value of x + * @param float $centerY center's y component (vertical) + * @param float $deltaY change in y per step. If scanning up this is negative; down, positive; + * left or right, 0 + * @param float $top minimum value of y to search through (meaningless when di == 0) + * @param float $bottom maximum value of y + * @param float $maxWhiteRun maximum run of white pixels that can still be considered to be within + * the barcode + * + * @return ResultPoint $a {@link com.google.zxing.ResultPoint} encapsulating the corner that was found + * @throws NotFoundException if such a point cannot be found + */ + private function findCornerFromCenter($centerX, + $deltaX, + $left, + $right, + $centerY, + $deltaY, + $top, + $bottom, + $maxWhiteRun) + { + $lastRange = null; + for ($y = $centerY, $x = $centerX; + $y < $bottom && $y >= $top && $x < $right && $x >= $left; + $y += $deltaY, $x += $deltaX) { + $range = 0; + if ($deltaX == 0) { + // horizontal slices, up and down + $range = $this->blackWhiteRange($y, $maxWhiteRun, $left, $right, true); + } else { + // vertical slices, left and right + $range = $this->blackWhiteRange($x, $maxWhiteRun, $top, $bottom, false); + } + if ($range == null) { + if ($lastRange == null) { + throw NotFoundException::getNotFoundInstance(); + } + // lastRange was found + if ($deltaX == 0) { + $lastY = $y - $deltaY; + if ($lastRange[0] < $centerX) { + if ($lastRange[1] > $centerX) { + // straddle, choose one or the other based on direction + return new ResultPoint($deltaY > 0 ? $lastRange[0] : $lastRange[1], $lastY); + } + + return new ResultPoint($lastRange[0], $lastY); + } else { + return new ResultPoint($lastRange[1], $lastY); + } + } else { + $lastX = $x - $deltaX; + if ($lastRange[0] < $centerY) { + if ($lastRange[1] > $centerY) { + return new ResultPoint($lastX, $deltaX < 0 ? $lastRange[0] : $lastRange[1]); + } + + return new ResultPoint($lastX, $lastRange[0]); + } else { + return new ResultPoint($lastX, $lastRange[1]); + } + } + } + $lastRange = $range; + } + throw NotFoundException::getNotFoundInstance(); + } + + + /** + * Computes the start and end of a region of pixels, either horizontally or vertically, that could + * be part of a Data Matrix barcode. + * + * @param fixedDimension if scanning horizontally, this is the row (the fixed vertical location) + * where we are scanning. If scanning vertically it's the column, the fixed horizontal location + * @param maxWhiteRun largest run of white pixels that can still be considered part of the + * barcode region + * @param minDim minimum pixel location, horizontally or vertically, to consider + * @param maxDim maximum pixel location, horizontally or vertically, to consider + * @param horizontal if true, we're scanning left-right, instead of up-down + * + * @return int[] with start and end of found range, or null if no such range is found + * (e.g. only white was found) + */ + + private function blackWhiteRange($fixedDimension, $maxWhiteRun, $minDim, $maxDim, $horizontal) + { + $center = ($minDim + $maxDim) / 2; + + // Scan left/up first + $start = $center; + while ($start >= $minDim) { + if ($horizontal ? $this->image->get($start, $fixedDimension) : $this->image->get($fixedDimension, $start)) { + $start--; + } else { + $whiteRunStart = $start; + do { + $start--; + } while ($start >= $minDim && !($horizontal ? $this->image->get($start, $fixedDimension) : + $this->image->get($fixedDimension, $start))); + $whiteRunSize = $whiteRunStart - $start; + if ($start < $minDim || $whiteRunSize > $maxWhiteRun) { + $start = $whiteRunStart; + break; + } + } + } + $start++; + + // Then try right/down + $end = $center; + while ($end < $maxDim) { + if ($horizontal ? $this->image->get($end, $fixedDimension) : $this->image->get($fixedDimension, $end)) { + $end++; + } else { + $whiteRunStart = $end; + do { + $end++; + } while ($end < $maxDim && !($horizontal ? $this->image->get($end, $fixedDimension) : + $this->image->get($fixedDimension, $end))); + $whiteRunSize = $end - $whiteRunStart; + if ($end >= $maxDim || $whiteRunSize > $maxWhiteRun) { + $end = $whiteRunStart; + break; + } + } + } + $end--; + + return $end > $start ? [$start, $end] : null; + } +} \ No newline at end of file diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Common/DetectorResult.php b/public/tool/newsid/qrcodedecoder/Zxing/Common/DetectorResult.php new file mode 100644 index 0000000..d2e9bc8 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Common/DetectorResult.php @@ -0,0 +1,47 @@ +Encapsulates the result of detecting a barcode in an image. This includes the raw + * matrix of black/white pixels corresponding to the barcode, and possibly points of interest + * in the image, like the location of finder patterns or corners of the barcode in the image.

        + * + * @author Sean Owen + */ +class DetectorResult +{ + private $bits; + private $points; + + public function __construct($bits, $points) + { + $this->bits = $bits; + $this->points = $points; + } + + public final function getBits() + { + return $this->bits; + } + + public final function getPoints() + { + return $this->points; + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Common/GlobalHistogramBinarizer.php b/public/tool/newsid/qrcodedecoder/Zxing/Common/GlobalHistogramBinarizer.php new file mode 100644 index 0000000..267c3f0 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Common/GlobalHistogramBinarizer.php @@ -0,0 +1,207 @@ +luminances = self::$EMPTY; + $this->buckets = fill_array(0, self::$LUMINANCE_BUCKETS, 0); + $this->source = $source; + } + + // Applies simple sharpening to the row data to improve performance of the 1D Readers. + public function getBlackRow($y, $row = null) + { + $this->source = $this->getLuminanceSource(); + $width = $this->source->getWidth(); + if ($row == null || $row->getSize() < $width) { + $row = new BitArray($width); + } else { + $row->clear(); + } + + $this->initArrays($width); + $localLuminances = $this->source->getRow($y, $this->luminances); + $localBuckets = $this->buckets; + for ($x = 0; $x < $width; $x++) { + $pixel = $localLuminances[$x] & 0xff; + $localBuckets[$pixel >> self::$LUMINANCE_SHIFT]++; + } + $blackPoint = self::estimateBlackPoint($localBuckets); + + $left = $localLuminances[0] & 0xff; + $center = $localLuminances[1] & 0xff; + for ($x = 1; $x < $width - 1; $x++) { + $right = $localLuminances[$x + 1] & 0xff; + // A simple -1 4 -1 box filter with a weight of 2. + $luminance = (($center * 4) - $left - $right) / 2; + if ($luminance < $blackPoint) { + $row->set($x); + } + $left = $center; + $center = $right; + } + + return $row; + } + + // Does not sharpen the data, as this call is intended to only be used by 2D Readers. + private function initArrays($luminanceSize) + { + if (count($this->luminances) < $luminanceSize) { + $this->luminances = []; + } + for ($x = 0; $x < self::$LUMINANCE_BUCKETS; $x++) { + $this->buckets[$x] = 0; + } + } + + private static function estimateBlackPoint($buckets) + { + // Find the tallest peak in the histogram. + $numBuckets = count($buckets); + $maxBucketCount = 0; + $firstPeak = 0; + $firstPeakSize = 0; + for ($x = 0; $x < $numBuckets; $x++) { + if ($buckets[$x] > $firstPeakSize) { + $firstPeak = $x; + $firstPeakSize = $buckets[$x]; + } + if ($buckets[$x] > $maxBucketCount) { + $maxBucketCount = $buckets[$x]; + } + } + + // Find the second-tallest peak which is somewhat far from the tallest peak. + $secondPeak = 0; + $secondPeakScore = 0; + for ($x = 0; $x < $numBuckets; $x++) { + $distanceToBiggest = $x - $firstPeak; + // Encourage more distant second peaks by multiplying by square of distance. + $score = $buckets[$x] * $distanceToBiggest * $distanceToBiggest; + if ($score > $secondPeakScore) { + $secondPeak = $x; + $secondPeakScore = $score; + } + } + + // Make sure firstPeak corresponds to the black peak. + if ($firstPeak > $secondPeak) { + $temp = $firstPeak; + $firstPeak = $secondPeak; + $secondPeak = $temp; + } + + // If there is too little contrast in the image to pick a meaningful black point, throw rather + // than waste time trying to decode the image, and risk false positives. + if ($secondPeak - $firstPeak <= $numBuckets / 16) { + throw NotFoundException::getNotFoundInstance(); + } + + // Find a valley between them that is low and closer to the white peak. + $bestValley = $secondPeak - 1; + $bestValleyScore = -1; + for ($x = $secondPeak - 1; $x > $firstPeak; $x--) { + $fromFirst = $x - $firstPeak; + $score = $fromFirst * $fromFirst * ($secondPeak - $x) * ($maxBucketCount - $buckets[$x]); + if ($score > $bestValleyScore) { + $bestValley = $x; + $bestValleyScore = $score; + } + } + + return ($bestValley << self::$LUMINANCE_SHIFT); + } + + public function getBlackMatrix() + { + $source = $this->getLuminanceSource(); + $width = $source->getWidth(); + $height = $source->getHeight(); + $matrix = new BitMatrix($width, $height); + + // Quickly calculates the histogram by sampling four rows from the image. This proved to be + // more robust on the blackbox tests than sampling a diagonal as we used to do. + $this->initArrays($width); + $localBuckets = $this->buckets; + for ($y = 1; $y < 5; $y++) { + $row = (int)($height * $y / 5); + $localLuminances = $source->getRow($row, $this->luminances); + $right = (int)(($width * 4) / 5); + for ($x = (int)($width / 5); $x < $right; $x++) { + $pixel = ($localLuminances[(int)($x)] & 0xff); + $localBuckets[($pixel >> self::$LUMINANCE_SHIFT)]++; + } + } + $blackPoint = self::estimateBlackPoint($localBuckets); + + // We delay reading the entire image luminance until the black point estimation succeeds. + // Although we end up reading four rows twice, it is consistent with our motto of + // "fail quickly" which is necessary for continuous scanning. + $localLuminances = $source->getMatrix(); + for ($y = 0; $y < $height; $y++) { + $offset = $y * $width; + for ($x = 0; $x < $width; $x++) { + $pixel = (int)($localLuminances[$offset + $x] & 0xff); + if ($pixel < $blackPoint) { + $matrix->set($x, $y); + } + } + } + + return $matrix; + } + + public function createBinarizer($source) + { + return new GlobalHistogramBinarizer($source); + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Common/GridSampler.php b/public/tool/newsid/qrcodedecoder/Zxing/Common/GridSampler.php new file mode 100644 index 0000000..affea31 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Common/GridSampler.php @@ -0,0 +1,188 @@ +Checks a set of points that have been transformed to sample points on an image against + * the image's dimensions to see if the point are even within the image.

        + * + *

        This method will actually "nudge" the endpoints back onto the image if they are found to be + * barely (less than 1 pixel) off the image. This accounts for imperfect detection of finder + * patterns in an image where the QR Code runs all the way to the image border.

        + * + *

        For efficiency, the method will check points from either end of the line until one is found + * to be within the image. Because the set of points are assumed to be linear, this is valid.

        + * + * @param image image into which the points should map + * @param points actual points in x1,y1,...,xn,yn form + * + * @throws NotFoundException if an endpoint is lies outside the image boundaries + */ + protected static function checkAndNudgePoints( + $image, + $points + ) { + $width = $image->getWidth(); + $height = $image->getHeight(); +// Check and nudge points from start until we see some that are OK: + $nudged = true; + for ($offset = 0; $offset < count($points) && $nudged; $offset += 2) { + $x = (int)$points[$offset]; + $y = (int)$points[$offset + 1]; + if ($x < -1 || $x > $width || $y < -1 || $y > $height) { + throw NotFoundException::getNotFoundInstance(); + } + $nudged = false; + if ($x == -1) { + $points[$offset] = 0.0; + $nudged = true; + } else if ($x == $width) { + $points[$offset] = $width - 1; + $nudged = true; + } + if ($y == -1) { + $points[$offset + 1] = 0.0; + $nudged = true; + } else if ($y == $height) { + $points[$offset + 1] = $height - 1; + $nudged = true; + } + } +// Check and nudge points from end: + $nudged = true; + for ($offset = count($points) - 2; $offset >= 0 && $nudged; $offset -= 2) { + $x = (int)$points[$offset]; + $y = (int)$points[$offset + 1]; + if ($x < -1 || $x > $width || $y < -1 || $y > $height) { + throw NotFoundException::getNotFoundInstance(); + } + $nudged = false; + if ($x == -1) { + $points[$offset] = 0.0; + $nudged = true; + } else if ($x == $width) { + $points[$offset] = $width - 1; + $nudged = true; + } + if ($y == -1) { + $points[$offset + 1] = 0.0; + $nudged = true; + } else if ($y == $height) { + $points[$offset + 1] = $height - 1; + $nudged = true; + } + } + } + + /** + * Samples an image for a rectangular matrix of bits of the given dimension. The sampling + * transformation is determined by the coordinates of 4 points, in the original and transformed + * image space. + * + * @param image image to sample + * @param dimensionX width of {@link BitMatrix} to sample from image + * @param dimensionY height of {@link BitMatrix} to sample from image + * @param p1ToX point 1 preimage X + * @param p1ToY point 1 preimage Y + * @param p2ToX point 2 preimage X + * @param p2ToY point 2 preimage Y + * @param p3ToX point 3 preimage X + * @param p3ToY point 3 preimage Y + * @param p4ToX point 4 preimage X + * @param p4ToY point 4 preimage Y + * @param p1FromX point 1 image X + * @param p1FromY point 1 image Y + * @param p2FromX point 2 image X + * @param p2FromY point 2 image Y + * @param p3FromX point 3 image X + * @param p3FromY point 3 image Y + * @param p4FromX point 4 image X + * @param p4FromY point 4 image Y + * + * @return {@link BitMatrix} representing a grid of points sampled from the image within a region + * defined by the "from" parameters + * @throws NotFoundException if image can't be sampled, for example, if the transformation defined + * by the given points is invalid or results in sampling outside the image boundaries + */ + public abstract function sampleGrid( + $image, + $dimensionX, + $dimensionY, + $p1ToX, $p1ToY, + $p2ToX, $p2ToY, + $p3ToX, $p3ToY, + $p4ToX, $p4ToY, + $p1FromX, $p1FromY, + $p2FromX, $p2FromY, + $p3FromX, $p3FromY, + $p4FromX, $p4FromY + ); + + public abstract function sampleGrid_( + $image, + $dimensionX, + $dimensionY, + $transform + ); + +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Common/HybridBinarizer.php b/public/tool/newsid/qrcodedecoder/Zxing/Common/HybridBinarizer.php new file mode 100644 index 0000000..c71cc1b --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Common/HybridBinarizer.php @@ -0,0 +1,264 @@ +matrix !== null) { + return $this->matrix; + } + $source = $this->getLuminanceSource(); + $width = $source->getWidth(); + $height = $source->getHeight(); + if ($width >= self::$MINIMUM_DIMENSION && $height >= self::$MINIMUM_DIMENSION) { + $luminances = $source->getMatrix(); + $subWidth = $width >> self::$BLOCK_SIZE_POWER; + if (($width & self::$BLOCK_SIZE_MASK) != 0) { + $subWidth++; + } + $subHeight = $height >> self::$BLOCK_SIZE_POWER; + if (($height & self::$BLOCK_SIZE_MASK) != 0) { + $subHeight++; + } + $blackPoints = self::calculateBlackPoints($luminances, $subWidth, $subHeight, $width, $height); + + $newMatrix = new BitMatrix($width, $height); + self::calculateThresholdForBlock($luminances, $subWidth, $subHeight, $width, $height, $blackPoints, $newMatrix); + $this->matrix = $newMatrix; + } else { + // If the image is too small, fall back to the global histogram approach. + $this->matrix = parent::getBlackMatrix(); + } + + return $this->matrix; + } + + /** + * Calculates a single black point for each block of pixels and saves it away. + * See the following thread for a discussion of this algorithm: + * http://groups.google.com/group/zxing/browse_thread/thread/d06efa2c35a7ddc0 + */ + private static function calculateBlackPoints( + $luminances, + $subWidth, + $subHeight, + $width, + $height + ) { + $blackPoints = fill_array(0, $subHeight, 0); + foreach ($blackPoints as $key => $point) { + $blackPoints[$key] = fill_array(0, $subWidth, 0); + } + for ($y = 0; $y < $subHeight; $y++) { + $yoffset = ($y << self::$BLOCK_SIZE_POWER); + $maxYOffset = $height - self::$BLOCK_SIZE; + if ($yoffset > $maxYOffset) { + $yoffset = $maxYOffset; + } + for ($x = 0; $x < $subWidth; $x++) { + $xoffset = ($x << self::$BLOCK_SIZE_POWER); + $maxXOffset = $width - self::$BLOCK_SIZE; + if ($xoffset > $maxXOffset) { + $xoffset = $maxXOffset; + } + $sum = 0; + $min = 0xFF; + $max = 0; + for ($yy = 0, $offset = $yoffset * $width + $xoffset; $yy < self::$BLOCK_SIZE; $yy++, $offset += $width) { + for ($xx = 0; $xx < self::$BLOCK_SIZE; $xx++) { + $pixel = ((int)($luminances[(int)($offset + $xx)]) & 0xFF); + $sum += $pixel; + // still looking for good contrast + if ($pixel < $min) { + $min = $pixel; + } + if ($pixel > $max) { + $max = $pixel; + } + } + // short-circuit min/max tests once dynamic range is met + if ($max - $min > self::$MIN_DYNAMIC_RANGE) { + // finish the rest of the rows quickly + for ($yy++, $offset += $width; $yy < self::$BLOCK_SIZE; $yy++, $offset += $width) { + for ($xx = 0; $xx < self::$BLOCK_SIZE; $xx++) { + $sum += ($luminances[$offset + $xx] & 0xFF); + } + } + } + } + + // The default estimate is the average of the values in the block. + $average = ($sum >> (self::$BLOCK_SIZE_POWER * 2)); + if ($max - $min <= self::$MIN_DYNAMIC_RANGE) { + // If variation within the block is low, assume this is a block with only light or only + // dark pixels. In that case we do not want to use the average, as it would divide this + // low contrast area into black and white pixels, essentially creating data out of noise. + // + // The default assumption is that the block is light/background. Since no estimate for + // the level of dark pixels exists locally, use half the min for the block. + $average = (int)($min / 2); + + if ($y > 0 && $x > 0) { + // Correct the "white background" assumption for blocks that have neighbors by comparing + // the pixels in this block to the previously calculated black points. This is based on + // the fact that dark barcode symbology is always surrounded by some amount of light + // background for which reasonable black point estimates were made. The bp estimated at + // the boundaries is used for the interior. + + // The (min < bp) is arbitrary but works better than other heuristics that were tried. + $averageNeighborBlackPoint = + (int)(($blackPoints[$y - 1][$x] + (2 * $blackPoints[$y][$x - 1]) + $blackPoints[$y - 1][$x - 1]) / 4); + if ($min < $averageNeighborBlackPoint) { + $average = $averageNeighborBlackPoint; + } + } + } + $blackPoints[$y][$x] = (int)($average); + } + } + + return $blackPoints; + } + + /** + * For each block in the image, calculate the average black point using a 5x5 grid + * of the blocks around it. Also handles the corner cases (fractional blocks are computed based + * on the last pixels in the row/column which are also used in the previous block). + */ + private static function calculateThresholdForBlock( + $luminances, + $subWidth, + $subHeight, + $width, + $height, + $blackPoints, + $matrix + ) { + for ($y = 0; $y < $subHeight; $y++) { + $yoffset = ($y << self::$BLOCK_SIZE_POWER); + $maxYOffset = $height - self::$BLOCK_SIZE; + if ($yoffset > $maxYOffset) { + $yoffset = $maxYOffset; + } + for ($x = 0; $x < $subWidth; $x++) { + $xoffset = ($x << self::$BLOCK_SIZE_POWER); + $maxXOffset = $width - self::$BLOCK_SIZE; + if ($xoffset > $maxXOffset) { + $xoffset = $maxXOffset; + } + $left = self::cap($x, 2, $subWidth - 3); + $top = self::cap($y, 2, $subHeight - 3); + $sum = 0; + for ($z = -2; $z <= 2; $z++) { + $blackRow = $blackPoints[$top + $z]; + $sum += $blackRow[$left - 2] + $blackRow[$left - 1] + $blackRow[$left] + $blackRow[$left + 1] + $blackRow[$left + 2]; + } + $average = (int)($sum / 25); + + self::thresholdBlock($luminances, $xoffset, $yoffset, $average, $width, $matrix); + } + } + } + + private static function cap($value, $min, $max) + { + if ($value < $min) { + return $min; + } elseif ($value > $max) { + return $max; + } else { + return $value; + } + } + + /** + * Applies a single threshold to a block of pixels. + */ + private static function thresholdBlock( + $luminances, + $xoffset, + $yoffset, + $threshold, + $stride, + $matrix + ) { + + for ($y = 0, $offset = $yoffset * $stride + $xoffset; $y < self::$BLOCK_SIZE; $y++, $offset += $stride) { + for ($x = 0; $x < self::$BLOCK_SIZE; $x++) { + // Comparison needs to be <= so that black == 0 pixels are black even if the threshold is 0. + if (($luminances[$offset + $x] & 0xFF) <= $threshold) { + $matrix->set($xoffset + $x, $yoffset + $y); + } + } + } + } + + public function createBinarizer($source) + { + return new HybridBinarizer($source); + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Common/PerspectiveTransform.php b/public/tool/newsid/qrcodedecoder/Zxing/Common/PerspectiveTransform.php new file mode 100644 index 0000000..a3a0b97 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Common/PerspectiveTransform.php @@ -0,0 +1,175 @@ +This class implements a perspective transform in two dimensions. Given four source and four + * destination points, it will compute the transformation implied between them. The code is based + * directly upon section 3.4.2 of George Wolberg's "Digital Image Warping"; see pages 54-56.

        + * + * @author Sean Owen + */ +final class PerspectiveTransform +{ + private $a11; + private $a12; + private $a13; + private $a21; + private $a22; + private $a23; + private $a31; + private $a32; + private $a33; + + private function __construct( + $a11, $a21, $a31, + $a12, $a22, $a32, + $a13, $a23, $a33 + ) { + $this->a11 = $a11; + $this->a12 = $a12; + $this->a13 = $a13; + $this->a21 = $a21; + $this->a22 = $a22; + $this->a23 = $a23; + $this->a31 = $a31; + $this->a32 = $a32; + $this->a33 = $a33; + } + + public static function quadrilateralToQuadrilateral( + $x0, $y0, + $x1, $y1, + $x2, $y2, + $x3, $y3, + $x0p, $y0p, + $x1p, $y1p, + $x2p, $y2p, + $x3p, $y3p + ) { + + $qToS = self::quadrilateralToSquare($x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3); + $sToQ = self::squareToQuadrilateral($x0p, $y0p, $x1p, $y1p, $x2p, $y2p, $x3p, $y3p); + + return $sToQ->times($qToS); + } + + public static function quadrilateralToSquare( + $x0, $y0, + $x1, $y1, + $x2, $y2, + $x3, $y3 + ) { +// Here, the adjoint serves as the inverse: + return self::squareToQuadrilateral($x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3)->buildAdjoint(); + } + + public function buildAdjoint() + { +// Adjoint is the transpose of the cofactor matrix: + return new PerspectiveTransform($this->a22 * $this->a33 - $this->a23 * $this->a32, + $this->a23 * $this->a31 - $this->a21 * $this->a33, + $this->a21 * $this->a32 - $this->a22 * $this->a31, + $this->a13 * $this->a32 - $this->a12 * $this->a33, + $this->a11 * $this->a33 - $this->a13 * $this->a31, + $this->a12 * $this->a31 - $this->a11 * $this->a32, + $this->a12 * $this->a23 - $this->a13 * $this->a22, + $this->a13 * $this->a21 - $this->a11 * $this->a23, + $this->a11 * $this->a22 - $this->a12 * $this->a21); + } + + public static function squareToQuadrilateral( + $x0, $y0, + $x1, $y1, + $x2, $y2, + $x3, $y3 + ) { + $dx3 = $x0 - $x1 + $x2 - $x3; + $dy3 = $y0 - $y1 + $y2 - $y3; + if ($dx3 == 0.0 && $dy3 == 0.0) { +// Affine + return new PerspectiveTransform($x1 - $x0, $x2 - $x1, $x0, + $y1 - $y0, $y2 - $y1, $y0, + 0.0, 0.0, 1.0); + } else { + $dx1 = $x1 - $x2; + $dx2 = $x3 - $x2; + $dy1 = $y1 - $y2; + $dy2 = $y3 - $y2; + $denominator = $dx1 * $dy2 - $dx2 * $dy1; + $a13 = ($dx3 * $dy2 - $dx2 * $dy3) / $denominator; + $a23 = ($dx1 * $dy3 - $dx3 * $dy1) / $denominator; + + return new PerspectiveTransform($x1 - $x0 + $a13 * $x1, $x3 - $x0 + $a23 * $x3, $x0, + $y1 - $y0 + $a13 * $y1, $y3 - $y0 + $a23 * $y3, $y0, + $a13, $a23, 1.0); + } + } + + public function times($other) + { + return new PerspectiveTransform($this->a11 * $other->a11 + $this->a21 * $other->a12 + $this->a31 * $other->a13, + $this->a11 * $other->a21 + $this->a21 * $other->a22 + $this->a31 * $other->a23, + $this->a11 * $other->a31 + $this->a21 * $other->a32 + $this->a31 * $other->a33, + $this->a12 * $other->a11 + $this->a22 * $other->a12 + $this->a32 * $other->a13, + $this->a12 * $other->a21 + $this->a22 * $other->a22 + $this->a32 * $other->a23, + $this->a12 * $other->a31 + $this->a22 * $other->a32 + $this->a32 * $other->a33, + $this->a13 * $other->a11 + $this->a23 * $other->a12 + $this->a33 * $other->a13, + $this->a13 * $other->a21 + $this->a23 * $other->a22 + $this->a33 * $other->a23, + $this->a13 * $other->a31 + $this->a23 * $other->a32 + $this->a33 * $other->a33); + + } + + public function transformPoints(&$points, &$yValues = 0) + { + if ($yValues) { + $this->transformPoints_($points, $yValues); + + return; + } + $max = count($points); + $a11 = $this->a11; + $a12 = $this->a12; + $a13 = $this->a13; + $a21 = $this->a21; + $a22 = $this->a22; + $a23 = $this->a23; + $a31 = $this->a31; + $a32 = $this->a32; + $a33 = $this->a33; + for ($i = 0; $i < $max; $i += 2) { + $x = $points[$i]; + $y = $points[$i + 1]; + $denominator = $a13 * $x + $a23 * $y + $a33; + $points[$i] = ($a11 * $x + $a21 * $y + $a31) / $denominator; + $points[$i + 1] = ($a12 * $x + $a22 * $y + $a32) / $denominator; + } + } + + public function transformPoints_(&$xValues, &$yValues) + { + $n = count($xValues); + for ($i = 0; $i < $n; $i++) { + $x = $xValues[$i]; + $y = $yValues[$i]; + $denominator = $this->a13 * $x + $this->a23 * $y + $this->a33; + $xValues[$i] = ($this->a11 * $x + $this->a21 * $y + $this->a31) / $denominator; + $yValues[$i] = ($this->a12 * $x + $this->a22 * $y + $this->a32) / $denominator; + } + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Common/Reedsolomon/GenericGF.php b/public/tool/newsid/qrcodedecoder/Zxing/Common/Reedsolomon/GenericGF.php new file mode 100644 index 0000000..49d7b61 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Common/Reedsolomon/GenericGF.php @@ -0,0 +1,198 @@ +This class contains utility methods for performing mathematical operations over + * the Galois Fields. Operations use a given primitive polynomial in calculations.

        + * + *

        Throughout this package, elements of the GF are represented as an {@code int} + * for convenience and speed (but at the cost of memory). + *

        + * + * @author Sean Owen + * @author David Olivier + */ +final class GenericGF +{ + + public static $AZTEC_DATA_12; + public static $AZTEC_DATA_10; + public static $AZTEC_DATA_6; + public static $AZTEC_PARAM; + public static $QR_CODE_FIELD_256; + public static $DATA_MATRIX_FIELD_256; + public static $AZTEC_DATA_8; + public static $MAXICODE_FIELD_64; + + private $expTable; + private $logTable; + private $zero; + private $one; + private $size; + private $primitive; + private $generatorBase; + + /** + * Create a representation of GF(size) using the given primitive polynomial. + * + * @param primitive irreducible polynomial whose coefficients are represented by + * the bits of an int, where the least-significant bit represents the constant + * coefficient + * @param size the size of the field + * @param b the factor b in the generator polynomial can be 0- or 1-based + * (g(x) = (x+a^b)(x+a^(b+1))...(x+a^(b+2t-1))). + * In most cases it should be 1, but for QR code it is 0. + */ + public function __construct($primitive, $size, $b) + { + $this->primitive = $primitive; + $this->size = $size; + $this->generatorBase = $b; + + $this->expTable = []; + $this->logTable = []; + $x = 1; + for ($i = 0; $i < $size; $i++) { + $this->expTable[$i] = $x; + $x *= 2; // we're assuming the generator alpha is 2 + if ($x >= $size) { + $x ^= $primitive; + $x &= $size - 1; + } + } + for ($i = 0; $i < $size - 1; $i++) { + $this->logTable[$this->expTable[$i]] = $i; + } + // logTable[0] == 0 but this should never be used + $this->zero = new GenericGFPoly($this, [0]); + $this->one = new GenericGFPoly($this, [1]); + } + + public static function Init() + { + self::$AZTEC_DATA_12 = new GenericGF(0x1069, 4096, 1); // x^12 + x^6 + x^5 + x^3 + 1 + self::$AZTEC_DATA_10 = new GenericGF(0x409, 1024, 1); // x^10 + x^3 + 1 + self::$AZTEC_DATA_6 = new GenericGF(0x43, 64, 1); // x^6 + x + 1 + self::$AZTEC_PARAM = new GenericGF(0x13, 16, 1); // x^4 + x + 1 + self::$QR_CODE_FIELD_256 = new GenericGF(0x011D, 256, 0); // x^8 + x^4 + x^3 + x^2 + 1 + self::$DATA_MATRIX_FIELD_256 = new GenericGF(0x012D, 256, 1); // x^8 + x^5 + x^3 + x^2 + 1 + self::$AZTEC_DATA_8 = self::$DATA_MATRIX_FIELD_256; + self::$MAXICODE_FIELD_64 = self::$AZTEC_DATA_6; + } + + /** + * Implements both addition and subtraction -- they are the same in GF(size). + * + * @return sum/difference of a and b + */ + public static function addOrSubtract($a, $b) + { + return $a ^ $b; + } + + public function getZero() + { + return $this->zero; + } + + public function getOne() + { + return $this->one; + } + + /** + * @return the monomial representing coefficient * x^degree + */ + public function buildMonomial($degree, $coefficient) + { + if ($degree < 0) { + throw new \InvalidArgumentException(); + } + if ($coefficient == 0) { + return $this->zero; + } + $coefficients = fill_array(0, $degree + 1, 0);//new int[degree + 1]; + $coefficients[0] = $coefficient; + + return new GenericGFPoly($this, $coefficients); + } + + /** + * @return 2 to the power of a in GF(size) + */ + public function exp($a) + { + return $this->expTable[$a]; + } + + /** + * @return base 2 log of a in GF(size) + */ + public function log($a) + { + if ($a == 0) { + throw new \InvalidArgumentException(); + } + + return $this->logTable[$a]; + } + + /** + * @return multiplicative inverse of a + */ + public function inverse($a) + { + if ($a == 0) { + throw new \Exception(); + } + + return $this->expTable[$this->size - $this->logTable[$a] - 1]; + } + + /** + * @return int product of a and b in GF(size) + */ + public function multiply($a, $b) + { + if ($a == 0 || $b == 0) { + return 0; + } + + return $this->expTable[($this->logTable[$a] + $this->logTable[$b]) % ($this->size - 1)]; + } + + public function getSize() + { + return $this->size; + } + + public function getGeneratorBase() + { + return $this->generatorBase; + } + + // @Override + public function toString() + { + return "GF(0x" . dechex((int)($this->primitive)) . ',' . $this->size . ')'; + } + +} + +GenericGF::Init(); diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Common/Reedsolomon/GenericGFPoly.php b/public/tool/newsid/qrcodedecoder/Zxing/Common/Reedsolomon/GenericGFPoly.php new file mode 100644 index 0000000..9770085 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Common/Reedsolomon/GenericGFPoly.php @@ -0,0 +1,289 @@ +Represents a polynomial whose coefficients are elements of a GF. + * Instances of this class are immutable.

        + * + *

        Much credit is due to William Rucklidge since portions of this code are an indirect + * port of his C++ Reed-Solomon implementation.

        + * + * @author Sean Owen + */ +final class GenericGFPoly +{ + + private $field; + private $coefficients; + + /** + * @param field the {@link GenericGF} instance representing the field to use + * to perform computations + * @param coefficients array coefficients as ints representing elements of GF(size), arranged + * from most significant (highest-power term) coefficient to least significant + * + * @throws InvalidArgumentException if argument is null or empty, + * or if leading coefficient is 0 and this is not a + * constant polynomial (that is, it is not the monomial "0") + */ + public function __construct($field, $coefficients) + { + if (count($coefficients) == 0) { + throw new \InvalidArgumentException(); + } + $this->field = $field; + $coefficientsLength = count($coefficients); + if ($coefficientsLength > 1 && $coefficients[0] == 0) { + // Leading term must be non-zero for anything except the constant polynomial "0" + $firstNonZero = 1; + while ($firstNonZero < $coefficientsLength && $coefficients[$firstNonZero] == 0) { + $firstNonZero++; + } + if ($firstNonZero == $coefficientsLength) { + $this->coefficients = [0]; + } else { + $this->coefficients = fill_array(0, $coefficientsLength - $firstNonZero, 0); + $this->coefficients = arraycopy($coefficients, + $firstNonZero, + $this->coefficients, + 0, + count($this->coefficients)); + } + } else { + $this->coefficients = $coefficients; + } + } + + public function getCoefficients() + { + return $this->coefficients; + } + + /** + * @return evaluation of this polynomial at a given point + */ + public function evaluateAt($a) + { + if ($a == 0) { + // Just return the x^0 coefficient + return $this->getCoefficient(0); + } + $size = count($this->coefficients); + if ($a == 1) { + // Just the sum of the coefficients + $result = 0; + foreach ($this->coefficients as $coefficient) { + $result = GenericGF::addOrSubtract($result, $coefficient); + } + + return $result; + } + $result = $this->coefficients[0]; + for ($i = 1; $i < $size; $i++) { + $result = GenericGF::addOrSubtract($this->field->multiply($a, $result), $this->coefficients[$i]); + } + + return $result; + } + + /** + * @return coefficient of x^degree term in this polynomial + */ + public function getCoefficient($degree) + { + return $this->coefficients[count($this->coefficients) - 1 - $degree]; + } + + public function multiply($other) + { + if (is_int($other)) { + return $this->multiply_($other); + } + if ($this->field !== $other->field) { + throw new \InvalidArgumentException("GenericGFPolys do not have same GenericGF field"); + } + if ($this->isZero() || $other->isZero()) { + return $this->field->getZero(); + } + $aCoefficients = $this->coefficients; + $aLength = count($aCoefficients); + $bCoefficients = $other->coefficients; + $bLength = count($bCoefficients); + $product = fill_array(0, $aLength + $bLength - 1, 0); + for ($i = 0; $i < $aLength; $i++) { + $aCoeff = $aCoefficients[$i]; + for ($j = 0; $j < $bLength; $j++) { + $product[$i + $j] = GenericGF::addOrSubtract($product[$i + $j], + $this->field->multiply($aCoeff, $bCoefficients[$j])); + } + } + + return new GenericGFPoly($this->field, $product); + } + + public function multiply_($scalar) + { + if ($scalar == 0) { + return $this->field->getZero(); + } + if ($scalar == 1) { + return $this; + } + $size = count($this->coefficients); + $product = fill_array(0, $size, 0); + for ($i = 0; $i < $size; $i++) { + $product[$i] = $this->field->multiply($this->coefficients[$i], $scalar); + } + + return new GenericGFPoly($this->field, $product); + } + + /** + * @return true iff this polynomial is the monomial "0" + */ + public function isZero() + { + return $this->coefficients[0] == 0; + } + + public function multiplyByMonomial($degree, $coefficient) + { + if ($degree < 0) { + throw new \InvalidArgumentException(); + } + if ($coefficient == 0) { + return $this->field->getZero(); + } + $size = count($this->coefficients); + $product = fill_array(0, $size + $degree, 0); + for ($i = 0; $i < $size; $i++) { + $product[$i] = $this->field->multiply($this->coefficients[$i], $coefficient); + } + + return new GenericGFPoly($this->field, $product); + } + + public function divide($other) + { + if ($this->field !== $other->field) { + throw new \InvalidArgumentException("GenericGFPolys do not have same GenericGF field"); + } + if ($other->isZero()) { + throw new \InvalidArgumentException("Divide by 0"); + } + + $quotient = $this->field->getZero(); + $remainder = $this; + + $denominatorLeadingTerm = $other->getCoefficient($other->getDegree()); + $inverseDenominatorLeadingTerm = $this->field->inverse($denominatorLeadingTerm); + + while ($remainder->getDegree() >= $other->getDegree() && !$remainder->isZero()) { + $degreeDifference = $remainder->getDegree() - $other->getDegree(); + $scale = $this->field->multiply($remainder->getCoefficient($remainder->getDegree()), $inverseDenominatorLeadingTerm); + $term = $other->multiplyByMonomial($degreeDifference, $scale); + $iterationQuotient = $this->field->buildMonomial($degreeDifference, $scale); + $quotient = $quotient->addOrSubtract($iterationQuotient); + $remainder = $remainder->addOrSubtract($term); + } + + return [$quotient, $remainder]; + } + + /** + * @return degree of this polynomial + */ + public function getDegree() + { + return count($this->coefficients) - 1; + } + + public function addOrSubtract($other) + { + if ($this->field !== $other->field) { + throw new \InvalidArgumentException("GenericGFPolys do not have same GenericGF field"); + } + if ($this->isZero()) { + return $other; + } + if ($other->isZero()) { + return $this; + } + + $smallerCoefficients = $this->coefficients; + $largerCoefficients = $other->coefficients; + if (count($smallerCoefficients) > count($largerCoefficients)) { + $temp = $smallerCoefficients; + $smallerCoefficients = $largerCoefficients; + $largerCoefficients = $temp; + } + $sumDiff = fill_array(0, count($largerCoefficients), 0); + $lengthDiff = count($largerCoefficients) - count($smallerCoefficients); + // Copy high-order terms only found in higher-degree polynomial's coefficients + $sumDiff = arraycopy($largerCoefficients, 0, $sumDiff, 0, $lengthDiff); + + $countLargerCoefficients = count($largerCoefficients); + for ($i = $lengthDiff; $i < $countLargerCoefficients; $i++) { + $sumDiff[$i] = GenericGF::addOrSubtract($smallerCoefficients[$i - $lengthDiff], $largerCoefficients[$i]); + } + + return new GenericGFPoly($this->field, $sumDiff); + } + + //@Override + + public function toString() + { + $result = ''; + for ($degree = $this->getDegree(); $degree >= 0; $degree--) { + $coefficient = $this->getCoefficient($degree); + if ($coefficient != 0) { + if ($coefficient < 0) { + $result .= " - "; + $coefficient = -$coefficient; + } else { + if (strlen($result) > 0) { + $result .= " + "; + } + } + if ($degree == 0 || $coefficient != 1) { + $alphaPower = $this->field->log($coefficient); + if ($alphaPower == 0) { + $result .= '1'; + } else if ($alphaPower == 1) { + $result .= 'a'; + } else { + $result .= "a^"; + $result .= ($alphaPower); + } + } + if ($degree != 0) { + if ($degree == 1) { + $result .= 'x'; + } else { + $result .= "x^"; + $result .= $degree; + } + } + } + } + + return $result; + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Common/Reedsolomon/ReedSolomonDecoder.php b/public/tool/newsid/qrcodedecoder/Zxing/Common/Reedsolomon/ReedSolomonDecoder.php new file mode 100644 index 0000000..ff501a2 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Common/Reedsolomon/ReedSolomonDecoder.php @@ -0,0 +1,201 @@ +Implements Reed-Solomon decoding, as the name implies.

        + * + *

        The algorithm will not be explained here, but the following references were helpful + * in creating this implementation:

        + * + * + * + *

        Much credit is due to William Rucklidge since portions of this code are an indirect + * port of his C++ Reed-Solomon implementation.

        + * + * @author Sean Owen + * @author William Rucklidge + * @author sanfordsquires + */ +final class ReedSolomonDecoder +{ + + private $field; + + public function __construct($field) + { + $this->field = $field; + } + + /** + *

        Decodes given set of received codewords, which include both data and error-correction + * codewords. Really, this means it uses Reed-Solomon to detect and correct errors, in-place, + * in the input.

        + * + * @param received data and error-correction codewords + * @param twoS number of error-correction codewords available + * + * @throws ReedSolomonException if decoding fails for any reason + */ + public function decode(&$received, $twoS) + { + $poly = new GenericGFPoly($this->field, $received); + $syndromeCoefficients = fill_array(0, $twoS, 0); + $noError = true; + for ($i = 0; $i < $twoS; $i++) { + $eval = $poly->evaluateAt($this->field->exp($i + $this->field->getGeneratorBase())); + $syndromeCoefficients[count($syndromeCoefficients) - 1 - $i] = $eval; + if ($eval != 0) { + $noError = false; + } + } + if ($noError) { + return; + } + $syndrome = new GenericGFPoly($this->field, $syndromeCoefficients); + $sigmaOmega = + $this->runEuclideanAlgorithm($this->field->buildMonomial($twoS, 1), $syndrome, $twoS); + $sigma = $sigmaOmega[0]; + $omega = $sigmaOmega[1]; + $errorLocations = $this->findErrorLocations($sigma); + $errorMagnitudes = $this->findErrorMagnitudes($omega, $errorLocations); + $errorLocationsCount = count($errorLocations); + for ($i = 0; $i < $errorLocationsCount; $i++) { + $position = count($received) - 1 - $this->field->log($errorLocations[$i]); + if ($position < 0) { + throw new ReedSolomonException("Bad error location"); + } + $received[$position] = GenericGF::addOrSubtract($received[$position], $errorMagnitudes[$i]); + } + + } + + private function runEuclideanAlgorithm($a, $b, $R) + { + // Assume a's degree is >= b's + if ($a->getDegree() < $b->getDegree()) { + $temp = $a; + $a = $b; + $b = $temp; + } + + $rLast = $a; + $r = $b; + $tLast = $this->field->getZero(); + $t = $this->field->getOne(); + + // Run Euclidean algorithm until r's degree is less than R/2 + while ($r->getDegree() >= $R / 2) { + $rLastLast = $rLast; + $tLastLast = $tLast; + $rLast = $r; + $tLast = $t; + + // Divide rLastLast by rLast, with quotient in q and remainder in r + if ($rLast->isZero()) { + // Oops, Euclidean algorithm already terminated? + throw new ReedSolomonException("r_{i-1} was zero"); + } + $r = $rLastLast; + $q = $this->field->getZero(); + $denominatorLeadingTerm = $rLast->getCoefficient($rLast->getDegree()); + $dltInverse = $this->field->inverse($denominatorLeadingTerm); + while ($r->getDegree() >= $rLast->getDegree() && !$r->isZero()) { + $degreeDiff = $r->getDegree() - $rLast->getDegree(); + $scale = $this->field->multiply($r->getCoefficient($r->getDegree()), $dltInverse); + $q = $q->addOrSubtract($this->field->buildMonomial($degreeDiff, $scale)); + $r = $r->addOrSubtract($rLast->multiplyByMonomial($degreeDiff, $scale)); + } + + $t = $q->multiply($tLast)->addOrSubtract($tLastLast); + + if ($r->getDegree() >= $rLast->getDegree()) { + throw new ReedSolomonException("Division algorithm failed to reduce polynomial?"); + } + } + + $sigmaTildeAtZero = $t->getCoefficient(0); + if ($sigmaTildeAtZero == 0) { + throw new ReedSolomonException("sigmaTilde(0) was zero"); + } + + $inverse = $this->field->inverse($sigmaTildeAtZero); + $sigma = $t->multiply($inverse); + $omega = $r->multiply($inverse); + + return [$sigma, $omega]; + } + + private function findErrorLocations($errorLocator) + { + // This is a direct application of Chien's search + $numErrors = $errorLocator->getDegree(); + if ($numErrors == 1) { // shortcut + return [$errorLocator->getCoefficient(1)]; + } + $result = fill_array(0, $numErrors, 0); + $e = 0; + for ($i = 1; $i < $this->field->getSize() && $e < $numErrors; $i++) { + if ($errorLocator->evaluateAt($i) == 0) { + $result[$e] = $this->field->inverse($i); + $e++; + } + } + if ($e != $numErrors) { + throw new ReedSolomonException("Error locator degree does not match number of roots"); + } + + return $result; + } + + private function findErrorMagnitudes($errorEvaluator, $errorLocations) + { + // This is directly applying Forney's Formula + $s = count($errorLocations); + $result = fill_array(0, $s, 0); + for ($i = 0; $i < $s; $i++) { + $xiInverse = $this->field->inverse($errorLocations[$i]); + $denominator = 1; + for ($j = 0; $j < $s; $j++) { + if ($i != $j) { + //denominator = field.multiply(denominator, + // GenericGF.addOrSubtract(1, field.multiply(errorLocations[j], xiInverse))); + // Above should work but fails on some Apple and Linux JDKs due to a Hotspot bug. + // Below is a funny-looking workaround from Steven Parkes + $term = $this->field->multiply($errorLocations[$j], $xiInverse); + $termPlus1 = ($term & 0x1) == 0 ? $term | 1 : $term & ~1; + $denominator = $this->field->multiply($denominator, $termPlus1); + } + } + $result[$i] = $this->field->multiply($errorEvaluator->evaluateAt($xiInverse), + $this->field->inverse($denominator)); + if ($this->field->getGeneratorBase() != 0) { + $result[$i] = $this->field->multiply($result[$i], $xiInverse); + } + } + + return $result; + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Common/Reedsolomon/ReedSolomonException.php b/public/tool/newsid/qrcodedecoder/Zxing/Common/Reedsolomon/ReedSolomonException.php new file mode 100644 index 0000000..cd7babd --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Common/Reedsolomon/ReedSolomonException.php @@ -0,0 +1,28 @@ +Thrown when an exception occurs during Reed-Solomon decoding, such as when + * there are too many errors to correct.

        + * + * @author Sean Owen + */ +final class ReedSolomonException extends \Exception +{ +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Common/customFunctions.php b/public/tool/newsid/qrcodedecoder/Zxing/Common/customFunctions.php new file mode 100644 index 0000000..c336f57 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Common/customFunctions.php @@ -0,0 +1,101 @@ +>= 1; + $num++; + } + + return $num; + } +} + +if (!function_exists('uRShift')) { + function uRShift($a, $b) + { + static $mask = (8 * PHP_INT_SIZE - 1); + if ($b === 0) { + return $a; + } + + return ($a >> $b) & ~(1 << $mask >> ($b - 1)); + } +} + +/* +function sdvig3($num,$count=1){//>>> 32 bit + $s = decbin($num); + + $sarray = str_split($s,1); + $sarray = array_slice($sarray,-32);//32bit + + for($i=0;$i<=1;$i++) { + array_pop($sarray); + array_unshift($sarray, '0'); + } + return bindec(implode($sarray)); +} +*/ + +if (!function_exists('sdvig3')) { + function sdvig3($a, $b) + { + if ($a >= 0) { + return bindec(decbin($a >> $b)); //simply right shift for positive number + } + + $bin = decbin($a >> $b); + + $bin = substr($bin, $b); // zero fill on the left side + + return bindec($bin); + } +} + +if (!function_exists('floatToIntBits')) { + function floatToIntBits($float_val) + { + $int = unpack('i', pack('f', $float_val)); + + return $int[1]; + } +} + + +if (!function_exists('fill_array')) { + function fill_array($index, $count, $value) + { + if ($count <= 0) { + return [0]; + } + + return array_fill($index, $count, $value); + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/FormatException.php b/public/tool/newsid/qrcodedecoder/Zxing/FormatException.php new file mode 100644 index 0000000..64de650 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/FormatException.php @@ -0,0 +1,49 @@ +GDLuminanceSource($gdImage, $dataWidth, $dataHeight); + + return; + } + parent::__construct($width, $height); + if ($left + $width > $dataWidth || $top + $height > $dataHeight) { + throw new \InvalidArgumentException("Crop rectangle does not fit within image data."); + } + $this->luminances = $gdImage; + $this->dataWidth = $dataWidth; + $this->dataHeight = $dataHeight; + $this->left = $left; + $this->top = $top; + } + + public function GDLuminanceSource($gdImage, $width, $height) + { + parent::__construct($width, $height); + + $this->dataWidth = $width; + $this->dataHeight = $height; + $this->left = 0; + $this->top = 0; + $this->gdImage = $gdImage; + + +// In order to measure pure decoding speed, we convert the entire image to a greyscale array +// up front, which is the same as the Y channel of the YUVLuminanceSource in the real app. + $this->luminances = []; + //$this->luminances = $this->grayScaleToBitmap($this->grayscale()); + + $array = []; + $rgb = []; + + for ($j = 0; $j < $height; $j++) { + for ($i = 0; $i < $width; $i++) { + $argb = imagecolorat($this->gdImage, $i, $j); + $pixel = imagecolorsforindex($this->gdImage, $argb); + $r = $pixel['red']; + $g = $pixel['green']; + $b = $pixel['blue']; + if ($r == $g && $g == $b) { +// Image is already greyscale, so pick any channel. + + $this->luminances[] = $r;//(($r + 128) % 256) - 128; + } else { +// Calculate luminance cheaply, favoring green. + $this->luminances[] = ($r + 2 * $g + $b) / 4;//(((($r + 2 * $g + $b) / 4) + 128) % 256) - 128; + } + } + } + + /* + for ($y = 0; $y < $height; $y++) { + $offset = $y * $width; + for ($x = 0; $x < $width; $x++) { + $pixel = $pixels[$offset + $x]; + $r = ($pixel >> 16) & 0xff; + $g = ($pixel >> 8) & 0xff; + $b = $pixel & 0xff; + if ($r == $g && $g == $b) { +// Image is already greyscale, so pick any channel. + + $this->luminances[(int)($offset + $x)] = (($r+128) % 256) - 128; + } else { +// Calculate luminance cheaply, favoring green. + $this->luminances[(int)($offset + $x)] = (((($r + 2 * $g + $b) / 4)+128)%256) - 128; + } + + + + } + */ + //} + // $this->luminances = $this->grayScaleToBitmap($this->luminances); + } + +//@Override + public function getRow($y, $row = null) + { + if ($y < 0 || $y >= $this->getHeight()) { + throw new \InvalidArgumentException('Requested row is outside the image: ' . $y); + } + $width = $this->getWidth(); + if ($row == null || count($row) < $width) { + $row = []; + } + $offset = ($y + $this->top) * $this->dataWidth + $this->left; + $row = arraycopy($this->luminances, $offset, $row, 0, $width); + + return $row; + } + +//@Override + public function getMatrix() + { + $width = $this->getWidth(); + $height = $this->getHeight(); + +// If the caller asks for the entire underlying image, save the copy and give them the +// original data. The docs specifically warn that result.length must be ignored. + if ($width == $this->dataWidth && $height == $this->dataHeight) { + return $this->luminances; + } + + $area = $width * $height; + $matrix = []; + $inputOffset = $this->top * $this->dataWidth + $this->left; + +// If the width matches the full width of the underlying data, perform a single copy. + if ($width == $this->dataWidth) { + $matrix = arraycopy($this->luminances, $inputOffset, $matrix, 0, $area); + + return $matrix; + } + +// Otherwise copy one cropped row at a time. + $rgb = $this->luminances; + for ($y = 0; $y < $height; $y++) { + $outputOffset = $y * $width; + $matrix = arraycopy($rgb, $inputOffset, $matrix, $outputOffset, $width); + $inputOffset += $this->dataWidth; + } + + return $matrix; + } + +//@Override + public function isCropSupported() + { + return true; + } + +//@Override + public function crop($left, $top, $width, $height) + { + return new GDLuminanceSource($this->luminances, + $this->dataWidth, + $this->dataHeight, + $this->left + $left, + $this->top + $top, + $width, + $height); + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/IMagickLuminanceSource.php b/public/tool/newsid/qrcodedecoder/Zxing/IMagickLuminanceSource.php new file mode 100644 index 0000000..aac6d54 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/IMagickLuminanceSource.php @@ -0,0 +1,150 @@ +_IMagickLuminanceSource($image, $dataWidth, $dataHeight); + + return; + } + parent::__construct($width, $height); + if ($left + $width > $dataWidth || $top + $height > $dataHeight) { + throw new \InvalidArgumentException("Crop rectangle does not fit within image data."); + } + $this->luminances = $image; + $this->dataWidth = $dataWidth; + $this->dataHeight = $dataHeight; + $this->left = $left; + $this->top = $top; + } + + public function _IMagickLuminanceSource(\Imagick $image, $width, $height) + { + parent::__construct($width, $height); + + $this->dataWidth = $width; + $this->dataHeight = $height; + $this->left = 0; + $this->top = 0; + $this->image = $image; + + +// In order to measure pure decoding speed, we convert the entire image to a greyscale array +// up front, which is the same as the Y channel of the YUVLuminanceSource in the real app. + $this->luminances = []; + + $image->setImageColorspace(\Imagick::COLORSPACE_GRAY); + // $image->newPseudoImage(0, 0, "magick:rose"); + $pixels = $image->exportImagePixels(1, 1, $width, $height, "RGB", \Imagick::PIXEL_CHAR); + + $array = []; + $rgb = []; + + $countPixels = count($pixels); + for ($i = 0; $i < $countPixels; $i += 3) { + $r = $pixels[$i] & 0xff; + $g = $pixels[$i + 1] & 0xff; + $b = $pixels[$i + 2] & 0xff; + if ($r == $g && $g == $b) { +// Image is already greyscale, so pick any channel. + + $this->luminances[] = $r;//(($r + 128) % 256) - 128; + } else { +// Calculate luminance cheaply, favoring green. + $this->luminances[] = ($r + 2 * $g + $b) / 4;//(((($r + 2 * $g + $b) / 4) + 128) % 256) - 128; + } + } + } + +//@Override + public function getRow($y, $row = null) + { + if ($y < 0 || $y >= $this->getHeight()) { + throw new \InvalidArgumentException('Requested row is outside the image: ' . $y); + } + $width = $this->getWidth(); + if ($row == null || count($row) < $width) { + $row = []; + } + $offset = ($y + $this->top) * $this->dataWidth + $this->left; + $row = arraycopy($this->luminances, $offset, $row, 0, $width); + + return $row; + } + +//@Override + public function getMatrix() + { + $width = $this->getWidth(); + $height = $this->getHeight(); + +// If the caller asks for the entire underlying image, save the copy and give them the +// original data. The docs specifically warn that result.length must be ignored. + if ($width == $this->dataWidth && $height == $this->dataHeight) { + return $this->luminances; + } + + $area = $width * $height; + $matrix = []; + $inputOffset = $this->top * $this->dataWidth + $this->left; + +// If the width matches the full width of the underlying data, perform a single copy. + if ($width == $this->dataWidth) { + $matrix = arraycopy($this->luminances, $inputOffset, $matrix, 0, $area); + + return $matrix; + } + +// Otherwise copy one cropped row at a time. + $rgb = $this->luminances; + for ($y = 0; $y < $height; $y++) { + $outputOffset = $y * $width; + $matrix = arraycopy($rgb, $inputOffset, $matrix, $outputOffset, $width); + $inputOffset += $this->dataWidth; + } + + return $matrix; + } + +//@Override + public function isCropSupported() + { + return true; + } + +//@Override + public function crop($left, $top, $width, $height) + { + return $this->luminances->cropImage($width, $height, $left, $top); + + return new GDLuminanceSource($this->luminances, + $this->dataWidth, + $this->dataHeight, + $this->left + $left, + $this->top + $top, + $width, + $height); + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/LuminanceSource.php b/public/tool/newsid/qrcodedecoder/Zxing/LuminanceSource.php new file mode 100644 index 0000000..ab971cf --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/LuminanceSource.php @@ -0,0 +1,171 @@ +width = $width; + $this->height = $height; + } + + /** + * Fetches luminance data for the underlying bitmap. Values should be fetched using: + * {@code int luminance = array[y * width + x] & 0xff} + * + * @return A row-major 2D array of luminance values. Do not use result.length as it may be + * larger than width * height bytes on some platforms. Do not modify the contents + * of the result. + */ + public abstract function getMatrix(); + + /** + * @return The width of the bitmap. + */ + public final function getWidth() + { + return $this->width; + } + + /** + * @return The height of the bitmap. + */ + public final function getHeight() + { + return $this->height; + } + + /** + * @return bool Whether this subclass supports cropping. + */ + public function isCropSupported() + { + return false; + } + + /** + * Returns a new object with cropped image data. Implementations may keep a reference to the + * original data rather than a copy. Only callable if isCropSupported() is true. + * + * @param left The left coordinate, which must be in [0,getWidth()) + * @param top The top coordinate, which must be in [0,getHeight()) + * @param width The width of the rectangle to crop. + * @param height The height of the rectangle to crop. + * + * @return A cropped version of this object. + */ + public function crop($left, $top, $width, $height) + { + throw new \Exception("This luminance source does not support cropping."); + } + + /** + * @return Whether this subclass supports counter-clockwise rotation. + */ + public function isRotateSupported() + { + return false; + } + + /** + * @return a wrapper of this {@code LuminanceSource} which inverts the luminances it returns -- black becomes + * white and vice versa, and each value becomes (255-value). + */ + public function invert() + { + return new InvertedLuminanceSource($this); + } + + /** + * Returns a new object with rotated image data by 90 degrees counterclockwise. + * Only callable if {@link #isRotateSupported()} is true. + * + * @return A rotated version of this object. + */ + public function rotateCounterClockwise() + { + throw new \Exception("This luminance source does not support rotation by 90 degrees."); + } + + /** + * Returns a new object with rotated image data by 45 degrees counterclockwise. + * Only callable if {@link #isRotateSupported()} is true. + * + * @return A rotated version of this object. + */ + public function rotateCounterClockwise45() + { + throw new \Exception("This luminance source does not support rotation by 45 degrees."); + } + + public final function toString() + { + $row = []; + $result = ''; + for ($y = 0; $y < $this->height; $y++) { + $row = $this->getRow($y, $row); + for ($x = 0; $x < $this->width; $x++) { + $luminance = $row[$x] & 0xFF; + $c = ''; + if ($luminance < 0x40) { + $c = '#'; + } else if ($luminance < 0x80) { + $c = '+'; + } else if ($luminance < 0xC0) { + $c = '.'; + } else { + $c = ' '; + } + $result .= ($c); + } + $result .= ('\n'); + } + + return $result; + } + + /** + * Fetches one row of luminance data from the underlying platform's bitmap. Values range from + * 0 (black) to 255 (white). Because Java does not have an unsigned byte type, callers will have + * to bitwise and with 0xff for each value. It is preferable for implementations of this method + * to only fetch this row rather than the whole image, since no 2D Readers may be installed and + * getMatrix() may never be called. + * + * @param $y ; The row to fetch, which must be in [0,getHeight()) + * @param $row ; An optional preallocated array. If null or too small, it will be ignored. + * Always use the returned object, and ignore the .length of the array. + * + * @return array + * An array containing the luminance data. + */ + public abstract function getRow($y, $row); +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/NotFoundException.php b/public/tool/newsid/qrcodedecoder/Zxing/NotFoundException.php new file mode 100644 index 0000000..0b3c423 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/NotFoundException.php @@ -0,0 +1,38 @@ + $dataWidth || $top + $height > $dataHeight) { + throw new \InvalidArgumentException("Crop rectangle does not fit within image data."); + } + + $this->yuvData = $yuvData; + $this->dataWidth = $dataWidth; + $this->dataHeight = $dataHeight; + $this->left = $left; + $this->top = $top; + if ($reverseHorizontal) { + $this->reverseHorizontal($width, $height); + } + } + + //@Override + public function getRow($y, $row = null) + { + if ($y < 0 || $y >= getHeight()) { + throw new \InvalidArgumentException("Requested row is outside the image: " + y); + } + $width = $this->getWidth(); + if ($row == null || count($row) < $width) { + $row = [];//new byte[width]; + } + $offset = ($y + $this->top) * $this->dataWidth + $this->left; + $row = arraycopy($this->yuvData, $offset, $row, 0, $width); + + return $row; + } + + //@Override + public function getMatrix() + { + $width = $this->getWidth(); + $height = $this->getHeight(); + + // If the caller asks for the entire underlying image, save the copy and give them the + // original data. The docs specifically warn that result.length must be ignored. + if ($width == $this->dataWidth && $height == $this->dataHeight) { + return $this->yuvData; + } + + $area = $width * $height; + $matrix = [];//new byte[area]; + $inputOffset = $this->top * $this->dataWidth + $this->left; + + // If the width matches the full width of the underlying data, perform a single copy. + if ($width == $this->dataWidth) { + $matrix = arraycopy($this->yuvData, $inputOffset, $matrix, 0, $area); + + return $matrix; + } + + // Otherwise copy one cropped row at a time. + $yuv = $this->yuvData; + for ($y = 0; $y < $height; $y++) { + $outputOffset = $y * $width; + $matrix = arraycopy($this->yuvData, $inputOffset, $matrix, $outputOffset, $width); + $inputOffset += $this->dataWidth; + } + + return $matrix; + } + + // @Override + public function isCropSupported() + { + return true; + } + + // @Override + public function crop($left, $top, $width, $height) + { + return new PlanarYUVLuminanceSource($this->yuvData, + $this->dataWidth, + $this->dataHeight, + $this->left + $left, + $this->top + $top, + $width, + $height, + false); + } + + public function renderThumbnail() + { + $width = (int)($this->getWidth() / self::$THUMBNAIL_SCALE_FACTOR); + $height = (int)($this->getHeight() / self::$THUMBNAIL_SCALE_FACTOR); + $pixels = [];//new int[width * height]; + $yuv = $this->yuvData; + $inputOffset = $this->top * $this->dataWidth + $this->left; + + for ($y = 0; $y < $height; $y++) { + $outputOffset = $y * $width; + for ($x = 0; $x < $width; $x++) { + $grey = ($yuv[$inputOffset + $x * self::$THUMBNAIL_SCALE_FACTOR] & 0xff); + $pixels[$outputOffset + $x] = (0xFF000000 | ($grey * 0x00010101)); + } + $inputOffset += $this->dataWidth * self::$THUMBNAIL_SCALE_FACTOR; + } + + return $pixels; + } + + /** + * @return width of image from {@link #renderThumbnail()} + */ + /* + public int getThumbnailWidth() { + return getWidth() / THUMBNAIL_SCALE_FACTOR; + }*/ + + /** + * @return height of image from {@link #renderThumbnail()} + */ + /* + public int getThumbnailHeight() { + return getHeight() / THUMBNAIL_SCALE_FACTOR; + } + + private void reverseHorizontal(int width, int height) { + byte[] yuvData = this.yuvData; + for (int y = 0, rowStart = top * dataWidth + left; y < height; y++, rowStart += dataWidth) { + int middle = rowStart + width / 2; + for (int x1 = rowStart, x2 = rowStart + width - 1; x1 < middle; x1++, x2--) { + byte temp = yuvData[x1]; + yuvData[x1] = yuvData[x2]; + yuvData[x2] = temp; + } + } + } +*/ +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/QrReader.php b/public/tool/newsid/qrcodedecoder/Zxing/QrReader.php new file mode 100644 index 0000000..f976156 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/QrReader.php @@ -0,0 +1,105 @@ +readImage($imgSource); + } else { + $image = file_get_contents($imgSource); + $im = imagecreatefromstring($image); + } + break; + + case QrReader::SOURCE_TYPE_BLOB: + if ($useImagickIfAvailable && extension_loaded('imagick')) { + $im = new \Imagick(); + $im->readImageBlob($imgSource); + } else { + $im = imagecreatefromstring($imgSource); + } + break; + + case QrReader::SOURCE_TYPE_RESOURCE: + $im = $imgSource; + if ($useImagickIfAvailable && extension_loaded('imagick')) { + $useImagickIfAvailable = true; + } else { + $useImagickIfAvailable = false; + } + break; + } + if ($useImagickIfAvailable && extension_loaded('imagick')) { + if (!$im instanceof \Imagick) { + throw new \InvalidArgumentException('Invalid image source.'); + } + $width = $im->getImageWidth(); + $height = $im->getImageHeight(); + $source = new IMagickLuminanceSource($im, $width, $height); + } else { + if (!is_resource($im) && !is_object($im)) { + throw new \InvalidArgumentException('Invalid image source.'); + } + $width = imagesx($im); + $height = imagesy($im); + $source = new GDLuminanceSource($im, $width, $height); + } + $histo = new HybridBinarizer($source); + $this->bitmap = new BinaryBitmap($histo); + $this->reader = new QRCodeReader(); + } + + public function decode() + { + try { + $this->result = $this->reader->decode($this->bitmap); + } catch (NotFoundException $er) { + $this->result = false; + } catch (FormatException $er) { + $this->result = false; + } catch (ChecksumException $er) { + $this->result = false; + } + } + + public function text() + { + $this->decode(); + + if ($this->result !== false && method_exists($this->result, 'toString')) { + return $this->result->toString(); + } + + return $this->result; + } + + public function getResult() + { + return $this->result; + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/BitMatrixParser.php b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/BitMatrixParser.php new file mode 100644 index 0000000..8060720 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/BitMatrixParser.php @@ -0,0 +1,263 @@ += 21 and 1 mod 4 + */ + public function __construct($bitMatrix) + { + $dimension = $bitMatrix->getHeight(); + if ($dimension < 21 || ($dimension & 0x03) != 1) { + throw FormatException::getFormatInstance(); + } + $this->bitMatrix = $bitMatrix; + } + + /** + *

        Reads the bits in the {@link BitMatrix} representing the finder pattern in the + * correct order in order to reconstruct the codewords bytes contained within the + * QR Code.

        + * + * @return bytes encoded within the QR Code + * @throws FormatException if the exact number of bytes expected is not read + */ + public function readCodewords() + { + + $formatInfo = $this->readFormatInformation(); + $version = $this->readVersion(); + + // Get the data mask for the format used in this QR Code. This will exclude + // some bits from reading as we wind through the bit matrix. + $dataMask = DataMask::forReference($formatInfo->getDataMask()); + $dimension = $this->bitMatrix->getHeight(); + $dataMask->unmaskBitMatrix($this->bitMatrix, $dimension); + + $functionPattern = $version->buildFunctionPattern(); + + $readingUp = true; + if ($version->getTotalCodewords()) { + $result = fill_array(0, $version->getTotalCodewords(), 0); + } else { + $result = []; + } + $resultOffset = 0; + $currentByte = 0; + $bitsRead = 0; + // Read columns in pairs, from right to left + for ($j = $dimension - 1; $j > 0; $j -= 2) { + if ($j == 6) { + // Skip whole column with vertical alignment pattern; + // saves time and makes the other code proceed more cleanly + $j--; + } + // Read alternatingly from bottom to top then top to bottom + for ($count = 0; $count < $dimension; $count++) { + $i = $readingUp ? $dimension - 1 - $count : $count; + for ($col = 0; $col < 2; $col++) { + // Ignore bits covered by the function pattern + if (!$functionPattern->get($j - $col, $i)) { + // Read a bit + $bitsRead++; + $currentByte <<= 1; + if ($this->bitMatrix->get($j - $col, $i)) { + $currentByte |= 1; + } + // If we've made a whole byte, save it off + if ($bitsRead == 8) { + $result[$resultOffset++] = $currentByte; //(byte) + $bitsRead = 0; + $currentByte = 0; + } + } + } + } + $readingUp ^= true; // readingUp = !readingUp; // switch directions + } + if ($resultOffset != $version->getTotalCodewords()) { + throw FormatException::getFormatInstance(); + } + + return $result; + } + + /** + *

        Reads format information from one of its two locations within the QR Code.

        + * + * @return {@link FormatInformation} encapsulating the QR Code's format info + * @throws FormatException if both format information locations cannot be parsed as + * the valid encoding of format information + */ + public function readFormatInformation() + { + + if ($this->parsedFormatInfo != null) { + return $this->parsedFormatInfo; + } + + // Read top-left format info bits + $formatInfoBits1 = 0; + for ($i = 0; $i < 6; $i++) { + $formatInfoBits1 = $this->copyBit($i, 8, $formatInfoBits1); + } + // .. and skip a bit in the timing pattern ... + $formatInfoBits1 = $this->copyBit(7, 8, $formatInfoBits1); + $formatInfoBits1 = $this->copyBit(8, 8, $formatInfoBits1); + $formatInfoBits1 = $this->copyBit(8, 7, $formatInfoBits1); + // .. and skip a bit in the timing pattern ... + for ($j = 5; $j >= 0; $j--) { + $formatInfoBits1 = $this->copyBit(8, $j, $formatInfoBits1); + } + + // Read the top-right/bottom-left pattern too + $dimension = $this->bitMatrix->getHeight(); + $formatInfoBits2 = 0; + $jMin = $dimension - 7; + for ($j = $dimension - 1; $j >= $jMin; $j--) { + $formatInfoBits2 = $this->copyBit(8, $j, $formatInfoBits2); + } + for ($i = $dimension - 8; $i < $dimension; $i++) { + $formatInfoBits2 = $this->copyBit($i, 8, $formatInfoBits2); + } + + $parsedFormatInfo = FormatInformation::decodeFormatInformation($formatInfoBits1, $formatInfoBits2); + if ($parsedFormatInfo != null) { + return $parsedFormatInfo; + } + throw FormatException::getFormatInstance(); + } + + private function copyBit($i, $j, $versionBits) + { + $bit = $this->mirror ? $this->bitMatrix->get($j, $i) : $this->bitMatrix->get($i, $j); + + return $bit ? ($versionBits << 1) | 0x1 : $versionBits << 1; + } + + /** + *

        Reads version information from one of its two locations within the QR Code.

        + * + * @return {@link Version} encapsulating the QR Code's version + * @throws FormatException if both version information locations cannot be parsed as + * the valid encoding of version information + */ + public function readVersion() + { + + if ($this->parsedVersion != null) { + return $this->parsedVersion; + } + + $dimension = $this->bitMatrix->getHeight(); + + $provisionalVersion = ($dimension - 17) / 4; + if ($provisionalVersion <= 6) { + return Version::getVersionForNumber($provisionalVersion); + } + + // Read top-right version info: 3 wide by 6 tall + $versionBits = 0; + $ijMin = $dimension - 11; + for ($j = 5; $j >= 0; $j--) { + for ($i = $dimension - 9; $i >= $ijMin; $i--) { + $versionBits = $this->copyBit($i, $j, $versionBits); + } + } + + $theParsedVersion = Version::decodeVersionInformation($versionBits); + if ($theParsedVersion != null && $theParsedVersion->getDimensionForVersion() == $dimension) { + $this->parsedVersion = $theParsedVersion; + + return $theParsedVersion; + } + + // Hmm, failed. Try bottom left: 6 wide by 3 tall + $versionBits = 0; + for ($i = 5; $i >= 0; $i--) { + for ($j = $dimension - 9; $j >= $ijMin; $j--) { + $versionBits = $this->copyBit($i, $j, $versionBits); + } + } + + $theParsedVersion = Version::decodeVersionInformation($versionBits); + if ($theParsedVersion != null && $theParsedVersion->getDimensionForVersion() == $dimension) { + $this->parsedVersion = $theParsedVersion; + + return $theParsedVersion; + } + throw FormatException::getFormatInstance(); + } + + /** + * Revert the mask removal done while reading the code words. The bit matrix should revert to its original state. + */ + public function remask() + { + if ($this->parsedFormatInfo == null) { + return; // We have no format information, and have no data mask + } + $dataMask = DataMask::forReference($this->parsedFormatInfo->getDataMask()); + $dimension = $this->bitMatrix->getHeight(); + $dataMask->unmaskBitMatrix($this->bitMatrix, $dimension); + } + + /** + * Prepare the parser for a mirrored operation. + * This flag has effect only on the {@link #readFormatInformation()} and the + * {@link #readVersion()}. Before proceeding with {@link #readCodewords()} the + * {@link #mirror()} method should be called. + * + * @param mirror Whether to read version and format information mirrored. + */ + public function setMirror($mirror) + { + $parsedVersion = null; + $parsedFormatInfo = null; + $this->mirror = $mirror; + } + + /** Mirror the bit matrix in order to attempt a second reading. */ + public function mirror() + { + for ($x = 0; $x < $this->bitMatrix->getWidth(); $x++) { + for ($y = $x + 1; $y < $this->bitMatrix->getHeight(); $y++) { + if ($this->bitMatrix->get($x, $y) != $this->bitMatrix->get($y, $x)) { + $this->bitMatrix->flip($y, $x); + $this->bitMatrix->flip($x, $y); + } + } + } + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/DataBlock.php b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/DataBlock.php new file mode 100644 index 0000000..c845247 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/DataBlock.php @@ -0,0 +1,129 @@ +Encapsulates a block of data within a QR Code. QR Codes may split their data into + * multiple blocks, each of which is a unit of data and error-correction codewords. Each + * is represented by an instance of this class.

        + * + * @author Sean Owen + */ +final class DataBlock +{ + private $numDataCodewords; + private $codewords; //byte[] + + private function __construct($numDataCodewords, $codewords) + { + $this->numDataCodewords = $numDataCodewords; + $this->codewords = $codewords; + } + + /** + *

        When QR Codes use multiple data blocks, they are actually interleaved. + * That is, the first byte of data block 1 to n is written, then the second bytes, and so on. This + * method will separate the data into original blocks.

        + * + * @param rawCodewords bytes as read directly from the QR Code + * @param version version of the QR Code + * @param ecLevel error-correction level of the QR Code + * + * @return array DataBlocks containing original bytes, "de-interleaved" from representation in the + * QR Code + */ + public static function getDataBlocks($rawCodewords, + $version, + $ecLevel) + { + + if (count($rawCodewords) != $version->getTotalCodewords()) { + throw new \InvalidArgumentException(); + } + + // Figure out the number and size of data blocks used by this version and + // error correction level + $ecBlocks = $version->getECBlocksForLevel($ecLevel); + + // First count the total number of data blocks + $totalBlocks = 0; + $ecBlockArray = $ecBlocks->getECBlocks(); + foreach ($ecBlockArray as $ecBlock) { + $totalBlocks += $ecBlock->getCount(); + } + + // Now establish DataBlocks of the appropriate size and number of data codewords + $result = [];//new DataBlock[$totalBlocks]; + $numResultBlocks = 0; + foreach ($ecBlockArray as $ecBlock) { + $ecBlockCount = $ecBlock->getCount(); + for ($i = 0; $i < $ecBlockCount; $i++) { + $numDataCodewords = $ecBlock->getDataCodewords(); + $numBlockCodewords = $ecBlocks->getECCodewordsPerBlock() + $numDataCodewords; + $result[$numResultBlocks++] = new DataBlock($numDataCodewords, fill_array(0, $numBlockCodewords, 0)); + } + } + + // All blocks have the same amount of data, except that the last n + // (where n may be 0) have 1 more byte. Figure out where these start. + $shorterBlocksTotalCodewords = count($result[0]->codewords); + $longerBlocksStartAt = count($result) - 1; + while ($longerBlocksStartAt >= 0) { + $numCodewords = count($result[$longerBlocksStartAt]->codewords); + if ($numCodewords == $shorterBlocksTotalCodewords) { + break; + } + $longerBlocksStartAt--; + } + $longerBlocksStartAt++; + + $shorterBlocksNumDataCodewords = $shorterBlocksTotalCodewords - $ecBlocks->getECCodewordsPerBlock(); + // The last elements of result may be 1 element longer; + // first fill out as many elements as all of them have + $rawCodewordsOffset = 0; + for ($i = 0; $i < $shorterBlocksNumDataCodewords; $i++) { + for ($j = 0; $j < $numResultBlocks; $j++) { + $result[$j]->codewords[$i] = $rawCodewords[$rawCodewordsOffset++]; + } + } + // Fill out the last data block in the longer ones + for ($j = $longerBlocksStartAt; $j < $numResultBlocks; $j++) { + $result[$j]->codewords[$shorterBlocksNumDataCodewords] = $rawCodewords[$rawCodewordsOffset++]; + } + // Now add in error correction blocks + $max = count($result[0]->codewords); + for ($i = $shorterBlocksNumDataCodewords; $i < $max; $i++) { + for ($j = 0; $j < $numResultBlocks; $j++) { + $iOffset = $j < $longerBlocksStartAt ? $i : $i + 1; + $result[$j]->codewords[$iOffset] = $rawCodewords[$rawCodewordsOffset++]; + } + } + + return $result; + } + + public function getNumDataCodewords() + { + return $this->numDataCodewords; + } + + public function getCodewords() + { + return $this->codewords; + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/DataMask.php b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/DataMask.php new file mode 100644 index 0000000..5fa2098 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/DataMask.php @@ -0,0 +1,196 @@ +Encapsulates data masks for the data bits in a QR code, per ISO 18004:2006 6.8. Implementations + * of this class can un-mask a raw BitMatrix. For simplicity, they will unmask the entire BitMatrix, + * including areas used for finder patterns, timing patterns, etc. These areas should be unused + * after the point they are unmasked anyway.

        + * + *

        Note that the diagram in section 6.8.1 is misleading since it indicates that i is column position + * and j is row position. In fact, as the text says, i is row position and j is column position.

        + * + * @author Sean Owen + */ +abstract class DataMask +{ + + /** + * See ISO 18004:2006 6.8.1 + */ + private static $DATA_MASKS = []; + + public function __construct() + { + + } + + public static function Init() + { + self::$DATA_MASKS = [ + new DataMask000(), + new DataMask001(), + new DataMask010(), + new DataMask011(), + new DataMask100(), + new DataMask101(), + new DataMask110(), + new DataMask111(), + ]; + } + + /** + * @param reference a value between 0 and 7 indicating one of the eight possible + * data mask patterns a QR Code may use + * + * @return DataMask encapsulating the data mask pattern + */ + public static function forReference($reference) + { + if ($reference < 0 || $reference > 7) { + throw new \InvalidArgumentException(); + } + + return self::$DATA_MASKS[$reference]; + } + + /** + *

        Implementations of this method reverse the data masking process applied to a QR Code and + * make its bits ready to read.

        + * + * @param bits representation of QR Code bits + * @param dimension dimension of QR Code, represented by bits, being unmasked + */ + final public function unmaskBitMatrix($bits, $dimension) + { + for ($i = 0; $i < $dimension; $i++) { + for ($j = 0; $j < $dimension; $j++) { + if ($this->isMasked($i, $j)) { + $bits->flip($j, $i); + } + } + } + } + + abstract public function isMasked($i, $j); +} + +DataMask::Init(); + +/** + * 000: mask bits for which (x + y) mod 2 == 0 + */ +final class DataMask000 extends DataMask +{ + // @Override + public function isMasked($i, $j) + { + return (($i + $j) & 0x01) == 0; + } +} + +/** + * 001: mask bits for which x mod 2 == 0 + */ +final class DataMask001 extends DataMask +{ + //@Override + public function isMasked($i, $j) + { + return ($i & 0x01) == 0; + } +} + +/** + * 010: mask bits for which y mod 3 == 0 + */ +final class DataMask010 extends DataMask +{ + //@Override + public function isMasked($i, $j) + { + return $j % 3 == 0; + } +} + +/** + * 011: mask bits for which (x + y) mod 3 == 0 + */ +final class DataMask011 extends DataMask +{ + //@Override + public function isMasked($i, $j) + { + return ($i + $j) % 3 == 0; + } +} + +/** + * 100: mask bits for which (x/2 + y/3) mod 2 == 0 + */ +final class DataMask100 extends DataMask +{ + //@Override + public function isMasked($i, $j) + { + return (int)(((int)($i / 2) + (int)($j / 3)) & 0x01) == 0; + } +} + +/** + * 101: mask bits for which xy mod 2 + xy mod 3 == 0 + */ +final class DataMask101 extends DataMask +{ + //@Override + public function isMasked($i, $j) + { + $temp = $i * $j; + + return ($temp & 0x01) + ($temp % 3) == 0; + } +} + +/** + * 110: mask bits for which (xy mod 2 + xy mod 3) mod 2 == 0 + */ +final class DataMask110 extends DataMask +{ + //@Override + public function isMasked($i, $j) + { + $temp = $i * $j; + + return ((($temp & 0x01) + ($temp % 3)) & 0x01) == 0; + } +} + +/** + * 111: mask bits for which ((x+y)mod 2 + xy mod 3) mod 2 == 0 + */ +final class DataMask111 extends DataMask +{ + //@Override + public function isMasked($i, $j) + { + return (((($i + $j) & 0x01) + (($i * $j) % 3)) & 0x01) == 0; + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/DecodedBitStreamParser.php b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/DecodedBitStreamParser.php new file mode 100644 index 0000000..a0afdf4 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/DecodedBitStreamParser.php @@ -0,0 +1,355 @@ +QR Codes can encode text as bits in one of several modes, and can use multiple modes + * in one QR Code. This class decodes the bits back into text.

        + * + *

        See ISO 18004:2006, 6.4.3 - 6.4.7

        + * + * @author Sean Owen + */ +final class DecodedBitStreamParser +{ + + /** + * See ISO 18004:2006, 6.4.4 Table 5 + */ + private static $ALPHANUMERIC_CHARS = [ + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', + 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', + 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + ' ', '$', '%', '*', '+', '-', '.', '/', ':', + ]; + private static $GB2312_SUBSET = 1; + + public static function decode($bytes, + $version, + $ecLevel, + $hints) + { + $bits = new BitSource($bytes); + $result = '';//new StringBuilder(50); + $byteSegments = []; + $symbolSequence = -1; + $parityData = -1; + + try { + $currentCharacterSetECI = null; + $fc1InEffect = false; + $mode = ''; + do { + // While still another segment to read... + if ($bits->available() < 4) { + // OK, assume we're done. Really, a TERMINATOR mode should have been recorded here + $mode = Mode::$TERMINATOR; + } else { + $mode = Mode::forBits($bits->readBits(4)); // mode is encoded by 4 bits + } + if ($mode != Mode::$TERMINATOR) { + if ($mode == Mode::$FNC1_FIRST_POSITION || $mode == Mode::$FNC1_SECOND_POSITION) { + // We do little with FNC1 except alter the parsed result a bit according to the spec + $fc1InEffect = true; + } else if ($mode == Mode::$STRUCTURED_APPEND) { + if ($bits->available() < 16) { + throw FormatException::getFormatInstance(); + } + // sequence number and parity is added later to the result metadata + // Read next 8 bits (symbol sequence #) and 8 bits (parity data), then continue + $symbolSequence = $bits->readBits(8); + $parityData = $bits->readBits(8); + } else if ($mode == Mode::$ECI) { + // Count doesn't apply to ECI + $value = self::parseECIValue($bits); + $currentCharacterSetECI = CharacterSetECI::getCharacterSetECIByValue($value); + if ($currentCharacterSetECI == null) { + throw FormatException::getFormatInstance(); + } + } else { + // First handle Hanzi mode which does not start with character count + if ($mode == Mode::$HANZI) { + //chinese mode contains a sub set indicator right after mode indicator + $subset = $bits->readBits(4); + $countHanzi = $bits->readBits($mode->getCharacterCountBits($version)); + if ($subset == self::$GB2312_SUBSET) { + self::decodeHanziSegment($bits, $result, $countHanzi); + } + } else { + // "Normal" QR code modes: + // How many characters will follow, encoded in this mode? + $count = $bits->readBits($mode->getCharacterCountBits($version)); + if ($mode == Mode::$NUMERIC) { + self::decodeNumericSegment($bits, $result, $count); + } else if ($mode == Mode::$ALPHANUMERIC) { + self::decodeAlphanumericSegment($bits, $result, $count, $fc1InEffect); + } else if ($mode == Mode::$BYTE) { + self::decodeByteSegment($bits, $result, $count, $currentCharacterSetECI, $byteSegments, $hints); + } else if ($mode == Mode::$KANJI) { + self::decodeKanjiSegment($bits, $result, $count); + } else { + throw FormatException::getFormatInstance(); + } + } + } + } + } while ($mode != Mode::$TERMINATOR); + } catch (\InvalidArgumentException $iae) { + // from readBits() calls + throw FormatException::getFormatInstance(); + } + + return new DecoderResult($bytes, + $result, + empty($byteSegments) ? null : $byteSegments, + $ecLevel == null ? null : 'L',//ErrorCorrectionLevel::toString($ecLevel), + $symbolSequence, + $parityData); + } + + private static function parseECIValue($bits) + { + $firstByte = $bits->readBits(8); + if (($firstByte & 0x80) == 0) { + // just one byte + return $firstByte & 0x7F; + } + if (($firstByte & 0xC0) == 0x80) { + // two bytes + $secondByte = $bits->readBits(8); + + return (($firstByte & 0x3F) << 8) | $secondByte; + } + if (($firstByte & 0xE0) == 0xC0) { + // three bytes + $secondThirdBytes = $bits->readBits(16); + + return (($firstByte & 0x1F) << 16) | $secondThirdBytes; + } + throw FormatException::getFormatInstance(); + } + + /** + * See specification GBT 18284-2000 + */ + private static function decodeHanziSegment($bits, + &$result, + $count) + { + // Don't crash trying to read more bits than we have available. + if ($count * 13 > $bits->available()) { + throw FormatException::getFormatInstance(); + } + + // Each character will require 2 bytes. Read the characters as 2-byte pairs + // and decode as GB2312 afterwards + $buffer = fill_array(0, 2 * $count, 0); + $offset = 0; + while ($count > 0) { + // Each 13 bits encodes a 2-byte character + $twoBytes = $bits->readBits(13); + $assembledTwoBytes = (($twoBytes / 0x060) << 8) | ($twoBytes % 0x060); + if ($assembledTwoBytes < 0x003BF) { + // In the 0xA1A1 to 0xAAFE range + $assembledTwoBytes += 0x0A1A1; + } else { + // In the 0xB0A1 to 0xFAFE range + $assembledTwoBytes += 0x0A6A1; + } + $buffer[$offset] = (($assembledTwoBytes >> 8) & 0xFF);//(byte) + $buffer[$offset + 1] = ($assembledTwoBytes & 0xFF);//(byte) + $offset += 2; + $count--; + } + $result .= iconv('GB2312', 'UTF-8', implode($buffer)); + } + + private static function decodeNumericSegment($bits, + &$result, + $count) + { + // Read three digits at a time + while ($count >= 3) { + // Each 10 bits encodes three digits + if ($bits->available() < 10) { + throw FormatException::getFormatInstance(); + } + $threeDigitsBits = $bits->readBits(10); + if ($threeDigitsBits >= 1000) { + throw FormatException::getFormatInstance(); + } + $result .= (self::toAlphaNumericChar($threeDigitsBits / 100)); + $result .= (self::toAlphaNumericChar(($threeDigitsBits / 10) % 10)); + $result .= (self::toAlphaNumericChar($threeDigitsBits % 10)); + $count -= 3; + } + if ($count == 2) { + // Two digits left over to read, encoded in 7 bits + if ($bits->available() < 7) { + throw FormatException::getFormatInstance(); + } + $twoDigitsBits = $bits->readBits(7); + if ($twoDigitsBits >= 100) { + throw FormatException::getFormatInstance(); + } + $result .= (self::toAlphaNumericChar($twoDigitsBits / 10)); + $result .= (self::toAlphaNumericChar($twoDigitsBits % 10)); + } else if ($count == 1) { + // One digit left over to read + if ($bits->available() < 4) { + throw FormatException::getFormatInstance(); + } + $digitBits = $bits->readBits(4); + if ($digitBits >= 10) { + throw FormatException::getFormatInstance(); + } + $result .= (self::toAlphaNumericChar($digitBits)); + } + } + + private static function toAlphaNumericChar($value) + { + if ($value >= count(self::$ALPHANUMERIC_CHARS)) { + throw FormatException::getFormatInstance(); + } + + return self::$ALPHANUMERIC_CHARS[$value]; + } + + private static function decodeAlphanumericSegment($bits, + &$result, + $count, + $fc1InEffect) + { + // Read two characters at a time + $start = strlen($result); + while ($count > 1) { + if ($bits->available() < 11) { + throw FormatException::getFormatInstance(); + } + $nextTwoCharsBits = $bits->readBits(11); + $result .= (self::toAlphaNumericChar($nextTwoCharsBits / 45)); + $result .= (self::toAlphaNumericChar($nextTwoCharsBits % 45)); + $count -= 2; + } + if ($count == 1) { + // special case: one character left + if ($bits->available() < 6) { + throw FormatException::getFormatInstance(); + } + $result .= self::toAlphaNumericChar($bits->readBits(6)); + } + // See section 6.4.8.1, 6.4.8.2 + if ($fc1InEffect) { + // We need to massage the result a bit if in an FNC1 mode: + for ($i = $start; $i < strlen($result); $i++) { + if ($result[$i] == '%') { + if ($i < strlen($result) - 1 && $result[$i + 1] == '%') { + // %% is rendered as % + $result = substr_replace($result, '', $i + 1, 1);//deleteCharAt(i + 1); + } else { + // In alpha mode, % should be converted to FNC1 separator 0x1D + $result . setCharAt($i, chr(0x1D)); + } + } + } + } + } + + private static function decodeByteSegment($bits, + &$result, + $count, + $currentCharacterSetECI, + &$byteSegments, + $hints) + { + // Don't crash trying to read more bits than we have available. + if (8 * $count > $bits->available()) { + throw FormatException::getFormatInstance(); + } + + $readBytes = fill_array(0, $count, 0); + for ($i = 0; $i < $count; $i++) { + $readBytes[$i] = $bits->readBits(8);//(byte) + } + $text = implode(array_map('chr', $readBytes)); + $encoding = ''; + if ($currentCharacterSetECI == null) { + // The spec isn't clear on this mode; see + // section 6.4.5: t does not say which encoding to assuming + // upon decoding. I have seen ISO-8859-1 used as well as + // Shift_JIS -- without anything like an ECI designator to + // give a hint. + + $encoding = mb_detect_encoding($text, $hints); + } else { + $encoding = $currentCharacterSetECI->name(); + } + // $result.= mb_convert_encoding($text ,$encoding);//(new String(readBytes, encoding)); + $result .= $text;//(new String(readBytes, encoding)); + + $byteSegments = array_merge($byteSegments, $readBytes); + } + + private static function decodeKanjiSegment($bits, + &$result, + $count) + { + // Don't crash trying to read more bits than we have available. + if ($count * 13 > $bits->available()) { + throw FormatException::getFormatInstance(); + } + + // Each character will require 2 bytes. Read the characters as 2-byte pairs + // and decode as Shift_JIS afterwards + $buffer = [0, 2 * $count, 0]; + $offset = 0; + while ($count > 0) { + // Each 13 bits encodes a 2-byte character + $twoBytes = $bits->readBits(13); + $assembledTwoBytes = (($twoBytes / 0x0C0) << 8) | ($twoBytes % 0x0C0); + if ($assembledTwoBytes < 0x01F00) { + // In the 0x8140 to 0x9FFC range + $assembledTwoBytes += 0x08140; + } else { + // In the 0xE040 to 0xEBBF range + $assembledTwoBytes += 0x0C140; + } + $buffer[$offset] = ($assembledTwoBytes >> 8);//(byte) + $buffer[$offset + 1] = $assembledTwoBytes; //(byte) + $offset += 2; + $count--; + } + // Shift_JIS may not be supported in some environments: + + $result .= iconv('shift-jis', 'utf-8', implode($buffer)); + } + + private function DecodedBitStreamParser() + { + + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/Decoder.php b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/Decoder.php new file mode 100644 index 0000000..ff181ec --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/Decoder.php @@ -0,0 +1,213 @@ +The main class which implements QR Code decoding -- as opposed to locating and extracting + * the QR Code from an image.

        + * + * @author Sean Owen + */ +final class Decoder +{ + + private $rsDecoder; + + public function __construct() + { + $this->rsDecoder = new ReedSolomonDecoder(GenericGF::$QR_CODE_FIELD_256); + } + + public function decode($variable, $hints = null) + { + if (is_array($variable)) { + return $this->decodeImage($variable, $hints); + } elseif ($variable instanceof BitMatrix) { + return $this->decodeBits($variable, $hints); + } elseif ($variable instanceof BitMatrixParser) { + return $this->decodeParser($variable, $hints); + } + die('decode error Decoder.php'); + } + + /** + *

        Convenience method that can decode a QR Code represented as a 2D array of booleans. + * "true" is taken to mean a black module.

        + * + * @param array $image booleans representing white/black QR Code modules + * @param hints decoding hints that should be used to influence decoding + * + * @return text and bytes encoded within the QR Code + * @throws FormatException if the QR Code cannot be decoded + * @throws ChecksumException if error correction fails + */ + public function decodeImage($image, $hints = null) + { + $dimension = count($image); + $bits = new BitMatrix($dimension); + for ($i = 0; $i < $dimension; $i++) { + for ($j = 0; $j < $dimension; $j++) { + if ($image[$i][$j]) { + $bits->set($j, $i); + } + } + } + + return $this->decode($bits, $hints); + } + + + /** + *

        Decodes a QR Code represented as a {@link BitMatrix}. A 1 or "true" is taken to mean a black module.

        + * + * @param BitMatrix $bits booleans representing white/black QR Code modules + * @param hints decoding hints that should be used to influence decoding + * + * @return text and bytes encoded within the QR Code + * @throws FormatException if the QR Code cannot be decoded + * @throws ChecksumException if error correction fails + */ + public function decodeBits($bits, $hints = null) + { + +// Construct a parser and read version, error-correction level + $parser = new BitMatrixParser($bits); + $fe = null; + $ce = null; + try { + return $this->decode($parser, $hints); + } catch (FormatException $e) { + $fe = $e; + } catch (ChecksumException $e) { + $ce = $e; + } + + try { + + // Revert the bit matrix + $parser->remask(); + + // Will be attempting a mirrored reading of the version and format info. + $parser->setMirror(true); + + // Preemptively read the version. + $parser->readVersion(); + + // Preemptively read the format information. + $parser->readFormatInformation(); + + /* + * Since we're here, this means we have successfully detected some kind + * of version and format information when mirrored. This is a good sign, + * that the QR code may be mirrored, and we should try once more with a + * mirrored content. + */ + // Prepare for a mirrored reading. + $parser->mirror(); + + $result = $this->decode($parser, $hints); + + // Success! Notify the caller that the code was mirrored. + $result->setOther(new QRCodeDecoderMetaData(true)); + + return $result; + + } catch (FormatException $e) {// catch (FormatException | ChecksumException e) { + // Throw the exception from the original reading + if ($fe != null) { + throw $fe; + } + if ($ce != null) { + throw $ce; + } + throw $e; + + } + } + + private function decodeParser($parser, $hints = null) + { + $version = $parser->readVersion(); + $ecLevel = $parser->readFormatInformation()->getErrorCorrectionLevel(); + +// Read codewords + $codewords = $parser->readCodewords(); +// Separate into data blocks + $dataBlocks = DataBlock::getDataBlocks($codewords, $version, $ecLevel); + +// Count total number of data bytes + $totalBytes = 0; + foreach ($dataBlocks as $dataBlock) { + $totalBytes += $dataBlock->getNumDataCodewords(); + } + $resultBytes = fill_array(0, $totalBytes, 0); + $resultOffset = 0; + +// Error-correct and copy data blocks together into a stream of bytes + foreach ($dataBlocks as $dataBlock) { + $codewordBytes = $dataBlock->getCodewords(); + $numDataCodewords = $dataBlock->getNumDataCodewords(); + $this->correctErrors($codewordBytes, $numDataCodewords); + for ($i = 0; $i < $numDataCodewords; $i++) { + $resultBytes[$resultOffset++] = $codewordBytes[$i]; + } + } + +// Decode the contents of that stream of bytes + return DecodedBitStreamParser::decode($resultBytes, $version, $ecLevel, $hints); + } + + /** + *

        Given data and error-correction codewords received, possibly corrupted by errors, attempts to + * correct the errors in-place using Reed-Solomon error correction.

        + * + * @param codewordBytes data and error correction codewords + * @param numDataCodewords number of codewords that are data bytes + * + * @throws ChecksumException if error correction fails + */ + private function correctErrors(&$codewordBytes, $numDataCodewords) + { + $numCodewords = count($codewordBytes); +// First read into an array of ints + $codewordsInts = fill_array(0, $numCodewords, 0); + for ($i = 0; $i < $numCodewords; $i++) { + $codewordsInts[$i] = $codewordBytes[$i] & 0xFF; + } + $numECCodewords = count($codewordBytes) - $numDataCodewords; + try { + $this->rsDecoder->decode($codewordsInts, $numECCodewords); + } catch (ReedSolomonException $ignored) { + throw ChecksumException::getChecksumInstance(); + } +// Copy back into array of bytes -- only need to worry about the bytes that were data +// We don't care about errors in the error-correction codewords + for ($i = 0; $i < $numDataCodewords; $i++) { + $codewordBytes[$i] = $codewordsInts[$i]; + } + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/ErrorCorrectionLevel.php b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/ErrorCorrectionLevel.php new file mode 100644 index 0000000..38ae6a6 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/ErrorCorrectionLevel.php @@ -0,0 +1,91 @@ +See ISO 18004:2006, 6.5.1. This enum encapsulates the four error correction levels + * defined by the QR code standard.

        + * + * @author Sean Owen + */ +class ErrorCorrectionLevel +{ + private static $FOR_BITS; + private $bits; + private $ordinal; + + public function __construct($bits, $ordinal = 0) + { + $this->bits = $bits; + $this->ordinal = $ordinal; + } + + public static function Init() + { + self::$FOR_BITS = [ + + + new ErrorCorrectionLevel(0x00, 1), //M + new ErrorCorrectionLevel(0x01, 0), //L + new ErrorCorrectionLevel(0x02, 3), //H + new ErrorCorrectionLevel(0x03, 2), //Q + + ]; + } + /** L = ~7% correction */ + // self::$L = new ErrorCorrectionLevel(0x01); + /** M = ~15% correction */ + //self::$M = new ErrorCorrectionLevel(0x00); + /** Q = ~25% correction */ + //self::$Q = new ErrorCorrectionLevel(0x03); + /** H = ~30% correction */ + //self::$H = new ErrorCorrectionLevel(0x02); + /** + * @param bits int containing the two bits encoding a QR Code's error correction level + * + * @return ErrorCorrectionLevel representing the encoded error correction level + */ + public static function forBits($bits) + { + if ($bits < 0 || $bits >= count(self::$FOR_BITS)) { + throw new \InvalidArgumentException(); + } + $level = self::$FOR_BITS[$bits]; + + // $lev = self::$$bit; + return $level; + } + + + public function getBits() + { + return $this->bits; + } + + public function toString() + { + return $this->bits; + } + + public function getOrdinal() + { + return $this->ordinal; + } +} + +ErrorCorrectionLevel::Init(); diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/FormatInformation.php b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/FormatInformation.php new file mode 100644 index 0000000..fedcb63 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/FormatInformation.php @@ -0,0 +1,190 @@ +Encapsulates a QR Code's format information, including the data mask used and + * error correction level.

        + * + * @author Sean Owen + * @see DataMask + * @see ErrorCorrectionLevel + */ +final class FormatInformation +{ + public static $FORMAT_INFO_MASK_QR; + + /** + * See ISO 18004:2006, Annex C, Table C.1 + */ + public static $FORMAT_INFO_DECODE_LOOKUP; + /** + * Offset i holds the number of 1 bits in the binary representation of i + */ + private static $BITS_SET_IN_HALF_BYTE; + + private $errorCorrectionLevel; + private $dataMask; + + private function __construct($formatInfo) + { + // Bits 3,4 + $this->errorCorrectionLevel = ErrorCorrectionLevel::forBits(($formatInfo >> 3) & 0x03); + // Bottom 3 bits + $this->dataMask = ($formatInfo & 0x07);//(byte) + } + + public static function Init() + { + self::$FORMAT_INFO_MASK_QR = 0x5412; + self::$BITS_SET_IN_HALF_BYTE = [0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4]; + self::$FORMAT_INFO_DECODE_LOOKUP = [ + [0x5412, 0x00], + [0x5125, 0x01], + [0x5E7C, 0x02], + [0x5B4B, 0x03], + [0x45F9, 0x04], + [0x40CE, 0x05], + [0x4F97, 0x06], + [0x4AA0, 0x07], + [0x77C4, 0x08], + [0x72F3, 0x09], + [0x7DAA, 0x0A], + [0x789D, 0x0B], + [0x662F, 0x0C], + [0x6318, 0x0D], + [0x6C41, 0x0E], + [0x6976, 0x0F], + [0x1689, 0x10], + [0x13BE, 0x11], + [0x1CE7, 0x12], + [0x19D0, 0x13], + [0x0762, 0x14], + [0x0255, 0x15], + [0x0D0C, 0x16], + [0x083B, 0x17], + [0x355F, 0x18], + [0x3068, 0x19], + [0x3F31, 0x1A], + [0x3A06, 0x1B], + [0x24B4, 0x1C], + [0x2183, 0x1D], + [0x2EDA, 0x1E], + [0x2BED, 0x1F], + ]; + } + + /** + * @param maskedFormatInfo1 ; format info indicator, with mask still applied + * @param maskedFormatInfo2 ; second copy of same info; both are checked at the same time + * to establish best match + * + * @return information about the format it specifies, or {@code null} + * if doesn't seem to match any known pattern + */ + public static function decodeFormatInformation($maskedFormatInfo1, $maskedFormatInfo2) + { + $formatInfo = self::doDecodeFormatInformation($maskedFormatInfo1, $maskedFormatInfo2); + if ($formatInfo != null) { + return $formatInfo; + } + // Should return null, but, some QR codes apparently + // do not mask this info. Try again by actually masking the pattern + // first + return self::doDecodeFormatInformation($maskedFormatInfo1 ^ self::$FORMAT_INFO_MASK_QR, + $maskedFormatInfo2 ^ self::$FORMAT_INFO_MASK_QR); + } + + private static function doDecodeFormatInformation($maskedFormatInfo1, $maskedFormatInfo2) + { + // Find the int in FORMAT_INFO_DECODE_LOOKUP with fewest bits differing + $bestDifference = PHP_INT_MAX; + $bestFormatInfo = 0; + foreach (self::$FORMAT_INFO_DECODE_LOOKUP as $decodeInfo) { + $targetInfo = $decodeInfo[0]; + if ($targetInfo == $maskedFormatInfo1 || $targetInfo == $maskedFormatInfo2) { + // Found an exact match + return new FormatInformation($decodeInfo[1]); + } + $bitsDifference = self::numBitsDiffering($maskedFormatInfo1, $targetInfo); + if ($bitsDifference < $bestDifference) { + $bestFormatInfo = $decodeInfo[1]; + $bestDifference = $bitsDifference; + } + if ($maskedFormatInfo1 != $maskedFormatInfo2) { + // also try the other option + $bitsDifference = self::numBitsDiffering($maskedFormatInfo2, $targetInfo); + if ($bitsDifference < $bestDifference) { + $bestFormatInfo = $decodeInfo[1]; + $bestDifference = $bitsDifference; + } + } + } + // Hamming distance of the 32 masked codes is 7, by construction, so <= 3 bits + // differing means we found a match + if ($bestDifference <= 3) { + return new FormatInformation($bestFormatInfo); + } + + return null; + } + + public static function numBitsDiffering($a, $b) + { + $a ^= $b; // a now has a 1 bit exactly where its bit differs with b's + // Count bits set quickly with a series of lookups: + return self::$BITS_SET_IN_HALF_BYTE[$a & 0x0F] + + self::$BITS_SET_IN_HALF_BYTE[(int)(uRShift($a, 4) & 0x0F)] + + self::$BITS_SET_IN_HALF_BYTE[(uRShift($a, 8) & 0x0F)] + + self::$BITS_SET_IN_HALF_BYTE[(uRShift($a, 12) & 0x0F)] + + self::$BITS_SET_IN_HALF_BYTE[(uRShift($a, 16) & 0x0F)] + + self::$BITS_SET_IN_HALF_BYTE[(uRShift($a, 20) & 0x0F)] + + self::$BITS_SET_IN_HALF_BYTE[(uRShift($a, 24) & 0x0F)] + + self::$BITS_SET_IN_HALF_BYTE[(uRShift($a, 28) & 0x0F)]; + } + + public function getErrorCorrectionLevel() + { + return $this->errorCorrectionLevel; + } + + public function getDataMask() + { + return $this->dataMask; + } + + //@Override + public function hashCode() + { + return ($this->errorCorrectionLevel->ordinal() << 3) | (int)($this->dataMask); + } + + //@Override + public function equals($o) + { + if (!($o instanceof FormatInformation)) { + return false; + } + $other = $o; + + return $this->errorCorrectionLevel == $other->errorCorrectionLevel && + $this->dataMask == $other->dataMask; + } +} + +FormatInformation::Init(); diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/Mode.php b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/Mode.php new file mode 100644 index 0000000..5458b74 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/Mode.php @@ -0,0 +1,128 @@ +See ISO 18004:2006, 6.4.1, Tables 2 and 3. This enum encapsulates the various modes in which + * data can be encoded to bits in the QR code standard.

        + * + * @author Sean Owen + */ +class Mode +{ + public static $TERMINATOR; + public static $NUMERIC; + public static $ALPHANUMERIC; + public static $STRUCTURED_APPEND; + public static $BYTE; + public static $ECI; + public static $KANJI; + public static $FNC1_FIRST_POSITION; + public static $FNC1_SECOND_POSITION; + public static $HANZI; + + private $characterCountBitsForVersions; + private $bits; + + public function __construct($characterCountBitsForVersions, $bits) + { + $this->characterCountBitsForVersions = $characterCountBitsForVersions; + $this->bits = $bits; + } + + public static function Init() + { + + + self::$TERMINATOR = new Mode([0, 0, 0], 0x00); // Not really a mode... + self::$NUMERIC = new Mode([10, 12, 14], 0x01); + self::$ALPHANUMERIC = new Mode([9, 11, 13], 0x02); + self::$STRUCTURED_APPEND = new Mode([0, 0, 0], 0x03); // Not supported + self::$BYTE = new Mode([8, 16, 16], 0x04); + self::$ECI = new Mode([0, 0, 0], 0x07); // character counts don't apply + self::$KANJI = new Mode([8, 10, 12], 0x08); + self::$FNC1_FIRST_POSITION = new Mode([0, 0, 0], 0x05); + self::$FNC1_SECOND_POSITION = new Mode([0, 0, 0], 0x09); + /** See GBT 18284-2000; "Hanzi" is a transliteration of this mode name. */ + self::$HANZI = new Mode([8, 10, 12], 0x0D); + } + + /** + * @param bits four bits encoding a QR Code data mode + * + * @return Mode encoded by these bits + * @throws InvalidArgumentException if bits do not correspond to a known mode + */ + public static function forBits($bits) + { + switch ($bits) { + case 0x0: + return self::$TERMINATOR; + case 0x1: + return self::$NUMERIC; + case 0x2: + return self::$ALPHANUMERIC; + case 0x3: + return self::$STRUCTURED_APPEND; + case 0x4: + return self::$BYTE; + case 0x5: + return self::$FNC1_FIRST_POSITION; + case 0x7: + return self::$ECI; + case 0x8: + return self::$KANJI; + case 0x9: + return self::$FNC1_SECOND_POSITION; + case 0xD: + // 0xD is defined in GBT 18284-2000, may not be supported in foreign country + return self::$HANZI; + default: + throw new \InvalidArgumentException(); + } + } + + /** + * @param version version in question + * + * @return number of bits used, in this QR Code symbol {@link Version}, to encode the + * count of characters that will follow encoded in this Mode + */ + public function getCharacterCountBits($version) + { + $number = $version->getVersionNumber(); + $offset = 0; + if ($number <= 9) { + $offset = 0; + } else if ($number <= 26) { + $offset = 1; + } else { + $offset = 2; + } + + return $this->characterCountBitsForVersions[$offset]; + } + + public function getBits() + { + return $this->bits; + } + +} + +Mode::Init(); diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/QRCodeDecoderMetaData.php b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/QRCodeDecoderMetaData.php new file mode 100644 index 0000000..1debe2c --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/QRCodeDecoderMetaData.php @@ -0,0 +1,23 @@ +mirrored = $mirrored; + } + + public function isMirrored() + { + return $this->mirrored; + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/Version.php b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/Version.php new file mode 100644 index 0000000..0f45da4 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Decoder/Version.php @@ -0,0 +1,619 @@ +versionNumber = $versionNumber; + $this->alignmentPatternCenters = $alignmentPatternCenters; + $this->ecBlocks = $ecBlocks; + $total = 0; + if(is_array($ecBlocks)) { + $ecCodewords = $ecBlocks[0]->getECCodewordsPerBlock(); + $ecbArray = $ecBlocks[0]->getECBlocks(); + }else{ + $ecCodewords = $ecBlocks->getECCodewordsPerBlock(); + $ecbArray = $ecBlocks->getECBlocks(); + } + foreach ($ecbArray as $ecBlock) { + $total += $ecBlock->getCount() * ($ecBlock->getDataCodewords() + $ecCodewords); + } + $this->totalCodewords = $total; + } + public function getVersionNumber() + { + return $this->versionNumber; + } + + public function getAlignmentPatternCenters() + { + return $this->alignmentPatternCenters; + } + + public function getTotalCodewords() + { + return $this->totalCodewords; + } + + public function getDimensionForVersion() + { + return 17 + 4 * $this->versionNumber; + } + + public function getECBlocksForLevel($ecLevel) + { + return $this->ecBlocks[$ecLevel->getOrdinal()]; + } + + /** + *

        Deduces version information purely from QR Code dimensions.

        + * + * @param dimension dimension in modules + * @return Version for a QR Code of that dimension + * @throws FormatException if dimension is not 1 mod 4 + */ + public static function getProvisionalVersionForDimension($dimension) + { + if ($dimension % 4 != 1) { + throw FormatException::getFormatInstance(); + } + try { + return self::getVersionForNumber(($dimension - 17) / 4); + } catch (\InvalidArgumentException $ignored) { + throw FormatException::getFormatInstance(); + } + } + + public static function getVersionForNumber($versionNumber) + { + if ($versionNumber < 1 || $versionNumber > 40) { + throw new \InvalidArgumentException(); + } + if(!self::$VERSIONS){ + + self::$VERSIONS = self::buildVersions(); + + } + return self::$VERSIONS[$versionNumber - 1]; + } + + static function decodeVersionInformation($versionBits) + { + $bestDifference = PHP_INT_MAX; + $bestVersion = 0; + for ($i = 0; $i < count(self::$VERSION_DECODE_INFO); $i++) { + $targetVersion = self::$VERSION_DECODE_INFO[$i]; +// Do the version info bits match exactly? done. + if ($targetVersion == $versionBits) { + return self::getVersionForNumber($i + 7); + } +// Otherwise see if this is the closest to a real version info bit string +// we have seen so far + $bitsDifference = FormatInformation::numBitsDiffering($versionBits, $targetVersion); + if ($bitsDifference < $bestDifference) { + $bestVersion = $i + 7; + $bestDifference = $bitsDifference; + } + } +// We can tolerate up to 3 bits of error since no two version info codewords will +// differ in less than 8 bits. + if ($bestDifference <= 3) { + return self::getVersionForNumber($bestVersion); + } +// If we didn't find a close enough match, fail + return null; + } + + /** + * See ISO 18004:2006 Annex E + */ + function buildFunctionPattern() + { + $dimension = self::getDimensionForVersion(); + $bitMatrix = new BitMatrix($dimension); + +// Top left finder pattern + separator + format + $bitMatrix->setRegion(0, 0, 9, 9); +// Top right finder pattern + separator + format + $bitMatrix->setRegion($dimension - 8, 0, 8, 9); +// Bottom left finder pattern + separator + format + $bitMatrix->setRegion(0, $dimension - 8, 9, 8); + +// Alignment patterns + $max = count($this->alignmentPatternCenters); + for ($x = 0; $x < $max; $x++) { + $i = $this->alignmentPatternCenters[$x] - 2; + for ($y = 0; $y < $max; $y++) { + if (($x == 0 && ($y == 0 || $y == $max - 1)) || ($x == $max - 1 && $y == 0)) { +// No alignment patterns near the three finder paterns + continue; + } + $bitMatrix->setRegion($this->alignmentPatternCenters[$y] - 2, $i, 5, 5); + } + } + +// Vertical timing pattern + $bitMatrix->setRegion(6, 9, 1, $dimension - 17); +// Horizontal timing pattern + $bitMatrix->setRegion(9, 6, $dimension - 17, 1); + + if ($this->versionNumber > 6) { +// Version info, top right + $bitMatrix->setRegion($dimension - 11, 0, 3, 6); +// Version info, bottom left + $bitMatrix->setRegion(0, $dimension - 11, 6, 3); + } + + return $bitMatrix; + } + /** + * See ISO 18004:2006 6.5.1 Table 9 + */ + private static function buildVersions() + { + + + return array( + new Version(1, array(), + array(new ECBlocks(7, array(new ECB(1, 19))), + new ECBlocks(10, array(new ECB(1, 16))), + new ECBlocks(13, array(new ECB(1, 13))), + new ECBlocks(17, array(new ECB(1, 9))))), + new Version(2, array(6, 18), + array(new ECBlocks(10, array(new ECB(1, 34))), + new ECBlocks(16, array(new ECB(1, 28))), + new ECBlocks(22, array(new ECB(1, 22))), + new ECBlocks(28, array(new ECB(1, 16))))), + new Version(3, array(6, 22), + array( new ECBlocks(15, array(new ECB(1, 55))), + new ECBlocks(26, array(new ECB(1, 44))), + new ECBlocks(18, array(new ECB(2, 17))), + new ECBlocks(22, array(new ECB(2, 13))))), + new Version(4, array(6, 26), + array(new ECBlocks(20, array(new ECB(1, 80))), + new ECBlocks(18, array(new ECB(2, 32))), + new ECBlocks(26, array(new ECB(2, 24))), + new ECBlocks(16, array(new ECB(4, 9))))), + new Version(5, array(6, 30), + array(new ECBlocks(26, array(new ECB(1, 108))), + new ECBlocks(24, array(new ECB(2, 43))), + new ECBlocks(18, array(new ECB(2, 15), + new ECB(2, 16))), + new ECBlocks(22, array(new ECB(2, 11), + new ECB(2, 12))))), + new Version(6, array(6, 34), + array(new ECBlocks(18, array(new ECB(2, 68))), + new ECBlocks(16, array(new ECB(4, 27))), + new ECBlocks(24, array(new ECB(4, 19))), + new ECBlocks(28, array(new ECB(4, 15))))), + new Version(7, array(6, 22, 38), + array(new ECBlocks(20, array(new ECB(2, 78))), + new ECBlocks(18, array(new ECB(4, 31))), + new ECBlocks(18, array(new ECB(2, 14), + new ECB(4, 15))), + new ECBlocks(26, array(new ECB(4, 13), + new ECB(1, 14))))), + new Version(8, array(6, 24, 42), + array(new ECBlocks(24, array(new ECB(2, 97))), + new ECBlocks(22, array(new ECB(2, 38), + new ECB(2, 39))), + new ECBlocks(22, array(new ECB(4, 18), + new ECB(2, 19))), + new ECBlocks(26, array(new ECB(4, 14), + new ECB(2, 15))))), + new Version(9, array(6, 26, 46), + array(new ECBlocks(30, array(new ECB(2, 116))), + new ECBlocks(22, array(new ECB(3, 36), + new ECB(2, 37))), + new ECBlocks(20, array(new ECB(4, 16), + new ECB(4, 17))), + new ECBlocks(24, array(new ECB(4, 12), + new ECB(4, 13))))), + new Version(10, array(6, 28, 50), + array(new ECBlocks(18, array(new ECB(2, 68), + new ECB(2, 69))), + new ECBlocks(26, array(new ECB(4, 43), + new ECB(1, 44))), + new ECBlocks(24, array(new ECB(6, 19), + new ECB(2, 20))), + new ECBlocks(28, array(new ECB(6, 15), + new ECB(2, 16))))), + new Version(11, array(6, 30, 54), + array(new ECBlocks(20, array(new ECB(4, 81))), + new ECBlocks(30, array(new ECB(1, 50), + new ECB(4, 51))), + new ECBlocks(28, array(new ECB(4, 22), + new ECB(4, 23))), + new ECBlocks(24, array(new ECB(3, 12), + new ECB(8, 13))))), + new Version(12, array(6, 32, 58), + array(new ECBlocks(24, array(new ECB(2, 92), + new ECB(2, 93))), + new ECBlocks(22, array(new ECB(6, 36), + new ECB(2, 37))), + new ECBlocks(26, array(new ECB(4, 20), + new ECB(6, 21))), + new ECBlocks(28, array(new ECB(7, 14), + new ECB(4, 15))))), + new Version(13, array(6, 34, 62), + array(new ECBlocks(26, array(new ECB(4, 107))), + new ECBlocks(22, array(new ECB(8, 37), + new ECB(1, 38))), + new ECBlocks(24, array(new ECB(8, 20), + new ECB(4, 21))), + new ECBlocks(22, array(new ECB(12, 11), + new ECB(4, 12))))), + new Version(14, array(6, 26, 46, 66), + array(new ECBlocks(30, array(new ECB(3, 115), + new ECB(1, 116))), + new ECBlocks(24, array(new ECB(4, 40), + new ECB(5, 41))), + new ECBlocks(20, array(new ECB(11, 16), + new ECB(5, 17))), + new ECBlocks(24, array(new ECB(11, 12), + new ECB(5, 13))))), + new Version(15, array(6, 26, 48, 70), + array(new ECBlocks(22, array(new ECB(5, 87), + new ECB(1, 88))), + new ECBlocks(24, array(new ECB(5, 41), + new ECB(5, 42))), + new ECBlocks(30, array(new ECB(5, 24), + new ECB(7, 25))), + new ECBlocks(24, array(new ECB(11, 12), + new ECB(7, 13))))), + new Version(16, array(6, 26, 50, 74), + array(new ECBlocks(24, array(new ECB(5, 98), + new ECB(1, 99))), + new ECBlocks(28, array(new ECB(7, 45), + new ECB(3, 46))), + new ECBlocks(24, array(new ECB(15, 19), + new ECB(2, 20))), + new ECBlocks(30, array(new ECB(3, 15), + new ECB(13, 16))))), + new Version(17, array(6, 30, 54, 78), + array(new ECBlocks(28, array(new ECB(1, 107), + new ECB(5, 108))), + new ECBlocks(28, array(new ECB(10, 46), + new ECB(1, 47))), + new ECBlocks(28, array(new ECB(1, 22), + new ECB(15, 23))), + new ECBlocks(28, array(new ECB(2, 14), + new ECB(17, 15))))), + new Version(18, array(6, 30, 56, 82), + array(new ECBlocks(30, array(new ECB(5, 120), + new ECB(1, 121))), + new ECBlocks(26, array(new ECB(9, 43), + new ECB(4, 44))), + new ECBlocks(28, array(new ECB(17, 22), + new ECB(1, 23))), + new ECBlocks(28, array(new ECB(2, 14), + new ECB(19, 15))))), + new Version(19, array(6, 30, 58, 86), + array(new ECBlocks(28, array(new ECB(3, 113), + new ECB(4, 114))), + new ECBlocks(26, array(new ECB(3, 44), + new ECB(11, 45))), + new ECBlocks(26, array(new ECB(17, 21), + new ECB(4, 22))), + new ECBlocks(26, array(new ECB(9, 13), + new ECB(16, 14))))), + new Version(20, array(6, 34, 62, 90), + array(new ECBlocks(28, array(new ECB(3, 107), + new ECB(5, 108))), + new ECBlocks(26, array(new ECB(3, 41), + new ECB(13, 42))), + new ECBlocks(30, array(new ECB(15, 24), + new ECB(5, 25))), + new ECBlocks(28, array(new ECB(15, 15), + new ECB(10, 16))))), + new Version(21, array(6, 28, 50, 72, 94), + array( new ECBlocks(28, array(new ECB(4, 116), + new ECB(4, 117))), + new ECBlocks(26, array(new ECB(17, 42))), + new ECBlocks(28, array(new ECB(17, 22), + new ECB(6, 23))), + new ECBlocks(30, array(new ECB(19, 16), + new ECB(6, 17))))), + new Version(22, array(6, 26, 50, 74, 98), + array(new ECBlocks(28, array(new ECB(2, 111), + new ECB(7, 112))), + new ECBlocks(28, array(new ECB(17, 46))), + new ECBlocks(30, array(new ECB(7, 24), + new ECB(16, 25))), + new ECBlocks(24, array(new ECB(34, 13))))), + new Version(23, array(6, 30, 54, 78, 102), + new ECBlocks(30, array(new ECB(4, 121), + new ECB(5, 122))), + new ECBlocks(28, array(new ECB(4, 47), + new ECB(14, 48))), + new ECBlocks(30, array(new ECB(11, 24), + new ECB(14, 25))), + new ECBlocks(30, array(new ECB(16, 15), + new ECB(14, 16)))), + new Version(24, array(6, 28, 54, 80, 106), + array(new ECBlocks(30, array(new ECB(6, 117), + new ECB(4, 118))), + new ECBlocks(28, array(new ECB(6, 45), + new ECB(14, 46))), + new ECBlocks(30, array(new ECB(11, 24), + new ECB(16, 25))), + new ECBlocks(30, array(new ECB(30, 16), + new ECB(2, 17))))), + new Version(25, array(6, 32, 58, 84, 110), + array(new ECBlocks(26, array(new ECB(8, 106), + new ECB(4, 107))), + new ECBlocks(28, array(new ECB(8, 47), + new ECB(13, 48))), + new ECBlocks(30, array(new ECB(7, 24), + new ECB(22, 25))), + new ECBlocks(30, array(new ECB(22, 15), + new ECB(13, 16))))), + new Version(26, array(6, 30, 58, 86, 114), + array(new ECBlocks(28, array(new ECB(10, 114), + new ECB(2, 115))), + new ECBlocks(28, array(new ECB(19, 46), + new ECB(4, 47))), + new ECBlocks(28, array(new ECB(28, 22), + new ECB(6, 23))), + new ECBlocks(30, array(new ECB(33, 16), + new ECB(4, 17))))), + new Version(27, array(6, 34, 62, 90, 118), + array(new ECBlocks(30, array(new ECB(8, 122), + new ECB(4, 123))), + new ECBlocks(28, array(new ECB(22, 45), + new ECB(3, 46))), + new ECBlocks(30, array(new ECB(8, 23), + new ECB(26, 24))), + new ECBlocks(30, array(new ECB(12, 15), + new ECB(28, 16))))), + new Version(28, array(6, 26, 50, 74, 98, 122), + array(new ECBlocks(30, array(new ECB(3, 117), + new ECB(10, 118))), + new ECBlocks(28, array(new ECB(3, 45), + new ECB(23, 46))), + new ECBlocks(30, array(new ECB(4, 24), + new ECB(31, 25))), + new ECBlocks(30, array(new ECB(11, 15), + new ECB(31, 16))))), + new Version(29, array(6, 30, 54, 78, 102, 126), + array(new ECBlocks(30, array(new ECB(7, 116), + new ECB(7, 117))), + new ECBlocks(28, array(new ECB(21, 45), + new ECB(7, 46))), + new ECBlocks(30, array(new ECB(1, 23), + new ECB(37, 24))), + new ECBlocks(30, array(new ECB(19, 15), + new ECB(26, 16))))), + new Version(30, array(6, 26, 52, 78, 104, 130), + array(new ECBlocks(30, array(new ECB(5, 115), + new ECB(10, 116))), + new ECBlocks(28, array(new ECB(19, 47), + new ECB(10, 48))), + new ECBlocks(30, array(new ECB(15, 24), + new ECB(25, 25))), + new ECBlocks(30, array(new ECB(23, 15), + new ECB(25, 16))))), + new Version(31, array(6, 30, 56, 82, 108, 134), + array(new ECBlocks(30, array(new ECB(13, 115), + new ECB(3, 116))), + new ECBlocks(28, array(new ECB(2, 46), + new ECB(29, 47))), + new ECBlocks(30, array(new ECB(42, 24), + new ECB(1, 25))), + new ECBlocks(30, array(new ECB(23, 15), + new ECB(28, 16))))), + new Version(32, array(6, 34, 60, 86, 112, 138), + array(new ECBlocks(30, array(new ECB(17, 115))), + new ECBlocks(28, array(new ECB(10, 46), + new ECB(23, 47))), + new ECBlocks(30, array(new ECB(10, 24), + new ECB(35, 25))), + new ECBlocks(30, array(new ECB(19, 15), + new ECB(35, 16))))), + new Version(33, array(6, 30, 58, 86, 114, 142), + array(new ECBlocks(30, array(new ECB(17, 115), + new ECB(1, 116))), + new ECBlocks(28, array(new ECB(14, 46), + new ECB(21, 47))), + new ECBlocks(30, array(new ECB(29, 24), + new ECB(19, 25))), + new ECBlocks(30, array(new ECB(11, 15), + new ECB(46, 16))))), + new Version(34, array(6, 34, 62, 90, 118, 146), + array(new ECBlocks(30, array(new ECB(13, 115), + new ECB(6, 116))), + new ECBlocks(28, array(new ECB(14, 46), + new ECB(23, 47))), + new ECBlocks(30, array(new ECB(44, 24), + new ECB(7, 25))), + new ECBlocks(30, array(new ECB(59, 16), + new ECB(1, 17))))), + new Version(35, array(6, 30, 54, 78, 102, 126, 150), + array(new ECBlocks(30, array(new ECB(12, 121), + new ECB(7, 122))), + new ECBlocks(28, array(new ECB(12, 47), + new ECB(26, 48))), + new ECBlocks(30, array(new ECB(39, 24), + new ECB(14, 25))), + new ECBlocks(30, array(new ECB(22, 15), + new ECB(41, 16))))), + new Version(36, array(6, 24, 50, 76, 102, 128, 154), + array(new ECBlocks(30, array(new ECB(6, 121), + new ECB(14, 122))), + new ECBlocks(28, array(new ECB(6, 47), + new ECB(34, 48))), + new ECBlocks(30, array(new ECB(46, 24), + new ECB(10, 25))), + new ECBlocks(30, array(new ECB(2, 15), + new ECB(64, 16))))), + new Version(37, array(6, 28, 54, 80, 106, 132, 158), + array(new ECBlocks(30, array(new ECB(17, 122), + new ECB(4, 123))), + new ECBlocks(28, array(new ECB(29, 46), + new ECB(14, 47))), + new ECBlocks(30, array(new ECB(49, 24), + new ECB(10, 25))), + new ECBlocks(30, array(new ECB(24, 15), + new ECB(46, 16))))), + new Version(38, array(6, 32, 58, 84, 110, 136, 162), + array(new ECBlocks(30, array(new ECB(4, 122), + new ECB(18, 123))), + new ECBlocks(28, array(new ECB(13, 46), + new ECB(32, 47))), + new ECBlocks(30, array(new ECB(48, 24), + new ECB(14, 25))), + new ECBlocks(30, array(new ECB(42, 15), + new ECB(32, 16))))), + new Version(39, array(6, 26, 54, 82, 110, 138, 166), + array(new ECBlocks(30, array(new ECB(20, 117), + new ECB(4, 118))), + new ECBlocks(28, array(new ECB(40, 47), + new ECB(7, 48))), + new ECBlocks(30, array(new ECB(43, 24), + new ECB(22, 25))), + new ECBlocks(30, array(new ECB(10, 15), + new ECB(67, 16))))), + new Version(40, array(6, 30, 58, 86, 114, 142, 170), + array(new ECBlocks(30, array(new ECB(19, 118), + new ECB(6, 119))), + new ECBlocks(28, array(new ECB(18, 47), + new ECB(31, 48))), + new ECBlocks(30, array(new ECB(34, 24), + new ECB(34, 25))), + new ECBlocks(30, array(new ECB(20, 15), + new ECB(61, 16))))) + ); + } +} + +/** + *

        Encapsulates a set of error-correction blocks in one symbol version. Most versions will + * use blocks of differing sizes within one version, so, this encapsulates the parameters for + * each set of blocks. It also holds the number of error-correction codewords per block since it + * will be the same across all blocks within one version.

        + */ +final class ECBlocks +{ + private $ecCodewordsPerBlock; + private $ecBlocks; + + function __construct($ecCodewordsPerBlock, $ecBlocks) + { + $this->ecCodewordsPerBlock = $ecCodewordsPerBlock; + $this->ecBlocks = $ecBlocks; + } + + public function getECCodewordsPerBlock() + { + return $this->ecCodewordsPerBlock; + } + + public function getNumBlocks() + { + $total = 0; + foreach ($this->ecBlocks as $ecBlock) { + $total += $ecBlock->getCount(); + } + return $total; + } + + public function getTotalECCodewords() + { + return $this->ecCodewordsPerBlock * $this->getNumBlocks(); + } + + public function getECBlocks() + { + return $this->ecBlocks; + } +} + +/** + *

        Encapsualtes the parameters for one error-correction block in one symbol version. + * This includes the number of data codewords, and the number of times a block with these + * parameters is used consecutively in the QR code version's format.

        + */ +final class ECB +{ + private $count; + private $dataCodewords; + + function __construct($count, $dataCodewords) + { + $this->count = $count; + $this->dataCodewords = $dataCodewords; + } + + public function getCount() + { + return $this->count; + } + + public function getDataCodewords() + { + return $this->dataCodewords; + } + + +//@Override + public function toString() + { + die('Version ECB toString()'); + // return parent::$versionNumber; + } + + +} + + diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Detector/AlignmentPattern.php b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Detector/AlignmentPattern.php new file mode 100644 index 0000000..9c3091a --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Detector/AlignmentPattern.php @@ -0,0 +1,65 @@ +Encapsulates an alignment pattern, which are the smaller square patterns found in + * all but the simplest QR Codes.

        + * + * @author Sean Owen + */ +final class AlignmentPattern extends ResultPoint +{ + private $estimatedModuleSize; + + public function __construct($posX, $posY, $estimatedModuleSize) + { + parent::__construct($posX, $posY); + $this->estimatedModuleSize = $estimatedModuleSize; + } + + /** + *

        Determines if this alignment pattern "about equals" an alignment pattern at the stated + * position and size -- meaning, it is at nearly the same center with nearly the same size.

        + */ + public function aboutEquals($moduleSize, $i, $j) + { + if (abs($i - $this->getY()) <= $moduleSize && abs($j - $this->getX()) <= $moduleSize) { + $moduleSizeDiff = abs($moduleSize - $this->estimatedModuleSize); + + return $moduleSizeDiff <= 1.0 || $moduleSizeDiff <= $this->estimatedModuleSize; + } + + return false; + } + + /** + * Combines this object's current estimate of a finder pattern position and module size + * with a new estimate. It returns a new {@code FinderPattern} containing an average of the two. + */ + public function combineEstimate($i, $j, $newModuleSize) + { + $combinedX = ($this->getX() + $j) / 2.0; + $combinedY = ($this->getY() + $i) / 2.0; + $combinedModuleSize = ($this->estimatedModuleSize + $newModuleSize) / 2.0; + + return new AlignmentPattern($combinedX, $combinedY, $combinedModuleSize); + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Detector/AlignmentPatternFinder.php b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Detector/AlignmentPatternFinder.php new file mode 100644 index 0000000..499c6b4 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Detector/AlignmentPatternFinder.php @@ -0,0 +1,286 @@ +This class attempts to find alignment patterns in a QR Code. Alignment patterns look like finder + * patterns but are smaller and appear at regular intervals throughout the image.

        + * + *

        At the moment this only looks for the bottom-right alignment pattern.

        + * + *

        This is mostly a simplified copy of {@link FinderPatternFinder}. It is copied, + * pasted and stripped down here for maximum performance but does unfortunately duplicate + * some code.

        + * + *

        This class is thread-safe but not reentrant. Each thread must allocate its own object.

        + * + * @author Sean Owen + */ +final class AlignmentPatternFinder +{ + private $image; + private $possibleCenters; + private $startX; + private $startY; + private $width; + private $height; + private $moduleSize; + private $crossCheckStateCount; + private $resultPointCallback; + + /** + *

        Creates a finder that will look in a portion of the whole image.

        + * + * @param image image to search + * @param startX left column from which to start searching + * @param startY top row from which to start searching + * @param width width of region to search + * @param height height of region to search + * @param moduleSize estimated module size so far + */ + public function __construct($image, + $startX, + $startY, + $width, + $height, + $moduleSize, + $resultPointCallback) + { + $this->image = $image; + $this->possibleCenters = []; + $this->startX = $startX; + $this->startY = $startY; + $this->width = $width; + $this->height = $height; + $this->moduleSize = $moduleSize; + $this->crossCheckStateCount = []; + $this->resultPointCallback = $resultPointCallback; + } + + /** + *

        This method attempts to find the bottom-right alignment pattern in the image. It is a bit messy since + * it's pretty performance-critical and so is written to be fast foremost.

        + * + * @return {@link AlignmentPattern} if found + * @throws NotFoundException if not found + */ + public function find() + { + $startX = $this->startX; + $height = $this->height; + $maxJ = $startX + $this->width; + $middleI = $this->startY + ($height / 2); + // We are looking for black/white/black modules in 1:1:1 ratio; + // this tracks the number of black/white/black modules seen so far + $stateCount = []; + for ($iGen = 0; $iGen < $height; $iGen++) { + // Search from middle outwards + $i = $middleI + (($iGen & 0x01) == 0 ? ($iGen + 1) / 2 : -(($iGen + 1) / 2)); + $i = (int)($i); + $stateCount[0] = 0; + $stateCount[1] = 0; + $stateCount[2] = 0; + $j = $startX; + // Burn off leading white pixels before anything else; if we start in the middle of + // a white run, it doesn't make sense to count its length, since we don't know if the + // white run continued to the left of the start point + while ($j < $maxJ && !$this->image->get($j, $i)) { + $j++; + } + $currentState = 0; + while ($j < $maxJ) { + if ($this->image->get($j, $i)) { + // Black pixel + if ($currentState == 1) { // Counting black pixels + $stateCount[$currentState]++; + } else { // Counting white pixels + if ($currentState == 2) { // A winner? + if ($this->foundPatternCross($stateCount)) { // Yes + $confirmed = $this->handlePossibleCenter($stateCount, $i, $j); + if ($confirmed != null) { + return $confirmed; + } + } + $stateCount[0] = $stateCount[2]; + $stateCount[1] = 1; + $stateCount[2] = 0; + $currentState = 1; + } else { + $stateCount[++$currentState]++; + } + } + } else { // White pixel + if ($currentState == 1) { // Counting black pixels + $currentState++; + } + $stateCount[$currentState]++; + } + $j++; + } + if ($this->foundPatternCross($stateCount)) { + $confirmed = $this->handlePossibleCenter($stateCount, $i, $maxJ); + if ($confirmed != null) { + return $confirmed; + } + } + + } + + // Hmm, nothing we saw was observed and confirmed twice. If we had + // any guess at all, return it. + if (count($this->possibleCenters)) { + return $this->possibleCenters[0]; + } + + throw NotFoundException::getNotFoundInstance(); + } + + /** + * @param stateCount count of black/white/black pixels just read + * + * @return true iff the proportions of the counts is close enough to the 1/1/1 ratios + * used by alignment patterns to be considered a match + */ + private function foundPatternCross($stateCount) + { + $moduleSize = $this->moduleSize; + $maxVariance = $moduleSize / 2.0; + for ($i = 0; $i < 3; $i++) { + if (abs($moduleSize - $stateCount[$i]) >= $maxVariance) { + return false; + } + } + + return true; + } + + /** + *

        This is called when a horizontal scan finds a possible alignment pattern. It will + * cross check with a vertical scan, and if successful, will see if this pattern had been + * found on a previous horizontal scan. If so, we consider it confirmed and conclude we have + * found the alignment pattern.

        + * + * @param stateCount reading state module counts from horizontal scan + * @param i row where alignment pattern may be found + * @param j end of possible alignment pattern in row + * + * @return {@link AlignmentPattern} if we have found the same pattern twice, or null if not + */ + private function handlePossibleCenter($stateCount, $i, $j) + { + $stateCountTotal = $stateCount[0] + $stateCount[1] + $stateCount[2]; + $centerJ = $this->centerFromEnd($stateCount, $j); + $centerI = $this->crossCheckVertical($i, (int)$centerJ, 2 * $stateCount[1], $stateCountTotal); + if (!is_nan($centerI)) { + $estimatedModuleSize = (float)($stateCount[0] + $stateCount[1] + $stateCount[2]) / 3.0; + foreach ($this->possibleCenters as $center) { + // Look for about the same center and module size: + if ($center->aboutEquals($estimatedModuleSize, $centerI, $centerJ)) { + return $center->combineEstimate($centerI, $centerJ, $estimatedModuleSize); + } + } + // Hadn't found this before; save it + $point = new AlignmentPattern($centerJ, $centerI, $estimatedModuleSize); + $this->possibleCenters[] = $point; + if ($this->resultPointCallback != null) { + $this->resultPointCallback->foundPossibleResultPoint($point); + } + } + + return null; + } + + /** + * Given a count of black/white/black pixels just seen and an end position, + * figures the location of the center of this black/white/black run. + */ + private static function centerFromEnd($stateCount, $end) + { + return (float)($end - $stateCount[2]) - $stateCount[1] / 2.0; + } + + /** + *

        After a horizontal scan finds a potential alignment pattern, this method + * "cross-checks" by scanning down vertically through the center of the possible + * alignment pattern to see if the same proportion is detected.

        + * + * @param startI row where an alignment pattern was detected + * @param centerJ center of the section that appears to cross an alignment pattern + * @param maxCount maximum reasonable number of modules that should be + * observed in any reading state, based on the results of the horizontal scan + * + * @return vertical center of alignment pattern, or {@link Float#NaN} if not found + */ + private function crossCheckVertical($startI, $centerJ, $maxCount, + $originalStateCountTotal) + { + $image = $this->image; + + $maxI = $image->getHeight(); + $stateCount = $this->crossCheckStateCount; + $stateCount[0] = 0; + $stateCount[1] = 0; + $stateCount[2] = 0; + + // Start counting up from center + $i = $startI; + while ($i >= 0 && $image->get($centerJ, $i) && $stateCount[1] <= $maxCount) { + $stateCount[1]++; + $i--; + } + // If already too many modules in this state or ran off the edge: + if ($i < 0 || $stateCount[1] > $maxCount) { + return NAN; + } + while ($i >= 0 && !$image->get($centerJ, $i) && $stateCount[0] <= $maxCount) { + $stateCount[0]++; + $i--; + } + if ($stateCount[0] > $maxCount) { + return NAN; + } + + // Now also count down from center + $i = $startI + 1; + while ($i < $maxI && $image->get($centerJ, $i) && $stateCount[1] <= $maxCount) { + $stateCount[1]++; + $i++; + } + if ($i == $maxI || $stateCount[1] > $maxCount) { + return NAN; + } + while ($i < $maxI && !$image->get($centerJ, $i) && $stateCount[2] <= $maxCount) { + $stateCount[2]++; + $i++; + } + if ($stateCount[2] > $maxCount) { + return NAN; + } + + $stateCountTotal = $stateCount[0] + $stateCount[1] + $stateCount[2]; + if (5 * abs($stateCountTotal - $originalStateCountTotal) >= 2 * $originalStateCountTotal) { + return NAN; + } + + return $this->foundPatternCross($stateCount) ? $this->centerFromEnd($stateCount, $i) : NAN; + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Detector/Detector.php b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Detector/Detector.php new file mode 100644 index 0000000..897dbb2 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Detector/Detector.php @@ -0,0 +1,420 @@ +Encapsulates logic that can detect a QR Code in an image, even if the QR Code + * is rotated or skewed, or partially obscured.

        + * + * @author Sean Owen + */ +class Detector +{ + + private $image; + private $resultPointCallback; + + public function __construct($image) + { + $this->image = $image; + } + + /** + *

        Detects a QR Code in an image.

        + * + * @param hints optional hints to detector + * + * @return {@link DetectorResult} encapsulating results of detecting a QR Code + * @throws NotFoundException if QR Code cannot be found + * @throws FormatException if a QR Code cannot be decoded + */ + public final function detect($hints = null) + {/*Map*/ + + $resultPointCallback = $hints == null ? null : + $hints->get('NEED_RESULT_POINT_CALLBACK'); + /* resultPointCallback = hints == null ? null : + (ResultPointCallback) hints.get(DecodeHintType.NEED_RESULT_POINT_CALLBACK);*/ + $finder = new FinderPatternFinder($this->image, $resultPointCallback); + $info = $finder->find($hints); + + return $this->processFinderPatternInfo($info); + } + + protected final function processFinderPatternInfo($info) + { + + $topLeft = $info->getTopLeft(); + $topRight = $info->getTopRight(); + $bottomLeft = $info->getBottomLeft(); + + $moduleSize = (float)$this->calculateModuleSize($topLeft, $topRight, $bottomLeft); + if ($moduleSize < 1.0) { + throw NotFoundException::getNotFoundInstance(); + } + $dimension = (int)self::computeDimension($topLeft, $topRight, $bottomLeft, $moduleSize); + $provisionalVersion = \Zxing\Qrcode\Decoder\Version::getProvisionalVersionForDimension($dimension); + $modulesBetweenFPCenters = $provisionalVersion->getDimensionForVersion() - 7; + + $alignmentPattern = null; +// Anything above version 1 has an alignment pattern + if (count($provisionalVersion->getAlignmentPatternCenters()) > 0) { + +// Guess where a "bottom right" finder pattern would have been + $bottomRightX = $topRight->getX() - $topLeft->getX() + $bottomLeft->getX(); + $bottomRightY = $topRight->getY() - $topLeft->getY() + $bottomLeft->getY(); + +// Estimate that alignment pattern is closer by 3 modules +// from "bottom right" to known top left location + $correctionToTopLeft = 1.0 - 3.0 / (float)$modulesBetweenFPCenters; + $estAlignmentX = (int)($topLeft->getX() + $correctionToTopLeft * ($bottomRightX - $topLeft->getX())); + $estAlignmentY = (int)($topLeft->getY() + $correctionToTopLeft * ($bottomRightY - $topLeft->getY())); + +// Kind of arbitrary -- expand search radius before giving up + for ($i = 4; $i <= 16; $i <<= 1) {//?????????? + try { + $alignmentPattern = $this->findAlignmentInRegion( + $moduleSize, + $estAlignmentX, + $estAlignmentY, + (float)$i + ); + break; + } catch (NotFoundException $re) { +// try next round + } + } +// If we didn't find alignment pattern... well try anyway without it + } + + $transform = self::createTransform($topLeft, $topRight, $bottomLeft, $alignmentPattern, $dimension); + + $bits = self::sampleGrid($this->image, $transform, $dimension); + + $points = []; + if ($alignmentPattern == null) { + $points = [$bottomLeft, $topLeft, $topRight]; + } else { + // die('$points = new ResultPoint[]{bottomLeft, topLeft, topRight, alignmentPattern};'); + $points = [$bottomLeft, $topLeft, $topRight, $alignmentPattern]; + } + + return new DetectorResult($bits, $points); + } + + /** + *

        Detects a QR Code in an image.

        + * + * @return {@link DetectorResult} encapsulating results of detecting a QR Code + * @throws NotFoundException if QR Code cannot be found + * @throws FormatException if a QR Code cannot be decoded + */ + + /** + *

        Computes an average estimated module size based on estimated derived from the positions + * of the three finder patterns.

        + * + * @param topLeft detected top-left finder pattern center + * @param topRight detected top-right finder pattern center + * @param bottomLeft detected bottom-left finder pattern center + * + * @return estimated module size + */ + protected final function calculateModuleSize($topLeft, $topRight, $bottomLeft) + { +// Take the average + return ($this->calculateModuleSizeOneWay($topLeft, $topRight) + + $this->calculateModuleSizeOneWay($topLeft, $bottomLeft)) / 2.0; + } + + /** + *

        Estimates module size based on two finder patterns -- it uses + * {@link #sizeOfBlackWhiteBlackRunBothWays(int, int, int, int)} to figure the + * width of each, measuring along the axis between their centers.

        + */ + private function calculateModuleSizeOneWay($pattern, $otherPattern) + { + $moduleSizeEst1 = $this->sizeOfBlackWhiteBlackRunBothWays($pattern->getX(), + (int)$pattern->getY(), + (int)$otherPattern->getX(), + (int)$otherPattern->getY()); + $moduleSizeEst2 = $this->sizeOfBlackWhiteBlackRunBothWays((int)$otherPattern->getX(), + (int)$otherPattern->getY(), + (int)$pattern->getX(), + (int)$pattern->getY()); + if (is_nan($moduleSizeEst1)) { + return $moduleSizeEst2 / 7.0; + } + if (is_nan($moduleSizeEst2)) { + return $moduleSizeEst1 / 7.0; + } +// Average them, and divide by 7 since we've counted the width of 3 black modules, +// and 1 white and 1 black module on either side. Ergo, divide sum by 14. + return ($moduleSizeEst1 + $moduleSizeEst2) / 14.0; + } + + /** + * See {@link #sizeOfBlackWhiteBlackRun(int, int, int, int)}; computes the total width of + * a finder pattern by looking for a black-white-black run from the center in the direction + * of another po$(another finder pattern center), and in the opposite direction too.

        + */ + private function sizeOfBlackWhiteBlackRunBothWays($fromX, $fromY, $toX, $toY) + { + + $result = $this->sizeOfBlackWhiteBlackRun($fromX, $fromY, $toX, $toY); + +// Now count other way -- don't run off image though of course + $scale = 1.0; + $otherToX = $fromX - ($toX - $fromX); + if ($otherToX < 0) { + $scale = (float)$fromX / (float)($fromX - $otherToX); + $otherToX = 0; + } else if ($otherToX >= $this->image->getWidth()) { + $scale = (float)($this->image->getWidth() - 1 - $fromX) / (float)($otherToX - $fromX); + $otherToX = $this->image->getWidth() - 1; + } + $otherToY = (int)($fromY - ($toY - $fromY) * $scale); + + $scale = 1.0; + if ($otherToY < 0) { + $scale = (float)$fromY / (float)($fromY - $otherToY); + $otherToY = 0; + } else if ($otherToY >= $this->image->getHeight()) { + $scale = (float)($this->image->getHeight() - 1 - $fromY) / (float)($otherToY - $fromY); + $otherToY = $this->image->getHeight() - 1; + } + $otherToX = (int)($fromX + ($otherToX - $fromX) * $scale); + + $result += $this->sizeOfBlackWhiteBlackRun($fromX, $fromY, $otherToX, $otherToY); + +// Middle pixel is double-counted this way; subtract 1 + return $result - 1.0; + } + + /** + *

        This method traces a line from a po$in the image, in the direction towards another point. + * It begins in a black region, and keeps going until it finds white, then black, then white again. + * It reports the distance from the start to this point.

        + * + *

        This is used when figuring out how wide a finder pattern is, when the finder pattern + * may be skewed or rotated.

        + */ + private function sizeOfBlackWhiteBlackRun($fromX, $fromY, $toX, $toY) + { +// Mild variant of Bresenham's algorithm; +// see http://en.wikipedia.org/wiki/Bresenham's_line_algorithm + $steep = abs($toY - $fromY) > abs($toX - $fromX); + if ($steep) { + $temp = $fromX; + $fromX = $fromY; + $fromY = $temp; + $temp = $toX; + $toX = $toY; + $toY = $temp; + } + + $dx = abs($toX - $fromX); + $dy = abs($toY - $fromY); + $error = -$dx / 2; + $xstep = $fromX < $toX ? 1 : -1; + $ystep = $fromY < $toY ? 1 : -1; + +// In black pixels, looking for white, first or second time. + $state = 0; +// Loop up until x == toX, but not beyond + $xLimit = $toX + $xstep; + for ($x = $fromX, $y = $fromY; $x != $xLimit; $x += $xstep) { + $realX = $steep ? $y : $x; + $realY = $steep ? $x : $y; + +// Does current pixel mean we have moved white to black or vice versa? +// Scanning black in state 0,2 and white in state 1, so if we find the wrong +// color, advance to next state or end if we are in state 2 already + if (($state == 1) == $this->image->get($realX, $realY)) { + if ($state == 2) { + return MathUtils::distance($x, $y, $fromX, $fromY); + } + $state++; + } + + $error += $dy; + if ($error > 0) { + if ($y == $toY) { + break; + } + $y += $ystep; + $error -= $dx; + } + } +// Found black-white-black; give the benefit of the doubt that the next pixel outside the image +// is "white" so this last po$at (toX+xStep,toY) is the right ending. This is really a +// small approximation; (toX+xStep,toY+yStep) might be really correct. Ignore this. + if ($state == 2) { + return MathUtils::distance($toX + $xstep, $toY, $fromX, $fromY); + } + +// else we didn't find even black-white-black; no estimate is really possible + return NAN; + } + + /** + *

        Computes the dimension (number of modules on a size) of the QR Code based on the position + * of the finder patterns and estimated module size.

        + */ + private static function computeDimension($topLeft, + $topRight, + $bottomLeft, + $moduleSize) + { + $tltrCentersDimension = MathUtils::round(ResultPoint::distance($topLeft, $topRight) / $moduleSize); + $tlblCentersDimension = MathUtils::round(ResultPoint::distance($topLeft, $bottomLeft) / $moduleSize); + $dimension = (($tltrCentersDimension + $tlblCentersDimension) / 2) + 7; + switch ($dimension & 0x03) { // mod 4 + case 0: + $dimension++; + break; +// 1? do nothing + case 2: + $dimension--; + break; + case 3: + throw NotFoundException::getNotFoundInstance(); + } + + return $dimension; + } + + /** + *

        Attempts to locate an alignment pattern in a limited region of the image, which is + * guessed to contain it. This method uses {@link AlignmentPattern}.

        + * + * @param overallEstModuleSize estimated module size so far + * @param estAlignmentX x coordinate of center of area probably containing alignment pattern + * @param estAlignmentY y coordinate of above + * @param allowanceFactor number of pixels in all directions to search from the center + * + * @return {@link AlignmentPattern} if found, or null otherwise + * @throws NotFoundException if an unexpected error occurs during detection + */ + protected final function findAlignmentInRegion($overallEstModuleSize, + $estAlignmentX, + $estAlignmentY, + $allowanceFactor) + { +// Look for an alignment pattern (3 modules in size) around where it +// should be + $allowance = (int)($allowanceFactor * $overallEstModuleSize); + $alignmentAreaLeftX = max(0, $estAlignmentX - $allowance); + $alignmentAreaRightX = min($this->image->getWidth() - 1, $estAlignmentX + $allowance); + if ($alignmentAreaRightX - $alignmentAreaLeftX < $overallEstModuleSize * 3) { + throw NotFoundException::getNotFoundInstance(); + } + + $alignmentAreaTopY = max(0, $estAlignmentY - $allowance); + $alignmentAreaBottomY = min($this->image->getHeight() - 1, $estAlignmentY + $allowance); + if ($alignmentAreaBottomY - $alignmentAreaTopY < $overallEstModuleSize * 3) { + throw NotFoundException::getNotFoundInstance(); + } + + $alignmentFinder = + new AlignmentPatternFinder( + $this->image, + $alignmentAreaLeftX, + $alignmentAreaTopY, + $alignmentAreaRightX - $alignmentAreaLeftX, + $alignmentAreaBottomY - $alignmentAreaTopY, + $overallEstModuleSize, + $this->resultPointCallback); + + return $alignmentFinder->find(); + } + + private static function createTransform($topLeft, + $topRight, + $bottomLeft, + $alignmentPattern, + $dimension) + { + $dimMinusThree = (float)$dimension - 3.5; + $bottomRightX = 0.0; + $bottomRightY = 0.0; + $sourceBottomRightX = 0.0; + $sourceBottomRightY = 0.0; + if ($alignmentPattern != null) { + $bottomRightX = $alignmentPattern->getX(); + $bottomRightY = $alignmentPattern->getY(); + $sourceBottomRightX = $dimMinusThree - 3.0; + $sourceBottomRightY = $sourceBottomRightX; + } else { +// Don't have an alignment pattern, just make up the bottom-right point + $bottomRightX = ($topRight->getX() - $topLeft->getX()) + $bottomLeft->getX(); + $bottomRightY = ($topRight->getY() - $topLeft->getY()) + $bottomLeft->getY(); + $sourceBottomRightX = $dimMinusThree; + $sourceBottomRightY = $dimMinusThree; + } + + return PerspectiveTransform::quadrilateralToQuadrilateral( + 3.5, + 3.5, + $dimMinusThree, + 3.5, + $sourceBottomRightX, + $sourceBottomRightY, + 3.5, + $dimMinusThree, + $topLeft->getX(), + $topLeft->getY(), + $topRight->getX(), + $topRight->getY(), + $bottomRightX, + $bottomRightY, + $bottomLeft->getX(), + $bottomLeft->getY()); + } + + private static function sampleGrid($image, $transform, + $dimension) + { + $sampler = GridSampler::getInstance(); + + return $sampler->sampleGrid_($image, $dimension, $dimension, $transform); + } + + protected final function getImage() + { + return $this->image; + } + + protected final function getResultPointCallback() + { + return $this->resultPointCallback; + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Detector/FinderPattern.php b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Detector/FinderPattern.php new file mode 100644 index 0000000..ac93d38 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Detector/FinderPattern.php @@ -0,0 +1,86 @@ +Encapsulates a finder pattern, which are the three square patterns found in + * the corners of QR Codes. It also encapsulates a count of similar finder patterns, + * as a convenience to the finder's bookkeeping.

        + * + * @author Sean Owen + */ +final class FinderPattern extends ResultPoint +{ + private $estimatedModuleSize; + private $count; + + public function __construct($posX, $posY, $estimatedModuleSize, $count = 1) + { + parent::__construct($posX, $posY); + $this->estimatedModuleSize = $estimatedModuleSize; + $this->count = $count; + } + + public function getEstimatedModuleSize() + { + return $this->estimatedModuleSize; + } + + public function getCount() + { + return $this->count; + } + + /* + void incrementCount() { + this.count++; + } + */ + + /** + *

        Determines if this finder pattern "about equals" a finder pattern at the stated + * position and size -- meaning, it is at nearly the same center with nearly the same size.

        + */ + public function aboutEquals($moduleSize, $i, $j) + { + if (abs($i - $this->getY()) <= $moduleSize && abs($j - $this->getX()) <= $moduleSize) { + $moduleSizeDiff = abs($moduleSize - $this->estimatedModuleSize); + + return $moduleSizeDiff <= 1.0 || $moduleSizeDiff <= $this->estimatedModuleSize; + } + + return false; + } + + /** + * Combines this object's current estimate of a finder pattern position and module size + * with a new estimate. It returns a new {@code FinderPattern} containing a weighted average + * based on count. + */ + public function combineEstimate($i, $j, $newModuleSize) + { + $combinedCount = $this->count + 1; + $combinedX = ($this->count * $this->getX() + $j) / $combinedCount; + $combinedY = ($this->count * $this->getY() + $i) / $combinedCount; + $combinedModuleSize = ($this->count * $this->estimatedModuleSize + $newModuleSize) / $combinedCount; + + return new FinderPattern($combinedX, $combinedY, $combinedModuleSize, $combinedCount); + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Detector/FinderPatternFinder.php b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Detector/FinderPatternFinder.php new file mode 100644 index 0000000..1fe030f --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Detector/FinderPatternFinder.php @@ -0,0 +1,699 @@ +This class attempts to find finder patterns in a QR Code. Finder patterns are the square + * markers at three corners of a QR Code.

        + * + *

        This class is thread-safe but not reentrant. Each thread must allocate its own object. + * + * @author Sean Owen + */ +class FinderPatternFinder +{ + protected static $MIN_SKIP = 3; + protected static $MAX_MODULES = 57; // 1 pixel/module times 3 modules/center + private static $CENTER_QUORUM = 2; // support up to version 10 for mobile clients + private $image; + private $average; + private $possibleCenters; //private final List possibleCenters; + private $hasSkipped = false; + private $crossCheckStateCount; + private $resultPointCallback; + + /** + *

        Creates a finder that will search the image for three finder patterns.

        + * + * @param BitMatrix $image image to search + */ + public function __construct($image, $resultPointCallback = null) + { + $this->image = $image; + + + $this->possibleCenters = [];//new ArrayList<>(); + $this->crossCheckStateCount = fill_array(0, 5, 0); + $this->resultPointCallback = $resultPointCallback; + } + + final public function find($hints) + {/*final FinderPatternInfo find(Map hints) throws NotFoundException {*/ + $tryHarder = true;//$hints != null && $hints['TRY_HARDER']; + $pureBarcode = $hints != null && $hints['PURE_BARCODE']; + $maxI = $this->image->getHeight(); + $maxJ = $this->image->getWidth(); + // We are looking for black/white/black/white/black modules in + // 1:1:3:1:1 ratio; this tracks the number of such modules seen so far + + // Let's assume that the maximum version QR Code we support takes up 1/4 the height of the + // image, and then account for the center being 3 modules in size. This gives the smallest + // number of pixels the center could be, so skip this often. When trying harder, look for all + // QR versions regardless of how dense they are. + $iSkip = (int)((3 * $maxI) / (4 * self::$MAX_MODULES)); + if ($iSkip < self::$MIN_SKIP || $tryHarder) { + $iSkip = self::$MIN_SKIP; + } + + $done = false; + $stateCount = []; + for ($i = $iSkip - 1; $i < $maxI && !$done; $i += $iSkip) { + // Get a row of black/white values + $stateCount[0] = 0; + $stateCount[1] = 0; + $stateCount[2] = 0; + $stateCount[3] = 0; + $stateCount[4] = 0; + $currentState = 0; + for ($j = 0; $j < $maxJ; $j++) { + if ($this->image->get($j, $i)) { + // Black pixel + if (($currentState & 1) == 1) { // Counting white pixels + $currentState++; + } + $stateCount[$currentState]++; + } else { // White pixel + if (($currentState & 1) == 0) { // Counting black pixels + if ($currentState == 4) { // A winner? + if (self::foundPatternCross($stateCount)) { // Yes + $confirmed = $this->handlePossibleCenter($stateCount, $i, $j, $pureBarcode); + if ($confirmed) { + // Start examining every other line. Checking each line turned out to be too + // expensive and didn't improve performance. + $iSkip = 3; + if ($this->hasSkipped) { + $done = $this->haveMultiplyConfirmedCenters(); + } else { + $rowSkip = $this->findRowSkip(); + if ($rowSkip > $stateCount[2]) { + // Skip rows between row of lower confirmed center + // and top of presumed third confirmed center + // but back up a bit to get a full chance of detecting + // it, entire width of center of finder pattern + + // Skip by rowSkip, but back off by $stateCount[2] (size of last center + // of pattern we saw) to be conservative, and also back off by iSkip which + // is about to be re-added + $i += $rowSkip - $stateCount[2] - $iSkip; + $j = $maxJ - 1; + } + } + } else { + $stateCount[0] = $stateCount[2]; + $stateCount[1] = $stateCount[3]; + $stateCount[2] = $stateCount[4]; + $stateCount[3] = 1; + $stateCount[4] = 0; + $currentState = 3; + continue; + } + // Clear state to start looking again + $currentState = 0; + $stateCount[0] = 0; + $stateCount[1] = 0; + $stateCount[2] = 0; + $stateCount[3] = 0; + $stateCount[4] = 0; + } else { // No, shift counts back by two + $stateCount[0] = $stateCount[2]; + $stateCount[1] = $stateCount[3]; + $stateCount[2] = $stateCount[4]; + $stateCount[3] = 1; + $stateCount[4] = 0; + $currentState = 3; + } + } else { + $stateCount[++$currentState]++; + } + } else { // Counting white pixels + $stateCount[$currentState]++; + } + } + } + if (self::foundPatternCross($stateCount)) { + $confirmed = $this->handlePossibleCenter($stateCount, $i, $maxJ, $pureBarcode); + if ($confirmed) { + $iSkip = $stateCount[0]; + if ($this->hasSkipped) { + // Found a third one + $done = $this->haveMultiplyConfirmedCenters(); + } + } + } + } + + $patternInfo = $this->selectBestPatterns(); + $patternInfo = ResultPoint::orderBestPatterns($patternInfo); + + return new FinderPatternInfo($patternInfo); + } + + /** + * @param $stateCount ; count of black/white/black/white/black pixels just read + * + * @return true iff the proportions of the counts is close enough to the 1/1/3/1/1 ratios + * used by finder patterns to be considered a match + */ + protected static function foundPatternCross($stateCount) + { + $totalModuleSize = 0; + for ($i = 0; $i < 5; $i++) { + $count = $stateCount[$i]; + if ($count == 0) { + return false; + } + $totalModuleSize += $count; + } + if ($totalModuleSize < 7) { + return false; + } + $moduleSize = $totalModuleSize / 7.0; + $maxVariance = $moduleSize / 2.0; + + // Allow less than 50% variance from 1-1-3-1-1 proportions + return + abs($moduleSize - $stateCount[0]) < $maxVariance && + abs($moduleSize - $stateCount[1]) < $maxVariance && + abs(3.0 * $moduleSize - $stateCount[2]) < 3 * $maxVariance && + abs($moduleSize - $stateCount[3]) < $maxVariance && + abs($moduleSize - $stateCount[4]) < $maxVariance; + } + + /** + *

        This is called when a horizontal scan finds a possible alignment pattern. It will + * cross check with a vertical scan, and if successful, will, ah, cross-cross-check + * with another horizontal scan. This is needed primarily to locate the real horizontal + * center of the pattern in cases of extreme skew. + * And then we cross-cross-cross check with another diagonal scan.

        + * + *

        If that succeeds the finder pattern location is added to a list that tracks + * the number of times each location has been nearly-matched as a finder pattern. + * Each additional find is more evidence that the location is in fact a finder + * pattern center + * + * @param $stateCount reading state module counts from horizontal scan + * @param i row where finder pattern may be found + * @param j end of possible finder pattern in row + * @param pureBarcode true if in "pure barcode" mode + * + * @return true if a finder pattern candidate was found this time + */ + protected final function handlePossibleCenter($stateCount, $i, $j, $pureBarcode) + { + $stateCountTotal = $stateCount[0] + $stateCount[1] + $stateCount[2] + $stateCount[3] + + $stateCount[4]; + $centerJ = $this->centerFromEnd($stateCount, $j); + $centerI = $this->crossCheckVertical($i, (int)($centerJ), $stateCount[2], $stateCountTotal); + if (!is_nan($centerI)) { + // Re-cross check + $centerJ = $this->crossCheckHorizontal((int)($centerJ), (int)($centerI), $stateCount[2], $stateCountTotal); + if (!is_nan($centerJ) && + (!$pureBarcode || $this->crossCheckDiagonal((int)($centerI), (int)($centerJ), $stateCount[2], $stateCountTotal)) + ) { + $estimatedModuleSize = (float)$stateCountTotal / 7.0; + $found = false; + for ($index = 0; $index < count($this->possibleCenters); $index++) { + $center = $this->possibleCenters[$index]; + // Look for about the same center and module size: + if ($center->aboutEquals($estimatedModuleSize, $centerI, $centerJ)) { + $this->possibleCenters[$index] = $center->combineEstimate($centerI, $centerJ, $estimatedModuleSize); + $found = true; + break; + } + } + if (!$found) { + $point = new FinderPattern($centerJ, $centerI, $estimatedModuleSize); + $this->possibleCenters[] = $point; + if ($this->resultPointCallback != null) { + $this->resultPointCallback->foundPossibleResultPoint($point); + } + } + + return true; + } + } + + return false; + } + + /** + * Given a count of black/white/black/white/black pixels just seen and an end position, + * figures the location of the center of this run. + */ + private static function centerFromEnd($stateCount, $end) + { + return (float)($end - $stateCount[4] - $stateCount[3]) - $stateCount[2] / 2.0; + } + + /** + *

        After a horizontal scan finds a potential finder pattern, this method + * "cross-checks" by scanning down vertically through the center of the possible + * finder pattern to see if the same proportion is detected.

        + * + * @param $startI ; row where a finder pattern was detected + * @param centerJ ; center of the section that appears to cross a finder pattern + * @param $maxCount ; maximum reasonable number of modules that should be + * observed in any reading state, based on the results of the horizontal scan + * + * @return vertical center of finder pattern, or {@link Float#NaN} if not found + */ + private function crossCheckVertical($startI, $centerJ, $maxCount, + $originalStateCountTotal) + { + $image = $this->image; + + $maxI = $image->getHeight(); + $stateCount = $this->getCrossCheckStateCount(); + + // Start counting up from center + $i = $startI; + while ($i >= 0 && $image->get($centerJ, $i)) { + $stateCount[2]++; + $i--; + } + if ($i < 0) { + return NAN; + } + while ($i >= 0 && !$image->get($centerJ, $i) && $stateCount[1] <= $maxCount) { + $stateCount[1]++; + $i--; + } + // If already too many modules in this state or ran off the edge: + if ($i < 0 || $stateCount[1] > $maxCount) { + return NAN; + } + while ($i >= 0 && $image->get($centerJ, $i) && $stateCount[0] <= $maxCount) { + $stateCount[0]++; + $i--; + } + if ($stateCount[0] > $maxCount) { + return NAN; + } + + // Now also count down from center + $i = $startI + 1; + while ($i < $maxI && $image->get($centerJ, $i)) { + $stateCount[2]++; + $i++; + } + if ($i == $maxI) { + return NAN; + } + while ($i < $maxI && !$image->get($centerJ, $i) && $stateCount[3] < $maxCount) { + $stateCount[3]++; + $i++; + } + if ($i == $maxI || $stateCount[3] >= $maxCount) { + return NAN; + } + while ($i < $maxI && $image->get($centerJ, $i) && $stateCount[4] < $maxCount) { + $stateCount[4]++; + $i++; + } + if ($stateCount[4] >= $maxCount) { + return NAN; + } + + // If we found a finder-pattern-like section, but its size is more than 40% different than + // the original, assume it's a false positive + $stateCountTotal = $stateCount[0] + $stateCount[1] + $stateCount[2] + $stateCount[3] + + $stateCount[4]; + if (5 * abs($stateCountTotal - $originalStateCountTotal) >= 2 * $originalStateCountTotal) { + return NAN; + } + + return self::foundPatternCross($stateCount) ? $this->centerFromEnd($stateCount, $i) : NAN; + } + + private function getCrossCheckStateCount() + { + $this->crossCheckStateCount[0] = 0; + $this->crossCheckStateCount[1] = 0; + $this->crossCheckStateCount[2] = 0; + $this->crossCheckStateCount[3] = 0; + $this->crossCheckStateCount[4] = 0; + + return $this->crossCheckStateCount; + } + + /** + *

        Like {@link #crossCheckVertical(int, int, int, int)}, and in fact is basically identical, + * except it reads horizontally instead of vertically. This is used to cross-cross + * check a vertical cross check and locate the real center of the alignment pattern.

        + */ + private function crossCheckHorizontal($startJ, $centerI, $maxCount, + $originalStateCountTotal) + { + $image = $this->image; + + $maxJ = $this->image->getWidth(); + $stateCount = $this->getCrossCheckStateCount(); + + $j = $startJ; + while ($j >= 0 && $image->get($j, $centerI)) { + $stateCount[2]++; + $j--; + } + if ($j < 0) { + return NAN; + } + while ($j >= 0 && !$image->get($j, $centerI) && $stateCount[1] <= $maxCount) { + $stateCount[1]++; + $j--; + } + if ($j < 0 || $stateCount[1] > $maxCount) { + return NAN; + } + while ($j >= 0 && $image->get($j, $centerI) && $stateCount[0] <= $maxCount) { + $stateCount[0]++; + $j--; + } + if ($stateCount[0] > $maxCount) { + return NAN; + } + + $j = $startJ + 1; + while ($j < $maxJ && $image->get($j, $centerI)) { + $stateCount[2]++; + $j++; + } + if ($j == $maxJ) { + return NAN; + } + while ($j < $maxJ && !$image->get($j, $centerI) && $stateCount[3] < $maxCount) { + $stateCount[3]++; + $j++; + } + if ($j == $maxJ || $stateCount[3] >= $maxCount) { + return NAN; + } + while ($j < $maxJ && $this->image->get($j, $centerI) && $stateCount[4] < $maxCount) { + $stateCount[4]++; + $j++; + } + if ($stateCount[4] >= $maxCount) { + return NAN; + } + + // If we found a finder-pattern-like section, but its size is significantly different than + // the original, assume it's a false positive + $stateCountTotal = $stateCount[0] + $stateCount[1] + $stateCount[2] + $stateCount[3] + + $stateCount[4]; + if (5 * abs($stateCountTotal - $originalStateCountTotal) >= $originalStateCountTotal) { + return NAN; + } + + return $this->foundPatternCross($stateCount) ? $this->centerFromEnd($stateCount, $j) : NAN; + } + + /** + * After a vertical and horizontal scan finds a potential finder pattern, this method + * "cross-cross-cross-checks" by scanning down diagonally through the center of the possible + * finder pattern to see if the same proportion is detected. + * + * @param $startI ; row where a finder pattern was detected + * @param centerJ ; center of the section that appears to cross a finder pattern + * @param $maxCount ; maximum reasonable number of modules that should be + * observed in any reading state, based on the results of the horizontal scan + * @param originalStateCountTotal ; The original state count total. + * + * @return true if proportions are withing expected limits + */ + private function crossCheckDiagonal($startI, $centerJ, $maxCount, $originalStateCountTotal) + { + $stateCount = $this->getCrossCheckStateCount(); + + // Start counting up, left from center finding black center mass + $i = 0; + $startI = (int)($startI); + $centerJ = (int)($centerJ); + while ($startI >= $i && $centerJ >= $i && $this->image->get($centerJ - $i, $startI - $i)) { + $stateCount[2]++; + $i++; + } + + if ($startI < $i || $centerJ < $i) { + return false; + } + + // Continue up, left finding white space + while ($startI >= $i && $centerJ >= $i && !$this->image->get($centerJ - $i, $startI - $i) && + $stateCount[1] <= $maxCount) { + $stateCount[1]++; + $i++; + } + + // If already too many modules in this state or ran off the edge: + if ($startI < $i || $centerJ < $i || $stateCount[1] > $maxCount) { + return false; + } + + // Continue up, left finding black border + while ($startI >= $i && $centerJ >= $i && $this->image->get($centerJ - $i, $startI - $i) && + $stateCount[0] <= $maxCount) { + $stateCount[0]++; + $i++; + } + if ($stateCount[0] > $maxCount) { + return false; + } + + $maxI = $this->image->getHeight(); + $maxJ = $this->image->getWidth(); + + // Now also count down, right from center + $i = 1; + while ($startI + $i < $maxI && $centerJ + $i < $maxJ && $this->image->get($centerJ + $i, $startI + $i)) { + $stateCount[2]++; + $i++; + } + + // Ran off the edge? + if ($startI + $i >= $maxI || $centerJ + $i >= $maxJ) { + return false; + } + + while ($startI + $i < $maxI && $centerJ + $i < $maxJ && !$this->image->get($centerJ + $i, $startI + $i) && + $stateCount[3] < $maxCount) { + $stateCount[3]++; + $i++; + } + + if ($startI + $i >= $maxI || $centerJ + $i >= $maxJ || $stateCount[3] >= $maxCount) { + return false; + } + + while ($startI + $i < $maxI && $centerJ + $i < $maxJ && $this->image->get($centerJ + $i, $startI + $i) && + $stateCount[4] < $maxCount) { + $stateCount[4]++; + $i++; + } + + if ($stateCount[4] >= $maxCount) { + return false; + } + + // If we found a finder-pattern-like section, but its size is more than 100% different than + // the original, assume it's a false positive + $stateCountTotal = $stateCount[0] + $stateCount[1] + $stateCount[2] + $stateCount[3] + $stateCount[4]; + + return + abs($stateCountTotal - $originalStateCountTotal) < 2 * $originalStateCountTotal && + self::foundPatternCross($stateCount); + } + + /** + * @return true iff we have found at least 3 finder patterns that have been detected + * at least {@link #CENTER_QUORUM} times each, and, the estimated module size of the + * candidates is "pretty similar" + */ + private function haveMultiplyConfirmedCenters() + { + $confirmedCount = 0; + $totalModuleSize = 0.0; + $max = count($this->possibleCenters); + foreach ($this->possibleCenters as $pattern) { + if ($pattern->getCount() >= self::$CENTER_QUORUM) { + $confirmedCount++; + $totalModuleSize += $pattern->getEstimatedModuleSize(); + } + } + if ($confirmedCount < 3) { + return false; + } + // OK, we have at least 3 confirmed centers, but, it's possible that one is a "false positive" + // and that we need to keep looking. We detect this by asking if the estimated module sizes + // vary too much. We arbitrarily say that when the total deviation from average exceeds + // 5% of the total module size estimates, it's too much. + $average = $totalModuleSize / (float)$max; + $totalDeviation = 0.0; + foreach ($this->possibleCenters as $pattern) { + $totalDeviation += abs($pattern->getEstimatedModuleSize() - $average); + } + + return $totalDeviation <= 0.05 * $totalModuleSize; + } + + /** + * @return number of rows we could safely skip during scanning, based on the first + * two finder patterns that have been located. In some cases their position will + * allow us to infer that the third pattern must lie below a certain point farther + * down in the image. + */ + private function findRowSkip() + { + $max = count($this->possibleCenters); + if ($max <= 1) { + return 0; + } + $firstConfirmedCenter = null; + foreach ($this->possibleCenters as $center) { + + + if ($center->getCount() >= self::$CENTER_QUORUM) { + if ($firstConfirmedCenter == null) { + $firstConfirmedCenter = $center; + } else { + // We have two confirmed centers + // How far down can we skip before resuming looking for the next + // pattern? In the worst case, only the difference between the + // difference in the x / y coordinates of the two centers. + // This is the case where you find top left last. + $this->hasSkipped = true; + + return (int)((abs($firstConfirmedCenter->getX() - $center->getX()) - + abs($firstConfirmedCenter->getY() - $center->getY())) / 2); + } + } + } + + return 0; + } + + /** + * @return array the 3 best {@link FinderPattern}s from our list of candidates. The "best" are + * those that have been detected at least {@link #CENTER_QUORUM} times, and whose module + * size differs from the average among those patterns the least + * @throws NotFoundException if 3 such finder patterns do not exist + */ + private function selectBestPatterns() + { + $startSize = count($this->possibleCenters); + if ($startSize < 3) { + // Couldn't find enough finder patterns + throw new NotFoundException; + } + + // Filter outlier possibilities whose module size is too different + if ($startSize > 3) { + // But we can only afford to do so if we have at least 4 possibilities to choose from + $totalModuleSize = 0.0; + $square = 0.0; + foreach ($this->possibleCenters as $center) { + $size = $center->getEstimatedModuleSize(); + $totalModuleSize += $size; + $square += $size * $size; + } + $this->average = $totalModuleSize / (float)$startSize; + $stdDev = (float)sqrt($square / $startSize - $this->average * $this->average); + + usort($this->possibleCenters, [$this, 'FurthestFromAverageComparator']); + + $limit = max(0.2 * $this->average, $stdDev); + + for ($i = 0; $i < count($this->possibleCenters) && count($this->possibleCenters) > 3; $i++) { + $pattern = $this->possibleCenters[$i]; + if (abs($pattern->getEstimatedModuleSize() - $this->average) > $limit) { + unset($this->possibleCenters[$i]);//возможно что ключи меняются в java при вызове .remove(i) ??? + $this->possibleCenters = array_values($this->possibleCenters); + $i--; + } + } + } + + if (count($this->possibleCenters) > 3) { + // Throw away all but those first size candidate points we found. + + $totalModuleSize = 0.0; + foreach ($this->possibleCenters as $possibleCenter) { + $totalModuleSize += $possibleCenter->getEstimatedModuleSize(); + } + + $this->average = $totalModuleSize / (float)count($this->possibleCenters); + + usort($this->possibleCenters, [$this, 'CenterComparator']); + + array_slice($this->possibleCenters, 3, count($this->possibleCenters) - 3); + } + + return [$this->possibleCenters[0], $this->possibleCenters[1], $this->possibleCenters[2]]; + } + + /** + *

        Orders by furthest from average

        + */ + public function FurthestFromAverageComparator($center1, $center2) + { + + $dA = abs($center2->getEstimatedModuleSize() - $this->average); + $dB = abs($center1->getEstimatedModuleSize() - $this->average); + if ($dA < $dB) { + return -1; + } elseif ($dA == $dB) { + return 0; + } else { + return 1; + } + } + + public function CenterComparator($center1, $center2) + { + if ($center2->getCount() == $center1->getCount()) { + $dA = abs($center2->getEstimatedModuleSize() - $this->average); + $dB = abs($center1->getEstimatedModuleSize() - $this->average); + if ($dA < $dB) { + return 1; + } elseif ($dA == $dB) { + return 0; + } else { + return -1; + } + } else { + return $center2->getCount() - $center1->getCount(); + } + } + + protected final function getImage() + { + return $this->image; + } + /** + *

        Orders by {@link FinderPattern#getCount()}, descending.

        + */ + + //@Override + protected final function getPossibleCenters() + { //List getPossibleCenters() + return $this->possibleCenters; + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Detector/FinderPatternInfo.php b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Detector/FinderPatternInfo.php new file mode 100644 index 0000000..28091a4 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/Detector/FinderPatternInfo.php @@ -0,0 +1,53 @@ +Encapsulates information about finder patterns in an image, including the location of + * the three finder patterns, and their estimated module size.

        + * + * @author Sean Owen + */ +final class FinderPatternInfo +{ + private $bottomLeft; + private $topLeft; + private $topRight; + + public function __construct($patternCenters) + { + $this->bottomLeft = $patternCenters[0]; + $this->topLeft = $patternCenters[1]; + $this->topRight = $patternCenters[2]; + } + + public function getBottomLeft() + { + return $this->bottomLeft; + } + + public function getTopLeft() + { + return $this->topLeft; + } + + public function getTopRight() + { + return $this->topRight; + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/QRCodeReader.php b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/QRCodeReader.php new file mode 100644 index 0000000..2fd1c46 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Qrcode/QRCodeReader.php @@ -0,0 +1,222 @@ +decoder = new Decoder(); + } + + /** + * @param BinaryBitmap $image + * @param null $hints + * + * @return Result + * @throws \Zxing\FormatException + * @throws \Zxing\NotFoundException + */ + public function decode(BinaryBitmap $image, $hints = null) + { + $decoderResult = null; + if ($hints !== null && $hints['PURE_BARCODE']) { + $bits = self::extractPureBits($image->getBlackMatrix()); + $decoderResult = $this->decoder->decode($bits, $hints); + $points = self::$NO_POINTS; + } else { + $detector = new Detector($image->getBlackMatrix()); + $detectorResult = $detector->detect($hints); + + $decoderResult = $this->decoder->decode($detectorResult->getBits(), $hints); + $points = $detectorResult->getPoints(); + } + $result = new Result($decoderResult->getText(), $decoderResult->getRawBytes(), $points, 'QR_CODE');//BarcodeFormat.QR_CODE + + $byteSegments = $decoderResult->getByteSegments(); + if ($byteSegments !== null) { + $result->putMetadata('BYTE_SEGMENTS', $byteSegments);//ResultMetadataType.BYTE_SEGMENTS + } + $ecLevel = $decoderResult->getECLevel(); + if ($ecLevel !== null) { + $result->putMetadata('ERROR_CORRECTION_LEVEL', $ecLevel);//ResultMetadataType.ERROR_CORRECTION_LEVEL + } + if ($decoderResult->hasStructuredAppend()) { + $result->putMetadata( + 'STRUCTURED_APPEND_SEQUENCE',//ResultMetadataType.STRUCTURED_APPEND_SEQUENCE + $decoderResult->getStructuredAppendSequenceNumber() + ); + $result->putMetadata( + 'STRUCTURED_APPEND_PARITY',//ResultMetadataType.STRUCTURED_APPEND_PARITY + $decoderResult->getStructuredAppendParity() + ); + } + + return $result; + } + + /** + * Locates and decodes a QR code in an image. + * + * @return a String representing the content encoded by the QR code + * @throws NotFoundException if a QR code cannot be found + * @throws FormatException if a QR code cannot be decoded + * @throws ChecksumException if error correction fails + */ + + /** + * This method detects a code in a "pure" image -- that is, pure monochrome image + * which contains only an unrotated, unskewed, image of a code, with some white border + * around it. This is a specialized method that works exceptionally fast in this special + * case. + * + * @see com.google.zxing.datamatrix.DataMatrixReader#extractPureBits(BitMatrix) + */ + private static function extractPureBits(BitMatrix $image) + { + $leftTopBlack = $image->getTopLeftOnBit(); + $rightBottomBlack = $image->getBottomRightOnBit(); + if ($leftTopBlack === null || $rightBottomBlack == null) { + throw NotFoundException::getNotFoundInstance(); + } + + $moduleSize = self::moduleSize($leftTopBlack, $image); + + $top = $leftTopBlack[1]; + $bottom = $rightBottomBlack[1]; + $left = $leftTopBlack[0]; + $right = $rightBottomBlack[0]; + + // Sanity check! + if ($left >= $right || $top >= $bottom) { + throw NotFoundException::getNotFoundInstance(); + } + + if ($bottom - $top != $right - $left) { + // Special case, where bottom-right module wasn't black so we found something else in the last row + // Assume it's a square, so use height as the width + $right = $left + ($bottom - $top); + } + + $matrixWidth = round(($right - $left + 1) / $moduleSize); + $matrixHeight = round(($bottom - $top + 1) / $moduleSize); + if ($matrixWidth <= 0 || $matrixHeight <= 0) { + throw NotFoundException::getNotFoundInstance(); + } + if ($matrixHeight != $matrixWidth) { + // Only possibly decode square regions + throw NotFoundException::getNotFoundInstance(); + } + + // Push in the "border" by half the module width so that we start + // sampling in the middle of the module. Just in case the image is a + // little off, this will help recover. + $nudge = (int)($moduleSize / 2.0);// $nudge = (int) ($moduleSize / 2.0f); + $top += $nudge; + $left += $nudge; + + // But careful that this does not sample off the edge + // "right" is the farthest-right valid pixel location -- right+1 is not necessarily + // This is positive by how much the inner x loop below would be too large + $nudgedTooFarRight = $left + (int)(($matrixWidth - 1) * $moduleSize) - $right; + if ($nudgedTooFarRight > 0) { + if ($nudgedTooFarRight > $nudge) { + // Neither way fits; abort + throw NotFoundException::getNotFoundInstance(); + } + $left -= $nudgedTooFarRight; + } + // See logic above + $nudgedTooFarDown = $top + (int)(($matrixHeight - 1) * $moduleSize) - $bottom; + if ($nudgedTooFarDown > 0) { + if ($nudgedTooFarDown > $nudge) { + // Neither way fits; abort + throw NotFoundException::getNotFoundInstance(); + } + $top -= $nudgedTooFarDown; + } + + // Now just read off the bits + $bits = new BitMatrix($matrixWidth, $matrixHeight); + for ($y = 0; $y < $matrixHeight; $y++) { + $iOffset = $top + (int)($y * $moduleSize); + for ($x = 0; $x < $matrixWidth; $x++) { + if ($image->get($left + (int)($x * $moduleSize), $iOffset)) { + $bits->set($x, $y); + } + } + } + + return $bits; + } + + private static function moduleSize($leftTopBlack, BitMatrix $image) + { + $height = $image->getHeight(); + $width = $image->getWidth(); + $x = $leftTopBlack[0]; + $y = $leftTopBlack[1]; + /*$x = $leftTopBlack[0]; + $y = $leftTopBlack[1];*/ + $inBlack = true; + $transitions = 0; + while ($x < $width && $y < $height) { + if ($inBlack != $image->get($x, $y)) { + if (++$transitions == 5) { + break; + } + $inBlack = !$inBlack; + } + $x++; + $y++; + } + if ($x == $width || $y == $height) { + throw NotFoundException::getNotFoundInstance(); + } + + return ($x - $leftTopBlack[0]) / 7.0; //return ($x - $leftTopBlack[0]) / 7.0f; + } + + public function reset() + { + // do nothing + } + + protected final function getDecoder() + { + return $this->decoder; + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/RGBLuminanceSource.php b/public/tool/newsid/qrcodedecoder/Zxing/RGBLuminanceSource.php new file mode 100644 index 0000000..e3fe222 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/RGBLuminanceSource.php @@ -0,0 +1,309 @@ +RGBLuminanceSource_($pixels, $dataWidth, $dataHeight); + + return; + } + parent::__construct($width, $height); + if ($left + $width > $dataWidth || $top + $height > $dataHeight) { + throw new \InvalidArgumentException("Crop rectangle does not fit within image data."); + } + $this->luminances = $pixels; + $this->dataWidth = $dataWidth; + $this->dataHeight = $dataHeight; + $this->left = $left; + $this->top = $top; + } + + public function RGBLuminanceSource_($width, $height, $pixels) + { + parent::__construct($width, $height); + + $this->dataWidth = $width; + $this->dataHeight = $height; + $this->left = 0; + $this->top = 0; + $this->pixels = $pixels; + + +// In order to measure pure decoding speed, we convert the entire image to a greyscale array +// up front, which is the same as the Y channel of the YUVLuminanceSource in the real app. + $this->luminances = []; + //$this->luminances = $this->grayScaleToBitmap($this->grayscale()); + + foreach ($pixels as $key => $pixel) { + $r = $pixel['red']; + $g = $pixel['green']; + $b = $pixel['blue']; + + /* if (($pixel & 0xFF000000) == 0) { + $pixel = 0xFFFFFFFF; // = white + } + + // .229R + 0.587G + 0.114B (YUV/YIQ for PAL and NTSC) + + $this->luminances[$key] = + (306 * (($pixel >> 16) & 0xFF) + + 601 * (($pixel >> 8) & 0xFF) + + 117 * ($pixel & 0xFF) + + 0x200) >> 10; + + */ + //$r = ($pixel >> 16) & 0xff; + //$g = ($pixel >> 8) & 0xff; + //$b = $pixel & 0xff; + if ($r == $g && $g == $b) { +// Image is already greyscale, so pick any channel. + + $this->luminances[$key] = $r;//(($r + 128) % 256) - 128; + } else { +// Calculate luminance cheaply, favoring green. + $this->luminances[$key] = ($r + 2 * $g + $b) / 4;//(((($r + 2 * $g + $b) / 4) + 128) % 256) - 128; + } + + } + + /* + + for ($y = 0; $y < $height; $y++) { + $offset = $y * $width; + for ($x = 0; $x < $width; $x++) { + $pixel = $pixels[$offset + $x]; + $r = ($pixel >> 16) & 0xff; + $g = ($pixel >> 8) & 0xff; + $b = $pixel & 0xff; + if ($r == $g && $g == $b) { +// Image is already greyscale, so pick any channel. + + $this->luminances[(int)($offset + $x)] = (($r+128) % 256) - 128; + } else { +// Calculate luminance cheaply, favoring green. + $this->luminances[(int)($offset + $x)] = (((($r + 2 * $g + $b) / 4)+128)%256) - 128; + } + + + + } + */ + //} + // $this->luminances = $this->grayScaleToBitmap($this->luminances); + + } + + public function grayscale() + { + $width = $this->dataWidth; + $height = $this->dataHeight; + + $ret = fill_array(0, $width * $height, 0); + for ($y = 0; $y < $height; $y++) { + for ($x = 0; $x < $width; $x++) { + $gray = $this->getPixel($x, $y, $width, $height); + + $ret[$x + $y * $width] = $gray; + } + } + + return $ret; + } + + public function getPixel($x, $y, $width, $height) + { + $image = $this->pixels; + if ($width < $x) { + die('error'); + } + if ($height < $y) { + die('error'); + } + $point = ($x) + ($y * $width); + + $r = $image[$point]['red'];//($image[$point] >> 16) & 0xff; + $g = $image[$point]['green'];//($image[$point] >> 8) & 0xff; + $b = $image[$point]['blue'];//$image[$point] & 0xff; + + $p = (int)(($r * 33 + $g * 34 + $b * 33) / 100); + + + return $p; + + } + + public function grayScaleToBitmap($grayScale) + { + $middle = $this->getMiddleBrightnessPerArea($grayScale); + $sqrtNumArea = count($middle); + $areaWidth = floor($this->dataWidth / $sqrtNumArea); + $areaHeight = floor($this->dataHeight / $sqrtNumArea); + $bitmap = fill_array(0, $this->dataWidth * $this->dataHeight, 0); + + for ($ay = 0; $ay < $sqrtNumArea; $ay++) { + for ($ax = 0; $ax < $sqrtNumArea; $ax++) { + for ($dy = 0; $dy < $areaHeight; $dy++) { + for ($dx = 0; $dx < $areaWidth; $dx++) { + $bitmap[(int)($areaWidth * $ax + $dx + ($areaHeight * $ay + $dy) * $this->dataWidth)] = ($grayScale[(int)($areaWidth * $ax + $dx + ($areaHeight * $ay + $dy) * $this->dataWidth)] < $middle[$ax][$ay]) ? 0 : 255; + } + } + } + } + + return $bitmap; + } + + public function getMiddleBrightnessPerArea($image) + { + $numSqrtArea = 4; + //obtain middle brightness((min + max) / 2) per area + $areaWidth = floor($this->dataWidth / $numSqrtArea); + $areaHeight = floor($this->dataHeight / $numSqrtArea); + $minmax = fill_array(0, $numSqrtArea, 0); + for ($i = 0; $i < $numSqrtArea; $i++) { + $minmax[$i] = fill_array(0, $numSqrtArea, 0); + for ($i2 = 0; $i2 < $numSqrtArea; $i2++) { + $minmax[$i][$i2] = [0, 0]; + } + } + for ($ay = 0; $ay < $numSqrtArea; $ay++) { + for ($ax = 0; $ax < $numSqrtArea; $ax++) { + $minmax[$ax][$ay][0] = 0xFF; + for ($dy = 0; $dy < $areaHeight; $dy++) { + for ($dx = 0; $dx < $areaWidth; $dx++) { + $target = $image[(int)($areaWidth * $ax + $dx + ($areaHeight * $ay + $dy) * $this->dataWidth)]; + if ($target < $minmax[$ax][$ay][0]) + $minmax[$ax][$ay][0] = $target; + if ($target > $minmax[$ax][$ay][1]) + $minmax[$ax][$ay][1] = $target; + } + } + //minmax[ax][ay][0] = (minmax[ax][ay][0] + minmax[ax][ay][1]) / 2; + } + } + $middle = []; + for ($i3 = 0; $i3 < $numSqrtArea; $i3++) { + $middle[$i3] = []; + } + for ($ay = 0; $ay < $numSqrtArea; $ay++) { + for ($ax = 0; $ax < $numSqrtArea; $ax++) { + $middle[$ax][$ay] = floor(($minmax[$ax][$ay][0] + $minmax[$ax][$ay][1]) / 2); + //Console.out.print(middle[ax][ay] + ","); + } + //Console.out.println(""); + } + + //Console.out.println(""); + + return $middle; + } + +//@Override + public function getRow($y, $row = null) + { + if ($y < 0 || $y >= $this->getHeight()) { + throw new \InvalidArgumentException("Requested row is outside the image: " + y); + } + $width = $this->getWidth(); + if ($row == null || count($row) < $width) { + $row = []; + } + $offset = ($y + $this->top) * $this->dataWidth + $this->left; + $row = arraycopy($this->luminances, $offset, $row, 0, $width); + + return $row; + } + +//@Override + public function getMatrix() + { + $width = $this->getWidth(); + $height = $this->getHeight(); + +// If the caller asks for the entire underlying image, save the copy and give them the +// original data. The docs specifically warn that result.length must be ignored. + if ($width == $this->dataWidth && $height == $this->dataHeight) { + return $this->luminances; + } + + $area = $width * $height; + $matrix = []; + $inputOffset = $this->top * $this->dataWidth + $this->left; + +// If the width matches the full width of the underlying data, perform a single copy. + if ($width == $this->dataWidth) { + $matrix = arraycopy($this->luminances, $inputOffset, $matrix, 0, $area); + + return $matrix; + } + +// Otherwise copy one cropped row at a time. + $rgb = $this->luminances; + for ($y = 0; $y < $height; $y++) { + $outputOffset = $y * $width; + $matrix = arraycopy($rgb, $inputOffset, $matrix, $outputOffset, $width); + $inputOffset += $this->dataWidth; + } + + return $matrix; + } + +//@Override + public function isCropSupported() + { + return true; + } + +//@Override + public function crop($left, $top, $width, $height) + { + return new RGBLuminanceSource($this->luminances, + $this->dataWidth, + $this->dataHeight, + $this->left + $left, + $this->top + $top, + $width, + $height); + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/Reader.php b/public/tool/newsid/qrcodedecoder/Zxing/Reader.php new file mode 100644 index 0000000..cc18ccc --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/Reader.php @@ -0,0 +1,10 @@ +Encapsulates the result of decoding a barcode within an image.

        + * + * @author Sean Owen + */ +final class Result +{ + private $text; + private $rawBytes; + private $resultPoints; + private $format; + private $resultMetadata; + private $timestamp; + + public function __construct( + $text, + $rawBytes, + $resultPoints, + $format, + $timestamp = '' + ) { + + $this->text = $text; + $this->rawBytes = $rawBytes; + $this->resultPoints = $resultPoints; + $this->format = $format; + $this->resultMetadata = null; + $this->timestamp = $timestamp ?: time(); + } + + /** + * @return raw text encoded by the barcode + */ + public function getText() + { + return $this->text; + } + + /** + * @return raw bytes encoded by the barcode, if applicable, otherwise {@code null} + */ + public function getRawBytes() + { + return $this->rawBytes; + } + + /** + * @return points related to the barcode in the image. These are typically points + * identifying finder patterns or the corners of the barcode. The exact meaning is + * specific to the type of barcode that was decoded. + */ + public function getResultPoints() + { + return $this->resultPoints; + } + + /** + * @return {@link BarcodeFormat} representing the format of the barcode that was decoded + */ + public function getBarcodeFormat() + { + return $this->format; + } + + /** + * @return {@link Map} mapping {@link ResultMetadataType} keys to values. May be + * {@code null}. This contains optional metadata about what was detected about the barcode, + * like orientation. + */ + public function getResultMetadata() + { + return $this->resultMetadata; + } + + public function putMetadata($type, $value) + { + if ($this->resultMetadata === null) { + $this->resultMetadata = []; + } + $resultMetadata[$type] = $value; + } + + public function putAllMetadata($metadata) + { + if ($metadata !== null) { + if ($this->resultMetadata === null) { + $this->resultMetadata = $metadata; + } else { + $this->resultMetadata = array_merge($this->resultMetadata, $metadata); + } + } + } + + public function addResultPoints($newPoints) + { + $oldPoints = $this->resultPoints; + if ($oldPoints === null) { + $this->resultPoints = $newPoints; + } else if ($newPoints !== null && count($newPoints) > 0) { + $allPoints = fill_array(0, count($oldPoints) + count($newPoints), 0); + $allPoints = arraycopy($oldPoints, 0, $allPoints, 0, count($oldPoints)); + $allPoints = arraycopy($newPoints, 0, $allPoints, count($oldPoints), count($newPoints)); + $this->resultPoints = $allPoints; + } + } + + public function getTimestamp() + { + return $this->timestamp; + } + + public function toString() + { + return $this->text; + } +} diff --git a/public/tool/newsid/qrcodedecoder/Zxing/ResultPoint.php b/public/tool/newsid/qrcodedecoder/Zxing/ResultPoint.php new file mode 100644 index 0000000..f0720b3 --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/Zxing/ResultPoint.php @@ -0,0 +1,155 @@ +Encapsulates a point of interest in an image containing a barcode. Typically, this + * would be the location of a finder pattern or the corner of the barcode, for example.

        + * + * @author Sean Owen + */ +class ResultPoint +{ + private $x; + private $y; + + public function __construct($x, $y) + { + $this->x = (float)($x); + $this->y = (float)($y); + } + + /** + * Orders an array of three ResultPoints in an order [A,B,C] such that AB is less than AC + * and BC is less than AC, and the angle between BC and BA is less than 180 degrees. + * + * @param patterns array of three {@code ResultPoint} to order + */ + public static function orderBestPatterns($patterns) + { + +// Find distances between pattern centers + $zeroOneDistance = self::distance($patterns[0], $patterns[1]); + $oneTwoDistance = self::distance($patterns[1], $patterns[2]); + $zeroTwoDistance = self::distance($patterns[0], $patterns[2]); + + $pointA = ''; + $pointB = ''; + $pointC = ''; +// Assume one closest to other two is B; A and C will just be guesses at first + if ($oneTwoDistance >= $zeroOneDistance && $oneTwoDistance >= $zeroTwoDistance) { + $pointB = $patterns[0]; + $pointA = $patterns[1]; + $pointC = $patterns[2]; + } else if ($zeroTwoDistance >= $oneTwoDistance && $zeroTwoDistance >= $zeroOneDistance) { + $pointB = $patterns[1]; + $pointA = $patterns[0]; + $pointC = $patterns[2]; + } else { + $pointB = $patterns[2]; + $pointA = $patterns[0]; + $pointC = $patterns[1]; + } + +// Use cross product to figure out whether A and C are correct or flipped. +// This asks whether BC x BA has a positive z component, which is the arrangement +// we want for A, B, C. If it's negative, then we've got it flipped around and +// should swap A and C. + if (self::crossProductZ($pointA, $pointB, $pointC) < 0.0) { + $temp = $pointA; + $pointA = $pointC; + $pointC = $temp; + } + + $patterns[0] = $pointA; + $patterns[1] = $pointB; + $patterns[2] = $pointC; + + return $patterns; + } + + /** + * @param pattern1 first pattern + * @param pattern2 second pattern + * + * @return distance between two points + */ + public static function distance($pattern1, $pattern2) + { + return MathUtils::distance($pattern1->x, $pattern1->y, $pattern2->x, $pattern2->y); + } + +//@Override + + /** + * Returns the z component of the cross product between vectors BC and BA. + */ + private static function crossProductZ($pointA, + $pointB, + $pointC) + { + $bX = $pointB->x; + $bY = $pointB->y; + + return (($pointC->x - $bX) * ($pointA->y - $bY)) - (($pointC->y - $bY) * ($pointA->x - $bX)); + } + +//@Override + + public final function getX() + { + return (float)($this->x); + } + +//@Override + + public final function getY() + { + return (float)($this->y); + } + + public final function equals($other) + { + if ($other instanceof ResultPoint) { + $otherPoint = $other; + + return $this->x == $otherPoint->x && $this->y == $otherPoint->y; + } + + return false; + } + + public final function hashCode() + { + return 31 * floatToIntBits($this->x) + floatToIntBits($this->y); + } + + public final function toString() + { + $result = ''; + $result .= ('('); + $result .= ($this->x); + $result .= (','); + $result .= ($this->y); + $result .= (')'); + + return $result; + } +} diff --git a/public/tool/newsid/qrcodedecoder/bootstrap.php b/public/tool/newsid/qrcodedecoder/bootstrap.php new file mode 100644 index 0000000..7d744ee --- /dev/null +++ b/public/tool/newsid/qrcodedecoder/bootstrap.php @@ -0,0 +1,11 @@ +'); + if( /Android|SymbianOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Windows Phone|Midp/i.test(navigator.userAgent)) { + $('#mobile').show(); + } + interval1=setInterval(loginload,1000); + interval2=setInterval(qrlogin,3000); + }else{ + var getvcurl='login.php?do=getqrpic&r='+Math.random(1); + $.get(getvcurl, function(d) { + if(d.saveOK ==0){ + setCookie('qrsig',d.qrsig); + setCookie('qrimg',d.data); + setCookie('qrurl',d.url); + $('#qrimg').attr('qrsig',d.qrsig); + $('#qrimg').attr('qrurl',d.url); + $('#qrimg').html(''); + if( /Android|SymbianOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Windows Phone|Midp/i.test(navigator.userAgent)) { + $('#mobile').show(); + } + interval1=setInterval(loginload,1000); + interval2=setInterval(qrlogin,3000); + }else{ + alert(d.msg); + } + }, 'json'); + } +} +function qrlogin(){ + if ($('#login').attr("data-lock") === "true") return; + var qrsig=$('#qrimg').attr('qrsig'); + var url = 'login.php?do=qrlogin&qrsig='+decodeURIComponent(qrsig)+'&r='+Math.random(1); + $.get(url, function(d) { + if(d.saveOK ==0){ + $('#login').html('
        登录成功!'+decodeURIComponent(d.nick)+'
        QQ帐号

        SKEY

        P_skey

        superkey

        返回重新获取'); + + $('#qrimg').hide(); + $('#mobile').hide(); + $('#submit').hide(); + $('#login').attr("data-lock", "true"); + cleartime(); + }else if(d.saveOK ==1){ + getqrpic(true); + $('#loginmsg').html('请重新扫描二维码'); + }else if(d.saveOK ==2){ + $('#loginmsg').html('使用QQ手机版扫描二维码'); + }else if(d.saveOK ==3){ + $('#loginmsg').html('扫描成功,请在手机上确认授权登录'); + }else{ + cleartime(); + $('#loginmsg').html(d.msg); + } + }, 'json'); +} +function loginload(){ + if ($('#login').attr("data-lock") === "true") return; + var load=document.getElementById('loginload').innerHTML; + var len=load.length; + if(len>2){ + load='.'; + }else{ + load+='.'; + } + document.getElementById('loginload').innerHTML=load; +} +function cleartime(){ + clearInterval(interval1); + clearInterval(interval2); + delCookie('qrsig'); + delCookie('qrimg'); + delCookie('qrurl'); +} +function mloginurl(){ + var imagew = $('#qrcodeimg').attr('src'); + imagew = imagew.replace(/data:image\/png;base64,/, ""); + $('#mlogin').html("正在跳转..."); + $.post("qrcode.php?r="+Math.random(1),{image:imagew}, function(arr) { + if(arr.code==0) { + $('#loginmsg').html('跳转到QQ登录后请返回此页面'); + window.location.href='mqqapi://forward/url?version=1&src_type=web&url_prefix='+window.btoa(arr.url); + }else{ + alert(arr.msg); + } + $('#mlogin').html("跳转QQ快捷登录"); + }, 'json'); +} +function mloginurlnew(){ + var qrurl = $('#qrimg').attr('qrurl'); + $('#loginmsg').html('跳转到QQ登录后请返回此页面'); + var ua = window.navigator.userAgent.toLowerCase(); + var is_ios = ua.indexOf('iphone')>-1 || ua.indexOf('ipad')>-1; + var schemacallback = ''; + if(is_ios){ + schemacallback = 'weixin://'; + }else if(ua.indexOf('ucbrowser')>-1){ + schemacallback = 'ucweb://'; + }else if(ua.indexOf('meizu')>-1){ + schemacallback = 'mzbrowser://'; + }else if(ua.indexOf('liebaofast')>-1){ + schemacallback = 'lb://'; + }else if(ua.indexOf('baidubrowser')>-1){ + schemacallback = 'bdbrowser://'; + }else if(ua.indexOf('baiduboxapp')>-1){ + schemacallback = 'bdapp://'; + }else if(ua.indexOf('mqqbrowser')>-1){ + schemacallback = 'mqqbrowser://'; + }else if(ua.indexOf('qihoobrowser')>-1){ + schemacallback = 'qihoobrowser://'; + }else if(ua.indexOf('chrome')>-1){ + schemacallback = 'googlechrome://'; + }else if(ua.indexOf('sogoumobilebrowser')>-1){ + schemacallback = 'SogouMSE://'; + }else if(ua.indexOf('xiaomi')>-1){ + schemacallback = 'miuibrowser://'; + }else{ + schemacallback = 'googlechrome://'; + } + if(is_ios){ + alert('跳转到QQ登录后请手动返回当前浏览器'); + window.location.href='wtloginmqq3://ptlogin/qlogin?qrcode='+encodeURIComponent(qrurl)+'&schemacallback='+encodeURIComponent(schemacallback); + }else{ + window.location.href='wtloginmqq://ptlogin/qlogin?qrcode='+encodeURIComponent(qrurl)+'&schemacallback='+encodeURIComponent(schemacallback); + } +} +$(document).ready(function(){ + getqrpic(); +}); \ No newline at end of file diff --git a/public/tool/qq/del.php b/public/tool/qq/del.php new file mode 100644 index 0000000..d31084b --- /dev/null +++ b/public/tool/qq/del.php @@ -0,0 +1,82 @@ +$touin,'is'=>'0'); + else $result=array('touin'=>$touin,'is'=>'1'); + + /*$url='http://social.show.qq.com/cgi-bin/qqshow_camera_noname?g_tk='.$gtk; + $post="uin=".$touin."%7C".$uin."&friend=1"; + $data=get_curl($url,$post,$url,$cookie); + preg_match('/xfriend=\"(\d+)\"/',$data,$match); + if($match[1] === '0')$result=array('touin'=>$touin,'is'=>'0'); + else $result=array('touin'=>$touin,'is'=>'1');*/ + + $dxrow['data'][]=$result; +} +exit(json_encode($dxrow)); diff --git a/route/admin.php b/route/admin.php new file mode 100644 index 0000000..5c20bd0 --- /dev/null +++ b/route/admin.php @@ -0,0 +1,64 @@ +prefix('admin.') + ->middleware(\app\middleware\LoadConfig::class) + ->middleware(\app\middleware\AuthAdmin::class) + ->middleware(\app\middleware\RefererCheck::class); + diff --git a/route/index.php b/route/index.php new file mode 100644 index 0000000..fa88e6f --- /dev/null +++ b/route/index.php @@ -0,0 +1,42 @@ +prefix('Index/') + ->middleware(\app\middleware\LoadConfig::class) + ->middleware(\app\middleware\AuthUser::class) + ->middleware(\app\middleware\ViewOutput::class); + + +Route::group(function () { + Route::get('/oauth/callback', 'callback'); + Route::post('/oauth/login', 'oauth'); + + Route::any('/login', 'login')->middleware(\app\middleware\ViewOutput::class); + Route::get('/logout', 'logout'); + + Route::get('/verifycode', 'verifycode'); + + Route::post('/adminlogin', 'adminlogin'); + Route::get('/adminlogout', 'adminlogout'); + + Route::get('/qqlogin', 'qqlogin')->middleware(\app\middleware\ViewOutput::class); + Route::get('/qqlogin_api', 'qqlogin_api')->middleware(\app\middleware\RefererCheck::class); +})->prefix('Auth/') + ->middleware(\app\middleware\LoadConfig::class) + ->middleware(\app\middleware\AuthUser::class); diff --git a/route/plugin.php b/route/plugin.php new file mode 100644 index 0000000..fcb0490 --- /dev/null +++ b/route/plugin.php @@ -0,0 +1,52 @@ +islogin){ + return msg("error", "请先登录"); + } + $app->initialize($model); + return $app->$method(); +})->middleware(\app\middleware\LoadConfig::class) + ->middleware(\app\middleware\AuthUser::class) + ->middleware(\app\middleware\RefererCheck::class); + +Route::get(':alias/[:method]', function () { + $alias = plugin_alias_get(); + $method = plugin_method_get(); + $model = plugin_info_get($alias); + if (!$model){ + abort(404, '页面不存在'); + } + $class = "plugin\\{$model['class']}\\App"; + if (!class_exists($class)) { + abort(404, '该插件类不存在'); + } + $app = new $class(); + if (!method_exists($app, $method)) { + abort(404, '该插件不存在'.$method.'方法'); + } + if($model['login'] == 1 && !request()->islogin){ + return $app->alert('info', '请先登录', '/login'); + } + $app->initialize($model); + return $app->$method(); +})->middleware(\app\middleware\LoadConfig::class) + ->middleware(\app\middleware\AuthUser::class) + ->middleware(\app\middleware\ViewOutput::class); + \ No newline at end of file diff --git a/runtime/.gitignore b/runtime/.gitignore new file mode 100644 index 0000000..3e0e2f8 --- /dev/null +++ b/runtime/.gitignore @@ -0,0 +1,4 @@ +* +!.gitignore +!update +!update/** \ No newline at end of file diff --git a/think b/think new file mode 100644 index 0000000..7461bc6 --- /dev/null +++ b/think @@ -0,0 +1,10 @@ +#!/usr/bin/env php +console->run(); \ No newline at end of file diff --git a/view/dispatch_jump.html b/view/dispatch_jump.html new file mode 100644 index 0000000..7e7452b --- /dev/null +++ b/view/dispatch_jump.html @@ -0,0 +1,60 @@ + + + + + 温馨提示 + + + + + +
        +
        + +
        +

        {$msg}

        + {if $url} +

        + 页面将在 {$wait} 秒后自动跳转 +

        + {/if} +

        + 返回上一页 + {if $url} + 立即跳转 + {/if} +

        +
        + + + \ No newline at end of file diff --git a/view/index/default/auth/login.html b/view/index/default/auth/login.html new file mode 100644 index 0000000..050f2c0 --- /dev/null +++ b/view/index/default/auth/login.html @@ -0,0 +1,34 @@ +{extend name="common/layout" /} +{block name="title"}用户登录 - {:config_get('title')}{/block} +{block name="main"} + +
        +
        +
        +
        +
        +
        +
        +
        +

        请选择登录方式

        +

        {if config_get('oauth_openqq')=='1'}{/if} + {if config_get('oauth_openwx')=='1'}{/if}

        +

        新用户快捷登录后会自动注册账号

        +
        +
        +
        +
        +
        +
        +
        +
        +{/block} +{block name="script"} + +{/block} \ No newline at end of file diff --git a/view/index/default/auth/qqlogin.html b/view/index/default/auth/qqlogin.html new file mode 100644 index 0000000..2447ede --- /dev/null +++ b/view/index/default/auth/qqlogin.html @@ -0,0 +1,42 @@ +{extend name="common/layout" /} +{block name="title"}QQ统一扫码页面 - {:config_get('title')}{/block} +{block name="main"} + +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        + 使用QQ手机版扫描二维码. +
        +
        +
        + +
        +
        +
        +
        +
        +
        +
        +
        +
        +{/block} +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/view/index/default/common/footer.html b/view/index/default/common/footer.html new file mode 100644 index 0000000..f2cd4b9 --- /dev/null +++ b/view/index/default/common/footer.html @@ -0,0 +1,9 @@ + + \ No newline at end of file diff --git a/view/index/default/common/header.html b/view/index/default/common/header.html new file mode 100644 index 0000000..a67639c --- /dev/null +++ b/view/index/default/common/header.html @@ -0,0 +1,112 @@ + +
        +
        + + +
        + +
        + \ No newline at end of file diff --git a/view/index/default/common/layout.html b/view/index/default/common/layout.html new file mode 100644 index 0000000..17e7b03 --- /dev/null +++ b/view/index/default/common/layout.html @@ -0,0 +1,31 @@ + + + + + + {block name="title"}标题{/block} + + + + + {block name="head"}{/block} + + + +
        + {include file="common/header" /} + + {block name="main"}主内容{/block} + + {include file="common/footer" /} +
        + + + + + + + +{block name="script"}{/block} + + \ No newline at end of file diff --git a/view/index/default/common/plugin_layout.html b/view/index/default/common/plugin_layout.html new file mode 100644 index 0000000..30cc6c9 --- /dev/null +++ b/view/index/default/common/plugin_layout.html @@ -0,0 +1,59 @@ + + + + + + {block name="title"}标题{/block} + + + + + {block name="head"}{/block} + + + +
        + {include file="common/header" /} + +
        + {:config_get('head_banner')} + {block name="main"}主内容{/block} + + {:config_get('foot_banner')} +
        + + {include file="common/footer" /} +
        + + + + + + + + +{block name="script"}{/block} + + \ No newline at end of file diff --git a/view/index/default/index/comment.html b/view/index/default/index/comment.html new file mode 100644 index 0000000..aa15e9f --- /dev/null +++ b/view/index/default/index/comment.html @@ -0,0 +1,186 @@ +{extend name="common/layout" /} +{block name="title"}{:config_get('title')} - {:config_get('subtitle')}{/block} +{block name="main"} +
        +
        +
        +
        +
        +
        +
        + +
        +
        +
        {if $islogin}{$user.username}{else}登录后才能发表留言{/if}
        +

        在使用工具遇到任何问题都可以在这里反馈哟!

        +
        +
        +
        +
        +
        +
        +
        +
        + +
        + +
        +
        +
        +
        +
        + +
        + +
        +
        +
        +
        +
        + +
        +
        +
        +
        +
        +
        + +
        +
        +
        留言列表
        +
        +
        +
        +
        +
        +
        + +
        +
        +
        +
        +
        +
        +{/block} +{block name="script"} + + +{if $islogin}{/if} +{/block} \ No newline at end of file diff --git a/view/index/default/index/history.html b/view/index/default/index/history.html new file mode 100644 index 0000000..a3db6d3 --- /dev/null +++ b/view/index/default/index/history.html @@ -0,0 +1,168 @@ +{extend name="common/layout" /} +{block name="title"}最近使用 - {:config_get('title')}{/block} +{block name="main"} +
        +
        +
        +
        + +
        + +
        +
        +
        + +
        +
        +
        +
        +
        + +
        +
        +
        +
        +
        + +
        +
        +
        +
        +
        +
        + + 最近使用 +
        +
        +
        + +
        +
        +
        +
        +
        +{/block} +{block name="script"} + +{/block} \ No newline at end of file diff --git a/view/index/default/index/index.html b/view/index/default/index/index.html new file mode 100644 index 0000000..3a64423 --- /dev/null +++ b/view/index/default/index/index.html @@ -0,0 +1,188 @@ +{extend name="common/layout" /} +{block name="title"}{:config_get('title')} - {:config_get('subtitle')}{/block} +{block name="main"} +
        +
        +
        +
        + +
        + +
        +
        +
        + +
        +
        +
        +
        +
        + +
        +
        +
        +
        +
        + +
        +
        +
        + {:config_get('head_banner')} +
        + + {:config_get('foot_banner')} +
        +
        +
        +{/block} +{block name="script"} + +{/block} \ No newline at end of file diff --git a/view/index/default/index/stars.html b/view/index/default/index/stars.html new file mode 100644 index 0000000..7adce6b --- /dev/null +++ b/view/index/default/index/stars.html @@ -0,0 +1,168 @@ +{extend name="common/layout" /} +{block name="title"}我的收藏 - {:config_get('title')}{/block} +{block name="main"} +
        +
        +
        +
        + +
        + +
        +
        +
        + +
        +
        +
        +
        +
        + +
        +
        +
        +
        +
        + +
        +
        +
        +
        +
        +
        + + 我的收藏 +
        +
        +
        + +
        +
        +
        +
        +
        +{/block} +{block name="script"} + +{/block} \ No newline at end of file diff --git a/view/index/default/template/iframe.html b/view/index/default/template/iframe.html new file mode 100644 index 0000000..b0a3a1a --- /dev/null +++ b/view/index/default/template/iframe.html @@ -0,0 +1,20 @@ + + + + + {$plugin.title} - {:config_get('title')} + + + + + + + + + + + \ No newline at end of file diff --git a/view/index/default/template/redirect.html b/view/index/default/template/redirect.html new file mode 100644 index 0000000..28f18f6 --- /dev/null +++ b/view/index/default/template/redirect.html @@ -0,0 +1,34 @@ + + + + + + + 页面加载中,请稍候... + + + + + + + + +
        +
        +
        +
        +
        +
        +
        + + \ No newline at end of file diff --git a/view/install/index.html b/view/install/index.html new file mode 100644 index 0000000..ea44af2 --- /dev/null +++ b/view/install/index.html @@ -0,0 +1,311 @@ + + + + 安装向导 - 彩虹工具网 + + + + + + + + + + + +
        +
        +
        +
        +
          +
        • 开始安装
        • +
        • 检测安装环境
        • +
        • 配置数据库
        • +
        • 配置管理员账号
        • +
        • 完成安装
        • +
        +
        +
        +
        + +
        +

        欢迎安装彩虹工具箱

        +

        Welcome to install Caihong Toolbox.

        +
        + +
        +
        +
        + +
        +

        检测安装环境

        +
        + + + + + + + + + + + + + +
        检测项检测结果
        {{index}} +
        + Yes +
        +
        + No +
        +
        +
        + +
        + +
        +
        +
        + +
        +

        配置数据库信息

        +
        +
        + + +
        +
        + + +
        +
        + + +
        +
        + + +
        +
        + + +
        +
        +
        + +
        +
        +
        + +
        +

        配置管理员账号

        +
        +
        + + +
        +
        + + +
        +
        +
        + +
        +
        +
        + +
        +

        完成安装

        +

        恭喜你,已经成功安装了彩虹工具箱~

        +
        + + +
        +
        +
        +
        +
        +
        + + + \ No newline at end of file