[{"bookSourceName":"18\u7b14\u8da3\u9601","bookSourceType":0,"bookSourceUrl":"https:\/\/www.bqgns.com","customOrder":0,"enabled":true,"enabledCookieJar":true,"enabledExplore":false,"lastUpdateTime":"1763201330387","respondTime":180000,"ruleBookInfo":{"author":"\/\/p[@class='author']\/text()","name":"\/\/div[@class='detail_rt']\/h1\/text()"},"ruleContent":{"content":"\/\/div[@class='text']\/text()"},"ruleExplore":[],"ruleSearch":{"author":"$..author","bookList":"$..list[*]","bookUrl":"\/book\/{$..id}","checkKeyWord":"\u6210\u529f","coverUrl":"$..imgUrl","intro":"","name":"$..title"},"ruleToc":{"chapterList":"div.v-sheet div a","chapterName":"a@text","chapterUrl":"a@href","nextTocUrl":"\/\/div[@class='seo_page']\/a[text()='\u4e0b\u4e00\u9875']\/@href"},"searchUrl":"\/api\/query\/search?keyword={{key}}&size=50","weight":0},{"bookSourceComment":"\/*\n\t20230724 \u66f4\u65b0\u9a8c\u8bc1\u7801\u83b7\u53d6\u903b\u8f91\uff0c\u83b7\u53d6\u4e00\u6b21\u6b63\u786e\u7684\u9a8c\u8bc1\u7801\u540e\uff0c\u4e00\u6bb5\u65f6\u95f4\u5185\u65e0\u9700\u518d\u6b21\u83b7\u53d6-\u5c10\u54d6\n  20230723 \u4fee\u6539\u53d1\u73b0\u4e3a\u52a8\u6001\u83b7\u53d6-\u5c10\u54d6\n\t\u53ef\u4ee5\u624b\u52a8\u5207\u6362\n\t\u6539\u53d8\u6e90URL\u5730\u5740\uff0c\u7f51\u7ad9\u5c31\u4f1a\u5207\u6362\n\t\u4e0b\u9762\u5957\u5a03\u7f51\u7ad9(m\u548cwww\u901a\u7528)\n\t\u5e0c\u671b\u4e2d\u6587\uff1ahttps:\/\/m.5xw.net\n\t123\u8bfb\u4e66\uff1ahttps:\/\/m.123dua.com\n\t\u6ee8\u5dde\u4e66\u7ad9\uff1ahttps:\/\/m.bzsz8.com\n\t\u5076\u7136\u4e2d\u6587\uff1ahttps:\/\/m.or77.net\n\t\u8da3\u4e03\u5c4b\uff1ahttps:\/\/m.qu7.net\n\t\u535a\u8da3\u4e2d\u6587\uff1ahttps:\/\/m.bq0.net\n\t\u6d2a\u90fd\u4e2d\u6587\uff1ahttps:\/\/m.hdzww.com\n\t\u6211\u6765\u8bfb\uff1ahttps:\/\/m.wolaidu1.com\n\t\u84dd\u6d77\u4e2d\u6587\u7f51\uff1ahttps:\/\/m.lanhaizw.com\n\t\u9f50\u9f50\u8bfb\uff1ahttps:\/\/m.qqduu.com\n        \u535a\u770b\uff1ahttps:\/\/m.bokanx.com\n        \u4e8c\u54c1\u4e2d\u6587\uff1ahttps:\/\/m.2pzw.com\n        \u6613\u6dd8\u4e66\u57ce\uff1ahttps:\/\/m.etao1.com\n        \u8bed\u5f55\u4e66\u9662\uff1ahttps:\/\/m.yulusy.com\n        \u9605\u8bfb\u4e66\u5c4b\uff1ahttps:\/\/m.readlady.com\/\n  \t\u6709\u4e3a\u4e66\u5c4b\uff1ahttps:\/\/m.youweisw.com\/\n        \u9e3f\u5b87\u4e66\u9662\uff1ahttps:\/\/m.hongyujixie.net\/\n        \u6d82\u9605\u6587\u5b66\uff1ahttps:\/\/m.1ty.net\/\n        \u4e66\u5c71\u697c\u9601\uff1ahttps:\/\/m.0773lg.org\n*\/\ntry{\n\tc2=result.match(\/c2=\"(.*?)\"\/)[1]\n\tu2=result.match(\/src=\"(.*?)\"\/)[1]\n\torigin=baseUrl.match(\/[^.]+[^\/]+\/)[0]\n\tstr=java.ajax(origin+u2).match(\/function.*\\(\\)\\}\/)[0]\n\teval(str);temp=ajax(c2)\n\tjava.ajax(origin+temp)\n if(baseUrl.match(\/sscc\/)){\n \tu=java.get(\"url\")}else{u=baseUrl}\n \t\/\/java.log(u)\n\tresult=java.ajax(u)\n}catch(err){result}","bookSourceGroup":"\u5e38\u7528\u25ce","bookSourceName":"\u5e0c\u671b\u4e2d\u6587","bookSourceType":0,"bookSourceUrl":"https:\/\/m.5xw.net","customButton":false,"customOrder":6,"enabled":true,"enabledCookieJar":true,"enabledExplore":false,"eventListener":false,"header":"@js:\nJSON.stringify({\n\"User-Agent\": java.getWebViewUA()\n})","lastUpdateTime":"1763433404027","respondTime":7090,"ruleBookInfo":{"author":"class.b0@tag.span.0@text##\u4f5c\u8005\uff1a","coverUrl":"class.b0@img@src","intro":"[property~=description]@content##(^|[\u3002\uff01\uff1f]+[\u201d\u300d\uff09\u3011]?)##$1<br>","kind":"[property~=category]@content##.\\d{2}:.*","lastChapter":"class.b0@dd.-1@a@text","name":"class.FCol.0@text","tocUrl":"class.nrbt@tag.a.0@href"},"ruleContent":{"content":"<js>\nif(result.match(\/<title>\\d+<\/)){\ncookie.removeCookie(baseUrl)\nresult=java.ajax(baseUrl)\n}\neval(String(source.bookSourceComment))\ncc=String(cookie.getCookie(baseUrl)).replace(\/\\%2C[^;]+\/g,\"\")\ncookie.setCookie(baseUrl,cc)\njava.setContent(result)\nresult\n<\/js>\n#content@html||[class~=(?i)content]@html","nextContentUrl":"text.\u4e0b\u2014\u9875@href||text.\u4e0b\u4e00\u9875@href||text.\u4e0b\u2014\u9875@href||text.\u4e0b\u2014\u9875@href||text.\u4e0b\u2014\u9875@href||text.\u4e0b\u2014\u9875@href||","replaceRegex":"##\\s+\"\\n|\\s+\u672c\u7ae0(\u6ca1|\u672a)\u5b8c\uff0c.*|(\\.\\n)?.*\u770b\u5b8c\u8bb0\u5f97\u6536\u85cf.*|\\s+\\\/\\d+\\\/.*|\\s+\u3002\uff1a.*|\\s+\uff1a\u3002.*"},"ruleExplore":{"author":"text.\u4f5c\u8005\uff1a@text##\u4f5c\u8005\uff1a","bookList":"dl[class=\"B\"]&&dl[class=\"S\"]","bookUrl":"a.0@href","coverUrl":"img@src||img@data-src","intro":".d2@text##\u7b80\u4ecb\uff1a","kind":"{{@@span:contains(\u7c7b\u522b\uff1a)@text##^\u7c7b\u522b\uff1a}}\n{{@@dd:contains(\u66f4\u65b0\u65f6\u95f4\uff1a)@text##.*\u66f4\u65b0\u65f6\u95f4\uff1a}}","lastChapter":"{{@@dd.-1@a@text}} \u2022 {{@@class.ml@text||dd.-2@text##\u66f4\u65b0\u65f6\u95f4\uff1a|\\s.*}}","name":"a.1@text||a.0@text"},"ruleSearch":{"author":"text.\u4f5c\u8005\uff1a@text##\u4f5c\u8005\uff1a","bookList":"<js>\neval(String(source.bookSourceComment))\ntry{\n\tactyzm=result.match(\/actyzm\" value=\"([^\"]+)\"\/)[1];\n\tbutton=result.match(\/button\" value=\"([^\"]+)\"\/)[1];\t\n\turl=java.get(\"url\");\n\tcode=String(url).replace(\/\\\/sscc.*\/,'')+\"\/member\/getcode.asp\";\n\tyzco=source.getVariable();\n\tfunction getOption(str,co){\n  \thed={\"Referer\":url,\"Cookie\":co}\n  \treturn JSON.stringify({\"method\":\"POST\",\n\"charset\":\"gb2312\",\"body\":\"actyzm=\"+actyzm+\"&yzm=\"+str+\"&button=\"+button,\"headers\":hed});\n  }\n  function succes(){\n\t\tyzm=java.getVerificationCode(code);\n\t\turl+=\",\"+getOption(yzm,\"\");\n\t\thm=java.ajax(url);\n\t\tco=java.getCookie(url,\"g3jy9sqo0ws\");\n   source.setVariable(yzm+',g3jy9sqo0ws='+co)\n   return hm;\n  }\n\tif(yzco&&yzco!=''){\n\t\tv=String(yzco).split(',');\n\t\tu=url+\",\"+getOption(v[0],v[1]);\n\t\tresult=java.ajax(u);\n\t\tif(\/\u8bf7\u8f93\u5165\u9a8c\u8bc1\u7801\/.test(result)){\n\t\t\tjava.longToast(\"  \uff01\u9a8c\u8bc1\u7801\u8fc7\u671f\u6216\u6709\u8bef\uff0c\u91cd\u65b0\u83b7\u53d6  \uff01\")\n\t\t\tresult=succes();\n\t\t}\n\t}else{result=succes(\"\");}\nresult\n}catch(err){java.log(err);result}\n<\/js>\n.B","bookUrl":"a.0@href","checkKeyWord":"\u53cd\u6d3e","coverUrl":"img@src||img@data-src","intro":".d2@text##\u7b80\u4ecb\uff1a","kind":"class.js@text##\u7c7b\u522b\uff1a|\\\/ \u4f5c\u8005.*\\s.*","lastChapter":"{{@@dd.-1@a@text}}","name":"a.1@text","wordCount":"@js:\ntry{\t\ncc=String(cookie.getCookie(baseUrl)).replace(java.get(\"key\"),\"\")\ncookie.setCookie(baseUrl,cc)\n}catch(e){\"\"}"},"ruleToc":{"chapterList":"\/\/*[@class=\"MLlist\"]\/li\/a||\/\/dt[-1]\/following-sibling::dd\/a","chapterName":"text","chapterUrl":"href"},"searchUrl":"@js:\ntry{\nbUrl=source.getKey();\ncookie.removeCookie(bUrl)\ns=String(java.ajax(bUrl))\nact=s.match(\/\"act\".*?\"(.{16})\"\/)[1]\nsub=s.match(\/name=\"submit\".*?value=\"(.*?)\"\/)[1]\nbody=String(\"act=\"+act+\"&q=\"+key+\"&submit=\"+sub)\nxx=body.match(\/[^&=]+\/g)\nfor(i in xx){\nre=java.encodeURI(xx[i],\"gbk\")\nbody=body.replace(xx[i],re)\n }\nvar url=String(bUrl+\"\/sscc\/,\"+JSON.stringify({\n\t\"method\":\"POST\",\"body\":body}))\njava.put(\"key\",body.match(\/q=([^&]*)\/)[1]);\njava.put(\"url\",bUrl+\"\/sscc\/\"+java.post(bUrl+\"\/sscc\/\",body,{}).header(\"Location\"));\nurl\n}catch(e){java.longToast(\"\u83b7\u53d6\u5931\u8d25\")}","weight":0},{"bookSourceName":"\u9739\u96f3\u4e66\u574a","bookSourceType":0,"bookSourceUrl":"https:\/\/www.pilisf.com\/","customOrder":0,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"\u7537\u9891::https:\/\/www.pilisf.com\/sort\/1_{{page}}\/&&\u5973\u9891::https:\/\/www.pilisf.com\/sort\/2_{{page}}\/&&\u4e2d\u56fd\u6587\u5b66::https:\/\/www.pilisf.com\/sort\/3_{{page}}\/&&\u5916\u56fd\u6587\u5b66::https:\/\/www.pilisf.com\/sort\/4_{{page}}\/&&\u8f7b\u5c0f\u8bf4::https:\/\/www.pilisf.com\/sort\/5_{{page}}\/&&\u767e\u5408::https:\/\/www.pilisf.com\/sort\/6_{{page}}\/&&\u803d\u7f8e::https:\/\/www.pilisf.com\/sort\/7_{{page}}\/&&\u7f51\u76d8\u8d44\u6e90::https:\/\/www.pilisf.com\/sort\/8_{{page}}\/","lastUpdateTime":"1763495105008","respondTime":180000,"ruleBookInfo":{"author":".infotype@a@text","coverUrl":".infohead@img@src","intro":".intro@p.0@text","kind":".infotype@p.1@text##\u4f5c\u54c1\u7c7b\u578b\uff1a","lastChapter":".list_xm@li.0@text","name":".cataloginfo@h3@text","tocUrl":".infolink@a.1@href"},"ruleContent":{"content":".novelcontent@text","title":"h1@text"},"ruleExplore":{"author":".content@a.1@text","bookList":".article","bookUrl":".content@a.0@href","coverUrl":".article@a.0@img@data-src","intro":".content@.simple@text","name":".content@a.0@text"},"ruleSearch":{"author":".sone@a.1@text","bookList":".sone","bookUrl":".sone@a.0@href","name":".sone@a.0@text"},"ruleToc":{"chapterList":"li","chapterName":"a@text","chapterUrl":"a@href"},"searchUrl":"\/s.php,{\n\"charset\":\"gbk\",\n\"method\":\"post\",\n\"body\":\"s={{key}}&type=articlename\"\n}","weight":0},{"bookSourceGroup":"\u66f4\u65b0","bookSourceName":"\u679c\u6587\u5b66\u7f51","bookSourceType":0,"bookSourceUrl":"https:\/\/www.guowx.com","bookUrlPattern":"http:\/\/\\w+.guowx.com\/$","customOrder":0,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"\u7384\u5e7b\u5947\u5e7b::http:\/\/www.guowx.com\/xuanhuan<,?page={{page}}>\n\u6b66\u4fa0\u4ed9\u4fa0::http:\/\/www.guowx.com\/xianxia<,?page={{page}}>\n\u90fd\u5e02\u8a00\u60c5::http:\/\/www.guowx.com\/dushi<,?page={{page}}>\n\u5386\u53f2\u519b\u4e8b::http:\/\/www.guowx.com\/lishi<,?page={{page}}>\n\u79d1\u5e7b\u4f20\u5947::http:\/\/www.guowx.com\/kehuan<,?page={{page}}>\n\u6050\u6016\u7075\u5f02::http:\/\/www.guowx.com\/kongbu<,?page={{page}}>\n\u5176\u4ed6\u7c7b\u578b::http:\/\/www.guowx.com\/qita<,?page={{page}}>\n\u5168\u672c\u5c0f\u8bf4::http:\/\/www.guowx.com\/quanben<,?page={{page}}>","header":"{\"User-Agent\": \"Mozilla\/5.0 (Linux; Android 9) Mobile Safari\/537.36\"}","lastUpdateTime":"1763601574712","respondTime":180000,"ruleBookInfo":{"author":"[property$=author]@content","coverUrl":"[property$=image]@content","downloadUrls":"text.\u4e0b\u8f7d@href","intro":"[property$=description]@content","kind":"[property~=category|status|time]@content","lastChapter":"[property$=latest_chapter_name]@content","name":"[property$=book_name]@content","wordCount":"{{@@#count span.1@text}}\u5b57"},"ruleContent":{"content":"#TextContent p@textNodes##([^\\n]*?(\u63d0\u9192\u60a8|\u60f3\u770b|\u7684\u4f5c\u54c1|\u672c\u4f5c\u8005)[\\s\\S]*?\u300a[\\s\\S]*?\u300b[\\s\\S]*?\u5b8c\u6574\u7ae0\u8282[\\s\\S]*?(\uff4f\uff4d|om)\\)[\\s\\S]*?\\r?\\n?|([\\s\\S]{3}\uff47\uff55\uff4f|[\\s\\S]{7}\u6765|[\\s\\S]{2}\u679c)([\\s\\S]*?)(om|\uff4fm|\uff4f\uff4d)\\))##","nextContentUrl":"@js:\n(()=>{\n   \/\/\u6839\u636eurl\u83b7\u53d6\u4e0b\u4e00\u9875nextBaseUrl\u7684nextPage \n   if (\/\\?page=\\d+\/.test(baseUrl)) {\n      nextPage = parseInt(baseUrl.match(\/page=(\\d+)\/)[1])+1;\n   } else {\n      nextPage =2\n   }\n   \/\/\u6839\u636eresult\u7684\u533a\u522b\u5224\u65ad\u662f\u5426\u52a0\u8f7d\u4e0b\u4e00\u9875\n   if (result.includes('id=\"linkNext\"')) {\n      \/\/\u7f6enull,\u5426\u5219\u4f1a\u5c1d\u8bd5\u6267\u884c\n      nextBaseUrl = null;\n  } else {\n      nextBaseUrl = baseUrl.replace(\/\\?page=\\d+\/, '')+\"?page=\"+nextPage;\n  }\n})()\nnextBaseUrl"},"ruleExplore":{"bookList":"#sitebox dl","bookUrl":"a.1@href","coverUrl":"img@_src","intro":".book_des@text","kind":"span.2:3:1@text","lastChapter":"a.-1@text","name":"h3 a@text","wordCount":"{{@@span.-1@text}}\u5b57"},"ruleSearch":{"bookList":"#nr","bookUrl":"a.1@href","checkKeyWord":"\u6211\u7684","coverUrl":"img@_src","intro":".book_des@text","kind":"span.2:3:1@text","lastChapter":"a.-1@text","name":"h3 a@text","wordCount":"{{@@span.-1@text}}\u5b57"},"ruleToc":{"chapterList":"#chapterList li a","chapterName":"text","chapterUrl":"href"},"searchUrl":"@js:\n\nvar url=source.getKey();\n\nvar html = java.ajax(url);\n\ntoken = org.jsoup.Jsoup.parse(html).select('input[name=_token]').attr('value');\n\nurl+\"\/search,\"+JSON.stringify({\n  \"body\": `_token=${token}&keyword=${key}&searchtype=articlename`,\n  \"method\": \"post\"\n})","weight":0},{"bookSourceName":"English Web Novel","bookSourceType":0,"bookSourceUrl":"https:\/\/www.webnovel.com","customOrder":0,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"lastUpdateTime":"1763619151189","respondTime":180000,"ruleBookInfo":{"author":"@XPath:\/\/a[contains(@href, \"\/profile\/\")]\/text()","coverUrl":"@XPath:\/\/img[contains(@src, \"book-pic\")]\/@src","kind":"@XPath:\/\/a[@class='det-hd-tag']\/span\/text()","lastChapter":"@XPath:\/\/a[contains(@class, \"lst-chapter\")]\/text()","name":"@XPath:\/\/h1\/text()"},"ruleContent":{"content":"@XPath:\/\/div[@class='dib pr']\/\/p\/text()","title":"@XPath:\/\/div[@class='j_chapName']\/text()"},"ruleExplore":[],"ruleReview":[],"ruleSearch":{"bookList":"@XPath:\/\/li[@class='pr pb20 mb12']","bookUrl":"@XPath:a\/@href\n<js>\nvar n = result.split(\"_\");\nvar id = n[n.length - 1].replace(\/[^\\d]\/g, \"\" );\nvar url = \"https:\/\/www.webnovel.com\/book\/\"+id;\nurl+\"\/catalog\";\n<\/js>","checkKeyWord":"who","coverUrl":"@XPath:\/a\/img\/@src","intro":"@XPath:p[@class='fs16 c_000 ells _2 lh24']\/text()","kind":"@XPath:p[@class='mb8 g_tags']\/a\/text()","name":"@XPath:a\/@data-bookname"},"ruleToc":{"chapterList":"@XPath:\/\/div[@class='volume-item']\/\/a","chapterName":"@XPath:@title","chapterUrl":"@XPath:@href"},"searchUrl":"\/search? keywords={{key}}","weight":0},{"bookSourceComment":"\ud83c\udd7f\ufe0f Pixiv \u6f2b\u753b\uff08\u66f4\u65b0\ud83d\udcc6\uff1a2025-11-22\uff09\n\n\u4e66\u6e90\u7248\u672c\uff1a246\n\u53ef\u7528\u529f\u80fd\uff1a\u2705\u641c\u7d22\u2705\u53d1\u73b0\u2705\u6dfb\u52a0\u7f51\u5740\u2705\u8ba2\u9605\u6e90\n\u641c\u7d22\u63d2\u753b\uff1a\u2705\u63d2\u753b\u2705\u6f2b\u753b\u2705\u52a8\u56fe\u2705\u6807\u7b7e\n\u53d1\u73b0\u6f2b\u753b\uff1a\u2705\u5173\u6ce8\u2705\u8ffd\u66f4\u2705\u63a8\u8350\u2705\u53d1\u73b0\u2705\u6536\u85cf\n\u6dfb\u52a0\u7f51\u5740\uff1a\u2705\u63d2\u753b\u94fe\u63a5\u2705\u6f2b\u753b\u76ee\u5f55\n\u8ba2\u9605\u7528\u6cd5\uff1a\u70b9\u51fb\u8ba2\u9605\u6e90\u6253\u5f00\u63d2\u753b\/\u6f2b\u753b\u76ee\u5f55\uff0c\u3010\u5237\u65b0\u3011\uff0c\u70b9\u51fb\u3010\u52a0\u5165\u4e66\u67b6\u3011\u6309\u94ae\uff0c\u6dfb\u52a0\u5230\u4e66\u67b6\n\n\u4e66\u6e90\u53d1\u5e03\uff1aPixiv \u4e66\u6e90\u9891\u9053 https:\/\/t.me\/PixivSource\n\u9879\u76ee\u5730\u5740\uff1ahttps:\/\/github.com\/DowneyRem\/PixivSource\n\u4f7f\u7528\u6559\u7a0b\uff1ahttps:\/\/github.com\/DowneyRem\/PixivSource\/blob\/main\/doc\/Pixiv.md\n\n\u65e7\u7248\u4e66\u6e90\uff1a\nhttps:\/\/cdn.jsdelivr.net\/gh\/DowneyRem\/PixivSource@191\/pixiv.json\nhttps:\/\/raw.githubusercontent.com\/DowneyRem\/PixivSource\/191\/pixiv.json\n\n\u89c4\u5219\u8ba2\u9605\uff1aimport \u8ba2\u9605\u6e90\nhttps:\/\/cdn.jsdelivr.net\/gh\/DowneyRem\/PixivSource@main\/import.json\nhttps:\/\/raw.githubusercontent.com\/DowneyRem\/PixivSource\/main\/import.json\n\n\u2699\ufe0f \u4e66\u6e90\u8bbe\u7f6e\uff1a\n\u4e66\u6e90\u7ba1\u7406 - \u7f16\u8f91\u4e66\u6e90 - \u57fa\u672c - \u53d8\u91cf\u8bf4\u660e - \u4fee\u6539\u5e76\u4fdd\u5b58","bookSourceGroup":"\ud83d\udd1e Pixiv \u6f2b\u753b","bookSourceName":"\ud83c\udd7f\ufe0f Pixiv \u6f2b\u753b","bookSourceType":2,"bookSourceUrl":"https:\/\/www.pixiv.net\/manga","bookUrlPattern":"(https?:\/\/)?(www\\.)?pixiv\\.net\/((artworks|user\/\\d+\/series)|ajax\/(illust|series))\/\\d+","concurrentRate":"3\/2000","customButton":false,"customOrder":2,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"eventListener":false,"exploreUrl":"@js:\nlet SHOW_GENERAL_NEW, SHOW_GENERAL_RANK\ntry {\n    settings = JSON.parse(String(source.variableComment).match(RegExp(\/{([\\s\\S]*?)}\/gm)))\n    SHOW_GENERAL_NEW = settings.SHOW_GENERAL_NEW     \/\/ \u53d1\u73b0\uff1a\u6700\u65b0\u3001\u4f01\u5212\u3001\u7ea6\u7a3f\u663e\u793a\u4e00\u822c\u5c0f\u8bf4\n} catch (e) {\n    SHOW_GENERAL_NEW = false\n}\n\nli = [\n    {\"\u2b50\ufe0f \u5173\u6ce8\": \"https:\/\/www.pixiv.net\/ajax\/follow_latest\/illust?p={{page}}&mode=all&lang=zh\"},\n    {\"\ud83d\udcc3 \u8ffd\u66f4\": \"https:\/\/www.pixiv.net\/ajax\/watch_list\/manga?p={{page}}&new=1&lang=zh\"},\n    {\"\ud83d\udcaf \u63a8\u8350\": \"https:\/\/www.pixiv.net\/ajax\/top\/illust?mode=all&lang=zh\"},\n    {\"\ud83d\udd0d \u53d1\u73b0\": \"https:\/\/www.pixiv.net\/ajax\/illust\/discovery?mode=all&lang=zh\"},\n    {\"\u2764\ufe0f \u6536\u85cf\": \"https:\/\/www.pixiv.net\/ajax\/user\/{{cache.get(\\\"pixiv:uid\\\")}}\/illusts\/bookmarks?tag=&offset={{(page-1)*24}}&limit=24&rest=show&lang=zh\"},\n    {\"\u3299\ufe0f \u6536\u85cf\": \"https:\/\/www.pixiv.net\/ajax\/user\/{{cache.get(\\\"pixiv:uid\\\")}}\/illusts\/bookmarks?tag=&offset={{(page-1)*24}}&limit=24&rest=hide&lang=zh\"},\n    {\"\ud83c\udfe0 \u9996\u9875\": \"https:\/\/www.pixiv.net\"},\n    {\"\ud83c\udd99 \u66f4\u65b0\": \"https:\/\/cdn.jsdelivr.net\/gh\/DowneyRem\/PixivSource@main\/pixiv.json\"}\n]\n\nr18New = [\n    {\"\ud83c\udd95 \u6700\u65b0 \u4f01\u5212 \u7ea6\u7a3f \ud83d\udcb0\": \"\"},\n    {\"\ud83c\udd95 \u6700\u65b0\": \"https:\/\/www.pixiv.net\/ajax\/illust\/new?lastId=0&limit=20&type=manga&r18=true&lang=zh\"},\n    {\"\ud83d\udcd1 \u4f01\u5212\": \"https:\/\/www.pixiv.net\/ajax\/user_event\/portal\/artworks?mode=r18&p={{page}}&lang=zh\"},\n    {\"\ud83d\udcb0 \u7ea6\u7a3f\": \"https:\/\/www.pixiv.net\/ajax\/commission\/page\/request\/complete\/manga?mode=r18&p={{page}}&lang=zh\"},\n    {\"\ud83d\udd0d \u53d1\u73b0\": \"https:\/\/www.pixiv.net\/ajax\/illust\/discovery?mode=r18&lang=zh\"},\n]\n\ngeneralNew = [\n    {\"\u2705 \u6700\u65b0 \u4f01\u5212 \u7ea6\u7a3f \u2705\": \"\"},\n    {\"\u6700\u65b0\": \"https:\/\/www.pixiv.net\/ajax\/illust\/new?lastId=0&limit=20&type=manga&lang=zh\"},\n    {\"\u4f01\u5212\": \"https:\/\/www.pixiv.net\/ajax\/user_event\/portal\/artworks?mode=all&p={{page}}&lang=zh\"},\n    {\"\u7ea6\u7a3f\": \"https:\/\/www.pixiv.net\/ajax\/commission\/page\/request\/complete\/manga?mode=all&p={{page}}&lang=zh\"},\n    {\"\u53d1\u73b0\": \"https:\/\/www.pixiv.net\/ajax\/illust\/discovery?mode=all&lang=zh\"}\n]\n\nr18Rank = [\n    {\"\ud83d\udc51 \u6392\u884c\u699c\u5355 \ud83d\udc51\": \"\"},\n    {\"\u4eca\u65e5\": \"https:\/\/www.pixiv.net\/ranking.php?mode=daily_r18&p={{page}}&format=json\"},\n    {\"\u672c\u5468\": \"https:\/\/www.pixiv.net\/ranking.php?mode=weekly_r18&p={{page}}&format=json\"},\n    {\"R18G\": \"https:\/\/www.pixiv.net\/ranking.php?mode=r18g&p={{page}}&format=json\"},\n    {\"\u7537\u6027\": \"https:\/\/www.pixiv.net\/ranking.php?mode=male_r18&p={{page}}&format=json\"},\n    {\"\u5973\u6027\": \"https:\/\/www.pixiv.net\/ranking.php?mode=female_r18&p={{page}}&format=json\"}\n]\n\ngeneralRank = [\n    {\"\ud83c\udfc6 \u6392\u884c\u699c\u5355 \ud83c\udfc6\": \"\"},\n    {\"\u4eca\u65e5\": \"https:\/\/www.pixiv.net\/ranking.php?mode=daily&p={{page}}&format=json\"},\n    {\"\u672c\u5468\": \"https:\/\/www.pixiv.net\/ranking.php?mode=weekly&p={{page}}&format=json\"},\n    {\"\u672c\u6708\": \"https:\/\/www.pixiv.net\/ranking.php?mode=monthly&p={{page}}&format=json\"},\n    {\"\u65b0\u4eba\": \"https:\/\/www.pixiv.net\/ranking.php?mode=rookie&p={{page}}&format=json\"},\n    {\"\u539f\u521b\": \"https:\/\/www.pixiv.net\/ranking.php?mode=original&p={{page}}&format=json\"},\n    {\"A I \": \"https:\/\/www.pixiv.net\/ranking.php?mode=original&p={{page}}&format=json\"},\n    {\"\u7537\u6027\": \"https:\/\/www.pixiv.net\/ranking.php?mode=male&p={{page}}&format=json\"},\n    {\"\u5973\u6027\": \"https:\/\/www.pixiv.net\/ranking.php?mode=female&p={{page}}&format=json\"},\n]\n\nif (SHOW_GENERAL_RANK === true) {\n    li = li.concat(generalNew)\n}\nli = li.concat(r18New)\nli = li.concat(r18Rank)\nli = li.concat(generalRank)\n\nli.forEach(item => {\n    item.title = Object.keys(item)[0]\n    item.url = Object.values(item)[0]\n    if (item.url.includes(\"https:\/\/www.pixiv.net\")) item.url = urlIP(item.url)\n    delete item[Object.keys(item)[0]]\n    item.style = {}\n    item.style.layout_flexGrow = 1\n    item.style.layout_flexShrink = 1\n    item.style.layout_alignSelf = \"auto\"\n    item.style.layout_wrapBefore = \"false\"\n    if (item.url === \"\") {\n        item.style.layout_flexBasisPercent = 1\n    } else {\n        item.style.layout_flexBasisPercent = -1\n    }\n})\n\nJSON.stringify(li)","header":"{\"referer\":\"https:\/\/www.pixiv.net\"}","jsLib":"var cacheSaveSeconds = 7*24*60*60  \/\/ \u957f\u671f\u7f13\u5b58\u65f6\u95f4 7\u5929\nvar cacheTempSeconds = 10*60*1000  \/\/ \u77ed\u671f\u7f13\u5b58 10min\n\nfunction cacheGetAndSet(key, supplyFunc) {\n    const {java, cache} = this\n    let v = cache.get(key)\n    \/\/ \u7f13\u5b58\u4fe1\u606f\u9519\u8bef\u65f6\uff0c\u4fdd\u5b58 10min \u540e\u91cd\u65b0\u8bf7\u6c42\n    if (v && JSON.parse(v).error === true) {\n        if (new Date().getTime() >= JSON.parse(v).timestamp + cacheTempSeconds) {\n            cache.delete(key)\n            v = cache.get(key)\n        }\n    }\n    \/\/ \u65e0\u7f13\u5b58\u4fe1\u606f\u65f6\uff0c\u8fdb\u884c\u8bf7\u6c42\n    if (v === undefined || v === null) {\n        v = supplyFunc()\n        v.timestamp = new Date().getTime()\n        v = JSON.stringify(v)\n        cache.put(key, v, cacheSaveSeconds)\n    }\n    return JSON.parse(v)\n}\n\nfunction isHtmlString(str) {\n    return str.startsWith(\"<!DOCTYPE html>\")\n}\nfunction isJsonString(str) {\n    try {\n        if (typeof JSON.parse(str) === \"object\") return true\n    } catch(e) {}\n    return false\n}\n\nfunction isLogin() {\n    const {java, cache} = this\n    return !!cache.get(\"csfrToken\")\n}\nfunction getAjaxJson(url, forceUpdate) {\n    const {java, cache} = this\n    let v = cache.get(url)\n    if (forceUpdate || v && new Date().getTime() >= JSON.parse(v).timestamp + cacheTempSeconds) {\n        cache.delete(url)\n    }\n    return this.cacheGetAndSet(url, () => {\n        return JSON.parse(java.ajax(url))\n    })\n}\nfunction getAjaxAllJson(urls, forceUpdate) {\n    const {java, cache} = this\n    let v = cache.get(urls)\n    if (forceUpdate || v && new Date().getTime() >= JSON.parse(v).timestamp + cacheTempSeconds) {\n        cache.delete(urls)\n    }\n    return this.cacheGetAndSet(urls, () => {\n        let result = java.ajaxAll(urls).map(resp => JSON.parse(resp.body()))\n        cache.put(urls, JSON.stringify(result), cacheSaveSeconds)\n        for (let i in urls) cache.put(urls[i], JSON.stringify(result[i]), cacheSaveSeconds)\n        return result\n    })\n}\nfunction getWebviewJson(url, parseFunc) {\n    const {java, cache} = this\n    return this.cacheGetAndSet(url, () => {\n        let html = java.webView(null, url, null)\n        return JSON.parse(parseFunc(html))\n    })\n}\n\nfunction urlIP(url) {\n    const {java, cache, source} = this\n    let isIPDirect\n    if (source.bookSourceName.includes(\"\u5907\u7528\") || source.bookSourceName.includes(\"\u6f2b\u753b\")) {\n        isIPDirect = JSON.parse(String(source.variableComment).match(RegExp(\/{([\\s\\S]*?)}\/gm)))?.IPDirect || false\n    } else {\n        isIPDirect = JSON.parse(cache.get(\"pixivSettings\")).IPDirect || false\n    }\n\n    if (isIPDirect) {\n        url = url.replace(\"http:\/\/\", \"https:\/\/\").replace(\"www.pixiv.net\", \"210.140.139.155\")\n        let headers = {\n            \/\/ \"User-Agent\": \"Mozilla\/5.0 (Linux; Android 14)\",\n            \/\/ \"X-Requested-With\": \"XMLHttpRequest\",\n            \"Host\": \"www.pixiv.net\",\n            \/\/ \"x-csrf-token\": cache.get(\"csfrToken\") || \"\",\n            \/\/ \"Cookie\": cache.get(\"pixivCookie\") || \"\"\n        }\n        return `${url}, ${JSON.stringify({headers: headers})}`\n    }\n    return url\n}\n\nfunction urlIllustUrl(illustId) {\n    return `https:\/\/www.pixiv.net\/artworks\/${illustId}`\n}\nfunction urlIllustDetailed(illustId) {\n    return `https:\/\/www.pixiv.net\/ajax\/illust\/${illustId}?lang=zh`\n}\nfunction urlIllustsDetailed(userId, idList) {\n    return `https:\/\/www.pixiv.net\/ajax\/user\/${userId}\/illusts?${idList.map(v => \"ids[]=\" + v).join(\"&\")}`\n}\nfunction urlSeriesUrl(userId, seriesId) {\n    return `https:\/\/www.pixiv.net\/user\/${userId}\/series\/${seriesId}`\n}\nfunction urlSeriesDetailed(seriesId, page) {\n    if (page === undefined) page = 1\n    return `https:\/\/www.pixiv.net\/ajax\/series\/${seriesId}?p=${page}&lang=zh`\n}\n\nfunction urlUserAllWorks(userId) {\n    return `https:\/\/www.pixiv.net\/ajax\/user\/${userId}\/profile\/all?lang=zh`\n}\n\nfunction urlSearchArtwork(name, page) {\n    return `https:\/\/www.pixiv.net\/ajax\/search\/artworks\/${encodeURI(name)}?word=${encodeURI(name)}&order=date_d&mode=all&p=${page}&s_mode=s_tc&type=all&lang=zh`\n}\nfunction urlSearchIllust(name, page) {\n    return `https:\/\/www.pixiv.net\/ajax\/search\/artworks\/${encodeURI(name)}?word=${encodeURI(name)}&order=date_d&mode=all&p=${page}&s_mode=s_tc&type=illust&lang=zh`\n}\nfunction urlSearchManga(name, page) {\n    return `https:\/\/www.pixiv.net\/ajax\/search\/artworks\/${encodeURI(name)}?word=${encodeURI(name)}&order=date_d&mode=all&p=${page}&s_mode=s_tc&type=manga&lang=zh`\n}\nfunction urlSearchUgoira(name, page) {\n    return `https:\/\/www.pixiv.net\/ajax\/search\/artworks\/${encodeURI(name)}?word=${encodeURI(name)}&order=date_d&mode=all&p=${page}&s_mode=s_tc&type=ugoira&lang=zh`\n}\n\/\/ \u5b8c\u5168\u5339\u914d\u7528\u6237\u540d\nfunction urlSearchUser(name) {\n    return `https:\/\/www.pixiv.net\/search\/users?nick=${encodeURI(name)}&s_mode=s_usr&nick_mf=1`\n}\n\nfunction urlCoverUrl(url) {\n    const {java, cache, source} = this\n    let isIPDirect\n    if (source.bookSourceName.includes(\"\u5907\u7528\")|| source.bookSourceName.includes(\"\u6f2b\u753b\")) {\n        isIPDirect = JSON.parse(String(source.variableComment).match(RegExp(\/{([\\s\\S]*?)}\/gm)))?.IPDirect || false\n    } else {\n        isIPDirect = JSON.parse(cache.get(\"pixivSettings\")).IPDirect || false\n    }\n\n    let headers = {\"Referer\": \"https:\/\/www.pixiv.net\/\"}\n    if (isIPDirect && url.trim()) {\n        if (url.includes(\"i.pximg.net\")) {\n            url = url.replace(\"https:\/\/i.pximg.net\", \"https:\/\/210.140.139.133\")\n            headers.host = \"i.pximg.net\"\n        } else {\n            url = url.replace(\"https:\/\/s.pximg.net\", \"https:\/\/210.140.139.133\")\n            headers.host = \"s.pximg.net\"\n        }\n    }\n    return `${url}, ${JSON.stringify({headers: headers})}`\n}\n\nfunction dateFormat(str) {\n    let addZero = function (num) {\n        return num < 10 ? '0' + num : num;\n    }\n    let time = new Date(str);\n    let Y = time.getFullYear() + \"\u5e74\";\n    let M = addZero(time.getMonth() + 1) + \"\u6708\";\n    let D = addZero(time.getDate()) + \"\u65e5\";\n    return Y + M + D;\n}\nfunction timeFormat(str) {\n    let addZero = function (num) {\n        return num < 10 ? '0' + num : num;\n    }\n    let time = new Date(str);\n    let YY = time.getFullYear()\n    let MM = addZero(time.getMonth() + 1)\n    let DD = addZero(time.getDate())\n    let hh = addZero(time.getHours())\n    let mm = addZero(time.getMinutes())\n    let ss = addZero(time.getSeconds())\n    return `${YY}-${MM}-${DD} ${hh}:${mm}:${ss}`\n}\nfunction timeTextFormat(text) {\n    return `${text.slice(0, 10)} ${text.slice(11, 19)}`\n}\nfunction sleep(time) {\n    let endTime = new Date().getTime() + time\n    while(true){\n        if (new Date().getTime() > endTime){\n            return;\n        }\n    }\n}\nfunction sleepToast(text, second) {\n    const {java} = this\n    java.log(text)\n    java.longToast(text)\n    if (second === undefined || second <= 2) {second = 2}\n    sleep(1000*second)\n}\n\nfunction updateSource() {\n    const {java, source} = this\n    java.longToast(\"\ud83c\udd99 \u66f4\u65b0\u4e66\u6e90\\n\\nJsdelivr CDN \u66f4\u65b0\u6709\u5ef6\u8fdf\\nGithub \u66f4\u65b0\u9700\u4ee3\u7406\")\n    let onlineSource, comment, sourceName, sourceNameCapitalize, index = 0\n    if (source.bookSourceUrl.includes(\"pixiv\")) sourceName = \"pixiv\"\n    else if (source.bookSourceUrl.includes(\"furrynovel\")) sourceName = \"linpx\"\n    sourceNameCapitalize = sourceName[0].toUpperCase() + sourceName.substring(1)\n\n    if (source.bookSourceName.includes(\"\u5907\u7528\")) index = 1\n    else if (source.bookSourceName.includes(\"\u6f2b\u753b\")) index = 2\n    if (source.bookSourceUrl.includes(\"furrynovel.com\")) {\n        sourceNameCapitalize = \"FurryNovel\"\n        index = 1\n    }\n\n    try {\n        let updateUrl = `https:\/\/cdn.jsdelivr.net\/gh\/DowneyRem\/PixivSource@main\/${sourceName}.json`\n        onlineSource = JSON.parse(java.get(updateUrl,{'User-Agent': 'Mozilla\/5.0 (Linux; Android 14)','X-Requested-With': 'XMLHttpRequest'}).body())[index]\n        comment = onlineSource.bookSourceComment.split(\"\\n\")\n    } catch (e) {\n        try {\n            let updateUrl = `https:\/\/raw.githubusercontent.com\/DowneyRem\/PixivSource\/main\/${sourceName}.json`\n            onlineSource = JSON.parse(java.get(updateUrl,{'User-Agent': 'Mozilla\/5.0 (Linux; Android 14)','X-Requested-With': 'XMLHttpRequest'}).body())[index]\n            comment = onlineSource.bookSourceComment.split(\"\\n\")\n        } catch (e) {\n            onlineSource = {lastUpdateTime: new Date().getTime()}\n            comment = source.bookSourceComment.split(\"\\n\")\n        }\n    }\n    comment = onlineSource.bookSourceComment.split(\"\\n\")\n    \/\/ onlineSource = source\n    \/\/ comment = source.bookSourceComment.split(\"\\n\")\n\n    let htm = `\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>\u66f4\u65b0 ${source.bookSourceName} \u4e66\u6e90<\/title>\n    <style> \n    table { text-align: center; margin: 0 auto; } .ann { display: flex; justify-content: center; align-items: center; height: 5vh; } \n    button { background-color: rgb(76, 175, 80); color: white; border: none; border-radius: 4px; height: 6vh; width: 30vw; overflow: hidden; } \n    button span { cursor: pointer; display: inline-block; position: relative; transition: 0.4s; } \n    button span:after { content: '>'; position: absolute; opacity: 0; top: 0; right: 30px; transition: 0.2s; } \n    button:active span { padding-right: 20px; } \n    button:active span:after { opacity: 1; right: -40px; }\n    <\/style>\n<\/head>\n\n<body>\n    <table border=\"1\" cellspacing=\"0\">\n        <th colspan=\"2\"> ${source.bookSourceName} \u4e66\u6e90 \n        <a href=\"https:\/\/github.com\/DowneyRem\/PixivSource\/blob\/main\/doc\/FurryNovel.md\">\ud83d\udd30 \u4f7f\u7528\u6307\u5357<\/a>\n        ||<a href=\"https:\/\/github.com\/DowneyRem\/PixivSource\/blob\/main\/doc\/Sponsor.md\">\u2764\ufe0f \u8d5e\u52a9\u5f00\u53d1<\/a>\n        <\/th>\n        <tr>\n            <td>\u2601\ufe0f \u8fdc\u7a0b\u7248\u672c\uff1a${onlineSource.bookSourceComment.split(\"\\n\")[2].replace(\"\u4e66\u6e90\u7248\u672c\uff1a\", \"\")}<\/td>\n            <td>\ud83d\udcc6 \u66f4\u65b0\uff1a${timeFormat(onlineSource.lastUpdateTime)}<\/td>\n        <\/tr>\n        <tr>\n            <td>\ud83d\udce5 \u672c\u5730\u7248\u672c\uff1a${source.bookSourceComment.split(\"\\n\")[2].replace(\"\u4e66\u6e90\u7248\u672c\uff1a\", \"\")}<\/td>\n            <td>\ud83d\udcc6 \u66f4\u65b0\uff1a${timeFormat(source.lastUpdateTime)}<\/td>\n        <\/tr> \n        <tr><td colspan=\"2\" style=\"text-align: left;\">${comment.slice(3, 8).join(\"<br>\")}<\/td><\/tr>\n        <tr><td colspan=\"2\" style=\"text-align: left;\">${comment.slice(comment.length-2, comment.length).join(\"<br>\")}<\/td><\/tr>\n    <\/table>\n    \n    <table border=\"0\" cellspacing=\"20\">\n        <th colspan=\"2\"> \u66f4\u65b0 ${source.bookSourceName} \u4e66\u6e90 <\/th>\n        <tr><td><div class=\"ann\">\n            <a href=\"legado:\/\/import\/importonline?src=https:\/\/cdn.jsdelivr.net\/gh\/DowneyRem\/PixivSource@main\/${sourceName}.json\">\n            <button><span>\u66f4\u65b0\u4e66\u6e90<br>(Jsdelivr CDN)<\/span><\/button>\n            <\/a><\/div><\/td>\n            \n            <td><div class=\"ann\">\n            <a href=\"legado:\/\/import\/importonline?src=https:\/\/cdn.jsdelivr.net\/gh\/DowneyRem\/PixivSource@main\/btsrk.json\">\n            <button><span>\u66f4\u65b0\u8ba2\u9605<br>(Jsdelivr CDN)<\/span><\/button>\n            <\/a><\/div><\/td>\n        <\/tr>\n        \n        <tr><td><div class=\"ann\">\n            <a href=\"legado:\/\/import\/importonline?src=https:\/\/raw.githubusercontent.com\/DowneyRem\/PixivSource\/main\/${sourceName}.json\">\n            <button><span>\u4e66\u6e90\u94fe\u63a5<br>(GitHub)<\/span><\/button>\n            <\/a><\/div><\/td>\n            \n            <td><div class=\"ann\">\n            <a href=\"legado:\/\/import\/importonline?src=https:\/\/raw.githubusercontent.com\/DowneyRem\/PixivSource\/main\/btsrk.json\">\n            <button><span>\u8ba2\u9605\u94fe\u63a5<br>(GitHub)<\/span><\/button>\n            <\/a><\/div><\/td>\n        <\/tr>\n        \n        <tr><td><div class=\"ann\">\n            <a href=\"legado:\/\/import\/importonline?src=https:\/\/codeberg.org\/DowneyRem\/PixivSource\/raw\/branch\/main\/${sourceName}.json\">\n            <button><span>\u5907\u7528\u4e66\u6e90\u94fe\u63a5<br>(Codeberg)<\/span><\/button>\n            <\/a><\/div><\/td>\n            \n            <td><div class=\"ann\">\n            <a href=\"legado:\/\/import\/importonline?src=https:\/\/codeberg.org\/DowneyRem\/PixivSource\/raw\/branch\/main\/btsrk.json\">\n            <button><span>\u5907\u7528\u8ba2\u9605\u94fe\u63a5<br>(Codeberg)<\/span><\/button>\n            <\/a><\/div><\/td>\n        <\/tr>\n    <\/table>\n<\/body>\n<\/html>`\n    java.startBrowser(`data:text\/html;charset=utf-8;base64, ${java.base64Encode(htm)}`, '\u66f4\u65b0\u4e66\u6e90')\n    return []\n}","lastUpdateTime":"1763623894212","loginCheckJs":"var util = {}\n\nfunction objStringify(obj) {\n    return JSON.stringify(obj, (n, v) => {\n        if (typeof v == \"function\")\n            return v.toString();\n        return v;\n    });\n}\n\n\/\/ \u68c0\u6d4b \u6e90\u9605\n\/\/ \u53ef\u7528 java.ajax() \u4e0d\u53ef\u7528 java.webview() java.ajaxAll()\n\/\/ \u53ef\u7528 java.getCookie() cache.put() cache.get() \u9ed8\u8ba4\u503c\u4e3a undefined\n\/\/ \u53ef\u7528 java.startBrowser() \u4e0d\u53ef\u7528 java.startBrowserAwaitAwait\n\/\/ \u53ef\u7528 source.bookSourceName source.getVariable() source.setVariable()\u7b49\n\/\/ java.getUserAgent() java.getWebViewUA() \u76ee\u524d\u8fd4\u56de\u5185\u5bb9\u76f8\u540c\nfunction isSourceRead() {\n    let isSourceReadStatus = java.getUserAgent() === java.getWebViewUA()\n    cache.put(\"isSourceRead\", isSourceReadStatus)\n    return isSourceReadStatus\n}\n\/\/ \u68c0\u6d4b \u9605\u8bfb \u6b63\u5f0f\u7248 \u4e0e Beta \u7248\u672c\nfunction isLegadoOfficial() {\n    let isLegadoOfficialStatus\n    try {\n        eval('({})?.value')\n        isLegadoOfficialStatus = false\n    } catch (e) {\n        isLegadoOfficialStatus = true\n    }\n    cache.put(\"isLegadoOfficial\", isLegadoOfficialStatus)\n    return isLegadoOfficialStatus\n}\n\/\/ \u68c0\u6d4b \u9605\u8bfb Beta \u7248\u672c \u4e0e LYC \u7248\u672c\n\/\/ LYC \u7248\u672c\u65b0\u589e\u51fd\u6570\n\/\/ java.ajaxTestAll()\n\/\/ java.openVideoPlayer(url: String, title: String, float: Boolean)\n\/\/ cookie.setWebCookie(url,cookie)\n\/\/ source.refreshExplore()\n\/\/ source.refreshJSLib()\nfunction isLegadoLYC() {\n    let isLegadoLYCStatus = (typeof java.ajaxTestAll === \"function\")\n    cache.put(\"isLegadoLYCStatus\", isLegadoLYCStatus)\n    return isLegadoLYCStatus\n}\n\nfunction publicFunc() {\n    let u = {}, settings = {}\n    \/\/ \u8f93\u51fa\u4e66\u6e90\u4fe1\u606f\n    java.log(`${source.bookSourceComment.split(\"\\n\")[0]}`)\n    java.log(`\ud83d\udccc ${source.bookSourceComment.split(\"\\n\")[2]}`)\n    java.log(`\ud83d\udcc6 \u66f4\u65b0\u65f6\u95f4\uff1a${java.timeFormat(source.lastUpdateTime)}`)\n    if (isSourceRead()) {\n        java.log(\"\ud83d\udcf1 \u8f6f\u4ef6\u5e73\u53f0\uff1a\ud83c\udf4e \u6e90\u9605 SourceRead\")\n    } else if (isLegadoOfficial()) {\n        java.log(\"\ud83d\udcf1 \u8f6f\u4ef6\u5e73\u53f0\uff1a\ud83e\udd16 \u5f00\u6e90\u9605\u8bfb \u3010\u6b63\u5f0f\u7248\u3011\")\n        java.log(\"\u5f53\u524d\u8f6f\u4ef6\u4e3a\uff1a\u9605\u8bfb\u3010\u6b63\u5f0f\u7248\u3011\\n\\n\u3010\u6b63\u5f0f\u7248\u3011\u5df2\u5e74\u4e45\u5931\u4fee\uff0c\u4e0d\u63a8\u8350\u7ee7\u7eed\u4f7f\u7528\\n\u63a8\u8350\u4f7f\u7528\u3010Beta\u7248\u3011\u3010\u5171\u5b58\/\u65b0\u5171\u5b58\u7248\u3011\\n\\nBeta\u7248\u672c\u4e0b\u8f7d\u94fe\u63a5\uff1a\\nhttps:\/\/miaogongzi.lanzout.com\/b01rgkhhe\\n\u5982\u9700\u66f4\u65b0\uff0c\u53ef\u53bb\u4e66\u6e90\u8c03\u8bd5\u754c\u9762\\n\u6253\u5f00\u4e0b\u8f7d\u94fe\u63a5\u5207\u6362\u9605\u8bfb\u7248\u672c\\n\")\n    } else {\n        if (isLegadoLYC()) {\n            java.log(\"\ud83d\udcf1 \u8f6f\u4ef6\u5e73\u53f0\uff1a\ud83e\udd16 \u5f00\u6e90\u9605\u8bfb Beta\/LYC \u7248\")\n        } else {\n            java.log(\"\ud83d\udcf1 \u8f6f\u4ef6\u5e73\u53f0\uff1a\ud83e\udd16 \u5f00\u6e90\u9605\u8bfb Beta \u7248\uff08\u672a\u5408\u5165 LYC \u529f\u80fd\uff09\")\n        }\n    }\n\n    \/\/ \u8f7d\u5165\u8bbe\u7f6e\n    settings = JSON.parse(String(source.variableComment).match(RegExp(\/{([\\s\\S]*?)}\/gm)))\n    let isIPDirect = settings?.IPDirect || false\n    if (isIPDirect) java.log(\"\u2708\ufe0f \u76f4\u8fde\u6a21\u5f0f\uff1a\u2705 \u5df2\u5f00\u542f\")\n\n    if (settings !== null) {\n        java.log(\"\u2699\ufe0f \u4f7f\u7528\u81ea\u5b9a\u4e49\u8bbe\u7f6e\")\n    } else {\n        settings = {}\n        settings.CONVERT_CHINESE = true     \/\/ \u641c\u7d22\uff1a\u641c\u7d22\u65f6\u8fdb\u884c\u7e41\u7b80\u8f6c\u6362\n        settings.SHOW_ORIGINAL_LINK = true  \/\/ \u76ee\u5f55\uff1a\u663e\u793a\u6e90\u94fe\u63a5\n        settings.QUALITY_REGULAR = true     \/\/ \u6b63\u6587\uff1a\u56fe\u7247\u8d28\u91cf\uff0cregular \u6216 original\n        settings.IPDirect = false           \/\/ \u5168\u5c40\uff1a\u76f4\u8fde\u6a21\u5f0f\n        settings.DEBUG = false              \/\/ \u5168\u5c40\uff1a\u8c03\u8bd5\u6a21\u5f0f\n        java.log(\"\u2699\ufe0f \u4f7f\u7528\u9ed8\u8ba4\u8bbe\u7f6e\uff08\u65e0\u81ea\u5b9a\u4e49\u8bbe\u7f6e \u6216 \u81ea\u5b9a\u4e49\u8bbe\u7f6e\u6709\u8bef\uff09\")\n    }\n\n    if (settings.IPDirect) {\n        settings.SEARCH_AUTHOR = false       \/\/ \u641c\u7d22\uff1a\u9ed8\u8ba4\u5173\u95ed\u641c\u7d22\u4f5c\u8005\u540d\u79f0\n        settings.SHOW_ORIGINAL_LINK = false  \/\/ \u76ee\u5f55\uff1a\u4e0d\u663e\u793a\u7ae0\u8282\u6e90\u94fe\u63a5\n    } else {\n        settings.IPDirect = false\n        settings.SEARCH_AUTHOR = true        \/\/ \u641c\u7d22\uff1a\u9ed8\u8ba4\u5173\u95ed\u641c\u7d22\u4f5c\u8005\u540d\u79f0\n        settings.SHOW_ORIGINAL_LINK = true   \/\/ \u76ee\u5f55\uff1a\u4e0d\u663e\u793a\u7ae0\u8282\u6e90\u94fe\u63a5\n    }\n\n    u.settings = settings\n    \/\/ putInCache(\"pixivSettings\", settings)  \/\/ \u8bbe\u7f6e\u5199\u5165\u7f13\u5b58\n\n    u.environment = {}\n    u.environment.IS_SOURCEREAD = isSourceRead()\n    u.environment.IS_LEGADO = !isSourceRead()\n    u.environment.IS_LYC_BRUNCH = isLegadoLYC()\n    \/\/ putInCache(\"sourceEnvironment\", u.environment)  \/\/ \u8bbe\u7f6e\u5199\u5165\u7f13\u5b58\n\n    u.debugFunc = (func) => {\n        if (util.settings.DEBUG === true) {\n            func()\n        }\n    }\n\n    u.checkStatus = function(status) {\n        if (status === true) return \"\u2705 \u5df2\"\n        else if (status === false) return \"\u274c \u672a\"\n        else if (status === undefined) return \"\ud83c\ude1a\ufe0f \u65e0\u6570\u636e\uff1a\"\n    }\n\n    u.login = function() {\n        let resp = java.startBrowserAwait(`https:\/\/accounts.pixiv.net\/login,\n    {\"headers\": {\"User-Agent\": \"${java.getWebViewUA()}\"}}`, '\u767b\u5f55\u8d26\u53f7', false)\n        if (resp.code() === 200) {\n            this.getCsrfToken(); this.getCookie()\n        } else {\n            java.log(resp.code()); sleepToast(\"\u26a0\ufe0f \u767b\u5f55\u5931\u8d25\")\n        }\n    }\n\n    u.logout = function() {\n        this.removeCookie()\n        java.startBrowser(\"https:\/\/www.pixiv.net\/logout.php\", \"\u9000\u51fa\u8d26\u53f7\")\n        this.removeCookie()\n        sleepToast(`\u2705 \u5df2\u9000\u51fa\u5f53\u524d\u8d26\u53f7\\n\\n\u9000\u51fa\u540e\u8bf7\u70b9\u51fb\u53f3\u4e0a\u89d2\u7684 \u2714\ufe0f \u9000\u51fa\\n\\n\u767b\u5f55\u8bf7\u70b9\u51fb\u3010\u767b\u5f55\u8d26\u53f7\u3011\u8fdb\u884c\u767b\u5f55`)\n    }\n\n    u.getCookie = function() {\n        let pixivCookie = String(java.getCookie(\"https:\/\/www.pixiv.net\/\", null))\n        if (isLogin()) cache.put(\"pixivCookie\", pixivCookie, 60*60)  \/\/ \u7f13\u5b581h\n    }\n\n    u.removeCookie = function() {\n        cookie.removeCookie('https:\/\/www.pixiv.net')\n        cookie.removeCookie('https:\/\/accounts.pixiv.net')\n        cookie.removeCookie('https:\/\/accounts.google.com')\n        cookie.removeCookie('https:\/\/api.weibo.com')\n        cache.delete(\"pixivCookie\")\n        cache.delete(\"pixiv:uid\")\n        cache.delete(\"pixivCsrfToken\")  \/\/ \u4e0e\u767b\u5f55\u8bbe\u5907\u6709\u5173\n        cache.delete(\"headers\")\n    }\n\n    \/\/ \u83b7\u53d6 Csrf Token\uff0c\u4ee5\u4fbf\u8fdb\u884c\u6536\u85cf\u7b49\u8bf7\u6c42\n    \/\/ \u83b7\u53d6\u65b9\u6cd5\u6765\u81ea\u811a\u672c Pixiv Previewer\n    \/\/ https:\/\/github.com\/Ocrosoft\/PixivPreviewer\n    \/\/ https:\/\/greasyfork.org\/zh-CN\/scripts\/30766-pixiv-previewer\/code\n    u.getCsrfToken = function() {\n        let pixivCsrfToken = cache.get(\"pixivCsrfToken\")\n        if (!pixivCsrfToken) {\n            let html = java.webView(null, \"https:\/\/www.pixiv.net\/\", null)\n            try {\n                pixivCsrfToken = html.match(\/token\\\\\":\\\\\"([a-z0-9]{32})\/)[1]\n                cache.put(\"pixivCsrfToken\", pixivCsrfToken)  \/\/ \u4e0e\u767b\u5f55\u8bbe\u5907\u6709\u5173\uff0c\u65e0\u6cd5\u5b58\u50a8 nul\n            } catch (e) {\n                pixivCsrfToken = null\n                cache.delete(\"pixivCsrfToken\")  \/\/ \u4e0e\u767b\u5f55\u8bbe\u5907\u6709\u5173\uff0c\u65e0\u6cd5\u5b58\u50a8 nul\n                \/\/ sleepToast(\"\u26a0\ufe0f \u672a\u767b\u5f55\u8d26\u53f7(pixivCsrfToken)\")\n            }\n            java.log(`pixivCsrfToken:\\n${pixivCsrfToken}`)\n        }\n        return pixivCsrfToken\n    }\n\n    u.handIllusts = function (illusts) {\n        illusts.forEach(illust => {\n            \/\/ illust.id = illust.id\n            \/\/ illust.title = illust.title\n            \/\/ illust.userName = illust.userName\n            \/\/ illust.tags = illust.tags\n            if (!(illust.tags instanceof Array)) {\n                illust.tags = illust.tags.tags.map(item => item.tag)\n                illust.coverUrl = illust.url = illust.urls.regular  \/\/ \u517c\u5bb9\u6b63\u6587\u641c\u7d22\n                illust.updateDate = illust.uploadDate\n            }\n            illust.textCount = null\n            \/\/ illust.pageCount = illust.pageCount\n            \/\/ illust.description = illust.description\n            illust.coverUrl = illust.url\n            illust.detailedUrl = urlIP(urlIllustDetailed(illust.id))\n            \/\/ illust.createDate = illust.createDate\n            \/\/ illust.updateDate = illust.updateDate\n            \/\/ illust.aiType = illust.aiType\n\n            if (illust.seriesNavData === undefined || illust.seriesNavData === null) {\n                illust.latestChapter = illust.title\n            } else {\n                illust.seriesId = illust.seriesNavData.seriesId\n                illust.title = illust.seriesNavData.title\n            }\n\n            if (illust.seriesId !== undefined) {\n                let resp = getAjaxJson(urlIP(urlSeriesDetailed(illust.seriesId))).body\n                let series = resp.illustSeries.filter(item => item.id === illust.seriesId)[0]\n                \/\/ illust.title = illust.title\n                illust.tags = illust.tags.concat(series.tags)\n                illust.latestChapter = resp.thumbnails.illust.filter(item => item.id === series.latestIllustId)[0].title\n                illust.description = series.description\n                if (series.url === undefined) {\n                    let firstChapter = getAjaxJson(urlIP(urlIllustDetailed(series.firstIllustId))).body\n                    illust.coverUrl = firstChapter.urls.regular\n                    illust.tags = illust.tags.concat(firstChapter.tags.tags.map(item => item.tag))\n                }\n                illust.createDate = series.createDate\n                illust.updateDate = series.updateDate\n                illust.total = series.total\n            }\n        })\n        return illusts\n    }\n\n    u.formatIllusts = function (illusts) {\n        illusts.forEach(illust => {\n            illust.title = illust.title.replace(RegExp(\/^\\s+|\\s+$\/g), \"\")\n            illust.tags = Array.from(new Set(illust.tags))\n            illust.tags = illust.tags.join(\",\")\n            illust.coverUrl = urlCoverUrl(illust.coverUrl)\n            illust.createDate = dateFormat(illust.createDate)\n            illust.updateDate = dateFormat(illust.updateDate)\n            if (util.MORE_INFORMATION) {\n                illust.description = `\\n\u4e66\u540d\uff1a${illust.title}\\n\u4f5c\u8005\uff1a${illust.userName}\\n\u6807\u7b7e\uff1a${illust.tags}\\n\u9875\u9762\uff1a${illust.pageCount}\\n\u4e0a\u4f20\uff1a${illust.createDate}\\n\u66f4\u65b0\uff1a${illust.updateDate}\\n\u7b80\u4ecb\uff1a${illust.description}`\n            } else {\n                illust.description = `\\n${illust.title}\uff0c\u5171${illust.pageCount}\u9875\\n${illust.description}\\n\u4e0a\u4f20\u65f6\u95f4\uff1a${illust.createDate}\\n\u66f4\u65b0\u65f6\u95f4\uff1a${illust.updateDate}`\n            }\n        })\n        return illusts\n    }\n\n    u.getIllustRes = function (result) {\n        let illustId = 0, res = {}\n        let isJson = isJsonString(result)\n        let isHtml = result.startsWith(\"<!DOCTYPE html>\")\n        if (!isJson && isHtml) {\n            let pattern1 = \"(https?:\/\/)?(www\\\\.)?pixiv\\\\.net\/(artworks|ajax\/illust)\/(\\\\d+)\"\n            let isIllust = baseUrl.match(new RegExp(pattern1))\n            let pattern2 = \"(https?:\/\/)?(www\\\\.)?pixiv\\\\.net\/(user\/\\\\d+|ajax)\/series\/(\\\\d+)\"\n            let isSeries = baseUrl.match(new RegExp(pattern2))\n\n            if (isIllust) {\n                illustId = isIllust[4]\n            } else if (isSeries) {\n                seriesId = isSeries[4]\n                java.log(`\u5339\u914d\u7cfb\u5217ID\uff1a${seriesId}`)\n                illustId = getAjaxJson(urlIP(urlSeriesDetailed(seriesId))).body.page.series.reverse()[0].workId\n            }\n        }\n        if (isJson) {\n            res = JSON.parse(result)\n        }\n\n        if (illustId) {\n            java.log(`\u5339\u914d\u63d2\u753bID\uff1a${illustId}`)\n            res = getAjaxJson(urlIP(urlIllustDetailed(illustId)))\n        }\n        if (res.error) {\n            java.log(`\u65e0\u6cd5\u4ece Pixiv \u83b7\u53d6\u5f53\u524d\u6f2b\u753b`)\n            java.log(JSON.stringify(res))\n            return []\n        }\n        return res.body\n    }\n\n    util = u\n    java.put(\"util\", objStringify(u))\n}\n\n\/\/ \u83b7\u53d6\u8bf7\u6c42\u7684user id\u65b9\u4fbf\u5176\u4ed6ajax\u8bf7\u6c42\u6784\u9020\nfunction getPixivUid() {\n    let uid = cache.get(\"pixiv:uid\")\n    if (!uid || String(uid) === \"null\") {\n        let html = java.webView(null, \"https:\/\/www.pixiv.net\/\", null)\n        try {\n            uid = html.match(\/user_id:'(\\d+)'\/)[1]\n        } catch (e) {\n            uid = null\n        }\n        cache.put(\"pixiv:uid\", String(uid))\n    }\n}\n\npublicFunc()\nif (result.code() === 200) {\n    getPixivUid(); util.getCookie(); util.getCsrfToken()\n}\njava.getStrResponse(null, null)","loginUi":"","loginUrl":"https:\/\/accounts.pixiv.net\/login","respondTime":180000,"ruleBookInfo":{"author":"userName","canReName":"true","coverUrl":"coverUrl","init":"@js:\nvar util = objParse(String(java.get(\"util\")))\n\nfunction objParse(obj) {\n    return JSON.parse(obj, (n, v) => {\n        if (typeof v == \"string\" && v.match(\"()\")) {\n            return eval(`(${v})`)\n        }\n        return v;\n    })\n}\n\nfunction illustHandler(illust){\n    illust = util.formatIllusts(util.handIllusts([illust]))[0]\n    book.bookUrl = illust.detailedUrl = urlIllustUrl(illust.id)\n    book.tocUrl = illust.catalogUrl = urlIP(urlIllustDetailed(illust.id))\n    return illust\n}\n\n(() => {\n    return illustHandler(util.getIllustRes(result))\n})()","intro":"description","kind":"tags","lastChapter":"latestChapter","name":"title","tocUrl":"catalogUrl"},"ruleContent":{"content":"@js:\nvar util = objParse(String(java.get(\"util\")))\n\nfunction objParse(obj) {\n    return JSON.parse(obj, (n, v) => {\n        if (typeof v == \"string\" && v.match(\"()\")) {\n            return eval(`(${v})`)\n        }\n        return v;\n    })\n}\n\nfunction getContent(res) {\n    let content = [\"\"]\n    \/\/ li = \"mini thumb small regular original\".split(\" \")\n    let quality = util.settings.QUALITY_REGULAR ? \"regular\" : \"original\"\n    let illustLink = getAjaxJson(urlIP(urlIllustDetailed(res.id))).body.urls[quality]\n    for (let order = 0; order < res.pageCount; order++) {\n        content.push(`<img src=\"${urlCoverUrl(illustLink)}\">`)\n        illustLink = illustLink.replace(`_p${order}`, `_p${order + 1}`)\n    }\n    content = content.join(\"\\n\")\n    return content\n}\n\n(function () {\n    return getContent(util.getIllustRes(result))\n})()","imageStyle":"FULL"},"ruleExplore":{"author":"userName","bookList":"@js:\nvar util = objParse(String(java.get(\"util\")))\nvar seriesSet = new Set();  \/\/ \u5b58\u50a8seriesID \u6709BUG\u65e0\u6cd5\u5904\u7406\u7ffb\u9875\n\nfunction objParse(obj) {\n    return JSON.parse(obj, (n, v) => {\n        if (typeof v == \"string\" && v.match(\"()\")) {\n            return eval(`(${v})`)\n        }\n        return v;\n    })\n}\n\nfunction handlerFactory() {\n    if (baseUrl.includes(\"https:\/\/cdn.jsdelivr.net\")) {\n        return () => {updateSource(); return []}\n    }\n    if (!isLogin()) {\n        return handlerNoLogin()\n    }\n    if (baseUrl.includes(\"\/follow_latest\")) {\n        return handlerFollowLatest()\n    }\n    if (baseUrl.includes(\"\/watch_list\")) {\n        return handlerWatchList()\n    }\n    if (baseUrl.includes(\"\/top\")) {\n        return handlerRecommend()\n    }\n    if (baseUrl.includes(\"\/discovery\")) {\n        return handlerDiscovery()\n    }\n    if (baseUrl.includes(\"\/bookmark\")) {\n        return handlerBookMarks()\n    }\n    if (baseUrl.includes(\"\/new\")) {\n        return handlerDiscovery()\n    }\n    if (baseUrl.includes(\"\/commission\/\")) {\n        return handlerFollowLatest()\n    }\n    if (baseUrl.includes(\"\/user_event\/portal\")) {\n        return handlerFollowLatest()\n    }\n    \/\/ \u6b63\u5219\u5339\u914d\u7f51\u5740\u5185\u5bb9\n    if (baseUrl.includes(\"\/ranking\") && (baseUrl.endsWith(\"json\"))) {\n        return handlerRanking()\n    }\n    if (baseUrl.includes(\"\/ranking\")) {\n        return handlerRegexIllusts()\n    }\n    else {\n        return []\n    }\n}\n\nfunction handlerNoLogin() {\n    return () => {\n        sleepToast(\"\u6b64\u529f\u80fd\u9700\u8981\u5728\u4e66\u6e90\u767b\u5f55\u540e\u624d\u80fd\u4f7f\u7528\")\n        sleepToast('\u53d1\u73b0 - \u957f\u6309\"Pixiv\" - \u767b\u5f55 - \u767b\u5f55\u8d26\u53f7')\n        return []\n    }\n}\n\n\/\/\u5173\u6ce8\u4f5c\u8005\uff0c\u6f2b\u753b\u59d4\u6258\uff0c\u6f2b\u753b\u4f01\u5212\nfunction handlerFollowLatest() {\n    return () => {\n        let res = JSON.parse(result)\n        return util.formatIllusts(util.handIllusts(res.body.thumbnails.illust))\n    }\n}\n\n\/\/ \u8ffd\u66f4\u5217\u8868\nfunction handlerWatchList() {\n    return () => {\n        let res = JSON.parse(result)\n        \/\/ li =  res.body.page.watchedSeriesIds\n        return util.formatIllusts(util.handIllusts(res.body.thumbnails.illust))\n    }\n}\n\n\/\/ \u63a8\u8350\u6f2b\u753b\nfunction handlerRecommend() {\n    return () => {\n        let res = JSON.parse(result)\n        const recommend = res.body.page.recommend\n        const illusts = res.body.thumbnails.illust\n        let nidSet = new Set(recommend.ids)\n        \/\/ java.log(nidSet.size)\n        let list = illusts.filter(illust => nidSet.has(String(illust.id)))\n        \/\/ java.log(`\u8fc7\u6ee4\u7ed3\u679c:${JSON.stringify(list)}`)\n        return util.formatIllusts(util.handIllusts(list))\n    }\n}\n\n\/\/\u53d1\u73b0\u6f2b\u753b\nfunction handlerDiscovery() {\n    return () => {\n        let res = JSON.parse(result)\n        return util.formatIllusts(util.handIllusts(res.body.illusts))\n    }\n}\n\n\/\/ \u6536\u85cf\u6f2b\u753b\nfunction handlerBookMarks() {\n    return () => {\n        let res = JSON.parse(result).body.works\n        if (res === undefined || res.length === 0) {\n            \/\/\u6d41\u7a0b\u65e0\u6cd5\u672c\u73af\u8282\u4e2d\u6b62 \u53ea\u80fd\u4ea4\u7ed9\u4e0b\u4e00\u6d41\u7a0b\u5904\u7406\n            return []\n        }\n        return util.formatIllusts(util.handIllusts(res))\n    }\n}\n\n\/\/ \u6392\u884c\u699c\uff0c\u987a\u5e8f\u76f8\u540c\nfunction handlerRanking() {\n    return () => {\n        let res = JSON.parse(result)\n        res.contents.forEach(item =>{\n            item.id = item.illust_id\n            \/\/ item.title = item.title\n            item.userName = item.user_name\n            \/\/ item.tags = item.tags\n            item.latestChapter = item.title\n            item.description = null\n            item.coverUrl = item.url\n            item.detailedUrl = urlIP(urlIllustDetailed(item.id))\n            item.createDate = item.updateDate = item.illust_upload_timestamp * 1000\n\n            if (item.illust_series !== false) {\n                let series = item.illust_series\n                item.seriesId = series.illust_series_id\n                item.order = series.illust_series_content_order\n                item.total = series.illust_series_content_count\n                if (item.order === item.total) item.latestChapter = item.title\n                item.title = series.illust_series_title\n                item.description = series.illust_series_caption\n                item.pageCount = series.illust_page_count\n                item.createDate = item.updateDate = series.illust_series_create_datetime\n            }\n        })\n        return util.formatIllusts(util.handIllusts(res.contents))\n    }\n}\n\n\/\/\u9996\u9875\uff0c\u987a\u5e8f\u968f\u673a\nfunction handlerRegexIllusts() {\n    return () => {\n        let illustIds = []  \/\/ \u6b63\u5219\u83b7\u53d6\u7f51\u5740\u4e2d\u7684 illustId\n        let matched = result.match(RegExp(\/\\\/artworks\\\/\\d{5,}\/gm))\n        for (let i in matched) {\n            let illustId = matched[i].match(RegExp(\/\\d{5,}\/))[0]\n            if (illustIds.indexOf(illustId) === -1) {\n                illustIds.push(illustId)\n            }\n        }\n        let userIllusts = getWebviewJson(\n            urlIP(urlIllustsDetailed(`${cache.get(\"pixiv:uid\")}`, illustIds)), html => {\n                return (html.match(new RegExp(\">\\\\{.*?}<\"))[0].replace(\">\", \"\").replace(\"<\", \"\"))\n            }).body\n        return util.formatIllusts(util.handIllusts(Object.values(userIllusts)))\n    }\n}\n\n(() => {\n    return handlerFactory()()\n})()","bookUrl":"detailedUrl","coverUrl":"coverUrl","intro":"description","kind":"tags","lastChapter":"latestChapter","name":"title","wordCount":""},"ruleSearch":{"author":"userName","bookList":"@js:\nvar util = objParse(String(java.get(\"util\")))\n\nfunction objParse(obj) {\n    return JSON.parse(obj, (n, v) => {\n        if (typeof v == \"string\" && v.match(\"()\")) {\n            return eval(`(${v})`)\n        }\n        return v;\n    })\n}\n\nfunction getArtwork() {\n    if (JSON.parse(result).error !== true) {\n        cache.put(urlIP(urlSearchArtwork(java.get(\"key\"), java.get(\"page\"))), result, cacheSaveSeconds)  \/\/ \u52a0\u5165\u7f13\u5b58\n        return JSON.parse(result).body.illustManga.data\n    } else {\n        return []\n    }\n}\n\nfunction search(name, page) {\n    let resp = getAjaxJson(urlIP(urlSearchArtwork(name, page)))\n    java.log(urlIP(urlSearchArtwork(name, page)))\n    if (resp.error === true || resp.total === 0) {\n        return {\"data\": [], \"total\":0, \"lastPage\": 0}\n    }\n    return resp.body.illustManga\n}\n\nfunction getConvertArtwork() {\n    let illusts = []\n    let name = String(java.get(\"key\"))\n    let name1 = String(java.s2t(name))\n    let name2 = String(java.t2s(name))\n    if (name1 !== name) illusts = illusts.concat(search(name1, 1).data)\n    if (name2 !== name) illusts = illusts.concat(search(name2, 1).data)\n    return illusts\n}\n\n(() => {\n    let artworks = []\n    artworks = artworks.concat(getArtwork())\n    if (util.settings.CONVERT_CHINESE) artworks = artworks.concat(getConvertArtwork())\n    \/\/ java.log(JSON.stringify(artworks))\n    \/\/ \u8fd4\u56de\u7a7a\u5217\u8868\u4e2d\u6b62\u6d41\u7a0b\n    if (artworks.length === 0) {\n        return []\n    }\n    return util.formatIllusts(util.handIllusts(artworks))\n})()","bookUrl":"detailedUrl","checkKeyWord":"\u6d4b\u8bd5","coverUrl":"coverUrl","intro":"description","kind":"tags","lastChapter":"latestChapter","name":"title","wordCount":""},"ruleToc":{"chapterList":"@js:\nvar util = objParse(String(java.get(\"util\")))\n\nfunction objParse(obj) {\n    return JSON.parse(obj, (n, v) => {\n        if (typeof v == \"string\" && v.match(\"()\")) {\n            return eval(`(${v})`)\n        }\n        return v;\n    })\n}\n\nfunction urlIllust(novelId){\n    if (util.settings.SHOW_ORIGINAL_LINK) {\n        return urlIllustUrl(novelId)\n    } else {\n        return urlIllustDetailed(novelId)\n    }\n}\n\nfunction oneShotHandler(res) {\n    return [{\n        title: res.title.replace(RegExp(\/^\\s+|\\s+$\/g), \"\"),\n        chapterUrl: urlIP(urlIllust(res.id)),\n        chapterInfo: `${timeTextFormat(res.createDate)}`\n    }]\n}\n\nfunction seriesHandler(res) {\n    let limit = 12, total = 0, illusts = []\n    let seriesId = res.seriesNavData.seriesId\n    if (res.seriesId === undefined) {\n        total = getAjaxJson(urlIP(urlSeriesDetailed(res.seriesNavData.seriesId))).body.page.total\n    } else {\n        total = res.total\n    }\n    util.debugFunc(() => {\n        java.log(`\u672c\u7cfb\u5217 ${seriesId} \u4e00\u5171\u6709${total}\u7ae0`);\n    })\n\n    \/\/\u8981\u722c\u53d6\u7684\u603b\u6b21\u6570\n    let max = (total \/ limit) + 1\n    for (let page = 1; page < max; page++) {\n        \/\/ java.log(urlIP(urlSeriesDetailed(seriesId, page)))\n        res = getAjaxJson(urlIP(urlSeriesDetailed(seriesId, page))).body\n        let illusts_id = res.page.series.map(item => item.workId)\n        illusts = illusts.concat(res.thumbnails.illust.filter(illust => illusts_id.includes(illust.id)))\n    }\n    illusts.reverse().forEach(illust => {\n        illust.title = illust.title.replace(RegExp(\/^\\s+|\\s+$\/g), \"\")\n        illust.chapterUrl = urlIP(urlIllust(illust.id))\n        illust.chapterInfo = timeTextFormat(illust.createDate)\n    })\n    \/\/ java.log(JSON.stringify(illusts))\n    return illusts\n}\n\n(() => {\n    let res = util.getIllustRes(result)\n    if (res.seriesNavData !== null) {\n        return seriesHandler(res)\n    } else {\n        return oneShotHandler(res)\n    }\n})()","chapterName":"title","chapterUrl":"chapterUrl","updateTime":"chapterInfo"},"searchUrl":"@js:\njava.put(\"key\", key)\njava.put(\"page\", page)\njava.log(`\ud83d\udd0d \u641c\u7d22\u5185\u5bb9\uff1a${key}`)\nurlIP(urlSearchArtwork(key, page))","variableComment":"\u2699\ufe0f \u81ea\u5b9a\u4e49\u4e66\u6e90\u8bbe\u7f6e\uff1a\n\u2699\ufe0f \u81ea\u5b9a\u4e49\u8bbe\u7f6e\uff1a\u8bf7\u5728\u57fa\u672c-\u53d8\u91cf\u8bf4\u660e\u5904\u4fee\u6539\u4ee3\u7801\n\u2699\ufe0f \u81ea\u5b9a\u4e49\u8bbe\u7f6e\uff1a\u5c06 true \u6539\u4e3a false\uff0c\u6216\u76f8\u53cd\n\u26a0\ufe0f \u8bbe\u7f6e\u6e90\u53d8\u91cf\u3010\u65e0\u6cd5\u3011\u66f4\u6539\u4e66\u6e90\u81ea\u5b9a\u4e49\u8bbe\u7f6e\n\u26a0\ufe0f \u6ce8\u610f\u4e0d\u8981\u6dfb\u52a0\u6216\u5220\u9664\u5c3e\u968f\u9017\u53f7\",\"\n\u26a0\ufe0f \u53d1\u73b0\u9875\u9700\u8981\u957f\u6309\"Pixiv\"\uff0c\u624b\u52a8\u5237\u65b0\n\u4ee5\u4e0b\u5185\u5bb9\u4e3a\u4e66\u6e90\u8bbe\u7f6e\uff1a\n{\n\"CONVERT_CHINESE\": true,\n\"SHOW_GENERAL_NEW\": false,\n\"QUALITY_REGULAR\": true,\n\n\"IPDirect\": false,\n\"DEBUG\": false,\n\n\"SHOW_ORIGINAL_LINK\": true\n}\n\n\/\/ CONVERT_CHINESE\n\/\/ \u641c\u7d22\uff1a\u641c\u7d22\u65f6\u8fdb\u884c\u7e41\u7b80\u8f6c\u6362\n\/\/ SHOW_ORIGINAL_LINK\n\/\/ \u76ee\u5f55\uff1a\u663e\u793a\u6e90\u94fe\u63a5\uff0c\u4f46\u4f1a\u589e\u52a0\u8bf7\u6c42\u6b21\u6570\n\/\/ QUALITY_REGULAR\n\/\/ \u6b63\u6587\uff1a\u56fe\u7247\u8d28\u91cf\uff1a\u662f regular \uff1b\u5426 original\n\n\/\/ IPDirect\n\/\/ \u76f4\u8fde\u6a21\u5f0f\n\/\/ DEBUG\n\/\/ \u8c03\u8bd5\u6a21\u5f0f\n\n\/\/ SHOW_GENERAL_NEW\n\/\/ \u53d1\u73b0\uff1a\u6700\u65b0\u3001\u4f01\u5212\u3001\u7ea6\u7a3f\u663e\u793a\u4e00\u822c\u6f2b\u753b\n\n","weight":0},{"bookSourceGroup":"R18,\u6f2b\u753b","bookSourceName":"Hitomi","bookSourceType":2,"bookSourceUrl":"https:\/\/hitomi.si\/","customButton":false,"customOrder":0,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"eventListener":false,"exploreUrl":"\u6700\u65b0::latest","lastUpdateTime":"1763691928331","respondTime":180000,"ruleBookInfo":{"author":".br.2@a@text##\\n##&","canReName":"1","coverUrl":".manga-img@img@src","intro":"&nbsp;{{new Date(java.getString('time@datetime')).toLocaleString().split('\/').join('-');}}","kind":".br!2@a@text","name":"h1@text","tocUrl":"[href*=\/read\/]@href"},"ruleContent":{"content":"@js:\nconst doc = org.jsoup.Jsoup.parse(result);\nconst servers = [];\ndoc.select('[data-server]').forEach(e => servers.push(e.attr('data-server')));\nconst server = servers[source.getVariable()] || servers[0];\nlet html = '';\ndoc.select('.chapter-imgs img').forEach(e => html += `<img src=\"${server + e.attr('data-url')}\">\\n`);\nhtml;"},"ruleExplore":[],"ruleSearch":{"author":"{{\"Hitomi\"}}","bookList":".m-item","bookUrl":"a.1@href","coverUrl":".lazy@data-src","intro":".m-title@text","kind":".lang@a@title","name":".m-title@text"},"ruleToc":{"chapterList":"body","chapterName":".center@li.1@text"},"searchUrl":"tag\/{{key}}<,?page={{page}}>","weight":0},{"bookSourceName":"\u82e6\u74dc\u9601","bookSourceType":0,"bookSourceUrl":"https:\/\/kgbook.com\/","customOrder":0,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"\u73b0\u4ee3\u6587\u5b66::https:\/\/kgbook.com\/xiandaiwenxue\/&&\u53e4\u4ee3\u6587\u5b66::https:\/\/kgbook.com\/gudianwenxue\/&&\u6b66\u4fa0\u5c0f\u8bf4::https:\/\/kgbook.com\/wuxiaxiaoshuo\/&&\u7f51\u7edc\u5c0f\u8bf4::https:\/\/kgbook.com\/wangluoxiaoshuo\/&&\u8a00\u60c5\u5c0f\u8bf4::https:\/\/kgbook.com\/yanqingxiaoshuo\/&&\u804c\u573a\u5c0f\u8bf4::https:\/\/kgbook.com\/zhichangxiaoshuo\/&&\u79d1\u5e7b\u7384\u5e7b::https:\/\/kgbook.com\/kehuanxuanhuan\/&&\u63a8\u7406\u60ca\u609a::https:\/\/kgbook.com\/tuilijingsong\/&&\u4eba\u6587\u793e\u79d1::https:\/\/kgbook.com\/renwensheke\/&&\u4eba\u7269\u4f20\u8bb0::https:\/\/kgbook.com\/renwuchuanji\/&&\u5916\u56fd\u6587\u5b66::https:\/\/kgbook.com\/waiguowenxue\/&&\u91d1\u878d\u6295\u8d44::https:\/\/kgbook.com\/jinrongtouzi\/&&\u7ba1\u7406\u4e66\u7c4d::https:\/\/kgbook.com\/guanlishuji\/&&\u52b1\u5fd7\u6210\u529f::https:\/\/kgbook.com\/lizhichenggong\/&&\u5386\u53f2\u5730\u7406::https:\/\/kgbook.com\/lishidili\/&&\u6218\u4e89\u519b\u4e8b::https:\/\/kgbook.com\/zhanzhengjunshi\/&&\u54f2\u5b66\u5b97\u6559::https:\/\/kgbook.com\/zhexuezongjiao\/&&\u513f\u7ae5\u6587\u5b66::https:\/\/kgbook.com\/ertongwenxue\/&&\u8bd7\u6b4c\u6563\u6587::https:\/\/kgbook.com\/shigesanwen\/&&\u81ea\u7136\u79d1\u5b66::https:\/\/kgbook.com\/zirankexue\/&&\u6559\u80b2\u5b66\u4e60::https:\/\/kgbook.com\/zirankexue\/&&\u7535\u8111\u7f51\u7edc::https:\/\/kgbook.com\/diannaowangluo\/&&\u4fdd\u5065\u517b\u751f::https:\/\/kgbook.com\/baojianyangsheng\/&&\u751f\u6d3b\u4f11\u95f2::https:\/\/kgbook.com\/shenghuoxiuxian\/&&\u671f\u520a\u6742\u5fd7::https:\/\/kgbook.com\/qikanzazhi\/&&\u5de5\u5177\u4e66::https:\/\/kgbook.com\/qikanzazhi\/","lastUpdateTime":"1763729843873","respondTime":180000,"ruleBookInfo":{"author":".infotype@a@text","coverUrl":".infohead@img@src","intro":".intro@p.0@text","kind":".infotype@p.1@text##\u4f5c\u54c1\u7c7b\u578b\uff1a","lastChapter":".list_xm@li.0@text","name":".cataloginfo@h3@text","tocUrl":".infolink@a.1@href"},"ruleContent":{"content":".novelcontent@text","title":"h1@text"},"ruleExplore":{"author":".content@a.1@text","bookList":"h2.recommendation-caption:contains(\u6700\u8fd1\u66f4\u65b0)~.article","bookUrl":".content@a.0@href","coverUrl":".article@a.0@img@data-src","intro":".content@.simple@text","name":".content@a.0@text"},"ruleSearch":{"author":".sone@a.1@text","bookList":".sone","bookUrl":".sone@a.0@href","name":".sone@a.0@text"},"ruleToc":{"chapterList":"li","chapterName":"a@text","chapterUrl":"a@href"},"searchUrl":"\/search,{\n\"charset\":\"utf-8\",\n\"method\":\"post\",\n\"body\":\"keyword={{key}}&type=book\"\n}","weight":0},{"bookSourceName":"\u53e5\u5b50\u63a7","bookSourceType":0,"bookSourceUrl":"https:\/\/www.juzikong.com\/","customOrder":0,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"\u540d\u8a00::https:\/\/www.juzikong.com\/mingyan\/list_{{page}}.html&&\u53e5\u5b50::https:\/\/www.juzikong.com\/juzi\/list_{{page}}.html&&\u7f8e\u6587::https:\/\/www.juzikong.com\/meiwen\/list_{{page}}.html&&\u6545\u4e8b::https:\/\/www.juzikong.com\/gushi\/list_{{page}}.html","lastUpdateTime":"1763730325109","respondTime":180000,"ruleBookInfo":{"author":".author-info@a@text","coverUrl":".article-cover@img@src","intro":".article-intro@text","kind":".category-tag@a@text","lastChapter":".latest-chapter@a@text","name":".article-title@h1@text","tocUrl":".chapter-list-link@href"},"ruleContent":{"content":".article-content@p@text","title":".content-title@h1@text"},"ruleExplore":{"author":".list-item@.author@text","bookList":".article-list","bookUrl":".list-item@a@href","coverUrl":".list-item@img@data-src","intro":".list-item@.summary@text","name":".list-item@.title@text"},"ruleSearch":{"author":".search-result-item@.author@text","bookList":".search-results","bookUrl":".search-result-item@a@href","name":".search-result-item@.title@text"},"ruleToc":{"chapterList":".chapter-item","chapterName":"a@text","chapterUrl":"a@href"},"searchUrl":"\/search.php,{\n\"charset\":\"utf-8\",\n\"method\":\"get\",\n\"body\":\"keyword={{key}}\"\n}","weight":0},{"bookSourceName":"\u5c0f\u6545\u4e8b\u4e66\u6e90","bookSourceType":0,"bookSourceUrl":"https:\/\/storynook.cn\/","customOrder":0,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"\u7761\u524d\u6545\u4e8b::https:\/\/storynook.cn\/story\/list\/1\/{{page}}\/&&\u513f\u7ae5\u6545\u4e8b::https:\/\/storynook.cn\/story\/list\/2\/{{page}}\/&&\u683c\u6797\u6545\u4e8b::https:\/\/storynook.cn\/story\/list\/3\/{{page}}\/&&\u6c11\u95f4\u6545\u4e8b::https:\/\/storynook.cn\/story\/list\/4\/{{page}}\/&&\u76ca\u667a\u6545\u4e8b::https:\/\/storynook.cn\/story\/list\/5\/{{page}}\/&&\u5386\u53f2\u6545\u4e8b::https:\/\/storynook.cn\/story\/list\/6\/{{page}}\/&&\u5bd3\u8a00\u6545\u4e8b::https:\/\/storynook.cn\/story\/list\/7\/{{page}}\/&&\u7ecf\u5178\u6545\u4e8b::https:\/\/storynook.cn\/story\/list\/8\/{{page}}\/&&\u6210\u8bed\u6545\u4e8b::https:\/\/storynook.cn\/story\/list\/9\/{{page}}\/&&\u7ae5\u8bdd\u4f5c\u6587::https:\/\/storynook.cn\/story\/list\/10\/{{page}}\/&&\u6050\u6016\u6545\u4e8b::https:\/\/storynook.cn\/story\/list\/11\/{{page}}\/&&\u77e5\u4e4e\u6545\u4e8b::https:\/\/storynook.cn\/story\/list\/12\/{{page}}\/&&\u804a\u658b\u5fd7\u5f02::https:\/\/storynook.cn\/story\/list\/13\/{{page}}\/&&\u89c4\u5219\u602a\u8c08::https:\/\/storynook.cn\/story\/list\/14\/{{page}}\/&&\u63a8\u7406\u6545\u4e8b::https:\/\/storynook.cn\/story\/list\/15\/{{page}}\/","lastUpdateTime":"1763732778859","respondTime":180000,"ruleBookInfo":{"author":".story-author@text","coverUrl":".story-cover@img@src","intro":".story-intro@text","kind":".story-cate@text","lastChapter":".last-chapter@text","name":".story-title@h1@text","tocUrl":".story-toc@a@href"},"ruleContent":{"content":".story-content@p@text","title":".chapter-title@h2@text"},"ruleExplore":{"author":".story-item@.author@text","bookList":".story-list","bookUrl":".story-item@a@href","coverUrl":".story-item@img@data-src","intro":".story-item@.intro@text","name":".story-item@.title@text"},"ruleSearch":{"author":".search-result@.author@text","bookList":".search-list","bookUrl":".search-result@a@href","name":".search-result@.title@text"},"ruleToc":{"chapterList":"#chapter-list@li","chapterName":"a@text","chapterUrl":"a@href"},"searchUrl":"\/search,{\n\"method\":\"get\",\n\"params\":{\n\"q\":\"{{key}}\"\n}\n}","weight":0},{"bookSourceComment":"\u6e90\u793e\u533a\uff1a@Mengteen  2025.11.22\u539f\u521b\n\u4e8c\u4f20\u4e8c\u521b\u6216\u8005\u662f\u5176\u5b83\u95ee\u9898\u8bf7\u8054\u7cfb\u6211\u3002\n\u6211\u90ae\u7bb1:[xxxmgqxxx@vip.qq.com]\n\u6211QQ:99737563(\u5907\u6ce8\u6765\u610f)\n1.\u4e0d\u9700\u8981\u6302\ud83e\ude9c\u5b50,\u4e0d\u6392\u9664\u4e2a\u522b\u5730\u65b9\u7f51\u7edc\u52a0\u8f7d\u53ef\u80fd\u6709\u70b9\u6162\u6216\u8005\u662f\u9700\u8981\u6302\ud83e\ude9c\u5b50\u624d\u80fd\u8bbf\u95ee\uff0c\u522b\u6025\uff01\n2.\u53d1\u73b0\u662f\u6309\u6211\u4e2a\u4eba\u559c\u6b22,\u4f60\u4e5f\u53ef\u4ee5\u81ea\u884c\u521b\u5efa\u4f60\u4e2a\u4eba\u559c\u6b22\u7684\u3002","bookSourceGroup":"\ud83d\ude0d","bookSourceName":"\ud83d\ude0d\u8f7b\u5199\u771f","bookSourceType":2,"bookSourceUrl":"http:\/\/www.635k.com\/##@Mengteen","customButton":false,"customOrder":7,"enabled":true,"enabledCookieJar":false,"enabledExplore":true,"eventListener":false,"exploreUrl":"[\n{\"title\": \"\u9996\u9875\",\"url\": \"http:\/\/www.635k.com\/\",\n\"style\": {\"layout_flexGrow\": 1,\n\"layout_flexBasisPercent\": 0.25\n}},\n{\"title\": \"\u7ec5\u58eb\u6444\u5f71\",\"url\": \"\/shenshiSHENSHIjinjiqihua_{{page}}.html\",\n\"style\": {\"layout_flexGrow\": 1,\n\"layout_flexBasisPercent\": 0.25\n}},\n{\"title\": \"SSA\u4e1d\u793e\",\"url\": \"\/ssasishe_{{page}}.html\",\n\"style\": {\"layout_flexGrow\": 1,\n\"layout_flexBasisPercent\": 0.25\n}},\n{\"title\": \"Ligui\u4e3d\u67dc\",\"url\": \"\/liguiligui_{{page}}.html\",\n\"style\": {\"layout_flexGrow\": 1,\n\"layout_flexBasisPercent\": 0.25\n}},\n{\"title\": \"\u5f02\u601d\u8da3\u5411\",\"url\": \"\/IESSyisiquxiang_{{page}}.html\",\n\"style\": {\"layout_flexGrow\": 1,\n\"layout_flexBasisPercent\": 0.25\n}},\n{\"title\": \"\u4e1d\u6155SMOU\",\"url\": \"\/simusmou_{{page}}.html\",\n\"style\": {\"layout_flexGrow\": 1,\n\"layout_flexBasisPercent\": 0.25\n}},\n{\"title\": \"\u514b\u62c9\u5973\u795e\",\"url\": \"\/kelanvshenKelagirls_{{page}}.html\",\n\"style\": {\"layout_flexGrow\": 1,\n\"layout_flexBasisPercent\": 0.25\n}},\n{\"title\": \"\u4e1d\u610fSIEE\",\"url\": \"\/siyiSIEE_{{page}}.html\",\n\"style\": {\"layout_flexGrow\": 1,\n\"layout_flexBasisPercent\": 0.25\n}},\n{\"title\": \"\u4e1d\u889c\u5957\u56fe\",\"url\": \"\/siwataotu_{{page}}.html\",\n\"style\": {\"layout_flexGrow\": 1,\n\"layout_flexBasisPercent\": 0.25\n}},\n{\"title\": \"\u6155\u4e1d\u5973\u90ce\",\"url\": \"\/musinvlang_{{page}}.html\",\n\"style\": {\"layout_flexGrow\": 1,\n\"layout_flexBasisPercent\": 0.25\n}},\n{\"title\": \"\u68a6\u4e1d\u5973\u795e\",\"url\": \"\/mengsinvshen_{{page}}.html\",\n\"style\": {\"layout_flexGrow\": 1,\n\"layout_flexBasisPercent\": 0.25\n}}\n]","header":"{\"User-Agent\": \"Mozilla\/5.0 (Linux; Android 13; 2211133C Build\/TKQ1.220905.001) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/135.0.0.0 Mobile Safari\/537.36\"}","lastUpdateTime":"1763776653287","respondTime":180000,"ruleBookInfo":{"kind":"span@text","tocUrl":".all-page@a@href"},"ruleContent":{"content":"@js: \nlet pics=java.getString('img@src'); \nlet p=String(pics).split(\"\\n\").map(i=>`<img src=\"${i}\">`).join(\"\\n\");\np;","imageStyle":"FULL"},"ruleExplore":[],"ruleSearch":{"author":".item-meta@text","bookList":"#post_list_box@li","bookUrl":"h2@a@href","checkKeyWord":"\u5199\u771f","coverUrl":"img@src","intro":"<br>\ud83c\udf1f\n<br>\ud83d\udcc6{{@@.ltim@text}} \u53d1\u5e03\n<br>{{\"\ud83c\udfc4Mengteen \u00a92025\"}}","name":"h2@a@text"},"ruleToc":{"chapterList":"ul@li","chapterName":"text","chapterUrl":"href"},"searchUrl":"\/search\/{{page}}_2.html","weight":0},{"bookSourceComment":"build 2025-11-22\n\u96e8\u843d\u661f\u8fb0\n\u5931\u6548\u53cd\u9988\uff1a961955482\n\u7f51\u9875\u7248\u672c\uff0c\u53ea\u80fd\u770b\u524d20\u7ae0\uff0c\u9002\u5408\u627e\u4e66\u7136\u540e\u6362\u6e90\u770b\uff0c\u7fa4\u91cc\u6709\u53bb\u5e7f\u544a\u7248\u672c","bookSourceGroup":"\u661f\u8fb0","bookSourceName":"\u8ffd\u4e66\u795e\u5668","bookSourceType":0,"bookSourceUrl":"http:\/\/zhuishushenqi.com\/","customOrder":2,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"@js:\nvar result = [];\nvar push = function(title, url, size) {\nresult.push({\"title\": title, \"url\": url, \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": size}});\n};\nvar tagUrl = source.key;\nvar tag = java.ajax(tagUrl);\nvar tagList = org.jsoup.Jsoup.parse(tag).select(\".category-list a\");\nvar tagSize = 0.4;\npush(\"\u5206\u7c7b\", null, 1);\nfor (var i = 0; i < tagList.length; i++) {\nvar title = org.jsoup.Jsoup.parse(tagList[i]).select(\".name\").text();\nvar url = String(tagList[i].attr(\"href\")) + \"&page={{page}}\"\ntitle = String(title).replace(\/\\s\/g, \"\");\npush(title, url, tagSize);\n}\nJSON.stringify(result);","lastUpdateTime":"1763788580268","respondTime":180000,"ruleBookInfo":[],"ruleContent":{"content":".inner-text@html"},"ruleExplore":{"author":".author@span.0@text","bookList":".books-list@a","bookUrl":"href","coverUrl":"img@src","intro":".desc@text","kind":".author@span.-1@text","name":"h4@text"},"ruleSearch":{"author":".author@span.0@text","bookList":".books-list@.book","bookUrl":"data-href","checkKeyWord":"\u5251\u6765","coverUrl":"img@src","intro":".desc@text","kind":".author@span.-1@text","name":".name@text"},"ruleToc":{"chapterList":"class.chapter-list.-1@li","chapterName":"a@text##^(.*?)\u7b2c","chapterUrl":"a@href"},"searchUrl":"https:\/\/www.zhuishushenqi.com\/search?val={{key}}","weight":0},{"bookSourceComment":"11.23@ys4568","bookSourceName":"\u6709\u5ea6\u4e2d\u6587\u7f51","bookSourceType":0,"bookSourceUrl":"https:\/\/www.youduzw.com","bookUrlPattern":"https:\/\/www.youduzw.com\/book\/.*","customButton":false,"customOrder":-3,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"eventListener":false,"exploreUrl":"[\n    {\n        \"title\": \"\u5168\u90e8\u5206\u7c7b\",\n        \"url\": \"\/0\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u4e16\u7d00\u767e\u5f37\",\n        \"url\": \"\/shijibaiqiang\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u96a8\u8eab\u667a\u56ca\",\n        \"url\": \"\/suishenzhinang\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u6b77\u53f2\u7159\u96f2\",\n        \"url\": \"\/lishiyanyun\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u6b66\u4fe0\u5c0f\u8aaa\",\n        \"url\": \"\/wuxia\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u61f8\u7591\u5c0f\u8aaa\",\n        \"url\": \"\/xuanyi\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u8a00\u60c5\u5c0f\u8aaa\",\n        \"url\": \"\/yanqing\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u5947\u5e7b\u5c0f\u8aaa\",\n        \"url\": \"\/qihuanxiaoshuo\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u4f20\u8bb0\u56de\u5fc6\",\n        \"url\": \"\/zhuanjihuiyi\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u82f1\u6587\u8bfb\u672c\",\n        \"url\": \"\/yingwenduben\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u6742\u6587\u968f\u7b14\",\n        \"url\": \"\/zawensuibi\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u7ecf\u5178\u8a00\u60c5\",\n        \"url\": \"\/jingdianyanqing\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u7ecf\u5178\u5386\u53f2\",\n        \"url\": \"\/jingdianlishi\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u4fa6\u63a2\u63a8\u7406\",\n        \"url\": \"\/zhentantuili\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u60ca\u609a\u60ac\u7591\",\n        \"url\": \"\/jingsongxuanyi\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u7f51\u7edc\u7384\u5e7b\",\n        \"url\": \"\/wangluoxuanhuan\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u5bd3\u8a00\u7ae5\u8bdd\",\n        \"url\": \"\/yuyantonghua\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u9752\u6625\u90fd\u5e02\",\n        \"url\": \"\/qingchundushi\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u793e\u4f1a\u5fc3\u7406\",\n        \"url\": \"\/shehuixinli\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u5916\u56fd\u5c0f\u8bf4\",\n        \"url\": \"\/waiguoxiaoshuo\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u7ecf\u5178\u79d1\u5e7b\",\n        \"url\": \"\/jingdiankehuan\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u5f53\u4ee3\u5c0f\u8bf4\",\n        \"url\": \"\/dangdaixiaoshuo\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u7ecf\u5178\u6b66\u4fa0\",\n        \"url\": \"\/jingdianwuxia\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u7eaa\u5b9e\u62a5\u544a\",\n        \"url\": \"\/jishibaogao\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u4e16\u754c\u5386\u53f2\",\n        \"url\": \"\/shijielishi\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u4e2d\u56fd\u5386\u53f2\",\n        \"url\": \"\/zhongguolishi\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u79d1\u666e\u5b66\u4e60\",\n        \"url\": \"\/kepuxuexi\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u8bd7\u6b4c\u620f\u66f2\",\n        \"url\": \"\/shigexiqu\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u5b97\u6559\u54f2\u5b66\",\n        \"url\": \"\/zongjiaozhexue\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u6587\u5b66\u7406\u8bba\",\n        \"url\": \"\/wenxuelilun\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u65e5\u8bed\u8bfb\u7269\",\n        \"url\": \"\/riyuduwu\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u4f5c\u54c1\u96c6\",\n        \"url\": \"\/zuopinji\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u56fd\u5b66\u53e4\u7c4d\",\n        \"url\": \"\/guoxueguji\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u6218\u4e89\u519b\u4e8b\",\n        \"url\": \"\/zhanzhengjunshi\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u653f\u6cbb\u7ecf\u6d4e\",\n        \"url\": \"\/zhengzhijingji\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u53e4\u5178\u6587\u5b66\",\n        \"url\": \"\/gudianwenxue\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u73b0\u4ee3\u5c0f\u8bf4\",\n        \"url\": \"\/xiandaixiaoshuo\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u5b98\u573a\u5c0f\u8bf4\",\n        \"url\": \"\/guanchangxiaoshuo\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u8f7b\u5c0f\u8bf4\",\n        \"url\": \"\/qingxiaoshuo\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u7f51\u6e38\u5c0f\u8bf4\",\n        \"url\": \"\/wangyouxiaoshuo\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u7384\u5e7b\u5c0f\u8bf4\",\n        \"url\": \"\/xuanhuanxiaoshuo\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u7a7f\u8d8a\u5c0f\u8bf4\",\n        \"url\": \"\/chuanyuexiaoshuo\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u79d1\u5e7b\u5c0f\u8bf4\",\n        \"url\": \"\/kehuanxiaoshuo\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u4ed9\u4fa0\u5c0f\u8bf4\",\n        \"url\": \"\/xianxiaxiaoshuo\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u90fd\u5e02\u5c0f\u8bf4\",\n        \"url\": \"\/dushixiaoshuo\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u6b66\u4fa0\u5c0f\u8bf4\",\n        \"url\": \"\/wuxiaxiaoshuo\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u5386\u53f2\u5c0f\u8bf4\",\n        \"url\": \"\/lishixiaoshuo\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u7ade\u6280\u5c0f\u8bf4\",\n        \"url\": \"\/jingjixiaoshuo\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u8a00\u60c5\u5c0f\u8bf4\",\n        \"url\": \"\/yanqingxiaoshuo\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u60ac\u7591\u5c0f\u8bf4\",\n        \"url\": \"\/xuanyixiaoshuo\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u519b\u4e8b\u5c0f\u8bf4\",\n        \"url\": \"\/junshixiaoshuo\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u7075\u5f02\u5c0f\u8bf4\",\n        \"url\": \"\/lingyixiaoshuo\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u7535\u51fb\u6587\u5e93\",\n        \"url\": \"\/dianjiwenku\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u5bcc\u58eb\u89c1\u6587\u5e93\",\n        \"url\": \"\/fushijianwenku\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u89d2\u5ddd\u6587\u5e93\",\n        \"url\": \"\/jiaochuanwenku\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"MF\u6587\u5e93J\",\n        \"url\": \"\/MFwenkuJ\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"Fami\u901a\u6587\u5e93\",\n        \"url\": \"\/Famitongwenku\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"GA\u6587\u5e93\",\n        \"url\": \"\/GAwenku\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"HJ\u6587\u5e93\",\n        \"url\": \"\/HJwenku\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u4e00\u8fc5\u793e\",\n        \"url\": \"\/yixunshe\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u96c6\u82f1\u793e\",\n        \"url\": \"\/jiyingshe\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u5c0f\u5b66\u9986\",\n        \"url\": \"\/xiaoxueguan\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u8bb2\u8c08\u793e\",\n        \"url\": \"\/jiangtanshe\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u5c11\u5973\u6587\u5e93\",\n        \"url\": \"\/shaonvwenku\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"title\": \"\u5176\u4ed6\u6587\u5e93\",\n        \"url\": \"\/qitawenku\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    }\n]","lastUpdateTime":"1763873509517","respondTime":180000,"ruleBookInfo":{"author":"[property$=author]@content","coverUrl":"[property$=image]@content","intro":"[property$=description]@content","kind":"[property~=category|status|update_time]@content","lastChapter":"[property$=latest_chapter_name]@content","name":"[property$=title]@content","wordCount":"h1+p@span.-1@text"},"ruleContent":{"content":"#TextContent@p@html||#TextContent@html","nextContentUrl":"@js:\neval(String(result.match(\/var nextpage.*?;\/)));\nlet list = [];\nif (\/_\/.test(nextpage)) {\n    list.push(nextpage)\n};\nlist;"},"ruleExplore":{"author":"strong.0@text","bookList":".j_bookList li","bookUrl":"a.-1@href","coverUrl":"img@_src","intro":"a.-1@text","kind":"strong!0@span@text","name":"h2@text"},"ruleSearch":{"author":".mr10.1@text","bookList":"#hism","bookUrl":"a.0@href","coverUrl":"img@_src","intro":"p.-2@text","kind":".mr10.0@text","lastChapter":"a.-1@text","name":"img@alt"},"ruleToc":{"chapterList":"<js>\nlet list = [];\nlet push = (text, href, vol) => list.push({\n    \"text\": text,\n    \"href\": href,\n    \"vol\": vol\n});\nlet v = java.getElements('#chapterList>li');\nfor (let i = 0; i < v.length; i++) {\n    if (v[i].attr('class') != 'w33p') {\n        push(v[i].text(), v[i].attr('href'), true)\n    } else {\n        t = v[i].select('a')\n        push(t.text(), t.attr('href'), false)\n    }\n}\nlist;\n<\/js>","chapterName":"text","chapterUrl":"href","isVolume":"vol"},"searchUrl":"\/sa,{\n  \"body\": \"searchkey={{key}}&searchtype=all\",\n  \"method\": \"POST\"\n}","weight":0},{"bookSourceComment":"\nQQ\u8d44\u6e90\u7fa4\uff1a992706162\n\nTG\u4ea4\u6d41\u7fa4\uff1ahttps:\/\/t.me\/huanmengnovel\n\n\u7531\u4e8e\u4e00\u76f4\u75af\u72c2\u88ab\u4eba\u4e3e\u62a5\u514d\u8d39\u4e66\u6e90\u3001\u8f6f\u4ef6\u3001QQ\u7fa4\uff0c\u6240\u4ee5QQ\u7fa4\u4ee5\u540e\u957f\u671f\u7981\u8a00\n\n\u5e7b\u68a6\u8f7b\u5c0f\u8bf4\u5168\u7f51\u6700\u9f50\u5168\u7684\u8f7b\u5c0f\u8bf4\u7f51\uff0c\u8bbf\u95ee\u901f\u5ea6\u4f18\u8d28\u800c\u4e14\u7f51\u9875\u5185\u7f6e\u63d2\u56fe\uff0c\u62e5\u6709\u6d77\u91cf\u7684\u8f7b\u5c0f\u8bf4\u4e66\u7c4d\uff0c\u5982\u679c\u6709\u7f51\u9875bug\u6216\u8005\u9700\u6c42\u7684\u5c0f\u8bf4\u53ef\u4ee5\u8fdb\u7f51\u7ad9\u7fa4\u53ca\u65f6\u53cd\u9988\n\n\n\u4f5c\u8005\u7559\u8a00\uff1a\n\n1.0\u66f4\u65b0\uff1a\u672c\u7f51\u7ad9\u6240\u6709\u7684\u5c0f\u8bf4\u90fd\u662f\u514d\u8d39\u7684\uff0c\u76ee\u524d\u5df2\u7ecf\u6709\u4e86PC\u7aef\u548cwap\u7aef\uff0cAPP\u7aef\u76ee\u524d\u8fd8\u6709\u70b9\u95ee\u9898\u9700\u8981\u8c03\u8bd5\n\n\u672c\u6b21\u521d\u6b21\u5236\u4f5c\u597d\u4e86\u5bf9\u63a5\u9605\u8bfb\u7684\u4e66\u6e90\uff0c\u4f46\u662f\u4e3a\u4e86\u907f\u514d\u88ab\u5927\u89c4\u6a21\u76d7\u5237\u6d41\u91cf\uff0c\u4e66\u6e90\u6682\u65f6\u6ca1\u6709\u5bf9\u63a5\u63d2\u56fe\n\n2.0\u66f4\u65b0\uff1a\u672c\u6b21\u66f4\u65b0\u89e3\u51b3\u4e86\u63d2\u56fe\u95ee\u9898\uff0c\u8ba9\u4e66\u6e90\u53ef\u4ee5\u663e\u793a\u63d2\u56fe\uff0c\u663e\u793a\u4e0d\u51fa\u6765\u591a\u5237\u65b0\u5c31\u884c\n\n\u7ad9\u957f\u5728Cdn\u5904\u65b0\u589e\u901f\u7387\u9650\u5236\uff0c\u8d85\u8fc7\u9650\u5236\u4f1a\u88ab\u62c9\u9ed1\uff0c\u56fd\u5916\u5730\u533a\u4e5f\u4f1a\u65e0\u6cd5\u8bbf\u95ee\u63d2\u56fe\uff0c\u975e\u5b98\u7f51\u8bbf\u95ee\u4e5f\u4f1a\u65e0\u6cd5\u8bbf\u95ee\u63d2\u56fe\n\n\u5982\u679c\u540e\u7eed\u9605\u8bfb\u65b9\u9762\u6d41\u91cf\u8fc7\u4e8e\u5f02\u5e38\uff0c\u6211\u4f1a\u5173\u95ed\u9605\u8bfb\u7684\u9605\u8bfb\u63d2\u56fe\u6e20\u9053\uff0c\u5e0c\u671b\u5404\u4f4d\u53ef\u4ee5\u7406\u89e3\n\n2.1\u66f4\u65b0\uff1a\u65b0\u589e\u53d1\u73b0\u9875\u9762\u7684\u9009\u9879\u529f\u80fd\uff0c\u7528\u6237\u53ef\u4ee5\u66f4\u5feb\u901f\u4fbf\u6377\u7684\u4ece\u5206\u7c7b\u548c\u9898\u6750\u4e2d\u5bfb\u627e\u81ea\u5df1\u60f3\u8981\u7684\u5c0f\u8bf4\n\n2.2\u66f4\u65b0\uff1a\u4fee\u590d\u53d1\u73b0\u9875\u9762\u7684\u5206\u7c7b\u529f\u80fd\u5f02\u5e38\u7684\u95ee\u9898\uff0c\u73b0\u5728\u79fb\u9664\u6587\u5e93\u5206\u7c7b\n\n2.3\u66f4\u65b0\uff1a\u4fee\u590d\u53d1\u73b0\u754c\u9762\u8fc7\u4e8e\u62e5\u6324\uff0c\u70b9\u51fb\u4f5c\u8005\u65e0\u6cd5\u5feb\u901f\u641c\u7d22\u4f5c\u8005\uff0c\u603b\u6709\u51e0\u672c\u63a8\u8350\u9605\u8bfb\u59cb\u7ec8\u5360\u636e\u5206\u7c7b\u4e66\u7c4d\u9876\u90e8\u7684\u95ee\u9898\uff0c\u8fd9\u91cc\u611f\u8c22QQ\u7528\u6237\u96ea\u9690\u6885\u9999\u63d0\u4f9b\u7684\u4fee\u590d\n\n\n2.4\u66f4\u65b0\uff1a\u4f18\u5316\u4e86\u63d2\u56fe\u6392\u7248\u7684\u95ee\u9898\uff0c\u5982\u679c\u63d2\u56fe\u4e0d\u662f\u4e00\u5f20\u56fe\u7247\u4e00\u9875\uff0c\u53ef\u4ee5\u5c1d\u8bd5\u5728\u9605\u8bfb\u754c\u9762\u53f3\u4e0a\u89d2\u624b\u52a8\u628a\u56fe\u7247\u6837\u5f0f\u6539\u4e3aSINGLE\n\n2.5\u66f4\u65b0\uff1a\u672c\u6b21\u7f51\u7ad9\u5c06\u56fe\u5e8a\u66f4\u6362\u4e3a\u4e86\u4e0b\u884c\u5bbd\u5e26300M\uff0c\u4e0a\u884c200M\u7684\u5927\u5bbd\u5e26\u670d\u52a1\u5668\uff0c\u65b9\u4fbf\u5927\u5bb6\u66f4\u5feb\u7684\u4f7f\u7528\u3002\u4e0e\u6b64\u540c\u65f6\u4fee\u590d\u4e86\u66f4\u6362\u56fe\u5e8a\u540e\uff0c\u63d2\u56fe\u5f02\u5e38\u4e0d\u663e\u793a\u7684\u95ee\u9898\n\n2.6\u66f4\u65b0\uff1a\u7f51\u53cb\u4fee\u6539\u4f18\u5316\u7248\u672c\uff0c\u7531\u4e8e\u6d77\u5916\u7ebf\u8def\u9700\u8981\u4eba\u673a\u4ea4\u4e92\uff0c\u4fee\u590d\u4e86\u6d77\u5916\u7ebf\u8def\u88ab\u963b\u62e6\uff0c\u65e0\u6cd5\u4f7f\u7528\u4e66\u6e90\u7684\u95ee\u9898\n\n2.7\u66f4\u65b0\uff1a\u4fee\u590d\u9605\u8bfbapp\u4e0b\u8f7d\u8fc7\u5feb\uff0c\u4f1a\u89e6\u53d1\u62c9\u9ed1\u7684\u95ee\u9898\uff0c\u9650\u5236\u5e76\u53d1\n\n2.8\u66f4\u65b0\uff1a\u517c\u5bb9\u82f9\u679c\u7528\u6237\u7684\u8bfb\u4e0d\u820d\u624b\u4e66\u6e90\uff0c\u4fee\u590d\u76ee\u5f55\u5f02\u5e38\u7684\u95ee\u9898\n\n\u6ce8\u610f\uff1a\n\n\u6b64\u4e66\u6e90\u652f\u6301\u82f9\u679c\u7528\u6237\u7684TF\u6d4b\u8bd5\u7248\u7684\u8bfb\u4e0d\u820d\u624b\n\n\u4ee5\u524d\u4e66\u6e90\u7248\u672c\u53ef\u80fd\u4f1a\u51fa\u73b0\u76ee\u5f55\u6ca1\u6709\u6587\u7ae0\uff0c\u6216\u8005\u663e\u793a\u5f02\u5e38\n\n\u6211\u6ca1\u6709\u82f9\u679c\u624b\u673a\uff0c\u4e5f\u65e0\u6cd5\u6d4b\u8bd5\u548c\u5199\u4e66\u6e90\uff0c\u80fd\u591f\u9002\u914d\u4e00\u4e2a\u82f9\u679c\u4e66\u6e90\u6211\u5df2\u7ecf\u5c3d\u529b\u4e86\uff0c\u5927\u5bb6\u89c1\u8c05\n\n\n2.9\u66f4\u65b0\uff1a\u4e0a\u8c03\u5e76\u53d1\u7387\uff0c\u5e76\u53d1\u7387\u592a\u4f4e\u53ef\u80fd\u4f1a\u51fa\u73b0\u56fe\u7247\u52a0\u8f7d\u5f02\u5e38\uff0c\u592a\u9ad8\u4f1a\u5bfc\u81f4\u88ab\u62c9\u9ed1\n\n3.0\u66f4\u65b0\uff1a\u5728\u53d1\u73b0\u529f\u80fd\u4e2d\uff0c\u65b0\u589e\u4e00\u4e2a\u3010\u6700\u65b0\u3011\u6309\u94ae\u529f\u80fd\uff0c\u81ea\u52a8\u7d22\u5f15\u83b7\u53d6\u65f6\u95f4\u6233\u6700\u65b0\u5165\u5e9350\u672c\u5c0f\u8bf4\n\n\u66f4\u591a\u8be6\u60c5\u5185\u5bb9\uff0c\u53ef\u4ee5\u5173\u6ce8\uff1awww.huanmengacg.com\n\n","bookSourceName":"\ud83c\udf47\u5e7b\u68a6\u8f7b\u5c0f\u8bf43.0\uff08\u53d1\u73b0\u65b0\u589e\u6700\u8fd1\u66f4\u65b0\uff09","bookSourceType":0,"bookSourceUrl":"https:\/\/www.huanmengacg.com","concurrentRate":"80\/5000","customOrder":3,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"[\n{\"title\": \"\ud83c\udf51 \u5e7b\u68a6\u8f7b\u5c0f\u8bf4\u9996\u9875 \ud83c\udf51\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/page\/{{page}}\",\n\"style\": {\"layout_flexGrow\": 0,\n\"layout_flexBasisPercent\": 1\n}},\n{\"title\": \"\ud83c\udf53 \u5168\u90e8 \ud83c\udf53\",\"url\": \"\",\n\"style\": {\"layout_flexGrow\": 1,\n\"layout_flexBasisPercent\": 0.29\n}},\n{\"title\": \"\ud83c\udf45 \u2193 \u4ee5\u4e0b\u4e3a\u9898\u6750\u5206\u7c7b \u2193 \ud83c\udf45\",\"url\": \"\",\n\"style\": {\"layout_flexGrow\": 0,\n\"layout_flexBasisPercent\": 1\n}},\n{\"title\": \"\u6700\u65b0\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/custom\/serial\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u6821\u56ed\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/1\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u9752\u6625\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/2\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u604b\u7231\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/3\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u6cbb\u6108\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/4\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u7fa4\u50cf\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/5\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u7ade\u6280\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/6\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u97f3\u4e50\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/7\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u7f8e\u98df\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/8\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u65c5\u884c\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/9\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u6b22\u4e50\u5411\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/10\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u7ecf\u8425\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/11\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u804c\u573a\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/12\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u6597\u667a\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/13\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u8111\u6d1e\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/14\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u5b85\u6587\u5316\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/15\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u7a7f\u8d8a\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/16\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u5947\u5e7b\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/17\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u9b54\u6cd5\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/18\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u5f02\u80fd\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/19\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u6218\u6597\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/20\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u79d1\u5e7b\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/21\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u673a\u6218\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/22\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u6218\u4e89\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/23\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u5192\u9669\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/24\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u9f99\u50b2\u5929\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/25\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u60ac\u7591\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/26\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u72af\u7f6a\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/27\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u590d\u4ec7\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/28\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u9ed1\u6697\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/29\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u730e\u5947\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/30\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u60ca\u609a\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/31\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u95f4\u8c0d\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/32\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u672b\u65e5\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/33\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u6e38\u620f\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/34\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u5927\u9003\u6740\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/35\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u9752\u6885\u7af9\u9a6c\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/36\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u59b9\u59b9\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/37\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u5973\u513f\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/38\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"JK\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/39\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"JC\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/40\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u5927\u5c0f\u59d0\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/41\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u6027\u8f6c\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/42\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u4f2a\u5a18\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/43\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u4eba\u5916\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/44\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u540e\u5bab\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/45\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u767e\u5408\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/46\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u803d\u7f8e\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/47\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"NTR\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/48\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u5973\u6027\u89c6\u89d2\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/49\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}},\n{\"title\": \"\u6682\u672a\u5206\u7c7b\",\"url\": \"https:\/\/www.huanmengacg.com\/index.php\/book\/category\/tags\/50\/page\/{{page}}\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.29}}\n]","header":"@js: \nJSON.stringify({\n  \"User-Agent\": \"Mozilla\/5.0 (Linux; Android 10; K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/124.0.0.0 Mobile Safari\/537.36\",\n  \"Referer\": baseUrl\n})","lastUpdateTime":"1763894761823","loginCheckJs":"if (result.body().match(\/<title>Just a moment...<\\\/title>\/))\n{\tjava.startBrowserAwait(baseUrl,\"\u9a8c\u8bc1\")\n}\nresult","respondTime":180000,"ruleBookInfo":{"author":".book-metas.0@text##\u4f5c\u8005\uff1a","coverUrl":"dt@img@src","intro":".book-summary@text","kind":".book-metas.1@text&&.book-metas.2@text&&.book-metas.3@text##(?:\u5206\u7c7b|\u72b6\u6001|\u66f4\u65b0)\uff1a| [\\d\uff1a:]+\n<js>result.replace(\/ \/,\",\")<\/js>","name":".book-title@text"},"ruleContent":{"content":"#BookText@p@html","imageStyle":"SINGLE","nextContentUrl":"text.\u4e0b\u4e00\u9875@href"},"ruleExplore":{"author":".book-module@class.pipe-z@text","bookList":"class.module@class.contentbox@class.boxbd@.common-list","bookUrl":"a@href","coverUrl":"img@data-original","intro":".book-profile@text","kind":".book-module@class.pipe-z-s@text","name":"dt@text"},"ruleSearch":{"author":".book-module@text##\u00b7\u00b7.*","bookList":".boxbd@.common-list","bookUrl":"a@href","checkKeyWord":"--https:\/\/www.huanmengacg.com\/index.php\/book_read_4799_2022.html","coverUrl":"img@data-original","intro":".book-profile@text","kind":".book-module@text##.*\u00b7\u00b7","name":"dt@text"},"ruleToc":{"chapterList":"#chapterlist li a","chapterName":"text","chapterUrl":"href","nextTocUrl":"text.\u4e0b\u4e00\u9875@href"},"searchUrl":"\/index.php\/book\/search?action=search&key={{key}}","weight":0},{"bookSourceComment":"Pixiv \u5c0f\u8bf4\uff08\u66f4\u65b0\ud83d\udcc6\uff1a2025-11-24\uff09\n\n\u4e66\u6e90\u7248\u672c\uff1a247\n\u4f7f\u7528\u8bf4\u660e\uff1a\ud83d\udccc\u9605\u8bfb\u7248\u672c 3.25.0527 \u53ca\u4e4b\u540e\u7248\u672c\u53ef\u7528\n\u53ef\u7528\u529f\u80fd\uff1a\u2705\u641c\u7d22\u2705\u53d1\u73b0\u2705\u6dfb\u52a0\u7f51\u5740\u2705\u8ba2\u9605\u6e90\n\u641c\u7d22\u5c0f\u8bf4\uff1a\u2705\u5355\u7bc7\u2705\u7cfb\u5217\u2705\u6807\u7b7e\u2705\u4f5c\u8005\n\u53d1\u73b0\u5c0f\u8bf4\uff1a\u2705\u5173\u6ce8\u2705\u8ffd\u66f4\u2705\u63a8\u8350\u2705\u53d1\u73b0\n\u53d1\u73b0\u5c0f\u8bf4\uff1a\u2705\u6536\u85cf\u2705\u4e66\u7b7e\u2705\u9996\u9875\u2705\u6392\u884c\n\u6dfb\u52a0\u7f51\u5740\uff1a\u2705\u5c0f\u8bf4\u2705\u7cfb\u5217\u2705\u4f5c\u8005\n\u8ba2\u9605\u7528\u6cd5\uff1a\u70b9\u51fb\u8ba2\u9605\u6e90\u6253\u5f00\u5c0f\u8bf4\/\u7cfb\u5217\u5c0f\u8bf4\uff0c\u3010\u5237\u65b0\u3011\uff0c\u70b9\u51fb\u3010\u52a0\u5165\u4e66\u67b6\u3011\u6309\u94ae\uff0c\u6dfb\u52a0\u5230\u4e66\u67b6\n\n\u4e66\u6e90\u53d1\u5e03\uff1aPixiv \u4e66\u6e90\u9891\u9053 https:\/\/t.me\/PixivSource\n\u9879\u76ee\u5730\u5740\uff1ahttps:\/\/github.com\/DowneyRem\/PixivSource\n\u4f7f\u7528\u6559\u7a0b\uff1ahttps:\/\/downeyrem.github.io\/PixivSource\/Pixiv\n\n\u65e7\u7248\u4e66\u6e90\uff1a\nhttps:\/\/cdn.jsdelivr.net\/gh\/DowneyRem\/PixivSource@191\/pixiv.json\nhttps:\/\/raw.githubusercontent.com\/DowneyRem\/PixivSource\/191\/pixiv.json\n\n\u89c4\u5219\u8ba2\u9605\uff1aimport \u8ba2\u9605\u6e90\nhttps:\/\/cdn.jsdelivr.net\/gh\/DowneyRem\/PixivSource@main\/import.json\nhttps:\/\/raw.githubusercontent.com\/DowneyRem\/PixivSource\/main\/import.json\n\n\u2699\ufe0f \u4e66\u6e90\u8bbe\u7f6e\uff1a\n\u8bbe\u7f6e1\ufe0f\u20e3\uff1a\u6253\u5f00\u5c0f\u8bf4 - \u83dc\u5355 - \u767b\u5f55 - \u70b9\u51fb\u4e0b\u65b9\u6309\u94ae\n\u8bbe\u7f6e2\ufe0f\u20e3\uff1a\u7f16\u8f91\u4e66\u6e90 - \u57fa\u672c - \u53d8\u91cf\u8bf4\u660e - \u4fee\u6539\u5e76\u4fdd\u5b58\n\n\ud83d\udeab \u5c4f\u853d\u4f5c\u8005(\u672c\u5730)\uff1a\n\u25b6\ufe0f\u8bbe\u7f6e\u65b9\u6cd5\uff1a\u6253\u5f00\u5c0f\u8bf4 - \u83dc\u5355 - \u767b\u5f55 - \ud83d\udeab \u5c4f\u853d\u4f5c\u8005\n\n\ud83d\udeab \u5c4f\u853d\u6807\u7b7e\/\u63cf\u8ff0(\u672c\u5730)\uff1a\n1\ufe0f\u20e3\u7f16\u8f91\u4e66\u6e90\uff1a\u83dc\u5355 - \u767b\u5f55 - \u70b9\u51fb\u3010 \ud83d\udc40 \u67e5\u770b\u5c4f\u853d\u3011\n2\ufe0f\u20e3\u5207\u6362\u5217\u8868\uff1a\u70b9\u51fb\u6309\u94ae\uff0c\u5207\u6362\u81f3\u3010\u76f8\u5e94\u5c4f\u853d\u5217\u8868\u3011\n3\ufe0f\u20e3\u8f93\u5165\u5185\u5bb9\uff1a\u5728\u3010\u8f93\u5165\u5185\u5bb9\u3011\u5904\u8f93\u5165\u5c4f\u853d\u5185\u5bb9\n4\ufe0f\u20e3\u5c4f\u853d\u4f5c\u8005\uff1a\u70b9\u51fb\u3010\ud83d\udeab \u52a0\u5165\u5c4f\u853d\u3011\uff0c\u5c4f\u853d\u8be5\u5185\u5bb9\n\n\ud83d\udccc \u559c\u6b22\u6807\u7b7e(\u672c\u5730)\uff1a\n1\ufe0f\u20e3\u7f16\u8f91\u4e66\u6e90\uff1a\u83dc\u5355 - \u767b\u5f55 \uff0c\u627e\u5230\u8f93\u5165\u5185\u5bb9\n2\ufe0f\u20e3\u8f93\u5165\u5185\u5bb9\uff1a\u8f93\u5165\u6807\u7b7e\uff0c\u70b9\u51fb\u3010\ud83d\udccc \u559c\u6b22\u6807\u7b7e\u3011\n\n\u2764\ufe0f \u67e5\u770b\u4ed6\u4eba\u6536\u85cf\uff1a\n1\ufe0f\u20e3\u7f16\u8f91\u4e66\u6e90\uff1a\u83dc\u5355 - \u767b\u5f55 \uff0c\u627e\u5230\u8f93\u5165\u5185\u5bb9\n2\ufe0f\u20e3\u8f93\u5165\u5185\u5bb9\uff1a\u8f93\u5165\u4f5c\u8005ID\uff0c\u70b9\u51fb\u3010\u2764\ufe0f \u4ed6\u4eba\u6536\u85cf\u3011","bookSourceGroup":"\ud83d\udd1e Pixiv","bookSourceName":"\ud83c\udd7f\ufe0f Pixiv \u5c0f\u8bf4","bookSourceType":0,"bookSourceUrl":"https:\/\/www.pixiv.net\/novel","bookUrlPattern":"(https?:\/\/)?(www\\.)?pixiv\\.net(\/ajax)?\/(novel\/(show\\.php\\?id=|series\/)?|users?\/)\\d+.*","concurrentRate":"3\/2000","customButton":false,"customOrder":0,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"eventListener":false,"exploreUrl":"@js:\nlet SHOW_R18_GENRE, SHOW_GENERAL_NEW, SHOW_GENERAL_RANK, SHOW_GENERAL_GENRE\ntry {\n    settings = JSON.parse(String(source.variableComment).match(RegExp(\/{([\\s\\S]*?)}\/gm)))\n    SHOW_R18_GENRE = settings.SHOW_R18_GENRE         \/\/ \u53d1\u73b0\uff1a\u70ed\u95e8\u5206\u7c7b\u663e\u793aR18\u5c0f\u8bf4\n    SHOW_GENERAL_NEW = settings.SHOW_GENERAL_NEW     \/\/ \u53d1\u73b0\uff1a\u6700\u65b0\u3001\u4f01\u5212\u3001\u7ea6\u7a3f\u663e\u793a\u4e00\u822c\u5c0f\u8bf4\n    SHOW_GENERAL_RANK = settings.SHOW_GENERAL_RANK   \/\/ \u53d1\u73b0\uff1a\u6392\u884c\u699c\u663e\u793a\u4e00\u822c\u5c0f\u8bf4\n    SHOW_GENERAL_GENRE = settings.SHOW_GENERAL_GENRE \/\/ \u53d1\u73b0\uff1a\u70ed\u95e8\u5206\u7c7b\u663e\u793a\u4e00\u822c\u5c0f\u8bf4\n} catch (e) {\n    SHOW_R18_GENRE = false\n    SHOW_GENERAL_NEW = false\n    SHOW_GENERAL_RANK = false\n    SHOW_GENERAL_GENRE = false\n}\n\nli = [\n    {\"\u2b50\ufe0f \u5173\u6ce8\": \"https:\/\/www.pixiv.net\/ajax\/follow_latest\/novel?p={{page}}&mode=r18&lang=zh\"},\n    {\"\ud83d\udcc3 \u8ffd\u66f4\": \"https:\/\/www.pixiv.net\/ajax\/watch_list\/novel?p={{page}}&new=1&lang=zh\"},\n    {\"\ud83d\udcaf \u63a8\u8350\": \"https:\/\/www.pixiv.net\/ajax\/top\/novel?mode=r18&lang=zh\"},\n    {\"\ud83d\udd0d \u53d1\u73b0\": \"https:\/\/www.pixiv.net\/ajax\/novel\/discovery?mode=r18&lang=zh\"},\n    {\"\u2764\ufe0f \u6536\u85cf\": \"https:\/\/www.pixiv.net\/ajax\/user\/{{cache.get(\\\"pixiv:uid\\\")}}\/novels\/bookmarks?tag=&offset={{(page-1)*24}}&limit=24&rest=show&lang=zh\"},\n    {\"\u3299\ufe0f \u6536\u85cf\": \"https:\/\/www.pixiv.net\/ajax\/user\/{{cache.get(\\\"pixiv:uid\\\")}}\/novels\/bookmarks?tag=&offset={{(page-1)*24}}&limit=24&rest=hide&lang=zh\"},\n    {\"\ud83c\udff7\ufe0f \u4e66\u7b7e\": \"https:\/\/www.pixiv.net\/novel\/marker_all.php\"},\n    {\"\ud83c\udfe0 \u9996\u9875\": \"https:\/\/www.pixiv.net\"},\n]\n\nnormal = [\n    {\"\u2705 \u5e38\u89c4 \u5c0f\u8bf4 \u63a8\u8350 \u2705\": \"\"},\n    {\"\u2b50\ufe0f \u5173\u6ce8\": \"https:\/\/www.pixiv.net\/ajax\/follow_latest\/novel?p={{page}}&mode=all&lang=zh\"},\n    {\"\ud83d\udcaf \u63a8\u8350\": \"https:\/\/www.pixiv.net\/ajax\/top\/novel?mode=all&lang=zh\"},\n    {\"\ud83d\udd0d \u53d1\u73b0\": \"https:\/\/www.pixiv.net\/ajax\/novel\/discovery?mode=safe&lang=zh\"},\n    {\"\ud83c\udd99 \u66f4\u65b0\": \"https:\/\/cdn.jsdelivr.net\/gh\/DowneyRem\/PixivSource@main\/pixiv.json\"},\n]\n\nr18New = [\n    {\"\ud83c\udd95 \u6700\u65b0 \u4f01\u5212 \u7ea6\u7a3f \ud83d\udcb0\": \"\"},\n    {\"\ud83c\udd95 \u6700\u65b0\": \"https:\/\/www.pixiv.net\/ajax\/novel\/new?lastId=0&limit=20&r18=true&lang=zh\"},\n    {\"\ud83d\udcd1 \u4f01\u5212\": \"https:\/\/www.pixiv.net\/ajax\/user_event\/portal\/novels?mode=r18&p={{page}}&lang=zh\"},\n    {\"\ud83d\udcb0 \u7ea6\u7a3f\": \"https:\/\/www.pixiv.net\/ajax\/commission\/page\/request\/complete\/novels?mode=r18&p={{page}}&lang=zh\"},\n    {\"\ud83d\udd0d \u53d1\u73b0\": \"https:\/\/www.pixiv.net\/ajax\/novel\/discovery?mode=all&lang=zh\"},\n]\n\ngeneralNew = [\n    {\"\u2705 \u6700\u65b0 \u4f01\u5212 \u7ea6\u7a3f \u2705\": \"\"},\n    {\"\u6700\u65b0\": \"https:\/\/www.pixiv.net\/ajax\/novel\/new?lastId=0&limit=20&r18=false&lang=zh\"},\n    {\"\u4f01\u5212\": \"https:\/\/www.pixiv.net\/ajax\/user_event\/portal\/novels?mode=all&p={{page}}&lang=zh\"},\n    {\"\u7ea6\u7a3f\": \"https:\/\/www.pixiv.net\/ajax\/commission\/page\/request\/complete\/novels?mode=all&p={{page}}&lang=zh\"},\n    {\"\u7f16\u8f91\": \"https:\/\/www.pixiv.net\/novel\/editors_picks\"},\n]\n\nr18Rank = [\n    {\"\ud83d\udc51 \u6392\u884c\u699c\u5355 \ud83d\udc51\": \"\"},\n    {\"\u4eca\u65e5\": \"https:\/\/www.pixiv.net\/novel\/ranking.php?mode=daily_r18\"},\n    {\"\u672c\u5468\": \"https:\/\/www.pixiv.net\/novel\/ranking.php?mode=weekly_r18\"},\n    {\"R18G\": \"https:\/\/www.pixiv.net\/novel\/ranking.php?mode=r18g\"},\n    {\"\u7537\u6027\": \"https:\/\/www.pixiv.net\/novel\/ranking.php?mode=male_r18\"},\n    {\"\u5973\u6027\": \"https:\/\/www.pixiv.net\/novel\/ranking.php?mode=female_r18\"}\n]\n\ngeneralRank = [\n    {\"\ud83c\udfc6 \u6392\u884c\u699c\u5355 \ud83c\udfc6\": \"\"},\n    {\"\u4eca\u65e5\": \"https:\/\/www.pixiv.net\/novel\/ranking.php?mode=daily\"},\n    {\"\u672c\u5468\": \"https:\/\/www.pixiv.net\/novel\/ranking.php?mode=weekly\"},\n    {\"\u672c\u6708\": \"https:\/\/www.pixiv.net\/novel\/ranking.php?mode=monthly\"},\n    {\"\u7537\u6027\": \"https:\/\/www.pixiv.net\/novel\/ranking.php?mode=male\"},\n    {\"\u5973\u6027\": \"https:\/\/www.pixiv.net\/novel\/ranking.php?mode=female\"},\n    {\"\u65b0\u4eba\": \"https:\/\/www.pixiv.net\/novel\/ranking.php?mode=rookie\"},\n    {\"\u539f\u521b\": \"https:\/\/www.pixiv.net\/novel\/ranking.php?mode=weekly_original\"},\n    {\"AI\u751f\u6210\": \"https:\/\/www.pixiv.net\/novel\/ranking.php?mode=weekly_ai\"}\n]\n\nr18Genre = [\n    {\"\ud83d\udd25 \u539f\u521b\u70ed\u95e8 \ud83d\udd25\": \"\"},\n    {\"\u7537\u6027\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/male?mode=r18&lang=zh\"},\n    {\"\u5973\u6027\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/female?mode=r18&lang=zh\"},\n    {\"\u604b\u7231\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/romance?mode=r18&lang=zh\"},\n    {\"\u5f02\u4e16\u754c\u5947\u5e7b\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/isekai_fantasy?mode=r18&lang=zh\"},\n    {\"\u73b0\u4ee3\u5947\u5e7b\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/contemporary_fantasy?mode=r18&lang=zh\"},\n    {\"\u60ac\u7591\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/mystery?mode=r18&lang=zh\"},\n    {\"\u6050\u6016\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/horror?mode=r18&lang=zh\"},\n    {\"\u79d1\u5e7b\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/sci-fi?mode=r18&lang=zh\"},\n    {\"\u6587\u5b66\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/literature?mode=r18&lang=zh\"},\n    {\"\u60c5\u611f\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/drama?mode=r18&lang=zh\"},\n    {\"\u5386\u53f2\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/historical_pieces?mode=r18&lang=zh\"},\n    {\"\u803d\u7f8e\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/bl?mode=r18&lang=zh\"},\n    {\"\u767e\u5408\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/yuri?mode=r18&lang=zh\"},\n    {\"\u6563\u6587\u00b7\u8bd7\u6b4c\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/poetry?mode=r18&lang=zh\"},\n    {\"\u968f\u7b14\u00b7\u7eaa\u5b9e\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/non-fiction??mode=r18&lang=zh\"},\n    {\"\u5267\u672c\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/screenplays?mode=r18&lang=zh\"},\n    {\"\u8bc4\u8bba\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/reviews?mode=r18&lang=zh\"},\n    {\"\u5176\u4ed6\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/other?mode=r18&lang=zh\"}\n]\n\ngeneralgGenre = [\n    {\"\u2764\ufe0f\u200d\ud83d\udd25 \u539f\u521b\u70ed\u95e8 \u2764\ufe0f\u200d\ud83d\udd25\": \"\"},\n    {\"\u7efc\u5408\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/all?mode=safe&lang=zh\"},\n    {\"\u604b\u7231\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/romance?mode=safe&lang=zh\"},\n    {\"\u5f02\u4e16\u754c\u5947\u5e7b\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/isekai_fantasy?mode=safe&lang=zh\"},\n    {\"\u73b0\u4ee3\u5947\u5e7b\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/contemporary_fantasy?mode=safe&lang=zh\"},\n    {\"\u60ac\u7591\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/mystery?mode=safe&lang=zh\"},\n    {\"\u6050\u6016\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/horror?mode=safe&lang=zh\"},\n    {\"\u79d1\u5e7b\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/sci-fi?mode=safe&lang=zh\"},\n    {\"\u6587\u5b66\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/literature?mode=safe&lang=zh\"},\n    {\"\u60c5\u611f\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/drama?mode=safe&lang=zh\"},\n    {\"\u5386\u53f2\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/historical_pieces?mode=safe&lang=zh\"},\n    {\"\u803d\u7f8e\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/bl?mode=safe&lang=zh\"},\n    {\"\u767e\u5408\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/yuri?mode=safe&lang=zh\"},\n    {\"\u6563\u6587\u00b7\u8bd7\u6b4c\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/poetry?mode=safe&lang=zh\"},\n    {\"\u968f\u7b14\u00b7\u7eaa\u5b9e\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/non-fiction??mode=safe&lang=zh\"},\n    {\"\u5267\u672c\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/screenplays?mode=safe&lang=zh\"},\n    {\"\u8bc4\u8bba\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/reviews?mode=safe&lang=zh\"},\n    {\"\u5176\u4ed6\": \"https:\/\/www.pixiv.net\/ajax\/genre\/novel\/other?mode=safe&lang=zh\"}\n]\n\nlet likeTagLinks = [{\"\ud83d\udccc \u559c\u6b22\u6807\u7b7e \ud83d\udccc\":\"\"}]\nlet othersBookmarks = [{\"\u2764\ufe0f \u4ed6\u4eba\u6536\u85cf \u2764\ufe0f\": \"\"}]\n\nli = li.concat(normal)\nli = li.concat(r18New)\nif (SHOW_GENERAL_NEW === true) {\n    li = li.concat(generalNew)\n}\nli = li.concat(r18Rank)\nif (SHOW_GENERAL_RANK === true) {\n    li = li.concat(generalRank)\n}\nif (SHOW_R18_GENRE === true) {\n    li = li.concat(r18Genre)\n}\nif (SHOW_GENERAL_GENRE === true) {\n    li = li.concat(generalgGenre)\n}\nsleepToast('\u4f7f\u7528\u6307\u5357\ud83d\udd16\\n\\n\u53d1\u73b0 - \u66f4\u65b0 - \u70b9\u51fb\"\ud83d\udd30 \u4f7f\u7528\u6307\u5357\" - \u67e5\u770b')\n\n\/\/ \u6536\u85cf\u6807\u7b7e\nlet likeTags = getFromCache(\"likeTags\")\nif (likeTags !== null && likeTags.length >= 1) {\n    likeTags.forEach(tag => {\n        let tagLink = {}\n        tagLink[tag] = `${urlSearchNovel(tag, \"{{page}}\")}`\n        likeTagLinks.push(tagLink)\n    })\n    li = li.concat(likeTagLinks)\n}\n\n\/\/ \u4ed6\u4eba\u6536\u85cf\nlet likeAuthors = getFromCacheMap(\"likeAuthors\")\nif (likeAuthors.size > 0) {\n    likeAuthors.forEach((authorName, authorId) => {\n        let bookmark = {}\n        bookmark[authorName] = urlUserBookmarks(authorId)\n        othersBookmarks.push(bookmark)\n    })\n    li = li.concat(othersBookmarks)\n}\n\n\/\/ \u6dfb\u52a0\u683c\u5f0f\nli.forEach(item => {\n    item.title = Object.keys(item)[0]\n    item.url = Object.values(item)[0]\n    if (item.url.includes(\"https:\/\/www.pixiv.net\")) item.url = urlIP(item.url)\n    delete item[Object.keys(item)[0]]\n    item.style = {}\n    item.style.layout_flexGrow = 1\n    item.style.layout_flexShrink = 1\n    item.style.layout_alignSelf = \"auto\"\n    item.style.layout_wrapBefore = \"false\"\n    if (item.url === \"\") {\n        item.style.layout_flexBasisPercent = 1\n    } else {\n        item.style.layout_flexBasisPercent = -1\n    }\n})\n\nJSON.stringify(li)","header":"{\"referer\":\"https:\/\/www.pixiv.net\"}","jsLib":"var checkTimes = 0\nvar cacheSaveSeconds = 7*24*60*60  \/\/ \u957f\u671f\u7f13\u5b58\u65f6\u95f4 7\u5929\nvar cacheTempSeconds = 10*60*1000  \/\/ \u77ed\u671f\u7f13\u5b58 10min\n\nfunction cacheGetAndSet(key, supplyFunc) {\n    const {java, cache} = this\n    let v = cache.get(key)\n    \/\/ \u7f13\u5b58\u4fe1\u606f\u9519\u8bef\u65f6\uff0c\u4fdd\u5b58 10min \u540e\u91cd\u65b0\u8bf7\u6c42\n    if (v && JSON.parse(v).error === true) {\n        if (new Date().getTime() >= JSON.parse(v).timestamp + cacheTempSeconds) {\n            cache.delete(key)\n            v = cache.get(key)\n        }\n    }\n    \/\/ \u65e0\u7f13\u5b58\u4fe1\u606f\u65f6\uff0c\u8fdb\u884c\u8bf7\u6c42\n    if (v === undefined || v === null) {\n        v = supplyFunc()\n        v.timestamp = new Date().getTime()\n        v = JSON.stringify(v)\n        cache.put(key, v, cacheSaveSeconds)\n    }\n    return JSON.parse(v)\n}\n\nfunction putInCache(objectName, object, saveSeconds) {\n    const {java, cache} = this\n    if (object === undefined) object = null\n    if (saveSeconds === undefined) saveSeconds = 0\n    cache.put(objectName, JSON.stringify(object), saveSeconds)\n}\nfunction getFromCache(objectName) {\n    const {java, cache} = this\n    let object = cache.get(objectName)\n    if (object === undefined) return null  \/\/ \u517c\u5bb9\u6e90\u9605\n    return JSON.parse(object)\n}\n\nfunction putInCacheMap(mapName, mapObject, saveSeconds) {\n    const {java, cache} = this\n    let orderedArray = []\n    mapObject.forEach((value, key) => {\n        const item = {}\n        item[key] = value\n        orderedArray.push(item)\n    })\n    \/\/ [{'key1': 'value1'}, {'key2': 'value2'}]\n    if (saveSeconds === undefined) saveSeconds = 0\n    cache.put(mapName, JSON.stringify(orderedArray), saveSeconds)\n}\nfunction getFromCacheMap(mapName) {\n    const {java, cache} = this\n    let cached = cache.get(mapName)\n    let newMap = new Map()\n    if (cached === null || cached === undefined) {\n        return newMap\n    }\n\n    let parsedData\n    try {\n        parsedData = JSON.parse(cached)\n    } catch (e) {\n        return newMap\n    }\n\n    if (Array.isArray(parsedData)) {\n        parsedData.forEach(item => {\n            for (let key in item) {\n                newMap.set(key, item[key])\n            }\n        })\n    } else {\n        for (let key in parsedData) {\n            newMap.set(key, parsedData[key])\n        }\n    }\n    return newMap\n}\n\nfunction isHtmlString(str) {\n    return str.startsWith(\"<!DOCTYPE html>\")\n}\nfunction isJsonString(str) {\n    try {\n        if (typeof JSON.parse(str) === \"object\") return true\n    } catch(e) {}\n    return false\n}\n\nfunction getWebViewUA() {\n    const {java, cache} = this\n    let userAgent = String(java.getWebViewUA())\n    if (userAgent.includes(\"Windows NT 10.0; Win64; x64\")) {\n        userAgent = \"Mozilla\/5.0 (Linux; Android 10; K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/119.0.0.0 Mobile Safari\/537.36\"\n    }\n    \/\/ java.log(`userAgent=${userAgent}`)\n    cache.put(\"userAgent\", userAgent)\n    return String(userAgent)\n}\nfunction isLogin() {\n    const {java, cache} = this\n    return !!cache.get(\"pixivCsrfToken\")\n}\n\nfunction getAjaxJson(url, forceUpdate) {\n    const {java, cache} = this\n    let v = cache.get(url)\n    if (forceUpdate || v && new Date().getTime() >= JSON.parse(v).timestamp + cacheTempSeconds) {\n        cache.delete(url)\n    }\n    return this.cacheGetAndSet(url, () => {\n        return JSON.parse(java.ajax(url))\n    })\n}\nfunction getAjaxAllJson(urls, forceUpdate) {\n    const {java, cache} = this\n    let v = cache.get(urls)\n    if (forceUpdate || v && new Date().getTime() >= JSON.parse(v).timestamp + cacheTempSeconds) {\n        cache.delete(urls)\n    }\n    return this.cacheGetAndSet(urls, () => {\n        let result = java.ajaxAll(urls).map(resp => JSON.parse(resp.body()))\n        cache.put(urls, JSON.stringify(result), cacheSaveSeconds)\n        for (let i in urls) cache.put(urls[i], JSON.stringify(result[i]), cacheSaveSeconds)\n        return result\n    })\n}\nfunction getIPJson(url, forceUpdate) {\n    const {java, cache} = this\n    url = url.replace(\"http:\/\/\", \"https:\/\/\").replace(\"www.pixiv.net\", \"210.140.139.155\")\n    let v = cache.get(url)\n    if (forceUpdate || v && new Date().getTime() >= JSON.parse(v).timestamp + cacheTempSeconds) {\n        cache.delete(url)\n    }\n    let headers = {\n        \"User-Agent\": \"Mozilla\/5.0 (Linux; Android 14)\",\n        \"X-Requested-With\": \"XMLHttpRequest\",\n        \"Host\": \"www.pixiv.net\"\n    }\n    return this.cacheGetAndSet(url, () => {\n        return JSON.parse(java.get(url, headers).body())\n    })\n}\nfunction getWebviewJson(url, parseFunc) {\n    const {java, cache} = this\n    return this.cacheGetAndSet(url, () => {\n        let html = java.webView(null, url, null)\n        return JSON.parse(parseFunc(html))\n    })\n}\n\nfunction urlIP(url) {\n    const {java, cache, source} = this\n    let isIPDirect\n    if (source.bookSourceName.includes(\"\u5907\u7528\") || source.bookSourceName.includes(\"\u6f2b\u753b\")) {\n        isIPDirect = JSON.parse(String(source.variableComment).match(RegExp(\/{([\\s\\S]*?)}\/gm)))?.IPDirect || false\n    } else {\n        isIPDirect = JSON.parse(cache.get(\"pixivSettings\"))?.IPDirect || false\n    }\n\n    if (isIPDirect) {\n        url = url.replace(\"http:\/\/\", \"https:\/\/\").replace(\"www.pixiv.net\", \"210.140.139.155\")\n        let headers = {\n            \"User-Agent\": \"Mozilla\/5.0 (Linux; Android 14)\",\n            \"X-Requested-With\": \"XMLHttpRequest\",\n            \"Host\": \"www.pixiv.net\",\n            \"x-csrf-token\": cache.get(\"pixivCsrfToken\") || \"\",\n            \"Cookie\": cache.get(\"pixivCookie\") || \"\"\n        }\n        return `${url}, ${JSON.stringify({headers: headers})}`\n    }\n    return url\n}\n\nfunction urlNovelUrl(novelId) {\n    return `https:\/\/www.pixiv.net\/novel\/show.php?id=${novelId}`\n}\nfunction urlNovelDetailed(novelId) {\n    return `https:\/\/www.pixiv.net\/ajax\/novel\/${novelId}`\n}\nfunction urlNovelsDetailed(userId, nidList) {\n    return `https:\/\/www.pixiv.net\/ajax\/user\/${userId}\/novels?${nidList.map(v => `ids[]=${v}`).join(\"&\")}`\n}\nfunction urlNovelBookmarkData(novelId) {\n    return `https:\/\/www.pixiv.net\/ajax\/novel\/${novelId}\/bookmarkData`\n}\nfunction urlNovelComments(novelId, offset, limit) {\n    return `https:\/\/www.pixiv.net\/ajax\/novels\/comments\/roots?novel_id=${novelId}&offset=${offset}&limit=${limit}&lang=zh`\n}\nfunction urlNovelCommentsReply(commentId, page) {\n    return `https:\/\/www.pixiv.net\/ajax\/novels\/comments\/replies?comment_id=${commentId}&page=${page}&lang=zh`\n}\nfunction urlNovelsRecommendInit(novelId, limit) {\n    if (limit === undefined) limit = 9\n    return `https:\/\/www.pixiv.net\/ajax\/novel\/${novelId}\/recommend\/init?limit=${limit}&lang=zh`\n}\nfunction urlNovelsRecommendDetailed(nidList) {\n    if (nidList.length >= 9) nidList.length = 9\n    return `https:\/\/www.pixiv.net\/ajax\/novel\/recommend\/novels?${nidList.map(v => `novelIds[]=${v}`).join(\"&\")}`\n}\n\nfunction urlSeriesUrl(seriesId) {\n    return `https:\/\/www.pixiv.net\/novel\/series\/${seriesId}`\n}\nfunction urlSeriesDetailed(seriesId) {\n    return `https:\/\/www.pixiv.net\/ajax\/novel\/series\/${seriesId}?lang=zh`\n}\nfunction urlSeriesNovelsTitles(seriesId) {\n    return `https:\/\/www.pixiv.net\/ajax\/novel\/series\/${seriesId}\/content_titles`\n}\nfunction urlSeriesNovels(seriesId, limit, offset) {\n    if (limit > 30) limit = 30\n    if (limit < 10) limit = 10\n    return `https:\/\/www.pixiv.net\/ajax\/novel\/series_content\/${seriesId}?limit=${limit}&last_order=${offset}&order_by=asc&lang=zh`\n}\n\nfunction urlUserUrl(userID) {\n    return `https:\/\/www.pixiv.net\/users\/${userID}\/novels`\n}\nfunction urlUserDetailed(userID) {\n    return `https:\/\/www.pixiv.net\/ajax\/user\/${userID}`\n}\nfunction urlUserWorkLatest(userID) {\n    return `https:\/\/www.pixiv.net\/ajax\/user\/${userID}\/works\/latest`\n}\nfunction urlUserAllWorks(userId) {\n    return `https:\/\/www.pixiv.net\/ajax\/user\/${userId}\/profile\/all?lang=zh`\n}\nfunction urlUserBookmarks(userId) {\n    return `https:\/\/www.pixiv.net\/ajax\/user\/${userId}\/novels\/bookmarks?tag=&offset={{(page-1)*30}}&limit=30&rest=show&lang=zh`\n}\n\nfunction urlSearchNovel(novelName, page) {\n    return `https:\/\/www.pixiv.net\/ajax\/search\/novels\/${encodeURI(novelName)}?word=${encodeURI(novelName)}&order=date_d&mode=all&p=${page}&s_mode=s_tag&lang=zh`\n}\nfunction urlSearchSeries(seriesName, page) {\n    return`https:\/\/www.pixiv.net\/ajax\/search\/novels\/${encodeURI(seriesName)}?word=${encodeURI(seriesName)}&order=date_d&mode=all&p=${page}&s_mode=s_tag&gs=1&lang=zh`\n}\n\/\/ \u4e0d\u5b8c\u5168\u5339\u914d\u7528\u6237\u540d\nfunction urlSearchUser(userName, full) {\n    if (full === undefined || full === false) {\n        return `https:\/\/www.pixiv.net\/search\/users?nick=${userName}&s_mode=s_usr&nick_mf=1`\n    } else {\n        return `https:\/\/www.pixiv.net\/search\/users?nick=${userName}&s_mode=s_usr_full&i=1`\n    }\n}\n\nfunction urlCoverUrl(url) {\n    const {java, cache, source} = this\n    let isIPDirect\n    if (source.bookSourceName.includes(\"\u5907\u7528\")|| source.bookSourceName.includes(\"\u6f2b\u753b\")) {\n        isIPDirect = JSON.parse(String(source.variableComment).match(RegExp(\/{([\\s\\S]*?)}\/gm)))?.IPDirect || false\n    } else {\n        isIPDirect = JSON.parse(cache.get(\"pixivSettings\"))?.IPDirect || false\n    }\n\n    let headers = {\"Referer\": \"https:\/\/www.pixiv.net\/\"}\n    if (isIPDirect && url.trim()) {\n        if (url.includes(\"i.pximg.net\")) {\n            url = url.replace(\"https:\/\/i.pximg.net\", \"https:\/\/210.140.139.133\")\n            headers.host = \"i.pximg.net\"\n        } else {\n            url = url.replace(\"https:\/\/s.pximg.net\", \"https:\/\/210.140.139.133\")\n            headers.host = \"s.pximg.net\"\n        }\n    }\n    return `${url}, ${JSON.stringify({headers: headers})}`\n}\nfunction urlIllustDetailed(illustId) {\n    return `https:\/\/www.pixiv.net\/ajax\/illust\/${illustId}?lang=zh`\n}\nfunction urlIllustOriginal(illustId, order) {\n    const {java, cache} = this\n    if (order <= 1) order = 1\n    let url = this.urlIP(urlIllustDetailed(illustId))\n    let illustOriginal = this.cacheGetAndSet(url, () => {\n        return JSON.parse(java.ajax(url))\n    })?.body?.urls?.original || \"\"\n    return this.urlCoverUrl(illustOriginal.replace(`_p0`, `_p${order - 1}`))\n}\nfunction urlEmojiUrl(emojiId) {\n    return this.urlCoverUrl(`https:\/\/s.pximg.net\/common\/images\/emoji\/${emojiId}.png`)\n}\nfunction urlStampUrl(stampId) {\n    return this.urlCoverUrl(`https:\/\/s.pximg.net\/common\/images\/stamp\/generated-stamps\/${stampId}_s.jpg`)\n}\n\nfunction urlMessageThreadLatest(max) {\n    if (max === undefined || max <= 5) max = 5\n    return `https:\/\/www.pixiv.net\/rpc\/index.php?mode=latest_message_threads2&num=${max}&lang=zh`\n}\nfunction urlMessageThreadContents(threadId, max) {\n    return `https:\/\/www.pixiv.net\/rpc\/index.php?mode=message_thread_contents&thread_id=${threadId}&num=${max}`\n}\nfunction urlMessageThreadDetail(threadId) {\n    return `https:\/\/www.pixiv.net\/rpc\/index.php?mode=message_thread&thread_id=${threadId}`\n}\nfunction urlNotification() {\n    return `https:\/\/www.pixiv.net\/ajax\/notification&lang=zh`\n}\n\nfunction dateFormat(str) {\n    let addZero = function (num) {\n        return num < 10 ? '0' + num : num;\n    }\n    let time = new Date(str);\n    let Y = time.getFullYear() + \"\u5e74\";\n    let M = addZero(time.getMonth() + 1) + \"\u6708\";\n    let D = addZero(time.getDate()) + \"\u65e5\";\n    return Y + M + D;\n}\nfunction timeFormat(str) {\n    let addZero = function (num) {\n        return num < 10 ? '0' + num : num;\n    }\n    let time = new Date(str);\n    let YY = time.getFullYear()\n    let MM = addZero(time.getMonth() + 1)\n    let DD = addZero(time.getDate())\n    let hh = addZero(time.getHours())\n    let mm = addZero(time.getMinutes())\n    let ss = addZero(time.getSeconds())\n    return `${YY}-${MM}-${DD} ${hh}:${mm}:${ss}`\n}\nfunction timeTextFormat(text) {\n    return `${text.slice(0, 10)} ${text.slice(11, 19)}`\n}\nfunction sleep(time) {\n    let endTime = new Date().getTime() + time\n    while(true){\n        if (new Date().getTime() > endTime){\n            return;\n        }\n    }\n}\nfunction sleepToast(text, second) {\n    const {java} = this\n    java.log(text)\n    \/\/ java.toast(text)\n    java.longToast(text)\n    if (second === undefined) second = 0.01\n    sleep(1000*second)\n}\n\nfunction updateSource() {\n    const {java, source} = this\n    java.longToast(\"\ud83c\udd99 \u66f4\u65b0\u4e66\u6e90\\n\\nJsdelivr CDN \u66f4\u65b0\u6709\u5ef6\u8fdf\\nGithub \u66f4\u65b0\u9700\u4ee3\u7406\")\n    let onlineSource, comment, sourceName, sourceNameCapitalize, index = 0\n    if (source.bookSourceUrl.includes(\"pixiv\")) sourceName = \"pixiv\"\n    else if (source.bookSourceUrl.includes(\"furrynovel\")) sourceName = \"linpx\"\n    sourceNameCapitalize = sourceName[0].toUpperCase() + sourceName.substring(1)\n\n    if (source.bookSourceName.includes(\"\u5907\u7528\")) index = 1\n    else if (source.bookSourceName.includes(\"\u6f2b\u753b\")) index = 2\n    if (source.bookSourceUrl.includes(\"furrynovel.com\")) {\n        sourceNameCapitalize = \"FurryNovel\"\n        index = 1\n    }\n\n    try {\n        let updateUrl = `https:\/\/cdn.jsdelivr.net\/gh\/DowneyRem\/PixivSource@main\/${sourceName}.json`\n        onlineSource = JSON.parse(java.get(updateUrl,{'User-Agent': 'Mozilla\/5.0 (Linux; Android 14)','X-Requested-With': 'XMLHttpRequest'}).body())[index]\n    } catch (e) {\n        try {\n            let updateUrl = `https:\/\/raw.githubusercontent.com\/DowneyRem\/PixivSource\/main\/${sourceName}.json`\n            onlineSource = JSON.parse(java.get(updateUrl,{'User-Agent': 'Mozilla\/5.0 (Linux; Android 14)','X-Requested-With': 'XMLHttpRequest'}).body())[index]\n        } catch (e) {\n            onlineSource = {lastUpdateTime: new Date().getTime(), bookSourceComment: source.bookSourceComment}\n        }\n    }\n    comment = onlineSource.bookSourceComment.split(\"\\n\")\n    \/\/ onlineSource = source\n    \/\/ comment = source.bookSourceComment.split(\"\\n\")\n\n    let htm = `\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>\u66f4\u65b0 ${source.bookSourceName} \u4e66\u6e90<\/title>\n    <style> \n    table { text-align: center; margin: 0 auto; } .ann { display: flex; justify-content: center; align-items: center; height: 5vh; } \n    button { background-color: rgb(76, 175, 80); color: white; border: none; border-radius: 4px; height: 6vh; width: 30vw; overflow: hidden; } \n    button span { cursor: pointer; display: inline-block; position: relative; transition: 0.4s; } \n    button span:after { content: '>'; position: absolute; opacity: 0; top: 0; right: 30px; transition: 0.2s; } \n    button:active span { padding-right: 20px; } \n    button:active span:after { opacity: 1; right: -40px; }\n    <\/style>\n<\/head>\n\n<body>\n    <table border=\"1\" cellspacing=\"0\">\n        <th colspan=\"2\"> ${source.bookSourceName} \u4e66\u6e90 \n        <a href=\"https:\/\/downeyrem.github.io\/PixivSource\/${sourceNameCapitalize}\">\ud83d\udd30 \u4f7f\u7528\u6307\u5357<\/a>\n        || <a href=\"https:\/\/downeyrem.github.io\/PixivSource\/Sponsor\">\u2764\ufe0f \u8d5e\u52a9\u5f00\u53d1<\/a>\n        <\/th>\n        <tr>\n            <td>\u2601\ufe0f \u8fdc\u7a0b\u7248\u672c\uff1a${onlineSource.bookSourceComment.split(\"\\n\")[2].replace(\"\u4e66\u6e90\u7248\u672c\uff1a\", \"\")}<\/td>\n            <td>\ud83d\udcc6 \u66f4\u65b0\uff1a${timeFormat(onlineSource.lastUpdateTime)}<\/td>\n        <\/tr>\n        <tr>\n            <td>\ud83d\udce5 \u672c\u5730\u7248\u672c\uff1a${source.bookSourceComment.split(\"\\n\")[2].replace(\"\u4e66\u6e90\u7248\u672c\uff1a\", \"\")}<\/td>\n            <td>\ud83d\udcc6 \u66f4\u65b0\uff1a${timeFormat(source.lastUpdateTime)}<\/td>\n        <\/tr> \n        <tr><td colspan=\"2\" style=\"text-align: left;\">${comment.slice(3, 10).join(\"<br>\")}<\/td><\/tr>\n        <tr><td colspan=\"2\" style=\"text-align: left;\">${comment.slice(comment.length-20, comment.length).join(\"<br>\")}<\/td><\/tr>\n    <\/table>\n    \n    <table border=\"0\" cellspacing=\"20\">\n        <th colspan=\"2\"> \u66f4\u65b0 ${source.bookSourceName} \u4e66\u6e90 <\/th>\n        <tr><td><div class=\"ann\">\n            <a href=\"legado:\/\/import\/importonline?src=https:\/\/cdn.jsdelivr.net\/gh\/DowneyRem\/PixivSource@main\/${sourceName}.json\">\n            <button><span>\u66f4\u65b0\u4e66\u6e90<br>(Jsdelivr CDN)<\/span><\/button>\n            <\/a><\/div><\/td>\n            \n            <td><div class=\"ann\">\n            <a href=\"legado:\/\/import\/importonline?src=https:\/\/cdn.jsdelivr.net\/gh\/DowneyRem\/PixivSource@main\/btsrk.json\">\n            <button><span>\u66f4\u65b0\u8ba2\u9605<br>(Jsdelivr CDN)<\/span><\/button>\n            <\/a><\/div><\/td>\n        <\/tr>\n        \n        <tr><td><div class=\"ann\">\n            <a href=\"legado:\/\/import\/importonline?src=https:\/\/raw.githubusercontent.com\/DowneyRem\/PixivSource\/main\/${sourceName}.json\">\n            <button><span>\u4e66\u6e90\u94fe\u63a5<br>(GitHub)<\/span><\/button>\n            <\/a><\/div><\/td>\n            \n            <td><div class=\"ann\">\n            <a href=\"legado:\/\/import\/importonline?src=https:\/\/raw.githubusercontent.com\/DowneyRem\/PixivSource\/main\/btsrk.json\">\n            <button><span>\u8ba2\u9605\u94fe\u63a5<br>(GitHub)<\/span><\/button>\n            <\/a><\/div><\/td>\n        <\/tr>\n        \n        <tr><td><div class=\"ann\">\n            <a href=\"legado:\/\/import\/importonline?src=https:\/\/codeberg.org\/DowneyRem\/PixivSource\/raw\/branch\/main\/${sourceName}.json\">\n            <button><span>\u5907\u7528\u4e66\u6e90\u94fe\u63a5<br>(Codeberg)<\/span><\/button>\n            <\/a><\/div><\/td>\n            \n            <td><div class=\"ann\">\n            <a href=\"legado:\/\/import\/importonline?src=https:\/\/codeberg.org\/DowneyRem\/PixivSource\/raw\/branch\/main\/btsrk.json\">\n            <button><span>\u5907\u7528\u8ba2\u9605\u94fe\u63a5<br>(Codeberg)<\/span><\/button>\n            <\/a><\/div><\/td>\n        <\/tr>\n    <\/table>\n<\/body>\n<\/html>`\n    java.startBrowser(`data:text\/html;charset=utf-8;base64, ${java.base64Encode(htm)}`, '\u66f4\u65b0\u4e66\u6e90')\n    return []\n}","lastUpdateTime":"1763917885005","loginCheckJs":"var util = {}\n\nfunction objStringify(obj) {\n    return JSON.stringify(obj, (n, v) => {\n        if (typeof v == \"function\")\n            return v.toString();\n        return v;\n    });\n}\nfunction isBackupSource() {\n    let isBackupSource = source.bookSourceName.includes(\"\u5907\u7528\")\n    cache.put(\"isBackupSource\", isBackupSource)\n    return isBackupSource\n}\n\/\/ \u68c0\u6d4b \u6e90\u9605\n\/\/ \u53ef\u7528 java.ajax() \u4e0d\u53ef\u7528 java.webview() java.ajaxAll()\n\/\/ \u53ef\u7528 java.getCookie() cache.put() cache.get() \u9ed8\u8ba4\u503c\u4e3a undefined\n\/\/ \u53ef\u7528 java.startBrowser() \u4e0d\u53ef\u7528 java.startBrowserAwaitAwait\n\/\/ \u53ef\u7528 source.bookSourceName source.getVariable() source.setVariable()\u7b49\n\/\/ java.getUserAgent() java.getWebViewUA() \u76ee\u524d\u8fd4\u56de\u5185\u5bb9\u76f8\u540c\nfunction isSourceRead() {\n    let isSourceReadStatus = java.getUserAgent() === java.getWebViewUA()\n    cache.put(\"isSourceRead\", isSourceReadStatus)\n    return isSourceReadStatus\n}\n\/\/ \u68c0\u6d4b \u9605\u8bfb \u6b63\u5f0f\u7248 \u4e0e Beta \u7248\u672c\nfunction isLegadoOfficial() {\n    let isLegadoOfficialStatus\n    try {\n        eval('({})?.value')\n        isLegadoOfficialStatus = false\n    } catch (e) {\n        isLegadoOfficialStatus = true\n    }\n    cache.put(\"isLegadoOfficial\", isLegadoOfficialStatus)\n    return isLegadoOfficialStatus\n}\n\/\/ \u68c0\u6d4b \u9605\u8bfb Beta \u7248\u672c \u4e0e LYC \u7248\u672c\n\/\/ LYC \u7248\u672c\u65b0\u589e\u51fd\u6570\n\/\/ java.ajaxTestAll()\n\/\/ java.openVideoPlayer(url: String, title: String, float: Boolean)\n\/\/ cookie.setWebCookie(url,cookie)\n\/\/ source.refreshExplore()\n\/\/ source.refreshJSLib()\nfunction isLegadoLYC() {\n    let isLegadoLYCStatus = (typeof java.ajaxTestAll === \"function\")\n    cache.put(\"isLegadoLYCStatus\", isLegadoLYCStatus)\n    return isLegadoLYCStatus\n}\n\nfunction publicFunc() {\n    let u = {}, settings\n    \/\/ \u8f93\u51fa\u4e66\u6e90\u4fe1\u606f\n    java.log(`\ud83c\udd7f\ufe0f ${source.bookSourceComment.split(\"\\n\")[0]}`)\n    java.log(`\ud83d\udccc ${source.bookSourceComment.split(\"\\n\")[2]}`)\n    java.log(`\ud83d\udcc6 \u66f4\u65b0\u65f6\u95f4\uff1a${java.timeFormat(source.lastUpdateTime)}`)\n    if (isSourceRead()) {\n        java.log(\"\ud83d\udcf1 \u8f6f\u4ef6\u5e73\u53f0\uff1a\ud83c\udf4e \u6e90\u9605 SourceRead\")\n    } else if (isLegadoOfficial()) {\n        java.log(\"\ud83d\udcf1 \u8f6f\u4ef6\u5e73\u53f0\uff1a\ud83e\udd16 \u5f00\u6e90\u9605\u8bfb \u3010\u6b63\u5f0f\u7248\u3011\")\n        java.log(\"\u5f53\u524d\u8f6f\u4ef6\u4e3a\uff1a\u9605\u8bfb\u3010\u6b63\u5f0f\u7248\u3011\\n\\n\u3010\u6b63\u5f0f\u7248\u3011\u5df2\u5e74\u4e45\u5931\u4fee\uff0c\u4e0d\u63a8\u8350\u7ee7\u7eed\u4f7f\u7528\\n\u63a8\u8350\u4f7f\u7528\u3010Beta\u7248\u3011\u3010\u5171\u5b58\/\u65b0\u5171\u5b58\u7248\u3011\\n\\nBeta\u7248\u672c\u4e0b\u8f7d\u94fe\u63a5\uff1a\\nhttps:\/\/miaogongzi.lanzout.com\/b01rgkhhe\\n\u5982\u9700\u66f4\u65b0\uff0c\u53ef\u53bb\u4e66\u6e90\u8c03\u8bd5\u754c\u9762\\n\u6253\u5f00\u4e0b\u8f7d\u94fe\u63a5\u5207\u6362\u9605\u8bfb\u7248\u672c\\n\")\n    } else {\n        if (isLegadoLYC()) {\n            java.log(\"\ud83d\udcf1 \u8f6f\u4ef6\u5e73\u53f0\uff1a\ud83e\udd16 \u5f00\u6e90\u9605\u8bfb Beta\/LYC \u7248\")\n        } else {\n            java.log(\"\ud83d\udcf1 \u8f6f\u4ef6\u5e73\u53f0\uff1a\ud83e\udd16 \u5f00\u6e90\u9605\u8bfb Beta \u7248\uff08\u672a\u5408\u5165 LYC \u529f\u80fd\uff09\")\n        }\n    }\n\n    \/\/ \u83b7\u53d6\u8bbe\u7f6e\uff0c\u5907\u7528\u4e66\u6e90\u4f7f\u7528\u65e7\u7248\u8bbe\u7f6e\uff0c\u4e66\u6e90\u4ece\u7f13\u5b58\u83b7\u53d6\u8bbe\u7f6e\n    if (isBackupSource()) {\n        settings = JSON.parse(String(source.variableComment).match(RegExp(\/{([\\s\\S]*?)}\/gm)))\n    } else {\n        \/\/ cache.delete(\"pixivSettings\")\n        settings = getFromCache(\"pixivSettings\")\n    }\n    let isIPDirect = settings?.IPDirect || false\n    if (isIPDirect) java.log(\"\u2708\ufe0f \u76f4\u8fde\u6a21\u5f0f\uff1a\u2705 \u5df2\u5f00\u542f\")\n\n    \/\/ \u521d\u59cb\u5316\u8bbe\u7f6e\n    if (settings !== null) {\n        java.log(\"\u2699\ufe0f \u4f7f\u7528\u81ea\u5b9a\u4e49\u8bbe\u7f6e\")\n    } else {\n        settings = {}\n        settings.SEARCH_AUTHOR = true       \/\/ \u641c\u7d22\uff1a\u9ed8\u8ba4\u641c\u7d22\u4f5c\u8005\u540d\u79f0\n        settings.CONVERT_CHINESE = true     \/\/ \u641c\u7d22\uff1a\u641c\u7d22\u65f6\u8fdb\u884c\u7e41\u7b80\u8f6c\u6362\n        settings.SHOW_LIKE_NOVELS = true    \/\/ \u641c\u7d22\uff1a\u641c\u7d22\u7ed3\u679c\u663e\u793a\u6536\u85cf\u5c0f\u8bf4\n        settings.SHOW_WATCHED_SERIES = true \/\/ \u641c\u7d22\uff1a\u641c\u7d22\u7ed3\u679c\u663e\u793a\u8ffd\u6574\u7cfb\u5217\u5c0f\u8bf4\n\n        settings.MORE_INFORMATION = false   \/\/ \u8be6\u60c5\uff1a\u4e66\u7c4d\u7b80\u4ecb\u663e\u793a\u66f4\u591a\u4fe1\u606f\n        settings.SHOW_UPDATE_TIME = true    \/\/ \u76ee\u5f55\uff1a\u663e\u793a\u66f4\u65b0\u65f6\u95f4\uff0c\u4f46\u4f1a\u589e\u52a0\u5c11\u8bb8\u8bf7\u6c42\n        settings.SHOW_ORIGINAL_LINK = true  \/\/ \u76ee\u5f55\uff1a\u663e\u793a\u539f\u59cb\u94fe\u63a5\uff0c\u4f46\u4f1a\u589e\u52a0\u5927\u91cf\u8bf7\u6c42\n\n        settings.REPLACE_TITLE_MARKS = true \/\/ \u6b63\u6587\uff1a\u6ce8\u97f3\u5185\u5bb9\u4e3a\u6c49\u5b57\u65f6\uff0c\u66ff\u6362\u4e3a\u4e66\u540d\u53f7\n        settings.SHOW_CAPTIONS = true       \/\/ \u6b63\u6587\uff1a\u7ae0\u9996\u663e\u793a\u63cf\u8ff0\n        settings.SHOW_COMMENTS = true       \/\/ \u6b63\u6587\uff1a\u7ae0\u5c3e\u663e\u793a\u8bc4\u8bba\n\n        settings.IPDirect = false           \/\/ \u5168\u5c40\uff1a\u76f4\u8fde\u6a21\u5f0f\n        settings.FAST  = false              \/\/ \u5168\u5c40\uff1a\u5feb\u901f\u6a21\u5f0f\n        settings.DEBUG = false              \/\/ \u5168\u5c40\uff1a\u8c03\u8bd5\u6a21\u5f0f\n        java.log(\"\u2699\ufe0f \u4f7f\u7528\u9ed8\u8ba4\u8bbe\u7f6e\uff08\u65e0\u81ea\u5b9a\u4e49\u8bbe\u7f6e \u6216 \u81ea\u5b9a\u4e49\u8bbe\u7f6e\u6709\u8bef\uff09\")\n    }\n\n    if (settings.FAST) {\n        settings.SEARCH_AUTHOR = false        \/\/ \u641c\u7d22\uff1a\u9ed8\u8ba4\u641c\u7d22\u4f5c\u8005\u540d\u79f0\n        settings.CONVERT_CHINESE = false      \/\/ \u641c\u7d22\uff1a\u7e41\u7b80\u901a\u641c\n        settings.SHOW_UPDATE_TIME = false     \/\/ \u76ee\u5f55\uff1a\u663e\u793a\u7ae0\u8282\u66f4\u65b0\u65f6\u95f4\n        settings.SHOW_ORIGINAL_LINK = false   \/\/ \u76ee\u5f55\uff1a\u663e\u793a\u7ae0\u8282\u6e90\u94fe\u63a5\n        settings.SHOW_COMMENTS = false        \/\/ \u6b63\u6587\uff1a\u663e\u793a\u8bc4\u8bba\n    } else {\n        settings.FAST = false\n        settings.SEARCH_AUTHOR = true         \/\/ \u641c\u7d22\uff1a\u9ed8\u8ba4\u641c\u7d22\u4f5c\u8005\u540d\u79f0\n    }\n\n    if (settings.IPDirect) {\n        settings.SEARCH_AUTHOR = false       \/\/ \u641c\u7d22\uff1a\u9ed8\u8ba4\u5173\u95ed\u641c\u7d22\u4f5c\u8005\u540d\u79f0\n        settings.SHOW_ORIGINAL_LINK = false  \/\/ \u76ee\u5f55\uff1a\u4e0d\u663e\u793a\u7ae0\u8282\u6e90\u94fe\u63a5\n    } else {\n        settings.IPDirect = false\n        settings.SEARCH_AUTHOR = true        \/\/ \u641c\u7d22\uff1a\u9ed8\u8ba4\u5173\u95ed\u641c\u7d22\u4f5c\u8005\u540d\u79f0\n        settings.SHOW_ORIGINAL_LINK = true   \/\/ \u76ee\u5f55\uff1a\u4e0d\u663e\u793a\u7ae0\u8282\u6e90\u94fe\u63a5\n    }\n\n    u.settings = settings\n    putInCache(\"pixivSettings\", settings)  \/\/ \u8bbe\u7f6e\u5199\u5165\u7f13\u5b58\n\n    u.environment = {}\n    u.environment.IS_SOURCEREAD = isSourceRead()\n    u.environment.IS_LEGADO = !isSourceRead()\n    u.environment.IS_LYC_BRUNCH = isLegadoLYC()\n    u.environment.IS_BACKUP_SOURCE = isBackupSource()\n    putInCache(\"sourceEnvironment\", u.environment)  \/\/ \u8bbe\u7f6e\u5199\u5165\u7f13\u5b58\n\n    u.debugFunc = (func) => {\n        if (util.settings.DEBUG === true) {\n            func()\n        }\n    }\n\n    u.checkStatus = function(status) {\n        if (status === true) return \"\u2705 \u5df2\"\n        else if (status === false) return \"\u274c \u672a\"\n        else if (status === undefined) return \"\ud83c\ude1a\ufe0f \u65e0\u6570\u636e\uff1a\"\n    }\n\n    u.login = function() {\n        let resp = java.startBrowserAwait(`https:\/\/accounts.pixiv.net\/login,\n    {\"headers\": {\"User-Agent\": \"${java.getWebViewUA()}\"}}`, '\u767b\u5f55\u8d26\u53f7', false)\n        if (resp.code() === 200) {\n            this.getCsrfToken(); this.getCookie()\n        } else {\n            java.log(resp.code()); sleepToast(\"\u26a0\ufe0f \u767b\u5f55\u5931\u8d25\")\n        }\n    }\n\n    u.logout = function() {\n        this.removeCookie()\n        java.startBrowser(\"https:\/\/www.pixiv.net\/logout.php\", \"\u9000\u51fa\u8d26\u53f7\")\n        this.removeCookie()\n        sleepToast(`\u2705 \u5df2\u9000\u51fa\u5f53\u524d\u8d26\u53f7\\n\\n\u9000\u51fa\u540e\u8bf7\u70b9\u51fb\u53f3\u4e0a\u89d2\u7684 \u2714\ufe0f \u9000\u51fa\\n\\n\u767b\u5f55\u8bf7\u70b9\u51fb\u3010\u767b\u5f55\u8d26\u53f7\u3011\u8fdb\u884c\u767b\u5f55`)\n    }\n\n    u.getCookie = function() {\n        let pixivCookie = String(java.getCookie(\"https:\/\/www.pixiv.net\/\", null))\n        if (isLogin()) cache.put(\"pixivCookie\", pixivCookie, 60*60)  \/\/ \u7f13\u5b581h\n    }\n\n    u.removeCookie = function() {\n        cookie.removeCookie('https:\/\/www.pixiv.net')\n        cookie.removeCookie('https:\/\/accounts.pixiv.net')\n        cookie.removeCookie('https:\/\/accounts.google.com')\n        cookie.removeCookie('https:\/\/api.weibo.com')\n        cache.delete(\"pixivCookie\")\n        cache.delete(\"pixiv:uid\")\n        cache.delete(\"pixivCsrfToken\")  \/\/ \u4e0e\u767b\u5f55\u8bbe\u5907\u6709\u5173\n        cache.delete(\"headers\")\n    }\n\n    \/\/ \u83b7\u53d6 Csrf Token\uff0c\u4ee5\u4fbf\u8fdb\u884c\u6536\u85cf\u7b49\u8bf7\u6c42\n    \/\/ \u83b7\u53d6\u65b9\u6cd5\u6765\u81ea\u811a\u672c Pixiv Previewer\n    \/\/ https:\/\/github.com\/Ocrosoft\/PixivPreviewer\n    \/\/ https:\/\/greasyfork.org\/zh-CN\/scripts\/30766-pixiv-previewer\/code\n    u.getCsrfToken = function() {\n        let pixivCsrfToken = cache.get(\"pixivCsrfToken\")\n        if (!pixivCsrfToken) {\n            let html = java.webView(null, \"https:\/\/www.pixiv.net\/\", null)\n            try {\n                pixivCsrfToken = html.match(\/token\\\\\":\\\\\"([a-z0-9]{32})\/)[1]\n                cache.put(\"pixivCsrfToken\", pixivCsrfToken)  \/\/ \u4e0e\u767b\u5f55\u8bbe\u5907\u6709\u5173\uff0c\u65e0\u6cd5\u5b58\u50a8 nul\n            } catch (e) {\n                pixivCsrfToken = null\n                cache.delete(\"pixivCsrfToken\")  \/\/ \u4e0e\u767b\u5f55\u8bbe\u5907\u6709\u5173\uff0c\u65e0\u6cd5\u5b58\u50a8 nul\n                \/\/ sleepToast(\"\u26a0\ufe0f \u672a\u767b\u5f55\u8d26\u53f7(pixivCsrfToken)\")\n            }\n            java.log(`pixivCsrfToken:\\n${pixivCsrfToken}`)\n        }\n        return pixivCsrfToken\n    }\n\n    \/\/ \u5c06\u591a\u4e2a\u957f\u7bc7\u5c0f\u8bf4\u89e3\u6790\u4e3a\u4e00\u672c\u4e66\n    u.combineNovels = function(novels) {\n        return novels.filter(novel => {\n            \/\/ \u5355\u672c\u76f4\u63a5\u89e3\u6790\u4e3a\u4e00\u672c\u4e66\n            if (novel.seriesId === undefined || novel.seriesId === null) {\n                return true\n            }\n            \/\/ \u96c6\u5408\u4e2d\u6ca1\u6709\u8be5\u7cfb\u5217\u89e3\u6790\u4e3a\u4e00\u672c\u4e66\n            if (!seriesSet.has(novel.seriesId)) {\n                seriesSet.add(novel.seriesId)\n                return true\n            }\n            return false\n        })\n    }\n\n    \/\/ \u5c4f\u853d\u4f5c\u8005\n    u.authorFilter = function(novels) {\n        let authors = getFromCache(\"blockAuthorList\")\n        if (authors !== null && authors.length >= 0) {\n            java.log(`\ud83d\udeab \u5c4f\u853d\u4f5c\u8005ID\uff1a${JSON.stringify(authors)}`)\n            authors.forEach(author => {\n                novels = novels.filter(novel => novel.userId !== String(author))\n            })\n        }\n        return novels\n    }\n\n\n    \/\/ \u8fc7\u6ee4\u6536\u85cf\u4e0e\u8ffd\u66f4\n    u.novelFilter = function(novels) {\n        let novels1 = [], novels2 = [], msg\n        let likeNovels = getFromCache(\"likeNovels\")\n        let watchedSeries = getFromCache(\"watchedSeries\")\n        let novels0 = novels.map(novel => novel.id)\n\n        msg = util.checkStatus(util.settings.SHOW_LIKE_NOVELS).replace(\"\u672a\",\"\u4e0d\")\n        java.log(`${msg}\u663e\u793a\u6536\u85cf\u5c0f\u8bf4`)\n        if (util.settings.SHOW_LIKE_NOVELS === false) {\n            novels = novels.filter(novel => !likeNovels.includes(Number(novel.id)))\n            novels1 = novels.map(novel => novel.id)\n            java.log(`\u23ec \u8fc7\u6ee4\u6536\u85cf\uff1a\u8fc7\u6ee4\u524d${novels0.length}\uff1b\u8fc7\u6ee4\u540e${novels1.length}`)\n        }\n\n        msg = util.checkStatus(util.settings.SHOW_WATCHED_SERIES).replace(\"\u672a\",\"\u4e0d\")\n        java.log(`${msg}\u663e\u793a\u8ffd\u66f4\u7cfb\u5217`)\n        if (util.settings.SHOW_WATCHED_SERIES === false) {\n            novels = novels.filter(novel => !watchedSeries.includes(Number(novel.seriesId)))\n            novels2 = novels.map(novel => novel.id)\n            if (novels1.length >= 1) novels0 = novels1\n            java.log(`\u23ec \u8fc7\u6ee4\u8ffd\u66f4\uff1a\u8fc7\u6ee4\u524d${novels0.length}\uff1b\u8fc7\u6ee4\u540e${novels2.length}`)\n        }\n\n        let novels3 = novels.map(novel => novel.id)\n        if (novels0.length >= 1 && novels3.length === 0) {\n            let msg = `\u23ec \u8fc7\u6ee4\u5c0f\u8bf4\\n\u26a0\ufe0f \u8fc7\u6ee4\u540e\u65e0\u7ed3\u679c\\n\\n\u8bf7\u6839\u636e\u9700\u8981\\n`\n            if (util.settings.SHOW_LIKE_NOVELS === false) msg += \"\u5f00\u542f\u663e\u793a\u6536\u85cf\u5c0f\u8bf4\\n\"\n            if (util.settings.SHOW_WATCHED_SERIES === false) msg += \"\u5f00\u542f\u663e\u793a\u8ffd\u66f4\u7cfb\u5217\"\n            sleepToast(msg, 1)\n        }\n\n        util.debugFunc(() => {\n            \/\/ java.log(JSON.stringify(novels0))\n            java.log(JSON.stringify(novels0.length))\n            \/\/ java.log(JSON.stringify(novels1))\n            java.log(JSON.stringify(novels1.length))\n            \/\/ java.log(JSON.stringify(novels2))\n            java.log(JSON.stringify(novels2.length))\n        })\n        return novels\n    }\n\n    \/\/ \u8fc7\u6ee4\u63cf\u8ff0\u4e0e\u6807\u7b7e\uff08\u5c4f\u853d\u6807\u7b7e\/\u5c4f\u853d\u63cf\u8ff0\uff09\n    u.novelFilter2 = function(novels) {\n        let novels0 = novels.map(novel => novel.id)\n        let captionBlockWords = getFromCache(\"captionBlockWords\")\n        if (captionBlockWords === null) captionBlockWords = []\n        if (captionBlockWords) {\n            \/\/ \u4ec5\u4fdd\u7559\u6ca1\u6709\u4efb\u4f55\u5c4f\u853d\u8bcd\u7684\u5c0f\u8bf4\n            \/\/ novels = novels.filter(novel => {\n            \/\/     return !captionBlockWords.some(item => {\n            \/\/         if (novel.description !== undefined) return novel.description.includes(item)\n            \/\/     })\n            \/\/ })\n            novels = novels.filter(novel => !captionBlockWords.some(item => novel.description.includes(item)))\n            let novels2 = novels.map(novel => novel.id)\n            java.log(`\ud83d\udeab \u5c4f\u853d\u63cf\u8ff0\uff1a${captionBlockWords.join(\"\\n\")}`)\n            java.log(`\ud83d\udeab \u5c4f\u853d\u63cf\u8ff0\uff1a\u8fc7\u6ee4\u524d${novels0.length}\uff1b\u8fc7\u6ee4\u540e${novels2.length}`)\n        }\n\n        let tagsBlockWords = getFromCache(\"tagsBlockWords\")\n        if (tagsBlockWords === null) tagsBlockWords = []\n        if (tagsBlockWords) {\n            \/\/ \u4ec5\u4fdd\u7559\u6ca1\u6709\u4efb\u4f55\u5c4f\u853d\u8bcd\u7684\u5c0f\u8bf4\n            \/\/ novels = novels.filter(novel => {\n            \/\/     return !tagsBlockWords.some(item => {\n            \/\/         if (novel.tags !== undefined) return novel.tags.includes(item)\n            \/\/     })\n            \/\/ })\n            novels = novels.filter(novel => !tagsBlockWords.some(item => novel.tags.includes(item)))\n            let novels2 = novels.map(novel => novel.id)\n            java.log(`\ud83d\udeab \u5c4f\u853d\u6807\u7b7e\uff1a${tagsBlockWords.join(\"\u3001\")}`)\n            java.log(`\ud83d\udeab \u5c4f\u853d\u6807\u7b7e\uff1a\u8fc7\u6ee4\u524d${novels0.length}\uff1b\u8fc7\u6ee4\u540e${novels2.length}`)\n        }\n        return novels\n    }\n\n    \/\/ \u6536\u85cf\u5c0f\u8bf4\/\u8ffd\u66f4\u7cfb\u5217 \u5199\u5165\u7f13\u5b58\n    u.saveNovels = function(listInCacheName, list) {\n        let listInCache = getFromCache(listInCacheName)\n        if (listInCache === null) listInCache = []\n\n        listInCache = listInCache.concat(list)\n        listInCache = Array.from(new Set(listInCache))\n        cache.put(listInCacheName, JSON.stringify(listInCache))\n\n        if (listInCacheName === \"likeNovels\") listInCacheName = \"\u2764\ufe0f \u6536\u85cf\u5c0f\u8bf4ID\"\n        else if (listInCacheName === \"watchedSeries\") listInCacheName = \"\ud83d\udcc3 \u8ffd\u66f4\u7cfb\u5217ID\"\n        java.log(`${listInCacheName}\uff1a${JSON.stringify(listInCache)}`)\n    }\n\n    \/\/ \u5904\u7406 novels \u5217\u8868\n    u.handNovels = function(novels) {\n        let likeNovels = [], watchedSeries = []\n        novels = util.authorFilter(novels)\n        novels.forEach(novel => {\n            \/\/ novel.id = novel.id\n            \/\/ novel.title = novel.title\n            \/\/ novel.userName = novel.userName\n            \/\/ novel.userId = novel.userId\n            \/\/ novel.tags = novel.tags\n            cache.put(`${novel.userName}`, novel.userId)  \/\/ \u52a0\u5165\u7f13\u5b58\uff0c\u4fbf\u4e8e\u641c\u7d22\u4f5c\u8005\n            if (novel.tags === undefined || novel.tags === null) {\n                novel.tags = []\n            }\n            \/\/ \u641c\u7d22\u5355\u7bc7\n            if (novel.isOneshot === undefined) {\n                \/\/ novel.seriesId = novel.seriesId\n                \/\/ novel.seriesTitle = novel.seriesTitle\n                \/\/ novel.textCount = novel.textCount\n                \/\/ novel.description = novel.description\n                novel.coverUrl = novel.url\n                \/\/ novel.createDate = novel.createDate\n                \/\/ novel.updateDate = novel.updateDate\n            }\n\n            \/\/ \u641c\u7d22\u7cfb\u5217\n            if (novel.isOneshot !== undefined) {\n                if (novel.isOneshot === true) {\n                    novel.seriesId = undefined\n                    novel.id = novel.novelId  \/\/ \u83b7\u53d6\u771f\u6b63\u7684 novelId\n                    novel.seriesTitle = undefined\n                } else {\n                    novel.seriesId = novel.id\n                    novel.id = novel.novelId = novel.latestEpisodeId  \/\/ \u83b7\u53d6\u771f\u6b63\u7684 novelId\n                    novel.seriesTitle = novel.title\n                    \/\/ novel.isWatched = novel.isWatched  \/\/ \u641c\u7d22\u7cfb\u5217\u53ef\u83b7\u53d6\n                }\n                novel.textCount = novel.textLength\n                novel.description = novel.caption\n                novel.coverUrl = novel.cover.urls[\"480mw\"]\n                novel.createDate = novel.createDateTime\n                novel.updateDate = novel.updateDateTime\n            }\n\n            \/\/ \u5355\u7bc7\u6b63\u6587\u8be6\u60c5\u9875\n            if (novel.content) {\n                novel.novelId = novel.id\n                novel.tags = novel.tags.tags.map(item => item.tag)\n                novel.textCount = novel.userNovels[`${novel.id}`].textCount\n                \/\/ novel.latestChapter = novel.title\n                \/\/ novel.description = novel.description\n                novel.coverUrl = novel.userNovels[`${novel.id}`].url\n                \/\/ novel.createDate = novel.createDate\n                novel.updateDate = novel.uploadDate\n\n                if (novel.seriesNavData) {\n                    novel.seriesId = novel.seriesNavData.seriesId\n                    novel.seriesTitle = novel.seriesNavData.title\n                }\n            }\n\n            \/\/ \u7cfb\u5217\u8be6\u60c5\n            if (novel.firstNovelId) {\n                novel.seriesId = novel.id\n                novel.id = novel.novelId = novel.firstNovelId\n                novel.seriesTitle = novel.title\n                novel.coverUrl = novel.cover.urls[\"480mw\"]\n                \/\/ novel.isWatched = novel.isWatched  \/\/ \u641c\u7d22\u7cfb\u5217\u53ef\u83b7\u53d6\n            }\n\n            \/\/ \u5355\u7bc7\u52a0\u66f4\u591a\u4fe1\u606f\n            if (!novel.seriesId) {\n                novel.tags.unshift(\"\u5355\u672c\")\n                novel.latestChapter = novel.title\n                novel.detailedUrl = urlIP(urlNovelDetailed(novel.id))\n                novel.total = 1\n                if (novel.bookmarkData) {\n                    novel.isBookmark = true\n                    cache.put(`collect${novel.id}`, novel.bookmarkData.id)\n                    likeNovels.push(Number(novel.id))\n                } else {\n                    novel.isBookmark = false\n                }\n            }\n            \/\/ \u7cfb\u5217\u6dfb\u52a0\u66f4\u591a\u4fe1\u606f\n            if (novel.seriesId) {\n                let series = getAjaxJson(urlIP(urlSeriesDetailed(novel.seriesId))).body\n                novel.id = series.firstNovelId\n                novel.title = series.title\n                novel.tags = novel.tags.concat(series.tags)\n                novel.tags.unshift(\"\u957f\u7bc7\")\n                novel.textCount = series.publishedTotalCharacterCount\n                novel.description = series.caption\n                novel.coverUrl = series.cover.urls[\"480mw\"]\n                novel.detailedUrl = urlIP(urlSeriesDetailed(novel.seriesId))\n                novel.createDate = series.createDate\n                novel.updateDate = series.updateDate\n                novel.total = series.publishedContentCount\n                novel.isWatched = series.isWatched\n                if (novel.isWatched === true) {\n                    watchedSeries.push(Number(novel.seriesId))\n                }\n\n                \/\/ \u9632\u6b62\u7cfb\u5217\u9996\u7bc7\u65e0\u6743\u9650\u83b7\u53d6\n                \/\/ \u53d1\u9001\u8bf7\u6c42\u83b7\u53d6\u7b2c\u4e00\u7ae0 \u83b7\u53d6\u6807\u7b7e\u4e0e\u7b80\u4ecb\n                let firstNovel = {}\n                try {\n                    firstNovel = getAjaxJson(urlIP(urlSeriesNovels(novel.seriesId, 30, 0))).body.thumbnails.novel[0]\n                    novel.id = novel.firstNovelId = firstNovel.id\n                    novel.tags = novel.tags.concat(firstNovel.tags)\n                } catch (e) { \/\/ \u9632\u6b62\u7cfb\u5217\u9996\u7bc7\u65e0\u6743\u9650\u83b7\u53d6\n                    firstNovel = {}\n                    firstNovel.description = \"\"\n                }\n                novel.tags.unshift(\"\u957f\u7bc7\")\n                if (novel.description === \"\") {\n                    novel.description = firstNovel.description\n                }\n            }\n        })\n        \/\/ \u6536\u85cf\u5c0f\u8bf4\/\u8ffd\u66f4\u7cfb\u5217 \u5199\u5165\u7f13\u5b58\n        util.saveNovels(\"likeNovels\", likeNovels)\n        util.saveNovels(\"watchedSeries\", watchedSeries)\n        util.debugFunc(() => {\n            java.log(`\u5904\u7406\u5c0f\u8bf4\u5b8c\u6210`)\n        })\n        return novels\n    }\n\n    \/\/ \u5c0f\u8bf4\u4fe1\u606f\u683c\u5f0f\u5316\n    u.formatNovels = function(novels) {\n        novels = util.novelFilter(novels)\n        novels.forEach(novel => {\n            if (novel.title) novel.title = novel.title.trim()\n            if (!novel.userName.startsWith(\"@\")) novel.userName = `@${novel.userName}`\n            novel.coverUrl = urlCoverUrl(novel.coverUrl)\n            novel.readingTime = `${novel.readingTime \/ 60} \u5206\u949f`\n            novel.createDate = dateFormat(novel.createDate)\n            novel.updateDate = dateFormat(novel.updateDate)\n\n            novel.tags2 = []\n            for (let i in novel.tags) {\n                let tag = novel.tags[i]\n                if (tag.includes(\"\/\")) {\n                    let tags = tag.split(\"\/\")\n                    novel.tags2 = novel.tags2.concat(tags)\n                } else {\n                    novel.tags2.push(tag)\n                }\n            }\n            novel.tags = Array.from(new Set(novel.tags2))\n            novel.tags = novel.tags.join(\",\")\n            if (novel.seriesId) {\n                collectMsg = `\ud83d\udcc3 \u8ffd\u66f4\uff1a${util.checkStatus(novel.isWatched)}\u8ffd\u66f4\u7cfb\u5217`\n            } else {\n                collectMsg = `\u2764\ufe0f \u6536\u85cf\uff1a${util.checkStatus(novel.isBookmark)}\u52a0\u5165\u6536\u85cf`\n            }\n\n            if (util.settings.MORE_INFORMATION) {\n                novel.description = `\\n\ud83c\udd7f\ufe0f \u767b\u5f55\uff1a${util.checkStatus(isLogin())}\u767b\u5f55\u8d26\u53f7\n                ${collectMsg}\\n\ud83d\udcd6 \u4e66\u540d\uff1a${novel.title}\\n\ud83d\udc64 \u4f5c\u8005\uff1a${novel.userName}\n                #\ufe0f \u6807\u7b7e\uff1a${novel.tags}\\n\u2b06\ufe0f \u4e0a\u4f20\uff1a${novel.createDate}\n                \ud83d\udd04 \u66f4\u65b0\uff1a${novel.updateDate}\\n\ud83d\udcc4 \u7b80\u4ecb\uff1a${novel.description}`\n            } else {\n                novel.description = `\\n\ud83c\udd7f\ufe0f \u767b\u5f55\uff1a${util.checkStatus(isLogin())}\u767b\u5f55\u8d26\u53f7\n                ${collectMsg}\\n\u2b06\ufe0f \u4e0a\u4f20\uff1a${novel.createDate}\\n\ud83d\udd04 \u66f4\u65b0\uff1a${novel.updateDate}\n                \ud83d\udcc4 \u7b80\u4ecb\uff1a${novel.description}`\n            }\n        })\n        novels = util.novelFilter2(novels)\n        return novels\n    }\n\n    \/\/ \u6b63\u6587\uff0c\u8be6\u60c5\uff0c\u641c\u7d22\uff1a\u4ece\u7f51\u5740\u83b7\u53d6id\uff0c\u8fd4\u56de\u5355\u7bc7\u5c0f\u8bf4 res\uff0c\u7cfb\u5217\u8fd4\u56de\u9996\u7bc7\u5c0f\u8bf4 res\n    \/\/ pixiv \u9ed8\u8ba4\u5206\u4eab\u4fe1\u606f\u4e2d\u6709#\u53f7\uff0c\u4e0d\u4f1a\u88ab\u8bc6\u522b\u6210\u94fe\u63a5\uff0c\u65e0\u6cd5\u4f7f\u7528\u6dfb\u52a0\u7f51\u5740\n    u.getNovelResFirst = function(result) {\n        let novelId = 0, res = {\"body\": {}}\n        let isJson = isJsonString(result)\n        let isHtml = isHtmlString(result)\n\n        if (!isJson && isHtml) {\n            let id = baseUrl.match(new RegExp(\"\\\\d+\"))[0]\n            let pattern = \"(https?:\/\/)?(www\\\\.)?pixiv\\\\.net(\/ajax)?\/users?\/\\\\d+\"\n            let isAuthor = baseUrl.match(new RegExp(pattern))\n            if (isAuthor) {\n                java.log(`\u4f5c\u8005ID\uff1a${id}`)\n                novelId = Object.keys(getAjaxJson(urlIP(urlUserWorkLatest(id))).body.novels).reverse()[0]\n            }\n\n            pattern = \"(https?:\/\/)?(www\\\\.)?pixiv\\\\.net\/novel\/series\/\\\\d+\"\n            let isSeries = baseUrl.match(new RegExp(pattern))\n            if (isSeries) {\n                java.log(`\u7cfb\u5217ID\uff1a${id}`)\n                novelId = getAjaxJson(urlIP(urlSeriesNovels(id, 30, 0))).body.thumbnails.novel[0].id\n            } else {\n                let pattern = \"(https?:\/\/)?(www\\\\.)?pixiv\\\\.net\/novel\/(show\\\\.php\\\\?id=)?\\\\d+\"\n                let isNovel = baseUrl.match(new RegExp(pattern))\n                if (isNovel) {\n                    novelId = id\n                }\n            }\n        }\n        if (isJson) {\n            res = JSON.parse(result)\n        }\n\n        if (novelId) {\n            java.log(`\u5339\u914d\u5c0f\u8bf4ID\uff1a${novelId}`)\n            res = getAjaxJson(urlIP(urlNovelDetailed(novelId)))\n        }\n        if (res.error === true) {\n            java.log(`\u65e0\u6cd5\u4ece Pixiv \u83b7\u53d6\u5f53\u524d\u5c0f\u8bf4`)\n            java.log(JSON.stringify(res))\n        }\n        return res.body\n    }\n\n    \/\/ \u76ee\u5f55\uff1a\u4ece\u7f51\u5740\u83b7\u53d6id\uff0c\u5c3d\u53ef\u80fd\u8fd4\u56de\u7cfb\u5217 res\uff0c\u5355\u7bc7\u5c0f\u8bf4\u8fd4\u56de\u5c0f\u8bf4 res\n    u.getNovelResSeries = function(result) {\n        let seriesId = 0, res = {\"body\": {}}\n        let isJson = isJsonString(result)\n        let isHtml = isHtmlString(result)\n\n        if (!isJson && isHtml) {\n            let id = baseUrl.match(new RegExp(\"\\\\d+\"))[0]\n            let pattern = \"(https?:\/\/)?(www\\\\.)?pixiv\\\\.net\/novel\/series\/\\\\d+\"\n            let isSeries = baseUrl.match(new RegExp(pattern))\n            if (isSeries) {\n                seriesId = id\n            } else {\n                let pattern = \"(https?:\/\/)?(www\\\\.)?pixiv\\\\.net\/novel\/(show\\\\.php\\\\?id=)?\\\\d+\"\n                let isNovel = baseUrl.match(new RegExp(pattern))\n                if (isNovel) {\n                    java.log(`\u5339\u914d\u5c0f\u8bf4ID\uff1a${id}`)\n                    res = getAjaxJson(urlIP(urlNovelDetailed(id)))\n                }\n            }\n        }\n        if (isJson) {\n            res = JSON.parse(result)\n        }\n\n        if (res.body && res.body.seriesNavData) {\n            seriesId = res.body.seriesNavData.seriesId\n        }\n        if (seriesId) {\n            java.log(`\u7cfb\u5217ID\uff1a${seriesId}`)\n            res = getAjaxJson(urlIP(urlSeriesDetailed(seriesId)))\n        }\n        if (res.error === true) {\n            java.log(`\u65e0\u6cd5\u4ece Pixiv \u83b7\u53d6\u5f53\u524d\u5c0f\u8bf4`)\n            java.log(JSON.stringify(res))\n        }\n        return res.body\n    }\n\n    util = u\n    java.put(\"util\", objStringify(u))\n}\n\nfunction checkMessageThread(checkTimes) {\n    if (checkTimes === undefined) {\n        checkTimes = Number(cache.get(\"checkTimes\"))\n    }\n    if (checkTimes === 0 && isLogin()) {\n        let latestMsg = getAjaxJson(urlIP(urlMessageThreadLatest(5)))\n        if (latestMsg.error === true) {\n            java.log(JSON.stringify(latestMsg))\n        } else if (latestMsg.body.total >= 1) {\n            let msg = latestMsg.body.message_threads.filter(item => item.thread_name === \"pixiv\u4e8b\u52d9\u5c40\")[0]\n            if (msg && new Date().getTime()- 1000*msg.modified_at <= 3*24*60*60*1000) { \/\/ 3\u5929\u5185\u8fdb\u884c\u63d0\u793a\n                sleepToast(`\u60a8\u4e8e ${timeFormat(1000*msg.modified_at)} \u89e6\u53d1 Pixiv \u3010\u8fc7\u5ea6\u8bbf\u95ee\u3011\uff0c\u8bf7\u4fee\u6539\u5bc6\u7801\u5e76\u91cd\u65b0\u767b\u5f55\u3002\\n\u5982\u5df2\u4fee\u6539\u8bf7\u5ffd\u7565`, 3)\n                sleepToast(`${msg.latest_content}`, 5)\n                java.startBrowser(\"https:\/\/accounts.pixiv.net\/password\/change\",'\u4fee\u6539\u5bc6\u7801')\n            }\n        }\n    }\n    cache.put(\"checkTimes\", checkTimes + 1, 4*60*60)  \/\/ \u7f13\u5b584h\uff0c\u6bcf4h\u63d0\u9192\u4e00\u6b21\n    \/\/ cache.put(\"checkTimes\", checkTimes + 1, 60)  \/\/ \u6d4b\u8bd5\u7528\uff0c\u7f13\u5b5860s\uff0c\u6bcf\u5206\u949f\u63d0\u9192\u4e00\u6b21\n    \/\/ java.log(checkTimes + 1)\n}\n\n\/\/ \u83b7\u53d6\u8bf7\u6c42\u7684user id\u65b9\u4fbf\u5176\u4ed6ajax\u8bf7\u6c42\u6784\u9020\nfunction getPixivUid() {\n    let uid = cache.get(\"pixiv:uid\")\n    if (!uid || String(uid) === \"null\") {\n        let html = java.webView(null, \"https:\/\/www.pixiv.net\/\", null)\n        try {\n            uid = html.match(\/user_id:'(\\d+)'\/)[1]\n        } catch (e) {\n            uid = null\n        }\n        cache.put(\"pixiv:uid\", String(uid))\n    }\n}\n\nfunction getHeaders() {\n    let headers = {\n        \"accept\": \"application\/json\",\n        \"accept-encoding\": \"gzip, deflate, br, zstd\",\n        \"accept-language\": \"zh-CN\",\n        \/\/ \"content-type\": \"application\/json; charset=utf-8\",\n        \/\/ \"content-type\": \"application\/x-www-form-urlencoded; charset=utf-8\",\n        \"origin\": \"https\/\/www.pixiv.net\",\n        \"referer\": \"https:\/\/www.pixiv.net\/\",\n        \/\/ \"sec-ch-ua\": `\"Not\/A)Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"`,\n        \/\/ \"sec-ch-ua-mobile\": \"?0\",\n        \/\/ \"sec-ch-ua-platform\": \"Windows\",\n        \/\/ \"sec-fetch-dest\": \"empty\",\n        \/\/ \"sec-fetch-mode\": \"cors\",\n        \/\/ \"sec-fetch-site\": \"same-origin\",\n        \"user-agent\": cache.get(\"userAgent\"),\n        \"x-csrf-token\": cache.get(\"pixivCsrfToken\"),\n        \"Cookie\": cache.get(\"pixivCookie\")\n    }\n    putInCache(\"headers\", headers)\n    return headers\n}\n\npublicFunc()\nif (result.code() === 200) {\n    getPixivUid(); getWebViewUA(); util.getCookie(); util.getCsrfToken(); getHeaders()\n    if (!util.settings.FAST) checkMessageThread()   \/\/ \u68c0\u6d4b\u8fc7\u5ea6\u8bbf\u95ee\n}\n\nutil.debugFunc(() => {\n    java.log(`DEBUG = ${util.settings.DEBUG}\\n`)\n    java.log(JSON.stringify(util.settings, null, 4))\n    java.log(`${getWebViewUA()}\\n`)\n    java.log(`${cache.get(\"pixivCsrfToken\")}\\n`)\n    java.log(`${cache.get(\"pixivCookie\")}\\n`)\n    java.log(`${cache.get(\"headers\")}\\n`)\n})\n\njava.getStrResponse(null, null)","loginUi":"[\n    {\n        \"name\": \"\\uD83C\\uDD7F\ufe0f \u767b\u5f55\u8d26\u53f7\",\n        \"type\": \"button\",\n        \"action\": \"login()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\u2699\ufe0f \u8d26\u53f7\u8bbe\u7f6e\",\n        \"type\": \"button\",\n        \"action\": \"startPixivSettings()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\\uD83D\\uDD19 \u9000\u51fa\u8d26\u53f7\",\n        \"type\": \"button\",\n        \"action\": \"logout()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\ud83c\udd99 \u66f4\u65b0\u4e66\u6e90\",\n        \"type\": \"button\",\n        \"action\": \"updateSource()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\\uD83D\\uDD30 \u4f7f\u7528\u6307\u5357\",\n        \"type\": \"button\",\n        \"action\": \"startGithubReadme()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\u2708\\uFE0F \u76f4\u8fde\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"editSettings('IPDirect')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\u2764\ufe0f \u516c\u5f00\u6536\u85cf\",\n        \"type\": \"button\",\n        \"action\": \"novelBookmarkFactory(1)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\\uD83D\\uDCC3 \u8ffd\u66f4\u7cfb\u5217\",\n        \"type\": \"button\",\n        \"action\": \"seriesWatchFactory()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\u2764\ufe0f \u6536\u85cf\u7cfb\u5217\",\n        \"type\": \"button\",\n        \"action\": \"novelsBookmarkAdd()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\\uD83D\\uDDA4 \u53d6\u6d88\u6536\u85cf\",\n        \"type\": \"button\",\n        \"action\": \"novelsBookmarkDelete()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\u2b50\ufe0f \u5173\u6ce8\u4f5c\u8005\",\n        \"type\": \"button\",\n        \"action\": \"userFollowFactory()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\\uD83D\\uDEAB \u5c4f\u853d\u4f5c\u8005\",\n        \"type\": \"button\",\n        \"action\": \"userBlock()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n\n    {\n        \"name\": \"\u8f93\u5165\u5185\u5bb9\",\n        \"type\": \"text\"\n    },\n    {\n        \"name\": \"\u2705 \u53d1\u9001\u8bc4\u8bba\",\n        \"type\": \"button\",\n        \"action\": \"novelCommentAdd()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\\uD83D\\uDDD1 \u5220\u9664\u8bc4\u8bba\",\n        \"type\": \"button\",\n        \"action\": \"novelCommentDelete()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\\uD83E\\uDDF9 \u6e05\u9664\u7f13\u5b58\",\n        \"type\": \"button\",\n        \"action\": \"cleanCache()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n\n    {\n        \"name\": \"\\uD83D\\uDEAB \u6dfb\u52a0\u5c4f\u853d\",\n        \"type\": \"button\",\n        \"action\": \"blockAddFactory()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\u2b55\ufe0f \u5220\u9664\u5c4f\u853d\",\n        \"type\": \"button\",\n        \"action\": \"blockDeleteFactory()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\\uD83D\\uDC40 \u67e5\u770b\u5c4f\u853d\",\n        \"type\": \"button\",\n        \"action\": \"blockShowFactory()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n\n    {\n        \"name\": \"\\uD83D\\uDCCC \u559c\u6b22\u6807\u7b7e\",\n        \"type\": \"button\",\n        \"action\": \"likeTagsAdd()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\\uD83D\\uDDD1 \u5220\u9664\u6807\u7b7e\",\n        \"type\": \"button\",\n        \"action\": \"likeTagsDelete()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\\uD83D\\uDC40 \u67e5\u770b\u6807\u7b7e\",\n        \"type\": \"button\",\n        \"action\": \"likeTagsShow()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n\n    {\n        \"name\": \"\u2764\ufe0f \u4ed6\u4eba\u6536\u85cf\",\n        \"type\": \"button\",\n        \"action\": \"likeAuthorsAdd()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\\uD83D\\uDDA4 \u53d6\u6d88\u6536\u85cf\",\n        \"type\": \"button\",\n        \"action\": \"likeAuthorsDelete()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\\uD83D\\uDC40 \u67e5\u770b\u6536\u85cf\",\n        \"type\": \"button\",\n        \"action\": \"likeAuthorsShow()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n\n    {\n        \"name\": \"\u4e66\u6e90\u8bbe\u7f6e\",\n        \"type\": \"text\"\n    },\n    {\n        \"name\": \"\u2699\ufe0f \u5f53\u524d\u8bbe\u7f6e\",\n        \"type\": \"button\",\n        \"action\": \"showSettings()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\\uD83D\\uDD27 \u9ed8\u8ba4\u8bbe\u7f6e\",\n        \"type\": \"button\",\n        \"action\": \"editSettings('')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\\uD83D\\uDC64 \u641c\u7d22\u4f5c\u8005\",\n        \"type\": \"button\",\n        \"action\": \"editSettings('SEARCH_AUTHOR')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\\uD83C\\uDC04 \u7e41\u7b80\u901a\u641c\",\n        \"type\": \"button\",\n        \"action\": \"editSettings('CONVERT_CHINESE')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\\uD83D\\uDCD6 \u66f4\u591a\u7b80\u4ecb\",\n        \"type\": \"button\",\n        \"action\": \"editSettings('MORE_INFORMATION')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\\uD83D\\uDCC5 \u66f4\u65b0\u65f6\u95f4\",\n        \"type\": \"button\",\n        \"action\": \"editSettings('SHOW_UPDATE_TIME')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\\uD83D\\uDD17 \u539f\u59cb\u94fe\u63a5\",\n        \"type\": \"button\",\n        \"action\": \"editSettings('SHOW_ORIGINAL_LINK')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\\uD83D\\uDCDA \u6062\u590d\u300a\u300b\",\n        \"type\": \"button\",\n        \"action\": \"editSettings('REPLACE_TITLE_MARKS')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\\uD83D\\uDDBC\ufe0f \u663e\u793a\u63cf\u8ff0\",\n        \"type\": \"button\",\n        \"action\": \"editSettings('SHOW_CAPTIONS')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\\uD83D\\uDCAC \u663e\u793a\u8bc4\u8bba\",\n        \"type\": \"button\",\n        \"action\": \"editSettings('SHOW_COMMENTS')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\u2764\ufe0f \u663e\u793a\u6536\u85cf\",\n        \"type\": \"button\",\n        \"action\": \"editSettings('SHOW_LIKE_NOVELS')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\\uD83D\\uDCC3 \u663e\u793a\u8ffd\u66f4\",\n        \"type\": \"button\",\n        \"action\": \"editSettings('SHOW_WATCHED_SERIES')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\u23e9 \u5feb\u901f\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"editSettings('FAST')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\\uD83D\\uDC1E \u8c03\u8bd5\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"editSettings('DEBUG')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\\uD83D\\uDD0D \u641c\u7d22\u8bf4\u660e\",\n        \"type\": \"button\",\n        \"action\": \"readMeSearch()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\\uD83D\\uDCC4 \u641c\u7d22\u9875\u7801\",\n        \"type\": \"button\",\n        \"action\": \"showMaxPages()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\u23eb \u589e\u52a0\u9875\u7801\",\n        \"type\": \"button\",\n        \"action\": \"editMaxPages('add')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"\u23ec \u51cf\u5c11\u9875\u7801\",\n        \"type\": \"button\",\n        \"action\": \"editMaxPages('minus')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    }\n]","loginUrl":"function login() {\n    sleepToast(\"\ud83d\udd04 \u6b63\u5728\u68c0\u6d4b\u767b\u9646\u72b6\u6001\uff0c\u8bf7\u7a0d\u5019\")\n    if (isLogin()) {\n        sleepToast(\"\ufe0f\ud83c\udd7f\ufe0f \u767b\u5f55\u8d26\u53f7\\n\u2705 \u5df2\u7ecf\u767b\u5f55\u8fc7\u8d26\u53f7\u4e86\\n\\n\u53ef\u4ee5\u70b9\u51fb\u3010\ud83d\udd19 \u9000\u51fa\u8d26\u53f7\u3011\u6765\u5207\u6362\u8d26\u53f7\")\n        return false\n    }\n\n    let resp = java.startBrowserAwait(`https:\/\/accounts.pixiv.net\/login,\n    {\"headers\": {\"User-Agent\": ${getWebViewUA()}}}`, '\u767b\u5f55\u8d26\u53f7', false)\n    if (resp.code() === 200) {\n        getCsrfToken(); getCookie()\n        return true\n    } else {\n        java.log(resp.code()); sleepToast(\"\ud83c\udd7f\ufe0f \u767b\u5f55\u8d26\u53f7\\n\\n\u26a0\ufe0f \u767b\u5f55\u5931\u8d25\")\n        return false\n    }\n}\n\nfunction logout() {\n    removeCookie()\n    java.startBrowser(\"https:\/\/www.pixiv.net\/logout.php\", \"\u9000\u51fa\u8d26\u53f7\")\n    removeCookie(); removeLikeDataCache(); removeSettingsCache()\n    sleepToast(`\u2705 \u5df2\u9000\u51fa\u5f53\u524d\u8d26\u53f7\\n\\n\u9000\u51fa\u540e\u8bf7\u70b9\u51fb\u53f3\u4e0a\u89d2\u7684 \u2714\ufe0f \u9000\u51fa\\n\\n\u767b\u5f55\u8bf7\u70b9\u51fb\u3010\u767b\u5f55\u8d26\u53f7\u3011\u8fdb\u884c\u767b\u5f55`)\n}\n\nfunction removeCookie() {\n    cookie.removeCookie('https:\/\/www.pixiv.net')\n    cookie.removeCookie('https:\/\/accounts.pixiv.net')\n    cookie.removeCookie('https:\/\/accounts.google.com')\n    cookie.removeCookie('https:\/\/api.weibo.com')\n    cache.delete(\"pixivCookie\")\n    cache.delete(\"pixiv:uid\")\n    cache.delete(\"pixivCsrfToken\")  \/\/ \u4e0e\u767b\u5f55\u8bbe\u5907\u6709\u5173\n    cache.delete(\"headers\")\n}\n\nfunction removeCacheList(listName) {\n    let list = getFromCache(listName)\n    list.forEach(item => cache.delete(`collect${item}`))\n    if (listName !== \"blockAuthorList\") cache.delete(listName)\n}\n\nfunction removeLikeDataCache() {\n    \/\/ \u5220\u9664 likeNovels \u4e0e watchedSeries\n    removeCacheList(\"likeNovels\")\n    removeCacheList(\"watchedSeries\")\n}\n\nfunction removeSettingsCache() {\n    \/\/ \u5220\u9664 \u81ea\u52a8\u7ffb\u9875\u7684\u6700\u5927\u9875\u7801\n    cache.delete(\"maxPagesKey\")\n    cache.delete(\"novelsMaxPages\")\n    cache.delete(\"seriesMaxPages\")\n\n    \/\/ \u5220\u9664 \u5c4f\u853d\u4f5c\u8005\u540d\u5355\n    \/\/ removeCacheList(\"blockAuthorList\")\n    \/\/ \u5220\u9664  \u5c4f\u853d\u5173\u952e\u8bcd\n    \/\/ cache.delete(\"tagsBlockWords\")\n    \/\/ cache.delete(\"captionBlockWords\")\n}\n\nfunction getCookie() {\n    let pixivCookie = String(java.getCookie(\"https:\/\/www.pixiv.net\/\", null))\n    if (isLogin()) cache.put(\"pixivCookie\", pixivCookie, 60*60)\n}\n\n\/\/ \u83b7\u53d6 Csrf Token\uff0c\u4ee5\u4fbf\u8fdb\u884c\u6536\u85cf\u7b49\u8bf7\u6c42\n\/\/ \u83b7\u53d6\u65b9\u6cd5\u6765\u81ea\u811a\u672c Pixiv Previewer\n\/\/ https:\/\/github.com\/Ocrosoft\/PixivPreviewer\n\/\/ https:\/\/greasyfork.org\/zh-CN\/scripts\/30766-pixiv-previewer\/code\nfunction getCsrfToken() {\n    let pixivCsrfToken = cache.get(\"pixivCsrfToken\")\n    if (!pixivCsrfToken) {\n        let html = java.webView(null, \"https:\/\/www.pixiv.net\/\", null)\n        try {\n            pixivCsrfToken = html.match(\/token\\\\\":\\\\\"([a-z0-9]{32})\/)[1]\n            cache.put(\"pixivCsrfToken\", pixivCsrfToken)  \/\/ \u4e0e\u767b\u5f55\u8bbe\u5907\u6709\u5173\uff0c\u65e0\u6cd5\u5b58\u50a8 nul\n        } catch (e) {\n            pixivCsrfToken = null\n            cache.delete(\"pixivCsrfToken\")  \/\/ \u4e0e\u767b\u5f55\u8bbe\u5907\u6709\u5173\uff0c\u65e0\u6cd5\u5b58\u50a8 nul\n            \/\/ sleepToast(\"\u26a0\ufe0f \u672a\u767b\u5f55\u8d26\u53f7(pixivCsrfToken)\")\n        }\n        java.log(`pixivCsrfToken:\\n${pixivCsrfToken}`)\n    }\n    return pixivCsrfToken\n}\n\nfunction getNovel() {\n    let novel = source.getLoginInfoMap()\n    if (!novel) novel = getFromCache(\"novel\")\n    return novel\n}\n\nfunction getPostBody(url, body, headers) {\n    if (headers === undefined) headers = getFromCache(\"headers\")\n    if (isJsonString(body)) {\n        headers[\"content-type\"] = \"application\/json; charset=utf-8\"\n    } else if (typeof body === \"string\") {\n        headers[\"content-type\"] = \"application\/x-www-form-urlencoded; charset=utf-8\"\n    }\n    try {\n        java.log(`getPostBody(${url}, ${body}, ${headers})`)\n        return JSON.parse(java.post(url, body, headers).body())\n    } catch (e) {\n        e = String(e)\n        \/\/ sleepToast(e)\n        \/\/ sleepToast(JSON.stringify(headers))\n        if (e.includes(\"400\")) sleepToast(`\ud83d\udce4 getPostBody\\n\\n\u26a0\ufe0f \u7f3a\u5c11 headers`, 1)\n        else if (e.includes(\"403\")) sleepToast(`\ud83d\udce4 getPostBody\\n\\n\u26a0\ufe0f \u7f3a\u5c11 cookie \u6216 cookie \u8fc7\u671f`, 1)\n        else if (e.includes(\"404\")) sleepToast(`\ud83d\udce4 getPostBody\\n\\n\u26a0\ufe0f 404 \u7f3a\u5c11 pixivCsrfToken `, 1)\n        else if (e.includes(\"422\")) sleepToast(`\ud83d\udce4 getPostBody\\n\\n\u26a0\ufe0f \u8bf7\u6c42\u4fe1\u606f\u6709\u8bef`, 1)\n        return {error: true, errMsg:e}\n    }\n}\n\nfunction novelBookmarkAdd(restrict) {\n    if (restrict === undefined) restrict = 0\n    let novel = getNovel()\n    let resp = getPostBody(\n        \"https:\/\/www.pixiv.net\/ajax\/novels\/bookmarks\/add\",\n        JSON.stringify({\"novel_id\": novel.id, \"restrict\": restrict, \"comment\":\"\", \"tags\":[]})\n    )\n    if (resp.error === true) {\n        sleepToast(`\u2764\ufe0f \u6536\u85cf\u5c0f\u8bf4\\n\\n\u26a0\ufe0f \u6536\u85cf\u3010${novel.title}\u3011\u5931\u8d25`)\n        shareFactory(\"novel\")\n    } else if (resp.body === null) {\n        sleepToast(`\u2764\ufe0f \u6536\u85cf\u5c0f\u8bf4\\n\\n\u2705 \u5df2\u7ecf\u6536\u85cf\u3010${novel.title}\u3011\u4e86`)\n    } else {\n        cache.put(`collect${novel.id}`, resp.body)\n        sleepToast(`\u2764\ufe0f \u6536\u85cf\u5c0f\u8bf4\\n\\n\u2705 \u5df2\u6536\u85cf\u3010${novel.title}\u3011`)\n\n        let likeNovels = getFromCache(\"likeNovels\")\n        likeNovels.push(Number(novel.id))\n        putInCache(\"likeNovels\", likeNovels)\n\n        let novelObj = getAjaxJson(urlNovelDetailed(novel.id))\n        novelObj.body.isBookmark = true\n        putInCache(urlNovelDetailed(novel.id), novelObj, cacheSaveSeconds)\n    }\n}\n\nfunction getNovelBookmarkId(novelId) {\n    let bookmarkId = getFromCache(`collect${novelId}`)\n    if (bookmarkId === null) {\n        bookmarkId = getAjaxJson(urlNovelBookmarkData(novelId), true).body.bookmarkData.id\n    }\n    return bookmarkId\n}\n\nfunction novelBookmarkDelete() {\n    let novel = getNovel()\n    let resp = getPostBody(\n        \"https:\/\/www.pixiv.net\/ajax\/novels\/bookmarks\/delete\",\n        `del=1&book_id=${getNovelBookmarkId(novel.id)}`\n    )\n    if (resp.error === true) {\n        sleepToast(`\u2764\ufe0f \u6536\u85cf\u5c0f\u8bf4\\n\\n\u26a0\ufe0f \u53d6\u6d88\u6536\u85cf\u3010${novel.title}\u3011\u5931\u8d25`)\n        shareFactory(\"novel\")\n    } else {\n        cache.delete(`collect${novel.id}`)\n        sleepToast(`\u2764\ufe0f \u6536\u85cf\u5c0f\u8bf4\\n\\n\u2705 \u5df2\u53d6\u6d88\u6536\u85cf\u3010${novel.title}\u3011`)\n\n        let likeNovels = getFromCache(\"likeNovels\")\n        likeNovels = likeNovels.filter(item => item !== Number(novel.id))\n        putInCache(\"likeNovels\", likeNovels)\n\n        let novelObj = getAjaxJson(urlNovelDetailed(novel.id))\n        novelObj.body.isBookmark = false\n        putInCache(urlNovelDetailed(novel.id), novelObj, cacheSaveSeconds)\n    }\n}\n\nfunction novelsBookmarkDelete() {\n    let novel = getNovel()\n    if (!novel.seriesId) {\n        sleepToast(`\ud83d\udda4 \u53d6\u6d88\u6536\u85cf\u7cfb\u5217\\n\\n\u26a0\ufe0f \u3010${novel.title}\u3011\u975e\u7cfb\u5217\u5c0f\u8bf4\uff0c\u73b0\u5df2\u53d6\u6d88\u6536\u85cf\u672c\u7bc7\u5c0f\u8bf4`)\n        return novelBookmarkDelete(0)\n    } else {\n        sleepToast(`\ud83d\udda4 \u53d6\u6d88\u6536\u85cf\u7cfb\u5217\\n\\n\ud83d\udd04 \u6b63\u5728\u53d6\u6d88\u6536\u85cf\u7cfb\u5217\u3010${novel.seriesTitle}\u3011\uff0c\u8bf7\u7a0d\u540e\u2026\u2026`, 2)\n    }\n\n    let bookmarkIds = []\n    let novelIds = getFromCache(`novelIds${novel.seriesId}`)\n    novelIds.forEach(novelId => {bookmarkIds.push(getNovelBookmarkId(novelId))})\n    let resp = getPostBody(\n        \"https:\/\/www.pixiv.net\/ajax\/novels\/bookmarks\/remove\",\n        JSON.stringify({\"bookmarkIds\": bookmarkIds})\n    )\n    if (resp.error === true) {\n        sleepToast(`\ud83d\udda4 \u53d6\u6d88\u6536\u85cf\u7cfb\u5217\\n\\n\u26a0\ufe0f \u53d6\u6d88\u6536\u85cf\u3010${novel.seriesTitle}\u3011\u7684\u7bc7\u76ee\u5931\u8d25`, 2)\n        shareFactory(\"series\")\n    } else {\n        sleepToast(`\ud83d\udda4 \u53d6\u6d88\u6536\u85cf\u7cfb\u5217\\n\\n\u2705 \u5df2\u53d6\u6d88\u6536\u85cf\u3010${novel.seriesTitle}\u3011\u7684\u5168\u90e8\u7bc7\u76ee`)\n        novelIds.forEach(novelId => {cache.delete(`collect${novelId}`)})\n\n        let likeNovels = getFromCache(\"likeNovels\")\n        likeNovels = likeNovels.filter(item => !novelIds.includes(Number(item)))\n        putInCache(\"likeNovels\", likeNovels)\n\n        novelIds.forEach(novelId => {\n            let novelObj = getAjaxJson(urlNovelDetailed(novelId))\n            novelObj.body.isBookmark = false\n            putInCache(urlNovelDetailed(novelId), novelObj, cacheSaveSeconds)\n        })\n    }\n}\n\nfunction novelsBookmarkAdd() {\n    let novel = getNovel()\n    if (!novel.seriesId) {\n        sleepToast(`\u2764\ufe0f \u6536\u85cf\u7cfb\u5217\\n\\n\u26a0\ufe0f \u3010${novel.title}\u3011\u975e\u7cfb\u5217\u5c0f\u8bf4\uff0c\u73b0\u5df2\u6536\u85cf\u672c\u7bc7\u5c0f\u8bf4`)\n        return novelBookmarkAdd(0)\n    } else {\n        sleepToast(`\u2764\ufe0f \u6536\u85cf\u7cfb\u5217\\n\\n\ud83d\udd04 \u6b63\u5728\u6536\u85cf\u7cfb\u5217\u3010${novel.seriesTitle}\u3011\uff0c\u8bf7\u7a0d\u540e\u2026\u2026`, 2)\n    }\n\n    let novelIds = getFromCache(`novelIds${novel.seriesId}`)\n    let likeNovels = getFromCache(\"likeNovels\")\n    if (likeNovels === null) likeNovels = []\n    novelIds.forEach(novelId => {\n        if (likeNovels && !likeNovels.includes(Number(novelId))) {\n            sleep(0.5 * 1000 * Math.random())\n            let resp = getPostBody(\n                \"https:\/\/www.pixiv.net\/ajax\/novels\/bookmarks\/add\",\n                JSON.stringify({\"novel_id\": novelId, \"restrict\": 0, \"comment\": \"\", \"tags\": []})\n            )\n\n            if (resp.error === true) {\n                sleepToast(`\u2764\ufe0f \u6536\u85cf\u7cfb\u5217\\n\\n\u26a0\ufe0f \u6536\u85cf\u3010${novelId}\u3011\u5931\u8d25`)\n                shareFactory(\"series\")\n            } else if (resp.body === null) {\n                \/\/ sleepToast(`\u2764\ufe0f \u6536\u85cf\u5c0f\u8bf4\\n\\n\u2705 \u5df2\u7ecf\u6536\u85cf\u3010${novel.title}\u3011\u4e86`)\n            } else {\n                cache.put(`collect${novelId}`, resp.body)\n                likeNovels.push(Number(novelId))\n\n                let novelObj = getAjaxJson(urlNovelDetailed(novelId))\n                novelObj.body.isBookmark = true\n                putInCache(urlNovelDetailed(novelId), novelObj, cacheSaveSeconds)\n            }\n        }\n    })\n    putInCache(\"likeNovels\", likeNovels)\n    sleepToast(`\u2764\ufe0f \u6536\u85cf\u7cfb\u5217\\n\\n\u2705 \u5df2\u7ecf\u6536\u85cf\u3010${novel.seriesTitle}\u3011\u5168\u90e8\u7ae0\u8282`)\n}\n\nfunction novelBookmarkFactory(code) {\n    let novel = getNovel()\n    let collectId = getFromCache(`collect${novel.id}`)\n    if (collectId >= 1) code = 0\n\n    if (code === 0) novelBookmarkDelete()\n    else if (code === 1) novelBookmarkAdd(0)\n    else if (code === 2) novelBookmarkAdd(1)\n}\n\nfunction novelMarker(page) {\n    if (page === undefined) page = 1\n    let novel = getNovel()\n    let lastMarker = getFromCache(`marker${novel.id}`)\n    if (lastMarker === true) page = 0\n\n    let resp = getPostBody(\n        \"https:\/\/www.pixiv.net\/novel\/rpc_marker.php\",\n        `mode=save&i_id=${novel.id}&u_id=${getFromCache(\"pixiv:uid\")}&page=${page}`\n    )\n    java.log(`mode=save&i_id=${novel.id}&u_id=${getFromCache(\"pixiv:uid\")}&page=${page}`)\n    if (resp.error === true) {\n        sleepToast(\"\ud83c\udff7\ufe0f \u6dfb\u52a0\u4e66\u7b7e\\n\\n\u26a0\ufe0f \u64cd\u4f5c\u5931\u8d25\", 1)\n        shareFactory(\"novel\")\n    } else if (lastMarker === true) {\n        cache.put(`marker${novel.id}`, false)\n        sleepToast(`\ud83c\udff7\ufe0f \u6dfb\u52a0\u4e66\u7b7e\\n\\n\u2705 \u5df2\u5220\u9664\u4e66\u7b7e`)\n    } else {\n        cache.put(`marker${novel.id}`, true)\n        sleepToast(`\ud83c\udff7\ufe0f \u6dfb\u52a0\u4e66\u7b7e\\n\\n\u2705 \u5df2\u52a0\u5165\u4e66\u7b7e`)\n    }\n}\n\nfunction seriesWatch() {\n    let novel = getNovel()\n    let resp = getPostBody(\n        `https:\/\/www.pixiv.net\/ajax\/novel\/series\/${novel.seriesId}\/watch`,\n        \"{}\"\n    )\n    if (resp.error === true) {\n        sleepToast(`\ud83d\udcc3 \u8ffd\u66f4\u7cfb\u5217\\n\\n\u26a0\ufe0f \u8ffd\u66f4\u3010${novel.seriesTitle}\u3011\u5931\u8d25`, 1)\n        shareFactory(\"series\")\n    } else {\n        cache.put(`watch${novel.seriesId}`, true)\n        sleepToast(`\ud83d\udcc3 \u8ffd\u66f4\u7cfb\u5217\\n\\n\u2705 \u5df2\u8ffd\u66f4\u3010${novel.seriesTitle}\u3011`)\n\n        let watchedSeries = getFromCache(\"watchedSeries\")\n        watchedSeries.push(Number(novel.seriesId))\n        putInCache(\"watchedSeries\", watchedSeries)\n\n        let novelObj = getAjaxJson(urlSeriesDetailed(novel.seriesId))\n        novelObj.body.isWatched = true\n        putInCache(urlSeriesDetailed(novel.seriesId), novelObj, cacheSaveSeconds)\n    }\n}\n\nfunction seriesUnWatch() {\n    let novel = getNovel()\n    let resp = getPostBody(\n        `https:\/\/www.pixiv.net\/ajax\/novel\/series\/${novel.seriesId}\/unwatch`,\n        \"{}\"\n    )\n    if (resp.error === true) {\n        sleepToast(`\ud83d\udcc3 \u8ffd\u66f4\u7cfb\u5217\\n\\n\u26a0\ufe0f \u53d6\u6d88\u8ffd\u66f4\u3010${novel.seriesTitle}\u3011\u5931\u8d25`, 1)\n        shareFactory(\"series\")\n    } else {\n        cache.delete(`watch${novel.seriesId}`)\n        sleepToast(`\ud83d\udcc3 \u8ffd\u66f4\u7cfb\u5217\\n\\n\u2705 \u5df2\u53d6\u6d88\u8ffd\u66f4\u3010${novel.seriesTitle}\u3011`)\n\n        let watchedSeries = getFromCache(\"watchedSeries\")\n        watchedSeries = watchedSeries.filter(item => item !== Number(novel.seriesId))\n        putInCache(\"watchedSeries\", watchedSeries)\n\n        let novelObj = getAjaxJson(urlSeriesDetailed(novel.seriesId))\n        novelObj.body.isWatched = false\n        putInCache(urlSeriesDetailed(novel.seriesId), novelObj, cacheSaveSeconds)\n    }\n}\n\nfunction seriesWatchFactory(code) {\n    if (code === undefined) code = 1\n    let novel = getNovel()\n    if (!novel.seriesId) {\n        return sleepToast(`\ud83d\udcc3 \u8ffd\u66f4\u7cfb\u5217\\n\\n\u26a0\ufe0f \u3010${novel.title}\u3011\u975e\u7cfb\u5217\u5c0f\u8bf4\uff0c\u65e0\u6cd5\u52a0\u5165\u8ffd\u66f4\u5217\u8868`)\n    }\n\n    let lastStatus = getFromCache(`watch${novel.seriesId}`)\n    if (lastStatus === true) code = 0\n    if (code === 0) seriesUnWatch()\n    else if (code === 1) seriesWatch()\n}\n\nfunction userFollow(restrict) {\n    if (restrict === undefined) restrict = 0\n    let novel = getNovel()\n    let resp = getPostBody(\n        \"https:\/\/www.pixiv.net\/bookmark_add.php\",\n        `mode=add&type=user&user_id=${novel.userId}&tag=\"\"&restrict=${restrict}&format=json`\n    )\n    if (resp.error === true) {\n        sleepToast(`\u2b50\ufe0f \u5173\u6ce8\u4f5c\u8005\\n\\n\u26a0\ufe0f \u5173\u6ce8\u3010${novel.userName}\u3011\u5931\u8d25`, 1)\n        shareFactory(\"author\")\n    } else {\n        sleepToast(`\u2b50\ufe0f \u5173\u6ce8\u4f5c\u8005\\n\\n\u2705 \u5df2\u5173\u6ce8\u3010${novel.userName}\u3011`)\n        cache.put(`follow${novel.userId}`, true)\n    }\n}\n\nfunction userUnFollow() {\n    let novel = getNovel()\n    let resp = getPostBody(\n        \"https:\/\/www.pixiv.net\/rpc_group_setting.php\",\n        `mode=del&type=bookuser&id=${novel.userId}`\n    )\n    if (resp.error === true) {\n        sleepToast(`\u2b50\ufe0f \u5173\u6ce8\u4f5c\u8005\\n\\n\u26a0\ufe0f \u53d6\u6d88\u5173\u6ce8\u3010${novel.userName}\u3011\u5931\u8d25`, 1)\n        shareFactory(\"author\")\n    } else {\n        sleepToast(`\u2b50\ufe0f \u5173\u6ce8\u4f5c\u8005\\n\\n\u2705 \u5df2\u53d6\u6d88\u5173\u6ce8\u3010${novel.userName}\u3011`)\n        cache.delete(`follow${novel.userId}`)\n    }\n}\n\nfunction userFollowFactory(code) {\n    if (code === undefined) code = 1\n    let novel = getNovel()\n    let lastStatus = getFromCache(`follow${novel.userId}`)\n    if (lastStatus === true) code = 0\n\n    if (code === 0) userUnFollow()\n    else if (code === 1) userFollow()\n}\n\nfunction userBlackList() {\n    let action = \"block\"  \/\/ \u62c9\u9ed1\u4f5c\u8005\uff0c\u975e\u5c4f\u853d\u4f5c\u8005\u4f5c\u54c1\n    let novel = getNovel()\n    let lastStatus = getFromCache(`block${novel.userId}`)\n    if (lastStatus === true) action = \"unblock\"\n\n    let resp = getPostBody(\n        `https:\/\/www.pixiv.net\/ajax\/block\/save`,\n        JSON.stringify({\"user_id\": novel.userId, \"action\": action})\n    )\n    \/\/ java.log(JSON.stringify({\"user_id\": novel.userId, \"action\": action}))\n    if (resp.error === true) sleepToast(\"\u26a0\ufe0f \u64cd\u4f5c\u5931\u8d25\", 1)\n    else if (lastStatus === true) {\n        cache.put(`block${novel.userId}`, false)\n        sleepToast(`\u2705 \u5df2\u53d6\u6d88\u62c9\u9ed1\u3010${novel.userName}\u3011\\n\\n\u5df2\u5141\u8bb8\u5176\u70b9\u8d5e\u3001\u8bc4\u8bba\u3001\u6536\u85cf\u3001\u5173\u6ce8\u3001\u79c1\u4fe1\u7b49`)\n    } else {\n        cache.put(`block${novel.userId}`, true)\n        sleepToast(`\u2705 \u5df2\u62c9\u9ed1\u3010${novel.userName}\u3011(Pixiv)\\n\\n\u5df2\u7981\u6b62\u5176\u70b9\u8d5e\u3001\u8bc4\u8bba\u3001\u6536\u85cf\u3001\u5173\u6ce8\u3001\u79c1\u4fe1\u7b49`)\n    }\n}\n\nfunction userBlock() {\n    let authors = getFromCache(\"blockAuthorList\")\n    if (!authors) authors = []\n    let authorsMap = getFromCacheMap(\"blockAuthorMap\")\n    if (!authorsMap || authorsMap.size === 0) {\n        authorsMap = new Map()\n        authors.forEach(author => {\n            authorsMap.set(author, getAjaxJson(urlUserDetailed(author)).body.name)\n        })\n    }\n\n    let novel = getNovel()\n    if (authorsMap.has(String(novel.userId))) {\n        authorsMap.delete(String(novel.userId))\n        sleepToast(`\ud83d\udeab \u5c4f\u853d\u4f5c\u8005\\n\\n\u2705 \u5df2\u53d6\u6d88\u5c4f\u853d\u3010${novel.userName}\u3011\\n\u73b0\u5df2\u6062\u590d\u663e\u793a\u5176\u5c0f\u8bf4`)\n    } else if (!!novel.userId) {\n        authorsMap.set(String(novel.userId), novel.userName)\n        sleepToast(`\ud83d\udeab \u5c4f\u853d\u4f5c\u8005\\n\\n\u2705 \u672c\u5730\u5df2\u5c4f\u853d\u3010${novel.userName}\u3011\\n\u4eca\u540e\u4e0d\u518d\u663e\u793a\u5176\u5c0f\u8bf4`)\n    }\n\n    authors = Array.from(authorsMap.keys())\n    putInCache(\"blockAuthorList\", authors)\n    putInCacheMap(\"blockAuthorMap\", authorsMap)\n    \/\/ source.setVariable(authors.toString())\n    \/\/ sleepToast(JSON.stringify(authors))\n}\n\nfunction novelCommentAdd() {\n    let resp, novel = getNovel()\n    let userId = getFromCache(\"pixiv:uid\")\n    let comment = String(result.get(\"\u8f93\u5165\u5185\u5bb9\")).trim()\n    if (comment === \"\") {\n        return sleepToast(`\u2705 \u53d1\u9001\u8bc4\u8bba\\n\u26a0\ufe0f \u8bf7\u5728\u3010\u8f93\u5165\u5185\u5bb9\u3011\u8f93\u5165\u8bc4\u8bba\\n\\n\u8f93\u5165\u3010\u8bc4\u8bba\u5185\u5bb9\uff1b\u8bc4\u8bbaID\u3011\u53ef\u56de\u590d\u8be5\u6761\u8bc4\u8bba\uff0c\u5982\u3010\u975e\u5e38\u559c\u6b22\uff1b123456\u3011\\n\\n\ud83d\udccc \u5f53\u524d\u7ae0\u8282\uff1a${novel.title}\\n\u5982\u975e\u5f53\u524d\u7ae0\u8282\uff0c\u8bf7\u5237\u65b0\u6b63\u6587`)\n    }\n\n    let matched = comment.match(RegExp(\/(\uff1b|;\\s*)\\d{8,}\/))\n    if (matched) {\n        let commentId = comment.match(new RegExp(\/\uff1b(\\d{8,})\/))[1]\n        comment = comment.replace(new RegExp(`(\uff1b|;\\s*)${commentId}`), \"\")\n        resp = getPostBody(\n            \"https:\/\/www.pixiv.net\/novel\/rpc\/post_comment.php\",\n            `type=comment&novel_id=${novel.id}&author_user_id=${userId}&comment=${encodeURI(comment)}&parent_id=${commentId}`)\n    } else {\n        resp = getPostBody(\n            \"https:\/\/www.pixiv.net\/novel\/rpc\/post_comment.php\",\n            `type=comment&novel_id=${novel.id}&author_user_id=${userId}&comment=${encodeURI(comment)}`\n        )\n    }\n\n    if (resp.error === true) {\n        sleepToast(\"\u2705 \u53d1\u9001\u8bc4\u8bba\\n\\n\u26a0\ufe0f \u8bc4\u8bba\u5931\u8d25\", 1)\n        shareFactory(\"novel\")\n    } else {\n        sleepToast(`\u2705 \u53d1\u9001\u8bc4\u8bba\\n\\n\u2705 \u5df2\u5728\u3010${novel.title}\u3011\u53d1\u5e03\u8bc4\u8bba\uff1a\\n${comment}`)\n    }\n}\n\nfunction getNovelCommentID(novelId, commentText) {\n    let list = [], uid = String(getFromCache(\"pixiv:uid\"))\n    let resp = getAjaxJson(urlNovelComments(novelId, 0, 50), true)\n    resp.body.comments.forEach(comment => {\n        if (comment.userId === uid && comment.comment === commentText) list.push(comment.id)\n\n        if (comment.hasReplies === true) {\n            let resp = getAjaxJson(urlNovelCommentsReply(comment.id, 1), true)\n            resp.body.comments.forEach(comment => {\n                if (comment.userId === uid && comment.comment === commentText) list.push(comment.id)\n            })\n        }\n    })\n    \/\/ java.log(JSON.stringify(list))\n    return list\n}\n\nfunction novelCommentDelete() {\n    let commentIDs, novel = getNovel()\n    let comment = String(result.get(\"\u8f93\u5165\u5185\u5bb9\")).trim()\n    if (comment === \"\") {\n        return sleepToast(`\ud83d\uddd1 \u5220\u9664\u8bc4\u8bba\\n\u26a0\ufe0f \u8bf7\u5728\u3010\u8f93\u5165\u5185\u5bb9\u3011\u8f93\u5165\u9700\u8981\u5220\u9664\u7684\u3010\u8bc4\u8bbaID\u3011\\n\u6216\u8f93\u5165\u9700\u8981\u5220\u9664\u7684\u3010\u8bc4\u8bba\u5185\u5bb9\u3011\\n\\n\ud83d\udccc \u5f53\u524d\u7ae0\u8282\uff1a${novel.title}\\n\u5982\u975e\u5f53\u524d\u7ae0\u8282\uff0c\u8bf7\u5237\u65b0\u6b63\u6587`)\n    }\n\n    let matched = comment.match(RegExp(\/\\d{8,}\/))\n    if (matched) {\n        commentIDs = [matched[0]]\n    } else {\n        commentIDs = getNovelCommentID(novel.id, comment)\n        java.log(JSON.stringify(commentIDs))\n        if (commentIDs.length === 0) {\n            return sleepToast(`\ud83d\uddd1 \u5220\u9664\u8bc4\u8bba\\n\\n\u26a0\ufe0f \u672a\u80fd\u627e\u5230\u8fd9\u6761\u8bc4\u8bba\\n\u8bf7\u68c0\u67e5\u662f\u5426\u6709\u9519\u522b\u5b57\u6216\u6807\u70b9\u7b26\u53f7\u662f\u5426\u4e00\u81f4`)\n        }\n    }\n\n    commentIDs.forEach(commentID =>{\n        let resp = getPostBody(\n            \"https:\/\/www.pixiv.net\/novel\/rpc_delete_comment.php\",\n            `i_id=${novel.id}&del_id=${commentID}`\n        )\n        \/\/ java.log(JSON.stringify(resp))\n        if (resp.error === true) {\n            sleepToast(\"\ud83d\uddd1 \u5220\u9664\u8bc4\u8bba\\n\\n\u26a0\ufe0f \u8bc4\u8bba\u5220\u9664\u5931\u8d25\", 1)\n            shareFactory(\"novel\")\n        } else {\n            sleepToast(`\ud83d\uddd1 \u5220\u9664\u8bc4\u8bba\\n\\n\u2705 \u5df2\u5728\u3010${novel.title}\u3011\u5220\u9664\u8bc4\u8bba\uff1a\\n${comment}`)\n        }\n    })\n}\n\nfunction novelPollAnswer() {\n    let novel = getNovel()\n    \/\/ novel.pollChoicesCount = getAjaxJson(urlNovelDetailed(novel.id)).body.pollData.selectedValue\n    if (!novel.pollChoicesCount) {\n        return sleepToast(`\ud83d\udcc3 \u5c0f\u8bf4\u6295\u7968\\n\\n\u26a0\ufe0f \u8be5\u5c0f\u8bf4\u3010${novel.title}\u3011\u65e0\u6295\u7968\u4fe1\u606f\uff0c\u5efa\u8bae\u3010\u6e05\u9664\u7f13\u5b58\u3011\u3010\u5237\u65b0\u3011\u540e\u91cd\u8bd5`)\n    }\n\n    let choiceId = String(result.get(\"\u8f93\u5165\u5185\u5bb9\")).trim()\n    if (!choiceId) {\n        return sleepToast(`\ud83d\udcc3 \u5c0f\u8bf4\u6295\u7968\\n\\n\u26a0\ufe0f \u6295\u7968\u5931\u8d25\uff1a\u8bf7\u5728\u3010\u8f93\u5165\u5185\u5bb9\u3011\u8f93\u5165\u6295\u7968\u9009\u9879(\u6570\u5b57)`)\n    } else if (Number(choiceId) > novel.pollData.selectedValue) {\n        return sleepToast(`\ud83d\udcc3 \u5c0f\u8bf4\u6295\u7968\\n\\n\u26a0\ufe0f \u6295\u7968\u5931\u8d25\uff1a\u9009\u9879${choiceId}\u8d85\u51fa\u8303\u56f4`)\n    } else if (Number(choiceId) <= 0 || Number(choiceId) > novel.pollChoicesCount) {\n        return sleepToast(`\ud83d\udcc3 \u5c0f\u8bf4\u6295\u7968\\n\\n\u26a0\ufe0f \u6295\u7968\u5931\u8d25\uff1a\u9009\u9879${choiceId}\u8d85\u51fa\u8303\u56f4`)\n    }\n\n    let resp = getPostBody(\n        `https:\/\/www.pixiv.net\/ajax\/novel\/${novel.id}\/poll\/answer`,\n        JSON.stringify({\"choice_id\": choiceId})\n    )\n    \/\/ 200 \u6210\u529f\uff0c403 \u91cd\u590d\u6295\u7968\uff0c400 \u9009\u9879\u8d85\u8fc7\u8303\u56f4\n    if (resp.error === true) {\n        if (resp.errMsg.includes(\"403\")) {\n            sleepToast(`\ud83d\udcc3 \u5c0f\u8bf4\u6295\u7968\\n\\n\u2705 \u5df2\u7ecf\u6295\u8fc7\u7968\u4e86`)\n        } else {\n            sleepToast(`\ud83d\udcc3 \u5c0f\u8bf4\u6295\u7968\\n\\n\u26a0\ufe0f \u6295\u7968\u5931\u8d25`)\n            shareFactory(\"novel\")\n        }\n    } else {\n        sleepToast(`\ud83d\udcc3 \u5c0f\u8bf4\u6295\u7968\\n\\n\u2705 \u6295\u7968\u6210\u529f`)\n    }\n}\n\nlet wordsType = {\n    \"caption\": \"\ud83d\udcc3 \u7b80\u4ecb\u5c4f\u853d\u5217\u8868\",\n    \"tags\": \"#\ufe0f \u6807\u7b7e\u5c4f\u853d\u5217\u8868\",\n    \"authors\": \"\ud83d\udc64 \u4f5c\u8005\u5c4f\u853d\u5217\u8868\"\n}\n\nfunction printAuthorMap(map) {\n    let text = \"\"\n    map.forEach((value, key) => {\n        text += `@${value} ${key}\\n`\n    })\n    return text.trim()\n}\n\nfunction blockShowFactory() {\n    let keys = Object.keys(wordsType)\n    let key = getFromCache(\"wordsType\")\n\n    \/\/ \u5207\u6362\u5c4f\u853d\u5217\u8868\n    let index = keys.indexOf(key) + 1\n    if (index === keys.length) index = 0\n    key = keys[index]\n    putInCache(\"wordsType\", key)\n\n    if (key === \"authors\") {\n        let words = printAuthorMap(getFromCacheMap(\"blockAuthorMap\"))\n        if (!words) words = \"\"\n        sleepToast(`\ud83d\udc40 \u67e5\u770b\u5c4f\u853d\\n${wordsType[key]}\\n\\n${words}`, 2)\n    } else {\n        let words = getFromCache(`${key}BlockWords`)\n        if (!words) words = []\n        sleepToast(`\ud83d\udc40 \u67e5\u770b\u5c4f\u853d\\n${wordsType[key]}\\n\\n${words.join(\"\\n\")}`, 2)\n    }\n}\n\nfunction blockWordAdd() {\n    let method = getFromCache(\"wordsType\")\n    let blockWords = getFromCache(`${method}BlockWords`)\n    if (blockWords === null) blockWords = []\n\n    let word = String(result.get(\"\u8f93\u5165\u5185\u5bb9\")).trim()\n    if (word === \"\") {\n        sleepToast(`\ud83d\udeab \u6dfb\u52a0\u5c4f\u853d\\n${wordsType[method]}\\n\\n\u26a0\ufe0f \u8f93\u5165\u5185\u5bb9\u4e0d\u80fd\u4e3a\u7a7a`)\n    } else if (blockWords.includes(word)) {\n        sleepToast(`\ud83d\udeab \u6dfb\u52a0\u5c4f\u853d\\n${wordsType[method]}\\n\\n\u2705 \u3010${word}\u3011\u5df2\u7ecf\u52a0\u5165\u5c4f\u853d\u5217\u8868\u4e86`)\n    } else {\n        blockWords.push(word)\n        putInCache(`${method}BlockWords`, blockWords)\n        sleepToast(`\ud83d\udeab \u6dfb\u52a0\u5c4f\u853d\\n${wordsType[method]}\\n\\n\u2705 \u5df2\u5c06\u3010${word}\u3011\u52a0\u5165\u5c4f\u853d\u5217\u8868\u4e2d`)\n    }\n}\n\nfunction blockWordDelete() {\n    let method = getFromCache(\"wordsType\")\n    let blockWords = getFromCache(`${method}BlockWords`)\n    if (blockWords === null) blockWords = []\n\n    let word = String(result.get(\"\u8f93\u5165\u5185\u5bb9\")).trim()\n    if (word === \"\") {\n        sleepToast(`\u2b55\ufe0f \u5220\u9664\u5c4f\u853d\\n${wordsType[method]}\\n\\n\u26a0\ufe0f \u8f93\u5165\u5185\u5bb9\u4e0d\u80fd\u4e3a\u7a7a`)\n    } else if (!blockWords.includes(word)) {\n        sleepToast(`\u2b55\ufe0f \u5220\u9664\u5c4f\u853d\\n${wordsType[method]}\\n\\n\u26a0\ufe0f \u3010${word}\u3011\u4e0d\u5728\u5c4f\u853d\u5217\u8868\\n\u8bf7\u68c0\u67e5\u662f\u5426\u6709\u9519\u522b\u5b57\u6216\u6807\u70b9\u7b26\u53f7\u662f\u5426\u4e00\u81f4`)\n    } else {\n        blockWords = blockWords.filter(item => item !== word)\n        putInCache(`${method}BlockWords`, blockWords)\n        sleepToast(`\u2b55\ufe0f \u5220\u9664\u5c4f\u853d\\n${wordsType[method]}\\n\\n\u2705 \u5df2\u5220\u9664\u5c4f\u853d\u8bcd\u3010${word}\u3011`)\n    }\n}\n\nfunction blockAuthorAdd() {\n    let method = getFromCache(\"wordsType\")\n    let blockAuthors = getFromCacheMap(`blockAuthorMap`)\n\n    let word = String(result.get(\"\u8f93\u5165\u5185\u5bb9\")).trim()\n    if (word === \"\") {\n        sleepToast(`\ud83d\udeab \u6dfb\u52a0\u5c4f\u853d\\n${wordsType[method]}\\n\\n\u26a0\ufe0f \u8f93\u5165\u5185\u5bb9\u4e0d\u80fd\u4e3a\u7a7a\\n\u26a0\ufe0f \u8f93\u5165\u3010\u7528\u6237ID\u3011\u53ef\u5c4f\u853d\u8be5\u4f5c\u8005`)\n    } else if (blockAuthors.has(word)) {\n        let text = `${blockAuthors.get(word)} ${word}`\n        sleepToast(`\ud83d\udeab \u6dfb\u52a0\u5c4f\u853d\\n${wordsType[method]}\\n\\n\u2705 \u3010${text}\u3011\u5df2\u7ecf\u52a0\u5165\u5c4f\u853d\u5217\u8868\u4e86`)\n    }\n    \/\/ \u8f93\u5165\u7eaf\u6570\u5b57\uff0c\u6dfb\u52a0\u5bf9\u5e94ID\u7684\u4f5c\u8005\n    else if (!isNaN(word)) {\n        let user = getAjaxJson(urlUserDetailed(word)).body\n        blockAuthors.set(user.userId, user.name)\n        let text = `@${user.name} ${user.userId}`\n        sleepToast(`\ud83d\udeab \u6dfb\u52a0\u5c4f\u853d\\n${wordsType[method]}\\n\\n\u2705 \u5df2\u5c06\u3010${text}\u3011\u52a0\u5165\u5c4f\u853d\u5217\u8868\u4e2d`)\n    }\n    else if (word) {\n        sleepToast(`\ud83d\udeab \u6dfb\u52a0\u5c4f\u853d\\n${wordsType[method]}\\n\\n\u26a0\ufe0f \u8f93\u5165\u3010\u7528\u6237ID\u3011\u53ef\u5c4f\u853d\u8be5\u4f5c\u8005`)\n    }\n    putInCacheMap(`blockAuthorMap`, blockAuthors)\n}\n\nfunction blockAuthorDelete() {\n    let method = getFromCache(\"wordsType\")\n    let blockAuthors = getFromCacheMap(`blockAuthorMap`)\n\n    let word = String(result.get(\"\u8f93\u5165\u5185\u5bb9\")).trim()\n    if (word === \"\") {\n        sleepToast(`\u2b55\ufe0f \u5220\u9664\u5c4f\u853d\\n${wordsType[method]}\\n\\n\u26a0\ufe0f \u8f93\u5165\u5185\u5bb9\u4e0d\u80fd\u4e3a\u7a7a\\n\u26a0\ufe0f \u8f93\u5165\u3010\u7528\u6237ID\u3011\u53ef\u5c4f\u853d\u8be5\u4f5c\u8005`)\n    }\n    \/\/ \u8f93\u5165\u7eaf\u6570\u5b57\uff0c\u5220\u9664\u5bf9\u5e94ID\u7684\u4f5c\u8005\n    else if (!isNaN(word) && blockAuthors.has(word)) {\n        let text = `@${blockAuthors.get(word)} ${word}`\n        blockAuthors.delete(word)\n        sleepToast(`\u2b55\ufe0f \u5220\u9664\u5c4f\u853d\\n${wordsType[method]}\\n\\n\u2705 \u5df2\u5220\u9664\u3010${text}\u3011`)\n    }\n    \/\/\u4f5c\u8005\u540d\u79f0\n    else if (Array.from(blockAuthors.values()).includes(word)) {\n        let index = Array.from(blockAuthors.values()).indexOf(word)\n        let key = Array.from(blockAuthors.keys())[index]\n        let text = `@${blockAuthors.get(key)} ${key}`\n        blockAuthors.delete(key)\n        sleepToast(`\u2b55\ufe0f \u5220\u9664\u5c4f\u853d\\n${wordsType[method]}\\n\\n\u2705 \u5df2\u5220\u9664\u3010${text}\u3011`)\n    }\n    else if (word) {\n        sleepToast(`\u2b55\ufe0f \u5220\u9664\u5c4f\u853d\\n${wordsType[method]}\\n\\n\u26a0\ufe0f \u8f93\u5165\u3010\u7528\u6237ID\u3011\u53ef\u5c4f\u853d\u8be5\u4f5c\u8005`)\n    }\n    putInCacheMap(`blockAuthorMap`, blockAuthors)\n}\n\nfunction blockAddFactory() {\n    if (getFromCache(\"wordsType\") === \"authors\") return blockAuthorAdd()\n    else return blockWordAdd()\n}\n\nfunction blockDeleteFactory() {\n    if (getFromCache(\"wordsType\") === \"authors\") return blockAuthorDelete()\n    else return blockWordDelete()\n}\n\n\nfunction likeTagsShow() {\n    let likeTags = getFromCache(`likeTags`)\n    if (likeTags === null) likeTags = []\n    sleepToast(`\ud83d\udc40 \u67e5\u770b\u6807\u7b7e\\n\ud83d\udccc \u559c\u6b22\u6807\u7b7e\\n\\n${likeTags.join(\"\u3001\")}`, 5)\n}\n\nfunction likeTagsAdd() {\n    let likeTags = getFromCache(`likeTags`)\n    if (likeTags === null) likeTags = []\n\n    let word = String(result.get(\"\u8f93\u5165\u5185\u5bb9\")).trim()\n    if (word === \"\") {\n        sleepToast(`\ud83d\udccc \u6dfb\u52a0\u6807\u7b7e\\n\ud83d\udccc \u559c\u6b22\u6807\u7b7e\\n\\n\u26a0\ufe0f \u8f93\u5165\u5185\u5bb9\u4e0d\u80fd\u4e3a\u7a7a\\n\u8bf7\u76f4\u63a5\u8f93\u5165\u6807\u7b7e\u5185\u5bb9`)\n    } else if (word.startsWith(\"@\") || word.startsWith(\"\uff20\")) {\n        sleepToast(`\ud83d\udccc \u6dfb\u52a0\u6807\u7b7e\\n\ud83d\udccc \u559c\u6b22\u6807\u7b7e\\n\\n\u26a0\ufe0f \u4ec5\u652f\u6301\u6dfb\u52a0\u3010\u6807\u7b7e\u3011\\n\u4e0d\u652f\u6301\u6dfb\u52a0 @\u4f5c\u8005\u540d\u79f0`)\n    } else if (word.startsWith(\"#\") || word.startsWith(\"\uff03\")) {\n        sleepToast(`\ud83d\udccc \u6dfb\u52a0\u6807\u7b7e\\n\ud83d\udccc \u559c\u6b22\u6807\u7b7e\\n\\n\u26a0\ufe0f \u4ec5\u652f\u6301\u6dfb\u52a0\u3010\u6807\u7b7e\u3011\\n\u4e0d\u652f\u6301\u6dfb\u52a0 #\u6807\u7b7e\u540d\u79f0`)\n    } else if (likeTags.includes(word)) {\n        sleepToast(`\ud83d\udccc \u6dfb\u52a0\u6807\u7b7e\\n\ud83d\udccc \u559c\u6b22\u6807\u7b7e\\n\\n\u2705 \u3010${word}\u3011\u5df2\u7ecf\u52a0\u5165\u559c\u6b22\u6807\u7b7e\u4e86\\n\u8bf7\u4e8e\u53d1\u73b0\u9875\u5237\u65b0\u540e\u67e5\u770b`)\n    } else {\n        likeTags.push(word)\n        putInCache(`likeTags`, likeTags)\n        sleepToast(`\ud83d\udccc \u6dfb\u52a0\u6807\u7b7e\\n\ud83d\udccc \u559c\u6b22\u6807\u7b7e\\n\\n\u2705 \u5df2\u5c06\u3010${word}\u3011\u52a0\u5165\u559c\u6b22\u6807\u7b7e\u4e86\\n\u8bf7\u4e8e\u53d1\u73b0\u9875\u5237\u65b0\u540e\u67e5\u770b`)\n    }\n}\n\nfunction likeTagsDelete() {\n    let likeTags = getFromCache(`likeTags`)\n    if (likeTags === null) likeTags = []\n\n    let word = String(result.get(\"\u8f93\u5165\u5185\u5bb9\")).trim()\n    if (word === \"\") {\n        sleepToast(`\ud83d\uddd1 \u5220\u9664\u6807\u7b7e\\n\\n\u26a0\ufe0f \u8f93\u5165\u5185\u5bb9\u4e0d\u80fd\u4e3a\u7a7a`)\n    } else if (!likeTags.includes(word)) {\n        sleepToast(`\ud83d\uddd1 \u5220\u9664\u6807\u7b7e\\n\\n\u26a0\ufe0f \u3010${word}\u3011\u4e0d\u5728\u559c\u6b22\u6807\u7b7e\\n\u8bf7\u68c0\u67e5\u662f\u5426\u6709\u9519\u522b\u5b57`)\n    } else {\n        likeTags = likeTags.filter(item => item !== word)\n        putInCache(`likeTags`, likeTags)\n        sleepToast(`\ud83d\uddd1 \u5220\u9664\u6807\u7b7e\\n\\n\u2705 \u5df2\u5220\u9664\u8be5\u6807\u7b7e\u3010${word}\u3011`)\n    }\n}\n\n\nfunction likeAuthorsShow() {\n    let text = printAuthorMap(getFromCacheMap(`likeAuthors`))\n    sleepToast(`\ud83d\udc40 \u67e5\u770b\u6536\u85cf\\n\u2764\ufe0f \u4ed6\u4eba\u6536\u85cf\\n\\n${text.trim()}`, 2)\n}\n\nfunction likeAuthorsAdd() {\n    let likeAuthors = getFromCacheMap(`likeAuthors`)\n    let word = String(result.get(\"\u8f93\u5165\u5185\u5bb9\")).trim()\n    if (word.startsWith(\"@\") || word.startsWith(\"\uff20\")) {\n        return sleepToast(`\u2764\ufe0f \u6dfb\u52a0\u6536\u85cf\\n\u2764\ufe0f \u4ed6\u4eba\u6536\u85cf\\n\\n\u26a0\ufe0f \u4ec5\u652f\u6301\u901a\u8fc7\u3010\u4f5c\u8005ID\u3011\u5173\u6ce8\\n\u4e0d\u652f\u6301\u6dfb\u52a0 @\u4f5c\u8005\u540d\u79f0`)\n    } else if (word.startsWith(\"#\") || word.startsWith(\"\uff03\")) {\n        return sleepToast(`\u2764\ufe0f \u6dfb\u52a0\u6536\u85cf\\n\u2764\ufe0f \u4ed6\u4eba\u6536\u85cf\\n\\n\u26a0\ufe0f \u4ec5\u652f\u6301\u901a\u8fc7\u3010\u4f5c\u8005ID\u3011\u5173\u6ce8\\n\u4e0d\u652f\u6301\u6dfb\u52a0 #\u6807\u7b7e\u540d\u79f0`)\n    } else if (likeAuthors.has(word)) {\n        let text = `${likeAuthors.get(word)} ${word}`\n        sleepToast(`\u2764\ufe0f \u6dfb\u52a0\u6536\u85cf\\n\u2764\ufe0f \u4ed6\u4eba\u6536\u85cf\\n\\n\u2705 \u3010${text}\u3011\u5df2\u7ecf\u52a0\u5165\u6536\u85cf\u5217\u8868\u4e86\uff0c\u8bf7\u4e8e\u53d1\u73b0\u9875\u5237\u65b0\u540e\u67e5\u770b`)\n    }\n\n    \/\/ \u65e0\u8f93\u5165\u5185\u5bb9\uff0c\u6dfb\u52a0\u5f53\u524d\u5c0f\u8bf4\u7684\u4f5c\u8005\n    if (word === \"\") {\n        let novel = getNovel()\n        likeAuthors.set(String(novel.userId), novel.userName)\n        let text = `@${novel.userName} ${novel.userId}`\n        sleepToast(`\u2764\ufe0f \u6dfb\u52a0\u6536\u85cf\\n\u2764\ufe0f \u4ed6\u4eba\u6536\u85cf\\n\\n\u2705 \u5df2\u5c06\u3010${text}\u3011\u52a0\u5165\u6536\u85cf\u5217\u8868\u4e86\uff0c\u8bf7\u4e8e\u53d1\u73b0\u9875\u5237\u65b0\u540e\u67e5\u770b\\n\\n\u26a0\ufe0f \u8f93\u5165\u3010\u7528\u6237ID\u3011\u53ef\u5173\u6ce8\u5176\u4ed6\u7528\u6237\u7684\u6536\u85cf\\n\u9ed8\u8ba4\u5173\u6ce8\u5f53\u524d\u4f5c\u8005(\u7528\u6237)`)\n    }\n    \/\/ \u8f93\u5165\u7eaf\u6570\u5b57\uff0c\u6dfb\u52a0\u5bf9\u5e94ID\u7684\u4f5c\u8005\n    else if (!isNaN(word)) {\n        let user = getAjaxJson(urlUserDetailed(word)).body\n        likeAuthors.set(user.userId, user.name)\n        let text = `@${user.name} ${user.userId}`\n        sleepToast(`\u2764\ufe0f \u6dfb\u52a0\u6536\u85cf\\n\u2764\ufe0f \u4ed6\u4eba\u6536\u85cf\\n\\n\u2705 \u5df2\u5c06\u3010${text}\u3011\u52a0\u5165\u6536\u85cf\u5217\u8868\u4e86\uff0c\u8bf7\u4e8e\u53d1\u73b0\u9875\u5237\u65b0\u540e\u67e5\u770b`)\n    }\n\n    else if (word) {\n        sleepToast(`\u2764\ufe0f \u6dfb\u52a0\u6536\u85cf\\n\u2764\ufe0f \u4ed6\u4eba\u6536\u85cf\\n\\n\u26a0\ufe0f \u8f93\u5165\u3010\u7528\u6237ID\u3011\u53ef\u5173\u6ce8\u5176\u4ed6\u7528\u6237\u7684\u6536\u85cf`)\n    }\n    putInCacheMap(`likeAuthors`, likeAuthors)\n}\n\nfunction likeAuthorsDelete() {\n    let likeAuthors = getFromCacheMap(`likeAuthors`)\n    let word = String(result.get(\"\u8f93\u5165\u5185\u5bb9\")).trim()\n    if (word.startsWith(\"@\") || word.startsWith(\"\uff20\")) {\n        return sleepToast(`\ud83d\udda4 \u53d6\u6d88\u6536\u85cf\\n\u2764\ufe0f \u4ed6\u4eba\u6536\u85cf\\n\\n\u26a0\ufe0f \u4ec5\u652f\u6301\u901a\u8fc7\u3010\u4f5c\u8005ID\/\u4f5c\u8005\u540d\u79f0\u3011\u53d6\u5173\\n\u4e0d\u652f\u6301\u8f93\u5165 @\u4f5c\u8005\u540d\u79f0`)\n    } else if (word.startsWith(\"#\") || word.startsWith(\"\uff03\")) {\n        return sleepToast(`\ud83d\udda4 \u53d6\u6d88\u6536\u85cf\\n\u2764\ufe0f \u4ed6\u4eba\u6536\u85cf\\n\\n\u26a0\ufe0f \u4ec5\u652f\u6301\u901a\u8fc7\u3010\u4f5c\u8005ID\/\u4f5c\u8005\u540d\u79f0\u3011\u53d6\u5173\\n\u4e0d\u652f\u6301\u8f93\u5165 #\u6807\u7b7e\u540d\u79f0`)\n    }\n\n    if (word === \"\") {\n        let novel = getNovel()\n        likeAuthors.delete(novel.userId)\n        let text = `@${novel.userName} ${novel.userId}`\n        sleepToast(`\ud83d\udda4 \u53d6\u6d88\u6536\u85cf\\n\u2764\ufe0f \u4ed6\u4eba\u6536\u85cf\\n\\n\u2705 \u5df2\u53d6\u5173\u3010${text}\u3011\\n\\n\u8f93\u5165\u3010\u7528\u6237ID\u3011\u53ef\u53d6\u5173\u5176\u4ed6\u7528\u6237\\n\u9ed8\u8ba4\u53d6\u5173\u5f53\u524d\u4f5c\u8005(\u7528\u6237)`)\n\n    \/\/ \u8f93\u5165\u7eaf\u6570\u5b57\uff0c\u5220\u9664\u5bf9\u5e94ID\u7684\u4f5c\u8005\n    } else if (!isNaN(word) && likeAuthors.has(word)) {\n        let text = `@${likeAuthors.get(word)} ${word}`\n        likeAuthors.delete(word)\n        sleepToast(`\ud83d\udda4 \u53d6\u6d88\u6536\u85cf\\n\u2764\ufe0f \u4ed6\u4eba\u6536\u85cf\\n\\n\u2705 \u5df2\u53d6\u5173\u3010${text}\u3011`)\n\n    \/\/\u4f5c\u8005\u540d\u79f0\n    } else if (Array.from(likeAuthors.values()).includes(word)) {\n        let index = Array.from(likeAuthors.values()).indexOf(word)\n        let key = Array.from(likeAuthors.keys())[index]\n        let text = `@${likeAuthors.get(key)} ${key}`\n        likeAuthors.delete(key)\n        sleepToast(`\ud83d\udda4 \u53d6\u6d88\u6536\u85cf\\n\u2764\ufe0f \u4ed6\u4eba\u6536\u85cf\\n\\n\u2705 \u5df2\u53d6\u5173\u3010${text}\u3011`)\n    }\n    else if (word) {\n        sleepToast(`\ud83d\udda4 \u53d6\u6d88\u6536\u85cf\\n\u2764\ufe0f \u4ed6\u4eba\u6536\u85cf\\n\\n\u26a0\ufe0f \u8f93\u5165\u3010\u7528\u6237ID\u3011\u53ef\u53d6\u5173\u5176\u4ed6\u7528\u6237\u7684\u6536\u85cf`)\n    }\n    putInCacheMap(`likeAuthors`, likeAuthors)\n}\n\n\nfunction startBrowser(url, title) {\n    let msg = \"\", headers = `{\"headers\": {\"User-Agent\":\"${getWebViewUA()}\"}}`\n    if (url.includes(\"https:\/\/www.pixiv.net\")) {\n        if (url.includes(\"settings\")) msg += \"\u2699\ufe0f \u8d26\u53f7\u8bbe\u7f6e\"\n        else msg += \"\u2934\ufe0f \u5206\u4eab\u5c0f\u8bf4\"\n        msg += \"\\n\\n\u5373\u5c06\u6253\u5f00 Pixiv\\n\u8bf7\u786e\u8ba4\u5df2\u5f00\u542f\u4ee3\u7406\/\u68af\u5b50\/VPN\u7b49\"\n    } else if (url.includes(\"https:\/\/github.com\")) {\n        if (url.includes(\"issues\")) msg += \"\ud83d\udc1e \u53cd\u9988\u95ee\u9898\"\n        else if (url.includes(\"doc\")) msg += \"\ud83d\udd30 \u4f7f\u7528\u6307\u5357\"\n        else msg += \"\u2b50\ufe0f \u6536\u85cf\u9879\u76ee\"\n        msg += \"\\n\\n\u5373\u5c06\u6253\u5f00 Github\\n\u8bf7\u786e\u8ba4\u5df2\u5f00\u542f\u4ee3\u7406\/\u68af\u5b50\/VPN\u7b49\"\n    }\n    sleepToast(msg, 0.01)\n    java.startBrowser(`${url}, ${headers}`, title)\n}\n\nfunction shareFactory(type) {\n    let novel = getNovel()\n    if (novel === undefined || novel === null) return sleepToast(\"\u26a0\ufe0f \u8bf7\u5728\u5c0f\u8bf4\u9605\u8bfb\u9875\u9762\uff0c\u4f7f\u7528\u672c\u529f\u80fd\")\n    if (type.includes(\"author\")) {\n        startBrowser(urlUserUrl(novel.userId), novel.userName)\n    }\n    else if (type.includes(\"novel\") || (!novel.seriesId)) {\n        startBrowser(urlNovelUrl(novel.id), novel.title)\n    }\n    else if (type.includes(\"series\") && novel.seriesId) {\n        startBrowser(urlSeriesUrl(novel.seriesId), novel.seriesTitle)\n    }\n}\n\nfunction startPixivSettings() {\n    startBrowser(\"https:\/\/www.pixiv.net\/settings\/viewing\", \"\u8d26\u53f7\u8bbe\u7f6e\")\n}\nfunction startGithubIssue() {\n    startBrowser(\"https:\/\/github.com\/DowneyRem\/PixivSource\/issues\", \"\u53cd\u9988\u95ee\u9898\")\n}\nfunction startGithubReadme() {\n    startBrowser(\"https:\/\/downeyrem.github.io\/PixivSource\/Pixiv\", \"\u4f7f\u7528\u6307\u5357\")\n}\n\nfunction checkStatus(status) {\n    if (eval(String(status)) === true) return \"\u2764\ufe0f\"\n    else return \"\ud83d\udda4\"\n}\n\nfunction charpterReading() {\n    let novel = getNovel()\n    \/\/ let novel = source.getLoginInfoMap()\n    let msg = `\ud83d\udccc \u5f53\u524d\u7ae0\u8282\\n\\n${checkStatus(novel.isWatched)} \u7cfb\u5217\uff1a${novel.seriesTitle}\\n${checkStatus(novel.isBookmark)} \u7ae0\u8282\uff1a${novel.title}\\n\ud83d\udc64 \u4f5c\u8005\uff1a${novel.userName}\\n\\n\u5982\u975e\u5f53\u524d\u7ae0\u8282\uff0c\u8bf7\u5237\u65b0\u6b63\u6587`\n    msg = msg.replace(\"\ud83d\udda4 \u7cfb\u5217\uff1a\\n\", \"\")\n    sleepToast(msg, 2)\n}\n\nfunction readMeLogin() {\n    return sleepToast(`\ud83c\udd7f\ufe0f \u767b\u5f55\u754c\u9762\u529f\u80fd\\n\n    \u4f7f\u7528\u6536\u85cf\u3001\u8ffd\u66f4\u3001\u5173\u6ce8\u4f5c\u8005\u3001\u8bc4\u8bba\u7b49\u529f\u80fd\u65f6\uff0c\u9700\u8981\u767b\u5f55\n    \u4f7f\u7528\u524d\u8bf7\u5148\u5237\u65b0\u6b63\u6587\uff0c\u83b7\u53d6\u5f53\u524d\u7ae0\u8282\u4fe1\u606f\\n\n    \u70b9\u51fb\u3010\ud83d\udccc \u5f53\u524d\u7ae0\u8282\u3011\u67e5\u770b\u4e66\u6e90\u5185\u90e8\u7ae0\u8282\u4fe1\u606f`.replace(\"    \",\"\"), 5)\n}\n\nfunction readMeSearch() {\n    return sleepToast(`\ud83d\udd0d \u641c\u7d22\u8bf4\u660e\\n\n    \u6807\u7b7e\u4e4b\u95f4\u9700\u8981\u4ee5\u3010\u7a7a\u683c\u3011\u95f4\u9694\n    \u2796 \u6392\u9664\u6807\u7b7e\uff1a#\u6807\u7b7e1 -\u6807\u7b7e2\n    \ud83d\udc64 \u4f5c\u8005\u4e13\u641c\uff1a@\u641c\u7d22\u4f5c\u8005\u540d\u79f0\n    #\ufe0f \u6807\u7b7e\u4e13\u641c\uff1a#\u6807\u7b7e1 \u6807\u7b7e2 \n    \u23ec \u5b57\u6570\u7b5b\u90091\uff1a#\u6807\u7b7e1 \u6807\u7b7e2 \u5b57\u65703k5\n    \u23ec \u5b57\u6570\u7b5b\u90092\uff1a@\u4f5c\u8005\u7684\u540d\u79f0 \u5b57\u65703w5`.replace(\"    \",\"\"), 5)\n}\n\nlet settingsName = {\n    \"SEARCH_AUTHOR\": \"\ud83d\udd0d \u641c\u7d22\u4f5c\u8005\",\n    \"CONVERT_CHINESE\": \"\ud83c\udc04\ufe0f \u7e41\u7b80\u901a\u641c\",\n    \"SHOW_UPDATE_TIME\": \"\ud83d\udcc5 \u66f4\u65b0\u65f6\u95f4\",\n    \"SHOW_ORIGINAL_LINK\": \"\ud83d\udd17 \u539f\u59cb\u94fe\u63a5\",\n    \"SHOW_COMMENTS\": \"\ud83d\udcac \u663e\u793a\u8bc4\u8bba\",\n    \"MORE_INFORMATION\": \"\ud83d\udcd6 \u66f4\u591a\u7b80\u4ecb\",\n    \"REPLACE_TITLE_MARKS\": \"\ud83d\udcda \u6062\u590d\u300a\u300b\",\n    \"SHOW_CAPTIONS\": \"\ud83d\uddbc\ufe0f \u663e\u793a\u63cf\u8ff0\",\n    \"SHOW_LIKE_NOVELS\" :\"\u2764\ufe0f \u663e\u793a\u6536\u85cf\",\n    \"SHOW_WATCHED_SERIES\" :\"\ud83d\udcc3 \u663e\u793a\u8ffd\u66f4\",\n    \"IPDirect\": \"\u2708\ufe0f \u76f4\u8fde\u6a21\u5f0f\",\n    \"FAST\": \"\u23e9 \u5feb\u901f\u6a21\u5f0f\",\n    \"DEBUG\": \"\ud83d\udc1e \u8c03\u8bd5\u6a21\u5f0f\",\n    \/\/ \"\":\"Pixiv \u8bbe\u7f6e\",\n    \/\/ \"HIDE_AI_WORKS\":\"\u9690\u85cfAI\u4f5c\u54c1\",\n    \/\/ \"SENSITIVE_VIEW\":\"\u654f\u611f\u4f5c\u54c1\",\n    \/\/ \"USER_X_RESTRICT\":\"\u6210\u4eba\u8bbe\u7f6e\",\n    \/\/ \"READING_STATUS\":\"\u9605\u8bfb\u8fdb\u5ea6\",\n}\n\nfunction getPixivSettings() {\n    let settings = getFromCache(\"pixivSettings\")\n    let resp = getAjaxJson(\"https:\/\/www.pixiv.net\/ajax\/settings\/self\")\n    if (resp.error !== true) {\n        let siteSettings = resp.body.user_status\n        settings.HIDE_AI_WORKS = siteSettings.hide_ai_works\n        settings.SENSITIVE_VIEW = siteSettings.sensitive_view_setting\n        settings.USER_X_RESTRICT = siteSettings.user_x_restrict\n        settings.READING_STATUS = siteSettings.reading_status_enabled\n    } else {\n        settings.HIDE_AI_WORKS = false\n        settings.SENSITIVE_VIEW = 0\n        settings.USER_X_RESTRICT = 0\n        settings.READING_STATUS = false\n    }\n    putInCache(\"pixivSettings\", settings)\n    return settings\n}\n\nfunction editPixivSettingsHideAI() {\n    let settings = getPixivSettings()\n    \/\/ let settings = getFromCache(\"pixivSettings\")\n    let hideAiWorks = Number(!settings.HIDE_AI_WORKS)\n    let resp = getPostBody(\n        \"https:\/\/www.pixiv.net\/ajax\/settings\/self?lang=zh\",\n        {\"hideAiWorks\": hideAiWorks}\n    )\n\n    if (resp.error === true) sleepToast(`\u26a0\ufe0f \u9690\u85cfAI\u4f5c\u54c1 \u5931\u8d25`, 1)\n    else if (hideAiWorks === 1) sleepToast(`\u26a0\ufe0f \u9690\u85cfAI\u4f5c\u54c1\\n\\n\u2705 \u5df2 \u9690\u85cfAI\u4f5c\u54c1`)\n    else sleepToast(`\u26a0\ufe0f \u9690\u85cfAI\u4f5c\u54c1\\n\\n\u2705 \u5df2\u53d6\u6d88 \u9690\u85cfAI\u4f5c\u54c1`)\n    settings.HIDE_AI_WORKS = Boolean(hideAiWorks)\n    putInCache(\"pixivSettings\", settings)\n}\n\nfunction editPixivSettingsXRestrict() {\n    let settings = getPixivSettings()\n    \/\/ let settings = getFromCache(\"pixivSettings\")\n    let userXRestrict = settings.USER_X_RESTRICT + 1\n    if (userXRestrict === 3) userXRestrict = 0\n    let resp = getPostBody(\n        \"https:\/\/www.pixiv.net\/ajax\/settings\/user_x_restrict\",\n        {\"userXRestrict\": userXRestrict}\n    )\n\n    if (resp.error === true) sleepToast(`\u26a0\ufe0f \u6210\u4eba\u4f5c\u54c1 \u5931\u8d25`, 1)\n    else if (hideAiWorks === 0) sleepToast(`\u26a0\ufe0f \u6210\u4eba\u4f5c\u54c1\\n\\n\u2705 \u5df2\u5173\u95ed \u6210\u4eba\u4f5c\u54c1`)\n    else if (hideAiWorks === 1) sleepToast(`\u26a0\ufe0f \u6210\u4eba\u4f5c\u54c1\\n\\n\u2705 \u5df2\u5f00\u542f R-18\u4f5c\u54c1`)\n    else sleepToast(`\u26a0\ufe0f \u6210\u4eba\u4f5c\u54c1\\n\\n\u2705 \u5df2\u5f00\u542f R-18G\u4f5c\u54c1`)\n    settings.HIDE_AI_WORKS = userXRestrict\n    putInCache(\"pixivSettings\", settings)\n}\n\nfunction editPixivSettingsSensitiveView() {\n    let settings = getPixivSettings()\n    \/\/ let settings = getFromCache(\"pixivSettings\")\n    let sensitiveView = Number(!settings.SENSITIVE_VIEW)\n    let resp = getPostBody(\n        \"https:\/\/www.pixiv.net\/ajax\/settings\/sensitive_view_setting\",\n        {\"sensitiveViewSetting\": sensitiveView}\n    )\n\n    if (resp.error === true) sleepToast(`\u26a0\ufe0f \u654f\u611f\u4f5c\u54c1 \u5931\u8d25`, 1)\n    else if (sensitiveView === 0) {sleepToast(`\u26a0\ufe0f \u654f\u611f\u4f5c\u54c1\\n\\n\u2705 \u5df2\u9690\u85cf \u654f\u611f\u4f5c\u54c1`)}\n    else sleepToast(`\u26a0\ufe0f \u654f\u611f\u4f5c\u54c1\\n\\n\u2705 \u5df2\u663e\u793a \u654f\u611f\u4f5c\u54c1`)\n    settings.SENSITIVE_VIEW = sensitiveView\n    putInCache(\"pixivSettings\", settings)\n}\n\nfunction statusMsg(status) {\n    if (status === true) return \"\u2705 \u5df2\u5f00\u542f\"\n    else if (status === false) return \"\ud83d\udeab \u5df2\u5173\u95ed\"\n    else return \"\ud83c\ude1a\ufe0f \u672a\u8bbe\u7f6e\"\n}\n\n\/\/ \u68c0\u6d4b\u5feb\u901f\u6a21\u5f0f\u4fee\u6539\u76844\u4e2a\u8bbe\u7f6e\nfunction getSettingStatus(mode) {\n    if (mode === undefined) mode = \"\"\n    let keys = [], msgList = []\n    let settings = getFromCache(\"pixivSettings\")\n    if (mode === \"FAST\") {\n        keys = Object.keys(settingsName).slice(0, 5)\n    } else if (mode === \"IPDirect\") {\n        keys = [Object.keys(settingsName)[0], Object.keys(settingsName)[3]]\n    } else {\n        keys = Object.keys(settingsName)\n    }\n    for (let i in keys) {\n        msgList.push(`${statusMsg(settings[keys[i]])}\u3000${settingsName[keys[i]]}`)\n    }\n    return msgList.join(\"\\n\").trim()\n}\n\nfunction showSettings() {\n    sleepToast(`\u2699\ufe0f \u5f53\u524d\u8bbe\u7f6e\\n\\n${getSettingStatus()}`)\n}\n\nfunction editSettings(object) {\n    let msg, status\n    let settings = getFromCache(\"pixivSettings\")\n    if (object === \"\") {\n        settings.SEARCH_AUTHOR = true       \/\/ \u641c\u7d22\uff1a\u9ed8\u8ba4\u641c\u7d22\u4f5c\u8005\u540d\u79f0\n        settings.CONVERT_CHINESE = true     \/\/ \u641c\u7d22\uff1a\u641c\u7d22\u65f6\u8fdb\u884c\u7e41\u7b80\u8f6c\u6362\n        settings.SHOW_LIKE_NOVELS = true    \/\/ \u641c\u7d22\uff1a\u641c\u7d22\u7ed3\u679c\u663e\u793a\u6536\u85cf\u5c0f\u8bf4\n        settings.SHOW_WATCHED_SERIES = true \/\/ \u641c\u7d22\uff1a\u641c\u7d22\u7ed3\u679c\u663e\u793a\u8ffd\u6574\u7cfb\u5217\u5c0f\u8bf4\n\n        settings.MORE_INFORMATION = false   \/\/ \u8be6\u60c5\uff1a\u4e66\u7c4d\u7b80\u4ecb\u663e\u793a\u66f4\u591a\u4fe1\u606f\n        settings.SHOW_UPDATE_TIME = true    \/\/ \u76ee\u5f55\uff1a\u663e\u793a\u66f4\u65b0\u65f6\u95f4\uff0c\u4f46\u4f1a\u589e\u52a0\u5c11\u8bb8\u8bf7\u6c42\n        settings.SHOW_ORIGINAL_LINK = true  \/\/ \u76ee\u5f55\uff1a\u663e\u793a\u539f\u59cb\u94fe\u63a5\uff0c\u4f46\u4f1a\u589e\u52a0\u5927\u91cf\u8bf7\u6c42\n\n        settings.REPLACE_TITLE_MARKS = true \/\/ \u6b63\u6587\uff1a\u6ce8\u97f3\u5185\u5bb9\u4e3a\u6c49\u5b57\u65f6\uff0c\u66ff\u6362\u4e3a\u4e66\u540d\u53f7\n        settings.SHOW_CAPTIONS = true       \/\/ \u6b63\u6587\uff1a\u7ae0\u9996\u663e\u793a\u63cf\u8ff0\n        settings.SHOW_COMMENTS = true       \/\/ \u6b63\u6587\uff1a\u7ae0\u5c3e\u663e\u793a\u8bc4\u8bba\n\n        settings.IPDirect  = false          \/\/ \u5168\u5c40\uff1a\u5feb\u901f\u6a21\u5f0f\n        settings.FAST  = false              \/\/ \u5168\u5c40\uff1a\u5feb\u901f\u6a21\u5f0f\n        settings.DEBUG = false              \/\/ \u5168\u5c40\uff1a\u8c03\u8bd5\u6a21\u5f0f\n        putInCache(\"pixivSettings\", settings)\n        msg = `\\n\u2705 \u5df2\u6062\u590d\u3000\ud83d\udd27 \u9ed8\u8ba4\u8bbe\u7f6e\\n\\n${getSettingStatus()}`\n\n    } else if (object === \"FAST\") {\n        if (settings[object] === true) {\n            settings.FAST = false                \/\/ \u5173\u95ed\uff1a\u5feb\u901f\u6a21\u5f0f\n            settings.SEARCH_AUTHOR = true        \/\/ \u641c\u7d22\uff1a\u9ed8\u8ba4\u641c\u7d22\u4f5c\u8005\n            settings.CONVERT_CHINESE = true      \/\/ \u641c\u7d22\uff1a\u7e41\u7b80\u901a\n            settings.SHOW_UPDATE_TIME = true     \/\/ \u76ee\u5f55\uff1a\u663e\u793a\u7ae0\u8282\u66f4\u65b0\u65f6\u95f4\n            settings.SHOW_ORIGINAL_LINK = true   \/\/ \u76ee\u5f55\uff1a\u663e\u793a\u7ae0\u8282\u6e90\u94fe\u63a5\n            settings.SHOW_COMMENTS = true        \/\/ \u6b63\u6587\uff1a\u663e\u793a\u8bc4\u8bba\n        } else {\n            settings.FAST = true\n            settings.SEARCH_AUTHOR = false        \/\/ \u641c\u7d22\uff1a\u9ed8\u8ba4\u641c\u7d22\u4f5c\u8005\n            settings.CONVERT_CHINESE = false      \/\/ \u641c\u7d22\uff1a\u7e41\u7b80\u901a\u641c\n            settings.SHOW_UPDATE_TIME = false     \/\/ \u76ee\u5f55\uff1a\u663e\u793a\u7ae0\u8282\u66f4\u65b0\u65f6\u95f4\n            settings.SHOW_ORIGINAL_LINK = false   \/\/ \u76ee\u5f55\uff1a\u663e\u793a\u7ae0\u8282\u6e90\u94fe\u63a5\n            settings.SHOW_COMMENTS = false        \/\/ \u6b63\u6587\uff1a\u663e\u793a\u8bc4\u8bba\n\n        }\n        putInCache(\"pixivSettings\", settings)\n        let status = settings[object]\n        let message = getSettingStatus(\"FAST\")\n        msg = `\\n${statusMsg(status)}\u3000${settingsName[object]}\\n\\n${message}`\n\n    } else if (object === \"IPDirect\") {\n        if (settings[object] === true) {\n            settings.IPDirect = false            \/\/ \u5173\u95ed\uff1a\u76f4\u8fde\u6a21\u5f0f\n            settings.SEARCH_AUTHOR = true        \/\/ \u641c\u7d22\uff1a\u9ed8\u8ba4\u5173\u95ed\u641c\u7d22\u4f5c\u8005\u540d\u79f0\n            settings.SHOW_ORIGINAL_LINK = true   \/\/ \u76ee\u5f55\uff1a\u4e0d\u663e\u793a\u7ae0\u8282\u6e90\u94fe\u63a5\n        } else {\n            settings.IPDirect = true\n            settings.SEARCH_AUTHOR = false       \/\/ \u641c\u7d22\uff1a\u9ed8\u8ba4\u5173\u95ed\u641c\u7d22\u4f5c\u8005\u540d\u79f0\n            settings.SHOW_ORIGINAL_LINK = false  \/\/ \u76ee\u5f55\uff1a\u4e0d\u663e\u793a\u7ae0\u8282\u6e90\u94fe\u63a5\n        }\n        putInCache(\"pixivSettings\", settings)\n        let status = settings[object]\n        let message = getSettingStatus(\"IPDirect\")\n        msg = `\\n${statusMsg(status)}\u3000${settingsName[object]}\\n\\n${message}`\n\n    } else {\n        if (!!settings[object]) {\n            status = settings[object] = !settings[object]\n        } else {\n            status = settings[object] = true  \/\/ \u65e0\u8bbe\u7f6e\u5219\u9ed8\u8ba4\u5f00\u542f\n        }\n        putInCache(\"pixivSettings\", settings)\n        msg = `${statusMsg(status)}\u3000${settingsName[object]}`\n    }\n    sleepToast(msg)\n    putInCache(\"pixivSettings\", settings)\n}\n\nfunction cleanCache() {\n    let novel = getNovel()\n    cache.delete(`${urlNovelUrl(novel.id)}`)\n    cache.delete(`${urlNovelDetailed(novel.id)}`)\n    \/\/ cache.delete(`${urlSearchNovel(novel.title, 1)}`)\n    \/\/ if (novel.seriesId) {\n    \/\/     cache.delete(`${urlSeriesUrl(novel.seriesId)}`)\n    \/\/     cache.delete(`${urlSeriesDetailed(novel.seriesId)}`)\n    \/\/     cache.delete(`${urlSearchSeries(novel.seriesTitle, 1)}`)\n    \/\/ }\n    sleepToast(`\ud83e\uddf9 \u6e05\u9664\u7f13\u5b58\\n\\n\ud83d\udccc \u5f53\u524d\u7ae0\u8282\uff1a${novel.title}\\n\\n\u5df2\u6e05\u9664\u672c\u7ae0\u6b63\u6587\u7f13\u5b58\uff0c\u5237\u65b0\u6b63\u6587\u4ee5\u66f4\u65b0`, 5)\n}\n\nlet maxPagesName = {\n    \"seriesMaxPages\": \"\u7cfb\u5217\u6700\u5927\u9875\u7801\",\n    \"novelsMaxPages\": \"\u5355\u7bc7\u6700\u5927\u9875\u7801\"\n}\n\nfunction showMaxPages() {\n    let keys = Object.keys(maxPagesName)\n    let key = getFromCache(\"maxPagesKey\")\n\n    \/\/ \u5207\u6362\u5217\u8868\n    let index = keys.indexOf(key) + 1\n    if (index === keys.length) index = 0\n    key = keys[index]\n    putInCache(\"maxPagesKey\", key)\n\n    return sleepToast(`\ud83d\udcc4 \u641c\u7d22\u9875\u7801\\n\u8bbe\u7f6e #\ufe0f\u20e3 \u641c\u7d22\u6807\u7b7e\u7684\u6700\u5927\u9875\u7801\u6570\\n\n    \u5f53\u524d${maxPagesName[keys[0]]}\uff1a${getFromCache(keys[0])}\\n\u5f53\u524d${maxPagesName[keys[1]]}\uff1a${getFromCache(keys[1])}\\n\n    \u70b9\u51fb \u23eb \u589e\u52a0\u9875\u7801\/ \u23ec \u51cf\u5c11\u9875\u7801\\n\u8c03\u6574\u3010${maxPagesName[key]}\u3011\\n\n    \ud83d\udccc \u9875\u7801\u8d8a\u591a\uff0c\u5c0f\u8bf4\u8d8a\u591a\uff0c\u901f\u5ea6\u8d8a\u6162`.replace(\"    \", \"\"))\n}\n\nfunction editMaxPages(method) {\n    let msg = \"\", key = getFromCache(\"maxPagesKey\")\n    if (!key) key = Object.keys(maxPagesName)[0]\n    let maxPages = getFromCache(key)\n    if (!maxPages) maxPages = 1\n    if (method.includes(\"add\")) maxPages += 1\n    if (method.includes(\"min\")) maxPages -= 1\n\n    if (maxPages <= 1) {\n        maxPages = 1\n        msg += \"\u26a0\ufe0f \u641c\u7d22\u9875\u7801\u4e0d\u80fd\u518d\u51cf\u5c0f\u4e86\\n\"\n    }\n    if (maxPages >= 3) {\n        msg += \"\u26a0\ufe0f \u641c\u7d22\u9875\u7801\u8d8a\u591a\uff0c\u641c\u7d22\u901f\u5ea6\u8d8a\u6162\\n\"\n    }\n    if (maxPages >= 10) {\n        maxPages = 10\n        msg += \"\u26a0\ufe0f \u641c\u7d22\u9875\u7801\u4e0d\u80fd\u518d\u589e\u5927\u4e86\\n\"\n    }\n    putInCache(`${key}`, maxPages)\n    sleepToast(`\ud83d\udcc4 \u641c\u7d22\u9875\u7801\\n\\n\u5f53\u524d\u641c\u7d22\u3010${maxPagesName[key]}\u3011\uff1a${maxPages}\\n\\n${(msg)}`.trim())\n    return maxPages\n}","respondTime":180000,"ruleBookInfo":{"author":"userName","canReName":"true","coverUrl":"coverUrl","init":"@js:\nvar util = objParse(String(java.get(\"util\")))\n\nfunction objParse(obj) {\n    return JSON.parse(obj, (n, v) => {\n        if (typeof v == \"string\" && v.match(\"()\")) {\n            return eval(`(${v})`)\n        }\n        return v;\n    })\n}\n\nfunction novelHandler(novel){\n    novel = util.formatNovels(util.handNovels([novel]))[0]\n    if (novel.seriesId === undefined || novel.seriesId === null) {\n        book.bookUrl = novel.detailedUrl = urlNovelUrl(novel.id)\n        book.tocUrl = novel.catalogUrl = urlIP(urlNovelDetailed(novel.id))\n    } else {\n        book.bookUrl = novel.detailedUrl = urlSeriesUrl(novel.seriesId)\n        book.tocUrl = novel.catalogUrl = urlIP(urlSeriesDetailed(novel.seriesId))\n    }\n    \/\/ \u653e\u5165\u4fe1\u606f\u4ee5\u4fbf\u767b\u9646\u754c\u9762\u4f7f\u7528\n    source.putLoginInfo(JSON.stringify(novel))\n    cache.put(\"novel\", JSON.stringify(novel))\n    return novel\n}\n\n(() => {\n    return novelHandler(util.getNovelResFirst(result))\n})()","intro":"description","kind":"tags","lastChapter":"latestChapter","name":"title","tocUrl":"catalogUrl","wordCount":"textCount"},"ruleContent":{"content":"@js:\nvar util = objParse(String(java.get(\"util\")))\nlet emoji = {\n    \"normal\": 101, \"surprise\": 102, \"series\": 103, \"heaven\": 104, \"happy\": 105,\n    \"excited\": 106, \"sing\": 107, \"cry\": 108, \"normal2\": 201, \"shame2\": 202,\n    \"love2\": 203, \"interesting2\": 204, \"blush2\": 205, \"fire2\": 206, \"angry2\": 207,\n    \"shine2\": 208, \"panic2\": 209, \"normal3\": 301, \"satisfaction3\": 302, \"surprise3\": 303,\n    \"smile3\": 304, \"shock3\": 305, \"gaze3\": 306, \"wink3\": 307, \"happy3\": 308,\n    \"excited3\": 309, \"love3\": 310, \"normal4\": 401, \"surprise4\": 402, \"series4\": 403,\n    \"love4\": 404, \"shine4\": 405, \"sweet4\": 406, \"shame4\": 407, \"sleep4\": 408,\n    \"heart\": 501, \"teardrop\": 502, \"star\": 503\n}\n\nfunction objParse(obj) {\n    return JSON.parse(obj, (n, v) => {\n        if (typeof v == \"string\" && v.match(\"()\")) {\n            return eval(`(${v})`)\n        }\n        return v;\n    })\n}\n\nfunction getNovelInfo(res) {\n    \/\/ \u653e\u5165\u5c0f\u8bf4\u4fe1\u606f\u4ee5\u4fbf\u767b\u9646\u754c\u9762\u4f7f\u7528\n    let novel = source.getLoginInfoMap()\n    if (novel === undefined) novel = JSON.parse(cache.get(\"novel\"))\n    if (res && res.error === true) return\n    novel.id = Number(res.id)\n    novel.title = res.title\n    novel.userId = res.userId\n    novel.userName = res.userName\n\n    if (res.bookmarkData) {\n        novel.isBookmark = true\n        cache.put(`collect${novel.id}`, res.bookmarkData.id)\n        util.saveNovels(\"likeNovels\", [Number(novel.id)])\n    } else {\n        novel.isBookmark = false\n    }\n\n    if (res.seriesNavData) {\n        novel.seriesId = Number(res.seriesNavData.seriesId)\n        novel.seriesTitle = res.seriesNavData.title\n        novel.isWatched = res.seriesNavData.isWatched\n        util.saveNovels(\"watchedSeries\", [Number(novel.seriesId)])\n    } else {\n        novel.seriesId = null\n        novel.seriesTitle = \"\"\n        novel.isWatched = false\n    }\n\n    \/\/ \u7cfb\u5217 + \u9605\u8bfb\uff0c\u4f7f\u7528\u5f53\u524d\u7ae0\u8282\u540d\u79f0\n    if (novel.seriesId && util.environment.IS_LEGADO) {\n        let novelIds = JSON.parse(cache.get(`novelIds${novel.seriesId}`))\n        novel.id = novelIds[book.durChapterIndex]\n        novel.title = book.durChapterTitle\n\n        let bookmarkId = JSON.parse(cache.get(`collect${novel.id}`))\n        novel.isBookmark = !!bookmarkId\n    }\n\n    \/\/ \u6dfb\u52a0\u6295\u7968\u4fe1\u606f\n    if (res.pollData) novel.pollChoicesCount = res.pollData.choices.length\n    else novel.pollChoicesCount = 0\n    source.putLoginInfo(JSON.stringify(novel))\n    cache.put(\"novel\", JSON.stringify(novel))\n}\n\nfunction getContent(res) {\n    getNovelInfo(res)  \/\/ \u653e\u5165\u4fe1\u606f\u4ee5\u4fbf\u767b\u9646\u754c\u9762\u4f7f\u7528\n    let content = String(res.content)\n    \/\/ let content = \"undefined\"\n    if (content.includes(\"undefined\")) {\n        return checkContent()\n    }\n\n    \/\/ \u5728\u6b63\u6587\u5185\u90e8\u6dfb\u52a0\u5c0f\u8bf4\u63cf\u8ff0\n    if (util.settings.SHOW_CAPTIONS && res.description !== \"\") {\n        content = res.description + \"\\n\" + \"\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\\n\".repeat(2) + content\n    }\n\n    \/\/ \u83b7\u53d6 [uploadedimage:] \u7684\u56fe\u7247\u94fe\u63a5\n    if (res.textEmbeddedImages) {\n        Object.keys(res.textEmbeddedImages).forEach((key) => {\n            content = content.replace(`[uploadedimage:${key}]`, `<img src=\"${urlCoverUrl(res.textEmbeddedImages[key].urls.original)}\">`)\n        })\n    }\n\n    \/\/ \u83b7\u53d6 [pixivimage:] \u7684\u56fe\u7247\u94fe\u63a5 [pixivimage:1234] [pixivimage:1234-1]\n    let matched = content.match(RegExp(\/\\[pixivimage:(\\d+)-?(\\d+)]\/gm))\n    if (matched) {\n        matched.forEach(pixivimage => {\n            let matched2, illustId, order = 0\n            if (pixivimage.includes(\"-\")) {\n                matched2 = pixivimage.match(RegExp(\"(\\\\d+)-(\\\\d+)\"))\n                illustId = matched2[1]; order = matched2[2]\n            } else {\n                matched2 = pixivimage.match(RegExp(\"\\\\d+\"))\n                illustId = matched2[0];\n            }\n            if (urlIllustOriginal(illustId, order)) {\n                content = content.replace(`${pixivimage}`, `<img src=\"${urlIllustOriginal(illustId, order)}\">`)\n            } else {\n                content = content.replace(`${pixivimage}`, ``)\n            }\n        })\n    }\n\n    \/\/ \u66ff\u6362 Pixiv \u5206\u9875\u6807\u8bb0\u7b26\u53f7 [newpage]\n    matched = content.match(RegExp(\/[ \u3000]*\\[newpage][ \u3000]*\/gm))\n    if (matched) {\n        for (let i in matched) {\n            content = content.replace(`${matched[i]}`, `${\"<p>\u200b<p\/>\".repeat(3)}`)\n        }\n    }\n\n    \/\/ \u66ff\u6362 Pixiv \u7ae0\u8282\u6807\u8bb0\u7b26\u53f7 [chapter:]\n    matched = content.match(RegExp(\/\\[chapter:(.*?)]\/gm))\n    if (matched) {\n        for (let i in matched) {\n            let matched2 = matched[i].match(\/\\[chapter:(.*?)]\/m)\n            let chapter = matched2[1].trim()\n            content = content.replace(`${matched[i]}`, `${chapter}<p>\u200b<p\/>`)\n        }\n    }\n\n    \/\/ \u66ff\u6362 Pixiv \u8df3\u8f6c\u9875\u9762\u6807\u8bb0\u7b26\u53f7 [[jump:]]\n    matched = content.match(RegExp(\/\\[jump:(\\d+)]\/gm))\n    if (matched) {\n        for (let i in matched) {\n            let page = matched[i].match(\/\\d+\/)\n            content = content.replace(`${matched[i]}`, `\\n\\n\u8df3\u8f6c\u81f3\u7b2c${page}\u8282`)\n        }\n    }\n\n    \/\/ \u66ff\u6362 Pixiv \u94fe\u63a5\u6807\u8bb0\u7b26\u53f7 [[jumpuri: > ]]\n    matched = content.match(RegExp(\/\\[\\[jumpuri:(.*?)>(.*?)]]\/gm))\n    if (matched) {\n        for (let i in matched) {\n            let matched2 = matched[i].match(\/\\[\\[jumpuri:(.*?)>(.*?)]]\/m)\n            let matchedText = matched2[0]\n            let urlName = matched2[1].trim()\n            let urlLink = matched2[2].trim()\n            \/\/ \u9605\u8bfb\u4e0d\u652f\u6301\u8d85\u94fe\u63a5\n            \/\/content = content.replace(`${matchedText}`, `<a href=${urlLink}>${urlName}<\/a>`)\n            if (urlLink === urlName) {\n                content = content.replace(`${matchedText}`, `${urlName}`)\n            } else {\n                content = content.replace(`${matchedText}`, `${urlName}: ${urlLink}`)\n            }\n        }\n    }\n\n    \/\/ \u66ff\u6362 Pixiv \u6ce8\u97f3\u6807\u8bb0\u7b26\u53f7 [[rb: > ]]\n    matched = content.match(RegExp(\/\\[\\[rb:(.*?)>(.*?)]]\/gm))\n    if (matched) {\n        for (let i in matched) {\n            let matched2 = matched[i].match(\/\\[\\[rb:(.*?)>(.*?)]]\/m)\n            let matchedText = matched2[0]\n            let kanji = matched2[1].trim()\n            let kana = matched2[2].trim()\n\n            if (!util.settings.REPLACE_TITLE_MARKS) {\n                \/\/ \u9ed8\u8ba4\u66ff\u6362\u6210\uff08\u62ec\u53f7\uff09\n                content = content.replace(`${matchedText}`, `${kanji}\uff08${kana}\uff09`)\n            } else {\n                let reg = RegExp(\"[\\\\u4E00-\\\\u9FFF]+\", \"g\");\n                if (reg.test(kana)) {\n                    \/\/ kana\u4e3a\u4e2d\u6587\uff0c\u5219\u66ff\u6362\u56de\u300a\u4e66\u540d\u53f7\u300b\n                    content = content.replace(`${matchedText}`, `${kanji}\u300a${kana}\u300b`)\n                } else {\n                    \/\/ \u9605\u8bfb\u4e0d\u652f\u6301 <ruby> <rt> \u6ce8\u97f3\n                    \/\/ content = content.replace(`${matchedText}`, `<ruby>${kanji}<rt>${kana}<\/rt><\/ruby>`)\n                    content = content.replace(`${matchedText}`, `${kanji}\uff08${kana}\uff09`)\n                }\n            }\n        }\n    }\n\n    \/\/ \u6dfb\u52a0\u6295\u7968\n    if (res.pollData) {\n        let poll = `\ud83d\udcc3 \u6295\u7968(\u2705${res.pollData.total}\u5df2\u6295)\uff1a\\n${res.pollData.question}\\n`\n        res.pollData.choices.forEach(choice => {\n            poll += `\u9009\u9879${choice.id}\uff1a${choice.text}(\u2705${choice.count})\\n`\n        })\n        content += \"\\n\" + \"\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\\n\".repeat(2) + poll\n    }\n\n    \/\/ \u6dfb\u52a0\u8bc4\u8bba\n    if (util.settings.SHOW_COMMENTS) {\n        return content + getComment(res)\n    } else {\n        return content\n    }\n}\n\nfunction getComment(res) {\n    \/\/ let resp = getAjaxJson(urlIP(urlNovelComments(res.id, 0, res.commentCount)), true)\n    const limit = 50  \/\/ \u6a21\u62df Pixiv \u8bf7\u6c42\n    let resp = {\"error\": false, \"message\": \"\", \"body\": {comments:[]} }\n    let maxPage = (res.commentCount \/ limit) + 1\n    for (let i = 0; i < maxPage; i++) {\n        let result = getAjaxJson(urlIP(urlNovelComments(res.id, i*limit, 50)), true)\n        if (result.error !== true && result.body.comments !== null) {\n            resp.body.comments = resp.body.comments.concat(result.body.comments)\n        }\n    }\n\n    \/\/ \u5237\u65b0\u65f6\uff0c\u5237\u65b0\u8bc4\u8bba\uff0c\u4e0d\u66f4\u65b0\u6b63\u6587\n    let commentCount = resp.body.comments.length\n    java.log(`\u3010${res.title}\u3011(${res.id})\uff0c\u5171\u6709${commentCount}\u6761\u8bc4\u8bba\uff0c${res.commentCount - commentCount}\u6761\u56de\u590d`)\n    if (commentCount === 0) {\n        return \"\"\n    }\n\n    let comments = `\ud83d\udcac \u8bc4\u8bba(\u5171\u8ba1${commentCount}\u6761)\uff1a\\n`\n    resp.body.comments.forEach(comment => {\n        if (comment.comment === \"\") {\n            comment.comment = `<img src=\"${urlStampUrl(comment.stampId)}\">`\n        }\n        if (Object.keys(emoji).includes(comment.comment.slice(1, -1))) {\n            comment.emojiId = emoji[comment.comment.slice(1, -1)]\n            comment.comment = `<img src=\"${urlEmojiUrl(comment.emojiId)}\">`\n        }\n        if (comment.userId === String(cache.get(\"pixiv:uid\"))) {\n            comments += `@${comment.userName}\uff1a${comment.comment}(${comment.commentDate})(${comment.id})\\n`\n        } else {\n            comments += `@${comment.userName}\uff1a${comment.comment}(${comment.commentDate})\\n`\n        }\n\n        \/\/ \u83b7\u53d6\u8bc4\u8bba\u56de\u590d\n        if (comment.hasReplies === true) {\n            let resp = getAjaxJson(urlIP(urlNovelCommentsReply(comment.id, 1)), true)\n            if (resp.error === true) return comments\n\n            resp.body.comments.reverse().forEach(reply => {\n                if (reply.comment === \"\") {\n                    reply.comment = `<img src=\"${urlStampUrl(reply.stampId)}\">`\n                }\n                if (Object.keys(emoji).includes(reply.comment.slice(1, -1))) {\n                    reply.emojiId = emoji[reply.comment.slice(1, -1)]\n                    reply.comment = `<img src=\"${urlEmojiUrl(reply.emojiId)}\">`\n                }\n                if (comment.userId === String(cache.get(\"pixiv:uid\"))) {\n                    comments += `@${reply.userName}(\u2934\ufe0f@${reply.replyToUserName})\uff1a${reply.comment}(${reply.commentDate})(${reply.id})\\n`\n                } else {\n                    comments += `@${reply.userName}(\u2934\ufe0f@${reply.replyToUserName})\uff1a${reply.comment}(${reply.commentDate})\\n`\n                }\n            })\n            comments += \"\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\\n\"\n        }\n    })\n    if (comments) {\n        comments = \"\\n\" + \"\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\\n\".repeat(2) + comments\n    }\n    return comments\n}\n\nfunction checkContent() {\n    let latestMsg = getAjaxJson(urlMessageThreadLatest(5))\n    if (latestMsg.error === true) {\n        java.log(JSON.stringify(latestMsg))\n\n    } else if (latestMsg.body.total >= 1) {\n        let msg = latestMsg.body.message_threads.filter(item => item.thread_name === \"pixiv\u4e8b\u52d9\u5c40\")[0]\n        if (msg === undefined) {\n            sleepToast(`\u60a8\u4e8e ${java.timeFormat(new Date().getTime())} \u89e6\u53d1 Pixiv \u3010\u8bf7\u6c42\u9650\u5236\u3011\uff0c\u5efa\u8bae\u7a0d\u5019\/\u91cd\u65b0\u767b\u5f55\u518d\u7ee7\u7eed`, 3)\n            \/\/ java.startBrowser(\"https:\/\/www.pixiv.net\", '\u9000\u51fa\u767b\u5f55')\n            \/\/ java.startBrowser(\"https:\/\/www.pixiv.net\/logout.php\",'\u9000\u51fa\u767b\u5f55')  \/\/ \u4e0d\u6e05\u9664 WebView \u7f13\u5b58\u65e0\u6cd5\u91cd\u65b0\u767b\u5f55\n\n        } else if (new Date().getTime()- 1000*msg.modified_at <= 3*24*60*60*1000) { \/\/ 3*24h\u5185\u63d0\u9192\n            sleepToast(`\u60a8\u4e8e ${java.timeFormat(1000*msg.modified_at)} \u89e6\u53d1 Pixiv \u3010\u8fc7\u5ea6\u8bbf\u95ee\u3011\uff0c\u8bf7\u4fee\u6539\u5bc6\u7801\u5e76\u91cd\u65b0\u767b\u5f55`, 3)\n            sleepToast(`${msg.latest_content}`, 5)\n            java.startBrowser(\"https:\/\/accounts.pixiv.net\/password\/change\",'\u4fee\u6539\u5bc6\u7801')\n        }\n    }\n}\n\n(() => {\n    return getContent(util.getNovelResFirst(result))\n})()","imageStyle":"DEFAULT"},"ruleExplore":{"author":"userName","bookList":"@js:\nvar util = objParse(String(java.get(\"util\")))\nvar seriesSet = new Set();  \/\/ \u5b58\u50a8seriesID \u6709BUG\u65e0\u6cd5\u5904\u7406\u7ffb\u9875\n\nfunction objParse(obj) {\n    return JSON.parse(obj, (n, v) => {\n        if (typeof v == \"string\" && v.match(\"()\")) {\n            return eval(`(${v})`)\n        }\n        return v;\n    })\n}\n\nfunction handlerFactory() {\n    if (baseUrl.includes(\"https:\/\/cdn.jsdelivr.net\")) {\n        return () => {updateSource(); return []}\n    }\n    if (!isLogin()) {\n        return handlerNoLogin()\n    }\n    if (baseUrl.includes(\"\/bookmark\")) {\n        return handlerBookMarks()\n    }\n    if (baseUrl.includes(\"\/top\")) {\n        return handlerRecommend()\n    }\n    if (baseUrl.includes(\"\/follow_latest\")) {\n        return handlerFollowLatest()\n    }\n    if (baseUrl.includes(\"\/watch_list\")) {\n        return handlerWatchList()\n    }\n    if (baseUrl.includes(\"\/discovery\")) {\n        return handlerDiscovery()\n    }\n    if (baseUrl.includes(\"\/new\")) {\n        return handlerDiscovery()\n    }\n    if (baseUrl.includes(\"\/commission\/\")) {\n        return handlerFollowLatest()\n    }\n    if (baseUrl.includes(\"\/user_event\/portal\")) {\n        return handlerFollowLatest()\n    }\n    if (baseUrl.includes(\"\/genre\")) {\n        return handlerWatchList()\n    }\n    \/\/ \u6b63\u5219\u5339\u914d\u7f51\u5740\u5185\u5bb9\n    if (baseUrl.includes(\"\/ranking\")) {\n        return handlerRanking()\n    }\n    if (baseUrl.includes(\"\/marker_all\")) {\n        return handlerRanking()\n    }\n    if (baseUrl.includes(\"\/editors_picks\")) {\n        return handlerRanking()\n    }\n    if (baseUrl.includes(\"\/ajax\/search\/novels\")) {\n        return handlerSearch()\n    }\n    if (baseUrl.startsWith(\"https:\/\/www.pixiv.net\")) {\n        return handlerRanking()\n    }\n    else {\n        return []\n    }\n}\n\nfunction handlerNoLogin() {\n    return () => {\n        sleepToast(\"\u26a0\ufe0f \u5f53\u524d\u672a\u767b\u5f55\u8d26\u53f7\\n\\n\u8bf7\u767b\u5f55 Pixiv \u8d26\u53f7\", 1.5)\n        util.removeCookie(); util.login()\n        sleepToast(\"\u767b\u5f55\u6210\u529f\u540e\uff0c\u8bf7\u91cd\u65b0\u8fdb\u5165\u53d1\u73b0\", 2)\n        return []\n    }\n}\n\n\/\/ \u63a8\u8350\u5c0f\u8bf4\nfunction handlerRecommend() {\n    return () => {\n        let res = JSON.parse(result)\n        const recommend = res.body.page.recommend\n        const novels = res.body.thumbnails.novel\n        let nidSet = new Set(recommend.ids)\n        \/\/ java.log(nidSet.size)\n        let list = novels.filter(novel => nidSet.has(String(novel.id)))\n        \/\/ java.log(`\u8fc7\u6ee4\u7ed3\u679c:${JSON.stringify(list)}`)\n        return util.formatNovels(util.handNovels(util.combineNovels(list)))\n    }\n}\n\n\/\/ \u6536\u85cf\u5c0f\u8bf4\uff0c\u4ed6\u4eba\u6536\u85cf\nfunction handlerBookMarks() {\n    return () => {\n        let res = JSON.parse(result).body.works\n        if (res === undefined || res.length === 0) {\n            \/\/\u6d41\u7a0b\u65e0\u6cd5\u672c\u73af\u8282\u4e2d\u6b62 \u53ea\u80fd\u4ea4\u7ed9\u4e0b\u4e00\u6d41\u7a0b\u5904\u7406\n            return []\n        }\n        return util.formatNovels(util.handNovels(res))\n    }\n}\n\n\/\/\u5173\u6ce8\u4f5c\u8005\uff0c\u5c0f\u8bf4\u59d4\u6258\uff0c\u5c0f\u8bf4\u4f01\u5212\nfunction handlerFollowLatest() {\n    return () => {\n        let res = JSON.parse(result)\n        return util.formatNovels(util.handNovels(util.combineNovels(res.body.thumbnails.novel)))\n    }\n}\n\n\/\/\u63a8\u8350\u5c0f\u8bf4\uff0c\u6700\u8fd1\u5c0f\u8bf4\nfunction handlerDiscovery() {\n    return () => {\n        let res = JSON.parse(result)\n        return util.formatNovels(util.handNovels(util.combineNovels(res.body.novels)))\n    }\n}\n\n\/\/ \u641c\u7d22\u6807\u7b7e\nfunction handlerSearch() {\n    return () => {\n        let res = JSON.parse(result)\n        return util.formatNovels(util.handNovels(util.combineNovels(res.body.novel.data)))\n    }\n}\n\n\/\/ \u8ffd\u66f4\u5217\u8868\uff0c\u70ed\u95e8\u5206\u7c7b\nfunction handlerWatchList() {\n    return () => {\n        let res = JSON.parse(result)\n        return util.formatNovels(util.handNovels(res.body.thumbnails.novelSeries))\n    }\n}\n\n\/\/ \u6392\u884c\u699c\uff0c\u4e66\u7b7e\uff0c\u9996\u9875\uff0c\u7f16\u8f91\u90e8\u63a8\u8350\uff0c\u987a\u5e8f\u76f8\u540c\nfunction handlerRanking() {\n    if (util.environment.IS_LEGADO) return handlerRankingAjaxAll()\n    \/\/ else if (util.environment.IS_SOURCE_READ) return handlerRankingWebview()\n    else if (util.environment.IS_SOURCE_READ) return handlerRankingAjax()\n    else return []\n}\n\n\/\/ \u6392\u884c\u699c\uff0c\u4e66\u7b7e\uff0c\u9996\u9875\uff0c\u7f16\u8f91\u90e8\u63a8\u8350\uff0c\u987a\u5e8f\u76f8\u540c\nfunction handlerRankingAjaxAll() {\n    return () => {\n        let  novelIds = [], novelUrls = []\n        \/\/ let result = result + java.ajax(`${baseUrl}&p=2`)  \/\/ \u6b63\u5219\u83b7\u53d6\u7f51\u5740\u4e2d\u7684 novelId\n        let matched = result.match(RegExp(\/\\\/novel\\\/show\\.php\\?id=\\d{5,}\/gm))\n        for (let i in matched) {\n            let novelId = matched[i].match(RegExp(\/\\d{5,}\/))[0]\n            if (novelIds.indexOf(novelId) === -1) {\n                novelIds.push(novelId)\n                novelUrls.push(urlNovelDetailed(novelId))\n            }\n        }\n        \/\/ java.log(JSON.stringify(novelIds))\n        let novels = getAjaxAllJson(novelUrls).map(resp => resp.body)\n        return util.formatNovels(util.handNovels(util.combineNovels(novels)))\n    }\n}\n\n\/\/ \u6392\u884c\u699c\uff0c\u4e66\u7b7e\uff0c\u9996\u9875\nfunction handlerRankingWebview() {\n    return () => {\n        let novelIds = []  \/\/ \u6b63\u5219\u83b7\u53d6\u7f51\u5740\u4e2d\u7684 novelId\n        \/\/ let result = result + java.ajax(`${baseUrl}&p=2`)  \/\/ \u6b63\u5219\u83b7\u53d6\u7f51\u5740\u4e2d\u7684 novelId\n        let matched = result.match(RegExp(\/\\\/novel\\\/show\\.php\\?id=\\d{5,}\/gm))\n        for (let i in matched) {\n            let novelId = matched[i].match(RegExp(\/\\d{5,}\/))[0]\n            if (novelIds.indexOf(novelId) === -1) {\n                novelIds.push(novelId)\n            }\n        }\n        \/\/ java.log(JSON.stringify(novelIds))\n        let userNovels = getWebviewJson(\n            urlNovelsDetailed(`${cache.get(\"pixiv:uid\")}`, novelIds), html => {\n                return (html.match(new RegExp(\">\\\\{.*?}<\"))[0].replace(\">\", \"\").replace(\"<\", \"\"))\n            }).body\n        return util.formatNovels(util.handNovels(util.combineNovels(Object.values(userNovels))))\n    }\n}\n\n\/\/ \u6392\u884c\u699c\uff0c\u4e66\u7b7e\uff0c\u987a\u5e8f\u76f8\u540c\nfunction handlerRankingAjax() {\n    return () => {\n        let novels = [], novelIds = []\n        \/\/ let result = result + java.ajax(`${baseUrl}&p=2`)  \/\/ \u6b63\u5219\u83b7\u53d6\u7f51\u5740\u4e2d\u7684 novelId\n        let matched = result.match(RegExp(\/\\\/novel\\\/show\\.php\\?id=\\d{5,}\/gm))\n        for (let i in matched) {\n            let novelId = matched[i].match(RegExp(\/\\d{5,}\/))[0]\n            if (novelIds.indexOf(novelId) === -1) {\n                novelIds.push(novelId)\n                \/\/ java.log(urlNovelDetailed(novelId))\n                let res = getAjaxJson(urlNovelDetailed(novelId))\n                if (res.error !== true) {\n                    novels.push(res.body)\n                } else {\n                    java.log(JSON.stringify(res))\n                }\n            }\n        }\n        return util.formatNovels(util.handNovels(util.combineNovels(novels)))\n    }\n}\n\n(() => {\n    return handlerFactory()()\n})()","bookUrl":"detailedUrl","coverUrl":"coverUrl","intro":"description","kind":"tags","lastChapter":"latestChapter","name":"title","wordCount":"textCount"},"ruleSearch":{"author":"userName","bookList":"@js:\nvar util = objParse(String(java.get(\"util\")))\n\nfunction objParse(obj) {\n    return JSON.parse(obj, (n, v) => {\n        if (typeof v == \"string\" && v.match(\"()\")) {\n            return eval(`(${v})`)\n        }\n        return v;\n    })\n}\n\nvar first = true;\n\/\/ \u5b58\u50a8seriesID\nvar seriesSet = {\n    keywords: \"Pixiv:Search\",\n    has: (value) => {\n        let page = Number(java.get(\"page\"))\n        if (page === 1 && first) {\n            first = false\n            cache.deleteMemory(this.keywords)\n            return false\n        }\n\n        let v = cache.getFromMemory(this.keywords)\n        if (v === undefined || v === null) {\n            return false\n        }\n        let set = new Set(JSON.parse(v))\n        return set.has(value)\n    },\n\n    add: (value) => {\n        let v = cache.getFromMemory(this.keywords)\n        if (v === undefined || v === null) {\n            cache.putMemory(this.keywords, JSON.stringify([value]))\n\n        } else {\n            let arr = JSON.parse(v)\n            if (typeof arr === \"string\") {\n                arr = Array(arr)\n            }\n            arr.push(value)\n            cache.putMemory(this.keywords, JSON.stringify(arr))\n        }\n    },\n};\n\nfunction getUserNovels() {\n    if (!isLogin()) {\n        sleepToast(\"\ud83d\udc64 \u641c\u7d22\u4f5c\u8005\\n\\n\u26a0\ufe0f \u5f53\u524d\u672a\u767b\u5f55\u8d26\u53f7\\n\u8bf7\u767b\u5f55 Pixiv \u8d26\u53f7\", 1.5)\n        util.removeCookie(); util.login()\n        sleepToast(\"\ud83d\udc64 \u641c\u7d22\u4f5c\u8005\\n\\n\u767b\u5f55\u6210\u529f\u540e\uff0c\u8bf7\u91cd\u65b0\u641c\u7d22\", 2)\n        return []\n    }\n\n    let uidList = [], novels = []\n    let username = String(java.get(\"keyword\"))\n    let page = Number(java.get(\"page\"))\n\n    \/\/ cache.delete(username)\n    let userid = cache.get(username)\n    if (userid !== undefined && userid !== null) {\n        uidList = [userid]\n        java.log(`\ud83d\udc64 \u7f13\u5b58\u4f5c\u8005ID\uff1a${userid}`)\n    } else {\n        html = java.ajax(urlSearchUser(username))\n        \/\/ java.log(html)\n        \/\/ \u4ec5\u5339\u914d\u6709\u6295\u7a3f\u4f5c\u54c1\u7684\u7528\u6237\n        let match = html.match(new RegExp(`\"userIds\":\\\\[(?:(?:\\\\d+,?)+)]`))\n        \/\/ java.log(JSON.stringify(match))\n        if (match === null || match.length === 0) {\n            return []\n        }\n\n        match = JSON.stringify(match).replace(\"\\\\\",\"\").split(\",\")\n        \/\/ java.log(JSON.stringify(match))\n        let regNumber = new RegExp(\"\\\\d+\")\n        uidList = match.map(v => {\n            return v.match(regNumber)[0]\n        })\n        java.log(`\ud83d\udc64 \u83b7\u53d6\u4f5c\u8005ID\uff1a${JSON.stringify(uidList)}`)\n    }\n\n    let tempUids = []\n    for (let i in uidList) {\n        let uid = uidList[i]\n        let resp = getAjaxJson(urlIP(urlUserAllWorks(uid)), true)\n        \/\/ java.log(urlIP(urlIP(urlUserAllWorks(id))))\n        \/\/ java.log(JSON.stringify(resp))\n        if (resp.error === true) {\n            return []\n        }\n\n        \/\/ \u4ec5\u83b7\u53d6\u524d3\u4e2a\u6709\u5c0f\u8bf4\u7684\u4f5c\u8005\n        let novelIds = Object.keys(resp.body.novels)\n        \/\/ java.log(`${uid}-${novelIds.length}`)\n        if (novelIds.length >= 1) tempUids.push(uid)\n        if (tempUids.length === 3) {\n            java.log(`\ud83d\udc64 \u663e\u793a\u4f5c\u8005ID\uff1a${JSON.stringify(tempUids)}`)\n            break\n        }\n\n        \/\/ \u83b7\u53d6\u7cfb\u5217\u5c0f\u8bf4\uff0c\u4e0e util.handnovels \u7cfb\u5217\u8be6\u60c5\u517c\u5bb9\n        let seriesIds = []\n        if (resp.body.novelSeries.length >= 1) {\n            resp.body.novelSeries.forEach(novel =>{\n                seriesIds.push(novel.id)\n                novel.textCount = novel.publishedTotalCharacterCount\n                novel.description = novel.caption\n            })\n            novels = novels.concat(resp.body.novelSeries)\n        }\n\n        \/\/ \u83b7\u53d6\u6240\u6709\u7cfb\u5217\u5185\u90e8\u7684\u5c0f\u8bf4 ID\n        let seriesNovelIds = []\n        seriesIds.forEach(seriesId => {\n            let returnList = getAjaxJson(urlIP(urlSeriesNovelsTitles(seriesId))).body\n            returnList.map(novel => {return seriesNovelIds.push(novel.id)})\n        })\n        \/\/ java.log(`\u6709\u7cfb\u5217\u7684\u5c0f\u8bf4ID\uff1a${JSON.stringify(seriesNovelIds)}`)\n        \/\/ java.log(JSON.stringify(seriesNovelIds.length))\n\n        \/\/ \u83b7\u53d6\u5355\u7bc7\u5c0f\u8bf4\n        if (novelIds.length >= 1 && util.environment.IS_LEGADO) {\n            novelIds = novelIds.filter(novelid => (!seriesNovelIds.includes(novelid)))\n            novelIds = novelIds.reverse().slice((page - 1) * 20, page * 20)\n            \/\/ java.log(`\u771f\u5355\u7bc7\u7684\u5c0f\u8bf4ID\uff1a${JSON.stringify(novelIds)}`)\n            \/\/ java.log(JSON.stringify(novelIds.length))\n            let novelUrls = novelIds.map(novelId => {return urlNovelDetailed(novelId)})\n            \/\/ java.log(JSON.stringify(novelUrls))\n            \/\/ cache.delete(novelUrls)\n            novels = novels.concat(getAjaxAllJson(novelUrls).map(resp => resp.body))\n        }\n\n        \/\/ \/\/ \u83b7\u53d6\u5355\u7bc7\u5c0f\u8bf4\n        if (novelIds.length >= 1 && util.environment.IS_SOURCE_READ) {\n            novelIds = novelIds.filter(novelid => (!seriesNovelIds.includes(novelid)))\n            \/\/ java.log(`\u771f\u5355\u7bc7\u7684\u5c0f\u8bf4ID\uff1a${JSON.stringify(novelIds)}`)\n            \/\/ java.log(JSON.stringify(novelIds.length))\n            novelIds = novelIds.reverse().slice((page - 1) * 20, page * 20)\n            novelIds.forEach(novelId => {\n                \/\/ java.log(urlIP(urlNovelDetailed(novelId)))\n                let res = getAjaxJson(urlIP(urlNovelDetailed(novelId)))\n                if (res.error !== true) {\n                    novels.push(res.body)\n                } else {\n                    java.log(JSON.stringify(res))\n                }\n            })\n        }\n    }\n    \n    util.debugFunc(() => {\n        java.log(`\u83b7\u53d6\u7528\u6237\u641c\u7d22\u5c0f\u8bf4\u7ed3\u675f`)\n    })\n    return novels\n}\n\nfunction search(name, type, page) {\n    let resp = {}\n    if (type.includes(\"novel\")) {\n        resp = getAjaxJson(urlIP(urlSearchNovel(name, page)))\n        java.log(urlIP(urlSearchNovel(name, page)))\n    }\n    if (type.includes(\"series\")) {\n        resp = getAjaxJson(urlIP(urlSearchSeries(name, page)))\n        java.log(urlIP(urlSearchSeries(name, page)))\n    }\n    if (resp.error === true || resp.total === 0) {\n        return {\"data\": [], \"total\":0, \"lastPage\": 0}\n    }\n    return resp.body.novel\n}\n\nfunction getSeries() {\n    let novels = []\n    let name = String(java.get(\"keyword\"))\n    let maxPages = getFromCache(\"maxPages\")  \/\/ \u4ec5\u9ed8\u8ba4\u641c\u7d22\u4f7f\u7528\n    if (!maxPages) {\n        maxPages = getFromCache(\"seriesMaxPages\")  \/\/ \u641c\u7d22\u6807\u7b7e\u4f7f\u7528\n        if (!maxPages) maxPages = 1\n        putInCache(\"seriesMaxPages\", maxPages)\n    }\n    java.log(`\ud83d\udcc4 \u641c\u7d22\u7cfb\u5217\u6700\u5927\u9875\u7801\uff1a${maxPages}`)\n\n    if (JSON.parse(result).error === true) {\n        return []\n    }\n    let lastPage = JSON.parse(result).body.novel.lastPage\n    novels = novels.concat(JSON.parse(result).body.novel.data)\n    java.log(urlIP(urlSearchSeries(name, 1)))\n    cache.put(urlIP(urlSearchSeries(name, 1)), result, cacheSaveSeconds)  \/\/ \u52a0\u5165\u7f13\u5b58\n    for (let page = Number(java.get(\"page\")) + 1; page <= lastPage && page <= maxPages; page++) {\n        novels = novels.concat(search(name,\"series\", page).data)\n    }\n    return novels\n}\n\nfunction getNovels() {\n    let novels = []\n    let name = String(java.get(\"keyword\"))\n    let maxPages = getFromCache(\"maxPages\")  \/\/ \u4ec5\u9ed8\u8ba4\u641c\u7d22\u4f7f\u7528\n    if (!maxPages) {\n        maxPages = getFromCache(\"novelsMaxPages\")  \/\/ \u641c\u7d22\u6807\u7b7e\u4f7f\u7528\n        if (!maxPages) maxPages = 1\n        putInCache(\"novelsMaxPages\", maxPages)\n    }\n    java.log(`\ud83d\udcc4 \u641c\u7d22\u5355\u7bc7\u6700\u5927\u9875\u7801\uff1a${maxPages}`)\n\n    let resp = search(name, \"novel\", 1)\n    novels = novels.concat(resp.data)\n    for (let page = Number(java.get(\"page\")) + 1; page <= resp.lastPage && page <= maxPages; page++) {\n        novels = novels.concat(search(name,\"novel\", page).data)\n    }\n    return util.combineNovels(novels)\n}\n\nfunction getConvertNovels() {\n    let novels = []\n    let novelName = String(java.get(\"keyword\"))\n    let name1 = String(java.s2t(novelName))\n    let name2 = String(java.t2s(novelName))\n    if (name1 !== novelName) novels = novels.concat(search(name1, \"novel\", 1).data)\n    if (name2 !== novelName) novels = novels.concat(search(name2, \"novel\", 1).data)\n    novels = util.combineNovels(novels)\n    if (name1 !== novelName) novels = novels.concat(search(name1, \"series\", 1).data)\n    if (name2 !== novelName) novels = novels.concat(search(name2, \"series\", 1).data)\n    return novels\n}\n\nfunction novelFilter(novels) {\n    let textCount = 0, tags = []\n    let limitedTextCount = String(java.get(\"limitedTextCount\")).replace(\"\u5b57\u6570\", \"\").replace(\"\u5b57\u6578\", \"\")\n    \/\/ limitedTextCount = `3w 3k 3w5 3k5`.[0]\n    if (limitedTextCount.includes(\"w\") || limitedTextCount.includes(\"W\")) {\n        let num = limitedTextCount.toLowerCase().split(\"w\")\n        textCount = 10000 * num[0] + 1000 * num[1]\n    } else if (limitedTextCount.includes(\"k\") || limitedTextCount.includes(\"K\")) {\n        let num = limitedTextCount.toLowerCase().split(\"k\")\n        textCount = 1000 * num[0] + 100 * num[1]\n    }\n\n    let novels0 = novels.map(novel => novel.id)\n    if (textCount >= 1) {\n        novels = novels.filter(novel => novel.textCount >= textCount)\n        let novels1 = novels.map(novel => novel.id)\n        java.log(`\ud83d\udd22 \u5b57\u6570\u9650\u5236\uff1a${limitedTextCount}`)\n        java.log(`\u23ec \u5b57\u6570\u9650\u5236\uff1a\u8fc7\u6ee4\u524d${novels0.length}\uff1b\u8fc7\u6ee4\u540e${novels1.length}`)\n    }\n\n    let inputTags = String(java.get(\"inputTags\")).split(\" \")\n    for (let i in inputTags) {\n        let tag = inputTags[i].trim()\n        if (tag !== \"\") tags.push(`${tag}`)\n    }\n\n    if (tags.length >= 1) {\n        \/\/ \u4ec5\u4fdd\u7559\u542b\u6709\u6240\u6709\u6807\u7b7e\u7684\u5c0f\u8bf4\n        \/\/ novels = novels.filter(novel => {\n        \/\/     \/\/ java.log(`${JSON.stringify(novel.tags)}\\n${tags.every(item => novel.tags.includes(item))}`)\n        \/\/     return tags.every(item => novel.tags.includes(item))\n        \/\/ })\n        novels = novels.filter(novel => tags.every(item => novel.tags.includes(item)))\n        let novels2 = novels.map(novel => novel.id)\n        java.log(`#\ufe0f\u20e3 \u8fc7\u6ee4\u6807\u7b7e\uff1a${tags.join(\"\u3001\")}`)\n        java.log(`#\ufe0f\u20e3 \u8fc7\u6ee4\u6807\u7b7e\uff1a\u8fc7\u6ee4\u524d${novels0.length}\uff1b\u8fc7\u6ee4\u540e${novels2.length}`)\n    }\n\n    let inputAuthor = String(java.get(\"inputAuthor\")).trim()\n    if (inputAuthor) {\n        \/\/ novels = novels.filter(novel => {\n        \/\/     java.log(`${novel.userName}-${novel.userName.includes(inputAuthor)}`)\n        \/\/     return novel.userName.includes(inputAuthor)\n        \/\/ })\n        novels = novels.filter(novel => novel.userName.includes(inputAuthor))\n        let novels2 = novels.map(novel => novel.id)\n        java.log(`\ud83d\udc64 \u8fc7\u6ee4\u4f5c\u8005\uff1a${tags.join(\"\u3001\")}`)\n        java.log(`\ud83d\udc64 \u8fc7\u6ee4\u4f5c\u8005\uff1a\u8fc7\u6ee4\u524d${novels0.length}\uff1b\u8fc7\u6ee4\u540e${novels2.length}`)\n    }\n    return novels\n}\n\n(() => {\n    let novels = []\n    let keyword = String(java.get(\"keyword\"))\n    if (keyword.startsWith(\"@\") || keyword.startsWith(\"\uff20\")) {\n        java.put(\"keyword\", keyword.slice(1))\n        novels = novels.concat(getUserNovels())\n    } else if (keyword.startsWith(\"#\") || keyword.startsWith(\"\uff03\")) {\n        java.put(\"keyword\", keyword.slice(1))\n        \/\/ \u5220\u9664\u9ed8\u8ba4\u641c\u7d22\u6700\u5927\u9875\u7801\uff0c\u4f7f\u7528\u5185\u90e8\u8bbe\u5b9a\u7684\u6700\u5927\u9875\u7801\n        cache.delete(\"maxPages\")\n        novels = novels.concat(getSeries())\n        novels = novels.concat(getNovels())\n    } else {\n        \/\/ \u8bbe\u7f6e\u9ed8\u8ba4\u641c\u7d22\u6700\u5927\u9875\u7801\n        putInCache(\"maxPages\", 1)\n        novels = novels.concat(getSeries())\n        novels = novels.concat(getNovels())\n        if (util.settings.SEARCH_AUTHOR) novels = novels.concat(getUserNovels())\n        if (util.settings.CONVERT_CHINESE) novels = novels.concat(getConvertNovels())\n    }\n    \/\/ java.log(JSON.stringify(novels))\n    \/\/ \u8fd4\u56de\u7a7a\u5217\u8868\u4e2d\u6b62\u6d41\u7a0b\n    if (novels.length === 0) {\n        return []\n    }\n    return novelFilter(util.formatNovels(util.handNovels(novels)))\n})()","bookUrl":"detailedUrl","checkKeyWord":"\u6d4b\u8bd5\u9875\u9762","coverUrl":"coverUrl","intro":"description","kind":"tags","lastChapter":"latestChapter","name":"title","wordCount":"textCount"},"ruleToc":{"chapterList":"@js:\nvar util = objParse(String(java.get(\"util\")))\n\nfunction objParse(obj) {\n    return JSON.parse(obj, (n, v) => {\n        if (typeof v == \"string\" && v.match(\"()\")) {\n            return eval(`(${v})`)\n        }\n        return v;\n    })\n}\n\nfunction urlNovel(novelId){\n    if (util.settings.SHOW_ORIGINAL_LINK) {\n        return urlNovelUrl(novelId)\n    } else {\n        return urlNovelDetailed(novelId)\n    }\n}\n\nfunction oneShotHandler(res) {\n    res.textCount = res.userNovels[`${res.id}`].textCount\n    res.createDate = timeTextFormat(res.createDate)\n    return [{\n        title: res.title.replace(RegExp(\/^\\s+|\\s+$\/g), \"\"),\n        chapterUrl: urlIP(urlNovel(res.id)),\n        chapterInfo: `${res.createDate}\u3000\u3000${res.textCount}\u5b57`\n    }]\n}\n\nfunction seriesHandler(res) {\n    const limit = 30\n    let returnList = [], novelIds = []\n    let seriesID = res.id, allChaptersCount = res.total\n    util.debugFunc(() => {\n        java.log(`\u672c\u7cfb\u5217 ${seriesID} \u4e00\u5171\u6709${allChaptersCount}\u7ae0`);\n    })\n\n    \/\/\u53d1\u9001\u8bf7\u6c42\u83b7\u5f97\u76f8\u5e94\u6570\u91cf\u7684\u76ee\u5f55\u5217\u8868\n    function sendAjaxForGetChapters(lastIndex) {\n        resp = getAjaxJson(urlIP(urlSeriesNovels(seriesID, limit, lastIndex)), true)\n        res = resp.body.thumbnails.novel\n        \/\/ res = resp.body.page.seriesContents\n        res.forEach(v => {\n            v.title = v.title.replace(RegExp(\/^\\s+|\\s+$\/g), \"\").replace(RegExp(\/\uff08|\uff09|-\/g), \"\")\n            v.chapterUrl = urlIP(urlNovel(v.id))\n            novelIds.push(v.id)\n            if (v.updateDate !== undefined) {\n                v.updateDate = timeTextFormat(v.createDate)\n                v.chapterInfo = `${v.updateDate}\u3000\u3000${v.textCount}\u5b57`\n            } else {\n                v.updateDate = java.timeFormat(v.uploadTimestamp)\n                v.chapterInfo = `${v.updateDate}\u3000\u3000${v.textLength}\u5b57`\n            }\n            util.debugFunc(() => {\n                java.log(`${v.title}`)\n            })\n        })\n        return res;\n    }\n\n    if (!util.settings.SHOW_UPDATE_TIME) {\n        returnList = getAjaxJson(urlIP(urlSeriesNovelsTitles(seriesID)), true).body\n        returnList.forEach(v => {\n            v.title = v.title.replace(RegExp(\/^\\s+|\\s+$\/g), \"\").replace(RegExp(\/\uff08|\uff09|-\/g), \"\")\n            v.chapterUrl = urlIP(urlNovel(v.id))\n            novelIds.push(v.id)\n        })\n    } else {\n        \/\/\u903b\u8f91\u63a7\u5236\u8005 \u4e5f\u5c31\u662f\u4f7f\u7528\u4e0a\u9762\u5b9a\u4e49\u7684\u4e24\u4e2a\u51fd\u6570\u6765\u505a\u5bf9\u5e94\u529f\u80fd\n        \/\/\u8981\u722c\u53d6\u7684\u603b\u6b21\u6570\n        let max = (allChaptersCount \/ limit) + 1\n        for (let i = 0; i < max; i++) {\n            \/\/java.log(\"i\u7684\u503c:\"+i)\n            let list = sendAjaxForGetChapters(i * limit);\n            \/\/\u53d6\u51fa\u6bcf\u4e2a\u503c\n            returnList = returnList.concat(list)\n        }\n    }\n    \/\/ \u653e\u5165\u5c0f\u8bf4\u4fe1\u606f\u4ee5\u4fbf\u767b\u9646\u754c\u9762\u4f7f\u7528\n    let novel = source.getLoginInfoMap()\n    if (novel === undefined) novel = JSON.parse(cache.get(\"novel\"))\n    novel.novelIds = novelIds\n    cache.put(`novelIds${seriesID}`, JSON.stringify(novelIds), cacheSaveSeconds)\n    \/\/ java.log(JSON.stringify(returnList))\n    source.putLoginInfo(JSON.stringify(novel))\n    cache.put(\"novel\", JSON.stringify(novel))\n    return returnList\n}\n\n(function (res) {\n    res = util.getNovelResSeries(result)\n    if (res.firstNovelId === undefined || res.seriesNavData === null) {\n        return oneShotHandler(res)\n    } else {\n        return seriesHandler(res)\n    }\n})()","chapterName":"title","chapterUrl":"chapterUrl","isPay":"","isVip":"","updateTime":"chapterInfo"},"searchUrl":"@js:\njava.put(\"key\", key)\njava.put(\"page\", page)\nlet keyword = key.split(\" \")\nlet limitedTextCount\nif (key.includes(\"\u5b57\u6570\") || key.includes(\"\u5b57\u6578\") ) {\n    limitedTextCount = keyword.pop()\n    keyword = keyword.join(\" \")\n} else {\n    limitedTextCount = \"\"\n    keyword = key\n}\njava.put(\"keyword\", keyword)\njava.put(\"limitedTextCount\", limitedTextCount)\n\nif (keyword.startsWith(\"@\") || keyword.startsWith(\"\uff20\")) {\n    if (keyword.includes(\"#\") || keyword.includes(\"\uff03\")) {\n        let author = keyword.split(\" \")[0]\n        let tags = keyword.replace(author, \"\").trim().slice(1)\n        java.put(\"keyword\", author)\n        java.put(\"inputTags\", tags)\n        java.log(`\ud83d\udc64 \u641c\u7d22\u4f5c\u8005\uff1a${author} #\ufe0f\u20e3 \u8fc7\u6ee4\u6807\u7b7e\uff1a${tags.replace(\" \", \"\u3001\")}`)\n    } else {\n        java.put(\"keyword\", keyword)\n        java.log(`\ud83d\udc64 \u641c\u7d22\u4f5c\u8005\uff1a${keyword.slice(1)}`)\n    }\n\n} else if (keyword.startsWith(\"#\") || keyword.startsWith(\"\uff03\")) {\n    keyword = keyword.slice(1)\n    if (keyword.includes(\"@\") || keyword.includes(\"\uff20\")) {\n        let author = keyword.match(new RegExp(\/[@\uff20](.*)\/))\n        keyword = keyword.replace(author[0], \"\").trim()\n        java.put(\"inputAuthor\", author[1])\n        java.log(`#\ufe0f\u20e3 \u641c\u7d22\u6807\u7b7e\uff1a${keyword} \ud83d\udc64 \u8fc7\u6ee4\u4f5c\u8005\uff1a${author[1]}`)\n    } else {\n        java.log(`#\ufe0f\u20e3 \u641c\u7d22\u6807\u7b7e\uff1a${keyword}`)\n    }\n    java.put(\"keyword\", `#${keyword}`)\n\n} else {\n    java.log(`\ud83d\udd0d \u641c\u7d22\u5185\u5bb9\uff1a${keyword}`)\n}\nurlIP(urlSearchSeries(keyword, page))","variableComment":"\ud83d\udeab \u5c4f\u853d\u4f5c\u8005(\u672c\u5730)\uff1a\n\u25b6\ufe0f\u8bbe\u7f6e\u65b9\u6cd5\uff1a\u6253\u5f00\u5c0f\u8bf4 - \u83dc\u5355 - \u767b\u5f55 - \ud83d\udeab \u5c4f\u853d\u4f5c\u8005\n\n\ud83d\udeab \u5c4f\u853d\u6807\u7b7e\/\u63cf\u8ff0(\u672c\u5730)\uff1a\n1\ufe0f\u20e3\u7f16\u8f91\u4e66\u6e90\uff1a\u83dc\u5355 - \u767b\u5f55 - \u70b9\u51fb\u3010 \ud83d\udc40 \u67e5\u770b\u5c4f\u853d\u3011\n2\ufe0f\u20e3\u5207\u6362\u5217\u8868\uff1a\u70b9\u51fb\u6309\u94ae\uff0c\u5207\u6362\u81f3\u3010\u76f8\u5e94\u5c4f\u853d\u5217\u8868\u3011\n3\ufe0f\u20e3\u8f93\u5165\u5185\u5bb9\uff1a\u5728\u3010\u8f93\u5165\u5185\u5bb9\u3011\u5904\u8f93\u5165\u5c4f\u853d\u5185\u5bb9\n4\ufe0f\u20e3\u5c4f\u853d\u4f5c\u8005\uff1a\u70b9\u51fb\u3010\ud83d\udeab \u52a0\u5165\u5c4f\u853d\u3011\uff0c\u5c4f\u853d\u8be5\u5185\u5bb9\n\n\ud83d\udccc \u559c\u6b22\u6807\u7b7e(\u672c\u5730)\uff1a\n1\ufe0f\u20e3\u7f16\u8f91\u4e66\u6e90\uff1a\u83dc\u5355 - \u767b\u5f55 \uff0c\u627e\u5230\u8f93\u5165\u5185\u5bb9\n2\ufe0f\u20e3\u8f93\u5165\u5185\u5bb9\uff1a\u8f93\u5165\u6807\u7b7e\uff0c\u70b9\u51fb\u3010\ud83d\udccc \u559c\u6b22\u6807\u7b7e\u3011\n\n\u2764\ufe0f \u67e5\u770b\u4ed6\u4eba\u6536\u85cf\uff1a\n1\ufe0f\u20e3\u7f16\u8f91\u4e66\u6e90\uff1a\u83dc\u5355 - \u767b\u5f55 \uff0c\u627e\u5230\u8f93\u5165\u5185\u5bb9\n2\ufe0f\u20e3\u8f93\u5165\u5185\u5bb9\uff1a\u8f93\u5165\u4f5c\u8005ID\uff0c\u70b9\u51fb\u3010\u2764\ufe0f \u4ed6\u4eba\u6536\u85cf\u3011\n\n\n\u2699\ufe0f \u4e66\u6e90\u8bbe\u7f6e\uff1a\n\u8bbe\u7f6e1\ufe0f\u20e3\uff1a\u6253\u5f00\u5c0f\u8bf4 - \u83dc\u5355 - \u767b\u5f55 - \u70b9\u51fb\u4e0b\u65b9\u6309\u94ae\n\u25b6\ufe0f \u641c\u7d22\u4efb\u610f\u5c0f\u8bf4\uff0c\u540c\u6b65\u8bbe\u7f6e\u6570\u636e\n\n\u8bbe\u7f6e2\ufe0f\u20e3\uff1a\u7f16\u8f91\u4e66\u6e90 - \u57fa\u672c - \u53d8\u91cf\u8bf4\u660e - \u4fee\u6539\u5e76\u4fdd\u5b58\n\u2699\ufe0f \u81ea\u5b9a\u4e49\u8bbe\u7f6e\uff1a\u5c06 true \u6539\u4e3a false\uff0c\u6216\u76f8\u53cd\n\u26a0\ufe0f \u8bbe\u7f6e\u6e90\u53d8\u91cf\u3010\u65e0\u6cd5\u3011\u66f4\u6539\u4e66\u6e90\u81ea\u5b9a\u4e49\u8bbe\u7f6e\n\u26a0\ufe0f \u6ce8\u610f\u4e0d\u8981\u6dfb\u52a0\u6216\u5220\u9664\u5c3e\u968f\u9017\u53f7\",\"\n\u26a0\ufe0f \u66f4\u65b0\u53d1\u73b0\u9875\u9700\u8981\u957f\u6309\"Pixiv\"\uff0c\u624b\u52a8\u5237\u65b0\n\u4ee5\u4e0b\u5185\u5bb9\u4e3a\u4e66\u6e90\u8bbe\u7f6e\uff1a\n{\n\"SHOW_GENERAL_NEW\": false,\n\"SHOW_GENERAL_RANK\": false,\n\"SHOW_R18_GENRE\": false,\n\"SHOW_GENERAL_GENRE\": false\n}\n\n\/\/ SHOW_GENERAL_NEW\n\/\/ \u53d1\u73b0\uff1a\u6700\u65b0\u3001\u4f01\u5212\u3001\u7ea6\u7a3f\u663e\u793a\u4e00\u822c\u5c0f\u8bf4\n\/\/ SHOW_GENERAL_RANK\n\/\/ \u53d1\u73b0\uff1a\u6392\u884c\u699c\u663e\u793a\u4e00\u822c\u5c0f\u8bf4\n\/\/ SHOW_R18_GENRE\n\/\/ \u53d1\u73b0\uff1a\u70ed\u95e8\u5206\u7c7b\u663e\u793aR18\u5c0f\u8bf4\n\/\/ SHOW_GENERAL_GENRE\n\/\/ \u53d1\u73b0\uff1a\u70ed\u95e8\u5206\u7c7b\u663e\u793a\u4e00\u822c\u5c0f\u8bf4\n\n","weight":0},{"bookSourceGroup":"\u6790","bookSourceName":"\u7fa4U\u805a\u5408","bookSourceType":0,"bookSourceUrl":"https:\/\/jican.x7go.top","customOrder":-1,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"eventListener":false,"jsLib":"function getHost() {\n  return \"https:\/\/jican.x7go.top\"\n}","lastUpdateTime":"1763935591179","loginUi":"[{\"name\": \"\ud83d\udcda \u5c0f\u8bf4\u5e73\u53f0\",\"type\": \"button\",\"action\": \"showNovelToast()\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":1}},{\"name\": \"\u5168\u90e8\",\"type\": \"button\",\"action\": \"sethost(1)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"\u756a\u8304\",\"type\": \"button\",\"action\": \"sethost(2)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"\u4e03\u732b\",\"type\": \"button\",\"action\": \"sethost(3)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"QQ\u9605\u8bfb\",\"type\": \"button\",\"action\": \"sethost(4)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"\u7c73\u8bfb\",\"type\": \"button\",\"action\": \"sethost(5)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"\u5854\u8bfb\",\"type\": \"button\",\"action\": \"sethost(6)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"\u4e66\u65d7\",\"type\": \"button\",\"action\": \"sethost(7)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"\u664b\u6c5f\",\"type\": \"button\",\"action\": \"sethost(8)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"\u767e\u5ea6\",\"type\": \"button\",\"action\": \"sethost(9)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"\u9177\u6211\",\"type\": \"button\",\"action\": \"sethost(10)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"\u9177\u5320\",\"type\": \"button\",\"action\": \"sethost(11)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"QQ\u6d4f\u89c8\u5668\",\"type\": \"button\",\"action\": \"sethost(12)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"\u756a\u85af\",\"type\": \"button\",\"action\": \"sethost(13)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"\u798f\u5229\u5c0f\u8bf4\",\"type\": \"button\",\"action\": \"sethost(14)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"\u798f\u745e\u5c0f\u8bf4\",\"type\": \"button\",\"action\": \"sethost(15)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"\u4eba\u4eba\",\"type\": \"button\",\"action\": \"sethost(16)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"\u4e07\u76f8\u4e66\u57ce\",\"type\": \"button\",\"action\": \"sethost(17)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"\u72ec\u6b65\u5c0f\u8bf4\",\"type\": \"button\",\"action\": \"sethost(18)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"365\u5c0f\u8bf4\",\"type\": \"button\",\"action\": \"sethost(19)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"\u5b9c\u641c\",\"type\": \"button\",\"action\": \"sethost(20)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"69\u4e66\u5427\",\"type\": \"button\",\"action\": \"sethost(21)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"\u4f2a69\",\"type\": \"button\",\"action\": \"sethost(22)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"\u53f0\u6e7e\u5c0f\u8bf4\u7f51\",\"type\": \"button\",\"action\": \"sethost(23)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"\u732b\u773c\",\"type\": \"button\",\"action\": \"sethost(24)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"\u8ffd\u66f4\u4eba\",\"type\": \"button\",\"action\": \"sethost(25)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"\u7231\u4e0b\u7535\u5b50\u4e66\",\"type\": \"button\",\"action\": \"sethost(26)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"\u901f\u8bfb\u8c37\",\"type\": \"button\",\"action\": \"sethost(27)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"\u8001\u798f\u7279\",\"type\": \"button\",\"action\": \"sethost(28)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"\ud83c\udfac \u77ed\u5267\u5e73\u53f0\",\"type\": \"button\",\"action\": \"showDramaToast()\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":1}},{\"name\": \"\u756a\u8304\u77ed\u5267\",\"type\": \"button\",\"action\": \"sethost(29)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"\u4e03\u732b\u77ed\u5267\",\"type\": \"button\",\"action\": \"sethost(30)\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":0.4}},{\"name\": \"\ud83d\udcac \u4ea4\u6d41\u8ba8\u8bba\",\"type\": \"button\",\"action\": \"openQQGroup()\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\":1}}]","loginUrl":"var hosts = [\n    \"\u5168\u90e8\",\n    \"\u756a\u8304\",\n    \"\u4e03\u732b\",\n    \"QQ\u9605\u8bfb\",\n    \"\u7c73\u8bfb\",\n    \"\u5854\u8bfb\",\n    \"\u4e66\u65d7\",\n    \"\u664b\u6c5f\",\n    \"\u767e\u5ea6\",\n    \"\u9177\u6211\",\n    \"\u9177\u5320\",\n    \"QQ\u6d4f\u89c8\u5668\",\n    \"\u756a\u85af\",\n    \"\u798f\u5229\u5c0f\u8bf4\",\n    \"\u798f\u745e\u5c0f\u8bf4\",\n    \"\u4eba\u4eba\",\n    \"\u4e07\u76f8\u4e66\u57ce\",\n    \"\u72ec\u6b65\u5c0f\u8bf4\",\n    \"365\u5c0f\u8bf4\",\n    \"\u5b9c\u641c\",\n    \"69\u4e66\u5427\",\n    \"\u4f2a69\",\n    \"\u53f0\u6e7e\u5c0f\u8bf4\u7f51\",\n    \"\u732b\u773c\",\n    \"\u8ffd\u66f4\u4eba\",\n    \"\u7231\u4e0b\u7535\u5b50\u4e66\",\n    \"\u901f\u8bfb\u8c37\",\n    \"\u8001\u798f\u7279\",\n    \"\u756a\u8304\u77ed\u5267\",\n    \"\u4e03\u732b\u77ed\u5267\"\n];\n\nfunction sethost(index) {\n    if (index >= 1 && index <= hosts.length) {\n        source.setVariable(JSON.stringify([{\"host\": hosts[index-1]}]));\n        java.toast(\"\u5f53\u524d\u641c\u7d22\uff1a\" + hosts[index-1]);\n    }\n}\n\nfunction openQQGroup() {\n    java.startBrowserAwait(\"https:\/\/qm.qq.com\/q\/YUMTmrjqYW\", \"\u4ea4\u6d41\u8ba8\u8bba\");\n}\n\nfunction showNovelToast() {\n    java.toast(\"\ud83d\udcda \u4e0b\u65b9\u662f\u5c0f\u8bf4\u5e73\u53f0\");\n}\n\nfunction showDramaToast() {\n    java.toast(\"\ud83c\udfac \u4e0b\u65b9\u662f\u77ed\u5267\u5e73\u53f0\");\n}\n\nfunction login() {}","respondTime":180000,"ruleBookInfo":{"author":"$.result.author","coverUrl":"$.result.cover_url","intro":"$.result.abstract","kind":"$.result.source","name":"$.result.title","tocUrl":"https:\/\/jican.x7go.top\/catalog?book_id={{$.result.book_id}}&source={{$.result.source}}"},"ruleContent":{"content":"@js:\nvar json = JSON.parse(result);\nvar content = json.data[0].content;\nif(content && content.startsWith('https:\/\/')) {\n    \/\/ \u5982\u679c\u662f\u89c6\u9891\u94fe\u63a5\n    if(book.durChapterIndex == chapter.index) {\n        java.startBrowser(content.replace(\/\\\\\/g, ''), chapter.title);\n        java.toast('\u6b63\u5728\u52a0\u8f7d\u89c6\u9891\\n\u89c6\u9891\u52a0\u8f7d\u8f83\u6162\uff0c\u8bf7\u8010\u5fc3\u7b49\u5f85');\n    }\n    result = '\u3010\u5237\u65b0\u6b63\u6587\u3011\u64ad\u653e\\n\u2705\u76f4\u94fe:\\n' + content;\n} else {\n    result = content;\n}\nresult"},"ruleExplore":[],"ruleSearch":{"author":"$.author","bookList":"$.results","bookUrl":"https:\/\/jican.x7go.top\/detail?book_id={{$.book_id}}&source={{$.source}}","checkKeyWord":"\u8be1\u79d8\u4e4b\u4e3b","coverUrl":"$.cover_url","intro":"$.abstract","kind":"$.source","lastChapter":"$.source","name":"$.title"},"ruleToc":{"chapterList":"$.chapters<js>java.put('book_id', java.getString('$.book_id')); java.put('source', java.getString('$.source')); result<\/js>","chapterName":"$.title","chapterUrl":"<js>var host = getHost(); \nvar bookId = java.get('book_id'); \nvar sourceVal = java.get('source'); \nvar itemId = java.getString('$.item_id'); \nhost + '\/content?book_id=' + bookId + '&item_id=' + itemId + '&source=' + encodeURIComponent(sourceVal);<\/js>"},"searchUrl":"@js:\n(function() {\n    var sourceVal = '\u5168\u90e8';\n    try {\n        var userSource = source.getVariable();\n        if (userSource != null && String(userSource).length > 0) {\n            \/\/ \u89e3\u6790JSON\u683c\u5f0f\u7684\u53d8\u91cf\n            var userObj = JSON.parse(userSource);\n            if (userObj && userObj[0] && userObj[0].host) {\n                sourceVal = userObj[0].host;\n            }\n        }\n    } catch (e) {\n        java.log('\u83b7\u53d6\u7528\u6237\u6765\u6e90\u5931\u8d25\uff0c\u4f7f\u7528\u9ed8\u8ba4\u503c');\n    }\n    return getHost() + '\/search?q={{key}}&source=' + encodeURIComponent(sourceVal);\n})();\n","weight":0},{"bookSourceComment":"\u60a0\u5c18 \u81ea\u5199: 2025-08-06","bookSourceGroup":"youchen","bookSourceName":"\u770b\u4e66\u541b","bookSourceType":0,"bookSourceUrl":"https:\/\/m.ksjxsw.com\/","customOrder":-5891,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"[\n\t{\n\t\t\"title\": \"\u5168\u90e8\u5c0f\u8bf4(\u5168\u672c)\",\n\t\t\"url\": \"\",\n\t\t\"style\": {\n\t\t\t\"layout_flexGrow\": 0,\n\t\t\t\"layout_flexBasisPercent\": 1\n\t\t}\n\t},\n\t{\n\t\t\"title\": \"\u5168\u90e8\u5206\u7c7b\",\n\t\t\"url\": \"\/quanben\/fenlei\/{{page}}\/\",\n\t\t\"style\": {\n\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\"layout_flexBasisPercent\": 0.29\n\t\t}\n\t},\n\t{\n\t\t\"title\": \"\u7384\u5e7b\",\n\t\t\"url\": \"\/quanben\/fenlei\/1\/{{page}}\/\",\n\t\t\"style\": {\n\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\"layout_flexBasisPercent\": 0.29\n\t\t}\n\t},\n\t{\n\t\t\"title\": \"\u5947\u5e7b\",\n\t\t\"url\": \"\/quanben\/fenlei\/2\/{{page}}\/\",\n\t\t\"style\": {\n\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\"layout_flexBasisPercent\": 0.29\n\t\t}\n\t},\n\t{\n\t\t\"title\": \"\u6b66\u4fa0\",\n\t\t\"url\": \"\/quanben\/fenlei\/3\/{{page}}\/\",\n\t\t\"style\": {\n\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\"layout_flexBasisPercent\": 0.29\n\t\t}\n\t},\n\t{\n\t\t\"title\": \"\u4ed9\u4fa0\",\n\t\t\"url\": \"\/quanben\/fenlei\/4\/{{page}}\/\",\n\t\t\"style\": {\n\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\"layout_flexBasisPercent\": 0.29\n\t\t}\n\t},\n\t{\n\t\t\"title\": \"\u90fd\u5e02\",\n\t\t\"url\": \"\/quanben\/fenlei\/5\/{{page}}\/\",\n\t\t\"style\": {\n\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\"layout_flexBasisPercent\": 0.29\n\t\t}\n\t},\n\t{\n\t\t\"title\": \"\u519b\u4e8b\",\n\t\t\"url\": \"\/quanben\/fenlei\/6\/{{page}}\/\",\n\t\t\"style\": {\n\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\"layout_flexBasisPercent\": 0.29\n\t\t}\n\t},\n\t{\n\t\t\"title\": \"\u5386\u53f2\",\n\t\t\"url\": \"\/quanben\/fenlei\/7\/{{page}}\/\",\n\t\t\"style\": {\n\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\"layout_flexBasisPercent\": 0.29\n\t\t}\n\t},\n\t{\n\t\t\"title\": \"\u6e38\u620f\",\n\t\t\"url\": \"\/quanben\/fenlei\/8\/{{page}}\/\",\n\t\t\"style\": {\n\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\"layout_flexBasisPercent\": 0.29\n\t\t}\n\t},\n\t{\n\t\t\"title\": \"\u7ade\u6280\",\n\t\t\"url\": \"\/quanben\/fenlei\/9\/{{page}}\/\",\n\t\t\"style\": {\n\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\"layout_flexBasisPercent\": 0.29\n\t\t}\n\t},\n\t{\n\t\t\"title\": \"\u79d1\u5e7b\",\n\t\t\"url\": \"\/quanben\/fenlei\/10\/{{page}}\/\",\n\t\t\"style\": {\n\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\"layout_flexBasisPercent\": 0.29\n\t\t}\n\t},\n\t{\n\t\t\"title\": \"\u60ac\u7591\",\n\t\t\"url\": \"\/quanben\/fenlei\/11\/{{page}}\/\",\n\t\t\"style\": {\n\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\"layout_flexBasisPercent\": 0.29\n\t\t}\n\t},\n\t{\n\t\t\"title\": \"\u7075\u5f02\",\n\t\t\"url\": \"\/quanben\/fenlei\/12\/{{page}}\/\",\n\t\t\"style\": {\n\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\"layout_flexBasisPercent\": 0.29\n\t\t}\n\t},\n\t{\n\t\t\"title\": \"\u5176\u4ed6\",\n\t\t\"url\": \"\/quanben\/fenlei\/13\/{{page}}\/\",\n\t\t\"style\": {\n\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\"layout_flexBasisPercent\": 0.29\n\t\t}\n\t},\n\t{\n\t\t\"title\": \"\u53e4\u4ee3\u8a00\u60c5\",\n\t\t\"url\": \"\/quanben\/fenlei\/14\/{{page}}\/\",\n\t\t\"style\": {\n\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\"layout_flexBasisPercent\": 0.29\n\t\t}\n\t},\n\t{\n\t\t\"title\": \"\u4ed9\u4fa0\u5947\u7f18\",\n\t\t\"url\": \"\/quanben\/fenlei\/15\/{{page}}\/\",\n\t\t\"style\": {\n\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\"layout_flexBasisPercent\": 0.29\n\t\t}\n\t},\n\t{\n\t\t\"title\": \"\u73b0\u4ee3\u8a00\u60c5\",\n\t\t\"url\": \"\/quanben\/fenlei\/16\/{{page}}\/\",\n\t\t\"style\": {\n\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\"layout_flexBasisPercent\": 0.29\n\t\t}\n\t},\n\t{\n\t\t\"title\": \"\u6d6a\u6f2b\u9752\u6625\",\n\t\t\"url\": \"\/quanben\/fenlei\/17\/{{page}}\/\",\n\t\t\"style\": {\n\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\"layout_flexBasisPercent\": 0.29\n\t\t}\n\t},\n\t{\n\t\t\"title\": \"\u7384\u5e7b\u8a00\u60c5\",\n\t\t\"url\": \"\/quanben\/fenlei\/18\/{{page}}\/\",\n\t\t\"style\": {\n\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\"layout_flexBasisPercent\": 0.29\n\t\t}\n\t},\n\t{\n\t\t\"title\": \"\u60ac\u7591\u7075\u5f02\",\n\t\t\"url\": \"\/quanben\/fenlei\/19\/{{page}}\/\",\n\t\t\"style\": {\n\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\"layout_flexBasisPercent\": 0.29\n\t\t}\n\t},\n\t{\n\t\t\"title\": \"\u79d1\u5e7b\u7a7a\u95f4\",\n\t\t\"url\": \"\/quanben\/fenlei\/20\/{{page}}\/\",\n\t\t\"style\": {\n\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\"layout_flexBasisPercent\": 0.29\n\t\t}\n\t},\n\t{\n\t\t\"title\": \"\u6e38\u620f\u7ade\u6280\",\n\t\t\"url\": \"\/quanben\/fenlei\/21\/{{page}}\/\",\n\t\t\"style\": {\n\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\"layout_flexBasisPercent\": 0.29\n\t\t}\n\t},\n\t{\n\t\t\"title\": \"BL\u6587\",\n\t\t\"url\": \"\/quanben\/fenlei\/22\/{{page}}\/\",\n\t\t\"style\": {\n\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\"layout_flexBasisPercent\": 0.29\n\t\t}\n\t},\n\t{\n\t\t\"title\": \"GL\u6587\",\n\t\t\"url\": \"\/quanben\/fenlei\/23\/{{page}}\/\",\n\t\t\"style\": {\n\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\"layout_flexBasisPercent\": 0.29\n\t\t}\n\t},\n\t{\n\t\t\"title\": \"\u4e8c\u6b21\u5143\",\n\t\t\"url\": \"\/quanben\/fenlei\/24\/{{page}}\/\",\n\t\t\"style\": {\n\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\"layout_flexBasisPercent\": 0.29\n\t\t}\n\t}\n]","lastUpdateTime":"1763962765856","respondTime":180000,"ruleBookInfo":{"author":"\/\/meta[@property='og:novel:author']\/@content","coverUrl":"\/\/meta[@property='og:image']\/@content","intro":"\/\/meta[@property='og:description']\/@content","kind":"\/\/meta[@property='og:novel:category']\/@content","lastChapter":"\/\/meta[@property='og:novel:latest_chapter_name']\/@content","name":"\/\/meta[@property='og:novel:book_name']\/@content","tocUrl":"","wordCount":""},"ruleContent":{"content":"\/\/div[@id='chaptercontent']\/p\/text()","nextContentUrl":"\/\/a[@id='pt_next' and .='\u4e0b\u4e00\u9875']\/\/@href","sourceRegex":"","webJs":""},"ruleExplore":{"author":"class.author@text##\u4f5c\u8005\uff1a","bookList":"@css:.hot_sale","bookUrl":".hot_sale a@href","coverUrl":"","intro":"class.review@text##\u7b80\u4ecb\uff1a","kind":"","name":"class.title@text"},"ruleSearch":{"author":"dt span@text","bookList":"@css:.item","bookUrl":"div a@href","coverUrl":"img@src","intro":"dd@text","lastChapter":"","name":"dt a@text","wordCount":" "},"ruleToc":{"chapterList":"\/\/div[@class='directoryArea' and not(@id)]\/p","chapterName":"a@text","chapterUrl":"a@href","nextTocUrl":"\/\/a[@class='index-container-btn' and .='\u4e0b\u4e00\u9875']\/@href","updateTime":""},"searchUrl":"https:\/\/www.sososhu.com\/?q={{key}}&site=mwanopen&submit=\n","weight":0},{"bookSourceComment":"","bookSourceGroup":"","bookSourceName":"\ud83d\udcd6\u9605\u8bfb","bookSourceType":0,"bookSourceUrl":"http:\/\/kkcc.top\/","customOrder":127,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"@js:\n\nvar sort=[],\npush=(title,surl,size)=>sort.push({\n    title: title,\n    url: surl,\n    style: {\n      layout_flexGrow: 1,\n      layout_flexBasisPercent: size,\n     }\n  });\n  \npush(\"\u0f3a\u02c7\u00bb`\u029a\u6392\u884c\u699c\u025e\u00b4\u00ab\u02c7\u0f3b\",null,1,1); \n\n[\n[\"\u6708\u7968\u699c\",\"526080\"],\n[\"\u7545\u9500\u699c\",\"543064\"],\n[\"\u6f5c\u529b\u699c\",\"543065\"],\n[\"\u5b8c\u7ed3\u699c\",\"551072\"],\n[\"\u65b0\u4e66\u699c\",\"535331\"],\n[\"\u6bd4\u5fc3\u699c\",\"543074\"],\n[\"\u98d9\u5347\u699c\",\"543264\"],\n[\"\u63a8\u8350\u699c\",\"548111\"],\n[\"\u5c01\u795e\u699c\",\"514637\"],\n[\"\u4f1a\u5458\u65e5\u699c\",\"516604\"],\n[\"\u4f1a\u5458\u5468\u699c\",\"516605\"],\n[\"\u4f1a\u5458\u6708\u699c\",\"516606\"],\n[\"\u514d\u8d39\u7206\u6b3e\",\"543077\"],\n[\"\u514d\u8d39\u5b8c\u7ed3\",\"543395\"],\n[\"\u514d\u8d39\u98d9\u5347\",\"543085\"]\n].map([title,id]=>push(title, `https:\/\/commontgw.reader.qq.com\/v7_6_6\/listDispatch?action=rank&actionTag=boy&actionId=${id}&pagestamp={{page}}&rankFlag=1&plan=1&pageSize=200`,  0.25));\n  \n  \npush(\"\u0f3a\u02c7\u00bb`\u029a\u5206\u7c7b\u025e\u00b4\u00ab\u02c7\u0f3b\",null,1,1);  \n[\n[\"\u7384\u5e7b\",\"20001\"],\n[\"\u5947\u5e7b\",\"20005\"],\n[\"\u6b66\u4fa0\",\"20010\"],\n[\"\u4ed9\u4fa0\",\"20014\"],\n[\"\u90fd\u5e02\",\"20019\"],\n[\"\u73b0\u5b9e\",\"20065\"],\n[\"\u5386\u53f2\",\"20028\"],\n[\"\u519b\u4e8b\",\"20032\"],\n[\"\u6e38\u620f\",\"20050\"],\n[\"\u4f53\u80b2\",\"20054\"],\n[\"\u79d1\u5e7b\",\"20042\"],\n[\"\u60ac\u7591\",\"20037\"],\n[\"\u8f7b\u5c0f\u8bf4\",\"20059\"],\n[\"\u8bf8\u5929\u65e0\u9650\",\"20109\"],\n[\"\u77ed\u7bc7\",\"20076\"]\n].map([title,id]=>push(title, `https:\/\/commontgw.reader.qq.com\/v7_6_6\/book\/search?&bookLibraryAbFlag=2&booksort=1&actionTag=,-1,-1,-1,-1,13&actionId=${id}&action=categoryV2&pagestamp={{page}}&categoryFlag=6&signal=nextpage&searchFrom=${id}`,  0.25));\n \n  \n  \n  \n  \npush(\"\u0f3a\u02c7\u00bb`\u029a\u60c5\u8282\u4e3b\u9898\u025e\u00b4\u00ab\u02c7\u0f3b\",null,1,1);\n[\n    [\"\u7a7f\u8d8a\", \"9000722\"],\n    [\"\u4e1c\u65b9\u7384\u5e7b\", \"9000724\"],\n    [\"\u91cd\u751f\", \"9000837\"],\n    [\"\u73b0\u4ee3\u90fd\u5e02\", \"9000728\"],\n    [\"\u4fee\u4ed9\", \"9000817\"],\n    [\"\u6743\u8c0b\", \"9000774\"],\n    [\"\u5f02\u80fd\", \"9000823\"],\n    [\"\u5f02\u754c\", \"9000822\"],\n    [\"\u5a31\u4e50\u5708\", \"9000828\"],\n    [\"\u9006\u88ad\", \"9000775\"],\n    [\"\u4fee\u771f\", \"9000818\"],\n    [\"\u79cd\u7530\", \"9000838\"],\n    [\"\u7231\u60c5\", \"9000748\"],\n    [\"\u6e38\u620f\u5f02\u754c\", \"9000827\"],\n    [\"\u9ad8\u6b66\", \"9000739\"],\n    [\"\u9b54\u6cd5\", \"9000772\"],\n    [\"\u795e\u8bdd\", \"9000793\"],\n    [\"\u517b\u6210\", \"9000777\"],\n    [\"\u8be1\u79d8\", \"9000744\"],\n    [\"\u79d1\u4e3e\", \"9000760\"],\n    [\"\u672b\u4e16\", \"9000773\"],\n    [\"\u4fee\u7f57\u573a\", \"9000727\"],\n    [\"\u514b\u82cf\u9c81\", \"9001075\"],\n    [\"\u9274\u5b9d\", \"9000752\"],\n    [\"\u9ed1\u79d1\u6280\", \"9000746\"],\n    [\"\u6297\u6218\", \"9001010\"],\n    [\"LOL\", \"9001069\"],\n    [\"\u7535\u7ade\", \"9000723\"],\n    [\"\u5bd2\u95e8\u5b50\u5f1f\", \"9001015\"],\n    [\"\u6e38\u620f\u6587\", \"9001070\"],\n    [\"\u7f8e\u98df\", \"9000769\"],\n    [\"\u671d\u5802\u6c5f\u6e56\", \"9001002\"],\n    [\"\u840c\u5ba0\", \"9000770\"],\n    [\"\u5deb\u5e08\u6d41\", \"9001027\"],\n    [\"\u76db\u4e16\", \"9001030\"],\n    [\"\u519b\u5de5\", \"9001011\"],\n    [\"\u84b8\u6c7d\u670b\u514b\", \"9001076\"],\n    [\"\u5854\u9632\", \"9001072\"],\n    [\"\u7bee\u7403\", \"9000870\"],\n    [\"\u7b2c\u56db\u5929\u707e\", \"9001083\"],\n    [\"\u7b7e\u5230\", \"9000875\"],\n    [\"\u8352\u91ce\u6c42\u751f\", \"9001054\"],\n    [\"\u9ad8\u9f84\", \"9001044\"],\n    [\"\u4e61\u6751\", \"9001041\"],\n    [\"\u804a\u5929\u7fa4\", \"9000767\"],\n    [\"\u6218\u4e89\", \"9000830\"],\n    [\"\u5c0f\u5175\", \"9001012\"],\n    [\"\u76f4\u64ad\", \"9000834\"],\n    [\"\u6c14\u8fd0\u6d41\", \"9001032\"],\n    [\"\u786c\u79d1\u5e7b\", \"9000992\"],\n    [\"\u822a\u7a7a\", \"9001220\"],\n    [\"\u8d5b\u535a\u670b\u514b\", \"9000993\"],\n    [\"\u8db3\u7403\", \"9000871\"],\n    [\"\u63a2\u9669\", \"9000800\"],\n    [\"\u6c11\u4fd7\", \"9000990\"],\n    [\"\u4eba\u95f4\u767e\u6001\", \"9001046\"],\n    [\"\u519b\u65c5\", \"9000756\"],\n    [\"\u6b66\u4fa0\u5e7b\u60f3\", \"9001001\"],\n    [\"DND\", \"9001071\"],\n    [\"\u5e97\u4e3b\", \"9000989\"],\n    [\"\u7384\u5b66\", \"9000819\"],\n    [\"\u593a\u820d\", \"9000984\"],\n    [\"\u7a7f\u4e66\", \"9000985\"],\n    [\"\u5361\u724c\", \"9000757\"],\n    [\"\u4fa0\u5ba2\", \"9001004\"],\n    [\"\u79d1\u6280\u4fee\u771f\", \"9001078\"],\n    [\"\u673a\u7532\", \"9000742\"],\n    [\"\u4e2d\u5e74\", \"9001042\"],\n    [\"\u4e27\u5c38\", \"9001029\"],\n    [\"\u5c71\u6d77\u7ecf\", \"9001040\"],\n    [\"\u751f\u5b58\u6311\u6218\", \"9000988\"],\n    [\"\u8003\u53e4\", \"9001055\"],\n    [\"\u53f2\u8bd7\u5947\u5e7b\", \"9000797\"],\n    [\"\u5b97\u95e8\", \"9001003\"],\n    [\"\u4e3b\u795e\u521b\u4e16\", \"9001050\"],\n    [\"\u4e71\u4e16\", \"9001031\"],\n    [\"\u624b\u8db3\u60c5\u6df1\", \"9001045\"],\n    [\"\u5947\u5999\u5e7b\u60f3\", \"9000779\"],\n    [\"\u6276\u8d2b\", \"9001043\"],\n    [\"\u4f20\u7edf\u6b66\u4fa0\", \"9001000\"],\n    [\"\u5403\u9e21\", \"9001073\"],\n    [\"\u5bb6\u5ead\u4f26\u7406\", \"9001033\"],\n    [\"\u793e\u4f1a\u60ac\u7591\", \"9001048\"],\n    [\"\u77ed\u6545\u4e8b\", \"9000905\"],\n    [\"\u5973\u6027\u9898\u6750\", \"9001047\"]\n].map([title,id]=>push(title, `https:\/\/commontgw.reader.qq.com\/v7_6_6\/book\/search?action=tagV2&base_tagid=${id}&bookLibraryAbFlag=2&actionTag=-1,-1,-1,-1,-1,13&actionId=-1&pagestamp={{page}}&categoryFlag=6&signal=nextpage&searchFrom=${id}`,  0.25));\n  \n  \n  \npush(\"\u0f3a\u02c7\u00bb`\u029a\u884c\u6587\u6d41\u6d3e\u025e\u00b4\u00ab\u02c7\u0f3b\",null,1,1);\n[\n    [\"\u5929\u624d\u6d41\", \"9000802\"],\n    [\"\u7cfb\u7edf\u6d41\", \"9000814\"],\n    [\"\u65e0\u654c\u6d41\", \"9000809\"],\n    [\"\u7ecf\u8425\u6d41\", \"9000755\"],\n    [\"\u8bf8\u5929\u6d41\", \"9000839\"],\n    [\"\u5347\u7ea7\u6d41\", \"9000795\"],\n    [\"\u65e0\u9650\u6d41\", \"9000812\"],\n    [\"\u4e89\u9738\", \"9000833\"],\n    [\"\u51e1\u4eba\u6d41\", \"9000735\"],\n    [\"\u6d2a\u8352\u6d41\", \"9000747\"],\n    [\"\u8fdb\u5316\u6d41\", \"9000754\"],\n    [\"\u4e13\u4e1a\u6587\", \"9000999\"],\n    [\"\u5bcc\u6c11\", \"9001006\"],\n    [\"\u65f6\u7a7a\u6d41\", \"9000796\"],\n    [\"\u5f00\u5c40\u6d41\", \"9000759\"],\n    [\"\u5e55\u540e\u6d41\", \"9000996\"],\n    [\"\u804c\u4e1a\u6587\", \"9000835\"],\n    [\"\u5b66\u9662\u6d41\", \"9000821\"],\n    [\"\u53ec\u5524\u6d41\", \"9000832\"],\n    [\"\u795e\u533b\", \"9000824\"],\n    [\"\u6280\u672f\u6d41\", \"9000750\"],\n    [\"\u968f\u8eab\u6d41\", \"9000799\"],\n    [\"\u5546\u6218\", \"9001085\"],\n    [\"\u5e9f\u67f4\u6d41\", \"9000737\"],\n    [\"\u6781\u9053\u6d41\", \"9000749\"],\n    [\"\u5bb6\u65cf\", \"9001084\"],\n    [\"\u5f00\u6302\", \"9000758\"],\n    [\"\u60ac\u7591\u6d41\", \"9000820\"],\n    [\"\u4e92\u8054\u7f51\", \"9000997\"],\n    [\"\u5211\u4fa6\", \"9001079\"],\n    [\"\u4fa6\u63a2\u63a8\u7406\", \"9001080\"],\n    [\"\u5fa1\u517d\u6d41\", \"9001082\"],\n    [\"\u8d58\u5a7f\u6d41\", \"9000840\"],\n    [\"\u8f6e\u56de\u8005\", \"9001049\"],\n    [\"\u5f02\u517d\u6d41\", \"9000825\"],\n    [\"\u9a91\u58eb\u6d41\", \"9000780\"],\n    [\"\u638c\u95e8\u6d41\", \"9000831\"],\n    [\"\u5b66\u672f\", \"9001063\"],\n    [\"\u539f\u59cb\u6d41\", \"9000829\"],\n    [\"\u57fa\u5efa\u6d41\", \"9001007\"],\n    [\"\u62bd\u5956\", \"9001013\"],\n    [\"\u7956\u5b97\u6d41\", \"9001005\"],\n    [\"\u6c2a\u91d1\", \"9001014\"],\n    [\"\u7b56\u7565\u6d41\", \"9000998\"],\n    [\"\u5112\u9053\u6d41\", \"9000790\"],\n    [\"\u56fd\u672f\", \"9000745\"],\n    [\"\u7ba1\u7406\u5c40\", \"9001008\"]\n].map([title,id]=>push(title, `https:\/\/commontgw.reader.qq.com\/v7_6_6\/book\/search?action=tagV2&base_tagid=${id}&bookLibraryAbFlag=2&actionTag=-1,-1,-1,-1,-1,13&actionId=-1&pagestamp={{page}}&categoryFlag=6&signal=nextpage&searchFrom=${id}`,  0.25));\n\n\npush(\"\u0f3a\u02c7\u00bb`\u029a\u65f6\u7a7a\u80cc\u666f\u025e\u00b4\u00ab\u02c7\u0f3b\",null,1,1);\n[\n    [\"\u67b6\u7a7a\", \"9000751\"],\n    [\"\u5e74\u4ee3\u6587\", \"9000776\"],\n    [\"\u660e\u671d\", \"9001023\"],\n    [\"\u661f\u9645\", \"9000816\"],\n    [\"\u672a\u6765\", \"9000805\"],\n    [\"\u8d1e\u89c2\", \"9001021\"],\n    [\"\u79e6\u6c49\u4e09\u56fd\", \"9000782\"],\n    [\"\u7f8e\u6d32\", \"9001019\"],\n    [\"\u79e6\u6c49\", \"9001034\"],\n    [\"\u4e24\u664b\u968b\u5510\", \"9000765\"],\n    [\"\u5b8b\u671d\", \"9001022\"],\n    [\"\u5143\u5b87\u5b99\", \"9001077\"],\n    [\"\u6e05\u671d\", \"9001036\"],\n    [\"\u6b27\u6d32\", \"9001018\"],\n    [\"\u975e\u6d32\", \"9001020\"],\n    [\"\u5916\u56fd\u5386\u53f2\", \"9001016\"],\n    [\"\u4e94\u4ee3\u5341\u56fd\", \"9000808\"],\n    [\"\u4e0a\u53e4\u5148\u79e6\", \"9000792\"],\n    [\"\u6e05\u53f2\u6c11\u56fd\", \"9000784\"],\n    [\"\u6c11\u95f4\u4f20\u8bf4\", \"9001017\"]\n]\n.map([title,id]=>push(title, `https:\/\/commontgw.reader.qq.com\/v7_6_6\/book\/search?action=tagV2&base_tagid=${id}&bookLibraryAbFlag=2&actionTag=-1,-1,-1,-1,-1,13&actionId=-1&pagestamp={{page}}&categoryFlag=6&signal=nextpage&searchFrom=${id}`,  0.25));\n\n\n\npush(\"\u0f3a\u02c7\u00bb`\u029a\u89d2\u8272\u8eab\u4efd\u025e\u00b4\u00ab\u02c7\u0f3b\",null,1,1);  \n[\n    [\"\u81f3\u5c0a\u6d41\", \"9000863\"],\n    [\"\u660e\u661f\", \"9000852\"],\n    [\"\u541b\u738b\", \"9000851\"],\n    [\"\u8c0d\u6218\", \"9001058\"],\n    [\"\u592a\u76d1\", \"9001074\"],\n    [\"\u5973\u795e\", \"9000855\"],\n    [\"\u519c\u6c11\", \"9000842\"],\n    [\"\u6cd5\u5e08\", \"9000844\"],\n    [\"\u9053\u95e8\", \"9001039\"],\n    [\"\u8c0d\u6218\u7279\u5de5\", \"9001056\"],\n    [\"\u73a9\u5bb6\", \"9000858\"],\n    [\"NPC\", \"9001064\"],\n    [\"\u5b66\u9738\", \"9000873\"],\n    [\"\u7279\u79cd\u5175\", \"9001061\"],\n    [\"\u95e8\u9600\", \"9001026\"],\n    [\"\u76d7\u8d3c\", \"9001068\"],\n    [\"\u6218\u58eb\", \"9000877\"],\n    [\"\u5199\u624b\", \"9000859\"],\n    [\"\u5fa1\u5b85\u65cf\", \"9000861\"],\n    [\"\u548c\u5c1a\", \"9000879\"],\n    [\"\u4fdd\u5b89\", \"9000994\"],\n    [\"\u6740\u624b\", \"9001059\"],\n    [\"\u9526\u8863\u536b\", \"9000849\"],\n    [\"\u5927\u5e08\u5144\", \"9000878\"],\n    [\"\u4ed9\u541b\", \"9000864\"],\n    [\"\u795e\u5947\u751f\u7269\", \"9001028\"],\n    [\"\u7267\u5e08\", \"9001065\"],\n    [\"\u5973\u5c0a\", \"9000854\"],\n    [\"\u4e16\u5bb6\", \"9001025\"],\n    [\"\u5f13\u7bad\u624b\", \"9001066\"],\n    [\"\u4fdd\u9556\", \"9000995\"],\n    [\"\u5175\u738b\", \"9001057\"]\n].map([title,id]=>push(title, `https:\/\/commontgw.reader.qq.com\/v7_6_6\/book\/search?action=tagV2&base_tagid=${id}&bookLibraryAbFlag=2&actionTag=-1,-1,-1,-1,-1,13&actionId=-1&pagestamp={{page}}&categoryFlag=6&signal=nextpage&searchFrom=${id}`,  0.25));\n\n\n\npush(\"\u0f3a\u02c7\u00bb`\u029a\u89d2\u8272\u6027\u683c\u025e\u00b4\u00ab\u02c7\u0f3b\",null,1,1);\n[\n    [\"\u6740\u4f10\u679c\u65ad\", \"9000847\"],\n    [\"\u6210\u719f\", \"9000843\"],\n    [\"\u601d\u8def\u6e05\u5947\", \"9000845\"],\n    [\"\u8179\u9ed1\", \"9000874\"],\n    [\"\u626e\u732a\u5403\u864e\", \"9000719\"],\n    [\"\u81ea\u5f8b\", \"9000866\"],\n    [\"\u601d\u60f3\u8fea\u5316\", \"9001053\"],\n    [\"\u5634\u70ae\", \"9000867\"],\n    [\"\u94a2\u94c1\u76f4\u7537\", \"9000846\"]\n    ].map([title,id]=>push(title, `https:\/\/commontgw.reader.qq.com\/v7_6_6\/book\/search?action=tagV2&base_tagid=${id}&bookLibraryAbFlag=2&actionTag=-1,-1,-1,-1,-1,13&actionId=-1&pagestamp={{page}}&categoryFlag=6&signal=nextpage&searchFrom=${id}`,  0.25));\n\n\n\npush(\"\u0f3a\u02c7\u00bb`\u029a\u5185\u5bb9\u98ce\u683c\u025e\u00b4\u00ab\u02c7\u0f3b\",null,1,1);\n[\n    [\"\u8f7b\u677e\", \"9000785\"],\n    [\"\u70ed\u8840\", \"9000788\"],\n    [\"\u5feb\u8282\u594f\", \"9000762\"],\n    [\"\u641e\u7b11\", \"9000740\"],\n    [\"\u7fa4\u50cf\", \"9000787\"],\n    [\"\u6b63\u80fd\u91cf\", \"9000862\"],\n    [\"\u65e0\u91d1\u624b\u6307\", \"9000810\"],\n    [\"\u5355\u5973\u4e3b\", \"9000718\"],\n    [\"\u6821\u56ed\", \"9001035\"],\n    [\"\u65e0CP\", \"9000807\"],\n    [\"\u53cd\u5957\u8def\", \"9000736\"],\n    [\"\u7ea2\u5305\u6d41\", \"9001051\"],\n    [\"\u6cbb\u6108\", \"9000836\"],\n    [\"\u626e\u6f14\u6d41\", \"9001052\"],\n    [\"\u52b1\u5fd7\", \"9000764\"],\n    [\"\u9752\u6625\", \"9000783\"],\n    [\"\u591a\u5973\u4e3b\", \"9000729\"]\n].map([title,id]=>push(title, `https:\/\/commontgw.reader.qq.com\/v7_6_6\/book\/search?action=tagV2&base_tagid=${id}&bookLibraryAbFlag=2&actionTag=-1,-1,-1,-1,-1,13&actionId=-1&pagestamp={{page}}&categoryFlag=6&signal=nextpage&searchFrom=${id}`,  0.25));\n\n\n\n\n  \npush(\"\u0f3a\u02c7\u00bb`\u029a\u884d\u751f\u540c\u4eba\u025e\u00b4\u00ab\u02c7\u0f3b\",null,1,1);\n[\n    [\"\u540c\u4eba\u884d\u751f\", \"9000781\"],\n    [\"\u6597\u7f57\", \"9000732\"],\n    [\"\u6597\u7834\", \"9000731\"],\n    [\"\u7efc\u6f2b\", \"9000841\"],\n    [\"\u7ea2\u697c\", \"9000726\"],\n    [\"\u4e8c\u6b21\u5143\", \"9000730\"],\n    [\"\u4e09\u56fd\", \"9000791\"],\n    [\"\u5c01\u795e\", \"9000738\"],\n    [\"\u6c34\u6d52\", \"9000987\"],\n    [\"\u897f\u6e38\", \"9000815\"],\n    [\"\u6b66\u4fa0\u884d\u751f\", \"9000811\"],\n    [\"\u804a\u658b\", \"9000986\"],\n    [\"\u738b\u8005\u8363\u8000\", \"9000804\"]\n].map([title,id]=>push(title, `https:\/\/commontgw.reader.qq.com\/v7_6_6\/book\/search?action=tagV2&base_tagid=${id}&bookLibraryAbFlag=2&actionTag=-1,-1,-1,-1,-1,13&actionId=-1&pagestamp={{page}}&categoryFlag=6&signal=nextpage&searchFrom=${id}`,  0.25));\n\n\n\n\nJSON.stringify(sort);","header":"{\"User-Agent\": \"Mozilla\/5.0 (Linux; Android 13; 2211133C Build\/TKQ1.220905.001) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/135.0.0.0 Mobile Safari\/537.36\"}","lastUpdateTime":"1763995035836","loginUrl":"http:\/\/kkcc.top\/","respondTime":180000,"ruleBookInfo":{"author":"$.introinfo.book.author","coverUrl":"$.introinfo.book.coverUrl","intro":"&nbsp;\n\ud83d\udd70  \u66f4\u65b0\uff1a{{$.chapinfo.lastChapterUpdateTime##\\s.*}}\n\ud83c\udf1f  \u4e66\u67b6\uff1a{{$.introinfo..number##\\n.*}}\n\ud83c\udff7\ufe0f  \u6807\u7b7e\uff1a{{$.bookTags..tagshortname##\\n##\u00b7}}\n\ud83d\udcdc  \u7b80\u4ecb\uff1a\n{{$.introinfo.book.intro}}\n\ud83c\udf5a  \u4e66\u8bc4\uff1a\n\ud83d\udc64\uff1a{{$..commentlist..content##\\n##<p>\ud83d\udc64\uff1a}}##\\[emot.*\\]","kind":"{{$.introinfo..scoretext}}\n{{java.getString('$.introinfo.book.finished')==1?'\u5b8c\u7ed3':'\u8fde\u8f7d'}}\n{{$.cate2Info.cate2Name}}\n{{$.cate3Info.cate3Name}}\n{{$.chapinfo.lastChapterUpdateTime##\\s.*}}\n@js:result\n.replace(\/^(\\d\\.\\d)\/,'$1\u5206')","lastChapter":"{{$.introinfo.book.lastChapterName##\u6b63\u6587\u5377.|\u6b63\u6587.|VIP\u5377.|\u9ed8\u8ba4\u5377.|\u5377_|VIP\u7ae0\u8282.|\u514d\u8d39\u7ae0\u8282.|\u7ae0\u8282\u76ee\u5f55.|\u6700\u65b0\u7ae0\u8282.|[\\(\uff08\u3010].*?[\u6c42\u542b\u7406\u66f4\u8c22\u4e50\u53d1\u63a8\u7968\u76df\u8865\u52a0\u5b57].*?[\u3011\uff09\\)]}}\u2022{{$.chapinfo.lastChapterUpdateTime##\\s.*}}\n@js:result\n.replace(\"\u2022\u2022\",\"\")\n.replace(\/^(\\d+).\u7b2c\/,'\u7b2c')\n.replace(\/^(\\d+)[\u3001\uff0e]\u7b2c.+\u7ae0\/,'\u7b2c$1\u7ae0')\n.replace(\/^(\\d+)\u3001\\d+\u3001\/,'\u7b2c$1\u7ae0 ')\n.replace(\/^(\\d+)\u3001\\d+\/,'\u7b2c$1\u7ae0')\n.replace(\/^(\\d+)\u3001\/,'\u7b2c$1\u7ae0 ')\n.replace(\/^(\u7b2c.+\u7ae0)\\s?\u7b2c.+\u7ae0\/,'$1')\n.replace(\/\u7b2c\\s(.+)\\s\u7ae0\/,'\u7b2c$1\u7ae0')\n.replace(\/.*(chapter|Chapter)\\s?(\\d+)\\s?\/,'$1 $2 ')\n.replace(\/\\(.+\\)\/,'')\n.replace(\/\\[|\u3002\/,'')\n.replace(\/\u7b2c([\u96f6\u4e00\u4e8c\u4e24\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343]+)\u7ae0\/g,java.toNumChapter(result))\n##(\u7ae0)([^\\s]+)(\\s\u00b7)##$1 $2$3","name":"$.introinfo.book.title","tocUrl":"https:\/\/ubook.reader.qq.com\/api\/book\/chapter-list?bid={{$.introinfo.book.id}}","wordCount":"$.introinfo.book.totalwords"},"ruleContent":{"content":"$.data.content"},"ruleExplore":{"author":"$..author","bookList":"$..bookList..second[*]||$..bookList[*]","bookUrl":"https:\/\/detailadr.reader.qq.com\/v7_8_7\/nativepage\/book\/detail?bid={{$..bid}}","coverUrl":"$..bid\n@js:\nvar s = result\nfunction gt(s){\n\tlet a = s.slice(-3)\n\tif(a<10){\n\t\t\tn = s.slice(-1)\n\t\t}\n\telse if(a<100){\n\t\t\tn = s.slice(-2)\n\t\t}\n\telse{\n\t\t\tn = a\n\t\t}\n\treturn n\n}\n\"http:\/\/wfqqreader-1252317822.image.myqcloud.com\/cover\/\"+gt(s)+\"\/\"+s+\"\/b_\"+s+\".jpg\"","intro":"$..intro","kind":"{{$..catScore}}\n{{java.getString('$.finished')==1?'\u5b8c\u7ed3':'\u8fde\u8f7d'}}\n{{$..catel2name}}\n{{String(java.timeFormat(java.getString('$.updateTime')*1000)).replace(\/\\\/\/g,'-').replace(\/\\s.*\/,'').replace(\/1970\\-01\\-01\/,'')}}\n{{$..rank_value}}\n{{$..catel3name}}","lastChapter":"$..lastChapterName##\u6b63\u6587\u5377.|\u6b63\u6587.|VIP\u5377.|\u9ed8\u8ba4\u5377.|\u5377_|VIP\u7ae0\u8282.|\u514d\u8d39\u7ae0\u8282.|\u7ae0\u8282\u76ee\u5f55.|\u6700\u65b0\u7ae0\u8282.|[\\(\uff08\u3010].*?[\u6c42\u542b\u7406\u66f4\u8c22\u4e50\u53d1\u63a8\u7968\u76df\u8865\u52a0\u5b57].*?[\u3011\uff09\\)]\n@js:result\n.replace(\"\u2022\u2022\",\"\")\n.replace(\/^(\\d+).\u7b2c\/,'\u7b2c')\n.replace(\/^(\\d+)[\u3001\uff0e]\u7b2c.+\u7ae0\/,'\u7b2c$1\u7ae0')\n.replace(\/^(\\d+)\u3001\\d+\u3001\/,'\u7b2c$1\u7ae0 ')\n.replace(\/^(\\d+)\u3001\\d+\/,'\u7b2c$1\u7ae0')\n.replace(\/^(\u7b2c.+\u7ae0)\\s?\\d+\/,'$1')\n.replace(\/^(\\d+)\u3001\/,'\u7b2c$1\u7ae0 ')\n.replace(\/^(\u7b2c.+\u7ae0)\\s?\u7b2c.+\u7ae0\/,'$1')\n.replace(\/\u7b2c\\s(.+)\\s\u7ae0\/,'\u7b2c$1\u7ae0')\n.replace(\/.*(chapter|Chapter)\\s?(\\d+)\\s?\/,'$1 $2 ')\n.replace(\/\\(.+\\)\/,'')\n.replace(\/\\[|\u3002\/,'')\n.replace(\/\u7b2c([\u96f6\u4e00\u4e8c\u4e24\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343]+)\u7ae0\/g,java.toNumChapter(result))\n##(\u7ae0)([^\\s]+)(\\s\u00b7)##$1 $2$3","name":"$..title","wordCount":"$..totalWords"},"ruleSearch":{"author":"$.author","bookList":"$.data.books","bookUrl":"https:\/\/detailadr.reader.qq.com\/v7_8_7\/nativepage\/book\/detail?bid={{$.id}}","checkKeyWord":"\u6211\u7684\u6a21\u62df\u957f\u751f\u8def","coverUrl":"$.cover","intro":"$.intro","kind":"{{java.getString('$.finished')=='true'?'\u5b8c\u7ed3':'\u8fde\u8f7d'}}\n{{$..shortName##\u5c0f\u8bf4}}","name":"$.title","wordCount":"$.totalWords"},"ruleToc":{"chapterList":"$.data.chapters","chapterName":"title","chapterUrl":"<js>\nvar bid = baseUrl.match(\/\\d+\/);\njava.put('bid', bid);\n'https:\/\/wxmini.reader.qq.com\/api\/chapter\/content?bid='+bid+'&cid={{$.seq}}'\n<\/js>","isVip":"{{java.getString('$.free')=='true'?'false':'true'}}","updateTime":"$.publishTime##^##\u66f4\u65b0\u65f6\u95f4\uff1a"},"searchUrl":"api\/search?keywords={{key}}&pageIndex={{page}}&pageSize=20","weight":0},{"bookSourceName":"30\u8bfb\u4e66","bookSourceType":0,"bookSourceUrl":"https:\/\/www.30dushu.com\/","customOrder":6,"enabled":true,"enabledCookieJar":false,"enabledExplore":true,"exploreUrl":"\u5168\u90e8::https:\/\/www.30dushu.com\/cate\/0-{{page}}.html&&\u7384\u5e7b\u9b54\u6cd5::https:\/\/www.30dushu.com\/cate\/1-{{page}}.html&&\u6b66\u4fa0\u4fee\u771f::https:\/\/www.30dushu.com\/cate\/2-{{page}}.html&&\u90fd\u5e02\u8a00\u60c5::https:\/\/www.30dushu.com\/cate\/3-{{page}}.html&&\u5386\u53f2\u519b\u4e8b::https:\/\/www.30dushu.com\/cate\/4-{{page}}.html&&\u6e38\u620f\u7ade\u6280::https:\/\/www.30dushu.com\/cate\/5-{{page}}.html&&\u79d1\u5e7b\u7075\u5f02::https:\/\/www.30dushu.com\/cate\/6-{{page}}.html&&\u7eaf\u7231\u540c\u4eba::https:\/\/www.30dushu.com\/cate\/7-{{page}}.html&&\u5973\u751f\u8a00\u60c5::https:\/\/www.30dushu.com\/cate\/8-{{page}}.html&&\u4e8c\u6b21\u5143::https:\/\/www.30dushu.com\/cate\/9-{{page}}.html&&\u5176\u4ed6::https:\/\/www.30dushu.com\/cate\/10-{{page}}.html","lastUpdateTime":"1764079579539","respondTime":180000,"ruleBookInfo":{"author":"text.\ud83d\udc64@text","coverUrl":"img@src","intro":".detail-book-intro.0@text","kind":"text.\ud83d\udcda@text","lastChapter":".detail-chapter-item.1@text","name":"h1@text","tocUrl":".detail-book-actions>a.1@href","wordCount":"text.\ud83d\udcd6@text"},"ruleContent":{"content":"p@text","title":"h1@text"},"ruleExplore":{"author":"p@text","bookList":".book-card","bookUrl":"a.0@href","coverUrl":"img@src","name":"h3@text"},"ruleSearch":{"author":"text.\ud83d\udc64@text","bookList":".modern-search-item","bookUrl":"a.0@href","coverUrl":"img@src","intro":".modern-book-desc@text","kind":"text.\ud83d\udcda@text","name":".modern-book-title@text","wordCount":"text.\ud83d\udcd6@text"},"ruleToc":{"chapterList":".modern-chapter-item","chapterName":"a@text","chapterUrl":"a@href","nextTocUrl":"text.\u4e0b\u4e00\u9875@href"},"searchUrl":"\/search\/?searchkey={{key}}","weight":0},{"bookSourceName":"\u98d8\u5929(\u68af\u5b50 \u6a21\u7cca\u641c\u7d22)","bookSourceType":0,"bookSourceUrl":"https:\/\/www.piaotia.com","customOrder":0,"enabled":true,"enabledCookieJar":false,"enabledExplore":true,"lastUpdateTime":"1764413976626","respondTime":30000,"ruleBookInfo":{"intro":"tr:nth-child(1) > td:nth-child(2) > div@text","tocUrl":"caption > a@href"},"ruleContent":{"content":"@js:result=result.match(\/style4.js[\\s\\S]+<br>([\\s\\S]+)<\\\/div>[\\s\\S]+!-- \u7ffb\u9875\u4e0a\\\/)[1]\n"},"ruleExplore":[],"ruleSearch":{"author":".odd:nth-child(3)@text","bookList":"tr:nth-child(n+2)","bookUrl":".odd > a@href","kind":".even:nth-child(6)@text","lastChapter":".even > a@text","name":".odd > a@text","wordCount":".even:nth-child(4)@text@js:String(parseInt(result.replace('k',''))*1000)"},"ruleToc":{"chapterList":".centent ul li","chapterName":"a@text","chapterUrl":"a@href"},"searchUrl":"\/modules\/article\/search.php?searchkey={{java.encodeURI(key,'gbk')}}&searchtype=articlename","weight":0},{"bookSourceComment":"00shu\u5c0f\u8bf4\u7f51\u4e66\u6e90\uff0c\u7f16\u7801GBK\uff0c\u9002\u914d\u7ae0\u8282\/\u641c\u7d22\/\u8be6\u60c5\u89e3\u6790","bookSourceGroup":"CSS; \u6b63\u5219","bookSourceName":"00shu\u5c0f\u8bf4","bookSourceType":0,"bookSourceUrl":"https:\/\/www.00shu.la","bookUrlPattern":"","customOrder":0,"enabled":true,"enabledExplore":false,"exploreUrl":"","lastUpdateTime":"1764478609406","loginUrl":"","ruleBookInfo":{"author":"##:author\"[^\"]+\"([^\"]*)##$1###","coverUrl":"##og:image\"[^\"]+\"([^\"]*)##$1###","intro":"##:description\"[^\"]+\"([\\w\\W]*?)\"\/##$1###","kind":"##:category\"[^\"]+\"([^\"]*)##$1###","lastChapter":"##_chapter_name\"[^\"]+\"([^\"]*)##$1###","name":"##:book_name\"[^\"]+\"([^\"]*)##$1###","tocUrl":""},"ruleContent":{"content":"@css:#content p@textNodes##\u5e7f\u544a|\u5f39\u7a97|\u624b\u673a\u9605\u8bfb|\u8bb0\u4f4f\u7f51\u5740|<!\\[CDATA\\[|\\]\\]>","nextContentUrl":""},"ruleExplore":[],"ruleSearch":{"author":"@css:.s2>a@text","bookList":"@css:div.result-list>ul>li","bookUrl":"@css:.s1>a@href","coverUrl":"@css:.s3>img@src","intro":"@css:.s4@text","kind":"@css:.s5@text","lastChapter":"@css:.s6@text","name":"@css:.s1>a@text"},"ruleToc":{"chapterList":"-:<li><a[^\"]+\"([^\"]*)\">([^<]*)","chapterName":"$2","chapterUrl":"$1","nextTocUrl":""},"searchUrl":"\/search.aspx?key={{key}}&page={{page}},{\"charset\": \"gbk\"}","weight":0},{"bookSourceComment":"","bookSourceName":"22\u7b14\u8da3\u9601\uff08pc\uff09","bookSourceType":0,"bookSourceUrl":"https:\/\/www.22biqu.com","customOrder":0,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"[\n{\n    \"title\": \"\u2655 \u5206\u7c7b \u2655\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"title\": \"\u7384\u5e7b\u9b54\u6cd5\",\n    \"url\": \"\/fenlei\/1_{{page}}.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n  },\n  {\n    \"title\": \"\u6b66\u4fa0\u4fee\u771f\",\n    \"url\": \"\/fenlei\/2_{{page}}.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n  },\n  {\n    \"title\": \"\u90fd\u5e02\u8a00\u60c5\",\n    \"url\": \"\/fenlei\/3_{{page}}.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n  },\n  {\n    \"title\": \"\u5386\u53f2\u519b\u4e8b\",\n    \"url\": \"\/fenlei\/4_{{page}}.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n  },\n  {\n    \"title\": \"\u79d1\u5e7b\u7075\u5f02\",\n    \"url\": \"\/fenlei\/6_{{page}}.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n  },\n  {\n    \"title\": \"\u6e38\u620f\u7ade\u6280\",\n    \"url\": \"\/fenlei\/5_{{page}}.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n  },\n  {\n    \"title\": \"\u5973\u751f\u803d\u7f8e\",\n    \"url\": \"\/fenlei\/7_{{page}}.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n  },\n  {\n    \"title\": \"\u5176\u4ed6\u7c7b\u578b\",\n    \"url\": \"\/fenlei\/8_{{page}}.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n  },\n  {\n    \"title\": \"\u2655 \u6392\u884c\u699c \u2655\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"title\": \"\u603b\u6392\u884c\u699c\",\n    \"url\": \"\/rank\/allvisit\/\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n  },\n  {\n    \"title\": \"\u6708\u6392\u884c\u699c\",\n    \"url\": \"\/rank\/monthvisit\/\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n  },\n  {\n    \"title\": \"\u5468\u6392\u884c\u699c\",\n    \"url\": \"\/rank\/weekvisit\/\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n  },\n  {\n    \"title\": \"\u6536 \u85cf \u699c\",\n    \"url\": \"\/rank\/goodnum\/\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n  },\n  {\n    \"title\": \"\u2655 \u5168\u672c \u2655\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"title\": \"\u7384\u5e7b\u9b54\u6cd5\",\n    \"url\": \"\/quanben\/fenlei\/1_{{page}}.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n  },\n  {\n    \"title\": \"\u6b66\u4fa0\u4fee\u771f\",\n    \"url\": \"\/quanben\/fenlei\/2_{{page}}.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n  },\n  {\n    \"title\": \"\u90fd\u5e02\u8a00\u60c5\",\n    \"url\": \"\/quanben\/fenlei\/3_{{page}}.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n  },\n  {\n    \"title\": \"\u5386\u53f2\u519b\u4e8b\",\n    \"url\": \"\/quanben\/fenlei\/4_{{page}}.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n  },\n  {\n    \"title\": \"\u79d1\u5e7b\u7075\u5f02\",\n    \"url\": \"\/quanben\/fenlei\/6_{{page}}.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n  },\n  {\n    \"title\": \"\u6e38\u620f\u7ade\u6280\",\n    \"url\": \"\/quanben\/fenlei\/5_{{page}}.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n  },\n  {\n    \"title\": \"\u5973\u751f\u803d\u7f8e\",\n    \"url\": \"\/quanben\/fenlei\/7_{{page}}.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n  },\n  {\n    \"title\": \"\u5176\u4ed6\u7c7b\u578b\",\n    \"url\": \"\/quanben\/fenlei\/8_{{page}}.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n  }\n]","header":"{\n  \"User-Agent\": \"Mozilla\/5.0 (Linux; Android 8.0.0; MI 5s Plus Build\/OPR1.170623.032; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/71.0.3578.99 Mobile Safari\/537.36\"\n}","lastUpdateTime":"1764552038415","respondTime":180000,"ruleBookInfo":{"author":"[property=\"og:novel:author\"]@content","coverUrl":"[property=\"og:image\"]@content","intro":"[property=\"og:description\"]@content","kind":"[property~=category|status|update_time]@content","lastChapter":"[property~=las?test_chapter_name]@content","name":"[property=\"og:novel:book_name\"]@content","tocUrl":""},"ruleContent":{"content":"#content@p@html##\u672c\u7ae0\u672a\u5b8c.*","nextContentUrl":"text.\u4e0b\u4e00\u9875@href"},"ruleExplore":{"author":".author@text##\u4f5c\u8005\uff1a|\uff08\\d.*\uff09","bookList":".hot_sale","bookUrl":"a@href","coverUrl":"a.0@href##.+\\D((\\d+)\\d{3})\\D##https:\/\/img.22biqu.com\/$2\/$1\/$1s.jpg###","intro":".review@text","name":".title@text##^\\d+\\."},"ruleSearch":{"author":".s4@text","bookList":"class.txt-list txt-list-row5@li!0","bookUrl":"a.0@href","coverUrl":"","kind":".s1@text","lastChapter":".s3@text","name":".s2@text","checkKeyWord":"\u7cfb\u7edf"},"ruleToc":{"chapterList":"class.section-list fix@li@a","chapterName":"text","chapterUrl":"href","nextTocUrl":"option@value"},"searchUrl":"{{cookie.removeCookie(source.key)}}\/ss\/,{\n  \"body\": \"searchkey={{key}}&submit=\u641c\u7d22\",\n  \"method\": \"POST\"\n}","weight":0},{"bookSourceComment":"\u6f2b\u753b\u53d1\u5e03\u9875\uff1ahttps:\/\/wn01.link\/\n1\u20e3\ufe0f\u65e0\u9700\u7ffb\u5899\uff0c\u56fd\u5185\u76f4\u8fde\n2\u20e3\ufe0f\u6f2b\u753b\u6ca1\u52a0\u8f7d\u51fa\u6765\u5c1d\u8bd5\u5237\u65b0\u4e00\u4e0b\n3\u20e3\ufe0f\u8138\u9ed1\ud83c\udf1a\u5237\u4e0d\u51fa\u6765\u7684\uff0c\u522b\u7528wifi\uff0c\u7528\u6d41\u91cf\u770b\u3002","bookSourceGroup":"\u6f2b\u753b","bookSourceName":"\u7ec5\u58eb\u6f2b\u753b( \u4f18+++ )","bookSourceType":2,"bookSourceUrl":"https:\/\/www.wnacg.ru\/","customOrder":453,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"[\n  {\n    \"title\": \"\ud83d\udd16\u6392\u884c\ud83d\udd16\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n    },\n  {\n    \"title\": \"\u6708\u699c\",\n    \"url\": \"https:\/\/www.wnacg.ru\/albums-favorite_ranking-page-{{page}}-type-month.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u5468\u699c\",\n    \"url\": \"https:\/\/www.wnacg.ru\/albums-favorite_ranking-page-{{page}}-type-week.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n {\n    \"title\": \"\u65e5\u699c\",\n    \"url\": \"https:\/\/www.wnacg.ru\/albums-favorite_ranking-page-{{page}}-type-day.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n    {\n    \"title\": \"\ud83d\udd16\u540c\u4eba\u5fd7\ud83d\udd16\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n    },\n  {\n    \"title\": \"\u521b\u5efa\u65f6\u95f4\",\n    \"url\": \"https:\/\/www.wnacg.ru\/albums-index-page-{{page}}-cate-1.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u4e0a\u4f20\u65f6\u95f4\",\n    \"url\": \"https:\/\/www.wnacg.ru\/albums-index-page-{{page}}-cate-1.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n {\n    \"title\": \"\u56fe\u7247\u6570\",\n    \"url\": \"https:\/\/www.wnacg.ru\/albums-index-page-{{page}}-cate-1.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\ud83d\udd16\u97e9\u6f2b\ud83d\udd16\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n    },\n  {\n    \"title\": \"\u521b\u5efa\u65f6\u95f4\",\n    \"url\": \"https:\/\/www.wnacg.ru\/albums-index-page-{{page}}-cate-20.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u4e0a\u4f20\u65f6\u95f4\",\n    \"url\": \"https:\/\/www.wnacg.ru\/albums-index-page-{{page}}-cate-20.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n {\n    \"title\": \"\u56fe\u7247\u6570\",\n    \"url\": \"https:\/\/www.wnacg.ru\/albums-index-page-{{page}}-cate-20.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n\n  {\n    \"title\": \"\ud83d\udd16\u5355\u884c\u672c\ud83d\udd16\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n    },\n  {\n    \"title\": \"\u521b\u5efa\u65f6\u95f4\",\n    \"url\": \"https:\/\/www.wnacg.ru\/albums-index-page-{{page}}-cate-9.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u4e0a\u4f20\u65f6\u95f4\",\n    \"url\": \"https:\/\/www.wnacg.ru\/albums-index-page-{{page}}-cate-9.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n {\n    \"title\": \"\u56fe\u7247\u6570\",\n    \"url\": \"https:\/\/www.wnacg.ru\/albums-index-page-{{page}}-cate-9.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\ud83d\udd16\u6742\u5fd7&\u77ed\u7bc7\ud83d\udd16\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n    },\n  {\n    \"title\": \"\u521b\u5efa\u65f6\u95f4\",\n    \"url\": \"https:\/\/www.wnacg.ru\/albums-index-page-{{page}}-cate-10.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u4e0a\u4f20\u65f6\u95f4\",\n    \"url\": \"https:\/\/www.wnacg.ru\/albums-index-page-{{page}}-cate-10.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n {\n    \"title\": \"\u56fe\u7247\u6570\",\n    \"url\": \"https:\/\/www.wnacg.ru\/albums-index-page-{{page}}-cate-10.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  }\n]","header":"{\n  \"User-Agent\": \"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/142.0.0.0 Safari\/537.36\",\n  \"Referer\": \"https:\/\/www.wnacg.ru\/\",\n  \"Accept-Language\": \"zh-CN,zh;q=0.9\"\n}","lastUpdateTime":"1764665472889","respondTime":180000,"ruleBookInfo":{"coverUrl":"\/\/div[@class='asTB']\/div[@class='asTBcell uwthumb']\/img\/@src##\/\/\/\/##https:\/\/","downloadUrls":"\/\/div[@id='ads']\/a[1]\/@href","intro":"\/\/div[@class='asTBcell uwconn']\/p\/text()@js:result.split('\\n').join('')","kind":"\/\/div[@class='addtags']\/a[@class='tagshow']\/text()","wordCount":"\/\/div[@class='asTBcell uwconn']\/label\/text()@js:\nconst infoSplit =  result.split('\\n')\nconst info = []\nfor(var i  = 0;i<infoSplit .length;i++){\ninfo.push(infoSplit[i].split('\uff1a')[1])\n}\ninfo.join('  ')"},"ruleContent":{"content":"\/\/span[@id='imgarea']\/a\/img\/@src##\/\/##https:\/\/@js:\n\n\/\/ \u83b7\u53d6\u524d\u7f00URL\nconst regexStr = \"^https:\/\/img5\\\\.qy0\\\\.ru\/data\/\\\\d+\/\\\\d+\/\";\nconst regex = new RegExp(regexStr, \"g\");\nconst prefixUrlMatch = result.match(regex);\nconst prefixUrl = prefixUrlMatch ? prefixUrlMatch[0] : \"\";\n\n\/\/ \u89e3\u6790\u56fe\u7247\u4fe1\u606f\u6570\u7ec4\uff08\u5bb9\u9519\uff1a\u6570\u7ec4\u4e3a\u7a7a\u65f6\u8bbe\u4e3a[]\uff09\nconst imgInfoList = JSON.parse(java.get('imgInfoList') || '[]');\n\n\/\/ \u62fc\u63a5\u5b8c\u6574\u56fe\u7247\u94fe\u63a5\uff08\u76f4\u63a5\u4f7f\u7528\u539f\u59cbimgName\uff09\nconst imgUrlList = [];\nif (prefixUrl) {\n    imgInfoList.forEach(item => {\n        \/\/ \u4ec5\u505a\u7a7a\u503c\u5bb9\u9519\uff0c\u4e0d\u4fee\u6539imgName\u539f\u59cb\u503c\n        const imgName = item.imgName || '';\n        const imgExtension = item.imgExtension || 'jpg';\n        const fullImgUrl = prefixUrl + imgName + \".\" + imgExtension;\n        imgUrlList.push(fullImgUrl);\n    });\n}\n\n\/\/ \u89c4\u5219\u8f93\u51fa\u62fc\u63a5\u540e\u7684img\u6807\u7b7e\nimgUrlList.map(x=>'<img src=\\\"'+x+'\\\">')\n.join(\"\\n\")","imageStyle":"FULL"},"ruleExplore":[],"ruleSearch":{"bookList":"\/\/div[@class='gallary_wrap']\/ul\/li","bookUrl":"\/\/div[@class='info']\/div[@class='title']\/a\/@href,{\"webView\":true}","checkKeyWord":"\u5143\u9b54\u6cd5","coverUrl":"\/\/li\/div[1]\/a\/img\/@src","intro":"\/\/li\/div[@class='info']\/div[@class='info_col']\/text()@js:\nvar timeStr = result.split(\"\uff0c\")[1] || \"\";\nvar updateTime = timeStr.match(\/\u5275\u5efa\u65bc(\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2})\/)?.[1] || \"\u65e0\u65f6\u95f4\";\n'\u66f4\u65b0\u65f6\u95f4:  ' + updateTime;","kind":"\/\/li\/div[1]\/@class@js:\nif (result[0].indexOf('cate-1') !== -1) { \n    '\u540c\u4eba\u5fd7\/\u6c49\u5316'; \/\/ \u52a0return\uff0c\u5426\u5219\u65e0\u8fd4\u56de\u503c\n} else if (result[0].indexOf('cate-12') !== -1) {\n    '\u540c\u4eba\u5fd7\/\u65e5\u8bed'; \n} else if (result[0].indexOf('cate-9') !== -1) {\n    '\u5355\u884c\u672c\/\u6c49\u5316';\n} else if (result[0].indexOf('cate-13') !== -1) {\n    '\u5355\u884c\u672c\/\u65e5\u8bed';\n} else if (result[0].indexOf('cate-10') !== -1) {\n    '\u6742\u5fd7&\u77ed\u7bc7\/\u6c49\u5316';\n} else if (result[0].indexOf('cate-14') !== -1) {\n    '\u6742\u5fd7&\u77ed\u7bc7\/\u65e5\u8bed';\n} else if (result[0].indexOf('cate-18') !== -1) {\n     '\u6742\u5fd7&\u77ed\u7bc7\/English';\n} else if (result[0].indexOf('cate-20') !== -1) {\n    '\u97e9\u6f2b\/\u6c49\u5316';\n} else if (result[0].indexOf('cate-21') !== -1) {\n    '\u97e9\u6f2b\/\u751f\u8089';\n} else {\n    ''; \n}","name":"\/\/div[@class='info']\/div[@class='title']\/a\/\/text()@js:\nconst bookname= result.split('\\n').join('').replace(\/^.*?]\/g, '')\nbookname","wordCount":"\/\/li\/div[@class='info']\/div[@class='info_col']\/text()@js:\nvar imgNum = result.split(\"\uff0c\")[0].match(\/\\d+(?=\u5f35\u5716\u7247)\/g)[0]\nimgNum+'\u9875'"},"ruleToc":{"chapterList":"\/\/div[@class='gallary_wrap tb']\/ul\/li[1]@js:\nvar imgInfoList = [];\nvar nextPageUrl = [];\n\n\/\/ === \u81ea\u52a8\u751f\u6210\u5b8c\u6574\u5206\u9875\u5217\u8868 ===\n\n\/\/ 1. \u83b7\u53d6\u5206\u9875\u533a\u7684\u6240\u6709\u94fe\u63a5\u5b57\u7b26\u4e32\nvar paginatorHrefs = java.getString(\"\/\/div[@class='f_left paginator']\/\/a\/@href\") || \"\";\n\n\/\/ 2. \u521d\u59cb\u5316\u53d8\u91cf\nvar maxPage = 1;\nvar aid = \"\";\nvar urlPattern = \/page-(\\d+)-aid-(\\d+)\/; \/\/ \u5339\u914d page-\u6570\u5b57-aid-\u6570\u5b57\n\n\/\/ 3. \u904d\u5386\u94fe\u63a5\u627e\u5230\u201c\u6700\u5927\u9875\u7801\u201d\u548c\u201c\u76f8\u518cID\u201d\n\/\/ \u5206\u5272\u5b57\u7b26\u4e32\u5e76\u8fc7\u6ee4\u7a7a\u884c\nvar links = paginatorHrefs.split('\\n');\nfor (var i = 0; i < links.length; i++) {\n    var link = links[i].trim();\n    var match = link.match(urlPattern);\n    \n    if (match) {\n        var pageNum = parseInt(match[1]); \/\/ \u63d0\u53d6\u9875\u7801\n        var currentAid = match[2];        \/\/ \u63d0\u53d6AID\n        \n        \/\/ \u66f4\u65b0\u6700\u5927\u9875\u7801\n        if (pageNum > maxPage) {\n            maxPage = pageNum;\n        }\n        \/\/ \u63d0\u53d6AID\uff08\u5982\u679c\u8fd8\u6ca1\u63d0\u53d6\u5230\uff09\n        if (!aid) {\n            aid = currentAid;\n        }\n    }\n}\n\n\/\/ 4. \u6839\u636e\u83b7\u53d6\u5230\u7684 maxPage \u548c aid \u751f\u6210\u5b8c\u6574\u7684 URL \u5217\u8868\nif (aid && maxPage > 1) {\n    for (var i = 1; i <= maxPage; i++) {\n        \/\/ \u62fc\u63a5\u6807\u51c6URL\u683c\u5f0f\uff1aphotos-index-page-{\u9875\u7801}-aid-{ID}.html\n        nextPageUrl.push(\"https:\/\/www.wnacg.ru\/photos-index-page-\" + i + \"-aid-\" + aid + \".html\");\n    }\n} else {\n    \/\/ \u5982\u679c\u6ca1\u6709\u627e\u5230\u5206\u9875\uff08\u53ea\u6709\u4e00\u9875\u7684\u60c5\u51b5\uff09\uff0c\u76f4\u63a5\u4f7f\u7528\u5f53\u524d\u9875\u9762\n    nextPageUrl.push(baseUrl);\n}\n\njava.log(\"\u751f\u6210\u7684\u603b\u9875\u6570: \" + nextPageUrl.length);\n\n\njava.log(\"nexturl\"+nextPageUrl.join(\"\\n\"))\n\/\/ 2. \u6838\u5fc3\u5de5\u5177\u51fd\u6570\uff1a\u9884\u5904\u7406HTML\uff08\u79fb\u9664\u6ce8\u91ca+\u6e05\u7406\u7a7a\u683c\uff09\nfunction cleanHtml(html) {\n    if (!html) return \"\";\n    \/\/ \u6b65\u9aa41\uff1a\u79fb\u9664\u6240\u6709HTML\u6ce8\u91ca\uff08<!-- ... -->\uff09\uff0c\u5f7b\u5e95\u6d88\u9664\u5e72\u6270\n    html = html.replace(\/<!--[\\s\\S]*?-->\/g, \"\");\n    \/\/ \u6b65\u9aa42\uff1a\u79fb\u9664\u591a\u4f59\u7a7a\u767d\u5b57\u7b26\uff08\u6362\u884c\u3001\u5236\u8868\u7b26\u7b49\uff09\uff0c\u7b80\u5316\u5339\u914d\n    html = html.replace(\/\\s+\/g, \" \");\n    return html;\n}\n\n\/\/ 3. \u6838\u5fc3\u5de5\u5177\u51fd\u6570\uff1a\u63d0\u53d6\u5355\u9875\u7684\u201c\u5e8f\u53f7\u6570\u7ec4\u201d\u548c\u201c\u56fe\u7247src\u6570\u7ec4\u201d\nfunction extractPageData(cleanedHtml) {\n    var names = []; \/\/ \u5e8f\u53f7\u6570\u7ec4\uff08001\u3001002\u3001003...\uff09\n    var srcs = [];  \/\/ \u56fe\u7247src\u6570\u7ec4\uff08\u4e0e\u5e8f\u53f7\u4e00\u4e00\u5bf9\u5e94\uff09\n\n    \/\/ \u63d0\u53d6\u6240\u6709\u5e8f\u53f7\uff08<span class=\"name tb\">xxx<\/span>\uff09\n    var nameRegex = \/<span class=\"name tb\">([\\d]+)<\\\/span>\/g;\n    var nameMatch;\n    while ((nameMatch = nameRegex.exec(cleanedHtml)) !== null) {\n        names.push(nameMatch[1]);\n    }\n\n    \/\/ \u63d0\u53d6\u6240\u6709\u6709\u6548\u56fe\u7247src\uff08\u4e0e\u5e8f\u53f7\u5bf9\u5e94\u7684img\uff0calt\u5305\u542b\u201c_\u5e8f\u53f7\u201d\uff09\n    var srcRegex = \/<img src=\"([^\"]+)\" alt=\"[^\"]+_([\\d]+)\"\/g;\n    var srcMatch;\n    while ((srcMatch = srcRegex.exec(cleanedHtml)) !== null) {\n        \/\/ \u786e\u4fddsrc\u5bf9\u5e94\u7684\u5e8f\u53f7\u5728names\u6570\u7ec4\u4e2d\uff08\u907f\u514d\u65e0\u5173\u56fe\u7247\uff09\n        if (names.includes(srcMatch[2])) {\n            srcs.push(srcMatch[1]);\n        }\n    }\n\n    return { names: names, srcs: srcs };\n}\n\n\/\/ 4. \u6267\u884c\u591a\u9875\u63d0\u53d6\ntry {\n    for (var p = 0; p < nextPageUrl.length; p++) {\n        var pageUrl = nextPageUrl[p];\n        var pageNum = p + 1;\n\n        \/\/ \u6b65\u9aa41\uff1a\u83b7\u53d6\u5e76\u6e05\u7406HTML\uff08\u79fb\u9664\u6ce8\u91ca+\u591a\u4f59\u7a7a\u683c\uff09\n        var rawHtml = new String(java.ajax(pageUrl)) || \"\";\n        var cleanedHtml = cleanHtml(rawHtml);\n\n        \/\/ \u6b65\u9aa42\uff1a\u63d0\u53d6\u5f53\u524d\u9875\u7684\u5e8f\u53f7\u548csrc\u6570\u7ec4\n        var pageData = extractPageData(cleanedHtml);\n        var pageNames = pageData.names;\n        var pageSrcs = pageData.srcs;\n\n        \/\/ \u6b65\u9aa43\uff1a\u6309\u7d22\u5f15\u914d\u5bf9\uff08\u5e8f\u53f7\u548csrc\u4e00\u4e00\u5bf9\u5e94\uff09\uff0c\u907f\u514d\u6f0f\u914d\n        var addedNum = 0;\n        for (var i = 0; i < pageNames.length; i++) {\n            var imgName = pageNames[i];\n            var imgSrc = pageSrcs[i] || \"\";\n            var imgExtension = \"\";\n\n            \/\/ \u63d0\u53d6\u6269\u5c55\u540d\n            if (imgSrc) {\n                var dotIndex = imgSrc.lastIndexOf(\".\");\n                if (dotIndex !== -1) {\n                    imgExtension = imgSrc.slice(dotIndex + 1).toLowerCase().split(\/[?#]\/)[0];\n                }\n            }\n\n            \/\/ \u53bb\u91cd\u5e76\u6dfb\u52a0\u5230\u6570\u7ec4\n            if (imgName && imgExtension && !imgInfoList.some(item => item.imgName === imgName)) {\n                imgInfoList.push({ imgName: imgName, imgExtension: imgExtension });\n                addedNum++;\n            }\n        }\n\n    }\n} catch (e) {\n    java.log(\"\u63d0\u53d6\u62a5\u9519\uff1a\" + e.message);\n}\n\nimgInfoList.sort((a, b) => parseInt(a.imgName) - parseInt(b.imgName));\n\n\/\/ \u8fd4\u56de\u539f\u7ed3\u679c\uff0c\u4e0d\u5f71\u54cd\u76ee\u5f55\u5217\u8868\njava.put('imgInfoList',JSON.stringify(imgInfoList))\nresult;","chapterName":"\/\/li\/text()@js:'\u5168\u8bdd\u9605\u8bfb'","chapterUrl":"\/\/li\/\/a\/@href,{\"webView\":true}","updateTime":"\/\/li\/div[@class='info']\/div[@class='info_col']\/text()"},"searchUrl":"https:\/\/www.wnacg.ru\/search\/?q={{key}}&f=_all&s=create_time_DESC&syn=yes","weight":500},{"bookSourceComment":"\u53bb\u9664\u6bcf\u65e5\u9605\u8bfb\u7ae0\u8282\u6570\u91cf\u9650\u5236\n\u4fee\u590d\u83b7\u53d6\u4e0d\u5230\u8fde\u8f7d\u6700\u65b0\u7ae0\u8282\u95ee\u9898","bookSourceName":"\ud83d\udcd7\u5f97\u95f4\u5c0f\u8bf4\ud83d\udc1c","bookSourceType":0,"bookSourceUrl":"https:\/\/wechat.idejian.com","concurrentRate":"1","customOrder":0,"enabled":true,"enabledCookieJar":false,"enabledExplore":true,"exploreUrl":"@js:\nvar url1=['https:\/\/www.idejian.com\/\/books\/nansheng?order=UID&categoryId=&page={{page}})'\n    ,'https:\/\/www.idejian.com\/\/books\/nansheng?order=1&categoryId=UID&page={{page}})'\n    ,'https:\/\/www.idejian.com\/\/books\/nvsheng?order=UID&categoryId=&page={{page}})'\n    ,'https:\/\/www.idejian.com\/\/books\/nvsheng?order=1&categoryId=UID&page={{page}})'\n,'https:\/\/www.idejian.com\/\/books\/chuban?order=UID&categoryId=&page={{page}})'\n,'https:\/\/www.idejian.com\/\/books\/chuban?order=1&categoryId=UID&page={{page}})'];\nvar defaultTitle={'title': '','url': '','style': {'layout_flexGrow': 1, 'layout_flexBasisPercent': 1}};\nvar defaultContent={'title': '','url': '','style': {'layout_flexGrow': 1, 'layout_flexBasisPercent': 0.25}};\nvar tab1={'\u70ed\u5ea6\u699c':'1','\u6700\u65b0\u4e0a\u67b6':'2','\u66f4\u65b0\u65f6\u95f4':'3','\u8bc4\u5206\u6392\u884c':'4'}\nvar tab2={'\u5947\u5e7b':'1114','\u7384\u5e7b':'1115','\u6b66\u4fa0':'1116','\u4ed9\u4fa0':'1117','\u90fd\u5e02':'1118','\u6821\u56ed':'1119','\u5386\u53f2':'1120','\u519b\u4e8b':'1121','\u6e38\u620f':'1122','\u7ade\u6280':'1123','\u79d1\u5e7b':'1124','\u7075\u5f02':'1125'}\nvar tab3={\"\u73b0\u4ee3\u8a00\u60c5\":'1126',\"\u73b0\u4ee3\u8a00\u60c5\":'1127',\"\u5e7b\u60f3\u8a00\u60c5\":'1128',\"\u9752\u6625\u6821\u56ed\":'1129',\"\u540c\u4eba\u4f5c\u54c1\":'1130',\"\u60ca\u609a\u6050\u6016\":'1132',\"\u9752\u6625\u6821\u56ed\":'1133'}\nvar tab4={\"\u4eba\u6587\u793e\u79d1\":'1134',\"\u7ecf\u8425\u52b1\u5fd7\":'1135',\"\u751f\u6d3b\":'1136',\"\u6559\u80b2\":'1137',\"\u6587\u5b66\u827a\u672f\":'1138'}\nvar reultJson=[];\nvar AddTab =function(title,listMap,url){\n    if(title!=='')AddSingleTab(title,'');\n    for (var key in listMap) {\n        if (listMap.hasOwnProperty(key)) {\n            tempContent=JSON.parse(JSON.stringify(defaultContent));\n            tempContent.title=key;\n            tempContent.url=url.replace('UID',listMap[key]);\n            reultJson.push(tempContent);\n        }\n    }\n}\nvar AddSingleTab =function(title,url){\n    tempTitle=JSON.parse(JSON.stringify(defaultTitle));\n    tempTitle.title=title;\n    tempTitle.url=url;\n    reultJson.push(tempTitle);\n}\n\n\nAddTab(\"\u0f3a\u02c7\u00bb`\u029a\u7537\u751f\u025e\u00b4\u00ab\u02c7\u0f3b\",tab1,url1[0]);\nAddTab(\"\",tab2,url1[1]);\nAddTab(\"\u0f3a\u02c7\u00bb`\u029a\u5973\u751f\u025e\u00b4\u00ab\u02c7\u0f3b\",tab1,url1[2]);\nAddTab(\"\",tab3,url1[3]);\nAddTab(\"\u0f3a\u02c7\u00bb`\u029a\u51fa\u7248\u025e\u00b4\u00ab\u02c7\u0f3b\",tab1,url1[4]);\nAddTab(\"\",tab4,url1[5]);\n\nJSON.stringify(reultJson);","header":"{\n\"User-Agent\":\"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/131.0.0.0 Safari\/537.36\"\n}","lastUpdateTime":"1764724003709","respondTime":180000,"ruleBookInfo":{"init":"body","intro":"desc","kind":"bookInfo.multiCategory&&bookInfo.completeState&&bookInfo.popularity&&bookInfo.like&&bookInfo.tag@js:\nlet parts = String(result).split(',');\nlet isFloat=function (str) {\n    return !isNaN(parseFloat(str)) && isFinite(str);\n  }\nlet arr = [];\nfor (let i = 0; i < parts.length; i++) {\n    if (parts[i].includes('{')) continue;\n    t = \/name=([^}]+)\/gm.exec(parts[i]);\n    if (t != null) {\n        arr.push(t[1]);\n        continue;\n    }\n    if (i < parts.length - 1) {\n        if (isFloat(parts[i]) && !isFloat(parts[i + 1])) {\n            arr.push(parts[i] + parts[i + 1]);\n            i++;\n        } else {\n            arr.push(parts[i]);\n        }\n\n    } else {\n        arr.push(parts[i].replace(']',''));\n    }\n} \nrz=arr.toString();\n\/\/java.log(rz);\nrz","lastChapter":"@js:\nobj=java.getElement(\"$.newestChapter\");\nobj.name=obj.lastChapter;\nobj.url=obj.lastChapterUrl;\ncache.putMemory(\"lastChapter\",obj);\nobj.lastChapter;","tocUrl":"https:\/\/wechat.idejian.com\/api\/wechat\/allcatalog\/{{$.bookInfo.bookId}}?bookId={{$.bookInfo.bookId}}&page=1"},"ruleContent":{"content":"body.content@js:\ncookie.removeCookie(source.getKey());\nresult.replace(\/(<div[\\s\\S]+zhangyue-tablebody[\\s\\S]+<\\\/table>\\n.+)|(<h1.+text-title-1[\\s\\S]+<\\\/h1>)\/g,'')"},"ruleExplore":{"author":".bkitem_author@text","bookList":".v_books > li","bookUrl":".bkitem_name > a@href@js:`https:\/\/wechat.idejian.com\/api\/wechat${result}`","coverUrl":"img@src","intro":".bkitem_brief@text","kind":".bkitem_types:nth-child(2)@text&&.bkitem_types:nth-child(3)@text","name":".bkitem_name > a@text","wordCount":".bk_fontnum@text"},"ruleSearch":{"author":".author@text","bookList":".rank_ullist > li","bookUrl":"https:\/\/wechat.idejian.com\/api\/wechat{{@@.bk_brief_btn@href}}","coverUrl":"img@src","intro":".rank_bkbrief@text","kind":"span:nth-child(3)@text&&.search_ohter > span:nth-child(1)@text","lastChapter":".rank_newpage > a@text","name":".rank_bkname@text","wordCount":"span:nth-child(2) > i@text"},"ruleToc":{"chapterList":"body.chapterList@js:\ncookie.removeCookie(source.getKey());\n\/\/java.log(result)\nlet obj = cache.getFromMemory(\"lastChapter\");\nlet a = +String(result[result.length - 1].url).match(\/(\\d+)\\.html\/)[1];\nif (obj) {\n\t   let b = +String(obj.url).match(\/(\\d+)\\.html\/)[1];\n\t   cache.deleteMemory(\"lastChapter\");\n    if (b > a) {\n        if (b - a > 1) {\n            let arr = [];\n            let id = baseUrl.match(\/bookId=(\\d+)\/)[1];\n            for (let i = a+1; i < b; i++) {\n                arr.push({ name: `\u7b2c${i}\u7ae0`, url: `\/book\/${id}\/${i}.html`});\n            }\n            \/\/java.log(JSON.stringify(arr, null, 2));\n            let htm = java.ajax(`https:\/\/wechat.idejian.com\/catalog?page=${Math.ceil(a \/ 50)}&bookId=${id}`);\n            let e = org.jsoup.Jsoup.parse(htm).select('.catalog_list');      \n            arr.forEach(x => {\n                let k = e.select(`a[href='${x.url}'] .text`).text() + '';\n                if (k) x.name = k;\n                result[result.length] = JSON.stringify(x);\n            });\n        }\n        result[result.length] = obj;\n    }\n}\n\/\/java.log(result);\nresult;","chapterName":"name","chapterUrl":"https:\/\/wechat.idejian.com\/api\/wechat{{$.url##.html}}"},"searchUrl":"https:\/\/www.idejian.com\/search?keyword={{key}}&page={{page}}","weight":0},{"bookSourceComment":"\u6ca1\u5199\u641c\u7d22\uff0c\u611f\u89c9\u8fd9\u79cd\u7f51\u7ad9\u968f\u4fbf\u770b\u770b\u5c31\u884c\u4e86\uff0c\u641c\u7d22\u6ca1\u5fc5\u8981\u4e86\u5427\uff1f\n\u89c6\u9891\u9002\u7528\u4e8e\u9b54\u6539\u7248\uff0c\u539f\u7248\u9605\u8bfb\u6211\u7528java.startBrowser\u6765\u8c03\u7528\u5185\u7f6e\u6d4f\u89c8\u5668\u64ad\u653e\uff0c\u4f46\u662f\u64ad\u653e\u5931\u8d25\u4e86\uff0c\u6709\u5927\u4f6c\u770b\u5230\u7684\u8bdd\u5e0c\u671b\u80fd\u5e2e\u5fd9\u6539\u4e00\u6539\u3002","bookSourceGroup":"\u5c0f\u8bf4,\u56fe\u7247,\u89c6\u9891","bookSourceName":"\u5c0f%\u9ec4#\u4e66 (\u5c0f\u8bf4 | \u5957\u56fe | \u89c6\u9891)","bookSourceType":2,"bookSourceUrl":"https:\/\/xchina001.site","customButton":false,"customOrder":1,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"eventListener":false,"exploreUrl":"@js:\nconst fx = JSON.parse(java.base64Decode(String(source.variableComment)));\nconst list = []\nconst push = (title, url, size) => list.push({\n    \"title\": title,\n    \"url\": url,\n    \"style\": {\n        \"layout_flexGrow\": 0,\n        \"layout_flexBasisPercent\": size || 0.29\n    }\n});\n\nconst urls = JSON.parse(java.base64Decode(getBaseUrls()));\n\nObject.values(fx).forEach(({ title: n, fx: items }) => {\n  push(n, \"\", 1, 1);\n  items.forEach(({ title, id }) => {\n    if (!id) {\n      push(title, \"\", 1, 1);\n    } else {\n      push(title, urls[n].replace(\"$id\", id));\n    }\n  });\n});\n\nJSON.stringify(list)","header":"{\n  \"User-Agent\": \"Mozilla\/5.0 (iPhone; CPU iPhone OS 16_4_1 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/16.4 Mobile\/15E148 Safari\/604.1\"\n}","jsLib":"const getHeaders = (referer) => JSON.stringify({headers: {\n  \"User-Agent\": \"Mozilla\/5.0 (iPhone; CPU iPhone OS 16_4_1 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/16.4 Mobile\/15E148 Safari\/604.1\",\n  Referer: referer\n}});\n\nconst getBaseUrls = () =>  \"ewoJICLmiJDkurrlvbHniYciOiAiL3ZpZGVvcy9zZXJpZXMtJGlkL3t7cGFnZX19Lmh0bWwiLAoJICLmg4XoibLlpZflm74iOiAiL3Bob3Rvcy9zZXJpZXMtJGlkL3t7cGFnZX19Lmh0bWwiLAoJICLmiJDkurrlsI\/or7QiOiAiL2ZpY3Rpb25zL3RhZy0kaWQve3twYWdlfX0uaHRtbCIKfQ==\";\n","lastUpdateTime":"1764745030108","loginUrl":"\/categories.html","respondTime":180000,"ruleBookInfo":{"author":".author a@text||.sub-title a@text","intro":"@js:\nlet info;\nif (\/fiction\/.test(baseUrl)) {\n  info = java.getString(\"@css:.content-box .right-5 > div@text\")\n  let desc = java.getString(\"@css:[property=\\\"og:description\\\"]@content\")\n  info += \"\\n\" + desc\n} else if (\/photo\/.test(baseUrl)) {\n  info = java.getString(\"@css:.photo-detail .item:not(.floating)@text\")\n} else if (\/video\/.test(baseUrl)) {\n  info = java.getString(\"@css:.video-detail .item:not(.floating)@text\")\n}\n\nString(info)\n.replace(book.name, \"\")\n.replace(\/\u5f00\u59cb\u9605\u8bfb|\u63a8\u5e7f\uff1a.*\/g, \"\")\n.trim()","kind":".tags a@text"},"ruleContent":{"content":"@js:\nlet body;\nlet headers = getHeaders(baseUrl);\n\nif (\/fiction\/.test(baseUrl)) {\n\t body = java.getString(\"@@.fiction-body p@html\")\n\t body = String(body).replace(\/(webp|jpg)\/g, \"$1,\"+headers);\n} else if (\/photo\/.test(baseUrl)) {\n  let imgs = java.getElements(\".photo-image .img\");\n  let html = \"\";\n\t imgs.forEach(p => {\n\t \t  let style = String(p.attr(\"style\"));\n\t   let pic = style?.match(\/http.*?(?:webp|jpg)\/)?.[0] || \"\";\n\t   html += pic ? `<img src=\"${pic}\"><br>` : \"\";\n\t })\n\t let doc = org.jsoup.Jsoup.parse(html);\n\t body = doc.select(\"img\");\n\t body.forEach(p => {\n\t \t  let pic = String(p.attr(\"src\"));\n\t \t  pic += \",\" + headers;\n\t \t  p.attr(\"src\", pic)\n\t })\n} else if (\/video\/.test(baseUrl)) {\n\t body = result?.match(\/http.*?\\.m3u8[^']*\/)?.[0] || \"\";\n\t if(body){\n\t \t  body += \",\" + headers;\n     if (!java.openVideoPlayer) {\n     \t  \/\/ \u539f\u7248\u65e0\u6b64\u65b9\u6cd5\n       \/\/ \u539f\u7248\uff1a\u6253\u5f00\u6d4f\u89c8\u5668\u5e76\u8fd4\u56de\u5c01\u9762\u56fe\n       java.startBrowser(body, book.name);\n      body = `<img src=\"${book.coverUrl}\">`;\n    };\n\t \t}else{\n\t \t\t java.toast(\"Sorry\uff0c\u6ca1\u6709\u5339\u914d\u5230\u64ad\u653e\u94fe\u63a5\uff01\uff01\uff01\")\n\t }\n}\n\nbody;","imageStyle":"FULL","replaceRegex":"##\uff08\u770b\u7cbe\u5f69\u6210\u4eba\u5c0f\u8bf4\u4e0a\u300a\u5c0f\u9ec4\u4e66\u300b\uff1ahttps:\/\/xchina.*?\uff09"},"ruleExplore":{"author":"##\u4f5c\u8005\uff1a([^<\"]*)<##$1###","bookList":".item","bookUrl":".item > a@href||.title a@href","coverUrl":"##url\\('([^'\"]+)##$1###@js:\n `${result},${getHeaders(baseUrl)}`","intro":".brief@text","kind":".subs div@text&&.tags div:first-child@text&&.fa-clock@text","lastChapter":"@js:\njava.put(\"xchinaID\", baseUrl.includes(\"-998\") ? \"998\": \"\");\n\"\"","name":".title a@text##\u300a|\u300b"},"ruleSearch":[],"ruleToc":{"chapterList":"@js:\nfunction getMaxPage(arr){\n  return Array.from(arr).reduce((max, cur) => {\n    const n = +String(cur) || 0;\n    return Math.max(max, n)\n  }, 1)\n};\n\nlet chapters = [];\nlet url = baseUrl;\nif(\/fiction\/.test(baseUrl)){\n\t let id = java.get(\"xchinaID\");\n\t if(id == \"998\"){ \/\/\u6f2b\u753b\u5c0f\u8bf4\u662f\u56fe\u7247\u7c7b\u578b\n\t \t  book.type = 64;\n\t \t}else{\n\t   book.type = 8;\n\t }\n  let list = java.getElements(\"@@.chapter-container a\");\n  let size = list.size();\n  if(size == 0){\n    chapters.push({\n\t \t  \t title: java.getString(\"@@.title@text\"),\n\t \t  \t url\n\t \t  })\n  }else{\n    for (let i = 0; i < size; i++) {\n      let a = list.get(i);\n      chapters.push({\n        title: a.text(),\n        url:   a.attr('href')\n      });\n    }\n  }\n}else if(\/photo\/.test(baseUrl)){\n\t book.type = 64;\n\t let pages = java.getStringList(\"@css:.pager a@text\");\n\t let max = getMaxPage(pages);\n\t if(max == 1) {\n\t \t  chapters.push({\n\t \t  \t title: book.name,\n\t \t  \t url\n\t \t  })\n\t \t}else{\n\t \t\tchapters.push({\n\t \t\t  title: \"\u7b2c1\u9875\",\n\t \t\t  url\n\t \t\t})\n\t \t\tfor(let i = 2; i <= max; i++){\n      chapters.push({\n        title: `\u7b2c${i}\u9875`,\n        url: url.replace(\".html\", `\/${i}.html`)\n      })\n    }\n\t }\n\t \t\n}else if(\/video\/.test(baseUrl)){\n\t book.type = 4;\n\t chapters.push({\n\t \t  title: book.name,\n\t \t  url\n\t })\n}\n\nchapters;","chapterName":"title","chapterUrl":"url"},"variableComment":"eyJub3ZlbEZ4Ijp7InRpdGxlIjoi5oiQ5Lq65bCP6K+0IiwiZngiOlt7InRpdGxlIjoi5YWo6YOoIiwiaWQiOiIifSx7InRpdGxlIjoi5Lq65aa75aWz5Y+LIiwiaWQiOiIxIn0seyJ0aXRsZSI6Iue8lui+keaOqOiNkCIsImlkIjoiMTAxIn0seyJ0aXRsZSI6IumVv+evh+i\/nui9vSIsImlkIjoiMTAyIn0seyJ0aXRsZSI6IumDveW4gueUn+a0uyIsImlkIjoiNCJ9LHsidGl0bGUiOiLlrrbluq3kubHkvKYiLCJpZCI6IjkifSx7InRpdGxlIjoi5aSa5Lq6576k5LqkIiwiaWQiOiIxMCJ9LHsidGl0bGUiOiLlvLrmmrTmgKfomZAiLCJpZCI6IjEzIn0seyJ0aXRsZSI6IuWPpOWFuOeOhOW5uyIsImlkIjoiOCJ9LHsidGl0bGUiOiLnu7\/luL3kuLvpopgiLCJpZCI6IjE2In0seyJ0aXRsZSI6IuWtpueUn+agoeWbrSIsImlkIjoiMiJ9LHsidGl0bGUiOiLlhazlj7jogYzlnLoiLCJpZCI6IjExIn0seyJ0aXRsZSI6Iue7j+mqjOaVheS6iyIsImlkIjoiNyJ9LHsidGl0bGUiOiLpnLLlh7rmmrTpnLIiLCJpZCI6IjEyIn0seyJ0aXRsZSI6IuacieWjsOWwj+ivtCIsImlkIjoiOTk5In0seyJ0aXRsZSI6Iuilv+aWueS4u+mimCIsImlkIjoiMTQifSx7InRpdGxlIjoi5Yqo5ryr5ri45oiPIiwiaWQiOiI1In0seyJ0aXRsZSI6IuWQjOaAp+S4u+mimCIsImlkIjoiMTUifSx7InRpdGxlIjoi5Ly05L6j5Lqk5o2iIiwiaWQiOiIzIn0seyJ0aXRsZSI6IuWQjeS6uuaYjuaYnyIsImlkIjoiNiJ9LHsidGl0bGUiOiLnu4\/lhbjlm57lv4YiLCJpZCI6IjEwMyJ9LHsidGl0bGUiOiLogL3nvo7lsI\/or7QiLCJpZCI6Ijk5In0seyJ0aXRsZSI6Iua8q+eUu+Wwj+ivtCIsImlkIjoiOTk4In0seyJ0aXRsZSI6IuiJsuWPi+WPkeihqCIsImlkIjoiMTAwMCJ9XX0sInBob3RvRngiOnsidGl0bGUiOiLmg4XoibLlpZflm74iLCJmeCI6W3sidGl0bGUiOiLnp4DkurrnvZHml5fkuIsiLCJpZCI6IiJ9LHsidGl0bGUiOiLnp4DkurrnvZEiLCJpZCI6IjVmMTQ3Njc4MWVhYjQifSx7InRpdGxlIjoi6K+t55S755WMIiwiaWQiOiI2MDFlZjgwOTk3ODQ1In0seyJ0aXRsZSI6IueIseicnOekviIsImlkIjoiNWY3MWFmYzkyZDhhYiJ9LHsidGl0bGUiOiLnp4HotK3mtYHlh7oiLCJpZCI6IjY2NjAwYTNhMjI3ZWUifSx7InRpdGxlIjoi6Iqx5ry+IiwiaWQiOiI1ZmM0Y2U0MDM4NmFmIn0seyJ0aXRsZSI6IuWwpOicnOiNnyIsImlkIjoiNWYxODRmZjU1MTg4OCJ9LHsidGl0bGUiOiLmqKHojIPlrabpmaIiLCJpZCI6IjVmMTgxNjI1OTY2YTYifSx7InRpdGxlIjoi576O5aqb6aaGIiwiaWQiOiI1ZjE0OTVkYmRhNGRlIn0seyJ0aXRsZSI6IuaYn+minOekviIsImlkIjoiNjE0MWM4ODg4MmEzNiJ9LHsidGl0bGUiOiLlsKTnianppoYiLCJpZCI6IjYwNjczYmVjOWRkMTEifSx7InRpdGxlIjoi6Jyc5qGD56S+IiwiaWQiOiI1ZjFkZDVhN2ViZTlhIn0seyJ0aXRsZSI6IkZFSUxJTuWXsuWboeWboSIsImlkIjoiNWYxNGEzMTA1ZDNlOCJ9LHsidGl0bGUiOiLnkZ7kuJ3ppoYiLCJpZCI6IjYxMjYzZGUyODdlMmYifSx7InRpdGxlIjoi5b2x56eB6I2fIiwiaWQiOiI2M2Q0MzUzNTI4MDhjIn0seyJ0aXRsZSI6IuWQhOWbveWFtuS7luWll+WbviIsImlkIjoiIn0seyJ0aXRsZSI6IuWbveaooeWll+WbviIsImlkIjoiNjRiZTIxYzk3MmNhNCJ9LHsidGl0bGUiOiLml6XmqKHlpZflm74iLCJpZCI6IjY0YmUyMjgzYmYzYWYifSx7InRpdGxlIjoi6Z+p5qih5aWX5Zu+IiwiaWQiOiI2NGJlMjJiNGEwZmEwIn0seyJ0aXRsZSI6IuWPsOaooeWll+WbviIsImlkIjoiNjRiZTIxZWY0Y2M1MSJ9LHsidGl0bGUiOiLmuK\/mqKHlpZflm74iLCJpZCI6IjY0YmUyMjRiNjYyYzAifSx7InRpdGxlIjoi5YW25LuW5Zyw5Yy65aWX5Zu+IiwiaWQiOiI2NGJlMjM5Y2U3M2Q0In0seyJ0aXRsZSI6IuS4reWbveW3peS9nOWupCIsImlkIjoiIn0seyJ0aXRsZSI6IlBBTlMiLCJpZCI6IjYzMTBjZTliOTAwNTYifSx7InRpdGxlIjoi5Li95Zu+MTAwIiwiaWQiOiI1ZjFkNzg0OTk1ODY1In0seyJ0aXRsZSI6IuebuOe6puS4reWbvSIsImlkIjoiNWYxZGNkZWFlZTU4MiJ9LHsidGl0bGUiOiLovbDotrTnjKsiLCJpZCI6IjVmMWFlNmNhYWU5MjIifSx7InRpdGxlIjoi5r2Y5aSa5ouJIiwiaWQiOiI1ZjIzYzQ0Y2Q2NmJkIn0seyJ0aXRsZSI6IuihjOiJsiIsImlkIjoiNjRmNDRkOTljZTY3MyJ9LHsidGl0bGUiOiLlhbbku5bkuK3lm73lt6XkvZzlrqQiLCJpZCI6IjY2NWY3ZDc4N2Q2ODEifSx7InRpdGxlIjoi54ix5bCk54mpIiwiaWQiOiI1ZjE0ODA0NmNiMmM3In0seyJ0aXRsZSI6IueIseS4nSIsImlkIjoiNWYxNWYzODllOTkzZSJ9LHsidGl0bGUiOiLmnpzlm6LnvZEiLCJpZCI6IjVmMTgxN2I0Mjc3MmIifSx7InRpdGxlIjoi6buE55SrIiwiaWQiOiI2NjVmOGJhZmFiNGJjIn0seyJ0aXRsZSI6IuWmlueyvuekviIsImlkIjoiNWY0YjVmNGViOGI3MSJ9LHsidGl0bGUiOiLml6Dlv4zlvbHnpL4iLCJpZCI6IjYxOWE5MmFhMWZhN2EifSx7InRpdGxlIjoi5o6o5aWz6YOOIiwiaWQiOiI1ZjE0YTVlYjViMGQ3In0seyJ0aXRsZSI6IumjjuWQn+m4n+WUsSIsImlkIjoiNjY2NmE3YWMzYmE5YyJ9LHsidGl0bGUiOiLonJzkuJ0iLCJpZCI6IjVmMjA4OTU2NGM2YzIifSx7InRpdGxlIjoi5aS05p2h5aWz56WeIiwiaWQiOiI1ZjE0ODA2NTg1YmVmIn0seyJ0aXRsZSI6Iua3seWknOS8geWIkiIsImlkIjoiNjM4ZTVhNjBiMTc3MCJ9LHsidGl0bGUiOiLluIzlqIHnpL4iLCJpZCI6IjY2NWY4NTk1NDA4ZmEifSx7InRpdGxlIjoi5YyX5Lqs5aSp5L2\/IiwiaWQiOiI2MjJjN2Y5NTIyMGE0In0seyJ0aXRsZSI6IklTU+ezu+WIlyIsImlkIjoiNjQ2YzY5YjY3NWYzZCJ9LHsidGl0bGUiOiLlsKTnvo4iLCJpZCI6IjYxYjk5NzcyODA0M2IifSx7InRpdGxlIjoiQTRVIiwiaWQiOiI1ZjYwYjk4MjQ4YTgxIn0seyJ0aXRsZSI6IkREWSIsImlkIjoiNWYxNWY3MjdkZjM5MyJ9LHsidGl0bGUiOiLonJzmn5rmkYTlvbEiLCJpZCI6IjY3NmMzZTliOTA3NDkifSx7InRpdGxlIjoi5Lic6I6eVuWls+mDjiIsImlkIjoiNWYyMmVhNDIyMjIxYyJ9LHsidGl0bGUiOiJTS+S4neW6kyIsImlkIjoiNWYzODJiYTg5NGFmNCJ9LHsidGl0bGUiOiJVMjM4IiwiaWQiOiI2NzAyOGEyN2QwMmE2In0seyJ0aXRsZSI6IuaXpeacrOW3peS9nOWupCIsImlkIjoiIn0seyJ0aXRsZSI6IkdyYXBoaXMiLCJpZCI6IjY0NTBiNDdjOWRiMGIifSx7InRpdGxlIjoiRlJJREFZIiwiaWQiOiI2NjY1OWUyZDk0NDg5In0seyJ0aXRsZSI6IlByZXN0aWdlIiwiaWQiOiI2NzA3OTFmNWYyZjBmIn0seyJ0aXRsZSI6IkVzY2FwZSIsImlkIjoiNjY2MDNhZjkzM2VjOSJ9LHsidGl0bGUiOiLlkajliIrjg53jgrnjg4jjg4fjgrjjgr\/jg6vlhpnnnJ\/pm4YiLCJpZCI6IjY2ZTY4YjljOTZhYjAifSx7InRpdGxlIjoiU3VwZXIgUG9zZSBCb29rIiwiaWQiOiI2MmEwYTE1OTExZjE2In0seyJ0aXRsZSI6IuOCouOCteiKuFNFWFkiLCJpZCI6IjY3MGQ3MTQyYjNkODgifSx7InRpdGxlIjoiVXJhYm9uIiwiaWQiOiI2NjkyZWEwMDRjYzc1In0seyJ0aXRsZSI6IlgtQ2l0eSIsImlkIjoiNjZmYjhjY2E3MDZhZSJ9LHsidGl0bGUiOiJGTEFTSOODh+OCuOOCv+ODq+WGmeecn+mbhiIsImlkIjoiNjcyYTIwMjlkNmEzMiJ9LHsidGl0bGUiOiLpn6nlm73lt6XkvZzlrqQiLCJpZCI6IiJ9LHsidGl0bGUiOiJBcnRHcmF2aWEiLCJpZCI6IjYwYTRhOTUzY2E1NjMifSx7InRpdGxlIjoiUHVyZSBNZWRpYSIsImlkIjoiNjIyNGU3NTVlMjFmNCJ9LHsidGl0bGUiOiJNYWtlbW9kZWwiLCJpZCI6IjY2NWY4MTg4NWYxMDMifSx7InRpdGxlIjoiRXNwYWNpYSBLb3JlYSIsImlkIjoiNjY1YTIzODVhMjM2NyJ9LHsidGl0bGUiOiJMb296eSIsImlkIjoiNjI4ODhhZmFkNDE2YiJ9LHsidGl0bGUiOiLlhbbku5blpZflm74iLCJpZCI6IiJ9LHsidGl0bGUiOiLkuabnsY3miavmj48iLCJpZCI6IjY4NjBlM2Q3MThjNzgifSx7InRpdGxlIjoi6KGX5ouNIiwiaWQiOiI2ODM2Y2QxYTJkNTFkIn0seyJ0aXRsZSI6IkFJ5Zu+5Yy6IiwiaWQiOiI2NDQzZDQ4MGViNzU3In0seyJ0aXRsZSI6IuWPsOa5vuW3peS9nOWupCIsImlkIjoiIn0seyJ0aXRsZSI6IkpWSUQiLCJpZCI6IjYzN2IyMDI5ZDIzNDcifSx7InRpdGxlIjoiRmFudGFzeSBGYWN0b3J5IiwiaWQiOiI1Zjg4OWFmYjM3NjE5In0seyJ0aXRsZSI6IlBpbWFnZSIsImlkIjoiNWY3YTBhODBkM2Q2NiJ9LHsidGl0bGUiOiJFRCBNb3NhaWMiLCJpZCI6IjY4NjEwMDQxZDBhYTgifV19LCJmaWxtRngiOnsidGl0bGUiOiLmiJDkurrlvbHniYciLCJmeCI6W3sidGl0bGUiOiLkuK3mlodBViIsImlkIjoiIn0seyJ0aXRsZSI6Ium6u+ixhuS8oOWqkiIsImlkIjoiNWY5MDQ1NTBiOGZjYyJ9LHsidGl0bGUiOiLni6znq4vliJvkvZzogIUiLCJpZCI6IjYxYmY2ZTQzOWZlZDYifSx7InRpdGxlIjoi57OW5b+DVmxvZyIsImlkIjoiNjEwMTQwODBkYmZkZSJ9LHsidGl0bGUiOiLonJzmoYPkvKDlqpIiLCJpZCI6IjVmZTg0MDM5MTkxNjUifSx7InRpdGxlIjoi5pif56m65Lyg5aqSIiwiaWQiOiI2MDU0ZTkzMzU2ZGVkIn0seyJ0aXRsZSI6IuWkqee+juS8oOWqkiIsImlkIjoiNjAxNTNjNDkwNThjZSJ9LHsidGl0bGUiOiLmnpzlhrvkvKDlqpIiLCJpZCI6IjVmZTg0MDcxOGQ2NjUifSx7InRpdGxlIjoi6aaZ6JWJ6KeG6aKRIiwiaWQiOiI2NWU1Zjc0ZTQ2MDVjIn0seyJ0aXRsZSI6IueyvuS4nOW9seS4miIsImlkIjoiNjAxMjZiY2ZiOTdmYSJ9LHsidGl0bGUiOiLniLHosYbkvKDlqpIiLCJpZCI6IjYzZDEzNGM3YTBhMTUifSx7InRpdGxlIjoi5p2P5ZCn5Y6f54mIIiwiaWQiOiI2MDcyOTk3NTU5YjQ2In0seyJ0aXRsZSI6IklCaVphIE1lZGlhIiwiaWQiOiI2NGU5Y2NlODlkYTIxIn0seyJ0aXRsZSI6IuaAp+inhueVjCIsImlkIjoiNjM0OTAzNjJkYWM0NSJ9LHsidGl0bGUiOiJFRCBNb3NhaWMiLCJpZCI6IjYzNzMyZjVjM2QzNmIifSx7InRpdGxlIjoi5aSn6LGh5Lyg5aqSIiwiaWQiOiI2NWJjYWE5Njg4NTE0In0seyJ0aXRsZSI6IuaJo+aJo+S8oOWqkiIsImlkIjoiNjIzMDk3NGFkYTk4OSJ9LHsidGl0bGUiOiLokJ3ojonnpL4iLCJpZCI6IjYzNjBjYTk3MDZlY2IifSx7InRpdGxlIjoiU0Hlm73pmYXkvKDlqpIiLCJpZCI6IjYzM2VmM2VmMDdkMzMifSx7InRpdGxlIjoi5YW25LuW5Lit5paHQVYiLCJpZCI6IjYzOTg2YWVjMjA1ZDgifSx7InRpdGxlIjoi5oqW6Zi0IiwiaWQiOiI2MjQ4NzA1ZGFiNjA0In0seyJ0aXRsZSI6IuiRq+iKpuW9seS4miIsImlkIjoiNjE5M2QyNzk3NTU3OSJ9LHsidGl0bGUiOiLkuYzmiZjpgqYiLCJpZCI6IjYzNzc1MGFlMGVlNzEifSx7InRpdGxlIjoi54ix56We5Lyg5aqSIiwiaWQiOiI2NDA1YjY4NDI3MDViIn0seyJ0aXRsZSI6IuS5kOaSreS8oOWqkiIsImlkIjoiNjA1ODlkYWE4ZmY5NyJ9LHsidGl0bGUiOiI5MeiMhOWtkCIsImlkIjoiNjM5YzhkOTgzYjdkNSJ9LHsidGl0bGUiOiLojYnojpPop4bpopEiLCJpZCI6IjY3MWRkYzBiMzU4Y2EifSx7InRpdGxlIjoiWU9ZTyIsImlkIjoiNjRlZGE1MmMxYzNmYiJ9LHsidGl0bGUiOiI1MeWQg+eTnCIsImlkIjoiNjcxZGQ4OGQwNmRkMyJ9LHsidGl0bGUiOiLlk5Tlk6nkvKDlqpIiLCJpZCI6IjY0NDU4ZTdkYTA1ZTYifSx7InRpdGxlIjoi5pig56eA5Lyg5aqSIiwiaWQiOiI2NTYwZGMwNTNjOTlmIn0seyJ0aXRsZSI6Iuilv+eTnOW9seinhiIsImlkIjoiNjQ4ZTEwNzEzODZlZiJ9LHsidGl0bGUiOiLmgJ3mmKXnpL4iLCJpZCI6IjY0YmU4NTUxYmQwZjEifSx7InRpdGxlIjoi5pel5pysQVYiLCJpZCI6IiJ9LHsidGl0bGUiOiLmnInnoIFBViIsImlkIjoiNjM5NWFiYTNkZWI3NCJ9LHsidGl0bGUiOiLml6DnoIFBViIsImlkIjoiNjM5NWFiN2ZlZTEwNCJ9LHsidGl0bGUiOiJBVuino+ivtCIsImlkIjoiNjYwODYzOGU1ZmNmNyJ9LHsidGl0bGUiOiLmqKHnibnnp4Hmi40iLCJpZCI6IiJ9LHsidGl0bGUiOiJQQU5T6KeG6aKRIiwiaWQiOiI2Mzk2MzE4NmFlMTQ1In0seyJ0aXRsZSI6IuWFtuS7luaooeeJueengeaLjSIsImlkIjoiNjM5NjM1MzRhOWU0OSJ9LHsidGl0bGUiOiLng63oiJ4iLCJpZCI6IjY0ZWRiZWNjZWRiMmUifSx7InRpdGxlIjoi55u457qm5Lit5Zu9IiwiaWQiOiI2M2VkMGYyMmU5MTc3In0seyJ0aXRsZSI6IuaenOWTpeS9nOWTgSIsImlkIjoiNjM5NjMxNWVkMmU0OSJ9LHsidGl0bGUiOiJTd2VhdEdpcmwiLCJpZCI6IjY4NDU2NTY0ZjI3MTAifSx7InRpdGxlIjoi6aOO5ZCf6bif5ZSx5L2c5ZOBIiwiaWQiOiI2Mzk2MzE5ZTZiODIzIn0seyJ0aXRsZSI6IuiJsuiJuuaXoOmXtCIsImlkIjoiNjc1NGE5N2QyYjM0MyJ9LHsidGl0bGUiOiLpu4TnlKsiLCJpZCI6IjY2OGMzYjJkZTdmMWMifSx7InRpdGxlIjoi5pel5pyI5L+x5LmQ6YOoIiwiaWQiOiI2M2FiMWRkODNhMWM2In0seyJ0aXRsZSI6IuS4muS9meaLjeaRhCIsImlkIjoiIn0seyJ0aXRsZSI6IuaOouiKseeOsOWcuiIsImlkIjoiNjM5NjViZjdiN2Y1MSJ9LHsidGl0bGUiOiLkuLvmkq3njrDlnLoiLCJpZCI6IjYzOTY1YmQ1MzM1ZmMifSx7InRpdGxlIjoi5oOF6Imy55S15b2xIiwiaWQiOiIifSx7InRpdGxlIjoi5Y2O6K+t55S15b2xIiwiaWQiOiI2Mzk2NDkyZmRiMWEwIn0seyJ0aXRsZSI6IuaXpemfqeeUteW9sSIsImlkIjoiNjM5NjQ5NDU4NGI1NyJ9LHsidGl0bGUiOiLmrKfnvo7nlLXlvbEiLCJpZCI6IjYzOTY0OTU5ZGRiMWIifSx7InRpdGxlIjoi5YW25a6D5b2x54mHIiwiaWQiOiIifSx7InRpdGxlIjoi5YW25LuW5Lqa5rSy5b2x54mHIiwiaWQiOiI2Mzk2M2VhOTQ5YTgyIn0seyJ0aXRsZSI6IumXqOS6i+S7tiIsImlkIjoiNjM5NjNkZTNmMmEwZiJ9LHsidGl0bGUiOiLlhbbku5bmrKfnvo7lvbHniYciLCJpZCI6IjYzOTY0MDRlNmJkYjUifSx7InRpdGxlIjoi5peg5YWz5oOF6ImyIiwiaWQiOiI2NjY0MzQ3OGNlZWRkIn1dfX0=","weight":0},{"bookSourceComment":"\u250d\u3000\u3000\u3000\u3000\u4e66\u6e90\u4f5c\u8005\uff1a\u840c  \u65b0\u3000\u3000\u3000\u3000\u2512\n\u251c\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502\uff01\u514d\u8d23\u2502\u672c\u4e66\u6e90\u53ea\u63d0\u4f9b\u4ee3\u7801\u8fdb\u884c\u6280\u672f\u2502\n\u2502\uff01\u58f0\u660e\u2502\u4ea4\u6d41\uff0c\u8bf7\u4e8e\uff12\uff14\u5c0f\u65f6\u540e\u5220\u9664\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518","bookSourceGroup":"\u81ea\u5199\u7684","bookSourceName":"\u65e7\u94a2\u7b14","bookSourceType":0,"bookSourceUrl":"https:\/\/p.jiugangbi.com","customOrder":0,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"\u9752\u6625\u6821\u56ed::\/sort\/1_{{page}}.html\n\u53e4\u4ee3\u8a00\u60c5::\/sort\/2_{{page}}.html\n\u7a7f\u8d8a\u5feb\u7a7f::\/sort\/3_{{page}}.html\n\u767e\u5408\u803d\u7f8e::\/sort\/4_{{page}}.html\n\u73b0\u4ee3\u8a00\u60c5::\/sort\/5_{{page}}.html\n\u8650\u5fc3\u751c\u5ba0::\/sort\/6_{{page}}.html\n\u4ed9\u4fa0\u6b66\u4fa0::\/sort\/7_{{page}}.html\n\u7f8e\u6587\u5c0f\u8bf4::\/sort\/8_{{page}}.html","lastUpdateTime":"1764752441483","respondTime":180000,"ruleBookInfo":{"author":".catalogyfw_author a@text","coverUrl":".catalogyfw_pic_left a img@src","intro":".catalogyfw_intor@text","kind":".s1@text","lastChapter":".catalogyfw_newest a@text","name":".catalogyfw_info_right h3@text","wordCount":".s2@text"},"ruleContent":{"content":".chapter_content@html","nextContentUrl":"text.\u4e0b\u4e00\u9875@href"},"ruleExplore":{"bookList":"","bookUrl":"","name":""},"ruleSearch":{"author":".newbook_title a@text","bookList":".newbook_novel","bookUrl":".newbook_title a@href","coverUrl":".newbook_pic a img@src","intro":".newbook_intor@text","lastChapter":".catalogyfw_newest a@text","name":".newbook_title a@text","wordCount":".s1@text"},"ruleToc":{"chapterList":".catalogyfw_list.1@ul li a","chapterName":"text","chapterUrl":"href","nextTocUrl":"option@value"},"searchUrl":"\/search.php,{\n  \"body\": \"searchkey={{key}}\",\n  \"charset\": \"GBK\",\n  \"method\": \"POST\"\n}","weight":0},{"bookSourceComment":"kuronavi\u6f2b\u753braw\u6e90\uff0c\u63d0\u4f9b\u65e5\u672c\u6f2b\u753braw\u8d44\u6e90","bookSourceGroup":"\u6f2b\u753b,\u65e5\u6f2b,Raw","bookSourceName":"kuronavi\u6f2b\u753braw","bookSourceType":0,"bookSourceUrl":"https:\/\/kuronavi.blog","customOrder":0,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"\u70ed\u95e8::https:\/\/kuronavi.blog\/hot\n\u6700\u65b0\u66f4\u65b0::https:\/\/kuronavi.blog\/search\/manga?status=-1&sort=15\n\u6392\u884c\u699c::https:\/\/kuronavi.blog\/search\/manga?status=-1&sort=10\n\u5b8c\u7d50\u6e08\u307f::https:\/\/kuronavi.blog\/search\/manga?status=2&sort=30","header":"{\n\"User-Agent\": \"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36\"\n}","lastUpdateTime":"1764767810570","respondTime":180000,"ruleBookInfo":{"author":".author .col-xs-8@text##\u66f4\u65b0\u4e2d","coverUrl":".col-image img@src","intro":".detail-content p@text","kind":".kind .col-xs-8@text","lastChapter":".list-chapter ul li:first-child .chapter a@text","name":".title-detail@text"},"ruleContent":{"content":".page-chapter img@html","nextContentUrl":""},"ruleExplore":{"author":"class.author@text||\u66f4\u65b0\u4e2d","bookList":".item","bookUrl":"figcaption h3 a@href","coverUrl":".image img@src","kind":".box_tootip p:contains(\u30b8\u30e3\u30f3\u30eb)@text##\u30b8\u30e3\u30f3\u30eb:","lastChapter":".chapter a:first@text","name":"figcaption h3 a@text"},"ruleSearch":{"author":"class.author@text||\u66f4\u65b0\u4e2d","bookList":".item","bookUrl":"figcaption h3 a@href","coverUrl":".image img@src","intro":".box_tootip .box_text p@text","kind":".box_tootip p:contains(\u30b8\u30e3\u30f3\u30eb)@text##\u30b8\u30e3\u30f3\u30eb:","lastChapter":".chapter a:first@text","name":"figcaption h3 a@text"},"ruleToc":{"chapterList":"-#nt_listchapter nav ul li","chapterName":".chapter a@text","chapterUrl":"a@href","formatJs":"","preUpdateJs":"","updateTime":".col-xs-4@text"},"searchUrl":"https:\/\/kuronavi.blog\/search\/manga?keyword={{key}}","weight":0},{"bookSourceName":"\u4e91\u8f69\u9601\u5c0f\u8bf4\u7f51","bookSourceType":0,"bookSourceUrl":"http:\/\/www.yunxuange.cc\/","customOrder":2,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"[\n{\"title\":\"\ud83d\udd16\u5206\u7c7b\ud83d\udd16\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"title\":\"\u7384\u5e7b\",\"url\":\"\/list1\/{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u6b66\u4fa0\",\"url\":\"\/list2\/{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u90fd\u5e02\",\"url\":\"\/list3\/{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u5386\u53f2\",\"url\":\"\/list4\/{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u7f51\u6e38\",\"url\":\"\/list5\/{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u79d1\u5e7b\",\"url\":\"\/list6\/{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u8a00\u60c5\",\"url\":\"\/list7\/{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u5176\u4ed6\",\"url\":\"\/list8\/{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\ud83d\udd16\u6392\u884c\ud83d\udd16\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"title\":\"\ud83d\udd16\u5468\u699c\ud83d\udd16\",\"url\":\"\/top\/week_0_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"title\":\"\u7384\u5e7b\",\"url\":\"\/top\/week_1_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u6b66\u4fa0\",\"url\":\"\/top\/week_2_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u90fd\u5e02\",\"url\":\"\/top\/week_3_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u5386\u53f2\",\"url\":\"\/top\/week_4_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u7f51\u6e38\",\"url\":\"\/top\/week_5_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u79d1\u5e7b\",\"url\":\"\/top\/week_6_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u8a00\u60c5\",\"url\":\"\/top\/week_7_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u5176\u4ed6\",\"url\":\"\/top\/week_8_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\ud83d\udd16\u6708\u699c\ud83d\udd16\",\"url\":\"\/top\/month_0_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"title\":\"\u7384\u5e7b\",\"url\":\"\/top\/month_1_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u6b66\u4fa0\",\"url\":\"\/top\/month_2_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u90fd\u5e02\",\"url\":\"\/top\/month_3_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u5386\u53f2\",\"url\":\"\/top\/month_4_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u7f51\u6e38\",\"url\":\"\/top\/month_5_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u79d1\u5e7b\",\"url\":\"\/top\/month_6_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u8a00\u60c5\",\"url\":\"\/top\/month_7_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u5176\u4ed6\",\"url\":\"\/top\/minth_8_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\ud83d\udd16\u603b\u699c\ud83d\udd16\",\"url\":\"\/top\/all_0_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"title\":\"\u7384\u5e7b\",\"url\":\"\/top\/all_1_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u6b66\u4fa0\",\"url\":\"\/top\/all_2_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u90fd\u5e02\",\"url\":\"\/top\/all_3_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u5386\u53f2\",\"url\":\"\/top\/all_4_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u7f51\u6e38\",\"url\":\"\/top\/all_5_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u79d1\u5e7b\",\"url\":\"\/top\/all_6_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u8a00\u60c5\",\"url\":\"\/top\/all_7_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u5176\u4ed6\",\"url\":\"\/top\/all_8_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\ud83d\udd16\u5b8c\u672c\ud83d\udd16\",\"url\":\"\/full\/0_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"title\":\"\u7384\u5e7b\",\"url\":\"\/full\/1_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u6b66\u4fa0\",\"url\":\"\/full\/2_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u90fd\u5e02\",\"url\":\"\/full\/3_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u5386\u53f2\",\"url\":\"\/full\/4_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u7f51\u6e38\",\"url\":\"\/full\/5_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u79d1\u5e7b\",\"url\":\"\/full\/6_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u8a00\u60c5\",\"url\":\"\/full\/7_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u5176\u4ed6\",\"url\":\"\/full\/8_{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}}\n]","lastUpdateTime":"1764781065340","respondTime":180000,"ruleBookInfo":{"author":".row@.options@li.0@text","coverUrl":".row@img@src","intro":".intro@text##\u7b80\u4ecb\uff1a","kind":".title@a.1@text","lastChapter":".book_info@.options@li.4@a@text","name":".row@h1@text"},"ruleContent":{"content":".font_max@text","nextContentUrl":".nav-bottom@.col-3.3@a@href","replaceRegex":"##\u7b2c\\([1-3]+\/3\\)\u9875","title":".single@h1@text"},"ruleExplore":{"author":".book_other.0@span@text","bookList":".box@.col-12","bookUrl":"dd@h3@a@href","coverUrl":"dt@a@img@src","lastChapter":".book_other.3@a@text","name":"dd@h3@text"},"ruleSearch":{"author":".book_other.0@span@text","bookList":"section@.container@.row@.col-12","bookUrl":"h3@a@href","coverUrl":"dt@img@src","lastChapter":".book_other.3@a@text","name":"h3@text"},"ruleToc":{"chapterList":".book_list2@li","chapterName":"li@text","chapterUrl":"li@a@href","nextTocUrl":".page-link.0@text##.*\\\/(\\d+)$##$1\n@js:\nres = JSON.parse(result)\nlist = [];\nfor (var i = 2; i <= res; i++) {\n\tlist.push(baseUrl.replace(\/$\/,\"index_\" + i + \".html\")); \n}\nlist;"},"searchUrl":"\/search.php?q={{key}}","weight":0},{"bookSourceComment":"\u8fd9\u662f\u5c0f\u8bf4\u4e0b\u8f7d\u6e90","bookSourceName":"\u5947\u4e66\u7f51","bookSourceType":3,"bookSourceUrl":"https:\/\/m.qishu99.cc\/","customOrder":2,"enabled":true,"enabledCookieJar":false,"enabledExplore":true,"exploreUrl":"[\n  {\n  \t  \"title\":\"\ud83d\udd16\u4e66\u5e93\ud83d\udd16\",\n    \"url\":\"\/all\/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":1\n    }\n  },\n  {\n  \t  \"title\":\"\u7537\u751f\u5c0f\u8bf4\",\n    \"url\":\"\/nansheng\/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":0.25\n    }\n  },\n  {\n  \t  \"title\":\"\u5973\u751f\u8a00\u60c5\",\n    \"url\":\"\/yanqing\/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":0.25\n    }\n  },\n  {\n  \t  \"title\":\"\u803d\u7f8e\u540c\u4eba\",\n    \"url\":\"\/tongren\/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":0.25\n    }\n  },\n  {\n  \t  \"title\":\"\u90fd\u5e02\u5c0f\u8bf4\",\n    \"url\":\"\/dushi\/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":0.25\n    }\n  },\n  {\n  \t  \"title\":\"\u7384\u5e7b\u5947\u5e7b\",\n    \"url\":\"\/xuanhuan\/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":0.25\n    }\n  },\n  {\n  \t  \"title\":\"\u6b66\u4fa0\u4fee\u771f\",\n    \"url\":\"\/xiuzhen\/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":0.25\n    }\n  },\n  {\n  \t  \"title\":\"\u7f51\u6e38\u7ade\u6280\",\n    \"url\":\"\/wangyou\/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":0.25\n    }\n  },\n  {\n  \t  \"title\":\"\u5386\u53f2\u519b\u4e8b\",\n    \"url\":\"\/lishi\/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":0.25\n    }\n  },\n  {\n  \t  \"title\":\"\u79d1\u5e7b\u7075\u5f02\",\n    \"url\":\"\/kehuan\/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":0.25\n    }\n  },\n  {\n  \t  \"title\":\"\u5176\u4ed6\u5c0f\u8bf4\",\n    \"url\":\"\/qita\/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":0.25\n    }\n  },\n  {\n  \t  \"title\":\"\ud83d\udd16\u6392\u884c\ud83d\udd16\",\n    \"url\":\"\/hot\/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":1\n    }\n  },\n  {\n  \t  \"title\":\"\ud83d\udd16\u63a8\u8350\ud83d\udd16\",\n    \"url\":\"\/recommendall\/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":1\n    }\n  },\n  {\n  \t  \"title\":\"\ud83d\udd16\u6700\u65b0\ud83d\udd16\",\n    \"url\":\"\/new\/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":1\n    }\n  }\n]","lastUpdateTime":"1764908000121","respondTime":180000,"ruleBookInfo":{"author":".bookcover@.mt10@text##\u4f5c\u8005\uff1a","coverUrl":".bookcover@img@src","downloadUrls":".bookbutton@a@href","intro":".bookintro@.con@text","kind":".bookcover@.gray.0@text##\u5206\u7c7b\uff1a","lastChapter":".bookcover@.gray.3@text##\u66f4\u65b0\uff1a","name":".bookcover@.title@text"},"ruleContent":[],"ruleExplore":{"author":".author@text","bookList":".imgtextlist@li","bookUrl":"a@href","coverUrl":"img@src","intro":".intro@text","name":".title@text"},"ruleSearch":{"author":".author.0@a@text","bookList":".imgtextlist@li","bookUrl":"a@href","coverUrl":"Img@src","intro":".intro@text","lastChapter":".author.1@text##\u66f4\u65b0\uff1a","name":".title@text"},"ruleToc":[],"searchUrl":"\/e\/search\/index.php,{\n\t\"method\":\"post\",\n\t\"body\":\"show=title,softsay,softwriter&keyboard={{key}}&tbname=download&tempid=1&Submit22=\u641c\u7d22\"\n\t}","weight":0},{"bookSourceComment":"by\u5929\u5929\u7684\u9e1f\u86cb\u86cb","bookSourceName":"\u4eb2\u4eb2\u5c0f\u8bf4qinqinxiaoshuo","bookSourceType":0,"bookSourceUrl":"https:\/\/www.qinqinxiaoshuo.cc","customButton":false,"customOrder":21,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"eventListener":false,"header":"{\"User-Agent\":\"Mozilla\/5.0 (Linux; Android 10; K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Mobile Safari\/537.36 EdgA\/130.0.0.0\"}","lastUpdateTime":"1765038307874","respondTime":180000,"ruleBookInfo":{"author":"[property$=author]@content","coverUrl":"[property$=image]@content","intro":"[property$=description]@content","kind":"[property~=category|status|update_time]@content","lastChapter":"[property$=latest_chapter_name]@content","name":"[property$=book_name]@content"},"ruleContent":{"content":"<js>\ntry{\nform=java.getElement(\"#content label\")\ntxt=java.getElement(\"#content [class=001] p\")\nwhile (form!=\"\"){\n\tcode=String(java.getString(\"strong@textNodes\",form)).trim()\n\tjava.log(code)\n\tresult=java.ajax(`${baseUrl},{\"body\":\"captcha=${code}\",\"method\":\"POST\"}`)\n\tjava.setContent(result)\n\tform=java.getElement(\"#article form\")\n\t}\nb64=result.match(\/atob\\('([^']+)'\\)\/)[1]\nif(result.match(\/'aes'\\s*===\\s*'aes'\/)){\n\tkey=result.match(\/CryptoJS\\.enc\\.Base64\\.parse\\('([^']+)'\\)\/)[1]\n\t\n\ttxt+=java.createSymmetricCrypto(\"AES\/ECB\/Pkcs7Padding\", java.base64DecodeToByteArray(key)).decryptStr(b64)\n\t}else{\n\t\ttxt+=java.base64Decode(b64)\n\t\t\n\t\t}\nresult=txt}catch{result=\"\\n\u8fd9\u7ae0\u6b63\u6587\u4e0d\u5b58\u5728\uff01\uff01\uff01\\n\u6362\u4e00\u7ae0\uff01\uff01\uff01\\n\u6216\u8005\\n\u6362\u672c\u4e66\uff01\uff01\uff01\\n\u6216\u8005\\n\u6362\u6e90\uff01\uff01\uff01\"}\n<\/js>\n","nextContentUrl":"text.\u4e0b\u4e00\u9875@href"},"ruleExplore":[],"ruleSearch":{"author":"a.2@text","bookList":"<js>\nvar cf=\/_cf_\/.test(src);\nif(cf){\n\tcookie.removeCookie(source.getKey());\n\tvar x=java.get(\"url\");\n\tb=java.startBrowserAwait(x,\n\t\t\"\u9a8c\u8bc1\");\n\t\/\/b=java.webView(null,x,null)\n\t\/\/b=java.ajax(x)\n\tresult=b;\n\t}\n\t\tresult;\n\n<\/js>\ntbody@tr","bookUrl":"a.0@href","kind":"td.-1@text","lastChapter":"a.1@text","name":"a.0@text"},"ruleToc":{"chapterList":"#play_0@ul@li@a","chapterName":"text","chapterUrl":"href"},"searchUrl":"@js:\n\nvar su=source.key,\nso=su+\"\/search\/,\";\nbody=\"searchkey=\"+key;\nvar option={\n  \"body\": String(body),\n  \"method\": \"POST\",\n  \"webView\": true\n};\nvar head=JSON.parse(source.header);\noption.headers=head;\nvar post=JSON.stringify(option);\njava.put(\"url\",String(so+post))","weight":0},{"bookSourceGroup":"\u2726\u4f18","bookSourceName":"\ud83c\udd3c \u516b\u4e00","bookSourceType":0,"bookSourceUrl":"https:\/\/www.blxs.info\/","customButton":false,"customOrder":5,"enabled":true,"enabledCookieJar":false,"enabledExplore":true,"eventListener":false,"exploreUrl":"@js:s=[];t=[-1,1,.476,.298,.215,.165,.131];push=(t,u,x,y)=>s.push({title:t,url:u,style:{layout_flexBasisPercent:x,layout_flexGrow:0}});[[\"\u7384\u5e7b\",\"xuanhuan\"],[\"\u4fee\u771f\",\"xiuzhen\"],[\"\u90fd\u5e02\",\"dushi\"],[\"\u7a7f\u8d8a\",\"chuanyue\"],[\"\u7f51\u6e38\",\"wangyou\"],[\"\u79d1\u5e7b\",\"kehuan\"],[\"\u5176\u4ed6\",\"qita\"]].map(([s,r],i)=>push(s,`\/${r}xiaoshuo\/${i+1}_{{page}}.html`,t[3]));JSON.stringify(s);","lastUpdateTime":"1765107724671","respondTime":2959,"ruleBookInfo":{"author":"#info p[0]@text","coverUrl":"img@src","init":".box_con,#list","intro":"#info p[2]@text&&#intro@text","lastChapter":"#list a[0]@text","name":"h1@text"},"ruleContent":{"content":"#content@html"},"ruleExplore":{"author":".s5@text","bookList":".l li","bookUrl":"a[0]@href","coverUrl":"a[0]@href##(\\d+(\/\\d+))##\/files\/article\/image\/$1$2s.jpg###","kind":".s3@textNodes##\\(|\\)","lastChapter":".s3 a@text","name":".s2 a@text"},"ruleSearch":{"author":"td[2]@text","bookList":"#nr","bookUrl":"a@href","checkKeyWord":"\u660e\u514b\u8857","coverUrl":"a@href##(\\d+(\/\\d+))##\/files\/article\/image\/$1$2s.jpg###","kind":"td[5,4,3]@text","lastChapter":"td[1]@text","name":"td[0]@text"},"ruleToc":{"chapterList":"#list a","chapterName":"text","chapterUrl":"href"},"searchUrl":"\/modules\/article\/search.php,{\"method\":\"post\",\"body\":\"searchkey={{key}}&searchtype=articlename\"}","weight":0},{"bookSourceGroup":"\u2726\u4f18","bookSourceName":"\ua0b5 30\u8bfb\u4e66","bookSourceType":0,"bookSourceUrl":"https:\/\/www.30dushu.com\/","customButton":false,"customOrder":19,"enabled":true,"enabledCookieJar":false,"enabledExplore":true,"eventListener":false,"exploreUrl":"@js:s=[];t=[-1,1,.476,.298,.215,.165,.131];push=(t,u,x,y)=>s.push({title:t,url:u,style:{layout_flexBasisPercent:x,layout_flexGrow:1}});push(\"\u5206\u7c7b\",null,t[1]);k=[\"\u5168\u90e8\u5206\u7c7b\",\"\u7384\u5e7b\u9b54\u6cd5\",\"\u6b66\u4fa0\u4fee\u771f\",\"\u90fd\u5e02\u8a00\u60c5\",\"\u5386\u53f2\u519b\u4e8b\",\"\u6e38\u620f\u7ade\u6280\",\"\u79d1\u5e7b\u7075\u5f02\",\"\u7eaf\u7231\u540c\u4eba\",\"\u5973\u751f\u8a00\u60c5\",\"\u4e8c\u6b21\u5143\",\"\u5176\u4ed6\",\"\"];k.map((s,i)=>push(s,`\/cate\/${i}-{{page}}.html`,t[4]));const a=[[\"\u603b\u699c\",\"allvisit\"],[\"\u6708\u699c\",\"monthvisit\"],[\"\u5468\u699c\",\"weekvisit\"],[\"\u65e5\u699c\",\"dayvisit\"],[\"\u6536\u85cf\",\"goodnum\"]],\nb={};a.forEach(([c,d])=>b[d]=c);push(`\u5f53\u524d\uff1a${b[source.getVariable().trim()]||\"\u672a\u9009\u62e9\"}`,null,1);a.forEach(([c,d])=>push(c,`<js>source.setVariable('${d}');java.longToast('\u5df2\u9009\u62e9 ${c}');<\/js>`,t[5]));push(\"\u5206\u7c7b-\u699c\u5355\",null,t[1]);k.map((s,i)=>push(s,`\/rank-{{source.getVariable()}}-${i}.html`,t[4]));JSON.stringify(s);","lastUpdateTime":"1765108002842","respondTime":31378,"ruleBookInfo":{"author":"a[href*=\"author\"]@text","coverUrl":"img@data-original","intro":".detail-book-tags@span.-1@text&&.detail-intro-content@text","kind":".detail-book-tags@span!0:-1@text","lastChapter":".detail-chapter-title.0@text","name":"h1@text","tocUrl":"a[href*=\"index\"]@href"},"ruleContent":{"content":"#chapterContent@p@text"},"ruleExplore":{"author":"p@text&&.book-meta@span.0@textNodes","bookList":".book-card&&.rank-item","bookUrl":"a.0@href","coverUrl":"img@src","kind":".status-badge@text&&span.3:5@text","name":"h3@text"},"ruleSearch":{"author":"a[href*=\"author\"]@text","bookList":".modern-search-item","bookUrl":"h3@a@href","coverUrl":"img@src","intro":".modern-book-stats@text&&.modern-book-desc@text","kind":".modern-book-meta@span!0@text","name":"h3@text"},"ruleToc":{"chapterList":".modern-chapter-item","chapterName":"data-name","chapterUrl":"a@href","nextTocUrl":"option@value"},"searchUrl":"\/search\/?searchkey={{key}}","weight":0},{"bookSourceComment":"\u9700\u8981\u767b\u5f55\u8d26\u53f7 \u5e76\u4e14\u6709SVIP\u4f1a\u5458\u8d26\u53f7\u624d\u53ef\u4ee5\u770b\u5168\u672c\uff0c\u5982\u679c\u663e\u793a\u4e0d\u6b63\u5e38\u65f6\uff0c \u5237\u65b0\u4e00\u4e0b\u7ae0\u8282\u5c31\u884c\uff0c\u53d1\u73b0\u662f\u6309\u7167\u5b57\u6570\u6392\u5e8f","bookSourceGroup":"\u4e0d\u9700\u8981\u542f\u7528\u7684\u4e66\u6e90","bookSourceName":"\u756a\u8304\uff08\u53d1\u73b0\uff09","bookSourceType":0,"bookSourceUrl":"https:\/\/fanqienovel.com####\u563f\u563f","customOrder":1,"enabled":false,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"<js>\nvar url = 'https:\/\/fanqienovel.com\/api\/author\/library\/book_list\/v\/?page_count=10&page_index={{(page-1)*10}}&gender=genderId&category_id=categoryId&creation_status=statusId&word_count=wordcountId&book_type=-1&sort=sortId';\n\n\/\/var gender ={\"\u5168\u90e8\":-1,\"\u5973\u751f\":0,\"\u7537\u751f\":1}\n\/\/var creation_status={\"\u5168\u90e8\":-1,\"\u5df2\u5b8c\u7ed3\":0,\"\u8fde\u8f7d\u4e2d\":1}\n\/\/var word_count={\"\u5168\u90e8\":-1,\"30\u4e07\u4ee5\u4e0b\":0,\"30-50\u4e07\":1,\"50-100\u4e07\":2,\"100-200\u4e07\":3,\"200\u4ee5\u4e0a\u4e07\":4}\n\/\/var sort={\"\u6700\u70ed\":0,\"\u6700\u65b0\":1,\"\u5b57\u6570\":2}\n\nvar typesList = [\n{\"title\": \"\u5168\u90e8-\u6700\u70ed\",\"categoryId\": 392,\"genderId\": \"-1\",\"statusId\": \"-1\",\"wordcountId\": \"-1\",\"sortId\": \"0\"},\n{\"title\": \"\u5973\u751f-\u6700\u70ed\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"-1\",\"wordcountId\": \"-1\",\"sortId\": \"0\"},\n{\"title\": \"\u5168\u90e8-\u6700\u65b0\",\"categoryId\": 392,\"genderId\": \"-1\",\"statusId\": \"-1\",\"wordcountId\": \"-1\",\"sortId\": \"1\"},\n{\"title\": \"\u5973\u751f-\u6700\u65b0\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"-1\",\"wordcountId\": \"-1\",\"sortId\": \"1\"},\n{\"title\": \"\u5168\u90e8-\u5b57\u6570\",\"categoryId\": 392,\"genderId\": \"-1\",\"statusId\": \"-1\",\"wordcountId\": \"-1\",\"sortId\": \"2\"},\n{\"title\": \"\u5973\u751f-\u5b57\u6570\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"-1\",\"wordcountId\": \"-1\",\"sortId\": \"2\"},\n{\"title\": \"\u6700\u70ed-\u5df2\u5b8c\u7ed3\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"0\",\"wordcountId\": \"-1\",\"sortId\": \"0\"},\n{\"title\": \"\u6700\u70ed-\u8fde\u8f7d\u4e2d\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"1\",\"wordcountId\": \"-1\",\"sortId\": \"0\"},\n{\"title\": \"\u6700\u65b0-\u5df2\u5b8c\u7ed3\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"0\",\"wordcountId\": \"-1\",\"sortId\": \"1\"},\n{\"title\": \"\u6700\u65b0-\u8fde\u8f7d\u4e2d\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"1\",\"wordcountId\": \"-1\",\"sortId\": \"1\"},\n{\"title\": \"\u5b57\u6570-\u5df2\u5b8c\u7ed3\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"0\",\"wordcountId\": \"-1\",\"sortId\": \"2\"},\n{\"title\": \"\u5b57\u6570-\u8fde\u8f7d\u4e2d\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"1\",\"wordcountId\": \"-1\",\"sortId\": \"2\"},\n{\"title\": \"\u6700\u70ed\u8fde\u8f7d30\u4e07\u4ee5\u4e0b\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"1\",\"wordcountId\": \"0\",\"sortId\": \"0\"},\n{\"title\": \"\u6700\u65b0\u8fde\u8f7d30\u4e07\u4ee5\u4e0b\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"1\",\"wordcountId\": \"0\",\"sortId\": \"1\"},\n{\"title\": \"\u6700\u70ed\u8fde\u8f7d30-50\u4e07\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"1\",\"wordcountId\": \"1\",\"sortId\": \"0\"},\n{\"title\": \"\u6700\u65b0\u8fde\u8f7d30-50\u4e07\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"1\",\"wordcountId\": \"1\",\"sortId\": \"1\"},\n{\"title\": \"\u6700\u70ed\u8fde\u8f7d50-100\u4e07\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"1\",\"wordcountId\": \"2\",\"sortId\": \"0\"},\n{\"title\": \"\u6700\u65b0\u8fde\u8f7d50-100\u4e07\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"1\",\"wordcountId\": \"2\",\"sortId\": \"1\"},\n{\"title\": \"\u6700\u70ed\u8fde\u8f7d100-200\u4e07\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"1\",\"wordcountId\": \"3\",\"sortId\": \"0\"},\n{\"title\": \"\u6700\u65b0\u8fde\u8f7d100-200\u4e07\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"1\",\"wordcountId\": \"3\",\"sortId\": \"1\"},\n{\"title\": \"\u6700\u70ed\u8fde\u8f7d200\u4e07\u4ee5\u4e0a\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"1\",\"wordcountId\": \"4\",\"sortId\": \"0\"},\n{\"title\": \"\u6700\u65b0\u8fde\u8f7d200\u4e07\u4ee5\u4e0a\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"1\",\"wordcountId\": \"4\",\"sortId\": \"1\"},\n{\"title\": \"\u6700\u70ed\u5b8c\u7ed330\u4e07\u4ee5\u4e0b\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"0\",\"wordcountId\": \"0\",\"sortId\": \"0\"},\n{\"title\": \"\u6700\u65b0\u5b8c\u7ed330\u4e07\u4ee5\u4e0b\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"0\",\"wordcountId\": \"0\",\"sortId\": \"1\"},\n{\"title\": \"\u6700\u70ed\u5b8c\u7ed330-50\u4e07\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"0\",\"wordcountId\": \"1\",\"sortId\": \"0\"},\n{\"title\": \"\u6700\u65b0\u5b8c\u7ed330-50\u4e07\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"0\",\"wordcountId\": \"1\",\"sortId\": \"1\"},\n{\"title\": \"\u6700\u70ed\u5b8c\u7ed350-100\u4e07\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"0\",\"wordcountId\": \"2\",\"sortId\": \"0\"},\n{\"title\": \"\u6700\u65b0\u5b8c\u7ed350-100\u4e07\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"0\",\"wordcountId\": \"2\",\"sortId\": \"1\"},\n{\"title\": \"\u6700\u70ed\u5b8c\u7ed3100-200\u4e07\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"0\",\"wordcountId\": \"3\",\"sortId\": \"0\"},\n{\"title\": \"\u6700\u65b0\u5b8c\u7ed3100-200\u4e07\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"0\",\"wordcountId\": \"3\",\"sortId\": \"1\"},\n{\"title\": \"\u6700\u70ed\u5b8c\u7ed3200\u4e07\u4ee5\u4e0a\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"0\",\"wordcountId\": \"4\",\"sortId\": \"0\"},\n{\"title\": \"\u6700\u65b0\u5b8c\u7ed3200\u4e07\u4ee5\u4e0a\",\"categoryId\": 392,\"genderId\": \"0\",\"statusId\": \"0\",\"wordcountId\": \"4\",\"sortId\": \"1\"}\u200b\n];\n\nvar typesList1 = [\n{\"title\": \"\u6700\u70ed\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"-1\",\"wordcountId\": \"-1\",\"sortId\": \"0\"},\n{\"title\": \"\u6700\u65b0\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"-1\",\"wordcountId\": \"-1\",\"sortId\": \"1\"},\n{\"title\": \"\u6700\u70ed-\u5df2\u5b8c\u7ed3\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"0\",\"wordcountId\": \"-1\",\"sortId\": \"0\"},\n{\"title\": \"\u6700\u70ed-\u8fde\u8f7d\u4e2d\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"1\",\"wordcountId\": \"-1\",\"sortId\": \"0\"},\n{\"title\": \"\u6700\u65b0-\u5df2\u5b8c\u7ed3\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"0\",\"wordcountId\": \"-1\",\"sortId\": \"1\"},\n{\"title\": \"\u6700\u65b0-\u8fde\u8f7d\u4e2d\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"1\",\"wordcountId\": \"-1\",\"sortId\": \"1\"},\n{\"title\": \"\u5b57\u6570-\u5df2\u5b8c\u7ed3\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"0\",\"wordcountId\": \"-1\",\"sortId\": \"2\"},\n{\"title\": \"\u5b57\u6570-\u8fde\u8f7d\u4e2d\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"1\",\"wordcountId\": \"-1\",\"sortId\": \"2\"},\n{\"title\": \"\u6700\u70ed\u8fde\u8f7d30\u4e07\u4ee5\u4e0b\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"1\",\"wordcountId\": \"0\",\"sortId\": \"0\"},\n{\"title\": \"\u6700\u65b0\u8fde\u8f7d30\u4e07\u4ee5\u4e0b\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"1\",\"wordcountId\": \"0\",\"sortId\": \"1\"},\n{\"title\": \"\u6700\u70ed\u8fde\u8f7d30-50\u4e07\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"1\",\"wordcountId\": \"1\",\"sortId\": \"0\"},\n{\"title\": \"\u6700\u65b0\u8fde\u8f7d30-50\u4e07\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"1\",\"wordcountId\": \"1\",\"sortId\": \"1\"},\n{\"title\": \"\u6700\u70ed\u8fde\u8f7d50-100\u4e07\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"1\",\"wordcountId\": \"2\",\"sortId\": \"0\"},\n{\"title\": \"\u6700\u65b0\u8fde\u8f7d50-100\u4e07\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"1\",\"wordcountId\": \"2\",\"sortId\": \"1\"},\n{\"title\": \"\u6700\u70ed\u8fde\u8f7d100-200\u4e07\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"1\",\"wordcountId\": \"3\",\"sortId\": \"0\"},\n{\"title\": \"\u6700\u65b0\u8fde\u8f7d100-200\u4e07\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"1\",\"wordcountId\": \"3\",\"sortId\": \"1\"},\n{\"title\": \"\u6700\u70ed\u8fde\u8f7d200\u4e07\u4ee5\u4e0a\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"1\",\"wordcountId\": \"4\",\"sortId\": \"0\"},\n{\"title\": \"\u6700\u65b0\u8fde\u8f7d200\u4e07\u4ee5\u4e0a\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"1\",\"wordcountId\": \"4\",\"sortId\": \"1\"},\n{\"title\": \"\u6700\u70ed\u5b8c\u7ed330\u4e07\u4ee5\u4e0b\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"0\",\"wordcountId\": \"0\",\"sortId\": \"0\"},\n{\"title\": \"\u6700\u65b0\u5b8c\u7ed330\u4e07\u4ee5\u4e0b\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"0\",\"wordcountId\": \"0\",\"sortId\": \"1\"},\n{\"title\": \"\u6700\u70ed\u5b8c\u7ed330-50\u4e07\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"0\",\"wordcountId\": \"1\",\"sortId\": \"0\"},\n{\"title\": \"\u6700\u65b0\u5b8c\u7ed330-50\u4e07\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"0\",\"wordcountId\": \"1\",\"sortId\": \"1\"},\n{\"title\": \"\u6700\u70ed\u5b8c\u7ed350-100\u4e07\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"0\",\"wordcountId\": \"2\",\"sortId\": \"0\"},\n{\"title\": \"\u6700\u65b0\u5b8c\u7ed350-100\u4e07\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"0\",\"wordcountId\": \"2\",\"sortId\": \"1\"},\n{\"title\": \"\u6700\u70ed\u5b8c\u7ed3100-200\u4e07\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"0\",\"wordcountId\": \"3\",\"sortId\": \"0\"},\n{\"title\": \"\u6700\u65b0\u5b8c\u7ed3100-200\u4e07\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"0\",\"wordcountId\": \"3\",\"sortId\": \"1\"},\n{\"title\": \"\u6700\u70ed\u5b8c\u7ed3200\u4e07\u4ee5\u4e0a\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"0\",\"wordcountId\": \"4\",\"sortId\": \"0\"},\n{\"title\": \"\u6700\u65b0\u5b8c\u7ed3200\u4e07\u4ee5\u4e0a\",\"categoryId\": 704,\"genderId\": \"0\",\"statusId\": \"0\",\"wordcountId\": \"4\",\"sortId\": \"1\"}];\n\nvar titleduf={\"title\": \"\",\"url\": \"\",\"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}};\n\nvar urlduf = {\"title\": \"\",\"url\": \"\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.3}};\n\n\n\/\/\u5b9a\u4e49\u4e00\u4e2a\u7a7a\u5217\u8868\uff0c\u5b58\u6700\u7ec8\u7ed3\u679c\nvar reultJson=[];\nvar AddJson =function(title,listMap){\nmanDuf=JSON.parse(JSON.stringify(titleduf));\nmanDuf.title=title;\nreultJson.push(manDuf);\n\nlistMap.forEach((obj)=>{\nj = JSON.parse(JSON.stringify(urlduf));\nj.title = obj.title;\nvar Obj = {\ncategoryId: obj.categoryId,\ngenderId: obj.genderId,\nstatusId:obj.statusId,\nwordcountId:obj.wordcountId,\nsortId:obj.sortId\n};\nfunction GFG_Fun() {\nreturn (url.replace(\/categoryId|genderId|statusId|wordcountId|sortId\/gi, function (matched) {\nreturn Obj[matched];\n}));\n}\nj.url = GFG_Fun()\nreultJson.push(j);\n})\n}\nAddJson(\"\u65e0CP\",typesList);\nAddJson(\"\u53cc\u5973\u4e3b\",typesList1);\nJSON.stringify(reultJson);\n<\/js>","header":"{\n    \"User-Agent\": \"Mozilla\/5.0 (Linux; Android 10; MI 8 Lite Build\/QKQ1.190910.002) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/113.0.5672.62 Mobile Safari\/537.36\",\n    \"ismobile\": 0\n  }","jsLib":"function GetTitleDecode(res) {\n   var data1 = [\"s\", \"?\", \"\u4f5c\", \"\u53e3\", \"\u5728\", \"\u4ed6\", \"\u80fd\", \"\u5e76\", \"B\", \"\u58eb\", \"4\", \"U\", \"\u514b\", \"\u624d\", \"\u6b63\", \"\u4eec\", \"\u5b57\", \"\u58f0\", \"\u9ad8\", \"\u5168\", \"\u5c14\", \"\u6d3b\", \"\u8005\", \"\u52a8\", \"\u5176\", \"\u4e3b\", \"\u62a5\", \"\u591a\", \"\u671b\", \"\u653e\", \"h\", \"w\", \"\u6b21\", \"\u5e74\", \"?\", \"\u4e2d\", \"3\", \"\u7279\", \"\u4e8e\", \"\u5341\", \"\u5165\", \"\u8981\", \"\u7537\", \"\u540c\", \"G\", \"\u9762\", \"\u5206\", \"\u65b9\", \"K\", \"\u4ec0\", \"\u518d\", \"\u6559\", \"\u672c\", \"\u5df1\", \"\u7ed3\", \"1\", \"\u7b49\", \"\u4e16\", \"N\", \"?\", \"\u8bf4\", \"g\", \"u\", \"\u671f\", \"Z\", \"\u5916\", \"\u7f8e\", \"M\", \"\u884c\", \"\u7ed9\", \"9\", \"\u6587\", \"\u5c06\", \"\u4e24\", \"\u8bb8\", \"\u5f20\", \"\u53cb\", \"0\", \"\u82f1\", \"\u5e94\", \"\u5411\", \"\u50cf\", \"\u6b64\", \"\u767d\", \"\u5b89\", \"\u5c11\", \"\u4f55\", \"\u6253\", \"\u6c14\", \"\u5e38\", \"\u5b9a\", \"\u95f4\", \"\u82b1\", \"\u89c1\", \"\u5b69\", \"\u5b83\", \"\u76f4\", \"\u98ce\", \"\u6570\", \"\u4f7f\", \"\u9053\", \"\u7b2c\", \"\u6c34\", \"\u5df2\", \"\u5973\", \"\u5c71\", \"\u89e3\", \"d\", \"P\", \"\u7684\", \"\u901a\", \"\u5173\", \"\u6027\", \"\u53eb\", \"\u513f\", \"L\", \"\u5988\", \"\u95ee\", \"\u56de\", \"\u795e\", \"\u6765\", \"S\", \"?\", \"\u56db\", \"\u91cc\", \"\u524d\", \"\u56fd\", \"\u4e9b\", \"O\", \"v\", \"l\", \"A\", \"\u5fc3\", \"\u5e73\", \"\u81ea\", \"\u65e0\", \"\u519b\", \"\u5149\", \"\u4ee3\", \"\u662f\", \"\u597d\", \"\u5374\", \"c\", \"\u5f97\", \"\u79cd\", \"\u5c31\", \"\u610f\", \"\u5148\", \"\u7acb\", \"z\", \"\u5b50\", \"\u8fc7\", \"Y\", \"j\", \"\u8868\", \"?\", \"\u4e48\", \"\u6240\", \"\u63a5\", \"\u4e86\", \"\u540d\", \"\u91d1\", \"\u53d7\", \"J\", \"\u6ee1\", \"\u773c\", \"\u6ca1\", \"\u90e8\", \"\u90a3\", \"m\", \"\u6bcf\", \"\u8f66\", \"\u5ea6\", \"\u53ef\", \"R\", \"\u65af\", \"\u7ecf\", \"\u73b0\", \"\u95e8\", \"\u660e\", \"V\", \"\u5982\", \"\u8d70\", \"\u547d\", \"y\", \"6\", \"E\", \"\u6218\", \"\u5f88\", \"\u4e0a\", \"f\", \"\u6708\", \"\u897f\", \"7\", \"\u957f\", \"\u592b\", \"\u60f3\", \"\u8bdd\", \"\u53d8\", \"\u6d77\", \"\u673a\", \"x\", \"\u5230\", \"W\", \"\u4e00\", \"\u6210\", \"\u751f\", \"\u4fe1\", \"\u7b11\", \"\u4f46\", \"\u7236\", \"\u5f00\", \"\u5185\", \"\u4e1c\", \"\u9a6c\", \"\u65e5\", \"\u5c0f\", \"\u800c\", \"\u540e\", \"\u5e26\", \"\u4ee5\", \"\u4e09\", \"\u51e0\", \"\u4e3a\", \"\u8ba4\", \"X\", \"\u6b7b\", \"\u5458\", \"\u76ee\", \"\u4f4d\", \"\u4e4b\", \"\u5b66\", \"\u8fdc\", \"\u4eba\", \"\u97f3\", \"\u5462\", \"\u6211\", \"q\", \"\u4e50\", \"\u8c61\", \"\u91cd\", \"\u5bf9\", \"\u4e2a\", \"\u88ab\", \"\u522b\", \"F\", \"\u4e5f\", \"\u4e66\", \"\u7a1c\", \"D\", \"\u5199\", \"\u8fd8\", \"\u56e0\", \"\u5bb6\", \"\u53d1\", \"\u65f6\", \"i\", \"\u6216\", \"\u4f4f\", \"\u5fb7\", \"\u5f53\", \"o\", \"I\", \"\u6bd4\", \"\u89c9\", \"\u7136\", \"\u5403\", \"\u53bb\", \"\u516c\", \"a\", \"\u8001\", \"\u4eb2\", \"\u60c5\", \"\u4f53\", \"\u592a\", \"b\", \"\u4e07\", \"C\", \"\u7535\", \"\u7406\", \"?\", \"\u5931\", \"\u529b\", \"\u66f4\", \"\u62c9\", \"\u7269\", \"\u7740\", \"\u539f\", \"\u5979\", \" \u5de5\", \"\u5b9e\", \"\u8272\", \"\u611f\", \"\u8bb0\", \"\u770b\", \"\u51fa\", \"\u76f8\", \"\u8def\", \"\u5927\", \"\u4f60\", \"\u4faf\", \"2\", \"\u548c\", \"?\", \"\u4e0e\", \"p\", \"\u6837\", \"\u65b0\", \"\u53ea\", \"\u4fbf\", \"\u6700\", \"\u4e0d\", \"\u8fdb\", \"T\", \"r\", \"\u505a\", \"\u683c\", \"\u6bcd\", \"\u603b\", \"\u7231\", \"\u8eab\", \"\u5e08\", \"\u8f7b\", \"\u77e5\", \"\u5f80\", \"\u52a0\", \"\u4ece\", \"?\", \"\u5929\", \"e\", \"H\", \"?\", \"\u542c\", \"\u573a\", \"\u7531\", \"\u5feb\", \"\u8fb9\", \" \u8ba9\", \"\u628a\", \"\u4efb\", \"8\", \"\u6761\", \"\u5934\", \"\u4e8b\", \"\u81f3\", \"\u8d77\", \"\u70b9\", \"\u771f\", \"\u624b\", \"\u8fd9\", \"\u96be\", \"\u90fd\", \"\u754c\", \"\u7528\", \"\u6cd5\", \"n\", \"\u5904\", \"\u4e0b\", \"\u53c8\", \"Q\", \"\u544a\", \"\u5730\", \"5\", \"k\", \"t\", \"\u5c81\", \"\u6709\", \"\u4f1a\", \"\u679c\", \"\u5229\", \"\u6c11\"]\n    var code = 58345;\n    var content = '';\n    var key='';\n    var index='';\n    var replacement='';\n    for (var i = 0; i < res.length; i++) {\n        key = res[i].charCodeAt(0);\n        index = key - code;\n        replacement =( data1[index] && data1[index] !== '?')? data1[index] : res[i];\n        content += replacement;\n    }\n    return content;\n}\n\n\nfunction GetContentDecode(res) {\n    var data2=[\"D\", \"\u5728\", \"\u4e3b\", \"\u7279\", \"\u5bb6\", \"\u519b\", \"\u7136\", \"\u8868\", \"\u573a\", \"4\", \"\u8981\", \"\u53ea\", \"v\", \"\u548c\", \"?\", \"6\", \"\u522b\", \"\u8fd8\", \"g\", \"\u73b0\", \"\u513f\", \"\u5c81\", \"?\", \"?\", \"\u6b64\", \"\u8c61\", \"\u6708\", \"3\", \"\u51fa\", \"\u6218\", \"\u5de5\", \"\u76f8\", \"o\", \"\u7537\", \"\u76f4\", \"\u5931\", \"\u4e16\", \"F\", \"\u90fd\", \"\u5e73\", \"\u6587\", \"\u4ec0\", \"V\", \"O\", \"\u5c06\", \"\u771f\", \"T\", \"\u90a3\", \"\u5f53\", \"?\", \"\u4f1a\", \"\u7acb\", \"\u4e9b\", \"u\", \"\u662f\", \"\u5341\", \"\u5f20\", \"\u5b66\", \"\u6c14\", \"\u5927\", \"\u7231\", \"\u4e24\", \"\u547d\", \"\u5168\", \"\u540e\", \"\u4e1c\", \"\u6027\", \"\u901a\", \"\u88ab\", \"1\", \"\u5b83\", \"\u4e50\", \"\u63a5\", \"\u800c\", \"\u611f\", \"\u8f66\", \"\u5c71\", \"\u516c\", \"\u4e86\", \"\u5e38\", \"\u4ee5\", \"\u4f55\", \"\u53ef\", \"\u8bdd\", \"\u5148\", \"p\", \"i\", \"\u53eb\", \"\u8f7b\", \"M\", \"\u58eb\", \"w\", \"\u7740\", \"\u53d8\", \"\u5c14\", \"\u5feb\", \"l\", \"\u4e2a\", \"\u8bf4\", \"\u5c11\", \"\u8272\", \"\u91cc\", \"\u5b89\", \"\u82b1\", \"\u8fdc\", \"7\", \"\u96be\", \"\u5e08\", \"\u653e\", \"t\", \"\u62a5\", \"\u8ba4\", \"\u9762\", \"\u9053\", \"S\", \"?\", \"\u514b\", \"\u5730\", \"\u5ea6\", \"I\", \"\u597d\", \"\u673a\", \"U\", \"\u6c11\", \"\u5199\", \"\u628a\", \"\u4e07\", \"\u540c\", \"\u6c34\", \"\u65b0\", \"\u6ca1\", \"\u4e66\", \"\u7535\", \"\u5403\", \"\u50cf\", \"\u65af\", \"5\", \"\u4e3a\", \"y\", \"\u767d\", \"\u51e0\", \"\u65e5\", \"\u6559\", \"\u770b\", \"\u4f46\", \"\u7b2c\", \"\u52a0\", \"\u4faf\", \"\u4f5c\", \"\u4e0a\", \"\u62c9\", \"\u4f4f\", \"\u6709\", \"\u6cd5\", \"r\", \"\u4e8b\", \"\u5e94\", \"\u4f4d\", \"\u5229\", \"\u4f60\", \"\u58f0\", \"\u8eab\", \"\u56fd\", \"\u95ee\", \"\u9a6c\", \"\u5973\", \"\u4ed6\", \"Y\", \"\u6bd4\", \"\u7236\", \"x\", \"A\", \"H\", \"N\", \"s\", \"X\", \"\u8fb9\", \"\u7f8e\", \"\u5bf9\", \"\u6240\", \"\u91d1\", \"\u6d3b\", \"\u56de\", \"\u610f\", \"\u5230\", \"z\", \"\u4ece\", \"j\", \"\u77e5\", \"\u53c8\", \"\u5185\", \"\u56e0\", \"\u70b9\", \"Q\", \"\u4e09\", \"\u5b9a\", \"8\", \"R\", \"b\", \"\u6b63\", \"\u6216\", \"\u592b\", \"\u5411\", \"\u5fb7\", \"\u542c\", \"\u66f4\", \"?\", \"\u5f97\", \"\u544a\", \"\u5e76\", \"\u672c\", \"q\", \"\u8fc7\", \"\u8bb0\", \"L\", \"\u8ba9\", \"\u6253\", \"f\", \"\u4eba\", \"\u5c31\", \"\u8005\", \"\u53bb\", \"\u539f\", \"\u6ee1\", \"\u4f53\", \"\u505a\", \"\u7ecf\", \"K\", \"\u8d70\", \"\u5982\", \"\u5b69\", \"c\", \"G\", \"\u7ed9\", \"\u4f7f\", \"\u7269\", \"?\", \"\u6700\", \"\u7b11\", \"\u90e8\", \"?\", \"\u5458\", \"\u7b49\", \"\u53d7\", \"k\", \"\u884c\", \"\u4e00\", \"\u6761\", \"\u679c\", \"\u52a8\", \"\u5149\", \"\u95e8\", \"\u5934\", \"\u89c1\", \"\u5f80\", \"\u81ea\", \"\u89e3\", \"\u6210\", \"\u5904\", \"\u5929\", \"\u80fd\", \"\u4e8e\", \"\u540d\", \"\u5176\", \"\u53d1\", \"\u603b\", \"\u6bcd\", \"\u7684\", \"\u6b7b\", \"\u624b\", \"\u5165\", \"\u8def\", \"\u8fdb\", \"\u5fc3\", \"\u6765\", \"h\", \"\u65f6\", \"\u529b\", \"\u591a\", \"\u5f00\", \"\u5df2\", \"\u8bb8\", \"d\", \"\u81f3\", \"\u7531\", \"\u5f88\", \"\u754c\", \"n\", \"\u5c0f\", \" \u4e0e\", \"Z\", \"\u60f3\", \"\u4ee3\", \"\u4e48\", \"\u5206\", \"\u751f\", \"\u53e3\", \"\u518d\", \"\u5988\", \"\u671b\", \"\u6b21\", \"\u897f\", \"\u98ce\", \"\u79cd\", \"\u5e26\", \"J\", \"?\", \"\u5b9e\", \"\u60c5\", \"\u624d\", \"\u8fd9\", \"?\", \"E\", \"\u6211\", \"\u795e\", \"\u683c\", \"\u957f\", \"\u89c9\", \"\u95f4\", \"\u5e74\", \"\u773c\", \"\u65e0\", \"\u4e0d\", \"\u4eb2\", \"\u5173\", \"\u7ed3\", \"0\", \"\u53cb\", \"\u4fe1\", \"\u4e0b\", \"\u5374\", \"\u91cd\", \"\u5df1\", \"\u8001\", \"2\", \"\u97f3\", \"\u5b57\", \"m\", \"\u5462\", \"\u660e\", \"\u4e4b\", \"\u524d\", \"\u9ad8\", \"P\", \"B\", \"\u76ee\", \"\u592a\", \"e\", \"9\", \"\u8d77\", \"\u7a1c\", \"\u5979\", \"\u4e5f\", \"W\", \"\u7528\", \"\u65b9\", \"\u5b50\", \"\u82f1\", \"\u6bcf\", \"\u7406\", \"\u4fbf\", \"\u56db\", \"\u6570\", \"\u671f\", \"\u4e2d\", \"C\", \"\u5916\", \"\u6837\", \"a\", \"\u6d77\", \"\u4eec\", \"\u4efb\"]\n    var code = 58344;\n    var content = '';\n    var key='';\n    var index='';\n    var replacement='';\n    for (var i = 0; i < res.length; i++) {\n        key = res[i].charCodeAt(0);\n        index = key - code;\n        replacement =( data2[index] && data2[index] !== '?')? data2[index] : res[i];\n        content += replacement;\n    }\n    return content;\n}\n\n\n\n\nfunction GetDecode(res) {\n   var data3= ['\u4f53', 'y', '\u5341', '\u73b0', '\u5feb', '\u4fbf', '\u8bdd', '\u5374', '\u6708', '\u7269', '\u6c34', '\u7684', '\u653e', '\u77e5', '\u7231', '\u4e07', '?', '\u8868', '\u98ce', '\u7406', 'O', '\u8001', '\u4e5f', 'p', '\u5e38', '\u514b', '\u5e73', '\u51e0', '\u6700', '\u4e3b', '\u5979', 's', '\u5c06', '\u6cd5', '\u60c5', 'o', '\u5149', 'a', '\u6211', '\u5462', 'J', '\u5458', '\u592a', '\u6bcf', '\u671b', '\u53d7', '\u6559', 'w', '\u5229', '\u519b', '\u5df2', 'U', '\u4eba', '\u5982', '\u53d8', '\u5f97', '\u8981', '\u5c11', '\u65af', '\u95e8', '\u7535', 'm', '\u7537', '\u6ca1', 'A', 'K', '\u56fd', '\u65f6', '\u4e2d', '\u8d70', '\u4e48', '\u4f55', '\u53e3', '\u5c0f', '\u5411', '\u95ee', '\u8f7b', 'T', 'd', '\u795e', '\u4e0b', '\u95f4', '\u8f66', 'f', 'G', '\u5ea6', 'D', '\u53c8', '\u5927', '\u9762', '\u8fdc', '\u5c31', '\u5199', 'j', '\u7ed9', '\u901a', '\u8d77', '\u5b9e', 'E', '?', '\u5b83', '\u53bb', 'S', '\u5230', '\u9053', '\u6570', '\u5403', '\u4eec', '\u52a0', 'P', '\u662f', '\u65e0', '\u628a', '\u4e8b', '\u897f', '\u591a', '\u754c', '?', '\u53d1', '\u65b0', '\u5916', '\u6d3b', '\u89e3', '\u5b69', '\u53ea', '\u4f5c', '\u524d', 'Y', '\u5c14', '\u7ecf', '?', 'u', '\u5fc3', '\u544a', '\u7236', '\u7b49', 'Q', '\u6c11', '\u5168', '\u8fd9', '9', '\u679c', '\u5b89', '?', 'i', '\u6bcd', '8', 'r', '\u8bf4', '\u4efb', '\u5148', '\u548c', '\u5730', 'C', '\u5f20', '\u6218', '\u573a', 'g', '\u50cf', 'c', 'q', '\u4f60', '\u4f7f', '?', '\u6837', '\u603b', '\u76ee', 'x', '\u6027', '\u5904', '\u97f3', '\u5934', '?', '\u5e94', '\u4e50', '\u5173', '\u80fd', '\u82b1', 'l', '\u5f53', '\u540d', '\u624b', '4', '\u91cd', '\u5b57', '\u58f0', '\u529b', '\u53cb', '\u7136', '\u751f', '\u4ee3', '\u5185', '\u91cc', '\u672c', '\u56de', '\u771f', '\u5165', '\u5e08', '\u8c61', '?', '0', '\u70b9', 'R', ' \u4eb2', 'V', '\u79cd', '\u52a8', '\u82f1', '\u547d', 'Z', 'h', 'X', '\u505a', '\u7279', '\u8fb9', '\u9ad8', '\u6709', 'B', '\u4e3a', '\u671f', '\u81ea', '\u5e74', '\u9a6c', '\u8ba4', '\u51fa', '\u63a5', '\u81f3', 'H', '\u6b63', '\u65b9', '\u611f', '\u6240', '\u660e', '\u8005', '\u7a1c', 'F', '\u4f4f', '\u5b66', '\u8fd8', '\u5206', '\u610f', '\u66f4', '\u5176', 'n', '\u4f46', '\u6bd4', '\u89c9', '\u4ee5', '\u7531', '\u6b7b', '\u5bb6', '\u8ba9', '\u5931', '\u58eb', 'L', '2', 'I', '\u91d1', '\u53eb', '\u8eab', '\u62a5', '\u542c', 'w', '\u518d', '\u539f', '\u5c71', '\u6d77', '\u767d', '\u5f88', '\u89c1', '5', '\u76f4', '\u4f4d', '\u7b2c', '\u5de5', '\u4e2a', '\u5f00', '\u5c81', '\u597d', '\u7528', '\u90fd', '\u4e8e', '\u53ef', '\u540c', '3', '\u6b21', '\u56db', '?', '\u65e5', '\u4fe1', '\u4e0e', '\u5973', '\u7b11', '\u6ee1', '\u5e76', '\u90e8', '\u4ec0', '\u4e0d', '\u4ece', '\u6216', '\u673a', '\u6b64', '?', '\u4e86', '\u8bb0', '\u4e09', 'e', '\u4e9b', 'b', 'N', '\u592b', '\u4f1a', '\u624d', '\u513f', '\u773c', '\u4e24', '\u7f8e', '\u88ab', ' \u4e00', '\u516c', '\u6765', '\u7acb', 'z', '\u957f', '\u5bf9', '\u5df1', '\u770b', 'k', '\u8bb8', '\u56e0', '\u76f8', '\u8272', '\u540e', '\u5f80', '\u6253', '\u7ed3', '\u683c', '\u8fc7', '\u4e16', '\u6c14', '7', '\u5b50', '\u6761', '\u5728', '\u4e66', '\u4e4b', '\u5b9a', 'v', '\u62c9', '\u6210', '\u8fdb', '\u5e26', '\u7740', '\u4e1c', '\u4e0a', '\u60f3', '\u5929', '\u4ed6', '\u5988', '1', '\u6587', '\u800c', '\u8def', '\u90a3', '\u522b', '\u5fb7', '6', 'M', 't', '\u884c', '\u4faf', '\u96be']\n\n    var code = 58344;\n    var content = '';\n    var key='';\n    var index='';\n    var replacement='';\n    for (var i = 0; i < res.length; i++) {\n        key = res[i].charCodeAt(0);\n        index = key - code;\n        replacement =( data3[index] && data3[index] !== '?')? data3[index] : res[i];\n        content += replacement;\n    }\n    return content;\n}","lastUpdateTime":"1765195184750","loginUrl":"https:\/\/fanqienovel.com\/main\/writer\/login","respondTime":180000,"ruleBookInfo":{"tocUrl":"@js:\nvar id= baseUrl.match(\/\\d+\/);\n`https:\/\/fanqienovel.com\/api\/reader\/directory\/detail?bookId=${id}`;"},"ruleContent":{"content":"@js:\njson=JSON.parse(result);\ndata=json.data.chapterData;\n  if(data.isChapterLock) java.toast(\"\u8bf7\u8d2d\u4e70\u4f1a\u5458\u5e76\u5728\u9605\u8bfb\u767b\u5f55\u8d26\u53f7!!!\");\nGetContentDecode(data.content);"},"ruleExplore":{"author":"author","bookList":"<js>GetDecode(result); <\/js>\n.data.book_list[*]","bookUrl":"\/{{$..book_id}}","coverUrl":"thumb_url","intro":"abstract","kind":"creation_status&&read_count\n@js:\nvar state='';\nswitch(parseInt(String(result[0]))){\ncase 4:case 0: state='\u5b8c\u7ed3';break;\ncase 1: state='\u8fde\u8f7d\u4e2d';break;\ncase -1: state='\u5df2\u65ad\u66f4';break;\ndefault: state='\u5df2\u4e0b\u67b6';break;\n}\nvar list=[];\nlist.push(state);\nlist.push(String(result[1]));\n\nresult=list.toString();\n","lastChapter":"lastChapterTitle","name":"book_name","wordCount":"word_count"},"ruleSearch":{"author":".author","bookList":"<js>GetTitleDecode(result); <\/js>\n.search_book_data_list[*]","bookUrl":"\/{{$..book_id}}","checkKeyWord":"\u5f00\u5e97","coverUrl":"thumb_url","intro":".book_abstract","kind":"read_count&&.creation_status&&.category\n@js:\nvar read=parseInt(result[0]);\nif(read>10000)\n result[0]=(read\/ 10000).toFixed(1)+'\u4e07';\nresult[0]=result[0]+'\u4eba\u5728\u8bfb';\nvar state='';\nswitch(parseInt(result[1])){\ncase 4:case 0: state='\u5b8c\u7ed3';break;\ncase 1: state='\u8fde\u8f7d\u4e2d';break;\ncase -1: state='\u5df2\u65ad\u66f4';break;\ndefault: state='\u5df2\u4e0b\u67b6';break;\n}\nresult[1]=state;\nresult;","lastChapter":".last_chapter_title","name":".book_name","wordCount":".word_count"},"ruleToc":{"chapterList":"@js:var data = JSON.parse(result);\nvolume = data.data.chapterListWithVolume;\nvar flattenChapters = function (chapters) {\n    let flatArray = [];\n    for (let chapter of chapters) {\n        if (Array.isArray(chapter)) {\n            flatArray = flatArray.concat(flattenChapters(chapter));\n        } else {\n            flatArray.push(chapter);\n        }\n    }\n    return flatArray;\n}\nvar list = flattenChapters(volume);\nlist.forEach(item => item.itemId = `https:\/\/fanqienovel.com\/api\/reader\/full?itemId=${item.itemId}&force_mobile=0`)\n\nlist;","chapterName":"title","chapterUrl":"itemId","preUpdateJs":"java.refreshTocUrl()"},"searchUrl":"https:\/\/fanqienovel.com\/api\/author\/search\/search_book\/v1?filter=127,127,127,127&page_count=10&page_index={{page-1}}&query_type=0&query_word={{key}}","weight":0},{"bookSourceName":"\u4e5d\u6843\u5c0f\u8bf4","bookSourceUrl":"https:\/\/k09.a506wge.cc","bookSourceType":0,"bookSourceGroup":"\u7f51\u7edc","bookSourceComment":"","bookSourceVersion":100,"bookSourceAuthor":"AI\u52a9\u624b","ruleSearch":{"bookList":"\/\/div[@class='bookbox']","name":"\/\/div[@class='bookname']\/a\/text()","author":"\/\/div[@class='author']\/text()","cover":"\/\/div[@class='bookimg']\/img\/@src","detail":"\/\/div[@class='bookname']\/a\/@href"},"ruleExplore":[],"ruleBookInfo":{"name":"\/\/div[@class='book_info']\/h1\/text()","author":"\/\/div[@class='book_info']\/p[1]\/text()","cover":"\/\/div[@class='book_cover']\/img\/@src","intro":"\/\/div[@class='book_intro']\/text()","status":"\/\/div[@class='book_info']\/p[3]\/text()","update":"\/\/div[@class='book_info']\/p[4]\/text()","lastChapter":"\/\/div[@class='book_info']\/p[5]\/a\/text()","tocUrl":"\/\/div[@class='catalog']\/a\/@href"},"ruleToc":{"chapterList":"\/\/ul[@class='chapter-list']\/li\/a","chapterName":".\/text()","chapterUrl":".\/@href"},"ruleContent":{"content":"\/\/div[@id='content']\/text()"},"ruleReview":[],"ruleFind":[],"httpUserAgent":"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/91.0.4472.124 Safari\/537.36","searchUrl":"\/search.php?keyword={{key}}","exploreUrl":"","enabled":true,"enabledExplore":false,"weight":0,"customOrder":0,"lastUpdateTime":"1765205687147"},{"bookSourceComment":"\u9002\u914d600\u5c0f\u8bf4\u7f51\uff08600zz.com\uff09\uff0c\u652f\u6301\u641c\u7d22\/\u76ee\u5f55\/\u6b63\u6587\uff0c2025\u5e7412\u6708\u6d4b\u8bd5\u53ef\u7528","bookSourceGroup":"\u805a\u5408\u7ad9","bookSourceName":"600\u5c0f\u8bf4\u7f51","bookSourceType":0,"bookSourceUrl":"http:\/\/www.600zz.com","customOrder":0,"enabled":true,"enabledExplore":false,"enabledCookie":false,"ruleBookInfo":{"author":"css:.info .small a:eq(0)@@text","coverUrl":"css:.img_in img@@src","intro":"css:#intro@@text"},"ruleContent":{"content":"css:#content@@html#p","nextContentUrl":""},"ruleSearch":{"author":"css:.author@@text","bookList":"css:#nr dl","bookUrl":"dt a@href","lastChapter":"css:.update a@@text","name":"dt a@@text"},"ruleToc":{"chapterList":"css:#list dd","chapterName":"a@@text","chapterUrl":"a@href"},"searchUrl":"\/modules\/article\/search.php?searchkey={{key}}","weight":0,"lastUpdateTime":"1765354522699"},{"bookSourceComment":"\u9876\u70b9\u5c0f\u8bf4 \u00b7 \u540c\u6b65\u8d77\u70b9\/\u7eb5\u6a2a\u70ed\u95e8\u4e66 \u00b7 \u65e0\u5f39\u7a97 \u00b7 2025\u5e7412\u6708\u5b9e\u6d4b\u53ef\u7528","bookSourceGroup":"\u4e3b\u6d41\u805a\u5408\u6e90","bookSourceName":"\u9876\u70b9\u5c0f\u8bf4","bookSourceType":0,"bookSourceUrl":"https:\/\/www.dingdian6.com","customOrder":0,"enabled":true,"enabledExplore":false,"enabledCookie":false,"httpUserAgent":"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36","ruleBookInfo":{"author":"css:#info p a@@text","coverUrl":"css:#fmimg img@@src","intro":"css:#intro@@text"},"ruleContent":{"content":"css#content@@html#p","nextContentUrl":""},"ruleSearch":{"author":"css:.author@@text","bookList":"css:.search-list li","bookUrl":"h3 a@href","lastChapter":"css:.update a@@text","name":"h3 a@@text"},"ruleToc":{"chapterList":"css#list dd","chapterName":"a@@text","chapterUrl":"a@href"},"searchUrl":"\/search.php?keyword={{key}}","weight":0,"lastUpdateTime":"1765355512256"},{"bookSourceName":"\ud83c\udd3c\u51b0\u6e05\u9601\u5c0f\u8bf4","bookSourceType":0,"bookSourceUrl":"https:\/\/m.bqgcn.com\/","customButton":false,"customOrder":0,"enabled":true,"enabledCookieJar":false,"enabledExplore":true,"eventListener":false,"lastUpdateTime":"1765459827858","respondTime":180000,"ruleBookInfo":{"author":"[property=\"og:novel:author\"]@content","coverUrl":"[property=\"og:image\"]@content","intro":"[property=\"og:novel:update_time\"]@content&&\n[property=\"og:description\"]@content@js:'\u66f4\u65b0\u65f6\u95f4\uff1a'+result","kind":"[property~=category|status|tags]@content","lastChapter":"[property~=las?test_chapter_name]@content","name":"[property=\"og:novel:book_name\"]@content"},"ruleContent":{"content":"#nr1@p@text","nextContentUrl":"script@html##(http[^\"]+page[^\"]+)##$1###","replaceRegex":"##.*\u7262\u8bb0\u7f51\u5740:.*|\u672c\u7ae0\u672a\u5b8c.*"},"ruleExplore":[],"ruleSearch":{"author":".s3@text","bookList":".lis li","bookUrl":"a@href","coverUrl":"a@href##(\\d+)_(\\d+)\/##http:\/\/img.bqgcn.com\/$1\/$2\/$2s.jpg","kind":".s1@text##\\[|\\]","name":"a@text"},"ruleToc":{"chapterList":".chapter[1]@a","chapterName":"text","chapterUrl":"href","nextTocUrl":"option@value"},"searchUrl":"@js:\nvar html = java.ajax(source.key);\nvar token = html.match(\/name=\"_token\" value=\"(.+?)\"\/);  \ntoken = token ? token[1] : null;\njava.log(token);\n\nvar body = `_token=${token}&kw=${key}&action=login`;\nvar option = { \n  \"charset\": \"utf-8\",\n  \"method\": \"POST\",\n  \"body\": body\n};\nsource.key + \"search,\" + JSON.stringify(option);","weight":0},{"bookSourceName":"\u5c0f\u8bf4520","bookSourceType":0,"bookSourceUrl":"https:\/\/www.xs520.com\/","customOrder":2,"enabled":true,"enabledCookieJar":false,"enabledExplore":true,"lastUpdateTime":"1765533654695","respondTime":180000,"ruleBookInfo":{"author":".info@li.0@a@text","coverUrl":"img@src","intro":"id.intro_pc@text##\u7b80\u4ecb\uff1a","kind":".title@a.1@text","lastChapter":".info@.col-12.1@a@text","name":".info@h1@text"},"ruleContent":{"content":".font_max@text##\u7b2c\\([1-3]+\/3\\)\u9875","nextContentUrl":"text.\u4e0b\u4e00\u7ae0@href","title":"h1@text"},"ruleExplore":[],"ruleSearch":{"author":".book_other.0@text","bookList":".box@.col-md-6","bookUrl":"a@href","coverUrl":"img@src","kind":"h3@text##(?<!\\[)[\\u4e00-\\u9fa5]+(?!\\])","lastChapter":".book_other.3@text##\u6700\u65b0\u7ae0\u8282","name":"h3@text##[\\[\\u4e00-\\u9fa5]+\\]"},"ruleToc":{"chapterList":".book_list2@li","chapterName":"a@text","chapterUrl":"a@href","nextTocUrl":".page-link.0@text##.*\\\/(\\d+)$##$1\n@js:\nres = JSON.parse(result)\nlist = [];\nfor (var i = 2; i <= res; i++) {\n\tlist.push(baseUrl.replace(\/$\/,\"index_\" + i + \".html\")); \n}\nlist;"},"searchUrl":"\/search.php?q={{key}}","weight":0},{"bookSourceName":"365\u5c0f\u8bf4\u7f51","bookSourceType":0,"bookSourceUrl":"http:\/\/www.shukuge.com\/","customOrder":1,"enabled":true,"enabledCookieJar":false,"enabledExplore":true,"exploreUrl":"\u7384\u5e7b::http:\/\/www.shukuge.com\/i-xuanhuan\/{{page}}&&\u8a00\u60c5::http:\/\/www.shukuge.com\/i-yanqing\/{{page}}&&\u7a7f\u8d8a::http:\/\/www.shukuge.com\/i-chuanyue\/{{page}}&&\u91cd\u751f::http:\/\/www.shukuge.com\/i-chongsheng\/{{page}}&&\u67b6\u7a7a::http:\/\/www.shukuge.com\/i-jiakong\/{{page}}&&\u603b\u88c1::http:\/\/www.shukuge.com\/i-zongcai\/{{page}}&&\u6b66\u4fa0::http:\/\/www.shukuge.com\/i-wuxia\/{{page}}&&\u4ed9\u4fa0::http:\/\/www.shukuge.com\/i-xianxia\/{{page}}&&\u803d\u7f8e::http:\/\/www.shukuge.com\/i-danmei\/{{page}}&&\u90fd\u5e02::http:\/\/www.shukuge.com\/i-dushi\/{{page}}&&\u519b\u4e8b::http:\/\/www.shukuge.com\/i-junshi\/{{page}}&&\u7f51\u6e38::http:\/\/www.shukuge.com\/i-wangyou\/{{page}}&&\u60ac\u7591::http:\/\/www.shukuge.com\/i-xuanyi\/{{page}}&&\u6587\u5b66::http:\/\/www.shukuge.com\/i-wenxue\/{{page}}&&\u79d1\u5e7b::http:\/\/www.shukuge.com\/i-kehuan\/{{page}}&&\u4fee\u771f::http:\/\/www.shukuge.com\/i-xiuzhen\/{{page}}&&\u5386\u53f2::http:\/\/www.shukuge.com\/i-lishi\/{{page}}&&\u5176\u4ed6::http:\/\/www.shukuge.com\/i-qita\/{{page}}&&\u77ed\u7bc7::http:\/\/www.shukuge.com\/i-duanpian\/{{page}}&&\u4e2d\u7bc7::http:\/\/www.shukuge.com\/i-zhongpian\/{{page}}&&\u957f\u7bc7::http:\/\/www.shukuge.com\/i-changpian\/{{page}}&&\u6700\u65b0::http:\/\/www.shukuge.com\/new\/{{page}}","lastUpdateTime":"1765533832356","respondTime":180000,"ruleBookInfo":{"author":".bookdmore@p.2@a@text","coverUrl":".bookdcover@img@src","intro":".bookdtext@p.0@text","kind":".bookdmore@p.0@a@text","lastChapter":".bookdmore@p.6@a@text","name":".bookd-title@text##TXT\u5168\u96c6","tocUrl":".bookdtext@p.6@a@href"},"ruleContent":{"content":"id.content@text##\u6295\u63a8\u8350\u7968|\u4e0a\u4e00\u7ae0|\u2190|\u7ae0\u8282\u76ee\u5f55|\u2192|\u4e0b\u4e00\u7ae0|\u52a0\u5165\u4e66\u7b7e","title":".bookd-title@text##\u4f5c\u8005\uff1a[\\u4e00-\\u9fa5]+|\u66f4\u65b0\u65f6\u95f4\uff1a[\\d]{4}-[\\d]{2}-[\\d]{2}|[\\d]{2}:[\\d]{2}:[\\d]{2}"},"ruleExplore":{"author":".sp@span.0@a@text","bookList":".listitem","bookUrl":".bookdesc@a@href","coverUrl":"img@src","intro":".bookdesc@p.2@text##\u7b80\u4ecb\uff1a","kind":".sp@span.1@text##\u5206\u7c7b\uff1a","lastChapter":".bookdesc@p.1@a@text","name":".bookdesc@h2@text"},"ruleSearch":{"author":".sp@span.0@text##\u4f5c\u8005\uff1a","bookList":".listitem","bookUrl":".bookdesc@a@href","coverUrl":"img@src","intro":".desc.1@text##\u7b80\u4ecb\uff1a","kind":".sp@span.1@text##\u5206\u7c7b\uff1a","lastChapter":".desc.0@text##\u6700\u65b0\u7ae0\u8282\uff1a","name":".bookdesc@h2@text"},"ruleToc":{"chapterList":".box_con@dd","chapterName":"a@text","chapterUrl":"a@href"},"searchUrl":"Search?wd={{key}}","weight":0},{"bookSourceComment":"\u66f4\u65b0\u65e5\u5fd7\u8bf7\u70b9\u51fb\u767b\u5f55\uff0c\u66f4\u65b0\u4e66\u6e90\u4e2d\u67e5\u770b\n\n\u517c\u5bb9\u6b63\u5f0f\u7248\u9605\u8bfbapp","bookSourceGroup":"\u5927\u7070\u72fc\u805a\u5408","bookSourceName":"\u5168\u80fd\u4e66\u6e90","bookSourceType":0,"bookSourceUrl":"\u5168\u80fd\u4e66\u6e90","bookUrlPattern":"https?:\\\/\\\/(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z0-9-]+(?::\\d+)?\\\/detail.*","customButton":false,"customOrder":3,"enabled":true,"enabledCookieJar":false,"enabledExplore":true,"eventListener":false,"exploreUrl":"<js>\nfunction setArgument(key, value) {\n    var open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '') || {};\n    open_argument[key] = value;\n    var result = JSON.stringify(open_argument);\n    source.setVariable(result);\n    return result;\n}\n\nvar open_argument = source.getVariable();\nvar base_url = getArguments(open_argument, 'server') || '';\nvar ms = getArguments(open_argument, 'tone_id') || '';\nvar source_type = getArguments(open_argument, 'source_type') || '\u7537\u9891';\nvar tab = getArguments(open_argument, 'media') || '\u5c0f\u8bf4';\nvar sources = getArguments(open_argument, 'source') || '\u756a\u8304';\n\n\nvar sdtoken;\ntry {\n    var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n    sdtoken = String(loginInfoMap['\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)'] || '');\n} catch (e) {\n    sdtoken = '';\n}\n\nvar rawCookie = getFanqieCookie() || sdtoken;\nvar match = rawCookie.match(\/sessionid=[^;]+\/);\nvar fqcookie = match ? match[0] : '';\nvar fqssionid = '';\nif (!fqcookie) {\n    java.toast('\u60a8\u8fd8\u672a\u767b\u9646\u756a\u8304\u8d26\u53f7\uff0c\u65e0\u6cd5\u540c\u6b65\u6570\u636e\u54e6\uff01');\n} else {\n    fqssionid = getSessionId(fqcookie)\n}\nvar fqsjurl = base_url + \"\/bookshelf?page={{page}}&ssionid=\" + fqssionid;\nvar fqtjurl = base_url + \"\/fqrecommend?page={{page}}&ssionid=\" + fqssionid;\nvar fqlsurl = base_url + \"\/fqhistory?page={{page}}&ssionid=\" + fqssionid;\n\nvar groupDatas = [];\nvar infoData = [];\n\nfunction deviceType() {\n    try {\n        return !!java.androidId();\n    } catch (e) {\n        return false;\n    }\n}\n\nvar hasValidCookie = fqcookie.length > 0;\n\nif (hasValidCookie) {\n    function groupQuery() {\n        try {\n            var url = base_url + \"\/group_name?ssionid=\" + fqssionid;\n            var res = java.ajax(url);\n            var response = JSON.parse(res);\n\n            if (!(response && response.data)) {}\n\n            response.data.forEach(function(group) {\n                var keys = Object.keys(group);\n                if (keys.length > 0) {\n                    var key = keys[0];\n                    var value = group[key];\n                    if (value && value.length) {\n                        var option = {\n                            \"method\": \"POST\",\n                            \"body\": {\n                                \"book_ids\": value,\n                                \"page\": \"{{page}}\"\n                            }\n                        };\n                        groupDatas.push({\n                            title: key,\n                            url: base_url + \"\/bookshelf,\" + JSON.stringify(option),\n                            style: {\n                                layout_flexGrow: 1,\n                                layout_flexBasisPercent: 0.45\n                            }\n                        });\n                    }\n                }\n            });\n\n            if (groupDatas.length % 2 !== 0) {\n                groupDatas.push({\n                    title: \"--\",\n                    url: \"\",\n                    style: {\n                        layout_flexGrow: 1,\n                        layout_flexBasisPercent: 0.45\n                    }\n                });\n            }\n        } catch (e) {\n            java.longToast(\"\u756a\u8304\u767b\u5f55\u8fc7\u671f\uff0c\u5df2\u9690\u85cf\u756a\u8304\u4e66\u67b6\");\n        }\n    }\n\n    try {\n        java.longToast(\"\u6b63\u5728\u52a0\u8f7d\u5206\u7ec4\u6570\u636e...\");\n        var userUrl = base_url + \"\/fquser?ssionid=\" + fqssionid;\n        var userRes = java.ajax(userUrl);\n        var userData = JSON.parse(userRes);\n\n        var userName = (userData && userData.data && userData.data.name) ? userData.data.name : '\u672a\u77e5\u7528\u6237';\n        if (!userName.includes('\u672a\u77e5\u7528\u6237')) {\n            infoData = [{\n                title: \"\u756a\u8304\u4e2a\u4eba\u4e2d\u5fc3\",\n                url: fqsjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }, {\n                title: \"\u4e2a\u6027\u63a8\u8350(\u756a\u8304)\",\n                url: fqtjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }, {\n                title: \"\u5386\u53f2\u9605\u8bfb(\u756a\u8304)\",\n                url: fqlsurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }];\n        }\n        groupQuery();\n    } catch (e) {\n        java.longToast(\"\u756a\u8304\u767b\u5f55\u8fc7\u671f\uff0c\u5df2\u9690\u85cf\u756a\u8304\u4e66\u67b6\");\n    }\n}\n\nvar style_list = [];\ntry {\n    var durl = `${base_url}\/discovestyle?source=${sources}&source_type=${source_type}&tab=${tab}`;\n    var res = java.ajax(durl);\n    var result = JSON.parse(res);\n    style_list = result.data || [];\n    if (result.msg) {\n        java.toast(result.msg);\n    }\n} catch (e) {\n    java.toast(\"\u53d1\u73b0\u6837\u5f0f\u83b7\u53d6\u5931\u8d25\");\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet qtop = {\n    method: \"GET\",\n    headers: {\n        cookie: qtcookie\n    },\n};\nqtop = JSON.stringify(qtop);\nlet qtsjurl = base_url+'\/get_book_shelf,'+qtop\nlet qtsj = [{\n                title: \"\u5927\u7070\u72fc\u4e2a\u4eba\u4e2d\u5fc3\",\n                url: qtsjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }]\nvar finalData = infoData.concat(groupDatas, style_list);\nfinalData = qtsj.concat(finalData);\nJSON.stringify(finalData);\n<\/js>","header":"{ \"User-Agent\":\"Mozilla\/5.0 (Linux; Android 6.0; Nexus 5 Build\/MRA58N) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Mobile Safari\/537.36 Edg\/138.0.0.0\" }","jsLib":"var host = [\n    'http:\/\/219.154.201.122:5006',\n    'https:\/\/api.langge.cf'\n];\n\nfunction getArguments(open_argument, key) {\n    try {\n        open_argument = JSON.parse(open_argument);\n    } catch (e) {\n        open_argument = {\n            media: \"\u5c0f\u8bf4\",\n            tone_id: \"\u9ed8\u8ba4\u97f3\u8272\",\n            server: host[0],\n            source: \"\u5168\u90e8\",\n            source_type: \"\u7537\u9891\",\n        };\n    }\n    if (key) {\n        return open_argument[key];\n    } else {\n        return open_argument;\n    }\n}\n\nfunction setArguments(key, value) {\n    const {\n        source\n    } = this;\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    open_argument[key] = value;\n    open_argument = JSON.stringify(open_argument);\n    source.setVariable(open_argument);\n    return open_argument;\n}\n\nfunction decrypt(Text) {\n    return Text;\n}\n\nfunction paraForAndroid(content, sources) {\n    let {\n        java,\n        cache,\n        source\n    } = this;\n    let plcolor = getArguments(source.getVariable(), \"plcolor\");\n    if (!plcolor) {\n        plcolor = \"#000000\";\n    }\n\n    const createSvg = this.createSvg.bind(this);\n\n    return content.replace(\/<p>(.*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\\/>)?<\\\/p>\/g,\n        (match, text, url, count) => {\n            if (url && count) {\n                const click = 0;\n                cache.putMemory(url, click);\n                const encodedUrl = url;\n                return `<p>${text}<img src=\"${createSvg(count, plcolor,encodedUrl,sources)}\"><\/p>`;\n            } else {\n                return `<p>${text}<\/p>`;\n            }\n        }\n    );\n}\n\n\nfunction showCmt(url, sources) {\n    let {\n        java,\n        cache\n    } = this;\n\n    const currentTime = Date.now();\n    const click = cache.getFromMemory(url);\n    let isqread = false;\n    try {\n        java.qread();\n        isqread = true;\n    } catch (e) {}\n    if (click < 1 && !isqread) {\n        cache.putMemory(url, click + 1);\n        return;\n    } else {\n        try {\n            java.startBrowserDp(url, sources + '\u6bb5\u8bc4');\n        } catch (e) {\n            java.startBrowser(url, sources + '\u6bb5\u8bc4');\n        }\n    }\n}\n\n\n\nfunction createSvg(number, color, encodedUrl, sources) {\n    var displayText = number > 99 ? \"99+\" : number.toString();\n    var loginInfoMap = {};\n\n    if (this.source && typeof this.source.getLoginInfoMap == 'function') {\n        loginInfoMap = this.source.getLoginInfoMap() || {};\n    }\n\n    var bubbleStyle = String(loginInfoMap['\u6bb5\u8bc4\u6c14\u6ce1\u6837\u5f0f(0-4)'] || '0');\n    var svg;\n\n    \/\/ \u6837\u5f0f1\uff1a\u7cbe\u81f4\u5706\u5f62 - \u7b80\u6d01\u4f18\u96c5\n    if (bubbleStyle == '1') {\n        svg = '<svg width=\"1000\" height=\"1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">' +\n            '<circle cx=\"500\" cy=\"500\" r=\"440\" fill=\"none\" stroke=\"' + color + '\" stroke-width=\"32\" opacity=\"0.2\"\/>' +\n            '<circle cx=\"500\" cy=\"500\" r=\"440\" fill=\"none\" stroke=\"' + color + '\" stroke-width=\"4\"\/>' +\n            '<text x=\"500\" y=\"500\" font-family=\"-apple-system, sans-serif\" text-anchor=\"middle\" ' +\n            'font-size=\"400\" fill=\"' + color + '\" dy=\"0.35em\" font-weight=\"500\">' + displayText + '<\/text>' +\n            '<\/svg>';\n    }\n    \/\/ \u6837\u5f0f2\uff1a\u5fae\u4fe1\u98ce\u683c - \u719f\u6089\u4eb2\u5207\u7684\u5bf9\u8bdd\u6c14\u6ce1\n    else if (bubbleStyle == '2') {\n        svg = '<svg width=\"1000\" height=\"900\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">' +\n            '<path d=\"M120,120 L880,120 Q920,120 920,160 L920,680 Q920,720 880,720 L280,720 L120,840 L120,720 Q80,720 80,680 L80,160 Q80,120 120,120 Z\" ' +\n            'fill=\"none\" stroke=\"' + color + '\" stroke-width=\"24\" stroke-linejoin=\"round\"\/>' +\n            '<text x=\"500\" y=\"440\" font-family=\"-apple-system, sans-serif\" text-anchor=\"middle\" ' +\n            'font-size=\"360\" fill=\"' + color + '\" dy=\"0.32em\" font-weight=\"500\">' + displayText + '<\/text>' +\n            '<\/svg>';\n    }\n    \/\/ \u6837\u5f0f3\uff1a\u60ac\u6d6e\u6807\u7b7e - \u6241\u5e73\u73b0\u4ee3\u98ce\u683c\n    else if (bubbleStyle == '3') {\n        svg = '<svg width=\"1000\" height=\"600\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">' +\n            '<rect x=\"80\" y=\"80\" width=\"840\" height=\"440\" rx=\"220\" ry=\"220\" ' +\n            'fill=\"none\" stroke=\"' + color + '\" stroke-width=\"6\"\/>' +\n            '<rect x=\"100\" y=\"100\" width=\"800\" height=\"400\" rx=\"200\" ry=\"200\" ' +\n            'fill=\"none\" stroke=\"' + color + '\" stroke-width=\"20\" opacity=\"0.3\"\/>' +\n            '<text x=\"500\" y=\"310\" font-family=\"-apple-system, sans-serif\" text-anchor=\"middle\" ' +\n            'font-size=\"280\" fill=\"' + color + '\" dy=\"0.32em\" font-weight=\"500\" letter-spacing=\"8\">' + displayText + '<\/text>' +\n            '<\/svg>';\n    }\n    \/\/ \u6837\u5f0f4\uff1a\u4e66\u7b7e\u6807\u6ce8 - \u7b26\u5408\u9605\u8bfb\u573a\u666f\n    else if (bubbleStyle == '4') {\n        svg = '<svg width=\"900\" height=\"1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">' +\n            '<path d=\"M150,80 L750,80 Q800,80 800,130 L800,870 Q800,920 750,920 L480,920 L450,980 L420,920 L150,920 Q100,920 100,870 L100,130 Q100,80 150,80 Z\" ' +\n            'fill=\"none\" stroke=\"' + color + '\" stroke-width=\"24\" stroke-linejoin=\"round\"\/>' +\n            '<line x1=\"150\" y1=\"280\" x2=\"750\" y2=\"280\" stroke=\"' + color + '\" stroke-width=\"3\" opacity=\"0.3\"\/>' +\n            '<text x=\"450\" y=\"520\" font-family=\"Georgia, serif\" text-anchor=\"middle\" ' +\n            'font-size=\"360\" fill=\"' + color + '\" dy=\"0.32em\" font-weight=\"400\">' + displayText + '<\/text>' +\n            '<text x=\"450\" y=\"800\" font-family=\"-apple-system, sans-serif\" text-anchor=\"middle\" ' +\n            'font-size=\"70\" fill=\"' + color + '\" opacity=\"0.6\" letter-spacing=\"3\">\u8bc4\u8bba<\/text>' +\n            '<\/svg>';\n    }\n    \/\/ \u9ed8\u8ba4\u8fd4\u56de\u6837\u5f0f0\n    else {\n        svg = '<svg width=\"160\" height=\"120\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">' +\n            '<path d=\"M 55 10 ' +\n            'L 120 10 ' +\n            'Q 150 10 150 40 ' +\n            'L 150 80 ' +\n            'Q 150 110 120 110 ' +\n            'L 55 110 ' +\n            'Q 25 110 25 80 ' +\n            'L 25 75 ' +\n            'L 3 60 ' +\n            'L 25 45 ' +\n            'L 25 40 ' +\n            'Q 25 10 55 10 Z\" ' +\n            'fill=\"none\" ' +\n            'stroke=\"' + color + '\" ' +\n            'stroke-width=\"2\" ' +\n            'stroke-linejoin=\"round\"\/>' +\n            '<!-- \u6570\u5b57\u6587\u672c -->' +\n            '<text x=\"87\" y=\"75\" ' +\n            'font-family=\"Arial, sans-serif\" ' +\n            'text-anchor=\"middle\" ' +\n            'dominant-baseline=\"middle\" ' +\n            'font-size=\"50\" ' +\n            'font-weight=\"bold\" ' +\n            'fill=\"' + color + '\">' +\n            displayText +\n            '<\/text>' +\n            '<!-- \u63d0\u793a\u6587\u672c -->' +\n            '<text x=\"87\" y=\"95\" ' +\n            'font-family=\"Arial, sans-serif\" ' +\n            'text-anchor=\"middle\" ' +\n            'dominant-baseline=\"middle\" ' +\n            'font-size=\"9\" ' +\n            'fill=\"' + color + '\" ' +\n            'opacity=\"0.7\">' +\n            '\u5237\u65b0\u67e5\u770b' +\n            '<\/text>' +\n            '<\/svg>';\n    }\n\n    var encodedSvg = this.java.base64Encode(svg);\n    return 'data:image\/svg+xml;base64,' + encodedSvg + ',{\"js\":\"showCmt(\\'' + encodedUrl + '\\', \\'' + sources + '\\')\",\"style\":\"text\"}';\n}\n\n\n\nfunction cleanHTML(html) {\n    let result = html\n        .replace(\/<header[^>]*>[\\s\\S]*?<\\\/header>\/gi, \"\")\n        .replace(\/<div class=\"tt-title\"[^>]*>[\\s\\S]*?<\\\/div>\/gi, \"\")\n        .replace(\/<(?!\\\/?p\\b|\\\/?img\\b)[^>]+>\/gi, \"\");\n    result = result.replace(\/<\\\/?p[^>]*>\/g, \"\\n\");\n    return result.replace(\/\\n+\/g, \"\\n\").trim();\n}\n\n\nfunction getBaseUrl(url) {\n    if (!url) {\n        return null;\n    }\n    url = String(url);\n    if (url.match(\/https?:\\\/\\\/\/i)) {\n        var index = url.indexOf(\"\/\", 9);\n        return index == -1 ? url : url.substring(0, index);\n    }\n    return null;\n}\n\nfunction isIPv4Address(ip) {\n    ip = String(ip);\n    let parts = ip.split(\".\");\n    if (parts.length !== 4) return false;\n\n    for (let part of parts) {\n        if (!\/^\\d+$\/.test(part)) return false; \/\/ \u5fc5\u987b\u662f\u6570\u5b57\n        if (part.length > 1 && part[0] === \"0\") return false; \/\/ \u7981\u6b62\u524d\u5bfc\u96f6\n        let num = parseInt(part, 10);\n        if (num < 0 || num > 255) return false; \/\/ \u8303\u56f4\u68c0\u67e5\n    }\n    return true;\n}\n\nfunction isIPv6Address(ip) {\n    ip = String(ip);\n    \/\/ \u5904\u7406\u53cc\u5192\u53f7\uff08\u6700\u591a\u51fa\u73b0\u4e00\u6b21\uff09\n    if (ip.includes(\":::\")) return false;\n    let doubleColonCount = (ip.match(\/::\/g) || []).length;\n    if (doubleColonCount > 1) return false;\n\n    \/\/ \u5206\u5272\u6210\u7ec4\n    let groups = ip.split(\":\");\n    let validGroupCount = 8;\n    let actualGroupCount = groups.filter((g) => g !== \"\").length;\n\n    \/\/ \u9a8c\u8bc1\u7ec4\u6570\n    if (doubleColonCount === 1) {\n        if (actualGroupCount > validGroupCount - 1) return false;\n    } else {\n        if (groups.length !== validGroupCount) return false;\n    }\n\n    \/\/ \u9a8c\u8bc1\u6bcf\u7ec4\u5185\u5bb9\n    for (let group of groups) {\n        if (group === \"\") continue; \/\/ \u8df3\u8fc7\u7a7a\u7ec4\uff08\u53cc\u5192\u53f7\u90e8\u5206\uff09\n        if (!\/^[0-9a-fA-F]{1,4}$\/.test(group)) return false; \/\/ 1-4\u4f4d\u5341\u516d\u8fdb\u5236\n    }\n    return true;\n}\n\nfunction isIPAddress(input) {\n    return isIPv4Address(input) || isIPv6Address(input);\n}\n\nfunction getSessionId(cookieString) {\n    const match = cookieString.match(\/sessionid=([^;]+)\/);\n    return match ? match[1] : null;\n}\n\nfunction getKey(key) {\n    let parts = key.split(\";\");\n    for (let part of parts) {\n        if (part.includes(\"qttoken\")) {\n            return part.split(\"=\")[1];\n        }\n    }\n    return \"\";\n}\n\nfunction getFanqieCookie() {\n    const {\n        cookie\n    } = this;\n    try {\n        return String(cookie.getCookie('fanqienovel.com') || java.getCookie('fanqienovel.com') || '');\n    } catch (e) {\n        return '';\n    }\n}\n\n\nfunction paraForiOS(html, sources) {\n    return html.replace(\n        \/<p>(.*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\\/>)?<\\\/p>\/g,\n        function(match, text, url, count) {\n            if (url && count) {\n                const encodedUrl = url.replace(\/&\/g, '&amp;');\n                return `<span rs-native>${text}<comment count=\"${count}\" onPress=\"java.showReadingBrowser('${encodedUrl}','${sources}\u6bb5\u8bc4')\"><\/span>`;\n            } else {\n                return `<span rs-native>${text}<\/span>`;\n            }\n        }\n    );\n}","lastUpdateTime":"1765536899064","loginUi":"[{\n        \"name\": \"\u90ae\u7bb1\",\n        \"type\": \"text\"\n    },{\n        \"name\": \"\u5bc6\u7801\",\n        \"type\": \"password\"\n    },\n    {\n        \"name\": \"\u2665\u767b\u5f55\u4e66\u6e90\",\n        \"type\": \"button\",\n        \"action\": \"login(true)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83c\udf45\u756a\u8304\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"fq_login()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83c\udfdd\u7528\u6237\u540e\u53f0\",\n        \"type\": \"button\",\n        \"action\": \"loginqt()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udd10\u6ce8\u518c\u4e66\u6e90\",\n        \"type\": \"button\",\n        \"action\": \"register()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n\n    {\n        \"name\": \" \ud83d\udd1a \u9000\u51fa\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"logout()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udd2e \u68c0\u6d4b\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"checkStatus()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2615\u6253\u8d4f\u4eab\u798f\u5229\",\n        \"type\": \"button\",\n        \"action\": \"vip()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \" \ud83d\uddd1 \u6e05\u9664\u8bbe\u5907\",\n        \"type\": \"button\",\n        \"action\": \"clearDevice()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n\n    }, {\n        \"name\": \"\ud83d\udcd1\u66f4\u5c11\u7b80\u4ecb\",\n        \"type\": \"button\",\n        \"action\": \"set_info()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udcdd\u6bb5\u8bc4\u5f00\u5173\",\n        \"type\": \"button\",\n        \"action\": \"paracomment('fqpara')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udcda \u540c\u6b65\u4e66\u67b6\",\n        \"type\": \"button\",\n        \"action\": \"set_reading()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u264b\ufe0f \u7537\/\u5973\u9891\u9053\",\n        \"type\": \"button\",\n        \"action\": \"set_source_type()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udca2 \u5f3a\u5236\u641c\u7d22\u5168\u90e8\",\n        \"type\": \"button\",\n        \"action\": \"disabledSources()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2747\ufe0f \u66f4\u65b0\u4e66\u6e90\",\n        \"type\": \"button\",\n        \"action\": \"renderVersionPage()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\uddc2\u5f53\u524d\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"get_media()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"\ud83d\udcd6\u5c0f\u8bf4\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u5c0f\u8bf4')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udd0a\u542c\u4e66\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u542c\u4e66')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83c\udfde\u6f2b\u753b\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u6f2b\u753b')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\uddb2\u77ed\u5267\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u77ed\u5267')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83c\udf9a\u5207\u6362\u670d\u52a1\u5668\",\n        \"type\": \"button\",\n        \"action\": \"set_server()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u267b\ufe0f\u68c0\u6d4b\u5f53\u524d\u670d\u52a1\u5668\",\n        \"type\": \"button\",\n        \"action\": \"checkNet()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2695\ufe0f\u672c\u5730\/\u670d\u52a1\u5668 \",\n        \"type\": \"button\",\n        \"action\": \"get_proxy()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udccc\u6c38\u4e45\u53d1\u5e03\u9875\ud83d\udccc\",\n        \"type\": \"button\",\n        \"action\": \"api()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2193\u2193\u4e0b\u65b9\u53ef\u5207\u6362\u6765\u6e90\u7528\u4e8e\u641c\u7d22\/\u53d1\u73b0\u9875\u2193\u2193\",\n        \"type\": \"button\",\n        \"action\": \"get_media()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"\u2728\ufe0f\u7f51\u53cb\u63a8\u8350\",\n        \"type\": \"button\",\n        \"action\": \"set_source('\u63a8\u8350')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udc96\u6211\u6765\u63a8\u8350\",\n        \"type\": \"button\",\n        \"action\": \"put_book()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u5168\u90e8\",\n        \"type\": \"button\",\n        \"action\": \"set_source('\u5168\u90e8')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u756a\u8304')\",\n        'name': '\u756a\u8304',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('69\u4e66\u5427')\",\n        'name': '69\u4e66\u5427',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u4e03\u732b')\",\n        'name': '\u4e03\u732b',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u767e\u5ea6')\",\n        'name': '\u767e\u5ea6',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u8d77\u70b9')\",\n        'name': '\u8d77\u70b9(\u7b2c\u4e09\u65b9)',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5f97\u95f4')\",\n        'name': '\u5f97\u95f4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5854\u8bfb')\",\n        'name': '\u5854\u8bfb',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u4e66\u65d7')\",\n        'name': '\u4e66\u65d7',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('QQ')\",\n        'name': 'QQ',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u732b\u773c')\",\n        'name': '\u732b\u773c',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u641c\u4e66\u795e\u5668')\",\n        'name': '\u641c\u4e66\u795e\u5668',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5f97\u5947')\",\n        'name': '\u5f97\u5947',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u4f2a69')\",\n        'name': '\u4f2a69',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u7231\u4e0b\u7535\u5b50\u4e66')\",\n        'name': '\u7231\u4e0b\u7535\u5b50\u4e66',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5c0f\u7c73')\",\n        'name': '\u5c0f\u7c73',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u661f\u661f\u5c0f\u8bf4')\",\n        'name': '\u661f\u661f\u5c0f\u8bf4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u7b14\u8da3\u960122')\",\n        'name': '\u7b14\u8da3\u960122',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u9876\u70b9')\",\n        'name': '\u9876\u70b9',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5e7b\u68a6\u8f7b\u5c0f\u8bf4')\",\n        'name': '\u5e7b\u68a6\u8f7b\u5c0f\u8bf4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u6c5f\u6e56')\",\n        'name': '\u6c5f\u6e56',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u6b6a\u745e\u53e4\u5fb7')\",\n        'name': '\u6b6a\u745e\u53e4\u5fb7\u6f2b\u753b',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u6cb3\u9a6c')\",\n        'name': '\u6cb3\u9a6c\u77ed\u5267',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u77e5\u4e4e')\",\n        'name': '\u77e5\u4e4e',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('vip')\",\n        'name': '\u4e0b\u65b9\u4e3aVIP\u4e13\u5c5e\u4e66\u6e90(\u70b9\u51fb\u6b64\u5904\u641c\u6240\u6709vip)',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        'action': \"set_source('\u559c\u9a6c\u62c9\u96c5')\",\n        'name': '\u559c\u9a6c\u62c9\u96c5',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('svip')\",\n            'name': '\u4e0b\u65b9\u4e3aSVIP\u4e13\u5c5e\u4e66\u6e90(\u70b9\u51fb\u6b64\u5904\u641c\u6240\u6709svip)',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 1\n            }\n        }, {\n            'action': \"set_source('\u8d85\u4f1a\u4e13\u5c5e\u77ed\u5267')\",\n            'name': '\u8d85\u4f1a\u4e13\u5c5e\u77ed\u5267',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u8d85\u4f1a\u4e13\u5c5e\u5c0f\u8bf4')\",\n            'name': '\u8d85\u4f1a\u4e13\u5c5e\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n        'action': \"set_source('\u9177\u6211')\",\n        'name': '\u9177\u6211',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n            'action': \"set_source('\u53f0\u6e7e\u5c0f\u8bf4')\",\n            'name': '\u53f0\u6e7e\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('3A\u5c0f\u8bf4')\",\n            'name': '3A\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n             'action': \"set_source('\u5305\u5b50\u6f2b\u753b')\",\n            'name': '\u5305\u5b50\u6f2b\u753b',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {       \t  \t\n            'action': \"set_source('QQ\u9605\u8bfb')\",\n            'name': 'QQ(\u4f1a\u5458\u4e66\u7c4d\u514d\u8d39)',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u4e66\u9999\u4e4b\u5bb6')\",\n            'name': '\u4e66\u9999\u4e4b\u5bb6',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n        \t    'action': \"set_source('\u8ffd\u66f4\u4eba')\",\n            'name': '\u8ffd\u66f4\u4eba',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u6f2b\u753b\u5c4b')\",\n            'name': '\u6f2b\u753b\u5c4b',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u6f2b\u753b\u7f51')\",\n            'name': '\u6f2b\u753b\u7f51',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u6d77\u6d0b\u542c\u4e66')\",\n            'name': '\u6d77\u6d0b\u542c\u4e66',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u9e7f\u9e7f')\",\n            'name': '\u9e7f\u9e7f',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u5b8c\u672c\u5c0f\u8bf4')\",\n            'name': '\u5b8c\u672c\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u76d0\u9009\u6587\u5e93')\",\n            'name': '\u76d0\u9009\u6587\u5e93',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {    \t     \t\n            'action': \"set_source('\u798f\u5229\u5c0f\u8bf4')\",\n            'name': '\u798f\u5229\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u8f7b\u4e4b\u6587\u5e93')\",\n            'name': '\u8f7b\u4e4b\u6587\u5e93',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u5c0f\u8bf4\u4e09\u5343')\",\n            'name': '\u5c0f\u8bf4\u4e09\u5343',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u9605\u53cb\u5c0f\u8bf4')\",\n            'name': '\u9605\u53cb\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u661f\u7a7a\u5c0f\u8bf4')\",\n            'name': '\u661f\u7a7a\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u5168\u514d\u6f2b\u753b')\",\n            'name': '\u5168\u514d\u6f2b\u753b',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('365\u5c0f\u8bf4')\",\n            'name': '365\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u798f\u5229\u6f2b\u753b')\",\n            'name': '\u798f\u5229\u6f2b\u753b',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u4e07\u76f8\u4e66\u57ce')\",\n            'name': '\u4e07\u76f8\u4e66\u57ce',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u72ec\u6b65\u5c0f\u8bf4')\",\n            'name': '\u72ec\u6b65\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u94c5\u7b14\u8f7b\u5c0f\u8bf4')\",\n            'name': '\u94c5\u7b14\u8f7b\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u6ca7\u5143\u56fe')\",\n            'name': '\u6ca7\u5143\u56fe',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u5168\u672c\u540c\u4eba')\",\n            'name': '\u5168\u672c\u540c\u4eba',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n             'action': \"set_source('\u6bd2\u820c\u5f71\u89c6')\",\n            'name': '\u6bd2\u820c\u5f71\u89c6',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n        \"name\": \"\u81ea\u5b9a\u4e49\u641c\u7d22\u6e90(\u591a\u4e2a\u7528\u82f1\u6587,\u5206\u5272)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u542c\u4e66Ai\u97f3\u8272\u586b\u5199\u540e\u70b9\u51fb\u53f3\u4e0a\u89d2\u2714\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u81ea\u5b9a\u4e49\u670d\u52a1\u5668(\u53ef\u4e0d\u586b)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u81ea\u5b9a\u4e49\u8bc4\u8bba\u989c\u8272(\u53ef\u4e0d\u586b)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u6bb5\u8bc4\u6c14\u6ce1\u6837\u5f0f(0-4)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)\",\n        \"type\": \"text\"\n    }\n]","loginUrl":"\/\/ \u5f53\u524d\u4e66\u6e90\u7248\u672c\u53f7\uff0c\u5207\u52ff\u4fee\u6539\uff0c\u5426\u5219\u5f71\u54cd\u66f4\u65b0\u7684\u8bc6\u522b\nconst localVersion = '4.12.3';\n\nfunction login(flag) {\n    if (flag == undefined) {\n        result = JSON.parse(source.getLoginInfo())\n    } else {\n        java.longToast(\"\\n\\n\ud83d\udc9e\u6b63\u5728\u767b\u5f55\u4e2d...\")\n        putLoginInfo(JSON.stringify(result))\n    }\n    let base_url = getArgument('server')\n    let zdyserver = String(result['\u81ea\u5b9a\u4e49\u670d\u52a1\u5668(\u53ef\u4e0d\u586b)']);\n    if (zdyserver.includes('http')) {\n        setArgument('server', zdyserver);\n        if (getKey(String(cookie.getCookie(base_url)))) {\n            let cookies = cookie.getCookie(base_url)\ntry{cookie.removeCookie(base_url)} catch(e){}\n            cookie.setCookie(zdyserver, cookies)\n        }\n        java.toast(`\\n\\n\u5f53\u524d\u670d\u52a1\u5668\u4e3a\u81ea\u5b9a\u4e49\u670d\u52a1\u5668\\n${zdyserver}\\n\\n\u5207\u6362\u670d\u52a1\u5668\u8bf7\u5148\u6e05\u7a7a\u670d\u52a1\u5668\u5730\u5740\u4e2d\u7684\u6570\u636e`);\n    }\n    let zdytone_id = String(result['\u542c\u4e66Ai\u97f3\u8272\u586b\u5199\u540e\u70b9\u51fb\u53f3\u4e0a\u89d2\u2714'] || '');\n    if (zdytone_id) {\n        setArgument('tone_id', zdytone_id);\n    } else {\n        setArgument('tone_id', '\u9ed8\u8ba4\u97f3\u8272');\n    }\n    let plcolor = String(result['\u81ea\u5b9a\u4e49\u8bc4\u8bba\u989c\u8272(\u53ef\u4e0d\u586b)'] || '#000000');\n    if (plcolor) {\n        setArgument('plcolor', plcolor);\n    } else {\n        setArgument('plcolor', '#000000');\n    }\n    let zdysources = String(result['\u81ea\u5b9a\u4e49\u641c\u7d22\u6e90(\u591a\u4e2a\u7528\u82f1\u6587,\u5206\u5272)'] || '');\n    if (zdysources) {\n        setArgument('source', zdysources);\n    };\n    base_url = getArgument('server')\n    let register_email = String(result['\u90ae\u7bb1'])\n    let password = String(result['\u5bc6\u7801'])\n    let key = String(result['\u5bc6\u94a5'] || '')\n\n    \/\/java.log(cookie.getCookie(base_url))\n    if ((register_email && password || key) && !String(getKey(String(cookie.getCookie(base_url))))) {\n        try{cookie.removeCookie(base_url)} catch(e){}\n        let deviceKey = '';\n        try {\n            deviceKey = java.deviceID();\n        } catch (e) {\n            deviceKey = java.androidId();\n        };\n        let deviceId = deviceKey;\n        if (register_email && password) {\n            let options = JSON.stringify({\n                method: 'POST',\n                headers: {\n                    'Content-Type': 'application\/json'\n                },\n                body: JSON.stringify({\n                    register_email: result['\u90ae\u7bb1'],\n                    password: result['\u5bc6\u7801']\n                })\n            })\n            try {\n                let data = JSON.parse(java.ajax(`${base_url}\/login_api,${options}`))\n                if (data.code == 0) {\n                    \/\/java.toast(deviceId)\n                    java.toast(\"\\n\\n\u2705\ufe0f\u767b\u5f55\u6210\u529f\")\n                    cookie.setCookie(base_url, `qttoken=${data.key};deviceId=${deviceId}`)\n                    result['\u5bc6\u94a5'] = data.key\n                    putLoginInfo(JSON.stringify(result))\n                } else {\n                    java.toast('\\n\\n\ud83d\udc94' + data.msg || \"\u767b\u5f55\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5\uff01\")\n                }\n            } catch (e) {\n                java.toast(\"\\n\\n\ud83d\udc94\u767b\u5f55\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5\uff01\\n\" + e.message)\n            }\n        } else {\n            cookie.setCookie(base_url, `qttoken=${key};deviceId=${deviceId}`)\n            let res = java.ajax(`${base_url}\/user_api,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n            try {\n                res = JSON.parse(res)\n                if (res.id != undefined) {\n                    java.toast('\\n\\n\u5bc6\u94a5\u767b\u5f55\u6210\u529f')\n                    result['\u90ae\u7bb1'] = res.email\n                    putLoginInfo(JSON.stringify(result))\n                } else {\n                    throw new Error()\n                }\n            } catch (e) {\n                java.log(e)\n                java.toast(\"\\n\\n\ud83d\udc94\u767b\u5f55\u5931\u8d25\")\n            }\n        }\n    } else if (flag && String(getKey(String(cookie.getCookie(base_url))))) {\n        java.toast(\"\\n\\n\u5f53\u524d\u2705\ufe0f\u5df2\u767b\u5f55\uff0c\u8bf7\ud83d\udeab\u9000\u51fa\u767b\u5f55\u540e\u91cd\u65b0\u767b\u5f55\");\n        \/\/checkStatus();\n    } else if (flag) {\n        java.toast(\"\\n\\n\u26d4\ufe0f\u8bf7\u5148\u586b\u5199\u90ae\u7bb1\u548c\u5bc6\u7801\");\n    }\n}\n\n\/\/ \u68c0\u6d4b\u670d\u52a1\u5668\nfunction checkNet() {\n    let url = getArgument('server');\n    java.longToast(`\\n\\n\u267b\ufe0f\u6b63\u5728\u68c0\u6d4b\uff1a${url}\\n\u8bf7\u7a0d\u7b49~`);\n    let date1 = new Date().getTime();\n    let html = java.ajax(url + '\/login');\n    let date2 = new Date().getTime();\n    let t = date2 - date1;\n    let c = String(html).indexOf('\u5927\u7070\u72fc');\n    let code = 1;\n    let time = t \/ 1000 + 's';\n    let logTime = '\u3010' + url + '\u3011\\n\u250b\u250b\\n' + '\u89e3\u6790\u65f6\u95f4\uff1a' + time;\n    if (c == -1 || t > 5000) {\n        java.longToast('\\n\ud83d\udc94\u3010\u8bbf\u95ee\u5931\u8d25\u63d0\u793a\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2663\ufe0f\u5f53\u524d\u63a5\u53e3\u65e0\u6cd5\u8bbf\u95ee(\u53ef\u80fd\u88ab\u5899)\u2663\ufe0f\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\/\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    } else if (t < 1000) {\n        java.longToast('\\n\ud83d\udc96\u3010\u7f51\u7edc\u73af\u5883\u4f18\u826f\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2764\ufe0f\u5ef6\u8fdf\u4f4e\uff0c\u63a8\u8350\u4f7f\u7528\u6b64\u63a5\u53e3\u2764\ufe0f\\n\u250b\u250b\\n\u7f51\u7edc\u73af\u5883\u4f18\u826f\uff0c\u8bf7\u7ee7\u7eed\u4fdd\u6301\u72b6\u6001\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    } else if (t >= 1000 && t < 2000) {\n        java.longToast('\\n\ud83d\udc9b\u3010\u7f51\u7edc\u73af\u5883\u4e00\u822c\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2666\ufe0f\u5ef6\u8fdf\u4e00\u822c\uff0c\u52c9\u5f3a\u53ef\u4f7f\u7528\u2666\ufe0f\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\u6216\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    } else if (t >= 2000 && t < 5000) {\n        java.longToast('\\n\ud83d\udc94\u3010\u7f51\u7edc\u73af\u5883\u582a\u5fe7\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2660\u5ef6\u8fdf\u8fc7\u9ad8\uff0c\u4e0d\u5efa\u8bae\u4f7f\u7528\u2660\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\u6216\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    }\n}\n\nfunction isVips(res) {\n    let isVIP = '';\n    let vipEndTime = res.vip_end_time;\n    let formattedDate = '';\n\n    if (vipEndTime && vipEndTime !== 0) {\n        let date = new Date(vipEndTime * 1000);\n        formattedDate = `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`;\n        let currentTime = Math.floor(Date.now() \/ 1000);\n        let remainingDays = Math.ceil((vipEndTime - currentTime) \/ (24 * 60 * 60));\n        if (currentTime > vipEndTime) {\n            isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} (\u5df2\u8fc7\u671f)`;\n        } else if (remainingDays <= 7) {\n            isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} \u5269\u4f59${remainingDays}\u5929`;\n        } else {\n            if (vipEndTime < 1912946812) {\n                isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"}(${formattedDate})`;\n            } else {\n                isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} (\u6c38\u4e45)`;\n            }\n        }\n    } else {\n        isVIP = '\u60a8\u5c1a\u672a\u5f00\u901aVIP';\n    }\n    return isVIP;\n}\n\nfunction checkStatus() {\n    java.longToast('\\n\\n\u267b\ufe0f\u68c0\u6d4b\u4e2d...');\n    let base_url = getArgument('server')\n    let res = java.ajax(`${base_url}\/user_api,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n    try {\n        res = JSON.parse(res)\n        if (res.id != undefined) {\n            result['\u90ae\u7bb1'] = res.email\n            putLoginInfo(JSON.stringify(result))\n            let devices\n            try {\n                devices = JSON.parse(res.device).length;\n            } catch (e) {\n                devices = res.device ? 1 : 0;\n            }\n            let isVip = isVips(res);\n            tips = `\n\u250f\u2505\u2505\u2505\u2505\u2505\u2505\u2531\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2510\n\u3000 \ud83e\udde2\u6635\u79f0 \u3000\u3000\u3000\u3000${res.nickname.padEnd(20,\"\\t\") || \"\u672a\u8bbe\u7f6e\".padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\u2709\ufe0f\u90ae\u7bb1\u3000\u3000\u3000\u3000${res.email.replace(\/(.{3}).*?@\/,\"$1***@\").padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udd11\u5bc6\u94a5\u3000\u3000\u3000\u3000${(`${res.user_key.substring(0,4)}***${res.user_key.slice(-4)}`).padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udcc5\u6ce8\u518c\u65f6\u95f4\u3000\u3000${java.timeFormat(res.register_time*1000).padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\uddd2\ufe0f\u4eca\u65e5\u9605\u8bfb\u3000\u3000${(java.timeFormat(new Date()).slice(0,10)==java.timeFormat(res.last_read_time * 1000).slice(0,10)?res.day_read_count:0).toString().padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udcda\u7d2f\u8ba1\u9605\u8bfb\u3000\u3000${res.all_read_count.toString().padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udd53\u6700\u540e\u9605\u8bfb\u3000\u3000${(res.last_read_time != 0?java.timeFormat(res.last_read_time * 1000):'\u672a\u9605\u8bfb').padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udcf1\u5173\u8054\u8bbe\u5907\u3000\u3000${devices.toString().padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udc51\u4f1a\u5458\u72b6\u6001\u3000\u3000${isVip.padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udeab\u5c01\u7981\u72b6\u6001\u3000\u3000${res.is_banned?'\u5df2\u5c01\u7981':'\u6b63\u5e38\u3000'}\u3000\u3000\u3000\u3000\u3000\u3000\u3000\n\u2517\u2505\u2505\u2505\u2505\u2505\u2505\u2539\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2518\n`\n            java.log(tips)\n            java.longToast(tips)\n        } else {\n            throw new Error(res.msg)\n        }\n    } catch (e) {\n        \/\/java.log(e)\n        java.toast(\"\\n\u68c0\u6d4b\u767b\u5f55\u5931\u8d25\\n\" + e.message)\n    }\n}\n\nfunction clearDevice() {\n    let base_url = getArgument('server')\n    let res = java.ajax(`${base_url}\/clear,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n    java.toast(res.code === 0 ? \"\\n\\n\ud83d\udcf4\u8bbe\u5907\u6e05\u9664\u6210\u529f\" : res.msg)\n    Packages.java.lang.Thread.sleep(500)\n    checkStatus()\n}\n\/\/ \u4fdd\u5b58\u767b\u5f55UI\u4fe1\u606f\nfunction putLoginInfo(info) {\n    try {\n        let key = java.androidId()\n        let encodeStr = Packages.android.util.Base64.encodeToString(java.createSymmetricCrypto(\"AES\", key).encrypt(info), 2)\n        cache.put(`userInfo_${source.getKey()}`, encodeStr)\n        return true\n    } catch (e) {\n        java.log(e)\n        return source.putLoginInfo(info)\n    }\n}\n\n\/\/ \u7528\u6237\u540e\u53f0\nfunction loginqt() {\n\t   let base_url = getArgument('server');\n\t   let ck = String(cookie.getKey(base_url, \"qttoken\"));\n\t   if (!ck) {\n\t   \tjava.longToast('\\n\\n\ud83d\udeab\u8bf7\u5148\u767b\u5f55!')\n\t   \t} else {\n\t   \t\tjava.startBrowserAwait(getArgument('server') + '\/user', '\u5927\u7070\u72fc\u5c0f\u8bf4\u540e\u53f0');\n\t   \t\t}\n    }\n\n\/\/ \u7528\u6237\u6ce8\u518c\nfunction register() {\n\t   let base_url = getArgument('server');\n\t   \tjava.startBrowserAwait(getArgument('server') + '\/register', '\u5927\u7070\u72fc\u5c0f\u8bf4\u6ce8\u518c');\n    }\n\n\/\/\u767b\u5f55\u756a\u8304\nfunction fq_login() {\n    try {\n        java.startBrowserAwait(\"https:\/\/fanqienovel.com\/\", \"\u767b\u5f55\")\n    } catch (e) {\n        java.toast(e)\n    }\n    try {\n        cookie.removeCookie(\"snssdk.com\")\n    } catch (e) {}\n    var cookie_ = \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : source.getLoginInfoMap()['\u624b\u52a8\u767b\u5f55Token'])\n    let user\n    try {\n        user = JSON.parse(java.ajax(\"https:\/\/fanqienovel.com\/api\/user\/info\/v2,\" + JSON.stringify({\n            method: \"GET\",\n            headers: {\n                \"Cookie\": cookie_\n            }\n        }))).data.name\n    } catch (e) {\n        java.log(e)\n    }\n    if (!cookie_ || cookie_ == \"sessionid=\" || !user) {\n        java.toast(\"\u672a\u83b7\u53d6\u5230\u767b\u5f55\u51ed\u636e\uff0c\u767b\u5f55\u5931\u8d25\")\n        return false\n    }\n    java.toast(\"\\n\\n\u6b22\u8fce \" + user + \"\\n\u767b\u5f55\u6210\u529f\uff01\")\n    return true\n}\n\n\/\/\u9000\u51fa\u767b\u5f55\nfunction logout() {\n    cookie.removeCookie(\"fanqienovel.com\");\n    cookie.removeCookie(\"snssdk.com\");\n    cookie.removeCookie(\"69shuba.com\");\n    \/*\n    let servers = host\n    for (let server of servers) {\n    \ttry{removeCookie(server )} catch(e){cookie.removeCookie(server )}\n    }\n    *\/\ntry{cookie.removeCookie(getArgument('server'))} catch(e){}\n    java.toast(\"\u9000\u51fa\u767b\u5f55\u6210\u529f\");\n}\n\n\/\/\u83b7\u53d6\u53c2\u6570\nfunction getArgument(key) {\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    return open_argument[key];\n}\n\n\/\/\u8bbe\u7f6e\u53c2\u6570\nfunction setArgument(key, value) {\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    open_argument[key] = value;\n    open_argument = JSON.stringify(open_argument);\n    source.setVariable(open_argument);\n    return open_argument;\n}\n\n\/\/ \u8bbe\u7f6e\u672c\u5730or\u4e91\u7aef\u8bbf\u95ee\nfunction get_proxy() {\n    let proxy = getArgument('proxy');\n    if (proxy == '\u672c\u5730') {\n        setArgument('proxy', '\u4e91\u7aef');\n        java.longToast('\\n\u6240\u6709\u6570\u636e\u91c7\u7528\\n\\n\u670d\u52a1\u5668\u7f51\u7edc\u8bbf\u95ee\\n\\n\u5982\u679c\u53d1\u73b0\u7528\u4e0d\u4e86\uff0c\u8bf7\u5207\u6362\u672c\u5730\u7f51\u7edc\u8bbf\u95ee\uff0c\u598269\u4e66\u5427');\n    } else {\n        setArgument('proxy', '\u672c\u5730');\n        java.longToast('\\n\u6240\u6709\u6570\u636e\u91c7\u7528\\n\\n\u672c\u5730\u7f51\u7edc\u8bbf\u95ee\\n\\n\u5982\u679c\u53d1\u73b0\u7528\u4e0d\u4e86\uff0c\u8bf7\u5f00\u542f\u7f51\u7edc\u4ee3\u7406\uff0c\u598269\u4e66\u5427');\n    }\n}\n\n\n\/\/\u8bbe\u7f6e\u7537\u5973\u9891\nfunction set_source_type() {\n    let source_type = getArgument(\"source_type\");\n    if (source_type == '\u5973\u9891') {\n        setArgument(\"source_type\", '\u7537\u9891');\n    java.toast(\"\\n\u53d1\u73b0\u9875\u5df2\u8bbe\u7f6e\u4e3a:\ud83d\ude4b\u200d\u2642\ufe0f\u7537\u9891\" );\n    } else {\n        setArgument(\"source_type\", '\u5973\u9891');\n    java.toast(\"\\n\u53d1\u73b0\u9875\u5df2\u8bbe\u7f6e\u4e3a:\ud83d\ude4b\u200d\u2640\ufe0f\u5973\u9891\" );\n    }\n    \n}\n\nfunction set_reading() {\n\tlet reading = getArgument(\"reading\");\n    if (reading == '1') {\n        setArgument(\"reading\", '0');\n    java.toast(\"\\n\\n\u5927\u7070\u72fc\u4e66\u67b6\u8bb0\u5f55\u540c\u6b65\u5df2\u5173\u95ed\uff01\" );\n    } else {\n        setArgument(\"reading\", '1');\n    java.longToast(\"\\n\\n\u5927\u7070\u72fc\u4e66\u67b6\u8bb0\u5f55\u540c\u6b65\u5df2\u5f00\u542f\uff01\\n\u5237\u65b0\u9605\u8bfb\u4e66\u67b6\u5373\u53ef\u5c06\u4e66\u67b6\u4e66\u7c4d\u540c\u6b65\u5230\u5927\u7070\u72fc\u4e66\u67b6\uff01\" );\n    }\n\n\t}\n\n\/\/\u9996\u9875\nfunction api() {\n    java.startBrowserAwait('http:\/\/fb.langge.cf', \"\u9996\u9875\");\n}\n\n\/\/\u6253\u8d4f\nfunction vip() {\n\t    let base_url = getArgument('server');\n\t   let ck = String(cookie.getKey(base_url, \"qttoken\"));\n\t   if (!ck) {\n\t   \tjava.longToast('\\n\\n\ud83d\udeab\u8bf7\u5148\u767b\u5f55!')\n\t   \t} else {\n\t   \t\tjava.startBrowserAwait(getArgument('server') + '\/coffee', '\u5927\u7070\u72fc\u5c0f\u8bf4\u4f1a\u5458\u5f00\u901a');\n\t   \t\t}\n    }\n\nvar server = getArgument('server');\n\n\/\/\u8bbe\u7f6e\u641c\u7d22\u5a92\u4f53\nfunction set_media(media) {\n    const mediaConfig = {\n        '\u559c\u9a6c\u62c9\u96c5': ['\u542c\u4e66'],\n        '\u756a\u8304': '*',\n        '\u798f\u5229\u5c0f\u8bf4':['\u5c0f\u8bf4'],\n        '\u5168\u514d\u6f2b\u753b':['\u6f2b\u753b'],\n        '\u5305\u5b50\u6f2b\u753b':['\u6f2b\u753b'],\n        '\u6f2b\u753b\u7f51':['\u6f2b\u753b'],\n        '\u98ce\u8f66\u6f2b\u753b':['\u6f2b\u753b'],\n        '\u798f\u5229\u6f2b\u753b':['\u6f2b\u753b'],\n        '\u597d\u770b\u6f2b\u753b':['\u6f2b\u753b'],\n        '\u9177\u6211':['\u542c\u4e66'],\n        '\u6d77\u6d0b\u542c\u4e66':['\u542c\u4e66'],\n        '\u4e03\u732b': ['\u5c0f\u8bf4', '\u542c\u4e66'],\n        '\u6cb3\u9a6c': ['\u77ed\u5267'],\n        '\u8d85\u4f1a\u4e13\u5c5e\u77ed\u5267': ['\u77ed\u5267'],\n        '\u6b6a\u745e\u53e4\u5fb7': ['\u6f2b\u753b'],\n        '\u6bd2\u820c\u5f71\u89c6':['\u77ed\u5267'],\n        '\u5168\u90e8': '*', \/\/ \u5141\u8bb8\u6240\u6709\u6a21\u5f0f\n        '\u9ed8\u8ba4': ['\u5c0f\u8bf4']\n    };\n\n    const source = getArgument('source');\n    const allowedModes = mediaConfig[source] || mediaConfig['\u9ed8\u8ba4'];\n    let targetMedia = mediaConfig['\u9ed8\u8ba4'][0];\n    let isAllowed = false;\n\n    if (allowedModes === '*' || allowedModes.includes(media)) {\n        targetMedia = media;\n        isAllowed = true;\n    } else if (Array.isArray(allowedModes)) {\n        targetMedia = allowedModes[0];\n    }\n\n    const message = isAllowed ?\n        `\\n\\n\u5df2\u5207\u6362\u81f3\uff1a${targetMedia}\\n\u8bf7\u91cd\u65b0\u641c\u7d22\u4e66\u7c4d\uff01` :\n        `\\n\\n\u76ee\u524d${source}\uff1a\u4e0d\u652f\u6301\u3010${media}\u3011\u6a21\u5f0f\uff01\\n\u5df2\u81ea\u52a8\u5207\u6362\u81f3\uff1a${targetMedia}`;\n\n    setArgument('media', targetMedia);\n    java.toast(message);\n}\n\n\/\/\u83b7\u53d6\u641c\u7d22\u5a92\u4f53\nfunction get_media() {\n    let media = getArgument('media');\n    let source = getArgument('source');\n    if (media == '') {\n        media = '\u5168\u90e8';\n    }\n    var tishi = '\\n\\n\u5f53\u524d\u670d\u52a1\u5668\uff1a' + getArgument('server')\n    java.longToast(`\\n\\n\u5f53\u524d\u4f7f\u7528\u6e90\uff1a${source}-${media}${tishi}`);\n}\n\n\n\/\/\u8bbe\u7f6e\u670d\u52a1\u5668\nfunction set_server() {\n    putLoginInfo(JSON.stringify(result))\n    let zdyserver;\n    let base_url = getArgument('server')\n    try {\n        zdyserver = String(result['\u81ea\u5b9a\u4e49\u670d\u52a1\u5668(\u53ef\u4e0d\u586b)']);\n        if (zdyserver.includes('http')) {\n            setArgument('server', zdyserver);\n            if (getKey(String(cookie.getCookie(base_url)))) {\n                let cookies = cookie.getCookie(base_url)\n                try{cookie.removeCookie(base_url)} catch(e){}\n                cookie.setCookie(zdyserver, cookies)\n            }\n            java.toast(`\\n\\n\u5f53\u524d\u670d\u52a1\u5668\u4e3a\u81ea\u5b9a\u4e49\u670d\u52a1\u5668\\n${zdyserver}\\n\\n\u5207\u6362\u670d\u52a1\u5668\u8bf7\u5148\u6e05\u7a7a\u670d\u52a1\u5668\u5730\u5740\u4e2d\u7684\u6570\u636e`);\n        } else {\n            zdyserver = '';\n        }\n    } catch (error) {\n        zdyserver = '';\n    }\n    if (!zdyserver) {\n        const servers = host\n        const currentServer = getArgument('server') || '';\n        const currentIndex = servers.indexOf(currentServer);\n\n        const nextIndex = currentIndex >= 0 ? (currentIndex + 1) % servers.length : 0;\n        const nextServer = servers[nextIndex];\n\n        setArgument('server', nextServer);\n        if (getKey(String(cookie.getCookie(currentServer)))) {\n            let cookies = cookie.getCookie(currentServer)\ntry{cookie.removeCookie(currentServer)} catch(e){}\n            cookie.setCookie(nextServer, cookies)\n        }\n        java.longToast(`\\n\\n\u670d\u52a1\u5668\u3010${nextIndex+1}\u3011\uff1a${nextServer}`);\n    }\n}\n\n\/\/\u83b7\u53d6\u97f3\u8272\nvar tone_id = getArgument('tone_id');\n\nfunction get_tone_id(arg) {\n    var datadist = {\n        \"0\": \"\u9ed8\u8ba4\u97f3\u8272\",\n        \"-1\": \"\u9605\u8bfb\u6a21\u5f0f\",\n        \"-2\": \"\u6f2b\u753b\u6a21\u5f0f\",\n        \"51\": \"\u591a\u4eba\u53d1\u97f3\",\n        \"1\": \"\u751c\u7f8e\u5c11\u5973\",\n        \"2\": \"\u6e05\u4eae\u9752\u53d4\",\n        \"5\": \"\u5f00\u6717\u9752\u5e74\",\n        \"6\": \"\u6e29\u67d4\u6dd1\u5973\",\n        \"4\": \"\u6210\u719f\u5927\u53d4\",\n        \"74\": \"\u5927\u53d4\u5347\u7ea7\",\n        \"30\": \"\u4f18\u96c5\u5fa1\u59d0\"\n    };\n    var tone_id = datadist[arg] || arg;\n    var tishi = '\\n\\n\u5f53\u524d\u97f3\u8272\uff1a' + tone_id;\n    java.toast(tishi);\n}\n\n\/\/\u8bbe\u7f6e\u97f3\u8272\nfunction set_tone_id(mode, name) {\n    putLoginInfo(JSON.stringify(result))\n    let zdytone_id;\n    try {\n        zdytone_id = String(result['\u5176\u4ed6\u97f3\u8272\u586b\u5199\u540e\u70b9\u51fb\u53f3\u4e0a\u89d2\u2714']);\n        if (zdytone_id) {\n            setArgument('tone_id', zdytone_id);\n            java.toast(`\\n\\n\u5f53\u524d\u97f3\u8272\u4e3a\u81ea\u5b9a\u4e49\u97f3\u8272\\n${zdytone_id}\\n\\n\u5207\u6362\u97f3\u8272\u8bf7\u5148\u6e05\u7a7a\u97f3\u8272\u8f93\u5165\u6846\u4e2d\u7684\u6570\u636e`);\n        } else {\n            zdytone_id = '';\n        }\n    } catch (error) {\n        zdytone_id = '';\n    }\n    if (!zdytone_id) {\n        let toast = \"\\n\\n\u5df2\u5207\u6362\u81f3\uff1a\" + name + '\\n\\n\u5207\u6362\u540e\u9700\u8981\u5237\u65b0\u8be6\u60c5\u9875';\n        setArgument('tone_id', mode);\n        java.toast(toast);\n    }\n}\n\n\/\/\u8bbe\u7f6e\u6765\u6e90\nfunction set_source(sources) {\n    let zdysources = String(result['\u81ea\u5b9a\u4e49\u641c\u7d22\u6e90(\u591a\u4e2a\u7528\u82f1\u6587,\u5206\u5272)'] || '');\n    if (zdysources.length > 1 && zdysources != 'undefined') {\n        java.toast('\\n\\n\u8bf7\u5148\u6e05\u7a7a\u81ea\u5b9a\u4e49\u6e90\u518d\u8bbe\u7f6e');\n    } else {\n        setArgument('source', sources);\n        set_media('\u5c0f\u8bf4');\n        java.toast(`\\n\\n\u5f53\u524d\u6765\u6e90\u5df2\u5207\u6362\u4e3a:\\n${sources}\\n\\n\u5207\u6362\u540e\u8bf7\u91cd\u65b0\u641c\u7d22`);\n    }\n}\n\n\/\/ \u8bbe\u7f6e\u7b80\u4ecb\nfunction set_info() {\n    var info = getArgument('info');\n    if (info == 'on') {\n        setArgument('info', 'off');\n        java.toast('\\n\\n\u5df2\u6062\u590d\u8be6\u60c5\u9875\u8be6\u7ec6\u7b80\u4ecb');\n    } else {\n        setArgument('info', 'on');\n        java.toast('\\n\\n\u5df2\u7cbe\u7b80\u8be6\u60c5\u9875\u7b80\u4ecb');\n    }\n}\n\n\/\/ \u756a\u8304\u6bb5\u8bc4\nfunction paracomment() {\n    var fqpara = getArgument('fqpara');\n    if (fqpara == 'on') {\n        setArgument('fqpara', 'off');\n        java.longToast('\\n\\n\u6bb5\u8bc4\u5df2\u5173\u95ed');\n    } else {\n        setArgument('fqpara', 'on');\n        java.longToast(\"\\n\\n\u6bb5\u8bc4\u5df2\u5f00\u542f\\n\\n\u957f\u6309\u5237\u65b0\u6bb5\u540e\u9762\u7684\u56fe\u7247\u5373\u53ef\\n\\n\u5982\u679c\u56fe\u7247\u4e0d\u663e\u793a\uff0c\u5237\u65b0\u65e0\u53cd\u5e94\\n\u8bf7\u66f4\u65b0\u6d4b\u8bd5\u7248\u9605\u8bfbapp\");\n    }\n}\n\n\/\/ \u5f3a\u5236\u641c\u7d22\u88ab\u7981\u7528\u7684\u6e90\nfunction disabledSources() {\n    var disabled_sources = getArgument('disabled_sources');\n    if (disabled_sources == '1') {\n        setArgument('disabled_sources', '0');\n        java.longToast('\\n\\n\u5f3a\u5236\u641c\u7d22\u7981\u7528\u7684\u6e90\u5df2\u5173\u95ed');\n    } else {\n        setArgument('disabled_sources', '1');\n        setArgument('source', '\u5168\u90e8');\n        java.longToast(\"\\n\\n\u5f3a\u5236\u641c\u7d22\u7981\u7528\u7684\u6e90\u5df2\u5f00\u542f\\n\\n\u6ce8\u610f\uff1a\u5f00\u542f\u540e\u641c\u7d22\u65f6\u95f4\u4f1a\u53d8\u957f\uff01\");\n    }\n}\n\n\/\/ \u6211\u8981\u63a8\u8350\nfunction put_book() {\n    java.startBrowserAwait(getArgument('server') + '\/put_book', '\u6211\u6765\u63a8\u8350');\n}\n\n\/\/ \u4e66\u6e90\u66f4\u65b0\nfunction renderVersionPage() {\n    let yd = '';\n    let html = `\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n  <meta charset=\"UTF-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\n  <title>\u4e66\u6e90\u66f4\u65b0<\/title>\n  <!-- Font Awesome \u56fe\u6807\u5e93 -->\n  <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.4.0\/css\/all.min.css\" \/>\n  <style>\n    :root {\n      --primary-gradient: linear-gradient(135deg, #4e6ef2, #6b2dd8);\n      --latest-gradient: linear-gradient(135deg, #8e2de2 0%, #4a00e0 50%, #d4af37 100%);\n      --success-color: #28c76f;\n      --warning-color: #ff9f43;\n      --error-color: #ea5455;\n      --text-main: #1f2937;\n      --text-secondary: #6b7280;\n      --card-bg: #ffffff;\n      --border-color: #e5e7eb;\n      --light-bg: #f9fafb;\n      --shadow: 0 4px 12px rgba(78, 110, 242, 0.1);\n      --shadow-hover: 0 6px 18px rgba(78, 110, 242, 0.2);\n      --glow-shadow: 0 0 25px rgba(142, 45, 226, 0.5), 0 0 50px rgba(212, 175, 55, 0.3);\n      --modal-bg: rgba(31, 41, 55, 0.8);\n      --modal-content-bg: #ffffff;\n    }\n\n    * {\n      box-sizing: border-box;\n      margin: 0;\n      padding: 0;\n      font-family: 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;\n    }\n\n    body {\n      background: linear-gradient(135deg, #eef2ff, #f5f7ff);\n      color: var(--text-main);\n      min-height: 100vh;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      padding: 16px;\n    }\n\n    \/* \u52a0\u8f7d\u52a8\u753b *\/\n    .loading-wrapper {\n      text-align: center;\n      animation: fadeIn 0.3s ease;\n    }\n\n    .loading-spinner {\n      width: 50px;\n      height: 50px;\n      border: 4px solid rgba(78, 110, 242, 0.3);\n      border-top-color: #4e6ef2;\n      border-radius: 50%;\n      margin: 0 auto 20px;\n      animation: spin 1s linear infinite;\n    }\n\n    .loading-text {\n      color: var(--text-main);\n      font-size: 16px;\n      font-weight: 500;\n    }\n\n    @keyframes spin {\n      to { transform: rotate(360deg); }\n    }\n\n    @keyframes fadeIn {\n      from { opacity: 0; transform: translateY(20px); }\n      to { opacity: 1; transform: translateY(0); }\n    }\n\n    @keyframes slideIn {\n      from { opacity: 0; transform: translateY(30px); }\n      to { opacity: 1; transform: translateY(0); }\n    }\n\n    @keyframes pulse {\n      0%, 100% { opacity: 1; }\n      50% { opacity: 0.7; }\n    }\n\n    @keyframes gradientAnimation {\n      0% { background-position: 0% 50%; }\n      50% { background-position: 100% 50%; }\n      100% { background-position: 0% 50%; }\n    }\n\n    @keyframes breathe {\n      0%, 100% { \n        transform: scale(1);\n        box-shadow: var(--glow-shadow), var(--shadow);\n      }\n      50% { \n        transform: scale(1.02);\n        box-shadow: 0 0 30px rgba(142, 45, 226, 0.6), 0 0 60px rgba(212, 175, 55, 0.4), var(--shadow);\n      }\n    }\n\n    @keyframes shimmer {\n      0% {\n        background-position: -200% center;\n      }\n      100% {\n        background-position: 200% center;\n      }\n    }\n\n    \/* \u4e3b\u5bb9\u5668 *\/\n    .container {\n      width: 100%;\n      max-width: 420px;\n      background: var(--card-bg);\n      border-radius: 24px;\n      overflow: hidden;\n      box-shadow: var(--shadow);\n      position: relative;\n      z-index: 1;\n      animation: slideIn 0.5s ease;\n      display: none;\n    }\n\n    \/* \u5934\u90e8 *\/\n    .header {\n      background: var(--primary-gradient);\n      color: #ffffff;\n      padding: 24px 16px;\n      text-align: center;\n      position: relative;\n      overflow: hidden;\n    }\n\n    .header::before {\n      content: '';\n      position: absolute;\n      top: -30px;\n      left: -30px;\n      width: 80px;\n      height: 80px;\n      background: rgba(255, 255, 255, 0.15);\n      border-radius: 50%;\n    }\n\n    .header::after {\n      content: '';\n      position: absolute;\n      bottom: -60px;\n      right: -60px;\n      width: 150px;\n      height: 150px;\n      background: rgba(255, 255, 255, 0.1);\n      border-radius: 50%;\n    }\n\n    .header h1 {\n      font-size: 1.4rem;\n      font-weight: 700;\n      margin-bottom: 8px;\n      position: relative;\n      z-index: 2;\n    }\n\n    .header p {\n      font-size: 0.9rem;\n      opacity: 0.9;\n      line-height: 1.4;\n      position: relative;\n      z-index: 2;\n    }\n\n    .header-icon {\n      font-size: 48px;\n      margin-bottom: 10px;\n      display: inline-block;\n      animation: bounce 2s ease infinite;\n    }\n\n    @keyframes bounce {\n      0%, 100% { transform: translateY(0); }\n      50% { transform: translateY(-10px); }\n    }\n\n    \/* \u7248\u672c\u5bf9\u6bd4 *\/\n    .version-comparison {\n      display: flex;\n      flex-wrap: nowrap;\n      gap: 12px;\n      padding: 16px;\n      margin-top: 8px;\n      position: relative;\n      z-index: 10;\n    }\n\n    .version-card {\n      flex: 1;\n      min-width: 45%;\n      background: var(--card-bg);\n      border-radius: 16px;\n      padding: 28px 16px 16px;\n      box-shadow: var(--shadow);\n      text-align: center;\n      position: relative;\n      transition: transform 0.3s ease, box-shadow 0.3s ease;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n    }\n\n    .version-card:hover {\n      transform: translateY(-4px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .version-card.current-version {\n      background: linear-gradient(135deg, #ffffff 0%, #f8f9ff 100%);\n      border: 1px solid rgba(78, 110, 242, 0.15);\n    }\n\n    .version-card.current-version:hover {\n      box-shadow: 0 6px 20px rgba(78, 110, 242, 0.15);\n    }\n\n    .version-card.current-version h3,\n    .version-card.current-version .version-number,\n    .version-card.current-version .version-date {\n      color: var(--text-main);\n    }\n\n    .version-card.latest-version {\n      background: var(--latest-gradient);\n      background-size: 300% 300%;\n      box-shadow: var(--glow-shadow), var(--shadow);\n      color: #fff;\n      z-index: 2;\n      animation: gradientAnimation 6s ease infinite, breathe 3s ease-in-out infinite;\n      position: relative;\n      overflow: hidden;\n    }\n\n    .version-card.latest-version::before {\n      content: '';\n      position: absolute;\n      top: -50%;\n      left: -50%;\n      width: 200%;\n      height: 200%;\n      background: linear-gradient(\n        90deg,\n        transparent,\n        rgba(255, 255, 255, 0.3),\n        transparent\n      );\n      transform: rotate(45deg);\n      animation: shimmer 3s infinite;\n    }\n\n    .version-card.latest-version h3,\n    .version-card.latest-version .version-number,\n    .version-card.latest-version .version-date {\n      color: #fff;\n      text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\n      position: relative;\n      z-index: 1;\n    }\n\n    .version-status {\n      position: absolute;\n      top: 6px;\n      right: 6px;\n      padding: 3px 7px;\n      font-size: 0.65rem;\n      font-weight: 600;\n      border-radius: 6px;\n      color: #fff;\n      line-height: 1.2;\n      white-space: nowrap;\n      z-index: 2;\n    }\n\n    .version-card.latest-version .version-status {\n      background: rgba(255, 255, 255, 0.25);\n      backdrop-filter: blur(5px);\n      border: 1px solid rgba(255, 255, 255, 0.3);\n      color: #fff;\n      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n    }\n\n    .status-outdated { background: var(--warning-color); }\n    .status-latest { background: var(--success-color); }\n    .status-invalid { background: var(--error-color); }\n\n    .version-card h3 {\n      font-size: 0.9rem;\n      color: var(--text-secondary);\n      margin-bottom: 8px;\n      font-weight: 500;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 6px;\n    }\n\n    .version-number {\n      font-size: 1.25rem;\n      font-weight: 700;\n      color: var(--text-main);\n      margin: 8px 0;\n      transition: all 0.3s ease;\n      font-family: 'Courier New', monospace;\n    }\n\n    .version-card.latest-version .version-number {\n      font-size: 1.4rem;\n      transform: scale(1.05);\n      text-shadow: \n        0 2px 4px rgba(0, 0, 0, 0.3),\n        0 0 10px rgba(212, 175, 55, 0.8),\n        0 0 20px rgba(212, 175, 55, 0.5);\n      animation: pulse-glow 2s ease-in-out infinite;\n    }\n\n    @keyframes pulse-glow {\n      0%, 100% {\n        text-shadow: \n          0 2px 4px rgba(0, 0, 0, 0.3),\n          0 0 10px rgba(212, 175, 55, 0.8),\n          0 0 20px rgba(212, 175, 55, 0.5);\n      }\n      50% {\n        text-shadow: \n          0 2px 4px rgba(0, 0, 0, 0.3),\n          0 0 15px rgba(212, 175, 55, 1),\n          0 0 30px rgba(212, 175, 55, 0.7);\n      }\n    }\n\n    .version-date {\n      font-size: 0.8rem;\n      color: var(--text-secondary);\n      margin-top: 4px;\n    }\n\n    \/* \u7248\u672c\u5bf9\u6bd4\u6307\u793a\u5668 *\/\n    .version-indicator {\n      position: absolute;\n      left: 50%;\n      top: 50%;\n      transform: translate(-50%, -50%);\n      z-index: 5;\n      width: 32px;\n      height: 32px;\n      border-radius: 50%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n      color: white;\n    }\n\n    .version-indicator.update-needed {\n      background: var(--error-color);\n      box-shadow: 0 2px 8px rgba(234, 84, 85, 0.4);\n      animation: pulse-indicator 1.5s infinite;\n    }\n\n    .version-indicator.is-latest {\n      background: var(--success-color);\n      box-shadow: 0 2px 8px rgba(40, 199, 111, 0.4);\n    }\n\n    @keyframes pulse-indicator {\n      0% { transform: translate(-50%, -50%) scale(1); }\n      50% { transform: translate(-50%, -50%) scale(1.1); }\n      100% { transform: translate(-50%, -50%) scale(1); }\n    }\n\n    \/* \u5185\u5bb9\u533a *\/\n    .content-container {\n      padding: 16px;\n    }\n\n    \/* \u72b6\u6001\u63d0\u793a *\/\n    .status-alert {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      padding: 12px 16px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 10px;\n      font-weight: 500;\n      font-size: 14px;\n      animation: slideIn 0.5s ease 0.3s backwards;\n    }\n\n    .status-alert i {\n      font-size: 20px;\n    }\n\n    .status-alert.update-available {\n      background: linear-gradient(135deg, #ffeaa7 0%, #fdcb6e 100%);\n      color: #d63031;\n      box-shadow: 0 4px 15px rgba(253, 203, 110, 0.4);\n    }\n\n    .status-alert.up-to-date {\n      background: linear-gradient(135deg, #55efc4 0%, #00b894 100%);\n      color: white;\n      box-shadow: 0 4px 15px rgba(0, 184, 148, 0.4);\n    }\n\n    \/* \u66f4\u65b0\u5bb9\u5668 *\/\n    .update-container {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      animation: slideIn 0.5s ease 0.4s backwards;\n    }\n\n    .update-header {\n      background: var(--light-bg);\n      padding: 12px 16px;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      border-bottom: 1px solid var(--border-color);\n    }\n\n    .update-header h2 {\n      font-size: 1rem;\n      font-weight: 600;\n      color: var(--text-main);\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .update-header h2 i {\n      color: #4e6ef2;\n    }\n\n    .update-tag {\n      background: rgba(78, 110, 242, 0.1);\n      color: #4e6ef2;\n      padding: 4px 8px;\n      border-radius: 8px;\n      font-size: 0.75rem;\n      font-weight: 600;\n    }\n\n    .update-content {\n      padding: 16px;\n    }\n\n    .update-date {\n      font-weight: 600;\n      color: #4e6ef2;\n      margin-bottom: 12px;\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      padding: 8px 0;\n      border-bottom: 1px dashed #e0e0e0;\n    }\n\n    .update-text {\n      margin: 8px 0;\n      position: relative;\n      padding-left: 16px;\n      line-height: 1.5;\n      color: var(--text-main);\n      font-size: 0.95rem;\n      white-space: pre-wrap;\n      word-break: break-word;\n    }\n\n    .update-text::before {\n      content: '\u2022';\n      position: absolute;\n      left: 0;\n      font-weight: bold;\n      color: #4e6ef2;\n      font-size: 1.2rem;\n      line-height: 1;\n    }\n\n    \/* \u5386\u53f2\u65e5\u5fd7 *\/\n    .history-container {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      animation: slideIn 0.5s ease 0.5s backwards;\n    }\n\n    .history-header {\n      background: var(--light-bg);\n      padding: 12px 16px;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      border-bottom: 1px solid var(--border-color);\n      cursor: pointer;\n      user-select: none;\n    }\n\n    .history-header:hover {\n      opacity: 0.8;\n    }\n\n    .history-header h2 {\n      font-size: 1rem;\n      font-weight: 600;\n      color: var(--text-main);\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .history-header h2 i {\n      color: #4e6ef2;\n    }\n\n    .toggle-history {\n      background: none;\n      border: none;\n      color: var(--text-secondary);\n      cursor: pointer;\n      font-weight: 500;\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      font-size: 0.85rem;\n      transition: color 0.2s ease;\n    }\n\n    .toggle-history:hover {\n      color: #4e6ef2;\n    }\n\n    .history-content {\n      padding: 0 16px;\n      max-height: 0;\n      overflow: hidden;\n      transition: max-height 0.4s ease, padding 0.4s ease;\n    }\n\n    .history-content.expanded {\n      max-height: 60vh;\n      overflow-y: auto;\n      padding: 16px;\n      scrollbar-width: thin;\n      scrollbar-color: #4e6ef2 #f0f0f0;\n    }\n\n    .history-content.expanded::-webkit-scrollbar {\n      width: 6px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-track {\n      background: #f0f0f0;\n      border-radius: 4px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-thumb {\n      background: #4e6ef2;\n      border-radius: 4px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-thumb:hover {\n      background: #3a56d0;\n    }\n\n    .history-item {\n      margin-bottom: 16px;\n      padding-bottom: 16px;\n      border-bottom: 1px dashed var(--border-color);\n    }\n\n    .history-item:last-child {\n      border-bottom: none;\n      margin-bottom: 0;\n      padding-bottom: 0;\n    }\n\n    .history-date {\n      font-weight: 600;\n      color: var(--text-main);\n      margin-bottom: 8px;\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      font-size: 0.9rem;\n      background: rgba(78, 110, 242, 0.05);\n      padding: 6px 10px;\n      border-radius: 6px;\n    }\n\n    .history-text {\n      margin: 8px 0;\n      padding-left: 16px;\n      line-height: 1.4;\n      color: var(--text-secondary);\n      position: relative;\n      font-size: 0.9rem;\n      white-space: pre-wrap;\n      word-break: break-word;\n    }\n\n    .history-text::before {\n      content: '\u2022';\n      position: absolute;\n      left: 0;\n      color: #4e6ef2;\n      font-weight: bold;\n      font-size: 1.2rem;\n      line-height: 1;\n    }\n\n    \/* \u6309\u94ae\u7ec4 *\/\n    .button-group {\n      display: flex;\n      flex-direction: column;\n      gap: 10px;\n      margin-bottom: 16px;\n    }\n\n    .button {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 10px;\n      padding: 14px 28px;\n      text-align: center;\n      font-size: 1rem;\n      border: none;\n      border-radius: 12px;\n      text-decoration: none;\n      background: var(--primary-gradient);\n      color: white;\n      font-weight: 600;\n      transition: all 0.3s ease;\n      box-shadow: var(--shadow);\n      position: relative;\n      overflow: hidden;\n      cursor: pointer;\n    }\n\n    .button i {\n      font-size: 1rem;\n    }\n\n    .button::after {\n      content: '';\n      position: absolute;\n      top: -50%;\n      left: -50%;\n      width: 200%;\n      height: 200%;\n      background: rgba(255, 255, 255, 0.1);\n      transform: rotate(30deg);\n      transition: all 0.6s ease;\n      pointer-events: none;\n    }\n\n    .button:hover {\n      transform: translateY(-3px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .button:hover::after {\n      transform: rotate(30deg) translate(20%, 20%);\n    }\n\n    .button:active {\n      transform: scale(0.95);\n    }\n\n    \/* \u9519\u8bef\u72b6\u6001 *\/\n    .error-state {\n      text-align: center;\n      padding: 40px 20px;\n      color: var(--text-main);\n    }\n\n    .error-icon {\n      font-size: 64px;\n      margin-bottom: 20px;\n      color: var(--error-color);\n    }\n\n    .error-text {\n      font-size: 16px;\n      line-height: 1.6;\n      margin-bottom: 20px;\n    }\n\n    .retry-button {\n      background: var(--primary-gradient);\n      color: white;\n      padding: 12px 30px;\n      border-radius: 12px;\n      border: none;\n      font-weight: 600;\n      cursor: pointer;\n      transition: all 0.3s ease;\n      font-size: 14px;\n      box-shadow: var(--shadow);\n    }\n\n    .retry-button:hover {\n      transform: translateY(-2px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .retry-button:active {\n      transform: scale(0.95);\n    }\n\n    \/* \u88c5\u9970\u5143\u7d20 *\/\n    .decoration {\n      position: absolute;\n      z-index: 0;\n      pointer-events: none;\n    }\n\n    .decoration.circle {\n      width: 120px;\n      height: 120px;\n      border-radius: 50%;\n      background: rgba(107, 45, 216, 0.05);\n      top: 10%;\n      left: 10%;\n    }\n\n    .decoration.square {\n      width: 80px;\n      height: 80px;\n      transform: rotate(45deg);\n      background: rgba(78, 110, 242, 0.05);\n      bottom: 10%;\n      right: 10%;\n    }\n\n    \/* \u54cd\u5e94\u5f0f *\/\n    @media (max-width: 768px) {\n      body {\n        padding: 12px;\n      }\n\n      .container {\n        max-width: 100%;\n        border-radius: 20px;\n      }\n\n      .header {\n        padding: 20px 15px;\n      }\n\n      .header h1 {\n        font-size: 1.3rem;\n      }\n\n      .header-icon {\n        font-size: 40px;\n      }\n\n      .version-comparison {\n        flex-direction: row;\n        flex-wrap: nowrap;\n        gap: 10px;\n        padding: 12px;\n        margin-top: 6px;\n        overflow-x: auto;\n      }\n\n      .version-card {\n        min-width: 45%;\n        padding: 26px 12px 12px;\n      }\n\n      \/* \u79fb\u52a8\u7aef\u51cf\u5f31\u547c\u5438\u52a8\u6548 *\/\n      .version-card.latest-version {\n        animation: gradientAnimation 6s ease infinite;\n      }\n\n      .version-status {\n        top: 5px;\n        right: 5px;\n        padding: 2px 5px;\n        font-size: 0.6rem;\n      }\n\n      .version-number {\n        font-size: 1.1rem;\n      }\n\n      .version-card.latest-version .version-number {\n        font-size: 1.2rem;\n      }\n\n      .update-header h2, .history-header h2 {\n        font-size: 0.9rem;\n      }\n\n      .button {\n        padding: 12px 24px;\n        font-size: 0.95rem;\n      }\n\n      .history-content.expanded {\n        max-height: 50vh;\n        -webkit-overflow-scrolling: touch;\n      }\n    }\n\n    @media (max-width: 380px) {\n      .header h1 {\n        font-size: 1.2rem;\n      }\n\n      .version-number {\n        font-size: 1rem;\n      }\n\n      .version-card.latest-version .version-number {\n        font-size: 1.1rem;\n      }\n\n      .button {\n        padding: 11px;\n        font-size: 0.9rem;\n      }\n    }\n  <\/style>\n<\/head>\n<body>\n  <div class=\"decoration circle\"><\/div>\n  <div class=\"decoration square\"><\/div>\n\n  <div id=\"loading\" class=\"loading-wrapper\">\n    <div class=\"loading-spinner\"><\/div>\n    <div class=\"loading-text\"><i class=\"fas fa-search\"><\/i> \u6b63\u5728\u68c0\u67e5\u66f4\u65b0...<\/div>\n  <\/div>\n\n  <div class=\"container\" id=\"container\">\n    <div class=\"header\">\n      <div class=\"header-icon\"><i class=\"fas fa-book\"><\/i><\/div>\n      <h1>\u5927\u7070\u72fc\u4e66\u6e90\u66f4\u65b0<\/h1>\n      <p>\u63a8\u8350\u4f7f\u7528\u9605\u8bfb\u6d4b\u8bd5\u7248<br>\u6b63\u5f0f\u7248\u53ef\u80fd\u5b58\u5728\u517c\u5bb9\u6027\u95ee\u9898<\/p>\n    <\/div>\n\n    <div class=\"version-comparison\">\n      <div class=\"version-card current-version\">\n        <div class=\"version-status status-outdated\" id=\"currentStatus\">\u5f85\u68c0\u67e5<\/div>\n        <h3><i class=\"fas fa-cube\"><\/i> \u5f53\u524d\u7248\u672c<\/h3>\n        <div class=\"version-number\" id=\"currentVersion\">-<\/div>\n        <div class=\"version-date\">\u60a8\u7684\u5f53\u524d\u7248\u672c<\/div>\n      <\/div>\n\n      <div class=\"version-indicator update-needed\" id=\"versionIndicator\" style=\"display: none;\">\n        <i class=\"fas fa-arrow-right\"><\/i>\n      <\/div>\n\n      <div class=\"version-card latest-version\">\n        <div class=\"version-status status-latest\" id=\"latestStatus\">\u6700\u65b0\u7248\u672c<\/div>\n        <h3><i class=\"fas fa-star\"><\/i> \u6700\u65b0\u7248\u672c<\/h3>\n        <div class=\"version-number\" id=\"latestVersion\">-<\/div>\n        <div class=\"version-date\">\u53ef\u7528\u6700\u65b0\u7248\u672c<\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"content-container\">\n      <div class=\"status-alert\" id=\"statusAlert\" style=\"display: none;\"><\/div>\n\n      <div id=\"latestLogContainer\" style=\"display: none;\">\n        <div class=\"update-container\">\n          <div class=\"update-header\">\n            <h2><i class=\"fas fa-bolt\"><\/i> \u6700\u65b0\u66f4\u65b0<\/h2>\n            <div class=\"update-tag\">\u6700\u65b0\u53d1\u5e03<\/div>\n          <\/div>\n          <div class=\"update-content\">\n            <div class=\"update-date\" id=\"latestLogDate\"><\/div>\n            <div class=\"update-text\" id=\"latestLogContent\"><\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"button-group\" id=\"buttonGroup\" style=\"display: none;\"><\/div>\n\n      <div class=\"history-container\" id=\"logs\" style=\"display: none;\">\n        <div class=\"history-header\" onclick=\"toggleLogs()\">\n          <h2><i class=\"fas fa-history\"><\/i> \u5386\u53f2\u66f4\u65b0 <span id=\"historyCount\"><\/span><\/h2>\n          <button class=\"toggle-history\" id=\"toggleButton\">\n            <span id=\"toggleText\">\u5c55\u5f00\u5386\u53f2<\/span>\n            <i class=\"fas fa-chevron-down\" id=\"toggleIcon\"><\/i>\n          <\/button>\n        <\/div>\n        <div class=\"history-content\" id=\"logList\"><\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <script>\n  let logsCollapsed = true;\n\n  function toggleLogs() {\n    logsCollapsed = !logsCollapsed;\n    const logList = document.getElementById('logList');\n    const toggleText = document.getElementById('toggleText');\n    const toggleIcon = document.getElementById('toggleIcon');\n    \n    if (logsCollapsed) {\n      logList.classList.remove('expanded');\n      toggleText.textContent = '\u5c55\u5f00\u5386\u53f2';\n      toggleIcon.className = 'fas fa-chevron-down';\n    } else {\n      logList.classList.add('expanded');\n      toggleText.textContent = '\u6536\u8d77\u5386\u53f2';\n      toggleIcon.className = 'fas fa-chevron-up';\n    }\n  }\n\n  (async function() {\n    const loading = document.getElementById('loading');\n    const container = document.getElementById('container');\n    const currentVersion = document.getElementById('currentVersion');\n    const latestVersion = document.getElementById('latestVersion');\n    const currentStatus = document.getElementById('currentStatus');\n    const latestStatus = document.getElementById('latestStatus');\n    const versionIndicator = document.getElementById('versionIndicator');\n    const statusAlert = document.getElementById('statusAlert');\n    const buttonGroup = document.getElementById('buttonGroup');\n    const latestLogContainer = document.getElementById('latestLogContainer');\n    const latestLogDate = document.getElementById('latestLogDate');\n    const latestLogContent = document.getElementById('latestLogContent');\n    const logsContainer = document.getElementById('logs');\n    const logList = document.getElementById('logList');\n    const historyCount = document.getElementById('historyCount');\n\n    const localVer = '${String(localVersion)}';\n\n    \/\/ \u7edf\u4e00\u7684\u670d\u52a1\u5668\u914d\u7f6e - \u65b9\u4fbf\u7ef4\u62a4\n    const serverConfig = {\n      main: {\n        name: '\u4e3b\u7ebf\u8def',\n        icon: 'rocket',\n        baseUrl: 'https:\/\/sy.dashabi.tk',\n        downloadPath: '\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup1: {\n        name: '\u5907\u7528\u7ebf\u8def1',\n        icon: 'box',\n        baseUrl: 'https:\/\/api.langge.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup2: {\n        name: '\u5907\u7528\u7ebf\u8def2',\n        icon: 'satellite',\n        baseUrl: 'https:\/\/20.langge.tk',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup3: {\n        name: '\u5907\u7528\u7ebf\u8def3',\n        icon: 'link',\n        baseUrl: 'http:\/\/219.154.201.122:5006',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup4: {\n        name: '\u5907\u7528\u7ebf\u8def4',\n        icon: 'bolt',\n        baseUrl: 'https:\/\/v2.czyl.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup5: {\n        name: '\u5907\u7528\u7ebf\u8def5',\n        icon: 'globe',\n        baseUrl: 'https:\/\/v10.czyl.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup6: {\n        name: '\u5907\u7528\u7ebf\u8def6',\n        icon: 'broadcast-tower',\n        baseUrl: 'https:\/\/v4.czyl.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      }\n    };\n\n    \/\/ \u7248\u672c\u6bd4\u8f83\u51fd\u6570\n    function compareVersions(vs) {\n      const normalize = (v) => {\n        return v.split('.').map(n => {\n          const num = parseInt(n, 10);\n          return isNaN(num) ? 0 : num;\n        });\n      };\n\n      const parts1 = normalize(localVer);\n      const parts2 = normalize(vs);\n      const maxLength = Math.max(parts1.length, parts2.length);\n      \n      for (let i = 0; i < maxLength; i++) {\n        const num1 = parts1[i] || 0;\n        const num2 = parts2[i] || 0;\n        if (num1 > num2) return 1;\n        if (num1 < num2) return -1;\n      }\n      return 0;\n    }\n\n    async function fetchVersionData() {\n      \/\/ \u4f7f\u7528\u7edf\u4e00\u914d\u7f6e\u4e2d\u9664\u4e3b\u7ebf\u8def\u5916\u7684\u5907\u7528\u7ebf\u8def\u8fdb\u884c\u7248\u672c\u68c0\u67e5\n      const serversToCheck = Object.values(serverConfig).filter(s => s.baseUrl.includes('czyl.cf') || s.baseUrl.includes('219.154'));\n      \n      for (const server of serversToCheck) {\n        try {\n          const response = await fetch(server.baseUrl + '\/version', { timeout: 2000 });\n          if (response.ok) {\n            return await response.json();\n          }\n        } catch (e) {\n          console.warn(\\`\u63a5\u53e3\u5931\u8d25\uff1a\\${server.baseUrl}\\`, e);\n        }\n      }\n      throw new Error('\u6240\u6709\u66f4\u65b0\u63a5\u53e3\u90fd\u8bf7\u6c42\u5931\u8d25');\n    }\n\n    function showError(message) {\n      loading.innerHTML = \\`\n        <div class=\"error-state\">\n          <div class=\"error-icon\"><i class=\"fas fa-exclamation-triangle\"><\/i><\/div>\n          <div class=\"error-text\">\\${message}<\/div>\n          <button class=\"retry-button\" onclick=\"location.reload()\"><i class=\"fas fa-redo\"><\/i> \u91cd\u8bd5<\/button>\n        <\/div>\n      \\`;\n    }\n\n    try {\n      const data = await fetchVersionData();\n      const cloudVersion = String(data.version3);\n      const updateLog = data.update_log || {};\n\n      \/\/ \u663e\u793a\u7248\u672c\u4fe1\u606f\n      currentVersion.textContent = \\`v\\${localVer}\\`;\n      latestVersion.textContent = \\`v\\${cloudVersion}\\`;\n\n      \/\/ \u5904\u7406\u65e5\u5fd7\n      const logEntries = Object.entries(updateLog);\n      if (logEntries.length > 0) {\n        \/\/ \u663e\u793a\u6700\u65b0\u65e5\u5fd7\n        const [latestDate, latestContent] = logEntries[0];\n        latestLogDate.innerHTML = \\`<i class=\"fas fa-calendar-alt\"><\/i> \\${latestDate}\\`;\n        latestLogContent.textContent = latestContent;\n        latestLogContainer.style.display = 'block';\n\n        \/\/ \u663e\u793a\u5386\u53f2\u65e5\u5fd7\n        if (logEntries.length > 1) {\n          const historyLogs = logEntries.slice(1);\n          historyCount.textContent = \\`(\\${historyLogs.length}\u6761)\\`;\n          logList.innerHTML = historyLogs.map(([date, content]) => \\`\n            <div class=\"history-item\">\n              <div class=\"history-date\">\n                <i class=\"fas fa-calendar-day\"><\/i>\n                <span>\\${date}<\/span>\n              <\/div>\n              <div class=\"history-text\">\\${content}<\/div>\n            <\/div>\n          \\`).join('');\n          logsContainer.style.display = 'block';\n        }\n      }\n\n      \/\/ \u68c0\u67e5\u66f4\u65b0\u72b6\u6001\n      const compareResult = compareVersions(cloudVersion);\n      \n      \/\/ \u663e\u793a\u7248\u672c\u6307\u793a\u5668\n      versionIndicator.style.display = 'flex';\n      \n      if (compareResult === -1) {\n        \/\/ \u9700\u8981\u66f4\u65b0\n        currentStatus.textContent = '\u5f85\u66f4\u65b0';\n        currentStatus.className = 'version-status status-outdated';\n        versionIndicator.className = 'version-indicator update-needed';\n        versionIndicator.innerHTML = '<i class=\"fas fa-arrow-right\"><\/i>';\n\n        \/\/ \u4f7f\u7528\u7edf\u4e00\u914d\u7f6e\u751f\u6210\u4e0b\u8f7d\u6309\u94ae\n        buttonGroup.innerHTML = Object.values(serverConfig).map(server => {\n          const fullUrl = server.baseUrl + server.downloadPath;\n          return \\`\n            <a href=\"yuedu:\/\/booksource\/importonline?src=\\${encodeURIComponent(fullUrl)}\" class=\"button\">\n              <i class=\"fas fa-\\${server.icon}\"><\/i>\n              <span>\\${server.name}<\/span>\n            <\/a>\n          \\`;\n        }).join('');\n        buttonGroup.style.display = 'flex';\n      } else {\n        \/\/ \u5df2\u662f\u6700\u65b0\u7248\u672c\n        currentStatus.textContent = '\u6700\u65b0';\n        currentStatus.className = 'version-status status-latest';\n        versionIndicator.className = 'version-indicator is-latest';\n        versionIndicator.innerHTML = '<i class=\"fas fa-check\"><\/i>';\n        \n        statusAlert.className = 'status-alert up-to-date';\n        statusAlert.innerHTML = '<i class=\"fas fa-check-circle\"><\/i> <div>\u60a8\u5df2\u662f\u6700\u65b0\u7248\u672c<\/div>';\n        statusAlert.style.display = 'flex';\n      }\n\n      \/\/ \u663e\u793a\u4e3b\u5bb9\u5668\uff0c\u9690\u85cf\u52a0\u8f7d\n      loading.style.display = 'none';\n      container.style.display = 'block';\n\n    } catch (err) {\n      console.error('\u7248\u672c\u68c0\u67e5\u5931\u8d25\uff1a', err);\n      showError('<i class=\"fas fa-exclamation-circle\"><\/i> \u68c0\u67e5\u66f4\u65b0\u5931\u8d25\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5<br><small>' + err.message + '<\/small>');\n    }\n  })();\n  <\/script>\n<\/body>\n<\/html>\n`;\n    java.startBrowser(`data:text\/html;base64,${java.base64Encode(html)}`, '\u5927\u7070\u72fc\u4e66\u6e90\u66f4\u65b0');\n}","respondTime":180000,"ruleBookInfo":{"author":"$.author","canReName":"1","coverUrl":"$.thumb_url","init":"<js>\nif (String(baseUrl).startsWith(\"data:\")) {\n    let res = JSON.parse(java.hexDecodeToString(result));\n    let book_id = res.book_id;\n    let tab = res.tab;\n    let sources = res.sources;\n    let url = res.url;\n    let html = \"\";\n    let proxy = getArguments(source.getVariable(), \"proxy\");\n    if (url != \"\" && proxy == \"\u672c\u5730\") {\n        if (sources == '69\u4e66\u5427') {\n            let ck69 = String(cookie.getCookie(url));\n            let headers = {\n                \"Cookie\": ck69\n            };\n            let op = JSON.stringify({\n                \"headers\": headers\n            });\n            html = java.ajax(url + ',' + op);\n        } else {\n            html = java.ajax(url);\n        }\n        \/\/java.log(html);\n        if (html.includes(\"Just a moment...\") && sources == '69\u4e66\u5427') {\n            cookie.removeCookie(url);\n            var x = `https:\/\/www.69shuba.com`;\n            java.longToast('\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1');\n            var s = java.startBrowserAwait(x, \"\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1\").body();\n\n            let ck69 = String(cookie.getCookie(url));\n            let headers = {\n                \"Cookie\": ck69\n            };\n            let op = JSON.stringify({\n                \"headers\": headers\n            });\n            java.log(op);\n            html = java.ajax(url + ',' + op);\n            \/\/java.log(html);\n        }\n    }\n    let base_url = getArguments(source.getVariable(), \"server\");\n    let op = {\n        method: \"POST\",\n        body: {\n            html: html\n        }\n    };\n    op = JSON.stringify(op);\n    let varia = String(book.getVariable('custom'));\n    if (varia == 'null') {\n        varia = '';\n    }\n    varia = JSON.stringify({\n        'custom': varia\n    });\n    \/\/varia = java.base64Encode(varia);\n    java.log(`${base_url}\/detail?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\n    result = java.ajax(`${base_url}\/detail?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\n}\nresult\n<\/js>$.data","intro":"<js>\nlet {\n    book_id,\n    source: sources,\n    tab,\n    book_tts,\n    tags,\n    role,\n    last_chapter_title,\n    last_chapter_update_time,\n    word_number,\n    status,\n    score,\n    abstract,\n    copyright_info\n} = result;\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (proxy == \"\u672c\u5730\") {\n    proxy = \"\u672c\u5730\u7f51\u7edc\";\n} else {\n    proxy = \"\u670d\u52a1\u5668\u7f51\u7edc\";\n}\njava.put(\"book_detail\", JSON.stringify(result));\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet key = \"\";\ntry {\n    let cookieValue =\n        String(cookie.getCookie(base_url)) || String(java.getCookie(base_url));\n    key = getKey(cookieValue);\n} catch (e) {\n    key = \"\";\n}\n\nif (key == \"\") {\n    java.log(\"\u5f53\u524d\u670d\u52a1\u5668\u672a\u67e5\u8be2\u5230\u767b\u5f55\u72b6\u6001\uff0c\u5c1d\u8bd5\u67e5\u8be2\u5176\u4ed6\u670d\u52a1\u5668\u767b\u5f55\u72b6\u6001...\");\n    let cookieValue;\n    for (let h of host) {\n        try {\n            cookieValue = String(cookie.getCookie(h)) || String(java.getCookie(h));\n            key = getKey(cookieValue);\n        } catch (e) {\n            key = \"\";\n        }\n        if (key) {\n            java.log(`\u5df2\u5728${h}\u767b\u5f55\uff0c\u9000\u51fa\u67e5\u8be2\uff0c\u6b63\u5728\u8f6c\u79fb\u767b\u5f55\u72b6\u6001\u5230\u5f53\u524d\u670d\u52a1${base_url}`);\n            \/\/java.log(cookieValue)\n            removeCookie(h);\n            removeCookie(base_url);\n            cookie.setCookie(base_url, cookieValue);\n            break;\n        }\n    }\n}\n\nif (book.readConfig == null || book.readConfig.useReplaceRule == null) {\n    book.setUseReplaceRule(false);\n}\n\nlet nickname = '\u8d26\u53f7\u72b6\u6001\uff1a\u26a0\ufe0f \u672a\u767b\u5f55 | \u70b9\u51fb\u53f3\u4e0a\u89d2 \ud83d\udd16 \u767b\u5f55';\ntry {\n    let opcx = {\n        method: \"GET\",\n        headers: {\n            cookie: 'qttoken=' + key + ';'\n        },\n    };\n    opcx = JSON.stringify(opcx);\n    let user_info = JSON.parse(java.ajax(base_url + '\/get_avatar,' + opcx));\n    if (user_info.code == 0) {\n        if (user_info.nickname) {\n            nickname = '\u6b22\u8fce\u56de\u6765\uff1a' + user_info.nickname\n        } else {\n            nickname = '\u6b22\u8fce\u56de\u6765\uff1a' + user_info.email + \"(\u8bf7\u524d\u5f80\u7528\u6237\u540e\u53f0\u8bbe\u7f6e\u7528\u6237\u540d)\"\n        }\n    }\n} catch (e) {\n    if (key) {\n        nickname = '\u8d26\u53f7\u72b6\u6001\uff1a\u5df2\u767b\u5f55'\n    }\n};\n\nlet loginStatus = nickname;\n\nlet lightDivider = \"\u2747\ufe0f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2747\ufe0f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2747\ufe0f\";\nlet heavyDivider = \"&lrm;\\n&lrm;\";\n\nlet isValid = (value) => String(value).length > 1;\nlet ctitle = book.durChapterTitle || '\u672a\u5f00\u59cb';\nlet info = `\n    \ud83d\udce1 \u5f53\u524d\u670d\u52a1\uff1a${base_url}\n    \ud83d\udd11 ${loginStatus}\n    \ud83c\udff7 \u6570\u636e\u6765\u6e90\uff1a${sources}\n    \ud83d\udd04 \u5f53\u524d\u6a21\u5f0f\uff1a${tab}\n    \u2699\ufe0f \u8bbf\u95ee\u6a21\u5f0f\uff1a${proxy}\n    \ud83d\udcd6 \u9605\u8bfb\u81f3\uff1a${ctitle}\n`;\n\nif (tab == \"\u542c\u4e66\") {\n    let toneId = getArguments(source.getVariable(), \"tone_id\");\n    if (isValid(book_tts)) {\n        info += `${lightDivider}\n    \ud83c\udfb5 \u97f3\u8272\u914d\u7f6e\uff1a${toneId}\n    ${book_tts}\n`;\n    }\n}\n\nlet basicInfo = \"\";\nlet addBasicInfo = (value, prefix, icon) => {\n    if (isValid(value)) basicInfo += `    ${icon} ${prefix} ${value}\\n`;\n};\n\naddBasicInfo(tags, \"\u4e66\u7c4d\u5206\u7c7b\uff1a\", \"\ud83c\udf08\");\naddBasicInfo(role, \"\u4e66\u7c4d\u4e3b\u89d2\uff1a\", \"\ud83d\udc51\");\naddBasicInfo(last_chapter_title, \"\u6700\u65b0\u7ae0\u8282\uff1a\", \"\ud83d\udcda\");\naddBasicInfo(last_chapter_update_time, \"\u66f4\u65b0\u65f6\u95f4\uff1a\", \"\u23f3\");\naddBasicInfo(word_number, \"\u4e66\u7c4d\u5b57\u6570\uff1a\", \"\ud83d\udcca\");\naddBasicInfo(status, \"\u4e66\u7c4d\u72b6\u6001\uff1a\", \"\ud83d\udea9\");\naddBasicInfo(score, \"\u4e66\u7c4d\u8bc4\u5206\uff1a\", \"\u2b50\");\n\nif (basicInfo) info += `${lightDivider}\\n${basicInfo}`;\n\nif (isValid(abstract)) {\n    let indentedAbstract = abstract\n        .split(\"\\n\")\n        .map((line) => `    ${line}`)\n        .join(\"\\n\");\n    info += `${heavyDivider}\n    \ud83d\udcd6 \u4e66\u7c4d\u7b80\u4ecb\uff1a\n${indentedAbstract}\n`;\n} else {\n    info += `${heavyDivider}`;\n}\n\nif (isValid(copyright_info)) {\n    info += `${lightDivider}\n    \u00a9 ${copyright_info}\n`;\n} else {\n    info += `${lightDivider}`;\n}\n\ninfo += `\n${heavyDivider}\n    \ud83d\udca0\ud83d\udca0\ud83d\udca0 \u6570\u636e\u66f4\u65b0\u4e8e ${new Date().toLocaleString()} \ud83d\udca0\ud83d\udca0\ud83d\udca0\n`;\nlet jjinfo = getArguments(source.getVariable(), \"info\");\n\nif (jjinfo != \"on\") {\n    info = String(info)\n        .split(\"\\n\")\n        .map((line) => line.replace(\/^ {4}\/, \"\"))\n        .join(\"\\n\");\n} else {\n    basicInfo = \"\";\n    addBasicInfo(last_chapter_title, \"\u6700\u65b0\u7ae0\u8282\uff1a\", \"\ud83d\udcda\");\n    addBasicInfo(last_chapter_update_time, \"\u66f4\u65b0\u65f6\u95f4\uff1a\", \"\u23f3\");\n    addBasicInfo(word_number, \"\u4e66\u7c4d\u5b57\u6570\uff1a\", \"\ud83d\udcca\");\n    addBasicInfo(status, \"\u4e66\u7c4d\u72b6\u6001\uff1a\", \"\ud83d\udea9\");\n    addBasicInfo(score, \"\u4e66\u7c4d\u8bc4\u5206\uff1a\", \"\u2b50\");\n    if (isValid(abstract)) {\n        let indentedAbstract = abstract\n            .split(\"\\n\")\n            .map((line) => `    ${line}`)\n            .join(\"\\n\");\n        basicInfo += `\n    \\n&lrm;\n    \ud83d\udcd6 \u4e66\u7c4d\u7b80\u4ecb\uff1a\n${indentedAbstract}\n`;\n    } else {\n        basicInfo += `${heavyDivider}`;\n    }\n    info = `&lrm;\\n\ud83c\udff7 \u6570\u636e\u6765\u6e90\uff1a${sources}\\n` + basicInfo;\n}\n<\/js>","lastChapter":"{{$.source}} {{$.last_chapter_title}} {{$.last_chapter_update_time}}","name":"$.book_name","tocUrl":"<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || \"\u5c0f\u8bf4\";\nlet url = result.toc_url || \"\";\nvar sdtoken;\ntry {\n    var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n    sdtoken = String(loginInfoMap['\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)'] || '');\n} catch (e) {\n    sdtoken = '';\n}\nvar rawCookie = getFanqieCookie() || sdtoken;\nvar match = rawCookie.match(\/sessionid=[^;]+\/);\nvar fqcookie = match ? match[0] : '';\nvar fqssionid = '';\nif (fqcookie) {\n    fqssionid = getSessionId(fqcookie);\n};\nsetArguments('fqssionid', fqssionid);\njava.put(\"tab\", tab);\njava.put(\"book_id\", book_id);\nlet qtcatalog = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url,\n};\nqtcatalog = java.base64Encode(JSON.stringify(qtcatalog));\n`data:;base64,${qtcatalog},{\"type\":\"qingtian2\"}`;\n<\/js>","wordCount":"$.word_number"},"ruleContent":{"content":"<js>\nresult = String(java.hexDecodeToString(result));\nlet res;\nif (result.match(\/\u5927\u7070\u72fc\u878d\u5408\/)) {\n    result = result.split(\"\u5927\u7070\u72fc\u878d\u54084\");\n    res = {\n        item_id: result[0],\n        tab: result[1],\n        title: result[2],\n        sources: result[3],\n        url: \"\"\n    };\n} else {\n    res = JSON.parse(result);\n}\nlet varia = String(book.getVariable('custom'));\nif (varia == 'null') {\n    varia = '';\n}\nvaria = JSON.stringify({\n    'custom': varia\n});\n\/\/  varia = java.base64Encode(varia);\nlet book_id = res.book_id;\nlet item_id = res.item_id;\nlet tab = res.tab;\nlet title = res.title;\nlet sources = res.sources;\nlet url = res.url;\nlet html = \"\";\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (url != \"\" && proxy == \"\u672c\u5730\") {\n    if (sources == '69\u4e66\u5427') {\n        let ck69 = String(cookie.getCookie(url));\n        let headers = {\n            \"Cookie\": ck69,\n            \"User-Agent\": \"Mozilla\/5.0 (Linux; Android 6.0; Nexus 5 Build\/MRA58N) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Mobile Safari\/537.36 Edg\/138.0.0.0\"\n        };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        java.log(url);\n        java.log(op);\n        html = java.ajax(url + ',' + op);\n    } else {\n        html = java.ajax(url);\n    }\n    java.log(html);\n    if (html.includes(\"Just a moment...\") && sources == '69\u4e66\u5427' && book.durChapterIndex === chapter.index) {\n        cookie.removeCookie(url);\n        var x = url;\n        java.longToast('\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1');\n        var s = java.startBrowserAwait(x, \"\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1\").body();\n\n        let ck69 = String(cookie.getCookie(url));\n        let headers = {\n            \"User-Agent\": \"Mozilla\/5.0 (Linux; Android 6.0; Nexus 5 Build\/MRA58N) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Mobile Safari\/537.36 Edg\/138.0.0.0\",\n            \"Cookie\": ck69\n        };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        java.log(op);\n        html = java.ajax(url + ',' + op);\n        \/\/java.log(html);\n    }\n};\nlet content = \"\";\nlet data;\nlet tone_id = getArguments(source.getVariable(), \"tone_id\");\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet device, device_type;\ntry {\n    device = java.deviceID();\n    device_type = \"\u82f9\u679c\";\n} catch (e) {\n    try {\n        device = java.androidId();\n        device_type = \"\u5b89\u5353\";\n    } catch (e) {\n        device = \"\";\n        device_type = \"\u5b89\u5353\";\n    }\n}\n\nlet qtcookie = cookie.getCookie(base_url);\ntry {\n    qtcookie = `qttoken=${String(cookie.getKey(base_url, \"qttoken\"))}; deviceId=${device};`\n} catch (e) {}\n\nvar params = {\n    html: html,\n    item_id: item_id,\n    source: sources,\n    tab: tab,\n    tone_id: tone_id,\n    variable: varia,\n    version: '4.11.5.1'\n};\n\nvar content_url = '\/content';\n\nif ((sources == \"\u756a\u8304\" || sources == \"\u4e03\u732b\" || sources == \"\u5854\u8bfb\") && getArguments(source.getVariable(), \"fqpara\") == \"on\" && tab == \"\u5c0f\u8bf4\") {\n    content_url = '\/content?review=1';\n}\n\n\/\/var signInfo = generateComplexSignature('POST', content_url, {}, APP_SECRET, params);\n\n\n\/\/var signedParams = copyObject(params);\n\/\/signedParams.timestamp = signInfo.timestamp;\n\/\/signedParams.nonce = signInfo.nonce;\n\/\/signedParams.sign = signInfo.sign;\n\n\nvar op = {\n    method: \"POST\",\n    body: JSON.stringify(params),\n    headers: {\n        cookie: qtcookie,\n        'Content-Type': 'application\/json'\n    }\n};\n\nop = JSON.stringify(op);\njava.log(op);\ndata = java.ajax(base_url + content_url + `,${op}`);\n\ntry {\n    data = JSON.parse(data);\n    if (data.msg) {\n        java.toast(data.msg);\n    }\n} catch (e) {}\n\ncontent = data.content\n\nif ((sources == \"\u756a\u8304\" || sources == \"\u4e03\u732b\" || sources == \"\u5854\u8bfb\") && getArguments(source.getVariable(), \"fqpara\") == \"on\" && tab == \"\u5c0f\u8bf4\") {\n    var fqssionid = getArguments(source.getVariable(), \"fqssionid\") || \"\";\n    content = content\n        .replace(\/ident=\"\/g, 'ident=\"' + base_url)\n        .replace(\/book_id=\/g, 'book_id=' + book_id + '&ssionid=' + fqssionid);\n    if (device_type == \"\u82f9\u679c\") {\n        content = paraForiOS(content, sources);\n    } else {\n        content = paraForAndroid(content, sources);\n    }\n\n\n}\ndata = JSON.stringify({\n    content: content,\n});\n\nif (device_type == \"\u5b89\u5353\" && (tab == \"\u77ed\u5267\" || tab == \"\u89c6\u9891\" || sources == '\u6bd2\u820c\u5f71\u89c6')) {\n    data = {\n        content: `\u3010\u53f3\u4e0a\u89d2\u5237\u65b0\u3011\u5f00\u542f\u64ad\u653e(\u4e0b\u4e00\u96c6\u8bf7\u5207\u6362\u4e0b\u4e00\u7ae0\u5237\u65b0)\\n\u64ad\u653e\u76f4\u94fe\uff1a\\n${content}`,\n    };\n    data = JSON.stringify(data);\n    if (book.durChapterIndex === chapter.index) {\n        let video_url = `${base_url}\/online_video?book_id=${book_id}&source=${sources}&tab=${tab}`;\n        if (sources == '\u6bd2\u820c\u5f71\u89c6') {\n            video_url = content;\n        };\n        java.startBrowser(video_url, title);\n        java.toast(\"\u6b63\u5728\u52a0\u8f7d\u89c6\u9891...\");\n    }\n\n}\ndata;\n<\/js>$.content","imageStyle":"TEXT"},"ruleExplore":{"author":"$.author","bookList":"$.data","bookUrl":"<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || '\u5c0f\u8bf4';\nlet url = result.toc_url || '';\n\nlet qtdetail = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url\n}\nqtdetail = java.base64Encode(JSON.stringify(qtdetail));\n`data:;base64,${qtdetail},{\"type\":\"qingtian\"}`\n<\/js>","coverUrl":"$.thumb_url","intro":"$.abstract","kind":"{{$.category}}\n{{$.score}}\n{{$.status}}\n{{$.source}}\n{{$.tags}}","lastChapter":"{{$.last_chapter_title}} \u2022 {{$.last_update_time}}","name":"$.book_name","wordCount":"$.word_number"},"ruleSearch":{"author":"$.author","bookList":"$.data","bookUrl":"<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || '\u5c0f\u8bf4';\nlet url = result.toc_url || '';\n\nlet qtdetail = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url\n}\nqtdetail = java.base64Encode(JSON.stringify(qtdetail));\n`data:;base64,${qtdetail},{\"type\":\"qingtian\"}`\n<\/js>","checkKeyWord":"\u6211\u768426\u5c81\u5973\u623f\u5ba2@\u756a\u8304","coverUrl":"$.thumb_url","intro":"$.abstract","kind":"{{$.status}},{{$.score}},{{$.tags}},{{$.last_chapter_update_time}}","lastChapter":"{{$.source}} {{$.last_chapter_title}}","name":"$.book_name##\uff08\u522b\u540d\uff1a.*?\uff09","wordCount":"$.word_number"},"ruleToc":{"chapterList":"<js>\nlet res = JSON.parse(java.hexDecodeToString(result));\nif (res.method) {\n    res = Object.fromEntries(\n        res.body\n        .replace(\"source\", \"sources\")\n        .split(\"&\")\n        .map((query) => query.split(\"=\"))\n    );\n    res.url = \"\";\n}\nlet book_id = res.book_id;\njava.put('book_id', book_id);\nlet tab = res.tab;\nlet sources = res.sources;\nlet url = res.url;\nlet html = \"\";\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (url != \"\" && proxy == \"\u672c\u5730\") {\n    if (sources == '69\u4e66\u5427') {\n        let ck69 = String(cookie.getCookie(url));\n        let headers = {\n            \"Cookie\": ck69\n        };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        html = java.ajax(url + ',' + op);\n    } else {\n        html = java.ajax(url);\n    }\n    \/\/java.log(html);\n    if (html.includes(\"Just a moment...\") && sources == '69\u4e66\u5427') {\n        cookie.removeCookie(url);\n        var x = `https:\/\/www.69shuba.com`;\n        java.longToast('\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1');\n        var s = java.startBrowserAwait(x, \"\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1\").body();\n\n        let ck69 = String(cookie.getCookie(url));\n        let headers = {\n            \"Cookie\": ck69\n        };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        \/\/java.log(op);\n        html = java.ajax(url + ',' + op);\n        \/\/java.log(html);\n    }\n};\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet op = {\n    method: \"POST\",\n    body: {\n        html: html\n    }\n};\nop = JSON.stringify(op);\nlet varia = String(book.getVariable('custom'));\nif (varia == 'null') {\n    varia = '';\n}\nvaria = JSON.stringify({\n    'custom': varia\n});\n\/\/ varia = java.base64Encode(varia);\n\/\/java.log(`${base_url}\/catalog?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\nlet data = java.ajax(\n    `${base_url}\/catalog?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`\n);\nlet device, device_type;\ntry {\n    device = java.deviceID();\n    device_type = \"\u82f9\u679c\";\n} catch (e) {\n    try {\n        device = java.androidId();\n        device_type = \"\u5b89\u5353\";\n    } catch (e) {\n        device = \"\";\n        device_type = \"\u5b89\u5353\";\n    }\n}\n\nif (tab == \"\u5c0f\u8bf4\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 8;\n    } else {\n        book.type = 0;\n    }\n} else if (tab == \"\u542c\u4e66\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 32;\n    } else {\n        book.type = 1;\n    }\n} else if (tab == \"\u6f2b\u753b\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 64;\n    } else {\n        book.type = 2;\n    }\n} else if (tab == \"\u77ed\u5267\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 8;\n    } else {\n        book.type = 3;\n    }\n} else {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 8;\n    } else {\n        book.type = 0;\n    }\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet reading = getArguments(source.getVariable(), \"reading\");\n\nif (book && book.order != 0 && reading == '1') {\n    try {\n        if (!data || !book.variable || !base_url || !qtcookie) {\n            java.log('\u7f3a\u5c11\u5fc5\u8981\u53c2\u6570');\n        } else {\n            let parsedData;\n            try {\n                parsedData = JSON.parse(data);\n            } catch (e) {\n                java.log('\u89e3\u6790data\u6570\u636e\u5931\u8d25:' + e);\n            }\n            \n            if (parsedData && parsedData.data && Array.isArray(parsedData.data) && parsedData.data[book.durChapterIndex]) {\n                let ritem = parsedData.data[book.durChapterIndex];\n                let bookInfoObj;\n                try {\n                    bookInfoObj = JSON.parse(book.variable);\n                } catch (e) {\n                    java.log('\u89e3\u6790book.variable\u5931\u8d25:' + e);\n                }\n                \n                if (bookInfoObj) {\n                    let book_info;\n                    try {\n                        book_info = JSON.parse(bookInfoObj.book_detail || JSON.stringify(bookInfoObj));\n                    } catch (e) {\n                        java.log('\u89e3\u6790book_detail\u5931\u8d25:' + e);\n                    }\n                    \n                    if (book_info && typeof book_info === 'object') {\n                        let rurl = base_url + '\/add_book_to_book_shelf,';\n                        book_info['read_status'] = 1;\n                        book_info['last_chapter_item_id'] = ritem.item_id || '';\n                        book_info['last_chapter_title'] = ritem.title || '';\n                        let rop = {\n                            method: \"POST\",\n                            headers: {\n                                cookie: qtcookie\n                            },\n                            body: book_info\n                        };\n                        let check_book_url = base_url + '\/check_book_in_book_shelf,';\n                        let checkResponse;\n                        \n                        try {\n                            checkResponse = java.ajax(check_book_url + JSON.stringify(rop));\n                        } catch (e) {\n                            java.log('\u68c0\u67e5\u4e66\u7c4d\u8bf7\u6c42\u5931\u8d25:' + e);\n                        }\n                        \n                        if (checkResponse) {\n                            let check_data;\n                            try {\n                                check_data = JSON.parse(checkResponse).data;\n                            } catch (e) {\n                                java.log('\u89e3\u6790\u68c0\u67e5\u54cd\u5e94\u5931\u8d25:' + e);\n                            }\n                            try {\n                                if (check_data && check_data.id) {\n                                    book_info['id'] = check_data.id;\n                                    let uurl = base_url + '\/update_book_shelf,';\n                                    java.ajax(uurl + JSON.stringify(rop));\n                                } else {\n                                    java.ajax(rurl + JSON.stringify(rop));\n                                }\n                            } catch (e) {\n                                java.log('\u4e66\u67b6\u64cd\u4f5c\u5931\u8d25:' + e);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    } catch (error) {\n        java.log('\u4e66\u7c4d\u540c\u6b65\u6d41\u7a0b\u5f02\u5e38:' + error);\n        java.longToast('\\n\u540c\u6b65\u9605\u8bfb\u8fdb\u5ea6\u5931\u8d25\uff0c\u4f46\u4e0d\u5f71\u54cd\u9605\u8bfb\uff0c\u53ef\u4ee5\u524d\u5f80\u767b\u5f55\u5173\u95ed\u4e66\u67b6\u540c\u6b65\u529f\u80fd\u3002');\n    }\n}\ndata;\n<\/js>$.data","chapterName":"$.title","chapterUrl":"<js>\nlet tab = result.tab;\nlet sources = result.source;\nlet title = result.title;\nlet item_id = result.item_id;\nlet book_id = java.get(\"book_id\");\nlet url = result.toc_url || \"\";\nlet qtcontent = {\n    book_id: book_id,\n    item_id: item_id,\n    title: title,\n    sources: sources,\n    tab: tab,\n    url: url,\n};\nqtcontent = java.base64Encode(JSON.stringify(qtcontent));\nif (sources == '\u5377') {\n    content_url = item_id\n} else if ((sources == \"\u756a\u8304\" || sources == \"\u4e03\u732b\" || sources == \"\u5854\u8bfb\") && tab == \"\u5c0f\u8bf4\") {\n    var base_url = getArguments(source.getVariable(), \"server\") || \"\";\n    var fqssionid = getArguments(source.getVariable(), \"fqssionid\") || \"\";\n    let sourcess = sources.replace('svip_', '');\n    content_url = `data:;base64,${qtcontent},{\"type\":\"qingtian3\",\"js\":\"book ? result : '${base_url}\/get_review?book_id=${book_id}&item_id=${item_id}&ssionid=${fqssionid}&source=${sourcess}'\"}`;\n} else {\n    content_url = `data:;base64,${qtcontent},{\"type\":\"qingtian3\"}`;\n}\n<\/js>","updateTime":"$.first_pass_time"},"searchUrl":"<js>\nlet base_url = getArguments(source.getVariable(), 'server');\nlet media;\nlet sources = getArguments(source.getVariable(), 'source');\nlet disabled_sources = getArguments(source.getVariable(), 'disabled_sources');\nif (String(key).startsWith(\"m:\") || String(key).startsWith(\"m\uff1a\")) {\n    media = \"\u6f2b\u753b\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"t:\") || String(key).startsWith(\"t\uff1a\")) {\n    media = \"\u542c\u4e66\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"d:\") || String(key).startsWith(\"d\uff1a\")) {\n    media = \"\u77ed\u5267\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"x:\") || String(key).startsWith(\"x\uff1a\")) {\n    media = \"\u5c0f\u8bf4\"\n    key = key.slice(2)\n} else {\n    media = getArguments(source.getVariable(), 'media');\n}\nif (key.includes('@')) {\n    var parts = key.split('@');\n    key = parts[0];\n    sources = parts[1] || sources;\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet op = {\n    method: \"GET\",\n    headers: {\n        cookie: qtcookie\n    },\n};\nop = JSON.stringify(op);\n`${base_url}\/search?title=${key}&tab=${media}&source=${sources}&page={{page}}&disabled_sources=${disabled_sources},${op}`\n<\/js>","weight":0},{"bookSourceComment":"\u7b14\u8da3\u4e2d\u6587\u7f51\uff1ahttp:\/\/www.bqgz.cc","bookSourceGroup":"\u7b14\u8da3","bookSourceName":"\ud83c\udf08\u7b14\u8da3\u4e2d\u6587\u7f51","bookSourceType":0,"bookSourceUrl":"http:\/\/www.bqgz.cc","customOrder":0,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"[\n    {\n        \"title\": \"        \u5206\u7c7b        \",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 0,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"title\": \"\u7384\u5e7b\",\n        \"url\": \"\/category\/xuanhuan\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.29\n        }\n    },\n    {\n        \"title\": \"\u4fee\u771f\",\n        \"url\": \"\/category\/xiuzhen\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.29\n        }\n    },\n    {\n        \"title\": \"\u90fd\u5e02\",\n        \"url\": \"\/category\/dushi\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.29\n        }\n    },\n    {\n        \"title\": \"\u5386\u53f2\",\n        \"url\": \"\/category\/lishi\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.29\n        }\n    },\n    {\n        \"title\": \"\u7f51\u6e38\",\n        \"url\": \"\/category\/wangyou\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.29\n        }\n    },\n    {\n        \"title\": \"\u79d1\u5e7b\",\n        \"url\": \"\/category\/kehuan\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.29\n        }\n    },\n    {\n        \"title\": \"\u60ac\u7591\",\n        \"url\": \"\/category\/xuanyi\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.29\n        }\n    },\n    {\n        \"title\": \"\u540c\u4eba\",\n        \"url\": \"\/category\/tongren\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.29\n        }\n    },\n    {\n        \"title\": \"\u8f7b\u5c0f\u8bf4\",\n        \"url\": \"\/category\/qing\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.29\n        }\n    },\n    {\n        \"title\": \"\u5973\u751f\",\n        \"url\": \"\/category\/nvsheng\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.29\n        }\n    },\n    {\n        \"title\": \"\u77ed\u7bc7\",\n        \"url\": \"\/category\/duanpian\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.29\n        }\n    },\n    {\n        \"title\": \"\u5176\u4ed6\",\n        \"url\": \"\/category\/qita\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.29\n        }\n    },\n    {\n        \"title\": \"        \u6392\u884c\u699c        \",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 0,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"title\": \"\u603b\u70b9\u51fb\u699c\",\n        \"url\": \"\/top\/allvisit\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.29\n        }\n    },\n    {\n        \"title\": \"\u6708\u70b9\u51fb\u699c\",\n        \"url\": \"\/top\/monthvisit\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.29\n        }\n    },\n    {\n        \"title\": \"\u5468\u70b9\u51fb\u699c\",\n        \"url\": \"\/top\/weekvisit\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.29\n        }\n    },\n    {\n        \"title\": \"\u65e5\u70b9\u51fb\u699c\",\n        \"url\": \"\/top\/dayvisit\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.29\n        }\n    },\n    {\n        \"title\": \"\u63a8\u8350\u6570\u699c\",\n        \"url\": \"\/top\/vote\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.29\n        }\n    },\n    {\n        \"title\": \"\u6536\u85cf\u6570\u699c\",\n        \"url\": \"\/top\/mark\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.29\n        }\n    },\n    {\n        \"title\": \"\u4e0b\u8f7d\u6570\u699c\",\n        \"url\": \"\/top\/down\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.29\n        }\n    },\n    {\n        \"title\": \"\u8bc4\u8bba\u6570\u699c\",\n        \"url\": \"\/top\/comment\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.29\n        }\n    },\n    {\n        \"title\": \"\u8bc4\u5206\u699c\",\n        \"url\": \"\/top\/star_score\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.29\n        }\n    },\n   {\n        \"title\": \"        \u6700\u65b0\u5165\u5e93        \",\n        \"url\": \"\/top\/postdate\/{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 0,\n            \"layout_flexBasisPercent\": 1\n        }\n    }\n]","header":"{\"User-Agent\":\"Mozilla\/5.0 (Linux; Android 9) Mobile Safari\/537.36\"}","lastUpdateTime":"1765622392658","loginUrl":"http:\/\/m.bqgz.cc","respondTime":180000,"ruleBookInfo":{"author":".novelinfo-l li:nth-child(1) > a@text","coverUrl":".novelinfo-r > img@src","intro":"p@text","kind":".novelinfo-l li:nth-child(2) > a@text","lastChapter":".novelinfo-l li:nth-child(6) > a@text","name":"h1@text","tocUrl":".dirlist@href"},"ruleContent":{"content":"p@text"},"ruleExplore":{"author":"span:nth-child(2) > a@text","bookList":"li","bookUrl":".novelname@href","coverUrl":"img@src","intro":".intro@text","lastChapter":".last > a@text","name":".novelname@text"},"ruleSearch":{"author":"span:nth-child(2) > a@text","bookList":"li","bookUrl":".novelname@href","coverUrl":"img@src","intro":".intro@text","kind":"","lastChapter":".last > a@text","name":".novelname@text"},"ruleToc":{"chapterList":".dirlist > li","chapterName":"a@text","chapterUrl":"a@href"},"searchUrl":"http:\/\/www.bqgz.cc\/search\/result.html?searchkey={{key}}","weight":0},{"bookSourceGroup":"R18\u6f2b\u753b","bookSourceName":"\ud83c\udfa8\u7981\u6f2b\u5929\u5802","bookSourceType":2,"bookSourceUrl":"https:\/\/18comic.vip","customButton":false,"customOrder":1,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"eventListener":false,"header":"{\n\t\"User-Agent\":\"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36 Edg\/141.0.0.0\",\n\"Referer\":\"https:\/\/18comic.vip\/\"\n}","jsLib":"function Get(e) {\n    var $this = this;\n    var java = $this.java;\n    var source = $this.source;\n    var cookie = $this.cookie;\n    var get = JSON.parse(source.getVariable());\n    return get[e];\n}","lastUpdateTime":"1765652456170","respondTime":180000,"ruleBookInfo":{"author":"{{@@.phone-author-tag@text}}","coverUrl":".thumb-overlay.2@img@src","init":"<js>\nurl = baseUrl\nvar num = baseUrl.indexOf(\"novel\") !== -1 ? 1 : 2;\njava.put(\"btype\",num);\nresult\n<\/js>","intro":" {{@@class.train-number@text}}\n{{@@class.intro-collapse-content@text}}\n{{@@class.p-t-5 float-left@text##\u65e5\u671f}}    {{@@class.p-t-5 float-right@text##\u65e5\u671f}}\n{{@@class.col-xs-12 col-lg-7 nav-tab-content@class.p-t-5 p-b-5@text##\u53d9\u8ff0\uff1a|\u6558\u8ff0\uff1a}}","kind":"@js:\nvar text;\nif (baseUrl.indexOf('novel') !== -1){\n\ttext=java.getString('span[data-type=tags]@a@text');\n}else {\n\ttext=java.getString('#intro-block@[data-type=tags]@a@text');\n}\ntext;","name":"{{@@h1@text}}","tocUrl":"baseUrl","wordCount":"{{@class.train-number@text}}"},"ruleContent":{"content":"{{@class.novel-content@html}}\n{{@class.row thumb-overlay-albums@tag.img@data-original}}\n@js:var url = baseUrl\nif(baseUrl.indexOf(\"novel\") !== -1){\n\tresult\n\t} else {\n        var lines = result.split(\"\\n\");\n        var newLines = [];\n        for (var i = 0; i < lines.length; i++) {\n            newLines.push('<img src=\"' + lines[i] + '\">');\n        }\n        newLines.join(\"\\n\")\n}","imageDecode":"if (src.search(\"qyyuapi.com\") != -1) {\n    result;\n} else {\n    var Magua = new JavaImporter();\n    Magua.importPackage(Packages.java.io, Packages.android.graphics);\n    with(Magua) {\n        let mac = src.match(\/photos\\\/(\\d+)?\\\/(\\d+)?\/);\n        let bookId = mac[1];\n        let imgId = mac[2];\n        if (src.search(\"gif\") != -1 || Number(bookId) < 220980) {\n            result;\n        } else {\n            if (Number(bookId) > 421925) {\n                let md5 = java.md5Encode((bookId + imgId));\n                let ascii = md5.substr( - 1).charCodeAt(0);\n                var num = (ascii % 8 + 1) * 2;\n            } else if (Number(bookId) >= 268850) {\n                let md5 = java.md5Encode((bookId + imgId));\n                let ascii = md5.substr( - 1).charCodeAt(0);\n                var num = (ascii % 10 + 1) * 2;\n            } else {\n                var num = 10;\n            }\n            var img = BitmapFactory.decodeByteArray(result, 0, result.length);\n            var height = img.getHeight();\n            var width = img.getWidth();\n            var y = Math.floor(height \/ num);\n            var remainder = height % num;\n            var newImg = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);\n            let canvas = new Canvas(newImg);\n            for (let i = 1; i <= num; i++) {\n                let h = i === num ? remainder: 0;\n                canvas.drawBitmap(Bitmap.createBitmap(img, 0, y * (i - 1), width, y + h), 0, height - y * i - h, null);\n            }\n            var newbit = new ByteArrayOutputStream();\n            newImg.compress(Bitmap.CompressFormat.PNG, 100, newbit);\n            newbit.toByteArray();\n        }\n    }\n}","imageStyle":"FULL"},"ruleExplore":[],"ruleSearch":{"author":"@js:\nvar text;\nif (baseUrl.indexOf('novel') !== -1){\n\ttext=java.getString('.title-truncate.2@text');\n}else {\n\ttext=java.getString('.title-truncate.1@text');\n}\ntext;","bookList":".row.m-0 > .list-col","bookUrl":"tag.a.0@href","coverUrl":"img@data-original||img@src","intro":".video-title@text","kind":".tag@text","lastChapter":"@js:\nvar text;\nif (baseUrl.indexOf('novel') !== -1){\n\ttext=java.getString('.title-truncate.1@text');\n}else {\n\ttext=java.getString('');\n}\ntext;","name":"@js:\nif (baseUrl.match(\/novel_watchlist\/)){\ntext=java.getString('.title-truncate@text');\n} else if (baseUrl.match(\/favorite\/)){\ntext=java.getString('.image-item-text@text');\n}else {\ntext=java.getString('.video-title@text');\n}\ntext;","wordCount":"span.0@text##^##\ud83d\udc4d\ud83c\udffb"},"ruleToc":{"chapterList":"id.episode-block@class.episode@tag.a||class.read-block.0@tag.a","chapterName":"text","chapterUrl":"a@href"},"searchUrl":"https:\/\/18comic.vip\/search\/photos?search_query={{key}}&main_tag=0&o=mr&t=a","weight":0},{"bookSourceName":"ESJ Zone","bookSourceType":0,"bookSourceUrl":"https:\/\/www.esjzone.cc","bookUrlPattern":"https?:\/\/www.esjzone.one\/detail\/.*","customButton":false,"customOrder":0,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"eventListener":false,"exploreUrl":"@js:\nresult=[\n  {\n    'title': '>> \u4e2a\u4eba\u4e2d\u5fc3 <<',\n    'url': \"\",\n    'style':{\n      layout_flexGrow:1,\n      layout_flexBasisPercent:1\n    }\n  },\n  {\n    'title': \"\u6211\u7684\u6536\u85cf\",\n    'url': `\/my\/favorite`,\n    'style':{\n      layout_flexGrow:2,\n      layout_flexBasisPercent:0.25\n    \t}\n  },\n  {\n    'title': \"\u89c2\u770b\u8bb0\u5f55\",\n    'url': `\/my\/view`,\n    'style':{\n      layout_flexGrow:2,\n      layout_flexBasisPercent:0.25\n    \t}\n  }\n]\nhtml=org.jsoup.Jsoup.parse(java.ajax(source.bookSourceUrl+\"\/list-01\/\"))\ncategorys=html.select(\"#category option\")\nsortings=html.select(\"#sorting option\")\ncategorys.forEach(category => {\n  result.push({\n    'title': '>> ' + java.t2s(category.text()) + ' <<',\n    'url': \"\",\n    'style':{\n      layout_flexGrow:1,\n      layout_flexBasisPercent:1\n    }\n  })\n  sortings.forEach(sorting => {\n    result.push({\n      'title': java.t2s(sorting.text()),\n      'url':`\/list-${category.attr('value')}${sorting.attr('value')}\/{{page}}.html`,\n      'style':{\n        layout_flexGrow:2,\n        layout_flexBasisPercent:0.25\n      \t}\n    })\n  })\n})\nJSON.stringify(result)","lastUpdateTime":"1765653374081","loginUrl":"\/my\/profile.html","respondTime":180000,"ruleBookInfo":{"author":"class.list-unstyled mb-2 book-detail@tag.li.1@tag.a@text\n@js:\njava.t2s(result)","canReName":"true","coverUrl":"@css:div.col-md-3 > div > a > img@src","intro":"{{@@section.m-t-20@a.tag@text##(^|[\\n])##\ud83c\udff7\ufe0f}}\n{{'&lrm;'}}\n{{@@div.description@html}}\n@js:\njava.t2s(result)","kind":"\u5173\u6ce8\uff1a{{@css:.book-detail label:has(.icon-eye)@text}},\u559c\u6b22\uff1a{{@css:.book-detail label:has(.icon-heart)@text}}\n{{@@class.list-unstyled mb-2 book-detail@tag.li.-2@text##.+: }}\n{{@@class.list-unstyled mb-2 book-detail@tag.li.-1@text## .+}}","lastChapter":"@css:div[id = chapterList] >a:last-child@text\n@js:\njava.t2s(result)","name":"@css:div.col-md-9.book-detail > h2@text\n@js:\njava.t2s(result)","wordCount":"@css: .book-detail label:has(.icon-file-text)@text##,##"},"ruleContent":{"content":"@css:div.forum-content.mt-3,div[class =d_post_content j_d_post_content]@all\n@js:\njava.t2s(result)"},"ruleExplore":[],"ruleSearch":{"author":"class.card-author@tag.a@text\n@js:\njava.t2s(result)","bookList":"div.col-lg-3.col-md-4.col-sm-3.col-xs-6","bookUrl":"@css:div> div > div > h5 > a, .product-title > a@href","coverUrl":"class.main-img@class.lazyload@data-src\n@js:\nresult.match(\"empty\") ? \"\" : result","intro":"class.book-ep@div.-1@text\n@js:\njava.t2s(result)","kind":"{{@css:.column:has(.icon-star-s)@text}},\u5173\u6ce8\uff1a{{@css:.column:has(.icon-eye)@text}},\u559c\u6b22\uff1a{{@css:.column:has(.icon-heart)@text}},\u7fbd\u6bdb\uff1a{{@css:.column:has(.icon-feather)@text}},\u8bc4\u8bba\uff1a{{@css:.column:has(.icon-message-square)@text}}##(\\([^()]+)##\u661f$1\u4eba\n@js:\n!!result.split(\",\")[0] ? result : java.getString(\"class.book-update@text\")","lastChapter":"@css:div>div>div[class=card-ep mt-2], .book-ep a@text\n@js:\njava.t2s(result)","name":"@css: .card-title a, .product-title@text\n@js:\njava.t2s(result)","wordCount":"@css: .column:has(.icon-file-text)@text##,##"},"ruleToc":{"chapterList":"#chapterList@a[data-title], p.non, summary","chapterName":"text\n@js:\njava.t2s(result)","chapterUrl":"href","isVolume":"p.non@text||summary@text"},"searchUrl":"https:\/\/www.esjzone.one\/tags\/{{key}}","weight":0},{"bookSourceComment":"","bookSourceGroup":"","bookSourceName":"\u770b\u770b\u5f71\u9662","bookSourceType":0,"bookSourceUrl":"http:\/\/k9.9967.top\/","customOrder":127,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"@js:\n\nvar sort=[],\npush=(title,surl,size)=>sort.push({\n    title: title,\n    url: surl,\n    style: {\n      layout_flexGrow: 1,\n      layout_flexBasisPercent: size,\n     }\n  });\n  \npush(\"\u0f3a\u02c7\u00bb`\u029a\u6392\u884c\u699c\u025e\u00b4\u00ab\u02c7\u0f3b\",null,1,1); \n\n[\n[\"\u6708\u7968\u699c\",\"526080\"],\n[\"\u7545\u9500\u699c\",\"543064\"],\n[\"\u6f5c\u529b\u699c\",\"543065\"],\n[\"\u5b8c\u7ed3\u699c\",\"551072\"],\n[\"\u65b0\u4e66\u699c\",\"535331\"],\n[\"\u6bd4\u5fc3\u699c\",\"543074\"],\n[\"\u98d9\u5347\u699c\",\"543264\"],\n[\"\u63a8\u8350\u699c\",\"548111\"],\n[\"\u5c01\u795e\u699c\",\"514637\"],\n[\"\u4f1a\u5458\u65e5\u699c\",\"516604\"],\n[\"\u4f1a\u5458\u5468\u699c\",\"516605\"],\n[\"\u4f1a\u5458\u6708\u699c\",\"516606\"],\n[\"\u514d\u8d39\u7206\u6b3e\",\"543077\"],\n[\"\u514d\u8d39\u5b8c\u7ed3\",\"543395\"],\n[\"\u514d\u8d39\u98d9\u5347\",\"543085\"]\n].map([title,id]=>push(title, `https:\/\/commontgw.reader.qq.com\/v7_6_6\/listDispatch?action=rank&actionTag=boy&actionId=${id}&pagestamp={{page}}&rankFlag=1&plan=1&pageSize=200`,  0.25));\n  \n  \npush(\"\u0f3a\u02c7\u00bb`\u029a\u5206\u7c7b\u025e\u00b4\u00ab\u02c7\u0f3b\",null,1,1);  \n[\n[\"\u7384\u5e7b\",\"20001\"],\n[\"\u5947\u5e7b\",\"20005\"],\n[\"\u6b66\u4fa0\",\"20010\"],\n[\"\u4ed9\u4fa0\",\"20014\"],\n[\"\u90fd\u5e02\",\"20019\"],\n[\"\u73b0\u5b9e\",\"20065\"],\n[\"\u5386\u53f2\",\"20028\"],\n[\"\u519b\u4e8b\",\"20032\"],\n[\"\u6e38\u620f\",\"20050\"],\n[\"\u4f53\u80b2\",\"20054\"],\n[\"\u79d1\u5e7b\",\"20042\"],\n[\"\u60ac\u7591\",\"20037\"],\n[\"\u8f7b\u5c0f\u8bf4\",\"20059\"],\n[\"\u8bf8\u5929\u65e0\u9650\",\"20109\"],\n[\"\u77ed\u7bc7\",\"20076\"]\n].map([title,id]=>push(title, `https:\/\/commontgw.reader.qq.com\/v7_6_6\/book\/search?&bookLibraryAbFlag=2&booksort=1&actionTag=,-1,-1,-1,-1,13&actionId=${id}&action=categoryV2&pagestamp={{page}}&categoryFlag=6&signal=nextpage&searchFrom=${id}`,  0.25));\n \n  \n  \n  \n  \npush(\"\u0f3a\u02c7\u00bb`\u029a\u60c5\u8282\u4e3b\u9898\u025e\u00b4\u00ab\u02c7\u0f3b\",null,1,1);\n[\n    [\"\u7a7f\u8d8a\", \"9000722\"],\n    [\"\u4e1c\u65b9\u7384\u5e7b\", \"9000724\"],\n    [\"\u91cd\u751f\", \"9000837\"],\n    [\"\u73b0\u4ee3\u90fd\u5e02\", \"9000728\"],\n    [\"\u4fee\u4ed9\", \"9000817\"],\n    [\"\u6743\u8c0b\", \"9000774\"],\n    [\"\u5f02\u80fd\", \"9000823\"],\n    [\"\u5f02\u754c\", \"9000822\"],\n    [\"\u5a31\u4e50\u5708\", \"9000828\"],\n    [\"\u9006\u88ad\", \"9000775\"],\n    [\"\u4fee\u771f\", \"9000818\"],\n    [\"\u79cd\u7530\", \"9000838\"],\n    [\"\u7231\u60c5\", \"9000748\"],\n    [\"\u6e38\u620f\u5f02\u754c\", \"9000827\"],\n    [\"\u9ad8\u6b66\", \"9000739\"],\n    [\"\u9b54\u6cd5\", \"9000772\"],\n    [\"\u795e\u8bdd\", \"9000793\"],\n    [\"\u517b\u6210\", \"9000777\"],\n    [\"\u8be1\u79d8\", \"9000744\"],\n    [\"\u79d1\u4e3e\", \"9000760\"],\n    [\"\u672b\u4e16\", \"9000773\"],\n    [\"\u4fee\u7f57\u573a\", \"9000727\"],\n    [\"\u514b\u82cf\u9c81\", \"9001075\"],\n    [\"\u9274\u5b9d\", \"9000752\"],\n    [\"\u9ed1\u79d1\u6280\", \"9000746\"],\n    [\"\u6297\u6218\", \"9001010\"],\n    [\"LOL\", \"9001069\"],\n    [\"\u7535\u7ade\", \"9000723\"],\n    [\"\u5bd2\u95e8\u5b50\u5f1f\", \"9001015\"],\n    [\"\u6e38\u620f\u6587\", \"9001070\"],\n    [\"\u7f8e\u98df\", \"9000769\"],\n    [\"\u671d\u5802\u6c5f\u6e56\", \"9001002\"],\n    [\"\u840c\u5ba0\", \"9000770\"],\n    [\"\u5deb\u5e08\u6d41\", \"9001027\"],\n    [\"\u76db\u4e16\", \"9001030\"],\n    [\"\u519b\u5de5\", \"9001011\"],\n    [\"\u84b8\u6c7d\u670b\u514b\", \"9001076\"],\n    [\"\u5854\u9632\", \"9001072\"],\n    [\"\u7bee\u7403\", \"9000870\"],\n    [\"\u7b2c\u56db\u5929\u707e\", \"9001083\"],\n    [\"\u7b7e\u5230\", \"9000875\"],\n    [\"\u8352\u91ce\u6c42\u751f\", \"9001054\"],\n    [\"\u9ad8\u9f84\", \"9001044\"],\n    [\"\u4e61\u6751\", \"9001041\"],\n    [\"\u804a\u5929\u7fa4\", \"9000767\"],\n    [\"\u6218\u4e89\", \"9000830\"],\n    [\"\u5c0f\u5175\", \"9001012\"],\n    [\"\u76f4\u64ad\", \"9000834\"],\n    [\"\u6c14\u8fd0\u6d41\", \"9001032\"],\n    [\"\u786c\u79d1\u5e7b\", \"9000992\"],\n    [\"\u822a\u7a7a\", \"9001220\"],\n    [\"\u8d5b\u535a\u670b\u514b\", \"9000993\"],\n    [\"\u8db3\u7403\", \"9000871\"],\n    [\"\u63a2\u9669\", \"9000800\"],\n    [\"\u6c11\u4fd7\", \"9000990\"],\n    [\"\u4eba\u95f4\u767e\u6001\", \"9001046\"],\n    [\"\u519b\u65c5\", \"9000756\"],\n    [\"\u6b66\u4fa0\u5e7b\u60f3\", \"9001001\"],\n    [\"DND\", \"9001071\"],\n    [\"\u5e97\u4e3b\", \"9000989\"],\n    [\"\u7384\u5b66\", \"9000819\"],\n    [\"\u593a\u820d\", \"9000984\"],\n    [\"\u7a7f\u4e66\", \"9000985\"],\n    [\"\u5361\u724c\", \"9000757\"],\n    [\"\u4fa0\u5ba2\", \"9001004\"],\n    [\"\u79d1\u6280\u4fee\u771f\", \"9001078\"],\n    [\"\u673a\u7532\", \"9000742\"],\n    [\"\u4e2d\u5e74\", \"9001042\"],\n    [\"\u4e27\u5c38\", \"9001029\"],\n    [\"\u5c71\u6d77\u7ecf\", \"9001040\"],\n    [\"\u751f\u5b58\u6311\u6218\", \"9000988\"],\n    [\"\u8003\u53e4\", \"9001055\"],\n    [\"\u53f2\u8bd7\u5947\u5e7b\", \"9000797\"],\n    [\"\u5b97\u95e8\", \"9001003\"],\n    [\"\u4e3b\u795e\u521b\u4e16\", \"9001050\"],\n    [\"\u4e71\u4e16\", \"9001031\"],\n    [\"\u624b\u8db3\u60c5\u6df1\", \"9001045\"],\n    [\"\u5947\u5999\u5e7b\u60f3\", \"9000779\"],\n    [\"\u6276\u8d2b\", \"9001043\"],\n    [\"\u4f20\u7edf\u6b66\u4fa0\", \"9001000\"],\n    [\"\u5403\u9e21\", \"9001073\"],\n    [\"\u5bb6\u5ead\u4f26\u7406\", \"9001033\"],\n    [\"\u793e\u4f1a\u60ac\u7591\", \"9001048\"],\n    [\"\u77ed\u6545\u4e8b\", \"9000905\"],\n    [\"\u5973\u6027\u9898\u6750\", \"9001047\"]\n].map([title,id]=>push(title, `https:\/\/commontgw.reader.qq.com\/v7_6_6\/book\/search?action=tagV2&base_tagid=${id}&bookLibraryAbFlag=2&actionTag=-1,-1,-1,-1,-1,13&actionId=-1&pagestamp={{page}}&categoryFlag=6&signal=nextpage&searchFrom=${id}`,  0.25));\n  \n  \n  \npush(\"\u0f3a\u02c7\u00bb`\u029a\u884c\u6587\u6d41\u6d3e\u025e\u00b4\u00ab\u02c7\u0f3b\",null,1,1);\n[\n    [\"\u5929\u624d\u6d41\", \"9000802\"],\n    [\"\u7cfb\u7edf\u6d41\", \"9000814\"],\n    [\"\u65e0\u654c\u6d41\", \"9000809\"],\n    [\"\u7ecf\u8425\u6d41\", \"9000755\"],\n    [\"\u8bf8\u5929\u6d41\", \"9000839\"],\n    [\"\u5347\u7ea7\u6d41\", \"9000795\"],\n    [\"\u65e0\u9650\u6d41\", \"9000812\"],\n    [\"\u4e89\u9738\", \"9000833\"],\n    [\"\u51e1\u4eba\u6d41\", \"9000735\"],\n    [\"\u6d2a\u8352\u6d41\", \"9000747\"],\n    [\"\u8fdb\u5316\u6d41\", \"9000754\"],\n    [\"\u4e13\u4e1a\u6587\", \"9000999\"],\n    [\"\u5bcc\u6c11\", \"9001006\"],\n    [\"\u65f6\u7a7a\u6d41\", \"9000796\"],\n    [\"\u5f00\u5c40\u6d41\", \"9000759\"],\n    [\"\u5e55\u540e\u6d41\", \"9000996\"],\n    [\"\u804c\u4e1a\u6587\", \"9000835\"],\n    [\"\u5b66\u9662\u6d41\", \"9000821\"],\n    [\"\u53ec\u5524\u6d41\", \"9000832\"],\n    [\"\u795e\u533b\", \"9000824\"],\n    [\"\u6280\u672f\u6d41\", \"9000750\"],\n    [\"\u968f\u8eab\u6d41\", \"9000799\"],\n    [\"\u5546\u6218\", \"9001085\"],\n    [\"\u5e9f\u67f4\u6d41\", \"9000737\"],\n    [\"\u6781\u9053\u6d41\", \"9000749\"],\n    [\"\u5bb6\u65cf\", \"9001084\"],\n    [\"\u5f00\u6302\", \"9000758\"],\n    [\"\u60ac\u7591\u6d41\", \"9000820\"],\n    [\"\u4e92\u8054\u7f51\", \"9000997\"],\n    [\"\u5211\u4fa6\", \"9001079\"],\n    [\"\u4fa6\u63a2\u63a8\u7406\", \"9001080\"],\n    [\"\u5fa1\u517d\u6d41\", \"9001082\"],\n    [\"\u8d58\u5a7f\u6d41\", \"9000840\"],\n    [\"\u8f6e\u56de\u8005\", \"9001049\"],\n    [\"\u5f02\u517d\u6d41\", \"9000825\"],\n    [\"\u9a91\u58eb\u6d41\", \"9000780\"],\n    [\"\u638c\u95e8\u6d41\", \"9000831\"],\n    [\"\u5b66\u672f\", \"9001063\"],\n    [\"\u539f\u59cb\u6d41\", \"9000829\"],\n    [\"\u57fa\u5efa\u6d41\", \"9001007\"],\n    [\"\u62bd\u5956\", \"9001013\"],\n    [\"\u7956\u5b97\u6d41\", \"9001005\"],\n    [\"\u6c2a\u91d1\", \"9001014\"],\n    [\"\u7b56\u7565\u6d41\", \"9000998\"],\n    [\"\u5112\u9053\u6d41\", \"9000790\"],\n    [\"\u56fd\u672f\", \"9000745\"],\n    [\"\u7ba1\u7406\u5c40\", \"9001008\"]\n].map([title,id]=>push(title, `https:\/\/commontgw.reader.qq.com\/v7_6_6\/book\/search?action=tagV2&base_tagid=${id}&bookLibraryAbFlag=2&actionTag=-1,-1,-1,-1,-1,13&actionId=-1&pagestamp={{page}}&categoryFlag=6&signal=nextpage&searchFrom=${id}`,  0.25));\n\n\npush(\"\u0f3a\u02c7\u00bb`\u029a\u65f6\u7a7a\u80cc\u666f\u025e\u00b4\u00ab\u02c7\u0f3b\",null,1,1);\n[\n    [\"\u67b6\u7a7a\", \"9000751\"],\n    [\"\u5e74\u4ee3\u6587\", \"9000776\"],\n    [\"\u660e\u671d\", \"9001023\"],\n    [\"\u661f\u9645\", \"9000816\"],\n    [\"\u672a\u6765\", \"9000805\"],\n    [\"\u8d1e\u89c2\", \"9001021\"],\n    [\"\u79e6\u6c49\u4e09\u56fd\", \"9000782\"],\n    [\"\u7f8e\u6d32\", \"9001019\"],\n    [\"\u79e6\u6c49\", \"9001034\"],\n    [\"\u4e24\u664b\u968b\u5510\", \"9000765\"],\n    [\"\u5b8b\u671d\", \"9001022\"],\n    [\"\u5143\u5b87\u5b99\", \"9001077\"],\n    [\"\u6e05\u671d\", \"9001036\"],\n    [\"\u6b27\u6d32\", \"9001018\"],\n    [\"\u975e\u6d32\", \"9001020\"],\n    [\"\u5916\u56fd\u5386\u53f2\", \"9001016\"],\n    [\"\u4e94\u4ee3\u5341\u56fd\", \"9000808\"],\n    [\"\u4e0a\u53e4\u5148\u79e6\", \"9000792\"],\n    [\"\u6e05\u53f2\u6c11\u56fd\", \"9000784\"],\n    [\"\u6c11\u95f4\u4f20\u8bf4\", \"9001017\"]\n]\n.map([title,id]=>push(title, `https:\/\/commontgw.reader.qq.com\/v7_6_6\/book\/search?action=tagV2&base_tagid=${id}&bookLibraryAbFlag=2&actionTag=-1,-1,-1,-1,-1,13&actionId=-1&pagestamp={{page}}&categoryFlag=6&signal=nextpage&searchFrom=${id}`,  0.25));\n\n\n\npush(\"\u0f3a\u02c7\u00bb`\u029a\u89d2\u8272\u8eab\u4efd\u025e\u00b4\u00ab\u02c7\u0f3b\",null,1,1);  \n[\n    [\"\u81f3\u5c0a\u6d41\", \"9000863\"],\n    [\"\u660e\u661f\", \"9000852\"],\n    [\"\u541b\u738b\", \"9000851\"],\n    [\"\u8c0d\u6218\", \"9001058\"],\n    [\"\u592a\u76d1\", \"9001074\"],\n    [\"\u5973\u795e\", \"9000855\"],\n    [\"\u519c\u6c11\", \"9000842\"],\n    [\"\u6cd5\u5e08\", \"9000844\"],\n    [\"\u9053\u95e8\", \"9001039\"],\n    [\"\u8c0d\u6218\u7279\u5de5\", \"9001056\"],\n    [\"\u73a9\u5bb6\", \"9000858\"],\n    [\"NPC\", \"9001064\"],\n    [\"\u5b66\u9738\", \"9000873\"],\n    [\"\u7279\u79cd\u5175\", \"9001061\"],\n    [\"\u95e8\u9600\", \"9001026\"],\n    [\"\u76d7\u8d3c\", \"9001068\"],\n    [\"\u6218\u58eb\", \"9000877\"],\n    [\"\u5199\u624b\", \"9000859\"],\n    [\"\u5fa1\u5b85\u65cf\", \"9000861\"],\n    [\"\u548c\u5c1a\", \"9000879\"],\n    [\"\u4fdd\u5b89\", \"9000994\"],\n    [\"\u6740\u624b\", \"9001059\"],\n    [\"\u9526\u8863\u536b\", \"9000849\"],\n    [\"\u5927\u5e08\u5144\", \"9000878\"],\n    [\"\u4ed9\u541b\", \"9000864\"],\n    [\"\u795e\u5947\u751f\u7269\", \"9001028\"],\n    [\"\u7267\u5e08\", \"9001065\"],\n    [\"\u5973\u5c0a\", \"9000854\"],\n    [\"\u4e16\u5bb6\", \"9001025\"],\n    [\"\u5f13\u7bad\u624b\", \"9001066\"],\n    [\"\u4fdd\u9556\", \"9000995\"],\n    [\"\u5175\u738b\", \"9001057\"]\n].map([title,id]=>push(title, `https:\/\/commontgw.reader.qq.com\/v7_6_6\/book\/search?action=tagV2&base_tagid=${id}&bookLibraryAbFlag=2&actionTag=-1,-1,-1,-1,-1,13&actionId=-1&pagestamp={{page}}&categoryFlag=6&signal=nextpage&searchFrom=${id}`,  0.25));\n\n\n\npush(\"\u0f3a\u02c7\u00bb`\u029a\u89d2\u8272\u6027\u683c\u025e\u00b4\u00ab\u02c7\u0f3b\",null,1,1);\n[\n    [\"\u6740\u4f10\u679c\u65ad\", \"9000847\"],\n    [\"\u6210\u719f\", \"9000843\"],\n    [\"\u601d\u8def\u6e05\u5947\", \"9000845\"],\n    [\"\u8179\u9ed1\", \"9000874\"],\n    [\"\u626e\u732a\u5403\u864e\", \"9000719\"],\n    [\"\u81ea\u5f8b\", \"9000866\"],\n    [\"\u601d\u60f3\u8fea\u5316\", \"9001053\"],\n    [\"\u5634\u70ae\", \"9000867\"],\n    [\"\u94a2\u94c1\u76f4\u7537\", \"9000846\"]\n    ].map([title,id]=>push(title, `https:\/\/commontgw.reader.qq.com\/v7_6_6\/book\/search?action=tagV2&base_tagid=${id}&bookLibraryAbFlag=2&actionTag=-1,-1,-1,-1,-1,13&actionId=-1&pagestamp={{page}}&categoryFlag=6&signal=nextpage&searchFrom=${id}`,  0.25));\n\n\n\npush(\"\u0f3a\u02c7\u00bb`\u029a\u5185\u5bb9\u98ce\u683c\u025e\u00b4\u00ab\u02c7\u0f3b\",null,1,1);\n[\n    [\"\u8f7b\u677e\", \"9000785\"],\n    [\"\u70ed\u8840\", \"9000788\"],\n    [\"\u5feb\u8282\u594f\", \"9000762\"],\n    [\"\u641e\u7b11\", \"9000740\"],\n    [\"\u7fa4\u50cf\", \"9000787\"],\n    [\"\u6b63\u80fd\u91cf\", \"9000862\"],\n    [\"\u65e0\u91d1\u624b\u6307\", \"9000810\"],\n    [\"\u5355\u5973\u4e3b\", \"9000718\"],\n    [\"\u6821\u56ed\", \"9001035\"],\n    [\"\u65e0CP\", \"9000807\"],\n    [\"\u53cd\u5957\u8def\", \"9000736\"],\n    [\"\u7ea2\u5305\u6d41\", \"9001051\"],\n    [\"\u6cbb\u6108\", \"9000836\"],\n    [\"\u626e\u6f14\u6d41\", \"9001052\"],\n    [\"\u52b1\u5fd7\", \"9000764\"],\n    [\"\u9752\u6625\", \"9000783\"],\n    [\"\u591a\u5973\u4e3b\", \"9000729\"]\n].map([title,id]=>push(title, `https:\/\/commontgw.reader.qq.com\/v7_6_6\/book\/search?action=tagV2&base_tagid=${id}&bookLibraryAbFlag=2&actionTag=-1,-1,-1,-1,-1,13&actionId=-1&pagestamp={{page}}&categoryFlag=6&signal=nextpage&searchFrom=${id}`,  0.25));\n\n\n\n\n  \npush(\"\u0f3a\u02c7\u00bb`\u029a\u884d\u751f\u540c\u4eba\u025e\u00b4\u00ab\u02c7\u0f3b\",null,1,1);\n[\n    [\"\u540c\u4eba\u884d\u751f\", \"9000781\"],\n    [\"\u6597\u7f57\", \"9000732\"],\n    [\"\u6597\u7834\", \"9000731\"],\n    [\"\u7efc\u6f2b\", \"9000841\"],\n    [\"\u7ea2\u697c\", \"9000726\"],\n    [\"\u4e8c\u6b21\u5143\", \"9000730\"],\n    [\"\u4e09\u56fd\", \"9000791\"],\n    [\"\u5c01\u795e\", \"9000738\"],\n    [\"\u6c34\u6d52\", \"9000987\"],\n    [\"\u897f\u6e38\", \"9000815\"],\n    [\"\u6b66\u4fa0\u884d\u751f\", \"9000811\"],\n    [\"\u804a\u658b\", \"9000986\"],\n    [\"\u738b\u8005\u8363\u8000\", \"9000804\"]\n].map([title,id]=>push(title, `https:\/\/commontgw.reader.qq.com\/v7_6_6\/book\/search?action=tagV2&base_tagid=${id}&bookLibraryAbFlag=2&actionTag=-1,-1,-1,-1,-1,13&actionId=-1&pagestamp={{page}}&categoryFlag=6&signal=nextpage&searchFrom=${id}`,  0.25));\n\n\n\n\nJSON.stringify(sort);","header":"{\"User-Agent\": \"Mozilla\/5.0 (Linux; Android 13; 2211133C Build\/TKQ1.220905.001) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/135.0.0.0 Mobile Safari\/537.36\"}","lastUpdateTime":"1765944663296","loginUrl":"http:\/\/kkcc.top\/","respondTime":180000,"ruleBookInfo":{"author":"$.introinfo.book.author","coverUrl":"$.introinfo.book.coverUrl","intro":"&nbsp;\n\ud83d\udd70  \u66f4\u65b0\uff1a{{$.chapinfo.lastChapterUpdateTime##\\s.*}}\n\ud83c\udf1f  \u4e66\u67b6\uff1a{{$.introinfo..number##\\n.*}}\n\ud83c\udff7\ufe0f  \u6807\u7b7e\uff1a{{$.bookTags..tagshortname##\\n##\u00b7}}\n\ud83d\udcdc  \u7b80\u4ecb\uff1a\n{{$.introinfo.book.intro}}\n\ud83c\udf5a  \u4e66\u8bc4\uff1a\n\ud83d\udc64\uff1a{{$..commentlist..content##\\n##<p>\ud83d\udc64\uff1a}}##\\[emot.*\\]","kind":"{{$.introinfo..scoretext}}\n{{java.getString('$.introinfo.book.finished')==1?'\u5b8c\u7ed3':'\u8fde\u8f7d'}}\n{{$.cate2Info.cate2Name}}\n{{$.cate3Info.cate3Name}}\n{{$.chapinfo.lastChapterUpdateTime##\\s.*}}\n@js:result\n.replace(\/^(\\d\\.\\d)\/,'$1\u5206')","lastChapter":"{{$.introinfo.book.lastChapterName##\u6b63\u6587\u5377.|\u6b63\u6587.|VIP\u5377.|\u9ed8\u8ba4\u5377.|\u5377_|VIP\u7ae0\u8282.|\u514d\u8d39\u7ae0\u8282.|\u7ae0\u8282\u76ee\u5f55.|\u6700\u65b0\u7ae0\u8282.|[\\(\uff08\u3010].*?[\u6c42\u542b\u7406\u66f4\u8c22\u4e50\u53d1\u63a8\u7968\u76df\u8865\u52a0\u5b57].*?[\u3011\uff09\\)]}}\u2022{{$.chapinfo.lastChapterUpdateTime##\\s.*}}\n@js:result\n.replace(\"\u2022\u2022\",\"\")\n.replace(\/^(\\d+).\u7b2c\/,'\u7b2c')\n.replace(\/^(\\d+)[\u3001\uff0e]\u7b2c.+\u7ae0\/,'\u7b2c$1\u7ae0')\n.replace(\/^(\\d+)\u3001\\d+\u3001\/,'\u7b2c$1\u7ae0 ')\n.replace(\/^(\\d+)\u3001\\d+\/,'\u7b2c$1\u7ae0')\n.replace(\/^(\\d+)\u3001\/,'\u7b2c$1\u7ae0 ')\n.replace(\/^(\u7b2c.+\u7ae0)\\s?\u7b2c.+\u7ae0\/,'$1')\n.replace(\/\u7b2c\\s(.+)\\s\u7ae0\/,'\u7b2c$1\u7ae0')\n.replace(\/.*(chapter|Chapter)\\s?(\\d+)\\s?\/,'$1 $2 ')\n.replace(\/\\(.+\\)\/,'')\n.replace(\/\\[|\u3002\/,'')\n.replace(\/\u7b2c([\u96f6\u4e00\u4e8c\u4e24\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343]+)\u7ae0\/g,java.toNumChapter(result))\n##(\u7ae0)([^\\s]+)(\\s\u00b7)##$1 $2$3","name":"$.introinfo.book.title","tocUrl":"https:\/\/ubook.reader.qq.com\/api\/book\/chapter-list?bid={{$.introinfo.book.id}}","wordCount":"$.introinfo.book.totalwords"},"ruleContent":{"content":"$.data.content"},"ruleExplore":{"author":"$..author","bookList":"$..bookList..second[*]||$..bookList[*]","bookUrl":"https:\/\/detailadr.reader.qq.com\/v7_8_7\/nativepage\/book\/detail?bid={{$..bid}}","coverUrl":"$..bid\n@js:\nvar s = result\nfunction gt(s){\n\tlet a = s.slice(-3)\n\tif(a<10){\n\t\t\tn = s.slice(-1)\n\t\t}\n\telse if(a<100){\n\t\t\tn = s.slice(-2)\n\t\t}\n\telse{\n\t\t\tn = a\n\t\t}\n\treturn n\n}\n\"http:\/\/wfqqreader-1252317822.image.myqcloud.com\/cover\/\"+gt(s)+\"\/\"+s+\"\/b_\"+s+\".jpg\"","intro":"$..intro","kind":"{{$..catScore}}\n{{java.getString('$.finished')==1?'\u5b8c\u7ed3':'\u8fde\u8f7d'}}\n{{$..catel2name}}\n{{String(java.timeFormat(java.getString('$.updateTime')*1000)).replace(\/\\\/\/g,'-').replace(\/\\s.*\/,'').replace(\/1970\\-01\\-01\/,'')}}\n{{$..rank_value}}\n{{$..catel3name}}","lastChapter":"$..lastChapterName##\u6b63\u6587\u5377.|\u6b63\u6587.|VIP\u5377.|\u9ed8\u8ba4\u5377.|\u5377_|VIP\u7ae0\u8282.|\u514d\u8d39\u7ae0\u8282.|\u7ae0\u8282\u76ee\u5f55.|\u6700\u65b0\u7ae0\u8282.|[\\(\uff08\u3010].*?[\u6c42\u542b\u7406\u66f4\u8c22\u4e50\u53d1\u63a8\u7968\u76df\u8865\u52a0\u5b57].*?[\u3011\uff09\\)]\n@js:result\n.replace(\"\u2022\u2022\",\"\")\n.replace(\/^(\\d+).\u7b2c\/,'\u7b2c')\n.replace(\/^(\\d+)[\u3001\uff0e]\u7b2c.+\u7ae0\/,'\u7b2c$1\u7ae0')\n.replace(\/^(\\d+)\u3001\\d+\u3001\/,'\u7b2c$1\u7ae0 ')\n.replace(\/^(\\d+)\u3001\\d+\/,'\u7b2c$1\u7ae0')\n.replace(\/^(\u7b2c.+\u7ae0)\\s?\\d+\/,'$1')\n.replace(\/^(\\d+)\u3001\/,'\u7b2c$1\u7ae0 ')\n.replace(\/^(\u7b2c.+\u7ae0)\\s?\u7b2c.+\u7ae0\/,'$1')\n.replace(\/\u7b2c\\s(.+)\\s\u7ae0\/,'\u7b2c$1\u7ae0')\n.replace(\/.*(chapter|Chapter)\\s?(\\d+)\\s?\/,'$1 $2 ')\n.replace(\/\\(.+\\)\/,'')\n.replace(\/\\[|\u3002\/,'')\n.replace(\/\u7b2c([\u96f6\u4e00\u4e8c\u4e24\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343]+)\u7ae0\/g,java.toNumChapter(result))\n##(\u7ae0)([^\\s]+)(\\s\u00b7)##$1 $2$3","name":"$..title","wordCount":"$..totalWords"},"ruleSearch":{"author":"$.author","bookList":"$.data.books","bookUrl":"https:\/\/detailadr.reader.qq.com\/v7_8_7\/nativepage\/book\/detail?bid={{$.id}}","checkKeyWord":"\u6211\u7684\u6a21\u62df\u957f\u751f\u8def","coverUrl":"$.cover","intro":"$.intro","kind":"{{java.getString('$.finished')=='true'?'\u5b8c\u7ed3':'\u8fde\u8f7d'}}\n{{$..shortName##\u5c0f\u8bf4}}","name":"$.title","wordCount":"$.totalWords"},"ruleToc":{"chapterList":"$.data.chapters","chapterName":"title","chapterUrl":"<js>\nvar bid = baseUrl.match(\/\\d+\/);\njava.put('bid', bid);\n'https:\/\/wxmini.reader.qq.com\/api\/chapter\/content?bid='+bid+'&cid={{$.seq}}'\n<\/js>","isVip":"{{java.getString('$.free')=='true'?'false':'true'}}","updateTime":"$.publishTime##^##\u66f4\u65b0\u65f6\u95f4\uff1a"},"searchUrl":"api\/search?keywords={{key}}&pageIndex={{page}}&pageSize=20","weight":0},{"bookSourceComment":"","bookSourceGroup":"","bookSourceName":"\u591c\u8bfb\u96c6\u5c0f\u8bf4","bookSourceType":0,"bookSourceUrl":"https:\/\/www.yeduji.com","customOrder":19,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"@js:\nfunction getCategories() {\n    \/\/ \u83b7\u53d6\u6807\u7b7e\u5206\u7c7b\n    let tagHtml = java.ajax(\"https:\/\/www.yeduji.com\/tags\/\");\n    let tagDoc = org.jsoup.Jsoup.parse(tagHtml);\n    let tagList = tagDoc.select(\".tag-list li a\");\n    \n    let tags = Array.from(tagList, (a) => ({\n        \"title\": a.ownText().trim(),\n        \"url\": a.attr(\"href\") + \"{{page}}.html\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    }));\n\n    \/\/ \u83b7\u53d6\u5206\u7c7b\u76ee\u5f55\n    let catHtml = java.ajax(\"https:\/\/www.yeduji.com\/categories\/\");\n    let catDoc = org.jsoup.Jsoup.parse(catHtml);\n    let catList = catDoc.select(\".category-list li a\");\n    \n    let categories = Array.from(catList, (a) => ({\n        \"title\": a.ownText().trim(),\n        \"url\": a.attr(\"href\") + \"?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    }));\n\n    \/\/ \u6dfb\u52a0\u5b8c\u672c\u5c0f\u8bf4\u548c\u70ed\u95e8\u5c0f\u8bf4\n    let additionalCategories = [\n        {\n            \"title\": \"\u5b8c\u672c\u5c0f\u8bf4\",\n            \"url\": \"https:\/\/www.yeduji.com\/rank\/complete\/{{page}}.html\",\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.25\n            }\n        },\n        {\n            \"title\": \"\u70ed\u95e8\u5c0f\u8bf4\",\n            \"url\": \"https:\/\/www.yeduji.com\/rank\/hot\/{{page}}.html\",\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.25\n            }\n        }\n    ];\n\n    \/\/ \u5408\u5e76\u6240\u6709\u6570\u7ec4\n    let allCategories = tags.concat(categories, additionalCategories);\n    \n    return JSON.stringify(allCategories);\n}\n\n\/\/ \u6267\u884c\u5e76\u8fd4\u56de\u7ed3\u679c\ngetCategories();","lastUpdateTime":"1765949324404","loginUi":"[\n    {\n    \t\"name\": \"\u8d26\u53f7\", \n    \t\"type\": \"text\"\n    \t},\n    {\n    \t\"name\": \"\u5bc6\u7801\", \n    \"type\": \"text\"\n    }\n]","loginUrl":"function login() {\n    try {\n        var url = baseUrl.replace(\/\\\/+$\/, '').replace(\/[^\\w.:\/-]\/g, '');\n        var ur = source.getLoginInfoMap();\n        var params = `username=${ur.get(\"\u8d26\u53f7\")}&password=${ur.get(\"\u5bc6\u7801\")}`;\n        var r = java.post(`${url}\/api\/login.php`, params, {\"method\": \"POST\"});\n\n        \/\/ \u89e3\u6790\u54cd\u5e94\u4f53\n        var resp = JSON.parse(r.body());\n        \n        \/\/ \u5904\u7406\u767b\u5f55\u7ed3\u679c\n        if (resp.success) {\n            const cookies = Array.from(r.cookies(), \n    ([k, v]) => `${k}=${v}`).join(';');\n            return source.putLoginHeader(JSON.stringify({Cookie: cookies}));\n        } else {\n            throw new Error(`\u767b\u5f55\u5931\u8d25: ${resp.message || '\u672a\u77e5\u9519\u8bef'}`);\n        }\n    } catch (e) {\n        java.log(`\u767b\u5f55\u5f02\u5e38: ${e.message}\\n\u8bf7\u6c42\u53c2\u6570: ${params}`);\n        throw e;\n    }\n}","respondTime":180000,"ruleBookInfo":{"author":"p.0@text","coverUrl":".cover.0@img@src","intro":".desc@text","kind":"p.1@text&&p.2:3@a@text##\u72b6\u6001\uff1a","name":"h1@text","tocUrl":"\n\/\/div[@class='chapter-more']\/a\/@href"},"ruleContent":{"content":".content@html"},"ruleExplore":{"author":"span.0@text","bookList":".novel-list@a","bookUrl":"a@href","coverUrl":"img.0@data-src","name":"h4.0@text"},"ruleReview":[],"ruleSearch":{"author":"span@text","bookList":".novel-item","bookUrl":"a@href","coverUrl":"img@data-src","intro":"p@text","name":"a@text"},"ruleToc":{"chapterList":".chapter-list@a","chapterName":"text","chapterUrl":"href"},"searchUrl":"\/search\/?q={{key}}&page={{page}}","weight":0},{"bookSourceName":"\u7231\u4e0b\u7535\u5b50\u4e66","bookSourceType":0,"bookSourceUrl":"https:\/\/ixdzs.tw\/","customButton":false,"customOrder":1,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"eventListener":false,"lastUpdateTime":"1766094604269","respondTime":180000,"ruleBookInfo":{"tocUrl":"{{java.put(\"url\",baseUrl);\n\t\"https:\/\/ixdzs.tw\/novel\/clist\/\"}},{\n  \"body\": \"bid={{baseUrl.match(\/(\\d+).$\/)[1]}}\",\n  \"method\": \"POST\"\n}"},"ruleContent":{"content":".page-content@p@text"},"ruleExplore":[],"ruleSearch":{"author":".bauthor@a@text","bookList":".burl","bookUrl":".bname@a@href","coverUrl":".l-img@img@src","intro":".l-p2@text","kind":".lz@text&&.l-time@text","lastChapter":".l-last@a@text","name":".bname@a@text","wordCount":".size@text"},"ruleToc":{"chapterList":"$.data","chapterName":"$.title","chapterUrl":"@get:{url}p{{$.ordernum}}.html","isVolume":"$.ctype"},"searchUrl":"https:\/\/ixdzs.tw\/bsearch?q={{key}}","weight":0},{"bookSourceName":"\u5fc5\u53bb\u8bfb\u4e66\u5e93","bookSourceType":0,"bookSourceUrl":"http:\/\/m.biqugei.org","customButton":false,"customOrder":922,"enabled":true,"enabledCookieJar":true,"enabledExplore":false,"eventListener":false,"header":"{\n  \"User-Agent\": \"Mozilla\/5.0 (Windows NT 10.0; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko, By Black Prism) Chrome\/99.0 Safari\/537.36\"\n}","lastUpdateTime":"1766178686452","respondTime":180000,"ruleBookInfo":{"tocUrl":"a.ptm-btn-outlined@href"},"ruleContent":{"content":"div.chaptercontent@html","nextContentUrl":"a.ptm-btn-primary:contains(\u4e0b\u4e00\u9875)@href","replaceRegex":"##\u6700\u65b0\u7f51\u5740\uff1am\\.biqugei\\.org|\u7b2c[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u96f6\\d]+\u7ae0[^\\n\\r]*|[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u96f6\\d]+\uff1a[^\\n\\r]*|\\d+[^\\n\\r\uff08]*\uff08[^\uff09]*\uff09|\\d+[^\\n\\r\\d\uff08]{2,}|\\(\u7b2c\\d+\/\\d+\u9875\\)|\uff08\u672c\u7ae0\u672a\u5b8c\uff0c\u8bf7\u70b9\u51fb\u4e0b\u4e00\u9875\u7ee7\u7eed\u9605\u8bfb\uff09##"},"ruleExplore":[],"ruleSearch":{"author":"div.pt-info:contains(\u4f5c\u8005:) a@text","bookList":"div.baseinfo","bookUrl":"@href","coverUrl":"div.baseinfo img@src","kind":"div.pt-info:contains(\u5206\u7c7b:) a@text","name":"h1.pt-name a@text"},"ruleToc":{"chapterList":"ul.ptm-list-view li","chapterName":"a@text","chapterUrl":"a@href","nextTocUrl":".ptm-card-footer a:contains(\u4e0b\u4e00\u9875)@href"},"searchUrl":"http:\/\/m.biqugei.org\/search.html?searchkey={{key}}","weight":0},{"ruleExplore":{"author":"tag.li.1@text##\u4f5c\u8005\uff1a","bookList":"class.novel_cell","intro":"tag.li.2@text##\u7c21\u4ecb\uff1a","coverUrl":"amp-img@src","kind":"","bookUrl":"tag.a.0@href","name":"h3@text"},"bookSourceType":0,"ruleSearch":{"author":"tag.li.1@text","bookList":"class.pure-u-1-1 pure-u-xl-1-3 pure-u-lg-1-3 pure-u-md-1-2 novel_cell","intro":"tag.li.2@text","coverUrl":"amp-img@src","kind":"","bookUrl":"tag.a@href","name":"h3@text"},"bookUrlPattern":"https:\/\/ttks\\.tw\/novel\/chapters\/.+?\/index\\.html","respondTime":180000,"ruleContent":{"content":"class.content@p@textNodes","replaceRegex":"##\u3010\u8a18\u4f4f.*\u8d85\u9760\u8b5c \u3011|\u5929\u5929\u770b\u5c0f\u8aaa.+\u8d85\u9760\u8b5c"},"searchUrl":"\/novel\/search?q={{key}}","weight":0,"enabledExplore":true,"bookSourceComment":"","ruleToc":{"chapterName":"text","chapterUrl":"href","chapterList":"class.chapters_frame@class.pure-g@class.chapter_cell@tag.a"},"enabled":true,"bookSourceUrl":"https:\/\/ttks.tw\/","lastUpdateTime":"1766204923645","bookSourceName":"\u5929\u5929\u770b\u5c0f\u8bf4\ud83e\ude9c","exploreUrl":"\u9023\u8f09::\/novel\/class\/lianzai\n\u7384\u5e7b::\/novel\/class\/xuanhuan\n\u90fd\u5e02::\/novel\/class\/dushi\n\u4ed9\u4fe0::\/novel\/class\/wuxia\n\u8a00\u60c5::\/novel\/class\/yaniqng\n\u904a\u6232::\/novel\/class\/youxi\n\u79d1\u5e7b::\/novel\/class\/kehuan\n\u61f8\u7591::\/novel\/class\/kongbu\n\u9748\u7570::\/novel\/class\/lingyi\n\u8ecd\u4e8b::\/novel\/class\/lishi\n\u73fe\u8a00::\/novel\/class\/tongren\n\u5176\u5b83::\/novel\/class\/qita","customOrder":19,"ruleBookInfo":{"author":"tag.li.2@a@text","tocUrl":"baseUrl","lastChapter":"class.near_chapter@all","intro":"p@text","coverUrl":"class.novel_info@amp-img@src","kind":"tag.li.2@text##\u985e\u5225\uff1a","name":"h1@text"}},{"bookSourceType":0,"bookSourceUrl":"https:\/\/m.baicaolu.com","bookSourceName":"\u767e\u8349\u9732\u5c0f\u8bf4","bookSourceGroup":"\u5c0f\u8bf4\u7f51\u7ad9","bookSourceComment":"\u5168\u672c\u5c0f\u8bf4\u5168\u6587\u9605\u8bfb\uff0c\u6700\u65b0\u70ed\u95e8\u7f51\u7edc\u5c0f\u8bf4\u514d\u8d39\u9605\u8bfb","loginUrl":"","header":"{\"User-Agent\": \"Mozilla\/5.0 (Linux; Android 10; K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/120.0.0.0 Mobile Safari\/537.36\"}","bookUrlPattern":"","searchUrl":"\/search.html, {\"method\": \"POST\", \"body\": \"s={{key}}\"}","exploreUrl":"\/::\u5c01\u9762\u63a8\u8350||\/::\u7384\u5e7b\u4fee\u771f||\/::\u91cd\u751f\u7a7f\u8d8a||\/::\u90fd\u5e02\u79d1\u5e7b||\/::\u6050\u6016\u7075\u5f02||\/::\u5973\u751f\u8a00\u60c5||\/::\u7efc\u5408\u5176\u4ed6","enabled":true,"enabledExplore":true,"weight":0,"customOrder":0,"lastUpdateTime":"1766418277673","respondTime":0,"ruleSearch":{"bookList":"dl.rec-focus-book, dl.sort-book-first, ul.sort-book-list li","name":"h2>a@text||h4>a@text||a@text","author":"dd>p:first-child@text##\u4f5c\u8005\uff1a\\s*(.*)##||span@text","bookUrl":"dt>a@href||dt>a@href||a@href","coverUrl":"dt>img@src||dt>img@src","intro":"dd>p:last-child@text"},"ruleExplore":{"\u5c01\u9762\u63a8\u8350":{"list":"dl.rec-focus-book","name":"h2>a@text","author":"dd>p:first-child@text##\u4f5c\u8005\uff1a\\s*(.*)##","bookUrl":"dt>a@href","coverUrl":"dt>img@src","intro":"dd>p:last-child@text"},"\u7384\u5e7b\u4fee\u771f":{"list":".wrap-box:nth-of-type(2) .sort-book-first, .wrap-box:nth-of-type(2) .sort-book-list li","name":"h4>a@text||a@text","author":"dd>p:first-child@text##\u4f5c\u8005\uff1a\\s*(.*)##||span@text","bookUrl":"dt>a@href||a@href","coverUrl":"dt>img@src"},"\u91cd\u751f\u7a7f\u8d8a":{"list":".wrap-box:nth-of-type(3) .sort-book-first, .wrap-box:nth-of-type(3) .sort-book-list li","name":"h4>a@text||a@text","author":"dd>p:first-child@text##\u4f5c\u8005\uff1a\\s*(.*)##||span@text","bookUrl":"dt>a@href||a@href","coverUrl":"dt>img@src"},"\u90fd\u5e02\u79d1\u5e7b":{"list":".wrap-box:nth-of-type(4) .sort-book-first, .wrap-box:nth-of-type(4) .sort-book-list li","name":"h4>a@text||a@text","author":"dd>p:first-child@text##\u4f5c\u8005\uff1a\\s*(.*)##||span@text","bookUrl":"dt>a@href||a@href","coverUrl":"dt>img@src"},"\u6050\u6016\u7075\u5f02":{"list":".wrap-box:nth-of-type(5) .sort-book-first, .wrap-box:nth-of-type(5) .sort-book-list li","name":"h4>a@text||a@text","author":"dd>p:first-child@text##\u4f5c\u8005\uff1a\\s*(.*)##||span@text","bookUrl":"dt>a@href||a@href","coverUrl":"dt>img@src"},"\u5973\u751f\u8a00\u60c5":{"list":".wrap-box:nth-of-type(6) .sort-book-first, .wrap-box:nth-of-type(6) .sort-book-list li","name":"h4>a@text||a@text","author":"dd>p:first-child@text##\u4f5c\u8005\uff1a\\s*(.*)##||span@text","bookUrl":"dt>a@href||a@href","coverUrl":"dt>img@src"},"\u7efc\u5408\u5176\u4ed6":{"list":".wrap-box:nth-of-type(7) .sort-book-first, .wrap-box:nth-of-type(7) .sort-book-list li","name":"h4>a@text||a@text","author":"dd>p:first-child@text##\u4f5c\u8005\uff1a\\s*(.*)##||span@text","bookUrl":"dt>a@href||a@href","coverUrl":"dt>img@src"}},"ruleBookInfo":{"name":"h2>a@text||h4>a@text||h1@text","author":"dd>p:first-child@text##\u4f5c\u8005\uff1a\\s*(.*)##","coverUrl":"dt>img@src","intro":"dd>p:last-child@text","tocUrl":"dt>a@href||a@href","lastChapter":"","updateTime":""},"ruleToc":{"chapterList":".listmain dd a, .chapterlist a, ul.list a","chapterName":"@text","chapterUrl":"@href","updateTime":"","nextTocUrl":"a:contains(\u4e0b\u4e00\u9875)@href||a:contains(\u4e0b\u4e00\u7ae0)@href"},"ruleContent":{"content":"div.content@html||div#content@html||div.novel-content@html##<script[^>]*>.*?<\/script>|<style[^>]*>.*?<\/style>|<div[^>]*class=\"ads[^\"]*\"[^>]*>.*?<\/div>|<a[^>]*>.*?<\/a>|<img[^>]*>|&nbsp;"}},{"bookSourceComment":"\u6f2b\u753b\u53d1\u5e03\u9875\uff1ahttps:\/\/wn01.link\/\n1\u20e3\ufe0f\u65e0\u9700\u7ffb\u5899\uff0c\u56fd\u5185\u76f4\u8fde\uff0c\u4e0d\u80fd\u7528\u4e86\uff0c\u5728\u53d1\u5e03\u9875\u5c1d\u8bd5\u5bfb\u627e\u6b63\u5e38\u57df\u540d\u66ff\u6362\n2\u20e3\ufe0f\u82e5\u8fd8\u4e0d\u884c\uff0c\u53ef\u80fd\u662f\u4e66\u6e90\u7f51\u7ad9\u88ab\u4e2d\u56fd\u79fb\u52a8\u5c4f\u853d\u4e86\uff0c\u7ffb\u5899\u770b","bookSourceGroup":"\u6f2b\u753b,\ud83c\udf38\u6f2b\u753b","bookSourceName":"\ud83c\udf38\u7ec5\u58eb\u6f2b\u753b","bookSourceType":2,"bookSourceUrl":"https:\/\/www.wn06.ru\/","customOrder":446,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"[\n  {\n    \"title\": \"\ud83d\udd16\u6392\u884c\ud83d\udd16\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n    },\n  {\n    \"title\": \"\u6708\u699c\",\n    \"url\": \"https:\/\/www.wn06.ru\/albums-favorite_ranking-page-{{page}}-type-month.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u5468\u699c\",\n    \"url\": \"https:\/\/www.wn06.ru\/albums-favorite_ranking-page-{{page}}-type-week.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n {\n    \"title\": \"\u65e5\u699c\",\n    \"url\": \"https:\/\/www.wn06.ru\/albums-favorite_ranking-page-{{page}}-type-day.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n    {\n    \"title\": \"\ud83d\udd16\u540c\u4eba\u5fd7\ud83d\udd16\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n    },\n  {\n    \"title\": \"\u521b\u5efa\u65f6\u95f4\",\n    \"url\": \"https:\/\/www.wn06.ru\/albums-index-page-{{page}}-cate-1.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u4e0a\u4f20\u65f6\u95f4\",\n    \"url\": \"https:\/\/www.wn06.ru\/albums-index-page-{{page}}-cate-1.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n {\n    \"title\": \"\u56fe\u7247\u6570\",\n    \"url\": \"https:\/\/www.wn06.ru\/albums-index-page-{{page}}-cate-1.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\ud83d\udd16\u97e9\u6f2b\ud83d\udd16\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n    },\n  {\n    \"title\": \"\u521b\u5efa\u65f6\u95f4\",\n    \"url\": \"https:\/\/www.wn06.ru\/albums-index-page-{{page}}-cate-20.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u4e0a\u4f20\u65f6\u95f4\",\n    \"url\": \"https:\/\/www.wn06.ru\/albums-index-page-{{page}}-cate-20.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n {\n    \"title\": \"\u56fe\u7247\u6570\",\n    \"url\": \"https:\/\/www.wn06.ru\/albums-index-page-{{page}}-cate-20.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n\n  {\n    \"title\": \"\ud83d\udd16\u5355\u884c\u672c\ud83d\udd16\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n    },\n  {\n    \"title\": \"\u521b\u5efa\u65f6\u95f4\",\n    \"url\": \"https:\/\/www.wn06.ru\/albums-index-page-{{page}}-cate-9.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u4e0a\u4f20\u65f6\u95f4\",\n    \"url\": \"https:\/\/www.wn06.ru\/albums-index-page-{{page}}-cate-9.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n {\n    \"title\": \"\u56fe\u7247\u6570\",\n    \"url\": \"https:\/\/www.wn06.ru\/albums-index-page-{{page}}-cate-9.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\ud83d\udd16\u6742\u5fd7&\u77ed\u7bc7\ud83d\udd16\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n    },\n  {\n    \"title\": \"\u521b\u5efa\u65f6\u95f4\",\n    \"url\": \"https:\/\/www.wn06.ru\/albums-index-page-{{page}}-cate-10.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u4e0a\u4f20\u65f6\u95f4\",\n    \"url\": \"https:\/\/www.wn06.ru\/albums-index-page-{{page}}-cate-10.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n {\n    \"title\": \"\u56fe\u7247\u6570\",\n    \"url\": \"https:\/\/www.wn06.ru\/albums-index-page-{{page}}-cate-10.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  }\n]","header":"@js:\nJSON.stringify({\n  \"User-Agent\": \"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/142.0.0.0 Safari\/537.36\",\n  \"Referer\": baseUrl,\n  \"Accept-Language\": \"zh-CN,zh;q=0.9\"\n})","lastUpdateTime":"1766652793999","respondTime":180000,"ruleBookInfo":{"coverUrl":"\/\/div[@class='asTB']\/div[@class='asTBcell uwthumb']\/img\/@src##\/\/\/\/##https:\/\/","downloadUrls":"\/\/div[@id='ads']\/a[1]\/@href","intro":"\/\/div[@class='asTBcell uwconn']\/p\/text()@js:result.split('\\n').join('')","kind":"\/\/div[@class='addtags']\/a[@class='tagshow']\/text()","wordCount":"\/\/div[@class='asTBcell uwconn']\/label\/text()@js:\nconst infoSplit =  result.split('\\n')\nconst info = []\nfor(var i  = 0;i<infoSplit .length;i++){\ninfo.push(infoSplit[i].split('\uff1a')[1])\n}\ninfo.join('  ')"},"ruleContent":{"content":"\/\/span[@id='imgarea']\/a\/img\/@src##\/\/##https:\/\/@js:\n\nvar server = result.match(\/img(\\d+)\/g)\n\/\/\u5339\u914d\u51fa\u6570\u7ec4\uff0c\u8fdb\u884c\u4fee\u590d\nif(server.length>1){\nserver = server[0]\n}\n\n\/\/ \u83b7\u53d6\u524d\u7f00URL\uff0c\u6ce8\u610fwnimg1\u53ef\u80fd\u53d8\u6362\nconst regexStr = \"^https:\/\/\"+server+\"\\\\.wnimg1\\\\.ru\/data\/\\\\d+\/\\\\d+\/\";\nconst regex = new RegExp(regexStr, \"g\");\nconst prefixUrlMatch = result.match(regex);\nconst prefixUrl = prefixUrlMatch ? prefixUrlMatch[0] : \"\";\n\n\/\/ \u89e3\u6790\u56fe\u7247\u4fe1\u606f\u6570\u7ec4\uff08\u5bb9\u9519\uff1a\u6570\u7ec4\u4e3a\u7a7a\u65f6\u8bbe\u4e3a[]\uff09\nconst imgInfoList = JSON.parse(java.get('imgInfoList') || '[]');\n\n\/\/ \u62fc\u63a5\u5b8c\u6574\u56fe\u7247\u94fe\u63a5\uff08\u76f4\u63a5\u4f7f\u7528\u539f\u59cbimgName\uff09\nconst imgUrlList = [];\nif (prefixUrl) {\n    imgInfoList.forEach(item => {\n        \/\/ \u4ec5\u505a\u7a7a\u503c\u5bb9\u9519\uff0c\u4e0d\u4fee\u6539imgName\u539f\u59cb\u503c\n        const imgName = item.imgName || '';\n        const imgExtension = item.imgExtension || 'jpg';\n        const fullImgUrl = prefixUrl + imgName + \".\" + imgExtension;\n        imgUrlList.push(fullImgUrl);\n    });\n}\n\n\/\/ \u89c4\u5219\u8f93\u51fa\u62fc\u63a5\u540e\u7684img\u6807\u7b7e\nimgUrlList.map(x=>'<img src=\\\"'+x+'\\\">')\n.join(\"\\n\")","imageStyle":"FULL"},"ruleExplore":{"bookList":"\/\/div[@class='gallary_wrap']\/ul\/li","bookUrl":"\/\/div[@class='info']\/div[@class='title']\/a\/@href,{\"webView\":true}","coverUrl":"\/\/li\/div[1]\/a\/img\/@src","kind":"\/\/div[@class='pic_box']\/div[2]\/text()|\/\/div[@class='info']\/div[@class='info_col']\/text()","name":"\/\/div[@class='info']\/div[@class='title']\/a\/\/text()@js:\nconst bookname= result.split('\\n').join('').replace(\/^.*?]\/g, '')\nbookname"},"ruleSearch":{"bookList":"\/\/div[@class='gallary_wrap']\/ul\/li","bookUrl":"\/\/div[@class='info']\/div[@class='title']\/a\/@href,{\"webView\":true}","checkKeyWord":"\u5143\u9b54\u6cd5","coverUrl":"\/\/li\/div[1]\/a\/img\/@src","intro":"\/\/li\/div[@class='info']\/div[@class='info_col']\/text()@js:\nvar timeStr = result.split(\"\uff0c\")[1] || \"\";\nvar updateTime = timeStr.match(\/\u5275\u5efa\u65bc(\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2})\/)?.[1] || \"\u65e0\u65f6\u95f4\";\n'\u66f4\u65b0\u65f6\u95f4:  ' + updateTime;","kind":"\/\/li\/div[1]\/@class@js:\nvar pages =java.getString(\"\/\/li\/div[@class='info']\/div[@class='info_col']\/text()\")\nvar imgNum = pages.split(\"\uff0c\")[0].match(\/\\d+(?=\u5f35\u5716\u7247)\/g)[0]\nif (result[0].indexOf('cate-1') !== -1) { \n    '\u7ec5\u58eb\u6f2b\u753b,\u540c\u4eba\u5fd7\/\u6c49\u5316,'+imgNum+'\u9875';\n} else if (result[0].indexOf('cate-12') !== -1) {\n    '\u7ec5\u58eb\u6f2b\u753b,\u540c\u4eba\u5fd7\/\u65e5\u8bed,'+imgNum+'\u9875'; \n} else if (result[0].indexOf('cate-9') !== -1) {\n    '\u7ec5\u58eb\u6f2b\u753b,\u5355\u884c\u672c\/\u6c49\u5316,'+imgNum+'\u9875';\n} else if (result[0].indexOf('cate-13') !== -1) {\n    '\u7ec5\u58eb\u6f2b\u753b,\u5355\u884c\u672c\/\u65e5\u8bed,'+imgNum+'\u9875';\n} else if (result[0].indexOf('cate-10') !== -1) {\n    '\u7ec5\u58eb\u6f2b\u753b,\u6742\u5fd7&\u77ed\u7bc7\/\u6c49\u5316,'+imgNum+'\u9875';\n} else if (result[0].indexOf('cate-14') !== -1) {\n    '\u7ec5\u58eb\u6f2b\u753b,\u6742\u5fd7&\u77ed\u7bc7\/\u65e5\u8bed,'+imgNum+'\u9875';\n} else if (result[0].indexOf('cate-18') !== -1) {\n     '\u7ec5\u58eb\u6f2b\u753b,\u6742\u5fd7&\u77ed\u7bc7\/English,'+imgNum+'\u9875';\n} else if (result[0].indexOf('cate-20') !== -1) {\n    '\u7ec5\u58eb\u6f2b\u753b,\u97e9\u6f2b\/\u6c49\u5316,'+imgNum+'\u9875';\n} else if (result[0].indexOf('cate-21') !== -1) {\n    '\u7ec5\u58eb\u6f2b\u753b,\u97e9\u6f2b\/\u751f\u8089,'+imgNum+'\u9875';\n} else {\n    '\u7ec5\u58eb\u6f2b\u753b,'+imgNum+'\u9875'; \n}","name":"\/\/div[@class='info']\/div[@class='title']\/a\/\/text()@js:\nconst bookname= result.split('\\n').join('').replace(\/^.*?]\/g, '')\nbookname"},"ruleToc":{"chapterList":"\/\/div[@class='gallary_wrap tb']\/ul\/li[1]@js:\nvar imgInfoList = [];\nvar nextPageUrl = [];\n\n\n\/\/ === \u751f\u6210\u5b8c\u6574\u5206\u9875\u5217\u8868 ===\n\n\/\/ 1. \u83b7\u53d6\u5206\u9875\u533a\u7684\u6240\u6709\u94fe\u63a5\u5b57\u7b26\u4e32\nvar paginatorHrefs = java.getString(\"\/\/div[@class='f_left paginator']\/\/a\/@href\") || \"\";\n\n\/\/ 2. \u521d\u59cb\u5316\u53d8\u91cf\nvar maxPage = 1;\nvar aid = \"\";\nvar urlPattern = \/page-(\\d+)-aid-(\\d+)\/; \/\/ \u5339\u914d page-\u6570\u5b57-aid-\u6570\u5b57\n\n\/\/ 3. \u904d\u5386\u94fe\u63a5\u627e\u5230\u201c\u6700\u5927\u9875\u7801\u201d\u548c\u201c\u76f8\u518cID\u201d\n\/\/ \u5206\u5272\u5b57\u7b26\u4e32\u5e76\u8fc7\u6ee4\u7a7a\u884c\nvar links = paginatorHrefs.split('\\n');\nfor (var i = 0; i < links.length; i++) {\n    var link = links[i].trim();\n    var match = link.match(urlPattern);\n    \n    if (match) {\n        var pageNum = parseInt(match[1]); \/\/ \u63d0\u53d6\u9875\u7801\n        var currentAid = match[2];        \/\/ \u63d0\u53d6AID\n        \n        \/\/ \u66f4\u65b0\u6700\u5927\u9875\u7801\n        if (pageNum > maxPage) {\n            maxPage = pageNum;\n        }\n        \/\/ \u63d0\u53d6AID\uff08\u5982\u679c\u8fd8\u6ca1\u63d0\u53d6\u5230\uff09\n        if (!aid) {\n            aid = currentAid;\n        }\n    }\n}\n\n\/\/ 4. \u6839\u636e\u83b7\u53d6\u5230\u7684 maxPage \u548c aid \u751f\u6210\u5b8c\u6574\u7684 URL \u5217\u8868\nif (aid && maxPage > 1) {\n    for (var i = 1; i <= maxPage; i++) {\n        \/\/ \u62fc\u63a5\u6807\u51c6URL\u683c\u5f0f\uff1aphotos-index-page-{\u9875\u7801}-aid-{ID}.html\n        nextPageUrl.push(\"https:\/\/www.wn06.ru\/photos-index-page-\" + i + \"-aid-\" + aid + \".html\");\n    }\n} else {\n    \/\/ \u5982\u679c\u6ca1\u6709\u627e\u5230\u5206\u9875\uff08\u53ea\u6709\u4e00\u9875\u7684\u60c5\u51b5\uff09\uff0c\u76f4\u63a5\u4f7f\u7528\u5f53\u524d\u9875\u9762\n    nextPageUrl.push(baseUrl);\n}\n\njava.log(\"\u751f\u6210\u7684\u603b\u9875\u6570: \" + nextPageUrl.length);\n\n\njava.log(\"nexturl\"+nextPageUrl.join(\"\\n\"))\n\/\/ 2. \u6838\u5fc3\u5de5\u5177\u51fd\u6570\uff1a\u9884\u5904\u7406HTML\uff08\u79fb\u9664\u6ce8\u91ca+\u6e05\u7406\u7a7a\u683c\uff09\nfunction cleanHtml(html) {\n    if (!html) return \"\";\n    \/\/ \u6b65\u9aa41\uff1a\u79fb\u9664\u6240\u6709HTML\u6ce8\u91ca\uff08<!-- ... -->\uff09\uff0c\u5f7b\u5e95\u6d88\u9664\u5e72\u6270\n    html = html.replace(\/<!--[\\s\\S]*?-->\/g, \"\");\n    \/\/ \u6b65\u9aa42\uff1a\u79fb\u9664\u591a\u4f59\u7a7a\u767d\u5b57\u7b26\uff08\u6362\u884c\u3001\u5236\u8868\u7b26\u7b49\uff09\uff0c\u7b80\u5316\u5339\u914d\n    html = html.replace(\/\\s+\/g, \" \");\n    return html;\n}\n\n\/\/ 3. \u6838\u5fc3\u5de5\u5177\u51fd\u6570\uff1a\u63d0\u53d6\u5355\u9875\u7684\u201c\u5e8f\u53f7\u6570\u7ec4\u201d\u548c\u201c\u56fe\u7247src\u6570\u7ec4\u201d\nfunction extractPageData(cleanedHtml) {\n    var names = []; \/\/ \u5e8f\u53f7\u6570\u7ec4\uff08001\u3001002\u3001003...\uff09\n    var srcs = [];  \/\/ \u56fe\u7247src\u6570\u7ec4\uff08\u4e0e\u5e8f\u53f7\u4e00\u4e00\u5bf9\u5e94\uff09\n\n    \/\/ \u63d0\u53d6\u6240\u6709\u5e8f\u53f7\uff08<span class=\"name tb\">xxx<\/span>\uff09\n    var nameRegex = \/<span class=\"name tb\">([\\d]+)<\\\/span>\/g;\n    var nameMatch;\n    while ((nameMatch = nameRegex.exec(cleanedHtml)) !== null) {\n        names.push(nameMatch[1]);\n    }\n\n    \/\/ \u63d0\u53d6\u6240\u6709\u6709\u6548\u56fe\u7247src\uff08\u4e0e\u5e8f\u53f7\u5bf9\u5e94\u7684img\uff0calt\u5305\u542b\u201c_\u5e8f\u53f7\u201d\uff09\n    var srcRegex = \/<img src=\"([^\"]+)\" alt=\"[^\"]+_([\\d]+)\"\/g;\n    var srcMatch;\n    while ((srcMatch = srcRegex.exec(cleanedHtml)) !== null) {\n        \/\/ \u786e\u4fddsrc\u5bf9\u5e94\u7684\u5e8f\u53f7\u5728names\u6570\u7ec4\u4e2d\uff08\u907f\u514d\u65e0\u5173\u56fe\u7247\uff09\n        if (names.includes(srcMatch[2])) {\n            srcs.push(srcMatch[1]);\n        }\n    }\n\n    return { names: names, srcs: srcs };\n}\n\n\/\/ 4. \u6267\u884c\u591a\u9875\u63d0\u53d6\ntry {\n    for (var p = 0; p < nextPageUrl.length; p++) {\n        var pageUrl = nextPageUrl[p];\n        var pageNum = p + 1;\n\n        \/\/ \u6b65\u9aa41\uff1a\u83b7\u53d6\u5e76\u6e05\u7406HTML\uff08\u79fb\u9664\u6ce8\u91ca+\u591a\u4f59\u7a7a\u683c\uff09\n        var rawHtml = new String(java.ajax(pageUrl)) || \"\";\n        var cleanedHtml = cleanHtml(rawHtml);\n\n        \/\/ \u6b65\u9aa42\uff1a\u63d0\u53d6\u5f53\u524d\u9875\u7684\u5e8f\u53f7\u548csrc\u6570\u7ec4\n        var pageData = extractPageData(cleanedHtml);\n        var pageNames = pageData.names;\n        var pageSrcs = pageData.srcs;\n\n        \/\/ \u6b65\u9aa43\uff1a\u6309\u7d22\u5f15\u914d\u5bf9\uff08\u5e8f\u53f7\u548csrc\u4e00\u4e00\u5bf9\u5e94\uff09\uff0c\u907f\u514d\u6f0f\u914d\n        var addedNum = 0;\n        for (var i = 0; i < pageNames.length; i++) {\n            var imgName = pageNames[i];\n            var imgSrc = pageSrcs[i] || \"\";\n            var imgExtension = \"\";\n\n            \/\/ \u63d0\u53d6\u6269\u5c55\u540d\n            if (imgSrc) {\n                var dotIndex = imgSrc.lastIndexOf(\".\");\n                if (dotIndex !== -1) {\n                    imgExtension = imgSrc.slice(dotIndex + 1).toLowerCase().split(\/[?#]\/)[0];\n                }\n            }\n\n            \/\/ \u53bb\u91cd\u5e76\u6dfb\u52a0\u5230\u6570\u7ec4\n            if (imgName && imgExtension && !imgInfoList.some(item => item.imgName === imgName)) {\n                imgInfoList.push({ imgName: imgName, imgExtension: imgExtension });\n                addedNum++;\n            }\n        }\n\n    }\n} catch (e) {\n    java.log(\"\u63d0\u53d6\u62a5\u9519\uff1a\" + e.message);\n}\n\nimgInfoList.sort((a, b) => parseInt(a.imgName) - parseInt(b.imgName));\n\n\/\/ \u8fd4\u56de\u539f\u7ed3\u679c\uff0c\u4e0d\u5f71\u54cd\u76ee\u5f55\u5217\u8868\njava.put('imgInfoList',JSON.stringify(imgInfoList))\nresult;","chapterName":"\/\/li\/text()@js:'\u5168\u8bdd\u9605\u8bfb'","chapterUrl":"\/\/li\/\/a\/@href,{\"webView\":true}","updateTime":"\/\/li\/div[@class='info']\/div[@class='info_col']\/text()"},"searchUrl":"https:\/\/www.wn06.ru\/\/search\/?q={{key}}&f=_all&s=create_time_DESC&syn=yes","weight":100},{"ruleSearch":{"name":"h3@a@text","author":"p@a@text","kind":"span:nth-of-type(2)@text","wordCount":"","intro":"","bookUrl":"","lastChapter":"li:nth-of-type(1)@a@text","bookList":"div.item","coverUrl":".item@img@text"},"ruleBookInfo":{"intro":"div.des@text","name":"h1@text","author":".booktxt@a@text","kind":".booktxt@p:nth-of-type(2)@text","wordCount":".booktxt@p:nth-of-type(4)@text","lastChapter":"h3@a@text","tocUrl":"#list@a@href","coverUrl":".bookdetail@img"},"ruleToc":{"chapterList":"#list@li","chapterName":"@a@text","chapterUrl":"@a@href","preUpdateJs":""},"ruleContent":{"content":"div.con@text","nextContentUrl":"span:nth-of-type(2)@a@href","sourceRegex":""},"ruleReview":[],"ruleExplore":[],"bookSourceType":0,"bookSourceUrl":"https:\/\/www.bqquge.com","bookSourceName":"\u7b14\u8da3\u9601","header":"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/143.0.0.0 Safari\/537.36 Edg\/143.0.0.0","searchUrl":"\/so\/{{key}}","lastUpdateTime":"1766741268140"},{"bookSourceName":"\u516b\u53c9\u4e66\u5e93","bookSourceType":0,"bookSourceUrl":"https:\/\/www.8xsk.info","customOrder":0,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"header":" \"accept\": \"text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\",\n    \"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\",\n    \"cache-control\": \"no-cache\",\n    \"pragma\": \"no-cache\",\n    \"priority\": \"u=0, i\",\n    \"referer\": \"https:\/\/www.8xsk.info\/\",\n    \"sec-ch-ua\": \"\\\"Microsoft Edge\\\";v=\\\"143\\\", \\\"Chromium\\\";v=\\\"143\\\", \\\"Not A(Brand\\\";v=\\\"24\\\"\",\n    \"sec-ch-ua-mobile\": \"?1\",\n    \"sec-ch-ua-platform\": \"\\\"Android\\\"\",\n    \"sec-fetch-dest\": \"document\",\n    \"sec-fetch-mode\": \"navigate\",\n    \"sec-fetch-site\": \"same-origin\",\n    \"sec-fetch-user\": \"?1\",\n    \"upgrade-insecure-requests\": \"1\",\n    \"user-agent\": \"Mozilla\/5.0 (Linux; Android 6.0; Nexus 5 Build\/MRA58N) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/143.0.0.0 Mobile Safari\/537.36 Edg\/143.0.0.0\"\n","lastUpdateTime":"1766777837716","respondTime":180000,"ruleBookInfo":{"author":"\/\/div[@class=\"info-chitiet\"]\/span\/a\/text()","coverUrl":"\/\/div[@class=\"book\"]\/img\/@src","intro":"\/\/div[@itemprop=\"description\"]\/text()","kind":"\/\/div[@class=\"info-chitiet\"]\/span\/a[@itemprop=\"genre\"]\/text()","name":"\/\/div[@class=\"col-xs-12 col-sm-8 col-md-8 desc\"]\/h3\/text()","tocUrl":""},"ruleContent":{"content":"@js:\nvar regex = \/\\{\\s*\"url\"\\s*:\\s*\"[^\"]+\"\\s*,\\s*\"mobile\"\\s*:\\s*\"[^\"]+\"\\s*,\\s*\"isk\"\\s*:\\s*\"[^\"]+\"\\s*\\}\/;\nvar match = result.match(regex)[0];\nvar jsonObj = JSON.parse(match);\nvar params = \"url=\" + encodeURIComponent(jsonObj.url) + \n             \"&mobile=\" + encodeURIComponent(jsonObj.mobile) + \n             \"&isk=\" + encodeURIComponent(jsonObj.isk);\njava.log(params);\nlet response = java.post(\"https:\/\/www.8xsk.info\/conapi.php\",params,{\n    \"accept\": \"application\/json, text\/javascript, *\/*; q=0.01\",\n    \"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\",\n    \"cache-control\": \"no-cache\",\n    \"content-type\": \"application\/x-www-form-urlencoded; charset=UTF-8\",\n    \"origin\": \"https:\/\/www.8xsk.info\",\n    \"pragma\": \"no-cache\",\n    \"priority\": \"u=1, i\",\n    \"sec-ch-ua\": \"\\\"Microsoft Edge\\\";v=\\\"143\\\", \\\"Chromium\\\";v=\\\"143\\\", \\\"Not A(Brand\\\";v=\\\"24\\\"\",\n    \"sec-ch-ua-mobile\": \"?0\",\n    \"sec-ch-ua-platform\": \"\\\"Windows\\\"\",\n    \"sec-fetch-dest\": \"empty\",\n    \"sec-fetch-mode\": \"cors\",\n    \"sec-fetch-site\": \"same-origin\",\n    \"user-agent\": \"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/143.0.0.0 Safari\/537.36 Edg\/143.0.0.0\",\n    \"x-requested-with\": \"XMLHttpRequest\"\n}\n);\nJSON.parse(response.body())[\"content\"];"},"ruleExplore":[],"ruleReview":[],"ruleSearch":{"bookList":"\/\/div[@class=\"one-row\"]\/div[@class=\"col-md-3 col-sm-6 col-xs-6 home-truyendecu\"]","bookUrl":"\/\/div[@class=\"each_truyen\"]\/a\/@href","coverUrl":"\/\/div[@class=\"each_truyen\"]\/a\/img\/@src","name":"\/\/h3[@itemprop=\"name\"]\/text()"},"ruleToc":{"chapterList":"\/\/div[@id='list-chapter']\/\/ul[@class='list-chapter']\/\/li\/a","chapterName":"\/\/span[@class=\"chapter-text\"]\/text()","chapterUrl":"@js:\nvar doc = org.jsoup.Jsoup.parse(result);\nvar link = doc.select(\"a\").first();\n'https:\/\/www.8xsk.info' + link.attr(\"href\");","nextTocUrl":"\/\/div[@id=\"pagination\"]\/\/li[last()-1]\/a\/@href"},"searchUrl":"@js:\nlet new_url = java.get('https:\/\/www.8xsk.info\/e\/search\/index.php?keyboard='+key+'&show=title%2Cwriter%2Cbyr&searchget=1',{\n    \"accept\": \"text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\",\n    \"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\",\n    \"cache-control\": \"no-cache\",\n    \"pragma\": \"no-cache\",\n    \"priority\": \"u=0, i\",\n    \"referer\": \"https:\/\/www.8xsk.info\/\",\n    \"sec-ch-ua\": \"\\\"Microsoft Edge\\\";v=\\\"143\\\", \\\"Chromium\\\";v=\\\"143\\\", \\\"Not A(Brand\\\";v=\\\"24\\\"\",\n    \"sec-ch-ua-mobile\": \"?1\",\n    \"sec-ch-ua-platform\": \"\\\"Android\\\"\",\n    \"sec-fetch-dest\": \"document\",\n    \"sec-fetch-mode\": \"navigate\",\n    \"sec-fetch-site\": \"same-origin\",\n    \"sec-fetch-user\": \"?1\",\n    \"upgrade-insecure-requests\": \"1\",\n    \"user-agent\": \"Mozilla\/5.0 (Linux; Android 6.0; Nexus 5 Build\/MRA58N) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/143.0.0.0 Mobile Safari\/537.36 Edg\/143.0.0.0\"\n});\nlet url = 'https:\/\/www.8xsk.info\/e\/search\/'+ new_url.header(\"location\");\nurl+'page='+page;","weight":0},{"bookSourceGroup":"\u5c0f\u8bf4","bookSourceName":"\u7231\u4e0b\u7535\u5b50\u4e66","bookSourceType":0,"bookSourceUrl":"https:\/\/ixdzs8.com","customOrder":1,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"\u7384\u5e7b::\/sort\/1\/index-0-0-1-{{page}}.html\n\u6b66\u4fa0::\/sort\/10\/index-0-0-1-{{page}}.html\n\u4fee\u771f::\/sort\/2\/index-0-0-1-{{page}}.html\n\u4fee\u771f::\/sort\/3\/index-0-0-1-{{page}}.html\n\u7075\u5f02::\/sort\/6\/index-0-0-1-{{page}}.html\n\u65e5\u699c::\/hot\/day\/?page={{page}}\n\u5468\u699c::\/hot\/month\/?page={{page}}\n\u603b\u699c::\/hot\/?page={{page}}","lastUpdateTime":"1766785057524","respondTime":180000,"ruleBookInfo":{"downloadUrls":".btn-solid@tag.a@href","intro":"\u7231\u4e0b\u7535\u5b50\u4e66\n\u4e66\u540d:\u300a{{@class.n-text[0]@tag.h1@text}}\u300b\n\u4f5c\u8005:{{@class.bauthor[0]@text}}\n{{@class.trend@text}}\n\u7b80\u4ecb:{{@id.intro@text## \u3000\u3000##\n}}","kind":".tags@tag.a@text"},"ruleContent":{"content":"@js:\nvar token = src.match(\/token\\s*=\\s*\"([^\"]+)\"\/)?.[1];\nvar tourl = baseUrl + \"?challenge=\" + encodeURIComponent(token);\nvar sectionHtml = java.ajax(tourl).match(\/<section>\\s*((?:<p>.*?<\\\/p>\\s*)+)(.*?)\\s*<\\\/section>\/i)[1];\nvar text = sectionHtml.replace(new RegExp('<\\\\\/?p>', 'g'), '\\n').trim();\ntext;"},"ruleExplore":[],"ruleSearch":{"author":".bauthor@tag.a@text","bookList":".u-list@tag.li","bookUrl":"a@href","checkKeyWord":"\u6d2a\u8352\u4e4b\u9f99\u65cf\u79f0\u9738","coverUrl":"img@src\n@js:\nif (result == \"https:\/\/img22.ixdzs.com\/nopic2.jpg\"){\n\tnull;\n\t}else{result}","intro":".l-p2@text","kind":".lz@text","lastChapter":".l-chapter@text","name":"a@title","wordCount":".size@text"},"ruleToc":{"chapterList":"@js:\nvar bid = baseUrl.match(\/read\\\/(\\d+)\/)[1];\nvar resp = java.post(source.getKey()+\"\/novel\/clist\/\",\"bid=\"+bid,{});\nvar json = JSON.parse(resp.body()).data;\nvar page = 0;\nvar n = \"\";\nfor(var i=json.length - 1; i >= 0; i--){\n\tif(json[i].ctype === \"1\"){\n\t\tn = json[i].title;\n\t\tjson.splice(i, 1);\n\t\tcontinue;\n\t\t}\n\tpage = json[i][\"ordernum\"];\n\tjson[i][\"url\"] = source.getKey() + \"\/read\/\" + bid + \"\/p\" + page + \".html\";\n\tjson[i][\"n\"] = n;\n\t}\njson;","chapterName":"title","chapterUrl":"url","updateTime":"n"},"searchUrl":"\/bsearch?q={{key}}&page={{page}}","weight":0},{"bookSourceGroup":"\u6f2b\u753b,\ud83c\udf38\u6f2b\u753b","bookSourceName":"\ud83c\udf38Hitomi\u6f2b","bookSourceType":2,"bookSourceUrl":"https:\/\/hitomi.si\/","customOrder":450,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"[\n  {\n    \"title\": \"\ud83d\udd16\u9996\u9875\ud83d\udd16\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"title\": \"\u4eca\u65e5\u70ed\u95e8\",\n    \"url\": \"https:\/\/hitomi.si\/\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n  {\n    \"title\": \"\u6700\u8fd1\u66f4\u65b0\",\n    \"url\": \"https:\/\/hitomi.si\/spa\/latest-manga?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n  {\n    \"title\": \"\u6c49\u5316\",\n    \"url\": \"https:\/\/hitomi.si\/spa\/language\/chinese?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n  {\n    \"title\": \"\ud83d\udd16\u7c7b\u522b\ud83d\udd16\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"title\": \"doujinshi\",\n    \"url\": \"https:\/\/hitomi.si\/spa\/category\/doujinshi?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n  {\n    \"title\": \"manga\",\n    \"url\": \"https:\/\/hitomi.si\/spa\/category\/manga?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n  {\n    \"title\": \"\ud83d\udd16\u6807\u7b7e\ud83d\udd16\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"title\": \"BigBreasts\",\n    \"url\": \"https:\/\/hitomi.si\/spa\/genre\/145?sort=most_viewed&status=&page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n  {\n    \"title\": \"SoleMan\",\n    \"url\": \"https:\/\/hitomi.si\/spa\/genre\/157?sort=most_viewed&status=&page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n  {\n    \"title\": \"SoleFemale\",\n    \"url\": \"https:\/\/hitomi.si\/spa\/genre\/232?sort=most_viewed&status=&page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n  {\n    \"title\": \"Netorare\",\n    \"url\": \"https:\/\/hitomi.si\/spa\/genre\/300?sort=most_viewed&status=&page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n  {\n    \"title\": \"FullColor\",\n    \"url\": \"https:\/\/hitomi.si\/spa\/genre\/2472?sort=most_viewed&status=&page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.23\n    }\n  },\n  {\n    \"title\": \"Schoolgirl Uniform\",\n    \"url\": \"https:\/\/hitomi.si\/spa\/genre\/186?sort=most_viewed&status=&page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n  {\n    \"title\": \"Huge Breasts\",\n    \"url\": \"https:\/\/hitomi.si\/spa\/genre\/317?sort=most_viewed&status=&page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n  {\n    \"title\": \"Blowjob\",\n    \"url\": \"https:\/\/hitomi.si\/spa\/genre\/232?sort=most_viewed&status=&page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n  {\n    \"title\": \"TallGirl\",\n    \"url\": \"https:\/\/hitomi.si\/spa\/genre\/2702?sort=most_viewed&status=&page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n  {\n    \"title\": \"BlackMail\",\n    \"url\": \"https:\/\/hitomi.si\/spa\/genre\/2729?sort=most_viewed&status=&page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  }\n]","header":"{\n\t\"Cookie\":\"read=1\"\n}","lastUpdateTime":"1766938929185","loginUi":"[\n    {\n        \"name\": \"\u8d26\u53f7\",\n        \"type\": \"text\"\n    },\n    {\n        \"name\": \"\u5bc6\u7801\",\n        \"type\": \"password\"\n    }\n]","loginUrl":"<js>\nvar login = () => {\n    var username = source.getLoginInfoMap().get(\"\u8d26\u53f7\");\n    var password = source.getLoginInfoMap().get(\"\u5bc6\u7801\");\n    var res = java.post(\n      'https:\/\/hitomi.si\/auth\/login',\n        JSON.stringify({\n            username: username,\n            password: password,\n        }),\n        {\"Content-Type\": \"application\/json\"}\n    );\n    source.putLoginHeader(JSON.stringify({\n        Authorization: `Bearer ${res.body()}`\n    }));\n}\nlogin();\n<\/js>","respondTime":180000,"ruleBookInfo":{"author":"$.authors[0].author_name","coverUrl":"$.detail.manga_cover_img","intro":"$.detail.manga_description","kind":"$.detail.category","name":"$.detail.manga_name@js:\nvar title = \"\";\nif(result.indexOf(\"|\")!==-1){\n  var splits =  result.split(\"|\");\n  title = splits.reverse().join(\"|\");\n}else{\n  title = result;\n}\ntitle;","tocUrl":"https:\/\/hitomi.si\/mangazine\/si{$.detail.manga_id}"},"ruleContent":{"content":".chapter-imgs .chapter-img img@data-url\n@js: \nconst server = java.getString(\"\/\/a[@id='change1']\/@data-server\"); \n\nresult.split(\"\\n\").map(x=>'<img src=\"'+server+x+'\">').join(\"\\n\")","imageStyle":"FULL"},"ruleExplore":{"bookList":"\/\/ul[@class='splide__list']\/li||$.manga_list","bookUrl":"\/\/div[@class='r-img']\/a\/@href||https:\/\/hitomi.si\/spa\/manga\/{$.manga_id}","coverUrl":"\/\/div[@class='r-img']\/\/img\/@src||$.manga_cover_img","kind":"\/\/div[@class='lang']\/a\/@title||$.language","name":"a@text||$.manga_name"},"ruleSearch":{"bookList":"$.manga_list@js:\nvar booklist =[]\nfor(var i=0;i<result.length;i++){\n\tif(result[i].language&&result[i].language==\"chinese\"){\n\t\tbooklist.push(result[i])\n\t\t}\n\t}\nbooklist","bookUrl":"https:\/\/hitomi.si\/spa\/manga\/{$.manga_id}","checkKeyWord":"\u59d0\u59d0","coverUrl":"$.manga_cover_img","kind":"Hitomi\u6f2b,{$.language}","name":"$.manga_name@js:\nvar title = \"\";\nif(result.indexOf(\"|\")!==-1){\n  var splits =  result.split(\"|\");\n  title = splits.reverse().join(\"|\");\n}else{\n  title = result;\n}\ntitle;"},"ruleToc":{"chapterList":"\/\/div[@class='preview-imgs']\/ul\/li[1]\n@js: [result]","chapterName":"\/\/a[@class='__link']\/img\/@alt@js:'\u5168\u8bdd\u9605\u8bfb'","chapterUrl":"\/\/a[@class='__link']\/@href"},"searchUrl":"\/spa\/search?query={{key}}&page={{page}}","weight":50},{"bookSourceComment":"\u8309\u8389\u68112025.12.29","bookSourceGroup":"\u8309\u8389\u6811\u81ea\u5236","bookSourceName":"\u7231\u770b\u4e66\u5427","bookSourceType":0,"bookSourceUrl":"https:\/\/m.aidushu8.com","customOrder":0,"enabled":true,"enabledCookieJar":false,"enabledExplore":true,"lastUpdateTime":"1766948223679","respondTime":180000,"ruleBookInfo":{"author":"i > a@text","coverUrl":"img@src","intro":".intro > p:nth-child(2)@text","kind":"p > span:nth-child(1)@text","lastChapter":".to100 > a@text","name":"h1@text","tocUrl":"#a_catalog@href","wordCount":"span:nth-child(2)@text"},"ruleContent":{"content":"#article > p@html","nextContentUrl":"#next_url@href","title":""},"ruleExplore":[],"ruleSearch":{"author":"p:nth-child(2)@text##(\\d+(?:\\.\\d+)?\\s*\u4e07\u5b57)\\s+(.+)","bookList":".searchresult","bookUrl":"div:nth-child(2) > a@href","checkKeyWord":"\u5feb\u7a7f","coverUrl":".lazy@data-original","lastChapter":".searchresult:nth-child(n+1) p > a@text","name":"div:nth-child(2) > a@text","wordCount":""},"ruleToc":{"chapterList":"#ul_all_chapters > li","chapterName":"li:nth-child(n+1) > .no-happen@text","chapterUrl":"li:nth-child(n+1) > .no-happen@href","nextTocUrl":"text.\u4e0b\u4e00\u9875@href"},"searchUrl":"\/searchs,{\n  \"body\": \"searchkey={{key}}&searchtype=all&Submit=\",\n  \"charset\": \"UTF-8\",\n  \"method\": \"POST\"\n}","weight":0},{"bookSourceName":"\u516b\u53c9\u4e66\u5e93","bookSourceType":0,"bookSourceUrl":"https:\/\/www.8xsk.info","customOrder":0,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"\n[\n{\"title\":\"\u6392\u5e8f\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},\n{\"title\":\"\u6700\u8fd1\u66f4\u65b0\",\"url\":\"\/latest\/index{{page - 1 == 0 ? '': '_'+page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.20}},                            \n{\"title\":\"\u6700\u65b0\u5165\u5e93\",\"url\":\"\/release\/index{{page - 1 == 0 ? '': '_'+page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.20}}, \n{\"title\":\"\u70ed\u95e8\u6392\u884c\",\"url\":\"\/popular\/index{{page - 1 == 0 ? '': '_'+page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.20}},\n{\"title\":\"\u5b8c\u672c\u5c0f\u8bf4\",\"url\":\"\/completed\/\/index{{page - 1 == 0 ? '': '_'+page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.20}},\n{\"title\":\"\u5206\u7c7b\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},\n{\"title\":\"\u957f\u7bc7\",\"url\":\"\/booklist1\/{{page-1}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"\u5386\u53f2\",\"url\":\"\/booklist4\/{{page-1}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"\u7384\u5e7b\",\"url\":\"\/booklist6\/{{page-1}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"\u5176\u4ed6\",\"url\":\"\/booklist8\/{{page-1}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"\u7efc\u5408\",\"url\":\"\/booklist2\/{{page-1}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"\u90fd\u5e02\",\"url\":\"\/booklist5\/{{page-1}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"\u73b0\u4ee3\",\"url\":\"\/booklist9\/{{page-1}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"\u6b66\u4fa0\",\"url\":\"\/booklist3\/{{page-1}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"\u5973\u751f\",\"url\":\"\/booklist7\/{{page-1}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}}\n]","header":" \"accept\": \"text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\",\n    \"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\",\n    \"cache-control\": \"no-cache\",\n    \"pragma\": \"no-cache\",\n    \"priority\": \"u=0, i\",\n    \"referer\": \"https:\/\/www.8xsk.info\/\",\n    \"sec-ch-ua\": \"\\\"Microsoft Edge\\\";v=\\\"143\\\", \\\"Chromium\\\";v=\\\"143\\\", \\\"Not A(Brand\\\";v=\\\"24\\\"\",\n    \"sec-ch-ua-mobile\": \"?1\",\n    \"sec-ch-ua-platform\": \"\\\"Android\\\"\",\n    \"sec-fetch-dest\": \"document\",\n    \"sec-fetch-mode\": \"navigate\",\n    \"sec-fetch-site\": \"same-origin\",\n    \"sec-fetch-user\": \"?1\",\n    \"upgrade-insecure-requests\": \"1\",\n    \"user-agent\": \"Mozilla\/5.0 (Linux; Android 6.0; Nexus 5 Build\/MRA58N) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/143.0.0.0 Mobile Safari\/537.36 Edg\/143.0.0.0\"\n","lastUpdateTime":"1767063935235","respondTime":180000,"ruleBookInfo":{"author":"\/\/div[@class=\"info-chitiet\"]\/span\/a\/text()","coverUrl":"\/\/div[@class=\"book\"]\/img\/@src","intro":"\/\/div[@itemprop=\"description\"]\/text()","kind":"\/\/div[@class=\"info-chitiet\"]\/span\/a[@itemprop=\"genre\"]\/text()","name":"\/\/div[@class=\"col-xs-12 col-sm-8 col-md-8 desc\"]\/h3\/text()","tocUrl":""},"ruleContent":{"content":"@js:\nvar regex = \/\\{\\s*\"url\"\\s*:\\s*\"[^\"]+\"\\s*,\\s*\"mobile\"\\s*:\\s*\"[^\"]+\"\\s*,\\s*\"isk\"\\s*:\\s*\"[^\"]+\"\\s*\\}\/;\nvar match = result.match(regex)[0];\nvar jsonObj = JSON.parse(match);\nvar params = \"url=\" + encodeURIComponent(jsonObj.url) + \n             \"&mobile=\" + encodeURIComponent(jsonObj.mobile) + \n             \"&isk=\" + encodeURIComponent(jsonObj.isk);\njava.log(params);\nlet response = java.post(\"https:\/\/www.8xsk.info\/conapi.php\",params,{\n    \"accept\": \"application\/json, text\/javascript, *\/*; q=0.01\",\n    \"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\",\n    \"cache-control\": \"no-cache\",\n    \"content-type\": \"application\/x-www-form-urlencoded; charset=UTF-8\",\n    \"origin\": \"https:\/\/www.8xsk.info\",\n    \"pragma\": \"no-cache\",\n    \"priority\": \"u=1, i\",\n    \"sec-ch-ua\": \"\\\"Microsoft Edge\\\";v=\\\"143\\\", \\\"Chromium\\\";v=\\\"143\\\", \\\"Not A(Brand\\\";v=\\\"24\\\"\",\n    \"sec-ch-ua-mobile\": \"?0\",\n    \"sec-ch-ua-platform\": \"\\\"Windows\\\"\",\n    \"sec-fetch-dest\": \"empty\",\n    \"sec-fetch-mode\": \"cors\",\n    \"sec-fetch-site\": \"same-origin\",\n    \"user-agent\": \"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/143.0.0.0 Safari\/537.36 Edg\/143.0.0.0\",\n    \"x-requested-with\": \"XMLHttpRequest\"\n}\n);\nJSON.parse(response.body())[\"content\"];"},"ruleExplore":[],"ruleSearch":{"bookList":"\/\/div[@class=\"one-row\"]\/div[@class=\"col-md-3 col-sm-6 col-xs-6 home-truyendecu\"]","bookUrl":"\/\/div[@class=\"each_truyen\"]\/a\/@href","coverUrl":"\/\/div[@class=\"each_truyen\"]\/a\/img\/@src","name":"\/\/h3[@itemprop=\"name\"]\/text()"},"ruleToc":{"chapterList":"\/\/div[@id='list-chapter']\/\/ul[@class='list-chapter']\/\/li\/a","chapterName":"\/\/span[@class=\"chapter-text\"]\/text()","chapterUrl":"@js:\nvar doc = org.jsoup.Jsoup.parse(result);\nvar link = doc.select(\"a\").first();\n'https:\/\/www.8xsk.info' + link.attr(\"href\");","nextTocUrl":"\/\/div[@id=\"pagination\"]\/\/li[last()-1]\/a\/@href"},"searchUrl":"@js:\nlet new_url = java.get('https:\/\/www.8xsk.info\/e\/search\/index.php?keyboard='+key+'&show=title%2Cwriter%2Cbyr&searchget=1',{\n    \"accept\": \"text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\",\n    \"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\",\n    \"cache-control\": \"no-cache\",\n    \"pragma\": \"no-cache\",\n    \"priority\": \"u=0, i\",\n    \"referer\": \"https:\/\/www.8xsk.info\/\",\n    \"sec-ch-ua\": \"\\\"Microsoft Edge\\\";v=\\\"143\\\", \\\"Chromium\\\";v=\\\"143\\\", \\\"Not A(Brand\\\";v=\\\"24\\\"\",\n    \"sec-ch-ua-mobile\": \"?1\",\n    \"sec-ch-ua-platform\": \"\\\"Android\\\"\",\n    \"sec-fetch-dest\": \"document\",\n    \"sec-fetch-mode\": \"navigate\",\n    \"sec-fetch-site\": \"same-origin\",\n    \"sec-fetch-user\": \"?1\",\n    \"upgrade-insecure-requests\": \"1\",\n    \"user-agent\": \"Mozilla\/5.0 (Linux; Android 6.0; Nexus 5 Build\/MRA58N) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/143.0.0.0 Mobile Safari\/537.36 Edg\/143.0.0.0\"\n});\nlet url = 'https:\/\/www.8xsk.info\/e\/search\/'+ new_url.header(\"location\");\nurl+'page='+page;","weight":0},{"bookSourceComment":"\/\/2000+\u97e9\u6f2b\u8d44\u6e90\n\/\/\u53d1\u5e03\u5730\u5740\uff1ahttps:\/\/rdz1.xyz\/dizhi\nflag = 1\ni = \"\u9312\u769a\u85f9\u7919\u611b\u566f\u5b21\u74a6\u66d6\u9744\u8af3\u92a8\u9d6a\u9aaf\u8956\u5967\u5abc\u9a41\u9c32\u58e9\u7f77\u9200\u64fa\u6557\u5504\u9812\u8fa6\u7d46\u9211\u5e6b\u7d81\u938a\u8b17\u525d\u98fd\u5bf6\u5831\u9b91\u9d07\u9f59\u8f29\u8c9d\u92c7\u72fd\u5099\u618a\u9d6f\u8cc1\u931b\u7e43\u7b46\u7562\u6583\u5e63\u9589\u84fd\u55f6\u6f77\u924d\u7bf3\u8e55\u908a\u7de8\u8cb6\u8b8a\u8faf\u8fae\u8290\u7df6\u7c69\u6a19\u9a43\u98ae\u98c6\u93e2\u9463\u9c3e\u9c49\u5225\u765f\u7015\u6ff1\u8cd3\u64ef\u5110\u7e7d\u6ab3\u6baf\u81cf\u944c\u9ad5\u9b22\u9905\u7a1f\u64a5\u7f3d\u9251\u99c1\u9911\u9238\u9d53\u88dc\u923d\u8ca1\u53c3\u8836\u6b98\u615a\u6158\u71e6\u9a42\u9ef2\u84bc\u8259\u5009\u6ec4\u5ec1\u5074\u518a\u6e2c\u60fb\u5c64\u8a6b\u9364\u5115\u91f5\u6519\u647b\u87ec\u995e\u8b92\u7e8f\u93df\u7522\u95e1\u986b\u56c5\u8ac2\u8b96\u8546\u61fa\u5b0b\u9a4f\u8998\u79aa\u9414\u5834\u5617\u9577\u511f\u8178\u5ee0\u66a2\u5000\u8407\u60b5\u95b6\u9be7\u9214\u8eca\u5fb9\u7868\u5875\u9673\u896f\u5096\u8af6\u6aec\u78e3\u9f54\u6490\u7a31\u61f2\u8aa0\u9a01\u68d6\u6a89\u92ee\u943a\u7661\u9072\u99b3\u6065\u9f52\u71be\u98ed\u9d1f\u6c96\u885d\u87f2\u5bf5\u9283\u7587\u8e8a\u7c4c\u7da2\u5114\u5e6c\u8b8e\u6ae5\u5eda\u92e4\u96db\u790e\u5132\u89f8\u8655\u82bb\u7d40\u8e95\u50b3\u91e7\u7621\u95d6\u5275\u6134\u9318\u7d9e\u7d14\u9d89\u7dbd\u8f1f\u9f6a\u8fad\u8a5e\u8cdc\u9dbf\u8070\u8525\u56ea\u5f9e\u53e2\u84ef\u9a44\u6a05\u6e4a\u8f33\u8ea5\u7ac4\u651b\u932f\u92bc\u9e7a\u9054\u5660\u97c3\u5e36\u8cb8\u99d8\u7d3f\u64d4\u55ae\u9132\u64a3\u81bd\u619a\u8a95\u5f48\u6bab\u8ce7\u7649\u7c1e\u7576\u64cb\u9ee8\u8569\u6a94\u8b9c\u78ad\u8960\u6417\u5cf6\u79b1\u5c0e\u76dc\u71fe\u71c8\u9127\u9419\u6575\u6ecc\u905e\u7de0\u7cf4\u8a46\u8ae6\u7d88\u89bf\u93d1\u985b\u9ede\u588a\u96fb\u5dd4\u923f\u7672\u91e3\u8abf\u929a\u9bdb\u8adc\u758a\u9c08\u91d8\u9802\u9320\u8a02\u92cc\u4e1f\u92a9\u6771\u52d5\u68df\u51cd\u5d20\u9d87\u7ac7\u72a2\u7368\u8b80\u8ced\u934d\u7006\u6add\u7258\u7be4\u9ef7\u935b\u65b7\u7dde\u7c6a\u514c\u968a\u5c0d\u61df\u9413\u5678\u9813\u920d\u71c9\u8e89\u596a\u58ae\u9438\u9d5d\u984d\u8a1b\u60e1\u9913\u8ae4\u580a\u95bc\u8edb\u92e8\u9354\u9d9a\u984e\u9853\u9c77\u8a92\u5152\u723e\u990c\u8cb3\u9087\u927a\u9d2f\u9b9e\u767c\u7f70\u95a5\u743a\u792c\u91e9\u7169\u8ca9\u98ef\u8a2a\u7d21\u9201\u9b74\u98db\u8ab9\u5ee2\u8cbb\u7dcb\u9428\u9be1\u7d1b\u58b3\u596e\u61a4\u7cde\u50e8\u8c50\u6953\u92d2\u98a8\u760b\u99ae\u7e2b\u8af7\u9cf3\u7043\u819a\u8f3b\u64ab\u8f14\u8ce6\u5fa9\u8ca0\u8a03\u5a66\u7e1b\u9ce7\u99d9\u7d31\u7d3c\u8cfb\u9ea9\u9b92\u9c12\u91d3\u8a72\u9223\u84cb\u8cc5\u687f\u8d95\u7a08\u8d1b\u5c37\u641f\u7d3a\u5ca1\u525b\u92fc\u7db1\u5d17\u6207\u93ac\u776a\u8aa5\u7e1e\u92ef\u64f1\u9d3f\u95a3\u927b\u500b\u7d07\u9398\u6f41\u7d66\u4e99\u8ce1\u7d86\u9bc1\u9f94\u5bae\u978f\u8ca2\u9264\u6e9d\u830d\u69cb\u8cfc\u5920\u8a6c\u7df1\u89af\u8831\u9867\u8a41\u8f42\u9237\u932e\u9d23\u9d60\u9dbb\u526e\u639b\u9d30\u6451\u95dc\u89c0\u9928\u6163\u8cab\u8a7f\u645c\u9e1b\u9c25\u5ee3\u7377\u898f\u6b78\u9f9c\u95a8\u8ecc\u8a6d\u8cb4\u528a\u532d\u528c\u5aaf\u6a9c\u9bad\u9c56\u8f25\u6efe\u889e\u7dc4\u9bc0\u934b\u570b\u904e\u581d\u54bc\u5e57\u69e8\u87c8\u927f\u99ed\u97d3\u6f22\u95de\u7d4e\u9821\u865f\u705d\u9865\u95a1\u9db4\u8cc0\u8a36\u95d4\u8823\u6a6b\u8f5f\u9d3b\u7d05\u9ecc\u8a0c\u8452\u958e\u9c5f\u58fa\u8b77\u6eec\u6236\u6ef8\u9d98\u5629\u83ef\u756b\u5283\u8a71\u9a4a\u6a3a\u93f5\u61f7\u58de\u6b61\u74b0\u9084\u7de9\u63db\u559a\u7613\u7165\u6e19\u5950\u7e6f\u9370\u9bc7\u9ec3\u8b0a\u9c09\u63ee\u8f1d\u6bc0\u8cc4\u7a62\u6703\u71f4\u532f\u8af1\u8aa8\u7e6a\u8a7c\u8588\u5666\u6fae\u7e62\u743f\u6689\u8477\u6e3e\u8ae2\u991b\u95bd\u7372\u8ca8\u798d\u9225\u944a\u64ca\u6a5f\u7a4d\u9951\u8de1\u8b4f\u96de\u7e3e\u7ddd\u6975\u8f2f\u7d1a\u64e0\u5e7e\u858a\u5291\u6fdf\u8a08\u8a18\u969b\u7e7c\u7d00\u8a10\u8a70\u85ba\u5630\u568c\u9a65\u74a3\u89ac\u9f4f\u78ef\u7f88\u8806\u8e8b\u973d\u9c6d\u9bfd\u593e\u83a2\u9830\u8cc8\u9240\u50f9\u99d5\u90df\u6d79\u92cf\u93b5\u87ef\u6bb2\u76e3\u5805\u7b8b\u9593\u8271\u7dd8\u7e6d\u6aa2\u583f\u9e7c\u63c0\u64bf\u7c21\u5109\u6e1b\u85a6\u6abb\u9452\u8e10\u8ce4\u898b\u9375\u8266\u528d\u991e\u6f38\u6ffa\u6f97\u8aeb\u7e11\u6214\u6229\u77bc\u9dbc\u7b67\u9c39\u97c9\u5c07\u6f3f\u8523\u69f3\u734e\u8b1b\u91ac\u7d73\u97c1\u81a0\u6f86\u9a55\u5b0c\u652a\u9278\u77ef\u50e5\u8173\u9903\u7e73\u7d5e\u8f4e\u8f03\u649f\u5da0\u9de6\u9bab\u968e\u7bc0\u6f54\u7d50\u8aa1\u5c46\u7664\u981c\u9b9a\u7dca\u9326\u50c5\u8b39\u9032\u6649\u71fc\u76e1\u52c1\u834a\u8396\u5df9\u85ce\u9949\u7e09\u8d10\u89b2\u9be8\u9a5a\u7d93\u9838\u975c\u93e1\u5f91\u75d9\u7af6\u51c8\u5244\u6d87\u9015\u5f33\u811b\u975a\u7cfe\u5ec4\u820a\u9b2e\u9ce9\u9df2\u99d2\u8209\u64da\u92f8\u61fc\u5287\u8a4e\u5c68\u6af8\u98b6\u9245\u92e6\u7ab6\u9f5f\u9d51\u7d79\u9308\u942b\u96cb\u89ba\u6c7a\u7d55\u8b4e\u73a8\u921e\u8ecd\u99ff\u76b8\u958b\u51f1\u5274\u584f\u613e\u6137\u93a7\u9347\u9f95\u958c\u9227\u92ac\u9846\u6bbc\u8ab2\u9a0d\u7dd9\u8efb\u9233\u9301\u9837\u58be\u61c7\u9f66\u93d7\u6473\u5eab\u8932\u56b3\u584a\u5108\u9136\u5672\u81be\u5bec\u736a\u9ad6\u7926\u66e0\u6cc1\u8a86\u8a91\u913a\u58d9\u7e8a\u8cba\u8667\u5dcb\u7aba\u994b\u6f70\u5331\u8562\u6192\u8075\u7c23\u95ab\u9315\u9be4\u64f4\u95ca\u8810\u881f\u81d8\u840a\u4f86\u8cf4\u5d0d\u5fa0\u6df6\u7028\u8cda\u775e\u9338\u7669\u7c5f\u85cd\u6b04\u6514\u7c43\u95cc\u862d\u703e\u8b95\u652c\u89bd\u61f6\u7e9c\u721b\u6feb\u5d50\u6b16\u6595\u946d\u8964\u746f\u95ac\u92c3\u6488\u52de\u6f87\u562e\u5d97\u92a0\u9412\u7646\u6a02\u9c33\u9433\u58d8\u985e\u6dda\u8a84\u7e32\u7c6c\u8c8d\u96e2\u9bc9\u79ae\u9e97\u53b2\u52f5\u792b\u6b77\u701d\u96b8\u5137\u9148\u58e2\u85f6\u849e\u863a\u56a6\u9090\u9a6a\u7e2d\u6aea\u6adf\u8f62\u792a\u92f0\u9e1d\u7658\u7cf2\u8e92\u9742\u9c7a\u9c67\u5006\u806f\u84ee\u9023\u942e\u6190\u6f23\u7c3e\u6582\u81c9\u93c8\u6200\u7149\u7df4\u861e\u5969\u7032\u7489\u6bae\u8933\u895d\u9c31\u7ce7\u6dbc\u5169\u8f1b\u8ad2\u9b4e\u7642\u907c\u9410\u7e5a\u91d5\u9def\u7375\u81e8\u9130\u9c57\u51dc\u8cc3\u85fa\u5ee9\u6a81\u8f54\u8eaa\u9f61\u9234\u9748\u5dba\u9818\u7dbe\u6b1e\u87f6\u9bea\u993e\u5289\u700f\u9a2e\u7db9\u93a6\u9dda\u9f8d\u807e\u56a8\u7c60\u58df\u650f\u96b4\u8622\u7027\u74cf\u6af3\u6727\u7931\u6a13\u5a41\u645f\u7c0d\u50c2\u851e\u560d\u5d81\u93e4\u763a\u802c\u87bb\u9acf\u8606\u76e7\u9871\u5eec\u7210\u64c4\u9e75\u865c\u9b6f\u8cc2\u797f\u9304\u9678\u58da\u64fc\u5695\u95ad\u7018\u6de5\u6ae8\u6ad3\u8f64\u8f05\u8f46\u6c0c\u81da\u9e15\u9dfa\u826b\u9c78\u5dd2\u6523\u5b7f\u7064\u4e82\u81e0\u5b4c\u6b12\u9e1e\u947e\u6384\u8f2a\u502b\u4f96\u6dea\u7db8\u8ad6\u5707\u863f\u7f85\u908f\u947c\u7c6e\u9a3e\u99f1\u7d61\u7296\u7380\u6ffc\u6b0f\u8161\u93cd\u9a62\u5442\u92c1\u4fb6\u5c62\u7e37\u616e\u6ffe\u7da0\u6ada\u8938\u92dd\u5638\u5abd\u746a\u78bc\u879e\u99ac\u7f75\u55ce\u561c\u5b24\u69aa\u8cb7\u9ea5\u8ce3\u9081\u8108\u52f1\u779e\u9945\u883b\u6eff\u8b3e\u7e35\u93dd\u9859\u9c3b\u8c93\u9328\u925a\u8cbf\u9ebc\u6c92\u9382\u9580\u60b6\u5011\u636b\u71dc\u61e3\u9346\u9333\u5922\u7787\u8b0e\u5f4c\u8993\u51aa\u7f8b\u8b10\u737c\u79b0\u7dbf\u7dec\u6fa0\u9766\u9efd\u5edf\u7df2\u7e46\u6ec5\u61ab\u95a9\u9594\u7de1\u9cf4\u9298\u8b2c\u8b28\u9a40\u9943\u6b7f\u93cc\u8b00\u755d\u926c\u5436\u9209\u7d0d\u96e3\u6493\u8166\u60f1\u9b27\u9403\u8a25\u9912\u5167\u64ec\u81a9\u922e\u9be2\u6506\u8f26\u9bf0\u91c0\u9ce5\u8526\u88ca\u8076\u5699\u9477\u93b3\u9689\u8617\u56c1\u9862\u8ea1\u6ab8\u7370\u5be7\u64f0\u6fd8\u82e7\u5680\u8079\u9215\u7d10\u81bf\u6fc3\u8fb2\u5102\u5665\u99d1\u91f9\u8afe\u513a\u7627\u6b50\u9dd7\u6bc6\u5614\u6f1a\u8b33\u616a\u750c\u76e4\u8e63\u9f90\u62cb\u76b0\u8ce0\u8f61\u5674\u9d6c\u7d15\u7f86\u9239\u9a19\u8ade\u99e2\u98c4\u7e39\u983b\u8ca7\u5b2a\u860b\u6191\u8a55\u6f51\u9817\u91d9\u64b2\u92ea\u6a38\u8b5c\u93f7\u9420\u68f2\u81cd\u9f4a\u9a0e\u8c48\u555f\u6c23\u68c4\u8a16\u8604\u9a0f\u7dba\u69bf\u78e7\u980e\u980f\u9c2d\u727d\u91ec\u925b\u9077\u7c3d\u8b19\u9322\u9257\u6f5b\u6dfa\u8b74\u5879\u50c9\u8541\u6173\u9a2b\u7e7e\u69e7\u9210\u69cd\u55c6\u58bb\u8594\u5f37\u6436\u5b19\u6aa3\u6227\u7197\u9306\u93d8\u93f9\u7fa5\u8e4c\u936c\u6a4b\u55ac\u50d1\u7ff9\u7ac5\u8a9a\u8b59\u854e\u7e70\u78fd\u8e7a\u7aca\u611c\u9365\u7bcb\u6b3d\u89aa\u5be2\u92df\u8f15\u6c2b\u50be\u9803\u8acb\u6176\u64b3\u9bd6\u74ca\u7aae\u7162\u86fa\u5df0\u8cd5\u87e3\u9c0d\u8da8\u5340\u8ec0\u9a45\u9f72\u8a58\u5d87\u95c3\u89b7\u9d1d\u9874\u6b0a\u52f8\u8a6e\u7da3\u8f07\u9293\u537b\u9d72\u78ba\u95cb\u95d5\u6128\u8b93\u9952\u64fe\u7e5e\u8558\u5b08\u6a48\u71b1\u97cc\u8a8d\u7d09\u98ea\u8ed4\u69ae\u7d68\u5db8\u8811\u7e1f\u92a3\u9870\u8edf\u92b3\u8706\u958f\u6f64\u7051\u85a9\u98af\u9c13\u8cfd\u5098\u6bff\u7cdd\u55aa\u9a37\u6383\u7e45\u6f80\u55c7\u92ab\u7a61\u6bba\u524e\u7d17\u93a9\u9bca\u7be9\u66ec\u91c3\u522a\u9583\u965c\u8d0d\u7e55\u8a15\u59cd\u9a38\u91e4\u9c54\u5891\u50b7\u8cde\u5770\u6ba4\u89f4\u71d2\u7d39\u8cd2\u651d\u61fe\u8a2d\u5399\u7044\u756c\u7d33\u5be9\u5b38\u814e\u6ef2\u8a75\u8ad7\u700b\u8072\u7e69\u52dd\u5e2b\u7345\u6fd5\u8a69\u6642\u8755\u5be6\u8b58\u99db\u52e2\u9069\u91cb\u98fe\u8996\u8a66\u8b1a\u5852\u8494\u5f12\u8efe\u8cb0\u9230\u9c23\u58fd\u7378\u7dac\u6a1e\u8f38\u66f8\u8d16\u5c6c\u8853\u6a39\u8c4e\u6578\u6504\u7d13\u5e25\u9582\u96d9\u8ab0\u7a05\u9806\u8aaa\u78a9\u720d\u9460\u7d72\u98fc\u5edd\u99df\u7de6\u9376\u9de5\u8073\u616b\u980c\u8a1f\u8aa6\u64fb\u85ea\u993f\u98bc\u93aa\u8607\u8a34\u8085\u8b16\u7a4c\u96d6\u96a8\u7d8f\u6b72\u8ab6\u5b6b\u640d\u7b4d\u84c0\u733b\u7e2e\u7463\u9396\u55e9\u8127\u737a\u64bb\u95e5\u9248\u9c28\u81fa\u614b\u9226\u9b90\u6524\u8caa\u7671\u7058\u58c7\u8b5a\u8ac7\u5606\u66c7\u926d\u931f\u9807\u6e6f\u71d9\u513b\u9933\u940b\u93dc\u6fe4\u7d73\u8a0e\u97dc\u92f1\u9a30\u8b04\u92bb\u984c\u9ad4\u5c5c\u7df9\u9d5c\u95d0\u689d\u7cf6\u9f60\u9c37\u8cbc\u9435\u5ef3\u807d\u70f4\u9285\u7d71\u615f\u982d\u9204\u79bf\u5716\u91f7\u5718\u6476\u9839\u86fb\u98e9\u812b\u9d15\u99b1\u99dd\u6a62\u7c5c\u9f09\u896a\u5aa7\u8183\u5f4e\u7063\u9811\u842c\u7d08\u7db0\u7db2\u8f1e\u97cb\u9055\u570d\u70ba\u6ff0\u7dad\u8466\u5049\u507d\u7def\u8b02\u885b\u8ac9\u5e43\u95c8\u6e88\u6f7f\u744b\u97d9\u7152\u9baa\u6eab\u805e\u7d0b\u7a69\u554f\u95bf\u7515\u64be\u8778\u6e26\u7aa9\u81e5\u8435\u9f77\u55da\u93a2\u70cf\u8aa3\u7121\u856a\u5433\u5862\u9727\u52d9\u8aa4\u9114\u5ee1\u61ae\u5af5\u9a16\u9d61\u9da9\u932b\u72a7\u8972\u7fd2\u9291\u6232\u7d30\u993c\u9b29\u74bd\u89a1\u8766\u8f44\u5cfd\u4fe0\u72f9\u5ec8\u5687\u7864\u9bae\u7e96\u8ce2\u929c\u9591\u986f\u96aa\u73fe\u737b\u7e23\u9921\u7fa8\u61b2\u7dda\u83a7\u859f\u861a\u5cf4\u736b\u5afb\u9df4\u7647\u8814\u79c8\u8e9a\u5ec2\u9472\u9109\u8a73\u97ff\u9805\u858c\u9909\u9a64\u7dd7\u9957\u856d\u56c2\u92b7\u66c9\u562f\u5635\u701f\u9a4d\u7d83\u689f\u7c2b\u5354\u633e\u651c\u8105\u8ae7\u5beb\u7009\u8b1d\u893b\u64f7\u7d32\u7e88\u92c5\u91c1\u8208\u9658\u6ece\u5147\u6d36\u92b9\u7e61\u9948\u9d42\u865b\u5653\u9808\u8a31\u6558\u7dd2\u7e8c\u8a61\u980a\u8ed2\u61f8\u9078\u766c\u7d62\u8afc\u9249\u93c7\u5b78\u8b14\u6fa9\u9c48\u52db\u8a62\u5c0b\u99b4\u8a13\u8a0a\u905c\u5864\u6f6f\u9c58\u58d3\u9d09\u9d28\u555e\u4e9e\u8a1d\u57e1\u5a6d\u690f\u6c2c\u95b9\u7159\u9e7d\u56b4\u5dd6\u984f\u95bb\u8277\u53ad\u786f\u5f65\u8afa\u9a57\u53b4\u8d17\u513c\u5157\u8b9e\u61e8\u9586\u91c5\u9b58\u995c\u9f34\u9d26\u694a\u63da\u760d\u967d\u7662\u990a\u6a23\u716c\u7464\u6416\u582f\u9059\u7aaf\u8b20\u85e5\u8efa\u9dc2\u9c29\u723a\u9801\u696d\u8449\u9768\u8b01\u9134\u66c4\u71c1\u91ab\u92a5\u9824\u907a\u5100\u87fb\u85dd\u5104\u61b6\u7fa9\u8a63\u8b70\u8abc\u8b6f\u7570\u7e79\u8a52\u56c8\u5da7\u98f4\u61cc\u9a5b\u7e0a\u8efc\u8cbd\u91d4\u93b0\u943f\u761e\u8264\u852d\u9670\u9280\u98f2\u96b1\u92a6\u766e\u6afb\u5b30\u9df9\u61c9\u7e93\u7469\u87a2\u71df\u7192\u8805\u8d0f\u7a4e\u584b\u9daf\u7e08\u93a3\u6516\u56b6\u7005\u7020\u74d4\u9e1a\u766d\u9826\u7f4c\u55b2\u64c1\u50ad\u7670\u8e34\u8a60\u93de\u512a\u6182\u90f5\u923e\u7336\u8a98\u8555\u92aa\u9b77\u8f3f\u9b5a\u6f01\u5a1b\u8207\u5dbc\u8a9e\u7344\u8b7d\u9810\u99ad\u50b4\u4fc1\u8adb\u8aed\u8577\u5d33\u98eb\u95be\u5ad7\u7d06\u89a6\u6b5f\u923a\u9d52\u9df8\u9f6c\u9d1b\u6df5\u8f45\u5712\u54e1\u5713\u7de3\u9060\u6ade\u9cf6\u9eff\u7d04\u8e8d\u9470\u7cb5\u6085\u95b1\u925e\u9116\u52fb\u9695\u904b\u860a\u919e\u6688\u97fb\u9106\u8553\u60f2\u614d\u7d1c\u97de\u6b9e\u6c33\u96dc\u707d\u8f09\u6522\u66ab\u8d0a\u74da\u8db2\u93e8\u8d13\u81df\u99d4\u947f\u68d7\u8cac\u64c7\u5247\u6fa4\u8cfe\u5616\u5e58\u7c00\u8cca\u8b56\u8d08\u7d9c\u7e52\u8ecb\u9358\u9598\u67f5\u8a50\u9f4b\u50b5\u6c08\u76de\u65ac\u8f3e\u5d84\u68e7\u6230\u7dbb\u8b6b\u5f35\u6f32\u5e33\u8cec\u8139\u8d99\u8a54\u91d7\u87c4\u8f4d\u937a\u9019\u8b2b\u8f12\u9dd3\u8c9e\u91dd\u5075\u8a3a\u93ae\u9663\u6e5e\u7e1d\u6968\u8eeb\u8cd1\u798e\u9d06\u6399\u775c\u7319\u722d\u5e40\u7665\u912d\u8b49\u8acd\u5d22\u9266\u931a\u7b8f\u7e54\u8077\u57f7\u7d19\u646f\u64f2\u5e5f\u8cea\u6eef\u9a2d\u6adb\u6894\u8ef9\u8f0a\u8d04\u9dd9\u8784\u7e36\u8e93\u8e91\u89f6\u9418\u7d42\u7a2e\u816b\u773e\u937e\u8b05\u8ef8\u76ba\u665d\u9a5f\u7d02\u7e10\u8c6c\u8af8\u8a85\u71ed\u77da\u56d1\u8caf\u9444\u99d0\u4f47\u6ae7\u9296\u5c08\u78da\u8f49\u8cfa\u56c0\u994c\u9873\u6a01\u838a\u88dd\u599d\u58ef\u72c0\u9310\u8d05\u589c\u7db4\u9a05\u7e0b\u8ac4\u6e96\u8457\u6fc1\u8ad1\u9432\u8332\u8cc7\u6f2c\u8aee\u7dc7\u8f1c\u8cb2\u7725\u9319\u9f5c\u9bd4\u8e64\u7e3d\u7e31\u50af\u9112\u8acf\u9a36\u9beb\u8a5b\u7d44\u93c3\u9246\u7e98\u8ea6\u9c52\u7ffa\u4e26\u8514\u6c88\u919c\u6fb1\u53e0\u9b25\u7bc4\u5e79\u81ef\u77fd\u6ac3\u5f8c\u5925\u7a2d\u5091\u8a23\u8a87\u88cf\u6de9\u9ebd\u9ef4\u649a\u6dd2\u6261\u8056\u5c4d\u64e1\u5857\u7aaa\u9935\u6c59\u9341\u9e79\u880d\u5f5c\u6e67\u904a\u7c72\u79a6\u9858\u5dbd\u96f2\u7ac8\u7d2e\u5284\u7bc9\u65bc\u8a8c\u8a3b\u96d5\u8a01\u8b7e\u90e4\u731b\u6c39\u962a\u58df\u5816\u57b5\u588a\u6abe\u8552\u8464\u84e7\u8493\u83c7\u69c1\u6463\u54a4\u551a\u54e2\u565d\u5645\u6485\u567c\u8b14\u8946\u5db4\u810a\u4eff\u50e5\u7341\u9e85\u9918\u9937\u994a\u9962\u695e\u6035\u61cd\u723f\u6f35\u7069\u6eb7\u6feb\u7026\u6de1\u5be7\u7cf8\u7d5d\u7dd4\u7449\u6898\u68ec\u6848\u6a70\u6aeb\u8ef2\u8ee4\u8ceb\u8181\u8156\u98c8\u7cca\u7146\u6e9c\u6e63\u6e3a\u78b8\u6efe\u7798\u9208\u9255\u92e3\u92b1\u92e5\u92f6\u9426\u9427\u9369\u9340\u9343\u9307\u9384\u9387\u93bf\u941d\u9465\u9479\u9454\u7a6d\u9d93\u9da5\u9e0c\u7667\u5c59\u7602\u81d2\u8947\u7e48\u802e\u986c\u87ce\u9eaf\u9b81\u9b83\u9b8e\u9bd7\u9bdd\u9bf4\u9c5d\u9bff\u9c20\u9c35\u9c45\u97bd\u97dd\u9f47\u846f\u617e\u88e1\u59ca\u4f54\u5fb5\u5537\u52d0\u7832\u9aee\u6fb9\u5641\u59e6\u4e7e\u9b06\u59ea\u56c9\";\nz = \"\u9515\u7691\u853c\u788d\u7231\u55f3\u5ad2\u7477\u66a7\u972d\u8c19\u94f5\u9e4c\u80ae\u8884\u5965\u5aaa\u9a9c\u9ccc\u575d\u7f62\u94af\u6446\u8d25\u5457\u9881\u529e\u7eca\u94a3\u5e2e\u7ed1\u9551\u8c24\u5265\u9971\u5b9d\u62a5\u9c8d\u9e28\u9f85\u8f88\u8d1d\u94a1\u72c8\u5907\u60eb\u9e4e\u8d32\u951b\u7ef7\u7b14\u6bd5\u6bd9\u5e01\u95ed\u835c\u54d4\u6ed7\u94cb\u7b5a\u8df8\u8fb9\u7f16\u8d2c\u53d8\u8fa9\u8fab\u82c4\u7f0f\u7b3e\u6807\u9aa0\u98d1\u98d9\u9556\u9556\u9cd4\u9cd6\u522b\u762a\u6fd2\u6ee8\u5bbe\u6448\u50a7\u7f24\u69df\u6ba1\u8191\u9554\u9acc\u9b13\u997c\u7980\u62e8\u94b5\u94c2\u9a73\u997d\u94b9\u9e41\u8865\u94b8\u8d22\u53c2\u8695\u6b8b\u60ed\u60e8\u707f\u9a96\u9eea\u82cd\u8231\u4ed3\u6ca7\u5395\u4fa7\u518c\u6d4b\u607b\u5c42\u8be7\u9538\u4faa\u9497\u6400\u63ba\u8749\u998b\u8c17\u7f20\u94f2\u4ea7\u9610\u98a4\u5181\u8c04\u8c36\u8487\u5fcf\u5a75\u9aa3\u89c7\u7985\u9561\u573a\u5c1d\u957f\u507f\u80a0\u5382\u7545\u4f25\u82cc\u6005\u960a\u9cb3\u949e\u8f66\u5f7b\u7817\u5c18\u9648\u886c\u4f27\u8c0c\u6987\u789c\u9f80\u6491\u79f0\u60e9\u8bda\u9a8b\u67a8\u67fd\u94d6\u94db\u75f4\u8fdf\u9a70\u803b\u9f7f\u70bd\u996c\u9e31\u51b2\u51b2\u866b\u5ba0\u94f3\u7574\u8e0c\u7b79\u7ef8\u4fe6\u5e31\u96e0\u6a71\u53a8\u9504\u96cf\u7840\u50a8\u89e6\u5904\u520d\u7ecc\u8e70\u4f20\u948f\u75ae\u95ef\u521b\u6006\u9524\u7f0d\u7eaf\u9e51\u7ef0\u8f8d\u9f8a\u8f9e\u8bcd\u8d50\u9e5a\u806a\u8471\u56f1\u4ece\u4e1b\u82c1\u9aa2\u679e\u51d1\u8f8f\u8e7f\u7a9c\u64ba\u9519\u9509\u9e7e\u8fbe\u54d2\u9791\u5e26\u8d37\u9a80\u7ed0\u62c5\u5355\u90f8\u63b8\u80c6\u60ee\u8bde\u5f39\u6b9a\u8d55\u7605\u7baa\u5f53\u6321\u515a\u8361\u6863\u8c20\u7800\u88c6\u6363\u5c9b\u7977\u5bfc\u76d7\u7118\u706f\u9093\u956b\u654c\u6da4\u9012\u7f14\u7c74\u8bcb\u8c1b\u7ee8\u89cc\u955d\u98a0\u70b9\u57ab\u7535\u5dc5\u94bf\u766b\u9493\u8c03\u94eb\u9cb7\u8c0d\u53e0\u9cbd\u9489\u9876\u952d\u8ba2\u94e4\u4e22\u94e5\u4e1c\u52a8\u680b\u51bb\u5cbd\u9e2b\u7aa6\u728a\u72ec\u8bfb\u8d4c\u9540\u6e0e\u691f\u724d\u7b03\u9ee9\u953b\u65ad\u7f0e\u7c16\u5151\u961f\u5bf9\u603c\u9566\u5428\u987f\u949d\u7096\u8db8\u593a\u5815\u94ce\u9e45\u989d\u8bb9\u6076\u997f\u8c14\u57a9\u960f\u8f6d\u9507\u9537\u9e57\u989a\u989b\u9cc4\u8bf6\u513f\u5c14\u9975\u8d30\u8fe9\u94d2\u9e38\u9c95\u53d1\u7f5a\u9600\u73d0\u77fe\u9492\u70e6\u8d29\u996d\u8bbf\u7eba\u94ab\u9c82\u98de\u8bfd\u5e9f\u8d39\u7eef\u9544\u9cb1\u7eb7\u575f\u594b\u6124\u7caa\u507e\u4e30\u67ab\u950b\u98ce\u75af\u51af\u7f1d\u8bbd\u51e4\u6ca3\u80a4\u8f90\u629a\u8f85\u8d4b\u590d\u8d1f\u8ba3\u5987\u7f1a\u51eb\u9a78\u7ec2\u7ecb\u8d59\u9eb8\u9c8b\u9cc6\u9486\u8be5\u9499\u76d6\u8d45\u6746\u8d76\u79c6\u8d63\u5c34\u64c0\u7ec0\u5188\u521a\u94a2\u7eb2\u5c97\u6206\u9550\u777e\u8bf0\u7f1f\u9506\u6401\u9e3d\u9601\u94ec\u4e2a\u7ea5\u9549\u988d\u7ed9\u4e98\u8d53\u7ee0\u9ca0\u9f9a\u5bab\u5de9\u8d21\u94a9\u6c9f\u82df\u6784\u8d2d\u591f\u8bdf\u7f11\u89cf\u86ca\u987e\u8bc2\u6bc2\u94b4\u9522\u9e2a\u9e44\u9e58\u5250\u6302\u9e39\u63b4\u5173\u89c2\u9986\u60ef\u8d2f\u8bd6\u63bc\u9e73\u9ccf\u5e7f\u72b7\u89c4\u5f52\u9f9f\u95fa\u8f68\u8be1\u8d35\u523d\u5326\u523f\u59ab\u6867\u9c91\u9cdc\u8f8a\u6eda\u886e\u7ef2\u9ca7\u9505\u56fd\u8fc7\u57da\u5459\u5e3c\u6901\u8748\u94ea\u9a87\u97e9\u6c49\u961a\u7ed7\u9889\u53f7\u704f\u98a2\u9602\u9e64\u8d3a\u8bc3\u9616\u86ce\u6a2a\u8f70\u9e3f\u7ea2\u9ec9\u8ba7\u836d\u95f3\u9c8e\u58f6\u62a4\u6caa\u6237\u6d52\u9e55\u54d7\u534e\u753b\u5212\u8bdd\u9a85\u6866\u94e7\u6000\u574f\u6b22\u73af\u8fd8\u7f13\u6362\u5524\u75ea\u7115\u6da3\u5942\u7f33\u953e\u9ca9\u9ec4\u8c0e\u9cc7\u6325\u8f89\u6bc1\u8d3f\u79fd\u4f1a\u70e9\u6c47\u8bb3\u8bf2\u7ed8\u8bd9\u835f\u54d5\u6d4d\u7f0b\u73f2\u6656\u8364\u6d51\u8be8\u9984\u960d\u83b7\u8d27\u7978\u94ac\u956c\u51fb\u673a\u79ef\u9965\u8ff9\u8ba5\u9e21\u7ee9\u7f09\u6781\u8f91\u7ea7\u6324\u51e0\u84df\u5242\u6d4e\u8ba1\u8bb0\u9645\u7ee7\u7eaa\u8ba6\u8bd8\u8360\u53fd\u54dc\u9aa5\u7391\u89ca\u9f51\u77f6\u7f81\u867f\u8dfb\u9701\u9c9a\u9cab\u5939\u835a\u988a\u8d3e\u94be\u4ef7\u9a7e\u90cf\u6d43\u94d7\u9553\u86f2\u6b7c\u76d1\u575a\u7b3a\u95f4\u8270\u7f04\u8327\u68c0\u78b1\u7877\u62e3\u6361\u7b80\u4fed\u51cf\u8350\u69db\u9274\u8df5\u8d31\u89c1\u952e\u8230\u5251\u996f\u6e10\u6e85\u6da7\u8c0f\u7f23\u620b\u622c\u7751\u9e63\u7b15\u9ca3\u97af\u5c06\u6d46\u848b\u6868\u5956\u8bb2\u9171\u7edb\u7f30\u80f6\u6d47\u9a84\u5a07\u6405\u94f0\u77eb\u4fa5\u811a\u997a\u7f34\u7ede\u8f7f\u8f83\u6322\u5ce4\u9e6a\u9c9b\u9636\u8282\u6d01\u7ed3\u8beb\u5c4a\u7596\u988c\u9c92\u7d27\u9526\u4ec5\u8c28\u8fdb\u664b\u70ec\u5c3d\u52b2\u8346\u830e\u537a\u8369\u9991\u7f19\u8d46\u89d0\u9cb8\u60ca\u7ecf\u9888\u9759\u955c\u5f84\u75c9\u7ade\u51c0\u522d\u6cfe\u8ff3\u5f2a\u80eb\u9753\u7ea0\u53a9\u65e7\u9604\u9e20\u9e6b\u9a79\u4e3e\u636e\u952f\u60e7\u5267\u8bb5\u5c66\u6989\u98d3\u949c\u9514\u7aad\u9f83\u9e43\u7ee2\u9529\u954c\u96bd\u89c9\u51b3\u7edd\u8c32\u73cf\u94a7\u519b\u9a8f\u76b2\u5f00\u51ef\u5240\u57b2\u5ffe\u607a\u94e0\u9534\u9f9b\u95f6\u94aa\u94d0\u9897\u58f3\u8bfe\u9a92\u7f02\u8f72\u94b6\u951e\u9894\u57a6\u6073\u9f88\u94ff\u62a0\u5e93\u88e4\u55be\u5757\u4fa9\u90d0\u54d9\u810d\u5bbd\u72ef\u9acb\u77ff\u65f7\u51b5\u8bd3\u8bf3\u909d\u5739\u7ea9\u8d36\u4e8f\u5cbf\u7aa5\u9988\u6e83\u532e\u8489\u6126\u8069\u7bd1\u9603\u951f\u9cb2\u6269\u9614\u86f4\u8721\u814a\u83b1\u6765\u8d56\u5d03\u5f95\u6d9e\u6fd1\u8d49\u7750\u94fc\u765e\u7c41\u84dd\u680f\u62e6\u7bee\u9611\u5170\u6f9c\u8c30\u63fd\u89c8\u61d2\u7f06\u70c2\u6ee5\u5c9a\u6984\u6593\u9567\u8934\u7405\u9606\u9512\u635e\u52b3\u6d9d\u5520\u5d02\u94d1\u94f9\u75e8\u4e50\u9cd3\u956d\u5792\u7c7b\u6cea\u8bd4\u7f27\u7bf1\u72f8\u79bb\u9ca4\u793c\u4e3d\u5389\u52b1\u783e\u5386\u6ca5\u96b6\u4fea\u90e6\u575c\u82c8\u8385\u84e0\u5456\u9026\u9a8a\u7f21\u67a5\u680e\u8f79\u783a\u9502\u9e42\u75a0\u7c9d\u8dde\u96f3\u9ca1\u9ce2\u4fe9\u8054\u83b2\u8fde\u9570\u601c\u6d9f\u5e18\u655b\u8138\u94fe\u604b\u70bc\u7ec3\u8539\u5941\u6f4b\u740f\u6b93\u88e2\u88e3\u9ca2\u7cae\u51c9\u4e24\u8f86\u8c05\u9b49\u7597\u8fbd\u9563\u7f2d\u948c\u9e69\u730e\u4e34\u90bb\u9cde\u51db\u8d41\u853a\u5eea\u6aa9\u8f9a\u8e8f\u9f84\u94c3\u7075\u5cad\u9886\u7eeb\u68c2\u86cf\u9cae\u998f\u5218\u6d4f\u9a9d\u7efa\u954f\u9e68\u9f99\u804b\u5499\u7b3c\u5784\u62e2\u9647\u830f\u6cf7\u73d1\u680a\u80e7\u783b\u697c\u5a04\u6402\u7bd3\u507b\u848c\u55bd\u5d5d\u9542\u7618\u8027\u877c\u9ac5\u82a6\u5362\u9885\u5e90\u7089\u63b3\u5364\u864f\u9c81\u8d42\u7984\u5f55\u9646\u5786\u64b8\u565c\u95fe\u6cf8\u6e0c\u680c\u6a79\u8f73\u8f82\u8f98\u6c07\u80ea\u9e2c\u9e6d\u823b\u9c88\u5ce6\u631b\u5b6a\u6ee6\u4e71\u8114\u5a08\u683e\u9e3e\u92ae\u62a1\u8f6e\u4f26\u4ed1\u6ca6\u7eb6\u8bba\u56f5\u841d\u7f57\u903b\u9523\u7ba9\u9aa1\u9a86\u7edc\u8366\u7321\u6cfa\u6924\u8136\u9559\u9a74\u5415\u94dd\u4fa3\u5c61\u7f15\u8651\u6ee4\u7eff\u6988\u891b\u950a\u5452\u5988\u739b\u7801\u8682\u9a6c\u9a82\u5417\u551b\u5b37\u6769\u4e70\u9ea6\u5356\u8fc8\u8109\u52a2\u7792\u9992\u86ee\u6ee1\u8c29\u7f26\u9558\u98a1\u9cd7\u732b\u951a\u94c6\u8d38\u9ebd\u6ca1\u9541\u95e8\u95f7\u4eec\u626a\u7116\u61d1\u9494\u9530\u68a6\u772f\u8c1c\u5f25\u89c5\u5e42\u8288\u8c27\u7315\u7962\u7ef5\u7f05\u6e11\u817c\u9efe\u5e99\u7f08\u7f2a\u706d\u60af\u95fd\u95f5\u7f17\u9e23\u94ed\u8c2c\u8c1f\u84e6\u998d\u6b81\u9546\u8c0b\u4ea9\u94bc\u5450\u94a0\u7eb3\u96be\u6320\u8111\u607c\u95f9\u94d9\u8bb7\u9981\u5185\u62df\u817b\u94cc\u9cb5\u64b5\u8f87\u9cb6\u917f\u9e1f\u8311\u8885\u8042\u556e\u954a\u954d\u9667\u8616\u55eb\u989f\u8e51\u67e0\u72de\u5b81\u62e7\u6cde\u82ce\u549b\u804d\u94ae\u7ebd\u8113\u6d53\u519c\u4fac\u54dd\u9a7d\u9495\u8bfa\u50a9\u759f\u6b27\u9e25\u6bb4\u5455\u6ca4\u8bb4\u6004\u74ef\u76d8\u8e52\u5e9e\u629b\u75b1\u8d54\u8f94\u55b7\u9e4f\u7eb0\u7f74\u94cd\u9a97\u8c1d\u9a88\u98d8\u7f25\u9891\u8d2b\u5ad4\u82f9\u51ed\u8bc4\u6cfc\u9887\u948b\u6251\u94fa\u6734\u8c31\u9564\u9568\u6816\u8110\u9f50\u9a91\u5c82\u542f\u6c14\u5f03\u8bab\u8572\u9a90\u7eee\u6864\u789b\u9880\u9883\u9ccd\u7275\u948e\u94c5\u8fc1\u7b7e\u8c26\u94b1\u94b3\u6f5c\u6d45\u8c34\u5811\u4f65\u8368\u60ad\u9a9e\u7f31\u6920\u94a4\u67aa\u545b\u5899\u8537\u5f3a\u62a2\u5af1\u6a2f\u6217\u709d\u9516\u9535\u956a\u7f9f\u8dc4\u9539\u6865\u4e54\u4fa8\u7fd8\u7a8d\u8bee\u8c2f\u835e\u7f32\u7857\u8df7\u7a83\u60ec\u9532\u7ba7\u94a6\u4eb2\u5bdd\u9513\u8f7b\u6c22\u503e\u9877\u8bf7\u5e86\u63ff\u9cad\u743c\u7a77\u8315\u86f1\u5def\u8d47\u866e\u9cc5\u8d8b\u533a\u8eaf\u9a71\u9f8b\u8bce\u5c96\u9612\u89d1\u9e32\u98a7\u6743\u529d\u8be0\u7efb\u8f81\u94e8\u5374\u9e4a\u786e\u9615\u9619\u60ab\u8ba9\u9976\u6270\u7ed5\u835b\u5a06\u6861\u70ed\u97e7\u8ba4\u7eab\u996a\u8f6b\u8363\u7ed2\u5d58\u877e\u7f1b\u94f7\u98a6\u8f6f\u9510\u86ac\u95f0\u6da6\u6d12\u8428\u98d2\u9cc3\u8d5b\u4f1e\u6bf5\u7cc1\u4e27\u9a9a\u626b\u7f2b\u6da9\u556c\u94ef\u7a51\u6740\u5239\u7eb1\u94e9\u9ca8\u7b5b\u6652\u917e\u5220\u95ea\u9655\u8d61\u7f2e\u8baa\u59d7\u9a9f\u9490\u9cdd\u5892\u4f24\u8d4f\u57a7\u6b87\u89de\u70e7\u7ecd\u8d4a\u6444\u6151\u8bbe\u538d\u6ee0\u7572\u7ec5\u5ba1\u5a76\u80be\u6e17\u8bdc\u8c02\u6e16\u58f0\u7ef3\u80dc\u5e08\u72ee\u6e7f\u8bd7\u65f6\u8680\u5b9e\u8bc6\u9a76\u52bf\u9002\u91ca\u9970\u89c6\u8bd5\u8c25\u57d8\u83b3\u5f11\u8f7c\u8d33\u94c8\u9ca5\u5bff\u517d\u7ef6\u67a2\u8f93\u4e66\u8d4e\u5c5e\u672f\u6811\u7ad6\u6570\u6445\u7ebe\u5e05\u95e9\u53cc\u8c01\u7a0e\u987a\u8bf4\u7855\u70c1\u94c4\u4e1d\u9972\u53ae\u9a77\u7f0c\u9536\u9e36\u8038\u6002\u9882\u8bbc\u8bf5\u64de\u85ae\u998a\u98d5\u953c\u82cf\u8bc9\u8083\u8c21\u7a23\u867d\u968f\u7ee5\u5c81\u8c07\u5b59\u635f\u7b0b\u836a\u72f2\u7f29\u7410\u9501\u5522\u7743\u736d\u631e\u95fc\u94ca\u9cce\u53f0\u6001\u949b\u9c90\u644a\u8d2a\u762b\u6ee9\u575b\u8c2d\u8c08\u53f9\u6619\u94bd\u952c\u9878\u6c64\u70eb\u50a5\u9967\u94f4\u9557\u6d9b\u7ee6\u8ba8\u97ec\u94fd\u817e\u8a8a\u9511\u9898\u4f53\u5c49\u7f07\u9e48\u9617\u6761\u7c9c\u9f86\u9ca6\u8d34\u94c1\u5385\u542c\u70c3\u94dc\u7edf\u6078\u5934\u94ad\u79c3\u56fe\u948d\u56e2\u629f\u9893\u8715\u9968\u8131\u9e35\u9a6e\u9a7c\u692d\u7ba8\u9f0d\u889c\u5a32\u817d\u5f2f\u6e7e\u987d\u4e07\u7ea8\u7efe\u7f51\u8f8b\u97e6\u8fdd\u56f4\u4e3a\u6f4d\u7ef4\u82c7\u4f1f\u4f2a\u7eac\u8c13\u536b\u8bff\u5e0f\u95f1\u6ca9\u6da0\u73ae\u97ea\u709c\u9c94\u6e29\u95fb\u7eb9\u7a33\u95ee\u960c\u74ee\u631d\u8717\u6da1\u7a9d\u5367\u83b4\u9f8c\u545c\u94a8\u4e4c\u8bec\u65e0\u829c\u5434\u575e\u96fe\u52a1\u8bef\u90ac\u5e91\u6003\u59a9\u9a9b\u9e49\u9e5c\u9521\u727a\u88ad\u4e60\u94e3\u620f\u7ec6\u9969\u960b\u73ba\u89cb\u867e\u8f96\u5ce1\u4fa0\u72ed\u53a6\u5413\u7856\u9c9c\u7ea4\u8d24\u8854\u95f2\u663e\u9669\u73b0\u732e\u53bf\u9985\u7fa1\u5baa\u7ebf\u82cb\u83b6\u85d3\u5c98\u7303\u5a34\u9e47\u75eb\u869d\u7c7c\u8df9\u53a2\u9576\u4e61\u8be6\u54cd\u9879\u8297\u9977\u9aa7\u7f03\u98e8\u8427\u56a3\u9500\u6653\u5578\u54d3\u6f47\u9a81\u7ee1\u67ad\u7bab\u534f\u631f\u643a\u80c1\u8c10\u5199\u6cfb\u8c22\u4eb5\u64b7\u7ec1\u7f2c\u950c\u8845\u5174\u9649\u8365\u51f6\u6c79\u9508\u7ee3\u9990\u9e3a\u865a\u5618\u987b\u8bb8\u53d9\u7eea\u7eed\u8be9\u987c\u8f69\u60ac\u9009\u7663\u7eda\u8c16\u94c9\u955f\u5b66\u8c11\u6cf6\u9cd5\u52cb\u8be2\u5bfb\u9a6f\u8bad\u8baf\u900a\u57d9\u6d54\u9c9f\u538b\u9e26\u9e2d\u54d1\u4e9a\u8bb6\u57ad\u5a05\u6860\u6c29\u9609\u70df\u76d0\u4e25\u5ca9\u989c\u960e\u8273\u538c\u781a\u5f66\u8c1a\u9a8c\u53a3\u8d5d\u4fe8\u5156\u8c33\u6079\u95eb\u917d\u9b47\u990d\u9f39\u9e2f\u6768\u626c\u75a1\u9633\u75d2\u517b\u6837\u7080\u7476\u6447\u5c27\u9065\u7a91\u8c23\u836f\u8f7a\u9e5e\u9cd0\u7237\u9875\u4e1a\u53f6\u9765\u8c12\u90ba\u6654\u70e8\u533b\u94f1\u9890\u9057\u4eea\u8681\u827a\u4ebf\u5fc6\u4e49\u8be3\u8bae\u8c0a\u8bd1\u5f02\u7ece\u8bd2\u5453\u5cc4\u9974\u603f\u9a7f\u7f22\u8f76\u8d3b\u9487\u9552\u9571\u7617\u8223\u836b\u9634\u94f6\u996e\u9690\u94df\u763e\u6a31\u5a74\u9e70\u5e94\u7f28\u83b9\u8424\u8425\u8367\u8747\u8d62\u9896\u8314\u83ba\u8426\u84e5\u6484\u5624\u6ee2\u6f46\u748e\u9e66\u763f\u988f\u7f42\u54df\u62e5\u4f63\u75c8\u8e0a\u548f\u955b\u4f18\u5fe7\u90ae\u94c0\u72b9\u8bf1\u83b8\u94d5\u9c7f\u8206\u9c7c\u6e14\u5a31\u4e0e\u5c7f\u8bed\u72f1\u8a89\u9884\u9a6d\u4f1b\u4fe3\u8c00\u8c15\u84e3\u5d5b\u996b\u9608\u59aa\u7ea1\u89ce\u6b24\u94b0\u9e46\u9e6c\u9f89\u9e33\u6e0a\u8f95\u56ed\u5458\u5706\u7f18\u8fdc\u6a7c\u9e22\u9f0b\u7ea6\u8dc3\u94a5\u7ca4\u60a6\u9605\u94ba\u90e7\u5300\u9668\u8fd0\u8574\u915d\u6655\u97f5\u90d3\u82b8\u607d\u6120\u7ead\u97eb\u6b92\u6c32\u6742\u707e\u8f7d\u6512\u6682\u8d5e\u74d2\u8db1\u933e\u8d43\u810f\u9a75\u51ff\u67a3\u8d23\u62e9\u5219\u6cfd\u8d5c\u5567\u5e3b\u7ba6\u8d3c\u8c2e\u8d60\u7efc\u7f2f\u8f67\u94e1\u95f8\u6805\u8bc8\u658b\u503a\u6be1\u76cf\u65a9\u8f97\u5d2d\u6808\u6218\u7efd\u8c35\u5f20\u6da8\u5e10\u8d26\u80c0\u8d75\u8bcf\u948a\u86f0\u8f99\u9517\u8fd9\u8c2a\u8f84\u9e67\u8d1e\u9488\u4fa6\u8bca\u9547\u9635\u6d48\u7f1c\u6862\u8f78\u8d48\u796f\u9e29\u6323\u7741\u72f0\u4e89\u5e27\u75c7\u90d1\u8bc1\u8be4\u5ce5\u94b2\u94ee\u7b5d\u7ec7\u804c\u6267\u7eb8\u631a\u63b7\u5e1c\u8d28\u6ede\u9a98\u6809\u6800\u8f75\u8f7e\u8d3d\u9e37\u86f3\u7d77\u8e2c\u8e2f\u89ef\u949f\u7ec8\u79cd\u80bf\u4f17\u953a\u8bcc\u8f74\u76b1\u663c\u9aa4\u7ea3\u7ec9\u732a\u8bf8\u8bdb\u70db\u77a9\u5631\u8d2e\u94f8\u9a7b\u4f2b\u69e0\u94e2\u4e13\u7816\u8f6c\u8d5a\u556d\u9994\u989e\u6869\u5e84\u88c5\u5986\u58ee\u72b6\u9525\u8d58\u5760\u7f00\u9a93\u7f12\u8c06\u51c6\u7740\u6d4a\u8bfc\u956f\u5179\u8d44\u6e0d\u8c18\u7f01\u8f8e\u8d40\u7726\u9531\u9f87\u9cbb\u8e2a\u603b\u7eb5\u506c\u90b9\u8bf9\u9a7a\u9cb0\u8bc5\u7ec4\u955e\u94bb\u7f35\u8e9c\u9cdf\u7ff1\u5e76\u535c\u6c89\u4e11\u6dc0\u8fed\u6597\u8303\u5e72\u768b\u7845\u67dc\u540e\u4f19\u79f8\u6770\u8bc0\u5938\u91cc\u51cc\u4e48\u9709\u637b\u51c4\u6266\u5723\u5c38\u62ac\u6d82\u6d3c\u5582\u6c61\u9528\u54b8\u874e\u5f5d\u6d8c\u6e38\u5401\u5fa1\u613f\u5cb3\u4e91\u7076\u624e\u672d\u7b51\u4e8e\u5fd7\u6ce8\u51cb\u8ba0\u8c2b\u90c4\u52d0\u51fc\u5742\u5785\u57b4\u57ef\u57dd\u82d8\u836c\u836e\u839c\u83bc\u83f0\u85c1\u63f8\u5412\u5423\u5494\u549d\u54b4\u5658\u5288\u56af\u5e5e\u5c99\u5d74\u5f77\u5fbc\u72b8\u72cd\u9980\u9987\u9993\u9995\u6123\u61b7\u61d4\u4e2c\u6e86\u6edf\u6df7\u6f24\u6f74\u6fb9\u752f\u7e9f\u7ed4\u7ef1\u73c9\u67a7\u684a\u6849\u69d4\u6a65\u8f71\u8f77\u8d4d\u80b7\u80e8\u98da\u7173\u7145\u7198\u610d\u6dfc\u781c\u78d9\u770d\u949a\u94b7\u94d8\u94de\u9503\u950d\u950e\u950f\u9518\u951d\u952a\u952b\u953f\u9545\u954e\u9562\u9565\u9569\u9572\u7a06\u9e4b\u9e5b\u9e71\u75ac\u75b4\u75d6\u766f\u88e5\u8941\u8022\u98a5\u87a8\u9eb4\u9c85\u9c86\u9c87\u9c9e\u9cb4\u9cba\u9cbc\u9cca\u9ccb\u9cd8\u9cd9\u9792\u97b4\u9f44\u836f\u6b32\u91cc\u59d0\u5360\u5f81\u54df\u731b\u70ae\u53d1\u6de1\u6076\u5978\u5e72\u677e\u4f84\u5570\";\nfunction traditionalToSimplified(str) {\n let result = str;\n for (let idx = 0; idx < i.length; idx++) {\n if (i[idx] && z[idx]) {\n result = result.replace(new RegExp(i[idx], 'g'), z[idx]);\n }\n }\n return result;\n}","bookSourceGroup":"\u6f2b\u753b,\ud83c\udf38\u6f2b\u753b","bookSourceName":"\ud83c\udf38\u8089\u6f2b\u5c4b( \u97e9\u6f2b+ )","bookSourceType":2,"bookSourceUrl":"https:\/\/roum26.xyz","customOrder":449,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"\u70ed\u95e8::https:\/\/roum26.xyz\/home\n\u8fde\u8f7d::https:\/\/roum26.xyz\/books?continued=true&page={{page}}\n\u5b8c\u7ed3::https:\/\/roum26.xyz\/books?continued=false&page={{page}}","lastUpdateTime":"1767077274691","respondTime":180000,"ruleBookInfo":{"author":"\/\/div[@class='basis-3\/5 text-sm sm:text-base']\/div[3]\/\/span\/text()","coverUrl":"\/\/div[@class='basis-2\/5']\/img\/@src","intro":"\/\/div[@class='my-2 text-foreground text-sm sm:text-base']\/p@js:\neval(String(source.bookSourceComment));\nvar toS = traditionalToSimplified(result)\ntoS","kind":"@js:\neval(String(source.bookSourceComment));\n\nvar status = java.getString(\"\/\/div[@class='basis-3\/5 text-sm sm:text-base']\/div[4]\/\/span\/text()\")\nvar tags = java.getString(\"\/\/div[@class='basis-3\/5 text-sm sm:text-base']\/div[6]\/\/span\/text()\")\nvar views = java.getString(\"\/\/div[@class='basis-3\/5 text-sm sm:text-base']\/div[7]\/div[1]\/div[2]\/text()\")\nvar collections= java.getString(\"\/\/div[@class='basis-3\/5 text-sm sm:text-base']\/div[7]\/div[2]\/div[2]\/text()\")\nvar types =\"\u6d4f\u89c8:\"+ views+\",\u6536\u85cf:\"+collections+\",\"+status+\",\"+tags\nvar toS = traditionalToSimplified(types)\ntoS ","name":"\/\/div[@class='text-xl text-foreground']\/text()@js:\neval(String(source.bookSourceComment));\nvar title = traditionalToSimplified(result)\ntitle"},"ruleContent":{"content":"\/\/script\/text()@js:\nvar urlReg = \/\\\\\"imageUrl\\\\\":\\\\\"(.+?)\\\\\"\/g;\nvar pureUrlList = [];\nvar match;\nwhile ((match = urlReg.exec(result)) !== null) {\n    var imgUrl = match[1];\n    imgUrl = imgUrl.replace(\/\\\\\/g, '');\n    if (pureUrlList.indexOf(imgUrl) === -1) {\n        pureUrlList.push(imgUrl);\n    }\n}\npureUrlList.map(x => '<img src=\"' + x + '\">').join(\"\\n\");","imageDecode":"(function() {\n    if (src.indexOf(\"sr:1\") == -1) {\n        return result; \n    }\n    try {\n        var Magua = new JavaImporter();\n        Magua.importPackage(Packages.java.io, Packages.android.graphics);\n        with(Magua) {\n            \/\/ 1. \u68c0\u67e5\u6b63\u5219\u5339\u914d\u662f\u5426\u6210\u529f\n            var match = src.match(\/sr:.*?\\\/(.*?)\\..*\/);\n            if (!match) {\n                return result;\n            }\n\n            \/\/ 2. \u68c0\u67e5 MD5 \u8ba1\u7b97\u903b\u8f91\n            var b64Data = match[1];\n            var decodedPath = java.base64Decode(b64Data);\n            var md5Str = java.md5Encode(decodedPath);\n            var lastTwo = md5Str.substring(md5Str.length() - 2);\n          \n            var num = (parseInt(lastTwo, 16) % 10) + 5;\n\n            \/\/ 3. \u5f00\u59cb\u7ed8\u56fe (\u6d4b\u8bd5\u662f\u5426\u80fd\u6b63\u5e38\u89e3\u7801\u56fe\u7247)\n            var img = BitmapFactory.decodeByteArray(result, 0, result.length);\n            if (!img) return result;\n\n            var h = img.getHeight();\n            var w = img.getWidth();\n            var y = Math.floor(h \/ num);\n            var rem = h % num;\n\n            var newImg = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565);\n            var canvas = new Canvas(newImg);\n            var paint = new Paint();\n\n            for (var i = 1; i <= num; i++) {\n                var currentSliceH = (i === num) ? (y + rem) : y;\n                var srcY = y * (i - 1);\n                \n                \/\/ \u5012\u5e8f\u903b\u8f91\uff1a\u7b2c\u4e00\u5757\u753b\u5230\u6700\u4e0b\u9762\uff0c\u6700\u540e\u4e00\u5757\u753b\u5230\u6700\u4e0a\u9762\n                var dstY = h - srcY - currentSliceH;\n\n                var srcRect = new Rect(0, srcY, w, srcY + currentSliceH);\n                var dstRect = new Rect(0, dstY, w, dstY + currentSliceH);\n                canvas.drawBitmap(img, srcRect, dstRect, paint);\n            }\n\n            var baos = new ByteArrayOutputStream();\n            newImg.compress(Bitmap.CompressFormat.JPEG, 90, baos);\n            var finalRes = baos.toByteArray();\n\n            img.recycle();\n            newImg.recycle();\n            return finalRes;\n        }\n    } catch (e) {\n        return result;\n    }\n})();","imageStyle":"FULL"},"ruleExplore":{"bookList":"\/\/div[@class='grid grid-cols-1 sm:grid-cols-4 md:grid-cols-6 gap-2 sm:gap-4']\/div","bookUrl":"\/\/a\/@href","coverUrl":"\/\/div[contains(@class,'bg-cover')]\/@style@js:\nvar imgSrc = result.match(\/https:\\\/\\\/.*?\\.(?:jpg|jpeg|png|webp|gif|bmp|svg|tiff)\/g)[0]\nimgSrc","kind":"@js:\nvar views = java.getString(\"\/\/div[@class='px-2 py-2']\/div[@class='flex justify-between items-center']\/div[1]\/\/text()\")\nvar collections= java.getString(\"\/\/div[@class='px-2 py-2']\/div[@class='flex justify-between items-center']\/div[2]\/\/text()\")\n\"\u6d4f\u89c8:\"+views+\",\u6536\u85cf:\"+collections","lastChapter":"\/\/div[@class='px-2 py-2']\/div[@class='text-muted-foreground text-sm']\/text()@js:\nresult.split(\"\\n\").join(\"\")","name":"\/\/div[@class='px-2 py-2']\/div[contains(@class,'truncate')]\/text()@js:\neval(String(source.bookSourceComment));\nvar toS = traditionalToSimplified(result)\ntoS"},"ruleSearch":{"bookList":"\/\/div[@class='grid grid-cols-2 sm:grid-cols-4 md:grid-cols-6 gap-3 sm:gap-4 my-6']\/div","bookUrl":"\/\/a\/@href","checkKeyWord":"\u8272\u8f6e\u773c","coverUrl":"\/\/div[contains(@class,'bg-cover')]\/@style@js:\nvar imgSrc = result.match(\/https:\\\/\\\/.*?\\.(?:jpg|jpeg|png|webp|gif|bmp|svg|tiff)\/g)[0]\nimgSrc","intro":"\/\/div[@class='px-2 py-2']\/\/div[@class='flex items-center space-x-1 justify-end']\/div[2]\/text()@js:\nvar timeList = result.split(\"\/\").reverse();\ntimeList.join(\"\/\")","name":"\/\/div[@class='px-2 py-2']\/div[contains(@class,'truncate')]\/text()@js:\neval(String(source.bookSourceComment));\nvar toS = traditionalToSimplified(result)\ntoS"},"ruleToc":{"chapterList":"\/\/div[@class='grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-2 px-2 py-4']\/a[starts-with(@href,'\/books')]","chapterName":"\/\/a\/div\/text()@js:\neval(String(source.bookSourceComment));\nvar toS = traditionalToSimplified(result)\ntoS","chapterUrl":"\/\/a\/@href"},"searchUrl":"https:\/\/roum26.xyz\/search?term={{key}}","weight":0},{"bookSourceComment":"vip\u7ae0\u8282\u8bf7\u767b\u5f55\u540e\u66f4\u65b0\u76ee\u5f55","bookSourceName":"\u4e66\u803d","bookSourceType":0,"bookSourceUrl":"https:\/\/app.shubl.com","customButton":false,"customOrder":-1,"enabled":true,"enabledCookieJar":false,"enabledExplore":true,"eventListener":false,"exploreUrl":"\u5168\u90e8\u7eaf\u7231::https:\/\/www.baidu.com\/category_type=1&order=week_click&page={{page}}\n\u73b0\u7eaf::https:\/\/www.baidu.com\/category_type=4&order=week_click&page={{page}}\n\u5e7b\u7eaf::https:\/\/www.baidu.com\/category_type=5&order=week_click&page={{page}}\n\u53e4\u7eaf::https:\/\/www.baidu.com\/category_type=6&order=week_click&page={{page}}\n\u767e\u5408::https:\/\/www.baidu.com\/category_type=3&order=week_click&page={{page}}\n\u5168\u90e8\u8a00\u60c5::https:\/\/www.baidu.com\/category_type=20&order=week_click&page={{page}}\n\u73b0\u8a00::https:\/\/www.baidu.com\/category_type=8&order=week_click&page={{page}}\n\u5e7b\u8a00::https:\/\/www.baidu.com\/category_type=9&order=week_click&page={{page}}\n\u53e4\u8a00::https:\/\/www.baidu.com\/category_type=10&order=week_click&page={{page}}\n\u65e0CP::https:\/\/www.baidu.com\/category_type=21&order=week_click&page={{page}}\n\u4ed8\u8d39&\u8fde\u8f7d&\u66f4\u65b0\u65f6\u95f4::https:\/\/www.baidu.com\/category_type=1&order=uptime&up_status=0&is_paid=1&page={{page}}\n\u4ed8\u8d39&\u5b8c\u672c&\u66f4\u65b0\u65f6\u95f4::https:\/\/www.baidu.com\/category_type=1&order=uptime&up_status=1&is_paid=1&page={{page}}\n\u6bcf\u65e5\u7b7e\u5230::data:get_daily;base64,{{java.base64Encode(\"get_daily_task_bonus\")}},{\"type\":\"\"}","header":"{\"app-version\":\"4.1.4\"}","jsLib":"function encode(word){\n\t const {java} = this;\n  \treturn java.createSymmetricCrypto(\"AES\/CBC\/PKCS5Padding\", java.base64DecodeToByteArray(\"L6alxSR4ttjXvcGpZozYtdcJtG4l0tSnQplRUONIRsw=\"), java.base64DecodeToByteArray(\"AAAAAAAAAAAAAAAAAAAAAA==\")).encryptBase64(word);\n\t}\n\t\nfunction decode(word){\n\t   const {java} = this;\n    \treturn java.createSymmetricCrypto(\"AES\/CBC\/PKCS5Padding\", java.base64DecodeToByteArray(\"L6alxSR4ttjXvcGpZozYtdcJtG4l0tSnQplRUONIRsw=\"), java.base64DecodeToByteArray(\"AAAAAAAAAAAAAAAAAAAAAA==\")).decryptStr(word);\n}\n\nfunction getToken(){\t\n\tconst {source} = this;\n\treturn (source.getLoginHeaderMap()!=null && source.getLoginHeaderMap()!=\"\")?source.getLoginHeaderMap().get(\"login_token\"):\"0f6bd1d063f202f71c3b84678027ce81\"\n\t}\n\t\nfunction getA(){\n\tconst {source} = this;\n\treturn (source.getLoginHeaderMap()!=null && source.getLoginHeaderMap()!=\"\")?source.getLoginHeaderMap().get(\"account\"):\"%E8%90%8C%E5%8F%8B521068519938\";\n\t}","lastUpdateTime":"1767098652881","loginUi":"[\n    {\n        name: \"\u8d26\u53f7\",\n        type: \"text\"\n    },\n    {\n        name: \"\u9a8c\u8bc1\u7801\",\n        type: \"text\"\n    },\n     {\n        name: \"\u83b7\u53d6\u9a8c\u8bc1\u7801\uff08\u586b\u5b8c\u9a8c\u8bc1\u7801\u70b9\u201c\u2713\u201d\u767b\u5f55\uff09\",\n        type: \"button\",\n        \"action\":\"getCode()\"\n    }\n]","loginUrl":"<js>\nlet uu = \"https:\/\/tmp.xxltest.mengjunnet.com\";\n\n function getCode(){\n \t let app_signature_md5 = \"f73576612783f8ed8b68cdf73a56be94\";\n  \tlet phone = result.get(\"\u8d26\u53f7\");\n  \tlet time = String(Date.now());\t\n  \t\n   let hashvalue = String(java.md5Encode(encode(phone+time)));\t\n   let option = {\n   \"app_signature_md5\":app_signature_md5,\n   \"app_version\":\"4.1.4\",\n   \"channel\":\"6\",\n   \"verify_type\":\"5\", \n    \"hashvalue\":hashvalue,\n   \"username\":phone,\n   \"timestamp\":time\n   \t}\n   header = {\n   \n   \t\t\"user-agent\":\"Android\"\n   \t\t\n   \t}\n   let body = \"secret_content=\"+encodeURIComponent(encode(JSON.stringify(option)));\n   java.log(body)\n   let url = uu+ \"\/signup\/send_verify_code\";\n   try{\n let resposebody = java.post(url,String(body),{\"app-version\":\"4.1.4\",\"user-agent\":\"Android\"}).body();\n \n \tlet tip = JSON.parse(decode(resposebody)).tip;\n \t\n \tjava.toast(tip)\n \t}catch(e){\n \t\tjava.log(e)\n \t\t}\n \t\n \t}\n \n \n \t\n function login(){\n \ttry{\n \tlet login_name=source.getLoginInfoMap().get(\"\u8d26\u53f7\")\nlet code=source.getLoginInfoMap().get(\"\u9a8c\u8bc1\u7801\");\n    let jsonStr = {\n    \t\"app_signature_md5\":\"f73576612783f8ed8b68cdf73a56be94\",\n    \t\"app_version\":\"4.1.4\",\n    \t\"channel\":\"default\",\n    \t\"uuid\":\"android\",\n    \t\"ver_code\":code,\n    \t\"username\":login_name\n    \t}\n    \n    \n    let body = \"secret_content=\" + encode(JSON.stringify(jsonStr));\n    let option = {\n        \"method\": \"POST\",\n        \"body\": String(body)\n    };\n    \n    let url = uu+\"\/signup\/verify_login,\" + JSON.stringify(option);\n    \n   let respbody = decode(java.ajax(url));\n\/\/  java.log(respbody);\n   let resp = JSON.parse(respbody);\n   java.toast(resp.tip);\n   java.log(resp.tip);\n   \n   \n    if (resp.code == \"100000\") {\n     body = {\n     \t\"login_token\":resp.data.login_token,\n     \t\"account\":encodeURI(resp.data.reader_info.account)\n     \t}\n     source.putLoginHeader(JSON.stringify(body)) \n    } else {\n        java.toast('\u2757\ufe0f ' + resp.tip + ' \u2757\ufe0f')\n    }\n    }catch(e){\n    \tjava.log(e)\n    \t}\n}\n<\/js>","respondTime":180000,"ruleBookInfo":{"author":"$.author_name","coverUrl":"$.cover","init":"<js>\ndecode(result)\n<\/js>\n$.data.book_info","intro":"$.description","kind":"$.tag","lastChapter":"{{$.last_chapter_info.chapter_title}} \/ {{$.last_chapter_info.uptime}}","name":"$.book_name","tocUrl":"@js:\nlet jsonObj={\"app_signature_md5\":\"f73576612783f8ed8b68cdf73a56be94\",\"app_version\":\"4.1.1\",\"channel\":\"default\",\"last_update_time\":\"0\",\"book_id\":{{$.book_id}},\"login_token\":String(getToken()),\"account\":String(getA())}\nlet body = \"secret_content=\"+encode(JSON.stringify(jsonObj));\nlet option = {\"method\": \"POST\",\"body\": String(body)};\n\"https:\/\/app.shubl.com\/chapter\/get_chapter_list_group_by_division,\" + JSON.stringify(option)","wordCount":"$.total_word_count"},"ruleContent":{"content":"<js>\ndecode(result)\n<\/js>\n$.data.chapter_info.txt_content"},"ruleExplore":{"author":"$.author_name","bookList":"<js>\nresponse=null\nif(!baseUrl.match(\/localhost|get_daily\/)){\n\t\ncategory_type=baseUrl.match(\/category_type=(\\d+)\/)?baseUrl.match(\/category_type=(\\d+)\/)[1]:\"\"\norder=baseUrl.match(\/order=(.+?)&\/)?baseUrl.match(\/order=(.+?)&\/)[1]:\"\"\nis_paid=baseUrl.match(\/is_paid=(\\d)&\/)?baseUrl.match(\/is_paid=(\\d)&\/)[1]:\"\"\nup_status=baseUrl.match(\/up_status=(\\d)&\/)?baseUrl.match(\/up_status=(\\d)&\/)[1]:\"\"\njsonObj={\"category_type\":category_type,\"app_signature_md5\":\"f73576612783f8ed8b68cdf73a56be94\",\"app_version\":\"2.1.6\",\"channel\":\"default\",\"order\":order,\"count\":\"15\",\"is_paid\":is_paid,\"page\":String(baseUrl.match(\/page=(\\d+)\/)[1]-1),\"up_status\":up_status,\"login_token\":String(getToken()),\"account\":String(getA())}\n\/\/java.log(JSON.stringify(jsonObj))\noption={\"method\":\"POST\",\"body\":\"secret_content=\"+encodeURIComponent(encode(JSON.stringify(jsonObj)))}\nurl=\"https:\/\/app.shubl.com\/bookcity\/get_filter_search_book_list,\"+JSON.stringify(option)\nresponse=decode(java.ajax(url))\n}else{\njsonObj={\"app_signature_md5\":\"f73576612783f8ed8b68cdf73a56be94\",\"app_version\":\"2.1.6\",\"channel\":\"default\",\"task_type\":\"1\",\"login_token\":String(getToken()),\"account\":String(getA())}\noption={\"method\":\"POST\",\"body\":\"secret_content=\"+encodeURIComponent(encode(JSON.stringify(jsonObj)))}\nurl=\"https:\/\/app.shubl.com\/reader\/get_daily_task_bonus,\"+JSON.stringify(option)\nresponse=decode(java.ajax(url));\njava.toast(JSON.parse(response).tip)\n}\n\n\/\/ \u6253\u5370\u89e3\u5bc6\u7ed3\u679c\njava.log(JSON.stringify(JSON.parse(response)))\nresponse\n<\/js>\n$.data.book_list||$.[*]","bookUrl":"@js:\nif(!baseUrl.match(\/localhost|get_daily\/)){\nlet jsonObj={\"app_signature_md5\":\"f73576612783f8ed8b68cdf73a56be94\",\"app_version\":\"2.1.6\",\"channel\":\"default\",\"book_id\":String(java.getString('$.book_id')),\"login_token\":String(getToken()),\"account\":String(getA())}\nlet body = \"secret_content=\"+encode(JSON.stringify(jsonObj));\nlet option = {\"method\": \"POST\",\"body\": String(body)};\n\"https:\/\/app.shubl.com\/book\/get_info_by_id,\" + JSON.stringify(option)\n}else{\nbaseUrl\n}","coverUrl":"$.cover","intro":"$.description","kind":"$.tag","lastChapter":"{{$.last_chapter_info.chapter_title}} \/ {{$.last_chapter_info.uptime}}","name":"$.book_name@put:{\"bid\":\"$.book_id\"}||$","wordCount":"$.total_word_count"},"ruleSearch":{"author":"$.author_name","bookList":"<js>\n\n\n\nresponse=decode(result)\n\/\/ \u6253\u5370\u89e3\u5bc6\u7ed3\u679c\n\/\/java.log(JSON.stringify(JSON.parse(response)))\nresponse\n<\/js>\n$.data.book_list","bookUrl":"@js:\nlet jsonObj={\"app_signature_md5\":\"f73576612783f8ed8b68cdf73a56be94\",\"app_version\":\"4.1.1\",\"channel\":\"default\",\"book_id\":{{$.book_id}},\"login_token\":String(getToken()),\"account\":String(getA())}\nlet body = \"secret_content=\"+encode(JSON.stringify(jsonObj));\nlet option = {\"method\": \"POST\",\"body\": String(body)};\n\"https:\/\/app.shubl.com\/book\/get_info_by_id,\" + JSON.stringify(option)","coverUrl":"$.cover","intro":"$.description","kind":"$.tag","lastChapter":"{{$.last_chapter_info.chapter_title}} \/ {{$.last_chapter_info.uptime}}","name":"$.book_name@put:{\"bid\":\"$.book_id\"}","wordCount":"$.total_word_count"},"ruleToc":{"chapterList":"<js>\ndecode(result)\n<\/js>\n$.data.chapter_list_group[*].chapter_list[*]","chapterName":"$.chapter_title","chapterUrl":"@js:\nlet jsonObj={\"app_signature_md5\":\"f73576612783f8ed8b68cdf73a56be94\",\"app_version\":\"4.1.1\",\"channel\":\"default\",\"chapter_id\":{{$.chapter_id}},\"login_token\":String(getToken()),\"account\":String(getA())}\n\nlet body = \"secret_content=\"+encode(JSON.stringify(jsonObj));\nlet option = {\"method\": \"POST\",\"body\": String(body)};\n\"https:\/\/app.shubl.com\/chapter\/get_chapter_info,\" + JSON.stringify(option)","isVip":"@js:!{{$.auth_access}}","updateTime":"{{$.word_count}} \u5b57 \u53d1\u5e03\u4e8e {{$.uptime}}"},"searchUrl":"@js:\n\nu=decode(decodeURIComponent(\"hYKytSMHsACWNRRED+zq8asscl2eVP6HdvA4q5ImrVI7MWRmJfl1mXV\/bVjWdldyl6Jlfmf78osN25N+IMEqlZ\/ISFj5ytn+hpR9jTw5PT8hFFyMLia2qgW0FSdV9O7fZhjcs9FVfNfzWxNHiQg03a8CW3WiY7wc0V3PNoja3lE4Za8ETj6pE\/Nv7iXoj3ZD7Xb3E9kcfCyJYw5ftdV4uiMO7hPOdEL+vAb6C+PmksCYWb5NcLdNj8Ujircymh6sTgn9xICNQeH83g\/b4U3GcdgsaTiCRU+3l9B3jg5C438=\"));\njava.log(JSON.stringify(JSON.parse(u)))\nlet jsonObj={\"app_signature_md5\":\"f73576612783f8ed8b68cdf73a56be94\",\"app_version\":\"4.1.1\",\"channel\":\"default\",\"order\":\"week_click\",\"count\":\"15\",\"category_type\":\"1\",\"page\":page-1,\"key\":key,\"login_token\":String(getToken()),\"account\":String(getA())}\nlet body = \"secret_content=\"+encode(JSON.stringify(jsonObj));\n\nlet option = {\"method\": \"POST\",\"body\": String(body)};\n\n\"https:\/\/app.shubl.com\/bookcity\/get_filter_search_book_list,\" + JSON.stringify(option)","weight":0},{"bookSourceComment":"\u56fd\u5185\u53d1\u5e03\u9875\uff1ahttps:\/\/www.asw2.cc\/","bookSourceGroup":"\ud83c\udf38\u5c0f\u8bf4,\u5c0f\u8bf4","bookSourceName":"\ud83c\udf38\u7231\u4e3d\u4e1d\u4e66\u5c4b(\u514d\u7ffb)","bookSourceType":0,"bookSourceUrl":"https:\/\/xn--vcsx64d.alicesw12.xyz\/","customOrder":422,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"[\n  {\n    \"title\": \"\ud83d\udd16TOP50\ud83d\udd16\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"title\": \"\u603b\u6392\u884c\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/other\/rank_hits\/order\/hits.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u6708\u6392\u884c\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/other\/rank_hits\/order\/hits_month.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u5468\u6392\u884c\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/other\/rank_hits\/order\/hits_week.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u65e5\u6392\u884c\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/other\/rank_hits\/order\/hits_day.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\ud83d\udd16\u5206\u7c7b\uff08\u4eba\u6c14\uff09\ud83d\udd16\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"title\": \"\u79d1\u5e7b\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/71\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u6821\u56ed\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/61\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u7384\u5e7b\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/62\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u4e61\u6751\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/63\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u90fd\u5e02\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/64\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u4e71\u4f26\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/65\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u5386\u53f2\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/67\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u6b66\u4fa0\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/68\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u7cfb\u7edf\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/69\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u660e\u661f\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/72\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u540c\u4eba\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/73\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u5f3a\u5978\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/74\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u5947\u5e7b\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/75\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u7ecf\u5178\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/79\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u7a7f\u8d8a\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/70\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u51cc\u8fb1\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/46\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u53cd\u5dee\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/22\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u5815\u843d\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/18\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u7eaf\u7231\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/19\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u4f2a\u5a18\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/52\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u841d\u8389\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/48\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u719f\u5973\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/56\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u7981\u5fcc\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/51\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"NTR\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/54\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u5a9a\u9ed1\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/53\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u7eff\u5e3d\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/55\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u8c03\u6559\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/58\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u5973\u4e3b\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/59\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u6b63\u592a\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/50\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u4e0b\u514b\u4e0a\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/43\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u767e\u5408\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/47\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"\u91cd\u53e3\",\n    \"url\": \"https:\/\/xn--vcsx64d.alicesw12.xyz\/all\/id\/21\/order\/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  }\n]","lastUpdateTime":"1767255914982","loginUrl":"https:\/\/xn--vcsx64d.alicesw12.xyz\/user\/user\/login.html","respondTime":180000,"ruleBookInfo":{"author":"\/\/div[@class='box_info']\/table\/tbody\/tr[1]\/td\/div\/p[1]\/a[1]\/text()","coverUrl":"\/\/div[@class='pic']\/img\/@src","intro":"@js:\nvar info = java.getString(\"\/\/div[@class='pic']\/div[@class='tLJ']\/text()\")\nvar intro = java.getString(\"\/\/div[@class='box_info']\/table\/tbody\/tr[3]\/td\/div[@class='intro']\/text()\")\nintro+\"\\n\u25e4-----------------\u25e5\\n\"+info+\"\\n\u25e3-----------------\u25e2\\n\"","kind":"\/\/div[@class='box_info']\/table\/tbody\/tr[3]\/td\/p[2]\/a\/text()","lastChapter":"\/\/div[@class='box_info']\/table\/tbody\/tr[1]\/td\/div\/p[1]\/a[2]\/text()","name":"\/\/div[@class='box_info']\/table\/tbody\/tr[1]\/\/h1\/text()","tocUrl":"\/\/div[@class='book_newchap']\/\/a[contains(text(),'\u67e5\u770b\u6240\u6709\u7ae0\u8282')]\/@href"},"ruleContent":{"content":"\/\/div[contains(@class,'read-content')]\/p"},"ruleExplore":{"author":"\/\/li[@class='four']\/text()","bookList":"\/\/div[@class='clearfix rec_rullist']\/ul","bookUrl":"\/\/li[@class='two']\/a\/@href","kind":"@js:\nvar tag  = java.getString(\"\/\/li[@class='sev']\/span\/a\/text()\")\nvar views=  java.getString(\"\/\/li[@class='diyhot']\/text()\")\ntag+\",\ud83d\udc40\"+views","lastChapter":"\/\/li[@class='three']\/a\/text()","name":"\/\/li[@class='two']\/a\/text()","wordCount":"\/\/li[@class='five']\/text()@js:result+\"\u5b57\""},"ruleSearch":{"author":"\/\/p[@class='mb-1 text-muted']\/a\/text()","bookList":"\/\/div[@class='list-group']\/div[@class='list-group-item']","bookUrl":"\/\/h5\/a\/@href","checkKeyWord":"\u7f8e\u6bcd\u4e3a\u59bb","intro":"\/\/p[@class='content-txt']","kind":"<js>\nvar status = java.getString(\"\/\/h5\/small\/text()\");\nvar tags = java.getString(\"\/\/p[@class='text-muted']\/a\/text()\");\nvar views = java.getString(\"\/\/p[@class='mb-1 text-muted']\/\/text()\").match(\/\\d+?.\\d+\/g)[1]\nstatus+\",\ud83d\udc40\"+views+\",\"+tags\n<\/js>\n##\\[|]##","name":"\/\/h5\/a\/\/text()##\\d+.|\\n##","wordCount":"\/\/p[@class='mb-1 text-muted']\/\/text()@js:\nresult.match(\/\\d+?.\\d+\u4e07\/g)[0]+\"\u5b57\""},"ruleToc":{"chapterList":"\/\/ul[@class='mulu_list']\/li","chapterName":"\/\/a\/text()","chapterUrl":"\/\/a\/@href"},"searchUrl":"https:\/\/xn--vcsx64d.alicesw12.xyz\/search.html?q={{key}}&f=_al","weight":0},{"bookSourceComment":"\u63a5\u53e3\u6765\u6e90 : \u6790\n\u652f\u6301\u5c0f\u8bf4\uff0c\u6f2b\u753b\uff0c\u6709\u58f0\uff0c\u89c6\u9891\n\u7fa4\u53f7:\n171686073\n1045608854","bookSourceGroup":"\u6790","bookSourceName":"\u756a\u8304\u56db\u5408\u4e00","bookSourceType":0,"bookSourceUrl":"http:\/\/103.189.141.163:9587","customButton":false,"customOrder":5,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"eventListener":false,"exploreUrl":"@js:\nvar result = [];\nvar sessionId = '';\n\nvar loginInfo = source.getLoginInfoMap();\nif (loginInfo && loginInfo['sessionid']) {\n    sessionId = loginInfo['sessionid'];\n}\n\nif (!sessionId) {\n    var cookies = cookie.getCookie('103.189.141.163');\n    if (cookies) {\n        var match = cookies.match(\/sessionid=([^;]+)\/);\n        if (match && match[1]) {\n            sessionId = match[1];\n        }\n    }\n}\n\nif (sessionId) {\n    result.push({\n        title: '\ud83d\udcda \u6211\u7684\u4e66\u67b6',\n        url: 'http:\/\/103.189.141.163:9587\/fq?action=shujia&sessionid=' + sessionId,\n        style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}\n    });\n} else {\n    result.push({\n        title: '\u8bf7\u5148\u767b\u5f55',\n        url: '',\n        style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}\n    });\n}\n\nJSON.stringify(result);","jsLib":"function getHost() {\n  return \"http:\/\/103.189.141.163:9587\"\n}\n","lastUpdateTime":"1767278404385","loginUi":"[\n    {\n        \"name\": \"sessionid\",\n        \"type\": \"text\",\n        \"hint\": \"\u8f93\u5165sessionid\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"\ud83d\udd11 \u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"fq_login()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"\u5c0f\u8bf4\",\n        \"type\": \"button\",\n        \"action\": \"setmode(3)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u6f2b\u753b\",\n        \"type\": \"button\",\n        \"action\": \"setmode(8)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u6709\u58f0\",\n        \"type\": \"button\",\n        \"action\": \"setmode(2)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u89c6\u9891\",\n        \"type\": \"button\",\n        \"action\": \"setmode(11)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u67e5\u770b\u5f53\u524d\",\n        \"type\": \"button\",\n        \"action\": \"getmode()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u756a\u8304\u97f3\u8272\u5207\u6362\",\n        \"type\": \"button\",\n        \"action\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"\u591a\u4eba\u5bf9\u8bdd\",\n        \"type\": \"button\",\n        \"action\": \"set(0)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u771f\u4eba\u53d1\u97f3\",\n        \"type\": \"button\",\n        \"action\": \"set(1)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u751c\u7f8e\u5c11\u5973\",\n        \"type\": \"button\",\n        \"action\": \"set(2)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u6e05\u4eae\u9752\u53d4\",\n        \"type\": \"button\",\n        \"action\": \"set(3)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u6210\u719f\u5927\u53d4\",\n        \"type\": \"button\",\n        \"action\": \"set(4)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u5f00\u6717\u9752\u5e74\",\n        \"type\": \"button\",\n        \"action\": \"set(5)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u6e29\u67d4\u6dd1\u5973\",\n        \"type\": \"button\",\n        \"action\": \"set(6)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u98ce\u96c5\u9752\u53d4\",\n        \"type\": \"button\",\n        \"action\": \"set(7)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u6e05\u7eaf\u5c11\u5973\",\n        \"type\": \"button\",\n        \"action\": \"set(8)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u78c1\u6027\u9752\u53d4\",\n        \"type\": \"button\",\n        \"action\": \"set(9)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u63a8\u6587\u5973\u58f0\",\n        \"type\": \"button\",\n        \"action\": \"set(10)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u4eb2\u5207\u59d0\u59d0\",\n        \"type\": \"button\",\n        \"action\": \"set(11)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u5112\u96c5\u5927\u53d4\",\n        \"type\": \"button\",\n        \"action\": \"set(12)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u4f18\u96c5\u5fa1\u59d0\",\n        \"type\": \"button\",\n        \"action\": \"set(13)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u65af\u6587\u9752\u53d4\",\n        \"type\": \"button\",\n        \"action\": \"set(14)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u77e5\u6027\u4e3b\u64ad\",\n        \"type\": \"button\",\n        \"action\": \"set(15)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u6210\u719f\u5347\u7ea7\",\n        \"type\": \"button\",\n        \"action\": \"set(16)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u4fcf\u76ae\u5fa1\u59d0\",\n        \"type\": \"button\",\n        \"action\": \"set(17)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u53cc\u97f3\u7075\u52a8\",\n        \"type\": \"button\",\n        \"action\": \"set(18)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u738b\u660e\u519b\u97f3\",\n        \"type\": \"button\",\n        \"action\": \"set(19)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u98917\",\n        \"type\": \"button\",\n        \"action\": \"set(20)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u98919\",\n        \"type\": \"button\",\n        \"action\": \"set(21)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989110\",\n        \"type\": \"button\",\n        \"action\": \"set(22)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989111\",\n        \"type\": \"button\",\n        \"action\": \"set(23)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989114\",\n        \"type\": \"button\",\n        \"action\": \"set(24)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989115\",\n        \"type\": \"button\",\n        \"action\": \"set(25)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989116\",\n        \"type\": \"button\",\n        \"action\": \"set(26)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989118\",\n        \"type\": \"button\",\n        \"action\": \"set(27)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989121\",\n        \"type\": \"button\",\n        \"action\": \"set(28)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989122\",\n        \"type\": \"button\",\n        \"action\": \"set(29)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989123\",\n        \"type\": \"button\",\n        \"action\": \"set(30)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989126\",\n        \"type\": \"button\",\n        \"action\": \"set(31)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989153\",\n        \"type\": \"button\",\n        \"action\": \"set(32)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989155\",\n        \"type\": \"button\",\n        \"action\": \"set(33)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989156\",\n        \"type\": \"button\",\n        \"action\": \"set(34)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989157\",\n        \"type\": \"button\",\n        \"action\": \"set(35)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989158\",\n        \"type\": \"button\",\n        \"action\": \"set(36)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989159\",\n        \"type\": \"button\",\n        \"action\": \"set(37)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989160\",\n        \"type\": \"button\",\n        \"action\": \"set(38)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989161\",\n        \"type\": \"button\",\n        \"action\": \"set(39)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989162\",\n        \"type\": \"button\",\n        \"action\": \"set(40)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989163\",\n        \"type\": \"button\",\n        \"action\": \"set(41)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989164\",\n        \"type\": \"button\",\n        \"action\": \"set(42)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989167\",\n        \"type\": \"button\",\n        \"action\": \"set(43)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989168\",\n        \"type\": \"button\",\n        \"action\": \"set(44)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989171\",\n        \"type\": \"button\",\n        \"action\": \"set(45)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989172\",\n        \"type\": \"button\",\n        \"action\": \"set(46)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989173\",\n        \"type\": \"button\",\n        \"action\": \"set(47)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989175\",\n        \"type\": \"button\",\n        \"action\": \"set(48)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989176\",\n        \"type\": \"button\",\n        \"action\": \"set(49)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989177\",\n        \"type\": \"button\",\n        \"action\": \"set(50)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989178\",\n        \"type\": \"button\",\n        \"action\": \"set(51)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989179\",\n        \"type\": \"button\",\n        \"action\": \"set(52)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989180\",\n        \"type\": \"button\",\n        \"action\": \"set(53)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989181\",\n        \"type\": \"button\",\n        \"action\": \"set(54)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989182\",\n        \"type\": \"button\",\n        \"action\": \"set(55)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989184\",\n        \"type\": \"button\",\n        \"action\": \"set(56)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u989185\",\n        \"type\": \"button\",\n        \"action\": \"set(57)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u9891101\",\n        \"type\": \"button\",\n        \"action\": \"set(58)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u9891102\",\n        \"type\": \"button\",\n        \"action\": \"set(59)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u9891104\",\n        \"type\": \"button\",\n        \"action\": \"set(60)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u9891106\",\n        \"type\": \"button\",\n        \"action\": \"set(61)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u9891107\",\n        \"type\": \"button\",\n        \"action\": \"set(62)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u9891108\",\n        \"type\": \"button\",\n        \"action\": \"set(63)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u9891109\",\n        \"type\": \"button\",\n        \"action\": \"set(64)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u9891110\",\n        \"type\": \"button\",\n        \"action\": \"set(65)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u9891111\",\n        \"type\": \"button\",\n        \"action\": \"set(66)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u9891112\",\n        \"type\": \"button\",\n        \"action\": \"set(67)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u9891113\",\n        \"type\": \"button\",\n        \"action\": \"set(68)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u97f3\u9891204\",\n        \"type\": \"button\",\n        \"action\": \"set(69)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    }\n]","loginUrl":"function login(){}\n\nfunction fq_login() {\n    try {\n        java.startBrowserAwait(\"http:\/\/103.189.141.163:9587\/log\", \"\u767b\u5f55\")\n    } catch (e) {\n        java.toast(e)\n    }\n    \n    var cookie_ = \"sessionid=\" + (String(cookie.getKey(\"103.189.141.163\", \"sessionid\")) ? String(cookie.getKey(\"103.189.141.163\", \"sessionid\")) : source.getLoginInfoMap()['sessionid'])\n    \n    var sessionId = cookie_.replace(\"sessionid=\", \"\")\n    \n    var user = \"\"\n    try {\n        var response = java.ajax(\"http:\/\/103.189.141.163:9587\/fq?action=info&sessionid=\" + sessionId)\n        var data = JSON.parse(response)\n        user = data.name\n    } catch (e) {}\n    \n    if (!cookie_ || cookie_ == \"sessionid=\" || !user) {\n        java.toast(\"\u672a\u83b7\u53d6\u5230\u767b\u5f55\u51ed\u636e\uff0c\u767b\u5f55\u5931\u8d25\")\n        return false\n    }\n    \n    java.toast(\"\\n\\n\u6b22\u8fce \" + user + \"\\n\u767b\u5f55\u6210\u529f\uff01\")\n    return true\n}\n\nfunction setmode(mode) {\n    try {\n        var value = JSON.parse(source.getVariable());\n        value.mode = mode;\n        source.setVariable(JSON.stringify(value, null, \"\\t\"));\n    } catch (error) {\n        source.setVariable(JSON.stringify({\"mode\": mode}, null, \"\\t\"));\n    }\n    \n    var modeName = \"\";\n    if (mode == \"3\") {\n        modeName = \"\u5c0f\u8bf4\"\n    }\n    if (mode == \"2\") {\n        modeName = \"\u6709\u58f0\"\n    }\n    if (mode == \"8\") {\n        modeName = \"\u6f2b\u753b\"\n    }\n    if (mode == \"11\") {\n        modeName = \"\u89c6\u9891\"\n    }\n    \n    java.longToast(modeName + \"\u8bbe\u7f6e\u6210\u529f\")\n}\n\nfunction getmode() {\n    try {\n        var value = JSON.parse(source.getVariable());\n        var mode = value.mode;\n        var modeName = \"\";\n        if (mode == \"3\") {\n            modeName = \"\u5c0f\u8bf4\"\n        }\n        if (mode == \"2\") {\n            modeName = \"\u6709\u58f0\"\n        }\n        if (mode == \"8\") {\n            modeName = \"\u6f2b\u753b\"\n        }\n        if (mode == \"11\") {\n            modeName = \"\u89c6\u9891\"\n        }\n        java.longToast(\"\u5f53\u524d\uff1a\" + modeName)\n    } catch (error) {\n        java.longToast(\"\u9ed8\u8ba4\u5c0f\u8bf4\")\n    }\n}\n\nvar toneData = [\n    [\"\u591a\u4eba\u5bf9\u8bdd\", \"tone_id=51\"],\n    [\"\u771f\u4eba\u53d1\u97f3\", \"tone_id=0\"],\n    [\"\u751c\u7f8e\u5c11\u5973\", \"tone_id=1\"],\n    [\"\u6e05\u4eae\u9752\u53d4\", \"tone_id=2\"],\n    [\"\u6210\u719f\u5927\u53d4\", \"tone_id=4\"],\n    [\"\u5f00\u6717\u9752\u5e74\", \"tone_id=5\"],\n    [\"\u6e29\u67d4\u6dd1\u5973\", \"tone_id=6\"],\n    [\"\u98ce\u96c5\u9752\u53d4\", \"tone_id=8\"],\n    [\"\u6e05\u7eaf\u5c11\u5973\", \"tone_id=12\"],\n    [\"\u78c1\u6027\u9752\u53d4\", \"tone_id=17\"],\n    [\"\u63a8\u6587\u5973\u58f0\", \"tone_id=27\"],\n    [\"\u4eb2\u5207\u59d0\u59d0\", \"tone_id=28\"],\n    [\"\u5112\u96c5\u5927\u53d4\", \"tone_id=29\"],\n    [\"\u4f18\u96c5\u5fa1\u59d0\", \"tone_id=30\"],\n    [\"\u65af\u6587\u9752\u53d4\", \"tone_id=31\"],\n    [\"\u77e5\u6027\u4e3b\u64ad\", \"tone_id=32\"],\n    [\"\u6210\u719f\u5347\u7ea7\", \"tone_id=74\"],\n    [\"\u4fcf\u76ae\u5fa1\u59d0\", \"tone_id=100\"],\n    [\"\u53cc\u97f3\u7075\u52a8\", \"tone_id=103\"],\n    [\"\u738b\u660e\u519b\u97f3\", \"tone_id=105\"],\n    [\"\u97f3\u98917\", \"tone_id=7\"],\n    [\"\u97f3\u98919\", \"tone_id=9\"],\n    [\"\u97f3\u989110\", \"tone_id=10\"],\n    [\"\u97f3\u989111\", \"tone_id=11\"],\n    [\"\u97f3\u989114\", \"tone_id=14\"],\n    [\"\u97f3\u989115\", \"tone_id=15\"],\n    [\"\u97f3\u989116\", \"tone_id=16\"],\n    [\"\u97f3\u989118\", \"tone_id=18\"],\n    [\"\u97f3\u989121\", \"tone_id=21\"],\n    [\"\u97f3\u989122\", \"tone_id=22\"],\n    [\"\u97f3\u989123\", \"tone_id=23\"],\n    [\"\u97f3\u989126\", \"tone_id=26\"],\n    [\"\u97f3\u989153\", \"tone_id=53\"],\n    [\"\u97f3\u989155\", \"tone_id=55\"],\n    [\"\u97f3\u989156\", \"tone_id=56\"],\n    [\"\u97f3\u989157\", \"tone_id=57\"],\n    [\"\u97f3\u989158\", \"tone_id=58\"],\n    [\"\u97f3\u989159\", \"tone_id=59\"],\n    [\"\u97f3\u989160\", \"tone_id=60\"],\n    [\"\u97f3\u989161\", \"tone_id=61\"],\n    [\"\u97f3\u989162\", \"tone_id=62\"],\n    [\"\u97f3\u989163\", \"tone_id=63\"],\n    [\"\u97f3\u989164\", \"tone_id=64\"],\n    [\"\u97f3\u989167\", \"tone_id=67\"],\n    [\"\u97f3\u989168\", \"tone_id=68\"],\n    [\"\u97f3\u989171\", \"tone_id=71\"],\n    [\"\u97f3\u989172\", \"tone_id=72\"],\n    [\"\u97f3\u989173\", \"tone_id=73\"],\n    [\"\u97f3\u989175\", \"tone_id=75\"],\n    [\"\u97f3\u989176\", \"tone_id=76\"],\n    [\"\u97f3\u989177\", \"tone_id=77\"],\n    [\"\u97f3\u989178\", \"tone_id=78\"],\n    [\"\u97f3\u989179\", \"tone_id=79\"],\n    [\"\u97f3\u989180\", \"tone_id=80\"],\n    [\"\u97f3\u989181\", \"tone_id=81\"],\n    [\"\u97f3\u989182\", \"tone_id=82\"],\n    [\"\u97f3\u989184\", \"tone_id=84\"],\n    [\"\u97f3\u989185\", \"tone_id=85\"],\n    [\"\u97f3\u9891101\", \"tone_id=101\"],\n    [\"\u97f3\u9891102\", \"tone_id=102\"],\n    [\"\u97f3\u9891104\", \"tone_id=104\"],\n    [\"\u97f3\u9891106\", \"tone_id=106\"],\n    [\"\u97f3\u9891107\", \"tone_id=107\"],\n    [\"\u97f3\u9891108\", \"tone_id=108\"],\n    [\"\u97f3\u9891109\", \"tone_id=109\"],\n    [\"\u97f3\u9891110\", \"tone_id=110\"],\n    [\"\u97f3\u9891111\", \"tone_id=111\"],\n    [\"\u97f3\u9891112\", \"tone_id=112\"],\n    [\"\u97f3\u9891113\", \"tone_id=113\"],\n    [\"\u97f3\u9891204\", \"tone_id=204\"]\n];\n\nfunction set(num) {\n    try {\n        var value = JSON.parse(source.getVariable());\n        value.tone = toneData[num][1];\n        source.setVariable(JSON.stringify(value, null, \"\\t\"));\n    } catch (error) {\n        source.setVariable(JSON.stringify({\"tone\": toneData[num][1]}, null, \"\\t\"));\n    }\n    \n    java.longToast(\"\u97f3\u8272\u8bbe\u7f6e\u6210\u529f\uff1a\" + toneData[num][0])\n}","respondTime":180000,"ruleBookInfo":{"author":"$.author","coverUrl":"$.cover_url","init":"$.data","intro":"$.abstract","kind":"$.kind","lastChapter":"$.last_chapter","name":"$.title","tocUrl":"@js:\ntry {\n    var value = JSON.parse(source.getVariable());\n    var mode = value.mode;\n} catch (error) {\n    var mode = \"3\";\n}\n\nvar tab = \"\u5c0f\u8bf4\";\nif (mode == \"2\") {\n    tab = \"\u6709\u58f0\";\n} else if (mode == \"8\") {\n    tab = \"\u6f2b\u753b\";\n} else if (mode == \"11\") {\n    tab = \"\u89c6\u9891\";\n}\n\nresult = getHost() + '\/catalog?book_id={{$.book_id}}&tab=' + tab + '&source=\u756a\u8304'","wordCount":"$.word_count"},"ruleContent":{"content":"<js>\nvar type = java.get(\"type\");\nvar item_id = java.hexDecodeToString(result);\n\nif (type == '3') {\n    url = getHost() + '\/content?book_id=' + java.get('book_id') + '&item_id=' + item_id + '&tab=\u5c0f\u8bf4&source=\u756a\u8304'; \n    var response = java.ajax(url);\n    var json = JSON.parse(response);\n    if (json.success && json.data && json.data.length > 0) {\n        result = json.data[0].content;\n    } else {\n        result = '\u3010\u52a0\u8f7d\u5931\u8d25\u3011\u672a\u83b7\u53d6\u5230\u5185\u5bb9\u6570\u636e';\n    }\n}\nif (type == '2') {\n    try {\n        var value = JSON.parse(source.getVariable());\n        var tone = value.tone;\n    } catch (error) {\n        var tone = \"\";\n    }\n    url = getHost() + '\/content?book_id=' + java.get('book_id') + '&item_id=' + item_id + '&tab=\u6709\u58f0&source=\u756a\u8304' + (tone ? '&' + tone : '');\n    var response = java.ajax(url);\n    var json = JSON.parse(response);\n    if (json.success && json.data && json.data.length > 0) {\n        result = json.data[0].content;\n    } else {\n        result = '\u3010\u52a0\u8f7d\u5931\u8d25\u3011\u672a\u83b7\u53d6\u5230\u97f3\u9891\u6570\u636e';\n    }\n}\nif (type == '8') {\n    url = getHost() + '\/content?book_id=' + java.get('book_id') + '&item_id=' + item_id + '&tab=\u6f2b\u753b&source=\u756a\u8304'; \n    var response = java.ajax(url);\n    var json = JSON.parse(response);\n    if (json.success && json.data && json.data.length > 0) {\n        result = json.data[0].content;\n    } else {\n        result = '\u3010\u52a0\u8f7d\u5931\u8d25\u3011\u672a\u83b7\u53d6\u5230\u5185\u5bb9\u6570\u636e';\n    }\n}\nif (type == '11') {\n    url = getHost() + '\/content?book_id=' + java.get('book_id') + '&tab=\u89c6\u9891&source=\u756a\u8304&player=y'; \n    java.log(url);\n    java.startBrowser(url, \"\");\n    result = `\u3010\u5237\u65b0\u6b63\u6587\u3011\u64ad\u653e`\n}\n<\/js>"},"ruleExplore":{"author":"$.author","bookList":"$.books","bookUrl":"@js:\ntry {\n    var value = JSON.parse(source.getVariable());\n    var mode = value.mode;\n} catch (error) {\n    var mode = \"3\";\n}\n\nvar tab = \"\u5c0f\u8bf4\";\nif (mode == \"2\") {\n    tab = \"\u6709\u58f0\";\n} else if (mode == \"8\") {\n    tab = \"\u6f2b\u753b\";\n} else if (mode == \"11\") {\n    tab = \"\u89c6\u9891\";\n}\n\nresult = getHost() + '\/detail?book_id={{$.book_id}}&tab=' + tab + '&source=\u756a\u8304'","coverUrl":"$.cover_url","intro":"$.abstract","kind":"$.kind","lastChapter":"$.last_chapter","name":"$.title","wordCount":"$.word_count"},"ruleSearch":{"author":"$.author","bookList":"$.results","bookUrl":"@js:\ntry {\n    var value = JSON.parse(source.getVariable());\n    var mode = value.mode;\n} catch (error) {\n    var mode = \"3\";\n}\n\nvar tab = \"\u5c0f\u8bf4\";\nif (mode == \"2\") {\n    tab = \"\u6709\u58f0\";\n} else if (mode == \"8\") {\n    tab = \"\u6f2b\u753b\";\n} else if (mode == \"11\") {\n    tab = \"\u89c6\u9891\";\n}\n\nresult = getHost() + '\/detail?book_id={{$.book_id}}&tab=' + tab + '&source=\u756a\u8304'","checkKeyWord":"\u4f60\u5931\u4fe1\u4e86","coverUrl":"$.cover_url","intro":"$.abstract","kind":"$.kind","lastChapter":"$.last_chapter","name":"$.title","wordCount":"$.word_count"},"ruleToc":{"chapterList":"$.chapters<js>java.put('book_id', java.getString('$.book_id')); result<\/js>","chapterName":"$.title","chapterUrl":"$.item_id\n<js>\nvar type = java.get(\"type\");\n\nif (type == '3') {\n    book.type = 8;\n}\nif (type == '2') {\n    book.type = 32;\n}\nif (type == '8') {\n    book.type = 64;\n}\nif (type == '11') {\n    book.type = 8;\n}\n\nresult = `data:;base64,${java.base64Encode(result)},{\"type\":\"\u805a\u5408\u4e66\u6e90\"}`\n<\/js>","updateTime":"$.chapter_info"},"searchUrl":"@js:\ntry {\n    var value = JSON.parse(source.getVariable());\n    var mode = value.mode;\n    if (mode == \"3\") {\n        tab = \"\u5c0f\u8bf4\"\n        java.put(\"type\", \"3\")\n    }\n    if (mode == \"2\") {\n        tab = \"\u6709\u58f0\"\n        java.put(\"type\", \"2\")\n    }\n    if (mode == \"8\") {\n        tab = \"\u6f2b\u753b\"\n        java.put(\"type\", \"8\")\n    }\n    if (mode == \"11\") {\n        tab = \"\u89c6\u9891\"\n        java.put(\"type\", \"11\")\n    }\n    if(!tab) {\n        tab = \"\u5c0f\u8bf4\"\n        java.put(\"type\", \"3\")\n    }\n} catch (error) {\n    tab = \"\u5c0f\u8bf4\"\n    java.put(\"type\", \"3\")\n}\n\nresult = getHost() + '\/search?q={{key}}&tab=' + tab + '&source=\u756a\u8304&page={{page}}'","weight":0},{"bookSourceUrl":"https:\/\/canovel.com","bookSourceType":0,"bookSourceName":"CA \u60c5\u8272\u5c0f\u8bf4\uff08\u4fee\u590d\uff09","bookSourceGroup":"\u6210\u4eba\u5c0f\u8bf4","bookSourceComment":"\u4fee\u590d\u7248\uff1a\u641c\u7d22\u3001\u53d1\u73b0\u3001\u6b63\u6587\u5747\u53ef\u7528\uff08WordPress \u5355\u9875\u5168\u6587\uff09","loginUrl":"","loginUi":"","loginCheckJs":"","concurrentRate":"3","header":"","bookUrlPattern":"https:\/\/canovel.com\/.*","searchUrl":"https:\/\/canovel.com\/page\/{{page}}?s={{key}}","exploreUrl":"\u5168\u90e8\u6587\u7ae0::https:\/\/canovel.com\/page\/{{page}}\n\u4eba\u59bb\u719f\u5973::https:\/\/canovel.com\/category\/%e4%ba%ba%e5%a6%bb%e7%86%9f%e5%a5%b3\/page\/{{page}}\n\u4e82\u502b\u5c0f\u8aaa::https:\/\/canovel.com\/category\/%e4%ba%82%e5%80%ab%e5%b0%8f%e8%aa%aa\/page\/{{page}}\n\u5f37\u66b4\u8650\u5f85::https:\/\/canovel.com\/category\/%e5%bc%b7%e6%9a%b4%e8%99%90%e5%be%85\/page\/{{page}}","enabled":true,"enabledExplore":true,"weight":0,"customOrder":1,"lastUpdateTime":"1767284605234","ruleSearch":{"checkKeyWord":"grid-wrapper","bookList":"div#grid-wrapper article.grid-item","name":"h2.post-title a@text","author":"","kind":"p.post-category@text","wordCount":"","lastChapter":"p.post-date time@text","intro":"div.entry-summary p@text","coverUrl":"","bookUrl":"h2.post-title a@href"},"ruleExplore":{"bookList":"div#grid-wrapper article.grid-item","name":"h2.post-title a@text","author":"","kind":"p.post-category@text","wordCount":"","lastChapter":"p.post-date time@text","intro":"div.entry-summary p@text","coverUrl":"","bookUrl":"h2.post-title a@href"},"ruleBookInfo":{"init":"","name":"h1@text","author":"","kind":"p.post-category@text","wordCount":"","lastChapter":"","intro":"div.entry-content p@text","coverUrl":""},"ruleToc":{"chapterList":"","chapterName":"","chapterUrl":""},"ruleContent":{"content":"div.entry-content","replaceRegex":""},"enabledCookieJar":false,"enabledReview":false,"respondTime":180000},{"bookSourceComment":"\/\/2000+\u97e9\u6f2b\u8d44\u6e90\n\/\/\u53d1\u5e03\u5730\u5740\uff1ahttps:\/\/rdz1.xyz\/dizhi\nflag = 1\ni = \"\u9312\u769a\u85f9\u7919\u611b\u566f\u5b21\u74a6\u66d6\u9744\u8af3\u92a8\u9d6a\u9aaf\u8956\u5967\u5abc\u9a41\u9c32\u58e9\u7f77\u9200\u64fa\u6557\u5504\u9812\u8fa6\u7d46\u9211\u5e6b\u7d81\u938a\u8b17\u525d\u98fd\u5bf6\u5831\u9b91\u9d07\u9f59\u8f29\u8c9d\u92c7\u72fd\u5099\u618a\u9d6f\u8cc1\u931b\u7e43\u7b46\u7562\u6583\u5e63\u9589\u84fd\u55f6\u6f77\u924d\u7bf3\u8e55\u908a\u7de8\u8cb6\u8b8a\u8faf\u8fae\u8290\u7df6\u7c69\u6a19\u9a43\u98ae\u98c6\u93e2\u9463\u9c3e\u9c49\u5225\u765f\u7015\u6ff1\u8cd3\u64ef\u5110\u7e7d\u6ab3\u6baf\u81cf\u944c\u9ad5\u9b22\u9905\u7a1f\u64a5\u7f3d\u9251\u99c1\u9911\u9238\u9d53\u88dc\u923d\u8ca1\u53c3\u8836\u6b98\u615a\u6158\u71e6\u9a42\u9ef2\u84bc\u8259\u5009\u6ec4\u5ec1\u5074\u518a\u6e2c\u60fb\u5c64\u8a6b\u9364\u5115\u91f5\u6519\u647b\u87ec\u995e\u8b92\u7e8f\u93df\u7522\u95e1\u986b\u56c5\u8ac2\u8b96\u8546\u61fa\u5b0b\u9a4f\u8998\u79aa\u9414\u5834\u5617\u9577\u511f\u8178\u5ee0\u66a2\u5000\u8407\u60b5\u95b6\u9be7\u9214\u8eca\u5fb9\u7868\u5875\u9673\u896f\u5096\u8af6\u6aec\u78e3\u9f54\u6490\u7a31\u61f2\u8aa0\u9a01\u68d6\u6a89\u92ee\u943a\u7661\u9072\u99b3\u6065\u9f52\u71be\u98ed\u9d1f\u6c96\u885d\u87f2\u5bf5\u9283\u7587\u8e8a\u7c4c\u7da2\u5114\u5e6c\u8b8e\u6ae5\u5eda\u92e4\u96db\u790e\u5132\u89f8\u8655\u82bb\u7d40\u8e95\u50b3\u91e7\u7621\u95d6\u5275\u6134\u9318\u7d9e\u7d14\u9d89\u7dbd\u8f1f\u9f6a\u8fad\u8a5e\u8cdc\u9dbf\u8070\u8525\u56ea\u5f9e\u53e2\u84ef\u9a44\u6a05\u6e4a\u8f33\u8ea5\u7ac4\u651b\u932f\u92bc\u9e7a\u9054\u5660\u97c3\u5e36\u8cb8\u99d8\u7d3f\u64d4\u55ae\u9132\u64a3\u81bd\u619a\u8a95\u5f48\u6bab\u8ce7\u7649\u7c1e\u7576\u64cb\u9ee8\u8569\u6a94\u8b9c\u78ad\u8960\u6417\u5cf6\u79b1\u5c0e\u76dc\u71fe\u71c8\u9127\u9419\u6575\u6ecc\u905e\u7de0\u7cf4\u8a46\u8ae6\u7d88\u89bf\u93d1\u985b\u9ede\u588a\u96fb\u5dd4\u923f\u7672\u91e3\u8abf\u929a\u9bdb\u8adc\u758a\u9c08\u91d8\u9802\u9320\u8a02\u92cc\u4e1f\u92a9\u6771\u52d5\u68df\u51cd\u5d20\u9d87\u7ac7\u72a2\u7368\u8b80\u8ced\u934d\u7006\u6add\u7258\u7be4\u9ef7\u935b\u65b7\u7dde\u7c6a\u514c\u968a\u5c0d\u61df\u9413\u5678\u9813\u920d\u71c9\u8e89\u596a\u58ae\u9438\u9d5d\u984d\u8a1b\u60e1\u9913\u8ae4\u580a\u95bc\u8edb\u92e8\u9354\u9d9a\u984e\u9853\u9c77\u8a92\u5152\u723e\u990c\u8cb3\u9087\u927a\u9d2f\u9b9e\u767c\u7f70\u95a5\u743a\u792c\u91e9\u7169\u8ca9\u98ef\u8a2a\u7d21\u9201\u9b74\u98db\u8ab9\u5ee2\u8cbb\u7dcb\u9428\u9be1\u7d1b\u58b3\u596e\u61a4\u7cde\u50e8\u8c50\u6953\u92d2\u98a8\u760b\u99ae\u7e2b\u8af7\u9cf3\u7043\u819a\u8f3b\u64ab\u8f14\u8ce6\u5fa9\u8ca0\u8a03\u5a66\u7e1b\u9ce7\u99d9\u7d31\u7d3c\u8cfb\u9ea9\u9b92\u9c12\u91d3\u8a72\u9223\u84cb\u8cc5\u687f\u8d95\u7a08\u8d1b\u5c37\u641f\u7d3a\u5ca1\u525b\u92fc\u7db1\u5d17\u6207\u93ac\u776a\u8aa5\u7e1e\u92ef\u64f1\u9d3f\u95a3\u927b\u500b\u7d07\u9398\u6f41\u7d66\u4e99\u8ce1\u7d86\u9bc1\u9f94\u5bae\u978f\u8ca2\u9264\u6e9d\u830d\u69cb\u8cfc\u5920\u8a6c\u7df1\u89af\u8831\u9867\u8a41\u8f42\u9237\u932e\u9d23\u9d60\u9dbb\u526e\u639b\u9d30\u6451\u95dc\u89c0\u9928\u6163\u8cab\u8a7f\u645c\u9e1b\u9c25\u5ee3\u7377\u898f\u6b78\u9f9c\u95a8\u8ecc\u8a6d\u8cb4\u528a\u532d\u528c\u5aaf\u6a9c\u9bad\u9c56\u8f25\u6efe\u889e\u7dc4\u9bc0\u934b\u570b\u904e\u581d\u54bc\u5e57\u69e8\u87c8\u927f\u99ed\u97d3\u6f22\u95de\u7d4e\u9821\u865f\u705d\u9865\u95a1\u9db4\u8cc0\u8a36\u95d4\u8823\u6a6b\u8f5f\u9d3b\u7d05\u9ecc\u8a0c\u8452\u958e\u9c5f\u58fa\u8b77\u6eec\u6236\u6ef8\u9d98\u5629\u83ef\u756b\u5283\u8a71\u9a4a\u6a3a\u93f5\u61f7\u58de\u6b61\u74b0\u9084\u7de9\u63db\u559a\u7613\u7165\u6e19\u5950\u7e6f\u9370\u9bc7\u9ec3\u8b0a\u9c09\u63ee\u8f1d\u6bc0\u8cc4\u7a62\u6703\u71f4\u532f\u8af1\u8aa8\u7e6a\u8a7c\u8588\u5666\u6fae\u7e62\u743f\u6689\u8477\u6e3e\u8ae2\u991b\u95bd\u7372\u8ca8\u798d\u9225\u944a\u64ca\u6a5f\u7a4d\u9951\u8de1\u8b4f\u96de\u7e3e\u7ddd\u6975\u8f2f\u7d1a\u64e0\u5e7e\u858a\u5291\u6fdf\u8a08\u8a18\u969b\u7e7c\u7d00\u8a10\u8a70\u85ba\u5630\u568c\u9a65\u74a3\u89ac\u9f4f\u78ef\u7f88\u8806\u8e8b\u973d\u9c6d\u9bfd\u593e\u83a2\u9830\u8cc8\u9240\u50f9\u99d5\u90df\u6d79\u92cf\u93b5\u87ef\u6bb2\u76e3\u5805\u7b8b\u9593\u8271\u7dd8\u7e6d\u6aa2\u583f\u9e7c\u63c0\u64bf\u7c21\u5109\u6e1b\u85a6\u6abb\u9452\u8e10\u8ce4\u898b\u9375\u8266\u528d\u991e\u6f38\u6ffa\u6f97\u8aeb\u7e11\u6214\u6229\u77bc\u9dbc\u7b67\u9c39\u97c9\u5c07\u6f3f\u8523\u69f3\u734e\u8b1b\u91ac\u7d73\u97c1\u81a0\u6f86\u9a55\u5b0c\u652a\u9278\u77ef\u50e5\u8173\u9903\u7e73\u7d5e\u8f4e\u8f03\u649f\u5da0\u9de6\u9bab\u968e\u7bc0\u6f54\u7d50\u8aa1\u5c46\u7664\u981c\u9b9a\u7dca\u9326\u50c5\u8b39\u9032\u6649\u71fc\u76e1\u52c1\u834a\u8396\u5df9\u85ce\u9949\u7e09\u8d10\u89b2\u9be8\u9a5a\u7d93\u9838\u975c\u93e1\u5f91\u75d9\u7af6\u51c8\u5244\u6d87\u9015\u5f33\u811b\u975a\u7cfe\u5ec4\u820a\u9b2e\u9ce9\u9df2\u99d2\u8209\u64da\u92f8\u61fc\u5287\u8a4e\u5c68\u6af8\u98b6\u9245\u92e6\u7ab6\u9f5f\u9d51\u7d79\u9308\u942b\u96cb\u89ba\u6c7a\u7d55\u8b4e\u73a8\u921e\u8ecd\u99ff\u76b8\u958b\u51f1\u5274\u584f\u613e\u6137\u93a7\u9347\u9f95\u958c\u9227\u92ac\u9846\u6bbc\u8ab2\u9a0d\u7dd9\u8efb\u9233\u9301\u9837\u58be\u61c7\u9f66\u93d7\u6473\u5eab\u8932\u56b3\u584a\u5108\u9136\u5672\u81be\u5bec\u736a\u9ad6\u7926\u66e0\u6cc1\u8a86\u8a91\u913a\u58d9\u7e8a\u8cba\u8667\u5dcb\u7aba\u994b\u6f70\u5331\u8562\u6192\u8075\u7c23\u95ab\u9315\u9be4\u64f4\u95ca\u8810\u881f\u81d8\u840a\u4f86\u8cf4\u5d0d\u5fa0\u6df6\u7028\u8cda\u775e\u9338\u7669\u7c5f\u85cd\u6b04\u6514\u7c43\u95cc\u862d\u703e\u8b95\u652c\u89bd\u61f6\u7e9c\u721b\u6feb\u5d50\u6b16\u6595\u946d\u8964\u746f\u95ac\u92c3\u6488\u52de\u6f87\u562e\u5d97\u92a0\u9412\u7646\u6a02\u9c33\u9433\u58d8\u985e\u6dda\u8a84\u7e32\u7c6c\u8c8d\u96e2\u9bc9\u79ae\u9e97\u53b2\u52f5\u792b\u6b77\u701d\u96b8\u5137\u9148\u58e2\u85f6\u849e\u863a\u56a6\u9090\u9a6a\u7e2d\u6aea\u6adf\u8f62\u792a\u92f0\u9e1d\u7658\u7cf2\u8e92\u9742\u9c7a\u9c67\u5006\u806f\u84ee\u9023\u942e\u6190\u6f23\u7c3e\u6582\u81c9\u93c8\u6200\u7149\u7df4\u861e\u5969\u7032\u7489\u6bae\u8933\u895d\u9c31\u7ce7\u6dbc\u5169\u8f1b\u8ad2\u9b4e\u7642\u907c\u9410\u7e5a\u91d5\u9def\u7375\u81e8\u9130\u9c57\u51dc\u8cc3\u85fa\u5ee9\u6a81\u8f54\u8eaa\u9f61\u9234\u9748\u5dba\u9818\u7dbe\u6b1e\u87f6\u9bea\u993e\u5289\u700f\u9a2e\u7db9\u93a6\u9dda\u9f8d\u807e\u56a8\u7c60\u58df\u650f\u96b4\u8622\u7027\u74cf\u6af3\u6727\u7931\u6a13\u5a41\u645f\u7c0d\u50c2\u851e\u560d\u5d81\u93e4\u763a\u802c\u87bb\u9acf\u8606\u76e7\u9871\u5eec\u7210\u64c4\u9e75\u865c\u9b6f\u8cc2\u797f\u9304\u9678\u58da\u64fc\u5695\u95ad\u7018\u6de5\u6ae8\u6ad3\u8f64\u8f05\u8f46\u6c0c\u81da\u9e15\u9dfa\u826b\u9c78\u5dd2\u6523\u5b7f\u7064\u4e82\u81e0\u5b4c\u6b12\u9e1e\u947e\u6384\u8f2a\u502b\u4f96\u6dea\u7db8\u8ad6\u5707\u863f\u7f85\u908f\u947c\u7c6e\u9a3e\u99f1\u7d61\u7296\u7380\u6ffc\u6b0f\u8161\u93cd\u9a62\u5442\u92c1\u4fb6\u5c62\u7e37\u616e\u6ffe\u7da0\u6ada\u8938\u92dd\u5638\u5abd\u746a\u78bc\u879e\u99ac\u7f75\u55ce\u561c\u5b24\u69aa\u8cb7\u9ea5\u8ce3\u9081\u8108\u52f1\u779e\u9945\u883b\u6eff\u8b3e\u7e35\u93dd\u9859\u9c3b\u8c93\u9328\u925a\u8cbf\u9ebc\u6c92\u9382\u9580\u60b6\u5011\u636b\u71dc\u61e3\u9346\u9333\u5922\u7787\u8b0e\u5f4c\u8993\u51aa\u7f8b\u8b10\u737c\u79b0\u7dbf\u7dec\u6fa0\u9766\u9efd\u5edf\u7df2\u7e46\u6ec5\u61ab\u95a9\u9594\u7de1\u9cf4\u9298\u8b2c\u8b28\u9a40\u9943\u6b7f\u93cc\u8b00\u755d\u926c\u5436\u9209\u7d0d\u96e3\u6493\u8166\u60f1\u9b27\u9403\u8a25\u9912\u5167\u64ec\u81a9\u922e\u9be2\u6506\u8f26\u9bf0\u91c0\u9ce5\u8526\u88ca\u8076\u5699\u9477\u93b3\u9689\u8617\u56c1\u9862\u8ea1\u6ab8\u7370\u5be7\u64f0\u6fd8\u82e7\u5680\u8079\u9215\u7d10\u81bf\u6fc3\u8fb2\u5102\u5665\u99d1\u91f9\u8afe\u513a\u7627\u6b50\u9dd7\u6bc6\u5614\u6f1a\u8b33\u616a\u750c\u76e4\u8e63\u9f90\u62cb\u76b0\u8ce0\u8f61\u5674\u9d6c\u7d15\u7f86\u9239\u9a19\u8ade\u99e2\u98c4\u7e39\u983b\u8ca7\u5b2a\u860b\u6191\u8a55\u6f51\u9817\u91d9\u64b2\u92ea\u6a38\u8b5c\u93f7\u9420\u68f2\u81cd\u9f4a\u9a0e\u8c48\u555f\u6c23\u68c4\u8a16\u8604\u9a0f\u7dba\u69bf\u78e7\u980e\u980f\u9c2d\u727d\u91ec\u925b\u9077\u7c3d\u8b19\u9322\u9257\u6f5b\u6dfa\u8b74\u5879\u50c9\u8541\u6173\u9a2b\u7e7e\u69e7\u9210\u69cd\u55c6\u58bb\u8594\u5f37\u6436\u5b19\u6aa3\u6227\u7197\u9306\u93d8\u93f9\u7fa5\u8e4c\u936c\u6a4b\u55ac\u50d1\u7ff9\u7ac5\u8a9a\u8b59\u854e\u7e70\u78fd\u8e7a\u7aca\u611c\u9365\u7bcb\u6b3d\u89aa\u5be2\u92df\u8f15\u6c2b\u50be\u9803\u8acb\u6176\u64b3\u9bd6\u74ca\u7aae\u7162\u86fa\u5df0\u8cd5\u87e3\u9c0d\u8da8\u5340\u8ec0\u9a45\u9f72\u8a58\u5d87\u95c3\u89b7\u9d1d\u9874\u6b0a\u52f8\u8a6e\u7da3\u8f07\u9293\u537b\u9d72\u78ba\u95cb\u95d5\u6128\u8b93\u9952\u64fe\u7e5e\u8558\u5b08\u6a48\u71b1\u97cc\u8a8d\u7d09\u98ea\u8ed4\u69ae\u7d68\u5db8\u8811\u7e1f\u92a3\u9870\u8edf\u92b3\u8706\u958f\u6f64\u7051\u85a9\u98af\u9c13\u8cfd\u5098\u6bff\u7cdd\u55aa\u9a37\u6383\u7e45\u6f80\u55c7\u92ab\u7a61\u6bba\u524e\u7d17\u93a9\u9bca\u7be9\u66ec\u91c3\u522a\u9583\u965c\u8d0d\u7e55\u8a15\u59cd\u9a38\u91e4\u9c54\u5891\u50b7\u8cde\u5770\u6ba4\u89f4\u71d2\u7d39\u8cd2\u651d\u61fe\u8a2d\u5399\u7044\u756c\u7d33\u5be9\u5b38\u814e\u6ef2\u8a75\u8ad7\u700b\u8072\u7e69\u52dd\u5e2b\u7345\u6fd5\u8a69\u6642\u8755\u5be6\u8b58\u99db\u52e2\u9069\u91cb\u98fe\u8996\u8a66\u8b1a\u5852\u8494\u5f12\u8efe\u8cb0\u9230\u9c23\u58fd\u7378\u7dac\u6a1e\u8f38\u66f8\u8d16\u5c6c\u8853\u6a39\u8c4e\u6578\u6504\u7d13\u5e25\u9582\u96d9\u8ab0\u7a05\u9806\u8aaa\u78a9\u720d\u9460\u7d72\u98fc\u5edd\u99df\u7de6\u9376\u9de5\u8073\u616b\u980c\u8a1f\u8aa6\u64fb\u85ea\u993f\u98bc\u93aa\u8607\u8a34\u8085\u8b16\u7a4c\u96d6\u96a8\u7d8f\u6b72\u8ab6\u5b6b\u640d\u7b4d\u84c0\u733b\u7e2e\u7463\u9396\u55e9\u8127\u737a\u64bb\u95e5\u9248\u9c28\u81fa\u614b\u9226\u9b90\u6524\u8caa\u7671\u7058\u58c7\u8b5a\u8ac7\u5606\u66c7\u926d\u931f\u9807\u6e6f\u71d9\u513b\u9933\u940b\u93dc\u6fe4\u7d73\u8a0e\u97dc\u92f1\u9a30\u8b04\u92bb\u984c\u9ad4\u5c5c\u7df9\u9d5c\u95d0\u689d\u7cf6\u9f60\u9c37\u8cbc\u9435\u5ef3\u807d\u70f4\u9285\u7d71\u615f\u982d\u9204\u79bf\u5716\u91f7\u5718\u6476\u9839\u86fb\u98e9\u812b\u9d15\u99b1\u99dd\u6a62\u7c5c\u9f09\u896a\u5aa7\u8183\u5f4e\u7063\u9811\u842c\u7d08\u7db0\u7db2\u8f1e\u97cb\u9055\u570d\u70ba\u6ff0\u7dad\u8466\u5049\u507d\u7def\u8b02\u885b\u8ac9\u5e43\u95c8\u6e88\u6f7f\u744b\u97d9\u7152\u9baa\u6eab\u805e\u7d0b\u7a69\u554f\u95bf\u7515\u64be\u8778\u6e26\u7aa9\u81e5\u8435\u9f77\u55da\u93a2\u70cf\u8aa3\u7121\u856a\u5433\u5862\u9727\u52d9\u8aa4\u9114\u5ee1\u61ae\u5af5\u9a16\u9d61\u9da9\u932b\u72a7\u8972\u7fd2\u9291\u6232\u7d30\u993c\u9b29\u74bd\u89a1\u8766\u8f44\u5cfd\u4fe0\u72f9\u5ec8\u5687\u7864\u9bae\u7e96\u8ce2\u929c\u9591\u986f\u96aa\u73fe\u737b\u7e23\u9921\u7fa8\u61b2\u7dda\u83a7\u859f\u861a\u5cf4\u736b\u5afb\u9df4\u7647\u8814\u79c8\u8e9a\u5ec2\u9472\u9109\u8a73\u97ff\u9805\u858c\u9909\u9a64\u7dd7\u9957\u856d\u56c2\u92b7\u66c9\u562f\u5635\u701f\u9a4d\u7d83\u689f\u7c2b\u5354\u633e\u651c\u8105\u8ae7\u5beb\u7009\u8b1d\u893b\u64f7\u7d32\u7e88\u92c5\u91c1\u8208\u9658\u6ece\u5147\u6d36\u92b9\u7e61\u9948\u9d42\u865b\u5653\u9808\u8a31\u6558\u7dd2\u7e8c\u8a61\u980a\u8ed2\u61f8\u9078\u766c\u7d62\u8afc\u9249\u93c7\u5b78\u8b14\u6fa9\u9c48\u52db\u8a62\u5c0b\u99b4\u8a13\u8a0a\u905c\u5864\u6f6f\u9c58\u58d3\u9d09\u9d28\u555e\u4e9e\u8a1d\u57e1\u5a6d\u690f\u6c2c\u95b9\u7159\u9e7d\u56b4\u5dd6\u984f\u95bb\u8277\u53ad\u786f\u5f65\u8afa\u9a57\u53b4\u8d17\u513c\u5157\u8b9e\u61e8\u9586\u91c5\u9b58\u995c\u9f34\u9d26\u694a\u63da\u760d\u967d\u7662\u990a\u6a23\u716c\u7464\u6416\u582f\u9059\u7aaf\u8b20\u85e5\u8efa\u9dc2\u9c29\u723a\u9801\u696d\u8449\u9768\u8b01\u9134\u66c4\u71c1\u91ab\u92a5\u9824\u907a\u5100\u87fb\u85dd\u5104\u61b6\u7fa9\u8a63\u8b70\u8abc\u8b6f\u7570\u7e79\u8a52\u56c8\u5da7\u98f4\u61cc\u9a5b\u7e0a\u8efc\u8cbd\u91d4\u93b0\u943f\u761e\u8264\u852d\u9670\u9280\u98f2\u96b1\u92a6\u766e\u6afb\u5b30\u9df9\u61c9\u7e93\u7469\u87a2\u71df\u7192\u8805\u8d0f\u7a4e\u584b\u9daf\u7e08\u93a3\u6516\u56b6\u7005\u7020\u74d4\u9e1a\u766d\u9826\u7f4c\u55b2\u64c1\u50ad\u7670\u8e34\u8a60\u93de\u512a\u6182\u90f5\u923e\u7336\u8a98\u8555\u92aa\u9b77\u8f3f\u9b5a\u6f01\u5a1b\u8207\u5dbc\u8a9e\u7344\u8b7d\u9810\u99ad\u50b4\u4fc1\u8adb\u8aed\u8577\u5d33\u98eb\u95be\u5ad7\u7d06\u89a6\u6b5f\u923a\u9d52\u9df8\u9f6c\u9d1b\u6df5\u8f45\u5712\u54e1\u5713\u7de3\u9060\u6ade\u9cf6\u9eff\u7d04\u8e8d\u9470\u7cb5\u6085\u95b1\u925e\u9116\u52fb\u9695\u904b\u860a\u919e\u6688\u97fb\u9106\u8553\u60f2\u614d\u7d1c\u97de\u6b9e\u6c33\u96dc\u707d\u8f09\u6522\u66ab\u8d0a\u74da\u8db2\u93e8\u8d13\u81df\u99d4\u947f\u68d7\u8cac\u64c7\u5247\u6fa4\u8cfe\u5616\u5e58\u7c00\u8cca\u8b56\u8d08\u7d9c\u7e52\u8ecb\u9358\u9598\u67f5\u8a50\u9f4b\u50b5\u6c08\u76de\u65ac\u8f3e\u5d84\u68e7\u6230\u7dbb\u8b6b\u5f35\u6f32\u5e33\u8cec\u8139\u8d99\u8a54\u91d7\u87c4\u8f4d\u937a\u9019\u8b2b\u8f12\u9dd3\u8c9e\u91dd\u5075\u8a3a\u93ae\u9663\u6e5e\u7e1d\u6968\u8eeb\u8cd1\u798e\u9d06\u6399\u775c\u7319\u722d\u5e40\u7665\u912d\u8b49\u8acd\u5d22\u9266\u931a\u7b8f\u7e54\u8077\u57f7\u7d19\u646f\u64f2\u5e5f\u8cea\u6eef\u9a2d\u6adb\u6894\u8ef9\u8f0a\u8d04\u9dd9\u8784\u7e36\u8e93\u8e91\u89f6\u9418\u7d42\u7a2e\u816b\u773e\u937e\u8b05\u8ef8\u76ba\u665d\u9a5f\u7d02\u7e10\u8c6c\u8af8\u8a85\u71ed\u77da\u56d1\u8caf\u9444\u99d0\u4f47\u6ae7\u9296\u5c08\u78da\u8f49\u8cfa\u56c0\u994c\u9873\u6a01\u838a\u88dd\u599d\u58ef\u72c0\u9310\u8d05\u589c\u7db4\u9a05\u7e0b\u8ac4\u6e96\u8457\u6fc1\u8ad1\u9432\u8332\u8cc7\u6f2c\u8aee\u7dc7\u8f1c\u8cb2\u7725\u9319\u9f5c\u9bd4\u8e64\u7e3d\u7e31\u50af\u9112\u8acf\u9a36\u9beb\u8a5b\u7d44\u93c3\u9246\u7e98\u8ea6\u9c52\u7ffa\u4e26\u8514\u6c88\u919c\u6fb1\u53e0\u9b25\u7bc4\u5e79\u81ef\u77fd\u6ac3\u5f8c\u5925\u7a2d\u5091\u8a23\u8a87\u88cf\u6de9\u9ebd\u9ef4\u649a\u6dd2\u6261\u8056\u5c4d\u64e1\u5857\u7aaa\u9935\u6c59\u9341\u9e79\u880d\u5f5c\u6e67\u904a\u7c72\u79a6\u9858\u5dbd\u96f2\u7ac8\u7d2e\u5284\u7bc9\u65bc\u8a8c\u8a3b\u96d5\u8a01\u8b7e\u90e4\u731b\u6c39\u962a\u58df\u5816\u57b5\u588a\u6abe\u8552\u8464\u84e7\u8493\u83c7\u69c1\u6463\u54a4\u551a\u54e2\u565d\u5645\u6485\u567c\u8b14\u8946\u5db4\u810a\u4eff\u50e5\u7341\u9e85\u9918\u9937\u994a\u9962\u695e\u6035\u61cd\u723f\u6f35\u7069\u6eb7\u6feb\u7026\u6de1\u5be7\u7cf8\u7d5d\u7dd4\u7449\u6898\u68ec\u6848\u6a70\u6aeb\u8ef2\u8ee4\u8ceb\u8181\u8156\u98c8\u7cca\u7146\u6e9c\u6e63\u6e3a\u78b8\u6efe\u7798\u9208\u9255\u92e3\u92b1\u92e5\u92f6\u9426\u9427\u9369\u9340\u9343\u9307\u9384\u9387\u93bf\u941d\u9465\u9479\u9454\u7a6d\u9d93\u9da5\u9e0c\u7667\u5c59\u7602\u81d2\u8947\u7e48\u802e\u986c\u87ce\u9eaf\u9b81\u9b83\u9b8e\u9bd7\u9bdd\u9bf4\u9c5d\u9bff\u9c20\u9c35\u9c45\u97bd\u97dd\u9f47\u846f\u617e\u88e1\u59ca\u4f54\u5fb5\u5537\u52d0\u7832\u9aee\u6fb9\u5641\u59e6\u4e7e\u9b06\u59ea\u56c9\";\nz = \"\u9515\u7691\u853c\u788d\u7231\u55f3\u5ad2\u7477\u66a7\u972d\u8c19\u94f5\u9e4c\u80ae\u8884\u5965\u5aaa\u9a9c\u9ccc\u575d\u7f62\u94af\u6446\u8d25\u5457\u9881\u529e\u7eca\u94a3\u5e2e\u7ed1\u9551\u8c24\u5265\u9971\u5b9d\u62a5\u9c8d\u9e28\u9f85\u8f88\u8d1d\u94a1\u72c8\u5907\u60eb\u9e4e\u8d32\u951b\u7ef7\u7b14\u6bd5\u6bd9\u5e01\u95ed\u835c\u54d4\u6ed7\u94cb\u7b5a\u8df8\u8fb9\u7f16\u8d2c\u53d8\u8fa9\u8fab\u82c4\u7f0f\u7b3e\u6807\u9aa0\u98d1\u98d9\u9556\u9556\u9cd4\u9cd6\u522b\u762a\u6fd2\u6ee8\u5bbe\u6448\u50a7\u7f24\u69df\u6ba1\u8191\u9554\u9acc\u9b13\u997c\u7980\u62e8\u94b5\u94c2\u9a73\u997d\u94b9\u9e41\u8865\u94b8\u8d22\u53c2\u8695\u6b8b\u60ed\u60e8\u707f\u9a96\u9eea\u82cd\u8231\u4ed3\u6ca7\u5395\u4fa7\u518c\u6d4b\u607b\u5c42\u8be7\u9538\u4faa\u9497\u6400\u63ba\u8749\u998b\u8c17\u7f20\u94f2\u4ea7\u9610\u98a4\u5181\u8c04\u8c36\u8487\u5fcf\u5a75\u9aa3\u89c7\u7985\u9561\u573a\u5c1d\u957f\u507f\u80a0\u5382\u7545\u4f25\u82cc\u6005\u960a\u9cb3\u949e\u8f66\u5f7b\u7817\u5c18\u9648\u886c\u4f27\u8c0c\u6987\u789c\u9f80\u6491\u79f0\u60e9\u8bda\u9a8b\u67a8\u67fd\u94d6\u94db\u75f4\u8fdf\u9a70\u803b\u9f7f\u70bd\u996c\u9e31\u51b2\u51b2\u866b\u5ba0\u94f3\u7574\u8e0c\u7b79\u7ef8\u4fe6\u5e31\u96e0\u6a71\u53a8\u9504\u96cf\u7840\u50a8\u89e6\u5904\u520d\u7ecc\u8e70\u4f20\u948f\u75ae\u95ef\u521b\u6006\u9524\u7f0d\u7eaf\u9e51\u7ef0\u8f8d\u9f8a\u8f9e\u8bcd\u8d50\u9e5a\u806a\u8471\u56f1\u4ece\u4e1b\u82c1\u9aa2\u679e\u51d1\u8f8f\u8e7f\u7a9c\u64ba\u9519\u9509\u9e7e\u8fbe\u54d2\u9791\u5e26\u8d37\u9a80\u7ed0\u62c5\u5355\u90f8\u63b8\u80c6\u60ee\u8bde\u5f39\u6b9a\u8d55\u7605\u7baa\u5f53\u6321\u515a\u8361\u6863\u8c20\u7800\u88c6\u6363\u5c9b\u7977\u5bfc\u76d7\u7118\u706f\u9093\u956b\u654c\u6da4\u9012\u7f14\u7c74\u8bcb\u8c1b\u7ee8\u89cc\u955d\u98a0\u70b9\u57ab\u7535\u5dc5\u94bf\u766b\u9493\u8c03\u94eb\u9cb7\u8c0d\u53e0\u9cbd\u9489\u9876\u952d\u8ba2\u94e4\u4e22\u94e5\u4e1c\u52a8\u680b\u51bb\u5cbd\u9e2b\u7aa6\u728a\u72ec\u8bfb\u8d4c\u9540\u6e0e\u691f\u724d\u7b03\u9ee9\u953b\u65ad\u7f0e\u7c16\u5151\u961f\u5bf9\u603c\u9566\u5428\u987f\u949d\u7096\u8db8\u593a\u5815\u94ce\u9e45\u989d\u8bb9\u6076\u997f\u8c14\u57a9\u960f\u8f6d\u9507\u9537\u9e57\u989a\u989b\u9cc4\u8bf6\u513f\u5c14\u9975\u8d30\u8fe9\u94d2\u9e38\u9c95\u53d1\u7f5a\u9600\u73d0\u77fe\u9492\u70e6\u8d29\u996d\u8bbf\u7eba\u94ab\u9c82\u98de\u8bfd\u5e9f\u8d39\u7eef\u9544\u9cb1\u7eb7\u575f\u594b\u6124\u7caa\u507e\u4e30\u67ab\u950b\u98ce\u75af\u51af\u7f1d\u8bbd\u51e4\u6ca3\u80a4\u8f90\u629a\u8f85\u8d4b\u590d\u8d1f\u8ba3\u5987\u7f1a\u51eb\u9a78\u7ec2\u7ecb\u8d59\u9eb8\u9c8b\u9cc6\u9486\u8be5\u9499\u76d6\u8d45\u6746\u8d76\u79c6\u8d63\u5c34\u64c0\u7ec0\u5188\u521a\u94a2\u7eb2\u5c97\u6206\u9550\u777e\u8bf0\u7f1f\u9506\u6401\u9e3d\u9601\u94ec\u4e2a\u7ea5\u9549\u988d\u7ed9\u4e98\u8d53\u7ee0\u9ca0\u9f9a\u5bab\u5de9\u8d21\u94a9\u6c9f\u82df\u6784\u8d2d\u591f\u8bdf\u7f11\u89cf\u86ca\u987e\u8bc2\u6bc2\u94b4\u9522\u9e2a\u9e44\u9e58\u5250\u6302\u9e39\u63b4\u5173\u89c2\u9986\u60ef\u8d2f\u8bd6\u63bc\u9e73\u9ccf\u5e7f\u72b7\u89c4\u5f52\u9f9f\u95fa\u8f68\u8be1\u8d35\u523d\u5326\u523f\u59ab\u6867\u9c91\u9cdc\u8f8a\u6eda\u886e\u7ef2\u9ca7\u9505\u56fd\u8fc7\u57da\u5459\u5e3c\u6901\u8748\u94ea\u9a87\u97e9\u6c49\u961a\u7ed7\u9889\u53f7\u704f\u98a2\u9602\u9e64\u8d3a\u8bc3\u9616\u86ce\u6a2a\u8f70\u9e3f\u7ea2\u9ec9\u8ba7\u836d\u95f3\u9c8e\u58f6\u62a4\u6caa\u6237\u6d52\u9e55\u54d7\u534e\u753b\u5212\u8bdd\u9a85\u6866\u94e7\u6000\u574f\u6b22\u73af\u8fd8\u7f13\u6362\u5524\u75ea\u7115\u6da3\u5942\u7f33\u953e\u9ca9\u9ec4\u8c0e\u9cc7\u6325\u8f89\u6bc1\u8d3f\u79fd\u4f1a\u70e9\u6c47\u8bb3\u8bf2\u7ed8\u8bd9\u835f\u54d5\u6d4d\u7f0b\u73f2\u6656\u8364\u6d51\u8be8\u9984\u960d\u83b7\u8d27\u7978\u94ac\u956c\u51fb\u673a\u79ef\u9965\u8ff9\u8ba5\u9e21\u7ee9\u7f09\u6781\u8f91\u7ea7\u6324\u51e0\u84df\u5242\u6d4e\u8ba1\u8bb0\u9645\u7ee7\u7eaa\u8ba6\u8bd8\u8360\u53fd\u54dc\u9aa5\u7391\u89ca\u9f51\u77f6\u7f81\u867f\u8dfb\u9701\u9c9a\u9cab\u5939\u835a\u988a\u8d3e\u94be\u4ef7\u9a7e\u90cf\u6d43\u94d7\u9553\u86f2\u6b7c\u76d1\u575a\u7b3a\u95f4\u8270\u7f04\u8327\u68c0\u78b1\u7877\u62e3\u6361\u7b80\u4fed\u51cf\u8350\u69db\u9274\u8df5\u8d31\u89c1\u952e\u8230\u5251\u996f\u6e10\u6e85\u6da7\u8c0f\u7f23\u620b\u622c\u7751\u9e63\u7b15\u9ca3\u97af\u5c06\u6d46\u848b\u6868\u5956\u8bb2\u9171\u7edb\u7f30\u80f6\u6d47\u9a84\u5a07\u6405\u94f0\u77eb\u4fa5\u811a\u997a\u7f34\u7ede\u8f7f\u8f83\u6322\u5ce4\u9e6a\u9c9b\u9636\u8282\u6d01\u7ed3\u8beb\u5c4a\u7596\u988c\u9c92\u7d27\u9526\u4ec5\u8c28\u8fdb\u664b\u70ec\u5c3d\u52b2\u8346\u830e\u537a\u8369\u9991\u7f19\u8d46\u89d0\u9cb8\u60ca\u7ecf\u9888\u9759\u955c\u5f84\u75c9\u7ade\u51c0\u522d\u6cfe\u8ff3\u5f2a\u80eb\u9753\u7ea0\u53a9\u65e7\u9604\u9e20\u9e6b\u9a79\u4e3e\u636e\u952f\u60e7\u5267\u8bb5\u5c66\u6989\u98d3\u949c\u9514\u7aad\u9f83\u9e43\u7ee2\u9529\u954c\u96bd\u89c9\u51b3\u7edd\u8c32\u73cf\u94a7\u519b\u9a8f\u76b2\u5f00\u51ef\u5240\u57b2\u5ffe\u607a\u94e0\u9534\u9f9b\u95f6\u94aa\u94d0\u9897\u58f3\u8bfe\u9a92\u7f02\u8f72\u94b6\u951e\u9894\u57a6\u6073\u9f88\u94ff\u62a0\u5e93\u88e4\u55be\u5757\u4fa9\u90d0\u54d9\u810d\u5bbd\u72ef\u9acb\u77ff\u65f7\u51b5\u8bd3\u8bf3\u909d\u5739\u7ea9\u8d36\u4e8f\u5cbf\u7aa5\u9988\u6e83\u532e\u8489\u6126\u8069\u7bd1\u9603\u951f\u9cb2\u6269\u9614\u86f4\u8721\u814a\u83b1\u6765\u8d56\u5d03\u5f95\u6d9e\u6fd1\u8d49\u7750\u94fc\u765e\u7c41\u84dd\u680f\u62e6\u7bee\u9611\u5170\u6f9c\u8c30\u63fd\u89c8\u61d2\u7f06\u70c2\u6ee5\u5c9a\u6984\u6593\u9567\u8934\u7405\u9606\u9512\u635e\u52b3\u6d9d\u5520\u5d02\u94d1\u94f9\u75e8\u4e50\u9cd3\u956d\u5792\u7c7b\u6cea\u8bd4\u7f27\u7bf1\u72f8\u79bb\u9ca4\u793c\u4e3d\u5389\u52b1\u783e\u5386\u6ca5\u96b6\u4fea\u90e6\u575c\u82c8\u8385\u84e0\u5456\u9026\u9a8a\u7f21\u67a5\u680e\u8f79\u783a\u9502\u9e42\u75a0\u7c9d\u8dde\u96f3\u9ca1\u9ce2\u4fe9\u8054\u83b2\u8fde\u9570\u601c\u6d9f\u5e18\u655b\u8138\u94fe\u604b\u70bc\u7ec3\u8539\u5941\u6f4b\u740f\u6b93\u88e2\u88e3\u9ca2\u7cae\u51c9\u4e24\u8f86\u8c05\u9b49\u7597\u8fbd\u9563\u7f2d\u948c\u9e69\u730e\u4e34\u90bb\u9cde\u51db\u8d41\u853a\u5eea\u6aa9\u8f9a\u8e8f\u9f84\u94c3\u7075\u5cad\u9886\u7eeb\u68c2\u86cf\u9cae\u998f\u5218\u6d4f\u9a9d\u7efa\u954f\u9e68\u9f99\u804b\u5499\u7b3c\u5784\u62e2\u9647\u830f\u6cf7\u73d1\u680a\u80e7\u783b\u697c\u5a04\u6402\u7bd3\u507b\u848c\u55bd\u5d5d\u9542\u7618\u8027\u877c\u9ac5\u82a6\u5362\u9885\u5e90\u7089\u63b3\u5364\u864f\u9c81\u8d42\u7984\u5f55\u9646\u5786\u64b8\u565c\u95fe\u6cf8\u6e0c\u680c\u6a79\u8f73\u8f82\u8f98\u6c07\u80ea\u9e2c\u9e6d\u823b\u9c88\u5ce6\u631b\u5b6a\u6ee6\u4e71\u8114\u5a08\u683e\u9e3e\u92ae\u62a1\u8f6e\u4f26\u4ed1\u6ca6\u7eb6\u8bba\u56f5\u841d\u7f57\u903b\u9523\u7ba9\u9aa1\u9a86\u7edc\u8366\u7321\u6cfa\u6924\u8136\u9559\u9a74\u5415\u94dd\u4fa3\u5c61\u7f15\u8651\u6ee4\u7eff\u6988\u891b\u950a\u5452\u5988\u739b\u7801\u8682\u9a6c\u9a82\u5417\u551b\u5b37\u6769\u4e70\u9ea6\u5356\u8fc8\u8109\u52a2\u7792\u9992\u86ee\u6ee1\u8c29\u7f26\u9558\u98a1\u9cd7\u732b\u951a\u94c6\u8d38\u9ebd\u6ca1\u9541\u95e8\u95f7\u4eec\u626a\u7116\u61d1\u9494\u9530\u68a6\u772f\u8c1c\u5f25\u89c5\u5e42\u8288\u8c27\u7315\u7962\u7ef5\u7f05\u6e11\u817c\u9efe\u5e99\u7f08\u7f2a\u706d\u60af\u95fd\u95f5\u7f17\u9e23\u94ed\u8c2c\u8c1f\u84e6\u998d\u6b81\u9546\u8c0b\u4ea9\u94bc\u5450\u94a0\u7eb3\u96be\u6320\u8111\u607c\u95f9\u94d9\u8bb7\u9981\u5185\u62df\u817b\u94cc\u9cb5\u64b5\u8f87\u9cb6\u917f\u9e1f\u8311\u8885\u8042\u556e\u954a\u954d\u9667\u8616\u55eb\u989f\u8e51\u67e0\u72de\u5b81\u62e7\u6cde\u82ce\u549b\u804d\u94ae\u7ebd\u8113\u6d53\u519c\u4fac\u54dd\u9a7d\u9495\u8bfa\u50a9\u759f\u6b27\u9e25\u6bb4\u5455\u6ca4\u8bb4\u6004\u74ef\u76d8\u8e52\u5e9e\u629b\u75b1\u8d54\u8f94\u55b7\u9e4f\u7eb0\u7f74\u94cd\u9a97\u8c1d\u9a88\u98d8\u7f25\u9891\u8d2b\u5ad4\u82f9\u51ed\u8bc4\u6cfc\u9887\u948b\u6251\u94fa\u6734\u8c31\u9564\u9568\u6816\u8110\u9f50\u9a91\u5c82\u542f\u6c14\u5f03\u8bab\u8572\u9a90\u7eee\u6864\u789b\u9880\u9883\u9ccd\u7275\u948e\u94c5\u8fc1\u7b7e\u8c26\u94b1\u94b3\u6f5c\u6d45\u8c34\u5811\u4f65\u8368\u60ad\u9a9e\u7f31\u6920\u94a4\u67aa\u545b\u5899\u8537\u5f3a\u62a2\u5af1\u6a2f\u6217\u709d\u9516\u9535\u956a\u7f9f\u8dc4\u9539\u6865\u4e54\u4fa8\u7fd8\u7a8d\u8bee\u8c2f\u835e\u7f32\u7857\u8df7\u7a83\u60ec\u9532\u7ba7\u94a6\u4eb2\u5bdd\u9513\u8f7b\u6c22\u503e\u9877\u8bf7\u5e86\u63ff\u9cad\u743c\u7a77\u8315\u86f1\u5def\u8d47\u866e\u9cc5\u8d8b\u533a\u8eaf\u9a71\u9f8b\u8bce\u5c96\u9612\u89d1\u9e32\u98a7\u6743\u529d\u8be0\u7efb\u8f81\u94e8\u5374\u9e4a\u786e\u9615\u9619\u60ab\u8ba9\u9976\u6270\u7ed5\u835b\u5a06\u6861\u70ed\u97e7\u8ba4\u7eab\u996a\u8f6b\u8363\u7ed2\u5d58\u877e\u7f1b\u94f7\u98a6\u8f6f\u9510\u86ac\u95f0\u6da6\u6d12\u8428\u98d2\u9cc3\u8d5b\u4f1e\u6bf5\u7cc1\u4e27\u9a9a\u626b\u7f2b\u6da9\u556c\u94ef\u7a51\u6740\u5239\u7eb1\u94e9\u9ca8\u7b5b\u6652\u917e\u5220\u95ea\u9655\u8d61\u7f2e\u8baa\u59d7\u9a9f\u9490\u9cdd\u5892\u4f24\u8d4f\u57a7\u6b87\u89de\u70e7\u7ecd\u8d4a\u6444\u6151\u8bbe\u538d\u6ee0\u7572\u7ec5\u5ba1\u5a76\u80be\u6e17\u8bdc\u8c02\u6e16\u58f0\u7ef3\u80dc\u5e08\u72ee\u6e7f\u8bd7\u65f6\u8680\u5b9e\u8bc6\u9a76\u52bf\u9002\u91ca\u9970\u89c6\u8bd5\u8c25\u57d8\u83b3\u5f11\u8f7c\u8d33\u94c8\u9ca5\u5bff\u517d\u7ef6\u67a2\u8f93\u4e66\u8d4e\u5c5e\u672f\u6811\u7ad6\u6570\u6445\u7ebe\u5e05\u95e9\u53cc\u8c01\u7a0e\u987a\u8bf4\u7855\u70c1\u94c4\u4e1d\u9972\u53ae\u9a77\u7f0c\u9536\u9e36\u8038\u6002\u9882\u8bbc\u8bf5\u64de\u85ae\u998a\u98d5\u953c\u82cf\u8bc9\u8083\u8c21\u7a23\u867d\u968f\u7ee5\u5c81\u8c07\u5b59\u635f\u7b0b\u836a\u72f2\u7f29\u7410\u9501\u5522\u7743\u736d\u631e\u95fc\u94ca\u9cce\u53f0\u6001\u949b\u9c90\u644a\u8d2a\u762b\u6ee9\u575b\u8c2d\u8c08\u53f9\u6619\u94bd\u952c\u9878\u6c64\u70eb\u50a5\u9967\u94f4\u9557\u6d9b\u7ee6\u8ba8\u97ec\u94fd\u817e\u8a8a\u9511\u9898\u4f53\u5c49\u7f07\u9e48\u9617\u6761\u7c9c\u9f86\u9ca6\u8d34\u94c1\u5385\u542c\u70c3\u94dc\u7edf\u6078\u5934\u94ad\u79c3\u56fe\u948d\u56e2\u629f\u9893\u8715\u9968\u8131\u9e35\u9a6e\u9a7c\u692d\u7ba8\u9f0d\u889c\u5a32\u817d\u5f2f\u6e7e\u987d\u4e07\u7ea8\u7efe\u7f51\u8f8b\u97e6\u8fdd\u56f4\u4e3a\u6f4d\u7ef4\u82c7\u4f1f\u4f2a\u7eac\u8c13\u536b\u8bff\u5e0f\u95f1\u6ca9\u6da0\u73ae\u97ea\u709c\u9c94\u6e29\u95fb\u7eb9\u7a33\u95ee\u960c\u74ee\u631d\u8717\u6da1\u7a9d\u5367\u83b4\u9f8c\u545c\u94a8\u4e4c\u8bec\u65e0\u829c\u5434\u575e\u96fe\u52a1\u8bef\u90ac\u5e91\u6003\u59a9\u9a9b\u9e49\u9e5c\u9521\u727a\u88ad\u4e60\u94e3\u620f\u7ec6\u9969\u960b\u73ba\u89cb\u867e\u8f96\u5ce1\u4fa0\u72ed\u53a6\u5413\u7856\u9c9c\u7ea4\u8d24\u8854\u95f2\u663e\u9669\u73b0\u732e\u53bf\u9985\u7fa1\u5baa\u7ebf\u82cb\u83b6\u85d3\u5c98\u7303\u5a34\u9e47\u75eb\u869d\u7c7c\u8df9\u53a2\u9576\u4e61\u8be6\u54cd\u9879\u8297\u9977\u9aa7\u7f03\u98e8\u8427\u56a3\u9500\u6653\u5578\u54d3\u6f47\u9a81\u7ee1\u67ad\u7bab\u534f\u631f\u643a\u80c1\u8c10\u5199\u6cfb\u8c22\u4eb5\u64b7\u7ec1\u7f2c\u950c\u8845\u5174\u9649\u8365\u51f6\u6c79\u9508\u7ee3\u9990\u9e3a\u865a\u5618\u987b\u8bb8\u53d9\u7eea\u7eed\u8be9\u987c\u8f69\u60ac\u9009\u7663\u7eda\u8c16\u94c9\u955f\u5b66\u8c11\u6cf6\u9cd5\u52cb\u8be2\u5bfb\u9a6f\u8bad\u8baf\u900a\u57d9\u6d54\u9c9f\u538b\u9e26\u9e2d\u54d1\u4e9a\u8bb6\u57ad\u5a05\u6860\u6c29\u9609\u70df\u76d0\u4e25\u5ca9\u989c\u960e\u8273\u538c\u781a\u5f66\u8c1a\u9a8c\u53a3\u8d5d\u4fe8\u5156\u8c33\u6079\u95eb\u917d\u9b47\u990d\u9f39\u9e2f\u6768\u626c\u75a1\u9633\u75d2\u517b\u6837\u7080\u7476\u6447\u5c27\u9065\u7a91\u8c23\u836f\u8f7a\u9e5e\u9cd0\u7237\u9875\u4e1a\u53f6\u9765\u8c12\u90ba\u6654\u70e8\u533b\u94f1\u9890\u9057\u4eea\u8681\u827a\u4ebf\u5fc6\u4e49\u8be3\u8bae\u8c0a\u8bd1\u5f02\u7ece\u8bd2\u5453\u5cc4\u9974\u603f\u9a7f\u7f22\u8f76\u8d3b\u9487\u9552\u9571\u7617\u8223\u836b\u9634\u94f6\u996e\u9690\u94df\u763e\u6a31\u5a74\u9e70\u5e94\u7f28\u83b9\u8424\u8425\u8367\u8747\u8d62\u9896\u8314\u83ba\u8426\u84e5\u6484\u5624\u6ee2\u6f46\u748e\u9e66\u763f\u988f\u7f42\u54df\u62e5\u4f63\u75c8\u8e0a\u548f\u955b\u4f18\u5fe7\u90ae\u94c0\u72b9\u8bf1\u83b8\u94d5\u9c7f\u8206\u9c7c\u6e14\u5a31\u4e0e\u5c7f\u8bed\u72f1\u8a89\u9884\u9a6d\u4f1b\u4fe3\u8c00\u8c15\u84e3\u5d5b\u996b\u9608\u59aa\u7ea1\u89ce\u6b24\u94b0\u9e46\u9e6c\u9f89\u9e33\u6e0a\u8f95\u56ed\u5458\u5706\u7f18\u8fdc\u6a7c\u9e22\u9f0b\u7ea6\u8dc3\u94a5\u7ca4\u60a6\u9605\u94ba\u90e7\u5300\u9668\u8fd0\u8574\u915d\u6655\u97f5\u90d3\u82b8\u607d\u6120\u7ead\u97eb\u6b92\u6c32\u6742\u707e\u8f7d\u6512\u6682\u8d5e\u74d2\u8db1\u933e\u8d43\u810f\u9a75\u51ff\u67a3\u8d23\u62e9\u5219\u6cfd\u8d5c\u5567\u5e3b\u7ba6\u8d3c\u8c2e\u8d60\u7efc\u7f2f\u8f67\u94e1\u95f8\u6805\u8bc8\u658b\u503a\u6be1\u76cf\u65a9\u8f97\u5d2d\u6808\u6218\u7efd\u8c35\u5f20\u6da8\u5e10\u8d26\u80c0\u8d75\u8bcf\u948a\u86f0\u8f99\u9517\u8fd9\u8c2a\u8f84\u9e67\u8d1e\u9488\u4fa6\u8bca\u9547\u9635\u6d48\u7f1c\u6862\u8f78\u8d48\u796f\u9e29\u6323\u7741\u72f0\u4e89\u5e27\u75c7\u90d1\u8bc1\u8be4\u5ce5\u94b2\u94ee\u7b5d\u7ec7\u804c\u6267\u7eb8\u631a\u63b7\u5e1c\u8d28\u6ede\u9a98\u6809\u6800\u8f75\u8f7e\u8d3d\u9e37\u86f3\u7d77\u8e2c\u8e2f\u89ef\u949f\u7ec8\u79cd\u80bf\u4f17\u953a\u8bcc\u8f74\u76b1\u663c\u9aa4\u7ea3\u7ec9\u732a\u8bf8\u8bdb\u70db\u77a9\u5631\u8d2e\u94f8\u9a7b\u4f2b\u69e0\u94e2\u4e13\u7816\u8f6c\u8d5a\u556d\u9994\u989e\u6869\u5e84\u88c5\u5986\u58ee\u72b6\u9525\u8d58\u5760\u7f00\u9a93\u7f12\u8c06\u51c6\u7740\u6d4a\u8bfc\u956f\u5179\u8d44\u6e0d\u8c18\u7f01\u8f8e\u8d40\u7726\u9531\u9f87\u9cbb\u8e2a\u603b\u7eb5\u506c\u90b9\u8bf9\u9a7a\u9cb0\u8bc5\u7ec4\u955e\u94bb\u7f35\u8e9c\u9cdf\u7ff1\u5e76\u535c\u6c89\u4e11\u6dc0\u8fed\u6597\u8303\u5e72\u768b\u7845\u67dc\u540e\u4f19\u79f8\u6770\u8bc0\u5938\u91cc\u51cc\u4e48\u9709\u637b\u51c4\u6266\u5723\u5c38\u62ac\u6d82\u6d3c\u5582\u6c61\u9528\u54b8\u874e\u5f5d\u6d8c\u6e38\u5401\u5fa1\u613f\u5cb3\u4e91\u7076\u624e\u672d\u7b51\u4e8e\u5fd7\u6ce8\u51cb\u8ba0\u8c2b\u90c4\u52d0\u51fc\u5742\u5785\u57b4\u57ef\u57dd\u82d8\u836c\u836e\u839c\u83bc\u83f0\u85c1\u63f8\u5412\u5423\u5494\u549d\u54b4\u5658\u5288\u56af\u5e5e\u5c99\u5d74\u5f77\u5fbc\u72b8\u72cd\u9980\u9987\u9993\u9995\u6123\u61b7\u61d4\u4e2c\u6e86\u6edf\u6df7\u6f24\u6f74\u6fb9\u752f\u7e9f\u7ed4\u7ef1\u73c9\u67a7\u684a\u6849\u69d4\u6a65\u8f71\u8f77\u8d4d\u80b7\u80e8\u98da\u7173\u7145\u7198\u610d\u6dfc\u781c\u78d9\u770d\u949a\u94b7\u94d8\u94de\u9503\u950d\u950e\u950f\u9518\u951d\u952a\u952b\u953f\u9545\u954e\u9562\u9565\u9569\u9572\u7a06\u9e4b\u9e5b\u9e71\u75ac\u75b4\u75d6\u766f\u88e5\u8941\u8022\u98a5\u87a8\u9eb4\u9c85\u9c86\u9c87\u9c9e\u9cb4\u9cba\u9cbc\u9cca\u9ccb\u9cd8\u9cd9\u9792\u97b4\u9f44\u836f\u6b32\u91cc\u59d0\u5360\u5f81\u54df\u731b\u70ae\u53d1\u6de1\u6076\u5978\u5e72\u677e\u4f84\u5570\";\nfunction traditionalToSimplified(str) {\n let result = str;\n for (let idx = 0; idx < i.length; idx++) {\n if (i[idx] && z[idx]) {\n result = result.replace(new RegExp(i[idx], 'g'), z[idx]);\n }\n }\n return result;\n}","bookSourceGroup":"\u6f2b\u753b,\ud83c\udf38\u6f2b\u753b","bookSourceName":"\ud83c\udf38\u8089\u6f2b\u5c4b( \u97e9\u6f2b+ )","bookSourceType":2,"bookSourceUrl":"https:\/\/roum26.xyz","customOrder":449,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"\u70ed\u95e8::https:\/\/roum26.xyz\/home\n\u8fde\u8f7d::https:\/\/roum26.xyz\/books?continued=true&page={{page}}\n\u5b8c\u7ed3::https:\/\/roum26.xyz\/books?continued=false&page={{page}}","lastUpdateTime":"1767328594854","respondTime":180000,"ruleBookInfo":{"author":"\/\/div[@class='basis-3\/5 text-sm sm:text-base']\/div[3]\/\/span\/text()","coverUrl":"\/\/div[@class='basis-2\/5']\/img\/@src","intro":"\/\/div[@class='my-2 text-foreground text-sm sm:text-base']\/p@js:\neval(String(source.bookSourceComment));\nvar toS = traditionalToSimplified(result)\ntoS","kind":"@js:\neval(String(source.bookSourceComment));\n\nvar status = java.getString(\"\/\/div[@class='basis-3\/5 text-sm sm:text-base']\/div[4]\/\/span\/text()\")\nvar tags = java.getString(\"\/\/div[@class='basis-3\/5 text-sm sm:text-base']\/div[6]\/\/span\/text()\")\nvar views = java.getString(\"\/\/div[@class='basis-3\/5 text-sm sm:text-base']\/div[7]\/div[1]\/div[2]\/text()\")\nvar collections= java.getString(\"\/\/div[@class='basis-3\/5 text-sm sm:text-base']\/div[7]\/div[2]\/div[2]\/text()\")\nvar types =\"\u6d4f\u89c8:\"+ views+\",\u6536\u85cf:\"+collections+\",\"+status+\",\"+tags\nvar toS = traditionalToSimplified(types)\ntoS ","name":"\/\/div[@class='text-xl text-foreground']\/text()@js:\neval(String(source.bookSourceComment));\nvar title = traditionalToSimplified(result)\ntitle"},"ruleContent":{"content":"\/\/script\/text()@js:\nvar urlReg = \/\\\\\"imageUrl\\\\\":\\\\\"(.+?)\\\\\"\/g;\nvar pureUrlList = [];\nvar match;\nwhile ((match = urlReg.exec(result)) !== null) {\n    var imgUrl = match[1];\n    imgUrl = imgUrl.replace(\/\\\\\/g, '');\n    if (pureUrlList.indexOf(imgUrl) === -1) {\n        pureUrlList.push(imgUrl);\n    }\n}\npureUrlList.map(x => '<img src=\"' + x + '\">').join(\"\\n\");","imageDecode":"(function() {\n    if (src.indexOf(\"sr:1\") == -1) {\n        return result; \n    }\n    try {\n        var Magua = new JavaImporter();\n        Magua.importPackage(Packages.java.io, Packages.android.graphics);\n        with(Magua) {\n            \/\/ 1. \u68c0\u67e5\u6b63\u5219\u5339\u914d\u662f\u5426\u6210\u529f\n            var match = src.match(\/sr:.*?\\\/(.*?)\\..*\/);\n            if (!match) {\n                return result;\n            }\n\n            \/\/ 2. \u68c0\u67e5 MD5 \u8ba1\u7b97\u903b\u8f91\n            var b64Data = match[1];\n            var decodedPath = java.base64Decode(b64Data);\n            var md5Str = java.md5Encode(decodedPath);\n            var lastTwo = md5Str.substring(md5Str.length() - 2);\n          \n            var num = (parseInt(lastTwo, 16) % 10) + 5;\n\n            \/\/ 3. \u5f00\u59cb\u7ed8\u56fe (\u6d4b\u8bd5\u662f\u5426\u80fd\u6b63\u5e38\u89e3\u7801\u56fe\u7247)\n            var img = BitmapFactory.decodeByteArray(result, 0, result.length);\n            if (!img) return result;\n\n            var h = img.getHeight();\n            var w = img.getWidth();\n            var y = Math.floor(h \/ num);\n            var rem = h % num;\n\n            var newImg = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565);\n            var canvas = new Canvas(newImg);\n            var paint = new Paint();\n\n            for (var i = 1; i <= num; i++) {\n                var currentSliceH = (i === num) ? (y + rem) : y;\n                var srcY = y * (i - 1);\n                \n                \/\/ \u5012\u5e8f\u903b\u8f91\uff1a\u7b2c\u4e00\u5757\u753b\u5230\u6700\u4e0b\u9762\uff0c\u6700\u540e\u4e00\u5757\u753b\u5230\u6700\u4e0a\u9762\n                var dstY = h - srcY - currentSliceH;\n\n                var srcRect = new Rect(0, srcY, w, srcY + currentSliceH);\n                var dstRect = new Rect(0, dstY, w, dstY + currentSliceH);\n                canvas.drawBitmap(img, srcRect, dstRect, paint);\n            }\n\n            var baos = new ByteArrayOutputStream();\n            newImg.compress(Bitmap.CompressFormat.JPEG, 90, baos);\n            var finalRes = baos.toByteArray();\n\n            img.recycle();\n            newImg.recycle();\n            return finalRes;\n        }\n    } catch (e) {\n        return result;\n    }\n})();","imageStyle":"FULL"},"ruleExplore":{"bookList":"\/\/div[@class='grid grid-cols-1 sm:grid-cols-4 md:grid-cols-6 gap-2 sm:gap-4']\/div","bookUrl":"\/\/a\/@href","coverUrl":"\/\/div[contains(@class,'bg-cover')]\/@style@js:\nvar imgSrc = result.match(\/https:\\\/\\\/.*?\\.(?:jpg|jpeg|png|webp|gif|bmp|svg|tiff)\/g)[0]\nimgSrc","kind":"@js:\nvar views = java.getString(\"\/\/div[@class='px-2 py-2']\/div[@class='flex justify-between items-center']\/div[1]\/\/text()\")\nvar collections= java.getString(\"\/\/div[@class='px-2 py-2']\/div[@class='flex justify-between items-center']\/div[2]\/\/text()\")\n\"\u6d4f\u89c8:\"+views+\",\u6536\u85cf:\"+collections","lastChapter":"\/\/div[@class='px-2 py-2']\/div[@class='text-muted-foreground text-sm']\/text()@js:\nresult.split(\"\\n\").join(\"\")","name":"\/\/div[@class='px-2 py-2']\/div[contains(@class,'truncate')]\/text()@js:\neval(String(source.bookSourceComment));\nvar toS = traditionalToSimplified(result)\ntoS"},"ruleSearch":{"bookList":"\/\/div[@class='grid grid-cols-2 sm:grid-cols-4 md:grid-cols-6 gap-3 sm:gap-4 my-6']\/div","bookUrl":"\/\/a\/@href","checkKeyWord":"\u8272\u8f6e\u773c","coverUrl":"\/\/div[contains(@class,'bg-cover')]\/@style@js:\nvar imgSrc = result.match(\/https:\\\/\\\/.*?\\.(?:jpg|jpeg|png|webp|gif|bmp|svg|tiff)\/g)[0]\nimgSrc","intro":"\/\/div[@class='px-2 py-2']\/\/div[@class='flex items-center space-x-1 justify-end']\/div[2]\/text()@js:\nvar timeList = result.split(\"\/\").reverse();\ntimeList.join(\"\/\")","name":"\/\/div[@class='px-2 py-2']\/div[contains(@class,'truncate')]\/text()@js:\neval(String(source.bookSourceComment));\nvar toS = traditionalToSimplified(result)\ntoS"},"ruleToc":{"chapterList":"\/\/div[@class='grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-2 px-2 py-4']\/a[starts-with(@href,'\/books')]","chapterName":"\/\/a\/div\/text()@js:\neval(String(source.bookSourceComment));\nvar toS = traditionalToSimplified(result)\ntoS","chapterUrl":"\/\/a\/@href"},"searchUrl":"https:\/\/roum26.xyz\/search?term={{key}}","weight":0},{"bookSourceComment":"\u66f4\u65b0\u65e5\u5fd7\u8bf7\u70b9\u51fb\u767b\u5f55\uff0c\u66f4\u65b0\u4e66\u6e90\u4e2d\u67e5\u770b\n\n\u517c\u5bb9\u6b63\u5f0f\u7248\u9605\u8bfbapp","bookSourceGroup":"\u5927\u7070\u72fc\u805a\u5408","bookSourceName":"\u4e07\u80fd\u7cbe\u54c1\u6e90","bookSourceType":0,"bookSourceUrl":"\u7cbe\u54c1\u6e90","bookUrlPattern":"https?:\\\/\\\/(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z0-9-]+(?::\\d+)?\\\/detail.*","customButton":false,"customOrder":1,"enabled":true,"enabledCookieJar":false,"enabledExplore":true,"eventListener":false,"exploreUrl":"<js>\nfunction setArgument(key, value) {\n    var open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '') || {};\n    open_argument[key] = value;\n    var result = JSON.stringify(open_argument);\n    source.setVariable(result);\n    return result;\n}\n\nvar open_argument = source.getVariable();\nvar base_url = getArguments(open_argument, 'server') || '';\nvar ms = getArguments(open_argument, 'tone_id') || '';\nvar source_type = getArguments(open_argument, 'source_type') || '\u7537\u9891';\nvar tab = getArguments(open_argument, 'media') || '\u5c0f\u8bf4';\nvar sources = getArguments(open_argument, 'source') || '\u756a\u8304';\n\n\nvar sdtoken;\ntry {\n    var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n    sdtoken = String(loginInfoMap['\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)'] || '');\n} catch (e) {\n    sdtoken = '';\n}\n\nvar rawCookie = getFanqieCookie() || sdtoken;\nvar match = rawCookie.match(\/sessionid=[^;]+\/);\nvar fqcookie = match ? match[0] : '';\nvar fqssionid = '';\nif (!fqcookie) {\n    java.toast('\u60a8\u8fd8\u672a\u767b\u9646\u756a\u8304\u8d26\u53f7\uff0c\u65e0\u6cd5\u540c\u6b65\u6570\u636e\u54e6\uff01');\n} else {\n    fqssionid = getSessionId(fqcookie)\n}\nvar fqsjurl = base_url + \"\/bookshelf?page={{page}}&ssionid=\" + fqssionid;\nvar fqtjurl = base_url + \"\/fqrecommend?page={{page}}&ssionid=\" + fqssionid;\nvar fqlsurl = base_url + \"\/fqhistory?page={{page}}&ssionid=\" + fqssionid;\n\nvar groupDatas = [];\nvar infoData = [];\n\nfunction deviceType() {\n    try {\n        return !!java.androidId();\n    } catch (e) {\n        return false;\n    }\n}\n\nvar hasValidCookie = fqcookie.length > 0;\n\nif (hasValidCookie) {\n    function groupQuery() {\n        try {\n            var url = base_url + \"\/group_name?ssionid=\" + fqssionid;\n            var res = java.ajax(url);\n            var response = JSON.parse(res);\n\n            if (!(response && response.data)) {}\n\n            response.data.forEach(function(group) {\n                var keys = Object.keys(group);\n                if (keys.length > 0) {\n                    var key = keys[0];\n                    var value = group[key];\n                    if (value && value.length) {\n                        var option = {\n                            \"method\": \"POST\",\n                            \"body\": {\n                                \"book_ids\": value,\n                                \"page\": \"{{page}}\"\n                            }\n                        };\n                        groupDatas.push({\n                            title: key,\n                            url: base_url + \"\/bookshelf,\" + JSON.stringify(option),\n                            style: {\n                                layout_flexGrow: 1,\n                                layout_flexBasisPercent: 0.45\n                            }\n                        });\n                    }\n                }\n            });\n\n            if (groupDatas.length % 2 !== 0) {\n                groupDatas.push({\n                    title: \"--\",\n                    url: \"\",\n                    style: {\n                        layout_flexGrow: 1,\n                        layout_flexBasisPercent: 0.45\n                    }\n                });\n            }\n        } catch (e) {\n            java.longToast(\"\u756a\u8304\u767b\u5f55\u8fc7\u671f\uff0c\u5df2\u9690\u85cf\u756a\u8304\u4e66\u67b6\");\n        }\n    }\n\n    try {\n        java.longToast(\"\u6b63\u5728\u52a0\u8f7d\u5206\u7ec4\u6570\u636e...\");\n        var userUrl = base_url + \"\/fquser?ssionid=\" + fqssionid;\n        var userRes = java.ajax(userUrl);\n        var userData = JSON.parse(userRes);\n\n        var userName = (userData && userData.data && userData.data.name) ? userData.data.name : '\u672a\u77e5\u7528\u6237';\n        if (!userName.includes('\u672a\u77e5\u7528\u6237')) {\n            infoData = [{\n                title: \"\u756a\u8304\u4e2a\u4eba\u4e2d\u5fc3\",\n                url: fqsjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }, {\n                title: \"\u4e2a\u6027\u63a8\u8350(\u756a\u8304)\",\n                url: fqtjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }, {\n                title: \"\u5386\u53f2\u9605\u8bfb(\u756a\u8304)\",\n                url: fqlsurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }];\n        }\n        groupQuery();\n    } catch (e) {\n        java.longToast(\"\u756a\u8304\u767b\u5f55\u8fc7\u671f\uff0c\u5df2\u9690\u85cf\u756a\u8304\u4e66\u67b6\");\n    }\n}\n\nvar style_list = [];\ntry {\n    var durl = `${base_url}\/discovestyle?source=${sources}&source_type=${source_type}&tab=${tab}`;\n    var res = java.ajax(durl);\n    var result = JSON.parse(res);\n    style_list = result.data || [];\n    if (result.msg) {\n        java.toast(result.msg);\n    }\n} catch (e) {\n    java.toast(\"\u53d1\u73b0\u6837\u5f0f\u83b7\u53d6\u5931\u8d25\");\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet qtop = {\n    method: \"GET\",\n    headers: {\n        cookie: qtcookie\n    },\n};\nqtop = JSON.stringify(qtop);\nlet qtsjurl = base_url+'\/get_book_shelf,'+qtop\nlet qtsj = [{\n                title: \"\u5927\u7070\u72fc\u4e2a\u4eba\u4e2d\u5fc3\",\n                url: qtsjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }]\nvar finalData = infoData.concat(groupDatas, style_list);\nfinalData = qtsj.concat(finalData);\nJSON.stringify(finalData);\n<\/js>","header":"{ \"User-Agent\":\"Mozilla\/5.0 (Linux; Android 6.0; Nexus 5 Build\/MRA58N) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Mobile Safari\/537.36 Edg\/138.0.0.0\" }","jsLib":"var host = [\n    'https:\/\/api.langge.cf',\n    'http:\/\/219.154.201.122:5006'\n];\n\nfunction getArguments(open_argument, key) {\n    try {\n        open_argument = JSON.parse(open_argument);\n    } catch (e) {\n        open_argument = {\n            media: \"\u5c0f\u8bf4\",\n            tone_id: \"\u9ed8\u8ba4\u97f3\u8272\",\n            server: host[0],\n            source: \"\u5168\u90e8\",\n            source_type: \"\u7537\u9891\",\n        };\n    }\n    if (key) {\n        return open_argument[key];\n    } else {\n        return open_argument;\n    }\n}\n\nfunction setArguments(key, value) {\n    const {\n        source\n    } = this;\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    open_argument[key] = value;\n    open_argument = JSON.stringify(open_argument);\n    source.setVariable(open_argument);\n    return open_argument;\n}\n\nfunction decrypt(Text) {\n    return Text;\n}\n\nfunction paraForAndroid(content, sources) {\n    let {\n        java,\n        cache,\n        source\n    } = this;\n    let plcolor = getArguments(source.getVariable(), \"plcolor\");\n    if (!plcolor) {\n        plcolor = \"#000000\";\n    }\n\n    const createSvg = this.createSvg.bind(this);\n\n    return content.replace(\/<p>(.*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\\/>)?<\\\/p>\/g,\n        (match, text, url, count) => {\n            if (url && count) {\n                const click = 0;\n                cache.putMemory(url, click);\n                const encodedUrl = url;\n                return `<p>${text}<img src=\"${createSvg(count, plcolor,encodedUrl,sources)}\"><\/p>`;\n            } else {\n                return `<p>${text}<\/p>`;\n            }\n        }\n    );\n}\n\n\nfunction showCmt(url, sources) {\n    let {\n        java,\n        cache\n    } = this;\n\n    const currentTime = Date.now();\n    const click = cache.getFromMemory(url);\n    let isqread = false;\n    try {\n        java.qread();\n        isqread = true;\n    } catch (e) {}\n    if (click < 1 && !isqread) {\n        cache.putMemory(url, click + 1);\n        return;\n    } else {\n        try {\n            java.startBrowserDp(url, sources + '\u6bb5\u8bc4');\n        } catch (e) {\n            java.startBrowser(url, sources + '\u6bb5\u8bc4');\n        }\n    }\n}\n\n\n\nfunction createSvg(number, color, encodedUrl, sources) {\n    var displayText = number > 99 ? \"99+\" : number.toString();\n    var loginInfoMap = {};\n\n    if (this.source && typeof this.source.getLoginInfoMap == 'function') {\n        loginInfoMap = this.source.getLoginInfoMap() || {};\n    }\n\n    var bubbleStyle = String(loginInfoMap['\u6bb5\u8bc4\u6c14\u6ce1\u6837\u5f0f(0-4)'] || '0');\n    var svg;\n\n    \/\/ \u6837\u5f0f1\uff1a\u7cbe\u81f4\u5706\u5f62 - \u7b80\u6d01\u4f18\u96c5\n    if (bubbleStyle == '1') {\n        svg = '<svg width=\"1000\" height=\"1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">' +\n            '<circle cx=\"500\" cy=\"500\" r=\"440\" fill=\"none\" stroke=\"' + color + '\" stroke-width=\"32\" opacity=\"0.2\"\/>' +\n            '<circle cx=\"500\" cy=\"500\" r=\"440\" fill=\"none\" stroke=\"' + color + '\" stroke-width=\"4\"\/>' +\n            '<text x=\"500\" y=\"500\" font-family=\"-apple-system, sans-serif\" text-anchor=\"middle\" ' +\n            'font-size=\"400\" fill=\"' + color + '\" dy=\"0.35em\" font-weight=\"500\">' + displayText + '<\/text>' +\n            '<\/svg>';\n    }\n    \/\/ \u6837\u5f0f2\uff1a\u5fae\u4fe1\u98ce\u683c - \u719f\u6089\u4eb2\u5207\u7684\u5bf9\u8bdd\u6c14\u6ce1\n    else if (bubbleStyle == '2') {\n        svg = '<svg width=\"1000\" height=\"900\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">' +\n            '<path d=\"M120,120 L880,120 Q920,120 920,160 L920,680 Q920,720 880,720 L280,720 L120,840 L120,720 Q80,720 80,680 L80,160 Q80,120 120,120 Z\" ' +\n            'fill=\"none\" stroke=\"' + color + '\" stroke-width=\"24\" stroke-linejoin=\"round\"\/>' +\n            '<text x=\"500\" y=\"440\" font-family=\"-apple-system, sans-serif\" text-anchor=\"middle\" ' +\n            'font-size=\"360\" fill=\"' + color + '\" dy=\"0.32em\" font-weight=\"500\">' + displayText + '<\/text>' +\n            '<\/svg>';\n    }\n    \/\/ \u6837\u5f0f3\uff1a\u60ac\u6d6e\u6807\u7b7e - \u6241\u5e73\u73b0\u4ee3\u98ce\u683c\n    else if (bubbleStyle == '3') {\n        svg = '<svg width=\"1000\" height=\"600\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">' +\n            '<rect x=\"80\" y=\"80\" width=\"840\" height=\"440\" rx=\"220\" ry=\"220\" ' +\n            'fill=\"none\" stroke=\"' + color + '\" stroke-width=\"6\"\/>' +\n            '<rect x=\"100\" y=\"100\" width=\"800\" height=\"400\" rx=\"200\" ry=\"200\" ' +\n            'fill=\"none\" stroke=\"' + color + '\" stroke-width=\"20\" opacity=\"0.3\"\/>' +\n            '<text x=\"500\" y=\"310\" font-family=\"-apple-system, sans-serif\" text-anchor=\"middle\" ' +\n            'font-size=\"280\" fill=\"' + color + '\" dy=\"0.32em\" font-weight=\"500\" letter-spacing=\"8\">' + displayText + '<\/text>' +\n            '<\/svg>';\n    }\n    \/\/ \u6837\u5f0f4\uff1a\u4e66\u7b7e\u6807\u6ce8 - \u7b26\u5408\u9605\u8bfb\u573a\u666f\n    else if (bubbleStyle == '4') {\n        svg = '<svg width=\"900\" height=\"1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">' +\n            '<path d=\"M150,80 L750,80 Q800,80 800,130 L800,870 Q800,920 750,920 L480,920 L450,980 L420,920 L150,920 Q100,920 100,870 L100,130 Q100,80 150,80 Z\" ' +\n            'fill=\"none\" stroke=\"' + color + '\" stroke-width=\"24\" stroke-linejoin=\"round\"\/>' +\n            '<line x1=\"150\" y1=\"280\" x2=\"750\" y2=\"280\" stroke=\"' + color + '\" stroke-width=\"3\" opacity=\"0.3\"\/>' +\n            '<text x=\"450\" y=\"520\" font-family=\"Georgia, serif\" text-anchor=\"middle\" ' +\n            'font-size=\"360\" fill=\"' + color + '\" dy=\"0.32em\" font-weight=\"400\">' + displayText + '<\/text>' +\n            '<text x=\"450\" y=\"800\" font-family=\"-apple-system, sans-serif\" text-anchor=\"middle\" ' +\n            'font-size=\"70\" fill=\"' + color + '\" opacity=\"0.6\" letter-spacing=\"3\">\u8bc4\u8bba<\/text>' +\n            '<\/svg>';\n    }\n    \/\/ \u9ed8\u8ba4\u8fd4\u56de\u6837\u5f0f0\n    else {\n        svg = '<svg width=\"160\" height=\"120\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">' +\n            '<path d=\"M 55 10 ' +\n            'L 120 10 ' +\n            'Q 150 10 150 40 ' +\n            'L 150 80 ' +\n            'Q 150 110 120 110 ' +\n            'L 55 110 ' +\n            'Q 25 110 25 80 ' +\n            'L 25 75 ' +\n            'L 3 60 ' +\n            'L 25 45 ' +\n            'L 25 40 ' +\n            'Q 25 10 55 10 Z\" ' +\n            'fill=\"none\" ' +\n            'stroke=\"' + color + '\" ' +\n            'stroke-width=\"2\" ' +\n            'stroke-linejoin=\"round\"\/>' +\n            '<!-- \u6570\u5b57\u6587\u672c -->' +\n            '<text x=\"87\" y=\"75\" ' +\n            'font-family=\"Arial, sans-serif\" ' +\n            'text-anchor=\"middle\" ' +\n            'dominant-baseline=\"middle\" ' +\n            'font-size=\"50\" ' +\n            'font-weight=\"bold\" ' +\n            'fill=\"' + color + '\">' +\n            displayText +\n            '<\/text>' +\n            '<!-- \u63d0\u793a\u6587\u672c -->' +\n            '<text x=\"87\" y=\"95\" ' +\n            'font-family=\"Arial, sans-serif\" ' +\n            'text-anchor=\"middle\" ' +\n            'dominant-baseline=\"middle\" ' +\n            'font-size=\"9\" ' +\n            'fill=\"' + color + '\" ' +\n            'opacity=\"0.7\">' +\n            '\u5237\u65b0\u67e5\u770b' +\n            '<\/text>' +\n            '<\/svg>';\n    }\n\n    var encodedSvg = this.java.base64Encode(svg);\n    return 'data:image\/svg+xml;base64,' + encodedSvg + ',{\"js\":\"showCmt(\\'' + encodedUrl + '\\', \\'' + sources + '\\')\",\"style\":\"text\"}';\n}\n\n\n\nfunction cleanHTML(html) {\n    let result = html\n        .replace(\/<header[^>]*>[\\s\\S]*?<\\\/header>\/gi, \"\")\n        .replace(\/<div class=\"tt-title\"[^>]*>[\\s\\S]*?<\\\/div>\/gi, \"\")\n        .replace(\/<(?!\\\/?p\\b|\\\/?img\\b)[^>]+>\/gi, \"\");\n    result = result.replace(\/<\\\/?p[^>]*>\/g, \"\\n\");\n    return result.replace(\/\\n+\/g, \"\\n\").trim();\n}\n\n\nfunction getBaseUrl(url) {\n    if (!url) {\n        return null;\n    }\n    url = String(url);\n    if (url.match(\/https?:\\\/\\\/\/i)) {\n        var index = url.indexOf(\"\/\", 9);\n        return index == -1 ? url : url.substring(0, index);\n    }\n    return null;\n}\n\nfunction isIPv4Address(ip) {\n    ip = String(ip);\n    let parts = ip.split(\".\");\n    if (parts.length !== 4) return false;\n\n    for (let part of parts) {\n        if (!\/^\\d+$\/.test(part)) return false; \/\/ \u5fc5\u987b\u662f\u6570\u5b57\n        if (part.length > 1 && part[0] === \"0\") return false; \/\/ \u7981\u6b62\u524d\u5bfc\u96f6\n        let num = parseInt(part, 10);\n        if (num < 0 || num > 255) return false; \/\/ \u8303\u56f4\u68c0\u67e5\n    }\n    return true;\n}\n\nfunction isIPv6Address(ip) {\n    ip = String(ip);\n    \/\/ \u5904\u7406\u53cc\u5192\u53f7\uff08\u6700\u591a\u51fa\u73b0\u4e00\u6b21\uff09\n    if (ip.includes(\":::\")) return false;\n    let doubleColonCount = (ip.match(\/::\/g) || []).length;\n    if (doubleColonCount > 1) return false;\n\n    \/\/ \u5206\u5272\u6210\u7ec4\n    let groups = ip.split(\":\");\n    let validGroupCount = 8;\n    let actualGroupCount = groups.filter((g) => g !== \"\").length;\n\n    \/\/ \u9a8c\u8bc1\u7ec4\u6570\n    if (doubleColonCount === 1) {\n        if (actualGroupCount > validGroupCount - 1) return false;\n    } else {\n        if (groups.length !== validGroupCount) return false;\n    }\n\n    \/\/ \u9a8c\u8bc1\u6bcf\u7ec4\u5185\u5bb9\n    for (let group of groups) {\n        if (group === \"\") continue; \/\/ \u8df3\u8fc7\u7a7a\u7ec4\uff08\u53cc\u5192\u53f7\u90e8\u5206\uff09\n        if (!\/^[0-9a-fA-F]{1,4}$\/.test(group)) return false; \/\/ 1-4\u4f4d\u5341\u516d\u8fdb\u5236\n    }\n    return true;\n}\n\nfunction isIPAddress(input) {\n    return isIPv4Address(input) || isIPv6Address(input);\n}\n\nfunction getSessionId(cookieString) {\n    const match = cookieString.match(\/sessionid=([^;]+)\/);\n    return match ? match[1] : null;\n}\n\nfunction getKey(key) {\n    let parts = key.split(\";\");\n    for (let part of parts) {\n        if (part.includes(\"qttoken\")) {\n            return part.split(\"=\")[1];\n        }\n    }\n    return \"\";\n}\n\nfunction getFanqieCookie() {\n    const {\n        cookie\n    } = this;\n    try {\n        return String(cookie.getCookie('fanqienovel.com') || java.getCookie('fanqienovel.com') || '');\n    } catch (e) {\n        return '';\n    }\n}\n\n\nfunction paraForiOS(html, sources) {\n    return html.replace(\n        \/<p>(.*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\\/>)?<\\\/p>\/g,\n        function(match, text, url, count) {\n            if (url && count) {\n                const encodedUrl = url.replace(\/&\/g, '&amp;');\n                return `<span rs-native>${text}<comment count=\"${count}\" onPress=\"java.showReadingBrowser('${encodedUrl}','${sources}\u6bb5\u8bc4')\"><\/span>`;\n            } else {\n                return `<span rs-native>${text}<\/span>`;\n            }\n        }\n    );\n}","lastUpdateTime":"1767421066613","loginUi":"[{\n        \"name\": \"\u90ae\u7bb1\",\n        \"type\": \"text\"\n    },{\n        \"name\": \"\u5bc6\u7801\",\n        \"type\": \"password\"\n    },\n    {\n        \"name\": \"\u2665\u767b\u5f55\u4e66\u6e90\",\n        \"type\": \"button\",\n        \"action\": \"login(true)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83c\udf45\u756a\u8304\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"fq_login()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83c\udfdd\u7528\u6237\u540e\u53f0\",\n        \"type\": \"button\",\n        \"action\": \"loginqt()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udd10\u6ce8\u518c\u4e66\u6e90\",\n        \"type\": \"button\",\n        \"action\": \"register()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n\n    {\n        \"name\": \" \ud83d\udd1a \u9000\u51fa\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"logout()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udd2e \u68c0\u6d4b\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"checkStatus()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2615\u6253\u8d4f\u4eab\u798f\u5229\",\n        \"type\": \"button\",\n        \"action\": \"vip()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \" \ud83d\uddd1 \u6e05\u9664\u8bbe\u5907\",\n        \"type\": \"button\",\n        \"action\": \"clearDevice()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n\n    }, {\n        \"name\": \"\ud83d\udcd1\u66f4\u5c11\u7b80\u4ecb\",\n        \"type\": \"button\",\n        \"action\": \"set_info()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udcdd\u6bb5\u8bc4\u5f00\u5173\",\n        \"type\": \"button\",\n        \"action\": \"paracomment('fqpara')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udcda \u540c\u6b65\u4e66\u67b6\",\n        \"type\": \"button\",\n        \"action\": \"set_reading()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u264b\ufe0f \u7537\/\u5973\u9891\u9053\",\n        \"type\": \"button\",\n        \"action\": \"set_source_type()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udca2 \u5f3a\u5236\u641c\u7d22\u5168\u90e8\",\n        \"type\": \"button\",\n        \"action\": \"disabledSources()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2747\ufe0f \u66f4\u65b0\u4e66\u6e90\",\n        \"type\": \"button\",\n        \"action\": \"renderVersionPage()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\uddc2\u5f53\u524d\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"get_media()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"\ud83d\udcd6\u5c0f\u8bf4\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u5c0f\u8bf4')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udd0a\u542c\u4e66\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u542c\u4e66')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83c\udfde\u6f2b\u753b\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u6f2b\u753b')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\uddb2\u77ed\u5267\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u77ed\u5267')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83c\udf9a\u5207\u6362\u670d\u52a1\u5668\",\n        \"type\": \"button\",\n        \"action\": \"set_server()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u267b\ufe0f\u68c0\u6d4b\u5f53\u524d\u670d\u52a1\u5668\",\n        \"type\": \"button\",\n        \"action\": \"checkNet()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2695\ufe0f\u672c\u5730\/\u670d\u52a1\u5668 \",\n        \"type\": \"button\",\n        \"action\": \"get_proxy()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udccc\u6c38\u4e45\u53d1\u5e03\u9875\ud83d\udccc\",\n        \"type\": \"button\",\n        \"action\": \"api()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2193\u2193\u4e0b\u65b9\u53ef\u5207\u6362\u6765\u6e90\u7528\u4e8e\u641c\u7d22\/\u53d1\u73b0\u9875\u2193\u2193\",\n        \"type\": \"button\",\n        \"action\": \"get_media()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"\u2728\ufe0f\u7f51\u53cb\u63a8\u8350\",\n        \"type\": \"button\",\n        \"action\": \"set_source('\u63a8\u8350')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udc96\u6211\u6765\u63a8\u8350\",\n        \"type\": \"button\",\n        \"action\": \"put_book()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u5168\u90e8\",\n        \"type\": \"button\",\n        \"action\": \"set_source('\u5168\u90e8')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u756a\u8304')\",\n        'name': '\u756a\u8304',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('69\u4e66\u5427')\",\n        'name': '69\u4e66\u5427',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u4e03\u732b')\",\n        'name': '\u4e03\u732b',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u767e\u5ea6')\",\n        'name': '\u767e\u5ea6',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u8d77\u70b9')\",\n        'name': '\u8d77\u70b9(\u7b2c\u4e09\u65b9)',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5f97\u95f4')\",\n        'name': '\u5f97\u95f4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5854\u8bfb')\",\n        'name': '\u5854\u8bfb',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u4e66\u65d7')\",\n        'name': '\u4e66\u65d7',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('QQ')\",\n        'name': 'QQ',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u732b\u773c')\",\n        'name': '\u732b\u773c',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u641c\u4e66\u795e\u5668')\",\n        'name': '\u641c\u4e66\u795e\u5668',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5f97\u5947')\",\n        'name': '\u5f97\u5947',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u4f2a69')\",\n        'name': '\u4f2a69',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u7231\u4e0b\u7535\u5b50\u4e66')\",\n        'name': '\u7231\u4e0b\u7535\u5b50\u4e66',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5c0f\u7c73')\",\n        'name': '\u5c0f\u7c73',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u661f\u661f\u5c0f\u8bf4')\",\n        'name': '\u661f\u661f\u5c0f\u8bf4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u7b14\u8da3\u960122')\",\n        'name': '\u7b14\u8da3\u960122',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u9876\u70b9')\",\n        'name': '\u9876\u70b9',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5e7b\u68a6\u8f7b\u5c0f\u8bf4')\",\n        'name': '\u5e7b\u68a6\u8f7b\u5c0f\u8bf4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u6c5f\u6e56')\",\n        'name': '\u6c5f\u6e56',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u6b6a\u745e\u53e4\u5fb7')\",\n        'name': '\u6b6a\u745e\u53e4\u5fb7\u6f2b\u753b',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u6cb3\u9a6c')\",\n        'name': '\u6cb3\u9a6c\u77ed\u5267',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u77e5\u4e4e')\",\n        'name': '\u77e5\u4e4e',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('vip')\",\n        'name': '\u4e0b\u65b9\u4e3aVIP\u4e13\u5c5e\u4e66\u6e90(\u70b9\u51fb\u6b64\u5904\u641c\u6240\u6709vip)',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        'action': \"set_source('\u559c\u9a6c\u62c9\u96c5')\",\n        'name': '\u559c\u9a6c\u62c9\u96c5',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('svip')\",\n            'name': '\u4e0b\u65b9\u4e3aSVIP\u4e13\u5c5e\u4e66\u6e90(\u70b9\u51fb\u6b64\u5904\u641c\u6240\u6709svip)',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 1\n            }\n        }, {\n            'action': \"set_source('\u8d85\u4f1a\u4e13\u5c5e\u77ed\u5267')\",\n            'name': '\u8d85\u4f1a\u4e13\u5c5e\u77ed\u5267',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u8d85\u4f1a\u4e13\u5c5e\u5c0f\u8bf4')\",\n            'name': '\u8d85\u4f1a\u4e13\u5c5e\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n        'action': \"set_source('\u9177\u6211')\",\n        'name': '\u9177\u6211',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n            'action': \"set_source('\u53f0\u6e7e\u5c0f\u8bf4')\",\n            'name': '\u53f0\u6e7e\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('3A\u5c0f\u8bf4')\",\n            'name': '3A\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n             'action': \"set_source('\u5305\u5b50\u6f2b\u753b')\",\n            'name': '\u5305\u5b50\u6f2b\u753b',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {       \t  \t\n            'action': \"set_source('QQ\u9605\u8bfb')\",\n            'name': 'QQ(\u4f1a\u5458\u4e66\u7c4d\u514d\u8d39)',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u4e45\u4e45\u5c0f\u8bf4')\",\n            'name': '\u4e45\u4e45\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n        \t    'action': \"set_source('\u8ffd\u66f4\u4eba')\",\n            'name': '\u8ffd\u66f4\u4eba',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u6f2b\u753b\u5c4b')\",\n            'name': '\u6f2b\u753b\u5c4b',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u6f2b\u753b\u7f51')\",\n            'name': '\u6f2b\u753b\u7f51',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('52\u4e66\u5e93')\",\n            'name': '52\u4e66\u5e93',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u8150\u5c0f\u8bf4')\",\n            'name': '\u8150\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u5b8c\u672c\u5c0f\u8bf4')\",\n            'name': '\u5b8c\u672c\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u76d0\u9009\u6587\u5e93')\",\n            'name': '\u76d0\u9009\u6587\u5e93',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {    \t     \t\n            'action': \"set_source('\u6709\u5ea6\u4e2d\u6587')\",\n            'name': '\u6709\u5ea6\u4e2d\u6587',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u4e09\u96f6\u8bfb\u4e66')\",\n            'name': '\u4e09\u96f6\u8bfb\u4e66',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u9e7f\u9e7f')\",\n            'name': '\u9e7f\u9e7f',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u9605\u53cb\u5c0f\u8bf4')\",\n            'name': '\u9605\u53cb\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u661f\u7a7a\u5c0f\u8bf4')\",\n            'name': '\u661f\u7a7a\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u5168\u514d\u6f2b\u753b')\",\n            'name': '\u5168\u514d\u6f2b\u753b',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('365\u5c0f\u8bf4')\",\n            'name': '365\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u51b7\u51b7\u6587\u5b66')\",\n            'name': '\u51b7\u51b7\u6587\u5b66',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u4e07\u76f8\u4e66\u57ce')\",\n            'name': '\u4e07\u76f8\u4e66\u57ce',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n        \t    'action': \"set_source('\u5e7b\u68a6\u8f7b\u5c0f\u8bf4')\",\n            'name': '\u5e7b\u68a6\u8f7b\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u72ec\u6b65\u5c0f\u8bf4')\",\n            'name': '\u72ec\u6b65\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u798f\u4e66\u7f51')\",\n            'name': '\u798f\u4e66\u7f51',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u901f\u8bfb\u8c37')\",\n            'name': '\u901f\u8bfb\u8c37',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u5168\u672c\u540c\u4eba')\",\n            'name': '\u5168\u672c\u540c\u4eba',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n             'action': \"set_source('\u6bd2\u820c\u5f71\u89c6')\",\n            'name': '\u6bd2\u820c\u5f71\u89c6',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n        \"name\": \"\u81ea\u5b9a\u4e49\u641c\u7d22\u6e90(\u591a\u4e2a\u7528\u82f1\u6587,\u5206\u5272)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u542c\u4e66Ai\u97f3\u8272\u586b\u5199\u540e\u70b9\u51fb\u53f3\u4e0a\u89d2\u2714\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u81ea\u5b9a\u4e49\u670d\u52a1\u5668(\u53ef\u4e0d\u586b)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u81ea\u5b9a\u4e49\u8bc4\u8bba\u989c\u8272(\u53ef\u4e0d\u586b)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u6bb5\u8bc4\u6c14\u6ce1\u6837\u5f0f(0-4)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)\",\n        \"type\": \"text\"\n    }\n]","loginUrl":"\/\/ \u5f53\u524d\u4e66\u6e90\u7248\u672c\u53f7\uff0c\u5207\u52ff\u4fee\u6539\uff0c\u5426\u5219\u5f71\u54cd\u66f4\u65b0\u7684\u8bc6\u522b\nconst localVersion = '4.12.28';\n\nfunction login(flag) {\n    if (flag == undefined) {\n        result = JSON.parse(source.getLoginInfo())\n    } else {\n        java.longToast(\"\\n\\n\ud83d\udc9e\u6b63\u5728\u767b\u5f55\u4e2d...\")\n        putLoginInfo(JSON.stringify(result))\n    }\n    let base_url = getArgument('server')\n    let zdyserver = String(result['\u81ea\u5b9a\u4e49\u670d\u52a1\u5668(\u53ef\u4e0d\u586b)']);\n    if (zdyserver.includes('http')) {\n        setArgument('server', zdyserver);\n        if (getKey(String(cookie.getCookie(base_url)))) {\n            let cookies = cookie.getCookie(base_url)\ntry{cookie.removeCookie(base_url)} catch(e){}\n            cookie.setCookie(zdyserver, cookies)\n        }\n        java.toast(`\\n\\n\u5f53\u524d\u670d\u52a1\u5668\u4e3a\u81ea\u5b9a\u4e49\u670d\u52a1\u5668\\n${zdyserver}\\n\\n\u5207\u6362\u670d\u52a1\u5668\u8bf7\u5148\u6e05\u7a7a\u670d\u52a1\u5668\u5730\u5740\u4e2d\u7684\u6570\u636e`);\n    }\n    let zdytone_id = String(result['\u542c\u4e66Ai\u97f3\u8272\u586b\u5199\u540e\u70b9\u51fb\u53f3\u4e0a\u89d2\u2714'] || '');\n    if (zdytone_id) {\n        setArgument('tone_id', zdytone_id);\n    } else {\n        setArgument('tone_id', '\u9ed8\u8ba4\u97f3\u8272');\n    }\n    let plcolor = String(result['\u81ea\u5b9a\u4e49\u8bc4\u8bba\u989c\u8272(\u53ef\u4e0d\u586b)'] || '#000000');\n    if (plcolor) {\n        setArgument('plcolor', plcolor);\n    } else {\n        setArgument('plcolor', '#000000');\n    }\n    let zdysources = String(result['\u81ea\u5b9a\u4e49\u641c\u7d22\u6e90(\u591a\u4e2a\u7528\u82f1\u6587,\u5206\u5272)'] || '');\n    if (zdysources) {\n        setArgument('source', zdysources);\n    };\n    base_url = getArgument('server')\n    let register_email = String(result['\u90ae\u7bb1'])\n    let password = String(result['\u5bc6\u7801'])\n    let key = String(result['\u5bc6\u94a5'] || '')\n\n    \/\/java.log(cookie.getCookie(base_url))\n    if ((register_email && password || key) && !String(getKey(String(cookie.getCookie(base_url))))) {\n        try{cookie.removeCookie(base_url)} catch(e){}\n        let deviceKey = '';\n        try {\n            deviceKey = java.deviceID();\n        } catch (e) {\n            deviceKey = java.androidId();\n        };\n        let deviceId = deviceKey;\n        if (register_email && password) {\n            let options = JSON.stringify({\n                method: 'POST',\n                headers: {\n                    'Content-Type': 'application\/json'\n                },\n                body: JSON.stringify({\n                    register_email: result['\u90ae\u7bb1'],\n                    password: result['\u5bc6\u7801']\n                })\n            })\n            try {\n                let data = JSON.parse(java.ajax(`${base_url}\/login_api,${options}`))\n                if (data.code == 0) {\n                    \/\/java.toast(deviceId)\n                    java.toast(\"\\n\\n\u2705\ufe0f\u767b\u5f55\u6210\u529f\")\n                    cookie.setCookie(base_url, `qttoken=${data.key};deviceId=${deviceId}`)\n                    result['\u5bc6\u94a5'] = data.key\n                    putLoginInfo(JSON.stringify(result))\n                } else {\n                    java.toast('\\n\\n\ud83d\udc94' + data.msg || \"\u767b\u5f55\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5\uff01\")\n                }\n            } catch (e) {\n                java.toast(\"\\n\\n\ud83d\udc94\u767b\u5f55\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5\uff01\\n\" + e.message)\n            }\n        } else {\n            cookie.setCookie(base_url, `qttoken=${key};deviceId=${deviceId}`)\n            let res = java.ajax(`${base_url}\/user_api,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n            try {\n                res = JSON.parse(res)\n                if (res.id != undefined) {\n                    java.toast('\\n\\n\u5bc6\u94a5\u767b\u5f55\u6210\u529f')\n                    result['\u90ae\u7bb1'] = res.email\n                    putLoginInfo(JSON.stringify(result))\n                } else {\n                    throw new Error()\n                }\n            } catch (e) {\n                java.log(e)\n                java.toast(\"\\n\\n\ud83d\udc94\u767b\u5f55\u5931\u8d25\")\n            }\n        }\n    } else if (flag && String(getKey(String(cookie.getCookie(base_url))))) {\n        java.toast(\"\\n\\n\u5f53\u524d\u2705\ufe0f\u5df2\u767b\u5f55\uff0c\u8bf7\ud83d\udeab\u9000\u51fa\u767b\u5f55\u540e\u91cd\u65b0\u767b\u5f55\");\n        \/\/checkStatus();\n    } else if (flag) {\n        java.toast(\"\\n\\n\u26d4\ufe0f\u8bf7\u5148\u586b\u5199\u90ae\u7bb1\u548c\u5bc6\u7801\");\n    }\n}\n\n\/\/ \u68c0\u6d4b\u670d\u52a1\u5668\nfunction checkNet() {\n    let url = getArgument('server');\n    java.longToast(`\\n\\n\u267b\ufe0f\u6b63\u5728\u68c0\u6d4b\uff1a${url}\\n\u8bf7\u7a0d\u7b49~`);\n    let date1 = new Date().getTime();\n    let html = java.ajax(url + '\/login');\n    let date2 = new Date().getTime();\n    let t = date2 - date1;\n    let c = String(html).indexOf('\u5927\u7070\u72fc');\n    let code = 1;\n    let time = t \/ 1000 + 's';\n    let logTime = '\u3010' + url + '\u3011\\n\u250b\u250b\\n' + '\u89e3\u6790\u65f6\u95f4\uff1a' + time;\n    if (c == -1 || t > 5000) {\n        java.longToast('\\n\ud83d\udc94\u3010\u8bbf\u95ee\u5931\u8d25\u63d0\u793a\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2663\ufe0f\u5f53\u524d\u63a5\u53e3\u65e0\u6cd5\u8bbf\u95ee(\u53ef\u80fd\u88ab\u5899)\u2663\ufe0f\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\/\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    } else if (t < 1000) {\n        java.longToast('\\n\ud83d\udc96\u3010\u7f51\u7edc\u73af\u5883\u4f18\u826f\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2764\ufe0f\u5ef6\u8fdf\u4f4e\uff0c\u63a8\u8350\u4f7f\u7528\u6b64\u63a5\u53e3\u2764\ufe0f\\n\u250b\u250b\\n\u7f51\u7edc\u73af\u5883\u4f18\u826f\uff0c\u8bf7\u7ee7\u7eed\u4fdd\u6301\u72b6\u6001\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    } else if (t >= 1000 && t < 2000) {\n        java.longToast('\\n\ud83d\udc9b\u3010\u7f51\u7edc\u73af\u5883\u4e00\u822c\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2666\ufe0f\u5ef6\u8fdf\u4e00\u822c\uff0c\u52c9\u5f3a\u53ef\u4f7f\u7528\u2666\ufe0f\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\u6216\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    } else if (t >= 2000 && t < 5000) {\n        java.longToast('\\n\ud83d\udc94\u3010\u7f51\u7edc\u73af\u5883\u582a\u5fe7\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2660\u5ef6\u8fdf\u8fc7\u9ad8\uff0c\u4e0d\u5efa\u8bae\u4f7f\u7528\u2660\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\u6216\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    }\n}\n\nfunction isVips(res) {\n    let isVIP = '';\n    let vipEndTime = res.vip_end_time;\n    let formattedDate = '';\n\n    if (vipEndTime && vipEndTime !== 0) {\n        let date = new Date(vipEndTime * 1000);\n        formattedDate = `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`;\n        let currentTime = Math.floor(Date.now() \/ 1000);\n        let remainingDays = Math.ceil((vipEndTime - currentTime) \/ (24 * 60 * 60));\n        if (currentTime > vipEndTime) {\n            isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} (\u5df2\u8fc7\u671f)`;\n        } else if (remainingDays <= 7) {\n            isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} \u5269\u4f59${remainingDays}\u5929`;\n        } else {\n            if (vipEndTime < 1912946812) {\n                isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"}(${formattedDate})`;\n            } else {\n                isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} (\u6c38\u4e45)`;\n            }\n        }\n    } else {\n        isVIP = '\u60a8\u5c1a\u672a\u5f00\u901aVIP';\n    }\n    return isVIP;\n}\n\nfunction checkStatus() {\n    java.longToast('\\n\\n\u267b\ufe0f\u68c0\u6d4b\u4e2d...');\n    let base_url = getArgument('server')\n    let res = java.ajax(`${base_url}\/user_api,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n    try {\n        res = JSON.parse(res)\n        if (res.id != undefined) {\n            result['\u90ae\u7bb1'] = res.email\n            putLoginInfo(JSON.stringify(result))\n            let devices\n            try {\n                devices = JSON.parse(res.device).length;\n            } catch (e) {\n                devices = res.device ? 1 : 0;\n            }\n            let isVip = isVips(res);\n            tips = `\n\u250f\u2505\u2505\u2505\u2505\u2505\u2505\u2531\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2510\n\u3000 \ud83e\udde2\u6635\u79f0 \u3000\u3000\u3000\u3000${res.nickname.padEnd(20,\"\\t\") || \"\u672a\u8bbe\u7f6e\".padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\u2709\ufe0f\u90ae\u7bb1\u3000\u3000\u3000\u3000${res.email.replace(\/(.{3}).*?@\/,\"$1***@\").padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udd11\u5bc6\u94a5\u3000\u3000\u3000\u3000${(`${res.user_key.substring(0,4)}***${res.user_key.slice(-4)}`).padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udcc5\u6ce8\u518c\u65f6\u95f4\u3000\u3000${java.timeFormat(res.register_time*1000).padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\uddd2\ufe0f\u4eca\u65e5\u9605\u8bfb\u3000\u3000${(java.timeFormat(new Date()).slice(0,10)==java.timeFormat(res.last_read_time * 1000).slice(0,10)?res.day_read_count:0).toString().padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udcda\u7d2f\u8ba1\u9605\u8bfb\u3000\u3000${res.all_read_count.toString().padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udd53\u6700\u540e\u9605\u8bfb\u3000\u3000${(res.last_read_time != 0?java.timeFormat(res.last_read_time * 1000):'\u672a\u9605\u8bfb').padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udcf1\u5173\u8054\u8bbe\u5907\u3000\u3000${devices.toString().padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udc51\u4f1a\u5458\u72b6\u6001\u3000\u3000${isVip.padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udeab\u5c01\u7981\u72b6\u6001\u3000\u3000${res.is_banned?'\u5df2\u5c01\u7981':'\u6b63\u5e38\u3000'}\u3000\u3000\u3000\u3000\u3000\u3000\u3000\n\u2517\u2505\u2505\u2505\u2505\u2505\u2505\u2539\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2518\n`\n            java.log(tips)\n            java.longToast(tips)\n        } else {\n            throw new Error(res.msg)\n        }\n    } catch (e) {\n        \/\/java.log(e)\n        java.toast(\"\\n\u68c0\u6d4b\u767b\u5f55\u5931\u8d25\\n\" + e.message)\n    }\n}\n\nfunction clearDevice() {\n    let base_url = getArgument('server')\n    let res = java.ajax(`${base_url}\/clear,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n    java.toast(res.code === 0 ? \"\\n\\n\ud83d\udcf4\u8bbe\u5907\u6e05\u9664\u6210\u529f\" : res.msg)\n    Packages.java.lang.Thread.sleep(500)\n    checkStatus()\n}\n\/\/ \u4fdd\u5b58\u767b\u5f55UI\u4fe1\u606f\nfunction putLoginInfo(info) {\n    try {\n        let key = java.androidId()\n        let encodeStr = Packages.android.util.Base64.encodeToString(java.createSymmetricCrypto(\"AES\", key).encrypt(info), 2)\n        cache.put(`userInfo_${source.getKey()}`, encodeStr)\n        return true\n    } catch (e) {\n        java.log(e)\n        return source.putLoginInfo(info)\n    }\n}\n\n\/\/ \u7528\u6237\u540e\u53f0\nfunction loginqt() {\n\t   let base_url = getArgument('server');\n\t   let ck = String(cookie.getKey(base_url, \"qttoken\"));\n\t   if (!ck) {\n\t   \tjava.longToast('\\n\\n\ud83d\udeab\u8bf7\u5148\u767b\u5f55!')\n\t   \t} else {\n\t   \t\tjava.startBrowserAwait(getArgument('server') + '\/user', '\u5927\u7070\u72fc\u5c0f\u8bf4\u540e\u53f0');\n\t   \t\t}\n    }\n\n\/\/ \u7528\u6237\u6ce8\u518c\nfunction register() {\n\t   let base_url = getArgument('server');\n\t   \tjava.startBrowserAwait(getArgument('server') + '\/register', '\u5927\u7070\u72fc\u5c0f\u8bf4\u6ce8\u518c');\n    }\n\n\/\/\u767b\u5f55\u756a\u8304\nfunction fq_login() {\n    try {\n        java.startBrowserAwait(\"https:\/\/fanqienovel.com\/\", \"\u767b\u5f55\")\n    } catch (e) {\n        java.toast(e)\n    }\n    try {\n        cookie.removeCookie(\"snssdk.com\")\n    } catch (e) {}\n    var cookie_ = \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : source.getLoginInfoMap()['\u624b\u52a8\u767b\u5f55Token'])\n    let user\n    try {\n        user = JSON.parse(java.ajax(\"https:\/\/fanqienovel.com\/api\/user\/info\/v2,\" + JSON.stringify({\n            method: \"GET\",\n            headers: {\n                \"Cookie\": cookie_\n            }\n        }))).data.name\n    } catch (e) {\n        java.log(e)\n    }\n    if (!cookie_ || cookie_ == \"sessionid=\" || !user) {\n        java.toast(\"\u672a\u83b7\u53d6\u5230\u767b\u5f55\u51ed\u636e\uff0c\u767b\u5f55\u5931\u8d25\")\n        return false\n    }\n    java.toast(\"\\n\\n\u6b22\u8fce \" + user + \"\\n\u767b\u5f55\u6210\u529f\uff01\")\n    return true\n}\n\n\/\/\u9000\u51fa\u767b\u5f55\nfunction logout() {\n    cookie.removeCookie(\"fanqienovel.com\");\n    cookie.removeCookie(\"snssdk.com\");\n    cookie.removeCookie(\"69shuba.com\");\n    \/*\n    let servers = host\n    for (let server of servers) {\n    \ttry{removeCookie(server )} catch(e){cookie.removeCookie(server )}\n    }\n    *\/\ntry{cookie.removeCookie(getArgument('server'))} catch(e){}\n    java.toast(\"\u9000\u51fa\u767b\u5f55\u6210\u529f\");\n}\n\n\/\/\u83b7\u53d6\u53c2\u6570\nfunction getArgument(key) {\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    return open_argument[key];\n}\n\n\/\/\u8bbe\u7f6e\u53c2\u6570\nfunction setArgument(key, value) {\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    open_argument[key] = value;\n    open_argument = JSON.stringify(open_argument);\n    source.setVariable(open_argument);\n    return open_argument;\n}\n\n\/\/ \u8bbe\u7f6e\u672c\u5730or\u4e91\u7aef\u8bbf\u95ee\nfunction get_proxy() {\n    let proxy = getArgument('proxy');\n    if (proxy == '\u672c\u5730') {\n        setArgument('proxy', '\u4e91\u7aef');\n        java.longToast('\\n\u6240\u6709\u6570\u636e\u91c7\u7528\\n\\n\u670d\u52a1\u5668\u7f51\u7edc\u8bbf\u95ee\\n\\n\u5982\u679c\u53d1\u73b0\u7528\u4e0d\u4e86\uff0c\u8bf7\u5207\u6362\u672c\u5730\u7f51\u7edc\u8bbf\u95ee\uff0c\u598269\u4e66\u5427');\n    } else {\n        setArgument('proxy', '\u672c\u5730');\n        java.longToast('\\n\u6240\u6709\u6570\u636e\u91c7\u7528\\n\\n\u672c\u5730\u7f51\u7edc\u8bbf\u95ee\\n\\n\u5982\u679c\u53d1\u73b0\u7528\u4e0d\u4e86\uff0c\u8bf7\u5f00\u542f\u7f51\u7edc\u4ee3\u7406\uff0c\u598269\u4e66\u5427');\n    }\n}\n\n\n\/\/\u8bbe\u7f6e\u7537\u5973\u9891\nfunction set_source_type() {\n    let source_type = getArgument(\"source_type\");\n    if (source_type == '\u5973\u9891') {\n        setArgument(\"source_type\", '\u7537\u9891');\n    java.toast(\"\\n\u53d1\u73b0\u9875\u5df2\u8bbe\u7f6e\u4e3a:\ud83d\ude4b\u200d\u2642\ufe0f\u7537\u9891\" );\n    } else {\n        setArgument(\"source_type\", '\u5973\u9891');\n    java.toast(\"\\n\u53d1\u73b0\u9875\u5df2\u8bbe\u7f6e\u4e3a:\ud83d\ude4b\u200d\u2640\ufe0f\u5973\u9891\" );\n    }\n    \n}\n\nfunction set_reading() {\n\tlet reading = getArgument(\"reading\");\n    if (reading == '1') {\n        setArgument(\"reading\", '0');\n    java.toast(\"\\n\\n\u5927\u7070\u72fc\u4e66\u67b6\u8bb0\u5f55\u540c\u6b65\u5df2\u5173\u95ed\uff01\" );\n    } else {\n        setArgument(\"reading\", '1');\n    java.longToast(\"\\n\\n\u5927\u7070\u72fc\u4e66\u67b6\u8bb0\u5f55\u540c\u6b65\u5df2\u5f00\u542f\uff01\\n\u5237\u65b0\u9605\u8bfb\u4e66\u67b6\u5373\u53ef\u5c06\u4e66\u67b6\u4e66\u7c4d\u540c\u6b65\u5230\u5927\u7070\u72fc\u4e66\u67b6\uff01\" );\n    }\n\n\t}\n\n\/\/\u9996\u9875\nfunction api() {\n    java.startBrowserAwait('http:\/\/fb.langge.cf', \"\u9996\u9875\");\n}\n\n\/\/\u6253\u8d4f\nfunction vip() {\n\t    let base_url = getArgument('server');\n\t   let ck = String(cookie.getKey(base_url, \"qttoken\"));\n\t   if (!ck) {\n\t   \tjava.longToast('\\n\\n\ud83d\udeab\u8bf7\u5148\u767b\u5f55!')\n\t   \t} else {\n\t   \t\tjava.startBrowserAwait(getArgument('server') + '\/coffee', '\u5927\u7070\u72fc\u5c0f\u8bf4\u4f1a\u5458\u5f00\u901a');\n\t   \t\t}\n    }\n\nvar server = getArgument('server');\n\n\/\/\u8bbe\u7f6e\u641c\u7d22\u5a92\u4f53\nfunction set_media(media) {\n    const mediaConfig = {\n        '\u559c\u9a6c\u62c9\u96c5': ['\u542c\u4e66'],\n        '\u756a\u8304': '*',\n        '\u798f\u5229\u5c0f\u8bf4':['\u5c0f\u8bf4'],\n        '\u5168\u514d\u6f2b\u753b':['\u6f2b\u753b'],\n        '\u5305\u5b50\u6f2b\u753b':['\u6f2b\u753b'],\n        '\u6f2b\u753b\u7f51':['\u6f2b\u753b'],\n        '\u98ce\u8f66\u6f2b\u753b':['\u6f2b\u753b'],\n        '\u798f\u5229\u6f2b\u753b':['\u6f2b\u753b'],\n        '\u597d\u770b\u6f2b\u753b':['\u6f2b\u753b'],\n        '\u9177\u6211':['\u542c\u4e66'],\n        '\u6d77\u6d0b\u542c\u4e66':['\u542c\u4e66'],\n        '\u4e03\u732b': ['\u5c0f\u8bf4', '\u542c\u4e66'],\n        '\u6cb3\u9a6c': ['\u77ed\u5267'],\n        '\u8d85\u4f1a\u4e13\u5c5e\u77ed\u5267': ['\u77ed\u5267'],\n        '\u6b6a\u745e\u53e4\u5fb7': ['\u6f2b\u753b'],\n        '\u6bd2\u820c\u5f71\u89c6':['\u77ed\u5267'],\n        '\u5168\u90e8': '*', \/\/ \u5141\u8bb8\u6240\u6709\u6a21\u5f0f\n        '\u9ed8\u8ba4': ['\u5c0f\u8bf4']\n    };\n\n    const source = getArgument('source');\n    const allowedModes = mediaConfig[source] || mediaConfig['\u9ed8\u8ba4'];\n    let targetMedia = mediaConfig['\u9ed8\u8ba4'][0];\n    let isAllowed = false;\n\n    if (allowedModes === '*' || allowedModes.includes(media)) {\n        targetMedia = media;\n        isAllowed = true;\n    } else if (Array.isArray(allowedModes)) {\n        targetMedia = allowedModes[0];\n    }\n\n    const message = isAllowed ?\n        `\\n\\n\u5df2\u5207\u6362\u81f3\uff1a${targetMedia}\\n\u8bf7\u91cd\u65b0\u641c\u7d22\u4e66\u7c4d\uff01` :\n        `\\n\\n\u76ee\u524d${source}\uff1a\u4e0d\u652f\u6301\u3010${media}\u3011\u6a21\u5f0f\uff01\\n\u5df2\u81ea\u52a8\u5207\u6362\u81f3\uff1a${targetMedia}`;\n\n    setArgument('media', targetMedia);\n    java.toast(message);\n}\n\n\/\/\u83b7\u53d6\u641c\u7d22\u5a92\u4f53\nfunction get_media() {\n    let media = getArgument('media');\n    let source = getArgument('source');\n    if (media == '') {\n        media = '\u5168\u90e8';\n    }\n    var tishi = '\\n\\n\u5f53\u524d\u670d\u52a1\u5668\uff1a' + getArgument('server')\n    java.longToast(`\\n\\n\u5f53\u524d\u4f7f\u7528\u6e90\uff1a${source}-${media}${tishi}`);\n}\n\n\n\/\/\u8bbe\u7f6e\u670d\u52a1\u5668\nfunction set_server() {\n    putLoginInfo(JSON.stringify(result))\n    let zdyserver;\n    let base_url = getArgument('server')\n    try {\n        zdyserver = String(result['\u81ea\u5b9a\u4e49\u670d\u52a1\u5668(\u53ef\u4e0d\u586b)']);\n        if (zdyserver.includes('http')) {\n            setArgument('server', zdyserver);\n            if (getKey(String(cookie.getCookie(base_url)))) {\n                let cookies = cookie.getCookie(base_url)\n                try{cookie.removeCookie(base_url)} catch(e){}\n                cookie.setCookie(zdyserver, cookies)\n            }\n            java.toast(`\\n\\n\u5f53\u524d\u670d\u52a1\u5668\u4e3a\u81ea\u5b9a\u4e49\u670d\u52a1\u5668\\n${zdyserver}\\n\\n\u5207\u6362\u670d\u52a1\u5668\u8bf7\u5148\u6e05\u7a7a\u670d\u52a1\u5668\u5730\u5740\u4e2d\u7684\u6570\u636e`);\n        } else {\n            zdyserver = '';\n        }\n    } catch (error) {\n        zdyserver = '';\n    }\n    if (!zdyserver) {\n        const servers = host\n        const currentServer = getArgument('server') || '';\n        const currentIndex = servers.indexOf(currentServer);\n\n        const nextIndex = currentIndex >= 0 ? (currentIndex + 1) % servers.length : 0;\n        const nextServer = servers[nextIndex];\n\n        setArgument('server', nextServer);\n        if (getKey(String(cookie.getCookie(currentServer)))) {\n            let cookies = cookie.getCookie(currentServer)\ntry{cookie.removeCookie(currentServer)} catch(e){}\n            cookie.setCookie(nextServer, cookies)\n        }\n        java.longToast(`\\n\\n\u670d\u52a1\u5668\u3010${nextIndex+1}\u3011\uff1a${nextServer}`);\n    }\n}\n\n\/\/\u83b7\u53d6\u97f3\u8272\nvar tone_id = getArgument('tone_id');\n\nfunction get_tone_id(arg) {\n    var datadist = {\n        \"0\": \"\u9ed8\u8ba4\u97f3\u8272\",\n        \"-1\": \"\u9605\u8bfb\u6a21\u5f0f\",\n        \"-2\": \"\u6f2b\u753b\u6a21\u5f0f\",\n        \"51\": \"\u591a\u4eba\u53d1\u97f3\",\n        \"1\": \"\u751c\u7f8e\u5c11\u5973\",\n        \"2\": \"\u6e05\u4eae\u9752\u53d4\",\n        \"5\": \"\u5f00\u6717\u9752\u5e74\",\n        \"6\": \"\u6e29\u67d4\u6dd1\u5973\",\n        \"4\": \"\u6210\u719f\u5927\u53d4\",\n        \"74\": \"\u5927\u53d4\u5347\u7ea7\",\n        \"30\": \"\u4f18\u96c5\u5fa1\u59d0\"\n    };\n    var tone_id = datadist[arg] || arg;\n    var tishi = '\\n\\n\u5f53\u524d\u97f3\u8272\uff1a' + tone_id;\n    java.toast(tishi);\n}\n\n\/\/\u8bbe\u7f6e\u97f3\u8272\nfunction set_tone_id(mode, name) {\n    putLoginInfo(JSON.stringify(result))\n    let zdytone_id;\n    try {\n        zdytone_id = String(result['\u5176\u4ed6\u97f3\u8272\u586b\u5199\u540e\u70b9\u51fb\u53f3\u4e0a\u89d2\u2714']);\n        if (zdytone_id) {\n            setArgument('tone_id', zdytone_id);\n            java.toast(`\\n\\n\u5f53\u524d\u97f3\u8272\u4e3a\u81ea\u5b9a\u4e49\u97f3\u8272\\n${zdytone_id}\\n\\n\u5207\u6362\u97f3\u8272\u8bf7\u5148\u6e05\u7a7a\u97f3\u8272\u8f93\u5165\u6846\u4e2d\u7684\u6570\u636e`);\n        } else {\n            zdytone_id = '';\n        }\n    } catch (error) {\n        zdytone_id = '';\n    }\n    if (!zdytone_id) {\n        let toast = \"\\n\\n\u5df2\u5207\u6362\u81f3\uff1a\" + name + '\\n\\n\u5207\u6362\u540e\u9700\u8981\u5237\u65b0\u8be6\u60c5\u9875';\n        setArgument('tone_id', mode);\n        java.toast(toast);\n    }\n}\n\n\/\/\u8bbe\u7f6e\u6765\u6e90\nfunction set_source(sources) {\n    let zdysources = String(result['\u81ea\u5b9a\u4e49\u641c\u7d22\u6e90(\u591a\u4e2a\u7528\u82f1\u6587,\u5206\u5272)'] || '');\n    if (zdysources.length > 1 && zdysources != 'undefined') {\n        java.toast('\\n\\n\u8bf7\u5148\u6e05\u7a7a\u81ea\u5b9a\u4e49\u6e90\u518d\u8bbe\u7f6e');\n    } else {\n        setArgument('source', sources);\n        set_media('\u5c0f\u8bf4');\n        java.toast(`\\n\\n\u5f53\u524d\u6765\u6e90\u5df2\u5207\u6362\u4e3a:\\n${sources}\\n\\n\u5207\u6362\u540e\u8bf7\u91cd\u65b0\u641c\u7d22`);\n    }\n}\n\n\/\/ \u8bbe\u7f6e\u7b80\u4ecb\nfunction set_info() {\n    var info = getArgument('info');\n    if (info == 'on') {\n        setArgument('info', 'off');\n        java.toast('\\n\\n\u5df2\u6062\u590d\u8be6\u60c5\u9875\u8be6\u7ec6\u7b80\u4ecb');\n    } else {\n        setArgument('info', 'on');\n        java.toast('\\n\\n\u5df2\u7cbe\u7b80\u8be6\u60c5\u9875\u7b80\u4ecb');\n    }\n}\n\n\/\/ \u756a\u8304\u6bb5\u8bc4\nfunction paracomment() {\n    var fqpara = getArgument('fqpara');\n    if (fqpara == 'on') {\n        setArgument('fqpara', 'off');\n        java.longToast('\\n\\n\u6bb5\u8bc4\u5df2\u5173\u95ed');\n    } else {\n        setArgument('fqpara', 'on');\n        java.longToast(\"\\n\\n\u6bb5\u8bc4\u5df2\u5f00\u542f\\n\\n\u957f\u6309\u5237\u65b0\u6bb5\u540e\u9762\u7684\u56fe\u7247\u5373\u53ef\\n\\n\u5982\u679c\u56fe\u7247\u4e0d\u663e\u793a\uff0c\u5237\u65b0\u65e0\u53cd\u5e94\\n\u8bf7\u66f4\u65b0\u6d4b\u8bd5\u7248\u9605\u8bfbapp\");\n    }\n}\n\n\/\/ \u5f3a\u5236\u641c\u7d22\u88ab\u7981\u7528\u7684\u6e90\nfunction disabledSources() {\n    var disabled_sources = getArgument('disabled_sources');\n    if (disabled_sources == '1') {\n        setArgument('disabled_sources', '0');\n        java.longToast('\\n\\n\u5f3a\u5236\u641c\u7d22\u7981\u7528\u7684\u6e90\u5df2\u5173\u95ed');\n    } else {\n        setArgument('disabled_sources', '1');\n        setArgument('source', '\u5168\u90e8');\n        java.longToast(\"\\n\\n\u5f3a\u5236\u641c\u7d22\u7981\u7528\u7684\u6e90\u5df2\u5f00\u542f\\n\\n\u6ce8\u610f\uff1a\u5f00\u542f\u540e\u641c\u7d22\u65f6\u95f4\u4f1a\u53d8\u957f\uff01\");\n    }\n}\n\n\/\/ \u6211\u8981\u63a8\u8350\nfunction put_book() {\n    java.startBrowserAwait(getArgument('server') + '\/put_book', '\u6211\u6765\u63a8\u8350');\n}\n\n\/\/ \u4e66\u6e90\u66f4\u65b0\nfunction renderVersionPage() {\n    let yd = '';\n    let html = `\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n  <meta charset=\"UTF-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\n  <title>\u4e66\u6e90\u66f4\u65b0<\/title>\n  <!-- Font Awesome \u56fe\u6807\u5e93 -->\n  <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.4.0\/css\/all.min.css\" \/>\n  <style>\n    :root {\n      --primary-gradient: linear-gradient(135deg, #4e6ef2, #6b2dd8);\n      --latest-gradient: linear-gradient(135deg, #8e2de2 0%, #4a00e0 50%, #d4af37 100%);\n      --success-color: #28c76f;\n      --warning-color: #ff9f43;\n      --error-color: #ea5455;\n      --text-main: #1f2937;\n      --text-secondary: #6b7280;\n      --card-bg: #ffffff;\n      --border-color: #e5e7eb;\n      --light-bg: #f9fafb;\n      --shadow: 0 4px 12px rgba(78, 110, 242, 0.1);\n      --shadow-hover: 0 6px 18px rgba(78, 110, 242, 0.2);\n      --glow-shadow: 0 0 25px rgba(142, 45, 226, 0.5), 0 0 50px rgba(212, 175, 55, 0.3);\n      --modal-bg: rgba(31, 41, 55, 0.8);\n      --modal-content-bg: #ffffff;\n    }\n\n    * {\n      box-sizing: border-box;\n      margin: 0;\n      padding: 0;\n      font-family: 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;\n    }\n\n    body {\n      background: linear-gradient(135deg, #eef2ff, #f5f7ff);\n      color: var(--text-main);\n      min-height: 100vh;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      padding: 16px;\n    }\n\n    \/* \u52a0\u8f7d\u52a8\u753b *\/\n    .loading-wrapper {\n      text-align: center;\n      animation: fadeIn 0.3s ease;\n    }\n\n    .loading-spinner {\n      width: 50px;\n      height: 50px;\n      border: 4px solid rgba(78, 110, 242, 0.3);\n      border-top-color: #4e6ef2;\n      border-radius: 50%;\n      margin: 0 auto 20px;\n      animation: spin 1s linear infinite;\n    }\n\n    .loading-text {\n      color: var(--text-main);\n      font-size: 16px;\n      font-weight: 500;\n    }\n\n    @keyframes spin {\n      to { transform: rotate(360deg); }\n    }\n\n    @keyframes fadeIn {\n      from { opacity: 0; transform: translateY(20px); }\n      to { opacity: 1; transform: translateY(0); }\n    }\n\n    @keyframes slideIn {\n      from { opacity: 0; transform: translateY(30px); }\n      to { opacity: 1; transform: translateY(0); }\n    }\n\n    @keyframes pulse {\n      0%, 100% { opacity: 1; }\n      50% { opacity: 0.7; }\n    }\n\n    @keyframes gradientAnimation {\n      0% { background-position: 0% 50%; }\n      50% { background-position: 100% 50%; }\n      100% { background-position: 0% 50%; }\n    }\n\n    @keyframes breathe {\n      0%, 100% { \n        transform: scale(1);\n        box-shadow: var(--glow-shadow), var(--shadow);\n      }\n      50% { \n        transform: scale(1.02);\n        box-shadow: 0 0 30px rgba(142, 45, 226, 0.6), 0 0 60px rgba(212, 175, 55, 0.4), var(--shadow);\n      }\n    }\n\n    @keyframes shimmer {\n      0% {\n        background-position: -200% center;\n      }\n      100% {\n        background-position: 200% center;\n      }\n    }\n\n    \/* \u4e3b\u5bb9\u5668 *\/\n    .container {\n      width: 100%;\n      max-width: 420px;\n      background: var(--card-bg);\n      border-radius: 24px;\n      overflow: hidden;\n      box-shadow: var(--shadow);\n      position: relative;\n      z-index: 1;\n      animation: slideIn 0.5s ease;\n      display: none;\n    }\n\n    \/* \u5934\u90e8 *\/\n    .header {\n      background: var(--primary-gradient);\n      color: #ffffff;\n      padding: 24px 16px;\n      text-align: center;\n      position: relative;\n      overflow: hidden;\n    }\n\n    .header::before {\n      content: '';\n      position: absolute;\n      top: -30px;\n      left: -30px;\n      width: 80px;\n      height: 80px;\n      background: rgba(255, 255, 255, 0.15);\n      border-radius: 50%;\n    }\n\n    .header::after {\n      content: '';\n      position: absolute;\n      bottom: -60px;\n      right: -60px;\n      width: 150px;\n      height: 150px;\n      background: rgba(255, 255, 255, 0.1);\n      border-radius: 50%;\n    }\n\n    .header h1 {\n      font-size: 1.4rem;\n      font-weight: 700;\n      margin-bottom: 8px;\n      position: relative;\n      z-index: 2;\n    }\n\n    .header p {\n      font-size: 0.9rem;\n      opacity: 0.9;\n      line-height: 1.4;\n      position: relative;\n      z-index: 2;\n    }\n\n    .header-icon {\n      font-size: 48px;\n      margin-bottom: 10px;\n      display: inline-block;\n      animation: bounce 2s ease infinite;\n    }\n\n    @keyframes bounce {\n      0%, 100% { transform: translateY(0); }\n      50% { transform: translateY(-10px); }\n    }\n\n    \/* \u7248\u672c\u5bf9\u6bd4 *\/\n    .version-comparison {\n      display: flex;\n      flex-wrap: nowrap;\n      gap: 12px;\n      padding: 16px;\n      margin-top: 8px;\n      position: relative;\n      z-index: 10;\n    }\n\n    .version-card {\n      flex: 1;\n      min-width: 45%;\n      background: var(--card-bg);\n      border-radius: 16px;\n      padding: 28px 16px 16px;\n      box-shadow: var(--shadow);\n      text-align: center;\n      position: relative;\n      transition: transform 0.3s ease, box-shadow 0.3s ease;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n    }\n\n    .version-card:hover {\n      transform: translateY(-4px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .version-card.current-version {\n      background: linear-gradient(135deg, #ffffff 0%, #f8f9ff 100%);\n      border: 1px solid rgba(78, 110, 242, 0.15);\n    }\n\n    .version-card.current-version:hover {\n      box-shadow: 0 6px 20px rgba(78, 110, 242, 0.15);\n    }\n\n    .version-card.current-version h3,\n    .version-card.current-version .version-number,\n    .version-card.current-version .version-date {\n      color: var(--text-main);\n    }\n\n    .version-card.latest-version {\n      background: var(--latest-gradient);\n      background-size: 300% 300%;\n      box-shadow: var(--glow-shadow), var(--shadow);\n      color: #fff;\n      z-index: 2;\n      animation: gradientAnimation 6s ease infinite, breathe 3s ease-in-out infinite;\n      position: relative;\n      overflow: hidden;\n    }\n\n    .version-card.latest-version::before {\n      content: '';\n      position: absolute;\n      top: -50%;\n      left: -50%;\n      width: 200%;\n      height: 200%;\n      background: linear-gradient(\n        90deg,\n        transparent,\n        rgba(255, 255, 255, 0.3),\n        transparent\n      );\n      transform: rotate(45deg);\n      animation: shimmer 3s infinite;\n    }\n\n    .version-card.latest-version h3,\n    .version-card.latest-version .version-number,\n    .version-card.latest-version .version-date {\n      color: #fff;\n      text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\n      position: relative;\n      z-index: 1;\n    }\n\n    .version-status {\n      position: absolute;\n      top: 6px;\n      right: 6px;\n      padding: 3px 7px;\n      font-size: 0.65rem;\n      font-weight: 600;\n      border-radius: 6px;\n      color: #fff;\n      line-height: 1.2;\n      white-space: nowrap;\n      z-index: 2;\n    }\n\n    .version-card.latest-version .version-status {\n      background: rgba(255, 255, 255, 0.25);\n      backdrop-filter: blur(5px);\n      border: 1px solid rgba(255, 255, 255, 0.3);\n      color: #fff;\n      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n    }\n\n    .status-outdated { background: var(--warning-color); }\n    .status-latest { background: var(--success-color); }\n    .status-invalid { background: var(--error-color); }\n\n    .version-card h3 {\n      font-size: 0.9rem;\n      color: var(--text-secondary);\n      margin-bottom: 8px;\n      font-weight: 500;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 6px;\n    }\n\n    .version-number {\n      font-size: 1.25rem;\n      font-weight: 700;\n      color: var(--text-main);\n      margin: 8px 0;\n      transition: all 0.3s ease;\n      font-family: 'Courier New', monospace;\n    }\n\n    .version-card.latest-version .version-number {\n      font-size: 1.4rem;\n      transform: scale(1.05);\n      text-shadow: \n        0 2px 4px rgba(0, 0, 0, 0.3),\n        0 0 10px rgba(212, 175, 55, 0.8),\n        0 0 20px rgba(212, 175, 55, 0.5);\n      animation: pulse-glow 2s ease-in-out infinite;\n    }\n\n    @keyframes pulse-glow {\n      0%, 100% {\n        text-shadow: \n          0 2px 4px rgba(0, 0, 0, 0.3),\n          0 0 10px rgba(212, 175, 55, 0.8),\n          0 0 20px rgba(212, 175, 55, 0.5);\n      }\n      50% {\n        text-shadow: \n          0 2px 4px rgba(0, 0, 0, 0.3),\n          0 0 15px rgba(212, 175, 55, 1),\n          0 0 30px rgba(212, 175, 55, 0.7);\n      }\n    }\n\n    .version-date {\n      font-size: 0.8rem;\n      color: var(--text-secondary);\n      margin-top: 4px;\n    }\n\n    \/* \u7248\u672c\u5bf9\u6bd4\u6307\u793a\u5668 *\/\n    .version-indicator {\n      position: absolute;\n      left: 50%;\n      top: 50%;\n      transform: translate(-50%, -50%);\n      z-index: 5;\n      width: 32px;\n      height: 32px;\n      border-radius: 50%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n      color: white;\n    }\n\n    .version-indicator.update-needed {\n      background: var(--error-color);\n      box-shadow: 0 2px 8px rgba(234, 84, 85, 0.4);\n      animation: pulse-indicator 1.5s infinite;\n    }\n\n    .version-indicator.is-latest {\n      background: var(--success-color);\n      box-shadow: 0 2px 8px rgba(40, 199, 111, 0.4);\n    }\n\n    @keyframes pulse-indicator {\n      0% { transform: translate(-50%, -50%) scale(1); }\n      50% { transform: translate(-50%, -50%) scale(1.1); }\n      100% { transform: translate(-50%, -50%) scale(1); }\n    }\n\n    \/* \u5185\u5bb9\u533a *\/\n    .content-container {\n      padding: 16px;\n    }\n\n    \/* \u72b6\u6001\u63d0\u793a *\/\n    .status-alert {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      padding: 12px 16px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 10px;\n      font-weight: 500;\n      font-size: 14px;\n      animation: slideIn 0.5s ease 0.3s backwards;\n    }\n\n    .status-alert i {\n      font-size: 20px;\n    }\n\n    .status-alert.update-available {\n      background: linear-gradient(135deg, #ffeaa7 0%, #fdcb6e 100%);\n      color: #d63031;\n      box-shadow: 0 4px 15px rgba(253, 203, 110, 0.4);\n    }\n\n    .status-alert.up-to-date {\n      background: linear-gradient(135deg, #55efc4 0%, #00b894 100%);\n      color: white;\n      box-shadow: 0 4px 15px rgba(0, 184, 148, 0.4);\n    }\n\n    \/* \u66f4\u65b0\u5bb9\u5668 *\/\n    .update-container {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      animation: slideIn 0.5s ease 0.4s backwards;\n    }\n\n    .update-header {\n      background: var(--light-bg);\n      padding: 12px 16px;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      border-bottom: 1px solid var(--border-color);\n    }\n\n    .update-header h2 {\n      font-size: 1rem;\n      font-weight: 600;\n      color: var(--text-main);\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .update-header h2 i {\n      color: #4e6ef2;\n    }\n\n    .update-tag {\n      background: rgba(78, 110, 242, 0.1);\n      color: #4e6ef2;\n      padding: 4px 8px;\n      border-radius: 8px;\n      font-size: 0.75rem;\n      font-weight: 600;\n    }\n\n    .update-content {\n      padding: 16px;\n    }\n\n    .update-date {\n      font-weight: 600;\n      color: #4e6ef2;\n      margin-bottom: 12px;\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      padding: 8px 0;\n      border-bottom: 1px dashed #e0e0e0;\n    }\n\n    .update-text {\n      margin: 8px 0;\n      position: relative;\n      padding-left: 16px;\n      line-height: 1.5;\n      color: var(--text-main);\n      font-size: 0.95rem;\n      white-space: pre-wrap;\n      word-break: break-word;\n    }\n\n    .update-text::before {\n      content: '\u2022';\n      position: absolute;\n      left: 0;\n      font-weight: bold;\n      color: #4e6ef2;\n      font-size: 1.2rem;\n      line-height: 1;\n    }\n\n    \/* \u5386\u53f2\u65e5\u5fd7 *\/\n    .history-container {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      animation: slideIn 0.5s ease 0.5s backwards;\n    }\n\n    .history-header {\n      background: var(--light-bg);\n      padding: 12px 16px;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      border-bottom: 1px solid var(--border-color);\n      cursor: pointer;\n      user-select: none;\n    }\n\n    .history-header:hover {\n      opacity: 0.8;\n    }\n\n    .history-header h2 {\n      font-size: 1rem;\n      font-weight: 600;\n      color: var(--text-main);\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .history-header h2 i {\n      color: #4e6ef2;\n    }\n\n    .toggle-history {\n      background: none;\n      border: none;\n      color: var(--text-secondary);\n      cursor: pointer;\n      font-weight: 500;\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      font-size: 0.85rem;\n      transition: color 0.2s ease;\n    }\n\n    .toggle-history:hover {\n      color: #4e6ef2;\n    }\n\n    .history-content {\n      padding: 0 16px;\n      max-height: 0;\n      overflow: hidden;\n      transition: max-height 0.4s ease, padding 0.4s ease;\n    }\n\n    .history-content.expanded {\n      max-height: 60vh;\n      overflow-y: auto;\n      padding: 16px;\n      scrollbar-width: thin;\n      scrollbar-color: #4e6ef2 #f0f0f0;\n    }\n\n    .history-content.expanded::-webkit-scrollbar {\n      width: 6px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-track {\n      background: #f0f0f0;\n      border-radius: 4px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-thumb {\n      background: #4e6ef2;\n      border-radius: 4px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-thumb:hover {\n      background: #3a56d0;\n    }\n\n    .history-item {\n      margin-bottom: 16px;\n      padding-bottom: 16px;\n      border-bottom: 1px dashed var(--border-color);\n    }\n\n    .history-item:last-child {\n      border-bottom: none;\n      margin-bottom: 0;\n      padding-bottom: 0;\n    }\n\n    .history-date {\n      font-weight: 600;\n      color: var(--text-main);\n      margin-bottom: 8px;\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      font-size: 0.9rem;\n      background: rgba(78, 110, 242, 0.05);\n      padding: 6px 10px;\n      border-radius: 6px;\n    }\n\n    .history-text {\n      margin: 8px 0;\n      padding-left: 16px;\n      line-height: 1.4;\n      color: var(--text-secondary);\n      position: relative;\n      font-size: 0.9rem;\n      white-space: pre-wrap;\n      word-break: break-word;\n    }\n\n    .history-text::before {\n      content: '\u2022';\n      position: absolute;\n      left: 0;\n      color: #4e6ef2;\n      font-weight: bold;\n      font-size: 1.2rem;\n      line-height: 1;\n    }\n\n    \/* \u6309\u94ae\u7ec4 *\/\n    .button-group {\n      display: flex;\n      flex-direction: column;\n      gap: 10px;\n      margin-bottom: 16px;\n    }\n\n    .button {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 10px;\n      padding: 14px 28px;\n      text-align: center;\n      font-size: 1rem;\n      border: none;\n      border-radius: 12px;\n      text-decoration: none;\n      background: var(--primary-gradient);\n      color: white;\n      font-weight: 600;\n      transition: all 0.3s ease;\n      box-shadow: var(--shadow);\n      position: relative;\n      overflow: hidden;\n      cursor: pointer;\n    }\n\n    .button i {\n      font-size: 1rem;\n    }\n\n    .button::after {\n      content: '';\n      position: absolute;\n      top: -50%;\n      left: -50%;\n      width: 200%;\n      height: 200%;\n      background: rgba(255, 255, 255, 0.1);\n      transform: rotate(30deg);\n      transition: all 0.6s ease;\n      pointer-events: none;\n    }\n\n    .button:hover {\n      transform: translateY(-3px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .button:hover::after {\n      transform: rotate(30deg) translate(20%, 20%);\n    }\n\n    .button:active {\n      transform: scale(0.95);\n    }\n\n    \/* \u9519\u8bef\u72b6\u6001 *\/\n    .error-state {\n      text-align: center;\n      padding: 40px 20px;\n      color: var(--text-main);\n    }\n\n    .error-icon {\n      font-size: 64px;\n      margin-bottom: 20px;\n      color: var(--error-color);\n    }\n\n    .error-text {\n      font-size: 16px;\n      line-height: 1.6;\n      margin-bottom: 20px;\n    }\n\n    .retry-button {\n      background: var(--primary-gradient);\n      color: white;\n      padding: 12px 30px;\n      border-radius: 12px;\n      border: none;\n      font-weight: 600;\n      cursor: pointer;\n      transition: all 0.3s ease;\n      font-size: 14px;\n      box-shadow: var(--shadow);\n    }\n\n    .retry-button:hover {\n      transform: translateY(-2px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .retry-button:active {\n      transform: scale(0.95);\n    }\n\n    \/* \u88c5\u9970\u5143\u7d20 *\/\n    .decoration {\n      position: absolute;\n      z-index: 0;\n      pointer-events: none;\n    }\n\n    .decoration.circle {\n      width: 120px;\n      height: 120px;\n      border-radius: 50%;\n      background: rgba(107, 45, 216, 0.05);\n      top: 10%;\n      left: 10%;\n    }\n\n    .decoration.square {\n      width: 80px;\n      height: 80px;\n      transform: rotate(45deg);\n      background: rgba(78, 110, 242, 0.05);\n      bottom: 10%;\n      right: 10%;\n    }\n\n    \/* \u54cd\u5e94\u5f0f *\/\n    @media (max-width: 768px) {\n      body {\n        padding: 12px;\n      }\n\n      .container {\n        max-width: 100%;\n        border-radius: 20px;\n      }\n\n      .header {\n        padding: 20px 15px;\n      }\n\n      .header h1 {\n        font-size: 1.3rem;\n      }\n\n      .header-icon {\n        font-size: 40px;\n      }\n\n      .version-comparison {\n        flex-direction: row;\n        flex-wrap: nowrap;\n        gap: 10px;\n        padding: 12px;\n        margin-top: 6px;\n        overflow-x: auto;\n      }\n\n      .version-card {\n        min-width: 45%;\n        padding: 26px 12px 12px;\n      }\n\n      \/* \u79fb\u52a8\u7aef\u51cf\u5f31\u547c\u5438\u52a8\u6548 *\/\n      .version-card.latest-version {\n        animation: gradientAnimation 6s ease infinite;\n      }\n\n      .version-status {\n        top: 5px;\n        right: 5px;\n        padding: 2px 5px;\n        font-size: 0.6rem;\n      }\n\n      .version-number {\n        font-size: 1.1rem;\n      }\n\n      .version-card.latest-version .version-number {\n        font-size: 1.2rem;\n      }\n\n      .update-header h2, .history-header h2 {\n        font-size: 0.9rem;\n      }\n\n      .button {\n        padding: 12px 24px;\n        font-size: 0.95rem;\n      }\n\n      .history-content.expanded {\n        max-height: 50vh;\n        -webkit-overflow-scrolling: touch;\n      }\n    }\n\n    @media (max-width: 380px) {\n      .header h1 {\n        font-size: 1.2rem;\n      }\n\n      .version-number {\n        font-size: 1rem;\n      }\n\n      .version-card.latest-version .version-number {\n        font-size: 1.1rem;\n      }\n\n      .button {\n        padding: 11px;\n        font-size: 0.9rem;\n      }\n    }\n  <\/style>\n<\/head>\n<body>\n  <div class=\"decoration circle\"><\/div>\n  <div class=\"decoration square\"><\/div>\n\n  <div id=\"loading\" class=\"loading-wrapper\">\n    <div class=\"loading-spinner\"><\/div>\n    <div class=\"loading-text\"><i class=\"fas fa-search\"><\/i> \u6b63\u5728\u68c0\u67e5\u66f4\u65b0...<\/div>\n  <\/div>\n\n  <div class=\"container\" id=\"container\">\n    <div class=\"header\">\n      <div class=\"header-icon\"><i class=\"fas fa-book\"><\/i><\/div>\n      <h1>\u5927\u7070\u72fc\u4e66\u6e90\u66f4\u65b0<\/h1>\n      <p>\u63a8\u8350\u4f7f\u7528\u9605\u8bfb\u6d4b\u8bd5\u7248<br>\u6b63\u5f0f\u7248\u53ef\u80fd\u5b58\u5728\u517c\u5bb9\u6027\u95ee\u9898<\/p>\n    <\/div>\n\n    <div class=\"version-comparison\">\n      <div class=\"version-card current-version\">\n        <div class=\"version-status status-outdated\" id=\"currentStatus\">\u5f85\u68c0\u67e5<\/div>\n        <h3><i class=\"fas fa-cube\"><\/i> \u5f53\u524d\u7248\u672c<\/h3>\n        <div class=\"version-number\" id=\"currentVersion\">-<\/div>\n        <div class=\"version-date\">\u60a8\u7684\u5f53\u524d\u7248\u672c<\/div>\n      <\/div>\n\n      <div class=\"version-indicator update-needed\" id=\"versionIndicator\" style=\"display: none;\">\n        <i class=\"fas fa-arrow-right\"><\/i>\n      <\/div>\n\n      <div class=\"version-card latest-version\">\n        <div class=\"version-status status-latest\" id=\"latestStatus\">\u6700\u65b0\u7248\u672c<\/div>\n        <h3><i class=\"fas fa-star\"><\/i> \u6700\u65b0\u7248\u672c<\/h3>\n        <div class=\"version-number\" id=\"latestVersion\">-<\/div>\n        <div class=\"version-date\">\u53ef\u7528\u6700\u65b0\u7248\u672c<\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"content-container\">\n      <div class=\"status-alert\" id=\"statusAlert\" style=\"display: none;\"><\/div>\n\n      <div id=\"latestLogContainer\" style=\"display: none;\">\n        <div class=\"update-container\">\n          <div class=\"update-header\">\n            <h2><i class=\"fas fa-bolt\"><\/i> \u6700\u65b0\u66f4\u65b0<\/h2>\n            <div class=\"update-tag\">\u6700\u65b0\u53d1\u5e03<\/div>\n          <\/div>\n          <div class=\"update-content\">\n            <div class=\"update-date\" id=\"latestLogDate\"><\/div>\n            <div class=\"update-text\" id=\"latestLogContent\"><\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"button-group\" id=\"buttonGroup\" style=\"display: none;\"><\/div>\n\n      <div class=\"history-container\" id=\"logs\" style=\"display: none;\">\n        <div class=\"history-header\" onclick=\"toggleLogs()\">\n          <h2><i class=\"fas fa-history\"><\/i> \u5386\u53f2\u66f4\u65b0 <span id=\"historyCount\"><\/span><\/h2>\n          <button class=\"toggle-history\" id=\"toggleButton\">\n            <span id=\"toggleText\">\u5c55\u5f00\u5386\u53f2<\/span>\n            <i class=\"fas fa-chevron-down\" id=\"toggleIcon\"><\/i>\n          <\/button>\n        <\/div>\n        <div class=\"history-content\" id=\"logList\"><\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <script>\n  let logsCollapsed = true;\n\n  function toggleLogs() {\n    logsCollapsed = !logsCollapsed;\n    const logList = document.getElementById('logList');\n    const toggleText = document.getElementById('toggleText');\n    const toggleIcon = document.getElementById('toggleIcon');\n    \n    if (logsCollapsed) {\n      logList.classList.remove('expanded');\n      toggleText.textContent = '\u5c55\u5f00\u5386\u53f2';\n      toggleIcon.className = 'fas fa-chevron-down';\n    } else {\n      logList.classList.add('expanded');\n      toggleText.textContent = '\u6536\u8d77\u5386\u53f2';\n      toggleIcon.className = 'fas fa-chevron-up';\n    }\n  }\n\n  (async function() {\n    const loading = document.getElementById('loading');\n    const container = document.getElementById('container');\n    const currentVersion = document.getElementById('currentVersion');\n    const latestVersion = document.getElementById('latestVersion');\n    const currentStatus = document.getElementById('currentStatus');\n    const latestStatus = document.getElementById('latestStatus');\n    const versionIndicator = document.getElementById('versionIndicator');\n    const statusAlert = document.getElementById('statusAlert');\n    const buttonGroup = document.getElementById('buttonGroup');\n    const latestLogContainer = document.getElementById('latestLogContainer');\n    const latestLogDate = document.getElementById('latestLogDate');\n    const latestLogContent = document.getElementById('latestLogContent');\n    const logsContainer = document.getElementById('logs');\n    const logList = document.getElementById('logList');\n    const historyCount = document.getElementById('historyCount');\n\n    const localVer = '${String(localVersion)}';\n\n    \/\/ \u7edf\u4e00\u7684\u670d\u52a1\u5668\u914d\u7f6e - \u65b9\u4fbf\u7ef4\u62a4\n    const serverConfig = {\n      main: {\n        name: '\u4e3b\u7ebf\u8def',\n        icon: 'rocket',\n        baseUrl: 'https:\/\/sy.dashabi.tk',\n        downloadPath: '\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup1: {\n        name: '\u5907\u7528\u7ebf\u8def1',\n        icon: 'box',\n        baseUrl: 'https:\/\/api.langge.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup2: {\n        name: '\u5907\u7528\u7ebf\u8def2',\n        icon: 'satellite',\n        baseUrl: 'https:\/\/20.langge.tk',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup3: {\n        name: '\u5907\u7528\u7ebf\u8def3',\n        icon: 'link',\n        baseUrl: 'http:\/\/219.154.201.122:5006',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup4: {\n        name: '\u5907\u7528\u7ebf\u8def4',\n        icon: 'bolt',\n        baseUrl: 'https:\/\/v2.czyl.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup5: {\n        name: '\u5907\u7528\u7ebf\u8def5',\n        icon: 'globe',\n        baseUrl: 'https:\/\/v10.czyl.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup6: {\n        name: '\u5907\u7528\u7ebf\u8def6',\n        icon: 'broadcast-tower',\n        baseUrl: 'https:\/\/v4.czyl.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      }\n    };\n\n    \/\/ \u7248\u672c\u6bd4\u8f83\u51fd\u6570\n    function compareVersions(vs) {\n      const normalize = (v) => {\n        return v.split('.').map(n => {\n          const num = parseInt(n, 10);\n          return isNaN(num) ? 0 : num;\n        });\n      };\n\n      const parts1 = normalize(localVer);\n      const parts2 = normalize(vs);\n      const maxLength = Math.max(parts1.length, parts2.length);\n      \n      for (let i = 0; i < maxLength; i++) {\n        const num1 = parts1[i] || 0;\n        const num2 = parts2[i] || 0;\n        if (num1 > num2) return 1;\n        if (num1 < num2) return -1;\n      }\n      return 0;\n    }\n\n    async function fetchVersionData() {\n      \/\/ \u4f7f\u7528\u7edf\u4e00\u914d\u7f6e\u4e2d\u9664\u4e3b\u7ebf\u8def\u5916\u7684\u5907\u7528\u7ebf\u8def\u8fdb\u884c\u7248\u672c\u68c0\u67e5\n      const serversToCheck = Object.values(serverConfig).filter(s => s.baseUrl.includes('czyl.cf') || s.baseUrl.includes('219.154'));\n      \n      for (const server of serversToCheck) {\n        try {\n          const response = await fetch(server.baseUrl + '\/version', { timeout: 2000 });\n          if (response.ok) {\n            return await response.json();\n          }\n        } catch (e) {\n          console.warn(\\`\u63a5\u53e3\u5931\u8d25\uff1a\\${server.baseUrl}\\`, e);\n        }\n      }\n      throw new Error('\u6240\u6709\u66f4\u65b0\u63a5\u53e3\u90fd\u8bf7\u6c42\u5931\u8d25');\n    }\n\n    function showError(message) {\n      loading.innerHTML = \\`\n        <div class=\"error-state\">\n          <div class=\"error-icon\"><i class=\"fas fa-exclamation-triangle\"><\/i><\/div>\n          <div class=\"error-text\">\\${message}<\/div>\n          <button class=\"retry-button\" onclick=\"location.reload()\"><i class=\"fas fa-redo\"><\/i> \u91cd\u8bd5<\/button>\n        <\/div>\n      \\`;\n    }\n\n    try {\n      const data = await fetchVersionData();\n      const cloudVersion = String(data.version3);\n      const updateLog = data.update_log || {};\n\n      \/\/ \u663e\u793a\u7248\u672c\u4fe1\u606f\n      currentVersion.textContent = \\`v\\${localVer}\\`;\n      latestVersion.textContent = \\`v\\${cloudVersion}\\`;\n\n      \/\/ \u5904\u7406\u65e5\u5fd7\n      const logEntries = Object.entries(updateLog);\n      if (logEntries.length > 0) {\n        \/\/ \u663e\u793a\u6700\u65b0\u65e5\u5fd7\n        const [latestDate, latestContent] = logEntries[0];\n        latestLogDate.innerHTML = \\`<i class=\"fas fa-calendar-alt\"><\/i> \\${latestDate}\\`;\n        latestLogContent.textContent = latestContent;\n        latestLogContainer.style.display = 'block';\n\n        \/\/ \u663e\u793a\u5386\u53f2\u65e5\u5fd7\n        if (logEntries.length > 1) {\n          const historyLogs = logEntries.slice(1);\n          historyCount.textContent = \\`(\\${historyLogs.length}\u6761)\\`;\n          logList.innerHTML = historyLogs.map(([date, content]) => \\`\n            <div class=\"history-item\">\n              <div class=\"history-date\">\n                <i class=\"fas fa-calendar-day\"><\/i>\n                <span>\\${date}<\/span>\n              <\/div>\n              <div class=\"history-text\">\\${content}<\/div>\n            <\/div>\n          \\`).join('');\n          logsContainer.style.display = 'block';\n        }\n      }\n\n      \/\/ \u68c0\u67e5\u66f4\u65b0\u72b6\u6001\n      const compareResult = compareVersions(cloudVersion);\n      \n      \/\/ \u663e\u793a\u7248\u672c\u6307\u793a\u5668\n      versionIndicator.style.display = 'flex';\n      \n      if (compareResult === -1) {\n        \/\/ \u9700\u8981\u66f4\u65b0\n        currentStatus.textContent = '\u5f85\u66f4\u65b0';\n        currentStatus.className = 'version-status status-outdated';\n        versionIndicator.className = 'version-indicator update-needed';\n        versionIndicator.innerHTML = '<i class=\"fas fa-arrow-right\"><\/i>';\n\n        \/\/ \u4f7f\u7528\u7edf\u4e00\u914d\u7f6e\u751f\u6210\u4e0b\u8f7d\u6309\u94ae\n        buttonGroup.innerHTML = Object.values(serverConfig).map(server => {\n          const fullUrl = server.baseUrl + server.downloadPath;\n          return \\`\n            <a href=\"yuedu:\/\/booksource\/importonline?src=\\${encodeURIComponent(fullUrl)}\" class=\"button\">\n              <i class=\"fas fa-\\${server.icon}\"><\/i>\n              <span>\\${server.name}<\/span>\n            <\/a>\n          \\`;\n        }).join('');\n        buttonGroup.style.display = 'flex';\n      } else {\n        \/\/ \u5df2\u662f\u6700\u65b0\u7248\u672c\n        currentStatus.textContent = '\u6700\u65b0';\n        currentStatus.className = 'version-status status-latest';\n        versionIndicator.className = 'version-indicator is-latest';\n        versionIndicator.innerHTML = '<i class=\"fas fa-check\"><\/i>';\n        \n        statusAlert.className = 'status-alert up-to-date';\n        statusAlert.innerHTML = '<i class=\"fas fa-check-circle\"><\/i> <div>\u60a8\u5df2\u662f\u6700\u65b0\u7248\u672c<\/div>';\n        statusAlert.style.display = 'flex';\n      }\n\n      \/\/ \u663e\u793a\u4e3b\u5bb9\u5668\uff0c\u9690\u85cf\u52a0\u8f7d\n      loading.style.display = 'none';\n      container.style.display = 'block';\n\n    } catch (err) {\n      console.error('\u7248\u672c\u68c0\u67e5\u5931\u8d25\uff1a', err);\n      showError('<i class=\"fas fa-exclamation-circle\"><\/i> \u68c0\u67e5\u66f4\u65b0\u5931\u8d25\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5<br><small>' + err.message + '<\/small>');\n    }\n  })();\n  <\/script>\n<\/body>\n<\/html>\n`;\n    java.startBrowser(`data:text\/html;base64,${java.base64Encode(html)}`, '\u5927\u7070\u72fc\u4e66\u6e90\u66f4\u65b0');\n}","respondTime":180000,"ruleBookInfo":{"author":"$.author","canReName":"1","coverUrl":"$.thumb_url","init":"<js>\nif (String(baseUrl).startsWith(\"data:\")) {\n    let res = JSON.parse(java.hexDecodeToString(result));\n    let book_id = res.book_id;\n    let tab = res.tab;\n    let sources = res.sources;\n    let url = res.url;\n    let html = \"\";\n    let proxy = getArguments(source.getVariable(), \"proxy\");\n    if (url != \"\" && proxy == \"\u672c\u5730\") {\n        if (sources == '69\u4e66\u5427') {\n            let ck69 = String(cookie.getCookie(url));\n            let headers = {\n                \"Cookie\": ck69\n            };\n            let op = JSON.stringify({\n                \"headers\": headers\n            });\n            html = java.ajax(url + ',' + op);\n        } else {\n            html = java.ajax(url);\n        }\n        \/\/java.log(html);\n        if (html.includes(\"Just a moment...\") && sources == '69\u4e66\u5427') {\n            cookie.removeCookie(url);\n            var x = `https:\/\/www.69shuba.com`;\n            java.longToast('\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1');\n            var s = java.startBrowserAwait(x, \"\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1\").body();\n\n            let ck69 = String(cookie.getCookie(url));\n            let headers = {\n                \"Cookie\": ck69\n            };\n            let op = JSON.stringify({\n                \"headers\": headers\n            });\n            java.log(op);\n            html = java.ajax(url + ',' + op);\n            \/\/java.log(html);\n        }\n    }\n    let base_url = getArguments(source.getVariable(), \"server\");\n    let op = {\n        method: \"POST\",\n        body: {\n            html: html\n        }\n    };\n    op = JSON.stringify(op);\n    let varia = String(book.getVariable('custom'));\n    if (varia == 'null') {\n        varia = '';\n    }\n    varia = JSON.stringify({\n        'custom': varia\n    });\n    \/\/varia = java.base64Encode(varia);\n    java.log(`${base_url}\/detail?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\n    result = java.ajax(`${base_url}\/detail?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\n}\nresult\n<\/js>$.data","intro":"<js>\nlet {\n    book_id,\n    source: sources,\n    tab,\n    book_tts,\n    tags,\n    role,\n    last_chapter_title,\n    last_chapter_update_time,\n    word_number,\n    status,\n    score,\n    abstract,\n    copyright_info\n} = result;\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (proxy == \"\u672c\u5730\") {\n    proxy = \"\u672c\u5730\u7f51\u7edc\";\n} else {\n    proxy = \"\u670d\u52a1\u5668\u7f51\u7edc\";\n}\njava.put(\"book_detail\", JSON.stringify(result));\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet key = \"\";\ntry {\n    let cookieValue =\n        String(cookie.getCookie(base_url)) || String(java.getCookie(base_url));\n    key = getKey(cookieValue);\n} catch (e) {\n    key = \"\";\n}\n\nif (key == \"\") {\n    java.log(\"\u5f53\u524d\u670d\u52a1\u5668\u672a\u67e5\u8be2\u5230\u767b\u5f55\u72b6\u6001\uff0c\u5c1d\u8bd5\u67e5\u8be2\u5176\u4ed6\u670d\u52a1\u5668\u767b\u5f55\u72b6\u6001...\");\n    let cookieValue;\n    for (let h of host) {\n        try {\n            cookieValue = String(cookie.getCookie(h)) || String(java.getCookie(h));\n            key = getKey(cookieValue);\n        } catch (e) {\n            key = \"\";\n        }\n        if (key) {\n            java.log(`\u5df2\u5728${h}\u767b\u5f55\uff0c\u9000\u51fa\u67e5\u8be2\uff0c\u6b63\u5728\u8f6c\u79fb\u767b\u5f55\u72b6\u6001\u5230\u5f53\u524d\u670d\u52a1${base_url}`);\n            \/\/java.log(cookieValue)\n            removeCookie(h);\n            removeCookie(base_url);\n            cookie.setCookie(base_url, cookieValue);\n            break;\n        }\n    }\n}\n\nif (book.readConfig == null || book.readConfig.useReplaceRule == null) {\n    book.setUseReplaceRule(false);\n}\n\nlet nickname = '\u8d26\u53f7\u72b6\u6001\uff1a\u26a0\ufe0f \u672a\u767b\u5f55 | \u70b9\u51fb\u53f3\u4e0a\u89d2 \ud83d\udd16 \u767b\u5f55';\ntry {\n    let opcx = {\n        method: \"GET\",\n        headers: {\n            cookie: 'qttoken=' + key + ';'\n        },\n    };\n    opcx = JSON.stringify(opcx);\n    let user_info = JSON.parse(java.ajax(base_url + '\/get_avatar,' + opcx));\n    if (user_info.code == 0) {\n        if (user_info.nickname) {\n            nickname = '\u6b22\u8fce\u56de\u6765\uff1a' + user_info.nickname\n        } else {\n            nickname = '\u6b22\u8fce\u56de\u6765\uff1a' + user_info.email + \"(\u8bf7\u524d\u5f80\u7528\u6237\u540e\u53f0\u8bbe\u7f6e\u7528\u6237\u540d)\"\n        }\n    }\n} catch (e) {\n    if (key) {\n        nickname = '\u8d26\u53f7\u72b6\u6001\uff1a\u5df2\u767b\u5f55'\n    }\n};\n\nlet loginStatus = nickname;\n\nlet lightDivider = \"\u2747\ufe0f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2747\ufe0f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2747\ufe0f\";\nlet heavyDivider = \"&lrm;\\n&lrm;\";\n\nlet isValid = (value) => String(value).length > 1;\nlet ctitle = book.durChapterTitle || '\u672a\u5f00\u59cb';\nlet info = `\n    \ud83d\udce1 \u5f53\u524d\u670d\u52a1\uff1a${base_url}\n    \ud83d\udd11 ${loginStatus}\n    \ud83c\udff7 \u6570\u636e\u6765\u6e90\uff1a${sources}\n    \ud83d\udd04 \u5f53\u524d\u6a21\u5f0f\uff1a${tab}\n    \u2699\ufe0f \u8bbf\u95ee\u6a21\u5f0f\uff1a${proxy}\n    \ud83d\udcd6 \u9605\u8bfb\u81f3\uff1a${ctitle}\n`;\n\nif (tab == \"\u542c\u4e66\") {\n    let toneId = getArguments(source.getVariable(), \"tone_id\");\n    if (isValid(book_tts)) {\n        info += `${lightDivider}\n    \ud83c\udfb5 \u97f3\u8272\u914d\u7f6e\uff1a${toneId}\n    ${book_tts}\n`;\n    }\n}\n\nlet basicInfo = \"\";\nlet addBasicInfo = (value, prefix, icon) => {\n    if (isValid(value)) basicInfo += `    ${icon} ${prefix} ${value}\\n`;\n};\n\naddBasicInfo(tags, \"\u4e66\u7c4d\u5206\u7c7b\uff1a\", \"\ud83c\udf08\");\naddBasicInfo(role, \"\u4e66\u7c4d\u4e3b\u89d2\uff1a\", \"\ud83d\udc51\");\naddBasicInfo(last_chapter_title, \"\u6700\u65b0\u7ae0\u8282\uff1a\", \"\ud83d\udcda\");\naddBasicInfo(last_chapter_update_time, \"\u66f4\u65b0\u65f6\u95f4\uff1a\", \"\u23f3\");\naddBasicInfo(word_number, \"\u4e66\u7c4d\u5b57\u6570\uff1a\", \"\ud83d\udcca\");\naddBasicInfo(status, \"\u4e66\u7c4d\u72b6\u6001\uff1a\", \"\ud83d\udea9\");\naddBasicInfo(score, \"\u4e66\u7c4d\u8bc4\u5206\uff1a\", \"\u2b50\");\n\nif (basicInfo) info += `${lightDivider}\\n${basicInfo}`;\n\nif (isValid(abstract)) {\n    let indentedAbstract = abstract\n        .split(\"\\n\")\n        .map((line) => `    ${line}`)\n        .join(\"\\n\");\n    info += `${heavyDivider}\n    \ud83d\udcd6 \u4e66\u7c4d\u7b80\u4ecb\uff1a\n${indentedAbstract}\n`;\n} else {\n    info += `${heavyDivider}`;\n}\n\nif (isValid(copyright_info)) {\n    info += `${lightDivider}\n    \u00a9 ${copyright_info}\n`;\n} else {\n    info += `${lightDivider}`;\n}\n\ninfo += `\n${heavyDivider}\n    \ud83d\udca0\ud83d\udca0\ud83d\udca0 \u6570\u636e\u66f4\u65b0\u4e8e ${new Date().toLocaleString()} \ud83d\udca0\ud83d\udca0\ud83d\udca0\n`;\nlet jjinfo = getArguments(source.getVariable(), \"info\");\n\nif (jjinfo != \"on\") {\n    info = String(info)\n        .split(\"\\n\")\n        .map((line) => line.replace(\/^ {4}\/, \"\"))\n        .join(\"\\n\");\n} else {\n    basicInfo = \"\";\n    addBasicInfo(last_chapter_title, \"\u6700\u65b0\u7ae0\u8282\uff1a\", \"\ud83d\udcda\");\n    addBasicInfo(last_chapter_update_time, \"\u66f4\u65b0\u65f6\u95f4\uff1a\", \"\u23f3\");\n    addBasicInfo(word_number, \"\u4e66\u7c4d\u5b57\u6570\uff1a\", \"\ud83d\udcca\");\n    addBasicInfo(status, \"\u4e66\u7c4d\u72b6\u6001\uff1a\", \"\ud83d\udea9\");\n    addBasicInfo(score, \"\u4e66\u7c4d\u8bc4\u5206\uff1a\", \"\u2b50\");\n    if (isValid(abstract)) {\n        let indentedAbstract = abstract\n            .split(\"\\n\")\n            .map((line) => `    ${line}`)\n            .join(\"\\n\");\n        basicInfo += `\n    \\n&lrm;\n    \ud83d\udcd6 \u4e66\u7c4d\u7b80\u4ecb\uff1a\n${indentedAbstract}\n`;\n    } else {\n        basicInfo += `${heavyDivider}`;\n    }\n    info = `&lrm;\\n\ud83c\udff7 \u6570\u636e\u6765\u6e90\uff1a${sources}\\n` + basicInfo;\n}\n<\/js>","lastChapter":"{{$.source}} {{$.last_chapter_title}} {{$.last_chapter_update_time}}","name":"$.book_name","tocUrl":"<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || \"\u5c0f\u8bf4\";\nlet url = result.toc_url || \"\";\nvar sdtoken;\ntry {\n    var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n    sdtoken = String(loginInfoMap['\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)'] || '');\n} catch (e) {\n    sdtoken = '';\n}\nvar rawCookie = getFanqieCookie() || sdtoken;\nvar match = rawCookie.match(\/sessionid=[^;]+\/);\nvar fqcookie = match ? match[0] : '';\nvar fqssionid = '';\nif (fqcookie) {\n    fqssionid = getSessionId(fqcookie);\n};\nsetArguments('fqssionid', fqssionid);\njava.put(\"tab\", tab);\njava.put(\"book_id\", book_id);\nlet qtcatalog = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url,\n};\nqtcatalog = java.base64Encode(JSON.stringify(qtcatalog));\n`data:;base64,${qtcatalog},{\"type\":\"qingtian2\"}`;\n<\/js>","wordCount":"$.word_number"},"ruleContent":{"content":"<js>\nresult = String(java.hexDecodeToString(result));\nlet res;\nif (result.match(\/\u5927\u7070\u72fc\u878d\u5408\/)) {\n    result = result.split(\"\u5927\u7070\u72fc\u878d\u54084\");\n    res = {\n        item_id: result[0],\n        tab: result[1],\n        title: result[2],\n        sources: result[3],\n        url: \"\"\n    };\n} else {\n    res = JSON.parse(result);\n}\nlet varia = String(book.getVariable('custom'));\nif (varia == 'null') {\n    varia = '';\n}\nvaria = JSON.stringify({\n    'custom': varia\n});\n\/\/  varia = java.base64Encode(varia);\nlet book_id = res.book_id;\nlet item_id = res.item_id;\nlet tab = res.tab;\nlet title = res.title;\nlet sources = res.sources;\nlet url = res.url;\nlet html = \"\";\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (url != \"\" && proxy == \"\u672c\u5730\") {\n    if (sources == '69\u4e66\u5427') {\n        let ck69 = String(cookie.getCookie(url));\n        let headers = {\n            \"Cookie\": ck69,\n            \"User-Agent\": \"Mozilla\/5.0 (Linux; Android 6.0; Nexus 5 Build\/MRA58N) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Mobile Safari\/537.36 Edg\/138.0.0.0\"\n        };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        java.log(url);\n        java.log(op);\n        html = java.ajax(url + ',' + op);\n    } else {\n        html = java.ajax(url);\n    }\n    java.log(html);\n    if (html.includes(\"Just a moment...\") && sources == '69\u4e66\u5427' && book.durChapterIndex === chapter.index) {\n        cookie.removeCookie(url);\n        var x = url;\n        java.longToast('\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1');\n        var s = java.startBrowserAwait(x, \"\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1\").body();\n\n        let ck69 = String(cookie.getCookie(url));\n        let headers = {\n            \"User-Agent\": \"Mozilla\/5.0 (Linux; Android 6.0; Nexus 5 Build\/MRA58N) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Mobile Safari\/537.36 Edg\/138.0.0.0\",\n            \"Cookie\": ck69\n        };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        java.log(op);\n        html = java.ajax(url + ',' + op);\n        \/\/java.log(html);\n    }\n};\nlet content = \"\";\nlet data;\nlet tone_id = getArguments(source.getVariable(), \"tone_id\");\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet device, device_type;\ntry {\n    device = java.deviceID();\n    device_type = \"\u82f9\u679c\";\n} catch (e) {\n    try {\n        device = java.androidId();\n        device_type = \"\u5b89\u5353\";\n    } catch (e) {\n        device = \"\";\n        device_type = \"\u5b89\u5353\";\n    }\n}\n\nlet qtcookie = cookie.getCookie(base_url);\ntry {\n    qtcookie = `qttoken=${String(cookie.getKey(base_url, \"qttoken\"))}; deviceId=${device};`\n} catch (e) {}\n\nvar params = {\n    html: html,\n    item_id: item_id,\n    source: sources,\n    tab: tab,\n    tone_id: tone_id,\n    variable: varia,\n    version: '4.11.5.1'\n};\n\nvar content_url = '\/content';\n\nif ((sources == \"\u756a\u8304\" || sources == \"\u4e03\u732b\" || sources == \"\u5854\u8bfb\") && getArguments(source.getVariable(), \"fqpara\") == \"on\" && tab == \"\u5c0f\u8bf4\") {\n    content_url = '\/content?review=1';\n}\n\n\/\/var signInfo = generateComplexSignature('POST', content_url, {}, APP_SECRET, params);\n\n\n\/\/var signedParams = copyObject(params);\n\/\/signedParams.timestamp = signInfo.timestamp;\n\/\/signedParams.nonce = signInfo.nonce;\n\/\/signedParams.sign = signInfo.sign;\n\n\nvar op = {\n    method: \"POST\",\n    body: JSON.stringify(params),\n    headers: {\n        cookie: qtcookie,\n        'Content-Type': 'application\/json'\n    }\n};\n\nop = JSON.stringify(op);\njava.log(op);\ndata = java.ajax(base_url + content_url + `,${op}`);\n\ntry {\n    data = JSON.parse(data);\n    if (data.msg) {\n        java.toast(data.msg);\n    }\n} catch (e) {}\n\ncontent = data.content\n\nif ((sources == \"\u756a\u8304\" || sources == \"\u4e03\u732b\" || sources == \"\u5854\u8bfb\") && getArguments(source.getVariable(), \"fqpara\") == \"on\" && tab == \"\u5c0f\u8bf4\") {\n    var fqssionid = getArguments(source.getVariable(), \"fqssionid\") || \"\";\n    content = content\n        .replace(\/ident=\"\/g, 'ident=\"' + base_url)\n        .replace(\/book_id=\/g, 'book_id=' + book_id + '&ssionid=' + fqssionid);\n    if (device_type == \"\u82f9\u679c\") {\n        content = paraForiOS(content, sources);\n    } else {\n        content = paraForAndroid(content, sources);\n    }\n\n\n}\ndata = JSON.stringify({\n    content: content,\n});\n\nif (device_type == \"\u5b89\u5353\" && (tab == \"\u77ed\u5267\" || tab == \"\u89c6\u9891\" || sources == '\u6bd2\u820c\u5f71\u89c6')) {\n    data = {\n        content: `\u3010\u53f3\u4e0a\u89d2\u5237\u65b0\u3011\u5f00\u542f\u64ad\u653e(\u4e0b\u4e00\u96c6\u8bf7\u5207\u6362\u4e0b\u4e00\u7ae0\u5237\u65b0)\\n\u64ad\u653e\u76f4\u94fe\uff1a\\n${content}`,\n    };\n    data = JSON.stringify(data);\n    if (book.durChapterIndex === chapter.index) {\n        let video_url = `${base_url}\/online_video?book_id=${book_id}&source=${sources}&tab=${tab}`;\n        if (sources == '\u6bd2\u820c\u5f71\u89c6') {\n            video_url = content;\n        };\n        java.startBrowser(video_url, title);\n        java.toast(\"\u6b63\u5728\u52a0\u8f7d\u89c6\u9891...\");\n    }\n\n}\ndata;\n<\/js>$.content","imageStyle":"TEXT"},"ruleExplore":{"author":"$.author","bookList":"$.data","bookUrl":"<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || '\u5c0f\u8bf4';\nlet url = result.toc_url || '';\n\nlet qtdetail = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url\n}\nqtdetail = java.base64Encode(JSON.stringify(qtdetail));\n`data:;base64,${qtdetail},{\"type\":\"qingtian\"}`\n<\/js>","coverUrl":"$.thumb_url","intro":"$.abstract","kind":"{{$.category}}\n{{$.score}}\n{{$.status}}\n{{$.source}}\n{{$.tags}}","lastChapter":"{{$.last_chapter_title}} \u2022 {{$.last_update_time}}","name":"$.book_name","wordCount":"$.word_number"},"ruleSearch":{"author":"$.author","bookList":"$.data","bookUrl":"<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || '\u5c0f\u8bf4';\nlet url = result.toc_url || '';\n\nlet qtdetail = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url\n}\nqtdetail = java.base64Encode(JSON.stringify(qtdetail));\n`data:;base64,${qtdetail},{\"type\":\"qingtian\"}`\n<\/js>","checkKeyWord":"\u6211\u768426\u5c81\u5973\u623f\u5ba2@\u756a\u8304","coverUrl":"$.thumb_url","intro":"$.abstract","kind":"{{$.status}},{{$.score}},{{$.tags}},{{$.last_chapter_update_time}}","lastChapter":"{{$.source}} {{$.last_chapter_title}}","name":"$.book_name##\uff08\u522b\u540d\uff1a.*?\uff09","wordCount":"$.word_number"},"ruleToc":{"chapterList":"<js>\nlet res = JSON.parse(java.hexDecodeToString(result));\nif (res.method) {\n    res = Object.fromEntries(\n        res.body\n        .replace(\"source\", \"sources\")\n        .split(\"&\")\n        .map((query) => query.split(\"=\"))\n    );\n    res.url = \"\";\n}\nlet book_id = res.book_id;\njava.put('book_id', book_id);\nlet tab = res.tab;\nlet sources = res.sources;\nlet url = res.url;\nlet html = \"\";\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (url != \"\" && proxy == \"\u672c\u5730\") {\n    if (sources == '69\u4e66\u5427') {\n        let ck69 = String(cookie.getCookie(url));\n        let headers = {\n            \"Cookie\": ck69\n        };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        html = java.ajax(url + ',' + op);\n    } else {\n        html = java.ajax(url);\n    }\n    \/\/java.log(html);\n    if (html.includes(\"Just a moment...\") && sources == '69\u4e66\u5427') {\n        cookie.removeCookie(url);\n        var x = `https:\/\/www.69shuba.com`;\n        java.longToast('\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1');\n        var s = java.startBrowserAwait(x, \"\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1\").body();\n\n        let ck69 = String(cookie.getCookie(url));\n        let headers = {\n            \"Cookie\": ck69\n        };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        \/\/java.log(op);\n        html = java.ajax(url + ',' + op);\n        \/\/java.log(html);\n    }\n};\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet op = {\n    method: \"POST\",\n    body: {\n        html: html\n    }\n};\nop = JSON.stringify(op);\nlet varia = String(book.getVariable('custom'));\nif (varia == 'null') {\n    varia = '';\n}\nvaria = JSON.stringify({\n    'custom': varia\n});\n\/\/ varia = java.base64Encode(varia);\n\/\/java.log(`${base_url}\/catalog?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\nlet data = java.ajax(\n    `${base_url}\/catalog?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`\n);\nlet device, device_type;\ntry {\n    device = java.deviceID();\n    device_type = \"\u82f9\u679c\";\n} catch (e) {\n    try {\n        device = java.androidId();\n        device_type = \"\u5b89\u5353\";\n    } catch (e) {\n        device = \"\";\n        device_type = \"\u5b89\u5353\";\n    }\n}\n\nif (tab == \"\u5c0f\u8bf4\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 8;\n    } else {\n        book.type = 0;\n    }\n} else if (tab == \"\u542c\u4e66\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 32;\n    } else {\n        book.type = 1;\n    }\n} else if (tab == \"\u6f2b\u753b\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 64;\n    } else {\n        book.type = 2;\n    }\n} else if (tab == \"\u77ed\u5267\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 8;\n    } else {\n        book.type = 3;\n    }\n} else {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 8;\n    } else {\n        book.type = 0;\n    }\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet reading = getArguments(source.getVariable(), \"reading\");\n\nif (book && book.order != 0 && reading == '1') {\n    try {\n        if (!data || !book.variable || !base_url || !qtcookie) {\n            java.log('\u7f3a\u5c11\u5fc5\u8981\u53c2\u6570');\n        } else {\n            let parsedData;\n            try {\n                parsedData = JSON.parse(data);\n            } catch (e) {\n                java.log('\u89e3\u6790data\u6570\u636e\u5931\u8d25:' + e);\n            }\n            \n            if (parsedData && parsedData.data && Array.isArray(parsedData.data) && parsedData.data[book.durChapterIndex]) {\n                let ritem = parsedData.data[book.durChapterIndex];\n                let bookInfoObj;\n                try {\n                    bookInfoObj = JSON.parse(book.variable);\n                } catch (e) {\n                    java.log('\u89e3\u6790book.variable\u5931\u8d25:' + e);\n                }\n                \n                if (bookInfoObj) {\n                    let book_info;\n                    try {\n                        book_info = JSON.parse(bookInfoObj.book_detail || JSON.stringify(bookInfoObj));\n                    } catch (e) {\n                        java.log('\u89e3\u6790book_detail\u5931\u8d25:' + e);\n                    }\n                    \n                    if (book_info && typeof book_info === 'object') {\n                        let rurl = base_url + '\/add_book_to_book_shelf,';\n                        book_info['read_status'] = 1;\n                        book_info['last_chapter_item_id'] = ritem.item_id || '';\n                        book_info['last_chapter_title'] = ritem.title || '';\n                        let rop = {\n                            method: \"POST\",\n                            headers: {\n                                cookie: qtcookie\n                            },\n                            body: book_info\n                        };\n                        let check_book_url = base_url + '\/check_book_in_book_shelf,';\n                        let checkResponse;\n                        \n                        try {\n                            checkResponse = java.ajax(check_book_url + JSON.stringify(rop));\n                        } catch (e) {\n                            java.log('\u68c0\u67e5\u4e66\u7c4d\u8bf7\u6c42\u5931\u8d25:' + e);\n                        }\n                        \n                        if (checkResponse) {\n                            let check_data;\n                            try {\n                                check_data = JSON.parse(checkResponse).data;\n                            } catch (e) {\n                                java.log('\u89e3\u6790\u68c0\u67e5\u54cd\u5e94\u5931\u8d25:' + e);\n                            }\n                            try {\n                                if (check_data && check_data.id) {\n                                    book_info['id'] = check_data.id;\n                                    let uurl = base_url + '\/update_book_shelf,';\n                                    java.ajax(uurl + JSON.stringify(rop));\n                                } else {\n                                    java.ajax(rurl + JSON.stringify(rop));\n                                }\n                            } catch (e) {\n                                java.log('\u4e66\u67b6\u64cd\u4f5c\u5931\u8d25:' + e);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    } catch (error) {\n        java.log('\u4e66\u7c4d\u540c\u6b65\u6d41\u7a0b\u5f02\u5e38:' + error);\n        java.longToast('\\n\u540c\u6b65\u9605\u8bfb\u8fdb\u5ea6\u5931\u8d25\uff0c\u4f46\u4e0d\u5f71\u54cd\u9605\u8bfb\uff0c\u53ef\u4ee5\u524d\u5f80\u767b\u5f55\u5173\u95ed\u4e66\u67b6\u540c\u6b65\u529f\u80fd\u3002');\n    }\n}\ndata;\n<\/js>$.data","chapterName":"$.title","chapterUrl":"<js>\nlet tab = result.tab;\nlet sources = result.source;\nlet title = result.title;\nlet item_id = result.item_id;\nlet book_id = java.get(\"book_id\");\nlet url = result.toc_url || \"\";\nlet qtcontent = {\n    book_id: book_id,\n    item_id: item_id,\n    title: title,\n    sources: sources,\n    tab: tab,\n    url: url,\n};\nqtcontent = java.base64Encode(JSON.stringify(qtcontent));\nif (sources == '\u5377') {\n    content_url = item_id\n} else if ((sources == \"\u756a\u8304\" || sources == \"\u4e03\u732b\" || sources == \"\u5854\u8bfb\") && tab == \"\u5c0f\u8bf4\") {\n    var base_url = getArguments(source.getVariable(), \"server\") || \"\";\n    var fqssionid = getArguments(source.getVariable(), \"fqssionid\") || \"\";\n    let sourcess = sources.replace('svip_', '');\n    content_url = `data:;base64,${qtcontent},{\"type\":\"qingtian3\",\"js\":\"book ? result : '${base_url}\/get_review?book_id=${book_id}&item_id=${item_id}&ssionid=${fqssionid}&source=${sourcess}'\"}`;\n} else {\n    content_url = `data:;base64,${qtcontent},{\"type\":\"qingtian3\"}`;\n}\n<\/js>","updateTime":"$.first_pass_time"},"searchUrl":"<js>\nlet base_url = getArguments(source.getVariable(), 'server');\nlet media;\nlet sources = getArguments(source.getVariable(), 'source');\nlet disabled_sources = getArguments(source.getVariable(), 'disabled_sources');\nif (String(key).startsWith(\"m:\") || String(key).startsWith(\"m\uff1a\")) {\n    media = \"\u6f2b\u753b\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"t:\") || String(key).startsWith(\"t\uff1a\")) {\n    media = \"\u542c\u4e66\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"d:\") || String(key).startsWith(\"d\uff1a\")) {\n    media = \"\u77ed\u5267\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"x:\") || String(key).startsWith(\"x\uff1a\")) {\n    media = \"\u5c0f\u8bf4\"\n    key = key.slice(2)\n} else {\n    media = getArguments(source.getVariable(), 'media');\n}\nif (key.includes('@')) {\n    var parts = key.split('@');\n    key = parts[0];\n    sources = parts[1] || sources;\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet op = {\n    method: \"GET\",\n    headers: {\n        cookie: qtcookie\n    },\n};\nop = JSON.stringify(op);\n`${base_url}\/search?title=${key}&tab=${media}&source=${sources}&page={{page}}&disabled_sources=${disabled_sources},${op}`\n<\/js>","weight":0},{"bookSourceName":"\u8336\u676f\u72d0","bookSourceType":0,"bookSourceUrl":"https:\/\/www.cupfox7.com\/","customOrder":0,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"\u56fd\u6f2b::vodshow\/guochandongman\/page\/{{page}}.html\n\u65e5\u97e9::vodshow\/rihandongman\/page\/{{page}}.html\n\u6b27\u7f8e::vodshow\/oumeidongman\/page\/{{page}}.html","lastUpdateTime":"1767470986002","respondTime":180000,"ruleBookInfo":{"intro":"class.stui-content__detail@p@text##\u8be6\u60c5$##"},"ruleContent":{"content":"@js:\nvar pUrl = result.match(\/\"url_next\":\"([^\"]*)\"\/)\npUrl = pUrl[1].replace(\/\\\\\/g, \"\");\nif (cache.get(book.name+title)){\n    try{\n        java.startBrowserAwait(pUrl, title);\n    }catch(err){\n       \"\u5176\u5b9e...1+1=2!\"\n    }\n}else{\n    cache.put(book.name+title,true, 31536000);\n}\n\"\u8bf7\u5237\u65b0\u67e5\u770b\u5185\u5bb9\";"},"ruleExplore":[],"ruleSearch":{"bookList":"class.stui-vodlist[0]@tag.li","bookUrl":"tag.a@href","checkKeyWord":"\u9b54\u738b","coverUrl":"tag.a@data-original","kind":"tag.a@tag.span@text","name":"tag.a@title"},"ruleToc":{"chapterList":"id.playlist1@tag.ul@tag.li","chapterName":"tag.a@text","chapterUrl":"tag.a@href"},"searchUrl":"vodsearch\/{{key}}----------{{page}}---.html","weight":0},{"bookSourceComment":"2026.1.5","bookSourceGroup":"taojw23","bookSourceName":"\u5929\u547d\u7686\u70ec\u5c0f\u8bf4","bookSourceType":0,"bookSourceUrl":"https:\/\/www.genwohua.com","customOrder":0,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"lastUpdateTime":"1767631574246","respondTime":180000,"exploreUrl":"\u7384\u5e7b::https:\/\/www.genwohua.com\/xuanhuan\/&&\u4fee\u771f::https:\/\/www.genwohua.com\/xiuzhen\/&&\u90fd\u5e02::https:\/\/www.genwohua.com\/dushi\/&&\u7f51\u6e38::https:\/\/www.genwohua.com\/wangyou\/&&\u8f7b\u5c0f\u8bf4::https:\/\/www.genwohua.com\/qing\/&&\u8a00\u60c5::https:\/\/www.genwohua.com\/yanqing\/&&\u5176\u5b83::https:\/\/www.genwohua.com\/qita\/","ruleBookInfo":{"author":"a.red@text","coverUrl":"img.img-thumbnail@src","intro":"#bookIntro@text","lastChapter":".panel-chapterlist > dd:first-child a@text","name":"h1.bookTitle@text","tocUrl":"@self","wordCount":"span:nth-child(2)@text"},"ruleContent":{"content":"#booktxt > div:first-child@html","nextContentUrl":"#linkNext@href","title":"h1.readTitle@text"},"ruleExplore":{"bookList":"table.table tr:nth-child(n+2)","name":"td:nth-child(2) a@text","bookUrl":"td:nth-child(2) a@href","author":"td:nth-child(4)@text","lastChapter":"td:nth-child(3) a@text","coverUrl":"","kind":"td:nth-child(1)@text"},"ruleSearch":{"bookList":"table.table tr:nth-child(n+2)","name":"td:nth-child(2) a@text","bookUrl":"td:nth-child(2) a@href","author":"td:nth-child(4)@text","lastChapter":"td:nth-child(3) a@text","coverUrl":"","kind":"td:nth-child(1)@text","checkKeyWord":"\u8611\u83c7"},"ruleToc":{"chapterList":".panel-chapterlist dd","chapterName":"a@text","chapterUrl":"a@href","nextTocUrl":"","updateTime":""},"searchUrl":"\/search.php?keyword={{key}}","weight":0},{"bookSourceGroup":"\u803d\u7f8e\u5c0f\u8bf4","bookSourceName":"\u8336\u9a6c\u5c0f\u8bf4 [\u803d\u7f8e]","bookSourceType":0,"bookSourceUrl":"https:\/\/www.chamabooks.net","bookUrlPattern":"https:\/\/www.chamabooks.net\/novel_.*?.html","customButton":false,"customOrder":1,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"eventListener":false,"exploreUrl":"@js:\nconst categories = [[\"\u5168\u90e8\",\"\"],[\"\u8a00\u60c5\",\"2\"],[\"\u803d\u7f8e\",\"3\"],[\"\u767e\u5408\",\"4\"],[\"\u6b66\u4fa0\",\"5\"],[\"\u7384\u5e7b\",\"6\"],[\"\u79d1\u5e7b\",\"7\"],[\"\u6050\u6016\",\"8\"],[\"\u63a8\u7406\",\"9\"],[\"\u77ed\u7bc7\",\"12\"]];\nconst tpl = \"\/main?c=$$&p={{page}}\"\n\nconst obj = (title, url, size) => ({\n  title,\n  url,\n  style: {layout_flexBasisPercent: size}\n})\n\nlet list = categories.map(([title, id]) => \n  obj(title, tpl.replace(\"$$\", id), 0.2)\n)\n\n\/\/ \u5728\u7ebf\u83b7\u53d6\u4e66\u5355\uff08\u53ea\u83b7\u53d6\u7b2c\u4e00\u9875\uff09\ntry {\n  let bookList = java.get(\"chamabooks_bookList\");\n  let bookListData = [];\n  if (bookList) {\n    try {\n      bookListData = JSON.parse(bookList);\n    } catch (e) {\n      java.log(\"\u7f13\u5b58\u6570\u636e\u89e3\u6790\u5931\u8d25: \" + e.message);\n    }\n  }\n  \n  if (!Array.isArray(bookListData) || bookListData.length === 0) {\n    let html = java.ajax(\"https:\/\/www.chamabooks.net\/main?c=100\");\n    if (html) {\n      let doc = org.jsoup.Jsoup.parse(html);\n      let bookListEl = doc.select(\".novel-item h4 a\");\n      \n      if (bookListEl && bookListEl.size() > 0) {\n        bookListData.push(obj(\"\u4e66\u5355\", \"\", 1));\n        \n        bookListEl.forEach(el => {\n          let n = String(el.text()).trim();\n          let u = String(el.attr(\"href\"));\n          bookListData.push(obj(n, u, 0.9));\n        });\n        \n        java.put(\"chamabooks_bookList\", JSON.stringify(bookListData));\n      }\n    }\n  }\n  \n  if (bookListData.length > 0) {\n    list = list.concat(bookListData);\n  }\n  \n} catch (e) {\n  java.log(\"\u83b7\u53d6\u4e66\u5355\u5931\u8d25: \" + e.message);\n}\n\nJSON.stringify(list);","header":"{\n\t \"User-Agent\":\"Mozilla\/5.0 (iPhone; CPU iPhone OS 17_3 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/17.3 Mobile\/15E148 Safari\/604.1\",\n\t \"Referer\": \"https:\/\/www.chamabooks.net\/\"\n}","lastUpdateTime":"1767839763597","loginUrl":"\/","respondTime":180000,"ruleBookInfo":{"author":"h1 a@text##\u4f5c\u8005:","coverUrl":"[property=\"og:image\"]@content","intro":".novel-summary-content@html","kind":"@js:\nconst get = (sel) => String(java.getString(sel))\nlet cat = book.kind || get(\".category@text\")\nlet count = get(\"@@.misc-value.2@text\");\ncount = count ? \",\u7ae0\u8282\u6570\uff1a\"+count : \"\";\ncat.concat(count)","lastChapter":"option.-1@value","name":"h1@ownText##\u300a|\u300b","wordCount":".misc-value.1@text##$##\u5b57"},"ruleContent":{"content":"#novel-content@html##{{title}}"},"ruleExplore":[],"ruleSearch":{"author":".misc-value a@text","bookList":".novel-item","bookUrl":"h4 a@href","intro":"p.novel-desc@text","kind":".category,.upload-date@text","name":"h4 a@text","wordCount":".word-count@text"},"ruleToc":{"chapterList":"option","chapterName":"text","chapterUrl":"value"},"searchUrl":"\/search?s={{key}}","weight":0},{"bookSourceComment":"let banben=\"0.0.5\";","bookSourceName":"\ud83c\udf08\u7f51\u6613\u4e91\u97f3\u4e50","bookSourceType":1,"bookSourceUrl":"https:\/\/\u7f51\u6613\u4e91\u97f3\u4e50.luoyacheng.ip-ddns.com","concurrentRate":"5\/1000","customButton":false,"customOrder":26,"enabled":true,"enabledCookieJar":true,"enabledExplore":false,"eventListener":false,"header":"@js:\n(()=>{\n\treturn JSON.stringify(gethd());\n})();","jsLib":"s_c_ua = `'Microsoft Edge';v='131', 'Chromium';v='131', 'Not_A Brand';v='24'`;\ns_c_ua_m = '?1';\ns_c_ua_p =  `'Android'`;\ncache_c = 'max-age=0';\na_l = 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7';\n\nfunction gethd() {\n\tlet u_a=this.java.getWebViewUA();\n\tlet headers = {\n\t\t  \t\"User-Agent\": u_a,\n\t\t  \"sec-ch-ua\": s_c_ua,\n    \t \"sec-ch-ua-mobile\": s_c_ua_m,\n     \t\"sec-ch-ua-platform\": s_c_ua_p,\n     \t\"cache-control\": cache_c,\n     \t\"accept-language\": a_l\n    \t }\nreturn headers;\n};","lastUpdateTime":"1767863929354","respondTime":180001,"ruleBookInfo":[],"ruleContent":{"content":"@js: \/\/\u83b7\u53d6\u64ad\u653e\u94fe\u63a5\nlet id = java.hexDecodeToString(result);\nlet url = `https:\/\/music.cpp-prog.com\/api.php,{\t\"method\": \"post\",\n\t\"body\": \"types=url&id=${id}&source=netease\"\n}`;\nresult = cache.getFromMemory(\"wyy\"+id);\nif (!result) {\nlet rr=java.ajax(url);\nresult=java.getString('$.url',rr);\ncache.putMemory(\"wyy\"+id,result);\n}\nresult;","subContent":"@js: \/\/\u83b7\u53d6\u6b4c\u8bcd\nlet id = java.hexDecodeToString(result);\nlet url2 = `https:\/\/music.cpp-prog.com\/api.php,{\t\"method\": \"post\",\n\t\"body\": \"types=lyric&id=${id}&source=netease\"\n}`;\nresult = cache.getFromMemory(\"wyyl\"+id);\nif (!result) {\nlet rr2=java.ajax(url2);\nresult=java.getString('$.lyric',rr2);\ncache.putMemory(\"wyyl\"+id,result);\n}\nresult;"},"ruleExplore":[],"ruleSearch":{"author":"$.artist@js:result.replaceAll('\\n','\/')","bookList":"$.[*]","bookUrl":"$.url_id@js:\n`data:;base64,${java.base64Encode(result)},{\"type\":\"wyy\"}`","checkKeyWord":"\u6d1b\u5929\u4f9d","coverUrl":"$.pic_id@js:\nlet url=source.get('picu'+result);\nif (url=='') {\nlet r=java.ajax(`https:\/\/music.cpp-prog.com\/api.php,{\t\"method\": \"post\",\n\t\"body\": \"types=pic&id=${result}&source=netease\"\n}`)\nurl=java.getString('$.url',r);\nsource.put('picu'+result, url);\n}\nurl","kind":"$.album&&source","name":"$.name"},"ruleToc":{"chapterList":"@js:[{text:book.name}]","chapterName":"text"},"searchUrl":"https:\/\/music.cpp-prog.com\/api.php,{\n\t\"method\": \"post\",\n\t\"body\": \"types=search&count=20&source=netease&pages={{page}}&name={{key}}\"\n\t}","weight":0},{"bookSourceGroup":"\u7f8e\u5973","bookSourceName":"\u7f8e\u5973\u56fe\u7247\u7f51","bookSourceType":2,"bookSourceUrl":"https:\/\/m.ku1372.cc","customButton":false,"customOrder":1,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"eventListener":false,"exploreUrl":"@js:\nconst groups = [\n  {\n    title: \"\u9996\u9875\u63a8\u8350\",\n    items: [[\"\u9996\u9875\u63a8\u8350\", \"1\"]]\n  },\n  {\n      title: \"\u63a8\u8350\u5957\u56fe\",\n      items: [[\"\u7231\u4e1d\",\"73\"],[\"ROSI\",\"4\"],[\"\u4e3d\u67dc\",\"20\"],[\"\u7231\u79c0\",\"51\"],[\"\u8bed\u753b\u754c\",\"102\"],[\"\u5609\u4e3d\",\"101\"],[\"\u96c5\u62c9\u4f0a\",\"100\"],[\"\u5996\u7cbe\u793e\",\"103\"],[\"\u9752\u8c46\u5ba2\",\"85\"],[\"\u5c24\u871c\u835f\",\"94\"],[\"\u5fa1\u5973\u90ce\",\"92\"],[\"\u679c\u56e2\u7f51\",\"81\"],[\"\u871c\u6843\u793e\",\"86\"],[\"\u732b\u840c\u699c\",\"82\"],[\"\u7cd6\u679c\u753b\u62a5\",\"75\"],[\"\u661f\u4e50\u56ed\",\"84\"],[\"\u987d\u5473\u751f\u6d3b\",\"90\"],[\"\u82b1\u6f3e\",\"79\"],[\"\u514b\u62c9\u5973\u795e\",\"22\"],[\"\u5c24\u679c\u7f51\",\"10\"],[\"\u7231\u5c24\u7269\",\"2\"],[\"\u5934\u6761\u5973\u795e\",\"3\"],[\"\u79c0\u4eba\u7f51\",\"9\"],[\"\u55f2\u56e1\u56e1\",\"96\"],[\"\u6ce2\u83e0\u793e\",\"93\"],[\"\u7b2c\u56db\u5370\u8c61\",\"13\"],[\"\u7231\u871c\u793e\",\"87\"],[\"\u63a8\u5973\u795e\",\"58\"],[\"\u9b45\u598d\u793e\",\"57\"],[\"\u6a21\u8303\u5b66\u9662\",\"95\"],[\"\u7f8e\u817f\u5b9d\u8d1d\",\"78\"],[\"\u7f8e\u5a9b\u9986\",\"64\"],[\"\u5c24\u7269\u9986\",\"89\"],[\"\u4f18\u661f\u9986\",\"88\"],[\"\u82b1\u306e\u989c\",\"80\"],[\"\u6fc0\u840c\u6587\u5316\",\"91\"],[\"\u871c\u4e1d\",\"76\"],[\"\u661f\u989c\u793e\",\"97\"],[\"\u8f70\u8db4\u732b\",\"77\"],[\"\u63a8\u5973\u90ce\",\"83\"],[\"\u52a8\u611f\u5c0f\u7ad9\",\"16\"],[\"\u7981\u5fcc\u6444\u5f71\",\"71\"],[\"TyingArt\",\"61\"]]\n  },\n  {\n      title: \"\u97e9\u7cfb\u5957\u56fe\",\n      items: [[\"ARTGRAVIA\",\"201\"],[\"Bimilstory\",\"202\"],[\"BlueCake\",\"203\"],[\"BUNNY\",\"206\"],[\"CoCo\",\"184\"],[\"Cream pie\",\"185\"],[\"CreamSoda\",\"195\"],[\"Donggeuran\",\"189\"],[\"Espacia Korea\",\"204\"],[\"Fantasy Story\",\"200\"],[\"Fetishkorea\",\"190\"],[\"GlamARchive\",\"192\"],[\"HIGH FANTASY\",\"207\"],[\"JOApictures\",\"193\"],[\"KIMLEMON\",\"178\"],[\"KiSiA\",\"183\"],[\"Leehee Express\",\"194\"],[\"Lilynah\",\"211\"],[\"Limepunch\",\"196\"],[\"MARK\",\"182\"],[\"MilkyBomb\",\"188\"],[\"MISS TOUCH\",\"199\"],[\"Muchenne\",\"208\"],[\"Paranhosu\",\"197\"],[\"Patreon\",\"209\"],[\"PhotoChips\",\"213\"],[\"PINK\",\"198\"],[\"Pure Media\",\"210\"],[\"SaintPhotoLife\",\"205\"],[\"SeeShe\",\"180\"],[\"Sehee\",\"187\"],[\"Supreme\",\"186\"],[\"SWEETBOX\",\"212\"],[\"SWEETHB\",\"179\"],[\"WXY\",\"181\"],[\"YO-U\",\"191\"]]\n  },\n  {\n      title: \"\u4e8c\u6b21\u5143\u5957\u56fe\",\n      items: [[\"BamBi\",\"137\"],[\"Coser\u9762\u997c\u4ed9\u513f\",\"148\"],[\"DJAWA\",\"140\"],[\"eloise\u8f6f\u8f6f\",\"127\"],[\"Kuuko W\",\"146\"],[\"Leah\u6893\u672a\",\"123\"],[\"Money\u51b7\u51b7\",\"135\"],[\"Natsuko\u590f\u590f\u5b50\",\"104\"],[\"NinJa\u963f\u5be8\u5be8\",\"125\"],[\"Nyako\u55b5\u5b50\",\"147\"],[\"Potato Godzilla\",\"118\"],[\"rioko\u51c9\u51c9\u5b50\",\"132\"],[\"yuuhui\u7389\u6c47\",\"136\"],[\"\u963f\u5305\u4e5f\u662f\u5154\u5a18\",\"120\"],[\"\u767d\u94f681\",\"112\"],[\"\u8822\u6cab\u6cab\",\"144\"],[\"\u523a\u9752Poi\",\"121\"],[\"\u6296\u5a18-\u5229\u4e16\",\"105\"],[\"\u9ed1\u5ddd\",\"111\"],[\"\u80e1\u6843\u732bKurumineko\",\"154\"],[\"\u864e\u68ee\u68ee\",\"122\"],[\"\u7ede\u8089\u59ec\",\"131\"],[\"\u4e5d\u8a00\",\"130\"],[\"\u7fce\u67d2\u83dc\u83dc\",\"114\"],[\"\u9e7f\u516b\u5c81\",\"153\"],[\"\u9e7f\u91ce\u5e0c\",\"143\"],[\"\u6d1b\u7483 LoLiSAMA\",\"129\"],[\"\u871c\u6c41\u732b\u88d8\",\"150\"],[\"\u55b5\u7cd6\u6620\u753b\",\"138\"],[\"\u5948\u6c50\u9171nice\",\"115\"],[\"\u4e03\u6708\u55b5\u5b50\",\"156\"],[\"\u7eee\u592a\u90ce_Kitaro\",\"116\"],[\"\u6e05\u6c34\u7531\u4e43\",\"107\"],[\"\u79cb\u548c\u67ef\u57fa\",\"152\"],[\"\u65e5\u5948\u5a07\",\"113\"],[\"\u4e09\u5ea6_69\",\"117\"],[\"\u795e\u697d\u5742\u771f\u51ac\",\"109\"],[\"\u662f\u4e09\u4e0d\u662f\u4e16w\",\"110\"],[\"\u6c34\u6dfcAqua\",\"142\"],[\"\u5154\u73a9\u6620\u753b\",\"155\"],[\"\u96ef\u59b9\u4e0d\u8bb2\u9053\u7406\",\"106\"],[\"\u65e0\u989c\u5c0f\u5929\u4f7f\",\"119\"],[\"\u65e0\u5f71\u55b5\u55b5\",\"124\"],[\"\u9999\u8349\u55b5\u9732\u9732\",\"141\"],[\"\u5c0f\u4ed3\u5343\u4ee3w\",\"139\"],[\"\u661f\u6f9c\u662f\u6f9c\u6f9c\u53eb\u6f9c\u59b9\u5440\",\"128\"],[\"\u661f\u91ce\u54aa\u5154\",\"134\"],[\"\u96ea\u6674Astra\",\"151\"],[\"\u4e00\u7b11\u82b3\u9999\u6c81\",\"126\"],[\"\u685c\u4e95\u5b81\u5b81\",\"108\"],[\"\u685c\u6843\u55b5\",\"149\"],[\"\u4e91\u6eaa\u6eaa\",\"133\"]]\n  },\n  {\n      title: \"\u7ecf\u5178\u5957\u56fe1\",\n      items: [[\"3Agirl\u5957\u56fe\",\"145\"],[\"DDY Pantyhose\",\"166\"],[\"FetiArt\u5c1a\u7269\u96c6\",\"160\"],[\"ISS\u7cfb\u5217\",\"172\"],[\"Leghacker\",\"159\"],[\"Leglegs\",\"165\"],[\"MASKED QUEEN\",\"171\"],[\"PDL\u6f58\u591a\u62c9\",\"162\"],[\"SLADY\u730e\u5973\u795e\",\"164\"],[\"Tpimage\",\"158\"],[\"V\u5973\u90ce\",\"170\"],[\"WingS\u5f71\u79c1\u835f\",\"161\"],[\"YouMei\u5c24\u7f8e\",\"163\"],[\"\u8fc7\u671f\u7c73\u7ebf\u7ebf\u55b5\",\"173\"],[\"\u7d27\u6025\u4f01\u5212\",\"175\"],[\"\u7eb3\u4e1d\u6444\u5f71\",\"177\"],[\"\u5e74\u5e74nnian\",\"167\"],[\"\u6211\u4e1d\u4f60\u60f3\",\"176\"],[\"\u8bb8\u5c9aLAN\",\"174\"],[\"\u7814\u7814\",\"169\"],[\"\u9c7c\u5b50\u9171Fish-\u79c1\u62cd\",\"157\"],[\"\u80b2\u7f8e\",\"168\"]]\n  },\n  {\n      title: \"\u7ecf\u5178\u5957\u56fe2\",\n      items: [[\"\u5f02\u601d\u8da3\u5411\",\"15\"],[\"\u9752\u4e18\u5973\u795e\",\"49\"],[\"Pans\",\"52\"],[\"\u67d4\u4e1d\u6674\u6674\",\"39\"],[\"\u537f\u537f\u96ea\u513f\",\"42\"],[\"\u62cd\u7f8eVIP\",\"30\"],[\"\u68a6\u5e7b\u5c0f\u5996\",\"32\"],[\"\u4e3d\u56fe\u4eba\u50cf\",\"40\"],[\"\u6ce2\u65af\u732b\u513f\",\"34\"],[\"\u70ab\u5f69\u6444\u5f71\",\"25\"],[\"\u4e1d\u95f4\u821e\",\"17\"],[\"\u4e2d\u56fd\u817f\u6a21\",\"28\"],[\"\u4e2d\u9ad8\u827a\u56fe\",\"37\"],[\"\u539f\u5473\u5996\u5996\",\"41\"],[\"\u65b0\u4e5d\u9633\",\"36\"],[\"\u5c0f\u7f8eVIP\u56fe\",\"29\"],[\"\u738b\u671d\u8d35\u8db3\",\"24\"],[\"\u4e1d\u827a\u5f71\u50cf\",\"50\"],[\"\u4e1d\u56fe\u9601\",\"35\"],[\"\u795e\u827a\u7f18\",\"26\"],[\"HeiSiAi\",\"54\"],[\"\u7f8e\u675f\",\"47\"],[\"51MODO\",\"74\"],[\"HeiSiMM\",\"55\"],[\"\u4e1d\u5c1aVIP\",\"27\"],[\"\u4e1d\u5b9dVIP\",\"44\"],[\"ru1mm\u5199\u771f\",\"23\"],[\"\u4e3d\u9601\u5f71\u50cf\",\"45\"],[\"\u4e1d\u96c5\u5199\u771f\",\"33\"],[\"Legku\u5199\u771f\",\"8\"]]\n  },\n  {\n      title: \"\u7ecf\u5178\u5957\u56fe3\",\n      items: [[\"DGC\u5957\u56fe\",\"6\"],[\"WBGC\u5957\u56fe\",\"70\"],[\"TopQueen\",\"21\"],[\"Princess\",\"67\"],[\"NS Eyes\",\"65\"],[\"Image.tv\",\"69\"],[\"Imouto.tv\",\"63\"],[\"Hello! Pros\",\"60\"],[\"For-side\",\"48\"],[\"BWH\",\"19\"],[\"4K-STAR\",\"7\"],[\"TWO\u5957\u56fe\",\"72\"],[\"Sabra.net\",\"66\"],[\"Minisuka\",\"68\"],[\"Bomb\u5957\u56fe\",\"56\"],[\"Bejean on\",\"59\"],[\"misty\u5957\u56fe\",\"18\"],[\"RQ-STAR\",\"12\"],[\"WPB\u5957\u56fe\",\"62\"],[\"YS Web\",\"31\"],[\"OnlyTease\",\"5\"],[\"Layered\",\"14\"],[\"Denise\",\"46\"],[\"\u672a\u5206\u7c7b\u56fe\",\"11\"]]\n  }\n]\n\nconst list = []\nconst push = (n, u, size) => list.push({\n\t title: n,\n\t url: u,\n\t style: {layout_flexBasisPercent: size}\n});\n\nconst TPL = \"\/b\/$$\/list_$$_{{page}}.html\"\n\ngroups.forEach(({title, items}) => {\n    push(title, \"\", 1)\n    items.forEach(([n, u]) => \n\t     push(n, TPL.replaceAll(\"$$\", u), 0.29)\n\t   )\n})\n\nJSON.stringify(list)","header":"{\"User-Agent\":\"Mozilla\/5.0 (iPhone; CPU iPhone OS 17_3 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/17.3 Mobile\/15E148 Safari\/604.1\"}","lastUpdateTime":"1767880425312","respondTime":180000,"ruleBookInfo":[],"ruleContent":{"content":"@js:\nconst list = java.getStringList(\"@css:.ArticleImageBox img@src\");\n\nconst hh = JSON.stringify({\n  \"headers\": {\n    \"User-Agent\": \"Mozilla\/5.0 (iPhone; CPU iPhone OS 17_3 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/17.3 Mobile\/15E148 Safari\/604.1\",\n    \"Referer\": baseUrl\n  }\n})\n\nfor(let i = 0; i < list.size(); i++){\n  list[i] = `<img src=\"${list[i]},${hh}\">`;\n}\n\nlist"},"ruleExplore":[],"ruleSearch":{"bookList":".PictureList li a","bookUrl":"href","coverUrl":"img@src##$##,{\n  \"headers\": {\n    \"User-Agent\": \"Mozilla\/5.0 (iPhone; CPU iPhone OS 17_3 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/17.3 Mobile\/15E148 Safari\/604.1\",\n    \"Referer\": \"{{baseUrl}}\"\n  }\n}","name":"span@text||title##<.*?>"},"ruleToc":{"chapterList":"@js:\n[{n: \"\u7f8e\u5973\u6b23\u8d4f\"}]","chapterName":"n"},"searchUrl":"\/plus\/search.php?keyword={{java.encodeURI(key,\"GBK\")}}&pagesize=30&PageNo={{page}}","weight":0},{"bookSourceComment":"\u66f4\u65b0\u65e5\u5fd7\u8bf7\u70b9\u51fb\u767b\u5f55\uff0c\u66f4\u65b0\u4e66\u6e90\u4e2d\u67e5\u770b\n\n\u517c\u5bb9\u6b63\u5f0f\u7248\u9605\u8bfbapp","bookSourceGroup":"\u5927\u7070\u72fc\u805a\u5408","bookSourceName":"\ud83c\udf45\u5927\u7070\u72fc\u805a\u54085.1.9(\u5b8c\u5168\u7248)","bookSourceType":0,"bookSourceUrl":"\u5927\u7070\u72fc\u878d\u54085.0","bookUrlPattern":"https?:\\\/\\\/(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z0-9-]+(?::\\d+)?\\\/detail.*","customButton":false,"customOrder":3,"enabled":true,"enabledCookieJar":false,"enabledExplore":true,"eventListener":false,"exploreUrl":"<js>\nfunction setArgument(key, value) {\n    var open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '') || {};\n    open_argument[key] = value;\n    var result = JSON.stringify(open_argument);\n    source.setVariable(result);\n    return result;\n}\n\nvar open_argument = source.getVariable();\nvar base_url = getArguments(open_argument, 'server') || '';\nvar ms = getArguments(open_argument, 'tone_id') || '';\nvar source_type = getArguments(open_argument, 'source_type') || '\u7537\u9891';\nvar tab = getArguments(open_argument, 'media') || '\u5c0f\u8bf4';\nvar sources = getArguments(open_argument, 'source') || '\u756a\u8304';\n\n\nvar sdtoken;\ntry {\n    var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n    sdtoken = String(loginInfoMap['\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)'] || '');\n} catch (e) {\n    sdtoken = '';\n}\n\nvar rawCookie = getFanqieCookie() || sdtoken;\nvar match = rawCookie.match(\/sessionid=[^;]+\/);\nvar fqcookie = match ? match[0] : '';\nvar fqssionid = '';\nif (!fqcookie) {\n    java.toast('\u60a8\u8fd8\u672a\u767b\u9646\u756a\u8304\u8d26\u53f7\uff0c\u65e0\u6cd5\u540c\u6b65\u6570\u636e\u54e6\uff01');\n} else {\n    fqssionid = getSessionId(fqcookie)\n}\nvar fqsjurl = base_url + \"\/bookshelf?page={{page}}&ssionid=\" + fqssionid;\nvar fqtjurl = base_url + \"\/fqrecommend?page={{page}}&ssionid=\" + fqssionid;\nvar fqlsurl = base_url + \"\/fqhistory?page={{page}}&ssionid=\" + fqssionid;\n\nvar groupDatas = [];\nvar infoData = [];\n\nfunction deviceType() {\n    try {\n        return !!java.androidId();\n    } catch (e) {\n        return false;\n    }\n}\n\nvar hasValidCookie = fqcookie.length > 0;\n\nif (hasValidCookie) {\n    function groupQuery() {\n        try {\n            var url = base_url + \"\/group_name?ssionid=\" + fqssionid;\n            var res = java.ajax(url);\n            var response = JSON.parse(res);\n\n            if (!(response && response.data)) {}\n\n            response.data.forEach(function(group) {\n                var keys = Object.keys(group);\n                if (keys.length > 0) {\n                    var key = keys[0];\n                    var value = group[key];\n                    if (value && value.length) {\n                        var option = {\n                            \"method\": \"POST\",\n                            \"body\": {\n                                \"book_ids\": value,\n                                \"page\": \"{{page}}\"\n                            }\n                        };\n                        groupDatas.push({\n                            title: key,\n                            url: base_url + \"\/bookshelf,\" + JSON.stringify(option),\n                            style: {\n                                layout_flexGrow: 1,\n                                layout_flexBasisPercent: 0.45\n                            }\n                        });\n                    }\n                }\n            });\n\n            if (groupDatas.length % 2 !== 0) {\n                groupDatas.push({\n                    title: \"--\",\n                    url: \"\",\n                    style: {\n                        layout_flexGrow: 1,\n                        layout_flexBasisPercent: 0.45\n                    }\n                });\n            }\n        } catch (e) {\n            java.longToast(\"\u756a\u8304\u767b\u5f55\u8fc7\u671f\uff0c\u5df2\u9690\u85cf\u756a\u8304\u4e66\u67b6\");\n        }\n    }\n\n    try {\n        java.longToast(\"\u6b63\u5728\u52a0\u8f7d\u5206\u7ec4\u6570\u636e...\");\n        var userUrl = base_url + \"\/fquser?ssionid=\" + fqssionid;\n        var userRes = java.ajax(userUrl);\n        var userData = JSON.parse(userRes);\n\n        var userName = (userData && userData.data && userData.data.name) ? userData.data.name : '\u672a\u77e5\u7528\u6237';\n        if (!userName.includes('\u672a\u77e5\u7528\u6237')) {\n            infoData = [{\n                title: \"\u756a\u8304\u4e2a\u4eba\u4e2d\u5fc3\",\n                url: fqsjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }, {\n                title: \"\u4e2a\u6027\u63a8\u8350(\u756a\u8304)\",\n                url: fqtjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }, {\n                title: \"\u5386\u53f2\u9605\u8bfb(\u756a\u8304)\",\n                url: fqlsurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }];\n        }\n        groupQuery();\n    } catch (e) {\n        java.longToast(\"\u756a\u8304\u767b\u5f55\u8fc7\u671f\uff0c\u5df2\u9690\u85cf\u756a\u8304\u4e66\u67b6\");\n    }\n}\n\nvar style_list = [];\ntry {\n    var durl = `${base_url}\/discovestyle?source=${sources}&source_type=${source_type}&tab=${tab}`;\n    var res = java.ajax(durl);\n    var result = JSON.parse(res);\n    style_list = result.data || [];\n    if (result.msg) {\n        java.toast(result.msg);\n    }\n} catch (e) {\n    java.toast(\"\u53d1\u73b0\u6837\u5f0f\u83b7\u53d6\u5931\u8d25\");\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet qtop = {\n    method: \"GET\",\n    headers: {\n        cookie: qtcookie\n    },\n};\nqtop = JSON.stringify(qtop);\nlet qtsjurl = base_url+'\/get_book_shelf,'+qtop\nlet qtsj = [{\n                title: \"\u5927\u7070\u72fc\u4e2a\u4eba\u4e2d\u5fc3\",\n                url: qtsjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }]\nvar finalData = infoData.concat(groupDatas, style_list);\nfinalData = qtsj.concat(finalData);\nJSON.stringify(finalData);\n<\/js>","header":"{ \"User-Agent\":\"Mozilla\/5.0 (Linux; Android 6.0; Nexus 5 Build\/MRA58N) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Mobile Safari\/537.36 Edg\/138.0.0.0\" }","jsLib":"var host = [\n    'https:\/\/api.langge.cf',\n    'http:\/\/219.154.201.122:5006'\n];\n\nfunction getArguments(open_argument, key) {\n    try {\n        open_argument = JSON.parse(open_argument);\n    } catch (e) {\n        open_argument = {\n            media: \"\u5c0f\u8bf4\",\n            tone_id: \"\u9ed8\u8ba4\u97f3\u8272\",\n            server: host[0],\n            source: \"\u5168\u90e8\",\n            source_type: \"\u7537\u9891\",\n        };\n    }\n    if (key) {\n        return open_argument[key];\n    } else {\n        return open_argument;\n    }\n}\n\nfunction setArguments(key, value) {\n    const {\n        source\n    } = this;\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    open_argument[key] = value;\n    open_argument = JSON.stringify(open_argument);\n    source.setVariable(open_argument);\n    return open_argument;\n}\n\nfunction decrypt(Text) {\n    return Text;\n}\n\nfunction paraForAndroid(content, sources) {\n    let {\n        java,\n        cache,\n        source\n    } = this;\n    let plcolor = getArguments(source.getVariable(), \"plcolor\");\n    if (!plcolor) {\n        plcolor = \"#000000\";\n    }\n\n    const createSvg = this.createSvg.bind(this);\n\n    return content.replace(\/<p>(.*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\\/>)?<\\\/p>\/g,\n        (match, text, url, count) => {\n            if (url && count) {\n                const click = 0;\n                cache.putMemory(url, click);\n                const encodedUrl = url;\n                return `<p>${text}<img src=\"${createSvg(count, plcolor,encodedUrl,sources)}\"><\/p>`;\n            } else {\n                return `<p>${text}<\/p>`;\n            }\n        }\n    );\n}\n\n\nfunction showCmt(url, sources) {\n    let {\n        java,\n        cache\n    } = this;\n\n    const currentTime = Date.now();\n    const click = cache.getFromMemory(url);\n    let isqread = false;\n    try {\n        java.qread();\n        isqread = true;\n    } catch (e) {}\n    if (click < 1 && !isqread) {\n        cache.putMemory(url, click + 1);\n        return;\n    } else {\n        try {\n            java.startBrowserDp(url, sources + '\u6bb5\u8bc4');\n        } catch (e) {\n            java.startBrowser(url, sources + '\u6bb5\u8bc4');\n        }\n    }\n}\n\n\n\nfunction createSvg(number, color, encodedUrl, sources) {\n    var displayText = number > 99 ? \"99+\" : number.toString();\n    var loginInfoMap = {};\n\n    if (this.source && typeof this.source.getLoginInfoMap == 'function') {\n        loginInfoMap = this.source.getLoginInfoMap() || {};\n    }\n\n    var bubbleStyle = String(loginInfoMap['\u6bb5\u8bc4\u6c14\u6ce1\u6837\u5f0f(0-4)'] || '0');\n    var svg;\n\n    \/\/ \u6837\u5f0f1\uff1a\u7cbe\u81f4\u5706\u5f62 - \u7b80\u6d01\u4f18\u96c5\n    if (bubbleStyle == '1') {\n        svg = '<svg width=\"1000\" height=\"1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">' +\n            '<circle cx=\"500\" cy=\"500\" r=\"440\" fill=\"none\" stroke=\"' + color + '\" stroke-width=\"32\" opacity=\"0.2\"\/>' +\n            '<circle cx=\"500\" cy=\"500\" r=\"440\" fill=\"none\" stroke=\"' + color + '\" stroke-width=\"4\"\/>' +\n            '<text x=\"500\" y=\"500\" font-family=\"-apple-system, sans-serif\" text-anchor=\"middle\" ' +\n            'font-size=\"400\" fill=\"' + color + '\" dy=\"0.35em\" font-weight=\"500\">' + displayText + '<\/text>' +\n            '<\/svg>';\n    }\n    \/\/ \u6837\u5f0f2\uff1a\u5fae\u4fe1\u98ce\u683c - \u719f\u6089\u4eb2\u5207\u7684\u5bf9\u8bdd\u6c14\u6ce1\n    else if (bubbleStyle == '2') {\n        svg = '<svg width=\"1000\" height=\"900\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">' +\n            '<path d=\"M120,120 L880,120 Q920,120 920,160 L920,680 Q920,720 880,720 L280,720 L120,840 L120,720 Q80,720 80,680 L80,160 Q80,120 120,120 Z\" ' +\n            'fill=\"none\" stroke=\"' + color + '\" stroke-width=\"24\" stroke-linejoin=\"round\"\/>' +\n            '<text x=\"500\" y=\"440\" font-family=\"-apple-system, sans-serif\" text-anchor=\"middle\" ' +\n            'font-size=\"360\" fill=\"' + color + '\" dy=\"0.32em\" font-weight=\"500\">' + displayText + '<\/text>' +\n            '<\/svg>';\n    }\n    \/\/ \u6837\u5f0f3\uff1a\u60ac\u6d6e\u6807\u7b7e - \u6241\u5e73\u73b0\u4ee3\u98ce\u683c\n    else if (bubbleStyle == '3') {\n        svg = '<svg width=\"1000\" height=\"600\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">' +\n            '<rect x=\"80\" y=\"80\" width=\"840\" height=\"440\" rx=\"220\" ry=\"220\" ' +\n            'fill=\"none\" stroke=\"' + color + '\" stroke-width=\"6\"\/>' +\n            '<rect x=\"100\" y=\"100\" width=\"800\" height=\"400\" rx=\"200\" ry=\"200\" ' +\n            'fill=\"none\" stroke=\"' + color + '\" stroke-width=\"20\" opacity=\"0.3\"\/>' +\n            '<text x=\"500\" y=\"310\" font-family=\"-apple-system, sans-serif\" text-anchor=\"middle\" ' +\n            'font-size=\"280\" fill=\"' + color + '\" dy=\"0.32em\" font-weight=\"500\" letter-spacing=\"8\">' + displayText + '<\/text>' +\n            '<\/svg>';\n    }\n    \/\/ \u6837\u5f0f4\uff1a\u4e66\u7b7e\u6807\u6ce8 - \u7b26\u5408\u9605\u8bfb\u573a\u666f\n    else if (bubbleStyle == '4') {\n        svg = '<svg width=\"900\" height=\"1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">' +\n            '<path d=\"M150,80 L750,80 Q800,80 800,130 L800,870 Q800,920 750,920 L480,920 L450,980 L420,920 L150,920 Q100,920 100,870 L100,130 Q100,80 150,80 Z\" ' +\n            'fill=\"none\" stroke=\"' + color + '\" stroke-width=\"24\" stroke-linejoin=\"round\"\/>' +\n            '<line x1=\"150\" y1=\"280\" x2=\"750\" y2=\"280\" stroke=\"' + color + '\" stroke-width=\"3\" opacity=\"0.3\"\/>' +\n            '<text x=\"450\" y=\"520\" font-family=\"Georgia, serif\" text-anchor=\"middle\" ' +\n            'font-size=\"360\" fill=\"' + color + '\" dy=\"0.32em\" font-weight=\"400\">' + displayText + '<\/text>' +\n            '<text x=\"450\" y=\"800\" font-family=\"-apple-system, sans-serif\" text-anchor=\"middle\" ' +\n            'font-size=\"70\" fill=\"' + color + '\" opacity=\"0.6\" letter-spacing=\"3\">\u8bc4\u8bba<\/text>' +\n            '<\/svg>';\n    }\n    \/\/ \u9ed8\u8ba4\u8fd4\u56de\u6837\u5f0f0\n    else {\n        svg = '<svg width=\"160\" height=\"120\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">' +\n            '<path d=\"M 55 10 ' +\n            'L 120 10 ' +\n            'Q 150 10 150 40 ' +\n            'L 150 80 ' +\n            'Q 150 110 120 110 ' +\n            'L 55 110 ' +\n            'Q 25 110 25 80 ' +\n            'L 25 75 ' +\n            'L 3 60 ' +\n            'L 25 45 ' +\n            'L 25 40 ' +\n            'Q 25 10 55 10 Z\" ' +\n            'fill=\"none\" ' +\n            'stroke=\"' + color + '\" ' +\n            'stroke-width=\"2\" ' +\n            'stroke-linejoin=\"round\"\/>' +\n            '<!-- \u6570\u5b57\u6587\u672c -->' +\n            '<text x=\"87\" y=\"75\" ' +\n            'font-family=\"Arial, sans-serif\" ' +\n            'text-anchor=\"middle\" ' +\n            'dominant-baseline=\"middle\" ' +\n            'font-size=\"50\" ' +\n            'font-weight=\"bold\" ' +\n            'fill=\"' + color + '\">' +\n            displayText +\n            '<\/text>' +\n            '<!-- \u63d0\u793a\u6587\u672c -->' +\n            '<text x=\"87\" y=\"95\" ' +\n            'font-family=\"Arial, sans-serif\" ' +\n            'text-anchor=\"middle\" ' +\n            'dominant-baseline=\"middle\" ' +\n            'font-size=\"9\" ' +\n            'fill=\"' + color + '\" ' +\n            'opacity=\"0.7\">' +\n            '\u5237\u65b0\u67e5\u770b' +\n            '<\/text>' +\n            '<\/svg>';\n    }\n\n    var encodedSvg = this.java.base64Encode(svg);\n    return 'data:image\/svg+xml;base64,' + encodedSvg + ',{\"js\":\"showCmt(\\'' + encodedUrl + '\\', \\'' + sources + '\\')\",\"style\":\"text\"}';\n}\n\n\n\nfunction cleanHTML(html) {\n    let result = html\n        .replace(\/<header[^>]*>[\\s\\S]*?<\\\/header>\/gi, \"\")\n        .replace(\/<div class=\"tt-title\"[^>]*>[\\s\\S]*?<\\\/div>\/gi, \"\")\n        .replace(\/<(?!\\\/?p\\b|\\\/?img\\b)[^>]+>\/gi, \"\");\n    result = result.replace(\/<\\\/?p[^>]*>\/g, \"\\n\");\n    return result.replace(\/\\n+\/g, \"\\n\").trim();\n}\n\n\nfunction getBaseUrl(url) {\n    if (!url) {\n        return null;\n    }\n    url = String(url);\n    if (url.match(\/https?:\\\/\\\/\/i)) {\n        var index = url.indexOf(\"\/\", 9);\n        return index == -1 ? url : url.substring(0, index);\n    }\n    return null;\n}\n\nfunction isIPv4Address(ip) {\n    ip = String(ip);\n    let parts = ip.split(\".\");\n    if (parts.length !== 4) return false;\n\n    for (let part of parts) {\n        if (!\/^\\d+$\/.test(part)) return false; \/\/ \u5fc5\u987b\u662f\u6570\u5b57\n        if (part.length > 1 && part[0] === \"0\") return false; \/\/ \u7981\u6b62\u524d\u5bfc\u96f6\n        let num = parseInt(part, 10);\n        if (num < 0 || num > 255) return false; \/\/ \u8303\u56f4\u68c0\u67e5\n    }\n    return true;\n}\n\nfunction isIPv6Address(ip) {\n    ip = String(ip);\n    \/\/ \u5904\u7406\u53cc\u5192\u53f7\uff08\u6700\u591a\u51fa\u73b0\u4e00\u6b21\uff09\n    if (ip.includes(\":::\")) return false;\n    let doubleColonCount = (ip.match(\/::\/g) || []).length;\n    if (doubleColonCount > 1) return false;\n\n    \/\/ \u5206\u5272\u6210\u7ec4\n    let groups = ip.split(\":\");\n    let validGroupCount = 8;\n    let actualGroupCount = groups.filter((g) => g !== \"\").length;\n\n    \/\/ \u9a8c\u8bc1\u7ec4\u6570\n    if (doubleColonCount === 1) {\n        if (actualGroupCount > validGroupCount - 1) return false;\n    } else {\n        if (groups.length !== validGroupCount) return false;\n    }\n\n    \/\/ \u9a8c\u8bc1\u6bcf\u7ec4\u5185\u5bb9\n    for (let group of groups) {\n        if (group === \"\") continue; \/\/ \u8df3\u8fc7\u7a7a\u7ec4\uff08\u53cc\u5192\u53f7\u90e8\u5206\uff09\n        if (!\/^[0-9a-fA-F]{1,4}$\/.test(group)) return false; \/\/ 1-4\u4f4d\u5341\u516d\u8fdb\u5236\n    }\n    return true;\n}\n\nfunction isIPAddress(input) {\n    return isIPv4Address(input) || isIPv6Address(input);\n}\n\nfunction getSessionId(cookieString) {\n    const match = cookieString.match(\/sessionid=([^;]+)\/);\n    return match ? match[1] : null;\n}\n\nfunction getKey(key) {\n    let parts = key.split(\";\");\n    for (let part of parts) {\n        if (part.includes(\"qttoken\")) {\n            return part.split(\"=\")[1];\n        }\n    }\n    return \"\";\n}\n\nfunction getFanqieCookie() {\n    const {\n        cookie\n    } = this;\n    try {\n        return String(cookie.getCookie('fanqienovel.com') || java.getCookie('fanqienovel.com') || '');\n    } catch (e) {\n        return '';\n    }\n}\n\n\nfunction paraForiOS(html, sources) {\n    return html.replace(\n        \/<p>(.*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\\/>)?<\\\/p>\/g,\n        function(match, text, url, count) {\n            if (url && count) {\n                const encodedUrl = url.replace(\/&\/g, '&amp;');\n                return `<span rs-native>${text}<comment count=\"${count}\" onPress=\"java.showReadingBrowser('${encodedUrl}','${sources}\u6bb5\u8bc4')\"><\/span>`;\n            } else {\n                return `<span rs-native>${text}<\/span>`;\n            }\n        }\n    );\n}","lastUpdateTime":"1767973162755","loginUi":"[{\n        \"name\": \"\u90ae\u7bb1\",\n        \"type\": \"text\"\n    },{\n        \"name\": \"\u5bc6\u7801\",\n        \"type\": \"password\"\n    },\n    {\n        \"name\": \"\u2665\u767b\u5f55\u4e66\u6e90\",\n        \"type\": \"button\",\n        \"action\": \"login(true)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83c\udf45\u756a\u8304\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"fq_login()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83c\udfdd\u7528\u6237\u540e\u53f0\",\n        \"type\": \"button\",\n        \"action\": \"loginqt()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udd10\u6ce8\u518c\u4e66\u6e90\",\n        \"type\": \"button\",\n        \"action\": \"register()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n\n    {\n        \"name\": \" \ud83d\udd1a \u9000\u51fa\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"logout()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udd2e \u68c0\u6d4b\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"checkStatus()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2615\u6253\u8d4f\u4eab\u798f\u5229\",\n        \"type\": \"button\",\n        \"action\": \"vip()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \" \ud83d\uddd1 \u6e05\u9664\u8bbe\u5907\",\n        \"type\": \"button\",\n        \"action\": \"clearDevice()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n\n    }, {\n        \"name\": \"\ud83d\udcd1\u66f4\u5c11\u7b80\u4ecb\",\n        \"type\": \"button\",\n        \"action\": \"set_info()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udcdd\u6bb5\u8bc4\u5f00\u5173\",\n        \"type\": \"button\",\n        \"action\": \"paracomment('fqpara')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udcda \u540c\u6b65\u4e66\u67b6\",\n        \"type\": \"button\",\n        \"action\": \"set_reading()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u264b\ufe0f \u7537\/\u5973\u9891\u9053\",\n        \"type\": \"button\",\n        \"action\": \"set_source_type()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udca2 \u5f3a\u5236\u641c\u7d22\u5168\u90e8\",\n        \"type\": \"button\",\n        \"action\": \"disabledSources()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2747\ufe0f \u66f4\u65b0\u4e66\u6e90\",\n        \"type\": \"button\",\n        \"action\": \"renderVersionPage()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\uddc2\u5f53\u524d\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"get_media()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"\ud83d\udcd6\u5c0f\u8bf4\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u5c0f\u8bf4')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udd0a\u542c\u4e66\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u542c\u4e66')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83c\udfde\u6f2b\u753b\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u6f2b\u753b')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\uddb2\u77ed\u5267\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u77ed\u5267')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83c\udf9a\u5207\u6362\u670d\u52a1\u5668\",\n        \"type\": \"button\",\n        \"action\": \"set_server()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u267b\ufe0f\u68c0\u6d4b\u5f53\u524d\u670d\u52a1\u5668\",\n        \"type\": \"button\",\n        \"action\": \"checkNet()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2695\ufe0f\u672c\u5730\/\u670d\u52a1\u5668 \",\n        \"type\": \"button\",\n        \"action\": \"get_proxy()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udccc\u6c38\u4e45\u53d1\u5e03\u9875\ud83d\udccc\",\n        \"type\": \"button\",\n        \"action\": \"api()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2193\u2193\u4e0b\u65b9\u53ef\u5207\u6362\u6765\u6e90\u7528\u4e8e\u641c\u7d22\/\u53d1\u73b0\u9875\u2193\u2193\",\n        \"type\": \"button\",\n        \"action\": \"get_media()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"\u2728\ufe0f\u7f51\u53cb\u63a8\u8350\",\n        \"type\": \"button\",\n        \"action\": \"set_source('\u63a8\u8350')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udc96\u6211\u6765\u63a8\u8350\",\n        \"type\": \"button\",\n        \"action\": \"put_book()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u5168\u90e8\",\n        \"type\": \"button\",\n        \"action\": \"set_source('\u5168\u90e8')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u756a\u8304')\",\n        'name': '\u756a\u8304',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('69\u4e66\u5427')\",\n        'name': '69\u4e66\u5427',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u4e03\u732b')\",\n        'name': '\u4e03\u732b',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u767e\u5ea6')\",\n        'name': '\u767e\u5ea6',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u8d77\u70b9')\",\n        'name': '\u8d77\u70b9(\u7b2c\u4e09\u65b9)',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5f97\u95f4')\",\n        'name': '\u5f97\u95f4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5854\u8bfb')\",\n        'name': '\u5854\u8bfb',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u4e66\u65d7')\",\n        'name': '\u4e66\u65d7',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('QQ')\",\n        'name': 'QQ',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u732b\u773c')\",\n        'name': '\u732b\u773c',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u641c\u4e66\u795e\u5668')\",\n        'name': '\u641c\u4e66\u795e\u5668',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5f97\u5947')\",\n        'name': '\u5f97\u5947',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u4f2a69')\",\n        'name': '\u4f2a69',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u7231\u4e0b\u7535\u5b50\u4e66')\",\n        'name': '\u7231\u4e0b\u7535\u5b50\u4e66',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5c0f\u7c73')\",\n        'name': '\u5c0f\u7c73',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u661f\u661f\u5c0f\u8bf4')\",\n        'name': '\u661f\u661f\u5c0f\u8bf4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u7b14\u8da3\u960122')\",\n        'name': '\u7b14\u8da3\u960122',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u9876\u70b9')\",\n        'name': '\u9876\u70b9',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5e7b\u68a6\u8f7b\u5c0f\u8bf4')\",\n        'name': '\u5e7b\u68a6\u8f7b\u5c0f\u8bf4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u6c5f\u6e56')\",\n        'name': '\u6c5f\u6e56',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u6b6a\u745e\u53e4\u5fb7')\",\n        'name': '\u6b6a\u745e\u53e4\u5fb7\u6f2b\u753b',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u6cb3\u9a6c')\",\n        'name': '\u6cb3\u9a6c\u77ed\u5267',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u77e5\u4e4e')\",\n        'name': '\u77e5\u4e4e',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('vip')\",\n        'name': '\u4e0b\u65b9\u4e3aVIP\u4e13\u5c5e\u4e66\u6e90(\u70b9\u51fb\u6b64\u5904\u641c\u6240\u6709vip)',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        'action': \"set_source('\u559c\u9a6c\u62c9\u96c5')\",\n        'name': '\u559c\u9a6c\u62c9\u96c5',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('svip')\",\n            'name': '\u4e0b\u65b9\u4e3aSVIP\u4e13\u5c5e\u4e66\u6e90(\u70b9\u51fb\u6b64\u5904\u641c\u6240\u6709svip)',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 1\n            }\n        }, {\n            'action': \"set_source('\u8d85\u4f1a\u4e13\u5c5e\u77ed\u5267')\",\n            'name': '\u8d85\u4f1a\u4e13\u5c5e\u77ed\u5267',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u8d85\u4f1a\u4e13\u5c5e\u5c0f\u8bf4')\",\n            'name': '\u8d85\u4f1a\u4e13\u5c5e\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n        'action': \"set_source('\u9177\u6211')\",\n        'name': '\u9177\u6211',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n            'action': \"set_source('\u53f0\u6e7e\u5c0f\u8bf4')\",\n            'name': '\u53f0\u6e7e\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('3A\u5c0f\u8bf4')\",\n            'name': '3A\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n             'action': \"set_source('\u5305\u5b50\u6f2b\u753b')\",\n            'name': '\u5305\u5b50\u6f2b\u753b',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {       \t  \t\n            'action': \"set_source('QQ\u9605\u8bfb')\",\n            'name': 'QQ(\u4f1a\u5458\u4e66\u7c4d\u514d\u8d39)',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u4e45\u4e45\u5c0f\u8bf4')\",\n            'name': '\u4e45\u4e45\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n        \t    'action': \"set_source('\u8ffd\u66f4\u4eba')\",\n            'name': '\u8ffd\u66f4\u4eba',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u6f2b\u753b\u5c4b')\",\n            'name': '\u6f2b\u753b\u5c4b',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u6f2b\u753b\u7f51')\",\n            'name': '\u6f2b\u753b\u7f51',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('52\u4e66\u5e93')\",\n            'name': '52\u4e66\u5e93',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u8150\u5c0f\u8bf4')\",\n            'name': '\u8150\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u5b8c\u672c\u5c0f\u8bf4')\",\n            'name': '\u5b8c\u672c\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u76d0\u9009\u6587\u5e93')\",\n            'name': '\u76d0\u9009\u6587\u5e93',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {    \t     \t\n            'action': \"set_source('\u6709\u5ea6\u4e2d\u6587')\",\n            'name': '\u6709\u5ea6\u4e2d\u6587',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u4e09\u96f6\u8bfb\u4e66')\",\n            'name': '\u4e09\u96f6\u8bfb\u4e66',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u9e7f\u9e7f')\",\n            'name': '\u9e7f\u9e7f',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u9605\u53cb\u5c0f\u8bf4')\",\n            'name': '\u9605\u53cb\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u661f\u7a7a\u5c0f\u8bf4')\",\n            'name': '\u661f\u7a7a\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u5168\u514d\u6f2b\u753b')\",\n            'name': '\u5168\u514d\u6f2b\u753b',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('365\u5c0f\u8bf4')\",\n            'name': '365\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u51b7\u51b7\u6587\u5b66')\",\n            'name': '\u51b7\u51b7\u6587\u5b66',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u4e07\u76f8\u4e66\u57ce')\",\n            'name': '\u4e07\u76f8\u4e66\u57ce',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n        \t    'action': \"set_source('\u5e7b\u68a6\u8f7b\u5c0f\u8bf4')\",\n            'name': '\u5e7b\u68a6\u8f7b\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u72ec\u6b65\u5c0f\u8bf4')\",\n            'name': '\u72ec\u6b65\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u798f\u4e66\u7f51')\",\n            'name': '\u798f\u4e66\u7f51',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u901f\u8bfb\u8c37')\",\n            'name': '\u901f\u8bfb\u8c37',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u5168\u672c\u540c\u4eba')\",\n            'name': '\u5168\u672c\u540c\u4eba',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n             'action': \"set_source('\u6bd2\u820c\u5f71\u89c6')\",\n            'name': '\u6bd2\u820c\u5f71\u89c6',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n        \"name\": \"\u81ea\u5b9a\u4e49\u641c\u7d22\u6e90(\u591a\u4e2a\u7528\u82f1\u6587,\u5206\u5272)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u542c\u4e66Ai\u97f3\u8272\u586b\u5199\u540e\u70b9\u51fb\u53f3\u4e0a\u89d2\u2714\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u81ea\u5b9a\u4e49\u670d\u52a1\u5668(\u53ef\u4e0d\u586b)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u81ea\u5b9a\u4e49\u8bc4\u8bba\u989c\u8272(\u53ef\u4e0d\u586b)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u6bb5\u8bc4\u6c14\u6ce1\u6837\u5f0f(0-4)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)\",\n        \"type\": \"text\"\n    }\n]","loginUrl":"\/\/ \u5f53\u524d\u4e66\u6e90\u7248\u672c\u53f7\uff0c\u5207\u52ff\u4fee\u6539\uff0c\u5426\u5219\u5f71\u54cd\u66f4\u65b0\u7684\u8bc6\u522b\nconst localVersion = '5.1.9';\n\nfunction login(flag) {\n    if (flag == undefined) {\n        result = JSON.parse(source.getLoginInfo())\n    } else {\n        java.longToast(\"\\n\\n\ud83d\udc9e\u6b63\u5728\u767b\u5f55\u4e2d...\")\n        putLoginInfo(JSON.stringify(result))\n    }\n    let base_url = getArgument('server')\n    let zdyserver = String(result['\u81ea\u5b9a\u4e49\u670d\u52a1\u5668(\u53ef\u4e0d\u586b)']);\n    if (zdyserver.includes('http')) {\n        setArgument('server', zdyserver);\n        if (getKey(String(cookie.getCookie(base_url)))) {\n            let cookies = cookie.getCookie(base_url)\ntry{cookie.removeCookie(base_url)} catch(e){}\n            cookie.setCookie(zdyserver, cookies)\n        }\n        java.toast(`\\n\\n\u5f53\u524d\u670d\u52a1\u5668\u4e3a\u81ea\u5b9a\u4e49\u670d\u52a1\u5668\\n${zdyserver}\\n\\n\u5207\u6362\u670d\u52a1\u5668\u8bf7\u5148\u6e05\u7a7a\u670d\u52a1\u5668\u5730\u5740\u4e2d\u7684\u6570\u636e`);\n    }\n    let zdytone_id = String(result['\u542c\u4e66Ai\u97f3\u8272\u586b\u5199\u540e\u70b9\u51fb\u53f3\u4e0a\u89d2\u2714'] || '');\n    if (zdytone_id) {\n        setArgument('tone_id', zdytone_id);\n    } else {\n        setArgument('tone_id', '\u9ed8\u8ba4\u97f3\u8272');\n    }\n    let plcolor = String(result['\u81ea\u5b9a\u4e49\u8bc4\u8bba\u989c\u8272(\u53ef\u4e0d\u586b)'] || '#000000');\n    if (plcolor) {\n        setArgument('plcolor', plcolor);\n    } else {\n        setArgument('plcolor', '#000000');\n    }\n    let zdysources = String(result['\u81ea\u5b9a\u4e49\u641c\u7d22\u6e90(\u591a\u4e2a\u7528\u82f1\u6587,\u5206\u5272)'] || '');\n    if (zdysources) {\n        setArgument('source', zdysources);\n    };\n    base_url = getArgument('server')\n    let register_email = String(result['\u90ae\u7bb1'])\n    let password = String(result['\u5bc6\u7801'])\n    let key = String(result['\u5bc6\u94a5'] || '')\n\n    \/\/java.log(cookie.getCookie(base_url))\n    if ((register_email && password || key) && !String(getKey(String(cookie.getCookie(base_url))))) {\n        try{cookie.removeCookie(base_url)} catch(e){}\n        let deviceKey = '';\n        try {\n            deviceKey = java.deviceID();\n        } catch (e) {\n            deviceKey = java.androidId();\n        };\n        let deviceId = deviceKey;\n        if (register_email && password) {\n            let options = JSON.stringify({\n                method: 'POST',\n                headers: {\n                    'Content-Type': 'application\/json'\n                },\n                body: JSON.stringify({\n                    register_email: result['\u90ae\u7bb1'],\n                    password: result['\u5bc6\u7801']\n                })\n            })\n            try {\n                let data = JSON.parse(java.ajax(`${base_url}\/login_api,${options}`))\n                if (data.code == 0) {\n                    \/\/java.toast(deviceId)\n                    java.toast(\"\\n\\n\u2705\ufe0f\u767b\u5f55\u6210\u529f\")\n                    cookie.setCookie(base_url, `qttoken=${data.key};deviceId=${deviceId}`)\n                    result['\u5bc6\u94a5'] = data.key\n                    putLoginInfo(JSON.stringify(result))\n                } else {\n                    java.toast('\\n\\n\ud83d\udc94' + data.msg || \"\u767b\u5f55\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5\uff01\")\n                }\n            } catch (e) {\n                java.toast(\"\\n\\n\ud83d\udc94\u767b\u5f55\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5\uff01\\n\" + e.message)\n            }\n        } else {\n            cookie.setCookie(base_url, `qttoken=${key};deviceId=${deviceId}`)\n            let res = java.ajax(`${base_url}\/user_api,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n            try {\n                res = JSON.parse(res)\n                if (res.id != undefined) {\n                    java.toast('\\n\\n\u5bc6\u94a5\u767b\u5f55\u6210\u529f')\n                    result['\u90ae\u7bb1'] = res.email\n                    putLoginInfo(JSON.stringify(result))\n                } else {\n                    throw new Error()\n                }\n            } catch (e) {\n                java.log(e)\n                java.toast(\"\\n\\n\ud83d\udc94\u767b\u5f55\u5931\u8d25\")\n            }\n        }\n    } else if (flag && String(getKey(String(cookie.getCookie(base_url))))) {\n        java.toast(\"\\n\\n\u5f53\u524d\u2705\ufe0f\u5df2\u767b\u5f55\uff0c\u8bf7\ud83d\udeab\u9000\u51fa\u767b\u5f55\u540e\u91cd\u65b0\u767b\u5f55\");\n        \/\/checkStatus();\n    } else if (flag) {\n        java.toast(\"\\n\\n\u26d4\ufe0f\u8bf7\u5148\u586b\u5199\u90ae\u7bb1\u548c\u5bc6\u7801\");\n    }\n}\n\n\/\/ \u68c0\u6d4b\u670d\u52a1\u5668\nfunction checkNet() {\n    let url = getArgument('server');\n    java.longToast(`\\n\\n\u267b\ufe0f\u6b63\u5728\u68c0\u6d4b\uff1a${url}\\n\u8bf7\u7a0d\u7b49~`);\n    let date1 = new Date().getTime();\n    let html = java.ajax(url + '\/login');\n    let date2 = new Date().getTime();\n    let t = date2 - date1;\n    let c = String(html).indexOf('\u5927\u7070\u72fc');\n    let code = 1;\n    let time = t \/ 1000 + 's';\n    let logTime = '\u3010' + url + '\u3011\\n\u250b\u250b\\n' + '\u89e3\u6790\u65f6\u95f4\uff1a' + time;\n    if (c == -1 || t > 5000) {\n        java.longToast('\\n\ud83d\udc94\u3010\u8bbf\u95ee\u5931\u8d25\u63d0\u793a\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2663\ufe0f\u5f53\u524d\u63a5\u53e3\u65e0\u6cd5\u8bbf\u95ee(\u53ef\u80fd\u88ab\u5899)\u2663\ufe0f\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\/\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    } else if (t < 1000) {\n        java.longToast('\\n\ud83d\udc96\u3010\u7f51\u7edc\u73af\u5883\u4f18\u826f\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2764\ufe0f\u5ef6\u8fdf\u4f4e\uff0c\u63a8\u8350\u4f7f\u7528\u6b64\u63a5\u53e3\u2764\ufe0f\\n\u250b\u250b\\n\u7f51\u7edc\u73af\u5883\u4f18\u826f\uff0c\u8bf7\u7ee7\u7eed\u4fdd\u6301\u72b6\u6001\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    } else if (t >= 1000 && t < 2000) {\n        java.longToast('\\n\ud83d\udc9b\u3010\u7f51\u7edc\u73af\u5883\u4e00\u822c\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2666\ufe0f\u5ef6\u8fdf\u4e00\u822c\uff0c\u52c9\u5f3a\u53ef\u4f7f\u7528\u2666\ufe0f\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\u6216\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    } else if (t >= 2000 && t < 5000) {\n        java.longToast('\\n\ud83d\udc94\u3010\u7f51\u7edc\u73af\u5883\u582a\u5fe7\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2660\u5ef6\u8fdf\u8fc7\u9ad8\uff0c\u4e0d\u5efa\u8bae\u4f7f\u7528\u2660\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\u6216\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    }\n}\n\nfunction isVips(res) {\n    let isVIP = '';\n    let vipEndTime = res.vip_end_time;\n    let formattedDate = '';\n\n    if (vipEndTime && vipEndTime !== 0) {\n        let date = new Date(vipEndTime * 1000);\n        formattedDate = `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`;\n        let currentTime = Math.floor(Date.now() \/ 1000);\n        let remainingDays = Math.ceil((vipEndTime - currentTime) \/ (24 * 60 * 60));\n        if (currentTime > vipEndTime) {\n            isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} (\u5df2\u8fc7\u671f)`;\n        } else if (remainingDays <= 7) {\n            isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} \u5269\u4f59${remainingDays}\u5929`;\n        } else {\n            if (vipEndTime < 1912946812) {\n                isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"}(${formattedDate})`;\n            } else {\n                isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} (\u6c38\u4e45)`;\n            }\n        }\n    } else {\n        isVIP = '\u60a8\u5c1a\u672a\u5f00\u901aVIP';\n    }\n    return isVIP;\n}\n\nfunction checkStatus() {\n    java.longToast('\\n\\n\u267b\ufe0f\u68c0\u6d4b\u4e2d...');\n    let base_url = getArgument('server')\n    let res = java.ajax(`${base_url}\/user_api,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n    try {\n        res = JSON.parse(res)\n        if (res.id != undefined) {\n            result['\u90ae\u7bb1'] = res.email\n            putLoginInfo(JSON.stringify(result))\n            let devices\n            try {\n                devices = Object.keys(JSON.parse(res.device)).length;\n            } catch (e) {\n                devices = res.device ? 1 : 0;\n            }\n            let isVip = isVips(res);\n            tips = `\n\u250f\u2505\u2505\u2505\u2505\u2505\u2505\u2531\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2510\n\u3000 \ud83e\udde2\u6635\u79f0 \u3000\u3000\u3000\u3000${res.nickname.padEnd(20,\"\\t\") || \"\u672a\u8bbe\u7f6e\".padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\u2709\ufe0f\u90ae\u7bb1\u3000\u3000\u3000\u3000${res.email.replace(\/(.{3}).*?@\/,\"$1***@\").padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udd11\u5bc6\u94a5\u3000\u3000\u3000\u3000${(`${res.user_key.substring(0,4)}***${res.user_key.slice(-4)}`).padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udcc5\u6ce8\u518c\u65f6\u95f4\u3000\u3000${java.timeFormat(res.register_time*1000).padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\uddd2\ufe0f\u4eca\u65e5\u9605\u8bfb\u3000\u3000${(java.timeFormat(new Date()).slice(0,10)==java.timeFormat(res.last_read_time * 1000).slice(0,10)?res.day_read_count:0).toString().padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udcda\u7d2f\u8ba1\u9605\u8bfb\u3000\u3000${res.all_read_count.toString().padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udd53\u6700\u540e\u9605\u8bfb\u3000\u3000${(res.last_read_time != 0?java.timeFormat(res.last_read_time * 1000):'\u672a\u9605\u8bfb').padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udcf1\u5728\u7ebf\u8bbe\u5907\u3000\u3000${devices.toString().padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udc51\u4f1a\u5458\u72b6\u6001\u3000\u3000${isVip.padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udeab\u5c01\u7981\u72b6\u6001\u3000\u3000${res.is_banned?'\u5df2\u5c01\u7981':'\u6b63\u5e38\u3000'}\u3000\u3000\u3000\u3000\u3000\u3000\u3000\n\u2517\u2505\u2505\u2505\u2505\u2505\u2505\u2539\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2518\n`\n            java.log(tips)\n            java.longToast(tips)\n        } else {\n            throw new Error(res.msg)\n        }\n    } catch (e) {\n        \/\/java.log(e)\n        java.toast(\"\\n\u68c0\u6d4b\u767b\u5f55\u5931\u8d25\\n\" + e.message)\n    }\n}\n\nfunction clearDevice() {\n    let base_url = getArgument('server')\n    let res = java.ajax(`${base_url}\/clear,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n    res = JSON.parse(res);\n   java.toast(res.code == 0 ? \"\\n\\n\ud83d\udcf4\u8bbe\u5907\u6e05\u9664\u6210\u529f\" : res.msg)\n    Packages.java.lang.Thread.sleep(500)\n    checkStatus()\n}\n\/\/ \u4fdd\u5b58\u767b\u5f55UI\u4fe1\u606f\nfunction putLoginInfo(info) {\n    try {\n        let key = java.androidId()\n        let encodeStr = Packages.android.util.Base64.encodeToString(java.createSymmetricCrypto(\"AES\", key).encrypt(info), 2)\n        cache.put(`userInfo_${source.getKey()}`, encodeStr)\n        return true\n    } catch (e) {\n        java.log(e)\n        return source.putLoginInfo(info)\n    }\n}\n\n\/\/ \u7528\u6237\u540e\u53f0\nfunction loginqt() {\n\t   let base_url = getArgument('server');\n\t   let ck = String(cookie.getKey(base_url, \"qttoken\"));\n\t   if (!ck) {\n\t   \tjava.longToast('\\n\\n\ud83d\udeab\u8bf7\u5148\u767b\u5f55!')\n\t   \t} else {\n\t   \t\tjava.startBrowserAwait(getArgument('server') + '\/user', '\u5927\u7070\u72fc\u5c0f\u8bf4\u540e\u53f0');\n\t   \t\t}\n    }\n\n\/\/ \u7528\u6237\u6ce8\u518c\nfunction register() {\n\t   let base_url = getArgument('server');\n\t   \tjava.startBrowserAwait(getArgument('server') + '\/register', '\u5927\u7070\u72fc\u5c0f\u8bf4\u6ce8\u518c');\n    }\n\n\/\/\u767b\u5f55\u756a\u8304\nfunction fq_login() {\n    try {\n        java.startBrowserAwait(\"https:\/\/fanqienovel.com\/\", \"\u767b\u5f55\")\n    } catch (e) {\n        java.toast(e)\n    }\n    try {\n        cookie.removeCookie(\"snssdk.com\")\n    } catch (e) {}\n    var cookie_ = \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : source.getLoginInfoMap()['\u624b\u52a8\u767b\u5f55Token'])\n    let user\n    try {\n        user = JSON.parse(java.ajax(\"https:\/\/fanqienovel.com\/api\/user\/info\/v2,\" + JSON.stringify({\n            method: \"GET\",\n            headers: {\n                \"Cookie\": cookie_\n            }\n        }))).data.name\n    } catch (e) {\n        java.log(e)\n    }\n    if (!cookie_ || cookie_ == \"sessionid=\" || !user) {\n        java.toast(\"\u672a\u83b7\u53d6\u5230\u767b\u5f55\u51ed\u636e\uff0c\u767b\u5f55\u5931\u8d25\")\n        return false\n    }\n    java.toast(\"\\n\\n\u6b22\u8fce \" + user + \"\\n\u767b\u5f55\u6210\u529f\uff01\")\n    return true\n}\n\n\/\/\u9000\u51fa\u767b\u5f55\nfunction logout() {\n    cookie.removeCookie(\"fanqienovel.com\");\n    cookie.removeCookie(\"snssdk.com\");\n    cookie.removeCookie(\"69shuba.com\");\n    \/*\n    let servers = host\n    for (let server of servers) {\n    \ttry{removeCookie(server )} catch(e){cookie.removeCookie(server )}\n    }\n    *\/\ntry{cookie.removeCookie(getArgument('server'))} catch(e){}\n    java.toast(\"\u2705\ufe0f\u9000\u51fa\u767b\u5f55\u6210\u529f\");\n}\n\n\/\/\u83b7\u53d6\u53c2\u6570\nfunction getArgument(key) {\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    return open_argument[key];\n}\n\n\/\/\u8bbe\u7f6e\u53c2\u6570\nfunction setArgument(key, value) {\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    open_argument[key] = value;\n    open_argument = JSON.stringify(open_argument);\n    source.setVariable(open_argument);\n    return open_argument;\n}\n\n\/\/ \u8bbe\u7f6e\u672c\u5730or\u4e91\u7aef\u8bbf\u95ee\nfunction get_proxy() {\n    let proxy = getArgument('proxy');\n    if (proxy == '\u672c\u5730') {\n        setArgument('proxy', '\u4e91\u7aef');\n        java.longToast('\\n\u6240\u6709\u6570\u636e\u91c7\u7528\\n\\n\u670d\u52a1\u5668\u7f51\u7edc\u8bbf\u95ee\\n\\n\u5982\u679c\u53d1\u73b0\u7528\u4e0d\u4e86\uff0c\u8bf7\u5207\u6362\u672c\u5730\u7f51\u7edc\u8bbf\u95ee\uff0c\u598269\u4e66\u5427');\n    } else {\n        setArgument('proxy', '\u672c\u5730');\n        java.longToast('\\n\u6240\u6709\u6570\u636e\u91c7\u7528\\n\\n\u672c\u5730\u7f51\u7edc\u8bbf\u95ee\\n\\n\u5982\u679c\u53d1\u73b0\u7528\u4e0d\u4e86\uff0c\u8bf7\u5f00\u542f\u7f51\u7edc\u4ee3\u7406\uff0c\u598269\u4e66\u5427');\n    }\n}\n\n\n\/\/\u8bbe\u7f6e\u7537\u5973\u9891\nfunction set_source_type() {\n    let source_type = getArgument(\"source_type\");\n    if (source_type == '\u5973\u9891') {\n        setArgument(\"source_type\", '\u7537\u9891');\n    java.toast(\"\\n\u53d1\u73b0\u9875\u5df2\u8bbe\u7f6e\u4e3a:\ud83d\ude4b\u200d\u2642\ufe0f\u7537\u9891\" );\n    } else {\n        setArgument(\"source_type\", '\u5973\u9891');\n    java.toast(\"\\n\u53d1\u73b0\u9875\u5df2\u8bbe\u7f6e\u4e3a:\ud83d\ude4b\u200d\u2640\ufe0f\u5973\u9891\" );\n    }\n    \n}\n\nfunction set_reading() {\n\tlet reading = getArgument(\"reading\");\n    if (reading == '1') {\n        setArgument(\"reading\", '0');\n    java.toast(\"\\n\\n\u5927\u7070\u72fc\u4e66\u67b6\u8bb0\u5f55\u540c\u6b65\u5df2\u5173\u95ed\uff01\" );\n    } else {\n        setArgument(\"reading\", '1');\n    java.longToast(\"\\n\\n\u5927\u7070\u72fc\u4e66\u67b6\u8bb0\u5f55\u540c\u6b65\u5df2\u5f00\u542f\uff01\\n\u5237\u65b0\u9605\u8bfb\u4e66\u67b6\u5373\u53ef\u5c06\u4e66\u67b6\u4e66\u7c4d\u540c\u6b65\u5230\u5927\u7070\u72fc\u4e66\u67b6\uff01\" );\n    }\n\n\t}\n\n\/\/\u9996\u9875\nfunction api() {\n    java.startBrowserAwait('http:\/\/fb.langge.cf', \"\u9996\u9875\");\n}\n\n\/\/\u6253\u8d4f\nfunction vip() {\n\t    let base_url = getArgument('server');\n\t   let ck = String(cookie.getKey(base_url, \"qttoken\"));\n\t   if (!ck) {\n\t   \tjava.longToast('\\n\\n\ud83d\udeab\u8bf7\u5148\u767b\u5f55!')\n\t   \t} else {\n\t   \t\tjava.startBrowserAwait(getArgument('server') + '\/coffee', '\u5927\u7070\u72fc\u5c0f\u8bf4\u4f1a\u5458\u5f00\u901a');\n\t   \t\t}\n    }\n\nvar server = getArgument('server');\n\n\/\/\u8bbe\u7f6e\u641c\u7d22\u5a92\u4f53\nfunction set_media(media) {\n    const mediaConfig = {\n        '\u559c\u9a6c\u62c9\u96c5': ['\u542c\u4e66'],\n        '\u756a\u8304': '*',\n        '\u798f\u5229\u5c0f\u8bf4':['\u5c0f\u8bf4'],\n        '\u5168\u514d\u6f2b\u753b':['\u6f2b\u753b'],\n        '\u5305\u5b50\u6f2b\u753b':['\u6f2b\u753b'],\n        '\u6f2b\u753b\u7f51':['\u6f2b\u753b'],\n        '\u98ce\u8f66\u6f2b\u753b':['\u6f2b\u753b'],\n        '\u798f\u5229\u6f2b\u753b':['\u6f2b\u753b'],\n        '\u597d\u770b\u6f2b\u753b':['\u6f2b\u753b'],\n        '\u9177\u6211':['\u542c\u4e66'],\n        '\u6d77\u6d0b\u542c\u4e66':['\u542c\u4e66'],\n        '\u4e03\u732b': ['\u5c0f\u8bf4', '\u542c\u4e66'],\n        '\u6cb3\u9a6c': ['\u77ed\u5267'],\n        '\u8d85\u4f1a\u4e13\u5c5e\u77ed\u5267': ['\u77ed\u5267'],\n        '\u6b6a\u745e\u53e4\u5fb7': ['\u6f2b\u753b'],\n        '\u6bd2\u820c\u5f71\u89c6':['\u77ed\u5267'],\n        '\u5168\u90e8': '*', \/\/ \u5141\u8bb8\u6240\u6709\u6a21\u5f0f\n        '\u9ed8\u8ba4': ['\u5c0f\u8bf4']\n    };\n\n    const source = getArgument('source');\n    const allowedModes = mediaConfig[source] || mediaConfig['\u9ed8\u8ba4'];\n    let targetMedia = mediaConfig['\u9ed8\u8ba4'][0];\n    let isAllowed = false;\n\n    if (allowedModes === '*' || allowedModes.includes(media)) {\n        targetMedia = media;\n        isAllowed = true;\n    } else if (Array.isArray(allowedModes)) {\n        targetMedia = allowedModes[0];\n    }\n\n    const message = isAllowed ?\n        `\\n\\n\u5df2\u5207\u6362\u81f3\uff1a${targetMedia}\\n\u8bf7\u91cd\u65b0\u641c\u7d22\u4e66\u7c4d\uff01` :\n        `\\n\\n\u76ee\u524d${source}\uff1a\u4e0d\u652f\u6301\u3010${media}\u3011\u6a21\u5f0f\uff01\\n\u5df2\u81ea\u52a8\u5207\u6362\u81f3\uff1a${targetMedia}`;\n\n    setArgument('media', targetMedia);\n    java.toast(message);\n}\n\n\/\/\u83b7\u53d6\u641c\u7d22\u5a92\u4f53\nfunction get_media() {\n    let media = getArgument('media');\n    let source = getArgument('source');\n    if (media == '') {\n        media = '\u5168\u90e8';\n    }\n    var tishi = '\\n\\n\u5f53\u524d\u670d\u52a1\u5668\uff1a' + getArgument('server')\n    java.longToast(`\\n\\n\u5f53\u524d\u4f7f\u7528\u6e90\uff1a${source}-${media}${tishi}`);\n}\n\n\n\/\/\u8bbe\u7f6e\u670d\u52a1\u5668\nfunction set_server() {\n    putLoginInfo(JSON.stringify(result))\n    let zdyserver;\n    let base_url = getArgument('server')\n    try {\n        zdyserver = String(result['\u81ea\u5b9a\u4e49\u670d\u52a1\u5668(\u53ef\u4e0d\u586b)']);\n        if (zdyserver.includes('http')) {\n            setArgument('server', zdyserver);\n            if (getKey(String(cookie.getCookie(base_url)))) {\n                let cookies = cookie.getCookie(base_url)\n                try{cookie.removeCookie(base_url)} catch(e){}\n                cookie.setCookie(zdyserver, cookies)\n            }\n            java.toast(`\\n\\n\u5f53\u524d\u670d\u52a1\u5668\u4e3a\u81ea\u5b9a\u4e49\u670d\u52a1\u5668\\n${zdyserver}\\n\\n\u5207\u6362\u670d\u52a1\u5668\u8bf7\u5148\u6e05\u7a7a\u670d\u52a1\u5668\u5730\u5740\u4e2d\u7684\u6570\u636e`);\n        } else {\n            zdyserver = '';\n        }\n    } catch (error) {\n        zdyserver = '';\n    }\n    if (!zdyserver) {\n        const servers = host\n        const currentServer = getArgument('server') || '';\n        const currentIndex = servers.indexOf(currentServer);\n\n        const nextIndex = currentIndex >= 0 ? (currentIndex + 1) % servers.length : 0;\n        const nextServer = servers[nextIndex];\n\n        setArgument('server', nextServer);\n        if (getKey(String(cookie.getCookie(currentServer)))) {\n            let cookies = cookie.getCookie(currentServer)\ntry{cookie.removeCookie(currentServer)} catch(e){}\n            cookie.setCookie(nextServer, cookies)\n        }\n        java.longToast(`\\n\\n\u670d\u52a1\u5668\u3010${nextIndex+1}\u3011\uff1a${nextServer}`);\n    }\n}\n\n\/\/\u83b7\u53d6\u97f3\u8272\nvar tone_id = getArgument('tone_id');\n\nfunction get_tone_id(arg) {\n    var datadist = {\n        \"0\": \"\u9ed8\u8ba4\u97f3\u8272\",\n        \"-1\": \"\u9605\u8bfb\u6a21\u5f0f\",\n        \"-2\": \"\u6f2b\u753b\u6a21\u5f0f\",\n        \"51\": \"\u591a\u4eba\u53d1\u97f3\",\n        \"1\": \"\u751c\u7f8e\u5c11\u5973\",\n        \"2\": \"\u6e05\u4eae\u9752\u53d4\",\n        \"5\": \"\u5f00\u6717\u9752\u5e74\",\n        \"6\": \"\u6e29\u67d4\u6dd1\u5973\",\n        \"4\": \"\u6210\u719f\u5927\u53d4\",\n        \"74\": \"\u5927\u53d4\u5347\u7ea7\",\n        \"30\": \"\u4f18\u96c5\u5fa1\u59d0\"\n    };\n    var tone_id = datadist[arg] || arg;\n    var tishi = '\\n\\n\u5f53\u524d\u97f3\u8272\uff1a' + tone_id;\n    java.toast(tishi);\n}\n\n\/\/\u8bbe\u7f6e\u97f3\u8272\nfunction set_tone_id(mode, name) {\n    putLoginInfo(JSON.stringify(result))\n    let zdytone_id;\n    try {\n        zdytone_id = String(result['\u5176\u4ed6\u97f3\u8272\u586b\u5199\u540e\u70b9\u51fb\u53f3\u4e0a\u89d2\u2714']);\n        if (zdytone_id) {\n            setArgument('tone_id', zdytone_id);\n            java.toast(`\\n\\n\u5f53\u524d\u97f3\u8272\u4e3a\u81ea\u5b9a\u4e49\u97f3\u8272\\n${zdytone_id}\\n\\n\u5207\u6362\u97f3\u8272\u8bf7\u5148\u6e05\u7a7a\u97f3\u8272\u8f93\u5165\u6846\u4e2d\u7684\u6570\u636e`);\n        } else {\n            zdytone_id = '';\n        }\n    } catch (error) {\n        zdytone_id = '';\n    }\n    if (!zdytone_id) {\n        let toast = \"\\n\\n\u5df2\u5207\u6362\u81f3\uff1a\" + name + '\\n\\n\u5207\u6362\u540e\u9700\u8981\u5237\u65b0\u8be6\u60c5\u9875';\n        setArgument('tone_id', mode);\n        java.toast(toast);\n    }\n}\n\n\/\/\u8bbe\u7f6e\u6765\u6e90\nfunction set_source(sources) {\n    let zdysources = String(result['\u81ea\u5b9a\u4e49\u641c\u7d22\u6e90(\u591a\u4e2a\u7528\u82f1\u6587,\u5206\u5272)'] || '');\n    if (zdysources.length > 1 && zdysources != 'undefined') {\n        java.toast('\\n\\n\u8bf7\u5148\u6e05\u7a7a\u81ea\u5b9a\u4e49\u6e90\u518d\u8bbe\u7f6e');\n    } else {\n        setArgument('source', sources);\n        set_media('\u5c0f\u8bf4');\n        java.toast(`\\n\\n\u5f53\u524d\u6765\u6e90\u5df2\u5207\u6362\u4e3a:\\n${sources}\\n\\n\u5207\u6362\u540e\u8bf7\u91cd\u65b0\u641c\u7d22`);\n    }\n}\n\n\/\/ \u8bbe\u7f6e\u7b80\u4ecb\nfunction set_info() {\n    var info = getArgument('info');\n    if (info == 'on') {\n        setArgument('info', 'off');\n        java.toast('\\n\\n\u5df2\u6062\u590d\u8be6\u60c5\u9875\u8be6\u7ec6\u7b80\u4ecb');\n    } else {\n        setArgument('info', 'on');\n        java.toast('\\n\\n\u5df2\u7cbe\u7b80\u8be6\u60c5\u9875\u7b80\u4ecb');\n    }\n}\n\n\/\/ \u756a\u8304\u6bb5\u8bc4\nfunction paracomment() {\n    var fqpara = getArgument('fqpara');\n    if (fqpara == 'on') {\n        setArgument('fqpara', 'off');\n        java.longToast('\\n\\n\u6bb5\u8bc4\u5df2\u5173\u95ed');\n    } else {\n        setArgument('fqpara', 'on');\n        java.longToast(\"\\n\\n\u6bb5\u8bc4\u5df2\u5f00\u542f\\n\\n\u957f\u6309\u5237\u65b0\u6bb5\u540e\u9762\u7684\u56fe\u7247\u5373\u53ef\\n\\n\u5982\u679c\u56fe\u7247\u4e0d\u663e\u793a\uff0c\u5237\u65b0\u65e0\u53cd\u5e94\\n\u8bf7\u66f4\u65b0\u6d4b\u8bd5\u7248\u9605\u8bfbapp\");\n    }\n}\n\n\/\/ \u5f3a\u5236\u641c\u7d22\u88ab\u7981\u7528\u7684\u6e90\nfunction disabledSources() {\n    var disabled_sources = getArgument('disabled_sources');\n    if (disabled_sources == '1') {\n        setArgument('disabled_sources', '0');\n        java.longToast('\\n\\n\u5f3a\u5236\u641c\u7d22\u7981\u7528\u7684\u6e90\u5df2\u5173\u95ed');\n    } else {\n        setArgument('disabled_sources', '1');\n        setArgument('source', '\u5168\u90e8');\n        java.longToast(\"\\n\\n\u5f3a\u5236\u641c\u7d22\u7981\u7528\u7684\u6e90\u5df2\u5f00\u542f\\n\\n\u6ce8\u610f\uff1a\u5f00\u542f\u540e\u641c\u7d22\u65f6\u95f4\u4f1a\u53d8\u957f\uff01\");\n    }\n}\n\n\/\/ \u6211\u8981\u63a8\u8350\nfunction put_book() {\n    java.startBrowserAwait(getArgument('server') + '\/put_book', '\u6211\u6765\u63a8\u8350');\n}\n\n\/\/ \u4e66\u6e90\u66f4\u65b0\nfunction renderVersionPage() {\n    let yd = '';\n    let html = `\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n  <meta charset=\"UTF-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\n  <title>\u4e66\u6e90\u66f4\u65b0<\/title>\n  <!-- Font Awesome \u56fe\u6807\u5e93 -->\n  <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.4.0\/css\/all.min.css\" \/>\n  <style>\n    :root {\n      --primary-gradient: linear-gradient(135deg, #4e6ef2, #6b2dd8);\n      --latest-gradient: linear-gradient(135deg, #8e2de2 0%, #4a00e0 50%, #d4af37 100%);\n      --success-color: #28c76f;\n      --warning-color: #ff9f43;\n      --error-color: #ea5455;\n      --text-main: #1f2937;\n      --text-secondary: #6b7280;\n      --card-bg: #ffffff;\n      --border-color: #e5e7eb;\n      --light-bg: #f9fafb;\n      --shadow: 0 4px 12px rgba(78, 110, 242, 0.1);\n      --shadow-hover: 0 6px 18px rgba(78, 110, 242, 0.2);\n      --glow-shadow: 0 0 25px rgba(142, 45, 226, 0.5), 0 0 50px rgba(212, 175, 55, 0.3);\n      --modal-bg: rgba(31, 41, 55, 0.8);\n      --modal-content-bg: #ffffff;\n    }\n\n    * {\n      box-sizing: border-box;\n      margin: 0;\n      padding: 0;\n      font-family: 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;\n    }\n\n    body {\n      background: linear-gradient(135deg, #eef2ff, #f5f7ff);\n      color: var(--text-main);\n      min-height: 100vh;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      padding: 16px;\n    }\n\n    \/* \u52a0\u8f7d\u52a8\u753b *\/\n    .loading-wrapper {\n      text-align: center;\n      animation: fadeIn 0.3s ease;\n    }\n\n    .loading-spinner {\n      width: 50px;\n      height: 50px;\n      border: 4px solid rgba(78, 110, 242, 0.3);\n      border-top-color: #4e6ef2;\n      border-radius: 50%;\n      margin: 0 auto 20px;\n      animation: spin 1s linear infinite;\n    }\n\n    .loading-text {\n      color: var(--text-main);\n      font-size: 16px;\n      font-weight: 500;\n    }\n\n    @keyframes spin {\n      to { transform: rotate(360deg); }\n    }\n\n    @keyframes fadeIn {\n      from { opacity: 0; transform: translateY(20px); }\n      to { opacity: 1; transform: translateY(0); }\n    }\n\n    @keyframes slideIn {\n      from { opacity: 0; transform: translateY(30px); }\n      to { opacity: 1; transform: translateY(0); }\n    }\n\n    @keyframes pulse {\n      0%, 100% { opacity: 1; }\n      50% { opacity: 0.7; }\n    }\n\n    @keyframes gradientAnimation {\n      0% { background-position: 0% 50%; }\n      50% { background-position: 100% 50%; }\n      100% { background-position: 0% 50%; }\n    }\n\n    @keyframes breathe {\n      0%, 100% { \n        transform: scale(1);\n        box-shadow: var(--glow-shadow), var(--shadow);\n      }\n      50% { \n        transform: scale(1.02);\n        box-shadow: 0 0 30px rgba(142, 45, 226, 0.6), 0 0 60px rgba(212, 175, 55, 0.4), var(--shadow);\n      }\n    }\n\n    @keyframes shimmer {\n      0% {\n        background-position: -200% center;\n      }\n      100% {\n        background-position: 200% center;\n      }\n    }\n\n    \/* \u4e3b\u5bb9\u5668 *\/\n    .container {\n      width: 100%;\n      max-width: 420px;\n      background: var(--card-bg);\n      border-radius: 24px;\n      overflow: hidden;\n      box-shadow: var(--shadow);\n      position: relative;\n      z-index: 1;\n      animation: slideIn 0.5s ease;\n      display: none;\n    }\n\n    \/* \u5934\u90e8 *\/\n    .header {\n      background: var(--primary-gradient);\n      color: #ffffff;\n      padding: 24px 16px;\n      text-align: center;\n      position: relative;\n      overflow: hidden;\n    }\n\n    .header::before {\n      content: '';\n      position: absolute;\n      top: -30px;\n      left: -30px;\n      width: 80px;\n      height: 80px;\n      background: rgba(255, 255, 255, 0.15);\n      border-radius: 50%;\n    }\n\n    .header::after {\n      content: '';\n      position: absolute;\n      bottom: -60px;\n      right: -60px;\n      width: 150px;\n      height: 150px;\n      background: rgba(255, 255, 255, 0.1);\n      border-radius: 50%;\n    }\n\n    .header h1 {\n      font-size: 1.4rem;\n      font-weight: 700;\n      margin-bottom: 8px;\n      position: relative;\n      z-index: 2;\n    }\n\n    .header p {\n      font-size: 0.9rem;\n      opacity: 0.9;\n      line-height: 1.4;\n      position: relative;\n      z-index: 2;\n    }\n\n    .header-icon {\n      font-size: 48px;\n      margin-bottom: 10px;\n      display: inline-block;\n      animation: bounce 2s ease infinite;\n    }\n\n    @keyframes bounce {\n      0%, 100% { transform: translateY(0); }\n      50% { transform: translateY(-10px); }\n    }\n\n    \/* \u7248\u672c\u5bf9\u6bd4 *\/\n    .version-comparison {\n      display: flex;\n      flex-wrap: nowrap;\n      gap: 12px;\n      padding: 16px;\n      margin-top: 8px;\n      position: relative;\n      z-index: 10;\n    }\n\n    .version-card {\n      flex: 1;\n      min-width: 45%;\n      background: var(--card-bg);\n      border-radius: 16px;\n      padding: 28px 16px 16px;\n      box-shadow: var(--shadow);\n      text-align: center;\n      position: relative;\n      transition: transform 0.3s ease, box-shadow 0.3s ease;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n    }\n\n    .version-card:hover {\n      transform: translateY(-4px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .version-card.current-version {\n      background: linear-gradient(135deg, #ffffff 0%, #f8f9ff 100%);\n      border: 1px solid rgba(78, 110, 242, 0.15);\n    }\n\n    .version-card.current-version:hover {\n      box-shadow: 0 6px 20px rgba(78, 110, 242, 0.15);\n    }\n\n    .version-card.current-version h3,\n    .version-card.current-version .version-number,\n    .version-card.current-version .version-date {\n      color: var(--text-main);\n    }\n\n    .version-card.latest-version {\n      background: var(--latest-gradient);\n      background-size: 300% 300%;\n      box-shadow: var(--glow-shadow), var(--shadow);\n      color: #fff;\n      z-index: 2;\n      animation: gradientAnimation 6s ease infinite, breathe 3s ease-in-out infinite;\n      position: relative;\n      overflow: hidden;\n    }\n\n    .version-card.latest-version::before {\n      content: '';\n      position: absolute;\n      top: -50%;\n      left: -50%;\n      width: 200%;\n      height: 200%;\n      background: linear-gradient(\n        90deg,\n        transparent,\n        rgba(255, 255, 255, 0.3),\n        transparent\n      );\n      transform: rotate(45deg);\n      animation: shimmer 3s infinite;\n    }\n\n    .version-card.latest-version h3,\n    .version-card.latest-version .version-number,\n    .version-card.latest-version .version-date {\n      color: #fff;\n      text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\n      position: relative;\n      z-index: 1;\n    }\n\n    .version-status {\n      position: absolute;\n      top: 6px;\n      right: 6px;\n      padding: 3px 7px;\n      font-size: 0.65rem;\n      font-weight: 600;\n      border-radius: 6px;\n      color: #fff;\n      line-height: 1.2;\n      white-space: nowrap;\n      z-index: 2;\n    }\n\n    .version-card.latest-version .version-status {\n      background: rgba(255, 255, 255, 0.25);\n      backdrop-filter: blur(5px);\n      border: 1px solid rgba(255, 255, 255, 0.3);\n      color: #fff;\n      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n    }\n\n    .status-outdated { background: var(--warning-color); }\n    .status-latest { background: var(--success-color); }\n    .status-invalid { background: var(--error-color); }\n\n    .version-card h3 {\n      font-size: 0.9rem;\n      color: var(--text-secondary);\n      margin-bottom: 8px;\n      font-weight: 500;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 6px;\n    }\n\n    .version-number {\n      font-size: 1.25rem;\n      font-weight: 700;\n      color: var(--text-main);\n      margin: 8px 0;\n      transition: all 0.3s ease;\n      font-family: 'Courier New', monospace;\n    }\n\n    .version-card.latest-version .version-number {\n      font-size: 1.4rem;\n      transform: scale(1.05);\n      text-shadow: \n        0 2px 4px rgba(0, 0, 0, 0.3),\n        0 0 10px rgba(212, 175, 55, 0.8),\n        0 0 20px rgba(212, 175, 55, 0.5);\n      animation: pulse-glow 2s ease-in-out infinite;\n    }\n\n    @keyframes pulse-glow {\n      0%, 100% {\n        text-shadow: \n          0 2px 4px rgba(0, 0, 0, 0.3),\n          0 0 10px rgba(212, 175, 55, 0.8),\n          0 0 20px rgba(212, 175, 55, 0.5);\n      }\n      50% {\n        text-shadow: \n          0 2px 4px rgba(0, 0, 0, 0.3),\n          0 0 15px rgba(212, 175, 55, 1),\n          0 0 30px rgba(212, 175, 55, 0.7);\n      }\n    }\n\n    .version-date {\n      font-size: 0.8rem;\n      color: var(--text-secondary);\n      margin-top: 4px;\n    }\n\n    \/* \u7248\u672c\u5bf9\u6bd4\u6307\u793a\u5668 *\/\n    .version-indicator {\n      position: absolute;\n      left: 50%;\n      top: 50%;\n      transform: translate(-50%, -50%);\n      z-index: 5;\n      width: 32px;\n      height: 32px;\n      border-radius: 50%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n      color: white;\n    }\n\n    .version-indicator.update-needed {\n      background: var(--error-color);\n      box-shadow: 0 2px 8px rgba(234, 84, 85, 0.4);\n      animation: pulse-indicator 1.5s infinite;\n    }\n\n    .version-indicator.is-latest {\n      background: var(--success-color);\n      box-shadow: 0 2px 8px rgba(40, 199, 111, 0.4);\n    }\n\n    @keyframes pulse-indicator {\n      0% { transform: translate(-50%, -50%) scale(1); }\n      50% { transform: translate(-50%, -50%) scale(1.1); }\n      100% { transform: translate(-50%, -50%) scale(1); }\n    }\n\n    \/* \u5185\u5bb9\u533a *\/\n    .content-container {\n      padding: 16px;\n    }\n\n    \/* \u72b6\u6001\u63d0\u793a *\/\n    .status-alert {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      padding: 12px 16px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 10px;\n      font-weight: 500;\n      font-size: 14px;\n      animation: slideIn 0.5s ease 0.3s backwards;\n    }\n\n    .status-alert i {\n      font-size: 20px;\n    }\n\n    .status-alert.update-available {\n      background: linear-gradient(135deg, #ffeaa7 0%, #fdcb6e 100%);\n      color: #d63031;\n      box-shadow: 0 4px 15px rgba(253, 203, 110, 0.4);\n    }\n\n    .status-alert.up-to-date {\n      background: linear-gradient(135deg, #55efc4 0%, #00b894 100%);\n      color: white;\n      box-shadow: 0 4px 15px rgba(0, 184, 148, 0.4);\n    }\n\n    \/* \u66f4\u65b0\u5bb9\u5668 *\/\n    .update-container {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      animation: slideIn 0.5s ease 0.4s backwards;\n    }\n\n    .update-header {\n      background: var(--light-bg);\n      padding: 12px 16px;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      border-bottom: 1px solid var(--border-color);\n    }\n\n    .update-header h2 {\n      font-size: 1rem;\n      font-weight: 600;\n      color: var(--text-main);\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .update-header h2 i {\n      color: #4e6ef2;\n    }\n\n    .update-tag {\n      background: rgba(78, 110, 242, 0.1);\n      color: #4e6ef2;\n      padding: 4px 8px;\n      border-radius: 8px;\n      font-size: 0.75rem;\n      font-weight: 600;\n    }\n\n    .update-content {\n      padding: 16px;\n    }\n\n    .update-date {\n      font-weight: 600;\n      color: #4e6ef2;\n      margin-bottom: 12px;\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      padding: 8px 0;\n      border-bottom: 1px dashed #e0e0e0;\n    }\n\n    .update-text {\n      margin: 8px 0;\n      position: relative;\n      padding-left: 16px;\n      line-height: 1.5;\n      color: var(--text-main);\n      font-size: 0.95rem;\n      white-space: pre-wrap;\n      word-break: break-word;\n    }\n\n    .update-text::before {\n      content: '\u2022';\n      position: absolute;\n      left: 0;\n      font-weight: bold;\n      color: #4e6ef2;\n      font-size: 1.2rem;\n      line-height: 1;\n    }\n\n    \/* \u5386\u53f2\u65e5\u5fd7 *\/\n    .history-container {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      animation: slideIn 0.5s ease 0.5s backwards;\n    }\n\n    .history-header {\n      background: var(--light-bg);\n      padding: 12px 16px;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      border-bottom: 1px solid var(--border-color);\n      cursor: pointer;\n      user-select: none;\n    }\n\n    .history-header:hover {\n      opacity: 0.8;\n    }\n\n    .history-header h2 {\n      font-size: 1rem;\n      font-weight: 600;\n      color: var(--text-main);\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .history-header h2 i {\n      color: #4e6ef2;\n    }\n\n    .toggle-history {\n      background: none;\n      border: none;\n      color: var(--text-secondary);\n      cursor: pointer;\n      font-weight: 500;\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      font-size: 0.85rem;\n      transition: color 0.2s ease;\n    }\n\n    .toggle-history:hover {\n      color: #4e6ef2;\n    }\n\n    .history-content {\n      padding: 0 16px;\n      max-height: 0;\n      overflow: hidden;\n      transition: max-height 0.4s ease, padding 0.4s ease;\n    }\n\n    .history-content.expanded {\n      max-height: 60vh;\n      overflow-y: auto;\n      padding: 16px;\n      scrollbar-width: thin;\n      scrollbar-color: #4e6ef2 #f0f0f0;\n    }\n\n    .history-content.expanded::-webkit-scrollbar {\n      width: 6px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-track {\n      background: #f0f0f0;\n      border-radius: 4px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-thumb {\n      background: #4e6ef2;\n      border-radius: 4px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-thumb:hover {\n      background: #3a56d0;\n    }\n\n    .history-item {\n      margin-bottom: 16px;\n      padding-bottom: 16px;\n      border-bottom: 1px dashed var(--border-color);\n    }\n\n    .history-item:last-child {\n      border-bottom: none;\n      margin-bottom: 0;\n      padding-bottom: 0;\n    }\n\n    .history-date {\n      font-weight: 600;\n      color: var(--text-main);\n      margin-bottom: 8px;\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      font-size: 0.9rem;\n      background: rgba(78, 110, 242, 0.05);\n      padding: 6px 10px;\n      border-radius: 6px;\n    }\n\n    .history-text {\n      margin: 8px 0;\n      padding-left: 16px;\n      line-height: 1.4;\n      color: var(--text-secondary);\n      position: relative;\n      font-size: 0.9rem;\n      white-space: pre-wrap;\n      word-break: break-word;\n    }\n\n    .history-text::before {\n      content: '\u2022';\n      position: absolute;\n      left: 0;\n      color: #4e6ef2;\n      font-weight: bold;\n      font-size: 1.2rem;\n      line-height: 1;\n    }\n\n    \/* \u6309\u94ae\u7ec4 *\/\n    .button-group {\n      display: flex;\n      flex-direction: column;\n      gap: 10px;\n      margin-bottom: 16px;\n    }\n\n    .button {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 10px;\n      padding: 14px 28px;\n      text-align: center;\n      font-size: 1rem;\n      border: none;\n      border-radius: 12px;\n      text-decoration: none;\n      background: var(--primary-gradient);\n      color: white;\n      font-weight: 600;\n      transition: all 0.3s ease;\n      box-shadow: var(--shadow);\n      position: relative;\n      overflow: hidden;\n      cursor: pointer;\n    }\n\n    .button i {\n      font-size: 1rem;\n    }\n\n    .button::after {\n      content: '';\n      position: absolute;\n      top: -50%;\n      left: -50%;\n      width: 200%;\n      height: 200%;\n      background: rgba(255, 255, 255, 0.1);\n      transform: rotate(30deg);\n      transition: all 0.6s ease;\n      pointer-events: none;\n    }\n\n    .button:hover {\n      transform: translateY(-3px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .button:hover::after {\n      transform: rotate(30deg) translate(20%, 20%);\n    }\n\n    .button:active {\n      transform: scale(0.95);\n    }\n\n    \/* \u9519\u8bef\u72b6\u6001 *\/\n    .error-state {\n      text-align: center;\n      padding: 40px 20px;\n      color: var(--text-main);\n    }\n\n    .error-icon {\n      font-size: 64px;\n      margin-bottom: 20px;\n      color: var(--error-color);\n    }\n\n    .error-text {\n      font-size: 16px;\n      line-height: 1.6;\n      margin-bottom: 20px;\n    }\n\n    .retry-button {\n      background: var(--primary-gradient);\n      color: white;\n      padding: 12px 30px;\n      border-radius: 12px;\n      border: none;\n      font-weight: 600;\n      cursor: pointer;\n      transition: all 0.3s ease;\n      font-size: 14px;\n      box-shadow: var(--shadow);\n    }\n\n    .retry-button:hover {\n      transform: translateY(-2px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .retry-button:active {\n      transform: scale(0.95);\n    }\n\n    \/* \u88c5\u9970\u5143\u7d20 *\/\n    .decoration {\n      position: absolute;\n      z-index: 0;\n      pointer-events: none;\n    }\n\n    .decoration.circle {\n      width: 120px;\n      height: 120px;\n      border-radius: 50%;\n      background: rgba(107, 45, 216, 0.05);\n      top: 10%;\n      left: 10%;\n    }\n\n    .decoration.square {\n      width: 80px;\n      height: 80px;\n      transform: rotate(45deg);\n      background: rgba(78, 110, 242, 0.05);\n      bottom: 10%;\n      right: 10%;\n    }\n\n    \/* \u54cd\u5e94\u5f0f *\/\n    @media (max-width: 768px) {\n      body {\n        padding: 12px;\n      }\n\n      .container {\n        max-width: 100%;\n        border-radius: 20px;\n      }\n\n      .header {\n        padding: 20px 15px;\n      }\n\n      .header h1 {\n        font-size: 1.3rem;\n      }\n\n      .header-icon {\n        font-size: 40px;\n      }\n\n      .version-comparison {\n        flex-direction: row;\n        flex-wrap: nowrap;\n        gap: 10px;\n        padding: 12px;\n        margin-top: 6px;\n        overflow-x: auto;\n      }\n\n      .version-card {\n        min-width: 45%;\n        padding: 26px 12px 12px;\n      }\n\n      \/* \u79fb\u52a8\u7aef\u51cf\u5f31\u547c\u5438\u52a8\u6548 *\/\n      .version-card.latest-version {\n        animation: gradientAnimation 6s ease infinite;\n      }\n\n      .version-status {\n        top: 5px;\n        right: 5px;\n        padding: 2px 5px;\n        font-size: 0.6rem;\n      }\n\n      .version-number {\n        font-size: 1.1rem;\n      }\n\n      .version-card.latest-version .version-number {\n        font-size: 1.2rem;\n      }\n\n      .update-header h2, .history-header h2 {\n        font-size: 0.9rem;\n      }\n\n      .button {\n        padding: 12px 24px;\n        font-size: 0.95rem;\n      }\n\n      .history-content.expanded {\n        max-height: 50vh;\n        -webkit-overflow-scrolling: touch;\n      }\n    }\n\n    @media (max-width: 380px) {\n      .header h1 {\n        font-size: 1.2rem;\n      }\n\n      .version-number {\n        font-size: 1rem;\n      }\n\n      .version-card.latest-version .version-number {\n        font-size: 1.1rem;\n      }\n\n      .button {\n        padding: 11px;\n        font-size: 0.9rem;\n      }\n    }\n  <\/style>\n<\/head>\n<body>\n  <div class=\"decoration circle\"><\/div>\n  <div class=\"decoration square\"><\/div>\n\n  <div id=\"loading\" class=\"loading-wrapper\">\n    <div class=\"loading-spinner\"><\/div>\n    <div class=\"loading-text\"><i class=\"fas fa-search\"><\/i> \u6b63\u5728\u68c0\u67e5\u66f4\u65b0...<\/div>\n  <\/div>\n\n  <div class=\"container\" id=\"container\">\n    <div class=\"header\">\n      <div class=\"header-icon\"><i class=\"fas fa-book\"><\/i><\/div>\n      <h1>\u5927\u7070\u72fc\u4e66\u6e90\u66f4\u65b0<\/h1>\n      <p>\u63a8\u8350\u4f7f\u7528\u9605\u8bfb\u6d4b\u8bd5\u7248<br>\u6b63\u5f0f\u7248\u53ef\u80fd\u5b58\u5728\u517c\u5bb9\u6027\u95ee\u9898<\/p>\n    <\/div>\n\n    <div class=\"version-comparison\">\n      <div class=\"version-card current-version\">\n        <div class=\"version-status status-outdated\" id=\"currentStatus\">\u5f85\u68c0\u67e5<\/div>\n        <h3><i class=\"fas fa-cube\"><\/i> \u5f53\u524d\u7248\u672c<\/h3>\n        <div class=\"version-number\" id=\"currentVersion\">-<\/div>\n        <div class=\"version-date\">\u60a8\u7684\u5f53\u524d\u7248\u672c<\/div>\n      <\/div>\n\n      <div class=\"version-indicator update-needed\" id=\"versionIndicator\" style=\"display: none;\">\n        <i class=\"fas fa-arrow-right\"><\/i>\n      <\/div>\n\n      <div class=\"version-card latest-version\">\n        <div class=\"version-status status-latest\" id=\"latestStatus\">\u6700\u65b0\u7248\u672c<\/div>\n        <h3><i class=\"fas fa-star\"><\/i> \u6700\u65b0\u7248\u672c<\/h3>\n        <div class=\"version-number\" id=\"latestVersion\">-<\/div>\n        <div class=\"version-date\">\u53ef\u7528\u6700\u65b0\u7248\u672c<\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"content-container\">\n      <div class=\"status-alert\" id=\"statusAlert\" style=\"display: none;\"><\/div>\n\n      <div id=\"latestLogContainer\" style=\"display: none;\">\n        <div class=\"update-container\">\n          <div class=\"update-header\">\n            <h2><i class=\"fas fa-bolt\"><\/i> \u6700\u65b0\u66f4\u65b0<\/h2>\n            <div class=\"update-tag\">\u6700\u65b0\u53d1\u5e03<\/div>\n          <\/div>\n          <div class=\"update-content\">\n            <div class=\"update-date\" id=\"latestLogDate\"><\/div>\n            <div class=\"update-text\" id=\"latestLogContent\"><\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"button-group\" id=\"buttonGroup\" style=\"display: none;\"><\/div>\n\n      <div class=\"history-container\" id=\"logs\" style=\"display: none;\">\n        <div class=\"history-header\" onclick=\"toggleLogs()\">\n          <h2><i class=\"fas fa-history\"><\/i> \u5386\u53f2\u66f4\u65b0 <span id=\"historyCount\"><\/span><\/h2>\n          <button class=\"toggle-history\" id=\"toggleButton\">\n            <span id=\"toggleText\">\u5c55\u5f00\u5386\u53f2<\/span>\n            <i class=\"fas fa-chevron-down\" id=\"toggleIcon\"><\/i>\n          <\/button>\n        <\/div>\n        <div class=\"history-content\" id=\"logList\"><\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <script>\n  let logsCollapsed = true;\n\n  function toggleLogs() {\n    logsCollapsed = !logsCollapsed;\n    const logList = document.getElementById('logList');\n    const toggleText = document.getElementById('toggleText');\n    const toggleIcon = document.getElementById('toggleIcon');\n    \n    if (logsCollapsed) {\n      logList.classList.remove('expanded');\n      toggleText.textContent = '\u5c55\u5f00\u5386\u53f2';\n      toggleIcon.className = 'fas fa-chevron-down';\n    } else {\n      logList.classList.add('expanded');\n      toggleText.textContent = '\u6536\u8d77\u5386\u53f2';\n      toggleIcon.className = 'fas fa-chevron-up';\n    }\n  }\n\n  (async function() {\n    const loading = document.getElementById('loading');\n    const container = document.getElementById('container');\n    const currentVersion = document.getElementById('currentVersion');\n    const latestVersion = document.getElementById('latestVersion');\n    const currentStatus = document.getElementById('currentStatus');\n    const latestStatus = document.getElementById('latestStatus');\n    const versionIndicator = document.getElementById('versionIndicator');\n    const statusAlert = document.getElementById('statusAlert');\n    const buttonGroup = document.getElementById('buttonGroup');\n    const latestLogContainer = document.getElementById('latestLogContainer');\n    const latestLogDate = document.getElementById('latestLogDate');\n    const latestLogContent = document.getElementById('latestLogContent');\n    const logsContainer = document.getElementById('logs');\n    const logList = document.getElementById('logList');\n    const historyCount = document.getElementById('historyCount');\n\n    const localVer = '${String(localVersion)}';\n\n    \/\/ \u7edf\u4e00\u7684\u670d\u52a1\u5668\u914d\u7f6e - \u65b9\u4fbf\u7ef4\u62a4\n    const serverConfig = {\n      main: {\n        name: '\u4e3b\u7ebf\u8def',\n        icon: 'rocket',\n        baseUrl: 'https:\/\/sy.dashabi.tk',\n        downloadPath: '\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup1: {\n        name: '\u5907\u7528\u7ebf\u8def1',\n        icon: 'box',\n        baseUrl: 'https:\/\/api.langge.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup2: {\n        name: '\u5907\u7528\u7ebf\u8def2',\n        icon: 'satellite',\n        baseUrl: 'https:\/\/20.langge.tk',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup3: {\n        name: '\u5907\u7528\u7ebf\u8def3',\n        icon: 'link',\n        baseUrl: 'http:\/\/219.154.201.122:5006',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup4: {\n        name: '\u5907\u7528\u7ebf\u8def4',\n        icon: 'bolt',\n        baseUrl: 'https:\/\/v2.czyl.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup5: {\n        name: '\u5907\u7528\u7ebf\u8def5',\n        icon: 'globe',\n        baseUrl: 'https:\/\/v10.czyl.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup6: {\n        name: '\u5907\u7528\u7ebf\u8def6',\n        icon: 'broadcast-tower',\n        baseUrl: 'https:\/\/v4.czyl.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      }\n    };\n\n    \/\/ \u7248\u672c\u6bd4\u8f83\u51fd\u6570\n    function compareVersions(vs) {\n      const normalize = (v) => {\n        return v.split('.').map(n => {\n          const num = parseInt(n, 10);\n          return isNaN(num) ? 0 : num;\n        });\n      };\n\n      const parts1 = normalize(localVer);\n      const parts2 = normalize(vs);\n      const maxLength = Math.max(parts1.length, parts2.length);\n      \n      for (let i = 0; i < maxLength; i++) {\n        const num1 = parts1[i] || 0;\n        const num2 = parts2[i] || 0;\n        if (num1 > num2) return 1;\n        if (num1 < num2) return -1;\n      }\n      return 0;\n    }\n\n    async function fetchVersionData() {\n      \/\/ \u4f7f\u7528\u7edf\u4e00\u914d\u7f6e\u4e2d\u9664\u4e3b\u7ebf\u8def\u5916\u7684\u5907\u7528\u7ebf\u8def\u8fdb\u884c\u7248\u672c\u68c0\u67e5\n      const serversToCheck = Object.values(serverConfig).filter(s => s.baseUrl.includes('czyl.cf') || s.baseUrl.includes('219.154'));\n      \n      for (const server of serversToCheck) {\n        try {\n          const response = await fetch(server.baseUrl + '\/version', { timeout: 2000 });\n          if (response.ok) {\n            return await response.json();\n          }\n        } catch (e) {\n          console.warn(\\`\u63a5\u53e3\u5931\u8d25\uff1a\\${server.baseUrl}\\`, e);\n        }\n      }\n      throw new Error('\u6240\u6709\u66f4\u65b0\u63a5\u53e3\u90fd\u8bf7\u6c42\u5931\u8d25');\n    }\n\n    function showError(message) {\n      loading.innerHTML = \\`\n        <div class=\"error-state\">\n          <div class=\"error-icon\"><i class=\"fas fa-exclamation-triangle\"><\/i><\/div>\n          <div class=\"error-text\">\\${message}<\/div>\n          <button class=\"retry-button\" onclick=\"location.reload()\"><i class=\"fas fa-redo\"><\/i> \u91cd\u8bd5<\/button>\n        <\/div>\n      \\`;\n    }\n\n    try {\n      const data = await fetchVersionData();\n      const cloudVersion = String(data.version3);\n      const updateLog = data.update_log || {};\n\n      \/\/ \u663e\u793a\u7248\u672c\u4fe1\u606f\n      currentVersion.textContent = \\`v\\${localVer}\\`;\n      latestVersion.textContent = \\`v\\${cloudVersion}\\`;\n\n      \/\/ \u5904\u7406\u65e5\u5fd7\n      const logEntries = Object.entries(updateLog);\n      if (logEntries.length > 0) {\n        \/\/ \u663e\u793a\u6700\u65b0\u65e5\u5fd7\n        const [latestDate, latestContent] = logEntries[0];\n        latestLogDate.innerHTML = \\`<i class=\"fas fa-calendar-alt\"><\/i> \\${latestDate}\\`;\n        latestLogContent.textContent = latestContent;\n        latestLogContainer.style.display = 'block';\n\n        \/\/ \u663e\u793a\u5386\u53f2\u65e5\u5fd7\n        if (logEntries.length > 1) {\n          const historyLogs = logEntries.slice(1);\n          historyCount.textContent = \\`(\\${historyLogs.length}\u6761)\\`;\n          logList.innerHTML = historyLogs.map(([date, content]) => \\`\n            <div class=\"history-item\">\n              <div class=\"history-date\">\n                <i class=\"fas fa-calendar-day\"><\/i>\n                <span>\\${date}<\/span>\n              <\/div>\n              <div class=\"history-text\">\\${content}<\/div>\n            <\/div>\n          \\`).join('');\n          logsContainer.style.display = 'block';\n        }\n      }\n\n      \/\/ \u68c0\u67e5\u66f4\u65b0\u72b6\u6001\n      const compareResult = compareVersions(cloudVersion);\n      \n      \/\/ \u663e\u793a\u7248\u672c\u6307\u793a\u5668\n      versionIndicator.style.display = 'flex';\n      \n      if (compareResult === -1) {\n        \/\/ \u9700\u8981\u66f4\u65b0\n        currentStatus.textContent = '\u5f85\u66f4\u65b0';\n        currentStatus.className = 'version-status status-outdated';\n        versionIndicator.className = 'version-indicator update-needed';\n        versionIndicator.innerHTML = '<i class=\"fas fa-arrow-right\"><\/i>';\n\n        \/\/ \u4f7f\u7528\u7edf\u4e00\u914d\u7f6e\u751f\u6210\u4e0b\u8f7d\u6309\u94ae\n        buttonGroup.innerHTML = Object.values(serverConfig).map(server => {\n          const fullUrl = server.baseUrl + server.downloadPath;\n          return \\`\n            <a href=\"yuedu:\/\/booksource\/importonline?src=\\${encodeURIComponent(fullUrl)}\" class=\"button\">\n              <i class=\"fas fa-\\${server.icon}\"><\/i>\n              <span>\\${server.name}<\/span>\n            <\/a>\n          \\`;\n        }).join('');\n        buttonGroup.style.display = 'flex';\n      } else {\n        \/\/ \u5df2\u662f\u6700\u65b0\u7248\u672c\n        currentStatus.textContent = '\u6700\u65b0';\n        currentStatus.className = 'version-status status-latest';\n        versionIndicator.className = 'version-indicator is-latest';\n        versionIndicator.innerHTML = '<i class=\"fas fa-check\"><\/i>';\n        \n        statusAlert.className = 'status-alert up-to-date';\n        statusAlert.innerHTML = '<i class=\"fas fa-check-circle\"><\/i> <div>\u60a8\u5df2\u662f\u6700\u65b0\u7248\u672c<\/div>';\n        statusAlert.style.display = 'flex';\n      }\n\n      \/\/ \u663e\u793a\u4e3b\u5bb9\u5668\uff0c\u9690\u85cf\u52a0\u8f7d\n      loading.style.display = 'none';\n      container.style.display = 'block';\n\n    } catch (err) {\n      console.error('\u7248\u672c\u68c0\u67e5\u5931\u8d25\uff1a', err);\n      showError('<i class=\"fas fa-exclamation-circle\"><\/i> \u68c0\u67e5\u66f4\u65b0\u5931\u8d25\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5<br><small>' + err.message + '<\/small>');\n    }\n  })();\n  <\/script>\n<\/body>\n<\/html>\n`;\n    java.startBrowser(`data:text\/html;base64,${java.base64Encode(html)}`, '\u5927\u7070\u72fc\u4e66\u6e90\u66f4\u65b0');\n}","respondTime":180000,"ruleBookInfo":{"author":"$.author","canReName":"1","coverUrl":"$.thumb_url","init":"<js>\nif (String(baseUrl).startsWith(\"data:\")) {\n    let res = JSON.parse(java.hexDecodeToString(result));\n    let book_id = res.book_id;\n    let tab = res.tab;\n    let sources = res.sources;\n    let url = res.url;\n    let html = \"\";\n    let proxy = getArguments(source.getVariable(), \"proxy\");\n    if (url != \"\" && proxy == \"\u672c\u5730\") {\n        if (sources == '69\u4e66\u5427') {\n            let ck69 = String(cookie.getCookie(url));\n            let headers = {\n                \"Cookie\": ck69\n            };\n            let op = JSON.stringify({\n                \"headers\": headers\n            });\n            html = java.ajax(url + ',' + op);\n        } else {\n            html = java.ajax(url);\n        }\n        \/\/java.log(html);\n        if (html.includes(\"Just a moment...\") && sources == '69\u4e66\u5427') {\n            cookie.removeCookie(url);\n            var x = `https:\/\/www.69shuba.com`;\n            java.longToast('\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1');\n            var s = java.startBrowserAwait(x, \"\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1\").body();\n\n            let ck69 = String(cookie.getCookie(url));\n            let headers = {\n                \"Cookie\": ck69\n            };\n            let op = JSON.stringify({\n                \"headers\": headers\n            });\n            java.log(op);\n            html = java.ajax(url + ',' + op);\n            \/\/java.log(html);\n        }\n    }\n    let base_url = getArguments(source.getVariable(), \"server\");\n    let op = {\n        method: \"POST\",\n        body: {\n            html: html\n        }\n    };\n    op = JSON.stringify(op);\n    let varia = String(book.getVariable('custom'));\n    if (varia == 'null') {\n        varia = '';\n    }\n    varia = JSON.stringify({\n        'custom': varia\n    });\n    \/\/varia = java.base64Encode(varia);\n    java.log(`${base_url}\/detail?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\n    result = java.ajax(`${base_url}\/detail?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\n}\nresult\n<\/js>$.data","intro":"<js>\nlet {\n    book_id,\n    source: sources,\n    tab,\n    book_tts,\n    tags,\n    role,\n    last_chapter_title,\n    last_chapter_update_time,\n    word_number,\n    status,\n    score,\n    abstract,\n    copyright_info\n} = result;\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (proxy == \"\u672c\u5730\") {\n    proxy = \"\u672c\u5730\u7f51\u7edc\";\n} else {\n    proxy = \"\u670d\u52a1\u5668\u7f51\u7edc\";\n}\njava.put(\"book_detail\", JSON.stringify(result));\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet key = \"\";\ntry {\n    let cookieValue =\n        String(cookie.getCookie(base_url)) || String(java.getCookie(base_url));\n    key = getKey(cookieValue);\n} catch (e) {\n    key = \"\";\n}\n\nif (key == \"\") {\n    java.log(\"\u5f53\u524d\u670d\u52a1\u5668\u672a\u67e5\u8be2\u5230\u767b\u5f55\u72b6\u6001\uff0c\u5c1d\u8bd5\u67e5\u8be2\u5176\u4ed6\u670d\u52a1\u5668\u767b\u5f55\u72b6\u6001...\");\n    let cookieValue;\n    for (let h of host) {\n        try {\n            cookieValue = String(cookie.getCookie(h)) || String(java.getCookie(h));\n            key = getKey(cookieValue);\n        } catch (e) {\n            key = \"\";\n        }\n        if (key) {\n            java.log(`\u5df2\u5728${h}\u767b\u5f55\uff0c\u9000\u51fa\u67e5\u8be2\uff0c\u6b63\u5728\u8f6c\u79fb\u767b\u5f55\u72b6\u6001\u5230\u5f53\u524d\u670d\u52a1${base_url}`);\n            \/\/java.log(cookieValue)\n            removeCookie(h);\n            removeCookie(base_url);\n            cookie.setCookie(base_url, cookieValue);\n            break;\n        }\n    }\n}\n\nif (book.readConfig == null || book.readConfig.useReplaceRule == null) {\n    book.setUseReplaceRule(false);\n}\n\nlet nickname = '\u8d26\u53f7\u72b6\u6001\uff1a\u26a0\ufe0f \u672a\u767b\u5f55 | \u70b9\u51fb\u53f3\u4e0a\u89d2 \ud83d\udd16 \u767b\u5f55';\ntry {\n    let opcx = {\n        method: \"GET\",\n        headers: {\n            cookie: 'qttoken=' + key + ';'\n        },\n    };\n    opcx = JSON.stringify(opcx);\n    let user_info = JSON.parse(java.ajax(base_url + '\/get_avatar,' + opcx));\n    if (user_info.code == 0) {\n        if (user_info.nickname) {\n            nickname = '\u6b22\u8fce\u56de\u6765\uff1a' + user_info.nickname\n        } else {\n            nickname = '\u6b22\u8fce\u56de\u6765\uff1a' + user_info.email + \"(\u8bf7\u524d\u5f80\u7528\u6237\u540e\u53f0\u8bbe\u7f6e\u7528\u6237\u540d)\"\n        }\n    }\n} catch (e) {\n    if (key) {\n        nickname = '\u8d26\u53f7\u72b6\u6001\uff1a\u5df2\u767b\u5f55'\n    }\n};\n\nlet loginStatus = nickname;\n\nlet lightDivider = \"\u2747\ufe0f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2747\ufe0f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2747\ufe0f\";\nlet heavyDivider = \"&lrm;\\n&lrm;\";\n\nlet isValid = (value) => String(value).length > 1;\nlet ctitle = book.durChapterTitle || '\u672a\u5f00\u59cb';\nlet info = `\n    \ud83d\udce1 \u5f53\u524d\u670d\u52a1\uff1a${base_url}\n    \ud83d\udd11 ${loginStatus}\n    \ud83c\udff7 \u6570\u636e\u6765\u6e90\uff1a${sources}\n    \ud83d\udd04 \u5f53\u524d\u6a21\u5f0f\uff1a${tab}\n    \u2699\ufe0f \u8bbf\u95ee\u6a21\u5f0f\uff1a${proxy}\n    \ud83d\udcd6 \u9605\u8bfb\u81f3\uff1a${ctitle}\n`;\n\nif (tab == \"\u542c\u4e66\") {\n    let toneId = getArguments(source.getVariable(), \"tone_id\");\n    if (isValid(book_tts)) {\n        info += `${lightDivider}\n    \ud83c\udfb5 \u97f3\u8272\u914d\u7f6e\uff1a${toneId}\n    ${book_tts}\n`;\n    }\n}\n\nlet basicInfo = \"\";\nlet addBasicInfo = (value, prefix, icon) => {\n    if (isValid(value)) basicInfo += `    ${icon} ${prefix} ${value}\\n`;\n};\n\naddBasicInfo(tags, \"\u4e66\u7c4d\u5206\u7c7b\uff1a\", \"\ud83c\udf08\");\naddBasicInfo(role, \"\u4e66\u7c4d\u4e3b\u89d2\uff1a\", \"\ud83d\udc51\");\naddBasicInfo(last_chapter_title, \"\u6700\u65b0\u7ae0\u8282\uff1a\", \"\ud83d\udcda\");\naddBasicInfo(last_chapter_update_time, \"\u66f4\u65b0\u65f6\u95f4\uff1a\", \"\u23f3\");\naddBasicInfo(word_number, \"\u4e66\u7c4d\u5b57\u6570\uff1a\", \"\ud83d\udcca\");\naddBasicInfo(status, \"\u4e66\u7c4d\u72b6\u6001\uff1a\", \"\ud83d\udea9\");\naddBasicInfo(score, \"\u4e66\u7c4d\u8bc4\u5206\uff1a\", \"\u2b50\");\n\nif (basicInfo) info += `${lightDivider}\\n${basicInfo}`;\n\nif (isValid(abstract)) {\n    let indentedAbstract = abstract\n        .split(\"\\n\")\n        .map((line) => `    ${line}`)\n        .join(\"\\n\");\n    info += `${heavyDivider}\n    \ud83d\udcd6 \u4e66\u7c4d\u7b80\u4ecb\uff1a\n${indentedAbstract}\n`;\n} else {\n    info += `${heavyDivider}`;\n}\n\nif (isValid(copyright_info)) {\n    info += `${lightDivider}\n    \u00a9 ${copyright_info}\n`;\n} else {\n    info += `${lightDivider}`;\n}\n\ninfo += `\n${heavyDivider}\n    \ud83d\udca0\ud83d\udca0\ud83d\udca0 \u6570\u636e\u66f4\u65b0\u4e8e ${new Date().toLocaleString()} \ud83d\udca0\ud83d\udca0\ud83d\udca0\n`;\nlet jjinfo = getArguments(source.getVariable(), \"info\");\n\nif (jjinfo != \"on\") {\n    info = String(info)\n        .split(\"\\n\")\n        .map((line) => line.replace(\/^ {4}\/, \"\"))\n        .join(\"\\n\");\n} else {\n    basicInfo = \"\";\n    addBasicInfo(last_chapter_title, \"\u6700\u65b0\u7ae0\u8282\uff1a\", \"\ud83d\udcda\");\n    addBasicInfo(last_chapter_update_time, \"\u66f4\u65b0\u65f6\u95f4\uff1a\", \"\u23f3\");\n    addBasicInfo(word_number, \"\u4e66\u7c4d\u5b57\u6570\uff1a\", \"\ud83d\udcca\");\n    addBasicInfo(status, \"\u4e66\u7c4d\u72b6\u6001\uff1a\", \"\ud83d\udea9\");\n    addBasicInfo(score, \"\u4e66\u7c4d\u8bc4\u5206\uff1a\", \"\u2b50\");\n    if (isValid(abstract)) {\n        let indentedAbstract = abstract\n            .split(\"\\n\")\n            .map((line) => `    ${line}`)\n            .join(\"\\n\");\n        basicInfo += `\n    \\n&lrm;\n    \ud83d\udcd6 \u4e66\u7c4d\u7b80\u4ecb\uff1a\n${indentedAbstract}\n`;\n    } else {\n        basicInfo += `${heavyDivider}`;\n    }\n    info = `&lrm;\\n\ud83c\udff7 \u6570\u636e\u6765\u6e90\uff1a${sources}\\n` + basicInfo;\n}\n<\/js>","lastChapter":"{{$.source}} {{$.last_chapter_title}} {{$.last_chapter_update_time}}","name":"$.book_name","tocUrl":"<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || \"\u5c0f\u8bf4\";\nlet url = result.toc_url || \"\";\nvar sdtoken;\ntry {\n    var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n    sdtoken = String(loginInfoMap['\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)'] || '');\n} catch (e) {\n    sdtoken = '';\n}\nvar rawCookie = getFanqieCookie() || sdtoken;\nvar match = rawCookie.match(\/sessionid=[^;]+\/);\nvar fqcookie = match ? match[0] : '';\nvar fqssionid = '';\nif (fqcookie) {\n    fqssionid = getSessionId(fqcookie);\n};\nsetArguments('fqssionid', fqssionid);\njava.put(\"tab\", tab);\njava.put(\"book_id\", book_id);\nlet qtcatalog = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url,\n};\nqtcatalog = java.base64Encode(JSON.stringify(qtcatalog));\n`data:;base64,${qtcatalog},{\"type\":\"qingtian2\"}`;\n<\/js>","wordCount":"$.word_number"},"ruleContent":{"content":"<js>\nresult = String(java.hexDecodeToString(result));\nlet res;\nif (result.match(\/\u5927\u7070\u72fc\u878d\u5408\/)) {\n    result = result.split(\"\u5927\u7070\u72fc\u878d\u54084\");\n    res = {\n        item_id: result[0],\n        tab: result[1],\n        title: result[2],\n        sources: result[3],\n        url: \"\"\n    };\n} else {\n    res = JSON.parse(result);\n}\nlet varia = String(book.getVariable('custom'));\nif (varia == 'null') {\n    varia = '';\n}\nvaria = JSON.stringify({\n    'custom': varia\n});\n\/\/  varia = java.base64Encode(varia);\nlet book_id = res.book_id;\nlet item_id = res.item_id;\nlet tab = res.tab;\nlet title = res.title;\nlet sources = res.sources;\nlet url = res.url;\nlet html = \"\";\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (url != \"\" && proxy == \"\u672c\u5730\") {\n    if (sources == '69\u4e66\u5427') {\n        let ck69 = String(cookie.getCookie(url));\n        let headers = {\n            \"Cookie\": ck69,\n            \"User-Agent\": \"Mozilla\/5.0 (Linux; Android 6.0; Nexus 5 Build\/MRA58N) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Mobile Safari\/537.36 Edg\/138.0.0.0\"\n        };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        java.log(url);\n        java.log(op);\n        html = java.ajax(url + ',' + op);\n    } else {\n        html = java.ajax(url);\n    }\n    java.log(html);\n    if (html.includes(\"Just a moment...\") && sources == '69\u4e66\u5427' && book.durChapterIndex === chapter.index) {\n        cookie.removeCookie(url);\n        var x = url;\n        java.longToast('\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1');\n        var s = java.startBrowserAwait(x, \"\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1\").body();\n\n        let ck69 = String(cookie.getCookie(url));\n        let headers = {\n            \"User-Agent\": \"Mozilla\/5.0 (Linux; Android 6.0; Nexus 5 Build\/MRA58N) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Mobile Safari\/537.36 Edg\/138.0.0.0\",\n            \"Cookie\": ck69\n        };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        java.log(op);\n        html = java.ajax(url + ',' + op);\n        \/\/java.log(html);\n    }\n};\nlet content = \"\";\nlet data;\nlet tone_id = getArguments(source.getVariable(), \"tone_id\");\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet device, device_type;\ntry {\n    device = java.deviceID();\n    device_type = \"\u82f9\u679c\";\n} catch (e) {\n    try {\n        device = java.androidId();\n        device_type = \"\u5b89\u5353\";\n    } catch (e) {\n        device = \"\";\n        device_type = \"\u5b89\u5353\";\n    }\n}\n\nlet qtcookie = cookie.getCookie(base_url);\ntry {\n    qtcookie = `qttoken=${String(cookie.getKey(base_url, \"qttoken\"))}; deviceId=${device};`\n} catch (e) {}\n\nvar params = {\n    html: html,\n    item_id: item_id,\n    source: sources,\n    tab: tab,\n    tone_id: tone_id,\n    variable: varia,\n    version: '4.11.5.1'\n};\n\nvar content_url = '\/content';\n\nif ((sources == \"\u756a\u8304\" || sources == \"\u4e03\u732b\" || sources == \"\u5854\u8bfb\") && getArguments(source.getVariable(), \"fqpara\") == \"on\" && tab == \"\u5c0f\u8bf4\") {\n    content_url = '\/content?review=1';\n}\n\n\/\/var signInfo = generateComplexSignature('POST', content_url, {}, APP_SECRET, params);\n\n\n\/\/var signedParams = copyObject(params);\n\/\/signedParams.timestamp = signInfo.timestamp;\n\/\/signedParams.nonce = signInfo.nonce;\n\/\/signedParams.sign = signInfo.sign;\n\n\nvar op = {\n    method: \"POST\",\n    body: JSON.stringify(params),\n    headers: {\n        cookie: qtcookie,\n        'Content-Type': 'application\/json'\n    }\n};\n\nop = JSON.stringify(op);\njava.log(op);\ndata = java.ajax(base_url + content_url + `,${op}`);\n\ntry {\n    data = JSON.parse(data);\n    if (data.msg) {\n        java.toast(data.msg);\n    }\n} catch (e) {}\n\ncontent = data.content\n\nif ((sources == \"\u756a\u8304\" || sources == \"\u4e03\u732b\" || sources == \"\u5854\u8bfb\") && getArguments(source.getVariable(), \"fqpara\") == \"on\" && tab == \"\u5c0f\u8bf4\") {\n    var fqssionid = getArguments(source.getVariable(), \"fqssionid\") || \"\";\n    content = content\n        .replace(\/ident=\"\/g, 'ident=\"' + base_url)\n        .replace(\/book_id=\/g, 'book_id=' + book_id + '&ssionid=' + fqssionid);\n    if (device_type == \"\u82f9\u679c\") {\n        content = paraForiOS(content, sources);\n    } else {\n        content = paraForAndroid(content, sources);\n    }\n\n\n}\ndata = JSON.stringify({\n    content: content,\n});\n\nif (device_type == \"\u5b89\u5353\" && (tab == \"\u77ed\u5267\" || tab == \"\u89c6\u9891\" || sources == '\u6bd2\u820c\u5f71\u89c6')) {\n    data = {\n        content: `\u3010\u53f3\u4e0a\u89d2\u5237\u65b0\u3011\u5f00\u542f\u64ad\u653e(\u4e0b\u4e00\u96c6\u8bf7\u5207\u6362\u4e0b\u4e00\u7ae0\u5237\u65b0)\\n\u64ad\u653e\u76f4\u94fe\uff1a\\n${content}`,\n    };\n    data = JSON.stringify(data);\n    if (book.durChapterIndex === chapter.index) {\n        let video_url = `${base_url}\/online_video?book_id=${book_id}&source=${sources}&tab=${tab}`;\n        if (sources == '\u6bd2\u820c\u5f71\u89c6') {\n            video_url = content;\n        };\n        java.startBrowser(video_url, title);\n        java.toast(\"\u6b63\u5728\u52a0\u8f7d\u89c6\u9891...\");\n    }\n\n}\ndata;\n<\/js>$.content","imageStyle":"TEXT"},"ruleExplore":{"author":"$.author","bookList":"$.data","bookUrl":"<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || '\u5c0f\u8bf4';\nlet url = result.toc_url || '';\n\nlet qtdetail = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url\n}\nqtdetail = java.base64Encode(JSON.stringify(qtdetail));\n`data:;base64,${qtdetail},{\"type\":\"qingtian\"}`\n<\/js>","coverUrl":"$.thumb_url","intro":"$.abstract","kind":"{{$.category}}\n{{$.score}}\n{{$.status}}\n{{$.source}}\n{{$.tags}}","lastChapter":"{{$.last_chapter_title}} \u2022 {{$.last_update_time}}","name":"$.book_name","wordCount":"$.word_number"},"ruleSearch":{"author":"$.author","bookList":"$.data","bookUrl":"<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || '\u5c0f\u8bf4';\nlet url = result.toc_url || '';\n\nlet qtdetail = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url\n}\nqtdetail = java.base64Encode(JSON.stringify(qtdetail));\n`data:;base64,${qtdetail},{\"type\":\"qingtian\"}`\n<\/js>","checkKeyWord":"\u6211\u768426\u5c81\u5973\u623f\u5ba2@\u756a\u8304","coverUrl":"$.thumb_url","intro":"$.abstract","kind":"{{$.status}},{{$.score}},{{$.tags}},{{$.last_chapter_update_time}}","lastChapter":"{{$.source}} {{$.last_chapter_title}}","name":"$.book_name##\uff08\u522b\u540d\uff1a.*?\uff09","wordCount":"$.word_number"},"ruleToc":{"chapterList":"<js>\nlet res = JSON.parse(java.hexDecodeToString(result));\nif (res.method) {\n    res = Object.fromEntries(\n        res.body\n        .replace(\"source\", \"sources\")\n        .split(\"&\")\n        .map((query) => query.split(\"=\"))\n    );\n    res.url = \"\";\n}\nlet book_id = res.book_id;\njava.put('book_id', book_id);\nlet tab = res.tab;\nlet sources = res.sources;\nlet url = res.url;\nlet html = \"\";\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (url != \"\" && proxy == \"\u672c\u5730\") {\n    if (sources == '69\u4e66\u5427') {\n        let ck69 = String(cookie.getCookie(url));\n        let headers = {\n            \"Cookie\": ck69\n        };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        html = java.ajax(url + ',' + op);\n    } else {\n        html = java.ajax(url);\n    }\n    \/\/java.log(html);\n    if (html.includes(\"Just a moment...\") && sources == '69\u4e66\u5427') {\n        cookie.removeCookie(url);\n        var x = `https:\/\/www.69shuba.com`;\n        java.longToast('\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1');\n        var s = java.startBrowserAwait(x, \"\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1\").body();\n\n        let ck69 = String(cookie.getCookie(url));\n        let headers = {\n            \"Cookie\": ck69\n        };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        \/\/java.log(op);\n        html = java.ajax(url + ',' + op);\n        \/\/java.log(html);\n    }\n};\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet op = {\n    method: \"POST\",\n    body: {\n        html: html\n    }\n};\nop = JSON.stringify(op);\nlet varia = String(book.getVariable('custom'));\nif (varia == 'null') {\n    varia = '';\n}\nvaria = JSON.stringify({\n    'custom': varia\n});\n\/\/ varia = java.base64Encode(varia);\n\/\/java.log(`${base_url}\/catalog?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\nlet data = java.ajax(\n    `${base_url}\/catalog?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`\n);\nlet device, device_type;\ntry {\n    device = java.deviceID();\n    device_type = \"\u82f9\u679c\";\n} catch (e) {\n    try {\n        device = java.androidId();\n        device_type = \"\u5b89\u5353\";\n    } catch (e) {\n        device = \"\";\n        device_type = \"\u5b89\u5353\";\n    }\n}\n\nif (tab == \"\u5c0f\u8bf4\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 8;\n    } else {\n        book.type = 0;\n    }\n} else if (tab == \"\u542c\u4e66\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 32;\n    } else {\n        book.type = 1;\n    }\n} else if (tab == \"\u6f2b\u753b\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 64;\n    } else {\n        book.type = 2;\n    }\n} else if (tab == \"\u77ed\u5267\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 8;\n    } else {\n        book.type = 3;\n    }\n} else {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 8;\n    } else {\n        book.type = 0;\n    }\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet reading = getArguments(source.getVariable(), \"reading\");\n\nif (book && book.order != 0 && reading == '1') {\n    try {\n        if (!data || !book.variable || !base_url || !qtcookie) {\n            java.log('\u7f3a\u5c11\u5fc5\u8981\u53c2\u6570');\n        } else {\n            let parsedData;\n            try {\n                parsedData = JSON.parse(data);\n            } catch (e) {\n                java.log('\u89e3\u6790data\u6570\u636e\u5931\u8d25:' + e);\n            }\n            \n            if (parsedData && parsedData.data && Array.isArray(parsedData.data) && parsedData.data[book.durChapterIndex]) {\n                let ritem = parsedData.data[book.durChapterIndex];\n                let bookInfoObj;\n                try {\n                    bookInfoObj = JSON.parse(book.variable);\n                } catch (e) {\n                    java.log('\u89e3\u6790book.variable\u5931\u8d25:' + e);\n                }\n                \n                if (bookInfoObj) {\n                    let book_info;\n                    try {\n                        book_info = JSON.parse(bookInfoObj.book_detail || JSON.stringify(bookInfoObj));\n                    } catch (e) {\n                        java.log('\u89e3\u6790book_detail\u5931\u8d25:' + e);\n                    }\n                    \n                    if (book_info && typeof book_info === 'object') {\n                        let rurl = base_url + '\/add_book_to_book_shelf,';\n                        book_info['read_status'] = 1;\n                        book_info['last_chapter_item_id'] = ritem.item_id || '';\n                        book_info['last_chapter_title'] = ritem.title || '';\n                        let rop = {\n                            method: \"POST\",\n                            headers: {\n                                cookie: qtcookie\n                            },\n                            body: book_info\n                        };\n                        let check_book_url = base_url + '\/check_book_in_book_shelf,';\n                        let checkResponse;\n                        \n                        try {\n                            checkResponse = java.ajax(check_book_url + JSON.stringify(rop));\n                        } catch (e) {\n                            java.log('\u68c0\u67e5\u4e66\u7c4d\u8bf7\u6c42\u5931\u8d25:' + e);\n                        }\n                        \n                        if (checkResponse) {\n                            let check_data;\n                            try {\n                                check_data = JSON.parse(checkResponse).data;\n                            } catch (e) {\n                                java.log('\u89e3\u6790\u68c0\u67e5\u54cd\u5e94\u5931\u8d25:' + e);\n                            }\n                            try {\n                                if (check_data && check_data.id) {\n                                    book_info['id'] = check_data.id;\n                                    let uurl = base_url + '\/update_book_shelf,';\n                                    java.ajax(uurl + JSON.stringify(rop));\n                                } else {\n                                    java.ajax(rurl + JSON.stringify(rop));\n                                }\n                            } catch (e) {\n                                java.log('\u4e66\u67b6\u64cd\u4f5c\u5931\u8d25:' + e);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    } catch (error) {\n        java.log('\u4e66\u7c4d\u540c\u6b65\u6d41\u7a0b\u5f02\u5e38:' + error);\n        java.longToast('\\n\u540c\u6b65\u9605\u8bfb\u8fdb\u5ea6\u5931\u8d25\uff0c\u4f46\u4e0d\u5f71\u54cd\u9605\u8bfb\uff0c\u53ef\u4ee5\u524d\u5f80\u767b\u5f55\u5173\u95ed\u4e66\u67b6\u540c\u6b65\u529f\u80fd\u3002');\n    }\n}\ndata;\n<\/js>$.data","chapterName":"$.title","chapterUrl":"<js>\nlet tab = result.tab;\nlet sources = result.source;\nlet title = result.title;\nlet item_id = result.item_id;\nlet book_id = java.get(\"book_id\");\nlet url = result.toc_url || \"\";\nlet qtcontent = {\n    book_id: book_id,\n    item_id: item_id,\n    title: title,\n    sources: sources,\n    tab: tab,\n    url: url,\n};\nqtcontent = java.base64Encode(JSON.stringify(qtcontent));\nif (sources == '\u5377') {\n    content_url = item_id\n} else if ((sources == \"\u756a\u8304\" || sources == \"\u4e03\u732b\" || sources == \"\u5854\u8bfb\") && tab == \"\u5c0f\u8bf4\") {\n    var base_url = getArguments(source.getVariable(), \"server\") || \"\";\n    var fqssionid = getArguments(source.getVariable(), \"fqssionid\") || \"\";\n    let sourcess = sources.replace('svip_', '');\n    content_url = `data:;base64,${qtcontent},{\"type\":\"qingtian3\",\"js\":\"book ? result : '${base_url}\/get_review?book_id=${book_id}&item_id=${item_id}&ssionid=${fqssionid}&source=${sourcess}'\"}`;\n} else {\n    content_url = `data:;base64,${qtcontent},{\"type\":\"qingtian3\"}`;\n}\n<\/js>","updateTime":"$.first_pass_time"},"searchUrl":"<js>\nlet base_url = getArguments(source.getVariable(), 'server');\nlet media;\nlet sources = getArguments(source.getVariable(), 'source');\nlet disabled_sources = getArguments(source.getVariable(), 'disabled_sources');\nif (String(key).startsWith(\"m:\") || String(key).startsWith(\"m\uff1a\")) {\n    media = \"\u6f2b\u753b\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"t:\") || String(key).startsWith(\"t\uff1a\")) {\n    media = \"\u542c\u4e66\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"d:\") || String(key).startsWith(\"d\uff1a\")) {\n    media = \"\u77ed\u5267\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"x:\") || String(key).startsWith(\"x\uff1a\")) {\n    media = \"\u5c0f\u8bf4\"\n    key = key.slice(2)\n} else {\n    media = getArguments(source.getVariable(), 'media');\n}\nif (key.includes('@')) {\n    var parts = key.split('@');\n    key = parts[0];\n    sources = parts[1] || sources;\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet op = {\n    method: \"GET\",\n    headers: {\n        cookie: qtcookie\n    },\n};\nop = JSON.stringify(op);\n`${base_url}\/search?title=${key}&tab=${media}&source=${sources}&page={{page}}&disabled_sources=${disabled_sources},${op}`\n<\/js>","weight":0},{"bookSourceComment":"build 2026-1-10\n\u96e8\u843d\u661f\u8fb0\n\u5931\u6548\u53cd\u9988\uff1a961955482","bookSourceGroup":"\u76d7\u7248,\u661f\u8fb0","bookSourceName":"\u6c49\u4e66\u4e66","bookSourceType":0,"bookSourceUrl":"https:\/\/m.hanshubooks.com\/","customOrder":1,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"@js:\nconst createItem = (t, u, p) => ({ title: t, url: u || \"\", style: { layout_flexGrow: 1, layout_flexBasisPercent: p } });\nconst dataList = [createItem(\"\u6392\u884c\u699c\", \"\", 1)];\n\n\/\/ \u63d0\u53d6\u6392\u884c\u699c\u516c\u5171\u524d\u7f00\nconst rankPrefix = \"\/top\/rankings\/\";\n[\n  [\"\u65e5\u70b9\u51fb\u699c\", \"dayvisit\"],\n  [\"\u5468\u70b9\u51fb\u699c\", \"weekvisit\"],\n  [\"\u6708\u70b9\u51fb\u699c\", \"monthvisit\"],\n  [\"\u603b\u70b9\u51fb\u699c\", \"allvisit\"],\n  [\"\u65e5\u63a8\u8350\u699c\", \"dayvote\"],\n  [\"\u5468\u63a8\u8350\u699c\", \"weekvote\"],\n  [\"\u6708\u63a8\u8350\u699c\", \"monthvote\"],\n  [\"\u603b\u63a8\u8350\u699c\", \"allvote\"],\n  [\"\u603b\u6536\u85cf\u699c\", \"goodnum\"],\n  [\"\u5b57\u6570\u6392\u884c\", \"size\"],\n  [\"\u6700\u65b0\u5165\u5e93\", \"postdate\"],\n  [\"\u6700\u8fd1\u66f4\u65b0\", \"lastupdate\"]\n].forEach(([t, path]) => dataList.push(createItem(t, `${rankPrefix}${path}\/{{page}}.shtml`, 0.25)));\n\ndataList.push(createItem(\"\u4e66\u5e93\", \"\", 1));\n\n\/\/ \u63d0\u53d6\u4e66\u5e93\u516c\u5171\u524d\u7f00\nconst bookPrefix = \"\/typeinfo\/type-\";\n[\n  [\"\u7384\u5e7b\u9b54\u6cd5\", 1],\n  [\"\u6b66\u4fa0\u4fee\u771f\", 2],\n  [\"\u90fd\u5e02\u8a00\u60c5\", 3],\n  [\"\u5386\u53f2\u519b\u4e8b\", 4],\n  [\"\u7f51\u6e38\u7ade\u6280\", 5],\n  [\"\u79d1\u5e7b\u5c0f\u8bf4\", 6],\n  [\"\u6050\u6016\u7075\u5f02\", 7],\n  [\"\u5176\u4ed6\u5c0f\u8bf4\", 8]\n].forEach(([t, type]) => dataList.push(createItem(t, `${bookPrefix}${type}\/{{page}}-pg.shtml`, 0.25)));\n\/\/ \u5355\u72ec\u5904\u7406\u5b8c\u7ed3\u5c0f\u8bf4\uff08\u8def\u5f84\u65e0\u89c4\u5f8b\uff09\ndataList.push(createItem(\"\u5b8c\u7ed3\u5c0f\u8bf4\", \"\/completepage\/read-1-final.shtml\", 0.5));\n\nJSON.stringify(dataList, null, 2);\n","header":"@js:\nJSON.stringify({\n\"User-Agent\": java.getWebViewUA()\n})","lastUpdateTime":"1768028671129","loginCheckJs":"if (result.body().includes(\"Just a moment\")) {\n\tjava.startBrowserAwait(result.url(), \"\u9a8c\u8bc1\")\n\t} else result","respondTime":180000,"ruleBookInfo":{"author":"[property=\"og:novel:author\"]@content","coverUrl":"[property=\"og:image\"]@content","intro":"[property=\"og:description\"]@content","kind":"[property=\"og:novel:status\"]@content&&[property=\"og:novel:category\"]@content&&[property=\"og:novel:update_time\"]@content","lastChapter":"[property=\"og:novel:latest_chapter_name\"]","name":"[property=\"og:novel:book_name\"]@content"},"ruleContent":{"content":".content@html","nextContentUrl":"text.\u4e0b\u4e00\u9875@href"},"ruleExplore":{"author":"span.1@text##\\|(.*)","bookList":".app_listBlock_con@ul@li","bookUrl":"a@href","coverUrl":"img@src","intro":"span.-2@text","kind":"span.1@text##(.*)\\|","name":"img@title"},"ruleSearch":{"author":"span.1@text##\\|(.*)","bookList":"<js>\nurl = `${source.key}s.php,{\n  \"body\": \"keyword=${java.get(\"key\")}&code=${java.getVerificationCode(source.key+'searchcode.php?'+Date.now())}\",\n  \"method\": \"POST\"\n}`\njava.log(url)\njava.ajax(url)\n<\/js>\n.app_listBlock_con@ul@li","bookUrl":"a.0@href","checkKeyWord":"\u82df\u5728\u521d\u5723","coverUrl":"img@src","intro":"span.-2@text","kind":"span.1@text##(.*)\\|","name":"img@title"},"ruleToc":{"chapterList":".app_catalogList2 ul li a","chapterName":"text","chapterUrl":"href","nextTocUrl":"select@option!0@value"},"searchUrl":"@js:\njava.put(\"key\", key)\n\"https:\/\/m.hanshubooks.com\/topsort\/\"","weight":0},{"bookSourceType":0,"bookSourceName":"\u901f\u8bfb\u8c37","bookSourceGroup":"\u5c0f\u8bf4","bookSourceUrl":"https:\/\/www.sudugu.org","loginUrl":"","loginUi":"","loginCheckJs":"","concurrentRate":"3","header":"{\"User-Agent\": \"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36\"}","bookUrlPattern":"","searchUrl":"https:\/\/www.sudugu.org\/i\/sor.aspx?key={{key}}","exploreUrl":"[{\"title\":\"\u7384\u5e7b\u5c0f\u8bf4\",\"url\":\"\/xuanhuan\/\"}, {\"title\":\"\u4ed9\u4fa0\u5c0f\u8bf4\",\"url\":\"\/xianxia\/\"}, {\"title\":\"\u90fd\u5e02\u5c0f\u8bf4\",\"url\":\"\/dushi\/\"}, {\"title\":\"\u5386\u53f2\u5c0f\u8bf4\",\"url\":\"\/lishi\/\"}, {\"title\":\"\u519b\u4e8b\u5c0f\u8bf4\",\"url\":\"\/junshi\/\"}, {\"title\":\"\u79d1\u5e7b\u5c0f\u8bf4\",\"url\":\"\/kehuan\/\"}, {\"title\":\"\u8a00\u60c5\u5c0f\u8bf4\",\"url\":\"\/yanqing\/\"}]","ruleSearch":{"checkKeyWord":"\u5929\u624d\u6e38\u4e50\u573a","bookList":"class.item","name":"tag.h3@tag.a@text","author":"tag.p.1@tag.a@text##\u4f5c\u8005\uff1a","kind":"tag.p.0@tag.span.1@text","wordCount":"","lastChapter":"tag.ul@tag.li.0@tag.a@text","intro":"","coverUrl":"tag.img@src","bookUrl":"tag.h3@tag.a@href"},"ruleExplore":{"bookList":"class.item","name":"tag.h3@tag.a@text","author":"tag.p.1@tag.a@text##\u4f5c\u8005\uff1a","kind":"tag.p.0@tag.span.1@text","wordCount":"","lastChapter":"tag.ul@tag.li.0@tag.a@text","intro":"","coverUrl":"tag.img@src","bookUrl":"tag.h3@tag.a@href"},"ruleFind":{"url":"https:\/\/www.sudugu.org\/fenlei\/","bookList":"class.ct@tag.a","name":"text","author":"","kind":"","wordCount":"","lastChapter":"","intro":"","coverUrl":"","bookUrl":"href"},"ruleBookInfo":{"name":"tag.h1@text## -\u901f\u8bfb\u8c37","author":"tag.p.0@ownText","kind":"tag.p.1@ownText","wordCount":"tag.p.2@ownText##\u4e07\u5b57","lastChapter":"tag.h3@text","intro":"tag.div@class.intro@text","coverUrl":"","tocUrl":"{{baseUrl}}\/#dir","downloadUrls":"@put:{id:\"##\/(\\\\d+)\/##1\"}@js:result='https:\/\/www.sudugu.org\/txt\/?id='+result.id+'&p=1'"},"ruleToc":{"chapterList":"id.list@tag.li","chapterName":"tag.a@text","chapterUrl":"tag.a@href","nextTocUrl":""},"ruleContent":{"content":"class.con@html##<div.*?>|<\/div>","nextContentUrl":"@xpath:\/\/div[@class='prenext']\/\/a[contains(text(),'\u4e0b\u4e00\u9875')]\/@href"},"lastUpdateTime":"1768037805547"},{"bookSourceComment":"\u66f4\u65b0\u65e5\u5fd7\u8bf7\u70b9\u51fb\u767b\u5f55\uff0c\u66f4\u65b0\u4e66\u6e90\u4e2d\u67e5\u770b\n\u672c\u4e66\u6e90\u4e0d\u51fa\u610f\u5916\u7684\u8bdd\u57fa\u672c\u4e3a\u6700\u7ec8\u7248\u672c\uff0c\u540e\u7eed\u66f4\u65b0\u90fd\u4f1a\u5728\u4e91\u7aef\u66f4\u65b0\u8bbe\u7f6e\u4e2d\u5fc3\uff0c\u4e0d\u9700\u8981\u518d\u66f4\u65b0\u4e66\u6e90\uff0c\u5f53\u7136\uff0c\u4e0d\u6392\u9664\u57df\u540d\u5931\u6548\u7684\u60c5\u51b5\n\n\u517c\u5bb9\u6b63\u5f0f\u7248\u9605\u8bfbapp","bookSourceGroup":"\u6674\u5929\u805a\u5408","bookSourceName":"\u591a\u5e73\u53f0\u7cbe\u54c1\u6e90","bookSourceType":0,"bookSourceUrl":"\u591a\u5e73\u53f0\u7cbe\u54c1\u6e90","bookUrlPattern":"https?:\\\/\\\/(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z0-9-]+(?::\\d+)?\\\/detail.*","customButton":false,"customOrder":0,"enabled":true,"enabledCookieJar":false,"enabledExplore":true,"eventListener":false,"exploreUrl":"<js>\nfunction setArgument(key, value) {\n    var open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '') || {};\n    open_argument[key] = value;\n    var result = JSON.stringify(open_argument);\n    source.setVariable(result);\n    return result;\n}\n\nvar open_argument = source.getVariable();\nvar base_url = getArguments(open_argument, 'server') || '';\nvar ms = getArguments(open_argument, 'tone_id') || '';\nvar source_type = getArguments(open_argument, 'source_type') || '\u7537\u9891';\nvar tab = getArguments(open_argument, 'tab') || '\u5c0f\u8bf4';\nvar sources = getArguments(open_argument, 'sources') || '\u756a\u8304';\n\n\nvar sdtoken;\ntry {\n    var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n    sdtoken = String(loginInfoMap['\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)'] || '');\n} catch (e) {\n    sdtoken = '';\n}\n\nvar rawCookie = getFanqieCookie() || sdtoken;\nvar match = rawCookie.match(\/sessionid=[^;]+\/);\nvar fqcookie = match ? match[0] : '';\nvar fqssionid = '';\nif (!fqcookie) {\n    java.toast('\u60a8\u8fd8\u672a\u767b\u9646\u756a\u8304\u8d26\u53f7\uff0c\u65e0\u6cd5\u540c\u6b65\u6570\u636e\u54e6\uff01');\n} else {\n    fqssionid = getSessionId(fqcookie)\n}\nvar fqsjurl = base_url + \"\/bookshelf?page={{page}}&ssionid=\" + fqssionid;\nvar fqtjurl = base_url + \"\/fqrecommend?page={{page}}&ssionid=\" + fqssionid;\nvar fqlsurl = base_url + \"\/fqhistory?page={{page}}&ssionid=\" + fqssionid;\n\nvar groupDatas = [];\nvar infoData = [];\n\nfunction deviceType() {\n    try {\n        return !!java.androidId();\n    } catch (e) {\n        return false;\n    }\n}\n\nvar hasValidCookie = fqcookie.length > 0;\n\nif (hasValidCookie) {\n    function groupQuery() {\n        try {\n            var url = base_url + \"\/group_name?ssionid=\" + fqssionid;\n            var res = java.ajax(url);\n            var response = JSON.parse(res);\n\n            if (!(response && response.data)) {}\n\n            response.data.forEach(function(group) {\n                var keys = Object.keys(group);\n                if (keys.length > 0) {\n                    var key = keys[0];\n                    var value = group[key];\n                    if (value && value.length) {\n                        var option = {\n                            \"method\": \"POST\",\n                            \"body\": {\n                                \"book_ids\": value,\n                                \"page\": \"{{page}}\"\n                            }\n                        };\n                        groupDatas.push({\n                            title: key,\n                            url: base_url + \"\/bookshelf,\" + JSON.stringify(option),\n                            style: {\n                                layout_flexGrow: 1,\n                                layout_flexBasisPercent: 0.45\n                            }\n                        });\n                    }\n                }\n            });\n\n            if (groupDatas.length % 2 !== 0) {\n                groupDatas.push({\n                    title: \"--\",\n                    url: \"\",\n                    style: {\n                        layout_flexGrow: 1,\n                        layout_flexBasisPercent: 0.45\n                    }\n                });\n            }\n        } catch (e) {\n            java.longToast(\"\u756a\u8304\u767b\u5f55\u8fc7\u671f\uff0c\u5df2\u9690\u85cf\u756a\u8304\u4e66\u67b6\");\n        }\n    }\n\n    try {\n        java.longToast(\"\u6b63\u5728\u52a0\u8f7d\u5206\u7ec4\u6570\u636e...\");\n        var userUrl = base_url + \"\/fquser?ssionid=\" + fqssionid;\n        var userRes = java.ajax(userUrl);\n        var userData = JSON.parse(userRes);\n\n        var userName = (userData && userData.data && userData.data.name) ? userData.data.name : '\u672a\u77e5\u7528\u6237';\n        if (!userName.includes('\u672a\u77e5\u7528\u6237')) {\n            infoData = [{\n                title: \"\u756a\u8304\u4e2a\u4eba\u4e2d\u5fc3\",\n                url: fqsjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }, {\n                title: \"\u4e2a\u6027\u63a8\u8350(\u756a\u8304)\",\n                url: fqtjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }, {\n                title: \"\u5386\u53f2\u9605\u8bfb(\u756a\u8304)\",\n                url: fqlsurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }];\n        }\n        groupQuery();\n    } catch (e) {\n        java.longToast(\"\u756a\u8304\u767b\u5f55\u8fc7\u671f\uff0c\u5df2\u9690\u85cf\u756a\u8304\u4e66\u67b6\");\n    }\n}\n\nvar style_list = [];\ntry {\n    var durl = `${base_url}\/discovestyle?source=${sources}&source_type=${source_type}&tab=${tab}`;\n    var res = java.ajax(durl);\n    var result = JSON.parse(res);\n    style_list = result.data || [];\n    if (result.msg) {\n        java.toast(result.msg);\n    }\n} catch (e) {\n    java.toast(\"\u53d1\u73b0\u6837\u5f0f\u83b7\u53d6\u5931\u8d25\");\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet qtop = {\n    method: \"GET\",\n    headers: {\n        cookie: qtcookie\n    },\n};\nqtop = JSON.stringify(qtop);\nlet qtsjurl = base_url+'\/get_book_shelf,'+qtop\nlet qtsj = [{\n                title: \"\u6674\u5929\u4e2a\u4eba\u4e2d\u5fc3\",\n                url: qtsjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }]\nvar finalData = infoData.concat(groupDatas, style_list);\nfinalData = qtsj.concat(finalData);\nJSON.stringify(finalData);\n<\/js>","header":"{ \"User-Agent\":\"Mozilla\/5.0 (Linux; Android 6.0; Nexus 5 Build\/MRA58N) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Mobile Safari\/537.36 Edg\/138.0.0.0\" }","jsLib":"var host = [\n    'https:\/\/v1.gyks.cf',\n    'https:\/\/v2.gyks.cf',\n    'https:\/\/v3.gyks.cf',\n    'https:\/\/v4.gyks.cf',\n    'https:\/\/v5.gyks.cf',\n    'https:\/\/v6.gyks.cf',\n    'https:\/\/v7.gyks.cf',\n    'http:\/\/101.35.133.34:8888',\n    'http:\/\/103.236.91.147:8888'\n];\n\nfunction getArguments(open_argument, key) {\n    try {\n        open_argument = JSON.parse(open_argument);\n    } catch (e) {\n        open_argument = {\n            tab: \"\u5c0f\u8bf4\",\n            tone_id: \"\u9ed8\u8ba4\u97f3\u8272\",\n            server: host[0],\n            sources: \"\u5168\u90e8\",\n            source_type: \"\u7537\u9891\",\n        };\n    }\n    if (key) {\n        return open_argument[key];\n    } else {\n        return open_argument;\n    }\n}\n\nfunction setArguments(key, value) {\n    const {\n        source\n    } = this;\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    open_argument[key] = value;\n    open_argument = JSON.stringify(open_argument);\n    source.setVariable(open_argument);\n    return open_argument;\n}\n\nfunction decrypt(Text) {\n    return Text;\n}\n\nfunction paraForAndroid(content, sources) {\n    let {\n        java,\n        cache,\n        source\n    } = this;\n    let plcolor = getArguments(source.getVariable(), \"plcolor\");\n    if (!plcolor) {\n        plcolor = \"#000000\";\n    }\n    let tccolor = getArguments(source.getVariable(), \"tccolor\");\n    if (!tccolor) {\n        plcolor = \"none\";\n    }\n\n    const createSvg = this.createSvg.bind(this);\n\n    return content.replace(\/<p>(.*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\\/>)?<\\\/p>\/g,\n        (match, text, url, count) => {\n            if (url && count) {\n                const click = 0;\n                cache.putMemory(url, click);\n                const encodedUrl = url;\n                return `<p>${text}<img src=\"${createSvg(count, plcolor,tccolor,encodedUrl,sources)}\"><\/p>`;\n            } else {\n                return `<p>${text}<\/p>`;\n            }\n        }\n    );\n}\n\n\nfunction showCmt(url, sources) {\n    let {\n        java,\n        cache\n    } = this;\n\n    const currentTime = Date.now();\n    const click = cache.getFromMemory(url);\n    let isqread = false;\n    try {\n        java.qread();\n        isqread = true;\n    } catch (e) {}\n    if (click < 1 && !isqread) {\n        cache.putMemory(url, click + 1);\n        return;\n    } else {\n        try {\n            java.startBrowserDp(url, sources + '\u6bb5\u8bc4');\n        } catch (e) {\n            java.startBrowser(url, sources + '\u6bb5\u8bc4');\n        }\n    }\n}\n\n\n\nfunction createSvg(number, color, tccolor, encodedUrl, sources) {\n        var displayText = number > 99 ? \"99+\" : number.toString();\n        var loginInfoMap = {};\n\n        if (this.source && typeof this.source.getLoginInfoMap == 'function') {\n            loginInfoMap = this.source.getLoginInfoMap() || {};\n        }\n\n        var bubbleStyle = String(getArguments(this.source.getVariable(), \"pstyle\") || loginInfoMap['\u6bb5\u8bc4\u6c14\u6ce1\u6837\u5f0f(0-4)'] || '0');\n        var svg;\n        if (bubbleStyle == '0') {\n            svg = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100\" height=\"90\" viewBox=\"0 0 25 17\" fill=\"none\" style=\"color: ${color}; opacity: 1;\">\n                        <path d=\"M24 14.5v-12a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v7.528a2 2 0 0 1-.211.894l-2.065 4.13a1 1 0 0 0 .894 1.448H22a2 2 0 0 0 2-2z\" stroke=\"currentColor\" style=\"stroke: ${color}; stroke-opacity: 0.5; stroke-width: 1px; stroke-linejoin: round; fill: ${tccolor}; fill-opacity: 0.5;\"><\/path>\n                        <text x=\"13.5\" y=\"12\" text-anchor=\"middle\" alignment-baseline=\"auto\" font-size=\"10\" fill=\"currentColor\" font-family=\"Arial, sans-serif\" font-weight=\"500\" style=\"fill: ${color}; opacity: 1;\">${displayText}<\/text>\n                    <\/svg>`;\n        } else if (bubbleStyle == '1') {\n            svg = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100\" height=\"90\" viewBox=\"0 7 153 106\" style=\"color: ${color}; opacity: 1;\">\n                        <path d=\"M 55 10 L 120 10 Q 150 10 150 40 L 150 80 Q 150 110 120 110 L 55 110 Q 25 110 25 80 L 25 75 L 3 60 L 25 45 L 25 40 Q 25 10 55 10 Z\" stroke=\"currentColor\" stroke-width=\"6\" stroke-linejoin=\"round\" style=\"stroke: ${color}; stroke-opacity: 0.5; stroke-width: 4px; stroke-linejoin: round; fill: ${tccolor}; fill-opacity: 0.5;\"><\/path>\n                        <text x=\"87\" y=\"86\" alignment-baseline=\"auto\" font-family=\"Arial, sans-serif\" text-anchor=\"middle\" font-size=\"72\" font-weight=\"500\" fill=\"currentColor\" style=\"fill: ${color}; opacity: 1;\">${displayText}<\/text>\n                <\/svg>`;\n        } else if (bubbleStyle == '2') {\n            svg = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100\" height=\"90\" viewBox=\"6 10 88 76\" style=\"color: ${color}; opacity: 1;\">\n                        <path d=\"M12,12 L88,12 Q92,12 92,16 L92,68 Q92,72 88,72 L28,72 L12,84 L12,72 Q8,72 8,68 L8,16 Q8,12 12,12 Z\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linejoin=\"round\" style=\"stroke: ${color}; stroke-opacity: 0.5; stroke-width: 2.5px; stroke-linejoin: round; fill: ${tccolor}; fill-opacity: 0.5;\"><\/path>\n                        <text x=\"50\" y=\"60\" font-family=\"Arial, sans-serif\" text-anchor=\"middle\" font-size=\"45\" fill=\"currentColor\" font-weight=\"500\" alignment-baseline=\"auto\" style=\"fill: ${color}; opacity: 1;\">${displayText}<\/text>\n                    <\/svg>`;\n        } else if (bubbleStyle == '3') {\n            svg = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100\" height=\"90\" viewBox=\"0 0 25 17\" fill=\"none\" style=\"color: ${color}; opacity: 1;\">\n                        <rect x=\"0.5\" y=\"0.5\" width=\"24\" height=\"16\" rx=\"2.5\" ry=\"2.5\" stroke=\"currentColor\" style=\"stroke: ${color}; stroke-opacity: 0.5; stroke-width: 1px; stroke-linejoin: round; fill: ${tccolor}; fill-opacity: 0.5;\"><\/rect>\n                        <text x=\"12.5\" y=\"12\" text-anchor=\"middle\" alignment-baseline=\"auto\" font-size=\"10\" fill=\"currentColor\" font-family=\"Arial, sans-serif\" font-weight=\"500\" style=\"fill: ${color}; opacity: 1;\">${displayText}<\/text>\n                    <\/svg>`;\n        } else if (bubbleStyle == '4') {\n            svg = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100\" height=\"90\" viewBox=\"0 0 25 17\" fill=\"none\" style=\"color:${color}; opacity: 1;\">\n                        <rect x=\"0.5\" y=\"0.5\" width=\"24\" height=\"16\" rx=\"8.5\" ry=\"8.5\" stroke=\"currentColor\" style=\"stroke: ${color}; stroke-opacity: 0.5; stroke-width: 1px; stroke-linejoin: round; fill: ${tccolor}; fill-opacity: 0.5;\"><\/rect>\n                        <text x=\"12.5\" y=\"12\" text-anchor=\"middle\" alignment-baseline=\"auto\" font-size=\"10\" fill=\"currentColor\" font-family=\"Arial, sans-serif\" font-weight=\"500\" style=\"fill: ${color}; opacity: 1;\">${displayText}<\/text>\n                    <\/svg>`;\n        } else if (bubbleStyle == '5') {\n            displayText = number > 99 ? \"99\" : number.toString();\n            svg = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100\" height=\"90\" viewBox=\"0 0 25 17\" fill=\"none\" style=\"color: ${color}; opacity: 1;\">\n                        <circle cx=\"12.5\" cy=\"8.5\" r=\"8\" stroke=\"currentColor\" style=\"stroke: ${color}; stroke-opacity: 0.5; stroke-width: 1px; stroke-linejoin: round; fill: ${tccolor}; fill-opacity: 0.5;\"><\/circle>\n                        <text x=\"13\" y=\"12\" text-anchor=\"middle\" alignment-baseline=\"auto\" font-size=\"10\" fill=\"currentColor\" font-family=\"Arial, sans-serif\" font-weight=\"500\" style=\"fill: ${color}; opacity: 1;\">${displayText}<\/text>\n                    <\/svg>`;\n        } else {\n            svg = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100\" height=\"90\" viewBox=\"0 0 25 17\" fill=\"none\" style=\"color: ${color}; opacity: 1;\">\n                <path d=\"M24 14.5v-12a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v7.528a2 2 0 0 1-.211.894l-2.065 4.13a1 1 0 0 0 .894 1.448H22a2 2 0 0 0 2-2z\" stroke=\"currentColor\" style=\"stroke: ${color}; stroke-opacity: 0.5; stroke-width: 1px; stroke-linejoin: round; fill: ${tccolor}; fill-opacity: 0.5;\"><\/path>\n                <text x=\"13.5\" y=\"12\" text-anchor=\"middle\" alignment-baseline=\"auto\" font-size=\"10\" fill=\"currentColor\" font-family=\"Arial, sans-serif\" font-weight=\"500\" style=\"fill: ${color}; opacity: 1;\">${displayText}<\/text>\n            <\/svg>`;\n        }\n        var encodedSvg = this.java.base64Encode(svg);\n        return 'data:image\/svg+xml;base64,' + encodedSvg + ',{\"js\":\"showCmt(\\'' + encodedUrl + '\\', \\'' + sources + '\\')\",\"style\":\"text\"}';\n    }\n\n\nfunction cleanHTML(html) {\n    let result = html\n        .replace(\/<header[^>]*>[\\s\\S]*?<\\\/header>\/gi, \"\")\n        .replace(\/<div class=\"tt-title\"[^>]*>[\\s\\S]*?<\\\/div>\/gi, \"\")\n        .replace(\/<(?!\\\/?p\\b|\\\/?img\\b)[^>]+>\/gi, \"\");\n    result = result.replace(\/<\\\/?p[^>]*>\/g, \"\\n\");\n    return result.replace(\/\\n+\/g, \"\\n\").trim();\n}\n\n\nfunction getBaseUrl(url) {\n    if (!url) {\n        return null;\n    }\n    url = String(url);\n    if (url.match(\/https?:\\\/\\\/\/i)) {\n        var index = url.indexOf(\"\/\", 9);\n        return index == -1 ? url : url.substring(0, index);\n    }\n    return null;\n}\n\nfunction isIPv4Address(ip) {\n    ip = String(ip);\n    let parts = ip.split(\".\");\n    if (parts.length !== 4) return false;\n\n    for (let part of parts) {\n        if (!\/^\\d+$\/.test(part)) return false; \/\/ \u5fc5\u987b\u662f\u6570\u5b57\n        if (part.length > 1 && part[0] === \"0\") return false; \/\/ \u7981\u6b62\u524d\u5bfc\u96f6\n        let num = parseInt(part, 10);\n        if (num < 0 || num > 255) return false; \/\/ \u8303\u56f4\u68c0\u67e5\n    }\n    return true;\n}\n\nfunction isIPv6Address(ip) {\n    ip = String(ip);\n    \/\/ \u5904\u7406\u53cc\u5192\u53f7\uff08\u6700\u591a\u51fa\u73b0\u4e00\u6b21\uff09\n    if (ip.includes(\":::\")) return false;\n    let doubleColonCount = (ip.match(\/::\/g) || []).length;\n    if (doubleColonCount > 1) return false;\n\n    \/\/ \u5206\u5272\u6210\u7ec4\n    let groups = ip.split(\":\");\n    let validGroupCount = 8;\n    let actualGroupCount = groups.filter((g) => g !== \"\").length;\n\n    \/\/ \u9a8c\u8bc1\u7ec4\u6570\n    if (doubleColonCount === 1) {\n        if (actualGroupCount > validGroupCount - 1) return false;\n    } else {\n        if (groups.length !== validGroupCount) return false;\n    }\n\n    \/\/ \u9a8c\u8bc1\u6bcf\u7ec4\u5185\u5bb9\n    for (let group of groups) {\n        if (group === \"\") continue; \/\/ \u8df3\u8fc7\u7a7a\u7ec4\uff08\u53cc\u5192\u53f7\u90e8\u5206\uff09\n        if (!\/^[0-9a-fA-F]{1,4}$\/.test(group)) return false; \/\/ 1-4\u4f4d\u5341\u516d\u8fdb\u5236\n    }\n    return true;\n}\n\nfunction isIPAddress(input) {\n    return isIPv4Address(input) || isIPv6Address(input);\n}\n\nfunction getSessionId(cookieString) {\n    const match = cookieString.match(\/sessionid=([^;]+)\/);\n    return match ? match[1] : null;\n}\n\nfunction getKey(key) {\n    let parts = key.split(\";\");\n    for (let part of parts) {\n        if (part.includes(\"qttoken\")) {\n            return part.split(\"=\")[1];\n        }\n    }\n    return \"\";\n}\n\nfunction getFanqieCookie() {\n    const {\n        cookie\n    } = this;\n    try {\n        return String(cookie.getCookie('fanqienovel.com') || java.getCookie('fanqienovel.com') || '');\n    } catch (e) {\n        return '';\n    }\n}\n\n\nfunction paraForiOS(html, sources) {\n    return html.replace(\n        \/<p>(.*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\\/>)?<\\\/p>\/g,\n        function(match, text, url, count) {\n            if (url && count) {\n                const encodedUrl = url.replace(\/&\/g, '&amp;');\n                return `<span rs-native>${text}<comment count=\"${count}\" onPress=\"java.showReadingBrowser('${encodedUrl}','${sources}\u6bb5\u8bc4')\"><\/span>`;\n            } else {\n                return `<span rs-native>${text}<\/span>`;\n            }\n        }\n    );\n}","lastUpdateTime":"1768109887096","loginUi":"[{\n        \"name\": \"\u90ae\u7bb1\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u5bc6\u7801\",\n        \"type\": \"password\"\n    }, {\n        \"name\": \"\u2665\u767b\u5f55\u4e66\u6e90\",\n        \"type\": \"button\",\n        \"action\": \"login(true)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udd10\u6ce8\u518c\u4e66\u6e90\",\n        \"type\": \"button\",\n        \"action\": \"register()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\u2699\ufe0f\u4e66\u6e90\u8bbe\u7f6e\",\n        \"type\": \"button\",\n        \"action\": \"control()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"\u26d4\ufe0f\u6e05\u7a7a\u8bbe\u7f6e\",\n        \"type\": \"button\",\n        \"action\": \"reCookieSettings()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2728\u5e94\u7528\u8bbe\u7f6e\",\n        \"type\": \"button\",\n        \"action\": \"applyCookieSettings()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \" \ud83d\udd1a \u9000\u51fa\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"logout()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83c\udfdd\u7528\u6237\u540e\u53f0\",\n        \"type\": \"button\",\n        \"action\": \"loginqt()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \" \ud83d\uddd1 \u6e05\u9664\u8bbe\u5907\",\n        \"type\": \"button\",\n        \"action\": \"clearDevice()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83d\udd2e \u68c0\u6d4b\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"checkStatus()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2615\u6253\u8d4f\u4eab\u798f\u5229\",\n        \"type\": \"button\",\n        \"action\": \"vip()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2747\ufe0f \u66f4\u65b0\u4e66\u6e90\",\n        \"type\": \"button\",\n        \"action\": \"renderVersionPage()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"==\u4e0b\u65b9\u914d\u7f6e\u4e3a\u4e66\u6e90\u8bbe\u7f6e\u9875\u9762\u65e0\u6cd5\u6253\u5f00\u65f6\u4f7f\u7528==\",\n        \"type\": \"button\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"\ud83d\udcd1\u66f4\u5c11\u7b80\u4ecb\",\n        \"type\": \"button\",\n        \"action\": \"set_info()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udcdd\u6bb5\u8bc4\u5f00\u5173\",\n        \"type\": \"button\",\n        \"action\": \"paracomment('fqpara')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udcda \u540c\u6b65\u4e66\u67b6\",\n        \"type\": \"button\",\n        \"action\": \"set_reading()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u264b\ufe0f \u7537\/\u5973\u9891\u9053\",\n        \"type\": \"button\",\n        \"action\": \"set_source_type()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udca2 \u5f3a\u5236\u641c\u7d22\u5168\u90e8\",\n        \"type\": \"button\",\n        \"action\": \"disabledSources()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83c\udf45\u756a\u8304\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"fq_login()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\uddc2\u5f53\u524d\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"get_media()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"\ud83d\udcd6\u5c0f\u8bf4\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u5c0f\u8bf4')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udd0a\u542c\u4e66\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u542c\u4e66')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83c\udfde\u6f2b\u753b\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u6f2b\u753b')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\uddb2\u77ed\u5267\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u77ed\u5267')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83c\udf9a\u5207\u6362\u670d\u52a1\u5668\",\n        \"type\": \"button\",\n        \"action\": \"set_server()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u267b\ufe0f\u68c0\u6d4b\u5f53\u524d\u670d\u52a1\u5668\",\n        \"type\": \"button\",\n        \"action\": \"checkNet()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2695\ufe0f\u672c\u5730\/\u670d\u52a1\u5668 \",\n        \"type\": \"button\",\n        \"action\": \"get_proxy()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udccc\u6c38\u4e45\u53d1\u5e03\u9875\ud83d\udccc\",\n        \"type\": \"button\",\n        \"action\": \"api()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2193\u2193\u4e0b\u65b9\u53ef\u5207\u6362\u6765\u6e90\u7528\u4e8e\u641c\u7d22\/\u53d1\u73b0\u9875\u2193\u2193\",\n        \"type\": \"button\",\n        \"action\": \"get_media()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"\ud83d\udce4\u6211\u6765\u4e0a\u4f20\",\n        \"type\": \"button\",\n        \"action\": \"put_sk()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udc96\u6211\u6765\u63a8\u8350\",\n        \"type\": \"button\",\n        \"action\": \"put_book()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u5168\u90e8\",\n        \"type\": \"button\",\n        \"action\": \"set_source('\u5168\u90e8')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u756a\u8304')\",\n        'name': '\u756a\u8304',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('69\u4e66\u5427')\",\n        'name': '69\u4e66\u5427',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u4e03\u732b')\",\n        'name': '\u4e03\u732b',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u767e\u5ea6')\",\n        'name': '\u767e\u5ea6',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u8d77\u70b9')\",\n        'name': '\u8d77\u70b9(\u7b2c\u4e09\u65b9)',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5f97\u95f4')\",\n        'name': '\u5f97\u95f4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5854\u8bfb')\",\n        'name': '\u5854\u8bfb',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u4e66\u65d7')\",\n        'name': '\u4e66\u65d7',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('QQ')\",\n        'name': 'QQ',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u732b\u773c')\",\n        'name': '\u732b\u773c',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u641c\u4e66\u795e\u5668')\",\n        'name': '\u641c\u4e66\u795e\u5668',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5f97\u5947')\",\n        'name': '\u5f97\u5947',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u4f2a69')\",\n        'name': '\u4f2a69',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u7231\u4e0b\u7535\u5b50\u4e66')\",\n        'name': '\u7231\u4e0b\u7535\u5b50\u4e66',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5c0f\u7c73')\",\n        'name': '\u5c0f\u7c73',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u661f\u661f\u5c0f\u8bf4')\",\n        'name': '\u661f\u661f\u5c0f\u8bf4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u7b14\u8da3\u960122')\",\n        'name': '\u7b14\u8da3\u960122',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u9876\u70b9')\",\n        'name': '\u9876\u70b9',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5e7b\u68a6\u8f7b\u5c0f\u8bf4')\",\n        'name': '\u5e7b\u68a6\u8f7b\u5c0f\u8bf4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u6c5f\u6e56')\",\n        'name': '\u6c5f\u6e56',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u6b6a\u745e\u53e4\u5fb7')\",\n        'name': '\u6b6a\u745e\u53e4\u5fb7\u6f2b\u753b',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u6cb3\u9a6c')\",\n        'name': '\u6cb3\u9a6c\u77ed\u5267',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u77e5\u4e4e')\",\n        'name': '\u77e5\u4e4e',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('vip')\",\n        'name': '\u4e0b\u65b9\u4e3aVIP\u4e13\u5c5e\u4e66\u6e90(\u70b9\u51fb\u6b64\u5904\u641c\u6240\u6709vip)',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        'action': \"set_source('\u559c\u9a6c\u62c9\u96c5')\",\n        'name': '\u559c\u9a6c\u62c9\u96c5',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('svip')\",\n        'name': '\u4e0b\u65b9\u4e3aSVIP\u4e13\u5c5e\u4e66\u6e90(\u70b9\u51fb\u6b64\u5904\u641c\u6240\u6709svip)',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        'action': \"set_source('\u8d85\u4f1a\u4e13\u5c5e\u77ed\u5267')\",\n        'name': '\u8d85\u4f1a\u4e13\u5c5e\u77ed\u5267',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u8d85\u4f1a\u4e13\u5c5e\u5c0f\u8bf4')\",\n        'name': '\u8d85\u4f1a\u4e13\u5c5e\u5c0f\u8bf4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u9177\u6211')\",\n        'name': '\u9177\u6211\u542c\u4e66',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u756a\u85af\u5c0f\u8bf4')\",\n        'name': '\u756a\u85af\u5c0f\u8bf4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('QQ\u9605\u8bfb')\",\n        'name': 'QQ(\u4f1a\u5458\u4e66\u7c4d\u514d\u8d39)',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u9605\u53cb\u5c0f\u8bf4')\",\n        'name': '\u9605\u53cb\u5c0f\u8bf4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u597d\u770b\u6f2b\u753b')\",\n        'name': '\u597d\u770b\u6f2b\u753b',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5168\u672c\u5c0f\u8bf4')\",\n        'name': '\u5168\u672c\u5c0f\u8bf4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u795e\u4e66\u7f51')\",\n        'name': '\u795e\u4e66\u7f51',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u8bfb\u5168\u672c')\",\n        'name': '\u8bfb\u5168\u672c',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u516b\u4e00\u4e2d\u6587\u7f51')\",\n        'name': '\u516b\u4e00\u4e2d\u6587\u7f51',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u658b\u4e66\u82d1')\",\n        'name': '\u658b\u4e66\u82d1',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('101\u770b\u4e66')\",\n        'name': '101\u770b\u4e66',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u4e07\u76f8\u4e66\u57ce')\",\n        'name': '\u4e07\u76f8\u4e66\u57ce',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u8f7b\u5c0f\u8bf4\u6587\u5e93')\",\n        'name': '\u8f7b\u5c0f\u8bf4\u6587\u5e93',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u8f7b\u4e4b\u6587\u5e93')\",\n        'name': '\u8f7b\u4e4b\u6587\u5e93',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u4e2d\u534e\u5178\u85cf')\",\n        'name': '\u4e2d\u534e\u5178\u85cf',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u6bd2\u820c\u5f71\u89c6')\",\n        'name': '\u6bd2\u820c\u5f71\u89c6',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u81ea\u5b9a\u4e49\u641c\u7d22\u6e90(\u591a\u4e2a\u7528\u82f1\u6587,\u5206\u5272)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u81ea\u5b9a\u4e49\u670d\u52a1\u5668(\u53ef\u4e0d\u586b)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u81ea\u5b9a\u4e49\u8bc4\u8bba\u989c\u8272(\u53ef\u4e0d\u586b)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u6bb5\u8bc4\u6c14\u6ce1\u6837\u5f0f(0-4)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)\",\n        \"type\": \"text\"\n    }\n]","loginUrl":"\/\/ \u5f53\u524d\u4e66\u6e90\u7248\u672c\u53f7\uff0c\u5207\u52ff\u4fee\u6539\uff0c\u5426\u5219\u5f71\u54cd\u66f4\u65b0\u7684\u8bc6\u522b\nconst localVersion = '5.1.13';\nlet controlUrl = host[0];\nfunction login(flag) {\n    if (flag == undefined) {\n        result = JSON.parse(source.getLoginInfo())\n    } else {\n        java.longToast(\"\\n\\n\ud83d\udc9e\u6b63\u5728\u767b\u5f55\u4e2d...\")\n        putLoginInfo(JSON.stringify(result))\n    }\n    let base_url = getArgument('server')\n    let zdyserver = String(result['\u81ea\u5b9a\u4e49\u670d\u52a1\u5668(\u53ef\u4e0d\u586b)']);\n    if (zdyserver.includes('http')) {\n        setArgument('server', zdyserver);\n        if (getKey(String(cookie.getCookie(base_url)))) {\n            let cookies = cookie.getCookie(base_url)\ntry{cookie.removeCookie(base_url)} catch(e){}\n            cookie.setCookie(zdyserver, cookies)\n        }\n        java.toast(`\\n\\n\u5f53\u524d\u670d\u52a1\u5668\u4e3a\u81ea\u5b9a\u4e49\u670d\u52a1\u5668\\n${zdyserver}\\n\\n\u5207\u6362\u670d\u52a1\u5668\u8bf7\u5148\u6e05\u7a7a\u670d\u52a1\u5668\u5730\u5740\u4e2d\u7684\u6570\u636e`);\n    }\n    let plcolor = String(getArgument('plcolor')  || result['\u81ea\u5b9a\u4e49\u8bc4\u8bba\u989c\u8272(\u53ef\u4e0d\u586b)'] || '#000000');\n    if (plcolor) {\n        setArgument('plcolor', plcolor);\n    } else {\n        setArgument('plcolor', '#000000');\n    }\n    let zdysources = String(result['\u81ea\u5b9a\u4e49\u641c\u7d22\u6e90(\u591a\u4e2a\u7528\u82f1\u6587,\u5206\u5272)'] || '');\n    if (zdysources) {\n        setArgument('sources', zdysources);\n    };\n    base_url = getArgument('server')\n    let register_email = String(result['\u90ae\u7bb1'])\n    let password = String(result['\u5bc6\u7801'])\n    let key = String(result['\u5bc6\u94a5'] || '')\n\n    if ((register_email && password || key) && !String(getKey(String(cookie.getCookie(base_url))))) {\n        try{cookie.removeCookie(base_url)} catch(e){}\n        let deviceKey = '';\n        try {\n            deviceKey = java.deviceID();\n        } catch (e) {\n            deviceKey = java.androidId();\n        };\n        let deviceId = deviceKey;\n        if (register_email && password) {\n            let options = JSON.stringify({\n                method: 'POST',\n                headers: {\n                    'Content-Type': 'application\/json'\n                },\n                body: JSON.stringify({\n                    register_email: result['\u90ae\u7bb1'],\n                    password: result['\u5bc6\u7801']\n                })\n            })\n            try {\n                let data = JSON.parse(java.ajax(`${base_url}\/login_api,${options}`))\n                if (data.code == 0) {\n                    \/\/java.toast(deviceId)\n                    java.toast(\"\\n\\n\u2705\ufe0f\u767b\u5f55\u6210\u529f\")\n                    cookie.setCookie(base_url, `qttoken=${data.key};deviceId=${deviceId}`)\n                    result['\u5bc6\u94a5'] = data.key\n                    setArgument('qttoken', data.key);\n                    putLoginInfo(JSON.stringify(result))\n                } else {\n                    java.toast('\\n\\n\ud83d\udc94' + data.msg || \"\u767b\u5f55\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5\uff01\")\n                }\n            } catch (e) {\n                java.toast(\"\\n\\n\ud83d\udc94\u767b\u5f55\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5\uff01\\n\" + e.message)\n            }\n        } else {\n            cookie.setCookie(base_url, `qttoken=${key};deviceId=${deviceId}`)\n            let res = java.ajax(`${base_url}\/user_api,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n            try {\n                res = JSON.parse(res)\n                if (res.id != undefined) {\n                    setArgument('qttoken', key);\n                    java.toast('\\n\\n\u5bc6\u94a5\u767b\u5f55\u6210\u529f')\n                    result['\u90ae\u7bb1'] = res.email\n                    putLoginInfo(JSON.stringify(result))\n                } else {\n                    throw new Error()\n                }\n            } catch (e) {\n                java.log(e)\n                java.toast(\"\\n\\n\ud83d\udc94\u767b\u5f55\u5931\u8d25\")\n            }\n        }\n    } else if (flag && String(getKey(String(cookie.getCookie(base_url))))) {\n        java.toast(\"\\n\\n\u5f53\u524d\u2705\ufe0f\u5df2\u767b\u5f55\uff0c\u8bf7\ud83d\udeab\u9000\u51fa\u767b\u5f55\u540e\u91cd\u65b0\u767b\u5f55\");\n        \/\/checkStatus();\n    } else if (flag) {\n        java.toast(\"\\n\\n\u26d4\ufe0f\u8bf7\u5148\u586b\u5199\u90ae\u7bb1\u548c\u5bc6\u7801\");\n    }\n}\n\nfunction objectToCookieString(obj) {\n  if (!obj || typeof obj !== 'object') {\n    return '';\n  }\n  return Object.entries(obj)\n    .map(([key, value]) => {\n      const stringValue = String(value);\n      const encodedKey = encodeURIComponent(key);\n      const encodedValue = encodeURIComponent(stringValue);\n      return `${encodedKey}=${encodedValue}`;\n    })\n    .join('; ');\n}\n\nfunction control(){\n    controlUrla = getArgument('controlUrl');\n    if (controlUrla){\n        controlUrla = findFirstAvailableHost([controlUrla]);\n    }\r\n    if (!controlUrla) {\n        controlUrla = findFirstAvailableHost(host) || controlUrl;\n    }\n    setArgument('controlUrl', controlUrla);\n    try {\n    \tlet open_argument = source.getVariable();\n    \topen_argument=JSON.parse(open_argument);\n    \tlet control_cookie = objectToCookieString(open_argument);\n    cookie.setCookie(controlUrla, control_cookie);\n    \t} catch{}\n      \/\/java.toast(cookie.getCookie(controlUrla))\n    \tjava.startBrowserAwait(controlUrla + '\/control', '\u6674\u5929\u5c0f\u8bf4\u8bbe\u7f6e');\n    applyCookieSettings();\n\t}\n\nfunction applyCookieSettings() {\n\t  let controlUrla = getArgument('controlUrl') || controlUrl;\n\t  \tvar cookieStr = String(cookie.getCookie(controlUrla));\n    \n    var cookieData = {};\n    if (cookieStr && cookieStr !== 'null' && cookieStr !== 'undefined' && cookieStr !== '') {\n        var pairs = cookieStr.split('; ');\n        for (var i = 0; i < pairs.length; i++) {\n            var pair = pairs[i];\n            var eqIndex = pair.indexOf('=');\n            if (eqIndex > -1) {\n                var key = pair.substring(0, eqIndex).trim();\n                var value = decodeURIComponent(pair.substring(eqIndex + 1).trim());\n                cookieData[key] = value;\n                setArgument(key, value);\n            }\n        }\n    }\n    \n    var displayConfig = [\n        { key: 'server', label: '\u670d\u52a1\u5668', defaultValue: host[0] },\n        { key: 'proxy', label: '\u8bbf\u95ee\u6a21\u5f0f', defaultValue: '\u4e91\u7aef' },\n        { key: 'tab', label: '\u9605\u8bfb\u6a21\u5f0f', defaultValue: '\u5c0f\u8bf4' },\n        { key: 'source_type', label: '\u9605\u8bfb\u9891\u9053', defaultValue: '\u7537\u9891' },\n        { key: 'sources', label: '\u4e66\u6e90\u9009\u62e9', defaultValue: '\u5168\u90e8' },\n        { key: 'fqpara', label: '\u6bb5\u8bc4\u663e\u793a', defaultValue: 'on' },\n        { key: 'disabled_sources', label: '\u5f3a\u5236\u641c\u7d22', defaultValue: '0' },\n        { key: 'reading', label: '\u540c\u6b65\u4e66\u67b6', defaultValue: '0' },\n        { key: 'info', label: '\u5b8c\u6574\u7b80\u4ecb', defaultValue: 'on' }\n    ];\n    \n    var valueMap = {\n        \/\/ \u8bbf\u95ee\u6a21\u5f0f\n        '\u672c\u5730': '\ud83d\udcbb \u672c\u5730',\n        '\u4e91\u7aef': '\u2601\ufe0f \u4e91\u7aef',\n        \n        \/\/ \u5f00\u5173\u72b6\u6001\n        'on': '\u2705 \u5f00\u542f',\n        'off': '\u274c \u5173\u95ed',\n        '1': '\u2705 \u5f00\u542f',\n        '0': '\u274c \u5173\u95ed',\n        \n        \/\/ \u9891\u9053\u7c7b\u578b\n        '\u7537\u9891': '\ud83d\udc68 \u7537\u9891',\n        '\u5973\u9891': '\ud83d\udc69 \u5973\u9891',\n        \n        \/\/ \u5185\u5bb9\u7c7b\u578b\n        '\u5c0f\u8bf4': '\ud83d\udcd6 \u5c0f\u8bf4',\n        '\u542c\u4e66': '\ud83c\udfa7 \u542c\u4e66',\n        '\u6f2b\u753b': '\ud83c\udfa8 \u6f2b\u753b',\n        '\u77ed\u5267': '\ud83c\udfac \u77ed\u5267',\n        \n        \/\/ \u6765\u6e90\u7c7b\u578b\n        'vip': '\ud83d\udc8e VIP\u4e13\u5c5e',\n        'svip': '\ud83d\udc51 SVIP\u4e13\u5c5e',\n        '\u63a8\u8350': '\u2b50 \u7f51\u53cb\u63a8\u8350',\n        '\u5168\u90e8': '\ud83d\udcda \u5168\u90e8'\n    };\n    \n\n    var displayLines = [];\n    \n    for (var i = 0; i < displayConfig.length; i++) {\n        var config = displayConfig[i];\n        var value = cookieData[config.key] || config.defaultValue;\n        \n        if (!cookieData[config.key]) {\n            setArgument(config.key, config.defaultValue);\n        }\n        \n        var displayValue = valueMap[value] || value;\n        if (config.key === 'sources' && displayValue.length > 25) {\n            displayValue = displayValue.substring(0, 25) + '...';\n        }\n        \n        displayLines.push(config.label + ': ' + displayValue);\n    }\n    \n    \/\/ \u6784\u5efa\u63d0\u793a\u6a21\u677f\n    var template = '\u2728 \u5f53\u524d\u914d\u7f6e\\n';\n    template += '\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\\n';\n    template += displayLines.join('\\n');\n    template += '\\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\\n';\n    template += '\u2764\ufe0f\u5f53\u524d\u5e94\u7528\u7684 *\u2699\ufe0f\u4e66\u6e90\u8bbe\u7f6e* \u4e2d\u7684\u914d\u7f6e\u54e6\u2764\ufe0f'\n    \n    \/\/ \u663e\u793a\u63d0\u793a\n    java.longToast(template);\n    \n    return displayLines.length;\n}\n\n\nfunction reCookieSettings(){\n\tlet controlUrla = getArgument('controlUrl') || controlUrl;\n    cookie.removeCookie(controlUrla);\n    applyCookieSettings();\n    \n}\n\/\/ \u68c0\u6d4b\u670d\u52a1\u5668\nfunction checkNet() {\n    let url = getArgument('server');\n    java.longToast(`\\n\\n\u267b\ufe0f\u6b63\u5728\u68c0\u6d4b\uff1a${url}\\n\u8bf7\u7a0d\u7b49~`);\n    let date1 = new Date().getTime();\n    let html = java.ajax(url + '\/login');\n    let date2 = new Date().getTime();\n    let t = date2 - date1;\n    let c = String(html).indexOf('\u6674\u5929');\n    let code = 1;\n    let time = t \/ 1000 + 's';\n    let logTime = '\u3010' + url + '\u3011\\n\u250b\u250b\\n' + '\u89e3\u6790\u65f6\u95f4\uff1a' + time;\n    if (c == -1 || t > 5000) {\n        java.longToast('\\n\ud83d\udc94\u3010\u8bbf\u95ee\u5931\u8d25\u63d0\u793a\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2663\ufe0f\u5f53\u524d\u63a5\u53e3\u65e0\u6cd5\u8bbf\u95ee(\u53ef\u80fd\u88ab\u5899)\u2663\ufe0f\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\/\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    } else if (t < 1000) {\n        java.longToast('\\n\ud83d\udc96\u3010\u7f51\u7edc\u73af\u5883\u4f18\u826f\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2764\ufe0f\u5ef6\u8fdf\u4f4e\uff0c\u63a8\u8350\u4f7f\u7528\u6b64\u63a5\u53e3\u2764\ufe0f\\n\u250b\u250b\\n\u7f51\u7edc\u73af\u5883\u4f18\u826f\uff0c\u8bf7\u7ee7\u7eed\u4fdd\u6301\u72b6\u6001\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    } else if (t >= 1000 && t < 2000) {\n        java.longToast('\\n\ud83d\udc9b\u3010\u7f51\u7edc\u73af\u5883\u4e00\u822c\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2666\ufe0f\u5ef6\u8fdf\u4e00\u822c\uff0c\u52c9\u5f3a\u53ef\u4f7f\u7528\u2666\ufe0f\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\u6216\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    } else if (t >= 2000 && t < 5000) {\n        java.longToast('\\n\ud83d\udc94\u3010\u7f51\u7edc\u73af\u5883\u582a\u5fe7\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2660\u5ef6\u8fdf\u8fc7\u9ad8\uff0c\u4e0d\u5efa\u8bae\u4f7f\u7528\u2660\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\u6216\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    }\n}\n\n\nfunction findFirstAvailableHost(hosts) {\n    \/\/ \u6309\u987a\u5e8f\u68c0\u6d4b\uff0c\u627e\u5230\u7b2c\u4e00\u4e2a\u53ef\u7528\u7684\u5c31\u8fd4\u56de\n    for (var i = 0; i < hosts.length; i++) {\n        var host = hosts[i];\n        \n        try {\n            java.longToast(\"\ud83d\udd0d \u6b63\u5728\u68c0\u6d4b: \" + host);\n            \n            var start = new Date().getTime();\n            var response = java.ajax(host + \"\/login\");\n            var end = new Date().getTime();\n            var time = end - start;\n            \n            \/\/ \u68c0\u67e5\u662f\u5426\u53ef\u7528\n            if (String(response).indexOf(\"\u6674\u5929\") !== -1 && time <= 5000) {\n                \/\/ \u663e\u793a\u7ed3\u679c\n                var status = \"\u2705 \u53ef\u7528\";\n                if (time < 1000) {\n                    status = \"\ud83d\udc9a \u4f18\u79c0\";\n                } else if (time < 2000) {\n                    status = \"\ud83d\udc9b \u4e00\u822c\";\n                } else {\n                    status = \"\ud83e\udde1 \u8f83\u6162\";\n                }\n                java.longToast(status + \"\\n\u4e3b\u673a: \" + host + \"\\n\u5ef6\u8fdf: \" + time + \"ms\");\n                return host; \/\/ \u76f4\u63a5\u8fd4\u56de\u627e\u5230\u7684\u4e3b\u673a\n            }\n        } catch (e) {\n            \/\/ \u8fd9\u4e2a\u4e3b\u673a\u5931\u8d25\uff0c\u7ee7\u7eed\u4e0b\u4e00\u4e2a\n        }\n    }\n    \n    \/\/ \u6240\u6709\u4e3b\u673a\u90fd\u4e0d\u53ef\u7528\n    java.longToast(\"\u274c \u6ca1\u6709\u53ef\u7528\u7684\u4e3b\u673a\");\n    return null;\n}\nfunction isVips(res) {\n    let isVIP = '';\n    let vipEndTime = res.vip_end_time;\n    let formattedDate = '';\n\n    if (vipEndTime && vipEndTime !== 0) {\n        let date = new Date(vipEndTime * 1000);\n        formattedDate = `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`;\n        let currentTime = Math.floor(Date.now() \/ 1000);\n        let remainingDays = Math.ceil((vipEndTime - currentTime) \/ (24 * 60 * 60));\n        if (currentTime > vipEndTime) {\n            isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} (\u5df2\u8fc7\u671f)`;\n        } else if (remainingDays <= 7) {\n            isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} \u5269\u4f59${remainingDays}\u5929`;\n        } else {\n            if (vipEndTime < 1912946812) {\n                isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"}(${formattedDate})`;\n            } else {\n                isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} (\u6c38\u4e45)`;\n            }\n        }\n    } else {\n        isVIP = '\u60a8\u5c1a\u672a\u5f00\u901aVIP';\n    }\n    return isVIP;\n}\n\nfunction checkStatus() {\n    java.longToast('\\n\\n\u267b\ufe0f\u68c0\u6d4b\u4e2d...');\n    let base_url = getArgument('server')\n    let res = java.ajax(`${base_url}\/user_api,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n    try {\n        res = JSON.parse(res)\n        if (res.id != undefined) {\n            result['\u90ae\u7bb1'] = res.email\n            putLoginInfo(JSON.stringify(result))\n            let devices\n            try {\n                devices = Object.keys(JSON.parse(res.device)).length;\n            } catch (e) {\n                devices = res.device ? 1 : 0;\n            }\n            let isVip = isVips(res);\n            tips = `\n\u250f\u2505\u2505\u2505\u2505\u2505\u2505\u2531\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2510\n\u3000 \ud83e\udde2\u6635\u79f0 \u3000\u3000\u3000\u3000${res.nickname.padEnd(20,\"\\t\") || \"\u672a\u8bbe\u7f6e\".padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\u2709\ufe0f\u90ae\u7bb1\u3000\u3000\u3000\u3000${res.email.replace(\/(.{3}).*?@\/,\"$1***@\").padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udd11\u5bc6\u94a5\u3000\u3000\u3000\u3000${(`${res.user_key.substring(0,4)}***${res.user_key.slice(-4)}`).padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udcc5\u6ce8\u518c\u65f6\u95f4\u3000\u3000${java.timeFormat(res.register_time*1000).padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\uddd2\ufe0f\u4eca\u65e5\u9605\u8bfb\u3000\u3000${(java.timeFormat(new Date()).slice(0,10)==java.timeFormat(res.last_read_time * 1000).slice(0,10)?res.day_read_count:0).toString().padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udcda\u7d2f\u8ba1\u9605\u8bfb\u3000\u3000${res.all_read_count.toString().padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udd53\u6700\u540e\u9605\u8bfb\u3000\u3000${(res.last_read_time != 0?java.timeFormat(res.last_read_time * 1000):'\u672a\u9605\u8bfb').padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udcf1\u5728\u7ebf\u8bbe\u5907\u3000\u3000${devices.toString().padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udc51\u4f1a\u5458\u72b6\u6001\u3000\u3000${isVip.padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udeab\u5c01\u7981\u72b6\u6001\u3000\u3000${res.is_banned?'\u5df2\u5c01\u7981':'\u6b63\u5e38\u3000'}\u3000\u3000\u3000\u3000\u3000\u3000\u3000\n\u2517\u2505\u2505\u2505\u2505\u2505\u2505\u2539\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2518\n`\n            java.log(tips)\n            java.longToast(tips)\n        } else {\n            throw new Error(res.msg)\n        }\n    } catch (e) {\n        \/\/java.log(e)\n        java.toast(\"\\n\u68c0\u6d4b\u767b\u5f55\u5931\u8d25\\n\" + e.message)\n    }\n}\n\nfunction clearDevice() {\n    let base_url = getArgument('server')\n    let res = java.ajax(`${base_url}\/clear,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n    res = JSON.parse(res);\n   java.toast(res.code == 0 ? \"\\n\\n\ud83d\udcf4\u8bbe\u5907\u6e05\u9664\u6210\u529f\" : res.msg)\n    Packages.java.lang.Thread.sleep(500)\n    checkStatus()\n}\n\/\/ \u4fdd\u5b58\u767b\u5f55UI\u4fe1\u606f\nfunction putLoginInfo(info) {\n    try {\n        let key = java.androidId()\n        let encodeStr = Packages.android.util.Base64.encodeToString(java.createSymmetricCrypto(\"AES\", key).encrypt(info), 2)\n        cache.put(`userInfo_${source.getKey()}`, encodeStr)\n        return true\n    } catch (e) {\n        java.log(e)\n        return source.putLoginInfo(info)\n    }\n}\n\n\/\/ \u7528\u6237\u540e\u53f0\nfunction loginqt() {\n\t   let base_url = getArgument('server');\n\t   let ck = String(cookie.getKey(base_url, \"qttoken\"));\n\t   if (!ck) {\n\t   \tjava.longToast('\\n\\n\ud83d\udeab\u8bf7\u5148\u767b\u5f55!')\n\t   \t} else {\n\t   \t\tjava.startBrowserAwait(getArgument('server') + '\/user', '\u6674\u5929\u5c0f\u8bf4\u540e\u53f0');\n\t   \t\t}\n    }\n\n\/\/ \u7528\u6237\u6ce8\u518c\nfunction register() {\n\t   let base_url = getArgument('server');\n\t   \tjava.startBrowserAwait(getArgument('server') + '\/register', '\u6674\u5929\u5c0f\u8bf4\u6ce8\u518c');\n    }\n\n\/\/\u767b\u5f55\u756a\u8304\nfunction fq_login() {\n    try {\n        java.startBrowserAwait(\"https:\/\/fanqienovel.com\/\", \"\u767b\u5f55\")\n    } catch (e) {\n        java.toast(e)\n    }\n    try {\n        cookie.removeCookie(\"snssdk.com\")\n    } catch (e) {}\n    var cookie_ = \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : source.getLoginInfoMap()['\u624b\u52a8\u767b\u5f55Token'])\n    let user\n    try {\n        user = JSON.parse(java.ajax(\"https:\/\/fanqienovel.com\/api\/user\/info\/v2,\" + JSON.stringify({\n            method: \"GET\",\n            headers: {\n                \"Cookie\": cookie_\n            }\n        }))).data.name\n    } catch (e) {\n        java.log(e)\n    }\n    if (!cookie_ || cookie_ == \"sessionid=\" || !user) {\n        java.toast(\"\u672a\u83b7\u53d6\u5230\u767b\u5f55\u51ed\u636e\uff0c\u767b\u5f55\u5931\u8d25\")\n        return false\n    }\n    java.toast(\"\\n\\n\u6b22\u8fce \" + user + \"\\n\u767b\u5f55\u6210\u529f\uff01\")\n    return true\n}\n\n\/\/\u9000\u51fa\u767b\u5f55\nfunction logout() {\n    cookie.removeCookie(\"fanqienovel.com\");\n    cookie.removeCookie(\"snssdk.com\");\n    cookie.removeCookie(\"69shuba.com\");\n    \/*\n    let servers = host\n    for (let server of servers) {\n    \ttry{removeCookie(server )} catch(e){cookie.removeCookie(server )}\n    }\n    *\/\ntry{cookie.removeCookie(getArgument('server'))} catch(e){}\n    java.toast(\"\u9000\u51fa\u767b\u5f55\u6210\u529f\");\n}\n\n\/\/\u83b7\u53d6\u53c2\u6570\nfunction getArgument(key) {\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    return open_argument[key];\n}\n\n\/\/\u8bbe\u7f6e\u53c2\u6570\nfunction setArgument(key, value) {\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    open_argument[key] = value;\n    open_argument = JSON.stringify(open_argument);\n    source.setVariable(open_argument);\n    return open_argument;\n}\n\n\/\/ \u8bbe\u7f6e\u672c\u5730or\u4e91\u7aef\u8bbf\u95ee\nfunction get_proxy() {\n    let proxy = getArgument('proxy');\n    if (proxy == '\u672c\u5730') {\n        setArgument('proxy', '\u4e91\u7aef');\n        java.longToast('\\n\u6240\u6709\u6570\u636e\u91c7\u7528\\n\\n\u670d\u52a1\u5668\u7f51\u7edc\u8bbf\u95ee\\n\\n\u5982\u679c\u53d1\u73b0\u7528\u4e0d\u4e86\uff0c\u8bf7\u5207\u6362\u672c\u5730\u7f51\u7edc\u8bbf\u95ee\uff0c\u598269\u4e66\u5427');\n    } else {\n        setArgument('proxy', '\u672c\u5730');\n        java.longToast('\\n\u6240\u6709\u6570\u636e\u91c7\u7528\\n\\n\u672c\u5730\u7f51\u7edc\u8bbf\u95ee\\n\\n\u5982\u679c\u53d1\u73b0\u7528\u4e0d\u4e86\uff0c\u8bf7\u5f00\u542f\u7f51\u7edc\u4ee3\u7406\uff0c\u598269\u4e66\u5427');\n    }\n}\n\n\n\/\/\u8bbe\u7f6e\u7537\u5973\u9891\nfunction set_source_type() {\n    let source_type = getArgument(\"source_type\");\n    if (source_type == '\u5973\u9891') {\n        setArgument(\"source_type\", '\u7537\u9891');\n    java.toast(\"\\n\u53d1\u73b0\u9875\u5df2\u8bbe\u7f6e\u4e3a:\ud83d\ude4b\u200d\u2642\ufe0f\u7537\u9891\" );\n    } else {\n        setArgument(\"source_type\", '\u5973\u9891');\n    java.toast(\"\\n\u53d1\u73b0\u9875\u5df2\u8bbe\u7f6e\u4e3a:\ud83d\ude4b\u200d\u2640\ufe0f\u5973\u9891\" );\n    }\n    \n}\n\nfunction set_reading() {\n\tlet reading = getArgument(\"reading\");\n    if (reading == '1') {\n        setArgument(\"reading\", '0');\n    java.toast(\"\\n\\n\u6674\u5929\u4e66\u67b6\u8bb0\u5f55\u540c\u6b65\u5df2\u5173\u95ed\uff01\" );\n    } else {\n        setArgument(\"reading\", '1');\n    java.longToast(\"\\n\\n\u6674\u5929\u4e66\u67b6\u8bb0\u5f55\u540c\u6b65\u5df2\u5f00\u542f\uff01\\n\u5237\u65b0\u9605\u8bfb\u4e66\u67b6\u5373\u53ef\u5c06\u4e66\u67b6\u4e66\u7c4d\u540c\u6b65\u5230\u6674\u5929\u4e66\u67b6\uff01\" );\n    }\n\n\t}\n\n\/\/\u9996\u9875\nfunction api() {\n    java.startBrowserAwait('http:\/\/vip.gyks.cf', \"\u9996\u9875\");\n}\n\n\/\/\u6253\u8d4f\nfunction vip() {\n\t    let base_url = getArgument('server');\n\t   let ck = String(cookie.getKey(base_url, \"qttoken\"));\n\t   if (!ck) {\n\t   \tjava.longToast('\\n\\n\ud83d\udeab\u8bf7\u5148\u767b\u5f55!')\n\t   \t} else {\n\t   \t\tjava.startBrowserAwait(getArgument('server') + '\/coffee', '\u6674\u5929\u5c0f\u8bf4\u4f1a\u5458\u5f00\u901a');\n\t   \t\t}\n    }\n\nfunction put_sk() {\n\t    \t   \t\tjava.startBrowserAwait( 'https:\/\/sk.gyks.cf', '\u6674\u5929\u4e66\u5e93');\n\t   \t\t\n    }\n\nvar server = getArgument('server');\n\n\/\/\u8bbe\u7f6e\u641c\u7d22\u5a92\u4f53\nfunction set_media(media) {\n    const mediaConfig = {\n        '\u559c\u9a6c\u62c9\u96c5': ['\u542c\u4e66'],\n        '\u756a\u8304': '*',\n        '\u798f\u5229\u5c0f\u8bf4': ['\u5c0f\u8bf4'],\n        '\u5982\u6f2b\u753b': ['\u6f2b\u753b'],\n        '\u5305\u5b50\u6f2b\u753b': ['\u6f2b\u753b'],\n        '\u4e5d\u5996\u6f2b\u753b': ['\u6f2b\u753b'],\n        '\u7ec5\u58eb\u6f2b\u753b': ['\u6f2b\u753b'],\n        '\u798f\u5229\u6f2b\u753b': ['\u6f2b\u753b'],\n        '\u597d\u770b\u6f2b\u753b': ['\u6f2b\u753b'],\n        '\u516d\u6708\u542c\u4e66': ['\u542c\u4e66'],\n        '\u6d77\u6d0b\u542c\u4e66': ['\u542c\u4e66'],\n        '\u9177\u6211\u542c\u4e66': ['\u542c\u4e66'],\n        '\u4e03\u732b': ['\u5c0f\u8bf4', '\u542c\u4e66', '\u77ed\u5267'],\n        '\u6cb3\u9a6c': ['\u77ed\u5267'],\n        '\u8d85\u4f1a\u4e13\u5c5e\u77ed\u5267': ['\u77ed\u5267'],\n        '\u6b6a\u745e\u53e4\u5fb7': ['\u6f2b\u753b'],\n        '\u6bd2\u820c\u5f71\u89c6': ['\u77ed\u5267'],\n        '\u5168\u90e8': '*', \/\/ \u5141\u8bb8\u6240\u6709\u6a21\u5f0f\n        '\u9ed8\u8ba4': ['\u5c0f\u8bf4']\n    };\n\n    const source = getArgument('sources');\n    const allowedModes = mediaConfig[source] || mediaConfig['\u9ed8\u8ba4'];\n    let targetMedia = mediaConfig['\u9ed8\u8ba4'][0];\n    let isAllowed = false;\n\n    if (allowedModes === '*' || allowedModes.includes(media)) {\n        targetMedia = media;\n        isAllowed = true;\n    } else if (Array.isArray(allowedModes)) {\n        targetMedia = allowedModes[0];\n    }\n\n    const message = isAllowed ?\n        `\\n\\n\u5df2\u5207\u6362\u81f3\uff1a${targetMedia}\\n\u8bf7\u91cd\u65b0\u641c\u7d22\u4e66\u7c4d\uff01` :\n        `\\n\\n\u76ee\u524d${source}\uff1a\u4e0d\u652f\u6301\u3010${media}\u3011\u6a21\u5f0f\uff01\\n\u5df2\u81ea\u52a8\u5207\u6362\u81f3\uff1a${targetMedia}`;\n\n    setArgument('tab', targetMedia);\n    java.toast(message);\n}\n\n\/\/\u83b7\u53d6\u641c\u7d22\u5a92\u4f53\nfunction get_media() {\n    let media = getArgument('tab');\n    let source = getArgument('sources');\n    if (media == '') {\n        media = '\u5168\u90e8';\n    }\n    var tishi = '\\n\\n\u5f53\u524d\u670d\u52a1\u5668\uff1a' + getArgument('server')\n    java.longToast(`\\n\\n\u5f53\u524d\u4f7f\u7528\u6e90\uff1a${source}-${media}${tishi}`);\n}\n\n\n\/\/\u8bbe\u7f6e\u670d\u52a1\u5668\nfunction set_server() {\n    putLoginInfo(JSON.stringify(result))\n    let zdyserver;\n    let base_url = getArgument('server')\n    try {\n        zdyserver = String(result['\u81ea\u5b9a\u4e49\u670d\u52a1\u5668(\u53ef\u4e0d\u586b)']);\n        if (zdyserver.includes('http')) {\n            setArgument('server', zdyserver);\n            if (getKey(String(cookie.getCookie(base_url)))) {\n                let cookies = cookie.getCookie(base_url)\n                try{cookie.removeCookie(base_url)} catch(e){}\n                cookie.setCookie(zdyserver, cookies)\n            }\n            java.toast(`\\n\\n\u5f53\u524d\u670d\u52a1\u5668\u4e3a\u81ea\u5b9a\u4e49\u670d\u52a1\u5668\\n${zdyserver}\\n\\n\u5207\u6362\u670d\u52a1\u5668\u8bf7\u5148\u6e05\u7a7a\u670d\u52a1\u5668\u5730\u5740\u4e2d\u7684\u6570\u636e`);\n        } else {\n            zdyserver = '';\n        }\n    } catch (error) {\n        zdyserver = '';\n    }\n    if (!zdyserver) {\n        const servers = host\n        const currentServer = getArgument('server') || '';\n        const currentIndex = servers.indexOf(currentServer);\n\n        const nextIndex = currentIndex >= 0 ? (currentIndex + 1) % servers.length : 0;\n        const nextServer = servers[nextIndex];\n\n        setArgument('server', nextServer);\n        if (getKey(String(cookie.getCookie(currentServer)))) {\n            let cookies = cookie.getCookie(currentServer)\ntry{cookie.removeCookie(currentServer)} catch(e){}\n            cookie.setCookie(nextServer, cookies)\n        }\n        java.longToast(`\\n\\n\u670d\u52a1\u5668\u3010${nextIndex+1}\u3011\uff1a${nextServer}`);\n    }\n}\n\n\/\/\u83b7\u53d6\u97f3\u8272\nvar tone_id = getArgument('tone_id');\n\nfunction get_tone_id(arg) {\n    var datadist = {\n        \"0\": \"\u9ed8\u8ba4\u97f3\u8272\",\n        \"-1\": \"\u9605\u8bfb\u6a21\u5f0f\",\n        \"-2\": \"\u6f2b\u753b\u6a21\u5f0f\",\n        \"51\": \"\u591a\u4eba\u53d1\u97f3\",\n        \"1\": \"\u751c\u7f8e\u5c11\u5973\",\n        \"2\": \"\u6e05\u4eae\u9752\u53d4\",\n        \"5\": \"\u5f00\u6717\u9752\u5e74\",\n        \"6\": \"\u6e29\u67d4\u6dd1\u5973\",\n        \"4\": \"\u6210\u719f\u5927\u53d4\",\n        \"74\": \"\u5927\u53d4\u5347\u7ea7\",\n        \"30\": \"\u4f18\u96c5\u5fa1\u59d0\"\n    };\n    var tone_id = datadist[arg] || arg;\n    var tishi = '\\n\\n\u5f53\u524d\u97f3\u8272\uff1a' + tone_id;\n    java.toast(tishi);\n}\n\n\n\/\/\u8bbe\u7f6e\u6765\u6e90\nfunction set_source(sources) {\n    let zdysources = String(result['\u81ea\u5b9a\u4e49\u641c\u7d22\u6e90(\u591a\u4e2a\u7528\u82f1\u6587,\u5206\u5272)'] || '');\n    if (zdysources.length > 1 && zdysources != 'undefined') {\n        java.toast('\\n\\n\u8bf7\u5148\u6e05\u7a7a\u81ea\u5b9a\u4e49\u6e90\u518d\u8bbe\u7f6e');\n    } else {\n        setArgument('sources', sources);\n        set_media('\u5c0f\u8bf4');\n        java.toast(`\\n\\n\u5f53\u524d\u6765\u6e90\u5df2\u5207\u6362\u4e3a:\\n${sources}\\n\\n\u5207\u6362\u540e\u8bf7\u91cd\u65b0\u641c\u7d22`);\n    }\n}\n\n\/\/ \u8bbe\u7f6e\u7b80\u4ecb\nfunction set_info() {\n    var info = getArgument('info');\n    if (info == 'off') {\n        setArgument('info', 'on');\n        java.toast('\\n\\n\u5df2\u6062\u590d\u8be6\u60c5\u9875\u8be6\u7ec6\u7b80\u4ecb');\n    } else {\n        setArgument('info', 'off');\n        java.toast('\\n\\n\u5df2\u7cbe\u7b80\u8be6\u60c5\u9875\u7b80\u4ecb');\n    }\n}\n\n\/\/ \u756a\u8304\u6bb5\u8bc4\nfunction paracomment() {\n    var fqpara = getArgument('fqpara');\n    if (fqpara != 'on') {\n        setArgument('fqpara', 'on');\n        java.longToast(\"\\n\\n\u6bb5\u8bc4\u5df2\u5f00\u542f\\n\\n\u957f\u6309\u5237\u65b0\u6bb5\u540e\u9762\u7684\u56fe\u7247\u5373\u53ef\\n\\n\u5982\u679c\u56fe\u7247\u4e0d\u663e\u793a\uff0c\u5237\u65b0\u65e0\u53cd\u5e94\\n\u8bf7\u66f4\u65b0\u6d4b\u8bd5\u7248\u9605\u8bfbapp\");\n    } else {\n        setArgument('fqpara', 'off');\n        java.longToast('\\n\\n\u6bb5\u8bc4\u5df2\u5173\u95ed');\n    }\n}\n\n\/\/ \u5f3a\u5236\u641c\u7d22\u88ab\u7981\u7528\u7684\u6e90\nfunction disabledSources() {\n    var disabled_sources = getArgument('disabled_sources');\n    if (disabled_sources == '1') {\n        setArgument('disabled_sources', '0');\n        java.longToast('\\n\\n\u5f3a\u5236\u641c\u7d22\u7981\u7528\u7684\u6e90\u5df2\u5173\u95ed');\n    } else {\n        setArgument('disabled_sources', '1');\n        setArgument('sources', '\u5168\u90e8');\n        java.longToast(\"\\n\\n\u5f3a\u5236\u641c\u7d22\u7981\u7528\u7684\u6e90\u5df2\u5f00\u542f\\n\\n\u6ce8\u610f\uff1a\u5f00\u542f\u540e\u641c\u7d22\u65f6\u95f4\u4f1a\u53d8\u957f\uff01\");\n    }\n}\n\n\/\/ \u6211\u8981\u63a8\u8350\nfunction put_book() {\n    java.startBrowserAwait(getArgument('server') + '\/put_book', '\u6211\u6765\u63a8\u8350');\n}\n\n\/\/ \u4e66\u6e90\u66f4\u65b0\nfunction renderVersionPage() {\n    let yd = '';\n    let html = `\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n  <meta charset=\"UTF-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\n  <title>\u4e66\u6e90\u66f4\u65b0<\/title>\n  <!-- Font Awesome \u56fe\u6807\u5e93 -->\n  <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.4.0\/css\/all.min.css\" \/>\n  <style>\n    :root {\n      --primary-gradient: linear-gradient(135deg, #4e6ef2, #6b2dd8);\n      --latest-gradient: linear-gradient(135deg, #8e2de2 0%, #4a00e0 50%, #d4af37 100%);\n      --success-color: #28c76f;\n      --warning-color: #ff9f43;\n      --error-color: #ea5455;\n      --text-main: #1f2937;\n      --text-secondary: #6b7280;\n      --card-bg: #ffffff;\n      --border-color: #e5e7eb;\n      --light-bg: #f9fafb;\n      --shadow: 0 4px 12px rgba(78, 110, 242, 0.1);\n      --shadow-hover: 0 6px 18px rgba(78, 110, 242, 0.2);\n      --glow-shadow: 0 0 25px rgba(142, 45, 226, 0.5), 0 0 50px rgba(212, 175, 55, 0.3);\n      --modal-bg: rgba(31, 41, 55, 0.8);\n      --modal-content-bg: #ffffff;\n    }\n\n    * {\n      box-sizing: border-box;\n      margin: 0;\n      padding: 0;\n      font-family: 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;\n    }\n\n    body {\n      background: linear-gradient(135deg, #eef2ff, #f5f7ff);\n      color: var(--text-main);\n      min-height: 100vh;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      padding: 16px;\n    }\n\n    \/* \u52a0\u8f7d\u52a8\u753b *\/\n    .loading-wrapper {\n      text-align: center;\n      animation: fadeIn 0.3s ease;\n    }\n\n    .loading-spinner {\n      width: 50px;\n      height: 50px;\n      border: 4px solid rgba(78, 110, 242, 0.3);\n      border-top-color: #4e6ef2;\n      border-radius: 50%;\n      margin: 0 auto 20px;\n      animation: spin 1s linear infinite;\n    }\n\n    .loading-text {\n      color: var(--text-main);\n      font-size: 16px;\n      font-weight: 500;\n    }\n\n    @keyframes spin {\n      to { transform: rotate(360deg); }\n    }\n\n    @keyframes fadeIn {\n      from { opacity: 0; transform: translateY(20px); }\n      to { opacity: 1; transform: translateY(0); }\n    }\n\n    @keyframes slideIn {\n      from { opacity: 0; transform: translateY(30px); }\n      to { opacity: 1; transform: translateY(0); }\n    }\n\n    @keyframes pulse {\n      0%, 100% { opacity: 1; }\n      50% { opacity: 0.7; }\n    }\n\n    @keyframes gradientAnimation {\n      0% { background-position: 0% 50%; }\n      50% { background-position: 100% 50%; }\n      100% { background-position: 0% 50%; }\n    }\n\n    @keyframes breathe {\n      0%, 100% { \n        transform: scale(1);\n        box-shadow: var(--glow-shadow), var(--shadow);\n      }\n      50% { \n        transform: scale(1.02);\n        box-shadow: 0 0 30px rgba(142, 45, 226, 0.6), 0 0 60px rgba(212, 175, 55, 0.4), var(--shadow);\n      }\n    }\n\n    @keyframes shimmer {\n      0% {\n        background-position: -200% center;\n      }\n      100% {\n        background-position: 200% center;\n      }\n    }\n\n    \/* \u4e3b\u5bb9\u5668 *\/\n    .container {\n      width: 100%;\n      max-width: 420px;\n      background: var(--card-bg);\n      border-radius: 24px;\n      overflow: hidden;\n      box-shadow: var(--shadow);\n      position: relative;\n      z-index: 1;\n      animation: slideIn 0.5s ease;\n      display: none;\n    }\n\n    \/* \u5934\u90e8 *\/\n    .header {\n      background: var(--primary-gradient);\n      color: #ffffff;\n      padding: 24px 16px;\n      text-align: center;\n      position: relative;\n      overflow: hidden;\n    }\n\n    .header::before {\n      content: '';\n      position: absolute;\n      top: -30px;\n      left: -30px;\n      width: 80px;\n      height: 80px;\n      background: rgba(255, 255, 255, 0.15);\n      border-radius: 50%;\n    }\n\n    .header::after {\n      content: '';\n      position: absolute;\n      bottom: -60px;\n      right: -60px;\n      width: 150px;\n      height: 150px;\n      background: rgba(255, 255, 255, 0.1);\n      border-radius: 50%;\n    }\n\n    .header h1 {\n      font-size: 1.4rem;\n      font-weight: 700;\n      margin-bottom: 8px;\n      position: relative;\n      z-index: 2;\n    }\n\n    .header p {\n      font-size: 0.9rem;\n      opacity: 0.9;\n      line-height: 1.4;\n      position: relative;\n      z-index: 2;\n    }\n\n    .header-icon {\n      font-size: 48px;\n      margin-bottom: 10px;\n      display: inline-block;\n      animation: bounce 2s ease infinite;\n    }\n\n    @keyframes bounce {\n      0%, 100% { transform: translateY(0); }\n      50% { transform: translateY(-10px); }\n    }\n\n    \/* \u7248\u672c\u5bf9\u6bd4 *\/\n    .version-comparison {\n      display: flex;\n      flex-wrap: nowrap;\n      gap: 12px;\n      padding: 16px;\n      margin-top: 8px;\n      position: relative;\n      z-index: 10;\n    }\n\n    .version-card {\n      flex: 1;\n      min-width: 45%;\n      background: var(--card-bg);\n      border-radius: 16px;\n      padding: 28px 16px 16px;\n      box-shadow: var(--shadow);\n      text-align: center;\n      position: relative;\n      transition: transform 0.3s ease, box-shadow 0.3s ease;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n    }\n\n    .version-card:hover {\n      transform: translateY(-4px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .version-card.current-version {\n      background: linear-gradient(135deg, #ffffff 0%, #f8f9ff 100%);\n      border: 1px solid rgba(78, 110, 242, 0.15);\n    }\n\n    .version-card.current-version:hover {\n      box-shadow: 0 6px 20px rgba(78, 110, 242, 0.15);\n    }\n\n    .version-card.current-version h3,\n    .version-card.current-version .version-number,\n    .version-card.current-version .version-date {\n      color: var(--text-main);\n    }\n\n    .version-card.latest-version {\n      background: var(--latest-gradient);\n      background-size: 300% 300%;\n      box-shadow: var(--glow-shadow), var(--shadow);\n      color: #fff;\n      z-index: 2;\n      animation: gradientAnimation 6s ease infinite, breathe 3s ease-in-out infinite;\n      position: relative;\n      overflow: hidden;\n    }\n\n    .version-card.latest-version::before {\n      content: '';\n      position: absolute;\n      top: -50%;\n      left: -50%;\n      width: 200%;\n      height: 200%;\n      background: linear-gradient(\n        90deg,\n        transparent,\n        rgba(255, 255, 255, 0.3),\n        transparent\n      );\n      transform: rotate(45deg);\n      animation: shimmer 3s infinite;\n    }\n\n    .version-card.latest-version h3,\n    .version-card.latest-version .version-number,\n    .version-card.latest-version .version-date {\n      color: #fff;\n      text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\n      position: relative;\n      z-index: 1;\n    }\n\n    .version-status {\n      position: absolute;\n      top: 6px;\n      right: 6px;\n      padding: 3px 7px;\n      font-size: 0.65rem;\n      font-weight: 600;\n      border-radius: 6px;\n      color: #fff;\n      line-height: 1.2;\n      white-space: nowrap;\n      z-index: 2;\n    }\n\n    .version-card.latest-version .version-status {\n      background: rgba(255, 255, 255, 0.25);\n      backdrop-filter: blur(5px);\n      border: 1px solid rgba(255, 255, 255, 0.3);\n      color: #fff;\n      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n    }\n\n    .status-outdated { background: var(--warning-color); }\n    .status-latest { background: var(--success-color); }\n    .status-invalid { background: var(--error-color); }\n\n    .version-card h3 {\n      font-size: 0.9rem;\n      color: var(--text-secondary);\n      margin-bottom: 8px;\n      font-weight: 500;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 6px;\n    }\n\n    .version-number {\n      font-size: 1.25rem;\n      font-weight: 700;\n      color: var(--text-main);\n      margin: 8px 0;\n      transition: all 0.3s ease;\n      font-family: 'Courier New', monospace;\n    }\n\n    .version-card.latest-version .version-number {\n      font-size: 1.4rem;\n      transform: scale(1.05);\n      text-shadow: \n        0 2px 4px rgba(0, 0, 0, 0.3),\n        0 0 10px rgba(212, 175, 55, 0.8),\n        0 0 20px rgba(212, 175, 55, 0.5);\n      animation: pulse-glow 2s ease-in-out infinite;\n    }\n\n    @keyframes pulse-glow {\n      0%, 100% {\n        text-shadow: \n          0 2px 4px rgba(0, 0, 0, 0.3),\n          0 0 10px rgba(212, 175, 55, 0.8),\n          0 0 20px rgba(212, 175, 55, 0.5);\n      }\n      50% {\n        text-shadow: \n          0 2px 4px rgba(0, 0, 0, 0.3),\n          0 0 15px rgba(212, 175, 55, 1),\n          0 0 30px rgba(212, 175, 55, 0.7);\n      }\n    }\n\n    .version-date {\n      font-size: 0.8rem;\n      color: var(--text-secondary);\n      margin-top: 4px;\n    }\n\n    \/* \u7248\u672c\u5bf9\u6bd4\u6307\u793a\u5668 *\/\n    .version-indicator {\n      position: absolute;\n      left: 50%;\n      top: 50%;\n      transform: translate(-50%, -50%);\n      z-index: 5;\n      width: 32px;\n      height: 32px;\n      border-radius: 50%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n      color: white;\n    }\n\n    .version-indicator.update-needed {\n      background: var(--error-color);\n      box-shadow: 0 2px 8px rgba(234, 84, 85, 0.4);\n      animation: pulse-indicator 1.5s infinite;\n    }\n\n    .version-indicator.is-latest {\n      background: var(--success-color);\n      box-shadow: 0 2px 8px rgba(40, 199, 111, 0.4);\n    }\n\n    @keyframes pulse-indicator {\n      0% { transform: translate(-50%, -50%) scale(1); }\n      50% { transform: translate(-50%, -50%) scale(1.1); }\n      100% { transform: translate(-50%, -50%) scale(1); }\n    }\n\n    \/* \u5185\u5bb9\u533a *\/\n    .content-container {\n      padding: 16px;\n    }\n\n    \/* \u72b6\u6001\u63d0\u793a *\/\n    .status-alert {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      padding: 12px 16px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 10px;\n      font-weight: 500;\n      font-size: 14px;\n      animation: slideIn 0.5s ease 0.3s backwards;\n    }\n\n    .status-alert i {\n      font-size: 20px;\n    }\n\n    .status-alert.update-available {\n      background: linear-gradient(135deg, #ffeaa7 0%, #fdcb6e 100%);\n      color: #d63031;\n      box-shadow: 0 4px 15px rgba(253, 203, 110, 0.4);\n    }\n\n    .status-alert.up-to-date {\n      background: linear-gradient(135deg, #55efc4 0%, #00b894 100%);\n      color: white;\n      box-shadow: 0 4px 15px rgba(0, 184, 148, 0.4);\n    }\n\n    \/* \u66f4\u65b0\u5bb9\u5668 *\/\n    .update-container {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      animation: slideIn 0.5s ease 0.4s backwards;\n    }\n\n    .update-header {\n      background: var(--light-bg);\n      padding: 12px 16px;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      border-bottom: 1px solid var(--border-color);\n    }\n\n    .update-header h2 {\n      font-size: 1rem;\n      font-weight: 600;\n      color: var(--text-main);\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .update-header h2 i {\n      color: #4e6ef2;\n    }\n\n    .update-tag {\n      background: rgba(78, 110, 242, 0.1);\n      color: #4e6ef2;\n      padding: 4px 8px;\n      border-radius: 8px;\n      font-size: 0.75rem;\n      font-weight: 600;\n    }\n\n    .update-content {\n      padding: 16px;\n    }\n\n    .update-date {\n      font-weight: 600;\n      color: #4e6ef2;\n      margin-bottom: 12px;\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      padding: 8px 0;\n      border-bottom: 1px dashed #e0e0e0;\n    }\n\n    .update-text {\n      margin: 8px 0;\n      position: relative;\n      padding-left: 16px;\n      line-height: 1.5;\n      color: var(--text-main);\n      font-size: 0.95rem;\n      white-space: pre-wrap;\n      word-break: break-word;\n    }\n\n    .update-text::before {\n      content: '\u2022';\n      position: absolute;\n      left: 0;\n      font-weight: bold;\n      color: #4e6ef2;\n      font-size: 1.2rem;\n      line-height: 1;\n    }\n\n    \/* \u5386\u53f2\u65e5\u5fd7 *\/\n    .history-container {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      animation: slideIn 0.5s ease 0.5s backwards;\n    }\n\n    .history-header {\n      background: var(--light-bg);\n      padding: 12px 16px;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      border-bottom: 1px solid var(--border-color);\n      cursor: pointer;\n      user-select: none;\n    }\n\n    .history-header:hover {\n      opacity: 0.8;\n    }\n\n    .history-header h2 {\n      font-size: 1rem;\n      font-weight: 600;\n      color: var(--text-main);\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .history-header h2 i {\n      color: #4e6ef2;\n    }\n\n    .toggle-history {\n      background: none;\n      border: none;\n      color: var(--text-secondary);\n      cursor: pointer;\n      font-weight: 500;\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      font-size: 0.85rem;\n      transition: color 0.2s ease;\n    }\n\n    .toggle-history:hover {\n      color: #4e6ef2;\n    }\n\n    .history-content {\n      padding: 0 16px;\n      max-height: 0;\n      overflow: hidden;\n      transition: max-height 0.4s ease, padding 0.4s ease;\n    }\n\n    .history-content.expanded {\n      max-height: 60vh;\n      overflow-y: auto;\n      padding: 16px;\n      scrollbar-width: thin;\n      scrollbar-color: #4e6ef2 #f0f0f0;\n    }\n\n    .history-content.expanded::-webkit-scrollbar {\n      width: 6px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-track {\n      background: #f0f0f0;\n      border-radius: 4px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-thumb {\n      background: #4e6ef2;\n      border-radius: 4px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-thumb:hover {\n      background: #3a56d0;\n    }\n\n    .history-item {\n      margin-bottom: 16px;\n      padding-bottom: 16px;\n      border-bottom: 1px dashed var(--border-color);\n    }\n\n    .history-item:last-child {\n      border-bottom: none;\n      margin-bottom: 0;\n      padding-bottom: 0;\n    }\n\n    .history-date {\n      font-weight: 600;\n      color: var(--text-main);\n      margin-bottom: 8px;\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      font-size: 0.9rem;\n      background: rgba(78, 110, 242, 0.05);\n      padding: 6px 10px;\n      border-radius: 6px;\n    }\n\n    .history-text {\n      margin: 8px 0;\n      padding-left: 16px;\n      line-height: 1.4;\n      color: var(--text-secondary);\n      position: relative;\n      font-size: 0.9rem;\n      white-space: pre-wrap;\n      word-break: break-word;\n    }\n\n    .history-text::before {\n      content: '\u2022';\n      position: absolute;\n      left: 0;\n      color: #4e6ef2;\n      font-weight: bold;\n      font-size: 1.2rem;\n      line-height: 1;\n    }\n\n    \/* \u6309\u94ae\u7ec4 *\/\n    .button-group {\n      display: flex;\n      flex-direction: column;\n      gap: 10px;\n      margin-bottom: 16px;\n    }\n\n    .button {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 10px;\n      padding: 14px 28px;\n      text-align: center;\n      font-size: 1rem;\n      border: none;\n      border-radius: 12px;\n      text-decoration: none;\n      background: var(--primary-gradient);\n      color: white;\n      font-weight: 600;\n      transition: all 0.3s ease;\n      box-shadow: var(--shadow);\n      position: relative;\n      overflow: hidden;\n      cursor: pointer;\n    }\n\n    .button i {\n      font-size: 1rem;\n    }\n\n    .button::after {\n      content: '';\n      position: absolute;\n      top: -50%;\n      left: -50%;\n      width: 200%;\n      height: 200%;\n      background: rgba(255, 255, 255, 0.1);\n      transform: rotate(30deg);\n      transition: all 0.6s ease;\n      pointer-events: none;\n    }\n\n    .button:hover {\n      transform: translateY(-3px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .button:hover::after {\n      transform: rotate(30deg) translate(20%, 20%);\n    }\n\n    .button:active {\n      transform: scale(0.95);\n    }\n\n    \/* \u9519\u8bef\u72b6\u6001 *\/\n    .error-state {\n      text-align: center;\n      padding: 40px 20px;\n      color: var(--text-main);\n    }\n\n    .error-icon {\n      font-size: 64px;\n      margin-bottom: 20px;\n      color: var(--error-color);\n    }\n\n    .error-text {\n      font-size: 16px;\n      line-height: 1.6;\n      margin-bottom: 20px;\n    }\n\n    .retry-button {\n      background: var(--primary-gradient);\n      color: white;\n      padding: 12px 30px;\n      border-radius: 12px;\n      border: none;\n      font-weight: 600;\n      cursor: pointer;\n      transition: all 0.3s ease;\n      font-size: 14px;\n      box-shadow: var(--shadow);\n    }\n\n    .retry-button:hover {\n      transform: translateY(-2px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .retry-button:active {\n      transform: scale(0.95);\n    }\n\n    \/* \u88c5\u9970\u5143\u7d20 *\/\n    .decoration {\n      position: absolute;\n      z-index: 0;\n      pointer-events: none;\n    }\n\n    .decoration.circle {\n      width: 120px;\n      height: 120px;\n      border-radius: 50%;\n      background: rgba(107, 45, 216, 0.05);\n      top: 10%;\n      left: 10%;\n    }\n\n    .decoration.square {\n      width: 80px;\n      height: 80px;\n      transform: rotate(45deg);\n      background: rgba(78, 110, 242, 0.05);\n      bottom: 10%;\n      right: 10%;\n    }\n\n    \/* \u54cd\u5e94\u5f0f *\/\n    @media (max-width: 768px) {\n      body {\n        padding: 12px;\n      }\n\n      .container {\n        max-width: 100%;\n        border-radius: 20px;\n      }\n\n      .header {\n        padding: 20px 15px;\n      }\n\n      .header h1 {\n        font-size: 1.3rem;\n      }\n\n      .header-icon {\n        font-size: 40px;\n      }\n\n      .version-comparison {\n        flex-direction: row;\n        flex-wrap: nowrap;\n        gap: 10px;\n        padding: 12px;\n        margin-top: 6px;\n        overflow-x: auto;\n      }\n\n      .version-card {\n        min-width: 45%;\n        padding: 26px 12px 12px;\n      }\n\n      \/* \u79fb\u52a8\u7aef\u51cf\u5f31\u547c\u5438\u52a8\u6548 *\/\n      .version-card.latest-version {\n        animation: gradientAnimation 6s ease infinite;\n      }\n\n      .version-status {\n        top: 5px;\n        right: 5px;\n        padding: 2px 5px;\n        font-size: 0.6rem;\n      }\n\n      .version-number {\n        font-size: 1.1rem;\n      }\n\n      .version-card.latest-version .version-number {\n        font-size: 1.2rem;\n      }\n\n      .update-header h2, .history-header h2 {\n        font-size: 0.9rem;\n      }\n\n      .button {\n        padding: 12px 24px;\n        font-size: 0.95rem;\n      }\n\n      .history-content.expanded {\n        max-height: 50vh;\n        -webkit-overflow-scrolling: touch;\n      }\n    }\n\n    @media (max-width: 380px) {\n      .header h1 {\n        font-size: 1.2rem;\n      }\n\n      .version-number {\n        font-size: 1rem;\n      }\n\n      .version-card.latest-version .version-number {\n        font-size: 1.1rem;\n      }\n\n      .button {\n        padding: 11px;\n        font-size: 0.9rem;\n      }\n    }\n  <\/style>\n<\/head>\n<body>\n  <div class=\"decoration circle\"><\/div>\n  <div class=\"decoration square\"><\/div>\n\n  <div id=\"loading\" class=\"loading-wrapper\">\n    <div class=\"loading-spinner\"><\/div>\n    <div class=\"loading-text\"><i class=\"fas fa-search\"><\/i> \u6b63\u5728\u68c0\u67e5\u66f4\u65b0...<\/div>\n  <\/div>\n\n  <div class=\"container\" id=\"container\">\n    <div class=\"header\">\n      <div class=\"header-icon\"><i class=\"fas fa-book\"><\/i><\/div>\n      <h1>\u6674\u5929\u4e66\u6e90\u66f4\u65b0<\/h1>\n      <p>\u63a8\u8350\u4f7f\u7528\u9605\u8bfb\u6d4b\u8bd5\u7248<br>\u6b63\u5f0f\u7248\u53ef\u80fd\u5b58\u5728\u517c\u5bb9\u6027\u95ee\u9898<\/p>\n    <\/div>\n\n    <div class=\"version-comparison\">\n      <div class=\"version-card current-version\">\n        <div class=\"version-status status-outdated\" id=\"currentStatus\">\u5f85\u68c0\u67e5<\/div>\n        <h3><i class=\"fas fa-cube\"><\/i> \u5f53\u524d\u7248\u672c<\/h3>\n        <div class=\"version-number\" id=\"currentVersion\">-<\/div>\n        <div class=\"version-date\">\u60a8\u7684\u5f53\u524d\u7248\u672c<\/div>\n      <\/div>\n\n      <div class=\"version-indicator update-needed\" id=\"versionIndicator\" style=\"display: none;\">\n        <i class=\"fas fa-arrow-right\"><\/i>\n      <\/div>\n\n      <div class=\"version-card latest-version\">\n        <div class=\"version-status status-latest\" id=\"latestStatus\">\u6700\u65b0\u7248\u672c<\/div>\n        <h3><i class=\"fas fa-star\"><\/i> \u6700\u65b0\u7248\u672c<\/h3>\n        <div class=\"version-number\" id=\"latestVersion\">-<\/div>\n        <div class=\"version-date\">\u53ef\u7528\u6700\u65b0\u7248\u672c<\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"content-container\">\n      <div class=\"status-alert\" id=\"statusAlert\" style=\"display: none;\"><\/div>\n\n      <div id=\"latestLogContainer\" style=\"display: none;\">\n        <div class=\"update-container\">\n          <div class=\"update-header\">\n            <h2><i class=\"fas fa-bolt\"><\/i> \u6700\u65b0\u66f4\u65b0<\/h2>\n            <div class=\"update-tag\">\u6700\u65b0\u53d1\u5e03<\/div>\n          <\/div>\n          <div class=\"update-content\">\n            <div class=\"update-date\" id=\"latestLogDate\"><\/div>\n            <div class=\"update-text\" id=\"latestLogContent\"><\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"button-group\" id=\"buttonGroup\" style=\"display: none;\"><\/div>\n\n      <div class=\"history-container\" id=\"logs\" style=\"display: none;\">\n        <div class=\"history-header\" onclick=\"toggleLogs()\">\n          <h2><i class=\"fas fa-history\"><\/i> \u5386\u53f2\u66f4\u65b0 <span id=\"historyCount\"><\/span><\/h2>\n          <button class=\"toggle-history\" id=\"toggleButton\">\n            <span id=\"toggleText\">\u5c55\u5f00\u5386\u53f2<\/span>\n            <i class=\"fas fa-chevron-down\" id=\"toggleIcon\"><\/i>\n          <\/button>\n        <\/div>\n        <div class=\"history-content\" id=\"logList\"><\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <script>\n  let logsCollapsed = true;\n\n  function toggleLogs() {\n    logsCollapsed = !logsCollapsed;\n    const logList = document.getElementById('logList');\n    const toggleText = document.getElementById('toggleText');\n    const toggleIcon = document.getElementById('toggleIcon');\n    \n    if (logsCollapsed) {\n      logList.classList.remove('expanded');\n      toggleText.textContent = '\u5c55\u5f00\u5386\u53f2';\n      toggleIcon.className = 'fas fa-chevron-down';\n    } else {\n      logList.classList.add('expanded');\n      toggleText.textContent = '\u6536\u8d77\u5386\u53f2';\n      toggleIcon.className = 'fas fa-chevron-up';\n    }\n  }\n\n  (async function() {\n    const loading = document.getElementById('loading');\n    const container = document.getElementById('container');\n    const currentVersion = document.getElementById('currentVersion');\n    const latestVersion = document.getElementById('latestVersion');\n    const currentStatus = document.getElementById('currentStatus');\n    const latestStatus = document.getElementById('latestStatus');\n    const versionIndicator = document.getElementById('versionIndicator');\n    const statusAlert = document.getElementById('statusAlert');\n    const buttonGroup = document.getElementById('buttonGroup');\n    const latestLogContainer = document.getElementById('latestLogContainer');\n    const latestLogDate = document.getElementById('latestLogDate');\n    const latestLogContent = document.getElementById('latestLogContent');\n    const logsContainer = document.getElementById('logs');\n    const logList = document.getElementById('logList');\n    const historyCount = document.getElementById('historyCount');\n\n    const localVer = '${String(localVersion)}';\n\n    \/\/ \u7edf\u4e00\u7684\u670d\u52a1\u5668\u914d\u7f6e - \u65b9\u4fbf\u7ef4\u62a4\n    const serverConfig = {\n      main: {\n        name: '\u4e3b\u7ebf\u8def',\n        icon: 'rocket',\n        baseUrl: 'https:\/\/sy.gyks.cf',\n        downloadPath: '\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E6%99%B4%E5%A4%A9%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup1: {\n        name: '\u5907\u7528\u7ebf\u8def1',\n        icon: 'box',\n        baseUrl: 'http:\/\/v1.gyks.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E6%99%B4%E5%A4%A9%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup2: {\n        name: '\u5907\u7528\u7ebf\u8def2',\n        icon: 'satellite',\n        baseUrl: 'http:\/\/v2.gyks.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E6%99%B4%E5%A4%A9%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup3: {\n        name: '\u5907\u7528\u7ebf\u8def3',\n        icon: 'link',\n        baseUrl: 'http:\/\/v3.gyks.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E6%99%B4%E5%A4%A9%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup4: {\n        name: '\u5907\u7528\u7ebf\u8def4',\n        icon: 'bolt',\n        baseUrl: 'http:\/\/v4.gyks.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E6%99%B4%E5%A4%A9%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup5: {\n        name: '\u5907\u7528\u7ebf\u8def5',\n        icon: 'globe',\n        baseUrl: 'http:\/\/v5.gyks.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E6%99%B4%E5%A4%A9%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup6: {\n        name: '\u5907\u7528\u7ebf\u8def6',\n        icon: 'broadcast-tower',\n        baseUrl: 'http:\/\/101.35.133.34:8888',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E6%99%B4%E5%A4%A9%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      }\n    };\n\n    \/\/ \u7248\u672c\u6bd4\u8f83\u51fd\u6570\n    function compareVersions(vs) {\n      const normalize = (v) => {\n        return v.split('.').map(n => {\n          const num = parseInt(n, 10);\n          return isNaN(num) ? 0 : num;\n        });\n      };\n\n      const parts1 = normalize(localVer);\n      const parts2 = normalize(vs);\n      const maxLength = Math.max(parts1.length, parts2.length);\n      \n      for (let i = 0; i < maxLength; i++) {\n        const num1 = parts1[i] || 0;\n        const num2 = parts2[i] || 0;\n        if (num1 > num2) return 1;\n        if (num1 < num2) return -1;\n      }\n      return 0;\n    }\n\n    async function fetchVersionData() {\n      \/\/ \u4f7f\u7528\u7edf\u4e00\u914d\u7f6e\u4e2d\u9664\u4e3b\u7ebf\u8def\u5916\u7684\u5907\u7528\u7ebf\u8def\u8fdb\u884c\u7248\u672c\u68c0\u67e5\n      const serversToCheck = Object.values(serverConfig).filter(s => s.baseUrl.includes('gyks.cf') || s.baseUrl.includes('101.35'));\n      \n      for (const server of serversToCheck) {\n        try {\n          const response = await fetch(server.baseUrl + '\/version', { timeout: 2000 });\n          if (response.ok) {\n            return await response.json();\n          }\n        } catch (e) {\n          console.warn(\\`\u63a5\u53e3\u5931\u8d25\uff1a\\${server.baseUrl}\\`, e);\n        }\n      }\n      throw new Error('\u6240\u6709\u66f4\u65b0\u63a5\u53e3\u90fd\u8bf7\u6c42\u5931\u8d25');\n    }\n\n    function showError(message) {\n      loading.innerHTML = \\`\n        <div class=\"error-state\">\n          <div class=\"error-icon\"><i class=\"fas fa-exclamation-triangle\"><\/i><\/div>\n          <div class=\"error-text\">\\${message}<\/div>\n          <button class=\"retry-button\" onclick=\"location.reload()\"><i class=\"fas fa-redo\"><\/i> \u91cd\u8bd5<\/button>\n        <\/div>\n      \\`;\n    }\n\n    try {\n      const data = await fetchVersionData();\n      const cloudVersion = String(data.version3);\n      const updateLog = data.update_log || {};\n\n      \/\/ \u663e\u793a\u7248\u672c\u4fe1\u606f\n      currentVersion.textContent = \\`v\\${localVer}\\`;\n      latestVersion.textContent = \\`v\\${cloudVersion}\\`;\n\n      \/\/ \u5904\u7406\u65e5\u5fd7\n      const logEntries = Object.entries(updateLog);\n      if (logEntries.length > 0) {\n        \/\/ \u663e\u793a\u6700\u65b0\u65e5\u5fd7\n        const [latestDate, latestContent] = logEntries[0];\n        latestLogDate.innerHTML = \\`<i class=\"fas fa-calendar-alt\"><\/i> \\${latestDate}\\`;\n        latestLogContent.textContent = latestContent;\n        latestLogContainer.style.display = 'block';\n\n        \/\/ \u663e\u793a\u5386\u53f2\u65e5\u5fd7\n        if (logEntries.length > 1) {\n          const historyLogs = logEntries.slice(1);\n          historyCount.textContent = \\`(\\${historyLogs.length}\u6761)\\`;\n          logList.innerHTML = historyLogs.map(([date, content]) => \\`\n            <div class=\"history-item\">\n              <div class=\"history-date\">\n                <i class=\"fas fa-calendar-day\"><\/i>\n                <span>\\${date}<\/span>\n              <\/div>\n              <div class=\"history-text\">\\${content}<\/div>\n            <\/div>\n          \\`).join('');\n          logsContainer.style.display = 'block';\n        }\n      }\n\n      \/\/ \u68c0\u67e5\u66f4\u65b0\u72b6\u6001\n      const compareResult = compareVersions(cloudVersion);\n      \n      \/\/ \u663e\u793a\u7248\u672c\u6307\u793a\u5668\n      versionIndicator.style.display = 'flex';\n      \n      if (compareResult === -1) {\n        \/\/ \u9700\u8981\u66f4\u65b0\n        currentStatus.textContent = '\u5f85\u66f4\u65b0';\n        currentStatus.className = 'version-status status-outdated';\n        versionIndicator.className = 'version-indicator update-needed';\n        versionIndicator.innerHTML = '<i class=\"fas fa-arrow-right\"><\/i>';\n\n        \/\/ \u4f7f\u7528\u7edf\u4e00\u914d\u7f6e\u751f\u6210\u4e0b\u8f7d\u6309\u94ae\n        buttonGroup.innerHTML = Object.values(serverConfig).map(server => {\n          const fullUrl = server.baseUrl + server.downloadPath;\n          return \\`\n            <a href=\"yuedu:\/\/booksource\/importonline?src=\\${encodeURIComponent(fullUrl)}\" class=\"button\">\n              <i class=\"fas fa-\\${server.icon}\"><\/i>\n              <span>\\${server.name}<\/span>\n            <\/a>\n          \\`;\n        }).join('');\n        buttonGroup.style.display = 'flex';\n      } else {\n        \/\/ \u5df2\u662f\u6700\u65b0\u7248\u672c\n        currentStatus.textContent = '\u6700\u65b0';\n        currentStatus.className = 'version-status status-latest';\n        versionIndicator.className = 'version-indicator is-latest';\n        versionIndicator.innerHTML = '<i class=\"fas fa-check\"><\/i>';\n        \n        statusAlert.className = 'status-alert up-to-date';\n        statusAlert.innerHTML = '<i class=\"fas fa-check-circle\"><\/i> <div>\u60a8\u5df2\u662f\u6700\u65b0\u7248\u672c<\/div>';\n        statusAlert.style.display = 'flex';\n      }\n\n      \/\/ \u663e\u793a\u4e3b\u5bb9\u5668\uff0c\u9690\u85cf\u52a0\u8f7d\n      loading.style.display = 'none';\n      container.style.display = 'block';\n\n    } catch (err) {\n      console.error('\u7248\u672c\u68c0\u67e5\u5931\u8d25\uff1a', err);\n      showError('<i class=\"fas fa-exclamation-circle\"><\/i> \u68c0\u67e5\u66f4\u65b0\u5931\u8d25\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5<br><small>' + err.message + '<\/small>');\n    }\n  })();\n  <\/script>\n<\/body>\n<\/html>\n`;\n    java.startBrowser(`data:text\/html;base64,${java.base64Encode(html)}`, '\u6674\u5929\u4e66\u6e90\u66f4\u65b0');\n}","respondTime":180000,"ruleBookInfo":{"author":"$.author","canReName":"1","coverUrl":"$.thumb_url","init":"<js>\nif (String(baseUrl).startsWith(\"data:\")) {\n    let res = JSON.parse(java.hexDecodeToString(result));\n    let book_id = res.book_id;\n    let tab = res.tab;\n    let sources = res.sources;\n    let url = res.url;\n    let html = \"\";\n    let proxy = getArguments(source.getVariable(), \"proxy\");\n    if (url != \"\" && proxy == \"\u672c\u5730\") {\n        if (sources == '69\u4e66\u5427') {\n            let ck69 = String(cookie.getCookie('https:\/\/www.69shuba.com'));\n            let headers = {\n        \t \"Referer\": url,\n            \"Cookie\": ck69,\n            \"User-Agent\":  java.getWebViewUA()\n             };            \n             let op = JSON.stringify({\n                \"headers\": headers\n            });\n            html = java.ajax(`${url},${op}`);\n        } else {\n            html = java.ajax(url);\n        }\n        \/\/java.log(html);\n        if (html.includes(\"Just a moment...\") && sources == '69\u4e66\u5427') {\n            cookie.removeCookie('https:\/\/www.69shuba.com');\n            java.longToast('\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1');\n            html = java.startBrowserAwait(url, \"\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1\").body();\n\n             java.log(html);\n        }\n    }\n    let base_url = getArguments(source.getVariable(), \"server\");\n    let op = {\n        method: \"POST\",\n        body: {\n            html: html\n        }\n    };\n    op = JSON.stringify(op);\n    let varia = String(book.getVariable('custom'));\n    if (varia == 'null') {\n        varia = '';\n    }\n    varia = JSON.stringify({\n        'custom': varia\n    });\n    \/\/varia = java.base64Encode(varia);\n    java.log(`${base_url}\/detail?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\n    result = java.ajax(`${base_url}\/detail?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\n}\nresult\n<\/js>$.data","intro":"<js>\nlet {\n    book_id,\n    source: sources,\n    tab,\n    book_tts,\n    tags,\n    role,\n    last_chapter_title,\n    last_chapter_update_time,\n    word_number,\n    status,\n    score,\n    abstract,\n    copyright_info\n} = result;\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (proxy == \"\u672c\u5730\") {\n    proxy = \"\u672c\u5730\u7f51\u7edc\";\n} else {\n    proxy = \"\u670d\u52a1\u5668\u7f51\u7edc\";\n}\njava.put(\"book_detail\", JSON.stringify(result));\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet key = \"\";\ntry {\n    let cookieValue =\n        String(cookie.getCookie(base_url)) || String(java.getCookie(base_url));\n    key = getKey(cookieValue);\n} catch (e) {\n    key = \"\";\n}\n\nif (key == \"\") {\n    java.log(\"\u5f53\u524d\u670d\u52a1\u5668\u672a\u67e5\u8be2\u5230\u767b\u5f55\u72b6\u6001\uff0c\u5c1d\u8bd5\u67e5\u8be2\u5176\u4ed6\u670d\u52a1\u5668\u767b\u5f55\u72b6\u6001...\");\n    let cookieValue;\n    for (let h of host) {\n        try {\n            cookieValue = String(cookie.getCookie(h)) || String(java.getCookie(h));\n            key = getKey(cookieValue);\n        } catch (e) {\n            key = \"\";\n        }\n        if (key) {\n            java.log(`\u5df2\u5728${h}\u767b\u5f55\uff0c\u9000\u51fa\u67e5\u8be2\uff0c\u6b63\u5728\u8f6c\u79fb\u767b\u5f55\u72b6\u6001\u5230\u5f53\u524d\u670d\u52a1${base_url}`);\n            \/\/java.log(cookieValue)\n            removeCookie(h);\n            removeCookie(base_url);\n            cookie.setCookie(base_url, cookieValue);\n            break;\n        }\n    }\n}\n\nif (book.readConfig == null || book.readConfig.useReplaceRule == null) {\n    book.setUseReplaceRule(false);\n}\n\nlet nickname = '\u8d26\u53f7\u72b6\u6001\uff1a\u26a0\ufe0f \u672a\u767b\u5f55 | \u70b9\u51fb\u53f3\u4e0a\u89d2 \ud83d\udd16 \u767b\u5f55';\ntry {\n    let opcx = {\n        method: \"GET\",\n        headers: {\n            cookie: 'qttoken=' + key + ';'\n        },\n    };\n    opcx = JSON.stringify(opcx);\n    let user_info = JSON.parse(java.ajax(base_url + '\/get_avatar,' + opcx));\n    if (user_info.code == 0) {\n        if (user_info.nickname) {\n            nickname = '\u6b22\u8fce\u56de\u6765\uff1a' + user_info.nickname\n        } else {\n            nickname = '\u6b22\u8fce\u56de\u6765\uff1a' + user_info.email + \"(\u8bf7\u524d\u5f80\u7528\u6237\u540e\u53f0\u8bbe\u7f6e\u7528\u6237\u540d)\"\n        }\n    }\n} catch (e) {\n    if (key) {\n        nickname = '\u8d26\u53f7\u72b6\u6001\uff1a\u5df2\u767b\u5f55'\n    }\n};\n\nlet loginStatus = nickname;\n\nlet lightDivider = \"\u2747\ufe0f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2747\ufe0f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2747\ufe0f\";\nlet heavyDivider = \"&lrm;\\n&lrm;\";\n\nlet isValid = (value) => String(value).length > 1;\nlet ctitle = book.durChapterTitle || '\u672a\u5f00\u59cb';\nlet info = `\n    \ud83d\udce1 \u5f53\u524d\u670d\u52a1\uff1a${base_url}\n    \ud83d\udd11 ${loginStatus}\n    \ud83c\udff7 \u6570\u636e\u6765\u6e90\uff1a${sources}\n    \ud83d\udd04 \u5f53\u524d\u6a21\u5f0f\uff1a${tab}\n    \u2699\ufe0f \u8bbf\u95ee\u6a21\u5f0f\uff1a${proxy}\n    \ud83d\udcd6 \u9605\u8bfb\u81f3\uff1a${ctitle}\n`;\n\nif (tab == \"\u542c\u4e66\") {\n    \/\/let toneId = getArguments(source.getVariable(), \"tone_id\");\n    let toneId = String(book.getVariable('custom'));\n    if (toneId == '') {\n    \ttoneId= '4';\n    \t}\n    if (isValid(book_tts)) {\n        info += `${lightDivider}\n    \ud83c\udfb5 \u97f3\u8272\u914d\u7f6e\uff1a${toneId}\n    \u2728 AI\u97f3\u8272\u8bf7\u70b9\u51fb\u53f3\u4e0a\u89d2\u4e66\u7c4d\u53d8\u91cf\u586b\u5199\u76f8\u5173\u503c\uff0c\u771f\u4eba\u542c\u4e66\u8bf7\u91cd\u65b0\u641c\u7d22\u9009\u62e9\u5e26\u6709\u4e3b\u64ad\u7684\u4e66\u7c4d\n    ${book_tts}\n`;\n    }\n}\n\nlet basicInfo = \"\";\nlet addBasicInfo = (value, prefix, icon) => {\n    if (isValid(value)) basicInfo += `    ${icon} ${prefix} ${value}\\n`;\n};\n\naddBasicInfo(tags, \"\u4e66\u7c4d\u5206\u7c7b\uff1a\", \"\ud83c\udf08\");\naddBasicInfo(role, \"\u4e66\u7c4d\u4e3b\u89d2\uff1a\", \"\ud83d\udc51\");\naddBasicInfo(last_chapter_title, \"\u6700\u65b0\u7ae0\u8282\uff1a\", \"\ud83d\udcda\");\naddBasicInfo(last_chapter_update_time, \"\u66f4\u65b0\u65f6\u95f4\uff1a\", \"\u23f3\");\naddBasicInfo(word_number, \"\u4e66\u7c4d\u5b57\u6570\uff1a\", \"\ud83d\udcca\");\naddBasicInfo(status, \"\u4e66\u7c4d\u72b6\u6001\uff1a\", \"\ud83d\udea9\");\naddBasicInfo(score, \"\u4e66\u7c4d\u8bc4\u5206\uff1a\", \"\u2b50\");\n\nif (basicInfo) info += `${lightDivider}\\n${basicInfo}`;\n\nif (isValid(abstract)) {\n    let indentedAbstract = abstract\n        .split(\"\\n\")\n        .map((line) => `    ${line}`)\n        .join(\"\\n\");\n    info += `${heavyDivider}\n    \ud83d\udcd6 \u4e66\u7c4d\u7b80\u4ecb\uff1a\n${indentedAbstract}\n`;\n} else {\n    info += `${heavyDivider}`;\n}\n\nif (isValid(copyright_info)) {\n    info += `${lightDivider}\n    \u00a9 ${copyright_info}\n`;\n} else {\n    info += `${lightDivider}`;\n}\n\ninfo += `\n${heavyDivider}\n    \ud83d\udca0\ud83d\udca0\ud83d\udca0 \u6570\u636e\u66f4\u65b0\u4e8e ${new Date().toLocaleString()} \ud83d\udca0\ud83d\udca0\ud83d\udca0\n`;\nlet jjinfo = getArguments(source.getVariable(), \"info\");\n\nif (jjinfo != \"off\") {\n    info = String(info)\n        .split(\"\\n\")\n        .map((line) => line.replace(\/^ {4}\/, \"\"))\n        .join(\"\\n\");\n} else {\n    basicInfo = \"\";\n    addBasicInfo(last_chapter_title, \"\u6700\u65b0\u7ae0\u8282\uff1a\", \"\ud83d\udcda\");\n    addBasicInfo(last_chapter_update_time, \"\u66f4\u65b0\u65f6\u95f4\uff1a\", \"\u23f3\");\n    addBasicInfo(word_number, \"\u4e66\u7c4d\u5b57\u6570\uff1a\", \"\ud83d\udcca\");\n    addBasicInfo(status, \"\u4e66\u7c4d\u72b6\u6001\uff1a\", \"\ud83d\udea9\");\n    addBasicInfo(score, \"\u4e66\u7c4d\u8bc4\u5206\uff1a\", \"\u2b50\");\n    if (isValid(abstract)) {\n        let indentedAbstract = abstract\n            .split(\"\\n\")\n            .map((line) => `    ${line}`)\n            .join(\"\\n\");\n        basicInfo += `\n    \\n&lrm;\n    \ud83d\udcd6 \u4e66\u7c4d\u7b80\u4ecb\uff1a\n${indentedAbstract}\n`;\n    } else {\n        basicInfo += `${heavyDivider}`;\n    }\n    info = `&lrm;\\n\ud83c\udff7 \u6570\u636e\u6765\u6e90\uff1a${sources}\\n` + basicInfo;\n}\n<\/js>","lastChapter":"{{$.source}} {{$.last_chapter_title}} {{$.last_chapter_update_time}}","name":"$.book_name","tocUrl":"<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || \"\u5c0f\u8bf4\";\nlet url = result.toc_url || \"\";\nvar sdtoken;\ntry {\n    var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n    sdtoken = String(loginInfoMap['\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)'] || '');\n} catch (e) {\n    sdtoken = '';\n}\nvar rawCookie = getFanqieCookie() || sdtoken;\nvar match = rawCookie.match(\/sessionid=[^;]+\/);\nvar fqcookie = match ? match[0] : '';\nvar fqssionid = '';\nif (fqcookie) {\n    fqssionid = getSessionId(fqcookie);\n};\nsetArguments('fqssionid', fqssionid);\njava.put(\"tab\", tab);\njava.put(\"book_id\", book_id);\nlet qtcatalog = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url,\n};\nqtcatalog = java.base64Encode(JSON.stringify(qtcatalog));\n`data:;base64,${qtcatalog},{\"type\":\"qingtian2\"}`;\n<\/js>","wordCount":"$.word_number"},"ruleContent":{"content":"<js>\njava.log(result)\nresult = String(java.hexDecodeToString(result));\nlet res;\nif (result.match(\/\u6674\u5929\u878d\u5408\/)) {\n    result = result.split(\"\u6674\u5929\u878d\u54084\");\n    res = {\n        item_id: result[0],\n        tab: result[1],\n        title: result[2],\n        sources: result[3],\n        url: \"\"\n    };\n} else {\n    res = JSON.parse(result);\n}\nlet varia = String(book.getVariable('custom'));\nif (varia == 'null') {\n    varia = '';\n}\nvaria = JSON.stringify({\n    'custom': varia\n});\n\/\/  varia = java.base64Encode(varia);\nlet book_id = res.book_id;\nlet item_id = res.item_id;\nlet tab = res.tab;\nlet title = res.title;\nlet sources = res.sources;\nlet url = res.url;\nlet html = \"\";\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (url != \"\" && proxy == \"\u672c\u5730\") {\n    if (sources == '69\u4e66\u5427') {\n        let ck69 = String(cookie.getCookie('https:\/\/www.69shuba.com'));\n        let headers = {\n            \"Referer\": url,\n            \"Cookie\": ck69,\n            \"User-Agent\": java.getWebViewUA()\n        };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        java.log(url);\n        java.log(op);\n        html = java.ajax(`${url},${op}`);\n    } else {\n        html = java.ajax(url);\n    }\n    java.log('dddddddddddddddddddddddddddd')\n    java.log(html);\n    if (html.includes(\"Just a moment...\") && sources == '69\u4e66\u5427' && book.durChapterIndex === chapter.index) {\n        cookie.removeCookie('https:\/\/www.69shuba.com');\n        java.longToast('\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1');\n        html = java.startBrowserAwait(url, \"\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1\").body();\n        java.log('cscscscs')\n        java.log(html);\n    }\n};\nlet content = \"\";\nlet data;\n\/\/let tone_id = getArguments(source.getVariable(), \"tone_id\");\nlet tone_id = varia;\nif (tone_id == '') {\n    tone_id = '4';\n}\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet fqpara = getArguments(source.getVariable(), \"fqpara\");\nlet device, device_type;\ntry {\n    device = java.deviceID();\n    device_type = \"\u82f9\u679c\";\n} catch (e) {\n    try {\n        device = java.androidId();\n        device_type = \"\u5b89\u5353\";\n    } catch (e) {\n        device = \"\";\n        device_type = \"\u5b89\u5353\";\n    }\n}\n\nlet qtcookie = cookie.getCookie(base_url);\ntry {\n    qtcookie = `qttoken=${String(cookie.getKey(base_url, \"qttoken\"))}; deviceId=${device};`\n} catch (e) {}\n\nvar params = {\n    html: html,\n    item_id: item_id,\n    source: sources,\n    tab: tab,\n    tone_id: tone_id,\n    variable: varia,\n    version: '4.11.5.1'\n};\n\nvar content_url = '\/content';\nif ((sources == \"\u756a\u8304\" || sources == \"\u4e03\u732b\" || sources == \"\u5854\u8bfb\") && fqpara && tab == \"\u5c0f\u8bf4\") {\n    content_url = '\/content?review=1';\n}\n\n\/\/var signInfo = generateComplexSignature('POST', content_url, {}, APP_SECRET, params);\n\n\n\/\/var signedParams = copyObject(params);\n\/\/signedParams.timestamp = signInfo.timestamp;\n\/\/signedParams.nonce = signInfo.nonce;\n\/\/signedParams.sign = signInfo.sign;\n\n\nvar op = {\n    method: \"POST\",\n    body: JSON.stringify(params),\n    headers: {\n        cookie: qtcookie,\n        'Content-Type': 'application\/json'\n    }\n};\n\nop = JSON.stringify(op);\njava.log(op);\ndata = java.ajax(base_url + content_url + `,${op}`);\ntry {\n    data = JSON.parse(data);\n    if (data.msg) {\n        java.toast(data.msg);\n    }\n} catch (e) {}\ncontent = data.content\nif ((sources == \"\u756a\u8304\" || sources == \"\u4e03\u732b\" || sources == \"\u5854\u8bfb\") && fqpara == \"on\" && tab == \"\u5c0f\u8bf4\") {\n    var sdtoken;\n    try {\n        var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n        sdtoken = String(loginInfoMap['\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)'] || '');\n    } catch (e) {\n        sdtoken = '';\n    }\n    var rawCookie = getFanqieCookie() || sdtoken;\n    var match = rawCookie.match(\/sessionid=[^;]+\/);\n    var fqcookie = match ? match[0] : '';\n    var fqssionid = '';\n    if (!fqcookie) {} else {\n        fqssionid = getSessionId(fqcookie)\n    }\n    content = content\n        .replace(\/ident=\"\/g, 'ident=\"' + base_url)\n        .replace(\/book_id=\/g, 'book_id=' + book_id + '&ssionid=' + fqssionid);\n    if (device_type == \"\u82f9\u679c\") {\n        content = paraForiOS(content, sources);\n    } else {\n        content = paraForAndroid(content, sources);\n    }\n}\ndata = JSON.stringify({\n    content: content,\n});\nif (device_type == \"\u5b89\u5353\" && (tab == \"\u77ed\u5267\" || tab == \"\u89c6\u9891\" || sources == '\u6bd2\u820c\u5f71\u89c6')) {\n    data = {\n        content: `\u3010\u53f3\u4e0a\u89d2\u5237\u65b0\u3011\u5f00\u542f\u64ad\u653e(\u4e0b\u4e00\u96c6\u8bf7\u5207\u6362\u4e0b\u4e00\u7ae0\u5237\u65b0)\\n\u64ad\u653e\u76f4\u94fe\uff1a\\n${content}`,\n    };\n    data = JSON.stringify(data);\n    if (book.durChapterIndex === chapter.index) {\n        let video_url = `${base_url}\/online_video?book_id=${book_id}&source=${sources}&tab=${tab}`;\n        if (sources == '\u6bd2\u820c\u5f71\u89c6') {\n            video_url = content;\n        };\n        java.startBrowser(video_url, title);\n        java.toast(\"\u6b63\u5728\u52a0\u8f7d\u89c6\u9891...\");\n    }\n\n}\ndata;\n<\/js>$.content","imageStyle":"TEXT"},"ruleExplore":{"author":"$.author","bookList":"$.data","bookUrl":"<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || '\u5c0f\u8bf4';\nlet url = result.toc_url || '';\n\nlet qtdetail = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url\n}\nqtdetail = java.base64Encode(JSON.stringify(qtdetail));\n`data:;base64,${qtdetail},{\"type\":\"qingtian\"}`\n<\/js>","coverUrl":"$.thumb_url","intro":"$.abstract","kind":"{{$.category}}\n{{$.score}}\n{{$.status}}\n{{$.source}}\n{{$.tags}}","lastChapter":"{{$.last_chapter_title}} \u2022 {{$.last_update_time}}","name":"$.book_name","wordCount":"$.word_number"},"ruleSearch":{"author":"$.author","bookList":"$.data","bookUrl":"<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || '\u5c0f\u8bf4';\nlet url = result.toc_url || '';\n\nlet qtdetail = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url\n}\nqtdetail = java.base64Encode(JSON.stringify(qtdetail));\n`data:;base64,${qtdetail},{\"type\":\"qingtian\"}`\n<\/js>","checkKeyWord":"\u6211\u768426\u5c81\u5973\u623f\u5ba2@\u756a\u8304","coverUrl":"$.thumb_url","intro":"$.abstract","kind":"{{$.status}},{{$.score}},{{$.tags}},{{$.last_chapter_update_time}}","lastChapter":"{{$.source}} {{$.last_chapter_title}}","name":"$.book_name##\uff08\u522b\u540d\uff1a.*?\uff09","wordCount":"$.word_number"},"ruleToc":{"chapterList":"<js>\nlet res = JSON.parse(java.hexDecodeToString(result));\nif (res.method) {\n    res = Object.fromEntries(\n        res.body\n        .replace(\"source\", \"sources\")\n        .split(\"&\")\n        .map((query) => query.split(\"=\"))\n    );\n    res.url = \"\";\n}\nlet book_id = res.book_id;\njava.put('book_id', book_id);\nlet tab = res.tab;\nlet sources = res.sources;\nlet url = res.url;\nlet html = \"\";\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (url != \"\" && proxy == \"\u672c\u5730\") {\n    if (sources == '69\u4e66\u5427') {\n        let ck69 = String(cookie.getCookie('https:\/\/www.69shuba.com'));\n        let headers = {\n        \t \"Referer\": url,\n            \"Cookie\": ck69,\n            \"User-Agent\":  java.getWebViewUA()\n             };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        html = java.ajax(`${url},${op}`);    \n    } else {\n        html = java.ajax(url);\n    }\n    \/\/java.log(html);\n    if (html.includes(\"Just a moment...\") && sources == '69\u4e66\u5427') {\n        cookie.removeCookie('https:\/\/www.69shuba.com');\n        java.longToast('\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1');\n        html = java.startBrowserAwait(url, \"\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1\").body();\n\n           java.log(html);\n    }\n};\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet op = {\n    method: \"POST\",\n    body: {\n        html: html\n    }\n};\nop = JSON.stringify(op);\nlet varia = String(book.getVariable('custom'));\nif (varia == 'null') {\n    varia = '';\n}\nvaria = JSON.stringify({\n    'custom': varia\n});\n\/\/ varia = java.base64Encode(varia);\n\/\/java.log(`${base_url}\/catalog?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\nlet data = java.ajax(\n    `${base_url}\/catalog?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`\n);\nlet device, device_type;\ntry {\n    device = java.deviceID();\n    device_type = \"\u82f9\u679c\";\n} catch (e) {\n    try {\n        device = java.androidId();\n        device_type = \"\u5b89\u5353\";\n    } catch (e) {\n        device = \"\";\n        device_type = \"\u5b89\u5353\";\n    }\n}\n\nif (tab == \"\u5c0f\u8bf4\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 8;\n    } else {\n        book.type = 0;\n    }\n} else if (tab == \"\u542c\u4e66\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 32;\n    } else {\n        book.type = 1;\n    }\n} else if (tab == \"\u6f2b\u753b\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 64;\n    } else {\n        book.type = 2;\n    }\n} else if (tab == \"\u77ed\u5267\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 8;\n    } else {\n        book.type = 3;\n    }\n} else {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 8;\n    } else {\n        book.type = 0;\n    }\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet reading = getArguments(source.getVariable(), \"reading\");\n\nif (book && book.order != 0 && reading == '1') {\n    try {\n        if (!data || !book.variable || !base_url || !qtcookie) {\n            java.log('\u7f3a\u5c11\u5fc5\u8981\u53c2\u6570');\n        } else {\n            let parsedData;\n            try {\n                parsedData = JSON.parse(data);\n            } catch (e) {\n                java.log('\u89e3\u6790data\u6570\u636e\u5931\u8d25:' + e);\n            }\n            \n            if (parsedData && parsedData.data && Array.isArray(parsedData.data) && parsedData.data[book.durChapterIndex]) {\n                let ritem = parsedData.data[book.durChapterIndex];\n                let bookInfoObj;\n                try {\n                    bookInfoObj = JSON.parse(book.variable);\n                } catch (e) {\n                    java.log('\u89e3\u6790book.variable\u5931\u8d25:' + e);\n                }\n                \n                if (bookInfoObj) {\n                    let book_info;\n                    try {\n                        book_info = JSON.parse(bookInfoObj.book_detail || JSON.stringify(bookInfoObj));\n                    } catch (e) {\n                        java.log('\u89e3\u6790book_detail\u5931\u8d25:' + e);\n                    }\n                    \n                    if (book_info && typeof book_info === 'object') {\n                        let rurl = base_url + '\/add_book_to_book_shelf,';\n                        book_info['read_status'] = 1;\n                        book_info['last_chapter_item_id'] = ritem.item_id || '';\n                        book_info['last_chapter_title'] = ritem.title || '';\n                        let rop = {\n                            method: \"POST\",\n                            headers: {\n                                cookie: qtcookie\n                            },\n                            body: book_info\n                        };\n                        let check_book_url = base_url + '\/check_book_in_book_shelf,';\n                        let checkResponse;\n                        \n                        try {\n                            checkResponse = java.ajax(check_book_url + JSON.stringify(rop));\n                        } catch (e) {\n                            java.log('\u68c0\u67e5\u4e66\u7c4d\u8bf7\u6c42\u5931\u8d25:' + e);\n                        }\n                        \n                        if (checkResponse) {\n                            let check_data;\n                            try {\n                                check_data = JSON.parse(checkResponse).data;\n                            } catch (e) {\n                                java.log('\u89e3\u6790\u68c0\u67e5\u54cd\u5e94\u5931\u8d25:' + e);\n                            }\n                            try {\n                                if (check_data && check_data.id) {\n                                    book_info['id'] = check_data.id;\n                                    let uurl = base_url + '\/update_book_shelf,';\n                                    java.ajax(uurl + JSON.stringify(rop));\n                                } else {\n                                    java.ajax(rurl + JSON.stringify(rop));\n                                }\n                            } catch (e) {\n                                java.log('\u4e66\u67b6\u64cd\u4f5c\u5931\u8d25:' + e);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    } catch (error) {\n        java.log('\u4e66\u7c4d\u540c\u6b65\u6d41\u7a0b\u5f02\u5e38:' + error);\n        java.longToast('\\n\u540c\u6b65\u9605\u8bfb\u8fdb\u5ea6\u5931\u8d25\uff0c\u4f46\u4e0d\u5f71\u54cd\u9605\u8bfb\uff0c\u53ef\u4ee5\u524d\u5f80\u767b\u5f55\u5173\u95ed\u4e66\u67b6\u540c\u6b65\u529f\u80fd\u3002');\n    }\n}\ndata;\n<\/js>$.data","chapterName":"$.title","chapterUrl":"<js>\nlet tab = result.tab;\nlet sources = result.source;\nlet title = result.title;\nlet item_id = result.item_id;\nlet book_id = java.get(\"book_id\");\nlet url = result.toc_url || \"\";\nlet qtcontent = {\n    book_id: book_id,\n    item_id: item_id,\n    title: title,\n    sources: sources,\n    tab: tab,\n    url: url,\n};\nqtcontent = java.base64Encode(JSON.stringify(qtcontent));\nif (sources == '\u5377') {\n    content_url = item_id\n} else if ((sources == \"\u756a\u8304\" || sources == \"\u4e03\u732b\" || sources == \"\u5854\u8bfb\") && tab == \"\u5c0f\u8bf4\") {\n    var base_url = getArguments(source.getVariable(), \"server\") || \"\";\n    var sdtoken;\n    try {\n        var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n        sdtoken = String(loginInfoMap['\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)'] || '');\n    } catch (e) {\n        sdtoken = '';\n    }\n    var rawCookie = getFanqieCookie() || sdtoken;\n    var match = rawCookie.match(\/sessionid=[^;]+\/);\n    var fqcookie = match ? match[0] : '';\n    var fqssionid = '';\n    if (!fqcookie) {} else {\n        fqssionid = getSessionId(fqcookie)\n    }\n    let sourcess = sources.replace('svip_', '');\n    content_url = `data:;base64,${qtcontent},{\"type\":\"qingtian3\",\"js\":\"book ? result : '${base_url}\/get_review?book_id=${book_id}&item_id=${item_id}&ssionid=${fqssionid}&source=${sourcess}'\"}`;\n} else {\n    content_url = `data:;base64,${qtcontent},{\"type\":\"qingtian3\"}`;\n}\n<\/js>","updateTime":"$.first_pass_time"},"searchUrl":"<js>\nlet base_url = getArguments(source.getVariable(), 'server');\nlet media;\nlet sources = getArguments(source.getVariable(), 'sources') || getArguments(source.getVariable(), 'source');\nlet disabled_sources = getArguments(source.getVariable(), 'disabled_sources') || '0';\nif (String(key).startsWith(\"m:\") || String(key).startsWith(\"m\uff1a\")) {\n    media = \"\u6f2b\u753b\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"t:\") || String(key).startsWith(\"t\uff1a\")) {\n    media = \"\u542c\u4e66\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"d:\") || String(key).startsWith(\"d\uff1a\")) {\n    media = \"\u77ed\u5267\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"x:\") || String(key).startsWith(\"x\uff1a\")) {\n    media = \"\u5c0f\u8bf4\"\n    key = key.slice(2)\n} else {\n    media = getArguments(source.getVariable(), 'tab') || getArguments(source.getVariable(), 'media');\n}\nif (key.includes('@')) {\n    var parts = key.split('@');\n    key = parts[0];\n    sources = parts[1] || sources;\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet op = {\n    method: \"GET\",\n    headers: {\n        cookie: qtcookie\n    },\n};\nop = JSON.stringify(op);\n`${base_url}\/search?title=${key}&tab=${media}&source=${sources}&page={{page}}&disabled_sources=${disabled_sources},${op}`\n<\/js>","weight":0},{"bookSourceComment":"\u53ea\u652f\u6301\u65b0\u5305\u540d\u7248(\u4f53\u79ef19MB)\uff0c\u6216\u8005Sigma\u7248\n\n\u641c\u7d22\u652f\u6301\u591a\u5173\u952e\u5b57\uff0c\u7528\u7a7a\u683c\u9694\u5f00\n\n\u90e8\u5206\u7ebf\u8def\u65e0\u6cd5\u64ad\u653e\uff0c\u66f4\u6362\u7ebf\u8def\n\n\u5907\u7528\u5730\u5740\uff1ahttp:\/\/www.yoozb.live","bookSourceGroup":"\u76f4\u64ad","bookSourceName":"\u65e0\u63d2\u4ef6 - \u8d5b\u4e8b\u76f4\u64ad","bookSourceType":4,"bookSourceUrl":"http:\/\/www.wuchajian.xyz","customButton":false,"customOrder":1,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"eventListener":false,"exploreUrl":"@js:\nconst list = []\nconst push = (title, url, size) => list.push({\n  title,\n  url,\n  style: {layout_flexBasisPercent: size}\n});\n\nconst url = source.key + \"\/m.html\";\nlet time = +String(java.get(\"wuchajian_time\"))\nlet html = String(java.get(\"wuchajian\"));\n\nif(!html || Date.now() - time > 3.6e6){\n  html = java.ajax(url);\n  java.put(\"wuchajian\", html);\n  java.put(\"wuchajian_time\", Date.now());\n}\n\npush(\"\u5168\u90e8\u8d5b\u4e8b\", url, 0.29);\n\nconst doc = org.jsoup.Jsoup.parse(html);\nconst leagues = new Set();\n\ndoc.select(\"[data-role=content] .league\")\n.forEach(el => leagues.add(String(el.text())));\n\nleagues.forEach(lg =>\n  push(lg, `${url}#${encodeURI(lg)}`, 0.29)\n)\n\nJSON.stringify(list)","header":"{\"User-Agent\":\"Mozilla\/5.0 (iPhone; CPU iPhone OS 17_2_1 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/17.2 Mobile\/15E148 Safari\/604.1\"}","jsLib":"function hitRateFilter(arr, keyWords = '', exactLeague = false) {\n  if (!Array.isArray(arr)) return [];\n  const words = keyWords\n    .trim()\n    .split(\/\\s+\/)\n    .filter(Boolean);\n \n  if (!words.length) return arr.slice();\n\n  const regs = words.map(w => new RegExp(w.replace(\/[.*+?^${}()|[\\]\\\\]\/g, '\\\\$&'), 'i'));\n\n  const extract = obj =>\n    Object.values(obj)\n      .map(String)\n      .join(' ');\n\n  const scored = [];\n  \n  for (let item of arr) {\n  \t if (exactLeague) {\n      let league = String(item.league || '');\n      let hit = words.some(w => w == league);\n      if (!hit) continue;\n    }\n    let hits = regs.reduce((n, r) => n + r.test(extract(item)), 0);\n    if (hits) scored.push({ item, rate: hits \/ words.length });\n  }\n  \n  scored.sort((a, b) => b.rate - a.rate);\n  \n  return scored.map(x => x.item);\n}\n\n","lastUpdateTime":"1768214087015","loginUi":"[\n  {\n    \"name\": \"\u6e05\u7a7a\u53d1\u73b0\u7f13\u5b58\",\n    \"type\": \"button\",\n    \"action\": \"clear()\"\n  }\n]","loginUrl":"function login(){}\n\nfunction clear(){\n\t java.put(\"wuchajian\", \"\")\n\t source.refreshExplore()\n}","respondTime":180000,"ruleBookInfo":[],"ruleContent":{"content":"<js>\nif(result){\n  result.replace(\/.*?=\/, \"\")\n}else{\n  java.toast(\"\u6ca1\u6709\u55c5\u63a2\u5230\u8d44\u6e90\")\n} \n<\/js>","sourceRegex":".*(?:index\\.m3u8|jhyun\\.m3u8|playlist\\.m3u8$|\\.m3u8?|\\.mp4|\\.m3u8$).*"},"ruleExplore":[],"ruleSearch":{"bookList":"@js:\nconst isStrict = !baseUrl.endsWith(\"#\");\nconst keys = decodeURI(baseUrl.split(\"#\")?.[1] || \"\");\n\nconst html = result.replace(\/^\\s*(<li>.*?)<li>\\s*$\/gm, \"$1<\/li>\");\n\nconst doc = org.jsoup.Jsoup.parse(html);\nconst resList = [];\n\nlet currDate = \"\";\n\ndoc.select('[role=\"main\"] li').forEach(li => {\n    let divider = li.select('li[data-theme=b]');\n    if (divider.size() > 0) {\n        currDate = divider.text().trim();\n        return;\n    }\n\n    let a = li.select('a').first();\n    if (!a) return;\n    \n    let fullText = String(a.text());\n    let title = fullText.replace(\/^.*\\d{2}:\\d{2}\/, '').trim();\n    let league = li.select('.league').text().trim();\n    let status = li.select('.close').size()  \n                       ? \"\u5df2\u7ed3\u675f\" \n                       : li.select('.live').size()\n                         ? \"\u76f4\u64ad\u4e2d\"  \n                         : '\u672a\u5f00\u8d5b';\n                         \n    let time = fullText.match(\/\\d{2}:\\d{2}\/)?.[0]\n    let datetime = currDate + (time ? ' ' + time : '');\n    let kind = [league, status];\n    \n    let id = a.attr('href');\n    let links = doc.select(id).select(\"a\")\n                    .toArray()\n                    .filter(link=>link.attr(\"href\").startsWith(\"http\"))\n                    .map(String);\n    let json = JSON.stringify(links);\n    let url = `data:;base64,${java.base64Encode(json)},{\"type\":\"\"}`\n    \n    resList.push({\n        title,\n        datetime,\n        league,\n        kind,\n        url\n    });\n});\n\nconst results = hitRateFilter(resList, keys, isStrict);\nif(results.length === 0){\n\t results.push({\n    title: `\u6ca1\u6709\u627e\u5230\u4e0e\u201c${keys}\u201d\u76f8\u5173\u7684\u8d5b\u4e8b`,\n    datetime: \"\u5c3d\u91cf\u7f29\u77ed\u5173\u952e\u5b57\uff0c\u5b57\u8d8a\u591a\uff0c\u8d8a\u641c\u4e0d\u5230\"\n  })\n}\nresults","bookUrl":"url","checkKeyWord":"CBA","intro":"datetime","kind":"kind","name":"title"},"ruleToc":{"chapterList":"@js:\nJSON.parse(java.hexDecodeToString(result))","chapterName":"text","chapterUrl":"a@href##$##,{\"webView\": true}"},"searchUrl":"\/m.html#{{encodeURI(key)}}#","weight":0},{"bookSourceName":"\u9876\u70b9\u5c0f\u8bf4ddxsmf","bookSourceType":0,"bookSourceUrl":"https:\/\/www.ddxsmf.com","customOrder":1,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"\u7384\u5e7b::\/sort\/1_{{page}}.html\n\u4fee\u771f::\/sort\/2_{{page}}.html\n\u90fd\u5e02::\/sort\/3_{{page}}.html\n\u7a7f\u8d8a::\/sort\/4_{{page}}.html\n\u7f51\u6e38::\/sort\/5_{{page}}.html\n\u79d1\u5e7b::\/sort\/6_{{page}}.html\n\u7075\u5f02::\/sort\/7_{{page}}.html\n\u5176\u4ed6::\/sort\/8_{{page}}.html\n\u6392\u884c\u699c::\/paihang.html","lastUpdateTime":"1768296059359","respondTime":180000,"ruleBookInfo":{"author":".booknav2 > p[2]@text","coverUrl":".bookimg2 > img@src","intro":".navtxt > p","name":".booknav2 > h1@text"},"ruleContent":{"content":".txtnav@html","title":"h1@text"},"ruleExplore":{"author":".newnav label[1]@text","bookList":"#article_list_content > li","bookUrl":".newnav > h3 > a@href","coverUrl":".imgbox > img@src","intro":".newnav > .ellipsis_2@text","kind":".newnav label[2]@text","lastChapter":".newnav > .zxzj a@text","name":".newnav > h3 > a@text"},"ruleSearch":{"bookList":"#b_results > li","bookUrl":"h2>a@href","lastChapter":".b_lineclamp2@text","name":"h2>a@text"},"ruleToc":{"chapterList":"ul > ul > .col-3","chapterName":"a>span@text","chapterUrl":"a@href"},"searchUrl":"https:\/\/cn.bing.com\/search?q=site:www.ddxsmf.com%20{{key}}","weight":0},{"bookSourceComment":"\u6d4f\u89c8\u7f51\u7ad9\u65f6\u6252\u4e86\u4e00\u4e0b\uff0c\u8fd9\u4e2a\u7f51\u7ad9\u6709\u70b9\u4effuaa\uff0c\u4f46\u662f\u6211\u6d4f\u89c8\u4e66\u7c4d\u65f6\u6ca1\u6709\u53d1\u73b0\u9700\u8981\u4f1a\u5458\u7684\u7ae0\u8282\uff0c\u53ef\u80fd\u662f\u514d\u8d39\u7684\uff0c\u5c06\u5c31\u7528\u4e00\u4e0b\u3002","bookSourceGroup":"\u81ea\u5236\u6e90\u2460","bookSourceName":"18r\uff08\u514d\u68af\u5b50\uff09","bookSourceType":0,"bookSourceUrl":"https:\/\/jiek.qiubai.icu\/","concurrentRate":"2026","customOrder":0,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"[{\"title\":\"\u9898\u6750\",\"url\":\"\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},\n{\"title\":\"\u5168\u90e8\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&theme=0&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"\u90fd\u5e02\u6fc0\u60c5\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&theme=1&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"\u6821\u56ed\u6625\u8272\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&theme=2&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"\u4e61\u6751\u7231\u60c5\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&theme=3&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"\u7cfb\u7edf\u5f02\u80fd\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&theme=4&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"\u5bb6\u5ead\u4e71\u4f26\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&theme=5&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"\u7a7f\u8d8a\u91cd\u751f\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&theme=6&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"\u7ecf\u5178\u6b66\u4fa0\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&theme=7&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"\u540c\u4eba\u6539\u7f16\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&theme=8&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"\u79d1\u5b66\u5e7b\u60f3\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&theme=9&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"\u4e1c\u65b9\u7384\u5e7b\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&theme=10&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"\u5a31\u4e50\u660e\u661f\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&theme=11&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"\u5386\u53f2\u67b6\u7a7a\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&theme=12&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"\u897f\u65b9\u9b54\u5e7b\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&theme=13&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"\u8d24\u8005\u5c0f\u8bf4\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&theme=14&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"\u5b57\u6570\",\"url\":\"\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},\n{\"title\":\"\u5168\u90e8\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&length=0&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"\u77ed\u7bc7(10\u4e07\u2193)\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&length=1&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"\u4e2d\u7bc7(10-100\u4e07)\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&length=2&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"\u957f\u7bc7(100\u4e07\u2191)\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&length=3&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"\u6807\u7b7e\",\"url\":\"\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},\n{\"title\":\"\u5168\u90e8\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=0&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"1v1\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=1&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"BE\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=2&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"Futa\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=3&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"HE\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=4&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"NP\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=5&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"NTL\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=6&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"NTR\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=7&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"SC\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=8&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"SM\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=9&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u767d\u864e\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=10&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u76f2\u5408\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=11&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u66b4\u8650\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=12&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u53d8\u88c5\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=13&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u75c5\u5a07\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=14&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u4ea7\u5976\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=15&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u75f4\u5973\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=16&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u51fa\u8f68\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=17&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u89e6\u624b\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=18&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u7eaf\u7231\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=19&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u7c97\u53e3\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=20&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u50ac\u7720\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=21&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u803d\u7f8e\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=22&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u9053\u5177\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=23&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u8c03\u6559\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=24&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u53cd\u5dee\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=25&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u7236\u5973\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=26&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u590d\u4ec7\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=27&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u641e\u7b11\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=28&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u516c\u5ab3\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=29&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u72d7\u8840\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=30&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u9aa8\u79d1\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=31&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u5b98\u573a\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=32&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u76d1\u7981\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=33&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u4ea4\u6362\u4f34\u4fa3\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=34&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u59d0\u59b9\u82b1\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=35&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u7ecf\u5178\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=36&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u5267\u60c5\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=37&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u5feb\u7a7f\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=38&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u6346\u7ed1\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=39&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u6269\u5f20\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=40&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u6d6a\u6f2b\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=41&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u604b\u8db3\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=42&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u730e\u8273\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=43&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u7075\u5f02\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=44&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u51cc\u8fb1\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=45&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u9732\u51fa\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=46&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u7eff\u6bcd\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=47&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u841d\u8389\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=48&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u5a9a\u9ed1\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=49&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u672b\u4e16\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=50&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u6bcd\u5973\u82b1\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=51&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u6bcd\u5b50\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=52&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u76ee\u524d\u72af\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=53&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u9006\u63a8\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=54&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u5973\u6027\u89c6\u89d2\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=55&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u8650\u5fc3\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=56&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u8650\u4e3b\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=57&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u7834\u5904\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=58&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u5f3a\u5978\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=59&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u5168\u5bb6\u6876\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=60&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u7fa4\u4ea4\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=61&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u4eba\u59bb\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=62&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u4eba\u517d\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=63&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u4eba\u5996\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=64&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u8089\u4fbf\u5668\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=65&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u795e\u8c6a\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=66&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u9002\u5408\u5973\u751f\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=67&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u624b\u67aa\u6587\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=68&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u53d7\u5b55\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=69&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u719f\u5973\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=70&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u723d\u6587\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=71&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u4e1d\u889c\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=72&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u751c\u6587\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=73&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u5fae\u8089\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=74&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u5fae\u91cd\u53e3\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=75&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u4f2a\u5a18\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=76&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u65e0\u7eff\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=77&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u5c0f\u9a6c\u62c9\u5927\u8f66\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=78&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u6821\u82b1\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=79&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u6027\u5974\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=80&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u6027\u8f6c\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=81&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u836f\u7269\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=82&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u5f02\u56fd\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=83&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u5f02\u4e16\u754c\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=84&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u5f02\u79cd\u65cf\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=85&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u6deb\u5815\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=86&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u6deb\u59bb\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=87&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u9690\u5978\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=88&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u69a8\u7cbe\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=89&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u5236\u670d\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=90&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u79cd\u9a6c\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=91&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u79cd\u7530\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=92&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u91cd\u53e3\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=93&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u8db3\u4ea4\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=94&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u6697\u9ed1\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=95&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u4e0b\u514b\u4e0a\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=96&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u540e\u5bab\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=97&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u597d\u6587\u7b14\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=98&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u7eff\u5974\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=99&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"AI\u8f85\u52a9\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=100&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u6539\u9020\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=101&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u9006NTR\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=102&page={{page}}&p={{source.getConcurrentRate()}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},\n{\"title\":\"\u6709\u7236\",\"url\":\"https:\/\/jiek.qiubai.icu\/server.php?act=explore&tag=103&page={{page}}&p={{source.getConcurrentRate()}}\"}]","header":"{\n  \"User-Agent\": \"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/120.0.0.0 Safari\/537.36\"\n}","lastUpdateTime":"1768397709691","loginCheckJs":"","loginUi":"","loginUrl":"","respondTime":180000,"ruleBookInfo":{"author":"$.author","coverUrl":"$.cover","init":"$.data","intro":"$.intro","kind":"$.kind","lastChapter":"$.lastChapter","name":"$.name","tocUrl":"$.tocUrl","wordCount":"$.wordCount"},"ruleContent":{"content":"$.data.content","nextContentUrl":""},"ruleExplore":[],"ruleSearch":{"author":"author","bookList":"@js:\ntry{\n  var j = JSON.parse(result);\n  if(j.msg) java.longToast(j.msg);\n  j.data;\n}catch(e){\n  java.longToast('\u89e3\u6790\u5931\u8d25');\n  [];\n}","bookUrl":"url","coverUrl":"cover","kind":"kind","name":"name","wordCount":"wordCount"},"ruleToc":{"chapterList":"$.data","chapterName":"$.name","chapterUrl":"$.url"},"searchUrl":"https:\/\/jiek.qiubai.icu\/server.php?act=search&key={{key}}&page={{page}}&limit=100&p={{source.getConcurrentRate()}}","weight":0},{"bookSourceGroup":"\u5c0f\u8bf4","bookSourceName":"\u901f\u8bfb\u8c37","bookSourceType":0,"bookSourceUrl":"https:\/\/www.sudugu.org","bookUrlPattern":"","concurrentRate":"3","customOrder":0,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"[{\"title\":\"\u7384\u5e7b\u5c0f\u8bf4\",\"url\":\"\/xuanhuan\/\"}, {\"title\":\"\u4ed9\u4fa0\u5c0f\u8bf4\",\"url\":\"\/xianxia\/\"}, {\"title\":\"\u90fd\u5e02\u5c0f\u8bf4\",\"url\":\"\/dushi\/\"}, {\"title\":\"\u5386\u53f2\u5c0f\u8bf4\",\"url\":\"\/lishi\/\"}, {\"title\":\"\u519b\u4e8b\u5c0f\u8bf4\",\"url\":\"\/junshi\/\"}, {\"title\":\"\u79d1\u5e7b\u5c0f\u8bf4\",\"url\":\"\/kehuan\/\"}, {\"title\":\"\u8a00\u60c5\u5c0f\u8bf4\",\"url\":\"\/yanqing\/\"}]","header":"{\"User-Agent\": \"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36\"}","lastUpdateTime":"1768584833228","loginCheckJs":"","loginUi":"","loginUrl":"","respondTime":180000,"ruleBookInfo":{"author":"class.itemtxt@tag.p@tag.a@text","coverUrl":"class.item@tag.img@src","downloadUrls":"@put:{id:\"##\/(\\\\d+)\/##1\"}@js:result='https:\/\/www.sudugu.org\/txt\/?id='+result.id+'&p=1'","intro":"class.container@class.des bb@tag.p@text","kind":"class.itemtxt@tag.p.0@tag.span.1@text","lastChapter":"class.itemtxt@tag.li@tag.a@text##\n\u53d1\u9519\u4e86\n\u7b2c4143\u7ae0 \u756a\u59163","name":"tag.h1@tag.a@text## -\u901f\u8bfb\u8c37","tocUrl":"{{baseUrl}}\/#dir","wordCount":"class.itemtxt@tag.h1@tag.i@text"},"ruleContent":{"content":"class.con@html##<div.*?>|<\/div>","nextContentUrl":"@xpath:\/\/div[@class='prenext']\/\/a[contains(text(),'\u4e0b\u4e00\u9875')]\/@href"},"ruleExplore":{"author":"tag.p.1@tag.a@text##\u4f5c\u8005\uff1a","bookList":"class.item","bookUrl":"tag.h3@tag.a@href","coverUrl":"tag.img@src","intro":"","kind":"tag.p.0@tag.span.1@text","lastChapter":"tag.ul@tag.li.0@tag.a@text","name":"tag.h3@tag.a@text","wordCount":""},"ruleSearch":{"author":"tag.p.1@tag.a@text##\u4f5c\u8005\uff1a","bookList":"class.item","bookUrl":"tag.h3@tag.a@href","checkKeyWord":"\u8f6e\u56de\u4e50\u56ed","coverUrl":"tag.img@src","intro":"","kind":"tag.p.0@tag.span.1@text","lastChapter":"tag.ul@tag.li.0@tag.a@text","name":"tag.h3@tag.a@text","wordCount":""},"ruleToc":{"chapterList":"id.list@tag.li","chapterName":"tag.a@text","chapterUrl":"tag.a@href","isVip":"id.pages@tag.a@href","nextTocUrl":"@xpath:\/\/div[@class='pages bb']\/\/a[contains(text(),'\u4e0b\u4e00\u9875')]\/@href"},"searchUrl":"https:\/\/www.sudugu.org\/i\/sor.aspx?key={{key}}","weight":0},{"bookSourceComment":"","bookSourceGroup":"\u8f7b\u5c0f\u8bf4web","bookSourceName":"ncode_syosetu(\u6210\u4e3a\u5c0f\u8bf4\u5bb6\u5427)","bookSourceType":0,"bookSourceUrl":"https:\/\/ncode.syosetu.com\/","bookUrlPattern":"","concurrentRate":"","customOrder":0,"enabled":true,"enabledExplore":true,"exploreUrl":"\u7d2f\u8a08\u30e9\u30f3\u30ad\u30f3\u30b0BEST300::https:\/\/yomou.syosetu.com\/rank\/list\/type\/total_total\/\n\u5e74\u9593\u30e9\u30f3\u30ad\u30f3\u30b0BEST300::https:\/\/yomou.syosetu.com\/rank\/list\/type\/yearly_total\/\n\u56db\u534a\u671f\u30e9\u30f3\u30ad\u30f3\u30b0BEST300::https:\/\/yomou.syosetu.com\/rank\/list\/type\/quarter_total\/\n\u6708\u9593\u30e9\u30f3\u30ad\u30f3\u30b0BEST300::https:\/\/yomou.syosetu.com\/rank\/list\/type\/monthly_total\/\n\u9031\u9593\u30e9\u30f3\u30ad\u30f3\u30b0BEST300::https:\/\/yomou.syosetu.com\/rank\/list\/type\/weekly_total\/\n\u65e5\u9593\u30e9\u30f3\u30ad\u30f3\u30b0BEST300::https:\/\/yomou.syosetu.com\/rank\/list\/type\/daily_total\/","header":"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/92.0.4515.107 Safari\/537.36","lastUpdateTime":"1768603550877","loginCheckJs":"","loginUi":"","loginUrl":"","respondTime":180000,"ruleBookInfo":{"author":"class.p-novel__author@text##\u4f5c\u8005\uff1a","intro":"id.novel_ex@text","lastChapter":"class.p-eplist__sublist.-1@tag.a@text","name":"class.p-novel__title@text"},"ruleContent":{"content":"class.js-novel-text@text||class.p-novel__text@text","nextContentUrl":"class.c-pager__item--next@href"},"ruleExplore":{"author":"class.h_info@text##\u5c0f\u8aac\u60c5\u5831","bookList":"class.ranking_list","bookUrl":"class.tl@href","intro":"class.ex@text","kind":"class.keyword@tag.a@text","name":"class.tl@text","wordCount":"class.marginleft@text"},"ruleSearch":{"author":"tag.a.1@text","bookList":"class.searchkekka_box","bookUrl":"class.tl@href","intro":"tag.td@class.ex@text","kind":"tag.td@a@text","lastChapter":"tag.td:contains(\u6700\u7d42\u66f4\u65b0\u65e5:)","name":"class.tl@text","wordCount":"tag.td@class.marginleft.0@text"},"ruleToc":{"chapterList":"class.p-eplist__sublist","chapterName":"class.p-eplist__subtitle@text","chapterUrl":"class.p-eplist__subtitle@href","nextTocUrl":"class.c-pager__item--next@href","updateTime":"class.p-eplist__update@text"},"searchUrl":"https:\/\/yomou.syosetu.com\/search.php?word={{key}}&p={{page}}","weight":0},{"bookSourceComment":"\u4f5c\u8005\uff1a\u563b\u563b\u4e0d\u516e\u516e\n\u66f4\u6362\u4e86\u6e90\uff0c\u4fee\u590d\u6b63\u6587\u8bf7\u6c42\u5931\u8d25\u7684\u95ee\u9898","bookSourceName":"\u516b\u53c9\u4e66\u5e93","bookSourceType":0,"bookSourceUrl":"https:\/\/bcshuku.com\/","customOrder":-99974,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"header":"\"accept\": \"application\/json, text\/javascript, *\/*; q=0.01\",\n    \"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\",\n    \"cache-control\": \"no-cache\",\n    \"content-type\": \"application\/x-www-form-urlencoded; charset=UTF-8\",\n    \"origin\": \"https:\/\/bcshuku.com\",\n    \"pragma\": \"no-cache\",\n    \"priority\": \"u=1, i\",\n    \"sec-ch-ua\": \"\\\"Microsoft Edge\\\";v=\\\"143\\\", \\\"Chromium\\\";v=\\\"143\\\", \\\"Not A(Brand\\\";v=\\\"24\\\"\",\n    \"sec-ch-ua-mobile\": \"?0\",\n    \"sec-ch-ua-platform\": \"\\\"Windows\\\"\",\n    \"sec-fetch-dest\": \"empty\",\n    \"sec-fetch-mode\": \"cors\",\n    \"sec-fetch-site\": \"same-origin\",\n    \"user-agent\": \"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/143.0.0.0 Safari\/537.36 Edg\/143.0.0.0\",\n    \"x-requested-with\": \"XMLHttpRequest\"\n","jsLib":"","lastUpdateTime":"1768662783276","respondTime":180000,"ruleBookInfo":{"author":"\/\/div[@class=\"info-chitiet\"]\/span\/a[@itemprop=\"author\"]\/text()","coverUrl":"\/\/div[@class=\"book\"]\/img\/@src","intro":"\/\/div[@itemprop=\"description\"]\/text()","kind":"\/\/div[@class=\"info-chitiet\"]\/span\/a[@itemprop=\"genre\"]\/text()","name":"\/\/div[@class=\"col-xs-12 col-sm-8 col-md-8 desc\"]\/h3\/text()","tocUrl":""},"ruleContent":{"content":"@js:\nvar regex = \/\\{\"url\"\\s*:\\s*\"[^\"]+\"\\s*,\\s*\"mobile\"\\s*:\\s*\"\\d\"\\s*,\\s*\"isk\"\\s*:\\s*\"\\d\"\\s*,\\s*\"novel\"\\s*:\\s*\"\\d+\"\\s*,\\s*\"chapter\"\\s*:\\s*\"\\d+\"\\}\/;\nvar match = result.match(regex);\njava.log(\"refer = \");\r\njava.log(baseUrl);\r\n\nif (match) {\n    try {\n        var jsonObj = JSON.parse(match[0]); \n        \/\/ \u62fc\u63a5\u5168\u90e8\u53c2\u6570\uff08\u542b novel\u3001chapter\uff09\n        var params = \"url=\" + encodeURIComponent(jsonObj.url) + \n                     \"&mobile=\" + encodeURIComponent(jsonObj.mobile) + \n                     \"&isk=\" + encodeURIComponent(jsonObj.isk) +\n                     \"&novel=\" + encodeURIComponent(jsonObj.novel) +\n                     \"&chapter=\" + encodeURIComponent(jsonObj.chapter);\n        java.log(params);\n\n        let response = java.post(\"https:\/\/bcshuku.com\/conapi.php\", params, {\n    \"accept\": \"application\/json, text\/javascript, *\/*; q=0.01\",\n    \"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\",\n    \"cache-control\": \"no-cache\",\n    \"content-type\": \"application\/x-www-form-urlencoded; charset=UTF-8\",\n    \"origin\": \"https:\/\/bcshuku.com\",\n    \"pragma\": \"no-cache\",\n    \"priority\": \"u=1, i\",\n    \"referer\": baseUrl,\n    \"sec-ch-ua\": \"\\\"Microsoft Edge\\\";v=\\\"143\\\", \\\"Chromium\\\";v=\\\"143\\\", \\\"Not A(Brand\\\";v=\\\"24\\\"\",\n    \"sec-ch-ua-mobile\": \"?0\",\n    \"sec-ch-ua-platform\": \"\\\"Windows\\\"\",\n    \"sec-fetch-dest\": \"empty\",\n    \"sec-fetch-mode\": \"cors\",\n    \"sec-fetch-site\": \"same-origin\",\n    \"user-agent\": \"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/143.0.0.0 Safari\/537.36 Edg\/143.0.0.0\",\n    \"x-requested-with\": \"XMLHttpRequest\"\n});\n        if (response && response.body()) {\n            var content = JSON.parse(response.body())[\"content\"];\n            java.log(content);\n        } else {\n            java.log(\"\u54cd\u5e94\u4f53\u4e3a\u7a7a\");\n        }\n    } catch (e) {\n        java.log(\"\u8fd0\u884c\u5f02\u5e38: \" + e.message);\n    }\n} else {\n    java.log(\"\u672a\u5339\u914d\u5230\u76ee\u6807 JSON \u5b57\u7b26\u4e32\");\n}\n"},"ruleExplore":[],"ruleReview":[],"ruleSearch":{"bookList":"\/\/div[@class=\"one-row\"]\/div[@class=\"col-md-3 col-sm-6 col-xs-6 home-truyendecu\"]","bookUrl":"\/\/div[@class=\"each_truyen\"]\/a\/@href","coverUrl":"\/\/div[@class=\"each_truyen\"]\/a\/img\/@src","name":"\/\/h3[@itemprop=\"name\"]\/text()"},"ruleToc":{"chapterList":"\/\/div[@id='list-chapter']\/\/ul[@class='list-chapter']\/\/li\/a","chapterName":"\/\/span[@class=\"chapter-text\"]\/text()","chapterUrl":"@js:\nvar doc = org.jsoup.Jsoup.parse(result);\nvar link = doc.select(\"a\").first();\n'https:\/\/bcshuku.com' + link.attr(\"href\");","nextTocUrl":"\/\/div[@id=\"pagination\"]\/\/li[last()-1]\/a\/@href"},"searchUrl":"@js:\nlet new_url = java.get('https:\/\/bcshuku.com\/e\/search\/index.php?keyboard='+key+'&show=title%2Cwriter%2Cbyr&searchget=1',{\n    \"accept\": \"text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\",\n    \"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\",\n    \"cache-control\": \"no-cache\",\n    \"pragma\": \"no-cache\",\n    \"priority\": \"u=0, i\",\n    \"referer\": \"https:\/\/bcshuku.com\",\n    \"sec-ch-ua\": \"\\\"Microsoft Edge\\\";v=\\\"143\\\", \\\"Chromium\\\";v=\\\"143\\\", \\\"Not A(Brand\\\";v=\\\"24\\\"\",\n    \"sec-ch-ua-mobile\": \"?1\",\n    \"sec-ch-ua-platform\": \"\\\"Android\\\"\",\n    \"sec-fetch-dest\": \"document\",\n    \"sec-fetch-mode\": \"navigate\",\n    \"sec-fetch-site\": \"same-origin\",\n    \"sec-fetch-user\": \"?1\",\n    \"upgrade-insecure-requests\": \"1\",\n    \"user-agent\": \"Mozilla\/5.0 (Linux; Android 6.0; Nexus 5 Build\/MRA58N) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/143.0.0.0 Mobile Safari\/537.36 Edg\/143.0.0.0\"\n});\nlet url = 'https:\/\/bcshuku.com\/e\/search\/'+ new_url.header(\"location\");\nurl+'page='+page;","weight":0},{"bookSourceComment":"\u6e90\u4ed3\u5e93@plmplmplm","bookSourceGroup":"\ud83c\udfa8\u6f2b\u753b","bookSourceName":"\ud83c\udfa8 177\u6f2b\u753b\ud83d\udd25","bookSourceType":0,"bookSourceUrl":"http:\/\/www.177pic.info","customButton":false,"customOrder":7832,"enabled":true,"enabledCookieJar":false,"enabledExplore":true,"eventListener":false,"header":"{\n\"User-Agent\": \"Mozilla\/5.0 (Windows NT 10.0; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko, By Black Prism) Chrome\/99.0 Safari\/537.36\",\n\"Referer\": \"http:\/\/www.177pica.com\"\n}\n","lastUpdateTime":"1768665069022","loginUrl":"{\n  \"url\": \"\"\n}","respondTime":180000,"ruleBookInfo":{"intro":"class.entry-title@text","kind":"class.single-cat@tag.a@text"},"ruleContent":{"content":"class.single-content@img@src@js:\n\/\/ \u6e05\u7406\u548c\u5206\u5272\u7ed3\u679c\nvar lines = result.split(\/[\\r\\n]+\/);\nvar html = '';\nfor (var i = 0; i < lines.length; i++) {\n    var url = lines[i]\n        .trim()  \/\/ \u53bb\u9664\u9996\u5c3e\u7a7a\u683c\n        .replace(\/^[^a-zA-Z]*\/, '')  \/\/ \u53bb\u9664\u884c\u9996\u7684\u975e\u5b57\u6bcd\u5b57\u7b26\uff08\u5982\u2514\u3001\u7a7a\u683c\u7b49\uff09\n        .replace(\/[^a-zA-Z0-9:\/._\\-]+$\/, '');  \/\/ \u53bb\u9664\u884c\u5c3e\u7684\u7279\u6b8a\u5b57\u7b26\n    \n    \/\/ \u53ea\u5904\u7406\u770b\u8d77\u6765\u50cfURL\u7684\u884c\n    if (url.startsWith('http') && (url.includes('.jpg') || url.includes('.png') || url.includes('.jpeg'))) {\n        html += '<img src=\"' + url + '\">\\n';  \/\/ \u6bcf\u4e2a\u6807\u7b7e\u5355\u72ec\u4e00\u884c\n    }\n}","imageStyle":"FULL","nextContentUrl":"class.page-links@tag.a.-1@href"},"ruleExplore":[],"ruleSearch":{"bookList":"class.site-main@tag.article||class.post","bookUrl":"tag.a.0@href","coverUrl":"tag.img@src","lastChapter":"class.date@text","name":"tag.h2@text"},"ruleToc":{"chapterList":"class.page-links","chapterName":"tag.span.0@text","nextTocUrl":"class.next page-numbers@tag.a@href"},"searchUrl":"http:\/\/www.177pica.com\/?s={{key}}&cat=0","weight":0},{"bookSourceComment":"\u2757\ufe0f\u7279\u522b\u6807\u6ce8\uff1a\u672c\u6e90\u53ea\u652f\u6301\u6d1b\u96c5\u6a59\u6539\u7248\u9605\u8bfb\u03a3\u6700\u65b0\u6d4b\u8bd5\u7248https:\/\/github.com\/Luoyacheng\/legado\n\n\u641c\u7d22\u5206\u7c7b\n@\u7528\u6237\n%\u89c6\u9891\n#\u4e13\u680f\n&\u76f4\u64ad\n*\u756a\u5267\n\uff1f\u5f71\u89c6\n\nAPI\u6765\u6e90\nhttps:\/\/github.com\/SocialSisterYi\/bilibili-API-collect\n\nurl scheme\u94fe\u63a5\u6765\u6e90\nAI\u548c\u7f51\u9875\n\n\u2699\ufe0f\u90e8\u5206\u529f\u80fd\u8bf4\u660e\u3010\u81ea\u5df1\u968f\u4fbf\u70b9\u70b9\u70b9\u770b\u770b\u5427\u3011\n\u767b\u5f55\u4f7f\u7528\u6548\u679c\u66f4\u4f73\n\n1\u3001\u8be6\u60c5\u9875\u754c\u9762 \n\u70b9\u51fb\u4e66\u540d\u663e\u793a\u3010\u6700\u65b0\u8bc4\u8bba\u3011\n\u957f\u6309\u4e66\u540d\u663e\u793a\u3010\u70ed\u95e8\u8bc4\u8bba\u3011\n\n\u70b9\u51fbUP\u4e3b\u540d\u5b57\u663e\u793a \u3010\u89c6\u9891\u5217\u8868\/\u4e13\u680f\u6587\u96c6\u3011\u3010\u6839\u636e\u767b\u5f55\u9875\u8bbe\u7f6e\u6765\u3011\n\u957f\u6309UP\u4e3b\u540d\u5b57\u663e\u793a \u3010\u89c6\u9891\u5408\u96c6\/\u4e13\u680f\u52a8\u6001\u3011\u3010\u6839\u636e\u767b\u5f55\u9875\u8bbe\u7f6e\u6765\u3011\n\n\u70b9\u51fb \u67e5\u770b\u5168\u90e8\u52a8\u6001\u3010\u67e5\u770b\u52a8\u6001\u3011\n\u957f\u6309 \u67e5\u770b\u5168\u90e8\u52a8\u6001\u3010\u641c\u7d22\u8be5up\u4e3b\u52a8\u6001\u3011\n\n\u70b9\u51fb\u53f3\u4e0a\u89d2\u25ce \u6253\u5f00\u54d4\u54e9\u54d4\u54e9\u5ba2\u6237\u7aef\n\u70b9\u51fb\u5206\u4eab\u6309\u94ae\uff0c\u590d\u5236\u5206\u4eab\u8be6\u60c5\n\u70b9\u51fb\u62f7\u8d1d\u4e66\u7c4d\u8be6\u60c5URL  \u590d\u5236\u7f51\u9875\u94fe\u63a5\n\u70b9\u51fb\u767b\u5f55 \u53ef\u9009\u62e9\u3010\u5173\u6ce8up\u5230b\u7ad9 [\u9700\u767b\u5f55\u8d26\u53f7]\u3011\n\n2\u3001\u89c6\u9891\u9875\n\u70b9\u51fb\u53f3\u4e0a\u89d2\u25ce \u6253\u5f00\u63a8\u8350\u89c6\u9891 \u3010\u5f71\u89c6\u65e0\u6548\uff0c\u76f4\u64ad\u65e0\u6548\u3011\n\u70b9\u51fb\u767b\u5f55 \u53ef\u70b9\u8d5e\u6295\u5e01\u6536\u85cf\n\n3\u3001\u53d1\u73b0\u9875\n\u957f\u6309\u4e66\u6e90\u9009\u9879\u540e\u6253\u5f00\u767b\u5f55\u9875\u9762\uff0c\u53ef\u7b5b\u9009\u5206\u7c7b\n\n4\u3001\u6b63\u6587\u9875\n\u89c6\u9891\/\u6587\u7ae0\u56fe\u53ef\u70b9\u51fb\u8df3\u8f6c\n\ud83d\udd17\ud83d\udcd6\ud83c\udfa5\ud83d\udc64\u56fe\u6807\u53ef\u70b9\u51fb\u8df3\u8f6c","bookSourceGroup":"\u2469\ud83c\udfa5  \u5f71\u89c6","bookSourceName":"\u54d4\u54e9\u54d4\u54e9","bookSourceType":0,"bookSourceUrl":"\u54d4\u54e9\u54d4\u54e9","bookUrlPattern":"https:\/\/api(?:\\.live)*\\.bilibili.com\/.*?\\?[^r]?(?:room_)*id=.*","customButton":true,"customOrder":-2,"enabled":false,"enabledCookieJar":true,"enabledExplore":true,"eventListener":true,"exploreUrl":"<js>\ntry{\n\t\nlet all = [];\nlet \u5c55\u5f00\u7b26 = \"\u2193 \";\nlet \u6536\u8d77\u7b26 = \"\u2191 \";\n\/\/\u4e00\u884c\u4e2a\u6570\nlet num = 3;\nlet d = {\n    1: 1,\n    2: 0.4,\n    3: 0.25,\n    4: 0.2,\n    5: 0.15,\n    7: 0.1,\n    10: 0.05\n};\nnum = d[num];\nlet push = (title, url, type, g,action) =>{\n\tlet j = {\n    title: title,\n    url: url,\n    style: {\n        layout_flexGrow: g == 0 ? g : 1,\n        layout_flexBasisPercent: type      \n    }\n  }\n     if(action){\n         j.action = action.action;\n         j.name = action.name;\n         j.type = action.type;\n         j.chars = action.chars;\n         j.viewName = action.viewName;\n         j.default = action.default;      \n     }     \n     all.push(j)\t\n} \n\nlet navdata = java.ajax(\"https:\/\/api.bilibili.com\/x\/web-interface\/nav\")\nlet mid = JSON.parse(navdata)?.data?.mid || \"\";\n\npush(\"\ud83d\udc64\u6211\u7684\", \"\", 1);\npush(\"\u63a8\u9001\u89c6\u9891\", \"https:\/\/api.bilibili.com\/x\/web-interface\/index\/top\/feed\/rcmd\", num);\npush(\"\u70ed\u95e8\u89c6\u9891\", \"https:\/\/api.bilibili.com\/x\/web-interface\/popular?pn={\\{page}}\", num);\npush(\"\u5165\u7ad9\u5fc5\u5237\", \"https:\/\/api.bilibili.com\/x\/web-interface\/popular\/precious\", num);\n\nif (mid) {\n    push(\"\u6b63\u5728\u76f4\u64ad\", \"https:\/\/api.live.bilibili.com\/xlive\/web-ucenter\/v1\/xfetter\/GetWebList?hit_ab=true\", num);\n\n    push(\"\u4e13\u680f\u52a8\u6001\", `https:\/\/api.bilibili.com\/x\/polymer\/web-dynamic\/v1\/feed\/all?timezone_offset=-480&type=article&platform=web&offset={\\{if(page==1){source.put(\"nextoffset\",\"\")};source.get(\"nextoffset\")}}&page={\\{page}}`, num);\n    push(\"\u89c6\u9891\u52a8\u6001\", `https:\/\/api.bilibili.com\/x\/polymer\/web-dynamic\/v1\/feed\/all?timezone_offset=-480&type=video&platform=web&offset={\\{if(page==1){source.put(\"nextoffset\",\"\")};source.get(\"nextoffset\")}}&page={\\{page}}`, num);\n    push(\"\u5386\u53f2\u8bb0\u5f55\", `https:\/\/api.bilibili.com\/x\/web-interface\/history\/cursor?max={\\{if(page==1){source.put(\"nextoffset\",\"\")};source.get(\"nextoffset\")}}`, num, 0);\n    \npush(\"\u2699\ufe0f\u5173\u6ce8\u5206\u7ec4\", \"\", 1,1,{\n        \"action\":\"show(infoMap['\u2699\ufe0f\u5173\u6ce8\u5206\u7ec4'],'follows')\",        \n        \"type\": \"toggle\",\n        \"chars\": [\u5c55\u5f00\u7b26, \u6536\u8d77\u7b26],\n        \"default\": Map(\"follows\")||\u5c55\u5f00\u7b26\n});\n\nif(isShow('follows',\u5c55\u5f00\u7b26)){\n        push(\"\u5168\u90e8\", \"https:\/\/api.bilibili.com\/x\/relation\/followings?vmid=\"+mid+\"&pn={\\{page}}\",num);\n        \u5173\u6ce8\u5206\u7ec4url = \"https:\/\/api.bilibili.com\/x\/relation\/tags\";\n        \u5173\u6ce8\u5206\u7ec4data = JSON.parse(java.ajax(\u5173\u6ce8\u5206\u7ec4url));\n        (\u5173\u6ce8\u5206\u7ec4data?.data ?? []).forEach(x => {\n            push(x.name, `https:\/\/api.bilibili.com\/x\/relation\/tag?pn={{page}\\}&tagid=${x.tagid}`, num)\n        })\n    }\n\npush(\"\ud83d\uddc2\u6536\u85cf\u5939\", \"\", 1,1,{\n        \"action\":\"show(infoMap['\ud83d\uddc2\u6536\u85cf\u5939'],'favse')\",        \n        \"type\": \"toggle\",\n        \"chars\": [\u5c55\u5f00\u7b26, \u6536\u8d77\u7b26],\n        \"default\": Map(\"favse\")||\u5c55\u5f00\u7b26\n});\nif(isShow('favse',\u5c55\u5f00\u7b26)){\n        \u6536\u85cf\u5939url = \"https:\/\/api.bilibili.com\/x\/v3\/fav\/folder\/created\/list-all?up_mid=\" + mid;\n        \u6536\u85cf\u5939data = JSON.parse(java.ajax(\u6536\u85cf\u5939url));\n        (\u6536\u85cf\u5939data?.data?.list ?? []).forEach(x => {\n            push(x.title, `https:\/\/api.bilibili.com\/x\/v3\/fav\/resource\/list?media_id=${x.id}&ps=20&pn={\\{page}}`, num)\n        })\n    }\n}\nlet \u5206\u533a = [\"\u52a8\u753b::1005\", \"\u6e38\u620f::1008\", \"\u9b3c\u755c::1007\", \"\u97f3\u4e50::1003\", \"\u821e\u8e48::1004\", \"\u5f71\u89c6::1001\", \"\u5a31\u4e50::1002\", \"\u77e5\u8bc6::1010\", \"\u79d1\u6280\u6570\u7801::1012\", \"\u8d44\u8baf::1009\", \"\u7f8e\u98df::1020\", \"\u5c0f\u5267\u573a::1021\", \"\u6c7d\u8f66::1013\", \"\u65f6\u5c1a\u7f8e\u5986::1014\", \"\u4f53\u80b2\u8fd0\u52a8::1018\", \"\u52a8\u7269::1024\", \"vlog::1029\", \"\u7ed8\u753b::1006\", \"\u4eba\u5de5\u667a\u80fd::1011\", \"\u5bb6\u88c5\u623f\u4ea7::1015\", \"\u6237\u5916\u6f6e\u6d41::1016\", \"\u5065\u8eab::1017\", \"\u624b\u5de5::1019\", \"\u65c5\u6e38\u51fa\u884c::1022\", \"\u4e09\u519c::1023\", \"\u4eb2\u5b50::1025\", \"\u5065\u5eb7::1026\", \"\u60c5\u611f::1027\", \"\u751f\u6d3b\u5174\u8da3::1030\", \"\u751f\u6d3b\u7ecf\u9a8c::1031\", \"\u795e\u79d8\u5b66::1028\"];\n\npush(\"\ud83d\udcfd\u89c6\u9891\u5206\u533a\", \"\", 1,1,{\n        \"action\":\"show(infoMap['\ud83d\udcfd\u89c6\u9891\u5206\u533a'],'videofq')\",        \n        \"type\": \"toggle\",\n        \"chars\": [\u5c55\u5f00\u7b26, \u6536\u8d77\u7b26],\n        \"default\": Map(\"videofq\")||\u5c55\u5f00\u7b26\n});\n\nif(isShow('videofq',\u5c55\u5f00\u7b26)){\n\u5206\u533a.forEach(x => {\n    let a = x.split(\"::\");\n    let json = `{display_id:page,request_cnt:20,from_region:${a[1]},device:\"web\",web_location:333.40138}`\n    push(a[0], `https:\/\/api.bilibili.com\/x\/web-interface\/region\/feed\/rcmd?{\\{getWbiEnc(${json})}}`, num)\n});\n}\n\nfunction getUrl(st = -1, sv = -1, area = -1, is_finish = -1, cr = -1, ss = -1, year = -1, rd = -1, sid = -1, pid = -1, order = -1) {\n    return `https:\/\/api.bilibili.com\/pgc\/season\/index\/result?season_type=${st}&type=1&page={\\{page}}&pagesize=50&season_version=${sv}&area=${area}&is_finish=${is_finish}&copyright=${cr}&season_status=${ss}&year=${java.encodeURI(year)}&release_date=${java.encodeURI(rd)}&style_id=${sid}&producer_id=${pid}&order=${order}`\n}\n\npush(\"\u89c6\u9891\u7c7b\u578b\",\"\",\"1\",1,{      \n        \"type\": \"select\",\n        \"chars\": [ \"\ud83c\udfac\u756a\u5267\",\"\ud83c\udfa5\u7535\u5f71\",\"\ud83c\udf9e\u7eaa\u5f55\u7247\",\"\ud83c\udde8\ud83c\uddf3\u56fd\u521b\",\"\ud83d\udcfa\u7535\u89c6\u5267\",\"\ud83c\udf7f\u7efc\u827a\"],\n        \"default\": Map(\"videolx\")||\"\ud83c\udfac\u756a\u5267\",\n        \"action\":\"show(infoMap['\u89c6\u9891\u7c7b\u578b'],'videolx')\"\n });\n \n push(\"\ud83d\udd01\u6392\u5e8f\",\"\",d[\"2\"],1,{\n            \"type\": \"select\",        \n            \"chars\": [\"\u66f4\u65b0\u65f6\u95f4\", \"\u5f39\u5e55\u6570\u91cf\", \"\u64ad\u653e\u6570\u91cf\",\"\u8ffd\u5267\u4eba\u6570\",\"\u6700\u9ad8\u8bc4\u5206\",\"\u5f00\u64ad\u65f6\u95f4\",\"\u4e0a\u6620\u65f6\u95f4\"],\n            \"default\": Map(\"order\")||\"\u8ffd\u5267\u4eba\u6570\",\n            \"action\":\"show(infoMap['\ud83d\udd01\u6392\u5e8f'],'order')\",\n});\npush(\"\ud83d\udcb0\u4ed8\u8d39\",\"\",d[\"2\"],1,{        \t   \n            \"type\": \"select\",       \n            \"chars\": [\"\u5168\u90e8\", \"\u514d\u8d39\",\"\u4ed8\u8d39\", \"\u5927\u4f1a\u5458\"],\n            \"default\": Map(\"pay\")||\"\u5168\u90e8\",\n            \"action\":\"show(infoMap['\ud83d\udcb0\u4ed8\u8d39'],'pay')\"\n})\n        \nfunction createFilterFromData(typeKey, namePrefix, fenleiData, f, icon) {\n    const dataArray = [];\n    (fenleiData[f] ?? []).forEach(x => {\n        dataArray.push(x.n);\n    });\n    if (dataArray.length) {\n        push(icon + namePrefix,\"\",d[\"2\"],1,{\n            \"type\": \"select\",\n            \"chars\": dataArray,\n            \"default\": Map(icon + namePrefix) || \"\u5168\u90e8\",\n            \"action\":`show(infoMap['${icon + namePrefix}'],'${icon + namePrefix}')`\n        });\n    }\n}\n\n    let videolx = String(Map(\"videolx\"))?String(Map(\"videolx\")):\"\ud83c\udfac\u756a\u5267\";\n    let icon = videolx.match(\/^([^\\u4e00-\\u9fa5]+)\/)[1];\n    let f = videolx.match(\/([\\u4e00-\\u9fa5]+)$\/)[1];\n    \n    createFilterFromData(\"\u51fa\u54c1\", \"\u51fa\u54c1\", fenlei[\"\u51fa\u54c1\"], f, icon);\n    createFilterFromData(\"\u72b6\u6001\", \"\u72b6\u6001\", fenlei[\"\u72b6\u6001\"], f, icon);\n    createFilterFromData(\"\u7248\u6743\", \"\u7248\u6743\", fenlei[\"\u7248\u6743\"], f, icon);\n    createFilterFromData(\"\u7c7b\u522b\", \"\u7c7b\u522b\", fenlei[\"\u7c7b\u522b\"], f, icon);\n    createFilterFromData(\"\u5730\u533a\", \"\u5730\u533a\", fenlei[\"\u5730\u533a\"], f, icon);\n    createFilterFromData(\"\u5e74\u4efd\", \"\u5e74\u4efd\", fenlei[\"\u5e74\u4efd\"], f, icon);\n    \n    let ss = getValueByIconAndName(icon, \"\u4ed8\u8d39\", String(Map('pay')));\n    let order = getValueByIconAndName(icon, \"\u6392\u5e8f\", String(Map('order')), null);\n    let area = getValueByIconAndName(icon, \"\u5730\u533a\", String(Map(icon + \"\u5730\u533a\")));\n    let sv = getValueByIconAndName(icon, \"\u7c7b\u522b\", String(Map(icon + \"\u7c7b\u522b\")));\n    let is_finish = getValueByIconAndName(icon, \"\u72b6\u6001\", String(Map(icon + \"\u72b6\u6001\")));\n    let cr = getValueByIconAndName(icon, \"\u7248\u6743\", String(Map(icon + \"\u7248\u6743\")));\n    let year = getValueByIconAndName(icon, \"\u5e74\u4efd\", String(Map(icon + \"\u5e74\u4efd\")));\n    let pid = getValueByIconAndName(icon, \"\u51fa\u54c1\", String(Map(icon + \"\u51fa\u54c1\")));\n    let rd = getValueByIconAndName(icon, \"\u5e74\u4efd\", String(Map(icon + \"\u5e74\u4efd\")));\n    \n    let st = fenlei[\"\u7c7b\u578bv\"][fenlei[\"\u7c7b\u578b\"].indexOf(f)];\n    fenlei[\"\u98ce\u683c\"][f].forEach(y => {\n        let url = getUrl(st, sv, area, is_finish, cr, ss, year, rd, y.v, pid, order);\n        push(y.n, url, num)\n    });\n    \nresult = JSON.stringify(all)\n}catch(e){\n\tjava.longToast(\"\u672c\u4e66\u6e90\u53ea\u652f\u6301\u6700\u65b0\u7248\u6d1b\u96c5\u6a59\u6539\u7248\u9605\u8bfb\u03a3\\n\u8bf7\u5b89\u88c5\u540e\u91cd\u65b0\u5bfc\u5165\u4e66\u6e90\");\tjava.startBrowser(\"https:\/\/loyc.xyz\/c\/legado.html#download\", \"\u4e0b\u8f7d\u9605\u8bfb\u03a3\u6700\u65b0\u6d4b\u8bd5\u7248\");\n\t\n\tresult = `\u4e0b\u8f7d\u9605\u8bfb\u03a3::{\\{java.longToast(\"\u672c\u4e66\u6e90\u53ea\u652f\u6301\u6700\u65b0\u7248\u6d1b\u96c5\u6a59\u6539\u7248\u9605\u8bfb\u03a3\\\\n\u8bf7\u5b89\u88c5\u540e\u91cd\u65b0\u5bfc\u5165\u4e66\u6e90\");java.startBrowser(\"https:\/\/loyc.xyz\/c\/legado.html#download\",\"\u4e0b\u8f7d\u9605\u8bfb\u03a3\u6700\u65b0\u6d4b\u8bd5\u7248\");}}`;\n\t}\n<\/js>","header":"@js:\nJSON.stringify({\n\t\"Referer\":\"https:\/\/www.bilibili.com\/\",\n\t\"Cookie\":decodeURIComponent(Map(\"cookie\"))||String(cookie.getCookie(\"https:\/\/www.bilibili.com\"))\n\t})","jsLib":"function Map(e,that) { \n\t  const { source } = that || this;\n   return getHeaderMap(that||this)[e]??\"\"\n}\nfunction getHeaderMap(_){\n\t  const { source,java } = _ || this;\n    let infomap = String(source.getLoginHeader()).replace(\/^#\/,'');\n    infomap = (infomap!=\"null\"&&infomap!=\"\"&&infomap!=null)?infomap:\"{}\";\n    return JSON.parse(infomap);\n\t}\n\nfunction setHeaders(){\n   \tconst { source,java } = this;\n   \tlet map = getHeaderMap(this);\n   \tfor(let i=0;i<arguments.length;i++){\n   \t\tlet k =arguments[i].split(\"=\")[0];\n   \t\tlet v =arguments[i].split(\"=\")[1];\n   \t\tmap[k] = v;\n   \t\t}\n  source.putLoginHeader(\"#\"+JSON.stringify(map))\n\t}\n\n\nfunction goCo(aid,msg){\n\tconst {java,result,cookie} = this;\n\tlet message = String(result.get(\"\u5f53\u524d\u89c6\u9891\uff1a\"+msg));\n\tlet csrf = cookie.getKey(\"https:\/\/www.bilibili.com\",\"bili_jct\");\n\tlet url = \"https:\/\/api.bilibili.com\/x\/v2\/reply\/add,\"+JSON.stringify({\n\t\t\"method\":\"POST\",\n\t\t\"body\":`oid=${aid}&type=1&message=${message}&csrf=${csrf}`\n\t\t});\n\t\tif(message){\nlet data = JSON.parse(java.ajax(url));\nif(data.code==0){\n    java.toast(\"\u53d1\u9001\u6210\u529f\")\n}else{\n    java.toast(data.message)\n}\n}else{\n\tjava.toast(\"\u8bc4\u8bba\u4e0d\u80fd\u4e3a\u7a7a\")\n\t}\n\t}\nfunction show(m,t){\n\tconst {java,source} = this;\n\tthis.setHeaders(t+\"=\"+m);\n\t\n\tjava.refreshExplore();\n}\n\nfunction isShow(m,z){\n    \tconst {source,java} = this;\n     return (\tthis.Map(m) == z || this.Map(m)==\"\")\n\t}\nconst fenlei={\"\u7c7b\u578b\":[\"\u756a\u5267\",\"\u7535\u5f71\",\"\u7eaa\u5f55\u7247\",\"\u56fd\u521b\",\"\u7535\u89c6\u5267\",\"\u7efc\u827a\"],\"\u7c7b\u578bv\":[1,2,3,4,5,7],\"\u56fe\u6807\":[\"\ud83c\udfac\",\"\ud83c\udfa5\",\"\ud83c\udf9e\",\"\ud83c\udde8\ud83c\uddf3\",\"\ud83d\udcfa\",\"\ud83c\udf7f\"],\"\u6392\u5e8f\":[{\"n\":\"\u66f4\u65b0\u65f6\u95f4\",\"v\":0},{\"n\":\"\u5f39\u5e55\u6570\u91cf\",\"v\":1},{\"n\":\"\u64ad\u653e\u6570\u91cf\",\"v\":2},{\"n\":\"\u8ffd\u5267\u4eba\u6570\",\"v\":3},{\"n\":\"\u6700\u9ad8\u8bc4\u5206\",\"v\":4},{\"n\":\"\u5f00\u64ad\u65f6\u95f4\",\"v\":5},{\"n\":\"\u4e0a\u6620\u65f6\u95f4\",\"v\":6}],\"\u4ed8\u8d39\":[{\"n\":\"\u5168\u90e8\",\"v\":\"-1\"},{\"n\":\"\u514d\u8d39\",\"v\":\"1\"},{\"n\":\"\u4ed8\u8d39\",\"v\":\"2,6\"},{\"n\":\"\u5927\u4f1a\u5458\",\"v\":\"4,6\"}],\"\u7c7b\u522b\":{\u756a\u5267:[{\"n\":\"\u5168\u90e8\",\"v\":\"-1\"},{\"n\":\"\u6b63\u7247\",\"v\":\"1\"},{\"n\":\"\u7535\u5f71\",\"v\":\"2\"},{\"n\":\"\u5176\u4ed6\",\"v\":\"3\"}],\u56fd\u521b:[{\"n\":\"\u5168\u90e8\",\"v\":\"-1\"},{\"n\":\"\u6b63\u7247\",\"v\":\"1\"},{\"n\":\"\u7535\u5f71\",\"v\":\"2\"},{\"n\":\"\u5176\u4ed6\",\"v\":\"3\"}]},\"\u7248\u6743\":{\u56fd\u521b:[{\"n\":\"\u5168\u90e8\",\"v\":\"-1\"},{\"n\":\"\u72ec\u5bb6\",\"v\":\"3\"},{\"n\":\"\u5176\u4ed6\",\"v\":\"1,2,4\"}]},\"\u72b6\u6001\":{\u756a\u5267:[{\"n\":\"\u5168\u90e8\",\"v\":\"-1\"},{\"n\":\"\u5b8c\u7ed3\",\"v\":\"1\"},{\"n\":\"\u8fde\u8f7d\",\"v\":\"0\"}],\u56fd\u521b:[{\"n\":\"\u5168\u90e8\",\"v\":\"-1\"},{\"n\":\"\u5b8c\u7ed3\",\"v\":\"1\"},{\"n\":\"\u8fde\u8f7d\",\"v\":\"0\"}]},\"\u51fa\u54c1\":{\u7eaa\u5f55\u7247:[{\"n\":\"\u5168\u90e8\",\"v\":\"-1\"},{\"n\":\"\u592e\u89c6\",\"v\":\"4\"},{\"n\":\"BBC\",\"v\":\"1\"},{\"n\":\"\u63a2\u7d22\u9891\u9053\",\"v\":\"7\"},{\"n\":\"\u56fd\u5bb6\u5730\u7406\",\"v\":\"14\"},{\"n\":\"NHK\",\"v\":\"2\"},{\"n\":\"\u5386\u53f2\u9891\u9053\",\"v\":\"6\"},{\"n\":\"\u536b\u89c6\",\"v\":\"8\"},{\"n\":\"\u81ea\u5236\",\"v\":\"9\"},{\"n\":\"ITV\",\"v\":\"5\"},{\"n\":\"SKY\",\"v\":\"3\"},{\"n\":\"ZDF\",\"v\":\"10\"},{\"n\":\"\u5408\u4f5c\u673a\u6784\",\"v\":\"11\"},{\"n\":\"\u56fd\u5185\u5176\u4ed6\",\"v\":\"12\"},{\"n\":\"\u56fd\u5916\u5176\u4ed6\",\"v\":\"13\"},{\"n\":\"\u7d22\u5c3c\",\"v\":\"15\"},{\"n\":\"\u73af\u7403\",\"v\":\"16\"},{\"n\":\"\u6d3e\u62c9\u8499\",\"v\":\"17\"},{\"n\":\"\u534e\u7eb3\",\"v\":\"18\"},{\"n\":\"\u8fea\u58eb\u5c3c\",\"v\":\"19\"},{\"n\":\"HBO\",\"v\":\"20\"}]},\"\u5730\u533a\":{\"\u7535\u89c6\u5267\":[{\"n\":\"\u5168\u90e8\",\"v\":\"-1\"},{\"n\":\"\u4e2d\u56fd\",\"v\":\"1,6,7\"},{\"n\":\"\u65e5\u672c\",\"v\":2},{\"n\":\"\u7f8e\u56fd\",\"v\":3},{\"n\":\"\u82f1\u56fd\",\"v\":4},{\"n\":\"\u5176\u4ed6\",\"v\":\"5,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70\"}],\"\u756a\u5267\":[{\"n\":\"\u5168\u90e8\",\"v\":-1},{\"n\":\"\u65e5\u672c\",\"v\":2},{\"n\":\"\u7f8e\u56fd\",\"v\":3},{\"n\":\"\u5176\u4ed6\",\"v\":\"1,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70\"}],\"\u7535\u5f71\":[{\"n\":\"\u5168\u90e8\",\"v\":-1},{\"n\":\"\u4e2d\u56fd\u5927\u9646\",\"v\":1},{\"n\":\"\u4e2d\u56fd\u6e2f\u53f0\",\"v\":\"6,7\"},{\"n\":\"\u7f8e\u56fd\",\"v\":3},{\"n\":\"\u65e5\u672c\",\"v\":2},{\"n\":\"\u97e9\u56fd\",\"v\":8},{\"n\":\"\u6cd5\u56fd\",\"v\":9},{\"n\":\"\u82f1\u56fd\",\"v\":4},{\"n\":\"\u5fb7\u56fd\",\"v\":15},{\"n\":\"\u6cf0\u56fd\",\"v\":10},{\"n\":\"\u610f\u5927\u5229\",\"v\":35},{\"n\":\"\u897f\u73ed\u7259\",\"v\":13},{\"n\":\"\u5176\u4ed6\",\"v\":\"5,11,12,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70\"}]},\"\u98ce\u683c\":{\u7535\u89c6\u5267:[{\"n\":\"\u5267\u60c5\",\"v\":10050},{\"n\":\"\u60c5\u611f\",\"v\":10084},{\"n\":\"\u641e\u7b11\",\"v\":10021},{\"n\":\"\u60ac\u7591\",\"v\":10057},{\"n\":\"\u90fd\u5e02\",\"v\":10080},{\"n\":\"\u5bb6\u5ead\",\"v\":10061},{\"n\":\"\u53e4\u88c5\",\"v\":10081},{\"n\":\"\u5386\u53f2\",\"v\":10033},{\"n\":\"\u5947\u5e7b\",\"v\":10018},{\"n\":\"\u9752\u6625\",\"v\":10079},{\"n\":\"\u6218\u4e89\",\"v\":10058},{\"n\":\"\u6b66\u4fa0\",\"v\":10078},{\"n\":\"\u52b1\u5fd7\",\"v\":10039},{\"n\":\"\u77ed\u5267\",\"v\":10103},{\"n\":\"\u79d1\u5e7b\",\"v\":10023},{\"n\":\"\u5176\u4ed6\",\"v\":\"10086,10088,10089,10017,10083,10082,10087,10085\"}],\u756a\u5267:[{\"n\":\"\u539f\u521b\",\"v\":10010},{\"n\":\"\u6f2b\u753b\u6539\",\"v\":10011},{\"n\":\"\u5c0f\u8bf4\u6539\",\"v\":10012},{\"n\":\"\u6e38\u620f\u6539\",\"v\":10013},{\"n\":\"\u7279\u6444\",\"v\":10102},{\"n\":\"\u5e03\u888b\u620f\",\"v\":10015},{\"n\":\"\u70ed\u8840\",\"v\":10016},{\"n\":\"\u7a7f\u8d8a\",\"v\":10017},{\"n\":\"\u5947\u5e7b\",\"v\":10018},{\"n\":\"\u6218\u6597\",\"v\":10020},{\"n\":\"\u641e\u7b11\",\"v\":10021},{\"n\":\"\u65e5\u5e38\",\"v\":10022},{\"n\":\"\u79d1\u5e7b\",\"v\":10023},{\"n\":\"\u840c\u7cfb\",\"v\":10024},{\"n\":\"\u6cbb\u6108\",\"v\":10025},{\"n\":\"\u6821\u56ed\",\"v\":10026},{\"n\":\"\u5c11\u513f\",\"v\":10027},{\"n\":\"\u6ce1\u9762\",\"v\":10028},{\"n\":\"\u604b\u7231\",\"v\":10029},{\"n\":\"\u5c11\u5973\",\"v\":10030},{\"n\":\"\u9b54\u6cd5\",\"v\":10031},{\"n\":\"\u5192\u9669\",\"v\":10032},{\"n\":\"\u5386\u53f2\",\"v\":10033},{\"n\":\"\u67b6\u7a7a\",\"v\":10034},{\"n\":\"\u673a\u6218\",\"v\":10035},{\"n\":\"\u795e\u9b54\",\"v\":10036},{\"n\":\"\u58f0\u63a7\",\"v\":10037},{\"n\":\"\u8fd0\u52a8\",\"v\":10038},{\"n\":\"\u52b1\u5fd7\",\"v\":10039},{\"n\":\"\u97f3\u4e50\",\"v\":10040},{\"n\":\"\u63a8\u7406\",\"v\":10041},{\"n\":\"\u793e\u56e2\",\"v\":10042},{\"n\":\"\u667a\u6597\",\"v\":10043},{\"n\":\"\u50ac\u6cea\",\"v\":10044},{\"n\":\"\u7f8e\u98df\",\"v\":10045},{\"n\":\"\u5076\u50cf\",\"v\":10046},{\"n\":\"\u4e59\u5973\",\"v\":10047},{\"n\":\"\u804c\u573a\",\"v\":10048}],\u7535\u5f71:[{\"n\":\"\u77ed\u7247\",\"v\":10104},{\"n\":\"\u5267\u60c5\",\"v\":10050},{\"n\":\"\u559c\u5267\",\"v\":10051},{\"n\":\"\u7231\u60c5\",\"v\":10052},{\"n\":\"\u52a8\u4f5c\",\"v\":10053},{\"n\":\"\u6050\u6016\",\"v\":10054},{\"n\":\"\u79d1\u5e7b\",\"v\":10023},{\"n\":\"\u72af\u7f6a\",\"v\":10055},{\"n\":\"\u60ca\u609a\",\"v\":10056},{\"n\":\"\u60ac\u7591\",\"v\":10057},{\"n\":\"\u5947\u5e7b\",\"v\":10018},{\"n\":\"\u6218\u4e89\",\"v\":10058},{\"n\":\"\u52a8\u753b\",\"v\":10059},{\"n\":\"\u4f20\u8bb0\",\"v\":10060},{\"n\":\"\u5bb6\u5ead\",\"v\":10061},{\"n\":\"\u6b4c\u821e\",\"v\":10062},{\"n\":\"\u5386\u53f2\",\"v\":10033},{\"n\":\"\u5192\u9669\",\"v\":10032},{\"n\":\"\u7eaa\u5b9e\",\"v\":10063},{\"n\":\"\u707e\u96be\",\"v\":10064},{\"n\":\"\u6f2b\u753b\u6539\",\"v\":10011},{\"n\":\"\u5c0f\u8bf4\u6539\",\"v\":10012}],\u56fd\u521b:[{\"n\":\"\u539f\u521b\",\"v\":10010},{\"n\":\"\u6f2b\u753b\u6539\",\"v\":10011},{\"n\":\"\u5c0f\u8bf4\u6539\",\"v\":10012},{\"n\":\"\u6e38\u620f\u6539\",\"v\":10013},{\"n\":\"\u52a8\u6001\u6f2b\",\"v\":10014},{\"n\":\"\u5e03\u888b\u620f\",\"v\":10015},{\"n\":\"\u70ed\u8840\",\"v\":10016},{\"n\":\"\u5947\u5e7b\",\"v\":10018},{\"n\":\"\u7384\u5e7b\",\"v\":10019},{\"n\":\"\u6218\u6597\",\"v\":10020},{\"n\":\"\u641e\u7b11\",\"v\":10021},{\"n\":\"\u6b66\u4fa0\",\"v\":10078},{\"n\":\"\u65e5\u5e38\",\"v\":10022},{\"n\":\"\u79d1\u5e7b\",\"v\":10023},{\"n\":\"\u840c\u7cfb\",\"v\":10024},{\"n\":\"\u6cbb\u6108\",\"v\":10025},{\"n\":\"\u60ac\u7591\",\"v\":10057},{\"n\":\"\u6821\u56ed\",\"v\":10026},{\"n\":\"\u5c11\u513f\",\"v\":10027},{\"n\":\"\u6ce1\u9762\",\"v\":10028},{\"n\":\"\u604b\u7231\",\"v\":10029},{\"n\":\"\u5c11\u5973\",\"v\":10030},{\"n\":\"\u9b54\u6cd5\",\"v\":10031},{\"n\":\"\u5386\u53f2\",\"v\":10033},{\"n\":\"\u673a\u6218\",\"v\":10035},{\"n\":\"\u795e\u9b54\",\"v\":10036},{\"n\":\"\u58f0\u63a7\",\"v\":10037},{\"n\":\"\u8fd0\u52a8\",\"v\":10038},{\"n\":\"\u52b1\u5fd7\",\"v\":10039},{\"n\":\"\u97f3\u4e50\",\"v\":10040},{\"n\":\"\u63a8\u7406\",\"v\":10041},{\"n\":\"\u793e\u56e2\",\"v\":10042},{\"n\":\"\u667a\u6597\",\"v\":10043},{\"n\":\"\u50ac\u6cea\",\"v\":10044},{\"n\":\"\u7f8e\u98df\",\"v\":10045},{\"n\":\"\u5076\u50cf\",\"v\":10046},{\"n\":\"\u4e59\u5973\",\"v\":10047},{\"n\":\"\u804c\u573a\",\"v\":10048},{\"n\":\"\u53e4\u98ce\",\"v\":10049}],\u7efc\u827a:[{\"n\":\"\u97f3\u4e50\",\"v\":10040},{\"n\":\"\u8bbf\u8c08\",\"v\":10090},{\"n\":\"\u8131\u53e3\u79c0\",\"v\":10091},{\"n\":\"\u771f\u4eba\u79c0\",\"v\":10092},{\"n\":\"\u9009\u79c0\",\"v\":10094},{\"n\":\"\u7f8e\u98df\",\"v\":10045},{\"n\":\"\u65c5\u6e38\",\"v\":10095},{\"n\":\"\u665a\u4f1a\",\"v\":10098},{\"n\":\"\u6f14\u5531\u4f1a\",\"v\":10096},{\"n\":\"\u60c5\u611f\",\"v\":10084},{\"n\":\"\u559c\u5267\",\"v\":10051},{\"n\":\"\u4eb2\u5b50\",\"v\":10097},{\"n\":\"\u6587\u5316\",\"v\":10100},{\"n\":\"\u804c\u573a\",\"v\":10048},{\"n\":\"\u840c\u5ba0\",\"v\":10069},{\"n\":\"\u517b\u6210\",\"v\":10099}],\u7eaa\u5f55\u7247:[{\"n\":\"\u5386\u53f2\",\"v\":10033},{\"n\":\"\u7f8e\u98df\",\"v\":10045},{\"n\":\"\u4eba\u6587\",\"v\":10065},{\"n\":\"\u79d1\u6280\",\"v\":10066},{\"n\":\"\u63a2\u9669\",\"v\":10067},{\"n\":\"\u5b87\u5b99\",\"v\":10068},{\"n\":\"\u840c\u5ba0\",\"v\":10069},{\"n\":\"\u793e\u4f1a\",\"v\":10070},{\"n\":\"\u52a8\u7269\",\"v\":10071},{\"n\":\"\u81ea\u7136\",\"v\":10072},{\"n\":\"\u533b\u7597\",\"v\":10073},{\"n\":\"\u519b\u4e8b\",\"v\":10074},{\"n\":\"\u707e\u96be\",\"v\":10064},{\"n\":\"\u7f6a\u6848\",\"v\":10075},{\"n\":\"\u795e\u79d8\",\"v\":10076},{\"n\":\"\u65c5\u884c\",\"v\":10077},{\"n\":\"\u8fd0\u52a8\",\"v\":10038},{\"n\":\"\u7535\u5f71\",\"v\":-10}]},\"\u5e74\u4efd\":{\u7535\u89c6\u5267:[{\"n\":\"\u5168\u90e8\",\"v\":-1},{\"n\":\"2025\",\"v\":\"[2025-01-01 00:00:00,2026-01-01 00:00:00)\"},{\"n\":\"2024\",\"v\":\"[2024-01-01 00:00:00,2025-01-01 00:00:00)\"},{\"n\":\"2023\",\"v\":\"[2023-01-01 00:00:00,2024-01-01 00:00:00)\"},{\"n\":\"2022\",\"v\":\"[2022-01-01 00:00:00,2023-01-01 00:00:00)\"},{\"n\":\"2021\",\"v\":\"[2021-01-01 00:00:00,2022-01-01 00:00:00)\"},{\"n\":\"2020\",\"v\":\"[2020-01-01 00:00:00,2021-01-01 00:00:00)\"},{\"n\":\"2019\",\"v\":\"[2019-01-01 00:00:00,2020-01-01 00:00:00)\"},{\"n\":\"2018\",\"v\":\"[2018-01-01 00:00:00,2019-01-01 00:00:00)\"},{\"n\":\"2017\",\"v\":\"[2017-01-01 00:00:00,2018-01-01 00:00:00)\"},{\"n\":\"2016\",\"v\":\"[2016-01-01 00:00:00,2017-01-01 00:00:00)\"},{\"n\":\"2015-2010\",\"v\":\"[2010-01-01 00:00:00,2016-01-01 00:00:00)\"},{\"n\":\"2009-2005\",\"v\":\"[2005-01-01 00:00:00,2010-01-01 00:00:00)\"},{\"n\":\"2004-2000\",\"v\":\"[2000-01-01 00:00:00,2005-01-01 00:00:00)\"},{\"n\":\"90\u5e74\u4ee3\",\"v\":\"[1990-01-01 00:00:00,2000-01-01 00:00:00)\"},{\"n\":\"80\u5e74\u4ee3\",\"v\":\"[1980-01-01 00:00:00,1990-01-01 00:00:00)\"},{\"n\":\"\u66f4\u65e9\",\"v\":\"[,1980-01-01 00:00:00)\"}],\u756a\u5267:[{\"n\":\"\u5168\u90e8\",\"v\":-1},{\"n\":\"2025\",\"v\":\"[2025,2026)\"},{\"n\":\"2024\",\"v\":\"[2024,2025)\"},{\"n\":\"2023\",\"v\":\"[2023,2024)\"},{\"n\":\"2022\",\"v\":\"[2022,2023)\"},{\"n\":\"2021\",\"v\":\"[2021,2022)\"},{\"n\":\"2020\",\"v\":\"[2020,2021)\"},{\"n\":\"2019\",\"v\":\"[2019,2020)\"},{\"n\":\"2018\",\"v\":\"[2018,2019)\"},{\"n\":\"2017\",\"v\":\"[2017,2018)\"},{\"n\":\"2016\",\"v\":\"[2016,2017)\"},{\"n\":\"2015\",\"v\":\"[2015,2016)\"},{\"n\":\"2014-2010\",\"v\":\"[2010,2015)\"},{\"n\":\"2009-2005\",\"v\":\"[2005,2010)\"},{\"n\":\"2004-2000\",\"v\":\"[2000,2005)\"},{\"n\":\"90\u5e74\u4ee3\",\"v\":\"[1990,2000)\"},{\"n\":\"80\u5e74\u4ee3\",\"v\":\"[1980,1990)\"},{\"n\":\"\u66f4\u65e9\",\"v\":\"[,1980)\"}],\u7535\u5f71:[{\"n\":\"\u5168\u90e8\",\"v\":-1},{\"n\":\"2025\",\"v\":\"[2025-01-01 00:00:00,2026-01-01 00:00:00)\"},{\"n\":\"2024\",\"v\":\"[2024-01-01 00:00:00,2025-01-01 00:00:00)\"},{\"n\":\"2023\",\"v\":\"[2023-01-01 00:00:00,2024-01-01 00:00:00)\"},{\"n\":\"2022\",\"v\":\"[2022-01-01 00:00:00,2023-01-01 00:00:00)\"},{\"n\":\"2021\",\"v\":\"[2021-01-01 00:00:00,2022-01-01 00:00:00)\"},{\"n\":\"2020\",\"v\":\"[2020-01-01 00:00:00,2021-01-01 00:00:00)\"},{\"n\":\"2019\",\"v\":\"[2019-01-01 00:00:00,2020-01-01 00:00:00)\"},{\"n\":\"2018\",\"v\":\"[2018-01-01 00:00:00,2019-01-01 00:00:00)\"},{\"n\":\"2017\",\"v\":\"[2017-01-01 00:00:00,2018-01-01 00:00:00)\"},{\"n\":\"2016\",\"v\":\"[2016-01-01 00:00:00,2017-01-01 00:00:00)\"},{\"n\":\"2015-2010\",\"v\":\"[2010-01-01 00:00:00,2016-01-01 00:00:00)\"},{\"n\":\"2009-2005\",\"v\":\"[2005-01-01 00:00:00,2010-01-01 00:00:00)\"},{\"n\":\"2004-2000\",\"v\":\"[2000-01-01 00:00:00,2005-01-01 00:00:00)\"},{\"n\":\"90\u5e74\u4ee3\",\"v\":\"[1990-01-01 00:00:00,2000-01-01 00:00:00)\"},{\"n\":\"80\u5e74\u4ee3\",\"v\":\"[1980-01-01 00:00:00,1990-01-01 00:00:00)\"},{\"n\":\"\u66f4\u65e9\",\"v\":\"[,1980-01-01 00:00:00)\"}],\u56fd\u521b:[{\"n\":\"\u5168\u90e8\",\"v\":-1},{\"n\":\"2025\",\"v\":\"[2025,2026)\"},{\"n\":\"2024\",\"v\":\"[2024,2025)\"},{\"n\":\"2023\",\"v\":\"[2023,2024)\"},{\"n\":\"2022\",\"v\":\"[2022,2023)\"},{\"n\":\"2021\",\"v\":\"[2021,2022)\"},{\"n\":\"2020\",\"v\":\"[2020,2021)\"},{\"n\":\"2019\",\"v\":\"[2019,2020)\"},{\"n\":\"2018\",\"v\":\"[2018,2019)\"},{\"n\":\"2017\",\"v\":\"[2017,2018)\"},{\"n\":\"2016\",\"v\":\"[2016,2017)\"},{\"n\":\"2015\",\"v\":\"[2015,2016)\"},{\"n\":\"2014-2010\",\"v\":\"[2010,2015)\"},{\"n\":\"2009-2005\",\"v\":\"[2005,2010)\"},{\"n\":\"2004-2000\",\"v\":\"[2000,2005)\"},{\"n\":\"90\u5e74\u4ee3\",\"v\":\"[1990,2000)\"},{\"n\":\"80\u5e74\u4ee3\",\"v\":\"[1980,1990)\"},{\"n\":\"\u66f4\u65e9\",\"v\":\"[,1980)\"}],\u7eaa\u5f55\u7247:[{\"n\":\"\u5168\u90e8\",\"v\":-1},{\"n\":\"2025\",\"v\":\"[2025-01-01 00:00:00,2026-01-01 00:00:00)\"},{\"n\":\"2024\",\"v\":\"[2024-01-01 00:00:00,2025-01-01 00:00:00)\"},{\"n\":\"2023\",\"v\":\"[2023-01-01 00:00:00,2024-01-01 00:00:00)\"},{\"n\":\"2022\",\"v\":\"[2022-01-01 00:00:00,2023-01-01 00:00:00)\"},{\"n\":\"2021\",\"v\":\"[2021-01-01 00:00:00,2022-01-01 00:00:00)\"},{\"n\":\"2020\",\"v\":\"[2020-01-01 00:00:00,2021-01-01 00:00:00)\"},{\"n\":\"2019\",\"v\":\"[2019-01-01 00:00:00,2020-01-01 00:00:00)\"},{\"n\":\"2018\",\"v\":\"[2018-01-01 00:00:00,2019-01-01 00:00:00)\"},{\"n\":\"2017\",\"v\":\"[2017-01-01 00:00:00,2018-01-01 00:00:00)\"},{\"n\":\"2016\",\"v\":\"[2016-01-01 00:00:00,2017-01-01 00:00:00)\"},{\"n\":\"2015-2010\",\"v\":\"[2010-01-01 00:00:00,2016-01-01 00:00:00)\"},{\"n\":\"2009-2005\",\"v\":\"[2005-01-01 00:00:00,2010-01-01 00:00:00)\"},{\"n\":\"2004-2000\",\"v\":\"[2000-01-01 00:00:00,2005-01-01 00:00:00)\"},{\"n\":\"90\u5e74\u4ee3\",\"v\":\"[1990-01-01 00:00:00,2000-01-01 00:00:00)\"},{\"n\":\"80\u5e74\u4ee3\",\"v\":\"[1980-01-01 00:00:00,1990-01-01 00:00:00)\"},{\"n\":\"\u66f4\u65e9\",\"v\":\"[,1980-01-01 00:00:00)\"}]}};\n\nfunction parseContent(textData) {\n    let result,message,emote;\n    let pic=\"\";\n    var messageMatch = textData.match(\/message=([^,]+?),\/);\n    if (messageMatch) {\n        message = messageMatch[1].trim();      \n    }\n    let emoteMatch = textData.match(\/text=\\[.*?\\],\\s*url=[^,]+,\/g);\n    if(emoteMatch){\n        emoteMatch.forEach(x=>{\n            let title = x.match(\/text=(\\[.*?\\])\/)[1];   \n            let url = x.match(\/url=([^,]+),\/)[1];  \n            title = title.replace(\/(\\[|\\]|\\$)\/g,'\\\\$1');   \n            let re = new RegExp(title,\"g\");      \n            \n            let img = `<img src=\"${url},{style:'text'}\">`;\n            message = message.replace(re,img);         \n        })\n    }\n    var picturesMatch = textData.match(\/pictures=\\[([^\\]]+)\\],\/);\n    if (picturesMatch) {\n        var picturesBlock = picturesMatch[1];\n        var srcMatch = picturesBlock.match(\/\"img_src\":\"([^\"]+)\"\/g);        \n        if(srcMatch){\n            srcMatch.forEach(x=>{\n                let src = x.match(\/\"img_src\":\"([^\"]+)\"\/);        \n                pic +=`<img src=\"${src[1].replace(\/\\\\\\\/\/g, '\/') }\">`\n            })\n        }       \n    }\n    result = message+pic\n    return result;\n}\n\nfunction getValueByIconAndName(icon, filterType, optionName, typeName) {\n  let targetType = typeName;\n  \n  if (!targetType && icon) {\n    let iconIndex = fenlei.\u56fe\u6807.indexOf(icon);\n    if (iconIndex === -1) {\n      \n      return -1;\n    }\n    targetType = fenlei.\u7c7b\u578b[iconIndex];\n  } else if (!targetType) {\n    return -1;\n  }\n  \n  if (!fenlei[filterType]) {\n    return -1;\n  }\n  \n  let filterData = fenlei[filterType];\n  \n  if (Array.isArray(filterData)) {\n    let option = filterData.find(item => item.n === optionName);\n    return option ? option.v : -1;\n  }\n  \n  if (typeof filterData === 'object') {\n    if (filterData[targetType]) {\n      let typeData = filterData[targetType];\n      if (Array.isArray(typeData) && typeData[0] === -1) {\n        for (let i = 1; i < typeData.length; i++) {\n          if (typeData[i].n === optionName) {\n            return typeData[i].v;\n          }\n        }\n      } \n      else if (Array.isArray(typeData)) {\n        let option = typeData.find(item => item.n === optionName);\n        if (option) {\n          return option.v;\n        }\n      }\n    }\n    \n    for (let type in filterData) {\n      if (type !== targetType) {\n        let typeData = filterData[type];\n        \n        if (Array.isArray(typeData)) {\n          if (typeData[0] === -1) {\n            for (let i = 1; i < typeData.length; i++) {\n              if (typeData[i].n === optionName) {\n                return typeData[i].v;\n              }\n            }\n          } else {\n            let option = typeData.find(item => item.n === optionName);\n            if (option) {\n              return option.v;\n            }\n          }\n        }\n      }\n    }\n  }\n  \n  \n  return -1;\n}\n\nfunction getApi(type,id,other){\n    let url = \"\";\n    switch(type){\n        case \"video\":\n            url = `https:\/\/api.bilibili.com\/x\/web-interface\/view?aid=${id}`;\n            break;\n            \n        case \"article\":\n            url = `https:\/\/api.bilibili.com\/x\/article\/view?id=${id},{\"js\":\"book?result:'https:\/\/www.bilibili.com\/opus\/${other}?spm_id_from=333.1365.0.0'\"}`;\n            break;  \n            \n        case \"articlelist\":\n            break;\n            \n        case \"user\":\n        case \"live\":\n            url = `https:\/\/api.bilibili.com\/x\/space\/wbi\/acc\/info?${this.getWbiEnc({mid:id})}`;\n            break;\n            \n        case \"forward\":\n            url = `https:\/\/api.bilibili.com\/x\/polymer\/web-dynamic\/v1\/detail?timezone_offset=-480&platform=web&gaia_source=main_web&id=${id}&features=itemOpusStyle,opusBigCover,onlyfansVote,endFooterHidden,decorationCard,onlyfansAssetsV2,ugcDelete,onlyfansQaCard,editable,opusPrivateVisible,avatarAutoTheme,sunflowerStyle,eva3CardOpus,eva3CardVideo,eva3CardComment&web_location=333.1368&x-bili-device-req-json=%7B%22platform%22:%22web%22,%22device%22:%22pc%22,%22spmid%22:%22333.1368%22%7D,{\"js\":\"book?result:'https:\/\/t.bilibili.com\/${other}?spm_id_from=333.1365.0.0'\"}`;\n            break;\n            \n        case \"opus\":\n            url = `https:\/\/api.bilibili.com\/x\/polymer\/web-dynamic\/v1\/opus\/detail?features=\titemOpusStyle,endFooterHidden,onlyfansAssetsV2,ugcDelete,commentsNewVersion&id=${id},{\"js\":\"book?result:'https:\/\/www.bilibili.com\/opus\/${other}?spm_id_from=333.1365.0.0'\"}`;\n            break;\n        case \"media_bangumi\":\n        case \"media_ft\":\n        url = `https:\/\/api.bilibili.com\/pgc\/view\/web\/season?season_id=${id}`;\n        break\n    }\n    \n    return url\n}\n\n\/\/\u5206\u4eab\u94fe\u63a5\nfunction getShareUrl(type,id){\n    let url = \"\";\n\tswitch(type){\n        case \"video\":\n            url = `https:\/\/m.bilibili.com\/video\/av${id}`;\n            break;\n            \n        case \"article\":\n            url = `https:\/\/m.bilibili.com\/opus\/${id}`\n            break;\n            \n         case \"forward\":\n             url = `https:\/\/m.bilibili.com\/dynamic\/${id}`\n             break;   \n             \n          case \"user\":\n              url = `https:\/\/m.bilibili.com\/space\/${id}`\n              break;\n              \n          case \"articlelist\":\n              url = `https:\/\/www.bilibili.com\/read\/readlist\/rl${id}`;\n              break      \n              \n          case \"media_bangumi\":\n              url = `https:\/\/m.bilibili.com\/bangumi\/play\/ss${id}`;\n              break\n\t}\n\treturn url\n}\n\n\/\/\u6253\u5f00\u53d1\u73b0\u94fe\u63a5\nfunction getEapi(type,id,other){\n    let offset = `{\\{if(page==1){source.put(\"nextoffset\",\"\")};source.get(\"nextoffset\");}}`;\n    let url = \"\";\n    switch(type){\n        case \"videolist\":\n            url = `https:\/\/api.bilibili.com\/x\/v2\/medialist\/resource\/list?out_referer=https%3A%2F%2Fspace.bilibili.com%2F&mobi_app=web&type=1&biz_id=${id}&ps=20&desc=true&sort_field=1&oid=${offset}&tid=0&bvid=&otype=2&with_current=false&direction=false&preview=0&use_pn=false&pn={{page}}&web_location=333.1245`;\n            break;\n        case \"space\":\n            let key = other?other.split(\"\u274c\u274c\"):[\"\",\"\"]\n            url = `https:\/\/api.bilibili.com\/x\/polymer\/web-dynamic\/v1\/feed\/space${key[0]}?host_mid=${id}&type=all&features=itemOpusStyle,listOnlyfans,opusBigCover,forwardListHidden,decorationCard,commentsNewVersion,onlyfansAssetsV2,ugcDelete,sunflowerStyle,eva3CardOpus,eva3CardVideo,eva3CardComment&page={{page}}&offset=${offset}${key[1]}`;\n            break;\n        case \"seasons_series_list\":\n            url = `https:\/\/api.bilibili.com\/x\/polymer\/web-space\/seasons_series_list?mid=${id}&page_size=20&page_num={{page}}&web_location=333.1387`;\n            break;\n                \n        }\n    \n    return url\n    \n}\n\n\nfunction getVideoQuality(code) {\n    var description = \"\";\n    switch (parseInt(code)) {\n        case 30000:\n            description = \"\u675c\u6bd4\";\n            break;\n        case 20000:\n            description = \"4K\";\n            break;\n        case 10000:\n            description = \"\u539f\u753b\";\n            break;\n        case 400:\n            description = \"\u84dd\u5149\";\n            break;\n        case 250:\n            description = \"\u8d85\u6e05\";\n            break;\n        case 150:\n            description = \"\u9ad8\u6e05\";\n            break;\n        case 80:\n            description = \"\u6d41\u7545\";\n            break;\n        default:\n            description = \"\u672a\u77e5\u6e05\u6670\u5ea6\";\n    }\n    return description;\n}\n\nfunction getSeachType(type){\n\tlet result;\n\tswitch(type){\n\t\tcase \"1\":\n    \t\tresult= \"\u756a\u5267\";\n    \t\tbreak;\n\t\tcase \"2\":\n    \t\tresult= \"\u7535\u5f71\"\n    \t\tbreak;\n\t\tcase \"3\":\n    \t\tresult= \"\u7eaa\u5f55\u7247\"\n    \t\tbreak;\n        case \"4\":\n            result= \"\u56fd\u521b\"\n            break;\n        case \"5\":\n            result= \"\u7535\u89c6\u5267\"\n            break;\n        case \"7\":\n            result= \"\u7efc\u827a\"\n            break;\n        default:\n            return \"\"\n\t\t}\n\t\treturn \"\ud83c\udfac\"+result\n}\n\nfunction getNodes(nodes){\n\t  const {java} = this;\n\t  let text = \"\";\n      let js;\n      nodes.pics?nodes.pics.forEach(pic=>{\n          text += `<img src=\"${pic.url}\">`\n      }):null;\n    nodes[0]?nodes.forEach(node=>{\n        switch(node.type || node.node_type){\n            case 1:\n            case \"TEXT_NODE_TYPE_WORD\":\n                text += node.word.words;\n            break;\n            \n            case 2:\n            case \"TEXT_NODE_TYPE_RICH\":\n                let rich = node.rich;\n                switch(rich.type){\n                    case \"RICH_TEXT_NODE_TYPE_TEXT\":\n                        text += rich.text;\n                    break;\n                    \n                   case \"RICH_TEXT_NODE_TYPE_AT\":\n                       text+=`${this.getClickImg(\"user\",rich.rid)}${rich.text.replace(\/^@\/,'')}`;\n                    break;\n                    \n                    case \"RICH_TEXT_NODE_TYPE_OGV_EP\":\n                    case \"RICH_TEXT_NODE_TYPE_OGV_SEASON\":\n                    case \"RICH_TEXT_NODE_TYPE_AV\":\n                    case \"RICH_TEXT_NODE_TYPE_BV\":\n                        text+=`\\n${this.getClickImg(\"video\",rich.rid)}${rich.text}\\n`;\n                    break;\n                    \n                    case \"RICH_TEXT_NODE_TYPE_CV\":\n                        text+=`${this.getClickImg(\"article\",rich.rid)}${rich.text}`;\n                    break;\n                    \n                    case \"RICH_TEXT_NODE_TYPE_EMOJI\":\n                        text += `<img src=\"${rich.emoji.icon_url},{style:\\\"text\\\"}\">`;\n                    break;\n                    \n                    case \"RICH_TEXT_NODE_TYPE_VIEW_PICTURE\":\n                        let pics = rich.pics;\n                        pics.forEach(pic=>{\n                            text += `<img src=\"${pic.src}\">`\n                        })\n                    break;\n                    \n                    case \"RICH_TEXT_NODE_TYPE_WEB\":\n                        text+=`${this.getClickImg(\"link\",rich.jump_url)}${rich.text}`;\n                    break;\n                    \n                    default:\n                        text += rich?.text??\"\"\n                    break;\n                }\n            break;\n         }\n     }):\"\"\n    return text\t\n}\n\nfunction getLinkCard(data){\n    const {java} = this;\n    let html = \"\";\n    let d,title,cover,desc,desc1,desc2,url;\n    let type = data.type;\n    switch(type){\n        \/\/\u89c6\u9891\n        case \"ADDITIONAL_TYPE_UGC\":\n        case \"LINK_CARD_TYPE_UGC\":\n            d = data.ugc;\n            title = `${this.getClickImg(\"video\",d.id_str)}${d.title}\\n`;\n            cover =  `${this.getClickImg(\"video\",d.id_str,d.cover,1)}\\n`;\n            let duration = \"\u65f6\u957f\uff1a\"+d.duration;\n            let play = d.desc_second;\n            html += title+cover+duration+\"  \"+play\n            break;\n            \n        case \"ADDITIONAL_TYPE_COMMON\":\n        case \"LINK_CARD_TYPE_COMMON\":\n            d = data.common;\n            title = d.title;\n            desc1 = d.desc1;\n            desc2 = d.desc2;\n            url = d.jump_url\n            cover = `${this.getClickImg(\"link\",url,d.cover,2)}\\n`;\n            html += title+cover+desc1+\"\\n\"+desc2\n        break;\n        \n        case \"ADDITIONAL_TYPE_RESERVE\":\n        case \"LINK_CARD_TYPE_RESERVE\":\n            d = data.reserve;\n            title = d.title;\n            desc1 = d.desc1.text;\n            let status = d.button.status;\n            let t = d.button.type;\n            let button;\n            \n            if(status == 1){\n                button = d.button?.uncheck?.text\n            }else{\n                button = d.button?.check?.text\n            }\n            if(t == 1){\n                button = d.button.jump_style.text;\n            }\n            let svg = `<svg width=\"180\" height=\"80\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><rect x=\"1\" y=\"1\" width=\"178\" height=\"78\" rx=\"4\" fill=\"#50B4E5\" stroke=\"#fff\" stroke-width=\"0.5\"\/><text x=\"${178\/2}\" y=\"${78\/2+12}\" text-anchor=\"middle\"  dominant-baseline=\"middle\" font-family=\"Arial, sans-serif\" font-size=\"35\" font-weight=\"bold\" fill=\"#fff\">${button}<\/text><\/svg>`;\n            svg = 'data:image\/svg+xml;base64,' + java.base64Encode(svg);\n            if(t == 1){\n                cover = this.getClickImg(\"link\",d.button.jump_url,svg,2)\n            }else{\n                cover = this.getClickImg(\"user\",d.up_mid,svg,2)\n            }\n            \n            html += cover+\"\\n\"+title+\"\\n\"+desc1\n            break\n            \n        case \"LINK_CARD_TYPE_OPUS\":\n            \/\/\u672a\u627e\u5230\u6d4b\u8bd5\u6837\u672c\n            return type+\"\u672a\u627e\u5230\u672c\u6d4b\u8bd5\u6837\u672c\uff0c\u5982\u679c\u4f60\u770b\u5230\u8fd9\u4e2a\u4fe1\u606f\uff0c\u8bf7\u628a\u8fd9\u4e2a\u8be6\u60c5\u9875\u94fe\u63a5\u7ed9\u6211\"\n            break;\n            \n        case \"LINK_CARD_TYPE_ITEM_NULL\":\n            return data..item_null.text\n            \n        default:\n           html = \"\"\n         \n    }\n    return html?\"\\n\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\\n\"+html:html\n}\n\nfunction getMajor(major){\n    const {java} = this;\n    let html = \"\";\n    let js,title,cover,id,desc,t;\n    let type = major.type;\n    switch(type){\n        case \"MAJOR_TYPE_NONE\":\n            return   \"\u8f6c\u53d1\u52a8\u6001\u5df2\u5931\u6548\"\n        \n        case \"MAJOR_TYPE_UGC_SEASON\":\n        case \"MAJOR_TYPE_ARCHIVE\":\n            let av = major?.archive ?? major.ugc_season;\n            title = av.title;\n            id = av.aid;\n            cover = av.cover;\n            if(typeof cover !== \"string\"){\n                cover = cover.cover\n            }\n            desc = av.desc;\n            t = \"video\"\n        break;\n        \n        case \"MAJOR_TYPE_LIVE\":\n        case \"LINK_CARD_TYPE_LIVE\":\n            return this.generateBadgeSVG(major,\"live\");\n            \n        case \"MAJOR_TYPE_ARTICLE\":\n            let article = major.article;\n            cover = article.covers[0]\n            title = article.title;\n            desc = article.desc;\n            id = article.id;\n            t = \"article\"\n        break;\n            \n        case \"MAJOR_TYPE_DRAW\":\n            let items = major.draw.items;\n            items.forEach(item=>{\n                html += `<img src=\"${item.src}\">`\n            });\n            return html\n        \n        case \"MAJOR_TYPE_MUSIC\":\n        case \"LINK_CARD_TYPE_MUSIC\":\n            return type\n        break;\n        \n        case \"MAJOR_TYPE_COMMON\":\n            return this.generateBadgeSVG(major)\n        \n        \/*\n        case \"MAJOR_TYPE_MUSIC\":\n            return type\n        break;\n        *\/\n        case \"MAJOR_TYPE_OPUS\":\n            let opus = major.opus.summary;\n            let rich_text_nodes = opus.rich_text_nodes;\n            let pics = major.opus?.pics || [];\n            \n            rich_text_nodes?rich_text_nodes.forEach(node=>{\n\t  \t    let nodes = [{}];\n\t  \t    nodes[0].type = \"TEXT_NODE_TYPE_RICH\";\n\t  \t    nodes[0].rich = node;  \n   \t    html += this.getNodes(nodes); \t    \n\t  \t}):null;\n          pics.forEach(x=>{\n                html += `<img src=\"${x.url}\">`\n            })\n          return html\n          \n          default:\n              return type+\"\\n\"+JSON.stringify(major)\n    }\n    \n       html +=`\\n${this.getClickImg(t,id)}${title}\\n`;\n       js = {\n               type : t,\n               js:`book?getLinkIcon(\"${t}\",\"${id}\",result):result`\n              }\n              html += cover?`\\n${this.getClickImg(t,id,cover,1)}\\n`:\"\";\n              html += desc\n    return html\n}\n\n\n\nfunction getDynamicType(type){\n\tswitch(type){\n\t\tcase \"DYNAMIC_TYPE_AV\":\n\t\treturn \"\ud83c\udfa5\"\n\t\tcase \"DYNAMIC_TYPE_UGC_SEASON\":\n\t\treturn \"\ud83d\uddc2\"\n\t\tcase \"DYNAMIC_TYPE_ARTICLE\":\n\t\treturn \"\ud83d\udcd6\"\n\t\tcase \"DYNAMIC_TYPE_LIVE\":\n\t\treturn \"\ud83d\udcfa\"\n\t\tcase \"DYNAMIC_TYPE_DRAW\":\n\t\treturn \"\ud83d\uddbc\"\n\t\tcase \"DYNAMIC_TYPE_WORD\":\n\t\treturn \"\ud83d\udcdd\"\n\t\tdefault:\n\t\treturn \"\"\n\t\t}\n\t}\n    \n    \nfunction getDynamicUrl(type,json){\n\tconst {java} = this;\n\tlet url;\n    \n\tswitch(type){\n\t\t\/\/\u8f6c\u53d1\n        case \"DYNAMIC_TYPE_COMMON_SQUARE\":\n        case  \"DYNAMIC_TYPE_FORWARD\":\n            url = this.getApi(\"forward\",this.S(\"$.id_str\"),this.S(\"$.id_str\"))\n    \t\tbreak;\n         \n         \/\/\u89c6\u9891   \n        case  \"DYNAMIC_TYPE_AV\":\n\t\tcase \"DYNAMIC_TYPE_UGC_SEASON\":\n            url = this.getApi(\"video\",this.S(\"$.modules..major..aid\"));\n            break;\n            \n\t\t\/\/\u4e13\u680f\n\t\tcase \"DYNAMIC_TYPE_ARTICLE\":\n            url = this.getApi(\"article\",this.S(\"$.basic.comment_id_str\"),this.S(\"$.id_str\"))\n\t\tbreak;\n\t\t\n\t\t\/\/\u76f4\u64ad\u95f4\u5206\u4eab\n\t\tcase \"DYNAMIC_TYPE_LIVE\":\n            java.toast(\"\u672a\u627e\u5230\u6837\u672c\u6d4b\u8bd5\uff0c\u5982\u679c\u4f60\u770b\u5230\u8fd9\u4e2a\u4fe1\u606f\uff0c\u8bf7\u628a\u590d\u5236\u8be6\u60c5\u9875\u94fe\u63a5\u7ed9\u6211\");\n            return \"\u672a\u627e\u5230\u6837\u672c\u6d4b\u8bd5\uff0c\u5982\u679c\u4f60\u770b\u5230\u8fd9\u4e2a\u4fe1\u606f\uff0c\u8bf7\u628a\u590d\u5236\u8be6\u60c5\u9875\u94fe\u63a5\u7ed9\u6211\"\n\t\tbreak;\n\t\t\n\t\t\/\/\u76f4\u64ad\u5f00\u64ad\n\t\tcase \"DYNAMIC_TYPE_LIVE_RCMD\":\n            let uid = this.S(\"$..major.live_rcmd.content\").match(\/\"uid\":(\\d+)\/)[1];\n            url = this.getApi(\"live\",uid);\n\t\tbreak;\n\t\t\n\t\t\/\/\u5176\u4ed6\u52a8\u6001\n\t\t\/*\n\t\tcase \"DYNAMIC_TYPE_DRAW\":\n\t\tcase \"DYNAMIC_TYPE_WORD\":\n\t\t*\/\n        \n\t\tdefault:\n            url = this.getApi(\"opus\",this.S(\"$.id_str\"),this.S(\"$.id_str\"))\n\t\tbreak\n\t\t}\n        return url\n\t}\n    \nfunction generateBadgeSVG(data,type) {\n  const {java} = this;\n  data = data?.common ?? data?.live\n  let badge = data.badge;\n  let jstext;\n  let width = 180;\n  let height = 80;\n  let borderRadius = 4;\n  \n  let textX = width \/ 2;\n  let textY = height \/ 2+12;\n  \n  let svg = `\n<svg width=\"${width}\" height=\"${height}\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n  <!-- \u80cc\u666f\u77e9\u5f62 -->\n  <rect\n    x=\"1\"\n    y=\"1\"\n    width=\"${width - 2}\"\n    height=\"${height - 2}\"\n    rx=\"${borderRadius}\"\n    fill=\"${badge.bg_color}\"\n    stroke=\"#fff\"\n    stroke-width=\"0.5\"\n  \/>\n  \n  <text\n    x=\"${textX}\"\n    y=\"${textY}\"\n    text-anchor=\"middle\"\n    dominant-baseline=\"middle\"\n    font-family=\"Arial, sans-serif\"\n    font-size=\"35\"\n    font-weight=\"bold\"\n    fill=\"${badge.color}\"\n  >\n    ${badge.text}\n  <\/text>\n<\/svg>`;\n\nif(!type)type = \"link\";\nlet id = type==\"live\"?data.id:data.jump_url;\n   svg = 'data:image\/svg+xml;base64,' + java.base64Encode(svg);\n   let img = `\\n${this.getClickImg(type,id,svg,2)}\u6807\u9898\uff1a${data.title}\\n\u8be6\u7ec6\uff1a${data.desc??data.desc_second}\\n${this.getClickImg(type,id,data.cover,1)}\\n`\n  return img\n}\n\n    \nfunction getReply(oid,type,mode){\n    const {java} = this;\n\tlet queryJson = `{oid:\"${oid}\",type:${type},mode:${mode},plat:1,web_location:1315875,pagination_str:JSON.stringify({\"offset\":source.get(\"nextoffset\")})}`;\n\tlet u = `https:\/\/api.bilibili.com\/x\/v2\/reply\/wbi\/main?{{if(page==1){source.put(\"nextoffset\",\"\")};getWbiEnc(${queryJson})}}`;\n\treturn u\n\t}\n\nfunction getOpus(mid,type){\n\tlet queryJson = `{host_mid:${mid},page:page,offset:source.get(\"nextoffset\"),type:\"${type}\",\"web_location\":333.1387}`;\n         let u = `https:\/\/api.bilibili.com\/x\/polymer\/web-dynamic\/v1\/opus\/feed\/space?{\\{if(page==1){source.put(\"nextoffset\",\"\")};getWbiEnc(${queryJson})}}`;    \n        return u\n\t}\n\t\nfunction getType(){\n\tlet type;\n\tif(\/\ud83d\udcd6\/.test(this.M(\"\u70b9\u51fb\u6216\u957f\u6309UP\u4e3b\"))){\n\t\t\ttype = \"article\"\n\t\t}else{\n            type = \"video\"\n        }\n     return type\n\t}\n  \n  \/\/\u7c7b\u578b,id,\u56fe\u7247\u94fe\u63a5,\u6837\u5f0f\nfunction getClickImg(type,id,src,s,t){\n    const {java} = this;\n    let jstext;\n    \n    if(src){\n        jstext = `book?getLinkIcon(\"${t??type}\",\"${id}\"):result`\n    }else{\n        src=`data:image\/svg+xml;base64,`;\n        jstext = `book?getLinkIcon(\"${t??type}\",\"${id}\"):getSvg(\"${type}\")`\n    }\n   if(s==1){\n       s = \"full\"\n   }else if(s==2){\n       s = \"default\"\n   }\n    let js = {\n        type : type,\n        js:jstext,\n        style:s??\"text\"\n       }\n     let img =  `<img src=\"${src},${JSON.stringify(js)}\">`\n     return img\n}\n\nfunction processHtml(str){\n    const {java} = this;\n    let doc = org.jsoup.Jsoup.parse(str);\n    let link,js;\n    if (!doc) {\n        return str;\n    }\n     var atag = doc.select(\"a\");\n     for (var i = 0; i < atag.size(); i++) {\n         var e = atag.get(i);\n         let link = e.attr(\"href\");\n         let text = e.text()?e.text(\"\u7f51\u9875\u94fe\u63a5\"):e.text();\n         let img =this.getClickImg(\"link\",link)+text;\n         img = img.replace(\/{.*}\/,function (match){\n             return match.replace(\/\"\/g,'&quot;')\n         });\n        \n        e.html(img);\n         \n        }\n        \n        var videocard = doc.select(\".video-card,.article-card\");\n        for (var i = 0; i < videocard.size(); i++) {\n            var e = videocard.get(i);\n            let aa = \"\";\n            let type =  \/video\/.test(e.attr(\"class\"))?\"video\":\"article\";\n            let link = e.attr(\"aid\");\n            if(\/,\/.test(link)){\n                let linkl = link.split(\",\");\n                linkl.forEach(x=>{\n                    aa+=this.getClickImg(type,x)+x+\"<br>\";\n                });\n                e.before(aa.replace(\/\"\/g,'&quot;'))\n            }else{\n             let img = this.getClickImg(type,link,e.attr(\"src\"),1);\n             img = img.match(\/src=\"(.*)\"\/)[1];\n             e.attr(\"src\",img);\n             }\n             \n         }\n         let result = String(doc.toString()).replace(\/<\\\/img>\/g,'')\n         return result\n}\n  \nfunction processDelta(data) {\n\tconst {java} = this\n    try {\n        if (!data || !Array.isArray(data)) {\n            return \"\u65e0\u6548\u7684\u6570\u636e\u683c\u5f0f\";\n        }\n        var html = \"\";\n        var prevText = \"\";\n        var js;\n        for (var i = 0; i < data.length; i++) {\n            var item = data[i];\n            var currenttext = \"\";\n            var insert = item.insert;\n            \n            if (insert) {\n                if (typeof insert === \"string\") {\n                    \n                    var attr = item.attributes ?? {};                   \n                        if (attr.link) {\n                            html += `${this.getClickImg(\"link\",attr.link)}${insert}`\n                        }else{\n                        html += insert\n                    }\n                }else if(typeof insert == \"object\"){                 \n                    let image = insert[\"native-image\"];\n                    if(image){                \t\t\t\n                        html += `<img src=\"${image.url}\">\\n`\n                \t}\n                    \n                    let cut_off = insert[\"cut-off\"];\n                    if(cut_off){\n                        html += \"\\n&lrm;\\n\";\n                    }\n                \t\t\n                    let article_card = insert[\"article-card\"];\n                    if(article_card){\n                        html += `${this.getClickImg(\"article\",article_card.id,article_card.url,1)}\\n`\n                      }\n                      \n                      let video_card = insert[\"video-card\"];\n                \t  if(video_card){\n                \t\t\thtml += `${this.getClickImg(\"video\",video_card.id,video_card.url,1)}\\n`\n                \t  }\n                }\n            }\n        }\n        return html;\n        \n    } catch (error) {\n        java.log(\"\u6784\u5efaHTML\u65f6\u51fa\u9519: \" + error);\n        return \"\u5904\u7406\u6570\u636e\u65f6\u53d1\u751f\u9519\u8bef\";\n    }\n}\n\n\nfunction M(e){\n    const {source} = this;\n    let m = source.getLoginInfoMap();\n    return String(m[e])\n\t}\n    \nfunction liveToUser(url){\n    const {java} = this;\n    let uid = JSON.parse(java.ajax(url)).data.uid;\n    return this.getApi(\"live\",uid);\n}\n\nfunction getLinkIcon(type,link){\n\t  const {java} = this\n      \n      let url = \"\";\n        switch(type){\n            case \"link\":\n                java.startBrowser(link, \"\");\n                return;\n                \n            case \"live\":\n                url = `https:\/\/api.live.bilibili.com\/room\/v1\/Room\/get_info?room_id=${link}`;\n                url = this.liveToUser(url);\n                break;\n                \n            case \"video\":\n                let aid = link.includes(\"BV1\")?String(bv2av(link)):link;\n             \/\/   java.log(aid)\n                url = this.getApi(type,aid)\n                break;\n                \n            case \"article\":\n                url = this.getApi(type,link,link)\n                break;\n                \n            case \"articlelist\":\n                url = \"https:\/\/api.bilibili.com\/x\/article\/list\/web\/articles?id=\"+link;\n                \n                break\n                \n            case \"user\":\n                 url = this.getApi(type,link)\n                 break\n        }\n        if(\/\"js\"\/.test(url)){\n            let u = url.match(\/,{\"js\".*\/)[0].replace(\/\"}\/,'\",origin:\\\"\u54d4\u54e9\u54d4\u54e9\\\"}');\n            url = url.replace(\/,{\"js\".*\/,'')+u;\n            \n            url = \"legado:\/\/import\/addToBookshelf?src=\"+encodeURIComponent(url)\n\n            \n        }else{\n        \n        \n        url = \"legado:\/\/import\/addToBookshelf?src=\"+encodeURIComponent(url)+\",{origin:\\\"\u54d4\u54e9\u54d4\u54e9\\\"}\";\n        }\n        java.openUrl(url);\n        return;\n}\n\nfunction getSvg(type){\n    const {java} = this;\n    let t = \"\ud83d\udd17\";\n    if(type == \"link\")t = \"\ud83d\udd17\";;\n    if(type ==\"video\")t=\"\ud83c\udfa5\";\n    if(type == \"article\")t=\"\ud83d\udcd6\";\n    if(type==\"user\")t=\"\ud83d\udc64\";\n    let svg = `\n  <svg width=\"32\" height=\"32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n    <text x=\"16\" y=\"27\" font-family=\"Roboto Condensed\" text-anchor=\"middle\" dominant-baseline=\"middle\" font-size=\"24\" font-weight=\"bold\" fill=\"#555\">\n    ${t}\n    <\/text>\n  <\/svg>`;\n  \n    return \"data:image\/svg+xml;base64,\" + java.base64Encode(svg);\n}\n\nfunction getIs(type){\n\tconst {java,chapter,cache,book} = this;\n    let url,name,data,mid,is_followed,bmid;\n   \n    if(book){\n        is_followed = \"\";\n        mid = String(cache.get(\"mid\"));\n        bmid = String(book.getVariable(\"mid\"));\n        mid = bmid?bmid:mid\n        if(mid){\n            url = this.getApi(\"user\",mid);\n            is_followed = String(JSON.parse(java.ajax(url)).data.is_followed);\n            if(is_followed == \"true\"){\n                name = \"\ud83c\udd99 \u5df2\u5173\u6ce8\";\n                cache.put(\"up\",1)\n            }else{\n                name = \"\ud83c\udd99 \u5173\u6ce8\"\n                cache.put(\"up\",0)\n            }\n       }\n    \n\tif(chapter){\n       let aid = this.b64D(chapter.url).split(\"&\")[0];\n       switch(type){\n       \t      case \"like\":\n       \t           url = \"https:\/\/api.bilibili.com\/x\/web-interface\/archive\/has\/like?aid=\"+aid;\n                      data = JSON.parse(java.ajax(url)).data;\n                      if(data == 1){\n                          name = \"\ud83d\udc4d\ud83c\udffb \u5df2\u70b9\u8d5e\"\n                          cache.put(\"like\",1,300)\n                      }else{\n                          name = \"\ud83d\udc4d\ud83c\udffb \u70b9\u8d5e\"\n                          cache.put(\"like\",0,300)\n                      }\n       \t      break\n       \t      case \"coin\":\n                      url = \"https:\/\/api.bilibili.com\/x\/web-interface\/archive\/coins?aid=\"+aid;\n                      data = JSON.parse(java.ajax(url)).data.multiply;\n                      cache.put(\"coin\",data,300)\n                      if(data == 0){\n                          name = \"\ud83e\ude99 \u6295\u5e01\"                  \n                      }else{\n                          name = \"\ud83e\ude99 \u5df2\u6295\"+data+\"\u679a\"\n                      }\n       \t      break\n       \t      case \"fav\":\n                     url = \"https:\/\/api.bilibili.com\/x\/v2\/fav\/video\/favoured?aid=\"+aid;\n                      data = JSON.parse(java.ajax(url)).data.favoured;\n                      if(data == true){\n                          name = \"\u2b50\ufe0f \u5df2\u6536\u85cf\"\n                          cache.put(\"fav\",1,300)\n                      }else{\n                          name = \"\u2b50\ufe0f \u6536\u85cf\"\n                          cache.put(\"fav\",0,300)\n                      }\n       \t}\n         }  \n\t}\nreturn name\t\n\t}\n    \nfunction b64D(s){\n\t\tconst {java} = this;\n\t\t  let str = s.match(\/base64,(.*?),\/)[1];\n\t\t  return String(java.base64Decode(str))\n}\n\nfunction S(s){\n\tconst {java} = this;\n\treturn String(java.getString(s))\n}\n\n\n\/*\nconst XOR_CODE = 23442827791579n; const MASK_CODE = 2251799813685247n; const MAX_AID = 1n << 51n; const BASE = 58n; const data = 'FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf';\n\n function av2bv(aid) { const bytes = ['B', 'V', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0']; let bvIndex = bytes.length - 1; let tmp = (MAX_AID | BigInt(aid)) ^ XOR_CODE; while (tmp > 0) { bytes[bvIndex] = data[Number(tmp % BigInt(BASE))]; tmp = tmp \/ BASE; bvIndex -= 1; } [bytes[3], bytes[9]] = [bytes[9], bytes[3]]; [bytes[4], bytes[7]] = [bytes[7], bytes[4]]; return bytes.join(''); }\n \nfunction bv2av(bvid) { const bvidArr = Array.from(bvid); [bvidArr[3], bvidArr[9]] = [bvidArr[9], bvidArr[3]]; [bvidArr[4], bvidArr[7]] = [bvidArr[7], bvidArr[4]]; bvidArr.splice(0, 3); const tmp = bvidArr.reduce((pre, bvidChar) => pre * BASE + BigInt(data.indexOf(bvidChar)), 0n); return Number((tmp & MASK_CODE) ^ XOR_CODE); } \n\n*\/\n\nconst XOR_CODE = 23442827791579; const MASK_CODE = 2251799813685247; const MAX_AID = 2251799813685248; const BASE = 58; const data = 'FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf'; function av2bv(aid) { var bytes = ['B','V','1','0','0','0','0','0','0','0','0','0']; var bvIndex = 11; var aidNum = Number(aid); var tmp = bitwiseXor(bitwiseOr(MAX_AID, aidNum), XOR_CODE); while (tmp > 0) { bytes[bvIndex] = data[tmp % BASE]; tmp = Math.floor(tmp \/ BASE); bvIndex--; } var temp = bytes[3]; bytes[3] = bytes[9]; bytes[9] = temp; temp = bytes[4]; bytes[4] = bytes[7]; bytes[7] = temp; return bytes.join(''); } function bv2av(bvid) { var bvidArr = bvid.split(''); var temp = bvidArr[3]; bvidArr[3] = bvidArr[9]; bvidArr[9] = temp; temp = bvidArr[4]; bvidArr[4] = bvidArr[7]; bvidArr[7] = temp; bvidArr.splice(0, 3); var tmp = 0; for (var i = 0; i < bvidArr.length; i++) { tmp = tmp * BASE + data.indexOf(bvidArr[i]); } return bitwiseXor(bitwiseAnd(tmp, MASK_CODE), XOR_CODE); } function bitwiseOr(a, b) { var highA = Math.floor(a \/ 4294967296); var lowA = a & 4294967295; var highB = Math.floor(b \/ 4294967296); var lowB = b & 4294967295; var resultHigh = highA | highB; var resultLow = lowA | lowB; return resultHigh * 4294967296 + resultLow; } function bitwiseAnd(a, b) { var highA = Math.floor(a \/ 4294967296); var lowA = a & 4294967295; var highB = Math.floor(b \/ 4294967296); var lowB = b & 4294967295; var resultHigh = highA & highB; var resultLow = lowA & lowB; return resultHigh * 4294967296 + resultLow; } function bitwiseXor(a, b) { var highA = Math.floor(a \/ 4294967296); var lowA = a & 4294967295; var highB = Math.floor(b \/ 4294967296); var lowB = b & 4294967295; var resultHigh = highA ^ highB; var resultLow = lowA ^ lowB; return resultHigh * 4294967296 + resultLow; }\n\n\n  \nfunction danmakuToLRC(xmlString, options = {}) {\n  let {\n    sortByTime = true,      \n    timeFormat = 's',       \n    includeMeta = true,     \n    escapeChars = true \n  } = options;\n  \n  let danmakuPattern = new RegExp('<d\\\\s+p=\"([^\"]+)\">(.*?)<\/d>', 'g');\n  let danmakus = [];\n  let match;\n  \n  while ((match = danmakuPattern.exec(xmlString)) !== null) {\n    let pAttribute = match[1];\n    let textContent = match[2];\n    let parts = pAttribute.split(',');\n    \n    if (parts.length >= 9) {\n      let time = parseFloat(parts[0]);  \n      let text = escapeChars \n        ? textContent.replace(\/\\[\/g, '\u3010').replace(\/\\]\/g, '\u3011')\n        : textContent;\n      \n      danmakus.push({ time, text });\n    }\n  }\n  \n  if (sortByTime) {\n    danmakus.sort((a, b) => a.time - b.time);\n  }\n  \n  let lrcContent = '';\n  \n  if (includeMeta) {\n    lrcContent += '[ti:\u5f39\u5e55\u6b4c\u8bcd]\\n';\n    lrcContent += '[ar:Bilibili\u5f39\u5e55]\\n';\n    lrcContent += `[re:\u5171${danmakus.length}\u6761\u5f39\u5e55]\\n`;\n    lrcContent += `[by:danmaku-to-lrc ${new Date().toISOString().split('T')[0]}]\\n\\n`;\n  }\n  \n  danmakus.forEach((danmaku, index) => {\n    let timeTag = '';\n    let minutes,seconds;\n    if (timeFormat === 'ms') {\n      let totalMs = danmaku.time * 1000;\n      minutes = Math.floor(totalMs \/ 60000);\n      seconds = Math.floor((totalMs % 60000) \/ 1000);\n      let milliseconds = Math.floor(totalMs % 1000);\n      timeTag = `[${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}.${milliseconds.toString().padStart(3, '0')}]`;\n    } else {\n      minutes = Math.floor(danmaku.time \/ 60);\n      seconds = danmaku.time % 60;\n      timeTag = `[${minutes.toString().padStart(2, '0')}:${seconds.toFixed(2).padStart(5, '0')}]`;\n    }\n    \n    lrcContent += `${timeTag}${danmaku.text}\\n`;\n  });\n  \n  return lrcContent;\n}\n\n\/*\nfunction modifyDanmaku(xmlStr, fontSize) {\n    if (!xmlStr) return xmlStr;\n    var size = Math.max(1, parseInt(fontSize) || 25);\n    return xmlStr.replace(\n        \/<d p=\"([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+)\">\/g,\n        function(match, t1, t2, t3, t4, t5, t6, t7, t8, t9) {\n            \n            return `<d p=\"${t1},${t2},${size},${t4},${t5},${t6},${t7},${t8},${t9}\">`;\n        }\n    );\n}\n*\/\n\nfunction modifyDanmaku(xmlStr, fontSize) {\n    if (!xmlStr) return xmlStr;\n    \n    var size = Math.max(1, parseInt(fontSize) || 25);\n    var count = 0;\n    \n    \/\/ \u4f7f\u7528\u4e00\u4e2a\u6b63\u5219\u8868\u8fbe\u5f0f\u540c\u65f6\u5904\u7406\u4e24\u4e2a\u529f\u80fd\n    var result = xmlStr.replace(\n        \/(<d p=\"[^\"]+\">[^<]*<\\\/d>)\/g,\n        function(match) {\n            if (count >= 1500) {\n                return '';\n            }\n            count++;\n            \n            \/\/ \u4fee\u6539\u5b57\u4f53\u5927\u5c0f\n            return match.replace(\n                \/<d p=\"([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+)\">\/,\n                `<d p=\"$1,$2,${size},$4,$5,$6,$7,$8,$9\">`\n            );\n        }\n    );\n    \n    return result;\n}\n\n\nfunction generateMPD(Data) {\n    \n    let video = Data.video;\n    let videoData;\n    \n    \n    for(let i=1;i<video.length;i++){\n    \tif(video[i].codecid === 7){\n            \n    \t\tvideoData = video[i];\n    \t\tbreak\n\t\t}\n\t}\n    \n    let audioData = Data.audio[1];\n    let duration = Data.duration;\n    const videoBaseUrl = videoData.baseUrl;\n    const audioBaseUrl = audioData.baseUrl;\n    \n    const videoSegmentBase = videoData.segment_base || videoData.SegmentBase;\n    const audioSegmentBase = audioData.segment_base || audioData.SegmentBase;\n    \n    const videoInitRange = videoSegmentBase.initialization || videoSegmentBase.Initialization;\n    const videoIndexRange = videoSegmentBase.index_range || videoSegmentBase.indexRange;\n    \n    const audioInitRange = audioSegmentBase.initialization || audioSegmentBase.Initialization;\n    const audioIndexRange = audioSegmentBase.index_range || videoSegmentBase.indexRange;\n    \n    \/\/ \u5c06duration\u683c\u5f0f\u5316\u4e3aISO 8601\u6301\u7eed\u65f6\u95f4\u683c\u5f0f\n    \/\/ duration\u5e94\u4e3a\u79d2\u6570\uff0c\u683c\u5f0f\u5316\u4e3aPTxS\u683c\u5f0f\n    const durationStr = \"PT\" + duration + \"S\";\n    \n    const mpdContent = `<MPD xmlns=\"urn:mpeg:dash:schema:mpd:2011\" profiles=\"urn:mpeg:dash:profile:full:2011\" type=\"static\" mediaPresentationDuration=\"${durationStr}\" minBufferTime=\"PT1.5S\">\n    <Period id=\"0\" start=\"PT0.0S\">\n        <AdaptationSet id=\"0\" contentType=\"video\" width=\"${videoData.width}\" height=\"${videoData.height}\" frameRate=\"${videoData.frameRate || videoData.frame_rate}\" par=\"${videoData.sar}\" segmentAlignment=\"true\">\n            <Representation id=\"${videoData.id}\" bandwidth=\"${videoData.bandwidth}\" codecs=\"${videoData.codecs}\" mimeType=\"${videoData.mimeType || videoData.mime_type}\">\n                <BaseURL>${videoBaseUrl.replace(\/&\/g,'&amp;')}<\/BaseURL>\n                <SegmentBase indexRange=\"${videoIndexRange}\">\n                    <Initialization range=\"${videoInitRange}\"\/>\n                <\/SegmentBase>\n            <\/Representation>\n        <\/AdaptationSet>\n        <AdaptationSet id=\"1\" contentType=\"audio\" segmentAlignment=\"true\">\n            <Representation id=\"${audioData.id}\" bandwidth=\"${audioData.bandwidth}\" codecs=\"${audioData.codecs}\" mimeType=\"${audioData.mimeType || audioData.mime_type}\">\n                <BaseURL>${audioBaseUrl.replace(\/&\/g,'&amp;')}<\/BaseURL>\n                <SegmentBase indexRange=\"${audioIndexRange}\">\n                    <Initialization range=\"${audioInitRange}\"\/>\n                <\/SegmentBase>\n            <\/Representation>\n        <\/AdaptationSet>\n    <\/Period>\n<\/MPD>`;\n    \n    return mpdContent;\n}\n\nfunction formatTimeDynamic(totalSeconds) {\n  const hours = Math.floor(totalSeconds \/ 3600);\n  const remainingSeconds = totalSeconds % 3600;\n  const minutes = Math.floor(remainingSeconds \/ 60);\n  const seconds = remainingSeconds % 60;\n  \n  const parts = [];\n  \n  if (hours > 0) {\n    parts.push(hours.toString().padStart(2, '0'));\n  }\n  \n  \/\/ \u5982\u679c\u6709\u5c0f\u65f6\uff0c\u5206\u949f\u5fc5\u987b\u662f2\u4f4d\n  if (hours > 0) {\n    parts.push(minutes.toString().padStart(2, '0'));\n  } else {\n    parts.push(minutes.toString()); \/\/ \u4e0d\u8db31\u5c0f\u65f6\uff0c\u5206\u949f\u4e0d\u9700\u8981\u88650\n  }\n  \n  parts.push(seconds.toString().padStart(2, '0'));\n  \n  return parts.join(':');\n}\n\nfunction formatCount(count) {\n  if (count < 10000) return count.toString();  \n  const inWan = (count \/ 10000).toFixed(2);\n  return inWan.endsWith('.00') \n    ? `${inWan.split('.')[0]}\u4e07` \n    : `${inWan}\u4e07`;\n}\n\n function getWbiEnc(queryJson) {\n     const {java} = this;\n    const mixinKeyEncTab = [\n        46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49,\n        33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40,\n        61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11,\n        36, 20, 34, 44, 52\n    ];\n\n    \/\/ \u5bf9 imgKey \u548c subKey \u8fdb\u884c\u5b57\u7b26\u987a\u5e8f\u6253\u4e71\u7f16\u7801\n    function getMixinKey(orig) {\n        let temp = '';\n        mixinKeyEncTab.forEach((n) => {\n            temp += orig[n]\n        });\n        return temp.slice(0, 32);\n    }\n\n    \/\/ \u4e3a\u8bf7\u6c42\u53c2\u6570\u8fdb\u884c wbi \u7b7e\u540d\n    function encWbi(params, img_key, sub_key) {\n        const mixin_key = getMixinKey(img_key + sub_key),\n            curr_time = Math.round(Date.now() \/ 1000),\n            chr_filter = \/[!'\\(\\)*]\/g\n        let query = [];\n        params = Object.assign(params, { wts: curr_time });    \/\/ \u6dfb\u52a0 wts \u5b57\u6bb5\n        \/\/ \u6309\u7167 key \u91cd\u6392\u53c2\u6570\n        Object.keys(params).sort().forEach((key) => {\n            query.push(\n                encodeURIComponent(key) +\n                '=' +\n                \/\/ \u8fc7\u6ee4 value \u4e2d\u7684 \"!'()*\" \u5b57\u7b26\n                encodeURIComponent(('' + params[key]).replace(chr_filter, ''))\n            )\n        })\n        query = query.join('&');\n        const wbi_sign =String(java.md5Encode(query + mixin_key)); \/\/ \u8ba1\u7b97 w_rid\n        return query + '&w_rid=' + wbi_sign;\n    }\n\n    \/\/ \u83b7\u53d6\u6700\u65b0\u7684 img_key \u548c sub_key\n    function getWbiKeys() {\n        const json_content = JSON.parse(java.ajax('https:\/\/api.bilibili.com\/x\/web-interface\/nav')).data;\n        let img_url = json_content.wbi_img.img_url;\n        let sub_url = json_content.wbi_img.sub_url;\n        return {\n            img_key: img_url.substring(img_url.lastIndexOf('\/') + 1, img_url.length).split('.')[0],\n            sub_key: sub_url.substring(sub_url.lastIndexOf('\/') + 1, sub_url.length).split('.')[0]\n        }\n    }\n\n    const wbi_keys = getWbiKeys();\n\n    const query = encWbi(\n        queryJson,\n        wbi_keys.img_key,\n        wbi_keys.sub_key\n    );\n    return query;\n}\n","lastUpdateTime":"1768726109906","loginCheckJs":"if(typeof java.readBookConfig == \"undefined\"){\tjava.startBrowser(\"https:\/\/loyc.xyz\/c\/legado.html#download\", \"\u4e0b\u8f7d\u9605\u8bfb\u03a3\u6700\u65b0\u6d4b\u8bd5\u7248\");\n\tjava.longToast(\"\u672c\u4e66\u6e90\u53ea\u652f\u6301\u6700\u65b0\u7248\u6d1b\u96c5\u6a59\u6539\u7248\u9605\u8bfb\u03a3\\n\u8bf7\u5b89\u88c5\u540e\u91cd\u65b0\u5bfc\u5165\u4e66\u6e90\")\n\t}\nresult","loginUi":"@js:\n\nlet all = [\n {\n        \"name\": \"\u6a21\u5f0f\",\n        \"type\": \"select\",\n        \"action\":\"test()\",\n        \"chars\": [\"\ud83c\udfa5 \u89c6 \u9891\", \"\ud83c\udfa7 \u97f3 \u9891\"],\n        \"default\": \"\ud83c\udfa5 \u89c6 \u9891\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.3\n           }\n    },\n    {\n        \"name\": \"\u70b9\u51fb\u957f\u6309UP\u4e3b\",\n        \"type\": \"select\",\n        \"chars\": [\"\ud83c\udfac \u663e\u793a\u89c6\u9891\", \"\ud83d\udcd6 \u663e\u793a\u4e13\u680f\"],\n        \"default\": \"\ud83c\udfac \u663e\u793a\u89c6\u9891\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.5\n           }\n      },  {\n        \"name\": \"\ud83d\udc64\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"toLogin()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n           }\n    }]\n  \nlet mid = String(cache.get(\"mid\"));\nif(book && !chapter){\n\tlet bmid = String(book.getVariable(\"mid\"));\n\tmid = bmid?bmid:mid;\n    all.push({\n        \"name\":\"\u5408\u96c6\",\n        \"type\": \"toggle\",\n        \"chars\": [\"\u2b07\ufe0f\u3010\u6b63\u5e8f\u3011\", \"\u2b06\ufe0f\u3010\u5012\u5e8f\u3011\"],\n        \"default\": \"\u2b07\ufe0f\u3010\u6b63\u5e8f\u3011\",\n        \"action\":\"java.refreshBookInfo()\",\n        \"style\": {\n               \"layout_flexGrow\": 1,\n               \"layout_flexBasisPercent\": 0.4\n           }\n    });\n    if(mid){\n        all.push({\n            \"name\": \"\ud83c\udd99 \u5173\u6ce8\",\n           \"viewName\": `getIs()`,\n           \"action\":`toLcf('up',\"${mid}\")`,\n           \"type\": \"button\",\n           \"style\": {\n               \"layout_flexGrow\": 1,\n               \"layout_flexBasisPercent\": 0.4\n           }\n       },{\n            \"name\": \"\ud83c\udd99\u52a0\u5165\u4e66\u67b6\",\n           \"action\":`addShlef(\"${mid}\")`,\n           \"type\": \"button\",\n           \"style\": {\n               \"layout_flexGrow\": 1,\n               \"layout_flexBasisPercent\": 0.4\n           }\n       })\n    }\n}\n\nif(chapter){\n\t  if(!\/x\\\/article|data:liveurl\/.test(chapter.url)){\n          let mymid = JSON.parse(java.ajax(\"https:\/\/api.bilibili.com\/x\/web-interface\/nav\"))?.data?.mid || \"\";\n          if(mymid!=\"\"){\n              aid = String(java.base64Decode(String(chapter.url).match(\/base64,(.*?),\/)[1])).split(\"&\")[0];\n          let button = [{\n              \"name\": \"\u5f53\u524d\u89c6\u9891\uff1a\"+chapter.title,\n              \"type\": \"text\"\n             },\n             {\n                       \"name\": \"\ud83d\udcac\u53d1\u8868\u8bc4\u8bba\",\n                       \"action\": `goCo(${aid},\\`${chapter.title}\\`)`,\n                       \"type\": \"button\",\n                       \"style\": {\n                           \"layout_flexGrow\": 1,\n                           \"layout_flexBasisPercent\": 1\n                          }\n              },\n             {\n                 \"name\": \"\ud83d\udc4d\ud83c\udffb \u70b9\u8d5e\",\n                 \"viewName\": `getIs('like')`,\n                 \"action\":\"toLcf('like')\",\n                 \"type\": \"button\",\n                 \"style\": {\n                     \"layout_flexGrow\": 1,\n                     \"layout_flexBasisPercent\": 0.25\n                    }\n                },\n                {\n                    \"name\": \"\u2b50\ufe0f \u6536\u85cf\",\n                    \"viewName\": `getIs('fav')`,\n                    \"type\": \"button\",\n                    \"action\":\"toLcf('fav')\",\n                    \"style\": {\n                        \"layout_flexGrow\": 1,\n                        \"layout_flexBasisPercent\": 0.25\n                     }\n                 },\n                 {\n                     \"name\": \"\ud83e\ude99 \u6295\u5e01\",\n                     \"viewName\": `getIs('coin')`,\n                     \"type\": \"button\",\n                     \"action\":\"toLcf('coin')\",\n                     \"style\": {\n                         \"layout_flexGrow\": 1,\n                         \"layout_flexBasisPercent\": 0.25\n                      }\n                   },\n                   {\n                       \"name\": \"\u4e00\ud83d\udc4d\ud83c\udffb\u952e\ud83e\ude99\u4e09\u2b50\ufe0f\u8fde\",\n                       \"action\": `toLcf('all')`,\n                       \"type\": \"button\",\n                       \"style\": {\n                           \"layout_flexGrow\": 1,\n                           \"layout_flexBasisPercent\": 1\n                          }\n                      }]\n                      all = all.concat(button)\n           }\n      }\n}\n\n\n\nresult = JSON.stringify(all);\nsource.putLoginInfo(result);\nresult","loginUrl":"function login(){\n\tsource.refreshExplore();\n\t}\n\nfunction addShlef(id,type){\n\tgetLinkIcon(\"user\",id)\n\t}\n\t\n\t\nfunction toLogin(){\n\tlet url = \"https:\/\/www.bilibili.com\";\n\tcookie.setCookie(url,\"\");\n\tjava.longToast(\"\u767b\u5f55\u540e\u8bf7\u70b9\u2713\");\n\ttry{\n\tjava.startBrowserAwait(url,\"\u767b\u5f55\").body();\n\tco = String(cookie.getCookie(\"https:\/\/www.bilibili.com\"));\n setHeaders(\"cookie=\"+encodeURIComponent(co));\n\t}catch(e){\n\t\tjava.longToast(\"\u4f60\u767b\u5f55\u597d\u50cf\u6ca1\u6709\u70b9\u2713\\n\u8bf7\u91cd\u65b0\u8fdb\u767b\u5f55\u7f51\u9875\uff0c\u767b\u5f55\u540e\u70b9\u2713\");\n\t\t}\n \n\t}\n\nfunction toLcf(type,mid){\n\tlet url,name,data,aid;\n    try{\t\n       let info = source.getLoginInfoMap();\n       let csrf = String(cookie.getKey(\"https:\/\/www.bilibili.com\",\"bili_jct\"));\n       let b64 = chapter?chapter.url:\"\";\n       let aid = b64?this.b64D(b64).split(\"&\")[0]:\"\";\n       let isLcy = Number(cache.get(type));\n       \n       switch(type){\n       \t      case \"like\":\n       \t           isLcy = isLcy==1?2:1       \t            \n       \t           url = \"https:\/\/api.bilibili.com\/x\/web-interface\/archive\/like,\"+JSON.stringify({\n                          \"method\":\"POST\",\n                          \"body\":\"aid=\"+aid+\"&like=\"+isLcy+\"&csrf=\"+ csrf\n                      });\n                      data = java.ajax(url);\n                      code = JSON.parse(data).code;\n                      if(code == 0){\n                      \t   if(isLcy == 2){\n                      \t   \t    info[\"\ud83d\udc4d\ud83c\udffb \u70b9\u8d5e\"] = \"\ud83d\udc4d\ud83c\udffb \u70b9\u8d5e\";\n                      \t   \t    java.toast(\"\u5df2\u53d6\u6d88\u70b9\u8d5e\");\n                      \t   \t    cache.put(type,0,300)\n                      \t   \t}else if(isLcy == 1){\n                      \t   \t\t   info[\"\ud83d\udc4d\ud83c\udffb \u70b9\u8d5e\"] = \"\ud83d\udc4d\ud83c\udffb \u5df2\u70b9\u8d5e\";\n                                        java.toast(\"\u5df2\u70b9\u8d5e\");\n                                        cache.put(type,1,300)\n                       \t\t}\n                      }else if(code == 65004){\n                      \t   \t    code = JSON.parse(java.ajax(url.replace(\/like=2\/,'like=1'))).data.code;\n                      \t   \t    if(code == 0){\n                      \t   \t    \t    java.toast(\"\u5df2\u70b9\u8d5e\");\n                                             cache.put(type,1,300)\n                      \t   \t    \t}\n                       }else if(code == 65006){\n                      \t   \t    code = JSON.parse(java.ajax(url.replace(\/like=1\/,'like=2'))).data.code;\n                      \t   \t    if(code == 0){\n                      \t   \t    \t    java.toast(\"\u5df2\u53d6\u6d88\u70b9\u8d5e\");\n                                             cache.put(type,0,300)\n                      \t   \t    \t}\n                         }else{\n                               java.toast(JSON.parse(data).message)\n                         }\n       \t      break\n       \t      case \"coin\":\n                     url = \"https:\/\/api.bilibili.com\/x\/web-interface\/coin\/add,\"+JSON.stringify({\n                          \"method\":\"POST\",\n                          \"body\":\"multiply=1&del_media_ids=&aid=\"+aid+\"&csrf=\"+ csrf\n                          });\n                      if(isLcy==2){\n                          java.toast(\"\u8be5\u89c6\u9891\u5df2\u8fbe\u6295\u5e01\u4e0a\u9650\")\n                      }else{\n                          data = java.ajax(url);\n                          code = JSON.parse(data).code;\n                          if(code == 0){\n                                isLcy += 1;\n                                info[\"\ud83e\ude99 \u6295\u5e01\"] = \"\ud83e\ude99 \u5df2\u6295\"+isLcy+\"\u679a\";\n                                java.toast(\"\u6210\u529f\u6295\u5e011\u679a\");\n                                cache.put(type,isLcy,300)\n                          }else{\n                              java.toast(JSON.parse(data).message)\n                          }\n                      }\n       \t      break\n       \t      case \"fav\":\n                       let n = isLcy ==1?\"add_media_ids=&del_media_ids=0\":\"add_media_ids=0&del_media_ids=\";\n                       \n              \t     url = \"https:\/\/api.bilibili.com\/medialist\/gateway\/coll\/resource\/deal,\"+JSON.stringify({\n                          \"method\":\"POST\",\n                          \"body\":n+\"&rid=\"+aid+\"&type=2\"+\"&csrf=\"+ csrf\n                          });\n                      data = java.ajax(url);\n                      code = JSON.parse(data).code;\n                      if(code == 0){\n                          if(isLcy == 0){\n                               info[\"\u2b50\ufe0f \u6536\u85cf\"] = \"\u2b50\ufe0f \u5df2\u6536\u85cf\"\n                      \t     java.toast(\"\u5df2\u6536\u85cf\u81f3\u9ed8\u8ba4\u6536\u85cf\u5939\");\n                      \t     cache.put(type,1,300)\n                          }else if(isLcy == 1){\n                               info[\"\u2b50\ufe0f \u6536\u85cf\"] = \"\u2b50\ufe0f \u6536\u85cf\"\n                      \t     java.toast(\"\u5df2\u4ece\u9ed8\u8ba4\u6536\u85cf\u5939\u53d6\u6d88\");\n                      \t     cache.put(type,0,300)\n                         }\n                      }else{\n                          java.toast(JSON.parse(data).message)\n                      }\n                     break;\n                     case \"all\":\n                         url = \"https:\/\/api.bilibili.com\/x\/web-interface\/archive\/like\/triple,\"+JSON.stringify({\n                             \"method\":\"POST\",\n                             \"body\":\"aid=\"+aid+\"&csrf=\"+csrf\n                         });\n                         data = java.ajax(url);\n                         code = JSON.parse(data).code;\n                         if(code == 0){\n                             info[\"\ud83d\udc4d\ud83c\udffb \u70b9\u8d5e\"] = \"\ud83d\udc4d\ud83c\udffb \u5df2\u70b9\u8d5e\"\n                             info[\"\u2b50\ufe0f \u6536\u85cf\"] = \"\u2b50\ufe0f \u5df2\u6536\u85cf\"\n                             info[\"\ud83e\ude99 \u6295\u5e01\"] = \"\ud83e\ude99 \u5df2\u62952\u679a\"\n                             java.toast(\"\ud83d\udc4d\ud83c\udffb\ud83e\ude99\u2b50\ufe0f\u4e00\u952e\u4e09\u8fde\u6210\u529f\")\n                         }else{\n                             java.toast(JSON.parse(data).message)\n                         }\n                     break;\n                     \n                     case \"up\":\n                          isLcy = isLcy==1?2:1;\n                          url = \"https:\/\/api.bilibili.com\/x\/relation\/modify,\"+JSON.stringify({\n                          \"method\":\"POST\",\n                          \"body\":\"fid=\"+mid+\"&act=\"+isLcy+\"&csrf=\"+ csrf\n                      });\n                      data = java.ajax(url);\n                      code = JSON.parse(data).code;\n                      if(code == 0){\n                          if(isLcy == 1){\n                               info[\"\ud83c\udd99 \u5173\u6ce8\"] = \"\ud83c\udd99 \u5df2\u5173\u6ce8\"\n                      \t     java.toast(\"\u5df2\u5173\u6ce8\u81f3\u9ed8\u8ba4\u5206\u7ec4\");\n                      \t     cache.put(type,1,300)\n                          }else if(isLcy == 2){\n                               info[\"\ud83c\udd99 \u5173\u6ce8\"] = \"\ud83c\udd99 \u5173\u6ce8\"\n                      \t     java.toast(\"\u5df2\u4ece\u9ed8\u8ba4\u5206\u7ec4\u53d6\u6d88\u5173\u6ce8\");\n                      \t     cache.put(type,0,300)\n                         }\n                      }else{\n                          java.toast(JSON.parse(data).message)\n                      }\n                         break\n       \t}\n           java.upLoginData(info)\n         }catch(e){\n             java.log(e)\n             \n         }\n\t\n\t}","respondTime":180000,"ruleBookInfo":{"author":"$.owner.name||$.author.name\n<js>\nif(\/acc\\\/info\/.test(baseUrl)){\n\tresult = \"\u67e5\u770b\u5168\u90e8\u52a8\u6001\"\n\t}else if(\/season_id=\/.test(baseUrl)){\n\t\tresult = \"\u67e5\u770b\u7cfb\u5217\u89c6\u9891\"\n\t\t}\nresult\n<\/js>","canReName":"1","coverUrl":"$.pic||$..origin_image_urls[0]||$.list.image_urls[0]||$.list.image_url||$.face||$.cover.url||$.cover","init":"<js>\nif(S(\"$.message\")!=0 &&S(\"$.message\")!=\"success\" && S(\"$.message\")!=\"OK\"){\n\tjava.toast(\"\\n\u274c\"+S(\"$.message\")+\"\\n\"+\"\u8bf7\u5c1d\u8bd5\u767b\u5f55\u540e\u8fdb\u76f4\u64ad\u95f4\");\n\t}\n\nif((\/,\"type\":1}}}\/.test(result) ||S(\"$.data.fallback.id\"))&& \/opus\/.test(baseUrl)){\n\tlet rid = S(\"$.data.fallback.id\") || result.match(\/\"rid_str\":\"(\\d+)\",\/)[1];\n\tlet id = baseUrl.match(\/id=(\\d+)\/)[1]\n\tlet url = \n\t\tgetApi(\"article\",rid,id);\n\tjava.put(\"url\",url);\n\t java.setContent(String(java.ajax(url)));\n}\n\n if(!S(\"$.data\") && \/api\/.test(baseUrl)){\n\tresult = java.getElement(\"$.result\");\n\turl = \"https:\/\/api.bilibili.com\/pgc\/web\/season\/section?season_id=\"+S(\"$.result.season_id\");\n\tjava.put(\"url\",url)\n\t}else if(S(\"$.data\")){\n\t\tresult = java.getElement(\"$.data\");\t\t\n\t\t}else if(!\/api\/.test(baseUrl)){\n\t  result = JSON.stringify({data:{}})\n\t}\n\tresult\n<\/js>","intro":"&emsp;&emsp;\n\ud83d\udd51 \u65f6\u957f\uff1a{{formatTimeDynamic(S(\"$.duration\"))}}\n\ud83d\udce4 \u53d1\u5e03\uff1a{{S(\"$.pubtime||$.meta.ptime||$.pubdate||$.list.publish_time\")?java.timeFormat(Number(S(\"$.pubtime||$.meta.ptime||$.pubdate||$.list.publish_time\")+\"000\")):\"\"}}\n\u2328\ufe0f \u66f4\u65b0\uff1a{{S(\"$.list.update_time||$.update_time\")?java.timeFormat(Number(S(\"$.list.update_time||$.update_time\")+\"000\")):\"\"}}\n\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\n\ud83d\udc4d\ud83c\udffb \u70b9\u8d5e\uff1a{{formatCount(S(\"$.stat.like||$.stats.like\"))}}\n\u2b50\ufe0f \u6536\u85cf\uff1a{{formatCount(S(\"$.stat.favorite||$.stats.view\"))}}\n\ud83e\ude99 \u6295\u5e01\uff1a{{formatCount(S(\"$.stat.coin||$.stats.coin\"))}}\n\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\n\ud83d\udc41 \u89c2\u770b\uff1a{{formatCount(S(\"$.stat.view||$.stats.view\"))}}\n\ud83d\udcd6 \u9605\u8bfb\uff1a{{formatCount(S(\"$.stats.view||$.list.read\"))}}\n\ud83d\uddef \u5f39\u5e55\uff1a{{formatCount(S(\"$.stat.danmaku\"))}}\n\ud83d\udcac \u8bc4\u8bba\uff1a{{formatCount(S(\"$.stat.reply||$.stats.reply\"))}}\n\ud83d\udd17 \u5206\u4eab\uff1a{{formatCount(S(\"$.stat.share||$.stats.share\"))}}\n\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\n{{$.desc}}\n{{$.summary||$.list.summary||$.sign||$.evaluate}}\n{{S(\"$.seasons[*].season_title\")?\"<br>&lrm;<br>\u540c\u7cfb\u5217\u5267\u96c6\uff1a\":\"\"}}\n{{S(\"$.seasons[*].season_title\")?S(\"$.seasons[*].season_title\").split(\"\\n\").map((x,i)=>{let b =S(\"$.seasons[*].new_ep.index_show\").split(\"\\n\");return x+\"\u3010\"+b[i]+\"\u3011\"}).join(\"\\n\"):\"\"}}\n{{content = \"\\n&lrm;\\n\"+S(\"$.root.content.message\");pic = S(\"$.root.content.pictures\");pic?content+\"[\u56fe\u7247]\":content}}\n{{if(S(\"$.replies\")){let r = java.getElements(\"$.replies[*]\");let x=\"\";r.forEach(y=>{x+=\"\ud83d\udc64\u3010\"+y.member.uname+\"\u3011 \"+y.reply_control.time_desc+\"\\n\"+y.content.message+(y.content.pictures?\"[\u56fe\u7247]\":\"\")+\"\\n&lrm;\\n\";});\"\\n&lrm;\\n\u2014\u2014\u2014\u2014\u56de\u590d\u2014\u2014\u2014\u2014\\n\"+x};}}\n<js>##(\ud83d\udce4 \u53d1\u5e03|\ud83d\udcac \u8bc4\u8bba|\ud83d\uddef \u5f39\u5e55|\ud83d\udc41 \u89c2\u770b|\ud83e\ude99 \u6295\u5e01|\u2b50\ufe0f \u6536\u85cf|\ud83d\udc4d\ud83c\udffb \u70b9\u8d5e|\ud83d\udd17 \u5206\u4eab|\ud83d\udd51 \u65f6\u957f|\ud83d\udcd6 \u9605\u8bfb|\u2328\ufe0f \u66f4\u65b0)\uff1a\\n|\ud83d\udd51 \u65f6\u957f\uff1a0:00<\/js>\n<js>##(\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\\n){2,}<\/js>\n<js>if(\/&emsp;&emsp;\\s+&lrm;\/.test(result)){result = \"&emsp;&emsp;\"+book.intro}result<\/js>\n##null","kind":"{{if(S(\"$.publish.is_finish\")==\"0\"){\"\u8fde\u8f7d\"};if(S(\"$.publish.is_finish\")==\"1\"){\"\u5b8c\u7ed3\"};}},{{$.areas[*].name}},{{$.type_name}},{{S(\"$.rating.score\")?S(\"$.rating.score\")+\"\u5206\":\"\"}},{{$.styles}},{{getSeachType(S(\"$.type\"))}},{{$.payment.tip}},{{$.vip.label.text}},{{$.sex##\u4fdd\u5bc6}},{{$.official.title}},{{$.tname_v2&&$.tname}},\u5408\u96c6\u5171{{$.ugc_season.ep_count}}\u4e2a\u89c6\u9891,\u6240\u5c5e\u5408\u96c6\uff1a{{$.ugc_season.title||$.list.name}}##\u6240\u5c5e\u5408\u96c6\uff1a$|\u5408\u96c6\u5171\u4e2a\u89c6\u9891","lastChapter":"{{$.new_ep.title}}","name":"$.title||$.list.name||$.name\n<js>\nif(\/acc\\\/info\/.test(baseUrl)&&result){\n\tresult = \"\ud83d\udc64\" + result\n\t}\nresult\n<\/js>","tocUrl":"@js:java.get(\"url\");","wordCount":"{{$.list.words}}"},"ruleContent":{"callBackJs":"let bu = String(book?book.tocUrl:\"\");\nlet mid = String(book?book.getVariable(\"mid\"):\"\");\nmid = mid || bu.match(\/mid=(\\d+)\/)?.[1];\nfalse;\nif(event == \"startRead\"){\n\tif(\/\u26aa\ufe0f\/.test(book.durChapterTitle)){\n\t\tjava.toast(\"\u5f53\u524d\u4e3b\u64ad\u53ef\u80fd\u672a\u5f00\u64ad\uff0c\u5237\u65b0\u76ee\u5f55\u518d\u5c1d\u8bd5\u8fdb\u5165\");\n\t\t}\n\t}\n\n    \/\/\u5b9a\u5236\nif (event == \"clickCustomButton\") {\n\t\n     if(chapter&&\/data:bilibili|series_id\/.test(chapter.url)&&!\/section\/.test(bu)){\n         let a = b64D(chapter.url).split(\"&\")[0];\n        let u = `https:\/\/api.bilibili.com\/x\/web-interface\/archive\/related?aid=${a}`\n        java.open(\"explore\", u, \"\u63a8\u8350\u89c6\u9891\");\n    }else if(\/article\\\/view\/.test(bu)) {\n        java.openUrl(\"bilibili:\/\/article\/cv\" + bu.match(\/id=(\\d+)\/)[1]);\n    }else if(chapter && \/data:liveurl\/.test(chapter.url)){\n        java.openUrl(\"bilibili:\/\/live\/\" + b64D(chapter.url).split(\"\u274c\")[1]);\n    }else if(\/acc\\\/info\/.test(bu)){\n        java.openUrl(\"bilibili:\/\/space\/\" + bu.match(\/mid=(\\d+)\/)[1]);\n    }else if(\/opus\\\/de\/.test(bu)){\n    \tjava.openUrl(\"bilibili:\/\/opus\/detail\/\" + bu.match(\/id=(\\d+)\/)[1]);\n\t}else if(\/v1\\\/detail\/.test(bu)){\n        java.openUrl(\"bilibili:\/\/following\/detail\/\" + (bu.match(\/id=(\\d+)\/)?.[1] ?? book.durChapterTitle.match(\/id(\\d+)$\/)[1]));\n\t}else if(chapter && \/data:liveurl\/.test(chapter.url)){\n        java.openUrl(\"bilibili:\/\/live\/\" + b64(chapter.url));\n    }else if(\/article\\\/list\/.test(bu)){\n        java.openUrl(\"bilibili:\/\/article\/readlist\/\" + bu.match(\/id=(\\d+)\/)[1]);\n    }else if(\/reply\\\/reply\/.test(bu)){\n        java.toast(\"\u8fd9\u91cc\u5565\u4e5f\u6ca1\u6709\")\n    }else if(\/season_id=\/.test(bu)){\n    \tjava.openUrl(\"bilibili:\/\/pgc\/season\/\" + (bu.match(\/_id=(\\d+)\/)?.[1]))\n    \t}else{\n       java.openUrl(\"bilibili:\/\/video\/av\" + (bu.match(\/[a_]id=(\\d+)\/)?.[1] ?? book.durChapterTitle.match(\/id(\\d+)$\/)[1]));\n    }\n   \n}\n\n\/\/\u5206\u4eab\nif (event == \"clickShareBook\") {\n    let t = \"\";\n    if (\/article\\\/view\/.test(bu)) {\n        t = getShareUrl(\"article\",bu.match(\/opus\\\/(\\d+)\/)[1]);\n        t = `\u6211\u6b63\u5728\u770b UP\u4e3b\uff1a${book.author}\u7684\u6587\u7ae0\u300a${book.name}\u300b\\n\u6587\u7ae0\u94fe\u63a5\uff1a${t}`;\n    }else if(\/acc\\\/info\/.test(bu)){\n        t = getShareUrl(\"user\",bu.match(\/mid=(\\d+)\/)[1]);\n        t = `\u6211\u6b63\u5728\u770b UP\u4e3b\uff1a${book.name}\\n\u8bbf\u95ee\u4e3b\u9875\uff1a${t}`;\n    }else if(\/opus\\\/de\/.test(bu)){\n        t = getShareUrl(\"article\",bu.match(\/id=(\\d+)\/)[1]);\n        t = `\u6211\u6b63\u5728\u770b UP\u4e3b\uff1a${book.author}\u7684\u52a8\u6001\u300a${book.name}\u300b\\n\u52a8\u6001\u94fe\u63a5\uff1a${t}`;\n\t}else if(\/v1\\\/detail\/.test(bu)){\n        t = getShareUrl(\"forward\",(bu.match(\/id=(\\d+)\/)?.[1] ?? book.durChapterTitle.match(\/id(\\d+)$\/)[1]));\n        t = `\u6211\u6b63\u5728\u770b UP\u4e3b\uff1a${book.author}\u7684\u52a8\u6001\u300a${book.name}\u300b\\n\u52a8\u6001\u94fe\u63a5\uff1a${t}`;\n\t}else if(\/article\\\/list\/.test(bu)){\n        t = getShareUrl(\"articlelist\",bu.match(\/id=(\\d+)\/)[1]);\n        t = `\u6211\u6b63\u5728\u770b UP\u4e3b\uff1a${book.author}\u7684\u6587\u96c6\u300a${book.name}\u300b\\n\u6587\u96c6\u94fe\u63a5\uff1a${t}`;\n    }else if(\/reply\\\/reply\/.test(bu)){\n        java.toast(\"\u8fd9\u91cc\u5565\u4e5f\u6ca1\u6709\")\n    }else if(\/season_id\/.test(bu)){\n        t = getShareUrl(\"media_bangumi\",bu.match(\/id=(\\d+)\/)[1]);\n        t = `\u6211\u6b63\u5728\u770b\u5267\u96c6\u300a${book.name}\u300b\\n\u5267\u96c6\u94fe\u63a5\uff1a${t}`;\n    }else {\n        t = getShareUrl(\"video\",(bu.match(\/aid=(\\d+)\/)?.[1] ?? book.durChapterTitle.match(\/id(\\d+)$\/)[1]));\n        t = `\u6211\u6b63\u5728\u770b UP\u4e3b\uff1a${book.author}\u7684\u89c6\u9891\u300a${book.name}\u300b\\n\u89c6\u9891\u94fe\u63a5\uff1a${t}`;\n    }\n    \n    java.copyText(t);\n    java.toast(\"\\n\u5df2\u590d\u5236\uff0c\u8bf7\u53bb\u7c98\u8d34\u5206\u4eab\\n\" + t);\n    true\n}\n\n\/\/\u4e66\u540d\nif (event == \"clickBookName\") {\n    if(\/series_id\/.test(bu)) {\n        java.open(\"explore\", String(bu).replace(\/pn=\\d+\/, 'pn={{page}\\}'), \"\u5f53\u524d\u5408\u96c6\u89c6\u9891\u5217\u8868\");\n    }else if(\/v1\\\/detail\/.test(bu)){\n        let u = getReply(bu.match(\/id=(\\d+)\/)[1], 17, 3);\n        java.open(\"explore\", u, \"\u70ed\u95e8\u8bc4\u8bba\");\n    }else if(\/article\\\/view\/.test(bu)){\n        let u = getReply(bu.match(\/\\?id=(\\d+)\/)[1], 12, 3)\n        java.open(\"explore\", u, \"\u70ed\u95e8\u8bc4\u8bba\");\n    }else if(\/opus\\\/detail\/.test(bu)){\n        let u = getReply(book.getVariable(\"id\"), 11, 3)\n        java.open(\"explore\", u, \"\u70ed\u95e8\u8bc4\u8bba\");\n    }else if(\/article\\\/list\/.test(bu)){\n        let queryJson = `{mid:${mid},sort:0,\"web_location\":333.1387}`;\n         let u = `https:\/\/api.bilibili.com\/x\/article\/up\/lists?{\\{getWbiEnc(${queryJson})}}`;    \n        java.open(\"explore\", u, \"\u4e13\u680f\u6587\u96c6\");\n    }else if(\/reply\\\/reply\/.test(bu)){\n        java.toast(\"\u8fd9\u91cc\u5565\u4e5f\u6ca1\u6709\")\n    }else if(!\/acc\\\/info\/.test(bu)) {\n        let aid = (bu.match(\/aid=(\\d+)\/)?.[1]??String(book.getVariable(\"aid\")))||cache.get(\"aid\");\n        let name = \"\";\n        if(aid){\n            let u = getReply(aid, 1, 3);\n            if(\/season_id\/.test(bu)){\n                name = book.durChapterTitle;\n                java.toast(\"\u70ed\u95e8\u8bc4\u8bba\")\n            }\n            java.open(\"explore\", u, name+\"\u70ed\u95e8\u8bc4\u8bba\");\n        }\n    }\n    \n    if(\/\ud83c\udfac\/.test(M(\"\u70b9\u51fb\u957f\u6309UP\u4e3b\")) && \/acc\\\/info\/.test(bu)){\n        \n        url = getEapi(\"videolist\",mid);\n        java.open(\"explore\", url, book.author + \" - \u89c6\u9891 - \u6700\u65b0\u53d1\u5e03\")\n       }else if(\/\ud83d\udcd6\/.test(M(\"\u70b9\u51fb\u957f\u6309UP\u4e3b\")) && \/acc\\\/info\/.test(bu)){\n           let queryJson = `{mid:${mid},sort:0,\"web_location\":333.1387}`;\n           let u = `https:\/\/api.bilibili.com\/x\/article\/up\/lists?{\\{getWbiEnc(${queryJson})}}`;    \n           java.open(\"explore\", u, \"\u4e13\u680f\u6587\u96c6\");\n    }  \n    true\n}\n\n\/\/\u957f\u6309\u4e66\u540d\nif (event == \"longClickBookName\") {\n    if (\/series_id\/.test(bu)) {\n        let url = \"https:\/\/api.bilibili.com\/x\/web-interface\/view?aid=\" + book.durChapterTitle.match(\/id(\\d+)$\/)[1];\n        java.open(\"explore\", url, \"\u5f53\u524d\u89c6\u9891\u5206P\");\n    } else if(\/v1\\\/detail\/.test(bu)){\n        let u = getReply(bu.match(\/id=(\\d+)\/)[1], 17, 2);\n        java.open(\"explore\", u, \"\u6700\u65b0\u8bc4\u8bba\");\n    }else if(\/article\\\/view\/.test(bu)){\n        let u = getReply(bu.match(\/\\?id=(\\d+)\/)[1], 12, 2)\n        java.open(\"explore\", u, \"\u6700\u65b0\u8bc4\u8bba\");\n    }else if(\/opus\\\/detail\/.test(bu)){\n        let u = getReply(book.getVariable(\"id\"), 11, 3)\n        java.open(\"explore\", u, \"\u6700\u65b0\u8bc4\u8bba\");\n    }else if(\/article\\\/list\/.test(bu)){\n        let u = getOpus(mid,\"article\");\n        java.open(\"explore\", u,  \"\u4e13\u680f\u52a8\u6001\");\n    }else if(\/reply\\\/reply\/.test(bu)){\n        java.toast(\"\u8fd9\u91cc\u5565\u4e5f\u6ca1\u6709\")\n    } else if (!\/acc\\\/info\/.test(book.tocUrl)) {\n        let aid = (bu.match(\/aid=(\\d+)\/)?.[1]??String(book.getVariable(\"aid\")))||cache.get(\"aid\");\n        let name = \"\"\n        if(aid){\n            let u = getReply(aid, 1, 2);\n            if(\/season_id\/.test(bu)){\n                name = book.durChapterTitle;\n                java.toast(\"\u6700\u65b0\u8bc4\u8bba\")\n            }\n            java.open(\"explore\", u, name+\"\u6700\u65b0\u8bc4\u8bba\");\n            \n        }\n    }\n    \n    if(\/\ud83c\udfac\/.test(M(\"\u70b9\u51fb\u957f\u6309UP\u4e3b\")) && \/acc\\\/info\/.test(bu)){\n        url = getEapi(\"seasons_series_list\",mid);\n        java.open(\"explore\", url, book.author + \" - \u89c6\u9891\u5408\u96c6\u5217\u8868\")\n       }else if(\/\ud83d\udcd6\/.test(M(\"\u70b9\u51fb\u957f\u6309UP\u4e3b\")) && \/acc\\\/info\/.test(bu)){\n           let u = getOpus(mid,\"article\");\n           java.open(\"explore\", u,  \"\u4e13\u680f\u52a8\u6001\");\n    }\n    true\n}\n\n\/\/\u4f5c\u8005\nif (event == \"clickAuthor\") {\n    if(\/\ud83c\udfac\/.test(M(\"\u70b9\u51fb\u957f\u6309UP\u4e3b\")) && !\/acc\\\/info|season_id\/.test(bu)){\n    url = getEapi(\"videolist\",mid);\n    java.open(\"explore\", url, book.author + \" - \u89c6\u9891 - \u6700\u65b0\u53d1\u5e03\")\n    }else if(\/\ud83d\udcd6\/.test(M(\"\u70b9\u51fb\u957f\u6309UP\u4e3b\")) && !\/acc\\\/info|season_id\/.test(bu)){\n        let queryJson = `{mid:${mid},sort:0,\"web_location\":333.1387}`;\n         let u = `https:\/\/api.bilibili.com\/x\/article\/up\/lists?{\\{getWbiEnc(${queryJson})}}`;    \n        java.open(\"explore\", u, \"\u4e13\u680f\u6587\u96c6\");\n    }\n    \n    if(\/acc\\\/info\/.test(bu)){\n        let u = getEapi(\"space\",mid);\n        java.open(\"explore\", u, book.name + \"\u7684\u52a8\u6001\");\n    }else if(\/season_id=\/.test(bu)){\n        java.open(\"explore\", book.bookUrl, \"\u7cfb\u5217\u89c6\u9891\");\n    }\n    true\n}\n\n\/\/\u957f\u6309\u4f5c\u8005\nif (event == \"longClickAuthor\") {\n    if(\/\ud83c\udfac\/.test(M(\"\u70b9\u51fb\u957f\u6309UP\u4e3b\")) && !\/acc\\\/info|season_id\/.test(bu)){\n        url = getEapi(\"seasons_series_list\",mid);\n        java.open(\"explore\", url, book.author + \" - \u89c6\u9891\u5408\u96c6\u5217\u8868\")\n    }else if(\/\ud83d\udcd6\/.test(M(\"\u70b9\u51fb\u957f\u6309UP\u4e3b\")) && !\/acc\\\/info|season_id\/.test(bu)){\n        let u = getOpus(mid,\"article\");\n        java.open(\"explore\", u,  \"\u4e13\u680f\u52a8\u6001\");\n    }\n    \n    if(\/acc\\\/info\/.test(bu)){\n        let svg=String(java.base64Encode(`<svg width=\"1190\" height=\"300\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><rect width=\"100%\" height=\"100%\" fill=\"#ffffff\"\/><text x=\"200\" y=\"100\" font-family=\"Arial, sans-serif\" font-size=\"70\" fill=\"#333\" font-weight=\"bold\">\u8f93\u5165\u8981\u641c\u7d22\u7684\u5173\u952e\u8bcd<\/text><\/svg>`));\n        \n        let key = java.getVerificationCode('data:image\/svg+xml;base64,'+svg);\n        let u = getEapi(\"space\",mid,\"\/search\u274c\u274c&keyword=\"+key);\n        java.open(\"explore\", u, book.name + \"\u7684\u52a8\u6001\");\n    }\n    true\n}\n\n\nif (event == \"clickCopyBookUrl\") {\n    let t = \"\";\n    if (\/article\\\/view\/.test(bu)) {\n        t = getShareUrl(\"article\",bu.match(\/opus\\\/(\\d+)\/)[1]);\n    }else if(\/acc\\\/info\/.test(bu)){\n        t = getShareUrl(\"user\",bu.match(\/mid=(\\d+)\/)[1]);   \n    }else if(\/opus\\\/de\/.test(bu)){\n        t = getShareUrl(\"article\",bu.match(\/id=(\\d+)\/)[1]);  \n\t}else if(\/v1\\\/detail\/.test(bu)){\n        t = getShareUrl(\"forward\",(bu.match(\/id=(\\d+)\/)?.[1] ?? book.durChapterTitle.match(\/id(\\d+)$\/)[1]));\n\t}else if(\/article\\\/list\/.test(bu)){\n        t = getShareUrl(\"articlelist\",bu.match(\/id=(\\d+)\/)[1]);\n    }else if(\/reply\\\/reply\/.test(bu)){\n        java.toast(\"\u8fd9\u91cc\u5565\u4e5f\u6ca1\u6709\")\n    }else if(\/season_id\/.test(bu)){\n        t = getShareUrl(\"media_bangumi\",bu.match(\/id=(\\d+)\/)[1]);\n    }else {\n        t = getShareUrl(\"video\",(bu.match(\/aid=(\\d+)\/)?.[1] ?? book.durChapterTitle.match(\/id(\\d+)$\/)[1]));\n    }\n    \n    t?java.copyText(t):null\n    t?java.toast(t):null\n   true\n}\n","content":"@js:\nif (\/data:reply\/.test(baseUrl)) {\n    let j = String(java.hexDecodeToString(result));\n    result = parseContent(j);\n} else if (\/x\\\/article\/.test(baseUrl)) {\n    let json = JSON.parse(src);\n    book.author = json.data.author.name;\n    if (S(\"$.data.type\") == \"3\") {\n        let data = JSON.parse(S(\"$.data.content\"));\n        result = `${processDelta(data.ops)}`\n    } else if (S(\"$.data.type\") == \"0\") {\n        result = S(\"$.data.content\");\n        result = processHtml(result);\n    } else if (S(\"$.data.type\") == \"2\") {\n        result = S(\"$.data.content\")\n    }else if(S(\"$.data.type\") == \"4\"){\n     \t  if(S(\"$.data.opus\")){\n     \t  \tlet r = \"\";\n     \t  \tlet prs = JSON.parse(src).data.opus.content.paragraphs;\n     \t  \tprs.forEach(x=>{\n     \t  \t\t    switch(x.para_type){\n     \t  \t\t    \t    case 1:\n     \t  \t\t    \t         r += x.text.nodes?getNodes(x.text.nodes)+\"\\n\":\"\\n\"\n     \t  \t\t    \t         break\n     \t  \t\t    \t    case 2:\n                                   r += getNodes(x.pic)+\"\\n\"\n     \t  \t\t   \t         break\n     \t  \t\t    \t}   \t  \t\t\n     \t  \t\t});\n                   result = r\n     \t  \t}else{\n     \t  \t\tresult = S(\"$.data.content\");\n       \timgs = JSON.parse(src).data.image_urls;\n       \tresult += imgs.map(z=>`<img src=\"${z}\">`).join(\"\")\n     \t  \t\t}\n       \t\n    \t}\n    if (JSON.parse(src).data.list) {\n        let articlelist = JSON.parse(src).data.list;\n        let name = articlelist.name;\n        if (!\/article\\\/list\/.test(book.bookUrl)) {\n            result = `${this.getClickImg(\"link\",articlelist.id,null,null,\"articlelist\")}\u6240\u5c5e\u6587\u96c6\uff1a${name}\\n` + result;\n        }\n    }\n    if (json.data?.top_video_info?.bvid) {\n        result = `${this.getClickImg(\"video\",json.data.top_video_info.bvid,json.data.top_video_info.pic,1)}` + result;\n        let title = `${this.getClickImg(\"video\",json.data.top_video_info.bvid)}${json.data.top_video_info.title}`;\n        result = title + \"\\n\" + result\n    }\n} else if (\/opus\\\/detail\/.test(baseUrl)) {\n    let modules = JSON.parse(result)?.data?.item?.modules;\n    let html = \"\";\n    modules ? modules.forEach(module => {\n        switch (module.module_type) {\n            case \"MODULE_TYPE_TOP\":\n                let pics = module?.module_top?.display?.album?.pics;\n                if (pics) {\n                    pics.forEach(pic => {\n                        html += `<img src=\"${pic.url}\">\\n`\n                    });\n                }\n                break;\n\n            case \"MODULE_TYPE_CONTENT\":\n                let paragraphs = module?.module_content?.paragraphs;\n                paragraphs ? paragraphs.forEach(paragraph => {\n                    let type = paragraph.para_type;\n                    switch (type) {\n                        case 1:\n                        case 4:\n                            let nodes = paragraph?.text?.nodes;\n                            html += getNodes(nodes)\n                            break;\n\n                        case 2:\n                            let pics = paragraph?.pic?.pics;\n                            pics.forEach(pic => {\n                                html += `<img src=\"${pic.url}\">\\n`\n                            });\n                            break;\n\n                        case 3:\n                            let pic = paragraph?.line?.pic?.url;\n                            html += `<img src=\"${pic}\">\\n`\n                            break;\n\n                            \/\/\u5217\u8868\n                        case 5:\n                            let items = paragraph?.list?.items;\n                            items.forEach(item => {\n                                html += item.order + getNodes(item.nodes) + \"\\n\"\n                            });\n                            break;\n\n                            \/\/\u5361\u7247 \n                        case 6:\n                            let card = paragraph.link_card.card;\n                            if (card.type == \"LINK_CARD_TYPE_LIVE\") {\n                                html += getMajor(card)\n                            } else {\n                                html += getLinkCard(card)\n                            }\n                            break;\n\n                        case 7:\n                            html += JSON.stringify(paragraph)\n                            break;\n                    }\n                }) : null\n                break\n        }\n    }) : null\n\n    result = html;\n\n} else if (\/v1\\\/detail\/.test(baseUrl)) {\n    let html = \"\";\n    let item = JSON.parse(src).data.item;\n\n    let module_dynamic = item.modules.module_dynamic;\n    let module_author = item.modules.module_author;\n\n    html += \"\ud83d\udd65 \" + module_author.pub_time + \" \u53d1\u5e03\\n\";\n\n    rich_text_nodes = module_dynamic?.desc?.rich_text_nodes;\n    rich_text_nodes ? rich_text_nodes.forEach(node => {\n        let nodes = [{}];\n        nodes[0].type = \"TEXT_NODE_TYPE_RICH\";\n        nodes[0].rich = node;\n        html += getNodes(nodes);\n    }) : null;\n\n    if (module_dynamic.major) {\n        html += getMajor(module_dynamic.major)\n    }\n    if (module_dynamic.additional) {\n        html += getLinkCard(module_dynamic.additional)\n    }\n\n    let orig = item?.orig?.modules?.module_dynamic;\n    if (orig) {\n        module_author = item?.orig?.modules?.module_author;\n        let mid = module_author?.mid;\n        name = module_author.name\n        html += `\\n\u2014\u8f6c\u53d1\u81ea\uff1a${this.getClickImg(\"user\",mid)}${name}\u2014\\n`\n        rich_text_nodes = orig?.desc?.rich_text_nodes;\n        rich_text_nodes ? rich_text_nodes.forEach(node => {\n            let nodes = [{}];\n            nodes[0].type = \"TEXT_NODE_TYPE_RICH\";\n            nodes[0].rich = node;\n            html += getNodes(nodes);\n        }) : null;\n\n        if (orig.major) {\n            html += getMajor(orig.major)\n        }\n        if (orig.additional) {\n            html += getLinkCard(orig.additional)\n        }\n    }\n    result = html\n} else if (\/data:live\/.test(baseUrl)) {\n    result = String(java.hexDecodeToString(result));\n    let c = result.split(\"\u274c\");\n    if (\/\\d+&\\d+\u274c\/.test(result)) {\n        let code = c[0].split(\"&\");\n        let data = java.ajax(\"https:\/\/api.live.bilibili.com\/xlive\/web-room\/v2\/index\/getRoomPlayInfo?room_id=\" + c[1] + \"&protocol=0,1&format=0,1,2&codec=0,1&qn=\" + code[1]);\n        data = JSON.parse(data).data;\n        let stream = data.playurl_info?.playurl?.stream;\n        let codec = stream[0].format[0].codec[0];\n        let base_url = codec.base_url;\n        let host = codec.url_info[code[0]].host;\n        let extra = codec.url_info[code[0]].extra;\n        result = host + base_url + extra;\n    } else {\n        result = c[0];\n    }\n    if (!result) {\n        result = 1;\n        java.toast(\"\u5f53\u524d\u76f4\u64ad\u53ef\u80fd\u672a\u5f00\u64ad\uff0c\u5c1d\u8bd5\u5237\u65b0\u8be6\u60c5\u9875\u66f4\u65b0\u72b6\u6001\")\n    }\n} else {\n    let aid, cid;\n    aid = java.hexDecodeToString(result);\n    \n    if (!\/\ud83c\udfa5\/.test(aid)) {\n        if (\/series_id\/.test(baseUrl)) {\n            let data = java.ajax(getApi(\"video\", aid));\n            p = JSON.parse(data).data;\n            if (p.pages.length > 1) {\n                java.longToast(\"\u5f53\u524d\u89c6\u9891\u5206 \" + p.pages.length + \" P\\n\u53ef\u5728\u8be6\u60c5\u9875\u70b9\u51fb\u4e66\u540d\u6216\u957f\u6309\u4e66\u540d\u67e5\u770b\u66f4\u591a\u5206P\u89c6\u9891\")\n            }\n            book.author = p.owner.name\n            cid = p.cid;\n        } else {\n            let l = java.hexDecodeToString(result).split(\"&\");\n            aid = l[0];\n            cid = l[1];\n        }\n\n        \/\/dash\u89c6\u9891\n        url = `http:\/\/api.bilibili.com\/x\/player\/playurl?avid=${aid}&cid=${cid}&qn=116&fnver=0&fnval=16&fourk=1`;\n\n        if (\/season_id=\/.test(book.bookUrl)) {\n            url = `https:\/\/api.bilibili.com\/pgc\/player\/web\/playurl?avid=${aid}&cid=${cid}&qn=116&fnver=0&fnval=16&fourk=1`;\n        }\n\n        let data = java.ajax(url);\n        let json = JSON.parse(data);\n        book.putVariable(\"aid\", aid);\n        cache.put(\"aid\", aid, 300)\n\n        if (json.data) {\n            json = json.data\n        } else if (json.result) {\n            json = json.result\n        }\n\n        dm = String(java.ajax('https:\/\/comment.bilibili.com\/' + cid + '.xml'));\n        java.put(\"dm\", modifyDanmaku(dm, 15));\n        if (\/DASH\/i.test(json.type) || !json.type) {\n            if (json.dash.video[0].id < 64) {\n                \/\/\u5207\u6362mp4\u7ebf\u8def\n                url = `http:\/\/api.bilibili.com\/x\/player\/playurl?avid=${aid}&cid=${cid}&qn=116&fnver=0&fnval=1&fourk=1`;\n                data = java.ajax(url);\n                result = JSON.parse(data).data.durl[0].url;\n            } else {\n                if (\/\ud83c\udfa7\/.test(M(\"\u6a21\u5f0f\"))) {\n                    java.put(\"dm\", danmakuToLRC(dm));\n                    \/\/result = JSON.parse(data).data.durl[0].url;\n                    result = json.dash.audio[1].baseUrl;\n                } else {\n                    result = generateMPD(json.dash);\n                \n                    \/\/result = JSON.parse(data).data.durl[0].url\n                }\n            }\n        } else if (\/mp4\/i.test(json.type)) {\n            result = json.durl[0].url\n        }\n    }else{\n        \nresult = `<MPD xmlns=\"urn:mpeg:dash:schema:mpd:2011\"\n     type=\"static\"\n     mediaPresentationDuration=\"PT0.5S\"\n     minBufferTime=\"PT0.5S\">\n  <Period id=\"1\" start=\"PT1S\">\n    <AdaptationSet contentType=\"video\" mimeType=\"video\/mp4\">\n      <Representation bandwidth=\"1000000\">\n        <BaseURL><\/BaseURL>\n        <SegmentBase indexRangeExact=\"true\">\n          <Initialization sourceURL=\"\"\/>\n        <\/SegmentBase>\n      <\/Representation>\n    <\/AdaptationSet>\n  <\/Period>\n<\/MPD>\n`;\n        \n    }\n}\n\nresult","imageStyle":"FULL","subContent":"@js:\njava.get(\"dm\")","title":"@js:\nif(\/data:reply\/.test(baseUrl)){\n\t  result = chapter.tag\n\t\t}else{\n\t\t\tresult = title\n\t\t\t}\nresult"},"ruleExplore":{"author":"$.owner.name||$.member.uname||$.upper.name||$.modules.module_author.name||$.uname||$.author_name||$.author.name\n<js>\nif(\/relation\/.test(baseUrl)){\n\tresult = \"\u67e5\u770b\u5168\u90e8\u52a8\u6001\"\n\t}\n\tresult\n<\/js>","bookList":"$.data.item[*]||$.data.list[*]||$.data.medias[*]||$.data.lists[*]||$.data.top_replies[*]&&$.data.replies[*]||$.data.media_list[*]||$.data.items[*]||$.data.archives[*]||$.data.items_lists.seasons_list[*]&&$.data.items_lists.series_list[*]||$.data.pages[*]||$.result.seasons[*]||$.data[*]\n<js>\nif(\/aid=(\\d+)\/.test(baseUrl)){\n\tjava.log(baseUrl)\n\tjava.put(\"aid\",baseUrl.match(\/aid=(\\d+)\/)[1])\n\t}\nif(JSON.parse(src)?.data?.aid){\n\tjava.put(\"aid\",JSON.parse(src)?.data?.aid)\n\t}\nif(\/medialist\/.test(baseUrl)){\nlet m =\tJSON.parse(src || \"[]\")?.data?.media_list ?? [];\n\nif(m.length>=1){\n    source.put(\"nextoffset\",m[m.length-1].id);\n}else{\n\tresult = \"[]\";\n\t}\n}\n\nif(\/reply\\\/wbi\\\/main\/.test(baseUrl)){\n\tif(JSON.parse(src || \"[]\")?.data?.replies.length<1){\n\t\tresult = \"[]\"\n\t\t}else if(!JSON.parse(src || \"[]\")?.data){\n\t\t\tm = JSON.parse(src || \"[]\")?.message;\n\t\tm?java.toast(m):null\n\t\tresult = \"[]\"\n\t\t\t}else{\n\t\t\ta = JSON.parse(src || \"[]\").data.cursor.pagination_reply.next_offset;\nsource.put(\"nextoffset\",a);\n\t\t\t}\n}\nif(\/feed\\\/all|web-dynamic\/.test(baseUrl)){\na = JSON.parse(src || \"[]\").data.offset;\nsource.put(\"nextoffset\",a);\n}\nif(\/history\/.test(baseUrl)){\na = JSON.parse(src || \"[]\").data.cursor.max;\nbusiness = JSON.parse(src || \"[]\").data.cursor.business;\nview_at = JSON.parse(src || \"[]\").data.cursor.view_at;\na = a+\"&business=\"+business+\"&view_at=\"+view_at\nsource.put(\"nextoffset\",a);\n}\n\nif(\/feed\\\/space\/.test(baseUrl)){\n\t  if(!JSON.parse(src||\"[]\")?.data?.items.length)result = \"[]\"\n\t}\n\t\nif(\/fav\/.test(baseUrl)){\n\t  if(!JSON.parse(src||\"[]\")?.data?.medias.length)result = \"[]\"\n\t}\nresult\n<\/js>\n$.[*]","bookUrl":"https:\/\/api.bilibili.com\/x\/web-interface\/view?aid={{$.id||$.aid||$.archives[0].aid||$.modules..aid||$.mid||$.opus_id||$.history.oid}}&cid={{$.cid}}@put:{\"cid\":\"$.cid\"}\n@js:\nif (S(\"$.rpid\")) {\n    result = `https:\/\/api.bilibili.com\/x\/v2\/reply\/reply?oid=${S(\"$.oid\")}&type=${baseUrl.match(\/type=(\\d+)\/)[1]}&root=${S(\"$.rpid\")}&ps=100&pn=1&web_location=333.788`;\n   \n} else if (S(\"$.meta.series_id\")) {\n    result = `https:\/\/api.bilibili.com\/x\/series\/archives?mid=${baseUrl.match(\/mid=(\\d+)\/)[1]}&series_id=${S(\"$.meta.series_id\")}&only_normal=true&sort=desc&ps=1000&pn=1&web_location=333.1387`;\n} else if (\/feed\\\/all.*?type=article\/.test(baseUrl)) {\n    result = getApi(\"article\",S(\"$..rid_str\"),S(\"$..id_str\"))\n}else if(\/opus\\\/feed\/.test(baseUrl)){\n\t\n\tresult = getApi(\"opus\",S(\"$.opus_id\"),S(\"$.opus_id\"))\n\t} else if(\/article\\\/up\\\/lists\/.test(baseUrl)){\n\t\tresult = \"https:\/\/api.bilibili.com\/x\/article\/list\/web\/articles?id=\"+S(\"$.id\")\n\t} else if(\/\\\/pgc\\\/\/.test(baseUrl)){\n\t\t    result = getApi(\"media_bangumi\",S(\"$.season_id||$.id\"))\n\t\t}else if(\/x\\\/relation|xlive\/.test(baseUrl)){\n         result = getApi(\"user\",S(\"$.mid||$.uid\"))\n\t}else if(\/feed\\\/space\/.test(baseUrl)){\n\t\t result = getDynamicUrl(S(\"$.type\"),src);\n\t\t}else {\n\t\t\tif(\/aid=&\/.test(result)){\n\t\t\t\tresult = result.replace(\/aid=&\/,'aid='+java.get('aid')+'&');\n\t\t\t\t}\n    result = result\n}","coverUrl":"$.cover.url||$.pic||$.cover||$.member.avatar||$.meta.cover||$.modules..cover||$.covers[0]||$.modules..pics[0].url||$.orig..cover||$.orig..pics[0].url||$.first_frame||$..face||$..module_author.face","intro":"{{$.modules..major..desc||$.desc||$.intro||$.sign||$.modules..major..summary.text||$.summary||$.subTitle||$.title}}\n{{let a;if(S(\"$.orig\")){a = `&emsp;&emsp;${S(\"$.modules..major..title||$.modules..desc.text\")}\\n&lrm;\\n-\u8f6c\u53d1 @${S(\"$.orig..module_author.name\")} \u7684${getDynamicType(S(\"$.orig.type\"))}-\\n${S(\"$.orig..title||$.orig..summary.text\")}`};a}}\n<br>&lrm;<br>\n{{$.modules.module_dynamic.additional.reserve.title}}\n{{$.modules.module_dynamic.additional.reserve.desc1.text}}\n {{content = \"\\n&lrm;\\n\"+java.getString(\"$.content.message\");pic = String(java.getString(\"$.content.pictures\"));pic?content+\"[\u56fe\u7247]\":content}}\n{{if(String(java.getString(\"$.replies\"))){let r = java.getElements(\"$.replies[*]\");let x=\"\";r.forEach(y=>{x+=\"\ud83d\udc64\u3010\"+y.member.uname+\"\u3011 \"+y.reply_control.time_desc+\"\\n\"+y.content.message+(y.content.pictures?\"[\u56fe\u7247]\":\"\")+\"\\n&lrm;\\n\";});\"\\n&lrm;\\n\u2014\u2014\u2014\u2014\u56de\u590d\u2014\u2014\u2014\u2014\\n\"+x};}}##null","kind":"{{$.area_name&&$.area_v2_name&&$.area_v2_parent_name}},{{$.vip.label.text}},{{$.badge}},\ud83d\udd51 {{formatTimeDynamic(java.getString(\"$.duration\"))}}\n\ud83d\udc4d\ud83c\udffb {{formatCount(java.getString(\"$.stat.like||$.cnt_info.thumb_up\"))}}\n\u25b6\ufe0f {{formatCount(java.getString(\"$.stat.view||$.cnt_info.play\"))}}\n\ud83d\uddef {{formatCount(java.getString(\"$.stat.danmaku||$.cnt_info.danmaku\"))}}\n##\ud83d\udd51 0:00|(?:\ud83d\udc4d\ud83c\udffb|\u25b6\ufe0f)\\s+(?!\\d)|\ud83d\uddef$","lastChapter":"\u5206{{$.page}}P {{$.new_ep.index_show||$.index_show}}{{S(\"$.articles_count\")?S(\"$.articles_count\")+\"\u7bc7\u6587\u7ae0\":\"\"}} {{$.modules.module_author.pub_time}} {{$.reply_control.time_desc}} {{S(\"$.publish_time||$.pubtime||$.meta.ptime||$.pubdate\")?java.timeFormat(Number(java.getString(\"$.pubtime||$.meta.ptime||$.pubdate||$.publish_time\")+\"000\")):\"\"}} \ud83d\udcac{{$.rcount}}\u6761\u56de\u590d \ud83d\udc4d\ud83c\udffb{{$.like}}##\u5206P|\ud83d\udcac\u6761\u56de\u590d|\u53d1\u5e03|\ud83d\udc4d\ud83c\udffb$","name":"{{getDynamicType(S(\"$.type\"))}}{{$.modules..major..summary.text||$.season_title||$.meta.name||$.title||$.content.message||$.modules..major..title||$.modules..desc.text||$.modules..major..desc||$.uname||$.part||$.content||$.name||$.modules..major.live_rcmd.content##(.{0,20})##$1###}}{{S(\"$.id_str\")?\"\u3010\"+S(\"$.id_str\").replace(\/^\\d{13}\/,'')+\"\u3011\":\"\"}}\n<js>\nif(\/relation\/.test(baseUrl)){\n\tresult = \"\ud83d\udc64\"+result\n}else if(\/,\"live_play_info\/.test(result)){\n\tresult = \"\ud83d\udcfa\"+ result.match(\/\"title\":\"([^\"]+)\"\/)[1]\n\t}\n\tresult\n<\/js>","wordCount":"$.words"},"ruleSearch":{"author":"$.author||$.uname##<\/*em.*?>","bookList":"$.data.result[*].data[*]&&$.data.result.live_user[*]&&$.data.result.live_room[*]||$.data.result[*]","bookUrl":"https:\/\/api.bilibili.com\/x\/web-interface\/view?aid={{$.id}}@put:{\"cid\":\"$.cid\"}\n<js>\nlet type = S(\"$.type\");\nswitch(type){\n\tcase \"live_user\":\n\tcase \"live_room\":\n\tcase \"bili_user\":\n        result = getApi(\"user\",S(\"$.uid||$.mid\"));\n\tbreak;\n\t\n\tcase \"article\":\n        result = getApi(type,S(\"$.id\"))\n        break;\n  case \"media_bangumi\":\n  case \"media_ft\":\n        result = getApi(type,S(\"$.season_id\"))\n\t}\n\nresult\n<\/js>","checkKeyWord":"--https:\/\/api.bilibili.com\/x\/article\/view?id=34980384,{\"js\":\"book?result:'https:\/\/www.bilibili.com\/opus\/937892609776418850?spm_id_from=333.1365.0.0'\"}","coverUrl":"$.pic||$.cover||$.user_cover||$.cover||$.image_urls[0]||$.uface||$.upic","intro":"$.description||$.desc||$.usign##<\/*em.*?>","kind":"{{S(\"$.type\")==\"live_room\"?\"\ud83d\udcfa\u76f4\u64ad\u95f4\":\"\"}}\n,{{S(\"$.type\")==\"article\"?\"\ud83d\udcd6\u4e13\u680f\":\"\"}},{{S(\"$.type\")==\"live_user\"?\"\ud83d\udcfa\u4e3b\u64ad\":\"\"}}\n,{{S(\"$.type\")==\"bili_user\"?\"\ud83d\udc64\u7528\u6237\":\"\"}}\n{{S(\"$.fans\")?\"\u7c89\u4e1d\uff1a\"+formatCount(S(\"$.fans\")):\"\"}}\n,{{S(\"$.live_status\")==\"true\"?\"\u5df2\u5f00\u64ad\":(S(\"$.live_status\")==\"false\"?\"\u672a\u5f00\u64ad\":\"\")}}\n{{$.official_verify.desc},}{{$.category_name}}\n,{{$.cate_name}},{{getSeachType(S(\"$.media_type||$.season_type\"))}},{{$.tag||$.tas}},{{$.category_name}}\n,{{S(\"$.media_score.score\")?S(\"$.media_score.score\")+\"\u5206\":\"\"}},{{$.styles}},{{$.areas}},\n\ud83d\udd51 {{S(\"$.duration\")}},\ud83d\udc4d\ud83c\udffb {{formatCount(S(\"$.like\"))}},\ud83d\udc41 {{formatCount(S(\"$.play||$.view\"))}},\ud83d\uddef {{formatCount(S(\"$.danmaku||$.reply\"))}}\n##\ud83d\udd51 ,|\ud83d\udc4d\ud83c\udffb ,|\ud83d\udc41 ,|\ud83d\uddef$|<\/*em.*?>|,0\u5206","lastChapter":"{{$.live_time##0000-00-00.*}}{{S(\"$.pubtime||$.meta.ptime||$.pubdate||$.pub_time\")?java.timeFormat(Number(S(\"$.pubtime||$.meta.ptime||$.pubdate||$.pub_time\")+\"000\")):\"\"}}","name":"$.title||$.uname##<\/*em.*?>"},"ruleToc":{"chapterList":"<js>\nlet b = String(book.bookUrl);\nlet bmid = S(\"$.data.mid||$.data.list.mid||$.data.item.basic.uid||$.data.item.modules.module_author.mid||$.data.owner.mid||$.data.root.mid\");\n\nbook.putVariable(\"mid\", bmid);\ncache.put(\"mid\",bmid);\n\ncaid = String(cache.get(\"aid\"));\tcache.put(\"aid\",S(\"$.result.main_section.episodes[0].aid\"));\n\nbook.putVariable(\"id\",S(\"$.data.item.basic.comment_id_str\"));\n\nif (\/web-interface\\\/view|series|season_id=\/.test(b)) {\n    if (\/^\ud83c\udfa7\/.test(M(\"\u6a21\u5f0f\"))) {\n        book.type = 32;\n    } else if (\/^\ud83c\udfa5\/.test(M(\"\u6a21\u5f0f\"))) {\n        book.type = 4;\n    }\n} else if (\/reply\\\/reply|article\/.test(b)) {\n    book.type = 8;\n}\n\nif(\/acc\\\/info\/.test(b)){\n\tbook.type = 4;\n\t}\n\n\nif (\/web-interface\\\/view\/.test(baseUrl)) {\n    var p = JSON.parse(result).data;\n    book.putVariable(\"mid\", p.owner.mid);\n    var d = [];\n    var aid = p.aid;\n    \n    if (p.pages.length == 1) {\n        cid = p.pages[0].cid;\n        d.push({\n            title: p.title,\n            url: `data:bilibili;base64,${java.base64Encode(aid+\"&\"+p.cid)},{\"type\":\"c\"}`,\n            pubdate: p.pubdate,\n            desc: formatTimeDynamic(p.duration)\n        });\n    } else if (p.pages.length > 1) {\n        p.pages.forEach(item => {\n            cid = item.cid;\n            d.push({\n                title: item.part===\"\"?\"\u65e0\u540d\":item.part,\n                desc: formatTimeDynamic(item.duration),\n                url: `data:bilibili;base64,${java.base64Encode(aid+\"&\"+item.cid)},{\"type\":\"c\"}`,\n                pubdate: item.pubdate,\n\n            })\n        })\n    }\n    if (p.ugc_season) {\n        d.unshift({\n            title: \"\u5f53\u524d\u89c6\u9891\",\n            vol: 1\n        });\n\n        let s = p.ugc_season.sections;\n                    if(\/\u5012\u5e8f\/.test(M(\"\u5408\u96c6\"))){\n                          s= s.reverse();\n                    }\n                    d.push({\n                        title:\"\u89c6\u9891\u5408\u96c6\",\n                        vol:1\n                    });\n                      \n                    \n        s.forEach(el=> {\n            if(s.length>1){\n            d.push({\n                        title: \"\ud83c\udfa5 \"+ el.title+\"\u3010\"+el.episodes.length+\"\u4e2a\u89c6\u9891\u3011\",\n                        url:`data:bilibili;base64,${java.base64Encode(\"\ud83c\udfa5\"+el.title)},{\"type\":\"el\"}`\n                    });\n               }\n                    ep = el.episodes;\n                    if(\/\u5012\u5e8f\/.test(M(\"\u5408\u96c6\"))){\n                          ep = ep.reverse();\n                    }\n               ep.forEach((x,i) => {\n                     if(x.bvid === p.bvid){\n                        d[0].title = d[0].title+ \"  \"+(i+1)+\"\/\" +el.episodes.length+\"\u3010\"+el.title+\"\u3011\"+x.title\n                    }\n                if (x.pages.length == 1) {\n                    d.push({\n                        title:(i+1)+\"\ud83c\udff7 \"+ x.title+\" \",\n                        url: `data:bilibili;base64,${java.base64Encode(x.aid + \"&\" + (x.pages[0] ? x.pages[0].cid : x.cid))},{\"type\":\"\"}`,\n                        pubdate: x.arc.pubdate,\n                        desc: formatTimeDynamic(x.arc.duration)\n                    });\n                }\n\n                if (x.pages.length > 1) {\n                     d.push({\n                        title: (i+1)+\" \ud83d\udcd6 \"+ x.title+\"\u3010\"+x.pages.length+\"P\u3011\",\n                        url:`data:bilibili;base64,${java.base64Encode(\"\ud83c\udfa5\"+x.title)},{\"type\":\"el\"}`\n                    });\n                    x.pages.forEach((y,j)=> {\n                        d.push({\n                            title: (i+1)+\"-\" +(j+1)+\"\ud83c\udff7 \"+y.part,\n                            url: `data:bilibili;base64,${java.base64Encode(x.aid + \"&\" + y.cid)},{\"type\":\"\"}`,\n                            pubdate: y?.arc?.pubdate ?? x?.arc?.pubdate ??\"\",\n                            desc: formatTimeDynamic(y?.arc.duration ?? y.duration) + \" \"+x.title\n                        });\n                    });\n                }\n            });\n        });\n    }\n    result = JSON.stringify(d)\n} else if (\/reply\\\/reply\/.test(baseUrl)) {\n    if(JSON.parse(src)?.data?.root?.mid){\n        book.putVariable(\"mid\", JSON.parse(src)?.data?.root?.mid);\n    }\n} else if (\/x\\\/article\\\/view\/.test(baseUrl)) {\n    book.putVariable(\"mid\", S(\"$.data.author.mid\"));\n    result = JSON.stringify([{\n        \"title\": S(\"$.data.title\"),\n        \"url\": getApi(\"article\",S(\"$.data.id\"),S(\"$.data.dyn_id_str\"))\n    }])\n} else if (\/acc\\\/info\/.test(baseUrl)) {\n    let name = S(\"$.data.name\");\n    let mid = S(\"$.data.mid\");\n    let d = [];\n    let roomid = S(\"$.data.live_room.roomid\");\n    \n    let liveStatus = S(\"$.data.live_room.liveStatus\");\n    if (liveStatus == \"1\") {\n        liveStatus = \"\ud83d\udd34\";\n        java.toast(\"\u3010\" + name + \"\u3011\u6b63\u5728\u76f4\u64ad\");\n        java.log(\"\u3010\" + name + \"\u3011\u6b63\u5728\u76f4\u64ad\");\n    } else if (liveStatus == \"0\") {\n        liveStatus = \"\u26aa\ufe0f\"\n    }\n    if (S(\"$.data.live_room.roundStatus\") == \"1\") {\n        liveStatus = \"\ud83d\udfe2\"\n    }\n    let title = S(\"$.data.live_room.title\");\n    \n    if (\/\ud83d\udd34|\ud83d\udfe2\/.test(liveStatus)) {\n        result = java.ajax(\"https:\/\/api.live.bilibili.com\/xlive\/web-room\/v2\/index\/getRoomPlayInfo?room_id=\"+roomid+\"&protocol=0,1&format=0,1,2&codec=0,1&qn=30000\");\n        let data = JSON.parse(result).data;\n        let stream = data.playurl_info?.playurl?.stream;\n        \n        if(stream){\n            let codec = stream[0].format[0].codec[0];\n            let base_url = codec.base_url;\n            let accept_qn = codec.accept_qn;\n            accept_qn.forEach(code=>{\n                d.push({\n                    title:getVideoQuality(code),\n                    vol:true\n                });\n               \n                    codec.url_info.forEach((u,i)=>{\n                         if(codec.current_qn==code){\n                             let host = u.host;\n                             let extra = u.extra;\n                             d.push({\n                                 title: (liveStatus+getVideoQuality(code)+(i+1) + \"\u3001\u3010\" + title + \"\u3011\"  + \" \" + name + \"\u7684\u76f4\u64ad\u95f4\").replace(\/\u3010\u3011\/, \"\"),\n                                 url: `data:liveurl;base64,${java.base64Encode(host+base_url+extra+\"\u274c\"+roomid)},{type:\"live\"}`\n                             })\n                         }else{\n                             d.push({\n                                 title: (liveStatus+getVideoQuality(code)+(i+1) + \"\u3001\u3010\" + title + \"\u3011\"  + \" \" + name + \"\u7684\u76f4\u64ad\u95f4\").replace(\/\u3010\u3011\/, \"\"),\n                                 url: `data:liveurl;base64,${java.base64Encode(i+\"&\"+code+\"\u274c\"+roomid)},{type:\"live\"}`\n                             })\n                         }\n                  })\n              })\n             \n          }else if(data.playurl_info == null){\n              d.push({\n                  title: (liveStatus+\"\u76f4\u64ad\u5df2\u7ed3\u675f\u3010\" + title + \"\u3011\"  + \" \" + name + \"\u7684\u76f4\u64ad\u95f4\").replace(\/\u3010\u3011\/, \"\"),\n                  url: `data:liveurl;base64,${java.base64Encode(\"\u274c\"+roomid)},{type:\"live\"}`\n        })\n          }\n      }else {\n        d.push({\n            title: (liveStatus+\"\u3010\" + title + \"\u3011\" + \" \" + name + \"\u7684\u76f4\u64ad\u95f4\").replace(\/\u3010\u3011\/, \"\"),\n            url: `data:liveurl;base64,${java.base64Encode(\"\u274c\"+roomid)},{type:\"live\"}`\n        })\n    }\n    \n   \n   \/*\n  \/\/  \u76f4\u63a5\u83b7\u53d6\u89c6\u9891\u6d41\n    if (\/\u4e2d\/.test(liveStatus)) {\n        let liveApi = \"https:\/\/api.live.bilibili.com\/room\/v1\/Room\/playUrl?qn=30000&cid=\" + roomid;\n        let data = java.ajax(liveApi);\n        let durl = JSON.parse(data).data.durl;\n        durl.forEach((x,i) => {\n        \tjava.log(durl.length-1-i)\n            d.push({\n                title: \"\u7ebf\u8def\" + x.order,\n                vol: true\n            }, {\n                title: (x.order + \"\u3001\u3010\" + title + \"\u3011\" + liveStatus + \" \" + name + \"\u7684\u76f4\u64ad\u95f4\").replace(\/\u3010\u3011\/, \"\"),\n                url: `data:liveurl;base64,${java.base64Encode(durl[durl.length-1-i].url)},{type:\"live\"}`\n            })\n        })\n    } else {\n        d.push({\n            title: (\"\u3010\" + title + \"\u3011\" + liveStatus + \" \" + name + \"\u7684\u76f4\u64ad\u95f4\").replace(\/\u3010\u3011\/, \"\"),\n            url: `data:liveurl;base64,${java.base64Encode(roomid+\"&\"+mid)},{type:\"live\"}`\n        })\n    }\n    *\/\n   \n    result = JSON.stringify(d)\n} else if (\/data:dynamic_type|opus\\\/detail|v1\\\/detail\/.test(baseUrl)) {\n    \n    result = JSON.stringify([{\n        title:String(book.name),\n        url:baseUrl\n    }])\n}\nresult\n\n<\/js>\n$.[*]&&$.data.root&&$.data.replies[*]&&$.data.archives[*]&&$.data.articles[*]||$.data.items[*]||$.result.main_section.episodes[*]&&$.result.section[*].episodes[*]","chapterName":"$.title||$.long_title||$.content.message||$..root.content.message||$.modules.module_dynamic.major.opus.title||$.modules.module_dynamic.desc.text||$.modules..major..title||$.modules..major..title\n@js:\nif(\/series_id=\/.test(baseUrl)){\n\tresult = result?result + \"id{{$.aid}}\":\"\"\n\t}\nif(\/season_id=\/.test(baseUrl)){\n\tresult = S(\"$.title\")+\" \"+S(\"$.long_title\")+\"\u3010\"+S(\"$.badge_info.text\")+\"\u3011\"\n\t}\nresult.replace(\/\u3010\u3011|^ \/g,'')","chapterUrl":"$.url||$..root.rpid||$.rpid||$.aid||$.id||$.basic.rid_str||$..major..aid||$..id_str\n@js:\nif (\/reply\\\/reply\/.test(baseUrl)) {\t\n\t  content = S(\"$.root.content||$.content\").replace(\/(?:mtime|max_line|jump_url|meta|suggest|jump_title|members|package_id|state|type|attr|id)=.*?,\\s*\/g,'')\n    result = `data:reply;base64,${java.base64Encode(content+\"&\"+S(\"$.mid\"))},{\"type\":\"\"}`;\n} else if (\/series_id=\/.test(baseUrl)) {\n    result = `data:series_id;base64,${java.base64Encode(result)},{\"type\":\"\"}`;\n} else if (\/article\\\/list\/.test(baseUrl)) {\n    result = getApi(\"article\",S(\"$.id\"),S(\"$.dyn_id_str\"))\n}else if(\/feed\\\/space\/.test(baseUrl)){\n\tlet type = S(\"$.type\");\n\tresult = getDynamicUrl(type,src);\n}else if(\/season_id=\/.test(baseUrl)){\n\tresult =  `data:bilibili;base64,${java.base64Encode(S(\"$.aid\")+\"&\"+S(\"$.cid\"))},{\"type\":\"\"}`\n\t}\nresult","formatJs":"title.replace(\/\u3010\\d{6}\u3011$\/,'')","isVolume":"vol","nextTocUrl":"@js:\n\nlet list = [];\nif(\/series_id=\/.test(baseUrl) && !\/pn=2\/.test(baseUrl)){\n\tlet page = Math.ceil(Number(S(\"$.data.page.total\"))\/1000);\n\tfor(i = 2;i<=page;i++){\n\t\t  list.push(baseUrl.replace(\/pn=\\d+\/,'pn='+i))\n\t\t}\n\t}\n\tif(\/reply\\\/reply\/.test(baseUrl) && !\/pn=2\/.test(baseUrl)){\n\t\tlet c = Number(S(\"$.data.page.count\"));\t\n\t\tlet size = Number(S(\"$.data.page.size\"));\n\t\tpage = Math.ceil(c\/size);\n\t\tfor(i = 2;i<=page;i++){\n\t\t  list.push(baseUrl.replace(\/pn=\\d+\/,'pn='+i))\n\t\t}\n\t\t}\nlist","updateTime":"\ud83d\udc64{{$..root.member.uname||$.member.uname}}   {{$..root.reply_control.time_desc||$.reply_control.time_desc}}  {{S(\"$.pubtime||$.meta.ptime||$.pubdate||$.pub_time\")?java.timeFormat(Number(S(\"$.pubtime||$.meta.ptime||$.pubdate||$.pub_time\")+\"000\")):\"\"}}   \u65f6\u957f\uff1a{{$.desc}}{{$.modules.module_dynamic.additional..title&&$.modules.module_dynamic.major.opus.summary.text##\\n## | }}##\ud83d\udc64\\s+|\ud83d\udc64\\s*$|\u65f6\u957f\uff1a(?!\\d)"},"searchUrl":"@js:\n\nlet start = key.slice(0,1);\nlet type;\nswitch(start){\n\tcase \"@\":\n\t    type = \"bili_user\";\n\t    break;\n\tcase \"#\":\n\tcase \"\uff03\":\n\t    type = \"article\"\n\t    break;\n\tcase \"%\":\n\t    type = \"video\"\n\t    break\n\tcase \"&\":\n\t    type = \"live\"\n\t    break;\n\tcase \"*\":\n\t    type = \"media_bangumi\";\n\t    break;\n\t case \"?\":\n\t case \"\uff1f\":\n\t     type = \"media_ft\"\n\t     break\n\t}\nif(type){\nqueryJson = {\n        __refresh__: true,\n        _extra: '',\n        context: '',\n        page: page,\n        page_size: 30,\n        order: '',\n        duration: '',\n        from_source: '',\n        from_spmid: 333.337,\n        platform: 'pc',\n        highlight: 1,\n        single_column: 0,\n        keyword: key,\n        search_type: type,\n        preload: true,\n        com2co: true\n    }\n    parms = getWbiEnc(queryJson);\n    result = 'https:\/\/api.bilibili.com\/x\/web-interface\/wbi\/search\/type?' + parms;\n\n}else{\nresult = \"https:\/\/api.bilibili.com\/x\/web-interface\/wbi\/search\/all\/v2?\"+getWbiEnc({keyword:key,page: page,page_size: 30})\n}","weight":0},{"bookSourceComment":"\u9700\u767b\u5f55\n\u25ce\u641c\u7d22\u683c\u5f0f\u25ce\n1\u3001\u641c\u7d22\u7528\u6237<\u5173\u95ed\u7cbe\u786e\u641c\u7d22>\n@\u7528\u6237\u540d\n2\u3001\u641c\u7d22\u5408\u96c6<\u5173\u95ed\u7cbe\u786e\u641c\u7d22>\n#\u5408\u96c6\n3\u3001\u641c\u7d22\u7cae\u5355\n%\u7cae\u5355\u540d<\u5173\u95ed\u7cbe\u786e\u641c\u7d22>\n4\u3001\u641c\u7d22\u6587\u7ae0\uff0c\u76f4\u63a5\u641c\u7d22\n\n\u53d1\u73b0\u89c4\u5219\u683c\u5f0f\n                                    \ud83c\udff7\u6807\u7b7e\n\u6807\u7b7e\u540d::https:\/\/api.lofter.com\/oldapi\/tagPosts.api?product=lofter-android-7.4.4&method=newTagSearch&offset={{(page-1) *22}}&limit=22&firstpermalink=null&tag=\u6807\u7b7e\u540d&type=new,{\"method\": \"POST\",\"body\":\"null\"}\n\ud83d\udcc3\u7528\u6237\uff08\u641c\u7d22\u53ef\u4ee5\u5f97\u5230)\n\u90e8\u5206\u76ee\u5f55\u7ae0\u8282\u6bd4\u8f83\u591a\uff0c\u52a0\u8f7d\u65f6\u95f4\u4e45\uff0c\u51fa\u73b0\u76ee\u5f55\u52a0\u8f7d\u5931\u8d25\uff0c\u8bf7\u5c1d\u8bd5\u5237\u65b0\uff0c\u56e0\u4e3a\u53ef\u80fd\u662f\u8bf7\u6c42\u5931\u8d25\u5bfc\u81f4\u7684","bookSourceName":"\ud83d\udcd6Lofter","bookSourceType":0,"bookSourceUrl":"\ud83d\udcd6Lofter","bookUrlPattern":"https?:\/\/api\\.lofter\\.com\/(?!.*newsearch).*","concurrentRate":"700","customButton":false,"customOrder":85,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"eventListener":true,"exploreUrl":"\ud83d\udc3e\u6211\u7684\u8db3\u8ff9::https:\/\/api.lofter.com\/v2.0\/history.api?product=lofter-android-6.16.2,{\"method\":\"POST\",\"body\":\"supportposttypes=1%2C2%2C3%2C4%2C5%2C6&blogdomain={{java.ajax(\"https:\/\/www.lofter.com\/\").match(\/class=\"lg2\">([^<]+)<\/)[1]}}&offset={{(page-1)*18}}&method=getList&postdigestnew=1&returnData=1&limit=18&checkpwd=1&needgetpoststat=1\"}   \n\n\u2764\ufe0f\u6211\u7684\u559c\u6b22::https:\/\/api.lofter.com\/v1.1\/batchdata.api?product=lofter-android-8.3.20,{\"method\":\"POST\",\"body\":\"supportposttypes=1%2C2%2C3%2C4%2C5%2C6&blogdomain={{java.ajax(\"https:\/\/www.lofter.com\/\").match(\/class=\"lg2\">([^<]+)<\/)[1]}}&offset={{(page-1)*18}}&method=favorites&postdigestnew=1&returnData=1&limit=18\"}   \n\n\u2b50\ufe0f\u6211\u7684\u8ba2\u9605::https:\/\/api.lofter.com\/newapi\/subscribeCollection\/list.json?offset={{(page-1)*10}} \n\n              ----------     \ud83c\udff7\u6807\u7b7e     ----------               ::\n\u5c0f\u8bf4::https:\/\/api.lofter.com\/oldapi\/tagPosts.api?product=lofter-android-7.4.4&method=newTagSearch&offset={{(page-1) *22}}&limit=22&firstpermalink=null&tag=\u5c0f\u8bf4&type=new,{\"method\": \"POST\",\"body\":\"null\"}\n\n               ----------     \ud83d\udcc3\u7528\u6237     ----------               ::\n\u6e8f\u4e43\u8a00::http:\/\/api.lofter.com\/v2.0\/blogHomePage.api?product=lofter-android-7.4.4,{\"method\":\"POST\",\"body\":\"targetblogid=523035851&supportposttypes=1%2C2%2C3%2C4%2C5%2C6&blogdomain=reroi.lofter.com&offset={{(page-1)*18}}&method=getPostLists&postdigestnew=1&returnData=1&limit=18&checkpwd=1&needgetpoststat=1\"}\n\n\u7802\u4e0a\u96ea::http:\/\/api.lofter.com\/v2.0\/blogHomePage.api?product=lofter-android-7.4.4,{\"method\":\"POST\",\"body\":\"supportposttypes=1%2C2%2C3%2C4%2C5%2C6&blogdomain=taste-s.lofter.com&offset={{(page-1)*18}}&method=getPostLists&postdigestnew=1&returnData=1&limit=18&checkpwd=1&needgetpoststat=1\"}","header":"@js:\nid=String(java.androidId());\nJSON.stringify({\n\"Content-Type\": \"application\/x-www-form-urlencoded;charset=utf-8\",\n\"deviceid\":id})","jsLib":"function getImage(comment_total,postid, blogid,pid){\n\tlet d = String(Date.now()).replace(\/^\\d{6}\/,'');\n  return `<img src=\"data:image\/svg+xml;base64,,{\"style\":\"text\",\"type\":\"lofter\",\"js\":\"getSvg(${comment_total},${postid}, ${blogid}, '${pid}',${d})\"}\">`;\n}\n\nfunction generateHTML(yuan,jsonData) {\n\t\n    let html = `\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>\u6bb5\u8bc4\u5185\u5bb9<\/title>\n    <style>\n        body {\n            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;\n            max-width: 800px;\n            margin: 0 auto;\n            padding: 20px;\n            background-color: #f5f5f5;\n            line-height: 1.6;\n        }\n        .comment-container {\n            background: white;\n            border-radius: 8px;\n            margin-bottom: 15px;\n            padding: 15px;\n            box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n        }\n        .comment-main {\n            margin-bottom: 10px;\n        }\n        .comment-text {\n            color: #333;\n            margin-bottom: 8px;\n            white-space: pre-wrap;\n        }\n        .comment-meta {\n            font-size: 12px;\n            color: #666;\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n        }\n        .comment-user {\n            font-weight: 500;\n            color: #1a73e8;\n        }\n        .comment-time {\n            color: #999;\n        }\n        .comment-likes {\n            color: #ff6b35;\n            font-size: 12px;\n        }\n        .replies {\n            margin-left: 20px;\n            border-left: 2px solid #e0e0e0;\n            padding-left: 15px;\n            margin-top: 10px;\n        }\n        .reply {\n            background: #f8f9fa;\n            padding: 10px;\n            border-radius: 6px;\n            margin-bottom: 8px;\n            font-size: 14px;\n        }\n        .reply:last-child {\n            margin-bottom: 0;\n        }\n        .reply-text {\n            color: #333;\n            margin-bottom: 5px;\n            white-space: pre-wrap;\n        }\n        .reply-meta {\n            font-size: 11px;\n            color: #666;\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n        }\n        .reply-user {\n            font-weight: 500;\n            color: #1a73e8;\n        }\n        .reply-time {\n            color: #999;\n        }\n        .reply-likes {\n            color: #ff6b35;\n            font-size: 11px;\n        }\n        h1 {\n            text-align: center;\n            color: #333;\n            margin-bottom: 30px;\n        }\n        .yuan-text {\n            background: linear-gradient(135deg, #f0f0f0 0%, #e0e0e0 100%); \n            color: black;\n            padding: 20px;\n            border-radius: 10px;\n            font-size: 1em;\n            font-weight: bold;\n            margin-bottom: 20px;\n            box-shadow: 0 4px 8px rgba(0,0,0,0.2);\n        }\n    <\/style>\n<\/head>\n<body>\n    \n    <div class=\"yuan-text\">${yuan}<\/div>\n`;\n\n    jsonData.forEach((comment, index) => {\n        html += `\n    <div class=\"comment-container\">\n        <div class=\"comment-main\">\n            <div class=\"comment-text\">${comment.text.replace(\/\\n\/g, '<br>')}<\/div>\n            <div class=\"comment-meta\">\n                <span class=\"comment-user\">${comment.user}<\/span>\n                <div>\n                    <span class=\"comment-time\">${comment.time}<\/span>\n                    <span class=\"comment-likes\">\u2661 ${comment.like}<\/span>\n                <\/div>\n            <\/div>\n        <\/div>\n`;\n\n        if (comment.reply && comment.reply.length > 0) {\n            html += '<div class=\"replies\">';\n            comment.reply.forEach(reply => {\n                html += `\n            <div class=\"reply\">\n                <div class=\"reply-text\">${reply.text.replace(\/\\n\/g, '<br>')}<\/div>\n                <div class=\"reply-meta\">\n                    <span class=\"reply-user\">${reply.user}<\/span>\n                    <div>\n                        <span class=\"reply-time\">${reply.time}<\/span>\n                        <span class=\"reply-likes\">\u2661 ${reply.like}<\/span>\n                    <\/div>\n                <\/div>\n            <\/div>\n`;\n            });\n            html += '<\/div>';\n        }\n\n        html += `\n    <\/div>\n`;\n    });\n\n    html += `\n<\/body>\n<\/html>\n    `;\n\n    return html;\n}\n\n\nfunction getSvg(comment_total,postid, blogid, pid,date) {\n   let {java,cache,result} = this;\n   let memoryKey = \"lofter\"+postid+blogid+pid;\n   let Memory = String(cache.getFromMemory(memoryKey)); \n  let re = \"1\"+date;\n  let f = Memory.includes(re);\n  \n    if (f) { \n    \tjava.longToast(\"\u6570\u636e\u52a0\u8f7d\u4e2d\u2026\u2026\u8bf7\u7a0d\u5019\");\n    \tlet contentapi = `https:\/\/api.lofter.com\/comment\/pCommentList.json?postId=${postid}&blogId=${blogid}&offset=0&pid=${pid}&imgId=&commentId=`;\n    \t\n    \tlet jsonData = JSON.parse(java.ajax(contentapi)).data.list;\n    \tlet yuan = jsonData[0].quote.replace(\/^(.{40}).*\/,'$1.......');\n    \tlet content = [];\n    \tjsonData.forEach(x=>{\n    \t\t let c = {\n    \t\t \t     text: x.content,\n    \t\t \t     user:x.publisherBlogInfo.blogNickName,\n    \t\t \t     time:java.timeFormat(x.publishTime),\n    \t\t \t     like:x.likeCount\n    \t\t \t}\n    \t\t \tif(x.l2Count>0){\n    \t\t \t\tlet replyapi = `https:\/\/api.lofter.com\/comment\/l2\/page\/abtest.json?postId=${postid}&blogId=${blogid}&id=${x.id}&offset=0&fromSrc=&fromId=`;\n    \t\t \t\tlet replyData = JSON.parse(java.ajax(replyapi)).data.list;\n    \t\t \t\t\n    \t\t \t\tlet replyList = [];\n    \t\t \t\treplyData.forEach(y=>{\n    \t\t \t\t\tlet reply = {\n    \t\t \t\t\t  \ttext: y.content,\n    \t\t \t     user:y.publisherBlogInfo.blogNickName,\n    \t\t \t     time:java.timeFormat(y.publishTime),\n    \t\t \t     like:y.likeCount\n    \t\t \t\t\t\t}\n    \t\t \t\t\treplyList.push(reply)\n    \t\t \t\t\t});\n    \t\t \t\t\tc.reply = replyList\n    \t\t \t\t}\n    \t\t \tcontent.push(c)\n    \t\t});\n    \t\t\n    \tlet html = generateHTML(yuan,content)\n    \t\n       \t\n    \t\njava.base64Encode(html).length()>65364?java.toast(\"\u6570\u636e\u592a\u5927\uff0c\u65e0\u6cd5\u52a0\u8f7d\uff0c\u8bf7\u51cf\u5c11\u8bc4\u8bba\u6570\u91cf\"):\n    \tjava.startBrowser(\"data:text\/html;base64,\"+java.base64Encode(html), \"\u6bb5\u8bc4\");\n   \n}else{\n  cache.putMemory(memoryKey,\"1\"+date)\n }\n     \n    \nlet svg = `\n  <svg width=\"1000\" height=\"800\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n    <path d=\"M865 100 h-600c-60 0-110 50-110 110v150l-120 80 120 80v150c0 60 50 110 110 110h600c60 0 110-50 110-110V210c0-60-50-110-110-110z  \" fill=\"none\" stroke=\"#B2B2B2\" stroke-width=\"55\"\/>\n    <text x=\"570\" y=\"565\" font-family=\"Roboto Condensed\" text-anchor=\"middle\" dominant-baseline=\"middle\" font-size=\"420\" font-weight=\"bold\" fill=\"#707070\">\n      ${comment_total || \"\"}\n    <\/text>\n    <text x=\"520\" y=\"700\" font-family=\"Arial\" text-anchor=\"middle\" font-size=\"40\" fill=\"#000000\">\n      \u5237\u65b0\u56fe\u7247\u67e5\u770b\u6bb5\u8bc4\n    <\/text>\n  <\/svg>\n`;\n    return \"data:image\/svg+xml;base64,\" + java.base64Encode(svg);\n}\n","lastUpdateTime":"1768726166842","loginUi":"[\n    {\n        \"name\": \"\u8d26\u53f7\",\n        \"type\": \"text\"     \n    },\n    {\n        \"name\": \"\u5bc6\u7801[\u6216\u77ed\u4fe1\u9a8c\u8bc1\u7801]\",\n        \"type\": \"password\"\n },{\n        \"name\": \"\ud83d\udcf1\u624b\u673a\u53f7\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"toLogin('phone')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,               \n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83c\udd94LOFTER ID\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"toLogin('id')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,               \n            \"layout_flexBasisPercent\": 0.4\n        }\n    },{\n        \"name\": \"\ud83d\udd22\u83b7\u53d6\u77ed\u4fe1\u9a8c\u8bc1\u7801\",\n        \"type\": \"button\",\n        \"action\": \"getCode()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,               \n            \"layout_flexBasisPercent\": 0.4\n        }\n    },{\n        \"name\": \"\ud83d\udd22\u9a8c\u8bc1\u7801\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"toLogin('code')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,               \n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u8d26\u53f7\u98ce\u9669\u9a8c\u8bc1\u7801\",\n        \"type\":\"text\"   \n    },{\n        \"name\": \"\u83b7\u53d6\u8d26\u53f7\u98ce\u9669\u9a8c\u8bc1\u7801\",\n        \"type\":\"button\",\n        \"action\": \"toCa()\",\n         \"style\": {\n            \"layout_flexGrow\": 1,               \n            \"layout_flexBasisPercent\": 0.4\n        }    \n    },{\n        \"name\": \"\u7acb\u5373\u9a8c\u8bc1\",\n        \"type\":\"button\",\n        \"action\": \"cap()\",\n         \"style\": {\n            \"layout_flexGrow\": 1,               \n            \"layout_flexBasisPercent\": 0.4\n        }    \n    }\n ]","loginUrl":"@js:\nfunction login() {}\n\nfunction toCa() {\n    cookie.removeCookie(\"https:\/\/www.lofter.com\");\n   cookie.removeCookie(\"\ud83d\udcd6Lofter\"); java.ajax(\"https:\/\/www.lofter.com\/front\/membership\/store-vip\/verify-phone\");\n    let token = source.getLoginHeaderMap().get(\"lofter-phone-login-auth\");\n    let co = \"LOFTER-PHONE-LOGIN-AUTH=\\\"\" + token + \"\\\";LofterInnerBrowser=true;\"\n\n    co += cookie.getCookie(\"https:\/\/www.lofter.com\");\n    let headers = JSON.stringify({\n        headers: {\n            Cookie: co\n        }\n    });\n    let verifyPhoneCheck = JSON.parse(java.ajax(\"https:\/\/www.lofter.com\/newweb\/phone\/verifyPhoneCheck.json?_=\" + Date.now() + \",\" + headers));\n    if (verifyPhoneCheck.code == 200) {\n        let phone = java.base64Decode(verifyPhoneCheck.data.cPhone);\n        java.toast(\"\u5f53\u524d\u9a8c\u8bc1\u624b\u673a\u53f7\uff1a\\n\" + phone);\n        source.put(\"phone\",phone);\n        \/\/\u53d1\u9001\u9a8c\u8bc1\u7801\n        let imgurl = \"https:\/\/www.lofter.com\/lpt\/photoCaptcha\/getPhotoCaptcha.do?width=180&height=84&\" + Date.now();\n        let code = java.getVerificationCode(imgurl);\n        let u = \"https:\/\/www.lofter.com\/lpt\/getCaptchaPlus.do?_=\" + Date.now();\n        post = JSON.stringify({\n            method: \"POST\",\n            \"body\": \"phone=\" + phone + \"&imageCode=\" + code + \"&clientType=0&sourceType=1&countryCode=86\",headers: {Cookie: co}\n        });\n   \/\/     java.log(post)\n        let r = java.ajax(u + \",\" + post);\n    \/\/    java.log(r);\n        java.toast(JSON.parse(r).desc)\n    }\n}\n\nfunction cap(){\n    \/\/\u9a8c\u8bc1\u9a8c\u8bc1\u7801\n         try{\n    let token = source.getLoginHeaderMap().get(\"lofter-phone-login-auth\");\n    let co = \"LOFTER-PHONE-LOGIN-AUTH=\\\"\" + token + \"\\\";LofterInnerBrowser=true;\"\n    co += cookie.getCookie(\"https:\/\/www.lofter.com\");\n    \n        let phone = String(source.get(\"phone\"));\n        java.toast(\"\u5f53\u524d\u9a8c\u8bc1\u624b\u673a\u53f7\uff1a\\n\" + phone);\n        u = \"https:\/\/www.lofter.com\/newweb\/phone\/checkPhoneCaptcha.json?_=\" + Date.now();\n        post = JSON.stringify({\n            method: \"POST\",\n            \"body\": {\n                \"countryCode\": 86,\n                \"phone\": phone,\n                \"captcha\": result.get(\"\u8d26\u53f7\u98ce\u9669\u9a8c\u8bc1\u7801\"),\n                \"device\": String(java.androidId())\n            }\n        });\n        \/\/java.log(post)\n         r =\tjava.post(u,JSON.stringify({\n                \"countryCode\": 86,\n                \"phone\": result.get(\"\u8d26\u53f7\"),\n                \"captcha\": result.get(\"\u8d26\u53f7\u98ce\u9669\u9a8c\u8bc1\u7801\"),\n                \"device\": String(java.androidId())\n            }),{Cookie: String(co),\"content-type\":\"application\/json;charset=UTF-8\"}).body();\n     \/\/\tjava.log(r);\n        java.toast(JSON.parse(r).msg)\n         }catch(e){\n             java.log(e)\n         }\n}\n\n\nfunction getCode() {\n    try {\n        let imgurl = \"https:\/\/www.lofter.com\/lpt\/photoCaptcha\/getPhotoCaptcha.do,\" + JSON.stringify({\n            \"method\": \"POST\",\n            \"body\": \"width=270&height=126\"\n        });\n        \/\/\tjava.log(imgurl)\n        java.toast(\"\u8bf7\u8f93\u5165\u56fe\u7247\u9a8c\u8bc1\u7801\");\n        let code = java.getVerificationCode(imgurl);\n        let codeurl = \"https:\/\/www.lofter.com\/lpt\/getCaptchaPlus.do,\" + JSON.stringify({\n            \"method\": \"POST\",\n            \"body\": \"clientType=0&phone=\" + result.get(\"\u8d26\u53f7\") + \"&sourceType=0&imageCode=\" + code\n        });\n        java.toast(JSON.parse(java.ajax(codeurl)).desc)\n        \/\/\tjava.log(java.ajax(codeurl))\n    } catch (e) {\n        java.log(e)\n    }\n}\n\nfunction toLogin(type) {\n    let url = \"https:\/\/www.lofter.com\/lpt\/login.do?product=lofter-android-8.3.20,\";\n    let phone = result ? result.get(\"\u8d26\u53f7\") : \"\";\n    let pwd = result ? result.get(\"\u5bc6\u7801[\u6216\u77ed\u4fe1\u9a8c\u8bc1\u7801]\") : \"\";\n    let body = \"\";\n    switch (type) {\n        case 'phone':\n            body = `deviceType=0&clientType=0&passport=${java.digestHex(pwd,\"SHA-256\")}&phone=${phone}&sourceType=0&type=0`\n            break;\n\n        case 'code':\n            body = `deviceType=0&clientType=0&phone=${phone}&captcha=${pwd}&sourceType=0&type=1`\n            break;\n\n        case 'id':\n            url = \"https:\/\/www.lofter.com\/lpt\/account\/login.do?product=lofter-android-8.3.20,\";\n            body = `password=${java.digestHex(pwd,\"SHA-256\")}&blogName=${phone}`;\n            break;\n    }\n\n    let post = JSON.stringify({\n        \"method\": \"POST\",\n        \"body\": String(body)\n    });\n    \/\/\tjava.log(post)\n    let headers = {}\n    let d = JSON.parse(java.ajax(url + post));\n    java.toast(d.desc);\n\n    if (d.result == 0) {\n        headers[\"lofter-phone-login-auth\"] = d.token;\n        source.putLoginHeader(JSON.stringify(headers));\n    } else if (type == \"id\" && d.status == 200) {\n\n        headers[\"authorization\"] = \"ThirdParty \" + d.token;\n        source.putLoginHeader(JSON.stringify(headers));\n\n    }\n}","respondTime":2608,"ruleBookInfo":{"author":"$.response.blogInfo.blogNickName||$.response.posts[0].post.blogInfo.blogNickName||$.data.blogInfo.blogNickName","canReName":"1","coverUrl":"$.response.collection.coverUrl||$..firstImageUrl[0]||$..coverUrl||$..blogInfo.bigAvaImg||$..bigAvaImg@put:{\"page\":\"$.response.blogInfo.blogStat.publicPostCount\"}##(http.*)\\n*##$1###","init":"<js>\n\/*\ntry{\ncoo = cookie.getCookie(\"https:\/\/www.lofter.com\");\n\nlofter = String(coo).match(\/;\\s(LOFTER-[^-]+-LOGIN-AUTH)=(.*?);\/);\n\nheader = {};\nheader[lofter[1]] = lofter[2];\n\njava.log(JSON.stringify(header))\nsource.putLoginHeader(JSON.stringify(header));\nresult;\n}catch(e){\n\tjava.log(e)\n\tresult = result\n}\n*\/\ncookie.removeCookie(\"https:\/\/www.lofter.com\/\");\ncookie.removeCookie(\"\ud83d\udcd6Lofter\");\nif(\/origin\/.test(baseUrl)){\nurl = baseUrl.split(',{\"origin')[0];\njava.put(\"url\",url)\nresult = java.ajax(url);\n}\nresult\n<\/js>","intro":"@js:\na='{{$.response.collection.description}}';\nb='{{$.response.blogInfo.blogNickName}}';\nc=java.getString('$.response.posts[0].post.digest||$.response.collection.description||$.response.blogInfo.selfIntro');\n\nresult =\"&emsp;&emsp;\"+c;\n\ncname=\"{{$.response.posts[0].post.postCollection.name}}\";\n\ncdes=java.getString('$.response.posts[0].post.postCollection.description');\nccount=\"{{$.response.posts[0].post.postCollection.postCount}}\";\nif(cname || a){\nresult=result+\"\\n&lrm;\\n\ud83c\ude34\u6240\u5c5e\u5408\u96c6\uff1a\"+cname+\"\\n\ud83d\udcdc\u5408\u96c6\u4ecb\u7ecd\uff1a\"+cdes+\"\\n\"+\"\ud83d\udd22\u5408\u96c6\u7ae0\u8282\u603b\u6570\uff1a\"+ccount\n+\"\\n\ud83d\udd0d\u641c\u7d22\u5408\u96c6\uff1a#\"+cname+\"<\u5173\u95ed\u7cbe\u786e\u641c\u7d22>\";\n\nresult = String(result).replace(\/\ud83d\udcdc\u5408\u96c6\u4ecb\u7ecd\uff1a\\n\/,'').replace(\/\ud83c\ude34\u6240\u5c5e\u5408\u96c6\uff1a\\s+\ud83d\udd22\u5408\u96c6\u7ae0\u8282\u603b\u6570\uff1a\\s+\ud83d\udd0d\u641c\u7d22\u5408\u96c6\uff1a#<\u5173\u95ed\u7cbe\u786e\u641c\u7d22>\/g,'')\n}\n\nresult += `<br>&lrm;<br>--\u590d\u5236\u4e0b\u9762\u7684\u6587\u5b57\uff0c\u53ef\u5c06\u4f5c\u8005\u6dfb\u52a0\u53d1\u73b0\u6216\u8005\u8ba2\u9605--<br>&lrm;<br>${book.author}::http:\/\/api.lofter.com\/v2.0\/blogHomePage.api?product=lofter-android-7.4.4,{\"method\":\"POST\",\"body\":\"supportposttypes=1%2C2%2C3%2C4%2C5%2C6&blogdomain=${String(java.getString(\"$..blogInfo.blogName\")).match(\/(.*)\\n*\/)[1]}.lofter.com&offset={\\{(page-1)*18}}&method=getPostLists&postdigestnew=1&returnData=1&limit=18&checkpwd=1&needgetpoststat=1\"}`","kind":"$.postCollection\n@js:\nname = String(java.getString(\"$..blogInfo.blogName\")).match(\/(.*)\\n*\/)[1];\nbook.putVariable(\"name\",name);\nresult","name":"$.response.collection.name||$..post.title||$.data.grainInfo.name||$.response.blogInfo.blogNickName||$.response.posts[0].post.blogInfo.blogNickName||$.data.blogInfo.blogNickName","tocUrl":"$.response.blogsetting.blogId\n@js:\nif(result){\nid='{{$.response.blogsetting.blogId}}';\nlink='{{$.response.blogLink}}';\nurl='http:\/\/api.lofter.com\/v2.0\/blogHomePage.api?product=lofter-android-6.9.2,';\npost={\"method\": \"POST\",\n\"body\": \"targetblogid=\"+id+\"&supportposttypes=1%2C2%2C3%2C4%2C5%2C6&blogdomain=\"+link+\"&offset=0&method=getPostLists&postdigestnew=1&returnData=1&limit=500&checkpwd=1&needgetpoststat=1\"}\nresult=url+JSON.stringify(post);\njava.put('url',result)}else if(baseUrl.match(\/postCollection\/)){\nresult=java.get('url')\n}","wordCount":"{{$.data.grainInfo.postCount}}\u7bc7\u6587\u7ae0##^\u7bc7\u6587\u7ae0$"},"ruleContent":{"callBackJs":"if(event == \"clickAuthor\"){\n\tblogdomain= book.getVariable(\"name\")+\".lofter.com\";\n\tblogid = book.bookUrl.match(\/(?:blogid|grainUserId)(?:_|=)(\\d+)\/)[1];\n\turl = `https:\/\/api.lofter.com\/v1.1\/postCollection.api?product=lofter-android-8.3.20#${blogdomain}\u274c${blogid}\u274c${book.author},`\npost = {\"method\":\"POST\",\n\t\"body\":`blogdomain=${blogdomain}&method=getCollectionList&needViewCount=1&blogid=${blogid}`\t}\n\turl = url+JSON.stringify(post);\n\tjava.open(\"explore\", url, book.author+\"\u7684\u5408\u96c6\")\n\ttrue\n\t}\n\n\nif(event == \"longClickAuthor\"){\n\tblogdomain= book.getVariable(\"name\")+\".lofter.com\";\n\tblogid = book.bookUrl.match(\/(?:blogid|grainUserId)(?:_|=)(\\d+)\/)[1];\n\turl = `http:\/\/api.lofter.com\/v2.0\/blogHomePage.api?product=lofter-android-8.3.20#${blogdomain}\u274c${blogid}\u274c${book.author},`\npost = {\"method\":\"POST\",\n\t\"body\":`,{\"method\":\"POST\",\"body\":\"targetblogid=${blogid}&supportposttypes=1%2C2%2C3%2C4%2C5%2C6&blogdomain=${blogdomain}.lofter.com&offset={{(page-1)*18}}&method=getPostLists&postdigestnew=1&returnData=1&limit=18&checkpwd=1&needgetpoststat=1\"}`\n\t\t}\n\t\n\turl = url+JSON.stringify(post);\n\tjava.open(\"explore\", url, book.author+\"\u7684\u52a8\u6001\")\n\ttrue\n\t}","content":"<js>\nlet srcall = src;\nif(\/\\.mp4\/.test(baseUrl)){\n\tjava.startBrowser(baseUrl,\"\u89c6\u9891\");\n\tresult = \"\u8bf7\u70b9\u51fb\u7ae0\u8282\u94fe\u63a5\u89c2\u770b\u89c6\u9891\\n\u89c6\u9891\u94fe\u63a5\uff1a\"+baseUrl\n\t}else{\nlet returnContent = \"\";\t\t\nlet returnimages = [];\nlet content = String(java.getString(\"$..content\"));\nlet pics = JSON.parse(src)?.data?.plan?.images??[];\nlet posts = JSON.parse(src)?.response?.posts??[];\nposts.forEach(x=>{\n\t   let returnContents = x.post?.returnContent??[];\n\t   returnContents.forEach(y=>{\n\t   \t\t   \treturnContent += \"\\n\ud83c\udff7 \"+y.planTypeName+\"\\n\"+y.content+\"\\n\";\n\t   \t\t   \ty.images?returnimages.concat(y.images):null;\n\t   \t})\n\t});\n\t\nif(pics){\n\tpics=pics.map(x=>`<img src=\"${x.raw}\">\\n`).join(\"\");\n\t}\nlet postid = java.getString(\"$..post.id\");\nlet blogid = java.getString(\"$..post.blogId\");\nlet f = 0;\ntry{\n\tbook.getVariable();\n\tf = 1;\n\t}catch(e){\t}\nlet dpcontent = \"\";\nif(\/\u6bb5\u8bc4\/.test(source.getVariable()) && f===1){\nif(!\/myReturnGift\/.test(baseUrl)){\n\tlet api = `https:\/\/api.lofter.com\/comment\/pCommentCounts.json?postId=${postid}&blogId=${blogid}`;\n let pidall = JSON.parse(java.ajax(api)).data.list;\n  java.put(\"pidall\",JSON.stringify(pidall));\n  java.put(\"postid\",String(postid));\n  java.put(\"blogid\",String(blogid));\n\tjava.setContent(content);\n\tlet c = \"\";\n\tcontent = java.getElements(\"@@tag.p\").toArray().map(x=>{\n\t\tvar pid = String(x.attr(\"id\"));\n\t\tvar originalText = x.text(); \n   var matchedItem = pidall.find(function(item) {\n        return item.pid === pid && item.count!==0;\n    });\n    if (matchedItem && String(x.text()).trim()!==\"\") {\n        var comment_total = matchedItem.count;                 \n        var pid = matchedItem.pid;                                 \n        var imageOrContent = getImage(comment_total, postid, blogid, pid);\n        return originalText+imageOrContent;      \n    }else{\n    \t return originalText\n    \t}\n\t\t}).join(\"\\n\");\n        if(returnContent.trim()!==\"\"){\n            content = content+returnContent\n        }\n\t}else if(\/myReturnGift\/.test(baseUrl) && String(content).trim()!==\"\"){\n   pidall = JSON.parse(java.get(\"pidall\"));  \n   content = content.split(\"\\n\").map((x,i)=>{\n\t\t\t   originalText = String(x);\n\t\t\t   matchedItem = pidall.find(function(item,index) {\t\t\t    \n\t\t\t   \n           return (item.pid.match(\/r_.*?_i(\\d+)\/)?item.pid.match(\/r_.*?_i(\\d+)\/)[1]:item.pid) == i;\t\t\t\n    });\n\t\t\t\n\t\t\tif (matchedItem) {\n         comment_total = matchedItem.count;                 \n         pid = matchedItem.pid;                               \n         imageOrContent = getImage(comment_total, java.get(\"postid\"), java.get(\"blogid\"), pid);\n        return originalText.replace(\/\\s+$\/g,'')+imageOrContent;      \n    }else if(originalText.trim()!==\"\"){\n    \t   return originalText\n    \t}\n\t\t\t}).join(\"\\n\");\n}\njava.setContent(srcall);\n}else{\n    if(returnContent.trim()!==\"\"){\n            content = content.match(\/<p[^>]+>[\\s\\S]*?<\\\/p>\/g).join(\"\")+returnContent\n        }\n}\n\nimgs = eval(String(java.getString(\"$..photoLinks\")));\nvideo =\/video_down_url\\\\\":\\\\\"(.*?)\\\\\"\/.test(result)? \"\u89c6\u9891\u94fe\u63a5\uff1a\"+String(result).match(\/video_down_url\\\\\":\\\\\"(.*?)\\\\\"\/)[1]:\"\";\nimg = \"\";\nimgs?imgs.forEach(x=>{\n\tx?img += \"<img src=\\\"\"+x.orign.replace(\/%7C.*\/g,'')+\"\\\">\\n\":\"\"\n\t}):\"\";\ng=\t(\/myReturnGift\/.test(baseUrl)&&(\/[\\u4e00-\\u9fa5]\/.test(content) || pics))?\"\ud83c\udff7 \"+java.getString(\"$..planType.name\")+\" \"+java.getString(\"$.data.plan.title\")+\"\\n\"+(String(java.getString(\"$..promotion\"))?\"\u3010\"+java.getString(\"$..promotion\")+\"\u3011\\n\":\"\"):\"\";\n\nresult = g+ content + pics+ \"\\n\"+img+\"\\n\"+video;\n\nif(video && (chapter.index == book.durChapterIndex)){\n \tjava.startBrowser(video.replace(\/\u89c6\u9891\u94fe\u63a5\uff1a\/,''),\"\u5185\u5bb9\");\n \tresult = \"\u2757\ufe0f\u5237\u65b0\u672c\u7ae0\u8282\u64ad\u653e\u89c6\u9891\u2757\ufe0f\"+result;\n \t\t\t}\n}\nif(result ==\"\\n\\n\")result = String(java.getString(\"$..msg\")).replace(\/success\/g,'');\nresult = result.replace(\/<img[^>]*?src[^>]*?prompt_list_risk[^>]*?>\/g,'').replace(\/<a[^>]*?store-vip\\\/verify-phone\"[^>]*?>\/,'\u5f53\u524d\u8d26\u53f7\u5b58\u5728\u98ce\u9669\uff0c\u9700\u9a8c\u8bc1\u3002\\n\uff08\u2757\ufe0f\u8981\u770b\u5f69\u86cb\u8bf7\u5b8c\u6210\u9a8c\u8bc1\u540e\u5237\u65b0\u6b63\u6587\uff09\\n1\u3001\u70b9\u51fb\u767b\u5f55\u3002\\n2\u3001\u70b9\u51fb\u83b7\u53d6\u8d26\u53f7\u98ce\u9669\u9a8c\u8bc1\u7801\\n3\u3001\u586b\u5165\u9a8c\u8bc1\u7801\\n4\u3001\u70b9\u51fb\u7acb\u5373\u9a8c\u8bc1\\n5\u3001\u63d0\u793a\u6210\u529f\u5373\u53ef\u5237\u65b0\u6b63\u6587\u83b7\u53d6\u5185\u5bb9');\nresult\n<\/js>\n##tbc\\.|\u6ca1\u6709\u8d60\u793c\u8bb0\u5f55|\u3010\u6210\u4e3a\u6211\u7684\u9ad8\u7ea7\u7c89\u4e1d\uff0c\u89e3\u9501\u6211\u7684\u56de\u793c\u4e0e\u6d77\u91cf\u6743\u76ca\u3011##<br>","imageStyle":"FULL","nextContentUrl":"<js>\nif(!\/myReturnGift\/.test(baseUrl)){\ntry{\n\t\tid = java.getString(\"$..post.id\");\n\t\tid2 = java.getString(\"$..post.blogId\");\nurl =\"https:\/\/api.lofter.com\/v1.1\/trade\/gift\/post\/newSupportInfo?postId=\"+id+\"&blogId=\"+id2+\"&openFansVipPlan=0&vipFans=0\";\n\t$  = JSON.parse(String(java.ajax(url)));\n\tl = $.data.gainReturnGifts.length?$.data.gainReturnGifts:$.data.returnGifts;\n\tls = []\n\tl.forEach(x=>{\n\t\turl = \"https:\/\/api.lofter.com\/v1.1\/trade\/gift\/myReturnGift?id=\"+x.id+\"&postId=\"+id+\"&blogId=\"+id2;\n\t\tls.push(url)\n\t\t})\n\tresult = ls\n\t}catch(e){\n\t\t}\n\t}\n<\/js>","replaceRegex":"##src=\"((?:(?!.*;base64,).)*)\"##src=\"$1,{'headers':{'referer':'{{$..blogPageUrl}}'}}\""},"ruleExplore":{"author":"$.post.blogInfo.blogNickName","bookList":"<js>result.replace(\/null\/g,'')<\/js>\n$.response.items[*]||$.response.posts[*]||$.response.collections[*]||$.data.collections[*]","bookUrl":"@js:url='{{$.post.blogId||$.post.blogPageUrl}}';\nid='{{$.post.id||$.id||$.collectionId}}';\nmain=url.match(\/_blogid_\\d+\/)?url.match(\/_blogid_(\\d+)\/)[1]:url;\nif(!url)main = baseUrl.match(\/#(.*?)\u274c\/)?.[1].replace(\/\\.lofter\\.com\/g,'');\nbody=\"blogdomain=_blogid_\"+main+\".lofter.com&postid=\"+id;\nresult='https:\/\/api.lofter.com\/oldapi\/post\/detail.api?product=lofter-android-8.3.20,{\"method\":\"POST\",\"body\":\"'+String(body)+'\"}';\nif(!url){\n\tblogid = baseUrl.match(\/\u274c(.*?)\u274c\/)?.[1]||java.getString(\"$.blogId\");\tresult='https:\/\/api.lofter.com\/v1.1\/postCollection.api?product=lofter-android-8.3.20,{\"method\": \"POST\",\"body\":\"blogdomain='+main+'.lofter.com&method=getCollectionSimple&offset=0&limit=2000&blogid='+blogid+'&collectionid='+id+'&order=1\"}';\n\t}","coverUrl":"$.post||$.coverUrl\n@js:if(result.match(\/firstImageUrl=\\[\"\",\"\"\\]\/)){\nresult=result.match(\/bigAvaImg=(.*?),\/)?result.match(\/bigAvaImg=(.*?),\/)[1]:'';}else if(\/^http\/.test(result)){\n\tresult = result\n\t}else{\nresult=result.match(\/firstImageUrl=\\[\"([^\"]+)\"\/)?result.match(\/firstImageUrl=\\[\"([^\"]+)\"\/)[1]:\"\"\n}","intro":"{{$.post.digest}}\n<br>&lrm;<br>\n--\u590d\u5236\u4e0b\u9762\u7684\u6587\u5b57\uff0c\u7c98\u8d34\u81f3\u53d1\u73b0\u89c4\u5219\u6dfb\u52a0\u7528\u6237--\n{{$.post.blogInfo.blogNickName}}::http:\/\/api.lofter.com\/v2.0\/blogHomePage.api?product=lofter-android-8.3.20,{\"method\":\"POST\",\"body\":\"targetblogid={{$.post.blogInfo.blogId}}&supportposttypes=1%2C2%2C3%2C4%2C5%2C6&blogdomain={{$.post.blogInfo.blogName}}.lofter.com&offset={{'\\{\\{(page-1)*18\\}\\}&method=getPostLists&postdigestnew=1&returnData=1&limit=18&checkpwd=1&needgetpoststat=1\"}'}}\n@js:\nif(\/\u274c\/.test(baseUrl)){\n\tresult = `<br>&lrm;<br>\n--\u590d\u5236\u4e0b\u9762\u7684\u6587\u5b57\uff0c\u7c98\u8d34\u81f3\u53d1\u73b0\u89c4\u5219\u6dfb\u52a0\u7528\u6237--\n${baseUrl.match(\/\u274c.*?\u274c(.*)$\/)[1]}::http:\/\/api.lofter.com\/v2.0\/blogHomePage.api?product=lofter-android-8.3.20,{\"method\":\"POST\",\"body\":\"targetblogid=${baseUrl.match(\/\u274c(\\d+)\/)[1]}&supportposttypes=1%2C2%2C3%2C4%2C5%2C6&blogdomain=${baseUrl.match(\/#(.*?)\u274c\/)[1]}&offset={{'\\{\\{(page-1)*18\\}\\}&method=getPostLists&postdigestnew=1&returnData=1&limit=18&checkpwd=1&needgetpoststat=1\"}'}}`\n\t}\nresult","kind":"$.post.tag||$.tags","lastChapter":"$.post.publishTime||$.postCount||$.unreadCount\n<js>\nif(\/\\d{13}\/.test(result)){\nresult=java.timeFormat(parseInt(result));\njava.put('time',result)\n}else{\n\tresult = result+\"\u7bc7\u6587\u7ae0\"\n\tif(String(java.getString(\"$.unreadCount\")))result=\"\u66f4\u65b0\"+result\n\t}\n<\/js>\n##^\u7bc7\u6587\u7ae0$","name":"$.post.title||$.post.noticeLinkTitle||$.post.digest||$.post.blogInfo.blogId||$.post.blogPageUrl||$.name##<\/*\\w.*?>"},"ruleSearch":{"author":"$.blogInfo.blogNickName||$.blogName","bookList":"$..postData[*]||$.data.posts[*]||$.data.blogs[*]||$.data.collections[*]||$.data.grainList[*]","bookUrl":"$.postPageUrl\n@js:\nif(!result){\n    if(!'{{$.name}}'){\n        id='{{$.blogId}}';\n        result='http:\/\/api.lofter.com\/v2.0\/blogHomePage.api?product=lofter-android-8.3.20,{\"method\": \"POST\",\"body\":\"targetblogid='+id+'&method=getBlogInfoDetail&returnData=1&checkpwd=1&needgetpoststat=1\"}'\n    }else if(\/grain.json\/.test(baseUrl)){\n        result = \"https:\/\/api.lofter.com\/api-grain\/grain\/getDetail.json?grainId={{$.id}}&offset=0&grainUserId={{$.userId}}\"\n    }else{\n        blogid='{{$.blogId}}';\n        id='{{$.id}}';\n        name='{{$.blogName}}';\n        java.put('name',name);\n        result='https:\/\/api.lofter.com\/v1.1\/postCollection.api?product=lofter-android-8.3.20,{\"method\": \"POST\",\"body\":\"blogdomain='+name+'.lofter.com&method=getCollectionSimple&offset=0&limit=2000&blogid='+blogid+'&collectionid='+id+'&order=1\"}';\n        java.put('url',result)\n    }\n}else{\n    body=\"blogdomain=_blogid_{{$.blogId}}.lofter.com&postid={{$.id}}\";\n    result='https:\/\/api.lofter.com\/oldapi\/post\/detail.api?product=lofter-android-8.3.20,{\"method\":\"POST\",\"body\":\"'+String(body)+'\"}';\n};\n","checkKeyWord":"\u6211\u4eec\u4e5f\u73a9\u70b9\u4e0d\u4e00\u6837\u7684","coverUrl":"$.firstImageUrl[0]||$.blogInfo.bigAvaImg||$.bigAvaImg||$.coverUrl","intro":"{{$.digest||$.selfIntro||$.posts[0].digest||$.description}}","kind":"$.tagList||$.tags","lastChapter":"$.publishTime\n<js>\nlet title = java.getString('$.posts[0].title||$.posts[0].digest');\nif(result){\nresult?result=java.timeFormat(parseInt(result)):'';\njava.put('time',result)}else if(title){\n\tresult = title\n\t}else{\n\tresult = \"{{$.postCount}}\u7bc7\u6587\u7ae0\"\n}<\/js>\n##<\/*\\w+.*?>|^0*\u7bc7\u6587\u7ae0$|^\u7bc7\u6587\u7ae0$","name":"$.title||$.noticeLinkTitle||$.digest||$.blogInfo.blogNiceName||$.blogNickName||$.name\n<js>\nprefix = java.get(\"prefix\");\nresult = \/[@#%\uff03]\/.test(prefix)?prefix+result:result\n<\/js>\n##<\/*\\w.*?>"},"ruleToc":{"chapterList":"$..posts[*]||$.response.items[*]@put:{\"blogname\":\"$..blogName\"}\n<js>\n\nif(result.length){\n\tresult\n\t}else{\n\t\t\"[{'title':'\u6682\u65e0\u76ee\u5f55'}]\"\n\t\t}\n<\/js>\n$.[*]","chapterName":"$.post.title||$.post.digest||$.post.blogInfo.blogNickName||$..postView.title||$..postView.digest||$.title\n<js>if(result){\nresult=result\n}else{result=book.name}\nString(result).replace(\/<\\\/*\\w.*?>\/g,'')\n<\/js>\n##(^.{1,25})##$1###","chapterUrl":"<js>\nif(\/postCollection|blogHomePage|api-grain\/.test(baseUrl)){\tbody=\"blogdomain=_blogid_{{$.post.blogId||$..postView.blogId}}.lofter.com&postid={{$.post.id||$..postView.id}}&needgetpoststat=1&supportposttypes=1,2,3,4,5,6&requestType=0\";\nresult='https:\/\/api.lofter.com\/oldapi\/post\/detail.api?product=lofter-android-8.3.20,{\"method\":\"POST\",\"body\":\"'+String(body)+'\"}';\n\t}else\tif(\/video_down_url\":\"(.*?)\"\/.test(result)){\n\t\tresult = String(result).match(\/video_down_url\":\"(.*?)\"\/)[1];\n\t\t}else{\n\t\t\tresult = baseUrl\n\t\t\t}\n<\/js>","formatJs":"\"\u7b2c\"+index+\"\u7bc7 \"+title","nextTocUrl":"<js>\nlist=[];\nif(\/limit=500\/.test(baseUrl)){\npages=java.get(\"page\");\npage=parseInt(pages\/500);\nurl=String(java.get(\"url\"));\nif(page>6){\npage=6\n}else{page=page}\nfor(i=1;i<=page;i++){\nlist.push(url.replace(\/offset=\\d+\/,'offset='+(parseInt(i)*500)))\n}\n}else if(\/api-grain\/.test(baseUrl)){\n\toffset = \"{{$.data.offset}}\";\n\tif(offset!=\"-1\"){\n\tlist = baseUrl.replace(\/offset=\\d+\/,'offset='+offset);\n}\n\t}\nlist\n<\/js>","updateTime":"$.post.publishTime\n<js>\nif(\/api-grain\/.test(baseUrl)){\n\tresult = \"\u6240\u5c5e\u5408\u96c6\uff1a\"+java.getString(\"$..postCollection.name\");\n\t}else{\n(result?java.timeFormat(parseInt(result)):java.get('time'))+\" \"+\"\u6240\u5c5e\u5408\u96c6\uff1a\"+java.getString(\"$..postCollection.name\")\n}\n<\/js>\n##\u6240\u5c5e\u5408\u96c6\uff1a$"},"searchUrl":"@js:\n\nlet prefix = key.charAt(0);\njava.put(\"prefix\",prefix);\nlet offset = '{\\{(page-1) *' + (prefix === '%' ? '10}' : (prefix === '@' ? '10}' : '20}')) + '}';\nlet baseUrl = \"https:\/\/api.lofter.com\/newsearch\/\"\nswitch(prefix) {\n    case '@':\n        result = baseUrl+'blog.json?key=' + key.slice(1)+ '&limit=10&offset=' + offset;\n        break;\n    case '#':\n    case '\uff03':\n        result = baseUrl+'collection.json?key=' + key.slice(1) + '&limit=20&offset=' + offset;\n        break;\n    case '%':\n        result = baseUrl+'grain.json?key='+key.slice(1)+'&limit=10&offset=' + offset;\n        break;\n    default:\n        let header = {\n            \"headers\": {\n                \"Content-Type\": \"application\/x-www-form-urlencoded;charset=utf-8\",\n                \"deviceid\": java.androidId(),\n                \"if-modified-since\": String(new Date()).replace(\/(.*?)\\s(.*?)\\s(.*?)\\s(.*?)GMT.*\/,'$1, $3 $2 $4 GMT')\n            }\n        };\n        result = baseUrl+'post.json?key=' + key + '&sortType=0&offset=' + offset + '&limit=20,' + JSON.stringify(header);\n}\n","weight":0},{"bookSourceName":"\ud83c\udf45\u56e2\u5915\u5c0f\u8bf4","bookSourceType":0,"bookSourceUrl":"https:\/\/novel.snssdk.com","customOrder":3,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"@js:\n\nlet sort = [];\npush = (title, url, type) => sort.push({\n    title: title,\n    url: url,\n    style: {\n        layout_flexBasisPercent: type\n    }\n});\n    push('\u756a\u8304\u4e66\u67b6', 'https:\/\/fanqienovel.com\/reading\/bookapi\/bookshelf\/info\/v:version\/?aid=1967&iid=0&version_code=56910&update_version_code=56910', 1);\n    push('\u5dc5\u5cf0\u699c\u5355', 'https:\/\/fanqienovel.com\/api\/author\/misc\/top_book_list\/v1\/?limit=100&offset=0', 0.29);\n    push('\u51fa\u7248\u699c\u5355', 'https:\/\/fanqienovel.com\/api\/node\/publication\/list?page_index=0&page_count=100', 0.29);\n    push('\u7206\u66f4\u699c\u5355', 'https:\/\/api-lf.fanqiesdk.com\/api\/novel\/channel\/homepage\/rank\/rank_list\/v2\/?aid=13&limit=50&offset=0&side_type=15&type=1', 0.29);\n    push('\u9ed1\u9a6c\u699c\u5355', 'https:\/\/api-lf.fanqiesdk.com\/api\/novel\/channel\/homepage\/rank\/rank_list\/v2\/?aid=13&limit=50&offset=0&side_type=13&type=1', 0.29);\n    push('\u70ed\u641c\u699c\u5355', 'https:\/\/api-lf.fanqiesdk.com\/api\/novel\/channel\/homepage\/rank\/rank_list\/v2\/?aid=13&limit=50&offset=&side_type=12&type=1', 0.29);\t\n    push('\u6bcf\u5468\u63a8\u8350', 'https:\/\/fanqienovel.com\/api\/rank\/recommend\/list?type=1&limit=10&offset=0', 0.29);\t\n\t\n\tA=[[\"\u63a8\u8350\",\"10\"],[\"\u5b8c\u7ed3\",\"11\"],[\"\u70ed\u641c\",\"12\"]]\t;\n[[\"\u7537\u9891\",\"1\"],[\"\u5973\u9891\",\"0\"]].map([title,id]=>{\n\tpush('\u2764\ufe0f'+title+'\u699c\u5355\u2764\ufe0f', null, 1);\n\tif(id==2){ \tA=A.slice(1,A.length-1) }\n\t\tA.map([title,uri]=>{\t\t\t\n\t\t  \turl= `https:\/\/novel.snssdk.com\/api\/novel\/channel\/homepage\/rank\/rank_list\/v2\/?aid=13&app_name=news_article&app_version=9.7.3&channel=tengxun_tt&device_platform=android&os=android&device_type=ProjectTitan&os_api=29&os_version=10&openlive_plugin_status=1&isTTWebViewHeifSupport=0&limit=100&offset={{(page-1)*100}}&side_type=${uri}&type=${id}`;\n\t\t\t\tpush(title, url, 0.29);\t\t\t\n\t\t\t});\n\t});\t\n\t\n\tcategory = () =>{\n\t\t\tcategory_url = \"https:\/\/novel.snssdk.com\/api\/novel\/channel\/homepage\/new_category\/page\/data\/v1\/?aid=13\";\nreturn  JSON.parse(java.ajax(category_url)).data\t\t\n\t\t}\n\t\t  \n  json = (data) => {\n     boy = data.boy_category;\n     girl = data.girl_category;\n     publish = data.publish_category;\n     json = [[\"\u7537\u9891\",\"gender=1\",boy],[\"\u5973\u9891\",\"gender=0\",girl],[\"\u51fa\u7248\",\"genre_type=160\",publish]];\n     return JSON.parse(JSON.stringify(json));\n   }\t\n\t\tjson(category()).map([tit1,gender,category]=>{\n\t    push('\u2764\ufe0f'+tit1+'\u2764\ufe0f', null, 1);\n     category.map(($,index)=>{\n     \tindex++;\n\t    title = $.category_name;\n     \tcid = $.category_id;\n\t    url=  `https:\/\/novel.snssdk.com\/api\/novel\/channel\/homepage\/new_category\/book_list\/v1\/?aid=1967&app_name=news_article&app_version=9.7.3&channel=tengxun_tt&creation_status=9&device_platform=android&enter_from=novel_category&novel_host&novel_version&version_code=973&version_name=9.7.3&word_count=9&os=android&device_type=ProjectTitan&os_api=29&os_version=10&offset={{(page-1)*100}}&limit=100&category_id=${cid}&${gender}`;\n\t\t\t\tpush(title, url, 0.29);\t\n      });\n  });\nJSON.stringify(sort);","header":"{\n\t\"user-agent\":\"Mozilla\/5.0 (Linux; Android 10; TAS-AN00 Build\/HUAWEITAS-AN00; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/114.0.5735.61 Mobile Safari\/537.36 Super 4.6.5\"\n}","lastUpdateTime":"1768736466311","loginUrl":"https:\/\/fanqienovel.com","respondTime":180000,"ruleBookInfo":{"author":"author","coverUrl":"thumb_url","init":"data[0]","intro":"&nbsp;&nbsp;\n\u270f\ufe0f \u5f00\u5751\uff1a{{$.create_time##T.*}}\n\ud83d\udd70 \u66f4\u65b0\uff1a{{java.timeFormatUTC(java.getString(\"last_chapter_update_time\")*1000,'yyyy-MM-dd HH:mm:ss',8)}}\n\ud83c\udff7\ufe0f \u6807\u7b7e\uff1a{{$.complete_category##\/##,}}\n\ud83c\udff7\ufe0f \u6807\u7b7e\uff1a{{$.tags}}\n\ud83d\udc64 \u4e3b\u89d2\uff1a{{$.roles##\\[|\\\"|\\]}}\n\ud83d\udc41\ufe0f \u5728\u7ebf\uff1a{{$.read_count}}\u4eba\u5728\u8bfb{{'\\n'+'\u200b'}}\n\ud83d\udcdc \u7b80\u4ecb\uff1a{{$.abstract}}{{'\\n'+'\u200b'}}\n\ud83d\udccd {{$.copyright_info##\uff0c.*##\u3002}}\n@js:result.replace(\/.+\uff1a(\u4eba\u5728\u8bfb)?\\s\/g,'')","kind":"{{$.category}}\n{{$.score}}\u5206\n\u8fde\u8f7d{{$.creation_status}}\u5b8c\u7ed3\n{{$.sub_info}}\n@js:result.replace(\/\u8fde\u8f7d0\u5b8c\u7ed3\/g,'\u5b8c\u7ed3').replace(\/\u8fde\u8f7d1\u5b8c\u7ed3\/g,'\u8fde\u8f7d').replace(\/\u8fde\u8f7d4\u5b8c\u7ed3\/g,'\u5df2\u65ad\u66f4').replace(\/\u8fde\u8f7d-1\u5b8c\u7ed3\/g,'\u5b8c\u7ed3')","lastChapter":"{{$.last_chapter_title}} \u2022 {{java.timeFormat(java.getString('last_chapter_update_time')*1000)}}","name":"book_name@put:{book_id:book_id}","tocUrl":"https:\/\/fanqienovel.com\/api\/reader\/directory\/detail?bookId=@get:{book_id}","wordCount":"word_number"},"ruleContent":{"content":"$..content"},"ruleExplore":{"author":"author##<\/?em>","bookList":"<js>\nlet list = [];\nlet resultData = JSON.parse(result);\n\nlet targetData = resultData.data || resultData.list || resultData.book_list || \n                resultData.publication_list || resultData.result || resultData;\n                \nif (targetData != null && targetData.book_shelf_info) {\n    let bookIds = targetData.book_shelf_info.map(item => `{\"book_id\": \"${item.book_id}\"}`).join(',');\n    \n    let booksData = java.ajax(\n`https:\/\/fanqienovel.com\/api\/bookshelf\/multidetail,{\"method\": \"post\",\"body\": {\"books\":[${bookIds}]}}`\n        );\n    \n    let books = JSON.parse(booksData).data.detail_list;\n    for (let i in books) {\n        let d = books[i];\n        list.push({\n            src: d,\n            book_name: d.book_name,\n            author: d.author,\n            category:d.category,\n            tags:d.tags,\n            word_number:d.word_number,\n            lastChapterTitle: d.last_chapter_title,\n            abstract: d.abstract,\n            book_id: d.book_id,\n        });\n    }\n} else {\n    list = targetData.content || targetData;\n}\n\nJSON.stringify({data: list})\n<\/js>\ndata.data||data.list||book_list||data.publication_list||data.result||data","bookUrl":"https:\/\/reading.snssdk.com\/reading\/bookapi\/multi-detail\/v?j=x&book_id={{$.book_id||$.bookId}}&aid=1967&iid=0","coverUrl":"http:\/\/p6-novel.byteimg.com\/large\/{$.thumb_uri}||$.thumb_url||thumbUri","intro":"abstract","kind":"category&&source","lastChapter":"last_chapter_title","name":"book_name||bookName","wordCount":"word_number"},"ruleSearch":{"author":"author##<\/?em>","bookList":"$.data.ret_data.*||$..book_info[*]","bookUrl":"https:\/\/api5-normal-sinfonlineb.fqnovel.com\/reading\/bookapi\/multi-detail\/v\/?aid=1967&iid=1&version_code=999&book_id=@get:{book_id}","checkKeyWord":"\u6211\u768426\u5c81\u5973\u623f\u5ba2","coverUrl":"thumb_url","intro":"abstract","kind":"category&&score","name":"book_name||title@put:{book_id: book_id}##<em>|<\/em>|\u300a|\u300b","wordCount":"\u8fde\u8f7d{{$.creation_status}}\u5b8c\u7ed3##\u8fde\u8f7d0|1\u5b8c\u7ed3"},"ruleToc":{"chapterList":"$.data.chapterListWithVolume[*].*","chapterName":"$.title","chapterUrl":"http:\/\/nove.98tx.cn\/api\/index.php?api=content&item_ids={{$.itemId}}","updateTime":"\u53d1\u5e03\u4e8e {{java.timeFormat(java.getString('$.firstPassTime')*1000)}}"},"searchUrl":"https:\/\/novel.snssdk.com\/api\/novel\/channel\/homepage\/search\/search\/v1\/?device_platform=android&parent_enterfrom=novel_channel_search.tab.&offset={{(page-1)*10}}&aid=1967&q={{key}}","weight":0},{"bookSourceComment":"\u521d\u6b21\u4f7f\u7528\u8bf7\u767b\u5f55\uff0c\u8fd9\u4e2a\u7248\u672c\u5bf9\u63a5\u6b63\u7248uaa\u5b98\u7f51\uff0c\u65b0\u7528\u6237\u53ef\u83b7\u5f97\u4e00\u5929\u4f1a\u5458\u4f53\u9a8c\u673a\u4f1a\uff08\u9aa8\u6298\u4ef7\uff0c\u4f60\u7684\u8d5e\u52a9\u4f1a\u662f\u7a33\u5b9a\u7684\u52a8\u529b\uff09\u3002\u514d\u8d39\u7248\u7684\u8bf7\u79fb\u6b65\u81f3\u6e90\u4ed3\u5e93\u201cr18\uff08\u514d\u68af\u5b50\uff09\u201d\n\u516c\u5171\u804a\u5929\u5ba4\u5165\u53e3\uff1ahttps:\/\/jiek.qiubai.icu\/","bookSourceGroup":"\u79c1\u6709","bookSourceName":"\ud83d\udd1eUAA-\u514d\u68af-\u5df2\u7ed5\u8fc7\u4f1a\u5458","bookSourceType":0,"bookSourceUrl":"https:\/\/api.qiubai.icu","customOrder":0,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"[{\"title\":\"\u9898\u6750\",\"url\":\"\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},{\"title\":\"\u5168\u90e8\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u90fd\u5e02\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&category=\u90fd\u5e02&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u6821\u56ed\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&category=\u6821\u56ed&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u4e71\u4f26\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&category=\u4e71\u4f26&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u7384\u5e7b\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&category=\u7384\u5e7b&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u7cfb\u7edf\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&category=\u7cfb\u7edf&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u7a7f\u8d8a\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&category=\u7a7f\u8d8a&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u6b66\u4fa0\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&category=\u6b66\u4fa0&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u5947\u5e7b\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&category=\u5947\u5e7b&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u4e61\u6751\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&category=\u4e61\u6751&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u5386\u53f2\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&category=\u5386\u53f2&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u660e\u661f\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&category=\u660e\u661f&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u5f02\u80fd\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&category=\u5f02\u80fd&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u79d1\u5e7b\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&category=\u79d1\u5e7b&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u540c\u4eba\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&category=\u540c\u4eba&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u6765\u6e90\",\"url\":\"\",\"style\":{\"layout_flexBasisPercent\":1}},{\"title\":\"\u539f\u521b\u9996\u53d1\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&source=1&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u4f1a\u5458\u4e0a\u4f20\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&source=2&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u5df2\u5b8c\u7ed3\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&finished=1&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u8fde\u8f7d\u4e2d\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&finished=0&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u5b57\u6570\",\"url\":\"\",\"style\":{\"layout_flexBasisPercent\":1}},{\"title\":\"\u77ed\u7bc7\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&space=1&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.3}},{\"title\":\"\u4e2d\u7bc7\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&space=2&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.3}},{\"title\":\"\u957f\u7bc7\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&space=3&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.3}},{\"title\":\"\u6807\u7b7e\",\"url\":\"\",\"style\":{\"layout_flexBasisPercent\":1}},{\"title\":\"SM\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=SM&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"AI\u8f85\u52a9\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=AI\u8f85\u52a9&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"NTR\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=NTR&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u7eff\u6bcd\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u7eff\u6bcd&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u4eba\u59bb\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u4eba\u59bb&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u719f\u5973\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u719f\u5973&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u6bcd\u5b50\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u6bcd\u5b50&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u59d0\u5f1f\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u59d0\u5f1f&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u8c03\u6559\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u8c03\u6559&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u50ac\u7720\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u50ac\u7720&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u9732\u51fa\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u9732\u51fa&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"1v1\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=1v1&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"BE\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=BE&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"HE\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=HE&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"NP\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=NP&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"NTL\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=NTL&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u6697\u9ed1\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u6697\u9ed1&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u767d\u864e\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u767d\u864e&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u767e\u5408\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u767e\u5408&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u66b4\u8650\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u66b4\u8650&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u75c5\u5a07\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u75c5\u5a07&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u4ea7\u5976\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u4ea7\u5976&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u75f4\u5973\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u75f4\u5973&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u51fa\u8f68\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u51fa\u8f68&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u89e6\u624b\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u89e6\u624b&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u7eaf\u7231\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u7eaf\u7231&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u7c97\u53e3\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u7c97\u53e3&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u803d\u7f8e\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u803d\u7f8e&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u9053\u5177\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u9053\u5177&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u53cd\u5dee\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u53cd\u5dee&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u7236\u5973\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u7236\u5973&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u590d\u4ec7\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u590d\u4ec7&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u6539\u9020\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u6539\u9020&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u641e\u7b11\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u641e\u7b11&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u516c\u5ab3\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u516c\u5ab3&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u9aa8\u79d1\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u9aa8\u79d1&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u5b98\u573a\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u5b98\u573a&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u597d\u6587\u7b14\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u597d\u6587\u7b14&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u7ea2\u5e3d\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u7ea2\u5e3d&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u540e\u5bab\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u540e\u5bab&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u76d1\u7981\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u76d1\u7981&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u4ea4\u6362\u4f34\u4fa3\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u4ea4\u6362\u4f34\u4fa3&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u59d0\u59b9\u82b1\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u59d0\u59b9\u82b1&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u7ecf\u5178\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u7ecf\u5178&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u5267\u60c5\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u5267\u60c5&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u5feb\u7a7f\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u5feb\u7a7f&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u6346\u7ed1\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u6346\u7ed1&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u6d6a\u6f2b\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u6d6a\u6f2b&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u604b\u8db3\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u604b\u8db3&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u730e\u8273\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u730e\u8273&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u7075\u5f02\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u7075\u5f02&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u51cc\u8fb1\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u51cc\u8fb1&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u7eff\u5974\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u7eff\u5974&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u841d\u8389\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u841d\u8389&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u5a9a\u9ed1\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u5a9a\u9ed1&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u672b\u4e16\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u672b\u4e16&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u6bcd\u5973\u82b1\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u6bcd\u5973\u82b1&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u76ee\u524d\u72af\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u76ee\u524d\u72af&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u9006NTR\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u9006NTR&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u9006\u63a8\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u9006\u63a8&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u5973\u6027\u89c6\u89d2\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u5973\u6027\u89c6\u89d2&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u8650\u5fc3\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u8650\u5fc3&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u7834\u5904\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u7834\u5904&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u5f3a\u5978\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u5f3a\u5978&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u5168\u5bb6\u6876\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u5168\u5bb6\u6876&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u7fa4\u4ea4\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u7fa4\u4ea4&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u4eba\u517d\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u4eba\u517d&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u4eba\u5996\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u4eba\u5996&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u8089\u4fbf\u5668\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u8089\u4fbf\u5668&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u9002\u5408\u5973\u751f\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u9002\u5408\u5973\u751f&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u624b\u67aa\u6587\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u624b\u67aa\u6587&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u53d7\u5b55\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u53d7\u5b55&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u723d\u6587\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u723d\u6587&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u4e1d\u889c\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u4e1d\u889c&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u751c\u6587\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u751c\u6587&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u5fae\u8089\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u5fae\u8089&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u5fae\u91cd\u53e3\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u5fae\u91cd\u53e3&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u4f2a\u5a18\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u4f2a\u5a18&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u65e0\u7eff\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u65e0\u7eff&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u4e0b\u514b\u4e0a\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u4e0b\u514b\u4e0a&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u5c0f\u9a6c\u62c9\u5927\u8f66\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u5c0f\u9a6c\u62c9\u5927\u8f66&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u6821\u82b1\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u6821\u82b1&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u6027\u5974\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u6027\u5974&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u6027\u8f6c\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u6027\u8f6c&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u836f\u7269\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u836f\u7269&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u5f02\u56fd\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u5f02\u56fd&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u5f02\u4e16\u754c\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u5f02\u4e16\u754c&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u5f02\u79cd\u65cf\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u5f02\u79cd\u65cf&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u6deb\u5815\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u6deb\u5815&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u6deb\u59bb\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u6deb\u59bb&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u9690\u5978\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u9690\u5978&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u6709\u7236\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u6709\u7236&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u69a8\u7cbe\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u69a8\u7cbe&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u5236\u670d\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u5236\u670d&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u79cd\u9a6c\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u79cd\u9a6c&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u91cd\u53e3\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u91cd\u53e3&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}},{\"title\":\"\u8db3\u4ea4\",\"url\":\"\/novel_api.php?action=list&url=\/novel\/list?keyword=&searchType=1&tag=\u8db3\u4ea4&sort=2&page={{page}}\",\"style\":{\"layout_flexBasisPercent\":0.2}}]","header":"{\"User-Agent\": \"Mozilla\/5.0\"}","lastUpdateTime":"1768740606025","loginUrl":"https:\/\/api.qiubai.icu\/user_center.php","respondTime":180000,"ruleBookInfo":{"author":"@json:author","coverUrl":"@json:cover","intro":"@json:intro","kind":"@json:kind","lastChapter":"@json:lastChapter","name":"@json:name","tocUrl":"@json:tocUrl","wordCount":"@json:wordCount"},"ruleContent":{"content":"@json:content"},"ruleExplore":[],"ruleSearch":{"author":"@json:author","bookList":"<js>\nvar list = JSON.parse(result);\nif (list.length > 0) {\n    if (list[0].auth_error) {\n        java.longToast(list[0].msg);\n        [];\n    } \n    else if (list[0].auth_success) {\n        java.toast(list[0].msg);\n        list;\n    } else {\n        list;\n    }\n} else {\n    [];\n}\n<\/js>","bookUrl":"@json:url","checkKeyWord":"\u7384\u5e7b","coverUrl":"@json:cover","intro":"@json:intro","kind":"@json:kind","lastChapter":"@json:lastChapter","name":"@json:name","wordCount":"@json:wordCount"},"ruleToc":{"chapterList":"@json:$","chapterName":"@json:name","chapterUrl":"@json:url"},"searchUrl":"\/novel_api.php?action=search&key={{key}}","weight":0},{"bookSourceComment":"\u6765\u6e90\uff1a\u5173\u8033\n\u53ef\u641c\u4e66\u540d\u548c\u4f5c\u8005\n\u4e0d\u80fd\u7528\u7684\u8bdd\uff0c\u6253\u5f00\u7f51\u5740\u770b\u4e00\u4e0b\u662f\u4e0d\u662f\u6362\u57df\u540d\u4e86\uff0c\u6e90URL\u6362\u6210\u65b0\u57df\u540d\u5373\u53ef\n\u4e3b\u7ad9\uff1ahttps:\/\/www.aiqu999.com\uff08\u4f3c\u4e4e\u662f\u4e00\u4e2a\u4f1a\u81ea\u52a8\u8df3\u8f6c\u53ef\u7528\u94fe\u63a5\u7684\u94fe\u63a5\uff09\n\u5907\u7528\u7f51\u5740\uff1a\n  - www.aiqu654.com\n  - www.aqxsw222.com\n  - www.727txt.com\n  - www.27txt.La\n  - www.527txt.com\n\u7f51\u7ad9\u7ed9\u51fa\u7684\u9632\u8ff7\u8def\u7f51\u5740\uff1awww.272txt.com\n\n2026.01.19\n\u4fee\u590d\u641c\u7d22\u5931\u6548\uff08@\u6b4c\u884c\u706f\uff09","bookSourceGroup":"\ud83d\udce5 \u4e0b\u8f7d","bookSourceName":"\ud83d\udce5 \u7231\u53bb\u5c0f\u8bf4","bookSourceType":3,"bookSourceUrl":"https:\/\/www.aiqu999.com","customButton":false,"customOrder":36,"enabled":true,"enabledCookieJar":true,"enabledExplore":false,"eventListener":false,"lastUpdateTime":"1768761330453","respondTime":180000,"ruleBookInfo":{"author":"##\u4f5c\u8005\uff1a([^<]+)##$1###","downloadUrls":"<js>\nurl = \"http:\/\/www.aiqu127.com\"+java.getString(\"@tag.center.3@a@href\");\njava.log(url)\nhtml = java.ajax(url);\n\njava.getStringList(\"@text.\u4e0b\u8f7d\u5730\u5740@href\",html,true)\n<\/js>","intro":"##\u5c0f\u8bf4\u7b80\u4ecb\uff1a([\\s\\S]+?)<\/div##$1###"},"ruleContent":[],"ruleExplore":[],"ruleSearch":{"author":"a.search-card-author@a@text##\u4f5c\u8005\uff1a","bookList":"#searchmain > .search-card","bookUrl":".search-card-link@a@href","checkKeyWord":"\u7a7f\u8fdb\u8d5b\u535a\u6e38\u620f\u540e\u9006\u88ad\u6210\u795e\nhttps:\/\/www.aqxsw666.com\/txt-xx\/nsxs\/cycs\/txt-240907.htm","intro":".search-card-content@text##.+?\u6587\u6848(.+)##$1###","kind":"{{@@class.search-card-category@tag.a@text}}","lastChapter":".search-card-date@.oldDate@text","name":".search-card-title@a@text##\u300a|\u300b","wordCount":".search-card-content@text##.+?\u3010(.+)\u3011##$1###"},"ruleToc":[],"searchUrl":"\/search.asp?word={{key}},{\"charset\":\"gb2312\"}","weight":0},{"bookSourceComment":"\/\/\u539f\u7ad9\uff1ahttp:\/\/www.qiushu.info","bookSourceGroup":"\ud83c\udf89 \u7cbe\u9009","bookSourceName":"\ud83c\udf89 \u516b\u96f6\u5c0f\u8bf4","bookSourceType":0,"bookSourceUrl":"http:\/\/www.80zw.la","customOrder":10,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"\u6700\u8fd1\u66f4\u65b0::\/top\/lastupdate\/{{page}}.html\n\u6700\u65b0\u5165\u5e93::\/top\/postdate\/{{page}}.html\n\u603b\u6392\u884c\u699c::\/top\/allvisit\/{{page}}.html\n\u6708\u6392\u884c\u699c::\/top\/monthvisit\/{{page}}.html\n\u5468\u6392\u884c\u699c::\/top\/weekvisit\/{{page}}.html\n\u65e5\u6392\u884c\u699c::\/top\/dayvisit\/{{page}}.html\n\u603b\u63a8\u8350\u699c::\/top\/allvote\/{{page}}.html\n\u6708\u63a8\u8350\u699c::\/top\/monthvote\/{{page}}.html\n\u5468\u63a8\u8350\u699c::\/top\/weekvote\/{{page}}.html\n\u65e5\u63a8\u8350\u699c::\/top\/dayvote\/{{page}}.html\n\u603b\u6536\u85cf\u699c::\/top\/goodnum\/{{page}}.html\n\u5b57\u6570\u6392\u884c::\/top\/size\/{{page}}.html\n\u5947\u5e7b\u4fee\u771f::\/sort3\/{{page}}.html\n\u5947\u5e7b\u9b54\u6cd5::\/sort13\/{{page}}.html\n\u5f02\u672f\u8d85\u80fd::\/sort1\/{{page}}.html\n\u4e1c\u65b9\u4f20\u5947::\/sort12\/{{page}}.html\n\u738b\u671d\u4e89\u9738::\/sort14\/{{page}}.html\n\u6c5f\u6e56\u6b66\u4fa0::\/sort15\/{{page}}.html\n\u672a\u6765\u5e7b\u60f3::\/sort9\/{{page}}.html\n\u7075\u5f02\u9b3c\u602a::\/sort10\/{{page}}.html\n\u63a2\u9669\u63ed\u79d8::\/sort22\/{{page}}.html\n\u5386\u53f2\u4f20\u8bb0::\/sort6\/{{page}}.html\n\u7279\u79cd\u519b\u65c5::\/sort7\/{{page}}.html\n\u865a\u62df\u7f51\u6e38::\/sort16\/{{page}}.html\n\u7ade\u6280\u4f53\u80b2::\/sort8\/{{page}}.html\n\u9b54\u5e7b\u5973\u5f3a::\/sort2\/{{page}}.html\n\u90fd\u5e02\u5a5a\u59fb::\/sort4\/{{page}}.html\n\u767e\u5408\u4e4b\u604b::\/sort5\/{{page}}.html\n\u540c\u4eba\u7f8e\u6587::\/sort11\/{{page}}.html\n\u7a7f\u8d8a\u67b6\u7a7a::\/sort17\/{{page}}.html\n\u738b\u5ba4\u8d35\u65cf::\/sort18\/{{page}}.html\n\u9b54\u6cd5\u6821\u56ed::\/sort19\/{{page}}.html\n\u4e61\u571f\u5e03\u8863::\/sort20\/{{page}}.html\n\u5b98\u804c\u5546\u6218::\/sort21\/{{page}}.html\n\u95f4\u8c0d\u6697\u6218::\/sort23\/{{page}}.html\n\u552f\u7f8e\u8a00\u60c5::\/sort24\/{{page}}.html\n\u8bd7\u6b4c\u6587\u96c6::\/sort25\/{{page}}.html","lastUpdateTime":"1768786895424","loginUrl":"","respondTime":10752,"ruleBookInfo":{"author":".soft_info_r@a.0@text","coverUrl":".soft_info_r@img@src","intro":"id.mainSoftIntro@text##(^|[\u3002\uff01\uff1f]+[\u201d\u300d\uff09\u3011]?)##$1<br>@js:result.replace(\/.*\u63a8\u8350\u7ed9\u4f60\u7684\u670b\u53cb\uff01|\u516b\u96f6\u7535\u5b50\u4e66.*|\u3010\u5c55\u5f00\u3011.*|\u66f4\u591a.*TXT.*\/g,\"\")","kind":".soft_info_r@li.6@strong@text&&.soft_info_r@li.7@textNodes##\\s..:.*","lastChapter":".soft_info_r@li.9@textNodes##\u6b63\u6587\u5377.|\u6b63\u6587.|VIP\u5377.|\u9ed8\u8ba4\u5377.|\u5377_|VIP\u7ae0\u8282.|\u514d\u8d39\u7ae0\u8282.|\u7ae0\u8282\u76ee\u5f55.|\u6700\u65b0\u7ae0\u8282.|[\\(\uff08\u3010].*?[\u6c42\u66f4\u7968\u8c22\u4e50\u53d1\u8ba2\u5408\u8865\u52a0\u67b6\u5b57\u4feeKk].*?[\u3011\uff09\\)]","name":"id.soft_info_para@h1@text##TXT.*","tocUrl":".soft_info_r@a.-1@href"},"ruleContent":{"content":"id.nr1@text","imageStyle":"","nextContentUrl":"id.pt_next@href","replaceRegex":"##\u6c42\u4e66\u7f51.*"},"ruleExplore":{"author":"a.1@text","bookList":"id.list_art_2013","bookUrl":"a.0@href","coverUrl":"img@src","intro":".book_jj@text","kind":"span.0@text&&em@text","lastChapter":"b@text##\u6b63\u6587\u5377.|\u6b63\u6587.|VIP\u5377.|\u9ed8\u8ba4\u5377.|\u5377_|VIP\u7ae0\u8282.|\u514d\u8d39\u7ae0\u8282.|\u7ae0\u8282\u76ee\u5f55.|\u6700\u65b0\u7ae0\u8282.|[\\(\uff08\u3010].*?[\u6c42\u66f4\u7968\u8c22\u4e50\u53d1\u8ba2\u5408\u8865\u52a0\u67b6\u5b57\u4feeKk].*?[\u3011\uff09\\)]","name":"a.0@text##TXT.*","wordCount":""},"ruleSearch":{"author":"a.2@text","bookList":".storelistbt5","bookUrl":"a.1@href","checkKeyWord":"","coverUrl":"img@src","intro":"p.1@text","kind":"p.0@textNodes&&span.1@text&&p.2@text##.*\u66f4\u65b0.|\u6700\u65b0.*|.*\uff1a|\\s","lastChapter":"p.2@text##.*\u6700\u65b0\u7ae0\u8282.|\u6b63\u6587\u5377.|\u6b63\u6587.|VIP\u5377.|\u9ed8\u8ba4\u5377.|\u5377_|VIP\u7ae0\u8282.|\u514d\u8d39\u7ae0\u8282.|\u7ae0\u8282\u76ee\u5f55.|\u6700\u65b0\u7ae0\u8282.|[\\(\uff08\u3010].*?[\u6c42\u66f4\u7968\u8c22\u4e50\u53d1\u8ba2\u5408\u8865\u52a0\u67b6\u5b57\u4feeKk].*?[\u3011\uff09\\)]","name":"a.1@text##\\\u300a|\\\u300b.*","wordCount":""},"ruleToc":{"chapterList":"id.yulan@li@a","chapterName":"text##\u6b63\u6587\u5377.|\u6b63\u6587.|VIP\u5377.|\u9ed8\u8ba4\u5377.|\u5377_|VIP\u7ae0\u8282.|\u514d\u8d39\u7ae0\u8282.|\u7ae0\u8282\u76ee\u5f55.|\u6700\u65b0\u7ae0\u8282.|[\\(\uff08\u3010].*?[\u6c42\u66f4\u7968\u8c22\u4e50\u53d1\u8ba2\u5408\u8865\u52a0\u67b6\u5b57\u4feeKk].*?[\u3011\uff09\\)]","chapterUrl":"href##www\\.qiushu\\.info\\\/t##wap\\.80zw\\.la"},"searchUrl":"\/modules\/article\/search.php,{\n  \"method\": \"post\",\n  \"body\": \"searchkey={{key}}&searchtype=articlename\"\n}","weight":0},{"bookSourceGroup":"\u7f51\u7edc\u5c0f\u8bf4","bookSourceName":"\u82e6\u8bfb\u4e66","bookSourceType":0,"bookSourceUrl":"http:\/\/www.kudushu.org","concurrentRate":"","customOrder":0,"enabled":true,"enabledCookieJar":true,"enabledExplore":false,"exploreUrl":"","header":"{\"User-Agent\": \"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/129.0.0.0 Safari\/537.36\"}","lastUpdateTime":"1768907516232","respondTime":180000,"ruleBookInfo":{"author":"","coverUrl":"div.divbox > div:first-child > a > img@src","intro":"div.tabcontent > div.tabvalue:first-child > div@text","lastChapter":"","name":"","tocUrl":"a.btnlink.b_hot@href"},"ruleContent":{"content":"#clickeye_content@textNodes##\\(\u82e6\u8bfb\u4e66 www\\.kudushu\\.org\\)|\u82e6\u8bfb\u4e66 www\\.kudushu\\.org","replaceRegex":"","sourceRegex":""},"ruleExplore":[],"ruleSearch":{"author":"span.c_label:contains(\u4f5c\u8005\uff1a)+span.c_value@text","bookList":"class.c_row","bookUrl":"span.c_subject > a@href","coverUrl":"img@src","kind":"span.c_label:contains(\u7c7b\u522b\uff1a)+span.c_value@text","lastChapter":"span.c_label:contains(\u6700\u65b0\u7ae0\u8282\uff1a)+span.c_value a@text","name":"span.c_subject > a@text","wordCount":"span.c_label:contains(\u5b57\u6570\uff1a)+span.c_value@text"},"ruleToc":{"chapterList":"li.chapter","chapterName":"a@text","chapterUrl":"a@href"},"searchUrl":"modules\/article\/search.php?q={{key}}","weight":0},{"bookSourceComment":"3qishu.com\uff0cqishu99.com\uff0c\u540c\u4e00\u4e2a\u7ad9\n\u539f\u672c\u7684\u624b\u673a\u7248\u6709\u4fe1\u606f\u9519\u8bef\u5e76\u4e14\u5b9e\u9645\u4e0a\u4e0d\u80fd\u4e0b\u8f7d\uff0c\u6211\u6362\u6210\u4e86\u7535\u8111\u7248\uff0c\u91cd\u5199\u4e86\u9664\u641c\u7d22\u5730\u5740\u5916\u7684\u5168\u90e8\u4ee3\u7801\uff0c\u73b0\u5728\u53ef\u4ee5\u6b63\u5e38\u7528\u4e86\u3002\n\uff08\u4f46\u662f\u8fd9\u6837\u4e00\u6765\u539f\u6765\u7684\u53d1\u73b0\u9875\u5c31\u4e0d\u80fd\u7528\u4e86\uff0c\u61d2\u5f97\u518d\u5199\u4e8e\u662f\u628a\u53d1\u73b0\u9875\u5220\u4e86\uff09\n2026.1.20 @\u6b4c\u884c\u706f","bookSourceGroup":"\ud83d\udce5 \u4e0b\u8f7d","bookSourceName":"\ud83d\udce5 \u5947\u4e66\u7f51","bookSourceType":3,"bookSourceUrl":"https:\/\/www.qishu99.cc","customButton":false,"customOrder":32,"enabled":true,"enabledCookieJar":false,"enabledExplore":true,"eventListener":false,"lastUpdateTime":"1768912368633","respondTime":180000,"ruleBookInfo":{"coverUrl":".nrlist > dl > .pic > .pics3@src","downloadUrls":"https:\/\/www.qishu99.cc{{@@text.\u8fdb\u5165\u5c0f\u8bf4\u4e0b\u8f7d\u5730\u5740@href}}\n<js>java.ajax(result)<\/js>\n.downlist[0,1]@li@strong@a@href","intro":".softsay_title > .softsayxq > .cont@text##\u58f0\u660e\uff1a.*"},"ruleContent":[],"ruleExplore":[],"ruleSearch":{"author":".info@.xm@b@a.1@text","bookList":".slist","bookUrl":".info > h4 > a@href","checkKeyWord":"\u91cd\u751f\u7a7a\u95f4","coverUrl":".pic > a > img@src","intro":".info@p.1@text##\u5c0f\u8bf4\u7b80\u4ecb\uff1a|\\[.+TXT\u4e0b\u8f7d\\]","kind":".info@.xm@b@a.0@text&&.info@.l@text##\u53d1\u5e03\u65f6\u95f4\uff1a\\d{4}-\\d{2}-\\d{2} \\| \u5c0f\u8bf4\u72b6\u6001\uff1a(.+) \\| \u5c0f\u8bf4\u683c\u5f0f\uff1a.+ \\| \u5c0f\u8bf4\u5927\u5c0f\uff1a(.+)##$1,$2","lastChapter":".info@.l@font@text","name":".info > h4 > a@text##\u300a(.+)\u300b\u5168\u672cTXT\u7535\u5b50\u4e66\u4e0b\u8f7d##$1###"},"ruleToc":[],"searchUrl":"\/e\/search\/index.php,{\n\t\"method\":\"post\",\n\t\"body\":\"show=title,softsay,softwriter&keyboard={{key}}&tbname=download&tempid=1&Submit22=\u641c\u7d22\"\n\t}","weight":0},{"bookSourceComment":"\u5982\u4e0d\u80fd\u52a0\u8f7d\u8bf7\u5c1d\u8bd5\u5220\u9664\u4e66\u7c4d\uff0c\u91cd\u65b0\u641c\u7d22\u6dfb\u52a0","bookSourceGroup":"\u2466\ud83d\udcda  \u51fa\u7248","bookSourceName":"\ud83d\udcda\u8c46\u74e3\u9605\u8bfb","bookSourceType":0,"bookSourceUrl":"https:\/\/read.douban.com","bookUrlPattern":"https:\/\/read.douban.com\/(ebook|read|column).*","customButton":false,"customOrder":107,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"eventListener":false,"exploreUrl":"[{'title':'\u4eca\u65e5\u9650\u514d','url':'https:\/\/read.douban.com\/j\/index\/featured\/?start=6'},{'title':'\u8a00\u60c5\u5c0f\u8bf4','url':'https:\/\/read.douban.com\/kind\/501?start={{(page-1)*20}}&sort=hot&promotion_only=False&min_price=None&max_price=None&works_type=1,{\\'headers\\':\\'{\"User-Agent\": \"Mozilla\/5.0 (Linux; Android 8.1.0; JKM-AL00b Build\/HUAWEIJKM-AL00b; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/66.0.3359.126 MQQBrowser\/6.2 TBS\/044807 Mobile Safari\/537.36\"}\\'}','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'\u5973\u6027\u5c0f\u8bf4','url':'https:\/\/read.douban.com\/kind\/532?start={{(page-1)*20}}&sort=hot&promotion_only=False&min_price=None&max_price=None&works_type=1,{\\'headers\\':\\'{\"User-Agent\":\"Mozilla\/5.0 (Linux; Android 8.1.0; JKM-AL00b Build\/HUAWEIJKM-AL00b; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/66.0.3359.126 MQQBrowser\/6.2 TBS\/044807 Mobile Safari\/537.36\"}\\'}','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'\u60ac\u7591\u5c0f\u8bf4','url':'https:\/\/read.douban.com\/kind\/508?start={{(page-1)*20}}&sort=hot&promotion_only=False&min_price=None&max_price=None&works_type=1,{\\'headers\\':\\'{\"User-Agent\":\"Mozilla\/5.0 (Linux; Android 8.1.0; JKM-AL00b Build\/HUAWEIJKM-AL00b; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/66.0.3359.126 MQQBrowser\/6.2 TBS\/044807 Mobile Safari\/537.36\"}\\'}','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'\u79d1\u5e7b\u5c0f\u8bf4','url':'https:\/\/read.douban.com\/kind\/505?start={{(page-1)*20}}&sort=hot&promotion_only=False&min_price=None&max_price=None&works_type=1,{\\'headers\\':\\'{\"User-Agent\":\"Mozilla\/5.0 (Linux; Android 8.1.0; JKM-AL00b Build\/HUAWEIJKM-AL00b; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/66.0.3359.126 MQQBrowser\/6.2 TBS\/044807 Mobile Safari\/537.36\"}\\'}','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'\u5e7b\u60f3\u5c0f\u8bf4','url':'https:\/\/read.douban.com\/kind\/506?start={{(page-1)*20}}&sort=hot&promotion_only=False&min_price=None&max_price=None&works_type=1,{\\'headers\\':\\'{\"User-Agent\":\"Mozilla\/5.0 (Linux; Android 8.1.0; JKM-AL00b Build\/HUAWEIJKM-AL00b; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/66.0.3359.126 MQQBrowser\/6.2 TBS\/044807 Mobile Safari\/537.36\"}\\'}','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'\u6587\u827a\u5c0f\u8bf4','url':'https:\/\/read.douban.com\/kind\/503?start={{(page-1)*20}}&sort=hot&promotion_only=False&min_price=None&max_price=None&works_type=1,{\\'headers\\':\\'{\"User-Agent\":\"Mozilla\/5.0 (Linux; Android 8.1.0; JKM-AL00b Build\/HUAWEIJKM-AL00b; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/66.0.3359.126 MQQBrowser\/6.2 TBS\/044807 Mobile Safari\/537.36\"}\\'}','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'\u5386\u53f2\u5c0f\u8bf4','url':'https:\/\/read.douban.com\/kind\/510?start={{(page-1)*20}}&sort=hot&promotion_only=False&min_price=None&max_price=None&works_type=1,{\\'headers\\':\\'{\"User-Agent\":\"Mozilla\/5.0 (Linux; Android 8.1.0; JKM-AL00b Build\/HUAWEIJKM-AL00b; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/66.0.3359.126 MQQBrowser\/6.2 TBS\/044807 Mobile Safari\/537.36\"}\\'}','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'\u975e\u5c0f\u8bf4','url':'https:\/\/read.douban.com\/kind\/516?start={{(page-1)*20}}&sort=hot&promotion_only=False&min_price=None&max_price=None&works_type=1,{\\'headers\\':\\'{\"User-Agent\":\"Mozilla\/5.0 (Linux; Android 8.1.0; JKM-AL00b Build\/HUAWEIJKM-AL00b; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/66.0.3359.126 MQQBrowser\/6.2 TBS\/044807 Mobile Safari\/537.36\"}\\'}','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'\u751f\u6d3b\u60ac\u7591','url':'https:\/\/read.douban.com\/j\/tag\/\u751f\u6d3b\u60ac\u7591?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'\u90fd\u5e02\u72af\u7f6a','url':'https:\/\/read.douban.com\/j\/tag\/\u90fd\u5e02\u72af\u7f6a?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'\u793e\u4f1a\u4e8b\u4ef6','url':'https:\/\/read.douban.com\/j\/tag\/\u793e\u4f1a\u4e8b\u4ef6?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'\u79c1\u5bb6\u4fa6\u63a2','url':'https:\/\/read.douban.com\/j\/tag\/\u79c1\u5bb6\u4fa6\u63a2?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'\u804c\u4e1a\u5973\u6027','url':'https:\/\/read.douban.com\/j\/tag\/\u804c\u4e1a\u5973\u6027?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'\u5355\u8eab\u5973\u6027','url':'https:\/\/read.douban.com\/j\/tag\/\u5355\u8eab\u5973\u6027?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'\u5973\u6027\u6210\u957f','url':'https:\/\/read.douban.com\/j\/tag\/\u5973\u6027\u6210\u957f?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'\u5bb6\u5ead\u6545\u4e8b','url':'https:\/\/read.douban.com\/j\/tag\/\u5bb6\u5ead\u6545\u4e8b?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'\u65f6\u7a7a\u7a7f\u8d8a','url':'https:\/\/read.douban.com\/j\/tag\/\u65f6\u7a7a\u7a7f\u8d8a?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'\u90fd\u5e02\u5947\u5e7b','url':'https:\/\/read.douban.com\/j\/tag\/\u90fd\u5e02\u5947\u5e7b?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'\u8111\u6d1e\u6545\u4e8b','url':'https:\/\/read.douban.com\/j\/tag\/\u8111\u6d1e\u6545\u4e8b?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'\u8fd1\u672a\u6765','url':'https:\/\/read.douban.com\/j\/tag\/\u8fd1\u672a\u6765?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'\u9752\u6625\u6210\u957f','url':'https:\/\/read.douban.com\/j\/tag\/\u9752\u6625\u6210\u957f?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'\u90fd\u5e02\u51b7\u6696','url':'https:\/\/read.douban.com\/j\/tag\/\u90fd\u5e02\u51b7\u6696?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'\u6f02\u6cca\u6545\u4e8b','url':'https:\/\/read.douban.com\/j\/tag\/\u6f02\u6cca\u6545\u4e8b?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'\u65f6\u4ee3\u8bb0\u5fc6','url':'https:\/\/read.douban.com\/j\/tag\/\u65f6\u4ee3\u8bb0\u5fc6?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'\u6b66\u4fa0\u5c0f\u8bf4','url':'https:\/\/read.douban.com\/j\/tag\/\u6b66\u4fa0\u5c0f\u8bf4?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'\u5386\u53f2\u7eaa\u5b9e','url':'https:\/\/read.douban.com\/j\/tag\/\u5386\u53f2\u7eaa\u5b9e?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'\u5386\u53f2\u8a00\u60c5','url':'https:\/\/read.douban.com\/j\/tag\/\u5386\u53f2\u8a00\u60c5?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'\u5386\u53f2\u4f20\u5947','url':'https:\/\/read.douban.com\/j\/tag\/\u5386\u53f2\u4f20\u5947?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}}]","jsLib":"function getImage(text){\n  return `<img src=\"data:image\/svg+xml;base64,,{\"type\":\"zs\",\"style\":\"text\",\"js\":\"book?getSvg(\\`${text}\\`,1):getSvg(\\`${text}\\`,0)\"}\">`;\n}\n\n\nfunction getSvg(text,f){\n    const {java} = this;\n    let color = [\"#B2B2B2\",\"#707070\"];\n\tlet svg = `\n  <svg width=\"1000\" height=\"800\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n    <path d=\"M865 100 h-600c-60 0-110 50-110 110v150l-120 80 120 80v150c0 60 50 110 110 110h600c60 0 110-50 110-110V210c0-60-50-110-110-110z  \" fill=\"none\" stroke=\"${color[0]}\" stroke-width=\"55\"\/>\n    <text x=\"570\" y=\"565\" font-family=\"Roboto Condensed\" text-anchor=\"middle\" dominant-baseline=\"middle\" font-size=\"420\" font-weight=\"bold\" fill=\"${color[1]}\">\n      \u6ce8\n    <\/text>\n  <\/svg>\n`;\nif(f){\n\tjava.longToast(\"\\n\\n\"+text)\n\t}\n    return \"data:image\/svg+xml;base64,\" + java.base64Encode(svg);\n}","lastUpdateTime":"1768918267737","loginUrl":"https:\/\/read.douban.com\/app","respondTime":203289,"ruleBookInfo":{"author":"class.author.0@class.author-item@text","coverUrl":"class.cover shadow-cover@img@src","intro":"{{@class.section-abstract@html||class.abstract-full@html||class.intro@html}}<br>{{@class.rally-waiting-tip@html}}","kind":"@js:\nis_bundle = \/bundle\/.test(\"{{\/\/link[@rel=\"alternate\"]\/@href}}\");\nis_bundle?java.put(\"is_bundle\",is_bundle):java.put(\"is_bundle\",\"false\");\"\"","lastChapter":"class.current-price-count@text##^##\u5168\u672c\u5b9a\u4ef7:","name":"<js>\nr = result.match(\/Ark.CSRF_TOKEN = '([^']+)'\/)[1];\njava.put(\"X-CSRF-TOKEN\",r);\njava.getString(\"@class.article-title@text\")\n<\/js>","tocUrl":"@js:\n\nif(java.get(\"is_bundle\")==\"false\"){\n\t\nid=baseUrl.match(\/(\\d+)\/)[1];\nif(baseUrl.match(\/ebook\/)){result=baseUrl}else{\nresult=\"https:\/\/read.douban.com\/j\/column_v2\/\"+id+\"\/chapters?start=0&limit=10000&latestFirst=0\";}\n}else{\n\tresult = baseUrl\n\t}"},"ruleContent":{"content":"<js>\nif(java.get(\"is_bundle\")==\"false\"){\nhtml = java.ajax(\"https:\/\/read.douban.com\");\neval(html.match(\/Ark\\.(user = \\{[\\s\\S]+?\\})\/)[1]);\ncok = user.id??\"anonymous\";\nt = String(java.getString(\"$.data\"));\nfunction name(){\n  try {\n    const decodedBytes = java.base64DecodeToByteArray(t);\n    const totalLen = decodedBytes.length;\n    const ivStart = totalLen - 16 - 13;\n    const ivBytes = decodedBytes.slice(ivStart, ivStart + 16);\n    const encryptedBytes = decodedBytes.slice(0, ivStart);    \n    const hashedKey = java.digestHex(cok, \"SHA-256\");   \n    const cipher = java.createSymmetricCrypto(\"AES\/CBC\/PKCS5Padding\", \n        java.hexDecodeToByteArray(hashedKey), \n        ivBytes\n    );\n    \n    const decryptedStr = cipher.decryptStr(encryptedBytes);\n    const jsonObj = JSON.parse(decryptedStr);\n    result = JSON.stringify(jsonObj.posts[0].contents);\n    \n} catch (e) {\n    java.log(\"\u89e3\u5bc6\u9519\u8bef: \" + e);\n    result = null;\n}\nreturn result\n}\nddd = name();\nconst bbb = book.getVariable(\"custom\");\nconst sss = source.getVariable();\n\n\n\/*\n\u89c4\u8303Json\u6570\u636e\nconst pattern = \/:\"([\\s\\S]+?)\"(,\"|\\}|\\])\/g;\nddd = String(ddd).replace(pattern, (match, content,suffix) => {\n  let replacedContent = content.replace(\/\"\/g, '\\\\\"');\n  return `:\"${replacedContent}\"${suffix}`;\n}).replace(\/\\n+\/g,'\\\\n').replace(\/[\\x00-\\x1F\\x7F]\/g,'');\n*\/\n\t\nvar data = JSON.parse(String(ddd));\nfunction extractContent(item) {\n    const textList = item.data?.text;  \n    const process = (content) => {\n        if (typeof content === 'string') {    \t\n        \t    if(content==\"\"){   \t    \t\n        \t    \tcontent =\"\\n&lrm;\\n\"   \t    \t\n        \t    \t}\n            return content;\n        }\n        if (Array.isArray(content)) {\n            return content.map(process).join('');\n        }\n        if (content && (content.content || content.content===\"\")) {\n          \t let c;   \t  \n        \t  if(content.kind == \"footnote\"){\n        \t  \t try{\n        \t  \t \t    book.getVariable();\n        \t  \t \t    c = getImage(content.content)\n        \t  \t \t}catch(e){}\n         \t  \t\n        \t  \t if(\/1\/.test(sss)||\/1\/.test(bbb))c = \"\u3010*\"+content.content+\"\u3011\"\n        \t  \t}else{\n        \t  \t\tc = content.content\n        \t  \t\t}\n            return process(c);\n        }\n        return '';\n    };\n    return  process(textList);\n}\n\n\nfunction getChapterContent(chapterNumber) {\n    let chapterContent = [];\n    let currentChapter = -1;\n    let isFirstHeadlineFound = false;\n\n    for (let i = 0; i < data.length; i++) {\n        let item = data[i];\n        \n        if (item.type === 'headline') {\n            currentChapter++;\n            if (!isFirstHeadlineFound) {\n                isFirstHeadlineFound = true;\n            }\n            if (currentChapter > chapterNumber) {\n                break;\n            }\n        }\n        if ((currentChapter === chapterNumber) || (chapterNumber === 0 && !isFirstHeadlineFound && item.type !== 'headline')) {\n                if(item.type === \"illus\")chapterContent.push(`<img src=\"${item.data?.size.orig.src}\">\\n`);\n                if(item.type !== 'headline')chapterContent.push(extractContent(item));\n            \n        }\n    }\n    return chapterContent.length > 0 ? chapterContent.join('\\n') : null;\n}\n\nresult = \"\";\n\/\/ \u68c0\u67e5\u662f\u5426\u9700\u8981\u4f7f\u7528\u7ae0\u8282\u903b\u8f91\nif (book.bookUrl.includes(\"ebook\")) {    \n    let index = chapter.index;\n    result = getChapterContent(index);\n} else {\n    \/\/ \u904d\u5386\u6570\u636e\uff0c\u63d0\u53d6\u5e76\u62fc\u63a5 content\n    data.forEach(item => {\n            if(item.type === \"illus\")result += `<img src=\"${item.data?.size.orig.src}\">\\n`\n            result += extractContent(item) + \"\\n\"; \/\/ \u6bcf\u4e2a\u6bb5\u843d\u6362\u884c\n        \n    });\n}\n\n}else{\n\tbookName = java.getString(\"@class.article-title@text\");\n\tbookAuthor = java.getString(\"@class.author-item@text\");\n\timgSrc = java.getString(\"@class.cover shadow-cover@img@src\");\n\tinfo = java.getString(\"@class.info@p@text\");\n\tresult = `\u2757\ufe0f\u5237\u65b0\u672c\u7ae0\u8df3\u8f6c\u52a0\u5165\u4e66\u67b6\u754c\u9762\u2757\ufe0f\\n\u4e66\u540d\uff1a${bookName}\\n\u4f5c\u8005\uff1a${bookAuthor}\\n<img src=\"${imgSrc}\">\\n\u7b80\u4ecb\uff1a\\n${info}`\n\t\tif(book.durChapterIndex === chapter.index){\n\t\turl = \"legado:\/\/import\/addToBookshelf?src=\"+baseUrl;\n\t\tscript = `data:text\/html;charset=utf-8,\n\t\t<html>\n\t\t<title>\u300a${bookName}\u300b\u52a0\u5165\u4e66\u67b6<\/title>\t\t\n\t\t<img src=\"${imgSrc}\" style=\"max-width: 300px; max-height: 400px\">\n\t\t<p style=\"text-align: center;\"><a href=\"${url}\" style=\"font-size:50px;\">\u8df3\u8f6c\u52a0\u5165\u4e66\u67b6<\/a><\/p>\n\t\t<p style=\"font-size:60px\">\u7b80\u4ecb\uff1a${info}\n\t\t<\/p>\t\t\t\t\n\t\t<\/html>\n\t\t<script>\n        window.onload = function () {\n            window.location.href = '${url}';\n        };\n    <\/script>`;    \n\t\tjava.startBrowser(script,\"\u300a\"+bookName+\"\u300b\")\t\t\n\t\t}\t\t\n\t}\nresult\n\n<\/js>","imageStyle":"FULL"},"ruleExplore":{"author":"class.author@text||$.author[0].name||$.author","bookList":"<js>\nif(\/featured\/.test(baseUrl)){\n\tworkid = String(java.getString(\"$..todayWorksIds[*]\")).split(\"\\n\");\n\t\n\tbody = {\n  \"variables\": {\n    \"worksIds\": workid\n  },\n  \"query\": \"\\n          query getWorksList($worksIds: [ID!]) {\\n            worksList(worksIds: $worksIds) {\\n              \\n                  id\\n                  \\n    id\\n    isOrigin\\n    isEssay\\n    \\n    title\\n    cover(useSmall: false)\\n    url\\n    isBundle\\n    coverLabel(preferVip: false)\\n  \\n    \\n  url\\n  title\\n\\n    \\n  author {\\n    name\\n    url\\n  }\\n  origAuthor {\\n    name\\n    url\\n  }\\n  translator {\\n    name\\n    url\\n  }\\n\\n    \\n  abstract\\n  authorHighlight\\n  editorHighlight\\n\\n    \\n    isOrigin\\n    kinds {\\n      \\n    name @skip(if: true)\\n    shortName @include(if: true)\\n    id\\n  \\n    }\\n    ... on WorksBase @include(if: true) {\\n      wordCount\\n      wordCountUnit\\n    }\\n    ... on WorksBase @include(if: false) {\\n      inLibraryCount\\n    }\\n    ... on WorksBase @include(if: true) {\\n      \\n    isEssay\\n    \\n    ... on EssayWorks {\\n      favorCount\\n    }\\n  \\n    \\n    \\n    averageRating\\n    ratingCount\\n    url\\n    isColumn\\n    isFinished\\n  \\n  \\n  \\n    }\\n    ... on EbookWorks @include(if: false) {\\n      \\n    ... on EbookWorks {\\n      book {\\n        url\\n        averageRating\\n        ratingCount\\n      }\\n    }\\n  \\n    }\\n    ... on WorksBase @include(if: false) {\\n      isColumn\\n      isEssay\\n      onSaleTime\\n      ... on ColumnWorks {\\n        updateTime\\n      }\\n    }\\n    ... on WorksBase @include(if: true) {\\n      isColumn\\n      ... on ColumnWorks {\\n        isFinished\\n      }\\n    }\\n    ... on EssayWorks {\\n      essayActivityData {\\n        \\n    title\\n    uri\\n    tag {\\n      name\\n      color\\n      background\\n      icon2x\\n      icon3x\\n      iconSize {\\n        height\\n      }\\n      iconPosition {\\n        x y\\n      }\\n    }\\n  \\n      }\\n    }\\n    highlightTags {\\n      name\\n    }\\n    ... on WorksBase @include(if: false) {\\n      fanfiction {\\n        tags {\\n          id\\n          name\\n          url\\n        }\\n      }\\n    }\\n  \\n    \\n  ... on WorksBase {\\n    copyrightInfo {\\n      newlyAdapted\\n      newlyPublished\\n      adaptedName\\n      publishedName\\n    }\\n  }\\n\\n    \\n    ... on WorksBase @include(if: false) {\\n      \\n    fixedPrice\\n    salesPrice\\n    isRebate\\n    realPrice {\\n      price\\n      priceType\\n    }\\n  \\n    }\\n    ... on EbookWorks {\\n      \\n    fixedPrice\\n    salesPrice\\n    isRebate\\n    realPrice {\\n      price\\n      priceType\\n    }\\n  \\n    }\\n    ... on WorksBase @include(if: false) {\\n      ... on EbookWorks {\\n        id\\n        isPurchased\\n        isInWishlist\\n      }\\n    }\\n    ... on WorksBase @include(if: false) {\\n      fanfiction {\\n        fandoms {\\n          title\\n          url\\n        }\\n      }\\n    }\\n    ... on WorksBase @include(if: false) {\\n      fanfiction {\\n        kudoCount\\n      }\\n    }\\n  \\n                \\n            }\\n          }\\n        \",\n  \"operationName\": \"getWorksList\"\n}\nheaders={}\n\nfunction getFree(headers){\n\turl = \"https:\/\/read.douban.com\/j\/graphql\",\n\toption = {\n\t\t\"method\":\"POST\",\n\t\t\"body\":body\n\t\t}\n\t\tif(headers)option[\"headers\"]=headers;\n\t\turl = url+\",\"+JSON.stringify(option)\n   return\tjava.ajax(url);\n}\nresult = getFree(headers);\nif(\/\u767b\u5f55\u72b6\u6001\u5f02\u5e38\/.test(result)){\n\tx = result.match(\/Ark.CSRF_TOKEN = '([^']+)'\/)[1];\n\theaders[\"x-csrf-token\"] = x;\n\tresult = getFree(headers);\n\t}\n\t}\n\tresult\n<\/js>\nclass.item||$.data.worksList[*]||$.[?(@.alias_id)]","bookUrl":"@js:\nresult = java.getString(\"@href||$.url\");\n\nif(!String(result)){\n\tresult = \"https:\/\/read.douban.com\/column\/{{$.alias_id||$.id}}\/\"\n\t}\njava.put('is_bundle',\/bundle\/.test(result));\nresult","coverUrl":"img@src||$.cover","intro":"class.intro@text||$.abstract","kind":"{{@@class.tag@text}},{{@@class.score@text}},{{@@class.amount}},{{@@class.price@text}},{{$.kind&&$.category&&$.tags[*].tag&&$.kinds[*].shortName&&$.highlightTags[*].name}}##(\\d+\\.\\d{2})##$1\u5143\ud83d\udcb0","name":"class.title@html||$.title##<span class=\"tag\">.*?<\/span>|<.*?>"},"ruleSearch":{"author":"$.author","bookList":"$.[*]","bookUrl":"https:\/\/read.douban.com\/{{$.type}}\/{{$.id}}\/","checkKeyWord":"\u7ea2\u697c\u68a6","coverUrl":"$.cover","intro":"$.abstract","kind":"{{String(java.getString(\"$.fixed_price\"))===\"false\"?\"\u514d\u8d39\":\"\u539f\u4ef7:\"+(Number(java.getString(\"$.fixed_price\"))\/100)+\"\u5143\"+\"\ud83d\udca1\u7279\u4ef7:\"+(Number(java.getString(\"$.price\"))\/100)+\"\u5143\"}},{{$.tags[*].tag&&$.kind&&$.category}}","lastChapter":"@js:\nString(java.getString(\"$.fixed_price\"))===\"false\"?\"\u514d\u8d39\":\"\u539f\u4ef7:\"+(Number(java.getString(\"$.fixed_price\"))\/100)+\"\u5143\"+\"\ud83d\udca1\u7279\u4ef7:\"+(Number(java.getString(\"$.price\"))\/100)+\"\u5143\"","name":"$.title","wordCount":"@js:\n\"{{$..is_bundle}}\"!=\"\"?java.put(\"is_bundle\",\"{{$..is_bundle}}\"):java.put(\"is_bundle\",\"false\");\"\""},"ruleToc":{"chapterList":"<js>\nresult = java.getElements(\"@class.story-item@a||class.ebook-list@li\");\nif(!result.length){\n\t\tresult = java.getElements(\"$.list[*]\")\n\t\t}\n\t\t\nif(result.length===0){\n  java.setContent('<a href=\"ebook\/0\/toc\/0\">\u6682\u65e0\u76ee\u5f55<\/a>');\n\tresult = java.getElements(\"@@tag.a\")\n\t}\nresult;\n<\/js>","chapterName":"img@alt||text||title","chapterUrl":"<js>\nif(java.get(\"is_bundle\")==\"false\"){\naid = \"{{$.id}}\"==\"\"?\"{{@@href}}\".match(\/ebook\\\/(\\d+)\/)[1]:\"{{$.id}}\";\n\nid=\"{{$.id}}\"==\"\"?\"{{@@href}}\".match(\/ebook\\\/\\d+\\\/toc\\\/(\\d+)\/)[1]:\"\";\nurl = \"https:\/\/read.douban.com\/j\/article_v2\/get_reader_data\";\nbody = \"aid=\"+aid;\nresult = url +\",\"+ JSON.stringify({\n\t\"method\":\"POST\",\n\t\"body\":String(body),\n\t\"headers\":{\n\t\t\"referer\":\"https:\/\/read.douban.com\/reader\/column\/{{baseUrl.match(\/\\\/(\\d+)\\\/\/)[1]}}\/chapter\/\"+(id!=\"\"?id:aid)+\"\/\",\n\t\t\"X-CSRF-TOKEN\":java.get(\"X-CSRF-TOKEN\")\n\t\t}\n\t});\n\t}else{\n\t\tresult = java.getString(\"@tag.a.0@href\")\n\t\t}\n<\/js>","isVip":"$.price"},"searchUrl":"https:\/\/read.douban.com\/j\/search?start={{(page-1)*10}}&limit=10&query={{key}}","variableComment":"1\u3001\u8bbe\u7f6e\u4e66\u7c4d\u53d8\u91cf\u3010\u5f53\u524d\u4e66\u3011\n2\u3001\u8bbe\u7f6e\u6e90\u53d8\u91cf\u3010\u6240\u6709\u4e66\u3011\n\n\u2757\ufe0f\u586b\u5199 1 \u5f00\u542f\u5168\u6587\u663e\u793a\u6ce8\u91ca\n\u2757\ufe0f\u586b\u5199\u540e\u7f13\u5b58\u8fc7\u7684\u6b63\u6587\u8981\u5237\u65b0\u624d\u80fd\u663e\u793a","weight":0},{"bookSourceComment":"\u66f4\u65b0\u65e5\u5fd7\u8bf7\u70b9\u51fb\u767b\u5f55\uff0c\u66f4\u65b0\u4e66\u6e90\u4e2d\u67e5\u770b\n\n\u517c\u5bb9\u6b63\u5f0f\u7248\u9605\u8bfbapp","bookSourceGroup":"\ud83c\udf45\ud83c\udf45\ud83c\udf45","bookSourceName":"\ud83c\udf45\u756a\u8304\u4e13\u4e1a\u6237","bookSourceType":0,"bookSourceUrl":"\u756a\u8304\u548c\u7cbe\u54c1","bookUrlPattern":"https?:\\\/\\\/(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z0-9-]+(?::\\d+)?\\\/detail.*","customButton":false,"customOrder":1,"enabled":true,"enabledCookieJar":false,"enabledExplore":true,"eventListener":false,"exploreUrl":"<js>\nfunction setArgument(key, value) {\n    var open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '') || {};\n    open_argument[key] = value;\n    var result = JSON.stringify(open_argument);\n    source.setVariable(result);\n    return result;\n}\n\nvar open_argument = source.getVariable();\nvar base_url = getArguments(open_argument, 'server') || '';\nvar ms = getArguments(open_argument, 'tone_id') || '';\nvar source_type = getArguments(open_argument, 'source_type') || '\u7537\u9891';\nvar tab = getArguments(open_argument, 'media') || '\u5c0f\u8bf4';\nvar sources = getArguments(open_argument, 'source') || '\u756a\u8304';\n\n\nvar sdtoken;\ntry {\n    var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n    sdtoken = String(loginInfoMap['\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)'] || '');\n} catch (e) {\n    sdtoken = '';\n}\n\nvar rawCookie = getFanqieCookie() || sdtoken;\nvar match = rawCookie.match(\/sessionid=[^;]+\/);\nvar fqcookie = match ? match[0] : '';\nvar fqssionid = '';\nif (!fqcookie) {\n    java.toast('\u60a8\u8fd8\u672a\u767b\u9646\u756a\u8304\u8d26\u53f7\uff0c\u65e0\u6cd5\u540c\u6b65\u6570\u636e\u54e6\uff01');\n} else {\n    fqssionid = getSessionId(fqcookie)\n}\nvar fqsjurl = base_url + \"\/bookshelf?page={{page}}&ssionid=\" + fqssionid;\nvar fqtjurl = base_url + \"\/fqrecommend?page={{page}}&ssionid=\" + fqssionid;\nvar fqlsurl = base_url + \"\/fqhistory?page={{page}}&ssionid=\" + fqssionid;\n\nvar groupDatas = [];\nvar infoData = [];\n\nfunction deviceType() {\n    try {\n        return !!java.androidId();\n    } catch (e) {\n        return false;\n    }\n}\n\nvar hasValidCookie = fqcookie.length > 0;\n\nif (hasValidCookie) {\n    function groupQuery() {\n        try {\n            var url = base_url + \"\/group_name?ssionid=\" + fqssionid;\n            var res = java.ajax(url);\n            var response = JSON.parse(res);\n\n            if (!(response && response.data)) {}\n\n            response.data.forEach(function(group) {\n                var keys = Object.keys(group);\n                if (keys.length > 0) {\n                    var key = keys[0];\n                    var value = group[key];\n                    if (value && value.length) {\n                        var option = {\n                            \"method\": \"POST\",\n                            \"body\": {\n                                \"book_ids\": value,\n                                \"page\": \"{{page}}\"\n                            }\n                        };\n                        groupDatas.push({\n                            title: key,\n                            url: base_url + \"\/bookshelf,\" + JSON.stringify(option),\n                            style: {\n                                layout_flexGrow: 1,\n                                layout_flexBasisPercent: 0.45\n                            }\n                        });\n                    }\n                }\n            });\n\n            if (groupDatas.length % 2 !== 0) {\n                groupDatas.push({\n                    title: \"--\",\n                    url: \"\",\n                    style: {\n                        layout_flexGrow: 1,\n                        layout_flexBasisPercent: 0.45\n                    }\n                });\n            }\n        } catch (e) {\n            java.longToast(\"\u756a\u8304\u767b\u5f55\u8fc7\u671f\uff0c\u5df2\u9690\u85cf\u756a\u8304\u4e66\u67b6\");\n        }\n    }\n\n    try {\n        java.longToast(\"\u6b63\u5728\u52a0\u8f7d\u5206\u7ec4\u6570\u636e...\");\n        var userUrl = base_url + \"\/fquser?ssionid=\" + fqssionid;\n        var userRes = java.ajax(userUrl);\n        var userData = JSON.parse(userRes);\n\n        var userName = (userData && userData.data && userData.data.name) ? userData.data.name : '\u672a\u77e5\u7528\u6237';\n        if (!userName.includes('\u672a\u77e5\u7528\u6237')) {\n            infoData = [{\n                title: \"\u756a\u8304\u4e2a\u4eba\u4e2d\u5fc3\",\n                url: fqsjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }, {\n                title: \"\u4e2a\u6027\u63a8\u8350(\u756a\u8304)\",\n                url: fqtjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }, {\n                title: \"\u5386\u53f2\u9605\u8bfb(\u756a\u8304)\",\n                url: fqlsurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }];\n        }\n        groupQuery();\n    } catch (e) {\n        java.longToast(\"\u756a\u8304\u767b\u5f55\u8fc7\u671f\uff0c\u5df2\u9690\u85cf\u756a\u8304\u4e66\u67b6\");\n    }\n}\n\nvar style_list = [];\ntry {\n    var durl = `${base_url}\/discovestyle?source=${sources}&source_type=${source_type}&tab=${tab}`;\n    var res = java.ajax(durl);\n    var result = JSON.parse(res);\n    style_list = result.data || [];\n    if (result.msg) {\n        java.toast(result.msg);\n    }\n} catch (e) {\n    java.toast(\"\u53d1\u73b0\u6837\u5f0f\u83b7\u53d6\u5931\u8d25\");\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet qtop = {\n    method: \"GET\",\n    headers: {\n        cookie: qtcookie\n    },\n};\nqtop = JSON.stringify(qtop);\nlet qtsjurl = base_url+'\/get_book_shelf,'+qtop\nlet qtsj = [{\n                title: \"\u5927\u7070\u72fc\u4e2a\u4eba\u4e2d\u5fc3\",\n                url: qtsjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }]\nvar finalData = infoData.concat(groupDatas, style_list);\nfinalData = qtsj.concat(finalData);\nJSON.stringify(finalData);\n<\/js>","header":"{ \"User-Agent\":\"Mozilla\/5.0 (Linux; Android 6.0; Nexus 5 Build\/MRA58N) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Mobile Safari\/537.36 Edg\/138.0.0.0\" }","jsLib":"var host = [\n    'http:\/\/219.154.201.122:5006',\n    'https:\/\/api.langge.cf'\n];\n\nfunction getArguments(open_argument, key) {\n    try {\n        open_argument = JSON.parse(open_argument);\n    } catch (e) {\n        open_argument = {\n            media: \"\u5c0f\u8bf4\",\n            tone_id: \"\u9ed8\u8ba4\u97f3\u8272\",\n            server: host[0],\n            source: \"\u5168\u90e8\",\n            source_type: \"\u7537\u9891\",\n        };\n    }\n    if (key) {\n        return open_argument[key];\n    } else {\n        return open_argument;\n    }\n}\n\nfunction setArguments(key, value) {\n    const {\n        source\n    } = this;\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    open_argument[key] = value;\n    open_argument = JSON.stringify(open_argument);\n    source.setVariable(open_argument);\n    return open_argument;\n}\n\nfunction decrypt(Text) {\n    return Text;\n}\n\nfunction paraForAndroid(content, sources) {\n    let {\n        java,\n        cache,\n        source\n    } = this;\n    let plcolor = getArguments(source.getVariable(), \"plcolor\");\n    if (!plcolor) {\n        plcolor = \"#000000\";\n    }\n\n    const createSvg = this.createSvg.bind(this);\n\n    return content.replace(\/<p>(.*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\\/>)?<\\\/p>\/g,\n        (match, text, url, count) => {\n            if (url && count) {\n                const click = 0;\n                cache.putMemory(url, click);\n                const encodedUrl = url;\n                return `<p>${text}<img src=\"${createSvg(count, plcolor,encodedUrl,sources)}\"><\/p>`;\n            } else {\n                return `<p>${text}<\/p>`;\n            }\n        }\n    );\n}\n\n\nfunction showCmt(url, sources) {\n    let {\n        java,\n        cache\n    } = this;\n\n    const currentTime = Date.now();\n    const click = cache.getFromMemory(url);\n    let isqread = false;\n    try {\n        java.qread();\n        isqread = true;\n    } catch (e) {}\n    if (click < 1 && !isqread) {\n        cache.putMemory(url, click + 1);\n        return;\n    } else {\n        try {\n            java.startBrowserDp(url, sources + '\u6bb5\u8bc4');\n        } catch (e) {\n            java.startBrowser(url, sources + '\u6bb5\u8bc4');\n        }\n    }\n}\n\n\n\nfunction createSvg(number, color, encodedUrl, sources) {\n    var displayText = number > 99 ? \"99+\" : number.toString();\n    var loginInfoMap = {};\n\n    if (this.source && typeof this.source.getLoginInfoMap == 'function') {\n        loginInfoMap = this.source.getLoginInfoMap() || {};\n    }\n\n    var bubbleStyle = String(loginInfoMap['\u6bb5\u8bc4\u6c14\u6ce1\u6837\u5f0f(0-4)'] || '0');\n    var svg;\n\n    \/\/ \u6837\u5f0f1\uff1a\u7cbe\u81f4\u5706\u5f62 - \u7b80\u6d01\u4f18\u96c5\n    if (bubbleStyle == '1') {\n        svg = '<svg width=\"1000\" height=\"1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">' +\n            '<circle cx=\"500\" cy=\"500\" r=\"440\" fill=\"none\" stroke=\"' + color + '\" stroke-width=\"32\" opacity=\"0.2\"\/>' +\n            '<circle cx=\"500\" cy=\"500\" r=\"440\" fill=\"none\" stroke=\"' + color + '\" stroke-width=\"4\"\/>' +\n            '<text x=\"500\" y=\"500\" font-family=\"-apple-system, sans-serif\" text-anchor=\"middle\" ' +\n            'font-size=\"400\" fill=\"' + color + '\" dy=\"0.35em\" font-weight=\"500\">' + displayText + '<\/text>' +\n            '<\/svg>';\n    }\n    \/\/ \u6837\u5f0f2\uff1a\u5fae\u4fe1\u98ce\u683c - \u719f\u6089\u4eb2\u5207\u7684\u5bf9\u8bdd\u6c14\u6ce1\n    else if (bubbleStyle == '2') {\n        svg = '<svg width=\"1000\" height=\"900\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">' +\n            '<path d=\"M120,120 L880,120 Q920,120 920,160 L920,680 Q920,720 880,720 L280,720 L120,840 L120,720 Q80,720 80,680 L80,160 Q80,120 120,120 Z\" ' +\n            'fill=\"none\" stroke=\"' + color + '\" stroke-width=\"24\" stroke-linejoin=\"round\"\/>' +\n            '<text x=\"500\" y=\"440\" font-family=\"-apple-system, sans-serif\" text-anchor=\"middle\" ' +\n            'font-size=\"360\" fill=\"' + color + '\" dy=\"0.32em\" font-weight=\"500\">' + displayText + '<\/text>' +\n            '<\/svg>';\n    }\n    \/\/ \u6837\u5f0f3\uff1a\u60ac\u6d6e\u6807\u7b7e - \u6241\u5e73\u73b0\u4ee3\u98ce\u683c\n    else if (bubbleStyle == '3') {\n        svg = '<svg width=\"1000\" height=\"600\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">' +\n            '<rect x=\"80\" y=\"80\" width=\"840\" height=\"440\" rx=\"220\" ry=\"220\" ' +\n            'fill=\"none\" stroke=\"' + color + '\" stroke-width=\"6\"\/>' +\n            '<rect x=\"100\" y=\"100\" width=\"800\" height=\"400\" rx=\"200\" ry=\"200\" ' +\n            'fill=\"none\" stroke=\"' + color + '\" stroke-width=\"20\" opacity=\"0.3\"\/>' +\n            '<text x=\"500\" y=\"310\" font-family=\"-apple-system, sans-serif\" text-anchor=\"middle\" ' +\n            'font-size=\"280\" fill=\"' + color + '\" dy=\"0.32em\" font-weight=\"500\" letter-spacing=\"8\">' + displayText + '<\/text>' +\n            '<\/svg>';\n    }\n    \/\/ \u6837\u5f0f4\uff1a\u4e66\u7b7e\u6807\u6ce8 - \u7b26\u5408\u9605\u8bfb\u573a\u666f\n    else if (bubbleStyle == '4') {\n        svg = '<svg width=\"900\" height=\"1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">' +\n            '<path d=\"M150,80 L750,80 Q800,80 800,130 L800,870 Q800,920 750,920 L480,920 L450,980 L420,920 L150,920 Q100,920 100,870 L100,130 Q100,80 150,80 Z\" ' +\n            'fill=\"none\" stroke=\"' + color + '\" stroke-width=\"24\" stroke-linejoin=\"round\"\/>' +\n            '<line x1=\"150\" y1=\"280\" x2=\"750\" y2=\"280\" stroke=\"' + color + '\" stroke-width=\"3\" opacity=\"0.3\"\/>' +\n            '<text x=\"450\" y=\"520\" font-family=\"Georgia, serif\" text-anchor=\"middle\" ' +\n            'font-size=\"360\" fill=\"' + color + '\" dy=\"0.32em\" font-weight=\"400\">' + displayText + '<\/text>' +\n            '<text x=\"450\" y=\"800\" font-family=\"-apple-system, sans-serif\" text-anchor=\"middle\" ' +\n            'font-size=\"70\" fill=\"' + color + '\" opacity=\"0.6\" letter-spacing=\"3\">\u8bc4\u8bba<\/text>' +\n            '<\/svg>';\n    }\n    \/\/ \u9ed8\u8ba4\u8fd4\u56de\u6837\u5f0f0\n    else {\n        svg = '<svg width=\"160\" height=\"120\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">' +\n            '<path d=\"M 55 10 ' +\n            'L 120 10 ' +\n            'Q 150 10 150 40 ' +\n            'L 150 80 ' +\n            'Q 150 110 120 110 ' +\n            'L 55 110 ' +\n            'Q 25 110 25 80 ' +\n            'L 25 75 ' +\n            'L 3 60 ' +\n            'L 25 45 ' +\n            'L 25 40 ' +\n            'Q 25 10 55 10 Z\" ' +\n            'fill=\"none\" ' +\n            'stroke=\"' + color + '\" ' +\n            'stroke-width=\"2\" ' +\n            'stroke-linejoin=\"round\"\/>' +\n            '<!-- \u6570\u5b57\u6587\u672c -->' +\n            '<text x=\"87\" y=\"75\" ' +\n            'font-family=\"Arial, sans-serif\" ' +\n            'text-anchor=\"middle\" ' +\n            'dominant-baseline=\"middle\" ' +\n            'font-size=\"50\" ' +\n            'font-weight=\"bold\" ' +\n            'fill=\"' + color + '\">' +\n            displayText +\n            '<\/text>' +\n            '<!-- \u63d0\u793a\u6587\u672c -->' +\n            '<text x=\"87\" y=\"95\" ' +\n            'font-family=\"Arial, sans-serif\" ' +\n            'text-anchor=\"middle\" ' +\n            'dominant-baseline=\"middle\" ' +\n            'font-size=\"9\" ' +\n            'fill=\"' + color + '\" ' +\n            'opacity=\"0.7\">' +\n            '\u5237\u65b0\u67e5\u770b' +\n            '<\/text>' +\n            '<\/svg>';\n    }\n\n    var encodedSvg = this.java.base64Encode(svg);\n    return 'data:image\/svg+xml;base64,' + encodedSvg + ',{\"js\":\"showCmt(\\'' + encodedUrl + '\\', \\'' + sources + '\\')\",\"style\":\"text\"}';\n}\n\n\n\nfunction cleanHTML(html) {\n    let result = html\n        .replace(\/<header[^>]*>[\\s\\S]*?<\\\/header>\/gi, \"\")\n        .replace(\/<div class=\"tt-title\"[^>]*>[\\s\\S]*?<\\\/div>\/gi, \"\")\n        .replace(\/<(?!\\\/?p\\b|\\\/?img\\b)[^>]+>\/gi, \"\");\n    result = result.replace(\/<\\\/?p[^>]*>\/g, \"\\n\");\n    return result.replace(\/\\n+\/g, \"\\n\").trim();\n}\n\n\nfunction getBaseUrl(url) {\n    if (!url) {\n        return null;\n    }\n    url = String(url);\n    if (url.match(\/https?:\\\/\\\/\/i)) {\n        var index = url.indexOf(\"\/\", 9);\n        return index == -1 ? url : url.substring(0, index);\n    }\n    return null;\n}\n\nfunction isIPv4Address(ip) {\n    ip = String(ip);\n    let parts = ip.split(\".\");\n    if (parts.length !== 4) return false;\n\n    for (let part of parts) {\n        if (!\/^\\d+$\/.test(part)) return false; \/\/ \u5fc5\u987b\u662f\u6570\u5b57\n        if (part.length > 1 && part[0] === \"0\") return false; \/\/ \u7981\u6b62\u524d\u5bfc\u96f6\n        let num = parseInt(part, 10);\n        if (num < 0 || num > 255) return false; \/\/ \u8303\u56f4\u68c0\u67e5\n    }\n    return true;\n}\n\nfunction isIPv6Address(ip) {\n    ip = String(ip);\n    \/\/ \u5904\u7406\u53cc\u5192\u53f7\uff08\u6700\u591a\u51fa\u73b0\u4e00\u6b21\uff09\n    if (ip.includes(\":::\")) return false;\n    let doubleColonCount = (ip.match(\/::\/g) || []).length;\n    if (doubleColonCount > 1) return false;\n\n    \/\/ \u5206\u5272\u6210\u7ec4\n    let groups = ip.split(\":\");\n    let validGroupCount = 8;\n    let actualGroupCount = groups.filter((g) => g !== \"\").length;\n\n    \/\/ \u9a8c\u8bc1\u7ec4\u6570\n    if (doubleColonCount === 1) {\n        if (actualGroupCount > validGroupCount - 1) return false;\n    } else {\n        if (groups.length !== validGroupCount) return false;\n    }\n\n    \/\/ \u9a8c\u8bc1\u6bcf\u7ec4\u5185\u5bb9\n    for (let group of groups) {\n        if (group === \"\") continue; \/\/ \u8df3\u8fc7\u7a7a\u7ec4\uff08\u53cc\u5192\u53f7\u90e8\u5206\uff09\n        if (!\/^[0-9a-fA-F]{1,4}$\/.test(group)) return false; \/\/ 1-4\u4f4d\u5341\u516d\u8fdb\u5236\n    }\n    return true;\n}\n\nfunction isIPAddress(input) {\n    return isIPv4Address(input) || isIPv6Address(input);\n}\n\nfunction getSessionId(cookieString) {\n    const match = cookieString.match(\/sessionid=([^;]+)\/);\n    return match ? match[1] : null;\n}\n\nfunction getKey(key) {\n    let parts = key.split(\";\");\n    for (let part of parts) {\n        if (part.includes(\"qttoken\")) {\n            return part.split(\"=\")[1];\n        }\n    }\n    return \"\";\n}\n\nfunction getFanqieCookie() {\n    const {\n        cookie\n    } = this;\n    try {\n        return String(cookie.getCookie('fanqienovel.com') || java.getCookie('fanqienovel.com') || '');\n    } catch (e) {\n        return '';\n    }\n}\n\n\nfunction paraForiOS(html, sources) {\n    return html.replace(\n        \/<p>(.*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\\/>)?<\\\/p>\/g,\n        function(match, text, url, count) {\n            if (url && count) {\n                const encodedUrl = url.replace(\/&\/g, '&amp;');\n                return `<span rs-native>${text}<comment count=\"${count}\" onPress=\"java.showReadingBrowser('${encodedUrl}','${sources}\u6bb5\u8bc4')\"><\/span>`;\n            } else {\n                return `<span rs-native>${text}<\/span>`;\n            }\n        }\n    );\n}","lastUpdateTime":"1768939371572","loginUi":"[{\n        \"name\": \"\u90ae\u7bb1\",\n        \"type\": \"text\"\n    },{\n        \"name\": \"\u5bc6\u7801\",\n        \"type\": \"password\"\n    },\n    {\n        \"name\": \"\u2665\u767b\u5f55\u4e66\u6e90\",\n        \"type\": \"button\",\n        \"action\": \"login(true)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83c\udf45\u756a\u8304\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"fq_login()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83c\udfdd\u7528\u6237\u540e\u53f0\",\n        \"type\": \"button\",\n        \"action\": \"loginqt()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udd10\u6ce8\u518c\u4e66\u6e90\",\n        \"type\": \"button\",\n        \"action\": \"register()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n\n    {\n        \"name\": \" \ud83d\udd1a \u9000\u51fa\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"logout()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udd2e \u68c0\u6d4b\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"checkStatus()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2615\u6253\u8d4f\u4eab\u798f\u5229\",\n        \"type\": \"button\",\n        \"action\": \"vip()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \" \ud83d\uddd1 \u6e05\u9664\u8bbe\u5907\",\n        \"type\": \"button\",\n        \"action\": \"clearDevice()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n\n    }, {\n        \"name\": \"\ud83d\udcd1\u66f4\u5c11\u7b80\u4ecb\",\n        \"type\": \"button\",\n        \"action\": \"set_info()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udcdd\u6bb5\u8bc4\u5f00\u5173\",\n        \"type\": \"button\",\n        \"action\": \"paracomment('fqpara')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udcda \u540c\u6b65\u4e66\u67b6\",\n        \"type\": \"button\",\n        \"action\": \"set_reading()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u264b\ufe0f \u7537\/\u5973\u9891\u9053\",\n        \"type\": \"button\",\n        \"action\": \"set_source_type()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udca2 \u5f3a\u5236\u641c\u7d22\u5168\u90e8\",\n        \"type\": \"button\",\n        \"action\": \"disabledSources()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2747\ufe0f \u66f4\u65b0\u4e66\u6e90\",\n        \"type\": \"button\",\n        \"action\": \"renderVersionPage()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\uddc2\u5f53\u524d\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"get_media()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"\ud83d\udcd6\u5c0f\u8bf4\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u5c0f\u8bf4')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udd0a\u542c\u4e66\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u542c\u4e66')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83c\udfde\u6f2b\u753b\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u6f2b\u753b')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\uddb2\u77ed\u5267\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u77ed\u5267')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83c\udf9a\u5207\u6362\u670d\u52a1\u5668\",\n        \"type\": \"button\",\n        \"action\": \"set_server()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u267b\ufe0f\u68c0\u6d4b\u5f53\u524d\u670d\u52a1\u5668\",\n        \"type\": \"button\",\n        \"action\": \"checkNet()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2695\ufe0f\u672c\u5730\/\u670d\u52a1\u5668 \",\n        \"type\": \"button\",\n        \"action\": \"get_proxy()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udccc\u6c38\u4e45\u53d1\u5e03\u9875\ud83d\udccc\",\n        \"type\": \"button\",\n        \"action\": \"api()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2193\u2193\u4e0b\u65b9\u53ef\u5207\u6362\u6765\u6e90\u7528\u4e8e\u641c\u7d22\/\u53d1\u73b0\u9875\u2193\u2193\",\n        \"type\": \"button\",\n        \"action\": \"get_media()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"\u2728\ufe0f\u7f51\u53cb\u63a8\u8350\",\n        \"type\": \"button\",\n        \"action\": \"set_source('\u63a8\u8350')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udc96\u6211\u6765\u63a8\u8350\",\n        \"type\": \"button\",\n        \"action\": \"put_book()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u5168\u90e8\",\n        \"type\": \"button\",\n        \"action\": \"set_source('\u5168\u90e8')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u756a\u8304')\",\n        'name': '\u756a\u8304',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('69\u4e66\u5427')\",\n        'name': '69\u4e66\u5427',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u4e03\u732b')\",\n        'name': '\u4e03\u732b',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u767e\u5ea6')\",\n        'name': '\u767e\u5ea6',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u8d77\u70b9')\",\n        'name': '\u8d77\u70b9(\u7b2c\u4e09\u65b9)',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5f97\u95f4')\",\n        'name': '\u5f97\u95f4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5854\u8bfb')\",\n        'name': '\u5854\u8bfb',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u4e66\u65d7')\",\n        'name': '\u4e66\u65d7',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('QQ')\",\n        'name': 'QQ',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u732b\u773c')\",\n        'name': '\u732b\u773c',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u641c\u4e66\u795e\u5668')\",\n        'name': '\u641c\u4e66\u795e\u5668',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5f97\u5947')\",\n        'name': '\u5f97\u5947',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u4f2a69')\",\n        'name': '\u4f2a69',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u7231\u4e0b\u7535\u5b50\u4e66')\",\n        'name': '\u7231\u4e0b\u7535\u5b50\u4e66',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5c0f\u7c73')\",\n        'name': '\u5c0f\u7c73',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u661f\u661f\u5c0f\u8bf4')\",\n        'name': '\u661f\u661f\u5c0f\u8bf4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u7b14\u8da3\u960122')\",\n        'name': '\u7b14\u8da3\u960122',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u9876\u70b9')\",\n        'name': '\u9876\u70b9',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5e7b\u68a6\u8f7b\u5c0f\u8bf4')\",\n        'name': '\u5e7b\u68a6\u8f7b\u5c0f\u8bf4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u6c5f\u6e56')\",\n        'name': '\u6c5f\u6e56',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u6b6a\u745e\u53e4\u5fb7')\",\n        'name': '\u6b6a\u745e\u53e4\u5fb7\u6f2b\u753b',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u6cb3\u9a6c')\",\n        'name': '\u6cb3\u9a6c\u77ed\u5267',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u77e5\u4e4e')\",\n        'name': '\u77e5\u4e4e',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('vip')\",\n        'name': '\u4e0b\u65b9\u4e3aVIP\u4e13\u5c5e\u4e66\u6e90(\u70b9\u51fb\u6b64\u5904\u641c\u6240\u6709vip)',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        'action': \"set_source('\u559c\u9a6c\u62c9\u96c5')\",\n        'name': '\u559c\u9a6c\u62c9\u96c5',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('svip')\",\n            'name': '\u4e0b\u65b9\u4e3aSVIP\u4e13\u5c5e\u4e66\u6e90(\u70b9\u51fb\u6b64\u5904\u641c\u6240\u6709svip)',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 1\n            }\n        }, {\n            'action': \"set_source('\u8d85\u4f1a\u4e13\u5c5e\u77ed\u5267')\",\n            'name': '\u8d85\u4f1a\u4e13\u5c5e\u77ed\u5267',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u8d85\u4f1a\u4e13\u5c5e\u5c0f\u8bf4')\",\n            'name': '\u8d85\u4f1a\u4e13\u5c5e\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n        'action': \"set_source('\u9177\u6211')\",\n        'name': '\u9177\u6211',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n            'action': \"set_source('\u53f0\u6e7e\u5c0f\u8bf4')\",\n            'name': '\u53f0\u6e7e\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('3A\u5c0f\u8bf4')\",\n            'name': '3A\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n             'action': \"set_source('\u5305\u5b50\u6f2b\u753b')\",\n            'name': '\u5305\u5b50\u6f2b\u753b',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {       \t  \t\n            'action': \"set_source('QQ\u9605\u8bfb')\",\n            'name': 'QQ(\u4f1a\u5458\u4e66\u7c4d\u514d\u8d39)',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u4e45\u4e45\u5c0f\u8bf4')\",\n            'name': '\u4e45\u4e45\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n        \t    'action': \"set_source('\u8ffd\u66f4\u4eba')\",\n            'name': '\u8ffd\u66f4\u4eba',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u6f2b\u753b\u5c4b')\",\n            'name': '\u6f2b\u753b\u5c4b',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u6f2b\u753b\u7f51')\",\n            'name': '\u6f2b\u753b\u7f51',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('52\u4e66\u5e93')\",\n            'name': '52\u4e66\u5e93',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u8150\u5c0f\u8bf4')\",\n            'name': '\u8150\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u5b8c\u672c\u5c0f\u8bf4')\",\n            'name': '\u5b8c\u672c\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u76d0\u9009\u6587\u5e93')\",\n            'name': '\u76d0\u9009\u6587\u5e93',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {    \t     \t\n            'action': \"set_source('\u6709\u5ea6\u4e2d\u6587')\",\n            'name': '\u6709\u5ea6\u4e2d\u6587',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u4e09\u96f6\u8bfb\u4e66')\",\n            'name': '\u4e09\u96f6\u8bfb\u4e66',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u9e7f\u9e7f')\",\n            'name': '\u9e7f\u9e7f',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u9605\u53cb\u5c0f\u8bf4')\",\n            'name': '\u9605\u53cb\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u661f\u7a7a\u5c0f\u8bf4')\",\n            'name': '\u661f\u7a7a\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u5168\u514d\u6f2b\u753b')\",\n            'name': '\u5168\u514d\u6f2b\u753b',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('365\u5c0f\u8bf4')\",\n            'name': '365\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u51b7\u51b7\u6587\u5b66')\",\n            'name': '\u51b7\u51b7\u6587\u5b66',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u4e07\u76f8\u4e66\u57ce')\",\n            'name': '\u4e07\u76f8\u4e66\u57ce',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n             'action': \"set_source('\u5e7b\u68a6\u8f7b\u5c0f\u8bf4')\",\n            'name': '\u5e7b\u68a6\u8f7b\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\t\n            'action': \"set_source('\u72ec\u6b65\u5c0f\u8bf4')\",\n            'name': '\u72ec\u6b65\u5c0f\u8bf4',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u798f\u4e66\u7f51')\",\n            'name': '\u798f\u4e66\u7f51',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u901f\u8bfb\u8c37')\",\n            'name': '\u901f\u8bfb\u8c37',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('\u5168\u672c\u540c\u4eba')\",\n            'name': '\u5168\u672c\u540c\u4eba',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n             'action': \"set_source('\u6bd2\u820c\u5f71\u89c6')\",\n            'name': '\u6bd2\u820c\u5f71\u89c6',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n        \"name\": \"\u81ea\u5b9a\u4e49\u641c\u7d22\u6e90(\u591a\u4e2a\u7528\u82f1\u6587,\u5206\u5272)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u542c\u4e66Ai\u97f3\u8272\u586b\u5199\u540e\u70b9\u51fb\u53f3\u4e0a\u89d2\u2714\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u81ea\u5b9a\u4e49\u670d\u52a1\u5668(\u53ef\u4e0d\u586b)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u81ea\u5b9a\u4e49\u8bc4\u8bba\u989c\u8272(\u53ef\u4e0d\u586b)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u6bb5\u8bc4\u6c14\u6ce1\u6837\u5f0f(0-4)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)\",\n        \"type\": \"text\"\n    }\n]","loginUrl":"\/\/ \u5f53\u524d\u4e66\u6e90\u7248\u672c\u53f7\uff0c\u5207\u52ff\u4fee\u6539\uff0c\u5426\u5219\u5f71\u54cd\u66f4\u65b0\u7684\u8bc6\u522b\nconst localVersion = '5.1.10';\n\nfunction login(flag) {\n    if (flag == undefined) {\n        result = JSON.parse(source.getLoginInfo())\n    } else {\n        java.longToast(\"\\n\\n\ud83d\udc9e\u6b63\u5728\u767b\u5f55\u4e2d...\")\n        putLoginInfo(JSON.stringify(result))\n    }\n    let base_url = getArgument('server')\n    let zdyserver = String(result['\u81ea\u5b9a\u4e49\u670d\u52a1\u5668(\u53ef\u4e0d\u586b)']);\n    if (zdyserver.includes('http')) {\n        setArgument('server', zdyserver);\n        if (getKey(String(cookie.getCookie(base_url)))) {\n            let cookies = cookie.getCookie(base_url)\ntry{cookie.removeCookie(base_url)} catch(e){}\n            cookie.setCookie(zdyserver, cookies)\n        }\n        java.toast(`\\n\\n\u5f53\u524d\u670d\u52a1\u5668\u4e3a\u81ea\u5b9a\u4e49\u670d\u52a1\u5668\\n${zdyserver}\\n\\n\u5207\u6362\u670d\u52a1\u5668\u8bf7\u5148\u6e05\u7a7a\u670d\u52a1\u5668\u5730\u5740\u4e2d\u7684\u6570\u636e`);\n    }\n    let zdytone_id = String(result['\u542c\u4e66Ai\u97f3\u8272\u586b\u5199\u540e\u70b9\u51fb\u53f3\u4e0a\u89d2\u2714'] || '');\n    if (zdytone_id) {\n        setArgument('tone_id', zdytone_id);\n    } else {\n        setArgument('tone_id', '\u9ed8\u8ba4\u97f3\u8272');\n    }\n    let plcolor = String(result['\u81ea\u5b9a\u4e49\u8bc4\u8bba\u989c\u8272(\u53ef\u4e0d\u586b)'] || '#000000');\n    if (plcolor) {\n        setArgument('plcolor', plcolor);\n    } else {\n        setArgument('plcolor', '#000000');\n    }\n    let zdysources = String(result['\u81ea\u5b9a\u4e49\u641c\u7d22\u6e90(\u591a\u4e2a\u7528\u82f1\u6587,\u5206\u5272)'] || '');\n    if (zdysources) {\n        setArgument('source', zdysources);\n    };\n    base_url = getArgument('server')\n    let register_email = String(result['\u90ae\u7bb1'])\n    let password = String(result['\u5bc6\u7801'])\n    let key = String(result['\u5bc6\u94a5'] || '')\n\n    \/\/java.log(cookie.getCookie(base_url))\n    if ((register_email && password || key) && !String(getKey(String(cookie.getCookie(base_url))))) {\n        try{cookie.removeCookie(base_url)} catch(e){}\n        let deviceKey = '';\n        try {\n            deviceKey = java.deviceID();\n        } catch (e) {\n            deviceKey = java.androidId();\n        };\n        let deviceId = deviceKey;\n        if (register_email && password) {\n            let options = JSON.stringify({\n                method: 'POST',\n                headers: {\n                    'Content-Type': 'application\/json'\n                },\n                body: JSON.stringify({\n                    register_email: result['\u90ae\u7bb1'],\n                    password: result['\u5bc6\u7801']\n                })\n            })\n            try {\n                let data = JSON.parse(java.ajax(`${base_url}\/login_api,${options}`))\n                if (data.code == 0) {\n                    \/\/java.toast(deviceId)\n                    java.toast(\"\\n\\n\u2705\ufe0f\u767b\u5f55\u6210\u529f\")\n                    cookie.setCookie(base_url, `qttoken=${data.key};deviceId=${deviceId}`)\n                    result['\u5bc6\u94a5'] = data.key\n                    putLoginInfo(JSON.stringify(result))\n                } else {\n                    java.toast('\\n\\n\ud83d\udc94' + data.msg || \"\u767b\u5f55\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5\uff01\")\n                }\n            } catch (e) {\n                java.toast(\"\\n\\n\ud83d\udc94\u767b\u5f55\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5\uff01\\n\" + e.message)\n            }\n        } else {\n            cookie.setCookie(base_url, `qttoken=${key};deviceId=${deviceId}`)\n            let res = java.ajax(`${base_url}\/user_api,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n            try {\n                res = JSON.parse(res)\n                if (res.id != undefined) {\n                    java.toast('\\n\\n\u5bc6\u94a5\u767b\u5f55\u6210\u529f')\n                    result['\u90ae\u7bb1'] = res.email\n                    putLoginInfo(JSON.stringify(result))\n                } else {\n                    throw new Error()\n                }\n            } catch (e) {\n                java.log(e)\n                java.toast(\"\\n\\n\ud83d\udc94\u767b\u5f55\u5931\u8d25\")\n            }\n        }\n    } else if (flag && String(getKey(String(cookie.getCookie(base_url))))) {\n        java.toast(\"\\n\\n\u5f53\u524d\u2705\ufe0f\u5df2\u767b\u5f55\uff0c\u8bf7\ud83d\udeab\u9000\u51fa\u767b\u5f55\u540e\u91cd\u65b0\u767b\u5f55\");\n        \/\/checkStatus();\n    } else if (flag) {\n        java.toast(\"\\n\\n\u26d4\ufe0f\u8bf7\u5148\u586b\u5199\u90ae\u7bb1\u548c\u5bc6\u7801\");\n    }\n}\n\n\/\/ \u68c0\u6d4b\u670d\u52a1\u5668\nfunction checkNet() {\n    let url = getArgument('server');\n    java.longToast(`\\n\\n\u267b\ufe0f\u6b63\u5728\u68c0\u6d4b\uff1a${url}\\n\u8bf7\u7a0d\u7b49~`);\n    let date1 = new Date().getTime();\n    let html = java.ajax(url + '\/login');\n    let date2 = new Date().getTime();\n    let t = date2 - date1;\n    let c = String(html).indexOf('\u5927\u7070\u72fc');\n    let code = 1;\n    let time = t \/ 1000 + 's';\n    let logTime = '\u3010' + url + '\u3011\\n\u250b\u250b\\n' + '\u89e3\u6790\u65f6\u95f4\uff1a' + time;\n    if (c == -1 || t > 5000) {\n        java.longToast('\\n\ud83d\udc94\u3010\u8bbf\u95ee\u5931\u8d25\u63d0\u793a\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2663\ufe0f\u5f53\u524d\u63a5\u53e3\u65e0\u6cd5\u8bbf\u95ee(\u53ef\u80fd\u88ab\u5899)\u2663\ufe0f\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\/\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    } else if (t < 1000) {\n        java.longToast('\\n\ud83d\udc96\u3010\u7f51\u7edc\u73af\u5883\u4f18\u826f\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2764\ufe0f\u5ef6\u8fdf\u4f4e\uff0c\u63a8\u8350\u4f7f\u7528\u6b64\u63a5\u53e3\u2764\ufe0f\\n\u250b\u250b\\n\u7f51\u7edc\u73af\u5883\u4f18\u826f\uff0c\u8bf7\u7ee7\u7eed\u4fdd\u6301\u72b6\u6001\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    } else if (t >= 1000 && t < 2000) {\n        java.longToast('\\n\ud83d\udc9b\u3010\u7f51\u7edc\u73af\u5883\u4e00\u822c\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2666\ufe0f\u5ef6\u8fdf\u4e00\u822c\uff0c\u52c9\u5f3a\u53ef\u4f7f\u7528\u2666\ufe0f\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\u6216\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    } else if (t >= 2000 && t < 5000) {\n        java.longToast('\\n\ud83d\udc94\u3010\u7f51\u7edc\u73af\u5883\u582a\u5fe7\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2660\u5ef6\u8fdf\u8fc7\u9ad8\uff0c\u4e0d\u5efa\u8bae\u4f7f\u7528\u2660\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\u6216\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    }\n}\n\nfunction isVips(res) {\n    let isVIP = '';\n    let vipEndTime = res.vip_end_time;\n    let formattedDate = '';\n\n    if (vipEndTime && vipEndTime !== 0) {\n        let date = new Date(vipEndTime * 1000);\n        formattedDate = `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`;\n        let currentTime = Math.floor(Date.now() \/ 1000);\n        let remainingDays = Math.ceil((vipEndTime - currentTime) \/ (24 * 60 * 60));\n        if (currentTime > vipEndTime) {\n            isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} (\u5df2\u8fc7\u671f)`;\n        } else if (remainingDays <= 7) {\n            isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} \u5269\u4f59${remainingDays}\u5929`;\n        } else {\n            if (vipEndTime < 1912946812) {\n                isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"}(${formattedDate})`;\n            } else {\n                isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} (\u6c38\u4e45)`;\n            }\n        }\n    } else {\n        isVIP = '\u60a8\u5c1a\u672a\u5f00\u901aVIP';\n    }\n    return isVIP;\n}\n\nfunction checkStatus() {\n    java.longToast('\\n\\n\u267b\ufe0f\u68c0\u6d4b\u4e2d...');\n    let base_url = getArgument('server')\n    let res = java.ajax(`${base_url}\/user_api,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n    try {\n        res = JSON.parse(res)\n        if (res.id != undefined) {\n            result['\u90ae\u7bb1'] = res.email\n            putLoginInfo(JSON.stringify(result))\n            let devices\n            try {\n                devices = Object.keys(JSON.parse(res.device)).length;\n            } catch (e) {\n                devices = res.device ? 1 : 0;\n            }\n            let isVip = isVips(res);\n            tips = `\n\u250f\u2505\u2505\u2505\u2505\u2505\u2505\u2531\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2510\n\u3000 \ud83e\udde2\u6635\u79f0 \u3000\u3000\u3000\u3000${res.nickname.padEnd(20,\"\\t\") || \"\u672a\u8bbe\u7f6e\".padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\u2709\ufe0f\u90ae\u7bb1\u3000\u3000\u3000\u3000${res.email.replace(\/(.{3}).*?@\/,\"$1***@\").padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udd11\u5bc6\u94a5\u3000\u3000\u3000\u3000${(`${res.user_key.substring(0,4)}***${res.user_key.slice(-4)}`).padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udcc5\u6ce8\u518c\u65f6\u95f4\u3000\u3000${java.timeFormat(res.register_time*1000).padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\uddd2\ufe0f\u4eca\u65e5\u9605\u8bfb\u3000\u3000${(java.timeFormat(new Date()).slice(0,10)==java.timeFormat(res.last_read_time * 1000).slice(0,10)?res.day_read_count:0).toString().padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udcda\u7d2f\u8ba1\u9605\u8bfb\u3000\u3000${res.all_read_count.toString().padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udd53\u6700\u540e\u9605\u8bfb\u3000\u3000${(res.last_read_time != 0?java.timeFormat(res.last_read_time * 1000):'\u672a\u9605\u8bfb').padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udcf1\u5728\u7ebf\u8bbe\u5907\u3000\u3000${devices.toString().padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udc51\u4f1a\u5458\u72b6\u6001\u3000\u3000${isVip.padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udeab\u5c01\u7981\u72b6\u6001\u3000\u3000${res.is_banned?'\u5df2\u5c01\u7981':'\u6b63\u5e38\u3000'}\u3000\u3000\u3000\u3000\u3000\u3000\u3000\n\u2517\u2505\u2505\u2505\u2505\u2505\u2505\u2539\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2518\n`\n            java.log(tips)\n            java.longToast(tips)\n        } else {\n            throw new Error(res.msg)\n        }\n    } catch (e) {\n        \/\/java.log(e)\n        java.toast(\"\\n\u68c0\u6d4b\u767b\u5f55\u5931\u8d25\\n\" + e.message)\n    }\n}\n\nfunction clearDevice() {\n    let base_url = getArgument('server')\n    let res = java.ajax(`${base_url}\/clear,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n    res = JSON.parse(res);\n   java.toast(res.code == 0 ? \"\\n\\n\ud83d\udcf4\u8bbe\u5907\u6e05\u9664\u6210\u529f\" : res.msg)\n    Packages.java.lang.Thread.sleep(500)\n    checkStatus()\n}\n\/\/ \u4fdd\u5b58\u767b\u5f55UI\u4fe1\u606f\nfunction putLoginInfo(info) {\n    try {\n        let key = java.androidId()\n        let encodeStr = Packages.android.util.Base64.encodeToString(java.createSymmetricCrypto(\"AES\", key).encrypt(info), 2)\n        cache.put(`userInfo_${source.getKey()}`, encodeStr)\n        return true\n    } catch (e) {\n        java.log(e)\n        return source.putLoginInfo(info)\n    }\n}\n\n\/\/ \u7528\u6237\u540e\u53f0\nfunction loginqt() {\n\t   let base_url = getArgument('server');\n\t   let ck = String(cookie.getKey(base_url, \"qttoken\"));\n\t   if (!ck) {\n\t   \tjava.longToast('\\n\\n\ud83d\udeab\u8bf7\u5148\u767b\u5f55!')\n\t   \t} else {\n\t   \t\tjava.startBrowserAwait(getArgument('server') + '\/user', '\u5927\u7070\u72fc\u5c0f\u8bf4\u540e\u53f0');\n\t   \t\t}\n    }\n\n\/\/ \u7528\u6237\u6ce8\u518c\nfunction register() {\n\t   let base_url = getArgument('server');\n\t   \tjava.startBrowserAwait(getArgument('server') + '\/register', '\u5927\u7070\u72fc\u5c0f\u8bf4\u6ce8\u518c');\n    }\n\n\/\/\u767b\u5f55\u756a\u8304\nfunction fq_login() {\n    try {\n        java.startBrowserAwait(\"https:\/\/fanqienovel.com\/\", \"\u767b\u5f55\")\n    } catch (e) {\n        java.toast(e)\n    }\n    try {\n        cookie.removeCookie(\"snssdk.com\")\n    } catch (e) {}\n    var cookie_ = \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : source.getLoginInfoMap()['\u624b\u52a8\u767b\u5f55Token'])\n    let user\n    try {\n        user = JSON.parse(java.ajax(\"https:\/\/fanqienovel.com\/api\/user\/info\/v2,\" + JSON.stringify({\n            method: \"GET\",\n            headers: {\n                \"Cookie\": cookie_\n            }\n        }))).data.name\n    } catch (e) {\n        java.log(e)\n    }\n    if (!cookie_ || cookie_ == \"sessionid=\" || !user) {\n        java.toast(\"\u672a\u83b7\u53d6\u5230\u767b\u5f55\u51ed\u636e\uff0c\u767b\u5f55\u5931\u8d25\")\n        return false\n    }\n    java.toast(\"\\n\\n\u6b22\u8fce \" + user + \"\\n\u767b\u5f55\u6210\u529f\uff01\")\n    return true\n}\n\n\/\/\u9000\u51fa\u767b\u5f55\nfunction logout() {\n    cookie.removeCookie(\"fanqienovel.com\");\n    cookie.removeCookie(\"snssdk.com\");\n    cookie.removeCookie(\"69shuba.com\");\n    \/*\n    let servers = host\n    for (let server of servers) {\n    \ttry{removeCookie(server )} catch(e){cookie.removeCookie(server )}\n    }\n    *\/\ntry{cookie.removeCookie(getArgument('server'))} catch(e){}\n    java.toast(\"\u2705\ufe0f\u9000\u51fa\u767b\u5f55\u6210\u529f\");\n}\n\n\/\/\u83b7\u53d6\u53c2\u6570\nfunction getArgument(key) {\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    return open_argument[key];\n}\n\n\/\/\u8bbe\u7f6e\u53c2\u6570\nfunction setArgument(key, value) {\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    open_argument[key] = value;\n    open_argument = JSON.stringify(open_argument);\n    source.setVariable(open_argument);\n    return open_argument;\n}\n\n\/\/ \u8bbe\u7f6e\u672c\u5730or\u4e91\u7aef\u8bbf\u95ee\nfunction get_proxy() {\n    let proxy = getArgument('proxy');\n    if (proxy == '\u672c\u5730') {\n        setArgument('proxy', '\u4e91\u7aef');\n        java.longToast('\\n\u6240\u6709\u6570\u636e\u91c7\u7528\\n\\n\u670d\u52a1\u5668\u7f51\u7edc\u8bbf\u95ee\\n\\n\u5982\u679c\u53d1\u73b0\u7528\u4e0d\u4e86\uff0c\u8bf7\u5207\u6362\u672c\u5730\u7f51\u7edc\u8bbf\u95ee\uff0c\u598269\u4e66\u5427');\n    } else {\n        setArgument('proxy', '\u672c\u5730');\n        java.longToast('\\n\u6240\u6709\u6570\u636e\u91c7\u7528\\n\\n\u672c\u5730\u7f51\u7edc\u8bbf\u95ee\\n\\n\u5982\u679c\u53d1\u73b0\u7528\u4e0d\u4e86\uff0c\u8bf7\u5f00\u542f\u7f51\u7edc\u4ee3\u7406\uff0c\u598269\u4e66\u5427');\n    }\n}\n\n\n\/\/\u8bbe\u7f6e\u7537\u5973\u9891\nfunction set_source_type() {\n    let source_type = getArgument(\"source_type\");\n    if (source_type == '\u5973\u9891') {\n        setArgument(\"source_type\", '\u7537\u9891');\n    java.toast(\"\\n\u53d1\u73b0\u9875\u5df2\u8bbe\u7f6e\u4e3a:\ud83d\ude4b\u200d\u2642\ufe0f\u7537\u9891\" );\n    } else {\n        setArgument(\"source_type\", '\u5973\u9891');\n    java.toast(\"\\n\u53d1\u73b0\u9875\u5df2\u8bbe\u7f6e\u4e3a:\ud83d\ude4b\u200d\u2640\ufe0f\u5973\u9891\" );\n    }\n    \n}\n\nfunction set_reading() {\n\tlet reading = getArgument(\"reading\");\n    if (reading == '1') {\n        setArgument(\"reading\", '0');\n    java.toast(\"\\n\\n\u5927\u7070\u72fc\u4e66\u67b6\u8bb0\u5f55\u540c\u6b65\u5df2\u5173\u95ed\uff01\" );\n    } else {\n        setArgument(\"reading\", '1');\n    java.longToast(\"\\n\\n\u5927\u7070\u72fc\u4e66\u67b6\u8bb0\u5f55\u540c\u6b65\u5df2\u5f00\u542f\uff01\\n\u5237\u65b0\u9605\u8bfb\u4e66\u67b6\u5373\u53ef\u5c06\u4e66\u67b6\u4e66\u7c4d\u540c\u6b65\u5230\u5927\u7070\u72fc\u4e66\u67b6\uff01\" );\n    }\n\n\t}\n\n\/\/\u9996\u9875\nfunction api() {\n    java.startBrowserAwait('http:\/\/fb.langge.cf', \"\u9996\u9875\");\n}\n\n\/\/\u6253\u8d4f\nfunction vip() {\n\t    let base_url = getArgument('server');\n\t   let ck = String(cookie.getKey(base_url, \"qttoken\"));\n\t   if (!ck) {\n\t   \tjava.longToast('\\n\\n\ud83d\udeab\u8bf7\u5148\u767b\u5f55!')\n\t   \t} else {\n\t   \t\tjava.startBrowserAwait(getArgument('server') + '\/coffee', '\u5927\u7070\u72fc\u5c0f\u8bf4\u4f1a\u5458\u5f00\u901a');\n\t   \t\t}\n    }\n\nvar server = getArgument('server');\n\n\/\/\u8bbe\u7f6e\u641c\u7d22\u5a92\u4f53\nfunction set_media(media) {\n    const mediaConfig = {\n        '\u559c\u9a6c\u62c9\u96c5': ['\u542c\u4e66'],\n        '\u756a\u8304': '*',\n        '\u798f\u5229\u5c0f\u8bf4':['\u5c0f\u8bf4'],\n        '\u5168\u514d\u6f2b\u753b':['\u6f2b\u753b'],\n        '\u5305\u5b50\u6f2b\u753b':['\u6f2b\u753b'],\n        '\u6f2b\u753b\u7f51':['\u6f2b\u753b'],\n        '\u98ce\u8f66\u6f2b\u753b':['\u6f2b\u753b'],\n        '\u798f\u5229\u6f2b\u753b':['\u6f2b\u753b'],\n        '\u597d\u770b\u6f2b\u753b':['\u6f2b\u753b'],\n        '\u9177\u6211':['\u542c\u4e66'],\n        '\u6d77\u6d0b\u542c\u4e66':['\u542c\u4e66'],\n        '\u4e03\u732b': ['\u5c0f\u8bf4', '\u542c\u4e66'],\n        '\u6cb3\u9a6c': ['\u77ed\u5267'],\n        '\u8d85\u4f1a\u4e13\u5c5e\u77ed\u5267': ['\u77ed\u5267'],\n        '\u6b6a\u745e\u53e4\u5fb7': ['\u6f2b\u753b'],\n        '\u6bd2\u820c\u5f71\u89c6':['\u77ed\u5267'],\n        '\u5168\u90e8': '*', \/\/ \u5141\u8bb8\u6240\u6709\u6a21\u5f0f\n        '\u9ed8\u8ba4': ['\u5c0f\u8bf4']\n    };\n\n    const source = getArgument('source');\n    const allowedModes = mediaConfig[source] || mediaConfig['\u9ed8\u8ba4'];\n    let targetMedia = mediaConfig['\u9ed8\u8ba4'][0];\n    let isAllowed = false;\n\n    if (allowedModes === '*' || allowedModes.includes(media)) {\n        targetMedia = media;\n        isAllowed = true;\n    } else if (Array.isArray(allowedModes)) {\n        targetMedia = allowedModes[0];\n    }\n\n    const message = isAllowed ?\n        `\\n\\n\u5df2\u5207\u6362\u81f3\uff1a${targetMedia}\\n\u8bf7\u91cd\u65b0\u641c\u7d22\u4e66\u7c4d\uff01` :\n        `\\n\\n\u76ee\u524d${source}\uff1a\u4e0d\u652f\u6301\u3010${media}\u3011\u6a21\u5f0f\uff01\\n\u5df2\u81ea\u52a8\u5207\u6362\u81f3\uff1a${targetMedia}`;\n\n    setArgument('media', targetMedia);\n    java.toast(message);\n}\n\n\/\/\u83b7\u53d6\u641c\u7d22\u5a92\u4f53\nfunction get_media() {\n    let media = getArgument('media');\n    let source = getArgument('source');\n    if (media == '') {\n        media = '\u5168\u90e8';\n    }\n    var tishi = '\\n\\n\u5f53\u524d\u670d\u52a1\u5668\uff1a' + getArgument('server')\n    java.longToast(`\\n\\n\u5f53\u524d\u4f7f\u7528\u6e90\uff1a${source}-${media}${tishi}`);\n}\n\n\n\/\/\u8bbe\u7f6e\u670d\u52a1\u5668\nfunction set_server() {\n    putLoginInfo(JSON.stringify(result))\n    let zdyserver;\n    let base_url = getArgument('server')\n    try {\n        zdyserver = String(result['\u81ea\u5b9a\u4e49\u670d\u52a1\u5668(\u53ef\u4e0d\u586b)']);\n        if (zdyserver.includes('http')) {\n            setArgument('server', zdyserver);\n            if (getKey(String(cookie.getCookie(base_url)))) {\n                let cookies = cookie.getCookie(base_url)\n                try{cookie.removeCookie(base_url)} catch(e){}\n                cookie.setCookie(zdyserver, cookies)\n            }\n            java.toast(`\\n\\n\u5f53\u524d\u670d\u52a1\u5668\u4e3a\u81ea\u5b9a\u4e49\u670d\u52a1\u5668\\n${zdyserver}\\n\\n\u5207\u6362\u670d\u52a1\u5668\u8bf7\u5148\u6e05\u7a7a\u670d\u52a1\u5668\u5730\u5740\u4e2d\u7684\u6570\u636e`);\n        } else {\n            zdyserver = '';\n        }\n    } catch (error) {\n        zdyserver = '';\n    }\n    if (!zdyserver) {\n        const servers = host\n        const currentServer = getArgument('server') || '';\n        const currentIndex = servers.indexOf(currentServer);\n\n        const nextIndex = currentIndex >= 0 ? (currentIndex + 1) % servers.length : 0;\n        const nextServer = servers[nextIndex];\n\n        setArgument('server', nextServer);\n        if (getKey(String(cookie.getCookie(currentServer)))) {\n            let cookies = cookie.getCookie(currentServer)\ntry{cookie.removeCookie(currentServer)} catch(e){}\n            cookie.setCookie(nextServer, cookies)\n        }\n        java.longToast(`\\n\\n\u670d\u52a1\u5668\u3010${nextIndex+1}\u3011\uff1a${nextServer}`);\n    }\n}\n\n\/\/\u83b7\u53d6\u97f3\u8272\nvar tone_id = getArgument('tone_id');\n\nfunction get_tone_id(arg) {\n    var datadist = {\n        \"0\": \"\u9ed8\u8ba4\u97f3\u8272\",\n        \"-1\": \"\u9605\u8bfb\u6a21\u5f0f\",\n        \"-2\": \"\u6f2b\u753b\u6a21\u5f0f\",\n        \"51\": \"\u591a\u4eba\u53d1\u97f3\",\n        \"1\": \"\u751c\u7f8e\u5c11\u5973\",\n        \"2\": \"\u6e05\u4eae\u9752\u53d4\",\n        \"5\": \"\u5f00\u6717\u9752\u5e74\",\n        \"6\": \"\u6e29\u67d4\u6dd1\u5973\",\n        \"4\": \"\u6210\u719f\u5927\u53d4\",\n        \"74\": \"\u5927\u53d4\u5347\u7ea7\",\n        \"30\": \"\u4f18\u96c5\u5fa1\u59d0\"\n    };\n    var tone_id = datadist[arg] || arg;\n    var tishi = '\\n\\n\u5f53\u524d\u97f3\u8272\uff1a' + tone_id;\n    java.toast(tishi);\n}\n\n\/\/\u8bbe\u7f6e\u97f3\u8272\nfunction set_tone_id(mode, name) {\n    putLoginInfo(JSON.stringify(result))\n    let zdytone_id;\n    try {\n        zdytone_id = String(result['\u5176\u4ed6\u97f3\u8272\u586b\u5199\u540e\u70b9\u51fb\u53f3\u4e0a\u89d2\u2714']);\n        if (zdytone_id) {\n            setArgument('tone_id', zdytone_id);\n            java.toast(`\\n\\n\u5f53\u524d\u97f3\u8272\u4e3a\u81ea\u5b9a\u4e49\u97f3\u8272\\n${zdytone_id}\\n\\n\u5207\u6362\u97f3\u8272\u8bf7\u5148\u6e05\u7a7a\u97f3\u8272\u8f93\u5165\u6846\u4e2d\u7684\u6570\u636e`);\n        } else {\n            zdytone_id = '';\n        }\n    } catch (error) {\n        zdytone_id = '';\n    }\n    if (!zdytone_id) {\n        let toast = \"\\n\\n\u5df2\u5207\u6362\u81f3\uff1a\" + name + '\\n\\n\u5207\u6362\u540e\u9700\u8981\u5237\u65b0\u8be6\u60c5\u9875';\n        setArgument('tone_id', mode);\n        java.toast(toast);\n    }\n}\n\n\/\/\u8bbe\u7f6e\u6765\u6e90\nfunction set_source(sources) {\n    let zdysources = String(result['\u81ea\u5b9a\u4e49\u641c\u7d22\u6e90(\u591a\u4e2a\u7528\u82f1\u6587,\u5206\u5272)'] || '');\n    if (zdysources.length > 1 && zdysources != 'undefined') {\n        java.toast('\\n\\n\u8bf7\u5148\u6e05\u7a7a\u81ea\u5b9a\u4e49\u6e90\u518d\u8bbe\u7f6e');\n    } else {\n        setArgument('source', sources);\n        set_media('\u5c0f\u8bf4');\n        java.toast(`\\n\\n\u5f53\u524d\u6765\u6e90\u5df2\u5207\u6362\u4e3a:\\n${sources}\\n\\n\u5207\u6362\u540e\u8bf7\u91cd\u65b0\u641c\u7d22`);\n    }\n}\n\n\/\/ \u8bbe\u7f6e\u7b80\u4ecb\nfunction set_info() {\n    var info = getArgument('info');\n    if (info == 'on') {\n        setArgument('info', 'off');\n        java.toast('\\n\\n\u5df2\u6062\u590d\u8be6\u60c5\u9875\u8be6\u7ec6\u7b80\u4ecb');\n    } else {\n        setArgument('info', 'on');\n        java.toast('\\n\\n\u5df2\u7cbe\u7b80\u8be6\u60c5\u9875\u7b80\u4ecb');\n    }\n}\n\n\/\/ \u756a\u8304\u6bb5\u8bc4\nfunction paracomment() {\n    var fqpara = getArgument('fqpara');\n    if (fqpara == 'on') {\n        setArgument('fqpara', 'off');\n        java.longToast('\\n\\n\u6bb5\u8bc4\u5df2\u5173\u95ed');\n    } else {\n        setArgument('fqpara', 'on');\n        java.longToast(\"\\n\\n\u6bb5\u8bc4\u5df2\u5f00\u542f\\n\\n\u957f\u6309\u5237\u65b0\u6bb5\u540e\u9762\u7684\u56fe\u7247\u5373\u53ef\\n\\n\u5982\u679c\u56fe\u7247\u4e0d\u663e\u793a\uff0c\u5237\u65b0\u65e0\u53cd\u5e94\\n\u8bf7\u66f4\u65b0\u6d4b\u8bd5\u7248\u9605\u8bfbapp\");\n    }\n}\n\n\/\/ \u5f3a\u5236\u641c\u7d22\u88ab\u7981\u7528\u7684\u6e90\nfunction disabledSources() {\n    var disabled_sources = getArgument('disabled_sources');\n    if (disabled_sources == '1') {\n        setArgument('disabled_sources', '0');\n        java.longToast('\\n\\n\u5f3a\u5236\u641c\u7d22\u7981\u7528\u7684\u6e90\u5df2\u5173\u95ed');\n    } else {\n        setArgument('disabled_sources', '1');\n        setArgument('source', '\u5168\u90e8');\n        java.longToast(\"\\n\\n\u5f3a\u5236\u641c\u7d22\u7981\u7528\u7684\u6e90\u5df2\u5f00\u542f\\n\\n\u6ce8\u610f\uff1a\u5f00\u542f\u540e\u641c\u7d22\u65f6\u95f4\u4f1a\u53d8\u957f\uff01\");\n    }\n}\n\n\/\/ \u6211\u8981\u63a8\u8350\nfunction put_book() {\n    java.startBrowserAwait(getArgument('server') + '\/put_book', '\u6211\u6765\u63a8\u8350');\n}\n\n\/\/ \u4e66\u6e90\u66f4\u65b0\nfunction renderVersionPage() {\n    let yd = '';\n    let html = `\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n  <meta charset=\"UTF-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\n  <title>\u4e66\u6e90\u66f4\u65b0<\/title>\n  <!-- Font Awesome \u56fe\u6807\u5e93 -->\n  <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.4.0\/css\/all.min.css\" \/>\n  <style>\n    :root {\n      --primary-gradient: linear-gradient(135deg, #4e6ef2, #6b2dd8);\n      --latest-gradient: linear-gradient(135deg, #8e2de2 0%, #4a00e0 50%, #d4af37 100%);\n      --success-color: #28c76f;\n      --warning-color: #ff9f43;\n      --error-color: #ea5455;\n      --text-main: #1f2937;\n      --text-secondary: #6b7280;\n      --card-bg: #ffffff;\n      --border-color: #e5e7eb;\n      --light-bg: #f9fafb;\n      --shadow: 0 4px 12px rgba(78, 110, 242, 0.1);\n      --shadow-hover: 0 6px 18px rgba(78, 110, 242, 0.2);\n      --glow-shadow: 0 0 25px rgba(142, 45, 226, 0.5), 0 0 50px rgba(212, 175, 55, 0.3);\n      --modal-bg: rgba(31, 41, 55, 0.8);\n      --modal-content-bg: #ffffff;\n    }\n\n    * {\n      box-sizing: border-box;\n      margin: 0;\n      padding: 0;\n      font-family: 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;\n    }\n\n    body {\n      background: linear-gradient(135deg, #eef2ff, #f5f7ff);\n      color: var(--text-main);\n      min-height: 100vh;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      padding: 16px;\n    }\n\n    \/* \u52a0\u8f7d\u52a8\u753b *\/\n    .loading-wrapper {\n      text-align: center;\n      animation: fadeIn 0.3s ease;\n    }\n\n    .loading-spinner {\n      width: 50px;\n      height: 50px;\n      border: 4px solid rgba(78, 110, 242, 0.3);\n      border-top-color: #4e6ef2;\n      border-radius: 50%;\n      margin: 0 auto 20px;\n      animation: spin 1s linear infinite;\n    }\n\n    .loading-text {\n      color: var(--text-main);\n      font-size: 16px;\n      font-weight: 500;\n    }\n\n    @keyframes spin {\n      to { transform: rotate(360deg); }\n    }\n\n    @keyframes fadeIn {\n      from { opacity: 0; transform: translateY(20px); }\n      to { opacity: 1; transform: translateY(0); }\n    }\n\n    @keyframes slideIn {\n      from { opacity: 0; transform: translateY(30px); }\n      to { opacity: 1; transform: translateY(0); }\n    }\n\n    @keyframes pulse {\n      0%, 100% { opacity: 1; }\n      50% { opacity: 0.7; }\n    }\n\n    @keyframes gradientAnimation {\n      0% { background-position: 0% 50%; }\n      50% { background-position: 100% 50%; }\n      100% { background-position: 0% 50%; }\n    }\n\n    @keyframes breathe {\n      0%, 100% { \n        transform: scale(1);\n        box-shadow: var(--glow-shadow), var(--shadow);\n      }\n      50% { \n        transform: scale(1.02);\n        box-shadow: 0 0 30px rgba(142, 45, 226, 0.6), 0 0 60px rgba(212, 175, 55, 0.4), var(--shadow);\n      }\n    }\n\n    @keyframes shimmer {\n      0% {\n        background-position: -200% center;\n      }\n      100% {\n        background-position: 200% center;\n      }\n    }\n\n    \/* \u4e3b\u5bb9\u5668 *\/\n    .container {\n      width: 100%;\n      max-width: 420px;\n      background: var(--card-bg);\n      border-radius: 24px;\n      overflow: hidden;\n      box-shadow: var(--shadow);\n      position: relative;\n      z-index: 1;\n      animation: slideIn 0.5s ease;\n      display: none;\n    }\n\n    \/* \u5934\u90e8 *\/\n    .header {\n      background: var(--primary-gradient);\n      color: #ffffff;\n      padding: 24px 16px;\n      text-align: center;\n      position: relative;\n      overflow: hidden;\n    }\n\n    .header::before {\n      content: '';\n      position: absolute;\n      top: -30px;\n      left: -30px;\n      width: 80px;\n      height: 80px;\n      background: rgba(255, 255, 255, 0.15);\n      border-radius: 50%;\n    }\n\n    .header::after {\n      content: '';\n      position: absolute;\n      bottom: -60px;\n      right: -60px;\n      width: 150px;\n      height: 150px;\n      background: rgba(255, 255, 255, 0.1);\n      border-radius: 50%;\n    }\n\n    .header h1 {\n      font-size: 1.4rem;\n      font-weight: 700;\n      margin-bottom: 8px;\n      position: relative;\n      z-index: 2;\n    }\n\n    .header p {\n      font-size: 0.9rem;\n      opacity: 0.9;\n      line-height: 1.4;\n      position: relative;\n      z-index: 2;\n    }\n\n    .header-icon {\n      font-size: 48px;\n      margin-bottom: 10px;\n      display: inline-block;\n      animation: bounce 2s ease infinite;\n    }\n\n    @keyframes bounce {\n      0%, 100% { transform: translateY(0); }\n      50% { transform: translateY(-10px); }\n    }\n\n    \/* \u7248\u672c\u5bf9\u6bd4 *\/\n    .version-comparison {\n      display: flex;\n      flex-wrap: nowrap;\n      gap: 12px;\n      padding: 16px;\n      margin-top: 8px;\n      position: relative;\n      z-index: 10;\n    }\n\n    .version-card {\n      flex: 1;\n      min-width: 45%;\n      background: var(--card-bg);\n      border-radius: 16px;\n      padding: 28px 16px 16px;\n      box-shadow: var(--shadow);\n      text-align: center;\n      position: relative;\n      transition: transform 0.3s ease, box-shadow 0.3s ease;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n    }\n\n    .version-card:hover {\n      transform: translateY(-4px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .version-card.current-version {\n      background: linear-gradient(135deg, #ffffff 0%, #f8f9ff 100%);\n      border: 1px solid rgba(78, 110, 242, 0.15);\n    }\n\n    .version-card.current-version:hover {\n      box-shadow: 0 6px 20px rgba(78, 110, 242, 0.15);\n    }\n\n    .version-card.current-version h3,\n    .version-card.current-version .version-number,\n    .version-card.current-version .version-date {\n      color: var(--text-main);\n    }\n\n    .version-card.latest-version {\n      background: var(--latest-gradient);\n      background-size: 300% 300%;\n      box-shadow: var(--glow-shadow), var(--shadow);\n      color: #fff;\n      z-index: 2;\n      animation: gradientAnimation 6s ease infinite, breathe 3s ease-in-out infinite;\n      position: relative;\n      overflow: hidden;\n    }\n\n    .version-card.latest-version::before {\n      content: '';\n      position: absolute;\n      top: -50%;\n      left: -50%;\n      width: 200%;\n      height: 200%;\n      background: linear-gradient(\n        90deg,\n        transparent,\n        rgba(255, 255, 255, 0.3),\n        transparent\n      );\n      transform: rotate(45deg);\n      animation: shimmer 3s infinite;\n    }\n\n    .version-card.latest-version h3,\n    .version-card.latest-version .version-number,\n    .version-card.latest-version .version-date {\n      color: #fff;\n      text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\n      position: relative;\n      z-index: 1;\n    }\n\n    .version-status {\n      position: absolute;\n      top: 6px;\n      right: 6px;\n      padding: 3px 7px;\n      font-size: 0.65rem;\n      font-weight: 600;\n      border-radius: 6px;\n      color: #fff;\n      line-height: 1.2;\n      white-space: nowrap;\n      z-index: 2;\n    }\n\n    .version-card.latest-version .version-status {\n      background: rgba(255, 255, 255, 0.25);\n      backdrop-filter: blur(5px);\n      border: 1px solid rgba(255, 255, 255, 0.3);\n      color: #fff;\n      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n    }\n\n    .status-outdated { background: var(--warning-color); }\n    .status-latest { background: var(--success-color); }\n    .status-invalid { background: var(--error-color); }\n\n    .version-card h3 {\n      font-size: 0.9rem;\n      color: var(--text-secondary);\n      margin-bottom: 8px;\n      font-weight: 500;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 6px;\n    }\n\n    .version-number {\n      font-size: 1.25rem;\n      font-weight: 700;\n      color: var(--text-main);\n      margin: 8px 0;\n      transition: all 0.3s ease;\n      font-family: 'Courier New', monospace;\n    }\n\n    .version-card.latest-version .version-number {\n      font-size: 1.4rem;\n      transform: scale(1.05);\n      text-shadow: \n        0 2px 4px rgba(0, 0, 0, 0.3),\n        0 0 10px rgba(212, 175, 55, 0.8),\n        0 0 20px rgba(212, 175, 55, 0.5);\n      animation: pulse-glow 2s ease-in-out infinite;\n    }\n\n    @keyframes pulse-glow {\n      0%, 100% {\n        text-shadow: \n          0 2px 4px rgba(0, 0, 0, 0.3),\n          0 0 10px rgba(212, 175, 55, 0.8),\n          0 0 20px rgba(212, 175, 55, 0.5);\n      }\n      50% {\n        text-shadow: \n          0 2px 4px rgba(0, 0, 0, 0.3),\n          0 0 15px rgba(212, 175, 55, 1),\n          0 0 30px rgba(212, 175, 55, 0.7);\n      }\n    }\n\n    .version-date {\n      font-size: 0.8rem;\n      color: var(--text-secondary);\n      margin-top: 4px;\n    }\n\n    \/* \u7248\u672c\u5bf9\u6bd4\u6307\u793a\u5668 *\/\n    .version-indicator {\n      position: absolute;\n      left: 50%;\n      top: 50%;\n      transform: translate(-50%, -50%);\n      z-index: 5;\n      width: 32px;\n      height: 32px;\n      border-radius: 50%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n      color: white;\n    }\n\n    .version-indicator.update-needed {\n      background: var(--error-color);\n      box-shadow: 0 2px 8px rgba(234, 84, 85, 0.4);\n      animation: pulse-indicator 1.5s infinite;\n    }\n\n    .version-indicator.is-latest {\n      background: var(--success-color);\n      box-shadow: 0 2px 8px rgba(40, 199, 111, 0.4);\n    }\n\n    @keyframes pulse-indicator {\n      0% { transform: translate(-50%, -50%) scale(1); }\n      50% { transform: translate(-50%, -50%) scale(1.1); }\n      100% { transform: translate(-50%, -50%) scale(1); }\n    }\n\n    \/* \u5185\u5bb9\u533a *\/\n    .content-container {\n      padding: 16px;\n    }\n\n    \/* \u72b6\u6001\u63d0\u793a *\/\n    .status-alert {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      padding: 12px 16px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 10px;\n      font-weight: 500;\n      font-size: 14px;\n      animation: slideIn 0.5s ease 0.3s backwards;\n    }\n\n    .status-alert i {\n      font-size: 20px;\n    }\n\n    .status-alert.update-available {\n      background: linear-gradient(135deg, #ffeaa7 0%, #fdcb6e 100%);\n      color: #d63031;\n      box-shadow: 0 4px 15px rgba(253, 203, 110, 0.4);\n    }\n\n    .status-alert.up-to-date {\n      background: linear-gradient(135deg, #55efc4 0%, #00b894 100%);\n      color: white;\n      box-shadow: 0 4px 15px rgba(0, 184, 148, 0.4);\n    }\n\n    \/* \u66f4\u65b0\u5bb9\u5668 *\/\n    .update-container {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      animation: slideIn 0.5s ease 0.4s backwards;\n    }\n\n    .update-header {\n      background: var(--light-bg);\n      padding: 12px 16px;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      border-bottom: 1px solid var(--border-color);\n    }\n\n    .update-header h2 {\n      font-size: 1rem;\n      font-weight: 600;\n      color: var(--text-main);\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .update-header h2 i {\n      color: #4e6ef2;\n    }\n\n    .update-tag {\n      background: rgba(78, 110, 242, 0.1);\n      color: #4e6ef2;\n      padding: 4px 8px;\n      border-radius: 8px;\n      font-size: 0.75rem;\n      font-weight: 600;\n    }\n\n    .update-content {\n      padding: 16px;\n    }\n\n    .update-date {\n      font-weight: 600;\n      color: #4e6ef2;\n      margin-bottom: 12px;\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      padding: 8px 0;\n      border-bottom: 1px dashed #e0e0e0;\n    }\n\n    .update-text {\n      margin: 8px 0;\n      position: relative;\n      padding-left: 16px;\n      line-height: 1.5;\n      color: var(--text-main);\n      font-size: 0.95rem;\n      white-space: pre-wrap;\n      word-break: break-word;\n    }\n\n    .update-text::before {\n      content: '\u2022';\n      position: absolute;\n      left: 0;\n      font-weight: bold;\n      color: #4e6ef2;\n      font-size: 1.2rem;\n      line-height: 1;\n    }\n\n    \/* \u5386\u53f2\u65e5\u5fd7 *\/\n    .history-container {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      animation: slideIn 0.5s ease 0.5s backwards;\n    }\n\n    .history-header {\n      background: var(--light-bg);\n      padding: 12px 16px;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      border-bottom: 1px solid var(--border-color);\n      cursor: pointer;\n      user-select: none;\n    }\n\n    .history-header:hover {\n      opacity: 0.8;\n    }\n\n    .history-header h2 {\n      font-size: 1rem;\n      font-weight: 600;\n      color: var(--text-main);\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .history-header h2 i {\n      color: #4e6ef2;\n    }\n\n    .toggle-history {\n      background: none;\n      border: none;\n      color: var(--text-secondary);\n      cursor: pointer;\n      font-weight: 500;\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      font-size: 0.85rem;\n      transition: color 0.2s ease;\n    }\n\n    .toggle-history:hover {\n      color: #4e6ef2;\n    }\n\n    .history-content {\n      padding: 0 16px;\n      max-height: 0;\n      overflow: hidden;\n      transition: max-height 0.4s ease, padding 0.4s ease;\n    }\n\n    .history-content.expanded {\n      max-height: 60vh;\n      overflow-y: auto;\n      padding: 16px;\n      scrollbar-width: thin;\n      scrollbar-color: #4e6ef2 #f0f0f0;\n    }\n\n    .history-content.expanded::-webkit-scrollbar {\n      width: 6px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-track {\n      background: #f0f0f0;\n      border-radius: 4px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-thumb {\n      background: #4e6ef2;\n      border-radius: 4px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-thumb:hover {\n      background: #3a56d0;\n    }\n\n    .history-item {\n      margin-bottom: 16px;\n      padding-bottom: 16px;\n      border-bottom: 1px dashed var(--border-color);\n    }\n\n    .history-item:last-child {\n      border-bottom: none;\n      margin-bottom: 0;\n      padding-bottom: 0;\n    }\n\n    .history-date {\n      font-weight: 600;\n      color: var(--text-main);\n      margin-bottom: 8px;\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      font-size: 0.9rem;\n      background: rgba(78, 110, 242, 0.05);\n      padding: 6px 10px;\n      border-radius: 6px;\n    }\n\n    .history-text {\n      margin: 8px 0;\n      padding-left: 16px;\n      line-height: 1.4;\n      color: var(--text-secondary);\n      position: relative;\n      font-size: 0.9rem;\n      white-space: pre-wrap;\n      word-break: break-word;\n    }\n\n    .history-text::before {\n      content: '\u2022';\n      position: absolute;\n      left: 0;\n      color: #4e6ef2;\n      font-weight: bold;\n      font-size: 1.2rem;\n      line-height: 1;\n    }\n\n    \/* \u6309\u94ae\u7ec4 *\/\n    .button-group {\n      display: flex;\n      flex-direction: column;\n      gap: 10px;\n      margin-bottom: 16px;\n    }\n\n    .button {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 10px;\n      padding: 14px 28px;\n      text-align: center;\n      font-size: 1rem;\n      border: none;\n      border-radius: 12px;\n      text-decoration: none;\n      background: var(--primary-gradient);\n      color: white;\n      font-weight: 600;\n      transition: all 0.3s ease;\n      box-shadow: var(--shadow);\n      position: relative;\n      overflow: hidden;\n      cursor: pointer;\n    }\n\n    .button i {\n      font-size: 1rem;\n    }\n\n    .button::after {\n      content: '';\n      position: absolute;\n      top: -50%;\n      left: -50%;\n      width: 200%;\n      height: 200%;\n      background: rgba(255, 255, 255, 0.1);\n      transform: rotate(30deg);\n      transition: all 0.6s ease;\n      pointer-events: none;\n    }\n\n    .button:hover {\n      transform: translateY(-3px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .button:hover::after {\n      transform: rotate(30deg) translate(20%, 20%);\n    }\n\n    .button:active {\n      transform: scale(0.95);\n    }\n\n    \/* \u9519\u8bef\u72b6\u6001 *\/\n    .error-state {\n      text-align: center;\n      padding: 40px 20px;\n      color: var(--text-main);\n    }\n\n    .error-icon {\n      font-size: 64px;\n      margin-bottom: 20px;\n      color: var(--error-color);\n    }\n\n    .error-text {\n      font-size: 16px;\n      line-height: 1.6;\n      margin-bottom: 20px;\n    }\n\n    .retry-button {\n      background: var(--primary-gradient);\n      color: white;\n      padding: 12px 30px;\n      border-radius: 12px;\n      border: none;\n      font-weight: 600;\n      cursor: pointer;\n      transition: all 0.3s ease;\n      font-size: 14px;\n      box-shadow: var(--shadow);\n    }\n\n    .retry-button:hover {\n      transform: translateY(-2px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .retry-button:active {\n      transform: scale(0.95);\n    }\n\n    \/* \u88c5\u9970\u5143\u7d20 *\/\n    .decoration {\n      position: absolute;\n      z-index: 0;\n      pointer-events: none;\n    }\n\n    .decoration.circle {\n      width: 120px;\n      height: 120px;\n      border-radius: 50%;\n      background: rgba(107, 45, 216, 0.05);\n      top: 10%;\n      left: 10%;\n    }\n\n    .decoration.square {\n      width: 80px;\n      height: 80px;\n      transform: rotate(45deg);\n      background: rgba(78, 110, 242, 0.05);\n      bottom: 10%;\n      right: 10%;\n    }\n\n    \/* \u54cd\u5e94\u5f0f *\/\n    @media (max-width: 768px) {\n      body {\n        padding: 12px;\n      }\n\n      .container {\n        max-width: 100%;\n        border-radius: 20px;\n      }\n\n      .header {\n        padding: 20px 15px;\n      }\n\n      .header h1 {\n        font-size: 1.3rem;\n      }\n\n      .header-icon {\n        font-size: 40px;\n      }\n\n      .version-comparison {\n        flex-direction: row;\n        flex-wrap: nowrap;\n        gap: 10px;\n        padding: 12px;\n        margin-top: 6px;\n        overflow-x: auto;\n      }\n\n      .version-card {\n        min-width: 45%;\n        padding: 26px 12px 12px;\n      }\n\n      \/* \u79fb\u52a8\u7aef\u51cf\u5f31\u547c\u5438\u52a8\u6548 *\/\n      .version-card.latest-version {\n        animation: gradientAnimation 6s ease infinite;\n      }\n\n      .version-status {\n        top: 5px;\n        right: 5px;\n        padding: 2px 5px;\n        font-size: 0.6rem;\n      }\n\n      .version-number {\n        font-size: 1.1rem;\n      }\n\n      .version-card.latest-version .version-number {\n        font-size: 1.2rem;\n      }\n\n      .update-header h2, .history-header h2 {\n        font-size: 0.9rem;\n      }\n\n      .button {\n        padding: 12px 24px;\n        font-size: 0.95rem;\n      }\n\n      .history-content.expanded {\n        max-height: 50vh;\n        -webkit-overflow-scrolling: touch;\n      }\n    }\n\n    @media (max-width: 380px) {\n      .header h1 {\n        font-size: 1.2rem;\n      }\n\n      .version-number {\n        font-size: 1rem;\n      }\n\n      .version-card.latest-version .version-number {\n        font-size: 1.1rem;\n      }\n\n      .button {\n        padding: 11px;\n        font-size: 0.9rem;\n      }\n    }\n  <\/style>\n<\/head>\n<body>\n  <div class=\"decoration circle\"><\/div>\n  <div class=\"decoration square\"><\/div>\n\n  <div id=\"loading\" class=\"loading-wrapper\">\n    <div class=\"loading-spinner\"><\/div>\n    <div class=\"loading-text\"><i class=\"fas fa-search\"><\/i> \u6b63\u5728\u68c0\u67e5\u66f4\u65b0...<\/div>\n  <\/div>\n\n  <div class=\"container\" id=\"container\">\n    <div class=\"header\">\n      <div class=\"header-icon\"><i class=\"fas fa-book\"><\/i><\/div>\n      <h1>\u5927\u7070\u72fc\u4e66\u6e90\u66f4\u65b0<\/h1>\n      <p>\u63a8\u8350\u4f7f\u7528\u9605\u8bfb\u6d4b\u8bd5\u7248<br>\u6b63\u5f0f\u7248\u53ef\u80fd\u5b58\u5728\u517c\u5bb9\u6027\u95ee\u9898<\/p>\n    <\/div>\n\n    <div class=\"version-comparison\">\n      <div class=\"version-card current-version\">\n        <div class=\"version-status status-outdated\" id=\"currentStatus\">\u5f85\u68c0\u67e5<\/div>\n        <h3><i class=\"fas fa-cube\"><\/i> \u5f53\u524d\u7248\u672c<\/h3>\n        <div class=\"version-number\" id=\"currentVersion\">-<\/div>\n        <div class=\"version-date\">\u60a8\u7684\u5f53\u524d\u7248\u672c<\/div>\n      <\/div>\n\n      <div class=\"version-indicator update-needed\" id=\"versionIndicator\" style=\"display: none;\">\n        <i class=\"fas fa-arrow-right\"><\/i>\n      <\/div>\n\n      <div class=\"version-card latest-version\">\n        <div class=\"version-status status-latest\" id=\"latestStatus\">\u6700\u65b0\u7248\u672c<\/div>\n        <h3><i class=\"fas fa-star\"><\/i> \u6700\u65b0\u7248\u672c<\/h3>\n        <div class=\"version-number\" id=\"latestVersion\">-<\/div>\n        <div class=\"version-date\">\u53ef\u7528\u6700\u65b0\u7248\u672c<\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"content-container\">\n      <div class=\"status-alert\" id=\"statusAlert\" style=\"display: none;\"><\/div>\n\n      <div id=\"latestLogContainer\" style=\"display: none;\">\n        <div class=\"update-container\">\n          <div class=\"update-header\">\n            <h2><i class=\"fas fa-bolt\"><\/i> \u6700\u65b0\u66f4\u65b0<\/h2>\n            <div class=\"update-tag\">\u6700\u65b0\u53d1\u5e03<\/div>\n          <\/div>\n          <div class=\"update-content\">\n            <div class=\"update-date\" id=\"latestLogDate\"><\/div>\n            <div class=\"update-text\" id=\"latestLogContent\"><\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"button-group\" id=\"buttonGroup\" style=\"display: none;\"><\/div>\n\n      <div class=\"history-container\" id=\"logs\" style=\"display: none;\">\n        <div class=\"history-header\" onclick=\"toggleLogs()\">\n          <h2><i class=\"fas fa-history\"><\/i> \u5386\u53f2\u66f4\u65b0 <span id=\"historyCount\"><\/span><\/h2>\n          <button class=\"toggle-history\" id=\"toggleButton\">\n            <span id=\"toggleText\">\u5c55\u5f00\u5386\u53f2<\/span>\n            <i class=\"fas fa-chevron-down\" id=\"toggleIcon\"><\/i>\n          <\/button>\n        <\/div>\n        <div class=\"history-content\" id=\"logList\"><\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <script>\n  let logsCollapsed = true;\n\n  function toggleLogs() {\n    logsCollapsed = !logsCollapsed;\n    const logList = document.getElementById('logList');\n    const toggleText = document.getElementById('toggleText');\n    const toggleIcon = document.getElementById('toggleIcon');\n    \n    if (logsCollapsed) {\n      logList.classList.remove('expanded');\n      toggleText.textContent = '\u5c55\u5f00\u5386\u53f2';\n      toggleIcon.className = 'fas fa-chevron-down';\n    } else {\n      logList.classList.add('expanded');\n      toggleText.textContent = '\u6536\u8d77\u5386\u53f2';\n      toggleIcon.className = 'fas fa-chevron-up';\n    }\n  }\n\n  (async function() {\n    const loading = document.getElementById('loading');\n    const container = document.getElementById('container');\n    const currentVersion = document.getElementById('currentVersion');\n    const latestVersion = document.getElementById('latestVersion');\n    const currentStatus = document.getElementById('currentStatus');\n    const latestStatus = document.getElementById('latestStatus');\n    const versionIndicator = document.getElementById('versionIndicator');\n    const statusAlert = document.getElementById('statusAlert');\n    const buttonGroup = document.getElementById('buttonGroup');\n    const latestLogContainer = document.getElementById('latestLogContainer');\n    const latestLogDate = document.getElementById('latestLogDate');\n    const latestLogContent = document.getElementById('latestLogContent');\n    const logsContainer = document.getElementById('logs');\n    const logList = document.getElementById('logList');\n    const historyCount = document.getElementById('historyCount');\n\n    const localVer = '${String(localVersion)}';\n\n    \/\/ \u7edf\u4e00\u7684\u670d\u52a1\u5668\u914d\u7f6e - \u65b9\u4fbf\u7ef4\u62a4\n    const serverConfig = {\n      main: {\n        name: '\u4e3b\u7ebf\u8def',\n        icon: 'rocket',\n        baseUrl: 'https:\/\/sy.dashabi.tk',\n        downloadPath: '\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup1: {\n        name: '\u5907\u7528\u7ebf\u8def1',\n        icon: 'box',\n        baseUrl: 'https:\/\/api.langge.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup2: {\n        name: '\u5907\u7528\u7ebf\u8def2',\n        icon: 'satellite',\n        baseUrl: 'https:\/\/20.langge.tk',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup3: {\n        name: '\u5907\u7528\u7ebf\u8def3',\n        icon: 'link',\n        baseUrl: 'http:\/\/219.154.201.122:5006',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup4: {\n        name: '\u5907\u7528\u7ebf\u8def4',\n        icon: 'bolt',\n        baseUrl: 'https:\/\/v2.czyl.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup5: {\n        name: '\u5907\u7528\u7ebf\u8def5',\n        icon: 'globe',\n        baseUrl: 'https:\/\/v10.czyl.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup6: {\n        name: '\u5907\u7528\u7ebf\u8def6',\n        icon: 'broadcast-tower',\n        baseUrl: 'https:\/\/v4.czyl.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      }\n    };\n\n    \/\/ \u7248\u672c\u6bd4\u8f83\u51fd\u6570\n    function compareVersions(vs) {\n      const normalize = (v) => {\n        return v.split('.').map(n => {\n          const num = parseInt(n, 10);\n          return isNaN(num) ? 0 : num;\n        });\n      };\n\n      const parts1 = normalize(localVer);\n      const parts2 = normalize(vs);\n      const maxLength = Math.max(parts1.length, parts2.length);\n      \n      for (let i = 0; i < maxLength; i++) {\n        const num1 = parts1[i] || 0;\n        const num2 = parts2[i] || 0;\n        if (num1 > num2) return 1;\n        if (num1 < num2) return -1;\n      }\n      return 0;\n    }\n\n    async function fetchVersionData() {\n      \/\/ \u4f7f\u7528\u7edf\u4e00\u914d\u7f6e\u4e2d\u9664\u4e3b\u7ebf\u8def\u5916\u7684\u5907\u7528\u7ebf\u8def\u8fdb\u884c\u7248\u672c\u68c0\u67e5\n      const serversToCheck = Object.values(serverConfig).filter(s => s.baseUrl.includes('czyl.cf') || s.baseUrl.includes('219.154'));\n      \n      for (const server of serversToCheck) {\n        try {\n          const response = await fetch(server.baseUrl + '\/version', { timeout: 2000 });\n          if (response.ok) {\n            return await response.json();\n          }\n        } catch (e) {\n          console.warn(\\`\u63a5\u53e3\u5931\u8d25\uff1a\\${server.baseUrl}\\`, e);\n        }\n      }\n      throw new Error('\u6240\u6709\u66f4\u65b0\u63a5\u53e3\u90fd\u8bf7\u6c42\u5931\u8d25');\n    }\n\n    function showError(message) {\n      loading.innerHTML = \\`\n        <div class=\"error-state\">\n          <div class=\"error-icon\"><i class=\"fas fa-exclamation-triangle\"><\/i><\/div>\n          <div class=\"error-text\">\\${message}<\/div>\n          <button class=\"retry-button\" onclick=\"location.reload()\"><i class=\"fas fa-redo\"><\/i> \u91cd\u8bd5<\/button>\n        <\/div>\n      \\`;\n    }\n\n    try {\n      const data = await fetchVersionData();\n      const cloudVersion = String(data.version3);\n      const updateLog = data.update_log || {};\n\n      \/\/ \u663e\u793a\u7248\u672c\u4fe1\u606f\n      currentVersion.textContent = \\`v\\${localVer}\\`;\n      latestVersion.textContent = \\`v\\${cloudVersion}\\`;\n\n      \/\/ \u5904\u7406\u65e5\u5fd7\n      const logEntries = Object.entries(updateLog);\n      if (logEntries.length > 0) {\n        \/\/ \u663e\u793a\u6700\u65b0\u65e5\u5fd7\n        const [latestDate, latestContent] = logEntries[0];\n        latestLogDate.innerHTML = \\`<i class=\"fas fa-calendar-alt\"><\/i> \\${latestDate}\\`;\n        latestLogContent.textContent = latestContent;\n        latestLogContainer.style.display = 'block';\n\n        \/\/ \u663e\u793a\u5386\u53f2\u65e5\u5fd7\n        if (logEntries.length > 1) {\n          const historyLogs = logEntries.slice(1);\n          historyCount.textContent = \\`(\\${historyLogs.length}\u6761)\\`;\n          logList.innerHTML = historyLogs.map(([date, content]) => \\`\n            <div class=\"history-item\">\n              <div class=\"history-date\">\n                <i class=\"fas fa-calendar-day\"><\/i>\n                <span>\\${date}<\/span>\n              <\/div>\n              <div class=\"history-text\">\\${content}<\/div>\n            <\/div>\n          \\`).join('');\n          logsContainer.style.display = 'block';\n        }\n      }\n\n      \/\/ \u68c0\u67e5\u66f4\u65b0\u72b6\u6001\n      const compareResult = compareVersions(cloudVersion);\n      \n      \/\/ \u663e\u793a\u7248\u672c\u6307\u793a\u5668\n      versionIndicator.style.display = 'flex';\n      \n      if (compareResult === -1) {\n        \/\/ \u9700\u8981\u66f4\u65b0\n        currentStatus.textContent = '\u5f85\u66f4\u65b0';\n        currentStatus.className = 'version-status status-outdated';\n        versionIndicator.className = 'version-indicator update-needed';\n        versionIndicator.innerHTML = '<i class=\"fas fa-arrow-right\"><\/i>';\n\n        \/\/ \u4f7f\u7528\u7edf\u4e00\u914d\u7f6e\u751f\u6210\u4e0b\u8f7d\u6309\u94ae\n        buttonGroup.innerHTML = Object.values(serverConfig).map(server => {\n          const fullUrl = server.baseUrl + server.downloadPath;\n          return \\`\n            <a href=\"yuedu:\/\/booksource\/importonline?src=\\${encodeURIComponent(fullUrl)}\" class=\"button\">\n              <i class=\"fas fa-\\${server.icon}\"><\/i>\n              <span>\\${server.name}<\/span>\n            <\/a>\n          \\`;\n        }).join('');\n        buttonGroup.style.display = 'flex';\n      } else {\n        \/\/ \u5df2\u662f\u6700\u65b0\u7248\u672c\n        currentStatus.textContent = '\u6700\u65b0';\n        currentStatus.className = 'version-status status-latest';\n        versionIndicator.className = 'version-indicator is-latest';\n        versionIndicator.innerHTML = '<i class=\"fas fa-check\"><\/i>';\n        \n        statusAlert.className = 'status-alert up-to-date';\n        statusAlert.innerHTML = '<i class=\"fas fa-check-circle\"><\/i> <div>\u60a8\u5df2\u662f\u6700\u65b0\u7248\u672c<\/div>';\n        statusAlert.style.display = 'flex';\n      }\n\n      \/\/ \u663e\u793a\u4e3b\u5bb9\u5668\uff0c\u9690\u85cf\u52a0\u8f7d\n      loading.style.display = 'none';\n      container.style.display = 'block';\n\n    } catch (err) {\n      console.error('\u7248\u672c\u68c0\u67e5\u5931\u8d25\uff1a', err);\n      showError('<i class=\"fas fa-exclamation-circle\"><\/i> \u68c0\u67e5\u66f4\u65b0\u5931\u8d25\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5<br><small>' + err.message + '<\/small>');\n    }\n  })();\n  <\/script>\n<\/body>\n<\/html>\n`;\n    java.startBrowser(`data:text\/html;base64,${java.base64Encode(html)}`, '\u5927\u7070\u72fc\u4e66\u6e90\u66f4\u65b0');\n}","respondTime":180000,"ruleBookInfo":{"author":"$.author","canReName":"1","coverUrl":"$.thumb_url","init":"<js>\nif (String(baseUrl).startsWith(\"data:\")) {\n    let res = JSON.parse(java.hexDecodeToString(result));\n    let book_id = res.book_id;\n    let tab = res.tab;\n    let sources = res.sources;\n    let url = res.url;\n    let html = \"\";\n    let proxy = getArguments(source.getVariable(), \"proxy\");\n    if (url != \"\" && proxy == \"\u672c\u5730\") {\n        if (sources == '69\u4e66\u5427') {\n            let ck69 = String(cookie.getCookie(url));\n            let headers = {\n                \"Cookie\": ck69\n            };\n            let op = JSON.stringify({\n                \"headers\": headers\n            });\n            html = java.ajax(url + ',' + op);\n        } else {\n            html = java.ajax(url);\n        }\n        \/\/java.log(html);\n        if (html.includes(\"Just a moment...\") && sources == '69\u4e66\u5427') {\n            cookie.removeCookie(url);\n            var x = `https:\/\/www.69shuba.com`;\n            java.longToast('\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1');\n            var s = java.startBrowserAwait(x, \"\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1\").body();\n\n            let ck69 = String(cookie.getCookie(url));\n            let headers = {\n                \"Cookie\": ck69\n            };\n            let op = JSON.stringify({\n                \"headers\": headers\n            });\n            java.log(op);\n            html = java.ajax(url + ',' + op);\n            \/\/java.log(html);\n        }\n    }\n    let base_url = getArguments(source.getVariable(), \"server\");\n    let op = {\n        method: \"POST\",\n        body: {\n            html: html\n        }\n    };\n    op = JSON.stringify(op);\n    let varia = String(book.getVariable('custom'));\n    if (varia == 'null') {\n        varia = '';\n    }\n    varia = JSON.stringify({\n        'custom': varia\n    });\n    \/\/varia = java.base64Encode(varia);\n    java.log(`${base_url}\/detail?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\n    result = java.ajax(`${base_url}\/detail?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\n}\nresult\n<\/js>$.data","intro":"<js>\nlet {\n    book_id,\n    source: sources,\n    tab,\n    book_tts,\n    tags,\n    role,\n    last_chapter_title,\n    last_chapter_update_time,\n    word_number,\n    status,\n    score,\n    abstract,\n    copyright_info\n} = result;\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (proxy == \"\u672c\u5730\") {\n    proxy = \"\u672c\u5730\u7f51\u7edc\";\n} else {\n    proxy = \"\u670d\u52a1\u5668\u7f51\u7edc\";\n}\njava.put(\"book_detail\", JSON.stringify(result));\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet key = \"\";\ntry {\n    let cookieValue =\n        String(cookie.getCookie(base_url)) || String(java.getCookie(base_url));\n    key = getKey(cookieValue);\n} catch (e) {\n    key = \"\";\n}\n\nif (key == \"\") {\n    java.log(\"\u5f53\u524d\u670d\u52a1\u5668\u672a\u67e5\u8be2\u5230\u767b\u5f55\u72b6\u6001\uff0c\u5c1d\u8bd5\u67e5\u8be2\u5176\u4ed6\u670d\u52a1\u5668\u767b\u5f55\u72b6\u6001...\");\n    let cookieValue;\n    for (let h of host) {\n        try {\n            cookieValue = String(cookie.getCookie(h)) || String(java.getCookie(h));\n            key = getKey(cookieValue);\n        } catch (e) {\n            key = \"\";\n        }\n        if (key) {\n            java.log(`\u5df2\u5728${h}\u767b\u5f55\uff0c\u9000\u51fa\u67e5\u8be2\uff0c\u6b63\u5728\u8f6c\u79fb\u767b\u5f55\u72b6\u6001\u5230\u5f53\u524d\u670d\u52a1${base_url}`);\n            \/\/java.log(cookieValue)\n            removeCookie(h);\n            removeCookie(base_url);\n            cookie.setCookie(base_url, cookieValue);\n            break;\n        }\n    }\n}\n\nif (book.readConfig == null || book.readConfig.useReplaceRule == null) {\n    book.setUseReplaceRule(false);\n}\n\nlet nickname = '\u8d26\u53f7\u72b6\u6001\uff1a\u26a0\ufe0f \u672a\u767b\u5f55 | \u70b9\u51fb\u53f3\u4e0a\u89d2 \ud83d\udd16 \u767b\u5f55';\ntry {\n    let opcx = {\n        method: \"GET\",\n        headers: {\n            cookie: 'qttoken=' + key + ';'\n        },\n    };\n    opcx = JSON.stringify(opcx);\n    let user_info = JSON.parse(java.ajax(base_url + '\/get_avatar,' + opcx));\n    if (user_info.code == 0) {\n        if (user_info.nickname) {\n            nickname = '\u6b22\u8fce\u56de\u6765\uff1a' + user_info.nickname\n        } else {\n            nickname = '\u6b22\u8fce\u56de\u6765\uff1a' + user_info.email + \"(\u8bf7\u524d\u5f80\u7528\u6237\u540e\u53f0\u8bbe\u7f6e\u7528\u6237\u540d)\"\n        }\n    }\n} catch (e) {\n    if (key) {\n        nickname = '\u8d26\u53f7\u72b6\u6001\uff1a\u5df2\u767b\u5f55'\n    }\n};\n\nlet loginStatus = nickname;\n\nlet lightDivider = \"\u2747\ufe0f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2747\ufe0f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2747\ufe0f\";\nlet heavyDivider = \"&lrm;\\n&lrm;\";\n\nlet isValid = (value) => String(value).length > 1;\nlet ctitle = book.durChapterTitle || '\u672a\u5f00\u59cb';\nlet info = `\n    \ud83d\udce1 \u5f53\u524d\u670d\u52a1\uff1a${base_url}\n    \ud83d\udd11 ${loginStatus}\n    \ud83c\udff7 \u6570\u636e\u6765\u6e90\uff1a${sources}\n    \ud83d\udd04 \u5f53\u524d\u6a21\u5f0f\uff1a${tab}\n    \u2699\ufe0f \u8bbf\u95ee\u6a21\u5f0f\uff1a${proxy}\n    \ud83d\udcd6 \u9605\u8bfb\u81f3\uff1a${ctitle}\n`;\n\nif (tab == \"\u542c\u4e66\") {\n    let toneId = getArguments(source.getVariable(), \"tone_id\");\n    if (isValid(book_tts)) {\n        info += `${lightDivider}\n    \ud83c\udfb5 \u97f3\u8272\u914d\u7f6e\uff1a${toneId}\n    ${book_tts}\n`;\n    }\n}\n\nlet basicInfo = \"\";\nlet addBasicInfo = (value, prefix, icon) => {\n    if (isValid(value)) basicInfo += `    ${icon} ${prefix} ${value}\\n`;\n};\n\naddBasicInfo(tags, \"\u4e66\u7c4d\u5206\u7c7b\uff1a\", \"\ud83c\udf08\");\naddBasicInfo(role, \"\u4e66\u7c4d\u4e3b\u89d2\uff1a\", \"\ud83d\udc51\");\naddBasicInfo(last_chapter_title, \"\u6700\u65b0\u7ae0\u8282\uff1a\", \"\ud83d\udcda\");\naddBasicInfo(last_chapter_update_time, \"\u66f4\u65b0\u65f6\u95f4\uff1a\", \"\u23f3\");\naddBasicInfo(word_number, \"\u4e66\u7c4d\u5b57\u6570\uff1a\", \"\ud83d\udcca\");\naddBasicInfo(status, \"\u4e66\u7c4d\u72b6\u6001\uff1a\", \"\ud83d\udea9\");\naddBasicInfo(score, \"\u4e66\u7c4d\u8bc4\u5206\uff1a\", \"\u2b50\");\n\nif (basicInfo) info += `${lightDivider}\\n${basicInfo}`;\n\nif (isValid(abstract)) {\n    let indentedAbstract = abstract\n        .split(\"\\n\")\n        .map((line) => `    ${line}`)\n        .join(\"\\n\");\n    info += `${heavyDivider}\n    \ud83d\udcd6 \u4e66\u7c4d\u7b80\u4ecb\uff1a\n${indentedAbstract}\n`;\n} else {\n    info += `${heavyDivider}`;\n}\n\nif (isValid(copyright_info)) {\n    info += `${lightDivider}\n    \u00a9 ${copyright_info}\n`;\n} else {\n    info += `${lightDivider}`;\n}\n\ninfo += `\n${heavyDivider}\n    \ud83d\udca0\ud83d\udca0\ud83d\udca0 \u6570\u636e\u66f4\u65b0\u4e8e ${new Date().toLocaleString()} \ud83d\udca0\ud83d\udca0\ud83d\udca0\n`;\nlet jjinfo = getArguments(source.getVariable(), \"info\");\n\nif (jjinfo != \"on\") {\n    info = String(info)\n        .split(\"\\n\")\n        .map((line) => line.replace(\/^ {4}\/, \"\"))\n        .join(\"\\n\");\n} else {\n    basicInfo = \"\";\n    addBasicInfo(last_chapter_title, \"\u6700\u65b0\u7ae0\u8282\uff1a\", \"\ud83d\udcda\");\n    addBasicInfo(last_chapter_update_time, \"\u66f4\u65b0\u65f6\u95f4\uff1a\", \"\u23f3\");\n    addBasicInfo(word_number, \"\u4e66\u7c4d\u5b57\u6570\uff1a\", \"\ud83d\udcca\");\n    addBasicInfo(status, \"\u4e66\u7c4d\u72b6\u6001\uff1a\", \"\ud83d\udea9\");\n    addBasicInfo(score, \"\u4e66\u7c4d\u8bc4\u5206\uff1a\", \"\u2b50\");\n    if (isValid(abstract)) {\n        let indentedAbstract = abstract\n            .split(\"\\n\")\n            .map((line) => `    ${line}`)\n            .join(\"\\n\");\n        basicInfo += `\n    \\n&lrm;\n    \ud83d\udcd6 \u4e66\u7c4d\u7b80\u4ecb\uff1a\n${indentedAbstract}\n`;\n    } else {\n        basicInfo += `${heavyDivider}`;\n    }\n    info = `&lrm;\\n\ud83c\udff7 \u6570\u636e\u6765\u6e90\uff1a${sources}\\n` + basicInfo;\n}\n<\/js>","lastChapter":"{{$.source}} {{$.last_chapter_title}} {{$.last_chapter_update_time}}","name":"$.book_name","tocUrl":"<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || \"\u5c0f\u8bf4\";\nlet url = result.toc_url || \"\";\nvar sdtoken;\ntry {\n    var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n    sdtoken = String(loginInfoMap['\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)'] || '');\n} catch (e) {\n    sdtoken = '';\n}\nvar rawCookie = getFanqieCookie() || sdtoken;\nvar match = rawCookie.match(\/sessionid=[^;]+\/);\nvar fqcookie = match ? match[0] : '';\nvar fqssionid = '';\nif (fqcookie) {\n    fqssionid = getSessionId(fqcookie);\n};\nsetArguments('fqssionid', fqssionid);\njava.put(\"tab\", tab);\njava.put(\"book_id\", book_id);\nlet qtcatalog = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url,\n};\nqtcatalog = java.base64Encode(JSON.stringify(qtcatalog));\n`data:;base64,${qtcatalog},{\"type\":\"qingtian2\"}`;\n<\/js>","wordCount":"$.word_number"},"ruleContent":{"content":"<js>\nresult = String(java.hexDecodeToString(result));\nlet res;\nif (result.match(\/\u5927\u7070\u72fc\u878d\u5408\/)) {\n    result = result.split(\"\u5927\u7070\u72fc\u878d\u54084\");\n    res = {\n        item_id: result[0],\n        tab: result[1],\n        title: result[2],\n        sources: result[3],\n        url: \"\"\n    };\n} else {\n    res = JSON.parse(result);\n}\nlet varia = String(book.getVariable('custom'));\nif (varia == 'null') {\n    varia = '';\n}\nvaria = JSON.stringify({\n    'custom': varia\n});\n\/\/  varia = java.base64Encode(varia);\nlet book_id = res.book_id;\nlet item_id = res.item_id;\nlet tab = res.tab;\nlet title = res.title;\nlet sources = res.sources;\nlet url = res.url;\nlet html = \"\";\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (url != \"\" && proxy == \"\u672c\u5730\") {\n    if (sources == '69\u4e66\u5427') {\n        let ck69 = String(cookie.getCookie(url));\n        let headers = {\n            \"Cookie\": ck69,\n            \"User-Agent\": \"Mozilla\/5.0 (Linux; Android 6.0; Nexus 5 Build\/MRA58N) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Mobile Safari\/537.36 Edg\/138.0.0.0\"\n        };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        java.log(url);\n        java.log(op);\n        html = java.ajax(url + ',' + op);\n    } else {\n        html = java.ajax(url);\n    }\n    java.log(html);\n    if (html.includes(\"Just a moment...\") && sources == '69\u4e66\u5427' && book.durChapterIndex === chapter.index) {\n        cookie.removeCookie(url);\n        var x = url;\n        java.longToast('\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1');\n        var s = java.startBrowserAwait(x, \"\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1\").body();\n\n        let ck69 = String(cookie.getCookie(url));\n        let headers = {\n            \"User-Agent\": \"Mozilla\/5.0 (Linux; Android 6.0; Nexus 5 Build\/MRA58N) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Mobile Safari\/537.36 Edg\/138.0.0.0\",\n            \"Cookie\": ck69\n        };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        java.log(op);\n        html = java.ajax(url + ',' + op);\n        \/\/java.log(html);\n    }\n};\nlet content = \"\";\nlet data;\nlet tone_id = getArguments(source.getVariable(), \"tone_id\");\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet device, device_type;\ntry {\n    device = java.deviceID();\n    device_type = \"\u82f9\u679c\";\n} catch (e) {\n    try {\n        device = java.androidId();\n        device_type = \"\u5b89\u5353\";\n    } catch (e) {\n        device = \"\";\n        device_type = \"\u5b89\u5353\";\n    }\n}\n\nlet qtcookie = cookie.getCookie(base_url);\ntry {\n    qtcookie = `qttoken=${String(cookie.getKey(base_url, \"qttoken\"))}; deviceId=${device};`\n} catch (e) {}\n\nvar params = {\n    html: html,\n    item_id: item_id,\n    source: sources,\n    tab: tab,\n    tone_id: tone_id,\n    variable: varia,\n    version: '4.11.5.1'\n};\n\nvar content_url = '\/content';\n\nif ((sources == \"\u756a\u8304\" || sources == \"\u4e03\u732b\" || sources == \"\u5854\u8bfb\") && getArguments(source.getVariable(), \"fqpara\") == \"on\" && tab == \"\u5c0f\u8bf4\") {\n    content_url = '\/content?review=1';\n}\n\n\/\/var signInfo = generateComplexSignature('POST', content_url, {}, APP_SECRET, params);\n\n\n\/\/var signedParams = copyObject(params);\n\/\/signedParams.timestamp = signInfo.timestamp;\n\/\/signedParams.nonce = signInfo.nonce;\n\/\/signedParams.sign = signInfo.sign;\n\n\nvar op = {\n    method: \"POST\",\n    body: JSON.stringify(params),\n    headers: {\n        cookie: qtcookie,\n        'Content-Type': 'application\/json'\n    }\n};\n\nop = JSON.stringify(op);\njava.log(op);\ndata = java.ajax(base_url + content_url + `,${op}`);\n\ntry {\n    data = JSON.parse(data);\n    if (data.msg) {\n        java.toast(data.msg);\n    }\n} catch (e) {}\n\ncontent = data.content\n\nif ((sources == \"\u756a\u8304\" || sources == \"\u4e03\u732b\" || sources == \"\u5854\u8bfb\") && getArguments(source.getVariable(), \"fqpara\") == \"on\" && tab == \"\u5c0f\u8bf4\") {\n    var fqssionid = getArguments(source.getVariable(), \"fqssionid\") || \"\";\n    content = content\n        .replace(\/ident=\"\/g, 'ident=\"' + base_url)\n        .replace(\/book_id=\/g, 'book_id=' + book_id + '&ssionid=' + fqssionid);\n    if (device_type == \"\u82f9\u679c\") {\n        content = paraForiOS(content, sources);\n    } else {\n        content = paraForAndroid(content, sources);\n    }\n\n\n}\ndata = JSON.stringify({\n    content: content,\n});\n\nif (device_type == \"\u5b89\u5353\" && (tab == \"\u77ed\u5267\" || tab == \"\u89c6\u9891\" || sources == '\u6bd2\u820c\u5f71\u89c6')) {\n    data = {\n        content: `\u3010\u53f3\u4e0a\u89d2\u5237\u65b0\u3011\u5f00\u542f\u64ad\u653e(\u4e0b\u4e00\u96c6\u8bf7\u5207\u6362\u4e0b\u4e00\u7ae0\u5237\u65b0)\\n\u64ad\u653e\u76f4\u94fe\uff1a\\n${content}`,\n    };\n    data = JSON.stringify(data);\n    if (book.durChapterIndex === chapter.index) {\n        let video_url = `${base_url}\/online_video?book_id=${book_id}&source=${sources}&tab=${tab}`;\n        if (sources == '\u6bd2\u820c\u5f71\u89c6') {\n            video_url = content;\n        };\n        java.startBrowser(video_url, title);\n        java.toast(\"\u6b63\u5728\u52a0\u8f7d\u89c6\u9891...\");\n    }\n\n}\ndata;\n<\/js>$.content","imageStyle":"TEXT"},"ruleExplore":{"author":"$.author","bookList":"$.data","bookUrl":"<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || '\u5c0f\u8bf4';\nlet url = result.toc_url || '';\n\nlet qtdetail = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url\n}\nqtdetail = java.base64Encode(JSON.stringify(qtdetail));\n`data:;base64,${qtdetail},{\"type\":\"qingtian\"}`\n<\/js>","coverUrl":"$.thumb_url","intro":"$.abstract","kind":"{{$.category}}\n{{$.score}}\n{{$.status}}\n{{$.source}}\n{{$.tags}}","lastChapter":"{{$.last_chapter_title}} \u2022 {{$.last_update_time}}","name":"$.book_name","wordCount":"$.word_number"},"ruleSearch":{"author":"$.author","bookList":"$.data","bookUrl":"<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || '\u5c0f\u8bf4';\nlet url = result.toc_url || '';\n\nlet qtdetail = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url\n}\nqtdetail = java.base64Encode(JSON.stringify(qtdetail));\n`data:;base64,${qtdetail},{\"type\":\"qingtian\"}`\n<\/js>","checkKeyWord":"\u6211\u768426\u5c81\u5973\u623f\u5ba2@\u756a\u8304","coverUrl":"$.thumb_url","intro":"$.abstract","kind":"{{$.status}},{{$.score}},{{$.tags}},{{$.last_chapter_update_time}}","lastChapter":"{{$.source}} {{$.last_chapter_title}}","name":"$.book_name##\uff08\u522b\u540d\uff1a.*?\uff09","wordCount":"$.word_number"},"ruleToc":{"chapterList":"<js>\nlet res = JSON.parse(java.hexDecodeToString(result));\nif (res.method) {\n    res = Object.fromEntries(\n        res.body\n        .replace(\"source\", \"sources\")\n        .split(\"&\")\n        .map((query) => query.split(\"=\"))\n    );\n    res.url = \"\";\n}\nlet book_id = res.book_id;\njava.put('book_id', book_id);\nlet tab = res.tab;\nlet sources = res.sources;\nlet url = res.url;\nlet html = \"\";\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (url != \"\" && proxy == \"\u672c\u5730\") {\n    if (sources == '69\u4e66\u5427') {\n        let ck69 = String(cookie.getCookie(url));\n        let headers = {\n            \"Cookie\": ck69\n        };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        html = java.ajax(url + ',' + op);\n    } else {\n        html = java.ajax(url);\n    }\n    \/\/java.log(html);\n    if (html.includes(\"Just a moment...\") && sources == '69\u4e66\u5427') {\n        cookie.removeCookie(url);\n        var x = `https:\/\/www.69shuba.com`;\n        java.longToast('\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1');\n        var s = java.startBrowserAwait(x, \"\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1\").body();\n\n        let ck69 = String(cookie.getCookie(url));\n        let headers = {\n            \"Cookie\": ck69\n        };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        \/\/java.log(op);\n        html = java.ajax(url + ',' + op);\n        \/\/java.log(html);\n    }\n};\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet op = {\n    method: \"POST\",\n    body: {\n        html: html\n    }\n};\nop = JSON.stringify(op);\nlet varia = String(book.getVariable('custom'));\nif (varia == 'null') {\n    varia = '';\n}\nvaria = JSON.stringify({\n    'custom': varia\n});\n\/\/ varia = java.base64Encode(varia);\n\/\/java.log(`${base_url}\/catalog?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\nlet data = java.ajax(\n    `${base_url}\/catalog?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`\n);\nlet device, device_type;\ntry {\n    device = java.deviceID();\n    device_type = \"\u82f9\u679c\";\n} catch (e) {\n    try {\n        device = java.androidId();\n        device_type = \"\u5b89\u5353\";\n    } catch (e) {\n        device = \"\";\n        device_type = \"\u5b89\u5353\";\n    }\n}\n\nif (tab == \"\u5c0f\u8bf4\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 8;\n    } else {\n        book.type = 0;\n    }\n} else if (tab == \"\u542c\u4e66\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 32;\n    } else {\n        book.type = 1;\n    }\n} else if (tab == \"\u6f2b\u753b\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 64;\n    } else {\n        book.type = 2;\n    }\n} else if (tab == \"\u77ed\u5267\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 8;\n    } else {\n        book.type = 3;\n    }\n} else {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 8;\n    } else {\n        book.type = 0;\n    }\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet reading = getArguments(source.getVariable(), \"reading\");\n\nif (book && book.order != 0 && reading == '1') {\n    try {\n        if (!data || !book.variable || !base_url || !qtcookie) {\n            java.log('\u7f3a\u5c11\u5fc5\u8981\u53c2\u6570');\n        } else {\n            let parsedData;\n            try {\n                parsedData = JSON.parse(data);\n            } catch (e) {\n                java.log('\u89e3\u6790data\u6570\u636e\u5931\u8d25:' + e);\n            }\n            \n            if (parsedData && parsedData.data && Array.isArray(parsedData.data) && parsedData.data[book.durChapterIndex]) {\n                let ritem = parsedData.data[book.durChapterIndex];\n                let bookInfoObj;\n                try {\n                    bookInfoObj = JSON.parse(book.variable);\n                } catch (e) {\n                    java.log('\u89e3\u6790book.variable\u5931\u8d25:' + e);\n                }\n                \n                if (bookInfoObj) {\n                    let book_info;\n                    try {\n                        book_info = JSON.parse(bookInfoObj.book_detail || JSON.stringify(bookInfoObj));\n                    } catch (e) {\n                        java.log('\u89e3\u6790book_detail\u5931\u8d25:' + e);\n                    }\n                    \n                    if (book_info && typeof book_info === 'object') {\n                        let rurl = base_url + '\/add_book_to_book_shelf,';\n                        book_info['read_status'] = 1;\n                        book_info['last_chapter_item_id'] = ritem.item_id || '';\n                        book_info['last_chapter_title'] = ritem.title || '';\n                        let rop = {\n                            method: \"POST\",\n                            headers: {\n                                cookie: qtcookie\n                            },\n                            body: book_info\n                        };\n                        let check_book_url = base_url + '\/check_book_in_book_shelf,';\n                        let checkResponse;\n                        \n                        try {\n                            checkResponse = java.ajax(check_book_url + JSON.stringify(rop));\n                        } catch (e) {\n                            java.log('\u68c0\u67e5\u4e66\u7c4d\u8bf7\u6c42\u5931\u8d25:' + e);\n                        }\n                        \n                        if (checkResponse) {\n                            let check_data;\n                            try {\n                                check_data = JSON.parse(checkResponse).data;\n                            } catch (e) {\n                                java.log('\u89e3\u6790\u68c0\u67e5\u54cd\u5e94\u5931\u8d25:' + e);\n                            }\n                            try {\n                                if (check_data && check_data.id) {\n                                    book_info['id'] = check_data.id;\n                                    let uurl = base_url + '\/update_book_shelf,';\n                                    java.ajax(uurl + JSON.stringify(rop));\n                                } else {\n                                    java.ajax(rurl + JSON.stringify(rop));\n                                }\n                            } catch (e) {\n                                java.log('\u4e66\u67b6\u64cd\u4f5c\u5931\u8d25:' + e);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    } catch (error) {\n        java.log('\u4e66\u7c4d\u540c\u6b65\u6d41\u7a0b\u5f02\u5e38:' + error);\n        java.longToast('\\n\u540c\u6b65\u9605\u8bfb\u8fdb\u5ea6\u5931\u8d25\uff0c\u4f46\u4e0d\u5f71\u54cd\u9605\u8bfb\uff0c\u53ef\u4ee5\u524d\u5f80\u767b\u5f55\u5173\u95ed\u4e66\u67b6\u540c\u6b65\u529f\u80fd\u3002');\n    }\n}\ndata;\n<\/js>$.data","chapterName":"$.title","chapterUrl":"<js>\nlet tab = result.tab;\nlet sources = result.source;\nlet title = result.title;\nlet item_id = result.item_id;\nlet book_id = java.get(\"book_id\");\nlet url = result.toc_url || \"\";\nlet qtcontent = {\n    book_id: book_id,\n    item_id: item_id,\n    title: title,\n    sources: sources,\n    tab: tab,\n    url: url,\n};\nqtcontent = java.base64Encode(JSON.stringify(qtcontent));\nif (sources == '\u5377') {\n    content_url = item_id\n} else if ((sources == \"\u756a\u8304\" || sources == \"\u4e03\u732b\" || sources == \"\u5854\u8bfb\") && tab == \"\u5c0f\u8bf4\") {\n    var base_url = getArguments(source.getVariable(), \"server\") || \"\";\n    var fqssionid = getArguments(source.getVariable(), \"fqssionid\") || \"\";\n    let sourcess = sources.replace('svip_', '');\n    content_url = `data:;base64,${qtcontent},{\"type\":\"qingtian3\",\"js\":\"book ? result : '${base_url}\/get_review?book_id=${book_id}&item_id=${item_id}&ssionid=${fqssionid}&source=${sourcess}'\"}`;\n} else {\n    content_url = `data:;base64,${qtcontent},{\"type\":\"qingtian3\"}`;\n}\n<\/js>","updateTime":"$.first_pass_time"},"searchUrl":"<js>\nlet base_url = getArguments(source.getVariable(), 'server');\nlet media;\nlet sources = getArguments(source.getVariable(), 'source');\nlet disabled_sources = getArguments(source.getVariable(), 'disabled_sources');\nif (String(key).startsWith(\"m:\") || String(key).startsWith(\"m\uff1a\")) {\n    media = \"\u6f2b\u753b\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"t:\") || String(key).startsWith(\"t\uff1a\")) {\n    media = \"\u542c\u4e66\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"d:\") || String(key).startsWith(\"d\uff1a\")) {\n    media = \"\u77ed\u5267\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"x:\") || String(key).startsWith(\"x\uff1a\")) {\n    media = \"\u5c0f\u8bf4\"\n    key = key.slice(2)\n} else {\n    media = getArguments(source.getVariable(), 'media');\n}\nif (key.includes('@')) {\n    var parts = key.split('@');\n    key = parts[0];\n    sources = parts[1] || sources;\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet op = {\n    method: \"GET\",\n    headers: {\n        cookie: qtcookie\n    },\n};\nop = JSON.stringify(op);\n`${base_url}\/search?title=${key}&tab=${media}&source=${sources}&page={{page}}&disabled_sources=${disabled_sources},${op}`\n<\/js>","weight":0},{"bookSourceComment":"","bookSourceName":"\u7bf1\u7b06\u597d","bookSourceType":0,"bookSourceUrl":"https:\/\/m.libahao.com","bookUrlPattern":"https:\/\/m.libahao.com\/book\/.+","customOrder":0,"enabled":true,"enabledCookieJar":true,"enabledExplore":false,"exploreUrl":"","lastUpdateTime":"1769241092917","respondTime":180000,"ruleBookInfo":{"author":"[property=\"og:novel:author\"]@content","coverUrl":"img@src","intro":"[property=\"og:description\"]@content","kind":"[property\uff5e=category|status|update_time]@content","lastChapter":"[property~=las?test_chapter_name]@content","name":"[property=\"og:novel:book_name\"]@content","tocUrl":"[property=\"og:novel:read_url\"]@content"},"ruleContent":{"content":".chapter-content@html","nextContentUrl":"text.\u4e0b\u4e00\u9875@href"},"ruleExplore":{"author":"","bookList":"","bookUrl":"","coverUrl":"","intro":"","name":""},"ruleSearch":{"author":".book-author@text","bookList":".book-item","bookUrl":"href","coverUrl":"img@src","intro":".book-description@text","name":".book-title@text"},"ruleToc":{"chapterList":".chapter-list.1@a","chapterName":"text","chapterUrl":"href"},"searchUrl":"https:\/\/m.libahao.com\/sou?wd={{key}}","weight":0},{"bookSourceGroup":"\u6539\u5584","bookSourceName":"\u5143\u5c0f\u8bf4","bookSourceType":0,"bookSourceUrl":"https:\/\/metanetnovel.com\/","bookUrlPattern":"https?:\/\/metanetnovel.com\/nv\/\\d+","customOrder":2,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"\u793e\u4f1a\u90fd\u5e02::\/cat\/2\n\u8c6a\u95e8\u603b\u88c1::\/cat\/3\n\u73b0\u4ee3\u8a00\u60c5::\/cat\/4\n\u53e4\u4ee3\u8a00\u60c5::\/cat\/5\n\u7a7f\u8d8a\u91cd\u751f::\/cat\/6\n\u7384\u5e7b\u5f02\u80fd::\/cat\/7\n\u60ac\u7591\u7075\u5f02::\/cat\/8\n\u6b66\u4fa0\u4ed9\u4fa0::\/cat\/9\n\u540c\u4eba\u7f8e\u6587::\/cat\/13","header":"{\"User-Agent\": \"Mozilla\/5.0 (Linux; Android 9) Mobile Safari\/537.36\"}","lastUpdateTime":"1769267752741","respondTime":180000,"ruleBookInfo":{"author":"@get:{a}","coverUrl":"@get:{c}","init":"@put:{n:\"[property$=book_name]@content\",\na:\"[property$=author]@content\",\nk:\"[property~=category|status|update_time]@content\",\nl:\"[property$=latest_chapter_name]@content\",\ni:\"[property$=description]@content\",\nc:\"[property$=image]@content\",\nt:\"text.\u7ae0\u8282\u76ee\u5f55@href\"}","intro":"@get:{i}","kind":"@get:{k}","lastChapter":"@get:{l}","name":"@get:{n}","tocUrl":"@get:{t}"},"ruleContent":{"content":".content@html","nextContentUrl":"text.\u4e0b\u4e00@href"},"ruleExplore":{"author":".s4@text","bookList":".txt-list.txt-list-row5 li","bookUrl":".s2 a@href","kind":".s1@text&&.s5@text##\\[|\\]|\\+.*","name":".s2 a@text"},"ruleSearch":{"author":"","bookList":".item","bookUrl":"a.1@href","checkKeyWord":"\u5251\u6765","coverUrl":"img@src","intro":"dd@text","kind":"0","name":"a.1@text"},"ruleToc":{"chapterList":".section-list li a","chapterName":"text","chapterUrl":"href","nextTocUrl":"option@value||text.\u4e0b\u4e00\u9875@href"},"searchUrl":"\/s?keyword={{key}}","weight":0},{"bookSourceComment":"\u66f4\u65b0\u65e5\u5fd7\u8bf7\u70b9\u51fb\u767b\u5f55\uff0c\u66f4\u65b0\u4e66\u6e90\u4e2d\u67e5\u770b\n\u672c\u4e66\u6e90\u4e0d\u51fa\u610f\u5916\u7684\u8bdd\u57fa\u672c\u4e3a\u6700\u7ec8\u7248\u672c\uff0c\u540e\u7eed\u66f4\u65b0\u90fd\u4f1a\u5728\u4e91\u7aef\u66f4\u65b0\u8bbe\u7f6e\u4e2d\u5fc3\uff0c\u4e0d\u9700\u8981\u518d\u66f4\u65b0\u4e66\u6e90\uff0c\u5f53\u7136\uff0c\u4e0d\u6392\u9664\u57df\u540d\u5931\u6548\u7684\u60c5\u51b5\n\n\u517c\u5bb9\u6b63\u5f0f\u7248\u9605\u8bfbapp","bookSourceGroup":"\u6674\u5929\u805a\u5408","bookSourceName":"\ud83c\udf1eA\u6674\u5929\u805a\u54085.1.25(\u7ec8\u6781\u7248)","bookSourceType":0,"bookSourceUrl":"\u6674\u5929\u878d\u5408VIP4.0","bookUrlPattern":"https?:\\\/\\\/(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z0-9-]+(?::\\d+)?\\\/detail.*","customButton":false,"customOrder":3,"enabled":true,"enabledCookieJar":false,"enabledExplore":true,"eventListener":false,"exploreUrl":"<js>\nfunction setArgument(key, value) {\n    var open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '') || {};\n    open_argument[key] = value;\n    var result = JSON.stringify(open_argument);\n    source.setVariable(result);\n    return result;\n}\n\nvar open_argument = source.getVariable();\nvar base_url = getArguments(open_argument, 'server') || '';\nvar ms = getArguments(open_argument, 'tone_id') || '';\nvar source_type = getArguments(open_argument, 'source_type') || '\u7537\u9891';\nvar tab = getArguments(open_argument, 'tab') || '\u5c0f\u8bf4';\nvar sources = getArguments(open_argument, 'sources') || '\u756a\u8304';\n\n\nvar sdtoken;\ntry {\n    var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n    sdtoken = String(loginInfoMap['\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)'] || '');\n} catch (e) {\n    sdtoken = '';\n}\n\nvar rawCookie = getFanqieCookie() || sdtoken;\nvar match = rawCookie.match(\/sessionid=[^;]+\/);\nvar fqcookie = match ? match[0] : '';\nvar fqssionid = '';\nif (!fqcookie) {\n    java.toast('\u60a8\u8fd8\u672a\u767b\u9646\u756a\u8304\u8d26\u53f7\uff0c\u65e0\u6cd5\u540c\u6b65\u6570\u636e\u54e6\uff01');\n} else {\n    fqssionid = getSessionId(fqcookie)\n}\nvar fqsjurl = base_url + \"\/bookshelf?page={{page}}&ssionid=\" + fqssionid;\nvar fqtjurl = base_url + \"\/fqrecommend?page={{page}}&ssionid=\" + fqssionid;\nvar fqlsurl = base_url + \"\/fqhistory?page={{page}}&ssionid=\" + fqssionid;\n\nvar groupDatas = [];\nvar infoData = [];\n\nfunction deviceType() {\n    try {\n        return !!java.androidId();\n    } catch (e) {\n        return false;\n    }\n}\n\nvar hasValidCookie = fqcookie.length > 0;\n\nif (hasValidCookie) {\n    function groupQuery() {\n        try {\n            var url = base_url + \"\/group_name?ssionid=\" + fqssionid;\n            var res = java.ajax(url);\n            var response = JSON.parse(res);\n\n            if (!(response && response.data)) {}\n\n            response.data.forEach(function(group) {\n                var keys = Object.keys(group);\n                if (keys.length > 0) {\n                    var key = keys[0];\n                    var value = group[key];\n                    if (value && value.length) {\n                        var option = {\n                            \"method\": \"POST\",\n                            \"body\": {\n                                \"book_ids\": value,\n                                \"page\": \"{{page}}\"\n                            }\n                        };\n                        groupDatas.push({\n                            title: key,\n                            url: base_url + \"\/bookshelf,\" + JSON.stringify(option),\n                            style: {\n                                layout_flexGrow: 1,\n                                layout_flexBasisPercent: 0.45\n                            }\n                        });\n                    }\n                }\n            });\n\n            if (groupDatas.length % 2 !== 0) {\n                groupDatas.push({\n                    title: \"--\",\n                    url: \"\",\n                    style: {\n                        layout_flexGrow: 1,\n                        layout_flexBasisPercent: 0.45\n                    }\n                });\n            }\n        } catch (e) {\n            java.longToast(\"\u756a\u8304\u767b\u5f55\u8fc7\u671f\uff0c\u5df2\u9690\u85cf\u756a\u8304\u4e66\u67b6\");\n        }\n    }\n\n    try {\n        java.longToast(\"\u6b63\u5728\u52a0\u8f7d\u5206\u7ec4\u6570\u636e...\");\n        var userUrl = base_url + \"\/fquser?ssionid=\" + fqssionid;\n        var userRes = java.ajax(userUrl);\n        var userData = JSON.parse(userRes);\n\n        var userName = (userData && userData.data && userData.data.name) ? userData.data.name : '\u672a\u77e5\u7528\u6237';\n        if (!userName.includes('\u672a\u77e5\u7528\u6237')) {\n            infoData = [{\n                title: \"\u756a\u8304\u4e2a\u4eba\u4e2d\u5fc3\",\n                url: fqsjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }, {\n                title: \"\u4e2a\u6027\u63a8\u8350(\u756a\u8304)\",\n                url: fqtjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }, {\n                title: \"\u5386\u53f2\u9605\u8bfb(\u756a\u8304)\",\n                url: fqlsurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }];\n        }\n        groupQuery();\n    } catch (e) {\n        java.longToast(\"\u756a\u8304\u767b\u5f55\u8fc7\u671f\uff0c\u5df2\u9690\u85cf\u756a\u8304\u4e66\u67b6\");\n    }\n}\n\nvar style_list = [];\ntry {\n    var durl = `${base_url}\/discovestyle?source=${sources}&source_type=${source_type}&tab=${tab}`;\n    var res = java.ajax(durl);\n    var result = JSON.parse(res);\n    style_list = result.data || [];\n    if (result.msg) {\n        java.toast(result.msg);\n    }\n} catch (e) {\n    java.toast(\"\u53d1\u73b0\u6837\u5f0f\u83b7\u53d6\u5931\u8d25\");\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet qtop = {\n    method: \"GET\",\n    headers: {\n        cookie: qtcookie\n    },\n};\nqtop = JSON.stringify(qtop);\nlet qtsjurl = base_url+'\/get_book_shelf,'+qtop\nlet qtsj = [{\n                title: \"\u6674\u5929\u4e2a\u4eba\u4e2d\u5fc3\",\n                url: qtsjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }]\nvar finalData = infoData.concat(groupDatas, style_list);\nfinalData = qtsj.concat(finalData);\nJSON.stringify(finalData);\n<\/js>","header":"{ \"User-Agent\":\"Mozilla\/5.0 (Linux; Android 6.0; Nexus 5 Build\/MRA58N) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Mobile Safari\/537.36 Edg\/138.0.0.0\" }","jsLib":"var host = [\n    'https:\/\/v1.gyks.cf',\n    'https:\/\/v2.gyks.cf',\n    'https:\/\/v3.gyks.cf',\n    'https:\/\/v4.gyks.cf',\n    'https:\/\/v5.gyks.cf',\n    'https:\/\/v6.gyks.cf',\n    'https:\/\/v7.gyks.cf',\n    'http:\/\/101.35.133.34:8888',\n    'http:\/\/103.236.91.147:8888'\n];\n\nfunction getArguments(open_argument, key) {\n    try {\n        open_argument = JSON.parse(open_argument);\n    } catch (e) {\n        open_argument = {\n            tab: \"\u5c0f\u8bf4\",\n            tone_id: \"\u9ed8\u8ba4\u97f3\u8272\",\n            server: host[0],\n            sources: \"\u5168\u90e8\",\n            source_type: \"\u7537\u9891\",\n        };\n    }\n    if (key) {\n        return open_argument[key];\n    } else {\n        return open_argument;\n    }\n}\n\nfunction setArguments(key, value) {\n    const {\n        source\n    } = this;\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    open_argument[key] = value;\n    open_argument = JSON.stringify(open_argument);\n    source.setVariable(open_argument);\n    return open_argument;\n}\n\nfunction decrypt(Text) {\n    return Text;\n}\n\nfunction paraForAndroid(content, sources,ydv) {\n    let {\n        java,\n        cache,\n        source\n    } = this;\n    let plcolor = getArguments(source.getVariable(), \"plcolor\");\n    if (!plcolor) {\n        plcolor = \"#000000\";\n    }\n    let tccolor = getArguments(source.getVariable(), \"tccolor\");\n    if (!tccolor) {\n        tccolor = \"#ffffff\";\n    }\n\n    const createSvg = this.createSvg.bind(this);\n\n    return content.replace(\/<p>(.*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\\/>)?<\\\/p>\/g,\n        (match, text, url, count) => {\n            if (url && count) {\n                const click = 0;\n                cache.putMemory(url, click);\n                const encodedUrl = url;\n                return `<p>${text}<img src=\"${createSvg(count, plcolor,tccolor,encodedUrl,sources,ydv)}\"><\/p>`;\n            } else {\n                return `<p>${text}<\/p>`;\n            }\n        }\n    );\n}\n\n\nfunction showCmt(url, sources,ydv) {\n    let {\n        java,\n        cache\n    } = this;\n    const currentTime = Date.now();\n    const click = cache.getFromMemory(url);\n    let isqread = false;\n    try {\n        java.qread();\n        isqread = true;\n    } catch (e) {}\n    if (click < 1 && !isqread && !ydv) {\n        cache.putMemory(url, click + 1);\n        return;\n    } else {\n        if (isqread) {\n            java.startBrowserDp(url, sources + '\u6bb5\u8bc4');\n        } else if (ydv) {\n                java.showBrowser(url, java.ajax(url));\n            } else {\n               java.startBrowser(url, sources + '\u6bb5\u8bc4');\n        }\n    }\n}\n\n\n\nfunction createSvg(number, color, tccolor, encodedUrl, sources,ydv) {\n        var displayText = number > 99 ? \"99+\" : number.toString();\n        var loginInfoMap = {};\n\n        if (this.source && typeof this.source.getLoginInfoMap == 'function') {\n            loginInfoMap = this.source.getLoginInfoMap() || {};\n        }\n\n        var bubbleStyle = String(getArguments(this.source.getVariable(), \"pstyle\") || loginInfoMap['\u6bb5\u8bc4\u6c14\u6ce1\u6837\u5f0f(0-4)'] || '0');\n        var svg;\n        if (bubbleStyle == '0') {\n            svg = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100\" height=\"90\" viewBox=\"0 0 25 17\" fill=\"none\" style=\"color: ${color}; opacity: 1;\">\n                        <path d=\"M24 14.5v-12a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v7.528a2 2 0 0 1-.211.894l-2.065 4.13a1 1 0 0 0 .894 1.448H22a2 2 0 0 0 2-2z\" stroke=\"currentColor\" style=\"stroke: ${color}; stroke-opacity: 0.5; stroke-width: 1px; stroke-linejoin: round; fill: ${tccolor}; fill-opacity: 0.5;\"><\/path>\n                        <text x=\"13.5\" y=\"12\" text-anchor=\"middle\" alignment-baseline=\"auto\" font-size=\"10\" fill=\"currentColor\" font-family=\"Arial, sans-serif\" font-weight=\"500\" style=\"fill: ${color}; opacity: 1;\">${displayText}<\/text>\n                    <\/svg>`;\n        } else if (bubbleStyle == '1') {\n            svg = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100\" height=\"90\" viewBox=\"0 7 153 106\" style=\"color: ${color}; opacity: 1;\">\n                        <path d=\"M 55 10 L 120 10 Q 150 10 150 40 L 150 80 Q 150 110 120 110 L 55 110 Q 25 110 25 80 L 25 75 L 3 60 L 25 45 L 25 40 Q 25 10 55 10 Z\" stroke=\"currentColor\" stroke-width=\"6\" stroke-linejoin=\"round\" style=\"stroke: ${color}; stroke-opacity: 0.5; stroke-width: 4px; stroke-linejoin: round; fill: ${tccolor}; fill-opacity: 0.5;\"><\/path>\n                        <text x=\"87\" y=\"86\" alignment-baseline=\"auto\" font-family=\"Arial, sans-serif\" text-anchor=\"middle\" font-size=\"72\" font-weight=\"500\" fill=\"currentColor\" style=\"fill: ${color}; opacity: 1;\">${displayText}<\/text>\n                <\/svg>`;\n        } else if (bubbleStyle == '2') {\n            svg = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100\" height=\"90\" viewBox=\"6 10 88 76\" style=\"color: ${color}; opacity: 1;\">\n                        <path d=\"M12,12 L88,12 Q92,12 92,16 L92,68 Q92,72 88,72 L28,72 L12,84 L12,72 Q8,72 8,68 L8,16 Q8,12 12,12 Z\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linejoin=\"round\" style=\"stroke: ${color}; stroke-opacity: 0.5; stroke-width: 2.5px; stroke-linejoin: round; fill: ${tccolor}; fill-opacity: 0.5;\"><\/path>\n                        <text x=\"50\" y=\"60\" font-family=\"Arial, sans-serif\" text-anchor=\"middle\" font-size=\"45\" fill=\"currentColor\" font-weight=\"500\" alignment-baseline=\"auto\" style=\"fill: ${color}; opacity: 1;\">${displayText}<\/text>\n                    <\/svg>`;\n        } else if (bubbleStyle == '3') {\n            svg = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100\" height=\"90\" viewBox=\"0 0 25 17\" fill=\"none\" style=\"color: ${color}; opacity: 1;\">\n                        <rect x=\"0.5\" y=\"0.5\" width=\"24\" height=\"16\" rx=\"2.5\" ry=\"2.5\" stroke=\"currentColor\" style=\"stroke: ${color}; stroke-opacity: 0.5; stroke-width: 1px; stroke-linejoin: round; fill: ${tccolor}; fill-opacity: 0.5;\"><\/rect>\n                        <text x=\"12.5\" y=\"12\" text-anchor=\"middle\" alignment-baseline=\"auto\" font-size=\"10\" fill=\"currentColor\" font-family=\"Arial, sans-serif\" font-weight=\"500\" style=\"fill: ${color}; opacity: 1;\">${displayText}<\/text>\n                    <\/svg>`;\n        } else if (bubbleStyle == '4') {\n            svg = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100\" height=\"90\" viewBox=\"0 0 25 17\" fill=\"none\" style=\"color: ${color}; opacity: 1;\">\n                            <path stroke=\"currentColor\" stroke-width=\"1.00\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"4.00\" style=\"stroke: ${color}; stroke-opacity: 0.5; stroke-width: 1px; stroke-linejoin: round; fill: ${tccolor}; fill-opacity: 0.5;\" d=\"M 7.5 0.5 L 16.5 0.5 A 7 7 0 0 1 23.5 7.5 L 23.5 7.5 A 7 7 0 0 1 16.5 14.5 L 8.5 14.5 L 5.192 16.5 L 5.5 14.5 A 7 7 30 0 1 0.5 7.5 L 0.5 7.5 A 7 7 0 0 1 7.5 0.5 Z\"\/>\n                            <text fill=\"${color}\" font-family=\"Arial, sans-serif\" font-size=\"10\" font-weight=\"500\" text-anchor=\"middle\" dy=\"0.35em\" x=\"12.00\" y=\"7.50\">${displayText}<\/text>\n                            <\/svg>`;\n        } else if (bubbleStyle == '5') {\n            displayText = number > 99 ? \"99\" : number.toString();\n            svg = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100\" height=\"90\" viewBox=\"0 0 25 17\" fill=\"none\" style=\"color: ${color}; opacity: 1;\">\n                        <circle cx=\"12.5\" cy=\"8.5\" r=\"8\" stroke=\"currentColor\" style=\"stroke: ${color}; stroke-opacity: 0.5; stroke-width: 1px; stroke-linejoin: round; fill: ${tccolor}; fill-opacity: 0.5;\"><\/circle>\n                        <text x=\"13\" y=\"12\" text-anchor=\"middle\" alignment-baseline=\"auto\" font-size=\"10\" fill=\"currentColor\" font-family=\"Arial, sans-serif\" font-weight=\"500\" style=\"fill: ${color}; opacity: 1;\">${displayText}<\/text>\n                    <\/svg>`;\n        } else {\n            svg = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100\" height=\"90\" viewBox=\"0 0 25 17\" fill=\"none\" style=\"color: ${color}; opacity: 1;\">\n                <path d=\"M24 14.5v-12a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v7.528a2 2 0 0 1-.211.894l-2.065 4.13a1 1 0 0 0 .894 1.448H22a2 2 0 0 0 2-2z\" stroke=\"currentColor\" style=\"stroke: ${color}; stroke-opacity: 0.5; stroke-width: 1px; stroke-linejoin: round; fill: ${tccolor}; fill-opacity: 0.5;\"><\/path>\n                <text x=\"13.5\" y=\"12\" text-anchor=\"middle\" alignment-baseline=\"auto\" font-size=\"10\" fill=\"currentColor\" font-family=\"Arial, sans-serif\" font-weight=\"500\" style=\"fill: ${color}; opacity: 1;\">${displayText}<\/text>\n            <\/svg>`;\n        }\n        var jc =  'js';\n        if (ydv) { jc = 'click' }\n        var encodedSvg = this.java.base64Encode(svg);\n        \n        return 'data:image\/svg+xml;base64,' + encodedSvg + ',{\"'+ jc + '\":\"showCmt(\\'' + encodedUrl + '\\', \\'' + sources+ '\\', '+ ydv + ')\",\"style\":\"text\"}';\n        }\n\n\nfunction cleanHTML(html) {\n    let result = html\n        .replace(\/<header[^>]*>[\\s\\S]*?<\\\/header>\/gi, \"\")\n        .replace(\/<div class=\"tt-title\"[^>]*>[\\s\\S]*?<\\\/div>\/gi, \"\")\n        .replace(\/<(?!\\\/?p\\b|\\\/?img\\b)[^>]+>\/gi, \"\");\n    result = result.replace(\/<\\\/?p[^>]*>\/g, \"\\n\");\n    return result.replace(\/\\n+\/g, \"\\n\").trim();\n}\n\n\nfunction getBaseUrl(url) {\n    if (!url) {\n        return null;\n    }\n    url = String(url);\n    if (url.match(\/https?:\\\/\\\/\/i)) {\n        var index = url.indexOf(\"\/\", 9);\n        return index == -1 ? url : url.substring(0, index);\n    }\n    return null;\n}\n\nfunction isIPv4Address(ip) {\n    ip = String(ip);\n    let parts = ip.split(\".\");\n    if (parts.length !== 4) return false;\n\n    for (let part of parts) {\n        if (!\/^\\d+$\/.test(part)) return false; \/\/ \u5fc5\u987b\u662f\u6570\u5b57\n        if (part.length > 1 && part[0] === \"0\") return false; \/\/ \u7981\u6b62\u524d\u5bfc\u96f6\n        let num = parseInt(part, 10);\n        if (num < 0 || num > 255) return false; \/\/ \u8303\u56f4\u68c0\u67e5\n    }\n    return true;\n}\n\nfunction isIPv6Address(ip) {\n    ip = String(ip);\n    \/\/ \u5904\u7406\u53cc\u5192\u53f7\uff08\u6700\u591a\u51fa\u73b0\u4e00\u6b21\uff09\n    if (ip.includes(\":::\")) return false;\n    let doubleColonCount = (ip.match(\/::\/g) || []).length;\n    if (doubleColonCount > 1) return false;\n\n    \/\/ \u5206\u5272\u6210\u7ec4\n    let groups = ip.split(\":\");\n    let validGroupCount = 8;\n    let actualGroupCount = groups.filter((g) => g !== \"\").length;\n\n    \/\/ \u9a8c\u8bc1\u7ec4\u6570\n    if (doubleColonCount === 1) {\n        if (actualGroupCount > validGroupCount - 1) return false;\n    } else {\n        if (groups.length !== validGroupCount) return false;\n    }\n\n    \/\/ \u9a8c\u8bc1\u6bcf\u7ec4\u5185\u5bb9\n    for (let group of groups) {\n        if (group === \"\") continue; \/\/ \u8df3\u8fc7\u7a7a\u7ec4\uff08\u53cc\u5192\u53f7\u90e8\u5206\uff09\n        if (!\/^[0-9a-fA-F]{1,4}$\/.test(group)) return false; \/\/ 1-4\u4f4d\u5341\u516d\u8fdb\u5236\n    }\n    return true;\n}\n\nfunction isIPAddress(input) {\n    return isIPv4Address(input) || isIPv6Address(input);\n}\n\nfunction getSessionId(cookieString) {\n    const match = cookieString.match(\/sessionid=([^;]+)\/);\n    return match ? match[1] : null;\n}\n\nfunction getKey(key) {\n    let parts = key.split(\";\");\n    for (let part of parts) {\n        if (part.includes(\"qttoken\")) {\n            return part.split(\"=\")[1];\n        }\n    }\n    return \"\";\n}\n\nfunction getFanqieCookie() {\n    const {\n        cookie\n    } = this;\n    try {\n        return String(cookie.getCookie('fanqienovel.com') || java.getCookie('fanqienovel.com') || '');\n    } catch (e) {\n        return '';\n    }\n}\n\n\nfunction paraForiOS(html, sources) {\n    return html.replace(\n        \/<p>(.*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\\/>)?<\\\/p>\/g,\n        function(match, text, url, count) {\n            if (url && count) {\n                const encodedUrl = url.replace(\/&\/g, '&amp;');\n                return `<span rs-native>${text}<comment count=\"${count}\" onPress=\"java.showReadingBrowser('${encodedUrl}','${sources}\u6bb5\u8bc4')\"><\/span>`;\n            } else {\n                return `<span rs-native>${text}<\/span>`;\n            }\n        }\n    );\n}\n\nfunction removeAllImgTags(htmlString) {\n  const imgTagRegex = \/<img\\b[^>]*>|<\\\/img>|<img\\b[^>]*\\\/>\/gi;\n  return htmlString.replace(imgTagRegex, '');\n}","lastUpdateTime":"1769332543901","loginUi":"[{\n        \"name\": \"\u90ae\u7bb1\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u5bc6\u7801\",\n        \"type\": \"password\"\n    }, {\n        \"name\": \"\u2665\u767b\u5f55\u4e66\u6e90\",\n        \"type\": \"button\",\n        \"action\": \"login(true)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udd10\u6ce8\u518c\u4e66\u6e90\",\n        \"type\": \"button\",\n        \"action\": \"register()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\u2699\ufe0f\u4e66\u6e90\u8bbe\u7f6e\",\n        \"type\": \"button\",\n        \"action\": \"control()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"\u26d4\ufe0f\u6e05\u7a7a\u8bbe\u7f6e\",\n        \"type\": \"button\",\n        \"action\": \"reCookieSettings()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2728\u5e94\u7528\u8bbe\u7f6e\",\n        \"type\": \"button\",\n        \"action\": \"applyCookieSettings()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \" \ud83d\udd1a \u9000\u51fa\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"logout()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83c\udfdd\u7528\u6237\u540e\u53f0\",\n        \"type\": \"button\",\n        \"action\": \"loginqt()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \" \ud83d\uddd1 \u6e05\u9664\u8bbe\u5907\",\n        \"type\": \"button\",\n        \"action\": \"clearDevice()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83d\udd2e \u68c0\u6d4b\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"checkStatus()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2615\u6253\u8d4f\u4eab\u798f\u5229\",\n        \"type\": \"button\",\n        \"action\": \"vip()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2747\ufe0f \u66f4\u65b0\u4e66\u6e90\",\n        \"type\": \"button\",\n        \"action\": \"renderVersionPage()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"==\u4e0b\u65b9\u914d\u7f6e\u4e3a\u4e66\u6e90\u8bbe\u7f6e\u9875\u9762\u65e0\u6cd5\u6253\u5f00\u65f6\u4f7f\u7528==\",\n        \"type\": \"button\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"\ud83d\udcd1\u66f4\u5c11\u7b80\u4ecb\",\n        \"type\": \"button\",\n        \"action\": \"set_info()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udcdd\u6bb5\u8bc4\u5f00\u5173\",\n        \"type\": \"button\",\n        \"action\": \"paracomment('fqpara')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udcda \u540c\u6b65\u4e66\u67b6\",\n        \"type\": \"button\",\n        \"action\": \"set_reading()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u264b\ufe0f \u7537\/\u5973\u9891\u9053\",\n        \"type\": \"button\",\n        \"action\": \"set_source_type()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udca2 \u5f3a\u5236\u641c\u7d22\u5168\u90e8\",\n        \"type\": \"button\",\n        \"action\": \"disabledSources()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83c\udf45\u756a\u8304\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"fq_login()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u27bf\ufe0f \u56fe\u7247\u663e\u793a\",\n        \"type\": \"button\",\n        \"action\": \"closeImg()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\uddc2\u5f53\u524d\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"get_media()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"\ud83d\udcd6\u5c0f\u8bf4\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u5c0f\u8bf4')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udd0a\u542c\u4e66\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u542c\u4e66')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83c\udfde\u6f2b\u753b\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u6f2b\u753b')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\uddb2\u77ed\u5267\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u77ed\u5267')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83c\udf9a\u5207\u6362\u670d\u52a1\u5668\",\n        \"type\": \"button\",\n        \"action\": \"set_server()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u267b\ufe0f\u68c0\u6d4b\u5f53\u524d\u670d\u52a1\u5668\",\n        \"type\": \"button\",\n        \"action\": \"checkNet()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2695\ufe0f\u672c\u5730\/\u670d\u52a1\u5668 \",\n        \"type\": \"button\",\n        \"action\": \"get_proxy()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udccc\u6c38\u4e45\u53d1\u5e03\u9875\ud83d\udccc\",\n        \"type\": \"button\",\n        \"action\": \"api()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2193\u2193\u4e0b\u65b9\u53ef\u5207\u6362\u6765\u6e90\u7528\u4e8e\u641c\u7d22\/\u53d1\u73b0\u9875\u2193\u2193\",\n        \"type\": \"button\",\n        \"action\": \"get_media()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"\ud83d\udce4\u6211\u6765\u4e0a\u4f20\",\n        \"type\": \"button\",\n        \"action\": \"put_sk()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udc96\u6211\u6765\u63a8\u8350\",\n        \"type\": \"button\",\n        \"action\": \"put_book()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u5168\u90e8\",\n        \"type\": \"button\",\n        \"action\": \"set_source('\u5168\u90e8')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u756a\u8304')\",\n        'name': '\u756a\u8304',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('69\u4e66\u5427')\",\n        'name': '69\u4e66\u5427',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u4e03\u732b')\",\n        'name': '\u4e03\u732b',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u767e\u5ea6')\",\n        'name': '\u767e\u5ea6',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u8d77\u70b9')\",\n        'name': '\u8d77\u70b9(\u7b2c\u4e09\u65b9)',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5f97\u95f4')\",\n        'name': '\u5f97\u95f4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5854\u8bfb')\",\n        'name': '\u5854\u8bfb',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u4e66\u65d7')\",\n        'name': '\u4e66\u65d7',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('QQ')\",\n        'name': 'QQ',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u732b\u773c')\",\n        'name': '\u732b\u773c',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u641c\u4e66\u795e\u5668')\",\n        'name': '\u641c\u4e66\u795e\u5668',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5f97\u5947')\",\n        'name': '\u5f97\u5947',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u4f2a69')\",\n        'name': '\u4f2a69',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u7231\u4e0b\u7535\u5b50\u4e66')\",\n        'name': '\u7231\u4e0b\u7535\u5b50\u4e66',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5c0f\u7c73')\",\n        'name': '\u5c0f\u7c73',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u661f\u661f\u5c0f\u8bf4')\",\n        'name': '\u661f\u661f\u5c0f\u8bf4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u7b14\u8da3\u960122')\",\n        'name': '\u7b14\u8da3\u960122',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u9876\u70b9')\",\n        'name': '\u9876\u70b9',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5e7b\u68a6\u8f7b\u5c0f\u8bf4')\",\n        'name': '\u5e7b\u68a6\u8f7b\u5c0f\u8bf4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u6c5f\u6e56')\",\n        'name': '\u6c5f\u6e56',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u6b6a\u745e\u53e4\u5fb7')\",\n        'name': '\u6b6a\u745e\u53e4\u5fb7\u6f2b\u753b',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u6cb3\u9a6c')\",\n        'name': '\u6cb3\u9a6c\u77ed\u5267',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u77e5\u4e4e')\",\n        'name': '\u77e5\u4e4e',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('vip')\",\n        'name': '\u4e0b\u65b9\u4e3aVIP\u4e13\u5c5e\u4e66\u6e90(\u70b9\u51fb\u6b64\u5904\u641c\u6240\u6709vip)',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        'action': \"set_source('\u559c\u9a6c\u62c9\u96c5')\",\n        'name': '\u559c\u9a6c\u62c9\u96c5',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('svip')\",\n        'name': '\u4e0b\u65b9\u4e3aSVIP\u4e13\u5c5e\u4e66\u6e90(\u70b9\u51fb\u6b64\u5904\u641c\u6240\u6709svip)',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        'action': \"set_source('\u8d85\u4f1a\u4e13\u5c5e\u77ed\u5267')\",\n        'name': '\u8d85\u4f1a\u4e13\u5c5e\u77ed\u5267',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u8d85\u4f1a\u4e13\u5c5e\u5c0f\u8bf4')\",\n        'name': '\u8d85\u4f1a\u4e13\u5c5e\u5c0f\u8bf4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u9177\u6211')\",\n        'name': '\u9177\u6211\u542c\u4e66',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u756a\u85af\u5c0f\u8bf4')\",\n        'name': '\u756a\u85af\u5c0f\u8bf4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('QQ\u9605\u8bfb')\",\n        'name': 'QQ(\u4f1a\u5458\u4e66\u7c4d\u514d\u8d39)',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u9605\u53cb\u5c0f\u8bf4')\",\n        'name': '\u9605\u53cb\u5c0f\u8bf4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u597d\u770b\u6f2b\u753b')\",\n        'name': '\u597d\u770b\u6f2b\u753b',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5168\u672c\u5c0f\u8bf4')\",\n        'name': '\u5168\u672c\u5c0f\u8bf4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u795e\u4e66\u7f51')\",\n        'name': '\u795e\u4e66\u7f51',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u8bfb\u5168\u672c')\",\n        'name': '\u8bfb\u5168\u672c',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u516b\u4e00\u4e2d\u6587\u7f51')\",\n        'name': '\u516b\u4e00\u4e2d\u6587\u7f51',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u658b\u4e66\u82d1')\",\n        'name': '\u658b\u4e66\u82d1',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('101\u770b\u4e66')\",\n        'name': '101\u770b\u4e66',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u4e07\u76f8\u4e66\u57ce')\",\n        'name': '\u4e07\u76f8\u4e66\u57ce',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u8f7b\u5c0f\u8bf4\u6587\u5e93')\",\n        'name': '\u8f7b\u5c0f\u8bf4\u6587\u5e93',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u8f7b\u4e4b\u6587\u5e93')\",\n        'name': '\u8f7b\u4e4b\u6587\u5e93',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u4e2d\u534e\u5178\u85cf')\",\n        'name': '\u4e2d\u534e\u5178\u85cf',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u6bd2\u820c\u5f71\u89c6')\",\n        'name': '\u6bd2\u820c\u5f71\u89c6',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u81ea\u5b9a\u4e49\u641c\u7d22\u6e90(\u591a\u4e2a\u7528\u82f1\u6587,\u5206\u5272)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u81ea\u5b9a\u4e49\u670d\u52a1\u5668(\u53ef\u4e0d\u586b)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u81ea\u5b9a\u4e49\u8bc4\u8bba\u989c\u8272(\u53ef\u4e0d\u586b)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u6bb5\u8bc4\u6c14\u6ce1\u6837\u5f0f(0-4)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)\",\n        \"type\": \"text\"\n    }\n]","loginUrl":"\/\/ \u5f53\u524d\u4e66\u6e90\u7248\u672c\u53f7\uff0c\u5207\u52ff\u4fee\u6539\uff0c\u5426\u5219\u5f71\u54cd\u66f4\u65b0\u7684\u8bc6\u522b\nconst localVersion = '5.1.25';\nlet controlUrl = host[0];\nfunction login(flag) {\n    if (flag == undefined) {\n        result = JSON.parse(source.getLoginInfo())\n    } else {\n        java.longToast(\"\\n\\n\ud83d\udc9e\u6b63\u5728\u767b\u5f55\u4e2d...\")\n        putLoginInfo(JSON.stringify(result))\n    }\n    let base_url = getArgument('server')\n    let zdyserver = String(result['\u81ea\u5b9a\u4e49\u670d\u52a1\u5668(\u53ef\u4e0d\u586b)']);\n    if (zdyserver.includes('http')) {\n        setArgument('server', zdyserver);\n        if (getKey(String(cookie.getCookie(base_url)))) {\n            let cookies = cookie.getCookie(base_url)\ntry{cookie.removeCookie(base_url)} catch(e){}\n            cookie.setCookie(zdyserver, cookies)\n        }\n        java.toast(`\\n\\n\u5f53\u524d\u670d\u52a1\u5668\u4e3a\u81ea\u5b9a\u4e49\u670d\u52a1\u5668\\n${zdyserver}\\n\\n\u5207\u6362\u670d\u52a1\u5668\u8bf7\u5148\u6e05\u7a7a\u670d\u52a1\u5668\u5730\u5740\u4e2d\u7684\u6570\u636e`);\n    }\n    let plcolor = String(getArgument('plcolor')  || result['\u81ea\u5b9a\u4e49\u8bc4\u8bba\u989c\u8272(\u53ef\u4e0d\u586b)'] || '#000000');\n    if (plcolor) {\n        setArgument('plcolor', plcolor);\n    } else {\n        setArgument('plcolor', '#000000');\n    }\n    let zdysources = String(result['\u81ea\u5b9a\u4e49\u641c\u7d22\u6e90(\u591a\u4e2a\u7528\u82f1\u6587,\u5206\u5272)'] || '');\n    if (zdysources) {\n        setArgument('sources', zdysources);\n    };\n    base_url = getArgument('server')\n    let register_email = String(result['\u90ae\u7bb1'])\n    let password = String(result['\u5bc6\u7801'])\n    let key = String(result['\u5bc6\u94a5'] || '')\n\n    if ((register_email && password || key) && !String(getKey(String(cookie.getCookie(base_url))))) {\n        try{cookie.removeCookie(base_url)} catch(e){}\n        let deviceKey = '';\n        try {\n            deviceKey = java.deviceID();\n        } catch (e) {\n            deviceKey = java.androidId();\n        };\n        let deviceId = deviceKey;\n        if (register_email && password) {\n            let options = JSON.stringify({\n                method: 'POST',\n                headers: {\n                    'Content-Type': 'application\/json'\n                },\n                body: JSON.stringify({\n                    register_email: result['\u90ae\u7bb1'],\n                    password: result['\u5bc6\u7801']\n                })\n            })\n            try {\n                let data = JSON.parse(java.ajax(`${base_url}\/login_api,${options}`))\n                if (data.code == 0) {\n                    \/\/java.toast(deviceId)\n                    java.toast(\"\\n\\n\u2705\ufe0f\u767b\u5f55\u6210\u529f\")\n                    cookie.setCookie(base_url, `qttoken=${data.key};deviceId=${deviceId}`)\n                    result['\u5bc6\u94a5'] = data.key\n                    setArgument('qttoken', data.key);\n                    putLoginInfo(JSON.stringify(result))\n                } else {\n                    java.toast('\\n\\n\ud83d\udc94' + data.msg || \"\u767b\u5f55\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5\uff01\")\n                }\n            } catch (e) {\n                java.toast(\"\\n\\n\ud83d\udc94\u767b\u5f55\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5\uff01\\n\" + e.message)\n            }\n        } else {\n            cookie.setCookie(base_url, `qttoken=${key};deviceId=${deviceId}`)\n            let res = java.ajax(`${base_url}\/user_api,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n            try {\n                res = JSON.parse(res)\n                if (res.id != undefined) {\n                    setArgument('qttoken', key);\n                    java.toast('\\n\\n\u5bc6\u94a5\u767b\u5f55\u6210\u529f')\n                    result['\u90ae\u7bb1'] = res.email\n                    putLoginInfo(JSON.stringify(result))\n                } else {\n                    throw new Error()\n                }\n            } catch (e) {\n                java.log(e)\n                java.toast(\"\\n\\n\ud83d\udc94\u767b\u5f55\u5931\u8d25\")\n            }\n        }\n    } else if (flag && String(getKey(String(cookie.getCookie(base_url))))) {\n        java.toast(\"\\n\\n\u5f53\u524d\u2705\ufe0f\u5df2\u767b\u5f55\uff0c\u8bf7\ud83d\udeab\u9000\u51fa\u767b\u5f55\u540e\u91cd\u65b0\u767b\u5f55\");\n        \/\/checkStatus();\n    } else if (flag) {\n        java.toast(\"\\n\\n\u26d4\ufe0f\u8bf7\u5148\u586b\u5199\u90ae\u7bb1\u548c\u5bc6\u7801\");\n    }\n}\n\nfunction objectToCookieString(obj) {\n  if (!obj || typeof obj !== 'object') {\n    return '';\n  }\n  return Object.entries(obj)\n    .map(([key, value]) => {\n      const stringValue = String(value);\n      const encodedKey = encodeURIComponent(key);\n      const encodedValue = encodeURIComponent(stringValue);\n      return `${encodedKey}=${encodedValue}`;\n    })\n    .join('; ');\n}\n\nfunction control(){\n    controlUrla = getArgument('controlUrl');\n    if (controlUrla){\n        controlUrla = findFirstAvailableHost([controlUrla]);\n    }\r\n    if (!controlUrla) {\n        controlUrla = findFirstAvailableHost(host) || controlUrl;\n    }\n    setArgument('controlUrl', controlUrla);\n    try {\n    \tlet open_argument = source.getVariable();\n    \topen_argument=JSON.parse(open_argument);\n    \tlet control_cookie = objectToCookieString(open_argument);\n    cookie.setCookie(controlUrla, control_cookie);\n    \t} catch{}\n      \/\/java.toast(cookie.getCookie(controlUrla))\n    \tjava.startBrowserAwait(controlUrla + '\/control', '\u6674\u5929\u5c0f\u8bf4\u8bbe\u7f6e');\n    applyCookieSettings();\n\t}\n\nfunction applyCookieSettings() {\n\t  let controlUrla = getArgument('controlUrl') || controlUrl;\n\t  \tvar cookieStr = String(cookie.getCookie(controlUrla));\n    \n    var cookieData = {};\n    if (cookieStr && cookieStr !== 'null' && cookieStr !== 'undefined' && cookieStr !== '') {\n        var pairs = cookieStr.split('; ');\n        for (var i = 0; i < pairs.length; i++) {\n            var pair = pairs[i];\n            var eqIndex = pair.indexOf('=');\n            if (eqIndex > -1) {\n                var key = pair.substring(0, eqIndex).trim();\n                var value = decodeURIComponent(pair.substring(eqIndex + 1).trim());\n                cookieData[key] = value;\n                setArgument(key, value);\n            }\n        }\n    }\n    \n    var displayConfig = [\n        { key: 'server', label: '\u670d\u52a1\u5668', defaultValue: host[0] },\n        { key: 'proxy', label: '\u8bbf\u95ee\u6a21\u5f0f', defaultValue: '\u4e91\u7aef' },\n        { key: 'tab', label: '\u9605\u8bfb\u6a21\u5f0f', defaultValue: '\u5c0f\u8bf4' },\n        { key: 'source_type', label: '\u9605\u8bfb\u9891\u9053', defaultValue: '\u7537\u9891' },\n        { key: 'sources', label: '\u4e66\u6e90\u9009\u62e9', defaultValue: '\u5168\u90e8' },\n        { key: 'fqpara', label: '\u6bb5\u8bc4\u663e\u793a', defaultValue: 'on' },\n        { key: 'disabled_sources', label: '\u5f3a\u5236\u641c\u7d22', defaultValue: '0' },\n        { key: 'reading', label: '\u540c\u6b65\u4e66\u67b6', defaultValue: '0' },\n        { key: 'info', label: '\u5b8c\u6574\u7b80\u4ecb', defaultValue: 'on' }\n    ];\n    \n    var valueMap = {\n        \/\/ \u8bbf\u95ee\u6a21\u5f0f\n        '\u672c\u5730': '\ud83d\udcbb \u672c\u5730',\n        '\u4e91\u7aef': '\u2601\ufe0f \u4e91\u7aef',\n        \n        \/\/ \u5f00\u5173\u72b6\u6001\n        'on': '\u2705 \u5f00\u542f',\n        'off': '\u274c \u5173\u95ed',\n        '1': '\u2705 \u5f00\u542f',\n        '0': '\u274c \u5173\u95ed',\n        \n        \/\/ \u9891\u9053\u7c7b\u578b\n        '\u7537\u9891': '\ud83d\udc68 \u7537\u9891',\n        '\u5973\u9891': '\ud83d\udc69 \u5973\u9891',\n        \n        \/\/ \u5185\u5bb9\u7c7b\u578b\n        '\u5c0f\u8bf4': '\ud83d\udcd6 \u5c0f\u8bf4',\n        '\u542c\u4e66': '\ud83c\udfa7 \u542c\u4e66',\n        '\u6f2b\u753b': '\ud83c\udfa8 \u6f2b\u753b',\n        '\u77ed\u5267': '\ud83c\udfac \u77ed\u5267',\n        \n        \/\/ \u6765\u6e90\u7c7b\u578b\n        'vip': '\ud83d\udc8e VIP\u4e13\u5c5e',\n        'svip': '\ud83d\udc51 SVIP\u4e13\u5c5e',\n        '\u63a8\u8350': '\u2b50 \u7f51\u53cb\u63a8\u8350',\n        '\u5168\u90e8': '\ud83d\udcda \u5168\u90e8'\n    };\n    \n\n    var displayLines = [];\n    \n    for (var i = 0; i < displayConfig.length; i++) {\n        var config = displayConfig[i];\n        var value = cookieData[config.key] || config.defaultValue;\n        \n        if (!cookieData[config.key]) {\n            setArgument(config.key, config.defaultValue);\n        }\n        \n        var displayValue = valueMap[value] || value;\n        if (config.key === 'sources' && displayValue.length > 25) {\n            displayValue = displayValue.substring(0, 25) + '...';\n        }\n        \n        displayLines.push(config.label + ': ' + displayValue);\n    }\n    \n    \/\/ \u6784\u5efa\u63d0\u793a\u6a21\u677f\n    var template = '\u2728 \u5f53\u524d\u914d\u7f6e\\n';\n    template += '\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\\n';\n    template += displayLines.join('\\n');\n    template += '\\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\\n';\n    template += '\u2764\ufe0f\u5f53\u524d\u5e94\u7528\u7684 *\u2699\ufe0f\u4e66\u6e90\u8bbe\u7f6e* \u4e2d\u7684\u914d\u7f6e\u54e6\u2764\ufe0f'\n    \n    \/\/ \u663e\u793a\u63d0\u793a\n    java.longToast(template);\n    \n    return displayLines.length;\n}\n\n\nfunction reCookieSettings(){\n\tlet controlUrla = getArgument('controlUrl') || controlUrl;\n    cookie.removeCookie(controlUrla);\n    applyCookieSettings();\n    \n}\n\/\/ \u68c0\u6d4b\u670d\u52a1\u5668\nfunction checkNet() {\n    let url = getArgument('server');\n    java.longToast(`\\n\\n\u267b\ufe0f\u6b63\u5728\u68c0\u6d4b\uff1a${url}\\n\u8bf7\u7a0d\u7b49~`);\n    let date1 = new Date().getTime();\n    let html = java.ajax(url + '\/login');\n    let date2 = new Date().getTime();\n    let t = date2 - date1;\n    let c = String(html).indexOf('\u6674\u5929');\n    let code = 1;\n    let time = t \/ 1000 + 's';\n    let logTime = '\u3010' + url + '\u3011\\n\u250b\u250b\\n' + '\u89e3\u6790\u65f6\u95f4\uff1a' + time;\n    if (c == -1 || t > 5000) {\n        java.longToast('\\n\ud83d\udc94\u3010\u8bbf\u95ee\u5931\u8d25\u63d0\u793a\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2663\ufe0f\u5f53\u524d\u63a5\u53e3\u65e0\u6cd5\u8bbf\u95ee(\u53ef\u80fd\u88ab\u5899)\u2663\ufe0f\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\/\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    } else if (t < 1000) {\n        java.longToast('\\n\ud83d\udc96\u3010\u7f51\u7edc\u73af\u5883\u4f18\u826f\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2764\ufe0f\u5ef6\u8fdf\u4f4e\uff0c\u63a8\u8350\u4f7f\u7528\u6b64\u63a5\u53e3\u2764\ufe0f\\n\u250b\u250b\\n\u7f51\u7edc\u73af\u5883\u4f18\u826f\uff0c\u8bf7\u7ee7\u7eed\u4fdd\u6301\u72b6\u6001\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    } else if (t >= 1000 && t < 2000) {\n        java.longToast('\\n\ud83d\udc9b\u3010\u7f51\u7edc\u73af\u5883\u4e00\u822c\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2666\ufe0f\u5ef6\u8fdf\u4e00\u822c\uff0c\u52c9\u5f3a\u53ef\u4f7f\u7528\u2666\ufe0f\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\u6216\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    } else if (t >= 2000 && t < 5000) {\n        java.longToast('\\n\ud83d\udc94\u3010\u7f51\u7edc\u73af\u5883\u582a\u5fe7\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2660\u5ef6\u8fdf\u8fc7\u9ad8\uff0c\u4e0d\u5efa\u8bae\u4f7f\u7528\u2660\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\u6216\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    }\n}\n\n\nfunction findFirstAvailableHost(hosts) {\n    \/\/ \u6309\u987a\u5e8f\u68c0\u6d4b\uff0c\u627e\u5230\u7b2c\u4e00\u4e2a\u53ef\u7528\u7684\u5c31\u8fd4\u56de\n    for (var i = 0; i < hosts.length; i++) {\n        var host = hosts[i];\n        \n        try {\n            java.longToast(\"\ud83d\udd0d \u6b63\u5728\u68c0\u6d4b: \" + host);\n            \n            var start = new Date().getTime();\n            var response = java.ajax(host + \"\/login\");\n            var end = new Date().getTime();\n            var time = end - start;\n            \n            \/\/ \u68c0\u67e5\u662f\u5426\u53ef\u7528\n            if (String(response).indexOf(\"\u6674\u5929\") !== -1 && time <= 5000) {\n                \/\/ \u663e\u793a\u7ed3\u679c\n                var status = \"\u2705 \u53ef\u7528\";\n                if (time < 1000) {\n                    status = \"\ud83d\udc9a \u4f18\u79c0\";\n                } else if (time < 2000) {\n                    status = \"\ud83d\udc9b \u4e00\u822c\";\n                } else {\n                    status = \"\ud83e\udde1 \u8f83\u6162\";\n                }\n                java.longToast(status + \"\\n\u4e3b\u673a: \" + host + \"\\n\u5ef6\u8fdf: \" + time + \"ms\");\n                return host; \/\/ \u76f4\u63a5\u8fd4\u56de\u627e\u5230\u7684\u4e3b\u673a\n            }\n        } catch (e) {\n            \/\/ \u8fd9\u4e2a\u4e3b\u673a\u5931\u8d25\uff0c\u7ee7\u7eed\u4e0b\u4e00\u4e2a\n        }\n    }\n    \n    \/\/ \u6240\u6709\u4e3b\u673a\u90fd\u4e0d\u53ef\u7528\n    java.longToast(\"\u274c \u6ca1\u6709\u53ef\u7528\u7684\u4e3b\u673a\");\n    return null;\n}\nfunction isVips(res) {\n    let isVIP = '';\n    let vipEndTime = res.vip_end_time;\n    let formattedDate = '';\n\n    if (vipEndTime && vipEndTime !== 0) {\n        let date = new Date(vipEndTime * 1000);\n        formattedDate = `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`;\n        let currentTime = Math.floor(Date.now() \/ 1000);\n        let remainingDays = Math.ceil((vipEndTime - currentTime) \/ (24 * 60 * 60));\n        if (currentTime > vipEndTime) {\n            isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} (\u5df2\u8fc7\u671f)`;\n        } else if (remainingDays <= 7) {\n            isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} \u5269\u4f59${remainingDays}\u5929`;\n        } else {\n            if (vipEndTime < 1912946812) {\n                isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"}(${formattedDate})`;\n            } else {\n                isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} (\u6c38\u4e45)`;\n            }\n        }\n    } else {\n        isVIP = '\u60a8\u5c1a\u672a\u5f00\u901aVIP';\n    }\n    return isVIP;\n}\n\nfunction checkStatus() {\n    java.longToast('\\n\\n\u267b\ufe0f\u68c0\u6d4b\u4e2d...');\n    let base_url = getArgument('server')\n    let res = java.ajax(`${base_url}\/user_api,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n    try {\n        res = JSON.parse(res)\n        if (res.id != undefined) {\n            result['\u90ae\u7bb1'] = res.email\n            putLoginInfo(JSON.stringify(result))\n            let devices\n            try {\n                devices = Object.keys(JSON.parse(res.device)).length;\n            } catch (e) {\n                devices = res.device ? 1 : 0;\n            }\n            let isVip = isVips(res);\n            tips = `\n\u250f\u2505\u2505\u2505\u2505\u2505\u2505\u2531\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2510\n\u3000 \ud83e\udde2\u6635\u79f0 \u3000\u3000\u3000\u3000${res.nickname.padEnd(20,\"\\t\") || \"\u672a\u8bbe\u7f6e\".padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\u2709\ufe0f\u90ae\u7bb1\u3000\u3000\u3000\u3000${res.email.replace(\/(.{3}).*?@\/,\"$1***@\").padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udd11\u5bc6\u94a5\u3000\u3000\u3000\u3000${(`${res.user_key.substring(0,4)}***${res.user_key.slice(-4)}`).padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udcc5\u6ce8\u518c\u65f6\u95f4\u3000\u3000${java.timeFormat(res.register_time*1000).padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\uddd2\ufe0f\u4eca\u65e5\u9605\u8bfb\u3000\u3000${(java.timeFormat(new Date()).slice(0,10)==java.timeFormat(res.last_read_time * 1000).slice(0,10)?res.day_read_count:0).toString().padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udcda\u7d2f\u8ba1\u9605\u8bfb\u3000\u3000${res.all_read_count.toString().padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udd53\u6700\u540e\u9605\u8bfb\u3000\u3000${(res.last_read_time != 0?java.timeFormat(res.last_read_time * 1000):'\u672a\u9605\u8bfb').padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udcf1\u5728\u7ebf\u8bbe\u5907\u3000\u3000${devices.toString().padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udc51\u4f1a\u5458\u72b6\u6001\u3000\u3000${isVip.padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udeab\u5c01\u7981\u72b6\u6001\u3000\u3000${res.is_banned?'\u5df2\u5c01\u7981':'\u6b63\u5e38\u3000'}\u3000\u3000\u3000\u3000\u3000\u3000\u3000\n\u2517\u2505\u2505\u2505\u2505\u2505\u2505\u2539\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2518\n`\n            java.log(tips)\n            java.longToast(tips)\n        } else {\n            throw new Error(res.msg)\n        }\n    } catch (e) {\n        \/\/java.log(e)\n        java.toast(\"\\n\u68c0\u6d4b\u767b\u5f55\u5931\u8d25\\n\" + e.message)\n    }\n}\n\nfunction clearDevice() {\n    let base_url = getArgument('server')\n    let res = java.ajax(`${base_url}\/clear,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n    res = JSON.parse(res);\n   java.toast(res.code == 0 ? \"\\n\\n\ud83d\udcf4\u8bbe\u5907\u6e05\u9664\u6210\u529f\" : res.msg)\n    Packages.java.lang.Thread.sleep(500)\n    checkStatus()\n}\n\/\/ \u4fdd\u5b58\u767b\u5f55UI\u4fe1\u606f\nfunction putLoginInfo(info) {\n    try {\n        let key = java.androidId()\n        let encodeStr = Packages.android.util.Base64.encodeToString(java.createSymmetricCrypto(\"AES\", key).encrypt(info), 2)\n        cache.put(`userInfo_${source.getKey()}`, encodeStr)\n        return true\n    } catch (e) {\n        java.log(e)\n        return source.putLoginInfo(info)\n    }\n}\n\n\/\/ \u7528\u6237\u540e\u53f0\nfunction loginqt() {\n\t   let base_url = getArgument('server');\n\t   let ck = String(cookie.getKey(base_url, \"qttoken\"));\n\t   if (!ck) {\n\t   \tjava.longToast('\\n\\n\ud83d\udeab\u8bf7\u5148\u767b\u5f55!')\n\t   \t} else {\n\t   \t\tjava.startBrowserAwait(getArgument('server') + '\/user', '\u6674\u5929\u5c0f\u8bf4\u540e\u53f0');\n\t   \t\t}\n    }\n\n\/\/ \u7528\u6237\u6ce8\u518c\nfunction register() {\n\t   let base_url = getArgument('server');\n\t   \tjava.startBrowserAwait(getArgument('server') + '\/register', '\u6674\u5929\u5c0f\u8bf4\u6ce8\u518c');\n    }\n\n\/\/\u767b\u5f55\u756a\u8304\nfunction fq_login() {\n    try {\n        java.startBrowserAwait(\"https:\/\/fanqienovel.com\/\", \"\u767b\u5f55\")\n    } catch (e) {\n        java.toast(e)\n    }\n    try {\n        cookie.removeCookie(\"snssdk.com\")\n    } catch (e) {}\n    var cookie_ = \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : source.getLoginInfoMap()['\u624b\u52a8\u767b\u5f55Token'])\n    let user\n    try {\n        user = JSON.parse(java.ajax(\"https:\/\/fanqienovel.com\/api\/user\/info\/v2,\" + JSON.stringify({\n            method: \"GET\",\n            headers: {\n                \"Cookie\": cookie_\n            }\n        }))).data.name\n    } catch (e) {\n        java.log(e)\n    }\n    if (!cookie_ || cookie_ == \"sessionid=\" || !user) {\n        java.toast(\"\u672a\u83b7\u53d6\u5230\u767b\u5f55\u51ed\u636e\uff0c\u767b\u5f55\u5931\u8d25\")\n        return false\n    }\n    java.toast(\"\\n\\n\u6b22\u8fce \" + user + \"\\n\u767b\u5f55\u6210\u529f\uff01\")\n    return true\n}\n\n\/\/\u9000\u51fa\u767b\u5f55\nfunction logout() {\n    cookie.removeCookie(\"fanqienovel.com\");\n    cookie.removeCookie(\"snssdk.com\");\n    cookie.removeCookie(\"69shuba.com\");\n    \/*\n    let servers = host\n    for (let server of servers) {\n    \ttry{removeCookie(server )} catch(e){cookie.removeCookie(server )}\n    }\n    *\/\ntry{cookie.removeCookie(getArgument('server'))} catch(e){}\n    java.toast(\"\u9000\u51fa\u767b\u5f55\u6210\u529f\");\n}\n\n\/\/\u83b7\u53d6\u53c2\u6570\nfunction getArgument(key) {\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    return open_argument[key];\n}\n\n\/\/\u8bbe\u7f6e\u53c2\u6570\nfunction setArgument(key, value) {\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    open_argument[key] = value;\n    open_argument = JSON.stringify(open_argument);\n    source.setVariable(open_argument);\n    return open_argument;\n}\n\n\/\/ \u8bbe\u7f6e\u672c\u5730or\u4e91\u7aef\u8bbf\u95ee\nfunction get_proxy() {\n    let proxy = getArgument('proxy');\n    if (proxy == '\u672c\u5730') {\n        setArgument('proxy', '\u4e91\u7aef');\n        java.longToast('\\n\u6240\u6709\u6570\u636e\u91c7\u7528\\n\\n\u670d\u52a1\u5668\u7f51\u7edc\u8bbf\u95ee\\n\\n\u5982\u679c\u53d1\u73b0\u7528\u4e0d\u4e86\uff0c\u8bf7\u5207\u6362\u672c\u5730\u7f51\u7edc\u8bbf\u95ee\uff0c\u598269\u4e66\u5427');\n    } else {\n        setArgument('proxy', '\u672c\u5730');\n        java.longToast('\\n\u6240\u6709\u6570\u636e\u91c7\u7528\\n\\n\u672c\u5730\u7f51\u7edc\u8bbf\u95ee\\n\\n\u5982\u679c\u53d1\u73b0\u7528\u4e0d\u4e86\uff0c\u8bf7\u5f00\u542f\u7f51\u7edc\u4ee3\u7406\uff0c\u598269\u4e66\u5427');\n    }\n}\n\n\nfunction closeImg() {\n    let close_img = getArgument('close_img');\n    if (close_img == 'on') {\n        setArgument('close_img', 'off');\n        java.longToast('\\n\u663e\u793a\u6587\u4e2d\u56fe\u7247');\n    } else {\n        setArgument('close_img', 'on');\n        java.longToast('\\n\u4e0d\u663e\u793a\u6587\u4e2d\u56fe\u7247');\n    }\n}\n\n\/\/\u8bbe\u7f6e\u7537\u5973\u9891\nfunction set_source_type() {\n    let source_type = getArgument(\"source_type\");\n    if (source_type == '\u5973\u9891') {\n        setArgument(\"source_type\", '\u7537\u9891');\n    java.toast(\"\\n\u53d1\u73b0\u9875\u5df2\u8bbe\u7f6e\u4e3a:\ud83d\ude4b\u200d\u2642\ufe0f\u7537\u9891\" );\n    } else {\n        setArgument(\"source_type\", '\u5973\u9891');\n    java.toast(\"\\n\u53d1\u73b0\u9875\u5df2\u8bbe\u7f6e\u4e3a:\ud83d\ude4b\u200d\u2640\ufe0f\u5973\u9891\" );\n    }\n    \n}\n\nfunction set_reading() {\n\tlet reading = getArgument(\"reading\");\n    if (reading == '1') {\n        setArgument(\"reading\", '0');\n    java.toast(\"\\n\\n\u6674\u5929\u4e66\u67b6\u8bb0\u5f55\u540c\u6b65\u5df2\u5173\u95ed\uff01\" );\n    } else {\n        setArgument(\"reading\", '1');\n    java.longToast(\"\\n\\n\u6674\u5929\u4e66\u67b6\u8bb0\u5f55\u540c\u6b65\u5df2\u5f00\u542f\uff01\\n\u5237\u65b0\u9605\u8bfb\u4e66\u67b6\u5373\u53ef\u5c06\u4e66\u67b6\u4e66\u7c4d\u540c\u6b65\u5230\u6674\u5929\u4e66\u67b6\uff01\" );\n    }\n\n\t}\n\n\/\/\u9996\u9875\nfunction api() {\n    java.startBrowserAwait('http:\/\/vip.gyks.cf', \"\u9996\u9875\");\n}\n\n\/\/\u6253\u8d4f\nfunction vip() {\n\t    let base_url = getArgument('server');\n\t   let ck = String(cookie.getKey(base_url, \"qttoken\"));\n\t   if (!ck) {\n\t   \tjava.longToast('\\n\\n\ud83d\udeab\u8bf7\u5148\u767b\u5f55!')\n\t   \t} else {\n\t   \t\tjava.startBrowserAwait(getArgument('server') + '\/coffee', '\u6674\u5929\u5c0f\u8bf4\u4f1a\u5458\u5f00\u901a');\n\t   \t\t}\n    }\n\nfunction put_sk() {\n\t    \t   \t\tjava.startBrowserAwait( 'https:\/\/sk.gyks.cf', '\u6674\u5929\u4e66\u5e93');\n\t   \t\t\n    }\n\nvar server = getArgument('server');\n\n\/\/\u8bbe\u7f6e\u641c\u7d22\u5a92\u4f53\nfunction set_media(media) {\n    const mediaConfig = {\n        '\u559c\u9a6c\u62c9\u96c5': ['\u542c\u4e66'],\n        '\u756a\u8304': '*',\n        '\u798f\u5229\u5c0f\u8bf4': ['\u5c0f\u8bf4'],\n        '\u5982\u6f2b\u753b': ['\u6f2b\u753b'],\n        '\u5305\u5b50\u6f2b\u753b': ['\u6f2b\u753b'],\n        '\u4e5d\u5996\u6f2b\u753b': ['\u6f2b\u753b'],\n        '\u7ec5\u58eb\u6f2b\u753b': ['\u6f2b\u753b'],\n        '\u798f\u5229\u6f2b\u753b': ['\u6f2b\u753b'],\n        '\u597d\u770b\u6f2b\u753b': ['\u6f2b\u753b'],\n        '\u516d\u6708\u542c\u4e66': ['\u542c\u4e66'],\n        '\u6d77\u6d0b\u542c\u4e66': ['\u542c\u4e66'],\n        '\u9177\u6211\u542c\u4e66': ['\u542c\u4e66'],\n        '\u4e03\u732b': ['\u5c0f\u8bf4', '\u542c\u4e66', '\u77ed\u5267'],\n        '\u6cb3\u9a6c': ['\u77ed\u5267'],\n        '\u8d85\u4f1a\u4e13\u5c5e\u77ed\u5267': ['\u77ed\u5267'],\n        '\u6b6a\u745e\u53e4\u5fb7': ['\u6f2b\u753b'],\n        '\u6bd2\u820c\u5f71\u89c6': ['\u77ed\u5267'],\n        '\u5168\u90e8': '*', \/\/ \u5141\u8bb8\u6240\u6709\u6a21\u5f0f\n        '\u9ed8\u8ba4': ['\u5c0f\u8bf4']\n    };\n\n    const source = getArgument('sources');\n    const allowedModes = mediaConfig[source] || mediaConfig['\u9ed8\u8ba4'];\n    let targetMedia = mediaConfig['\u9ed8\u8ba4'][0];\n    let isAllowed = false;\n\n    if (allowedModes === '*' || allowedModes.includes(media)) {\n        targetMedia = media;\n        isAllowed = true;\n    } else if (Array.isArray(allowedModes)) {\n        targetMedia = allowedModes[0];\n    }\n\n    const message = isAllowed ?\n        `\\n\\n\u5df2\u5207\u6362\u81f3\uff1a${targetMedia}\\n\u8bf7\u91cd\u65b0\u641c\u7d22\u4e66\u7c4d\uff01` :\n        `\\n\\n\u76ee\u524d${source}\uff1a\u4e0d\u652f\u6301\u3010${media}\u3011\u6a21\u5f0f\uff01\\n\u5df2\u81ea\u52a8\u5207\u6362\u81f3\uff1a${targetMedia}`;\n\n    setArgument('tab', targetMedia);\n    java.toast(message);\n}\n\n\/\/\u83b7\u53d6\u641c\u7d22\u5a92\u4f53\nfunction get_media() {\n    let media = getArgument('tab');\n    let source = getArgument('sources');\n    if (media == '') {\n        media = '\u5168\u90e8';\n    }\n    var tishi = '\\n\\n\u5f53\u524d\u670d\u52a1\u5668\uff1a' + getArgument('server')\n    java.longToast(`\\n\\n\u5f53\u524d\u4f7f\u7528\u6e90\uff1a${source}-${media}${tishi}`);\n}\n\n\n\/\/\u8bbe\u7f6e\u670d\u52a1\u5668\nfunction set_server() {\n    putLoginInfo(JSON.stringify(result))\n    let zdyserver;\n    let base_url = getArgument('server')\n    try {\n        zdyserver = String(result['\u81ea\u5b9a\u4e49\u670d\u52a1\u5668(\u53ef\u4e0d\u586b)']);\n        if (zdyserver.includes('http')) {\n            setArgument('server', zdyserver);\n            if (getKey(String(cookie.getCookie(base_url)))) {\n                let cookies = cookie.getCookie(base_url)\n                try{cookie.removeCookie(base_url)} catch(e){}\n                cookie.setCookie(zdyserver, cookies)\n            }\n            java.toast(`\\n\\n\u5f53\u524d\u670d\u52a1\u5668\u4e3a\u81ea\u5b9a\u4e49\u670d\u52a1\u5668\\n${zdyserver}\\n\\n\u5207\u6362\u670d\u52a1\u5668\u8bf7\u5148\u6e05\u7a7a\u670d\u52a1\u5668\u5730\u5740\u4e2d\u7684\u6570\u636e`);\n        } else {\n            zdyserver = '';\n        }\n    } catch (error) {\n        zdyserver = '';\n    }\n    if (!zdyserver) {\n        const servers = host\n        const currentServer = getArgument('server') || '';\n        const currentIndex = servers.indexOf(currentServer);\n\n        const nextIndex = currentIndex >= 0 ? (currentIndex + 1) % servers.length : 0;\n        const nextServer = servers[nextIndex];\n\n        setArgument('server', nextServer);\n        if (getKey(String(cookie.getCookie(currentServer)))) {\n            let cookies = cookie.getCookie(currentServer)\ntry{cookie.removeCookie(currentServer)} catch(e){}\n            cookie.setCookie(nextServer, cookies)\n        }\n        java.longToast(`\\n\\n\u670d\u52a1\u5668\u3010${nextIndex+1}\u3011\uff1a${nextServer}`);\n    }\n}\n\n\/\/\u83b7\u53d6\u97f3\u8272\nvar tone_id = getArgument('tone_id');\n\nfunction get_tone_id(arg) {\n    var datadist = {\n        \"0\": \"\u9ed8\u8ba4\u97f3\u8272\",\n        \"-1\": \"\u9605\u8bfb\u6a21\u5f0f\",\n        \"-2\": \"\u6f2b\u753b\u6a21\u5f0f\",\n        \"51\": \"\u591a\u4eba\u53d1\u97f3\",\n        \"1\": \"\u751c\u7f8e\u5c11\u5973\",\n        \"2\": \"\u6e05\u4eae\u9752\u53d4\",\n        \"5\": \"\u5f00\u6717\u9752\u5e74\",\n        \"6\": \"\u6e29\u67d4\u6dd1\u5973\",\n        \"4\": \"\u6210\u719f\u5927\u53d4\",\n        \"74\": \"\u5927\u53d4\u5347\u7ea7\",\n        \"30\": \"\u4f18\u96c5\u5fa1\u59d0\"\n    };\n    var tone_id = datadist[arg] || arg;\n    var tishi = '\\n\\n\u5f53\u524d\u97f3\u8272\uff1a' + tone_id;\n    java.toast(tishi);\n}\n\n\n\/\/\u8bbe\u7f6e\u6765\u6e90\nfunction set_source(sources) {\n    let zdysources = String(result['\u81ea\u5b9a\u4e49\u641c\u7d22\u6e90(\u591a\u4e2a\u7528\u82f1\u6587,\u5206\u5272)'] || '');\n    if (zdysources.length > 1 && zdysources != 'undefined') {\n        java.toast('\\n\\n\u8bf7\u5148\u6e05\u7a7a\u81ea\u5b9a\u4e49\u6e90\u518d\u8bbe\u7f6e');\n    } else {\n        setArgument('sources', sources);\n        set_media('\u5c0f\u8bf4');\n        java.toast(`\\n\\n\u5f53\u524d\u6765\u6e90\u5df2\u5207\u6362\u4e3a:\\n${sources}\\n\\n\u5207\u6362\u540e\u8bf7\u91cd\u65b0\u641c\u7d22`);\n    }\n}\n\n\/\/ \u8bbe\u7f6e\u7b80\u4ecb\nfunction set_info() {\n    var info = getArgument('info');\n    if (info == 'off') {\n        setArgument('info', 'on');\n        java.toast('\\n\\n\u5df2\u6062\u590d\u8be6\u60c5\u9875\u8be6\u7ec6\u7b80\u4ecb');\n    } else {\n        setArgument('info', 'off');\n        java.toast('\\n\\n\u5df2\u7cbe\u7b80\u8be6\u60c5\u9875\u7b80\u4ecb');\n    }\n}\n\n\/\/ \u756a\u8304\u6bb5\u8bc4\nfunction paracomment() {\n    var fqpara = getArgument('fqpara');\n    if (fqpara != 'on') {\n        setArgument('fqpara', 'on');\n        java.longToast(\"\\n\\n\u6bb5\u8bc4\u5df2\u5f00\u542f\\n\\n\u957f\u6309\u5237\u65b0\u6bb5\u540e\u9762\u7684\u56fe\u7247\u5373\u53ef\\n\\n\u5982\u679c\u56fe\u7247\u4e0d\u663e\u793a\uff0c\u5237\u65b0\u65e0\u53cd\u5e94\\n\u8bf7\u66f4\u65b0\u6d4b\u8bd5\u7248\u9605\u8bfbapp\");\n    } else {\n        setArgument('fqpara', 'off');\n        java.longToast('\\n\\n\u6bb5\u8bc4\u5df2\u5173\u95ed');\n    }\n}\n\n\/\/ \u5f3a\u5236\u641c\u7d22\u88ab\u7981\u7528\u7684\u6e90\nfunction disabledSources() {\n    var disabled_sources = getArgument('disabled_sources');\n    if (disabled_sources == '1') {\n        setArgument('disabled_sources', '0');\n        java.longToast('\\n\\n\u5f3a\u5236\u641c\u7d22\u7981\u7528\u7684\u6e90\u5df2\u5173\u95ed');\n    } else {\n        setArgument('disabled_sources', '1');\n        setArgument('sources', '\u5168\u90e8');\n        java.longToast(\"\\n\\n\u5f3a\u5236\u641c\u7d22\u7981\u7528\u7684\u6e90\u5df2\u5f00\u542f\\n\\n\u6ce8\u610f\uff1a\u5f00\u542f\u540e\u641c\u7d22\u65f6\u95f4\u4f1a\u53d8\u957f\uff01\");\n    }\n}\n\n\/\/ \u6211\u8981\u63a8\u8350\nfunction put_book() {\n    java.startBrowserAwait(getArgument('server') + '\/put_book', '\u6211\u6765\u63a8\u8350');\n}\n\n\/\/ \u4e66\u6e90\u66f4\u65b0\nfunction renderVersionPage() {\n    let yd = '';\n    let html = `\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n  <meta charset=\"UTF-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\n  <title>\u4e66\u6e90\u66f4\u65b0<\/title>\n  <!-- Font Awesome \u56fe\u6807\u5e93 -->\n  <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.4.0\/css\/all.min.css\" \/>\n  <style>\n    :root {\n      --primary-gradient: linear-gradient(135deg, #4e6ef2, #6b2dd8);\n      --latest-gradient: linear-gradient(135deg, #8e2de2 0%, #4a00e0 50%, #d4af37 100%);\n      --success-color: #28c76f;\n      --warning-color: #ff9f43;\n      --error-color: #ea5455;\n      --text-main: #1f2937;\n      --text-secondary: #6b7280;\n      --card-bg: #ffffff;\n      --border-color: #e5e7eb;\n      --light-bg: #f9fafb;\n      --shadow: 0 4px 12px rgba(78, 110, 242, 0.1);\n      --shadow-hover: 0 6px 18px rgba(78, 110, 242, 0.2);\n      --glow-shadow: 0 0 25px rgba(142, 45, 226, 0.5), 0 0 50px rgba(212, 175, 55, 0.3);\n      --modal-bg: rgba(31, 41, 55, 0.8);\n      --modal-content-bg: #ffffff;\n    }\n\n    * {\n      box-sizing: border-box;\n      margin: 0;\n      padding: 0;\n      font-family: 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;\n    }\n\n    body {\n      background: linear-gradient(135deg, #eef2ff, #f5f7ff);\n      color: var(--text-main);\n      min-height: 100vh;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      padding: 16px;\n    }\n\n    \/* \u52a0\u8f7d\u52a8\u753b *\/\n    .loading-wrapper {\n      text-align: center;\n      animation: fadeIn 0.3s ease;\n    }\n\n    .loading-spinner {\n      width: 50px;\n      height: 50px;\n      border: 4px solid rgba(78, 110, 242, 0.3);\n      border-top-color: #4e6ef2;\n      border-radius: 50%;\n      margin: 0 auto 20px;\n      animation: spin 1s linear infinite;\n    }\n\n    .loading-text {\n      color: var(--text-main);\n      font-size: 16px;\n      font-weight: 500;\n    }\n\n    @keyframes spin {\n      to { transform: rotate(360deg); }\n    }\n\n    @keyframes fadeIn {\n      from { opacity: 0; transform: translateY(20px); }\n      to { opacity: 1; transform: translateY(0); }\n    }\n\n    @keyframes slideIn {\n      from { opacity: 0; transform: translateY(30px); }\n      to { opacity: 1; transform: translateY(0); }\n    }\n\n    @keyframes pulse {\n      0%, 100% { opacity: 1; }\n      50% { opacity: 0.7; }\n    }\n\n    @keyframes gradientAnimation {\n      0% { background-position: 0% 50%; }\n      50% { background-position: 100% 50%; }\n      100% { background-position: 0% 50%; }\n    }\n\n    @keyframes breathe {\n      0%, 100% { \n        transform: scale(1);\n        box-shadow: var(--glow-shadow), var(--shadow);\n      }\n      50% { \n        transform: scale(1.02);\n        box-shadow: 0 0 30px rgba(142, 45, 226, 0.6), 0 0 60px rgba(212, 175, 55, 0.4), var(--shadow);\n      }\n    }\n\n    @keyframes shimmer {\n      0% {\n        background-position: -200% center;\n      }\n      100% {\n        background-position: 200% center;\n      }\n    }\n\n    \/* \u4e3b\u5bb9\u5668 *\/\n    .container {\n      width: 100%;\n      max-width: 420px;\n      background: var(--card-bg);\n      border-radius: 24px;\n      overflow: hidden;\n      box-shadow: var(--shadow);\n      position: relative;\n      z-index: 1;\n      animation: slideIn 0.5s ease;\n      display: none;\n    }\n\n    \/* \u5934\u90e8 *\/\n    .header {\n      background: var(--primary-gradient);\n      color: #ffffff;\n      padding: 24px 16px;\n      text-align: center;\n      position: relative;\n      overflow: hidden;\n    }\n\n    .header::before {\n      content: '';\n      position: absolute;\n      top: -30px;\n      left: -30px;\n      width: 80px;\n      height: 80px;\n      background: rgba(255, 255, 255, 0.15);\n      border-radius: 50%;\n    }\n\n    .header::after {\n      content: '';\n      position: absolute;\n      bottom: -60px;\n      right: -60px;\n      width: 150px;\n      height: 150px;\n      background: rgba(255, 255, 255, 0.1);\n      border-radius: 50%;\n    }\n\n    .header h1 {\n      font-size: 1.4rem;\n      font-weight: 700;\n      margin-bottom: 8px;\n      position: relative;\n      z-index: 2;\n    }\n\n    .header p {\n      font-size: 0.9rem;\n      opacity: 0.9;\n      line-height: 1.4;\n      position: relative;\n      z-index: 2;\n    }\n\n    .header-icon {\n      font-size: 48px;\n      margin-bottom: 10px;\n      display: inline-block;\n      animation: bounce 2s ease infinite;\n    }\n\n    @keyframes bounce {\n      0%, 100% { transform: translateY(0); }\n      50% { transform: translateY(-10px); }\n    }\n\n    \/* \u7248\u672c\u5bf9\u6bd4 *\/\n    .version-comparison {\n      display: flex;\n      flex-wrap: nowrap;\n      gap: 12px;\n      padding: 16px;\n      margin-top: 8px;\n      position: relative;\n      z-index: 10;\n    }\n\n    .version-card {\n      flex: 1;\n      min-width: 45%;\n      background: var(--card-bg);\n      border-radius: 16px;\n      padding: 28px 16px 16px;\n      box-shadow: var(--shadow);\n      text-align: center;\n      position: relative;\n      transition: transform 0.3s ease, box-shadow 0.3s ease;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n    }\n\n    .version-card:hover {\n      transform: translateY(-4px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .version-card.current-version {\n      background: linear-gradient(135deg, #ffffff 0%, #f8f9ff 100%);\n      border: 1px solid rgba(78, 110, 242, 0.15);\n    }\n\n    .version-card.current-version:hover {\n      box-shadow: 0 6px 20px rgba(78, 110, 242, 0.15);\n    }\n\n    .version-card.current-version h3,\n    .version-card.current-version .version-number,\n    .version-card.current-version .version-date {\n      color: var(--text-main);\n    }\n\n    .version-card.latest-version {\n      background: var(--latest-gradient);\n      background-size: 300% 300%;\n      box-shadow: var(--glow-shadow), var(--shadow);\n      color: #fff;\n      z-index: 2;\n      animation: gradientAnimation 6s ease infinite, breathe 3s ease-in-out infinite;\n      position: relative;\n      overflow: hidden;\n    }\n\n    .version-card.latest-version::before {\n      content: '';\n      position: absolute;\n      top: -50%;\n      left: -50%;\n      width: 200%;\n      height: 200%;\n      background: linear-gradient(\n        90deg,\n        transparent,\n        rgba(255, 255, 255, 0.3),\n        transparent\n      );\n      transform: rotate(45deg);\n      animation: shimmer 3s infinite;\n    }\n\n    .version-card.latest-version h3,\n    .version-card.latest-version .version-number,\n    .version-card.latest-version .version-date {\n      color: #fff;\n      text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\n      position: relative;\n      z-index: 1;\n    }\n\n    .version-status {\n      position: absolute;\n      top: 6px;\n      right: 6px;\n      padding: 3px 7px;\n      font-size: 0.65rem;\n      font-weight: 600;\n      border-radius: 6px;\n      color: #fff;\n      line-height: 1.2;\n      white-space: nowrap;\n      z-index: 2;\n    }\n\n    .version-card.latest-version .version-status {\n      background: rgba(255, 255, 255, 0.25);\n      backdrop-filter: blur(5px);\n      border: 1px solid rgba(255, 255, 255, 0.3);\n      color: #fff;\n      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n    }\n\n    .status-outdated { background: var(--warning-color); }\n    .status-latest { background: var(--success-color); }\n    .status-invalid { background: var(--error-color); }\n\n    .version-card h3 {\n      font-size: 0.9rem;\n      color: var(--text-secondary);\n      margin-bottom: 8px;\n      font-weight: 500;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 6px;\n    }\n\n    .version-number {\n      font-size: 1.25rem;\n      font-weight: 700;\n      color: var(--text-main);\n      margin: 8px 0;\n      transition: all 0.3s ease;\n      font-family: 'Courier New', monospace;\n    }\n\n    .version-card.latest-version .version-number {\n      font-size: 1.4rem;\n      transform: scale(1.05);\n      text-shadow: \n        0 2px 4px rgba(0, 0, 0, 0.3),\n        0 0 10px rgba(212, 175, 55, 0.8),\n        0 0 20px rgba(212, 175, 55, 0.5);\n      animation: pulse-glow 2s ease-in-out infinite;\n    }\n\n    @keyframes pulse-glow {\n      0%, 100% {\n        text-shadow: \n          0 2px 4px rgba(0, 0, 0, 0.3),\n          0 0 10px rgba(212, 175, 55, 0.8),\n          0 0 20px rgba(212, 175, 55, 0.5);\n      }\n      50% {\n        text-shadow: \n          0 2px 4px rgba(0, 0, 0, 0.3),\n          0 0 15px rgba(212, 175, 55, 1),\n          0 0 30px rgba(212, 175, 55, 0.7);\n      }\n    }\n\n    .version-date {\n      font-size: 0.8rem;\n      color: var(--text-secondary);\n      margin-top: 4px;\n    }\n\n    \/* \u7248\u672c\u5bf9\u6bd4\u6307\u793a\u5668 *\/\n    .version-indicator {\n      position: absolute;\n      left: 50%;\n      top: 50%;\n      transform: translate(-50%, -50%);\n      z-index: 5;\n      width: 32px;\n      height: 32px;\n      border-radius: 50%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n      color: white;\n    }\n\n    .version-indicator.update-needed {\n      background: var(--error-color);\n      box-shadow: 0 2px 8px rgba(234, 84, 85, 0.4);\n      animation: pulse-indicator 1.5s infinite;\n    }\n\n    .version-indicator.is-latest {\n      background: var(--success-color);\n      box-shadow: 0 2px 8px rgba(40, 199, 111, 0.4);\n    }\n\n    @keyframes pulse-indicator {\n      0% { transform: translate(-50%, -50%) scale(1); }\n      50% { transform: translate(-50%, -50%) scale(1.1); }\n      100% { transform: translate(-50%, -50%) scale(1); }\n    }\n\n    \/* \u5185\u5bb9\u533a *\/\n    .content-container {\n      padding: 16px;\n    }\n\n    \/* \u72b6\u6001\u63d0\u793a *\/\n    .status-alert {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      padding: 12px 16px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 10px;\n      font-weight: 500;\n      font-size: 14px;\n      animation: slideIn 0.5s ease 0.3s backwards;\n    }\n\n    .status-alert i {\n      font-size: 20px;\n    }\n\n    .status-alert.update-available {\n      background: linear-gradient(135deg, #ffeaa7 0%, #fdcb6e 100%);\n      color: #d63031;\n      box-shadow: 0 4px 15px rgba(253, 203, 110, 0.4);\n    }\n\n    .status-alert.up-to-date {\n      background: linear-gradient(135deg, #55efc4 0%, #00b894 100%);\n      color: white;\n      box-shadow: 0 4px 15px rgba(0, 184, 148, 0.4);\n    }\n\n    \/* \u66f4\u65b0\u5bb9\u5668 *\/\n    .update-container {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      animation: slideIn 0.5s ease 0.4s backwards;\n    }\n\n    .update-header {\n      background: var(--light-bg);\n      padding: 12px 16px;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      border-bottom: 1px solid var(--border-color);\n    }\n\n    .update-header h2 {\n      font-size: 1rem;\n      font-weight: 600;\n      color: var(--text-main);\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .update-header h2 i {\n      color: #4e6ef2;\n    }\n\n    .update-tag {\n      background: rgba(78, 110, 242, 0.1);\n      color: #4e6ef2;\n      padding: 4px 8px;\n      border-radius: 8px;\n      font-size: 0.75rem;\n      font-weight: 600;\n    }\n\n    .update-content {\n      padding: 16px;\n    }\n\n    .update-date {\n      font-weight: 600;\n      color: #4e6ef2;\n      margin-bottom: 12px;\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      padding: 8px 0;\n      border-bottom: 1px dashed #e0e0e0;\n    }\n\n    .update-text {\n      margin: 8px 0;\n      position: relative;\n      padding-left: 16px;\n      line-height: 1.5;\n      color: var(--text-main);\n      font-size: 0.95rem;\n      white-space: pre-wrap;\n      word-break: break-word;\n    }\n\n    .update-text::before {\n      content: '\u2022';\n      position: absolute;\n      left: 0;\n      font-weight: bold;\n      color: #4e6ef2;\n      font-size: 1.2rem;\n      line-height: 1;\n    }\n\n    \/* \u5386\u53f2\u65e5\u5fd7 *\/\n    .history-container {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      animation: slideIn 0.5s ease 0.5s backwards;\n    }\n\n    .history-header {\n      background: var(--light-bg);\n      padding: 12px 16px;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      border-bottom: 1px solid var(--border-color);\n      cursor: pointer;\n      user-select: none;\n    }\n\n    .history-header:hover {\n      opacity: 0.8;\n    }\n\n    .history-header h2 {\n      font-size: 1rem;\n      font-weight: 600;\n      color: var(--text-main);\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .history-header h2 i {\n      color: #4e6ef2;\n    }\n\n    .toggle-history {\n      background: none;\n      border: none;\n      color: var(--text-secondary);\n      cursor: pointer;\n      font-weight: 500;\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      font-size: 0.85rem;\n      transition: color 0.2s ease;\n    }\n\n    .toggle-history:hover {\n      color: #4e6ef2;\n    }\n\n    .history-content {\n      padding: 0 16px;\n      max-height: 0;\n      overflow: hidden;\n      transition: max-height 0.4s ease, padding 0.4s ease;\n    }\n\n    .history-content.expanded {\n      max-height: 60vh;\n      overflow-y: auto;\n      padding: 16px;\n      scrollbar-width: thin;\n      scrollbar-color: #4e6ef2 #f0f0f0;\n    }\n\n    .history-content.expanded::-webkit-scrollbar {\n      width: 6px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-track {\n      background: #f0f0f0;\n      border-radius: 4px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-thumb {\n      background: #4e6ef2;\n      border-radius: 4px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-thumb:hover {\n      background: #3a56d0;\n    }\n\n    .history-item {\n      margin-bottom: 16px;\n      padding-bottom: 16px;\n      border-bottom: 1px dashed var(--border-color);\n    }\n\n    .history-item:last-child {\n      border-bottom: none;\n      margin-bottom: 0;\n      padding-bottom: 0;\n    }\n\n    .history-date {\n      font-weight: 600;\n      color: var(--text-main);\n      margin-bottom: 8px;\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      font-size: 0.9rem;\n      background: rgba(78, 110, 242, 0.05);\n      padding: 6px 10px;\n      border-radius: 6px;\n    }\n\n    .history-text {\n      margin: 8px 0;\n      padding-left: 16px;\n      line-height: 1.4;\n      color: var(--text-secondary);\n      position: relative;\n      font-size: 0.9rem;\n      white-space: pre-wrap;\n      word-break: break-word;\n    }\n\n    .history-text::before {\n      content: '\u2022';\n      position: absolute;\n      left: 0;\n      color: #4e6ef2;\n      font-weight: bold;\n      font-size: 1.2rem;\n      line-height: 1;\n    }\n\n    \/* \u6309\u94ae\u7ec4 *\/\n    .button-group {\n      display: flex;\n      flex-direction: column;\n      gap: 10px;\n      margin-bottom: 16px;\n    }\n\n    .button {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 10px;\n      padding: 14px 28px;\n      text-align: center;\n      font-size: 1rem;\n      border: none;\n      border-radius: 12px;\n      text-decoration: none;\n      background: var(--primary-gradient);\n      color: white;\n      font-weight: 600;\n      transition: all 0.3s ease;\n      box-shadow: var(--shadow);\n      position: relative;\n      overflow: hidden;\n      cursor: pointer;\n    }\n\n    .button i {\n      font-size: 1rem;\n    }\n\n    .button::after {\n      content: '';\n      position: absolute;\n      top: -50%;\n      left: -50%;\n      width: 200%;\n      height: 200%;\n      background: rgba(255, 255, 255, 0.1);\n      transform: rotate(30deg);\n      transition: all 0.6s ease;\n      pointer-events: none;\n    }\n\n    .button:hover {\n      transform: translateY(-3px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .button:hover::after {\n      transform: rotate(30deg) translate(20%, 20%);\n    }\n\n    .button:active {\n      transform: scale(0.95);\n    }\n\n    \/* \u9519\u8bef\u72b6\u6001 *\/\n    .error-state {\n      text-align: center;\n      padding: 40px 20px;\n      color: var(--text-main);\n    }\n\n    .error-icon {\n      font-size: 64px;\n      margin-bottom: 20px;\n      color: var(--error-color);\n    }\n\n    .error-text {\n      font-size: 16px;\n      line-height: 1.6;\n      margin-bottom: 20px;\n    }\n\n    .retry-button {\n      background: var(--primary-gradient);\n      color: white;\n      padding: 12px 30px;\n      border-radius: 12px;\n      border: none;\n      font-weight: 600;\n      cursor: pointer;\n      transition: all 0.3s ease;\n      font-size: 14px;\n      box-shadow: var(--shadow);\n    }\n\n    .retry-button:hover {\n      transform: translateY(-2px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .retry-button:active {\n      transform: scale(0.95);\n    }\n\n    \/* \u88c5\u9970\u5143\u7d20 *\/\n    .decoration {\n      position: absolute;\n      z-index: 0;\n      pointer-events: none;\n    }\n\n    .decoration.circle {\n      width: 120px;\n      height: 120px;\n      border-radius: 50%;\n      background: rgba(107, 45, 216, 0.05);\n      top: 10%;\n      left: 10%;\n    }\n\n    .decoration.square {\n      width: 80px;\n      height: 80px;\n      transform: rotate(45deg);\n      background: rgba(78, 110, 242, 0.05);\n      bottom: 10%;\n      right: 10%;\n    }\n\n    \/* \u54cd\u5e94\u5f0f *\/\n    @media (max-width: 768px) {\n      body {\n        padding: 12px;\n      }\n\n      .container {\n        max-width: 100%;\n        border-radius: 20px;\n      }\n\n      .header {\n        padding: 20px 15px;\n      }\n\n      .header h1 {\n        font-size: 1.3rem;\n      }\n\n      .header-icon {\n        font-size: 40px;\n      }\n\n      .version-comparison {\n        flex-direction: row;\n        flex-wrap: nowrap;\n        gap: 10px;\n        padding: 12px;\n        margin-top: 6px;\n        overflow-x: auto;\n      }\n\n      .version-card {\n        min-width: 45%;\n        padding: 26px 12px 12px;\n      }\n\n      \/* \u79fb\u52a8\u7aef\u51cf\u5f31\u547c\u5438\u52a8\u6548 *\/\n      .version-card.latest-version {\n        animation: gradientAnimation 6s ease infinite;\n      }\n\n      .version-status {\n        top: 5px;\n        right: 5px;\n        padding: 2px 5px;\n        font-size: 0.6rem;\n      }\n\n      .version-number {\n        font-size: 1.1rem;\n      }\n\n      .version-card.latest-version .version-number {\n        font-size: 1.2rem;\n      }\n\n      .update-header h2, .history-header h2 {\n        font-size: 0.9rem;\n      }\n\n      .button {\n        padding: 12px 24px;\n        font-size: 0.95rem;\n      }\n\n      .history-content.expanded {\n        max-height: 50vh;\n        -webkit-overflow-scrolling: touch;\n      }\n    }\n\n    @media (max-width: 380px) {\n      .header h1 {\n        font-size: 1.2rem;\n      }\n\n      .version-number {\n        font-size: 1rem;\n      }\n\n      .version-card.latest-version .version-number {\n        font-size: 1.1rem;\n      }\n\n      .button {\n        padding: 11px;\n        font-size: 0.9rem;\n      }\n    }\n  <\/style>\n<\/head>\n<body>\n  <div class=\"decoration circle\"><\/div>\n  <div class=\"decoration square\"><\/div>\n\n  <div id=\"loading\" class=\"loading-wrapper\">\n    <div class=\"loading-spinner\"><\/div>\n    <div class=\"loading-text\"><i class=\"fas fa-search\"><\/i> \u6b63\u5728\u68c0\u67e5\u66f4\u65b0...<\/div>\n  <\/div>\n\n  <div class=\"container\" id=\"container\">\n    <div class=\"header\">\n      <div class=\"header-icon\"><i class=\"fas fa-book\"><\/i><\/div>\n      <h1>\u6674\u5929\u4e66\u6e90\u66f4\u65b0<\/h1>\n      <p>\u63a8\u8350\u4f7f\u7528\u9605\u8bfb\u6d4b\u8bd5\u7248<br>\u6b63\u5f0f\u7248\u53ef\u80fd\u5b58\u5728\u517c\u5bb9\u6027\u95ee\u9898<\/p>\n    <\/div>\n\n    <div class=\"version-comparison\">\n      <div class=\"version-card current-version\">\n        <div class=\"version-status status-outdated\" id=\"currentStatus\">\u5f85\u68c0\u67e5<\/div>\n        <h3><i class=\"fas fa-cube\"><\/i> \u5f53\u524d\u7248\u672c<\/h3>\n        <div class=\"version-number\" id=\"currentVersion\">-<\/div>\n        <div class=\"version-date\">\u60a8\u7684\u5f53\u524d\u7248\u672c<\/div>\n      <\/div>\n\n      <div class=\"version-indicator update-needed\" id=\"versionIndicator\" style=\"display: none;\">\n        <i class=\"fas fa-arrow-right\"><\/i>\n      <\/div>\n\n      <div class=\"version-card latest-version\">\n        <div class=\"version-status status-latest\" id=\"latestStatus\">\u6700\u65b0\u7248\u672c<\/div>\n        <h3><i class=\"fas fa-star\"><\/i> \u6700\u65b0\u7248\u672c<\/h3>\n        <div class=\"version-number\" id=\"latestVersion\">-<\/div>\n        <div class=\"version-date\">\u53ef\u7528\u6700\u65b0\u7248\u672c<\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"content-container\">\n      <div class=\"status-alert\" id=\"statusAlert\" style=\"display: none;\"><\/div>\n\n      <div id=\"latestLogContainer\" style=\"display: none;\">\n        <div class=\"update-container\">\n          <div class=\"update-header\">\n            <h2><i class=\"fas fa-bolt\"><\/i> \u6700\u65b0\u66f4\u65b0<\/h2>\n            <div class=\"update-tag\">\u6700\u65b0\u53d1\u5e03<\/div>\n          <\/div>\n          <div class=\"update-content\">\n            <div class=\"update-date\" id=\"latestLogDate\"><\/div>\n            <div class=\"update-text\" id=\"latestLogContent\"><\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"button-group\" id=\"buttonGroup\" style=\"display: none;\"><\/div>\n\n      <div class=\"history-container\" id=\"logs\" style=\"display: none;\">\n        <div class=\"history-header\" onclick=\"toggleLogs()\">\n          <h2><i class=\"fas fa-history\"><\/i> \u5386\u53f2\u66f4\u65b0 <span id=\"historyCount\"><\/span><\/h2>\n          <button class=\"toggle-history\" id=\"toggleButton\">\n            <span id=\"toggleText\">\u5c55\u5f00\u5386\u53f2<\/span>\n            <i class=\"fas fa-chevron-down\" id=\"toggleIcon\"><\/i>\n          <\/button>\n        <\/div>\n        <div class=\"history-content\" id=\"logList\"><\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <script>\n  let logsCollapsed = true;\n\n  function toggleLogs() {\n    logsCollapsed = !logsCollapsed;\n    const logList = document.getElementById('logList');\n    const toggleText = document.getElementById('toggleText');\n    const toggleIcon = document.getElementById('toggleIcon');\n    \n    if (logsCollapsed) {\n      logList.classList.remove('expanded');\n      toggleText.textContent = '\u5c55\u5f00\u5386\u53f2';\n      toggleIcon.className = 'fas fa-chevron-down';\n    } else {\n      logList.classList.add('expanded');\n      toggleText.textContent = '\u6536\u8d77\u5386\u53f2';\n      toggleIcon.className = 'fas fa-chevron-up';\n    }\n  }\n\n  (async function() {\n    const loading = document.getElementById('loading');\n    const container = document.getElementById('container');\n    const currentVersion = document.getElementById('currentVersion');\n    const latestVersion = document.getElementById('latestVersion');\n    const currentStatus = document.getElementById('currentStatus');\n    const latestStatus = document.getElementById('latestStatus');\n    const versionIndicator = document.getElementById('versionIndicator');\n    const statusAlert = document.getElementById('statusAlert');\n    const buttonGroup = document.getElementById('buttonGroup');\n    const latestLogContainer = document.getElementById('latestLogContainer');\n    const latestLogDate = document.getElementById('latestLogDate');\n    const latestLogContent = document.getElementById('latestLogContent');\n    const logsContainer = document.getElementById('logs');\n    const logList = document.getElementById('logList');\n    const historyCount = document.getElementById('historyCount');\n\n    const localVer = '${String(localVersion)}';\n\n    \/\/ \u7edf\u4e00\u7684\u670d\u52a1\u5668\u914d\u7f6e - \u65b9\u4fbf\u7ef4\u62a4\n    const serverConfig = {\n      main: {\n        name: '\u4e3b\u7ebf\u8def',\n        icon: 'rocket',\n        baseUrl: 'https:\/\/sy.gyks.cf',\n        downloadPath: '\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E6%99%B4%E5%A4%A9%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup1: {\n        name: '\u5907\u7528\u7ebf\u8def1',\n        icon: 'box',\n        baseUrl: 'http:\/\/v1.gyks.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E6%99%B4%E5%A4%A9%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup2: {\n        name: '\u5907\u7528\u7ebf\u8def2',\n        icon: 'satellite',\n        baseUrl: 'http:\/\/v2.gyks.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E6%99%B4%E5%A4%A9%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup3: {\n        name: '\u5907\u7528\u7ebf\u8def3',\n        icon: 'link',\n        baseUrl: 'http:\/\/v3.gyks.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E6%99%B4%E5%A4%A9%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup4: {\n        name: '\u5907\u7528\u7ebf\u8def4',\n        icon: 'bolt',\n        baseUrl: 'http:\/\/v4.gyks.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E6%99%B4%E5%A4%A9%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup5: {\n        name: '\u5907\u7528\u7ebf\u8def5',\n        icon: 'globe',\n        baseUrl: 'http:\/\/v5.gyks.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E6%99%B4%E5%A4%A9%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup6: {\n        name: '\u5907\u7528\u7ebf\u8def6',\n        icon: 'broadcast-tower',\n        baseUrl: 'http:\/\/101.35.133.34:8888',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E6%99%B4%E5%A4%A9%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      }\n    };\n\n    \/\/ \u7248\u672c\u6bd4\u8f83\u51fd\u6570\n    function compareVersions(vs) {\n      const normalize = (v) => {\n        return v.split('.').map(n => {\n          const num = parseInt(n, 10);\n          return isNaN(num) ? 0 : num;\n        });\n      };\n\n      const parts1 = normalize(localVer);\n      const parts2 = normalize(vs);\n      const maxLength = Math.max(parts1.length, parts2.length);\n      \n      for (let i = 0; i < maxLength; i++) {\n        const num1 = parts1[i] || 0;\n        const num2 = parts2[i] || 0;\n        if (num1 > num2) return 1;\n        if (num1 < num2) return -1;\n      }\n      return 0;\n    }\n\n    async function fetchVersionData() {\n      \/\/ \u4f7f\u7528\u7edf\u4e00\u914d\u7f6e\u4e2d\u9664\u4e3b\u7ebf\u8def\u5916\u7684\u5907\u7528\u7ebf\u8def\u8fdb\u884c\u7248\u672c\u68c0\u67e5\n      const serversToCheck = Object.values(serverConfig).filter(s => s.baseUrl.includes('gyks.cf') || s.baseUrl.includes('101.35'));\n      \n      for (const server of serversToCheck) {\n        try {\n          const response = await fetch(server.baseUrl + '\/version', { timeout: 2000 });\n          if (response.ok) {\n            return await response.json();\n          }\n        } catch (e) {\n          console.warn(\\`\u63a5\u53e3\u5931\u8d25\uff1a\\${server.baseUrl}\\`, e);\n        }\n      }\n      throw new Error('\u6240\u6709\u66f4\u65b0\u63a5\u53e3\u90fd\u8bf7\u6c42\u5931\u8d25');\n    }\n\n    function showError(message) {\n      loading.innerHTML = \\`\n        <div class=\"error-state\">\n          <div class=\"error-icon\"><i class=\"fas fa-exclamation-triangle\"><\/i><\/div>\n          <div class=\"error-text\">\\${message}<\/div>\n          <button class=\"retry-button\" onclick=\"location.reload()\"><i class=\"fas fa-redo\"><\/i> \u91cd\u8bd5<\/button>\n        <\/div>\n      \\`;\n    }\n\n    try {\n      const data = await fetchVersionData();\n      const cloudVersion = String(data.version3);\n      const updateLog = data.update_log || {};\n\n      \/\/ \u663e\u793a\u7248\u672c\u4fe1\u606f\n      currentVersion.textContent = \\`v\\${localVer}\\`;\n      latestVersion.textContent = \\`v\\${cloudVersion}\\`;\n\n      \/\/ \u5904\u7406\u65e5\u5fd7\n      const logEntries = Object.entries(updateLog);\n      if (logEntries.length > 0) {\n        \/\/ \u663e\u793a\u6700\u65b0\u65e5\u5fd7\n        const [latestDate, latestContent] = logEntries[0];\n        latestLogDate.innerHTML = \\`<i class=\"fas fa-calendar-alt\"><\/i> \\${latestDate}\\`;\n        latestLogContent.textContent = latestContent;\n        latestLogContainer.style.display = 'block';\n\n        \/\/ \u663e\u793a\u5386\u53f2\u65e5\u5fd7\n        if (logEntries.length > 1) {\n          const historyLogs = logEntries.slice(1);\n          historyCount.textContent = \\`(\\${historyLogs.length}\u6761)\\`;\n          logList.innerHTML = historyLogs.map(([date, content]) => \\`\n            <div class=\"history-item\">\n              <div class=\"history-date\">\n                <i class=\"fas fa-calendar-day\"><\/i>\n                <span>\\${date}<\/span>\n              <\/div>\n              <div class=\"history-text\">\\${content}<\/div>\n            <\/div>\n          \\`).join('');\n          logsContainer.style.display = 'block';\n        }\n      }\n\n      \/\/ \u68c0\u67e5\u66f4\u65b0\u72b6\u6001\n      const compareResult = compareVersions(cloudVersion);\n      \n      \/\/ \u663e\u793a\u7248\u672c\u6307\u793a\u5668\n      versionIndicator.style.display = 'flex';\n      \n      if (compareResult === -1) {\n        \/\/ \u9700\u8981\u66f4\u65b0\n        currentStatus.textContent = '\u5f85\u66f4\u65b0';\n        currentStatus.className = 'version-status status-outdated';\n        versionIndicator.className = 'version-indicator update-needed';\n        versionIndicator.innerHTML = '<i class=\"fas fa-arrow-right\"><\/i>';\n\n        \/\/ \u4f7f\u7528\u7edf\u4e00\u914d\u7f6e\u751f\u6210\u4e0b\u8f7d\u6309\u94ae\n        buttonGroup.innerHTML = Object.values(serverConfig).map(server => {\n          const fullUrl = server.baseUrl + server.downloadPath;\n          return \\`\n            <a href=\"yuedu:\/\/booksource\/importonline?src=\\${encodeURIComponent(fullUrl)}\" class=\"button\">\n              <i class=\"fas fa-\\${server.icon}\"><\/i>\n              <span>\\${server.name}<\/span>\n            <\/a>\n          \\`;\n        }).join('');\n        buttonGroup.style.display = 'flex';\n      } else {\n        \/\/ \u5df2\u662f\u6700\u65b0\u7248\u672c\n        currentStatus.textContent = '\u6700\u65b0';\n        currentStatus.className = 'version-status status-latest';\n        versionIndicator.className = 'version-indicator is-latest';\n        versionIndicator.innerHTML = '<i class=\"fas fa-check\"><\/i>';\n        \n        statusAlert.className = 'status-alert up-to-date';\n        statusAlert.innerHTML = '<i class=\"fas fa-check-circle\"><\/i> <div>\u60a8\u5df2\u662f\u6700\u65b0\u7248\u672c<\/div>';\n        statusAlert.style.display = 'flex';\n      }\n\n      \/\/ \u663e\u793a\u4e3b\u5bb9\u5668\uff0c\u9690\u85cf\u52a0\u8f7d\n      loading.style.display = 'none';\n      container.style.display = 'block';\n\n    } catch (err) {\n      console.error('\u7248\u672c\u68c0\u67e5\u5931\u8d25\uff1a', err);\n      showError('<i class=\"fas fa-exclamation-circle\"><\/i> \u68c0\u67e5\u66f4\u65b0\u5931\u8d25\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5<br><small>' + err.message + '<\/small>');\n    }\n  })();\n  <\/script>\n<\/body>\n<\/html>\n`;\n    java.startBrowser(`data:text\/html;base64,${java.base64Encode(html)}`, '\u6674\u5929\u4e66\u6e90\u66f4\u65b0');\n}","respondTime":180000,"ruleBookInfo":{"author":"$.author","canReName":"1","coverUrl":"$.thumb_url","init":"<js>\nif (String(baseUrl).startsWith(\"data:\")) {\n    let res = JSON.parse(java.hexDecodeToString(result));\n    let book_id = res.book_id;\n    let tab = res.tab;\n    let sources = res.sources;\n    let url = res.url;\n    let html = \"\";\n    let proxy = getArguments(source.getVariable(), \"proxy\");\n    if (url != \"\" && proxy == \"\u672c\u5730\") {\n        if (sources == '69\u4e66\u5427') {\n            let ck69 = String(cookie.getCookie('https:\/\/www.69shuba.com'));\n            let headers = {\n        \t \"Referer\": url,\n            \"Cookie\": ck69,\n            \"User-Agent\":  java.getWebViewUA()\n             };            \n             let op = JSON.stringify({\n                \"headers\": headers\n            });\n            html = java.ajax(`${url},${op}`);\n        } else {\n            html = java.ajax(url);\n        }\n        \/\/java.log(html);\n        if (html.includes(\"Just a moment...\") && sources == '69\u4e66\u5427') {\n            cookie.removeCookie('https:\/\/www.69shuba.com');\n            java.longToast('\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1');\n            html = java.startBrowserAwait(url, \"\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1\").body();\n\n             java.log(html);\n        }\n    }\n    let base_url = getArguments(source.getVariable(), \"server\");\n    let op = {\n        method: \"POST\",\n        body: {\n            html: html\n        }\n    };\n    op = JSON.stringify(op);\n    let varia = String(book.getVariable('custom'));\n    if (varia == 'null') {\n        varia = '';\n    }\n    varia = JSON.stringify({\n        'custom': varia\n    });\n    \/\/varia = java.base64Encode(varia);\n    java.log(`${base_url}\/detail?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\n    result = java.ajax(`${base_url}\/detail?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\n}\nresult\n<\/js>$.data","intro":"<js>\nlet {\n    book_id,\n    source: sources,\n    tab,\n    book_tts,\n    tags,\n    role,\n    last_chapter_title,\n    last_chapter_update_time,\n    word_number,\n    status,\n    score,\n    abstract,\n    copyright_info\n} = result;\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (proxy == \"\u672c\u5730\") {\n    proxy = \"\u672c\u5730\u7f51\u7edc\";\n} else {\n    proxy = \"\u670d\u52a1\u5668\u7f51\u7edc\";\n}\njava.put(\"book_detail\", JSON.stringify(result));\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet key = \"\";\ntry {\n    let cookieValue =\n        String(cookie.getCookie(base_url)) || String(java.getCookie(base_url));\n    key = getKey(cookieValue);\n} catch (e) {\n    key = \"\";\n}\n\nif (key == \"\") {\n    java.log(\"\u5f53\u524d\u670d\u52a1\u5668\u672a\u67e5\u8be2\u5230\u767b\u5f55\u72b6\u6001\uff0c\u5c1d\u8bd5\u67e5\u8be2\u5176\u4ed6\u670d\u52a1\u5668\u767b\u5f55\u72b6\u6001...\");\n    let cookieValue;\n    for (let h of host) {\n        try {\n            cookieValue = String(cookie.getCookie(h)) || String(java.getCookie(h));\n            key = getKey(cookieValue);\n        } catch (e) {\n            key = \"\";\n        }\n        if (key) {\n            java.log(`\u5df2\u5728${h}\u767b\u5f55\uff0c\u9000\u51fa\u67e5\u8be2\uff0c\u6b63\u5728\u8f6c\u79fb\u767b\u5f55\u72b6\u6001\u5230\u5f53\u524d\u670d\u52a1${base_url}`);\n            \/\/java.log(cookieValue)\n            removeCookie(h);\n            removeCookie(base_url);\n            cookie.setCookie(base_url, cookieValue);\n            break;\n        }\n    }\n}\n\nif (book.readConfig == null || book.readConfig.useReplaceRule == null) {\n    book.setUseReplaceRule(false);\n}\n\nlet nickname = '\u8d26\u53f7\u72b6\u6001\uff1a\u26a0\ufe0f \u672a\u767b\u5f55 | \u70b9\u51fb\u53f3\u4e0a\u89d2 \ud83d\udd16 \u767b\u5f55';\ntry {\n    let opcx = {\n        method: \"GET\",\n        headers: {\n            cookie: 'qttoken=' + key + ';'\n        },\n    };\n    opcx = JSON.stringify(opcx);\n    let user_info = JSON.parse(java.ajax(base_url + '\/get_avatar,' + opcx));\n    if (user_info.code == 0) {\n        if (user_info.nickname) {\n            nickname = '\u6b22\u8fce\u56de\u6765\uff1a' + user_info.nickname\n        } else {\n            nickname = '\u6b22\u8fce\u56de\u6765\uff1a' + user_info.email + \"(\u8bf7\u524d\u5f80\u7528\u6237\u540e\u53f0\u8bbe\u7f6e\u7528\u6237\u540d)\"\n        }\n    }\n} catch (e) {\n    if (key) {\n        nickname = '\u8d26\u53f7\u72b6\u6001\uff1a\u5df2\u767b\u5f55'\n    }\n};\n\nlet loginStatus = nickname;\n\nlet lightDivider = \"\u2747\ufe0f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2747\ufe0f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2747\ufe0f\";\nlet heavyDivider = \"&lrm;\\n&lrm;\";\n\nlet isValid = (value) => String(value).length > 1;\nlet ctitle = book.durChapterTitle || '\u672a\u5f00\u59cb';\nlet info = `\n    \ud83d\udce1 \u5f53\u524d\u670d\u52a1\uff1a${base_url}\n    \ud83d\udd11 ${loginStatus}\n    \ud83c\udff7 \u6570\u636e\u6765\u6e90\uff1a${sources}\n    \ud83d\udd04 \u5f53\u524d\u6a21\u5f0f\uff1a${tab}\n    \u2699\ufe0f \u8bbf\u95ee\u6a21\u5f0f\uff1a${proxy}\n    \ud83d\udcd6 \u9605\u8bfb\u81f3\uff1a${ctitle}\n`;\n\nif (tab == \"\u542c\u4e66\") {\n    \/\/let toneId = getArguments(source.getVariable(), \"tone_id\");\n    let toneId = String(book.getVariable('custom'));\n    if (toneId == '') {\n    \ttoneId= '4';\n    \t}\n    if (isValid(book_tts)) {\n        info += `${lightDivider}\n    \ud83c\udfb5 \u97f3\u8272\u914d\u7f6e\uff1a${toneId}\n    \u2728 AI\u97f3\u8272\u8bf7\u70b9\u51fb\u53f3\u4e0a\u89d2\u4e66\u7c4d\u53d8\u91cf\u586b\u5199\u76f8\u5173\u503c\uff0c\u771f\u4eba\u542c\u4e66\u8bf7\u91cd\u65b0\u641c\u7d22\u9009\u62e9\u5e26\u6709\u4e3b\u64ad\u7684\u4e66\u7c4d\n    ${book_tts}\n`;\n    }\n}\n\nlet basicInfo = \"\";\nlet addBasicInfo = (value, prefix, icon) => {\n    if (isValid(value)) basicInfo += `    ${icon} ${prefix} ${value}\\n`;\n};\n\naddBasicInfo(tags, \"\u4e66\u7c4d\u5206\u7c7b\uff1a\", \"\ud83c\udf08\");\naddBasicInfo(role, \"\u4e66\u7c4d\u4e3b\u89d2\uff1a\", \"\ud83d\udc51\");\naddBasicInfo(last_chapter_title, \"\u6700\u65b0\u7ae0\u8282\uff1a\", \"\ud83d\udcda\");\naddBasicInfo(last_chapter_update_time, \"\u66f4\u65b0\u65f6\u95f4\uff1a\", \"\u23f3\");\naddBasicInfo(word_number, \"\u4e66\u7c4d\u5b57\u6570\uff1a\", \"\ud83d\udcca\");\naddBasicInfo(status, \"\u4e66\u7c4d\u72b6\u6001\uff1a\", \"\ud83d\udea9\");\naddBasicInfo(score, \"\u4e66\u7c4d\u8bc4\u5206\uff1a\", \"\u2b50\");\n\nif (basicInfo) info += `${lightDivider}\\n${basicInfo}`;\n\nif (isValid(abstract)) {\n    let indentedAbstract = abstract\n        .split(\"\\n\")\n        .map((line) => `    ${line}`)\n        .join(\"\\n\");\n    info += `${heavyDivider}\n    \ud83d\udcd6 \u4e66\u7c4d\u7b80\u4ecb\uff1a\n${indentedAbstract}\n`;\n} else {\n    info += `${heavyDivider}`;\n}\n\nif (isValid(copyright_info)) {\n    info += `${lightDivider}\n    \u00a9 ${copyright_info}\n`;\n} else {\n    info += `${lightDivider}`;\n}\n\ninfo += `\n${heavyDivider}\n    \ud83d\udca0\ud83d\udca0\ud83d\udca0 \u6570\u636e\u66f4\u65b0\u4e8e ${new Date().toLocaleString()} \ud83d\udca0\ud83d\udca0\ud83d\udca0\n`;\nlet jjinfo = getArguments(source.getVariable(), \"info\");\n\nif (jjinfo != \"off\") {\n    info = String(info)\n        .split(\"\\n\")\n        .map((line) => line.replace(\/^ {4}\/, \"\"))\n        .join(\"\\n\");\n} else {\n    basicInfo = \"\";\n    addBasicInfo(last_chapter_title, \"\u6700\u65b0\u7ae0\u8282\uff1a\", \"\ud83d\udcda\");\n    addBasicInfo(last_chapter_update_time, \"\u66f4\u65b0\u65f6\u95f4\uff1a\", \"\u23f3\");\n    addBasicInfo(word_number, \"\u4e66\u7c4d\u5b57\u6570\uff1a\", \"\ud83d\udcca\");\n    addBasicInfo(status, \"\u4e66\u7c4d\u72b6\u6001\uff1a\", \"\ud83d\udea9\");\n    addBasicInfo(score, \"\u4e66\u7c4d\u8bc4\u5206\uff1a\", \"\u2b50\");\n    if (isValid(abstract)) {\n        let indentedAbstract = abstract\n            .split(\"\\n\")\n            .map((line) => `    ${line}`)\n            .join(\"\\n\");\n        basicInfo += `\n    \\n&lrm;\n    \ud83d\udcd6 \u4e66\u7c4d\u7b80\u4ecb\uff1a\n${indentedAbstract}\n`;\n    } else {\n        basicInfo += `${heavyDivider}`;\n    }\n    info = `&lrm;\\n\ud83c\udff7 \u6570\u636e\u6765\u6e90\uff1a${sources}\\n` + basicInfo;\n}\n<\/js>","lastChapter":"{{$.source}} {{$.last_chapter_title}} {{$.last_chapter_update_time}}","name":"$.book_name","tocUrl":"<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || \"\u5c0f\u8bf4\";\nlet url = result.toc_url || \"\";\nvar sdtoken;\ntry {\n    var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n    sdtoken = String(loginInfoMap['\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)'] || '');\n} catch (e) {\n    sdtoken = '';\n}\nvar rawCookie = getFanqieCookie() || sdtoken;\nvar match = rawCookie.match(\/sessionid=[^;]+\/);\nvar fqcookie = match ? match[0] : '';\nvar fqssionid = '';\nif (fqcookie) {\n    fqssionid = getSessionId(fqcookie);\n};\nsetArguments('fqssionid', fqssionid);\njava.put(\"tab\", tab);\njava.put(\"book_id\", book_id);\nlet qtcatalog = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url,\n};\nqtcatalog = java.base64Encode(JSON.stringify(qtcatalog));\n`data:;base64,${qtcatalog},{\"type\":\"qingtian2\"}`;\n<\/js>","wordCount":"$.word_number"},"ruleContent":{"content":"<js>\njava.log(result)\nresult = String(java.hexDecodeToString(result));\nlet res;\nif (result.match(\/\u6674\u5929\u878d\u5408\/)) {\n    result = result.split(\"\u6674\u5929\u878d\u54084\");\n    res = {\n        item_id: result[0],\n        tab: result[1],\n        title: result[2],\n        sources: result[3],\n        url: \"\"\n    };\n} else {\n    res = JSON.parse(result);\n}\n\nfunction checkEnv() {\n    let isModified = false;\n    try {\n        new Packages.io.legato.kazusa.utils.TimeoutCancellationException('');\n        isModified = true;\n    } catch (e) {\n        isModified = typeof source.loginUi == 'function' ? false : true;\n    }\n    \n    return isModified;\n}\n\nvar islyc = checkEnv();\nif (islyc) {\n\tbook.imageStyle = 'FULL';\n\t} else {\n\t\tbook.imageStyle = 'TEXT';\n\t\t}\n\nlet varia1 = String(book.getVariable('custom'));\nif (varia1 == 'null') {\n    varia1 = '';\n}\nlet varia = JSON.stringify({\n    'custom': varia1\n});\n\/\/  varia = java.base64Encode(varia);\nlet book_id = res.book_id;\nlet item_id = res.item_id;\nlet tab = res.tab;\nlet title = res.title;\nlet sources = res.sources;\nlet url = res.url;\nlet html = \"\";\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (url != \"\" && proxy == \"\u672c\u5730\") {\n    if (sources == '69\u4e66\u5427') {\n        let ck69 = String(cookie.getCookie('https:\/\/www.69shuba.com'));\n        let headers = {\n            \"Referer\": url,\n            \"Cookie\": ck69,\n            \"User-Agent\": java.getWebViewUA()\n        };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        java.log(url);\n        java.log(op);\n        html = java.ajax(`${url},${op}`);\n    } else {\n        html = java.ajax(url);\n    }\n    java.log('dddddddddddddddddddddddddddd')\n    java.log(html);\n    if (html.includes(\"Just a moment...\") && sources == '69\u4e66\u5427' && book.durChapterIndex === chapter.index) {\n        cookie.removeCookie('https:\/\/www.69shuba.com');\n        java.longToast('\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1');\n        html = java.startBrowserAwait(url, \"\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1\").body();\n        java.log('cscscscs')\n        java.log(html);\n    }\n};\nlet content = \"\";\nlet data;\n\/\/let tone_id = getArguments(source.getVariable(), \"tone_id\");\nlet tone_id = varia1;\nif (tone_id == '') {\n    tone_id = '4';\n}\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet fqpara = getArguments(source.getVariable(), \"fqpara\");\nlet close_img = getArguments(source.getVariable(), \"close_img\");\nlet device, device_type;\ntry {\n    device = java.deviceID();\n    device_type = \"\u82f9\u679c\";\n} catch (e) {\n    try {\n        device = java.androidId();\n        device_type = \"\u5b89\u5353\";\n    } catch (e) {\n        device = \"\";\n        device_type = \"\u5b89\u5353\";\n    }\n}\n\nlet qtcookie = cookie.getCookie(base_url);\ntry {\n    qtcookie = `qttoken=${String(cookie.getKey(base_url, \"qttoken\"))}; deviceId=${device};`\n} catch (e) {}\n\nvar params = {\n    html: html,\n    item_id: item_id,\n    source: sources,\n    tab: tab,\n    tone_id: tone_id,\n    variable: varia,\n    version: '4.11.5.1'\n};\n\nvar content_url = '\/content';\nif ((sources == \"\u756a\u8304\" || sources == \"\u4e03\u732b\" || sources == \"\u5854\u8bfb\") && fqpara && tab == \"\u5c0f\u8bf4\") {\n    content_url = '\/content?review=1';\n}\n\n\/\/var signInfo = generateComplexSignature('POST', content_url, {}, APP_SECRET, params);\n\n\n\/\/var signedParams = copyObject(params);\n\/\/signedParams.timestamp = signInfo.timestamp;\n\/\/signedParams.nonce = signInfo.nonce;\n\/\/signedParams.sign = signInfo.sign;\n\n\nvar op = {\n    method: \"POST\",\n    body: JSON.stringify(params),\n    headers: {\n        cookie: qtcookie,\n        'Content-Type': 'application\/json'\n    }\n};\n\nop = JSON.stringify(op);\n\/\/java.toast(op);\ndata = java.ajax(base_url + content_url + `,${op}`);\ntry {\n    data = JSON.parse(data);\n    if (data.msg) {\n        java.toast(data.msg);\n    }\n} catch (e) {}\ncontent = data.content\n\nif (close_img == 'on') {\n\tcontent = removeAllImgTags(content);\n\t}\n\nif ((sources == \"\u756a\u8304\" || sources == \"\u4e03\u732b\" || sources == \"\u5854\u8bfb\") && fqpara == \"on\" && tab == \"\u5c0f\u8bf4\") {\n    var sdtoken;\n    try {\n        var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n        sdtoken = String(loginInfoMap['\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)'] || '');\n    } catch (e) {\n        sdtoken = '';\n    }\n    var rawCookie = getFanqieCookie() || sdtoken;\n    var match = rawCookie.match(\/sessionid=[^;]+\/);\n    var fqcookie = match ? match[0] : '';\n    var fqssionid = '';\n    if (!fqcookie) {} else {\n        fqssionid = getSessionId(fqcookie)\n    }\n    content = content\n        .replace(\/ident=\"\/g, 'ident=\"' + base_url)\n        .replace(\/book_id=\/g, 'book_id=' + book_id + '&ssionid=' + fqssionid);\n    if (device_type == \"\u82f9\u679c\") {\n        content = paraForiOS(content, sources);\n    } else {\n        content = paraForAndroid(content, sources,islyc);\n    }\n}\ndata = JSON.stringify({\n    content: content,\n});\nif (device_type == \"\u5b89\u5353\" && (tab == \"\u77ed\u5267\" || tab == \"\u89c6\u9891\" || sources == '\u6bd2\u820c\u5f71\u89c6' || sources == 'NT\u52a8\u6f2b')) {\n    data = {\n        content: `\u3010\u53f3\u4e0a\u89d2\u5237\u65b0\u3011\u5f00\u542f\u64ad\u653e(\u4e0b\u4e00\u96c6\u8bf7\u5207\u6362\u4e0b\u4e00\u7ae0\u5237\u65b0)\\n\u64ad\u653e\u76f4\u94fe\uff1a\\n${content}`,\n    };\n    data = JSON.stringify(data);\n    if (book.durChapterIndex === chapter.index) {\n        let video_url = `${base_url}\/online_video?book_id=${book_id}&source=${sources}&tab=${tab}`;\n        if (sources == '\u6bd2\u820c\u5f71\u89c6' || sources == 'NT\u52a8\u6f2b') {\n            video_url = content;\n        };\n        java.startBrowser(video_url, title);\n        java.toast(\"\u6b63\u5728\u52a0\u8f7d\u89c6\u9891...\");\n    }\n\n}\ndata;\n<\/js>$.content"},"ruleExplore":{"author":"$.author","bookList":"$.data","bookUrl":"<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || '\u5c0f\u8bf4';\nlet url = result.toc_url || '';\n\nlet qtdetail = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url\n}\nqtdetail = java.base64Encode(JSON.stringify(qtdetail));\n`data:;base64,${qtdetail},{\"type\":\"qingtian\"}`\n<\/js>","coverUrl":"$.thumb_url","intro":"$.abstract","kind":"{{$.category}}\n{{$.score}}\n{{$.status}}\n{{$.source}}\n{{$.tags}}","lastChapter":"{{$.last_chapter_title}} \u2022 {{$.last_update_time}}","name":"$.book_name","wordCount":"$.word_number"},"ruleSearch":{"author":"$.author","bookList":"$.data","bookUrl":"<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || '\u5c0f\u8bf4';\nlet url = result.toc_url || '';\n\nlet qtdetail = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url\n}\nqtdetail = java.base64Encode(JSON.stringify(qtdetail));\n`data:;base64,${qtdetail},{\"type\":\"qingtian\"}`\n<\/js>","checkKeyWord":"\u6211\u768426\u5c81\u5973\u623f\u5ba2@\u756a\u8304","coverUrl":"$.thumb_url","intro":"$.abstract","kind":"{{$.status}},{{$.score}},{{$.tags}},{{$.last_chapter_update_time}}","lastChapter":"{{$.source}} {{$.last_chapter_title}}","name":"$.book_name##\uff08\u522b\u540d\uff1a.*?\uff09","wordCount":"$.word_number"},"ruleToc":{"chapterList":"<js>\nlet res = JSON.parse(java.hexDecodeToString(result));\nif (res.method) {\n    res = Object.fromEntries(\n        res.body\n        .replace(\"source\", \"sources\")\n        .split(\"&\")\n        .map((query) => query.split(\"=\"))\n    );\n    res.url = \"\";\n}\nlet book_id = res.book_id;\njava.put('book_id', book_id);\nlet tab = res.tab;\nlet sources = res.sources;\nlet url = res.url;\nlet html = \"\";\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (url != \"\" && proxy == \"\u672c\u5730\") {\n    if (sources == '69\u4e66\u5427') {\n        let ck69 = String(cookie.getCookie('https:\/\/www.69shuba.com'));\n        let headers = {\n        \t \"Referer\": url,\n            \"Cookie\": ck69,\n            \"User-Agent\":  java.getWebViewUA()\n             };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        html = java.ajax(`${url},${op}`);    \n    } else {\n        html = java.ajax(url);\n    }\n    \/\/java.log(html);\n    if (html.includes(\"Just a moment...\") && sources == '69\u4e66\u5427') {\n        cookie.removeCookie('https:\/\/www.69shuba.com');\n        java.longToast('\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1');\n        html = java.startBrowserAwait(url, \"\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1\").body();\n\n           java.log(html);\n    }\n};\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet op = {\n    method: \"POST\",\n    body: {\n        html: html\n    }\n};\nop = JSON.stringify(op);\nlet varia = String(book.getVariable('custom'));\nif (varia == 'null') {\n    varia = '';\n}\nvaria = JSON.stringify({\n    'custom': varia\n});\n\/\/ varia = java.base64Encode(varia);\n\/\/java.log(`${base_url}\/catalog?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\nlet data = java.ajax(\n    `${base_url}\/catalog?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`\n);\nlet device, device_type;\ntry {\n    device = java.deviceID();\n    device_type = \"\u82f9\u679c\";\n} catch (e) {\n    try {\n        device = java.androidId();\n        device_type = \"\u5b89\u5353\";\n    } catch (e) {\n        device = \"\";\n        device_type = \"\u5b89\u5353\";\n    }\n}\n\nif (tab == \"\u5c0f\u8bf4\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 8;\n    } else {\n        book.type = 0;\n    }\n} else if (tab == \"\u542c\u4e66\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 32;\n    } else {\n        book.type = 1;\n    }\n} else if (tab == \"\u6f2b\u753b\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 64;\n    } else {\n        book.type = 2;\n    }\n} else if (tab == \"\u77ed\u5267\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 8;\n    } else {\n        book.type = 3;\n    }\n} else {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 8;\n    } else {\n        book.type = 0;\n    }\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet reading = getArguments(source.getVariable(), \"reading\");\n\nif (book && book.order != 0 && reading == '1') {\n    try {\n        if (!data || !book.variable || !base_url || !qtcookie) {\n            java.log('\u7f3a\u5c11\u5fc5\u8981\u53c2\u6570');\n        } else {\n            let parsedData;\n            try {\n                parsedData = JSON.parse(data);\n            } catch (e) {\n                java.log('\u89e3\u6790data\u6570\u636e\u5931\u8d25:' + e);\n            }\n            \n            if (parsedData && parsedData.data && Array.isArray(parsedData.data) && parsedData.data[book.durChapterIndex]) {\n                let ritem = parsedData.data[book.durChapterIndex];\n                let bookInfoObj;\n                try {\n                    bookInfoObj = JSON.parse(book.variable);\n                } catch (e) {\n                    java.log('\u89e3\u6790book.variable\u5931\u8d25:' + e);\n                }\n                \n                if (bookInfoObj) {\n                    let book_info;\n                    try {\n                        book_info = JSON.parse(bookInfoObj.book_detail || JSON.stringify(bookInfoObj));\n                    } catch (e) {\n                        java.log('\u89e3\u6790book_detail\u5931\u8d25:' + e);\n                    }\n                    \n                    if (book_info && typeof book_info === 'object') {\n                        let rurl = base_url + '\/add_book_to_book_shelf,';\n                        book_info['read_status'] = 1;\n                        book_info['last_chapter_item_id'] = ritem.item_id || '';\n                        book_info['last_chapter_title'] = ritem.title || '';\n                        let rop = {\n                            method: \"POST\",\n                            headers: {\n                                cookie: qtcookie\n                            },\n                            body: book_info\n                        };\n                        let check_book_url = base_url + '\/check_book_in_book_shelf,';\n                        let checkResponse;\n                        \n                        try {\n                            checkResponse = java.ajax(check_book_url + JSON.stringify(rop));\n                        } catch (e) {\n                            java.log('\u68c0\u67e5\u4e66\u7c4d\u8bf7\u6c42\u5931\u8d25:' + e);\n                        }\n                        \n                        if (checkResponse) {\n                            let check_data;\n                            try {\n                                check_data = JSON.parse(checkResponse).data;\n                            } catch (e) {\n                                java.log('\u89e3\u6790\u68c0\u67e5\u54cd\u5e94\u5931\u8d25:' + e);\n                            }\n                            try {\n                                if (check_data && check_data.id) {\n                                    book_info['id'] = check_data.id;\n                                    let uurl = base_url + '\/update_book_shelf,';\n                                    java.ajax(uurl + JSON.stringify(rop));\n                                } else {\n                                    java.ajax(rurl + JSON.stringify(rop));\n                                }\n                            } catch (e) {\n                                java.log('\u4e66\u67b6\u64cd\u4f5c\u5931\u8d25:' + e);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    } catch (error) {\n        java.log('\u4e66\u7c4d\u540c\u6b65\u6d41\u7a0b\u5f02\u5e38:' + error);\n        java.longToast('\\n\u540c\u6b65\u9605\u8bfb\u8fdb\u5ea6\u5931\u8d25\uff0c\u4f46\u4e0d\u5f71\u54cd\u9605\u8bfb\uff0c\u53ef\u4ee5\u524d\u5f80\u767b\u5f55\u5173\u95ed\u4e66\u67b6\u540c\u6b65\u529f\u80fd\u3002');\n    }\n}\ndata;\n<\/js>$.data","chapterName":"$.title","chapterUrl":"<js>\nlet tab = result.tab;\nlet sources = result.source;\nlet title = result.title;\nlet item_id = result.item_id;\nlet book_id = java.get(\"book_id\");\nlet url = result.toc_url || \"\";\nlet qtcontent = {\n    book_id: book_id,\n    item_id: item_id,\n    title: title,\n    sources: sources,\n    tab: tab,\n    url: url,\n};\nqtcontent = java.base64Encode(JSON.stringify(qtcontent));\nif (sources == '\u5377') {\n    content_url = item_id\n} else if ((sources == \"\u756a\u8304\" || sources == \"\u4e03\u732b\" || sources == \"\u5854\u8bfb\") && tab == \"\u5c0f\u8bf4\") {\n    var base_url = getArguments(source.getVariable(), \"server\") || \"\";\n    var sdtoken;\n    try {\n        var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n        sdtoken = String(loginInfoMap['\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)'] || '');\n    } catch (e) {\n        sdtoken = '';\n    }\n    var rawCookie = getFanqieCookie() || sdtoken;\n    var match = rawCookie.match(\/sessionid=[^;]+\/);\n    var fqcookie = match ? match[0] : '';\n    var fqssionid = '';\n    if (!fqcookie) {} else {\n        fqssionid = getSessionId(fqcookie)\n    }\n    let sourcess = sources.replace('svip_', '');\n    content_url = `data:;base64,${qtcontent},{\"type\":\"qingtian3\",\"js\":\"book ? result : '${base_url}\/get_review?book_id=${book_id}&item_id=${item_id}&ssionid=${fqssionid}&source=${sourcess}'\"}`;\n} else {\n    content_url = `data:;base64,${qtcontent},{\"type\":\"qingtian3\"}`;\n}\n<\/js>","updateTime":"$.first_pass_time"},"searchUrl":"<js>\nlet base_url = getArguments(source.getVariable(), 'server');\nlet media;\nlet sources = getArguments(source.getVariable(), 'sources') || getArguments(source.getVariable(), 'source');\nlet disabled_sources = getArguments(source.getVariable(), 'disabled_sources') || '0';\nif (String(key).startsWith(\"m:\") || String(key).startsWith(\"m\uff1a\")) {\n    media = \"\u6f2b\u753b\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"t:\") || String(key).startsWith(\"t\uff1a\")) {\n    media = \"\u542c\u4e66\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"d:\") || String(key).startsWith(\"d\uff1a\")) {\n    media = \"\u77ed\u5267\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"x:\") || String(key).startsWith(\"x\uff1a\")) {\n    media = \"\u5c0f\u8bf4\"\n    key = key.slice(2)\n} else {\n    media = getArguments(source.getVariable(), 'tab') || getArguments(source.getVariable(), 'media');\n}\nif (key.includes('@')) {\n    var parts = key.split('@');\n    key = parts[0];\n    sources = parts[1] || sources;\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet op = {\n    method: \"GET\",\n    headers: {\n        cookie: qtcookie\n    },\n};\nop = JSON.stringify(op);\n`${base_url}\/search?title=${key}&tab=${media}&source=${sources}&page={{page}}&disabled_sources=${disabled_sources},${op}`\n<\/js>","weight":0},{"bookSourceComment":"build 2025-11-6\n\u96e8\u843d\u661f\u8fb0\n\u5931\u6548\u53cd\u9988\uff1a961955482","bookSourceGroup":"\u5c0f\u8bf4 \u4e66\u6e90","bookSourceName":"\u7bf1\u7b06\u597d\u6587\uff08\u4f18+++\uff09","bookSourceType":0,"bookSourceUrl":"https:\/\/m.libahao.com","bookUrlPattern":"https:\/\/m.libahao.com\/book\/.+","customOrder":1,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"[{\"title\":\"\u9996\u9875\",\"url\":\"\/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u7384\u5e7b\u9b54\u6cd5\",\"url\":\"\/xuanhuan\/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u6b66\u4fa0\u4fee\u771f\",\"url\":\"\/xiuzhen\/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u90fd\u5e02\u8a00\u60c5\",\"url\":\"\/dushi\/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u5386\u53f2\u519b\u4e8b\",\"url\":\"\/lishi\/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u6e38\u620f\u7ade\u6280\",\"url\":\"\/wangyou\/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u79d1\u5e7b\u7075\u5f02\",\"url\":\"\/kehuan\/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u5973\u751f\u8a00\u60c5\",\"url\":\"\/nvpin\/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"\u5176\u4ed6\u5c0f\u8bf4\",\"url\":\"\/qita\/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}}]","header":"{\n   \"User-Agent\":\"Mozilla\/5.0 (Linux; Android 15; V2243A Build\/AP3A.240905.015.A2) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.7390.122 Mobile Safari\/537.36\"\n  }","lastUpdateTime":"1769503844673","respondTime":180000,"ruleBookInfo":{"author":"[property=\"og:novel:author\"]@content","coverUrl":"img@src","intro":"[property=\"og:description\"]@content","kind":"[property~=category|status|update_time]@content","lastChapter":"[property~=las?test_chapter_name]@content","name":"[property=\"og:novel:book_name\"]@content","tocUrl":"[property=\"og:novel:read_url\"]@content"},"ruleContent":{"content":".chapter-content@html","nextContentUrl":"text.\u4e0b\u4e00\u9875@href"},"ruleExplore":{"author":".book-author@text","bookList":".book-item","bookUrl":"href","coverUrl":"img@src","intro":".book-description@text","name":".book-title@text"},"ruleSearch":{"author":".book-author@text","bookList":".book-list a","bookUrl":"a.0@href","checkKeyWord":"\u4f60\u597d","coverUrl":"img@src","intro":".book-description@text","name":".book-title@text"},"ruleToc":{"chapterList":".chapter-list.1@a","chapterName":"text","chapterUrl":"href"},"searchUrl":"https:\/\/m.libahao.com\/sou?wd={{key}}","weight":0},{"bookSourceComment":"\u4e0b\u9762\u662f\u8be6\u60c5\u9875api\uff0c\u9700\u8981\u7684\u81ea\u884c\u4fee\u6539\n\/api\/novel\/book\/detail.do?bookId={{$.bookId}}&vn=1.0.1.x&m=G8&t={{Date.now()}}&ch=xiaomi&pkg=com.smart.app.jiudianjiu.xin.leisureNovel","bookSourceGroup":"\u5c0f\u8bf4","bookSourceName":"\u95f2\u770b\u514d\u8d39\u5c0f\u8bf4","bookSourceType":0,"bookSourceUrl":"http:\/\/nav.jijia-co.com","customButton":false,"customOrder":1,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"eventListener":false,"exploreUrl":"@js:\nconst list = []\nconst push = (title, url, size) => list.push({\n  title,\n  url,\n  style: {layout_flexBasisPercent: size||0.29}\n});\n\nconst male = [{\"title\":\"\u90fd\u5e02\",\"value\":\"101\"},{\"title\":\"\u5947\u5e7b\u4ed9\u4fa0\",\"value\":\"102\"},{\"title\":\"\u7384\u5e7b\",\"value\":\"103\"},{\"title\":\"\u79d1\u5e7b\u672b\u4e16\",\"value\":\"104\"},{\"title\":\"\u60ac\u7591\u7075\u5f02\",\"value\":\"105\"},{\"title\":\"\u5f02\u80fd\",\"value\":\"106\"},{\"title\":\"\u6b66\u4fa0\",\"value\":\"107\"},{\"title\":\"\u5386\u53f2\",\"value\":\"108\"},{\"title\":\"\u6e38\u620f\",\"value\":\"109\"},{\"title\":\"\u9752\u6625\u6821\u56ed\",\"value\":\"110\"},{\"title\":\"\u6587\u5b66\u4f5c\u54c1\",\"value\":\"111\"}]\nconst female = [{\"title\":\"\u73b0\u4ee3\u8a00\u60c5\",\"value\":\"201\"},{\"title\":\"\u53e4\u4ee3\u8a00\u60c5\",\"value\":\"202\"},{\"title\":\"\u8c6a\u95e8\u603b\u88c1\",\"value\":\"203\"},{\"title\":\"\u9752\u6625\u6821\u56ed\",\"value\":\"204\"},{\"title\":\"\u7a7f\u8d8a\",\"value\":\"205\"},{\"title\":\"\u91cd\u751f\",\"value\":\"206\"},{\"title\":\"\u5a5a\u604b\u60c5\u611f\",\"value\":\"207\"},{\"title\":\"\u6587\u5b66\u4f5c\u54c1\",\"value\":\"208\"},{\"title\":\"\u5176\u4ed6\",\"value\":\"209\"}]\n\nconst st = {\"all\":\"\u4e0d\u9650\",\"0\":\"\u8fde\u8f7d\",\"1\":\"\u5b8c\u7ed3\"}\nlet {status, toggle} = createConfig();\n\nlet url = `\/api\/novel\/book\/v2\/class\/book.do?parentClassId=$classId&classId=all&status=${status}&page={{page-1}}&size=10&vn=1.0.1.x&m=G8&t={{Date.now()}}&ch=xiaomi&pkg=com.smart.app.jiudianjiu.xin.leisureNovel`;\n\npush(\"\u53ef\u4ece\u767b\u5f55\u4e2d\u9009\u62e9\u72b6\u6001\",\"\",1)\npush(\"\u5f53\u524d\u72b6\u6001\uff1a\"+st[status],\"\",1)\npush(\"\u7537\u751f\", \"\", 1)\nmale.forEach({title, value} => \n\t push(title, url.replace(\"$classId\", value))\n)\npush(\"\u5973\u751f\", \"\", 1)\nfemale.forEach({title, value} => \n\t push(title, url.replace(\"$classId\", value))\n)\n\nvar rankList = []\nif(toggle.trim() === \"\u2705\"){\n\t eval(String(source.variableComment))\n}else{rankList = []}\n\nJSON.stringify(list.concat(rankList))","jsLib":"function createConfig(){\n\t const {source} = this;\n\t try{\n    return JSON.parse(source.variable)\n  }catch(_){\n\t   return {status: \"all\"}\n  }\n}","lastUpdateTime":"1769609131835","loginUi":"[\n  {\n    \"name\": \"statusbar\",\n    \"viewName\": \"'\u9009\u62e9\u72b6\u6001\uff08\u70b9\u51fb\u663e\u793a\u5f53\u524d\u72b6\u6001\uff09'\",\n    \"type\": \"button\",\n    \"action\": \"show()\",\n    \"style\": {layout_flexBasisPercent: 1}\n  },\n  {\n    \"name\": \"\u4e0d\u9650\",\n    \"type\": \"button\",\n    \"action\": \"setStatus('all')\",\n    \"style\": {layout_flexBasisPercent: 0.29}\n  },\n  {\n    \"name\": \"\u5b8c\u7ed3\",\n    \"type\": \"button\",\n    \"action\": \"setStatus('1')\",\n    \"style\": {layout_flexBasisPercent: 0.29}\n  },\n  {\n    \"name\": \"\u8fde\u8f7d\",\n    \"type\": \"button\",\n    \"action\": \"setStatus('0')\",\n    \"style\": {layout_flexBasisPercent: 0.29}\n  },\n  {\n    \"name\": \"\u6392\u884c\u699c\",\n    \"type\": \"toggle\",\n    \"chars\": [\"\u274c \", \"\u2705 \"],\n    \"style\":{\n      layout_flexBasisPercent: 0.5\n    }\n  },\n  {\n    \"name\": \"\u786e\u5b9a\",\n    \"type\": \"button\",\n    \"action\": \"toggle()\",\n    \"style\":{\n      layout_flexBasisPercent: 0.4\n    }\n  }\n]","loginUrl":"function login(){}\n\nfunction show(){\n\t const config = createConfig();\n  const {status, toggle} = config;\n  const st = {\"all\":\"\u4e0d\u9650\",\"0\":\"\u8fde\u8f7d\",\"1\":\"\u5b8c\u7ed3\"}\n  java.toast(\"\\n\u5f53\u524d\u72b6\u6001\uff1a\\n\" + st[status] + \"\uff1a\"+status+\"\\n\u6392\u884c\u699c\uff1a\"+toggle)\n}\n\nfunction setStatus(val){\n\t const config = createConfig();\n  config.status = String(val).trim();\n  source.setVariable(JSON.stringify(config));\n  source.refreshExplore()\n}\n\nfunction toggle(){\n\t const config = createConfig();\n  \/\/let info = source.getLoginInfoMap();\n  \/\/let value = info[\"\u6392\u884c\u699c\"]\n  config.toggle = String(result.get(\"\u6392\u884c\u699c\"));\n  source.setVariable(JSON.stringify(config))\n  source.refreshExplore()\n}","respondTime":180000,"ruleBookInfo":[],"ruleContent":{"content":"$..content@js:eval(`\"${result}\"`)","replaceRegex":"##{{title}}"},"ruleExplore":[],"ruleSearch":{"author":"$.author","bookList":"$.data.books||$.data","bookUrl":"\/api\/novel\/book\/chapterlist.do?bookId={{$..bookId}}&vn=1.0.1.x&m=G8&t={{Date.now()}}&ch=xiaomi&pkg=com.smart.app.jiudianjiu.xin.leisureNovel","coverUrl":"$.cover","intro":"$.bookDesc","kind":"@js:\n [\n   result.parentClassName,\n   result.className,\n   result.status == 0 ? \"\u8fde\u8f7d\":\"\u5b8c\u7ed3\"\n ]","name":"$.bookName","wordCount":"$.words@js:\nfunction formatWordCount(wordCount) {\n    if(!wordCount) return \"\";\n    if (wordCount < 1e4) {\n        return wordCount + \"\u5b57\";\n    } else {\n        return (wordCount \/ 1e4).toFixed(1) + \"\u4e07\u5b57\";\n    }\n}\n\nformatWordCount(result)"},"ruleToc":{"chapterList":"$.data","chapterName":"$.chapterName","chapterUrl":"$.chapterId@js:\nlet id = baseUrl.match(\/bookId=(\\d+)&\/)[1];\n`\/api\/novel\/book\/chapter.do?bookId=${id}&chapterId=${result}&vn=1.0.1.x&m=G8&t={{Date.now()}}&ch=xiaomi&pkg=com.smart.app.jiudianjiu.xin.leisureNovel`"},"searchUrl":"\/api\/novel\/book\/search\/result.do?like=0&page={{page-1}}&size=10&keywords={{key}}&type=&vn=1.0.1.x&m=G8&t={{Date.now()}}&ch=xiaomi&pkg=com.smart.app.jiudianjiu.xin.leisureNovel","variableComment":"\/\/\u6392\u884c\u699c\nrankList = []\nconst pushRank = (title, url, size) =>\n  rankList.push({\n    title,\n    url,\n    style: {layout_flexBasisPercent: size||0.29}\n  });\n\nconst genders = [{\"title\":\"\u7537\u751f\",\"value\":\"1\"},{\"title\":\"\u5973\u751f\",\"value\":\"2\"}]\nconst tops = [{\"title\":\"\u63a8\u8350\",\"value\":\"01\"},{\"title\":\"\u5b8c\u7ed3\u699c\",\"value\":\"02\"},{\"title\":\"\u70ed\u641c\u699c\",\"value\":\"03\"}]\n\nconst rankUrl = \"\/api\/novel\/book\/v2\/top\/book.do?topId=$genderId$topId&page={{page-1}}&size=10&vn=1.0.1.x&m=G8&t={{Date.now}}&ch=xiaomi&pkg=com.smart.app.jiudianjiu.xin.leisureNovel\";\npushRank(\"\u6392\u884c\u699c\",\"\",1)\ngenders.forEach(({title,value})=>{\n  tops.forEach(top => {\n    let {title:toptitle,value:topval} = top;\n    let url = rankUrl.replace(\"$genderId\", value).replace(\"$topId\", topval)\n    pushRank(title+toptitle, url)\n  })\n})","weight":0},{"bookSourceGroup":"\ud83c\udf45","bookSourceName":"\ud83c\udf45 \u756a\u8304\u7684\u7f18","bookSourceType":0,"bookSourceUrl":"https:\/\/reading.snssdk.com#0","bookUrlPattern":"https?:\/\/.*(fqnovel|snssdk|fanqienovel|changdunovel)\\.com\/.*[0-9]{19}.*","customButton":false,"customOrder":2,"enabled":true,"enabledCookieJar":false,"enabledExplore":true,"eventListener":false,"exploreUrl":"@js:\n\u4e2a\u4eba\u4e2d\u5fc3 = 1;\n\nfaxian=source.getVariable()\nvar type = getArguments('type');\n\njs = (cid, genre_type, gender) => `@js:\nxGorgon(\n  \"new_category\/landing\",\n  \"category_id=${cid}&gender=${gender}&genre_type=${genre_type}&offset=0&aid=1967&app_name=novelapp&channel=0&device_platform=android&os_version=0&version_code=69132&update_version_code=69132&manifest_version_code=69132&version_name=6.9.1.32&&device_type=Honor10&limit=100&page_version=1\"\n)`\n\ntt_rank_books = (url) => `@js:\n  let ck = \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : (source. getLoginInfoMap() || {})['\u624b\u52a8\u767b\u5f55Token'])\n  let list = JSON.parse(java.ajax('${url}')).data.result;\n  let book_ids = [];\n  for (let i of list) book_ids.push(i.book_id)\n  xGorgon(\n    \"multi-detail\",\n    \"book_id=\" + book_ids.slice(0, 100).join(','),\n    null,\n    ck,\n  )\n`\n\n\nfunction extractQueryParams(input) {\n  let genreType = '';\n  let gender = '';\n  const genreTypeMatch = input.match(\/[?&]genreType=([^&]+)\/);\n  if (genreTypeMatch && genreTypeMatch[1]) {\n    genreType = decodeURIComponent(genreTypeMatch[1]);\n  }\n  const genderMatch = input.match(\/[?&]gender=([^&]+)\/);\n  if (genderMatch && genderMatch[1]) {\n    gender = decodeURIComponent(genderMatch[1]);\n  }\n  return [genreType, gender];\n}\n\nobj = (title, url, type, type1) => ({\n  title: title,\n  url: url,\n  style: {\n    layout_flexGrow: 1,\n    layout_flexBasisPercent: type\n  }\n})\n\n\nlet toutiao_rank_info = JSON.parse(java.ajax('https:\/\/novel.snssdk.com\/api\/novel\/channel\/homepage\/rank\/rank_list\/v2\/?need_type=1&offset=0&side_type=10&type=1&aid=1319') || '{\"data\":{\"type\":{\"type\":[]}}}').data.type.type\ntoutiao_rank = (index) => {\n  let rank_list = toutiao_rank_info[index] || []\n  let ret = []\n  if (rank_list) {\n    ret.push(obj(i.name + '\u699c', '', 1))\n    for (let j of rank_list.rank_list) {\n      ret.push(obj(j.name, 'https'))\n    }\n  }\n}\narr = []\njava.longToast(\"\u8bf7\u7a0d\u7b49\uff0c\u53d1\u73b0\u5217\u8868\u6b63\u5728\u70ed\u66f4\u65b0\uff01\")\nlet index = [];\nif (faxian.match(\/\u6f2b\u753b\/)) {\n  index = [5];\n} else if (faxian.match(\/\u542c\u4e66\/)) {\n  index = [3];\n} else if (faxian.match(\/\u77ed\u5267\/)) {\n  index = [6];\n} else {\n  index = [0, 1, 2];\n}\nfor (let i of index) {\n  \/\/ java.toast(i)\n  let type = i\n  $ = JSON.parse(java.ajax(xGorgon(\n    \"new_category\/front\",\n    `distinct_style=1&aid=1967&app_name=novelapp&channel=0&device_platform=android&os_version=0&version_code=69132&update_version_code=69132&manifest_version_code=69132&version_name=6.9.1.32&new_category_tab=${i}&device_type=Honor10`\n  ))).data.category_tab_data\n  cate = []\n  cate.push(obj(\n    \"====== \" + $.tab_name + \" ======\", \"\", 1\n  ))\n  $.cell_data.forEach((c) => {\n    let [genreType, gender] = extractQueryParams(c.atom_data[0].category_data.category_landpage_url);\n    cate.push(obj(\n      c.cell_name,\n      js(c.atom_data[0].category_data.category_id, genreType, gender),\n      1\n    ))\n    for (j = 2; j < 5; j++) {\n      c.atom_data.slice(1).forEach((a) => {\n        d = a.category_data\n        if (d.name.length == j) {\n        let \t[genreType2, gender2] = extractQueryParams(d.category_landpage_url)\n        cate.push(obj(d.name, js(d.category_id, genreType2, gender2), 0.25))\n        }\n      })\n    }\n  })\n  arr = cate.concat(arr)\n}\n\nget = (path) => `@js:\nlet ck = \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : (source.getLoginInfoMap() || {})['\u624b\u52a8\u767b\u5f55Token'])\n\nlet v = xGorgon(\n    \"${path}\",\n    \"offset=\" + (page - 1) * 20,\n    null,\n    ck,\n)\n\nxGorgon(\n  \"multi-detail\",\n  \"book_id=\" + getBookId(java.ajax(v)),\n  null,\n  ck,\n)`\n\nlet book_shelf_url = 'https:\/\/fanqienovel.com\/reading\/bookapi\/bookshelf\/info\/v:version\/?aid=1967&iid=0&version_code=57700&update_version_code=57700'\nlet book_shelf_info = JSON.parse(java.ajax(book_shelf_url + ', ' + JSON.stringify({\n  headers: {\n    'Cookie': \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : (source.getLoginInfoMap() || {})['\u624b\u52a8\u767b\u5f55Token']),\n  }\n})))\n\njava.log(JSON.stringify(book_shelf_info))\n\nlet username\nif (book_shelf_info.code != 0) {\n  \u4e2a\u4eba\u4e2d\u5fc3 = 0\n} else {\n  let uinfo = java.ajax(\"https:\/\/fanqienovel.com\/api\/user\/info\/v2,\" + JSON.stringify({ headers: { Cookie: \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : (source.getLoginInfoMap() || {})['\u624b\u52a8\u767b\u5f55Token']) } }))\n  uinfo = JSON.parse(uinfo)\n  username = uinfo.data.name\n}\n\nlet gro = []\npush = (title, url, type) => gro.push({\n  title: title,\n  url: url,\n  style: {\n    layout_flexGrow: 1,\n    layout_flexBasisPercent: type\n  }\n});\n\nlet sArr = []\n\nif (\u4e2a\u4eba\u4e2d\u5fc3) {\n  let groups_bookids = {\n    \"\u672a\u5206\u7ec4\": []\n  }\n  book_shelf_info.data.book_shelf_info.forEach(i => {\n    if (!groups_bookids[i.group_name ? i.group_name : \"\u672a\u5206\u7ec4\"]) groups_bookids[i.group_name] = []\n    groups_bookids[i.group_name ? i.group_name : \"\u672a\u5206\u7ec4\"].push(i.book_id)\n  })\n\n  Object.keys(groups_bookids).forEach(k => {\n    var multi_detail_post_body = {\n      data: {\n        book_shelf_info: []\n      }\n    }\n    groups_bookids[k].forEach(i => multi_detail_post_body.data.book_shelf_info.push({ book_id: String(i), item_id: '0' }))\n    \/\/ var multi_detail_group_url = `https:\/\/fanqienovel.com\/api\/bookshelf\/multidetail,${JSON.stringify(multi_detail_post_body)}`\n    \/\/ var book_ids = getBookId(JSON.stringify(multi_detail_post_body)).join(\",\")\n    push(k, \"https:\/\/fanqienovel.com\/fqbookshelf\/groupName\/\" + k, 0.4)\n  })\n  if (Object.keys(groups_bookids).length % 2 != 0) push(\"\u5360\u4f4d\", \"\", 0.4)\n  \/\/ java.log(JSON.stringify(gro, null, 2))\n  sArr.push(obj(username + '\u7684\u4e2a\u4eba\u4e2d\u5fc3', '', 1))\n  sArr.push(obj('\u9996\u9875\u63a8\u8350', \"https:\/\/fanqienovel.com\/tab\/0\", 0.4))\n  sArr.push(obj('\u731c\u4f60\u559c\u6b22', \"https:\/\/fanqienovel.com\/tab\/2\", 0.4))\n  \/\/ sArr.push(obj('\u731c\u4f60\u559c\u6b22', \"https:\/\/fanqienovel.com\/tab\/1\", 0.4))\n  sArr.push(obj(\"\u6211\u7684\u4e66\u67b6\", \"https:\/\/fanqienovel.com\/fqbookshelf\", 1))\n  \n  sArr = sArr.concat(gro)\n  \/\/ java.toast(JSON.stringify(sArr)) \n  sArr.push(obj(\"\u9605\u8bfb\u5386\u53f2\", get(\"read_history\/list\"), 1))\n}\n\narr = sArr.concat(arr)\nJSON.stringify(arr)","jsLib":"getHost = (a, b, c, d) => [\n    [\"https:\/\/\"][0],\n    [\n        \"reading\",\n        \"api\",\n        \"api3\",\n        \"api5\",\n        \"novel\",\n        \"\",\n    ][(a == 4 ? 5 : b) || 0],\n    [\n        \"\",\n        \"-normal\",\n    ][c || 0],\n    [\n        \"\",\n        \"-hl\",\n        \"-lf\",\n        \"-lq\",\n        \"-sinfonlinea\",\n        \"-sinfonlineb\",\n        \"-sinfonlinec\",\n    ][d || 0],\n    [\".\", \"\"][a == 4 ? 1 : 0],\n    [\n        \"snssdk\",\n        \"fqnovel\",\n        \"fanqiesdk\",\n        \"toutiaoapi\",\n        \"fanqienovel\",\n    ][a || 0],\n    [\".com\"][0],\n].join(\"\");\njavaImport = new JavaImporter()\njavaImport.importPackage(\n    Packages.okhttp3,\n    Packages.cn.hutool.core.util,\n    Packages.cn.hutool.core.codec,\n    Packages.cn.hutool.crypto.digest\n)\nwith(javaImport) {\n    \/\/POST\u8bf7\u6c42\n    function post(url, body, map) {\n        let json = MediaType.parse(\"application\/json\");\n        let request = new Request.Builder()\n            .url(url)\n            .post(RequestBody.create(body, json));\n        if (map) {\n            request.addHeader(\"Content-Encoding\", \"gzip\");\n            for (let n in map) {\n                request.addHeader(n, map[n]);\n            }\n        }\n        let client = new OkHttpClient();\n        let response = client.newCall(request.build()).execute();\n        return JSON.parse(response.body().string());\n    }\n\n    function okhttpGet(url, map) {\n        const { java } = this\n        let request = new Request.Builder()\n            .url(url)\n            .get();\n        if (map) {\n            request.addHeader(\"Content-Encoding\", \"gzip\");\n            for (let n in map) {\n                request.addHeader(n, map[n]);\n            }\n        }\n        java.log(\"okhttp: \" + url + \", headers=\" + JSON.stringify(map))\n        let client = new OkHttpClient();\n        let response = client.newCall(request.build()).execute();\n        return JSON.parse(response.body().string());\n    }\n    \n    function okhttpWithHeaders(url, map) {\n        const { java } = this\n        let request = new Request.Builder()\n            .url(url)\n            .get();\n        if (map) {\n            request.addHeader(\"Content-Encoding\", \"gzip\");\n            for (let n in map) {\n                request.addHeader(n, map[n]);\n            }\n        }\n        java.log(\"okhttp: \" + url + \", headers=\" + JSON.stringify(map))\n        let client = new OkHttpClient();\n        let response = client.newCall(request.build()).execute();\n        let headers = {}\n        let names = response.headers().names()\n        names.forEach((k) => {\n          headers[k] = response.headers().get(k)\n        })\n        return {\n          body: JSON.parse(response.body().string()),\n          headers: headers\n        }\n    }\n\n    \/\/Base64\u7f16\u7801\n    let b64En = (b64) => Base64.encode(b64);\n\n    \/\/Base64\u89e3\u7801\n    let b64De = (b64) => Base64.decode(b64);\n    \n    function gzip(data) { ZipUtil.gzip(data, \"\") }\n\n    \/\/X-Gorgon\u53c2\u6570\n    function xGorgon(path, params, data, ck) {\n        const {  java, source  } = this;\n        params = [\n            params,\n            \"aid=1967\",\n            \"channel=0\",\n            \"os_version=0\",\n            \"app_name=novelapp\",\n            \"version_code=58932\",\n            \"device_platform=android\",\n            \"device_type=unknown\",\n        ].join(\"&\").split(\"&\").sort().join(\"&\").replace(\/^&+\/, \"\");\n        if (!data) {\n            path = \"\/reading\/bookapi\/\" + path + \"\/v\/?\";\n        }\n        let url = getHost() + path + params;\n        let devtype\n        for (let i of (source.getLoginHeader() || '').split('&')) {\n          \/\/ java.log(i)\n          if (i.startsWith('device_type')) {\n            \/\/ java.log(i)\n            devtype = i.split('=')[1]\n          }\n        }\n\n\n        \/\/md5\u52a0\u5bc6\n        let md5 = (str) => DigestUtil.md5Hex(str);\n\n        \/\/\u53cd\u8f6c\u5b57\u7b26\u4e32\n        let rStr = (str) => StrUtil.reverse(str);\n\n        \/\/10\u8f6c16\u8fdb\u5236\n        let Hex = (num) => num.toString(16).padStart(2, \"0\");\n\n        \/\/\u53cd\u8f6c16\u8fdb\u5236\n        let rHex = (num) => parseInt(rStr(Hex(num)), 16);\n\n        \/\/\u53cd\u8f6c2\u8fdb\u5236\n        function rBin(num) {\n            let bin = num.toString(2).padStart(8, \"0\");\n            return parseInt(rStr(bin), 2);\n        }\n\n        \/\/\u8fd0\u7b97\n        function getHex(ck) {\n            let hex = md5(params)\n            hex += data ? md5(data) : \"0\".repeat(8)\n            hex += ck ? md5(ck) : \"0\".repeat(8)\n            return hex\n        }\n\n        function calculate(hex, ck) {\n            let len = 0x14;\n            let key = [0xDF, 0x77, 0xB9, 0x40, 0xB9, 0x9B, 0x84, 0x83, 0xD1, 0xB9, 0xCB, 0xD1, 0xF7, 0xC2, 0xB9, 0x85, 0xC3, 0xD0, 0xFB, 0xC3];\n            let paramList = [];\n            for (let i = 0; i < 9; i += 4) {\n                let temp = hex.substring(8 * i, 8 * (i + 1));\n                for (let j = 0; j < 4; j++) {\n                    let h = parseInt(temp.substring(j * 2, (j + 1) * 2), 16);\n                    paramList.push(h);\n                }\n            }\n            paramList.push(0x0, 0x6, 0xB, 0x1C);\n            let T = Math.floor(Date.now() \/ 1000);\n            paramList.push((T >> 24) & 0xFF, (T >> 16) & 0xFF, (T >> 8) & 0xFF, T & 0xFF);\n            \/\/\u5f02\u6216\n            let eorResultList = []\n            for (let i = 0; i < paramList.length; i++) {\n                eorResultList.push(paramList[i] ^ key[i % len]);\n            }\n            for (let A, B, C, D, i = 0; i < len; i++) {\n                A = rHex(eorResultList[i]);\n                B = eorResultList[(i + 1) % len];\n                C = rBin(A ^ B);\n                D = ((C ^ 0xFFFFFFFF) ^ len) & 0xFF;\n                eorResultList[i] = D;\n            }\n            let result = \"\"\n            for (let param of eorResultList) {\n                result += Hex(param);\n            }\n            let option = {\n                \"headers\": {\n                    \"X-Khronos\": String(T),\n                    \"X-Gorgon\": \"0404b0d30000\" + result,\n                    \"User-Agent\": 'com.dragon.read',\n                    \"Cookie\": ck ? ck : \"\"\n                }\n            }\n            let b_ = option\n            b_[\"body\"] = String(data ? data : \"\")\n            java.log(url + \",\" + JSON.stringify(b_))\n            if (data) {\n                return post(url, data, option.headers).data;\n            } else {\n                return url + \",\" + JSON.stringify(option);\n            }\n        }\n       return  calculate(getHex(ck), ck);\n    }\n}\n\nfunction getBookId(url) {\n\tconst {java} = this\n\tlet $ = JSON.parse(url).data\n\tlet arr, list\n\tif ($.book_shelf_info != 0 && $.book_shelf_info != undefined) {\n\t\tarr = $.book_shelf_info.map($ => $.book_id)\n\t} else if (list = $.data_list != 0 && $.data_list != undefined)  {\n\t\tarr = $.data_list.map($ => $.book_id_str)\n\t} else {\n\t\tjava.toast(\"\u83b7\u53d6 book_id \u5931\u8d25\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u767b\u5f55\uff01\")\n\t}\n\treturn arr.slice(0, 100)\n}\n\nfunction getBookIdFull(url) {\n\tconst {java} = this\n\tlet $ = JSON.parse(url).data\n  let arr, list\n\tif ($.book_shelf_info != 0 && $.book_shelf_info != undefined) {\n\t\tarr = $.book_shelf_info.map($ => $.book_id)\n\t} else if (list = $.data_list != 0 && $.data_list != undefined)  {\n\t\tarr = $.data_list.map($ => $.book_id_str)\n\t} else {\n\t\tjava.toast(\"\u83b7\u53d6 book_id \u5931\u8d25\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u767b\u5f55\uff01\")\n\t}\n\treturn arr\n}\n\nfunction splitArray(input, size) {\n  const output = []\n  for (let i = 0; i < input.length; i += size) {\n    output.push(input.slice(i, i + size))\n  }\n  return output\n}\n\nlet replaceCover = (u) => {\n    if (u.startsWith(\"https:\/\/\")) u = u.substring(8)\n    else u = u.substring(7)\n    let uArr = u.split(\"\/\")\n    uArr[0] = \"https:\/\/p6-novel.byteimg.com\/origin\"\n    let uArr2 = []\n    uArr.forEach((x) => {\n        if (!x.includes(\"?\") && !x.includes(\"~\")) uArr2.push(x)\n        else uArr2.push(x.split(\"~\")[0])\n    })\n    u = uArr2.join(\"\/\")\n    return u\n}\n\n\n\n\nfunction getApi() {\n    return \"http:\/\/nove.98tx.cn\";\n}\n\nfunction getServerHost() {\n    let { source } = this;\n    try {\n        const config = JSON.parse(source.getVariable());\n        if (Array.isArray(config) && config.length > 0) {\n            return config[0]?.host || getApi();\n        } \n        else if (config && typeof config === \"object\") {\n            return config.server || getApi();\n        }\n        return getApi();\n    } catch(e) {\n        return getApi();\n    }\n}\n\n\n\n\n\n\n\n\n\n\n\/\/\u53d1\u73b0\u9875\u914d\u5957\u89c4\u5219\n\nconst host = [\n\"http:\/\/nove.98tx.cn\",\n\"http:\/\/nom.98tx.cn\",\n\"http:\/\/noxx.98tx.cn\",\n\"http:\/\/nocs.98tx.cn\",\n]\n\nfunction get_key(cookie){\nlet key;\nkey = cookie.split('secretKey2=');\nkey = key[key.length-1];\nreturn key;\n}\n\n\n\nfunction \ngetArguments(open_argument,key) {\n    try {\n        open_argument = JSON.parse(open_argument);\n    } catch (e) {\n        const serverList = host;\n        open_argument = {\n        \t\n        \t\n\t\"search\": \"-1\",\n\t\"tone_id\": \"-1\",\n\t\"sz\": \"0\",\n\t\"server\": \"http:\/\/nove.98tx.cn\",\n\t\"tone\": \"\",\n\t\"st\": 0,\n\t\"type\": \"\u5c0f\u8bf4\u6a21\u5f0f\",\n\t\"module\": \"3\",\n\t\"faxian\": \"\u5c0f\u8bf4\"\n\t\n\n        };\n    }\n    if (key) {return open_argument[key];} else {return open_argument}\n}\n\n","lastUpdateTime":"1769746103609","loginUi":"[\n\n{\n  name: \"\u624b\u52a8\u767b\u5f55Token\",\n  type: \"text\u6587\u5b57\u5173\u95ed\",\n  action: \"\"\n},\n\n  {\n            'name': '\ud83d\udc65\u4e66\u6e90\u53cd\u9988\ud83d\udc65',\n            'type': 'button',\n            \"action\":\"http:\/\/blog.98tx.cn\", \n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 1.4\n            }\n        },\n        \n\n{\n            \"name\":\"\ud83d\udcae\u66f4\u65b0\u4e66\u6e90\ud83d\udcae\",\n            \"type\": \"button\",\n             \"action\": \"getKey()\",\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        },\n\n\n  {\n            'name': '\ud83d\udc65\u52a0\u5165\u7fa4\u804a \ud83d\udc65',\n            'type': 'button',\n            \"action\":\"https:\/\/qun.qq.com\/universal-share\/share?ac=1&authKey=PVmKtvawKonFt3SMEc912mUzpv71goOVoByeymijGE9pYQDVh0Cetj5viiZfXGAE&busi_data=eyJncm91cENvZGUiOiIxNjUxNTk4IiwidG9rZW4iOiJWbkhEQ1JnTXM3cW5CQWIwWm8xYno5Y1hEZDJTUmQ1Y2JOMElRS3FSRHhUdXM5Q3cwM1BVOW41c09lUlRGcWRVIiwidWluIjoiMjYyMTYyOTQ1NiJ9&data=paLnLOcOse1qFhjVyLnrVdTpycgUXqSF3sS79bkANpiFI9f0f0hl93XsxGAfMHlmH22YDfgVVrOhs67qtdxlig&svctype=4&tempid=h5_group_info\", \n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        },\n        \n\n        \n        \n{\n\t\"name\": \"\u2615\ufe0f\u8d5e\u52a9\u670d\u52a1\u5668\u2615\ufe0f\",\n  \"type\": \"button\", \n  \"action\":\"zz()\", \n   \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4\n}\n},\n\n\n\n{\n\t\"name\": \"\ud83d\udc30\u63a5\u53e3\u6587\u6863\ud83d\udc30\",\n  \"type\": \"button\", \n  \"action\":\"\u53d1\u5e03\u9875()\", \n   \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4\n}\n},\n\n\n{\n\tname: \"\u3000\u3000\u2753\u767b\u5f55\u68c0\u67e5\u2753\u3000\u3000\",\n\ttype: \"button\",\n\taction: \"l2(false, true)\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1.4\n    }\n},\n\n \n\n\n\n{\n\tname: \"\ud83c\udf45\u8d26\u53f7\u767b\u5f55\ud83c\udf45\",\n\ttype: \"button\",\n\taction: \"l2(true)\",\n\t    \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n},\n{\n\tname: \"\u2757\ufe0f\u9000\u51fa\u767b\u5f55\u2757\ufe0f\",\n\ttype: \"button\",\n\taction: \"logout()\",\n\t    \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n},\n\n {\n\tname: \"\ud83c\udf9a\u670d\u52a1\u5668\u68c0\u67e5\ud83c\udf9a\u3000\",\n\ttype: \"button\",\n\taction: \"out()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1.4\n    }\n},\n\n\n\n\n\n\n\n{\n        \"name\":  \"\ud83c\udf9a\u5207\u6362\u670d\u52a1\u5668\ud83c\udf9a\",\n        \"type\": \"button\",\n        \"action\": \"set_server()\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.3\n  }\n      },\n\n{\n  \"name\": \"\ud83d\udd04\u670d\u52a1\u5668\u68c0\u6d4b\ud83d\udd04\",\n  \"type\": \"button\",\n  \"action\": \"checkNet()\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.4\n   }\n  },\n  \n\n{\n'action': \"yu()\",\n'name': '\u5f53\u524d\u6a21\u5f0f',\n'type': 'button',\n\"style\": {\n\"layout_flexGrow\": 1,\n\"layout_flexBasisPercent\": 1\n}\n},\n{\n'action': \"settype('\u5c0f\u8bf4\u6a21\u5f0f')\",\n'name': '\ud83d\udcd5\u5c0f\u8bf4\u6a21\u5f0f\ud83d\udcd5',\n'type': 'button',\n\"style\": {\n\"layout_flexGrow\": 1,\n\"layout_flexBasisPercent\": 0.39\n}\n},\n{\n'action': \"settype('\u542c\u4e66\u6a21\u5f0f')\",\n'name': '\ud83d\udcfb\u542c\u4e66\u6a21\u5f0f\ud83d\udcfb',\n'type': 'button',\n\"style\": {\n\"layout_flexGrow\": 1,\n\"layout_flexBasisPercent\": 0.39\n}\n},\n{\n'action': \"settype('\u6f2b\u753b\u6a21\u5f0f')\",\n'name': '\ud83d\uddbc\u6f2b\u753b\u6a21\u5f0f\ud83d\uddbc',\n'type': 'button',\n\"style\": {\n\"layout_flexGrow\": 1,\n\"layout_flexBasisPercent\": 0.39\n}\n},\n{\n'action': \"settype('\u77ed\u5267\u6a21\u5f0f')\",\n'name': '\ud83c\udfa5\u77ed\u5267\u6a21\u5f0f\ud83c\udfa5',\n'type': 'button',\n\"style\": {\n\"layout_flexGrow\": 1,\n\"layout_flexBasisPercent\": 0.39\n}\n},\n{\n  \"name\": \"\u67e5\u8be2\u6a21\u5f0f\",\n  \"type\": \"button\u6587\u5b57\u5173\u95ed\",\n  \"action\": \"get()\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n{\n  \"name\": \"\u9605\u8bfb\u6a21\u5f0f\",\n  \"type\": \"button\",\n  \"action\": \"set(0)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.45\n  }\n},\n{\n  \"name\": \"\u5207\u6362\u6a21\u5f0f\",\n  \"type\": \"button\",\n  \"action\": \"st()\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.45\n  }\n},\n\n{\n  \"name\": \"\u6ce8\u518c\u8bbe\u5907(\u80fd\u6b63\u5e38\u4f7f\u7528\u522b\u70b9)\",\n  \"type\": \"button\",\n  \"action\": \"\u6fc0\u6d3b\u8bbe\u5907()\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 1.45\n  }\n},\n  \n{\n        \"name\": \"\ud83d\udce6\u521d\u59cb\u5316\u6e90\u53d8\u91cf\ud83d\udce6\",\n        \"type\": \"button\",\n        \"action\": \"began()\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.35\n  }\n    },\n\n{\n        \"name\": \" \ud83c\udf90\u6e05\u9664\u6e90\u53d8\u91cf\ud83c\udf90 \",\n        \"type\": \"button\",\n        \"action\": \"clean()\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.35\n  }\n    \n },\n \n \n \n \n{\n  \"name\": \"\u8bf7\u5148\u786e\u5b9a\u5f53\u524d\u4e66\u7c4d\u652f\u6301\u7684\u97f3\u8272\u518d\u5207\u6362\uff01\",\n  \"type\": \"button\",\n  \"action\": \"get()\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 2.45\n  }\n},\n    \n   {\n        \"name\": \"\u5176\u4ed6\u97f3\u8272ID(\u786e\u5b9a\u540e\u2714\u8fd4\u56de\u70b9\u51fb\u5207\u6362)\",\n        \"type\": \"text\"\n},\n  {\n  \"name\": \"\u5207\u6362\u81ea\u5b9a\u97f3\u8272\",\n  \"type\": \"button\",\n  \"action\": \"set(1)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.45\n  }\n},\n\n  \n  {\n  \"name\": \"\u4fdd\u5b58\u81ea\u5b9a\u97f3\u8272\",\n  \"type\": \"button\",\n  \"action\": \"set_tone_id()\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.45\n  }\n},\n\n\n  \n    {\n  \"name\": \"\u771f\u4eba\u53d1\u97f3\",\n  \"type\": \"button\",\n  \"action\": \"set(2)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 2.25\n  }\n},\n\n  \n\n{\n  \"name\": \"\u97f3\u82721\",\n  \"type\": \"button\",\n  \"action\": \"set(3)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n\n{\n  \"name\": \"\u97f3\u82722\",\n  \"type\": \"button\",\n  \"action\": \"set(4)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n\n{\n  \"name\": \"\u97f3\u82724\",\n  \"type\": \"button\",\n  \"action\": \"set(5)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n\n{\n  \"name\": \"\u97f3\u82725\",\n  \"type\": \"button\",\n  \"action\": \"set(6)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u82726\",\n  \"type\": \"button\",\n  \"action\": \"set(7)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n\n{\n  \"name\": \"\u97f3\u82727\",\n  \"type\": \"button\",\n  \"action\": \"set(8)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u82728\",\n  \"type\": \"button\",\n  \"action\": \"set(9)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n\n\n\n{\n  \"name\": \"\u97f3\u82729\",\n  \"type\": \"button\",\n  \"action\": \"set(10)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n{\n  \"name\": \"\u97f3\u827210\",\n  \"type\": \"button\",\n  \"action\": \"set(11)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n\n{\n  \"name\": \"\u97f3\u827211\",\n  \"type\": \"button\",\n  \"action\": \"set(12)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n{\n  \"name\": \"\u97f3\u827212\",\n  \"type\": \"button\",\n  \"action\": \"set(13)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n\n{\n  \"name\": \"\u97f3\u827214\",\n  \"type\": \"button\",\n  \"action\": \"set(14)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827215\",\n  \"type\": \"button\",\n  \"action\": \"set(15)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827216\",\n  \"type\": \"button\",\n  \"action\": \"set(16)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n{\n  \"name\": \"\u97f3\u827217\",\n  \"type\": \"button\",\n  \"action\": \"set(17)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827218\",\n  \"type\": \"button\",\n  \"action\": \"set(18)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827221\",\n  \"type\": \"button\",\n  \"action\": \"set(19)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827222\",\n  \"type\": \"button\",\n  \"action\": \"set(20)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827223\",\n  \"type\": \"button\",\n  \"action\": \"set(21)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827226\",\n  \"type\": \"button\",\n  \"action\": \"set(22)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827227\",\n  \"type\": \"button\",\n  \"action\": \"set(23)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827228\",\n  \"type\": \"button\",\n  \"action\": \"set(24)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n{\n  \"name\": \"\u97f3\u827229\",\n  \"type\": \"button\",\n  \"action\": \"set(25)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n\n{\n  \"name\": \"\u97f3\u827230\",\n  \"type\": \"button\",\n  \"action\": \"set(26)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n{\n  \"name\": \"\u97f3\u827231\",\n  \"type\": \"button\",\n  \"action\": \"set(27)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n{\n  \"name\": \"\u97f3\u827232\",\n  \"type\": \"button\",\n  \"action\": \"set(28)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n\n{\n  \"name\": \"\u97f3\u827251\",\n  \"type\": \"button\",\n  \"action\": \"set(29)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n\n{\n  \"name\": \"\u97f3\u827253\",\n  \"type\": \"button\",\n  \"action\": \"set(30)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827255\",\n  \"type\": \"button\",\n  \"action\": \"set(31)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827256\",\n  \"type\": \"button\",\n  \"action\": \"set(32)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827257\",\n  \"type\": \"button\",\n  \"action\": \"set(33)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827258\",\n  \"type\": \"button\",\n  \"action\": \"set(34)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827259\",\n  \"type\": \"button\",\n  \"action\": \"set(35)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827260\",\n  \"type\": \"button\",\n  \"action\": \"set(36)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n\n{\n  \"name\": \"\u97f3\u827261\",\n  \"type\": \"button\",\n  \"action\": \"set(37)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827262\",\n  \"type\": \"button\",\n  \"action\": \"set(38)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827263\",\n  \"type\": \"button\",\n  \"action\": \"set(39)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827264\",\n  \"type\": \"button\",\n  \"action\": \"set(40)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827267\",\n  \"type\": \"button\",\n  \"action\": \"set(41)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827268\",\n  \"type\": \"button\",\n  \"action\": \"set(42)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n\n{\n  \"name\": \"\u97f3\u827271\",\n  \"type\": \"button\",\n  \"action\": \"set(43)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n\n{\n  \"name\": \"\u97f3\u827272\",\n  \"type\": \"button\",\n  \"action\": \"set(44)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827273\",\n  \"type\": \"button\",\n  \"action\": \"set(45)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n\n{\n  \"name\": \"\u97f3\u827274\",\n  \"type\": \"button\",\n  \"action\": \"set(46)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n{\n  \"name\": \"\u97f3\u827275\",\n  \"type\": \"button\",\n  \"action\": \"set(47)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827276\",\n  \"type\": \"button\",\n  \"action\": \"set(48)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827277\",\n  \"type\": \"button\",\n  \"action\": \"set(49)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827278\",\n  \"type\": \"button\",\n  \"action\": \"set(50)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827279\",\n  \"type\": \"button\",\n  \"action\": \"set(51)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827280\",\n  \"type\": \"button\",\n  \"action\": \"set(52)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827281\",\n  \"type\": \"button\",\n  \"action\": \"set(53)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n{\n  \"name\": \"\u97f3\u827282\",\n  \"type\": \"button\",\n  \"action\": \"set(54)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n{\n  \"name\": \"\u97f3\u827284\",\n  \"type\": \"button\",\n  \"action\": \"set(55)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u827285\",\n  \"type\": \"button\",\n  \"action\": \"set(56)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n{\n  \"name\": \"\u97f3\u827286\",\n  \"type\": \"button\",\n  \"action\": \"set(57)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n{\n  \"name\": \"\u97f3\u827287\",\n  \"type\": \"button\",\n  \"action\": \"set(58)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n{\n  \"name\": \"\u97f3\u827288\",\n  \"type\": \"button\",\n  \"action\": \"set(59)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n{\n  \"name\": \"\u97f3\u827289\",\n  \"type\": \"button\",\n  \"action\": \"set(60)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n{\n  \"name\": \"\u97f3\u827290\",\n  \"type\": \"button\",\n  \"action\": \"set(61)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n{\n  \"name\": \"\u97f3\u827291\",\n  \"type\": \"button\",\n  \"action\": \"set(62)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n\n\n\n{\n  \"name\": \"\u97f3\u8272100\",\n  \"type\": \"button\",\n  \"action\": \"set(63)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u8272101\",\n  \"type\": \"button\",\n  \"action\": \"set(64)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u8272102\",\n  \"type\": \"button\",\n  \"action\": \"set(65)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n{\n  \"name\": \"\u97f3\u8272103\",\n  \"type\": \"button\",\n  \"action\": \"set(66)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u8272104\",\n  \"type\": \"button\",\n  \"action\": \"set(67)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n\n{\n  \"name\": \"\u97f3\u8272105\",\n  \"type\": \"button\",\n  \"action\": \"set(68)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u8272106\",\n  \"type\": \"button\",\n  \"action\": \"set(69)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u8272107\",\n  \"type\": \"button\",\n  \"action\": \"set(70)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u8272108\",\n  \"type\": \"button\",\n  \"action\": \"set(71)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n\n{\n  \"name\": \"\u97f3\u8272109\",\n  \"type\": \"button\",\n  \"action\": \"set(72)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u8272110\",\n  \"type\": \"button\",\n  \"action\": \"set(73)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n{\n  \"name\": \"\u97f3\u8272111\",\n  \"type\": \"button\",\n  \"action\": \"set(74)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n\n{\n  \"name\": \"\u97f3\u8272112\",\n  \"type\": \"button\",\n  \"action\": \"set(75)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n{\n  \"name\": \"\u97f3\u8272113\",\n  \"type\": \"button\",\n  \"action\": \"set(76)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n{\n  \"name\": \"\u97f3\u8272114\",\n  \"type\": \"button\",\n  \"action\": \"set(77)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n{\n  \"name\": \"\u97f3\u8272115\",\n  \"type\": \"button\",\n  \"action\": \"set(78)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n},\n\n{\n  \"name\": \"\u97f3\u8272204\",\n  \"type\": \"button\",\n  \"action\": \"set(79)\",\n  \"style\": {\n    \"layout_flexGrow\": 1,\n    \"layout_flexBasisPercent\": 0.25\n  }\n}\n,\n        \n        {\n            'name': '\u63a5\u53e3\u9879\u76ee\uff1a\u5154\u5154        \u4f5c\u8005\uff1a \u56e2\u5915 ',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 1\n            }\n        }\n\n]","loginUrl":"\nfunction clean() {\n    let variavle = \"\";\n    source.setVariable(variavle);\n    java.toast(\"\u6e90\u53d8\u91cf\u5df2\u6e05\u9664\");\n }\n \nfunction began() {\n var baseVariable = JSON.stringify({\n\n\n\t\"sz\": \"0\",\n\t\"tone\": \"\",\n\t\"st\": 1,\n\t\"server\": \"http:\/\/nove.98tx.cn\",\n\t\"type\": \"\u5c0f\u8bf4\u6a21\u5f0f\",\n\t\"module\": 3\n\n\t\n\t\n}, null, \"\\t\");\n  source.setVariable(baseVariable);\n  java.toast(\"\u5df2\u521d\u59cb\u5316\u6e90\u53d8\u91cf\uff01\");\n\t}\n\n\n\n\n\n\nfunction \u53d1\u5e03\u9875() {\tjava.startBrowserAwait(server  +'', \"API \u8bf7\u6c42\u7edf\u8ba1\u4eea\u8868\u677f\");\n}\n\n\n\nserver = String(source.getVariable()).match(\/server\/)? JSON.parse(source.getVariable()).server: source.server;\njava.put(\"server\",server);\n\n\n\n\nfunction \u6fc0\u6d3b\u8bbe\u5907() {\n\t\n\t\t\n\t\n\tjava.startBrowserAwait(result = server  +  '\/api\/index.php?api=device_register&action=register', \"\u6fc0\u6d3b\u8bbe\u5907\");\n}\n\n\n\n\n\n\n\n\n\nfunction login52(){}; \nfunction out(){ java.toast(\"\u5f53\u524d\u670d\u52a1\u5668\u4e3a:\\n\"+getServerHost()) };\n\nif (source.getVariable()==\"\") { \n    reg(true);\n}\n\nvar lists = JSON.parse(source.getVariable());\n\n\n\n\nfunction settype(Type) {\n    lists.type = Type;\n  if (Type == '\u5c0f\u8bf4\u6a21\u5f0f') {\n        lists.module = \"3\";\n    }else\n    \n    if (Type == '\u542c\u4e66\u6a21\u5f0f') {\n        lists.module = \"2\";\n    }else\n    \n    \n    if (Type == '\u6f2b\u753b\u6a21\u5f0f') {\n        lists.module = \"8\";\n    }else\n    \n     if (Type == '\u77ed\u5267\u6a21\u5f0f') {\n        lists.module = \"11\";\n    };\n    source.setVariable(JSON.stringify(lists, null, \"\\t\"));\n    java.toast('\u5df2\u5c06\u7c7b\u578b\u5207\u6362\u4e3a:\\n' + Type);\n}\nyu=()=>{\nu=JSON.parse(source.getVariable()).type;\njava.toast(`\\n${u}`)\n}\n\n\n\n\n\n\/\/ \u767b\u5f55\u53ca\u767b\u5f55\u68c0\u67e5\nfunction login_(openBrowser, checkMode) {\n    \/\/ java.removeCookie(\"snssdk.com\")\n    var cookie_ = String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : source.getLoginInfoMap()['\u624b\u52a8\u767b\u5f55Token']\n    \/\/ java.toast(cookie_)\n    if (cookie_ && cookie_ != \"\" && !checkMode) {\n        if (!source.variableComment) {\n            java.toast(\"\u8bf7\u4e0d\u8981\u91cd\u590d\u767b\u5f55\uff0c\u8bf7\u5148\u9000\u51fa\u767b\u5f55\uff01\")\n        } else {\n            java.toast(\"\u60a8\u4e3a\u586b\u5199token\u767b\u5f55\uff0c\u8bf7\u624b\u52a8\u79fb\u9664token\u540e\u518d\u6b21\u767b\u5f55\")\n        }\n        return false\n    }\n    if (openBrowser) {\n        try {\n            java.startBrowserAwait(\"https:\/\/fanqienovel.com\/\", \"\u767b\u5f55\")\n        } catch (e) {\n            java.toast(e)\n        }\n    }\n    \/\/ java.log(\"snssdk cookie: \" + java.getCookie(\"snssdk.com\") + \"will be reomved\")\n    try {\n        cookie.removeCookie(\"snssdk.com\")\n    } catch (e) {}\n    \/\/ java.log(cookie)\n    var cookie_ = \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : source.getLoginInfoMap()['\u624b\u52a8\u767b\u5f55Token'])\n    let user\n    try {\n      user = JSON.parse(java.ajax(\"https:\/\/fanqienovel.com\/api\/user\/info\/v2,\" + JSON.stringify({\n        method: \"GET\",\n        headers: {\n          \"Cookie\": cookie_\n        }\n      }))).data.name\n     } catch (e) {java.log(e)}\n    if (!cookie_ || cookie_ == \"sessionid=\" || !user) {\n        java.toast(\"\u672a\u83b7\u53d6\u5230\u767b\u5f55\u51ed\u636e\uff0c\u767b\u5f55\u5931\u8d25\")\n        return false\n    }\n    java.toast(\"\u6b22\u8fce \" + user + \"\\n\u767b\u5f55\u6210\u529f\uff01\")\n    return true\n}\n\nfunction login() \/\/ \u4e00\u5b9a\u7a0b\u5ea6\u4e0a\u52a0\u4e0a\u8fd9\u4e2a\u51fd\u6570\u80fd\u591f\u652f\u6301\u66f4\u591a\u7684\u7248\u672c\n{}\n\nfunction l2(a, b) {\n  try {\n    login_(a, b)\n  } catch (e) {\n    java.log(e+\"\\n\"+e.stack)\n  }\n}\n\n\/\/ \u53d6\u6d88\u767b\u5f55\nfunction logout() {\n    cookie.removeCookie(\"fanqienovel.com\");\n    cookie.removeCookie(\"snssdk.com\");\n    if (source.getLoginInfoMap()['\u624b\u52a8\u767b\u5f55Token']) java.toast(\"\u8bf7\u624b\u52a8\u79fb\u9664\u586b\u5199\u7684Token\")\n    else java.toast(\"\u9000\u51fa\u767b\u5f55\u6210\u529f\");\n}\n\n\n\n\n\n\n\n\n\nfunction logToken() {\n  java.log(\n    String(\n      cookie.getKey(\n        \"fanqienovel.com\",\n        \"sessionid\"\n      )\n    ) ? String(\n     cookie.getKey(\n        \"fanqienovel.com\", \n        \"sessionid\"\n      )\n    ) : (\n     source.getLoginInfoMap()\n      ? source.getLoginInfoMap()\n      : {}\n    )['\u624b\u52a8\u767b\u5f55Token']\n  )\n  java.toast(\"\u767b\u5f55Token\u5df2\u6253\u5370\u5230\u65e5\u5fd7\uff0c\u8bf7\u59a5\u5584\u4fdd\u7ba1\")\n}\n\nfunction tutorial() {\n  java.longToast(\"\\n\u624b\u52a8\u767b\u5f55token\u529f\u80fd\u7528\u4e8e\u90e8\u5206\u7528\u6237\u7684\u8de8\u7aef\u767b\u5f55\uff0c\u4e0d\u77e5\u9053\u662f\u4ec0\u4e48\u7684\u7559\u7a7a\u5c31\u884c\\n\u666e\u901a\u7528\u6237\u8bf7\u4f7f\u7528\u4e0b\u65b9\u7684\\\"\u8d26\u53f7\u767b\u5f55\\\"\u6309\u94ae\u767b\u5f55\u81ea\u5df1\u7684\u8d26\u53f7\")\n}\n\nfunction t() {\n  let gc = [\"(*^\u03c9^*)\", \"(=^\u25bd^=)\", \"(\u3002\u2019\u25bd\u2019\u3002)\u2661\", \"\u0669(\u0e51\u00b40`\u0e51)\u06f6\", \"\u55b5\", \"\u4f60\u597d\uff1f\", \"\u9022\u8003\u5fc5\u8fc7\uff01\", \"\u65e9\uff89\u2600\"]\n  rnd = Math.floor(Math.random() * 100)\n  if (typeof gc[rnd] != \"undefined\") {\n    java.toast(gc[rnd])\n  } else {\n    let res = JSON.parse(\n      java.ajax(\"https:\/\/v1.hitokoto.cn\")\n    )\n    java.toast(res.hitokoto)\n  }\n}\n\n\/\/ \u97f3\u8272\u8bbe\u7f6e\uff0c\u4ee5\u53ca\u94fe\u63a5\nvar data = [\n    [\"\u6b63\u5e38\u6a21\u5f0f\", \"\"],\n    [\"\u81ea\u5b9a\u4e49\u97f3\u8272\", \"\"],\n    [\"\u771f\u4eba\", \"tone_id=0\"],\n    [\"\u751c\u7f8e\u5c11\u5973\", \"tone_id=1\"],\n    [\"\u6e05\u4eae\u9752\u53d4\", \"tone_id=2\"],\n    [\"\u6210\u719f\u5927\u53d4\", \"tone_id=4\"],\n    [\"\u5f00\u6717\u9752\u5e74\", \"tone_id=5\"],\n    [\"\u6e29\u67d4\u6dd1\u5973\", \"tone_id=6\"],\n    [\"\u97f3\u98917\", \"tone_id=7\"],\n    [\"\u98ce\u96c5\u9752\u53d4\", \"tone_id=8\"],\n    [\"\u97f3\u98919\", \"tone_id=9\"],\n    [\"\u97f3\u989110\", \"tone_id=10\"],\n    [\"\u97f3\u989111\", \"tone_id=11\"],\n    [\"\u6e05\u7eaf\u5c11\u5973\", \"tone_id=12\"],\n    [\"\u97f3\u989114\", \"tone_id=14\"],\n    [\"\u97f3\u989115\", \"tone_id=15\"],\n    [\"\u97f3\u989116\", \"tone_id=16\"],\n    [\"\u78c1\u6027\u9752\u53d4\", \"tone_id=17\"],\n    [\"\u97f3\u989118\", \"tone_id=18\"],\n    [\"\u97f3\u989121\", \"tone_id=21\"],\n    [\"\u97f3\u989122\", \"tone_id=22\"],\n    [\"\u97f3\u989123\", \"tone_id=23\"],\n    [\"\u97f3\u989126\", \"tone_id=26\"],\n    [\"\u63a8\u6587\u5973\u58f0\", \"tone_id=27\"],\n    [\"\u4eb2\u5207\u59d0\u59d0\", \"tone_id=28\"],\n    [\"\u5112\u96c5\u5927\u53d4\", \"tone_id=29\"],\n    [\"\u4f18\u96c5\u5fa1\u59d0\", \"tone_id=30\"],\n    [\"\u65af\u6587\u9752\u53d4\", \"tone_id=31\"],\n    [\"\u77e5\u6027\u4e3b\u64ad\", \"tone_id=32\"],\n    [\"\u591a\u4eba\u5bf9\u8bdd\", \"tone_id=51\"],\n    [\"\u97f3\u989153\", \"tone_id=53\"],\n    [\"\u97f3\u989155\", \"tone_id=55\"],\n    [\"\u97f3\u989156\", \"tone_id=56\"],\n    [\"\u97f3\u989157\", \"tone_id=57\"],\n    [\"\u97f3\u989158\", \"tone_id=58\"],\n    [\"\u97f3\u989159\", \"tone_id=59\"],\n    [\"\u97f3\u989160\", \"tone_id=60\"],\n     [\"\u97f3\u989161\", \"tone_id=61\"],\n     [\"\u97f3\u989162\", \"tone_id=62\"],\n     [\"\u97f3\u989163\", \"tone_id=63\"],\n     [\"\u97f3\u989164\", \"tone_id=64\"],\n     [\"\u97f3\u989167\", \"tone_id=67\"],   \n     [\"\u97f3\u989168\", \"tone_id=68\"],\n      [\"\u97f3\u989171\", \"tone_id=71\"],\n      [\"\u97f3\u989172\", \"tone_id=72\"],\n      [\"\u97f3\u989173\", \"tone_id=73\"],\n    [\"\u6210\u719f\u5347\u7ea7\", \"tone_id=74\"],\n     [\"\u97f3\u989175\", \"tone_id=75\"],\n       [\"\u97f3\u989176\", \"tone_id=76\"],\n       [\"\u97f3\u989177\", \"tone_id=77\"],\n        [\"\u97f3\u989178\", \"tone_id=78\"],\n       [\"\u97f3\u989179\", \"tone_id=79\"],\n    [\"\u97f3\u989180\", \"tone_id=80\"],\n    [\"\u97f3\u989181\", \"tone_id=81\"],\n     [\"\u97f3\u989182\", \"tone_id=82\"],\n     [\"\u97f3\u989184\", \"tone_id=84\"],\n      [\"\u97f3\u989185\", \"tone_id=85\"],\n      \n      [\"\u97f3\u989186\", \"tone_id=86\"],\n       [\"\u97f3\u989187\", \"tone_id=87\"],\n       [\"\u97f3\u989188\", \"tone_id=88\"],\n         [\"\u97f3\u989189\", \"tone_id=89\"],\n           [\"\u97f3\u989190\", \"tone_id=90\"],\n      \n        [\"\u97f3\u989191\", \"tone_id=91\"],\n    [\"\u4fcf\u76ae\u5fa1\u59d0\", \"tone_id=100\"],\n    \/\/ [\"\u90bb\u5bb6\u59b9\u59b9\", \"\"],\n    [\"\u97f3\u9891101\", \"tone_id=101\"],\n    [\"\u97f3\u9891102\", \"tone_id=102\"],\n    [\"\u53cc\u97f3\u7075\u52a8\", \"tone_id=103\"],\n    [\"\u97f3\u9891104\", \"tone_id=104\"],\n    [\"\u738b\u660e\u519b\u97f3\", \"tone_id=105\"],\n    [\"\u97f3\u9891106\", \"tone_id=106\"],\n    [\"\u97f3\u9891107\", \"tone_id=107\"],\n    [\"\u97f3\u9891108\", \"tone_id=108\"],\n    [\"\u97f3\u9891109\", \"tone_id=109\"],\n    [\"\u97f3\u9891110\", \"tone_id=110\"],\n    [\"\u97f3\u9891111\", \"tone_id=111\"],\n    [\"\u97f3\u9891112\", \"tone_id=112\"],\n    [\"\u97f3\u9891113\", \"tone_id=113\"],\n      [\"\u97f3\u9891114\", \"tone_id=114\"],\n        [\"\u97f3\u9891115\", \"tone_id=115\"],\n    [\"\u97f3\u9891204\", \"tone_id=204\"]\n];\n\n\nvar modeNames = {3: \"\u5c0f\u8bf4\u6a21\u5f0f\",2: \"\u542c\u4e66\u6a21\u5f0f\",8: \"\u6f2b\u753b\u6a21\u5f0f\",11: \"\u77ed\u5267\u6a21\u5f0f\"};\n\n\/\/ \u8bbe\u7f6e\u4fdd\u5b58\u63a5\u53e3\nfunction set(num) {\n    if (num < 0 || num >= data.length) {\n        java.longToast(\"\u65e0\u6548\u7684\u63a5\u53e3\u7f16\u53f7\uff01\");\n        return;\n    }\n    var show = \"\u8bbe\u7f6e\u6210\u529f\\n\u5f53\u524d\u6a21\u5f0f\uff1a\";\n    var tips = \"\\n\u203c\ufe0f\u8bbe\u7f6e\u5b8c\u6210\u8bf7\u70b9\u51fb\u5207\u6362\u6a21\u5f0f\u203c\ufe0f\"\n    var setData = JSON.parse(source.getVariable())\n    setData.sz = num.toString();\n    setData.tone = data[num][1];\n    source.setVariable(JSON.stringify(setData, null, \" \"));\n    var msg = show + data[num][0] + tips;\n    java.longToast(msg);\n}\n\n\/\/ \u8bbe\u7f6e\u4fdd\u5b58\u63a5\u53e3\nfunction set(num) {\n\tif (source.getVariable()==\"\") {\n    reg(true);\n}\n\n    if (num < 0 || num >= data.length) {\n        java.longToast(\"\u65e0\u6548\u7684\u63a5\u53e3\u7f16\u53f7\uff01\");\n        return;\n    }\n    var show = \"\u8bbe\u7f6e\u6210\u529f\\n\u5f53\u524d\u6a21\u5f0f\uff1a\";\n    var tips = \"\\n\u203c\ufe0f\u8bbe\u7f6e\u5b8c\u6210\u8bf7\u70b9\u51fb\u5207\u6362\u6a21\u5f0f\u203c\ufe0f\"\n    var setData = JSON.parse(source.getVariable())\n    \n    const currentTone = data[num][1];\n    if (currentTone == \"tone_id=0\") {\n        setData.module = 2;\n    } else {\n        setData.module = 3;\n    }\n    \n    setData.sz = num.toString();\n    setData.tone = currentTone;\n    source.setVariable(JSON.stringify(setData, null, \"\\t\"));\n    \n    var currentMode = setData.module || 3;\n    var msg = show + (modeNames[currentMode] || \"\u672a\u77e5\u6a21\u5f0f\") + \n              \"\\n\u97f3\u8272\u8bbe\u7f6e\uff1a\" + data[num][0] + tips;\n    java.longToast(msg);\n}\n\n\n\/\/ \u83b7\u53d6\u63a5\u53e3\u663e\u793a\nfunction get() {\n\tif (source.getVariable()==\"\") {\n    reg(true);\n    try {\n        var v = JSON.parse(source.getVariable() || \"{}\");\n        var currentMode = v.module || 3;\n        \n        var message = \"\u5f53\u524d\u6a21\u5f0f\uff1a\" + (modeNames[currentMode] || \"\u672a\u77e5\u6a21\u5f0f\");\n        \n        if (currentMode === 2) {\n            var sz = parseInt(v.sz || \"0\", 10);\n            var toneName = (sz >= 0 && sz < data.length) ? data[sz][0] : \"\u9ed8\u8ba4\";\n            message += \"\\n\u97f3\u8272\u8bbe\u7f6e\uff1a\" + toneName;\n        }\n        \n        java.longToast(message);\n    } catch (e) {\n        java.longToast(\"\u83b7\u53d6\u6a21\u5f0f\u5931\u8d25\uff1a\" + e.message);\n    }\n}else{\n    try {\n        var v = JSON.parse(source.getVariable() || \"{}\");\n        var currentMode = v.module || 3;\n        \n        var message = \"\\n\u5f53\u524d\u6a21\u5f0f\uff1a\" + (modeNames[currentMode] || \"\u672a\u77e5\u6a21\u5f0f\");\n        \n        if (currentMode === 2 || currentMode === 3) {\n            var sz = parseInt(v.sz || \"0\", 10);\n            var toneName = (sz >= 0 && sz < data.length) ? data[sz][0] : \"\u9ed8\u8ba4\";\n            message += \"\\n\u97f3\u8272\u8bbe\u7f6e\uff1a\" + toneName;\n        }\n        \n        java.longToast(message);\n    } catch (e) {\n        java.longToast(\"\u83b7\u53d6\u6a21\u5f0f\u5931\u8d25\uff1a\" + e.message);\n    }}\n}\n\n    \n\nfunction st() {\n\t\t\n\t\n    var v = JSON.parse(source.getVariable());\n    var mode = v.module|| 3; \n\n    var newMode;\n    if (mode === 3) {\n        newMode = 2;\n    } else\n    \n     if (mode === 2) {\n        newMode = 8;\n    } else\n    \n     if (mode === 8) {\n        newMode = 11;\n    } else\n    \n    \n     if (mode === 11) {\n        newMode = 3;\n    } else {\n        newMode = 3; \n    }\n    v.module = newMode;\n\n   \n    v.sz = \"0\";\n    v.tone = \"\";\n\n    source.setVariable(JSON.stringify(v, null, \"\\t\"));\n\n    var show = \"\u8bbe\u7f6e\u6210\u529f\\n\u5f53\u524d\u6a21\u5f0f\uff1a\";\n    var tips = \"\\n\u8bf7\u524d\u5f80\u8be6\u60c5\u9875\u5237\u65b0\u662f\u5426\u5207\u6362\u6210\u529f\";\n    \n    \n    \n    var msg;\n\n    if (newMode === 3) {\n        msg = show + \"\u9605\u8bfb\u6a21\u5f0f\" + tips\n    } else if (newMode === 2) {\n    \t\n    \t   msg = show + \"\u542c\u4e66\u6a21\u5f0f\" + tips;\n    } else if (newMode === 8){\n    \t\n        msg = show + \"\u6f2b\u753b\u6a21\u5f0f\" + tips;\n    } else if (newMode === 11) {\n        msg = show + \"\u77ed\u5267\u6a21\u5f0f\" + tips;\n    }\n    \n    java.longToast(msg);\n}\n\nfunction reg(is) {\n if (is) {\ntry {\nvar setData = {\n\t\"search\": \"-1\",\n\t\"tone_id\": \"-1\",\n\t\"sz\": \"0\",\n\t\"server\": \"http:\/\/nove.98tx.cn\",\n\t\"tone\": \"\",\n\t\"st\": 0,\n\t\"type\": \"\u5c0f\u8bf4\u6a21\u5f0f\",\n\t\"module\": \"3\",\n\t\"faxian\": \"\u5c0f\u8bf4\"\n\t\n}\nsource.setVariable(JSON.stringify(setData, null, \"\\t\"));\n} catch (e) {\nvar setData = {\n\t\"search\": \"-1\",\n\t\"tone_id\": \"-1\",\n\t\"sz\": \"0\",\n\t\"server\": \"http:\/\/nove.98tx.cn\",\n\t\"tone\": \"\",\n\t\"st\": 0,\n\t\"type\": \"\u5c0f\u8bf4\u6a21\u5f0f\",\n\t\"module\": \"3\",\n\t\"faxian\": \"\u5c0f\u8bf4\"\n\t\n}\nsource.setVariable(JSON.stringify(setData, null, \"\\t\"));\n    }\n  }\n}\n\n\n\n\n\n\n\nfunction gets_key() {\n    var servers = String(source.bookSourceUrl);\n    const serverList = servers.split('\\n');\n    \n    for (let server of serverList) {\n        let key = String(cookie.getCookie(server)) || String(java.getCookie(server));\n        if (key) {\n            let keyParts = key.split('secretKey=');\n            if (keyParts.length > 1) {\n                key = keyParts[keyParts.length - 1];\n                setArgument('key', key);\n                return key;\n            }\n        }\n    }\n\n    return '';  \n }\n\n\n\/\/\u83b7\u53d6\u670d\u52a1\u5668\nfunction get_server() {\n    var server = getArgument('server');\n    var tishi = '\\n\\n\u5f53\u524d\u670d\u52a1\u5668\uff1a' + server\n    java.toast(tishi);\n    return server\n}\n\n\/\/\u8bbe\u7f6e\u670d\u52a1\u5668\nfunction set_server() {\n    let zdyserver;\n    try {\n        zdyserver = String(source.getLoginInfoMap().get('\u5176\u4ed6\u670d\u52a1\u5668(\u786e\u5b9a\u540e\u2714\u8fd4\u56de\u70b9\u51fb\u5207\u6362)'));\n        if (zdyserver.includes('http')) {\n            setArgument('server', zdyserver);\n            java.toast(`\\n\\n\u5f53\u524d\u670d\u52a1\u5668\u4e3a\u81ea\u5b9a\u4e49\u670d\u52a1\u5668\\n${zdyserver}\\n\\n\u5207\u6362\u5185\u7f6e\u670d\u52a1\u5668\u8bf7\u5148\u6e05\u7a7a\u81ea\u5b9a\u4e49\u670d\u52a1\u5668\u4e2d\u7684\u6570\u636e`);\n        } else {\n            zdyserver = '';\n        }\n    } catch (error) {\n        zdyserver = '';\n    }\n    if (!zdyserver) {\n        const servers = host\n        const currentServer = getArgument('server') || '';\n        const currentIndex = servers.indexOf(currentServer);\n\n        const nextIndex = currentIndex >= 0 ? (currentIndex + 1) % servers.length : 0;\n        const nextServer = servers[nextIndex];\n\n        setArgument('server', nextServer);\n        java.toast(`\\n\\n\u5f53\u524d\u670d\u52a1\u5668${nextIndex+1}:${nextServer}\\n\\n\u6ce8\u610f\uff1a\u5207\u6362\u670d\u52a1\u5668\u540e\u9700\u8981\u5728\u8be6\u60c5\u9875\u5237\u65b0\u76ee\u5f55\u624d\u80fd\u751f\u6548`);\n    }\n}\n\n\n\n\n\/\/ \u68c0\u6d4b\u670d\u52a1\u5668\nfunction checkNet() {\n    let url = getArgument('server');\n    java.longToast(`\\n\\n\u267b\ufe0f\u6b63\u5728\u68c0\u6d4b\uff1a${url}\\n\u8bf7\u7a0d\u7b49~`);\n    let date1 = new Date().getTime();\n    let html = java.log(java.ajax(url));\n    let date2 = new Date().getTime();\n    let t = date2 - date1;\n    let c = String(html).indexOf('API \u7edf\u8ba1\u4eea\u8868\u677f'); \/\/ \u5173\u952e\u5185\u5bb9\u68c0\u6d4b\n    let time = t \/ 1000 + 's';\n    let logTime = '\u3010' + url + '\u3011\\n\u250b\u250b\\n' + '\u89e3\u6790\u65f6\u95f4\uff1a' + time;\n\n    if (c == -1 || t > 5000) {\n        java.longToast('\\n\u3010\u56e2\u5915\u5c0f\u7ad9\u3011\\n' + \n                      '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + \n                      logTime + '\\n\u250b\u250b\\n\u2663\ufe0f\u5f53\u524d\u63a5\u53e3\u2663\ufe0f\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\/\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + \n                      '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    } else if (t < 1000) {\n        java.longToast('\\n\ud83d\udc96\u3010\u7f51\u7edc\u73af\u5883\u4f18\u826f\u3011\\n' + \n                      '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + \n                      logTime + '\\n\u250b\u250b\\n\u2764\ufe0f\u5ef6\u8fdf\u4f4e\uff0c\u63a8\u8350\u4f7f\u7528\u6b64\u63a5\u53e3\u2764\ufe0f\\n\u250b\u250b\\n\u7f51\u7edc\u73af\u5883\u4f18\u826f\uff0c\u8bf7\u7ee7\u7eed\u4fdd\u6301\u72b6\u6001\\n\u250b\u250b' + \n                      '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    } else if (t >= 1000 && t < 2000) {\n        java.longToast('\\n\ud83d\udc9b\u3010\u7f51\u7edc\u73af\u5883\u4e00\u822c\u3011\\n' + \n                      '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + \n                      logTime + '\\n\u250b\u250b\\n\u2666\ufe0f\u5ef6\u8fdf\u4e00\u822c\uff0c\u52c9\u5f3a\u53ef\u4f7f\u7528\u2666\ufe0f\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\u6216\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + \n                      '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    } else if (t >= 2000 && t < 5000) {\n        java.longToast('\\n\ud83d\udc94\u3010\u7f51\u7edc\u73af\u5883\u582a\u5fe7\u3011\\n' + \n                      '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + \n                      logTime + '\\n\u250b\u250b\\n\u2660\u5ef6\u8fdf\u8fc7\u9ad8\uff0c\u4e0d\u5efa\u8bae\u4f7f\u7528\u2660\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\u6216\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + \n                      '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    }\n}\n\n\n\n\n\n\/\/\u81ea\u5b9a\u4e49\u97f3\u8272\nfunction set_tone_id() {\n    let zdytone_id;\n    try {\n        zdytone_id = String(source.getLoginInfoMap().get('\u5176\u4ed6\u97f3\u8272ID(\u786e\u5b9a\u540e\u2714\u8fd4\u56de\u70b9\u51fb\u5207\u6362)'));\n        if (zdytone_id) {\n        \t  setArgument('sz', 1);\n          setArgument('tone', \"tone_id=\"+zdytone_id);\n          java.toast(\"\\n\\n\u5df2\u4fdd\u5b58\u81ea\u5b9a\u4e49\u97f3\u8272\");\n        } else {\n            zdytone_id = '';\n        }\n    } catch (error) {\n        zdytone_id = '';\n    }\n    if (!zdytone_id) {\n        let toast = \"\\n\\n\u81ea\u5b9a\u4e49\u97f3\u8272\u4e3a\u7a7a\";\n        java.toast(toast);\n    }\n}\n\n\n\n\n\n\n\n\n\/\/\u83b7\u53d6\u53c2\u6570\nfunction getArgument(key) {\n    let open_argument = source.getVariable();\n    return getArguments(open_argument,key);\n}\n\n\/\/\u8bbe\u7f6e\u53c2\u6570\nfunction setArgument(key, value) {\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument,'');\n    open_argument[key] = value;\n    open_argument = JSON.stringify(open_argument, null, \"\\t\");\n    source.setVariable(open_argument);\n    return open_argument;\n}\n\nfunction getKey() {\n\t   let url = \"http:\/\/gx.98tx.cn\";\n\t   let mes = \"\u66f4\u65b0\u4e66\u6e90\uff01\"\n\t   java.startBrowser(url, \"\u66f4\u65b0\u4e66\u6e90\")\n\t   java.longToast(mes);\n\t   return;\n\t}\n\n\nfunction zz(){\n\tlet url=\"http:\/\/nove.98tx.cn\/zs.png\"\n\tlet mes=\"\u6b22\u8fce\u8d5e\u52a9\u670d\u52a1\u5668\uff01\"\n\tjava.startBrowser(url, \"\u56e2\u5915\u8d5e\u52a9\u7801\")\n\t   java.longToast(mes);\n\t   return;\n\t}","respondTime":180000,"ruleBookInfo":{"author":"author","canReName":"true","coverUrl":"@js:replaceCover(java.getString(\"thumb_url\"))","init":"<js>\nvar model = [\n    [\"\u6b63\u5e38\u6a21\u5f0f\", \"\"],\n    [\"\u81ea\u5b9a\u4e49\u97f3\u8272\", \"\"],\n    [\"\u771f\u4eba\", \"tone_id=0\"],\n    [\"\u751c\u7f8e\u5c11\u5973\", \"tone_id=1\"],\n    [\"\u6e05\u4eae\u9752\u53d4\", \"tone_id=2\"],\n    [\"\u6210\u719f\u5927\u53d4\", \"tone_id=4\"],\n    [\"\u5f00\u6717\u9752\u5e74\", \"tone_id=5\"],\n    [\"\u6e29\u67d4\u6dd1\u5973\", \"tone_id=6\"],\n    [\"\u97f3\u98917\", \"tone_id=7\"],\n    [\"\u98ce\u96c5\u9752\u53d4\", \"tone_id=8\"],\n    [\"\u97f3\u98919\", \"tone_id=9\"],\n    [\"\u97f3\u989110\", \"tone_id=10\"],\n    [\"\u97f3\u989111\", \"tone_id=11\"],\n    [\"\u6e05\u7eaf\u5c11\u5973\", \"tone_id=12\"],\n    [\"\u97f3\u989114\", \"tone_id=14\"],\n    [\"\u97f3\u989115\", \"tone_id=15\"],\n    [\"\u97f3\u989116\", \"tone_id=16\"],\n    [\"\u78c1\u6027\u9752\u53d4\", \"tone_id=17\"],\n    [\"\u97f3\u989118\", \"tone_id=18\"],\n    [\"\u97f3\u989121\", \"tone_id=21\"],\n    [\"\u97f3\u989122\", \"tone_id=22\"],\n    [\"\u97f3\u989123\", \"tone_id=23\"],\n    [\"\u97f3\u989126\", \"tone_id=26\"],\n    [\"\u63a8\u6587\u5973\u58f0\", \"tone_id=27\"],\n    [\"\u4eb2\u5207\u59d0\u59d0\", \"tone_id=28\"],\n    [\"\u5112\u96c5\u5927\u53d4\", \"tone_id=29\"],\n    [\"\u4f18\u96c5\u5fa1\u59d0\", \"tone_id=30\"],\n    [\"\u65af\u6587\u9752\u53d4\", \"tone_id=31\"],\n    [\"\u77e5\u6027\u4e3b\u64ad\", \"tone_id=32\"],\n    [\"\u591a\u4eba\u5bf9\u8bdd\", \"tone_id=51\"],\n    [\"\u97f3\u989153\", \"tone_id=53\"],\n    [\"\u97f3\u989155\", \"tone_id=55\"],\n    [\"\u97f3\u989156\", \"tone_id=56\"],\n    [\"\u97f3\u989157\", \"tone_id=57\"],\n    [\"\u97f3\u989158\", \"tone_id=58\"],\n    [\"\u97f3\u989159\", \"tone_id=59\"],\n    [\"\u97f3\u989160\", \"tone_id=60\"],\n     [\"\u97f3\u989161\", \"tone_id=61\"],\n     [\"\u97f3\u989162\", \"tone_id=62\"],\n     [\"\u97f3\u989163\", \"tone_id=63\"],\n     [\"\u97f3\u989164\", \"tone_id=64\"],\n     [\"\u97f3\u989167\", \"tone_id=67\"],   \n     [\"\u97f3\u989168\", \"tone_id=68\"],\n      [\"\u97f3\u989171\", \"tone_id=71\"],\n      [\"\u97f3\u989172\", \"tone_id=72\"],\n      [\"\u97f3\u989173\", \"tone_id=73\"],\n    [\"\u6210\u719f\u5347\u7ea7\", \"tone_id=74\"],\n     [\"\u97f3\u989175\", \"tone_id=75\"],\n       [\"\u97f3\u989176\", \"tone_id=76\"],\n       [\"\u97f3\u989177\", \"tone_id=77\"],\n        [\"\u97f3\u989178\", \"tone_id=78\"],\n       [\"\u97f3\u989179\", \"tone_id=79\"],\n    [\"\u97f3\u989180\", \"tone_id=80\"],\n    [\"\u97f3\u989181\", \"tone_id=81\"],\n     [\"\u97f3\u989182\", \"tone_id=82\"],\n     [\"\u97f3\u989184\", \"tone_id=84\"],\n      [\"\u97f3\u989185\", \"tone_id=85\"],\n      [\"\u97f3\u989186\", \"tone_id=86\"],\n       [\"\u97f3\u989187\", \"tone_id=87\"],\n       [\"\u97f3\u989188\", \"tone_id=88\"],\n         [\"\u97f3\u989189\", \"tone_id=89\"],\n           [\"\u97f3\u989190\", \"tone_id=90\"],\n            [\"\u97f3\u989191\", \"tone_id=91\"],\n    [\"\u4fcf\u76ae\u5fa1\u59d0\", \"tone_id=100\"],\n    \/\/ [\"\u90bb\u5bb6\u59b9\u59b9\", \"\"],\n    [\"\u97f3\u9891101\", \"tone_id=101\"],\n    [\"\u97f3\u9891102\", \"tone_id=102\"],\n    [\"\u53cc\u97f3\u7075\u52a8\", \"tone_id=103\"],\n    [\"\u97f3\u9891104\", \"tone_id=104\"],\n    [\"\u738b\u660e\u519b\u97f3\", \"tone_id=105\"],\n    [\"\u97f3\u9891106\", \"tone_id=106\"],\n    [\"\u97f3\u9891107\", \"tone_id=107\"],\n    [\"\u97f3\u9891108\", \"tone_id=108\"],\n    [\"\u97f3\u9891109\", \"tone_id=109\"],\n    [\"\u97f3\u9891110\", \"tone_id=110\"],\n    [\"\u97f3\u9891111\", \"tone_id=111\"],\n    [\"\u97f3\u9891112\", \"tone_id=112\"],\n    [\"\u97f3\u9891113\", \"tone_id=113\"],\n    [\"\u97f3\u9891114\", \"tone_id=114\"],\n    [\"\u97f3\u8272115\", \"tone_id=114\"],\n    [\"\u97f3\u8272204\", \"tone_id=204\"]\n];\n\nvar s = JSON.parse(source.getVariable())\n\nserver = s.server? s.server: source.server;\njava.put(\"server\",server);\n\n\n\n\nif (s.st == 1) { \n   book.putVariable(\"custom\", JSON.stringify(s, null, \"\\t\"));\n   s.st = 0\n   source.setVariable(JSON.stringify(s, null, \"\\t\"));\n}\n\nvar modeTips = {\"3\": \"\\n\ud83d\udcd6 \u5c0f\u8bf4\u6a21\u5f0f\",\t\"2\": \"\\n\ud83c\udfa7 \u542c\u4e66\u6a21\u5f0f\",\"8\": \"\\n\ud83c\udf08 \u6f2b\u753b\u6a21\u5f0f\",\"11\": \"\\n\ud83c\udfac \u77ed\u5267\u6a21\u5f0f\"\t};\n\n\n    \n    \n    \n    \n\nfunction get(index) {\n  \n    var currentMode = s.module || 0;\n    var modeTip = modeTips[currentMode] || \"\";\n    \n    if (currentMode == \"2\" || currentMode == \"3\") {\n        var v = (book.getVariable('custom') != \"\") ? book.getVariable('custom') : source.getVariable();\n  \n  \n    try {\n            var szStr = JSON.parse(v).sz;\n            var sz = parseInt(szStr, 10);\n            if (sz < 0 || sz >= model.length) {\n                sz = 0;\n            }\n            var show = modeTip + \"\\n\u5f53\u524d\u97f3\u8272\uff1a\";\n            java.longToast(show + model[sz][0] + \"\\n\u90e8\u5206\u4e66\u7c4d\u652f\u6301\u771f\u4eba\u53d1\u97f3\");\n        } catch (e) {\n            java.longToast(modeTip + \"\\n\u83b7\u53d6\u97f3\u8272\u5931\u8d25\uff0c\u4f7f\u7528\u9ed8\u8ba4\u3002\");\n    }\n      } else {\n        java.longToast(modeTip);\n  }\n}\n\n\n\nfunction getTones(tones, run) {\n    if (run == 0) {\n    var voiceTones = tones.split(',').map(function(tone) {\n        var voice = model.find(function(item) {\n            return item[1] == `tone_id=${tone}`;\n        });\n        return voice ? voice[0] : '';\n    });\n    return '\ud83c\udfbc \u97f3\u8272\u652f\u6301\uff1a' + voiceTones.filter(Boolean) + '\\n\\u200b\\n';\n    } \n  return ''\n}\n\n\n\n\n\n\n\n\nvar Regs = [\/book_id=(\\d+)\/i, \/d=(\\d+)\/i, \/(\\d+)\/i];\nvar book_id = \"\";\nfor (let Reg of Regs) {\n    let mat = baseUrl.match(Reg);\n    if (mat) {\n        book_id = mat[1];\n        break;\n    }\n}\n\n\n\nvar u_Index = 0; \/\/ 0-1\nswitch (String(['API', 'TOU'][u_Index])) {\n    case 'API':\n        result = java.ajax(xGorgon(\n            \"detail\",\n            \"book_id=\" + book_id\n        ));\n        if (JSON.parse(result).code == 0) break;\n        \/\/ java.log(\"\u63a5\u53e3\u5f02\u5e38\uff0c\u4f7f\u7528\u5934\u6761\u63a5\u53e3\u83b7\u53d6\");\n\n        \/\/ \u8fd9\u4e24\u4e2a\u63a5\u53e3\u4fe1\u606f\u4e0d\u5168\n        \/\/ result = java.ajax(\"https:\/\/fanqienovel.com\/page\/\"+book_id).match(\/__INITIAL_STATE__=([^;]+)\/)[1];\n        \/\/ result = java.ajax(getHost(1,3,1,5)+\"\/reading\/bookapi\/multi-detail\/v\/?aid=1967&iid=1&version_code=999&book_id=\"+book_id);\n\n        \/\/ \u5934\u6761\u63a5\u53e3\n    default:\n        result = java.ajax(\"https:\/\/novel.snssdk.com\/api\/novel\/book\/directory\/list\/v1\/?device_platform=android&version_code=1207&novel_version=&app_name=gold_browser&version_name=2.0.7&channel=vivo_6589_64&device_type=wldw&os_api=28&os_version=9&book_id=\" + book_id);\n        break;\n}\nvar Res  = JSON.parse(result);\nvar data = Res.page || Res.data;\ndata = (Array.isArray(data) ? data[0] : data.book_info) || data;\n\n\nvar type = data.genre;\njava.put(\"type\",type);\nget(type);\nvar tts_info = getTones(data.tones, data.genre);\njava.put(\"tts_info\", tts_info);\n\n\n\n\nJSON.stringify(data);\n\n\n\n\n\n\n\n\n<\/js>\n","intro":"&nbsp;&nbsp;\n\ud83d\uddd1 \u63a5\u53e3\uff1a{{getArguments(source.getVariable(),'server');}}\n\ud83c\udd94 \u4e66\u53f7\uff1a{{$.book_id}}\n\ud83d\udcd5 \u6e90\u540d\uff1a{{$.original_book_name}}\n\ud83d\udcd6 \u522b\u540d\uff1a{{$.book_flight_alias_name}}\n\ud83c\udf9a \u72b6\u6001\uff1a__status__\n\u270f\ufe0f \u5f00\u5751\uff1a{{$.create_time##T|\\+.*## }}\n\ud83d\udd70\ufe0f \u66f4\u65b0\uff1a{{String(java.timeFormatUTC(java.getString('$..last_chapter_update_time')*1000,'yyyy-MM-dd HH:mm:ss',8)).replace(\/.*1970\\-.*\/,'')}}\n\ud83c\udff7\ufe0f \u6807\u7b7e\uff1a{{$.tags}}\n\ud83d\udc64 \u4e3b\u89d2\uff1a{{$.roles##\\[|\\\"|\\]}}\n\u2699\ufe0f  \u5f53\u524d\u6a21\u5f0f\uff1asyms\n\ud83d\udde3 \u5f53\u524d\u97f3\u8272\uff1a{{cache.get(\"tone\")}}\n\ud83d\udd0a \u53ef\u9009\u97f3\u8272\uff1a{{$.tones}}\n\ud83d\udc41\ufe0f \u5728\u7ebf\uff1a{{$.read_count}}\u4eba\u5728\u8bfb\n\ud83d\udcdc \u7b80\u4ecb\uff1a{{$.abstract}}\n\ud83d\udccd {{$.copyright_info##\uff0c.*##\u3002}}\n@js:\n\nfaxian=source.getVariable()\nlet tone = getArguments('tone_id').tone_id;\nlet type = getArguments('type');\nlet syms = '\u5c0f\u8bf4';\nif (faxian.match(\/\u77ed\u5267\/)) {\n\tsyms = '\u77ed\u5267\u6a21\u5f0f'\n\t} else \n\tif (faxian.match(\/\u542c\u4e66\/)) {\n\tsyms = '\u542c\u4e66\u6a21\u5f0f'\n\t} else \n\t\n\tif (faxian.match(\/\u6f2b\u753b\/)) {\n\tsyms = '\u6f2b\u753b\u6a21\u5f0f'\n\t} else {\n\tsyms = '\u5c0f\u8bf4\u6a21\u5f0f'\n\t}\ntry {\n\tlet tone_id = source.getLoginInfoMap()['\u542c\u4e66Ai\u97f3\u8272\u586b\u5199\u8be6\u60c5\u9875\u5e8f\u53f7'];\n  if (tone_id!='') {\n  \ttone = String(tone_id)\n  \t}\n} catch (e) {}\nresult.replace(\/.+\uff1a(\u4eba\u5728\u8bfb)?\\n\/g,\"\").replace('ystone',tone).replace('syms',syms).replace('__status__', (java.getString('$.book_search_visible') == 'true' ? '\u6b63\u5e38' : (java.getString('$.tomato_book_status') == '3' ? '\u4e0b\u67b6' : '\u5c0f\u9ed1\u5c4b')));","kind":"\u7537\u751f{{$.gender}}\u5973\u751f\n{{$.category}}\n\u8fde\u8f7d{{$.creation_status}}\u5b8c\u7ed3\n{{$.score}}\u5206\n{{java.timeFormatUTC(java.getString(\"last_chapter_update_time\")*1000,'yyyy-MM-dd',8)}}\n##\u8fde\u8f7d0|1\u5b8c\u7ed3\n@js:result\n.replace(\/\u7537\u751f.\u5973\u751f\/, String(java.getString(\"$.isbn\")) ? \"\u51fa\u7248\" : `\u7537\u751f${java.getString(\"$.gender\")}\u5973\u751f`)\n.replace(\"\u7537\u751f0\", \"\")\n.replace(\"1\u5973\u751f\", \"\")\n.replace(\"\u7537\u751f2\u5973\u751f\", \"\u51fa\u7248\")\n.replace(\"\u8fde\u8f7d4\u5b8c\u7ed3\",\"\u65ad\u66f4\")\n.replace(\"\u8fde\u8f7d-1\u5b8c\u7ed3\",\"\u672a\u77e5\");","lastChapter":"{{$.last_chapter_title}} \u2022 {{java.timeFormat(java.getString(\"last_chapter_update_time\")*1000)}}","name":"book_name","tocUrl":"book_id\n<js>java.base64Encode(result)<\/js>\ndata:book_id;base64,{{result}},{\"type\":\"fqnovel\"}","wordCount":"word_number"},"ruleContent":{"content":"<js>\nvar item_id = java.hexDecodeToString(result);\n\nvar v = JSON.parse((book.getVariable('custom') != \"\") ? book.getVariable('custom') : source.getVariable());\nvar type = v.module;\n\n\nvar v = (book.getVariable('custom') != \"\") ? book.getVariable('custom') : source.getVariable();\nvar v = JSON.parse(v)\nvar sz = v.sz;\nvar tone = v.tone;\nvar server = java.get(\"server\");\n\n\n\nif (type == 8) {\n  book.type = 64;\n} else if (type == 2 || sz != 0) {\n  book.type = 32;\n} else {\n  book.type = 8;\n}\n\n\n\nif (type == 2 || sz != 0) {\n    if (!tone) {\n        url = server  + '\/api\/index.php?api=content&ts=\u542c\u4e66&item_ids=' + item_id+'&tone=1';\n        java.log(url)\n    } else {\n        url =server  + `\/api\/index.php?api=content&ts=\u542c\u4e66&item_ids=${item_id}&${tone}`;\n        java.log(url)\n    }\n    try {\n  result = JSON.parse(java.ajax(url)).data.content;\n    } catch(e) {\n   result = \"\u8be5\u4e66\u4e0d\u652f\u6301\u5f53\u524d\u97f3\u8272\uff0c\u8bf7\u66f4\u6362\u5e76\u5237\u65b0\";\n    }\n\n} else if (type == 11) {\n  var bookId = \"\";\n  try {\n      if (book.bookUrl) {\n          var match = book.bookUrl.match(\/book_id=(\\d+)\/);\n          if (match) bookId = match[1];\n      }\n  } catch(e) {}\n  \n  var url = server + `\/api\/index.php?api=player&item_id=${item_id}&book_id=${bookId}`;\n  \n  try {\n      java.startBrowser(url, chapter.title);\n      result = \"\u6b63\u5728\u542f\u52a8\u64ad\u653e\u5668...\\n\u2705 \u70b9\u51fb\u94fe\u63a5\u624b\u52a8\u64ad\u653e:\\n\" + url;\n  } catch(e) {\n      result = \"\u542f\u52a8\u64ad\u653e\u5668\u5931\u8d25: \" + e + \"\\n\" + url;\n  }\n} else if (false) {\n  var url =server +  `\/api\/index.php?api=video&ts=\u77ed\u5267&item_id=${item_id}`; \n  \n  \n  try {\nresult = JSON.parse(java.ajax(url)).data.video_url;\n\n\n      \n \n  \tintro1=String(book.intro);\n  \ta=intro1.split('\\n');\n  \tvar intro='';\n  \ta.forEach(n=>{\n  \t\tintro+=n;\n  \t\tintro+='<br>';\n  \t\t});\n  \t\/\/java.log(intro);\n  if (book['durChapterIndex'] == chapter['index']) { \n\t\tb64 = java['base64Encode'](`\n    <html>\n    <head>\n    <title>${chapter.title}<\/title>\n        <meta name=\"viewport\" content=\"width=device-width\">\n        <style>\n        body {\n            margin: 0;\n            font-family: Arial, sans-serif;\n            background: linear-gradient(135deg, #ece9e6, #ffffff);\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            justify-content: flex-start;\n            padding: 20px;\n        }\n        .container {\n            width: 100%;\n            max-width: 800px;\n            background: #fff;\n            border-radius: 10px;\n            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n            overflow: hidden;\n            margin-bottom: 20px;\n        }\n        h3 {\n            margin: 0;\n            padding: 10px 20px;\n            font-size: 0.9em;\n            background: #333;\n            color: #fff;\n            border-radius: 10px 10px 0 0;\n        }\n        .video-container {\n            width: 100%;\n            background: #000;\n            position: relative;\n        }\n        video {\n            width: 100%;\n            height: auto;\n            display: block;\n        }\n        .info-container {\n            padding: 20px;\n        }\n        .info-container p {\n            margin: 10px 0;\n            color: #555;\n        }\n        .info-container p span {\n            font-weight: bold;\n            color: #000;\n        }\n        <\/style>\n    <\/head>\n\n    <body>\n        <div class=\"container\">\n            <h3>{{book.name}}<\/h3>\n            <div class=\"video-container\">\n                <video id=\"video\" src=\"${result}\" poster=\"{{$.model.coverUrl}}\" controls><\/video>\n            <\/div>\n        <\/div>\n        <div class=\"info-container\">\n            <p><br>${intro} <\/p>\n        <\/div>\n        <script>\n        \/\/ \u83b7\u53d6\u89c6\u9891\u5143\u7d20\n        const video = document.getElementById('video');\n        let touchStartX = 0;\n        let touchStartY = 0;\n        let touchStartTime = 0;\n        let isLongPress = false;\n        \/\/ \u6ed1\u52a8\u5feb\u8fdb\n        video.addEventListener('touchstart', (e) =>\n        {\n            touchStartX = e.touches[0].clientX;\n            touchStartY = e.touches[0].clientY;\n            touchStartTime = Date.now();\n            isLongPress = false;\n        });\n        video.addEventListener('touchmove', (e) =>\n        {\n            const deltaX = e.touches[0].clientX - touchStartX;\n            const deltaY = e.touches[0].clientY - touchStartY;\n            \/\/ \u5982\u679c\u662f\u6c34\u5e73\u6ed1\u52a8\uff0c\u4e14\u672a\u8fdb\u5165\u957f\u6309\u72b6\u6001\n            if(Math.abs(deltaX) > Math.abs(deltaY) && !isLongPress)\n            {\n                const duration = video.duration;\n                const seekTime = video.currentTime + (deltaX \/ 50); \/\/ \u6bcf\u6ed1\u52a8100px\u5feb\u8fdb1\u79d2\n                video.currentTime = Math.min(Math.max(seekTime, 0), duration);\n            }\n            e.preventDefault(); \/\/ \u9632\u6b62\u9ed8\u8ba4\u884c\u4e3a\uff08\u5982\u9875\u9762\u6eda\u52a8\uff09\n        });\n        \/\/ \u957f\u6309\u5feb\u8fdb\n        video.addEventListener('touchend', (e) =>\n        {\n            const touchEndTime = Date.now();\n            const touchDuration = touchEndTime - touchStartTime;\n            \/\/ \u5982\u679c\u957f\u6309\u65f6\u95f4\u8d85\u8fc7500ms\uff0c\u8fdb\u5165\u957f\u6309\u5feb\u8fdb\u72b6\u6001\n            if(touchDuration > 500)\n            {\n                isLongPress = true;\n                \/\/ \u5728\u957f\u6309\u72b6\u6001\u4e0b\uff0c\u6839\u636e\u6ed1\u52a8\u8ddd\u79bb\u5feb\u8fdb\n                const deltaX = e.changedTouches[0].clientX - touchStartX;\n                const duration = video.duration;\n                const seekTime = video.currentTime + (deltaX \/ 100); \/\/ \u6bcf\u6ed1\u52a8100px\u5feb\u8fdb1\u79d2\n                video.currentTime = Math.min(Math.max(seekTime, 0), duration);\n            }\n            else\n            {\n                isLongPress = false;\n            }\n        });\n                <\/script>\n    <\/body>\n\n    <\/html> `); \n    \n   \n    baseUrl = 'data:text\/html;base64,' + b64;\n    \njava.startBrowser(baseUrl,chapter.title);\n\n    java['toast']('\u6b63\u5728\u52a0\u8f7d\u89c6\u9891\\n\u89c6\u9891\u52a0\u8f7d\u8f83\u6162\uff0c\u8bf7\u8010\u5fc3\u7b49\u5f85'); } '\u3010\u5237\u65b0\u6b63\u6587\u3011\u64ad\u653e\\n\u2705\u76f4\u94fe:\\n' +`${url}`; \n\n  } catch(e) { \n result = '\u89c6\u9891\u83b7\u53d6\u5931\u8d25\uff0c\u5c1d\u8bd5\u91cd\u65b0\u83b7\u53d6';\n  }\n} else\n\n if (type == 8) {\n \t\n \t\n let url =  getServerHost() + '\/api\/index.php?&api=raw_full&item_id=' +item_id;\n \n \/\/java.log( url)\nlet res =\nJSON.parse(java.ajax(url)).data.content;\n\nfunction getComic(result) {\n  let mat = result.match(\/<article>([\\s\\S]*?)<\\\/article>\/);\n  try {\n    let cnt = JSON.parse(\n      mat\n        ? mat[1].replace(\/\\&\/g, '\"').replace(\/\\;\/g, \"\").replace(\/\\#34\/g, \"\")\n        : result\n    );\n    return (mat ? cnt.skeleton.data : cnt.picInfos)\n      .map((i) => {\n        let path = mat\n          ? cnt.materials[i.element_name].data.web_uri\n          : \"novel-pic\/\" + i.md5;\n        return `<img src=\"https:\/\/p3-novel.byteimg.com\/origin\/${path}\">`;\n      })\n      .join(\"<br>\");\n  } catch (e) { \/\/ not comic content\n    mat = result.match(\/<body>([\\s\\S]*?)<\\\/body>\/)\n    \/\/ java.log(result)\n    return (mat ? mat[1] : result).toString().replace(\/\\<\\!DOCTYPE html.*\/g, \"\").replace(\/\\<tt_keyword_ad.*\\<\\\/tt_keyword_ad\\>\/, \"\").replace(\/\\<a epub.*\\>\\<\\\/a\\>\/g, \"\")\n  }\n}\nresult = getComic(String(res));\nresult.replace(\/\\{\\!\\-\\- PGC_VOICE\\:.*\\-\\-\\}\/g, \"\")\n\n \n \n\n} else {\n    let url =  server  + '\/api\/index.php?api=content&api_type=batch&item_ids=' + item_id;\n    \n   result = JSON.parse(java.ajax(url)).data[0].content;\n \n } \n \nresult;\n<\/js>","imageStyle":"FULL"},"ruleExplore":{"author":"$.author||$.copyright","bookList":"<js>\n\nlet ck = \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : (source.getLoginInfoMap() || {})['\u624b\u52a8\u767b\u5f55Token'])\n\ngetShelf = () => {\nlet book_shelf_url = 'https:\/\/fanqienovel.com\/reading\/bookapi\/bookshelf\/info\/v:version\/?aid=1967&iid=0&version_code=57700&update_version_code=57700'\nlet book_shelf_info = java.ajax(book_shelf_url + ', ' + JSON.stringify({\n  headers: {\n    'Cookie': ck\n  }\n}))\n\nbid = getBookIdFull(book_shelf_info)\nlet id_list = splitArray(bid, 100)\nlet urls = []\nid_list.forEach(i => {\n    urls.push(xGorgon(\"multi-detail\", \"book_id=\" + i.join(\",\"), null, ck))\n})\n\nres = java.ajaxAll(urls)\n\nlet resp = {book_info: []}\nres.forEach(r => {\n  resp.book_info = resp.book_info.concat(JSON.parse(r.body()).data)\n})\n\nreturn resp\n}\n\nfunction getByGroupName(name) {\n  let book_shelf_url = 'https:\/\/fanqienovel.com\/reading\/bookapi\/bookshelf\/info\/v:version\/?aid=1967&iid=0&version_code=57700&update_version_code=57700'\n\n  let book_shelf_info = JSON.parse(java.ajax(book_shelf_url + ', ' + JSON.stringify({\n    headers: {\n      'Cookie': ck,\n    }\n  })))\n  let group_bookids = {\n    \"\u672a\u5206\u7ec4\": []\n  }\n  \/\/ java.log(\n  book_shelf_info.data.book_shelf_info.forEach(i => {\n    if (!group_bookids[i.group_name ? i.group_name : \"\u672a\u5206\u7ec4\"]) group_bookids[i.group_name] = []\n    group_bookids[i.group_name ? i.group_name : \"\u672a\u5206\u7ec4\"].push(i.book_id)\n  })\n  \/\/ java.log(JSON.stringify(group_bookids[\"\u672a\u5206\u7ec4\"]))\n  \/\/ java.log(decodeURIComponent(name))\n  if (!group_bookids[decodeURIComponent(name)]) return {data: []}\n  \/\/java.log(\"awa\")\n  let book_ids = splitArray(group_bookids[decodeURIComponent(name)], 100)\n  let urls = []\n\n  book_ids.forEach(i => {\n    urls.push(xGorgon(\"multi-detail\", \"book_id=\" + i.join(\",\"), null, ck))\n  })\n  \n  res = java.ajaxAll(urls)\n\n  let resp = {book_info: []}\n  res.forEach(r => {\n    resp.book_info = resp.book_info.concat(JSON.parse(r.body()).data)\n  })\n\n  return resp\n}\n\nfunction getByTabIndex(index) {\n  let url = xGorgon(\n\t  \"bookmall\/tab\",\n    \"version_name=5.8.9.32&device_id=1024&device_type=114514&iid=2048\",\n\t  null,\n\t  ck\n  )\n  let all = JSON.parse(java.ajax(url))\n  let tab = all.data.tab_item[0].cell_data[index]\n  \/\/ java.log(JSON.stringify(tab))\n  tab = tab.cell_data\n  if (!tab) tab = []\n  let bookList = []\n  for (let i of tab) {\n    bookList = bookList.concat(i.book_data)\n    \/\/ java.log(JSON.stringify(i.book_data))\n  }\n  return { book_info: bookList }\n}\n\nif (baseUrl.endsWith(\"bookshelf\")) result = getShelf(\"bookshelf\/info\")\nelse {\n  let w = baseUrl.split(\"\/\")\n  if (baseUrl.includes(\"groupName\")) {\n    result = getByGroupName(w[w.length - 1])\n  } else if (baseUrl.includes(\"tab\")) {\n    result = getByTabIndex(parseInt(w[w.length - 1]))\n  } else result = JSON.parse(result)\n}\nJSON.stringify({data: result.book_info || result.data.book_info || result.detail_list || result.data.video_info || result.data})\n<\/js>\n$.data[*]","bookUrl":"\/reading\/bookapi\/detail\/v\/?book_id={{$.book_id||$.series_id}}","coverUrl":"@js:replaceCover(java.getString(\"thumb_url||cover\"))","intro":"$.abstract||$..video_desc##\\n","kind":"\u7537\u751f{{$.gender}}\u5973\u751f\n{{$.category}}\n\u8fde\u8f7d{{$.creation_status}}\u5b8c\u7ed3\n{{$.score}}\u5206\n{{java.timeFormatUTC(java.getString(\"last_chapter_update_time\")*1000,'yyyy-MM-dd',8)}}\n##\u8fde\u8f7d0|1\u5b8c\u7ed3\n@js:result\n.replace(\/\u7537\u751f.\u5973\u751f\/, String(java.getString(\"$.isbn\")) ? \"\u51fa\u7248\" : `\u7537\u751f${java.getString(\"$.gender\")}\u5973\u751f`)\n.replace(\"\u7537\u751f0\", \"\")\n.replace(\"1\u5973\u751f\", \"\")\n.replace(\"\u7537\u751f2\u5973\u751f\", \"\u51fa\u7248\")\n.replace(\"\u8fde\u8f7d4\u5b8c\u7ed3\",\"\u65ad\u66f4\")\n.replace(\"\u8fde\u8f7d-1\u5b8c\u7ed3\",\"\u672a\u77e5\")\n.replace(\"1970-01-01\", \"\");","name":"$.book_name||$.title","wordCount":"$.word_number"},"ruleSearch":{"author":"$.author||$.copyright","bookList":"<js>\nlet res = JSON.parse(result)\n\nlet list = [];\nlet book_list = [];\n\ntry {\n  if (res.search_tabs) {\n    for (let i = 0; i < res.search_tabs.length; i++) {\n        let books = res[\"search_tabs\"][i][\"data\"];\n        if (books != null) list = list.concat(books);\n    }\n  }\n} catch (e) {\n    java.log(\"\u51fa\u9519\")\n}\n\nfor (let $ of list) {\n   book_list.push($.book_data ? $.book_data[0] : ($.video_data ? $.video_data[0] : $));\n}\n\nJSON.stringify(book_list)\n<\/js>$[*]","bookUrl":"\/reading\/bookapi\/detail\/v\/?book_id={{$.book_id||$.series_id}}","checkKeyWord":"https:\/\/www.baidu.com\/\u5220\u4e66\u793a\u4f8b?book_id=7285555567827880975","coverUrl":"@js:replaceCover(java.getString(\"thumb_url||cover\"))","intro":"$.abstract||$.series_intro##\\n","kind":"\u7537\u751f{{$.gender}}\u5973\u751f\n{{$.category}}\n\u8fde\u8f7d{{$.creation_status}}\u5b8c\u7ed3\n{{$.score}}\u5206\n##\u8fde\u8f7d0|1\u5b8c\u7ed3\n@js:result\n.replace(\/\u7537\u751f.\u5973\u751f\/, String(java.getString(\"$.isbn\")) ? \"\u51fa\u7248\" : `\u7537\u751f${java.getString(\"$.gender\")}\u5973\u751f`)\n.replace(\"\u7537\u751f0\", \"\")\n.replace(\"1\u5973\u751f\", \"\")\n.replace(\"\u7537\u751f2\u5973\u751f\", \"\u51fa\u7248\")\n.replace(\"\u8fde\u8f7d4\u5b8c\u7ed3\",\"\u65ad\u66f4\")\n.replace(\"\u8fde\u8f7d-1\u5b8c\/reading\/bookapi\/detail\/v\/?book_id={{$.book_id||$.series_id}}\u7ed3\",\"\u672a\u77e5\");","name":"$.book_name||$..series_title##\uff08\u522b\u540d\uff1a.*?\uff09","wordCount":"word_number"},"ruleToc":{"chapterList":"@js:\n\nvar v = JSON.parse((book.getVariable('custom') != \"\") ? book.getVariable('custom') : source.getVariable());\nvar type = v.module;\nvar sz = v.sz;\nvar tone = v.tone;\nif (type == 8) {\n  book.type = 64;\n} else if (type == 2 || sz != 0) {\n  book.type = 32;\n} else {\n  book.type = 8;\n}\n\n\nvar u_Index = 1;     \/\/ 0-2\n\nvar u_Types = ['API', 'WEB', 'TOU'];\nvar v_Index = [];\nvar v_Names = [];\nvar c_Array = [];\nvar book_id = java.hexDecodeToString(result);\n\nfunction b64Url(item_id) {\n    return `data:item_id;base64,${java.base64Encode(item_id)},{\"type\":\"fqnovel\"}`;\n}\n\nfunction push_a(a, b, c, d) {\n    c_Array.push({\n        \"ChapterName\": a || \"\",\n        \"isVolume\": b || false,\n        \"chapterUrl\": c ? b64Url(c) : \"\",\n        \"ChapterInfo\": d || \"\",\n    });\n}\n\nfunction push_b(list) {\n    for (let c of list) {\n        let c_name = c.volume_name || \"\u7b2c\u4e00\u5377\uff1a\u9ed8\u8ba4\";\n        let c_time = java.timeFormat(c.first_pass_time * 1000);\n        let c_word = c.chapter_word_number + \"\u5b57\";\n        let c_info = [c_name, c_time, c_word];\n        let v_name = v_Names[v_Names.length - 1];\n        if (v_name != c_name) {\n        \t   \/\/ java.log(c_name);\n            v_Index.push(c_Array.length);\n            v_Names.push(c_name);\n            push_a(c_name, true);\n        }\n        push_a(c.title, false, c.item_id, c_info.join(\" | \"));\n    }\n}\n\nfunction tocUrl(utype, params, run) {\n    let url = `https:\/\/novel.snssdk.com\/api\/novel\/book\/directory\/${utype}\/v1\/?${params}`;\n    if (run) return url;\n    return JSON.parse(java.ajax(url)).data;\n}\n\nfunction push_c(arr) {\n    let newArr = [];\n    for (let i = 0; i < arr.length;) {\n        let item_ids = arr.slice(i, (i += 100));\n        newArr.push(tocUrl(\"detail\", \"item_ids=\" + item_ids, true));\n    }\n    return java.ajaxAll(newArr).map(Get => {\n        let response = String(Get.body()).replace(\/\\\\\/g, \"\\\\\")\n            .replace(\/\\\\+([\\u4e00-\\u9fa5])\/g, \"$1\")\n            .replace(\/\\\\([^fnrt\"'])\/g, \"$1\");\n        return push_b(JSON.parse(response).data);\n    });\n}\n\n\n\n\/\/  app\u63a5\u53e3  ##\u5377\u540d&\u65f6\u95f4&\u5b57\u6570\nswitch (String(u_Types[u_Index])) {\n    case 'API':\n        let data = JSON.parse(java.ajax(xGorgon(\n            \"directory\/all_items\",\n            \"book_id=\" + book_id\n        )));\n        if (data.code == 0) {\n            push_b(data.data.item_data_list);\n            break;\n        }\n        \/\/ java.log(\"\u4e0b\u67b6\u4e66\u7c4d\uff0c\u4f7f\u7528web\u63a5\u53e3\u83b7\u53d6\u76ee\u5f55\");\n\n\n\n        \/\/  web\u63a5\u53e3  ##\u5377\u540d&\u65f6\u95f4\n    case 'WEB':\n        let Json, Host = \"https:\/\/fanqienovel.com\";\n        if (false) {\n            Json = java.ajax(Host + \"\/page\/\" + book_id)\n                .match(\/__INITIAL_STATE__=([^;]+)\/)[1];\n        } else {\n            Json = java.ajax(Host + \"\/api\/reader\/directory\/detail?bookId=\" + book_id);\n        }\n        let List = JSON.parse(Json).data.chapterListWithVolume;\n        for (let list of List) {\n            v_Index.push(c_Array.length);\n            list.map((_, i) => {\n                let c_name = _.volume_name || \"\u7b2c\u4e00\u5377\uff1a\u9ed8\u8ba4\";\n                let c_time = java.timeFormat(_.firstPassTime * 1000);\n                if (!i) push_a(c_name, true);\n                push_a(_.title, false, _.itemId, [c_name, c_time].join(\" | \"))\n            });\n        }\n        break;\n\n\n        \/\/  \u5934\u6761\u63a5\u53e3  ##\u65e0\u7ae0\u8282\u4fe1\u606f(\u9700\u8981\u8bf7\u6c42)\n    default:\n        let item_list = tocUrl(\"list\", \"device_platform=android&version_code=1207&novel_version=&app_name=gold_browser&version_name=2.0.7&channel=vivo_6589_64&device_type=wldw&os_api=28&os_version=9&book_id=\" + book_id).item_list;\n        if (false) {\n            item_list.map((t, i) => {\n                push_a(\"\u7b2c\" + (i + 1) + \"\u7ae0\", false, t);\n            });\n        } else push_c(item_list);\n        break;\n}\n\n\n\n\/\/ \u8fd4\u56de\u6570\u7ec4\nlet len = v_Index.length;\nif (len < 2) { \/\/ \u5206\u5377\u592a\u5c11\u4e0d\u663e\u793a\n    for (; len > 0; len--) {\n        c_Array.splice(v_Index[len - 1], 1);\n    }\n} else if (false) { \/\/ \u663e\u793a\u6548\u679c\u4e0d\u597d\u770b\n    for (let a, b, i = 0; i < len; i++) {\n        a = v_Index[i];\n        b = v_Index[i + 1];\n        if (b == undefined) b = len;\n        c_Array[a][\"ChapterInfo\"] = \"\u5171 \" + (b - a - 1) + \" \u7ae0\";\n    }\n}\nc_Array","chapterName":"ChapterName","chapterUrl":"chapterUrl","isVolume":"isVolume","updateTime":"ChapterInfo##\/##-"},"searchUrl":"@js:\n\nvar r = {\n\t\n\t\n\t\"search\": \"-1\",\n\t\"tone_id\": \"-1\",\n\t\"sz\": \"0\",\n\t\"server\": \"http:\/\/nove.98tx.cn\",\n\t\"tone\": \"\",\n\t\"st\": 0,\n\t\"type\": \"\u5c0f\u8bf4\u6a21\u5f0f\",\n\t\"module\": \"3\",\n\t\"faxian\": \"\u5c0f\u8bf4\"\n\t\n\t\n\t\n};\nif (source.getVariable()==\"\") {\n \n    source.setVariable(JSON.stringify(r, null, \"\\t\"));\n    java.toast('\\n\u5df2\u521d\u59cb\u5316\uff0c\u4f7f\u7528\u9ed8\u8ba4\u7ad9\u6e90');\n}\n\n\nmodule=JSON.parse(source.getVariable()).module;\n\ntab_type = + module;\n\nif (String(key).startsWith(\"m:\")) {\n  tab_type = 8\n  key = key.slice(2)\n}\n\nif (String(key).startsWith(\"t:\")||String(key).startsWith(\"t\uff1a\")) {\n  tab_type = 2\n  key = key.slice(2)\n}\n\nif (String(key).startsWith(\"d:\")||String(key).startsWith(\"d\uff1a\")) {\n  tab_type = 11\n  key = key.slice(2)\n}\n\nif (String(key).startsWith(\"e:\")) {\n  key = key.slice(2)\n  java.put(\"extra\", true)\n} else {\n  java.put(\"extra\", false)\n}\n\n\u7814\u5e0c =xGorgon(\n    \"search\/tab\",\n    [\n        \"tab_type=\" + tab_type,\n        \"query=\" + encodeURI(java.put(\"key\", key)),\n        \"passback=\" + ((java.put(\"page\", page) - 1) * 10),\n        \"update_version_code=58932\",\n        \"iid=1\"\n    ].join(\"&\"),\n    null,\n    \n);\n\n\nif (key.length === 19 && !Number.isNaN(key)) { \/\/ book_id\n  \u7814\u5e0c = `\/reading\/bookapi\/detail\/v\/?book_id=${key}`\n}\n\n\u7814\u5e0c","weight":0},{"enabledCookieJar":false,"enabledExplore":true,"bookUrlPattern":"https?:\\\/\\\/(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z0-9-]+(?::\\d+)?\\\/detail.*","lastUpdateTime":"1769747870768","bookSourceComment":"\u66f4\u65b0\u65e5\u5fd7\u8bf7\u70b9\u51fb\u767b\u5f55\uff0c\u66f4\u65b0\u4e66\u6e90\u4e2d\u67e5\u770b\n\u672c\u4e66\u6e90\u4e0d\u51fa\u610f\u5916\u7684\u8bdd\u57fa\u672c\u4e3a\u6700\u7ec8\u7248\u672c\uff0c\u540e\u7eed\u66f4\u65b0\u90fd\u4f1a\u5728\u4e91\u7aef\u66f4\u65b0\u8bbe\u7f6e\u4e2d\u5fc3\uff0c\u4e0d\u9700\u8981\u518d\u66f4\u65b0\u4e66\u6e90\uff0c\u5f53\u7136\uff0c\u4e0d\u6392\u9664\u57df\u540d\u5931\u6548\u7684\u60c5\u51b5\n\n\u517c\u5bb9\u6b63\u5f0f\u7248\u9605\u8bfbapp","customOrder":0,"bookSourceUrl":"\u6674\u5929\u878d\u5408VIP5.0","bookSourceGroup":"\u6674\u5929\u805a\u5408","ruleBookInfo":{"lastChapter":"{{$.source}} {{$.last_chapter_title}} {{$.last_chapter_update_time}}","tocUrl":"<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || \"\u5c0f\u8bf4\";\nlet url = result.toc_url || \"\";\nvar sdtoken;\ntry {\n    var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n    sdtoken = String(loginInfoMap['\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)'] || '');\n} catch (e) {\n    sdtoken = '';\n}\nvar rawCookie = getFanqieCookie() || sdtoken;\nvar match = rawCookie.match(\/sessionid=[^;]+\/);\nvar fqcookie = match ? match[0] : '';\nvar fqssionid = '';\nif (fqcookie) {\n    fqssionid = getSessionId(fqcookie);\n};\nsetArguments('fqssionid', fqssionid);\njava.put(\"tab\", tab);\njava.put(\"book_id\", book_id);\nlet qtcatalog = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url,\n};\nqtcatalog = java.base64Encode(JSON.stringify(qtcatalog));\n`data:;base64,${qtcatalog},{\"type\":\"qingtian2\"}`;\n<\/js>","intro":"<js>\nlet {\n    book_id,\n    source: sources,\n    tab,\n    book_tts,\n    tags,\n    role,\n    last_chapter_title,\n    last_chapter_update_time,\n    word_number,\n    status,\n    score,\n    abstract,\n    copyright_info\n} = result;\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (proxy == \"\u672c\u5730\") {\n    proxy = \"\u672c\u5730\u7f51\u7edc\";\n} else {\n    proxy = \"\u670d\u52a1\u5668\u7f51\u7edc\";\n}\njava.put(\"book_detail\", JSON.stringify(result));\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet key = \"\";\ntry {\n    let cookieValue =\n        String(cookie.getCookie(base_url)) || String(java.getCookie(base_url));\n    key = getKey(cookieValue);\n} catch (e) {\n    key = \"\";\n}\n\nif (key == \"\") {\n    java.log(\"\u5f53\u524d\u670d\u52a1\u5668\u672a\u67e5\u8be2\u5230\u767b\u5f55\u72b6\u6001\uff0c\u5c1d\u8bd5\u67e5\u8be2\u5176\u4ed6\u670d\u52a1\u5668\u767b\u5f55\u72b6\u6001...\");\n    let cookieValue;\n    for (let h of host) {\n        try {\n            cookieValue = String(cookie.getCookie(h)) || String(java.getCookie(h));\n            key = getKey(cookieValue);\n        } catch (e) {\n            key = \"\";\n        }\n        if (key) {\n            java.log(`\u5df2\u5728${h}\u767b\u5f55\uff0c\u9000\u51fa\u67e5\u8be2\uff0c\u6b63\u5728\u8f6c\u79fb\u767b\u5f55\u72b6\u6001\u5230\u5f53\u524d\u670d\u52a1${base_url}`);\n            \/\/java.log(cookieValue)\n            removeCookie(h);\n            removeCookie(base_url);\n            cookie.setCookie(base_url, cookieValue);\n            break;\n        }\n    }\n}\n\nif (book.readConfig == null || book.readConfig.useReplaceRule == null) {\n    book.setUseReplaceRule(false);\n}\n\nlet nickname = '\u8d26\u53f7\u72b6\u6001\uff1a\u26a0\ufe0f \u672a\u767b\u5f55 | \u70b9\u51fb\u53f3\u4e0a\u89d2 \ud83d\udd16 \u767b\u5f55';\ntry {\n    let opcx = {\n        method: \"GET\",\n        headers: {\n            cookie: 'qttoken=' + key + ';'\n        },\n    };\n    opcx = JSON.stringify(opcx);\n    let user_info = JSON.parse(java.ajax(base_url + '\/get_avatar,' + opcx));\n    if (user_info.code == 0) {\n        if (user_info.nickname) {\n            nickname = '\u6b22\u8fce\u56de\u6765\uff1a' + user_info.nickname\n        } else {\n            nickname = '\u6b22\u8fce\u56de\u6765\uff1a' + user_info.email + \"(\u8bf7\u524d\u5f80\u7528\u6237\u540e\u53f0\u8bbe\u7f6e\u7528\u6237\u540d)\"\n        }\n    }\n} catch (e) {\n    if (key) {\n        nickname = '\u8d26\u53f7\u72b6\u6001\uff1a\u5df2\u767b\u5f55'\n    }\n};\n\nlet loginStatus = nickname;\n\nlet lightDivider = \"\u2747\ufe0f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2747\ufe0f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2747\ufe0f\";\nlet heavyDivider = \"&lrm;\\n&lrm;\";\n\nlet isValid = (value) => String(value).length > 1;\nlet ctitle = book.durChapterTitle || '\u672a\u5f00\u59cb';\nlet info = `\n    \ud83d\udce1 \u5f53\u524d\u670d\u52a1\uff1a${base_url}\n    \ud83d\udd11 ${loginStatus}\n    \ud83c\udff7 \u6570\u636e\u6765\u6e90\uff1a${sources}\n    \ud83d\udd04 \u5f53\u524d\u6a21\u5f0f\uff1a${tab}\n    \u2699\ufe0f \u8bbf\u95ee\u6a21\u5f0f\uff1a${proxy}\n    \ud83d\udcd6 \u9605\u8bfb\u81f3\uff1a${ctitle}\n`;\n\nif (tab == \"\u542c\u4e66\") {\n    \/\/let toneId = getArguments(source.getVariable(), \"tone_id\");\n    let toneId = String(book.getVariable('custom'));\n    if (toneId == '') {\n    \ttoneId= '4';\n    \t}\n    if (isValid(book_tts)) {\n        info += `${lightDivider}\n    \ud83c\udfb5 \u97f3\u8272\u914d\u7f6e\uff1a${toneId}\n    \u2728 AI\u97f3\u8272\u8bf7\u70b9\u51fb\u53f3\u4e0a\u89d2\u4e66\u7c4d\u53d8\u91cf\u586b\u5199\u76f8\u5173\u503c\uff0c\u771f\u4eba\u542c\u4e66\u8bf7\u91cd\u65b0\u641c\u7d22\u9009\u62e9\u5e26\u6709\u4e3b\u64ad\u7684\u4e66\u7c4d\n    ${book_tts}\n`;\n    }\n}\n\nlet basicInfo = \"\";\nlet addBasicInfo = (value, prefix, icon) => {\n    if (isValid(value)) basicInfo += `    ${icon} ${prefix} ${value}\\n`;\n};\n\naddBasicInfo(tags, \"\u4e66\u7c4d\u5206\u7c7b\uff1a\", \"\ud83c\udf08\");\naddBasicInfo(role, \"\u4e66\u7c4d\u4e3b\u89d2\uff1a\", \"\ud83d\udc51\");\naddBasicInfo(last_chapter_title, \"\u6700\u65b0\u7ae0\u8282\uff1a\", \"\ud83d\udcda\");\naddBasicInfo(last_chapter_update_time, \"\u66f4\u65b0\u65f6\u95f4\uff1a\", \"\u23f3\");\naddBasicInfo(word_number, \"\u4e66\u7c4d\u5b57\u6570\uff1a\", \"\ud83d\udcca\");\naddBasicInfo(status, \"\u4e66\u7c4d\u72b6\u6001\uff1a\", \"\ud83d\udea9\");\naddBasicInfo(score, \"\u4e66\u7c4d\u8bc4\u5206\uff1a\", \"\u2b50\");\n\nif (basicInfo) info += `${lightDivider}\\n${basicInfo}`;\n\nif (isValid(abstract)) {\n    let indentedAbstract = abstract\n        .split(\"\\n\")\n        .map((line) => `    ${line}`)\n        .join(\"\\n\");\n    info += `${heavyDivider}\n    \ud83d\udcd6 \u4e66\u7c4d\u7b80\u4ecb\uff1a\n${indentedAbstract}\n`;\n} else {\n    info += `${heavyDivider}`;\n}\n\nif (isValid(copyright_info)) {\n    info += `${lightDivider}\n    \u00a9 ${copyright_info}\n`;\n} else {\n    info += `${lightDivider}`;\n}\n\ninfo += `\n${heavyDivider}\n    \ud83d\udca0\ud83d\udca0\ud83d\udca0 \u6570\u636e\u66f4\u65b0\u4e8e ${new Date().toLocaleString()} \ud83d\udca0\ud83d\udca0\ud83d\udca0\n`;\nlet jjinfo = getArguments(source.getVariable(), \"info\");\n\nif (jjinfo != \"off\") {\n    info = String(info)\n        .split(\"\\n\")\n        .map((line) => line.replace(\/^ {4}\/, \"\"))\n        .join(\"\\n\");\n} else {\n    basicInfo = \"\";\n    addBasicInfo(last_chapter_title, \"\u6700\u65b0\u7ae0\u8282\uff1a\", \"\ud83d\udcda\");\n    addBasicInfo(last_chapter_update_time, \"\u66f4\u65b0\u65f6\u95f4\uff1a\", \"\u23f3\");\n    addBasicInfo(word_number, \"\u4e66\u7c4d\u5b57\u6570\uff1a\", \"\ud83d\udcca\");\n    addBasicInfo(status, \"\u4e66\u7c4d\u72b6\u6001\uff1a\", \"\ud83d\udea9\");\n    addBasicInfo(score, \"\u4e66\u7c4d\u8bc4\u5206\uff1a\", \"\u2b50\");\n    if (isValid(abstract)) {\n        let indentedAbstract = abstract\n            .split(\"\\n\")\n            .map((line) => `    ${line}`)\n            .join(\"\\n\");\n        basicInfo += `\n    \\n&lrm;\n    \ud83d\udcd6 \u4e66\u7c4d\u7b80\u4ecb\uff1a\n${indentedAbstract}\n`;\n    } else {\n        basicInfo += `${heavyDivider}`;\n    }\n    info = `&lrm;\\n\ud83c\udff7 \u6570\u636e\u6765\u6e90\uff1a${sources}\\n` + basicInfo;\n}\n<\/js>","wordCount":"$.word_number","canReName":"1","author":"$.author","init":"<js>\nif (String(baseUrl).startsWith(\"data:\")) {\n    let res = JSON.parse(java.hexDecodeToString(result));\n    let book_id = res.book_id;\n    let tab = res.tab;\n    let sources = res.sources;\n    let url = res.url;\n    let html = \"\";\n    let proxy = getArguments(source.getVariable(), \"proxy\");\n    if (url != \"\" && proxy == \"\u672c\u5730\") {\n        if (sources == '69\u4e66\u5427') {\n            let ck69 = String(cookie.getCookie('https:\/\/www.69shuba.com'));\n            let headers = {\n        \t \"Referer\": url,\n            \"Cookie\": ck69,\n            \"User-Agent\":  java.getWebViewUA()\n             };            \n             let op = JSON.stringify({\n                \"headers\": headers\n            });\n            html = java.ajax(`${url},${op}`);\n        } else {\n            html = java.ajax(url);\n        }\n        \/\/java.log(html);\n        if (html.includes(\"Just a moment...\") && sources == '69\u4e66\u5427') {\n            cookie.removeCookie('https:\/\/www.69shuba.com');\n            java.longToast('\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1');\n            html = java.startBrowserAwait(url, \"\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1\").body();\n\n             java.log(html);\n        }\n    }\n    let base_url = getArguments(source.getVariable(), \"server\");\n    let op = {\n        method: \"POST\",\n        body: {\n            html: html\n        }\n    };\n    op = JSON.stringify(op);\n    let varia = String(book.getVariable('custom'));\n    if (varia == 'null') {\n        varia = '';\n    }\n    varia = JSON.stringify({\n        'custom': varia\n    });\n    \/\/varia = java.base64Encode(varia);\n    java.log(`${base_url}\/detail?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\n    result = java.ajax(`${base_url}\/detail?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\n}\nresult\n<\/js>$.data","coverUrl":"$.thumb_url","name":"$.book_name"},"bookSourceName":"\ud83c\udf45\u756a\u8304\u3001\u4e03\u732b\u3001\u4e66\u65d7\u3001\u5854\u8bfb","jsLib":"var host = [\n    'https:\/\/v1.gyks.cf',\n    'https:\/\/v2.gyks.cf',\n    'https:\/\/v3.gyks.cf',\n    'https:\/\/v4.gyks.cf',\n    'https:\/\/v5.gyks.cf',\n    'https:\/\/v6.gyks.cf',\n    'https:\/\/v7.gyks.cf',\n    'http:\/\/101.35.133.34:8888',\n    'http:\/\/103.236.91.147:8888'\n];\n\nfunction getArguments(open_argument, key) {\n    try {\n        open_argument = JSON.parse(open_argument);\n    } catch (e) {\n        open_argument = {\n            tab: \"\u5c0f\u8bf4\",\n            tone_id: \"\u9ed8\u8ba4\u97f3\u8272\",\n            server: host[0],\n            sources: \"\u5168\u90e8\",\n            source_type: \"\u7537\u9891\",\n        };\n    }\n    if (key) {\n        return open_argument[key];\n    } else {\n        return open_argument;\n    }\n}\n\nfunction setArguments(key, value) {\n    const {\n        source\n    } = this;\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    open_argument[key] = value;\n    open_argument = JSON.stringify(open_argument);\n    source.setVariable(open_argument);\n    return open_argument;\n}\n\nfunction decrypt(Text) {\n    return Text;\n}\n\nfunction paraForAndroid(content, sources,ydv) {\n    let {\n        java,\n        cache,\n        source\n    } = this;\n    let plcolor = getArguments(source.getVariable(), \"plcolor\");\n    if (!plcolor) {\n        plcolor = \"#000000\";\n    }\n    let tccolor = getArguments(source.getVariable(), \"tccolor\");\n    if (!tccolor) {\n        tccolor = \"#ffffff\";\n    }\n\n    const createSvg = this.createSvg.bind(this);\n\n    return content.replace(\/<p>(.*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\\/>)?<\\\/p>\/g,\n        (match, text, url, count) => {\n            if (url && count) {\n                const click = 0;\n                cache.putMemory(url, click);\n                const encodedUrl = url;\n                return `<p>${text}<img src=\"${createSvg(count, plcolor,tccolor,encodedUrl,sources,ydv)}\"><\/p>`;\n            } else {\n                return `<p>${text}<\/p>`;\n            }\n        }\n    );\n}\n\n\nfunction showCmt(url, sources,ydv) {\n    let {\n        java,\n        cache\n    } = this;\n    const currentTime = Date.now();\n    const click = cache.getFromMemory(url);\n    let isqread = false;\n    try {\n        java.qread();\n        isqread = true;\n    } catch (e) {}\n    if (click < 1 && !isqread && !ydv) {\n        cache.putMemory(url, click + 1);\n        return;\n    } else {\n        if (isqread) {\n            java.startBrowserDp(url, sources + '\u6bb5\u8bc4');\n        } else if (ydv) {\n                java.showBrowser(url, java.ajax(url));\n            } else {\n               java.startBrowser(url, sources + '\u6bb5\u8bc4');\n        }\n    }\n}\n\n\n\nfunction createSvg(number, color, tccolor, encodedUrl, sources,ydv) {\n        var displayText = number > 99 ? \"99+\" : number.toString();\n        var loginInfoMap = {};\n\n        if (this.source && typeof this.source.getLoginInfoMap == 'function') {\n            loginInfoMap = this.source.getLoginInfoMap() || {};\n        }\n\n        var bubbleStyle = String(getArguments(this.source.getVariable(), \"pstyle\") || loginInfoMap['\u6bb5\u8bc4\u6c14\u6ce1\u6837\u5f0f(0-4)'] || '0');\n        var svg;\n        if (bubbleStyle == '0') {\n            svg = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100\" height=\"90\" viewBox=\"0 0 25 17\" fill=\"none\" style=\"color: ${color}; opacity: 1;\">\n                        <path d=\"M24 14.5v-12a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v7.528a2 2 0 0 1-.211.894l-2.065 4.13a1 1 0 0 0 .894 1.448H22a2 2 0 0 0 2-2z\" stroke=\"currentColor\" style=\"stroke: ${color}; stroke-opacity: 0.5; stroke-width: 1px; stroke-linejoin: round; fill: ${tccolor}; fill-opacity: 0.5;\"><\/path>\n                        <text x=\"13.5\" y=\"12\" text-anchor=\"middle\" alignment-baseline=\"auto\" font-size=\"10\" fill=\"currentColor\" font-family=\"Arial, sans-serif\" font-weight=\"500\" style=\"fill: ${color}; opacity: 1;\">${displayText}<\/text>\n                    <\/svg>`;\n        } else if (bubbleStyle == '1') {\n            svg = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100\" height=\"90\" viewBox=\"0 7 153 106\" style=\"color: ${color}; opacity: 1;\">\n                        <path d=\"M 55 10 L 120 10 Q 150 10 150 40 L 150 80 Q 150 110 120 110 L 55 110 Q 25 110 25 80 L 25 75 L 3 60 L 25 45 L 25 40 Q 25 10 55 10 Z\" stroke=\"currentColor\" stroke-width=\"6\" stroke-linejoin=\"round\" style=\"stroke: ${color}; stroke-opacity: 0.5; stroke-width: 4px; stroke-linejoin: round; fill: ${tccolor}; fill-opacity: 0.5;\"><\/path>\n                        <text x=\"87\" y=\"86\" alignment-baseline=\"auto\" font-family=\"Arial, sans-serif\" text-anchor=\"middle\" font-size=\"72\" font-weight=\"500\" fill=\"currentColor\" style=\"fill: ${color}; opacity: 1;\">${displayText}<\/text>\n                <\/svg>`;\n        } else if (bubbleStyle == '2') {\n            svg = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100\" height=\"90\" viewBox=\"6 10 88 76\" style=\"color: ${color}; opacity: 1;\">\n                        <path d=\"M12,12 L88,12 Q92,12 92,16 L92,68 Q92,72 88,72 L28,72 L12,84 L12,72 Q8,72 8,68 L8,16 Q8,12 12,12 Z\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linejoin=\"round\" style=\"stroke: ${color}; stroke-opacity: 0.5; stroke-width: 2.5px; stroke-linejoin: round; fill: ${tccolor}; fill-opacity: 0.5;\"><\/path>\n                        <text x=\"50\" y=\"60\" font-family=\"Arial, sans-serif\" text-anchor=\"middle\" font-size=\"45\" fill=\"currentColor\" font-weight=\"500\" alignment-baseline=\"auto\" style=\"fill: ${color}; opacity: 1;\">${displayText}<\/text>\n                    <\/svg>`;\n        } else if (bubbleStyle == '3') {\n            svg = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100\" height=\"90\" viewBox=\"0 0 25 17\" fill=\"none\" style=\"color: ${color}; opacity: 1;\">\n                        <rect x=\"0.5\" y=\"0.5\" width=\"24\" height=\"16\" rx=\"2.5\" ry=\"2.5\" stroke=\"currentColor\" style=\"stroke: ${color}; stroke-opacity: 0.5; stroke-width: 1px; stroke-linejoin: round; fill: ${tccolor}; fill-opacity: 0.5;\"><\/rect>\n                        <text x=\"12.5\" y=\"12\" text-anchor=\"middle\" alignment-baseline=\"auto\" font-size=\"10\" fill=\"currentColor\" font-family=\"Arial, sans-serif\" font-weight=\"500\" style=\"fill: ${color}; opacity: 1;\">${displayText}<\/text>\n                    <\/svg>`;\n        } else if (bubbleStyle == '4') {\n            svg = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100\" height=\"90\" viewBox=\"0 0 25 17\" fill=\"none\" style=\"color: ${color}; opacity: 1;\">\n                            <path stroke=\"currentColor\" stroke-width=\"1.00\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"4.00\" style=\"stroke: ${color}; stroke-opacity: 0.5; stroke-width: 1px; stroke-linejoin: round; fill: ${tccolor}; fill-opacity: 0.5;\" d=\"M 7.5 0.5 L 16.5 0.5 A 7 7 0 0 1 23.5 7.5 L 23.5 7.5 A 7 7 0 0 1 16.5 14.5 L 8.5 14.5 L 5.192 16.5 L 5.5 14.5 A 7 7 30 0 1 0.5 7.5 L 0.5 7.5 A 7 7 0 0 1 7.5 0.5 Z\"\/>\n                            <text fill=\"${color}\" font-family=\"Arial, sans-serif\" font-size=\"10\" font-weight=\"500\" text-anchor=\"middle\" dy=\"0.35em\" x=\"12.00\" y=\"7.50\">${displayText}<\/text>\n                            <\/svg>`;\n        } else if (bubbleStyle == '5') {\n            displayText = number > 99 ? \"99\" : number.toString();\n            svg = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100\" height=\"90\" viewBox=\"0 0 25 17\" fill=\"none\" style=\"color: ${color}; opacity: 1;\">\n                        <circle cx=\"12.5\" cy=\"8.5\" r=\"8\" stroke=\"currentColor\" style=\"stroke: ${color}; stroke-opacity: 0.5; stroke-width: 1px; stroke-linejoin: round; fill: ${tccolor}; fill-opacity: 0.5;\"><\/circle>\n                        <text x=\"13\" y=\"12\" text-anchor=\"middle\" alignment-baseline=\"auto\" font-size=\"10\" fill=\"currentColor\" font-family=\"Arial, sans-serif\" font-weight=\"500\" style=\"fill: ${color}; opacity: 1;\">${displayText}<\/text>\n                    <\/svg>`;\n        } else {\n            svg = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100\" height=\"90\" viewBox=\"0 0 25 17\" fill=\"none\" style=\"color: ${color}; opacity: 1;\">\n                <path d=\"M24 14.5v-12a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v7.528a2 2 0 0 1-.211.894l-2.065 4.13a1 1 0 0 0 .894 1.448H22a2 2 0 0 0 2-2z\" stroke=\"currentColor\" style=\"stroke: ${color}; stroke-opacity: 0.5; stroke-width: 1px; stroke-linejoin: round; fill: ${tccolor}; fill-opacity: 0.5;\"><\/path>\n                <text x=\"13.5\" y=\"12\" text-anchor=\"middle\" alignment-baseline=\"auto\" font-size=\"10\" fill=\"currentColor\" font-family=\"Arial, sans-serif\" font-weight=\"500\" style=\"fill: ${color}; opacity: 1;\">${displayText}<\/text>\n            <\/svg>`;\n        }\n        var jc =  'js';\n        if (ydv) { jc = 'click' }\n        var encodedSvg = this.java.base64Encode(svg);\n        \n        return 'data:image\/svg+xml;base64,' + encodedSvg + ',{\"'+ jc + '\":\"showCmt(\\'' + encodedUrl + '\\', \\'' + sources+ '\\', '+ ydv + ')\",\"style\":\"text\"}';\n        }\n\n\nfunction cleanHTML(html) {\n    let result = html\n        .replace(\/<header[^>]*>[\\s\\S]*?<\\\/header>\/gi, \"\")\n        .replace(\/<div class=\"tt-title\"[^>]*>[\\s\\S]*?<\\\/div>\/gi, \"\")\n        .replace(\/<(?!\\\/?p\\b|\\\/?img\\b)[^>]+>\/gi, \"\");\n    result = result.replace(\/<\\\/?p[^>]*>\/g, \"\\n\");\n    return result.replace(\/\\n+\/g, \"\\n\").trim();\n}\n\n\nfunction getBaseUrl(url) {\n    if (!url) {\n        return null;\n    }\n    url = String(url);\n    if (url.match(\/https?:\\\/\\\/\/i)) {\n        var index = url.indexOf(\"\/\", 9);\n        return index == -1 ? url : url.substring(0, index);\n    }\n    return null;\n}\n\nfunction isIPv4Address(ip) {\n    ip = String(ip);\n    let parts = ip.split(\".\");\n    if (parts.length !== 4) return false;\n\n    for (let part of parts) {\n        if (!\/^\\d+$\/.test(part)) return false; \/\/ \u5fc5\u987b\u662f\u6570\u5b57\n        if (part.length > 1 && part[0] === \"0\") return false; \/\/ \u7981\u6b62\u524d\u5bfc\u96f6\n        let num = parseInt(part, 10);\n        if (num < 0 || num > 255) return false; \/\/ \u8303\u56f4\u68c0\u67e5\n    }\n    return true;\n}\n\nfunction isIPv6Address(ip) {\n    ip = String(ip);\n    \/\/ \u5904\u7406\u53cc\u5192\u53f7\uff08\u6700\u591a\u51fa\u73b0\u4e00\u6b21\uff09\n    if (ip.includes(\":::\")) return false;\n    let doubleColonCount = (ip.match(\/::\/g) || []).length;\n    if (doubleColonCount > 1) return false;\n\n    \/\/ \u5206\u5272\u6210\u7ec4\n    let groups = ip.split(\":\");\n    let validGroupCount = 8;\n    let actualGroupCount = groups.filter((g) => g !== \"\").length;\n\n    \/\/ \u9a8c\u8bc1\u7ec4\u6570\n    if (doubleColonCount === 1) {\n        if (actualGroupCount > validGroupCount - 1) return false;\n    } else {\n        if (groups.length !== validGroupCount) return false;\n    }\n\n    \/\/ \u9a8c\u8bc1\u6bcf\u7ec4\u5185\u5bb9\n    for (let group of groups) {\n        if (group === \"\") continue; \/\/ \u8df3\u8fc7\u7a7a\u7ec4\uff08\u53cc\u5192\u53f7\u90e8\u5206\uff09\n        if (!\/^[0-9a-fA-F]{1,4}$\/.test(group)) return false; \/\/ 1-4\u4f4d\u5341\u516d\u8fdb\u5236\n    }\n    return true;\n}\n\nfunction isIPAddress(input) {\n    return isIPv4Address(input) || isIPv6Address(input);\n}\n\nfunction getSessionId(cookieString) {\n    const match = cookieString.match(\/sessionid=([^;]+)\/);\n    return match ? match[1] : null;\n}\n\nfunction getKey(key) {\n    let parts = key.split(\";\");\n    for (let part of parts) {\n        if (part.includes(\"qttoken\")) {\n            return part.split(\"=\")[1];\n        }\n    }\n    return \"\";\n}\n\nfunction getFanqieCookie() {\n    const {\n        cookie\n    } = this;\n    try {\n        return String(cookie.getCookie('fanqienovel.com') || java.getCookie('fanqienovel.com') || '');\n    } catch (e) {\n        return '';\n    }\n}\n\n\nfunction paraForiOS(html, sources) {\n    return html.replace(\n        \/<p>(.*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\\/>)?<\\\/p>\/g,\n        function(match, text, url, count) {\n            if (url && count) {\n                const encodedUrl = url.replace(\/&\/g, '&amp;');\n                return `<span rs-native>${text}<comment count=\"${count}\" onPress=\"java.showReadingBrowser('${encodedUrl}','${sources}\u6bb5\u8bc4')\"><\/span>`;\n            } else {\n                return `<span rs-native>${text}<\/span>`;\n            }\n        }\n    );\n}\n\nfunction removeAllImgTags(htmlString) {\n  const imgTagRegex = \/<img\\b[^>]*>|<\\\/img>|<img\\b[^>]*\\\/>\/gi;\n  return htmlString.replace(imgTagRegex, '');\n}","header":"{ \"User-Agent\":\"Mozilla\/5.0 (Linux; Android 6.0; Nexus 5 Build\/MRA58N) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Mobile Safari\/537.36 Edg\/138.0.0.0\" }","enabled":true,"bookSourceType":0,"weight":0,"exploreUrl":"<js>\nfunction setArgument(key, value) {\n    var open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '') || {};\n    open_argument[key] = value;\n    var result = JSON.stringify(open_argument);\n    source.setVariable(result);\n    return result;\n}\n\nvar open_argument = source.getVariable();\nvar base_url = getArguments(open_argument, 'server') || '';\nvar ms = getArguments(open_argument, 'tone_id') || '';\nvar source_type = getArguments(open_argument, 'source_type') || '\u7537\u9891';\nvar tab = getArguments(open_argument, 'tab') || '\u5c0f\u8bf4';\nvar sources = getArguments(open_argument, 'sources') || '\u756a\u8304';\n\n\nvar sdtoken;\ntry {\n    var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n    sdtoken = String(loginInfoMap['\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)'] || '');\n} catch (e) {\n    sdtoken = '';\n}\n\nvar rawCookie = getFanqieCookie() || sdtoken;\nvar match = rawCookie.match(\/sessionid=[^;]+\/);\nvar fqcookie = match ? match[0] : '';\nvar fqssionid = '';\nif (!fqcookie) {\n    java.toast('\u60a8\u8fd8\u672a\u767b\u9646\u756a\u8304\u8d26\u53f7\uff0c\u65e0\u6cd5\u540c\u6b65\u6570\u636e\u54e6\uff01');\n} else {\n    fqssionid = getSessionId(fqcookie)\n}\nvar fqsjurl = base_url + \"\/bookshelf?page={{page}}&ssionid=\" + fqssionid;\nvar fqtjurl = base_url + \"\/fqrecommend?page={{page}}&ssionid=\" + fqssionid;\nvar fqlsurl = base_url + \"\/fqhistory?page={{page}}&ssionid=\" + fqssionid;\n\nvar groupDatas = [];\nvar infoData = [];\n\nfunction deviceType() {\n    try {\n        return !!java.androidId();\n    } catch (e) {\n        return false;\n    }\n}\n\nvar hasValidCookie = fqcookie.length > 0;\n\nif (hasValidCookie) {\n    function groupQuery() {\n        try {\n            var url = base_url + \"\/group_name?ssionid=\" + fqssionid;\n            var res = java.ajax(url);\n            var response = JSON.parse(res);\n\n            if (!(response && response.data)) {}\n\n            response.data.forEach(function(group) {\n                var keys = Object.keys(group);\n                if (keys.length > 0) {\n                    var key = keys[0];\n                    var value = group[key];\n                    if (value && value.length) {\n                        var option = {\n                            \"method\": \"POST\",\n                            \"body\": {\n                                \"book_ids\": value,\n                                \"page\": \"{{page}}\"\n                            }\n                        };\n                        groupDatas.push({\n                            title: key,\n                            url: base_url + \"\/bookshelf,\" + JSON.stringify(option),\n                            style: {\n                                layout_flexGrow: 1,\n                                layout_flexBasisPercent: 0.45\n                            }\n                        });\n                    }\n                }\n            });\n\n            if (groupDatas.length % 2 !== 0) {\n                groupDatas.push({\n                    title: \"--\",\n                    url: \"\",\n                    style: {\n                        layout_flexGrow: 1,\n                        layout_flexBasisPercent: 0.45\n                    }\n                });\n            }\n        } catch (e) {\n            java.longToast(\"\u756a\u8304\u767b\u5f55\u8fc7\u671f\uff0c\u5df2\u9690\u85cf\u756a\u8304\u4e66\u67b6\");\n        }\n    }\n\n    try {\n        java.longToast(\"\u6b63\u5728\u52a0\u8f7d\u5206\u7ec4\u6570\u636e...\");\n        var userUrl = base_url + \"\/fquser?ssionid=\" + fqssionid;\n        var userRes = java.ajax(userUrl);\n        var userData = JSON.parse(userRes);\n\n        var userName = (userData && userData.data && userData.data.name) ? userData.data.name : '\u672a\u77e5\u7528\u6237';\n        if (!userName.includes('\u672a\u77e5\u7528\u6237')) {\n            infoData = [{\n                title: \"\u756a\u8304\u4e2a\u4eba\u4e2d\u5fc3\",\n                url: fqsjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }, {\n                title: \"\u4e2a\u6027\u63a8\u8350(\u756a\u8304)\",\n                url: fqtjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }, {\n                title: \"\u5386\u53f2\u9605\u8bfb(\u756a\u8304)\",\n                url: fqlsurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }];\n        }\n        groupQuery();\n    } catch (e) {\n        java.longToast(\"\u756a\u8304\u767b\u5f55\u8fc7\u671f\uff0c\u5df2\u9690\u85cf\u756a\u8304\u4e66\u67b6\");\n    }\n}\n\nvar style_list = [];\ntry {\n    var durl = `${base_url}\/discovestyle?source=${sources}&source_type=${source_type}&tab=${tab}`;\n    var res = java.ajax(durl);\n    var result = JSON.parse(res);\n    style_list = result.data || [];\n    if (result.msg) {\n        java.toast(result.msg);\n    }\n} catch (e) {\n    java.toast(\"\u53d1\u73b0\u6837\u5f0f\u83b7\u53d6\u5931\u8d25\");\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet qtop = {\n    method: \"GET\",\n    headers: {\n        cookie: qtcookie\n    },\n};\nqtop = JSON.stringify(qtop);\nlet qtsjurl = base_url+'\/get_book_shelf,'+qtop\nlet qtsj = [{\n                title: \"\u6674\u5929\u4e2a\u4eba\u4e2d\u5fc3\",\n                url: qtsjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }]\nvar finalData = infoData.concat(groupDatas, style_list);\nfinalData = qtsj.concat(finalData);\nJSON.stringify(finalData);\n<\/js>","respondTime":180000,"ruleExplore":{"lastChapter":"{{$.last_chapter_title}} \u2022 {{$.last_update_time}}","kind":"{{$.category}}\n{{$.score}}\n{{$.status}}\n{{$.source}}\n{{$.tags}}","author":"$.author","wordCount":"$.word_number","bookUrl":"<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || '\u5c0f\u8bf4';\nlet url = result.toc_url || '';\n\nlet qtdetail = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url\n}\nqtdetail = java.base64Encode(JSON.stringify(qtdetail));\n`data:;base64,${qtdetail},{\"type\":\"qingtian\"}`\n<\/js>","intro":"$.abstract","name":"$.book_name","bookList":"$.data","coverUrl":"$.thumb_url"},"ruleSearch":{"lastChapter":"{{$.source}} {{$.last_chapter_title}}","wordCount":"$.word_number","intro":"$.abstract","kind":"{{$.status}},{{$.score}},{{$.tags}},{{$.last_chapter_update_time}}","bookUrl":"<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || '\u5c0f\u8bf4';\nlet url = result.toc_url || '';\n\nlet qtdetail = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url\n}\nqtdetail = java.base64Encode(JSON.stringify(qtdetail));\n`data:;base64,${qtdetail},{\"type\":\"qingtian\"}`\n<\/js>","author":"$.author","bookList":"$.data","coverUrl":"$.thumb_url","checkKeyWord":"\u6211\u768426\u5c81\u5973\u623f\u5ba2@\u756a\u8304","name":"$.book_name##\uff08\u522b\u540d\uff1a.*?\uff09"},"ruleContent":{"content":"<js>\njava.log(result)\nresult = String(java.hexDecodeToString(result));\nlet res;\nif (result.match(\/\u6674\u5929\u878d\u5408\/)) {\n    result = result.split(\"\u6674\u5929\u878d\u54084\");\n    res = {\n        item_id: result[0],\n        tab: result[1],\n        title: result[2],\n        sources: result[3],\n        url: \"\"\n    };\n} else {\n    res = JSON.parse(result);\n}\n\nfunction checkEnv() {\n    let isModified = false;\n    try {\n        new Packages.io.legato.kazusa.utils.TimeoutCancellationException('');\n        isModified = true;\n    } catch (e) {\n        isModified = typeof source.loginUi == 'function' ? false : true;\n    }\n    \n    return isModified;\n}\n\nvar islyc = checkEnv();\ntry {\nif (islyc) {\n\tbook.imageStyle = 'FULL';\n\t} else {\n\t\tbook.imageStyle = 'TEXT';\n\t\t}\n} catch {}\nlet varia1 = String(book.getVariable('custom'));\nif (varia1 == 'null') {\n    varia1 = '';\n}\nlet varia = JSON.stringify({\n    'custom': varia1\n});\n\/\/  varia = java.base64Encode(varia);\nlet book_id = res.book_id;\nlet item_id = res.item_id;\nlet tab = res.tab;\nlet title = res.title;\nlet sources = res.sources;\nlet url = res.url;\nlet html = \"\";\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (url != \"\" && proxy == \"\u672c\u5730\") {\n    if (sources == '69\u4e66\u5427') {\n        let ck69 = String(cookie.getCookie('https:\/\/www.69shuba.com'));\n        let headers = {\n            \"Referer\": url,\n            \"Cookie\": ck69,\n            \"User-Agent\": java.getWebViewUA()\n        };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        java.log(url);\n        java.log(op);\n        html = java.ajax(`${url},${op}`);\n    } else {\n        html = java.ajax(url);\n    }\n    java.log('dddddddddddddddddddddddddddd')\n    java.log(html);\n    if (html.includes(\"Just a moment...\") && sources == '69\u4e66\u5427' && book.durChapterIndex === chapter.index) {\n        cookie.removeCookie('https:\/\/www.69shuba.com');\n        java.longToast('\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1');\n        html = java.startBrowserAwait(url, \"\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1\").body();\n        java.log('cscscscs')\n        java.log(html);\n    }\n};\nlet content = \"\";\nlet data;\n\/\/let tone_id = getArguments(source.getVariable(), \"tone_id\");\nlet tone_id = varia1;\nif (tone_id == '') {\n    tone_id = '4';\n}\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet fqpara = getArguments(source.getVariable(), \"fqpara\");\nlet close_img = getArguments(source.getVariable(), \"close_img\");\nlet device, device_type;\ntry {\n    device = java.deviceID();\n    device_type = \"\u82f9\u679c\";\n} catch (e) {\n    try {\n        device = java.androidId();\n        device_type = \"\u5b89\u5353\";\n    } catch (e) {\n        device = \"\";\n        device_type = \"\u5b89\u5353\";\n    }\n}\n\nlet qtcookie = cookie.getCookie(base_url);\ntry {\n    qtcookie = `qttoken=${String(cookie.getKey(base_url, \"qttoken\"))}; deviceId=${device};`\n} catch (e) {}\n\nvar params = {\n    html: html,\n    item_id: item_id,\n    source: sources,\n    tab: tab,\n    tone_id: tone_id,\n    variable: varia,\n    version: '4.11.5.1'\n};\n\nvar content_url = '\/content';\nif ((sources == \"\u756a\u8304\" || sources == \"\u4e03\u732b\" || sources == \"\u5854\u8bfb\") && fqpara && tab == \"\u5c0f\u8bf4\") {\n    content_url = '\/content?review=1';\n}\n\n\/\/var signInfo = generateComplexSignature('POST', content_url, {}, APP_SECRET, params);\n\n\n\/\/var signedParams = copyObject(params);\n\/\/signedParams.timestamp = signInfo.timestamp;\n\/\/signedParams.nonce = signInfo.nonce;\n\/\/signedParams.sign = signInfo.sign;\n\n\nvar op = {\n    method: \"POST\",\n    body: JSON.stringify(params),\n    headers: {\n        cookie: qtcookie,\n        'Content-Type': 'application\/json'\n    }\n};\n\nop = JSON.stringify(op);\n\/\/java.toast(op);\ndata = java.ajax(base_url + content_url + `,${op}`);\ntry {\n    data = JSON.parse(data);\n    if (data.msg) {\n        java.toast(data.msg);\n    }\n} catch (e) {}\ncontent = data.content\n\nif (close_img == 'on') {\n\tcontent = removeAllImgTags(content);\n\t}\n\nif ((sources == \"\u756a\u8304\" || sources == \"\u4e03\u732b\" || sources == \"\u5854\u8bfb\") && fqpara == \"on\" && tab == \"\u5c0f\u8bf4\") {\n    var sdtoken;\n    try {\n        var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n        sdtoken = String(loginInfoMap['\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)'] || '');\n    } catch (e) {\n        sdtoken = '';\n    }\n    var rawCookie = getFanqieCookie() || sdtoken;\n    var match = rawCookie.match(\/sessionid=[^;]+\/);\n    var fqcookie = match ? match[0] : '';\n    var fqssionid = '';\n    if (!fqcookie) {} else {\n        fqssionid = getSessionId(fqcookie)\n    }\n    content = content\n        .replace(\/ident=\"\/g, 'ident=\"' + base_url)\n        .replace(\/book_id=\/g, 'book_id=' + book_id + '&ssionid=' + fqssionid);\n    if (device_type == \"\u82f9\u679c\") {\n        content = paraForiOS(content, sources);\n    } else {\n        content = paraForAndroid(content, sources,islyc);\n    }\n}\ndata = JSON.stringify({\n    content: content,\n});\nif (device_type == \"\u5b89\u5353\" && (tab == \"\u77ed\u5267\" || tab == \"\u89c6\u9891\" || sources == '\u6bd2\u820c\u5f71\u89c6' || sources == 'NT\u52a8\u6f2b')) {\n    data = {\n        content: `\u3010\u53f3\u4e0a\u89d2\u5237\u65b0\u3011\u5f00\u542f\u64ad\u653e(\u4e0b\u4e00\u96c6\u8bf7\u5207\u6362\u4e0b\u4e00\u7ae0\u5237\u65b0)\\n\u64ad\u653e\u76f4\u94fe\uff1a\\n${content}`,\n    };\n    data = JSON.stringify(data);\n    if (book.durChapterIndex === chapter.index) {\n        let video_url = `${base_url}\/online_video?book_id=${book_id}&source=${sources}&tab=${tab}`;\n        if (sources == '\u6bd2\u820c\u5f71\u89c6' || sources == 'NT\u52a8\u6f2b') {\n            video_url = content;\n        };\n        java.startBrowser(video_url, title);\n        java.toast(\"\u6b63\u5728\u52a0\u8f7d\u89c6\u9891...\");\n    }\n\n}\ndata;\n<\/js>$.content"},"loginUrl":"\/\/ \u5f53\u524d\u4e66\u6e90\u7248\u672c\u53f7\uff0c\u5207\u52ff\u4fee\u6539\uff0c\u5426\u5219\u5f71\u54cd\u66f4\u65b0\u7684\u8bc6\u522b\nconst localVersion = '5.1.26';\nlet controlUrl = host[0];\nfunction login(flag) {\n    if (flag == undefined) {\n        result = JSON.parse(source.getLoginInfo())\n    } else {\n        java.longToast(\"\\n\\n\ud83d\udc9e\u6b63\u5728\u767b\u5f55\u4e2d...\")\n        putLoginInfo(JSON.stringify(result))\n    }\n    let base_url = getArgument('server')\n    let zdyserver = String(result['\u81ea\u5b9a\u4e49\u670d\u52a1\u5668(\u53ef\u4e0d\u586b)']);\n    if (zdyserver.includes('http')) {\n        setArgument('server', zdyserver);\n        if (getKey(String(cookie.getCookie(base_url)))) {\n            let cookies = cookie.getCookie(base_url)\ntry{cookie.removeCookie(base_url)} catch(e){}\n            cookie.setCookie(zdyserver, cookies)\n        }\n        java.toast(`\\n\\n\u5f53\u524d\u670d\u52a1\u5668\u4e3a\u81ea\u5b9a\u4e49\u670d\u52a1\u5668\\n${zdyserver}\\n\\n\u5207\u6362\u670d\u52a1\u5668\u8bf7\u5148\u6e05\u7a7a\u670d\u52a1\u5668\u5730\u5740\u4e2d\u7684\u6570\u636e`);\n    }\n    let plcolor = String(getArgument('plcolor')  || result['\u81ea\u5b9a\u4e49\u8bc4\u8bba\u989c\u8272(\u53ef\u4e0d\u586b)'] || '#000000');\n    if (plcolor) {\n        setArgument('plcolor', plcolor);\n    } else {\n        setArgument('plcolor', '#000000');\n    }\n    let zdysources = String(result['\u81ea\u5b9a\u4e49\u641c\u7d22\u6e90(\u591a\u4e2a\u7528\u82f1\u6587,\u5206\u5272)'] || '');\n    if (zdysources) {\n        setArgument('sources', zdysources);\n    };\n    base_url = getArgument('server')\n    let register_email = String(result['\u90ae\u7bb1'])\n    let password = String(result['\u5bc6\u7801'])\n    let key = String(result['\u5bc6\u94a5'] || '')\n\n    if ((register_email && password || key) && !String(getKey(String(cookie.getCookie(base_url))))) {\n        try{cookie.removeCookie(base_url)} catch(e){}\n        let deviceKey = '';\n        try {\n            deviceKey = java.deviceID();\n        } catch (e) {\n            deviceKey = java.androidId();\n        };\n        let deviceId = deviceKey;\n        if (register_email && password) {\n            let options = JSON.stringify({\n                method: 'POST',\n                headers: {\n                    'Content-Type': 'application\/json'\n                },\n                body: JSON.stringify({\n                    register_email: result['\u90ae\u7bb1'],\n                    password: result['\u5bc6\u7801']\n                })\n            })\n            try {\n                let data = JSON.parse(java.ajax(`${base_url}\/login_api,${options}`))\n                if (data.code == 0) {\n                    \/\/java.toast(deviceId)\n                    java.toast(\"\\n\\n\u2705\ufe0f\u767b\u5f55\u6210\u529f\")\n                    cookie.setCookie(base_url, `qttoken=${data.key};deviceId=${deviceId}`)\n                    result['\u5bc6\u94a5'] = data.key\n                    setArgument('qttoken', data.key);\n                    putLoginInfo(JSON.stringify(result))\n                } else {\n                    java.toast('\\n\\n\ud83d\udc94' + data.msg || \"\u767b\u5f55\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5\uff01\")\n                }\n            } catch (e) {\n                java.toast(\"\\n\\n\ud83d\udc94\u767b\u5f55\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5\uff01\\n\" + e.message)\n            }\n        } else {\n            cookie.setCookie(base_url, `qttoken=${key};deviceId=${deviceId}`)\n            let res = java.ajax(`${base_url}\/user_api,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n            try {\n                res = JSON.parse(res)\n                if (res.id != undefined) {\n                    setArgument('qttoken', key);\n                    java.toast('\\n\\n\u5bc6\u94a5\u767b\u5f55\u6210\u529f')\n                    result['\u90ae\u7bb1'] = res.email\n                    putLoginInfo(JSON.stringify(result))\n                } else {\n                    throw new Error()\n                }\n            } catch (e) {\n                java.log(e)\n                java.toast(\"\\n\\n\ud83d\udc94\u767b\u5f55\u5931\u8d25\")\n            }\n        }\n    } else if (flag && String(getKey(String(cookie.getCookie(base_url))))) {\n        java.toast(\"\\n\\n\u5f53\u524d\u2705\ufe0f\u5df2\u767b\u5f55\uff0c\u8bf7\ud83d\udeab\u9000\u51fa\u767b\u5f55\u540e\u91cd\u65b0\u767b\u5f55\");\n        \/\/checkStatus();\n    } else if (flag) {\n        java.toast(\"\\n\\n\u26d4\ufe0f\u8bf7\u5148\u586b\u5199\u90ae\u7bb1\u548c\u5bc6\u7801\");\n    }\n}\n\nfunction objectToCookieString(obj) {\n  if (!obj || typeof obj !== 'object') {\n    return '';\n  }\n  return Object.entries(obj)\n    .map(([key, value]) => {\n      const stringValue = String(value);\n      const encodedKey = encodeURIComponent(key);\n      const encodedValue = encodeURIComponent(stringValue);\n      return `${encodedKey}=${encodedValue}`;\n    })\n    .join('; ');\n}\n\nfunction control(){\n    controlUrla = getArgument('controlUrl');\n    if (controlUrla){\n        controlUrla = findFirstAvailableHost([controlUrla]);\n    }\r\n    if (!controlUrla) {\n        controlUrla = findFirstAvailableHost(host) || controlUrl;\n    }\n    setArgument('controlUrl', controlUrla);\n    try {\n    \tlet open_argument = source.getVariable();\n    \topen_argument=JSON.parse(open_argument);\n    \tlet control_cookie = objectToCookieString(open_argument);\n    cookie.setCookie(controlUrla, control_cookie);\n    \t} catch{}\n      \/\/java.toast(cookie.getCookie(controlUrla))\n    \tjava.startBrowserAwait(controlUrla + '\/control', '\u6674\u5929\u5c0f\u8bf4\u8bbe\u7f6e');\n    applyCookieSettings();\n\t}\n\nfunction applyCookieSettings() {\n\t  let controlUrla = getArgument('controlUrl') || controlUrl;\n\t  \tvar cookieStr = String(cookie.getCookie(controlUrla));\n    \n    var cookieData = {};\n    if (cookieStr && cookieStr !== 'null' && cookieStr !== 'undefined' && cookieStr !== '') {\n        var pairs = cookieStr.split('; ');\n        for (var i = 0; i < pairs.length; i++) {\n            var pair = pairs[i];\n            var eqIndex = pair.indexOf('=');\n            if (eqIndex > -1) {\n                var key = pair.substring(0, eqIndex).trim();\n                var value = decodeURIComponent(pair.substring(eqIndex + 1).trim());\n                cookieData[key] = value;\n                setArgument(key, value);\n            }\n        }\n    }\n    \n    var displayConfig = [\n        { key: 'server', label: '\u670d\u52a1\u5668', defaultValue: host[0] },\n        { key: 'proxy', label: '\u8bbf\u95ee\u6a21\u5f0f', defaultValue: '\u4e91\u7aef' },\n        { key: 'tab', label: '\u9605\u8bfb\u6a21\u5f0f', defaultValue: '\u5c0f\u8bf4' },\n        { key: 'source_type', label: '\u9605\u8bfb\u9891\u9053', defaultValue: '\u7537\u9891' },\n        { key: 'sources', label: '\u4e66\u6e90\u9009\u62e9', defaultValue: '\u5168\u90e8' },\n        { key: 'fqpara', label: '\u6bb5\u8bc4\u663e\u793a', defaultValue: 'on' },\n        { key: 'disabled_sources', label: '\u5f3a\u5236\u641c\u7d22', defaultValue: '0' },\n        { key: 'reading', label: '\u540c\u6b65\u4e66\u67b6', defaultValue: '0' },\n        { key: 'info', label: '\u5b8c\u6574\u7b80\u4ecb', defaultValue: 'on' }\n    ];\n    \n    var valueMap = {\n        \/\/ \u8bbf\u95ee\u6a21\u5f0f\n        '\u672c\u5730': '\ud83d\udcbb \u672c\u5730',\n        '\u4e91\u7aef': '\u2601\ufe0f \u4e91\u7aef',\n        \n        \/\/ \u5f00\u5173\u72b6\u6001\n        'on': '\u2705 \u5f00\u542f',\n        'off': '\u274c \u5173\u95ed',\n        '1': '\u2705 \u5f00\u542f',\n        '0': '\u274c \u5173\u95ed',\n        \n        \/\/ \u9891\u9053\u7c7b\u578b\n        '\u7537\u9891': '\ud83d\udc68 \u7537\u9891',\n        '\u5973\u9891': '\ud83d\udc69 \u5973\u9891',\n        \n        \/\/ \u5185\u5bb9\u7c7b\u578b\n        '\u5c0f\u8bf4': '\ud83d\udcd6 \u5c0f\u8bf4',\n        '\u542c\u4e66': '\ud83c\udfa7 \u542c\u4e66',\n        '\u6f2b\u753b': '\ud83c\udfa8 \u6f2b\u753b',\n        '\u77ed\u5267': '\ud83c\udfac \u77ed\u5267',\n        \n        \/\/ \u6765\u6e90\u7c7b\u578b\n        'vip': '\ud83d\udc8e VIP\u4e13\u5c5e',\n        'svip': '\ud83d\udc51 SVIP\u4e13\u5c5e',\n        '\u63a8\u8350': '\u2b50 \u7f51\u53cb\u63a8\u8350',\n        '\u5168\u90e8': '\ud83d\udcda \u5168\u90e8'\n    };\n    \n\n    var displayLines = [];\n    \n    for (var i = 0; i < displayConfig.length; i++) {\n        var config = displayConfig[i];\n        var value = cookieData[config.key] || config.defaultValue;\n        \n        if (!cookieData[config.key]) {\n            setArgument(config.key, config.defaultValue);\n        }\n        \n        var displayValue = valueMap[value] || value;\n        if (config.key === 'sources' && displayValue.length > 25) {\n            displayValue = displayValue.substring(0, 25) + '...';\n        }\n        \n        displayLines.push(config.label + ': ' + displayValue);\n    }\n    \n    \/\/ \u6784\u5efa\u63d0\u793a\u6a21\u677f\n    var template = '\u2728 \u5f53\u524d\u914d\u7f6e\\n';\n    template += '\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\\n';\n    template += displayLines.join('\\n');\n    template += '\\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\\n';\n    template += '\u2764\ufe0f\u5f53\u524d\u5e94\u7528\u7684 *\u2699\ufe0f\u4e66\u6e90\u8bbe\u7f6e* \u4e2d\u7684\u914d\u7f6e\u54e6\u2764\ufe0f'\n    \n    \/\/ \u663e\u793a\u63d0\u793a\n    java.longToast(template);\n    \n    return displayLines.length;\n}\n\n\nfunction reCookieSettings(){\n\tlet controlUrla = getArgument('controlUrl') || controlUrl;\n    cookie.removeCookie(controlUrla);\n    applyCookieSettings();\n    \n}\n\/\/ \u68c0\u6d4b\u670d\u52a1\u5668\nfunction checkNet() {\n    let url = getArgument('server');\n    java.longToast(`\\n\\n\u267b\ufe0f\u6b63\u5728\u68c0\u6d4b\uff1a${url}\\n\u8bf7\u7a0d\u7b49~`);\n    let date1 = new Date().getTime();\n    let html = java.ajax(url + '\/login');\n    let date2 = new Date().getTime();\n    let t = date2 - date1;\n    let c = String(html).indexOf('\u6674\u5929');\n    let code = 1;\n    let time = t \/ 1000 + 's';\n    let logTime = '\u3010' + url + '\u3011\\n\u250b\u250b\\n' + '\u89e3\u6790\u65f6\u95f4\uff1a' + time;\n    if (c == -1 || t > 5000) {\n        java.longToast('\\n\ud83d\udc94\u3010\u8bbf\u95ee\u5931\u8d25\u63d0\u793a\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2663\ufe0f\u5f53\u524d\u63a5\u53e3\u65e0\u6cd5\u8bbf\u95ee(\u53ef\u80fd\u88ab\u5899)\u2663\ufe0f\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\/\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    } else if (t < 1000) {\n        java.longToast('\\n\ud83d\udc96\u3010\u7f51\u7edc\u73af\u5883\u4f18\u826f\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2764\ufe0f\u5ef6\u8fdf\u4f4e\uff0c\u63a8\u8350\u4f7f\u7528\u6b64\u63a5\u53e3\u2764\ufe0f\\n\u250b\u250b\\n\u7f51\u7edc\u73af\u5883\u4f18\u826f\uff0c\u8bf7\u7ee7\u7eed\u4fdd\u6301\u72b6\u6001\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    } else if (t >= 1000 && t < 2000) {\n        java.longToast('\\n\ud83d\udc9b\u3010\u7f51\u7edc\u73af\u5883\u4e00\u822c\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2666\ufe0f\u5ef6\u8fdf\u4e00\u822c\uff0c\u52c9\u5f3a\u53ef\u4f7f\u7528\u2666\ufe0f\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\u6216\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    } else if (t >= 2000 && t < 5000) {\n        java.longToast('\\n\ud83d\udc94\u3010\u7f51\u7edc\u73af\u5883\u582a\u5fe7\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2660\u5ef6\u8fdf\u8fc7\u9ad8\uff0c\u4e0d\u5efa\u8bae\u4f7f\u7528\u2660\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\u6216\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    }\n}\n\n\nfunction findFirstAvailableHost(hosts) {\n    \/\/ \u6309\u987a\u5e8f\u68c0\u6d4b\uff0c\u627e\u5230\u7b2c\u4e00\u4e2a\u53ef\u7528\u7684\u5c31\u8fd4\u56de\n    for (var i = 0; i < hosts.length; i++) {\n        var host = hosts[i];\n        \n        try {\n            java.longToast(\"\ud83d\udd0d \u6b63\u5728\u68c0\u6d4b: \" + host);\n            \n            var start = new Date().getTime();\n            var response = java.ajax(host + \"\/login\");\n            var end = new Date().getTime();\n            var time = end - start;\n            \n            \/\/ \u68c0\u67e5\u662f\u5426\u53ef\u7528\n            if (String(response).indexOf(\"\u6674\u5929\") !== -1 && time <= 5000) {\n                \/\/ \u663e\u793a\u7ed3\u679c\n                var status = \"\u2705 \u53ef\u7528\";\n                if (time < 1000) {\n                    status = \"\ud83d\udc9a \u4f18\u79c0\";\n                } else if (time < 2000) {\n                    status = \"\ud83d\udc9b \u4e00\u822c\";\n                } else {\n                    status = \"\ud83e\udde1 \u8f83\u6162\";\n                }\n                java.longToast(status + \"\\n\u4e3b\u673a: \" + host + \"\\n\u5ef6\u8fdf: \" + time + \"ms\");\n                return host; \/\/ \u76f4\u63a5\u8fd4\u56de\u627e\u5230\u7684\u4e3b\u673a\n            }\n        } catch (e) {\n            \/\/ \u8fd9\u4e2a\u4e3b\u673a\u5931\u8d25\uff0c\u7ee7\u7eed\u4e0b\u4e00\u4e2a\n        }\n    }\n    \n    \/\/ \u6240\u6709\u4e3b\u673a\u90fd\u4e0d\u53ef\u7528\n    java.longToast(\"\u274c \u6ca1\u6709\u53ef\u7528\u7684\u4e3b\u673a\");\n    return null;\n}\nfunction isVips(res) {\n    let isVIP = '';\n    let vipEndTime = res.vip_end_time;\n    let formattedDate = '';\n\n    if (vipEndTime && vipEndTime !== 0) {\n        let date = new Date(vipEndTime * 1000);\n        formattedDate = `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`;\n        let currentTime = Math.floor(Date.now() \/ 1000);\n        let remainingDays = Math.ceil((vipEndTime - currentTime) \/ (24 * 60 * 60));\n        if (currentTime > vipEndTime) {\n            isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} (\u5df2\u8fc7\u671f)`;\n        } else if (remainingDays <= 7) {\n            isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} \u5269\u4f59${remainingDays}\u5929`;\n        } else {\n            if (vipEndTime < 1912946812) {\n                isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"}(${formattedDate})`;\n            } else {\n                isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} (\u6c38\u4e45)`;\n            }\n        }\n    } else {\n        isVIP = '\u60a8\u5c1a\u672a\u5f00\u901aVIP';\n    }\n    return isVIP;\n}\n\nfunction checkStatus() {\n    java.longToast('\\n\\n\u267b\ufe0f\u68c0\u6d4b\u4e2d...');\n    let base_url = getArgument('server')\n    let res = java.ajax(`${base_url}\/user_api,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n    try {\n        res = JSON.parse(res)\n        if (res.id != undefined) {\n            result['\u90ae\u7bb1'] = res.email\n            putLoginInfo(JSON.stringify(result))\n            let devices\n            try {\n                devices = Object.keys(JSON.parse(res.device)).length;\n            } catch (e) {\n                devices = res.device ? 1 : 0;\n            }\n            let isVip = isVips(res);\n            tips = `\n\u250f\u2505\u2505\u2505\u2505\u2505\u2505\u2531\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2510\n\u3000 \ud83e\udde2\u6635\u79f0 \u3000\u3000\u3000\u3000${res.nickname.padEnd(20,\"\\t\") || \"\u672a\u8bbe\u7f6e\".padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\u2709\ufe0f\u90ae\u7bb1\u3000\u3000\u3000\u3000${res.email.replace(\/(.{3}).*?@\/,\"$1***@\").padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udd11\u5bc6\u94a5\u3000\u3000\u3000\u3000${(`${res.user_key.substring(0,4)}***${res.user_key.slice(-4)}`).padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udcc5\u6ce8\u518c\u65f6\u95f4\u3000\u3000${java.timeFormat(res.register_time*1000).padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\uddd2\ufe0f\u4eca\u65e5\u9605\u8bfb\u3000\u3000${(java.timeFormat(new Date()).slice(0,10)==java.timeFormat(res.last_read_time * 1000).slice(0,10)?res.day_read_count:0).toString().padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udcda\u7d2f\u8ba1\u9605\u8bfb\u3000\u3000${res.all_read_count.toString().padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udd53\u6700\u540e\u9605\u8bfb\u3000\u3000${(res.last_read_time != 0?java.timeFormat(res.last_read_time * 1000):'\u672a\u9605\u8bfb').padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udcf1\u5728\u7ebf\u8bbe\u5907\u3000\u3000${devices.toString().padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udc51\u4f1a\u5458\u72b6\u6001\u3000\u3000${isVip.padEnd(20,\"\\t\")}\n\u2523\u2505\u2505\u2505\u2505\u2505\u2505\u2549\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2524\n\u3000\ud83d\udeab\u5c01\u7981\u72b6\u6001\u3000\u3000${res.is_banned?'\u5df2\u5c01\u7981':'\u6b63\u5e38\u3000'}\u3000\u3000\u3000\u3000\u3000\u3000\u3000\n\u2517\u2505\u2505\u2505\u2505\u2505\u2505\u2539\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2504\u2518\n`\n            java.log(tips)\n            java.longToast(tips)\n        } else {\n            throw new Error(res.msg)\n        }\n    } catch (e) {\n        \/\/java.log(e)\n        java.toast(\"\\n\u68c0\u6d4b\u767b\u5f55\u5931\u8d25\\n\" + e.message)\n    }\n}\n\nfunction clearDevice() {\n    let base_url = getArgument('server')\n    let res = java.ajax(`${base_url}\/clear,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n    res = JSON.parse(res);\n   java.toast(res.code == 0 ? \"\\n\\n\ud83d\udcf4\u8bbe\u5907\u6e05\u9664\u6210\u529f\" : res.msg)\n    Packages.java.lang.Thread.sleep(500)\n    checkStatus()\n}\n\/\/ \u4fdd\u5b58\u767b\u5f55UI\u4fe1\u606f\nfunction putLoginInfo(info) {\n    try {\n        let key = java.androidId()\n        let encodeStr = Packages.android.util.Base64.encodeToString(java.createSymmetricCrypto(\"AES\", key).encrypt(info), 2)\n        cache.put(`userInfo_${source.getKey()}`, encodeStr)\n        return true\n    } catch (e) {\n        java.log(e)\n        return source.putLoginInfo(info)\n    }\n}\n\n\/\/ \u7528\u6237\u540e\u53f0\nfunction loginqt() {\n\t   let base_url = getArgument('server');\n\t   let ck = String(cookie.getKey(base_url, \"qttoken\"));\n\t   if (!ck) {\n\t   \tjava.longToast('\\n\\n\ud83d\udeab\u8bf7\u5148\u767b\u5f55!')\n\t   \t} else {\n\t   \t\tjava.startBrowserAwait(getArgument('server') + '\/user', '\u6674\u5929\u5c0f\u8bf4\u540e\u53f0');\n\t   \t\t}\n    }\n\n\/\/ \u7528\u6237\u6ce8\u518c\nfunction register() {\n\t   let base_url = getArgument('server');\n\t   \tjava.startBrowserAwait(getArgument('server') + '\/register', '\u6674\u5929\u5c0f\u8bf4\u6ce8\u518c');\n    }\n\n\/\/\u767b\u5f55\u756a\u8304\nfunction fq_login() {\n    try {\n        java.startBrowserAwait(\"https:\/\/fanqienovel.com\/\", \"\u767b\u5f55\")\n    } catch (e) {\n        java.toast(e)\n    }\n    try {\n        cookie.removeCookie(\"snssdk.com\")\n    } catch (e) {}\n    var cookie_ = \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : source.getLoginInfoMap()['\u624b\u52a8\u767b\u5f55Token'])\n    let user\n    try {\n        user = JSON.parse(java.ajax(\"https:\/\/fanqienovel.com\/api\/user\/info\/v2,\" + JSON.stringify({\n            method: \"GET\",\n            headers: {\n                \"Cookie\": cookie_\n            }\n        }))).data.name\n    } catch (e) {\n        java.log(e)\n    }\n    if (!cookie_ || cookie_ == \"sessionid=\" || !user) {\n        java.toast(\"\u672a\u83b7\u53d6\u5230\u767b\u5f55\u51ed\u636e\uff0c\u767b\u5f55\u5931\u8d25\")\n        return false\n    }\n    java.toast(\"\\n\\n\u6b22\u8fce \" + user + \"\\n\u767b\u5f55\u6210\u529f\uff01\")\n    return true\n}\n\n\/\/\u9000\u51fa\u767b\u5f55\nfunction logout() {\n    cookie.removeCookie(\"fanqienovel.com\");\n    cookie.removeCookie(\"snssdk.com\");\n    cookie.removeCookie(\"69shuba.com\");\n    \/*\n    let servers = host\n    for (let server of servers) {\n    \ttry{removeCookie(server )} catch(e){cookie.removeCookie(server )}\n    }\n    *\/\ntry{cookie.removeCookie(getArgument('server'))} catch(e){}\n    java.toast(\"\u9000\u51fa\u767b\u5f55\u6210\u529f\");\n}\n\n\/\/\u83b7\u53d6\u53c2\u6570\nfunction getArgument(key) {\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    return open_argument[key];\n}\n\n\/\/\u8bbe\u7f6e\u53c2\u6570\nfunction setArgument(key, value) {\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    open_argument[key] = value;\n    open_argument = JSON.stringify(open_argument);\n    source.setVariable(open_argument);\n    return open_argument;\n}\n\n\/\/ \u8bbe\u7f6e\u672c\u5730or\u4e91\u7aef\u8bbf\u95ee\nfunction get_proxy() {\n    let proxy = getArgument('proxy');\n    if (proxy == '\u672c\u5730') {\n        setArgument('proxy', '\u4e91\u7aef');\n        java.longToast('\\n\u6240\u6709\u6570\u636e\u91c7\u7528\\n\\n\u670d\u52a1\u5668\u7f51\u7edc\u8bbf\u95ee\\n\\n\u5982\u679c\u53d1\u73b0\u7528\u4e0d\u4e86\uff0c\u8bf7\u5207\u6362\u672c\u5730\u7f51\u7edc\u8bbf\u95ee\uff0c\u598269\u4e66\u5427');\n    } else {\n        setArgument('proxy', '\u672c\u5730');\n        java.longToast('\\n\u6240\u6709\u6570\u636e\u91c7\u7528\\n\\n\u672c\u5730\u7f51\u7edc\u8bbf\u95ee\\n\\n\u5982\u679c\u53d1\u73b0\u7528\u4e0d\u4e86\uff0c\u8bf7\u5f00\u542f\u7f51\u7edc\u4ee3\u7406\uff0c\u598269\u4e66\u5427');\n    }\n}\n\n\nfunction closeImg() {\n    let close_img = getArgument('close_img');\n    if (close_img == 'on') {\n        setArgument('close_img', 'off');\n        java.longToast('\\n\u663e\u793a\u6587\u4e2d\u56fe\u7247');\n    } else {\n        setArgument('close_img', 'on');\n        java.longToast('\\n\u4e0d\u663e\u793a\u6587\u4e2d\u56fe\u7247');\n    }\n}\n\n\/\/\u8bbe\u7f6e\u7537\u5973\u9891\nfunction set_source_type() {\n    let source_type = getArgument(\"source_type\");\n    if (source_type == '\u5973\u9891') {\n        setArgument(\"source_type\", '\u7537\u9891');\n    java.toast(\"\\n\u53d1\u73b0\u9875\u5df2\u8bbe\u7f6e\u4e3a:\ud83d\ude4b\u200d\u2642\ufe0f\u7537\u9891\" );\n    } else {\n        setArgument(\"source_type\", '\u5973\u9891');\n    java.toast(\"\\n\u53d1\u73b0\u9875\u5df2\u8bbe\u7f6e\u4e3a:\ud83d\ude4b\u200d\u2640\ufe0f\u5973\u9891\" );\n    }\n    \n}\n\nfunction set_reading() {\n\tlet reading = getArgument(\"reading\");\n    if (reading == '1') {\n        setArgument(\"reading\", '0');\n    java.toast(\"\\n\\n\u6674\u5929\u4e66\u67b6\u8bb0\u5f55\u540c\u6b65\u5df2\u5173\u95ed\uff01\" );\n    } else {\n        setArgument(\"reading\", '1');\n    java.longToast(\"\\n\\n\u6674\u5929\u4e66\u67b6\u8bb0\u5f55\u540c\u6b65\u5df2\u5f00\u542f\uff01\\n\u5237\u65b0\u9605\u8bfb\u4e66\u67b6\u5373\u53ef\u5c06\u4e66\u67b6\u4e66\u7c4d\u540c\u6b65\u5230\u6674\u5929\u4e66\u67b6\uff01\" );\n    }\n\n\t}\n\n\/\/\u9996\u9875\nfunction api() {\n    java.startBrowserAwait('http:\/\/vip.gyks.cf', \"\u9996\u9875\");\n}\n\n\/\/\u6253\u8d4f\nfunction vip() {\n\t    let base_url = getArgument('server');\n\t   let ck = String(cookie.getKey(base_url, \"qttoken\"));\n\t   if (!ck) {\n\t   \tjava.longToast('\\n\\n\ud83d\udeab\u8bf7\u5148\u767b\u5f55!')\n\t   \t} else {\n\t   \t\tjava.startBrowserAwait(getArgument('server') + '\/coffee', '\u6674\u5929\u5c0f\u8bf4\u4f1a\u5458\u5f00\u901a');\n\t   \t\t}\n    }\n\nfunction put_sk() {\n\t    \t   \t\tjava.startBrowserAwait( 'https:\/\/sk.gyks.cf', '\u6674\u5929\u4e66\u5e93');\n\t   \t\t\n    }\n\nvar server = getArgument('server');\n\n\/\/\u8bbe\u7f6e\u641c\u7d22\u5a92\u4f53\nfunction set_media(media) {\n    const mediaConfig = {\n        '\u559c\u9a6c\u62c9\u96c5': ['\u542c\u4e66'],\n        '\u756a\u8304': '*',\n        '\u798f\u5229\u5c0f\u8bf4': ['\u5c0f\u8bf4'],\n        '\u5982\u6f2b\u753b': ['\u6f2b\u753b'],\n        '\u5305\u5b50\u6f2b\u753b': ['\u6f2b\u753b'],\n        '\u4e5d\u5996\u6f2b\u753b': ['\u6f2b\u753b'],\n        '\u7ec5\u58eb\u6f2b\u753b': ['\u6f2b\u753b'],\n        '\u798f\u5229\u6f2b\u753b': ['\u6f2b\u753b'],\n        '\u597d\u770b\u6f2b\u753b': ['\u6f2b\u753b'],\n        '\u516d\u6708\u542c\u4e66': ['\u542c\u4e66'],\n        '\u6d77\u6d0b\u542c\u4e66': ['\u542c\u4e66'],\n        '\u9177\u6211\u542c\u4e66': ['\u542c\u4e66'],\n        '\u4e03\u732b': ['\u5c0f\u8bf4', '\u542c\u4e66', '\u77ed\u5267'],\n        '\u6cb3\u9a6c': ['\u77ed\u5267'],\n        '\u8d85\u4f1a\u4e13\u5c5e\u77ed\u5267': ['\u77ed\u5267'],\n        '\u6b6a\u745e\u53e4\u5fb7': ['\u6f2b\u753b'],\n        '\u6bd2\u820c\u5f71\u89c6': ['\u77ed\u5267'],\n        '\u5168\u90e8': '*', \/\/ \u5141\u8bb8\u6240\u6709\u6a21\u5f0f\n        '\u9ed8\u8ba4': ['\u5c0f\u8bf4']\n    };\n\n    const source = getArgument('sources');\n    const allowedModes = mediaConfig[source] || mediaConfig['\u9ed8\u8ba4'];\n    let targetMedia = mediaConfig['\u9ed8\u8ba4'][0];\n    let isAllowed = false;\n\n    if (allowedModes === '*' || allowedModes.includes(media)) {\n        targetMedia = media;\n        isAllowed = true;\n    } else if (Array.isArray(allowedModes)) {\n        targetMedia = allowedModes[0];\n    }\n\n    const message = isAllowed ?\n        `\\n\\n\u5df2\u5207\u6362\u81f3\uff1a${targetMedia}\\n\u8bf7\u91cd\u65b0\u641c\u7d22\u4e66\u7c4d\uff01` :\n        `\\n\\n\u76ee\u524d${source}\uff1a\u4e0d\u652f\u6301\u3010${media}\u3011\u6a21\u5f0f\uff01\\n\u5df2\u81ea\u52a8\u5207\u6362\u81f3\uff1a${targetMedia}`;\n\n    setArgument('tab', targetMedia);\n    java.toast(message);\n}\n\n\/\/\u83b7\u53d6\u641c\u7d22\u5a92\u4f53\nfunction get_media() {\n    let media = getArgument('tab');\n    let source = getArgument('sources');\n    if (media == '') {\n        media = '\u5168\u90e8';\n    }\n    var tishi = '\\n\\n\u5f53\u524d\u670d\u52a1\u5668\uff1a' + getArgument('server')\n    java.longToast(`\\n\\n\u5f53\u524d\u4f7f\u7528\u6e90\uff1a${source}-${media}${tishi}`);\n}\n\n\n\/\/\u8bbe\u7f6e\u670d\u52a1\u5668\nfunction set_server() {\n    putLoginInfo(JSON.stringify(result))\n    let zdyserver;\n    let base_url = getArgument('server')\n    try {\n        zdyserver = String(result['\u81ea\u5b9a\u4e49\u670d\u52a1\u5668(\u53ef\u4e0d\u586b)']);\n        if (zdyserver.includes('http')) {\n            setArgument('server', zdyserver);\n            if (getKey(String(cookie.getCookie(base_url)))) {\n                let cookies = cookie.getCookie(base_url)\n                try{cookie.removeCookie(base_url)} catch(e){}\n                cookie.setCookie(zdyserver, cookies)\n            }\n            java.toast(`\\n\\n\u5f53\u524d\u670d\u52a1\u5668\u4e3a\u81ea\u5b9a\u4e49\u670d\u52a1\u5668\\n${zdyserver}\\n\\n\u5207\u6362\u670d\u52a1\u5668\u8bf7\u5148\u6e05\u7a7a\u670d\u52a1\u5668\u5730\u5740\u4e2d\u7684\u6570\u636e`);\n        } else {\n            zdyserver = '';\n        }\n    } catch (error) {\n        zdyserver = '';\n    }\n    if (!zdyserver) {\n        const servers = host\n        const currentServer = getArgument('server') || '';\n        const currentIndex = servers.indexOf(currentServer);\n\n        const nextIndex = currentIndex >= 0 ? (currentIndex + 1) % servers.length : 0;\n        const nextServer = servers[nextIndex];\n\n        setArgument('server', nextServer);\n        if (getKey(String(cookie.getCookie(currentServer)))) {\n            let cookies = cookie.getCookie(currentServer)\ntry{cookie.removeCookie(currentServer)} catch(e){}\n            cookie.setCookie(nextServer, cookies)\n        }\n        java.longToast(`\\n\\n\u670d\u52a1\u5668\u3010${nextIndex+1}\u3011\uff1a${nextServer}`);\n    }\n}\n\n\/\/\u83b7\u53d6\u97f3\u8272\nvar tone_id = getArgument('tone_id');\n\nfunction get_tone_id(arg) {\n    var datadist = {\n        \"0\": \"\u9ed8\u8ba4\u97f3\u8272\",\n        \"-1\": \"\u9605\u8bfb\u6a21\u5f0f\",\n        \"-2\": \"\u6f2b\u753b\u6a21\u5f0f\",\n        \"51\": \"\u591a\u4eba\u53d1\u97f3\",\n        \"1\": \"\u751c\u7f8e\u5c11\u5973\",\n        \"2\": \"\u6e05\u4eae\u9752\u53d4\",\n        \"5\": \"\u5f00\u6717\u9752\u5e74\",\n        \"6\": \"\u6e29\u67d4\u6dd1\u5973\",\n        \"4\": \"\u6210\u719f\u5927\u53d4\",\n        \"74\": \"\u5927\u53d4\u5347\u7ea7\",\n        \"30\": \"\u4f18\u96c5\u5fa1\u59d0\"\n    };\n    var tone_id = datadist[arg] || arg;\n    var tishi = '\\n\\n\u5f53\u524d\u97f3\u8272\uff1a' + tone_id;\n    java.toast(tishi);\n}\n\n\n\/\/\u8bbe\u7f6e\u6765\u6e90\nfunction set_source(sources) {\n    let zdysources = String(result['\u81ea\u5b9a\u4e49\u641c\u7d22\u6e90(\u591a\u4e2a\u7528\u82f1\u6587,\u5206\u5272)'] || '');\n    if (zdysources.length > 1 && zdysources != 'undefined') {\n        java.toast('\\n\\n\u8bf7\u5148\u6e05\u7a7a\u81ea\u5b9a\u4e49\u6e90\u518d\u8bbe\u7f6e');\n    } else {\n        setArgument('sources', sources);\n        set_media('\u5c0f\u8bf4');\n        java.toast(`\\n\\n\u5f53\u524d\u6765\u6e90\u5df2\u5207\u6362\u4e3a:\\n${sources}\\n\\n\u5207\u6362\u540e\u8bf7\u91cd\u65b0\u641c\u7d22`);\n    }\n}\n\n\/\/ \u8bbe\u7f6e\u7b80\u4ecb\nfunction set_info() {\n    var info = getArgument('info');\n    if (info == 'off') {\n        setArgument('info', 'on');\n        java.toast('\\n\\n\u5df2\u6062\u590d\u8be6\u60c5\u9875\u8be6\u7ec6\u7b80\u4ecb');\n    } else {\n        setArgument('info', 'off');\n        java.toast('\\n\\n\u5df2\u7cbe\u7b80\u8be6\u60c5\u9875\u7b80\u4ecb');\n    }\n}\n\n\/\/ \u756a\u8304\u6bb5\u8bc4\nfunction paracomment() {\n    var fqpara = getArgument('fqpara');\n    if (fqpara != 'on') {\n        setArgument('fqpara', 'on');\n        java.longToast(\"\\n\\n\u6bb5\u8bc4\u5df2\u5f00\u542f\\n\\n\u957f\u6309\u5237\u65b0\u6bb5\u540e\u9762\u7684\u56fe\u7247\u5373\u53ef\\n\\n\u5982\u679c\u56fe\u7247\u4e0d\u663e\u793a\uff0c\u5237\u65b0\u65e0\u53cd\u5e94\\n\u8bf7\u66f4\u65b0\u6d4b\u8bd5\u7248\u9605\u8bfbapp\");\n    } else {\n        setArgument('fqpara', 'off');\n        java.longToast('\\n\\n\u6bb5\u8bc4\u5df2\u5173\u95ed');\n    }\n}\n\n\/\/ \u5f3a\u5236\u641c\u7d22\u88ab\u7981\u7528\u7684\u6e90\nfunction disabledSources() {\n    var disabled_sources = getArgument('disabled_sources');\n    if (disabled_sources == '1') {\n        setArgument('disabled_sources', '0');\n        java.longToast('\\n\\n\u5f3a\u5236\u641c\u7d22\u7981\u7528\u7684\u6e90\u5df2\u5173\u95ed');\n    } else {\n        setArgument('disabled_sources', '1');\n        setArgument('sources', '\u5168\u90e8');\n        java.longToast(\"\\n\\n\u5f3a\u5236\u641c\u7d22\u7981\u7528\u7684\u6e90\u5df2\u5f00\u542f\\n\\n\u6ce8\u610f\uff1a\u5f00\u542f\u540e\u641c\u7d22\u65f6\u95f4\u4f1a\u53d8\u957f\uff01\");\n    }\n}\n\n\/\/ \u6211\u8981\u63a8\u8350\nfunction put_book() {\n    java.startBrowserAwait(getArgument('server') + '\/put_book', '\u6211\u6765\u63a8\u8350');\n}\n\n\/\/ \u4e66\u6e90\u66f4\u65b0\nfunction renderVersionPage() {\n    let yd = '';\n    let html = `\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n  <meta charset=\"UTF-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\n  <title>\u4e66\u6e90\u66f4\u65b0<\/title>\n  <!-- Font Awesome \u56fe\u6807\u5e93 -->\n  <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.4.0\/css\/all.min.css\" \/>\n  <style>\n    :root {\n      --primary-gradient: linear-gradient(135deg, #4e6ef2, #6b2dd8);\n      --latest-gradient: linear-gradient(135deg, #8e2de2 0%, #4a00e0 50%, #d4af37 100%);\n      --success-color: #28c76f;\n      --warning-color: #ff9f43;\n      --error-color: #ea5455;\n      --text-main: #1f2937;\n      --text-secondary: #6b7280;\n      --card-bg: #ffffff;\n      --border-color: #e5e7eb;\n      --light-bg: #f9fafb;\n      --shadow: 0 4px 12px rgba(78, 110, 242, 0.1);\n      --shadow-hover: 0 6px 18px rgba(78, 110, 242, 0.2);\n      --glow-shadow: 0 0 25px rgba(142, 45, 226, 0.5), 0 0 50px rgba(212, 175, 55, 0.3);\n      --modal-bg: rgba(31, 41, 55, 0.8);\n      --modal-content-bg: #ffffff;\n    }\n\n    * {\n      box-sizing: border-box;\n      margin: 0;\n      padding: 0;\n      font-family: 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;\n    }\n\n    body {\n      background: linear-gradient(135deg, #eef2ff, #f5f7ff);\n      color: var(--text-main);\n      min-height: 100vh;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      padding: 16px;\n    }\n\n    \/* \u52a0\u8f7d\u52a8\u753b *\/\n    .loading-wrapper {\n      text-align: center;\n      animation: fadeIn 0.3s ease;\n    }\n\n    .loading-spinner {\n      width: 50px;\n      height: 50px;\n      border: 4px solid rgba(78, 110, 242, 0.3);\n      border-top-color: #4e6ef2;\n      border-radius: 50%;\n      margin: 0 auto 20px;\n      animation: spin 1s linear infinite;\n    }\n\n    .loading-text {\n      color: var(--text-main);\n      font-size: 16px;\n      font-weight: 500;\n    }\n\n    @keyframes spin {\n      to { transform: rotate(360deg); }\n    }\n\n    @keyframes fadeIn {\n      from { opacity: 0; transform: translateY(20px); }\n      to { opacity: 1; transform: translateY(0); }\n    }\n\n    @keyframes slideIn {\n      from { opacity: 0; transform: translateY(30px); }\n      to { opacity: 1; transform: translateY(0); }\n    }\n\n    @keyframes pulse {\n      0%, 100% { opacity: 1; }\n      50% { opacity: 0.7; }\n    }\n\n    @keyframes gradientAnimation {\n      0% { background-position: 0% 50%; }\n      50% { background-position: 100% 50%; }\n      100% { background-position: 0% 50%; }\n    }\n\n    @keyframes breathe {\n      0%, 100% { \n        transform: scale(1);\n        box-shadow: var(--glow-shadow), var(--shadow);\n      }\n      50% { \n        transform: scale(1.02);\n        box-shadow: 0 0 30px rgba(142, 45, 226, 0.6), 0 0 60px rgba(212, 175, 55, 0.4), var(--shadow);\n      }\n    }\n\n    @keyframes shimmer {\n      0% {\n        background-position: -200% center;\n      }\n      100% {\n        background-position: 200% center;\n      }\n    }\n\n    \/* \u4e3b\u5bb9\u5668 *\/\n    .container {\n      width: 100%;\n      max-width: 420px;\n      background: var(--card-bg);\n      border-radius: 24px;\n      overflow: hidden;\n      box-shadow: var(--shadow);\n      position: relative;\n      z-index: 1;\n      animation: slideIn 0.5s ease;\n      display: none;\n    }\n\n    \/* \u5934\u90e8 *\/\n    .header {\n      background: var(--primary-gradient);\n      color: #ffffff;\n      padding: 24px 16px;\n      text-align: center;\n      position: relative;\n      overflow: hidden;\n    }\n\n    .header::before {\n      content: '';\n      position: absolute;\n      top: -30px;\n      left: -30px;\n      width: 80px;\n      height: 80px;\n      background: rgba(255, 255, 255, 0.15);\n      border-radius: 50%;\n    }\n\n    .header::after {\n      content: '';\n      position: absolute;\n      bottom: -60px;\n      right: -60px;\n      width: 150px;\n      height: 150px;\n      background: rgba(255, 255, 255, 0.1);\n      border-radius: 50%;\n    }\n\n    .header h1 {\n      font-size: 1.4rem;\n      font-weight: 700;\n      margin-bottom: 8px;\n      position: relative;\n      z-index: 2;\n    }\n\n    .header p {\n      font-size: 0.9rem;\n      opacity: 0.9;\n      line-height: 1.4;\n      position: relative;\n      z-index: 2;\n    }\n\n    .header-icon {\n      font-size: 48px;\n      margin-bottom: 10px;\n      display: inline-block;\n      animation: bounce 2s ease infinite;\n    }\n\n    @keyframes bounce {\n      0%, 100% { transform: translateY(0); }\n      50% { transform: translateY(-10px); }\n    }\n\n    \/* \u7248\u672c\u5bf9\u6bd4 *\/\n    .version-comparison {\n      display: flex;\n      flex-wrap: nowrap;\n      gap: 12px;\n      padding: 16px;\n      margin-top: 8px;\n      position: relative;\n      z-index: 10;\n    }\n\n    .version-card {\n      flex: 1;\n      min-width: 45%;\n      background: var(--card-bg);\n      border-radius: 16px;\n      padding: 28px 16px 16px;\n      box-shadow: var(--shadow);\n      text-align: center;\n      position: relative;\n      transition: transform 0.3s ease, box-shadow 0.3s ease;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n    }\n\n    .version-card:hover {\n      transform: translateY(-4px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .version-card.current-version {\n      background: linear-gradient(135deg, #ffffff 0%, #f8f9ff 100%);\n      border: 1px solid rgba(78, 110, 242, 0.15);\n    }\n\n    .version-card.current-version:hover {\n      box-shadow: 0 6px 20px rgba(78, 110, 242, 0.15);\n    }\n\n    .version-card.current-version h3,\n    .version-card.current-version .version-number,\n    .version-card.current-version .version-date {\n      color: var(--text-main);\n    }\n\n    .version-card.latest-version {\n      background: var(--latest-gradient);\n      background-size: 300% 300%;\n      box-shadow: var(--glow-shadow), var(--shadow);\n      color: #fff;\n      z-index: 2;\n      animation: gradientAnimation 6s ease infinite, breathe 3s ease-in-out infinite;\n      position: relative;\n      overflow: hidden;\n    }\n\n    .version-card.latest-version::before {\n      content: '';\n      position: absolute;\n      top: -50%;\n      left: -50%;\n      width: 200%;\n      height: 200%;\n      background: linear-gradient(\n        90deg,\n        transparent,\n        rgba(255, 255, 255, 0.3),\n        transparent\n      );\n      transform: rotate(45deg);\n      animation: shimmer 3s infinite;\n    }\n\n    .version-card.latest-version h3,\n    .version-card.latest-version .version-number,\n    .version-card.latest-version .version-date {\n      color: #fff;\n      text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\n      position: relative;\n      z-index: 1;\n    }\n\n    .version-status {\n      position: absolute;\n      top: 6px;\n      right: 6px;\n      padding: 3px 7px;\n      font-size: 0.65rem;\n      font-weight: 600;\n      border-radius: 6px;\n      color: #fff;\n      line-height: 1.2;\n      white-space: nowrap;\n      z-index: 2;\n    }\n\n    .version-card.latest-version .version-status {\n      background: rgba(255, 255, 255, 0.25);\n      backdrop-filter: blur(5px);\n      border: 1px solid rgba(255, 255, 255, 0.3);\n      color: #fff;\n      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n    }\n\n    .status-outdated { background: var(--warning-color); }\n    .status-latest { background: var(--success-color); }\n    .status-invalid { background: var(--error-color); }\n\n    .version-card h3 {\n      font-size: 0.9rem;\n      color: var(--text-secondary);\n      margin-bottom: 8px;\n      font-weight: 500;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 6px;\n    }\n\n    .version-number {\n      font-size: 1.25rem;\n      font-weight: 700;\n      color: var(--text-main);\n      margin: 8px 0;\n      transition: all 0.3s ease;\n      font-family: 'Courier New', monospace;\n    }\n\n    .version-card.latest-version .version-number {\n      font-size: 1.4rem;\n      transform: scale(1.05);\n      text-shadow: \n        0 2px 4px rgba(0, 0, 0, 0.3),\n        0 0 10px rgba(212, 175, 55, 0.8),\n        0 0 20px rgba(212, 175, 55, 0.5);\n      animation: pulse-glow 2s ease-in-out infinite;\n    }\n\n    @keyframes pulse-glow {\n      0%, 100% {\n        text-shadow: \n          0 2px 4px rgba(0, 0, 0, 0.3),\n          0 0 10px rgba(212, 175, 55, 0.8),\n          0 0 20px rgba(212, 175, 55, 0.5);\n      }\n      50% {\n        text-shadow: \n          0 2px 4px rgba(0, 0, 0, 0.3),\n          0 0 15px rgba(212, 175, 55, 1),\n          0 0 30px rgba(212, 175, 55, 0.7);\n      }\n    }\n\n    .version-date {\n      font-size: 0.8rem;\n      color: var(--text-secondary);\n      margin-top: 4px;\n    }\n\n    \/* \u7248\u672c\u5bf9\u6bd4\u6307\u793a\u5668 *\/\n    .version-indicator {\n      position: absolute;\n      left: 50%;\n      top: 50%;\n      transform: translate(-50%, -50%);\n      z-index: 5;\n      width: 32px;\n      height: 32px;\n      border-radius: 50%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n      color: white;\n    }\n\n    .version-indicator.update-needed {\n      background: var(--error-color);\n      box-shadow: 0 2px 8px rgba(234, 84, 85, 0.4);\n      animation: pulse-indicator 1.5s infinite;\n    }\n\n    .version-indicator.is-latest {\n      background: var(--success-color);\n      box-shadow: 0 2px 8px rgba(40, 199, 111, 0.4);\n    }\n\n    @keyframes pulse-indicator {\n      0% { transform: translate(-50%, -50%) scale(1); }\n      50% { transform: translate(-50%, -50%) scale(1.1); }\n      100% { transform: translate(-50%, -50%) scale(1); }\n    }\n\n    \/* \u5185\u5bb9\u533a *\/\n    .content-container {\n      padding: 16px;\n    }\n\n    \/* \u72b6\u6001\u63d0\u793a *\/\n    .status-alert {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      padding: 12px 16px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 10px;\n      font-weight: 500;\n      font-size: 14px;\n      animation: slideIn 0.5s ease 0.3s backwards;\n    }\n\n    .status-alert i {\n      font-size: 20px;\n    }\n\n    .status-alert.update-available {\n      background: linear-gradient(135deg, #ffeaa7 0%, #fdcb6e 100%);\n      color: #d63031;\n      box-shadow: 0 4px 15px rgba(253, 203, 110, 0.4);\n    }\n\n    .status-alert.up-to-date {\n      background: linear-gradient(135deg, #55efc4 0%, #00b894 100%);\n      color: white;\n      box-shadow: 0 4px 15px rgba(0, 184, 148, 0.4);\n    }\n\n    \/* \u66f4\u65b0\u5bb9\u5668 *\/\n    .update-container {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      animation: slideIn 0.5s ease 0.4s backwards;\n    }\n\n    .update-header {\n      background: var(--light-bg);\n      padding: 12px 16px;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      border-bottom: 1px solid var(--border-color);\n    }\n\n    .update-header h2 {\n      font-size: 1rem;\n      font-weight: 600;\n      color: var(--text-main);\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .update-header h2 i {\n      color: #4e6ef2;\n    }\n\n    .update-tag {\n      background: rgba(78, 110, 242, 0.1);\n      color: #4e6ef2;\n      padding: 4px 8px;\n      border-radius: 8px;\n      font-size: 0.75rem;\n      font-weight: 600;\n    }\n\n    .update-content {\n      padding: 16px;\n    }\n\n    .update-date {\n      font-weight: 600;\n      color: #4e6ef2;\n      margin-bottom: 12px;\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      padding: 8px 0;\n      border-bottom: 1px dashed #e0e0e0;\n    }\n\n    .update-text {\n      margin: 8px 0;\n      position: relative;\n      padding-left: 16px;\n      line-height: 1.5;\n      color: var(--text-main);\n      font-size: 0.95rem;\n      white-space: pre-wrap;\n      word-break: break-word;\n    }\n\n    .update-text::before {\n      content: '\u2022';\n      position: absolute;\n      left: 0;\n      font-weight: bold;\n      color: #4e6ef2;\n      font-size: 1.2rem;\n      line-height: 1;\n    }\n\n    \/* \u5386\u53f2\u65e5\u5fd7 *\/\n    .history-container {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      animation: slideIn 0.5s ease 0.5s backwards;\n    }\n\n    .history-header {\n      background: var(--light-bg);\n      padding: 12px 16px;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      border-bottom: 1px solid var(--border-color);\n      cursor: pointer;\n      user-select: none;\n    }\n\n    .history-header:hover {\n      opacity: 0.8;\n    }\n\n    .history-header h2 {\n      font-size: 1rem;\n      font-weight: 600;\n      color: var(--text-main);\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .history-header h2 i {\n      color: #4e6ef2;\n    }\n\n    .toggle-history {\n      background: none;\n      border: none;\n      color: var(--text-secondary);\n      cursor: pointer;\n      font-weight: 500;\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      font-size: 0.85rem;\n      transition: color 0.2s ease;\n    }\n\n    .toggle-history:hover {\n      color: #4e6ef2;\n    }\n\n    .history-content {\n      padding: 0 16px;\n      max-height: 0;\n      overflow: hidden;\n      transition: max-height 0.4s ease, padding 0.4s ease;\n    }\n\n    .history-content.expanded {\n      max-height: 60vh;\n      overflow-y: auto;\n      padding: 16px;\n      scrollbar-width: thin;\n      scrollbar-color: #4e6ef2 #f0f0f0;\n    }\n\n    .history-content.expanded::-webkit-scrollbar {\n      width: 6px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-track {\n      background: #f0f0f0;\n      border-radius: 4px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-thumb {\n      background: #4e6ef2;\n      border-radius: 4px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-thumb:hover {\n      background: #3a56d0;\n    }\n\n    .history-item {\n      margin-bottom: 16px;\n      padding-bottom: 16px;\n      border-bottom: 1px dashed var(--border-color);\n    }\n\n    .history-item:last-child {\n      border-bottom: none;\n      margin-bottom: 0;\n      padding-bottom: 0;\n    }\n\n    .history-date {\n      font-weight: 600;\n      color: var(--text-main);\n      margin-bottom: 8px;\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      font-size: 0.9rem;\n      background: rgba(78, 110, 242, 0.05);\n      padding: 6px 10px;\n      border-radius: 6px;\n    }\n\n    .history-text {\n      margin: 8px 0;\n      padding-left: 16px;\n      line-height: 1.4;\n      color: var(--text-secondary);\n      position: relative;\n      font-size: 0.9rem;\n      white-space: pre-wrap;\n      word-break: break-word;\n    }\n\n    .history-text::before {\n      content: '\u2022';\n      position: absolute;\n      left: 0;\n      color: #4e6ef2;\n      font-weight: bold;\n      font-size: 1.2rem;\n      line-height: 1;\n    }\n\n    \/* \u6309\u94ae\u7ec4 *\/\n    .button-group {\n      display: flex;\n      flex-direction: column;\n      gap: 10px;\n      margin-bottom: 16px;\n    }\n\n    .button {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 10px;\n      padding: 14px 28px;\n      text-align: center;\n      font-size: 1rem;\n      border: none;\n      border-radius: 12px;\n      text-decoration: none;\n      background: var(--primary-gradient);\n      color: white;\n      font-weight: 600;\n      transition: all 0.3s ease;\n      box-shadow: var(--shadow);\n      position: relative;\n      overflow: hidden;\n      cursor: pointer;\n    }\n\n    .button i {\n      font-size: 1rem;\n    }\n\n    .button::after {\n      content: '';\n      position: absolute;\n      top: -50%;\n      left: -50%;\n      width: 200%;\n      height: 200%;\n      background: rgba(255, 255, 255, 0.1);\n      transform: rotate(30deg);\n      transition: all 0.6s ease;\n      pointer-events: none;\n    }\n\n    .button:hover {\n      transform: translateY(-3px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .button:hover::after {\n      transform: rotate(30deg) translate(20%, 20%);\n    }\n\n    .button:active {\n      transform: scale(0.95);\n    }\n\n    \/* \u9519\u8bef\u72b6\u6001 *\/\n    .error-state {\n      text-align: center;\n      padding: 40px 20px;\n      color: var(--text-main);\n    }\n\n    .error-icon {\n      font-size: 64px;\n      margin-bottom: 20px;\n      color: var(--error-color);\n    }\n\n    .error-text {\n      font-size: 16px;\n      line-height: 1.6;\n      margin-bottom: 20px;\n    }\n\n    .retry-button {\n      background: var(--primary-gradient);\n      color: white;\n      padding: 12px 30px;\n      border-radius: 12px;\n      border: none;\n      font-weight: 600;\n      cursor: pointer;\n      transition: all 0.3s ease;\n      font-size: 14px;\n      box-shadow: var(--shadow);\n    }\n\n    .retry-button:hover {\n      transform: translateY(-2px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .retry-button:active {\n      transform: scale(0.95);\n    }\n\n    \/* \u88c5\u9970\u5143\u7d20 *\/\n    .decoration {\n      position: absolute;\n      z-index: 0;\n      pointer-events: none;\n    }\n\n    .decoration.circle {\n      width: 120px;\n      height: 120px;\n      border-radius: 50%;\n      background: rgba(107, 45, 216, 0.05);\n      top: 10%;\n      left: 10%;\n    }\n\n    .decoration.square {\n      width: 80px;\n      height: 80px;\n      transform: rotate(45deg);\n      background: rgba(78, 110, 242, 0.05);\n      bottom: 10%;\n      right: 10%;\n    }\n\n    \/* \u54cd\u5e94\u5f0f *\/\n    @media (max-width: 768px) {\n      body {\n        padding: 12px;\n      }\n\n      .container {\n        max-width: 100%;\n        border-radius: 20px;\n      }\n\n      .header {\n        padding: 20px 15px;\n      }\n\n      .header h1 {\n        font-size: 1.3rem;\n      }\n\n      .header-icon {\n        font-size: 40px;\n      }\n\n      .version-comparison {\n        flex-direction: row;\n        flex-wrap: nowrap;\n        gap: 10px;\n        padding: 12px;\n        margin-top: 6px;\n        overflow-x: auto;\n      }\n\n      .version-card {\n        min-width: 45%;\n        padding: 26px 12px 12px;\n      }\n\n      \/* \u79fb\u52a8\u7aef\u51cf\u5f31\u547c\u5438\u52a8\u6548 *\/\n      .version-card.latest-version {\n        animation: gradientAnimation 6s ease infinite;\n      }\n\n      .version-status {\n        top: 5px;\n        right: 5px;\n        padding: 2px 5px;\n        font-size: 0.6rem;\n      }\n\n      .version-number {\n        font-size: 1.1rem;\n      }\n\n      .version-card.latest-version .version-number {\n        font-size: 1.2rem;\n      }\n\n      .update-header h2, .history-header h2 {\n        font-size: 0.9rem;\n      }\n\n      .button {\n        padding: 12px 24px;\n        font-size: 0.95rem;\n      }\n\n      .history-content.expanded {\n        max-height: 50vh;\n        -webkit-overflow-scrolling: touch;\n      }\n    }\n\n    @media (max-width: 380px) {\n      .header h1 {\n        font-size: 1.2rem;\n      }\n\n      .version-number {\n        font-size: 1rem;\n      }\n\n      .version-card.latest-version .version-number {\n        font-size: 1.1rem;\n      }\n\n      .button {\n        padding: 11px;\n        font-size: 0.9rem;\n      }\n    }\n  <\/style>\n<\/head>\n<body>\n  <div class=\"decoration circle\"><\/div>\n  <div class=\"decoration square\"><\/div>\n\n  <div id=\"loading\" class=\"loading-wrapper\">\n    <div class=\"loading-spinner\"><\/div>\n    <div class=\"loading-text\"><i class=\"fas fa-search\"><\/i> \u6b63\u5728\u68c0\u67e5\u66f4\u65b0...<\/div>\n  <\/div>\n\n  <div class=\"container\" id=\"container\">\n    <div class=\"header\">\n      <div class=\"header-icon\"><i class=\"fas fa-book\"><\/i><\/div>\n      <h1>\u6674\u5929\u4e66\u6e90\u66f4\u65b0<\/h1>\n      <p>\u63a8\u8350\u4f7f\u7528\u9605\u8bfb\u6d4b\u8bd5\u7248<br>\u6b63\u5f0f\u7248\u53ef\u80fd\u5b58\u5728\u517c\u5bb9\u6027\u95ee\u9898<\/p>\n    <\/div>\n\n    <div class=\"version-comparison\">\n      <div class=\"version-card current-version\">\n        <div class=\"version-status status-outdated\" id=\"currentStatus\">\u5f85\u68c0\u67e5<\/div>\n        <h3><i class=\"fas fa-cube\"><\/i> \u5f53\u524d\u7248\u672c<\/h3>\n        <div class=\"version-number\" id=\"currentVersion\">-<\/div>\n        <div class=\"version-date\">\u60a8\u7684\u5f53\u524d\u7248\u672c<\/div>\n      <\/div>\n\n      <div class=\"version-indicator update-needed\" id=\"versionIndicator\" style=\"display: none;\">\n        <i class=\"fas fa-arrow-right\"><\/i>\n      <\/div>\n\n      <div class=\"version-card latest-version\">\n        <div class=\"version-status status-latest\" id=\"latestStatus\">\u6700\u65b0\u7248\u672c<\/div>\n        <h3><i class=\"fas fa-star\"><\/i> \u6700\u65b0\u7248\u672c<\/h3>\n        <div class=\"version-number\" id=\"latestVersion\">-<\/div>\n        <div class=\"version-date\">\u53ef\u7528\u6700\u65b0\u7248\u672c<\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"content-container\">\n      <div class=\"status-alert\" id=\"statusAlert\" style=\"display: none;\"><\/div>\n\n      <div id=\"latestLogContainer\" style=\"display: none;\">\n        <div class=\"update-container\">\n          <div class=\"update-header\">\n            <h2><i class=\"fas fa-bolt\"><\/i> \u6700\u65b0\u66f4\u65b0<\/h2>\n            <div class=\"update-tag\">\u6700\u65b0\u53d1\u5e03<\/div>\n          <\/div>\n          <div class=\"update-content\">\n            <div class=\"update-date\" id=\"latestLogDate\"><\/div>\n            <div class=\"update-text\" id=\"latestLogContent\"><\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"button-group\" id=\"buttonGroup\" style=\"display: none;\"><\/div>\n\n      <div class=\"history-container\" id=\"logs\" style=\"display: none;\">\n        <div class=\"history-header\" onclick=\"toggleLogs()\">\n          <h2><i class=\"fas fa-history\"><\/i> \u5386\u53f2\u66f4\u65b0 <span id=\"historyCount\"><\/span><\/h2>\n          <button class=\"toggle-history\" id=\"toggleButton\">\n            <span id=\"toggleText\">\u5c55\u5f00\u5386\u53f2<\/span>\n            <i class=\"fas fa-chevron-down\" id=\"toggleIcon\"><\/i>\n          <\/button>\n        <\/div>\n        <div class=\"history-content\" id=\"logList\"><\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <script>\n  let logsCollapsed = true;\n\n  function toggleLogs() {\n    logsCollapsed = !logsCollapsed;\n    const logList = document.getElementById('logList');\n    const toggleText = document.getElementById('toggleText');\n    const toggleIcon = document.getElementById('toggleIcon');\n    \n    if (logsCollapsed) {\n      logList.classList.remove('expanded');\n      toggleText.textContent = '\u5c55\u5f00\u5386\u53f2';\n      toggleIcon.className = 'fas fa-chevron-down';\n    } else {\n      logList.classList.add('expanded');\n      toggleText.textContent = '\u6536\u8d77\u5386\u53f2';\n      toggleIcon.className = 'fas fa-chevron-up';\n    }\n  }\n\n  (async function() {\n    const loading = document.getElementById('loading');\n    const container = document.getElementById('container');\n    const currentVersion = document.getElementById('currentVersion');\n    const latestVersion = document.getElementById('latestVersion');\n    const currentStatus = document.getElementById('currentStatus');\n    const latestStatus = document.getElementById('latestStatus');\n    const versionIndicator = document.getElementById('versionIndicator');\n    const statusAlert = document.getElementById('statusAlert');\n    const buttonGroup = document.getElementById('buttonGroup');\n    const latestLogContainer = document.getElementById('latestLogContainer');\n    const latestLogDate = document.getElementById('latestLogDate');\n    const latestLogContent = document.getElementById('latestLogContent');\n    const logsContainer = document.getElementById('logs');\n    const logList = document.getElementById('logList');\n    const historyCount = document.getElementById('historyCount');\n\n    const localVer = '${String(localVersion)}';\n\n    \/\/ \u7edf\u4e00\u7684\u670d\u52a1\u5668\u914d\u7f6e - \u65b9\u4fbf\u7ef4\u62a4\n    const serverConfig = {\n      main: {\n        name: '\u4e3b\u7ebf\u8def',\n        icon: 'rocket',\n        baseUrl: 'https:\/\/sy.gyks.cf',\n        downloadPath: '\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E6%99%B4%E5%A4%A9%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup1: {\n        name: '\u5907\u7528\u7ebf\u8def1',\n        icon: 'box',\n        baseUrl: 'http:\/\/v1.gyks.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E6%99%B4%E5%A4%A9%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup2: {\n        name: '\u5907\u7528\u7ebf\u8def2',\n        icon: 'satellite',\n        baseUrl: 'http:\/\/v2.gyks.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E6%99%B4%E5%A4%A9%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup3: {\n        name: '\u5907\u7528\u7ebf\u8def3',\n        icon: 'link',\n        baseUrl: 'http:\/\/v3.gyks.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E6%99%B4%E5%A4%A9%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup4: {\n        name: '\u5907\u7528\u7ebf\u8def4',\n        icon: 'bolt',\n        baseUrl: 'http:\/\/v4.gyks.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E6%99%B4%E5%A4%A9%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup5: {\n        name: '\u5907\u7528\u7ebf\u8def5',\n        icon: 'globe',\n        baseUrl: 'http:\/\/v5.gyks.cf',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E6%99%B4%E5%A4%A9%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup6: {\n        name: '\u5907\u7528\u7ebf\u8def6',\n        icon: 'broadcast-tower',\n        baseUrl: 'http:\/\/101.35.133.34:8888',\n        downloadPath: '\/sy\/download\/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E6%99%B4%E5%A4%A9%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      }\n    };\n\n    \/\/ \u7248\u672c\u6bd4\u8f83\u51fd\u6570\n    function compareVersions(vs) {\n      const normalize = (v) => {\n        return v.split('.').map(n => {\n          const num = parseInt(n, 10);\n          return isNaN(num) ? 0 : num;\n        });\n      };\n\n      const parts1 = normalize(localVer);\n      const parts2 = normalize(vs);\n      const maxLength = Math.max(parts1.length, parts2.length);\n      \n      for (let i = 0; i < maxLength; i++) {\n        const num1 = parts1[i] || 0;\n        const num2 = parts2[i] || 0;\n        if (num1 > num2) return 1;\n        if (num1 < num2) return -1;\n      }\n      return 0;\n    }\n\n    async function fetchVersionData() {\n      \/\/ \u4f7f\u7528\u7edf\u4e00\u914d\u7f6e\u4e2d\u9664\u4e3b\u7ebf\u8def\u5916\u7684\u5907\u7528\u7ebf\u8def\u8fdb\u884c\u7248\u672c\u68c0\u67e5\n      const serversToCheck = Object.values(serverConfig).filter(s => s.baseUrl.includes('gyks.cf') || s.baseUrl.includes('101.35'));\n      \n      for (const server of serversToCheck) {\n        try {\n          const response = await fetch(server.baseUrl + '\/version', { timeout: 2000 });\n          if (response.ok) {\n            return await response.json();\n          }\n        } catch (e) {\n          console.warn(\\`\u63a5\u53e3\u5931\u8d25\uff1a\\${server.baseUrl}\\`, e);\n        }\n      }\n      throw new Error('\u6240\u6709\u66f4\u65b0\u63a5\u53e3\u90fd\u8bf7\u6c42\u5931\u8d25');\n    }\n\n    function showError(message) {\n      loading.innerHTML = \\`\n        <div class=\"error-state\">\n          <div class=\"error-icon\"><i class=\"fas fa-exclamation-triangle\"><\/i><\/div>\n          <div class=\"error-text\">\\${message}<\/div>\n          <button class=\"retry-button\" onclick=\"location.reload()\"><i class=\"fas fa-redo\"><\/i> \u91cd\u8bd5<\/button>\n        <\/div>\n      \\`;\n    }\n\n    try {\n      const data = await fetchVersionData();\n      const cloudVersion = String(data.version3);\n      const updateLog = data.update_log || {};\n\n      \/\/ \u663e\u793a\u7248\u672c\u4fe1\u606f\n      currentVersion.textContent = \\`v\\${localVer}\\`;\n      latestVersion.textContent = \\`v\\${cloudVersion}\\`;\n\n      \/\/ \u5904\u7406\u65e5\u5fd7\n      const logEntries = Object.entries(updateLog);\n      if (logEntries.length > 0) {\n        \/\/ \u663e\u793a\u6700\u65b0\u65e5\u5fd7\n        const [latestDate, latestContent] = logEntries[0];\n        latestLogDate.innerHTML = \\`<i class=\"fas fa-calendar-alt\"><\/i> \\${latestDate}\\`;\n        latestLogContent.textContent = latestContent;\n        latestLogContainer.style.display = 'block';\n\n        \/\/ \u663e\u793a\u5386\u53f2\u65e5\u5fd7\n        if (logEntries.length > 1) {\n          const historyLogs = logEntries.slice(1);\n          historyCount.textContent = \\`(\\${historyLogs.length}\u6761)\\`;\n          logList.innerHTML = historyLogs.map(([date, content]) => \\`\n            <div class=\"history-item\">\n              <div class=\"history-date\">\n                <i class=\"fas fa-calendar-day\"><\/i>\n                <span>\\${date}<\/span>\n              <\/div>\n              <div class=\"history-text\">\\${content}<\/div>\n            <\/div>\n          \\`).join('');\n          logsContainer.style.display = 'block';\n        }\n      }\n\n      \/\/ \u68c0\u67e5\u66f4\u65b0\u72b6\u6001\n      const compareResult = compareVersions(cloudVersion);\n      \n      \/\/ \u663e\u793a\u7248\u672c\u6307\u793a\u5668\n      versionIndicator.style.display = 'flex';\n      \n      if (compareResult === -1) {\n        \/\/ \u9700\u8981\u66f4\u65b0\n        currentStatus.textContent = '\u5f85\u66f4\u65b0';\n        currentStatus.className = 'version-status status-outdated';\n        versionIndicator.className = 'version-indicator update-needed';\n        versionIndicator.innerHTML = '<i class=\"fas fa-arrow-right\"><\/i>';\n\n        \/\/ \u4f7f\u7528\u7edf\u4e00\u914d\u7f6e\u751f\u6210\u4e0b\u8f7d\u6309\u94ae\n        buttonGroup.innerHTML = Object.values(serverConfig).map(server => {\n          const fullUrl = server.baseUrl + server.downloadPath;\n          return \\`\n            <a href=\"yuedu:\/\/booksource\/importonline?src=\\${encodeURIComponent(fullUrl)}\" class=\"button\">\n              <i class=\"fas fa-\\${server.icon}\"><\/i>\n              <span>\\${server.name}<\/span>\n            <\/a>\n          \\`;\n        }).join('');\n        buttonGroup.style.display = 'flex';\n      } else {\n        \/\/ \u5df2\u662f\u6700\u65b0\u7248\u672c\n        currentStatus.textContent = '\u6700\u65b0';\n        currentStatus.className = 'version-status status-latest';\n        versionIndicator.className = 'version-indicator is-latest';\n        versionIndicator.innerHTML = '<i class=\"fas fa-check\"><\/i>';\n        \n        statusAlert.className = 'status-alert up-to-date';\n        statusAlert.innerHTML = '<i class=\"fas fa-check-circle\"><\/i> <div>\u60a8\u5df2\u662f\u6700\u65b0\u7248\u672c<\/div>';\n        statusAlert.style.display = 'flex';\n      }\n\n      \/\/ \u663e\u793a\u4e3b\u5bb9\u5668\uff0c\u9690\u85cf\u52a0\u8f7d\n      loading.style.display = 'none';\n      container.style.display = 'block';\n\n    } catch (err) {\n      console.error('\u7248\u672c\u68c0\u67e5\u5931\u8d25\uff1a', err);\n      showError('<i class=\"fas fa-exclamation-circle\"><\/i> \u68c0\u67e5\u66f4\u65b0\u5931\u8d25\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5<br><small>' + err.message + '<\/small>');\n    }\n  })();\n  <\/script>\n<\/body>\n<\/html>\n`;\n    java.startBrowser(`data:text\/html;base64,${java.base64Encode(html)}`, '\u6674\u5929\u4e66\u6e90\u66f4\u65b0');\n}","searchUrl":"<js>\nlet base_url = getArguments(source.getVariable(), 'server');\nlet media;\nlet sources = getArguments(source.getVariable(), 'sources') || getArguments(source.getVariable(), 'source');\nlet disabled_sources = getArguments(source.getVariable(), 'disabled_sources') || '0';\nif (String(key).startsWith(\"m:\") || String(key).startsWith(\"m\uff1a\")) {\n    media = \"\u6f2b\u753b\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"t:\") || String(key).startsWith(\"t\uff1a\")) {\n    media = \"\u542c\u4e66\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"d:\") || String(key).startsWith(\"d\uff1a\")) {\n    media = \"\u77ed\u5267\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"x:\") || String(key).startsWith(\"x\uff1a\")) {\n    media = \"\u5c0f\u8bf4\"\n    key = key.slice(2)\n} else {\n    media = getArguments(source.getVariable(), 'tab') || getArguments(source.getVariable(), 'media');\n}\nif (key.includes('@')) {\n    var parts = key.split('@');\n    key = parts[0];\n    sources = parts[1] || sources;\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet op = {\n    method: \"GET\",\n    headers: {\n        cookie: qtcookie\n    },\n};\nop = JSON.stringify(op);\n`${base_url}\/search?title=${key}&tab=${media}&source=${sources}&page={{page}}&disabled_sources=${disabled_sources},${op}`\n<\/js>","ruleToc":{"chapterUrl":"<js>\nlet tab = result.tab;\nlet sources = result.source;\nlet title = result.title;\nlet item_id = result.item_id;\nlet book_id = java.get(\"book_id\");\nlet url = result.toc_url || \"\";\nlet qtcontent = {\n    book_id: book_id,\n    item_id: item_id,\n    title: title,\n    sources: sources,\n    tab: tab,\n    url: url,\n};\nqtcontent = java.base64Encode(JSON.stringify(qtcontent));\nif (sources == '\u5377') {\n    content_url = item_id\n} else if ((sources == \"\u756a\u8304\" || sources == \"\u4e03\u732b\" || sources == \"\u5854\u8bfb\") && tab == \"\u5c0f\u8bf4\") {\n    var base_url = getArguments(source.getVariable(), \"server\") || \"\";\n    var sdtoken;\n    try {\n        var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n        sdtoken = String(loginInfoMap['\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)'] || '');\n    } catch (e) {\n        sdtoken = '';\n    }\n    var rawCookie = getFanqieCookie() || sdtoken;\n    var match = rawCookie.match(\/sessionid=[^;]+\/);\n    var fqcookie = match ? match[0] : '';\n    var fqssionid = '';\n    if (!fqcookie) {} else {\n        fqssionid = getSessionId(fqcookie)\n    }\n    let sourcess = sources.replace('svip_', '');\n    content_url = `data:;base64,${qtcontent},{\"type\":\"qingtian3\",\"js\":\"book ? result : '${base_url}\/get_review?book_id=${book_id}&item_id=${item_id}&ssionid=${fqssionid}&source=${sourcess}'\"}`;\n} else {\n    content_url = `data:;base64,${qtcontent},{\"type\":\"qingtian3\"}`;\n}\n<\/js>","chapterName":"$.title","chapterList":"<js>\nlet res = JSON.parse(java.hexDecodeToString(result));\nif (res.method) {\n    res = Object.fromEntries(\n        res.body\n        .replace(\"source\", \"sources\")\n        .split(\"&\")\n        .map((query) => query.split(\"=\"))\n    );\n    res.url = \"\";\n}\nlet book_id = res.book_id;\njava.put('book_id', book_id);\nlet tab = res.tab;\nlet sources = res.sources;\nlet url = res.url;\nlet html = \"\";\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (url != \"\" && proxy == \"\u672c\u5730\") {\n    if (sources == '69\u4e66\u5427') {\n        let ck69 = String(cookie.getCookie('https:\/\/www.69shuba.com'));\n        let headers = {\n        \t \"Referer\": url,\n            \"Cookie\": ck69,\n            \"User-Agent\":  java.getWebViewUA()\n             };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        html = java.ajax(`${url},${op}`);    \n    } else {\n        html = java.ajax(url);\n    }\n    \/\/java.log(html);\n    if (html.includes(\"Just a moment...\") && sources == '69\u4e66\u5427') {\n        cookie.removeCookie('https:\/\/www.69shuba.com');\n        java.longToast('\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1');\n        html = java.startBrowserAwait(url, \"\u9700\u8981\u771f\u4eba\u9a8c\u8bc1\uff0c\u8bf7\u8fdb\u5165\u4efb\u610f\u4e66\u7c4d\u8be6\u60c5\u9875\u8fc7\u9a8c\u8bc1\").body();\n\n           java.log(html);\n    }\n};\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet op = {\n    method: \"POST\",\n    body: {\n        html: html\n    }\n};\nop = JSON.stringify(op);\nlet varia = String(book.getVariable('custom'));\nif (varia == 'null') {\n    varia = '';\n}\nvaria = JSON.stringify({\n    'custom': varia\n});\n\/\/ varia = java.base64Encode(varia);\n\/\/java.log(`${base_url}\/catalog?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\nlet data = java.ajax(\n    `${base_url}\/catalog?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`\n);\nlet device, device_type;\ntry {\n    device = java.deviceID();\n    device_type = \"\u82f9\u679c\";\n} catch (e) {\n    try {\n        device = java.androidId();\n        device_type = \"\u5b89\u5353\";\n    } catch (e) {\n        device = \"\";\n        device_type = \"\u5b89\u5353\";\n    }\n}\n\nif (tab == \"\u5c0f\u8bf4\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 8;\n    } else {\n        book.type = 0;\n    }\n} else if (tab == \"\u542c\u4e66\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 32;\n    } else {\n        book.type = 1;\n    }\n} else if (tab == \"\u6f2b\u753b\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 64;\n    } else {\n        book.type = 2;\n    }\n} else if (tab == \"\u77ed\u5267\") {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 8;\n    } else {\n        book.type = 3;\n    }\n} else {\n    if (device_type == \"\u5b89\u5353\") {\n        book.type = 8;\n    } else {\n        book.type = 0;\n    }\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet reading = getArguments(source.getVariable(), \"reading\");\n\nif (book && book.order != 0 && reading == '1') {\n    try {\n        if (!data || !book.variable || !base_url || !qtcookie) {\n            java.log('\u7f3a\u5c11\u5fc5\u8981\u53c2\u6570');\n        } else {\n            let parsedData;\n            try {\n                parsedData = JSON.parse(data);\n            } catch (e) {\n                java.log('\u89e3\u6790data\u6570\u636e\u5931\u8d25:' + e);\n            }\n            \n            if (parsedData && parsedData.data && Array.isArray(parsedData.data) && parsedData.data[book.durChapterIndex]) {\n                let ritem = parsedData.data[book.durChapterIndex];\n                let bookInfoObj;\n                try {\n                    bookInfoObj = JSON.parse(book.variable);\n                } catch (e) {\n                    java.log('\u89e3\u6790book.variable\u5931\u8d25:' + e);\n                }\n                \n                if (bookInfoObj) {\n                    let book_info;\n                    try {\n                        book_info = JSON.parse(bookInfoObj.book_detail || JSON.stringify(bookInfoObj));\n                    } catch (e) {\n                        java.log('\u89e3\u6790book_detail\u5931\u8d25:' + e);\n                    }\n                    \n                    if (book_info && typeof book_info === 'object') {\n                        let rurl = base_url + '\/add_book_to_book_shelf,';\n                        book_info['read_status'] = 1;\n                        book_info['last_chapter_item_id'] = ritem.item_id || '';\n                        book_info['last_chapter_title'] = ritem.title || '';\n                        let rop = {\n                            method: \"POST\",\n                            headers: {\n                                cookie: qtcookie\n                            },\n                            body: book_info\n                        };\n                        let check_book_url = base_url + '\/check_book_in_book_shelf,';\n                        let checkResponse;\n                        \n                        try {\n                            checkResponse = java.ajax(check_book_url + JSON.stringify(rop));\n                        } catch (e) {\n                            java.log('\u68c0\u67e5\u4e66\u7c4d\u8bf7\u6c42\u5931\u8d25:' + e);\n                        }\n                        \n                        if (checkResponse) {\n                            let check_data;\n                            try {\n                                check_data = JSON.parse(checkResponse).data;\n                            } catch (e) {\n                                java.log('\u89e3\u6790\u68c0\u67e5\u54cd\u5e94\u5931\u8d25:' + e);\n                            }\n                            try {\n                                if (check_data && check_data.id) {\n                                    book_info['id'] = check_data.id;\n                                    let uurl = base_url + '\/update_book_shelf,';\n                                    java.ajax(uurl + JSON.stringify(rop));\n                                } else {\n                                    java.ajax(rurl + JSON.stringify(rop));\n                                }\n                            } catch (e) {\n                                java.log('\u4e66\u67b6\u64cd\u4f5c\u5931\u8d25:' + e);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    } catch (error) {\n        java.log('\u4e66\u7c4d\u540c\u6b65\u6d41\u7a0b\u5f02\u5e38:' + error);\n        java.longToast('\\n\u540c\u6b65\u9605\u8bfb\u8fdb\u5ea6\u5931\u8d25\uff0c\u4f46\u4e0d\u5f71\u54cd\u9605\u8bfb\uff0c\u53ef\u4ee5\u524d\u5f80\u767b\u5f55\u5173\u95ed\u4e66\u67b6\u540c\u6b65\u529f\u80fd\u3002');\n    }\n}\ndata;\n<\/js>$.data","updateTime":"$.first_pass_time"},"loginUi":"[{\n        \"name\": \"\u90ae\u7bb1\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u5bc6\u7801\",\n        \"type\": \"password\"\n    }, {\n        \"name\": \"\u2665\u767b\u5f55\u4e66\u6e90\",\n        \"type\": \"button\",\n        \"action\": \"login(true)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udd10\u6ce8\u518c\u4e66\u6e90\",\n        \"type\": \"button\",\n        \"action\": \"register()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\u2699\ufe0f\u4e66\u6e90\u8bbe\u7f6e\",\n        \"type\": \"button\",\n        \"action\": \"control()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"\u26d4\ufe0f\u6e05\u7a7a\u8bbe\u7f6e\",\n        \"type\": \"button\",\n        \"action\": \"reCookieSettings()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2728\u5e94\u7528\u8bbe\u7f6e\",\n        \"type\": \"button\",\n        \"action\": \"applyCookieSettings()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \" \ud83d\udd1a \u9000\u51fa\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"logout()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83c\udfdd\u7528\u6237\u540e\u53f0\",\n        \"type\": \"button\",\n        \"action\": \"loginqt()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \" \ud83d\uddd1 \u6e05\u9664\u8bbe\u5907\",\n        \"type\": \"button\",\n        \"action\": \"clearDevice()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83d\udd2e \u68c0\u6d4b\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"checkStatus()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2615\u6253\u8d4f\u4eab\u798f\u5229\",\n        \"type\": \"button\",\n        \"action\": \"vip()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2747\ufe0f \u66f4\u65b0\u4e66\u6e90\",\n        \"type\": \"button\",\n        \"action\": \"renderVersionPage()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"==\u4e0b\u65b9\u914d\u7f6e\u4e3a\u4e66\u6e90\u8bbe\u7f6e\u9875\u9762\u65e0\u6cd5\u6253\u5f00\u65f6\u4f7f\u7528==\",\n        \"type\": \"button\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"\ud83d\udcd1\u66f4\u5c11\u7b80\u4ecb\",\n        \"type\": \"button\",\n        \"action\": \"set_info()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udcdd\u6bb5\u8bc4\u5f00\u5173\",\n        \"type\": \"button\",\n        \"action\": \"paracomment('fqpara')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udcda \u540c\u6b65\u4e66\u67b6\",\n        \"type\": \"button\",\n        \"action\": \"set_reading()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u264b\ufe0f \u7537\/\u5973\u9891\u9053\",\n        \"type\": \"button\",\n        \"action\": \"set_source_type()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udca2 \u5f3a\u5236\u641c\u7d22\u5168\u90e8\",\n        \"type\": \"button\",\n        \"action\": \"disabledSources()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83c\udf45\u756a\u8304\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"fq_login()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u27bf\ufe0f \u56fe\u7247\u663e\u793a\",\n        \"type\": \"button\",\n        \"action\": \"closeImg()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\uddc2\u5f53\u524d\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"get_media()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"\ud83d\udcd6\u5c0f\u8bf4\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u5c0f\u8bf4')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udd0a\u542c\u4e66\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u542c\u4e66')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83c\udfde\u6f2b\u753b\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u6f2b\u753b')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\uddb2\u77ed\u5267\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"set_media('\u77ed\u5267')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83c\udf9a\u5207\u6362\u670d\u52a1\u5668\",\n        \"type\": \"button\",\n        \"action\": \"set_server()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u267b\ufe0f\u68c0\u6d4b\u5f53\u524d\u670d\u52a1\u5668\",\n        \"type\": \"button\",\n        \"action\": \"checkNet()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2695\ufe0f\u672c\u5730\/\u670d\u52a1\u5668 \",\n        \"type\": \"button\",\n        \"action\": \"get_proxy()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udccc\u6c38\u4e45\u53d1\u5e03\u9875\ud83d\udccc\",\n        \"type\": \"button\",\n        \"action\": \"api()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u2193\u2193\u4e0b\u65b9\u53ef\u5207\u6362\u6765\u6e90\u7528\u4e8e\u641c\u7d22\/\u53d1\u73b0\u9875\u2193\u2193\",\n        \"type\": \"button\",\n        \"action\": \"get_media()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"\ud83d\udce4\u6211\u6765\u4e0a\u4f20\",\n        \"type\": \"button\",\n        \"action\": \"put_sk()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\ud83d\udc96\u6211\u6765\u63a8\u8350\",\n        \"type\": \"button\",\n        \"action\": \"put_book()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u5168\u90e8\",\n        \"type\": \"button\",\n        \"action\": \"set_source('\u5168\u90e8')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u756a\u8304')\",\n        'name': '\u756a\u8304',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('69\u4e66\u5427')\",\n        'name': '69\u4e66\u5427',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u4e03\u732b')\",\n        'name': '\u4e03\u732b',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u767e\u5ea6')\",\n        'name': '\u767e\u5ea6',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u8d77\u70b9')\",\n        'name': '\u8d77\u70b9(\u7b2c\u4e09\u65b9)',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5f97\u95f4')\",\n        'name': '\u5f97\u95f4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5854\u8bfb')\",\n        'name': '\u5854\u8bfb',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u4e66\u65d7')\",\n        'name': '\u4e66\u65d7',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('QQ')\",\n        'name': 'QQ',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u732b\u773c')\",\n        'name': '\u732b\u773c',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u641c\u4e66\u795e\u5668')\",\n        'name': '\u641c\u4e66\u795e\u5668',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5f97\u5947')\",\n        'name': '\u5f97\u5947',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u4f2a69')\",\n        'name': '\u4f2a69',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u7231\u4e0b\u7535\u5b50\u4e66')\",\n        'name': '\u7231\u4e0b\u7535\u5b50\u4e66',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5c0f\u7c73')\",\n        'name': '\u5c0f\u7c73',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u661f\u661f\u5c0f\u8bf4')\",\n        'name': '\u661f\u661f\u5c0f\u8bf4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u7b14\u8da3\u960122')\",\n        'name': '\u7b14\u8da3\u960122',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u9876\u70b9')\",\n        'name': '\u9876\u70b9',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5e7b\u68a6\u8f7b\u5c0f\u8bf4')\",\n        'name': '\u5e7b\u68a6\u8f7b\u5c0f\u8bf4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u6c5f\u6e56')\",\n        'name': '\u6c5f\u6e56',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u6b6a\u745e\u53e4\u5fb7')\",\n        'name': '\u6b6a\u745e\u53e4\u5fb7\u6f2b\u753b',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u6cb3\u9a6c')\",\n        'name': '\u6cb3\u9a6c\u77ed\u5267',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u77e5\u4e4e')\",\n        'name': '\u77e5\u4e4e',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('vip')\",\n        'name': '\u4e0b\u65b9\u4e3aVIP\u4e13\u5c5e\u4e66\u6e90(\u70b9\u51fb\u6b64\u5904\u641c\u6240\u6709vip)',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        'action': \"set_source('\u559c\u9a6c\u62c9\u96c5')\",\n        'name': '\u559c\u9a6c\u62c9\u96c5',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('svip')\",\n        'name': '\u4e0b\u65b9\u4e3aSVIP\u4e13\u5c5e\u4e66\u6e90(\u70b9\u51fb\u6b64\u5904\u641c\u6240\u6709svip)',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        'action': \"set_source('\u8d85\u4f1a\u4e13\u5c5e\u77ed\u5267')\",\n        'name': '\u8d85\u4f1a\u4e13\u5c5e\u77ed\u5267',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u8d85\u4f1a\u4e13\u5c5e\u5c0f\u8bf4')\",\n        'name': '\u8d85\u4f1a\u4e13\u5c5e\u5c0f\u8bf4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u9177\u6211')\",\n        'name': '\u9177\u6211\u542c\u4e66',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u756a\u85af\u5c0f\u8bf4')\",\n        'name': '\u756a\u85af\u5c0f\u8bf4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('QQ\u9605\u8bfb')\",\n        'name': 'QQ(\u4f1a\u5458\u4e66\u7c4d\u514d\u8d39)',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u9605\u53cb\u5c0f\u8bf4')\",\n        'name': '\u9605\u53cb\u5c0f\u8bf4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u597d\u770b\u6f2b\u753b')\",\n        'name': '\u597d\u770b\u6f2b\u753b',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u5168\u672c\u5c0f\u8bf4')\",\n        'name': '\u5168\u672c\u5c0f\u8bf4',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u795e\u4e66\u7f51')\",\n        'name': '\u795e\u4e66\u7f51',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u8bfb\u5168\u672c')\",\n        'name': '\u8bfb\u5168\u672c',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u516b\u4e00\u4e2d\u6587\u7f51')\",\n        'name': '\u516b\u4e00\u4e2d\u6587\u7f51',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u658b\u4e66\u82d1')\",\n        'name': '\u658b\u4e66\u82d1',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('101\u770b\u4e66')\",\n        'name': '101\u770b\u4e66',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u4e07\u76f8\u4e66\u57ce')\",\n        'name': '\u4e07\u76f8\u4e66\u57ce',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u8f7b\u5c0f\u8bf4\u6587\u5e93')\",\n        'name': '\u8f7b\u5c0f\u8bf4\u6587\u5e93',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u8f7b\u4e4b\u6587\u5e93')\",\n        'name': '\u8f7b\u4e4b\u6587\u5e93',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u4e2d\u534e\u5178\u85cf')\",\n        'name': '\u4e2d\u534e\u5178\u85cf',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('\u6bd2\u820c\u5f71\u89c6')\",\n        'name': '\u6bd2\u820c\u5f71\u89c6',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"\u81ea\u5b9a\u4e49\u641c\u7d22\u6e90(\u591a\u4e2a\u7528\u82f1\u6587,\u5206\u5272)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u81ea\u5b9a\u4e49\u670d\u52a1\u5668(\u53ef\u4e0d\u586b)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u81ea\u5b9a\u4e49\u8bc4\u8bba\u989c\u8272(\u53ef\u4e0d\u586b)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u6bb5\u8bc4\u6c14\u6ce1\u6837\u5f0f(0-4)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"\u624b\u52a8\u586b\u5199\u756a\u8304token(\u53ef\u4e0d\u586b)\",\n        \"type\": \"text\"\n    }\n]"},{"ruleExplore":{"author":"tag.span.0@text","bookList":".category-div","lastChapter":"","intro":".intro@text","kind":"","coverUrl":"img@src","bookUrl":"a@href","name":"h3@text"},"bookSourceType":0,"ruleSearch":{"author":"tag.span.0@text","bookList":".category-div","lastChapter":"","intro":".intro@text","kind":"","coverUrl":"img@data-original","bookUrl":"a@href","name":"h3@text"},"ruleBookInfo":{"coverUrl":"","author":"","kind":"","wordCount":"","intro":"","lastChapter":""},"bookUrlPattern":"https:\/\/www.sudugu.c\/\\d+\/","respondTime":2273,"ruleContent":{"content":"#article@p@text","nextContentUrl":"text.\u4e0b\u4e00\u9875@href","replaceRegex":"##\\s*({{ book.durChapterTitle }}|.*\u4f5c\u8005\uff1a.*|PS\uff1a.*\u6c42\u63a8\u8350\uff01|PS\uff1a.*\u6c42\u6536\u85cf\uff01|\u611f\u8c22.*\u6253\u8d4f.*|\u611f\u8c22.*\u63a8\u8350\u7968.*|\u611f\u8c22.*\u6708\u7968.*|\uff08.*\u6708\u7968.*\uff09|\uff08\u4e3a\u5927\u5bb6\u7684.*\u7968\u52a0\u66f4.*\uff09|\u7b2c\u4e8c\u66f4\u5728.*|\u4e3a\u9632\u6b62\u91c7\u96c6.*\u652f\u6301\uff01|\u7f51\u5740\uff1asudugu\\.com|\u5fc5\u5e94.*\u901f\u8bfb\u8c37|loadAdv.*)\\s*"},"searchUrl":"\/search\/,{\n    \"body\": \"searchkey={{key}}\",\n    \"method\": \"POST\"\n}","weight":0,"enabledExplore":true,"bookSourceComment":"","ruleToc":{"chapterUrl":"href","chapterList":"class.info-chapters.1@a","nextTocUrl":"","chapterName":"text"},"enabled":true,"bookSourceUrl":"http:\/\/www.sudugu.co","lastUpdateTime":"1769820576276","bookSourceName":"\u901f\u8bfb\u8c37\u4f2a","bookSourceGroup":"\u5c0f\u8bf4","customOrder":-1,"exploreUrl":"\u7384\u5e7b\u9b54\u6cd5::\/fenlei\/1\/{{page}}\/\n\u6b66\u4fa0\u4fee\u771f::\/fenlei\/2\/{{page}}\/\n\u90fd\u5e02\u8a00\u60c5::\/fenlei\/3\/{{page}}\/\n\u5386\u53f2\u519b\u4e8b::\/fenlei\/4\/{{page}}\/\n\u79d1\u5e7b\u7075\u5f02::\/fenlei\/5\/{{page}}\/\n\u8bf8\u5929\u65e0\u9650::\/fenlei\/6\/{{page}}\/\n\u60ac\u7591\u5c0f\u8bf4::\/fenlei\/7\/{{page}}\/\n\u4f53\u80b2\u5c0f\u8bf4::\/fenlei\/8\/{{page}}\/\n\u6e38\u620f\u5c0f\u8bf4::\/fenlei\/9\/{{page}}\/\n\u7efc\u5408\u5176\u4ed6::\/fenlei\/10\/{{page}}\/"},{"bookSourceComment":"\u661f\u7720\n\n\u6b22\u8fce\u5165\u7fa4\uff1a1070942328\n\n\u7981\u6b62\u4f7f\u7528\u6293\u5305,VPN\n\nUpdate:\nV2.30 => 2026.1.25\uff1a\u4fee\u590d\u4e00\u4e9b\u524d\u540e\u7aefbug\n\n\n\u9ed8\u8ba4\u641c\u7d22 \u5c0f\u8bf4\n\u652f\u6301\u641c\u7d22\u65f6\u5feb\u901f\u5207\u6362\n\u52a0\u4e0a\u524d\u7f00\uff1a\n\u542c\u4e66\uff1at:\n\u6f2b\u753b\uff1am:\n\u77ed\u5267\uff1ad:\n\u4f8b\u5982\uff1at:\u7cfb\u7edf","bookSourceGroup":"\u2603 \u81ea\u7528\u2603\ufe0f","bookSourceName":"\ud83d\udcab\u60a6\u604b\u514d\u8d39\u5c0f\u8bf4 - [\u2606\u661f\u7720\u2606]","bookSourceType":0,"bookSourceUrl":"\u60c5\u4e0d\u77e5\u6240\u8d77\u4e00\u5f80\u800c\u6df1\uff0c\n\u60c5\u4e0d\u77e5\u6240\u7ec8\u4e00\u7b11\u800c\u6cef\u3002\n\u2013\u2013\u2013\u2013\u2013\u2013\u2013\u2013\u2013\u2013\u2013\u2013\u2013\u2013\u2013\u2013@\u661f\u7720","customOrder":0,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"@js:\n\u4e2a\u4eba\u4e2d\u5fc3 = 1\n\njs = (cid, genre, gender) => `@js:\nxGorgon(\n  \"new_category\/landing\",\n  [\n    \"category_id=${cid}\",\n    \"limit=20\",\n    \"offset=\" + (page - 1),\n    \"gender=${gender}\",\n    \"genre=${genre}\"\n  ].join(\"&\")\n)`\n\ntt_rank_books = (url) => `@js:\n  let ck = \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : (source. getLoginInfoMap() || {})['\u624b\u52a8\u767b\u5f55Token'])\n  let list = JSON.parse(java.ajax('${url}')).data.result\n  let book_ids = []\n  for (let i of list) book_ids.push(i.book_id)\n  xGorgon(\n    \"multi-detail\",\n    \"book_id=\" + book_ids.slice(0, 100).join(','),\n    null,\n    ck,\n  )\n`\n\nobj = (title, url, type, type1) => ({\n  title: title,\n  url: url,\n  style: {\n    layout_flexGrow: 1,\n    layout_flexBasisPercent: type\n  }\n})\n\nlet toutiao_rank_info = JSON.parse(java.ajax('https:\/\/novel.snssdk.com\/api\/novel\/channel\/homepage\/rank\/rank_list\/v2\/?need_type=1&offset=0&side_type=10&type=1&aid=1319') || '{\"data\":{\"type\":{\"type\":[]}}}').data.type.type\ntoutiao_rank = (index) => {\n  let rank_list = toutiao_rank_info[index] || []\n  let ret = []\n  if (rank_list) {\n    ret.push(obj(i.name + '\u699c', '', 1))\n    for (let j of rank_list.rank_list) {\n      ret.push(obj(j.name, 'https'))\n    }\n  }\n}\n\narr = []\njava.longToast(\"\u8bf7\u7a0d\u7b49\uff0c\u53d1\u73b0\u5217\u8868\u6b63\u5728\u70ed\u66f4\u65b0\uff01\")\nindex=[0, 1, 2]\nfor (let i of index) {\n  \/\/ java.toast(i)\n  let type = i\n  $ = JSON.parse(java.ajax(xGorgon(\n    \"new_category\/front\",\n    [\n      \"update_version_code=58932\",\n      \"distinct_style=1\",\n      \"new_category_tab=\" + i\n    ].join(\"&\")\n  ))).data.category_tab_data\n  cate = []\n  cate.push(obj(\n    \"====== \" + $.tab_name + \" ======\", \"\", 1\n  ))\n  $.cell_data.forEach((c) => {\n    gender_1 = (type == 0 || type == 1) ? type : 1;\n    genre_1 = type == 3 ? 1 : type == 5 ? 110 : type == 6 ? 130 : 0;\n    cate.push(obj(\n      c.cell_name,\n      js(c.atom_data[0].category_data.category_id, genre_1, gender_1),\n      1\n    ))\n    for (j = 2; j < 5; j++) {\n      c.atom_data.slice(1).forEach((a) => {\n        d = a.category_data\n        if (d.name.length == j) {\n          cate.push(obj(d.name, js(d.category_id, genre_1, gender_1), -1))\n        }\n      })\n    }\n  })\n  arr = cate.concat(arr)\n}\n\nget = (path) => `@js:\nlet ck = \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : (source.getLoginInfoMap() || {})['\u624b\u52a8\u767b\u5f55Token'])\n\nlet v = xGorgon(\n    \"${path}\",\n    \"offset=\" + (page - 1) * 20,\n    null,\n    ck,\n)\n\nxGorgon(\n  \"multi-detail\",\n  \"book_id=\" + getBookId(java.ajax(v)),\n  null,\n  ck,\n)`\n\nlet book_shelf_url = 'https:\/\/fanqienovel.com\/reading\/bookapi\/bookshelf\/info\/v:version\/?aid=1967&iid=0&version_code=57700&update_version_code=57700'\nlet book_shelf_info = JSON.parse(java.ajax(book_shelf_url + ', ' + JSON.stringify({\n  headers: {\n    'Cookie': \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : (source.getLoginInfoMap() || {})['\u624b\u52a8\u767b\u5f55Token']),\n  }\n})))\n\njava.log(JSON.stringify(book_shelf_info))\n\nlet username\nif (book_shelf_info.code != 0) {\n  \u4e2a\u4eba\u4e2d\u5fc3 = 0\n} else {\n  let uinfo = java.ajax(\"https:\/\/fanqienovel.com\/api\/user\/info\/v2,\" + JSON.stringify({ headers: { Cookie: \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : (source.getLoginInfoMap() || {})['\u624b\u52a8\u767b\u5f55Token']) } }))\n  uinfo = JSON.parse(uinfo)\n  username = uinfo.data.name\n}\n\nlet gro = []\npush = (title, url, type) => gro.push({\n  title: title,\n  url: url,\n  style: {\n    layout_flexGrow: 1,\n    layout_flexBasisPercent: type\n  }\n});\n\nlet sArr = []\n\nif (\u4e2a\u4eba\u4e2d\u5fc3) {\n  let groups_bookids = {\n    \"\u672a\u5206\u7ec4\": []\n  }\n  book_shelf_info.data.book_shelf_info.forEach(i => {\n    if (!groups_bookids[i.group_name ? i.group_name : \"\u672a\u5206\u7ec4\"]) groups_bookids[i.group_name] = []\n    groups_bookids[i.group_name ? i.group_name : \"\u672a\u5206\u7ec4\"].push(i.book_id)\n  })\n\n  Object.keys(groups_bookids).forEach(k => {\n    var multi_detail_post_body = {\n      data: {\n        book_shelf_info: []\n      }\n    }\n    groups_bookids[k].forEach(i => multi_detail_post_body.data.book_shelf_info.push({ book_id: String(i), item_id: '0' }))\n    \/\/ var multi_detail_group_url = `https:\/\/fanqienovel.com\/api\/bookshelf\/multidetail,${JSON.stringify(multi_detail_post_body)}`\n    \/\/ var book_ids = getBookId(JSON.stringify(multi_detail_post_body)).join(\",\")\n    push(k, \"https:\/\/fanqienovel.com\/fqbookshelf\/groupName\/\" + k, 0.4)\n  })\n  if (Object.keys(groups_bookids).length % 2 != 0) push(\"\u5360\u4f4d\", \"\", 0.4)\n  \/\/ java.log(JSON.stringify(gro, null, 2))\n  sArr.push(obj(username + '\u7684\u4e2a\u4eba\u4e2d\u5fc3', '', 1))\n  sArr.push(obj('\u9996\u9875\u63a8\u8350', \"https:\/\/fanqienovel.com\/tab\/0\", 0.4))\n  sArr.push(obj('\u731c\u4f60\u559c\u6b22', \"https:\/\/fanqienovel.com\/tab\/2\", 0.4))\n  \/\/ sArr.push(obj('\u731c\u4f60\u559c\u6b22', \"https:\/\/fanqienovel.com\/tab\/1\", 0.4))\n  sArr.push(obj(\"\u6211\u7684\u4e66\u67b6\", \"https:\/\/fanqienovel.com\/fqbookshelf\", 1))\n  \n  sArr = sArr.concat(gro)\n  \/\/ java.toast(JSON.stringify(sArr)) \n  sArr.push(obj(\"\u9605\u8bfb\u5386\u53f2\", get(\"read_history\/list\"), 1))\n}\n\narr = sArr.concat(arr)\nJSON.stringify(arr)\n","header":"<js>\n let defaultVariable = {\n \t    \"source\": {\n \t    \t    \"tab\": 1,\n \t    \t    \"mode\": \"\ud83d\udcd6\u5c0f\u8bf4\",\n \t    \t    \"source\": \"\u756a\u8304\u5c0f\u8bf4\"\n \t    \t},\n \t    \t\"studio\": {\n \t    \t\t    \"num\": \"\",\n \t    \t\t    \"toneId\": \"\",\n \t    \t\t    \"toneName\": \"\"\n \t    \t\t},\n \t    \t\t\"version\": version,\n \t    \t\t\"Cookie\": cookie.getKey(\"fanqienovel.com\", \"sessionid\")||\"\",\n \t    \t\t\"progress\": false,\n \t    \t\t\"apiIndex\": 0,\n \t    \t\t\"register\": false,\n \t    \t\t\"bookshelfSync\": false,\n \t    \t\t\"bookComment\": false,\n \t    \t\t\"lastSyncProgressTime\": Date.now(),\n \t    \t\t\"bookshelf\": [\n \t    \t\t    {\n \t    \t\t    \t    \"bookId\": \"\" \n \t    \t\t    \t}\n \t    \t\t ]\n \t}\n let variable = source.getVariable();\n if(variable != \"\" && variable != null){\n   try{\n      variable = JSON.parse(variable);\n   } catch(err) {\n     java.log(err);\n     variable = defaultVariable;\n     source.variable = JSON.stringify(defaultVariable);\n     java.toast(\"\u8bf7\u4e0d\u8981\u81ea\u5df1\u6e90\u53d8\u91cf\uff0c\u5df2\u91cd\u7f6e\u6e90\u53d8\u91cf\uff01\")\n   }\n } else {\n   variable = defaultVariable;\n   java.toast(\"\u5df2\u8fdb\u884c\u4e66\u6e90\u914d\u7f6e\u521d\u59cb\u5316\uff01\");\n   source.variable = JSON.stringify(defaultVariable);\n  }\n let Header = {\n \t    \"Version\": version,\n \t    \"Device\": java.androidId(),\n \t    \"X-Novel-Type\": \"read.yuedu\",\n     \"Key\": source.getLoginInfoMap().get(\"\u4f60\u7684\u4e13\u5c5eKey\") || \"\"\n     }\n  JSON.stringify(Header)\n <\/js>","jsLib":"let replaceCover = (u) => {\n    if (u.startsWith(\"https:\/\/\")) u = u.substring(8)\n    else u = u.substring(7)\n    let uArr = u.split(\"\/\")\n    uArr[0] = \"https:\/\/p6-novel.byteimg.com\/origin\"\n    let uArr2 = []\n    uArr.forEach((x) => {\n        if (!x.includes(\"?\") && !x.includes(\"~\")) uArr2.push(x)\n        else uArr2.push(x.split(\"~\")[0])\n    })\n    u = uArr2.join(\"\/\")\n    return u\n}\n\nconst action = \"\/fanqienovel\/api\/\";\n\nconst version = \"2.30\";\n\nconst api = [\n    \"https:\/\/rose.read.xingmian.icu\",\n    \"https:\/\/rose.read.lzink.icu\",\n    \"http:\/\/154.12.87.33:443\"\n]\nfunction timestamp() {\n    let time = Date.now();\n    let str = time.toString();\n    let num = str.slice(0, 10);\n    \/\/let timestamp = Number(num);\n    return num\n}\n\nfunction getComic(result) {\n  let mat = result.match(\/<article>([\\s\\S]*?)<\\\/article>\/);\n  try {\n    let cnt = JSON.parse(\n      mat\n        ? mat[1].replace(\/\\&\/g, '\"').replace(\/\\;\/g, \"\").replace(\/\\#34\/g, \"\")\n        : result\n    );\n    return (mat ? cnt.skeleton.data : cnt.picInfos)\n      .map((i) => {\n        let path = mat\n          ? cnt.materials[i.element_name].data.web_uri\n          : \"novel-pic\/\" + i.md5;\n        return `<img src=\"https:\/\/p3-novel.byteimg.com\/origin\/${path}\">`;\n      })\n      .join(\"<br>\");\n  } catch (e) { \/\/ not comic content\n    mat = result.match(\/<body>([\\s\\S]*?)<\\\/body>\/)\n    \/\/ java.log(result)\n    return (mat ? mat[1] : result).toString().replace(\/\\<\\!DOCTYPE html.*\/g, \"\").replace(\/\\<tt_keyword_ad.*\\<\\\/tt_keyword_ad\\>\/, \"\").replace(\/\\<a epub.*\\>\\<\\\/a\\>\/g, \"\")\n  }\n}\n\nlet Host = \"https:\/\/fanqienovel.com\"\n\nlet wedapi = Host + \"\/reading\/bookapi\/bookshelf\/add\/v:version\";\n\nlet reurl = Host + \"\/api\/reader\/book\/update_progress\";\n\ngetHost = (a, b, c, d) => [\n    [\"https:\/\/\"][0],\n    [\n        \"reading\",\n        \"api\",\n        \"api3\",\n        \"api5\",\n        \"novel\",\n        \"\",\n    ][(a == 4 ? 5 : b) || 0],\n    [\n        \"\",\n        \"-normal\",\n    ][c || 0],\n    [\n        \"\",\n        \"-hl\",\n        \"-lf\",\n        \"-lq\",\n        \"-sinfonlinea\",\n        \"-sinfonlineb\",\n        \"-sinfonlinec\",\n    ][d || 0],\n    [\".\", \"\"][a == 4 ? 1 : 0],\n    [\n        \"snssdk\",\n        \"fqnovel\",\n        \"fanqiesdk\",\n        \"toutiaoapi\",\n        \"fanqienovel\",\n    ][a || 0],\n    [\".com\"][0],\n].join(\"\");\njavaImport = new JavaImporter()\njavaImport.importPackage(\n    Packages.okhttp3,\n    Packages.cn.hutool.core.util,\n    Packages.cn.hutool.core.codec,\n    Packages.cn.hutool.crypto.digest\n)\n\nfunction gzip(data) { ZipUtil.gzip(data, \"\") }\n\nfunction xGorgon(path, params, data, ck) {\n    const { java, source } = this;\n    params = [\n        params,\n        \"aid=1967\",\n        \"channel=0\",\n        \"os_version=0\",\n        \"app_name=novelapp\",\n        \"version_code=58932\",\n        \"device_platform=android\",\n        \"device_type=unknown\",\n    ].join(\"&\").split(\"&\").sort().join(\"&\").replace(\/^&+\/, \"\");\n    \n    if (!data) {\n        path = \"\/reading\/bookapi\/\" + path + \"\/v\/?\";\n    }\n    \n    let url = getHost() + path + params;\n    let devtype;\n    for (let i of (source.getLoginHeader() || '').split('&')) {\n        if (i.startsWith('device_type')) {\n            devtype = i.split('=')[1];\n        }\n    }\n    let md5 = (str) => javaImport.DigestUtil.md5Hex(str);\n    let rStr = (str) => javaImport.StrUtil.reverse(str);\n    let Hex = (num) => num.toString(16).padStart(2, \"0\");\n    let rHex = (num) => parseInt(rStr(Hex(num)), 16);\n    function rBin(num) {\n        let bin = num.toString(2).padStart(8, \"0\");\n        return parseInt(rStr(bin), 2);\n    }\n    function getHex(ck) {\n        let hex = md5(params);\n        hex += data ? md5(data) : \"0\".repeat(8);\n        hex += ck ? md5(ck) : \"0\".repeat(8);\n        return hex;\n    }\n\n    function calculate(hex, ck) {\n        let len = 0x14;\n        let key = [0xDF, 0x77, 0xB9, 0x40, 0xB9, 0x9B, 0x84, 0x83, 0xD1, 0xB9, 0xCB, 0xD1, 0xF7, 0xC2, 0xB9, 0x85, 0xC3, 0xD0, 0xFB, 0xC3];\n        let paramList = [];\n        \n        for (let i = 0; i < 9; i += 4) {\n            let temp = hex.substring(8 * i, 8 * (i + 1));\n            for (let j = 0; j < 4; j++) {\n                let h = parseInt(temp.substring(j * 2, (j + 1) * 2), 16);\n                paramList.push(h);\n            }\n        }\n        \n        paramList.push(0x0, 0x6, 0xB, 0x1C);\n        let T = Math.floor(Date.now() \/ 1000);\n        paramList.push((T >> 24) & 0xFF, (T >> 16) & 0xFF, (T >> 8) & 0xFF, T & 0xFF);\n        let eorResultList = [];\n        for (let i = 0; i < paramList.length; i++) {\n            eorResultList.push(paramList[i] ^ key[i % len]);\n        }\n        \n        for (let A, B, C, D, i = 0; i < len; i++) {\n            A = rHex(eorResultList[i]);\n            B = eorResultList[(i + 1) % len];\n            C = rBin(A ^ B);\n            D = ((C ^ 0xFFFFFFFF) ^ len) & 0xFF;\n            eorResultList[i] = D;\n        }\n        \n        let result = \"\";\n        for (let param of eorResultList) {\n            result += Hex(param);\n        }\n        \n        let option = {\n            \"headers\": {\n                \"X-Khronos\": String(T),\n                \"X-Gorgon\": \"0404b0d30000\" + result,\n                \"User-Agent\": 'com.dragon.read',\n                \"Cookie\": ck ? ck : \"\"\n            }\n        };\n        \n        if (data) {\n            let json = javaImport.MediaType.parse(\"application\/json\");\n            let request = new javaImport.Request.Builder()\n                .url(url)\n                .post(javaImport.RequestBody.create(data, json));\n                \n            for (let n in option.headers) {\n                request.addHeader(n, option.headers[n]);\n            }\n            \n            let client = new javaImport.OkHttpClient();\n            let response = client.newCall(request.build()).execute();\n            return JSON.parse(response.body().string()).data;\n        } else {\n            return url + \",\" + JSON.stringify(option);\n        }\n    }\n    \n    return calculate(getHex(ck), ck);\n}\nfunction getBookId(url) {\n    const {java} = this;\n    let $ = JSON.parse(url).data;\n    let arr;\n    \n    if ($.book_shelf_info && $.book_shelf_info.length > 0) {\n        arr = $.book_shelf_info.map($ => $.book_id);\n    } else if ($.data_list && $.data_list.length > 0) {\n        arr = $.data_list.map($ => $.book_id_str);\n    } else {\n        java.toast(\"\u83b7\u53d6 book_id \u5931\u8d25\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u767b\u5f55\uff01\");\n        return [];\n    }\n    \n    return arr.slice(0, 100);\n}\n\nfunction getBookIdFull(url) {\n\tconst {java} = this\n\tlet $ = JSON.parse(url).data\n  let arr, list\n\tif ($.book_shelf_info != 0 && $.book_shelf_info != undefined) {\n\t\tarr = $.book_shelf_info.map($ => $.book_id)\n\t} else if (list = $.data_list != 0 && $.data_list != undefined)  {\n\t\tarr = $.data_list.map($ => $.book_id_str)\n\t} else {\n\t\tjava.toast(\"\u83b7\u53d6 book_id \u5931\u8d25\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u767b\u5f55\uff01\")\n\t}\n\treturn arr\n}\n\nfunction splitArray(input, size) {\n    const output = [];\n    for (let i = 0; i < input.length; i += size) {\n        output.push(input.slice(i, i + size));\n    }\n    return output;\n}\n\n\/\/ \u4ece\u6b64\u5904\u5f00\u59cb\u5373\u4e3a\u6bb5\u8bc4\u652f\u6301\nfunction setend(text, bookId, itemId) {\n\t   const{java, source, cont} = this;\n\t   let bookComment = JSON.parse(source.variable).bookComment;\n\t   if(bookComment) {\n\t   \t    \/\/let cid = JSON.parse(cont).item_id;\n\t   \t    let content = text.replace(\/\\n+\/g,\"\\n\");\n\t   \t    content = this.getComments(content, bookId, itemId)\n\t   \t    return content;\n\t   \t } else {\n\t   \t \t   return text;\n\t   \t \t}\n}\nfunction getComments(content, bid, cid) {\n    let { java, cache, source } = this;\n    try {\n        \/\/ \u586b\u5199\u8bc4\u8bba\u591a\u5c11\u7684\u6c14\u6ce1\n        let apiUrl = `https:\/\/fanqie.acgkami.com\/comment_list.php?item_id=${cid}`;\n        let comments = java.ajax(apiUrl);\n        let lines = content.split(\"\\n\");\n        let raw = JSON.parse(comments).data.data;\n        Object.keys(raw).forEach((x) => {\n            if (x < lines.length) {\n                cache.putMemory(`fq-${bid}-${cid}-${x}-text`, lines[x]);\n                let color = \"red\";            \n                lines[x] += `<img src=\"${this.createSvg(raw[x].count, color, bid, cid, x)}\">`;\n            };\n        });\n\n        let chapterDiscussionSvg = this.createChapterDiscussionSvg(bid, cid);\n        lines.push(`<img src=\"${chapterDiscussionSvg}\">`);\n\n        return lines.join(\"\\n\");\n    } catch (e) {\n        return content;\n    }\n}\n\n\/\/ \u81ea\u5b9a\u4e49\u968f\u673a\u6c14\u6ce1\u6570\u5b57\nfunction getraw(length) {\n    const { java, source } = this;\n    let result = {};\n    for (let i = 0; i < length; i++) {\n        result[i] = { count: Math.floor(Math.random() * 100) + 1 };\n    }\n    return result;\n}\n\nfunction createSvg(number, color, bid, cid, para) {\n    var displayText = number > 99 ? \"99+\" : number;\n    var date = String(Date.now()).match(\/(\\d{6}$)\/)[1];\n    var svg;\n    svg = '<svg width=\"1000\" height=\"909\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">' +\n          '<path d=\"M80,80 h840 a60,60 0 0 1 60,60 v580 a60,60 0 0 1 -60,60 h-620 l-140,90 v-90 h-80 a60,60 0 0 1 -60,-60 v-580 a60,60 0 0 1 60,-60 z\" ' +\n          'fill=\"none\" stroke=\"' + color + '\" stroke-width=\"16\" stroke-linejoin=\"round\"\/>' +\n          '<text x=\"500\" y=\"450\" font-family=\"Arial, sans-serif\" text-anchor=\"middle\" ' +\n          'font-size=\"360\" fill=\"' + color + '\" dy=\"0.3em\">' + displayText + '<\/text>' +\n          '<\/svg>';\n\n    var encodedSvg = this.java.base64Encode(svg);\n    return 'data:image\/svg+xml;base64,' + encodedSvg + ',{\"js\":\"showCmt(\\'' + bid + '\\',\\'' + cid + '\\',\\'' + para + '\\',\\'' + date + '\\')\",\"style\":\"text\"}';\n}\n\nfunction showCmt(bid, cid, para, date) {\n    let { java, cache, cookie, source } = this;\n    let mname = `fq-${bid}-${cid}-${para}`;\n    let load = (cache.getFromMemory(mname) ?? \"-\").split(\"-\");\n    \n    if (load[0] != \"1\" || load[1] != date) {\n        cache.putMemory(mname, \"1-\" + date);\n        \/\/java.toast(\"\u8df3\u8fc7\u52a0\u8f7d\");\n        return;\n    }\n    \/\/ \u8bc4\u8bba\u663e\u793a\u7684html \n    let apiUrl = `https:\/\/fanqie.acgkami.com\/comments.html?book_id=${bid}&item_id=${cid}&para_index=${para}`;\n    let title = cache.getFromMemory(mname + \"-text\") ?? \"\u6bb5\u8bc4\u5185\u5bb9\";\n    \n    java.startBrowser(apiUrl, title);\n}\n\nfunction createChapterDiscussionSvg(bid, cid) {\n    const displayText = \"\u672c\u7ae0\u8ba8\u8bba\";\n    const date = String(Date.now()).match(\/(\\d{6}$)\/)[1];\n    const svg = `<svg width=\"1000\" height=\"120\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><rect width=\"1000\" height=\"120\" fill=\"#A9A9A9\" rx=\"15\"\/><text x=\"120\" y=\"75\" font-family=\"Arial\" font-size=\"48\" fill=\"#000000\" text-anchor=\"middle\">${displayText}<\/text><text x=\"965\" y=\"75\" font-family=\"Arial\" font-size=\"36\" fill=\"#000000\" text-anchor=\"middle\">\u3009<\/text><\/svg>`;\n    const encodedSvg = this.java.base64Encode(svg);\n    return 'data:image\/svg+xml;base64,' + encodedSvg + ',{\"js\":\"showChapterDiscussion(\\'' + bid + '\\',\\'' + cid + '\\',\\'' + date + '\\')\",\"style\":\"full\"}';\n}\n\n\nfunction showChapterDiscussion(bid, cid, date) {\n    let { java, cache, cookie, source } = this;\n    let mname = `fq-${bid}-${cid}`;\n    let load = (cache.getFromMemory(mname) ?? \"-\").split(\"-\");\n    \n    if (load[0] != \"1\" || load[1] != date) {\n        cache.putMemory(mname, \"1-\" + date);\n        \/\/java.toast(\"\u8df3\u8fc7\u52a0\u8f7d\");\n        return;\n    }\n    \/\/ \u8bc4\u8bba\u663e\u793a\u7684html \n    let apiUrl = `https:\/\/fanqie.acgkami.com\/commentsfq.html?book_id=${bid}&item_id=${cid}`;\n    let title = cache.getFromMemory(mname + \"-text\") ?? \"\u7ae0\u8282\u8ba8\u8bba\u5185\u5bb9\";\n    \n    java.startBrowser(apiUrl, title);\n}\n\nconst commentapi = \"https:\/\/fanqie.acgkami.com\/commentsfq.html\";\n\nfunction register(type) {\n\t   const { java, source } = this;\n    let durl = api[0] + \"\/fanqienovel\/api\/register.php?action=refresh\";\n    if(!type) {\n    \t    durl = api[0] + \"\/fanqienovel\/api\/register.php?action=register\";\n    \t    let variable = JSON.parse(source.getVariable());\n    \t    variable.register = true;\n    \t    source.setVariable(JSON.stringify(variable));\n    \t}\n    let Header = JSON.stringify({\n    \t    headers: {\n    \t    \t    device: java.androidId()\n    \t    \t}\n    \t});\n    \tlet DEVICE = durl + \",\" + Header;\n    \/\/java.log(DEVICE);\n    java.ajax(DEVICE);\n}","lastUpdateTime":"1769832316259","loginUi":"[\n    {\n        \"name\": \"\u2606\u661f\u7720\u4e66\u6e90\u8bbe\u7f6e\u2606\",\n        \"type\": \"button\",\n        \"action\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 0,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"\ud83d\udd11\u83b7\u53d6\u5bc6\u94a5Key\",\n        \"type\": \"button\",\n        \"action\": \"Turl(0)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83d\udd11\u627e\u56de\u5bc6\u94a5Key\",\n        \"type\": \"button\",\n        \"action\": \"Turl(1)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83c\udf82\u83b7\u53d6\u767d\u540d\u5355\",\n        \"type\": \"button\",\n        \"action\": \"Turl(2)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83d\udce1\u5207\u6362\u670d\u52a1\u5668\",\n        \"type\": \"button\",\n        \"action\": \"Sapi()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83d\udd2d\u4e66\u6e90\u66f4\u65b0\",\n        \"type\": \"button\",\n        \"action\": \"Turl(3)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83d\udef0\u670d\u52a1\u5668\u68c0\u6d4b\",\n        \"type\": \"button\",\n        \"action\": \"checkAPI()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\u4f60\u7684\u4e13\u5c5eKey\",\n        \"type\": \"password\",\n        \"action\": \"\"\n    },\n    {\n        \"name\": \"\ud83c\udf45\u756a\u8304\u5c0f\u8bf4\u8bbe\u7f6e\ud83c\udf45\",\n        \"type\": \"button\",\n        \"action\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 0,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"\u3000[    \u8d26\u53f7\u767b\u5f55    ]\u3000\",\n        \"type\": \"button\",\n        \"action\": \"l2(true)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\u3000[    \u9000\u51fa\u767b\u5f55    ]\u3000\",\n        \"type\": \"button\",\n        \"action\": \"logout()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\u3000[    \u767b\u5f55\u68c0\u67e5    ]\u3000\",\n        \"type\": \"button\",\n        \"action\": \"l2(false, true)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\u2714\u756a\u8304\u9605\u8bfb\u8fdb\u5ea6\u540c\u6b65\",\n        \"type\": \"button\",\n        \"action\": \"ProgressSync()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83d\udcdc\u6bb5\u8bc4\u8bbe\u7f6e\",\n        \"type\": \"button\",\n        \"action\": \"bookComment()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83d\udcd5\u63a8\u9001\u81f3\u756a\u8304\u4e66\u67b6\",\n        \"type\": \"button\",\n        \"action\": \"bookSelfSync()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\u624b\u52a8\u767b\u5f55Token\",\n        \"type\": \"password\",\n        \"action\": \"\"\n    },\n    {\n        \"name\": \"\ud83d\udd0e\u8bbe\u7f6e\u641c\u7d22\u6765\u6e90\ud83d\udd0d\",\n        \"type\": \"button\",\n        \"action\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 0,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"\ud83d\udcd6\u5c0f\u8bf4\ud83d\udcd6\",\n        \"type\": \"button\",\n        \"action\": \"setSource('xiaoshuo')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83c\udf04\u6f2b\u753b\ud83c\udf04\",\n        \"type\": \"button\",\n        \"action\": \"setSource('manhua')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83d\udcbf\u542c\u4e66\ud83d\udcbf\",\n        \"type\": \"button\",\n        \"action\": \"setSource('tinshu')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83d\udcf9\u77ed\u5267\ud83d\udcf9\",\n        \"type\": \"button\",\n        \"action\": \"setSource('duanju')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83d\udcbf\u8bbe\u7f6e\u542c\u4e66\u97f3\u8272\ud83d\udcbf\",\n        \"type\": \"button\",\n        \"action\": \"get()\",\n        \"style\": {\n            \"layout_flexGrow\": 0,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"\u591a\u4eba\u5bf9\u8bdd\",\n        \"type\": \"button\",\n        \"action\": \"set(1)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u771f\u4eba\u53d1\u97f3\",\n        \"type\": \"button\",\n        \"action\": \"set(2)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u751c\u7f8e\u5c11\u5973\",\n        \"type\": \"button\",\n        \"action\": \"set(3)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u6e05\u4eae\u9752\u53d4\",\n        \"type\": \"button\",\n        \"action\": \"set(4)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u6210\u719f\u5927\u53d4\",\n        \"type\": \"button\",\n        \"action\": \"set(5)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u5f00\u6717\u9752\u5e74\",\n        \"type\": \"button\",\n        \"action\": \"set(6)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u6e29\u67d4\u6dd1\u5973\",\n        \"type\": \"button\",\n        \"action\": \"set(7)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u98ce\u96c5\u9752\u53d4\",\n        \"type\": \"button\",\n        \"action\": \"set(8)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u6e05\u7eaf\u5c11\u5973\",\n        \"type\": \"button\",\n        \"action\": \"set(9)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u78c1\u6027\u9752\u53d4\",\n        \"type\": \"button\",\n        \"action\": \"set(10)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u5112\u96c5\u5927\u53d4\",\n        \"type\": \"button\",\n        \"action\": \"set(11)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u4f18\u96c5\u5fa1\u59d0\",\n        \"type\": \"button\",\n        \"action\": \"set(12)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u65af\u6587\u9752\u53d4\",\n        \"type\": \"button\",\n        \"action\": \"set(13)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u77e5\u6027\u4e3b\u64ad\",\n        \"type\": \"button\",\n        \"action\": \"set(14)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u6210\u719f\u5347\u7ea7\",\n        \"type\": \"button\",\n        \"action\": \"set(15)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u591a\u4eba\u5347\u7ea7\",\n        \"type\": \"button\",\n        \"action\": \"set(16)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u4fcf\u76ae\u5fa1\u59d0\",\n        \"type\": \"button\",\n        \"action\": \"set(17)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"\u53cc\u97f3\u7075\u52a8\",\n        \"type\": \"button\",\n        \"action\": \"set(18)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"  \u63a5    \u53e3\uff1a\u661f\u7720     \u6e90\u89c4\u5219\uff1a \u661f\u7720  \",\n        \"type\": \"button\",\n        \"action\": \"author()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1.5\n        }\n    }\n]","loginUrl":"\/\/ \u767b\u5f55\u53ca\u767b\u5f55\u68c0\u67e5\nfunction login_(openBrowser, checkMode) {\n    \/\/ java.removeCookie(\"snssdk.com\")\n    var cookie_ = String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : (source.getLoginInfoMap() ? source.getLoginInfoMap() : {})['\u624b\u52a8\u767b\u5f55Token']\n    \/\/ java.toast(cookie_)\n    if (cookie_ && cookie_ != \"\" && !checkMode) {\n        if (!source.variableComment) {\n            java.toast(\"\u8bf7\u4e0d\u8981\u91cd\u590d\u767b\u5f55\uff0c\u8bf7\u5148\u9000\u51fa\u767b\u5f55\uff01\")\n        } else {\n            java.toast(\"\u60a8\u4e3a\u586b\u5199token\u767b\u5f55\uff0c\u8bf7\u624b\u52a8\u79fb\u9664token\u540e\u518d\u6b21\u767b\u5f55\")\n        }\n        return false\n    }\n    if (openBrowser) {\n        try {\n            java.startBrowserAwait(\"https:\/\/fanqienovel.com\", \"\u767b\u5f55\")\n        } catch (e) {\n            java.toast(e)\n        }\n    }\n    \/\/ java.log(\"snssdk cookie: \" + java.getCookie(\"snssdk.com\") + \"will be reomved\")\n    try {\n        cookie.removeCookie(\"snssdk.com\")\n    } catch (e) {}\n    \/\/ java.log(cookie)\n    var cookie_ = \"sessionid=\" + String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : (source.getLoginInfoMap())['\u624b\u52a8\u767b\u5f55Token']\n    let user\n    try {\n      user = JSON.parse(java.ajax(\"https:\/\/fanqienovel.com\/api\/user\/info\/v2,\" + JSON.stringify({\n        method: \"GET\",\n        headers: {\n          \"Cookie\": cookie_\n        }\n      }))).data.name\n     } catch (e) {java.log(e)}\n    if (!cookie_ || cookie_ == \"sessionid=\" || !user) {\n        java.toast(\"\u672a\u83b7\u53d6\u5230\u767b\u5f55\u51ed\u636e\uff0c\u767b\u5f55\u5931\u8d25\")\n        return false\n    }\n    java.toast(\"\u6b22\u8fce \" + user + \"\\n\u767b\u5f55\u6210\u529f\uff01\");\n    java.log(cookie_);\n    return true\n}\n\nfunction login() {\n\t\/\/ \u4e00\u5b9a\u7a0b\u5ea6\u4e0a\u52a0\u4e0a\u8fd9\u4e2a\u51fd\u6570\u80fd\u591f\u652f\u6301\u66f4\u591a\u7684\u7248\u672c\n\t}\n\nfunction l2(a, b) {\n  try {\n    login_(a, b)\n  } catch (e) {\n    java.log(e+\"\\n\"+e.stack)\n  }\n}\n\n\/\/ \u53d6\u6d88\u767b\u5f55\nfunction logout() {\n    cookie.removeCookie(\"fanqienovel.com\");\n    cookie.removeCookie(\"snssdk.com\");\n    if (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : (source.getLoginInfoMap() ? source.getLoginInfoMap() : {})['\u624b\u52a8\u767b\u5f55Token']) java.toast(\"\u8bf7\u624b\u52a8\u79fb\u9664\u586b\u5199\u7684Token\")\n    else java.toast(\"\u9000\u51fa\u767b\u5f55\u6210\u529f\");\n}\n\nfunction setSource(smode) {\n    const map = { \n    \t    xiaoshuo: \n            [1, \"\ud83d\udcd6\u5c0f\u8bf4\"], \n        manhua: \n            [2, \"\ud83c\udf04\u6f2b\u753b\"], \n        tinshu: \n            [3, \"\ud83d\udcbf\u542c\u4e66\"], \n        duanju: \n            [4, \"\ud83d\udcf9\u77ed\u5267\"] \n        };\n    const [tab, mode] = map[smode] || [];\n    const variable = JSON.parse(source.getVariable());\n    variable.source.tab = tab;\n    variable.source.mode = mode;\n    source.setVariable(JSON.stringify(variable));\n    java.toast(`\\n\u5df2\u8bbe\u7f6e\u6765\u6e90\\n${mode}`);\n}\n\nvar data = [\n    [\"\u9605\u8bfb\u6a21\u5f0f\", \"\"],\n    [\"\u591a\u4eba\u5bf9\u8bdd\", \"tone_id=51\"],\n    [\"\u771f\u4eba\u53d1\u97f3\", \"tone_id=0\"],\n    [\"\u751c\u7f8e\u5c11\u5973\", \"tone_id=1\"],\n    [\"\u6e05\u4eae\u9752\u53d4\", \"tone_id=2\"],\n    [\"\u6210\u719f\u5927\u53d4\", \"tone_id=4\"],\n    [\"\u5f00\u6717\u9752\u5e74\", \"tone_id=5\"],\n    [\"\u6e29\u67d4\u6dd1\u5973\", \"tone_id=6\"],\n    [\"\u98ce\u96c5\u9752\u53d4\", \"tone_id=8\"],\n    [\"\u6e05\u7eaf\u5c11\u5973\", \"tone_id=12\"],\n    [\"\u78c1\u6027\u9752\u53d4\", \"tone_id=17\"],\n    [\"\u5112\u96c5\u5927\u53d4\", \"tone_id=29\"],\n    [\"\u4f18\u96c5\u5fa1\u59d0\", \"tone_id=30\"],\n    [\"\u65af\u6587\u9752\u53d4\", \"tone_id=31\"],\n    [\"\u77e5\u6027\u4e3b\u64ad\", \"tone_id=32\"],\n    [\"\u6210\u719f\u5347\u7ea7\", \"tone_id=74\"],\n    [\"\u591a\u4eba\u5347\u7ea7\", \"tone_id=80\"],\n    [\"\u4fcf\u76ae\u5fa1\u59d0\", \"tone_id=100\"],\n    [\"\u53cc\u97f3\u7075\u52a8\", \"tone_id=103\"]\n];\n\n\/\/ \u8bbe\u7f6e\u4fdd\u5b58\u63a5\u53e3\nfunction set(num) {\n    if (num < 0 || num >= data.length) {\n        java.longToast(\"\u65e0\u6548\u7684\u63a5\u53e3\u7f16\u53f7\uff01\");\n        return;\n    }\n    var show = \"\u8bbe\u7f6e\u6210\u529f\\n\u5f53\u524d\u6a21\u5f0f\uff1a\";\n    var tips = \"\\n\u203c\ufe0f\u8bbe\u7f6e\u5b8c\u6210\u8bf7\u5237\u65b0\u8be6\u60c5\u9875\u203c\ufe0f\"\n    var setData = JSON.parse(source.getVariable());\n    setData.studio.toneName = data[num][0];\n    setData.studio.toneId = data[num][1];\n    setData.studio.num = num;\n    setData.studio.mode = \"\ud83d\udcbf\u542c\u4e66\";\n    setData.source.tab = 3;\n    source.setVariable(JSON.stringify(setData));\n    var msg = show + data[num][0] + tips;\n    java.longToast(msg);\n}\nfunction get() {\n    var variable = source.getVariable();\n    try {\n        var num = JSON.parse(variable).studio.num;\n        if (num < 0 || num >= data.length) {\n            num = 0;\n        }\n        var show = \"\u5f53\u524d\u6a21\u5f0f\uff1a\";\n        java.longToast(show + data[num][0]);\n    } catch (e) {\n        java.longToast(\"\u83b7\u53d6\u6a21\u5f0f\u5931\u8d25\uff0c\u4f7f\u7528\u9ed8\u8ba4\u6a21\u5f0f\u3002\");\n    }\n}\n\nfunction Turl(num) {\n\t   let variable = JSON.parse(source.getVariable());\n\t   let apiIndex = variable.apiIndex;\n    let action = \"\/register\";\n    if(num == 1) {\n    \t    action = action + \"\/retrieve_key.php\";\n    \t} else if (num == 2) {\n    \t\t   action = action + \"\/donate.php\";\n    \t} else if(num == 3) {\n    \t    action = \"\/update?version=\" + version;\n    \t    source.setVariable(\"\");\n    \t}\n    java.startBrowserAwait(api[apiIndex] + action, \"\u661f\u7720\");\n}\n\nfunction Sapi() {\n\t   let variable = JSON.parse(source.getVariable());\n\t   let apiIndex = variable.apiIndex;\n\t   if(apiIndex == 2) {\n\t   \t    variable.apiIndex = 0;\n\t   \t    apiIndex = 0;\n\t   \t} else {\n\t   \t\t   apiIndex = apiIndex + 1;\n\t   \t\t   variable.apiIndex = apiIndex;\n\t   \t}\n\t   \tsource.setVariable(JSON.stringify(variable));\n\t   \tjava.toast(\"\u670d\u52a1\u5668\u5df2\u5207\u6362\u81f3\uff1a\\n\" + api[apiIndex]);\n}\n\nfunction ProgressSync() {\n\t   let variable = JSON.parse(source.getVariable());\n    let status = variable.progress ?? true;\n    if (status) {\n        variable.progress = false;\n        java.toast(\"\u2718\u5df2\u5173\u95ed\u756a\u8304\u9605\u8bfb\u8fdb\u5ea6\u540c\u6b65\");\n    } else {\n        variable.progress = true;\n        java.toast(\"\u2714\u5df2\u5f00\u542f\u756a\u8304\u9605\u8bfb\u8fdb\u5ea6\u540c\u6b65\");\n    }\n    source.setVariable(JSON.stringify(variable));\n\t}\n\t\nfunction bookSelfSync() {\n\t   let variable = JSON.parse(source.getVariable());\n    let status = variable.bookshelfSync ?? true;\n    if (status) {\n        variable.bookshelfSync = false;\n        java.toast(\"\u2718\u5df2\u5173\u95ed\u4e66\u7c4d\u5411\u756a\u8304\u63a8\u9001\");\n    } else {\n        variable.bookshelfSync = true;\n        java.toast(\"\u2714\u5df2\u5f00\u542f\u4e66\u7c4d\u5411\u756a\u8304\u63a8\u9001\");\n    }\n    source.setVariable(JSON.stringify(variable));\n\t}\n\t\nfunction bookComment() {\n\t   let variable = JSON.parse(source.getVariable());\n    let status = variable.bookComment ?? true;\n    if (status) {\n        variable.bookComment = false;\n        java.toast(\"\u2718\u5df2\u5173\u95ed\u9605\u8bfb\u6bb5\u8bc4\");\n    } else {\n        variable.bookComment = true;\n        java.toast(\"\u2714\u5df2\u5f00\u542f\u9605\u8bfb\u6bb5\u8bc4\");\n    }\n    source.setVariable(JSON.stringify(variable));\n\t}\n\t\nfunction author() {\n\t   let url = \"https:\/\/jkapi.com\/api\/one_yan?type=json\";\n\t   let json = java.ajax(url + \",\" + JSON.stringify({\n                   method: \"GET\"\n                }\t)\n\t   \t    );\n\t   \tlet content = JSON.parse(json).content;\n\t   \tjava.log(`\\n${content}`);\n\t   \tjava.longToast(`\\n${content}`);\n\t}\n\nfunction checkAPI() {\njava.toast(\"\u6b63\u5728\u68c0\u6d4b\u66f4\u65b0\uff0c\u65f6\u95f4\u53ef\u80fd\u4f1a\u6709\u70b9\u957f\uff0c\u8bf7\u8010\u5fc3\u7b49\u5f85\uff01\");\nvar searchPath = action + \"detail.php?bookId=7352711039546297369\";\n\nvar results = [];\nvar fastestApi = null;\nvar minTime = Infinity;\n\nfor (var i = 0; i < api.length; i++) {\n\t   let opins = JSON.stringify({\n\t   \t    method: \"GET\",\n\t   \t    timeout: 5000\n\t   \t});\n    var apiUrl = api[i] + searchPath + \",\" + opins;\n    var startTime = new Date().getTime();\n    \n    try {\n        var response = java.ajax(apiUrl);\n        \n        JSON.parse(response);\n        var endTime = new Date().getTime();\n        var responseTime = endTime - startTime;\n        \n        results.push({\n            api: api[i],\n            time: responseTime,\n            status: \"\u6210\u529f\",\n            success: true\n        });\n        \n        if (responseTime < minTime) {\n            minTime = responseTime;\n            fastestApi = api[i];\n        }\n        \n        \/\/java.log(\"API \u6d4b\u8bd5: \" + apiUrl + \" | \u8017\u65f6: \" + responseTime + \"ms\");\n        \n    } catch (e) {\n        var endTime = new Date().getTime();\n        var responseTime = endTime - startTime;\n        \n        results.push({\n            api: api[i],\n            time: responseTime,\n            status: \"\u5931\u8d25: \" + e.message,\n            success: false\n        });\n        \n        java.log(\"API \u6d4b\u8bd5\u5931\u8d25: \" + apiUrl + \" | \u9519\u8bef: \" + e.message);\n    }\n}\nvar report = \"\\n=== API \u54cd\u5e94\u65f6\u95f4\u6d4b\u8bd5\u62a5\u544a ===\\n\\n\";\nreport += \"\u68c0\u9a8c\u4e66\u7c4d: 7352711039546297369\\n\\n\";\n\nfor (var j = 0; j < results.length; j++) {\n    var result = results[j];\n    report += \"API \" + (j + 1) + \": \" + result.api + \"\\n\";\n    report += \"\u72b6\u6001: \" + result.status + \"\\n\";\n    report += \"\u54cd\u5e94\u65f6\u95f4: \" + result.time + \"ms\\n\";\n    report += \"--------------------------------\\n\";\n}\n\nif (fastestApi) {\n    report += \"\\n\u2705 \u6700\u5feb API: \" + fastestApi + \" (\" + minTime + \"ms)\\n\";\n    report += \"\u63a8\u8350\u4f7f\u7528\u6b64\u63a5\u53e3\u8fdb\u884c\u540e\u7eed\u8bf7\u6c42\\n       \u5df2\u6253\u5370\u81f3\u65e5\u5fd7\";\n } else {\n    report += \"\\n\u26a0\ufe0f \u6240\u6709 API \u6d4b\u8bd5\u5747\u5931\u8d25\uff0c\u8bf7\u68c0\u67e5\u7f51\u7edc\u8fde\u63a5\u6216 API \u72b6\u6001\";\n }\n   java.log(report);\n   java.longToast(report);\n }\n","respondTime":180000,"ruleBookInfo":{"author":"$.author","coverUrl":"<js>\n     replaceCover(java.getString(\"thumb_url\"));\n<\/js>","init":"@js:\nlet data;\nlet mes;\ntry{\n\t   data = JSON.parse(result);\n\t   mes = \"\u5f53\u524d\u6765\u6e90\uff1a\\n\" + java.get(\"mode\");\n\t   } catch(e) {\n\t   \tmes = \"\u5931\u8d25\uff01\u8bf7\u622a\u56fe\u53cd\u9988\uff01\";\n\t   \tdata = {content: [{abstract: mes}]}\n\t   \t}\nvar variable = JSON.parse(source.getVariable());\nvar tab = variable.source.tab;\nvar bookId = data[\"data\"][\"book_id\"];\nvar apiIndex = variable.apiIndex;\nvar Cookie = \"sessionid=\" + cookie.getKey(\"fanqienovel.com\", \"sessionid\");\n\nif(variable.bookshelfSync) {\n    let body = {\n    \t    add_book_source: 0,\n    \t    identify_data: [\n    \t        {\n    \t        \t    asterisked: false,\n    \t        \t    book_id: bookId,\n    \t        \t    book_type: 0,\n    \t        \t    modify_time: Date.now()\n    \t        \t}\n    \t    ]\n    \t}\n    \tlet Hander = {\n    \t    \"content-type\": \"application\/json\",\n    \t    \"cookie\": Cookie\n    \t}\n    \tlet prams = [\n    \t    \"aid=1967\",\n    \t    \"iid=0\",\n    \t    \"version_code=57700\",\n    \t    \"update_version_code=57700\"\n    \t].join(\"&\");\n    \tlet opions = JSON.stringify({\n    \t    body: body,\n    \t    charset: \"UTF-8\",\n    \t    headers: Hander,\n    \t    method: \"POST\"\n    \t});\n    \t\/\/java.log(prams);\n    \tlet url = wedapi + \"?\" + prams + \",\" + opions;\n    \ttry{\n    \t\t   java.toast(\"\u5c1d\u8bd5\u63a8\u9001\u81f3\u756a\u8304\u4e66\u67b6\u2026\u2026\");\n    \t\t   let response = java.ajax(url);\n    \t\t   let rdata = JSON.parse(response);\n    \t\t   if(rdata[\"code\"] == 0) {\n    \t\t   \t    java.put(\"iinfo\", \"\u672c\u4e66\u5df2\u6210\u529f\u63a8\u9001\uff01\");\n    \t\t   \t} else {\n    \t\t   \t\t   java.put(iinfo, \"\u9519\u8bef\uff0c\u540c\u6b65\u5931\u8d25\uff1a\" + rdata[\"message\"]);\n    \t\t   \t}\n    \t} catch(e) {\n    \t    java.toast(\"\u540c\u6b65\u5931\u8d25\uff01\\n\" + e);\n    \t    java.log(e);\n    \t}\n }\n\n\/*\ntry {\n    let update = xGorgon(\n    \t    \"\/reading\/bookapi\/read_history\/update\/v\/?\",\n    \t    \"\",\n    \t    {\n    \t    \t    update_datas: [\n    \t    \t        {\n    \t    \t        \t    book_id: bookId,\n    \t    \t        \t    read_timestamp_ms: Date.now()\n    \t    \t        \t}\n    \t    \t    ]\n    },\n    Cookie\n    );\n    java.log(update)\n} catch (e) {\n    java.toast(\"\u65e0\u6cd5\u66f4\u65b0\u9605\u8bfb\u5386\u53f2: \" + e)\n    java.log(\"\u65e0\u6cd5\u66f4\u65b0\u9605\u8bfb\u5386\u53f2: \" + e.stack)\n}\n*\/\n\nif(tab == 3) {\n\t   let url = `${api[apiIndex]}${action}studioInfo.php?bookId=${bookId}`;\n\t   let res = JSON.parse(java.ajax(url));\n\t   let title = res.data.map(info =>  info.title);\n\t   java.put(\"ttsInfo\", title);\n\t}\n\n\/\/java.toast(mes);\n\nJSON.stringify(data[\"data\"]||data[\"data\"][0]);","intro":"&nbsp;&nbsp;\n\ud83d\udcef \u7c7b\u578b\uff1a{{JSON.parse(source.variable).source.mode}}{{\"\\n\"+\"\u200b\"}}\n\ud83d\udcd5 \u6e90\u540d\uff1a{{$.original_book_name}}\n\ud83d\udcd6 \u522b\u540d\uff1a{{$.book_flight_alias_name}}{{\"\\n\"+\"\u200b\"}}\n\ud83d\udd0d \u7f16\u53f7\uff1a{{$.book_id}}{{\"\\n\"+\"\u200b\"}}\n\u270f\ufe0f \u5f00\u5751\uff1a{{$.create_time##T|\\+.*## }}{{\"\\n\"+\"\u200b\"}}\n\ud83c\udff7\ufe0f \u5206\u7c7b\uff1a{{$.complete_category##\/##,}}\n\ud83c\udff7\ufe0f \u6807\u7b7e\uff1a{{$.tags}}\n\ud83d\udc65 \u4e3b\u89d2\uff1a{{$.roles##\\[|\\\"|\\]}}\n\ud83d\udc41\ufe0f \u5728\u7ebf\uff1a{{$.read_count}}\u4eba\u5728\u8bfb{{\"\\n\"+\"\u200b\"}}\n\ud83d\udd16 \u72b6\u6001\uff1a__status__{{\"\\n\"+\"\u200b\"}}\n\ud83d\udcbf \u97f3\u8272\u652f\u6301\uff1a{{java.get(\"ttsInfo\")}}{{\"\\n\"+\"\u200b\"}}\n\ud83d\udce1  \u4e66\u7c4d\u540c\u6b65\u72b6\u6001\uff1a{{java.get(\"iinfo\")}}{{\"\\n\"+\"\u200b\"}}\n\ud83d\udcdc \u7b80\u4ecb\uff1a{{$.abstract}}{{\"\\n\"+\"\u200b\"}}\n\ud83d\udccd {{$.copyright_info##\uff0c.*##\u3002}}{{\"\\n\"+\"\u200b\"}}\n@js:\nresult\n.replace(\/.+\uff1a(\u4eba\u5728\u8bfb)?\\n\/g, \"\")\n.replace('__status__', (java.getString('$.book_search_visible') == 'true' ? '\u6b63\u5e38' : (java.getString('$.tomato_book_status') == '3' ? '\u4e0b\u67b6' : '\u5c0f\u9ed1\u5c4b')))","kind":"{{$.category}},{{$.score}}\u5206,\u8fde\u8f7d{{$.creation_status}}\u5b8c\u7ed3,{{java.timeFormat(java.getString(\"last_chapter_update_time\")*1000)}}\n@js:\nresult\n.replace(\/\u8fde\u8f7d0\u5b8c\u7ed3\/g, \"\u5b8c\u7ed3\")\n.replace(\/\u8fde\u8f7d1\u5b8c\u7ed3\/g, \"\u8fde\u8f7d\")\n.replace(\/\u8fde\u8f7d4\u5b8c\u7ed3\/g, \"\u5df2\u65ad\u66f4\")\n.replace(\/\u8fde\u8f7d-1\u5b8c\u7ed3\/g, \"\u5b8c\u7ed3\")\n.replace(\/\\\/\/g, \"-\")\n.replace(\/\\s..:.*\/g, \"\")","lastChapter":"{{$.last_chapter_title}} \u2022 {{java.timeFormat(java.getString(\"last_chapter_update_time\")*1000)}}","name":"$.book_name","tocUrl":"{{api[JSON.parse(source.variable).apiIndex]}}{{action}}directory.php?bookId={{$.book_id}}","wordCount":"$.word_number"},"ruleContent":{"content":"<js>\nconst bookId = book.bookUrl.match(\/bookId\\=([0-9]{19})\/)[1];\nconst itemId = java.hexDecodeToString(result);\nconst variable = JSON.parse(source.getVariable());\nconst { source: { tab }, apiIndex, bookshelfSync, bookComment, lastSyncProgressTime } = variable;\nconst toneId = (variable.studio.toneId || \"tone_id=1\").match(\/tone_id\\=(\\d+)\/)[1];\n\njava.log(\"itemId\u83b7\u53d6\u6210\u529f\uff1a\" + itemId);\n\/\/register(variable.register);\n\nlet url;\nswitch(tab) {\n\t   case 1:\n\t      url = \"content.php?item_id=\" + itemId;\n    break;\n    case 2:\n        url = \"content.php?item_id=\" + itemId;\n    break;\n    case 3:\n        let pram = [\n            `item_id=${itemId}`,\n            `tone_id=${toneId}`\n        ].join(\"&\");\n        url = \"audio.php?\" + pram;\n    break;\n    case 4:\n        let prams = [\n            `book_id=${bookId}`,\n            `item_id=${itemId}`,\n            \"type=html\"\n        ].join(\"&\");\n        url = \"video.php?\" + prams;\n     break;\n}\n\nlet ContentUrl = api[apiIndex] + action + url;\n\n\/\/java.log(ContentUrl);\n\nlet res;\nif(tab != 4 && tab !=1) {\n    res = JSON.parse(java.ajax(ContentUrl));\n}\n\nif(tab ==1 && variable.progress && Date.now() - lastSyncProgressTime > 30000) {\n\t  java.log(\"\u5c1d\u8bd5\u8fdb\u884c\u9605\u8bfb\u8fdb\u5ea6\u540c\u6b65\uff01\");\n\t  let Cookie = \"sessionid=\" + cookie.getKey(\"fanqienovel.com\", \"sessionid\");\n\t  let body = {\n\t  \t    \"book_id\": bookId,\n\t  \t    \"item_id\": itemId,\n\t  \t    \"read_progress\": 0,\n\t  \t    \"index\": book.durChapterIndex + 1,\n\t  \t    \"read_timestamp\": Date.now(),\n\t  \t    \"genre_type\": 0\n\t  \t}\n\t  \tlet Hander = {\n\t  \t\t   \"user-agent\": \"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/116.0.0.0 Safari\/537.36\",\n\t  \t\t   \"cookie\": Cookie\n\t  \t}\n\t  \tlet opions = JSON.stringify({\n\t  \t    body: body,\n\t  \t    charset: \"UTF-8\",\n\t  \t    headers: Hander,\n\t  \t    method: \"POST\"\n\t  \t});\n\t  \ttry{\n\t      \tlet bdata = java.ajax(reurl + \",\" + opions);\n\t      \tlet rdata = JSON.parse(bdata);\n\t      \tif(rdata[\"code\"] != 0 || !bdata) {\n\t      \t\t   java.log(\"\u9605\u8bfb\u8fdb\u5ea6\u540c\u6b65\u5931\u8d25\uff01\\n\" + rdata[\"message\"]);\n\t      \t\t} else {\n\t      \t\t\t  java.log(rdata[\"message\"]);\n\t      \t\t\t  variable.lastSyncProgressTime = Date.now();\n\t      \t\t\t  source.setVariable(JSON.stringify(variable));\n\t      \t\t}\n\t   } catch(er) {\n\t   \t     java.log(\"\u9605\u8bfb\u8fdb\u5ea6\u540c\u6b65\u5931\u8d25\uff01\\n\" + er);\n\t   \t}\n\t}\n\nif(tab == 4) {\n    if(book.durChapterIndex == chapter.index) {\n        java.startBrowser(ContentUrl, chapter.title);\n        java.toast('\u6b63\u5728\u52a0\u8f7d\u89c6\u9891\\n\u89c6\u9891\u52a0\u8f7d\u8f83\u6162\uff0c\u8bf7\u8010\u5fc3\u7b49\u5f85');\n    }\n    result = \"\u5237\u65b0\u8fdb\u5165\u77ed\u5267\u64ad\u653e\";\n} else if(tab == 3) {\n    result = res.data.content.mainUrl;\n} else if(tab == 1) {\n\t   if(bookComment) {\n\t   \t    let cont = java.connect(ContentUrl).body();\n\t   \t    let cresult = JSON.parse(cont).data.content;\n\t   \t    var html = cresult.match(\/<p[^>]*>(.*?)<\\\/p>\/g);\n\t   \t    result = html.map(p => p.replace(\/<p[^>]*>|<\\\/p>\/g, '')).join(\"\\n\");\n\t   \t    result = setend(result, bookId, itemId);\n\t   \t} else {\n\t   \t\t   res = JSON.parse(java.ajax(ContentUrl));\n\t   \t\t   result = getComic(String(res.data.content));\n\t   \t    result.replace(\/\\{\\!\\-\\- PGC_VOICE\\:.*\\-\\-\\}\/g, \"\");\n\t   \t}\n} else if(tab == 2) {\n\t   \/\/java.log(res.data.content);\n\t   result = getComic(String(res.data.content));\n}\n\t   \t    \nresult\n<\/js>","imageStyle":"TEXT","replaceRegex":"@js:\nfunction removeChapterTitleLines(text) {\n    const regex = \/^\u7b2c\\s*[\u96f6\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u4ebf\\d]+\\s*\u7ae0\\s*[:\uff1a]?\\s*.*$\/gm;\n    let clean = text.replace(regex, '').replace(\/\\n\\s*\\n\/g, '\\n').trim();\n    return clean;\n}\n\nremoveChapterTitleLines(result);\n","title":"$.data.title"},"ruleExplore":{"author":"$.author","bookList":"<js>\n\nlet ck = \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : (source.getLoginInfoMap() || {})['\u624b\u52a8\u767b\u5f55Token'])\n\ngetShelf = () => {\nlet book_shelf_url = 'https:\/\/fanqienovel.com\/reading\/bookapi\/bookshelf\/info\/v:version\/?aid=1967&iid=0&version_code=57700&update_version_code=57700'\nlet book_shelf_info = java.ajax(book_shelf_url + ', ' + JSON.stringify({\n  headers: {\n    'Cookie': ck\n  }\n}))\n\nbid = getBookIdFull(book_shelf_info)\nlet id_list = splitArray(bid, 100)\nlet urls = []\nid_list.forEach(i => {\n    urls.push(xGorgon(\"multi-detail\", \"book_id=\" + i.join(\",\"), null, ck))\n})\n\nres = java.ajaxAll(urls)\n\nlet resp = {book_info: []}\nres.forEach(r => {\n  resp.book_info = resp.book_info.concat(JSON.parse(r.body()).data)\n})\n\nreturn resp\n}\n\nfunction getByGroupName(name) {\n  let book_shelf_url = 'https:\/\/fanqienovel.com\/reading\/bookapi\/bookshelf\/info\/v:version\/?aid=1967&iid=0&version_code=57700&update_version_code=57700'\n\n  let book_shelf_info = JSON.parse(java.ajax(book_shelf_url + ', ' + JSON.stringify({\n    headers: {\n      'Cookie': ck,\n    }\n  })))\n  let group_bookids = {\n    \"\u672a\u5206\u7ec4\": []\n  }\n  \/\/ java.log(\n  book_shelf_info.data.book_shelf_info.forEach(i => {\n    if (!group_bookids[i.group_name ? i.group_name : \"\u672a\u5206\u7ec4\"]) group_bookids[i.group_name] = []\n    group_bookids[i.group_name ? i.group_name : \"\u672a\u5206\u7ec4\"].push(i.book_id)\n  })\n  \/\/ java.log(JSON.stringify(group_bookids[\"\u672a\u5206\u7ec4\"]))\n  \/\/ java.log(decodeURIComponent(name))\n  if (!group_bookids[decodeURIComponent(name)]) return {data: []}\n  \/\/java.log(\"awa\")\n  let book_ids = splitArray(group_bookids[decodeURIComponent(name)], 100)\n  let urls = []\n\n  book_ids.forEach(i => {\n    urls.push(xGorgon(\"multi-detail\", \"book_id=\" + i.join(\",\"), null, ck))\n  })\n  \n  res = java.ajaxAll(urls)\n\n  let resp = {book_info: []}\n  res.forEach(r => {\n    resp.book_info = resp.book_info.concat(JSON.parse(r.body()).data)\n  })\n\n  return resp\n}\n\nfunction getByTabIndex(index) {\n  let url = xGorgon(\n\t  \"bookmall\/tab\",\n    \"version_name=5.8.9.32&device_id=1024&device_type=114514&iid=2048\",\n\t  null,\n\t  ck\n  )\n  let all = JSON.parse(java.ajax(url))\n  let tab = all.data.tab_item[0].cell_data[index]\n  \/\/ java.log(JSON.stringify(tab))\n  tab = tab.cell_data\n  if (!tab) tab = []\n  let bookList = []\n  for (let i of tab) {\n    bookList = bookList.concat(i.book_data)\n    \/\/ java.log(JSON.stringify(i.book_data))\n  }\n  return { book_info: bookList }\n}\n\nif (baseUrl.endsWith(\"bookshelf\")) result = getShelf(\"bookshelf\/info\")\nelse {\n  let w = baseUrl.split(\"\/\")\n  if (baseUrl.includes(\"groupName\")) {\n    result = getByGroupName(w[w.length - 1])\n  } else if (baseUrl.includes(\"tab\")) {\n    result = getByTabIndex(parseInt(w[w.length - 1]))\n  } else result = JSON.parse(result)\n}\nJSON.stringify({data: result.book_info || result.data.book_info || result.detail_list || result.data})\n<\/js>\n$.data[*]","bookUrl":"@js:\nlet variable = JSON.parse(source.getVariable());\nlet apiIndex = variable.apiIndex;\n\napi[apiIndex] + action + \"detail.php?bookId={{$.book_id||$.series_id}}\";","coverUrl":"$.thumb_url","intro":"$.abstract##\\n","kind":"{{$.category}}\n{{$.status}}\n{{$.source}}\n{{$.tags}}\n\u7537\u751f{{$.gender}}\u5973\u751f\n\u8fde\u8f7d{{$.creation_status}}\u5b8c\u7ed3\n{{$.score}}\u5206\n{{$..text}}\n{{$.sub_info}}\n##\u8fde\u8f7d0|1\u5b8c\u7ed3|\u7537\u751f0|1\u5973\u751f|\u7537\u751f\u5973\u751f[\\s\\S]*\n@js:result\n.replace(\"\u7537\u751f2\u5973\u751f\", \"\u51fa\u7248\")\n.replace(\"\u8fde\u8f7d4\u5b8c\u7ed3\", \"\u65ad\u66f4\")\n.replace(\"\u8fde\u8f7d-1\u5b8c\u7ed3\", \"\u672a\u77e5\");","lastChapter":"{{$.last_chapter_title}} \u2022 {{$.last_update_time}}","name":"$.book_name","wordCount":"$.word_number"},"ruleSearch":{"author":"$.author||$..copyright","bookList":"<js>\nlet list = [];\nlet book_list = [];\nlet res = JSON.parse(result);\n\ntry {\n  if (res.data.search_tabs) {\n    for (let i = 0; i < res.data.search_tabs.length; i++) {\n        let books = res[\"data\"][\"search_tabs\"][i][\"data\"];\n        if (books != null) list = list.concat(books);\n    }\n  }\n} catch (e) {\n\t\n}\n\nfor (let $ of list) {\n   book_list.push($.book_data ? $.book_data[0] : ($.video_data ? $.video_data[0] : $));\n}\n\nJSON.stringify(book_list)\n<\/js>\n$[*]","bookUrl":"{{api[JSON.parse(source.variable).apiIndex]}}{{action}}detail.php?bookId={{$.book_id||$.series_id}}","checkKeyWord":"m:\u6821\u82b1","coverUrl":"@js:replaceCover(java.getString(\"thumb_url||cover\"))","intro":"$.abstract||$..series_intro##\\n","kind":"\u7537\u751f{{$.gender}}\u5973\u751f\n\u8fde\u8f7d{{$.creation_status}}\u5b8c\u7ed3\n{{$.score}}\u5206\n{{$..text}}\n{{$.sub_info}}\n##\u8fde\u8f7d0|1\u5b8c\u7ed3|\u7537\u751f0|1\u5973\u751f|\u7537\u751f\u5973\u751f[\\s\\S]*\n@js:result\n.replace(\"\u7537\u751f2\u5973\u751f\",\"\u51fa\u7248\")\n.replace(\"\u8fde\u8f7d4\u5b8c\u7ed3\",\"\u65ad\u66f4\")\n.replace(\"\u8fde\u8f7d-1\u5b8c\u7ed3\",\"\u672a\u77e5\");","lastChapter":"$.sub_title","name":"$.book_name||$..series_title##\uff08\u522b\u540d\uff1a.*?\uff09","wordCount":"$.word_number"},"ruleToc":{"chapterList":"@js:\nconst { source: { tab } } = JSON.parse(source.variable);\nbook.type = { 2: 64, 3: 32 }[tab] || 8;\n\nvar u_Index = 0;     \/\/ 0-1\n\/\/ java.log(book)\nvar u_Types = ['API', 'WEB'];\nvar v_Index = [];\nvar v_Names = [];\nvar c_Array = [];\nvar book_id = book.bookUrl.match(\/bookId\\=([0-9]{19})\/)[1];\n\nfunction b64Url(item_id) {\n\t   let type = JSON.stringify({\n\t   \t    type: \"\u661f\u7720\"\n\t   \t});\n\t   \tlet itemId = java.base64Encode(item_id);\n    return `data:content;base64,${itemId},${type}`;\n}\n\nfunction push_a(a, b, c, d) {\n    c_Array.push({\n        \"ChapterName\": a || \"\",\n        \"isVolume\": b || false,\n        \"ChapterUrl\": c ? b64Url(c) : \"\",\n        \"ChapterInfo\": (d || \"\")\/\/.replace(\/\u7b2c.\u5377\uff1a\u9ed8\u8ba4 \\|\/g, \"\").trim(),\n    });\n}\n\nfunction push_b(list) {\n    for (let c of list) {\n        let c_name = c.volume_name || \"\u7b2c\u4e00\u5377\uff1a\u9ed8\u8ba4\";\n        let c_time = java.timeFormatUTC(c.first_pass_time * 1000, 'yyyy-MM-dd HH:mm:ss', 288000000);\n        let c_word = c.chapter_word_number + \"\u5b57\";\n        let c_info = [c_name, c_time, c_word];\n        let v_name = v_Names[v_Names.length - 1];\n        if (v_name != c_name) {\n        \t   \/\/ java.log(c_name);\n            v_Index.push(c_Array.length);\n            v_Names.push(c_name);\n            push_a(c_name, true);\n        }\n        push_a(c.title, false, c.item_id, c_info.join(\" | \"));\n    }\n}\n\n\/\/  app\u63a5\u53e3  ##\u5377\u540d&\u65f6\u95f4&\u5b57\u6570\nswitch (String(u_Types[u_Index])) {\n    case 'API':\n        let data = JSON.parse(java.ajax(xGorgon(\n            \"directory\/all_items\",\n            \"book_id=\" + book_id\n        )));\n\n        if (data.code == 0) {\n            push_b(data.data.item_data_list);\n            break;\n        }\n        \/\/ java.log(\"\u4e0b\u67b6\u4e66\u7c4d\uff0c\u4f7f\u7528web\u63a5\u53e3\u83b7\u53d6\u76ee\u5f55\");\n\n\n\n        \/\/  web\u63a5\u53e3  ##\u5377\u540d&\u65f6\u95f4\n    case 'WEB':\n        let Json, Host = \"https:\/\/fanqienovel.com\";\n        if (false) {\n            Json = java.ajax(Host + \"\/page\/\" + book_id)\n                .match(\/__INITIAL_STATE__=([^;]+)\/)[1];\n        } else {\n            Json = java.ajax(Host + \"\/api\/reader\/directory\/detail?bookId=\" + book_id);\n        }\n        \/\/ java.log(Json)\n        let List = JSON.parse(Json).data.chapterListWithVolume;\n        if (List) {\n          for (let list of List) {\n              v_Index.push(c_Array.length);\n              list.map((_, i) => {\n                  let c_name = _.volume_name || \"\u7b2c\u4e00\u5377\uff1a\u9ed8\u8ba4\";\n                  let c_time = java.timeFormat(_.firstPassTime * 1000);\n                  if (!i) push_a(c_name, true);\n                  push_a(_.title, false, _.itemId, [c_name, c_time].join(\" | \"))\n              });\n          }\n          break;\n        }\n}\n\n\n\n\/\/ \u8fd4\u56de\u6570\u7ec4\nlet len = v_Index.length;\n\/\/ java.log(JSON.stringify(v_Index))\n\/*\nif (len < 2) { \/\/ \u5206\u5377\u592a\u5c11\u4e0d\u663e\u793a\n    for (; len > 0; len--) {\n        c_Array.splice(v_Index[len - 1], 1);\n    }\n} else \n*\/\nif (false) { \/\/ \u663e\u793a\u6548\u679c\u4e0d\u597d\u770b\n    for (let a, b, i = 0; i < len; i++) {\n        a = v_Index[i];\n        b = v_Index[i + 1];\n        if (b == undefined) b = len;\n        c_Array[a][\"ChapterInfo\"] = \"\u5171 \" + (b - a - 1) + \" \u7ae0\";\n    }\n}\n\nc_Array","chapterName":"ChapterName\n@js:\nfunction cleanTitleAdvanced(title) {\n  const parts = title.split(\/\\s*\/);\n  const uniqueParts = [];\n  const seen = new Set();\n  \n  for (const part of parts) {\n    if (\/^\u7b2c\\d+\u7ae0$\/.test(part) && seen.has(part)) {\n      continue;\n    }\n    uniqueParts.push(part);\n    seen.add(part);\n  }\n  \n  return uniqueParts.join(\" \");\n}\n\ncleanTitleAdvanced(result)","chapterUrl":"ChapterUrl","isVolume":"isVolume","updateTime":"ChapterInfo##\/##-"},"searchUrl":"<js>\nlet variable = JSON.parse(source.getVariable());\nconst { source: { tab, mode: show }, apiIndex } = variable;\n\nvar again = false;\nvar keyStr = String(key);\n\nvar prefixMap = {\n    \"m:\": { tab: 2, show: \"\ud83c\udf04\u6f2b\u753b\" },\n    \"t:\": { tab: 3, show: \"\ud83d\udcbf\u542c\u4e66\" },\n    \"d:\": { tab: 4, show: \"\ud83d\udcf9\u77ed\u5267\" }\n};\n\nvar prefixes = [\"m:\", \"t:\", \"d:\"];\nfor (var i = 0; i < prefixes.length; i++) {\n    var prefix = prefixes[i];\n    if (keyStr.indexOf(prefix) === 0) {\n        var config = prefixMap[prefix];\n        tab = config.tab;\n        show = config.show;\n        key = keyStr.substring(2);\n        variable.source.tab = config.tab;\n        variable.source.mode = config.show;\n        again = true;\n        break;\n    }\n}\n\nif (again) {\n    source.setVariable(JSON.stringify(variable));\n}\n\nlet prams = [\n    `query=${key}`,\n    `offset=${( page - 1) * 10}`,\n    `tab=${tab}`\n]\n\nfunction Search(key, apiIndex, prams) {\n\t    let is_id = \/^\\d+$\/.test(key);\n\t    if(!is_id) {\n          let search = api[apiIndex] + action + \"search.php?\" + prams.join(\"&\");\n          return search\n   } else {\n        \t  let book_url = api[apiIndex] + action + \"detail.php?bookId=\" + key;\n   \t       return book_url\n   \t}\n }\n \njava.toast(\"\\n\u5f53\u524d\u6765\u6e90\uff1a\\n\" + show);\njava.put(\"mode\", show);\nSearch(key, apiIndex, prams);\n<\/js>","weight":0},{"bookSourceComment":"\u8bf7\u70b9\u3010\u767b\u5f55\u3011\u67e5\u770b\u4f7f\u7528\u8bf4\u660e","bookSourceName":"\ud83c\udff7\u664b\u6c5f\u6587\u5b66","bookSourceType":0,"bookSourceUrl":"https:\/\/m.jjwxc.net\/channel\/","bookUrlPattern":"https?:\/\/app-cdn.jjwxc.net\/androidapi\/novelbasicinfo\\?novelId=\\d+","customOrder":0,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"exploreUrl":"@js:\nlet token = Map(\"token\");\r\nconst enabledCategories = Map(\"fl\") || \"9,10\";\r\nconst tagNum = Map(\"bq\") || \"5\";\r\ntagName = [\"\u8a00\u60c5\",\"\u7eaf\u7231\",\"\u767e\u5408\",\"\u65e0Cp\",\"\u591a\u5143\"][Number(tagNum)-1];\r\ntagCategory = [1,2,3,5,6][Number(tagNum)-1];\r\nconst at = Map(\"at\");\r\nconst defaultNumPerRow = 0;\r\nconst separator = '::';\r\nconst \u5206\u7c7b\u6807\u8bc6 =\"\ud83c\udf38\"\r\nconst \u699c\u5355\u6807\u8bc6=\"\ud83d\udcd6\"\r\nconst \u6807\u7b7e\u6807\u8bc6=\"\ud83c\udff7\"\r\nlet authorNames = String(java.base64Decode(at || \"\")).split(\" \").filter(name => name.trim() !== \"\");\r\nauthorNames = authorNames.length ? authorNames.map(x => `${x}::::at`) : [];\r\nif (authorNames.length) authorNames.unshift(\"\ud83d\udcd6 \u4f5c\u8005 \ud83d\udcd6::::1\");\r\nlet ShelfNum  = Map(\"classNum\")??\"\"\r\nlet ShelfList = [];\r\n\tif(\/\u2757\ufe0f([\\s\\S]+?)\u2757\ufe0f\/.test(String(source.getVariable()))){\r\n\t\tShelfList =JSON.parse(String(source.getVariable()).match(\/\u2757\ufe0f([\\s\\S]+?)\u2757\ufe0f\/)[1]);\r\n\t\t}else{\r\n\t\t\tShelfNum = \"\"\r\n\t\t\t}\r\n\r\nShelfList = ShelfList.map(item => item + \"::::class\");\r\nlet order = ShelfList.length?ShelfList[0].split(\"::\")[1].split(\",\")[2]:\"0\";\r\n\r\nlet baseApi= \"https:\/\/app.jjwxc.org\/\";\r\nlet topBase = `${baseApi}app.jjwxc\/android\/reading\/TopOneHundred\/getRankData?versionCode=389&type=`;\r\nlet topHeader = `,{\"headers\":{\"versionCode\": \"389\"}}`\r\nlet all = [\r\n  \"\ud83c\udf52 \u5176\u4ed6::::1\",\r\n  `\u70b9\u51fb\u7b7e\u5230::${baseApi}androidapi\/signin,{\\\"method\\\":\\\"POST\\\",\\\"body\\\":\\\"versionCode=313&sign={\\{enbody = String(Date.now())+':'+String(Map('token'));encode(enbody)}}\\\"}`,\n `\u5df2\u8d2d\u4e66\u7c4d::https:\/\/app.jjwxc.org\/app.jjwxc\/android\/reading\/VipService\/vipNovelList?versionCode=467&offset={{100*(page-1)}}&limit=100&notconcerns=0&get_total={{page}},{\"headers\":{\"versionCode\": \"467\",\"sign\":\"{\\{enbody='{\"token\":\"'+String(Map('token'))+'\",\"time\":'+parseInt(Date.now()\/1000)+'}';encode(enbody)}}\"}}`,\r\n  `\u4eca\u65e5\u9650\u514d::${baseApi}bookstore\/getFullPage?channel=novelfree`,\r\n  `\ud83c\udd95\u65b0\u4e66\u5343\u5b57\u699c::{\\{try{a=java.startBrowserAwait(getNewBook(), \"\u8bbe\u7f6e\u7b5b\u9009\",false).body();b=a.match(\/\"select[^\\\\)]+?\\\\('[^']+','\\\\d+'\\\\)\" class=\"selected\">\/g).map(match => {let numberMatch = match.match(\/'(\\\\d+)'\/);return numberMatch ? numberMatch[1] : null;}).filter(Boolean).join(\",\");setHeaders(\"nb=\"+b);}catch(e){};'data:favObservationByDate;base64,${java.base64Encode('\u7b5b\u9009')},{\"type\":\"jjwx\"}'}}::1`].concat(generateDateLinks()).concat([\r\n  \"\u2b06\ufe0f TOP 100::::1\",\r\n  `\u8a00\u60c5::${topBase}yq${topHeader}::5`,\r\n  `\u7eaf\u7231::${topBase}dm${topHeader}::5`,\r\n  `\u884d\u751f::${topBase}tr${topHeader}::5`,\r\n  `\u65e0CP+::${topBase}nocp_plus${topHeader}::5`,\r\n  `\u767e\u5408::${topBase}bh${topHeader}::5`\r\n]);\r\n\r\nconst categories = [\"\u53e4\u4ee3\u8a00\u60c5\",\"\u73b0\u4ee3\u8a00\u60c5\",\"\u5e7b\u60f3\u73b0\u8a00\",\"\u53e4\u4ee3\u7a7f\u8d8a\",\"\u5947\u5e7b\u8a00\u60c5\",\"\u672a\u6765\u6e38\u620f\u60ac\u7591\",\"\u90fd\u5e02\u7eaf\u7231\",\"\u73b0\u4ee3\u5e7b\u7eaf\",\"\u53e4\u4ee3\u7eaf\u7231\",\"\u767e\u5408\",\"\u65e0CP\",\"\u884d\u751f\u65e0CP\",\"\u884d\u751f\u7eaf\u7231\",\"\u884d\u751f\u8a00\u60c5\",\"\u4e8c\u6b21\u5143\u8a00\u60c5\",\"\u591a\u5143\",\"\u7537\u4e3b\u65e0CP\",\"\u5973\u4e3b\u65e0CP\",\"\u672a\u6765\u5e7b\u7eaf\"];\r\nconst cateType = [\"\u9891\u9053\u91d1\u699c\",\"\u8fd0\u6c14\u6dd8\u6587\",\"\u52e4\u594b\u66f4\u65b0\",\"\u6df1\u8015\u6392\u884c\",\"\u80b2\u82d7\u5b9e\u9a8c\",\"VIP\u65b0\u6587\",\"\u65b0\u664b\u4f5c\u8005\",\"\u6708\u5ea6\u6392\u884c\",\"\u5b63\u5ea6\u6392\u884c\",\"\u534a\u5e74\u6392\u884c\"];\r\nconst cateTag = [\"\u8fde\u8f7d\",\"\u5b8c\u7ed3\",\"\u699c\u5355\"];\r\nconst na = \"natural_\";\r\nconst cateNum = [\r\n  \/\/\u53e4\u4ee3\u8a00\u60c5\r\n    [\r\n        [\"\u590d\u4ec7\u8650\u6e23\",\"\u91cd\u751f\",\"\u5bab\u5ef7\u4faf\u7235\",\"\u67b6\u7a7a\u5386\u53f2\",\"\u5e03\u8863\u751f\u6d3b\",\"\u53e4\u9999\u53e4\u8272\",\"\u79d1\u4e3e\u671d\u5802\",\"\u52b1\u5fd7\u4eba\u751f\",\"\u5e02\u4e95\u4eba\u5bb6\",\"\u5973\u5c0a\u5973\u5f3a\",\"\u4f20\u5947\u6b66\u4fa0\"],\r\n        [`${na}16`,`${na}12`,`${na}11`,`${na}13`,`${na}9`,`${na}8`,`${na}18`,`${na}19`,`${na}17`,`${na}14`,`${na}15`],\r\n        [`${na}33`,`${na}29`,`${na}28`,`${na}30`, `${na}26`,`${na}25`,`${na}35`,`${na}36`,`${na}34`,`${na}31`,`${na}32`],\r\n        [`${na}23`,`40000001`,`${na}1482`,`${baseApi}newBookStoreAndroid\/getRankMoreData?channel=101&ranktype=deep`,`90001000_101`,`${na}3`,`${na}4`,`${na}5`,`${na}6`,`${na}7`]   \r\n    ],\r\n    \/\/\u73b0\u4ee3\u8a00\u60c5\r\n    [\r\n        [\"\u5929\u4e4b\u9a84\u5b50\",\"\u8c6a\u95e8\u4e16\u5bb6\",\"\u52b1\u5fd7\u4eba\u751f\",\"\u5a31\u4e50\u661f\u5149\",\"\u5a5a\u524d\u5a5a\u540e\",\"\u65f6\u4ee3\u65b0\u98ce\",\"\u6821\u56ed\u9752\u6625\",\"\u90fd\u5e02\u60c5\u7f18\",\"\u751c\u5fc3\u871c\u610f\",\"\u7834\u955c\u91cd\u5706\",\"\u8fd1\u6c34\u697c\u53f0\",\"\u60c5\u6709\u72ec\u949f\",\"\u65f6\u5c1a\u6d41\u884c\",\"\u6b22\u559c\u51a4\u5bb6\",\"\u56e0\u7f18\u9082\u9005\"],\r\n        [`${na}52`,`${na}44`,`${na}46`,`${na}53`,`${na}47`,`${na}51`,`${na}73`,`${na}48`,`${na}75`,`${na}49`,`${na}50`,`${na}76`,`${na}74`,`${na}54`,`${na}55`],\r\n        [`${na}69`,`${na}61`,`${na}63`,`${na}70`,`${na}64`,`${na}68`,`${na}77`,`${na}65`,`${na}79`,`${na}66`,`${na}67`,`${na}80`,`${na}78`,`${na}71`,`${na}72`],\r\n        [`${na}59`,\"40000002\",`${na}1483`,`${baseApi}newBookStoreAndroid\/getRankMoreData?channel=102&ranktype=deep`,`90001000_102`,`${na}39`,`${na}40`,`${na}41`,`${na}42`,`${na}43`]\r\n    ],\r\n    \/\/\u5e7b\u60f3\u73b0\u8a00\r\n    [\r\n        [\"\u6d41\u91d1\u5e74\u4ee3\",\"\u8c6a\u95e8\u4e16\u5bb6\",\"\u5a31\u4e50\u65f6\u5c1a\",\"\u5feb\u7a7f\u7cfb\u7edf\",\"\u79cd\u7530\u65e5\u5e38\",\"\u6253\u8138\u723d\u6587\",\"\u91cd\u542f\u4eba\u751f\",\"\u90fd\u5e02\u5f02\u95fb\",\"\u7a7f\u8d8a\u65f6\u7a7a\",\"\u795e\u5947\u80fd\u529b\",\"\u5347\u7ea7\u9006\u88ad\",\"\u65f6\u4ee3\u5947\u7f18\",\"\u4eba\u751f\u8d62\u5bb6\",\"\u73b0\u4ee3\u67b6\u7a7a\",\"\u5e7b\u60f3\u4f20\u5947\"],\r\n        [`${na}107`,`${na}100`,`${na}108`,`${na}97`,`${na}98`,`${na}106`,`${na}105`,`${na}109`,`${na}104`,`${na}102`,`${na}103`,`${na}99`,`${na}96`,`${na}95`,`${na}94`],  \r\n        [`${na}123`,`${na}116`,`${na}124`,`${na}113`,`${na}114`,`${na}121`,`${na}109`,`${na}119`,`${na}110`,`${na}118`,`${na}120`,`${na}112`,`${na}111`,`${na}117`,`${na}115`],\r\n        [`${na}86`,\"40000003\",`${na}1484`,`${baseApi}newBookStoreAndroid\/getRankMoreData?channel=103&ranktype=deep`,\"90001000_103\",`${na}84`,`${na}87`,`${na}81`,`${na}82`,`${na}88`]\r\n    ],\r\n    \/\/\u53e4\u4ee3\u7a7f\u8d8a\r\n    [\r\n        [ \"\u590d\u4ec7\u8650\u6e23\",\"\u5bab\u5ef7\u4faf\u7235\",\"\u67b6\u7a7a\u7a7f\u8d8a\",\"\u7cfb\u7edf\u5feb\u7a7f\",\"\u5386\u53f2\u7a7f\u8d8a\",\"\u79d1\u4e3e\u671d\u5802\",\"\u5e03\u8863\u751f\u6d3b\",\"\u6b22\u559c\u51a4\u5bb6\",\"\u5973\u5c0a\u5973\u5f3a\",\"\u5e02\u4e95\u4eba\u5bb6\",\"\u5f02\u4e16\u7a7f\u4e66\"],\r\n        [`${na}148`,`${na}142`,`${na}140`,`${na}147`,`${na}139`,`${na}146`,`${na}141`,`${na}143`,`${na}138`,`${na}145`,`${na}144`],\r\n        [`${na}164`,`${na}158`,`${na}156`,`${na}163`,`${na}155`,`${na}162`,`${na}157`,`${na}159`,`${na}154`,`${na}161`,`${na}160`],\r\n        [ `${na}130`,\"40000004\",`${na}1485`,`${baseApi}newBookStoreAndroid\/getRankMoreData?channel=104&ranktype=deep`,\"90001000_104\",`${na}128`,`${na}131`,`${na}125`,`${na}126`,`${na}132`]\r\n    ],\r\n    \/\/\u5947\u5e7b\u8a00\u60c5\r\n    [\r\n      [\"\u5929\u4f5c\u4e4b\u5408\",\"\u897f\u65b9\u5947\u5e7b\",\"\u723d\u6587\",\"\u5947\u5e7b\u751c\u5ba0\",\"\u5347\u7ea7\u9006\u88ad\",\"\u4e1c\u65b9\u7384\u5e7b\",\"\u7075\u5f02\u795e\u602a\",\"\u7a7f\u4e66\u5f02\u80fd\",\"\u7cfb\u7edf\u7a7f\u8d8a\",\"\u91d1\u624b\u6307\",\"\u53e6\u7c7b\u5e7b\u60f3\"],\r\n      [`${na}179`,`${na}183`,`${na}181`,`${na}177`,`${na}188`,`${na}186`,`${na}182`,`${na}187`,`${na}185`,`${na}184`,`${na}180`],\r\n      [`${na}191`,`${na}195`,`${na}193`,`${na}189`,`${na}200`,`${na}198`,`${na}194`,`${na}199`,`${na}197`,`${na}196`,`${na}192`],\r\n      [`${na}170`,\"40000005\",`${na}1486`,`${baseApi}newBookStoreAndroid\/getRankMoreData?channel=105&ranktype=deep`,\"90001000_105\",`${na}68`,`${na}71`,`${na}165`,`${na}166`,`${na}172`]\r\n    ],\r\n    \/\/\u672a\u6765\u6e38\u620f\u60ac\u7591\r\n    [\r\n      [\"\u8d5b\u535a\u5e9f\u571f\",\"\u65e0\u9650\u9886\u57df\",\"\u57fa\u5efa\u79cd\u7530\",\"\u672b\u4e16\u5f02\u4e16\",\"\u89c4\u5219\u602a\u8c08\",\"\u6e38\u620f\u5a31\u4e50\",\"\u60ac\u7591\u60ca\u609a\",\"\u7cfb\u7edf\u5f02\u80fd\",\"\u7a7f\u4e66\u5feb\u7a7f\",\"\u5347\u7ea7\u723d\u6587\",\"\u91cd\u751f\u7a7f\u8d8a\",\"\u672a\u6765\u79d1\u5e7b\",\"\u63a8\u7406\u63a2\u6848\",\"\u5e7b\u60f3\u751c\u5ba0\",\"\u5f02\u5ea6\u5e7b\u60f3\"],\r\n      [`${na}225`,`${na}222`,`${na}226`,`${na}215`,`${na}223`,`${na}216`,`${na}220`,`${na}221`,`${na}227`,`${na}224`,`${na}219`,`${na}217`,`${na}214`,`${na}228`,`${na}218`],\r\n      [`${na}241`,`${na}238`,`${na}242`,`${na}231`,`${na}239`,`${na}232`,`${na}236`,`${na}237`,`${na}243`,`${na}240`,`${na}235`,`${na}233`,`${na}230`,`${na}244`,`${na}234`],\r\n      [`${na}206`,\"40000006\",`${na}1487`,`${baseApi}newBookStoreAndroid\/getRankMoreData?channel=106&ranktype=deep`,\"90001000_106\",`${na}204`,`${na}207`,`${na}201`,`${na}202`,`${na}208`]\r\n    ],\r\n    \/\/\u90fd\u5e02\u7eaf\u7231\r\n    [\r\n      [\"\u65f6\u5c1a\u5a31\u4e50\",\"\u79cd\u7530\u65e5\u5e38\",\"\u73b0\u4ee3\u90fd\u5e02\",\"\u8c6a\u95e8\u4e16\u5bb6\",\"\u4e1a\u754c\u7cbe\u82f1\",\"\u91cd\u751f\",\"\u8fb9\u7f18\u604b\u66f2\",\"\u6821\u56ed\u9752\u6625\",\"\u5a5a\u524d\u5a5a\u540e\",\"\u7a7f\u8d8a\u65f6\u7a7a\",\"\u6210\u957f\u52b1\u5fd7\",\"\u6b22\u559c\u51a4\u5bb6\",\"\u60c5\u6709\u72ec\u949f\",\"\u90fd\u5e02\u751c\u6587\",\"\u6253\u8138\u9006\u88ad\"],\r\n      [`${na}270`,`${na}266`,`${na}260`,`${na}267`,`${na}265`,`${na}259`,`${na}264`,`${na}261`,`${na}272`,`${na}262`,`${na}268`,`${na}257`,`${na}271`,`${na}258`,`${na}263`],\r\n      [`${na}286`,`${na}282`,`${na}276`,`${na}283`,`${na}281`,`${na}275`,`${na}280`,`${na}277`,`${na}288`,`${na}278`,`${na}284`,`${na}273`,`${na}287`,`${na}274`,`${na}279`],\r\n      [`${na}250`,\"40000007\",`${na}1488`,`${baseApi}newBookStoreAndroid\/getRankMoreData?channel=107&ranktype=deep`,\"90001000_107\",`${na}248`,`${na}251`,`${na}245`,`${na}246`,`${na}252`]\r\n    ],\r\n    \/\/\u73b0\u4ee3\u5e7b\u7eaf\r\n    [\r\n      [\"\u5a31\u4e50\u661f\u5149\",\"\u840c\u5ba0\u9891\u9053\",\"\u5f02\u95fb\u79d8\u672f\",\"\u5feb\u7a7f\u4e16\u754c\",\"\u5947\u5e7b\u7075\u5f02\",\"\u5e7b\u60f3\u751c\u5ba0\",\"\u65e0\u9650\u6d41\",\"\u7cfb\u7edf\",\"\u8fb9\u7f18\u5e7b\u60f3\",\"\u60c5\u6709\u72ec\u949f\",\"\u5347\u7ea7\u723d\u6587\"],\r\n      [`${na}517`,`${na}515`,`${na}514`,`${na}511`,`${na}523`,`${na}521`,`${na}509`,`${na}512`,`${na}516`,`${na}520`,`${na}522`],\r\n      [`${na}533`,`${na}531`,`${na}530`,`${na}527`,`${na}539`,`${na}537`,`${na}525`,`${na}528`,`${na}532`,`${na}536`,`${na}538`],\r\n      [`${na}502`,\"40000013\",`${na}1495`,`${baseApi}newBookStoreAndroid\/getRankMoreData?channel=118&ranktype=deep`,\"90001000_118\",`${na}500`,`${na}503`,`${na}497`,`${na}498`,`${na}504`]\r\n    ],\r\n    \/\/\u53e4\u4ee3\u7eaf\u7231\r\n    [\r\n      [\"\u4ed9\u4fa0\u4fee\u771f\",\"\u5e03\u8863\u751f\u6d3b\",\"\u6b66\u4fa0\u4f20\u5947\",\"\u897f\u5e7b\u5f02\u4e16\",\"\u7a7f\u8d8a\u65f6\u7a7a\",\"\u91cd\u751f\",\"\u53e4\u4ee3\u5e7b\u60f3\",\"\u7cfb\u7edf\u5feb\u7a7f\",\"\u7384\u5e7b\u7075\u5f02\",\"\u5929\u4f5c\u4e4b\u5408\",\"\u5347\u7ea7\u9006\u88ad\"],\r\n      [`${na}298 `,`${na}297`,`${na}307`,`${na}301`,`${na}303`,`${na}302`,`${na}299`,`${na}304`,`${na}305`,`${na}306`,`${na}300`],\r\n      [`${na}315`,`${na}314`,`${na}324`,`${na}318`,`${na}320`,`${na}319`,`${na}316`,`${na}321`,`${na}322`,`${na}323`,`${na}317`],\r\n      [`${na}311`,\"40000008\",`${na}1489`,`${baseApi}newBookStoreAndroid\/getRankMoreData?channel=108&ranktype=deep`,\"90001000_108\",`${na}291`,`${na}292`,`${na}293`,`${na}294`,`${na}295`]\r\n    ],\r\n    \/\/\u767e\u5408\r\n    [\r\n      [\"\u5e7b\u60f3\u672a\u6765\",\"\u67b6\u7a7a\u5386\u53f2\",\"\u90fd\u5e02\u60c5\u7f18\",\"\u7a7f\u8d8a\u65f6\u7a7a\",\"\u5929\u8d50\u826f\u7f18\",\"\u65f6\u5c1a\u5a31\u4e50\",\"\u5947\u5e7b\u5f02\u95fb\",\"\u7cfb\u7edf\u5feb\u7a7f\",\"\u5bab\u5ef7\u4faf\u7235\",\"\u4e1a\u754c\u7cbe\u82f1\",\"\u60c5\u6709\u72ec\u949f\"],\r\n      [`${na}336`,`${na}334`,`${na}337`,`${na}335`,`${na}338`,`${na}339`,`${na}333`,`${na}342`,`${na}340`,`${na}341`,`${na}343`],\r\n      [`${na}353`,`${na}351`,`${na}354`,`${na}352`,`${na}355`,`${na}356`,`${na}350`,`${na}359`,`${na}357`,`${na}58`,`${na}360`],\r\n      [`${na}1072`,\"40000009\",`${na}1490`,`${baseApi}newBookStoreAndroid\/getRankMoreData?channel=9&ranktype=deep`,\"90001000_9\",`${na}1069`,`${na}1045`,`${na}1043`,`${na}1042`,`${na}1044`]\r\n    ],\r\n    \/\/\u65e0CP\r\n    [\r\n      [\"\u672a\u6765\u5e7b\u60f3-\u5973\u4e3b\",\"\u90fd\u5e02\u6210\u957f-\u7537\u4e3b\",\"\u90fd\u5e02\u6210\u957f-\u5973\u4e3b\",\"\u53e4\u4ee3\u67b6\u7a7a-\u7537\u4e3b\",\"\u53e4\u4ee3\u67b6\u7a7a-\u5973\u4e3b\",\"\u65e0\u9650\u5feb\u7a7f-\u7537\u4e3b\",\"\u65e0\u9650\u5feb\u7a7f-\u5973\u4e3b\"],\r\n      [`${na}477`,`${na}478`,`${na}479`,`${na}480`,`${na}481`,`${na}482`,`${na}483`],\r\n      [`${na}490`,`${na}491`,`${na}492`,`${na}493`,`${na}494`,`${na}495`,`${na}496`],\r\n      [`${na}487`,`40000014`,`${na}1494`,`${baseApi}newBookStoreAndroid\/getRankMoreData?channel=114&ranktype=deep`,`90001000_114`,`${na}471`,`${na}472`,`${na}473`,`${na}474`,`${na}475`]\r\n    ],\r\n    \/\/\u884d\u751f\u65e0CP\r\n    [\r\n      [\"\u5e7b\u60f3\u8f7b\u5c0f\u8bf4\",\"\u4e1c\u65b9\u884d\u751f\",\"\u897f\u65b9\u884d\u751f\",\"\u4e8c\u6b21\u5143\u70ed\u8840\",\"\u4e8c\u6b21\u5143\u5e7b\u60f3\",\"\u4e8c\u6b21\u5143\u5f02\u80fd\",\"\u5973\u4e3b\u5411\"],\r\n      [`${na}549`,`${na}550`,`${na}555`,`${na}552`,`${na}553`,`${na}554`,`${na}551`],\r\n      [`${na}562`,`${na}563`,`${na}568`,`${na}565`,`${na}566`,`${na}567`,`${na}564`],\r\n      [`${na}559`,`40000015`,`${na}1496`,`${baseApi}newBookStoreAndroid\/getRankMoreData?channel=120&ranktype=deep`,`90001000_120`,`${na}543`,`${na}544`,`${na}545`,`${na}546`,`${na}547`]\r\n    ],\r\n    \/\/\u884d\u751f\u7eaf\u7231\r\n    [\r\n      [\"\u897f\u65b9\u7f57\u66fc\",\"\u90fd\u5e02\u8f7b\u5c0f\u8bf4\",\"\u5e7b\u60f3\u8f7b\u5c0f\u8bf4\",\"\u4e8c\u6b21\u5143\u70ed\u8840\",\"\u4e8c\u6b21\u5143\u5e7b\u60f3\",\"\u4e8c\u6b21\u5143\u5f02\u80fd\",\"\u5176\u4ed6\u884d\u751f\"],\r\n      [`${na}373`,`${na}376`,`${na}377`,`${na}378`,`${na}379`,`${na}369`,`${na}372`],\r\n      [`${na}390`,`${na}393`,`${na}394`,`${na}395`,`${na}396`,`${na}386`,`${na}389`],\r\n      [`${na}383`,`40000010`,`${na}1491`,`${baseApi}newBookStoreAndroid\/getRankMoreData?channel=110&ranktype=deep`,`90001000_110`,`${na}363`,`${na}364`,`${na}365`,`${na}366`,`${na}367`]\r\n    ],\r\n    \/\/\u884d\u751f\u8a00\u60c5\r\n    [\r\n      [\"\u5386\u53f2\u4f20\u5947\",\"\u897f\u65b9\u7f57\u66fc\",\"\u65e0\u9650\u5feb\u7a7f\",\"\u6c5f\u6e56\u6069\u6028\",\"\u5a31\u4e50\u7ade\u6280\",\"\u4e1c\u65b9\u5e7b\u60f3\",\"\u5176\u4ed6\"],\r\n      [`${na}450`,`${na}449`,`${na}451`,`${na}453`,`${na}454`,`${na}452`,`${na}455`],\r\n      [`${na}463`,`${na}462`,`${na}464`,`${na}466`,`${na}467`,`${na}465`,`${na}468`],\r\n      [`${na}459`,`40000012`,`${na}1493`,`${baseApi}newBookStoreAndroid\/getRankMoreData?channel=112&ranktype=deep`,`90001000_112`,`${na}443`,`${na}444`,`${na}445`,`${na}446`,`${na}447`]\r\n    ],\r\n    \/\/\u4e8c\u6b21\u5143\u8a00\u60c5\r\n    [\r\n      [\"\u591a\u91cd\u8eab\u4efd\",\"\u7ecf\u8425\u57fa\u5efa\",\"\u7ade\u6280\u793e\u56e2\",\"\u4e1c\u65b9\u53e4\u98ce\",\"\u897f\u5e7b\u9b54\u5e7b\",\"\u4e59\u5973\u6e38\u620f\",\"\u5f02\u80fd\u8d85\u80fd\",\"\u8f6c\u751f\",\"\u5f02\u95fb\u602a\u8c08\",\"\u6d6a\u6f2b\u60c5\u7f18\",\"\u65b0\u5947\u5e7b\u60f3\"],\r\n      [`${na}415`,`${na}418`,`${na}422`,`${na}412`,`${na}413`,`${na}414`,`${na}417`,`${na}420`,`${na}421`,`${na}419`,`${na}423`],\r\n      [`${na}432`,`${na}435`,`${na}439`,`${na}429`,`${na}430`,`${na}431`,`${na}434`,`${na}437`,`${na}438`,`${na}436`,`${na}440`],\r\n      [`${na}427`,`40000011`,`${na}1492`,`${baseApi}newBookStoreAndroid\/getRankMoreData?channel=111&ranktype=deep`,`90001000_111`,`${na}407`,`${na}408`,`${na}409`,`${na}410`,`${na}411`]\r\n    ],\r\n    \/\/\u591a\u5143\r\n    [\r\n      [],[],[],\r\n      [`${na}1010`,\"\",\"\",\"\",`90001000_121`,`${na}1011`,`${na}1013`,`${na}1012`,`${na}1014`,`${na}1518`]\r\n    ],\r\n    \/\/\u7537\u4e3b\u65e0CP\r\n    [\r\n      [\"\u90fd\u5e02\u6210\u957f\",\"\u53e4\u4ee3\u67b6\u7a7a\",\"\u65e0\u9650\u5feb\u7a7f\"],\r\n      [`${na}491`,`${na}493`,`${na}495`],\r\n      [`${na}491`,`${na}493`,`${na}495`],\r\n      [`${na}992`,\"\",`${na}1515`,\"\",\"\",`${na}986`,`${na}987`,`${na}988`,`${na}989`,`${na}990`]\r\n    ],\r\n    \/\/\u5973\u4e3b\u65e0CP\r\n    [\r\n      [\"\u90fd\u5e02\u6210\u957f\",\"\u53e4\u4ee3\u67b6\u7a7a\",\"\u65e0\u9650\u5feb\u7a7f\"],\r\n      [`${na}479`,`${na}481`,`${na}483`],\r\n      [`${na}492`,`${na}494`,`${na}496`],\r\n      [`${na}1000`,\"\",`${na}1516`,\"\",\"\",`${na}994`,`${na}995`,`${na}996`,`${na}997`,`${na}998`]\r\n    ],\r\n    \/\/\u672a\u6765\u5e7b\u7eaf\r\n    [\r\n      [\"\u5a31\u4e50\u7ade\u6280\",\"\u5feb\u7a7f\",\"\u65e0\u9650\u6d41\",\"\u7cfb\u7edf\",\"\u672b\u4e16\u72c2\u60f3\",\"\u5e7b\u60f3\u751c\u5ba0\",\"\u661f\u9645\u65e5\u5e38\",\"\u5947\u5e7b\u5f02\u60f3\",\"\u8fb9\u7f18\u5e7b\u60f3\",\"\u672a\u6765\u7545\u60f3\",\"\u5347\u7ea7\u723d\u6587\"],\r\n      [`${na}1112`,`${na}1113`,`${na}1114`,`${na}1115`,`${na}1116`,`${na}1117`,`${na}1118`,`${na}1119`,`${na}1120`,`${na}1121`,`${na}1122`],\r\n      [`${na}1128`,`${na}1129`,`${na}1130`,`${na}1131`,`${na}1132`,`${na}1133`,`${na}1134`,`${na}1135`,`${na}1136`,`${na}1137`,`${na}1138`],\r\n      [`${na}1104`,`wlhxca`,`${na}1497`,`${baseApi}newBookStoreAndroid\/getRankMoreData?channel=126&ranktype=deep`,`90001000_126`,`${na}1102`,`${na}1105`,`${na}1099`,`${na}1100`,`${na}1106`]\r\n    ]\r\n]; \r\n\r\n\/\/ \u6807\u7b7e\u6570\u636e\r\nconst tags = [\"\u8f7b\u677e::262::::bq\",\"\u723d\u6587::137::::bq\",\"\u751c\u6587::124::::bq\",\"\u6b63\u5267::263::::bq\",\"\u7a7f\u4e66::134::::bq\",\"\u5f3a\u5f3a::19::::bq\",\"\u7cfb\u7edf::122::::bq\",\"\u6210\u957f::183::::bq\",\"\u91cd\u751f::75::::bq\",\"\u60ca\u609a::9::::lx\",\"\u60ac\u7591::10::::lx\",\"\u5267\u60c5::16::::lx\",\"\u5feb\u7a7f::125::::bq\",\"\u76f4\u64ad::142::::bq\",\"\u9006\u88ad::184::::bq\",\"\u52b1\u5fd7::121::::bq\",\"\u6253\u8138::138::::bq\",\"\u5973\u5f3a::82::::bq\",\"\u5f02\u80fd::72::::bq\",\"\u57fa\u5efa::237::::bq\",\"\u6551\u8d4e::329::::bq\",\"\u5973\u914d::96::::bq\",\"\u6697\u604b::314::::bq\",\"\u672b\u4e16::81::::bq\",\"\u60ca\u609a::29::::bq\",\"\u5a5a\u604b::78::::bq\",\"\u79d1\u5e7b::28::::bq\",\"\u70ae\u7070::305::::bq\",\"\u5f00\u6302::344::::bq\",\"\u7ecf\u8425::180::::bq\",\"\u8111\u6d1e::273::::bq\",\"\u70e7\u8111::269::::bq\",\"\u7231\u60c5::1::::lx\",\"\u6b66\u4fa0::2::::lx\",\"\u5947\u5e7b::3::::lx\",\"\u4ed9\u4fa0::4::::lx\",\"\u6e38\u620f::5::::lx\",\"\u4f20\u5947::6::::lx\",\"\u79d1\u5e7b::7::::lx\",\"\u7ae5\u8bdd::8::::lx\",\"\u90fd\u5e02::30::::bq\",\"\u6821\u56ed::185::::bq\",\"\u7efc\u6f2b::6::::bq\",\"\u661f\u9645::135::::bq\",\"\u65e5\u5e38::268::::bq\",\"\u67ef\u5357::241::::bq\",\"\u5e74\u4e0b::21::::bq\",\"\u5492\u56de::240::::bq\",\"\u6c99\u96d5::266::::bq\",\"\u7f8e\u98df::99::::bq\",\"\u751f\u5b50::20::::bq\",\"\u7fa4\u50cf::356::::bq\",\"\u840c\u5ba0::205::::bq\",\"\u6587\u91ce::208::::bq\",\"\u6cbb\u6108::265::::bq\",\"\u56e2\u5ba0::287::::bq\",\"\u7206\u7b11::261::::bq\",\"\u897f\u5e7b::143::::bq\",\"\u9b54\u5e7b::27::::bq\",\"\u7efc\u827a::335::::bq\",\"\u70ed\u8840::267::::bq\",\"\u5e9f\u571f::281::::bq\",\"\u6e05\u7a7f::18::::bq\",\"\u671d\u5802::178::::bq\",\"\u866b\u65cf::260::::bq\",\"\u7384\u5b66::206::::bq\",\"\u840c\u5a03::302::::bq\",\"\u9493\u7cfb::298::::bq\",\"\u7535\u7ade::328::::bq\",\"\u6e2f\u98ce::282::::bq\",\"\u5168\u606f::276::::bq\",\"\u5bab\u6597::74::::bq\",\"\u5267\u900f::343::::bq\",\"\u79d1\u4e3e::174::::bq\",\"\u673a\u7532::97::::bq\",\"\u8650\u6587::42::::bq\",\"\u7f51\u738b::1::::bq\",\"\u539f\u795e::371::::bq\",\"\u53e4\u65e9::275::::bq\",\"\u5e08\u5f92::292::::bq\",\"\u5bb6\u6559::12::::bq\",\"\u6c5f\u6e56::35::::bq\",\"\u5fe0\u72ac::312::::bq\",\"\u6b66\u4fa0::11::::bq\",\"\u4e03\u4e94::8::::bq\",\"\u5b85\u6597::73::::bq\",\"\u8179\u9ed1::290::::bq\",\"\u6743\u8c0b::326::::bq\",\"\u5931\u5fc6::320::::bq\",\"\u730e\u4eba::5::::bq\",\"\u6d2a\u8352::67::::bq\",\"\u5361\u724c::357::::bq\",\"\u804c\u573a::98::::bq\",\"\u5fa1\u59d0::310::::bq\",\"\u76f2\u76d2::345::::bq\",\"\u5410\u69fd::270::::bq\",\"\u66ff\u8eab::286::::bq\",\"\u9884\u77e5::346::::bq\",\"\u521b\u4e1a::330::::bq\",\"\u8db3\u7403::368::::bq\",\"BE::317::::bq\",\"HE::318::::bq\",\"ABO::259::::bq\",\"APP::338::::bq\",\"NPC::293::::bq\",\"\u54e8\u5411::369::::bq\",\"\u7530\u56ed::58::::bq\",\"\u4e2d\u4e8c::375::::bq\",\"\u7fa4\u7a7f::352::::bq\",\"\u5947\u8c2d::197::::bq\",\"\u56e4\u8d27::322::::bq\",\"\u4f4d\u9762::350::::bq\",\"\u5b66\u9738::309::::bq\",\"\u50b2\u5a07::294::::bq\",\"\u6c11\u56fd::61::::bq\",\"\u9b3c\u706d::254::::bq\",\"\u5f00\u8352::331::::bq\",\"\u5546\u6218::123::::bq\",\"\u8f6c\u751f::362::::bq\",\"\u9526\u9ca4::349::::bq\",\"\u9f50\u795e::201::::bq\",\"\u8840\u65cf::69::::bq\",\"\u7f51\u7ea2::141::::bq\",\"\u73b0\u5b9e::271::::bq\",\"\u6276\u8d2b::324::::bq\",\"\u5c01\u795e::215::::bq\",\"\u51b0\u5c71::296::::bq\",\"\u804a\u658b::188::::bq\",\"\u5929\u964d::308::::bq\",\"\u7f8e\u5a31::140::::bq\",\"\u6bd2\u820c::299::::bq\",\"\u975e\u9057::323::::bq\",\"\u5403\u8d27::297::::bq\",\"\u5fa1\u517d::365::::bq\",\"\u60b2\u5267::264::::bq\",\"\u6e2f\u53f0::87::::bq\",\"\u7f51\u914d::84::::bq\",\"\u66f2\u827a::306::::bq\",\"\u5a46\u5ab3::80::::bq\",\"\u6076\u5f79::359::::bq\",\"\u8f7b\u5c0f\u8bf4::17::::lx\",\"\u5a31\u4e50\u5708::64::::bq\",\"\u65e0\u9650\u6d41::83::::bq\",\"\u5347\u7ea7\u6d41::139::::bq\",\"\u79cd\u7530\u6587::66::::bq\",\"\u5e74\u4ee3\u6587::173::::bq\",\"\u4e07\u4eba\u8ff7::295::::bq\",\"\u7f8e\u5f3a\u60e8::291::::bq\",\"\u5c11\u5e74\u6f2b::90::::bq\",\"\u9a6c\u7532\u6587::243::::bq\",\"\u514b\u82cf\u9c81::283::::bq\",\"\u767d\u6708\u5149::313::::bq\",\"\u5355\u5143\u6587::355::::bq\",\"\u9ad8\u667a\u5546::311::::bq\",\"\u8bfb\u5fc3\u672f::337::::bq\",\"\u65f6\u5c1a\u5708::182::::bq\",\"\u8fea\u5316\u6d41::370::::bq\",\"\u9f99\u50b2\u5929::289::::bq\",\"\u8bba\u575b\u4f53::354::::bq\",\"\u5bf9\u7167\u7ec4::316::::bq\",\"\u53e4\u7a7f\u4eca::65::::bq\",\"\u7ea2\u697c\u68a6::15::::bq\",\"\u53cd\u5957\u8def::274::::bq\",\"\u795e\u8c6a\u6d41::348::::bq\",\"\u7eb8\u7247\u4eba::288::::bq\",\"\u65e5\u97e9\u6cf0::86::::bq\",\"\u7b7e\u5230\u6d41::351::::bq\",\"\u8bfb\u6863\u6d41::340::::bq\",\"\u53ec\u5524\u6d41::347::::bq\",\"\u5927\u5192\u9669::198::::bq\",\"\u59d0\u5f1f\u604b::186::::bq\",\"\u6a21\u62df\u5668::358::::bq\",\"\u4e59\u5973\u5411::360::::bq\",\"\u5c11\u5973\u6f2b::14::::bq\",\"\u5410\u69fd\u5f79::366::::bq\",\"\u72ac\u591c\u53c9::257::::bq\",\"\u7ea2\u5305\u7fa4::341::::bq\",\"\u4e2d\u4e16\u7eaa::280::::bq\",\"\u5bf9\u8bdd\u4f53::353::::bq\",\"\u60c5\u6709\u72ec\u949f::39::::bq\",\"\u7a7f\u8d8a\u65f6\u7a7a::60::::bq\",\"\u5929\u4f5c\u4e4b\u5408::52::::bq\",\"\u5929\u4e4b\u9a84\u5b50::54::::bq\",\"\u8c6a\u95e8\u4e16\u5bb6::33::::bq\",\"\u5bab\u5ef7\u4faf\u7235::32::::bq\",\"\u4ed9\u4fa0\u4fee\u771f::68::::bq\",\"\u7834\u955c\u91cd\u5706::47::::bq\",\"\u4e1a\u754c\u7cbe\u82f1::101::::bq\",\"\u7075\u5f02\u795e\u602a::26::::bq\",\"\u5e7b\u60f3\u7a7a\u95f4::25::::bq\",\"\u5148\u5a5a\u540e\u7231::315::::bq\",\"\u6b22\u559c\u51a4\u5bb6::41::::bq\",\"\u60ac\u7591\u63a8\u7406::128::::bq\",\"\u6e38\u620f\u7f51\u6e38::92::::bq\",\"\u65f6\u4ee3\u5947\u7f18::22::::bq\",\"\u9752\u6885\u7af9\u9a6c::62::::bq\",\"\u56e0\u7f18\u9082\u9005::45::::bq\",\"\u73b0\u4ee3\u67b6\u7a7a::126::::bq\",\"\u76f8\u7231\u76f8\u6740::103::::bq\",\"\u82b1\u5b63\u96e8\u5b63::31::::bq\",\"\u672a\u6765\u67b6\u7a7a::127::::bq\",\"\u604b\u7231\u5408\u7ea6::48::::bq\",\"\u82f1\u7f8e\u884d\u751f::17::::bq\",\"\u4f53\u80b2\u7ade\u6280::70::::bq\",\"\u8fd1\u6c34\u697c\u53f0::46::::bq\",\"\u8d85\u7ea7\u82f1\u96c4::132::::bq\",\"\u4e1c\u65b9\u7384\u5e7b::144::::bq\",\"\u5e03\u8863\u751f\u6d3b::38::::bq\",\"\u4e54\u88c5\u6539\u626e::51::::bq\",\"\u89c4\u5219\u602a\u8c08::361::::bq\",\"\u590d\u4ec7\u8650\u6e23::145::::bq\",\"\u5f02\u4e16\u5927\u9646::57::::bq\",\"\u9ad8\u5cad\u4e4b\u82b1::301::::bq\",\"\u5e02\u4e95\u751f\u6d3b::175::::bq\",\"\u8d5b\u535a\u670b\u514b::277::::bq\",\"\u5973\u626e\u7537\u88c5::136::::bq\",\"\u968f\u8eab\u7a7a\u95f4::56::::bq\",\"\u7b2c\u56db\u5929\u707e::285::::bq\",\"\u524d\u4e16\u4eca\u751f::49::::bq\",\"\u7075\u9b42\u8f6c\u6362::23::::bq\",\"\u897f\u65b9\u7f57\u66fc::59::::bq\",\"\u9634\u5dee\u9633\u9519::53::::bq\",\"\u90fd\u5e02\u5f02\u95fb::181::::bq\",\"\u5929\u9009\u4e4b\u5b50::307::::bq\",\"\u53f2\u8bd7\u5947\u5e7b::199::::bq\",\"\u65f6\u4ee3\u65b0\u98ce::210::::bq\",\"\u62bd\u5956\u62bd\u5361::339::::bq\",\"\u65e5\u4e45\u751f\u60c5::332::::bq\",\"\u5f02\u60f3\u5929\u5f00::190::::bq\",\"\u8fb9\u7f18\u604b\u6b4c::44::::bq\",\"\u6392\u7403\u5c11\u5e74::253::::bq\",\"\u5f02\u95fb\u4f20\u8bf4::196::::bq\",\"\u5236\u670d\u60c5\u7f18::85::::bq\",\"\u4e09\u6559\u4e5d\u6d41::36::::bq\",\"\u795e\u8bdd\u4f20\u8bf4::367::::bq\",\"\u53e4\u4ee3\u5e7b\u60f3::189::::bq\",\"\u53e4\u5178\u540d\u8457::130::::bq\",\"\u5e73\u6b65\u9752\u4e91::55::::bq\",\"\u7075\u6c14\u590d\u82cf::284::::bq\",\"\u897f\u65b9\u540d\u8457::16::::bq\",\"\u8352\u91ce\u6c42\u751f::319::::bq\",\"\u8d76\u5c71\u8d76\u6d77::325::::bq\",\"\u6027\u522b\u8f6c\u6362::24::::bq\",\"\u771f\u5047\u5343\u91d1::334::::bq\",\"\u5200\u5251\u4e71\u821e::258::::bq\",\"\u661f\u7a79\u94c1\u9053::372::::bq\",\"\u591a\u91cd\u4eba\u683c::300::::bq\",\"\u6781\u54c1\u4eb2\u621a::336::::bq\",\"\u9a91\u58eb\u4e0e\u5251::63::::bq\",\"\u4ea1\u7075\u5f02\u65cf::192::::bq\",\"\u4ea4\u6362\u4eba\u751f::342::::bq\",\"\u9b54\u6cd5\u5c11\u5973::256::::bq\",\"\u539f\u59cb\u793e\u4f1a::279::::bq\",\"\u4e03\u5e74\u4e4b\u75d2::79::::bq\",\"\u84b8\u6c7d\u670b\u514b::278::::bq\",\"\u53e4\u5178\u884d\u751f::20::::lx\",\"\u4e1c\u65b9\u884d\u751f::18::::lx\",\"\u897f\u65b9\u884d\u751f::19::::lx\",\"\u5386\u53f2\u884d\u751f::91::::bq\",\"\u5176\u4ed6\u884d\u751f::21::::lx\",\"\u8ffd\u7231\u706b\u846c\u573a::321::::bq\"];\r\n\r\nfunction parseCategory(data) {\r\n  const [title, url, num = defaultNumPerRow] = data.split(separator);\r\n  const fullUrl = \/^\\d+|natural|wlhxca\/.test(url) \r\n    ? `${baseApi}bookstore\/getFullPage?channelBody=%7B%22${url}%22%3A%7B%22offset%22%3A%22{{(page-1)*25}}%22%2C%22limit%22%3A%2225%22%7D%7D&versionCode=148`\r\n    : url;\r\n  return [title, fullUrl, num];\r\n}\r\n\r\nfunction parseCategoryText(data){\r\n  let cateTypeNum = data.split(\",\");\r\n  let cateList = [];\r\n  for(let i in cateTypeNum){\r\n    let name = categories[cateTypeNum[i]];\r\n    let list = cateNum[cateTypeNum[i]];\r\n    for(let j in cateTag){   \r\n      switch (Number(j)) {\r\n        case 0:\r\n        case 1:{                       \r\n            list[0].length?cateList.push(`${\u5206\u7c7b\u6807\u8bc6}${name}${cateTag[j]}::::1`):null;             \r\n            for(let k in list[0]){           \r\n              cateList.push(`${list[0][k]}::${list[Number(j)+1][k]}`);\r\n            }\r\n            break;\r\n        }\r\n        case 2:{\r\n            cateList.push(`${\u699c\u5355\u6807\u8bc6}${name}${cateTag[j]}::::1`);\r\n            for(k in cateType){\r\n              list[Number(j)+1][k]?cateList.push(`${cateType[k]}::${list[Number(j)+1][k]}`):null;\r\n            }\r\n            break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  return cateList;\r\n}\r\n\r\nfunction parseTag(data, tagCategory) {\r\n  const [title, url, num = defaultNumPerRow, tagType] = data.split(separator);\r\n  let fullUrl = url;\r\n  let params =  `search\/getSearchForKeyWords?versionCode=313&offset={{(page-1)*20}}&limit=20&removetags=0&fw=0&yc=0&xx=${tagCategory}&sd=0&fg=0&mainview=0&fbsj=0&collectionTypes=ors&isfinish=0&sortType=0&token={\\{Map(\"token\")}}`;\r\n  if (tagType === \"bq\") {\r\n    fullUrl = `${baseApi}${params}&bq=${url}`;\r\n  } else if (tagType === \"at\") {\r\n  \tfullUrl = `${baseApi}androidapi\/authorColumn?authorid=${url}`;\r\n  \t}else if (tagType === \"class\") {\r\n  \t\tlet nn = url.split(\",\");\r\n  \tfullUrl = `${baseApi}androidapi\/incrementFavorite,{\"method\":\"POST\",\"body\":\"versionCode=313&token=${token}&order={\\{java.put(\"order\",${nn[2]})}}&classId={\\{java.put(\"classid\",${nn[0]})}}&backupTime=${Date.now()}\"}`\r\n  \t}else if (tagType === \"lx\") {\r\n    fullUrl = `${baseApi}${params}&lx=${url}`\r\n  }\r\n  return [title, fullUrl, num];\r\n}\r\n\r\nfunction createFlexBox(title, url, num) {\r\n  const flexBasisMap = { 1: 1, 2: 0.4, 3: 0.25, 4: 0.2, 5: 0.15, 7: 0.1, 10: 0.05 };\r\n  return {\r\n    title,\r\n    url: url || '',\r\n    style: {\r\n      layout_flexGrow: 1,\r\n      layout_flexBasisPercent: flexBasisMap[num]\r\n    }\r\n  };\r\n}\r\n\r\nconst result = [];\nresult.push(createFlexBox(\"\ud83d\udcc2 \u6211\u7684\u6536\u85cf\", `https:\/\/android.jjwxc.net\/androidapi\/incrementFavorite,{\\\"method\\\":\\\"POST\\\",\\\"body\\\":\\\"versionCode=313&token={{Map('token')}}&order={\\{java.put('order',${order})}}&classId=&backupTime={{Date.now()}}\\\"}`, \"1\"));\n\r\nif(ShelfNum){\r\nconst ShelfNumList = String(ShelfNum).split(\",\").slice(1);\r\nShelfNumList.forEach(x => {\r\n  const parsedTag = parseTag(ShelfList[x]);\r\n  result.push(createFlexBox(parsedTag[0], parsedTag[1], parsedTag[2],parsedTag[3]));\r\n});\r\n}\n\r\nauthorNames.forEach(tag => {\r\n  const parsedTag = parseTag(tag, tagCategory);\r\n  result.push(createFlexBox(parsedTag[0], parsedTag[1], parsedTag[2],parsedTag[3]));\r\n});\r\n\r\nall.forEach(item => {\r\n  const parsedItem = parseCategory(item);\r\n  result.push(createFlexBox(parsedItem[0], parsedItem[1], parsedItem[2]));\r\n});\n\r\nparseCategoryText(enabledCategories ).forEach(item => {\r\n  const parsedItem = parseCategory(item);\r\n  result.push(createFlexBox(parsedItem[0], parsedItem[1], parsedItem[2]));\r\n});\n\r\nresult.push(createFlexBox(`${\u6807\u7b7e\u6807\u8bc6} ${tagName}\u6807\u7b7e`, null, 1));\r\ntags.forEach(tag => {\r\n  const parsedTag = parseTag(tag, tagCategory);\r\n  result.push(createFlexBox(parsedTag[0], parsedTag[1], parsedTag[2],parsedTag[3]));\r\n});\r\n\r\nJSON.stringify(result);","header":"@js:\nJSON.stringify({\n\t\"User-Agent\":java.getWebViewUA(),\n\t\"versiontype\":\"reading\"\n\t})","jsLib":"var head = `<head><meta name=\"viewport\"content=\"width=device-width, initial-scale=1.0\"><meta charset=\"utf-8\"><title>\u8bc4 \u8bba<\/title><style>\nbody{background:#f8f9fa;color:#333;line-height:1.6;padding:20px;max-width:800px;margin:0 auto}\n.cp{text-indent:1.7em;margin-bottom:1em;text-align:justify}\n.ccnt{display:flex;flex-direction:column;gap:20px}.ef{width: 24px; display: inline-block; vertical-align: middle; margin-top: -4px;}\n.cc{background:#fff;border-radius:8px;box-shadow:0 2px 8px rgba(0,0,0,0.1);padding:20px;position:relative}\n.ch{display:flex;align-items:center;margin-bottom:12px}\n.ca{font-weight:bold;font-size:16px;color:#1a73e8}\n.cm{font-size:12px;color:#70757a;margin-left:8px}\n.cd{font-size:12px;color:#70757a;margin-left:auto}\n.cb{font-size:15px;margin-bottom:15px;white-space:pre-wrap;word-break:break-word}\n.cs{font-size:13px;color:#70757a;margin-bottom:15px}\n.cs p{display:flex;justify-content:flex-end;}\n.cs p span+span{margin-left:10px;}\n.rcnt{border-left:3px solid #e0e0e0;padding-left:15px;margin-top:15px}\n.rc{background:#f5f5f5;border-radius:6px;padding:12px;margin-bottom:10px}\n.rh{display:flex;align-items:center;margin-bottom:8px}\n.ra{font-weight:bold;font-size:14px;color:#1a73e8}\n.rf{background:#e0e0e0;color:#70757a;font-size:11px;padding:1px 4px;border-radius:3px;margin-left:8px}\n.rd{font-size:11px;color:#70757a;margin-left:auto}\n.rb{font-size:14px;white-space:pre-wrap;word-break:break-word}\n<\/style><\/head>`;\nfunction generateDateLinks() {\n    let links = [];\n    links.push(`\u4eca  \u5929::https:\/\/app-cdn.jjwxc.com\/bookstore\/favObservationByDate?day={\\{getFormattedDate(0)}}&use_cdn=1&version=21`);   \n    links.push(`\u660e  \u5929::https:\/\/app-cdn.jjwxc.com\/bookstore\/favObservationByDate?day={\\{getFormattedDate(1)}}&use_cdn=1&version=21`); \n    for (let i = 1; i <= 32; i++) {\n        links.push(`\u524d${i}\u5929::https:\/\/app-cdn.jjwxc.com\/bookstore\/favObservationByDate?day={\\{getFormattedDate(-${i})}}&use_cdn=1&version=21`);\n    }\n    return links;\n}\nfunction getNewBook(){\n\tconst {java} = this;\n\tlet nb = Map(\"nb\",this)||\"1,2,3,4,8,9\";\n\tlet html = `<!DOCTYPE html><html><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><title>\u4f5c\u54c1\u7b5b\u9009<\/title><style>body{font-family:Arial;max-width:600px;margin:0 auto;padding:20px}h1{text-align:center}.note{text-align:center;color:green;font-weight:bold;margin:10px 0}.section{margin-bottom:20px}.buttons{display:flex;flex-wrap:wrap;gap:10px;margin:10px 0}button{padding:8px 15px;font-size:16px;border:1px solid #ddd;border-radius:4px;cursor:pointer}#output{margin:15px 0;padding:10px;background:#f9f9f9;border-radius:4px}.selected{background:#d4edff;border-color:#4a90e2}<\/style><\/head><body><h1>\u4f5c\u54c1\u7b5b\u9009<\/h1><p class=\"note\">\u9009\u62e9\u5b8c\u4ee5\u540e\u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\"\u2713\"\u786e\u5b9a<\/p><div class=\"section\"><div><b>\u4f5c\u54c1\u7c7b\u578b<\/b>\uff08\u53ef\u591a\u9009\uff0c\u5fc5\u987b\u81f3\u5c11\u9009\u62e9\u4e00\u4e2a\uff09<\/div><div class=\"buttons\" id=\"type-btns\"><button onclick=\"selectType('\u539f\u521b','2')\" class=\"${nb.includes('2')?'selected':''}\">\u539f\u521b<\/button><button onclick=\"selectType('\u884d\u751f','4')\" class=\"${nb.includes('4')?'selected':''}\">\u884d\u751f<\/button><\/div><\/div><div class=\"section\"><div><b>\u4f5c\u54c1\u98ce\u683c<\/b>\uff08\u53ef\u591a\u9009\uff09<\/div><div class=\"buttons\" id=\"style-btns\"><button onclick=\"selectStyle('\u8a00\u60c5','1')\" class=\"${nb.includes('1')?'selected':''}\">\u8a00\u60c5<\/button><button onclick=\"selectStyle('\u7eaf\u7231','3')\" class=\"${nb.includes('3')?'selected':''}\">\u7eaf\u7231<\/button><button onclick=\"selectStyle('\u65e0CP+','8')\" class=\"${nb.includes('8')?'selected':''}\">\u65e0CP+<\/button><button onclick=\"selectStyle('\u767e\u5408','9')\" class=\"${nb.includes('9')?'selected':''}\">\u767e\u5408<\/button><\/div><\/div><script>var current={types:{\"2\":${nb.includes('2')},\"4\":${nb.includes('4')}},styles:{\"1\":${nb.includes('1')},\"3\":${nb.includes('3')},\"8\":${nb.includes('8')},\"9\":${nb.includes('9')}}};function selectType(n,v){var s=Object.values(current.types).filter(Boolean).length;if(s<=1&&current.types[v])return;current.types[v]=!current.types[v];document.querySelector('#type-btns button[onclick*=\"'+v+'\"]').classList.toggle('selected',current.types[v]);updateOutput()}function selectStyle(n,v){current.styles[v]=!current.styles[v];document.querySelector('#style-btns button[onclick*=\"'+v+'\"]').classList.toggle('selected',current.styles[v]);updateOutput()};function updateOutput(){var t=[],s=[];for(var v in current.types)current.types[v]&&t.push(document.querySelector('#type-btns button[onclick*=\"'+v+'\"]').textContent);for(var v in current.styles)current.styles[v]&&s.push(document.querySelector('#style-btns button[onclick*=\"'+v+'\"]').textContent)}<\/script><\/body><\/html>\n`;\n\t\n\tlet base64 = `data:text\/html;base64,${java.base64Encode(html)}`;\n\treturn base64\n\t}\n\t\n\t\nfunction getFormattedDate(dayOffset) {\n    const date = new Date();\n    date.setDate(date.getDate() + dayOffset);\n    const year = date.getFullYear();\n    const month = String(date.getMonth() + 1).padStart(2, '0');\n    const day = String(date.getDate()).padStart(2, '0');\n    return `${year}-${month}-${day}`;\n}\n\n\n\nfunction formatDate(date) {\n    const year = date.getFullYear();\n    const month = String(date.getMonth() + 1).padStart(2, '0');\n    const day = String(date.getDate()).padStart(2, '0');\n    return `${year}-${month}-${day}`;\n}\n\n\nfunction encode(data){\n\tconst { java } = this;\n\treturn java.createSymmetricCrypto(\"DES\/CBC\/PKCS5Padding\", String(\"KW8Dvm2N\"), String(\"1ae2c94b\")).encryptBase64(data)\n\t}\n\t\nfunction getHeaderMap(_){\n\t  const { source,java } = _ || this;\n    let infomap = String(source.getLoginHeader()).replace(\/^#\/,'');\n    infomap = (infomap!=\"null\"&&infomap!=\"\"&&infomap!=null)?infomap:\"{}\";\n    return JSON.parse(infomap);\n\t}\n\nfunction setHeaders(){\n   \tconst { source,java } = this;\n   \tlet map = getHeaderMap(this);\n   \tfor(let i=0;i<arguments.length;i++){\n   \t\tlet k =arguments[i].split(\"=\")[0];\n   \t\tlet v =arguments[i].split(\"=\")[1];\n   \t\tmap[k] = v;\n   \t\t}\n  source.putLoginHeader(\"#\"+JSON.stringify(map))\n\t}\nfunction getToken(d){\n\treturn d.match(\/token=(.*?)&\/)[1];\n\t}\n\nfunction getNid(d){\n\treturn d.match(\/novelId=(\\d+)\/)[1];\n\t}\nfunction Map(e,that) { \n\t  const { source } = that || this;\n   return getHeaderMap(that||this)[e]??\"\"\n}\n\nfunction bDe(d,that){\n\tconst { java } = that || this;\n\tlet re,token,novelId,chapterId;\n\tif(\/^http\/.test(d)){\n\t\ttoken =\/\\d+_[\\w\\d]{16,}\/.test(d)?\"token=\"+ d.match(\/\\d+_[\\w\\d]{16,}\/)[0]:\"token=\";\n   novelId=d.match(\/novelId=\\d+\/)[0];\n   chapterId = \/chapterId=\\d+\/.test(d)?\"&\"+d.match(\/chapterId=\\d+\/)[0]:\"\";\n   re =  `${token}&${novelId}${chapterId}`;\n\t\t}else{re = String(java.base64Decode(String(d).match(\/base64,([^,]+),*\/)[1]));}\n\treturn re\n\t}\n\t\nfunction replaceEmoticons(t){const n=t=>`<img class=\"ef\" src=\"${t}\"\/>`, o={'\u5316\u4e86':n('20240813133734_66baf11eca900_736.png'),'\u53ef\u601c':n('20240813133538_66baf0aa48da0_272.png'),'\u70b9\u8d5e':n('like.png'),'\u95ee\u53f7':n('question.png'),'\u4eb2\u4eb2':n('kiss.png'),'\u6c42\u6c42\u4f60\u4e86':n('20250513142416_6822e59075a3b_751.png'),'\u72d7\u5934':n('dog.png'),'\u661f\u661f\u773c':n('star.png'),'\u5bb3\u7f9e':n('shy.png'),'\u574f\u7b11':n('bad_smile.png'),'\u7231\u5fc3\u773c':n('love_heart.png'),'\u8ba9\u6211\u5eb7\u5eb7':n('look.png'),'\u732b\u5934':n('20240813134245_66baf2554d0c0_482.png'),'\u4e09\u82b1\u732b\u5934':n('20240813134304_66baf2688507d_882.png'),'\u5782\u8033\u5154\u5934':n('20240813134345_66baf29111f22_694.png'),'\u7ad6\u8033\u5154\u5934':n('20240813134441_66baf2c986c2b_931.png'),'\u718a\u732b\u5934':n('20240813134502_66baf2deb9a59_203.png'),'\u83dc\u72d7':n('20240813134018_66baf1c223617_332.png'),'\u5976\u8336':n('milk.png'),'\u6a58\u7cd6':n('20240813132714_66baeeb282db3_126.png'),'\u7d2b\u7cd6':n('20240813132746_66baeed24ae82_531.png'),'\u836f\u4e38':n('20240813132902_66baef1e7590e_674.png'),'\u67e0\u6aac':n('20240813133018_66baef6a49f76_858.png'),'\u996d\u996d':n('20250513142708_6822e63c630d3_583.png'),'\u7a7a\u7897':n('20250513142731_6822e653b7bac_594.png'),'\u6bd4\u5fc3':n('hand_heart.png'),'\u9f13\u638c':n('clap.png'),'666':n('666.png'),'\u6446\u624b':n('wave.png'),'\u5408\u5341':n('20240813132056_66baed38130c1_545.png'),'\u62b1\u62f3':n('20250327163246_67e50d2e50aa5_351.png'),'\u6258\u816e':n('sigh.png'),'\u7206\u54ed':n('cry.png'),'\u7b11\u54ed':n('laugh.png'),'\u5f69\u8679\u5c41':n('rainbow.png'),'\u6492\u82b1':n('flower.png'),'\u52a0\u6cb9':n('go.png'),'\u95ed\u5634':n('shut.png'),'\u767d\u773c':n('eyes.png'),'\u88c2\u5f00':n('break.png'),'\u58a8\u955c':n('20240809171403_66b5dddb9b4a9_201.png'),'\u5403\u74dc':n('20240813133503_66baf08792cb4_971.png'),'\u54e6\u54e6\u54e6':n('20250327162901_67e50c4d70e05_616.png'),'\u62b1\u62b1':n('20250327162653_67e50bcdc4107_345.png'),'\u6478\u5934':n('20250327162816_67e50c2004946_460.png'),'\u54c8\u54c8\u5927\u7b11':n('20250327162728_67e50bf002312_926.png'),'\u6342\u8138\u5077\u770b':n('20240813133808_66baf140db042_203.png'),'\u644a\u624b':n('20240813133559_66baf0bfe94a8_123.png'),'\u65e0\u5948':n('20250327163425_67e50d916f9f7_934.png'),'\u6342\u8138\u7b11\u54ed':n('20250327162314_67e50af266b86_726.png'),'\u773c\u955c':n('20250513142108_6822e4d4908c7_855.png'),'\u597d\u7684':n('20250513142306_6822e54a95fec_363.png'),'\u6c42\u4f60\u4e86':n('20250513142345_6822e5719d933_198.png'),'\u5c0f\u4e11':n('20240813134155_66baf223161c9_172.png'),'\u5bb3\u6015':n('fear.png'),'\u6124\u6012':n('anger.png'),'\u72d7\u5934\u53fc\u73ab\u7470':n('20250513142003_6822e493665f5_485.png'),'\u9e3d\u5b50':n('dove.png'),'\u53d1\u8d22':n('rich.png'),'\u597d\u8fd0\u83b2\u83b2':n('20240813132511_66baee37a0048_173.png'),'\u73ab\u7470':n('20240813132550_66baee5e5f847_433.png'),'\u732b\u722a':n('20240813132824_66baeef888f6a_514.png'),'\u70df\u82b1':n('20250513142645_6822e6257d8f0_243.png'),'\u5143\u5b9d':n('20250513142558_6822e5f6c2986_398.png'),'\u88e4\u5b50':n('20250513142753_6822e669080b5_216.png'),'\u8033\u6735':n('20240813133118_66baefa6c51c9_627.png'),'\u5fc3\u788e':n('broken_heart.png'),'\u7ea2\u5fc3':n('red_heart.png'),'\u6a59\u5fc3':n('orange_heart.png'),'\u9ec4\u5fc3':n('yellow_heart.png'),'\u7eff\u5fc3':n('green_heart.png'),'\u9752\u5fc3':n('cyan_heart.png'),'\u84dd\u5fc3':n('blue_heart.png'),'\u7d2b\u5fc3':n('purple_heart.png'),'\u7c89\u5fc3':n('pink_heart.png'),'\u52a0\u4e00':n('20250513142841_6822e699f2124_862.png'),'\u51cf\u4e00':n('20250513142916_6822e6bc011ee_516.png')};return t.replace(\/\\[([^\\]]+)\\]\/g,(t,r)=>o[r.trim()]||t)\n\t}\n\n\nfunction formatChineseText(text,that) {\n    const {java} =that || this;\n    text = text.replace(\/&lt;br&gt;|\u3000| {3,}|<\\\/?br>\/g,'\\n\\n');\n    return text.split(\/\\n\\s*\\n\/).map(para => {let content = para.replace(\/\\n\/g, '<br>');return `<p class=\"cp\">${content}<\/p>`;}).join('');\n}\nfunction getJsonHtml(url,_,type){\n\tconst{java}=_||this;\n\tlet h=JSON.parse(java.ajax(url)),ct=h?.data?.commentTotal??\"0\",msg=h?.message,cl=h?.data?.commentList??[];\n\tif(\/\u60a8\u5c1a\u672a\u8d2d\u4e70\u8be5VIP\u7ae0\u8282|^1004\/.test(msg)&&!\/getLongCommentList|paragraph_id\/.test(url)){\n\t\tlet bid = url.match(\/novelId=(\\d+)\/)[1];\n\t\tlet cid = url.match(\/chapterId=(\\d+)\/)[1];\n\t\tlet sort = url.match(\/commentSort=(\\d+)\/)[1];\n\t\tlet buckurl = `https:\/\/s8-static.jjwxc.net\/comment_json.php?commentSort=${sort}&chapterid=${cid}&novelid=${bid}`;\n\t\th=JSON.parse(java.ajax(buckurl)),ct=(h?.body??[]).length??\"0\",msg=h?.message??\"\",cl=h?.body??[];\n\t\t}\n   return\tgetHtml(ct,cl,_||this,type,msg);\n\t}\n\t\n\tfunction formatDate(datetime) {\n    let t = new Date() \/ 1000;\n    var l = t - datetime;\n    if (l < 0) {\n        return \"\u521a\u521a\";\n    }\n    var arrayObj = [\n                [31536000, \"\u5e74\u524d\"],\n                [2592000, \"\u4e2a\u6708\u524d\"],\n                [604800, \"\u661f\u671f\u524d\"],\n                [86400, \"\u5929\u524d\"],\n                [3600, \"\u5c0f\u65f6\u524d\"],\n                [60, \"\u521a\u521a\"],\n                [1, \"\u521a\u521a\"]\n            ];\n    for (var index in arrayObj) {\n        var c = Math.floor(l \/ arrayObj[index][0]);\n        if (0 < c) {\n            if (\"\u521a\u521a\" == arrayObj[index][1]) {\n                return arrayObj[index][1];\n            } else {\n                return c + arrayObj[index][1];\n            }\n        }\n    }\n}\n\nfunction rHtml(list){\nlet jj=list;function rCts(cs) {var html = '';for (var i = 0; i < cs.length; i++) {var c = cs[i],rH=\"\";if (c.rep && c.rep.length > 0) {for (var j = 0; j < c.rep.length; j++) {var r = c.rep[j];rH += '<div class=\"rc\">' +'<div class=\"rh\">' +'<span class=\"ra\">' + r.a + '<\/span>' +'<span class=\"rd\">' + r.d + '<\/span>' +'<\/div>' +'<div class=\"rb\">' + r.b + '<\/div>' +'<\/div>';}};html += '<div class=\"cc\">' +'<div class=\"ch\">' +'<span class=\"ca\">' + c.a + '<\/span>' +(c.m!==\"undefined\" ? '<span class=\"cm\">' + c.m + '\u5206<\/span>' : '') +'<span class=\"cd\">' + c.d + '<\/span>' +'<\/div>' +'<div class=\"cb\">' + c.b + '<\/div>' +'<div class=\"cs\">' +'<p>' +(c.r ? '<span>' + c.r + '<\/span>' : '') +'<span>\u2665' + (c.ag || '0') + '<\/span>' +'<span>\u2661' + (c.dis || '0') + '<\/span>' +'<\/p>' +'<\/div>' +(rH ? '<div class=\"rcnt\">' + rH + '<\/div>' : '') +'<\/div>';};return '<div class=\"ccnt\" id=\"ccnt\">' + html + '<\/div>';};\nif (typeof document !== 'undefined') {\n    document.getElementById('cont').innerHTML = rCts(jj);\n    const ef = document.querySelectorAll('img.ef');\n    ef.forEach(img => {\n      img.src = \"https:\/\/i9-static.jjwxc.net\/tmp\/emoji\/\" + img.src;\n    });\n  } else {\n    return rCts(jj).replace(\/class=\"ef\" src=\"(.*?)\"\/g, 'class=\"ef\" src=\"https:\/\/i9-static.jjwxc.net\/tmp\/emoji\/$1\"');\n  }\n}\n\nfunction createScriptWithParams(params) {\n  return `\n    <script>\n      (${rHtml.toString()})(${JSON.stringify(params)});\n    <\/script>\n  `;\n}\n\n\nfunction getHtml(ct,cl,_,type,msg){\nconst {java,source} = _||this;let list = [],cllen= cl.length;\nlet sss = String(source.getVariable());\n\nlet re=\/^([\\[\\]\u6a58\u7cd6\u7d2b\u7cd6]|\u55d1\u5230\u4e86|kswl|\\[.*?\\]|\\d+\\.\\d+\\.\\d+|.\u5237|\u6253\u5361|\\s)+$|\u4e3a\u8425\u9020\u66f4\u597d\u7684\u8bc4\u8bba\u73af\u5883\uff0c\/;\n\nlet sre = sss.match(\/\u5c4f\u853d\u3010(.*?)\u3011\/)?.[1]??null\nsre = sre?new RegExp(sre.replace(\/,\/g,'|'),'g'):null;\nlet plen = 0;\nfor(let i in cl){\nlet c = cl[i],reply = (c?.replyAll??c?.reply),rl = [];\n\nif(re.test(c.commentBody??c.commentbody)||(sre?sre.test(c.commentBody??c.commentbody):null)){cllen--;plen++;continue;}\nfor(let j in reply){\nlet r = reply[j];\nif(re.test(r.replyBody??r.commentbody)||(sre?sre.test(r.replyBody??r.commentbody):null)){continue;}\nrl.push({\nb:`${formatChineseText(replaceEmoticons(r.replyBody??r.commentbody))}`,\na:`${(r.replyAuthor??r.commentauthor)+(r?.isAuthor===\"1\"?\"[\u4f5c\u8005]\":\"\")}`,\nd:`${formatDate(r.comment_date_time)??(r.replyDate||r.commentdate)}`\n})\n}\n\nlist.push({\nb:`${formatChineseText(replaceEmoticons(c.commentBody??c.commentbody))}`,\na:`${(c.commentAuthor??c.commentauthor)+(c?.isAuthor===\"1\"?\"[\u4f5c\u8005]\":(c?.bulletinComment===\"1\"?\"[\u516c\u544a]\":\"\"))}`,\nd:`${formatDate(c.comment_date_time)??(c.commentDate||c.commentdate)}`,\nr:`${c.subscriptionicon?(c.subscriptionrate?`\ud83d\udcd6${c.subscriptionrate}`:(c.subscriptionicon.includes(\"rate_novelallbuy\")?`\ud83d\udcd6100%`:`${c.subscriptionicon.replace(\/src=(.*?)\\s\/g,'src=\"https:$1\"').replace(\/(?:background|border|border-radius):.*?;\/g,'')}`)):\"\"}`,\nag:`${c.agreenum??\"0\"}`,\ndis:`${c.disagreenum??\"0\"}`,\nm:`${c.commentMark}`,\nrep:rl\n});\n}\nlet scriptTag;\nif(type===1){\n\tscriptTag = createScriptWithParams(list);\n\t}else{\n\tscriptTag = rHtml(list);\n}\n\nlet html = `<html>${head}<body><p>\u25aa\u5f53\u524d\u663e\u793a${cllen}\u6761\u8bc4\u8bba\u25aa\u5c4f\u853d${plen}\u6761\u8bc4\u8bba\u25aa${msg}<\/p><div id=\"cont\"><\/div>${scriptTag}<\/body><\/html>`;\nreturn encodeURIComponent(html);\n}\n\nfunction toReview(nid,cid,r){\n\tconst {java,source} = this;\n\tlet sss = String(source.getVariable());\n\tlet \u957f\u8bc4url = `https:\/\/android.jjwxc.net\/comment\/getLongCommentList`;\n    let \u957f\u8bc4option = {\n\t    \"method\":\"POST\",\n    \t\"body\":`versionCode=439&limit=100&offset=0&${bDe(r,this)}`\n\t}\n\tlet \u70b9\u8d5eurl = `https:\/\/android.jjwxc.net\/comment\/getCommentList?versionCode=439&limit=50&offset=0&commentSort=2&${bDe(r,this)}`;\n\tlet \u56de\u590durl = `https:\/\/android.jjwxc.net\/comment\/getCommentList?versionCode=439&limit=50&offset=0&commentSort=0&${bDe(r,this)}`;\n    \u957f\u8bc4url = \u957f\u8bc4url+\",\"+JSON.stringify(\u957f\u8bc4option);\n    \n\tjava.longToast(\"\u6570\u636e\u52a0\u8f7d\u4e2d....\u8bf7\u7a0d\u5019\");\n\tlet \u957f\u8bc4,\u70b9\u8d5e,\u56de\u590d;\n\tif(\/\u8bc4\u8bba\u70b9\u8d5e\/.test(sss)){\n\t\t let num = sss.match(\/\u8bc4\u8bba\u70b9\u8d5e(\\d+)\/)?.[1]??\"50\";\n\t\t return `data:text\/html;base64,${java.base64Encode(decodeURIComponent(getJsonHtml(\u70b9\u8d5eurl.replace(\/limit=\\d+\/,'limit='+num),this,1)))}`;\n\t\t}else if(\/\u8bc4\u8bba\u56de\u590d\/.test(sss)){\n\t\t\t\u56de\u590d = getJsonHtml(\u56de\u590durl,this,1);\n\t\t\tlet num = sss.match(\/\u8bc4\u8bba\u56de\u590d(\\d+)\/)?.[1]??\"50\";\n\t\t\treturn `data:text\/html;base64,${java.base64Encode(decodeURIComponent(getJsonHtml(\u56de\u590durl.replace(\/limit=\\d+\/,'limit='+num),this)))}`;\n\t\t\t}else{\n\t     \u957f\u8bc4 = getJsonHtml(\u957f\u8bc4url,this);\n\t     \u70b9\u8d5e = getJsonHtml(\u70b9\u8d5eurl,this);\n\t     \u56de\u590d = getJsonHtml(\u56de\u590durl,this);\n\tlet html=`<html><head><meta name=viewport content=\"width=device-width,initial-scale=1\"><meta charset=\"utf-8\"><style>body{display:flex;flex-direction:column;justify-content:center;align-items:center;min-height:100vh;margin:0;padding:20px;box-sizing:border-box}.btn-c{display:flex;flex-direction:column;gap:15px;width:100%;max-width:400px}button{padding:12px 20px;border:none;border-radius:8px;font-size:16px;font-weight:500;cursor:pointer;transition:all .3s ease;box-shadow:0 2px 5px rgba(0,0,0,.1);display:flex;align-items:center;justify-content:center}button:hover{transform:translateY(-2px);box-shadow:0 4px 8px rgba(0,0,0,.15)}.b1{background:#4285f4;color:#fff}.b2{background:#34a853;color:#fff}.b3{background:#ea4335;color:#fff}.b4{background:#88263E;color:#fff}.b5{background:#D8C93E;color:#000}<\/style><\/head><body><p>\u6709\u4e9b\u5185\u5bb9\u9700\u8981\u767b\u5f55\u624d\u80fd\u4f7f\u7528\u3010\u4e66\u6e90\u548c\u7f51\u9875\u90fd\u8981\u767b\u5f55\u3011<\/p><div class=btn-c><button class=b1 onclick=c(0)><span>\u4f7f\u7528\u3010\u624b\u673a\u3011\u7f51\u9875\u67e5\u770b\u3010\u672c\u7ae0\u8bc4\u8bba\u3011<\/span><\/button><button class=b1 onclick=c(5)><span>\u4f7f\u7528\u3010\u7535\u8111\u3011\u7f51\u9875\u67e5\u770b\u3010\u672c\u7ae0\u8bc4\u8bba\u3011<\/span><\/button><button class=b4 onclick=c(6)><span>\u67e5\u770b\u3010\u672c\u7ae0\u957f\u8bc4\u5185\u5bb9\u3011<\/span><\/button><button class=b4 onclick=c(7)><span>\u67e5\u770b\u672c\u7ae050\u6761\u8bc4\u8bba\u3010\u6309\u70b9\u8d5e\u6570\u6392\u5e8f\u3011<\/span><\/button><button class=b4 onclick=c(8)><span>\u67e5\u770b\u672c\u7ae050\u6761\u8bc4\u8bba\u3010\u6309\u56de\u590d\u65f6\u95f4\u6392\u5e8f\u3011<\/span><\/button><button class=b2 onclick=c(1)><span>\u4f7f\u7528\u3010\u4e66\u6e90\u3011\u67e5\u770b\u3010\u672c\u7ae0\u8bc4\u8bba\u3011<\/span><\/button><button class=b2 onclick=c(3)><span>\u4f7f\u7528\u3010\u4e66\u6e90\u3011\u67e5\u770b\u3010\u5168\u6587\u8bc4\u8bba\u3011<\/span><\/button><button class=b3 onclick=c(2)><span>\u67e5\u770b\u5f53\u524d\u94fe\u63a5\u5185\u5bb9<\/span><\/button><\/div><script>let u=\"http:\/\/www.jjwxc.net\/comment.php?novelid=${nid}&chapterid=${cid}&page=1\",m=u,u1=\"legado:\/\/import\/addToBookshelf?src=\"+encodeURIComponent(u),u2=\"http:\/\/app-cdn.jjwxc.net\/androidapi\/novelbasicinfo?novelId=${nid}&page=1\",u3=\"legado:\/\/import\/addToBookshelf?src=\"+encodeURIComponent(u2),u4=\"https:\/\/m.jjwxc.net\/review\/${nid}\/${cid}\/\",u5=\"https:\/\/app.jjwxc.org\/androidapi\/chapterContent?versionCode=381&${bDe(r,this)}\";function c(n){const a={0:()=>open(u4,\"_blank\"),1:()=>open(u1,\"_blank\"),2:()=>open(u5,\"_blank\"),3:()=>open(u3,\"_blank\"),5:()=>open(m,\"_blank\"),6:()=>document.body.innerHTML=decodeURIComponent(\"${\u957f\u8bc4}\"),7:()=>document.body.innerHTML=decodeURIComponent(\"${\u70b9\u8d5e}\"),8:()=>document.body.innerHTML=decodeURIComponent(\"${\u56de\u590d}\")};a[n]?.()}<\/script><\/body><\/html>`;\n\t\n\treturn `data:text\/html;base64,${java.base64Encode(html)}`;\n}\n}\t","lastUpdateTime":"1769844602782","loginCheckJs":"if(!cache.get(\"jjtime\")) {\n    cache.put(\"jjtime\", true, 11600);\n    const enbody = `${String(Date.now())}:${Map(\"token\")}`;\n    const option = {\n        method: \"POST\",\n        body: `versionCode=313&sign=${encode(enbody)}`\n    };\n    const jjsign = java.ajax(\"https:\/\/app.jjwxc.org\/androidapi\/signin,\" + JSON.stringify(option));\n    \/\u7b7e\u5230\u6210\u529f\/.test(JSON.parse(jjsign).message)?java.toast(JSON.parse(jjsign).message):\"\";\n}result","loginUi":"[\n{\n    \t  name:\"\u2615\ufe0f\u652f\u6301\u6e90\u4f5c\u8005\",\n    \t  type: \"button\",\n       action: \"toThank()\",\n       \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n    \t},\n{\n    \t  name:\"\u4f7f\u7528\u8bf4\u660e\",\n    \t  type: \"button\",\n       action: \"toShi()\",\n       \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n    \t},\n    \t{\n    \t  name:\"\u7f51\u9875\u5145\u503c\",\n    \t  type: \"button\",\n       action: \"recharge()\",\n       \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n    \t},\n    \t{\n    \t  name:\"\u641c\u7d22\u8bbe\u7f6e\",\n    \t  type: \"button\",\n       action: \"SearchSet()\",\n       \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n    \t},\n    \t{\n    \t  name:\"\u83b7\u53d6\u4e66\u67b6\",\n    \t  type: \"button\",\n       action: \"getShelf()\",\n        \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n    \t},\n    \t \t{\n    \t  name:\"\u6dfb\u52a0\u4e66\u67b6\",\n    \t  type: \"button\",\n       action: \"addShelf()\",\n       \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n    \t},\t\n    \t{\n    \t  name:\"\u5220\u9664\u4e66\u67b6\",\n    \t  type: \"button\",\n       action: \"delShelf()\",\n        \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n    \t},\n{\n    \t  name:\"\u4e66\u67b6\u9009\u62e9\",\n    \t  type: \"button\",\n       action: \"showShelf()\",\n       \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n    \t},\n    \t{\n    \"name\": \"\u5206\u7c7b\u9009\u62e9\",\n    \"type\": \"button\",\n    \"action\": \"getFl()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n  },\n  \t{\n\t\tname: \"\u6807\u7b7e\u9009\u62e9\",\n\t\ttype: \"button\",\n\t\taction: \"getTag()\",\n\t\t\"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.25\n    }\n\t},\n\t\t{\n    \t\tname:\"\u4f5c\u8005\u5217\u8868\uff08\u4f5c\u8005::\u4f5c\u8005id \u6ce8\u610f\u6dfb\u52a0\u591a\u4e2a\u7528\u7a7a\u683c\u5206\u5272\uff09\",\n    \t\ttype:\"text\"\n    \t\t},\n    \t\t \t{\n    \t  name:\"\u626b\u7801\u767b\u5f55\",\n    \t  type: \"button\",\n       action: \"toScan()\",\n       \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n    \t},\n\t{\n    \t  name:\"token\u767b\u5f55[\u2757\ufe0f\u6ca1\u4e8b\u4e0d\u8981\u586b\u8fd9\u91cc\uff0c\u4e09\u9009\u4e00\u767b\u5f55]\",\n    \t  type:\"password\"\n    \t},\n    {\n    \t  name:\"\u8d26\u53f7\",\n    \t  type:\"text\"\n    \t},\n    \t{\n    \t  name:\"\u5bc6\u7801\",\n    \t  type:\"password\"\n    \t},\n    \t{\n    \t  name:\"\u9a8c\u8bc1\u7801\uff08\u586b\u5b8c\u9a8c\u8bc1\u7801\u540e\uff0c\u8981\u70b9\ud83d\udc64\u767b\u5f55\uff09\",\n    \t  type:\"text\"\n    \t},\n    \n   {\n        name: \"\u90ae\u7bb1\u9a8c\u8bc1\u7801\u548c\ud83d\udc64\u767b\u5f55\",\n        type: \"button\",\n        action: \"getCode('email')\",\n           \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n    },\n    {\n        name: \"\u624b\u673a\u9a8c\u8bc1\u7801\u548c\ud83d\udc64\u767b\u5f55\",\n        type: \"button\",\n        action: \"getCode('phone')\",\n           \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n    } \t\t\n]","loginUrl":"function toScan(){\n\ttry{\n\theaders = {\t\n\t\t\t\"source\":\"android\",\n\t\t\t\"versioncode\":\"467\",\n\t\t\t\"version-code\":\"467\"\t\t\n\t\t}\t\t\n\tlet e = java.ajax(\"https:\/\/android.jjwxc.com\/app.jjwxc\/android\/reading\/Login\/scanCodeLogin?versionCode=467\"+\",\"+JSON.stringify({headers:headers}));\n\tlet eData = JSON.parse(e).data;\n\tlet jjscanurl = \"https:\/\/www.jjwxc.net?action=scanCode&jjreader_key=\"+eData.jjreader_key+\"&device_key=\"+eData.device_key;\n\tlet enjj = encodeURIComponent(jjscanurl);\n\tlet html = `<title>\u626b\u7801\u4e8c\u7ef4\u7801<\/title><meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\"><p>\u8bf7\u7528\u5df2\u767b\u5165\u65b0\u7248\u664b\u6c5f\u7684\u624b\u673a\u626b\u7801\u3010\u622a\u56fe\u540e\u53bb\u664b\u6c5f\u626b\u7801\u3011<br><br>\u8bf7\u5728\u5f53\u524d\u767b\u5165\u4e86\u664b\u6c5f\u8d26\u53f7\u7684\u624b\u673a\u4e0a\u8fdb\u5165\u664b\u6c5f\u5c0f\u8bf4\u9605\u8bfbApp-\u6211\u7684\uff0c\u70b9\u51fb\u53f3\u4e0a\u89d2\u201c\u626b\u7801\u201d\u56fe\u6807\uff0c\u626b\u63cf\u4e0b\u65b9\u4e8c\u7ef4\u7801<\/p><img style=\"width:300px;height:auto\" src=\"https:\/\/api.qrtool.cn\/?text=${enjj}\"><p>\u8bf7\u626b\u7801\u6388\u6743\u540e\uff0c\u518d\u70b9\u53f3\u4e0a\u89d2\u7684\u201c\u2713\u201d\uff0c\u4e0d\u8981\u63d0\u524d\u70b9\uff0c\u5426\u5219\u8981\u91cd\u65b0\u626b\u7801`\n\tlet u = java.startBrowserAwait(`data:text\/html;base64,${java.base64Encode(html)}`,\"\u626b\u7801\u767b\u5f55\",false).body();\n\tif(u){\n\theaders[\"Content-Type\"] = \"application\/octet-stream\"\n\tlet checkLogin =\"https:\/\/android.jjwxc.com\/app.jjwxc\/android\/reading\/Login\/checkJjreaderLogin\";\n\t\n\tlet body = encode(JSON.stringify({\"versionCode\":\"467\",\"jjreader_key\":eData.jjreader_key,\"device_key\":eData.device_key}));\ncheckLoginpost = {\n\t\"method\":\"POST\",\n\t\"body\":body,\n  \"headers\":headers\n\t}\n\tcheckLogin = checkLogin+\",\"+JSON.stringify(checkLoginpost);\n\tlet t = java.ajax(checkLogin);\n\tt = JSON.parse(t).data?.token ?? JSON.parse(t).message;\n\tif(\/\\d+_\/.test(t)){\n\t\t  setHeaders(`token=${t}`);\n\t\t  java.toast(\"\u767b\u5f55\u6210\u529f\");\n\t\t}else{\n\t\t\tjava.toast(t)\n\t\t\t}\n\t}\n\t }catch(e){java.log(e);java.toast(\"\u626b\u7801\u767b\u5f55\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5\")}\n\t}\n\nfunction saveTag(svg,tagType){\n\tlet code = String(java.getVerificationCode('data:image\/svg+xml;base64,'+svg));\n    if(\/(\\d,*)*\/.test(code)){\n\t    setHeaders(`${tagType}=${code}`)\n\t    java.toast(\"\u5df2\u4fdd\u5b58\u6570\u636e....\u8bf7\u5237\u65b0\u53d1\u73b0\")\n\t}\n}\nfunction toShi(){\n\tlet ver = \"V25.1227.0713\";\n\tjava.longToast(\"\u5f53\u524d\u4e66\u6e90\u7248\u672c\uff1a\"+ver);\n\tPackages.java.lang.Thread.sleep(10);\n\tlet html = `<html><head><base href=\"https:\/\/gitee.com\/guaner001125\/booksource\/raw\/master\/%E5%9B%BE%E7%89%87\/\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\"><style>.c{margin:10px;border:1px solid #ddd}.t{padding:10px;cursor:pointer;background:#f5f5f5}.i{display:none;padding:10px;text-align:center}img{max-width:100%}<\/style><\/head><body><div class=c><div class=t onclick=t('a')>\u6293\u5305token\u8bf4\u660e +<\/div><div class=i id=a><img src=token.webp><\/div><\/div><div class=c><div class=t onclick=t('b')>\u4f7f\u7528\u8bf4\u660e +<\/div><div class=i id=b><img src=shiyong.webp><\/div><\/div><div class=c><div class=t onclick=t('c')>\u6e90\u53d8\u91cf\u8bbe\u7f6e\u8bf4\u660e +<\/div><div class=i id=c><img src=source1.webp><\/div><\/div><\/div><script>function t(e){let o=document.getElementById(e);o.style.display=o.style.display=='block'?'none':'block';o.previousElementSibling.innerHTML=o.style.display=='block'?o.previousElementSibling.innerHTML.replace('+','-'):o.previousElementSibling.innerHTML.replace('-','+')}<\/script><\/body><\/html>`;\n java.startBrowser(`data:text\/html;base64,${java.base64Encode(html)}`,\"\u4f7f\u7528\u8bf4\u660e\"+ver);\n\t\n\t}\n\t\nfunction recharge(){\n\tlet userurl = \"https:\/\/app.jjwxc.org\/androidapi\/getUserCenter,\"+JSON.stringify({\n\t\t\"method\":\"POST\",\n\t\t\"body\":\"versionCode=443&token=\"+Map(\"token\")\n\t\t});\ntry{\nlet h = JSON.parse(java.ajax(userurl));\nif(h.nickName){\nlet toast = `\\n\u7528\u6237\uff1a\ud83d\udc64${h.nickName}\\n\u4f59\u989d\uff1a${h.balance}\u70b9\\n\u6708\u77f3\uff1a${h.coinstotal}\u4e2a`;\n\tjava.longToast(toast);\n\tjava.log(toast);\n}else{\n\tjava.longToast(\"\u274c\u9605\u8bfb\u672a\u4f7f\u7528token\u6216\u8d26\u53f7\u767b\u5f55\");\n\t}\n\t}catch(e){\n\t\tjava.log(e)\n\t\t}\n\t\t\n\t\tPackages.java.lang.Thread.sleep(800);\n\tjava.startBrowser(\"https:\/\/m.jjwxc.net\/pay\/\",\"\u664b\u6c5f\u7f51\u9875\u5145\u503c\");\n\t}\nfunction SearchSet(){\n\ttry{\n\tlet html = `<!DOCTYPE html><html><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\"><title>\ud83d\udd0d\u641c\u7d22\u8bbe\u7f6e<\/title><style>body{font-family:Arial;max-width:600px;margin:0 auto;padding:20px}h1{text-align:center}.note{text-align:center;color:green;font-weight:bold;margin:10px 0}.section{margin-bottom:20px}.buttons{display:flex;flex-wrap:wrap;gap:10px;margin:10px 0}button{padding:8px 15px;font-size:16px;border:1px solid #ddd;border-radius:4px;cursor:pointer}#output{margin:15px 0;padding:10px;background:#f9f9f9;border-radius:4px}.selected{background:#d4edff;border-color:#4a90e2}<\/style><\/head><body><h1>\u641c\u7d22\u8bbe\u7f6e<\/h1><p class=\"note\">\u9009\u62e9\u5b8c\u4ee5\u540e\u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\"\u2713\"\u786e\u5b9a<\/p><div id=\"output\"><div>\u5f53\u524d\u9009\u62e9:<\/div><div id=\"type-output\">\u641c\u7d22\u3010\u7c7b\u578b\u3011: \u672a\u9009\u62e9<\/div><div id=\"searchtype-output\">\u641c\u7d22\u3010\u6392\u5e8f\u3011: \u672a\u9009\u62e9<\/div><\/div><div class=\"section\"><div><b>\u641c\u7d22\u7c7b\u578b<\/b>\uff08\u9664\u4f5c\u8005\u548c\u4e66\u540d\u5916\u9700\u5173\u95ed\u7cbe\u786e\u641c\u7d22\uff09<\/div><div class=\"buttons\" id=\"type-btns\"><\/div><\/div><div class=\"section\"><div><b>\u641c\u7d22\u6392\u5e8f<\/b><\/div><div class=\"buttons\" id=\"sort-btns\"><\/div><\/div><script>var config={types:{\"1\":\"\u4e66\u540d\",\"4\":\"\u4e3b\u89d2\",\"5\":\"\u914d\u89d2\",\"6\":\"\u5176\u4ed6\",\"2\":\"\u4f5c\u8005\"},sorts:{\"1\":\"\u79ef\u5206\",\"7\":\"\u76f8\u5173\u6027\",\"2\":\"\u6700\u8fd1\u66f4\u65b0\",\"3\":\"\u6700\u65b0\u53d1\u8868\",\"4\":\"\u5b57\u6570\",\"5\":\"\u6536\u85cf\u6570\",\"9\":\"\u5b8c\u7ed3\u9ad8\u5206\",\"8\":\"\u5927\u4f17\u5316\u6307\u6570\",\"10\":\"\u968f\u673a\u6392\u5e8f\"}};var searchParams='${Map(\"search\")}'||\"1,8\";var searchArray=searchParams.split(\",\");var typeValue=searchArray[0];var sortValue=searchArray[1];var current={type:{value:typeValue,name:typeValue?config.types[typeValue]:null},sort:{value:sortValue,name:sortValue?config.sorts[sortValue]:null}};function initButtons(container,items,type){var buttonsHTML='';for(var value in items){if(items.hasOwnProperty(value)){var name=items[value];var isSelected=current[type].value===value;buttonsHTML+='<button onclick=\"select(\\\\''+type+'\\\\',\\\\''+name+'\\\\',\\\\''+value+'\\\\')\"'+(isSelected?' class=\"selected\"':'')+'>'+name+'<\/button>'}}container.innerHTML=buttonsHTML}function select(type,name,value){current[type]={name:name,value:value};var buttons=document.getElementById(type+'-btns').querySelectorAll('button');for(var i=0;i<buttons.length;i++){buttons[i].classList.toggle('selected',buttons[i].textContent===name)}updateOutput()}function updateOutput(){document.getElementById('type-output').textContent='\u641c\u7d22\u3010\u7c7b\u578b\u3011: '+(current.type.name||\"\u672a\u9009\u62e9\")+(current.type.value?'('+current.type.value+')':'');document.getElementById('searchtype-output').textContent='\u641c\u7d22\u3010\u6392\u5e8f\u3011: '+(current.sort.name||\"\u672a\u9009\u62e9\")+(current.sort.value?'('+current.sort.value+')':'')}initButtons(document.getElementById('type-btns'),config.types,'type');initButtons(document.getElementById('sort-btns'),config.sorts,'sort');updateOutput();<\/script><\/body><\/html>\n`;\nlet base64 = `data:text\/html;base64,${java.base64Encode(html)}`;\nlet body = java.startBrowserAwait(base64,\"\u641c\u7d22\u8bbe\u7f6e\",false).body();\nlet search = (body.match(\/\u641c\u7d22\u3010\u7c7b\u578b\u3011:.*?\\((\\d+)\\)\/)?.[1]??1)+\",\"+(body.match(\/\u641c\u7d22\u3010\u6392\u5e8f\u3011:.*?\\((\\d+)\\)\/)?.[1]??8);\nsetHeaders(`search=${search}`);\n\n}catch(e){\n\tjava.log(e)\n\t}\n\t}\n\n\nfunction toThank(){\n\t\n\tjava.startBrowser(\"data:text\/html;base64,PGltZyBzdHlsZT0id2lkdGg6MTAwJSIgc3JjPSJhYm91dDpibGFuayIgb25lcnJvcj0idGhpcy5zcmM9YXRvYignYUhSMGNITTZMeTluYVhSbFpTNWpiMjB2WjNWaGJtVnlNREF4TVRJMUwySnZiMnR6YjNWeVkyVXZjbUYzTDIxaGMzUmxjaThsUlRVbE9VSWxRa1VsUlRjbE9Ea2xPRGN2WjNWaGJtVnlMbmRsWW5BPScpIj4KCg==\",\"\u611f\u8c22\u4f60\u7684\u652f\u6301\");\t\n\t}\n\t\nfunction getShelf(){\n\ttry{\n\tif(Map(\"token\")){\n\t\tlet sourceGet = String(source.getVariable()).replace(\/\\n*(?:\u8bf7\u52ff\u5220\u9664\u6b64\u4e66\u67b6\u6570\u636e)*\u2757\ufe0f[\\s\\S]+?\u2757\ufe0f\/g,'');\n\tlet ShelfUrl = \"https:\/\/app.jjwxc.org\/app.jjwxc\/android\/reading\/FavoriteClass\/favoriteClass\";\n\tlet body = \t{\"versionCode\":\"444\",\"token\":Map(\"token\")}\n\tbody = encode(JSON.stringify(body));\nvar headers = {\n        \"versioncode\": \"444\",\n        \"versiontype\":\"reading\",\n        \"User-Agent\":java.getWebViewUA()\n    };\n    \n\tlet ShelfJson = java.post(ShelfUrl,body,headers).body();\n     Shelflist = JSON.parse(ShelfJson).data;\n     shlef = [];\n     for(i in Shelflist){ \n     if(Shelflist[i].classid>=0){\tshlef.push(Shelflist[i].classname+\"::\"+Shelflist[i].classid)\n     }\n     \t}\n\t    shlef.unshift(\"\u6211\u7684\u6536\u85cf::-1,1,0\");\n\tlet ShlefClass = \"\u8bf7\u52ff\u5220\u9664\u6b64\u4e66\u67b6\u6570\u636e\u2757\ufe0f\"+JSON.stringify(shlef)+\"\u2757\ufe0f\"\n\tsource.setVariable(sourceGet+\"\\n\"+ShlefClass);\n\t\tjava.longToast(\"\u5df2\u83b7\u53d6\u4e66\u67b6\u6570\u636e\uff0c\u8bf7\u70b9\u51fb\u9009\u62e9\u663e\u793a\u7684\u4e66\u67b6\")\n\t\t}else{java.longToast(\"\u8bf7\u5148\u767b\u5f55\");}\t\n\t\t}catch(e){\n\t\t\tjava.log(e)\n\t\t\t}\n}\n\nfunction addShelf(){\n\ttry{\n\tlet svg=`<svg width=\"1150\" height=\"300\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n\t  <rect width=\"100%\" height=\"100%\" fill=\"#f0f0f0\" \/>\t\n\t  <text x=\"150\" y=\"100\" font-family=\"Arial, sans-serif\" font-size=\"85\" fill=\"#333\" font-weight=\"bold\">\u8f93\u5165\u8981\u65b0\u5efa\u7684\u4e66\u67b6\u540d\u79f0<\/text>\t\n\t  <text x=\"60\" y=\"205\" font-family=\"Arial, sans-serif\" font-size=\"40\" fill=\"#333\" font-weight=\"bold\">\u6ce8\u610f\u540d\u79f0\u4e0d\u53ef\u7528\u6700\u8fd1\u9605\u8bfb\u3001\u5c1a\u672a\u5206\u7c7b\u3001\u4e34\u65f6\u4e66\u67b6\u3001\u672c\u5730\u5bfc\u5165<\/text>\t\n\t  <text x=\"320\" y=\"265\" font-family=\"Arial, sans-serif\" font-size=\"40\" fill=\"blue\" font-weight=\"bold\">\uff088\u4e2a\u5b57\u4ee5\u5185\uff0c\u8f93\u5165\u540e\u70b9\u201c\u2713\u201d\uff09<\/text>\t\n\t   <text x=\"200\" y=\"155\" font-family=\"Arial, sans-serif\" font-size=\"30\" fill=\"#333\" font-weight=\"bold\">\u6dfb\u52a0\u6210\u529f\u540e\uff0c\u53d1\u73b0\u7684\u6392\u5e8f\u4f1a\u5220\u9664\uff0c\u9700\u8981\u91cd\u65b0\u9009\u62e9\u4e66\u67b6\u6392\u5e8f<\/text>\t\n\t<\/svg>`;\n\tsvg=java.base64Encode(svg);\n\tif(Map(\"token\")){\n\t\tlet code = String(java.getVerificationCode('data:image\/svg+xml;base64,'+svg));\n\t\tlet url = \"https:\/\/android.jjwxc.net\/app.jjwxc\/android\/reading\/FavoriteClass\/addFavoriteClassname\";\n\t\tlet body = {\n\t\t\t\"versionCode\":\"444\",\n\t\t\"token\":Map(\"token\"),\n\t\t\"classname\":code,\n\t\t\"sort\":\"0\"\n\t\t}\n\t\tbody = encode(JSON.stringify(body));\n\t\t\tvar headers = {\n        \"versioncode\": \"444\",\n        \"versiontype\":\"reading\",\n        \"User-Agent\":java.getWebViewUA()\n    };\n    \n    let response = java.post(url,body,headers).body();\n    let message = JSON.parse(response).message;\n    if(message===\"\u6dfb\u52a0\u6536\u85cf\u5206\u7c7b\u6210\u529f\uff01\"){\n    \tgetShelf();\n    \t}\n java.longToast(JSON.parse(response).message);\n\t\t}else{java.longToast(\"\u8bf7\u5148\u767b\u5f55\");return \"\"}\t\n\t\t}catch(e){java.log(e)}\n\t}\n\t\n\t\nfunction delShelf(){\n\ttry{\n\tlet svg=`<svg width=\"1150\" height=\"300\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n\t  <rect width=\"100%\" height=\"100%\" fill=\"#f0f0f0\" \/>\t\n\t  <text x=\"20\" y=\"160\" font-family=\"Arial, sans-serif\" font-size=\"105\" fill=\"#333\" font-weight=\"bold\">\u8f93\u5165\u8981\u5220\u9664\u7684\u4e66\u67b6\u540d\u79f0<\/text>\t\n\t  <text x=\"420\" y=\"255\" font-family=\"Arial, sans-serif\" font-size=\"40\" fill=\"blue\" font-weight=\"bold\">\uff08\u8f93\u5165\u540e\u70b9\u201c\u2713\u201d\uff09<\/text>\n\t  <text x=\"200\" y=\"205\" font-family=\"Arial, sans-serif\" font-size=\"30\" fill=\"#333\" font-weight=\"bold\">\u5220\u9664\u6210\u529f\u540e\uff0c\u53d1\u73b0\u7684\u6392\u5e8f\u4f1a\u5220\u9664\uff0c\u9700\u8981\u91cd\u65b0\u9009\u62e9\u4e66\u67b6\u6392\u5e8f<\/text>\t\n\t<\/svg>`;\n\tsvg=java.base64Encode(svg);\n\tif(Map(\"token\")){\n\t\tlet code = String(java.getVerificationCode('data:image\/svg+xml;base64,'+svg));\n\t\tlet re = new RegExp('\"'+code+\"::(\\\\d+)\");\n\t\tlet classid = String(source.getVariable()).match(re)?.[1]??null;\n\t\tlet url = \"https:\/\/android.jjwxc.net\/app.jjwxc\/android\/reading\/FavoriteClass\/delByClassid\";\n\t\tlet body = {\n\t\t\t\"versionCode\":\"444\",\n\t\t\"token\":Map(\"token\"),\n\t\t\"classid\":classid,\n\t\t\"sort\":\"0\"\n\t\t}\n\t\tbody = encode(JSON.stringify(body));\n\t\t\tvar headers = {\n        \"versioncode\": \"444\",\n        \"versiontype\":\"reading\",\n        \"User-Agent\":java.getWebViewUA()\n    };\n    \n    let response = java.post(url,body,headers).body();\n    let message = JSON.parse(response).message;\n    if(message===\"\u5220\u9664\u6210\u529f\"){\n    \tgetShelf();\n    \t}\nclassid!==null?java.longToast(JSON.parse(response).message):java.longToast(\"\u5728\u6e90\u53d8\u91cf\u7684\u4e66\u67b6\u6570\u636e\u4e2d\uff0c\u672a\u627e\u5230\u6b64\u4e66\u67b6\");\n\t\t}else{java.longToast(\"\u8bf7\u5148\u767b\u5f55\");return \"\"}\t\n\t\t}catch(e){java.log(e)}\n\t}\n\n\nfunction showShelf(){\n\ttry{\n\t\tif(!\/\u2757\ufe0f([\\s\\S]+?)\u2757\ufe0f\/.test(String(source.getVariable()))){\n\t\t\tjava.longToast(\"\u8bf7\u5148\u70b9\u51fb\u83b7\u53d6\u4e66\u67b6\u6570\u636e\uff0c\u53ea\u9700\u70b9\u4e00\u6b21\");\n\t\t\treturn \"\"\n\t\t}\n\t\tlet sourceGet = String(source.getVariable()).match(\/\u2757\ufe0f([\\s\\S]+?)\u2757\ufe0f\/)[1];\nlet html = `<html><head><meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\"><title>\u4e66\u67b6\u7ba1\u7406<\/title><style>body{font-family:Arial,sans-serif;max-width:800px;margin:0 auto;padding:20px}h1{text-align:center}.a{margin:10px 0;padding:10px;border:1px solid #ddd;border-radius:5px}.b{font-weight:bold;margin-bottom:5px}.c{color:#666;font-size:.9em;margin-left:5px}.d{background-color:#f5f5f5;padding:15px;margin-bottom:20px}.e{display:flex;align-items:center;gap:15px;margin-top:8px}select{padding:5px}.f{margin-right:10px}.g{background-color:#f0f8ff}<\/style><\/head><body><h1>\u4e66\u67b6\u7ba1\u7406<\/h1><p class=\"note\">\u9009\u62e9\u5b8c\u4ee5\u540e\u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\"\u2713\"\u786e\u5b9a\u5e76\u5237\u65b0\u53d1\u73b0<\/p><div class=\"d\"><h3>\u5168\u5c40\u6392\u5e8f\u8bbe\u7f6e<\/h3><div class=\"e\"><select id=\"h\" onchange=\"i()\"><option value=\"0\">-- \u5168\u5c40\u6392\u5e8f\u65b9\u5f0f --<\/option><option value=\"1\">\u6309\u66f4\u65b0\u65f6\u95f4<\/option><option value=\"2\">\u6309\u6536\u85cf\u65f6\u95f4<\/option><option value=\"3\">\u6309\u4f5c\u54c1\u6536\u85cf\u6570<\/option><option value=\"4\">\u6309\u4f5c\u54c1\u5b57\u6570<\/option><\/select><\/div><\/div><div id=\"j\"><\/div><script>\nvar k=${sourceGet},l=k.map(function(m,n){var o=m.split(\"::\"),p=o[1].split(\",\");return{q:o[0],r:p[0],s:p[1]===\"1\",t:p[2]||\"0\",u:n,v:o[0]===\"\u6211\u7684\u6536\u85cf\"}});\nvar m=l.find(function(m){return m.q===\"\u6211\u7684\u6536\u85cf\"});\nif(!m)l.unshift({q:\"\u6211\u7684\u6536\u85cf\",r:\"-1\",t:\"0\",s:true,v:true,u:0});\nl.forEach(function(m,n){m.u=n});\nfunction w(){var x=document.getElementById(\"j\");x.innerHTML=\"\";l.forEach(function(m,n){var y=document.createElement(\"div\");y.className=m.v?\"a g\":\"a\";var z=document.createElement(\"div\");z.className=\"b\";z.appendChild(document.createTextNode(m.q+\" (ID: \"+m.r+\")\"));var A=document.createElement(\"span\");A.className=\"c\",A.id=\"B_\"+n,z.appendChild(A);var C=document.createElement(\"div\");C.className=\"e\";var D=document.createElement(\"input\");D.type=\"checkbox\",D.className=\"f\",D.checked=m.s,D.disabled=m.v,D.onchange=function(){m.s=this.checked,E(n)};var F=document.createElement(\"select\");F.id=\"G_\"+n,F.onchange=function(){m.t=this.value,E(n)},F.innerHTML='<option value=\"0\">-- \u9009\u62e9\u6392\u5e8f\u65b9\u5f0f --<\/option><option value=\"1\">\u6309\u66f4\u65b0\u65f6\u95f4<\/option><option value=\"2\">\u6309\u6536\u85cf\u65f6\u95f4<\/option><option value=\"3\">\u6309\u4f5c\u54c1\u6536\u85cf\u6570<\/option><option value=\"4\">\u6309\u4f5c\u54c1\u5b57\u6570<\/option>',F.value=m.t||\"0\";C.appendChild(D),C.appendChild(document.createTextNode(\"\u542f\u7528\")),C.appendChild(F),y.appendChild(z),y.appendChild(C),x.appendChild(y),E(n)})}\nfunction E(n){var m=l[n];m&&(n=document.getElementById(\"B_\"+n))&&(n.textContent=(m.s?\"1\":\"0\")+\",\"+([\"0\",\"1\",\"2\",\"3\",\"4\"][m.t]||\"0\"))}\nfunction i(){var H=document.getElementById(\"h\").value;if(H!==\"0\"){l.forEach(function(m,n){m.t=H;var I=document.getElementById(\"G_\"+n);I&&(I.value=H,E(n))})}}\nw();\n<\/script><\/body><\/html>`;\n\nlet base64 = `data:text\/html;base64,${java.base64Encode(html)}`;\nlet body = java.startBrowserAwait(base64,\"\u4e66\u67b6\u7ba1\u7406\",false).body();\n\nlet Jsoup = org.jsoup.Jsoup.parse(body);\nlet shelfElements = Jsoup.select(\"div.b\");\nlet result = Array.from(shelfElements).map(el => {\n  let text = el.text().trim();\n  let match = text.match(\/^(.+?)\\s*\\(ID:([\\-\\d\\s]+)\\)(\\d+),(\\d+)$\/);\n  if (!match) return null;\n  let name = match[1].trim();\n  let id = (match[2] || '').trim(); \n  let enabled = match[3];\n  let sortId = match[4];\n  return `${name}::${id},${enabled},${sortId}`;\n}).filter(Boolean);\n\nsourceGet = String(source.getVariable()).replace(\/\\n*(?:\u8bf7\u52ff\u5220\u9664\u6b64\u4e66\u67b6\u6570\u636e)*\u2757\ufe0f[\\s\\S]+?\u2757\ufe0f\/g,'');\nlet ShlefClass = \"\u8bf7\u52ff\u5220\u9664\u6b64\u4e66\u67b6\u6570\u636e\u2757\ufe0f\"+JSON.stringify(result)+\"\u2757\ufe0f\"\n\tsource.setVariable(sourceGet+\"\\n\"+ShlefClass);\n\tlet shelfshow = Jsoup.select(\"div.b:has(span:contains(1,))\").toArray().map(x=>{\nreturn String(x.select(\"span\").attr(\"id\")).replace(\/B_\/,'')\n\t}).join(\",\");\nsetHeaders(\"classNum=\"+shelfshow);\n\tjava.toast(\"\u8bbe\u7f6e\u6210\u529f\uff0c\u8bf7\u5237\u65b0\u53d1\u73b0\");\n\t}catch(e){\n\t\tjava.log(e)\n\t}\n}\n\nfunction getFl(){\n\tlet svg=`<svg width=\"1150\" height=\"300\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n\t  <rect width=\"100%\" height=\"100%\" fill=\"#f0f0f0\" \/>\t\n\t  <text x=\"20\" y=\"60\" font-family=\"Arial, sans-serif\" font-size=\"35\" fill=\"#333\" font-weight=\"bold\">\u9009\u9879\uff08\u586b\u5199\u9700\u8981\u7684\u5e8f\u53f7\u540e\uff0c\u70b9\u201c\u2713\u201d\u786e\u8ba4\uff0c\u5982\uff1a2,5\u3010\u9ed8\u8ba4\u4e3a9,10\u3011\uff09<\/text>\t\n\t  <text x=\"50\" y=\"60\" font-family=\"Arial, sans-serif\" font-size=\"30\" fill=\"#555\">\n\t    <tspan x=\"150\" dy=\"1.5em\">0. \u53e4\u4ee3\u8a00\u60c5<\/tspan>\n\t    <tspan x=\"400\" dy=\"0\">1. \u73b0\u4ee3\u8a00\u60c5<\/tspan>\n\t    <tspan x=\"650\" dy=\"0\">2. \u5e7b\u60f3\u73b0\u8a00<\/tspan>\n\t    <tspan x=\"900\" dy=\"0\">3. \u53e4\u4ee3\u7a7f\u8d8a<\/tspan>\n\t    <tspan x=\"150\" dy=\"1.5em\">4. \u5947\u5e7b\u8a00\u60c5<\/tspan>\n\t    <tspan x=\"400\" dy=\"0\">5. \u672a\u6765\u6e38\u620f\u60ac\u7591<\/tspan>\n\t    <tspan x=\"650\" dy=\"0\">6. \u90fd\u5e02\u7eaf\u7231<\/tspan>\n\t    <tspan x=\"900\" dy=\"0\">7. \u73b0\u4ee3\u5e7b\u7eaf<\/tspan>\n\t    <tspan x=\"150\" dy=\"1.5em\">8. \u53e4\u4ee3\u7eaf\u7231<\/tspan>\n\t    <tspan x=\"400\" dy=\"0\">9. \u767e\u5408<\/tspan>\n\t    <tspan x=\"650\" dy=\"0\">10. \u65e0CP<\/tspan>\n\t    <tspan x=\"900\" dy=\"0\">11. \u884d\u751f\u65e0CP<\/tspan>\n\t    <tspan x=\"150\" dy=\"1.5em\">12. \u884d\u751f\u7eaf\u7231<\/tspan>\n\t    <tspan x=\"400\" dy=\"0\">13. \u884d\u751f\u8a00\u60c5<\/tspan>\n\t    <tspan x=\"650\" dy=\"0\">14. \u4e8c\u6b21\u5143\u8a00\u60c5<\/tspan>\n\t    <tspan x=\"900\" dy=\"0\">15. \u591a\u5143<\/tspan>\n\t    <tspan x=\"150\" dy=\"1.5em\">16. \u7537\u4e3b\u65e0CP<\/tspan>\n\t    <tspan x=\"400\" dy=\"0\">17. \u5973\u4e3b\u65e0CP<\/tspan>\n\t    <tspan x=\"650\" dy=\"0\">18. \u672a\u6765\u5e7b\u7eaf<\/tspan>\n\t  <\/text>\n\t<\/svg>`;\n\tsvg=java.base64Encode(svg);\n\tsaveTag(svg,\"fl\")\n}\n\nfunction getTag(){\n\tlet svg=`<svg width=\"1150\" height=\"300\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n\t  <!-- \u80cc\u666f\u77e9\u5f62 -->\n\t  <rect width=\"100%\" height=\"100%\" fill=\"#f0f0f0\" \/>\t\n\t  <!-- \u6807\u9898 -->\n\t  <text x=\"20\" y=\"40\" font-family=\"Arial, sans-serif\" font-size=\"35\" fill=\"#333\" font-weight=\"bold\">\u9009\u9879\uff08\u586b\u5199\u9700\u8981\u7684\u5e8f\u53f7\u540e\uff0c\u70b9\u201c\u2713\u201d\u786e\u8ba4\uff0c\u5982\uff1a2\u3010\u9ed8\u8ba4\u4e3a5\uff0c\u53ea\u80fd\u5355\u9009\u3011\uff09<\/text>\t\n\t  <!-- \u9009\u9879\u5217\u8868 -->\n\t  <text x=\"60\" y=\"60\" font-family=\"Arial, sans-serif\" font-size=\"50\" fill=\"#555\">\n\t    <tspan x=\"150\" dy=\"2.5em\">1. \u8a00\u60c5<\/tspan>\n\t    <tspan x=\"400\" dy=\"0\">2. \u7eaf\u7231<\/tspan>\n\t    <tspan x=\"650\" dy=\"0\">3. \u767e\u5408<\/tspan>\n\t    <tspan x=\"150\" dy=\"1.5em\">4. \u65e0CP<\/tspan>\n\t    <tspan x=\"400\" dy=\"0\">5. \u591a\u5143<\/tspan>\n\t  <\/text>\n\t<\/svg>`;\n\tsvg=java.base64Encode(svg);\n\tsaveTag(svg,\"bq\")\n}\n\n\nfunction getloginUrl() {\n\tlet \u8d26\u53f7 = result.get(\"\u8d26\u53f7\");\n\tlet \u5bc6\u7801 = result.get(\"\u5bc6\u7801\");\n\tlet en = encode(\u5bc6\u7801);\n\tlet id = (\"846\"+Date.now()+\"4893\") + \":\" + java.androidId() + \"d4:\";\n\tlet sign = encode(Date.now() + \"_\" + id + \"_\");\n\tlet loginUrl = `https:\/\/app.jjwxc.org\/androidapi\/login?versionCode=401&loginName=${encodeURIComponent(\u8d26\u53f7)}&encode=1&loginPassword=${encodeURIComponent(en)}&sign=${encodeURIComponent(sign)}&identifiers=${encodeURIComponent(id)}&autologin=1`;\n\treturn loginUrl\n}\n\nfunction getCode(t) {\n\ttry {\n\t\tlet \u9a8c\u8bc1\u7801 = result.get(\"\u9a8c\u8bc1\u7801\uff08\u586b\u5b8c\u9a8c\u8bc1\u7801\u540e\uff0c\u8981\u70b9\ud83d\udc64\u767b\u5f55\uff09\");\n\t\tlet \u8d26\u53f7 = result.get(\"\u8d26\u53f7\");\n\t\tlet \u5bc6\u7801 = result.get(\"\u5bc6\u7801\");\n\t\tif (!\/^\\d{4,}\/.test(\u9a8c\u8bc1\u7801)) {\n\t\t\tlet res = JSON.parse(java.ajax(getloginUrl()));\n\t\t\tif (res.code == \"221003\") {\n\t\t\t\tlet url = \"https:\/\/app.jjwxc.org\/\/appDevicesecurityAndroid\/getDeviceSecurityCode\";\n\t\t\t\tbody = \"versionCode=401&username=\" + encodeURIComponent(\u8d26\u53f7) + \"&checktype=\" + t;\n\t\t\t\toption = {\n\t\t\t\t\t\"method\": \"POST\",\n\t\t\t\t\t\"body\": String(body)\n\t\t\t\t}\n\t\t\t\tmsg = JSON.parse(java.ajax(url + \",\" + JSON.stringify(option))).data.message;\n\t\t\t\tjava.toast(msg);\n\t\t\t} else {\n\t\t\t\tmsg = \/\u6821\u9a8c\u9a8c\u8bc1\u7801\/.test(res.message) ? \"\u8bf7\u8bf7\u5c1d\u8bd5\u586b\u5165\u4e0a\u6b21\u53d1\u7ed9\u4f60\u7684\u9a8c\u8bc1\u7801\uff08\u53ef\u80fd\u662f\u5f88\u4e45\u4e4b\u524d\u7684\uff09\" : res.message;\n\t\t\t\tmsg = msg??\"\u2705\u767b\u5f55\u6210\u529f\\n\u2757\ufe0f\u8bf7\u4f60\u5220\u9664\u6293\u5305token\u91cc\u7684\u503c\uff0c\u4ee5\u514d\u88ab\u65e7\u503c\u8986\u76d6\\n\ud83c\udd95\u6700\u65b0token\u503c\uff1a\"+res.token+\"\\n\u2705\u65e0\u9700\u586b\u9a8c\u8bc1\u7801\";\n\t\t\t   java.log(msg);\n\t\t\t   java.longToast(msg);\n\t\t\t   if (\/\\d+_[a-z\\d]+\/.test(String(res.token))) {\n\t\t\t\t\tjava.log(\"\u83b7\u53d6token\u503c\uff1a \" + res.token);\n\t\t\t\t\tLoginToken(String(res.token))\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tlet getCodeurl = getloginUrl() + \"&checktype=\" + t + \"&checkdevicecode=\" + \u9a8c\u8bc1\u7801;\n\t\t\tlet data = java.ajax(getCodeurl);\n\t\t\tlet token = JSON.parse(data).token ?? JSON.parse(data).message;\n\t\t\tjava.longToast(\"\u2705\u767b\u5f55\u6210\u529f\\n\u2757\ufe0f\u8bf7\u4f60\u5220\u9664\u6293\u5305token\u91cc\u7684\u503c\uff0c\u4ee5\u514d\u88ab\u65e7\u503c\u8986\u76d6\\n\ud83c\udd95\u6700\u65b0token\u503c\uff1a\"+token);\n\t\t\tjava.log(\"\u83b7\u53d6\u5230\u7684token\u503c: \" + token)\n\t\t\tLoginToken(token)\n\t\t}\n\t} catch (e) {\n\t\tjava.log(e)\n\t}\n}\n\t\nfunction LoginToken(token){\n\ttry{\n\ttoken = String(token).replace(\/undefined|token=|\\s|&.*\/g,'');\n\tif(!\/\\d+_\\w{32}\/.test(token)){\n\t\tjava.log(\"token\u503c\u53ef\u80fd\u6709\u8bef\uff0c\u8bf7\u68c0\u67e5\u586b\u5199\u7684token\u503c\")\n\t\t}\n\t\n\tlet fl = Map(\"fl\")==\"\"?\"9,10\":Map(\"fl\");\n\tlet search = Map(\"search\")==\"\"?\"1,8\":Map(\"search\");\n\tlet bq = Map(\"bq\")==\"\"?\"5\":Map(\"bq\");\t\n\tlet at = source.getLoginInfoMap()?.get(\"\u4f5c\u8005\u5217\u8868\uff08\u4f5c\u8005::\u4f5c\u8005id \u6ce8\u610f\u6dfb\u52a0\u591a\u4e2a\u7528\u7a7a\u683c\u5206\u5272\uff09\");\n\tat = String((at==\"\"||at==null||at==undefined)?\"\":at);\n\tlet classNum = Map(\"classNum\");\n\t\n\tsetHeaders(\n\t\t`token=${token}`,\n\t\t`fl=${fl}`,\n\t\t`bq=${bq}`,\n\t\t`classNum=${classNum}`,\n\t\t`at=${java.base64Encode(at)}`,\n\t\t`search=${search}`\n\t)\n}catch(e){\n\tjava.log(e);\n\t}\n}\n\t\nfunction login(){\n\tlet token = Map(\"token\");\n\tlet t = source.getLoginInfoMap()[\"token\u767b\u5f55[\u2757\ufe0f\u6ca1\u4e8b\u4e0d\u8981\u586b\u8fd9\u91cc\uff0c\u4e09\u9009\u4e00\u767b\u5f55]\"];\t\t\n\tif(t!=\"\"&&t!=null)token = t;\t\n\tLoginToken(token);\n\t}","respondTime":180000,"ruleBookInfo":{"author":"$.authorName","canReName":"1","coverUrl":"{{$.originalCover||$.novelCover}}\n<js>\nif(\/(?:postimg|bmp|alicdn)\\.\/.test(result)){\n\tjava.setContent(src);\n\tresult = \"https:\/\/i9-static.jjwxc.net\/novelimage.php?novelid={{$.novelId}}\"\n\t}else{\n\t\tresult = result\n\t\t}\n\t\theader = {\n\t\t\"headers\":{\n\t\t\t\"referer\":result.match(\/(^https?:\\\/\\\/.*?\\\/)\/)[1]\n\t\t\t}\n\t\t}\nresult = (result +\",\"+ JSON.stringify(header)).replace(\/wx\\d+\/,'wx2')\n<\/js>","intro":"<js>\n\/\/\u8bf7\u5047\u6761\ntry{\na=JSON.parse(java.ajax('http:\/\/app.jjwxc.org\/androidapi\/getnovelOtherInfo?novelId='+baseUrl.match(\/(\\d+)\/)[1]+'&type=novelbasicinfo&versionCode=163'));\n\njava.put(\"pv\",a.novelreview)\n\n$=a.novelLeave;\nn='\\n';\nleave=$?.leaveContent?'\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2022\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014'+n+'\u200b'+n+$?.leaveDateBack+n+'\u200b'+'\u200b'+'      '+$?.leaveContent+n+$?.leaveDate.replace(\/\u8bf7\u5047\u65f6\u95f4\uff1a\/,'\u231a\ufe0f')+n+$.leaveIntro:'';\njava.put('leave',leave);\njava.put('intro',JSON.parse(result).novelIntro.replace(\/\\#\/g,'\uff03'));\nresult}catch(err){\njava.log(err);\njava.put('leave',\"\");\njava.put('intro',\"\");\n}\n<\/js>\n&nbsp;\n\ud83d\udcd6{{$.novelIntroShort##\u3002$}}\ud83d\udcd6\n{{'\\n\u3164'}}<br>\n\ud83c\udfc6{{$.ranking}}    \ud83c\udf7c{{$.nutrition_novel}}    \ud83d\udcdd{{$.comment_count}}    \ud83d\udd16{{$.novelStyle||$.novelstyle}}\n\u25c9 \u6700\u65b0\uff1a{{java.get(\"lastChapter\")}}<br>\n\u25c9 \u6807\u7b7e\uff1a{{$.novelTags##,|\\s##\ud83c\udff7}}<br>\n\u25c9 {{$.protagonist##,|\uff0c|\uff1b|;##\u3001}}<br>\n\u25c9 {{$.costar##,|\uff0c|\uff1b|;##\u3001}}<br>\n\u25c9 {{$.other##,|\uff0c|\uff1b|;##\u3001}}<br>\n\u25c9 \u89c6\u89d2\uff1a{{$.mainview}}<br>\n\u25c9 \u8bc4\u5206\uff1a{{java.get(\"pv\")}}<br>\n\u25c9 \u6536\u85cf\uff1a{{$.novelbefavoritedcount}} {{a=JSON.parse(java.post(\"https:\/\/android.jjwxc.net\/app.jjwxc\/android\/reading\/UserSetting\/getUserBaseInfoSetting\",String(encode(JSON.stringify({\"versionCode\":\"444\",\"novelid\":java.getString(\"$.novelId\")}))),{\"sign\":encode(JSON.stringify({\"token\":Map('token'),\"time\":Date.now()})),\"versionCode\": \"444\",\t\"versiontype\":\"reading\"}).body())?.data?.fav_status??\"\";a===\"1\"?\"\u4f5c\u54c1\u5df2\u6536\u85cf\":\"\"}}<br>\n{{String(java.get('intro')).replace(\/\u7acb\u610f:\/,'\u25ce\u25ce \u7acb\u610f\uff1a')}}<br>{{java.get('leave')}}<br>\n{{'\\n'+'\u200b'}}\n\u6dfb\u52a0\u4f5c\u8005\uff1a{{$.authorName}}::{{$.authorId}}\n<js>\nresult=String(result);\nli=result.match(\/\u25ce \u7acb\u610f.*\/)?'\u3164\\n'+result.match(\/(\u25ce \u7acb\u610f.*?<br>)\/)[1]:'';\nString(result).replace(\/\ud83d\udcd6\ud83d\udcd6|\ud83d\udcd6''\ud83d\udcd6\/,'').replace(\/(\u25c9 \u6536\u85cf.*?<br>)\/,'$1\\n'+li+'\u3164\\n'+'\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2022\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\\n').replace(\/\u25ce\u25ce \u7acb\u610f.*<br>\/,'').replace(\/(?:\u25c9 \u6807\u7b7e\uff1a|\u25c9 \u4e3b\u89d2\uff1a|\u25c9 \u914d\u89d2\uff1a|\u25c9 \u5176\u5b83\uff1a|\u25c9 \u89c6\u89d2\uff1a|\u25c9 \u8bc4\u5206\uff1a|\u25c9 \u6700\u65b0\uff1a|\u3164\\n\u25ce \u7acb\u610f\uff1a)<br>\/g,'')<\/js>","kind":"{{step=java.getString('$.novelStep')=='2'?'\u5df2\u5b8c\u7ed3':'\u8fde\u8f7d\u4e2d';}},{{$.novelClass}}##-##,","lastChapter":"<js>\ntry{\n\tnovelId = baseUrl.match(\/(\\d+)\/)[1];\nlastStr = java.ajax(\"https:\/\/android.jjwxc.net\/androidapi\/chapterList?novelId=\"+novelId+\"&more=0&whole=1\");\n\ncache.put(\"\u6709\u5377\u540dsrc\"+novelId, lastStr, 60)\n\nlast=JSON.parse(lastStr).chapterlist;\n\n\n\n$=last[last.length-1];\nvip= ($.isvip!=='0');\npoint=($.point=='0');\nchapterMessage =\/\u798f\u5229\u756a\u5916\/.test($.chapterMessage);\nvip = (point&&vip)?\"\":\"\ud83d\udd12\"\nvip = chapterMessage?\"\ud83c\udf81\":vip;\nchapterMessage =\/\u9650\u514d\/.test($.chapterMessage);\nvip = chapterMessage?\"\ud83c\udd93\":vip;\n\nchapterid=$.chapterid;\nchaptername=$.chaptername;\ndate=$.chapterdate;\nresult = vip+chapterid+'.'+chaptername+'\u2022'+date;\n\njava.put(\"lastChapter\",result)\n}\ncatch(err){\nresult=\"\u8bf7\u5237\u65b0\u6216\u6682\u65e0\u76ee\u5f55\"\n}\n<\/js>","name":"$.novelName","tocUrl":"@js:\ntoken = Map(\"token\");\nnovelId=baseUrl.match(\/novelId=(\\d+)\/)[1];\nurl = `token=${token}&novelId=${novelId}`;\nresult = `data:token;base64,${java.base64Encode(url)},{\"type\":\"jjwx\"}`;","wordCount":"$.novelSizeformat||novelsizeformat"},"ruleContent":{"content":"<js>\ntry{\nconst bbb = book.getVariable(\"custom\");\nconst sss = source.getVariable();\nif (\/jjwxc|vipContent\/.test(baseUrl)) {\n\tfunction decode(){\n\tbaseUrl = `https:\/\/app.jjwxc.org\/androidapi\/chapterContent?versionCode=381&${bDe(baseUrl)}`;\t   \n    \/\/let date = \"Mobile \" + Date.now();\n    let response = java.get(baseUrl, {});\n    let content = String(response.body());\n    isPay = !\/\"content\"\/.test(content)&&!\/\"data\":{}\/.test(content);\n    if(isPay){\n    let accesskey = String(response.header(\"accesskey\"));\n    let keyString = String(response.header(\"keystring\"));\n    let accesskeyLen = accesskey.length;\n    let v6 = accesskey.charCodeAt(accesskeyLen - 1);\n    let v9 = 0;\nfor (var i = 0; i < accesskey.length; i++) {\n    v9 += accesskey.charCodeAt(i);\n}\n    let v15 = v9 % keyString.length;\n    let v17 = Math.floor(v9 \/ 65);\n    let v18 = keyString.length;\n    let v43 = keyString.substring(v15, v17 + v15 > v18 ? v18 : v17 + v15);;\n    let v32 = content.length;\n    let [v38, dest] = (v6 & 1) !== 0 ? [content.slice(-12), content.slice(0, -12)] : [content.slice(0, 12), content.slice(12)];\n    let key = java.md5Encode(v43 + v38).slice(0, 8);\n    let iv = java.md5Encode(v38).slice(0, 8);\n    content = java.createSymmetricCrypto(\"DES\/CBC\/PKCS5Padding\", key, iv).decryptStr(dest);\n    }    \n    return content\n}\n\t\n    let intro = String(java.get(\"intro1\")).replace(\/\\s\/g, '');   \n    const hasContent = \/\"content\"\/.test(result);    \n    java.setContent(hasContent ? result : decode());\n    intro = intro ? `\u25ce${intro}\u25ce<br>` : '';\n    let content = String(java.getString(\"$..content\"));\n    let saybody = String((\/\u5173\u95ed\u4f5c\u8bdd\/.test(bbb) || \/\u5173\u95ed\u4f5c\u8bdd\/.test(sss))?\"\":java.getString(\"$..sayBody\"));\n   saybody = saybody.replace(\/(?:.*(?:\u87f9\u87f9|\u6254\u4e86|\u611f\u8c22|\u6295\u51fa|\u704c\u6e89\u8425\u517b\u6db2|\u9001\u7684|\u8c22\u8c22).*?(?:\u624b\u69b4|\u6708\u7968|\u9738\u738b\u7968|\u5c0f\u5929\u4f7f|\u706b\u7bad\u70ae|\u6df1\u6c34\u9c7c\u96f7|\u6d45\u6c34\u70b8\u5f39|\u5730\u96f7|\u8425\u517b\u6db2)([xX]\\d+)*.*|\u975e\u5e38\u611f\u8c22\u5927\u5bb6\u5bf9\u6211\u7684\u652f\u6301\uff0c\u6211\u4f1a\u7ee7\u7eed\u52aa\u529b\u7684\uff01|.*?\u74f6[\uff1b~]|\u201c.*?\u201d(?:\u8425\u517b\u6db2|\u624b\u69b4\u5f39|\u6708\u7968|\u9738\u738b\u7968|\u5c0f\u5929\u4f7f|\u706b\u7bad\u70ae|\u6df1\u6c34\u9c7c\u96f7|\u6d45\u6c34\u70b8\u5f39|\u5730\u96f7)x\\d+|\u8bfb\u8005.*?(\u6708\u77f3|\u8425\u517b\u6db2).*|\u5730\u96f7\u611f\u8c22\uff1a[\\s\\S]+)\/g,'');\n    \n    \n    let say = \/[\\u4e00-\\u9fa5]\/.test(saybody) \n                      ? `\\n\u3010\ud83d\udce2\u4f5c\u8005\u6709\u8bdd\u8bf4\u3011\\n${saybody}` : '';\n    \n    if (\/token|vipContent\/.test(baseUrl)) {\t   \n        const vipc = content.length > 30\n        ? java.createSymmetricCrypto(\"DES\/CBC\/PKCS5Padding\", \"KW8Dvm2N\", \"1ae2c94b\").decryptStr(content) \n        : `${\/23110\/.test(String(java.getString(\"$..message\")))?\"\u8bf7\u4f7f\u7528\u5b89\u5353\u7aef\u7684token\":java.getString(\"$..message\")}\\n\u2757\ufe0f\u767b\u5f55\u540e\u8bf7\u5148\u66f4\u65b0\u76ee\u5f55\uff0c\u518d\u5237\u65b0\u6b63\u6587`;\n        result = intro + vipc + say;\n    } else {\n        result = intro + content + say;\n    }\n} \nresult;\n}catch(e){\n\tjava.log(e)\n\t}\n<\/js>\n##\u4e3a\u8425\u9020\u66f4\u597d\u7684\u8bc4\u8bba\u73af\u5883\uff0c\u8fd1\u671f\u7f51\u7ad9\u8981\u6c42\u53d1\u8bc4\u987b\u8fdb\u884c\u5b9e\u540d\u8ba4\u8bc1\uff0c\u672a\u5b9e\u540d\u7528\u6237\u8bc4\u8bba\u6682\u65f6\u4ec5\u5728\u5bf9\u5e94\u4f5c\u8005\u540e\u53f0\u53ca\u53d1\u8bc4\u7528\u6237\u540e\u53f0\u53ef\u89c1.*|\u83b7\u53d6\u6b63\u6587\u5931\u8d25[\\s\\S]+|\u25ce\\s+?\u25ce|\u25ceundefined\u25ce","imageStyle":"TEXT","payAction":"baseUrl = bDe(baseUrl);\ncid = baseUrl.match(\/chapterId=(\\d+)\/)[1];\nnid = baseUrl.match(\/novelId=(\\d+)\/)[1];\ntoken = Map(\"token\");\nenbody = String(Date.now())+\":\"+token+\":\"+nid;\nsign = encode(enbody)\nbody = \"versionCode=287&novelId=\"+nid+\"&chapters=\"+cid+\"&orderType=15&isautoBuy=0&autosubscribeStatus=0&notUseBackpoint=&sign=\"+sign;\nurl = \"https:\/\/android.jjwxc.net\/androidapi\/buy,\"\npost = {\n\t\"method\":\"POST\",\n\t\"body\":String(body)\n\t}\n a = java.ajax(url+JSON.stringify(post));\n \n if(\/\u8d2d\u4e70\u6210\u529f\/.test(JSON.parse(a).message)){\n \tjava.longToast(JSON.parse(a).message);\n \tresult  = true\n \t}else{\n \t\tmm = JSON.parse(a).message==\"\"?JSON.parse(a).popupdata.popupmessage+\"\\n\u2757\ufe0f\u8fdb\u664b\u6c5fapp\u8fdb\u884c\u4e00\u6b21\u9a8c\u8bc1\u540e\u2757\ufe0f\u624d\u80fd\u5728\u9605\u8bfbapp\u4f7f\u7528\u8d2d\u4e70\u529f\u80fd\":JSON.parse(a).message;\n \t\tjava.longToast(mm);\n \t\t}","replaceRegex":"<js>\nc = chapter;\nif(\/^\u25ce\/.test(result) ){\n\tchapter = result.match(\/\u25ce([\\s\\S]+?)(\u2026)*\u25ce\/)[1].replace(\/\\s\/g,'').replace(\/,\/g,'\uff0c');\n\tchapter2=result.match(\/\u25ce[\\s\\S]+?\u25ce([\\s\\S]+)\/)[1].replace(\/\\s\/g,'').replace(\/,\/g,'\uff0c');\n\tnum = 4;\tif(chapter.substring(0,num)==chapter2.substring(0,num)){\n\t\tresult = result.replace(\/\u25ce[\\s\\S]+?\u25ce\\s*\/,'')\n\t}else{result}\n}else{result}\n\nfunction removeDuplicatedParagraphs(text, chapterTitle) {\n    var paragraphs = text.split('\\n');\n    var firstParagraph = paragraphs[0].trim();\n    var containsSpecialChar = firstParagraph.includes('\u25ce');\n    var targetIndex = containsSpecialChar ? 1 : 0;\n    var targetParagraph = paragraphs[targetIndex].trim();\n    var lastChar = targetParagraph.charAt(targetParagraph.length - 1);\n    var isPunctuation = \/[\u2014\u2014\u25ce\u3002\uff01\uff1f\uff0c\uff1b\uff1a\\?!,;:\u300b \u3011\uff09\u201d\u2019\u2026~\"'\\)]\/.test(lastChar);\n    \n    if (!isPunctuation) {\n        for (var i = 0; i < chapterTitle.length - 1; i++) {\n            var twoChars = chapterTitle.substring(i, i + 2);\n            if (twoChars === '  ' || twoChars.includes('\u262a')) continue;\n            \n            if (targetParagraph.includes(twoChars)) {\n                java.log(\"\u5220\u9664\u5f53\u524d\u6bb5\u843d\uff1a\" + targetParagraph);\n                java.log(\"\u5f53\u524d\u7ae0\u8282\u540d\uff1a\" + chapterTitle);\n                java.log(\"\u76f8\u540c\u8fde\u7eed\u6587\u5b57\uff1a\" + twoChars);\n                paragraphs.splice(targetIndex, 1);\n                break;\n            }\n        }\n    }\n    return paragraphs.join('\\n');\n}\n\n\nlet bbb = String(book.getVariable(\"custom\"));\nlet sss = String(source.getVariable());\nif(\/\u51c0\u5316\/.test(sss)||\/\u51c0\u5316\/.test(bbb))result = removeDuplicatedParagraphs(result, title);\nresult = result.replace(\/<br\\\/>\/g,'\\n');\n\nresult\n<\/js>"},"ruleExplore":{"author":"$.authorName||$.authorname","bookList":"<js>\nif(\/incrementFavorite\/.test(baseUrl)){\nlet order = Number(java.get(\"order\"));\nfunction sortBooks(data, order) {\n  let sortedData = JSON.parse(data).addData;\n  if (java.get(\"classid\") == \"0\") {\n    sortedData = sortedData.filter(book => book.classId === \"0\");\n  }\n  switch(order) {\n    case 1: \n      sortedData.sort((a, b) => {   \t\n        return Date.parse(b.chapterdateNewest.replace(\/ \/,'T')) - Date.parse(a.chapterdateNewest.replace(\/ \/,'T'));\n      });\n      break;   \n    case 2:\n      sortedData.sort((a, b) => {\n        return Number(b.favoriteDate) - Number(a.favoriteDate);\n      });\n      break;    \n    case 3:\n      sortedData.sort((a, b) => {\n        return Number(b.novelbefavoritedcount) - Number(a.novelbefavoritedcount);\n      });\n      break;    \n    case 4:   \n      sortedData.sort((a, b) => {\n        return Number(b.original_novelsize) - Number(a.original_novelsize);\n      });\n      break;    \n    default:\n      break;\n  }\n  return sortedData;\n}\nresult = JSON.stringify(sortBooks(src,order))\n\t}\n\t\nfunction transformNovelList(jsonData) {\n    const data = typeof jsonData === 'string' ? JSON.parse(jsonData) : jsonData;\n    Object.keys(data.novellist).forEach(categoryName => {\n        data.novellist[categoryName].forEach(novel => {\n            novel.cname = categoryName;\n        });\n    });\n    \n    return JSON.stringify(data)\n}\nif(\/authorid=\/.test(baseUrl))result=transformNovelList(result);\n\nif(baseUrl.includes(\"favObservationByDate\")){\n\tlet nb = String(Map(\"nb\")||\"1,2,3,4,8,9\");\n\tnb = nb.split(\",\");\n\tlet list= JSON.parse(result).data.list;\n\tlet l = [];\n\tlist.forEach((x,i)=>{\n\t\tx.p = \"\u7b2c\"+(i+1)+\"\u540d\";\n\t\tlet fz = x.fit_fenzhan;\n\t\tlet r = fz.filter(v=>nb.includes(v));\n\t\t  if(r.length==2)l.push(x);\n\t\t});\n\t\tresult = JSON.stringify(l);\n\t}\nresult\n<\/js>\n$..[?(@.novelName)]&&$..[?(@.novelname)]&&$.massage\n<js>\nresult = (baseUrl.match(\/signin|getSearchForKeyWords\/))?`{signIn:[${src}]}`:result;\n<\/js>\n$..[?(@.novelName)]&&$..[?(@.novelname)]&&$.signIn[*]","bookUrl":"http:\/\/app-cdn.jjwxc.net\/androidapi\/novelbasicinfo?novelId={{$.novelid||$.novelId}}@put:{id:$.novelid||$.novelId}","coverUrl":"@JSon:$.cover||$.novelCover||$.ebookurl||$.novel_cover\n<js>\nif(\/(?:postimg|bmp|alicdn)\\.\/.test(result)){\n\tjava.setContent(src);\n\tresult = \"https:\/\/i9-static.jjwxc.net\/novelimage.php?novelid={{$.novelId}}\"\n\t}else if(!result){\n\t\tresult = \"https:\/\/i9-static.jjwxc.net\/novelimage.php?novelid={{$.novelid}}\"\t\t}else{\n\t\tresult = result\n\t\t}\n\t\theader = {\n\t\t\"headers\":{\n\t\t\t\"referer\":result.match(\/(^https?:\\\/\\\/.*?\\\/)\/)[1]\n\t\t\t}\n\t\t}\nresult = (result +\",\"+ JSON.stringify(header)).replace(\/wx\\d+\/,'wx2')\n<\/js>","intro":"\ud83d\udcc1{{$.className||cname}}\n\ud83c\udff7{{$.novelClass||$.type##-##\ud83c\udff7}}\n\ud83d\udcd6{{$.novelIntroShort||$.novelintroshort||$.commentBody}}\n{{a = String(java.getString(\"$.buytotal\"));a?\"-------\\n\u8ba2\u9605\u5168\u6587\uff1a\"+a:\"\"}}\n{{a = String(java.getString(\"$.score\"));a?(\"\u6253\u5206\uff1a\"+a):\"\"}}\n{{$.booktype}}\n<js>\nfree=\"{{$.freeDate}}\";\nif(free!=\"\"){\nresult=result+\"\\n\ud83d\uddd3 \u9650\u514d\u65e5\u671f\uff1a\"+free+\"\\n\"\n}else{\nresult=result\n}\n<\/js>\n##(?m)(?:\ud83c\udff7|\ud83d\udcc1)\\s+|\ud83d\udcd6$","kind":"{{$.p}},{{java.getString('$.novelStep||$.novelstep')=='2'?'\u5df2\u5b8c\u7ed3':'\u8fde\u8f7d\u4e2d';}},{{$.channelName&&$.tags##\\s+##,}}","lastChapter":"\u7b2c{{$.maxChapterId}}\u7ae0##\u7b2c\u7ae0","name":"$.novelName||$.novelname||$.message","wordCount":"$.novelSizeformat||$.novelSize"},"ruleSearch":{"author":"$.author","bookList":"$.items[:10]\n<js>\nlet page = java.get(\"page\");\nlet key = java.get(\"key\");\nlet authorUrl = `https:\/\/app.jjwxc.org\/androidapi\/search?versionCode=191&keyword=${key}&type=2&page=${page}&searchType=8&sortMode=DESC`;\nlet authorlist = JSON.parse(java.ajax(authorUrl))?.items;\nlet list = authorlist?result.toArray().concat(authorlist):result.toArray();\nlet json = [];\nlet urls = list.map(x=>{return `https:\/\/www.jjwxc.net\/onebook.php?novelid=${x?.novelid}`});\nlet htmls = java.ajaxAll(urls);\nhtmls.forEach((x,i)=>{\n   \t\t  let html = String(x.body());\t  \n   \t\t  java.setContent(html);    \n   \t\t  let id = String(java.getString(\"@text.wap\u9605\u8bfb\u70b9\u51fb\uff1a@a@text\")).match(\/(\\d+)$\/)?.[1];\n   \t\t  \n        let J = org.jsoup.Jsoup.parse(html);\n        let authorid = J.select('h1+span>a, h2 a').attr(\"href\").match(\/(\\d+)\/)?.[1];\n        let character_name = \"\u4e3b\u89d2\uff1a\"+J.select('.character_name').text();\n        let des = character_name+String(J.select(\"span[style='color:#F98C4D']\").text())\n        .replace(\/\u7acb\u610f\uff1a\/, '\u25ce\u7acb\u610f\uff1a')\n        .replace(\/\u4e00\u53e5\u8bdd\u7b80\u4ecb\uff1a\/, '\u25ce\u4e00\u53e5\u8bdd\u7b80\u4ecb\uff1a') + \"\u25ce\" + java.getElement(\"id.novelintro\").text();\n        title = J.select('h1').text();\n        let author = J.select('span[itemprop=\"author\"]').text();\n        let cover = J.select(\".noveldefaultimage\").attr(\"src\");\n        if (\/(?:postimg|bmp|alicdn)\\.\/.test(cover)) {\n            cover = `https:\/\/i9-static.jjwxc.net\/novelimage.php?novelid=${id}`;\n        }\n        let header = {\n            headers: {\n                referer: cover.match(\/(^https?:\\\/\\\/.*?\\\/)\/)?.[1]\n            }\n        };\n        cover = `${cover},${JSON.stringify(header)}`.replace(\/wx\\d+\/, 'wx2');\n\n        let cat = String(J.select('a[style=\"text-decoration:none;color: red;\"]').text()).replace(\/\\s\/g, ',');\n        let status = String(J.select('span[itemprop=\"updataStatus\"]').text());\n        \n        let size = String(J.select('span[itemprop=\"wordCount\"]').text()).replace(\/\u5b57\/, '');\n        let n = String(java.getElement('@@id.oneboolt@tag.tr.-2@span').text())\n            .replace(\/\\n\/, '\u2022')\n            .replace(\/\\*\u6700\u65b0\u66f4\u65b0\/, '')\n            .replace(\/(.*?)\\[(?:VIP|\u798f\u5229\u756a\u5916)\\]\/, '\ud83d\udd12$1');\n        let num = java.getElement('@@id.oneboolt@tag.tr.-2@tag.td.0').text();\n        let genre = J.select('[itemprop=\"genre\"]').text().split('-')[1];\n        let view = html.match(\/<span>\u4f5c\u54c1\u89c6\u89d2\uff1a<\\\/span>([^<]+)<\\\/li>\/)?.[1].replace(\/\\s\/g, '');\n        \n        json.push({\n            title,\n            author,\n            cat: `${view},${status},${genre},${cat}`,\n            size,\n            url: `https:\/\/app-cdn.jjwxc.net\/androidapi\/novelbasicinfo?novelId=${id}`,\n            des,\n            new: `${num}\u3001${n}`.replace(\/(\\d+\u3001)\ud83d\udd12\/, '\ud83d\udd12$1').replace(\/^\u7ae0\u8282\u3001|\u3001$\/, ''),\n            cover\n        });\n});\nJSON.stringify(json)\n<\/js>\n$.[*]","bookUrl":"$.url","checkKeyWord":"\u51b0\u5c71\u524d\u59bb\u4e0d\u60f3\u62ff\u6211be\u5267\u672c","coverUrl":"$.cover","intro":"$.des","kind":"$.cat","lastChapter":"$.new","name":"$.title","wordCount":"$.size"},"ruleToc":{"chapterList":"<js>\ntry{\nbaseUrl = bDe(baseUrl);\nvar novelId=getNid(baseUrl);\nvar token = Map(\"token\");\nlet sss = String(source.getVariable())\n\nif(\/(\u52a0\u5165|\u79fb\u5165|\u79fb\u51fa).*?\\d*\/.test(sss)){\nlet url,sign,signbody,r;\nif(\/\u52a0\u5165.*?\\d+\/.test(sss)){\nurl = \"https:\/\/android.jjwxc.net\/androidapi\/addFavorite\";\nsignbody = `${Date.now()}:${Map(\"token\")}:${novelId}`;\nsign = encodeURIComponent(encode(signbody));\n post = {\n \t\"method\":\"POST\", \t\"body\":\"versionCode=444&sign=\"+sign+\"&classId=\"+sss.match(\/\u52a0\u5165.*?::(\\d+)\/)[1]\n \t};\nr = java.ajax(url+\",\"+JSON.stringify(post));\nr = JSON.parse(r)?.data?.list?.[0];\njava.longToast((r?.message??\"\u8bf7\u767b\u5f55\")+\"\u81f3\u3010\"+(r?.classname??\"\u8bf7\u767b\u5f55\")+\"\u3011\");\n};\nif(\/\u79fb\u51fa\/.test(sss)){\n\turl = \"https:\/\/android.jjwxc.net\/androidapi\/delFavorite\";\n\tpost = {\n\t\t\"method\":\"POST\",\n\t\t\"body\":`versionCode=444&token=${Map(\"token\")}&novelId=${novelId}`\n\t\t}\n\tr = java.ajax(url+\",\"+JSON.stringify(post));\nr = JSON.parse(r)?.data?.list?.[0];\njava.longToast(r?.message??\"\u8bf7\u767b\u5f55\");\n\t}\nif(\/\u79fb\u5165.*?\\d+\/.test(sss)){\n\turl = \"https:\/\/android.jjwxc.net\/androidapi\/changeNovelFavoriteClass\";\n\tpost = {\n\t\t\"method\":\"POST\",\n\t\t\"body\":`versionCode=444&token=${Map(\"token\")}&novelIds=${novelId}&className=${sss.match(\/\u79fb\u5165(.*?)::\/)[1]}&classId=${sss.match(\/::(\\d+)\/)[1]}`\n\t\t}\nr = java.ajax(url+\",\"+JSON.stringify(post));\nr = JSON.parse(r);\njava.longToast(r?.message??\"\u8bf7\u767b\u5f55\");\n\t}\n\nif(!\/\u6279\u91cf(?:\u52a0\u5165|\u79fb\u51fa|\u79fb\u5165).*\\d*\\s*\/.test(sss)){source.setVariable(sss.replace(\/(?:\u52a0\u5165|\u79fb\u51fa|\u79fb\u5165).*\\d*\\s*\/,''));\n}\n\n\n}\n\n\nvar \u6709\u5377\u540dsrc =!cache.get(\"\u6709\u5377\u540dsrc\"+novelId)?java.ajax(\"https:\/\/android.jjwxc.net\/androidapi\/chapterList?novelId=\"+novelId+\"&more=0&whole=1\"):cache.get(\"\u6709\u5377\u540dsrc\"+novelId);\n\n\u6709\u5377\u540dsrc = JSON.parse(\u6709\u5377\u540dsrc);\n\nvar message = \u6709\u5377\u540dsrc?.message;\nif(\/\\d+_[\\w\\d]{16,}\/.test(token)&&!\/1058\/.test(message)){\n\t\nlet \ttokenUrl =  \"https:\/\/android.jjwxc.net\/androidapi\/chapterList?novelId=\"+novelId+\"&more=0&whole=1&token=\"+token;\n\t\nlet tokenSrc = (!cache.get(\"tokenSrc\"+novelId)||\/\u767b\u5165\u9a8c\u8bc1\u5931\u8d25\/.test(cache.get(\"tokenSrc\"+novelId)))?JSON.parse(java.ajax(tokenUrl)):JSON.parse(cache.get(\"tokenSrc\"+novelId));\n\n\ncache.delete(\"\u6709\u5377\u540dsrc\"+novelId);\n\n\nlet lessData = tokenSrc.chapterlist;\n\nlet moreData = \u6709\u5377\u540dsrc.chapterlist;\nif(lessData!==undefined){\nfor(let item of lessData) {\n    let match = moreData.find(moreItem => moreItem.chapterid === item.chapterid && moreItem.chaptertype === item.chaptertype);\n    if(match) {\n        Object.assign(match, item);\n    }\n}\n}\nJSON.stringify(moreData)\n}else{\n\tresult = JSON.stringify(\u6709\u5377\u540dsrc)\n\t}\n}catch(e){\n\tjava.log(e)\n\t}\n<\/js>\n$.chapterlist[*]||$.[*]\n\n<js>\nlet bbb = String(book.getVariable(\"custom\"));\nfunction readEncrypt(novelid,flag) {\n\t     token = Map(\"token\");   \n     \tFORUMSIGNTAG = 1;\n       READSIGNTAG = 0;\n\t      strArr = [token,novelid,\"autosubscribe\",flag];       \n\t      sb = new Date().getTime().toString();\n         length = strArr.length;\n        for ( i2 = READSIGNTAG; i2 < length; i2 += FORUMSIGNTAG) {\n            str = strArr[i2];\n            sb+=\":\";\n            sb+=str;\n        }   \n     let option = {\n\t    \t\"method\":\"POST\", \t\"body\":\"versionCode=313&sign=\"+encode(sb)\n\t    \t}\n\t    \nurl = \"https:\/\/android.jjwxc.com\/androidapi\/autoSubscribe,\"+JSON.stringify(option)\n\n java.longToast(JSON.parse(java.ajax(url)).message); book.putCustomVariable(bbb.replace(\/(?:\u5f00\u542f|\u5173\u95ed)\u8d2d\u4e70\\s*\/,''));\n    }\n    \n if(\/(\u5f00\u542f|\u5173\u95ed)\u8d2d\u4e70\/.test(bbb)){\n \ta = \/\u5173\u95ed\u8d2d\u4e70\/.test(bbb)?\"cancel\":(\/\u5f00\u542f\u8d2d\u4e70\/.test(bbb)?\"open\":\"cancel\");\n \t\n readEncrypt(result[0].novelid,a)\n \t}\n \t\nresult = result[0]==\"1058\"||result[0]==\"1068\"?JSON.stringify([{\"chaptername\":\"\u6682\u65e0\u76ee\u5f55\",\"chapterid\":\"\",\"islock\":\"0\"}]):result;\n<\/js>\n$.[*]","chapterName":"<js>\n$=result;title=$.chaptername;title=String(title).replace(\/^\\s+\/,'');intro=$.chapterintro;vip=$.isvip!='0';lock=$.islock!='0';type=$.chaptertype=='1'?true:false;num=!type?$.chapterid+\"  \u262a \":'';\nbbb = String(book.getVariable(\"custom\"));\nsss = String(source.getVariable());\n\n\nif(\/\u53bb\u7ae0\u8282\u5e8f\u53f7\/.test(bbb) || \/\u53bb\u7ae0\u8282\u5e8f\u53f7\/.test(sss)){\nnum=''\n}\nif(\/\u7ae0\u8282\u540d\/.test(bbb) || \/\u7ae0\u8282\u540d\/.test(sss)){\nnum=!type?\"\u7b2c\"+$.chapterid+\"\u7ae0 \":'';\n}\ntitle=type?'\ud83d\udcd6 '+title+' \ud83d\udcd6':title;\nif( (\/\u76ee\u5f55\u7b80\u4ecb\/.test(bbb) || \/\u76ee\u5f55\u7b80\u4ecb\/.test(sss))&&!\/\ud83d\udcd6\/.test(title)){\n\tfu = \/\u76ee\u5f55\u7b80\u4ecb\u3010(.*?)\u3011\/.test(bbb)?bbb.match(\/\u76ee\u5f55\u7b80\u4ecb\u3010(.*?)\u3011\/)[1]:sss.match(\/\u76ee\u5f55\u7b80\u4ecb\u3010(.*?)\u3011\/)[1];\n\ttitle = title +(fu===\"\u5220\u9664\"?\"\":fu+intro)\n\t}else{\n\t\tjava.put(\"intro1\",intro);\n\t\t}\nl=lock?'[\u6b64\u7ae0\u8282\u5df2\u9501]':'';\nresult=num+title+l;\n<\/js>","chapterUrl":"@js:\nbaseUrl = bDe(baseUrl);\nnovelId=getNid(baseUrl);\ntoken = Map(\"token\");\n$=result;\nchapterid=$.chapterid;\nvip=$.isvip!='0';\ntype=$.chaptertype=='1';\nif( !type){\nif(!vip){\nresult='https:\/\/app.jjwxc.net\/androidapi\/chapterContent?novelId='+novelId+'&chapterId='+chapterid\n}else{\nurl = `token=${token}&novelId=${novelId}&chapterId=${chapterid}`;\nresult = `data:vipContent;base64,${java.base64Encode(url)}`\n\t}\nresult = result +`,{\t\"js\":\"book?result:toReview(${novelId},${chapterid},'${result}')\",\"type\":\"jjwx\"}`;\n}else{ result=\"\"}","isPay":"<js>\npoint=(\"{{$.point}}\"=='0');\nchapterMessage =!\/VIP|\u756a\u5916\/.test(\"{{$.chapterMessage}}\")\nif(chapterMessage||point){\n\tresult=true\n\t}else{\n\t\tresult=false\n\t\t}\n<\/js>","isVip":"<js>\nvip = (\"{{$.isvip}}\"!=\"0\");\ntype = (\"{{$.chaptertype}}\"=='1');\nresult = !type?(vip?true:false):false\n<\/js>","isVolume":"<js>\n\"{{$.chaptertype}}\"=='1'?true:false;\n<\/js>","preUpdateJs":"try{\nvar tocUrl = bDe(book.tocUrl);\nvar oldToken = getToken(tocUrl);\nvar novelId = getNid(tocUrl);\nvar newToken = Map(\"token\");\n\t\nif(\/^\\d+_[\\w\\d]{16,}\/.test(newToken)){\n\t tocUrl = \"https:\/\/android.jjwxc.net\/androidapi\/chapterList?novelId=\"+novelId+\"&more=0&whole=1&token=\"+newToken;\n\t \n   let src = java.ajax(tocUrl);\n   cache.put(\"tokenSrc\"+novelId, src, 60);\n\t let message = JSON.parse(src).message;\n\t if(\/\u767b\u5165\u9a8c\u8bc1\u5931\u8d25\/.test(message)){\n\t \t          setHeaders(\"token=\");  \t  \t      \n\t            java.longToast(\"\u767b\u5f55token\u5df2\u5931\u6548\uff0c\u5df2\u6e05\u9664token\u503c\uff0c\u8bf7\u91cd\u65b0\u767b\u5f55\");\n\t           java.refreshTocUrl();  \n\t    }else if(newToken != oldToken){\n\t       \/\/java.longToast(\"\u76ee\u5f55\u94fe\u63a5\u66f4\u6539\u4e3a\u65b0token\");\n\t        \tjava.refreshTocUrl();\n\t    }else{\n\t\t\t    \tcache.put(\"tokenSrc\"+novelId, src, 60)\n\t\t}  \n\t}else if(\/token=&\/.test(tocUrl)){\n\t\t\t  java.refreshTocUrl();\n\t\t\t \/\/ java.longToast(\"\u66f4\u65b0\u76ee\u5f55\u94fe\u63a5\u7684token\");\n\t\t\t}  \n\t}catch(e){\n\tjava.log(\"\u8fd9\u662f\u9519\u8bef\uff1a\"+e);\n\t}","updateTime":"{{$.chaptersize}}\u5b57\u2022{{$.chapterdate}}\u2022{{$.chapterintro##^\\s*}}##^\u2022|0000-00-00.*|^0\u5b57\u2022|\u2022$"},"searchUrl":"https:\/\/android.jjwxc.net\/androidapi\/search?versionCode=191&keyword={{key;java.put(\"key\",key)}}&type={{Map(\"search\").split(\",\")[0]||1}}&page={{page;java.put(\"page\",page)}}&searchType={{Map(\"search\").split(\",\")[1]||8}}&sortMode=DESC","variableComment":"\u6e90\u53d8\u91cf\n\n\u586b\u5199\u3010\u79fb\u51fa\/\u52a0\u5165\/\u79fb\u5165\u4e66\u67b6\u6570\u636e\u3011 \u2014\u2014 \u8fd9\u662f\u7528\u6765\u64cd\u4f5c\u664b\u6c5fapp\u7684\u6536\u85cf\u7684\uff0c\u5982\n\u79fb\u51fa\u5c1a\u672a\u5206\u7c7b::0 \u4f1a\u628a\u5f53\u524d\u4e66\u7c4d\u79fb\u51fa\u664b\u6c5f\u7684\u6536\u85cf\n\u52a0\u5165\u5c1a\u672a\u5206\u7c7b::0,1,1 \u4f1a\u52a0\u5165\u6536\u85cf\u81f3\u664b\u6c5f\u7684\u5c1a\u672a\u5206\u7c7b\u4e66\u67b6\n\u79fb\u5165\u5c1a\u672a\u5206\u7c7b::0,0,2 \u4f1a\u628a\u5df2\u52a0\u5165\u664b\u6c5f\u6536\u85cf\u7684\u4e66\u7c4d\u79fb\u5165\u664b\u6c5f\u7684\u5c1a\u672a\u5206\u7c7b\u4e66\u67b6\u3002\n\u4e66\u67b6\u6570\u636e\uff1a\u5728\u767b\u5f55\u9875\u7684\u3010\ud83d\udcda\u83b7\u53d6\u4e66\u67b6\u3011\u83b7\u53d6\uff0c\u83b7\u53d6\u540e\u5c06\u663e\u793a\u5728\u6e90\u53d8\u91cf\u8bbe\u7f6e\n\u5237\u65b0\u8be6\u60c5\u9875\u751f\u6548\u4e4b\u540e\u4f1a\u5220\u9664\u3010\u79fb\u51fa\/\u52a0\u5165\/\u79fb\u5165\u4e66\u67b6\u6570\u636e\u3011\u5b57\u6837\u3002\n\u586b\u5199\u3010\u6279\u91cf\u79fb\u51fa\/\u52a0\u5165\/\u79fb\u5165\u4e66\u67b6\u6570\u636e\u3011\u5219\u4e0d\u4f1a\u81ea\u52a8\u5220\u9664\u8fd9\u4e9b\u5b57\u6837\uff0c\u5728\u9605\u8bfb\u7684\u4e66\u67b6\u5237\u65b0\u4f1a\u6279\u91cf\u64cd\u4f5c\uff0c\u9700\u8981\u624b\u52a8\u5220\u9664\uff0c\u907f\u514d\u91cd\u590d\u8bf7\u6c42\u3002\n\n\u5176\u4ed6\u6e90\u53d8\u91cf\u64cd\u4f5c\u8bf7\u5728\u767b\u5f55\u91cc\u67e5\u770b\u3010\u4f7f\u7528\u8bf4\u660e\u3011","weight":0},{"bookSourceComment":"2026.2.1\u65e5\u66f4\u65b0\uff1a\n\u9002\u914d\u5706\u89d2\u6bb5\u8bc4\n\n\u2764\ufe0f\u200d\ud83d\udd25\u767b\u5f55\u5fc5\u770b\u2764\ufe0f\u200d\ud83d\udd25\n1.\u8f93\u5165\u90ae\u7bb1\u5bc6\u7801\u540e\u5fc5\u987b\u70b9\u2713\u4fdd\u5b58\u751f\u6548\uff0c\n\u5426\u5219\u8bfb\u53d6\u4e0d\u5230\u8f93\u5165\u7684\u8d26\u53f7\u5bc6\u7801\n2.\u8df3\u8f6c\u5361\u987f\u5728\u8bbe\u7f6e\u2192\u5176\u4ed6\u8bbe\u7f6e\u4e2d\u6e05\u9664WebView\u7f13\u5b58\n\n\ud83d\udd14\u9002\u914d\u517c\u5bb9\nIOS\u4ec5\u9002\u914d\u6e90\u9605\n\n\ud83d\udd25\u6ce8\uff1a\u9605\u8bfb\u8bf7\u4f7f\u7528\u6700\u65b0\u6d4b\u8bd5\u7248\n1.\u6240\u6709\u6e90\u7ad9\u6bcf20\u79d2\u6700\u591a12\u7ae0\uff0c\u628a\u9884\u4e0b\u8f7d\u8c03\u52300-3\u4e4b\u95f4\u4f7f\u7528\n\ud83d\udcaf[\u6253\u8d4fVIP\u65e0\u8bf7\u6c42\u9650\u5236,\u4e13\u5c5e\u4e66\u6e90]\n2.\u81ea\u5b9a\u4e49\u6e90\u7ad9\u793a\u4f8b\uff1a\u756a\u8304\u5c0f\u8bf4,\u4e03\u732b\u5c0f\u8bf4  \u591a\u4e2a\u6e90\u7ad9\u7528\u82f1\u6587,\u53f7\u5206\u9694\n\u6e90\u7ad9\u540d\u53c2\u8003 \u767b\u5f55URL \/\/\u4e66\u6e90\u914d\u7f6e\u5217\u8868 v\u53c2\u6570\n3.\u6e90\u7ad9\u5e26\u6709\u2747\ufe0f\u56fe\u6807\u8868\u793a\u53ea\u80fd\u6307\u5b9a\u6216@\u641c\u7d22\n\n4.\u641c\u7d22\u6a21\u5f0f\uff1a\n\u4e66\u540d@\u6765\u6e90 \u591a\u4e2a\u6765\u6e90\u7528\u82f1\u6587,\u53f7\u5206\u9694\n\u793a\u4f8b\uff1a \n\u7cfb\u7edf@\u756a\u8304\u5c0f\u8bf4\uff0c\u591a\u4e2a\u6e90\u7ad9\u4f7f\u7528\u82f1\u6587,\u53f7\u5206\u9694\n\u4e66\u540d@\u7c7b\u578b \u8fd4\u56de\u5bf9\u5e94\u7c7b\u578b\u6240\u6709\u6e90\u7ad9\u6570\u636e\uff0c\u53ef\u76f4\u63a5\u4f7f\u7528@\u65b9\u5f0f\u641c\u7d22\u6216\u8005\u70b9\u51fb\u767b\u9646\u5207\u6362\u6a21\u5f0f\n\u793a\u4f8b\uff1a \n\u7cfb\u7edf@\u5c0f\u8bf4  \u542c\u4e66  \u6f2b\u753b  \u77ed\u5267\u7b49\n\u9ed8\u8ba4\u4e66\u540d\u6392\u5e8f\n\u6307\u5b9a\u4f5c\u8005\u4f18\u5148\uff1a\n\u4f5c\u8005\u540d@\u4f5c\u8005   \u4f5c\u8005\u540d@\u4f5c\u8005,\u6e90\u7ad9","bookSourceGroup":"\u805a\u5408\u4e66\u6e90","bookSourceName":"\ud83d\udcda\u4e66\u5c71\u805a\u5408","bookSourceType":0,"bookSourceUrl":"https:\/\/search.shusan.icu","bookUrlPattern":"https?:\\\/\\\/(?:[a-zA-Z0-9-]+\\.)*shusan\\.icu\\\/details.*","customButton":false,"customOrder":-1,"enabled":true,"enabledCookieJar":true,"enabledExplore":true,"eventListener":false,"exploreUrl":"<js>\nlet config = (() => {\n    try {\n        let cfg = JSON.parse(source.getVariable())[0] || {};\n        if (!cfg.host || !cfg.gender) {\n            cfg = {gender: \"boy\", host: getServerHost()};\n            source.setVariable(JSON.stringify([cfg]));\n            java.toast(\"\u914d\u7f6e\u521d\u59cb\u5316\u5b8c\u6210\");\n        }\n        return cfg;\n    } catch(e) {\n        let cfg = {gender: \"boy\", host: getServerHost()};\n        source.setVariable(JSON.stringify([cfg]));\n        return cfg;\n    }\n})();\n    \nlet rawVariable = source.getVariable();\nlet \u4e2a\u4eba\u4e2d\u5fc3 = 1;\nlet obj = (title, url, type) => ({\n  title: title,\n  url: url,\n  style: { layout_flexGrow: 1, layout_flexBasisPercent: type }\n});\n\nlet sort = [];\nlet push = (title, url, type) => sort.push(obj(title, url, type));\n\nlet currentType = \"\";\nlet currentSource = \"\";\ntry {\n  let vArray = JSON.parse(rawVariable);\n  if (vArray.length > 0) {\n    let v = vArray[0];\n    currentType = v.gender || \"\";\n    currentSource = v.source || \"\";\n  }\n} catch(e) {\n  currentType = \"\";\n  currentSource = \"\";\n}\n\nconst getGenderDisplayName = (gender) => {\n  if (gender == \"boy\") return \"\u7537\u9891\";\n  if (gender == \"girl\") return \"\u5973\u9891\";\n  return \"\";\n};\n\nconst genderDisplay = getGenderDisplayName(currentType);\n\npush(`\u5f53\u524d\u4e3a\u3010${currentSource || \"\u756a\u8304\u5c0f\u8bf4\"}\u3011${genderDisplay ? `\u3010${genderDisplay}\u3011` : ''}`, \"\", 1);\n\nif (currentSource == \"\u664b\u6c5f\") {\n\t   sort.push({\n        title: \"\ud83d\udcdd\u70b9\u51fb\u7b7e\u5230\",\n        url: `${getServerHost()}\/jj_signin`,\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.29 }\n    });\n    \n    sort.push({\n        title: \"\ud83d\udcc2\u6211\u7684\u6536\u85cf\",\n        url: `${getServerHost()}\/jjbookshelf?token=`,\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.29 }\n    });\n}\n\nconst excludedSources = [\"\u5c0f\u8bf4\", \"\u542c\u4e66\", \"\u6f2b\u753b\", \"\u89c6\u9891\", \"\u77ed\u5267\", \"\u97f3\u9891\",\"\u756a\u8304\u5c0f\u8bf4\"];\n\nif (currentSource && !excludedSources.includes(currentSource)) {\n  try {\n    let apiUrl = `${getServerHost()}\/type_api?source=${currentSource}`;\n    if (currentType) {\n      apiUrl += `&gender=${currentType}`;\n    }\n    \n    let response = JSON.parse(java.ajax(apiUrl));\n    \n    if (response.data && response.data.found) {\n      response.data.found.forEach(item => {\n        let finalUrl = \"\";\n        if (item.url) {\n          finalUrl = `${getServerHost()}\/type_api?source=${currentSource}&page={{page}}&url=${item.url}`;\n          if (currentType) {\n            finalUrl += `&gender=${currentType}`;\n          }\n        }\n        sort.push({\n          title: item.title,\n          url: finalUrl,\n          style: item.style || { layout_flexGrow: 1, layout_flexBasisPercent: 0.29 }\n        });\n      });\n    } else {\n      push(`\u3010${currentSource}\u3011${genderDisplay ? `\u3010${genderDisplay}\u3011` : ''}\u6682\u65e0\u6570\u636e`, \"\", 1);\n    }\n  } catch(e) {\n    push(`\u3010${currentSource}\u3011${genderDisplay ? `\u3010${genderDisplay}\u3011` : ''}\u6682\u65e0\u6570\u636e`, \"\", 1);\n  }\n  JSON.stringify(sort);\n} else {\n  let recommendUrl = getServerHost() + \"\/read_recommend?session=\" + getSessionId();\n  push('\u4e2a\u6027\u63a8\u8350', recommendUrl, 0.29);\n  push('\u5dc5\u5cf0\u699c\u5355', 'https:\/\/fanqienovel.com\/api\/author\/misc\/top_book_list\/v1\/?limit=100&offset={{(page-1)*100}}', 0.29);\n  push('\u51fa\u7248\u699c\u5355', 'https:\/\/fanqienovel.com\/api\/node\/publication\/list?page_index={{(page-1)*100}}&page_count=100', 0.29);\n  push('\u7206\u66f4\u699c\u5355', 'https:\/\/api-lf.fanqiesdk.com\/api\/novel\/channel\/homepage\/rank\/rank_list\/v2\/?aid=13&limit=50&offset={{(page-1)*100}}&side_type=15&type=1', 0.29);\n  push('\u9ed1\u9a6c\u699c\u5355', 'https:\/\/api-lf.fanqiesdk.com\/api\/novel\/channel\/homepage\/rank\/rank_list\/v2\/?aid=13&limit=50&offset={{(page-1)*100}}&side_type=13&type=1', 0.29);\n  push('\u70ed\u641c\u699c\u5355', 'https:\/\/api-lf.fanqiesdk.com\/api\/novel\/channel\/homepage\/rank\/rank_list\/v2\/?aid=13&limit=50&offset={{(page-1)*100}}&side_type=12&type=1', 0.29);\n\n  let showCategories = currentType == \"girl\" ? [0] : [1];\n  \n  showCategories.forEach(genderCode => {\n    let isMale = genderCode == 1;\n    let genderLabel = isMale ? \"\u7537\u9891\" : \"\u5973\u9891\";\n    \n    let categories = isMale ? [\n      {id: 1141, name: \"\u897f\u65b9\u5947\u5e7b\"},\n      {id: 1140, name: \"\u4e1c\u65b9\u4ed9\u4fa0\"},\n      {id: 8, name: \"\u79d1\u5e7b\u672b\u4e16\"},\n      {id: 261, name: \"\u90fd\u5e02\u65e5\u5e38\"},\n      {id: 124, name: \"\u90fd\u5e02\u4fee\u771f\"},\n      {id: 1014, name: \"\u90fd\u5e02\u9ad8\u6b66\"},\n      {id: 273, name: \"\u5386\u53f2\u53e4\u4ee3\"},\n      {id: 27, name: \"\u6218\u795e\u8d58\u5a7f\"},\n      {id: 263, name: \"\u90fd\u5e02\u79cd\u7530\"},\n      {id: 258, name: \"\u4f20\u7edf\u7384\u5e7b\"},\n      {id: 272, name: \"\u5386\u53f2\u8111\u6d1e\"},\n      {id: 539, name: \"\u60ac\u7591\u8111\u6d1e\"},\n      {id: 262, name: \"\u90fd\u5e02\u8111\u6d1e\"},\n      {id: 257, name: \"\u7384\u5e7b\u8111\u6d1e\"},\n      {id: 751, name: \"\u60ac\u7591\u7075\u5f02\"},\n      {id: 504, name: \"\u6297\u6218\u8c0d\u6218\"},\n      {id: 746, name: \"\u6e38\u620f\u4f53\u80b2\"},\n      {id: 718, name: \"\u52a8\u6f2b\u884d\u751f\"},\n      {id: 1016, name: \"\u7537\u9891\u884d\u751f\"}\n    ] : [\n      {id: 1139, name: \"\u53e4\u98ce\u4e16\u60c5\"},\n      {id: 8, name: \"\u79d1\u5e7b\u672b\u4e16\"},\n      {id: 746, name: \"\u6e38\u620f\u4f53\u80b2\"},\n      {id: 1015, name: \"\u5973\u9891\u884d\u751f\"},\n      {id: 248, name: \"\u7384\u5e7b\u8a00\u60c5\"},\n      {id: 23, name: \"\u79cd\u7530\"},\n      {id: 79, name: \"\u5e74\u4ee3\"},\n      {id: 267, name: \"\u73b0\u8a00\u8111\u6d1e\"},\n      {id: 246, name: \"\u5bab\u6597\u5b85\u6597\"},\n      {id: 539, name: \"\u60ac\u7591\u8111\u6d1e\"},\n      {id: 253, name: \"\u53e4\u8a00\u8111\u6d1e\"},\n      {id: 24, name: \"\u5feb\u7a7f\"},\n      {id: 749, name: \"\u9752\u6625\u751c\u5ba0\"},\n      {id: 745, name: \"\u661f\u5149\u7480\u74a8\"},\n      {id: 747, name: \"\u5973\u9891\u60ac\u7591\"},\n      {id: 750, name: \"\u804c\u573a\u5a5a\u604b\"},\n      {id: 748, name: \"\u8c6a\u95e8\u603b\u88c1\"},\n      {id: 1017, name: \"\u6c11\u56fd\u8a00\u60c5\"}\n    ];\n    \n    push(`\u2764\ufe0f${genderLabel}\u9605\u8bfb\u699c\u2764\ufe0f`, \"\", 1);\n    \n    categories.forEach(cat => {\n      sort.push({\n        title: cat.name,\n        url: `${getServerHost()}\/style_top?rank_list_type=3&offset={{(page-1)*10}}&limit=10&category_id=${cat.id}&gender=${genderCode}&rankMold=2`,\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.29 }\n      });\n    });\n    \n    push(`\u2764\ufe0f${genderLabel}\u65b0\u4e66\u699c\u2764\ufe0f`, \"\", 1);\n    \n    categories.forEach(cat => {\n      sort.push({\n        title: cat.name,\n        url: `${getServerHost()}\/style_top?rank_list_type=3&offset={{(page-1)*10}}&limit=10&category_id=${cat.id}&gender=${genderCode}&rankMold=2`,\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.29 }\n      });\n    });\n  });\n\n  let fqCategoryArr = [];\n  showCategories = currentType == \"girl\" ? [0] : [1];\n\n  showCategories.forEach(i => {\n    try {\n      let response = JSON.parse(java.ajax(`${getServerHost()}\/type_style?new_category_tab=${i}`));\n      let $ = response.data.category_tab_data;\n      \n      let tabName = $.tab_name || (i == 0 ? \"\u5973\u9891\" : \"\u7537\u9891\");\n      fqCategoryArr.push(obj(`\u2764\ufe0f${tabName}\u5206\u7c7b\u2764\ufe0f`, null, 1));\n      \n      $.cell_data.forEach(c => {\n        fqCategoryArr.push(obj(c.cell_name, null, 1));\n        \n        if (c.atom_data && Array.isArray(c.atom_data)) {\n          c.atom_data.slice(1).forEach(a => {\n            let d = a.category_data;\n            if (d && d.name) {\n              let cid = d.category_id;\n\n              let gender, genre_type;\n              if (i == 0) {\n                gender = 0;\n                genre_type = 0;\n              } else if (i == 1) {\n                gender = 1;\n                genre_type = 0;\n              } else {\n                gender = 1;\n                genre_type = 0;\n              }\n              \n              fqCategoryArr.push({\n                title: d.name,\n                url: `${getServerHost()}\/type_style?category_id=${cid}&genre_type=${genre_type}&gender=${gender}&offset={{(page-1)*100}}&selected_items=`,\n                style: {\n                  layout_flexGrow: 1,\n                  layout_flexBasisPercent: 0.29\n                }\n              });\n            }\n          });\n        }\n      });\n    } catch (e) {\n      fqCategoryArr.push(obj(\"\u5206\u7c7b\u52a0\u8f7d\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5\", null, 1));\n    }\n  });\n\n  fqCategoryArr.forEach(item => {\n    if (item.style && item.style.layout_flexBasisPercent) {\n      push(item.title, item.url, item.style.layout_flexBasisPercent);\n    } else {\n      sort.push({\n        title: item.title,\n        url: item.url,\n        style: {\n          layout_flexGrow: 1,\n          layout_flexBasisPercent: 0.29\n        }\n      });\n    }\n  });\n\n  let hasValidSession = false;\n  let username = \"\";\n\n  try {\n    let uinfo = java.ajax(getServerHost() + \"\/book_user?session=\" + getSessionId());\n    uinfo = JSON.parse(uinfo);\n    \n    if (uinfo.data.name) {\n      username = uinfo.data.name;\n      hasValidSession = true;\n    }\n  } catch (e) {\n  }\n\n  if (!hasValidSession) {\n    java.toast(\"\u756a\u8304\u767b\u5f55\u5df2\u8fc7\u671f\uff0c\u8bf7\u91cd\u65b0\u767b\u5f55\");\n  }\n\n  let gro = [];\n  let pushGro = (title, url, type) => gro.push(obj(title, url, type));\n\n  let sArr = [];\n\n  if (hasValidSession) {\n    try {\n      let book_shelf_info = JSON.parse(java.ajax(getServerHost() + \"\/book_shelf?session=\" + getSessionId()));\n\n      if (book_shelf_info.code == 0) {\n        \u4e2a\u4eba\u4e2d\u5fc3 = 1;\n        \n        let groups_bookids = { \"\u672a\u5206\u7ec4\": [] };\n        book_shelf_info.data.book_shelf_info.forEach(i => {\n          if (!groups_bookids[i.group_name ? i.group_name : \"\u672a\u5206\u7ec4\"]) \n            groups_bookids[i.group_name] = [];\n          groups_bookids[i.group_name ? i.group_name : \"\u672a\u5206\u7ec4\"].push(i.book_id);\n        });\n\n        Object.keys(groups_bookids).forEach(k => {\n          pushGro(k, \"https:\/\/fanqienovel.com\/fqbookshelf\/groupName\/\" + k, 0.4);\n        });\n        if (Object.keys(groups_bookids).length % 2 != 0) pushGro(\"\u5360\u4f4d\", \"\", 0.4);\n        \n        sArr.push(obj(username + '\u7684\u4e2a\u4eba\u4e2d\u5fc3', '', 1));\n        sArr.push(obj(\"\u6211\u7684\u4e66\u67b6\", \"https:\/\/fanqienovel.com\/fqbookshelf\", 1));\n        sArr = sArr.concat(gro);\n        sArr.push(obj(\"\u9605\u8bfb\u5386\u53f2\", getServerHost() + \"\/read_history?session=\" + getSessionId() + \"&page={{page}}\", 1));\n      } else {\n        \u4e2a\u4eba\u4e2d\u5fc3 = 0;\n        java.toast(\"\u83b7\u53d6\u4e66\u67b6\u4fe1\u606f\u5931\u8d25\uff0c\u767b\u5f55\u53ef\u80fd\u5df2\u8fc7\u671f\");\n      }\n    } catch (e) {\n      \u4e2a\u4eba\u4e2d\u5fc3 = 0;\n      java.toast(\"\u756a\u8304\u767b\u5f55\u8fc7\u671f\uff0c\u5df2\u9690\u85cf\u4e2a\u4eba\u4e2d\u5fc3\");\n    }\n  } else {\n    \u4e2a\u4eba\u4e2d\u5fc3 = 0;\n    java.toast(\"\u60a8\u8fd8\u672a\u767b\u5f55\u756a\u8304\u8d26\u53f7\uff0c\u65e0\u6cd5\u540c\u6b65\u6570\u636e\");\n  }\n\n  sort = sArr.concat(sort);\n  JSON.stringify(sort);\n}\n<\/js>","header":"@js:\nJSON.stringify({\n\t\"User-Agent\":java.getWebViewUA(),\n\t\"X-Novel-Token\": \"SHUSAN_READ_2025\"\n\t})","jsLib":"function deviceType() {\n    let {\n        java\n    } = this;\n    try {\n        java.deviceID();\n        return false;\n    } catch (e) {\n        try {\n            java.androidId();\n            return true;\n        } catch (e) {\n            return false;\n        }\n    }\n}\n\nfunction checkEnv() {\n    let {\n        java,\n        source\n    } = this;\n    let isModified = false;\n    try {\n        new Packages.io.legato.kazusa.utils.TimeoutCancellationException('');\n        isModified = true;\n    } catch (e) {\n        isModified = typeof source.loginUi == 'function' ? false : true;\n    }\n\n    try {\n        java.put(\"is_modified_version\", isModified ? \"true\" : \"false\");\n    } catch (e) {}\n\n    return isModified;\n}\n\nfunction isQRead() {\n    let {\n        java\n    } = this;\n    try {\n        return java.qread && java.qread() == \"1\";\n    } catch (e) {\n        return false;\n    }\n}\n\nfunction getServerHost() {\n    let {\n        source\n    } = this;\n    try {\n        const config = JSON.parse(source.getVariable());\n        return config?.[0]?.host || source.bookSourceUrl;\n    } catch (e) {\n        return source.bookSourceUrl;\n    }\n}\n\nfunction getSessionId() {\n    const {\n        cookie,\n        source\n    } = this;\n    try {\n        let cookieHeader = String(cookie.getCookie('fanqienovel.com'));\n        let sessionId = cookieHeader.match(\/sessionid=([^;]+)\/)?.[1] || null;\n        if (sessionId) {\n            return sessionId;\n        }\n    } catch (e) {}\n    try {\n        let loginInfo = source.getLoginInfoMap() || {};\n        return loginInfo['\u756a\u8304\u767b\u5f55Token'] || \"\";\n    } catch (e) {\n        return \"\";\n    }\n}\n\nfunction splitArray(input, size) {\n    let output = []\n    for (let i = 0; i < input.length; i += size) {\n        output.push(input.slice(i, i + size))\n    }\n    return output\n}\n\nfunction getCommentIconColor() {\n    let {\n        source\n    } = this;\n    let color = \"#666666\";\n    let loginInfo = source.getLoginInfoMap() || \"\";\n    if (loginInfo['\u6bb5\u8bc4\u56fe\u6807\u989c\u8272'] && loginInfo['\u6bb5\u8bc4\u56fe\u6807\u989c\u8272'].startsWith('#')) {\n        color = loginInfo['\u6bb5\u8bc4\u56fe\u6807\u989c\u8272'];\n    }\n    return color;\n}\n\nfunction wrapContentForIOS(content) {\n    const pureContent = content.trim();\n    if (deviceType.call(this)) {\n        return pureContent;\n    }\n    let lines = pureContent.split('\\n').map(line => {\n        if (line.trim()) {\n            const trimLine = line.trim().replace(\/\\s+\/g, ' ');\n            return `<span rs-native>${trimLine}<\/span>`;\n        }\n        return line;\n    });\n    return lines.join('\\n');\n}\n\nfunction buildCommentUrl(sourceType, bid, cid, para) {\n    let host = getServerHost.call(this);\n    let isModifiedVersion = checkEnv.call(this);\n    let aidParam = (!deviceType.call(this) || isQRead.call(this) || isModifiedVersion) ? \"&aid=web\" : \"\";\n\n    switch (sourceType) {\n        case 'jj':\n            return host + '\/jj_comment?bid=' + bid + '&cid=' + cid + '&para=' + para + aidParam;\n        case 'qm':\n            return host + '\/qm_comment?item_id=' + cid + '&book_id=' + bid + '&paragraph_id=' + para + aidParam;\n        case 'fq':\n        default:\n            return host + '\/idea_comment?item_id=' + cid + '&book_id=' + bid + '&para=' + para + '&sessionid=' + getSessionId.call(this) + aidParam;\n    }\n}\n\nfunction getCommentSourceName(sourceType) {\n    switch (sourceType) {\n        case 'jj':\n            return '\u664b\u6c5f';\n        case 'qm':\n            return '\u4e03\u732b';\n        case 'fq':\n        default:\n            return '\u756a\u8304';\n    }\n}\n\nfunction startCommentBrowser(url, title) {\n    let {\n        java\n    } = this;\n    if (isQRead.call(this)) {\n        java.startBrowserDp(url, title);\n    } else {\n        let isModifiedVersion = checkEnv.call(this);\n        if (isModifiedVersion) {\n            try {\n                let htmlContent = java.ajax(url);\n                java.showBrowser(\n                    url,\n                    htmlContent,\n                    `window.java=java;`,\n                    JSON.stringify({\n                        \"expandedCornersRadius\": 20,\n                        \"dismissOnTouchOutside\": true,\n                        \"isDraggable\": true,\n                        \"shouldDimBackground\": true,\n                        \"backgroundDimAmount\": 0.5,\n                        \"hardwareAccelerated\": true,\n                        \"isNestedScrollingEnabled\": true,\n                        \"isGestureInsetBottomIgnored\": true,\n                        \"setFitToContents\": false,\n                        \"heightPercentage\": 0.75,\n                        \"isHideable\": true\n                    })\n                );\n            } catch (e) {\n                java.showBrowser(\n                    url,\n                    null,\n                    `window.java=java;`,\n                    JSON.stringify({\n                        \"expandedCornersRadius\": 20,\n                        \"dismissOnTouchOutside\": true,\n                        \"hardwareAccelerated\": true,\n                        \"isNestedScrollingEnabled\": true,\n                        \"isGestureInsetBottomIgnored\": true,\n                        \"heightPercentage\": 0.75,\n                        \"isHideable\": true\n                    })\n                );\n            }\n        } else {\n            java.startBrowser(url, title);\n        }\n    }\n}\n\nfunction createCommentHtmlTag(displayText, url, sourceName) {\n    const encodedUrl = url.replace(\/&\/g, '&amp;');\n    return '<comment count=\"' + displayText + '\" onPress=\"java.' +\n        (isQRead.call(this) ? 'startBrowserDp' : 'startBrowser') +\n        '(\\'' + encodedUrl + '\\',\\'' + sourceName + '\u6bb5\u8bc4\\')\" \/>';\n}\n\nfunction createSvg(number, color, bid, cid, para, sourceType = 'fq') {\n    let {\n        java\n    } = this;\n    var displayText = number > 99 ? \"99+\" : number;\n    var date = String(Date.now()).match(\/(\\d{6}$)\/)[1];\n\n    let isIOS = !deviceType.call(this);\n    if (isIOS) {\n        let commentUrl = buildCommentUrl.call(this, sourceType, bid, cid, para);\n        let sourceName = getCommentSourceName(sourceType);\n        return createCommentHtmlTag.call(this, displayText, commentUrl, sourceName);\n    }\n\n    let isQingRead = isQRead.call(this);\n    let isModifiedVersion = checkEnv.call(this);\n\n    var svg;\n    if (isQingRead || isModifiedVersion) {\n        svg = '<svg width=\"160\" height=\"120\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M 55 10 L 120 10 Q 150 10 150 40 L 150 80 Q 150 110 120 110 L 55 110 Q 25 110 25 80 L 25 75 L 3 60 L 25 45 L 25 40 Q 25 10 55 10 Z\" fill=\"none\" stroke=\"' + color + '\" stroke-width=\"5\" stroke-linejoin=\"round\"\/><text x=\"87\" y=\"77\" font-family=\"Arial, sans-serif\" text-anchor=\"middle\" dominant-baseline=\"middle\" font-size=\"50\" font-weight=\"bold\" fill=\"' + color + '\">' + displayText + '<\/text><\/svg>';\n    } else {\n        svg = '<svg width=\"1000\" height=\"909\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">' +\n            '<path d=\"M80,80 h840 a60,60 0 0 1 60,60 v580 a60,60 0 0 1 -60,60 h-620 l-140,90 v-90 h-80 a60,60 0 0 1 -60,-60 v-580 a60,60 0 0 1 60,-60 z\" ' +\n            'fill=\"none\" stroke=\"' + color + '\" stroke-width=\"16\" stroke-linejoin=\"round\"\/>' +\n            '<text x=\"500\" y=\"450\" font-family=\"Arial, sans-serif\" text-anchor=\"middle\" ' +\n            'font-size=\"360\" fill=\"' + color + '\" dy=\"0.3em\">' + displayText + '<\/text>' +\n            '<\/svg>';\n    }\n\n    var encodedSvg = java.base64Encode(svg);\n\n    let jsFunction;\n    switch (sourceType) {\n        case 'jj':\n            jsFunction = 'showJJCmt';\n            break;\n        case 'qm':\n            jsFunction = 'showQmCmt';\n            break;\n        case 'fq':\n        default:\n            jsFunction = 'showCmt';\n            break;\n    }\n\n    if (isModifiedVersion) {\n        return 'data:image\/svg+xml;base64,' + encodedSvg + ',{\\'click\\':\\'' + jsFunction + '(\"' + bid + '\",\"' + cid + '\",\"' + para + '\",\"' + date + '\")\\',\\'style\\':\\'TEXT\\'}';\n    } else {\n        return 'data:image\/svg+xml;base64,' + encodedSvg + ',{\\'js\\':\\'' + jsFunction + '(\"' + bid + '\",\"' + cid + '\",\"' + para + '\",\"' + date + '\")\\',\\'style\\':\\'TEXT\\'}';\n    }\n}\n\nfunction checkClickRateLimit(lastCallKey) {\n    let {\n        cache\n    } = this;\n    let lastCallTime = cache.getFromMemory(lastCallKey) || 0;\n    let currentTime = Date.now();\n    if (currentTime - lastCallTime < 1000) {\n        return false;\n    }\n    cache.putMemory(lastCallKey, currentTime);\n    return true;\n}\n\nfunction handleCommentClick(sourceType, bid, cid, para, date, cacheKey) {\n    let {\n        cache\n    } = this;\n    let isModifiedVersion = checkEnv.call(this);\n    let isQingRead = isQRead.call(this);\n\n    if (!isModifiedVersion && !isQingRead) {\n        let mname = cacheKey;\n        let load = (cache.getFromMemory(mname) ?? \"-\").split(\"-\");\n        if (load[0] != \"1\" || load[1] != date) {\n            cache.putMemory(mname, \"1-\" + date);\n            return;\n        }\n        let lastCallKey = `last_call_${sourceType}_${bid}_${cid}_${para}`;\n        if (!checkClickRateLimit.call(this, lastCallKey)) {\n            return;\n        }\n    }\n\n    let commentUrl = buildCommentUrl.call(this, sourceType, bid, cid, para);\n    let title = isModifiedVersion ? getCommentSourceName(sourceType) + \"\u6bb5\u8bc4\" : (cache.getFromMemory(cacheKey + \"-text\") ?? getCommentSourceName(sourceType) + \"\u6bb5\u8bc4\");\n    startCommentBrowser.call(this, commentUrl, title);\n}\n\nfunction getComments(content, bid, cid, sourceType = 'fq', contentMd5 = null) {\n    let {\n        java,\n        cache,\n        source\n    } = this;\n    let host = getServerHost.call(this);\n    try {\n        let lines = String(content)\n            .replace(new RegExp('(<img[^>]*?>)\\n', 'g'), \"$1\")\n            .split(\"\\n\")\n            .filter(line => line.trim());\n\n        let isModifiedVersion = checkEnv.call(this);\n        let isQingRead = isQRead.call(this);\n\n        if (sourceType == 'jj') {\n            let apiUrl = `${host}\/proxy_jjidea?bid=${bid}&cid=${cid}&token=${JJtoken.call(this)}`;\n            let response = java.ajax(apiUrl);\n            let data = JSON.parse(response).data;\n\n            data.forEach((item) => {\n                let para = item.paragraph_id;\n                let count = item.comment_total;\n\n                let paraNum = parseInt(para);\n                if (paraNum <= 0 || paraNum > lines.length) {\n                    return;\n                }\n\n                let adjustedPara = paraNum - 1;\n\n                if (!isModifiedVersion && !isQingRead) {\n                    cache.putMemory(`jj-${bid}-${cid}-${para}-text`, lines[adjustedPara]);\n                }\n\n                let color = getCommentIconColor.call(this);\n                let commentTag = createSvg.call(this, count, color, bid, cid, para, sourceType);\n                if (deviceType.call(this)) {\n                    lines[adjustedPara] += `<img src=\"${commentTag}\">`;\n                } else {\n                    lines[adjustedPara] += commentTag;\n                }\n            });\n        } else if (sourceType == 'qm') {\n            if (!contentMd5) return wrapContentForIOS.call(this, content);\n\n            let apiUrl = `${host}\/proxy_qmidea?action=paragraph_bubbles&book_id=${bid}&item_id=${cid}&content_md5=${contentMd5}`;\n            let response = java.ajax(apiUrl);\n            let data = JSON.parse(response).data;\n\n            if (data.chapters && data.chapters.length > 0) {\n                let chapterData = data.chapters[0];\n                if (chapterData.bubbles) {\n                    chapterData.bubbles.forEach((bubble, bubbleIndex) => {\n                        let paraMd5 = bubble.p;\n                        let count = parseInt(bubble.c) || 0;\n\n                        if (count > 0 && bubbleIndex < lines.length) {\n                            let paraIndex = bubbleIndex;\n\n                            if (!isModifiedVersion && !isQingRead) {\n                                cache.putMemory(`qm-${bid}-${cid}-${paraMd5}-text`, lines[paraIndex]);\n                            }\n\n                            let color = getCommentIconColor.call(this);\n                            let commentTag = createSvg.call(this, count, color, bid, cid, paraMd5, sourceType);\n                            if (deviceType.call(this)) {\n                                lines[paraIndex] += `<img src=\"${commentTag}\">`;\n                            } else {\n                                lines[paraIndex] += commentTag;\n                            }\n                        }\n                    });\n                }\n            }\n        } else {\n            let apiUrl = `${host}\/proxy_idea?item_id=${cid}`;\n            let comments = java.ajax(apiUrl);\n            let raw = JSON.parse(comments).data.data;\n\n            Object.keys(raw).forEach((x) => {\n                let lineIndex = parseInt(x);\n\n                if (lineIndex >= lines.length || lineIndex < 0) {\n                    return;\n                }\n\n                let lineContent = lines[lineIndex];\n\n                let textOnly = String(lineContent)\n                    .replace(new RegExp('<[^>]*>', 'g'), '')\n                    .replace(\/&nbsp;\/g, ' ')\n                    .trim();\n\n                if (!textOnly) {\n                    return;\n                }\n\n                if (!isModifiedVersion && !isQingRead) {\n                    cache.putMemory(`fq-${bid}-${cid}-${x}-text`, textOnly || lineContent);\n                }\n\n                let color = getCommentIconColor.call(this);\n                let commentTag = createSvg.call(this, raw[x].count, color, bid, cid, x, sourceType);\n                if (deviceType.call(this)) {\n                    lines[lineIndex] += `<img src=\"${commentTag}\">`;\n                } else {\n                    lines[lineIndex] += commentTag;\n                }\n            });\n        }\n\n        let result = lines.join(\"\\n\");\n        return wrapContentForIOS.call(this, result);\n    } catch (e) {\n        return wrapContentForIOS.call(this, content);\n    }\n}\n\nfunction showJJCmt(bid, cid, para, date) {\n    handleCommentClick.call(this, 'jj', bid, cid, para, date, `jj-${bid}-${cid}-${para}`);\n}\n\nfunction showCmt(bid, cid, para, date) {\n    handleCommentClick.call(this, 'fq', bid, cid, para, date, `fq-${bid}-${cid}-${para}`);\n}\n\nfunction showQmCmt(bid, cid, para, date) {\n    handleCommentClick.call(this, 'qm', bid, cid, para, date, `qm-${bid}-${cid}-${para}`);\n}\n\nfunction getSecretKey() {\n    const {\n        java,\n        source\n    } = this;\n    try {\n        let apiKey = \"\";\n        const headerValue = source.getLoginHeader();\n        if (headerValue && String(headerValue).length >= 10) {\n            apiKey = String(headerValue);\n        }\n        if (!apiKey || apiKey.length < 10) {\n            const storedKey = java.get(\"user_api_key\");\n            if (storedKey && String(storedKey).length >= 10) {\n                apiKey = String(storedKey);\n            }\n        }\n        if (!apiKey || apiKey.length < 10) {\n            java.toast(\"\u274c \u672a\u767b\u5f55\uff0c\u8bf7\u5148\u767b\u5f55\");\n            return \"\";\n        }\n        return java.base64Encode(apiKey);\n    } catch (e) {\n        java.toast(\"\u274c \u83b7\u53d6\u5bc6\u94a5\u5931\u8d25\");\n        return \"\";\n    }\n}\n\nfunction getSortKey() {\n    let {\n        java\n    } = this;\n    const sortKey = java.get(\"sortkey\") || '';\n    if (!sortKey) {\n        java.toast(\"\u8bf7\u5148\u8bbe\u7f6e\u6392\u5e8f\u53c2\u6570\");\n    }\n    return sortKey;\n}\n\nfunction getBookIdFromUrl(baseUrl) {\n    let {\n        java,\n        source\n    } = this;\n    let finalUrl;\n    let urlMatch = baseUrl.match(\/url=([^&]*)\/);\n    if (urlMatch && urlMatch[1]) {\n        finalUrl = java.base64Decode(urlMatch[1]);\n    } else {\n        let fqurl = JSON.parse(java.base64Decode(baseUrl.split(\",\")[1]));\n        finalUrl = java.base64Decode(fqurl.url);\n    }\n    let bookIdMatch = finalUrl.match(\/book_id=(\\d{19})\/);\n    return bookIdMatch ? bookIdMatch[1] : null;\n}\n\nfunction getBookData(bookId) {\n    let {\n        java,\n        source\n    } = this;\n    let newUrl = \"https:\/\/api5-normal-sinfonlineb.fqnovel.com\/reading\/bookapi\/multi-detail\/v\/?aid=1967&iid=1&version_code=999&book_id=\" + bookId;\n    let response = java.ajax(newUrl);\n    let responseData = JSON.parse(response);\n    if (Array.isArray(responseData.data)) {\n        return responseData.data[0];\n    } else {\n        return responseData.data;\n    }\n}\n\nfunction parseAuthors(authorsData) {\n    let {\n        java,\n        source\n    } = this;\n    let authors = [];\n    try {\n        authors = authorsData ? JSON.parse(authorsData) : [];\n    } catch (e) {\n        authors = authorsData ? authorsData.replace(\/[\\[\\]\"]\/g, '').split(',') : [];\n    }\n    return authors.length > 0 ? (authors[0].AuthorName || authors[0] || \"\") : \"\";\n}\n\nfunction getToneInfo(bookId) {\n    if (!bookId) return \"\";\n    try {\n        let tones = \"\\n===================\\n\ud83c\udfa7AI\u97f3\u8272\u7f16\u53f7\u4fe1\u606f: \";\n        let info = JSON.parse(java.ajax(`https:\/\/reading.snssdk.com\/reading\/bookapi\/audio\/toneinfo\/?book_id=${bookId}&aid=1967`));\n        for (let i of (info.data.tts_tones ? info.data.tts_tones : [])) {\n            tones += `\\n${i.id} - ${i.title}${i.description ? \"(\" + i.description + \")\" : \"\"}`;\n        }\n        return tones;\n    } catch (e) {\n        return \"\";\n    }\n}\n\nfunction syncReadingHistory(bookId) {\n    let {\n        java,\n        source\n    } = this;\n    if (bookId) {\n        var sessionid = getSessionId.call(this);\n        if (sessionid && sessionid.trim() !== \"\") {\n            var syncUrl = getServerHost.call(this) + \"\/update_history?book_id=\" + bookId + \"&sessionid=\" + sessionid;\n            java.ajax(syncUrl);\n        }\n    }\n}\n\nfunction getJjwxcNovelIdFromUrl(baseUrl) {\n    let {\n        java,\n        source\n    } = this;\n    let finalUrl;\n    try {\n        let urlMatch = baseUrl.match(\/url=([^&]*)\/);\n        if (urlMatch && urlMatch[1]) {\n            finalUrl = java.base64Decode(urlMatch[1]);\n        } else {\n            let fqurl = JSON.parse(java.base64Decode(baseUrl.split(\",\")[1]));\n            finalUrl = java.base64Decode(fqurl.url);\n        }\n        let novelIdMatch = finalUrl.match(\/novelId=(\\d+)\/);\n        if (novelIdMatch) {\n            return novelIdMatch[1];\n        }\n    } catch (e) {}\n    return null;\n}\n\nfunction buildChapterUrl(x, catalog, device) {\n    let {\n        java\n    } = this;\n    const isFanqieApp = ['\u756a\u8304\u5c0f\u8bf4', '\u756a\u8304\u77ed\u5267', '\u756a\u8304\u542c\u4e66', '\u756a\u8304\u7545\u542c'].includes(catalog.source);\n    const urlToMatch = x.url || catalog.url;\n    const bookId = urlToMatch.match(\/book_id=(\\d{19})\\b\/)?.[1] || null;\n    const itemId = urlToMatch.match(\/item_id=(\\d+)\/)?.[1] || null;\n    let contentUrlParams = `chapter?cid=${x.cid}&source=${catalog.source}&device=${device}`;\n    if (!isFanqieApp) {\n        contentUrlParams += `&url=${catalog.url}`;\n    } else {\n        contentUrlParams += `&book_id=${bookId}&item_id=${itemId}`;\n        if (['\u756a\u8304\u542c\u4e66', '\u756a\u8304\u7545\u542c'].includes(catalog.source)) {\n            const toneId = Number((this.source.getLoginInfoMap())['\u542c\u4e66AI\u97f3\u8272\u7f16\u53f7']) || 1;\n            contentUrlParams += `&tone_id=${toneId}`;\n        }\n    }\n    if (catalog.source == '\u4e03\u732b') {\n        const qmBookId = x.url.match(\/book_id=(\\d+)\/)?.[1] || null;\n        const qmChapterId = x.url.match(\/item_id=(\\d+)\/)?.[1] || null;\n        contentUrlParams += `&${x.url}`;\n        if (qmBookId && qmChapterId) {\n            const qmCommentUrl = `${getServerHost.call(this)}\/qm_comment?book_id=${qmBookId}&item_id=${qmChapterId}`;\n            return `data:contentUrl;base64,${java.base64Encode(contentUrlParams)},{\"type\":\"qingci\",\"js\":\"book ? result : '${qmCommentUrl}'\"}`;\n        } else {\n            return `data:contentUrl;base64,${java.base64Encode(contentUrlParams)},{\"type\":\"qingci\"}`;\n        }\n    } else {\n        let commentPart = '{\"type\":\"qingci\"}';\n        if (catalog.source == '\u664b\u6c5f') {\n            const novelIdMatch = x.url.match(\/novelId=(\\d+)\/);\n            const chapterIdMatch = x.url.match(\/chapterId=(\\d+)\/);\n            if (novelIdMatch && chapterIdMatch) {\n                const novelId = novelIdMatch[1];\n                const chapterId = chapterIdMatch[1];\n                const jjCommentUrl = `${getServerHost.call(this)}\/jj_comment?novelId=${novelId}&chapterId=${chapterId}`;\n                commentPart = `{\"type\":\"qingci\",\"js\":\"book ? result : '${jjCommentUrl}'\"}`;\n            }\n        } else if (catalog.source == '\u756a\u8304\u5c0f\u8bf4') {\n            const fanqieCommentUrl = `${getServerHost.call(this)}\/comment?sessionid=${getSessionId.call(this)}&item_id=${itemId}&book_id=${bookId}`;\n            commentPart = `{\"type\":\"qingci\",\"js\":\"book ? result : '${fanqieCommentUrl}'\"}`;\n        } else if (catalog.source == '\u4e91\u7aef') {\n            const decodedUrl = java.base64Decode(catalog.url);\n            const commentUrl = decodedUrl.replace('share', 'comment');\n            commentPart = `{\"type\":\"qingci\",\"js\":\"book ? result : '${commentUrl}&pt=3g'\"}`;\n        }\n        return `data:contentUrl;base64,${java.base64Encode(contentUrlParams)},${commentPart}`;\n    }\n}\n\nfunction showTabTips(catalog) {\n    var tabTips = {\n        audio: '\u542c\u4e66',\n        video: '\u89c6\u9891',\n        comic: '\u6f2b\u753b'\n    };\n    if (tabTips[catalog.tab]) {\n        this.java.toast('\u5f53\u524d\u4e3a' + tabTips[catalog.tab] + '\u6a21\u5f0f');\n    }\n}\n\nfunction decode(data) {\n    const {\n        java\n    } = this;\n    const encryptedBytes = java.base64DecodeToByteArray(data);\n    const crypto = java.createSymmetricCrypto(\"DES\/CBC\/PKCS5Padding\", \"K7bM2nXy\", \"tQ5v9rS1\");\n    return crypto.decryptStr(encryptedBytes);\n}","lastUpdateTime":"1769923046842","loginUi":"[\n{\n         \t\"name\": \"\u90ae\u7bb1\",\n         \"type\": \"text\",\n         \"action\": \"\"\n  },\n  {\n         \"name\": \"\u5bc6\u7801\",\n         \"type\": \"password\",\n         \"action\": \"\"\n  },\n  {\n        \"name\":  \"\u2b55\u8d26\u53f7\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"login()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n        \t\"name\": \"\ud83d\udd11\u6ce8\u518c\u4e66\u6e90\",\n        \"type\": \"button\",\n        \"action\": \"key()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\":  \"\ud83d\udd18\u9000\u51fa\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"user_logout()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n        \"name\":  \"\ud83d\udd10\u4fee\u6539\u5bc6\u7801\",\n        \"type\": \"button\",\n        \"action\": \"password()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n        \t\"name\": \"\ud83d\udd2e\u4fe1\u606f\u67e5\u8be2\",\n        \"type\": \"button\",\n        \"action\": \"get_user()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n         \"name\": \"\ud83d\udc64\u7528\u6237\u540e\u53f0\",\n         \"type\": \"button\",\n         \"action\": \"user_center()\",\n         \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n        \"name\": \"\ud83d\udd0d\u805a\u5408\u641c\u7d22\",\n        \"type\": \"button\",\n        \"action\": \"sou0()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83e\udded\u4e66\u6e90\u66f4\u65b0\",\n        \"type\": \"button\",\n        \"action\": \"version()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n    \t    \"name\": \"\u2615\u6253\u8d4f\u4eab\u798f\u5229\",\n        \"type\": \"button\",\n        \"action\": \"vip()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\":0.4\n        }\n    },\n    {\n        \t\"name\": \"\ud83d\udcda\u4e66\u5c71\u53d1\u5e03\u9875\",\n        \"type\": \"button\",\n        \"action\": \"fb()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n       }\n    },\n    {\n        \"name\": \"\u81ea\u5b9a\u4e49\u6e90\u7ad9\",\n        \"type\": \"text\"\n    },\n    {\n        \"name\": \"\u2764\ufe0f\u6bb5\u8bc4\u5f00\u5173\",\n        \"type\": \"button\",\n        \"action\": \"toggleParacomment('paras')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n    \t \"name\": \"\u26a1TXT\u4e0b\u8f7d\u5f00\u5173\",\n        \"type\": \"button\",\n        \"action\": \"toggleFqdown('fqdown')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83d\udc68\u200d\ud83e\uddb1\u7537 \u9891\",\n        \"type\": \"button\",\n        \"action\": \"boy()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83d\udc69\u200d\ud83e\uddb0\u5973 \u9891\",\n        \"type\": \"button\",\n        \"action\": \"girl()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83c\udf9a\u670d\u52a1\u5668\u5207\u6362\",\n        \"type\": \"button\",\n        \"action\": \"sethost()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\u267b\ufe0f\u670d\u52a1\u5668\u68c0\u6d4b\",\n        \"type\": \"button\",\n        \"action\": \"checkCurrentServer()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \t\"name\": \"\ud83c\udf45\u756a\u8304\u767b\u5f55\",\n        \"type\": \"button\",\n        \"action\": \"fq_login()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\u274c\u756a\u8304\u9000\u51fa\",\n        \"type\": \"button\",\n        \"action\": \"logout()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \t\"name\": \"\ud83c\udf45\u8bb0\u5f55\u540c\u6b65\",\n        \"type\": \"button\",\n        \"action\": \"toggleBookSync()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n    \t   \"name\": \"\ud83c\udf45\u53d1\u73b0\u6392\u5e8f\u7b5b\u9009\",\n       \"type\": \"button\",\n       \"action\": \"SortFilter()\",\n       \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n  }\n       },\n    {\n        \"name\": \"\u2193   \u5207\u6362\/\u67e5\u8be2\u5f53\u524d\u6a21\u5f0f   \u2193\",\n        \"type\": \"button\",\n        \"action\": \"get_cx()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"\ud83d\udcd6\u5c0f\u8bf4\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"type1()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83c\udfa7\u542c\u4e66\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"type2()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83c\udfde\ufe0f\u6f2b\u753b\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"type3()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\u25b6\ufe0f\u89c6\u9891\u6a21\u5f0f\",\n        \"type\": \"button\",\n        \"action\": \"type4()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n    \t\n        \t\"name\": \"\u2193   \u4e13  \u5c5eVIP\u6e90   \u7ad9   \u2193\",\n        \"type\": \"button\",\n        \"action\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {       \n        \"name\": \"\ud83c\udf7b\u534a\u590f\u4e2d\u6587\u2747\ufe0f\",\n        \"type\": \"button\",\n        \"action\": \"sou11()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83e\udee760\u770b\u4e66\",\n        \"type\": \"button\",\n        \"action\": \"sou10()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83c\udf24\ufe0f69\u4e66\u5427com\",\n        \"type\": \"button\",\n        \"action\": \"sou12()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83c\udf24\ufe0f69\u4e66\u5427co\",\n        \"type\": \"button\",\n        \"action\": \"sou34()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83d\udc27\u4f01\u9e45\u770b\u4e66\",\n        \"type\": \"button\",\n        \"action\": \"sou8()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \t\"name\": \"\u265f\ufe0f\u4e66\u65d7\u6587\u5b66\",\n        \"type\": \"button\",\n        \"action\": \"sou9()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83c\udf75\u8336\u9a6c\u5c0f\u8bf4\",\n        \"type\": \"button\",\n        \"action\": \"sou15()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83d\udcd6\u5168\u672c\u5c0f\u8bf4\",\n        \"type\": \"button\",\n        \"action\": \"sou42()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n     },\n     {\n        \t\"name\": \"\ud83c\udf7b\u7cbe\u54c1\u6587\u5b66\",\n        \"type\": \"button\",\n        \"action\": \"sou46()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \t\"name\": \"\ud83e\udd55\u841d\u535c\u5c0f\u8bf4\",\n        \"type\": \"button\",\n        \"action\": \"sou45()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \t\"name\": \"\u2712\ufe0f\u7b14\u8da3\u9601\",\n        \"type\": \"button\",\n        \"action\": \"sou17()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n     \t    \"name\": \"\ud83c\udccf3A\u4e2d\u6587\",\n         \"type\": \"button\",\n         \"action\": \"sou44()\",\n         \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n         \t\"name\": \"\ud83d\udc3c\u5927\u718a\u732b\",\n         \"type\": \"button\",\n         \"action\": \"sou43()\",\n         \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n     \t   \"name\": \"\ud83c\udf3d\u901f\u8bfb\u8c37\",\n        \"type\": \"button\",\n        \"action\": \"sou31()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n    \t    \"name\": \"\ud83d\udedf\u4e07\u76f8\u4e66\u57ce\",\n        \"type\": \"button\",\n        \"action\": \"sou48()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \t\"name\": \"\u2601\u4e91\u7aef\u4e66\u5e93\",\n        \"type\": \"button\",\n        \"action\": \"sou41()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n       \t\"name\": \"\ud83d\udcfb\u7231\u542cFM\",\n        \"type\": \"button\",\n        \"action\": \"sou40()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \t\"name\": \"\ud83c\udfa7\u559c\u9a6c\u62c9\u96c5\",\n        \"type\": \"button\",\n        \"action\": \"sou47()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n            \"name\": \"\u2193   \u514d   \u8d39   \u6e90   \u7ad9   \u2193\",\n        \"type\": \"button\",\n        \"action\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"\ud83c\udf45\u756a\u8304\u5c0f\u8bf4\",\n        \"type\": \"button\",\n        \"action\": \"sou1()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83c\udf45\u756a\u8304\u542c\u4e66[AI\u97f3\u8272]\",\n        \"type\": \"button\",\n        \"action\": \"sou2()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83c\udfa7\u756a\u8304\u7545\u542c\",\n        \"type\": \"button\",\n        \"action\": \"sou3()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83c\udf45\u756a\u8304\u6f2b\u753b\",\n        \"type\": \"button\",\n        \"action\": \"sou4()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83c\udf45\u756a\u8304\u77ed\u5267\",\n        \"type\": \"button\",\n        \"action\": \"sou5()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83d\udcab\u8d77\u70b9\u4e2d\u6587\",\n        \"type\": \"button\",\n        \"action\": \"sou7()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83d\udc31\u4e03\u732b\u5c0f\u8bf4\",\n        \"type\": \"button\",\n        \"action\": \"sou6()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n    \t\"name\": \"\ud83d\udc31\u4e03\u732b\u77ed\u5267\",\n        \"type\": \"button\",\n        \"action\": \"sou33()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n    \t         \"name\": \"\ud83e\udd89\u732b\u773c\u770b\u4e66\",\n        \"type\": \"button\",\n        \"action\": \"sou21()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83c\udf70\u6dd8\u5c0f\u8bf4\",\n        \"type\": \"button\",\n        \"action\": \"sou24()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83c\udf52\u8ffd\u4e66\u795e\u5668\",\n        \"type\": \"button\",\n        \"action\": \"sou19()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83c\udf4b\u5f97\u95f4\u5c0f\u8bf4\",\n        \"type\": \"button\",\n        \"action\": \"sou13()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83e\udd68\u7231\u4e0b\u7535\u5b50\u4e66\",\n        \"type\": \"button\",\n        \"action\": \"sou16()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83c\udf3e\u5c0f\u7c73\u9605\u8bfb\",\n        \"type\": \"button\",\n        \"action\": \"sou20()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n     {\n        \"name\": \"\ud83c\udf6d\u7c73\u8bfb\",\n        \"type\": \"button\",\n        \"action\": \"sou18()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83c\udf8a\u75af\u8bfb\",\n        \"type\": \"button\",\n        \"action\": \"sou23()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\u2696\ufe0f\u5723\u6b66\u4e66\u5c4b\",\n        \"type\": \"button\",\n        \"action\": \"sou22()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.45\n        }\n    },\n    {\n        \"name\": \"\ud83c\udf42\u77e5\u4e4e\u76d0\u9009\",\n        \"type\": \"button\",\n        \"action\": \"sou14()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.45\n        }\n    },\n    {\n         \"name\": \"\ud83c\udf38NT\u52a8\u6f2b\",\n         \"type\": \"button\",\n         \"action\": \"sou35()\",\n         \"style\": {\n         \"layout_flexGrow\": 1,\n         \"layout_flexBasisPercent\": 0.4\n    }\n   },\n   {\n        \"name\": \"\ud83c\udf00919\u8a00\u60c5\",\n        \"type\": \"button\",\n        \"action\": \"sou32()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },{\n    \t    \"name\": \"\ud83c\udf49\u897f\u74dc\u5c0f\u8bf4\",\n        \"type\": \"button\",\n        \"action\": \"sou30()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83d\udc3e\u767e\u5ea6\u5c0f\u8bf4\",\n        \"type\": \"button\",\n        \"action\": \"sou36()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n    \t    \"name\": \"\ud83c\udf0a\u9177\u6211\u5c0f\u8bf4\",\n        \"type\": \"button\",\n        \"action\": \"sou37()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \t\"name\": \"\ud83d\udc30\u601d\u5154\u9605\u8bfb\",\n        \"type\": \"button\",\n        \"action\": \"sou25()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \t\"name\": \"\ud83c\udf65\u5305\u5b50\u6f2b\u753b\",\n        \"type\": \"button\",\n        \"action\": \"sou29()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\ud83c\udf1d\u5168\u9762\u6f2b\u753b\",\n        \"type\": \"button\",\n        \"action\": \"sou39()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"\u542c\u4e66AI\u97f3\u8272\u7f16\u53f7\",\n        \"type\": \"text\"\n    },\n    {\n        \"name\": \"\u6bb5\u8bc4\u56fe\u6807\u989c\u8272\",\n        \"type\": \"text\"\n    },\n    {\n        \"name\": \"\u6bb5\u8bc4\u6c14\u6ce1\u6837\u5f0f\",\n        \"type\": \"text\"\n    },\n  {\n        \"name\": \"\u756a\u8304\u767b\u5f55Token\",\n        \"type\": \"text\"\n    }\n]","loginUrl":"\/\/ \u8bf7\u52ff\u6539\u52a8\u7248\u672c\u53f7,\u5426\u5219\u5f71\u54cd\u66f4\u65b0\u8bc6\u522b\nconst localVersion = \"5.11\";\n\nvar hosts = [\n    \"https:\/\/search.shusan.icu\",\n    \"https:\/\/jo.shusan.icu\",\n    \"http:\/\/1.94.248.5:7001\"\n];\n\nvar sourceList = [\n    {n:\"sou0\",v:null,m:\"\ud83d\udd0d\u805a\u5408\u641c\u7d22\"},\n    {n:\"sou1\",v:\"\u756a\u8304\u5c0f\u8bf4\",m:\"\u756a\u8304\u5c0f\u8bf4\"},\n    {n:\"sou2\",v:\"\u756a\u8304\u542c\u4e66\",m:\"\u756a\u8304\u542c\u4e66\"},\n    {n:\"sou3\",v:\"\u756a\u8304\u7545\u542c\",m:\"\u756a\u8304\u7545\u542c\"},\n    {n:\"sou4\",v:\"\u756a\u8304\u6f2b\u753b\",m:\"\u756a\u8304\u6f2b\u753b\"},\n    {n:\"sou5\",v:\"\u756a\u8304\u77ed\u5267\",m:\"\u756a\u8304\u77ed\u5267\"},\n    {n:\"sou6\",v:\"\u4e03\u732b\",m:\"\ud83d\udc31\u4e03\u732b\"},\n    {n:\"sou7\",v:\"\u8d77\u70b9\",m:\"\ud83d\udcab\u8d77\u70b9\u4e2d\u6587\"},\n    {n:\"sou8\",v:\"\u4f01\u9e45\u770b\u4e66\",m:\"\ud83d\udc27\u4f01\u9e45\u770b\u4e66\"},\n    {n:\"sou9\",v:\"\u4e66\u65d7\",m:\"\u265f\ufe0f\u4e66\u65d7\"},\n    {n:\"sou10\",v:\"60\u770b\u4e66\",m:\"60\u770b\u4e66\"},\n    {n:\"sou11\",v:\"\u534a\u590f\",m:\"\u534a\u590f\u5c0f\u8bf4\"},\n    {n:\"sou12\",v:\"69\u4e66\u5427\",m:\"69\u4e66\u5427com\"},\n    {n:\"sou13\",v:\"\u5f97\u95f4\",m:\"\u5f97\u95f4\"},\n    {n:\"sou14\",v:\"\u77e5\u4e4e\",m:\"\u77e5\u4e4e\u76d0\u9009\"},\n    {n:\"sou15\",v:\"\u8336\u9a6c\",m:\"\u8336\u9a6c\u5c0f\u8bf4\"},\n    {n:\"sou16\",v:\"\u7231\u4e0b\u7535\u5b50\u4e66\",m:\"\u7231\u4e0b\u7535\u5b50\u4e66\"},\n    {n:\"sou17\",v:\"\u7b14\u8da3\u9601\",m:\"\u7b14\u8da3\u960122\"},\n    {n:\"sou18\",v:\"\u7c73\u8bfb\",m:\"\u7c73\u8bfb\"},\n    {n:\"sou19\",v:\"\u8ffd\u4e66\u795e\u5668\",m:\"\u8ffd\u4e66\u795e\u5668\"},\n    {n:\"sou20\",v:\"\u5c0f\u7c73\u9605\u8bfb\",m:\"\u5c0f\u7c73\u9605\u8bfb\"},\n    {n:\"sou21\",v:\"\u732b\u773c\u770b\u4e66\",m:\"\u732b\u773c\u770b\u4e66\"},\n    {n:\"sou22\",v:\"\u5723\u6b66\u4e66\u5c4b\",g:\"girl\",m:\"\u5723\u6b66\u4e66\u5c4b\"},\n    {n:\"sou23\",v:\"\u75af\u8bfb\",m:\"\u75af\u8bfb\u5c0f\u8bf4\"},\n    {n:\"sou24\",v:\"\u6dd8\u5c0f\u8bf4\",m:\"\u6dd8\u5c0f\u8bf4\"},\n    {n:\"sou25\",v:\"\u601d\u5154\",m:\"\u601d\u5154\u9605\u8bfb\"},\n    {n:\"sou26\",v:\"\u751c\u68a6\u6587\u5e93\",g:\"girl\",m:\"\u751c\u68a6\u6587\u5e93\"},\n    {n:\"sou27\",v:\"\u4e09\u4e03\u8f7b\u5c0f\u8bf4\",m:\"\u4e09\u4e03\u8f7b\u5c0f\u8bf4\"},\n    {n:\"sou28\",v:\"\u6b6a\u745e\u53e4\u5fb7\",m:\"\u6b6a\u745e\u53e4\u5fb7\"},\n    {n:\"sou29\",v:\"\u5305\u5b50\u6f2b\u753b\",m:\"\u5305\u5b50\u6f2b\u753b\"},\n    {n:\"sou30\",v:\"\u897f\u74dc\",m:\"\ud83c\udf49\u897f\u74dc\u5c0f\u8bf4\"},        \n    {n:\"sou31\",v:\"\u901f\u8bfb\u8c37\",m:\"\u901f\u8bfb\u8c37\"},\n    {n:\"sou32\",v:\"919\",m:\"919\u8a00\u60c5\"},\n    {n:\"sou33\",v:\"\u4e03\u732b\u77ed\u5267\",m:\"\ud83d\udc31\u4e03\u732b\u77ed\u5267\"},\n    {n:\"sou34\",v:\"69\u4e66\u5427co\",m:\"69\u4e66\u5427co\"},\n    {n:\"sou35\",v:\"nt\u52a8\u6f2b\",m:\"\ud83c\udf38NT\u52a8\u6f2b\"},\n    {n:\"sou36\",v:\"\u767e\u5ea6\",m:\"\u767e\u5ea6\u5c0f\u8bf4\"},\n    {n:\"sou37\",v:\"\u9177\u6211\",m:\"\u9177\u6211\u5c0f\u8bf4\"},\n    {n:\"sou38\",v:\"\u7b14\u8da3\u960178\",m:\"\u7b14\u8da3\u960178\"},\n    {n:\"sou39\",v:\"\u5168\u9762\u6f2b\u753b\",m:\"\u5168\u9762\u6f2b\u753b\"},\n    {n:\"sou40\",v:\"\u7231\u542c\",m:\"\u7231\u542cFM\"},\n    {n:\"sou41\",v:\"\u4e91\u7aef\",m:\"\u4e91\u7aef\u4e66\u5e93\"},\n    {n:\"sou42\",v:\"\u5168\u672c\",m:\"\u5168\u672c\u5c0f\u8bf4\"},\n    {n:\"sou43\",v:\"\u5927\u718a\u732b\",m:\"\u5927\u718a\u732b\"},\n    {n:\"sou44\",v:\"3a\u4e2d\u6587\",m:\"3A\u4e2d\u6587\"},\n    {n:\"sou45\",v:\"\u841d\u535c\",m:\"\u841d\u535c\u5c0f\u8bf4\"},\n    {n:\"sou46\",v:\"\u7cbe\u54c1\",m:\"\u7cbe\u54c1\u6587\u5b66\"},\n    {n:\"sou47\",v:\"\u559c\u9a6c\u62c9\u96c5\",m:\"\u559c\u9a6c\u62c9\u96c5\"},\n    {n:\"sou48\",v:\"\u4e07\u76f8\u4e66\u57ce\",m:\"\u4e07\u76f8\u4e66\u57ce\"},\n    {n:\"type1\",v:\"\u5c0f\u8bf4\",m:\"\u5c0f\u8bf4\u6a21\u5f0f\"},\n    {n:\"type2\",v:\"\u542c\u4e66\",m:\"\u542c\u4e66\u6a21\u5f0f\"},\n    {n:\"type3\",v:\"\u6f2b\u753b\",m:\"\u6f2b\u753b\u6a21\u5f0f\"},\n    {n:\"type4\",v:\"\u89c6\u9891\",m:\"\u89c6\u9891\u6a21\u5f0f\"}\n];\n\nfunction hasValidCustomSource() {\n    const value = (source.getLoginInfoMap())['\u81ea\u5b9a\u4e49\u6e90\u7ad9'];\n    return !(value == null || value == undefined || value == \"\" || String(value).trim() == \"\");\n}\n\nfunction showCustomSourceAlert() {\n    const customSource = (source.getLoginInfoMap())['\u81ea\u5b9a\u4e49\u6e90\u7ad9'];\n    java.toast(\n        \"\\n\u26a0\ufe0f \u81ea\u5b9a\u4e49\u6e90\u7ad9\u914d\u7f6e\u63d0\u9192 \u26a0\ufe0f\\n\" +\n        \"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\" +\n        \"\u68c0\u6d4b\u5230\u5df2\u8bbe\u7f6e\u81ea\u5b9a\u4e49\u6e90\u7ad9: \\n\u2728\" +\n        \"\u3010\" + (customSource || \"\") + \"\u3011\u2728\\n\" +\n        \"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\" +\n        \"\u8bf7\u524d\u5f80\u300c\u4e66\u6e90\u767b\u5f55\u300d\u6e05\u9664\u914d\u7f6e\\n\" +\n        \"\u624d\u80fd\u4f7f\u6307\u5b9a\u6e90\u7ad9\u5207\u6362\u751f\u6548\"\n    );\n}\n\nfunction login(){\n    const loginInfo = source.getLoginInfoMap();\n    const email = loginInfo['\u90ae\u7bb1'];\n    const password = loginInfo['\u5bc6\u7801'];\n    \n    if (!email || !password) {\n        java.toast(\"\\n\u274c \u8bf7\u5148\u586b\u5199\u8d26\u53f7\u548c\u5bc6\u7801\u5e76\u70b9\u51fb\u2713\u4fdd\u5b58\u540e\u767b\u5f55\");\n        return;\n    }\n    \n    java.toast(\"\u6b63\u5728\u767b\u5f55...\");\n    const host = getServerHost();\n    const url = host + '\/login.php';\n    const body = \"email=\" + encodeURIComponent(email) + \"&password=\" + encodeURIComponent(password);\n    \n    try {\n        const response = java.ajax(url + \",\" + JSON.stringify({\n            method: \"POST\",\n            body: body,\n            timeout: 10000\n        }));\n        \n        const result = JSON.parse(response);\n        \n        if (result.code == 200) {\n            const user = result.data.user;\n            const apiKey = user.api_key;\n            \n            source.putLoginHeader(apiKey);\n            \n            const nickname = user.nickname || \"\u7528\u6237\";\n            const maskedEmail = email.includes('@') ? \n                email.substring(0, 3) + \"****\" + email.substring(email.indexOf('@')) : \n                email;\n            \n            java.toast(\n                \"\\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\" +\n                \"\ud83c\udf1f \u767b\u5f55\u6210\u529f \ud83c\udf1f\\n\" +\n                \"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\" +\n                \"\u6b22\u8fce\u56de\u6765\uff0c\" + nickname + \"\\n\" +\n                \"\u90ae\u7bb1\uff1a\" + maskedEmail + \"\\n\" +\n                \"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\"\n            );\n        } else {\n            const errorCode = result.code || \"\u672a\u77e5\";\n            const errorMessage = result.message || \"\u672a\u77e5\u9519\u8bef\";\n            \n            java.toast(\n                \"\\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\" +\n                \"\u274c \u767b\u5f55\u5931\u8d25 \u274c\\n\" +\n                \"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\" +\n                \"\u9519\u8bef\u4ee3\u7801\uff1a\" + errorCode + \"\\n\" +\n                \"\u9519\u8bef\u4fe1\u606f\uff1a\" + errorMessage + \"\\n\" +\n                \"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\"\n            );\n        }\n        \n    } catch (e) {\n        java.toast(\n            \"\\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\" +\n            \"\u274c \u7f51\u7edc\u9519\u8bef \u274c\\n\" +\n            \"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\" +\n            \"\u8fde\u63a5\u670d\u52a1\u5668\u5931\u8d25\\n\" +\n            \"\u8bf7\u68c0\u67e5\u7f51\u7edc\u8fde\u63a5\\n\" +\n            \"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\"\n        );\n    }\n}\n\nfunction user_logout() {\n    let hadLogin = false;\n    \n    if (source.getLoginHeader() && String(source.getLoginHeader()).trim().length > 0) {\n        hadLogin = true;\n    }\n    \n    if (java.get(\"user_api_key\") && String(java.get(\"user_api_key\")).trim().length > 0) {\n        hadLogin = true;\n    }\n    \n    source.putLoginHeader(\"\");\n    java.put(\"user_api_key\", \"\");\n    \n    if (!source.getLoginHeader() || String(source.getLoginHeader()).trim().length === 0) {\n        if (!java.get(\"user_api_key\") || String(java.get(\"user_api_key\")).trim().length === 0) {\n            java.toast(hadLogin ? \"\\n\u2757 \u5df2\u6210\u529f\u9000\u51fa\u767b\u5f55\" : \"\\n\u2139\ufe0f \u5f53\u524d\u672a\u767b\u5f55\u72b6\u6001\");\n        }\n    }\n}\n\nfunction updateConfig(key, value, message, gender) {\n    if (key == \"source\" && hasValidCustomSource()) {\n        showCustomSourceAlert();\n        return;\n    }\n    \n    try {\n        var config = JSON.parse(source.getVariable());\n        if (!config || !Array.isArray(config) || config.length === 0) {\n            config = [{}];\n        }\n        config[0][key] = value;\n        if (gender !== undefined) {\n            config[0][\"gender\"] = gender;\n        }\n        source.setVariable(JSON.stringify(config));\n        java.toast(message || \"\u8bbe\u7f6e\u5df2\u66f4\u65b0\");\n    } catch(e) {\n        var newConfig = {[key]: value};\n        if (gender !== undefined) {\n            newConfig[\"gender\"] = gender;\n        }\n        source.setVariable(JSON.stringify([newConfig]));\n        java.toast(message || \"\u521d\u59cb\u5316\u8bbe\u7f6e\");\n    }\n}\n\nfunction get_user() {\n    try {\n        var encodedKey = getSecretKey();\n        if (!encodedKey) {\n            java.toast(\"\u274c \u672a\u83b7\u53d6\u5230\u5bc6\u94a5\uff0c\u8bf7\u5148\u767b\u5f55\");\n            return;\n        }\n\n        var timestamp = Math.floor(Date.now() \/ 1000);\n        var apiUrl = getServerHost() + '\/query_key.php?key=' + encodedKey + '&t=' + timestamp;\n        \n        var response = java.ajax(apiUrl + \",\" + JSON.stringify({\n            method: \"GET\",\n            timeout: 10000\n        }));\n        \n        var data = JSON.parse(response);\n        \n        if (data.data) {\n            var userInfo = data.data;\n            \n            var statusDisplay = \"\";\n            switch(userInfo.status) {\n                case \"\u6b63\u5e38\":\n                    statusDisplay = \"\u2705 \u6b63\u5e38\";\n                    break;\n                case \"\u4f1a\u5458\":\n                    statusDisplay = \"\ud83d\udc51\u4f1a\u5458\";\n                    break;\n                case \"\u5c01\u7981\":\n                    statusDisplay = \"\ud83d\udeab \u5c01\u7981\";\n                    break;\n                default:\n                    statusDisplay = userInfo.status;\n            }\n            \n            var email = userInfo.email || \"\u672a\u7ed1\u5b9a\";\n            var maskedEmail = \"\u672a\u7ed1\u5b9a\";\n            if (email !== \"\u672a\u7ed1\u5b9a\" && email.includes(\"@\")) {\n                var parts = email.split(\"@\");\n                var username = parts[0];\n                var domain = parts[1];\n                if (username.length > 2) {\n                    maskedEmail = username.substring(0, 2) + \"****@\" + domain;\n                } else {\n                    maskedEmail = username + \"****@\" + domain;\n                }\n            }\n            \n            var nickname = userInfo.nickname || \"\u672a\u8bbe\u7f6e\";\n            if (nickname === \"\u672a\u8bbe\u7f6e\") {\n                nickname = \"\ud83d\udc64 \" + nickname;\n            } else {\n                nickname = \"\ud83d\udc64 \" + nickname;\n            }\n            \n            var displayContent = \n                \"\\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\" +\n                \"\ud83d\udcca \u7528 \u6237 \u4fe1 \u606f \ud83d\udcca\\n\" +\n                \"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\" +\n                nickname + \"\\n\" +\n                \"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\" +\n                \"\ud83d\udce7 \u7ed1\u5b9a\u90ae\u7bb1\\n\" + maskedEmail + \"\\n\" +\n                \"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\" +\n                \"\ud83d\udcca \u7d2f\u8ba1\u9605\u8bfb\\n\" + userInfo.total_usage + \" \u6b21\\n\" +\n                \"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\" +\n                \"\ud83d\udcc8 \u4eca\u65e5\u9605\u8bfb\\n\" + userInfo.today_usage + \" \u6b21\\n\" +\n                \"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\" +\n                \"\ud83d\udd04 \u8d26\u6237\u72b6\u6001\\n\" + statusDisplay + \"\\n\" +\n                \"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\" +\n                \"\ud83d\udcc5 \u6ce8\u518c\u65f6\u95f4\\n\" + userInfo.created_at + \"\\n\";\n            \n            if (userInfo.is_banned) {\n                displayContent += \"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\" +\n                                \"\ud83d\udeab \u5c01\u7981\u4fe1\u606f\\n\" + userInfo.banned_info + \"\\n\";\n            }\n            \n            if (userInfo.last_used !== \"\u4ece\u672a\u4f7f\u7528\") {\n                displayContent += \"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\" +\n                                \"\u23f0 \u6700\u540e\u4f7f\u7528\\n\" + userInfo.last_used + \"\\n\";\n            }\n            \n            if (userInfo.is_member) {\n                displayContent += \"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\" +\n                                \"\ud83d\udc51\u4f1a\u5458\u72b6\u6001\\n \u5c0a\u8d35VIP\u4f1a\u5458\\n\";\n            }\n            \n            displayContent += \"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\" +\n                            \"\u2728 \u67e5\u8be2\u5b8c\u6210\";\n            \n            java.longToast(displayContent);\n            \n        } else {\n            var errorMsg = data.message || \"\u672a\u77e5\u9519\u8bef\";\n            \n            java.longToast(\n                \"\u274c \u67e5\u8be2\u5931\u8d25\uff1a\" + errorMsg\n            );\n        }\n        \n    } catch (e) {\n        java.longToast(\n            \"\u274c \u7f51\u7edc\u8fde\u63a5\u5f02\u5e38\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5\"\n        );\n    }\n}\n\nfunction get_cx() {\n    try {\n        var configStr = source.getVariable();\n        if (!configStr || configStr.trim() == \"\") {\n            configStr = JSON.stringify([{host: hosts[0]}]);\n            source.setVariable(configStr);\n        }\n        var config = JSON.parse(configStr);\n        \n        if (!Array.isArray(config) || config.length === 0) {\n            config = [{host: hosts[0]}];\n            source.setVariable(JSON.stringify(config));\n        }\n        \n        var currentConfig = config[0] || {};\n        var currentHost = currentConfig.host || hosts[0];\n        var currentSource = (!currentConfig.source || currentConfig.source == null) ? \n            \"\u2601\ufe0f \u805a\u5408\u641c\u7d22 \u2601\ufe0f\" : \n            (sourceList.find(item => item.v == currentConfig.source)?.m || currentConfig.source);\n        \n        var currentGender = currentConfig.gender == \"boy\" ? \" \u7537\ud83e\uddf8\u9891 \" : \n            (currentConfig.gender == \"girl\" ? \" \u5973\ud83c\udf80\u9891 \" : \" \u672a\u8bbe\u7f6e \");\n        \n        var currentTone = currentConfig.sz ? \"\u97f3\u8272\" + data[parseInt(currentConfig.sz) || 1][0] : \"\u9ed8\u8ba4\u97f3\u8272\";\n        \n        var customSource = (source.getLoginInfoMap())['\u81ea\u5b9a\u4e49\u6e90\u7ad9'] || \"\u672a\u8bbe\u7f6e\"; \n        var customSourceStatus = hasValidCustomSource() ? \"\ud83d\udd17 \" + customSource : \"\u5f53\u524d\u672a\u8bbe\u7f6e\uff0c\u793a\u4f8b\uff1a\u7c73\u8bfb,\u4e66\u65d7\";\n        \n        var username = \"\u672a\u767b\u5f55\";\n        try {\n            var cookie_ = String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) || \n                         (source.getLoginInfoMap())['\u756a\u8304\u767b\u5f55Token'];\n            if (cookie_) {\n                var userInfo = JSON.parse(java.ajax(\"https:\/\/fanqienovel.com\/api\/user\/info\/v2,\" + JSON.stringify({\n                    method: \"GET\", \n                    headers: { \"Cookie\": \"sessionid=\" + cookie_ },\n                    timeout: 5000\n                })));\n                username = userInfo.data?.name || \"\u5df2\u767b\u5f55(\u672a\u83b7\u53d6\u5230\u7528\u6237\u540d)\";\n            }\n        } catch (e) {\n            username = \"\u767b\u5f55\u72b6\u6001\u68c0\u67e5\u5931\u8d25\";\n        }\n\n        var message = \n            \"\\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\" +\n            \"\u2611\ufe0f  \u914d  \u7f6e  \u72b6  \u6001 \u2611\ufe0f\\n\" +\n            \"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\" +\n            \"\ud83d\udd18 \u670d  \u52a1  \u5668 \ud83d\udd18\\n\" + currentHost + \"\\n\" +\n            \"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\" +\n            \"\ud83c\udf0b \u4e66  \u6e90 \ud83c\udf0b\\n\" + currentSource + \"\\n\" +\n            \"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\" +\n            \"\ud83c\udfd4\ufe0f \u504f  \u597d \ud83c\udfd4\ufe0f\\n\" + currentGender + \"\\n\" +\n            \"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\" +\n            \"\ud83c\udfa7 AI \u97f3 \u8272 \ud83c\udfa7\\n\" + currentTone + \"\\n\" +\n            \"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\" +\n            \"\u2747\ufe0f \u81ea \u5b9a \u4e49 \u6e90 \u2747\ufe0f\\n\" + customSourceStatus + \"\\n\" +\n            \"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\" +\n            \"\ud83c\udf45 \u756a \u8304 \u8d26 \u53f7 \ud83c\udf45\\n\" + username + \"\\n\" +\n            \"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\" +\n            \"\\n\u2728 \u63d0\u793a\uff1a\u70b9\u51fb\u6309\u94ae\u5207\u6362\u914d\u7f6e\";\n            \n        java.longToast(message);\n    } catch(e) {\n        source.setVariable(JSON.stringify([{host: hosts[0]}]));\n        java.toast(\"\u26a0\ufe0f \u914d\u7f6e\u521d\u59cb\u5316\u5b8c\u6210\uff0c\u8bf7\u91cd\u8bd5\");\n    }\n}\n\nthis.sethost = function() {\n    try {\n        var config = JSON.parse(source.getVariable());\n        if (!config || !Array.isArray(config) || config.length == 0) {\n            config = [{host: hosts[0]}];\n        }\n        \n        var currentHost = config[0].host || hosts[0];\n        var currentIndex = hosts.indexOf(currentHost);\n        var newIndex = (currentIndex + 1) % hosts.length;\n        var newHost = hosts[newIndex];\n        config[0].host = newHost;\n        source.setVariable(JSON.stringify(config));\n        java.toast(\"\u5207\u6362\u5230\uff1a\" + newHost);\n    } catch(e) {\n        source.setVariable(JSON.stringify([{host: hosts[0]}]));\n        java.toast(\"\u5df2\u521d\u59cb\u5316\uff1a\" + hosts[0]);\n    }\n};\n\nfor (var i = 0; i < sourceList.length; i++) {\n    (function() {\n        var s = sourceList[i];\n        this[s.n] = function() {\n            if (hasValidCustomSource()) {\n                showCustomSourceAlert();\n                return;\n            } if (s.g) {\n                updateConfig(\"source\", s.v, \"\\n\u5df2\u5207\u6362\" + (s.v ? '\u5230\u2747\ufe0f' : '') + s.m +\"\u2747\ufe0f\\n\u5237\u65b0\u53d1\u73b0\u9875\u751f\u6548\", s.g);\n            } else {\n                updateConfig(\"source\", s.v, \"\\n\u5df2\u5207\u6362\" + (s.v ? '\u5230\u2747\ufe0f' : '') + s.m +\"\u2747\ufe0f\\n\u5237\u65b0\u53d1\u73b0\u9875\u751f\u6548\");\n            }\n        };\n    }).call(this);\n}\n\n\/\/ \u68c0\u6d4b\u5f53\u524d\u670d\u52a1\u5668\u72b6\u6001\nfunction checkCurrentServer() {\n    try {\n        var currentHost = getServerHost();\n        java.longToast(`\\n\\n\u267b\ufe0f\u6b63\u5728\u68c0\u6d4b\u5f53\u524d\u670d\u52a1\u5668\uff1a${currentHost}\\n\u8bf7\u7a0d\u7b49~`);\n        let date1 = new Date().getTime();\n        let html = java.ajax(currentHost);\n        let date2 = new Date().getTime();\n        let t = date2 - date1;\n        let c = String(html).indexOf('\u4e66\u5c71');\n        let time = t \/ 1000 + 's';\n        let logTime = '\u3010' + currentHost + '\u3011\\n\u250b\u250b\\n' + '\u89e3\u6790\u65f6\u95f4\uff1a' + time;\n        \n        if (c == -1 || t > 5000) {\n            java.longToast('\\n\ud83d\udc94\u3010\u8bbf\u95ee\u5931\u8d25\u63d0\u793a\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2663\ufe0f\u5f53\u524d\u63a5\u53e3\u65e0\u6cd5\u8bbf\u95ee(\u53ef\u80fd\u88ab\u5899)\u2663\ufe0f\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\/\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n        } else if (t < 1000) {\n            java.longToast('\\n\ud83d\udc96\u3010\u7f51\u7edc\u73af\u5883\u4f18\u826f\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2764\ufe0f\u5ef6\u8fdf\u4f4e\uff0c\u63a8\u8350\u4f7f\u7528\u6b64\u63a5\u53e3\u2764\ufe0f\\n\u250b\u250b\\n\u7f51\u7edc\u73af\u5883\u4f18\u826f\uff0c\u8bf7\u7ee7\u7eed\u4fdd\u6301\u72b6\u6001\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n        } else if (t >= 1000 && t < 2000) {\n            java.longToast('\\n\ud83d\udc9b\u3010\u7f51\u7edc\u73af\u5883\u4e00\u822c\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2666\ufe0f\u5ef6\u8fdf\u4e00\u822c\uff0c\u52c9\u5f3a\u53ef\u4f7f\u7528\u2666\ufe0f\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\u6216\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n        } else if (t >= 2000 && t < 5000) {\n            java.longToast('\\n\ud83d\udc94\u3010\u7f51\u7edc\u73af\u5883\u582a\u5fe7\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n' + logTime + '\\n\u250b\u250b\\n\u2660\u5ef6\u8fdf\u8fc7\u9ad8\uff0c\u4e0d\u5efa\u8bae\u4f7f\u7528\u2660\\n\u250b\u250b\\n\u8bf7\u5207\u6362\u5176\u4ed6\u63a5\u53e3\u6216\u5207\u6362\u7f51\u7edc\u73af\u5883\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n        }\n    } catch(e) {\n        java.longToast('\\n\u274c\u3010\u670d\u52a1\u5668\u68c0\u6d4b\u5931\u8d25\u3011\\n' + '\u250f\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u2513\\n\u250b\u250b\\n\u68c0\u6d4b\u8fc7\u7a0b\u4e2d\u53d1\u751f\u9519\u8bef\\n\u250b\u250b\\n\u8bf7\u68c0\u67e5\u7f51\u7edc\u8fde\u63a5\u6216\u670d\u52a1\u5668\u72b6\u6001\\n\u250b\u250b' + '\\n\u2517\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2501\u2505\u2505\u2501\u2505\u2501\u2505\u251b');\n    }\n}\n\n\/\/\u6253\u8d4f\nfunction vip() { java.startBrowserAwait(getServerHost() + '\/coffee', \"\u559d\u5496\u5561\"); }\nfunction fb() { java.startBrowserAwait('https:\/\/fb.shushan.vip', \"\u53d1\u5e03\u9875\"); }\nfunction key() { java.startBrowserAwait(getServerHost() + '\/key', \"\u83b7\u53d6\u5bc6\u94a5\"); }\nfunction version() { java.startBrowserAwait(getServerHost() + '\/version?id=' + localVersion, \"\u7248\u672c\u68c0\u67e5\"); }\n\nfunction Map(e) {\n    if (e == \"source\" && hasValidCustomSource()) {\n        showCustomSourceAlert();\n        return (source.getLoginInfoMap())['\u81ea\u5b9a\u4e49\u6e90\u7ad9'];\n    }\n    var infomap = source.getLoginInfoMap();\n    const value = infomap[e];\n    if (!value) {\n        java.longToast(\"\u9700\u8981\u586b\u5199\u5bc6\u94a5\");\n    }\n    return value;\n}\n\nfunction fq_login() {\n    try { \tjava.startBrowserAwait(\"https:\/\/fanqienovel.com\/\", \"\u767b\u5f55\");\n    } catch (e) {\n        java.toast(e);\n    }\n    try {\n        cookie.removeCookie(\"snssdk.com\");\n    } catch (e) {}\n    \n    let cookieHeader = String(cookie.getCookie('fanqienovel.com'));\njava.toast(cookieHeader);\n    \n    const match = cookieHeader.match(\/sessionid=([^;]+)\/);\n    java.toast(match);\n    let sessionId = match ? match[1] : null;\n\n    let cookieString = sessionId ? \"sessionid=\" + sessionId : source.getLoginInfoMap()['\u756a\u8304\u767b\u5f55Token'] || \"\";\n    java.toast(cookieString);\n    let user;\n    try {\n        user = JSON.parse(java.ajax(\"https:\/\/fanqienovel.com\/api\/user\/info\/v2,\" + JSON.stringify({\n            method: \"GET\",\n            headers: { \"Cookie\": cookieString }\n        }))).data.name;\n    } catch (e) { \n        java.log(e); \n    }\n    \n    if (!cookieString || cookieString == \"sessionid=\" || !user) {\n        java.toast(\"\u672a\u83b7\u53d6\u5230\u767b\u5f55\u51ed\u636e\uff0c\u767b\u5f55\u5931\u8d25\");\n        return false;\n    }\n    \n    java.toast(\"\\n\\n\u6b22\u8fce \" + user + \"\\n\u767b\u5f55\u6210\u529f\uff01\");\n    return true;\n}\n\nfunction logout() {\n    cookie.removeCookie(\"fanqienovel.com\");\n    cookie.removeCookie(\"snssdk.com\");\n    if (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) || \n        (source.getLoginInfoMap())['\u624b\u52a8\u767b\u5f55Token']) {\n        java.toast(\"\u8bf7\u624b\u52a8\u79fb\u9664\u586b\u5199\u7684Token\");\n    } else {\n        java.toast(\"\u9000\u51fa\u767b\u5f55\u6210\u529f\");\n    }\n}\n\nfunction toggleParacomment() {\n    const key = \"yunpara\";\n    let status = java.get(key) ?? \"off\";\n    if (status == \"on\") {\n        java.put(key, \"off\");\n        java.toast(\"\\n\ud83c\udf45\u756a\u8304\uff0c\ud83d\udc31\u4e03\u732b\\n\u274c\u6bb5\u8bc4\u5df2\u5173\u95ed\");\n    } else {\n        java.put(key, \"on\");\n        java.toast(\"\\n\ud83c\udf45\u756a\u8304\uff0c\ud83d\udc31\u4e03\u732b\\n\u2705\u6bb5\u8bc4\u5df2\u5f00\u542f\");\n    }\n}\n\nfunction toggleFqdown(a) {\n    let status = java.get(a) ?? \"off\";\n    if (status == \"off\") {\n        java.put(a, \"on\");\n        java.toast(\"\\n\ud83c\udf45\u756a\u8304\u5c0f\u8bf4\\n\u2705\u4e0b\u8f7d\u6a21\u5f0f\u5df2\u5f00\u542f\");\n    } else {\n        java.put(a, \"off\");\n        java.toast(\"\\n\ud83c\udf45\u756a\u8304\u5c0f\u8bf4\\n\u274c\u4e0b\u8f7d\u6a21\u5f0f\u5df2\u5173\u95ed\");\n    }\n}\n\nfunction toggleBookSync() {\n    let status = java.get(\"book_sync\") ?? \"off\";\n    if (status == \"off\") {\n        java.put(\"book_sync\", \"on\");\n        java.toast(\"\\n\ud83c\udf45\u756a\u8304\u5c0f\u8bf4\\n\u2705\u5df2\u5f00\u542f - \u5c06\u81ea\u52a8\u540c\u6b65\u9605\u8bfb\u8bb0\u5f55\");\n    } else {\n        java.put(\"book_sync\", \"off\");\n        java.toast(\"\\n\u756a\u8304\u5c0f\u8bf4\\n\u274c\u5df2\u5173\u95ed - \u505c\u6b62\u540c\u6b65\u9605\u8bfb\u8bb0\u5f55\");\n    }\n}\n\nfunction SortFilter() {\n    try {\n        var savedParams = java.get(\"sortkey\");\n        savedParams = savedParams ? savedParams : \"\";\n        \n        if (savedParams.startsWith('\">')) {\n            savedParams = savedParams.substring(2);\n        } else if (savedParams.startsWith('>')) {\n            savedParams = savedParams.substring(1);\n        }\n        \n        let html = `<!DOCTYPE html><html><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\"><title>\ud83c\udf45\u6807\u7b7e\u6392\u5e8f\u7b5b\u9009<\/title><style>\n            *{margin:0;padding:0;box-sizing:border-box}\n            body{font-family:'PingFang SC','Microsoft YaHei',sans-serif;background:#f8f9fa;color:#333;max-width:700px;margin:0 auto;padding:16px}\n            .container{background:white;border-radius:16px;box-shadow:0 4px 20px rgba(0,0,0,0.08);padding:24px}\n            .header{margin-bottom:24px;text-align:center}\n            h1{color:#ff6b35;font-size:24px;font-weight:600;margin-bottom:8px}\n            .subtitle{color:#666;font-size:14px;margin-bottom:16px}\n            .current-section{background:#f0f7ff;border-radius:12px;padding:16px;margin-bottom:24px;border:1px solid #e3f2fd;position:relative}\n            .current-label{color:#1976d2;font-size:14px;font-weight:500;margin-bottom:8px}\n            .current-value{color:#2c3e50;font-size:16px;font-weight:500;min-height:24px;word-break:break-all}\n            .section{margin-bottom:28px}\n            .section-title{display:flex;align-items:center;margin-bottom:16px;font-size:16px;font-weight:600;color:#2c3e50}\n            .section-icon{margin-right:8px;font-size:18px}\n            .tip{font-size:12px;color:#ff6b35;margin-left:8px;background:#fff0e6;padding:2px 8px;border-radius:4px}\n            .buttons-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(100px,1fr));gap:10px}\n            .filter-btn{padding:10px 0;font-size:14px;border:1px solid #e0e0e0;border-radius:8px;background:white;color:#555;cursor:pointer;transition:all 0.2s;font-weight:500;text-align:center}\n            .filter-btn:hover{transform:translateY(-2px);box-shadow:0 4px 8px rgba(0,0,0,0.1)}\n            .filter-btn.selected{background:#ff6b35;color:white;border-color:#ff6b35;box-shadow:0 2px 8px rgba(255,107,53,0.3)}\n            .filter-btn.selected:hover{background:#ff5a22;box-shadow:0 4px 12px rgba(255,107,53,0.4)}\n            .action-hint{text-align:center;color:#666;font-size:13px;margin-top:32px;padding:12px;background:#f8f9fa;border-radius:8px;border:1px dashed #ddd}\n            .action-hint strong{color:#ff6b35}\n            .clear-btn{width:100%;background:#f8f9fa;color:#666;border:1px solid #ddd;border-radius:8px;padding:12px;font-size:14px;cursor:pointer;transition:all 0.2s;margin-top:32px}\n            .clear-btn:hover{background:#ffefeb;color:#ff6b35;border-color:#ff6b35}\n            @media (max-width:480px){.buttons-grid{grid-template-columns:repeat(3,1fr)}}\n        <\/style><\/head><body><div class=\"container\">\n            <div class=\"header\">\n                <h1>\ud83c\udf45 \u6807\u7b7e\u6392\u5e8f\u7b5b\u9009<\/h1>\n                <div class=\"subtitle\">\u9009\u62e9\u7b5b\u9009\u6761\u4ef6\uff0c\u53f3\u4e0a\u89d2\"\u2713\"\u786e\u8ba4\u751f\u6548<\/div>\n            <\/div>\n            \n            <div class=\"current-section\">\n                <div class=\"current-label\">\u5f53\u524d\u9009\u62e9\uff1a<\/div>\n                <div id=\"result-output\">${savedParams ? savedParams : \"\u672a\u9009\u62e9\"}<\/div>\n            <\/div>\n            \n            <div class=\"section\">\n                <div class=\"section-title\">\n                    <span class=\"section-icon\">\ud83d\udccf<\/span> \u5b57\u6570\u53c2\u6570 <span class=\"tip\">\u5355\u9009<\/span>\n                <\/div>\n                <div class=\"buttons-grid\" id=\"length-btns\"><\/div>\n            <\/div>\n            \n            <div class=\"section\">\n                <div class=\"section-title\">\n                    <span class=\"section-icon\">\ud83d\udcc8<\/span> \u72b6\u6001\u53c2\u6570 <span class=\"tip\">\u5355\u9009<\/span>\n                <\/div>\n                <div class=\"buttons-grid\" id=\"status-btns\"><\/div>\n            <\/div>\n            \n            <div class=\"section\">\n                <div class=\"section-title\">\n                    <span class=\"section-icon\">\ud83d\udd1d<\/span> \u6392\u5e8f\u53c2\u6570 <span class=\"tip\">\u5355\u9009<\/span>\n                <\/div>\n                <div class=\"buttons-grid\" id=\"sort-btns\"><\/div>\n            <\/div>\n            \n            <button onclick=\"clearAll()\" class=\"clear-btn\">\n                \ud83d\uddd1\ufe0f \u6e05\u9664\u6240\u6709\u9009\u62e9\n            <\/button>\n            \n            <div class=\"action-hint\">\n                \u63d0\u793a\uff1a\u9009\u62e9\u5b8c\u6210\u540e\u70b9\u51fb\u53f3\u4e0a\u89d2 <strong>\u2713<\/strong> \u6309\u94ae\u786e\u8ba4\u8bbe\u7f6e\n            <\/div>\n        <\/div><script>\nvar currentParams = document.getElementById('result-output').textContent.trim();\nvar selectedItems = [];\n\nif (currentParams && currentParams !== \"\u672a\u9009\u62e9\" && currentParams !== \"undefined\") {\n    selectedItems = currentParams.split(\", \");\n}\n\nvar config={\nlengths:[\"10\u4e07\u4ee5\u4e0b\",\"30\u4e07\u4ee5\u4e0b\",\"50\u4e07\u4ee5\u4e0b\",\"30\u4e07\u4ee5\u4e0a\",\"50\u4e07\u4ee5\u4e0a\",\"100\u4e07\u4ee5\u4e0a\",\"200\u4e07\u4ee5\u4e0a\",\"300\u4e07\u4ee5\u4e0a\",\"500\u4e07\u4ee5\u4e0a\"],\nstatuses:[\"\u5b8c\u7ed3\",\"\u8fde\u8f7d\",\"\u534a\u5e74\u5b8c\u7ed3\",\"3\u5929\u66f4\u65b0\",\"7\u5929\u66f4\u65b0\",\"1\u6708\u66f4\u65b0\"],\nsorts:[\"\u70ed\u95e8\",\"\u65b0\u4e66\",\"\u8bc4\u5206\",\"\u5b57\u6570\"]\n};\nvar categorySelection={\nlength:null,\nstatus:null,\nsort:null\n};\nfunction initCategorySelection(){\nif(selectedItems.length>0){\nfor(var i=0;i<selectedItems.length;i++){\nvar item=selectedItems[i];\nif(config.lengths.includes(item)){\ncategorySelection.length=item;\n}else if(config.statuses.includes(item)){\ncategorySelection.status=item;\n}else if(config.sorts.includes(item)){\ncategorySelection.sort=item;\n}}}}\ninitCategorySelection();\nfunction initButtons(containerId,items,category){\nvar container=document.getElementById(containerId);\nvar buttonsHTML='';\nfor(var i=0;i<items.length;i++){\nvar name=items[i];\nvar isSelected=categorySelection[category]===name;\nbuttonsHTML+='<button onclick=\"toggleSelection(\\\\''+name+'\\\\',\\\\''+category+'\\\\')\" class=\"filter-btn'+(isSelected?' selected':'')+'\">'+name+'<\/button>';\n}\ncontainer.innerHTML=buttonsHTML;\n}\nfunction toggleSelection(name,category){\nif(categorySelection[category]===name){\ncategorySelection[category]=null;\n}else{\ncategorySelection[category]=name;\n}\nupdateButtonStates();\nupdateOutput();\n}\nfunction updateButtonStates(){\nfor(var category in categorySelection){\nvar containerId=category+'-btns';\nvar container=document.getElementById(containerId);\nif(container){\nvar buttons=container.getElementsByTagName('button');\nfor(var i=0;i<buttons.length;i++){\nvar btn=buttons[i];\nvar btnName=btn.textContent;\nbtn.className='filter-btn'+(categorySelection[category]===btnName?' selected':'');\n}}}}\nfunction updateOutput(){\nvar allSelected=[];\nfor(var category in categorySelection){\nif(categorySelection[category]){\nallSelected.push(categorySelection[category]);}}\nvar resultText=allSelected.length>0?allSelected.join(\", \"):\"\u672a\u9009\u62e9\";\ndocument.getElementById('result-output').textContent=resultText;\n}\nfunction clearAll(){\ncategorySelection={length:null,status:null,sort:null};\nupdateButtonStates();\nupdateOutput();\n}\ninitButtons('length-btns',config.lengths,'length');\ninitButtons('status-btns',config.statuses,'status');\ninitButtons('sort-btns',config.sorts,'sort');\nupdateOutput();\n<\/script><\/body><\/html>`;\n        \n        let base64 = `data:text\/html;base64,${java.base64Encode(html)}`;\n        let body = java.startBrowserAwait(base64,\"\u4e66\u7c4d\u7b5b\u9009\",false).body();\n        \n        let resultDivStart = body.indexOf('<div id=\"result-output\">');\n        let selectedItems = \"\";\n        \n        if (resultDivStart > -1) {\n            let contentStart = body.indexOf('>', resultDivStart);\n            if (contentStart > -1) {\n                contentStart += 1;\n                let contentEnd = body.indexOf('<\/div>', contentStart);\n                if (contentEnd > contentStart) {\n                    selectedItems = body.substring(contentStart, contentEnd).trim();\n                    \n                    if (selectedItems === \"\u672a\u9009\u62e9\") {\n                        selectedItems = \"\";\n                    } else {\n                        if (selectedItems.startsWith('\">')) {\n                            selectedItems = selectedItems.substring(2);\n                        } else if (selectedItems.startsWith('>')) {\n                            selectedItems = selectedItems.substring(1);\n                        }\n                    }\n                }\n            }\n        }\n        \n        java.put(\"sortkey\", selectedItems);\n        \n        if (selectedItems === \"\") {\n            java.toast(\"\u5df2\u6e05\u9664\u6240\u6709\u7b5b\u9009\u6761\u4ef6\");\n        } else {\n            java.toast(\"\u8bbe\u7f6e\u6210\u529f\uff0c\u8be5\u8bbe\u7f6e\u4ec5\ud83c\udf45\u756a\u8304\u5c0f\u8bf4\u53d1\u73b0\u9875\u751f\u6548\");\n        }\n        \n    } catch(e) {\n        java.log(e);\n    }\n}\n\nfunction boy() { updateConfig(\"gender\", \"boy\", \"\\n\u5df2\u8bbe\u7f6e\u4e3a\\n\ud83d\udc68\u200d\ud83e\uddb1\u7537\u9891\\n\u5237\u65b0\u53d1\u73b0\u9875\u751f\u6548\"); }\nfunction girl() { updateConfig(\"gender\", \"girl\", \"\\n\u5df2\u8bbe\u7f6e\u4e3a\\n\ud83d\udc69\u200d\ud83e\uddb0\u5973\u9891\\n\u5237\u65b0\u53d1\u73b0\u9875\u751f\u6548\"); }\nfunction user_center() { java.startBrowserAwait(getServerHost() + '\/user_center?key=' + getSecretKey(), \"\u7528\u6237\u4e2d\u5fc3\");}\nfunction password() { java.startBrowserAwait(getServerHost() + '\/forgot_password', \"\u4fee\u6539\u5bc6\u7801\"); }\nfunction recommend() { \n    updateConfig(\"gender\", \"recommend\", \"\\n\u5df2\u8bbe\u7f6e\u4e3a\\n\u2747\ufe0f\u7f51\u53cb\u63a8\u8350\u2747\ufe0f\\n\u5237\u65b0\u53d1\u73b0\u9875\u751f\u6548\");\n    updateConfig(\"source\", \"\u63a8\u8350\"); }\nfunction tj() {\n  java.startBrowserAwait(getServerHost() + '\/login?key=' + getSecretKey(), \"\u4e66\u7c4d\u63a8\u8350\");}","respondTime":180000,"ruleBookInfo":{"author":"$.author","coverUrl":"$.cover","downloadUrls":"$.book_url\n@js:\neval(String(source.loginUrl));\nlet url = java.base64Decode(result);\nlet book_id = url.match(\/\\d{19}\/)?.[0];\nif (!book_id) throw new Error(\"\u672a\u627e\u5230\u6709\u6548\u4e66\u7c4dID\");\nlet getkey = java.base64Encode(Map('\u5bc6\u94a5'));\nlet downloadUrl = getServerHost() + `\/down?key=${getkey}&book_id=${book_id}`;\njava.toast('\\n\u5982\u679c\u63d0\u793aUnexpected webFileData\uff0c\u8bf7\u7b49\u5f85\u51e0\u79d2\u540e\u70b9\u51fb\u9605\u8bfb\u5bfc\u5165\u2026\\n\u5728\u7ebf\u9605\u8bfb\u5173\u95ed\u26a1\u4e0b\u8f7d\u6a21\u5f0f\u540e\u5237\u65b0\u5373\u53ef');\ndownloadUrl;","init":"<js>\nif (String(baseUrl).startsWith(\"data:\")) {\n    let res = JSON.parse(java.hexDecodeToString(result));\n    let {source: source_name, url: book_url, name: title} = res;\n    \n\/\/ \u4ec5\u5728\u756a\u8304\u5c0f\u8bf4\u4e14\u5f00\u542f\u4e0b\u8f7d\u6a21\u5f0f\u65f6\u8bbe\u7f6e\nif (source_name == \"\u756a\u8304\u5c0f\u8bf4\" &&   \n\t   java.get(\"fqdown\") == \"on\") {\n    book.type = 128;\n}\n\n    let request = getServerHost() +`\/details?source=${source_name}&url=${book_url}&name=${title}`;\n    \/\/java.log(request);\n    result = java.ajax(request);\n    \/\/java.log(result);\n}\nresult;\n<\/js>\n$.data","intro":"&nbsp;&nbsp;\n\u2728 \u6e90\u7ad9\uff1a{{$.source}}{{\"\\n\"+\"\u200b\"}}\n{{$.desc}}\n<js>\nconst tomatoSources = [\"\u756a\u8304\u5c0f\u8bf4\", \"\u756a\u8304\u542c\u4e66\", \"\u756a\u8304\u7545\u542c\"];\n\nif (tomatoSources.includes(\"{{$.source}}\")) {\n    try {\n        let bookId = getBookIdFromUrl(baseUrl);\n        if (bookId) {\n            let bookData = getBookData(bookId);\n            \n            if (bookData && bookData.tomato_book_status !== '3') {\n                \/\/ \u68c0\u67e5\u540c\u6b65\u5f00\u5173\u72b6\u6001\uff0c\u53ea\u6709\u5f00\u542f\u65f6\u624d\u6267\u884c\u540c\u6b65\n                let syncStatus = java.get(\"book_sync\") ?? \"off\";\n                if (syncStatus == \"on\") {\n                    syncReadingHistory(bookData.book_id);\n                }\n                \n                let bookName = bookData.original_book_name || bookData.book_name || \"\";\n                let aliasName = bookData.book_flight_alias_name || bookData.sub_title || \"\";\n                let createTime = bookData.create_time ? bookData.create_time.split('T')[0] : \"\";\n                let updateTime = bookData.last_chapter_update_time ? java.timeFormat(parseInt(bookData.last_chapter_update_time)*1000) : \"\";\n                \n                let authors = [];\n                try {\n                    authors = bookData.original_authors ? JSON.parse(bookData.original_authors) : [];\n                } catch(e) {\n                    authors = bookData.roles ? bookData.roles.replace(\/[\\[\\]\"]\/g,'').split(',') : [];\n                }\n                let authorName = authors.length > 0 ? (authors[0].AuthorName || authors[0] || \"\") : \"\";\n                \n                let tags = bookData.pure_category_tags || bookData.tags || \"\";\n                let readCount = bookData.read_count || \"0\";\n                let score = bookData.score || \"0\";\n                let last_chapter_title = bookData.last_chapter_title || \"\u6682\u65e0\";\n                let creation_status = bookData.creation_status || \"\u672a\u77e5\";\n                \n                let bookStatus = \"\u6b63\u5e38\";\n                if (bookData.book_search_visible == 'false') {\n                    bookStatus = \"\u4e0b\u67b6\";\n                } else if (bookData.tomato_book_status == '3') {\n                    bookStatus = \"\u5c0f\u9ed1\u5c4b\";\n                }\n                \n                let abstract = bookData.book_abstract_v2 || bookData.abstract || \"\";\n                let copyrightInfo = bookData.copyright_info || \"\";\n                \n                let output = `&nbsp;&nbsp;\n\u2728 \u6e90\u7ad9\uff1a{{$.source}}{{\"\\n\"+\"\u200b\"}}\n\ud83d\udcd5 \u6e90\u540d\uff1a${bookName}`;\n                \n                if (aliasName) {\n                    output += `\\n\ud83d\udcd6 \u522b\u540d\uff1a${aliasName}`;\n                }\n                \n                output += `\\n\u270f\ufe0f \u5f00\u5751\uff1a${createTime} \n\ud83e\udded \u66f4\u65b0\uff1a${updateTime}&lrm;\n\ud83d\udc64 \u4f5c\u8005\uff1a${authorName}\n\u2b50 \u8bc4\u5206:  ${score}\u5206\n\ud83d\udcd6 \u72b6\u6001:  \u8fde\u8f7d${creation_status}\u5b8c\u7ed3\n\ud83c\udff7\ufe0f \u6807\u7b7e\uff1a${tags}\n\u2705 \u6700\u65b0\u7ae0\u8282: ${last_chapter_title}\n\ud83d\udc41\ufe0f \u5728\u7ebf\uff1a${readCount}\u4eba\u5728\u8bfb\n\ud83d\udd17 \u4e66\u7c4d\u72b6\u6001\uff1a${bookStatus}`;\n                \n                \/\/ \u663e\u793a\u540c\u6b65\u72b6\u6001\n                output += `\\n\ud83d\udd04 \u9605\u8bfb\u8bb0\u5f55\uff1a${syncStatus == \"on\" ? \"\u2705\u5df2\u5f00\u542f\u540c\u6b65\" : \"\u274c\u5df2\u5173\u95ed\u540c\u6b65\"}`;\n                \n                if ([\"\u756a\u8304\u542c\u4e66\"].includes(\"{{$.source}}\")) {\n                    try {\n                        let tones = \"\\n===================\\n\ud83c\udfa7AI\u97f3\u8272\u7f16\u53f7\u4fe1\u606f: \";\n                        let info = JSON.parse(java.ajax(`https:\/\/reading.snssdk.com\/reading\/bookapi\/audio\/toneinfo\/?book_id=${bookData.book_id}&aid=1967`));\n                        for (let i of (info.data.tts_tones ? info.data.tts_tones : [])) {\n                            tones += `\\n${i.id} - ${i.title}${i.description ? \"(\" + i.description + \")\" : \"\"}`;\n                        }\n                        output += tones;\n                    } catch (e) {\n                    }\n                }\n                \n                output += `{{\"\\n\"+\"\u200b\"}}\n\ud83d\udcdc \u7b80\u4ecb\uff1a${abstract}{{\"\\n\"+\"\u200b\"}}`;\n                \n                if (copyrightInfo) {\n                    output += `\\n\ud83d\udccd ${copyrightInfo.split('\uff0c')[0]}\u3002`;\n                }\n                \n                result = output;\n            }\n        }\n    } catch (e) {\n    }\n}\nresult;\n<\/js>##\u8fde\u8f7d0|1\u5b8c\u7ed3@js:result\n.replace(\"\u7537\u751f2\u5973\u751f\", \"\u51fa\u7248\")\n.replace(\"\u8fde\u8f7d4\u5b8c\u7ed3\",\"\u65ad\u66f4\")\n.replace(\"\u8fde\u8f7d-1\u5b8c\u7ed3\",\"\u672a\u77e5\");","kind":"$.tags","lastChapter":"$.latestChapterTitle","name":"$.title","tocUrl":"<js>\nlet catalog = {\n    source: result.source,\n    url: result.book_url,\n    name: result.title,\n    tab: result.tab || \"novel\"\n};\n\nvar tabTips = {audio: '\u542c\u4e66', video: '\u89c6\u9891', comic: '\u6f2b\u753b'}; \nif (tabTips[catalog.tab]) {\n    java.toast('\u5f53\u524d\u4e3a' + tabTips[catalog.tab] + '\u6a21\u5f0f');\n}\n\nyunurl = java.base64Encode(JSON.stringify(catalog));\nresult = `data:catalogUrl;base64,${yunurl},{\"type\":\"shushan\"}`;\n<\/js>","wordCount":"$.wordCount"},"ruleContent":{"content":"<js>eval(function(p,a,c,k,e,r){e=function(c){return(c<62?'':e(parseInt(c\/62)))+((c=c%62)>35?String.fromCharCode(c+29):c.toString(36))};if('0'.replace(0,e)==0){while(c--)r[e(c)]=k[c];k=[function(e){return r[e]||e}];e=function(){return'([4-8bcfh-mo-rt-wyzB-RTUW-Z]|1\\\\w)'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('4(1b()){k{5 1c=7.X(\"is_modified_version\");4(1c==\"1d\"&&!1e.1f(1g)){v.Y=\"1h\"}l{v.Y=\"FULL\"}}m(e){4(!1e.1f(1g)){v.Y=\"1h\"}}}h w=3;h 1i=\"\u8bf7\u5c1d\u8bd5\u5207\u6362\u670d\u52a1\u5668\";function O(y,z=0){k{5 i=F.P(7.Z(y));4(i.q.1j.G(1i)){4(z<w){7.o(\"\u26a0\ufe0f\u6b63\u5728\u5c1d\u8bd5\u91cd\u65b0\u83b7\u53d6 (\"+(z+1)+\"\/\"+w+\")\");Q O(y,z+1)}l{7.o(\"\u26a0\ufe0f\u91cd\u8bd5\"+w+\"\u6b21\u540e\u4ecd\u5931\u8d25\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5\");Q i}}Q i}m(e){4(z<w){7.o(\"\u8bf7\u6c42\u5931\u8d25\uff0c\u6b63\u5728\u91cd\u8bd5(\"+(z+1)+\"\/\"+w+\")\");Q O(y,z+1)}l{7.o(\"\u26a0\ufe0f\u8bf7\u6c42\u5931\u8d25\"+w+\"\u6b21: \"+e.message);throw e;}}}4(1b()){k{eval(String(10.loginUrl));5 H=F.P(10.12());5 R=Date.R();5 1k=2*60*60*1000;4(!H[0].13||(R-H[0].13)>1k){H[0].13=R;10.setVariable(F.stringify(H));5 c=F.P(7.Z(T()+\"\/p?vid=sy\"));4(c.p){4(c.1m&&c.1m.toString().toLowerCase()==\"U\"&&c.p>I){7.14(p());7.o(\"\u8bf7\u66f4\u65b0\u4e66\u6e90\uff01\u4e0b\u8f7d\u9875\u9762\u5df2\u6253\u5f00\u3002\")}5 B=c.p>I?\"\\\\n\u2728\u53d1\u73b0\u65b0\u7248\u672cV\"+c.p+\" (\u5f53\u524dV\"+I+\")\"+(c.B?\"\\\\n\"+c.B:\\'\\'):c.p<I?\"\\\\n\u26a0\ufe0f\u7248\u672c\u5f02\u5e38\\\\n\u672c\u5730V\"+I+\" > \u4e91\u7aefV\"+c.p+\"\\\\n\u8bf7\u68c0\u67e5\u4e66\u6e90\u914d\u7f6e\":\\'\\';4(B)7.o(B)}l 4(c.B){7.o(c.B)}}}m(e){}}5 6=7.hexDecodeToString(8);5 f=6.r(\/f=(\\\\d+)\/)?.[1];5 j=6.r(\/j=(\\\\d+)\/)?.[1];5 t=C.y.r(\/t=(\\\\d+)\/)?.[1];5 u=C.y.r(\/u=(\\\\d+)\/)?.[1];5 D=1n;5 E=1n;4(\/\u4e03\u732b\/.b(6)){E=6.r(\/E=([a-f0-9]+)\/)?.[1]}4(\/\u4e03\u732b\u77ed\u5267\/.b(6)){k{h 15=6.r(\/y=([^&]+)\/)?.[1];4(15){h 1o=7.1p(15);D=1o.r(\/D=(\\\\d+)\/)?.[1]}}m(e){}}5 1q=6;5 J=T()+\\'\/\\'+1q+\\'&1r=\\'+1s()+\\'&p=11\\';4(\/\u664b\u6c5f\/.b(6)&&t&&u){J+=\\'&t=\\'+t+\\'&u=\\'+u;5 16=JJtoken()||\"\";4(16){J+=\\'&token=\\'+16}h 1t=\"chapter_refresh_force\";h 1u=7.X(1t)||\"off\";4(1u==\"on\"){J+=\"&refresh=U\"}}5 i=O(J);8=i.q.1j;5 W=i.q.W||\"\";4(6.G(\\'K=\\')){5 18=6.r(\/K=(\\\\d+)\/);4(18&&j){k{5 19=F.P(7.Z(T()+\\'\/audio?K=\\'+18[1]+\\'&item_ids=\\'+j));4(19.q?.[0]?.1v){8=19.q[0].1v}}m(e){}}}l{5 1w=\/^[A-Za-z0-9+\/]*={0,2}$\/.b(8);4(1w){k{8=decode(8)}m(e){k{8=7.1p(8)}m(e2){}}}}5 1x=v.12(\"1y\")||\"\";5 1z=7.X(\"yunpara\")||\"on\";5 L=1d;4(1z==\"on\"){4(\/\u664b\u6c5f\/.b(6)&&t&&u){L=1x.G(\"\u5f00\u542f\u6bb5\u8bc4\")}l 4(\/\u4e03\u732b\/.b(6)&&f&&j&&E){L=U}l 4(\/\u756a\u8304\u5c0f\u8bf4\/.b(6)&&f&&j&&!6.G(\\'K=\\')){L=U}}4((\/\u756a\u8304\u77ed\u5267\/.b(6)&&f)||(\/\u4e03\u732b\u77ed\u5267\/.b(6)&&D)){k{h 1A=\/\u756a\u8304\u77ed\u5267\/.b(6)?\\'f\\':\\'D\\';h 1B=\/\u756a\u8304\u77ed\u5267\/.b(6)?f:D;h 1C=T()+\\'\/player?\\'+1A+\\'=\\'+1B+\\'&1r=\\'+1s();4(v.1D==C.1E){7.14(1C,C.1F||\\'\u89c6\u9891\u64ad\u653e\\');7.o(\\'\u89c6\u9891\u52a0\u8f7d\u4e2d...\\')}8=\"\u25b6\ufe0f\u5237\u65b0\u6b63\u6587\u8fdb\u5165\u64ad\u653e\u754c\u9762\"}m(e){}}4(W==\"video\"&&v.1D==C.1E&&!\/\u756a\u8304\u77ed\u5267|\u4e03\u732b\u77ed\u5267\/.b(6)){5 1G=8;7.14(1G,C.1F||\\'\u89c6\u9891\u64ad\u653e\\');7.o(\\'\u89c6\u9891\u52a0\u8f7d\u4e2d...\\');8=\"\u25b6\ufe0f\u5237\u65b0\u6b63\u6587\u8fdb\u5165\u64ad\u653e\u754c\u9762\"}4(L){4(\/\u664b\u6c5f\/.b(6)&&t&&u){8=1a(8,t,u,\\'jj\\')}l 4(\/\u4e03\u732b\/.b(6)&&f&&j&&E){8=1a(8,f,j,\\'qm\\',E)}l 4(\/\u756a\u8304\u5c0f\u8bf4\/.b(6)&&f&&j&&!6.G(\\'K=\\')){8=1a(8,f,j,\\'fq\\')}}5 M=i.q.M||\"\";4(W==\"novel\"&&M&&M.trim()!==\"\"){8+=\"\\\\n\"+M}4(\/\u664b\u6c5f\/.b(6)&&i.q.1H){k{h 1I=v.12(\"1y\");5 N=\/\u5173\u95ed\u4f5c\u8bdd\/.b(1I)?\"\":i.q.1H;N=N.replace(\/(?:.*(?:\u87f9\u87f9|\u6254\u4e86|\u611f\u8c22|\u6295\u51fa|\u704c\u6e89\u8425\u517b\u6db2|\u9001\u7684|\u8c22\u8c22).*?(?:\u624b\u69b4|\u6708\u7968|\u9738\u738b\u7968|\u5c0f\u5929\u4f7f|\u706b\u7bad\u70ae|\u6df1\u6c34\u9c7c\u96f7|\u6d45\u6c34\u70b8\u5f39|\u5730\u96f7|\u8425\u517b\u6db2)([xX]\\\\d+)*.*|\u975e\u5e38\u611f\u8c22\u5927\u5bb6\u5bf9\u6211\u7684\u652f\u6301\uff0c\u6211\u4f1a\u7ee7\u7eed\u52aa\u529b\u7684\uff01|.*?\u74f6[\uff1b~]|\".*?\"(?:\u8425\u517b\u6db2|\u624b\u69b4\u5f39|\u6708\u7968|\u9738\u738b\u7968|\u5c0f\u5929\u4f7f|\u706b\u7bad\u70ae|\u6df1\u6c34\u9c7c\u96f7|\u6d45\u6c34\u70b8\u5f39|\u5730\u96f7)x\\\\d+|\u8bfb\u8005.*?(\u6708\u77f3|\u8425\u517b\u6db2).*|\u5730\u96f7\u611f\u8c22\uff1a[\\\\s\\\\S]+)\/g,\\'\\');4(\/[\\\\u4e00-\\\\u9fa5]\/.b(N)){8+=\"\\\\n\u3010\ud83d\udce2\u4f5c\u8005\u6709\u8bdd\u8bf4\u3011\\\\n\"+N}}m(e){}}8;',[],107,'||||if|let|contenturl|java|result|||test|versionData|||book_id||const|response|item_id|try|else|catch||toast|version|data|match||novelId|chapterId|book|MAX_RETRIES||url|retryCount||msg|chapter|qm_id|content_md5|JSON|includes|config|localVersion|contentUrl|tone_id|isParagraphEnabled|notice|saybody|fetchWithRetry|parse|return|now||getServerHost|true||tab|get|imageStyle|ajax|source||getVariable|lastUpdateCheck|startBrowser|urlParam|jjToken||toneId|apiData|getComments|deviceType|envVersion|false|isQRead|call|this|TEXT|ERROR_MESSAGE|content|fourHours||force|null|decodedUrl|base64Decode|baseUrl|key|getSecretKey|refreshKey|refreshStatus|main_url|isBase64|customVariable|custom|yunparaStatus|paramName|paramValue|videoUrl|durChapterIndex|index|title|normalVideoUrl|sayBody|bbb'.split('|'),0,{}))<\/js>","replaceRegex":"##\\(\u7b2c\\d+\/\\d+\u9875\\)|\\(\u672c\u7ae0\u5b8c\\)|\\(\\)"},"ruleExplore":{"author":"$.author","bookList":"<js>\nfunction getBookIdFull(url) {\n    const {java} = this;\n    let $ = JSON.parse(url).data;\n    let arr = [];\n    if ($.book_shelf_info && $.book_shelf_info.length > 0) {\n        arr = $.book_shelf_info.map(item => item.book_id);\n    } else if ($.data_list && $.data_list.length > 0) {\n        arr = $.data_list.map(item => item.book_id_str);\n    } else {\n        java.toast(\"\u83b7\u53d6 book_id \u5931\u8d25\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u767b\u5f55\uff01\");\n    }\n    return arr;\n}\n\nlet session = getSessionId()\n\ngetShelf = () => {\n    let book_shelf_info = java.ajax(getServerHost() + \"\/book_shelf?session=\" + session)\n    \n    bid = getBookIdFull(book_shelf_info)\n    \n    let id_list = splitArray(bid, 200)\n    let urls = []\n    id_list.forEach(i => {\n        urls.push(getServerHost() +\"\/detail?book_id=\" + i.join(\",\") + \"&sessionid=\" + session)\n    })\n    res = java.ajaxAll(urls)\n\n    let resp = {book_info: []}\n    res.forEach(r => {\n        resp.book_info = resp.book_info.concat(JSON.parse(r.body()).data)\n    })\n\n    return resp\n}\n\nfunction getByGroupName(name) {\n    let book_shelf_info = JSON.parse(java.ajax(getServerHost() +\"\/book_shelf?session=\" + session))\n    \n    let group_bookids = {\n        \"\u672a\u5206\u7ec4\": []\n    }\n    book_shelf_info.data.book_shelf_info.forEach(i => {\n        if (!group_bookids[i.group_name ? i.group_name : \"\u672a\u5206\u7ec4\"]) group_bookids[i.group_name] = []\n        group_bookids[i.group_name ? i.group_name : \"\u672a\u5206\u7ec4\"].push(i.book_id)\n    })\n    \n    if (!group_bookids[decodeURIComponent(name)]) return {data: []}\n    \n    let book_ids = splitArray(group_bookids[decodeURIComponent(name)], 200)\n    let urls = []\n\n    book_ids.forEach(i => { \turls.push(\"https:\/\/api5-normal-sinfonlineb.fqnovel.com\/reading\/bookapi\/multi-detail\/v\/?aid=1967&iid=1&version_code=999&book_id=\" + i.join(\",\"))\n    })\n    \n    res = java.ajaxAll(urls)\n\n    let resp = {book_info: []}\n    res.forEach(r => {\n        resp.book_info = resp.book_info.concat(JSON.parse(r.body()).data)\n    })\n\n    return resp\n}\n\nfunction getByTabIndex(index) {\n    let url = _mlsec.requestHeader(\n        \"bookmall\/tab\",\n        \"version_name=5.8.9.32\",\n        null,\n        \"sessionid=\" + session\n    )\n    let all = JSON.parse(java.ajax(url))\n    let tab = all.data.tab_item[0].cell_data[index].cell_data\n    if (!tab) tab = []\n    let bookList = []\n    for (let i of tab) {\n        bookList = bookList.concat(i.book_data)\n    }\n    return { book_info: bookList }\n}\n\nfunction normalizeResponse(data) {\n    if (data.data && data.data.book_list && Array.isArray(data.data.book_list)) {\n        return data.data.book_list;\n    }\n    \n    if (data.book_info) return data.book_info;\n    if (data.data && data.data.book_info) return data.data.book_info;\n    if (data.data && Array.isArray(data.data)) return data.data;\n    if (data.list) return data.list;\n    if (data.book_list) return data.book_list;\n    if (data.data && data.data.publication_list) return data.data.publication_list;\n    if (data.result) return data.result;\n    if (data.data && data.data.result) return data.data.result;\n    if (data.data && data.data.cell_view && data.data.cell_view.book_data) {\n        return data.data.cell_view.book_data;\n    }\n    if (data.data && data.data.records) return data.data.records;\n    if (data.data && data.data.list) return data.data.list;\n    \n    return [];\n}\n\nif (baseUrl.includes(\"jj_signin\")) {\n    let decodedToken = java.base64Decode(JJtoken());\n    let timestamp = Date.now();\n    let enbody = timestamp + ':' + decodedToken;\n    let encodedEnbody = encode(enbody);\n    \n    let signUrl = \"https:\/\/app.jjwxc.org\/androidapi\/signin,{\\\"method\\\":\\\"POST\\\",\\\"body\\\":\\\"versionCode=313&sign=\" + encodedEnbody + \"\\\"}\";\n    \n    let signinResult = java.ajax(signUrl);\n    \n    let result = JSON.parse(signinResult);\n    let message = result.message || \"\u7b7e\u5230\u8bf7\u6c42\u5b8c\u6210\";\n    \n    let responseData = {\n        \"isSuccess\": result.code == \"200\",\n        \"errorMsg\": result.code == \"200\" ? \"success\" : \"fail\",\n        \"data\": [{\n            \"title\": message\n        }]\n    };\n    \n    JSON.stringify(responseData);\n} else if (baseUrl.includes(\"jjbookshelf\")) {\n    let token = JJtoken();\n    let jjUrl = baseUrl + token;\n    result = JSON.parse(java.ajax(jjUrl));\n    JSON.stringify(result);\n} else if (baseUrl.includes(\"type_style\")) {\n    let sortKey = getSortKey() || '';\n    let newUrl = baseUrl + sortKey;\n    result = JSON.parse(java.ajax(newUrl));\n    \n    let normalizedData = normalizeResponse(result);\n    JSON.stringify({data: normalizedData});\n} else if (baseUrl.endsWith(\"bookshelf\")) {\n    result = getShelf(\"bookshelf\/info\")\n} else if(\/read_history\/.test(baseUrl)) {\n    let pageMatch = baseUrl.match(\/page=(\\d+)\/);\n    let page = pageMatch ? pageMatch[1] : '1';\n    \n    let history_response = java.ajax(getServerHost() + \"\/read_history?session=\" + session + \"&page=\" + page)\n    let history_data = JSON.parse(history_response)\n    \n    if (history_data.data.data_list) {\n        let book_ids = history_data.data.data_list.map(item => item.book_id_str)\n        \n        let id_list = splitArray(book_ids, 200)\n        let urls = []\n        id_list.forEach(i => {\n            urls.push(\"https:\/\/api5-normal-sinfonlineb.fqnovel.com\/reading\/bookapi\/multi-detail\/v\/?aid=1967&iid=1&version_code=999&book_id=\" + i.join(\",\"))\n        })\n        \n        let resp = {book_info: []}\n        urls.forEach(url => {\n            let detailResponse = java.ajax(url)\n            let detailData = JSON.parse(detailResponse)\n            if (detailData.data) {\n                resp.book_info = resp.book_info.concat(detailData.data)\n            }\n        })\n        \n        result = resp\n    } else {\n        result = {book_info: []}\n    }\n} else if (baseUrl.includes(\"style_top\")) {\n    result = JSON.parse(result);\n} else {\n    let w = baseUrl.split(\"\/\")\n    if (baseUrl.includes(\"groupName\")) {\n        result = getByGroupName(w[w.length - 1])\n    } else if (baseUrl.includes(\"tab\")) {\n        result = getByTabIndex(parseInt(w[w.length - 1]))\n    } else {\n        result = JSON.parse(result)\n        if (result.data && result.data.data) {\n            result = {book_info: result.data.data}\n        }\n    }\n}\n\nif (!baseUrl.includes(\"jjbookshelf\") && !baseUrl.includes(\"type_style\") && !baseUrl.includes(\"jj_signin\")) {\n    let normalizedData = normalizeResponse(result);\n    JSON.stringify({data: normalizedData})\n}\n<\/js>\n$.data[*]","bookUrl":"<js>\nlet source = result.source;\nlet book_url = result.book_url;\nlet title = result.title || result.book_name || result.bookName;\nlet book_id = result.book_id || result.series_id || result.bookId;\n\nlet detail = {\n    source: source,\n    url: book_url,\n    name: title\n};\n\nif (book_id && \/^\\d{19}$\/.test(book_id)) {\n    detail.url = java.base64Encode(`https:\/\/api5-normal-sinfonlineb.fqnovel.com\/reading\/bookapi\/multi-detail\/v\/?aid=1967&iid=1&version_code=999&book_id=${book_id}`);\n    detail.source = \"\u756a\u8304\u5c0f\u8bf4\";\n} else if (book_url) {\n    detail.url = java.base64Encode(book_url);\n}\n\nlet yunurl = java.base64Encode(JSON.stringify(detail));\n`data:detailsUrl;base64,${yunurl},{\"type\":\"shushan\"}`;\n<\/js>","coverUrl":"$.audio_thumb_uri||$.thumb_url||$.thumbUri||$.cover","intro":"$.recommend_reason||$.abstract||$.desc","kind":"$.tags","lastChapter":"$.lastChapterTitle||$.last_chapter_title","name":"$.book_name||$.bookName||$.title","wordCount":"$.word_number||$.WordsCount"},"ruleSearch":{"author":"$.author","bookList":"$.data","bookUrl":"<js>\nlet source = result.source;\nlet book_url = result.book_url;\nlet title = result.title;\n\nlet detail = {\n    source: source,\n    url: book_url,\n    name: title\n};\n\nyunurl = java.base64Encode(JSON.stringify(detail));\n`data:detailsUrl;base64,${yunurl},{\"type\":\"shushan\"}`\n<\/js>","checkKeyWord":"\u6211\u5728\u7cbe\u795e\u75c5\u9662\u5b66\u65a9\u795e@\u756a\u8304\u5c0f\u8bf4","coverUrl":"$.cover","intro":"$.desc","kind":"$.tags","lastChapter":"{{$.source}}\u00b7{{$.latestChapterTitle}}","name":"$.title","wordCount":"$.wordCount"},"ruleToc":{"chapterList":"<js>\nlet res = JSON.parse(java.hexDecodeToString(result));\nlet catalog = {source: res.source, url: res.url, name: res.name, tab: res.tab || \"novel\"};\n\nshowTabTips(catalog);\n\nlet op = {method: \"POST\", body: catalog};\n\nlet catalogUrl = getServerHost() + `\/catalog,${JSON.stringify(op)}`;\nlet response = java.ajax(catalogUrl);\n\/\/ java.log(response);\n\nlet device = deviceType() ? 'android' : 'ios';\n\nif (device == 'android') {\n    var typeMap = {audio:32, comic:64};\n    book.type = catalog.tab in typeMap ? typeMap[catalog.tab] : 8;\n} else {\n    var typeMap = {audio:1, comic:2, video:3};\n    book.type = catalog.tab in typeMap ? typeMap[catalog.tab] : 0;\n}\n\nJSON.parse(response).data.map((x) => {\n    if (x.isVolume == true) {\n        x.url = \"\";\n        return x;\n    }\n    \n    x.url = buildChapterUrl(x, catalog, device);\n    return x;\n});\n<\/js>","chapterName":"title","chapterUrl":"url","isVip":"isVip","isVolume":"isVolume","updateTime":"tag"},"searchUrl":"<js>\nlet config = (() => {\n    try {\n        let cfg = JSON.parse(source.getVariable())[0] || {};\n        if (!cfg.host || !cfg.gender) {\n            cfg = {gender: \"boy\", host: getServerHost()};\n            source.setVariable(JSON.stringify([cfg]));\n            java.toast(\"\u914d\u7f6e\u521d\u59cb\u5316\u5b8c\u6210\");\n        }\n        return cfg;\n    } catch(e) {\n        let cfg = {gender: \"boy\", host: getServerHost()};\n        source.setVariable(JSON.stringify([cfg]));\n        return cfg;\n    }\n})();\n\nvar sourceVal = '';\nvar customSource = '';\n\ntry {\n    customSource = (source.getLoginInfoMap())['\u81ea\u5b9a\u4e49\u6e90\u7ad9'];\n} catch(e) {\n    customSource = '';\n}\n\nif (customSource !== undefined && customSource !== null && String(customSource).trim() !== \"\") {\n    sourceVal = String(customSource).trim();\n} else if (config.source) {\n    sourceVal = config.source;\n}\n\nvar param = sourceVal ? '&source=' + encodeURIComponent(sourceVal) : '';\nvar searchUrl = getServerHost() + '\/search?page={{page}}&key={{key}}' + param;\n\nif (key && key.length == 19 && !Number.isNaN(parseInt(key))) {\n    var u = `https:\/\/api5-normal-sinfonlineb.fqnovel.com\/reading\/bookapi\/multi-detail\/v\/?aid=1967&iid=1&version_code=999&book_id=${key}`;\n    var kdy = java.base64Encode(u);\n    var response = JSON.parse(java.ajax(u));\n    var nam = response.data.book_name || (response.data[0] && response.data[0].book_name) || '\u672a\u77e5\u4e66\u540d';\n    result = getServerHost() + `\/details?url=${kdy}&source=\u756a\u8304\u5c0f\u8bf4&name=${encodeURIComponent(nam)}`;\n} else {\n    result = searchUrl;\n}\n<\/js>","weight":0}]