怠惰輔助&聚圖&下載

專注於寫真、H漫、漫畫的網站,目前規則數350+,透過選擇器圈選圖片,能聚集分頁的所有圖片到當前頁面裡,也能進行下載壓縮打包,如有下一頁元素能做到自動化下載。

נכון ליום 05-06-2023. ראה הגרסה האחרונה.

// ==UserScript==
// @name               怠惰輔助&聚圖&下載
// @name:en            CustomPictureDownload
// @name:zh-CN         怠惰輔助&聚图&下载
// @name:zh-TW         怠惰輔助&聚圖&下載
// @version            1.1.6.5
// @description        專注於寫真、H漫、漫畫的網站,目前規則數350+,透過選擇器圈選圖片,能聚集分頁的所有圖片到當前頁面裡,也能進行下載壓縮打包,如有下一頁元素能做到自動化下載。
// @description:en     Custom Picture Download
// @description:zh-CN  专注于写真、H漫、漫画的网站,目前规则数350+,透过选择器圈选图片,能聚集分页的所有图片到当前页面里,也能进行下载压缩打包,如有下一页元素能做到自动化下载。
// @description:zh-TW  專注於寫真、H漫、漫畫的網站,目前規則數350+,透過選擇器圈選圖片,能聚集分頁的所有圖片到當前頁面裡,也能進行下載壓縮打包,如有下一頁元素能做到自動化下載。
// @author             tony0809
// @match              *://*/*
// @exclude            *hcaptcha*
// @exclude            *iframe*
// @exclude            *addthis*
// @exclude            *www.youtube.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              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
// ==/UserScript==

