Full picture load

Load all pictures for picture websites, and can also compress and package them for download.

As of 2023-10-22. See the latest version.

// ==UserScript==
// @name               圖片全載
// @name:en            Full picture load
// @name:zh-CN         图片全载
// @name:zh-TW         圖片全載
// @version            1.4.19
// @description        專注於寫真、H漫、漫畫的網站,目前規則數500+,進行圖片全量加載,也能進行下載壓縮打包,如有下一頁元素能做到自動化下載。
// @description:en     Load all pictures for picture websites, and can also compress and package them for download.
// @description:zh-CN  专注于写真、H漫、漫画的网站,目前规则数500+,进行图片全量加载,也能进行下载压缩打包,如有下一页元素能做到自动化下载。
// @description:zh-TW  專注於寫真、H漫、漫畫的網站,目前規則數500+,進行圖片全量加載,也能進行下載壓縮打包,如有下一頁元素能做到自動化下載。
// @author             tony0809
// @match              *://*/*
// @exclude            *hcaptcha*
// @exclude            *iframe*
// @exclude            *addthis*
// @exclude            *www.youtube.com*
// @exclude            *docs.google.com*
// @exclude            *google*/maps/*
// @exclude            *mail.google.com*
// @exclude            *video.ngamgaixinh.us*
// @exclude            *www.facebook.com/*/plugins/*
// @exclude            *18p.fun/ForInject/SetHistory/*
// @icon               data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAtFBMVEVEREAAAABEREBEREAuuaIzqpkvr58yiHgzhnY6kYM7mYI4kog4s6A2tpo0r544ooo2nY40sJw0sp00rZg1sJw0sZ0zsp01sZw0sZw0rZk1sJw1sZw1rZk0sp00rpk1sp01sZs1rpk1rpk0sp01spw1sJ00rZo1rZk1rpo0r5k0sJw0sZ01r5o0sZw0rpk0sp01sZ01sJw1spw1r5k1sp01sZw0sZ01sZw1rpk1sp01sZw1r5pUzpTcAAAAOXRSTlMAAAUGCw8QERIUFxgbHB0hIieqq6yvtLa3vb/AwMHCxMXFxsfIyc3Oz+zt7vDx8fL4+Pn5+vr7/v7AEFI4AAABR0lEQVR42qWT11bDMAxApbhsmm5KKVD2KiUQwpD1///FkZcSmh4e8FOsex3LsgymPy6ISkRyA4FlWMRXomIyQOg/SbyKAmSOE2Ip02UOYxf/DILNjOOEWLnAEAqio0MMAzJjTAZh1p0SrYCIuu0cMZc9JbENXLa1NWGdI1nWeQuXGPzBTdzC8ws52UI5MwchrA/VTOuTEP9fFyTG7E+R9q8JLsbW1UHzU8HHrCuU1fyToDlB43xRqMUgfc+/KA77fZrWSH/47zPlzOcpJxG8u32r/OEg5SRCqO/WTeT3+5oTuP4LxrXnd5F7waZ+wM5c+NVeujMRrDYMYueE+VK5E5r3uzOb7TbvHH7f/1pP/L8nU9u38Nwyy8OZdjfwY+ZnmPinp28y3mglNeERDJYy/9A3GYVS+GMPMB+uyL67/qO68Mb8MurBD7foVTtvIbtnAAAAAElFTkSuQmCC
// @license            MIT
// @namespace          https://greasyfork.org/users/20361
// @grant              GM_xmlhttpRequest
// @grant              GM.xmlHttpRequest
// @grant              GM_registerMenuCommand
// @grant              GM.registerMenuCommand
// @grant              unsafeWindow
// @require            https://cdn.jsdelivr.net/npm/[email protected]/dist/jszip.min.js
// @require            https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js
// @require            https://cdn.jsdelivr.net/npm/[email protected]/dist/html2canvas.min.js
// @require            https://cdn.jsdelivr.net/npm/@fancyapps/[email protected]/dist/jquery.fancybox.min.js
// ==/UserScript==

(async () => {
    "use strict";
    let options = { //預設選項基本上不要改動,如果改動了最好透過UI選項設定或按/,重置儲存在localStorage的設定
        enable: 0, //!!!維持0不要改!!!
        icon: 1, //是否顯示左下圖示0關1開
        threading: 32, //最大下載線程數
        default: "img[src]", //預設CSS/Xpath選擇器/javascript代碼
        //default: "js;return [...document.images];",
        zip: true, //true圖片下載後壓縮打包,false批量下載圖片,無法全自動下載
        file_extension: "zip", //zip or cbz
        autoDownload: 0, //!!!維持0不要改!!!建議透過UI選項設定來開啟,需要customData也有autoDownload
        autoDownloadCountdown: 5, //有有效的NEXT時自動下載的倒數秒數
        comic: 0, //1,忽視漫畫站點開關選項,啟用漫畫規則
        doubleTouchNext: true, //true開啟false關閉,觸控裝置雙擊前往下一頁
        zoom: 0, //1 ~ 10 腳本插入的圖片縮放比例,10 = 100%,9 = 90%,0 = auto
        column: 4 //圖片並排顯示的數量2、3、4、5
    };
    const getOptionsData = localStorage.getItem("FullPictureLoadOptions");
    if (getOptionsData === null && options.autoDownload !== 1) {
        let jsonStr = JSON.stringify(options);
        localStorage.setItem("FullPictureLoadOptions", jsonStr);
    } else if (options.autoDownload !== 1) {
        let optionsJson = JSON.parse(getOptionsData);
        options = optionsJson;
        console.log("Full Picture Load Options Json\n", optionsJson);
    }

    const siteUrl = window.location.href;
    let siteData = {};
    let siteJson = null;
    const language = window.navigator.language;
    let displayLanguage = {};
    let globalImgArray = [];
    let promiseBlobArray = [];
    let customTitle = null;
    let downloading = false;
    let fetching = false;
    let fastDownload = false;
    let currentDownloadThread = 0;
    let downloadNum = 0;
    let errorNum = 0;
    let doc = document;
    let autoPager = true;
    let currentPageNum = 0;
    let nextLink = null;
    const PcUa = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.43";
    const MobileUa = "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Mobile Safari/537.36";
    const loading_bak = "data:image/gif;base64,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83uGje9+g7TK7znAs/1N/3BQTmbMt6lvwRde10/Xu89+ZrjEJ07xilv84hjPuMY3zvGOe/zjIA+5yEdO8pKb/OQoT7nKV87ylrv85TCPucxnTvOa2/zmOM+5znfO8577/OdAD7rQh070ohv96EhPutKXzvSmO/3pUI+61KdO9apb/epYz7rWt871rnv962APu9jHTvaym/3saE+72tfO9ra7/e1wj7vc5073utv97njPu973zve++/3vgA+84AdP+MIb/vCIT7ziF8/4xjv+8ZCPvOQnT/nKW/7ymM+85jfP+c57/vOgD73oR0/60pv+9KhPvepXz/rWu/71sI+97GdP+9rb/va4z73ud8/73pH7/vfAD77wh0/84hv/+MhPvvKXz/zmO//50I++9KdP/epb//rYz772t8/97nv/++APv/jHT/7ym//86E+/+tfP/va7//3wj7/850//+tv//vjPv/73z//++///ABiAAjiABFiABniACJiACriADNiADviAEBiBEjiBFFiBFniBGJiBGriBHNiBHviBIBiCFxEIACH5BAUKAGgALCwBjAACATABAAf/gGiCg4SFhoeIiYqLjI2JAQYGHhgaEC8FHBQfOhaOnp+goaKjpKWmp6iKAausra0GNDEUJ52ptre4ubq7vGiuv8CrGCksG2e9yMnKy8yOwc/ABjgsHc3W19jZo9DcwCsiJ9ri4+TW3ee/IyI65e3u76Xo8q4YLtXw+Pn6gvP9rS8Dju0bSBCbv4PCKCwoyLAhL4QQDXCQ4LCixXgQIT6YeLGjx0UZQz7wUeujyY8hUxpQwOCkS4spY6748LJmwZg4SdyzyfMdTpwPXLTsSXTcz58oMhRdavAozgY+hjKdiszpURoIqGrdlaJECRIQNHhoYBXhAyBb0yKTkOGDghgQ/wyURRdDqtq7vDp8EEGD7NxgNC7gHYxsgQwRK/7+8mCDsONeHShAUMyqAYjHmHd1UJCYso/MoHOdKPBAcQm7oVOXsrDDw18SC1XLLsUABIa5EErO3g2q9m2rKCjyHv6JAQXXTjUIJ86ckQQYfpHqbk790IbJRyHErs690BkKpX/mQN29+wUSR1OUXz/ojILoKTmwn5+hc0wW89lbwPG0cf71O8AHkQc7/cfdAOGFhMJ2BlaXwQgxFdBgeR3YlxFaE+pTQgExiLADCwNkwKA1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";
    const mh_loading_bak = "data:image/png;base64,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";
    const autoPagerLoading = "data:image/gif;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
    //自定義站點規則
    const customData = [{
        name: "小黃書/8色人體攝影 xchina.co xchina.biz xchina.fun 8se.me", //按數字鍵1、Enter插入圖片(手動模式),按0、Enter、Enter壓縮打包下載
        enable: 0, //0此規則禁用 1啟用
        reg: /(xchina|8se)\.(co|me|biz|fun)\/photo\/id-\w+\.html/, //網址正則匹配
        include: ".photos>a",
        imgs: () => {
            let numP = fun.geT("//i[@class='fa fa-picture-o']/parent::div").match(/\d+/)[0];
            let max = Math.ceil(numP / 19);
            return fun.getImg("img.cr_only", max, 2, ["_600x0", ""]); //xhr併發請求抓取所有頁面的圖片元素
        },
        insertImg: ["//div[div[@class='photos']]", 1], //清空元素內容把所有圖片插入到此元素 0手動插入模式 1自動插入模式 2自動插入Lazyloading模式
        customTitle: () => { //js代碼自訂壓縮檔和資料夾名稱
            let s = document.title.split("-");
            let title = "";
            if (/未分/.test(s[1])) {
                title += s[0].trim()
            } else {
                title += s[1].trim() + " - ";
                title += s[0].trim()
            }
            return title;
        },
        css: "body{overflow:unset!important}.photos>div.item,.jquery-modal.blocker.current,.push-top,.push-bottom,.slider-ad,.article.ad,.pager>.tips,body>footer~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(a):not(.fancybox-container),.photoMask,.banner_ad{display: none!important;}",
        category: "nsfw2"
    }, {
        name: "小黃書/8色人體攝影 xchina.co xchina.biz xchina.fun 8se.me", //xhr翻頁模式,翻完所有預覽圖後,立刻在預覽縮圖下面插入全部大圖
        enable: 0,
        reg: /(xchina|8se)\.(co|me|biz|fun)\/photo\/id-\w+\.html/,
        include: ".photos>a",
        imgs: async () => {
            await fun.getNP(".photos>a", ".pager a[current=true]+a:not(.next)", null, ".pager"); //xhr翻頁模式聚集所有預覽圖
            return [...fun.gae(".cr_only")].map(e => e.src.replace("_600x0", ""));
        },
        //insertImg: ["//div[div[@class='photos']]", 1],
        insertImg: [
            ["//div[div[@class='photos']]/*[last()]", 2], 2
        ],
        go: 1,
        customTitle: "let s=document.title.split('-');let title='';if(/未分/.test(s[1])){title+=s[0].trim()}else{title+=s[1].trim()+' - ';title+=s[0].trim()}return title;",
        css: "body{overflow:unset!important}.photos>div.item,.jquery-modal.blocker.current,.push-top,.push-bottom,.slider-ad,.article.ad,.pager>.tips,body>footer~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(a):not(.fancybox-container),.photoMask,.banner_ad{display: none!important;}",
        category: "nsfw2"
    }, {
        name: "小黃書/8色人體攝影 xchina.co xchina.biz 8se.me", //xhr翻頁模式,聚集所有預覽圖,手動插入全部大圖,圖片量是幾百張的比較不會卡,不插大圖也能下載
        enable: 0,
        reg: /(xchina|8se)\.(co|me|biz|fun)\/photo\/id-\w+\.html/,
        include: ".photos>a",
        init: async () => {
            await fun.getNP(".photos>a", ".pager a[current=true]+a:not(.next)", null, ".pager");
        },
        imgs: () => [...fun.gae("img.cr_only")].map(e => e.src.replace("_600x0", "")),
        insertImg: ["//div[div[@class='photos']]", 0],
        customTitle: "let s=document.title.split('-');let title='';if(/未分/.test(s[1])){title+=s[0].trim()}else{title+=s[1].trim()+' - ';title+=s[0].trim()}return title;",
        css: "body{overflow:unset!important}.photos>div.item,.jquery-modal.blocker.current,.push-top,.push-bottom,.slider-ad,.article.ad,.pager>.tips,body>footer~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(a):not(.fancybox-container),.photoMask,.banner_ad{display: none!important;}",
        category: "nsfw2"
    }, {
        name: "小黃書/8色人體攝影 xchina.co xchina.biz xchina.fun 8se.me",
        enable: 1,
        reg: /(xchina|8se)\.(co|me|biz|fun)\/photo\/id-\w+\.html/,
        include: ".photos>a",
        imgs: async () => {
            let numP = fun.geT("//i[@class='fa fa-picture-o']/parent::div").match(/\d+/)[0];
            let max = Math.ceil(numP / 19);
            if (max > 1 && [...fun.gae(".photos>a")].length < 20) {
                let links = [];
                let url = location.href.replace(".html", "");
                for (let i = 2; i <= max; i++) {
                    links.push(url + "/" + i + ".html");
                }
                await fun.getEle(links, ".photos>a", [".photos", 0], ".pager,.photos>.item,.photos>.photoMask");
            }
            return [...fun.gae("img.cr_only")].map(e => e.src.replace("_600x0", ""));
        },
        button: [4],
        insertImg: [
            ["//div[div[@class='photos']]/*[last()]", 2], 2
        ],
        go: 1,
        customTitle: "let s=document.title.split('-');let title='';if(/未分/.test(s[1])){title+=s[0].trim()}else{title+=s[1].trim()+' - ';title+=s[0].trim()}return title;",
        css: "body{overflow:unset!important}.photos>div.item,.jquery-modal.blocker.current,.push-top,.push-bottom,.slider-ad,.article.ad,.pager>.tips,body>footer~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(a):not(.fancybox-container),.photoMask,.banner_ad{display: none!important;}",
        topButton: true,
        category: "nsfw2"
    }, {
        name: "JavSX.com https://w3.javsx.com/photos.html",
        reg: /w3\.javsx\.com\/photos\/[\w-]+\.html$/,
        imgs: async () => {
            try {
                let max = fun.ge("//a[text()='Last']").href.match(/\d+$/)[0];
                let links = [];
                for (let i = 2; i <= max; i++) {
                    links.push(location.href + "?page=" + i);
                }
                await fun.getEle(links, ".col-photos>a", [".col-photos", 0], ".pagination");
                fun.gae("img[data-src]").forEach(e => {
                    e.src = e.dataset.src;
                });
            } catch (e) {}
            //await fun.getNP(".col-photos>a", ".PageNav>a[style]+a", null, ".PageNav");
            return [...fun.gae("img[data-src]")].map(e => e.dataset.src.replace(/resize=[^&]+&/, ""));
        },
        button: [4],
        insertImg: [
            [".col-photos", 2], 2
        ],
        go: 1,
        customTitle: () => fun.geT("h1.title").replace("| Body Photography", "").replace("- JVID", "").replace("- 未分类人体摄影", "").trim(),
        css: ".col-photos{margin-bottom:60px}.pagination{margin-top:0px!important}",
        category: "nsfw2"
    }, {
        name: "Nlegs/HoneyLeg www.nlegs.com www.honeyleg.com", //無法完全應對此站的人機驗證,請使用專用腳本 https://greasyfork.org/scripts/463123
        enable: 0,
        reg: /(www\.nlegs\.com|www.honeyleg.com)\/(girls|article)\//,
        init: () => {
            let loopFind = setInterval(() => {
                fun.ge(".pagination>li:last-child>a") && (clearInterval(loopFind), fun.getNP("//div[a/div[contains(@style,'thumb') and span]]", "li.active+li>a", null, ".pagination"))
            }, 100);
        },
        imgs: "js;return fun.getImgA('.img-res','a[href*=image]',1);",
        insertImg: ["//div[div[@class='col-md-2 col-sm-4 col-xs-12']]", 0],
        customTitle: () => fun.geT("strong"),
        threading: 1,
        fetch: 1,
        //css: ".col-md-2.col-sm-4.col-xs-12{width:1000px!important;height:auto!important;display:block!important;margin:0 auto !important;float: none!important;}",
        category: "nsfw2"
    }, {
        name: "雅拉伊 www.yalayi.com 免VIP僅支援圖片簡單命名數字遞增的。",
        reg: /https?:\/\/www\.yalayi\.com\/gallery\/\d+\.html/i,
        imgs: async () => {
            await fun.waitEle(".bigimg>img");
            let max = fun.ge(".tishiwenzi-box").innerText.match(/\d+/)[0];
            let firstImg = fun.ge(".bigimg>img");
            let path = firstImg.dataset.original.match(/.+\//)[0];
            let testArr = [path + "1.jpg", path + "01.jpg", path + "001.jpg", path + "0001.jpg"];
            let ok = false;
            let padStart;
            for (let i in testArr) {
                let obj = await fun.checkImgStatus(testArr[i]);
                console.log(`確認圖片[${i}]`, obj);
                if (obj.ok) {
                    ok = true;
                    padStart = parseInt(i) + 1;
                    break;
                }
            }
            let arr = [];
            if (ok) {
                arr.push(firstImg.src);
                for (let i = 1; i <= max; i++) {
                    let src = path + String(i).padStart(padStart, "0") + ".jpg";
                    arr.push(src);
                }
                return arr;
            } else {
                return arr;
            }
        },
        button: [4, "24%", 4],
        insertImg: [".bigimg", 2],
        customTitle: () => fun.title(" - ", 3),
        threading: 4,
        category: "nsfw1"
    }, {
        name: "JKF www.jkforum.net",
        reg: /www\.jkforum\.net\/thread/,
        imgs: "img[id^=aimg]",
        customTitle: () => fun.title("-", 1),
        category: "nsfw2"
    }, {
        name: "草榴 www.t66y.com cl.6962x.xyz",
        reg: /\/htm_data\/\d+\/\d+\/\d+\.html/,
        include: "img[ess-data]",
        imgs: "img[ess-data]",
        customTitle: () => fun.geT("h4.f16").replace(/\[\d+P\]$/i, ""),
        category: "nsfw2"
    }, {
        name: "X成人论坛 xbbs.me",
        reg: /xbbs\.me\/thread\/id-\w+\.html$/,
        imgs: () => [...fun.gae(".xbbs-thread-image img[data]")].map(e => e.getAttribute("data")),
        customTitle: () => fun.geT(".article>h1").trim(),
        category: "nsfw2"
    }, {
        name: "驲哔么 ribi.me",
        reg: /ribi\.me\/text\/\d+\/1$/,
        imgs: ".img-fluid",
        button: [4],
        insertImg: [".container", 1],
        customTitle: () => fun.attr(".img-fluid", "alt").replace(/\[福利COS\]\s?/, ""),
        category: "nsfw1"
    }, {
        name: "优丝库HD - 免VIP yskhd.com ysk567.com",
        reg: /(yskhd\.com|ysk567\.com)\/archives\/\d+/i,
        exclude: "#menu-item-57917[class*=current]",
        imgs: () => [...fun.gae(".article-content img[src*='-285x285']")].map(e => e.src.replace("-285x285", "")),
        button: [4],
        insertImg: [
            [".article-act", 1], 2
        ],
        go: 1,
        autoDownload: [0],
        next: ".article-nav-prev>a",
        prev: ".article-nav-next>a",
        customTitle: () => fun.geT(".article-title").replace(/\s?\[\d+P\]/i, ""),
        category: "nsfw1"
    }, {
        name: "优丝库HD - 日韓免VIP yskhd.com ysk567.com",
        reg: /(yskhd\.com|ysk567\.com)\/archives\/\d+/i,
        include: "#menu-item-57917[class*=current]",
        imgs: () => [...fun.gae(".article-content img[src*='-285x285']")].map(e => e.src.replace("-285x285", "")),
        button: [4],
        insertImg: [
            [".article-act", 1], 2
        ],
        go: 1,
        autoDownload: [0],
        next: ".article-nav-prev>a",
        prev: ".article-nav-next>a",
        customTitle: () => fun.geT(".article-title").replace(/\s?\[\d+P\]/i, ""),
        category: "nsfw1"
    }, {
        name: "洛花秀 免VIP luohuaxiu.com",
        reg: /luohuaxiu\.com\/archives\/\d+/,
        exclude: ".single-video",
        init: () => {
            new MutationObserver(() => {
                document.body.classList.remove("compensate-for-scrollbar");
            }).observe(document.body, {
                childList: true,
                subtree: true
            });
        },
        imgs: () => {
            let arr = [];
            let max = fun.gae(".gallery-item").length;
            let url = fun.ge(".gallery-item a").href;
            let m = url.match(/^(.+\/)([\w-]+)(\.[a-z]{3,4})$/i);
            let path;
            try {
                path = m[1];
            } catch (e) {
                try {
                    if (/\(\d+\)\./.test(url)) {
                        let m = url.match(/^(.+\()(\d+)(\)\.[a-z]{3,4})$/i);
                        for (let i = 1; i <= max; i++) {
                            arr.push(decodeURI(m[1] + i + m[3]));
                        }
                    }
                    return arr;
                } catch (e) {
                    return arr;
                }
            }
            let fileName = m[2];
            let ex = m[3];
            let blur = fun.ge(".gallery-blur-item");
            if (blur && fileName.length <= 4) {
                let n = url.match(/(\d+)\.[a-z]{3,4}$/)[1];
                for (let i = parseInt(n); i < (parseInt(n) + parseInt(max)); i++) {
                    arr.push(decodeURI(path + String(i).padStart(fileName.length, "0") + ex));
                }
            } else if (blur && fun.ge(".size-thumbnail[src*='-285x180']")) {
                arr = [...fun.gae(".size-thumbnail[src*='-285x180']")].map(e => e.src.replace("-285x180", ""));
            } else if (blur && fun.ge("img[src*='?width=285']")) {
                arr = [...fun.gae("img[src*='?width=285']")].map(e => decodeURI(e.src.replace(/\?width=285.+/, "")));
            } else if (blur) {
                return arr;
            } else {
                arr = [...fun.gae(".gallery-item a")].map(e => e.href);
            }
            return arr;
        },
        button: [4],
        insertImg: [
            [".article-shares", 2], 2
        ],
        go: 1,
        autoDownload: [0],
        next: ".article-nav-prev a",
        prev: ".article-nav-next a",
        customTitle: () => fun.geT(".article-title"),
        category: "nsfw1"
    }, {
        name: "24FA https://www.24fa.com/c49.aspx",
        reg: /(www\.)?\d{2,3}(m|w|faw|fa|aa)?\.[a-z]{2,4}\/m?n\w+\.aspx/,
        init: "document.onkeydown=null",
        imgs: () => fun.getImgA("#content img", ".pager a:not([title])"),
        button: [4],
        insertImg: ["#content", 1],
        autoDownload: [0],
        next: ".prevNews>a",
        prev: ".nextNews>a",
        customTitle: () => fun.geT("h1"),
        css: "body>section[id],#footer~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(.fancybox-container){display:none!important}",
        category: "nsfw2"
    }, {
        name: "Hit-x-Hot www.hitxhot.org www.depvailon.com pic.yailay.com nungvl.net www.kaizty.com lootiu.com",
        reg: /(www\.hitxhot\.org|pic\.yailay\.com|www\.kaizty\.com)\/(gallerys|articles|photos)\/(?!\?page=|\?m=|hot|top|tag)\w+\.html$|www\.depvailon\.com\/(?!\?page=|\?m=).+\.html$|nungvl\.net\/gallerys\/\d+\.cg$|lootiu\.com\/gallery\/.+\.cfg$/i,
        imgs: () => {
            let max;
            try {
                max = fun.geT("h1,h2").match(/\d+$/)[0];
            } catch (e) {
                max = 1;
            }
            return fun.getImg(".contentme img,.contentme2 img", max);
        },
        button: [4],
        insertImg: [".contentme,.contentme2", 2],
        customTitle: () => document.title.split("|")[0].slice(10).trim(),
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "nsfw2"
    }, {
        name: "Hit-x-HotM www.hitxhot.org www.depvailon.com pic.yailay.com nungvl.net www.kaizty.com lootiu.com",
        reg: /(www\.hitxhot\.org|pic\.yailay\.com|www\.kaizty\.com)\/(gallerys|articles|photos)\/(?!\?page=|\?m=|hot|top|tag)\w+\.html\?m=1$|www\.depvailon\.com\/(?!\?page=|\?m=).+\.html\?m=1$|nungvl\.net\/gallerys\/\d+\.cg\?m=1$|lootiu\.com\/gallery\/.+\.cfg\?m=1$/i,
        imgs: () => {
            let max;
            try {
                max = fun.geT("h1,h2").match(/\d+$/)[0];
            } catch (e) {
                max = 1;
            }
            return fun.getImg(".contentme img,.contentme2 img", max, "8");
        },
        button: [4],
        insertImg: [".contentme,.contentme2", 1],
        customTitle: () => document.title.split("|")[0].slice(10).trim(),
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "nsfw2"
    }, {
        name: "TGStat Show more",
        icon: 0,
        key: 0,
        reg: /^https:\/\/([a-z]{2}\.)?tgstat\.com\//,
        observerClick: "//button[contains(text(),'Show more')]",
        category: "nsfw2"
    }, {
        name: "Telegram Web",
        reg: /^https:\/\/telegra\.ph\/.+/,
        imgs: ".figure_wrapper img",
        customTitle: () => fun.geT("h1"),
        category: "nsfw2"
    }, {
        name: "新闻吧 https://www.xinwenba.net/web/meinv/ m.xwbar.com",
        reg: /(www\.xinwenba\.net|m\.xwbar\.com)\/plus\/view-\d+-\d+\.html/,
        imgs: () => {
            let max;
            try {
                max = fun.geT(".paging>li>a").match(/\d+/)[0];
            } catch (e) {
                max = 1;
            }
            return fun.getImg(".main img", max, "5");
        },
        button: [4],
        insertImg: [".view_img", 1],
        autoDownload: [0],
        next: ".pre_next li:first-child a",
        prev: ".pre_next li:last-child a",
        customTitle: () => fun.geT(".title>h1"),
        category: "nsfw1"
    }, {
        name: "留园酷 https://www.cool18.com/",
        reg: /(www\.cool18\.com\/bbs\d*\/index\.php\?app=forum&act=threadview&tid=\d+|wap\.cool18\.com\/index\.php\?app=index&act=view&cid=\d+)/,
        imgs: "img[mydatasrc],#shownewsc img,.show_content img",
        customTitle: () => fun.geT(".show_content b,h1.article-tit").replace(/(\s?\.?)?\s?\(\d+P\)\s?/i, ""),
        css: ".img_ad_list{display:none!important}",
        category: "nsfw2"
    }, {
        name: "ACG 资源网 meituzyw.com",
        reg: /meituzyw\.com\/\d+\.html/i,
        exclude: ".ri-hide-warp",
        imgs: "img[data-lazy-src],.content-wrapper img",
        button: [4],
        insertImg: ["//p[img]", 2],
        autoDownload: [0],
        next: "a.entry-page-prev",
        prev: "a.entry-page-next",
        customTitle: () => fun.geT(".post-title,.entry-title").replace(/\[\d+p\]/i, "").trim(),
        category: "nsfw1"
    }, {
        name: "秀人集 www.xr02.xyz",
        reg: /www\.(xiuren\d+|xr\d+)\.\w+\/\w+\/\d+\.html/i,
        imgs: () => fun.getImg('.content>p img[alt]', fun.geT(".page a:last-child", 2), 3),
        button: [4],
        insertImg: ["//div[p[img[@alt and @title]]]", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'下一篇')]/a[contains(@href,'html')]",
        prev: "//span[contains(text(),'上一篇')]/a[contains(@href,'html')]",
        customTitle: () => fun.geT(".item_title>h1"),
        //threading: 4,
        css: ".content br{display:none!important}",
        category: "nsfw1"
    }, {
        name: "秀人美女網 www.xrmnw.xyz www.xrmn01.vip www.xrmn03.cc",
        reg: /(www\.xrmnw\.\w+|www.xrmn\d+.\w+)\/\w+\/\d+\/\d+\.html/i,
        imgs: () => fun.getImg('.content p img[alt]', fun.geT(".page a:last-child", 2), 3),
        button: [4],
        insertImg: ["//div[p[img[@alt]]]", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'下一篇')]/a[contains(@href,'html')]",
        prev: "//span[contains(text(),'上一篇')]/a[contains(@href,'html')]",
        customTitle: () => fun.geT(".item_title>h1").replace(/\d+P$/i, ""),
        //threading: 4,
        css: ".item_title>a,.content br,.bottom_fixed,body>div[id]:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(.fancybox-container){display:none!important}",
        category: "nsfw1"
    }, {
        name: "爱美女网 www.imn5.net www.imn5.cc",
        reg: /www\.imn5\.\w+\/\w+\/\w+\/\d+\.html/i,
        imgs: () => fun.getImg('.imgwebp p img[alt]', fun.geT(".page a:last-child", 2), 3),
        button: [4],
        insertImg: ["//div[p[img[@alt]]]", 2],
        autoDownload: [0],
        next: "//span/b[contains(text(),'下一篇')]/a[contains(@href,'html')]",
        prev: "//span/b[contains(text(),'上一篇')]/a[contains(@href,'html')]",
        customTitle: () => fun.geT(".focusbox h1+div").replace(/\d+P$/i, ""),
        //threading: 4,
        css: ".imgwebp br,img[src*='zz2.gif']{display:none!important}",
        category: "nsfw1"
    }, {
        name: "美人图 meirentu.cc",
        reg: /meirentu\.\w+\/pic\/\d+\.html/i,
        imgs: () => fun.getImg('.content_left img[alt]', fun.geT(".page a:last-child", 2), 5),
        button: [4],
        insertImg: [".content_left", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'下一篇')]/a[contains(@href,'html')]",
        prev: "//span[contains(text(),'上一篇')]/a[contains(@href,'html')]",
        customTitle: () => fun.geT(".item_title>h1").replace(/\d+P$/i, ""),
        //threading: 4,
        css: "img[alt]~br{display:none!important}",
        category: "nsfw1"
    }, {
        name: "极品性感美女 www.xgyw.pro",
        reg: /www\.xg\w+\.\w+\/\w+\/\w+\.html/i,
        include: "//div[@class='toptip']/a[text()='极品性感美女']",
        imgs: () => fun.getImg('.article-content img[alt]', fun.geT("a.current~*:last-child", 2), 3),
        button: [4, "22%"],
        insertImg: ["//p[img[@alt]]", 2],
        autoDownload: [0],
        next: ".article-nav-next>a[href$=html]",
        prev: ".article-nav-prev>a[href$=html]",
        customTitle: () => fun.geT(".article-title").replace(/\d+p$/i, ""),
        //threading: 4,
        css: ".article-header>a,.article-content br,img[src*='zz1.gif'],.bottom_fixed,.article-content~a,#bottom-banner,.content>div[id]{display:none!important}",
        category: "nsfw1"
    }, {
        name: "爱看美女网 www.ikmn03.cc",
        reg: /www\.ikmn(\d+)?\.\w+\/\w+\/\d+\.html/i,
        include: ".info-pagebar>a",
        imgs: () => fun.getImg('.info-imtg-box img[alt]', fun.geT(".pagebar>*:last-child", 2), 3),
        button: [4],
        insertImg: ["//p[img[@alt]]", 2],
        autoDownload: [0],
        next: ".info-next li:last-child a",
        prev: ".info-next li:first-child a",
        customTitle: () => fun.geT("h1").replace(/\d+p$/i, ""),
        //threading: 4,
        category: "nsfw1"
    }, {
        name: "美女秀 www.22mm.net",
        reg: /www\.22mm\.net\/a\/\w+\.html$/i,
        imgs: () => fun.getImg(".content img", fun.ge(".page>li:last-child>a").href.match(/_(\d+)/)[1], 9),
        button: [4],
        insertImg: [".content", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'上一篇')]/a",
        prev: "//span[contains(text(),'下一篇')]/a",
        customTitle: () => fun.geT(".item_title>h1"),
        css: "union,.update_area_lists>li:nth-child(n+3):nth-child(-n+4){display:none!important}",
        category: "nsfw1"
    }, {
        name: "卡卡美女网 www.kaka234.cc m.kaka234.cc",
        reg: /https?:\/\/(www|m)\.kaka234\.cc\/HTM\/pic\/\w+\/\d+\/\d+\/\d+\.html/i,
        init: () => {
            let ele = fun.ge(".PsBox");
            if (ele) {
                let eleParent = ele.parentNode;
                eleParent.parentNode.insertBefore(ele.cloneNode(true), eleParent);
            }
        },
        imgs: () => {
            let max;
            try {
                max = fun.geT(".dede_pages li>a,.article_page li>a").match(/\d+/)[0];
            } catch (e) {
                max = 1;
            }
            return fun.getImg(".content img,.ArticleImageBox img", max, 9);
        },
        button: [4],
        insertImg: ["//div[@class='content'] | //div[div[@class='ArticleImageBox']]", 2],
        autoDownload: [0],
        next: () => {
            let next = fun.ge("//li[contains(text(),'上一篇')]/a");
            if (next) {
                return next.href;
            } else {
                return null;
            }
        },
        prev: 1,
        customTitle: () => fun.geT(".Title>h1,.PsBox"),
        css: ".m_adv{display:none!important}",
        category: "nsfw1"
    }, {
        name: "福利图 fulitu.me",
        reg: /fulitu\.me\/pic\/\d+\.html/i,
        imgs: () => fun.getImg(".content_left img", fun.geT("//a[text()='下页']", 2), 5),
        button: [4],
        insertImg: [".content_left", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'下一篇')]/a",
        prev: "//span[contains(text(),'上一篇')]/a",
        customTitle: () => fun.geT(".item_title>h1").replace(/\d+P$/i, "").trim(),
        css: ".content br{display:none!important}",
        category: "nsfw1"
    }, {
        name: "爱图门 aitu.men 佼人馆 jaoren.com",
        reg: /^https:\/\/(aitu\.men|jaoren\.com)\/[^\/]+\/\d+\.html/i,
        imgs: async () => {
            await fun.getNP(".context img", ".pagelist span+a", null, ".pagelist", 0, null, 0);
            return [...fun.gae(".context img")];
        },
        button: [4],
        insertImg: [".context", 1],
        autoDownload: [0],
        next: ".post-previous a",
        prev: ".post-next a",
        customTitle: () => fun.geT("#content h1"),
        category: "nsfw1"
    }, {
        name: "女神排行榜 nsphb.com",
        reg: /^https:\/\/nsphb\.com\/\w+\/\d+\.html/i,
        imgs: () => fun.getImgA(".article-content img", ".post-nav-links a"),
        button: [4],
        insertImg: [".article-content", 2],
        autoDownload: [0],
        next: "//a[p[text()='上一篇'] and not(starts-with(@href,'java'))]",
        prev: "//a[p[text()='下一篇'] and not(starts-with(@href,'java'))]",
        customTitle: () => fun.geT(".article-title>a").replace(/\d+p/i, ""),
        category: "nsfw1"
    }, {
        name: "Hotgirl.biz",
        reg: /^https:\/\/hotgirl\.biz\/[^\/]+\/$/i,
        imgs: ".entry-content img",
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: () => fun.geT(".entry-title"),
        category: "nsfw1"
    }, {
        name: "XLUST.ORG",
        reg: /^https:\/\/xlust\.org\/[^\/]+\/$/i,
        imgs: ".rl-gallery-item a",
        button: [4],
        insertImg: [
            [".rl-gallery", 2], 2
        ],
        go: 1,
        customTitle: () => fun.geT(".entry-title").replace(/\([\d\s]+pics\)\s?/, ""),
        category: "nsfw1"
    }, {
        name: "秀人网 xiurenwang.me",
        reg: /^https:\/\/xiurenwang\.me\/photo\.php\?id=\w+/i,
        imgs: () => [...fun.gae(".intro>img")].map(e => e.src.replace("_600x0", "")),
        button: [4],
        insertImg: [".intro", 2],
        customTitle: () => fun.geT("h1").replace(/\(\d+P\)/i, "").trim(),
        css: "@media only screen and (max-width:640px){.paragraph .intro img{width:100%!important}}",
        category: "nsfw1"
    }, {
        name: "秀人图 www.xiurenugril.com",
        reg: /^https:\/\/www\.xiurenugril\.com\/\d+\.html/i,
        exclude: "//button[contains(text(),'登录购买')]",
        imgs: () => fun.getImgA("a[data-fancybox],.entry-content img", [...new Set([...fun.gae(".fenye a")].map(a => a.href))]),
        button: [4],
        insertImg: [".entry-content", 2],
        autoDownload: [0],
        next: ".article-nav-prev a",
        prev: ".article-nav-next a",
        customTitle: () => fun.geT(".entry-title").replace(/\d+p/i, "").trim(),
        category: "nsfw1"
    }, {
        name: "微密猫 wememiao.com weme.su weme2.com",
        reg: /(wememiao\.com|weme\.su|weme2\.com)\/archives\/\d+/i,
        imgs: "a[data-fancybox]",
        button: [4],
        insertImg: [
            [".single-content .article-tags", 2], 2
        ],
        autoDownload: [0],
        next: ".article-nav-prev a",
        prev: ".article-nav-next a",
        customTitle: () => fun.geT(".article-title").replace(/\[[0-9a-z-\.\s]+\]/i, "").trim(),
        go: 1,
        category: "nsfw1"
    }, {
        name: "优美图录 umei.net",
        reg: /umei\.net\/\w+\/\d+\.html/i,
        imgs: () => fun.getImg(".image_div img", fun.geT(".item_info span"), 9),
        button: [4],
        insertImg: [".image_div", 2],
        customTitle: () => fun.geT(".item_title>h1"),
        css: ".content_left img{cursor:unset}.affs,.xg_content>li:nth-child(n+1):nth-child(-n+2){display:none!important}",
        category: "nsfw1"
    }, {
        name: "秀人图集 xiuren0.com",
        reg: /xiuren\d\.com\/\d+\.html/i,
        include: ".article-paging>*:last-child",
        init: () => {
            fun.remove("//p[img[@decoding and not(contains(@src,'/pic/'))]]");
        },
        imgs: () => fun.getImg(".article-content img:not([src*='/pic/'])", fun.geT(".article-paging>*:last-child"), "4"),
        button: [4],
        insertImg: [
            [".article-paging", 1], 1
        ],
        next: ".article-nav-prev>a",
        prev: 1,
        customTitle: () => fun.geT(".article-title"),
        css: ".modown-ad{display:none!important}",
        category: "nsfw1"
    }, {
        name: "秀人图集 xiuren0.com",
        reg: /xiuren\d\.com\/\d+\.html/i,
        imgs: ".article-content img:not([src*='p.xiurenb.top'])",
        next: ".article-nav-prev>a",
        prev: 1,
        customTitle: () => fun.geT(".article-title"),
        category: "nsfw1"
    }, {
        name: "Xiutaku xiutaku.com Kostaku kostaku.art",
        reg: /(xiutaku\.com|kostaku\.art)\/\d+$/,
        init: () => {
            fun.remove(".search-form~*,.blog~*:not([class]),.pagination~*:not([class]):not(hr),.article.content~*:not([class]):not(hr),.bottom-articles~*");
        },
        imgs: () => fun.getImg(".article-fulltext img", fun.geT(".pagination-list>span:last-child")),
        button: [4],
        insertImg: [".article-fulltext", 2],
        customTitle: () => fun.geT(".article-header>h1").replace("(mitaku.net)", "").trim(),
        category: "nsfw1"
    }, {
        name: "私图网 baoruba.com tukuku.cc",
        reg: /(baoruba\.com|tukuku\.cc)\/(bb|t)\d+\.html/i,
        imgs: "img[decoding]",
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: () => fun.title(" - 私图网"),
        css: "[id].widget_text,.gridmode-post-thumbnail-single,.gridbit-thumbnail-alignwide{display:none!important}",
        category: "nsfw1"
    }, {
        name: "找套图 www.zhaotaotu.cc",
        reg: /www\.zhaotaotu\.cc\/thread-\d+\.htm/i,
        imgs: ".message>img:not(:first-of-type)",
        button: [4],
        insertImg: [".message", 2],
        customTitle: () => fun.geT(".media-body>h4").replace(/\(\d+P\)/i, ""),
        category: "nsfw1"
    }, {
        name: "豆花520 www.douhua520.com",
        reg: /www\.douhua520\.com\/p\/\d+/i,
        imgs: () => [...fun.gae(".tm-container-content div>.img-fluid")].map(e => encodeURI("https://www.douhua520.com/" + e.alt)),
        button: [4],
        insertImg: ["//div[div[div[img[@class='img-fluid']]]]", 2],
        customTitle: () => fun.geT(".tm-container-content h2.tm-text-primary"),
        category: "nsfw1"
    }, {
        name: "尤美图库 www.umeitu.com",
        reg: /www\.umeitu\.com\/img\/\d+\.html/,
        imgs: () => fun.getImg(".vipimglist img", fun.geT(".stitle>h1>span").match(/\d+/)[0], 9),
        button: [4],
        insertImg: [".vipimglist", 2],
        customTitle: () => fun.title(" - 尤美图库", 1).replace(/\[\d+P\]/i, ""),
        css: ".sb.list2>li:nth-child(n+2):nth-child(-n+3){display:none!important}",
        category: "nsfw1"
    }, {
        name: "美图库 www.meituku.org",
        reg: /www\.meituku\.org\/\d+\/\d+\.html/,
        imgs: () => [...fun.doc(imgs.join("")).images],
        button: [4],
        insertImg: ["#content", 2],
        autoDownload: [0],
        next: "//div[contains(text(),'下一篇')]/a",
        prev: "//div[contains(text(),'上一篇')]/a",
        customTitle: () => fun.geT(".info-title>a:nth-child(3)"),
        category: "nsfw1"
    }, {
        name: "秀爱美女网 www.2mn.cc 秀套图吧 www.taotu8.cc",
        reg: /(www\.2mn\.cc|www\.taotu8\.cc)\/mm\/\d+\.html/i,
        imgs: () => {
            let max;
            try {
                max = fun.ge(".page_navi a:last-child").href.split("_")[1].match(/\d+/)[0];
            } catch (e) {
                max = 1;
            }
            return fun.getImg(".sg_img img", max, 9);
        },
        button: [4],
        insertImg: [".sg_img", 2],
        customTitle: () => fun.geT("h1"),
        css: "#divpsg,.tujia{display:none!important}",
        category: "nsfw1"
    }, {
        name: "Xiuren 秀人网 www.xiuren.org",
        reg: /www\.xiuren\.org\/.+\.html/i,
        imgs: "a[rel='gallery']:not([href*='html']",
        button: [4],
        insertImg: [
            [".post p>a:not([title])", 2, ".post p>a[title],.post p>span"], 1
        ],
        customTitle: () => fun.geT("#title>h1").replace(/\d+p$/i, "").trim(),
        css: "#post .post img{max-width:100% !important}",
        category: "nsfw2"
    }, {
        name: "微圖坊 www.v2ph.com www.v2ph.net www.v2ph.ru",
        //reg: /v2ph\.\w+\/album\/.+/i,
        reg: () => {
            if (/v2ph\.\w+\/album\/.+/i.test(siteUrl)) {
                if (!siteUrl.includes("?page=")) {
                    return true;
                }
            }
            return false;
        },
        include: ".photos-list",
        init: () => {
            if (/\.html\?hl=/.test(siteUrl)) {
                location.href = location.href.replace(/\.html\?hl=.*/, ".html");
            }
        },
        imgs: async () => {
            let numP = fun.geT("dd:last-child").match(/\d+/)[0];
            let max = Math.ceil(numP / 10);
            let links = [];
            links.push(siteUrl.replace(/\?page=\d+/, ""));
            for (let i = 2; i <= max; i++) {
                links.push(siteUrl.replace(/\?page=\d+/, "") + `?page=${i}`);
            }
            let srcArr = [];
            let status = 200;
            let vip = false;
            let fetchNum = 0;
            fun.show(displayLanguage.str_01, 0);
            for (let i in links) {
                await fetch(links[i]).then(res => {
                    if (res.status == 403) {
                        status = 403;
                    }
                    fun.show(`${displayLanguage.str_02}${fetchNum+=1}/${links.length}`, 0);
                    return res.arrayBuffer();
                }).then(buffer => {
                    const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
                    const htmlText = decoder.decode(buffer);
                    const doc = fun.doc(htmlText);
                    debug(`\n${links[i]}\n`, doc);
                    let vipEle = fun.ge(".lead", doc);
                    if (vipEle) {
                        vip = true;
                    }
                    let imgs = [...fun.gae(".album-photo img[alt]", doc)];
                    if (imgs.length == 0) {
                        debug(`\n${links[i]}\n沒有任何圖片`);
                    } else {
                        debug(`\n${links[i]}\n此頁圖片`, imgs);
                    }
                    let tE = [...fun.gae("div.album-photo")].pop();
                    imgs.forEach(e => {
                        if (e.dataset.src) {
                            srcArr.push(e.dataset.src);
                            e.src = e.dataset.src;
                        } else {
                            srcArr.push(e.src);
                        }
                        tE.parentNode.insertBefore(e.parentNode.cloneNode(true), tE.nextSibling);
                    });
                    try {
                        fun.ge(".pagination").outerHTML = fun.ge(".pagination", doc).outerHTML;
                    } catch (e) {}
                });
                if (status == 403) {
                    setTimeout(() => {
                        fun.show("403請先登錄網站!", 0);
                    }, 1200);
                    return srcArr;
                }
                if (vip) {
                    setTimeout(() => {
                        fun.show("VIP限定專輯圖片!", 5000);
                    }, 1200);
                    return srcArr;
                }
                await fun.delay(600, 0);
            }
            debug(`\n所有圖片\n`, srcArr);
            debug(`\n去重複後的圖片\n`, [...new Set(srcArr)]);
            if (numP != srcArr.length && !vip) {
                setTimeout(() => {
                    fun.hide();
                    fun.show("圖片有缺,請看主控台訊息", 5000);
                }, 1300)
            }
            return srcArr;
        },
        button: [4],
        insertImg: [".photos-list", 2],
        customTitle: () => fun.geT("h1"),
        css: ".albums-list img,.photos-list img{opacity:1!important}",
        threading: 10,
        category: "nsfw2"
    }, {
        name: "柠檬皮 www.cybesx.com",
        reg: /www\.cybesx\.com\/\d+\.html$/i,
        include: ".page-links",
        exclude: ".read-point-box",
        imgs: () => fun.getImg(".single-content img", (fun.geT(".page-links>a:last-child", 2) || 1), 7),
        button: [4],
        insertImg: [".single-content", 1],
        customTitle: () => fun.geT("h1.entry-title"),
        category: "nsfw1"
    }, {
        name: "柠檬皮 www.cybesx.com",
        reg: /www\.cybesx\.com\/\d+\.html$/i,
        include: ".single-content img",
        exclude: ".read-point-box",
        imgs: ".single-content img",
        button: [4],
        insertImg: [".single-content", 1],
        customTitle: () => fun.geT("h1.entry-title"),
        category: "nsfw1"
    }, {
        name: "Cherryfans cherryfans.cc",
        reg: /cherryfans\.cc\/[^/]+\/$/i,
        imgs: ".entry-content img[data-src]",
        button: [4],
        insertImg: [".entry-content", 2],
        autoDownload: [0],
        next: "a[rel=prev]",
        prev: "a[rel=next]",
        customTitle: () => fun.geT("h1.entry-title"),
        css: ".entry-featured-media-main{display:none!important}",
        category: "nsfw2"
    }, {
        name: "51sex 51sex.vip",
        reg: /51sex\.vip\/pic\/\d+/i,
        init: () => {
            let url = siteData.next();
            fun.addUrlHtml(url, ".headling_main", 1, "下一篇");
        },
        imgs: () => {
            let max;
            try {
                max = fun.geT(".headling_swiper_num_small").match(/\d+/)[0];
            } catch (e) {
                max = 1;
            }
            let links = [];
            for (let i = 1; i <= max; i++) {
                links.push(location.href + "/" + i);
            }
            return fun.getImgA("#bigimg", links);
        },
        button: [4, "24%"],
        insertImg: [".headling_main", 2],
        next: () => {
            let num = location.href.match(/\d+$/)[0];
            return location.href.replace(/\d+$/, "") + (parseInt(num) - 1);
        },
        customTitle: () => fun.geT('.headling_word_main_box_title').replace(/\[\d+P\]/i, "").replace(/\d+P$/i, "").replace(/\(\d+P\)/i, "").trim(),
        css: ".headling_main{height:auto}",
        category: "nsfw1"
    }, {
        name: "51sex 51sex.vip 分類自動翻頁",
        reg: /https?:\/\/51sex\.vip\/category\/\d+/i,
        icon: 0,
        key: 0,
        init: () => {
            let pathnameArr = location.pathname.split("/");
            if (pathnameArr.length == 3) {
                currentPageNum = 1;
            } else {
                currentPageNum = parseInt(location.pathname.split("/").pop());
            }
        },
        autoPager: {
            ele: ".headling_main_a",
            observer: ".headling_main_a",
            next: () => {
                let url = location.href.match(/https?:\/\/51sex\.vip\/category\/\d+/)[0] + `/${currentPageNum += 1}`;
                return url;
            },
            stop: () => {
                let currentEles = [...fun.gae(".headling_main_a")];
                if (currentEles.length < 24) {
                    return true;
                } else {
                    if (currentEles.length > 24) {
                        currentEles = currentEles.slice(-24);
                    }
                    let nextEles = [...fun.gae(".headling_main_a", doc)];
                    for (let i in currentEles) {
                        for (let n in nextEles) {
                            if (currentEles[i].href == nextEles[n].href) {
                                return true;
                            }
                        }
                    }
                }
                return false;
            },
            history: 1,
            title: () => {
                return doc.title + ` - Page ${currentPageNum}`;
            }
        },
        openInNewTab: ".headling_main_a",
        category: "autoPager"
    }, {
        name: "美图乐 www.meitule.net",
        reg: /www\.meitule\.\w+\/photo\/\d+\.html/i,
        imgs: () => {
            let max;
            try {
                max = fun.ge(".page>li:last-child>a").href.split("_")[1].match(/\d+/)[0];
            } catch (e) {
                max = 1;
            }
            return fun.getImg(".content img", max, 9);
        },
        button: [4],
        insertImg: [".content", 2],
        customTitle: () => fun.geT("h1.h5"),
        css: "#dtag>center,#divpsg,.tujia,.list-album>li:nth-child(n+1):nth-child(-n+2){display:none!important}",
        category: "nsfw1"
    }, {
        name: "美桌 http://www.win4000.com/meitu.html",
        reg: /www\.win4000\.com\/\w+\.html/,
        imgs: () => fun.getImgA(".pic-large", "#scroll>li:not(.current)>a", 200),
        button: [4],
        insertImg: ["#pic-meinv,.pic-meinv", 2],
        autoDownload: [0],
        next: ".group-next>a",
        prev: ".group-prev>a",
        customTitle: () => fun.geT(".ptitle>h1"),
        threading: 3,
        category: "nsfw1"
    }, {
        name: "MM1311 www.mm1311.net m.mm1311.net",
        reg: /(www|m)\.mm1311\.net\/\w+\/\d+\.html/,
        imgs: () => {
            let max;
            try {
                max = fun.geT(".page-ch").match(/\d+/)[0];
            } catch (e) {
                max = fun.geT(".fenye>.rw").match(/\d+\/(\d+)/)[1];
            }
            return fun.getImg(".content-pic img,.post-content img", max, 9);
        },
        button: [4],
        insertImg: [".content-pic,.post-content", 1],
        autoDownload: [0],
        next: ".updown_r",
        prev: ".updown_l",
        customTitle: () => fun.geT(".content>h5,.mm-title"),
        css: "union{display:none!important}",
        category: "nsfw1"
    }, {
        name: "依依图片网 www.eemm.cc 精选美女网 www.jxmm.net",
        reg: /(www\.eemm\.cc|www\.jxmm\.net)\/pic\/\d+\.html/,
        imgs: async () => {
            await fun.getNP("#content img", "a.on+a:not(.next)", null, ".page", 0, null, 0);
            return [...fun.gae('#content img')];
        },
        button: [4],
        insertImg: ["#content", 1],
        customTitle: () => fun.geT(".article>h1"),
        css: ".article .content img{max-width:100%!important}",
        category: "nsfw1"
    }, {
        name: "依依图片网M m.eemm.cc 精选美女网M m.jxmm.net",
        reg: /(m\.eemm\.cc|m\.jxmm\.net)\/pic\/\d+\.html/,
        imgs: async () => {
            let max = fun.geT(".contentpage").match(/\d+\/(\d+)/)[1];
            return fun.getImg(".content img", max, 9);
        },
        button: [4],
        insertImg: [".content", 1],
        customTitle: () => fun.geT(".content>h1"),
        css: ".topad,.mdiv{display:none!important}",
        category: "nsfw1"
    }, {
        name: "内涵吧 www.neihantu.net",
        reg: /(www|wap)\.neihantu\.net\/zhainannvshen\/\d+\.html$/,
        imgs: async () => {
            let max = fun.geT("a[title=Page]>b:last-child");
            return fun.getImg("#adcon img,.newsbox img", max, 9);
        },
        button: [4],
        insertImg: ["#adcon,.newsbox", 1],
        autoDownload: [0],
        next: "//li[@id='pre']/a | //a[text()='上一篇']",
        prev: "//li[@id='next']/a | //a[text()='下一篇']",
        customTitle: () => fun.geT(".inner>h1,.titbox>h1"),
        category: "nsfw1"
    }, {
        name: "青年美圖 jrants.com",
        reg: /^https?:\/\/jrants\.com\/\d+\.html$/,
        imgs: async () => {
            let ele = fun.ge(".page-links");
            if (ele) {
                let max = fun.geT(">a:last-child");
                return fun.getImg(".entry-content img", max, 7);
            } else {
                return [...fun.gae(".entry-content img")];
            }
        },
        button: [4],
        insertImg: [".entry-content", 1],
        customTitle: () => fun.geT(".entry-title").replace(/\(\d+P\)|\[\d+P\]|\[\d+P\/\d+1M\]/gi, "").trim(),
        category: "nsfw2"
    }, {
        name: "MM5MM5美女图片 www.mm5mm5.com",
        reg: /www\.mm5mm5\.com\/mm\/\d+/,
        imgs: () => picinfo[0].split(","),
        button: [4],
        insertImg: ["#content", 1],
        customTitle: () => fun.geT(".article>h2"),
        css: ".article .content img{max-width:100%!important}",
        category: "nsfw1"
    }, {
        name: "MM5MM5美女图片M m.mm5mm5.com",
        reg: /m\.mm5mm5\.com\/mm\/\d+/,
        imgs: () => {
            let max = fun.geT(".contentpage>span>i").match(/\/(\d+)/)[1];
            let links = [];
            links.push(location.href);
            for (let i = 1; i < max; i++) {
                links.push(location.href + "/" + i);
            }
            return fun.getImgA("div>a>img", links, 333);
        },
        button: [4],
        insertImg: ["//div[a[img]]", 2],
        customTitle: () => fun.geT(".content>h1"),
        css: "union[id],.pag-ts,.contentpage{display:none!important}",
        category: "nsfw1"
    }, {
        name: "可爱小图 www.keaitupian.com m.keaitupian.com",
        reg: /(www|m)\.keaitupian\.com\/pic\/\d+\.html/,
        imgs: () => {
            try {
                let max = fun.geT(".entry-title,.desk-tit>h1").match(/\/(\d+)/)[1];
                let links = [];
                links.push(siteUrl)
                let url = siteUrl.replace(".html", "");
                for (let i = 1; i < max; i++) {
                    links.push(url + "-" + i + ".html");
                }
                return fun.getImgA(".entry-content img,#content_pic img", links, 1000);
            } catch (e) {
                return [...fun.gae(".entry-content img,#content_pic img")];
            }
        },
        button: [4],
        insertImg: [".entry-content,#content_pic", 1],
        customTitle: () => fun.geT(".entry-title,.desk-tit>h1").replace(/(\d+\/\d+)/, "").trim(),
        category: "nsfw1"
    }, {
        name: "回车桌面 www.enterdesk.com m.enterdesk.com",
        reg: /^https?:\/\/((m\.)?mm?\.|www\.)enterdesk\.com\/\w+\/[0-9-]+\.html/,
        include: ".arc_pandn .swiper-wrapper img,.marc_pandn .swiper-wrapper img",
        imgs: () => [...fun.gae(".arc_pandn .swiper-wrapper img,.marc_pandn .swiper-wrapper img")].map(e => e.src.replace("_360_360", "")),
        button: [4],
        insertImg: [".arc_main_pic,.marc_img", 2],
        autoDownload: [0],
        next: "//a[div[text()='下一组']]|//div[@id='next_pics']",
        prev: 1,
        customTitle: () => fun.geT(".arc_location>a:last-child,.m_h1>a"),
        category: "nsfw1"
    }, {
        name: "女人吧 www.nvhai8.com m.nvhai8.com",
        reg: /^https?:\/\/(www|m)\.nvhai8\.com\/body\/\d+\/\d+\.htm/,
        init: () => {
            fun.remove("//div[iframe] | //div[@class='hengfu2'] | //div[@onclick]");
            document.body.removeAttribute("style");
        },
        imgs: () => {
            try {
                let max = fun.geT(".imgfooter>a").match(/\d+/)[0];
                return fun.getImgA(".remark img,.ui-article-detail img", ".imgfooter>a[href]");
            } catch (e) {
                return [...fun.gae(".remark img,.ui-article-detail img")]
            }
        },
        button: [4],
        insertImg: [".remark,.ui-article-detail", 2],
        autoDownload: [0],
        next: "//label[contains(text(),'下一篇')]/preceding-sibling::a[1]",
        prev: "//label[contains(text(),'上一篇')]/following-sibling::a[1]",
        customTitle: () => fun.geT(".text_content>h1,.arc_location>a:last-child,.m_h1>a,h1"),
        category: "nsfw1"
    }, {
        name: "3G 壁纸 https://www.3gbizhi.com/meinv",
        reg: /(www|m|desk)\.3gbizhi\.com\/meinv\/(\w+\/)?\w+\.html/,
        imgs: () => fun.getImgA("#contpic,#mobile_c_img>img", ".swiper-slide:not(:first-child) a"),
        button: [4],
        insertImg: ["#showimg", 1],
        autoDownload: [0],
        next: "a.next[href$=html]",
        prev: "a.pver[href$=html]",
        customTitle: () => fun.geT("h2.title,.titlew>h2"),
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.showcontw #showimg{height:auto!important}[class^=ad_id]{display:none!important}",
        category: "nsfw1"
    }, {
        name: "亿图全景图库 https://www.yeitu.com/meinv/",
        reg: /(www|m)\.yeitu\.com\/\w+\/\w+\/\w+\.html/,
        imgs: () => {
            let max = fun.geT(".imageset-sum,span.num").match(/\/\s?(\d+)/)[1];
            let links = [];
            links.push(siteUrl);
            let url = siteUrl.replace(".html", "");
            for (let i = 2; i <= max; i++) {
                links.push(url + "_" + i + ".html");
            }
            return fun.getImgA(".img_box img[alt],.gallery-item img[alt],.article-show img", links, 333);
        },
        button: [4],
        insertImg: [".img_box,.gallery-item,.article-show", 2],
        customTitle: () => fun.geT("#title>h1,h1.article-title,.article-info>h1"),
        css: ".appbox,.uk-page~section,.yt-pages+.mssp{display:none!important}",
        category: "nsfw1"
    }, {
        name: "优美图库 https://www.umei.cc/meinvtupian/",
        reg: /www\.umei\.cc\/meinvtupian\/\w+\/\d+\.htm/i,
        imgs: () => {
            let a = fun.ge(".pages li:last-child>a");
            let max = a.href.match(/_(\d+).htm/)[1];
            return fun.getImg(".big-pic img", max, 17);
        },
        button: [4],
        insertImg: [".big-pic", 1],
        autoDownload: [0],
        next: ".preandnext:not(.connext)>a",
        prev: ".preandnext.connext>a[href$=htm]",
        customTitle: () => fun.geT("#photos>h1"),
        css: ".photo img {max-width:100% !important}",
        category: "nsfw1"
    }, {
        name: "优美图库M wap.umei.cc",
        reg: /wap\.umei\.cc\/meinvtupian\/\w+\/\d+\.htm/i,
        imgs: () => {
            let max = fun.geT("a.noclick").match(/\/(\d+)/)[1];
            return fun.getImg("#maincont img", max, 17);
        },
        button: [4],
        insertImg: ["#maincont", 1],
        autoDownload: [0],
        next: () => {
            let next = fun.ge("a.f-r.l3");
            if (next) {
                return next.href;
            } else {
                return null;
            }
        },
        prev: 1,
        customTitle: () => fun.geT(".title>h1"),
        css: "#maincont>div:not(#FullPictureLoadImgBox),dl:nth-child(n+1):nth-child(-n+2){display:none!important}",
        category: "nsfw1"
    }, {
        name: "MEITU131 www.meitu131.net/nvshen/ www.meitu131.net/meinv/ www.meitu131.net/jigou/ m.meitu131.net",
        reg: /(www|m)\.meitu131\.(com|net)\/(\w+\/)?meinv\/\d+\//,
        imgs: () => {
            let max = fun.geT("a[title],.uk-page>span").match(/\/(\d+)/)[1];
            let links = [];
            let url = location.href.replace(/index(\w+)?\.html$/, "");
            for (let i = 1; i <= max; i++) {
                if (i == 1) {
                    links.push(url + "index.html");
                } else {
                    links.push(url + "index_" + i + ".html");
                }
            }
            return fun.getImgA(".work-content img,.uk-article-bd img", links, 333);
            //return fun.getImg(".work-content img,.uk-article-bd img", max, 15);
        },
        button: [4],
        insertImg: [".work-content>p,.uk-article-bd", 1],
        customTitle: () => fun.geT(".contitle-box>h1,h1.uk-article-title"),
        css: ".appbox,.uk-page~section{display:none!important}.work-content img{max-width:100%!important}",
        category: "nsfw1"
    }, {
        name: "晴空头像图库 www.qq7k.com",
        reg: /www\.qq7k\.com\/\w+\/\w+\/\d+.html/i,
        init: () => {
            let a = fun.ge(".content a");
            a.outerHTML = a.innerHTML;
        },
        imgs: () => {
            let max = parseInt(qingtiancms_Details.Total);
            if (max > 1) {
                return fun.getImg(".content img", max, 9);
            } else {
                return [...fun.gae(".content img")];
            }
        },
        button: [4],
        insertImg: [".content", 1],
        autoDownload: [0],
        next: "//a[text()='上一篇']",
        prev: 1,
        customTitle: () => fun.geT(".contitle-box>h1"),
        css: ".content img{cursor:unset!important;margin:0px auto!important;border:none!important}",
        category: "nsfw1"
    }, {
        name: "晴空头像图库M m.qq7k.com",
        reg: /m\.qq7k\.com\/\w+\/\w+\/\d+.html/i,
        init: () => {
            let a = fun.ge(".show-simg a");
            a.outerHTML = a.innerHTML;
        },
        imgs: async () => {
            await fun.getNP(".show-simg img", "#playnext[href*=_]", null, ".show-pages", 0, null, 0);
            return [...fun.gae(".show-simg img")];
        },
        button: [4],
        insertImg: [".show-simg", 1],
        autoDownload: [0],
        next: "#playpre",
        prev: 1,
        customTitle: () => fun.geT(".m-article>h1"),
        css: "#bigImg{margin:0px!important}",
        category: "nsfw1"
    }, {
        name: "930图片网 www.930tu.com m.930tu.com",
        reg: /(www|m)\.930tu\.com\/\w+\/\w+\/\d+.html$/i,
        include: ".page a,a[title=Page]",
        init: () => {
            let a = fun.ge(".pic-main a,.pic-m a");
            a.outerHTML = a.innerHTML;
        },
        imgs: () => {
            let max = fun.ge("//a[text()='尾页']").href.match(/_(\d+)/)[1];
            return fun.getImg(".pic-main img,.pic-m img", max, 9);
        },
        button: [4],
        insertImg: [".pic-main,.pic-m", 1],
        autoDownload: [0],
        next: "//a[@class='pic-next']|//a[text()='下一组图']",
        prev: "//a[@class='pic-prew']|//a[text()='上一组图']",
        customTitle: () => fun.geT(".pic h1,.tit-m h1"),
        css: ".pic .pic-main img{max-width:100%!important}",
        category: "nsfw1"
    }, {
        name: "爱美女 www.2meinv.com",
        reg: /www\.2meinv\.com\/article.+\.html/,
        imgs: () => {
            let max = fun.geT(".des>h1,.post_title_topimg").match(/\/\s?(\d+)/)[1];
            return fun.getImg(".pp.hh img[alt],#image_div img", max, 5);
        },
        button: [4],
        insertImg: [".pp.hh,.content", 1],
        autoDownload: [0],
        next: "//a[@class='active' and contains(text(),'下一篇')] | //a[@class='active' and contains(text(),'下一组')]",
        prev: "//a[@class='active' and contains(text(),'上一篇')] | //a[@class='active' and contains(text(),'上一组')]",
        css: ".pp img{max-width:100%!important}",
        customTitle: () => fun.title("_", 1),
        category: "nsfw1"
    }, {
        name: "爱美女M mm.2meinv.com",
        reg: /mm\.2meinv\.com\/article-\d+\.html/,
        imgs: () => {
            let max = fun.geT(".article-page>*:last-child", 2);
            return fun.getImg(".arcmain img,#image_div img", max, 5);
        },
        button: [4],
        insertImg: [".clearfix.arcmain,.content", 1],
        autoDownload: [0],
        next: "a.f-r.l3",
        prev: "a.f-l.l2",
        css: "body>a{display:none!important}",
        customTitle: () => fun.title("_", 1),
        category: "nsfw1"
    }, {
        name: "绅士猫 www.cos6.net",
        reg: /www\.cos6\.net\/\d+\.html/,
        exclude: ".tinymce-hide",
        imgs: ".wp-posts-content img[data-src]",
        button: [4],
        insertImg: [".bialty-container", 2],
        autoDownload: [0],
        next: ".article-nav>div:first-child>a[href$=html]",
        prev: ".article-nav>div:last-child>a[href$=html]",
        customTitle: () => fun.geT("h1.article-title"),
        category: "nsfw1"
    }, {
        name: "RedBust redbust.com",
        reg: /redbust\.com\/[^\/]+\/$/,
        include: ".entry-inner img",
        imgs: () => {
            //return fun.getImgA(".image-attachment img", ".gallery a");
            return [...fun.gae(".entry-inner img")].map(img => {
                let srcset = img.getAttribute("srcset");
                if (srcset) {
                    let splitArr = srcset.split(",");
                    splitArr = splitArr.sort((a, b) => {
                        return a.match(/\s(\d+)w/)[1] - b.match(/\s(\d+)w/)[1];
                    });
                    return splitArr.pop().trim().split(" ")[0];
                } else {
                    return img.src.replace(/-\d+x\d+\./, ".");
                }
            });
        },
        button: [4],
        insertImg: [".entry-inner", 2],
        autoDownload: [0],
        next: ".previous>a",
        prev: ".next>a",
        customTitle: () => fun.geT("h1.post-title"),
        category: "nsfw2"
    }, {
        name: "妞妞之家 niuniuhome.club",
        reg: /niuniuhome\.club\/[^\/]+\/$/,
        imgs: ".entry-content img",
        button: [4],
        insertImg: [".post-content", 2],
        autoDownload: [0],
        next: "a.post-nav-prev",
        prev: "a.post-nav-next",
        customTitle: () => fun.geT(".post-title"),
        category: "nsfw1"
    }, {
        name: "PixiBB www.pixibb.com",
        reg: /(htps?:\/\/www\.pixibb\.com\/$|https?:\/\/www\.pixibb\.com\/\?list=)/,
        icon: 0,
        key: 0,
        openInNewTab: ".list-item-image a",
        category: "nsfw1"
    }, {
        name: "PixiBB www.pixibb.com",
        reg: /www\.pixibb\.com\/album\//,
        imgs: () => {
            let arr = [...fun.gae(".list-item-image img")].map(e => e.src.replace(".md.", "."));
            arr = arr.sort((a, b) => {
                return a.match(/---(\d+)/)[1] - b.match(/---(\d+)/)[1];
            });
            return arr;
        },
        button: [4],
        insertImg: [
            [".pad-content-listing", 2], 2
        ],
        go: 1,
        topButton: true,
        customTitle: () => fun.title(" - PixiBB", 1),
        category: "nsfw1"
    }, {
        name: "E次元 www.evacg.org",
        reg: /www\.evacg\.org\/archives\/\d+/,
        imgs: ".wp-caption img",
        button: [4],
        insertImg: [
            [".inn-singular__post__body__content", 0, ".wp-caption"], 2
        ],
        customTitle: () => fun.geT(".inn-singular__post__title"),
        category: "nsfw1"
    }, {
        name: "3楼猫图库 pic.3loumao.org",
        reg: /pic\.3loumao\.org\/[a-z-]+\/\d+\.html/i,
        imgs: "article img",
        button: [4],
        insertImg: ["//p[img]", 2],
        customTitle: () => fun.geT("h1"),
        category: "nsfw1"
    }, {
        name: "Simply Cosplay www.simply-cosplay.com",
        reg: /www\.simply-cosplay\.com\/gallery\//,
        imgs: async () => {
            fun.show(displayLanguage.str_04, 0);
            await fun.waitEle(".swipe-area img", 600);
            fun.hide();
            return [...fun.gae(".swiper-slide img")].map(e => e.dataset.src.replace("small_square_", ""));
        },
        button: [4],
        insertImg: ["//div[div[div[div[@class='image-wrapper']]]]", 2],
        customTitle: async () => {
            await fun.waitEle("h1.content-headline", 600);
            return fun.geT('h1.content-headline');
        },
        fetch: 1,
        css: ".gallery-view .row{display:block}",
        category: "nsfw1"
    }, {
        name: "COSPLAY ZIP coszip.com",
        reg: /^https?:\/\/coszip\.com\/\d+\.html$/,
        imgs: () => {
            let max;
            try {
                max = fun.geT(".page_info").match(/\d+$/)[0];
            } catch (e) {
                max = 1;
            }
            return fun.getImg(".entry-content img", max, 7);
        },
        button: [4],
        insertImg: [
            [".entry-content", 0, "//p[img[@decoding]] | //figure[@class='wp-block-image'] | //div[contains(@class,'jeg_pagelinks')]"], 2
        ],
        go: 1,
        autoDownload: [0],
        next: "a.prev-post",
        prev: "a.next-post",
        customTitle: () => fun.geT("h1.jeg_post_title"),
        css: "pre{white-space:pre-wrap!important}",
        category: "nsfw2"
    }, {
        name: "萝莉少女 cosporn.online",
        reg: /cosporn\.online\/.+\//,
        init: "setTimeout(()=>{fun.gae('.g1-nav-single a').forEach(e=>{e.removeAttribute('target')})},2000)",
        include: ".g1-content-narrow",
        imgs: () => {
            return [...fun.gae(".g1-content-narrow img:not([id])")].map(e => {
                let lazySrc = e.dataset.lazySrc;
                if (lazySrc) {
                    return lazySrc.replace(/\?w=\d+&ssl=1/, "");
                } else {
                    return e.src.replace(/\?w=\d+&ssl=1/, "");
                }
            })
        },
        button: [4],
        insertImg: [".g1-content-narrow", 2],
        autoDownload: [0],
        next: "#content .g1-teaser-prev",
        prev: "#content .g1-teaser-next",
        customTitle: () => fun.geT("h1.entry-title"),
        css: "#simple-banner,.touchy-wrapper,.touchy-wrapper~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(.fancybox-container),.code-block,#secondary{display:none!important}",
        category: "hcomic"
    }, {
        name: "女神社 nshens.com inewgirl.com",
        reg: /(nshens\.com|inewgirl\.com)\/\d+\/\d+\/\d+\/[^/]+$/,
        exclude: ".justify-center>button>.v-btn__content",
        delay: 800,
        imgs: async () => {
            fun.show(displayLanguage.str_05, 0);
            let links = [];
            let resArr = [];
            let fetchNum = 0;
            let max = fun.geT(".v-pagination li:last-child", 2);
            links.push(location.href);
            for (let i = 2; i <= max; i++) {
                links.push(location.href + "/" + i);
            }
            for (let i in links) {
                let res = fun.fetchDoc(links[i]).then(doc => {
                    fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${links.length}`, 0);
                    let code = [...doc.scripts].find(s => s.innerHTML.search(/photoList/) > -1).innerHTML;
                    return fun.run(code.match(/photoList:([^\]]+\])/)[1]);
                });
                resArr.push(res);
            }
            let photourl = await Promise.all(resArr).then(data => {
                fun.hide();
                return data.flat().map(e => e.photourl);
            });
            if (photourl.length > [...new Set(photourl)].length) {
                setTimeout(() => {
                    fun.show("VIP套圖需升級為VIP", 5000);
                }, 1200)
            }
            return photourl;
        },
        button: [4],
        insertImg: ["//div[a[div[@class='v-image v-responsive theme--light']]]", 2],
        customTitle: () => fun.geT("h3"),
        category: "nsfw2"
    }, {
        name: "女神社 nshens.com inewgirl.com lovens.cc",
        reg: /(nshens\.com|inewgirl\.com)\/latestpost$/,
        delay: 500,
        icon: 0,
        key: 0,
        observerClick: "//button[span[text()='加載更多'] or span[text()='加载更多'] or span[text()='Load More'] or span[text()='Tải thêm']]",
        category: "nsfw2"
    }, {
        name: "Chottie chottie.com", //很多都需要VIP,不然只會重複抓到第一頁的圖片
        reg: /chottie\.com\/blog\/(\w{2}\/)?archives\/\d+$/,
        exclude: ".justify-center>button>.v-btn__content",
        delay: 800,
        imgs: async () => {
            fun.show(displayLanguage.str_05, 0);
            let links = [];
            let resArr = [];
            let fetchNum = 0;
            let max = fun.geT(".v-pagination li:last-child", 2);
            links.push(location.href);
            for (let i = 2; i <= max; i++) {
                links.push(location.href + "/" + i);
            }
            for (let i in links) {
                let res = fun.fetchDoc(links[i]).then(doc => {
                    fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${links.length}`, 0);
                    let code, imgs;
                    try {
                        code = [...doc.scripts].find(s => s.innerHTML.search(/imgList/) > -1).innerHTML;
                        imgs = fun.run(code.match(/imgList:([^\]]+\])/)[1]);
                    } catch (e) {
                        code = [...doc.scripts].find(s => s.innerHTML.search(/snapshotList/) > -1).innerHTML;
                        imgs = fun.run(code.match(/snapshotList:([^\]]+\])/)[1]);
                    }
                    return imgs;
                });
                resArr.push(res);
            }
            let data = await Promise.all(resArr).then(data => {
                fun.hide();
                return data.flat();
            });
            if (data.length > [...new Set(data)].length) {
                setTimeout(() => {
                    fun.show("VIP套圖需升級為VIP", 5000);
                }, 1200)
            }
            return data;
        },
        button: [4],
        insertImg: ["//div[a[div[@class='v-image v-responsive theme--light']]]", 2],
        //css: ".text-center{display:none!important}",
        customTitle: () => fun.geT("h3"),
        category: "nsfw2"
    }, {
        name: "街角图片社 ijjiao.com",
        reg: /https?:\/\/ijjiao\.com\/\d+\/\d+\/\d+\/album/,
        include: ".v-pagination",
        exclude: "//span[text()='加载更多']",
        delay: 800,
        imgs: async () => {
            let max = fun.geT("//li[button[@aria-label='Next page']]", 2);
            let links = [];
            let url = siteUrl.replace(/\/\d+$/, "");
            links.push(url);
            for (let i = 2; i <= max; i++) {
                links.push(url + "/" + i)
            }
            fun.show(displayLanguage.str_07, 0);
            let check = await fun.fetchDoc(links[1]).then(doc => {
                let code = [...doc.scripts].find(s => s.innerHTML.search(/photoList/) > -1).innerHTML;
                let photoList = fun.run(code.match(/photoList:([^\]]+\])/)[1]);
                if (photoList.length < 1) {
                    return false;
                } else {
                    return true;
                }
            });
            if (check) {
                fun.show(displayLanguage.str_05, 0);
                let resArr = [];
                let fetchNum = 0;
                for (let i = 0; i < links.length; i++) {
                    let res = fun.fetchDoc(links[i]).then(doc => {
                        fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${links.length}`, 0);
                        let code = [...doc.scripts].find(s => s.innerHTML.search(/photoList/) > -1).innerHTML;
                        let photoList = fun.run(code.match(/photoList:([^\]]+\])/)[1]);
                        return photoList;
                    });
                    resArr.push(res);
                }
                return Promise.all(resArr).then(data => {
                    fun.hide();
                    return data.flat().map(e => e.photourl);
                });
            } else {
                fun.hide();
                alert("登錄狀態已失效!請手動點擊第2頁,觸發密碼輸入框重新登錄。");
                return [];
            }
        },
        button: [4],
        insertImg: ["//div[div[@class='image-item']]", 2],
        customTitle: () => fun.geT("h3"),
        category: "nsfw1"
    }, {
        name: "美妹妹 www.meimeimei.org",
        reg: /www\.meimeimei\.org\/\d+\/\d+\/$|www\.meimeimei\.org\/\d+\/\d+\/\d+\.html/,
        imgs: () => {
            let max = fun.geT(".chapterpage>a:last-child", 2);
            let links = [];
            if (/\.html/.test(siteUrl)) {
                let url = fun.ge(".pageCurr").href.replace("_1.html", "");
                for (let i = 1; i <= max; i++) {
                    links.push(url + "_" + i + ".html");
                }
            } else {
                let url = fun.ge(".pageCurr").href.replace("1.html", "");
                for (let i = 1; i <= max; i++) {
                    links.push(url + i + ".html");
                }
            }
            return fun.getImgA(".img>img", links, 100);
        },
        button: [4],
        insertImg: [".txt_tcontent", 1],
        autoDownload: [0],
        next: "//div[contains(text(),'上一篇')]/a[not(@href='#')]",
        prev: "//div[contains(text(),'下一篇')]/a[not(@href='#')]",
        customTitle: () => fun.geT(".bread>li:last-child>a"),
        category: "nsfw1"
    }, {
        name: "爱死美女图片站 www.24tupian.org",
        reg: /^https?:\/\/www\.24tupian\.org\/\w+\/\d+\/\d+\/\d+\.html$/,
        include: "img[data-original*='imgs.diercun.com']",
        imgs: async () => {
            await new Promise(async resolve => {
                fun.show(displayLanguage.str_08, 0);
                for (let i = 1; i <= 100; i++) {
                    if (fun.ge("//div[@class='moremsg'][contains(text(),'没有更多图片了')]")) {
                        fun.hide();
                        resolve();
                        break;
                    }
                    let ele = fun.ge(".mores>a");
                    if (ele) {
                        ele.click();
                    }
                    await fun.delay(200);
                }
            });
            return [...fun.gae("#piclist img[data-original]")].map(e => {
                let arr = e.dataset.original.split("/");
                arr[2] = arr[2].replace("imgs.diercun.com", "big.diercun.com");
                arr[arr.length - 1] = arr[arr.length - 1].replace(/^m/, "");
                let bigSrc = arr.join("/");
                return bigSrc;
            });
        },
        button: [4],
        insertImg: [
            [".mores", 2], 2
        ],
        go: 1,
        topButton: true,
        threading: 12,
        customTitle: () => fun.geT(".gtitle1>h1"),
        css: "body>.mask{display:none!important}",
        category: "nsfw1"
    }, {
        name: "爱死cos美女图片站 www.24cos.org www.lovecos.net",
        reg: /(www\.24cos\.org|www\.lovecos\.net)\/\w+\/\d+\.html$/,
        imgs: async () => {
            let pages = [...fun.gae(".page>a")];
            let liImgs = [...fun.gae(".mtp>li")];
            if (pages.length > 0 && liImgs.length < 21) {
                fun.show(displayLanguage.str_08, 0);
                for (let i in pages) {
                    await fun.fetchDoc(pages[i].href).then(doc => {
                        [...fun.gae(".mtp>li", doc)].forEach(ele => {
                            fun.ge(".mtp").appendChild(ele);
                        });
                    });
                }
                fun.hide();
            }
            return [...fun.gae(".mtp img")].map(e => decodeURI(e.src.replace("/m", "/")));
        },
        insertImg: [
            [".mtp", 2], 2
        ],
        go: 1,
        topButton: true,
        threading: 5,
        customTitle: () => fun.geT(".tmsg>h1"),
        category: "nsfw1"
    }, {
        name: "Huamao wallpaper 花猫壁纸 en.huamaobizhi.com 聚集的只是大一點點的預覽圖",
        reg: /https?:\/\/en\.huamaobizhi\.com\/mix\/\d+/,
        init: () => {
            let load = fun.ge(".load-more-photos");
            if (load) load.remove();
        },
        imgs: async () => {
            await fun.getNP(".images-card", "//a[text()='Next' or text()='下一页' or text()='次へ']");
            return fun.getImgA("figure img", ".images-card>a", 200);
        },
        button: [4],
        insertImg: [
            ["#main", 2], 2
        ],
        go: 1,
        customTitle: () => fun.geT(".title>h1"),
        category: "nsfw1"
    }, {
        name: "新美图录 www.xinmeitulu.com 臺灣美腿女郎 www.twlegs.com",
        reg: /(www\.xinmeitulu\.com|www\.twlegs\.com)\/photo\/.+/,
        imgs: "img[data-original]",
        button: [4],
        insertImg: [".text-center", 2],
        customTitle: () => fun.geT("h1.h3"),
        category: "nsfw1"
    }, {
        name: "美图录 meitulu.me",
        reg: /meitulu\.me\/item\/\d+\.html/,
        imgs: () => fun.getImg(".mb-4>img[alt]", fun.geT(".pagination>li:last-child", 2), 9),
        button: [4],
        insertImg: [".mb-4", 1],
        customTitle: () => fun.geT(".top-title"),
        category: "nsfw1"
    }, {
        name: "jk-coser www.jk-coser.com",
        reg: /www.\jk-coser\.com\/m\d\/\d+\.html/,
        imgs: ".image_div img",
        button: [4],
        insertImg: [".image_div", 2],
        autoDownload: [0],
        next: ".article-nav-prev a,.nav-links .next",
        prev: 1,
        customTitle: () => fun.geT(".item_title>h1").replace(/\/?\(\d+P\)/i, "").trim(),
        css: ".content_left img{cursor:unset}",
        category: "nsfw1"
    }, {
        name: "赞MM www.zanmm.com 恩图集 www.entuji.com",
        reg: /www\.zanmm\.com\/tupian\/\d+\.html|www\.entuji\.com\/\w+\/\d+\.html/,
        imgs: () => {
            let max = fun.geT("//p[contains(text(),'图片数量')]").match(/\d+/)[0];
            return fun.getImg("#showimg img", max, 9);
        },
        button: [4],
        insertImg: ["#showimg", 1],
        customTitle: () => fun.geT(".weizhi h1"),
        css: "@media only screen and (max-width:3840px){.content img{max-width:100%!important}}",
        category: "nsfw1"
    }, {
        name: "秀窝 www.xiuwo.net RMM吧 rmm8.com",
        reg: /(www\.xiuwo\.net|rmm8\.com)\/tu\/\d+\.html/,
        imgs: () => {
            let max;
            try {
                max = fun.geT(".c_l>p:nth-child(3)").match(/\d+/)[0];
            } catch (e) {
                max = 1;
            }
            return fun.getImg('#showimg img', max, 9);
        },
        button: [4],
        insertImg: ["#showimg", 1],
        customTitle: () => fun.geT(".weizhi h1"),
        css: "@media only screen and (max-width:3840px){.content img{max-width:100%!important}}",
        category: "nsfw1"
    }, {
        name: "妹妹图 mm.tvv.tw",
        reg: /mm\.tvv\.tw\/archives\/\d+\.html/,
        imgs: ".img-responsive",
        button: [4],
        insertImg: ["//p[img]", 2],
        customTitle: () => fun.geT(".blog-details-headline"),
        category: "nsfw1"
    }, {
        name: "小姐姐 www.nvsheng.cc",
        reg: /nvsheng\.cc\/\w+\/\d+\.html/,
        imgs: () => fun.getImg(".info-imtg-box>img[alt]", fun.geT(".pagebar>*:last-child", 3)),
        button: [4],
        insertImg: [".info-imtg-box", 1],
        autoDownload: [0],
        next: "//a[p[text()='上一篇']]",
        prev: "//a[p[text()='下一篇']]",
        customTitle: () => fun.title("-", 1),
        //threading: 4,
        category: "nsfw1"
    }, {
        name: "洛秀网 loxiu.com",
        reg: /loxiu\.com\/post\/\d+\.html/,
        imgs: () => fun.getImg(".info-imtg-box>img[alt]", fun.geT(".pagebar>*:last-child", 3)),
        button: [4],
        insertImg: [".info-imtg-box", 1],
        autoDownload: [0],
        next: "//a[p[text()='上一篇']]",
        prev: "//a[p[text()='下一篇']]",
        customTitle: () => fun.geT(".info-title>h1"),
        category: "nsfw1"
    }, {
        name: "遛无写真 www.6evu.com KP写真 www.6kpo.com 美女云图网 www.c0h.net tck天天番号 www.3tck.com 4tck番号库 www.4tck.com 5tck天天番号 www.5tck.com 6K美女 www.6tck.com 7tck番号网 www.7tck.com 1凸5宅男福利 www.1tu5.com 有脾气美图 www.1plq.com 极品番号社 www.wsqap.com",
        reg: /(www\.6evu\.com|www\.6kpo\.com|www\.c0h\.net|www\.\dtck\.com|www\.1tu5\.com|www\.1plq\.com|www\.wsqap\.com)\/\d+\.html/,
        imgs: () => {
            let arr = [];
            arr.push(siteUrl);
            [...fun.gae(".pagelist a,.pagination a,.article-paging a")].forEach(a => {
                arr.push(a.href);
            });
            let links = [...new Set(arr)];
            return fun.getImgA("#post_content img,.article-content img,.entry-content img", links);
        },
        button: [4],
        insertImg: ["#post_content,.article-content,.entry-content", 2],
        autoDownload: [0],
        next: "a[rel=prev],.article-nav-prev a",
        prev: "a[rel=next],.article-nav-next a",
        customTitle: () => fun.geT("h1").replace(/\(\d+P\)/i, "").replace(/高品质壁纸图片传疯了|无圣光壁纸图片免费在线|无圣光私房写真良心推荐|超高清私家拍摄作品珍藏版|超高清私房照片在线浏览|无圣光写真作品流出|无水印壁纸图片良心推荐|无水印绝版网图在线浏览|无水印私房照片珍藏版|无水印私房照片个人分享/g, "").trim(),
        category: "nsfw1"
    }, {
        name: "原创妹子图/尤物私房图/极品美女图/免费私房图/私房网红图/尤物妹妹图 www.ycmzt.com/www.ywsft.com/www.jpmnt.com/www.mfsft.com/www.sfwht.com/www.ywmmt.com",
        reg: /www\.(ywmmt|mnwht|ycmeinv|yhsft|yhmnt|mfsft|jpsft|akxzt|flwht|threnti|ywnmt|ztmeinv|mstaotu|tstaotu|ywmtw|mgtaotu|prmzt|xrtaotu|jjtaotu|prmeinv|axtaotu|mgmeinv|xsmeinv|ugtaotu|msmeinv|flxzw|axmeinv|swtaotu|hjtaotu|nsxzw|ugmeinv|hytaotu|xrmeinv|zfmeinv|jpmnt|zttaotu|mfmzt|ykmeinv|qjtaotu|pmtaotu|ddtaotu|plxzw|mfxzt|mtgqt|fltuku|yhtuku|ycmeitu|mttuku|xhtuku|qjtuku|jpflt|ycwht|yctuk|akywt|ywtuk|jctuk|xstuk|xgtuk|mztuk|xztuk|sytuk|gcxzt|tsxzt|gqxzt|mfnmt|spxzt|yhxzt|mtxzt|nsxzt|jdxzt|spmeitu|jpmzw|yhmeitu|mzmeitu|qpmzt|flsft|ywsft|wkmzt|snmzt|thmzt|brtaotu|aimzt|qtmzt|mtmnt|jrmzt|yztaotu|jrmeinv|xsmzt|zbtaotu|yhmnw|zbmzt|xjjtaotu|jpnst|ywmeitu|jrmnt|ftmeinv|xjjmzt|smtaotu|mtywt|sfsnt|jdtaotu|xgyouwu|ywmzt|xgywt|mtflt|nmtaotu|mtmnw|flmeitu|gqtaot|plmeitu|zpmzt|mtmzt|mtwht|sfwht|gqsft|yhmeinv|jdmnt|yctaotu|wkrenti|yzrenti|mtsyt|sptaotu|mttaotu|wsgtu|ywtaotu|sfmzt|sftaotu|gcmeinv|nstaotu|xhtaotu|jdwht|mtmeinv|gqwht|jpywt|jcwht|tptaotu|spyouwu|xgmeitu|nsmeitu|jstaotu|yhtaotu|sytaotu|nsxiez|swmzt|jpmzt|yhflt|sfywt|ywxzt|plmzt|sfmtw|jpyouwu|sfxzt|zftaotu|ycmzt|whtaotu|jpxzt|sftuku|plwht|symzt|sfmnt|sfnmt|jcmeinv|tsmnt|jjmeinv|wsgmzt|gqnmt)\.com\/[a-z]+\/[a-z]+\/\d+\/\w+\.html$/,
        include: "#picg",
        init: () => {
            fun.gae(".b a").forEach(a => {
                a.removeAttribute("target");
            });
            fun.gae("#picg a").forEach(a => {
                a.outerHTML = a.innerHTML;
            });
            fun.remove("iframe", 2000);
        },
        //imgs: () => fun.getImgO("#picg img[alt]", fun.geT(".pagelist font~*:last-child", 2), 9, [null, null], 1000, "h1,.page .pagelist", 0),
        imgs: async () => {
            let max = fun.geT(".pagelist font~*:last-child", 2);
            let links = [];
            links.push(siteUrl.replace(/(_\d+)?\.html$/, "") + ".html");
            let imgsArr = [];
            for (let i = 2; i <= max; i++) {
                links.push(siteUrl.replace(/(_\d+)?\.html$/, "") + `_${i}.html`);
            }
            //let fetchNum = 0;
            //fun.show(displayLanguage.str_01, 0);
            for (let i in links) {
                //fun.show(`${displayLanguage.str_02}${fetchNum+=1}/${links.length}`, 0);
                let doc = await new Promise(async resolve => {
                    for (let check = 1; check <= 100; check++) {
                        let res = await fetch(links[i]);
                        if (res.status == 304 || res.status == 200) {
                            let buffer = await res.arrayBuffer();
                            let decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
                            let htmlText = decoder.decode(buffer);
                            let doc = fun.doc(htmlText);
                            resolve(doc);
                            break;
                        } else {
                            fun.show(`第${parseInt(i) + 1}頁403重試第${check}次`, 2900);
                            await fun.delay(3000, 0);
                        }
                    }
                });
                //debug(`\n${links[i]}\n`, doc);
                let imgs = [...fun.gae("#picg img[alt]", doc)];
                let te = [...fun.gae("#picg img[alt]")].pop();
                imgs.forEach(e => {
                    imgsArr.push(e.cloneNode(true));
                    te.parentNode.insertBefore(e.cloneNode(true), te.nextSibling);
                });
                let ne = [...fun.gae("h1,.page .pagelist")];
                let re = [...fun.gae("h1,.page .pagelist", doc)];
                if (ne.length == re.length) {
                    for (let i in ne) {
                        ne[i].outerHTML = re[i].outerHTML;
                    }
                }
                await fun.delay(200, 0);
            }
            //debug(`\n所有src\n`, imgsArr.map(e => e.src));
            //debug(`\n去重複的src\n`, [...new Set(imgsArr.map(e => e.src))]);
            return imgsArr;
        },
        button: [4],
        insertImg: ["#picg", 1],
        autoDownload: [0],
        next: "//div[@class='b' and contains(text(),'上一')]/a",
        prev: "//div[@class='b' and contains(text(),'下一')]/a",
        customTitle: () => fun.geT("h1").replace(/\/(\d+P)?|\||第\d+页/gi, "").trim(),
        topButton: true,
        css: "#imgc img{margin:0px auto!important}#picg{max-width: 1110px!important;margin: 0 auto;}#picg img:hover{transform:none !important}#picg img{filter:blur(0px)!important}body>br,#apic,#bzs7,.interestline+center,center+#pic,#d4a,#divone,#xzpap1,#divpsgx,#bdivpx,#divfts,#divftsp,#app+div,#xzappsq,div.bg-text,#divpsg,#divStayTopright2,#bdssy,#qrcode2>.erweima-text,#qrcode2>center,#qrcode2>center+div,#d5tig,#pcapicb,#google_translate_element,#d5a>*:not([id]):not([class]),.slide>a+div,.slide>img+div,.interestline+.nav~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(.fancybox-container){display:none !important}",
        category: "nsfw2"
    }, {
        name: "魅狸图片网 www.rosi8.com 美女私房照 www.sfjpg.com 看妹图 www.kanmeitu.net www.kanmeitu1.cc kanmeitu.net kanmeitu1.cc",
        reg: /(www\.rosi8\.\w+|www\.sfjpg\.com|www\.sfjpg\.net|kanmeitu\.net|kanmeitu1\.cc)\/\w+\/\d+\.html$/,
        init: () => {
            fun.gae(".b a").forEach(a => {
                a.removeAttribute("target");
            });
            fun.gae("#picg a").forEach(a => {
                a.outerHTML = a.innerHTML;
            });
        },
        imgs: () => {
            let max = fun.geT(".pagelist span,.pagelist a[title=Page]").match(/\/(\d+)/)[1];
            return fun.getImgO("#picg img", max, 9, [null, null], 200, ".page .pagelist", 0);
        },
        button: [4],
        insertImg: ["#picg", 1],
        autoDownload: [0],
        next: "//div[@class='b' and contains(text(),'上一')]/a",
        prev: "//div[@class='b' and contains(text(),'下一')]/a",
        customTitle: () => fun.geT("h1").replace(/\/(\d+P)?/i, ""),
        topButton: true,
        css: "#imgc img{margin:0px auto!important}#picg{max-width: 1110px!important;margin: 0 auto;}#picg img:hover{transform:none !important}#picg img{filter:blur(0px)!important}body>br,.interestline+center,center+#pic,#xzpap1,#divpsgx,#bdivpx,#divfts,#divftsp,#app+div,#xzappsq,div.bg-text,#divpsg,#divStayTopright2,#bdssy,#qrcode2>center,#d5tig,#pcapicb,#pcapic,#google_translate_element,#d5a>*:not([id]):not([class]),union[id]{display:none !important}",
        category: "nsfw2"
    }, {
        name: "爱妹子 xx.knit.bid",
        reg: /xx\.knit\.bid\/article\/\d+\//,
        imgs: () => fun.getImg(".item-image img", (fun.geT("li.next-page", 2) || 1)),
        button: [4],
        insertImg: ["#img-box", 2],
        customTitle: () => fun.geT(".focusbox-title").replace(/\[\d+P\]/i, "").replace(/\d+P/i, "").trim(),
        category: "nsfw1"
    }, {
        name: "美女写真 portrait.knit.bid",
        reg: /portrait\.knit\.bid\/\w+\/\d+$/,
        imgs: async () => {
            let max = fun.geT("//li[a[text()='下页']]", 2);
            let links = [];
            for (let i = 1; i <= max; i++) {
                links.push(siteUrl + "?page=" + i);
            }
            return fun.getImgA(".container>.container>img", links, 300);
        },
        button: [4],
        insertImg: [
            [".container>.container>nav", 2, "nav[aria-label=pagination],.img-fluid"], 2
        ],
        customTitle: () => fun.geT(".container h1"),
        category: "nsfw1"
    }, {
        name: "萌图社 www.446m.com 446m.com",
        reg: /https?:\/\/(www\.)?446m\.com\/index\.php\/\w+\/\d+\.html/,
        imgs: ".post-item .img",
        button: [4],
        insertImg: [".post-content", 2],
        customTitle: () => document.title.slice(0, -6),
        category: "nsfw1"
    }, {
        name: "妹妹美 mmm.red",
        reg: /(www\.)?mmm\.red\/art\/\d+$/,
        exclude: ".login-tip",
        imgs: "div[data-fancybox][data-src]",
        autoDownload: [0],
        next: "//div[text()='上一篇']/following-sibling::a",
        prev: "//div[text()='下一篇']/following-sibling::a",
        customTitle: () => fun.geT(".post-info-text"),
        category: "nsfw1"
    }, {
        name: "胴体的诱惑 dongti.blog.2nt.com",
        reg: /dongti\.blog\.2nt\.com\/blog-entry-\d+.html/,
        imgs: ".inner-contents img",
        button: [4],
        insertImg: [".entry-content", 2],
        autoDownload: [0],
        next: "//a[div[@class='pager_entry-box next-justify']]",
        prev: "//a[div[@class='pager_entry-image-prev']]",
        customTitle: () => fun.geT("#entry-title").replace(/\[\d+P-[\d\.]+MB?\]/i, "").trim(),
        category: "nsfw1"
    }, {
        name: "好圖屋 www.haotuwu.com m.haotuwu.com",
        reg: /(www|m)\.haotuwu\.com\/\w+\/\d+(\/page\/\d+)?(\.html)?$/,
        include: ".suoyou",
        init: () => {
            let url = location.href;
            if (/\/page\/\d+/.test(url)) {
                location.href = url.replace(/\/page\/\d+/, "");
            }
        },
        imgs: () => {
            let links = [];
            links.push(location.href);
            let url = location.href.replace(".html", "");
            let max = fun.geT(".suoyou").match(/\d+\/(\d+)/)[1];
            for (let i = 2; i <= max; i++) {
                links.push(url + "/page/" + i + ".html");
            }
            return fun.getImgA("#showimg img,.img-box img", links);
        },
        button: [4],
        insertImg: ["#showimg,.img-box", 2],
        autoDownload: [0],
        next: "//div[contains(text(),'上一篇')]/a | //span[contains(text(),'上一篇')]/following-sibling::a[1]",
        prev: "//div[contains(text(),'下一篇')]/a | //span[contains(text(),'下一篇')]/following-sibling::a[1]",
        customTitle: () => fun.geT(".showtitle>h2,.imgTitle-name"),
        css: "#imgshow .flow-box:nth-child(n+1):nth-child(-n+2){display:none!important}",
        category: "nsfw1"
    }, {
        name: "秀色女神 www.xsnvshen.co",
        reg: /www\.xsnvshen\.(co|com)\/album\/\d+/,
        imgs: () => [...fun.gae("img[id^='imglist'][data-original]")].map(e => e.dataset.original.replace("thumb_600x900/", "")),
        button: [4],
        insertImg: ["//li[img[@id='bigImg']]", 2],
        customTitle: () => fun.geT("h1"),
        css: ".workShow li img{max-width:100%!important}",
        category: "nsfw1"
    }, {
        name: "秀色女神M https://m.xsnvshen.co/album/39844",
        reg: /m\.xsnvshen\.(co|com)\/album\/\d+/,
        imgs: () => {
            let max = fun.geT(".pg_current").match(/\d+$/)[0];
            return fun.getImg("#arcbox img.lazy", max, 6, ["thumb_600x900/", ""]);
        },
        button: [4],
        insertImg: ["#arcbox", 1],
        customTitle: () => fun.geT("h1"),
        css: "#arcbox img{max-width:100%!important;margin:10px auto!important;min-height:50px!important;min-width:50px!important}",
        category: "nsfw1"
    }, {
        name: "HotAsiaGirl hotgirl.asia 分頁模式",
        reg: /hotgirl\.asia\/.+\//,
        include: ".galeria_img",
        imgs: () => fun.getImgA(".galeria_img>img", ".pagination a[href]"),
        button: [4],
        insertImg: [".mx-auto", 1],
        customTitle: () => fun.geT("h3"),
        css: ".galeria_img{display:none!important}",
        category: "nsfw2"
    }, {
        name: "HotAsiaGirl hotgirl.asia 幻燈片模式",
        reg: /hotgirl\.asia\/.+\//,
        include: "#carouselImageIndicators",
        imgs: "#carouselImageIndicators img",
        button: [4],
        insertImg: [".mx-auto", 1],
        customTitle: () => fun.geT("h3"),
        css: ".galeria_img{display:none!important}",
        category: "nsfw2"
    }, {
        name: "BeautyLeg www.beautyleg6.com",
        reg: /www\.beautyleg6\.com\/\w+\/\d+\/\d+\.html/i,
        imgs: () => {
            let max;
            try {
                max = fun.geT(".page a").match(/\d+/)[0];
            } catch (e) {
                max = 1;
            }
            return fun.getImg(".contents img[alt]", max, 9);
        },
        button: [4],
        insertImg: [".contents", 2],
        autoDownload: [0],
        next: ".pre>a",
        prev: ".next>a",
        customTitle: () => fun.geT(".content>h1").replace(/\[\d+P\/\d+M\]/i, ""),
        css: ".content .contents img{max-width:100%!important}",
        category: "nsfw1"
    }, {
        name: "BeautyLegM m.beautyleg6.com",
        reg: /m\.beautyleg6\.com\/view\.php\?aid=\d+/,
        imgs: async () => {
            let links = [];
            links.push(location.href);
            for (let i = 2; i <= totalpage; i++) {
                links.push(location.href + "&pageno=" + i);
            }
            await fun.getEle(links, "#bigImg", ".show-simg", ".show-pages");
            return [...fun.gae("#bigImg")];
        },
        button: [4],
        insertImg: [".show-simg", 2],
        autoDownload: [0],
        next: () => {
            let next = fun.ge("a.f-r.l3");
            if (next) {
                return next.href;
            } else {
                return null;
            }
        },
        prev: 1,
        customTitle: () => fun.geT(".showcontbt>h1").replace(/\s?\(\d+\/\d+\)/, ""),
        category: "nsfw1"
    }, {
        name: "Asianude4u www.asianude4u.net",
        reg: /www\.asianude4u\.net\/.+\/.+\/$/,
        exclude: "//a[@rel='category tag' and text()='Videos' or text()='Madonna-AV']",
        imgs: () => {
            if (fun.ge(".wp-block-image a[href*=attachment_id]")) {
                return [...fun.gae(".wp-block-image img[data-id]")];
            } else {
                return [...fun.gae(".wp-block-image>a,.mgl-img-container>a,.gallery a")].map(e => e.href);
            }
        },
        button: [4],
        //insertImg: ["//li[img[@id='bigImg']]", 1],
        insertImg: [
            ["div.entry>*:last-child", 2], 2
        ],
        go: 1,
        customTitle: () => fun.geT("h1.entry-title"),
        css: ".single-box{display:none!important}",
        category: "nsfw1"
    }, {
        name: "Chinese Beauties sxchinesegirlz.one sxchinesegirlz01.xyz",
        reg: /sxchinesegirlz(\d+)?\.\w+\/\d+\/\d+\/\d+\/.+\/$/,
        imgs: () => fun.getImg(".wp-block-image img", fun.geT(".pagination>*:last-child", 2), 4),
        button: [4],
        insertImg: [".thecontent", 1],
        customTitle: () => fun.geT("h1.entry-title"),
        category: "nsfw2"
    }, {
        name: "爱看 INS www.ikanins.com",
        reg: /www\.ikanins\.com\/[\w-]+\//,
        imgs: "img[srcset]",
        autoDownload: [0],
        next: "a[rel=prev]",
        prev: "a[rel=next]",
        customTitle: () => fun.geT(".entry-title").replace(/\s?\d+P\s?$/i, "").trim(),
        category: "nsfw1"
    }, {
        name: "Dmmtu 美女图 www.dmmtu.com",
        reg: /www\.dmmtu\.com\/\w+\/\d+\.html/,
        imgs: () => {
            let max = fun.geT("a[title=Page]>b").match(/共(\d+)/)[1];
            return fun.getImg(".main-body img", max, 9);
        },
        button: [4],
        insertImg: [".main-body", 1],
        autoDownload: [0],
        next: "//a[text()='上一组']",
        prev: 1,
        customTitle: () => fun.geT(".main-title"),
        css: ".single .main-body img{max-width:100%!important}",
        category: "nsfw2"
    }, {
        name: "好女神网 www.haonvshen.com",
        reg: /www\.haonvshen\.com\/gallery\/\d+\.html/,
        imgs: () => {
            let max;
            try {
                max = fun.geT(".page").match(/\d+\/(\d+)/)[1];
            } catch (e) {
                max = fun.geT("#pages>*:last-child", 3) || 1;
            }
            return fun.getImg("#hgallery>img,#imgwrap img", max, 9);
        },
        button: [4],
        insertImg: ["#hgallery,#imgwrap", 1],
        customTitle: () => fun.title(" - 第1页-美女图片-好女神网"),
        css: ".f_b_c_d{display:none!important}",
        category: "nsfw1"
    }, {
        name: "Jablehk jablehk.com",
        reg: /jablehk\.com\/\w+/,
        imgs: ".gallery-strips-lightbox-link>img[data-src]",
        button: [4],
        insertImg: [
            [".gallery-strips-wrapper", 2], 2, 2000
        ],
        autoDownload: [0],
        next: ".item-pagination-link--next",
        prev: ".item-pagination-link--prev",
        go: 1,
        customTitle: () => fun.geT("h1>strong"),
        category: "nsfw1"
    }, {
        name: "TangMoc tangmoc.com",
        reg: /^https:\/\/tangmoc\.com\/blog\/show\/\w+\/view/,
        init: async () => {
            fun.remove("//div[@class='row mt-3'] | //div[ins[@class='adsbygoogle']]");
        },
        imgs: () => {
            let pages = fun.ge(".btn-warning+.btn-secondary");
            if (pages) {
                return fun.getImgA("a[href*=media]>.media-preview", "a.btn-secondary");
            } else {
                return [...fun.gae("a[href*=media]>.media-preview")];
            }
        },
        button: [4],
        insertImg: ["//media[article]", 2],
        customTitle: () => fun.geT("h1"),
        category: "nsfw1"
    }, {
        name: "นางแบบคือลือ modelsexyth.com",
        reg: /^https:\/\/modelsexyth\.com\/[^\/]+\/$/,
        imgs: "//img[@decoding] | //a[contains(@class,'e-gallery-item')]",
        button: [4],
        insertImg: [
            ["//div[div[div[img[@decoding]]]]", 0, "//div[img[@decoding] and @class ='elementor-widget-container'] | //div[contains(@class,'elementor-widget-gallery')]"], 2
        ],
        customTitle: () => fun.geT("h1.elementor-heading-title>a").replace(/\(\d+p\)/i, "").trim(),
        css: ".elementor-element-2060f59,.elementor-element-f838527,.elementor-element-988fdac,.elementor-element-3b501ba{display:none!important}#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "nsfw1"
    }, {
        name: "Hot Girl Pix www.hotgirlpix.com",
        reg: /^https:\/\/www\.hotgirlpix\.com\/p\//,
        imgs: () => fun.getImgA("article img", "#singlePostPagination a", 300),
        button: [4],
        insertImg: ["article", 2],
        customTitle: () => fun.geT("#singlePostTitle"),
        css: "#modalAdblock{display:none!important}",
        category: "nsfw1"
    }, {
        name: "LUVBP luvbp.com",
        reg: /^https:\/\/luvbp\.com\/\d+\//,
        exclude: "//a[text()='网盘下载'] | //h4[text()='此文章仅供订阅者阅读']",
        imgs: "figure img",
        button: [4],
        insertImg: [".c-content", 2],
        customTitle: () => fun.geT(".c-post-hero__title"),
        css: "@media(max-width:39.99em){.c-content img{max-width:100%!important}}",
        category: "nsfw1"
    }, {
        name: "自拍图库 自拍图库.com zipaipic.com",
        reg: /^https:\/\/[^\/]+\/content_\d+\.html/i,
        include: "//title[contains(text(),'自拍图库')]",
        imgs: ".showimg",
        button: [4],
        insertImg: ["#imgviewer", 2],
        autoDownload: [0],
        next: "//a[text()='下一组']",
        prev: "//a[text()='上一组']",
        customTitle: () => fun.geT(".ttle").replace(/\n|\d+p/gi, "").trim(),
        referer: "",
        css: "a[rel]{display:none!important}",
        category: "nsfw2"
    }, {
        name: "套圖TAOTU.ORG taotu.org",
        reg: /https?:\/\/(\w{2}\.)?taotu\.org\/[\w-]+\//i,
        include: ".piclist",
        imgs: "a[data-fancybox=gallery]",
        button: [4],
        insertImg: [
            ["#wrapper-footer", 2], 2
        ],
        autoDownload: [0],
        next: ".next a",
        prev: ".prev a",
        customTitle: () => fun.geT(".suit_title>h1").replace(/\d+p/i, "").trim(),
        go: 1,
        category: "nsfw1"
    }, {
        name: "Taotuxp.com www.taotucc.com",
        reg: /www\.taotucc\.com\/\d+\.html/,
        imgs: () => fun.getImg("#post_content img[alt]", fun.geT(".pagelist>*:last-child"), 7),
        button: [4],
        insertImg: ["#post_content", 1],
        autoDownload: [0],
        next: "a[rel=prev]",
        prev: "a[rel=next]",
        customTitle: () => fun.geT("h1"),
        category: "nsfw1"
    }, {
        name: "MM 范 www.95mm.vip",
        reg: /www\.95mm\.\w+\/\d+\.html/,
        init: "$(document).unbind('keydown');$(document).unbind('keyup');",
        imgs: () => {
            let max = fun.geT(".post-title").match(/\/(\d+)/)[1];
            return fun.getImg(".post img[alt]", max, 2);
        },
        button: [4],
        insertImg: [".post", 1],
        autoDownload: [0],
        next: "//div[div[text()='上一组']]/preceding-sibling::div/a",
        prev: "//div[div[text()='下一组']]/preceding-sibling::a",
        customTitle: () => fun.geT(".post-title").replace(/(\d+\/\d+)$/, ""),
        category: "nsfw1"
    }, {
        name: "推图网 https://www.tuiimg.com/meinv/",
        reg: /(www|m)\.tuiimg\.com\/meinv\/\d+\//,
        init: "goshowall();",
        imgs: () => {
            let max = fun.geT("#allbtn").match(/\/(\d+)/)[1];
            let path = fun.ge("#content>img").src.match(/.+\//)[0];
            let arr = [];
            for (let i = 1; i <= max; i++) {
                arr.push(path + i + ".jpg");
            }
            return arr;
        },
        button: [4],
        insertImg: ["#content", 1],
        autoDownload: [0],
        next: "#nextbtn>a",
        prev: "#prebtn>a",
        customTitle: () => fun.geT("#main>h1,.main>h1"),
        category: "nsfw1"
    }, {
        name: "18AV https://18av.mm-cg.com/zh/cg_random/all/index.html",
        reg: /18av\.mm-cg\.com\/(\w{2}\/)?\w+\/\d+\/content\.html|18av\.mm-cg\.com\/.+\.html/,
        include: ".sel_enlarge_page,.sel_enlarge",
        imgs: () => Large_cgurl,
        button: [4],
        insertImg: ["#show_cg_html,#showcg_container", 2],
        customTitle: () => fun.geT('.archive-title>h1,h1').replace(/\s?\[\d+p\]|\s?\(\d+p\)/i, "").trim(),
        category: "nsfw1"
    }, {
        name: "Xgirls xgirlscollection.com img3xgirls.com",
        reg: /(xgirlscollection\.com|img3xgirls\.com)\/(collection|album)\/\d+/,
        imgs: () => fun.getImg("img[id].collection-image,.album-image[data-pin-media]", (fun.geT(".pagination>*:last-child", 2) || 1)),
        button: [4],
        insertImg: ["//div[img[@data-pin-url]]", 1],
        customTitle: () => fun.geT(".container>h1"),
        category: "nsfw1"
    }, {
        name: "SexyAsianGirl www.sexyasiangirl.xyz",
        reg: /www\.sexyasiangirl\.xyz\/album\/\d+\.html/,
        init: () => {
            fun.remove("//article/div[a[img]]");
        },
        imgs: () => {
            let max;
            try {
                max = fun.geT("span.inline-block").match(/\d+$/)[0];
            } catch (e) {
                max = 1;
            }
            return fun.getImg("img.block", max);
        },
        button: [4],
        insertImg: ["//div[img[@title]]", 1],
        customTitle: () => fun.geT("header>h2").replace(/\s?\(\d+\s?photos\s?\)/, "").trim(),
        category: "nsfw2"
    }, {
        name: "福利姬美图 fuligirl.net",
        reg: /fuligirl\.net\/albums\/\d+/,
        imgs: () => fun.getImg("img.block", (fun.geT("a[rel=next]", 2) || 1)),
        button: [4],
        insertImg: ["//div[@class='my-1' and img[@class='block my-1']]", 1],
        customTitle: () => fun.geT("#main h1").replace(/(\d+月\d+打赏群资源)|\[\d+P(\d+v)?-\d+MB\]|\[\d+P\]|\d+mb|\s?\d+p/gi, "").trim(),
        category: "nsfw2"
    }, {
        name: "顶尖美女图 djjpg.com",
        reg: /https?:\/\/djjpg\.com\/\d+.html/,
        imgs: ".post-countent-data img",
        autoDownload: [0],
        next: "//a[div[h5[text()=' 上一篇']]]",
        prev: "//a[div[h5[text()=' 下一篇']]]",
        customTitle: () => fun.geT('.multi-single-header>h1').replace(/\(\d+\/\d+\)|(\s–\s)?\(\d+P\)/i, "").trim(),
        category: "nsfw1"
    }, {
        name: "秀人图吧 www.502x.com",
        reg: /https?:\/\/www\.502x\.com\/\w+\/\d+\.html/,
        button: [4],
        imgs: () => fun.getImg("#image_div img", (fun.geT("a.prev", 2) || 1), 9),
        button: [4],
        insertImg: ["#image_div", 2],
        customTitle: () => fun.geT(".item_title>h1"),
        css: ".affs{display:none!important}",
        category: "nsfw1"
    }, {
        name: "Nude Bird nudebird.biz",
        reg: /nudebird\.biz\/.+\//,
        imgs: ".thecontent a",
        button: [4],
        insertImg: ["//p[a[img]]", 2],
        customTitle: () => fun.geT("h1"),
        category: "nsfw1"
    }, {
        name: "R18 Cosplay r18cosplay.com",
        reg: /r18cosplay\.com\/\?p=\d+/,
        imgs: ".wp-block-image img",
        button: [4],
        insertImg: [
            [".content-inner", 0, ".wp-block-image"], 2
        ],
        customTitle: () => fun.geT(".entry-header>h1"),
        category: "nsfw1"
    }, {
        name: "NUDECOSPLAY nudecosplaygirls.com",
        reg: /nudecosplaygirls\.com\/.+\/$/,
        imgs: ".single-thumb>.wp-post-image,img[class*='wp-image'],.icon-overlay>img[decoding],.msacwl-img,.entry-content>img,.gallery-item img",
        button: [4],
        insertImg: [".entry-content", 2],
        autoDownload: [0],
        next: ".g1-nav-single-next>a",
        prev: ".g1-nav-single-prev>a",
        customTitle: () => fun.geT("h1.entry-title").replace(/“[0-9a-z ]+”/i, "").trim(),
        category: "nsfw2"
    }, {
        name: "Cosplaytele cosplaytele.com",
        reg: /cosplaytele\.com\/[^/]+\//,
        include: "figure.gallery-item",
        imgs: "figure.gallery-item a",
        button: [4, "21%"],
        insertImg: [".gallery", 2],
        customTitle: () => fun.geT("h1.entry-title").replace(/\s?“[^”]+”/, "").trim(),
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "nsfw2"
    }, {
        name: "X Cosplay xcosplay.top",
        reg: /xcosplay\.top\/\d+\/\d+\/\d+\//,
        imgs: ".galeria_img>img",
        button: [4],
        insertImg: [".entry-content", 2],
        autoDownload: [0],
        next: "a[rel=prev]",
        prev: "a[rel=next]",
        customTitle: () => fun.geT("h1.entry-title"),
        category: "nsfw1"
    }, {
        name: "AsiaOnTop asiaon.top",
        reg: /https?:\/\/asiaon\.top\/[^\/]+\/$/,
        include: ".modula-items",
        imgs: "a[data-image-id]",
        button: [4],
        insertImg: [
            [".modula-items", 2], 2
        ],
        autoDownload: [0],
        next: "a#prepost",
        prev: "a#nextpost",
        customTitle: () => fun.geT(".single_post_title_main").replace(":", " -"),
        go: 1,
        category: "nsfw2"
    }, {
        name: "Mitaku mitaku.net",
        reg: /mitaku\.net\/.+\/.+\/$/,
        imgs: () => [...fun.gae(".msacwl-img")].slice(1, -1),
        button: [4],
        insertImg: [
            [".article-content", 2], 2
        ],
        autoDownload: [0],
        next: ".previous>a",
        prev: ".next>a",
        customTitle: () => fun.geT("h1.entry-title"),
        category: "nsfw2"
    }, {
        name: "nudeslegion.com",
        reg: /nudeslegion.com\/[^\/]+\/$/i,
        include: ".msacwl-slider-wrap",
        imgs: () => [...fun.gae(".msacwl-img")].slice(1, -1),
        button: [4],
        insertImg: [
            [".msacwl-slider-wrap", 2], 2
        ],
        customTitle: () => fun.geT("h1.entry-title").replace(/\([\w\/\s]+\)/i, "").trim(),
        css: "footer+script+div[id]{display:none!important}",
        category: "nsfw2"
    }, {
        name: "MrCong.com",
        reg: /mrcong\.com\/.+\//,
        imgs: () => fun.getImg(".entry img[decoding]", fun.geT(".page-link>*:last-child"), 4),
        button: [4],
        insertImg: ["//p[img[@decoding]]", 1],
        customTitle: () => fun.geT("h1").replace(/\(\d+\s?photos?\s?(\+\s?\d+\s?videos?)?\)/gi, "").trim(),
        category: "nsfw1"
    }, {
        name: "Xiuren xiuren.biz",
        reg: /https?:\/\/xiuren\.biz\/[^\/]+\//,
        include: ".content-inner a[data-lbwps-srcsmall]",
        imgs: ".content-inner a[data-lbwps-srcsmall]",
        button: [4],
        insertImg: [".content-inner", 2],
        autoDownload: [0],
        next: "a.post.prev-post",
        prev: "a.post.next-post",
        customTitle: () => fun.geT('h1.jeg_post_title').replace(/\d+P/i, ""),
        category: "nsfw1"
    }, {
        name: "4KHD www.4khd.com www.4kep.com xjav.cc hhhy.quest",
        reg: /(www\.4k(hd|ep)\.com|xjav\.cc|hhhy\.quest)\/\d+\/\d+\/\d+\/.+\.html/,
        imgs: async () => {
            await fun.getNP("#basicExample>a,figure.wp-block-image", ".current+li>a", null, ".page-link-box");
            let mobile = fun.ge("figure.wp-block-image>a");
            if (mobile) {
                return [...fun.gae("figure.wp-block-image>a")];
            } else {
                return fun.getImgA("#gallery a", "#basicExample>a");
            }
        },
        button: [4],
        insertImg: [
            [".page-link-box,.wp-block-post-content>*:last-child,#khd", 1, "#basicExample,.wp-block-image"], 2
        ],
        //autoDownload: [0],
        //next: ".post-navigation-link-previous>a",
        //prev: ".post-navigation-link-next>a",
        customTitle: () => fun.geT("h3.wp-block-post-title").replace(/\[(\d+)?mb-\d+photos\]|\[\d+photos\]|\(\d+8MB\)\(\d+photos\)/i, "").trim(),
        fetch: 1,
        //threading: 4,
        css: ".popup,.wp-container-13{display:none!important}.FullPictureLoadImage{max-width:100%!important}",
        category: "nsfw2"
    }, {
        name: "Buon Dua buondua.com",
        reg: /buondua\.com\/(?!hot|collection)[^\?]+$/,
        imgs: () => {
            let max = fun.geT(".pagination-list>span:last-child>a").match(/\d+/)[0];
            return fun.getImg(".article-fulltext img[alt]", max);
        },
        button: [4],
        insertImg: [".article-fulltext", 1],
        customTitle: () => fun.geT(".article-header>h1").replace(/\(\d+\s?photos\s?\)/i, "").trim(),
        category: "nsfw2"
    }, {
        name: "baobua.com",
        reg: /https?:\/\/baobua\.com\/post\/\w+\.html/i,
        imgs: () => {
            let max;
            try {
                max = fun.geT(".article-header>h1").match(/Page\s?\d+\/(\d+)/i)[1];
            } catch (e) {
                max = 1;
            }
            if (/\?m=1/.test(siteUrl)) {
                return fun.getImg(".contentme img", max, "8");
            } else {
                return fun.getImg(".contentme img", max);
            }
        },
        button: [4],
        insertImg: [".contentme", 2],
        customTitle: () => fun.geT(".article-header>h1").split("|")[0].trim(),
        category: "nsfw2"
    }, {
        name: "BAOBUA.COM",
        reg: /www\.baobua\.net\/post\/.+/,
        imgs: () => fun.getImg(".wp-block-image img[alt]", (fun.geT(".nav-links>*:last-child") || 1), 6),
        button: [4],
        insertImg: [".entry-content.read-details", 2],
        customTitle: () => fun.title("|", 1),
        category: "nsfw2"
    }, {
        name: "blog.baobua.net",
        reg: /(blog|fb|vn)\.baobua\.net\/\w+\/.+/,
        imgs: "a.fancybox",
        button: [4],
        //insertImg: [".article-body", 2],
        insertImg: [
            [".article-body", 2], 2
        ],
        go: 1,
        customTitle: () => fun.title("@BaoBua", 1),
        css: "#fix_scale img:hover{transform:none!important}",
        category: "nsfw2"
    }, {
        name: "HOTGIRLchina hotgirlchina.com theasiagirl.com anhsec.com sex4viet.com cutexinh.com girlxinhxinh.com",
        reg: /(hotgirlchina\.com|theasiagirl\.com|anhsec\.com|sex4viet\.com|cutexinh\.com|girlxinhxinh\.com)\/.+(photos?|videos?|anh)?\/?/,
        include: ".entry-inner img[alt]",
        imgs: () => {
            let max;
            try {
                max = fun.geT("span.pages").match(/\d+$/)[0];
            } catch (e) {
                max = 1
            }
            return fun.getImg(".entry-inner img[alt]", max, 4);
        },
        button: [4],
        insertImg: [
            [".pagination", 1, ".entry-inner>p:not(#FullPictureLoadEnd)"], 2
        ],
        customTitle: () => fun.geT(".post-title").replace(/\(\d+\s?photos\s?\)|(\s?\(\d+\s?photos?\s?\+\s?\d+\s?videos?\))|\([0-9\s]+ảnh[0-9\s\+]+video\)|\([0-9\s]+ảnh\)/i, "").trim(),
        css: ".boxzilla-container{display:none!important}",
        category: "nsfw1"
    }, {
        name: "FoamGirl foamgirl.net",
        reg: /foamgirl\.net\/\d+\.html/,
        imgs: () => {
            let max;
            try {
                max = fun.geT(".mbx-nav-right").match(/\d+\/(\d+)/)[1];
            } catch (e) {
                max = 1;
            }
            return fun.getImg("a.imageclick-imgbox", max, 9);
        },
        button: [4],
        insertImg: [
            ["#image_div>*:last-child", 1, "#image_div br,a.imageclick-imgbox"], 1
        ],
        customTitle: () => fun.geT(".item_title>h1").replace(/\(\d+P\)|\n/gi, ""),
        css: ".affs{display:none!important}",
        category: "nsfw2"
    }, {
        name: "photo.camcam.cc",
        reg: /photo\.camcam\.cc\/[^/]+\/$/,
        imgs: "a.rgg-img",
        button: [4],
        insertImg: [
            [".rgg-imagegrid", 2], 2
        ],
        go: 1,
        next: "a[rel=prev]",
        prev: "a[rel=next]",
        customTitle: () => fun.geT(".page-title").replace(/\[\d+P-?\d+MB?\]/i, "").trim(),
        category: "nsfw2"
    }, {
        name: "Everia.club ",
        reg: /(everia\.club|everiaeveria\.b-cdn\.net)\/\d+\/\d+\/\d+\/[^/]+\//,
        imgs: ".wp-block-image img",
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: () => fun.geT("h1"),
        category: "nsfw2"
    }, {
        name: "Everia club",
        reg: () => {
            if (/^https?:\/\/www\.everiaclub\.com\/.+/.test(siteUrl)) {
                if (!siteUrl.includes(".html")) {
                    return true;
                }
            }
            return false;
        },
        //exclude: ".pagination",
        imgs: ".mainleft img",
        button: [4],
        insertImg: [".mainleft", 2],
        customTitle: () => fun.geT(".mainleft h1"),
        category: "nsfw2"
    }, {
        name: "SexyGirl sexygirl.cc",
        reg: /sexygirl\.cc\/a\/\d+\.html/,
        imgs: "div>img.img-fluid",
        button: [4],
        insertImg: ["//div[img]", 2],
        next: "//a[text()='Previous']",
        prev: "//a[text()='Next']",
        category: "nsfw2"
    }, {
        name: "dongojyousan.com",
        reg: /www\.dongojyousan\.com\/articles\/\w+\.html/i,
        imgs: () => {
            let max;
            try {
                max = fun.geT(".entry-title>a").match(/Page\s1\/(\d+)/)[1];
            } catch (e) {
                max = 1;
            }
            if (/\?m=1/.test(siteUrl)) {
                return fun.getImg(".entry-content img", max, "8");
            } else {
                return fun.getImg(".entry-content img", max);
            }
        },
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: () => fun.geT(".entry-title>a").split("|")[0].trim(),
        category: "nsfw1"
    }, {
        name: "Anh VL xem.anhvl.net",
        reg: /xem\.anhvl\.net\/[^/]+\/$/,
        imgs: () => {
            try {
                let url = location.href;
                let max = fun.geT(".page-links a[onclick]", 2);
                let links = [];
                links.push(url);
                for (let i = 2; i <= max; i++) {
                    links.push(url + "p-" + i);
                }
                return fun.getImgA(".wp-content-ex img[data-src]", links);
            } catch (e) {
                return [...fun.gae(".wp-content-ex img[data-src]")];
            }
        },
        button: [4],
        insertImg: [".wp-content-ex", 2],
        css: "#rtb,.float-ck-center-lt,#popupContact,#backgroundPopupp,.col-9>.col-12{display:none!important}",
        category: "nsfw2"
    }, {
        name: "Anh VL xem.anhvl.net",
        reg: /xem\.anhvl\.net/,
        icon: 0,
        key: 0,
        css: "#backgroundPopupp,#popupContact,.float-ck-center-lt{display:none!important}",
        category: "nsfw2"
    }, {
        name: "Phym18 phym18.org https://phym18.org/tag/%E1%BA%A3nh-sex",
        reg: /phym18\.org\/anh\/[^/]+$/,
        imgs: () => {
            try {
                let url = location.href;
                let max = fun.geT("select>option:last-child").match(/\d+/)[0];
                let links = [];
                links.push(url);
                for (let i = 2; i <= max; i++) {
                    links.push(url + "/phan-" + i);
                }
                return fun.getImgA(".ndtruyen>img", links);
            } catch (e) {
                return [...fun.gae(".ndtruyen>img")];
            }
        },
        button: [4],
        insertImg: [".ndtruyen", 2],
        css: "#wap_bottombanner,#backgroundPopupp,#popupContact{display:none!important}",
        category: "nsfw2"
    }, {
        name: "Porn Pics www.pornpics.com",
        reg: /www\.pornpics\.com\/.*galleries\//,
        imgs: "#tiles a.rel-link",
        button: [4],
        insertImg: ["#main", 0],
        customTitle: () => fun.geT(".title-section h1"),
        category: "nsfw2"
    }, {
        name: "Freebigtit www.freebigtitpornpics.com",
        reg: /www\.freebigtitpornpics\.com\/content\/\d+\//,
        imgs: "//ul[@id='dylan']//a[img[@data-src]]",
        button: [4],
        insertImg: [
            ["#dylan", 2], 1
        ],
        category: "nsfw2"
    }, {
        name: "Freejappic www.freejapanpornpics.com",
        reg: /www\.freebigtitpornpics\.com\/content\/\d+\//,
        imgs: "//ul[@id='dylan']//a[img[@data-src]]",
        button: [4],
        insertImg: [
            ["#dylan", 2], 1
        ],
        category: "nsfw2"
    }, {
        name: "NongMo.Zone www.ilovexs.com",
        reg: /www\.ilovexs\.com\/post_id\/\d+\//,
        imgs: ".separator img",
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: () => fun.geT(".entry-title"),
        category: "nsfw2"
    }, {
        name: "idol.gravureprincess.date",
        reg: /idol\.gravureprincess\.date\/\d+\/\d+\/.+\.html/,
        imgs: ".separator img",
        button: [4],
        insertImg: [".entry-content", 2],
        autoDownload: [0],
        next: "a.blog-pager-older-link",
        prev: "a.blog-pager-newer-link",
        customTitle: () => fun.geT(".post-title"),
        category: "nsfw2"
    }, {
        name: "劍心回憶 https://kenshin.hk/category/jnews/photoalbum/",
        reg: /kenshin\.hk\/\d+\/\d+\/\d+\/[^/]+\/$/,
        include: "//div[@class='entry-utility']/a[1][text()='寫真組圖'] | //div[@class='cat-tags']/a[1][text()='寫真組圖']",
        init: async () => {
            let p = fun.ge("//p[contains(text(),'寫真')]");
            if (p) {
                let tE = fun.ge(".entry-content,.post-page-content");
                tE.parentNode.insertBefore(p, tE);
            }
            let links = [...fun.gae("//a[button[contains(text(),'寫真')]]")].map(e => e.href);
            await fun.getEle(links, ".entry-content>p>img,.post-page-content>p>img,.videoWrapper", ".entry-content,.post-page-content");
        },
        imgs: ".entry-content>img,.post-page-content>img",
        customTitle: () => fun.geT("h1.entry-title,h2.post-title").replace(/【寫真】|\s?\(\d+P,片\)/gi, ""),
        category: "nsfw1"
    }, {
        name: "韩剧组 https://www.hanjuzu.com/hantype/23.html",
        reg: /www\.hanjuzu\.com\/handetail-\d+\.html/,
        imgs: () => {
            let max = fun.geT(".num").match(/\d+\/(\d+)/)[1];
            return fun.getImg(".hl-article-box>img", max, );
        },
        button: [4],
        insertImg: [".hl-article-box", 1],
        autoDownload: [0],
        next: ".hl-next",
        prev: ".hl-prev",
        customTitle: () => fun.geT(".hl-article-title"),
        category: "nsfw1"
    }, {
        name: "J M G T www.qiuyeshudian.com",
        reg: /https:\/\/www\.qiuyeshudian\.com\/[^\/]+\/$/,
        imgs: () => {
            let arr = [...fun.gae(".feature-box img,.entry-content img")].map(e => e.src.replace(/\?w=\d+&ssl=1/, "").replace(/\?resize.+/, ""));
            if (arr.length > 1) {
                return arr;
            } else {
                return [];
            }
        },
        button: [4],
        insertImg: [".entry-content", 2],
        autoDownload: [0],
        next: "a[rel=prev]",
        prev: "a[rel=next]",
        customTitle: () => fun.geT("article h1"),
        category: "nsfw1"
    }, {
        name: "Gravia gravia.site",
        reg: /gravia\.site\/box\/show\.php\?id=\d+$/,
        imgs: ".slideshow .item>img",
        button: [4],
        insertImg: [".slideshow.for_box", 2],
        customTitle: () => fun.geT(".container>h1").replace(/\s?【\d+枚】/, ""),
        css: "img.small{max-width:100% !important;max-height:auto !important}.cmd_bar.wide{display:none!important}",
        category: "nsfw1"
    }, {
        name: "グラビア週刊誌 9 gravurezasshi9.doorblog.jp",
        reg: /gravurezasshi9\.doorblog\.jp\/archives\/\d+\.html(\?ref=)?/,
        imgs: ".article-body-inner>a,#article-contents>a",
        button: [4],
        insertImg: [".article-body-inner,#article-contents", 2],
        autoDownload: [0],
        next: ".original-pager a,li.prev>a,li.prev>span>a",
        prev: ".original-pager li:last-child>a,li.next>a,li.next>span>a",
        customTitle: () => fun.geT("h1.article-title>a,.article-header>h1").trim(),
        category: "nsfw2"
    }, {
        name: "エロ役場 eroyakuba.com",
        reg: /eroyakuba\.com\/[^/]+\/$/,
        imgs: () => {
            return [...fun.gae(".flexitem_content img[srcset],.entry-content img[srcset]")].map(img => {
                if (img.dataset.srcset !== "") {
                    let splitArr = img.dataset.srcset.split(",");
                    splitArr = splitArr.sort((a, b) => {
                        return a.match(/\s(\d+)w/)[1] - b.match(/\s(\d+)w/)[1];
                    });
                    return splitArr.pop().trim().split(" ")[0];
                } else if (img.dataset.src) {
                    return img.dataset.src;
                } else {
                    return null;
                }
            });
        },
        customTitle: () => fun.geT("h1.entry-title"),
        category: "nsfw2"
    }, {
        name: "エロ画像まとめ geinou-nude.com",
        reg: /geinou-nude\.com\/[^/]+\/$/,
        imgs: ".post_content>p>a[href*=uploads]",
        autoDownload: [0],
        next: "a.nav_link_l",
        prev: "a.f_row_r",
        customTitle: () => fun.geT("h1.post_title"),
        category: "nsfw2"
    }, {
        name: "JANidolig janidolig.com",
        reg: /janidolig\.com\/\?p=\d+/,
        imgs: ".entry-content img.size-full",
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: () => fun.geT("h1.entry-title"),
        category: "nsfw2"
    }, {
        name: "Gravure Idols gravureidols.top",
        reg: /gravureidols\.top\/\d+\/\d+\/\d+\/[^/]+\//,
        imgs: ".content-inner p>a",
        autoDownload: [0],
        next: "a.prev-post",
        prev: "a.next-post",
        customTitle: () => fun.geT(".jeg_post_title"),
        category: "nsfw2"
    }, {
        name: "復刻書林 reprint-kh.com",
        reg: /reprint-kh\.com\/archives\/\d+/,
        imgs: async () => {
            await fun.getNP(".gallery-row", "//a[span[text()='次のページ']]");
            return [...fun.gae(".tiled-gallery a")];
        },
        button: [4],
        insertImg: [
            [".single-post-main>.share,.single-post-main .content", 2], 2
        ],
        go: 1,
        autoDownload: [0],
        next: ".previous_post>a",
        prev: ".next_post>a",
        customTitle: () => fun.geT(".single-post-title").replace(/\d+photos/, "").trim(),
        category: "nsfw2"
    }, {
        name: "マブい女画像集 mabui-onna.com",
        reg: /^https:\/\/mabui-onna\.com\/blog-entry-\d+\.html/,
        imgs: ".topentry_text div>a:not([href*='.html']),.entry_body div>a:not([href*='.html'])",
        button: [4],
        insertImg: [".topentry_text,.entry_body", 2],
        autoDownload: [0],
        next: "a.pager_next,.next_entry>a",
        prev: "a.pager_prev,.prev_entry>a",
        customTitle: () => fun.geT(".topentry_title span,.entry_title h1>strong").replace(/\d+枚/, "").replace(/\s\s/g, " ").trim(),
        category: "nsfw1"
    }, {
        name: "ドッグ速報 dog-sokuhou.com",
        reg: /^https:\/\/dog-sokuhou\.com\/archives\/\d+\/[^\/]+\//,
        imgs: ".eye-catch>img,.wp_rss_scrapeing_post-content div>a",
        button: [4],
        insertImg: [".wp_rss_scrapeing_post-content", 2],
        customTitle: () => fun.geT(".entry-title").replace(/\d+枚/, "").replace(/\s\s/g, " ").trim(),
        css: "#oxzilla-overlay,boxzilla-overlay{display:none!important}",
        category: "nsfw1"
    }, {
        name: "IVPhoto_Gravure ivphoto.tistory.com",
        reg: /ivphoto\.tistory\.com\/(m\/)?\d+/,
        imgs: ".imageblock img",
        button: [4],
        insertImg: [".entry-content,.blogview_content", 2],
        customTitle: () => fun.geT('.tit_blogview,.hgroup h1').replace(/\[\d+p\]/i, "").trim(),
        category: "nsfw1"
    }, {
        name: "MIC MIC IDOL www.micmicidol.club",
        reg: /www\.micmicidol\.club\/\d+\/\d+\/.+\.html/,
        init: () => {
            [...fun.gae("iframe[title]")].forEach(e => {
                let x = fun.ge(".entry-content");
                x.parentNode.insertBefore(e, x);
            });
        },
        imgs: async () => {
            let srcArr = [...fun.gae(".entry-content a[href]")].map(a => a.href);
            let firstSrcArr = srcArr[0].split("/");
            if (firstSrcArr.length === 9) {
                firstSrcArr[7] = "s11200";
                let testMaxSrc = firstSrcArr.join("/");
                let obj = await fun.checkImgStatus(testMaxSrc);
                debug("\n確認圖片狀態\n", obj);
                if (obj.ok) {
                    srcArr = srcArr.map(src => {
                        let arr = src.split("/");
                        arr[7] = "s11200";
                        return arr.join("/");
                    });
                    return srcArr;
                } else {
                    return srcArr;
                }
            } else {
                return srcArr;
            }
        },
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: () => fun.geT(".entry-title").trim(),
        css: ".post img{max-width:100% !important}.post-body{margin:0px!important;}",
        category: "nsfw2"
    }, {
        name: "MIC MIC IDOL www.micmicidol.club micmicunc unc.micmicdoll.com 分類自動翻頁",
        reg: /^https:\/\/www\.micmicidol\.club\/(\?m=1)?$|^https:\/\/www\.micmicidol\.club\/search|^https:\/\/unc\.micmicdoll\.com\/(\?m=1)?$|^https:\/\/unc\.micmicdoll\.com\/search/,
        icon: 0,
        key: 0,
        init: () => {
            if (siteUrl.includes("unc.micmicdoll.com")) {
                setTimeout(() => {
                    [...document.querySelectorAll("a[href*='www.micmicdoll.com']")].forEach(a => {
                        a.href = a.href.replace("www.micmicdoll.com", "unc.micmicdoll.com");
                    });
                }, 1000);
                fun.css(".autoPagerTitle{width:950px!important}");
            }
        },
        autoPager: {
            //mode: 1,
            ele: ".blog-posts",
            next: "a.blog-pager-older-link",
            http: "https",
            observer: ".blog-posts",
            re: "#blog-pager",
            stop: () => {
                let ele = fun.ge(".date-outer", doc);
                if (!ele) {
                    return true
                }
                return false
            },
            history: 1,
            aF: () => {
                [...fun.gae("//div[@class='snips-image']/a[not(img)]")].forEach(a => {
                    let script = fun.ge("script", a);
                    if (script) {
                        let code = script.innerText;
                        if (/document\.write/.test(code)) {
                            let arr = code.split('"');
                            let url = arr[1];
                            let alt = arr[3];
                            let img = new Image();
                            img.src = url.replace("/s72-c/", "/w400/").replace("=s72-c", "=w400");
                            img.alt = alt;
                            script.parentNode.insertBefore(img, script.nextSibling);
                        }
                    }
                });
            },
            title: () => {
                let num;
                if (/start=/.test(nextLink)) {
                    if (siteUrl.includes("unc.micmicdoll.com")) {
                        num = parseInt(nextLink.match(/start=(\d+)/)[1])
                        if (num % 2 == 0) {
                            num = num / 50 + 1;
                        } else {
                            num = num / 39 + 1;
                        }
                    } else {
                        num = parseInt(nextLink.match(/start=(\d+)/)[1]) / 50 + 1;
                    }
                } else {
                    num = 1;
                }
                return doc.title + ` - Page ${num}`;
            }
        },
        openInNewTab: ".date-outer a[href]",
        category: "autoPager"
    }, {
        name: "Kemono https://kemono.party/fantia/user/17148/post/1633768 coomer.party",
        reg: /(kemono\.party|kemono\.su|coomer\.party)\/.+post/,
        imgs: "a.fileThumb.image-link",
        button: [4],
        insertImg: [".post__files", 2],
        autoDownload: [0],
        next: "a.next",
        prev: "a.prev",
        customTitle: () => fun.geT(".post__title"),
        threading: 4,
        category: "nsfw2"
    }, {
        name: "半次元 bcy.net",
        reg: /bcy\.net\/item\/detail\/\d+\?_source_page=\w+/,
        imgs: ".inner-container img",
        customTitle: () => fun.title(" - ", 1),
        category: "none"
    }, {
        name: "套图之家 taotuhome.com",
        reg: /taotuhome\.com\/\d+\.html/i,
        imgs: () => fun.getImg(".single-content img[alt]", (fun.geT(".page-links>*:last-child", 2) || 1), 7),
        button: [4],
        insertImg: [".single-content", 1],
        autoDownload: [0],
        next: "a[rel=prev]:not([href^=j])",
        prev: "a[rel=next]:not([href^=j])",
        customTitle: () => fun.geT('.entry-title').replace("-套图之家", ""),
        category: "nsfw1"
    }, {
        name: "俊美图 www.meijuntu.com www.junmeitu.com www.jeya.de www.jeya.jp",
        reg: /(www\.meijuntu\.com|www\.junmeitu\.com|www\.jeya\.\w+)\/\w+\/\w+\.html/i,
        imgs: () => fun.getImg(".pictures img[alt]", (fun.geT("#pages>*:last-child", 2) || 1), 5),
        button: [4],
        insertImg: [".pictures", 1],
        autoDownload: [0],
        next: "//span[contains(text(),'下一')]/following-sibling::a",
        prev: "//span[contains(text(),'上一')]/following-sibling::a",
        customTitle: () => fun.geT("h1.title"),
        category: "nsfw1"
    }, {
        name: "x6o https://x6o.com/topics/14#articles",
        reg: /(www\.)?x6o\.com\/articles\/\d+/,
        delay: 500,
        imgs: ".content img",
        button: [4],
        insertImg: [".content", 2, 2000],
        customTitle: () => fun.geT("h1.title").replace(/\[\d+P-\d+MB\]|\[\d+P\]|\s?\d+P$/gi, "").trim(),
        category: "nsfw2"
    }, {
        name: "妹子图 mt316.com",
        reg: /mt316\.com\/\w+\/\d+\.html/,
        imgs: ".m-list-content img",
        button: [4],
        insertImg: [".m-list-content", 1],
        autoDownload: [0],
        next: ".sxpage_l>a",
        prev: 1,
        customTitle: () => fun.geT(".m-list-tools>h2").replace(/\/?\(\d+P\)/i, "").trim(),
        css: ".m-list-content img{max-width:100%!important}",
        category: "nsfw1"
    }, {
        name: "硬盘少女 diskgirl.com",
        reg: /diskgirl\.com\/image\/\w+/,
        imgs: "a[data-fancybox]",
        button: [4],
        insertImg: [
            [".flexauto>*:last-child", 1, "a[data-fancybox]"], 2
        ],
        customTitle: () => fun.geT(".image-title").replace(/\[\d+(\+\d+)?PB?\]|\(\d+(\+\d+)?PB?\)/i, ""),
        category: "nsfw1"
    }, {
        name: "心动美图 www.wai76.com",
        reg: /https:\/\/www\.wai\d+\.com\/[^\/]+\//,
        include: ".entry-content div[data-src]",
        imgs: () => fun.getImgA(".entry-content div[data-src]", ".page-links a"),
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: () => fun.geT(".entry-title"),
        category: "nsfw1"
    }, {
        name: "美女库 www.meinvku.org.cn",
        reg: /www\.meinvku\.org\.cn\/album\/\d+(\/)?(\.html)?$/,
        imgs: async () => {
            let firstImg = fun.ge("#img_src img").src;
            let path = firstImg.match(/.+\//)[0];
            let arr = [];
            let max = fun.geT("//span[contains(text(),'页次')]").match(/\/(\d+)/)[1];
            for (let i = 1; i <= max; i++) {
                arr.push(path + i + ".jpg");
            }
            let a = fun.ge("#img_src");
            if (a) {
                a.outerHTML = `<div class="CustomPictureBox">${fun.ge("img", a).outerHTML}</div>`;
            }
            return arr;
            /*
            let links = [];
            let url = location.href;
            links.push(url);
            let max = fun.geT("//span[contains(text(),'页次')]").match(/\/(\d+)/)[1];
            for (let i = 2; i <= max; i++) {
                links.push(url + "/page/" + i + ".html");
            }
            return fun.getImgA(".post-content img", links);
            */
            /*
            await fun.getNP(".CustomPictureBox img,#img_src img", ".pagination li.active+li>a", null, ".pagination", 0, null, 0);
            return [...fun.gae(".CustomPictureBox img")];
            */
        },
        button: [4],
        insertImg: [".CustomPictureBox", 1],
        css: ".CustomPictureBox>img{max-width:100%}",
        category: "nsfw1"
    }, {
        name: "图宅网 www.tuzac.com dev.tuzac.com 咔咔西三 www.kkc3.com YouFreeX www.youfreex.com",
        reg: /(www\.tuzac\.com|dev\.tuzac\.com|www\.kkc3\.com|www\.youfreex\.com)\/file\/.+/,
        imgs: async () => {
            let a = fun.ge("#the-photo-link");
            if (a) {
                a.outerHTML = a.innerHTML;
            }
            await fun.getNP("#fdp-photo img,#fdp-photo-old img,.file-detail img", ".page-curr+a", null, "#pager", 0, null, 0);
            return [...fun.gae("#fdp-photo img,#fdp-photo-old img,.file-detail img")];
        },
        button: [4, "22%"],
        insertImg: ["#task,#fdp-photo,#fdp-photo-old", 2],
        customTitle: () => fun.geT(".fc-text-content>h1").replace(/(\[\d+P\]|\n|\(\d+P\))/gi, "").trim(),
        css: ".content-container .content{margin-right:0px!important}.fdp-click-area,.ad-side-right,.footer{display:none!important}",
        category: "nsfw2"
    }, {
        name: "七仙子图片 www.qixianzi.com",
        reg: /www\.qixianzi\.com\/\w+\/\d+\.html$/,
        imgs: async () => {
            let a = fun.ge(".picture_content>a");
            a.outerHTML = a.innerHTML;
            await fun.getNP(".picture_content img", "//a[text()='下一页']", null, ".pagination", 0, null, 0);
            return [...fun.gae(".picture_content img")];
        },
        button: [4],
        insertImg: [".picture_content", 2],
        next: "//li[contains(text(),'上一篇')]/a",
        prev: "//li[contains(text(),'下一篇')]/a",
        customTitle: () => fun.geT("h1.diy-h1").replace(/\d+p/i, "").trim(),
        category: "nsfw1"
    }, {
        name: "七仙子图片M www.qixianzi.com/e/wap/",
        reg: /www\.qixianzi\.com\/e\/wap\/show\.php\?/,
        imgs: ".arcmain img",
        button: [4],
        insertImg: [".arcmain", 1],
        customTitle: () => fun.geT(".header>span"),
        category: "nsfw1"
    }, {
        name: "嘿~色女孩 heysexgirl.com",
        reg: /heysexgirl\.com\/archives\/\d+$/,
        imgs: async () => {
            let max = fun.geT(".page-links>*:last-child");
            return fun.getImg(".entry-content p>a,.entry-content p>img", max, "4");
        },
        button: [4],
        insertImg: [".entry-container", 2],
        autoDownload: [0],
        next: ".nav-previous>a",
        prev: ".nav-next>a",
        customTitle: () => fun.geT("h1.page-title"),
        category: "nsfw2"
    }, {
        name: "2LSP 2lsp.xyz",
        reg: /2lsp\.xyz\/[^/]+\/$/,
        include: ".entry-content img[data-srcset]",
        exclude: ".content-hide-tips",
        observerClick: ".swal2-close",
        imgs: () => [...fun.gae(".entry-content img[data-srcset]")].map(e => e.dataset.srcset),
        button: [4],
        insertImg: [".entry-content", 2],
        autoDownload: [0],
        next: ".article-nav-prev>a",
        prev: ".article-nav-next>a",
        customTitle: () => fun.geT("h1.entry-title"),
        category: "nsfw1"
    }, {
        name: "2LSP 2lsp.xyz",
        reg: /2lsp\.xyz\//,
        icon: 0,
        key: 0,
        observerClick: ".swal2-close",
        category: "nsfw1"
    }, {
        name: "性趣套图 myjkwd.com 534798.xyz H漫画 123548.xyz",
        reg: /(myjkwd\.com|534798\.xyz|123548\.xyz)\/e\/action\/ShowInfo\.php/i,
        include: ".entry img",
        imgs: () => fun.getImg(".entry img", fun.geT("a[title=总数]"), 8),
        button: [4],
        insertImg: ["//div[@class='entry']//img/parent::*", 1],
        autoDownload: [0],
        next: "//p[contains(text(),'上一')]/a",
        prev: "//p[contains(text(),'下一')]/a",
        customTitle: () => fun.geT(".contitle"),
        css: "aside.side{display:none!important;}.main-content{margin-left:0px!important;}body{background:#EDEDED!important;}",
        category: "nsfw2"
    }, {
        name: "苍井优图片 www.28tyu.com www.28wer.com sldlxz.com",
        reg: /(www\.(\d+tyu|\d+wer)\.com|sldlxz\.com)\/e\/action\/ShowInfo\.php/i,
        imgs: "img[id^='aimg'],.entry img",
        button: [4],
        insertImg: [".entry", 2],
        autoDownload: [0],
        next: "//p[contains(text(),'上一')]/a",
        prev: "//p[contains(text(),'下一')]/a",
        customTitle: () => fun.geT(".contitle").replace(/【\d+P】|\(\d+P\)/i, "").trim(),
        category: "nsfw2"
    }, {
        name: "YY美女图片 www.yyzhenshun.com 美眉大宝贝 www.mmdabaobei.com",
        reg: /(www\.yyzhenshun\.com|www.mmdabaobei\.com)\/\d+\.html/i,
        imgs: ".wzy_body img[alt]",
        button: [4, "22%"],
        insertImg: ["//p[img] | //p[strong[img]]", 2],
        autoDownload: [0],
        next: "//li[contains(text(),'上一篇')]/a",
        prev: "//li[contains(text(),'下一篇')]/a",
        customTitle: () => fun.geT(".wzy_tit"),
        css: "body>section[id],a[href*=download]{display:none!important}header{margin-top:0px!important}",
        category: "nsfw1"
    }, {
        name: "羞涩姬 xiuseaa.com xiusea.com",
        reg: /(xiuseaa?\.com)\/index\.php\/art\/detail\/id\/\d+\.html$/i,
        imgs: ".embed-responsive>img,.embed-responsive P>img",
        button: [4],
        insertImg: [".embed-responsive", 2],
        customTitle: () => fun.geT("h1.h3").replace(/\[\d+P\]/i, ""),
        category: "nsfw2"
    }, {
        name: "爱看美图网 www.ikmt.net m.ikmt.net",
        reg: /(www|m)\.ikmt\.net\/\w+\/\w+\/\d+\/\d+\.html/i,
        imgs: () => {
            let mouse_page = fun.ge("#mouse_page");
            if (mouse_page) {
                let max = fun.geT("//li[a[text()='下一页']]", 2) || fun.geT("//a[text()='下一张']", 2).match(/\/(\d+)/)[1];
                return fun.getImg("#picBody img,.post-content img", max, 9);
            } else {
                return [...fun.gae("#picBody img,.post-content img")];
            }
        },
        button: [4],
        insertImg: ["#picBody,.post-content", 2],
        autoDownload: [0],
        next: "//div[contains(text(),'上一篇')]/a",
        prev: "//div[contains(text(),'下一篇')]/a",
        customTitle: () => fun.geT(".articleV2Title>h1,.mm-title"),
        css: ".articleV2Body img{max-width:100% !important}",
        category: "nsfw1"
    }, {
        name: "妮兔美图 www.nitutu.com m.nitutu.com",
        reg: /(www|m)\.nitutu\.com\/\w+\/\w+\/\d+\.html/i,
        imgs: () => fun.getImg(".pic-body img,.picshow-second img", totalpage, 9),
        button: [4],
        insertImg: [".pic-body,.picshow-second", 2],
        autoDownload: [0],
        next: "//li[@class='next']/a | //a[text()='下一篇']",
        prev: "//li[@class='prev']/a | //a[text()='上一篇']",
        customTitle: () => fun.geT(".pictitle>h1,.picart-title").replace(/\[\d+P\]/i, ""),
        category: "nsfw1"
    }, {
        name: "犀牛图片网 www.xintp.com",
        reg: /www\.xintp\.com\/(\w+\/\w+\/\d+\.html|\w+\/\d+\.html)/i,
        imgs: async () => {
            let page = fun.ge(".page-links");
            if (page) {
                /*
                let max = fun.geT(".page-links>a.post-page-numbers:last-child", 2);
                return fun.getImg(".single-content img", max, 7)
                */
                await fun.getNP(".single-content img", "//span[@class='post-page-numbers current']/following-sibling::a[span][1]", null, ".page-links");
                return [...fun.gae(".single-content img")];
            } else {
                return [...fun.gae(".single-content img")];
            }
        },
        button: [4],
        insertImg: [
            [".single-content", 0, ".wp-block-image,.single-content>p~p:not(#FullPictureLoadEnd)"], 2
        ],
        customTitle: () => fun.geT(".entry-title"),
        css: ".header-sub,.tg-box{display:none!important}",
        category: "nsfw1"
    }, {
        name: "小姐姐图库 xjjtk.link",
        reg: /xjjtk\.link\/posts\/\w+\/$/i,
        imgs: "img.block",
        button: [4],
        insertImg: ["//div[img]", 2],
        customTitle: () => fun.geT("h1"),
        category: "nsfw2"
    }, {
        name: "AVJB https://avjb.com/albums/",
        reg: /https?:\/\/(avjb\.com|avjb\.fun|av\d{2}\.fun|bav\d{2}\.xyz|bbav\d{3}\.com|onebookcms\.com)\/(\w{2}\/)?albums\/\d+\/[\w-]+\/$/i,
        imgs: ".images>a",
        button: [4],
        insertImg: [
            [".images", 2], 2
        ],
        go: 1,
        customTitle: () => fun.geT(".headline>h1"),
        css: ".sponsor{display:none!important}",
        category: "nsfw2"
    }, {
        name: "Asian To Lick asiantolick.com",
        reg: /asiantolick\.com\/post/,
        imgs: "div[data-src]",
        button: [4],
        insertImg: [
            ["#categoria_tags_post", 1], 2
        ],
        go: 1,
        customTitle: () => fun.geT("h1"),
        css: "#touch_to_see{display:none!important}",
        category: "nsfw2"
    }, {
        name: "Models Vibe www.modelsvibe.com",
        reg: /https?:\/\/www\.modelsvibe\.com\/[^/]+\/$/,
        init: () => {
            let ele = fun.ge("//p[br and not(contains(text(),'[ad_1]'))]");
            if (ele) {
                ele = ele.cloneNode(true);
                ele.querySelectorAll("img").forEach(img => {
                    img.remove();
                });
                let tE = fun.ge(".td-post-content");
                tE.parentNode.insertBefore(ele, tE);
            }
            let ele2 = fun.ge("//p[contains(text(),'Number of pictures')]");
            if (ele2) {
                if (ele2.previousSibling.tagName == "P") {
                    ele2.previousSibling.innerHTML = ele2.previousSibling.innerHTML + "<br>" + ele2.innerText;
                    let e = ele2.previousSibling;
                    let te = ele2.previousSibling.parentNode;
                    te.parentNode.insertBefore(e, te);
                }
            }
        },
        imgs: () => {
            if (fun.ge(".page-nav")) {
                let max = fun.geT(".page-nav>*:last-child", 2);
                return fun.getImg(".td-post-content img", max, 4);
            } else if (fun.ge(".td-post-content img[srcset]")) {
                let srcs = [...fun.gae(".td-post-content img[src]")].map(e => e.src);
                let srcsets = [...fun.gae(".td-post-content img[srcset]")].map(img => {
                    let splitArr = img.getAttribute("srcset").split(",");
                    splitArr = splitArr.sort((a, b) => {
                        return a.match(/\s(\d+)w/)[1] - b.match(/\s(\d+)w/)[1];
                    });
                    return splitArr.pop().trim().split(" ")[0];
                });
                return [...new Set(srcs.concat(srcsets))];
            } else {
                return [...fun.gae(".td-post-content img")];
            }
        },
        button: [4],
        insertImg: [".td-post-content .tdb-block-inner", 2],
        go: 1,
        customTitle: () => fun.geT("h1.tdb-title-text"),
        category: "nsfw1"
    }, {
        name: "Models Vibe www.modelsvibe.com 分類自動翻頁",
        reg: /https:\/\/www\.modelsvibe\.com\/(albums\/.+)?(page\/\d+\/)?$/,
        icon: 0,
        key: 0,
        init: () => {
            if (/page\/\d+\//.test(location.pathname)) {
                currentPageNum = parseInt(location.pathname.match(/\/page\/(\d+)/)[1]);
            } else {
                currentPageNum = 1;
            }
        },
        autoPager: {
            ele: ".td_flex_block:not(.td-flex-radius),.td_block_inner.tdb-block-inner",
            observer: ".td_flex_block:not(.td-flex-radius),.td_block_inner.tdb-block-inner",
            next: () => {
                let url = location.href.replace(/page\/\d+\/?/, "") + `page/${currentPageNum += 1}/`;
                return url;
            },
            stop: () => {
                let error = fun.ge(".td-404-title", doc);
                if (error) {
                    return true;
                }
                return false;
            },
            history: 1,
            bF: () => {
                [...fun.gae("span[data-img-url]", doc)].forEach(span => {
                    span.classList.add("td-animation-stack-type0-2");
                    span.style.backgroundImage = `url('${span.dataset.imgUrl}')`;
                });
            },
            title: () => {
                return doc.title.replace(" - Models Vibe", "").replace(/\s-\sPage\s\d+/, "") + ` - Page ${currentPageNum}`;
            }
        },
        openInNewTab: ".td-module-thumb>a",
        category: "autoPager"
    }, {
        name: "goddess247.com",
        reg: /goddess247\.com\/.+\//,
        imgs: ".elementor-widget-container p img[alt]",
        button: [4],
        insertImg: ["//p[img]", 2],
        customTitle: async () => {
            let ele = "#content h1.elementor-heading-title";
            await fun.waitEle(ele);
            return fun.geT(ele);
        },
        category: "nsfw1"
    }, {
        name: "BestGirlSexy bestgirlsexy.com",
        reg: /bestgirlsexy\.com\/.+\//,
        imgs: ".elementor-widget-theme-post-content img",
        button: [4],
        insertImg: ["//p[img]", 2],
        customTitle: async () => {
            let ele = "#content h1.elementor-heading-title";
            await fun.waitEle(ele);
            return fun.geT(ele);
        },
        category: "nsfw1"
    }, {
        name: "PhimVu m.phimvuspot.com",
        reg: /m\.phimvuspot\.com\/\d+\/\d+\/[\w-]+\.html/,
        imgs: ".separator>a",
        button: [4],
        insertImg: [".post-content", 2],
        customTitle: () => fun.geT("h1.post-title").replace(/\s?\(\d+\s?photos(\s?\+\s?\d+\s?videos?)?\)/i, ""),
        category: "nsfw1"
    }, {
        name: "Chinese Nude Art Photos chinesenudeart.blogspot.com",
        reg: /^https?:\/\/chinesenudeart\.blogspot\.com\/\d+\/\d+\/[\w-]+\.html/i,
        imgs: ".entry-content a[href]",
        button: [4],
        insertImg: [".entry-content", 2],
        autoDownload: [0],
        next: "a.blog-pager-older-link",
        prev: "a.blog-pager-newer-link",
        customTitle: () => fun.geT("h1.entry-title").trim().replace("Chinese beautiful model Amanda -", "").replace("Beautiful Chinese girl -", "").replace("Beautiful Chinese girl ", "").replace("Chinese Beautiful girl -", "").replace(" |18+ Nude model Amateur", ""),
        category: "nsfw1"
    }, {
        name: "CUTE GIRLS ADDICT cutegirlsaddict.blogspot.com",
        reg: /cutegirlsaddict\.blogspot\.com\/\d+\/\d+\/[a-z0-9-]+\.html/i,
        imgs: async () => {
            let srcArr = [...fun.gae(".separator>a")].map(a => a.href);
            let firstSrcArr = srcArr[0].split("/");
            if (firstSrcArr.length === 9) {
                firstSrcArr[7] = "s11200";
                let testMaxSrc = firstSrcArr.join("/");
                let obj = await fun.checkImgStatus(testMaxSrc);
                debug("\n確認圖片狀態\n", obj);
                if (obj.ok) {
                    srcArr = srcArr.map(src => {
                        let arr = src.split("/");
                        arr[7] = "s11200";
                        return arr.join("/");
                    });
                    return srcArr;
                } else {
                    return srcArr;
                }
            } else {
                return srcArr;
            }
        },
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: () => fun.geT("h1.post-title,h3.entry-title").trim(),
        category: "nsfw1"
    }, {
        name: "4KUP 4kup.net",
        reg: /https:\/\/4kup\.net\/(?!getlink)[^\/]+\/$/,
        exclude: "//button[text()='Click here to continue']",
        imgs: "a.thumb-photo",
        button: [4],
        insertImg: ["#gallery", 2],
        go: 1,
        autoDownload: [0],
        next: "a[rel=prev]",
        prev: "a[rel=next]",
        customTitle: () => fun.geT(".entry-title"),
        category: "nsfw2"
    }, {
        name: "Fliporn fliporn.biz",
        reg: /fliporn\.biz\/videos\//,
        include: "//span[@class='entry-category']/a[text()='亚洲贴图' or text()='写真' or text()='动漫贴图' or text()='性感贴图' or text()='欧美贴图' or text()='网友自拍']",
        imgs: () => {
            return [...fun.gae(".entry-content img")].map(e => {
                if (e.dataset.src) {
                    return e.dataset.src.replace(/\?w=858(&ssl=1)?/, "");
                } else {
                    return e.src.replace("%3C/center%3E%3C/p%3E%3Cdiv%20class=", "").replace(/\?w=858(&ssl=1)?/, "");
                }
            });
        },
        button: [4],
        insertImg: ["//center[img] | //center[p[img]]", 2],
        customTitle: () => document.title.replace(/\s?\[[0-9p\s]+\]|\[\d+P\]/i, "").trim(),
        category: "nsfw2"
    }, {
        name: "人妻租借所 jingunav.info",
        reg: /jingunav\.info\/index\.php\/artdetail-\d+\.html/,
        imgs: ".embed-responsive img",
        button: [4],
        insertImg: [".embed-responsive", 2],
        customTitle: () => fun.title(/ - 貼圖| - 歐美美女/, 1).replace(/【\d+P】\s?\n?/i, "").replace(/\s?完整版無水印寫真/, ""),
        css: "body>.wrap{display:none!important}.player	img{max-width:100% !important}",
        category: "nsfw2"
    }, {
        name: "ACGN小鎮 www.bbsacgn.com",
        reg: /www\.bbsacgn\.com\/archives\/\d+/,
        imgs: ".entry-content img",
        button: [4],
        insertImg: ["//p[img]", 2],
        autoDownload: [0],
        next: ".entry-page-prev",
        prev: ".entry-page-next",
        customTitle: () => fun.geT("h1.entry-title"),
        category: "nsfw1"
    }, {
        name: "皮皮动漫社 pipidm.top www.pipidm.top",
        reg: /pipidm\.top\/\d+\.html/,
        imgs: ".content_left img",
        button: [4],
        insertImg: ["//p[img]", 2],
        autoDownload: [0],
        next: ".entry-page-prev",
        prev: ".entry-page-next",
        customTitle: () => fun.geT("h1.entry-title"),
        category: "nsfw1"
    }, {
        name: "成人图片 Qinimg www.qinimg.com",
        reg: /www\.qinimg\.com\/image\/\d+\.html/,
        imgs: "#image a",
        button: [4],
        insertImg: [
            ["#image", 2], 2
        ],
        go: 1,
        customTitle: () => fun.geT(".box>h1").replace(/\[\d+P\]/i, "").trim(),
        category: "nsfw2"
    }, {
        name: "零零COS 00cos.com",
        reg: /00cos\.com\/\d+\.html/,
        exclude: ".tinymce-hide,.fa-info-circle[aria-hidden=true]",
        imgs: ".article-content img",
        customTitle: () => fun.geT(".article-title>a").replace(/\s?\[\d+P-\d+MB\]|\s\[\d+P\s?\d+V\s?\d+M\]\s?/gi, "").trim(),
        category: "nsfw1"
    }, {
        name: "Elite Babes www.elitebabes.com PmateHunter pmatehunter.com www.jperotica.com www.metarthunter.com www.femjoyhunter.com",
        reg: /(www\.)?(elitebabes|pmatehunter|jperotica|metarthunter|femjoyhunter)\.com\/.+\//,
        exclude: "#content video",
        imgs: ".list-gallery a[data-fancybox]",
        button: [4, "23%"],
        insertImg: [
            [".list-gallery", 2], 2
        ],
        go: 1,
        customTitle: () => fun.geT("#content>p"),
        category: "nsfw2"
    }, {
        name: "FreeXcafe www.freexcafe.com",
        reg: /www\.freexcafe\.com\/erotica\/[\w-]+\/[\w-]+\/index\.php/,
        imgs: () => fun.getImgA("#imagelink>img", ".thumbs>a", 500),
        button: [4],
        insertImg: [
            ["#content>*:last-child", 2], 2
        ],
        go: 1,
        category: "nsfw2"
    }, {
        name: "EPORNER Photo www.eporner.com/profile/namaiki/ www.eporner.com/profile/janekhansen/",
        reg: /\w{2,3}\.eporner\.com\/gallery\/.+\//,
        imgs: () => [...fun.gae("#container img")].map(e => e.src.replace("_296x1000", "")),
        button: [4],
        insertImg: [
            [".photosgrid", 2], 2
        ],
        go: 1,
        customTitle: () => fun.geT("#galleryheader>h1"),
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "nsfw2"
    }, {
        name: "Xasiat www.xasiat.com/albums/ https://www.xasiat.com/albums/3346/sidam-yeeun-vol-001-event/",
        reg: /www\.xasiat\.com\/([\w]{2}\/)?albums\/\d+\/[\w-]+\//i,
        init: () => {
            fun.gae("img.thumb[data-original]").forEach(img => {
                img.src = img.dataset.original;
            });
            fun.remove(".sponsor,.footer-margin");
        },
        imgs: ".images>a",
        button: [4],
        insertImg: [
            [".album-holder", 2], 2
        ],
        go: 1,
        customTitle: () => fun.geT(".headline>h1"),
        css: ".block-album{display:block!important}.block-album>.table,.footer~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(.fancybox-container){display:none!important}",
        category: "nsfw2"
    }, {
        name: "Xasiat loadMore www.xasiat.com/albums/",
        reg: /www\.xasiat\.com\/albums\//,
        icon: 0,
        key: 0,
        include: "#list_albums_common_albums_list_pagination",
        init: () => {
            setInterval(() => {
                fun.remove("//div[iframe] | //iframe");
                if (document.body.getAttribute("class").length > 13) {
                    document.body.setAttribute("class", "big-container");
                }
            }, 500);
        },
        observerClick: ".load-more>a",
        category: "nsfw2"
    }, {
        name: "Xasiat https://www.xasiat.com/albums/",
        reg: /(www\.xasiat\.com\/albums\/$|www\.xasiat\.com\/albums\/categories\/)/,
        icon: 0,
        key: 0,
        init: () => {
            fun.gae("img.thumb[data-original]").forEach(img => {
                img.src = img.dataset.original;
            });
            fun.remove(".footer~*", 2000);
        },
        css: ".footer~*{display:none!important}",
        category: "nsfw2"
    }, {
        name: "xHamster gallery xhamster.com/users/eros721_official/photos",
        reg: /xhamster\.com\/photos\/gallery\/[^/]+$/,
        include: ".gallery-section",
        imgs: async () => {
            await fun.getNP(".photo-thumb", "//div[@class='gallery-section']//li[a[contains(@class,'active')]]/following-sibling::li[1]/a", null, ".gallery-section .pager-section");
            [...fun.gae(".photo-thumb")].forEach(ele => {
                let width, height;
                if (parseInt(ele.dataset.w) > parseInt(ele.dataset.h)) {
                    width = 374;
                    height = 251;
                } else {
                    width = 168;
                    height = 251;
                }
                ele.style = `margin-right:10px;width:${width}px;height:${height}px;display:block;`;
                fun.ge(".dots-loader", ele).remove();
                let thumb = fun.ge(".image-thumb", ele);
                thumb.style.backgroundImage = `url('${thumb.dataset.lazy}')`;
            });
            let links = [...fun.gae("a.photo-thumb")].map(a => a.href);
            let resArr = [];
            let fetchNum = 0;
            for (let i = 0; i < links.length; i += 3) {
                let res = fun.fetchDoc(links[i]).then(doc => {
                    fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${Math.ceil(links.length/3)}`, 0);
                    let items = JSON.parse(fun.ge("#initials-script", doc).innerHTML.replace(/window.initials=|;/g, "")).photosGalleryModel.photos.items;
                    return items;
                });
                resArr.push(res);
                await fun.delay(300, 0);
            }
            let imageURLs = await Promise.all(resArr).then(data => {
                fun.hide();
                return data.flat().map(e => e.imageURL);
            });
            return [...new Set(imageURLs)];
            /*
            const callback = async n => {
                let resArr = [];
                let fetchNum = 0;
                for (let i = n; i < links.length; i += 16) {
                    let res = fun.fetchDoc(links[i]).then(doc => {
                        fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${Math.ceil(links.length/16)}`, 0);
                        let items = JSON.parse(fun.ge("#initials-script", doc).innerHTML.replace(/window.initials=|;/g, "")).photosGalleryModel.photos.items;
                        return items;
                    });
                    resArr.push(res);
                    await fun.delay(300, 0);
                }
                let imageURLs = await Promise.all(resArr).then(data => {
                    fun.hide();
                    return data.flat().map(e => e.imageURL);
                });
                debug(`\n起始為第${parseInt(n) + 1}張圖片的imageURLs\n`, imageURLs);
                debug(`\n起始為第${parseInt(n) + 1}張圖片去重複後的imageURLs\n`, [...new Set(imageURLs)]);
                return imageURLs;
            };
            for (let i = 0; i <= 16; i++) {
                if (i == 16) {
                    return [];
                }
                let images = await callback(i);
                if (parseInt(images.length) === parseInt(fun.geT(".page-title__count"))) {
                    return images;
                } else if (parseInt(images.length) < 16) {
                    console.clear();
                    let one = await callback(0);
                    let concat = one.concat(images);
                    debug(`\n起始為第${parseInt(i) + 1}張圖片的imageURLs\n`, images);
                    debug(`\n起始為第${parseInt(i) + 1}張圖片並合併起始為1的imageURLs\n`, concat);
                    debug(`\n合併後去重複的imageURLs\n`, [...new Set(concat)]);
                    return concat;
                } else {
                    fun.show("圖片數量不正確重新獲取", 1900);
                    await fun.delay(2000, 0);
                }
            }
            return [];
            */
        },
        init: "fun.remove('.mixed-list>.flex-element')",
        button: [4],
        insertImg: [
            ["main>article", 2], 2
        ],
        go: 1,
        customTitle: () => fun.geT(".page-title h1"),
        css: "div[data-role=promo-messages-wrapper]{display:none!important}",
        category: "nsfw2"
    }, {
        name: "xHamsterM gallery xhamster.com/users/eros721_official/photos",
        reg: /xhamster\.com\/photos\/gallery\/[^/]+$/,
        imgs: async () => {
            await fun.getNP(".items[data-role='gallery-photos']>.item-container", "//ol[@class='page-list']/li[@class='page-button' and a[@class='page-button-link page-button-link--active']]/following-sibling::li[1]/a", null, "//ol[@class='page-list']");
            return fun.getImgA("#photoCurr", "a.item.slided", 1, [null, null], 0);
        },
        button: [4],
        insertImg: [".items[data-role=gallery-photos]", 1],
        customTitle: () => fun.geT("h1.page-title"),
        css: ".items[data-role=gallery-photos]>.item-container{width:100%!important}aside[data-role=yld-mdtop],.yld-md--bottom,.yld-pc--bottom,aside[data-role=yld-pctop],div[data-role=promo-messages-wrapper]{display:none!important}",
        category: "nsfw2"
    }, {
        name: "PornHub photo pornhub.com/albums", //很容易會被短暫封IP
        enable: 1,
        reg: /pornhub\.com\/album\/\d+/,
        imgs: () => fun.getImgA("#photoImageSection img", ".js_lazy_bkg a", 200),
        button: [4],
        insertImg: [
            [".photoBlockBox .clear", 1], 1
        ],
        go: 1,
        customTitle: () => fun.geT(".photoAlbumTitleV2").trim(),
        category: "nsfw2"
    }, {
        name: "BITCHES GIRLS bitchesgirls.com",
        reg: /https:\/\/bitchesgirls\.com\/[^\/]+\/[^\/]+\/[^\/]+\/$/,
        init: async () => {
            await fun.getNP(".albumgrid a,.popup-element", "a#loadMore");
        },
        imgs: () => {
            const selector = "script[type='application/ld+json']";
            const getUrls = (ele, doc) => {
                let text = fun.ge(ele, doc).innerText;
                let urls = text.match(/"url":\s?"[^"]+/g).map(e => e.replace(/"url":\s?"/, ""));
                return urls.filter(e => !/\/logos\//.test(e));
            }
            const max = adConstants.pagesAmount;
            if (max > 1) {
                let links = [];
                links.push(siteUrl);
                for (let i = 2; i <= max; i++) {
                    links.push(siteUrl + `${i}/`);
                }
                let resArr = [];
                let fetchNum = 0;
                for (let i in links) {
                    let res = fun.fetchDoc(links[i]).then(doc => {
                        fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${max}`, 0);
                        return getUrls(selector, doc);
                    });
                    resArr.push(res);
                }
                return Promise.all(resArr).then(data => {
                    fun.hide();
                    return data.flat();
                });
            } else {
                return getUrls(selector, document);
            }
        },
        repeat: 1,
        button: [4],
        insertImg: [
            [".button-container", 2], 2
        ],
        go: 1,
        css: "a#loadMore{display:none!important}",
        category: "nsfw2"
    }, {
        name: "EroMe www.erome.com",
        reg: /^https:\/\/www\.erome\.com\/a\/\w+$/i,
        imgs: "div[data-src],.img>img[data-src]",
        customTitle: () => fun.geT(".page-content h1"),
        category: "nsfw2"
    }, {
        name: "DirtyChicks dirtychicks.net",
        reg: /^https:\/\/dirtychicks\.net\/gallery\/[^\/]+\/$/i,
        imgs: () => [...fun.gae("#album img")].map(e => e.src.replace(/-\d+x\d+./, ".")),
        button: [4],
        insertImg: [".gallery_grid", 2],
        customTitle: () => fun.title(" - DirtyChicks"),
        category: "nsfw2"
    }, {
        name: "Amateur Likes amateurlikes.com",
        reg: /^https:\/\/amateurlikes\.com\/n\/[^\/]+\/\d+$/i,
        imgs: "#gallery img",
        button: [4],
        insertImg: ["#gallery .masonry", 2],
        customTitle: () => fun.geT(".full_h1").replace(/\([\d\s]+Photos\)/i, "").trim(),
        css: "#gallery .masonry{display:block!important}",
        category: "nsfw2"
    }, {
        name: "Nakedsex nakedsex.pics",
        reg: /^https:\/\/nakedsex\.pics\/.+\.php$/i,
        imgs: ".gallerycontent a",
        button: [4],
        insertImg: [
            [".tags", 2], 2
        ],
        go: 1,
        customTitle: () => fun.title(" - Best adult videos and photos"),
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "nsfw2"
    }, {
        name: "Onlyfans Leaks topleaks.net",
        reg: /^https:\/\/topleaks\.net\/[^\/]+\/$/i,
        imgs: () => [...fun.gae(".entry-content img")].map(e => e.src.replace(/-\d+x\d+./, ".")),
        customTitle: () => fun.geT(".entry-title"),
        category: "nsfw2"
    }, {
        name: "ThotHub Leaks thothub.vip",
        reg: /^https:\/\/thothub\.vip\/[^\/]+\/$/i,
        imgs: ".entry-content img",
        customTitle: () => fun.geT(".entry-title").replace(/\([\d\s]+Photos\)/i, "").trim(),
        category: "nsfw2"
    }, {
        name: "MrDeepFakes mrdeepfakes.com",
        reg: /https?:\/\/mrdeepfakes\.com\/photo\/\d+\//,
        imgs: "a[data-fancybox-type=image]",
        button: [4],
        insertImg: [
            [".info-holder", 2], 1
        ],
        customTitle: () => fun.geT(".headline>h1"),
        go: 1,
        category: "nsfw2"
    }, {
        name: "PicHunter www.pichunter.com",
        reg: /www\.pichunter\.com\/gallery\/\d+\/.+/,
        imgs: ".flex-images figure>a",
        button: [4],
        insertImg: [
            [".flex-images", 2], 1
        ],
        go: 1,
        customTitle: () => fun.geT("h1"),
        category: "nsfw2"
    }, {
        name: "Pictoa www.pictoa.com",
        reg: /www\.pictoa\.com\/(thumbs|albums)\/.+\.html/i,
        imgs: () => fun.getImgA("#player img", ".thumb-nav-img a"),
        button: [4],
        insertImg: ["#player", 2],
        customTitle: () => fun.geT(".title>h1"),
        css: "#gallery #player{cursor:unset!important}",
        category: "nsfw2"
    }, {
        name: "PimpAndHost https://pimpandhost.com/site/trending",
        reg: /pimpandhost\.com\/(image|album)\/\d+/,
        init: () => {
            if (/image/.test(location.href)) location.href = fun.ge('a[title=Album]').href;
            fun.remove(".flex-block-1,.flex-block-2,#comments,.ano_po");
        },
        imgs: async () => {
            await fun.getNP("#album-images>.image-block", "li.active+li:not(.next)>a", null, ".pagination");
            return [...fun.gae("#album-images .image-block a[data-src]")];
        },
        button: [4, "18%"],
        insertImg: [
            [".summary", 2], 2
        ],
        go: 1,
        customTitle: () => fun.geT(".author-header__album-name"),
        category: "nsfw2"
    }, {
        name: "PimpAndHost 隱藏廣告",
        reg: /pimpandhost\.com\//,
        icon: 0,
        key: 0,
        init: "fun.remove('.flex-block-1,.flex-block-2,#comments,.ano_po')",
        css: ".list-view:not(#main-list-view) .item:not(.image-block){display:none!important}",
        category: "nsfw2"
    }, {
        name: "BabeSource babesource.com",
        reg: /babesource\.com\/galleries\/.+\.html/i,
        imgs: ".box-massage__card-link",
        button: [4],
        insertImg: [
            [".albaums-box", 1], 2
        ],
        go: 1,
        customTitle: () => fun.title("|", 1),
        category: "nsfw2"
    }, {
        name: "Pornpaw 圖片清單頁 www.pornpaw.com",
        reg: /www\.pornpaw\.com\/gallery\/[\w-]+\.html/i,
        delay: 500,
        imgs: () => [...fun.gae("img[data-src]")].map(e => e.dataset.src.replace("x160.", ".")),
        button: [4],
        insertImg: [
            [".container>.row", 2], 2
        ],
        go: 1,
        customTitle: () => fun.geT("h1"),
        category: "nsfw2"
    }, {
        name: "ImageFap 圖片清單頁 www.imagefap.com https://www.imagefap.com/pictures/11084503/SIDAM%20Son%20Ye-Eun%20Vol.001%20Event",
        reg: /www\.imagefap\.com\/(gallery|pictures)\/\d+/i,
        icon: 0,
        key: 0,
        init: () => {
            fun.getNP('//tr[td[@id]]', 'b+a.link3', null, '#gallery>font>span');
        },
        category: "nsfw2"
    }, {
        name: "ImageFap www.imagefap.com",
        reg: /www\.imagefap\.com\/photo\/\d+\//i,
        imgs: async () => {
            let max = fun.ge("div[data-total]").dataset.total;
            await fun.waitEle(".image-wrapper img");
            let arr = [];
            arr.push(fun.ge(".image-wrapper img").cloneNode(true));
            fun.show(`${displayLanguage.str_02}1/${max}`, 0);
            let n = 1;
            for (let i = 1; i < max; i++) {
                fun.ge("a.next[title=Next]").click();
                await fun.delay(1000, 0);
                if (await fun.waitEle(".image-wrapper img")) {
                    arr.push(fun.ge(".image-wrapper img").cloneNode(true));
                    fun.show(`${displayLanguage.str_02}${n+=1}/${max}`, 0);
                }
            }
            fun.hide();
            return arr;
        },
        button: [4],
        insertImg: [".mainouter", 1],
        customTitle: () => fun.geT("#main h1"),
        category: "nsfw2"
    }, {
        name: "fuskator.com 圖片清單頁",
        reg: /fuskator\.com\/thumbs\/[\w-~]+\/[\w-~]+\.html/i,
        imgs: async () => {
            fun.show(displayLanguage.str_04, 0);
            await fun.waitEle(".pic_pad");
            fun.hide();
            return [...fun.gae("#thumbimages a,.swipebox a")];
        },
        insertImg: [
            ["//a[text()='View full images']", 2], 2
        ],
        go: 1,
        //customTitle: "return fun.geT('#info+h1')",
        category: "nsfw2"
    }, {
        name: "fuskator.com 大圖頁",
        reg: /^https:\/\/fuskator\.com\//i,
        include: "//a[text()='View gallery thumbnails']",
        imgs: "img.full",
        insertImg: ["#fullimages", 2, 1000],
        category: "nsfw2"
    }, {
        name: "TOKYO Motion www.tokyomotion.net",
        reg: /^https:\/\/www\.tokyomotion\.net\/album\/\d+\/.+/,
        imgs: async () => {
            await fun.getNP("div[id^=album_photo]", ".pagination li.active+li>a", null, ".pagination");
            return [...fun.gae(".thumb-overlay img")].map(e => e.src.replace("tmb/", ""));
        },
        button: [4],
        insertImg: [
            ["//div[div[div[contains(@id,'album_photo')]]]", 0], 2
        ],
        go: 1,
        customTitle: () => [...fun.gae(".pull-left")][2].innerText.trim(),
        category: "nsfw2"
    }, {
        name: "javbangers.com",
        reg: /www\.javbangers\.com\/albums\/.+/,
        imgs: ".images a",
        button: [4],
        insertImg: [
            [".album-info", 2], 2
        ],
        go: 1,
        customTitle: () => fun.geT(".headline>h1").trim(),
        category: "nsfw2"
    }, {
        name: "multi.xnxx.com",
        reg: /multi\.xnxx\.com\/gallery\/.+/,
        imgs: ".galleryPage .boxImg",
        button: [4],
        insertImg: [
            [".originalLink", 2], 1
        ],
        go: 1,
        category: "nsfw2"
    }, {
        name: "色情圖片網 www.photos18.com",
        reg: /www\.photos18\.com\/\w+\/\w+/i,
        imgs: ".imgHolder a[data-fancybox]",
        button: [4],
        insertImg: ["#content", 1],
        customTitle: () => fun.geT("h1.title").replace(/\d+P|\s?\(\d+P\)/i, ""),
        category: "nsfw2"
    }, {
        name: "GavPorn 相冊 https://cav103.com/albums/",
        reg: /cav\d+\.com\/albums\/\d+\/\w+\//,
        imgs: "a[data-fancybox-type]",
        button: [4],
        insertImg: [".sponsor", 2],
        customTitle: () => fun.geT(".headline>h1"),
        css: ".top{display:none!important}",
        category: "nsfw2"
    }, {
        name: "BuzzAV www.buzzav.com",
        reg: /old\.buzzav\.com\/album\/\d+\//,
        imgs: async () => {
            await fun.getNP("//div[a[div[img[contains(@id,'album_photo')]]]]", ".pagination li.active+li>a", null, ".d-sm-block>.pagination");
            return [...fun.gae("[id^=album_photo]")].map(e => e.src.replace("tmb/", ""));
        },
        button: [4],
        insertImg: [
            [".well-info+.content-row", 2], 1
        ],
        go: 1,
        //customTitle: "return fun.geT('.box>h1').replace(/\\[\\d+P\\]/i,'').trim();",
        //css: ".well-info+.content-row{display: block!important;}#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "nsfw2"
    }, {
        name: "Hentai Image hentai-img.com hentai-cosplays.com porn-images-xxx.com porn-gravure-idol.com",
        reg: /(hentai-img|hentai-cosplays|porn-images-xxx|porn-gravure-idol)\.com\/image\/[^/]+\//,
        include: "//a[text()='DETAIL PAGE' or text()='DETAIL HALAMAN' or text()='詳細へ' or text()='详细信息页面' or text()='Страница сведений' or text()='상세 페이지' or text()='página de detalles' or text()='หน้ารายละเอียด' or text()='TRANG CHI TIẾT']",
        imgs: () => {
            let max = document.title.split("/").pop().match(/\d+/)[0];
            let links = [];
            let url = siteUrl.replace(/\/\d+\/$/, "");
            for (let i = 1; i <= max; i++) {
                links.push(url + `/${i}/`);
            }
            return fun.getImgA("#display_image_detail a,#detail_list a", links, 100);
            /*
            let max = document.title.split("/").pop().match(/\d+/)[0];
            let srcs = [];
            let mode = location.href.split("/").slice(0, -1).pop();
            let firstSrc = fun.ge("#display_image_detail a,#detail_list a").href;
            let path = firstSrc.replace(/(image-)?\d+\.\w+$/i, "");
            for (let i = 1; i <= max; i++) {
                if (/image/.test(mode)) {
                    srcs.push(path + "image-" + String(i).padStart(3, "0") + ".jpg");
                } else {
                    srcs.push(path + i + ".jpg");
                }
            }
            return srcs;
            */
        },
        button: [4],
        insertImg: ["#display_image_detail,#detail_list", 2],
        customTitle: () => fun.geT("#title>h2,#page h3").replace(/\s?Photo\s?\d+P|\s?-\s?\d+\/\d+\s?|\([0-9\s]+ảnh\)/i, "").trim(),
        css: "#display_image_detail img{max-width:100% !important}",
        category: "nsfw2"
    }, {
        name: "Hentai Image hentai-img.com hentai-cosplays.com porn-images-xxx.com porn-gravure-idol.com",
        reg: /(hentai-img|hentai-cosplays|porn-images-xxx|porn-gravure-idol)\.com\/image\/[^/]+\/(page\/\d+\/)?$/,
        init: () => {
            let ele = fun.ge("//div[span[a]]");
            if (ele) {
                let tE = fun.ge("#display_image_detail,#detail_list");
                tE.parentNode.insertBefore(ele, tE);
            }
        },
        imgs: async () => {
            let max = fun.geT("#paginator>*:last-child", 3) || fun.geT(".paginator_page[rel=next]", 2) || 1;
            let links = [];
            let url = siteUrl.replace(/page\/\d+\/$/, "");
            for (let i = 1; i <= max; i++) {
                links.push(url + `page/${i}/`);
            }
            let arr = await fun.getImgA(".icon-overlay img,#display_image_detail img", links, 100);
            return arr.map(e => e.replace(/\/p=(700|305)/, ""));
            /*
            let currentName = location.href.split("/")[4];
            let last;
            try {
                last = fun.ge(".paginator_page[rel=next]").previousElementSibling;
            } catch (e) {
                last = fun.ge("#paginator>*:last-child>a");
            }
            let lastUrl;
            try {
                lastUrl = last.href;
            } catch (e) {
                return [...fun.gae(".icon-overlay img,#display_image_detail img")].map(e => e.src.replace(/\/p=(700|305)/, ""));
            }
            debug("\nlastURL\n", lastUrl);
            let lastUrlName = lastUrl.split("/")[4];
            if (last && currentName === lastUrlName) {
                let srcs = [];
                fun.show(displayLanguage.str_09, 0);
                let timeId = setTimeout(() => {
                    location.reload();
                }, 30000);
                let lastFileName = await fun.fetchDoc(lastUrl).then(doc => {
                    clearTimeout(timeId);
                    let ele = [...fun.gae(".icon-overlay img,#display_image_detail img", doc)].pop();
                    let fileName = ele.src.match(/.+\/(.+)/)[1];
                    return fileName;
                });
                fun.hide();
                let max = parseInt(lastFileName.match(/\d+/)[0]);
                let path = fun.ge(".icon-overlay img,#display_image_detail img").src.match(/.+\//)[0].replace(/\/p=\d+\//, "/");
                for (let i = 1; i <= max; i++) {
                    if (/image/.test(lastFileName)) {
                        srcs.push(path + "image-" + String(i).padStart(3, "0") + ".jpg");
                    } else {
                        srcs.push(path + i + ".jpg");
                    }
                }
                return srcs;
            } else {
                return [...fun.gae(".icon-overlay img,#display_image_detail img")].map(e => e.src.replace(/\/p=(700|305)/, ""));
            }
            */
        },
        button: [4],
        insertImg: ["#display_image_detail,#detail_list", 2],
        autoDownload: [0],
        next: () => {
            let next = fun.ge("//a[text()='Prev Article' or text()='前の記事' or text()='前一篇']");
            if (next) {
                return next.href;
            } else {
                return null;
            }
        },
        prev: "//a[text()='Next Article' or text()='次の記事' or text()='下一篇文章']",
        customTitle: () => fun.geT("#title>h2,#page h3").replace(/\s?Photo\s?\d+P|\s?-\s?\d+\/\d+\s?|\([0-9\s]+ảnh\)/i, "").trim(),
        css: "#display_image_detail img{max-width:100% !important}",
        category: "nsfw2"
    }, {
        name: "Fapator 圖片清單頁",
        reg: /www\.fapator\.com\/\?content_id=/i,
        imgs: "a[data-lightbox]",
        init: () => {
            fun.remove("//div[@class='img' and a[@target and img]]");
        },
        button: [4],
        insertImg: [".fcon+.fapad", 1],
        next: "//a[contains(text(),'next photos')]",
        prev: 1,
        go: 1,
        category: "nsfw2"
    }, {
        name: "SMUTPOND www.smutpond.com",
        reg: /www\.smutpond\.com\/gallery-pics\/\?uid=/i,
        imgs: "img[alt=Pic]",
        button: [4],
        insertImg: [".viewerBox", 2],
        customTitle: async () => {
            await fun.delay(2000, 0);
            return fun.geT("h2.sectionTitleLeft");
        },
        category: "nsfw2"
    }, {
        name: "SexyGirlsPics sexygirlspics.com",
        reg: /sexygirlspics\.com\/pics\/[\w-]+\//i,
        imgs: "a.ss-image",
        button: [4],
        insertImg: [
            [".sponsor-button", 2], 1
        ],
        go: 1,
        category: "nsfw2"
    }, {
        name: "PornPic www.pornpic.com",
        reg: /www\.pornpic\.com\/gallery\/[\w-]+/i,
        imgs: ".gallery-grid a.item-link",
        button: [4],
        insertImg: [
            [".gallery-info", 2], 1
        ],
        go: 1,
        category: "nsfw2"
    }, {
        name: "PornPic www.pornpic.com",
        reg: /www\.pornpic\.com\/gallery\/[\w-]+/i,
        imgs: ".gallery-grid a.item-link",
        button: [4],
        insertImg: [
            [".gallery-info", 2], 1
        ],
        go: 1,
        category: "nsfw2"
    }, {
        name: "Girlsreleased 載入更多",
        icon: 0,
        key: 0,
        delay: 1000,
        reg: /girlsreleased\.com\//,
        include: "//button[text()='more']",
        observerClick: "//button[text()='more']",
        openInNewTab: ".content .main a",
        category: "nsfw2"
    }, {
        name: "Girlsreleased",
        reg: /girlsreleased\.com\/set\/\d+/,
        imgs: async () => {
            let ele = ".images .imageContainer .image img";
            await fun.waitEle(ele);
            let src = fun.ge(ele).src;
            let images = [...fun.gae(ele)];
            if (/imx\.to/.test(src)) {
                let tempSrc = src.replace("https://imx.to/u/t/", "https://i.imx.to/i/");
                return new Promise(async resolve => {
                    let obj = await fun.checkImgStatus(tempSrc);
                    if (obj.ok && obj.width > 200) {
                        resolve(images.map(e => e.src.replace("https://imx.to/u/t/", "https://i.imx.to/i/")));
                    } else {
                        resolve(images.map(e => e.src.replace("/t/", "/i/")));
                    }
                });
            } else if (/imgadult\.com/.test(src)) {
                return images.map(e => e.src.replace("small-medium/", "big/"));
            } else if (/pixhost\.to/.test(src)) {
                return images.map(e => e.src.replace("https://t", "https://img").replace("/thumbs/", "/images/"));
            } else {
                return [];
            }
        },
        button: [4],
        insertImg: [
            [".images", 2], 2
        ],
        go: 1,
        referer: "src",
        category: "nsfw2"
    }, {
        name: "Eropics eropics.to eropics.co",
        reg: /eropics\.\w+\/\d+\/\d+\/\d+\//i,
        include: "a[href*='pixhost.to'],a[href*='www.turboimagehost.com'],a[href*='imgbox.com'],a[href*='www.imagevenue.com']",
        imgs: () => {
            if (fun.gae("a[href*='imx.to']").length > 3) {
                let yes = confirm(displayLanguage.str_10);
                if (yes) {
                    let arr = [...fun.gae(".entry-content a")].map(a => a.href);
                    let str = arr.join("\n");
                    console.log(str);
                    copyToClipboard(str);
                    fun.show(displayLanguage.str_11);
                }
                return [];
            }
            let links = [...fun.gae(".entry-content a:not([href*='imx.to'])")].map(a => a.href);
            let resArr = [];
            let xhrNum = 0;
            for (let i in links) {
                let res = fun.xhr(links[i], "document").then(doc => {
                    fun.show(`${displayLanguage.str_02}${xhrNum+=1}/${links.length}`, 0);
                    return fun.ge("#image,.pic.img.img-responsive,#imageid,#img.image-content,.card-body img", doc);
                });
                resArr.push(res);
            }
            return Promise.all(resArr).then(arr => {
                fun.hide();
                return arr;
            });
        },
        button: [4],
        insertImg: [
            [".entry-footer", 2], 2
        ],
        go: 1,
        referer: "src",
        customTitle: () => fun.geT("h1.entry-title"),
        category: "nsfw2"
    }, {
        name: "Eropics",
        reg: /eropics\.to\/\d+\/\d+\/\d+\//i,
        include: "a[href*='imx.to']",
        init: () => {
            fun.show(displayLanguage.str_12, 5000);
        },
        imgs: ".entry-content p>a",
        category: "nsfw2"
    }, {
        name: "imx.to gallery",
        reg: /https?:\/\/imx\.to\/g\/\w+$/i,
        imgs: () => [...fun.gae("img.imgtooltip")].map(e => e.src.replace("/u/t/", "/u/i/")),
        button: [4],
        insertImg: [
            ["#content", 2], 2
        ],
        go: 1,
        category: "nsfw2"
    }, {
        name: "imx.to",
        reg: /https?:\/\/imx\.to\/i\/\w+$/i,
        icon: 0,
        key: 0,
        autoClick: ".button.blue.large,#continuebutton,a[title='Show gallery']",
        category: "nsfw2"
    }, {
        name: "Ngắm Gái Xinh ngamgaixinh.us",
        reg: /ngamgaixinh\.us\/[^/]+\/(\d+\/)?$/,
        init: "Function.prototype.constructor=()=>{}",
        imgs: () => {
            return [...fun.gae(".wp-block-gallery img")].map(img => {
                let srcset = img.getAttribute("srcset");
                if (srcset) {
                    let splitArr = srcset.split(",");
                    splitArr = splitArr.sort((a, b) => {
                        return a.match(/\s(\d+)w/)[1] - b.match(/\s(\d+)w/)[1];
                    });
                    return splitArr.pop().trim().split(" ")[0];
                } else {
                    return img.src;
                }
            });
        },
        button: [4],
        insertImg: [
            [".penci-single-link-pages", 2], 2
        ],
        go: 1,
        category: "nsfw2"
    }, {
        name: "Ngắm Gái Xinh ngamgaixinh.us album",
        reg: /ngamgaixinh\.\w+\/album\/.+/,
        imgs: () => [...fun.gae(".list-item-image img")].map(img => img.src.replace(/\.(th|md)\./, ".")),
        button: [4],
        insertImg: [
            [".pad-content-listing", 2], 2
        ],
        go: 1,
        category: "nsfw2"
    }, {
        name: "Degoo Cloud app.degoo.com",
        reg: /^https?:\/\/app\.degoo\.com\/share\//,
        imgs: async () => {
            let max = prompt(displayLanguage.str_13, "100");
            let img = ".preview-media .hidden";
            await fun.waitEle(img);
            let arr = [];
            arr.push(fun.ge(img).cloneNode(true));
            fun.show(`${displayLanguage.str_02}1/${max}`, 0);
            let n = 1;
            for (let i = 1; i < max; i++) {
                fun.ge("#nextFileButton").click();
                await fun.delay(200, 0);
                if (await fun.waitEle(img)) {
                    arr.push(fun.ge(img).cloneNode(true));
                    fun.show(`${displayLanguage.str_02}${n+=1}/${max}`, 0);
                }
            }
            fun.hide();
            arr = arr.map(e => e.src);
            return [...new Set(arr)];
        },
        category: "nsfw2"
    }, {
        name: "xher.net",
        reg: /xher\.net\/index\.php\?\/category\/\d+$/i,
        imgs: async () => {
            await fun.getNP("#thumbnails>li", ".pageNumberSelected+a", null, ".navigationBar");
            return [...fun.gae("#thumbnails img")].map(e => e.src.replace("_data/i/", "").replace(/-(2s|xs|sm||me|la|xl)\./, "."));
        },
        button: [4],
        insertImg: [
            [".navigationBar", 2], 2
        ],
        go: 1,
        category: "nsfw2"
    }, {
        name: "Bunkr bunkrr.su",
        reg: /^https:\/\/bunkrr\.su\/a\/\w+/i,
        imgs: () => {
            return fun.getImgA(".lightgallery img", "a[href^='/i/']");
        },
        button: [4],
        insertImg: [
            [".grid-images", 2], 2
        ],
        go: 1,
        customTitle: () => {
            return fun.geT("h1");
        },
        category: "nsfw2"
    }, {
        name: "Bunkr bunkr-albums.io 列表自動翻頁",
        reg: /^https:\/\/bunkr-albums\.io\//,
        icon: 0,
        key: 0,
        autoPager: {
            ele: ".table-auto>tbody",
            next: "a.bg-gray-300+a",
            re: ".justify-center",
            observer: ".table-auto>tbody",
            history: 1,
            title: () => {
                let num = fun.ge("a.bg-gray-300", doc).innerText;
                return `Page ${num}`;
            }
        },
        category: "autoPager"
    }, {
        name: "girlgirlgo.org girlgirlgo.net girlgirlgo.top girlgirlgo.icu girlgirlgo.biz girlygirlpic.com",
        reg: /https?:\/\/\w{2}\.(girlgirlgo|girlygirlpic)\.(org|net|icu|com|biz|top)\/a\/\w+/,
        imgs: ".figure-link",
        button: [4],
        insertImg: [".post-media-body", 2],
        next: async () => {
            await fun.waitEle("a[rel=next]", 30);
            let next = fun.ge("a[rel=next]");
            if (next) {
                return next.href;
            } else {
                return null;
            }
        },
        prev: "a[rel=prev]",
        customTitle: async () => {
            await fun.waitEle(".figure-link");
            return fun.geT(".entry-title a").split(" No.")[0].trim();
        },
        category: "nsfw1"
    }, {
        name: "QGirlz qgirlz.com CuteLadyPic cuteladypic.com",
        reg: /https?:\/\/(\w{2}\.)?(qgirlz|cuteladypic)\.(com)\/a\/[\w-]+/,
        imgs: () => fun.getImg("//a[@data-title and picture/source]", (fun.geT(".next", 2) || 1), 16),
        button: [4],
        insertImg: [".main-image", 2],
        customTitle: () => fun.geT(".main-title").split(" No.")[0].trim(),
        category: "nsfw1"
    }, {
        name: "cn.angirlz.com", //SPA
        reg: /https?:\/\/\w{2}\.angirlz\.com\/album\/\w+/,
        imgs: async () => {
            if (await fun.waitEle(".loading[style$=hidden]")) {
                return [...fun.gae("#divGallery a")];
            } else {
                return [];
            }
        },
        button: [4],
        insertImg: ["div[key=album_main]", 2],
        customTitle: () => fun.geT("h1"),
        category: "nsfw2"
    }, {
        name: "bunnyxgirl.com letsgirlz.com bootyxgirl.com xbeautyzone.com",
        reg: /https?:\/\/(bunnyxgirl|letsgirlz|bootyxgirl|xbeautyzone)\.com\/[^/]+\/.+/,
        include: ".separator>a",
        imgs: ".separator>a",
        button: [4],
        insertImg: [
            [".album-post-inner,.album-postmeta-primarypix", 2, ".separator"], 2
        ],
        customTitle: () => fun.geT(".breadcrumbs>span:last-child"),
        category: "nsfw2"
    }, {
        name: "cn.bunnyxgirl.com cn.letsgirlz.com cn.bestxleg.com cn.xbeautyzone.com",
        reg: /https?:\/\/\w{2}\.(bunnyxgirl|letsgirlz|bestxleg|xbeautyzone)\.com\/[^/]+\/\w+/,
        include: ".separator>a",
        imgs: () => fun.getImg(".separator>a", (fun.geT(".nav-links>*:last-child", 2) || 1), 16),
        insertImg: [
            [".album-post-body .clear,.album-post-share-wrap", 1, "div[itemprop='description articleBody'],.album-post-body>*:not(.album-post-inner):not(.album-post-share-wrap):not(.FullPictureLoadImage):not(#FullPictureLoadEnd)"], 2
        ],
        customTitle: () => fun.geT(".breadcrumbs>span:last-child"),
        category: "nsfw2"
    }, {
        name: "kawaiix.com kawaiixgirl.com kawaiixpic.com kinkygirlz.com kawaiimetas.com eroticxgirl.com sexyxpic.com hottyxpic.com thongxxx.com juicexgirl.com eroticxpic.com bustyxgirl.com beautyxgirl.com bellexpic.com pantyxpic.com www.peachgirlz.com peachgirlz.com pantyxart.com beautyxpic.com cutemetas.com cutexpic.com perfectxbody.com sexyqgirl.com bestxhips.com assgirlz.com beautifulmetas.com pantyxgirl.com greatxpic.com xartpic.com perfectxpic.com bestxboobs.com artthong.com hotbeautypic.com greatxgirl.com asianxpic.com bestxleg.com tokyohotgirl.com bestxass.com",
        reg: /https?:\/\/(r18\.|www\.)?(kawaiix|kawaiixgirl|kawaiixpic|kinkygirlz|kawaiimetas|eroticxgirl|sexyxpic|hottyxpic|thongxxx|juicexgirl|eroticxpic|bustyxgirl|beautyxgirl|bellexpic|pantyxpic|peachgirlz|pantyxart|beautyxpic|cutemetas|cutexpic|perfectxbody|sexyqgirl|bestxhips|assgirlz|beautifulmetas|pantyxgirl|greatxpic|xartpic|perfectxpic|bestxboobs|artthong|hotbeautypic|greatxgirl|asianxpic|bestxleg|tokyohotgirl|bestxass)\.com\/[^/]+\/.+/,
        include: "//a[@data-title and picture/source]",
        imgs: "//a[@data-title and picture/source]",
        button: [4],
        insertImg: [".hero+.hero,.entry-content,.d-flex>.col-24,.album-post,.album-h1", 2],
        customTitle: () => fun.title(/( - Kawa| - KinkyGirlz| - BelleXPic| - Peach| - Panty| - Beauty| - Cute| - Ass| - Beaut| - Great| - Xart| - Perfect| - Art| - GreatXGirl)/i, 1).replace(/\s?\(\d+\s?photos\)/, "").trim(),
        category: "nsfw2"
    }, {
        name: "cn.kawaiix.com cn.kawaiixgirl.com cn.kawaiixpic.com cn.kinkygirlz.com cn.kawaiimetas.com cn.eroticxgirl.com cn.sexyxpic.com cn.hottyxpic.com cn.thongxxx.com cn.juicexgirl.com cn.eroticxpic.com cn.bustyxgirl.com cn.beautyxgirl.com cn.bellexpic.com cn.pantyxpic.com cn.peachgirlz.com cn.pantyxart.com cn.beautyxpic.com cn.cutemetas.com cn.cutexpic.com cn.perfectxbody.com cn.sexyqgirl.com cn.bestxhips.com cn.bestxass.com cn.assgirlz.com cn.bestxbum.com cn.eroticxpic.com cn.xxxthong.com cn.thongxgirl.com cn.bestxlingerie.com cn.sexyxart.com cn.hotxhips.com cn.hotbeautypic cn.greatxgirl.com cn.asianxpic.com cn.bootyxgirl.com cn.tokyohotgirl.com",
        reg: /https?:\/\/\w{2}\.(kawaiix|kawaiixgirl|kawaiixpic|kinkygirlz|kawaiimetas|eroticxgirl|sexyxpic|hottyxpic|thongxxx|juicexgirl|eroticxpic|bustyxgirl|beautyxgirl|bellexpic|pantyxpic|peachgirlz|pantyxart|beautyxpic|cutemetas|cutexpic|perfectxbody|sexyqgirl|bestxhips|bestxass|assgirlz|bestxbum|adultmetas|eroticxpic|xxxthong|thongxgirl|bestxlingerie|sexyxart|hotxhips|hotbeautypic|greatxgirl|asianxpic|bootyxgirl|tokyohotgirl)\.com\/[^/]+\/\w+/,
        include: "//a[@data-title and picture/source]",
        imgs: () => fun.getImg("//a[@data-title and picture/source]", (fun.geT(".nav-links>*:last-child", 2) || 1), 16),
        button: [4],
        insertImg: [".hero+.hero,.entry-content,.d-flex>.col-24,.album-post", 2],
        customTitle: () => fun.geT(".entry-title,.album-title,.album-post-title,.col-12>h1,.album-h1").split(" No.")[0].trim(),
        css: ".flex-grid:not(.masonry){display:block!important;}",
        category: "nsfw2"
    }, {
        name: "gogo人体艺术M",
        reg: /\/(wap|mip|m)\.(gogortrt|gogo38|956n|48mp|133rt|xixirt|488xm|rtys96|renti92|rt211|gogo44|xixi78|816mm|999zv|28rtys|454t|454t|784z|34tp|28xv|22bb|444rp|03hb|39um|45xm|444wp|005mm|188rt|7m11|61ak|34bu|344F|23bp|rty6|22gs|44aq|291103|508332|693350|660183|702038|873750|981070)\.(com|org)\/\w+\/\d+\/$/i,
        init: () => {
            fun.remove("//div[div[@class='ad-16 clearfix']]");
        },
        imgs: () => fun.getImg(".tal a>img[alt]", fun.gae(".p_select option").length, 11),
        button: [4],
        insertImg: [".tal", 2],
        category: "nsfw2"
    }, {
        name: "gogo人体艺术M2",
        reg: /\/(m)\.(98ah|02aj|139tu)\.com\/\w+\/(\d+\/)?\d+\.html$/i,
        imgs: () => fun.getImg(".tal a>img[alt]", fun.gae(".p_select option").length, 9),
        button: [4],
        insertImg: [".tal", 2],
        css: "div[style='margin:3px 0 0 0;']{display:none!important}",
        category: "nsfw2"
    }, {
        name: "666人体艺术M",
        reg: /\/(m)\.(6666rt)\.com\/\w+\/\d+\/1\.html$/i,
        imgs: () => {
            let max = fun.geT(".article_page a").match(/\/(\d+)/)[1];
            return fun.getImg(".tal a>img[alt]", max, 11);
        },
        button: [4],
        insertImg: [".tal", 2],
        customTitle: () => fun.title("-第1张", 1),
        css: "div[style='margin:2px 0 0 0;']{display:none!important}",
        category: "nsfw2"
    }, {
        name: "gogo人体艺术 gogortrt.com 956n.com",
        reg: /\/(gogortrt|956n)\.[a-z]{2,3}\/[a-z]+\/\d+\//i,
        imgs: () => {
            let max = fun.geT("//span[@class='current']/preceding-sibling::a|//a[@class='thisclass']/preceding-sibling::a").match(/\d+/)[0];
            return fun.getImg(".main>div>a>img[alt],.warp .content>a>img[alt]", max, 11);
        },
        button: [4],
        insertImg: ["//div[contains(@class,'main')]/div/a/parent::* | //div[contains(@class,'content') and a/img[@alt]]", 2],
        autoDownload: [0],
        next: ".crc_l_pic.left>a:not([href^=j])",
        prev: ".crc_r_pic.right>a:not([href^=j])",
        customTitle: () => {
            if (/gogortrt\.com/.test(location.origin)) {
                return fun.geT(".content_title");
            } else {
                return fun.title(",", 1);
            }
        },
        category: "nsfw2"
    }, {
        name: "GOGO人体艺术 48mp.com 133rt.com 816mm.com",
        reg: /(48mp\.com|133rt\.com|816mm\.com)\/\w+\/\d+\//i,
        imgs: () => {
            let max = fun.geT(".main span", 2).match(/\d+/)[0];
            return fun.getImg(".main>div>a>img[alt]", max, 11);
        },
        button: [4],
        insertImg: ["//div[contains(@class,'main')]/div[a/img[@alt]]", 2],
        autoDownload: [0],
        next: ".crc_l_pic.left>a:not([href^=j])",
        prev: ".crc_r_pic.right>a:not([href^=j])",
        customTitle: () => fun.geT(".content_title"),
        category: "nsfw2"
    }, {
        name: "6666rt.com 只翻預覽圖",
        reg: /6666rt\.com\/\w+\/\d+\/(index\.html)?/i,
        enable: 0,
        include: "//div[@class='boxx']//li[a[@target]/img]",
        init: () => {
            fun.getNP("//div[@class='boxx']//li[a[@target]/img]", "a.curent+a[href]", null, ".pagelist");
        },
        category: "nsfw2"
    }, {
        name: "6666rt.com 大圖頁聚圖",
        reg: /6666rt\.com\/\w+\/\d+\//i,
        enable: 0,
        init: "document.onkeydown=null;",
        imgs: () => {
            let max = fun.geT(".page>span#hover", 3).match(/\d+$/)[0];
            return fun.getImg(".imgbox>a>img[alt]", max, 11);
        },
        button: [4],
        insertImg: ["//div[@class='imgbox' and a/img[@alt]]", 2],
        customTitle: () => fun.geT(".contitle h1>a"),
        css: "#FullPictureLoadEnd{color:rgb(0, 0, 0)}",
        category: "nsfw2"
    }, {
        name: "6666rt.com 翻完預覽圖立即插入大圖 getNP搭配getImgA",
        reg: /6666rt\.com\/\w+\/\d+\/(index\.html)?/i,
        enable: 1,
        include: "//div[@class='boxx']//li[a[@target]/img]",
        imgs: async () => {
            await fun.getNP("//div[@class='boxx']//li[a[@target]/img]", "a.curent+a[href]", null, ".pagelist");
            return fun.getImgA(".imgbox>a>img[alt]", "//div[@class='boxx']//li/a[@target and img]");
        },
        button: [4],
        //insertImg: [".boxx ul", 1],
        insertImg: [
            [".footdh", 1], 2
        ],
        go: 1,
        autoDownload: [0],
        next: "//li[contains(text(),'上一')]/a",
        prev: "//li[contains(text(),'下一')]/a",
        customTitle: () => fun.title("_", 1),
        css: ".fzltp img{height:auto!important;width:100%!important}",
        category: "nsfw2"
    }, {
        name: "508人体艺术 508332.com",
        reg: /508332\.com\/\w+\/\d+\//i,
        imgs: () => {
            let max = fun.geT(".pagelist>a").match(/\d+/)[0];
            return fun.getImg(".imgbox>a>img[alt]", max, 11);
        },
        button: [4],
        insertImg: ["//div[contains(@class,'imgbox') and a/img[@alt]]", 1],
        autoDownload: [0],
        next: "//li[contains(text(),'下一')]/a",
        prev: 1,
        customTitle: () => fun.title(" - 508", 1),
        category: "nsfw2"
    }, {
        name: "444人体艺术 444rp.com",
        reg: /444rp\.com\/\w+\/\d+\//i,
        imgs: () => {
            let max = fun.geT(".pagelist>a").match(/\d+/)[0];
            return fun.getImg(".imgbox>a>img[alt]", max, 11);
        },
        button: [4],
        insertImg: ["//div[contains(@class,'imgbox') and a/img[@alt]]", 2],
        autoDownload: [0],
        next: ".zuopre>a",
        prev: ".younext>a",
        customTitle: () => fun.geT("font>a:nth-child(3)"),
        category: "nsfw2"
    }, {
        name: "64人体艺术 www.64ay.com",
        reg: /www\.64ay\.com\/\w+\/\d+/i,
        imgs: () => {
            let max = fun.geT(".page-show>span.current", 2).match(/\d+/)[0];
            return fun.getImg(".tu>a>img[alt]", max, 9);
        },
        button: [4],
        insertImg: ["//div[@class='tu' and a/img[@alt]]", 2],
        autoDownload: [0],
        next: "//div[contains(text(),'下一')]/a[1]",
        prev: "//div[contains(text(),'上一')]/a[2]",
        customTitle: () => fun.title(",", 1),
        category: "nsfw2"
    }, {
        name: "45人体艺术 45xm.com 873人体艺术 873750.com",
        reg: /(45xm\.com|873750\.com)\/\w+\/\d+/i,
        imgs: () => {
            let max = fun.geT(".page-show>span.current", 2).match(/\d+/)[0];
            return fun.getImg(".tu>a>img[alt]", max, 11);
        },
        button: [4],
        insertImg: ["//div[contains(@class,'tu') and a/img[@alt]]", 2],
        autoDownload: [0],
        next: "//div[contains(text(),'下一')]/a[1]",
        prev: "//div[contains(text(),'上一')]/a[2]",
        customTitle: () => {
            try {
                return fun.geT(".wzbody>h1").split(/,|_/)[0];
            } catch (e) {
                return fun.geT(".wzbody>h1");
            }
        },
        category: "nsfw2"
    }, {
        name: "98人体艺术 www.98ah.com",
        reg: /www\.98ah\.com\/\w+\/\d+\.html/i,
        imgs: () => {
            let max = fun.geT(".current", 2).match(/\d+/)[0];
            return fun.getImg(".content-pic img[alt]", max, 9);
        },
        button: [4],
        insertImg: [".content-pic", 2],
        autoDownload: [0],
        next: "//div[contains(text(),'下一')]/a[1]",
        prev: "//div[contains(text(),'下一')]/a[2]",
        customTitle: () => fun.geT("h5").split(",")[0],
        category: "nsfw2"
    }, {
        name: "54人体艺术 www.54aj.com",
        reg: /www\.54aj\.com\/\w+\/\d+\.html/i,
        imgs: () => {
            let max = fun.geT("#hover", 2).match(/\d+/)[0];
            return fun.getImg(".content img[alt]", max, 9);
        },
        button: [4],
        insertImg: [".content", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'下一')]/a",
        prev: "//span[contains(text(),'上一')]/a",
        customTitle: () => fun.geT(".content>h1").split(",")[0],
        category: "nsfw2"
    }, {
        name: "03人体艺术网 03hb.com",
        reg: /03hb\.com\/\w+\/\d+\//i,
        imgs: () => {
            let max = fun.geT("#hover", 2).match(/\d+/)[0];
            return fun.getImg(".content img[alt]", max, 11);
        },
        button: [4],
        insertImg: [".content", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'下一')]/a",
        prev: "//span[contains(text(),'上一')]/a",
        customTitle: () => fun.geT(".currentpath span:nth-child(2)>a:nth-child(2)").split(",")[0],
        category: "nsfw2"
    }, {
        name: "48人体艺术 www.48gd.com",
        reg: /www\.48gd\.com\/\w+\/\d+\.html/i,
        init: "document.onkeydown=null",
        imgs: () => {
            let max = fun.geT('.pagelist>strong', 2).match(/\d+/)[0];
            return fun.getImg('#content img[alt]', max, 9);
        },
        button: [4],
        insertImg: ["#content", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'下一')]/a",
        prev: "//span[contains(text(),'上一')]/a",
        customTitle: () => fun.geT(".photo-tit>h3").split(",")[0],
        category: "nsfw2"
    }, {
        name: "693人体艺术 693350.com",
        reg: /693350\.com\/\w+\/\d+\//i,
        imgs: () => {
            let max = fun.geT(".pagelist>a").match(/\d+/)[0];
            return fun.getImg("#content img[alt]", max, 11);
        },
        button: [4],
        insertImg: ["#content", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'下一')]/a",
        prev: "//span[contains(text(),'上一')]/a",
        customTitle: () => fun.geT(".photo-tit>h3").split(",")[0],
        category: "nsfw2"
    }, {
        name: "42人体艺术 www.42jd.com",
        reg: /www\.42jd\.com\/\w+\/\d+\.html/i,
        imgs: () => {
            let max = fun.geT(".pagelist>.curent", 2).match(/\d+/)[0];
            return fun.getImg(".imgbox img[alt]", max, 9);
        },
        button: [4],
        insertImg: [".imgbox", 2],
        autoDownload: [0],
        next: "//li[contains(text(),'下一')]/a",
        prev: "//li[contains(text(),'上一')]/a",
        customTitle: () => fun.geT(".imgbox h1").split(",")[0],
        category: "nsfw2"
    }, {
        name: "36人体艺术 www.36ut.com",
        reg: /www\.36ut\.com\/\w+\/\d+\.html/i,
        init: "document.onkeydown=null",
        imgs: () => {
            let max = fun.geT(".page-show>.current", 2).match(/\d+/)[0];
            return fun.getImg(".pp.hh img[alt]", max, 9);
        },
        button: [4],
        insertImg: [".pp.hh", 2],
        customTitle: () => fun.geT(".des>h1").split(",")[0],
        category: "nsfw2"
    }, {
        name: "西西人体艺术 xixirt.org 291103.com",
        reg: /(xixirt\.org|291103\.com)\/\w+\/\d+\//i,
        init: "document.onkeydown=null",
        imgs: () => {
            let max = fun.geT(".page-show>.current", 2).match(/\d+/)[0];
            return fun.getImg(".pp.hh img[alt]", max, 11);
        },
        button: [4],
        insertImg: [".pp.hh", 2],
        customTitle: () => fun.geT(".des>h1").split(",")[0],
        category: "nsfw2"
    }, {
        name: "366人体艺术 366807.com 660人体艺术 18人体艺术",
        reg: /(366807\.com|660183\.com|18renti\.com)\/\w+\/\d+\//i,
        imgs: () => {
            let max = fun.geT(".page-show>a,.page>a").match(/\d+/)[0];
            return fun.getImg(".content img[alt]", max, 11);
        },
        button: [4],
        insertImg: [".content", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'下一')]/a",
        prev: "//span[contains(text(),'上一')]/a",
        customTitle: () => fun.title(/_西西| - 660| - 18/, 1),
        category: "nsfw2"
    }, {
        name: "702人体艺术 211人体艺术",
        reg: /(702038\.com|rt211.com)\/\w+\/\d+\//i,
        imgs: () => {
            let max = fun.geT(".page-show>a").match(/\d+/)[0];
            return fun.getImg(".content-pic img[alt],#bomei img[alt]", max, 11);
        },
        button: [4],
        insertImg: [".content-pic,#bomei", 2],
        autoDownload: [0],
        next: ".updown>a,#prenext a",
        prev: 1,
        customTitle: () => fun.title(/- 702| - 211/, 1),
        category: "nsfw2"
    }, {
        name: "188人体艺术 188rt.com",
        reg: /188rt\.com\/\w+\/\d+\//i,
        imgs: () => {
            let max = fun.geT(".page-show>a").match(/\d+/)[0];
            return fun.getImg("#bomei img[alt]", max, 11);
        },
        button: [4],
        insertImg: ["#bomei", 2],
        autoDownload: [0],
        next: "#prenext a",
        prev: "#prenext li:last-child>a",
        customTitle: () => fun.geT("#bobox>h1").split(",")[0],
        category: "nsfw2"
    }, {
        name: "39人体艺术 39um.com",
        reg: /39um\.com\/\w+\/\d+\//i,
        imgs: () => {
            let max = fun.geT(".page-show>a").match(/\d+/)[0];
            return fun.getImg(".content-pic img[alt],#bomei img[alt]", max, 11);
        },
        button: [4],
        insertImg: [".content-pic", 2],
        autoDownload: [0],
        next: ".updown>a",
        prev: 1,
        customTitle: () => fun.geT(".content>h5"),
        category: "nsfw2"
    }, {
        name: "23人体艺术 www.23fe.com",
        reg: /www\.23fe\.com\/\w+\/\d+\.html/i,
        imgs: () => {
            let max = fun.geT(".thispg", 2).match(/\d+/)[0];
            return fun.getImg("#content-p img[alt]", max, 9);
        },
        button: [4],
        insertImg: ["#content-p", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'下一')]/a",
        prev: "//span[contains(text(),'上一')]/a",
        customTitle: () => fun.geT("#ctt>h1").split(",")[0],
        category: "nsfw2"
    }, {
        name: "AJ人体艺术 www.02aj.com",
        reg: /www\.02aj\.com\/\w+\/\d+\.html/i,
        imgs: () => {
            let max = fun.geT(".thisclass", 2).match(/\d+/)[0];
            return fun.getImg(".content img[alt]", max, 9);
        },
        button: [4],
        insertImg: [".content", 2],
        autoDownload: [0],
        next: "//div[contains(text(),'下一')]/a",
        prev: "//div[contains(text(),'上一')]/a",
        customTitle: "return fun.geT('.title>h1');",
        category: "nsfw2"
    }, {
        name: "gogo人体艺术 gogo44.com",
        reg: /gogo44\.com\/\w+\/\d+\//i,
        init: "fun.ge('.content a').removeAttribute('href')",
        imgs: () => {
            let max = fun.geT(".thisclass", 2).match(/\d+/)[0];
            return fun.getImg(".content img[alt]", max, 11);
        },
        button: [4],
        insertImg: [".content a", 2],
        autoDownload: [0],
        next: ".updown a",
        prev: ".updown span:last-child>a",
        customTitle: () => fun.title(/ - gogo/, 1),
        category: "nsfw2"
    }, {
        name: "28人体艺术 28rtys.com 4F人体艺术 344f.com",
        reg: /(28rtys\.com|344f\.com)\/\w+\/\d+\//i,
        imgs: () => {
            let max = fun.geT(".thisclass", 2).match(/\d+/)[0];
            return fun.getImg(".picbox img[alt]", max, 11);
        },
        button: [4],
        insertImg: [".picbox", 2],
        autoDownload: [0],
        next: ".page+.content-msg a",
        prev: 1,
        customTitle: () => fun.title(/ - 28| - 4F/, 1),
        category: "nsfw2"
    }, {
        name: "西西人体艺术 44aq.com",
        reg: /44aq\.com\/\w+\/\d+\//i,
        imgs: () => {
            let max = fun.geT(".page a").match(/\d+/)[0];
            return fun.getImg(".picbox img[alt]", max, 11);
        },
        button: [4],
        insertImg: [".picbox", 2],
        autoDownload: [0],
        next: ".updown_r>a",
        prev: ".updown_l>a",
        customTitle: () => fun.title(/,/, 1),
        category: "nsfw2"
    }, {
        name: "139人体艺术 www.139tu.com",
        reg: /www\.139tu\.com\/\w+\/\d+\/\d+\.html/i,
        imgs: () => {
            let max = fun.geT("#hover", 2).match(/\d+/)[0];
            return fun.getImg(".img_content img[alt]", max, 9);
        },
        button: [4],
        insertImg: [".img_content", 2],
        customTitle: () => fun.geT("#title>h1"),
        category: "nsfw2"
    }, {
        name: "GOGO人体艺术网 gogo38.com",
        reg: /(gogo38\.com|981070\.com)\/\w+\/\d+\//i,
        imgs: () => {
            let max = fun.geT(".current", 2).match(/\d+/)[0];
            return fun.getImg(".content_pic img[alt]", max, 11);
        },
        button: [4],
        insertImg: [".content_pic", 2],
        customTitle: () => fun.geT(".content>h1>a"),
        category: "nsfw2"
    }, {
        name: "488人体艺术 488xm.com",
        reg: /488xm\.com\/\w+\/\d+\//i,
        imgs: () => {
            let max = fun.geT(".pagelist>strong", 2).match(/\d+/)[0];
            return fun.getImg("#content img[alt]", max, 11)
        },
        button: [4],
        insertImg: ["#content", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'下一')]/a",
        prev: "//span[contains(text(),'上一')]/a",
        customTitle: () => fun.geT("h3>a").split(",")[0],
        category: "nsfw2"
    }, {
        name: "92人体艺术 renti92.com",
        reg: /renti92\.com\/\w+\/\d+\//i,
        imgs: () => {
            let max = fun.geT(".pagination>a").match(/\d+/)[0];
            return fun.getImg("#gallery img[alt]", max, 11);
        },
        button: [4],
        insertImg: ["#gallery", 2],
        autoDownload: [0],
        next: ".other-prev a",
        prev: ".other-next a",
        customTitle: () => fun.title(/ - 92/, 1),
        category: "nsfw2"
    }, {
        name: "005人体艺术 005mm.com",
        reg: /005mm\.com\/\w+\/\d+\//i,
        imgs: () => {
            let max = fun.geT(".pagination>a").match(/\d+/)[0];
            return fun.getImg("#gallery img[alt]", max, 11);
        },
        button: [4],
        insertImg: ["#gallery", 2],
        autoDownload: [0],
        next: ".other-prev a",
        prev: ".other-next a",
        customTitle: () => fun.geT(".post-nav>a:nth-child(3)"),
        category: "nsfw2"
    }, {
        name: "西西人体艺术 xixi78.com 711人体艺术 7m11.com",
        reg: /(xixi78\.com|7m11\.com)\/\w+\/\d+\//i,
        imgs: () => {
            let max = fun.geT(".content-page>a").match(/\d+/)[0];
            return fun.getImg("#content img[alt]", max, 11);
        },
        button: [4],
        insertImg: ["#content", 2],
        customTitle: () => fun.title(/ - 西西| - 711/, 1),
        category: "nsfw2"
    }, {
        name: "96人体艺术 rtys96.com 61人体艺术 61ak.com",
        reg: /(rtys96\.com|61ak.com)\/\w+\/\d+\//i,
        imgs: () => {
            let max = fun.geT(".bigpages>a").match(/\d+/)[0];
            return fun.getImg("#showimages img[alt]", max, 11);
        },
        button: [4],
        insertImg: ["#showimages", 2],
        autoDownload: [0],
        next: "#pageNum a",
        prev: 1,
        customTitle: () => fun.title(/ - 96| - 61/, 1),
        category: "nsfw2"
    }, {
        name: "999人体艺术 999zv.com 西西人体艺术 34bu.com",
        reg: /(999zv\.com|34bu.com)\/\w+\/\d+\//i,
        imgs: () => {
            let max = fun.geT(".pages a").match(/\d+/)[0];
            return fun.getImg(".section.fix.tc img[alt]", max, 11);
        },
        button: [4],
        insertImg: [".section.fix.tc", 2],
        autoDownload: [0],
        next: ".arcLocal.r a",
        prev: 1,
        customTitle: () => fun.title(",", 1),
        category: "nsfw2"
    }, {
        name: "454人体艺术 454t.com 爱上人体艺术 23bp.com",
        reg: /(454t\.com|23bp\.com)\/\w+\/\d+\//i,
        imgs: () => {
            let max = fun.geT(".page a").match(/\d+/)[0];
            return fun.getImg("#content-p img[alt]", max, 11);
        },
        button: [4],
        insertImg: ["#content-p", 2],
        customTitle: () => fun.title(",", 1),
        category: "nsfw2"
    }, {
        name: "748人体艺术 784z.com 66人体艺术 rty6.com",
        reg: /(784z\.com|rty6.com)\/\w+\/\d+\//i,
        imgs: () => {
            let max = fun.geT(".pages a").match(/\d+/)[0];
            return fun.getImg(".image-view img[alt]", max, 11);
        },
        button: [4],
        insertImg: [".image-view", 2],
        autoDownload: [0],
        next: ".i-digg>.article-adbottom a",
        prev: 1,
        customTitle: () => fun.title(/,|_/, 1),
        category: "nsfw2"
    }, {
        name: "34人体艺术 34tp.com 高清人体艺术 22gs.com",
        reg: /(34tp\.com|22gs.com)\/\w+\/\d+\//i,
        imgs: () => {
            let max = fun.geT(".gengduo a").match(/\d+/)[0];
            return fun.getImg("#content-p img[alt]", max, 11);
        },
        button: [4],
        insertImg: ["#content-p p", 2],
        autoDownload: [0],
        next: ".gg a",
        prev: 1,
        customTitle: () => fun.title(/ - 34|,/, 1),
        category: "nsfw2"
    }, {
        name: "22bb人体艺术 22bb.org",
        reg: /22bb\.org\/\w+\/\d+\//i,
        imgs: () => {
            let max = fun.geT(".page-show>a").match(/\d+/)[0];
            return fun.getImg(".content img[alt]", max, 11);
        },
        button: [4],
        insertImg: [".content", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'下一')]/a",
        prev: "//span[contains(text(),'上一')]/a",
        customTitle: () => fun.title(",", 1),
        category: "nsfw2"
    }, {
        name: "444人体艺术 444wp.com",
        reg: /444wp\.com\/\w+\/\d+\//i,
        imgs: () => {
            let max = fun.geT(".page a").match(/\d+/)[0];
            return fun.getImg(".content img[alt]", max, 11);
        },
        button: [4],
        insertImg: [".content", 2],
        autoDownload: [0],
        next: ".page+.page a",
        prev: ".page+.page a+a",
        customTitle: () => fun.geT("h2"),
        category: "nsfw2"
    }, {
        name: "爱人体艺术 28xv.com",
        reg: /28xv\.com\/\w+\/\d+\//i,
        imgs: () => {
            let max = fun.geT(".page a").match(/\d+/)[0];
            return fun.getImg(".imgTip+a>img[alt]", max, 11);
        },
        button: [4],
        insertImg: [".imgTip+a", 2],
        autoDownload: [0],
        next: ".updown_r>a",
        prev: ".updown_l>a",
        customTitle: () => fun.geT("h1").split(",")[0],
        category: "nsfw2"
    }, {
        name: "E-Hentai圖片清單頁 e-hentai.org exhentai.org",
        reg: /(e-hentai|exhentai).org\/g\/\d+\/\w+\/$/,
        exclude: "//h1[text()='Content Warning']",
        init: async () => {
            await fun.getNP(".gdtm,.gdtl", ".ptds+td>a", null, "//tr[td[@class='ptds']]");
        },
        imgs: () => fun.getImgA("#img", ".gdtm a,.gdtl a", 100),
        button: [4],
        insertImg: [
            ["#gdt", 0], 2
        ],
        customTitle: () => {
            let t = fun.geT("#gj").replace(/\//, "");
            if (t.length > 0) {
                return t;
            } else {
                return fun.geT("#gn").replace(/\|.+/, "").trim();
            }
        },
        go: 1,
        topButton: true,
        threading: 4,
        category: "hcomic"
    }, {
        name: "E-Hentai圖片清單頁 https://e-hentai.org/lofi/",
        reg: /https?:\/\/e-hentai\.org\/lofi\/g\/\w+\/\w+\//,
        init: async () => {
            await fun.getNP(".gi", "//a[text()='Next Page >']", null, "#ia");
        },
        imgs: async () => {
            return fun.getImgA("#sm", ".gi>a", 100);
        },
        button: [4],
        insertImg: [
            ["#ia", 2], 2
        ],
        customTitle: () => fun.title(" - E-Hentai", 1).replace(/\|.+/, "").replace(/\//, "").trim(),
        go: 1,
        topButton: true,
        threading: 4,
        category: "hcomic"
    }, {
        name: "nhentai圖片清單頁 nhentai.net nyahentai.red www.hentai.name nhentai.xxx nhentai.to",
        reg: /(nhentai\.net|nyahentai\.red|www\.hentai\.name|nhentai\.xxx|nhentai\.to)\/g\/\d+\/?$/,
        imgs: () => {
            if (/nhentai\.net/.test(siteUrl)) {
                return fun.getImgA("#image-container img", "a.gallerythumb", 300);
            } else if (/nyahentai\.red|nhentai\.xxx|nhentai\.to/.test(siteUrl)) {
                return [...fun.gae(".thumbs img,.thumb-container img")].map(e => e.dataset.src.replace(/t\.jpg/, ".jpg").replace(/t\.png/, ".png"));
            } else if (/www\.hentai\.name/.test(siteUrl)) {
                return [...fun.gae(".thumb-container img")].map(e => e.src.replace("_thumb\.jpg", ".jpg"));
            }
        },
        button: [4, "100%"],
        insertImg: [
            [".thumbs,#thumbnail-container", 0], 2
        ],
        autoClick: ["#show-all-images-button"],
        customTitle: () => {
            let h2 = fun.geT("h2.title,h2");
            if (h2.length > 4) {
                return h2;
            } else {
                return fun.geT("h1.title,h1");
            }
        },
        threading: 2,
        go: 1,
        topButton: true,
        css: ".advt{display:none!important}",
        category: "hcomic"
    }, {
        name: "Cathentai/Hentaibeeg/Hentaicolor/圖片清單頁showAll cathentai.net hentaibeeg.com hentaicolor.net",
        reg: /(cathentai\.net|hentaibeeg\.com|hentaicolor\.net)\/[^/]+\/(#collapse)?$/i,
        icon: 0,
        key: 0,
        autoClick: ["#showAll"],
        category: "hcomic"
    }, {
        name: "Cathentai/Hentaibeeg/Hentaicolor/List Read頁 cathentai.net hentaibeeg.com hentaicolor.net",
        reg: /(cathentai\.net|hentaibeeg\.com|hentaicolor\.net)\/read\/\d+\.html$/i,
        imgs: () => fun.run(fun.geT("#listImgH")),
        button: [4],
        insertImg: ["#image-container", 2],
        customTitle: () => fun.title(/ - Cathentai| - Hentaicolor| - Hentaibeeg/, 1),
        category: "hcomic"
    }, {
        name: "3hentai圖片清單頁 3hentai.net",
        reg: /(www\.3hentai1\.buzz|3hentai\.net)\/\??d\/\d+$/,
        imgs: () => fun.getImgA(".js-main-img", ".single-thumb>a", 100),
        button: [4, "100%"],
        insertImg: [
            ["#thumbnail-gallery", 0], 2
        ],
        customTitle: () => fun.geT("#main-info>h2"),
        go: 1,
        topButton: true,
        threading: 4,
        //css: "#header-ban-agsy,#middle-ban-agsy,#footer-ban-agsy{display:none!important}.single-thumb-col{padding:0px!important;width:100%!important}",
        category: "hcomic"
    }, {
        name: "HentaiFox圖片清單頁 hentaifox.com",
        reg: /hentaifox\.com\/gallery\/\d+\/$/,
        include: ".view_group",
        imgs: async () => {
            fun.show(displayLanguage.str_04, 0);
            await fun.waitEle(".view_group[style]");
            fun.hide();
            return [...fun.gae(".gallery_thumb img")].map(e => e.dataset.src.replace("t.", "."));
            //return fun.getImgA("#gimg", ".g_thumb>a", 300);
        },
        button: [4, "100%"],
        insertImg: [
            ["#append_thumbs", 0], 2
        ],
        autoClick: ["#load_all"],
        customTitle: () => fun.geT(".info>h1"),
        go: 1,
        topButton: true,
        threading: 4,
        category: "hcomic"
    }, {
        name: "HentaiFox圖片清單頁 hentaifox.com",
        reg: /hentaifox\.com\/gallery\/\d+\/$/,
        imgs: () => {
            return [...fun.gae(".gallery_thumb img")].map(e => e.dataset.src.replace("t.", "."));
            //return fun.getImgA("#gimg", ".g_thumb>a", 300);
        },
        button: [4, "100%"],
        insertImg: [
            ["#append_thumbs", 0], 2
        ],
        customTitle: () => fun.geT(".info>h1"),
        go: 1,
        topButton: true,
        threading: 4,
        category: "hcomic"
    }, {
        name: "nhentai閱讀頁 nhentai.com",
        reg: /nhentai\.com\/\w+\/comic\/[^/]+\/reader\//i,
        imgs: ".vertical-image img[data-src]",
        button: [4],
        insertImg: [".reader", 2],
        customTitle: async () => {
            await fun.delay(1000, 0);
            return fun.geT(".router-link-active")
        },
        category: "hcomic"
    }, {
        name: "Pururin圖片清單頁 pururin.to",
        reg: /pururin\.to\/gallery\/\d+\/.+/,
        enable: 1,
        icon: 0,
        key: 0,
        autoClick: ["//button[contains(text(),'View all')]"],
        category: "hcomic"
    }, {
        name: "Pururin閱讀頁 pururin.to",
        reg: /pururin\.to\/read\/\d+\/\d+\/.+/,
        imgs: () => {
            let ele = fun.ge(".img-viewer");
            let svr = ele.dataset.svr;
            let data = JSON.parse(ele.dataset.img);
            //按頁數排列
            let arr = data.images.sort((a, b) => {
                return a.page - b.page;
            });
            return arr.map(e => svr + "/" + data.directory + "/" + e.filename);
        },
        button: [4],
        insertImg: [".img-viewer", 2],
        customTitle: () => fun.ge("[placeholder=Japanese]").value,
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "hcomic"
    }, {
        name: "9hentai閱讀頁 9hentai.to",
        reg: /9hentai\.to\/g\/\d+\/\d+\/$/,
        delay: 300,
        imgs: () => {
            let arr = [];
            let path = fun.ge(".image-viewer .img-fluid").src.match(/.+\//)[0];
            let max = fun.attr(".number-input__input", "max");
            for (let i = 1; i <= max; i++) {
                arr.push(path + i + ".jpg");
            }
            return arr;
        },
        button: [4],
        insertImg: [".image-viewer", 2],
        customTitle: () => fun.title(" - Page", 1),
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "hcomic"
    }, {
        name: "AsmHentai閱讀頁 asmhentai.com",
        reg: /asmhentai\.com\/gallery\/\d+\/\d+\/$/,
        imgs: () => {
            let arr = [];
            let path = document.querySelector("#fimg").dataset.src.match(/.+\//)[0];
            let max = $("#pages").val();
            for (let i = 1; i <= max; i++) {
                arr.push(path + i + ".jpg");
            }
            return arr;
        },
        insertImg: [".rd_fimg", 2],
        customTitle: () => fun.title(" Page", 1),
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "hcomic"
    }, {
        name: "AsmHentai View All asmhentai.com",
        reg: /asmhentai\.com\/g\/\d+\/$/,
        icon: 0,
        key: 0,
        autoClick: ["#load_all"],
        category: "hcomic"
    }, {
        name: "MultPorn閱讀頁 multporn.net",
        reg: /multporn\.net\//,
        include: "//script[contains(text(),'configUrl')]",
        imgs: () => {
            let str = [...document.scripts].find(s => s.innerHTML.search(/configUrl/) > -1).innerHTML.match(/configUrl":"[^,]+/g)[0].slice(12, -1).replaceAll("\\", "");
            let url = location.origin + str;
            return fetch(url).then(res => res.text()).then(res => {
                let xml = fun.xml(res);
                let imgs = [...fun.gae("image", xml)];
                return imgs.map(e => e.getAttribute("linkURL"));
            });
        },
        button: [4],
        insertImg: [
            [".juicebox-parent", 2], 2
        ],
        go: 1,
        autoDownload: [0],
        next: "//a[text()='Next Part']",
        prev: "//a[text()='Previous Part']",
        customTitle: () => fun.geT("#page-title"),
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "hcomic"
    }, {
        name: "HentaiHere閱讀頁 hentaihere.com",
        reg: /hentaihere\.com\/m\/\w+\/\d+\/\d+\/$/i,
        include: "//script[contains(text(),'rff_imageList')]",
        imgs: () => rff_imageList.map(e => "https://hentaicdn.com/hentai" + e),
        button: [4],
        insertImg: ["#reader-content", 2],
        autoDownload: [0],
        next: "//li[a[@class='bg-info']]/following-sibling::li[1]/a",
        prev: 1,
        customTitle: () => fun.geT("#detail span") + " - " + fun.geT("#chapter span"),
        css: ".afs_ads,[data-type]{display:none!important}",
        category: "hcomic"
    }, {
        name: "HentaiPaw圖片清單頁 hentaipaw.com",
        reg: /hentaipaw\.com\/articles\/\d+/i,
        delay: 2000,
        imgs: async () => {
            fun.show("獲取數據中...", 0);
            let url = fun.ge(".gallery-image-container a").href;
            let doc = await fun.fetchDoc(url);
            let data = [...doc.scripts].find(s => s.innerHTML.search(/startingPage/) > -1).innerHTML.replace(/\\/g, "").match(/\[{.+"}]/)[0];
            fun.hide();
            return JSON.parse(data).map(e => e.src);
        },
        button: [4, "100%"],
        insertImg: [
            [".detail-gallery-list", 2], 2
        ],
        go: 1,
        customTitle: () => fun.geT(".detail-ttl").replace(/\/|\|/g, " "),
        category: "hcomic"
    }, {
        name: "HDpornComics圖片清單頁 hdporncomics.com",
        reg: /hdporncomics\.com\/[^/]+\/([^/]+\/)?$/i,
        include: ".my-gallery.scrollmenu",
        imgs: ".my-gallery a[data-size]",
        button: [4],
        insertImg: [
            [".postContent>.items-center,#likeDislikeVue", 2], 2
        ],
        go: 1,
        customTitle: () => fun.geT("#infoBox>h1").replace(" – Gay Manga", "").replace(" Comic Porn", ""),
        category: "hcomic"
    }, {
        name: "HDpornComics閱讀頁 hdporncomics.com",
        reg: /hdporncomics\.com\/manhwa\/[^/]+\/chapter/i,
        imgs: "#imageContainer>img",
        button: [4],
        insertImg: ["#imageContainer", 2],
        autoDownload: [0],
        next: "//a[contains(text(),'Next')]",
        prev: "//a[contains(text(),'Prev')]",
        customTitle: () => fun.geT(".list-reset li:nth-child(5)>a") + " - " + fun.geT("option[selected]"),
        category: "hcomic"
    }, {
        name: "Doujins圖片清單頁 doujins.com",
        reg: /doujins\.com\/.+\/.+/i,
        include: "#thumbnails",
        imgs: ".swiper-wrapper>div:not(:first-of-type):not(:last-of-type) .swiper-lazy",
        button: [4],
        insertImg: [
            ["#thumbnails", 2], 2
        ],
        go: 1,
        customTitle: () => fun.geT(".folder-title>a:last-child"),
        category: "hcomic"
    }, {
        name: "Simply Hentai圖片清單頁 www.simply-hentai.com",
        reg: /www\.simply-hentai\.com\/[0-9a-z-]+\/.+/i,
        include: "//main[@class='container' and div[div[a[div[@class='image-wrapper' and img]]]]]",
        exclude: "nav.pagination,#reader-image",
        imgs: () => [...fun.gae("img[data-src]")].map(e => e.dataset.src.replace("small_thumb_", "")),
        button: [4],
        insertImg: [
            ["//main[@class='container']/*[last()]", 2], 2, 2000
        ],
        go: 1,
        autoClick: "a[href$='all-pages']",
        customTitle: () => {
            try {
                return fun.geT("h1.content-headline>a").replace(/\/|\|/g, "-");
            } catch (e) {
                return fun.geT("h1").replace(/\/|\|/g, "-");
            }
        },
        css: ".text-center{display:none!important}",
        category: "hcomic"
    }, {
        name: "Hanime1圖片清單頁 https://hanime1.me/comics",
        reg: /hanime1\.me\/comic\/\d+$/,
        imgs: () => [...fun.gae(".comics-thumbnail-wrapper img[data-srcset]")].map(e => e.dataset.srcset.replace("t.n", "i.n").replace("t.jpg", ".jpg").replace("t.png", ".png")),
        button: [4],
        insertImg: [".comics-thumbnail-wrapper", 2, 1000],
        autoClick: "#show-all-comics-btn",
        customTitle: () => fun.geT("h4.title"),
        threading: 4,
        referer: "src",
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "hcomic"
    }, {
        name: "IMHentai imhentai.xxx 圖片清單頁",
        reg: /imhentai\.xxx\/gallery\/\d+\//,
        delay: 1000,
        autoClick: "#load_all",
        imgs: async () => {
            /*
            let links = [...fun.gae("#append_thumbs a")];
            let fetchNum = 0;
            let resArr = [];
            for (let i in links) {
                let url = links[i].href;
                let res = fun.fetchDoc(url).then(doc => {
                    fun.show(`${displayLanguage.str_02}${fetchNum+=1}/${links.length}`, 0);
                    return fun.ge("#gimg", doc);
                });
                resArr.push(res);
                await fun.delay(300, 0);
            }
            return Promise.all(resArr).then(arr => {
                fun.hide();
                return arr;
            });
            */
            return [...fun.gae("#append_thumbs img")].map(e => e.dataset.src.replace("t.jpg", ".jpg").replace("t.png", ".png"));
        },
        button: [4],
        insertImg: [
            ["#append_thumbs", 0], 2, 3000
        ],
        customTitle: () => {
            let t = fun.geT(".subtitle");
            if (t.length > 0) {
                return t;
            } else {
                return fun.geT('h1').replace(/\||\+/g, "");
            }
        },
        go: 1,
        topButton: true,
        threading: 4,
        category: "hcomic"
    }, {
        name: "IMHentai imhentai.xxx",
        reg: /imhentai\.xxx\/view\/\d+\/\d+\//,
        init: "setTimeout(()=>{fun.ge('.pre_img').removeAttribute('style');$('a.next_img').unbind('click');},1000)",
        imgs: () => fun.getImgO("#gimg", fun.geT(".total_pages"), 14, [null, null], 0, ".nav_pagination", 0),
        button: [4],
        insertImg: [".pre_img", 1, 2000],
        customTitle: () => fun.title("-", 1),
        threading: 4,
        category: "hcomic"
    }, {
        name: "Hentai2Read hentai2read.com",
        reg: /hentai2read\.com\/\w+\/\d+\/(\d+\/)?$/,
        imgs: () => gData.images.map(e => "https://static.hentai.direct/hentai" + e),
        button: [4],
        insertImg: ["#js-reader", 2],
        autoDownload: [0],
        next: "//li[a[contains(@class,'bg-info')]]/preceding-sibling::li[1]/a",
        prev: 1,
        customTitle: () => fun.geT(".reader-left-text.text-ellipsis").replace(/\//g, "-"),
        //threading: 4,
        category: "hcomic"
    }, {
        name: "XlecX xlecx.one",
        reg: /xlecx\.one\/[\w-]+\.html$/,
        imgs: ".ug-thumb-image,img[data-src]",
        button: [4],
        insertImg: [
            [".page__col-left", 0], 2
        ],
        go: 1,
        customTitle: () => fun.geT(".page__col-left>h1"),
        category: "hcomic"
    }, {
        name: "HentaiPorns hentaiporns.net",
        reg: /hentaiporns\.net\/[\w-]+\/$/,
        include: ".gallery",
        imgs: ".gallery-item a",
        button: [4, "100%"],
        insertImg: [
            [".gallery", 0], 2
        ],
        go: 1,
        customTitle: () => {
            let ele = fun.ge("#gn+h1");
            if (ele) {
                return fun.geT("#gn+h1");
            } else {
                return fun.geT("#gn,.entry-title");
            }
        },
        category: "hcomic"
    }, {
        name: "8muses comics.8muses.com",
        reg: /https?:\/\/comics\.8muses\.com\/comics\/album\/[\w-]+\/[\w-]+\//i,
        include: ".gallery",
        exclude: ".image-title>.title-text",
        imgs: () => {
            let th = [...fun.gae("img[data-src]")].map(e => e.dataset.src.replace("/image/th/", "https://comics.8muses.com/image/fl/"));
            let arr = [];
            let loadnum = 0;
            fun.show("Loading...", 0);
            for (let i in th) {
                let promise = new Promise(resolve => {
                    let temp = new Image();
                    temp.src = th[i];
                    temp.onload = () => {
                        loadnum++;
                        fun.show(`Loading ${loadnum}/${th.length}`, 0);
                        resolve(th[i]);
                    }
                    temp.onerror = () => {
                        loadnum++;
                        fun.show(`Loading ${loadnum}/${th.length}`, 0);
                        resolve(th[i].replace("/fl/", "/fm/"));
                    }
                });
                arr.push(promise);
            }
            return Promise.all(arr).then(arr => {
                fun.hide();
                return arr;
            });
        },
        button: [4],
        insertImg: [
            [".gallery", 2], 1
        ],
        go: 1,
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "hcomic"
    }, {
        name: "H漫畫貼圖 - 7mmtv.sx",
        reg: /7mmtv\.sx\/.*hcomic/,
        include: "//script[contains(text(),'Large_cgurl')]",
        imgs: () => {
            let arr = Large_cgurl.map(e => {
                if (/imgur/.test(e)) return e;
                return null;
            });
            arr = arr.filter(item => item);
            if (arr.length == 0) {
                return Large_cgurl;
            } else {
                return arr;
            }
        },
        button: [4],
        insertImg: ["#show_cg_html", 2],
        customTitle: () => fun.title(" - 7mmtv.sx", 1).replace(/\s?\(\d+P\)/i, ""),
        css: ".ut1_img_content_js{display:none!important}",
        category: "hcomic"
    }, {
        name: "18H 18h.mm-cg.com",
        reg: /18h\.mm-cg\.com\/(zh\/?)\w+_content\/\d+\/content\.html/i,
        imgs: () => Large_cgurl,
        button: [4],
        insertImg: ["#show_cg_html", 2],
        customTitle: () => fun.title("-", 1),
        category: "hcomic"
    }, {
        name: "H 次元 h-ciyuan.com",
        reg: /h-ciyuan\.com\/\d+\/\d+\/.+\//,
        include: "a[data-fancybox],.rl-gallery-container a",
        imgs: "a[data-fancybox],.rl-gallery-container a",
        button: [4],
        //insertImg: [".entry-content", 2],
        insertImg: [
            [".entry-content,.rl-gallery-container", 2], 2
        ],
        go: 1,
        next: ".nav-previous>a",
        prev: ".nav-next>a",
        customTitle: () => fun.geT(".post-title"),
        category: "hcomic"
    }, {
        name: "淫漫画 www.yinmh.com www.yinmh.top www.yinmh.xyz",
        reg: /www\.yinmh\.(com|top|xyz)\/\d+\.html/,
        imgs: () => {
            let arr = [];
            [...fun.gae(".left>.image img.lazy")].forEach(e => {
                if (!/loading/.test(e.src)) {
                    arr.push(e.src);
                } else {
                    arr.push(e.getAttribute("img"));
                }
            });
            return arr;
        },
        button: [4],
        insertImg: [".left", 2],
        customTitle: () => fun.geT(".box>h1"),
        category: "hcomic"
    }, {
        name: "漫畫聯合國 www.comicun.com",
        reg: /www\.comicun\.com\/index-look(-cid)?-name-.+/,
        FixURL: url => {
            if (/index-look-cid-name-/.test(url)) {
                let arr = url.split("-");
                let str = "";
                for (let i = 0; i < arr.length; i++) {
                    if (i == 7) {
                        str += arr[i];
                    } else if (i == 5) {
                        str += "cid-" + arr[i] + "-";
                    } else if (i != 2) {
                        str += arr[i] + "-";
                    }
                }
                return decodeURI(str);
            } else {
                return decodeURI(url);
            }
        },
        init: () => {
            $(document).unbind("click");
            if (/index-look-cid-name-/.test(siteUrl)) {
                location.href = siteData.FixURL(siteUrl);
            }
            [...fun.gae("//a[text()='下一章'] | //a[text()='上一章']")].forEach(a => {
                a.href = siteData.FixURL(a.href);
            });
        },
        imgs: () => fun.getImg("#ComicPic", $("#total").val(), 20),
        button: [4],
        insertImg: [".e", 1],
        autoDownload: [0],
        next: "//a[text()='下一章']",
        prev: 1,
        css: "body{overflow:unset!important}",
        category: "comic"
    }, {
        name: "丽图·污漫画 litu100.xyz",
        reg: /litu\d+\.xyz\/comic\/id-\w+\/\d+\.html/,
        imgs: ".article.comic img",
        button: [4],
        insertImg: [".article.comic", 2],
        autoDownload: [0],
        next: "a.next",
        prev: "a.prev",
        customTitle: () => fun.geT(".breadcrumb span:nth-child(2)").replace("首页", ""),
        category: "hcomic"
    }, {
        name: "韩国污漫画 www.ikanmh.xyz www.hmfby.com",
        reg: /(www\.ikanmh\.xyz|www\.mxshm\.site|www\.92hm\.life|www\.ikanhm\.xyz|592mh\.top|592hm\.top|52wxz\.top|52kanmh\.top|52kanhm\.top|52hmw\.top|92comic\.top|91comic\.top|18comic2\.top|ikanyy\.top|18hm\.top|yycomic\.top|18hcomic\.top|18xcomic\.top|18xmh\.top|18xhm\.top|iikanwxz\.top|ikwxz\.top|wxzmh\.top)\/chapter\/\d+/,
        imgs: "img[data-original]",
        button: [4],
        insertImg: [".comicpage", 2],
        autoDownload: [0],
        next: "//a[text()='下一章']",
        prev: "//a[text()='上一章']",
        customTitle: () => fun.geT("h1.title"),
        referer: "src",
        category: "hcomic"
    }, {
        name: "Avbebe.com https://avbebe.com/archives/category/%e6%88%90%e4%ba%bah%e6%bc%ab%e7%95%ab",
        reg: /avbebe\.com\/archives\/\d+/,
        include: "//a[@rel='category tag' and text()='成人漫畫']",
        imgs: "img[decoding]",
        button: [4],
        insertImg: [".content-inner", 2],
        customTitle: () => fun.geT(".jeg_post_title").replace(/\[\d+P\]/i, ""),
        category: "hcomic"
    }, {
        name: "ACG漫画网 www.acgomh.com www.acgxmh.com www.acgomh.com www.cool-manga.com www.porn-comic.com",
        reg: /(www\.acg(x|o)mh\.com|www\.cool-manga\.com|www\.porn-comic\.com)\/(h|hentai)\/\d+\.html/,
        imgs: () => fun.getImg(".manga-page img", fun.geT("#pages>*:last-child", 2), 5),
        button: [4],
        insertImg: [".manga-page", 1],
        autoDownload: [0],
        next: ".next_pics>.fr>a[href$=html]",
        prev: ".next_pics>.fl>a[href$=html]",
        customTitle: () => fun.geT("h2.title,h1.title").replace(/_\d+P$/i, ""),
        category: "hcomic"
    }, {
        name: "紳士漫畫 圖片清單頁 wnacg.com www.wnacg.com www.wnacg.org m.wnacg.org m.wnacg.com www.wnacglink.top wn01.ru wn02.ru www.htmanga3.top www.htmanga4.top www.htmanga5.top www.hentaicomic.ru www.wn3.lol",
        reg: /https:\/\/(wnacg\.com|www\.wnacg\.com|www\.wnacg\.org|m\.wnacg\.com|m\.wnacg\.org|www\.htmanga\d\.top|www\.hentaicomic\.ru|www\.wn3\.lol)\/photos-index(-page-\d+)?-aid-\d+\.html/,
        icon: 0,
        key: 0,
        init: () => {
            fun.getNP(".gallary_item", ".thispage+a", null, ".paginator", 0, null, 0);
        },
        category: "nsfw2"
    }, {
        name: "紳士漫畫 下拉閱讀頁 wnacg.com www.wnacg.com www.wnacg.org m.wnacg.org m.wnacg.com www.wnacglink.top wn01.ru wn02.ru www.htmanga3.top www.htmanga4.top www.htmanga5.top www.hentaicomic.ru www.wn3.lol",
        reg: /https:\/\/(wnacg\.com|www\.wnacg\.com|www\.wnacg\.org|m\.wnacg\.com|m\.wnacg\.org|www\.htmanga\d\.top|www\.hentaicomic\.ru|www\.wn3\.lol)\/photos-(slide|slidelow|list)-aid-\d+\.html/,
        imgs: () => imglist.map(e => e.url),
        button: [4],
        insertImg: ["#img_list", 2],
        customTitle: () => fun.title(" - 列表", 1),
        category: "hcomic"
    }, {
        name: "VN漫画网 下拉阅读 www.vnacg.com",
        reg: /(www|m)\.vnacg\.com\/show\/\d+\.html/,
        imgs: async () => {
            fun.show(displayLanguage.str_05, 0);
            let api = `/e/extend/api/show.php?id=${info.id}&page=`;
            let max = await fetch(`${api}1`).then(res => res.json()).then(res => {
                return res.pages;
            });
            let resArr = [];
            let fetchNum = 0;
            for (let i = 1; i <= max; i++) {
                let res = fetch(`${api+i}`).then(res => res.json()).then(res => {
                    fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${max}`, 0);
                    return res.data;
                });
                resArr.push(res);
            }
            return Promise.all(resArr).then(data => {
                fun.hide();
                return data.flat().map(e => e.src);
            });
        },
        button: [4],
        insertImg: [".show,.read", 2],
        customTitle: () => fun.title("_免费阅读", 1),
        category: "hcomic"
    }, {
        name: "VN漫画网 清單頁 www.vnacg.com",
        reg: /www\.vnacg\.com\/detail\/\d+\.html/,
        icon: 0,
        key: 0,
        observerClick: ".layui-flow-more>a",
        category: "hcomic"
    }, {
        name: "TWHentai 圖片清單頁 twhentai.com",
        reg: /twhentai\.com\/hentai_manga\/\d+\/$/,
        imgs: async () => {
            await fun.getNP(".recommended-grids:not(.english-grid)", ".pagination li.active+li:not(.disabled)>a", null, ".pagination");
            return [...fun.gae(".recommended img")].map(e => e.src.replace("-thumb265x385", ""));
        },
        button: [4, "100%"],
        insertImg: [
            [".footer", 1], 2
        ],
        go: 1,
        customTitle: () => fun.geT(".recommended-info h3"),
        category: "hcomic"
    }, {
        name: "松鼠症倉庫 ahri8.top",
        reg: /\/readOnline\d\.php\?ID=\d+&host_id=\d+/,
        include: "//div[@id='logo-group']//a[contains(text(),'松鼠症倉庫') or contains(text(),'松鼠症仓库')]",
        imgs: () => Original_Image_List.map(e => HTTP_IMAGE + e.new_filename + "_w1500." + e.extension),
        button: [4],
        insertImg: ["#Big_Image", 2],
        customTitle: () => fun.geT(".page-header").replace("線上閱讀", ""),
        css: "#content>.col-lg-12,[id^=read_online_ads_area],#Big_Image~*{display:none!important}",
        category: "hcomic"
    }, {
        name: "Caitlin.top",
        reg: /caitlin\.top\/index\.php\?route=comic\/readOnline&comic_id=\d+/,
        imgs: () => Image_List.map(e => location.protocol + HTTP_IMAGE + e.sort + "." + e.extension),
        button: [4],
        insertImg: ["#Big_Image", 2],
        customTitle: () => fun.geT(".page-header"),
        css: "#content>.col-lg-12,[id^=read_online_ads_area],#Big_Image~*{display:none!important}",
        category: "hcomic"
    }, {
        name: "禁漫屋 https://jmwu.cc/ jmwu.vip m.jmwu.vip 88comic.vip",
        reg: /(jmwu|88comic)\.\w+\/chapter\/[\w-]+\.html/,
        init: () => {
            fun.remove("//main/div[div[a[img]]]");
        },
        imgs: "img[data-original]",
        button: [4],
        insertImg: [".reader-cartoon-chapter", 2],
        autoDownload: [0],
        next: "a[data-value=next]",
        prev: "a[data-value=prev]",
        customTitle: () => fun.title(/ – White|-禁漫屋| - 禁漫屋|-\[| “/, 1),
        category: "hcomic"
    }, {
        name: "Roku Hentai rokuhentai.com",
        reg: /https:\/\/rokuhentai\.com\/\w+\/\d+$/,
        imgs: ".site-reader__image",
        button: [4],
        insertImg: [".site-reader", 2],
        css: ".site-reader--right-to-left,.site-reader--left-to-right{overflow-x:auto!important;overflow-y:auto!important}.site-reader{padding-bottom:0px!important}.site-reader{display:block!important;}.site-bottom-ad-slot{display:none!important}",
        category: "hcomic"
    }, {
        name: "177 漫画/XXIAV寫真館 www.177pica.com www.177picyy.com www.xxiav.com",
        reg: /www\.(177pica|177picyy|xxiav)\.com\/html\/\d+\/\d+\/\d+\.html/,
        imgs: () => fun.getImg(".single-content img[data-lazy-src]", (fun.geT(".page-links>*:last-child", 2) || 1), 10),
        button: [4],
        insertImg: [".single-content", 2],
        autoDownload: [0],
        next: "a[rel=prev]",
        prev: 1,
        customTitle: () => fun.geT(".entry-title").replace(/\[\d+P\]$/i, ""),
        category: "hcomic"
    }, {
        name: "18H 宅宅愛動漫 18h.animezilla.com",
        reg: /18h\.animezilla\.com\/manga\/\d+/,
        imgs: () => {
            let max;
            try {
                max = fun.ge(".last").href.split("/").pop();
            } catch (e) {
                max = 1;
            }
            return fun.getImgO("#comic", max, "4", [null, null], 0, ".entry-title,.wp-pagenavi", 0);
        },
        button: [4],
        insertImg: ["#page-current", 1],
        customTitle: () => fun.geT("h1.entry-title").replace(/\s?\[\d+P\](\s?-\s?\d+\/\d+\s?)?/i, ""),
        category: "hcomic"
    }, {
        name: "18 禁漫 www.18mh.cc",
        reg: /www\.18mh\.cc\/index-look-name-/,
        imgs: () => {
            let url = fun.attr("img[data-url]", "data-url");
            let m = url.match(/(^.+\/)(\d+)(\.\w{2,4})$/);
            let path = m[1];
            let start = m[2];
            let ex = m[3];
            let ps = fun.gae("select[onchange]>option").length;
            let end = parseInt(start) + ps;
            let arr = [];
            for (let i = start; i < end; i++) {
                arr.push(path + i + ex);
            }
            return arr;
        },
        button: [4],
        insertImg: [".e", 2],
        autoDownload: [0],
        next: "//a[text()='下一章']",
        prev: "//a[text()='上一章']",
        customTitle: () => {
            let s = fun.geT(".b").split(" - ");
            return s[2] + " - " + s[3];
        },
        css: ".p.fanye,select[onchange],.c_p.k_pag{display:none!important}",
        category: "hcomic"
    }, {
        name: "色漫网 www.cartoon18.com",
        reg: /www\.cartoon18\.com\/story\/\d+\/full/,
        imgs: "img[data-src]",
        category: "hcomic"
    }, {
        name: "韓漫射 h-webtoon.com 绅士同人H漫 h-doujinshi.xyz",
        reg: /(h-webtoon\.com|h-doujinshi\.xyz)\/.+\//,
        init: "setTimeout(()=>{fun.gae('.g1-nav-single a').forEach(e=>{e.removeAttribute('target')})},2000)",
        include: ".g1-content-narrow",
        imgs: ".g1-content-narrow p img",
        button: [4],
        insertImg: [".g1-content-narrow", 2],
        autoDownload: [0],
        next: "#content .g1-teaser-next",
        prev: "#content .g1-teaser-prev",
        customTitle: () => fun.geT("h1.entry-title"),
        css: "#simple-banner,.touchy-wrapper,.touchy-wrapper~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(.fancybox-container),.code-block,#secondary{display:none!important}",
        category: "hcomic"
    }, {
        name: "18H漫画 18hmanga.click",
        reg: /(18hmanga\.click)\/.+\//,
        init: "setTimeout(()=>{fun.gae('.g1-nav-single a').forEach(e=>{e.removeAttribute('target')})},2000)",
        include: ".g1-content-narrow",
        imgs: ".g1-content-narrow p img",
        autoDownload: [0],
        next: "#content .g1-teaser-prev",
        prev: "#content .g1-teaser-next",
        customTitle: () => fun.geT("h1.entry-title"),
        css: "#simple-banner,.touchy-wrapper,.touchy-wrapper~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(.fancybox-container),.code-block,#secondary{display:none!important}",
        category: "hcomic"
    }, {
        name: "hitomi hitomi.la",
        reg: /hitomi\.la\/reader\/\d+\.html/,
        init: "setTimeout(()=>{$(document).unbind('keydown');$(document).unbind('click')},1000)",
        imgs: async () => {
            await fun.waitEle("#mobileImages .lillie", 11);
            fun.ge("#comicImages").setAttribute("class", "fitVertical");
            fun.ge("#mobileImages").setAttribute("class", "hidden");
            return galleryinfo.files.map((e, i) => url_from_url_from_hash(galleryinfo["id"], our_galleryinfo[i], "webp", undefined, "a"));
        },
        button: [4],
        insertImg: ["#comicImages", 2],
        customTitle: () => fun.title("|", 1),
        css: "body{overflow:unset!important}#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        threading: 5,
        category: "hcomic"
    }, {
        name: "Orzqwq List模式 orzqwq.com",
        reg: /orzqwq\.com\/manga\/.+style=list/,
        include: "//option[@selected and text()='List style']",
        imgs: async () => {
            fun.show(displayLanguage.str_04, 0);
            await fun.waitEle(".img-responsive", 600);
            fun.hide();
            return [...fun.gae("img[data-src]")];
        },
        insertImg: [".reading-content", 2],
        customTitle: () => fun.geT(".breadcrumb>li:nth-child(2)").trim(),
        category: "hcomic"
    }, {
        name: "Orzqwq 分頁模式 orzqwq.com",
        reg: /orzqwq\.com\/manga\/.+\/p\//,
        include: "//option[@selected and text()='Paged style']",
        imgs: async () => {
            fun.show(displayLanguage.str_04, 0);
            await fun.waitEle("#chapter_preloaded_images", 600);
            fun.hide();
            return chapter_preloaded_images;
        },
        insertImg: [".reading-content", 2],
        customTitle: () => fun.geT(".breadcrumb>li:nth-child(2)").trim(),
        category: "hcomic"
    }, {
        name: "Orzqwq 圖片清單頁聚集所有預覽縮圖 orzqwq.com",
        reg: /orzqwq\.com\/manga\/[^/]+\/$/,
        icon: 0,
        key: 0,
        init: () => {
            fun.getNP(".chapter-images-list>.image-item", "li.active+li>a", null, ".pagination", 0, "data-src", 0);
        },
        category: "hcomic"
    }, {
        name: "HO5HO www.ho5ho.com",
        reg: /www\.ho5ho\.com\/.+\/.+\/server.+\//,
        include: "//script[contains(text(),'chapter_preloaded_images')]",
        imgs: () => chapter_preloaded_images,
        insertImg: [".reading-content", 2],
        customTitle: () => fun.geT(".breadcrumb>li:nth-child(2)").trim(),
        category: "hcomic"
    }, {
        name: "亚洲漫画走廊 asiacomics.com",
        reg: /asiacomics\.com\/chapter\/\d+/,
        imgs: "#enc_img img[data-original]",
        button: [4],
        insertImg: [".comicpage", 2],
        autoDownload: [0],
        next: "//a[text()='下一章']",
        prev: "//a[text()='上一章']",
        customTitle: () => fun.geT("h1.title"),
        category: "hcomic"
    }, {
        name: "成人漫画 bad.news/mh",
        reg: /bad\.news\/mh\/view\/id-\d+/,
        imgs: ".img-responsive",
        button: [4],
        insertImg: ["//div[img[@class='img-responsive']]", 2],
        threading: 4,
        category: "hcomic"
    }, {
        name: "H漫画 mhdnf.xyz www.mhdnf.xyz mhqwe.xyz www.mhqwe.xyz",
        reg: /https?:\/\/(www\.)?(mhdnf|mhqwe)\.xyz\/play\?linkId=\d+&bookId=\d+&path=\d+&key=.+/,
        imgs: "#imgList>img:not([src*=QRCode])",
        button: [4],
        insertImg: ["#imgList", 2],
        autoDownload: [0],
        next: "//a[text()='下一話']",
        prev: "//a[text()='上一話']",
        customTitle: () => fun.attr("meta[name='apple-mobile-web-app-title']", "content"),
        category: "hcomic"
    }, {
        name: "JComic jcomic.net",
        reg: /https?:\/\/jcomic\.net\/page\/[^\/]+$/,
        imgs: ".comic-view,.comic-thumb",
        button: [4],
        insertImg: ["//div[img[@class='img-responsive comic-thumb']]", 2],
        threading: 10,
        customTitle: () => fun.geT("//ol/li[2]/a"),
        category: "hcomic"
    }, {
        name: "JComic jcomic.net",
        reg: /https?:\/\/jcomic\.net\/page\/[^\/]+\/[0-9\.]+$/,
        imgs: ".comic-view,.comic-thumb",
        button: [4],
        insertImg: ["//div[img[@class='img-responsive comic-thumb']]", 2],
        autoDownload: [0],
        next: () => {
            let next = fun.ge("//a[button[text()='下一章']]");
            if (next && next.href != location.href) {
                return next.href;
            } else {
                return null;
            }
        },
        prev: 1,
        threading: 10,
        customTitle: () => fun.geT("//ol/li[2]/a") + " - " + fun.geT("//ol/li[3]"),
        category: "hcomic"
    }, {
        name: "一之涩漫画 1zse.com",
        reg: /^https?:\/\/1zse\.com\/index\.php\/\d+\.html/,
        imgs: () => {
            let max = fun.ge("a.last").href.split("/").pop();
            return fun.getImg(".context img", max, 7);
        },
        button: [4],
        insertImg: [".context", 2],
        autoDownload: [0],
        next: ".post-previous a",
        prev: ".post-next a",
        customTitle: () => fun.geT("#content h1").replace(/\[\d+P\]/i, ""),
        category: "hcomic"
    }, {
        name: "那露漫画 naluhd.com",
        reg: /^https?:\/\/naluhd\.com\/index\.php\/\d+\.html/,
        imgs: () => fun.getImgA(".article-content img", "a.post-page-numbers"),
        button: [4],
        insertImg: [".article-content", 2],
        autoDownload: [0],
        next: "//a[p[text()='上一篇'] and not(starts-with(@href,'java'))]",
        prev: "//a[p[text()='下一篇'] and not(starts-with(@href,'java'))]",
        customTitle: () => fun.geT(".article-title>a").replace(/\[\d+P\]/i, ""),
        category: "hcomic"
    }, {
        name: "色色漫画 sesemanhua.com",
        reg: /^https:\/\/sesemanhua\.com\/index\.php\/chapter\/\d+/,
        imgs: ".rd-article-wr img",
        button: [4],
        insertImg: [".rd-article-wr", 2],
        autoDownload: [0],
        next: ".j-rd-next",
        prev: ".j-rd-prev",
        customTitle: () => fun.geT(".comic-title>a"),
        category: "hcomic"
    }, {
        name: "韓漫天堂 18jin.top",
        reg: /^https:\/\/18jin\.top\/index\.php\/chapter\/\d+/,
        imgs: ".rd-article-wr img",
        button: [4],
        insertImg: [".rd-article-wr", 2],
        autoDownload: [0],
        next: ".j-rd-next",
        prev: ".j-rd-prev",
        customTitle: () => fun.geT(".j-comic-title") + " - " + fun.geT(".comic-title>a"),
        category: "hcomic"
    }, {
        name: "琴瑟漫畫 sixcomic.com 琴瑟書庫 sixacg.com",
        reg: /^https?:\/\/(sixcomic\.com|sixacg\.com)\/chapter\/\d+$/,
        imgs: ".comicpage img:not([data-original*='qssk.top']),#cp_img img:not([data-original*='qssk.top'])",
        button: [4],
        insertImg: [".comicpage", 2],
        autoDownload: [0],
        next: "//a[@href and not(starts-with(@href,'java')) and text()='下一章']",
        prev: "//a[@href and not(starts-with(@href,'java')) and text()='上一章']",
        customTitle: () => fun.title(/免费阅读|在线阅读/, 1),
        category: "hcomic"
    }, {
        name: "香香腐宅 boylove.cc boylove1.mobi",
        reg: /^https:\/\/boylove\d?\.\w+\/home\/book\/capter\/id\/\d+/,
        imgs: "img[data-original]",
        button: [4],
        insertImg: [".reader-cartoon-chapter", 2],
        autoDownload: [0],
        next: "a[data-value=next]",
        prev: "a[data-value=prev]",
        customTitle: () => fun.geT(".title a").trim(),
        category: "hcomic"
    }, {
        name: "一耽女孩 yidan.in yidan.one yidan.app",
        reg: /^https:\/\/yidan\.(in|one|app)\/#\/pages\/read\/read\?no=\d+&id=\d+(&episodesId=\d+)?/,
        delay: 1000,
        init: () => {
            $("uni-view.last-bum").on("click", () => {
                setTimeout(() => {
                    location.reload();
                }, 300);
            });
        },
        imgs: () => {
            let m = siteUrl.split("&");
            let no = m[0].match(/\d+$/)[0];
            let mhid = m[1].match(/\d+/)[0];
            return fetch(`${location.origin}/prod-api/app-api/vv/mh-episodes/get?jiNo=${no}&mhid=${mhid}`).then(res => res.json()).then(json => json.data.pics.split(",").map(e => location.origin + e));
        },
        button: [4],
        insertImg: [".read-article", 2],
        autoDownload: [0],
        next: () => {
            let next = fun.ge("//a[text()='继续看下一话']");
            if (next) {
                let m = siteUrl.split("&");
                let no = parseInt(m[0].match(/\d+$/)[0]);
                let mhid = m[1].match(/\d+/)[0];
                let url = `https://yidan.in/#/pages/read/read?no=${no+=1}&id=${mhid}`;
                return url;
            } else {
                return null;
            }
        },
        prev: 1,
        customTitle: () => fun.title(" - 一耽女孩_好看的一耽漫画官网").trim(),
        css: ".page-pagination{display:none!important}",
        category: "hcomic"
    }, {
        name: "久久漫画网 www.99hanman.top",
        reg: /https:\/\/www\.99hanman\.top\/chapter\/\d+/,
        include: ".rd-article-wr",
        imgs: ".comiclist img",
        button: [4],
        insertImg: [".comiclist", 2],
        autoDownload: [0],
        next: "//a[text()='下一章' and @href]",
        prev: "//a[text()='上一章' and @href]",
        customTitle: () => fun.geT("h1.title"),
        category: "hcomic"
    }, {
        name: "久久漫画网M www.99hanman.top",
        reg: /https:\/\/www\.99hanman\.top\/chapter\/\d+/,
        imgs: "#cp_img img",
        insertImg: ["#cp_img", 2],
        autoDownload: [0],
        next: "//a[text()='下一章' and @href]",
        prev: "//a[text()='上一章' and @href]",
        customTitle: () => {
            let code = fun.geT("//script[contains(text(),'bookInfo')]");
            let bookInfo = code.match(/bookInfo\s?=\s?([^;]+)/g)[0];
            bookInfo = fun.run(bookInfo);
            return bookInfo.book_name + " - " + bookInfo.chapter_name;
        },
        category: "hcomic"
    }, {
        name: "嗨皮漫畫閱讀 https://m.happymh.com/manga/daiwangraoming",
        enable: 0,
        reg: /m\.happymh\.com\/reads/,
        include: "#root",
        xhr: async () => {
            let lps = location.pathname.split("/");
            let mangaCode = lps[2];
            let id = lps[3];
            let api = `https://m.happymh.com/v2.0/apis/manga/read?code=${mangaCode}&cid=${id}`;
            let json = await fetch(api).then(res => res.json());
            debug("\n此頁JSON資料\n", json);
            siteJson = json;
        },
        init: async () => {
            await siteData.xhr();
            let fragment = new DocumentFragment();
            let imgs = siteJson.data.scans.map(e => e.url);
            imgs.forEach(url => {
                let img = new Image();
                img.src = url;
                fragment.appendChild(img);
            });
            debug("\n圖片預讀\n", fragment);
            if (await fun.waitEle("#page-area")) {
                new IntersectionObserver((entries, observer) => {
                    if (entries[0].isIntersecting) {
                        observer.unobserve(entries[0].target);
                        let f = ge("footer>article");
                        let c1 = f.firstChild.cloneNode(true);
                        c1.firstChild.href = "/latest";
                        c1.firstChild.firstChild.innerText = "更新";
                        f.appendChild(c1);
                        let c2 = f.firstChild.cloneNode(true);
                        c2.firstChild.href = "/bookcase";
                        c2.firstChild.firstChild.innerText = "收藏";
                        f.appendChild(c2);
                        let p = gx("//a[span[text()='上一话' or text()='上一話'] and contains(@href,'reads')]");
                        if (p) {
                            p.classList.add("MuiButton-containedPrimary");
                        }
                        let n = gx("//a[span[text()='下一话' or text()='下一話'] and contains(@href,'readMore')]");
                        if (n) {
                            n.classList.remove("MuiButton-containedPrimary");
                            n.firstChild.innerText = "^_^感谢您的阅读~已经没有下一话了哦~";
                        }
                    }
                }).observe(ge('#page-area'));
            }
        },
        imgs: () => siteJson.data.scans.map(e => e.url),
        referrerpolicy: "origin",
        button: [4],
        insertImg: ["//article[div[contains(@id,'imageLoader')]]", 3],
        go: 1,
        autoDownload: [0],
        next: "//a[span[text()='下一話' or text()='下一话']]",
        autoNext: true,
        prev: "//a[span[text()='上一話' or text()='上一话']]",
        customTitle: () => siteJson.data.manga_name + " - " + siteJson.data.chapter_name,
        category: "comic"
    }, {
        name: "嗨皮漫畫更新頁,自動點擊載入更多,鏈接新分頁打開",
        enable: 0,
        icon: 0,
        key: 0,
        reg: /m\.happymh\.com\/latest/,
        observerClick: ".more-div-btn",
        openInNewTab: ".manga-cover>a:not([target=_blank])",
        category: "comic"
    }, {
        name: "嗨皮漫畫展開目錄",
        reg: /m\.happymh\.com\/manga\//,
        enable: 0,
        icon: 0,
        key: 0,
        autoClick: "#expandButton",
        category: "comic"
    }, {
        name: "嗨皮漫畫,鏈接新分頁打開",
        reg: /m\.happymh\.com\//,
        enable: 0,
        icon: 0,
        key: 0,
        openInNewTab: ".home-banner a:not([target=_blank]),.manga-rank a:not([target=_blank]),.manga-cover a:not([target=_blank])",
        category: "comic"
    }, {
        name: "COLAMANHUA www.colamanga.com", //方向鍵上一章下一章、反反偵錯,下載需先手動觸發全部載入圖片,圖址如為blob函式會使用到canvas需要繪製過程會有點卡。
        enable: 1,
        reg: /www\.(colamanga|colamanhua)\.com\/manga-.+\.html$/,
        init: async () => {
            Function.prototype.constructor = () => {};
        },
        imgs: () => {
            let blob = fun.ge(".mh_comicpic img[src^=blob]");
            let imgs;
            if (blob) {
                imgs = fun.imgBlobArr(".mh_comicpic img[src^=blob]");
            } else {
                imgs = [...fun.gae(".mh_comicpic img[src]")];
            }
            return imgs;
        },
        scrollEle: [".mh_comicpic img", 600],
        next: "//a[text()='下一章']",
        autoNext: true,
        prev: "//a[text()='上一章']",
        customTitle: () => fun.title(" COLAMANGA", 1),
        threading: 10,
        css: ".mh_wrap{width:100%!important;min-width:100%!important}",
        category: "comic"
    }, {
        name: "8Comic無限動漫 https://a.twobili.com/ReadComic/103/471/471_3_Q_atq24.html",
        enable: 1,
        reg: /(a|www)\.(comicabc|twobili)\.com\/(ReadComic|online)/,
        imgs: () => {
            let code = [...document.scripts].find(s => s.innerHTML.search(/ge\(e\)/) > -1).innerHTML;
            let cM = code.match(/ge\([^.]+\.src\s?=\s?([^;]+)/);
            let keyCode = cM[1];
            let arr = [];
            for (let i = 1; i <= ps; i++) {
                let r = "(" + i + ")";
                let src = location.protocol + fun.run(keyCode.replace(/\(pp?\)/g, r));
                arr.push(src);
            }
            return arr;
        },
        button: [4],
        insertImg: ["//td[img[@id='TheImg']]", 2],
        go: 1,
        autoDownload: [0],
        next: "#nextvol:not([style])",
        autoNext: true,
        prev: "#prevvol",
        customTitle: () => {
            let t = document.title.split(" ")[0];
            return `${t}-第${ch}集`;
        },
        css: "td[style^=width]{display:none!important}",
        category: "comic"
    }, {
        name: "8Comic無限動漫 手機版 https://8.twobili.com/comic/insurance_103.html?ch=471",
        enable: 1,
        reg: /8\.twobili\.com\/comic\/insurance/,
        init: () => {
            fun.ge("#pageindex").parentNode.appendChild(fun.ge("#prevvol").cloneNode(true));
            fun.ge('#pageindex').parentNode.appendChild(fun.ge("#nextvol").cloneNode(true));
            let ul = fun.ge("#TheTable>ul");
            let v1 = fun.ge(".view_tmenu").cloneNode(true);
            let v2 = fun.gae(".view_menut")[1];
            ul.appendChild(v2);
            ul.appendChild(v1);
            let b1 = fun.ge(".book_inc_title");
            let b2 = fun.ge(".book_link_item");
            ul.appendChild(b1);
            ul.appendChild(b2);
        },
        button: [4],
        imgs: () => {
            let arr = [];
            for (let i = 1; i <= ps; i++) {
                let imgSrc = "https://img" + ss(c, 4, 2) + ".8comic.com/" + ss(c, 6, 1) + "/" + ti + "/" + ss(c, 0, 4) + "/" + nn([i]) + "_" + ss(c, mm([i]) + 10, 3, f) + ".jpg";
                arr.push(imgSrc);
            }
            return arr;
        },
        button: [4],
        insertImg: ["//li[img[@id='TheImg']]", 2],
        go: 1,
        autoDownload: [0],
        next: "#nextvol:not([style])",
        autoNext: true,
        prev: "#prevvol",
        customTitle: () => {
            let t = document.title.split(" ")[0];
            let n = fun.geT("#chapter");
            return t + " - " + n;
        },
        css: ".pinch-zoom-container{height:auto !important;display:contents !important}.view_tmenu+div[style],#pagenum,[onclick^='j'],#pageindex,ico+a+.material-icons.right-logo{display:none !important}.view_menut a{width:33.3% !important;max-width:33.3% !important}",
        category: "comic"
    }, {
        name: "Mangabz https://www.mangabz.com/m38701/",
        enable: 0,
        reg: /^https:\/\/(www\.)?mangabz\.com\/m\d+/,
        include: ".container",
        init: () => {
            const hidetoolbar = () => {
                var e = e || window.event;
                if (e.wheelDelta < 0 || e.detail > 0) {
                    $(".top-bar").attr("style", "top: -74px;");
                } else {
                    $(".top-bar").removeAttr("style");
                }
            };
            document.addEventListener("wheel", hidetoolbar);
            document.addEventListener("DOMMouseScroll", hidetoolbar);
            const keyhidetoolbar = (e) => {
                let key = window.event ? e.keyCode : e.which;
                if (key == "34" || key == "32" || key == "40") {
                    $(".top-bar").attr("style", "top: -74px;");
                } else {
                    $(".top-bar").removeAttr("style");
                }
            };
            document.addEventListener("keydown", keyhidetoolbar);
        },
        imgs: () => {
            if (!mkey) var mkey = "";
            let resArr = [];
            let fetchNum = 0;
            for (let i = 1; i <= MANGABZ_IMAGE_COUNT; i++) {
                let apiUrl = location.origin + MANGABZ_CURL + "chapterimage.ashx" + `?cid=${MANGABZ_CID}&page=${i}&key=${mkey}&_cid=${MANGABZ_CID}&_mid=${MANGABZ_MID}&_dt=${MANGABZ_VIEWSIGN_DT}&_sign=${MANGABZ_VIEWSIGN}`;
                let res = fetch(apiUrl).then(res => res.text()).then(res => {
                    fun.show(`${displayLanguage.str_06}(${fetchNum+=1}/${MANGABZ_IMAGE_COUNT})`, 0);
                    return fun.run(res)[0];
                });
                resArr.push(res);
            }
            return Promise.all(resArr).then(arr => {
                fun.hide();
                return arr;
            });
        },
        button: [4],
        insertImg: ["#cp_img", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[img[contains(@src,'xiayizhang')]][starts-with(@href,'/m')]",
        autoNext: true,
        prev: "//a[img[contains(@src,'shangyizhang')]][starts-with(@href,'/m')]",
        customTitle: () => fun.title("_", 2).replace("漫畫", ""),
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}a[href^='j']{display:none !important}body{overflow:unset!important}",
        category: "comic"
    }, {
        name: "Xmanhua https://xmanhua.com/m10344/",
        enable: 0,
        reg: /^https:\/\/(www\.)?xmanhua\.com\/m\d+/,
        include: ".reader-bottom-page-list",
        init: () => {
            const showtoolbar = () => {
                let t = fun.ge(".header.toolbar");
                if (t) {
                    $(".header").removeClass("toolbar");
                    $(".header").removeAttr("style");
                } else {
                    $(".header").addClass("toolbar");
                    $(".header").attr("style", "top: -64px;");
                }
                let b = fun.ge(".reader-bottom.toolbar");
                if (b) {
                    $(".reader-bottom").removeClass("toolbar");
                    $(".reader-bottom").removeAttr("style");
                } else {
                    $(".reader-bottom").addClass("toolbar");
                    $(".reader-bottom").attr("style", "bottom: -50px;");
                }
            };
            document.addEventListener("click", showtoolbar);
            const hidetoolbar = () => {
                var e = e || window.event;
                if (e.wheelDelta < 0 || e.detail > 0) {
                    $(".header").addClass("toolbar");
                    $(".header").attr("style", "top: -64px;");
                    $(".reader-bottom").addClass("toolbar");
                    $(".reader-bottom").attr("style", "bottom: -50px;");
                } else {
                    $(".header").removeClass("toolbar");
                    $(".header").removeAttr("style");
                    $(".reader-bottom").removeClass("toolbar");
                    $(".reader-bottom").removeAttr("style");
                }
            };
            document.addEventListener("wheel", hidetoolbar);
            document.addEventListener("DOMMouseScroll", hidetoolbar);
            const keyhidetoolbar = (e) => {
                let key = window.event ? e.keyCode : e.which;
                if (key == "34" || key == "32" || key == "40") {
                    $(".header").addClass("toolbar");
                    $(".header").attr("style", "top: -64px;");
                    $(".reader-bottom").addClass("toolbar");
                    $(".reader-bottom").attr("style", "bottom: -50px;");
                } else {
                    $(".header").removeClass("toolbar");
                    $(".header").removeAttr("style");
                    $(".reader-bottom").removeClass("toolbar");
                    $(".reader-bottom").removeAttr("style");
                }
            };
            document.addEventListener("keydown", keyhidetoolbar);
        },
        imgs: () => {
            if (!mkey) var mkey = "";
            let resArr = [];
            let fetchnUm = 0;
            for (let i = 1; i <= XMANHUA_IMAGE_COUNT; i++) {
                let apiUrl = location.origin + XMANHUA_CURL + "chapterimage.ashx" + `?cid=${XMANHUA_CID}&page=${i}&key=${mkey}&_cid=${XMANHUA_CID}&_mid=${XMANHUA_MID}&_dt=${XMANHUA_VIEWSIGN_DT}&_sign=${XMANHUA_VIEWSIGN}`;
                let res = fetch(apiUrl).then(res => res.text()).then(res => {
                    fun.show(`${displayLanguage.str_06}(${fetchnUm+=1}/${XMANHUA_IMAGE_COUNT})`, 0);
                    return fun.run(res)[0];
                });
                resArr.push(res);
            }
            return Promise.all(resArr).then(arr => {
                fun.hide();
                return arr;
            });
        },
        button: [4],
        insertImg: ["#cp_img", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[img[contains(@src,'reader-bottom-right-2')]][starts-with(@href,'/m')]",
        autoNext: true,
        prev: "//a[img[contains(@src,'reader-bottom-right-1')]][starts-with(@href,'/m')]",
        customTitle: () => fun.title('_', 2).replace("漫畫", ""),
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.relative>a{display:none!important}.reader-img-con{padding:64px 0 50px !important;}",
        category: "comic"
    }, {
        name: "DM5/極速 分頁模式 https://www.dm5.com/m755073/ https://hk.1kkk.com/ch1-1266817/",
        enable: 0,
        reg: /^https:\/\/(www|tel|en|cnc|hk|m)?\.?(dm5|1kkk)\.(com|cn)\/(m|ch|vol|other)[-_0-9p]+\//,
        include: "#chapterpager",
        imgs: () => {
            if (!mkey) var mkey = "";
            let resArr = [];
            let fetchNum = 0;
            for (let i = 1; i <= DM5_IMAGE_COUNT; i++) {
                let apiUrl = location.origin + DM5_CURL + "chapterfun.ashx" + `?cid=${DM5_CID}&page=${i}&key=${mkey}&language=1>k=6&_cid=${DM5_CID}&_mid=${DM5_MID}&_dt=${DM5_VIEWSIGN_DT}&_sign=${DM5_VIEWSIGN}`;
                let res = fetch(apiUrl).then(res => res.text()).then(res => {
                    fun.show(`${displayLanguage.str_06}(${fetchNum+=1}/${DM5_IMAGE_COUNT})`, 0);
                    return fun.run(res)[0];
                });
                resArr.push(res);
            }
            return Promise.all(resArr).then(arr => {
                fun.hide();
                return arr;
            });
        },
        button: [4],
        insertImg: ["#cp_img", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[text()='下一章']",
        autoNext: true,
        prev: "//a[text()='上一章']",
        customTitle: () => fun.title("_", 2),
        topButton: true,
        css: "body{overflow:unset!important}",
        category: "comic"
    }, {
        name: "DM5/極速 條漫模式 https://www.dm5.com/m1343377/ https://hk.1kkk.com/ch1-1343377/",
        enable: 0,
        reg: /^https:\/\/(www|tel|en|cnc|hk|m)?\.?(dm5|1kkk)\.(com|cn)\/(m|ch|vol|other)[-_0-9]+\//,
        include: ["#barChapter"],
        imgs: "#barChapter>img",
        button: [4],
        insertImg: ["#barChapter", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[text()='下一章']",
        autoNext: true,
        prev: "//a[text()='上一章']",
        customTitle: () => fun.title("_", 2),
        css: "body{overflow:unset!important}",
        category: "comic"
    }, {
        name: "yymanhua https://www.yymanhua.com/",
        enable: 0,
        reg: /(www\.)?yymanhua\.com\/m\d+/,
        include: ".reader-bottom-page-list",
        init: () => {
            const showtoolbar = () => {
                let t = fun.ge(".header.toolbar");
                if (t) {
                    $(".header").removeClass("toolbar");
                    $(".header").removeAttr("style");
                } else {
                    $(".header").addClass("toolbar");
                    $(".header").attr("style", "top: -64px;")
                }
                let b = fun.ge(".reader-bottom.toolbar");
                if (b) {
                    $(".reader-bottom").removeClass("toolbar");
                    $(".reader-bottom").removeAttr("style");
                } else {
                    $(".reader-bottom").addClass("toolbar");
                    $(".reader-bottom").attr("style", "bottom: -50px;");
                }
            };
            document.addEventListener("click", showtoolbar);
            const hidetoolbar = () => {
                var e = e || window.event;
                if (e.wheelDelta < 0 || e.detail > 0) {
                    $(".header").addClass("toolbar");
                    $(".header").attr("style", "top: -64px;");
                    $(".reader-bottom").addClass("toolbar");
                    $(".reader-bottom").attr("style", "bottom: -50px;");
                } else {
                    $(".header").removeClass("toolbar");
                    $(".header").removeAttr("style");
                    $(".reader-bottom").removeClass("toolbar");
                    $(".reader-bottom").removeAttr("style");
                }
            };
            document.addEventListener("wheel", hidetoolbar);
            document.addEventListener("DOMMouseScroll", hidetoolbar);
            const keyhidetoolbar = (e) => {
                let key = window.event ? e.keyCode : e.which;
                if (key == "34" || key == "32" || key == "40") {
                    $(".header").addClass("toolbar");
                    $(".header").attr("style", "top: -64px;");
                    $(".reader-bottom").addClass("toolbar");
                    $(".reader-bottom").attr("style", "bottom: -50px;");
                } else {
                    $(".header").removeClass("toolbar");
                    $(".header").removeAttr("style");
                    $(".reader-bottom").removeClass("toolbar");
                    $(".reader-bottom").removeAttr("style");
                }
            };
            document.addEventListener("keydown", keyhidetoolbar);
        },
        imgs: () => {
            if (!mkey) var mkey = "";
            let resArr = [];
            let fetchnUm = 0;
            for (let i = 1; i <= YYMANHUA_IMAGE_COUNT; i++) {
                let apiUrl = location.origin + YYMANHUA_CURL + "chapterimage.ashx" + `?cid=${YYMANHUA_CID}&page=${i}&key=${mkey}&_cid=${YYMANHUA_CID}&_mid=${YYMANHUA_MID}&_dt=${YYMANHUA_VIEWSIGN_DT}&_sign=${YYMANHUA_VIEWSIGN}`;
                let res = fetch(apiUrl).then(res => res.text()).then(res => {
                    fun.show(`${displayLanguage.str_06}(${fetchnUm+=1}/${YYMANHUA_IMAGE_COUNT})`, 0);
                    return fun.run(res)[0];
                });
                resArr.push(res);
            }
            return Promise.all(resArr).then(arr => {
                fun.hide();
                return arr;
            });
        },
        button: [4],
        insertImg: ["#cp_img", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[img[contains(@src,'reader-bottom-right-2')]][starts-with(@href,'/m')]",
        autoNext: true,
        prev: "//a[img[contains(@src,'reader-bottom-right-1')]][starts-with(@href,'/m')]",
        customTitle: () => fun.title("_", 2).replace("漫畫", ""),
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.relative>a{display:none!important}.reader-img-con{padding:64px 0 50px !important;}",
        category: "comic"
    }, {
        name: "DM5/極速/Mangabz/Xmanhua/yymanhua/漫画人/奇漫屋/漫画星球(PC)/6 漫画/漫本 手機版 https://m.dm5.com/m755073/",
        enable: 0,
        reg: /(www|tel|en|cnc|hk|m)?\.?(dm5|1kkk|mangabz|xmanhua|yymanhua|manhuaren|qiman\d{1,2}|mhxqiu\d|6mh6\d|manben)\.(com|cn)\/(m|ch|vol|other)?[-_0-9]+\//,
        delay: 300,
        include: "//script[contains(text(),'newImgs')]",
        init: () => {
            if (fun.gae(".view-bottom-bar>li").length == 4) {
                fun.css(".view-bottom-bar>li:nth-child(n+2):nth-child(-n+3){display:none!important}.view-bottom-bar li{width:50%!important}");
            }
        },
        imgs: () => newImgs,
        button: [4],
        insertImg: ["#cp_img,.main_img,#comicContain,.comic-list", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[text()='下一章'] | //a[img[@alt='下一章']]",
        autoNext: true,
        prev: "//a[text()='上一章'] | //a[img[@alt='上一章']]",
        customTitle: () => {
            let host = location.hostname;
            if (/dm5|manhuaren|1kkk|mangabz|xmanhua|yymanhua/.test(host)) {
                return fun.title("_", 2);
            } else if (/qiman|mhxqiu|6mh/.test(host)) {
                return fun.title("_", 3);
            } else if (/manben/.test(host)) {
                if (fun.ge("#comicTitle")) {
                    return fun.geT("#chapter") + " " + fun.geT(".title-comicHeading");
                } else {
                    return fun.title(" ", 2);
                }
            }
        },
        category: "comic"
    }, {
        name: "动漫之家M m.idmzj.com",
        enable: 0,
        reg: /m\.i?dmzj\.com\/view\/\d+\/\d+\.html/,
        init: "$('body').unbind('keydown');",
        imgs: () => {
            let code = [...document.scripts].find(s => s.innerHTML.search(/initData/) > -1).innerHTML;
            let arr = fun.run(code.match(/page_url.+(\[.+\])/)[1]);
            return arr;
        },
        button: [4, "24%", 3],
        insertImg: ["#commicBox", 2],
        go: 1,
        autoDownload: [0],
        next: ".afterChapter",
        autoNext: true,
        prev: ".beforeChapter",
        customTitle: () => fun.title("-", 1),
        css: "#khdDown,.appTil,#m_r_bottom,#m_r_panelbox,.control_panel.alpha{display:none!important}",
        category: "comic"
    }, {
        name: "漫画星球M m.mhxqiu2.com",
        enable: 0,
        reg: /m\.mhxqiu\d\.com\/\d+\/\d+\.html/,
        imgs: ".main_img img",
        autoDownload: [0],
        next: "//a[p[text()='下一篇']][contains(@href,'html')]",
        prev: "//a[p[text()='上一篇']][contains(@href,'html')]",
        customTitle: () => {
            let s = document.title.split("_");
            return (s[1] + " - " + s[0]).replace(" - 漫画星球", "");
        },
        category: "comic"
    }, {
        name: "漫畫狗 dogemanga.com",
        enable: 1,
        reg: /dogemanga\.com\/p\/\w+/i,
        init: () => {
            fun.ge(".site-reader").setAttribute("class", "CustomPictureBox");
            fun.addUrlHtml("https://dogemanga.com/", ".CustomPictureBox", 1, "首頁");
            let url = siteData.next();
            if (url) {
                fun.addUrlHtml(url, ".CustomPictureBox", 1);
            }
        },
        imgs: () => [...fun.gae(".site-reader__image")].map(e => e.dataset.pageImageUrl),
        button: [4, "24%", 1],
        insertImg: [".CustomPictureBox", 2],
        go: 1,
        autoDownload: [0],
        next: () => {
            let next = fun.ge("//select[@data-kind='publication']/option[@selected]/preceding-sibling::option[1]");
            if (next) {
                return next.value;
            } else {
                return null;
            }
        },
        autoNext: true,
        prev: 1,
        customTitle: () => fun.title(" - 漫畫狗"),
        threading: 1,
        css: ".CustomPictureBox{height:auto!important}.fixed-bottom{display:none!important}",
        category: "comic"
    }, {
        name: "白绒Yuri www.ponpomu.com",
        enable: 1,
        delay: 1000,
        reg: /https:\/\/www\.ponpomu\.com\/topic\/\d+\/comic\//,
        imgs: () => {
            let ele = fun.ge(".comic-page-container data");
            if (ele) {
                return [...fun.gae(".comic-page-container data")].map(e => e.value);
            } else {
                return [...fun.gae(".comic-page-container img")].map(e => e.dataset.srcset);
            }
        },
        autoDownload: [0],
        next: () => {
            let ele = fun.ge("//div[text()='已经到尽头了']");
            if (!ele) {
                let s = siteUrl.split("/");
                s[s.length - 1] = parseInt(s[s.length - 1]) + 1;
                return s.join("/");
            } else {
                return null;
            }
        },
        prev: 1,
        customTitle: () => fun.geT(".comic-info").replace(/\n/, " ").replace("连载:", "-").replace("单行本: ", "").replace("完结: ", ""),
        category: "comic"
    }, {
        name: "明日方舟泰拉记事社 terra-historicus.hypergryph.com",
        enable: 1,
        reg: /https:\/\/terra-historicus\.hypergryph\.com\/comic\/\d+\/episode\/\d+/,
        imgs: () => {
            let max = fun.geT(".HG_COMIC_READER_indicator>div:last-child");
            let resArr = [];
            let fetchNum = 0;
            for (let i = 1; i <= max; i++) {
                let res = fetch(`https://terra-historicus.hypergryph.com/api${location.pathname}/page?pageNum=${i}`).then(res => res.json()).then(json => {
                    fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${max}`, 0);
                    return json.data.url;
                });
                resArr.push(res);
            }
            return Promise.all(resArr).then(data => {
                fun.hide();
                return data;
            });
        },
        autoDownload: [0],
        next: () => {
            let next = fun.ge("//a[text()='下一话']") || fun.ge("//a[text()='下一张']");
            if (next) {
                return next.href;
            } else {
                return null;
            }
        },
        prev: 1,
        customTitle: async () => {
            await fun.waitEle(".HG_COMIC_READER_episodeTitle");
            return fun.geT(".HG_COMIC_READER_comicTitle") + " - " + fun.geT(".HG_COMIC_READER_episodeTitle");
        },
        category: "comic"
    }, {
        name: "Manhuagui看漫画M https://m.manhuagui.com/comic/17023/176171.html",
        enable: 0,
        reg: /m\.manhuagui\.com\/comic\/\d+\/\d+.html/,
        imgs: () => {
            let code = [...document.scripts].find(s => s.innerHTML.search(/x6c/) > -1).innerHTML.trim().slice(26);
            let json = JSON.parse(fun.run(code).slice(11, -12));
            let domain = "https://i.hamreus.com";
            return json.images.map(e => `${domain+e}?e=${json.sl.e}&m=${json.sl.m}`);
        },
        button: [4],
        insertImg: ["#manga", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[text()='下一章']",
        autoNext: true,
        prev: "//a[text()='上一章']",
        customTitle: () => fun.geT("#mangaTitle"),
        threading: 3,
        css: ".action-list li{width:50% !important}#action>ul>li:nth-child(n+2):nth-child(-n+3),.manga-page,.clickforceads{display:none !important}",
        category: "comic"
    }, {
        name: "Manhuagui看漫画M 点击查看下20条记录",
        enable: 0,
        reg: /m\.manhuagui\.com\/(update|list|rank|user)\//,
        icon: 0,
        key: 0,
        observerClick: "#more:not([style*=none])>.more-go",
        category: "comic"
    }, {
        name: "Manhuagui看漫画 www.manhuagui.com tw.manhuagui.com",
        enable: 0,
        reg: /(www|tw)\.manhuagui\.com\/comic\/\d+\/\d+.html/,
        init: "$(document).unbind('keydown');",
        imgs: () => {
            let code = [...document.scripts].find(s => s.innerHTML.search(/x6c/) > -1).innerHTML.slice(26, -1);
            let json = fun.run(fun.run(code).slice(11, -11));
            let domain = "https://i.hamreus.com";
            return json.files.map(e => `${domain+json.path+e}?e=${json.sl.e}&m=${json.sl.m}`);
        },
        button: [4],
        insertImg: ["#tbBox", 2],
        go: 1,
        autoDownload: [0],
        threading: 3,
        next: "//a[text()='下一章']",
        autoNext: true,
        prev: "//a[text()='上一章']",
        customTitle: () => fun.geT("h1>a") + " - " + fun.geT("h2"),
        category: "comic"
    }, {
        name: "包子漫画 閱讀 https://www.kukuc.co/comic/chapter/yushenyitongshengji-ohyeonbain/0_2.html",
        enable: 0,
        reg: /\/comic\/chapter\/[^/]+\/\w+\.html/i,
        include: "//title[contains(text(),'包子')]",
        init: async () => {
            document["onkeydown"] = null;
            await fun.getNP(".comic-contain>div:not(.mobadsq)", "//a[contains(text(),'下一頁') or contains(text(),'下一页')]", null, ".comic-chapter>.next_chapter");
        },
        imgs: () => [...new Set([...fun.gae(".comic-contain amp-img")].map(e => e.getAttribute("src")))],
        button: [4],
        insertImg: [".comic-contain", 2],
        go: 1,
        autoDownload: [0],
        next: "//div[@class='next_chapter']/a[contains(text(),'下一話') or contains(text(),'下一话')]",
        autoNext: true,
        prev: 1,
        customTitle: () => fun.title(" - ", 3),
        css: ".chapter-main.scroll-mode~*:not(.next_chapter):not(.bottom-bar){display:none!important}",
        category: "comic"
    }, {
        name: "包子漫画 展開目錄",
        enable: 0,
        icon: 0,
        key: 0,
        reg: /\/comic\/[-\w]+$/i,
        include: "//title[contains(text(),'包子')]",
        autoClick: "#button_show_all_chatper",
        category: "comic"
    }, {
        name: "包子漫画,鏈接新分頁打開",
        enable: 0,
        icon: 0,
        key: 0,
        reg: /(cn|tw|www)\.(baozimh|webmota|kukuc)\.(co|com)/,
        openInNewTab: ".comics-card a:not([target=_blank]),.bookshelf-items a:not(.remove-img):not([target=_blank])",
        category: "comic"
    }, {
        name: "Komiic komiic.com",
        enable: 1,
        reg: /komiic\.com\/comic\/\d+\/chapter\//,
        imgs: async () => {
            let chapterId = siteUrl.match(/chapter\/(\d+)\/images/)[1];
            let body = {
                operationName: "imagesByChapterId",
                variables: {
                    chapterId: `${chapterId}`
                },
                query: "query imagesByChapterId($chapterId: ID!) {\n  imagesByChapterId(chapterId: $chapterId) {\n    id\n    kid\n    height\n    width\n    __typename\n  }\n}\n"
            };
            let json = await fetch("/api/query", {
                "headers": {
                    "content-type": "application/json"
                },
                "body": JSON.stringify(body),
                "method": "POST"
            }).then(res => res.json());
            debug("\nimages JSON\n", json);
            return json.data.imagesByChapterId.map(e => "https://komiic.com/api/image/" + e.kid);
        },
        autoDownload: [0],
        next: async () => {
            let mhId = siteUrl.match(/comic\/(\d+)/)[1];
            let body = {
                operationName: "chapterByComicId",
                variables: {
                    comicId: `${mhId}`
                },
                query: "query chapterByComicId($comicId: ID!) {\n  chaptersByComicId(comicId: $comicId) {\n    id\n    serial\n    type\n    dateCreated\n    dateUpdated\n    size\n    __typename\n  }\n}\n"
            };
            let json = await fetch("/api/query", {
                "headers": {
                    "content-type": "application/json"
                },
                "body": JSON.stringify(body),
                "method": "POST"
            }).then(res => res.json());
            debug("\nchapter JSON\n", json);
            let chapterId = siteUrl.match(/chapter\/(\d+)\/images/)[1];
            let chapters = json.data.chaptersByComicId;
            let nextUrl;
            for (let i in chapters) {
                if (new RegExp(chapterId).test(chapters[i].id)) {
                    try {
                        let nextId = chapters[parseInt(i) + 1].id;
                        nextUrl = siteUrl.replace(new RegExp(`/${chapterId}/`), `/${nextId}/`).replace(/\?page=\d+/, "");
                    } catch (e) {
                        nextUrl = null;
                    }
                    break;
                }
            }
            return nextUrl;
        },
        prev: 1,
        customTitle: async () => {
            await fun.delay(2000, 0);
            return fun.geT("li.breadcrumbs__item:nth-child(3)>a").trim() + " - " + fun.geT("li.breadcrumbs__item:nth-child(5)>div").trim();
        },
        threading: 4,
        category: "comic"
    }, {
        name: "LINE WEBTOON / 咚漫 www.webtoons.com www.dongmanmanhua.cn https://www.webtoons.com/zh-hant/time-slip/estatedeveloper/%E7%AC%AC1%E8%A9%B1/viewer?title_no=4354&episode_no=1",
        enable: 0,
        reg: /www\.(webtoons|dongmanmanhua)\.(com|cn)\/[^&]+&episode/,
        imgs: "._images[data-url]",
        insertImg: ["#_imageList", 2],
        go: 1,
        autoDownload: [0],
        next: "//div[@class='episode_cont']//li[a[starts-with(@class,'on')]]/following-sibling::li[1]/a",
        prev: "//div[@class='episode_cont']//li[a[starts-with(@class,'on')]]/preceding-sibling::li[1]/a",
        customTitle: () => fun.title("|", 3).replace(/ - \d+/, "").replace("|", " - "),
        category: "comic"
    }, {
        name: "LINE WEBTOON 目錄聚集所有章節",
        enable: 0,
        icon: 0,
        key: 0,
        reg: /www\.webtoons\.com\/.+\/list\?title_no=\d+/,
        init: "fun.getNP('._episodeItem',\"//div[@class='paginate']/a[span[@class='on']]/following-sibling::a[1]\",null,'.paginate',0,null,0);",
        category: "comic"
    }, {
        name: "動漫狂M",
        enable: 0,
        reg: /www\.cartoonmad\.(cc|com)\/m\/comic\/\d+\.html/,
        init: async () => {
            let url = await siteData.next();
            if (url) {
                fun.addUrlHtml(url, "//tr[td[a[@class='onpage']]]", 1);
            }
        },
        imgs: () => {
            let src = fun.ge("img[oncontextmenu]").src.match(/.+\//)[0];
            let max = fun.ge(".onpage").parentNode.lastElementChild.previousElementSibling.innerText;
            let arr = [];
            for (let i = 1; i <= max; i++) {
                let imgSrc = src + String(i).padStart(3, "0");
                arr.push(imgSrc);
            };
            return arr;
        },
        button: [4],
        insertImg: ["//td[a[img[@oncontextmenu]]]", 2],
        go: 1,
        autoDownload: [0],
        next: async () => {
            let lastPage = fun.ge(".onpage").parentNode.lastElementChild.previousElementSibling;
            return await fun.fetchDoc(lastPage.href).then(async doc => {
                let ele = fun.ge("body>table>tbody>tr:nth-child(3)>td>a", doc);
                return await fun.fetchDoc(ele.href).then(doc => {
                    let next = fun.ge(".pages", doc);
                    if (next) {
                        return next.href;
                    } else {
                        return null;
                    }
                });
            });
        },
        autoNext: true,
        prev: 1,
        customTitle: () => fun.title(" - ", 2),
        category: "comic"
    }, {
        name: "動漫狂 https://www.cartoonmad.com/comic/438700012046001.html",
        enable: 0,
        reg: /www\.cartoonmad\.com\/comic\/\d+\.html/,
        init: "document.onkeydown=null;",
        imgs: () => {
            let src = fun.ge("img[onload]").src.match(/.+\//)[0];
            let max = fun.gae("option[value]").length;
            let arr = [];
            for (let i = 1; i <= max; i++) {
                let imgSrc = src + String(i).padStart(3, "0");
                arr.push(imgSrc);
            };
            return arr;
        },
        button: [4],
        insertImg: ["//td[a[img[@oncontextmenu]]]", 2],
        go: 1,
        autoDownload: [0],
        next: "//td[@width='150' and a[img[@src='/image/rad.gif']]]/a",
        autoNext: true,
        prev: "//td[@width='150' and a[img[@src='/image/rad1.gif']]]/a",
        customTitle: () => fun.title(" - ", 2),
        category: "comic"
    }, {
        name: "動漫戲說 https://comic.acgn.cc/view-202.htm",
        enable: 0,
        reg: /comic\.acgn\.cc\/view/,
        imgs: () => [...fun.gae(".pic[_src][id]")].map(e => e.getAttribute("_src")),
        button: [4],
        insertImg: ["#pic_list", 2],
        go: 1,
        autoDownload: [0],
        next: ".display_right>a",
        autoNext: true,
        prev: ".display_left>a",
        customTitle: () => fun.geT(".hotrmtexth1>a"),
        css: ".btn_wrap{display:none!important}",
        category: "comic"
    }, {
        name: "98漫畫網 www.98comic.com",
        enable: 0,
        reg: /www\.98comic\.com\/comic\/\d+\/\w+\.html$/,
        imgs: () => cInfo.fs.map(e => "https://www.98comic.com/g.php?" + cInfo.cid + "/" + e),
        button: [4],
        insertImg: ["//td[img[@id='manga']]", 2],
        go: 1,
        autoDownload: [0],
        next: ".nextC",
        autoNext: true,
        prev: ".prevC",
        customTitle: () => cInfo.btitle + " - " + cInfo.ctitle,
        css: ".bd_960_90{display:none!important}",
        category: "comic"
    }, {
        name: "57漫画网 www.wuqimh.net m.wuqimh.net 国漫吧 www.guoman8.cc m.guoman8.cc",
        enable: 0,
        reg: /((www|m)\.wuqimh\.net)|(www|m)\.guoman8\.cc\/\d+\/\d+\.html$/,
        imgs: () => cInfo.fs,
        button: [4],
        insertImg: ["//td[img[@id='manga']]", 2],
        go: 1,
        autoDownload: [0],
        next: ".nextC",
        autoNext: true,
        prev: ".prevC",
        customTitle: () => cInfo.btitle + " - " + cInfo.ctitle,
        css: ".action-list li{width:50%!important}#action>ul>li:nth-child(n+2):nth-child(-n+3),.bd_960_90,body>section,#action~*:not(#pageNo),footer~*{display:none!important}",
        category: "comic"
    }, {
        name: "亲亲漫画/古风漫画网 www.acgwd.com www.acgud.com m.acgqd.com www.gufengmh.com m.gufengmh.com",
        enable: 0,
        reg: /(www|m|w111)\.(acg(u|q|w)d|gufengmh|mhd100)\.com\/manhua\/\w+\/\d+\.html/,
        init: () => {
            if (/acg|mhd100/.test(location.host)) {
                $("#images").unbind("click");
                _0x5097 = null;
                for (let i = 0; i <= 2; i++) {
                    clearInterval(i)
                }
            } else if (/gufengmh/.test(location.host)) {
                $(document).unbind("keydown");
                $(document).unbind("keyup");
            }
        },
        imgs: () => chapterImages.map(e => SinConf.resHost[0].domain + "/" + chapterPath + e),
        button: [4],
        insertImg: ["#images", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[contains(text(),'下一章')]",
        autoNext: true,
        prev: "//a[contains(text(),'上一章')]",
        customTitle: () => {
            if (/(acg|mhd100)/.test(location.host)) {
                return fun.title("_", 1);
            } else if (/gufengmh/.test(location.host)) {
                return fun.title("在线观看", 1);
            } else {
                return fun.title(" - ", 3);
            }
        },
        css: ".img_land_prev,.img_land_next,#action li:nth-child(2),#action li:nth-child(3),.control_bottom~*,.chapter-view~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(.fancybox-container){display:none!important}#action li{width:50%!important}",
        category: "comic"
    }, {
        name: "漫画456 www.manhua456.com",
        enable: 0,
        reg: /www\.manhua456\.com\/manhua\/\w+\/\d+\.html/,
        delay: 1000,
        init: "setTimeout(()=>{$(document).unbind('keyup');$(document).unbind('keydown')},4000)",
        imgs: async () => {
            await fun.waitEle("//script[contains(text(),'chapterImages')]");
            return chapterImages.map(e => {
                if (/^http/.test(e)) {
                    return e;
                } else {
                    return SinConf.resHost1 + "/" + chapterPath + e;
                }
            });
        },
        button: [4],
        insertImg: ["#images", 2],
        go: 1,
        next: "//a[text()='下一章']",
        autoNext: true,
        prev: "//a[text()='上一章']",
        customTitle: () => fun.title(" - ", 3),
        css: ".img_land_prev,.img_land_next{display:none!important}",
        category: "comic"
    }, {
        name: "漫画456M m.manhua456.com",
        enable: 0,
        reg: /m\.manhua456\.com\/manhua\/\w+\/\d+\.html/,
        delay: 300,
        init: async () => {
            await fun.waitEle("//script[contains(text(),'chapterImages')]");
            $('#images').unbind('click');
        },
        imgs: async () => {
            await fun.waitEle("//script[contains(text(),'chapterImages')]");
            return chapterImages.map(e => {
                if (/^http/.test(e)) {
                    return e;
                } else {
                    return SinConf.resHost1 + "/" + chapterPath + e;
                }
            });
        },
        insertImg: ["#images", 2],
        go: 1,
        next: "//a[text()='下一章']",
        autoNext: true,
        prev: "//a[text()='上一章']",
        customTitle: () => {
            let s = pageTitle.split(" - ");
            return s[1] + " - " + s[0];
        },
        css: ".img_land_prev,.img_land_next{display:none!important}",
        category: "comic"
    }, {
        name: "漫画1234 www.ymh1234.com www.hmh1234.com",
        enable: 0,
        reg: /(www|m)\.\wmh1234\.com\/comic\/\d+\/\d+\.html/i,
        init: "$(document).unbind('keydown');$(document).unbind('keyup');$('#images').unbind('click');",
        imgs: async () => {
            let url = await siteData.next();
            if (location.hostname == "www.ymh1234.com") {
                if (url) {
                    fun.addUrlHtml(url, "#images", 1);
                }
            }
            return chapterImages.map(e => SinConf.resHost[0].domain + "/" + chapterPath + e);
        },
        button: [4],
        insertImg: ["#images", 2],
        go: 1,
        autoDownload: [0],
        next: () => {
            if (nextChapterData.id > 0) {
                return nextChapterData.url;
            } else {
                return null;
            }
        },
        autoNext: true,
        prev: 1,
        customTitle: () => {
            let s = pageTitle.split(" - ");
            if (location.hostname == "m.ymh1234.com") {
                return s[1] + " - " + s[0];
            } else {
                return s[0];
            }
        },
        category: "comic"
    }, {
        name: "90漫画 www.90mh.com www.90mh.org",
        enable: 0,
        reg: /www\.90mh\.(com|org)\/manhua\/\w+\/\d+\.html/i,
        imgs: () => chapterImages.map(e => SinConf.resHost[0].domain + "/" + chapterPath + e),
        insertImg: ["#images", 2],
        go: 1,
        autoDownload: [0],
        next: ".nextC",
        autoNext: true,
        prev: ".prevC",
        customTitle: () => fun.title(" - ", 3),
        category: "comic"
    }, {
        name: "90漫画M wap.90mh.com m.90mh.org",
        enable: 0,
        reg: /(wap|m)\.90mh\.(com|org)\/manhua\/\w+\/\d+\.html/i,
        init: () => {
            let url = siteData.next();
            if (url) {
                fun.addUrlHtml(url, "#chapter-image", 1);
            }
        },
        imgs: () => fun.getImg("#chapter-image img", fun.geT("#k_total"), 5),
        insertImg: ["#chapter-image", 2],
        go: 1,
        autoDownload: [0],
        next: () => {
            let next = fun.ge("//a[text()='下一章'][contains(@href,'html')]");
            if (next) {
                return next.href;
            } else {
                return null;
            }
        },
        autoNext: true,
        prev: 1,
        customTitle: () => fun.title("在线", 1),
        css: ".a-90mh{display:none!important}",
        category: "comic"
    }, {
        name: "优酷漫画 www.ykmh.com",
        enable: 0,
        reg: /www\.ykmh\.com\/manhua\/\w+\/\d+\.html/i,
        init: "$(document).unbind('keydown');$(document).unbind('keyup');",
        imgs: () => chapterImages.map(e => SinConf.resHost[0].domain + e),
        button: [4],
        insertImg: ["#images", 2],
        go: 1,
        autoDownload: [0],
        next: ".next>a",
        autoNext: true,
        prev: ".pre>a",
        customTitle: () => fun.title(" - ", 3),
        css: ".img_land_prev,.img_land_next{display:none!important}",
        category: "comic"
    }, {
        name: "优酷漫画M h5.ykmh.com",
        enable: 0,
        reg: /h5\.ykmh\.com\/manhua\/\w+\/\d+\.html/i,
        init: "$('#images').unbind('click');",
        imgs: () => chapterImages.map(e => SinConf.resHost[0].domain + e),
        button: [4],
        insertImg: ["#images", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[text()='下一章'][contains(@href,'html')]",
        autoNext: true,
        prev: "//a[text()='上一章'][contains(@href,'html')]",
        customTitle: () => {
            let s = pageTitle.split(" - ");
            return s[1] + " - " + s[0];
        },
        css: ".letchepter>div,.letchepter>section,#FullPictureLoad~*{display:none!important}",
        category: "comic"
    }, {
        name: "漫画芯M m.mhxin.com",
        enable: 0,
        reg: /(m|coco)\.mhxin\.com\/manhua\/\w+\/\d+\.html/i,
        imgs: () => {
            let max = fun.geT(".image-content p").match(/\/(\d+)/)[1];
            return fun.getImg("#manga-image", max, 5);
        },
        button: [4],
        insertImg: ["#images", 2],
        go: 1,
        autoDownload: [0],
        next: () => {
            let code = [...document.scripts].find(s => s.innerHTML.search(/下一章/) > -1).innerHTML;
            let url = code.match(/<li><a href="(.+)">下一章/)[1];
            if (/html$/.test(url)) {
                return url;
            } else {
                return null;
            }
        },
        autoNext: true,
        prev: 1,
        customTitle: () => fun.title("在线", 1),
        css: ".action-list li{width:50% !important}div[style*='text-align: left;'],.UnderPage~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(.fancybox-container),.action-list>ul>li:nth-child(n+2):nth-child(-n+3){display:none!important}body{padding:0!important}",
        category: "comic"
    }, {
        name: "最漫画M / 拼拼漫画M m.zuimh.com m.pinmh.com",
        enable: 0,
        reg: /(m\.zuimh\.com|m.pinmh.com)\/manhua\/\w+\/\d+\.html/i,
        imgs: () => {
            let max = fun.geT(".image-content p").match(/\/(\d+)/)[1];
            return fun.getImg("#image", max, 5);
        },
        insertImg: ["#images", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[text()='下一章'][contains(@href,'html')]",
        autoNext: true,
        prev: "//a[text()='上一章'][contains(@href,'html')]",
        customTitle: () => fun.title("在线", 1),
        css: "body{padding:0!important}div[style*='text-align'],.UnderPage~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(.fancybox-container){display:none!important}",
        category: "comic"
    }, {
        name: "零点漫画M m.0dmh.com",
        enable: 0,
        reg: /(m\.0dmh\.com)\/manhua\/\w+\/\d+\.html/i,
        imgs: () => {
            let max = Math.ceil(fun.geT("#images p").match(/\/(\d+)/)[1] / 3);
            return fun.getImg("#images img", max, 5);
        },
        insertImg: ["#images", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[text()='下一章'][contains(@href,'html')]",
        autoNext: true,
        prev: "//a[text()='上一章'][contains(@href,'html')]",
        customTitle: () => fun.title("-零点漫画").trim(),
        css: ".action-list li{width:50% !important}div[style*='text-align'],.action-list>ul>li:nth-child(n+2):nth-child(-n+3){display:none!important}",
        category: "comic"
    }, {
        name: "漫画吧M / 漫画连M m.dmhua8.com m.100mhl.com",
        enable: 0,
        reg: /(m\.dmhua8\.com|m\.100mhl\.com)\/manhua\/\w+\/\d+\.html/i,
        imgs: () => {
            let num = fun.geT("#images p").match(/\/(\d+)/)[1];
            let max = Math.ceil(num / 5);
            return fun.getImg("#images img", max, 5);
        },
        insertImg: ["#images", 2],
        go: 1,
        autoDownload: [0],
        next: () => {
            try {
                let code = [...document.scripts].find(s => s.innerHTML.search(/下一章/) > -1).innerHTML;
                let url = code.match(/<li><a href="(.+)">下一章/)[1];
                if (/html$/.test(url)) {
                    return url;
                } else {
                    return null;
                }
            } catch (e) {
                let next = fun.ge("//a[text()='下一章'][contains(@href,'html')]");
                if (next) {
                    return next.href;
                } else {
                    return null;
                }
            }
        },
        autoNext: true,
        prev: 1,
        customTitle: () => {
            if (location.hostname == "m.dmhua8.com") {
                let s = document.title.split("_");
                return (s[1] + " - " + s[0]).replace("漫画", "");
            } else if (location.hostname == "m.100mhl.com") {
                return document.title.replace("-漫画连", "");
            }
        },
        css: "#addMoney,#images~div[style*=blur],div[style*='text-align: left;']{display:none!important}",
        category: "comic"
    }, {
        name: "蔷薇漫画M/爱米推漫画M/下拉式漫画M/奇妙漫画M/冰氪漫画M/狗狗漫画M/奇奇漫画M/悠闲漫画M/不卡漫画M/多熙漫画M m.qwmanhua.com m.imitui.com m.xlsmh.com m.qmiaomh.com m.icekr.com m.gougoumh.com m.qimhua.com m.yxtun.com m.bukamh.com m.duoximh.com",
        enable: 0,
        reg: /(m\.qwmanhua\.com|m\.imitui\.com|m\.xlsmh\.com|m\.qmiaomh\.com|m\.icekr\.com|m\.gougoumh\.com|m\.qimhua\.com|m\.yxtun\.com|m\.bukamh\.com|m\.duoximh\.com)\/manhua\/\w+\/\d+\.html/i,
        imgs: () => {
            let imgs = [...fun.gae("#images img:not([src*=loading]),#scroll-image img")];
            fun.remove("#scroll-image");
            return imgs;
        },
        button: [4],
        insertImg: ["#images", 2],
        go: 1,
        autoDownload: [0],
        next: () => {
            try {
                if (nextChapterData.id > 0) {
                    return nextChapterData.url;
                } else {
                    return null;
                }
            } catch (e) {
                let next = fun.ge("//a[text()='下一章 > '][contains(@href,'html')]");
                if (next) {
                    return next.href;
                } else {
                    return null;
                }
            }
        },
        autoNext: true,
        prev: 1,
        customTitle: () => {
            let host = location.hostname;
            if (/xlsmh|qmiaomh|gougoumh|qimhua|yxtun|bukamh|duoximh/.test(host)) {
                return fun.geT("#panel-title span,.title3 span").replace(">", " - ");
            } else {
                return fun.title("在线", 1);
            }
        },
        css: "body{padding:0!important}.UnderPage~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(.fancybox-container),.bottom~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.FullPictureLoadMsg):not(#FullPictureLoad):not(#FullPictureLoadOptions):not(.fancybox-container),div[style*='text-align: left;']{display:none!important}",
        category: "comic"
    }, {
        name: "前未漫画/漫画芯/蔷薇漫画/最漫画/爱米推漫画/下拉式漫画/漫画吧/漫画连/拼拼漫画/零点漫画/雪儿漫画/狗狗漫画/奇奇漫画/悠闲漫画/不卡漫画/多熙漫画 www.qianmh.com www.mhxin.com www.qwmanhua.com www.zuimh.com www.imitui.com imitui.com www.xlsmh.com www.dmhua8.com www.100mhl.com www.pinmh.com www.0dmh.com www.xuermh.com www.gougoumh.com www.qimhua.com www.yxtun.com www.bukamh.com www.duoximh.com",
        enable: 0,
        reg: /www\.(mhxin|qianmh|qwmanhua|zuimh|imitui|xlsmh|dmhua8|100mhl|pinmh|0dmh|xuermh|gougoumh|qimhua|yxtun|bukamh|duoximh)\.com\/manhua\/\w+\/\d+\.html/i,
        init: "try{$(document).unbind('keydown');$(document).unbind('keyup')}catch(e){}",
        imgs: () => chapterImages,
        button: [4],
        insertImg: ["#images,#imagesOld", 2],
        go: 1,
        autoDownload: [0],
        next: ".next>a,a.next,a.nextC",
        autoNext: true,
        prev: ".pre>a,a.prev,a.prevC",
        autoClick: "#chapter-pagination:not(.active),#mode_pagination",
        customTitle: () => {
            let host = location.hostname;
            if (/mhxin|qwmanhua|pinmh/.test(host)) {
                return fun.geT(".head_title").replace("-", " -");
            } else if (/qianmh|xlsmh|100mhl|0dmh|xuermh|gougoumh|qimhua|bukamh|duoximh/.test(host)) {
                return fun.geT("h1").trim();
            } else if (/zuimh|imitui|dmhua|yxtun/.test(host)) {
                return fun.geT(".title h1") + " - " + fun.geT(".title h2");
            }
        },
        css: "#qTcms_picID{display:none!important}",
        category: "comic"
    }, {
        name: "雪儿漫画M m.xuermh.com",
        enable: 0,
        reg: /m\.xuermh\.com\/manhua\/\w+\/\d+\.html/i,
        init: async () => {
            let a = fun.ge(".erPag a");
            let img = fun.ge(".erPag a img:last-child");
            a.outerHTML = img.outerHTML;
            await fun.getNP(".erPag mip-link img:not([style*=position])", "//mip-link[text()='下一页'][contains(@href,'-')] | //a[text()='下一页'][contains(@href,'-')]", null, "#action", 0, null, 0);
        },
        imgs: () => [...fun.gae(".erPag mip-link img:not([style*=position])")],
        button: [4],
        insertImg: [".erPag", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[text()='下一章']",
        autoNext: true,
        prev: "//a[text()='上一章']",
        customTitle: () => fun.geT("h1").replace(">", " - ").trim(),
        css: "div[style*='text-align: left;'],#action li:nth-child(2),#action li:nth-child(3),span.right{display:none!important}#action li{width:50%!important}",
        category: "comic"
    }, {
        name: "来漫画 www.laimanhua8.com",
        enable: 0,
        reg: /www\.laimanhua\d?\.(net|com)\/kanmanhua\/\w+\/\d+\.html/i,
        imgs: () => {
            let imgData = base64_decode(picTree).split("$qingtiandy$");
            let host = getpicdamin();
            return imgData.map(e => host + e);
        },
        button: [4],
        insertImg: ["#pic-list", 2],
        go: 1,
        autoDownload: [0],
        next: ".btn-next[href^=j]",
        autoNext: true,
        prev: ".btn-prev",
        customTitle: () => fun.title(",", 1).replace("漫画", ""),
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "comic"
    }, {
        name: "来漫画M m.laimanhua8.com",
        enable: 0,
        reg: /m\.laimanhua8\.com\/kanmanhua\/\w+\/\d+\.html/i,
        imgs: () => mhInfo.images.map(e => realurl + mhInfo.path + e),
        button: [4],
        insertImg: ["#manga", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[text()='下一章']",
        autoNext: true,
        prev: "//a[text()='上一章']",
        customTitle: () => fun.geT("#mangaTitle"),
        css: "#jusha1{display:none!important}",
        category: "comic"
    }, {
        name: "奇妙漫画 www.qmiaomh.com",
        enable: 0,
        reg: /www\.qmiaomh\.com\/manhua\/\w+\/\d+\.html/i,
        imgs: () => {
            let arr = [];
            chapterImages.forEach(e => {
                let imgSrc;
                if (e.indexOf("http") != -1) {
                    imgSrc = e;
                } else {
                    imgSrc = SinConf.resHost[0].domain + e;
                }
                arr.push(imgSrc);
            });
            return arr;
        },
        insertImg: ["#images", 2],
        go: 1,
        autoDownload: [0],
        next: "a.next",
        autoNext: true,
        prev: "a.prev",
        customTitle: () => fun.title(" - ", 1),
        category: "comic"
    }, {
        name: "漫客栈 www.mkzhan.com",
        enable: 0,
        reg: /www\.mkzhan\.com\/\d+\/\d+\.html/i,
        init: async () => {
            let lps = location.pathname.split("/");
            let comic_id = lps[1];
            let chapter_id = lps[2].match(/\d+/)[0];
            let apiUrl = `https://comic.mkzcdn.com/chapter/content/v1/?chapter_id=${chapter_id}&comic_id=${comic_id}&format=1&quality=1&type=1`;
            siteJson = await fetch(apiUrl).then(res => res.json());
            debug("\n此頁JSON資料\n", siteJson);
        },
        imgs: () => siteJson.data.page.map(e => e.image),
        insertImg: ["#pages-tpl", 1],
        go: 1,
        autoDownload: [0],
        next: ".rd-aside a.j-rd-next",
        autoNext: true,
        prev: ".rd-aside a.j-rd-prev",
        autoClick: "//div[@class='rd-aside__item j-rd-mod'][span[text()='卷轴']]",
        customTitle: () => fun.title(" - ", 1),
        category: "comic"
    }, {
        name: "漫画屋 www.mhua5.com www.mhw1.com www.manhw.com www.360mh.cc www.mhzj54.com www.bingmh.com www.manshiduo.net mh.manhw.com comics.veryim.com www.38manhua.com 797mh.com",
        enable: 0,
        reg: /www\.(mhua5|mhw\d|manhw|360mh)\.(com|cc)\/(chapter.+\.html|index\.php\/chapter\/\d+)|www\.mhzj54\.com\/chapter\/\d+$|www\.bingmh\.com\/chapter\/\d+\.html$|www\.manshiduo\.net\/chapter_\d+\.html$|mh\.manhw\.com\/index\.php\/chapter\/\d+$|comics\.veryim\.com\/\w+\/\d+\/\d+\.html$|(www\.38manhua\.com|797mh\.com)\/chapter_\d+\.html$/i,
        include: ".rd-article-wr",
        init: () => {
            fun.gae("img[data-original],img[data-src]").forEach(e => {
                new Image().src = e.dataset.original || e.dataset.src;
            });
            document.onkeydown = null;
        },
        imgs: "img[data-original]:not([data-original*='/template/pc/default/']),.lazy-read:not([data-original*='/template/pc/default/']),img[data-src]",
        button: [4],
        insertImg: [".rd-article-wr", 3],
        go: 1,
        autoDownload: [0],
        next: ".btn--next-chapter,.rd-aside a.j-rd-next",
        autoNext: true,
        prev: ".rd-aside a.j-rd-prev",
        autoClick: "//div[@class='rd-aside__item j-rd-mod'][span[text()='卷轴']]",
        customTitle: () => {
            if (/www\.mhua5\.com|www\.mhw\d\.com/.test(location.host)) {
                return fun.title(" - 漫画屋").replace("-", " - ");
            } else if (/www\.manhw\.com|mh\.manhw\.com/.test(location.host)) {
                return fun.attr("meta[name=description]", "content").split(" - 漫画屋")[0].replace("当前阅读的是", "").replace("的", " - ");
            } else if (/www\.360mh\.cc|www\.38manhua\.com|797mh\.com/.test(location.host)) {
                return fun.geT(".j-comic-title") + " - " + fun.geT(".last-crumb");
            } else {
                return fun.title(/下拉|在线/, 1).replace("-", " - ").replace(/漫画|\[\d+P\]/i, "");
            }
        },
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "comic"
    }, {
        name: "漫画屋M www.mhua5.com www.manhw.com www.360mh.cc www.mhzj54.com www.bingmh.com www.manshiduo.net m.mkzhan.com mh.manhw.com www.mhw1.com www.38manhua.com 797mh.com",
        enable: 0,
        reg: /(www\.(mhua5|manhw)\.com|mh\.manhw\.com)\/(chapter.+\.html|index\.php\/chapter\/\d+)|(www\.360mh\.cc|www\.mhw\d\.com)\/chapter-\d+.html|www\.mhzj54\.com\/chapter\/\d+$|www\.bingmh\.com\/chapter\/\d+\.html$|www\.manshiduo\.net\/chapter_\d+\.html$|m\.mkzhan\.com\/\d+\/\d+.html|(www\.38manhua\.com|797mh\.com)\/chapter_\d+\.html$/i,
        imgs: ".comic-page img,#cp_img img[data-original]",
        autoDownload: [0],
        next: async () => {
            if (/www\.mhua5\.com|www\.360mh\.cc|www\.bingmh\.com|www\.mhw\d\.com|www\.38manhua\.com/.test(location.host)) {
                let next = fun.attr(".next-chapter", "_href");
                if (next !== "") {
                    return location.origin + next;
                } else {
                    return null;
                }
            } else if (/m\.mkzhan\.com/.test(location.host)) {
                await fun.waitEle(".next-chapter[data-href]", 10)
                let next = fun.ge(".next-chapter").dataset.href;
                if (next !== "" || next != 0) {
                    return location.origin + next;
                } else {
                    return null;
                }
            } else if (/www\.mhzj54\.com/.test(location.host)) {
                let next = fun.attr(".next-chapter", "_href");
                if (next !== "") {
                    return next;
                } else {
                    return null;
                }
            } else if (/www\.manshiduo\.net|www\.manhw\.com|mh\.manhw\.com/.test(location.host)) {
                let next = fun.attr(".next-chapter", "_href");
                if (next !== "") {
                    return location.origin + next;
                } else {
                    return null;
                }
            } else if (/797mh\.com/.test(location.host)) {
                let next = fun.attr(".prev-chapter", "_href");
                if (next !== "") {
                    return location.origin + next;
                } else {
                    return null;
                }
            } else {
                let next = fun.ge("//a[text()='下一章']");
                if (next) {
                    return next.href;
                } else {
                    return null;
                }
            }
        },
        autoNext: true,
        prev: 1,
        customTitle: () => {
            if (/www\.mhua5\.com|www\.manhw\.com|mh\.manhw\.com/.test(location.host)) {
                return fun.title(" - 漫画屋").replace("-", " - ");
            } else if (/m\.mkzhan\.com/.test(location.host)) {
                return fun.title(" - 漫客栈").trim();
            } else if (/www\.360mh\.cc|www\.mhw\d\.com|www\.38manhua\.com|797mh\.com/.test(location.host)) {
                return shareArr[0].match(/《([^》]+)/)[1] + " - " + fun.geT(".comic-name");
            } else if (/www\.bingmh\.com/.test(location.host)) {
                return fun.geT("title+title").split("在线")[0].replace("-", " - ").trim();
            } else {
                return fun.title("下拉", 1).trim().replace("-", " - ");
            }
        },
        css: "body>ins,#mainView>.read,.chapter-end .read,#chapter1,#chapter3,.cnt-4,.comic-list a,.chapter-end>a,div[style^=height]{display:none!important}",
        category: "comic"
    }, {
        name: "爱国漫 www.aiguoman.com",
        enable: 0,
        reg: /www\.aiguoman\.com\/chapter\/.+\.html/i,
        imgs: ".main-item>img",
        autoDownload: [0],
        next: ".J_next_eposide_btn",
        prev: ".J_prev_eposide_btn",
        customTitle: () => fun.geT(".cartoon-title>a:first-child") + " - " + fun.geT(".cartoon-title>a:last-child"),
        category: "comic"
    }, {
        name: "爱国漫M m.aiguoman.com",
        enable: 0,
        reg: /m\.aiguoman\.com\/chapter\/.+\.html/i,
        imgs: ".lazy-image[data-original]",
        autoDownload: [0],
        next: "//a[text()='下一章'][contains(@href,'html')]",
        prev: "//a[text()='上一章'][contains(@href,'html')]",
        customTitle: () => document.title.split("免费")[0].replace("漫画", ""),
        category: "comic"
    }, {
        name: "新新漫画 www.77mh.xyz",
        enable: 0,
        reg: /(www|m)\.77mh\.[a-z]{2,3}\/\d+\/\d+\.html/i,
        init: "try{$(document).unbind('keydown');$(document).unbind('keyup')}catch(e){}",
        imgs: async () => {
            await fun.delay(1000);
            let imgData = msg.split("|");
            let arr = [];
            for (let i in imgData) {
                let imgSrc;
                if (location.hostname.indexOf("m.77mh") != -1) {
                    imgSrc = ImgSvrList + imgData[i];
                } else {
                    imgSrc = img_qianz + imgData[i];
                }
                arr.push(imgSrc);
            }
            return arr;
        },
        button: [4],
        insertImg: ["#comicImg,.mg-co", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[contains(text(),'下一章')]",
        autoNext: true,
        prev: "//a[contains(text(),'上一章')]",
        customTitle: () => fun.title(" - ", 3),
        category: "comic"
    }, {
        name: "漫漫聚/KuKu动漫 www.manmanju.com manhua.kukudm.com",
        enable: 1,
        reg: /(a|b|www|manhua)\.(manmanju|i?kukudm)\.com\/comiclist\/\d+\/\d+\/1\.htm/i,
        include: "td img",
        comicListUrl: () => {
            let comicId = location.href.split("/")[4];
            let comicListUrl;
            if (/(www|a|b)\.manmanju\.com/.test(location.origin)) {
                comicListUrl = `http://www.manmanju.com/comiclist/${comicId}/index.htm`;
            } else {
                comicListUrl = `http://manhua.kukudm.com/comiclist/${comicId}/index.htm`;
            }
            return comicListUrl;
        },
        init: async () => {
            let cUrl = siteData.comicListUrl();
            let url = await siteData.next();
            if (url) {
                fun.addUrlHtml(url, "body", 2);
                fun.addUrlHtml(cUrl, "body", 2, "目錄");
            } else {
                if (/manmanju/.test(location.origin)) {
                    fun.addUrlHtml(cUrl, "body", 2, "目錄");
                    fun.addUrlHtml("http://www.manmanju.com/", "body", 2, "首頁");
                } else {
                    fun.addUrlHtml(cUrl, "body", 2, "目錄");
                    fun.addUrlHtml("https://manhua.kukudm.com/", "body", 2, "首頁");
                }
            }
        },
        imgs: () => fun.getKukudmSrc(),
        button: [4],
        insertImg: ["//td[input]", 2],
        go: 1,
        autoDownload: [0],
        next: () => {
            let chapterId = location.href.split("/")[5];
            let host;
            if (/www\.manmanju\.com|manhua\.kukudm\.com/.test(location.origin)) {
                host = 1;
            } else if (/a\.manmanju\.com|a\.ikukudm\.com/.test(location.origin)) {
                host = 2;
            } else if (/b\.manmanju\.com|b\.ikukudm\.com/.test(location.origin)) {
                host = 3;
            }
            let nextXPath = `//dd[a[contains(@href,'${chapterId}')]]/following-sibling::dd[1]/a[${host}]`;
            return fun.fetchDoc(siteData.comicListUrl()).then(doc => {
                let next = fun.ge(nextXPath, doc);
                if (next) {
                    return next.href;
                } else {
                    return null;
                }
            })
        },
        autoNext: true,
        prev: 1,
        css: "body>table:nth-child(1),body>table:nth-child(3){display:none!important}body>table:nth-child(2),body>table:nth-child(2)>tbody>tr>td{width:100%!important;}body{scrollbar-width:none;-ms-overflow-style:none;overflow-x:hidden;overflow-y:auto}",
        category: "comic"
    }, {
        name: "漫漫聚M/KuKu动漫M m.manmanju.com m.ikuku.cc s1.m.ikkdm.com s2.m.ikkdm.com 1pc570gfrd9z.ihhmh.com s2.wap.ikukudm.com s3.wap.ikukudm.com mh123.dypro.xyz",
        enable: 1,
        reg: /(m\.manmanju\.com|\w+\.ihhmh\.com|s\d\.m\.ikkdm\.com|s\d.wap.ikukudm.com|mh123\.dypro\.xyz)\/comiclist\/\d+\/\d+\/1\.htm/i,
        include: ".classBox img,.imgBox",
        init: async () => {
            fun.remove("//center[iframe]");
            let url = await siteData.next();
            if (url) {
                fun.addUrlHtml(url, ".bottom .subNav", 1);
            }
            let nav = fun.ge("ul.subNav").cloneNode(true);
            let tE = fun.ge("div.bottom");
            tE.parentNode.insertBefore(nav, tE);
            fun.remove("meta[name=viewport]");
            $("head").append('<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=2.0,user-scalable=no"/>');
            setTimeout(() => {
                let nextDivEle = fun.ge(".bottom div");
                let bottomEle = fun.ge(".bottom");
                if (nextDivEle) {
                    bottomEle.innerHTML = fun.ge("div", bottomEle).outerHTML + fun.ge("p", bottomEle).outerHTML;
                } else {
                    bottomEle(".bottom").innerHTML = fun.ge("p", bottomEle).outerHTML;
                }
            }, 500);
        },
        imgs: () => {
            fun.remove("//a[img] | //ul[center[li]]");
            fun.remove(".bottom .subNav~div[style*=height],.bottom .pageLine,.bottom .subNav");
            return fun.getKukudmSrc();
        },
        button: [4],
        insertImg: [".imgBox", 2],
        go: 1,
        autoDownload: [0],
        next: () => {
            let comicListUrl = fun.ge(".subNav a").href;
            let chapterId = location.href.split("/")[5];
            let nextXPath = `//li[a[contains(@href,'${chapterId}')]]/preceding-sibling::li[1]/a`;
            return fun.fetchDoc(comicListUrl).then(doc => {
                let next = fun.ge(nextXPath, doc);
                if (next) {
                    return next.href;
                } else {
                    return null;
                }
            })
        },
        autoNext: true,
        prev: 1,
        customTitle: () => fun.title("在线", 1),
        css: ".imgBox{margin-bottom:0px!important}.subNav{border-top:1px solid #dcdcde}",
        category: "comic"
    }, {
        name: "仙漫网 www.gaonaojin.com",
        enable: 0,
        reg: /www\.gaonaojin\.com\/\w+\/\d+\.html/i,
        imgs: () => picdata.map(e => imgDomain + e),
        button: [4],
        insertImg: [".comicpage", 2],
        go: 1,
        autoDownload: [0],
        next: "//li[a[@class='active']]/preceding-sibling::li[1]/a",
        autoNext: true,
        prev: "//li[a[@class='active']]/following-sibling::li[1]/a",
        customTitle: () => fun.geT("h1.title").replace(/\(\d+\/\d+\)/, "").trim(),
        category: "comic"
    }, {
        name: "仙漫网M m.gaonaojin.com",
        enable: 0,
        reg: /m\.gaonaojin\.com\/\w+\/\d+\.html/i,
        imgs: () => {
            let code = [...document.scripts].find(s => s.innerHTML.search(/eval/) > -1).innerHTML.match(/eval.+\)\)/)[0].slice(4);
            let imgData = fun.run(fun.run(code).match(/picdata[^;]+/)[0]);
            return imgData.map(e => "https://res.xiaoqinre.com/" + e);
        },
        button: [4],
        insertImg: ["#cp_img", 2],
        go: 1,
        autoDownload: [0],
        next: ".btn.next",
        autoNext: true,
        prev: ".btn.prev",
        customTitle: () => fun.title("免费", 1),
        category: "comic"
    }, {
        name: "漫画牛 manhua666.cc www.manhua666.cc 漫画台 manhuatai.org www.manhuatai.org",
        enable: 0,
        reg: /manhua666\.\w+\/\w+\/\d+\.html|manhuatai\.org\/manhua\/\d+\/\d+\.html/i,
        imgs: () => [...fun.doc(imgs.join("")).images],
        button: [4],
        insertImg: ["#content", 2],
        go: 1,
        autoDownload: [0],
        next: "a[rel=next][href$=html],#next_url",
        autoNext: true,
        prev: "a[rel=prev][href$=html],#prev_url",
        customTitle: () => {
            let s = fun.geT(".info-title,.con_top").split(/\s?>/);
            return (s[2] + s[3]).trim();
        },
        category: "comic"
    }, {
        name: "大树漫画 www.dashumanhua.com",
        enable: 0,
        reg: /www\.dashumanhua\.com\/comic\/\w+\/.+\.html/i,
        imgs: () => {
            let code = [...document.scripts].find(s => s.innerHTML.search(/picTree/) > -1).innerHTML;
            let m = code.match(/eval.+\)\)/)[0].slice(4);
            return fun.run(fun.run(m).slice(12, -1));
        },
        button: [4],
        insertImg: ["#pic-list", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[text()='下一话' and not(contains(@href,'--1'))]",
        autoNext: true,
        prev: "//a[text()='上一话' and not(contains(@href,'--1'))]",
        customTitle: () => fun.title(/\(/, 1),
        category: "comic"
    }, {
        name: "GODA漫画 cocomanga.org godamanga.art",
        enable: 0,
        reg: /https?:\/\/(cocomanga\.org|godamanga\.art)\/manga\/[a-z0-9-_]+\/[a-z0-9-_]+(\/|\.html)$/i,
        delay: 300,
        imgs: "//img[@decoding and @layout] | //img[@decoding and contains(@class,'img_content_jpg')]",
        insertImg: ["//div[div[div[div[div[img[@decoding and @layout]]]]]] | //div[div[div[div[div[img[@decoding and contains(@class,'img_content_jpg')]]]]]]", 2],
        autoDownload: [0],
        next: "//a[span[text()='下一话']] | //a[span[text()='NEXT']]",
        prev: "//a[span[text()='上一话']] | //a[span[text()='PREV']]",
        customTitle: () => fun.geT("h1"),
        category: "comic"
    }, {
        name: "GODA漫畫 godamanga.com cn.godamanga.site gd.godamanga.art cn.godamanga.art cn.godamanga.com 包子漫畫 baozimh.org bz.godamanga.art cn.baozimh.org",
        enable: 0,
        reg: /https?:\/\/((www|gd|bz|cn)\.)(baozimh|godamanga)\.(art|com|org)\/manga\/[a-z0-9-_]+\/[a-z0-9-_]+/i,
        init: async () => {
            try {
                let script = "//script[contains(text(),'currentManga')]";
                await fun.waitEle(script);
                let code = fun.geT(script);
                let id = code.match(/\\"id\\":(\d+)/)[1];
                let api = `https://papi.mgsearcher.com/api/chapters/${id}?fields[0]=chapter_img&encodeValuesOnly=true`;
                siteJson = await fetch(api, {
                    "headers": {
                        "Authorization": "Bearer b69efef9280150ba3c29ebd02f1dd08b78d9d76a646fea85442c8f806f0037512d3bfab40a27528769b52373f9857edae1b8d74a3198c60f583f223bcccd8fde586cbc8420570a34570b62d2bef66c6aa82da8a3fd0c3dd2dedb18b8ea276f55d56151fe72317f2f38c9f888475f7433e24edebd7775c4aafa98ec9694789da9"
                    }
                }).then(res => res.json());
                debug("\n此頁JSON資料\n", siteJson);
            } catch (e) {}
        },
        imgs: async () => {
            await fun.waitEle(".touch-manipulation");
            try {
                if (siteJson.data == null) {
                    return [];
                } else {
                    return siteJson.data.attributes.chapter_img.map(e => e.url);
                }
            } catch (e) {
                return [...fun.gae(".touch-manipulation img")];
            }
        },
        //insertImg: [".touch-manipulation", 2],
        autoDownload: [0],
        next: () => {
            let next = fun.ge("//a[button[text()='下一話' or text()='下一话']]");
            if (next) {
                return next.href;
            } else {
                return null;
            }
        },
        prev: 1,
        customTitle: () => fun.geT("ol.inline-flex>li:nth-child(2) a") + " - " + fun.geT("ol.inline-flex>li:nth-child(3) a"),
        category: "comic"
    }, {
        name: "漫畫屋 mh5.tw",
        enable: 0,
        reg: /mh5\.tw\/(series|seriesvip)-\w+-\d+-\d+/i,
        imgs: () => {
            let max;
            if (/seriesvip/.test(location.href)) {
                max = fun.geT("a.cur~a:last-child") - 2;
            } else {
                max = fun.geT("a.cur~a:last-child") - 1;
            }
            return fun.getImgIframe(".ptview>img[alt]:not([style])", max, 13, [null, null], ".setnmh-pagedos", 0, 0);
        },
        insertImg: [".ptview", 1, 0],
        autoDownload: [0],
        next: "//a[text()='下一話']",
        prev: "//a[text()='上一話']",
        customTitle: () => {
            let ele = fun.ge("h2");
            if (ele) {
                return fun.geT("h1") + " - " + fun.geT("h2");
            } else {
                return fun.geT(".setnmh-bookname>a:nth-child(5)") + " - " + fun.geT(".setnmh-bookname>a:nth-child(7)");
            }
        },
        css: ".ptview>img{width:100%!important;height:auto!important;max-width:1000px!important;border:none!important;box-shadow:none!important;padding:0!important;margin:0 auto!important}",
        category: "comic"
    }, {
        name: "七夕漫画 www.qiximh2.com",
        enable: 0,
        reg: /www\.qiximh\d+\.com\/\d+\/\d+\.html/i,
        imgs: ".main_img img",
        insertImg: [".main_img", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[img[@alt='下一章'] and contains(@href,'html')]",
        autoNext: true,
        prev: "//a[img[@alt='上一章'] and contains(@href,'html')]",
        customTitle: () => fun.title("_", 3),
        category: "comic"
    }, {
        name: "七夕漫画M m.qiximh2.com",
        enable: 0,
        reg: /m\.qiximh\d+\.com\/\d+\/\d+\.html/i,
        imgs: ".main_img img",
        insertImg: [".main_img", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[p[text()='下一篇'] and contains(@href,'html')]",
        autoNext: true,
        prev: "//a[p[text()='上一篇'] and contains(@href,'html')]",
        customTitle: () => {
            let s = document.title.replace(" - 七夕漫画", "").split("_");
            return s[1] + " - " + s[0];
        },
        css: ".ad_js{display:none!important}",
        category: "comic"
    }, {
        name: "爱漫之家 www.17fuman.com www2.17fuman.com www.fumanhua-1.com www.fumanhua-2.com www.fumanhua-3.com www2.fumanhua-1.com m.fumanhua-1.com m.fumanhua44.com m.fumanhua66.com m.fumanhua77.com  m1.fumanhua-1.com m1.fumanhua44.com m1.fumanhua66.com m1.fumanhua77.com",
        enable: 0,
        reg: /(www|m)\d?\.(17fuman|fumanhua-?\d+)\.com\/\w+\/\d+\/\d+\.html/i,
        init: "document.onkeydown=null",
        imgs: () => base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => qTcms_m_weburl + e),
        insertImg: ["//td[img[@id='qTcms_pic']]", 2],
        go: 1,
        autoDownload: [0],
        next: "#k_Pic_nextArr",
        autoNext: true,
        prev: "#k_Pic_backArr",
        customTitle: () => fun.title(' - ', 3).replace("漫画", ""),
        css: ".bd_980_90{display:none!important}",
        category: "comic"
    }, {
        name: "73漫画 www.73mh.net",
        enable: 0,
        reg: /www\.73mh\.net\/mh\/\w+\//i,
        imgs: ".v_con_box img",
        insertImg: ["section .v_con_box", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[text()='下一话']",
        autoNext: true,
        prev: "//a[text()='上一话']",
        customTitle: () => fun.geT(".p_select>h2") + " - " + fun.geT(".v-page>span"),
        category: "comic"
    }, {
        name: "漫画160 www.mh160.cc",
        enable: 0,
        reg: /www\.mh160\.cc\/kanmanhua\/\w+\/\d+\.html/i,
        init: "document.onkeydown=null",
        imgs: () => base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => f_qTcms_Pic_curUrl_realpic(e)),
        button: [4],
        insertImg: ["//td[//img[@onclick]]", 2],
        go: 1,
        autoDownload: [0],
        next: "#k_Pic_nextArr",
        autoNext: true,
        prev: "#k_Pic_backArr",
        customTitle: () => qTcms_S_m_name + " - " + qTcms_S_m_playm,
        category: "comic"
    }, {
        name: "733 动漫 www.733.so",
        enable: 0,
        reg: /www\.733\.so\/mh\/\d+\/\d+\/1\.html/i,
        imgs: () => [...fun.doc(temp_pic_all).images],
        insertImg: ["#pic_box p", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[text()='下一话']",
        autoNext: true,
        prev: "//a[text()='上一话']",
        customTitle: () => fun.geT(".p_select>h2") + " - " + fun.geT(".v-page .ispubu"),
        category: "comic"
    }, {
        name: "733 动漫M m.733.so",
        enable: 0,
        reg: /m\.733\.so\/mh\/\d+\/\d+\/\d+\.html/i,
        imgs: () => [...fun.doc(temp_pic_all).images],
        insertImg: [".select_con", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[text()='下一话' and contains(@href,'html')]",
        autoNext: true,
        prev: "//a[text()='上一话' and contains(@href,'html')]",
        customTitle: () => {
            let s = document.title.split("-");
            return s[1] + " - " + s[0];
        },
        category: "comic"
    }, {
        name: "漫画160M m.mh160.cc",
        enable: 0,
        reg: /m\.mh160\.cc\/kanmanhua\/\w+\/\d+\.html/i,
        imgs: () => base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => f_qTcms_Pic_curUrl_realpic(e)),
        button: [4],
        insertImg: [".UnderPage", 2],
        go: 1,
        autoDownload: [0],
        next: "#k_Pic_nextArr",
        autoNext: true,
        prev: "#k_Pic_backArr",
        customTitle: () => qTcms_S_m_name + " - " + qTcms_S_m_playm,
        category: "comic"
    }, {
        name: "漫画库 www.mhko.net",
        enable: 0,
        reg: /www\.mhko\.net\/comic\/\d+\/\d+\.html/i,
        init: () => {
            document.onkeydown = null;
            let url = siteData.next();
            if (url) {
                fun.addUrlHtml(url, ".tbCenter", 1);
            }
        },
        imgs: () => {
            try {
                return base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$");
            } catch (e) {
                return window.atob(qTcms_S_m_murl_e).split("$qingtiandy$");
            }
        },
        button: [4],
        insertImg: ["//td[img[@id='qTcms_pic']]", 2],
        go: 1,
        autoDownload: [0],
        next: () => {
            if (qTcms_Pic_nextArr !== "") {
                return location.origin + qTcms_Pic_nextArr;
            } else {
                return null;
            }
        },
        autoNext: true,
        prev: 1,
        customTitle: () => qTcms_S_m_name + " - " + qTcms_S_m_playm,
        css: ".iFloat,#mypic_k0{display:none!important}",
        category: "comic"
    }, {
        name: "笨狗漫画 www.bengou.co m.bengou.co",
        enable: 0,
        reg: /(www|m)\.bengou\.co\/\w+\/\w+\/\d+\.html/i,
        init: () => {
            document.onkeydown = null;
        },
        imgs: () => base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => f_qTcms_Pic_curUrl_realpic(e)),
        insertImg: ["//td[img[@id='qTcms_pic']]", 2],
        go: 1,
        autoDownload: [0],
        next: () => {
            if (qTcms_Pic_nextArr !== "") {
                return location.origin + qTcms_Pic_nextArr;
            } else {
                return null;
            }
        },
        autoNext: true,
        prev: 1,
        customTitle: () => qTcms_S_m_name + " - " + qTcms_S_m_playm,
        css: ".action-list li{width:50% !important}#mypic_k0,.action-list>ul>li:nth-child(n+2):nth-child(-n+3){display:none!important}",
        category: "comic"
    }, {
        name: "星辰漫画网 www.xcmh.com m.xcmh.com",
        enable: 1,
        reg: /(www|m)\.xcmh\.com\/\w+\/\w+\/\d+\.html/i,
        init: () => {
            document.onkeydown = null;
        },
        imgs: () => base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => location.origin + f_qTcms_Pic_curUrl_realpic(e)),
        insertImg: ["//td[img[@id='qTcms_pic']]", 2],
        go: 1,
        autoDownload: [0],
        next: () => {
            if (qTcms_Pic_nextArr !== "") {
                return location.origin + qTcms_Pic_nextArr;
            } else {
                return null;
            }
        },
        autoNext: true,
        prev: 1,
        customTitle: () => qTcms_S_m_name + " - " + qTcms_S_m_playm,
        css: "#mypic_k0{display:none!important}",
        category: "comic"
    }, {
        name: "酷酷屋 www.kukuwumh.com m.kukuwumh.com",
        enable: 0,
        reg: /(www|m)\.kukuwumh\.com\/manhua\/\w+\/\d+\.html/,
        init: "document.onkeydown=null",
        imgs: () => base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$"),
        insertImg: ["//td[//img[@onclick]]", 2],
        go: 1,
        autoDownload: [0],
        next: "#k_Pic_nextArr",
        autoNext: true,
        prev: "#k_Pic_backArr",
        customTitle: () => {
            if (/www\.kukuwumh\.com/.test(location.origin)) {
                return fun.geT("#skin~h1") + " - " + fun.geT("#skin~h2");
            } else {
                let s = document.title.split(" - ");
                return (s[1] + " - " + s[0]).replace("漫画", "");
            }
        },
        category: "comic"
    }, {
        name: "木马漫画 www.omyschool.com",
        enable: 0,
        reg: /www\.omyschool\.com\/article_detail\/\d+\/\d+\/.+\/.+\//i,
        imgs: "#imgs amp-img",
        button: [4],
        insertImg: ["#imgs", 2],
        go: 1,
        autoDownload: [0],
        next: ".nav_button.next",
        autoNext: true,
        prev: ".nav_button.prev",
        customTitle: () => fun.geT("//a/span[@property and not(i)]") + " - " + fun.geT("//li/span[@property and not(i)]"),
        category: "comic"
    }, {
        name: "砂之船动漫家 www.szcdmj.com",
        enable: 0,
        reg: /www\.szcdmj\.com\/szcchapter\/\d+/i,
        include: ".comiclist",
        imgs: async () => {
            await fun.getNP(".comicpage>div", "//a[@href and text()='下一页']", null, ".fanye");
            return [...fun.gae("img.lazy")];
        },
        button: [4],
        insertImg: [".comiclist", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[text()='下一话']",
        autoNext: true,
        prev: "//a[text()='上一话']",
        customTitle: () => fun.geT("h1.title"),
        category: "comic"
    }, {
        name: "砂之船动漫家M www.szcdmj.com",
        enable: 0,
        reg: /www\.szcdmj\.com\/szcchapter\/\d+/i,
        include: "#cp_img",
        imgs: async () => {
            await fun.getNP("#cp_img>img[data-original]", "//a[@href and text()='下一页']", null, ".view-bottom-bar");
            return [...fun.gae("#cp_img>img[data-original]")];
        },
        insertImg: ["#cp_img", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[text()='下一话']",
        autoNext: true,
        prev: "//a[text()='上一话']",
        customTitle: () => bookInfo.book_name + " - " + bookInfo.chapter_name,
        category: "comic"
    }, {
        name: "雪人漫画 www.xuerenmanhua.com",
        enable: 0,
        reg: /www\.xuerenmanhua\.com\/chapter\/\d+/i,
        include: ".comiclist",
        imgs: ".comiclist img",
        button: [4],
        insertImg: [".comicpage", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[text()='下一章']",
        autoNext: true,
        prev: "//a[text()='上一章']",
        customTitle: () => fun.geT("h1.title"),
        category: "comic"
    }, {
        name: "雪人漫画M www.xuerenmanhua.com",
        enable: 0,
        reg: /www\.xuerenmanhua\.com\/chapter\/\d+/i,
        imgs: "#cp_img>img[data-original]",
        button: [4],
        insertImg: ["#cp_img", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[text()='下一章']",
        autoNext: true,
        prev: "//a[text()='上一章']",
        customTitle: () => bookInfo.book_name + " - " + bookInfo.chapter_name,
        category: "comic"
    }, {
        name: "好漫6 www.haoman6.com",
        enable: 0,
        reg: /www\.haoman6\.com\/chapter\/\d+/,
        imgs: "img[data-ecp]",
        insertImg: [".rd-article-wr", 2],
        go: 1,
        autoDownload: [0],
        next: ".j-rd-next",
        autoNext: true,
        prev: ".j-rd-prev",
        customTitle: () => fun.geT(".j-comic-title").replace("(最新在线)", "") + " - " + fun.geT(".last-crumb"),
        category: "comic"
    }, {
        name: "好漫8 haoman8.com",
        enable: 0,
        reg: /haoman8\.com\/comic\/\d+\/\d+/,
        imgs: "img[data-echo]",
        insertImg: ["#reader-scroll", 2],
        go: 1,
        autoDownload: [0],
        next: "#js_pageNextBtn",
        autoNext: true,
        prev: "#js_pagePrevBtn",
        customTitle: () => fun.geT("#crumbComicLink") + " - " + fun.geT("#js_headChapterName"),
        category: "comic"
    }, {
        name: "拷貝漫畫 www.copymanga.site copymanga.site www.mangacopy.com mangacopy.com",
        enable: 1,
        reg: /(www\.)?(copymanga\.site|mangacopy\.com)\/comic\/\w+\/chapter\/.+/,
        delay: 300,
        init: async () => {
            document[_0x1f93("0x1b")][_0x1f93("0x27")] = null;
            $(document).unbind("click");
            $(document).unbind("keydown");
            $(document).unbind("keyup");
            const hidetoolbar = () => {
                var e = e || window.event;
                if (e.wheelDelta < 0 || e.detail > 0) {
                    $("h4.header").attr("style", "top: -30px;");
                    $("div.footer").attr("style", "bottom: -41px;");
                } else {
                    $("h4.header").removeAttr("style");
                    $("div.footer").removeAttr("style");
                }
            };
            document.addEventListener("wheel", hidetoolbar);
            document.addEventListener("DOMMouseScroll", hidetoolbar);
            const keyhidetoolbar = (e) => {
                let key = window.event ? e.keyCode : e.which;
                if (key == "34" || key == "32" || key == "40") {
                    $("h4.header").attr("style", "top: -30px;");
                    $("div.footer").attr("style", "bottom: -41px;");
                } else {
                    $("h4.header").removeAttr("style");
                    $("div.footer").removeAttr("style");
                }
            };
            document.addEventListener("keydown", keyhidetoolbar);
            let api;
            if (/mangacopy/.test(location.origin)) {
                api = location.href.replace(/.*?(?=\/comic\/)/, "https://api.mangacopy.com/api/v3");
            } else {
                api = location.href.replace(/.*?(?=\/comic\/)/, "https://api.copymanga.site/api/v3");
            }
            let json = await fetch(api).then(res => res.json());
            siteJson = json;
            debug("\n此頁JSON資料\n", json);
        },
        button: [4],
        imgs: () => siteJson.results.chapter.contents.map(e => e.url),
        insertImg: [".comicContent-list", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[text()='下一話'][starts-with(@href,'/comic/')]",
        autoNext: true,
        prev: "//a[text()='上一話'][starts-with(@href,'/comic/')]",
        customTitle: () => siteJson.results.comic.name + " - " + siteJson.results.chapter.name,
        topButton: true,
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.header+div[style],.comicContainerAds{display:none!important}",
        category: "comic"
    }, {
        name: "拷貝漫畫M www.copymanga.site copymanga.site www.mangacopy.com mangacopy.com",
        enable: 1,
        reg: /(www\.)?copymanga\.site\/h5\/comicContent\/\w+\/.+/,
        xhr: () => {
            let s = location.href.split("/").slice(-2);
            let api;
            if (/mangacopy/.test(location.origin)) {
                api = `https://api.mangacopy.com/api/v3/comic/${s[0]}/chapter/${s[1]}`;
            } else {
                api = `https://api.copymanga.site/api/v3/comic/${s[0]}/chapter/${s[1]}`;
            }
            return new Promise(resolve => {
                _GM_xmlhttpRequest({
                    method: "GET",
                    url: api,
                    responseType: "json",
                    headers: {
                        "Referer": `https://${location.hostname}/comic/${s[0]}/chapter/${s[1]}`,
                        "User-Agent": PcUa
                    },
                    onload: data => {
                        resolve(data.response);
                    }
                });
            });
        },
        init: async () => {
            siteJson = await siteData.xhr();
            debug("\n此頁JSON資料\n", siteJson);
            const addHtml = (url, text) => {
                let str = `<div style="padding: 10px 0; text-align: center;"><a href="${url}"style="width: 100%;font-size: 26px;line-height: 50px;height: 50px;text-align: center;">${text}</a></div>`;
                fun.ge(".comicContentPopupImageList").insertAdjacentHTML("afterend", str);
            };
            let s = location.href.split("/").slice(-2);
            let url = `https://${location.hostname}/h5/details/comic/${s[0]}`;
            addHtml(`https://${location.hostname}/h5/index`, "首頁");
            addHtml(url, "目錄");
            let nUrl = siteData.next();
            if (nUrl) {
                addHtml(nUrl, "點選進入下一話");
            }
        },
        imgs: () => siteJson.results.chapter.contents.map(e => e.url),
        button: [4],
        insertImg: [".comicContentPopupImageList", 2],
        go: 1,
        next: () => {
            let next = siteJson.results.chapter.next;
            if (next) {
                return location.href.replace(/[\w-]+$/, "") + next;
            } else {
                return null;
            }
        },
        customTitle: () => siteJson.results.comic.name + " - " + siteJson.results.chapter.name,
        css: ".comicFixed{display:none!important}",
        category: "comic"
    }, {
        name: "二次元動漫 www.2animx.com",
        enable: 0,
        reg: /www\.2animx\.com\/index-look-name-.+/,
        init: "$(document).unbind('click');",
        imgs: () => fun.getImgO("#ComicPic", $("#total").val(), 20, [null, null], 0, "div.b,.e>p", 0),
        button: [4],
        insertImg: ["#img_ad_img", 1],
        autoDownload: [0],
        next: ".n.zhangjie",
        autoNext: true,
        prev: ".p.zhangjie",
        customTitle: () => fun.geT(".e>p").replace(/(\d+P) - 第 \d+ \/ \d+ 頁/, ""),
        topButton: true,
        css: ".c>*:not(.n.zhangjie):not(.p.zhangjie){display:none!important;}#ComicPic{display:block!important;margin: 0 auto !important;}",
        category: "comic"
    }, {
        name: "酷漫屋 www.kumw9.com m.kumw9.com",
        enable: 0,
        reg: /(www|m)\.kumw\d\.com\/\d+\/\d+\.html/,
        imgs: ".main_img img",
        button: [4],
        insertImg: [".main_img", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[img[@alt='下一章']] | //a[i[@class='i-rd-next'] and contains(@href,'html')]",
        autoNext: true,
        prev: "//a[img[@alt='上一章']] | //a[i[@class='i-rd-prev'] and contains(@href,'html')]",
        customTitle: () => {
            try {
                return fun.geT(".chaptitle").replace(">", "-");
            } catch (e) {
                let s = document.title.replace(" - 酷漫屋", "").split("_");
                return s[1] + " - " + s[0];
            }
        },
        category: "comic"
    }, {
        name: "速漫库 qumanku.com www.sumanku.com",
        enable: 0,
        reg: /https?:\/\/(www.)?\w+manku\.com\/\w+\/\w+\.html/i,
        imgs: ".main_img img",
        button: [4],
        insertImg: [".main_img", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[span[text()='下一章']]",
        autoNext: true,
        prev: "//a[span[text()='上一章']]",
        customTitle: () => fun.attr("meta[itemprop=mhname]", "content") + " - " + fun.geT(".chaptitle"),
        category: "comic"
    }, {
        name: "漫画DB www.manhuadb.com",
        enable: 0,
        reg: /www\.manhuadb\.com\/manhua\/\d+\/\w+\.html$/,
        imgs: async () => {
            return img_data_arr.map(e => {
                if (is_webp && e.img_webp) {
                    return img_host + img_pre + e.img_webp;
                } else {
                    return img_host + img_pre + e.img;
                }
            });
        },
        button: [4],
        insertImg: ["#all", 2],
        go: 1,
        autoDownload: [0],
        next: async () => {
            return fetch("https://www.manhuadb.com/book/goNumPage", {
                "headers": {
                    "content-type": "application/x-www-form-urlencoded; charset=UTF-8"
                },
                "body": `ccid=${p_ccid}&id=${p_id}&num=${parseInt(vg_r_data.data("num")) + 1}&d=${p_d}&type=next`,
                "method": "POST"
            }).then(res => res.json()).then(json => {
                if (json.state == 0) {
                    return null;
                } else {
                    return location.origin + json.url;
                }
            });
        },
        autoNext: true,
        prev: "//a[text()='上集']",
        customTitle: () => fun.title("-漫画DB"),
        category: "comic"
    }, {
        name: "快岸漫画 kanbook.net",
        enable: 0,
        reg: /kanbook\.net\/comic\/\d+\/\d+/,
        delay: 1000,
        init: "$(document).unbind('keydown');$(document).unbind('keyup');",
        imgs: () => {
            let arr = [];
            if (is_refresh == 0) {
                for (let i = 0; i < pageNum; i++) {
                    arr.push(Gm.getImgUrl(comic_id + "/" + version_id + "/" + part_id + "/" + my_sha2(x_tokens[i])));
                }
            } else {
                for (let i = 0; i < data.url.length; i++) {
                    arr.push(Gm.getImgUrl(data.url[i]));
                }
            }
            return arr;
        },
        button: [4],
        insertImg: ["#all", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[text()='下一章' and not(starts-with(@href,'javascript'))]",
        autoNext: true,
        prev: "//a[text()='上一章' and not(starts-with(@href,'javascript'))]",
        customTitle: () => fun.geT("h2.h2>a") + " - " + fun.geT("span.h4:nth-child(5)"),
        //threading: 4,
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "comic"
    }, {
        name: "快看漫画 www.kuaikanmanhua.com",
        enable: 0,
        reg: /www\.kuaikanmanhua\.com\/web\/comic\/\d+\//,
        imgs: ".imgList img[data-src]",
        insertImg: [".imgList", 2],
        autoDownload: [0],
        next: "//a[text()='下一话']",
        prev: "//a[text()='上一话']",
        customTitle: () => fun.geT("h3.title"),
        category: "comic"
    }, {
        name: "腾讯漫画 ac.qq.com",
        enable: 0,
        reg: /ac\.qq\.com\/ComicView\/index\/id\/\d+\/cid\/\d+/,
        imgs: () => {
            let nonce = [...document.scripts].find(s => s.innerHTML.search(/^\s+window\[/) > -1).innerHTML.match(/\s*window.*?=(.*?)?;/)[1];
            nonce = fun.run(nonce);
            const data = DATA.split("");
            nonce = nonce.match(/\d+[a-z]+/gi);
            let n = nonce.length;
            let locate = null;
            let str = "";
            while (n--) {
                locate = parseInt(nonce[n]) & 255;
                str = nonce[n].replace(/\d+/g, "");
                data.splice(locate, str.length);
            }
            const base64 = data.join("");
            const json = JSON.parse(window.atob(base64));
            return json.picture.map(e => e.url);
        },
        autoDownload: [0],
        next: "#nextChapter",
        prev: "#prevChapter",
        customTitle: () => fun.geT("#chapter") + " - " + fun.geT(".title-comicHeading"),
        category: "comic"
    }, {
        name: "哔哩哔哩漫画 manga.bilibili.com",
        enable: 1,
        reg: /manga\.bilibili\.com\/mc\d+\/\d+\?from=manga_detail/,
        init: () => {
            setTimeout(() => {
                fun.ge(".load-next-btn").addEventListener("click", () => {
                    setTimeout(() => {
                        location.reload();
                    }, 500)
                })
            }, 1000)
        },
        imgs: async () => {
            let ep_id = siteUrl.split("/").pop().match(/\d+/)[0];
            let headers = {
                "content-type": "application/json;charset=UTF-8"
            };
            let imgsRes = await fetch("/twirp/comic.v1.Comic/GetImageIndex?device=pc&platform=web", {
                "headers": headers,
                "body": JSON.stringify({
                    ep_id: `${ep_id}`
                }),
                "method": "POST"
            }).then(res => res.json()).then(json => json.data.images.map(e => e.path));
            return fetch("/twirp/comic.v1.Comic/ImageToken?device=pc&platform=web", {
                "headers": headers,
                "body": JSON.stringify({
                    urls: JSON.stringify(imgsRes)
                }),
                "method": "POST"
            }).then(res => res.json()).then(json => json.data.map(e => `${e.url}?token=${e.token}`));
        },
        insertImg: [".image-list", 2],
        next: ".load-next-btn",
        prev: 1,
        customTitle: async () => {
            await fun.delay(1500, 0);
            return fun.geT(".manga-title") + " - " + fun.geT(".episode");
        },
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "comic"
    }, {
        name: "看漫画 www.kanman.com",
        enable: 0,
        reg: /www\.kanman\.com\/\d+\/[\w-]+\.html/,
        imgs: () => {
            let s = location.pathname.split("/");
            let comic_id = s[1];
            let chapter_newid = s[2].replace(".html", "");
            let api = `/api/getchapterinfov2?product_id=1&productname=kmh&platformname=pc&comic_id=${comic_id}&chapter_newid=${chapter_newid}&isWebp=1&quality=middle`;
            return fetch(api).then(res => res.json()).then(json => json.data.current_chapter.chapter_img_list);
        },
        customTitle: async () => {
            await fun.delay(1500, 0);
            return fun.geT('#crumbComicLink') + " - " + fun.geT('.chapter-title').trim();
        },
        category: "comic"
    }, {
        name: "漫蛙 manwa.me", //方向鍵上一章下一章、清除擋廣告警告、向下滾動隱藏工具列、反反偵錯,,下載需先手動觸發全部載入圖片,函式使用到canvas需要繪製過程會有點卡。
        enable: 1,
        reg: /manwa\.me\/chapter\/\d+(\?img_host=\d)?$/,
        init: async () => {
            Function.prototype.constructor = () => {};
            //await fun.scrollEles(".img-content img", 200);
            fun.css(".ad-area{opacity:0!important;}#cp_img>.two-ad-area:nth-child(1)>.ad-area,#cp_img>.two-ad-area:nth-child(2){display:none!important}");
            fun.remove(".ad-area,body>div[id]", 5000);
            const hidetoolbar = () => {
                var e = e || window.event;
                if (e.wheelDelta < 0 || e.detail > 0) {
                    $(".view-fix-top-bar").attr("style", "top: -60px;");
                    $(".view-fix-bottom-bar").attr("style", "bottom: -60px;");
                    $(".detail-comment-fix-bottom").hide("fast");
                } else {
                    $(".view-fix-top-bar").attr("style", "top: 0px;");
                    $(".view-fix-bottom-bar").attr("style", "bottom: 0px;");
                    $(".detail-comment-fix-bottom").show("fast");
                }
            };
            document.addEventListener("wheel", hidetoolbar);
            document.addEventListener("DOMMouseScroll", hidetoolbar);
            const keyhidetoolbar = (e) => {
                let key = window.event ? e.keyCode : e.which;
                if (key == "34" || key == "32" || key == "40") {
                    $(".view-fix-top-bar").attr("style", "top: -60px;");
                    $(".view-fix-bottom-bar").attr("style", "bottom: -60px;");
                    $(".detail-comment-fix-bottom").hide("fast");
                } else {
                    $(".view-fix-top-bar").attr("style", "top: 0px;");
                    $(".view-fix-bottom-bar").attr("style", "bottom: 0px;");
                    $(".detail-comment-fix-bottom").show("fast");
                }
            };
            document.addEventListener("keydown", keyhidetoolbar);
            if (("ontouchstart" in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0)) {
                let startY, moveY, Y;
                $("body").on("touchstart", (e) => {
                    startY = e.originalEvent.changedTouches[0].pageY;
                });
                $("body").on("touchmove", (e) => {
                    moveY = e.originalEvent.changedTouches[0].pageY;
                    Y = moveY - startY;
                    if (Y < 0) {
                        $(".view-fix-top-bar").attr("style", "top: -60px;");
                        $(".view-fix-bottom-bar").attr("style", "bottom: -60px;");
                        $(".detail-comment-fix-bottom").hide("fast");
                    } else if (Y > 0) {
                        $(".view-fix-top-bar").attr("style", "top: 0px;");
                        $(".view-fix-bottom-bar").attr("style", "bottom: 0px;");
                        $(".detail-comment-fix-bottom").show("fast");
                    }
                });
            }
        },
        imgs: () => fun.imgBlobArr(".content-img[src^=blob]"),
        next: ".view-fix-bottom-bar-item-menu-next",
        prev: ".view-fix-bottom-bar-item-menu-prev",
        customTitle: () => fun.title("在线阅读", 1),
        css: "body{padding-bottom:0px!important}",
        category: "comic"
    }, {
        name: "漫蛙選目錄展開全部章節 manwa.me",
        enable: 1,
        icon: 0,
        key: 0,
        reg: /manwa\.me\/book\/\d+$/,
        init: "Function.prototype.constructor=()=>{};titleSelect(this,'#chapter_indexes');charpterMore(this);",
        category: "comic"
    }, {
        name: "漫蛙自動載入更多 manwa.me",
        enable: 1,
        icon: 0,
        key: 0,
        reg: /manwa\.me\/update$/,
        init: "Function.prototype.constructor=()=>{};",
        observerClick: "#loadMore",
        category: "comic"
    }, {
        name: "開車漫画 18p.fun",
        enable: 1,
        reg: /^https?:\/\/(www\.)?(18p|gohaveababy|imynest|healthway|beforeout)\.[a-z]{2,5}\/(ForInject\/|Article\/|content\/)/,
        imgs: async () => {
            await fun.waitEle("//script[contains(text(),'_curChap')]");
            if (location.hostname != "18p.fun") {
                location.replace("https://18p.fun/ForInject/Chapter/?id=" + $_curChap.id);
                await fun.delay(3000, 0);
            }
            await fun.getNP("img[data-src].lazy:not(.demo-lazy)", "//a[@data-url and contains(text(),'下一頁')] | //a[@data-url and contains(text(),'下一章')]", null, "div[class^=picnext]");
            return [...fun.gae("img[data-src].lazy:not(.demo-lazy)")];
        },
        insertImg: ["div[class^=pictures]", 3],
        fetch: 1,
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "comic"
    }, {
        name: "開車漫画 18p.fun",
        enable: 0,
        icon: 0,
        key: 0,
        reg: /^https:\/\/18p\.fun\//,
        include: ".loadmore>button",
        init: () => {
            const setImgSrc = () => gae("img.lazy[src$=svg]").forEach(img => {
                img.src = img.dataset.src;
            });
            setImgSrc();
            new MutationObserver(() => {
                setImgSrc()
            }).observe(document.body, {
                childList: true,
                subtree: true
            });
        },
        observerClick: ".loadmore>button",
        openInNewTab: "#itemlist li>a:not([target=_blank])",
        css: ".page{display:none!important}.loadmore{display:block!important}",
        category: "comic"
    }, {
        name: "风之动漫 www.fffdm.com",
        enable: 1,
        reg: /(www\.fffdm\.com|manhua\.fffdm\.com)\/(manhua\/)?\d+\/[^/]+\/$/i,
        init: async () => {
            let s = location.pathname.split("/").slice(-3);
            let mhId = s[0];
            let mhcId = s[1];
            let api = `https://${location.hostname}/api/manhua/${mhId}/${mhcId}`;
            let json = await fetch(api).then(res => res.json());
            debug("\n此頁JSON資料\n", json);
            siteJson = json;
            let url = await siteData.next();
            if (url) {
                let text = `<div style="padding: 36px 0; text-align: center;"><a href="${url}"style="font-size: 26px;line-height: 50px;height: 50px;text-align: center;">點選進入下一話</a></div>`;
                fun.ge("#mh").insertAdjacentHTML("afterend", text);
                fun.ge("#mh+div").addEventListener("click", () => {
                    setTimeout(() => {
                        location.reload();
                    }, 200)
                });
            }
        },
        imgs: async () => {
            let hostArr = ["https://p5.fffdm.live/", "https://p6.fffdm.live/", "https://p1.fffdm.live/"];
            let firstPic = siteJson.cont[0];
            let testArr = hostArr.map(e => e + firstPic);
            let ok = false;
            let host;
            for (let i in testArr) {
                let obj = await fun.checkImgStatus(testArr[i]);
                console.log(`確認圖片[${i}]`, obj);
                if (obj.ok) {
                    ok = true;
                    host = hostArr[i];
                    break;
                }
            }
            if (ok) {
                return siteJson.cont.map(e => host + e);
            } else {
                return [];
            }
        },
        insertImg: ["#mh", 2],
        go: 1,
        next: () => {
            let comicListUrl = location.href.replace(/[\w-]+\/$/i, "");
            let chapter = location.href.match(/[\w-]+\/$/)[0];
            let nextXPath = `//div[@id='content']/li[a[@href='${chapter}']]/preceding-sibling::li[1]/a`;
            return fun.fetchDoc(comicListUrl).then(doc => {
                let next = fun.ge(nextXPath, doc);
                if (next) {
                    return comicListUrl + next.getAttribute("href");
                } else {
                    return null;
                }
            })
        },
        autoNext: true,
        prev: 1,
        customTitle: () => fun.title("第1页", 1),
        category: "comic"
    }, {
        name: "大古漫画 www.dgmanhua.com",
        enable: 1,
        reg: /www\.(dgmanhua|dagumanhua)\.\w+\/manhua\/\d+\/\d+\.html$/i,
        init: async () => {
            document.onkeydown = null;
            document.onkeyup = null;
            let url = await siteData.next();
            if (url) {
                fun.addUrlHtml(url, ".mh_list", 1);
            }
        },
        imgs: () => fun.getImg(".mh_list img", fun.ge("//script[contains(text(),'totalpage')]").innerHTML.match(/totalpage\s?=\s?(\d+)/)[1], 9),
        button: [4],
        insertImg: [".mh_list", 2],
        go: 1,
        next: () => {
            let comicListUrl = location.href.replace(/\d+\.html$/, "");
            let chapter = location.pathname;
            let nextXPath = `//li[a[@href='${chapter}']]/preceding-sibling::li[1]/a`;
            return fun.fetchDoc(comicListUrl).then(doc => {
                let next = fun.ge(nextXPath, doc);
                if (next) {
                    return location.origin + next.getAttribute("href");
                } else {
                    return null;
                }
            })
        },
        autoNext: true,
        prev: 1,
        customTitle: () => fun.geT(".mh_cont>h1"),
        category: "comic"
    }, {
        name: "大古漫画M m.dgmanhua.com",
        enable: 1,
        reg: /m\.(dgmanhua|dagumanhua)\.\w+\/manhua\/\d+\/\d+\.html$/i,
        init: async () => {
            let content = fun.ge("#content,.content");
            if (content) {
                content.innerHTML = fun.ge("img", content).outerHTML;
            }
            let url = await siteData.next();
            if (url) {
                fun.addUrlHtml(url, "#content,.content", 1);
            }
        },
        imgs: async () => {
            await fun.getNP("#content img,.content img", "//a[@href and text()='下一页']", null, ".pager,.cpages", 0, null, 0);
            return [...fun.gae("#content img,.content img")];
        },
        button: [4],
        insertImg: ["#content,.content", 1],
        msg: 0,
        next: () => {
            let comicListUrl = location.href.replace(/\d+\.html$/, "");
            let chapter = location.pathname;
            let nextXPath = `//li[a[@href='${chapter}']]/preceding-sibling::li[1]/a`;
            return fun.fetchDoc(comicListUrl).then(doc => {
                let next = fun.ge(nextXPath, doc);
                if (next) {
                    return location.origin + next.getAttribute("href");
                } else {
                    return null;
                }
            })
        },
        //next: "//a[@href and text()='下一章']",
        autoNext: true,
        prev: "//a[@href and text()='上一章']",
        customTitle: () => fun.geT("#bookname") + " - " + fun.geT(".headline"),
        css: "#content~a,.content~a,.apjg,.pager a:nth-child(n+2):nth-child(-n+3){display:none!important}.pager a{width:44%!important}#content,.content{width:100%}",
        category: "comic"
    }, {
        name: "大古漫画M m.dgmanhua.com loadMore",
        enable: 1,
        icon: 0,
        key: 0,
        reg: /m\.(dgmanhua|dagumanhua)\.\w+\/manhua\//i,
        include: "//div[text()='点击加载更多']",
        observerClick: "//div[text()='点击加载更多']",
        category: "comic"
    }, {
        name: "哈哈漫画 www.hahacomic.com",
        enable: 0,
        reg: /^https:\/\/www\.hahacomic\.com\/manhua\/\d+\/\d+\.html/,
        imgs: "img[data-original]",
        button: [4],
        insertImg: [".chapter-images", 2],
        go: 1,
        autoDownload: [0],
        autoNext: true,
        next: "//a[label[text()='下一章'] and not(starts-with(@href,'java'))]",
        prev: "//a[label[text()='上一章'] and not(starts-with(@href,'java'))]",
        category: "comic"
    }, {
        name: "哈哈漫画 www.hahacomic.com 分類自動翻頁",
        enable: 1,
        reg: /^https:\/\/www\.hahacomic\.com\/manhua\/list\.html/,
        icon: 0,
        key: 0,
        autoPager: {
            ele: ".mdui-col-lg-2",
            observer: ".mdui-col-lg-2",
            next: () => {
                let next = fun.ge("span.current+a", doc);
                if (next) {
                    let num = next.getAttribute("href").match(/\d+/)[0];
                    return location.href.replace(/\?page=\d+/, "") + "?page=" + num;
                } else {
                    return null;
                }
            },
            re: ".pages",
            history: 1
        },
        openInNewTab: ".mdui-col-lg-2>a",
        category: "autoPager"
    }, {
        name: "爱看漫画 www.qt1588.com m.qt1588.com",
        enable: 0,
        reg: /^https:\/\/(www|m)\.qt1588\.com\/comic\/[0-9_]+\.html/,
        imgs: ".chapter-content img,.hide-scrollbars img",
        button: [4],
        insertImg: [".chapter-content,.hide-scrollbars", 2],
        go: 1,
        autoDownload: [0],
        next: "//span[starts-with(@class,'next-chapter')]/a[contains(@href,'html')] | //a[p[text()='下一话'] and contains(@href,'html')]",
        autoNext: true,
        prev: "//span[starts-with(@class,'prev-chapter')]/a[contains(@href,'html')] | //a[p[text()='上一话'] and contains(@href,'html')]",
        customTitle: () => fun.title("-在线", 1),
        category: "comic"
    }, {
        name: "漫畫類 自動展開目錄",
        enable: 1,
        icon: 0,
        key: 0,
        reg: /((mangabz|xmanhua|dm5|1kkk|qiman\d+|mhxqiu\d|6mh\d+|manben|mkzhan|xianmanwang|qiximh\d|kumw\d)\.com\/[\w-]+\/$)|(m\.dmzj\.com|m\.ymh1234\.com)\/(info|comic)\/\d+\.html$|(acgud|manhua456|mhxin|qwmanhua|zuimh|imitui|xlsmh|dmhua8|pinmh|qmiaomh|dashumanhua|kukuwumh|mh160|szcdmj|haoman6)\.(com|cc)\/(comic|manhua|manga|kanmanhua|szcbook)\/[\w-]+\/?$|www\.mhua5\.com\/[\w-]+\.html|m\.aiguoman\.com\/comic\/\w+|(www|m)\.77mh\.\w+\/colist_\d+\.html|www\.manhw\.com\/index\.php\/comic\/\w+$/,
        init: async () => {
            if (location.hostname == "m.acgud.com") {
                fun.css(".Introduct_Sub{background:url(https://m.idmzj.com/images/int_bg.png)!important;background-size:100% 100%!important}");
            }
            if (location.hostname == "m.mhxqiu2.com") {
                await fun.delay(600, 0);
            }
        },
        autoClick: "a.detail-list-form-more,a.detail-list-more,.deatil-list-more>a,.detail-more,.moreChapter,.show-more,a#zhankai,.gengduo_dt1>button,.morechapter>button,.gengduo_dt1>a,.chapterList+.more,li.add,a.extend,a.action-collapse:not(.on),.chapter__more .down,.listmore,.more.chapLiList-cont>a,.m-load-more-sm>a,.more>a,.allmulu,.show-more>a,.morechp,.nnmore>a",
        css: ".comic-info-box+a,.cartoon-introduction.cmg,.cartoon-introduction+a,.msloga,.comic_intro>a,.Introduct+a,[class^='ad']{display:none!important}",
        category: "comic"
    }, {
        name: "94i.in 自動簽到",
        icon: 0,
        key: 0,
        reg: /^https?:\/\/94i\.in\//,
        autoClick: "#pper_a:not([style='display: none;'])",
        category: "none"
    }, {
        name: "Supjav 立即顯示影片縮圖",
        icon: 0,
        key: 0,
        delay: 300,
        reg: /^https?:\/\/supjav\.com\/(zh\/|ja\/)?\d+\.html/,
        init: async () => {
            let t = fun.ge("title");
            t.innerText = t.innerText.replace(/-\sSupjav.com.+/, "").trim();
            let ele = "#vserver.play-button";
            if (await fun.waitEle(ele)) fun.ge(ele).click();
        },
        category: "none"
    }, {
        name: "ouo.io 自動跳轉",
        icon: 0,
        key: 0,
        reg: /^https?:\/\/ouo\./,
        init: async () => {
            let ele = "#btn-main:not(.disabled)";
            if (await fun.waitEle(ele)) {
                fun.ge(ele).click();
                //elementClick(fun.ge(ele));
            }
        },
        category: "none"
    }, {
        name: "cuty.io 自動跳轉",
        icon: 0,
        key: 0,
        reg: /^https:\/\/cutt?y\.(io|app)\/\w+/i,
        init: async () => {
            let ele = "//button[@id='submit-button' and text()= 'Continue' or text()= 'I am not a robot' or text()= 'Go ->']";
            if (await fun.waitEle(ele)) {
                fun.ge(ele).click();
                //elementClick(fun.ge(ele));
            }
        },
        category: "none"
    }, {
        name: "m.4khd.com 自動跳轉",
        icon: 0,
        key: 0,
        reg: /^https?:\/\/m\.4khd\.com\//,
        init: () => {
            location.href = fun.ge("//a[text()='GET LINK']").href;
        },
        category: "none"
    }, {
        name: "4kup.net 自動跳轉",
        icon: 0,
        key: 0,
        reg: /^https:\/\/4kup\.net\/getlink\/$/,
        init: async () => {
            let eleArr = ["#output:not([style*=none]) button", "#gotolink:not([disabled])"];
            for (let i in eleArr) {
                await fun.waitEle(eleArr[i]);
                fun.ge(eleArr[i]).click();
                //elementClick(fun.ge(eleArr[i]));
                await fun.delay(200);
            }
        },
        category: "none"
    }, {
        name: "MediaFire 自動下載",
        icon: 0,
        key: 0,
        reg: /^https?:\/\/www\.mediafire\.com\//,
        autoClick: ".download_link:not(.started) #downloadButton",
        category: "none"
    }, {
        name: "anonfiles 自動下載",
        icon: 0,
        key: 0,
        reg: /^https?:\/\/anonfiles\.com\//,
        autoClick: ["#download-url"],
        category: "none"
    }, {
        name: "letsupload 自動下載",
        icon: 0,
        key: 0,
        reg: /^https?:\/\/letsupload\.cc\//,
        autoClick: ["#download-url"],
        category: "none"
    }, {
        name: "stfly.me 半自動跳轉",
        icon: 0,
        key: 0,
        reg: /^http/,
        include: "img[src^='https://stfly.me/']",
        init: async () => {
            if (await fun.waitEle(".btn-captcha:not(.disable)")) {
                setInterval(() => {
                    fun.ge(".btn-captcha:not(.disable)").click();
                    //elementClick(fun.ge(".btn-captcha:not(.disable)"));
                }, 3000);
            }
        },
        category: "none"
    }, {
        name: "link1s 自動跳轉",
        icon: 0,
        key: 0,
        reg: /^http/,
        include: "a.site-logo[href='https://link1s.com/'],a.logo-image[href='https://link1s.com/']",
        init: async () => {
            if (await fun.waitEle("//button[@onclick='link1sgo()'] | //button[@id='link' and contains(@style,'none')] | //a[text()='Get Link']")) {
                fun.ge("//button[@onclick='link1sgo()'] | //a[@id='link1s'] | //a[text()='Get Link']").click();
                //elementClick(fun.ge("//button[@onclick='link1sgo()'] | //a[@id='link1s'] | //a[text()='Get Link']"));
            }
        },
        category: "none"
    }, {
        name: "網址清單新分頁開啟",
        icon: 0,
        key: 0,
        delay: 1000,
        reg: /github\.com\/skofkyo\/AutoPager\/tree\/main\/CustomPictureDownload/,
        openInNewTab: ".entry-content a[href]:not([target=_blank]):not([id])",
        category: "none"
    }, {
        name: "google search loadmore",
        icon: 0,
        key: 0,
        enable: 1,
        reg: /^https:\/\/(?:www\.)?google\..*\/search/,
        include: "a[aria-label='更多搜尋結果']",
        observerClick: "//a[@aria-label='更多搜尋結果' and div[not(@style='display: none;')]]",
        openInNewTab: "#center_col a[ping][data-ctpacw]",
        category: "none"
    }, {
        name: "測試 test",
        reg: /^https?:\/\/\w+\.hathitrust\.org\/cgi\/pt\?id=/,
        imgs: () => {
            return fun.imgBlobArr(".image>img");
            //return fun.imgBlobArr(".image>img", 2);
            //return fun.imgBlobArr(".image>img", 2, "image/png");
        },
        category: "none"
    }, {
        name: "測試2 test2",
        enable: 0,
        reg: /www.htmleaf.com|idoitmyself.xyz/,
        init: async () => {
            await fun.delay(4000, 0);
            /*
            html2canvas(document.querySelector("canvas")).then(canvas => {
                let base64Url = canvas.toDataURL("image/jpeg");
                console.log("base64Url", base64Url);
            });
            */
        },
        category: "none"
    }, {
        name: "Civitai models civitai.com",
        reg: /^https:\/\/civitai\.com\/models\/\d+/,
        delay: 2000,
        init: async () => {
            await fun.waitEle(".mantine-u0eh0m");
            let div = document.createElement("div");
            div.className = "imgBox";
            let x = fun.ge(".mantine-u0eh0m");
            x.parentNode.insertBefore(div, x.nextSibling);
            fun.CivitAiAutoShowNSFW();
        },
        imgs: () => [...fun.gae(".mantine-116dglk .mantine-7aj0so")].map(e => e.src.replace(/\/width=\d+\//, "/").replace("transcode=true,width=450", "transcode=true")),
        repeat: 1,
        button: [4],
        insertImg: [".imgBox", 3],
        go: 1,
        fetch: 1,
        customTitle: () => fun.geT(".mantine-Title-root").replace(/\|\s/, "").replace(/\//g, "-") + " - " + fun.geT(".mantine-z8ikjj"),
        openInNewTab: "a[href]:not([target=_blank])",
        observerTitle: true,
        category: "AI"
    }, {
        name: "Civitai posts civitai.com",
        reg: /^https:\/\/civitai\.com\/posts\/\d+/,
        delay: 2000,
        init: () => {
            fun.CivitAiAutoShowNSFW();
        },
        imgs: async () => {
            await fun.waitEle("a[rel='nofollow noindex'] img,video[src]");
            await fun.delay(200, 0);
            return [...fun.gae("a[rel='nofollow noindex'] img,video[src]")].map(e => e.src.replace(/\/width=\d+\//, "/").replace("transcode=true,width=450", "transcode=true"));
        },
        repeat: 1,
        button: [4],
        insertImg: [
            [".mantine-Stack-root", 0], 2
        ],
        go: 1,
        fetch: 1,
        openInNewTab: "a[href]:not([target=_blank])",
        category: "AI"
    }, {
        name: "CivitAi Auto Show NSFW civitai.com",
        reg: /^https:\/\/civitai\.com\//,
        delay: 2000,
        icon: 0,
        key: 0,
        init: () => {
            fun.CivitAiAutoShowNSFW();
        },
        openInNewTab: "a[href]:not([target=_blank])",
        category: "AI"
    }];

    switch (language) {
        case "zh-TW":
            displayLanguage = {
                str_01: "獲取圖片元素中...",
                str_02: "獲取圖片中 ",
                str_03: "獲取圖片逾時",
                str_04: "等待關鍵元素中...",
                str_05: "獲取資料中...",
                str_06: "獲取資料中 ",
                str_07: "確認登錄狀態中...",
                str_08: "獲取預覽圖中...",
                str_09: "獲取最後一張圖...",
                str_10: "是否複製鏈接至剪貼簿?",
                str_11: "已複製鏈接至剪貼簿",
                str_12: "只有複製鏈接功能",
                str_13: "請輸入圖片抓取最大次數",
                str_14: "獲取下一頁中...",
                str_15: "獲取下一頁結束",
                str_16: "獲取元素中...",
                str_17: "獲取元素中 ",
                str_18: "已聚集所有圖片",
                str_19: "用來定位插入的元素不存在",
                str_20: "沒有能插入的圖片",
                str_21: "延遲",
                str_22: "毫秒",
                str_23: "第",
                str_24: "張下載",
                str_25: "完成",
                str_26: "錯誤",
                str_27: "下載失敗了",
                str_28: "張不壓縮",
                str_29: "建議F5後重新下載",
                str_30: "圖片extension錯誤",
                str_31: "壓縮進度: ",
                str_32: "自動下載倒數",
                str_33: "秒",
                str_34: "nextJS前往下一頁",
                str_35: "已點擊下一頁",
                str_36: "自動下載完畢",
                str_37: "沒有下一頁元素",
                str_38: "返回上一頁",
                str_39: "已點擊上一頁",
                str_40: "沒有上一頁元素",
                str_41: "已取消",
                str_42: "字數小於3已取消",
                str_43: "下載失敗數據為空...",
                str_44: "沒有任何圖片元素...",
                str_45: "圖片網址已複製",
                str_46: "即將進行捲動...",
                str_47: "左鍵:進行下載打包壓縮\n中鍵:捲動至第一張大圖\n右鍵:複製圖片網址和標題或聚集所有圖片",
                str_48: "下載&壓縮中請稍後再操作!",
                str_49: "獲取圖片中請稍後再操作!",
                str_50: "請輸入自訂CSS/Xpath選擇器:\n範例:img#TheImg OR //img[@id='TheImg']\n也能使用JS代碼自己生成的IMG元素陣列\n範例:js;return [...document.images];",
                str_51: "請輸入自訂壓縮檔資料夾名稱",
                str_52: "聚圖數量",
                str_53: "圖片繪製中...",
                str_54: "403,未登錄網站?",
                str_55: "下載載入中...",
                str_56: "確認圖片狀態中...",
                str_57: "自動翻頁載入中...",
                str_58: "已到達最後一頁",
                str_59: "沒有任何主體元素",
                str_60: "圖片縮放",
                str_61: "取消縮放"
            };
            break;
        case "zh-CN":
            displayLanguage = {
                str_01: "获取图片元素中...",
                str_02: "获取图片中 ",
                str_03: "获取图片逾时",
                str_04: "等待关键元素中...",
                str_05: "获取数据中...",
                str_06: "获取数据中 ",
                str_07: "确认登录状态中...",
                str_08: "获取预览图中...",
                str_09: "获取最后一张图...",
                str_10: "是否拷贝链接至剪贴板?",
                str_11: "已拷贝链接至剪贴板",
                str_12: "只有拷贝链接功能",
                str_13: "请输入图片抓取最大次数",
                str_14: "获取下一页中...",
                str_15: "获取下一页结束",
                str_16: "获取元素中...",
                str_17: "获取元素中 ",
                str_18: "已聚集所有图片",
                str_19: "用来定位插入的元素不存在",
                str_20: "没有能插入的图片",
                str_21: "延迟",
                str_22: "毫秒",
                str_23: "第",
                str_24: "张下载",
                str_25: "完成",
                str_26: "错误",
                str_27: "下载失败了",
                str_28: "张不压缩",
                str_29: "建议F5后重新下载",
                str_30: "图片extension错误",
                str_31: "压缩进度: ",
                str_32: "自动下载倒数",
                str_33: "秒",
                str_34: "nextJS前往下一页",
                str_35: "已点击下一页",
                str_36: "自动下载完毕",
                str_37: "没有下一页元素",
                str_38: "返回上一页",
                str_39: "已点击上一页",
                str_40: "没有上一页元素",
                str_41: "已取消",
                str_42: "字数小于3已取消",
                str_43: "下载失败数据为空...",
                str_44: "没有任何图片元素...",
                str_45: "图片网址已拷贝",
                str_46: "即将进行卷动...",
                str_47: "左键:进行下载打包压缩\n中键:卷动至第一张大图\n右键:拷贝图片网址和标题或聚集所有图片",
                str_48: "下载&压缩中请稍后再操作!",
                str_49: "获取图片中请稍后再操作!",
                str_50: "请输入自定义CSS/Xpath选择器:\n范例:img#TheImg OR //img[@id='TheImg']\n也能使用JS代码自己生成的IMG元素数组\n范例:js;return [...document.images];",
                str_51: "请输入自定义压缩档文件夹名称",
                str_52: "聚图数量",
                str_53: "图片绘制中...",
                str_54: "403,未登录网站?",
                str_55: "下载加载中...",
                str_56: "确认图片状态中...",
                str_57: "自动翻页加载中...",
                str_58: "已到达最后一页",
                str_59: "没有任何主体元素",
                str_60: "图片缩放",
                str_61: "取消缩放"
            };
            break;
        default:
            displayLanguage = {
                str_01: "Get Element...",
                str_02: "Get Element ",
                str_03: "Get timed out",
                str_04: "Wait Element...",
                str_05: "Get Data...",
                str_06: "Get Data ",
                str_07: "Confirm login status",
                str_08: "Get preview thumbnail",
                str_09: "Get Element...",
                str_10: "whether to copy link to clipboard?",
                str_11: "Copied",
                str_12: "Only link can be copied",
                str_13: "Please enter the number of pictures",
                str_14: "Get next page...",
                str_15: "Get next page end",
                str_16: "Get Element...",
                str_17: "Get Element ",
                str_18: "All pictures gathered",
                str_19: "element does not exist",
                str_20: "No pictures",
                str_21: "Delay",
                str_22: "ms",
                str_23: "No. ",
                str_24: "P download ",
                str_25: "completed",
                str_26: "error",
                str_27: "download failed",
                str_28: "P No compression",
                str_29: "It is recommended to F5 to re-download",
                str_30: "Image extension error",
                str_31: "Compression progress: ",
                str_32: "Countdown ",
                str_33: " sec",
                str_34: "JS Go to next page",
                str_35: "Next page clicked",
                str_36: "Automatic download completed",
                str_37: "No next page element",
                str_38: "return to previous page",
                str_39: "Previous page clicked",
                str_40: "No previous page element",
                str_41: "Cancelled",
                str_42: "Cancelled",
                str_43: "Download failed data is empty",
                str_44: "No picture element",
                str_45: "Image URL copied ",
                str_46: "About to scroll...",
                str_47: "left click:Download and compress\nmiddle click:Scroll to first picture\nleft click:Copy image URL and title or aggregate images",
                str_48: "Downloading & compressing, please try again later!",
                str_49: "Get Pictureing Please try again later!",
                str_50: "Please enter selector:\nexample:img#TheImg OR //img[@id='TheImg']",
                str_51: "Please enter a custom zip file folder name",
                str_52: "Number of pictures",
                str_53: "Picture drawing...",
                str_54: "403,Not logged in to website?",
                str_55: "Download Loading...",
                str_56: "Check picture statusing...",
                str_57: "AutoPager Loading...",
                str_58: "Reached the last page",
                str_59: "no main element",
                str_60: "Image zoom",
                str_61: "Cancel zoom"
            };
            break;
    }
    //console.log("\ndisplayLanguage\n", displayLanguage);

    let _GM_xmlhttpRequest;
    if (typeof GM_xmlhttpRequest != "undefined") {
        _GM_xmlhttpRequest = GM_xmlhttpRequest;
    } else if (typeof GM != "undefined" && typeof GM.xmlHttpRequest != "undefined") {
        _GM_xmlhttpRequest = GM.xmlHttpRequest;
    }

    const fun = {
        getImg: async (img, maxPage = 1, mode = 1, rText = [null, null]) => {
            if (fun.ge(".FullPictureLoadImage")) return [...fun.gae(".FullPictureLoadImage")];
            fetching = true;
            fun.show(displayLanguage.str_01, 0);
            let imgsArray = [];
            let fetchNum = 0;
            const html = url => fetch(url).then(res => {
                if (res.status > 400) {
                    debug(`\nfun.getImg()連線錯誤碼:${res.status}\n`, url);
                }
                return res.arrayBuffer()
            }).then(buffer => {
                debug(`\nfun.getImg() URL`, url);
                const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
                const htmlText = decoder.decode(buffer);
                /*
                let doc = fun.doc(htmlText);
                let imgs = [...doc.images];
                for (let i in imgs) {
                    let check = fun.checkImgSrc(imgs[i], rText);
                    if (check.ok) {
                        new Image().src = check.src;
                    }
                }
                */
                fun.show(`${displayLanguage.str_02}${fetchNum+=1}/${maxPage}`, 0);
                return htmlText;
            }).catch(error => {
                debug(`\nfun.getImg() > fetch()出錯:\n${decodeURI(url)}`, error);
            });
            const resArr = [];
            resArr.push(html(siteUrl));
            if (maxPage > 1) {
                for (let i = 2; i <= maxPage; i++) {
                    if (mode === 1) {
                        //【.html ==> .html?page=2】第一頁 ==> 第二頁
                        //【 ==> ?page=2】第一頁 ==> 第二頁
                        resArr.push(html(siteUrl.replace(/\?page=\d+$/, "") + "?page=" + i));
                    } else if (mode === 2) {
                        //【.html ==> /2.html】 第一頁 ==> 第二頁
                        resArr.push(html(siteUrl.slice(0, -5) + "/" + i + ".html"));
                    } else if (mode === 3) {
                        //【.html ==> _1.html】  第一頁 ==> 第二頁
                        //resArr.push(html(siteUrl.replace(/(_\d+)?\.html$/, "") + "_" + (i - 1) + ".html"));
                        resArr.push(html(siteUrl.replace(/\.html$/, "") + "_" + (i - 1) + ".html"));
                    } else if (mode === 4) {
                        //【/ ==> /2/】  第一頁 ==> 第二頁
                        resArr.push(html(siteUrl.slice(0, -1) + "/" + i + "/"));
                    } else if (mode === "4") {
                        //【 ==> /2】  第一頁 ==> 第二頁
                        resArr.push(html(siteUrl + "/" + i));
                    } else if (mode === 5) {
                        //【.html ==> -2.html】  第一頁 ==> 第二頁
                        resArr.push(html(siteUrl.replace(/\.html$/, "") + "-" + i + ".html"));
                    } else if (mode === "5") {
                        //【-1.html ==> -2.html】  第一頁 ==> 第二頁
                        resArr.push(html(siteUrl.replace(/(-\d+)?\.html$/, "") + "-" + i + ".html"));
                    } else if (mode === 6) {
                        //【?p=1 ==> ?p=2】  第一頁 ==> 第二頁
                        resArr.push(html(siteUrl.replace(/\?p=\d+$/, "") + "?p=" + i));
                    } else if (mode === 7) {
                        //【/1 ==> /2】  第一頁 ==> 第二頁
                        //【.html ==> .html/2】  第一頁 ==> 第二頁
                        resArr.push(html(siteUrl.replace(/\/\d+$/, "") + "/" + i));
                    } else if (mode === 8) {
                        //【 ==> &page=1】  第一頁 ==> 第二頁
                        resArr.push(html(siteUrl.replace(/&page=\d+$/, "") + "&page=" + (i - 1)));
                    } else if (mode === "8") {
                        //【 ==> &page=2】  第一頁 ==> 第二頁
                        resArr.push(html(siteUrl.replace(/&page=\d+$/, "") + "&page=" + i));
                    } else if (mode === 9) {
                        //【.html ==> _2.html】  第一頁 ==> 第二頁
                        resArr.push(html(siteUrl.replace(/(_\d+)?\.html$/, "") + "_" + i + ".html"));
                    } else if (mode === 10) {
                        //【.html ==> .html/2】  第一頁 ==> 第二頁
                        resArr.push(html(siteUrl.replace(/\.html(\/\d+)?$/, "") + ".html/" + i));
                    } else if (mode === 11) {
                        //【/ ==> /2.html】  第一頁 ==> 第二頁
                        //【/1.html ==> /2.html】  第一頁 ==> 第二頁
                        resArr.push(html(siteUrl.replace(/\/(\d+\.html)?$/, "") + "/" + i + ".html"));
                    } else if (mode === 12) {
                        //【/ ==> /2.htm】  第一頁 ==> 第二頁
                        //【/1.htm ==> /2.htm】  第一頁 ==> 第二頁
                        resArr.push(html(siteUrl.replace(/\/(\d+\.htm)?$/, "") + "/" + i + ".htm"));
                    } else if (mode === 13) {
                        //【-1-* ==> -2-*】  第一頁 ==> 第二頁
                        resArr.push(html(siteUrl.replace(/-\d+-[^-]+$/, "") + "-" + i));
                    } else if (mode === 14) {
                        //【/1/ ==> /2/】  第一頁 ==> 第二頁
                        resArr.push(html(siteUrl.replace(/\/\d+\/$/, "") + "/" + i + "/"));
                    } else if (mode === 15) {
                        //【/index.html ==> /index_2.html】  第一頁 ==> 第二頁
                        resArr.push(html(siteUrl.replace(/\/(index(_\d+)?\.html)?$/, "") + "/index_" + i + ".html"));
                    } else if (mode === 16) {
                        //【 ==> /2#list】  第一頁 ==> 第二頁
                        resArr.push(html(siteUrl.replace(/\/(index(_\d+)?\.html)?$/, "") + "/" + i + "#list"));
                    } else if (mode === 17) {
                        //【.htm ==> _2.htm】  第一頁 ==> 第二頁
                        resArr.push(html(siteUrl.replace(/(_\d+)?\.htm$/, "") + "_" + i + ".htm"));
                    } else if (mode === 18) {
                        //【/ ==> /page/2/】  第一頁 ==> 第二頁
                        resArr.push(html(siteUrl.replace(/\/(page\/\d+\/)?$/, "") + "/page/" + i + "/"));
                    } else if (mode === 19) {
                        //【-1 ==> -2】  第一頁 ==> 第二頁
                        resArr.push(html(siteUrl.replace(/-\d+$/, "") + "-" + i));
                    } else if (mode === 20) {
                        //【 ==> -p-2】  第一頁 ==> 第二頁
                        resArr.push(html(siteUrl.replace(/-p-\d+$/, "") + "-p-" + i));
                    }
                }
            }
            await Promise.all(resArr).then(htmls => {
                fetching = false;
                fun.hide();
                for (let i = 0; i < htmls.length; i++) {
                    let doc = fun.doc(htmls[i]);
                    let imgs = [...fun.gae(img, doc)];
                    debug(`\nfun.getImg() DOM${i}`, doc);
                    for (let p = 0; p < imgs.length; p++) {
                        let check = fun.checkImgSrc(imgs[p], rText);
                        if (check.ok) {
                            imgsArray.push(decodeURI(check.src));
                            continue;
                        } else {
                            debug(`\nfun.getImg() imgs[${p}]錯誤`, imgs[p]);
                            continue;
                        }
                    }
                }
            });
            debug("\nfun.getImg() 聚集的所有IMG", imgsArray);
            return imgsArray;
        },
        getImgO: async (img, maxPage = 1, mode = 1, rText = [null, null], time = 200, replaceElement = null, msg = 1) => {
            if (fun.ge(".FullPictureLoadImage")) return [...fun.gae(".FullPictureLoadImage")];
            fetching = true;
            if (msg == 1) fun.show(displayLanguage.str_01, 0);
            let imgsArray = [];
            let fetchNum = 0;
            const html = async (url, id = 1) => {
                await fun.delay(time, 0);
                return fetch(url).then(async res => {
                    debug(`\nfun.getImgO() URL`, url);
                    if (res.status === 403) {
                        fun.show(displayLanguage.str_54, 3000);
                    }
                    return res.arrayBuffer();
                }).then(buffer => {
                    const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
                    const htmlText = decoder.decode(buffer);
                    let doc = fun.doc(htmlText);
                    [...fun.gae(img, doc)].forEach(ele => {
                        let check = fun.checkImgSrc(ele);
                        if (ele.tagName == "IMG" && check.ok) {
                            ele.src = check.src;
                        }
                        if (id == 1) {
                            let targetEle = [...fun.gae(img)].pop();
                            targetEle.parentNode.insertBefore(ele.cloneNode(true), targetEle.nextSibling);
                        }
                    });
                    if (typeof replaceElement == "string") {
                        fun.gae(".invisible", doc).forEach(ele => {
                            ele.classList.remove("invisible");
                        });
                        let currentPageEles = [...fun.gae(replaceElement)];
                        let nextPageEles = [...fun.gae(replaceElement, doc)];
                        if (currentPageEles.length === nextPageEles.length) {
                            for (let i in currentPageEles) {
                                currentPageEles[i].outerHTML = nextPageEles[i].outerHTML;
                            }
                        }
                    }
                    if (msg == 1) fun.show(`${displayLanguage.str_02}${fetchNum+=1}/${maxPage}`, 0);
                    return htmlText;
                }).catch(error => {
                    debug(`\nfun.getImgO() > fetch()出錯:\n${decodeURI(url)}`, error);
                });
            };
            const resArr = [];
            resArr.push(html(siteUrl, 0));
            if (maxPage > 1) {
                for (let i = 2; i <= maxPage; i++) {
                    if (mode === 1) {
                        //【.html ==> .html?page=2】第一頁 ==> 第二頁
                        //【 ==> ?page=2】第一頁 ==> 第二頁
                        resArr.push(await html(siteUrl.replace(/\?page=\d+$/, "") + "?page=" + i));
                    } else if (mode === 2) {
                        //【.html ==> /2.html】 第一頁 ==> 第二頁
                        resArr.push(await html(siteUrl.slice(0, -5) + "/" + i + ".html"));
                    } else if (mode === 3) {
                        //【.html ==> _1.html】  第一頁 ==> 第二頁
                        resArr.push(await html(siteUrl.replace(/(_\d+)?\.html$/, "") + "_" + (i - 1) + ".html"));
                    } else if (mode === 4) {
                        //【/ ==> /2/】  第一頁 ==> 第二頁
                        resArr.push(await html(siteUrl.slice(0, -1) + "/" + i + "/"));
                    } else if (mode === "4") {
                        //【 ==> /2】  第一頁 ==> 第二頁
                        resArr.push(await html(siteUrl + "/" + i));
                    } else if (mode === 5) {
                        //【.html ==> -2.html】  第一頁 ==> 第二頁
                        resArr.push(await html(siteUrl.replace(/\.html$/, "") + "-" + i + ".html"));
                    } else if (mode === "5") {
                        //【-1.html ==> -2.html】  第一頁 ==> 第二頁
                        resArr.push(await html(siteUrl.replace(/(-\d+)?\.html$/, "") + "-" + i + ".html"));
                    } else if (mode === 6) {
                        //【?p=1 ==> ?p=2】  第一頁 ==> 第二頁
                        resArr.push(await html(siteUrl.replace(/\?p=\d+$/, "") + "?p=" + i));
                    } else if (mode === 7) {
                        //【/1 ==> /2】  第一頁 ==> 第二頁
                        //【.html ==> .html/2】  第一頁 ==> 第二頁
                        resArr.push(await html(siteUrl.replace(/\/\d+$/, "") + "/" + i));
                    } else if (mode === 8) {
                        //【 ==> &page=1】  第一頁 ==> 第二頁
                        resArr.push(await html(siteUrl.replace(/&page=\d+$/, "") + "&page=" + (i - 1)));
                    } else if (mode === "8") {
                        //【 ==> &page=2】  第一頁 ==> 第二頁
                        resArr.push(await html(siteUrl.replace(/&page=\d+$/, "") + "&page=" + i));
                    } else if (mode === 9) {
                        //【.html ==> _2.html】  第一頁 ==> 第二頁
                        resArr.push(await html(siteUrl.replace(/(_\d+)?\.html$/, "") + "_" + i + ".html"));
                    } else if (mode === 10) {
                        //【.html ==> .html/2】  第一頁 ==> 第二頁
                        resArr.push(await html(siteUrl.replace(/\.html(\/\d+)?$/, "") + ".html/" + i));
                    } else if (mode === 11) {
                        //【/ ==> /2.html】  第一頁 ==> 第二頁
                        //【/1.html ==> /2.html】  第一頁 ==> 第二頁
                        resArr.push(await html(siteUrl.replace(/\/(\d+\.html)?$/, "") + "/" + i + ".html"));
                    } else if (mode === 12) {
                        //【/ ==> /2.htm】  第一頁 ==> 第二頁
                        //【/1.htm ==> /2.htm】  第一頁 ==> 第二頁
                        resArr.push(await html(siteUrl.replace(/\/(\d+\.htm)?$/, "") + "/" + i + ".htm"));
                    } else if (mode === 13) {
                        //【-1-* ==> -2-*】  第一頁 ==> 第二頁
                        resArr.push(await html(siteUrl.replace(/-\d+-[^-]+$/, "") + "-" + i));
                    } else if (mode === 14) {
                        //【/1/ ==> /2/】  第一頁 ==> 第二頁
                        resArr.push(await html(siteUrl.replace(/\/\d+\/$/, "") + "/" + i + "/"));
                    } else if (mode === 15) {
                        //【/index.html ==> /index_2.html】  第一頁 ==> 第二頁
                        resArr.push(await html(siteUrl.replace(/\/(index(_\d+)?\.html)?$/, "") + "/index_" + i + ".html"));
                    } else if (mode === 16) {
                        //【 ==> /2#list】  第一頁 ==> 第二頁
                        resArr.push(await html(siteUrl.replace(/\/(index(_\d+)?\.html)?$/, "") + "/" + i + "#list"));
                    } else if (mode === 17) {
                        //【.htm ==> _2.htm】  第一頁 ==> 第二頁
                        resArr.push(await html(siteUrl.replace(/(_\d+)?\.htm$/, "") + "_" + i + ".htm"));
                    } else if (mode === 18) {
                        //【/ ==> /page/2/】  第一頁 ==> 第二頁
                        resArr.push(await html(siteUrl.replace(/\/(page\/\d+\/)?$/, "") + "/page/" + i + "/"));
                    } else if (mode === 19) {
                        //【-1 ==> -2】  第一頁 ==> 第二頁
                        resArr.push(await html(siteUrl.replace(/-\d+$/, "") + "-" + i));
                    } else if (mode === 20) {
                        //【 ==> -p-2】  第一頁 ==> 第二頁
                        resArr.push(await html(siteUrl.replace(/-p-\d+$/, "") + "-p-" + i));
                    }
                }
            }
            await Promise.all(resArr).then(htmls => {
                fetching = false;
                fun.hide();
                for (let i = 0; i < htmls.length; i++) {
                    let doc = fun.doc(htmls[i]);
                    let imgs = [...fun.gae(img, doc)];
                    debug(`\nfun.getImgO() DOM${i}`, doc);
                    for (let p = 0; p < imgs.length; p++) {
                        let check = fun.checkImgSrc(imgs[p], rText);
                        if (check.ok) {
                            imgsArray.push(decodeURI(check.src));
                            continue;
                        } else {
                            debug(`\nfun.getImgO() imgs[${p}]錯誤`, imgs[p]);
                            continue;
                        }
                    }
                }
            });
            debug("\nfun.getImgO() 聚集的所有IMG", imgsArray);
            return imgsArray;
        },
        getImgIframe: async (img, maxPage = 1, mode = 1, rText = [null, null], paginationEle = null, time = 500, showMsg = 1) => {
            if (fun.ge(".FullPictureLoadImage")) return [...fun.gae(".FullPictureLoadImage")];
            fetching = true;
            if (showMsg == 1) fun.show(displayLanguage.str_01, 0);
            let imgsArray = [];
            let fetchNum = 0;
            const html = (url, id = 0) => fetch(url).then(res => res.arrayBuffer()).then(buffer => {
                debug(`\nfun.getImgIframe() URL`, url);
                const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
                const htmlText = decoder.decode(buffer);
                return htmlText;
            }).then(async res => {
                await new Promise(async resolve => {
                    const iframe = document.createElement('iframe');
                    iframe.id = "CustomPictureDownload" + id;
                    iframe.style.display = "none";
                    iframe.srcdoc = res;
                    document.body.appendChild(iframe);
                    iframe.onload = async () => {
                        let doc = iframe.contentDocument || iframe.contentWindow.document;
                        if (!doc) {
                            debug("fun.getImgIframe() 不支援此網站")
                            return [];
                        }
                        let targetEle = [...fun.gae(img)].pop();
                        let load = document.createElement("p");
                        load.className = 'FullPictureLoadLoading';
                        load.innerText = "Loading...";
                        targetEle.parentNode.insertBefore(load, targetEle.nextSibling);
                        await fun.delay(time, 0);
                        if (await fun.waitEle(img, 400, doc)) {
                            debug("iframeDoc" + id, doc);
                            [...fun.gae(img, doc)].forEach(ele => {
                                imgsArray.push(ele);
                                if (paginationEle) {
                                    fun.gae(paginationEle).forEach(pag => {
                                        pag.innerHTML = fun.ge(paginationEle, doc).innerHTML;
                                    });
                                }
                                targetEle.parentNode.insertBefore(ele.cloneNode(true), targetEle.nextSibling);
                                load.remove();
                            });
                        } else {
                            load.remove();
                            fun.show(displayLanguage.str_03, 0);
                            return [];
                        }
                        resolve();
                        load.remove();
                        iframe.remove();
                    };
                });
                if (showMsg == 1) fun.show(`${displayLanguage.str_02}${fetchNum+=1}/${maxPage}`, 0);
            }).catch(error => {
                debug(`\nfun.getImg() > fetch()出錯:\n${decodeURI(url)}`, error);
            });
            await fun.waitEle(img);
            [...fun.gae(img)].forEach(ele => {
                imgsArray.push(ele);
            });
            if (maxPage > 1) {
                for (let i = 2; i <= maxPage; i++) {
                    if (mode === 1) {
                        //【.html ==> .html?page=2】第一頁 ==> 第二頁
                        //【 ==> ?page=2】第一頁 ==> 第二頁
                        await html(siteUrl.replace(/\?page=\d+$/, "") + "?page=" + i, i);
                    } else if (mode === 2) {
                        //【.html ==> /2.html】 第一頁 ==> 第二頁
                        await html(siteUrl.slice(0, -5) + "/" + i + ".html", i);
                    } else if (mode === 3) {
                        //【.html ==> _1.html】  第一頁 ==> 第二頁
                        await html(siteUrl.replace(/(_\d+)?\.html$/, "") + "_" + (i - 1) + ".html", i);
                    } else if (mode === 4) {
                        //【/ ==> /2/】  第一頁 ==> 第二頁
                        await html(siteUrl.slice(0, -1) + "/" + i + "/", i);
                    } else if (mode === "4") {
                        //【 ==> /2】  第一頁 ==> 第二頁
                        await html(siteUrl + "/" + i);
                    } else if (mode === 5) {
                        //【.html ==> -2.html】  第一頁 ==> 第二頁
                        await html(siteUrl.replace(/\.html$/, "") + "-" + i + ".html");
                    } else if (mode === "5") {
                        //【-1.html ==> -2.html】  第一頁 ==> 第二頁
                        await html(siteUrl.replace(/(-\d+)?\.html$/, "") + "-" + i + ".html");
                    } else if (mode === 6) {
                        //【?p=1 ==> ?p=2】  第一頁 ==> 第二頁
                        await html(siteUrl.replace(/\?p=\d+$/, "") + "?p=" + i, i);
                    } else if (mode === 7) {
                        //【/1 ==> /2】  第一頁 ==> 第二頁
                        //【.html ==> .html/2】  第一頁 ==> 第二頁
                        await html(siteUrl.replace(/\/\d+$/, "") + "/" + i, i);
                    } else if (mode === 8) {
                        //【 ==> &page=1】  第一頁 ==> 第二頁
                        await html(siteUrl.replace(/&page=\d+$/, "") + "&page=" + (i - 1), i);
                    } else if (mode === "8") {
                        //【 ==> &page=2】  第一頁 ==> 第二頁
                        await html(siteUrl.replace(/&page=\d+$/, "") + "&page=" + i, i);
                    } else if (mode === 9) {
                        //【.html ==> _2.html】  第一頁 ==> 第二頁
                        await html(siteUrl.replace(/(_\d+)?\.html$/, "") + "_" + i + ".html", i);
                    } else if (mode === 10) {
                        //【.html ==> .html/2】  第一頁 ==> 第二頁
                        await html(siteUrl.replace(/\.html(\/\d+)?$/, "") + ".html/" + i, i);
                    } else if (mode === 11) {
                        //【/ ==> /2.html】  第一頁 ==> 第二頁
                        //【/1.html ==> /2.html】  第一頁 ==> 第二頁
                        await html(siteUrl.replace(/\/(\d+\.html)?$/, "") + "/" + i + ".html", i);
                    } else if (mode === 12) {
                        //【/ ==> /2.htm】  第一頁 ==> 第二頁
                        //【/1.htm ==> /2.htm】  第一頁 ==> 第二頁
                        await html(siteUrl.replace(/\/(\d+\.htm)?$/, "") + "/" + i + ".htm", i);
                    } else if (mode === 13) {
                        //【-1-* ==> -2-*】  第一頁 ==> 第二頁
                        await html(siteUrl.replace(/-\d+-[^-]+$/, "") + "-" + i, i);
                    } else if (mode === 14) {
                        //【/1/ ==> /2/】  第一頁 ==> 第二頁
                        await html(siteUrl.replace(/\/\d+\/$/, "") + "/" + i + "/");
                    } else if (mode === 15) {
                        //【/index.html ==> /index_2.html】  第一頁 ==> 第二頁
                        await html(siteUrl.replace(/\/(index(_\d+)?\.html)?$/, "") + "/index_" + i + ".html");
                    } else if (mode === 16) {
                        //【 ==> /2#list】  第一頁 ==> 第二頁
                        await html(siteUrl.replace(/\/(index(_\d+)?\.html)?$/, "") + "/" + i + "#list");
                    } else if (mode === 17) {
                        //【.htm ==> _2.htm】  第一頁 ==> 第二頁
                        await html(siteUrl.replace(/(_\d+)?\.htm$/, "") + "_" + i + ".htm");
                    } else if (mode === 18) {
                        //【/ ==> /page/2/】  第一頁 ==> 第二頁
                        await html(siteUrl.replace(/\/(page\/\d+\/)?$/, "") + "/page/" + i + "/");
                    } else if (mode === 19) {
                        //【-1 ==> -2】  第一頁 ==> 第二頁
                        await html(siteUrl.replace(/-\d+$/, "") + "-" + i);
                    } else if (mode === 20) {
                        //【 ==> -p-2】  第一頁 ==> 第二頁
                        await html(siteUrl.replace(/-p-\d+$/, "") + "-p-" + i);
                    }
                }
            }
            debug("\nfun.getImgiframe() 聚集的所有IMG", imgsArray);
            fetching = false;
            return imgsArray;
        },
        getImgA: async (img, link, mode = 0, rText = [null, null], showMsg = 1) => { //從指定的所有鏈接抓圖片
            if (fun.ge(".FullPictureLoadImage")) return [...fun.gae(".FullPictureLoadImage")];
            fetching = true;
            if (showMsg == 1) fun.show(displayLanguage.str_01, 0);
            let links, linksNum;
            if (typeof link == "function") {
                links = await link();
                linksNum = links.length;
            } else if (typeof link == "object") {
                links = link;
                linksNum = links.length;
            } else if (typeof link == "string") {
                links = [...fun.gae(link)];
                linksNum = parseInt(links.length) + 1;
            } else {
                debug("\nfun.getImgA() link參數錯誤");
                return;
            }
            debug("\nfun.getImgA() links", links);
            let imgsArray = [];
            let fetchNum = 0;
            const html = url => fetch(url).then(res => {
                if (res.status > 400) {
                    debug(`\nfun.getImgA()連線錯誤碼:${res.status}\n`, url);
                }
                return res.arrayBuffer()
            }).then(buffer => {
                if (showMsg == 1) fun.show(`${displayLanguage.str_02}${fetchNum+=1}/${linksNum}`, 0);
                const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
                const htmlText = decoder.decode(buffer);
                return htmlText;
            }).catch(error => {
                debug(`\nfun.getImgA fetch()出錯:\n${decodeURI(url)}`, error);
            });
            const resArr = [];
            if (typeof link != "object") resArr.push(html(siteUrl));
            for (let i = 0; i < links.length; i++) {
                if (mode == 0) {
                    if (links[i].tagName == "A") {
                        resArr.push(html(links[i].href));
                    } else if (/^http/.test(links[i])) {
                        resArr.push(html(links[i]));
                    }
                } else if (mode >= 100) {
                    if (links[i].tagName == "A") {
                        await fun.delay(mode, 0);
                        resArr.push(html(links[i].href));
                    } else if (/^http/.test(links[i])) {
                        await fun.delay(mode, 0);
                        resArr.push(html(links[i]));
                    }
                } else if (mode == 1) {
                    let res;
                    if (links[i].tagName == "A") {
                        res = await html(links[i].href);
                    } else if (/^http/.test(links[i])) {
                        res = await html(links[i]);
                    }
                    resArr.push(res);
                    let doc = fun.doc(res);
                    debug(`\nfun.getImgA()單線程模式 DOM\n${links[i].href}`, doc);
                    let imgs = [...fun.gae(img, doc)];
                    let imgHtml = "";
                    for (let p = 0; p < imgs.length; p++) {
                        let imgSrc;
                        let check = fun.checkImgSrc(imgs[p], rText);
                        if (check.ok) {
                            imgSrc = check.src;
                            /*
                            let blob = await GMGetData(imgSrc);
                            let objectURL = await URL.createObjectURL(blob.blob);
                            imgSrc = objectURL;
                            */
                            debug("\nfun.getImgA() 單線程模式imgSrc", imgSrc);
                        } else {
                            debug("\nfun.getImgA() 單線程模式出錯", imgs[p]);
                            continue;
                        }
                        imgHtml += `<img class="FullPictureLoadImage" src="${imgSrc}">`;
                    }
                    links[i].outerHTML = imgHtml;
                }
            }
            await Promise.all(resArr).then(htmls => {
                fetching = false;
                fun.hide();
                for (let i = 0; i < htmls.length; i++) {
                    let doc = fun.doc(htmls[i]);
                    if (mode != 1) debug(`\nfun.getImgA() DOM${i}`, doc);
                    let imgs = [...fun.gae(img, doc)];
                    for (let p = 0; p < imgs.length; p++) {
                        let check = fun.checkImgSrc(imgs[p], rText);
                        if (check.ok) {
                            imgsArray.push(check.src);
                        } else {
                            debug("\nfun.getImgA() PromiseAll出錯", imgs[p]);
                            continue;
                        }
                    }
                }
            });
            debug("\nfun.getImgA 聚集的所有IMG", imgsArray);
            return imgsArray;
        },
        checkImgSrc: (ele, rText = [null, null]) => {
            let imgSrc;
            let check = fun.checkDataset(ele);
            if (ele.tagName == "IMG" && check.ok || ele.tagName == "DIV" && check.ok || ele.tagName == "A" && check.ok) {
                imgSrc = check.src;
                if (/^\/\//.test(imgSrc)) imgSrc = location.protocol + imgSrc;
                if (/^\/\w+/.test(imgSrc)) imgSrc = location.origin + imgSrc;
                if (!/^(http|blob)/.test(imgSrc) && /^\w+/.test(imgSrc)) imgSrc = location.origin + "/" + imgSrc;
                if (rText[0]) imgSrc = imgSrc.replace(rText[0], rText[1]);
                return {
                    ok: true,
                    src: imgSrc
                };
            } else if (ele.tagName == "IMG" || ele.tagName == "AMP-IMG") {
                if (ele.tagName == "IMG") imgSrc = ele.src;
                if (ele.tagName == "AMP-IMG") imgSrc = ele.getAttribute('src');
                if (/^\/\//.test(imgSrc)) imgSrc = location.protocol + imgSrc;
                if (rText[0]) imgSrc = imgSrc.replace(rText[0], rText[1]);
                return {
                    ok: true,
                    src: imgSrc
                };
            } else if (ele.tagName == "A") {
                imgSrc = ele.href;
                if (rText[0]) imgSrc = imgSrc.replace(rText[0], rText[1]);
                return {
                    ok: true,
                    src: imgSrc
                };
            } else if (/^(http|blob|\/\/)/.test(ele)) {
                imgSrc = ele;
                if (/^\/\//.test(ele)) imgSrc = location.protocol + imgSrc;
                if (rText[0]) imgSrc = imgSrc.replace(rText[0], rText[1]);
                return {
                    ok: true,
                    src: imgSrc
                };
            }
            return {
                ok: false
            };
        },
        checkDataset: ele => {
            if (ele.tagName == "IMG" || ele.tagName == "DIV" || ele.tagName == "A") {
                const setArr = ["data-src", "data-original", "data-url", "data-thumb", "data-echo", "data-ecp", "data-lazyload-src", "data-lazy-src", "data-lazy", "lazysrc", "data-lazyload", "file", "zoomfile", "data-lbwps-srcsmall", "original", "mydatasrc", "ess-data", "data-cfsrc", "data-pin-media"];
                for (let i = 0; i < setArr.length; i++) {
                    let imgSrc = ele.getAttribute(setArr[i]);
                    if (imgSrc) {
                        return {
                            ok: true,
                            src: imgSrc.trim()
                        };
                    }
                }
            }
            return {
                ok: false
            };
        },
        getNP: async (picsEle, nextLinkEle, lastEle = null, replaceElement = null, time = 0, dataset = null, mag = 1) => {
            //翻頁模式聚集所有圖片或是預覽縮圖然後fun.getImgA()
            //用在規則init,fun.getNP(picsEle, nextLinkEle, lastEle, replaceElement, time);
            if (fun.ge(".FullPictureLoadImage")) return;
            fetching = true;
            let nextlink = "";
            if (mag == 1) fun.show(displayLanguage.str_14, 0);
            const getNextPagePics = async url => {
                await fetch(url).then(res => res.arrayBuffer()).then(buffer => {
                    const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
                    const htmlText = decoder.decode(buffer);
                    return htmlText;
                }).then(async htmlText => {
                    let doc = fun.doc(htmlText);
                    if (dataset) {
                        fun.gae(`img[${dataset}],a[${dataset}],div[${dataset}]`, doc).forEach(e => {
                            if (e.tagName == "IMG") {
                                e.src = e.getAttribute(dataset);
                            } else if (e.tagName == "A" || e.tagName == "DIV") {
                                let url = e.getAttribute(dataset);
                                e.style.backgroundImage = `url(${url})`;
                            }
                        });
                    }
                    debug(`\nfun.getNP() > getNextPagePics() DOM\n${decodeURI(url)}`, doc);
                    let eles = fun.gae(picsEle, doc);
                    let nextPage = fun.ge(nextLinkEle, doc);
                    let lastPage = null;
                    if (lastEle) lastPage = fun.ge(lastEle, doc);
                    let fragment = new DocumentFragment();
                    eles.forEach(ele => {
                        fragment.appendChild(ele.cloneNode(true));
                    });
                    let targetEle = [...fun.gae(picsEle)].pop();
                    targetEle.parentNode.insertBefore(fragment, targetEle.nextSibling);
                    if (replaceElement) {
                        let currentPageEles = [...fun.gae(replaceElement)];
                        let nextPageEles = [...fun.gae(replaceElement, doc)];
                        if (currentPageEles.length === nextPageEles.length) {
                            for (let i in currentPageEles) {
                                //debug("paginationEle", ele);
                                try {
                                    currentPageEles[i].outerHTML = nextPageEles[i].outerHTML;
                                } catch (error) {
                                    debug("\nfun.getNP() 替換頁碼調錯誤\n", error);
                                }
                            }
                        }
                    }
                    if (lastPage) {
                        fetching = false;
                        if (mag == 1) fun.show(displayLanguage.str_15);
                        return;
                    }
                    if (nextPage) {
                        await fun.delay(time, 0);
                        if (nextPage.dataset.url) {
                            if (!/^http/.test(nextPage.dataset.url)) return;
                            nextlink = nextPage.dataset.url;
                        } else {
                            try {
                                nextlink = nextPage.href;
                                let nh = nextPage.host;
                                let lh = location.host;
                                if (nh != lh) {
                                    nextlink = nextlink.replace(nh, lh);
                                }
                            } catch (e) {
                                nextlink = nextPage.getAttribute("href");
                            }
                        }
                        if (url == nextlink) {
                            fetching = false;
                            if (mag == 1) fun.show(displayLanguage.str_15);
                            return;
                        }
                        await getNextPagePics(nextlink);
                    } else {
                        fetching = false;
                        if (mag == 1) fun.show(displayLanguage.str_15);
                        return;
                    }
                });
            };
            let next = fun.ge(nextLinkEle);
            if (next) {
                await fun.delay(time, 0);
                if (next.dataset.url) {
                    if (!/^http/.test(next.dataset.url)) return;
                    nextlink = next.dataset.url;
                } else {
                    nextlink = next.href;
                    let nh = next.host;
                    let lh = location.host;
                    if (nh != lh) {
                        nextlink = nextlink.replace(nh, lh);
                    }
                }
                await getNextPagePics(nextlink);
            } else {
                fetching = false;
                if (mag == 1) fun.show(displayLanguage.str_15);
                return;
            }
        },
        autoPager: async () => {
            let url = await fun.getNextLink();
            if (!url) {
                autoPager = false;
                fun.show(displayLanguage.str_58, 3000);
                return;
            }
            fun.addLoading();
            if (siteData.autoPager.mode == 1) {
                doc = await fun.iframeDoc(url, (siteData.autoPager.waitEle || siteData.autoPager.ele));
            } else {
                try {
                    doc = await fun.fetchDoc(url);
                } catch (e) {
                    doc = await fun.xhrDoc(url);
                }
            }
            debug(`\nfun.autoPager()\n${url}\n`, doc);
            if (siteData.autoPager.stop) {
                let check;
                try {
                    check = await siteData.autoPager.stop();
                } catch (error) {
                    debug("\nsiteData.autoPager.stop() 函式錯誤\n", error);
                    check = false;
                }
                if (check) {
                    autoPager = false;
                    fun.removeLoading();
                    fun.show(displayLanguage.str_58, 3000);
                    return;
                }
            }
            if (siteData.autoPager.script) {
                let scripts = [...fun.gae(siteData.autoPager.script, doc)];
                for (let i in scripts) {
                    if (scripts[i].src) {
                        await fun.script(scripts[i].src, 1, 1);
                    } else {
                        let code = scripts[i].innerText;
                        await fun.script(code, 0, 1);
                    }
                }
            }
            if (siteData.autoPager.lazySrc) {
                let eles = [...fun.gae(siteData.autoPager.lazySrc, doc)];
                for (let i in eles) {
                    let check = fun.checkDataset(eles[i]);
                    if (check.ok) {
                        if (eles[i].tagName === "IMG") {
                            eles[i].src = check.src;
                        } else if (eles[i].tagName === "DIV" || eles[i].tagName === "A") {
                            eles[i].style.backgroundImage = `url('${check.src}')`;
                        }
                    }
                }
            }
            if (typeof siteData.autoPager.bF === "function") {
                await siteData.autoPager.bF();
            }
            let newEle, tE;
            if (typeof siteData.autoPager.ele === "function" && siteData.autoPager.pos || typeof siteData.autoPager.ele === "string") {
                if (typeof siteData.autoPager.ele === "function") {
                    newEle = await siteData.autoPager.ele();
                }
                if (typeof siteData.autoPager.ele === "string") {
                    let nextEle = fun.ge(siteData.autoPager.ele, doc);
                    if (!nextEle) {
                        fun.removeLoading();
                        fun.show(displayLanguage.str_59, 3000);
                        return;
                    }
                    tE = [...fun.gae(siteData.autoPager.ele)].pop();
                    newEle = [...fun.gae(siteData.autoPager.ele, doc)];
                }
                let fragment = new DocumentFragment();
                if (siteData.autoPager.showTitle !== 0) {
                    let add = true;
                    let titleText = null;
                    if (typeof siteData.autoPager.title === "function") {
                        try {
                            titleText = await siteData.autoPager.title();
                            if (typeof titleText === "object") {
                                if (titleText.ok) {
                                    titleText = titleText.text;
                                } else {
                                    add = false;
                                }
                            }
                        } catch (error) {
                            debug("\nsiteData.autoPager.title() 函式錯誤\n", error);
                        }
                    }
                    if (add) {
                        fragment.appendChild(await fun.titleUrlEle(url, (titleText || doc.title)));
                    }
                }
                newEle.forEach(e => {
                    fragment.appendChild(e.cloneNode(true));
                });
                newEle = null;
                if (siteData.autoPager.pos) {
                    if (siteData.autoPager.pos[1] === 0) { //元素裡面
                        tE = fun.ga(siteData.autoPager.pos[0], doc);
                        tE.appendChild(fragment);
                    } else if (siteData.autoPager.pos[1] === 1) { //元素之前
                        tE = fun.ga(siteData.autoPager.pos[0], doc);
                        tE.parentNode.insertBefore(fragment, tE);
                    } else if (siteData.autoPager.pos[1] === 2) { //元素之後
                        tE.parentNode.insertBefore(fragment, tE.nextSibling);
                    }
                } else {
                    tE.parentNode.insertBefore(fragment, tE.nextSibling);
                }
            } else if (typeof siteData.autoPager.ele === "function") {
                await siteData.autoPager.ele();
            }
            if (siteData.autoPager.re) {
                let currentPageEles = [...fun.gae(siteData.autoPager.re)];
                let nextPageEles = [...fun.gae(siteData.autoPager.re, doc)];
                if (currentPageEles.length === nextPageEles.length) {
                    for (let i in currentPageEles) {
                        currentPageEles[i].outerHTML = nextPageEles[i].outerHTML;
                    }
                }
            }
            if (typeof siteData.autoPager.aF === "function") {
                await siteData.autoPager.aF();
            }
            fun.removeLoading();
            if (siteData.autoPager.history == 1) {
                fun.addHistory(doc.title, url);
            }
            if (siteData.autoPager.observer) {
                await fun.delay(siteData.autoPager.sleep || 1000, 0);
                let ele = [...fun.gae(siteData.autoPager.observer)].pop();
                fun.nextObserver.observe(ele);
            }
        },
        iframeDoc: async (url, ele) => {
            return await new Promise(async resolve => {
                const iframe = document.createElement("iframe");
                iframe.id = "autoPagerIframe";
                iframe.style.display = "none";
                iframe.src = url;
                document.body.appendChild(iframe);
                iframe.onload = async () => {
                    let doc = iframe.contentDocument || iframe.contentWindow.document;
                    if (!doc) {
                        resolve(fun.doc("none"));
                    }
                    fun.delay(siteData.autoPager.loadTime || 200);
                    if (typeof ele === "string") {
                        await fun.waitEle(ele, 600, doc);
                    }
                    resolve(doc);
                    iframe.remove();
                };
            });
        },
        nextObserver: new IntersectionObserver((entries, observer) => {
            entries.forEach(entry => {
                if (entry.isIntersecting) {
                    observer.unobserve(entry.target);
                    fun.autoPager();
                }
            });
        }),
        getNextLink: async () => {
            if (typeof siteData.autoPager.next === "function") {
                let nextcode = await siteData.autoPager.next();
                if (nextLink === nextcode) {
                    return null;
                }
                nextLink = nextcode;
            } else if (typeof siteData.autoPager.next === "string") {
                let nextEle = fun.ge(siteData.autoPager.next, doc);
                try {
                    if (nextLink === nextEle.href) {
                        return null;
                    }
                } catch (error) {
                    debug("\nfun.getNextLink() ERROR\n", error);
                    return null;
                }
                nextLink = nextEle.href;
                const nh = nextEle.host;
                const lh = location.host;
                if (nh !== lh) {
                    nextLink = nextLink.replace(nh, lh);
                }
            } else {
                return null;
            }
            if (!nextLink) return null;
            if (siteData.autoPager.http) {
                if (siteData.autoPager.http == "https") {
                    nextLink = nextLink.replace("http:", "https:");
                } else if (siteData.autoPager.http == "http") {
                    nextLink = nextLink.replace("https:", "http:");
                }
            }
            return nextLink;
        },
        titleUrlEle: (url, title) => {
            let div = document.createElement("div");
            div.className = "autoPagerTitle";
            let a = document.createElement("a");
            a.href = url
            a.innerText = title;
            div.appendChild(a);
            return div;
        },
        addLoading: () => {
            if (siteData.autoPager.loading === "msg") {
                fun.show(displayLanguage.str_57, 0);
            } else {
                try {
                    let img = new Image();
                    img.className = "autoPagerLoading";
                    img.src = autoPagerLoading;
                    let tE;
                    if (siteData.autoPager.pos) {
                        if (siteData.autoPager.pos[1] === 0) { //元素裡面
                            tE = fun.ga(siteData.autoPager.pos[0], doc);
                            tE.appendChild(img);
                        } else if (siteData.autoPager.pos[1] === 1) { //元素之前
                            tE = fun.ga(siteData.autoPager.pos[0], doc);
                            tE.parentNode.insertBefore(img, tE);
                        } else if (siteData.autoPager.pos[1] === 2) { //元素之後
                            tE.parentNode.insertBefore(img, tE.nextSibling);
                        }
                    } else {
                        tE = [...fun.gae(siteData.autoPager.ele)].pop();
                        tE.parentNode.insertBefore(img, tE.nextSibling);
                    }
                } catch (e) {
                    fun.show(displayLanguage.str_57, 0);
                }
            }
        },
        removeLoading: () => {
            if (siteData.autoPager.loading === "msg") {
                fun.hide();
            } else {
                try {
                    fun.ge(".autoPagerLoading").remove();
                } catch (e) {
                    fun.hide();
                }
            }
        },
        addHistory: (title, url) => {
            history.pushState(null, title, url);
            document.title = title;
        },
        getEle: async (links, elements, targetEle, removeEles = null) => {
            if (fun.ge(".FullPictureLoadImage")) return;
            fetching = true;
            let resArr = [];
            let xhrNum = 0;
            fun.show(displayLanguage.str_16, 0);
            for (let i in links) {
                let res = fun.xhrDoc(links[i]).then(doc => {
                    debug(`\nfun.getEle() URL`, links[i]);
                    fun.show(`${displayLanguage.str_17}${xhrNum+=1}/${links.length}`, 0);
                    debug(`fun.getEle()\n${decodeURI(links[i])}\n`, doc);
                    return [...fun.gae(elements, doc)];
                });
                resArr.push(res);
            }
            await Promise.all(resArr).then(arr => arr.flat()).then(eles => {
                fetching = false;
                fun.hide();
                let ele;
                let fragment = new DocumentFragment();
                eles.forEach(e => {
                    fragment.appendChild(e.cloneNode(true));
                });
                if (typeof targetEle == "object") {
                    ele = fun.ge(targetEle[0]);
                    if (targetEle[1] == 0) ele.appendChild(fragment);
                    else if (targetEle[1] == 1) ele.parentNode.insertBefore(fragment, ele);
                    else if (targetEle[1] == 2) ele.parentNode.insertBefore(fragment, ele.nextSibling);
                } else if (typeof targetEle == "string") {
                    ele = fun.ge(targetEle);
                    ele.innerHTML = "";
                    ele.appendChild(fragment);
                }
                if (removeEles) {
                    fun.remove(removeEles);
                }
            })
        },
        insertImg: (imgsArray, ele, mode = 1) => {
            let srcArr = [];
            for (let i = 0; i < imgsArray.length; i++) {
                let check = fun.checkImgSrc(imgsArray[i]);
                if (check.ok) {
                    srcArr.push(check.src);
                } else {
                    debug("\nfun.insertImg(imgsArray) 格式錯誤!", imgsArray[i]);
                    continue;
                }
            }
            srcArr = [...new Set(srcArr)];
            let fragment = new DocumentFragment();
            if (siteData.button) {
                if (typeof siteData.button[2] === "number") {
                    for (let i = 0; i < siteData.button[2]; i++) {
                        let br = document.createElement("br");
                        fragment.appendChild(br);
                    }
                }
                let width = "24%";
                if (typeof siteData.button[1] === "string") {
                    width = siteData.button[1];
                }
                let btn0 = document.createElement("button");
                btn0.id = "FullPictureLoadOptionsBtn";
                btn0.style.width = width;
                btn0.style.height = "24px";
                btn0.innerText = "腳本選項(*)";
                $(btn0).on("click", (event) => {
                    event.preventDefault();
                    $("#FullPictureLoadOptions").removeAttr("style");
                });
                fragment.appendChild(btn0);
                let btn1 = document.createElement("button");
                btn1.id = "FullPictureLoadToggleImgModeBtn";
                btn1.style.width = width;
                btn1.style.height = "24px";
                btn1.innerText = "切換模式(5)";
                $(btn1).on("click", (event) => {
                    event.preventDefault();
                    toggleImgMode();
                });
                fragment.appendChild(btn1);
                let btn2 = document.createElement("button");
                btn2.id = "FullPictureLoadToggleZoomeBtn";
                btn2.style.width = width;
                btn2.style.height = "24px";
                btn2.innerText = "比例縮放(-)";
                $(btn2).on("click", (event) => {
                    event.preventDefault();
                    toggleZoom();
                });
                fragment.appendChild(btn2);
                let btn3 = document.createElement("button");
                btn3.id = "FullPictureLoadCancelZoomBtn";
                btn3.style.width = width;
                btn3.style.height = "24px";
                btn3.innerText = "取消縮放(+)";
                $(btn3).on("click", (event) => {
                    event.preventDefault();
                    cancelZoom();
                });
                fragment.appendChild(btn3);
            }
            let numP = srcArr.length;
            for (let i = 0; i < srcArr.length; i++) {
                if (/\.mp4$|\.webm$/.test(srcArr[i])) {
                    numP--;
                    continue;
                }
                let a = document.createElement("a");
                //a.className = "fancybox-pic";
                //a.rel = "group";
                a.dataset.fancybox = "gallery";
                a.dataset.thumb = srcArr[i];
                a.href = srcArr[i];
                let img = new Image();
                img.alt = `no.${parseInt(i) + 1}`;
                img.className = "FullPictureLoadImage";
                if (siteData.referrerpolicy) {
                    img.setAttribute("referrerpolicy", siteData.referrerpolicy);
                }
                if (options.zoom <= 10 && options.zoom > 0) {
                    img.style.width = `${options.zoom * 10}%`;
                    img.style.height = "auto";
                }
                if (mode == 2 || mode == 3) {
                    img.src = loading_bak;
                    img.dataset.src = srcArr[i];
                    fun.imagesObserver.observe(img);
                } else {
                    img.src = srcArr[i];
                    img.onerror = error => {
                        if (errorNum > 50) return;
                        errorNum += 1;
                        setTimeout(() => {
                            debug(`\nfun.insertImg()重新載入出錯的圖片:\n${error.target.src}`);
                            error.target.src = error.target.src;
                        }, 1000);
                    };
                }
                a.appendChild(img);
                fragment.appendChild(a);
                if (i == srcArr.length - 1) {
                    let end = document.createElement("p");
                    end.id = "FullPictureLoadEnd";
                    end.innerText = `${displayLanguage.str_52}:${numP}P`;
                    fragment.appendChild(end);
                }
            }
            const picPreload = async _srcArr => {
                const loadImg = async (src, index) => {
                    await new Promise(resolve => {
                        let temp = new Image();
                        temp.src = src;
                        temp.onload = () => {
                            resolve();
                            temp = null;
                        };
                        temp.onerror = error => {
                            if (errorNum > 50) return;
                            errorNum += 1;
                            resolve();
                            setTimeout(() => {
                                debug(`\n圖片全載Lazyloading預讀重新載入出錯的圖片:\n${src}\n`, loadImg(src.replace("-scaled", ""), index));
                            }, 1000);
                            temp = null;
                        };
                    });
                };
                debug("\n圖片全載Lazyloading開始預讀");
                for (let src = 0; src < _srcArr.length; src++) {
                    if (/\.mp4$|\.webm$/.test(_srcArr[src])) {
                        numP--;
                        continue;
                    }
                    await loadImg(_srcArr[src], src);
                    if (src == _srcArr.length - 1) debug("\n圖片全載Lazyloading預讀結束");
                }
            };
            if (srcArr.length > 0) {
                if (siteData.insertImg[1] == 2 || siteData.insertImg[1] == 3) {
                    picPreload(srcArr);
                }
                let thisEle;
                if (typeof ele == "object") {
                    thisEle = fun.ge(ele[0]);
                    if (ele[1] == 0) {
                        thisEle.appendChild(fragment);
                        thisEle.style.textAlign = "center";
                        thisEle.style.display = "block";
                    } else if (ele[1] == 1) {
                        thisEle.parentNode.insertBefore(fragment, thisEle);
                        thisEle.parentNode.style.textAlign = "center";
                        thisEle.parentNode.style.display = "block";
                    } else if (ele[1] == 2) {
                        thisEle.parentNode.insertBefore(fragment, thisEle.nextSibling);
                        thisEle.parentNode.style.textAlign = "center";
                        thisEle.parentNode.style.display = "block";
                    }
                    if (typeof ele[2] != "undefined") {
                        fun.remove(ele[2]);
                    }
                    if (siteData.msg != 0 && siteData.category != "comic") fun.show(displayLanguage.str_18);
                    if (siteData.go == 1) goToNo1Img();
                } else if (typeof ele == "string") {
                    thisEle = fun.ge(ele);
                    thisEle.innerHTML = "";
                    thisEle.appendChild(fragment);
                    thisEle.style.textAlign = "center";
                    thisEle.style.display = "block";
                    if (siteData.msg != 0 && siteData.category != "comic") fun.show(displayLanguage.str_18);
                    if (siteData.go == 1) goToNo1Img();
                } else {
                    fun.show(displayLanguage.str_19, 3000);
                    debug("\nfun.insertImg() ele參數錯誤,或用來定位插入的元素不存在。");
                    return;
                }
                let imgs = [...fun.gae(".FullPictureLoadImage:not(.small)")];
                let imgsNum = 0;
                document.addEventListener("keydown", event => {
                    if (fun.ge("#FullPictureLoadOptions:not([style])")) {
                        return;
                    }
                    if (event.key == "ArrowUp") {
                        if (imgsNum > 0 && viewMode == 0) {
                            imgsNum -= 1;
                            imgs[imgsNum].scrollIntoView();
                        }
                    } else if (event.key == "ArrowDown") {
                        event.preventDefault();
                        if (imgsNum < imgs.length && viewMode == 0) {
                            imgsNum += 1;
                            try {
                                imgs[imgsNum].scrollIntoView();
                            } catch (e) {
                                imgsNum = 0;
                                imgs[0].scrollIntoView();
                                fun.show("返回開頭了");
                            }
                        }
                    } else {
                        imgsNum = 0 - 1;
                    }
                });
                //$( ".fancybox-pic" ).fancybox();
            } else {
                fun.show(displayLanguage.str_20);
            }
        },
        immediateInsertImg: async () => {
            let selector = siteData.imgs;
            //debug("\nfun.immediateInsertImg() selector\n", selector);
            await fun.delay(siteData.insertImg[2] || 200);
            fetching = true;
            let imgs;
            let imgSrcArray = [];
            if (fun.ge(".FullPictureLoadImage")) {
                imgs = [...fun.gae(".FullPictureLoadImage")];
            }
            if (typeof selector == "function") {
                imgs = await selector();
            } else if (/^js;/.test(selector)) {
                imgs = await new Function("siteData", "fun", '"use strict";' + selector.slice(3))(siteData, fun);
                debug("\nfun.immediateInsertImg() JSimgs:", imgs);
            } else {
                imgs = [...fun.gae(selector)];
                debug("\nfun.immediateInsertImg() selectorImgs:", imgs);
            }
            fetching = false;
            imgs = imgs.filter(item => item);
            if (imgs.length > 0) {
                for (let i = 0; i < imgs.length; i++) {
                    let check = fun.checkImgSrc(imgs[i]);
                    if (check.ok) {
                        imgSrcArray.push(check.src);
                    } else {
                        debug("\nfun.immediateInsertImg() imgsArray 格式錯誤!", imgs[i]);
                        continue;
                    }
                }
            } else {
                fun.show(displayLanguage.str_20, 3000);
                debug("\nfun.immediateInsertImg() 沒有圖片元素");
                return;
            }
            imgSrcArray = [...new Set(imgSrcArray)];
            globalImgArray = imgSrcArray;
            fun.insertImg(globalImgArray, siteData.insertImg[0], siteData.insertImg[1]);
            imgSrcArray = null;
        },
        ge: (e, d) => {
            if (/^\//.test(e)) {
                return (d || document).evaluate(e, (d || document), null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
            } else {
                return (d || document).querySelector(e);
            }
        },
        gae: (e, d) => {
            if (/^\//.test(e)) {
                let nodes = [];
                let results = (d || document).evaluate(e, (d || document), null, XPathResult.ANY_TYPE, null);
                let node;
                while (node = results.iterateNext()) {
                    nodes.push(node);
                }
                return nodes;
            } else {
                return (d || document).querySelectorAll(e);
            }
        },
        geT: (ele, mode = 1) => {
            try {
                if (mode == 1) {
                    return fun.ge(ele).innerText;
                } else if (mode == 2) {
                    return fun.ge(ele).previousElementSibling.innerText;
                } else if (mode == 3) {
                    return fun.ge(ele).previousElementSibling.previousElementSibling.innerText;
                }
            } catch (e) {
                debug("\nfun.geT() ERROR\n", e);
                return null;
            }
        },
        attr: (ele, attr) => fun.ge(ele).getAttribute(attr),
        run: code => new Function("return " + code)(),
        doc: str => new DOMParser().parseFromString(str, 'text/html'),
        xml: str => new DOMParser().parseFromString(str, 'text/xml'),
        title: (str, mode = 0) => {
            let split = document.title.replace(/漫画|\s-\s(漫本|奇漫屋|漫画星球|6漫画)|\[\d+p(\d+v)?\]/gi, "").split(str);
            if (mode == 0) {
                try {
                    return document.title.replace(str, "").trim();
                } catch (error) {
                    debug("\nfun.title() ERROR", error);
                    return document.title;
                }
            } else if (mode == 1) {
                try {
                    return split[0].replace(/,$/g, "").replace(/,/g, " ").trim();
                } catch (error) {
                    debug("\nfun.title() ERROR", error);
                    return document.title;
                }
            } else if (mode == 2) {
                try {
                    return (split[0] + str + split[1]).replace(/,$/g, "").replace(/,/g, " ").trim();
                } catch (error) {
                    debug("\nfun.title() ERROR", error);
                    return document.title;
                }
            } else if (mode == 3) {
                try {
                    return (split[1] + str + split[0]).replace(/,$/g, "").replace(/,/g, " ").trim();
                } catch (error) {
                    debug("\nfun.title ERROR", error);
                    return document.title;
                }
            }
        },
        show: (text, time = 1000) => {
            let msg = fun.ge(".FullPictureLoadMsg");
            if (fun.ge(".FullPictureLoadMsg[style]")) {
                msg.removeAttribute('style');
            }
            msg.innerText = text;
            if (time > 0) {
                setTimeout(() => {
                    fun.hide();
                }, time);
            }
        },
        hide: () => {
            if (!fun.ge(".FullPictureLoadMsg[style]")) {
                let msg = fun.ge(".FullPictureLoadMsg");
                msg.innerText = "none";
                msg.style = "display:none";
            }
        },
        imagesObserver: new IntersectionObserver((entries, observer) => {
            entries.forEach(entry => {
                if (entry.isIntersecting) {
                    observer.unobserve(entry.target);
                    let realSrc = entry.target.dataset.src,
                        nE = entry.target.nextElementSibling;
                    if (realSrc) {
                        entry.target.src = realSrc;
                        entry.target.onload = () => {
                            entry.target.classList.remove("error");
                        };
                        entry.target.onerror = (error) => {
                            if (errorNum > 50) return;
                            errorNum += 1;
                            error.target.dataset.src = error.target.dataset.src.replace("-scaled", "");
                            error.target.src = loading_bak;
                            error.target.classList.add("error");
                            setTimeout(() => {
                                debug(`\nimagesObserver重新載入出錯圖片:\n${realSrc}`);
                                error.target.src = realSrc.replace("-scaled", "");
                            }, 1000);
                        };
                    }
                    if (nE && nE.tagName == 'IMG' && nE.dataset.src) {
                        nE.src = nE.dataset.src;
                    }
                }
            });
        }),
        addFullPictureLoadMsg: () => {
            let div = document.createElement("div");
            div.className = "FullPictureLoadMsg";
            div.style = "display:none";
            div.innerText = "none";
            document.body.appendChild(div);
        },
        css: css => {
            let style = document.createElement("style");
            style.type = "text/css";
            style.className = "FullPictureLoadStyle";
            style.innerHTML = css;
            document.head.appendChild(style);
        },
        script: async (code, src = 0, pos = 0) => {
            let script = document.createElement("script");
            script.className = "FullPictureLoadScript";
            if (src == 0) {
                script.type = "text/javascript";
                script.innerHTML = code;
            }
            if (src == 0 && pos == 0) {
                return script;
            } else if (pos == 1) {
                if (src == 1) {
                    await new Promise(resolve => {
                        script.src = code;
                        document.body.appendChild(script);
                        script.onload = () => {
                            resolve();
                        }
                    });
                } else {
                    document.body.appendChild(script);
                }
            }
        },
        delay: async (time, msg = 1) => {
            if (time > 200 && msg == 1) fun.show(`${displayLanguage.str_21}${time}${displayLanguage.str_22}...`, time);
            await new Promise(resolve => {
                setTimeout(resolve, time);
            });
        },
        waitEle: async (ele, max = 200, doc = document) => {
            let loopNum = 0;
            return await new Promise(resolve => {
                let loop = setInterval(() => {
                    loopNum += 1;
                    if (!!fun.ge(ele, doc) === true) {
                        clearInterval(loop);
                        resolve(true);
                    }
                    if (loopNum >= max) {
                        clearInterval(loop);
                        debug(`fun.waitEle()達循環上限,沒有出現"${ele}"元素。`);
                        resolve(false);
                    }
                }, 100);
            });
        },
        checkImgStatus: (src, msg = null) => {
            fun.show(msg || displayLanguage.str_56, 0);
            return new Promise(resolve => {
                let temp = new Image();
                temp.src = src;
                temp.onload = () => {
                    fun.hide();
                    resolve({
                        ok: true,
                        src: src,
                        width: temp.width,
                        height: temp.height
                    });
                }
                temp.onerror = () => {
                    fun.hide();
                    resolve({
                        ok: false,
                        src: src
                    });
                }
            });
        },
        checkDownloadThread: () => {
            return new Promise(resolve => {
                let loop = setInterval(() => {
                    if (currentDownloadThread <= options.threading) {
                        clearInterval(loop);
                        resolve();
                    }
                }, 50);
            });
        },
        xhr: (url, type = "text", referer = location.href, ua = navigator.userAgent) => {
            return new Promise((resolve, reject) => {
                _GM_xmlhttpRequest({
                    method: "GET",
                    url: url,
                    responseType: type,
                    headers: {
                        "Referer": referer,
                        "User-Agent": ua
                    },
                    onload: data => {
                        if (data.status > 400) {
                            debug(`\nfun.xhr()連線錯誤碼:${data.status}\n`, url);
                        }
                        resolve(data.response);
                    },
                    onerror: error => {
                        reject(error);
                    }
                });
            });
        },
        xhrDoc: (url, referer = location.href, ua = navigator.userAgent) => {
            return new Promise((resolve, reject) => {
                _GM_xmlhttpRequest({
                    method: "GET",
                    url: url,
                    responseType: "arraybuffer",
                    headers: {
                        "Referer": referer,
                        "User-Agent": ua
                    },
                    onload: data => {
                        if (data.status > 400) {
                            debug(`\nfun.xhrDoc()連線錯誤碼:${data.status}\n`, url);
                        }
                        let decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
                        let htmlText = decoder.decode(data.response);
                        let doc = fun.doc(htmlText);
                        resolve(doc);
                    },
                    onerror: error => {
                        reject(error);
                    }
                });
            });
        },
        fetchDoc: url => {
            return fetch(url).then(res => {
                if (res.status > 400) {
                    debug(`\nfun.fetchDoc()連線錯誤碼:${res.status}\n`, url);
                }
                return res.arrayBuffer();
            }).then(buffer => {
                const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
                const htmlText = decoder.decode(buffer);
                return fun.doc(htmlText);
            });
        },
        getKukudmSrc: async () => {
            let timeId = setTimeout(() => {
                location.reload();
            }, 10000);
            fun.show(displayLanguage.str_05, 0);
            let max;
            try {
                max = fun.geT("//td[input]").match(/共(\d+)/)[1];
            } catch (e) {
                max = fun.geT(".bottom .subNav").match(/\/(\d+)/)[1];
            }
            let links = [];
            let url = location.href.replace(/1\.htm$/, "");
            for (let i = 1; i <= max; i++) {
                links.push(url + i + ".htm");
            }
            let resArr = [];
            let fetchNum = 0;
            for (let i in links) {
                let res = fun.fetchDoc(links[i]).then(doc => {
                    fun.show(`${displayLanguage.str_06}${fetchNum+=1}/${links.length}`, 0);
                    let script = [...doc.scripts].find(s => s.innerText.search(/document\.write/) > -1).innerText;
                    let arr = script.split("'><");
                    let pathArr1, pathArr2;
                    if (arr.length == 4) {
                        pathArr1 = arr[0].split("/");
                        pathArr2 = arr[2].split("/");
                    } else if (arr.length == 5) {
                        pathArr1 = arr[1].split("/");
                        pathArr2 = arr[3].split("/");
                    } else {
                        return null;
                    }
                    let host1 = fun.run(pathArr1[0].split("+")[1]);
                    let host2 = fun.run(pathArr2[0].split("+")[1]);
                    pathArr1[0] = pathArr1[0].match(/\w+$/)[0];
                    pathArr2[0] = pathArr2[0].match(/\w+$/)[0];
                    let src1 = host1 + pathArr1.join("/");
                    let src2 = host2 + pathArr2.join("/");
                    return {
                        src1: src1,
                        src2: src2
                    };
                });
                resArr.push(res);
            }
            let allSrc = await Promise.all(resArr).then(arr => {
                clearTimeout(timeId);
                fun.hide();
                return arr;
            });
            debug("\nfun.getKukudmSrc() > allSrc\n", allSrc);
            try {
                let obj = await fun.checkImgStatus(allSrc[0].src1);
                if (obj.ok) {
                    return allSrc.map(e => e.src1);
                } else {
                    return allSrc.map(e => e.src2);
                }
            } catch (e) {
                return [];
            }
        },
        remove: (ele, time = 0) => {
            setTimeout(() => {
                [...fun.gae(ele)].forEach(e => {
                    e.remove()
                });
            }, time);
        },
        addUrlHtml: (url, ele, pos, text = "點選進入下一話") => {
            let _pos;
            switch (pos) {
                case 0:
                    _pos = "beforebegin"; //在元素之前。
                    break;
                case 1:
                    _pos = "afterend"; //在元素之後。
                    break;
                case 2:
                    _pos = "beforeend"; //在元素裡面,最後一個子元素之後。
                    break;
                case 3:
                    _pos = "afterbegin"; //在元素裡面,第一個子元素之前。
                    break;
            }
            let html = `<div style="padding: 20px 0; text-align: center;"><a href="${url}"style="font-size: 26px;line-height: 50px;height: 50px;text-align: center;">${text}</a></div>`;
            fun.ge(ele).insertAdjacentHTML(_pos, html);
        },
        dataURLtoBlobURL: dataurl => {
            let arr = dataurl.split(","),
                mime = arr[0].match(/:(.*?);/)[1],
                bstr = atob(arr[1]),
                n = bstr.length,
                u8arr = new Uint8Array(n);
            while (n--) {
                u8arr[n] = bstr.charCodeAt(n);
            }
            return URL.createObjectURL(new Blob([u8arr], {
                type: mime
            }));
        },
        imgSrcToDataURL: (src, type = "image/jpeg") => {
            //沒啥屁用...
            return new Promise((resolve, reject) => {
                let canvas = document.createElement("canvas");
                let ctx = canvas.getContext("2d");
                let img = new Image();
                img.src = src;
                img.setAttribute("crossOrigin", "anonymous");
                img.onload = () => {
                    canvas.height = img.height;
                    canvas.width = img.width;
                    ctx.drawImage(img, 0, 0);
                    let dataURL = canvas.toDataURL(type); //到這裡會錯誤
                    resolve(dataURL);
                };
                img.onerror = error => {
                    reject(error);
                }
            });
        },
        imgToBlobURL: (img, mode = 1, type = "image/jpeg") => {
            let canvas = document.createElement("canvas");
            if (mode == 1) {
                canvas.width = img.naturalWidth;
                canvas.height = img.naturalHeight;
            } else if (mode == 2) {
                canvas.width = img.width;
                canvas.height = img.height;
            } else {
                return img;
            }
            canvas.getContext("2d").drawImage(img, 0, 0);
            let dataUrl = canvas.toDataURL(type);
            return fun.dataURLtoBlobURL(dataUrl);
        },
        imgBlobArr: async (ele, mode = 1, type = "image/jpeg") => {
            let imgs;
            fun.show(displayLanguage.str_53, 0);
            await fun.delay(200, 0);
            imgs = [...fun.gae(ele)].map(e => fun.imgToBlobURL(e, mode, type));
            fun.hide();
            return imgs;
        },
        blobToDataURL: blob => {
            return new Promise(resolve => {
                const reader = new FileReader();
                reader.onload = () => {
                    resolve(reader.result);
                }
                reader.readAsDataURL(blob);
            });
        },
        scrollEles: async (ele, ms = 100) => {
            let eles = [...fun.gae(ele)];
            for (let i in eles) {
                eles[i].scrollIntoView({
                    behavior: "smooth",
                    block: "end"
                });
                await fun.delay(ms, 0);
            }
            /*
            window.scrollTo({
                top: 0
            });
            */
        },
        CivitAiAutoShowNSFW: () => {
            const unBlur = async () => {
                if (/\/posts\/|\/models\//.test(siteUrl)) {
                    let ele = [...fun.gae(".mantine-1pj0akd,.mantine-1a9x8zw,.mantine-qwgpbp,.mantine-1m05dul,.mantine-1gtzxoj,.mantine-7cmpjr,.mantine-hdmzgx,.mantine-10dlb,.mantine-17xqhym,.mantine-1ll12xr,.mantine-1ge3iyn,.mantine-1jb75iu,.mantine-5ix9q9,.mantine-1p64zh1,.mantine-k1f4y4,.mantine-kg33jb")][0];
                    let elePath = fun.ge("span+svg>path", ele);
                    if (elePath) {
                        let d = elePath.getAttribute("d");
                        if (d == "M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0") {
                            ele.click();
                            //elementClick(ele);
                        }
                        await fun.delay(200);
                    }
                }
                [...fun.gae(".mantine-1pj0akd,.mantine-1a9x8zw,.mantine-qwgpbp,.mantine-1m05dul,.mantine-1gtzxoj,.mantine-7cmpjr,.mantine-hdmzgx,.mantine-10dlb,.mantine-17xqhym,.mantine-1ll12xr,.mantine-1ge3iyn,.mantine-1jb75iu,.mantine-5ix9q9,.mantine-1p64zh1,.mantine-k1f4y4,.mantine-kg33jb")].forEach(ele => {
                    let elePath = fun.ge("span+svg>path", ele);
                    if (elePath) {
                        let d = elePath.getAttribute("d");
                        if (d == "M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0") {
                            ele.click();
                            //elementClick(ele);
                        }
                    }
                });
            };
            new MutationObserver(unBlur).observe(document.body, {
                childList: true,
                subtree: true,
                attributes: true
            });
            unBlur();
        }
    };

    const debug = (str, obj = "", title = "debug") => {
        console.log(
            `%c[Custom Picture Download] ${title}:`,
            "background-color: #C9FFC9;",
            str, obj
        );
    };

    const ge = css => document.querySelector(css);
    const gae = css => document.querySelectorAll(css);
    const gx = xpath => document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
    const gax = xpath => {
        let nodes = [];
        let results = document.evaluate(xpath, document, null, XPathResult.ANY_TYPE, null);
        let node;
        while (node = results.iterateNext()) {
            nodes.push(node);
        }
        return nodes;
    };

    const getNum = i => {
        let n = parseInt(i) + 1;
        let picNum = String(n).padStart(4, "0");
        return picNum;
    };

    const showMsg = (text, time = 1000) => {
        ge(".FullPictureLoadMsg").removeAttribute("style");
        ge(".FullPictureLoadMsg").innerText = text;
        setTimeout(() => {
            ge(".FullPictureLoadMsg").innerText = "none";
            ge(".FullPictureLoadMsg").style = "display:none";
        }, time);
    };

    const getDataMsg = (text, picNum, imgsNum) => {
        if (picNum != "none") {
            fun.show(`${displayLanguage.str_23}${downloadNum += 1}/${imgsNum}${displayLanguage.str_24}${text}`, 0);
        }
    };

    const getReferer = srcUrl => {
        let referer;
        if (siteData.referer == "src") {
            referer = srcUrl;
        } else if (typeof siteData.referer == "string" || siteData.referer === "") {
            referer = siteData.referer;
        } else {
            referer = location.href;
        }
        return referer
    };

    const fetchData = (srcUrl, picNum = "none", imgsNum = "none") => {
        currentDownloadThread++
        return fetch(srcUrl, {
            referrer: getReferer(srcUrl)
        }).then(res => res.blob()).then(blob => {
            currentDownloadThread--
            getDataMsg(displayLanguage.str_25, picNum, imgsNum);
            return {
                blob: blob,
                picNum: picNum
            };
        }).catch(error => {
            currentDownloadThread--
            debug(`fetchData() Error: ${error}`);
        });
    };

    const GMGetData = (srcUrl, picNum = "none", imgsNum = "none") => {
        currentDownloadThread++
        return new Promise(resolve => {
            _GM_xmlhttpRequest({
                method: "GET",
                url: srcUrl,
                responseType: "blob",
                headers: {
                    origin: location.origin,
                    referer: getReferer(srcUrl),
                    accept: "*/*"
                },
                onload: data => {
                    currentDownloadThread--
                    let blob = data.response;
                    //debug("GM blob", blob);
                    if (blob.type == "application/octet-stream" || blob.type == "binary/octet-stream") {
                        resolve({
                            blob: blob,
                            picNum: picNum
                        });
                        getDataMsg(displayLanguage.str_25, picNum, imgsNum);
                    } else if (/^image|^video/.test(blob.type)) {
                        resolve({
                            blob: blob,
                            picNum: picNum
                        });
                        getDataMsg(displayLanguage.str_25, picNum, imgsNum);
                    } else {
                        let htmlText = "none";
                        let doc = "none";
                        if (blob.type == "text/html") {
                            htmlText = blob.text();
                            doc = fun.doc(htmlText);
                        }
                        resolve({
                            htmlText: htmlText,
                            doc: doc,
                            blob: blob,
                            error: "下載錯誤",
                            picNum: picNum,
                            src: srcUrl
                        });
                        getDataMsg(displayLanguage.str_26, picNum, imgsNum);
                    }
                },
                onerror: error => {
                    currentDownloadThread--
                    resolve({
                        error: "下載錯誤",
                        picNum: picNum,
                        src: srcUrl
                    });
                    getDataMsg(displayLanguage.str_26, picNum, imgsNum);
                }
            });
        });
    };

    const saveData = (blob, fileName) => {
        let a = document.createElement("a");
        a.href = URL.createObjectURL(blob);
        a.download = fileName;
        document.body.appendChild(a);
        a.click();
        a.remove();
        setTimeout(() => {
            URL.revokeObjectURL(blob);
        }, 1000);
    };

    const getImgs = async selector => {
        fetching = true;
        let imgs;
        if (ge(".FullPictureLoadImage") && siteData.repeat != 1) {
            imgs = [...gae(".FullPictureLoadImage:not(.small)")];
        } else if (typeof selector == "function") {
            imgs = await selector();
        } else if (!selector || selector === "") {
            showMsg(displayLanguage.str_41);
            return;
        } else if (selector.length < 3) {
            showMsg(displayLanguage.str_42);
            return;
        } else if (/^js;/.test(selector)) {
            imgs = await new Function("siteData", "fun", '"use strict";' + selector.slice(3))(siteData, fun);
            debug("\ngetImgs(selector) JSimgs:", imgs);
        } else if (/^\//.test(selector)) {
            imgs = [...gax(selector)];
        } else {
            imgs = [...gae(selector)];
        }
        imgs = imgs.filter(item => item); //去除空、無用
        fetching = false;
        return imgs;
    };

    let countdownTime1, countdownTime2;

    const imgZipDownload = async () => {
        if (downloading) {
            alert(displayLanguage.str_48);
            return;
        }
        if (fetching) {
            alert(displayLanguage.str_49);
            return;
        }
        if (ge("#FullPictureLoadOptions:not([style])")) {
            return;
        }
        let selector, titleText;
        if (fastDownload) {
            if (typeof siteData.imgs == "function") {
                selector = siteData.imgs;
            } else {
                selector = options.default;
            }
            titleText = (customTitle || document.title.replace(/\[\d+p(\d+v)?\]|【\d+P】/i, "").replace(/[\/\?<>\\:\*\|":]/g, " ").trim());
        } else {
            if (!siteData.autoDownload || siteData.autoDownload && siteData.autoDownload[0] != 1 && options.autoDownload != 1) {
                if (typeof siteData.imgs == "function") {
                    selector = siteData.imgs;
                } else {
                    selector = await prompt(displayLanguage.str_50, options.default);
                }
                titleText = await prompt(displayLanguage.str_51, (customTitle || document.title.replace(/\[\d+p(\d+v)?\]|【\d+P】/i, "").replace(/[\/\?<>\\:\*\|":]/g, " ").trim()));
            } else if (siteData.autoDownload) {
                if (siteData.autoDownload[0] == 1 || options.autoDownload == 1) {
                    selector = siteData.imgs;
                    titleText = (customTitle || document.title.replace(/\[\d+p(\d+v)?\]|【\d+P】/i, "").replace(/[\/\?<>\\:\*\|":]/g, " ").trim());
                } else {
                    debug("未開啟自動下載");
                    return;
                }
            }
        }

        let imgs = await getImgs(selector);
        globalImgArray = imgs;
        downloading = true;

        if (imgs.length > 0 && titleText != null && titleText != "") {
            debug("\nimgZipDownload():", imgs);
            const imgsNum = imgs.length;
            let title = titleText;
            const zip = new JSZip();
            const zipFolder = zip.folder(`${title} [${imgsNum}P]`);
            fun.show(displayLanguage.str_55, 0);

            for (let i = 0; i < imgs.length; i++) {
                let n = parseInt(i) + 1;
                let picNum = getNum(i);
                let promiseBlob;
                let imgSrc;
                let check = fun.checkImgSrc(imgs[i]);
                if (check.ok) {
                    imgSrc = check.src;
                } else {
                    debug("\nimgZipDownload() imgs 格式錯誤!", imgs[i]);
                    continue;
                }
                await fun.checkDownloadThread();
                if (siteData.fetch == 1) {
                    promiseBlob = fetchData(imgSrc, picNum, imgsNum);
                } else {
                    promiseBlob = GMGetData(imgSrc, picNum, imgsNum);
                }
                promiseBlobArray.push(promiseBlob);
            }

            debug("\nPromiseBlobArray:", promiseBlobArray);

            Promise.all(promiseBlobArray).then(async data => {
                debug("\nPromiseAllData:", data);
                let blobDataArray = data.filter(item => item.blob); //成功下載
                let errorDataArray = data.filter(item => item.error); //下載錯誤
                debug("\nNewDataArray:", blobDataArray);
                debug("\nErrorDataArray:", errorDataArray);
                if (errorDataArray.length > 0) {
                    options.autoDownload = 0;
                    let jsonStr = JSON.stringify(options);
                    localStorage.setItem("FullPictureLoadOptions", jsonStr);
                    downloadNum = 0;
                    downloading = false;
                    fun.show(`${displayLanguage.str_27}${errorDataArray.length}${displayLanguage.str_28}`, 3000);
                    setTimeout(() => {
                        fun.show(displayLanguage.str_29, 0);
                    }, 3100);
                    return;
                }
                if (blobDataArray.length > 0) {
                    for (let i = 0; i < blobDataArray.length; i++) {
                        let n = parseInt(i) + 1;
                        let ex;
                        let type = blobDataArray[i].blob.type;
                        try {
                            if (type == "application/octet-stream") {
                                ex = "webp";
                            } else if (type == "binary/octet-stream") {
                                ex = "jpg";
                            } else {
                                ex = type.split("/")[1].match(/\w+/)[0];
                            }
                        } catch (e) {
                            if (/^image/.test(type)) {
                                ex = "jpg";
                            } else {
                                debug("\nimgZipDownload() PromiseAll blob資料格式錯誤", blobDataArray);
                                fun.show(displayLanguage.str_30, 0);
                                return;
                            }
                        }
                        let fileName = `${blobDataArray[i].picNum}P.${ex}`;
                        if (options.zip) {
                            //console.log(`第${n}/${blobDataArray.length}張,檔案名:${fileName},大小:${parseInt(blobDataArray[i].blob.size / 1024)} Kb`);
                            zipFolder.file(fileName, blobDataArray[i].blob, {
                                binary: true
                            });
                        } else {
                            saveData(blobDataArray[i].blob, title + "_" + fileName);
                            await fun.delay(100, 0);
                            if (i === blobDataArray.length - 1) {
                                promiseBlobArray = [];
                                downloadNum = 0;
                                downloading = false;
                                fun.hide();
                            }
                        }
                    }
                    if (options.zip) {
                        zip.generateAsync({
                            type: "blob"
                        }, (metadata) => {
                            fun.show(displayLanguage.str_31 + metadata.percent.toFixed(2) + " %", 0);
                        }).then(async data => {
                            debug("\nZIP壓縮檔數據:", data);
                            saveData(data, `${title} [${imgsNum}P].${options.file_extension}`);
                            promiseBlobArray = [];
                            downloadNum = 0;
                            downloading = false;
                            fun.hide();
                            let autoDownload = siteData.autoDownload;
                            let next = siteData.next;
                            if (next && autoDownload) {
                                let ele;
                                if (typeof next === "function") {
                                    ele = await next();
                                } else {
                                    ele = fun.ge(next);
                                }
                                if (ele && siteData.autoDownload[0] == 1 || ele && options.autoDownload == 1) {
                                    let max = siteData.autoDownload[1] || options.autoDownloadCountdown;
                                    let countdownNum = max;
                                    fun.show(`${displayLanguage.str_32}${max}${displayLanguage.str_33}`, 0);
                                    for (let i = 1; i < max; i++) {
                                        countdownTime1 = setTimeout(() => {
                                            fun.show(`${displayLanguage.str_32}${countdownNum-=1}${displayLanguage.str_33}`, 0);
                                        }, i * 1000);
                                    }
                                    countdownTime2 = setTimeout(() => {
                                        if (typeof next === "function") {
                                            fun.show(displayLanguage.str_34);
                                            location.href = ele;
                                        } else {
                                            ele.click();
                                            fun.show(displayLanguage.str_35);
                                        }
                                    }, max * 1000);
                                } else if (!ele && siteData.autoDownload[0] == 1 || !ele && options.autoDownload == 1) {
                                    fun.show(displayLanguage.str_36, 0);
                                    options.autoDownload = 0;
                                    let jsonStr = JSON.stringify(options);
                                    localStorage.setItem("FullPictureLoadOptions", jsonStr);
                                }
                            }
                        });
                    }
                } else {
                    promiseBlobArray = [];
                    downloadNum = 0;
                    downloading = false;
                    showMsg(displayLanguage.str_43);
                }
            });
        } else {
            downloading = false;
            showMsg(displayLanguage.str_41);
        }
    };

    const copyImgSrcText = async () => {
        if (downloading) {
            alert(displayLanguage.str_48);
            return;
        }
        if (fetching) {
            alert(displayLanguage.str_49);
            return;
        }
        if (ge("#FullPictureLoadOptions:not([style])")) {
            return;
        }
        let selector;
        if (typeof siteData.imgs == "function") {
            selector = siteData.imgs;
        } else {
            selector = await prompt(displayLanguage.str_50, options.default);
        }
        let imgs = await getImgs(selector);
        let imgSrcArray = [];
        if (siteData.insertImg) {
            debug("\n右鍵 insertImg():", imgs);
        } else {
            debug("\nCopyImgSrcText():", imgs);
        }
        if (imgs.length > 0) {
            for (let i = 0; i < imgs.length; i++) {
                let imgSrc;
                let check = fun.checkImgSrc(imgs[i]);
                if (check.ok) {
                    imgSrc = check.src;
                } else {
                    debug(`\ncopyImgSrcText() imgs[${i}] 格式錯誤!`, imgs[i]);
                    continue;
                }
                imgSrcArray.push(imgSrc);
            }
        } else {
            showMsg(displayLanguage.str_44);
            return;
        }
        imgSrcArray = [...new Set(imgSrcArray)];
        globalImgArray = imgSrcArray;
        if ((!fun.ge(".FullPictureLoadImage") && siteData.insertImg) || siteData.repeat == 1) {
            fun.insertImg(globalImgArray, siteData.insertImg[0], siteData.insertImg[1]);
            showMsg("已聚集全部圖片");
            return;
        }
        imgSrcArray.push(customTitle || document.title);
        debug("\ncopyImgSrcText() imgSrcArray:", imgSrcArray);
        let str = imgSrcArray.join("\n");
        console.log(str);
        copyToClipboard(str);
        showMsg(`${displayLanguage.str_45}(${imgSrcArray.length - 1})`);
        imgSrcArray = null;
    };

    const copyToClipboard = text => {
        if (navigator.clipboard && window.isSecureContext) {
            return navigator.clipboard.writeText(text);
        } else {
            let textArea = document.createElement("textarea");
            textArea.value = text;
            textArea.style.position = "absolute";
            textArea.style.opacity = 0;
            textArea.style.left = "-999999px";
            textArea.style.top = "-999999px";
            document.body.appendChild(textArea);
            textArea.focus();
            textArea.select();
            return new Promise((res, rej) => {
                document.execCommand("copy") ? res() : rej();
                textArea.remove();
            });
        }
    };

    const goToNo1Img = (time = 1000) => {
        if (ge("#FullPictureLoadOptions:not([style])")) {
            return;
        }
        let ele;
        /*if (ge("#FullPictureLoadOptionsBtn")) {
            ele = ge("#FullPictureLoadOptionsBtn");
        } else */
        if (ge("#FullPictureLoadImgBox:not([style*=none])")) {
            ele = ge(".FullPictureLoadImage.small");
        } else {
            ele = ge(".FullPictureLoadImage");
        }
        if (ele) {
            if (time != 0) showMsg(displayLanguage.str_46);
            setTimeout(() => {
                ele.scrollIntoView({
                    behavior: "smooth"
                });
            }, time);
        }
    };

    const autoScrollEles = () => {
        if (ge("#FullPictureLoadOptions:not([style])")) {
            return;
        }
        let arr = siteData.scrollEle;
        if (arr) {
            fun.scrollEles(arr[0], arr[1]);
        }
    };

    const toggleZoom = () => {
        if (ge("#FullPictureLoadOptions:not([style])")) {
            return;
        }
        if (!fetching && options.zoom <= 10 && ge(".FullPictureLoadImage:not(.small)")) {
            if (options.zoom == 0) {
                options.zoom = 10;
            } else {
                options.zoom = options.zoom -= 1;
            }
            if (options.zoom == 0) {
                cancelZoom();
            }
            ge("#FullPictureLoadOptionsZoom").value = options.zoom;
            let jsonStr = JSON.stringify(options);
            localStorage.setItem("FullPictureLoadOptions", jsonStr);
            if (options.zoom > 0) {
                [...gae(".FullPictureLoadImage:not(.small)")].forEach(img => {
                    img.style.width = `${options.zoom * 10}%`;
                });
                fun.show(`${displayLanguage.str_60} ${options.zoom * 10}%`);
            }
        }
    };

    let viewMode = 0;
    let column;

    const toggleImgMode = async () => {
        if (ge("#FullPictureLoadOptions:not([style])")) {
            return;
        }
        if ([...gae(".FullPictureLoadImage")].length < 1) {
            fun.show("請先手動插入圖片");
            return;
        }
        if (ge(".FullPictureLoadImage:not(.small):not([style])")) {
            if (ge("#FullPictureLoadImgBox")) {
                ge("#FullPictureLoadImgBox").style.display = "block";
                [...gae(".FullPictureLoadImage:not(.small),#FullPictureLoadEnd")].forEach(e => {
                    e.setAttribute("style", "display:none!important;");
                })
                viewMode = 1;
                fun.show("並排模式");
                return;
            }
            let width;
            if (options.column == 2 || siteData.category == "comic") {
                width = "48.8%";
                column = 2;
            } else if (options.column == 3) {
                width = "32%";
                column = 3;
            } else if (options.column == 5) {
                width = "19.2%";
                column = 5;
            } else if (options.column == 6) {
                width = "16%";
                column = 6;
            } else {
                column = 4;
                if (hasTouchEvents()) {
                    width = "24%";
                } else {
                    width = "24.4%";
                }
            }
            let imgBox = document.createElement("div");
            imgBox.id = "FullPictureLoadImgBox";
            imgBox.style.width = "100%";
            imgBox.style.maxWidth = "1400px";
            imgBox.style.backgroundColor = "#F6F6F6";
            let srcArr1 = [...gae(".FullPictureLoadImage:not(.small)")].map(e => { //取得目前圖片網址的陣列
                if (e.dataset.src) {
                    return e.dataset.src;
                } else {
                    return e.src;
                }
            });
            let srcArr2 = srcArr1.map((item, index, arr) => { //圖片網址陣列單雙對換用於漫畫式閱讀
                if (parseInt(index) % 2 == 0) { //圖片網址陣列裡的單數張
                    if ((parseInt(index) + 1) == arr.length) {
                        return arr[index]; //最後一張是單數張則返回此圖片網址
                    } else {
                        return arr[parseInt(index) + 1]; //是單數則返回後一個
                    }
                } else { //圖片網址陣列裡的雙數張
                    return arr[parseInt(index) - 1]; //是雙數則返回前一個
                }
            });
            let srcArr;
            if (siteData.category == "comic" || (options.column == 2 && siteData.category == "hcomic")) {
                srcArr = srcArr2; //漫畫類用單雙對換的圖片網址並排後閱讀順序會是右至左跟漫畫書一樣
            } else {
                srcArr = srcArr1; //閱讀順序左至右
            }
            srcArr.forEach(e => {
                let img = new Image();
                img.className = "FullPictureLoadImage small";
                img.src = loading_bak;
                img.dataset.src = e;
                fun.imagesObserver.observe(img);
                let item = document.createElement("div");
                item.style.width = width;
                item.style.height = "auto";
                //item.style.float = "left";
                item.style.display = "inline-block";
                if (siteData.category == "comic" || (options.column == 2 && siteData.category == "hcomic")) {
                    item.style.verticalAlign = "middle";
                    //item.style.maxHeight = "99vh";
                } else {
                    item.style.verticalAlign = "top";
                }
                item.style.padding = "0.1%";
                item.style.border = "1px solid #a0a0a0";
                item.appendChild(img);
                imgBox.appendChild(item);
            });
            let tE = [...gae(".FullPictureLoadImage:not(.small)")].pop();
            tE.parentNode.insertBefore(imgBox, tE.nextSibling);
            tE.parentNode.style.textAlign = "center";
            tE.parentNode.style.display = "block";
            [...gae(".FullPictureLoadImage:not(.small),#FullPictureLoadEnd")].forEach(e => {
                e.setAttribute("style", "display:none!important;");
            });
            viewMode = 1;
            fun.show("並排模式");
            let imgs = [...gae("#FullPictureLoadImgBox>div")];
            let imgsNum = 0;
            if (imgs[0].nextSibling && siteData.category == "comic") {
                await fun.checkImgStatus(imgs[0].nextSibling.querySelector("img").dataset.src, "Wait Loading...");
                if (imgs[0].offsetHeight < imgs[0].nextSibling.offsetHeight) {
                    imgs[0].style.height = (imgs[0].nextSibling.offsetHeight) + "px";
                    let img = imgs[0].querySelector("img");
                    await fun.checkImgStatus(img.dataset.src, "Wait Loading...");
                    let num = (imgs[0].offsetHeight - img.height) / 2;
                    img.style.marginTop = `${num}px`;
                }
                /*
                let optionsBtn = ge("#FullPictureLoadOptionsBtn");
                if (optionsBtn) {
                    optionsBtn.scrollIntoView();
                } else {
                    imgs[0].scrollIntoView();
                }
                */
                imgs[0].scrollIntoView();
            }
            document.addEventListener("keydown", async event => {
                if (ge("#FullPictureLoadOptions:not([style])")) {
                    return;
                }
                if (event.key == "ArrowUp") {
                    event.preventDefault();
                    if (imgsNum > 0 && viewMode == 1) {
                        imgsNum -= column;
                        imgs[imgsNum].scrollIntoView();
                    }
                } else if (event.key == "ArrowDown") {
                    event.preventDefault();
                    if (imgsNum < imgs.length && imgsNum != imgs.length && viewMode == 1) {
                        imgsNum += column;
                        try {
                            if (imgs[imgsNum].nextSibling && siteData.category == "comic") {
                                debug(`\n第${parseInt(imgsNum) + 1}張(左)高:${imgs[imgsNum].offsetHeight}\n第${parseInt(imgsNum) + 2}張(右)高:${imgs[imgsNum].nextSibling.offsetHeight}`);
                                await fun.checkImgStatus(imgs[imgsNum].nextSibling.querySelector("img").dataset.src, "Wait Loading...");
                                if (imgs[imgsNum].offsetHeight < imgs[imgsNum].nextSibling.offsetHeight) {
                                    imgs[imgsNum].style.height = (imgs[imgsNum].nextSibling.offsetHeight) + "px";
                                    let img = imgs[imgsNum].querySelector("img");
                                    await fun.checkImgStatus(img.dataset.src, "Wait Loading...");
                                    let num = (imgs[imgsNum].offsetHeight - img.height) / 2;
                                    debug(`\n修改了之後\n第${parseInt(imgsNum) + 1}張(左)高:${imgs[imgsNum].offsetHeight}\n第${parseInt(imgsNum) + 2}張(右)高:${imgs[imgsNum].nextSibling.offsetHeight}`);
                                    img.style.marginTop = `${num}px`;
                                }
                            } else if (siteData.category == "comic") {
                                imgs[imgsNum].src = imgs[imgsNum].dataset.src;
                                await fun.checkImgStatus(imgs[imgsNum].dataset.src, "Wait Loading...");
                            }
                            imgs[imgsNum].scrollIntoView();
                        } catch (e) {
                            if (siteData.autoNext && siteData.next && siteData.insertImg) {
                                if (typeof siteData.next === "string") {
                                    let next = fun.ge(siteData.next);
                                    if (next) {
                                        fun.show("前往下一集", 3000);
                                        //next.click();
                                        elementClick(next);
                                    } else {
                                        imgsNum = 0 - column;
                                        fun.show("已是最後下一集", 3000);
                                    }
                                } else if (typeof siteData.next === "function") {
                                    let next = await siteData.next();
                                    if (next) {
                                        fun.show("前往下一集", 3000);
                                        location.href = next;
                                    } else {
                                        imgsNum = 0;
                                        fun.show("已是最後下一集", 3000);
                                    }
                                }
                            } else {
                                imgsNum = 0;
                                imgs[0].scrollIntoView();
                                fun.show("返回開頭了");
                            }
                        }
                    }
                } else {
                    imgsNum = 0 - column;
                }
            });
        } else if (ge(".FullPictureLoadImage.small")) {
            ge("#FullPictureLoadImgBox").style.display = "none";
            $(".FullPictureLoadImage:not(.small),#FullPictureLoadEnd").removeAttr("style");
            viewMode = 0;
            fun.show("原始模式");
        } else {
            fun.show("請先取消圖片縮放");
        }
    };

    const cancelZoom = () => {
        if (ge("#FullPictureLoadOptions:not([style])")) {
            return;
        }
        if (ge(".FullPictureLoadImage:not(.small)")) {
            options.zoom = 0;
            ge("#FullPictureLoadOptionsZoom").value = options.zoom;
            let jsonStr = JSON.stringify(options);
            localStorage.setItem("FullPictureLoadOptions", jsonStr);
            $(".FullPictureLoadImage:not(.small)").removeAttr("style");
            fun.show(displayLanguage.str_61);
        }
    };

    const addFullPictureLoadButton = () => {
        let img = new Image();
        img.id = "FullPictureLoad";
        img.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACFlBMVEVEREAAAABEREBEREBUXnFTXXBTXG5VXXJUXHFUW28grV0grV0hrl4hrV0hq10iql0oomAhrV2BiZiAiJd/h5V+h5Uiq16OlaKNlKGMk5+Mkp+KkZ89p28nq2Hp9+/n9u3t8PHs7/Dg9Ojp7O3d8+bo7O3o6+zn6+3m6uzl6evX8OLV8OHi5ujh5efO7dze4uTe4ePb3+LY3eDX29/W2t7T19u35Mu25Mr01lqw4sbz1Vmv4sXA1NWs4cPw0lnv0lmp4MCk3r3ozVuh3buu0M6vz83kylugysefycadx8OexsOdxsOF0qZ6zp5pyJK1p2S0pmOsoGRWv4SLlKEmuZpBsnc5t3AmuJmQi2ont5kmtpcptJiOiWg0tWwytGorr5Yqr5YsrpUws2kqrJRNmpMusmcsqpIuqJMssWkqsWQqsGUnsGUzoI8lsGGAf2wkr2Ekr2BzfI0irl8hrl5ye4x9fGogrWAhrV03mIwgrF9xeoshq10gql8dp2ccp2cdpmkcnIUanIYcm4QRoIUTnoURn4QdmYM/h4QcmIMSnYMXmoMWmoIbloIclYJDgYIYl4EaloAek4IfkYFqbm0jjoBqbW0ni4ApiX9Hd35kanBjaXBhaG9MbnpOanhOaXhPaHdDbXZHanZGanRLZnZJZ3RSYnVMZXRPY3ROY3VSYXRQYnRTYHRVX3NUX3RSYHNUXnNTXXJTXXFME6frAAAAHnRSTlMAAAUGZ2dqeHh7lrzNzc7O3O/09PT19fn5+fn5/f4hZOrvAAAB1UlEQVR42oWTzYoTQRSFv6q6RqOoqBicTTCKK1cOURBGBV9AXCgu9Vl8FF/ApcshI4qKgrtBByZK0HSGmMxkMrF/qq6LTjptErGX5zu3uu65dY3TYCh9ag2UNPsfjnmpZW4MgBbaIy/6PCnxvL7gEQhJ7AruAqifcZ96EHDX67ngKgCJn/k3B6AC1O9Cj9ri/2mBsZIf9iLi0rMFDhhjbO6NsL9er+CQG3pYMT+XuGVmuH9SzPF7S/UONDfUHl44/6A24wfdpMgsSO6tP52ffxjF6cUT056MBdxf/cVRzP6PiQG8KhZMJedhewik0QT43RsBQUEwLufZx53Td85p7wCwEu+Fs6qAGBsA1aO3XUZbG/EAsAJJlM/MGgOoDltdYNTam3JIOlVmOaj2N/sAjHf9lGdBqwACmmi0FU/TOWxfEY483o/9tcuvJBXU+90PaZHf5NtVFzTL+N7bqD4GS9DRmzl3btJWk2WFIKradqX8LfudU3VKBuKd0vwc+HCjNDJhkJXfB6jq+wZJBSAT5MmKN1/la7sJ+jmsiyQrdkZo9N819FNnXcSZFTt1rGnXhl/G6a26IP/YOXczi5prQmFY3snbkzNSXGyBV+28p+nNF+vn2h97PvHD5SOHkgAAAABJRU5ErkJggg==";
        img.setAttribute("title", displayLanguage.str_47);
        img.oncontextmenu = () => false;
        img.addEventListener("click", () => {
            imgZipDownload();
        });
        img.addEventListener("mousedown", (event) => {
            if (event.button == 1) {
                event.preventDefault();
                goToNo1Img(0);
            }
            if (event.button == 2) {
                event.preventDefault();
                copyImgSrcText();
            }
        });
        document.body.appendChild(img);
    };


    const hasTouchEvents = () => {
        if (("ontouchstart" in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0)) {
            return true;
        }
        return false;
    };

    const elementClick = ele => {
        const dispatchTouchEvent = (_ele, type) => {
            let touchEvent = document.createEvent("UIEvent");
            touchEvent.initUIEvent(type, true, true);
            touchEvent.touches = [{
                clientX: 1,
                clientY: 1
            }];
            _ele.dispatchEvent(touchEvent);
        };
        if (hasTouchEvents()) {
            dispatchTouchEvent(ele, "touchstart");
            dispatchTouchEvent(ele, "touchend");
        }
        ele.click();
        /*
        if (hasTouchEvents()) {
            ele.dispatchEvent(new Event("touchstart"));
            ele.dispatchEvent(new Event("touchend"));
            //ele.click();
            debug("\nelementClick touch事件式點擊\n", ele);
        } else {
            //ele.dispatchEvent(new Event("click"));
            ele.click();
            debug("\nelementClick click事件式點擊\n", ele);
        }
        */
    };

    const addReturnTopButton = () => {
        let a = document.createElement("a");
        a.href = "javascript:void(0);";
        a.setAttribute("onclick", "window.scrollTo({top:0,behavior:'smooth'});");
        let img = new Image();
        img.src = "data:image/png;base64,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";
        img.className = "FullPictureLoadImageReturnTop";
        a.appendChild(img);
        document.body.appendChild(a);
    };

    const nsfw1Data = customData.filter(item => item.category == "nsfw1"); //列出寫真站
    const nsfw2Data = customData.filter(item => item.category == "nsfw2"); //列出老司機站
    const comicData = customData.filter(item => item.category == "comic"); //列出普漫站
    const hcomicData = customData.filter(item => item.category == "hcomic"); //列出H漫站
    const AIData = customData.filter(item => item.category == "AI"); //列出AI繪圖站
    const autoPagerData = customData.filter(item => item.category == "autoPager"); //列出自動翻頁
    const noneData = customData.filter(item => item.category == "none"); //列出未分類

    const FullPictureLoadOptionsMain = document.createElement("div");
    FullPictureLoadOptionsMain.id = "FullPictureLoadOptions";
    FullPictureLoadOptionsMain.style.display = "none";
    const FullPictureLoadOptionsMainHtmlSrt = `
<div style="width: 100%;">
    <p><font color="black">Full Picture Load 選項</font></p>
</div>
<div style="width: 100%;">
    <p><font color="black">左下圖示 ( 0:關、1:開 ) PS:優先級別低於內置規則</font></p>
    <input id="FullPictureLoadOptionsIcon">
</div>
<div style="width: 100%;">
    <p><font color="black">當前網站最大下載線程數 ( 1 ~ 32 ) PS:優先級別低於內置規則</font></p>
    <input id="FullPictureLoadOptionsThreading">
</div>
<div style="width: 100%;">
    <p><font color="black">壓縮打包 ( true:壓縮、false:不壓縮 (不能全自動下載) )</font></p>
    <input id="FullPictureLoadOptionsZip">
</div>
<div style="width: 100%;">
    <p><font color="black">壓縮檔副檔名 ( zip 或 cbz )</font></p>
    <input id="FullPictureLoadOptionsExtension">
</div>
<div style="width: 100%;">
    <p><font color="black">自動下載 (1:開、0:關) </font><font color="red">快捷鍵 [ ctrl + . ] 開始或取消</font></p>
    <input id="FullPictureLoadOptionsAutoDownload">
</div>
<div style="width: 100%;">
    <p><font color="black">自動下載倒數秒數 PS:優先級別低於內置規則</font></p>
    <input id="FullPictureLoadOptionsCountdown">
</div>
<div style="width: 100%; display: none;">
    <p><font color="black">當前漫畫站規則 ( 0:維持關閉、1:啟用 )</font></p>
    <input id="FullPictureLoadOptionsComic">
</div>
<div style="width: 100%;">
    <p><font color="black">移動裝置雙擊前往下一頁 ( true:開、false:關 )</font></p>
    <input id="FullPictureLoadOptionsDouble">
</div>
<div style="width: 100%;">
    <p><font color="black">當前網站圖片縮放比例 ( 0 ~ 10 ) 10 = 100%、5 = 50%、0 = auto</font></p>
    <input id="FullPictureLoadOptionsZoom">
</div>
<div style="width: 100%;">
    <p><font color="black">當前網站圖片並排模式顯示數量 ( 2 ~ 6 ) comic類固定為 ( 2 )</font></p>
    <input id="FullPictureLoadOptionsColumn">
    <p><font color="black">PS:comic類並排後為右至左的漫讀模式 hcomic類也設定為2將套用</font></p>
</div>
<button id="FullPictureLoadOptionsCancelBtn"><font color="black">取消 (Esc)</font></button>
<button id="FullPictureLoadOptionsResetBtn"><font color="black">重置設定</font></button>
<button id="FullPictureLoadOptionsSaveBtn"><font color="black">保存設定</font></button>
`;
    FullPictureLoadOptionsMain.innerHTML = FullPictureLoadOptionsMainHtmlSrt;
    document.body.appendChild(FullPictureLoadOptionsMain);

    const setValue = () => {
        ge("#FullPictureLoadOptionsIcon").value = options.icon;
        ge("#FullPictureLoadOptionsThreading").value = options.threading;
        ge("#FullPictureLoadOptionsZip").value = options.zip;
        ge("#FullPictureLoadOptionsExtension").value = options.file_extension;
        ge("#FullPictureLoadOptionsAutoDownload").value = options.autoDownload;
        ge("#FullPictureLoadOptionsCountdown").value = options.autoDownloadCountdown;
        ge("#FullPictureLoadOptionsComic").value = options.comic;
        ge("#FullPictureLoadOptionsDouble").value = options.doubleTouchNext;
        ge("#FullPictureLoadOptionsZoom").value = options.zoom;
        if (siteData.category == "comic") {
            ge("#FullPictureLoadOptionsColumn").value = 2;
        } else {
            ge("#FullPictureLoadOptionsColumn").value = options.column;
        }
    };

    $("#FullPictureLoadOptionsCancelBtn").on("click", (event) => {
        event.preventDefault();
        $("#FullPictureLoadOptions").hide();
    });

    $("#FullPictureLoadOptionsResetBtn").on("click", (event) => {
        event.preventDefault();
        localStorage.removeItem("FullPictureLoadOptions");
        location.reload();
    });

    $("#FullPictureLoadOptionsSaveBtn").on("click", (event) => {
        event.preventDefault();
        options.icon = ge("#FullPictureLoadOptionsIcon").value;
        options.threading = ge("#FullPictureLoadOptionsThreading").value;
        options.zip = ge("#FullPictureLoadOptionsZip").value;
        options.file_extension = ge("#FullPictureLoadOptionsExtension").value;
        options.comic = ge("#FullPictureLoadOptionsComic").value;
        options.autoDownload = ge("#FullPictureLoadOptionsAutoDownload").value;
        options.autoDownloadCountdown = ge("#FullPictureLoadOptionsCountdown").value;
        options.doubleTouchNext = ge("#FullPictureLoadOptionsDouble").value;
        options.zoom = ge("#FullPictureLoadOptionsZoom").value;
        options.column = ge("#FullPictureLoadOptionsColumn").value;
        let jsonStr = JSON.stringify(options);
        localStorage.setItem("FullPictureLoadOptions", jsonStr);
        location.reload();
    });

    const style = `
.FullPictureLoadImageReturnTop {
    position: fixed;
    right: 10px;
    bottom: 80px;
    width: 53px !important;
    height: 53px !important;
    z-index: 99;
    opacity: 0.6;
}

#FullPictureLoadOptions {
    text-align: center;
    width: auto !important;
    max-width: 400px !important;
    height: auto !important;
    position: fixed !important;
    top: 10%;
    left: 50%;
    margin-left: -190px;
    border: 1px solid #a0a0a0 !important;
    border-radius: 3px !important;
    box-shadow: -2px 2px 5px rgb(0 0 0 / 30%) !important;
    background-color: #FAFAFB;
    z-index: 2147483647 !important;
}

#FullPictureLoadOptions * {
    font: unset !important;
    font-family: Arial, sans-serif !important;
    font-size: 12px !important;
    float: none !important;
    line-height: 18px !important;
    margin-bottom: 1px !important;
    padding: 1px 4px !important;
    width: auto;
}

#FullPictureLoadOptions button {
    width: 114px;
    margin-left: 2px;
    margin-right: 2px;
    margin-bottom: 4px !important;
    display: inline-block;
    border: 1px solid #a0a0a0 !important;
    background-color: transparent !important;
}

#FullPictureLoadOptions input {
    color: #000000 !important;
    height: 20px !important;
    width: 360px !important;
    border: 1px solid #a0a0a0 !important;
    background-color: transparent !important;
}

#FullPictureLoadOptions p {
    text-align: center !important;
    margin-block-start: 0px !important;
    margin-block-end: 0px !important;
    margin-inline-start: 0px !important;
    margin-inline-end: 0px !important;
}

#FullPictureLoad {
    width: 32px !important;
    height: 32px !important;
    position: fixed !important;
    bottom: 20px !important;
    left: 20px !important;
    border-radius: unset !important;
    z-index: 2147483647 !important;
    opacity: 0.8 !important;
    display: block !important;
}

.FullPictureLoadMsg {
    font-family: Arial, sans-serif !important;
    font-size: 26px;
    font-weight: bold;
    text-align: center;
    line-height: 50px;
    color: #ffffff;
    width: 340px;
    height: 50px;
    top: 30%;
    left: 50%;
    margin-left: -170px;
    padding: 0px !important;
    background-color: #000;
    border: 1px solid #303030;
    border-radius: 10px;
    position: fixed;
    z-index: 2147483647;
    opacity: 0.7;
}

.FullPictureLoadImage:not(.small) {
    width: auto;
    height: auto;
    max-width: 100%;
    display: block !important;
    opacity: 1 !important;
    border: none !important;
    border-radius: unset !important;
    padding: 0 !important;
    margin: 0 auto !important;
}

.FullPictureLoadImage.small {
    width: auto;
    height: auto;
    max-width: 100%;
    max-height: 100% !important;
    min-height: 50x !important;
    display: block !important;
    opacity: 1 !important;
    border: none !important;
    border-radius: unset !important;
    padding: 0 !important;
    margin: auto;
}

#FullPictureLoadImgBox {
    display: block;
    opacity: 1 !important;
    border: none !important;
    border-radius: unset !important;
    padding: 0 !important;
    margin: 0 auto !important;
}

.FullPictureLoadImage[src*="i.imgur.com"] {
    min-height: 400px !important;
}

#FullPictureLoadEnd {
    font-size: 20px;
    height: 30px;
    width: 100%;
    line-height: 30px;
    text-align: center;
    margin: 5px auto !important;
}

#FullPictureLoadEnd~*:not(.row):not(.text-center):not(.link-d):not(#myrating):not(.gallery-a):not(.pagination):not(div[class^=picnext]) {
    display: none !important;
}

.FullPictureLoadLoading {
    font-size: 20px;
    text-align: center;
    height: 30px;
    line-height: 30px;
    margin: 5px auto !important;
    border: none !important;
}

#FullPictureLoad~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.fancybox-container) {
    display: none !important;
}

.autoPagerTitle {
    width: auto;
    height: 30px;
    font-size: 18px;
    color: black;
    font-family: Arial, sans-serif !important;
    line-height: 29px;
    text-align: center;
    overflow: hidden;
    display: block;
    margin: 10px 5px;
    border: 1px solid #e0e0e0;
    background-color: #f0f0f0;
    background: -webkit-gradient(linear, 0 0, 0 100%, from(#f9f9f9), to(#f0f0f0));
    background: -moz-linear-gradient(top, #f9f9f9, #f0f0f0);
    box-shadow: 0 0 5px rgba(0, 0, 0, 0.6);
    border-radius: 5px;
}

.autoPagerTitle a:-webkit-any-link {
    font-family: Arial, sans-serif !important;
    color: black;
}

.autoPagerLoading {
    width: auto;
    height: auto;
    display: block !important;
    opacity: 1 !important;
    border: none !important;
    border-radius: unset !important;
    padding: 0 !important;
    margin: 20px auto !important;
}

#FullPictureLoadOptionsBtn,
#FullPictureLoadToggleImgModeBtn,
#FullPictureLoadToggleZoomeBtn,
#FullPictureLoadCancelZoomBtn {
    padding: 1px !important;
    margin-top: 10px !important;
    margin-bottom: 6px !important;
    appearance: auto;
    text-rendering: auto;
    color: buttontext;
    letter-spacing: normal;
    word-spacing: normal;
    line-height: normal;
    font-size: 14px !important;
    text-transform: none;
    text-indent: 0px;
    text-shadow: none;
    display: inline-block;
    text-align: center;
    align-items: flex-start;
    cursor: default;
    box-sizing: border-box;
    background-color: buttonface;
    border: 1px solid #a0a0a0 !important;
}
.viewer-open:not(.fancybox-active) {
    overflow: unset !important;
    padding-right: 0px !important;
}
                `;
    let showOptions = false;
    for (let i = 0; i < customData.length; i++) {
        let check = null;
        if (typeof customData[i].reg === "object") {
            check = customData[i].reg.test(siteUrl);
        } else if (typeof customData[i].reg === "function") {
            check = await customData[i].reg();
        }
        if (check) {
            let category = customData[i].category;
            if (category === "comic" && customData[i].enable === 0) {
                showOptions = true;
                $("#FullPictureLoadOptions>div:nth-child(8)").show();
            }
            let delay = customData[i].delay;
            if (delay) {
                await fun.delay(delay, 0);
            }
            options.enable = 1;
            if (customData[i].enable == 0) {
                if (options.comic == 1 && category === "comic") {
                    showOptions = true;
                    debug("\n漫畫類預設關閉的此站規則已開啟");
                } else {
                    //showOptions = true;
                    options.enable = 0;
                    debug("\n此規則禁用", customData[i]);
                    continue;
                }
            }
            let include = customData[i].include;
            if (include) {
                if (!fun.ge(include)) {
                    options.enable = 0;
                    debug("\n頁面沒有包含必須元素", customData[i]);
                    continue;
                }
            }
            let exclude = customData[i].exclude;
            if (exclude) {
                if (fun.ge(exclude)) {
                    options.enable = 0;
                    debug("\n頁面包含排除元素", customData[i]);
                    continue;
                }
            }
            siteData = customData[i];
            showOptions = true;
            if (!ge(".FullPictureLoadMsg")) fun.addFullPictureLoadMsg();
            if (!ge(".FullPictureLoadStyle")) fun.css(style);
            if (!siteData.autoPager) {
                const fancyBoxCssHtml = `<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/[email protected]/dist/jquery.fancybox.min.css">`;
                document.head.insertAdjacentHTML("beforeend", fancyBoxCssHtml);
            }
            if (customData[i].imgs) {
                options.default = customData[i].imgs;
                debug(`\nCSS/Xpath/JS選擇器:${options.default}`);
            }
            if (customData[i].threading) {
                options.threading = customData[i].threading;
                debug("\n下載線程數:" + options.threading);
            }
            let css = customData[i].css;
            if (css) {
                fun.css(css);
            }
            let initCode = customData[i].init;
            if (initCode) {
                if (typeof initCode == "string") {
                    await new Function("siteData", "fun", '"use strict";' + initCode)(siteData, fun);
                } else if (typeof initCode == "function") {
                    await initCode();
                }
            }
            let titleCode = customData[i].customTitle;
            if (titleCode) {
                const getTitle = async () => {
                    if (typeof titleCode == "string") {
                        customTitle = await new Function("siteData", "fun", '"use strict";' + titleCode)(siteData, fun);
                    } else if (typeof titleCode == "function") {
                        customTitle = await titleCode();
                    }
                }
                await getTitle();
                debug(`\n自定義標題:${customTitle}`);
                if (customData[i].observerTitle) {
                    new MutationObserver(async () => {
                        await getTitle();
                        debug(`\n自定義標題:${customTitle}`);
                    }).observe(document.body, {
                        childList: true,
                        subtree: true
                    });
                }
            }
            let next = customData[i].next;
            if (next) {
                let link;
                if (typeof next === "function") {
                    link = await next();
                } else if (typeof next === "string") {
                    link = fun.ge(next);
                }
                debug("\n圖片全載NEXT\n", link);
                const callback = () => {
                    if (typeof next === "function") {
                        fun.show(displayLanguage.str_34, 0);
                        if (/^http/.test(link)) {
                            location.href = link;
                        } else {
                            fun.show(displayLanguage.str_37);
                        }
                    } else if (typeof next === "string") {
                        if (link) {
                            //link.click();
                            elementClick(link);
                            fun.show(displayLanguage.str_35);
                        } else {
                            fun.show(displayLanguage.str_37);
                        }
                    }
                };
                if (hasTouchEvents() && options.doubleTouchNext) {
                    document.addEventListener("dblclick", () => {
                        callback();
                    });
                }
                document.addEventListener("keydown", (event) => {
                    let key = window.event ? event.keyCode : event.which;
                    if (key == 39) {
                        callback();
                    }
                });
            }
            let prev = customData[i].prev;
            if (typeof prev == "string" && prev != 1) {
                document.addEventListener("keydown", (event) => {
                    let key = window.event ? event.keyCode : event.which;
                    if (key == 37) {
                        event.preventDefault();
                        let ele = fun.ge(prev);
                        if (ele) {
                            //ele.click();
                            elementClick(ele);
                            fun.show(displayLanguage.str_39);
                        } else {
                            fun.show(displayLanguage.str_40);
                        }
                    }
                });
            } else if (prev == 1) {
                document.addEventListener("keydown", (event) => {
                    let key = window.event ? event.keyCode : event.which;
                    if (key == 37) {
                        event.preventDefault();
                        fun.show(displayLanguage.str_38);
                        history.back();
                    }
                });
            }
            let autoClick = customData[i].autoClick;
            if (autoClick) {
                if (typeof autoClick == "object") {
                    setTimeout(() => {
                        let ele = fun.ge(autoClick[0]);
                        if (ele) {
                            elementClick(ele);
                            debug(`\n圖片全載autoClick("${autoClick}")`, ele);
                        }
                    }, autoClick[1] || 1000);
                } else if (typeof autoClick == "string") {
                    let ele = fun.ge(autoClick);
                    if (ele) {
                        elementClick(ele);
                        debug(`\n圖片全載autoClick("${autoClick}")`, ele);
                    }
                }
            }
            let observerClick = customData[i].observerClick;
            if (observerClick) {
                let ele = fun.ge(observerClick);
                if (ele) {
                    const observer = new IntersectionObserver((entries, observer) => {
                        entries.forEach(entry => {
                            if (entry.isIntersecting) {
                                observer.unobserve(entry.target);
                                elementClick(entry.target);
                                debug(`\n圖片全載observerClick("${observerClick}")`, entry.target);
                                setTimeout(async () => {
                                    if (await fun.waitEle(observerClick, 30)) {
                                        observer.observe(fun.ge(observerClick));
                                    }
                                }, 1000);
                            }
                        });
                    });
                    setTimeout(() => {
                        observer.observe(ele);
                    }, 1000)
                }
            }
            let loadMore = customData[i].loadMore;
            if (loadMore) {
                const callback = () => {
                    if (window.innerHeight + window.pageYOffset >= document.body.offsetHeight - 200) {
                        document.removeEventListener("scroll", callback);
                        let ele = fun.ge(loadMore);
                        if (ele) {
                            elementClick(ele);
                            debug(`圖片全載loadMore("${loadMore}")`);
                        }
                        setTimeout(async () => {
                            if (await fun.waitEle(loadMore, 30)) {
                                document.addEventListener("scroll", callback);
                            }
                        }, 1000);
                    };
                };
                document.addEventListener("scroll", callback);
            }
            if (siteData.autoPager) {
                if (siteData.autoPager.observer) {
                    let ele = [...fun.gae(siteData.autoPager.observer)].pop();
                    if (ele) {
                        fun.nextObserver.observe(ele);
                    }
                } else {
                    const callback = async () => {
                        if (window.innerHeight + window.pageYOffset >= document.body.offsetHeight - (siteData.autoPager.bottom || 1000)) {
                            document.removeEventListener("scroll", callback);
                            if (autoPager) {
                                await fun.autoPager();
                                await fun.delay(siteData.autoPager.sleep || 1000, 0);
                                document.addEventListener("scroll", callback);
                            }
                        };
                    };
                    document.addEventListener("scroll", callback);
                }
            }
            let openInNewTab = customData[i].openInNewTab;
            if (openInNewTab) {
                const _openInNewTab = () => fun.gae(openInNewTab).forEach(a => {
                    a.setAttribute("target", "_blank");
                });
                _openInNewTab();
                new MutationObserver(() => {
                    _openInNewTab();
                }).observe(document.body, {
                    childList: true,
                    subtree: true
                });
            }
            let autoDownload = siteData.autoDownload;
            if (autoDownload) {
                if (autoDownload[0] == 1 || options.autoDownload == 1) imgZipDownload();
            }
            let insertImg = customData[i].insertImg;
            if (insertImg) {
                if (autoDownload) {
                    if (autoDownload[0] == 1 || options.autoDownload == 1) break;
                }
                if (insertImg[1] == 1 || insertImg[1] == 2) {
                    fun.immediateInsertImg();
                }
            }
            let button = customData[i].topButton;
            if (button) addReturnTopButton();
            break;
        }
    }

    setValue();

    if (siteData.reg) {
        debug("\n列出此站資料", siteData);
        debug(`\n列出規則總數(${customData.length})`);
        debug("\n列出NSFW規則", nsfw1Data);
        debug("\n列出NSFW+規則", nsfw2Data);
        debug("\n列出COMIC規則", comicData);
        debug("\n列出HCOMIC規則", hcomicData);
        debug("\n列出AI繪圖規則", AIData);
        debug("\n列出自動翻頁規則", autoPagerData);
        debug("\n列出未分類規則", noneData);
    }

    if (showOptions) {
        //debug("\n圖片全載開啟了GM選單?\n", showOptions);
        const registerMenu = () => {
            try {
                GM_registerMenuCommand("設定", () => {
                    $("#FullPictureLoadOptions").removeAttr("style");
                });
            } catch (e) {
                try {
                    GM.registerMenuCommand("設定", () => {
                        $("#FullPictureLoadOptions").removeAttr("style");
                    });
                } catch (e) {}
            }
        }
        registerMenu();
    }

    if (!ge(".FullPictureLoadStyle")) fun.css(style);

    let autoDownload = siteData.autoDownload;

    if (hasTouchEvents() || !autoDownload) {
        $("#FullPictureLoadOptions>div:nth-child(n+6):nth-child(-n+7)").hide();
    }

    if (!hasTouchEvents()) {
        $("#FullPictureLoadOptions>div:nth-child(9)").hide();
    }

    if (autoDownload) {
        document.addEventListener("keydown", async event => {
            if (ge("#FullPictureLoadOptions:not([style])")) {
                return;
            }
            if (event.ctrlKey && event.key == ".") {
                if (options.autoDownload == 0) {
                    fun.show("即將開始自動下載!!!", 0);
                    options.autoDownload = 1;
                    let jsonStr = JSON.stringify(options);
                    localStorage.setItem("FullPictureLoadOptions", jsonStr);
                    setTimeout(() => {
                        location.reload();
                    }, 2000);
                } else {
                    options.autoDownload = 0;
                    let jsonStr = JSON.stringify(options);
                    localStorage.setItem("FullPictureLoadOptions", jsonStr);
                    let endTid = setTimeout(() => {});
                    for (let i = 0; i <= endTid; i++) {
                        clearTimeout(i);
                    }
                    fun.show("已停止自動下載!!!", 0);
                    location.reload();
                }
            }
        });
    }

    if (hasTouchEvents() && siteData.insertImg) {
        let timeId;
        if (siteData.insertImg[1] == 0 || siteData.insertImg[1] == 3) {
            document.addEventListener("touchstart", event => {
                //debug("\nTouchEvent\n", event);
                if (event.target.tagName == "IMG" && event.target.id != "FullPictureLoad") {
                    timeId = setTimeout(() => {
                        copyImgSrcText();
                    }, 500);
                }
            });
            document.addEventListener("touchmove", event => {
                clearTimeout(timeId);
            });
            document.addEventListener("touchend", event => {
                //debug("\nTouchEvent\n", event);
                clearTimeout(timeId);
            });
        }
    }

    if (options.enable == 1) {
        if (!ge(".FullPictureLoadMsg")) fun.addFullPictureLoadMsg();
        if (!ge(".FullPictureLoadStyle")) fun.css(style);
        if (siteData.key != 0) {
            document.addEventListener("keydown", event => {
                switch (event.keyCode) {
                    case 96: //數字鍵0
                        fastDownload = false;
                        imgZipDownload();
                        break;
                    case 97: //數字鍵1
                        copyImgSrcText();
                        break;
                    case 98: //數字鍵2
                        goToNo1Img(0);
                        break;
                    case 99: //數字鍵3
                        fastDownload = true;
                        imgZipDownload();
                        break;
                    case 100: //數字鍵4
                        autoScrollEles();
                        break;
                    case 101: //數字鍵5
                        toggleImgMode();
                        break;
                    case 109: //數字鍵-
                        toggleZoom();
                        break;
                    case 107: //數字鍵+
                        cancelZoom();
                        break;
                    case 106: //數字鍵*
                        $("#FullPictureLoadOptions").removeAttr("style");
                        break;
                    case 27: //Esc
                        $("#FullPictureLoadOptions").hide();
                        break;
                    case 111: //數字鍵/
                        if (ge("#FullPictureLoadOptions:not([style])")) {
                            return;
                        }
                        fun.show("初始化設定");
                        localStorage.removeItem("FullPictureLoadOptions"); //重置當前網站的用戶設定恢復為預設選項
                        setTimeout(() => {
                            location.reload();
                        }, 1000);
                        break;
                }
            });
        }
        if (siteData.icon == 0) {
            return;
        } else if (options.icon == 1 || siteData.icon == 1) addFullPictureLoadButton();
    }

})();