(async () => {
    "use strict";
    const options = {
        enable: 0, //0為白名單模式根據自訂義規則啟用,1為全局啟用
        icon: 1, //是否顯示左下圖示0關1開
        one: 0, //單線程下載0關1開
        default: "img[src]", //預設CSS/Xpath選擇器/javascript代碼
        //default: "js;return [...document.images];",
        zip: true, //true圖片下載後壓縮打包,false批量下載圖片,無法全自動下載
        autoDownload: 0, //站點全局自動下載開關0關1開,需要customData也有autoDownload
        autoDownloadCountdown: 5, //有NEXT時自動下載的延遲秒數
        comic: 1, //1,忽視漫畫站點開關選項,啟用所有漫畫類規則
        doubleTouchNext: true //true開啟false關閉,觸控裝置雙擊前往下一頁
    };
    const siteUrl = location.href;
    let siteData = {};
    let siteJson = null;
    let globalImgArray = [];
    let customTitle = null;
    let downloading = false;
    let errorNum = 0;
    //const loading_bak = "data:image/png;base64,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";
    //const loading_bak = "https://i.imgur.com/TBOypzv.gif"; //透明灰圈 800*800
    //const loading_bak = "https://i.imgur.com/YCdwBG7.gif"; //白底藍圈 500*500
    //const loading_bak = "https://i.imgur.com/D6ltcWH.gif"; //灰底灰圈 800*600
    //灰底灰圈 800*600
    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 loading_bak = "https://i.imgur.com/HsUzXGD.gif"; //灰底灰點 200*200
    //const loading_bak = "https://i.imgur.com/sw3IVzK.gif"; //透明灰塊 240*240
    //const loading_bak = "https://i.imgur.com/0acxdnF.gif"; //透明灰點 240*240
    //自定義站點規則
    const customData = [{
        name: "小黃書/8色人體攝影 xchina.co/8se.me", //按數字鍵1、Enter插入圖片(手動模式),按0、Enter、Enter壓縮打包下載
        enable: 0, //0此規則禁用 1啟用
        reg: /(xchina|8se)\.(co|me)\/photo\/id-\w+\.html/, //網址正則匹配
        include: ".photos>a",
        imgs: () => {
            let numP = fun.geT("div[target][title]").match(/\d+/)[0];
            let max = Math.ceil(numP / 18);
            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,.slider-ad,.article.ad,.pager>.tips,body>footer~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.customPicDownloadMsg):not(#customPicDownload),.photoMask,.banner_ad{display: none!important;}",
        category: "nsfw2"
    }, {
        name: "小黃書/8色人體攝影 xchina.co/8se.me", //xhr翻頁模式,翻完所有預覽圖後,立刻在預覽縮圖下面插入全部大圖
        enable: 0,
        reg: /(xchina|8se)\.(co|me)\/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,.slider-ad,.article.ad,.pager>.tips,body>footer~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.customPicDownloadMsg):not(#customPicDownload),.photoMask,.banner_ad{display: none!important;}",
        category: "nsfw2"
    }, {
        name: "小黃書/8色人體攝影 xchina.co/8se.me", //xhr翻頁模式,聚集所有預覽圖,手動插入全部大圖,圖片量是幾百張的比較不會卡,不插大圖也能下載
        enable: 0,
        reg: /(xchina|8se)\.(co|me)\/photo\/id-\w+\.html/,
        include: ".photos>a",
        init: "fun.getNP('.photos>a','.pager a[current=true]+a:not(.next)',null,'.pager');",
        imgs: async () => {
            return [...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,.slider-ad,.article.ad,.pager>.tips,body>footer~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.customPicDownloadMsg):not(#customPicDownload),.photoMask,.banner_ad{display: none!important;}",
        category: "nsfw2"
    }, {
        name: "小黃書/8色人體攝影 xchina.co/8se.me",
        enable: 1,
        reg: /(xchina|8se)\.(co|me)\/photo\/id-\w+\.html/,
        include: ".photos>a",
        imgs: async () => {
            let numP = fun.geT("div[target][title]").match(/\d+/)[0];
            let max = Math.ceil(numP / 18);
            if (max > 1 && [...fun.gae(".photos>a")].length < 19) {
                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", ""));
        },
        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,.slider-ad,.article.ad,.pager>.tips,body>footer~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(.customPicDownloadMsg):not(#customPicDownload):not(a),.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=[^&]+&/, ""));
        },
        insertImg: [
            [".col-photos", 2], 2
        ],
        go: 1,
        customTitle: "return fun.geT('h1.title');",
        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: "return fun.geT('strong');",
        one: 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: "24tupian www.24tupian.org", //無法應對此站的人機驗證,請使用專用腳本 https://greasyfork.org/scripts/464745
        enable: 0,
        reg: /www\.24tupian\.org\/hd2\/\w+\.html/i,
        init: "fun.getNP('.gtps.fl li', '.page.ps>a.on+a[href$=html]', null, '.page.ps')",
        imgs: "js;return fun.getImgA('#imgshow img[alt]', '.gtps.fl a', 1);",
        //imgs: "js;const get=async()=>{await fun.getNP('.gtps.fl li','.page.ps>a.on+a[href$=html]',null,'.page.ps');return fun.getImgA('#imgshow img[alt]','.gtps.fl a',1)};return get();",
        insertImg: [".gtps.fl", 0],
        customTitle: "return fun.geT('.gtitle1 h1');",
        css: ".gtps .CustomPictureDownloadImage{width:auto!important}",
        category: "nsfw1"
    }, {
        name: "JKF www.jkforum.net",
        reg: /www\.jkforum\.net\/thread/,
        imgs: "img[id^=aimg]",
        customTitle: "return 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: () => {
            return fun.geT("h4.f16").replace(/\[\d+P\]$/i, "");
        },
        category: "nsfw2"
    }, {
        name: "X成人论坛 xbbs.me",
        reg: /xbbs\.me\/thread\/id-\w+\.html$/,
        imgs: () => {
            return [...fun.gae(".xbbs-thread-image img[data]")].map(e => e.getAttribute("data"));
        },
        customTitle: () => {
            return fun.geT(".article>h1").trim();
        },
        category: "nsfw2"
    }, {
        name: "驲哔么 ribi.me",
        reg: /ribi\.me\/text\/\d+\/1$/,
        imgs: ".img-fluid",
        customTitle: () => {
            return fun.attr(".img-fluid", "alt").replace(/\[福利COS\]\s?/, "");
        },
        category: "nsfw1"
    }, {
        name: "CoserBOX - 免積分(需要有正確的第一張圖) acg.coserbox.net acg.coser.love coserbox.org  onlyfans.cx picacg.org loli.pub",
        reg: /((coserbox|picacg)\.org|acg\.coser\.love|onlyfans\.cx|loli\.pub|(acg\.)?coserbox\.net)\/image\/\w+(\.html)?/i,
        exclude: "#lightgallery img[data-src][width='540'][height='382']",
        imgs: () => {
            let ps = fun.geT(".list>li:nth-child(2)").match(/\d+/)[0];
            let img = fun.ge("img.lazyload");
            let m = img.dataset.src.match(/^(.+\/)(\d+)(\.[a-z]{3,4})$/i);
            let path = m[1];
            let start = m[2];
            let ex = m[3];
            let arr = [];
            if (start == 0) {
                for (let i = start; i < ps; i++) {
                    arr.push(path + i + ex)
                }
            } else if (start == 1) {
                for (let i = start; i <= ps; i++) {
                    arr.push(path + i + ex)
                }
            } else if (start > 1) {
                for (let i = start; i < (parseInt(start) + parseInt(ps)); i++) {
                    arr.push(path + i + ex)
                }
            }
            return arr;
        },
        insertImg: ["#lightgallery", 2],
        customTitle: "return fun.geT('h1');",
        css: ".plan.plan--best,.ad_card{display:none!important}.article__content img{margin-bottom:2px!important;border-radius:0!important}",
        category: "nsfw2"
    }, {
        name: "优丝库HD - 免VIP yskhd.com",
        reg: /yskhd\.com\/archives\/\d+/i,
        exclude: "#menu-item-57917[class*=current]",
        imgs: () => {
            return [...fun.gae(".article-content img[loading]")].map(e => e.src.replace("-285x285", ""));
        },
        insertImg: [
            [".article-act", 1], 2
        ],
        go: 1,
        autoDownload: [0],
        next: ".article-nav-prev>a",
        prev: ".article-nav-next>a",
        customTitle: () => {
            return fun.geT(".article-title").replace(/\s?\[\d+P\]/i, "");
        },
        category: "nsfw1"
    }, {
        name: "优丝库HD - 日韓免VIP yskhd.com",
        reg: /yskhd\.com\/archives\/\d+/i,
        include: "#menu-item-57917[class*=current]",
        imgs: () => {
            return [...fun.gae(".article-content img[loading]")].map(e => e.src.replace("-285x285", "-scaled"));
        },
        insertImg: [
            [".article-act", 1], 2
        ],
        go: 1,
        autoDownload: [0],
        next: ".article-nav-prev>a",
        prev: ".article-nav-next>a",
        customTitle: () => {
            return fun.geT(".article-title").replace(/\s?\[\d+P\]/i, "");
        },
        category: "nsfw1"
    }, {
        name: "洛花秀 免VIP luohuaxiu.com",
        reg: /luohuaxiu\.com\/archives\/\d+/,
        exclude: ".single-video",
        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 = m[1];
            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) {
                setTimeout(() => {
                    fun.show("此頁不支援免VIP", 5000)
                }, 1100)
                return arr
            } else {
                arr = [...fun.gae(".gallery-item a")].map(e => e.href)
            }
            return arr
        },
        insertImg: [
            [".article-shares", 2], 2
        ],
        go: 1,
        autoDownload: [0],
        next: ".article-nav-prev a",
        prev: ".article-nav-next a",
        customTitle: "return 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: () => {
            return fun.getImgA("#content img", ".pager a:not([title])");
        },
        insertImg: ["#content", 1],
        next: ".prevNews>a",
        prev: ".nextNews>a",
        customTitle: "return fun.geT('h1');",
        css: "#footer~div[id][class]{display:none!important}",
        category: "nsfw2"
    }, {
        name: "Hit-x-Hot www.hitxhot.org www.depvailon.com pic.yailay.com",
        reg: /(www\.hitxhot\.org|www\.depvailon\.com|pic\.yailay\.com)\/(gallerys|articles)\/(?!\?page=|\?m=|hot|top|tag)\w+\.html$/,
        imgs: () => {
            let max;
            try {
                max = fun.geT("h1,h2").match(/\d+$/)[0]
            } catch (e) {
                max = 1
            }
            return fun.getImg(".contentme img,.contentme2 img", max);
        },
        insertImg: [".contentme,.contentme2", 1],
        customTitle: "return document.title.split('|')[0].slice(10).trim()",
        css: "#customPicDownloadEnd{color:rgb(255, 255, 255)}",
        category: "nsfw2"
    }, {
        name: "Hit-x-HotM www.hitxhot.org www.depvailon.com pic.yailay.com",
        reg: /(www\.hitxhot\.org|www\.depvailon\.com|pic\.yailay\.com)\/(gallerys|articles)\/(?!\?page=|\?m=|hot|top|tag)\w+\.html\?m=1$/,
        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");
        },
        insertImg: [".contentme,.contentme2", 1],
        customTitle: "return document.title.split('|')[0].slice(10).trim()",
        css: "#customPicDownloadEnd{color:rgb(255, 255, 255)}",
        category: "nsfw2"
    }, {
        name: "NứngVL.net nungvl.net",
        reg: /nungvl\.net\/gallerys\/\d+\.cg$/,
        imgs: () => {
            let max;
            try {
                max = fun.geT("h1,h2").match(/\d+$/)[0]
            } catch (e) {
                max = 1
            }
            return fun.getImg(".contentme img,.contentme2 img", max);
        },
        insertImg: [".contentme,.contentme2", 1],
        customTitle: "return document.title.split('|')[0].slice(10).trim()",
        css: "#customPicDownloadEnd{color:rgb(255, 255, 255)}",
        category: "nsfw2"
    }, {
        name: "NứngVL.netM nungvl.net",
        reg: /nungvl\.net\/gallerys\/\d+\.cg\?m=1$/,
        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");
        },
        insertImg: [".contentme,.contentme2", 1],
        customTitle: "return document.title.split('|')[0].slice(10).trim()",
        css: "#customPicDownloadEnd{color:rgb(255, 255, 255)}",
        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")
        },
        insertImg: [".view_img", 1],
        autoDownload: [0],
        next: ".pre_next li:first-child a",
        prev: ".pre_next li:last-child a",
        customTitle: "return 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: () => {
            return 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 资源网 cydmyz.com",
        reg: /cydmyz\.com\/\d+\.html/i,
        imgs: "img[data-lazy-src]",
        autoDownload: [0],
        next: "a.entry-page-prev",
        prev: "a.entry-page-next",
        customTitle: "return fun.geT('.entry-title');",
        category: "nsfw2"
    }, {
        name: "秀人集 www.xiuren5.com www.xiuren5.vip www.xiuren5.cc",
        reg: /www\.xiuren\d+\.\w+\/\w+\/\d+\.html/i,
        imgs: () => {
            let max = fun.geT(".page a:last-child", 2);
            return fun.getImg('.content>p img[alt]', max, 3);
            //return fun.getImgO(".content>p img[alt]", max, 3, [null, null], 0, ".page", 0);
        },
        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: "return fun.geT('.item_title>h1');",
        //one: 1,
        css: ".content br{display:none!important}",
        category: "nsfw1"
    }, {
        name: "秀人美女網 www.xrmnw.xyz",
        reg: /www\.xrmnw\.\w+\/\w+\/\d+\/\d+\.html/i,
        imgs: () => {
            let max = fun.geT(".page a:last-child", 2);
            return fun.getImg('.content p img[alt]', max, 3);
            //return fun.getImgO(".content p img[alt]", max, 3, [null, null], 0, ".page", 0);
        },
        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: () => {
            return fun.geT(".item_title>h1").replace(/\d+P$/i, "");
        },
        //one: 1,
        css: ".item_title>a,.content br{display:none!important}",
        category: "nsfw1"
    }, {
        name: "精品美女吧 www.jpmn8.cc",
        reg: /www\.jpmn8\.\w+\/\w+\/\w+\/\d+\.html/i,
        imgs: () => {
            let max = fun.geT(".pagination1 a:last-child", 2);
            return fun.getImg('.content p img[alt]', max, 3);
            //return fun.getImgO(".content p img[alt]", max, 3, [null, null], 0, ".pagination1", 0);
        },
        insertImg: ["//div[p[img[@alt and @title]]]", 2],
        autoDownload: [0],
        next: ".article-nav-next>a[href$=html]",
        prev: ".article-nav-prev>a[href$=html]",
        customTitle: () => {
            return fun.geT(".article-title").replace(/\d+P$/i, "");
        },
        //one: 1,
        category: "nsfw1",
        css: ".content br{display:none!important}"
    }, {
        name: "爱美女网 www.imn5.net www.imn5.cc",
        reg: /www\.imn5\.\w+\/\w+\/\w+\/\d+\.html/i,
        imgs: () => {
            let max = fun.geT(".page a:last-child", 2);
            return fun.getImg('.imgwebp p img[alt]', max, 3);
            //return fun.getImgO(".imgwebp p img[alt]", max, 3, [null, null], 0, ".page", 0);
        },
        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: () => {
            return fun.geT(".focusbox h1+div").replace(/\d+P$/i, "");
        },
        //one: 1,
        css: ".imgwebp br,img[src*='zz2.gif']{display:none!important}",
        category: "nsfw1"
    }, {
        name: "美人图 meirentu.cc",
        reg: /meirentu\.\w+\/pic\/\d+\.html/i,
        imgs: () => {
            let max = fun.geT(".page a:last-child", 2);
            return fun.getImg('.content_left img[alt]', max, 5);
            //return fun.getImgO(".content_left img[alt]", max, 5, [null, null], 0, ".page", 0)
        },
        insertImg: [".content_left", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'下一篇')]/a[contains(@href,'html')]",
        prev: "//span[contains(text(),'上一篇')]/a[contains(@href,'html')]",
        customTitle: () => {
            return fun.geT(".item_title>h1").replace(/\d+P$/i, "");
        },
        //one: 1,
        css: "img[alt]~br{display:none!important}",
        category: "nsfw1"
    }, {
        name: "极品性感美女 www.xgmn08.com",
        reg: /www\.xgmn\d+\.\w+\/\w+\/\w+\.html/i,
        imgs: () => {
            let max = fun.geT("a.current~*:last-child", 2);
            return fun.getImg('.article-content img[alt]', max, 3);
            //return fun.getImgO(".article-content img[alt]", max, 3, [null, null], 0, ".pagination", 0);
        },
        insertImg: ["//p[img[@alt]]", 2],
        autoDownload: [0],
        next: ".article-nav-next>a[href$=html]",
        prev: ".article-nav-prev>a[href$=html]",
        customTitle: () => {
            return fun.geT(".article-title").replace(/\d+p$/i, "");
        },
        //one: 1,
        css: ".article-header>a,.article-content br,img[src*='zz1.gif']{display:none!important}",
        category: "nsfw1"
    }, {
        name: "爱看美女网 www.ikmn.vip",
        reg: /www\.ikmn\.\w+\/\w+\/\d+\.html/i,
        imgs: () => {
            let max = fun.geT(".pagebar>*:last-child", 2);
            return fun.getImg('.info-imtg-box img[alt]', max, 3);
            //return fun.getImgO(".info-imtg-box img[alt]", max, 3, [null, null], 0, ".pagebar", 0);
        },
        include: ".info-pagebar>a",
        insertImg: ["//p[img[@alt]]", 2],
        autoDownload: [0],
        next: ".info-next li:last-child a",
        prev: ".info-next li:first-child a",
        customTitle: () => {
            return fun.geT("h1").replace(/\d+p$/i, "");
        },
        //one: 1,
        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: () => {
            let max = fun.geT(".article-paging>*:last-child");
            return fun.getImg(".article-content img:not([src*='/pic/'])", max, "4");
        },
        insertImg: [
            [".article-paging", 1], 1
        ],
        next: ".article-nav-prev>a",
        prev: 1,
        customTitle: "return 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: "return fun.geT('.article-title');",
        category: "nsfw1"
    }, {
        name: "Xiutaku xiutaku.com",
        reg: /xiutaku\.com\/\d+$/,
        init: () => {
            fun.remove(".search-form~*,.blog~*:not([class]),.pagination~*:not([class]):not(hr),.article.content~*:not([class]):not(hr),.bottom-articles~*")
        },
        imgs: () => {
            let max = fun.geT(".pagination-list>span:last-child");
            return fun.getImg(".article-fulltext img", max);
        },
        insertImg: [".article-fulltext", 1],
        customTitle: "return fun.geT('.article-header>h1');",
        category: "nsfw1"
    }, {
        name: "私图网 baoruba.com",
        reg: /baoruba\.com\/bb\d+\.html/i,
        imgs: "img[decoding]",
        customTitle: "return fun.title(' - 私图网');",
        category: "nsfw1"
    }, {
        name: "找套图 www.zhaotaotu.cc",
        reg: /www\.zhaotaotu\.cc\/thread-\d+\.htm/i,
        imgs: ".message>img:not(:first-of-type)",
        customTitle: () => {
            return fun.geT(".media-body>h4").replace(/\(\d+P\)/i, "");
        },
        category: "nsfw1"
    }, {
        name: "尤美图库 www.umeitu.com",
        reg: /www\.umeitu\.com\/img\/\d+\.html/,
        imgs: () => {
            let max = fun.geT(".stitle>h1>span").match(/\d+/)[0];
            return fun.getImg(".vipimglist img", max, 9)
        },
        insertImg: [".vipimglist", 2],
        customTitle: () => {
            return 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.2mn.cc",
        reg: /www\.2mn\.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);
        },
        insertImg: [".sg_img", 2],
        customTitle: "return fun.geT('h1');",
        css: "#divpsg,.tujia{display:none!important}",
        category: "nsfw1"
    }, {
        name: "麻豆村 Cosplay https://madoucun.com/arttype/56.html",
        reg: /madoucun\.com\/artdetail-\d+.html/i,
        imgs: ".hl-article-box img",
        customTitle: "return fun.geT('.hl-article-title');",
        category: "nsfw2"
    }, {
        name: "Xiuren 秀人网 www.xiuren.org",
        reg: /www\.xiuren\.org\/.+\.html/i,
        imgs: "a[rel='gallery']:not([href*='html']",
        insertImg: [
            [".post p>a:not([title])", 2, ".post p>a[title],.post p>span"], 1
        ],
        customTitle: () => {
            return fun.geT("#title>h1").replace(/\d+p$/i, "").trim();
        },
        category: "nsfw2"
    }, {
        name: "微圖坊 www.v2ph.com www.v2ph.net www.v2ph.ru", //大尺度非VIP只能抓20~30張
        reg: /v2ph\.\w+\/album\/.+/i,
        include: ".photos-list",
        imgs: () => {
            let numP = fun.geT("dd:last-child").match(/\d+/)[0];
            let max = Math.ceil(numP / 10);
            return fun.getImgO(".album-photo img[alt]", max, 1, [null, null], 200, ".pagination", 0);
        },
        insertImg: [".photos-list", 2],
        customTitle: "return fun.geT('h1');",
        css: ".albums-list img,.photos-list img{opacity:1!important}",
        one: 1,
        category: "nsfw2"
    }, {
        name: "柠檬皮 www.cybesx.com",
        reg: /www\.cybesx\.com\/\d+\.html$/i,
        include: ".page-links",
        exclude: ".read-point-box",
        imgs: () => {
            let max;
            try {
                max = fun.geT(".page-links>a:last-child", 2)
            } catch (e) {
                max = 1
            }
            return fun.getImg(".single-content img", max, 7);
        },
        insertImg: [".single-content", 1],
        customTitle: "return fun.geT('h1.entry-title');",
        category: "nsfw1"
    }, {
        name: "柠檬皮 www.cybesx.com",
        reg: /www\.cybesx\.com\/\d+\.html$/i,
        include: ".single-content img",
        imgs: ".single-content img",
        customTitle: "return fun.geT('h1.entry-title');",
        category: "nsfw1"
    }, {
        name: "Cherryfans cherryfans.cc",
        reg: /cherryfans\.cc\/[^/]+\/$/i,
        imgs: ".entry-content img[data-src]",
        insertImg: [".entry-content", 2],
        autoDownload: [0],
        next: "a[rel=prev]",
        prev: "a[rel=next]",
        customTitle: "return fun.geT('h1.entry-title');",
        css: ".entry-featured-media-main{display:none!important}",
        category: "nsfw2"
    }, {
        name: "美图乐 www.meitule.cc",
        reg: /www\.meitule\.cc\/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);
        },
        insertImg: [".content", 2],
        customTitle: "return 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\/meinv\d+\.html/,
        imgs: () => {
            return fun.getImgA(".pic-large", "#scroll>li:not(.current)>a", 3);
        },
        insertImg: ["#pic-meinv", 2],
        autoDownload: [0],
        next: ".group-next>a",
        prev: ".group-prev>a",
        customTitle: "return fun.geT('.ptitle>h1');",
        one: 1,
        category: "nsfw1"
    }, {
        name: "MM1311 www.mm1311.net",
        reg: /www\.mm1311\.net\/\w+\/\d+\.html/,
        imgs: () => {
            let max = fun.geT(".page-ch").match(/\d+/)[0];
            return fun.getImg(".content-pic img", max, 9);
        },
        insertImg: [".content-pic", 1],
        autoDownload: [0],
        next: ".updown_r",
        prev: ".updown_l",
        customTitle: "return fun.geT('.content>h5');",
        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')]
        },
        insertImg: ["#content", 1],
        customTitle: "return fun.geT('.article>h1');",
        category: "nsfw1"
    }, {
        name: "MM5MM5美女图片 www.mm5mm5.com",
        reg: /www\.mm5mm5\.com\/mm\/\d+/,
        imgs: async () => {
            return picinfo[0].split(',')
        },
        insertImg: ["#content", 1],
        customTitle: "return fun.geT('.article>h2');",
        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);
        },
        insertImg: ["//div[a[img]]", 2],
        customTitle: "return fun.geT('.content>h1');",
        css: "union[id],.pag-ts,.contentpage{display:none!important}",
        category: "nsfw1"
    }, {
        name: "3G 壁纸 https://www.3gbizhi.com/meinv",
        reg: /www\.3gbizhi\.com\/meinv\/(\w+\/)?\w+\.html/,
        imgs: () => {
            return fun.getImgA('#contpic', '.swiper-slide:not(:first-child) a');
        },
        insertImg: ["#showimg", 1],
        autoDownload: [0],
        next: "a.next[href$=html]",
        prev: "a.pver[href$=html]",
        customTitle: "return fun.geT('h2.title');",
        css: "#customPicDownloadEnd{color:rgb(255, 255, 255)}.showcontw #showimg{height:auto!important}",
        category: "nsfw1"
    }, {
        name: "亿图全景图库 https://www.yeitu.com/meinv/",
        reg: /(www|m)\.yeitu\.com\/meinv\/\w+\/\w+\.html/,
        imgs: () => {
            let max = fun.geT(".imageset-sum").match(/\/\s?(\d+)/)[1];
            return fun.getImg(".img_box img[alt],.gallery-item img[alt]", max, 3);
        },
        insertImg: [".img_box,.gallery-item", 1],
        customTitle: "return fun.geT('#title>h1,h1.article-title');",
        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);
        },
        insertImg: [".big-pic", 1],
        autoDownload: [0],
        next: ".preandnext:not(.connext)>a",
        prev: ".preandnext.connext>a[href$=htm]",
        customTitle: "return fun.geT('#photos>h1');",
        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);
        },
        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: "return fun.geT('.title>h1');",
        css: "#maincont>div,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\.net\/meinv\/\d+\//,
        imgs: () => {
            let max = fun.geT("a[title],.uk-page>span").match(/\/(\d+)/)[1];
            return fun.getImg(".work-content img[alt],.uk-article-bd img", max, 15);
        },
        insertImg: [".work-content>p,.uk-article-bd", 1],
        customTitle: "return fun.geT('.contitle-box>h1,h1.uk-article-title');",
        css: ".appbox,.uk-page~section{display:none!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")];
            }
        },
        insertImg: [".content", 1],
        autoDownload: [0],
        next: "//a[text()='上一篇']",
        prev: 1,
        customTitle: "return 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")];
        },
        insertImg: [".show-simg", 1],
        autoDownload: [0],
        next: "#playpre",
        prev: 1,
        customTitle: "return fun.geT('.m-article>h1');",
        css: "#bigImg{margin:0px!important}",
        category: "nsfw1"
    }, {
        name: "爱美女 www.2meinv.com",
        reg: /www\.2meinv\.com\/article.+\.html/,
        imgs: () => {
            let max = fun.geT(".des>h1").match(/\/\s?(\d+)/)[1];
            return fun.getImg(".pp.hh img[alt]", max, 5);
        },
        insertImg: [".pp.hh", 1],
        autoDownload: [0],
        next: "//a[@class='active' and contains(text(),'下一篇')]",
        prev: "//a[@class='active' and contains(text(),'上一篇')]",
        css: ".picTip.r5,.page-show>a:not(.active){display:none!important}",
        customTitle: "return fun.title('_',1);",
        category: "nsfw1"
    }, {
        name: "爱美女M wap.2meinv.com",
        reg: /wap\.2meinv\.com\/article-\d+\.html/,
        imgs: () => {
            let max = fun.geT(".article-page>*:last-child", 2);
            return fun.getImg(".arcmain img", max, 5);
        },
        insertImg: [".clearfix.arcmain", 1],
        autoDownload: [0],
        next: "a.f-r[href$=html]",
        prev: "a.f-l.l2[href$=html]",
        css: "body>a{display:none!important}",
        customTitle: "return fun.title('_爱美女',1);",
        category: "nsfw1"
    }, {
        name: "cos在线 www.coszaixian.vip",
        reg: /www\.coszaixian\.vip\/\d+\.html/,
        imgs: ".entry-content img[data-src]",
        autoDownload: [0],
        next: ".post-pre h2>a",
        prev: ".post-next h2>a",
        customTitle: "return fun.geT('.entry-header>h1');",
        category: "nsfw1"
    }, {
        name: "绅士猫 www.cos6.net",
        reg: /www\.cos6\.net\/\d+\.html/,
        imgs: ".wp-posts-content img[data-src]",
        autoDownload: [0],
        next: ".article-nav>div:first-child>a[href$=html]",
        prev: ".article-nav>div:last-child>a[href$=html]",
        customTitle: "return fun.geT('h1.article-title');",
        category: "nsfw1"
    }, {
        name: "COSPLAY ZIP www.coszip.com",
        reg: /www\.coszip\.com\/\d+\.html$/,
        imgs: () => {
            let max = fun.geT(".page_nav.next", 2);
            return fun.getImg("p>img[alt],figure.wp-block-image>img", max, 7);
        },
        //insertImg: ["//p[img[@alt]]", 1],
        insertImg: [
            [".jeg_post_tags", 2], 1
        ],
        autoDownload: [0],
        next: ".prev-post",
        prev: ".next-post",
        customTitle: "return fun.geT('h1.jeg_post_title');",
        css: "pre[style]+p,figure.wp-block-image,.jeg_pagelinks{display:none!important}",
        category: "nsfw2"
    }, {
        name: "COSPLAY ZIP www.coszip.com",
        reg: /www\.coszip\.com\/\d+\.html\?amp=1$/,
        imgs: () => {
            let links = [];
            links.push(location.href);
            let url = location.href.replace(/\?amp=1$/, "");
            let max = fun.geT(".page_nav.next", 2);
            for (let i = 2; i <= max; i++) {
                links.push(url + "/" + i + "?amp=1")
            }
            return fun.getImgA("p>amp-img", links);
        },
        insertImg: ["//p[amp-img]", 1],
        autoDownload: [0],
        next: ".prev-post",
        prev: ".next-post",
        customTitle: "return fun.geT('h1.jeg_post_title');",
        css: "pre[style]+p,figure.wp-block-image,.jeg_pagelinks{display:none!important}",
        category: "nsfw2"
    }, {
        name: "女神社 nshens.com inewgirl.com",
        reg: /(nshens\.com|inewgirl\.com)\/\d+\/\d+\/\d+\/[^/]+$/,
        exclude: ".justify-center>button>.v-btn__content",
        delay: 300,
        imgs: () => {
            fun.show("獲取資料中...", 0);
            let links = [];
            let resArr = [];
            let xhrNum = 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.xhr(links[i], "document").then(doc => {
                    fun.show(`獲取資料中${xhrNum+=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)
            }
            return Promise.all(resArr).then(data => data.flat().map(e => e.photourl))
        },
        insertImg: ["//div[a[div[@class='v-image v-responsive theme--light']]]", 2],
        customTitle: "return fun.geT('h3');",
        category: "nsfw2"
    }, {
        name: "女神社 nshens.com inewgirl.com lovens.cc",
        reg: /(nshens\.com|inewgirl\.com)\/latestpost$/,
        delay: 300,
        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: 300,
        imgs: () => {
            fun.show("獲取資料中...", 0);
            let links = [];
            let resArr = [];
            let xhrNum = 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.xhr(links[i], "document").then(doc => {
                    fun.show(`獲取資料中${xhrNum+=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)
            }
            return Promise.all(resArr).then(data => data.flat())
        },
        insertImg: ["//div[a[div[@class='v-image v-responsive theme--light']]]", 2],
        //css: ".text-center{display:none!important}",
        customTitle: "return fun.geT('h3');",
        category: "nsfw2"
    }, {
        name: "美妹妹 www.meimeimei.org",
        reg: /www\.meimeimei\.org\/\d+\/\d+\/$/,
        imgs: () => {
            let url = fun.ge(".pageCurr").href.replace("1.html", "");
            let max = fun.geT(".chapterpage>a:last-child", 2);
            let links = [];
            for (let i = 1; i <= max; i++) {
                links.push(url + i + ".html");
            }
            return fun.getImgA(".img>img", links)
        },
        insertImg: [".txt_tcontent", 1],
        autoDownload: [0],
        next: "//div[contains(text(),'上一篇')]/a[not(@href='#')]",
        prev: "//div[contains(text(),'下一篇')]/a[not(@href='#')]",
        customTitle: "return fun.geT('.bread>li:last-child>a');",
        category: "nsfw1"
    }, {
        name: "新美图录 www.xinmeitulu.com",
        reg: /www\.xinmeitulu\.com\/photo\/.+/,
        imgs: "img[data-original]",
        customTitle: "return fun.geT('h1.h3');",
        category: "nsfw1"
    }, {
        name: "美图录 meitulu.me",
        reg: /meitulu\.me\/item\/\d+\.html/,
        imgs: () => {
            let max = fun.geT(".pagination>li:last-child", 2);
            return fun.getImg(".mb-4>img[alt]", max, 9);
        },
        insertImg: [".mb-4", 1],
        customTitle: "return fun.geT('.top-title');",
        category: "nsfw1"
    }, {
        name: "秀窝 www.xiuwo.net",
        reg: /www\.xiuwo\.net\/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);
        },
        insertImg: ["#showimg", 1],
        customTitle: "return fun.geT('.weizhi h1');",
        category: "nsfw1"
    }, {
        name: "妹妹图 mm.tvv.tw",
        reg: /mm\.tvv\.tw\/archives\/\d+\.html/,
        imgs: ".img-responsive",
        customTitle: "return fun.geT('.blog-details-headline');",
        category: "nsfw1"
    }, {
        name: "小姐姐 www.nvsheng.cc",
        reg: /nvsheng\.cc\/\w+\/\d+\.html/,
        imgs: () => {
            let max = fun.geT(".pagebar>*:last-child", 3);
            return fun.getImg(".info-imtg-box>img[alt]", max);
        },
        insertImg: [".info-imtg-box", 1],
        autoDownload: [0],
        next: "//a[p[text()='上一篇']]",
        prev: "//a[p[text()='下一篇']]",
        customTitle: "return fun.title('-',1);",
        //one: 1,
        category: "nsfw1"
    }, {
        name: "洛秀网 loxiu.com",
        reg: /loxiu\.com\/post\/\d+\.html/,
        imgs: () => {
            let max = fun.geT(".pagebar>*:last-child", 3);
            return fun.getImg(".info-imtg-box>img[alt]", max);
        },
        insertImg: [".info-imtg-box", 1],
        autoDownload: [0],
        next: "//a[p[text()='上一篇']]",
        prev: "//a[p[text()='下一篇']]",
        customTitle: "return fun.geT('.info-title>h1');",
        category: "nsfw1"
    }, {
        name: "遛无写真 www.6evu.com",
        reg: /www\.6evu\.com\/\d+\.html/,
        imgs: () => {
            let max = fun.geT(".post-page-numbers:last-child");
            return fun.getImg("#post_content img", max, 10);
        },
        insertImg: ["#post_content", 1],
        autoDownload: [0],
        next: "a[rel=prev]",
        prev: "a[rel=next]",
        customTitle: "return fun.geT('h1');",
        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+\/\d+\.html$/,
        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: () => {
            let max = fun.geT(".pagelist font~*:last-child", 2);
            return fun.getImgO("#picg img[alt]", max, 9, [null, null], 200, ".page .pagelist", 0);
        },
        insertImg: ["#picg", 1],
        autoDownload: [0],
        next: "//div[@class='b' and contains(text(),'上一')]/a",
        prev: "//div[@class='b' and contains(text(),'下一')]/a",
        customTitle: () => {
            return fun.geT("h1").replace(/\/(\d+P)?/i, "");
        },
        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>.erweima-text,#qrcode2>center,#d5tig,#pcapicb,#google_translate_element,#d5a>*:not([id]):not([class]){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\.com|www\.sfjpg\.com|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);
        },
        insertImg: ["#picg", 1],
        autoDownload: [0],
        next: "//div[@class='b' and contains(text(),'上一')]/a",
        prev: "//div[@class='b' and contains(text(),'下一')]/a",
        customTitle: () => {
            return fun.geT("h1").replace(/\/(\d+P)?/i, "");
        },
        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: "萌图社 www.446m.com",
        reg: /www\.\d+m\.com\/index\.php\/\w+\/\d+\.html/,
        imgs: ".post-item .img",
        customTitle: "return document.title.slice(0,-6)",
        category: "nsfw1"
    }, {
        name: "妹妹美 mmm.red",
        reg: /(www\.)?mmm\.red\/art\/\d+$/,
        imgs: "div[data-fancybox][data-src]",
        autoDownload: [0],
        next: "//div[text()='上一篇']/following-sibling::a",
        prev: "//div[text()='下一篇']/following-sibling::a",
        customTitle: "return fun.geT('.post-info-text');",
        category: "nsfw1"
    }, {
        name: "秀色女神 www.xsnvshen.co",
        reg: /www\.xsnvshen\.(co|com)\/album\/\d+/,
        imgs: () => {
            return [...fun.gae("img[id^='imglist'][data-original]")].map(e => e.dataset.original.replace("thumb_600x900/", ""));
        },
        insertImg: ["//li[img[@id='bigImg']]", 1],
        customTitle: "return fun.geT('h1')",
        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/", ""]);
        },
        insertImg: ["#arcbox", 1],
        customTitle: "return fun.geT('h1')",
        category: "nsfw1"
    }, {
        name: "HotAsiaGirl hotgirl.asia 分頁模式",
        reg: /hotgirl\.asia\/.+\//,
        include: ".galeria_img",
        imgs: () => {
            return fun.getImgA(".galeria_img>img", ".pagination a[href]");
        },
        insertImg: [".mx-auto", 1],
        customTitle: "return fun.geT('h3');",
        css: ".galeria_img{display:none!important}",
        category: "nsfw2"
    }, {
        name: "HotAsiaGirl hotgirl.asia 幻燈片模式",
        reg: /hotgirl\.asia\/.+\//,
        include: "#carouselImageIndicators",
        imgs: "#carouselImageIndicators img",
        insertImg: [".mx-auto", 1],
        customTitle: "return 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);
        },
        insertImg: [".contents", 1],
        autoDownload: [0],
        next: ".pre>a",
        prev: ".next>a",
        customTitle: () => {
            return fun.geT(".content>h1").replace(/\[\d+P\/\d+M\]/i, "");
        },
        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")];
        },
        insertImg: [".show-simg", 1],
        autoDownload: [0],
        next: () => {
            let next = fun.ge("a.f-r.l3");
            if (next) {
                return next.href
            } else {
                return null
            }
        },
        prev: 1,
        customTitle: () => {
            return fun.geT(".showcontbt>h1").replace(/\s?\(\d+\/\d+\)/, "");
        },
        category: "nsfw1"
    }, {
        name: "Asianude4u www.asianude4u.net",
        reg: /www\.asianude4u\.net\/.+\/.+\/$/,
        imgs: () => {
            let arr = [...fun.gae(".wp-block-image>a,.mgl-img-container>a")].map(e => e.href);
            try {
                arr = arr.sort((a, b) => {
                    return a.split("/").pop().match(/\d+/)[0] - b.split("/").pop().match(/\d+/)[0]
                })
            } catch (e) {
                arr = arr
            }
            return arr;
        },
        //insertImg: ["//li[img[@id='bigImg']]", 1],
        insertImg: [
            ["div.entry>*:last-child", 2], 2
        ],
        go: 1,
        customTitle: "return fun.geT('h1.entry-title')",
        css: ".single-box{display:none!important}",
        category: "nsfw1"
    }, {
        name: "Chinese Beauties sxchinesegirlz.one",
        reg: /sxchinesegirlz\.one\/\d+\/\d+\/\d+\/.+\/$/,
        imgs: () => {
            let max = fun.geT(".pagination>*:last-child", 2);
            return fun.getImg(".wp-block-image img", max, 4);
        },
        insertImg: [".thecontent", 1],
        customTitle: "return 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: () => {
            return 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);
        },
        insertImg: [".main-body", 1],
        autoDownload: [0],
        next: "//a[text()='上一组']",
        prev: 1,
        customTitle: "return fun.geT('.main-title');",
        category: "nsfw2"
    }, {
        name: "好女神网 www.haonvshen.com",
        reg: /www\.haonvshen\.com\/gallery\/\d+\.html/,
        imgs: () => {
            let max;
            try {
                max = fun.geT("#pages>*:last-child", 3)
            } catch (e) {
                max = 1
            }
            return fun.getImg("#hgallery>img", max, 9);
        },
        insertImg: ["#hgallery", 1],
        customTitle: "return fun.geT('#htilte').split(' - ')[0];",
        category: "nsfw1"
    }, {
        name: "Jablehk jablehk.com",
        reg: /jablehk\.com\/\w+/,
        imgs: ".gallery-strips-lightbox-link>img[data-src]",
        autoDownload: [0],
        next: ".item-pagination-link--next",
        prev: ".item-pagination-link--prev",
        customTitle: "return fun.geT('h1>strong');",
        category: "nsfw1"
    }, {
        name: "套图网 taotu.uk",
        reg: /taotu\.uk\/\w+\.html/i,
        imgs: ".entry-content img",
        customTitle: "return fun.geT('.post-title>a');",
        category: "nsfw1"
    }, {
        name: "Taotuxp.com www.taotucc.com",
        reg: /www\.taotucc\.com\/\d+\.html/,
        imgs: () => {
            let max = fun.geT(".pagelist>*:last-child");
            return fun.getImg("#post_content img[alt]", max, 7);
        },
        insertImg: ["#post_content", 1],
        autoDownload: [0],
        next: "a[rel=prev]",
        prev: "a[rel=next]",
        customTitle: "return fun.geT('h1');",
        category: "nsfw1"
    }, {
        name: "MM 范 www.95mm.tv",
        reg: /www\.95mm\.tv\/\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);
        },
        insertImg: [".post", 1],
        autoDownload: [0],
        next: "//div[div[text()='上一组']]/preceding-sibling::div/a",
        prev: "//div[div[text()='下一组']]/preceding-sibling::a",
        customTitle: () => {
            return fun.geT(".post-title").replace(/(\d+\/\d+)$/, "");
        },
        category: "nsfw1"
    }, {
        name: "套圖吧 www.taotu8.xyz",
        reg: /www\.taotu8\.xyz\/(\w+\/\w+\/\w+\.html|\w+\/\d+\.html)/,
        init: "$(document).unbind('keydown');",
        imgs: () => {
            let max = fun.geT("#allnum");
            return fun.getImg(".picsbox img[alt]", max, 9);
        },
        insertImg: [".picsbox center", 1],
        customTitle: () => {
            return fun.geT(".picmainer>h1").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;
        },
        insertImg: ["#content", 1],
        autoDownload: [0],
        next: "#nextbtn>a",
        prev: "#prebtn>a",
        customTitle: "return 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/,
        include: ".sel_enlarge_page",
        imgs: () => {
            return Large_cgurl;
        },
        insertImg: ["#show_cg_html", 2],
        customTitle: () => {
            return fun.geT('.archive-title>h1').replace(/\s?\[\d+p\]|\s?\(\d+p\)/i, "");
        },
        category: "nsfw1"
    }, {
        name: "Xgirls xgirlscollection.com",
        reg: /xgirlscollection\.com\/collection\/\d+/,
        imgs: () => {
            let max;
            try {
                max = fun.geT(".pagination>*:last-child", 2)
            } catch (e) {
                max = 1
            }
            return fun.getImg("img[id].collection-image", max)
        },
        insertImg: ["//div[img[@data-pin-url]]", 1],
        customTitle: "return fun.geT('.container>h1');",
        category: "nsfw1"
    }, {
        name: "SexyAsianGirl www.sexyasiangirl.xyz",
        reg: /www\.sexyasiangirl\.xyz\/album\/\d+\.html/,
        imgs: () => {
            let max;
            try {
                max = fun.geT("span.inline-block").match(/\d+$/)[0]
            } catch (e) {
                max = 1
            }
            return fun.getImg("img.block", max);
        },
        insertImg: ["//div[img[@title]]", 1],
        customTitle: () => {
            return fun.geT("header>h2").replace(/\s?\(\d+\s?photos\s?\)/, "").trim();
        },
        category: "nsfw2"
    }, {
        name: "Nude Bird nudebird.biz",
        reg: /nudebird\.biz\/.+\//,
        imgs: ".thecontent a",
        customTitle: "return fun.geT('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",
        autoDownload: [0],
        next: ".g1-nav-single-next>a",
        prev: ".g1-nav-single-prev>a",
        customTitle: "return fun.geT('h1.entry-title');",
        category: "nsfw2"
    }, {
        name: "Cosplaytele cosplaytele.com",
        reg: /cosplaytele\.com\/[^/]+\//,
        include: "figure.gallery-item",
        imgs: "figure.gallery-item a",
        customTitle: () => {
            return fun.geT("h1.entry-title").replace(/\s?“[^”]+”/, "").trim();
        },
        category: "nsfw2"
    }, {
        name: "Mitaku mitaku.net",
        reg: /mitaku\.net\/.+\/.+\/$/,
        imgs: () => {
            return [...fun.gae(".msacwl-img")].slice(1, -1)
        },
        insertImg: [
            [".article-content", 2], 2
        ],
        autoDownload: [0],
        next: ".previous>a",
        prev: ".next>a",
        customTitle: "return fun.geT('h1.entry-title');",
        category: "nsfw2"
    }, {
        name: "MrCong.com",
        reg: /mrcong\.com\/.+\//,
        imgs: () => {
            let max = fun.geT(".page-link>*:last-child");
            return fun.getImg(".entry img[decoding]", max, 4);
        },
        insertImg: ["//p[img[@decoding]]", 1],
        customTitle: "return fun.geT('h1');",
        category: "nsfw1"
    }, {
        name: "4KHD www.4khd.com",
        reg: /www\.4khd\.com\/\d+\/\d+\/\d+\/.+\.html/,
        imgs: async () => {
            await fun.getNP("#basicExample>a,.wp-block-image", ".current+li>a", null, ".page-link-box");
            return fun.getImgA("#gallery a", "#basicExample>a,.wp-block-image", 0)
        },
        insertImg: [
            [".page-link-box,.wp-block-post-content>*:last-child,#khd", 1, "#basicExample,.wp-block-image"], 2
        ],
        autoDownload: [0],
        next: "a[rel=prev]",
        prev: "a[rel=next]",
        customTitle: () => {
            return fun.geT("h3.wp-block-post-title").replace(/\[(\d+)?mb-\d+photos\]/i, "");
        },
        fetch: 1,
        //one: 1,
        css: ".popup{display:none!important}.CustomPictureDownloadImage{max-width:100%!important}",
        category: "nsfw2"
    }, {
        name: "Forum Girl www.superbeautygirlx.com",
        reg: /www\.superbeautygirlx\.com\/\d+\/\d+\/[^.]+\.html/,
        imgs: ".separator>a",
        next: ".blog-pager-older-link",
        prev: ".blog-pager-newer-link",
        category: "nsfw2"
    }, {
        name: "Buon Dua buondua.com",
        reg: /buondua\.com\/.+photos-\d+$/,
        imgs: () => {
            let max = fun.geT(".pagination-list>span:last-child>a").match(/\d+/)[0];
            return fun.getImg(".article-fulltext img[alt]", max);
        },
        insertImg: [".article-fulltext", 1],
        customTitle: () => {
            return fun.geT(".article-header>h1").replace(/\(\d+\s?photos\s?\)/i, "").trim();
        },
        category: "nsfw2"
    }, {
        name: "BAOBUA.COM",
        reg: /www\.baobua\.net\/post\/.+/,
        imgs: () => {
            let max;
            try {
                max = fun.geT(".nav-links>*:last-child")
            } catch (e) {
                max = 1
            }
            return fun.getImg(".wp-block-image img[alt]", max, 6);
        },
        insertImg: [".entry-content.read-details", 2],
        customTitle: "return fun.title('|',1);",
        category: "nsfw2"
    }, {
        name: "blog.baobua.net",
        reg: /(blog|fb|vn)\.baobua\.net\/\w+\/.+/,
        imgs: "a.fancybox",
        //insertImg: [".article-body", 2],
        insertImg: [
            [".article-body", 2], 2
        ],
        go: 1,
        customTitle: "return 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 vuxinh.com girlxinhxinh.com",
        reg: /(hotgirlchina\.com|theasiagirl\.com|anhsec\.com|sex4viet\.com|cutexinh\.com|vuxinh\.com|girlxinhxinh\.com)\/.+(photos?|videos?|anh)\//,
        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);
        },
        insertImg: [
            [".pagination", 1, ".entry-inner>p:not(#customPicDownloadEnd)"], 2
        ],
        customTitle: () => {
            return fun.geT(".post-title").replace(/\(\d+\s?photos\s?\)|(\s?\(\d+\s?photos?\s?\+\s?\d+\s?videos?\))/, "");
        },
        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);
        },
        insertImg: [
            ["#image_div>*:last-child", 1, "#image_div br,a.imageclick-imgbox"], 1
        ],
        customTitle: () => {
            return 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",
        insertImg: [
            [".rgg-imagegrid", 2], 2
        ],
        go: 1,
        next: "a[rel=prev]",
        prev: "a[rel=next]",
        customTitle: "return  fun.geT('.page-title')",
        category: "nsfw2"
    }, {
        name: "Everia.club",
        reg: /everia\.club\/\d+\/\d+\/\d+\/[^/]+\//,
        imgs: ".wp-block-image img",
        customTitle: "return  fun.geT('h1')",
        category: "nsfw2"
    }, {
        name: "SexyGirl sexygirl.cc",
        reg: /sexygirl\.cc\/a\/\d+\.html/,
        imgs: "div>img.img-fluid",
        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
            }
            return fun.getImg(".entry-content img", max)
        },
        insertImg: [".entry-content", 2],
        customTitle: () => {
            return 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]")]
            }
        },
        insertImg: [".wp-content-ex", 2],
        css: "#rtb,.float-ck-center-lt{display:none!important}",
        category: "nsfw2"
    }, {
        name: "Anh VL xem.anhvl.net",
        reg: /xem\.anhvl\.net/,
        icon: 0,
        key: 0,
        css: "#popupContact,.float-ck-center-lt{display:none!important}",
        category: "nsfw2"
    }, {
        name: "Phym18 phym18.tube https://phym18.tube/tag/%E1%BA%A3nh-sex",
        reg: /phym18\.tube\/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")]
            }
        },
        insertImg: [".ndtruyen", 2],
        css: "#wap_bottombanner{display:none!important}",
        category: "nsfw2"
    }, {
        name: "Porn Pics www.pornpics.com",
        reg: /www\.pornpics\.com\/.*galleries\//,
        imgs: "#tiles a.rel-link",
        insertImg: ["#main", 0],
        customTitle: "return 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]]",
        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]]",
        insertImg: [
            ["#dylan", 2], 1
        ],
        category: "nsfw2"
    }, {
        name: "NongMo.Zone www.ilovexs.com",
        reg: /www\.ilovexs\.com\/post_id\/\d+\//,
        imgs: ".separator img",
        customTitle: "return fun.geT('.entry-title')",
        category: "nsfw2"
    }, {
        name: "idol.gravureprincess.date",
        reg: /idol\.gravureprincess\.date\/\d+\/\d+\/.+\.html/,
        imgs: ".separator img",
        autoDownload: [0],
        next: "a.blog-pager-older-link",
        prev: "a.blog-pager-newer-link",
        customTitle: "return 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: () => {
            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);
            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: () => {
            return fun.geT("h1.entry-title,h2.post-title").replace(/【寫真】|\s?\(\d+P,片\)/gi, "")
        },
        category: "nsfw1"
    }, {
        name: "Gravia gravia.site",
        reg: /gravia\.site\/box\/show\.php\?id=\d+$/,
        imgs: ".slideshow .item>img",
        customTitle: () => {
            return fun.geT(".container>h1").replace(/\s?【\d+枚】/, "")
        },
        category: "nsfw1"
    }, {
        name: "グラビア週刊誌 9 gravurezasshi9.doorblog.jp",
        reg: /gravurezasshi9\.doorblog\.jp\/archives\/\d+\.html(\?ref=)?/,
        imgs: ".article-body-inner>a,#article-contents>a",
        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: "return 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]")].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: "return 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: "return fun.geT('h1.post_title')",
        category: "nsfw2"
    }, {
        name: "JANidolig janidolig.com",
        reg: /janidolig\.com\/\?p=\d+/,
        imgs: ".entry-content img",
        customTitle: "return fun.geT('h1.entry-title')",
        category: "nsfw2"
    }, {
        name: "Gravure Idols gravureidols.top",
        reg: /gravureidols\.top\/\d+\/\d+\/\d+\/[^/]+\//,
        imgs: ".content-inner p>a",
        //insertImg: [".content-inner p", 2],
        autoDownload: [0],
        next: "a.prev-post",
        prev: "a.next-post",
        customTitle: "return fun.geT('.jeg_post_title')",
        category: "nsfw2"
    }, {
        name: "復刻書林 reprint-kh.com",
        reg: /reprint-kh\.com\/archives\/\d+/,
        imgs: ".tiled-gallery a",
        insertImg: [
            [".single-post-main>.share", 2], 2
        ],
        go: 1,
        autoDownload: [0],
        next: ".previous_post>a",
        prev: ".next_post>a",
        customTitle: () => {
            return fun.geT(".single-post-title").replace(/\d+photos/, "").trim()
        },
        category: "nsfw2"
    }, {
        name: "芸能アイドルモデル女優水着画像集 www.mizugigurabia.com",
        reg: /www\.mizugigurabia\.com\/blog-entry-\d+\.html/,
        imgs: "#more>p>a:not([href*=amazon])",
        insertImg: ["//p[a[img[@alt]]]", 2],
        autoDownload: [0],
        next: ".prev+a",
        prev: ".next+a",
        customTitle: "return fun.geT('.article-title a').trim()",
        category: "nsfw1"
    }, {
        name: "MIC MIC IDOL www.micmicidol.club",
        reg: /www\.micmicidol\.club\/\d+\/\d+\/.+\.html/,
        imgs: ".entry-content a[href]",
        customTitle: "return fun.geT('.entry-title').trim()",
        category: "nsfw2"
    }, {
        name: "Kemono https://kemono.party/fantia/user/17148/post/1633768 coomer.party",
        reg: /(kemono\.party|coomer\.party)\/.+post/,
        imgs: "a.fileThumb.image-link",
        insertImg: [".post__files", 2],
        autoDownload: [0],
        next: "a.next",
        prev: "a.prev",
        customTitle: "return fun.geT('.post__title')",
        one: 1,
        category: "nsfw2"
    }, {
        name: "半次元 bcy.net",
        reg: /bcy\.net\/item\/detail\/\d+\?_source_page=\w+/,
        imgs: ".inner-container img",
        customTitle: "return fun.title(' - ',1)",
        category: "none"
    }, {
        name: "凸凹吧/撸女吧/女优吧/撸哥吧/欲女吧 www.tuao.one,www.63mm.cc,www.97mm.cc,www.luge8.co,luge8.co",
        reg: /(www\.)?(tuao8?|tumm|\d+mm|luge8?)\.[a-z]{2,3}\/(post|web)\//,
        imgs: () => {
            let max = fun.geT(".next-page", 2);
            return fun.getImg(".entry img[title],.article-content img[title]", max);
        },
        insertImg: ["//p[a/img[@title]]", 1],
        autoDownload: [0],
        next: "#postnavi>*:first-child>a",
        prev: "#postnavi>*:last-child>a",
        customTitle: "return fun.geT('h1.title,h1.article-title');",
        css: "body>div[style*=fixed]{display: none!important;}",
        category: "nsfw2"
    }, {
        name: "套图之家 taotuhome.com",
        reg: /taotuhome\.com\/\d+\.html/i,
        imgs: () => {
            let max;
            try {
                max = fun.geT(".page-links>*:last-child", 2)
            } catch (e) {
                max = 1
            };
            return fun.getImg(".single-content img[alt]", max, 7);
        },
        insertImg: [".single-content", 1],
        autoDownload: [0],
        next: "a[rel=prev]:not([href^=j])",
        prev: "a[rel=next]:not([href^=j])",
        customTitle: "return fun.geT('.entry-title').replace('-套图之家','');",
        category: "nsfw1"
    }, {
        name: "俊美图 www.meijuntu.com www.jeya.de",
        reg: /(www\.meijuntu\.com|www\.jeya\.de)\/\w+\/\w+\.html/i,
        imgs: () => {
            let max;
            try {
                max = fun.geT("#pages>*:last-child", 2)
            } catch (e) {
                max = 1
            };
            return fun.getImg(".pictures img[alt]", max, 5);
        },
        insertImg: [".pictures", 1],
        autoDownload: [0],
        next: "//span[contains(text(),'下一')]/following-sibling::a",
        prev: "//span[contains(text(),'上一')]/following-sibling::a",
        customTitle: "return fun.geT('h1.title');",
        category: "nsfw1"
    }, {
        name: "美女图片网 www.mevtu.com",
        reg: /www\.mevtu\.com\/\w+\/\d+\.html/i,
        include: ".next-cat",
        imgs: () => {
            let max;
            try {
                max = fun.geT('.nav-links>*:last-child', 2)
            } catch (e) {
                max = 1
            };
            return fun.getImg('#image_div img[alt]', max, 9);
        },
        insertImg: [".content", 1],
        autoDownload: [0],
        next: ".post_hyh>a",
        prev: 1,
        customTitle: () => {
            return fun.geT(".item_title>h1").replace(/\(\d+P\)/i, "");
        },
        category: "nsfw1"
    }, {
        name: "美女图片网 美图分享 www.mevtu.com",
        reg: /www\.mevtu\.com\/picture\/\d+\.html/i,
        imgs: "img.alignnone",
        customTitle: "return fun.geT('.item_title>h1');",
        category: "nsfw1"
    }, {
        name: "x6o https://www.x6o.com/topics/14#articles",
        reg: /www\.x6o\.com\/articles\/\d+/,
        delay: 300,
        imgs: ".content img",
        customTitle: () => {
            return 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",
        insertImg: [".m-list-content", 1],
        autoDownload: [0],
        next: ".sxpage_l>a",
        prev: 1,
        customTitle: () => {
            return fun.geT(".m-list-tools>h2").replace(/\/?\(\d+P\)/i, "");
        },
        category: "nsfw1"
    }, {
        name: "硬盘少女 diskgirl.com",
        reg: /diskgirl\.com\/image\/\w+/,
        imgs: "a[data-fancybox]",
        customTitle: () => {
            return fun.geT(".image-title").replace(/\[\d+(\+\d+)?PB?\]|\(\d+(\+\d+)?PB?\)/i, "");
        },
        category: "nsfw1"
    }, {
        name: "图宅网 www.tuzac.com",
        reg: /www\.tuzac\.com\/file\/.+/,
        imgs: async () => {
            let a = fun.ge("#the-photo-link");
            a.outerHTML = a.innerHTML;
            await fun.getNP("#fdp-photo img", ".page-curr+a", null, "#pager", 0, null, 0);
            return [...fun.gae("#fdp-photo img")]
        },
        insertImg: ["#fdp-photo", 2],
        customTitle: () => {
            return 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: "嘿~色女孩 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");
        },
        insertImg: [".entry-container", 2],
        autoDownload: [0],
        next: ".nav-previous>a",
        prev: ".nav-next>a",
        customTitle: () => {
            return 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: () => {
            return [...fun.gae(".entry-content img[data-srcset]")].map(e => e.dataset.srcset);
        },
        customTitle: () => {
            return 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",
        reg: /(myjkwd\.com|534798\.xyz)\/e\/action\/ShowInfo\.php/i,
        include: ".entry img",
        imgs: () => {
            let max = fun.geT("a[title=总数]");
            return fun.getImg(".entry img", max, 8);
        },
        insertImg: ["//div[@class='entry']//img/parent::*", 1],
        autoDownload: [0],
        next: "//p[contains(text(),'上一')]/a",
        prev: "//p[contains(text(),'下一')]/a",
        customTitle: "return 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",
        reg: /www\.\d+tyu\.com\/e\/action\/ShowInfo\.php/i,
        imgs: "img[id^='aimg']",
        autoDownload: [0],
        next: "//p[contains(text(),'上一')]/a",
        prev: "//p[contains(text(),'下一')]/a",
        customTitle: () => {
            return fun.geT(".contitle").replace(/【\d+P】/i, "");
        },
        category: "nsfw2"
    }, {
        name: "写真圣地 www.xzsd1.com",
        reg: /www.xzsd\d\.com\/.+\/.+\/$/i,
        imgs: "img[decoding]",
        autoDownload: [0],
        next: ".navigation-left>a",
        prev: ".navigation-right>a",
        customTitle: "return fun.geT('#breadcrumbs>h1');",
        category: "nsfw2"
    }, {
        name: "羞涩姬 xiuseaa.com xiusea.com",
        reg: /(xiuseaa?\.com)\/index\.php\/art\/detail\/id\/\d+\.html$/i,
        imgs: ".embed-responsive>img",
        customTitle: () => {
            return fun.geT("h1.h3").replace(/\[\d+P\]/i, "");
        },
        category: "nsfw2"
    }, {
        name: "小姐姐图库 xjjtk.link",
        reg: /xjjtk\.link\/posts\/\w+\/$/i,
        imgs: "img.block",
        customTitle: "return fun.geT('h1');",
        category: "nsfw2"
    }, {
        name: "AVJB https://avjb.com/albums/",
        reg: /avjb\.com\/albums\/\d+\/[\w-]+\/$/i,
        imgs: ".images>a",
        insertImg: [
            [".sponsor", 2], 2
        ],
        go: 1,
        customTitle: "return fun.geT('.headline>h1');",
        category: "nsfw2"
    }, {
        name: "Asian To Lick asiantolick.com",
        reg: /asiantolick\.com\/post/,
        imgs: "div[data-src]",
        insertImg: [
            ["#categoria_tags_post", 1], 2
        ],
        go: 1,
        customTitle: "return fun.geT('h1');",
        css: "#touch_to_see{display:none!important}",
        category: "nsfw2"
    }, {
        name: "Models Vibe www.modelsvibe.com",
        reg: /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);
            }
        },
        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]")) {
                return [...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]
                });
            } else {
                return [...fun.gae(".td-post-content img")]
            }
        },
        insertImg: [".td-post-content", 2],
        customTitle: "return fun.geT('h1.tdb-title-text');",
        category: "nsfw1"
    }, {
        name: "goddess247.com",
        reg: /goddess247\.com\/.+\//,
        imgs: ".elementor-widget-container p img[alt]",
        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",
        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",
        customTitle: () => {
            return fun.geT("h1.post-title").replace(/\s?\(\d+\s?photos(\s?\+\s?\d+\s?videos?)?\)/i, "");
        },
        category: "nsfw1"
    }, {
        name: "www.4kup.net",
        reg: /www\.4kup\.net\/\d+\/\d+\/[\w-]+\.html$/,
        imgs: "a.thumb-photo",
        //insertImg: ["#gallery", 1],
        insertImg: [
            ["#single-content", 2], 2
        ],
        go: 1,
        autoDownload: [0],
        next: ".next-page",
        prev: 1,
        customTitle: "return fun.geT('h1');",
        category: "nsfw2"
    }, {
        name: "牛C网导航|就爱你导航 美圖 niuc3.com",
        reg: /niuc\d\.com\/\d+\.html/,
        include: ".page-nav",
        imgs: () => {
            let max = fun.geT(".page-nav>*:last-child", 3);
            return fun.getImg("[class*='wp-image']", max, 5);
        },
        insertImg: ["//p[a[img[@decoding]]]", 1],
        next: "a.near-permalink",
        prev: 1,
        customTitle: "return fun.title('|',1)",
        css: "#io-popup-tips,.post-apd{display: none!important;}",
        category: "nsfw2"
    }, {
        name: "牛C网导航|就爱你导航 美圖 niuc3.com",
        reg: /niuc\d\.com\/\d+\.html/,
        imgs: ".panel-body a.js",
        next: "a.near-permalink",
        prev: 1,
        customTitle: "return fun.title('|',1)",
        css: "#io-popup-tips,.post-apd{display: none!important;}",
        category: "nsfw2"
    }, {
        name: "Fliporn fliporn.biz",
        reg: /fliporn\.biz\/videos\//,
        imgs: ".entry-content img[data-src]",
        customTitle: () => {
            return document.title.replace(/\s?\[\d+P\]/i, "")
        },
        category: "nsfw2"
    }, {
        name: "人妻租借所 jingunav.info",
        reg: /jingunav\.info\/index\.php\/artdetail-\d+\.html/,
        imgs: ".embed-responsive img",
        customTitle: () => {
            return fun.title(/ - 貼圖| - 歐美美女/, 1).replace(/【\d+P】\s?\n?/i, "").replace(/\s?完整版無水印寫真/, "")
        },
        css: "body>.wrap{display:none!important}",
        category: "nsfw2"
    }, {
        name: "ACGN小鎮 www.bbsacgn.com",
        reg: /www\.bbsacgn\.com\/archives\/\d+/,
        imgs: ".entry-content img",
        autoDownload: [0],
        next: ".entry-page-prev",
        prev: ".entry-page-next",
        customTitle: "return fun.geT('h1.entry-title')",
        category: "nsfw1"
    }, {
        name: "皮皮动漫社 pipidm.top www.pipidm.top",
        reg: /pipidm\.top\/\d+\.html/,
        imgs: ".content_left img",
        autoDownload: [0],
        next: ".entry-page-prev",
        prev: ".entry-page-next",
        customTitle: "return fun.geT('h1.entry-title')",
        category: "nsfw1"
    }, {
        name: "成人图片 Qinimg www.qinimg.com",
        reg: /www\.qinimg\.com\/image\/\d+\.html/,
        imgs: "#image a",
        insertImg: [
            ["#image", 2], 2
        ],
        go: 1,
        customTitle: () => {
            return 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: () => {
            return 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\/.+\//,
        imgs: ".list-gallery a",
        insertImg: [
            [".list-gallery", 2], 2
        ],
        go: 1,
        customTitle: "return fun.geT('h1.header-inline')",
        category: "nsfw2"
    }, {
        name: "FreeXcafe www.freexcafe.com",
        reg: /www\.freexcafe\.com\/erotica\/[\w-]+\/[\w-]+\/index\.php/,
        imgs: () => {
            return fun.getImgA('#imagelink>img', '.thumbs>a')
        },
        insertImg: [
            ["#content>*:last-child", 2], 2
        ],
        category: "nsfw2"
    }, {
        name: "FreeXcafe www.freexcafe.com",
        reg: /www\.freexcafe\.com\/erotica\/[\w-]+\/[\w-]+\/index\.php/,
        imgs: () => {
            return fun.getImgA("#imagelink>img", ".thumbs>a")
        },
        insertImg: [
            ["#content>*:last-child", 2], 2
        ],
        category: "nsfw2"
    }, {
        name: "EPORNER Photo www.eporner.com/profile/namaiki/ www.eporner.com/profile/janekhansen/",
        reg: /\w{2,3}\.eporner\.com\/gallery\/.+\//,
        imgs: () => {
            return [...fun.gae("#container img")].map(e => e.src.replace("_296x1000", ""));
        },
        //insertImg: ["#container #container", 2],
        insertImg: [
            [".photosgrid", 2], 2
        ],
        go: 1,
        customTitle: "return fun.geT('#galleryheader>h1')",
        //css: "#container.photosgrid{display:block!important}",
        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",
        insertImg: [
            [".album-holder", 2], 2
        ],
        go: 1,
        customTitle: () => {
            return fun.geT('.headline>h1');
        },
        css: ".block-album{display:block!important}.block-album>.table,.footer~*:not(.customPicDownloadMsg):not(#customPicDownload){display:none!important}",
        category: "nsfw2"
    }, {
        name: "Xasiat loadMore www.xasiat.com/albums/",
        reg: /www\.xasiat\.com\/albums\//,
        include: "#list_albums_common_albums_list_pagination",
        init: () => {
            setInterval(() => {
                fun.remove("//div[iframe] | //iframe")
            }, 300);
        },
        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 += 16) {
                let res = fetch(links[i]).then(res => res.text()).then(res => {
                    fun.show(`獲取資料中${fetchNum+=1}/${Math.ceil(links.length/16)}`, 0);
                    let doc = fun.doc(res);
                    return JSON.parse(fun.ge("#initials-script", doc).innerHTML.replace(/window.initials=|;/g, "")).photosGalleryModel.photos.items
                });
                resArr.push(res)
            }
            return Promise.all(resArr).then(data => data.flat().map(e => e.imageURL))
        },
        init: "fun.remove('.mixed-list>.flex-element')",
        insertImg: [
            ["main>article", 2], 2
        ],
        go: 1,
        customTitle: "return fun.geT('.page-title h1')",
        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)
        },
        insertImg: [".items[data-role=gallery-photos]", 1],
        customTitle: "return fun.geT('h1.page-title')",
        css: ".items[data-role=gallery-photos]>.item-container{width:100%!important}aside[data-role=yld-mdtop],.yld-md--bottom{display:none!important}",
        category: "nsfw2"
    }, {
        name: "PornHub photo pornhub.com/albums", //很容易會被短暫封IP
        enable: 1,
        reg: /pornhub\.com\/album\/\d+/,
        //imgs: "js;return fun.getImgA('#photoImageSection img', '.js_lazy_bkg a',[2,1000]);",
        imgs: "js;return fun.getImgA('#photoImageSection img', '.js_lazy_bkg a');",
        insertImg: [
            [".photoBlockBox .clear", 1], 1
        ],
        go: 1,
        customTitle: "return fun.geT('.photoAlbumTitleV2').trim()",
        category: "nsfw2"
    }, {
        name: "PicHunter www.pichunter.com",
        reg: /www\.pichunter\.com\/gallery\/\d+\/.+/,
        imgs: ".flex-images figure>a",
        insertImg: [
            [".flex-images", 2], 1
        ],
        customTitle: "return fun.geT('h1')",
        category: "nsfw2"
    }, {
        name: "Pictoa www.pictoa.com",
        reg: /www\.pictoa\.com\/(thumbs|albums)\/.+\.html/i,
        imgs: () => {
            return [...fun.gae(".thumb-nav img[data-src]")].map(e => e.dataset.src.replace("thumbs/", ""));
        },
        insertImg: ["#player", 1],
        customTitle: "return 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]")]
        },
        insertImg: [
            [".summary", 2], 2
        ],
        go: 1,
        customTitle: "return 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",
        insertImg: [
            [".albaums-box", 1], 2
        ],
        go: 1,
        customTitle: "return fun.title('|',1)",
        category: "nsfw2"
    }, {
        name: "Pornpaw 圖片清單頁 www.pornpaw.com",
        reg: /www\.pornpaw\.com\/gallery\/[\w-]+\.html/i,
        imgs: () => {
            return [...fun.gae("img[data-src]")].map(e => e.dataset.src.replace("x160.", "."));
        },
        insertImg: [
            [".container>.row", 2], 2
        ],
        go: 1,
        customTitle: "return 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 = parseInt(fun.ge("a.prev[title=Previous]").href.split("#")[1]) + 1;
            await fun.waitEle(".image-wrapper img");
            let arr = [];
            arr.push(fun.ge(".image-wrapper img").cloneNode(true));
            fun.show(`獲取圖片中1/${max}`, 0);
            let n = 1;
            for (let i = 1; i < max; i++) {
                fun.ge("a.next[title=Next]").click();
                await fun.delay(200, 0);
                if (await fun.waitEle(".image-wrapper img")) {
                    arr.push(fun.ge(".image-wrapper img").cloneNode(true));
                    fun.show(`獲取圖片中${n+=1}/${max}`, 0);
                }
            }
            return arr
        },
        insertImg: [".mainouter", 1],
        category: "nsfw2"
    }, {
        name: "fuskator.com 圖片清單頁",
        reg: /fuskator\.com\/thumbs\/[\w-~]+\/[\w-~]+\.html/i,
        imgs: async () => {
            fun.show("等待關鍵元素中...", 0);
            await fun.waitEle(".pic_pad");
            fun.hide();
            return [...fun.gae("#thumbimages a")];
        },
        insertImg: [
            ["//a[text()='View full images']", 2], 2
        ],
        go: 1,
        //customTitle: "return fun.geT('#info+h1')",
        category: "nsfw2"
    }, {
        name: "fuskator.com 大圖頁",
        reg: /fuskator\.com\/[\w-]+\/[\w-~]+\/index\.html/i,
        imgs: "img.full",
        category: "nsfw2"
    }, {
        name: "javbangers.com",
        reg: /www\.javbangers\.com\/albums\/.+/,
        imgs: ".images a",
        insertImg: [
            [".album-info", 2], 2
        ],
        go: 1,
        customTitle: "return fun.geT('.headline>h1').trim()",
        category: "nsfw2"
    }, {
        name: "multi.xnxx.com",
        reg: /multi\.xnxx\.com\/gallery\/.+/,
        imgs: ".galleryPage .boxImg",
        insertImg: [
            [".originalLink", 2], 1
        ],
        go: 1,
        category: "nsfw2"
    }, {
        name: "色情圖片網 www.photos18.com",
        reg: /www\.photos18\.com\/\w+\/\w+/i,
        imgs: ".imgHolder a[data-fancybox]",
        insertImg: ["#content", 1],
        customTitle: () => {
            return 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]",
        insertImg: [".sponsor", 2],
        customTitle: "return fun.geT('.headline>h1')",
        css: ".top{display:none!important}",
        category: "nsfw2"
    }, {
        name: "BuzzAV www.buzzav.com",
        reg: /www\.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/", ""))
        },
        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;}#customPicDownloadEnd{color:rgb(255, 255, 255)}",
        css: "#customPicDownloadEnd{color:rgb(255, 255, 255)}",
        category: "nsfw2"
    }, {
        name: "Hentai Image hentai-img.com hentai-cosplays.com porn-images-xxx.com",
        reg: /(hentai-img|hentai-cosplays|porn-images-xxx)\.com\/image\/[^/]+\/$/,
        include: "//a[text()='DETAIL PAGE' or text()='詳細へ' or text()='详细信息页面']",
        imgs: () => {
            let max;
            try {
                max = fun.geT("//span[a[text()='next' or text()='次へ' or text()='下一个']]/preceding-sibling::span[1]");
            } catch (e) {
                try {
                    max = fun.geT("#page h3").match(/\d+$/)[0];
                } catch (e) {
                    max = 1;
                }
            }
            let links = [];
            let mode = location.href.split("/").slice(0, -1).pop();
            let url = location.href.replace(/[\w-]+\/$/i, "");
            for (let i = 1; i <= max; i++) {
                if (/image/.test(mode)) {
                    links.push(url + "image-" + String(i).padStart(3, "0") + "/")
                } else {
                    links.push(url + i + "/")
                }
            }
            return fun.getImgA("#display_image_detail img,#detail_list img", links, 0, [/\/p=(700|305)/, ""]);
            //return fun.getImg("#display_image_detail img,#detail_list img", max, 14, [/\/p=(700|305)/, ""]);
        },
        insertImg: ["#display_image_detail,#detail_list", 2],
        customTitle: () => {
            return fun.geT("#title>h2,#page h3").replace(/\s?Photo\s?\d+P/i, "").replace(/\s?-\s?\d+\/\d+\s?/, "").trim();
        },
        category: "nsfw2"
    }, {
        name: "Hentai Image hentai-img.com hentai-cosplays.com porn-images-xxx.com",
        reg: /(hentai-img|hentai-cosplays|porn-images-xxx)\.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: () => {
            let max;
            try {
                max = fun.geT("#paginator>*:last-child", 3);
            } catch (e) {
                try {
                    max = fun.geT(".paginator_page[rel=next]", 2);
                } catch (e) {
                    max = 1;
                }
            }
            return fun.getImg(".icon-overlay img", max, 18, [/\/p=(700|305)/, ""]);
        },
        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: () => {
            return fun.geT("#title>h2,#page h3").replace(/\s?Photo\s?\d+P/i, "").trim();
        },
        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]]")
        },
        insertImg: [".fcon+.fapad", 1],
        next: "//a[contains(text(),'next photos')]",
        prev: 1,
        category: "nsfw2"
    }, {
        name: "SMUTPOND www.smutpond.com",
        reg: /www\.smutpond\.com\/gallery-pics\/\?uid=/i,
        imgs: "img[alt=Pic]",
        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",
        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",
        insertImg: [
            [".gallery-info", 2], 1
        ],
        go: 1,
        category: "nsfw2"
    }, {
        name: "Eropics",
        reg: /eropics\.to\/\d+\/\d+\/\d+\/[\w-]+$/i,
        include: "a[href*='pixhost.to'],a[href*='www.turboimagehost.com'],a[href*='vipr.im'],a[href*='imgbox.com'],a[href*='www.imagevenue.com']",
        imgs: () => {
            if (fun.gae("a[href*='imx.to']").length > 3) {
                let yes = confirm("是否複製鏈接至剪貼簿");
                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("已複製鏈接至剪貼簿");
                }
                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(`獲取圖片中${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);
        },
        insertImg: [
            [".entry-footer", 2], 2
        ],
        go: 1,
        referrerpolicy: 0,
        customTitle: "return fun.geT('h1.entry-title');",
        category: "nsfw2"
    }, {
        name: "Eropics",
        reg: /eropics\.to\/\d+\/\d+\/\d+\/[\w-]+$/i,
        include: "a[href*='imx.to']",
        init: () => {
            fun.show("只有複製鏈接功能", 5000);
        },
        imgs: () => {
            return [...fun.gae(".entry-content p>a")].map(a => a.href);
        },
        category: "nsfw2"
    }, {
        name: "imx.to gallery",
        reg: /https?:\/\/imx\.to\/g\/\w+$/i,
        imgs: () => {
            return [...fun.gae("img.imgtooltip")].map(e => e.src.replace("/u/t/", "/u/i/"));
        },
        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: "Bunkr bunkr-albums.io",
        reg: /bunkr\.la\/a\/\w+/,
        imgs: ".grid-images_box a:not([href*=mp4]):not([href*=rar]):not([href*=zip])",
        insertImg: [
            [".grid-images", 2], 2
        ],
        go: 1,
        category: "nsfw2"
    }, {
        name: "Ngắm Gái Xinh ngamgaixinh.us",
        reg: /ngamgaixinh\.us\/[^/]+\/$/,
        imgs: () => {
            return [...fun.gae(".wp-block-gallery 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]
            });
        },
        insertImg: [
            [".penci-single-link-pages", 2], 2
        ],
        go: 1,
        category: "nsfw2"
    }, {
        name: "Degoo Cloud app.degoo.com",
        reg: /^https?:\/\/app\.degoo\.com\/share\//,
        imgs: async () => {
            let max = prompt("請輸入圖片抓取最大次數", "100");
            let img = ".preview-media .hidden";
            await fun.waitEle(img);
            let arr = [];
            arr.push(fun.ge(img).cloneNode(true));
            fun.show(`獲取圖片中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(`獲取圖片中${n+=1}/${max}`, 0);
                }
            }
            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)\./, "."));
        },
        insertImg: [
            [".navigationBar", 2], 2
        ],
        go: 1,
        category: "nsfw2"
    }, {
        name: "cn.angirlz.com",
        reg: /https?:\/\/\w{2}\.angirlz\.com\/album\/\w+/,
        imgs: "img[data-lg-item-id]",
        customTitle: "return fun.geT('h1');",
        category: "nsfw2"
    }, {
        name: "bunnyxgirl.com letsgirlz.com",
        reg: /https?:\/\/(bunnyxgirl|letsgirlz)\.com\/[^/]+\/.+/,
        include: ".separator>a",
        imgs: ".separator>a",
        customTitle: "return fun.geT('.breadcrumbs>span:last-child');",
        category: "nsfw2"
    }, {
        name: "cn.bunnyxgirl.com cn.letsgirlz.com cn.bestxleg.com",
        reg: /https?:\/\/\w{2}\.(bunnyxgirl|letsgirlz|bestxleg)\.com\/[^/]+\/\w+/,
        include: ".separator>a",
        imgs: () => {
            let max;
            try {
                max = fun.geT(".nav-links>*:last-child", 2)
            } catch (e) {
                max = 1
            }
            return fun.getImg(".separator>a", max, 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(.CustomPictureDownloadImage):not(#customPicDownloadEnd)"], 1
        ],
        customTitle: "return fun.geT('.breadcrumbs>span:last-child');",
        category: "nsfw2"
    }, {
        name: "kawaiix.com kawaiixpic.com www.peachgirlz.com peachgirlz.com pantyxart.com beautyxpic.com cutexpic.com assgirlz.com beautifulmetas.com pantyxgirl.com greatxpic.com xartpic.com perfectxpic.com bestxboobs.com artthong.com hotbeautypic.com",
        reg: /https?:\/\/(r18\.|www\.)?(kawaiix|kawaiixpic|peachgirlz|pantyxart|beautyxpic|cutexpic|assgirlz|beautifulmetas|pantyxgirl|greatxpic|xartpic|perfectxpic|bestxboobs|artthong|hotbeautypic)\.com\/[^/]+\/.+/,
        include: "//a[@data-title and picture/source]",
        imgs: "//a[@data-title and picture/source]",
        customTitle: () => {
            return fun.title(/( - Kawa| - Peach| - Panty| - Beauty| - Cute| - Ass| - Beaut| - Great| - Xart| - Perfect| - Art)/i, 1).replace(/\s?\(\d+\s?photos\)/, "").trim();
        },
        category: "nsfw2"
    }, {
        name: "cn.kawaiix.com cn.kawaiixpic.com cn.peachgirlz.com cn.pantyxart.com cn.beautyxpic.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",
        reg: /https?:\/\/\w{2}\.(kawaiix|kawaiixpic|peachgirlz|pantyxart|beautyxpic|cutexpic|perfectxbody|sexyqgirl|bestxhips|bestxass|assgirlz|bestxbum|adultmetas|eroticxpic|xxxthong|thongxgirl|bestxlingerie|sexyxart|hotxhips|hotbeautypic)\.com\/[^/]+\/\w+/,
        include: "//a[@data-title and picture/source]",
        imgs: () => {
            let max;
            try {
                max = fun.geT(".nav-links>*:last-child", 2)
            } catch (e) {
                max = 1
            }
            return fun.getImg("//a[@data-title and picture/source]", max, 16);
        },
        insertImg: [".hero+.hero,.entry-content,.d-flex>.col-24,.album-post", 1],
        customTitle: "return fun.geT('.entry-title,.album-title,.album-post-title,.col-12>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: () => {
            let max = fun.gae(".p_select option").length;
            return fun.getImg(".tal a>img[alt]", max, 11);
        },
        insertImg: [".tal", 1],
        category: "nsfw2"
    }, {
        name: "gogo人体艺术M2",
        reg: /\/(m)\.(98ah|02aj|139tu)\.com\/\w+\/(\d+\/)?\d+\.html$/i,
        imgs: () => {
            let max = fun.gae(".p_select option").length;
            return fun.getImg(".tal a>img[alt]", max, 9);
        },
        insertImg: [".tal", 1],
        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);
        },
        insertImg: [".tal", 1],
        customTitle: "return 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);
        },
        insertImg: ["//div[contains(@class,'main')]/div/a/parent::* | //div[contains(@class,'content') and a/img[@alt]]", 1],
        autoDownload: [0],
        next: ".crc_l_pic.left>a:not([href^=j])",
        prev: ".crc_r_pic.right>a:not([href^=j])",
        customTitle: "try{return fun.geT('.content_title')}catch(e){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);
        },
        insertImg: ["//div[contains(@class,'main')]/div[a/img[@alt]]", 1],
        autoDownload: [0],
        next: ".crc_l_pic.left>a:not([href^=j])",
        prev: ".crc_r_pic.right>a:not([href^=j])",
        customTitle: "return 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);
        },
        insertImg: ["//div[@class='imgbox' and a/img[@alt]]", 1],
        customTitle: "return fun.geT('.contitle h1>a');",
        css: "#customPicDownloadEnd{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]")
        },
        //insertImg: [".boxx ul", 1],
        insertImg: [
            [".footdh", 1], 1
        ],
        go: 1,
        autoDownload: [0],
        next: "//li[contains(text(),'上一')]/a",
        prev: "//li[contains(text(),'下一')]/a",
        customTitle: "return 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);
        },
        insertImg: ["//div[contains(@class,'imgbox') and a/img[@alt]]", 1],
        autoDownload: [0],
        next: "//li[contains(text(),'下一')]/a",
        prev: 1,
        customTitle: "return 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);
        },
        insertImg: ["//div[contains(@class,'imgbox') and a/img[@alt]]", 1],
        autoDownload: [0],
        next: ".zuopre>a",
        prev: ".younext>a",
        customTitle: "return 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);
        },
        insertImg: ["//div[@class='tu' and a/img[@alt]]", 1],
        autoDownload: [0],
        next: "//div[contains(text(),'下一')]/a[1]",
        prev: "//div[contains(text(),'上一')]/a[2]",
        customTitle: "return 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);
        },
        insertImg: ["//div[contains(@class,'tu') and a/img[@alt]]", 1],
        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);
        },
        insertImg: [".content-pic", 1],
        autoDownload: [0],
        next: "//div[contains(text(),'下一')]/a[1]",
        prev: "//div[contains(text(),'下一')]/a[2]",
        customTitle: "return 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);
        },
        insertImg: [".content", 1],
        autoDownload: [0],
        next: "//span[contains(text(),'下一')]/a",
        prev: "//span[contains(text(),'上一')]/a",
        customTitle: "return 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);
        },
        insertImg: [".content", 1],
        autoDownload: [0],
        next: "//span[contains(text(),'下一')]/a",
        prev: "//span[contains(text(),'上一')]/a",
        customTitle: "return 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);
        },
        insertImg: ["#content", 1],
        autoDownload: [0],
        next: "//span[contains(text(),'下一')]/a",
        prev: "//span[contains(text(),'上一')]/a",
        customTitle: "return 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);
        },
        insertImg: ["#content", 1],
        autoDownload: [0],
        next: "//span[contains(text(),'下一')]/a",
        prev: "//span[contains(text(),'上一')]/a",
        customTitle: "return 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);
        },
        insertImg: [".imgbox", 1],
        autoDownload: [0],
        next: "//li[contains(text(),'下一')]/a",
        prev: "//li[contains(text(),'上一')]/a",
        customTitle: "return 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);
        },
        insertImg: [".pp.hh", 1],
        customTitle: "return 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);
        },
        insertImg: [".pp.hh", 1],
        customTitle: "return 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);
        },
        insertImg: [".content", 1],
        autoDownload: [0],
        next: "//span[contains(text(),'下一')]/a",
        prev: "//span[contains(text(),'上一')]/a",
        customTitle: "return 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);
        },
        insertImg: [".content-pic,#bomei", 1],
        autoDownload: [0],
        next: ".updown>a,#prenext a",
        prev: 1,
        customTitle: "return 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);
        },
        insertImg: ["#bomei", 1],
        autoDownload: [0],
        next: "#prenext a",
        prev: "#prenext li:last-child>a",
        customTitle: "return 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);
        },
        insertImg: [".content-pic", 1],
        autoDownload: [0],
        next: ".updown>a",
        prev: 1,
        customTitle: "return 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);
        },
        insertImg: ["#content-p", 1],
        autoDownload: [0],
        next: "//span[contains(text(),'下一')]/a",
        prev: "//span[contains(text(),'上一')]/a",
        customTitle: "return 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);
        },
        insertImg: [".content", 1],
        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);
        },
        insertImg: [".content a", 1],
        autoDownload: [0],
        next: ".updown a",
        prev: ".updown span:last-child>a",
        customTitle: "return 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);
        },
        insertImg: [".picbox", 1],
        autoDownload: [0],
        next: ".page+.content-msg a",
        prev: 1,
        customTitle: "return 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);
        },
        insertImg: [".picbox", 1],
        autoDownload: [0],
        next: ".updown_r>a",
        prev: ".updown_l>a",
        customTitle: "return 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);
        },
        insertImg: [".img_content", 1],
        customTitle: "return 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);
        },
        insertImg: [".content_pic", 1],
        customTitle: "return fun.geT('.content>h1>a');",
        category: "nsfw2"
    }, {
        name: "488人体艺术 488xm.com",
        reg: /488xm\.com\/\w+\/\d+\//i,
        imgs: "js;let max=fun.geT('.pagelist>strong',2).match(/\\d+/)[0];return fun.getImg('#content img[alt]',max,11);",
        insertImg: ["#content", 1],
        autoDownload: [0],
        next: "//span[contains(text(),'下一')]/a",
        prev: "//span[contains(text(),'上一')]/a",
        customTitle: "return 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);
        },
        insertImg: ["#gallery", 1],
        autoDownload: [0],
        next: ".other-prev a",
        prev: ".other-next a",
        customTitle: "return 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);
        },
        insertImg: ["#gallery", 1],
        autoDownload: [0],
        next: ".other-prev a",
        prev: ".other-next a",
        customTitle: "return 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);
        },
        insertImg: ["#content", 1],
        customTitle: "return 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);
        },
        insertImg: ["#showimages", 1],
        autoDownload: [0],
        next: "#pageNum a",
        prev: 1,
        customTitle: "return 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);
        },
        insertImg: [".section.fix.tc", 1],
        autoDownload: [0],
        next: ".arcLocal.r a",
        prev: 1,
        customTitle: "return 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);
        },
        insertImg: ["#content-p", 1],
        customTitle: "return 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);
        },
        insertImg: [".image-view", 1],
        autoDownload: [0],
        next: ".i-digg>.article-adbottom a",
        prev: 1,
        customTitle: "return 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);
        },
        insertImg: ["#content-p p", 1],
        autoDownload: [0],
        next: ".gg a",
        prev: 1,
        customTitle: "return 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);
        },
        insertImg: [".content", 1],
        autoDownload: [0],
        next: "//span[contains(text(),'下一')]/a",
        prev: "//span[contains(text(),'上一')]/a",
        customTitle: "return 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);
        },
        insertImg: [".content", 1],
        autoDownload: [0],
        next: ".page+.page a",
        prev: ".page+.page a+a",
        customTitle: "return 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);
        },
        insertImg: [".imgTip+a", 1],
        autoDownload: [0],
        next: ".updown_r>a",
        prev: ".updown_l>a",
        customTitle: "return fun.geT('h1').split(',')[0];",
        category: "nsfw2"
    }, {
        name: "E-Hentai圖片清單頁 e-hentai.org exhentai.org",
        reg: /(e-hentai|exhentai).org\/g\/\d+\/\w+\/$/,
        imgs: async () => {
            await fun.getNP(".gdtm,.gdtl", ".ptds+td>a", null, "//tr[td[@class='ptds']]");
            [...fun.gae(".gdtm>div,.gdtl>div")].forEach(e => {
                e.removeAttribute("style")
            });
            return fun.getImgA("#img", ".gdtm a,.gdtl a", 1, [null, null], 0)
        },
        insertImg: ["#gdt", 1],
        customTitle: "return fun.geT('#gn');",
        css: "div.gdtm,div.gdtl{text-align:center!important;float:unset!important;margin:2px 0px!important;width:100%!important;height:auto!important}",
        one: 1,
        category: "hcomic"
    }, {
        name: "nhentai圖片清單頁 nhentai.net nyahentai.red www.hentai.name nhentai.xxx nhentai.to nhentai.website",
        reg: /(nhentai\.net|nyahentai\.red|www\.hentai\.name|nhentai\.xxx|nhentai\.to|nhentai\.website)\/g\/\d+\/?$/,
        imgs: () => {
            return fun.getImgA("#image-container img", "a.gallerythumb", 1, [null, null], 0);
        },
        insertImg: [".thumbs,#thumbnail-container", 1],
        autoClick: ["#show-all-images-button"],
        customTitle: "try{return fun.geT('h2.title,h2')}catch(e){return fun.geT('h1.title,h1')}",
        one: 1,
        css: ".thumb-container{width:100%!important;margin:0px!important}.thumbs img{padding:0px!important;border-radius:0!important;width:auto!important;height:auto!important;max-width:100%!important;display:block!important;margin:0 auto !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: () => {
            return fun.run(fun.geT("#listImgH"));
        },
        customTitle: "return fun.title(/ - Cathentai| - Hentaicolor| - Hentaibeeg/,1);",
        category: "hcomic"
    }, {
        name: "3hentai圖片清單頁 www.3hentai1.buzz",
        reg: /www\.3hentai1\.buzz\/\?d\/\d+$/,
        imgs: () => {
            return fun.getImgA(".js-main-img", ".single-thumb>a", 1, [null, null], 0);
        },
        insertImg: ["#thumbnail-gallery", 1],
        customTitle: "try{return fun.geT('#main-info>h2')}catch(e){return fun.geT('#main-info>h1')}",
        one: 1,
        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("等待關鍵元素中...", 0);
            await fun.waitEle(".view_group[style]");
            fun.hide();
            return fun.getImgA("#gimg", ".g_thumb>a", 1, [null, null], 0);
        },
        insertImg: ["#append_thumbs", 1],
        autoClick: ["#load_all"],
        customTitle: "return fun.geT('.info>h1')",
        one: 1,
        css: ".gallery_thumb{margin:0!important;width:100%!important}",
        category: "hcomic"
    }, {
        name: "HentaiFox圖片清單頁 hentaifox.com",
        reg: /hentaifox\.com\/gallery\/\d+\/$/,
        imgs: () => {
            return fun.getImgA("#gimg", ".g_thumb>a", 1, [null, null], 0);
        },
        insertImg: ["#append_thumbs", 1],
        customTitle: "return fun.geT('.info>h1')",
        one: 1,
        css: ".gallery_thumb{margin:0!important;width:100%!important}",
        category: "hcomic"
    }, {
        name: "Pururin圖片清單頁 pururin.to",
        reg: /pururin\.to\/gallery\/\d+\/.+/,
        enable: 1,
        icon: 0,
        key: 0,
        autoClick: ["//button[contains(text(),'View all')]"],
        //imgs: "js;let arr=[];document.querySelectorAll('#app>.box a[href*=read]>img').forEach(e=>{arr.push(e.src.replace('t.',''))});return arr;",
        //insertImg: [[".box-gallery+#app",2], 2, 3000],
        //autoClick: "a[href$='all-pages']",
        //customTitle: "return fun.geT('.info>h1')",
        //one: 1,
        //css: ".gallery_thumb{margin:0!important;width:100%!important}",
        category: "hcomic"
    }, {
        name: "nhentai閱讀頁 nhentai.com",
        reg: /nhentai\.com\/\w+\/comic\/[^/]+\/reader\//i,
        imgs: ".vertical-image img[data-src]",
        customTitle: async () => {
            await fun.delay(1000, 0);
            return fun.geT(".router-link-active")
        },
        category: "hcomic"
    }, {
        name: "Pururin閱讀頁 pururin.to",
        reg: /pururin\.to\/read\/\d+\/\d+\/.+/,
        imgs: () => {
            let arr = [];
            let path = fun.ge(".img-fluid").src.match(/.+\//)[0];
            let max = fun.geT("select+label").match(/\d+/)[0];
            for (let i = 1; i <= max; i++) {
                arr.push(path + i + ".jpg")
            }
            return arr;
        },
        insertImg: [".container #app", 2],
        customTitle: () => {
            return fun.geT("#app>ol>li:nth-child(4)").replace(/\/|\|/g, "-");
        },
        css: "#customPicDownloadEnd{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;
        },
        insertImg: [".image-viewer", 2],
        customTitle: "return fun.title(' - Page',1);",
        css: "#customPicDownloadEnd{color:rgb(255, 255, 255)}",
        category: "hcomic"
    }, {
        name: "AsmHentai閱讀頁 asmhentai.com",
        reg: /asmhentai\.com\/gallery\/\d+\/\d+\/$/,
        imgs: () => {
            let arr = [];
            let path = fun.ge("#fimg").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: "return fun.title(' Page',1);",
        css: "#customPicDownloadEnd{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"))
            })
        },
        insertImg: [
            [".juicebox-parent", 2], 2
        ],
        autoDownload: [0],
        next: "//a[text()='Next Part']",
        prev: "//a[text()='Previous Part']",
        customTitle: "return fun.geT('#page-title');",
        css: "#customPicDownloadEnd{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: () => {
            return rff_imageList.map(e => "https://hentaicdn.com/hentai" + e);
        },
        insertImg: ["#reader-content", 2],
        autoDownload: [0],
        next: "//li[a[@class='bg-info']]/following-sibling::li[1]/a",
        prev: 1,
        customTitle: "return 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\/view\/\d+$/i,
        imgs: "img[data-src]",
        insertImg: [
            [".container>*:last-child", 2], 2
        ],
        go: 1,
        customTitle: () => {
            return fun.geT("h1.detail-ttl").replace(/\/|\|/g, " ");
        },
        category: "hcomic"
    }, {
        name: "HDpornComics圖片清單頁 hdporncomics.com",
        reg: /hdporncomics\.com\/[^/]+\/([^/]+\/)?$/i,
        include: ".my-gallery.scrollmenu",
        imgs: ".my-gallery a[data-size]",
        insertImg: [
            [".postContent>.items-center,#likeDislikeVue", 2], 2
        ],
        go: 1,
        customTitle: () => {
            return 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",
        autoDownload: [0],
        next: "//a[contains(text(),'Next')]",
        prev: "//a[contains(text(),'Prev')]",
        customTitle: () => {
            return 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",
        insertImg: [
            ["#thumbnails", 2], 2
        ],
        go: 1,
        customTitle: "return fun.geT('.folder-title>a:last-child');",
        category: "hcomic"
    }, {
        name: "Simply Hentai圖片清單頁 www.simply-hentai.com",
        reg: /www\.simply-hentai\.com\/2-original-work\/.+/i,
        exclude: "nav.pagination,#reader-image",
        imgs: () => {
            return [...fun.gae("img[data-src]")].map(e => e.dataset.src.replace("small_thumb_", ""));
        },
        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: () => {
            return [...fun.gae(".comics-thumbnail-wrapper img[data-srcset]")].map(e => e.dataset.srcset.replace("t.n", "i.n").replace("t.jpg", ".jpg"));
        },
        insertImg: [".comics-thumbnail-wrapper", 2, 1000],
        autoClick: "#show-all-comics-btn",
        customTitle: "try{return fun.geT('h4.title')}catch(e){return fun.geT('h3.title')}",
        one: 1,
        referer: "src",
        css: "#customPicDownloadEnd{color:rgb(255, 255, 255)}",
        category: "hcomic"
    }, {
        name: "IMHentai imhentai.xxx load_all",
        reg: /imhentai\.xxx\/gallery\/\d+\//,
        icon: 0,
        key: 0,
        observerClick: "#load_all",
        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: () => {
            let max = fun.geT(".total_pages");
            return fun.getImgO("#gimg", max, 14, [null, null], 0, ".nav_pagination", 0);
        },
        insertImg: [".pre_img", 1, 2000],
        customTitle: "return fun.title('-',1);",
        one: 1,
        category: "hcomic"
    }, {
        name: "Hentai2Read hentai2read.com",
        reg: /hentai2read\.com\/\w+\/\d+\/(\d+\/)?$/,
        imgs: () => {
            return gData.images.map(e => "https://static.hentai.direct/hentai" + e);
        },
        insertImg: ["#js-reader", 2],
        autoDownload: [0],
        next: "//li[a[contains(@class,'bg-info')]]/preceding-sibling::li[1]/a",
        prev: 1,
        customTitle: () => {
            return fun.geT(".reader-left-text.text-ellipsis").replace(/\//g, "-");
        },
        //one: 1,
        category: "hcomic"
    }, {
        name: "XlecX xlecx.one",
        reg: /xlecx\.one\/[\w-]+\.html$/,
        imgs: ".ug-thumb-image",
        insertImg: [
            [".page__col-left", 0], 2
        ],
        customTitle: () => {
            return fun.geT(".page__col-left>h1");
        },
        category: "hcomic"
    }, {
        name: "HentaiPorns hentaiporns.net",
        reg: /hentaiporns\.net\/[\w-]+\/$/,
        include: ".gallery",
        imgs: ".gallery-item a",
        insertImg: [
            [".gallery", 0], 2
        ],
        go: 1,
        customTitle: () => {
            try {
                return fun.geT("#gn+h1");
            } catch (e) {
                return fun.geT("#gn,.entry-title");
            }
        },
        category: "hcomic"
    }, {
        name: "H漫畫貼圖 - 7mmtv.sx",
        reg: /7mmtv\.sx\/.*hcomic/,
        imgs: () => {
            return Large_cgurl.map(e => {
                if (/imgur/.test(e)) return e;
                return null
            });
        },
        insertImg: ["#show_cg_html", 1],
        customTitle: () => {
            return fun.title(" - 7mmtv.sx", 1).replace(/\s?\(\d+P\)/i, "");
        },
        category: "hcomic"
    }, {
        name: "18H 18h.mm-cg.com",
        reg: /18h\.mm-cg\.com\/(zh\/?)18H_content\/\d+\/content\.html/,
        imgs: () => {
            return Large_cgurl;
        },
        insertImg: ["#show_cg_html", 1],
        customTitle: "return fun.title('-',1);",
        category: "hcomic"
    }, {
        name: "H 次元 h-ciyuan.com",
        reg: /h-ciyuan\.com\/\d+\/\d+\/.+\//,
        include: "a[data-fancybox]",
        imgs: "a[data-fancybox]",
        //insertImg: [".entry-content", 2],
        insertImg: [
            [".entry-content", 2], 2
        ],
        go: 1,
        next: ".nav-previous>a",
        prev: ".nav-next>a",
        customTitle: "return 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;
        },
        insertImg: [".left", 2],
        customTitle: "return fun.geT('.box>h1');",
        category: "hcomic"
    }, {
        name: "漫畫聯合國 www.comicun.com",
        enable: 0,
        reg: /www\.comicun\.com\/index-look(-cid)?-name-.+/,
        init: "$(document).unbind('click');",
        imgs: () => {
            let max = $("#total").val();
            return fun.getImg("#ComicPic", max, 20);
        },
        insertImg: [".e", 1],
        category: "comic"
    }, {
        name: "丽图·污漫画 litu100.xyz",
        reg: /litu\d+\.xyz\/comic\/id-\w+\/\d+\.html/,
        imgs: ".article.comic img",
        insertImg: [".article.comic", 2],
        autoDownload: [0],
        next: "a.next",
        prev: "a.prev",
        customTitle: "return fun.geT('.breadcrumb span:nth-child(2)').replace('首页','');",
        category: "hcomic"
    }, {
        name: "韩国污漫画 www.ikanmh.xyz",
        reg: /www\.ikanmh\.xyz\/chapter\/\d+/,
        imgs: "img[data-original]",
        autoDownload: [0],
        next: "//a[text()='下一章']",
        prev: "//a[text()='上一章']",
        customTitle: "return fun.geT('h1.title');",
        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]",
        //insertImg: [".content-inner", 2],
        customTitle: () => {
            return fun.geT(".jeg_post_title").replace(/\[\d+P\]/i, "");
        },
        category: "hcomic"
    }, {
        name: "ACG漫画网 www.acgxmh.com www.cool-manga.com www.porn-comic.com",
        reg: /(www\.acgxmh\.com|www\.cool-manga\.com|www\.porn-comic\.com)\/(h|hentai)\/\d+\.html/,
        imgs: () => {
            let max = fun.geT("#pages>*:last-child", 2);
            return fun.getImg(".manga-page img", max, 5);
        },
        insertImg: [".manga-page", 1],
        autoDownload: [0],
        next: ".next_pics>.fr>a[href$=html]",
        prev: ".next_pics>.fl>a[href$=html]",
        customTitle: () => {
            return fun.geT("h2.title").replace(/_\d+P$/i, "");
        },
        category: "hcomic"
    }, {
        name: "紳士漫畫 圖片清單頁 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",
        reg: /(www\.wnacg\.com|www\.wnacg\.org|m\.wnacg\.com|m\.wnacg\.org|www\.htmanga\d\.top)\/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: "紳士漫畫 下拉閱讀頁 www.wnacg.com www.wnacg.org m.wnacg.org m.wnacg.com",
        reg: /(www\.wnacg\.com|www\.wnacg\.org|m\.wnacg\.com|m\.wnacg\.org|www\.htmanga\d\.top)\/photos-(slide|slidelow)-aid-\d+\.html/,
        imgs: () => {
            return imglist.map(e => e.url);
        },
        insertImg: ["#img_list", 2],
        customTitle: "return fun.title(' - 列表',1);",
        css: "#img_list{max-width: 60% !important;margin: 0 auto !important;}",
        category: "nsfw2"
    }, {
        name: "VN漫画网 下拉阅读 www.vnacg.com",
        reg: /www\.vnacg\.com\/show\/\d+\.html/,
        imgs: async () => {
            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(`獲取資料中${fetchNum+=1}/${max}`);
                    return res.data
                });
                resArr.push(res)
            }
            return Promise.all(resArr).then(data => data.flat().map(e => e.src))
        },
        insertImg: [".show", 2],
        customTitle: "return 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", ""))
        },
        insertImg: [
            [".footer", 1], 2
        ],
        go: 1,
        customTitle: "return fun.geT('.recommended-info h3');",
        category: "hcomic"
    }, {
        name: "松鼠症倉庫 ahri8.top",
        reg: /ahri8\.top\/readOnline\d\.php\?ID=\d+&host_id=\d+/,
        imgs: () => {
            return Original_Image_List.map(e => HTTP_IMAGE + e.new_filename + "_w1500." + e.extension);
        },
        insertImg: ["#Big_Image", 2],
        customTitle: "return fun.geT('.page-header').replace('線上閱讀','');",
        css: "#content>.col-lg-12,[id^=read_online_ads_area],#Big_Image~*{display:none!important}",
        category: "hcomic"
    }, {
        name: "禁漫屋 jmwu.vip m.jmwu.vip",
        reg: /jmwu\.\w+\/chapter\/[\w-]+\.html/,
        imgs: "img[data-original]",
        autoDownload: [0],
        next: "a[data-value=next]",
        prev: "a[data-value=prev]",
        customTitle: () => {
            return fun.title(/ – White|-禁漫屋|-\[| “/, 1);
        },
        category: "hcomic"
    }, {
        name: "Roku Hentai rokuhentai.com",
        reg: /rokuhentai\.com\/\w+\/\d+$/,
        imgs: ".site-reader__image",
        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;}",
        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: () => {
            let max;
            try {
                max = fun.geT(".page-links>*:last-child", 2)
            } catch (e) {
                max = 1
            }
            return fun.getImg(".single-content img[data-lazy-src]", max, 10);
        },
        insertImg: [".single-content", 2],
        autoDownload: [0],
        next: "a[rel=prev]",
        prev: 1,
        customTitle: () => {
            return 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, ".wp-pagenavi", 0);
        },
        insertImg: ["#page-current", 1],
        customTitle: () => {
            return 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;
        },
        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",
        autoDownload: [0],
        next: "#content .g1-teaser-next",
        prev: "#content .g1-teaser-prev",
        customTitle: "return fun.geT('h1.entry-title');",
        css: "#simple-banner,.touchy-wrapper,.touchy-wrapper~*:not(#customPicDownload):not(.customPicDownloadMsg),.code-block,#secondary{display:none!important}",
        category: "hcomic"
    }, {
        name: "18H漫画 18hmanga.click 萝莉少女 cosporn.online",
        reg: /(18hmanga\.click|cosporn\.online)\/.+\//,
        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: "return fun.geT('h1.entry-title');",
        css: "#simple-banner,.touchy-wrapper,.touchy-wrapper~*:not(#customPicDownload):not(.customPicDownloadMsg),.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: () => {
            let arr = [];
            let imgs = galleryinfo.files.length;
            for (let i = 0; i < imgs; i++) {
                let html = make_image_element(galleryinfo["id"], our_galleryinfo[i], no_webp);
                arr.push(html.querySelector("img"))
            }
            return arr;
        },
        insertImg: ["#comicImages", 2],
        customTitle: "return fun.title('|',1);",
        css: "body{overflow:unset!important}",
        one: 1,
        category: "hcomic"
    }, {
        name: "Orzqwq List模式 orzqwq.com",
        reg: /orzqwq\.com\/manga\/.+style=list/,
        imgs: async () => {
            fun.show("等待關鍵元素中...", 0);
            await fun.waitEle(".img-responsive", 600);
            fun.hide();
            return [...fun.gae("img[data-src]")]
        },
        include: "//option[@selected and text()='List style']",
        insertImg: [".reading-content", 2],
        customTitle: "return 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("等待關鍵元素中...", 0);
            await fun.waitEle("#chapter_preloaded_images", 600);
            fun.hide();
            return chapter_preloaded_images
        },
        insertImg: [".reading-content", 2],
        customTitle: "return 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: () => {
            return chapter_preloaded_images
        },
        insertImg: [".reading-content", 2],
        customTitle: "return fun.geT('.breadcrumb>li:nth-child(2)').trim();",
        category: "hcomic"
    }, {
        name: "亚洲漫画走廊 asiacomics.com",
        reg: /asiacomics\.com\/chapter\/\d+/,
        imgs: "#enc_img img[data-original]",
        autoDownload: [0],
        next: "//a[text()='下一章']",
        prev: "//a[text()='上一章']",
        customTitle: "return fun.geT('h1.title');",
        category: "hcomic"
    }, {
        name: "成人漫画 bad.news/mh",
        reg: /bad\.news\/mh\/view\/id-\d+/,
        imgs: ".img-responsive",
        one: 1,
        category: "hcomic"
    }, {
        name: "嗨皮漫畫閱讀 https://m.happymh.com/manga/daiwangraoming",
        enable: 0,
        icon: 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 imgs = siteJson.data.scans.map(e => e.url);
            imgs.forEach(url => {
                new Image().src = url;
            });
            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: () => {
            return siteJson.data.scans.map(e => e.url)
        },
        //insertImg: ["//article[div[contains(@id,'imageLoader')]]", 1],
        autoDownload: [0],
        next: "//a[span[text()='下一話' or text()='下一话']]",
        prev: "//a[span[text()='上一話' or text()='上一话']]",
        customTitle: () => {
            return 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.colamanhua.com", //方向鍵上一章下一章、反反偵錯,新版blob格式下載不了...Picviewer CE+可以
        enable: 1,
        icon: 0,
        key: 0,
        reg: /www\.colamanhua\.com\/manga-.+\.html$/,
        init: "Function.prototype.constructor=()=>{}",
        imgs: ".mh_comicpic>img[src]:not([src^=blob])",
        next: "//a[text()='下一章']",
        prev: "//a[text()='上一章']",
        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;
        },
        insertImg: ["//td[img[@id='TheImg']]", 2],
        autoDownload: [0],
        next: "#nextvol:not([style])",
        prev: "#prevvol",
        customTitle: "let t=document.title.split(' ')[0];return`${t}-第${ch}集`;",
        category: "comic"
    }, {
        name: "8Comic無限動漫 手機版 https://8.twobili.com/comic/insurance_103.html?ch=471",
        enable: 1,
        icon: 0,
        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);
        },
        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;
        },
        insertImg: ["//li[img[@id='TheImg']]", 2],
        autoDownload: [0],
        next: "#nextvol:not([style])",
        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: /(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(`獲取資料中(${fetchNum+=1}/${MANGABZ_IMAGE_COUNT})`, 0);
                    return fun.run(res)[0]
                });
                resArr.push(res)
            }
            return Promise.all(resArr)
        },
        insertImg: ["#cp_img", 2],
        autoDownload: [0],
        next: "//a[img[contains(@src,'xiayizhang')]][starts-with(@href,'/m')]",
        prev: "//a[img[contains(@src,'shangyizhang')]][starts-with(@href,'/m')]",
        customTitle: "return fun.title('_', 2).replace('漫畫','');",
        css: "#customPicDownloadEnd{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: /(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(`獲取資料中(${fetchnUm+=1}/${XMANHUA_IMAGE_COUNT})`, 0);
                    return fun.run(res)[0]
                });
                resArr.push(res)
            }
            return Promise.all(resArr)
        },
        insertImg: ["#cp_img", 2],
        autoDownload: [0],
        next: "//a[img[contains(@src,'reader-bottom-right-2')]][starts-with(@href,'/m')]",
        prev: "//a[img[contains(@src,'reader-bottom-right-1')]][starts-with(@href,'/m')]",
        customTitle: "return fun.title('_', 2).replace('漫畫','');",
        css: "#customPicDownloadEnd{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: /(www|tel|en|cnc|hk|m)?\.?(dm5|1kkk)\.(com|cn)\/(m|ch|vol|other)[-_0-9]+\//,
        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(`獲取資料中(${fetchNum+=1}/${DM5_IMAGE_COUNT})`, 0);
                    return fun.run(res)[0]
                });
                resArr.push(res)
            }
            return Promise.all(resArr)
        },
        insertImg: ["#cp_img", 2],
        autoDownload: [0],
        next: "//a[text()='下一章']",
        prev: "//a[text()='上一章']",
        customTitle: "return 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: /(www|tel|en|cnc|hk|m)?\.?(dm5|1kkk)\.(com|cn)\/(m|ch|vol|other)[-_0-9]+\//,
        include: ["#barChapter"],
        imgs: "#barChapter>img",
        insertImg: ["#barChapter", 2],
        autoDownload: [0],
        next: "//a[text()='下一章']",
        prev: "//a[text()='上一章']",
        customTitle: "return fun.title('_', 2);",
        category: "comic"
    }, {
        name: "DM5/極速/Mangabz/Xmanhua/漫画人/奇漫屋/漫画星球(PC)/6 漫画/漫本 手機版 https://m.dm5.com/m755073/",
        enable: 0,
        reg: /(www|tel|en|cnc|hk|m)?\.?(dm5|1kkk|mangabz|xmanhua|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: () => {
            return newImgs
        },
        insertImg: ["#cp_img,.main_img,#comicContain,.comic-list", 2],
        autoDownload: [0],
        next: "//a[text()='下一章'] | //a[img[@alt='下一章']]",
        prev: "//a[text()='上一章'] | //a[img[@alt='上一章']]",
        customTitle: () => {
            let host = location.hostname;
            if (/dm5|manhuaren|1kkk|mangabz|xmanhua/.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.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: "动漫之家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;
        },
        insertImg: ["#commicBox", 2],
        autoDownload: [0],
        next: ".afterChapter",
        prev: ".beforeChapter",
        customTitle: "return fun.title('-',1);",
        css: "#khdDown,.appTil{display:none!important}",
        category: "comic"
    }, {
        name: "动漫之家 manhua.dmzj.com",
        enable: 0,
        reg: /manhua\.i?dmzj\.com\/\w+\/\d+\.shtml/,
        init: "$('body').unbind('keydown');",
        imgs: () => {
            return arr_pages.map(e => img_prefix + decodeURI(e));
        },
        insertImg: ["#center_box", 2],
        autoDownload: [0],
        next: "#next_chapter",
        prev: "#prev_chapter",
        customTitle: "return fun.title('-',1);",
        category: "comic"
    }, {
        name: "动漫之家2 www.dmzj.com",
        enable: 0,
        reg: /www\.i?dmzj\.com\/view\/\w+\/\d+\.html/,
        init: "$('body').unbind('keydown');",
        imgs: () => {
            return picArry.map(e => 'https://images.idmzj.com/' + decodeURI(e).replace(/amp;/g, ''));
        },
        insertImg: [".comic_wraCon", 2],
        autoDownload: [0],
        next: ".next>a",
        prev: ".pre>a",
        customTitle: "return fun.geT('.head_title');",
        category: "comic"
    }, {
        name: "Manhuagui看漫画M https://m.manhuagui.com/comic/17023/176171.html",
        enable: 0,
        icon: 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}`);
        },
        insertImg: ["#manga", 2],
        autoDownload: [0],
        next: "//a[text()='下一章']",
        prev: "//a[text()='上一章']",
        customTitle: "return fun.geT('#mangaTitle');",
        one: 1,
        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看漫画 https://www.manhuagui.com/comic/11230/114301.html",
        enable: 0,
        reg: /www\.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}`);
        },
        insertImg: ["#tbBox", 2],
        autoDownload: [0],
        one: 1,
        next: "//a[text()='下一章']",
        prev: "//a[text()='上一章']",
        customTitle: "return fun.geT('h1>a') + ' - ' + fun.geT('h2');",
        category: "comic"
    }, {
        name: "包子漫画 閱讀 https://www.kukuc.co/comic/chapter/yushenyitongshengji-ohyeonbain/0_2.html",
        enable: 0,
        icon: 0,
        reg: /\/comic\/chapter\/[^/]+\/\w+\.html/i,
        include: "//title[contains(text(),'包子')]",
        init: async () => {
            document["onkeydown"] = null;
            const hidetoolbar = () => {
                var e = e || window.event;
                if (e.wheelDelta < 0 || e.detail > 0) {
                    $("div.header").attr("style", "top: -44px;");
                    $("div.bottom-bar").attr("style", "bottom: -50px;")
                } else {
                    $("div.header").attr("style", "transform: translateY(0%);");
                    $("div.bottom-bar").attr("style", "transform: translateY(0%);")
                }
            };
            $("body").on("wheel", hidetoolbar);
            $("body").on("DOMMouseScroll", hidetoolbar);
            const keyhidetoolbar = (e) => {
                let key = window.event ? e.keyCode : e.which;
                if (key == "34" || key == "32" || key == "40") {
                    $("div.header").attr("style", "top: -44px;");
                    $("div.bottom-bar").attr("style", "bottom: -50px;")
                } else {
                    $("div.header").attr("style", "transform: translateY(0%);");
                    $("div.bottom-bar").attr("style", "transform: translateY(0%);")
                }
            };
            $("body").on("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) {
                        $("div.header").attr("style", "top: -44px;");
                        $("div.bottom-bar").attr("style", "bottom: -50px;")
                    } else if (Y > 0) {
                        $("div.header").attr("style", "transform: translateY(0%);");
                        $("div.bottom-bar").attr("style", "transform: translateY(0%);")
                    }
                });
            }
            await fun.getNP(".comic-contain>div:not(.mobadsq)", "//a[contains(text(),'下一頁') or contains(text(),'下一页')]", null, ".comic-chapter>.next_chapter");
        },
        imgs: () => {
            let arr = [...fun.gae(".comic-contain amp-img")].map(e => e.getAttribute("src"));
            return [...new Set(arr)]
        },
        insertImg: [".comic-contain", 2],
        autoDownload: [0],
        next: "//div[@class='next_chapter']/a[contains(text(),'下一話') or contains(text(),'下一话')]",
        prev: 1,
        customTitle: "return 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", //有限制連線數,在目錄頁每話開一個新分頁進行下載,測試同時載5話沒問題。
        enable: 1,
        reg: /komiic\.com\/comic\/\d+\/chapter\//,
        imgs: () => {
            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"
            };
            return fetch("/api/query", {
                "headers": {
                    "content-type": "application/json"
                },
                "body": JSON.stringify(body),
                "method": "POST"
            }).then(res => res.json()).then(json => json.data.imagesByChapterId.map(e => "https://komiic.com/api/image/" + e.kid));
        },
        customTitle: async () => {
            await fun.delay(1500, 0);
            return fun.geT("li.breadcrumbs__item:nth-child(3)>a").trim() + " - " + fun.geT("li.breadcrumbs__item:nth-child(5)>div").trim()
        },
        one: 1,
        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],
        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: () => {
            return 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.addNextHtml(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;
        },
        autoDownload: [0],
        next: async () => {
            let lastPage = fun.ge(".onpage").parentNode.lastElementChild.previousElementSibling;
            return await fun.xhr(lastPage.href, "document").then(async doc => {
                let ele = fun.ge("body>table>tbody>tr:nth-child(3)>td>a", doc);
                return await fun.xhr(ele.href, "document").then(doc => {
                    let next = fun.ge(".pages", doc);
                    if (next) {
                        return next.href
                    } else {
                        return null
                    }
                });
            });
        },
        prev: 1,
        insertImg: ["//td[a[img[@oncontextmenu]]]", 2],
        customTitle: "return 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
        },
        insertImg: ["//td[a[img[@oncontextmenu]]]", 2],
        autoDownload: [0],
        next: "//td[@width='150' and a[img[@src='/image/rad.gif']]]/a",
        prev: "//td[@width='150' and a[img[@src='/image/rad1.gif']]]/a",
        customTitle: "return fun.title(' - ',2);",
        category: "comic"
    }, {
        name: "動漫戲說 https://comic.acgn.cc/view-202.htm",
        enable: 0,
        reg: /comic\.acgn\.cc\/view/,
        imgs: () => {
            return [...fun.gae(".pic[_src][id]")].map(e => e.getAttribute("_src"));
        },
        insertImg: ["#pic_list", 2],
        autoDownload: [0],
        next: ".display_right>a",
        prev: ".display_left>a",
        customTitle: "return 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: () => {
            return cInfo.fs.map(e => "https://www.98comic.com/g.php?" + cInfo.cid + "/" + e);
        },
        insertImg: ["//td[img[@id='manga']]", 2],
        autoDownload: [0],
        next: ".nextC",
        prev: ".prevC",
        customTitle: () => {
            return cInfo.btitle + " - " + cInfo.ctitle
        },
        css: ".bd_960_90{display:none!important}",
        category: "comic"
    }, {
        name: "57漫画网 www.wuqimh.net m.wuqimh.net 国漫吧 www.guoman8.cc",
        enable: 0,
        reg: /((www|m)\.wuqimh\.net)|www\.guoman8\.cc\/\d+\/\d+\.html$/,
        imgs: () => {
            return cInfo.fs;
        },
        insertImg: ["//td[img[@id='manga']]", 2],
        autoDownload: [0],
        next: ".nextC",
        prev: ".prevC",
        customTitle: () => {
            return cInfo.btitle + " - " + cInfo.ctitle
        },
        css: ".bd_960_90,body>section{display:none!important}",
        category: "comic"
    }, {
        name: "亲亲漫画/古风漫画网 www.acgud.com m.acgqd.com www.gufengmh.com m.gufengmh.com",
        enable: 0,
        reg: /(www|m|w111)\.(acg(u|q)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: () => {
            return chapterImages.map(e => SinConf.resHost[0].domain + "/" + chapterPath + e);
        },
        insertImg: ["#images", 2],
        autoDownload: [0],
        next: "//a[contains(text(),'下一章')]",
        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(.customPicDownloadMsg):not(#customPicDownload){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/,
        init: "setTimeout(()=>{$(document).unbind('keyup');$(document).unbind('keydown')},4000)",
        imgs: () => {
            return chapterImages;
        },
        insertImg: ["#images", 2, 4000],
        next: "//a[text()='下一章']",
        prev: "//a[text()='上一章']",
        customTitle: "return 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: "$('#images').unbind('click');",
        imgs: () => {
            return chapterImages.map(e => SinConf.resHost[0].domain + "/" + chapterPath + e);
        },
        insertImg: ["#images", 2],
        next: "//a[text()='下一章']",
        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",
        enable: 0,
        reg: /(www|m)\.ymh1234\.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.addNextHtml(url, "#images", 1)
                }
            }
            return chapterImages.map(e => SinConf.resHost[0].domain + "/" + chapterPath + e);
        },
        insertImg: ["#images", 2],
        autoDownload: [0],
        next: () => {
            if (nextChapterData.id > 0) {
                return nextChapterData.url
            } else {
                return null
            }
        },
        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",
        enable: 0,
        reg: /www\.90mh\.com\/manhua\/\w+\/\d+\.html/i,
        imgs: () => {
            return chapterImages.map(e => SinConf.resHost[0].domain + "/" + chapterPath + e);
        },
        insertImg: ["#images", 2],
        autoDownload: [0],
        next: ".nextC",
        prev: ".prevC",
        customTitle: "return fun.title(' - ',3);",
        category: "comic"
    }, {
        name: "90漫画 wap.90mh.com",
        enable: 0,
        reg: /wap\.90mh\.com\/manhua\/\w+\/\d+\.html/i,
        init: () => {
            let url = siteData.next();
            if (url) {
                fun.addNextHtml(url, "#chapter-image", 1)
            }
        },
        imgs: () => {
            let max = fun.geT("#k_total");
            return fun.getImg("#chapter-image img", max, 5);
        },
        insertImg: ["#chapter-image", 2],
        autoDownload: [0],
        next: () => {
            let next = fun.ge("//a[text()='下一章'][contains(@href,'html')]");
            if (next) {
                return next.href
            } else {
                return null
            }
        },
        prev: 1,
        customTitle: "return fun.title('在线',1);",
        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: () => {
            return chapterImages.map(e => SinConf.resHost[0].domain + e);
        },
        insertImg: ["#images", 2],
        autoDownload: [0],
        next: ".next>a",
        prev: ".pre>a",
        customTitle: "return 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: () => {
            return chapterImages.map(e => SinConf.resHost[0].domain + e);
        },
        insertImg: ["#images", 2],
        autoDownload: [0],
        next: "//a[text()='下一章'][contains(@href,'html')]",
        prev: "//a[text()='上一章'][contains(@href,'html')]",
        customTitle: () => {
            let s = pageTitle.split(" - ");
            return s[1] + " - " + s[0]
        },
        css: ".letchepter>div,.letchepter>section,#customPicDownload~*{display:none!important}",
        category: "comic"
    }, {
        name: "漫画芯M coco.mhxin.com",
        enable: 0,
        reg: /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)
        },
        insertImg: ["#images", 2],
        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
            }
        },
        prev: 1,
        customTitle: "return fun.title('在线',1);",
        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],
        autoDownload: [0],
        next: "//a[text()='下一章'][contains(@href,'html')]",
        prev: "//a[text()='上一章'][contains(@href,'html')]",
        customTitle: "return fun.title('在线',1);",
        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],
        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
                }
            }
        },
        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]{display:none!important}",
        category: "comic"
    }, {
        name: "蔷薇漫画M / 爱米推漫画M / 下拉式漫画M / 奇妙漫画M m.qwmanhua.com m.imitui.com m.xlsmh.com m.qmiaomh.com ikr.ejujiu.com",
        enable: 0,
        reg: /(m\.qwmanhua\.com|m\.imitui\.com|m\.xlsmh\.com|m\.qmiaomh\.com|ikr\.ejujiu\.com)\/manhua\/\w+\/\d+\.html/i,
        imgs: () => {
            let imgs = [...fun.gae("#images img[onclick],#scroll-image img[onclick]")];
            fun.remove("#scroll-image");
            return imgs
        },
        insertImg: ["#images", 2],
        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
                }
            }
        },
        prev: 1,
        customTitle: "return fun.title('在线',1);",
        category: "comic"
    }, {
        name: "前未漫画/漫画芯/蔷薇漫画/最漫画/爱米推漫画/下拉式漫画/漫画吧/漫画连/拼拼漫画 www.qianmh.com www.mhxin.com www.qwmanhua.com www.zuimh.com www.imitui.com www.xlsmh.com www.dmhua8.com www.100mhl.com www.pinmh.com",
        enable: 0,
        reg: /www\.(mhxin|qianmh|qwmanhua|zuimh|imitui|xlsmh|dmhua8|100mhl|pinmh)\.com\/manhua\/\w+\/\d+\.html/i,
        init: "try{$(document).unbind('keydown');$(document).unbind('keyup')}catch(e){}",
        imgs: () => {
            return chapterImages;
        },
        insertImg: ["#images,#imagesOld", 2],
        autoDownload: [0],
        next: ".next>a,a.next,a.nextC",
        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/.test(host)) {
                return fun.geT("h1")
            } else if (/zuimh|imitui|dmhua/.test(host)) {
                return fun.geT(".title h1") + " - " + fun.geT(".title h2")
            }
        },
        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);
        },
        insertImg: ["#pic-list", 2],
        autoDownload: [0],
        next: ".btn-next[href^=j]",
        prev: ".btn-prev",
        customTitle: "return fun.title(',',1).replace('漫画','');",
        css: "#customPicDownloadEnd{color:rgb(255, 255, 255)}",
        category: "comic"
    }, {
        name: "来漫画M m.laimanhua8.com",
        enable: 0,
        reg: /m\.laimanhua8\.com\/kanmanhua\/\w+\/\d+\.html/i,
        imgs: () => {
            return mhInfo.images.map(e => realurl + mhInfo.path + e)
        },
        insertImg: ["#manga", 2],
        autoDownload: [0],
        next: "//a[text()='下一章']",
        prev: "//a[text()='上一章']",
        customTitle: "return 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],
        autoDownload: [0],
        next: "a.next",
        prev: "a.prev",
        customTitle: "return fun.title(' - ',1);",
        category: "comic"
    }, {
        name: "漫客栈 www.mkzhan.com",
        enable: 0,
        reg: /www\.mkzhan\.com\/\d+\/\d+\.html/i,
        imgs: () => {
            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`;
            return fetch(apiUrl).then(res => res.json()).then(json => json.data.page.map(e => e.image));
        },
        insertImg: ["#pages-tpl", 1],
        autoDownload: [0],
        next: ".rd-aside a.j-rd-next",
        prev: ".rd-aside a.j-rd-prev",
        autoClick: "//div[@class='rd-aside__item j-rd-mod'][span[text()='卷轴']]",
        customTitle: "return fun.title(' - ',1)",
        category: "comic"
    }, {
        name: "漫画屋 www.mhua5.com www.manhw.com www.360mh.cc",
        enable: 0,
        reg: /www\.(mhua5|manhw|360mh)\.(com|cc)\/(chapter.+\.html|index\.php\/chapter\/\d+)/i,
        include: ".rd-article-wr",
        imgs: "img[data-original]:not([data-original*='/template/pc/default/'])",
        insertImg: [".rd-article-wr", 2],
        autoDownload: [0],
        next: ".rd-aside a.j-rd-next",
        prev: ".rd-aside a.j-rd-prev",
        autoClick: "//div[@class='rd-aside__item j-rd-mod'][span[text()='卷轴']]",
        customTitle: () => {
            if (/www\.mhua5\.com/.test(location.host)) {
                return fun.title(" - ", 1)
            } else if (/www\.360mh\.cc/.test(location.host)) {
                return fun.geT(".j-comic-title") + " - " + fun.geT(".last-crumb")
            } else {
                return fun.title("下", 1)
            }
        },
        category: "comic"
    }, {
        name: "漫画屋M www.mhua5.com www.manhw.com",
        enable: 0,
        reg: /www\.(mhua5|manhw)\.com\/(chapter.+\.html|index\.php\/chapter\/\d+)/i,
        imgs: ".comic-page img,#cp_img img[data-original]",
        insertImg: [".comic-list,#cp_img", 2],
        autoDownload: [0],
        next: () => {
            if (/www\.mhua5\.com/.test(location.host)) {
                let next = fun.ge(".next-chapter.next-btn").getAttribute("_href");
                if (/html/.test(next)) {
                    return location.origin + next;
                } else {
                    return null
                }
            } else {
                let next = fun.ge("//a[text()='下一章']");
                if (next) {
                    return next.href;
                } else {
                    return null
                }
            }
        },
        prev: 1,
        customTitle: () => {
            if (/www\.mhua5\.com/.test(location.host)) {
                return fun.title(" - 漫画屋")
            } else if (/www\.360mh\.cc/.test(location.host)) {
                return null
            } else {
                return fun.title(" 下", 1)
            }
        },
        css: "body>ins{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: "return 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: () => {
            return 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: () => {
            let imgData = msg.split("|");
            let arr = [];
            imgData.forEach(e => {
                let imgSrc;
                if (location.hostname.indexOf("m.77mh") != -1) {
                    imgSrc = ImgSvrList + e
                } else {
                    imgSrc = img_qianz + e
                }
                arr.push(imgSrc)
            });
            return arr
        },
        insertImg: ["#comicImg,.mg-co", 2],
        autoDownload: [0],
        next: "//a[contains(text(),'下一章')]",
        prev: "//a[contains(text(),'上一章')]",
        customTitle: "return 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",
        init: async () => {
            let url = await siteData.next();
            if (url) {
                fun.addNextHtml(url, "body", 2)
            }
        },
        imgs: () => {
            fun.show("獲取資料中...", 0);
            let max = fun.geT("//td[input]").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 path = fun.ge("td img").src.match(/.+\//)[0];
            let xhrNum = 0;
            for (let i in links) {
                let res = fun.xhr(links[i], "document").then(doc => {
                    fun.show(`獲取資料中${xhrNum+=1}/${links.length}`, 0);
                    let script = fun.ge("//script[contains(text(),'document.write')]", doc);
                    let fileName = script.innerText.match(/[\w\.-]+\.jpe?g|[\w\.-]+\.png/i)[0];
                    return decodeURI(path + fileName);
                });
                resArr.push(res);
            }
            return Promise.all(resArr);
        },
        autoDownload: [0],
        next: () => {
            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`;
            }
            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.xhr(comicListUrl, "document").then(doc => {
                let next = fun.ge(nextXPath, doc);
                if (next) {
                    return next.href;
                } else {
                    return null;
                }
            })
        },
        prev: 1,
        insertImg: ["//td[input]", 2],
        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;}",
        category: "comic"
    }, {
        name: "漫漫聚/KuKu动漫 m.manmanju.com s1.m.ikkdm.com s2.m.ikkdm.com 1pc570gfrd9z.ihhmh.com s2.wap.ikukudm.com s3.wap.ikukudm.com",
        enable: 1,
        reg: /(m\.manmanju\.com|\w+\.ihhmh\.com|s\d\.m\.ikkdm\.com|s\d.wap.ikukudm.com)\/comiclist\/\d+\/\d+\/1\.htm/i,
        include: ".classBox img,.imgBox",
        init: async () => {
            let url = await siteData.next();
            if (url) {
                fun.addNextHtml(url, ".bottom .subNav", 1)
            }
        },
        imgs: () => {
            fun.show("獲取資料中...", 0);
            let 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 path = fun.ge(".classBox img").src.match(/.+\//)[0];
            let xhrNum = 0;
            for (let i in links) {
                let res = fun.xhr(links[i], "document").then(doc => {
                    fun.show(`獲取資料中${xhrNum+=1}/${links.length}`, 0);
                    let script = fun.ge("//script[contains(text(),'document.write')]", doc);
                    let fileName = script.innerText.match(/[\w\.-]+\.jpe?g|[\w\.-]+\.png/i)[0];
                    return decodeURI(path + fileName);
                });
                resArr.push(res);
            }
            fun.remove("//a[img] | //ul[center[li]]");
            fun.remove(".bottom .subNav~div[style*=height],.bottom .pageLine,.bottom .subNav");
            return Promise.all(resArr);
        },
        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.xhr(comicListUrl, "document").then(doc => {
                let next = fun.ge(nextXPath, doc);
                if (next) {
                    return next.href;
                } else {
                    return null;
                }
            })
        },
        prev: 1,
        insertImg: [".imgBox", 2],
        customTitle: () => {
            return fun.title("在线", 1)
        },
        category: "comic"
    }, {
        name: "仙漫网 www.xianmanwang.com",
        enable: 0,
        reg: /www\.xianmanwang\.com\/\w+\/\d+\.html/i,
        imgs: () => {
            return picdata.map(e => imgDomain + e);
        },
        insertImg: [".comicpage", 2],
        autoDownload: [0],
        next: "//li[a[@class='active']]/preceding-sibling::li[1]/a",
        prev: "//li[a[@class='active']]/following-sibling::li[1]/a",
        customTitle: () => {
            return fun.geT("h1.title").replace(/\(\d+\/\d+\)/, "").trim()
        },
        category: "comic"
    }, {
        name: "仙漫网M m.xianmanwang.com",
        enable: 0,
        reg: /m\.xianmanwang\.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)
        },
        insertImg: ["#cp_img", 2],
        autoDownload: [0],
        next: ".btn.next",
        prev: ".btn.prev",
        customTitle: () => {
            return fun.title("免费", 1)
        },
        category: "comic"
    }, {
        name: "漫画牛 www.manhua666.com",
        enable: 0,
        reg: /www\.manhua666\.com\/\w+\/\d+\.html/i,
        imgs: () => {
            let img = "";
            imgs.forEach(e => {
                img += e
            });
            let doc = fun.doc(img);
            return [...doc.images];
        },
        insertImg: ["#content", 2],
        autoDownload: [0],
        next: "a[rel=next][href$=html]",
        prev: "a[rel=prev][href$=html]",
        customTitle: "return fun.title('-',3)",
        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.replace(/eval.+\)\)/, "").match(/eval.+\)\)/)[0].slice(4);
            return fun.run(fun.run(m).slice(12, -1));
        },
        insertImg: ["#pic-list", 2],
        autoDownload: [0],
        next: "//a[text()='下一话' and not(contains(@href,'--1'))]",
        prev: "//a[text()='上一话' and not(contains(@href,'--1'))]",
        customTitle: "return fun.title('\(',1)",
        category: "comic"
    }, {
        name: "GODA漫画 godamanga.com",
        enable: 0,
        reg: /godamanga\.com\/manga\/[\w-]+\/\w+\//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()='下一话']]",
        prev: "//a[span[text()='上一话']]",
        customTitle: "return fun.geT('h1')",
        category: "comic"
    }, {
        name: "包子漫畫 baozimh.org",
        enable: 0,
        reg: /baozimh\.org\/manga\/.+\/\w+\//i,
        imgs: "//img[@decoding and @alt]",
        insertImg: ["//div[div[img[@decoding and @alt]]]", 2],
        autoDownload: [0],
        next: "//a[span[text()='下一话']]",
        prev: "//a[span[text()='上一话']]",
        customTitle: "return fun.geT('h1')",
        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: () => {
            try {
                return fun.geT("h1") + " - " + fun.geT("h2")
            } catch (e) {
                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],
        autoDownload: [0],
        next: "//a[img[@alt='下一章'] and contains(@href,'html')]",
        prev: "//a[img[@alt='上一章'] and contains(@href,'html')]",
        customTitle: "return 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],
        autoDownload: [0],
        next: "//a[p[text()='下一篇'] and contains(@href,'html')]",
        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: () => {
            return base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => qTcms_m_weburl + e);
        },
        insertImg: ["//td[img[@id='qTcms_pic']]", 2],
        autoDownload: [0],
        next: "#k_Pic_nextArr",
        prev: "#k_Pic_backArr",
        customTitle: "return 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: [".v_con_box", 2],
        autoDownload: [0],
        next: "//a[text()='下一话']",
        prev: "//a[text()='上一话']",
        customTitle: "return fun.geT('.p_select>h2')+' - '+fun.geT('.v-page>span')",
        category: "comic"
    }, {
        name: "733 动漫/漫画160 www.733.so www.mh160.cc",
        enable: 0,
        reg: /(www\.733\.so|www\.mh160\.cc)\/(mh|kanmanhua)\/\w+\/\d+\.html/i,
        init: "document.onkeydown=null",
        imgs: () => {
            return base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => f_qTcms_Pic_curUrl_realpic(e));
        },
        insertImg: ["//td[//img[@onclick]]", 2],
        autoDownload: [0],
        next: "#k_Pic_nextArr",
        prev: "#k_Pic_backArr",
        customTitle: () => {
            return qTcms_S_m_name + " - " + qTcms_S_m_playm
        },
        category: "comic"
    }, {
        name: "733 动漫M m.733.so",
        enable: 0,
        reg: /m\.733\.so\/mh\/\d+\/\d+\/\d+\.html/i,
        imgs: () => {
            let doc = fun.doc(temp_pic_all);
            return [...doc.images];
        },
        insertImg: [".select_con", 2],
        autoDownload: [0],
        next: "//a[text()='下一话' and contains(@href,'html')]",
        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: () => {
            let imgData = base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$");
            return imgData.map(e => f_qTcms_Pic_curUrl_realpic(e));
        },
        insertImg: [".UnderPage", 2],
        autoDownload: [0],
        next: "#k_Pic_nextArr",
        prev: "#k_Pic_backArr",
        customTitle: () => {
            return 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.addNextHtml(url, ".tbCenter", 1)
            }
        },
        imgs: () => {
            return base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$");
        },
        insertImg: ["//td[img[@id='qTcms_pic']]", 2],
        autoDownload: [0],
        next: () => {
            if (qTcms_Pic_nextArr !== "") {
                return location.origin + qTcms_Pic_nextArr
            } else {
                return null
            }
        },
        prev: 1,
        customTitle: () => {
            return 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: () => {
            return base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => f_qTcms_Pic_curUrl_realpic(e));
        },
        insertImg: ["//td[img[@id='qTcms_pic']]", 2],
        autoDownload: [0],
        next: () => {
            if (qTcms_Pic_nextArr !== "") {
                return location.origin + qTcms_Pic_nextArr
            } else {
                return null
            }
        },
        prev: 1,
        customTitle: () => {
            return qTcms_S_m_name + " - " + qTcms_S_m_playm
        },
        css: "#mypic_k0{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: () => {
            return 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],
        autoDownload: [0],
        next: () => {
            if (qTcms_Pic_nextArr !== "") {
                return location.origin + qTcms_Pic_nextArr
            } else {
                return null
            }
        },
        prev: 1,
        customTitle: () => {
            return 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: () => {
            return base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$");
        },
        insertImg: ["//td[//img[@onclick]]", 2],
        autoDownload: [0],
        next: "#k_Pic_nextArr",
        prev: "#k_Pic_backArr",
        customTitle: () => {
            try {
                return fun.geT("#skin~h1") + " - " + fun.geT("#skin~h2")
            } catch (e) {
                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",
        insertImg: ["#imgs", 2],
        autoDownload: [0],
        next: ".nav_button.next",
        prev: ".nav_button.prev",
        customTitle: "return 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")]
        },
        insertImg: [".comiclist", 2],
        autoDownload: [0],
        next: "//a[text()='下一话']",
        prev: "//a[text()='上一话']",
        customTitle: "return 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],
        autoDownload: [0],
        next: "//a[text()='下一话']",
        prev: "//a[text()='上一话']",
        customTitle: () => {
            return 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],
        autoDownload: [0],
        next: ".j-rd-next",
        prev: ".j-rd-prev",
        customTitle: "return 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],
        autoDownload: [0],
        next: "#js_pageNextBtn",
        prev: "#js_pagePrevBtn",
        customTitle: "return fun.geT('#crumbComicLink')+' - '+fun.geT('#js_headChapterName');",
        category: "comic"
    }, {
        name: "拷貝漫畫 www.copymanga.site copymanga.site",
        enable: 1,
        reg: /(www\.)?copymanga\.site\/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 = 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);
        },
        imgs: () => {
            return siteJson.results.chapter.contents.map(e => e.url);
        },
        insertImg: [".comicContent-list", 2],
        autoDownload: [0],
        next: "//a[text()='下一話'][starts-with(@href,'/comic/')]",
        prev: "//a[text()='上一話'][starts-with(@href,'/comic/')]",
        customTitle: () => {
            return siteJson.results.comic.name + " - " + siteJson.results.chapter.name;
        },
        css: "#customPicDownloadEnd{color:rgb(255, 255, 255)}.header+div[style],.comicContainerAds{display:none!important}",
        category: "comic"
    }, {
        name: "拷貝漫畫M www.copymanga.site copymanga.site",
        enable: 1,
        icon: 0,
        reg: /(www\.)?copymanga\.site\/h5\/comicContent\/\w+\/.+/,
        xhr: () => {
            let s = location.href.split("/").slice(-2);
            return new Promise(resolve => {
                _GM_xmlhttpRequest({
                    method: "GET",
                    url: `https://api.copymanga.site/api/v3/comic/${s[0]}/chapter/${s[1]}`,
                    responseType: "json",
                    headers: {
                        "Referer": `https://${location.hostname}/comic/${s[0]}/chapter/${s[1]}`,
                        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.50"
                    },
                    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: () => {
            return siteJson.results.chapter.contents.map(e => e.url)
        },
        insertImg: [".comicContentPopupImageList", 2],
        next: () => {
            let next = siteJson.results.chapter.next;
            if (next) {
                return location.href.replace(/[\w-]+$/, "") + next;
            } else {
                return null;
            }
        },
        customTitle: () => {
            return 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: () => {
            let max = $("#total").val();
            return fun.getImgO("#ComicPic", max, 20, [null, null], 0, ".e>p", 0);
        },
        insertImg: ["#img_ad_img", 1],
        autoDownload: [0],
        next: ".n.zhangjie",
        prev: ".p.zhangjie",
        customTitle: () => {
            return fun.geT(".e>p").replace(/(\d+P) - 第 \d+ \/ \d+ 頁/, "");
        },
        css: ".c>*:not(.n.zhangjie):not(.p.zhangjie){display:none!important;}#ComicPic{display:block!important;margin: 0 auto !important;}",
        category: "comic"
    }, {
        name: "酷漫屋 www.kumw7.com m.kumw7.com",
        enable: 0,
        reg: /(www|m)\.kumw\d\.com\/\d+\/\d+\.html/,
        imgs: ".main_img img",
        insertImg: [".main_img", 2],
        autoDownload: [0],
        next: "//a[img[@alt='下一章']] | //a[i[@class='i-rd-next'] and contains(@href,'html')]",
        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: "快岸漫画 kanbook.net",
        enable: 0,
        reg: /kanbook\.net\/comic\/\d+\/\d+/,
        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
        },
        insertImg: ["#all", 2],
        autoDownload: [0],
        next: "//a[text()='下一章' and not(starts-with(@href,'javascript'))]",
        prev: "//a[text()='上一章' and not(starts-with(@href,'javascript'))]",
        customTitle: "return fun.geT('h2.h2>a')+' - '+fun.geT('span.h4:nth-child(5)');",
        //one: 1,
        css: "#customPicDownloadEnd{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: "return 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: "return fun.geT('#chapter')+' - '+fun.geT('.title-comicHeading');",
        //css: "#comicContain>img{width:765px!important;}.comic-contain img{transition:unset!important;transform:unset!important}",
        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: "#customPicDownloadEnd{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", //方向鍵上一章下一章、清除擋廣告警告、向下滾動隱藏工具列、反反偵錯,下載不了
        enable: 1,
        icon: 0,
        key: 0,
        reg: /manwa\.me\/chapter\/\d+$/,
        init: () => {
            Function.prototype.constructor = () => {};
            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: "js;return [...fun.gae('.content-img[src^=blob]')].map(e=>e.src)",
        //imgs: "js;const get=async()=>{let imgs=[...fun.gae('.content-img[data-r-src]')];for(let i=0;i<imgs.length;i++){imgs[i].scrollIntoView();await fun.delay(50)}imgs[0].scrollIntoView();return[...fun.gae('.content-img[src^=blob]')].map(e=>e.src)};return get();",
        //imgs: "js;return[...fun.gae('.content-img[data-r-src]')].map(e=>e.dataset.rSrc)",
        next: ".view-fix-bottom-bar-item-menu-next",
        prev: ".view-fix-bottom-bar-item-menu-prev",
        customTitle: "return 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: "#customPicDownloadEnd{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+\/[\w-]+\/$/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 () => {
            if (await fun.waitEle("#mhpic", 30)) {
                let host = fun.ge("#mhpic").src.match(/^https?:\/\/[^/]+\//i);
                return siteJson.cont.map(e => host + e);
            } else {
                return []
            }
        },
        insertImg: ["#mh", 2],
        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.xhr(comicListUrl, "document").then(doc => {
                let next = fun.ge(nextXPath, doc);
                if (next) {
                    return comicListUrl + next.getAttribute("href");
                } else {
                    return null;
                }
            })
        },
        prev: 1,
        customTitle: () => {
            return fun.title("第1页", 1)
        },
        category: "comic"
    }, {
        name: "大古漫画 www.dagumanhua.net",
        enable: 1,
        reg: /www\.dagumanhua\.net\/manhua\/\d+\/\d+\.html$/i,
        init: async () => {
            document.onkeydown = null;
            document.onkeyup = null;
            let url = await siteData.next();
            if (url) {
                fun.addNextHtml(url, ".mh_list", 1)
            }
        },
        imgs: () => {
            let max = fun.ge("//script[contains(text(),'totalpage')]").innerHTML.match(/totalpage\s?=\s?(\d+)/)[1];
            return fun.getImg(".mh_list img", max, 9)
        },
        insertImg: [".mh_list", 2],
        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.xhr(comicListUrl, "document").then(doc => {
                let next = fun.ge(nextXPath, doc);
                if (next) {
                    return location.origin + next.getAttribute("href");
                } else {
                    return null;
                }
            })
        },
        prev: 1,
        customTitle: () => {
            return fun.geT(".mh_cont>h1")
        },
        category: "comic"
    }, {
        name: "大古漫画M m.dagumanhua.net",
        enable: 1,
        reg: /m\.dagumanhua\.net\/manhua\/\d+\/\d+\.html$/i,
        init: async () => {
            let url = await siteData.next();
            if (url) {
                fun.addNextHtml(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")]
        },
        insertImg: ["#content,.content", 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.xhr(comicListUrl, "document").then(doc => {
                let next = fun.ge(nextXPath, doc);
                if (next) {
                    return location.origin + next.getAttribute("href");
                } else {
                    return null;
                }
            })
        },
        prev: "//a[@href and text()='上一章']",
        customTitle: () => {
            try {
                return fun.geT(".cont_tit strong")
            } catch (e) {
                return fun.geT("#bookname") + " - " + fun.geT(".headline")
            }
        },
        css: "#content~a,.content~a,.apjg{display:none!important}",
        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();
        },
        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();
        },
        category: "none"
    }, {
        name: "m.4khd.com 自動跳轉",
        icon: 0,
        key: 0,
        reg: /^https?:\/\/m\.4khd\.com\//,
        init: () => {
            setInterval(() => {
                fun.ge("//a[text()='GET LINK']").click();
            }, 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();
                }, 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();
            }
        },
        category: "none"
    }];

    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('.CustomPictureDownloadImage')) return [...fun.gae('.CustomPictureDownloadImage')];
            fun.show("獲取圖片元素中...", 0);
            let imgsArray = [];
            let fetchNum = 0;
            const html = url => fetch(url).then(res => res.arrayBuffer()).then(buffer => {
                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(`獲取圖片中${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 => {
                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, paginationEle = null, msg = 1) => {
            if (fun.ge('.CustomPictureDownloadImage')) return [...fun.gae('.CustomPictureDownloadImage')];
            if (msg == 1) fun.show("獲取圖片元素中...", 0);
            let imgsArray = [];
            let fetchNum = 0;
            const html = async (url, id = 1) => {
                await fun.delay(time, 0);
                return fetch(url).then(async res => {
                    if (res.status === 403) {
                        fun.show("403,未登錄網站?", 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 paginationEle == "string") {
                        fun.gae(".invisible", doc).forEach(ele => {
                            ele.classList.remove("invisible");
                        });
                        fun.gae(paginationEle).forEach(ele => {
                            //debug("paginationEle", ele);
                            ele.innerHTML = fun.ge(paginationEle, doc).innerHTML;
                        });
                    }
                    if (msg == 1) fun.show(`獲取圖片中${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 => {
                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('.CustomPictureDownloadImage')) return [...fun.gae('.CustomPictureDownloadImage')];
            if (showMsg == 1) fun.show("獲取圖片元素中...", 0);
            let imgsArray = [];
            let fetchNum = 0;
            const html = (url, id = 0) => 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 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 = 'customPicDownloadLoading';
                        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("獲取圖片逾時", 0);
                            return [];
                        }
                        resolve();
                        load.remove();
                        iframe.remove();
                    };
                });
                if (showMsg == 1) fun.show(`獲取圖片中${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);
            return imgsArray;
        },
        getImgA: async (img, link, one = 0, rText = [null, null], showMsg = 1) => { //從指定的所有鏈接抓圖片
            if (showMsg == 1) fun.show("獲取圖片元素中...", 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 => res.arrayBuffer()).then(buffer => {
                if (showMsg == 1) fun.show(`獲取圖片中${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.getImg fetch()出錯:\n${decodeURI(url)}`, error);
            });
            const resArr = [];
            if (typeof link != "object") resArr.push(html(siteUrl));
            for (let i = 0; i < links.length; i++) {
                if (one == 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 (one == 1 || one == 3) {
                    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);
                    if (one == 1) {
                        let doc = fun.doc(res);
                        debug(`\nfun.getImgA()單線程模式 DOM\n${links[i].href}`, doc);
                        if (!fun.ge(img, doc) && location.host == "www.nlegs.com") {
                            fun.show("人機驗證?按F5", 0);
                            //fun.ge(link).click();
                            return;
                        }
                        let imgs = [...fun.gae(img, doc)];
                        let _img = "";
                        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;
                            }
                            _img += `<img class="CustomPictureDownloadImage" src="${imgSrc}">`;
                        }
                        links[i].outerHTML = _img;
                    }
                }
            }
            await Promise.all(resArr).then(htmls => {
                fun.hide();
                for (let i = 0; i < htmls.length; i++) {
                    let doc = fun.doc(htmls[i]);
                    if (one != 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;
                        }
                    }
                }
            });
            if (fun.ge('.CustomPictureDownloadImage')) return [...fun.gae('.CustomPictureDownloadImage')];
            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"];
                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, paginationEle = null, time = 0, dataset = null, mag = 1) => {
            //翻頁模式聚集所有圖片或是預覽縮圖然後fun.getImgA()
            //用在規則init,fun.getNP(picsEle, nextLinkEle, lastEle, paginationEle, time);
            if (fun.ge('.CustomPictureDownloadImage')) return;
            if (mag == 1) fun.show("獲取下一頁中...", 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 (paginationEle) {
                        fun.gae(paginationEle).forEach(ele => {
                            //debug("paginationEle", ele);
                            ele.innerHTML = fun.ge(paginationEle, doc).innerHTML;
                        });
                    }
                    if (lastPage) {
                        if (mag == 1) fun.show("獲取下一頁結束");
                        return;
                    }
                    if (nextPage) {
                        await fun.delay(time, 0);
                        let nextlink;
                        if (nextPage.dataset.url) {
                            if (!/^http/.test(nextPage.dataset.url)) return;
                            nextlink = nextPage.dataset.url;
                        } else {
                            nextlink = nextPage.href;
                            let nh = nextPage.host;
                            let lh = location.host;
                            if (nh != lh) {
                                nextlink = nextlink.replace(nh, lh);
                            }
                        }
                        await getNextPagePics(nextlink);
                    } else {
                        if (mag == 1) fun.show("獲取下一頁結束");
                        return;
                    }
                });
            };
            let next = fun.ge(nextLinkEle);
            if (next) {
                await fun.delay(time, 0);
                let nextlink;
                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 {
                if (mag == 1) fun.show("獲取下一頁結束");
                return;
            }
        },
        getEle: async (links, elements, targetEle, removeEles = null) => {
            if (fun.ge('.CustomPictureDownloadImage')) return;
            let resArr = [];
            let xhrNum = 0;
            fun.show("獲取元素中...", 0);
            for (let i in links) {
                let res = fun.xhr(links[i], "document").then(doc => {
                    fun.show(`獲取元素中${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 => {
                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;
                }
            }
            let fragment = new DocumentFragment();
            for (let i = 0; i < srcArr.length; i++) {
                let img = new Image();
                img.className = "CustomPictureDownloadImage";
                if (mode == 2 || mode == 3) {
                    img.src = loading_bak;
                    img.dataset.src = srcArr[i];
                    if (siteData.referrerpolicy == 0) img.setAttribute("referrerpolicy", "no-referrer");
                    fun.imagesObserver.observe(img);
                } else {
                    img.src = srcArr[i];
                    if (siteData.referrerpolicy == 0) img.setAttribute("referrerpolicy", "no-referrer");
                    img.onerror = error => {
                        if (errorNum > 10) return;
                        errorNum += 1;
                        setTimeout(() => {
                            debug(`\nfun.insertImg()重新載入出錯的圖片:\n${error.target.src}`);
                            error.target.src = error.target.src;
                        }, 1000);
                    };
                }
                fragment.appendChild(img);
                if (i == srcArr.length - 1) {
                    let end = document.createElement('p');
                    end.id = "customPicDownloadEnd";
                    end.innerText = `聚圖數量:${srcArr.length}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 > 10) 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++) {
                    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);
                    else if (ele[1] == 1) thisEle.parentNode.insertBefore(fragment, thisEle);
                    else if (ele[1] == 2) thisEle.parentNode.insertBefore(fragment, thisEle.nextSibling);
                    if (typeof ele[2] != "undefined") {
                        fun.remove(ele[2]);
                    }
                    fun.show("已聚集所有圖片");
                    if (siteData.go == 1) goToNo1Img();
                } else if (typeof ele == "string") {
                    thisEle = fun.ge(ele);
                    thisEle.innerHTML = "";
                    thisEle.appendChild(fragment);
                    fun.show("已聚集所有圖片");
                } else {
                    fun.show("用來定位插入的元素不存在", 3000);
                    debug("\nfun.insertImg() ele參數錯誤,或用來定位插入的元素不存在。");
                    return;
                }
            } else {
                fun.show("沒有能插入的圖片", 3000);
            }
        },
        immediateInsertImg: async () => {
            let selector = siteData.imgs;
            //debug("\nfun.immediateInsertImg() selector\n", selector);
            await fun.delay(siteData.insertImg[2] || 200);
            let imgs;
            let imgSrcArray = [];
            if (fun.ge('.CustomPictureDownloadImage')) {
                imgs = [...fun.gae('.CustomPictureDownloadImage')];
            }
            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);
            }
            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("沒有能插入的圖片", 3000);
                debug("\nfun.immediateInsertImg() 沒有圖片元素");
                return;
            }
            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) => {
            if (mode == 1) {
                return fun.ge(ele).innerText.replace(/\s?第.+画\s?/, "");
            } else if (mode == 2) {
                return fun.ge(ele).previousElementSibling.innerText;
            } else if (mode == 3) {
                return fun.ge(ele).previousElementSibling.previousElementSibling.innerText;
            }
        },
        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(".customPicDownloadMsg");
            if (fun.ge(".customPicDownloadMsg[style]")) {
                msg.removeAttribute('style');
            }
            msg.innerText = text;
            if (time > 0) {
                setTimeout(() => {
                    fun.hide();
                }, time);
            }
        },
        hide: () => {
            if (!fun.ge(".customPicDownloadMsg[style]")) {
                let msg = fun.ge(".customPicDownloadMsg");
                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.onerror = (error) => {
                            if (errorNum > 10) return;
                            errorNum += 1;
                            error.target.dataset.src = error.target.dataset.src.replace("-scaled", "");
                            error.target.src = loading_bak;
                            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;
                    }
                }
            });
        }),
        addCustomPicDownloadMsg: () => {
            let div = document.createElement("div");
            div.className = "customPicDownloadMsg";
            div.style = "display:none";
            div.innerText = "none";
            document.body.appendChild(div);
        },
        css: css => {
            let style = document.createElement("style");
            style.type = "text/css";
            style.className = "CustomPictureDownloadStyle";
            style.innerHTML = css;
            document.head.appendChild(style);
        },
        script: (code, src = 0) => {
            let script = document.createElement("script");
            if (src == 0) {
                script.id = "CustomPictureDownloadScript";
                script.type = "text/javascript";
                script.innerHTML = code;
            } else if (src == 1) {
                //script.src = "https://code.jquery.com/jquery-3.6.4.js";
                script.src = "https://code.jquery.com/jquery-3.6.4.min.js";
            } else if (src == 2) {
                script.src = "https://html2canvas.hertzen.com/dist/html2canvas.min.js";
            }
            document.body.appendChild(script);
        },
        delay: async (time, msg = 1) => {
            if (time > 200 && msg == 1) fun.show(`延遲${time}毫秒...`, 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);
            });
        },
        xhr: (url, type = "text", referer = location.href) => {
            return new Promise((resolve, reject) => {
                _GM_xmlhttpRequest({
                    method: "GET",
                    url: url,
                    responseType: type,
                    headers: {
                        "Referer": referer,
                        "User-Agent": navigator.userAgent
                    },
                    onload: data => {
                        resolve(data.response);
                    },
                    onerror: error => {
                        reject(error);
                    }
                });
            });
        },
        remove: (ele, time = 0) => {
            setTimeout(() => {
                fun.gae(ele).forEach(e => {
                    e.remove()
                });
            }, time)
        },
        addNextHtml: (url, ele, pos) => {
            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 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(ele).insertAdjacentHTML(_pos, text);
        }
    };

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

    let promiseBlobArray = [];
    let downloadNum = 0;

    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(".customPicDownloadMsg").removeAttribute("style");
        ge(".customPicDownloadMsg").innerText = text;
        setTimeout(() => {
            ge(".customPicDownloadMsg").innerText = "none";
            ge(".customPicDownloadMsg").style = "display:none";
        }, time);
    };

    const getDataMsg = (text, picNum, imgsNum) => {
        if (picNum != "none") {
            fun.show(`第${downloadNum += 1}/${imgsNum}張下載${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") => {
        return fetch(srcUrl, {
            referrer: getReferer(srcUrl)
        }).then(res => res.blob()).then(blob => {
            getDataMsg("完成", picNum, imgsNum);
            return {
                blob: blob,
                picNum: picNum
            };
        });
    };

    const GMGetData = (srcUrl, picNum = "none", imgsNum = "none") => {
        return new Promise(resolve => {
            _GM_xmlhttpRequest({
                method: "GET",
                url: srcUrl,
                responseType: "blob",
                headers: {
                    origin: location.origin,
                    referer: getReferer(srcUrl),
                    accept: "*/*"
                },
                onload: data => {
                    let blob = data.response;
                    if (blob.type == "application/octet-stream" || blob.type == "binary/octet-stream") {
                        resolve({
                            blob: blob,
                            picNum: picNum
                        });
                        getDataMsg("完成", picNum, imgsNum);
                    } else if (/^image/.test(blob.type)) {
                        resolve({
                            blob: blob,
                            picNum: picNum
                        });
                        getDataMsg("完成", picNum, imgsNum);
                    } else {
                        resolve({
                            error: "下載錯誤",
                            picNum: picNum,
                            src: srcUrl
                        });
                        getDataMsg("錯誤", picNum, imgsNum);
                    }
                },
                onerror: error => {
                    resolve({
                        error: "下載錯誤",
                        picNum: picNum,
                        src: srcUrl
                    });
                    getDataMsg("錯誤", 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 => {
        let imgs;
        if (ge(".CustomPictureDownloadImage")) {
            imgs = [...gae(".CustomPictureDownloadImage")];
        } else if (typeof selector == "function") {
            imgs = await selector();
        } else if (!selector || selector === "") {
            showMsg("已取消");
            return;
        } else if (selector.length < 3) {
            showMsg("字數小於3已取消");
            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); //去除空、無用
        return imgs;
    };

    const imgZipDownload = async () => {
        if (downloading) {
            alert("下載&壓縮中請稍後再操作!");
            return;
        }
        let selector, titleText;
        if (!siteData.autoDownload || siteData.autoDownload && siteData.autoDownload[0] != 1 && options.autoDownload != 1) {
            if (typeof siteData.imgs == "function") {
                selector = siteData.imgs;
            } else {
                selector = await prompt("請輸入自訂CSS/Xpath選擇器:\n範例:img#TheImg OR //img[@id='TheImg']\n也能使用JS代碼自己生成的IMG元素陣列\n範例:js;return [...document.images];", options.default);
            }
            titleText = await prompt("請輸入自訂壓縮檔資料夾名稱", (customTitle || document.title.replace(/\[\d+p(\d+v)?\]|【\d+P】/i, "").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, "").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("0101010101...", 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;
                }
                if (options.one == 1 || siteData.one == 1) {
                    if (siteData.fetch == 1) {
                        promiseBlob = await fetchData(imgSrc, picNum, imgsNum);
                    } else {
                        promiseBlob = await GMGetData(imgSrc, picNum, imgsNum);
                    }
                } else {
                    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) {
                    downloadNum = 0;
                    downloading = false;
                    fun.show(`下載失敗了${errorDataArray.length}張不壓縮`, 3000);
                    setTimeout(() => {
                        fun.show("建議F5後重新下載", 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("圖片extension錯誤", 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("壓縮進度: " + metadata.percent.toFixed(2) + " %", 0);
                        }).then(async data => {
                            debug("\nZIP壓縮檔數據:", data);
                            saveData(data, `${title} [${imgsNum}P].zip`);
                            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(`自動下載倒數${max}秒`, 0);
                                    for (let i = 1; i < max; i++) {
                                        setTimeout(() => {
                                            fun.show(`自動下載倒數${countdownNum-=1}秒`, 0);
                                        }, i * 1000);
                                    }
                                    setTimeout(() => {
                                        if (typeof next === "function") {
                                            fun.show("nextJS前往下一頁");
                                            location.href = ele;
                                        } else {
                                            ele.click();
                                            fun.show("已點擊下一頁");
                                        }
                                    }, max * 1000);
                                } else if (!ele && siteData.autoDownload[0] == 1 || !ele && options.autoDownload == 1) {
                                    fun.show("自動下載完畢", 0);
                                }
                            }
                        });
                    }
                } else {
                    promiseBlobArray = [];
                    downloadNum = 0;
                    downloading = false;
                    showMsg("下載失敗數據為空...");
                }
            });
        } else {
            showMsg("已取消");
        }
    };

    const copyImgSrcText = async () => {
        if (downloading) {
            alert("下載&壓縮中請稍後再操作!");
            return;
        }
        let selector;
        if (typeof siteData.imgs == "function") {
            selector = siteData.imgs;
        } else {
            selector = await prompt("請輸入自訂CSS/Xpath選擇器:\n範例:img#TheImg OR //img[@id='TheImg']\n也能使用JS代碼自己生成的IMG元素陣列\n範例:js;return [...document.images];", 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("沒有任何圖片元素...");
            return;
        }
        globalImgArray = imgSrcArray;
        if (!fun.ge(".CustomPictureDownloadImage") && siteData.insertImg) {
            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(`圖片網址已複製(${imgs.length})`);
        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 oneSwitch = () => {
        if (options.one == 1) {
            options.one = 0;
            showMsg("啟用多線程");
        } else {
            options.one = 1;
            showMsg("啟用單線程");
        }
    };

    const goToNo1Img = (time = 1000) => {
        let img = ge(".CustomPictureDownloadImage");
        if (img) {
            if (time != 0) showMsg("即將進行捲動...");
            setTimeout(() => {
                img.scrollIntoView({
                    behavior: "smooth"
                });
            }, time);
        }
    };

    const addCustomPicDownloadButton = () => {
        let img = new Image();
        img.id = "customPicDownload";
        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", "左鍵:進行下載打包壓縮\n中鍵:捲動至第一張大圖\n右鍵:複製圖片網址和標題或聚集所有圖片");
        img.oncontextmenu = () => false;
        img.addEventListener("click", () => {
            imgZipDownload();
        });
        img.addEventListener("mousedown", (event) => {
            if (event.button == 1) {
                event.preventDefault();
                //oneSwitch();
                goToNo1Img(0);
            }
            if (event.button == 2) {
                copyImgSrcText();
            }
        });
        document.body.appendChild(img);
    };


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

    const elementClick = ele => {
        let 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();
    };

    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 = 'CustomPictureDownloadImageReturnTop';
        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 noneData = customData.filter(item => item.category == "none"); //列出未分類

    const style = `
.CustomPictureDownloadImageReturnTop {
    position: fixed;
    right: 10px;
    bottom: 80px;
    width: 53px;
    z-index: 99;
    opacity: 0.5;
}
#customPicDownload {
    width: 32px!important;
    height: 32px!important;
    position: fixed!important;
    bottom: 20px!important;
    left: 20px!important;
    z-index:2147483647!important;
    opacity: 0.8!important;
    display: block!important;
}
.customPicDownloadMsg {
    font-family: Arial,sans-serif!important;
    font-size: 26px;
    font-weight: bold;
    text-align: center;
    line-height: 50px;
    color: #ffffff;
    width: 280px;
    height: 50px;
    top: 30%;
    left: 50%;
    margin-left: -140px;
    padding: 0px!important;
    background-color: #000;
    border: 1px solid #303030;
    border-radius: 10px;
    position: fixed;
    z-index:2147483647;
    opacity: 0.7;
}
.CustomPictureDownloadImage {
    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;
}
.CustomPictureDownloadImage[src*="i.imgur.com"] {
    min-height: 400px!important;
}
#customPicDownloadEnd {
    font-size: 20px;
    height: 30px;
    line-height: 30px;
    text-align: center;
    margin: 5px auto!important;
}
#customPicDownloadEnd~*:not(.link-d):not(#myrating):not(.gallery-a):not(.pagination):not(div[class^=picnext]) {
    display: none!important;
}
.customPicDownloadLoading {
    font-size: 20px;
	text-align: center;
    height: 30px;
    line-height: 30px;
    margin: 5px auto!important;
    border: none!important;
}
#customPicDownload~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords) {
    display:none!important;
}
    `;

    for (let i = 0; i < customData.length; i++) {
        if (customData[i].reg.test(siteUrl)) {
            if (!ge(".customPicDownloadMsg")) fun.addCustomPicDownloadMsg();
            if (!ge(".CustomPictureDownloadStyle")) fun.css(style);
            let delay = customData[i].delay;
            if (delay) {
                await fun.delay(delay, 0);
            }
            options.enable = 1;
            if (customData[i].enable == 0) {
                if (options.comic == 1 && customData[i].category === "comic") {
                    debug("漫畫類全局開啟")
                } else {
                    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];
            if (customData[i].imgs) {
                options.default = customData[i].imgs;
                debug(`\nCSS/Xpath/JS選擇器:${options.default}`);
            }
            if (customData[i].one) {
                options.one = customData[i].one;
                debug("\n單線程下載");
            }
            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) {
                if (typeof titleCode == "string") {
                    customTitle = await new Function("siteData", "fun", '"use strict";' + titleCode)(siteData, fun);
                } else if (typeof titleCode == "function") {
                    customTitle = await titleCode();
                }
                debug(`\n自定義標題:${customTitle}`);
            }
            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("nextJS前往下一頁", 0);
                        if (/^http/.test(link)) {
                            location.href = link;
                        } else {
                            fun.show("沒有下一頁元素");
                        }
                    } else if (typeof next === "string") {
                        if (link) {
                            link.click();
                            fun.show("已點擊下一頁");
                        } else {
                            fun.show("沒有下一頁元素");
                        }
                    }
                };
                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();
                            fun.show("已點擊上一頁");
                        } else {
                            fun.show("沒有上一頁元素");
                        }
                    }
                });
            } else if (prev == 1) {
                document.addEventListener("keydown", (event) => {
                    let key = window.event ? event.keyCode : event.which;
                    if (key == 37) {
                        event.preventDefault();
                        fun.show("返回上一頁");
                        history.back();
                    }
                });
            }
            let css = customData[i].css;
            if (css) {
                fun.css(css);
            }
            let autoClick = customData[i].autoClick;
            if (autoClick) {
                if (typeof autoClick == "object") {
                    setTimeout(() => {
                        let ele = fun.ge(autoClick[0]);
                        if (ele) elementClick(ele);
                    }, autoClick[1] || 1000);
                } else if (typeof autoClick == "string") {
                    let ele = fun.ge(autoClick);
                    if (ele) elementClick(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(`怠惰聚圖observerClick("${observerClick}")`);
                                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);
            }
            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;
        }
    }

    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列出未分類規則", noneData);
    }

    if (options.enable == 1) {
        if (!ge(".customPicDownloadMsg")) fun.addCustomPicDownloadMsg();
        if (!ge(".CustomPictureDownloadStyle")) fun.css(style);
        if (siteData.key != 0) {
            document.addEventListener('keydown', (event) => {
                switch (event.keyCode) {
                    case 96: //數字鍵0
                        imgZipDownload();
                        break;
                    case 97: //數字鍵1
                        copyImgSrcText();
                        break;
                    case 98: //數字鍵2
                        goToNo1Img(0);
                        break;
                }
            });
        }
        if (siteData.icon == 0) {
            return;
        } else if (options.icon == 1 || siteData.icon == 1) addCustomPicDownloadButton();
    }

})();