Stay - a local userscript manager and an extension sample for Safari on iOS/iPadOS

Overview

Logo

Stay²

Views iOS System TestFlight HelloGithub Dev Newsletter

中文 | EN

Stay²是一个开源的本地iOS Safari扩展脚本管理器,Stay²有着自己的API提供给开发者,并且也支持部分油猴脚本。

主要功能

  • 内置脚本库
  • 本地脚本管理

申请提交到内置脚本库

如果您是一名开发者或者是浏览器扩展脚本的资深用户,欢迎通过Embed Script Request来申请提交到内置脚本库,这样您的脚本就可以在Stay²的新版本中被更多的用户看到。

Stay API

API Wiki

脚本仓库

Stay官方脚本

第三方tg频道 - Act Channel D

许可证

MPL

Safari插件开发参考资料

用户交流

Twitter:@shenruisi

或者关注公众号效率先生,并回复微信群 进群沟通。

Comments
  • 希望支持AC-baidu-重定向优化百度搜狗谷歌必应搜索_favicon_双列

    希望支持AC-baidu-重定向优化百度搜狗谷歌必应搜索_favicon_双列

    Discussed in https://github.com/shenruisi/Stay/discussions/17

    Originally posted by shenruisi December 30, 2021

    // ==UserScript==
    // @name    AC-baidu-重定向优化百度搜狗谷歌必应搜索_favicon_双列
    // @name:en    AC-baidu-google_sogou_bing_RedirectRemove_favicon_adaway_TwoLine
    // @name:zh    AC-baidu-重定向优化百度搜狗谷歌必应搜索_favicon_双列
    // @name:ja    AC-baidu-重定向最適化Baiduの搜狗のGoogleのBing検索結果のリダイレクト除去+favicon
    // @description  1.繞過百度、搜狗、谷歌、好搜搜索結果中的自己的跳轉鏈接,直接訪問原始網頁-反正都能看懂 2.新增自定义网站拦截功能 3添加Favicon显示 4.页面CSS 5.添加计数 6.开关选择以上功能 7.自动翻页功能
    // @description:en  1.bypass the redirect link at baidu\sogou\google\haosou; 2.remove ads at baidu; 3.add Favicon for each website; 4.render your own style; 5.counter; 6.Switch to handle all 7.Auto Pager
    // @description:ja  1.迂回Baidu、Sogou、Google、Haosou検索検索結果の中の自分の遷移リンク; 2.Baiduの余分な広告を取り除く; 3.コメントを追加; 4.ページのカスタムCSP; 5.カウントを追加; 6.スイッチは以上の機能を選択します; 7.自動ページめくり.
    // @icon    https://ae01.alicdn.com/kf/Hac1a58055c5047cdb91349e91aa208d5k.jpg
    // @author    AC
    // @license    GPL-3.0-only
    // @create     2015-11-25
    // @run-at     document-body
    // @version    25.01
    // @connect    baidu.com
    // @connect    google.com
    // @connect    google.com.hk
    // @connect    google.com.jp
    // @connect    bing.com
    // @connect    duckduckgo.com
    // @connect    dogedoge.com
    // @connect    so.com
    // @include    *://ipv6.baidu.com/*
    // @include    *://www.baidu.com/*
    // @include    *://www1.baidu.com/*
    // @include    *://m.baidu.com/*
    // @include    *://xueshu.baidu.com/s*
    // @include    *://www.so.com/s?*
    // @include    *://*.bing.com/*
    // @include    *://encrypted.google.*/search*
    // @include    *://*.google*/search*
    // @include    *://*.google*/webhp*
    // @include    *://*.zhihu.com/*
    // @include    *://*duckduckgo.com/*
    // @include    *://*.dogedoge.com/*
    // @exclude    *://*.google*/sorry*
    // @exclude    https://zhidao.baidu.com/*
    // @exclude    https://*.zhidao.baidu.com/*
    // @exclude    https://www.baidu.com/img/*
    // @supportURL  https://ac.tujidu.com/
    // @home-url   https://greasyfork.org/zh-TW/scripts/14178
    // @home-url2  https://github.com/langren1353/GM_script
    // @homepageURL  https://greasyfork.org/zh-TW/scripts/14178
    // @copyright  2015-2020, AC
    // @lastmodified  2021-12-06
    // @feedback-url  https://github.com/langren1353/GM_script
    // @note    2021.12-06-V25.01 修复百度样式偏左 & 修复谷歌样式显示
    // @note    2021.10-31-V24.29 fixed Less requirement for faster Load
    // @note    2021.10-29-V24.27 移除必应能选择的广告;增加自定义样式less的支持
    // @note    2021.09-02-V24.26 修复必应多favicon,修复百度百科问题;修复谷歌一个小问题
    // @note    2021.07-16-V24.25 修复一个bug;兼容百度下搜索股票tag;
    // @note    2021.06-15-V24.24 更换cdn地址
    // @note    2017.05.12 -> 2021.06-15 && V8.6 -> V24.24 各种各样的历史更新记录,从一个版本迭代到另一个版本
    // @note    2017.05.12-V8.4 新增:默认屏蔽谷歌的安全搜索功能
    // @note    2017.05.05-V8.3 修复include范围太小导致的百度知道的屏蔽问题
    // @note    2017.05.04-V8.2 终于修复了百度知道图片替换了文字的这个大BUG; 顺便处理了superapi.zhidao.baidu.com; 新增谷歌搜索结果重定向去除
    // @note    2017.05.04-V8.1 终于修复了百度知道图片替换了文字的这个大BUG,顺便处理了superapi.zhidao.baidu.com
    // @note    2017.05.04-V8.0 终于修复了百度知道图片替换了文字的这个大BUG,待测试
    // @note    2017.03.28-V7.6 修复在ViolentMonkey上的不支持的问题
    // @note    2017.03.28-V7.5 尝试修复chrome上的问题
    // @note    2017.03.21-V7.4 尝试处理Edge上不支持的问题,结果发现是Edge本身的TamperMonkey支持有问题
    // @note    2017.03.19-V7.3 修复打开百度之后再次点击“百度一下”导致的无法更新重定向问题
    // @note    2017.03.19-V7.2 未知原因chrome的MutationObserver无法使用了,继续回归以前的DOMNodeInserted
    // @note    2017.02.17-V7.0 修复搜狗的搜索结果重定向问题+改个名字
    // @note    2017.02.17-V6.9 修复搜狗的搜索结果重定向问题
    // @note    2016.10.27-V6.7 修复了以前的重复请求,现在的请求数应该小了很多,网络也就不卡了,感觉萌萌哒
    // @note    2016.04.24-V6.6 恢复以前的版本,因为兼容性问题
    // @note    2015.12.01-V5.0 加入搜狗的支持,但是支持不是很好
    // @note    2015.11.25-V2.0 优化,已经是真实地址的不再尝试获取
    // @note    2015.11.25-V1.0 完成去掉百度重定向的功能
    // @resource  baiduCommonStyle   http://ibaidu.tujidu.com/newcss/baiduCommonStyle.css?t=25.01
    // @resource  baiduOnePageStyle  http://ibaidu.tujidu.com/newcss/baiduOnePageStyle.css?t=25.012
    // @resource  baiduTwoPageStyle  http://ibaidu.tujidu.com/newcss/baiduTwoPageStyle.css?t=25.012
    // @resource  baiduLiteStyle     http://ibaidu.tujidu.com/newcss/baiduLiteStyle.css?t=25.01
    // @resource  googleCommonStyle  http://ibaidu.tujidu.com/newcss/googleCommonStyle.css?t=25.01
    // @resource  googleOnePageStyle http://ibaidu.tujidu.com/newcss/googleOnePageStyle.css?t=25.01
    // @resource  googleTwoPageStyle http://ibaidu.tujidu.com/newcss/googleTwoPageStyle.css?t=25.01
    // @resource  bingCommonStyle    http://ibaidu.tujidu.com/newcss/bingCommonStyle.css?t=25.01
    // @resource  bingOnePageStyle   http://ibaidu.tujidu.com/newcss/bingOnePageStyle.css?t=25.01
    // @resource  bingTwoPageStyle   http://ibaidu.tujidu.com/newcss/bingTwoPageStyle.css?t=25.01
    // @resource  duckCommonStyle    http://ibaidu.tujidu.com/newcss/duckCommonStyle.css?t=25.01
    // @resource  duckOnePageStyle   http://ibaidu.tujidu.com/newcss/duckOnePageStyle.css?t=25.01
    // @resource  duckTwoPageStyle   http://ibaidu.tujidu.com/newcss/duckTwoPageStyle.css?t=25.01
    // @resource  dogeCommonStyle    http://ibaidu.tujidu.com/newcss/dogeCommonStyle.css?t=25.01
    // @resource  dogeOnePageStyle   http://ibaidu.tujidu.com/newcss/dogeOnePageStyle.css?t=25.01
    // @resource  dogeTwoPageStyle   http://ibaidu.tujidu.com/newcss/dogeTwoPageStyle.css?t=25.01
    // @resource  MainHuYanStyle     http://ibaidu.tujidu.com/newcss/HuYanStyle.css?t=25.01
    // @resource  SiteConfigRules    http://ibaidu.tujidu.com/newcss/SiteConfigRules.conf?t=25.01
    // @require https://cdn.staticfile.org/vue/2.6.11/vue.min.js
    // @require https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js
    // @require https://cdn.jsdelivr.net/npm/[email protected]/dist/less.js
    // @require https://cdn.staticfile.org/md5-wasm/1.0.2/md5-wasm.min.js
    // @grant    GM_getValue
    // @grant    GM.getValue
    // @grant    GM_setValue
    // @grant    GM.setValue
    // @grant    GM_addStyle
    // @grant    GM_getResourceURL
    // @grant    GM_listValues
    // @grant    GM_getResourceUrl
    // @grant    GM.getResourceUrl
    // @grant    GM_xmlhttpRequest
    // @grant    GM_getResourceText
    // @grant    GM_registerMenuCommand
    // @namespace [email protected]
    // ==/UserScript==
    // calc(X1(vw) + X2(px)) -> B(px) 使用 http://www.yunsuan.info/matrixcomputations/solvelinearsystems.html 进行计算
    !function () {
      let isdebug = false;
      let isLocalDebug = isdebug || false;
      let debug = isdebug ? console.log.bind(console) : ()=>{}
      let acCssLoadFlag = false;
    
      let inExtMode = typeof (isExtension) !== "undefined";
      let inGMMode = typeof (GM_info.scriptHandler) !== "undefined"; // = "Greasemonkey" || "Tampermonkey" || "ViolentMonkey"
      // 新版本的GreaseMonkey是带有scriptHandler,但是没有GM_getResourceText;旧版本不带scriptHandler,但是有GM_getResourceText
      // let isNewGM = typeof(GM_info.scriptHandler) !== "undefined" && GM_info.scriptHandler.toLowerCase() === "greasemonkey";
      let isNewGM = false;
      // inExtMode & inGMMode
      // true    true =扩展下的GM代码 不执行
      // true    false=扩展下代码 执行
      // false  true =仅GM代码 执行
      // false  false=异常 但是还是要执行代码
      debug("程序开始");
      if (inExtMode === true && inGMMode === true || typeof(window.AC666Init) !== 'undefined') {
        console.log("扩展模式-脚本不启用");
        return;
      }
      window.AC666Init = true
      if (typeof (GM) === "undefined") {
        // 这个是ViolentMonkey的支持选项
        GM = {};
        GM.setValue = GM_setValue;
        GM.getValue = GM_getValue;
      }
      (function () {
        debug("程序执行");
        let needDisplayNewFun = true; // 本次更新是否有新功能需要展示
        if (window.NodeList && !NodeList.prototype.forEach) {
          NodeList.prototype.forEach = function (callback, thisArg) {
            thisArg = thisArg || window;
            for (var i = 0; i < this.length; i++) {
              callback.call(thisArg, this[i], i, this);
            }
          };
        }
        // let RedirectMap = new Map();
        let ACConfig = {};
        let DBConfig = {}; // 仅作为普通ACConfig的原始备份,在其他非关键位置时进行保存使用
        /*存在对未初始化变量的初始化赋值-无需担心迭代兼容问题*/
        let DefaultConfig = {
          isRedirectEnable: false,  // 是否开启重定向功能
          isAdsEnable: false, // 是否开启去广告模式
          isAutopage: true,  // 是否开启自动翻页功能
          isBlockEnable: false, // 是否开启去拦截模式
          isBlockDisplay: false, // 是否删除已拦截的条目
          isBlockBtnNotDisplay: false, // 是否显示block按钮
          AdsStyleEnable: true, // 是否开启自定义样式模式
    
          baidu: {
            name: 'baidu',  // CSS load 的前缀标志
            AdsStyleMode: '1', // 0-不带css;1-单列靠左;2-单列居中;3-双列居中
            HuYanMode: false, // 护眼模式-百度
          },
          google: {
            name: 'google',
            AdsStyleMode: '3', // 0-不带css;1-单列靠左;2-单列居中;3-双列居中
            HuYanMode: false, // 护眼模式-谷歌
          },
          bing: {
            name: 'bing',
            AdsStyleMode: '3', // 0-不带css;1-单列靠左;2-单列居中;3-双列居中
            HuYanMode: false, // 护眼模式-必应
          },
          duck: {
            name: 'duck',
            AdsStyleMode: '3', // 0-不带css;1-单列靠左;2-单列居中;3-双列居中
            HuYanMode: false, // 护眼模式-DuckGOGO
          },
          doge: {
            name: 'doge',
            AdsStyleMode: '3', // 0-不带css;1-单列靠左;2-单列居中;3-双列居中
            HuYanMode: false, // 护眼模式-DuckGOGO
          },
          sogou: {
            name: 'sogou',
            AdsStyleMode: '1', // 0-不带css;1-单列靠左;2-单列居中;3-双列居中
            HuYanMode: false, // 护眼模式-搜狗
          },
          zhihu: {
            name: 'zhihu',
            AdsStyleMode: '0', // 0-不带css;1-单列靠左;2-单列居中;3-双列居中
            HuYanMode: false, // 护眼模式-搜狗
          },
          other: {
            name: 'other',
            AdsStyleMode: '0', // 0-不带css;1-单列靠左;2-单列居中;3-双列居中
            HuYanMode: false, // 护眼模式-搜狗
          },
    
          Style_BaiduLite: false, // Baidu_Lite样式表
    
          defaultHuYanColor: "#DEF1EF",
          isUserColorEnable: true, // 是否开启favicon图标功能
          isFaviconEnable: true, // 是否开启favicon图标功能
          defaultFaviconUrl: "https://ae01.alicdn.com/kf/HTB1dRY0X8OD3KVjSZFFq6An9pXay.jpg", // 默认图标地址
          doDisableSug: true, // 是否禁止百度搜索预测
          isRightDisplayEnable: true, // 是否开启右侧边栏
          isCounterEnable: false, // 是否显示计数器
          isALineEnable: false, // 是否禁止下划线
          isUserStyleEnable: false, // 是否开启自定义样式
          normalizeDuck: true, // 是否按照常用习惯去配置DuckDuckGo
          acceptLicense: false,
          isEnLang: false,
          isGooleInBaiduModeEnable: false, // 是否开启谷歌搜索结果页的百度图标显示
          UserBlockList: [],
          UserStyleText:
            `/**计数器的颜色样式*/
    div .AC-CounterT{
      background: #FD9999;
    }
    /**右侧栏的样式-其实不开启更好看一些*/
    #content_right{
      padding: 20px 15px 15px;
      border-radius: 5px;
      background-color: #fff;
      box-sizing: border-box;
      box-shadow: 0 0 20px 2px rgba(0, 0, 0, .1);
      -webkit-box-shadow: 0 0 20px 2px rgba(0, 0, 0, .1);
      -moz-box-shadow: 0 0 20px 2px rgba(0, 0, 0, .1);
    }
    body[baidu] {
      position: relative;
    }
    body[baidu]:before {
      position: fixed;
      width: 100%;
      height: 100%;
      top: 0;
      left: 0;
      content: '';
      background-image: url('https://img.tujidu.com/image/5fdde8468423e.jpg');
      background-size: 100% auto;
      opacity: 1; /*背景图透明度=0.8,最大1*/
    }
    /**隐藏首页的大图标-修复可能导致外援样式异常**/
    body[baidu] #s_lg_img_new{
      display:none !important;
    }
    body[baidu] .c-container{
      border-radius: 5px;
      background-color: rgba(255,255,255, 0.3) !important; /*百度搜索块体的颜色;透明度=0.1,最大1*/
    }
    body[baidu] .c-container h3{
      background-color: rgba(248,248,248, 0.3) !important; /*百度搜索块体 - 标题的颜色;透明度=0.1,最大1*/
    }`,
          oldVersion: "",
          lastSaveTime: new Date().getTime(),
        };
        let CONST = {
          hasNewFuncNeedDisplay: true,
          sortIndex: 1,
          isGoogleImageUrl: false,
          isGoogleSpecial: false, // 判断是否存在#rso>.g; true=存在
          useItem: {},
          StyleManger: function () {
          },
        };
    
        var curSite = {
          SiteTypeID: 1,  // 当前站点的ID
          MainType: "",    // 主体节点,很多个的父节点
          Stype_Normal: "", // 重定向选择器,只有百度-搜狗-好搜
          FaviconType: "",  // favicon的域名检查器cite,用于获取host用
          FaviconAddTo: "", // favicon选择器,用于插入到title之前的
          CounterType: "",  // 计数器添加的位置,一般和favicon位置一致
          BlockType: "",  // 屏蔽按钮的位置,一般在title之后
        };
        let DBSite = {
          baidu: {
            SiteTypeID: 1,
            MainType: "#content_left .c-container",
            Stype_Normal: "h3.t>a, .c-container article a",
            FaviconType: ".c-showurl",
            FaviconAddTo: "h3",
            CounterType: "#content_left>#double>div[srcid] *[class~=t],[class~=op_best_answer_question],#content_left>div[srcid] *[class~=t],[class~=op_best_answer_question]",
            BlockType: "h3 a",
            pager: {
              nextLink: '//div[@id="page"]//a[contains(text(),"下一页")][@href]',
              pageElement: "css;div#content_left > *",
              HT_insert: ["css;div#content_left", 2],
              replaceE: "css;#page",
              stylish: ".autopagerize_page_info, div.sp-separator {margin-bottom: 10px !important;}",
            }
          },
          sogou: {
            SiteTypeID: 2,
            MainType: "#main .results>div",
            Stype_Normal: "h3.pt>a, h3.vrTitle>a",
            FaviconType: "cite[id*='cacheresult_info_']",
            FaviconAddTo: "h3",
            CounterType: ".results>div",
            BlockType: "h3 a",
            pager: {
              nextLink: "//div[@id=\"pagebar_container\"]//a[@id=\"sogou_next\"]",
              pageElement: "//div[@class=\"results\"]/div",
              HT_insert: ["//div[@class=\"results\"]", 2],
              replaceE: "id(\"pagebar_container\")"
            }
          },
          haosou: {
            SiteTypeID: 3,
            MainType: ".res-list",
            Stype_Normal: ".res-list h3>a",
            FaviconType: "cite",
            FaviconAddTo: "h3",
            CounterType: ".results>div",
            BlockType: "h3 a",
            pager: {
              nextLink: "//div[@id='page']//a[text()='下一页>'] | id('snext')",
              pageElement: "//div[@id='container']/div",
              HT_insert: ["//div[@id='container']", 2],
              replaceE: "id('page')"
            }
          },
          google: {
            SiteTypeID: 4,
            MainType: "#rso .g",
            FaviconType: ".iUh30",
            FaviconAddTo: "h3",
            CounterType: "#rso .g h3,._yE>div[class~=_kk] h3",
            BlockType: ".rc>.r>a",
            pager: {
              nextLink: 'id("pnnext") | id("navbar navcnt nav")//td[span]/following-sibling::td[1]/a | id("nn")/parent::a',
              pageElement: '//div[@id="res"]',
              HT_insert: ["css;#res", 2],
              replaceE: '//div[@id="navcnt"] | //div[@id="rcnt"]//div[@role="navigation"]'
            }
          },
          bing: {
            SiteTypeID: 5,
            MainType: "#b_results>li",
            FaviconType: ".b_attribution>cite",
            FaviconAddTo: "h2",
            CounterType: "#b_results>li[class~=b_ans]>h2,#b_results>li[class~=b_algo]>h2,#b_results>li[class~=b_algo]>h2",
            BlockType: "h2 a",
            pager: {
              nextLink: "//a[contains(@class,\"sb_pagN\")]",
              pageElement: "id(\"b_results\")/li[not(contains(@class,\"b_pag\") or contains(@class,\"b_ans b_top\"))]",
              HT_insert: ["id(\"b_results\")/li[@class=\"b_pag\"]", 1],
              replaceE: "id(\"b_results\")//nav[@role=\"navigation\"]",
            }
          },
          duck: {
            SiteTypeID: 10,
            MainType: "#links_wrapper #links .results_links_deep",
            FaviconType: ".results_links_deep .result__url__domain",
            FaviconAddTo: "h2",
            CounterType: "#links_wrapper #links .results_links_deep h2",
            BlockType: "h2 a",
            pager: {
              nextLink: "//a[contains(@class,\"sb_pagN\")]",
              pageElement: "id(\"b_results\")/li[not(contains(@class,\"b_pag\") or contains(@class,\"b_ans b_top\"))]",
              HT_insert: ["id(\"b_results\")/li[@class=\"b_pag\"]", 1],
              replaceE: "id(\"b_results\")//nav[@role=\"navigation\"]",
            }
          },
          doge: {
            SiteTypeID: 11,
            MainType: "#links_wrapper #links .results_links_deep",
            FaviconType: ".results_links_deep .result__url__domain",
            FaviconAddTo: "h2",
            CounterType: "#links_wrapper #links .results_links_deep h2",
            BlockType: "h2 a",
            pager: {
              nextLink: "//a[contains(@class,\"sb_pagN\")]",
              pageElement: "id(\"b_results\")/li[not(contains(@class,\"b_pag\") or contains(@class,\"b_ans b_top\"))]",
              HT_insert: ["id(\"b_results\")/li[@class=\"b_pag\"]", 1],
              replaceE: "id(\"b_results\")//nav[@role=\"navigation\"]",
            }
          },
          mBaidu: {
            SiteTypeID: 6,
            MainType: "#b_results>li",
            FaviconType: ".b_attribution>cite",
            FaviconAddTo: "h2",
            CounterType: "#b_results>li[class~=b_ans]>h2,#b_results>li[class~=b_algo]>h2,#b_results>li[class~=b_algo]>h2",
            BlockType: "h2 a",
          },
          zhihu: {
            SiteTypeID: 7,
          },
          baidu_xueshu: {
            SiteTypeID: 8,
            MainType: "#content_left .result",
            Stype_Normal: "h3.t>a, #results .c-container>.c-blocka",
            FaviconType: ".result-op, .c-showurl", // baidu 似乎要改版了?
            FaviconAddTo: "h3",
            CounterType: "#content_left>#double>div[srcid] *[class~=t],[class~=op_best_answer_question],#content_left>div[srcid] *[class~=t],[class~=op_best_answer_question]",
            BlockType: "h3 a",
          },
          other: {
            SiteTypeID: 9,
          }
        };
        let SiteType = {
          BAIDU: DBSite.baidu.SiteTypeID,
          MBAIDU: DBSite.mBaidu.SiteTypeID,
          SOGOU: DBSite.sogou.SiteTypeID,
          SO: DBSite.haosou.SiteTypeID,
          GOOGLE: DBSite.google.SiteTypeID,
          BING: DBSite.bing.SiteTypeID,
          DUCK: DBSite.duck.SiteTypeID,
          DOGE: DBSite.doge.SiteTypeID,
          ZHIHU: DBSite.zhihu.SiteTypeID,
          BAIDU_XUESHU: DBSite.baidu_xueshu.SiteTypeID,
          OTHERS: 8
        };
        let otherData = {
          other: {
            curTab: 1, // 展示第二panel
            showBlockListArea: false, // blockList展示位textarea
            addBlockItem: "",     // 用户手动输入的拦截规则
            curHosts: [],         // 存放已经访问的hosts数据内容
          }
        };  // 到时候挂载到other上
        let AllData = {
          ACConfig: {},
          other: otherData.other,
          CONST: CONST,
          lan: {
            use: {},
            zh_cn: {
              menu_text: "自定义",
              curLang: "zh_cn",
              fieldset_panel: {
                panel_title: "AC-重定向设置 " + GM_info.script.version + (inExtMode? 'Ext':''),
                setting_panel: {
                  redirect_text: "主功能-重定向功能",
                  redirect_title: "重定向功能的开启与否",
                  useEn_text: "En-Language",
                  useEn_title: "Using English language to display",
                  ads_text: "附加1-去广告功能",
                  ads_title: "去除部分页面的广告信息,还你一个干净整洁的页面",
                  autopage_text: "自动翻页",
                  autopage_title: "自动翻页",
                  blockenable_text: "附加2-自主拦截域名",
                  blockenable_title: "点击页面block按钮添加你想要隐藏的地址,脚本将自动隐藏部分结果为小横幅,DIY按钮中点击表格内容可以取消隐藏",
                  blockDiyBtn_text: "DIY",
                  blockDiyBtn_title: "自定义BLOCK",
                  blockAutoRemove_text: "隐藏结果",
                  blockAutoRemove_title: "自动隐藏已经屏蔽的域名",
                  blockBtnShow_text: "隐藏'block'按钮",
                  blockBtnShow_title: "隐藏掉block按钮的显示",
    
                  userStyle_text: "附加3-自定义样式",
                  userStyle_baidu_lable: "展开百度设置>>",
                  userStyle_baidu_origin: "百度-原始模式",
                  userStyle_baidu_huyan: "百度-护眼模式",
                  userStyle_baidu_baiduLite: "百度Lite样式",
                  userStyle_baidu_1line: "单列",
                  userStyle_baidu_1line_enter: "单列居中",
                  userStyle_baidu_2line: "双列",
                  userStyle_baidu_3line: "三列",
                  userStyle_baidu_4line: "四列",
    
                  userStyle_google_lable: "展开谷歌设置>>",
                  userStyle_google_origin: "谷歌-原始模式",
                  userStyle_google_huyan: "谷歌-护眼模式",
                  userStyle_google_googleLite: "谷歌-伪装百度",
                  userStyle_google_1line: "单列",
                  userStyle_google_1line_enter: "单列居中",
                  userStyle_google_2line: "双列",
                  userStyle_google_3line: "三列",
                  userStyle_google_4line: "四列",
    
                  userStyle_bing_lable: "展开必应设置>>",
                  userStyle_bing_origin: "必应-原始模式",
                  userStyle_bing_huyan: "必应-护眼模式",
                  userStyle_bing_1line: "单列",
                  userStyle_bing_1line_enter: "单列居中",
                  userStyle_bing_2line: "双列",
                  userStyle_bing_3line: "三列",
                  userStyle_bing_4line: "四列",
    
                  userStyle_sogou_lable: "展开搜狗设置>>",
                  userStyle_sogou_origin: "搜狗-原始模式",
                  userStyle_sogou_huyan: "搜狗-护眼模式",
                  userStyle_sogou_1line: "单列",
                  userStyle_sogou_1line_enter: "单列居中",
                  userStyle_sogou_2line: "双列",
                  userStyle_sogou_3line: "三列",
                  userStyle_sogou_4line: "四列",
    
                  userStyle_duck_lable: "展开鸭鸭搜设置>>",
                  userStyle_duck_origin: "鸭鸭-原始模式",
                  userStyle_duck_huyan: "鸭鸭-护眼模式",
                  userStyle_duck_normal: "鸭鸭-常见配置",
                  userStyle_duck_1line: "单列",
                  userStyle_duck_1line_enter: "单列居中",
                  userStyle_duck_2line: "双列",
                  userStyle_duck_3line: "三列",
                  userStyle_duck_4line: "四列",
    
                  userStyle_doge_lable: "展开多吉设置>>",
                  userStyle_doge_origin: "多吉-原始模式",
                  userStyle_doge_huyan: "多吉-护眼模式",
                  userStyle_doge_normal: "多吉-常见配置",
                  userStyle_doge_1line: "单列",
                  userStyle_doge_1line_enter: "单列居中",
                  userStyle_doge_2line: "双列",
                  userStyle_doge_3line: "三列",
                  userStyle_doge_4line: "四列",
    
                  huyanMode_text: "附加4-护眼颜色配置-自定义3中需对应开启",
                  huyanMode_title: "!需要在自定义样式中启用护眼模式",
                  huyanColor_text: "默认护眼颜色:",
                  huyanColor_title: "自定义的护眼颜色:",
                  huyanColorMore_text: "更多颜色选择",
    
                  favicon_text: "附加5-Favicon功能",
                  favicon_title: "AC-添加Favicon",
                  favicon_defaultIcon_text: "Favicon默认图标:",
    
                  searchOrigin_text: "附加6-移除百度搜索预测(文字自动搜索)",
                  searchOrigin_title: "AC-移除搜索预测",
    
                  showRight_text: "附加7-显示右侧栏",
                  showCounter_text: "附加8-编号功能",
                  hintShowCounter_text: "可能会导致图片加载异常",
                  showALine_text: "附加9-文字下划线",
                  showUserStyle_text: "附加10-自定义样式 支持Less.js",
    
                  contactMe_text: "联系作者,提建议,寻求帮助,自定义样式,脚本定制点我",
                  contactMe_url: "https://github.com/langren1353/GM_script",
    
                  setting_panel_second: {
                    backBtn_text: "<-返回",
                    blockLabel_text: " 拦截列表  想要生效的话需要手动保存",
                    blockEditBtn_text: "编辑列表",
                    blockEditBtnEnd_text: "结束编辑",
                    addBlockLabel_text: "全匹配拦截:",
                    addBtnLabel_text: "添加",
                  },
                  cancelBtn_text: "取消",
                  okBtn_text: "保存",
                  resetBtn_text: "重置",
                }
              }
            },
            en: {
              menu_text: "CUSTOM",
              curLang: "en",
              fieldset_panel: {
                panel_title: "AC Redirect Settings " + GM_info.script.version + (inExtMode? 'Ext':''),
                setting_panel: {
                  redirect_text: "Main-RedirectFunc",
                  redirect_title: "Turn on or off redirect",
                  useEn_text: "En-Language",
                  useEn_title: "使用英文显示页面",
                  ads_text: "Add1-Remove Ads",
                  ads_title: "Remove the ads on the page, and return you a clean page",
                  autopage_text: "Auto Pager",
                  autopage_title: "Auto Pager",
                  blockenable_text: "Add2-Block host",
                  blockenable_title: "Click the Block button to add the address which you want to hide. The script will hide it with small banner automatically. DIY button for editting the hiding list",
                  blockDiyBtn_text: "DIY",
                  blockDiyBtn_title: "Edit BLOCK",
                  blockAutoRemove_text: "Auto remove",
                  blockAutoRemove_title: "remove the block results automatically",
                  blockBtnShow_text: "Hide 'Block' button",
                  blockBtnShow_title: "Hide 'Block' button",
    
                  userStyle_text: "Add3-CustomStyle",
                  userStyle_baidu_lable: "Expand Baidu Settings>>",
                  userStyle_baidu_origin: "Baidu-Origin",
                  userStyle_baidu_huyan: "Baidu-EyeSave",
                  userStyle_baidu_baiduLite: "BaiduLiteStyle",
                  userStyle_baidu_1line: "SingleRow",
                  userStyle_baidu_1line_enter: "SingleCenter",
                  userStyle_baidu_2line: "Two",
                  userStyle_baidu_3line: "Three",
                  userStyle_baidu_4line: "Four",
    
                  userStyle_google_lable: "Expand Google Settings>>",
                  userStyle_google_origin: "Google-Origin",
                  userStyle_google_huyan: "Google-EyeSave",
                  userStyle_google_googleLite: "Fake Baidu",
                  userStyle_google_1line: "SingleRow",
                  userStyle_google_1line_enter: "SingleCenter",
                  userStyle_google_2line: "Two",
                  userStyle_google_3line: "Three",
                  userStyle_google_4line: "Four",
    
                  userStyle_bing_lable: "Expand Bing Settings>>",
                  userStyle_bing_origin: "Bing-Origin",
                  userStyle_bing_huyan: "Bing-EyeSave",
                  userStyle_bing_1line: "SingleRow",
                  userStyle_bing_1line_enter: "SingleCenter",
                  userStyle_bing_2line: "Two",
                  userStyle_bing_3line: "Three",
                  userStyle_bing_4line: "Four",
    
                  userStyle_sogou_lable: "Expand SoGou Settings>>",
                  userStyle_sogou_origin: "SoGou-Origin",
                  userStyle_sogou_huyan: "SoGou-EyeSave",
                  userStyle_sogou_1line: "SingleRow",
                  userStyle_sogou_1line_enter: "SingleCenter",
                  userStyle_sogou_2line: "Two",
                  userStyle_sogou_3line: "Three",
                  userStyle_sogou_4line: "Four",
    
                  userStyle_duck_lable: "Expand DuckDuckGo Settings>>",
                  userStyle_duck_origin: "DuckDuck-Origin",
                  userStyle_duck_huyan: "DuckDuck-EyeSave",
                  userStyle_duck_normal: "DuckDuck-Normal",
                  userStyle_duck_1line: "SingleRow",
                  userStyle_duck_1line_enter: "SingleCenter",
                  userStyle_duck_2line: "Two",
                  userStyle_duck_3line: "Three",
                  userStyle_duck_4line: "Four",
    
                  userStyle_doge_lable: "Expand DogeDoge Settings>>",
                  userStyle_doge_origin: "DogeDoge-Origin",
                  userStyle_doge_huyan: "DogeDoge-EyeSave",
                  userStyle_doge_normal: "DogeDoge-Normal",
                  userStyle_doge_1line: "SingleRow",
                  userStyle_doge_1line_enter: "SingleCenter",
                  userStyle_doge_2line: "Two",
                  userStyle_doge_3line: "Three",
                  userStyle_doge_4line: "Four",
    
                  huyanMode_text: "Add4-EyeSave Color Setting-Need opened in Add3",
                  huyanMode_title: "!Open EyeSave Mode in CustomStyle is Must",
                  huyanColor_text: "Default EyeSave Color:",
                  huyanColor_title: "The color of EyeSave:",
                  huyanColorMore_text: "More Color",
    
                  favicon_text: "Add5-Favicon.Func",
                  favicon_title: "AC-AddFavicon",
                  favicon_defaultIcon_text: "FaviconFailedImg::",
    
                  searchOrigin_text: "AC-Remove Baidu AutoPredict in text search",
                  searchOrigin_title: "Add6-Remove Baidu AutoPredict in text search",
    
                  showRight_text: "Add7-Right Side Column",
                  showCounter_text: "Add8-NumFunc",
                  hintShowCounter_text: "May Cause image load problem",
                  showALine_text: "Add9-TextUnderLine",
                  showUserStyle_text: "Add10-Your own Style support Less.js",
    
                  contactMe_text: "For contact the writter, suggests, ask for help then click me",
                  contactMe_url: "https://github.com/langren1353/GM_script/",
    
                  setting_panel_second: {
                    backBtn_text: "<-Back",
                    blockLabel_text: "&nbsp;Block List&nbsp;&nbsp;Click Save Button if you want wo save the list",
                    blockEditBtn_text: "Edit List",
                    blockEditBtnEnd_text: "End Edit",
                    addBlockLabel_text: "Add Block item:",
                    addBtnLabel_text: "Add",
                  },
                  cancelBtn_text: "Cancel",
                  okBtn_text: "Save",
                  resetBtn_text: "Reset",
                }
              }
            }
          }
        };
        let vueVM = null;
        /**初始化所有的设置**/
        Promise.all([GM.getValue("Config")]).then(function (data) {
          let res = data[0]
          if (res != null) {
            try {
              ACConfig = JSON.parse(res);
            } catch (e) {
              ACConfig = res;
            }
          } else {
            ACConfig = DefaultConfig;
          }
          const localData = localStorage.ACConfig; // 小心隐私模式
          if(localData && localData.length > 0) {
            ACConfig = JSON.parse(localData);
          }
          for (var key in DefaultConfig) {
            if (typeof (ACConfig[key]) === "undefined") {
              ACConfig[key] = DefaultConfig[key];
            }
          }
          if (ACConfig.isUserStyleEnable === false && (new Date().getTime() - ACConfig.lastSaveTime > 2592000000)) { // 大约30天时间
            // 如果用户取消了设置,并且长时间(30天)没有进行过处理,那么直接将数据置空 -> 用于刷新数据
            console.log("ac-baidu css reset for time");
            ACConfig.lastSaveTime = new Date().getTime();
            ACConfig.UserStyleText = DefaultConfig.UserStyleText;
          }
          AllData.ACConfig = ACConfig;
          DBConfig = JSON.parse(JSON.stringify(ACConfig)); // 暂时作为一个原始保存
          AllData.lan.use = ACConfig.isEnLang ? AllData.lan.en : AllData.lan.zh_cn;
          // 初始化完成之后才能调用正常函数
          callback();
        }).catch(function (except) {
          console.log(except);
        });
    
        function Reg_Get(HTML, reg) {
          let RegE = new RegExp(reg);
          try {
            return RegE.exec(HTML)[1];
          } catch (e) {
            return "";
          }
        }
    
        function ACSetValue(key, value) {
          GM_setValue(key, value);
          if(key === 'Config'){
            localStorage.ACConfig = value;
          }
        }
    
        function getElementByXpath(e, t, r) {
          r = r || document, t = t || r;
          try {
            return r.evaluate(e, t, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
          } catch (t) {
            return void console.error("无效的xpath");
          }
        }
    
        function getAllElements(e, t, r, n, o) {
          let getAllElementsByXpath = function(e, t, r) {
            return r = r || document, t = t || r, r.evaluate(e, t, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
          }
    
          var i, s = [];
          if (!e) return s;
          if (r = r || document, n = n || window, o = o || void 0, t = t || r, "string" === typeof e) i = 0 === e.search(/^css;/i) ? function getAllElementsByCSS(e, t) {
            return (t || document).querySelectorAll(e);
          }(e.slice(4), t) : getAllElementsByXpath(e, t, r); else {
            if (!(i = e(r, n, o))) return s;
            if (i.nodeType) return s[0] = i, s;
          }
          return function makeArray(e) {
            var t, r, n, o = [];
            if (e.pop) {
              for (t = 0, r = e.length; t < r; t++) (n = e[t]) && (n.nodeType ? o.push(n) : o = o.concat(makeArray(n)));
              return a()(o);
            }
            if (e.item) {
              for (t = e.length; t;) o[--t] = e[t];
              return o;
            }
            if (e.iterateNext) {
              for (t = e.snapshotLength; t;) o[--t] = e.snapshotItem(t);
              return o;
            }
          }(i);
        }
    
        function callback() {
          if (ACConfig.oldVersion === GM_info.script.version) {
            CONST.hasNewFuncNeedDisplay = false;
          } else {
            CONST.hasNewFuncNeedDisplay = needDisplayNewFun;
          }
    
          !function() {
            /**
             * 进行不重复插入,插入后执行回调函数
             * @param data 待插入数据
             * @param callback 回调函数
             */
            function acpush(data, callback) {
              // 如果是垃圾数据,那么可以丢弃的
              if (!data) return;
              // 如果数据中有回车,那数据也是无效的正文而已
              if (data.replace(/({|}|,|\+|:|。|\n)/) !== data) return;
              if (this.findIndex(m => m === data) < 0) {
                this.push(data);
                callback && callback(this);
              }
            }
            function acremove(data, callback) {
              let delId = this.findIndex(m => m === data);
              if (delId >= 0) {
                this.splice(delId, 1);
                callback && callback(this);
              } // 删除delId的数据,删除一个
            }
            // 避免污染全局原型链
            Object.defineProperty(ACConfig.UserBlockList, 'acpush', {value: acpush})
            Object.defineProperty(ACConfig.UserBlockList, 'acremove', {value: acremove})
            Object.defineProperty(otherData.other.curHosts, 'acpush', {value: acpush})
            Object.defineProperty(otherData.other.curHosts, 'acremove', {value: acremove})
          }();
    
    
    
          !function () {
            let insertLocked = false;
            if (typeof GM_getResourceText === 'undefined') {
              GM.getResourceText = GM_getResourceText = async function (aResourceName) {
                let res = await (await fetch(await GM.getResourceUrl(aResourceName))).text();
                let saveRes = await GM.getValue(aResourceName);
                if (typeof (saveRes) === 'undefined') {
                  GM.setValue(aResourceName, res);
                } else {
                  return saveRes;
                }
                return res;
              }
            }
            if (GM_getResourceText) {
              // 仅在支持GM_getResourceText的容器上进行动态数据更新
              // 且能防止谷歌百度页面规则大变动又需要更新脚本 - 特别是涉及翻页参数
              let config = GM_getResourceText("SiteConfigRules");
              eval(config);
              if (typeof (onlineDB) === "undefined") {
                console.error("线上数据为空");
              } else {
                DBSite = onlineDB;
              }
            }
            if (location.host.includes("xueshu.baidu.com")) {
              curSite = DBSite.baidu_xueshu;
            } else if (location.host.includes(".baidu.com")) {
              if (navigator.userAgent.replace(/(android|mobile|iphone)/igm, "") !== navigator.userAgent) {
                curSite = DBSite.mBaidu;
              } else {
                curSite = DBSite.baidu;
              }
              CONST.useItem = ACConfig.baidu;
            } else if (location.host.includes("zhihu.com")) {
              curSite = DBSite.zhihu;
              CONST.useItem = ACConfig.zhihu;
            } else if (location.host.includes("sogou")) {
              curSite = DBSite.sogou;
              CONST.useItem = ACConfig.sogou;
            } else if (location.host.includes("so.com")) {
              curSite = DBSite.haosou;
              CONST.useItem = ACConfig.other;
            } else if (location.host.includes("google")) {
              curSite = DBSite.google;
              CONST.useItem = ACConfig.google;
            } else if (location.host.includes("bing")) {
              curSite = DBSite.bing;
              CONST.useItem = ACConfig.bing;
            } else if (location.host.includes("duckduckgo")) {
              curSite = DBSite.duck;
              CONST.useItem = ACConfig.duck;
            } else if (location.host.includes("dogedoge")) {
              curSite = DBSite.doge;
              CONST.useItem = ACConfig.doge;
            } else {
              curSite = DBSite.other;
              CONST.useItem = ACConfig.other;
            }
            curSite.pageNum = 1; // 当前页数
            curSite.pageLoading = false;
            curSite.pageUrl = "";
            if (
              (curSite.SiteTypeID === SiteType.GOOGLE && location.href.replace(/tbm=(isch|lcl|shop|flm)/, "") !== location.href ) ||
              (curSite.SiteTypeID === SiteType.BING && location.href.replace(/images\/search/, "") !== location.href )
            ) {
              // 图片站 、地图站、购物站
              console.log("特殊站,不加载样式,不添加menu");
              CONST.isGoogleImageUrl = true;
            }
    
            if(curSite.SiteTypeID === SiteType.BAIDU_XUESHU){
              CONST.useItem.AdsStyleMode = 2; // 单列居中即可
            }
    
            if (ACConfig.AdsStyleEnable) {
              CONST.StyleManger = FSBaidu(); // 添加设置项-单双列显示
            }
    
            console.log("%c[AC-Redirect] %cLet Me Introduce you a Very Good Search Engine:%c %s %cSearch Engine.", "font-weight:bold;color:cornflowerblue", "color:0", "font-weight:bold;color:darkorange", CONST.useItem.name.replace(CONST.useItem.name[0], CONST.useItem.name[0].toUpperCase()), "font-weight:normal;color:0");
    
            let SiteBlock = {
              /**
               * 初始化Block样式
               */
              initStyle: function () {
                AC_addStyle("button.ghhider.ghhb[ac-user-alter='1']::before{content:'取消 - ';}#sp-ac-container .ac-block-item{color:#AAA;margin-left:48px;}#sp-ac-container .ac-block-itemdel{float:right;margin-left:0;padding:0 20px;cursor:pointer;}#sp-ac-container .ac-block-itemdel:hover{color:red;}#sp-ac-container .ac-block-high{color:#000;}.ac-blockList li:hover{background-color:#a3caff;color:white !important;cursor:pointer;} *[ac-needhide] *{display:none} *[ac-needhide] .blockShow{display:unset;cursor:pointer;} *[ac-needhide] .blockShow:hover{border:1px solid #DDD}button.ghhider{color:#555;background-color:#fcfcfc;font-family:sans-serif;margin:auto 2px;border:1px solid #ccc;border-radius:4px;padding:2px 3px}button.ghhider{font-size:12px}button.ghhider:hover{color:#006aff;background:#fff}",
                  "AC-BlockStyle");
              },
              /**
               * 初始化屏蔽按钮加载
               */
              init: function () {
                let checkNodes = document.querySelectorAll(curSite.MainType + ":not([acblock])");
                for (let i = 0; i < checkNodes.length; i++) {
                  try {
                    let curNode = checkNodes[i];
                    let faviconNode = curNode.querySelector(curSite.FaviconType);
                    // if(curNode.hasAttribute("acblock")) continue;
                    let host = getNodeHost(faviconNode).curHost;
                    // if(host === null) continue;
                    let faNode = curNode.querySelector(curSite.BlockType);
                    let nodeStyle = "display:unset;";
                    if (ACConfig.isBlockBtnNotDisplay) {
                      nodeStyle = "display:none;";
                    }
                    faNode.insertAdjacentHTML("afterend", `<button style='${nodeStyle}' class='ghhider ghhb' href="${faviconNode.href || faviconNode.innerText}" meta="${host}" data-host="${host}" title='${this.getBlockBtnTitle(host)}'>block</button>`);
    
                    curNode.setAttribute("acblock", "0");
                    curNode.setAttribute("acblock", "0");
                  } catch (e) {
                  }
                }
                this.initListener();
                this.renderDisplay();
              },
              getBlockBtnTitle(host){
                return `点击即可屏蔽 ${host} 放开,需要在自定义中手动配置放开`;
              },
              initListener: function () {
                let checkNodes = document.querySelectorAll("button.ghhider:not([acEnv])");
                for (let i = 0; i < checkNodes.length; i++) {
                  checkNodes[i].addEventListener("click", this.doHideEnv);
                  checkNodes[i].setAttribute("acEnv", "0");
                }
              },
              doHideEnv: function (env) {
                // 先插入数据---记得还要写入存储
                let node = env.sourceTarget || env.target;
                let host = node.dataset.host;
                if (+node.getAttribute("ac-user-alter") === 1) {
                  // 已经屏蔽之后,再次点击block应该是取消状态
                  node.removeAttribute("ac-user-alter");
                  ACConfig.UserBlockList.acremove(host);
                } else {
                  // 正常屏蔽操作
                  node.removeAttribute("ac-user-alter");
                  ACConfig.UserBlockList.acpush(host);
                }
                DBConfig.UserBlockList = ACConfig.UserBlockList;
                ACSetValue("Config", JSON.stringify(DBConfig)); // 点击一次,保存一次
                SiteBlock.renderDisplay();
                env.stopPropagation();
              },
              // 刷新显示效果--耗时操作
              renderDisplay: function () {
                let checkNodes = document.querySelectorAll(curSite.MainType);
                let flag = "ac-needhide";
                for (let i = 0; i < checkNodes.length; i++) {
                  try {
                    let curNode = checkNodes[i];
                    let {curHost, curUrl} = getNodeHost(curNode.querySelector(curSite.FaviconType));
                    curUrl = curUrl || "";
                    if (curHost === null) continue;
                    {
                      let BlockBtn = curNode.querySelector(".ghhider.ghhb");
                      BlockBtn.dataset.host = BlockBtn.dataset.meta = curHost;
                      BlockBtn.title = this.getBlockBtnTitle(curHost);
                    }
                    if (curNode.querySelector("button[ac-user-alter]") != null) continue; // 用户手动点过显示的,那么跳过check
                    let { md5: md5_tag, list: regList = []} = vueVM.calc_block_data; // 使用Vue的computed属性计算的数据值,一般根本不更新
                    // 减少数据计算
                    if(curNode.dataset.md5 && curNode.data.md5 === md5_tag) break
                    if (!curUrl.includes("www.baidu.com/link") && regList.findIndex(one => {
                      try {
                        return one.test(curHost) || one.test(curUrl); // 耗时操作
                      } catch (e) {
                        return m === curHost;
                      }
                    }) >= 0) {
                      // 只检查在屏蔽表中的数据
                      if (!curNode.hasAttribute(flag)) {
                        if (ACConfig.isBlockDisplay) { // 对于不显示的数据可以进行移除操作
                          curNode.remove();
                          continue;
                        }
                        let curTitle = curNode.querySelector(curSite.BlockType);
                        curTitle = curTitle.innerText || curTitle.textContent;
    
                        if (curNode.hasAttribute(flag)) {
                          console.log("冲突了!!!");
                          continue;
                        }
    
                        curNode.setAttribute(flag, "1");
                        curNode.insertAdjacentHTML("afterBegin", `<span class="blockShow" title="如果需要一直显示,请在自定义中DIY目录移除本地址">${curTitle}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -block by ${curHost}</span>`);
    
                        (function (xcur) {
                          // 已经屏蔽之后的内容,点击一下显示原始内容
                          xcur.querySelector(".blockShow").addEventListener("click", function (env) {
                            this.parentNode.querySelector("button.ghhider").setAttribute("ac-user-alter", "1"); // 这个属性用于保持在DOM更新时,按钮不变
                            xcur.removeAttribute(flag);
                            safeFunction(function () {
                              xcur.querySelector(".blockShow").remove();
                            });
                            env.stopPropagation();
                          });
                        })(curNode);
                      }
                    } else {
                      curNode.removeAttribute(flag);
                      safeFunction(function () {
                        curNode.querySelector(".blockShow").remove();
                      });
                    }
                    curNode.dataset.md5 = md5_tag
                  } catch (e) {
                  }
                }
              }
            };
    
            function addStyle(css) { //添加CSS的代码--copy的
              let pi = document.createProcessingInstruction(
                'xml-stylesheet',
                'type="text/css" must="false" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"'
              );
              return document.insertBefore(pi, document.documentElement);
            }
    
            if (ACConfig.isAdsEnable) {
              // display已经无法隐藏他们了,需要用绝对的隐藏
              addStyle("#bottomads{display:none;} #content_left>div:not([id])>div[cmatchid], #content_left>div[id*='300']:not([class*='result']),#content_right td>div:not([id]),#content_right>br{position:absolute;top:-6666px;}");
            }
            if (curSite.SiteTypeID === SiteType.GOOGLE && ACConfig.isGooleInBaiduModeEnable) {
              safeWaitFunc("#logo img, #logocont img", function (node) {
                let faNode = node.parentNode.parentNode;
                faNode.classList.add("baidu");
                node.removeAttribute("src");
                node.src = "https://pic.rmb.bdstatic.com/c86255e8028696139d3e3e4bb44c047b.png";
                node.width = "125";
                node.removeAttribute("height");
              });
              safeWaitFunc("#main .logo img[alt='Google']", function (node) {
                node.removeAttribute("srcset");
                node.src = "https://www.baidu.com/img/bd_logo1.png?where=super";
                node.setAttribute("height", "59");
              }, 300);
              safeWaitFunc("form[role='search'] .logo img", function (node) {
                node.removeAttribute("srcset");
                node.src = "https://www.baidu.com/img/bd_logo1.png?where=super";
                node.setAttribute("height", "59");
              }, 300);
              document.title = document.title.replace(/^Google/, "百度一下,你就知道")
              .replace(/ - Google 搜索/, "_百度搜索")
              .replace(/ - Google Search/, "_百度搜索");
              safeWaitFunc("head", function () {
                let linkTarget = document.querySelector("link[type='image/x-icon']") || document.createElement('link');
                linkTarget.type = 'image/x-icon';
                linkTarget.rel = 'shortcut icon';
                linkTarget.href = 'https://www.baidu.com/favicon.ico';
                document.head.appendChild(linkTarget);
              })
            }
            if (curSite.SiteTypeID === SiteType.DUCK) {
              addStyle = AC_addStyle // 兼容Duck的CSP同源规则
              if(ACConfig.normalizeDuck){
                setTimeout(function () {
                  try {
                    DDG.settings.set("kn", 1, {  // 新窗口打开页面
                      saveToCloud: true,
                      forceTheme: true
                    });
                    DDG.settings.set("kav", 1, { // 连续显示搜索结果
                      saveToCloud: true,
                      forceTheme: true
                    });
                  } catch (e) {
                  }
                }, 5000);
              }
            }
            try {
              if (curSite.SiteTypeID !== SiteType.OTHERS) {
                document.addEventListener('DOMNodeInserted', MainCallback, false);
                document.addEventListener('keyup', MainCallback, false);
                safeWaitFunc("body", () => {
                  !document.body.hasAttribute(CONST.useItem.name) && document.body.setAttribute(CONST.useItem.name, "1");
                  !document.body.classList.contains(CONST.useItem.name) && document.body.classList.add(CONST.useItem.name);
                  if (ACConfig.AdsStyleEnable) { // 单独不需要定时器-頻繁触发-载入css
                    FSBaidu();
                    AddCustomStyle();
                  }
                })
                RAFInterval(function () {
                  if(document.body) {
                    rapidDeal(); // 定期调用,避免有时候DOM插入没有执行导致的问题
                    if (curSite.SiteTypeID === SiteType.BAIDU && location.href.includes("tn=news")) {
                      document.body.setAttribute("news", "1");
                    } else {
                      document.body.removeAttribute("news");
                    }
                  }
                }, 800);
              }
            } catch (e) {
              console.log(e);
            }
            safeWaitFunc("#sp-ac-content", function (checkNode) {
              var options = {
                el: checkNode,
                data: function () {
                  return {
                    ...AllData,
                    LiveConfig: {
                      css_has_error: false
                    },
                    resetCSS_text: '重置CSS',
                    calc_block_data: {}
                  }
                },
                methods: {
                  labelShowHideEnv(e) {
                    let cur = e.srcElement || e.target;
                    let className = cur.parentNode.className.replace("container-label ", "");
                    AC_addStyle(".XX>label,.XX>br{display:unset !important;}.XX>.label_hide{display:none !important;}".replace(/XX/gm, className),
                      "AC-ShowHideItem-" + className, "body");
                    e.stopPropagation();
                  },
                  syncToBlockList(env) {
                    this.ACConfig.UserBlockList = env.target.value.split("\n").filter(item => item !== '');
                  },
                  removeABlockListItem(e) {
                    // 点击移除某个host数据时
                    let target = e.srcElement || e.target;
                    if (target.tagName.toLowerCase() === "label") {
                      let host = target.dataset.host;
                      ACConfig.UserBlockList.acremove(host);
                    }
                  },
                  ckAddRule() {
                    // 手动增加移除规则
                    ACConfig.UserBlockList.acpush(this.other.addBlockItem);
                    this.other.addBlockItem = "";
                  },
                  loadCustomStyle() {
                    less.render(ACConfig.UserStyleText, (e, css) => {
                      if(e) {
                        this.LiveConfig.css_has_error = true
                      } else {
                        this.LiveConfig.css_has_error = false
                        css = css.css || ''
                        AC_addStyle(css, "AC-userStyle", "head", true); // 用户自定义的样式表
                      }
                    });
                  },
                  saveConfig() {
                    if(this.other.curTab===1 && !this.ACConfig.acceptLicense){
                      this.other.curTab = 3
                      return
                    }
                    this.ACConfig.acceptLicense = true
    
                    this.ACConfig.lastSaveTime = new Date().getTime();
                    ACSetValue("Config", JSON.stringify(this.ACConfig));
                    if(!this.ACConfig.doDisableSug){
                      acSetCookie("ORIGIN", 1, "www.baidu.com", new Date().getTime() - 86400000);
                      acSetCookie("ISSW", 1, null, new Date().getTime() - 86400000);
                      acSetCookie("ISSW", 1, "www.baidu.com", new Date().getTime() - 86400000);
                    }
                    setTimeout(function () {
                      window.location.reload();
                    }, 200);
                  },
                  changeResetText() {
                    this.lan.zh_cn.fieldset_panel.setting_panel.resetBtn_text = '双击重置'
                    this.lan.en.fieldset_panel.setting_panel.resetBtn_text = 'DBl click to Reset'
                  },
                  resetConfig() {
                    // 显示为双击重置
                    ACSetValue("Config", '{}');
                    setTimeout(function () {
                      window.location.reload();
                    }, 200);
                  },
                  closePanel() {
                    document.querySelector("#sp-ac-content").style.display = 'none';
                  },
                  resetCSS() {
                    if(this.resetCSS_text.includes('重置CSS')) {
                      this.resetCSS_text = '确认重置'
                      return
                    }
                    if(this.resetCSS_text.includes('确认重置')) {
                      this.ACConfig.UserStyleText = DefaultConfig.UserStyleText
                      this.resetCSS_text = '重置CSS'
                    }
                  },
                  useThisHuyanColor(env) {
                    this.ACConfig.defaultHuYanColor = env.target.value || env.target.dataset.value;
                    console.log(this.ACConfig.defaultHuYanColor);
                    CONST.StyleManger.loadHuYanStyle(this.ACConfig.defaultHuYanColor);
                  },
                  getUserBlockListRegex() {
                    var list = [];
                    this.ACConfig.UserBlockList.forEach(one => {
                      one !== null && list.push(new RegExp(one.replace("*", ".*")));
                    })
                    if (typeof (this.other.addBlockItem) !== "undefined" && this.other.addBlockItem !== "") {
                      list.push(new RegExp(this.other.addBlockItem.replace("*", ".*")));
                    }
                    return list;
                  }
                },
                computed: {
                  getBlockList() { // 会自动的render到html上去,不用手动去渲染一遍
                    let insHTML = "";
                    let { list: UserBlockRegList } = this.cal_UserBlockListRegex;
                    for (let i = 0; i < this.ACConfig.UserBlockList.length; i++) {
                      let insClass = this.other.curHosts.findIndex(m => {
                        try {
                          let [curHost, curUrl] = m.split("###");
                          return UserBlockRegList[i].test(curHost) || UserBlockRegList[i].test(curUrl);
                        } catch (e) {
                          return m === ACConfig.UserBlockList[i];
                        }
                      }) >= 0 ? " ac-block-high" : ""; // 如果当前页面存在,则高亮
                      insHTML += `<li><label class="ac-block-item${insClass}" data-host="${this.ACConfig.UserBlockList[i]}">${this.ACConfig.UserBlockList[i]}</label><label class="ac-block-item ac-block-itemdel" data-host="${this.ACConfig.UserBlockList[i]}">x</label></li>\n`;
                    }
                    return insHTML;
                  },
                  cal_diyBlockListBtn() {
                    if (this.other.showBlockListArea) {
                      return this.lan.use.fieldset_panel.setting_panel.setting_panel_second.blockEditBtnEnd_text;
                    } else {
                      return this.lan.use.fieldset_panel.setting_panel.setting_panel_second.blockEditBtn_text;
                    }
                  },
                  async cal_UserBlockListRegex() {
                    var list = [];
                    this.ACConfig.UserBlockList.forEach(one => {
                      one !== null && list.push(new RegExp(one.replace("*", ".*")));
                    })
                    if (typeof (this.other.addBlockItem) !== "undefined" && this.other.addBlockItem !== "") {
                      list.push(new RegExp(this.other.addBlockItem.replace("*", ".*")));
                    }
                    const str2ab = (str) => {
                      var buf = new ArrayBuffer(str.length * 2); // 每个字符占用2个字节
                      var bufView = new Uint16Array(buf);
                      for (var i = 0, strLen = str.length; i < strLen; i++) {
                        bufView[i] = str.charCodeAt(i);
                      }
                      return buf;
                    }
                    this.calc_block_data = {
                      md5: await md5WASM(str2ab(JSON.stringify(list))),
                      list
                    };
                    return this.calc_block_data
                  },
                  AdsStyleModeChange() {
                    return {
                      v1: CONST.useItem.AdsStyleMode,
                      v2: CONST.useItem.HuYanMode,
                      v3: ACConfig.Style_BaiduLite,
                      v4: ACConfig.isFaviconEnable,
                      v5: CONST.isGoogleSpecial,
                      v6: ACConfig.isRightDisplayEnable
                    };
                  },
                  UserStyleEnableChange() {
                    return {
                      v1: ACConfig.isUserStyleEnable
                    }
                  },
                  lanChange(){
                    return {
                      v1: ACConfig.isEnLang
                    };
                  },
                  isSaveButtonCanBeSee() {
                    return isElementVisible(this.$refs.bottomSaveButton)
                  }
                },
                watch: {
                  'CONST.useItem.HuYanMode': {
                    immediate: true,
                    handler(val) {
                      if(val) CONST.StyleManger.loadHuYanStyle()
                    }
                  },
                  AdsStyleModeChange: {
                    handler() {
                      // 需要先删除原有的节点数据
                      while (true) {
                        const {res, node} = checkDocmentHasNode("AC-")
                        if (res) node.remove();
                        else break;
                      }
                      safeRemove("style[class='AC-Style-expand'],style[class='AC-TwoPageExStyle'],style[class='AC-ThreePageExStyle'],style[class='AC-FourPageExStyle'],style[class='AC-style-logo'],style[class='AC-baiduLiteStyle'],style[class*='HuYanStyle-File']");
                      acCssLoadFlag = false;
                      CONST.StyleManger.init();
                    }
                  },
                  UserStyleEnableChange() {
                    if(ACConfig.isUserStyleEnable) {
                      this.loadCustomStyle();
                    } else {
                      safeRemove("style[class='AC-userStyle']")
                    }
                  },
                  lanChange(){
                    AllData.lan.use = ACConfig.isEnLang ? AllData.lan.en : AllData.lan.zh_cn;
                    document.querySelector("#myuser").remove();
                  }
                }
              };
              if (typeof (Vue) != "undefined") {
                if (+Vue.version.charAt(0) === 2) {
                  vueVM = new Vue(options);
                } else {
                  vueVM = Vue.createApp(options).mount(checkNode);
                }
              } else {
                console.error("Vue 未完成初始化--程序无法有效执行");
              }
            }, 250);
    
            function MainCallback(e) {
              if (e.target != null && typeof (e.target.className) === "string" && e.target.className.toUpperCase().indexOf("AC-") === 0) {
                return;
              } //屏蔽掉因为增加css导致的触发insert动作
              rapidDeal();
              InsertSettingMenu();
              setTimeout(function () {
                ShowSetting();
              }, 1000) // 滞后窗口的加载,减少前期CPU争用
            }
    
            /*以下代码大部分来源于SuprePreloader 感谢 swdyh && ywzhaiqi && NLF 以及 mach6 大佬*/
            /*
            Super_preloaderPlus_one_New: Preload and Autopager.
            Copyright (C) 2020 Mach6
    
            This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3.
    
            This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
    
            You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
             */
            function ac_spfunc(e) {
              console.error("这里有问题")
              e.stopPropagation();
              var t, r = e.currentTarget;
              var Tween = {
                    Linear: function Linear(e, t, r, n) {
                      return r * e / n + t;
                    },
                    Quad: {
                      easeIn: function easeIn(e, t, r, n) {
                        return r * (e /= n) * e + t;
                      },
                      easeOut: function easeOut(e, t, r, n) {
                        return -r * (e /= n) * (e - 2) + t;
                      },
                      easeInOut: function easeInOut(e, t, r, n) {
                        return (e /= n / 2) < 1 ? r / 2 * e * e + t : -r / 2 * (--e * (e - 2) - 1) + t;
                      }
                    },
                    Cubic: {
                      easeIn: function easeIn(e, t, r, n) {
                        return r * (e /= n) * e * e + t;
                      },
                      easeOut: function easeOut(e, t, r, n) {
                        return r * ((e = e / n - 1) * e * e + 1) + t;
                      },
                      easeInOut: function easeInOut(e, t, r, n) {
                        return (e /= n / 2) < 1 ? r / 2 * e * e * e + t : r / 2 * ((e -= 2) * e * e + 2) + t;
                      }
                    },
                    Quart: {
                      easeIn: function easeIn(e, t, r, n) {
                        return r * (e /= n) * e * e * e + t;
                      },
                      easeOut: function easeOut(e, t, r, n) {
                        return -r * ((e = e / n - 1) * e * e * e - 1) + t;
                      },
                      easeInOut: function easeInOut(e, t, r, n) {
                        return (e /= n / 2) < 1 ? r / 2 * e * e * e * e + t : -r / 2 * ((e -= 2) * e * e * e - 2) + t;
                      }
                    },
                    Quint: {
                      easeIn: function easeIn(e, t, r, n) {
                        return r * (e /= n) * e * e * e * e + t;
                      },
                      easeOut: function easeOut(e, t, r, n) {
                        return r * ((e = e / n - 1) * e * e * e * e + 1) + t;
                      },
                      easeInOut: function easeInOut(e, t, r, n) {
                        return (e /= n / 2) < 1 ? r / 2 * e * e * e * e * e + t : r / 2 * ((e -= 2) * e * e * e * e + 2) + t;
                      }
                    },
                    Sine: {
                      easeIn: function easeIn(e, t, r, n) {
                        return -r * Math.cos(e / n * (Math.PI / 2)) + r + t;
                      },
                      easeOut: function easeOut(e, t, r, n) {
                        return r * Math.sin(e / n * (Math.PI / 2)) + t;
                      },
                      easeInOut: function easeInOut(e, t, r, n) {
                        return -r / 2 * (Math.cos(Math.PI * e / n) - 1) + t;
                      }
                    },
                    Expo: {
                      easeIn: function easeIn(e, t, r, n) {
                        return 0 == e ? t : r * Math.pow(2, 10 * (e / n - 1)) + t;
                      },
                      easeOut: function easeOut(e, t, r, n) {
                        return e == n ? t + r : r * (1 - Math.pow(2, -10 * e / n)) + t;
                      },
                      easeInOut: function easeInOut(e, t, r, n) {
                        return 0 == e ? t : e == n ? t + r : (e /= n / 2) < 1 ? r / 2 * Math.pow(2, 10 * (e - 1)) + t : r / 2 * (2 - Math.pow(2, -10 * --e)) + t;
                      }
                    },
                    Circ: {
                      easeIn: function easeIn(e, t, r, n) {
                        return -r * (Math.sqrt(1 - (e /= n) * e) - 1) + t;
                      },
                      easeOut: function easeOut(e, t, r, n) {
                        return r * Math.sqrt(1 - (e = e / n - 1) * e) + t;
                      },
                      easeInOut: function easeInOut(e, t, r, n) {
                        return (e /= n / 2) < 1 ? -r / 2 * (Math.sqrt(1 - e * e) - 1) + t : r / 2 * (Math.sqrt(1 - (e -= 2) * e) + 1) + t;
                      }
                    },
                    Elastic: {
                      easeIn: function easeIn(e, t, r, n, a, o) {
                        return 0 == e ? t : 1 == (e /= n) ? t + r : (o || (o = .3 * n), !a || a < Math.abs(r) ? (a = r,
                          i = o / 4) : i = o / (2 * Math.PI) * Math.asin(r / a), -a * Math.pow(2, 10 * (e -= 1)) * Math.sin((e * n - i) * (2 * Math.PI) / o) + t);
                        var i;
                      },
                      easeOut: function easeOut(e, t, r, n, a, o) {
                        return 0 == e ? t : 1 == (e /= n) ? t + r : (o || (o = .3 * n), !a || a < Math.abs(r) ? (a = r,
                          i = o / 4) : i = o / (2 * Math.PI) * Math.asin(r / a), a * Math.pow(2, -10 * e) * Math.sin((e * n - i) * (2 * Math.PI) / o) + r + t);
                        var i;
                      },
                      easeInOut: function easeInOut(e, t, r, n, a, o) {
                        return 0 == e ? t : 2 == (e /= n / 2) ? t + r : (o || (o = n * (.3 * 1.5)), !a || a < Math.abs(r) ? (a = r,
                          i = o / 4) : i = o / (2 * Math.PI) * Math.asin(r / a), e < 1 ? a * Math.pow(2, 10 * (e -= 1)) * Math.sin((e * n - i) * (2 * Math.PI) / o) * -.5 + t : a * Math.pow(2, -10 * (e -= 1)) * Math.sin((e * n - i) * (2 * Math.PI) / o) * .5 + r + t);
                        var i;
                      }
                    },
                    Back: {
                      easeIn: function easeIn(e, t, r, n, a) {
                        return null == a && (a = 1.70158), r * (e /= n) * e * ((a + 1) * e - a) + t;
                      },
                      easeOut: function easeOut(e, t, r, n, a) {
                        return null == a && (a = 1.70158), r * ((e = e / n - 1) * e * ((a + 1) * e + a) + 1) + t;
                      },
                      easeInOut: function easeInOut(e, t, r, n, a) {
                        return null == a && (a = 1.70158), (e /= n / 2) < 1 ? r / 2 * (e * e * ((1 + (a *= 1.525)) * e - a)) + t : r / 2 * ((e -= 2) * e * ((1 + (a *= 1.525)) * e + a) + 2) + t;
                      }
                    },
                    Bounce: {
                      easeIn: function easeIn(e, t, r, n) {
                        return r - Tween.Bounce.easeOut(n - e, 0, r, n) + t;
                      },
                      easeOut: function easeOut(e, t, r, n) {
                        return (e /= n) < 1 / 2.75 ? r * (7.5625 * e * e) + t : e < 2 / 2.75 ? r * (7.5625 * (e -= 1.5 / 2.75) * e + .75) + t : e < 2.5 / 2.75 ? r * (7.5625 * (e -= 2.25 / 2.75) * e + .9375) + t : r * (7.5625 * (e -= 2.625 / 2.75) * e + .984375) + t;
                      },
                      easeInOut: function easeInOut(e, t, r, n) {
                        return e < n / 2 ? .5 * Tween.Bounce.easeIn(2 * e, 0, r, n) + t : .5 * Tween.Bounce.easeOut(2 * e - n, 0, r, n) + .5 * r + t;
                      }
                    }
                  },
                  TweenM = ["Linear", "Quad", "Cubic", "Quart", "Quint", "Sine", "Expo", "Circ", "Elastic", "Back", "Bounce"],
                  TweenEase = ["easeIn", "easeOut", "easeInOut"];
              var prefs = {
                s_method: 3,
                s_ease: 2,
                s_FPS: 60,
                s_duration: 333,
              };
    
              function getRelativeDiv(e) {
                var t = r.id;
                return (t = t.replace(/(sp-separator-)(.+)/, (function (t, r, n) {
                  return r + String(Number(n) + ("pre" == e ? -1 : 1));
                }))) ? document.getElementById(t) : null;
              }
    
              function sp_transition(e, t) {
                var r = sp_transition.TweenF;
                r || (r = (r = Tween[TweenM[prefs.s_method]])[TweenEase[prefs.s_ease]] || r, sp_transition.TweenF = r);
                var n = 1e3 / prefs.s_FPS, a = 0, o = e, i = t - e, s = Math.ceil(prefs.s_duration / n),
                    c = window.scrollX;
                !function transition() {
                  var e = Math.ceil(r(a, o, i, s));
                  window.scroll(c, e), a < s && (a++, setTimeout(transition, n));
                }();
              }
    
              function scrollIt(e, t) {
                sp_transition(e, t);
              }
    
              switch (e.target.id) {
                case "sp-sp-gotop":
                  scrollIt(window.scrollY, 0);
                  break;
    
                case "sp-sp-gopre":
                  var n = getRelativeDiv("pre");
                  if (!n) return;
                  t = window.scrollY;
                  var a = n.getBoundingClientRect().top;
                  a = t - (r.getBoundingClientRect().top - a);
                  scrollIt(t, a);
                  break;
    
                case "sp-sp-gonext":
                  var o = getRelativeDiv("next");
                  if (!o) return;
                  t = window.scrollY;
                  var i = o.getBoundingClientRect().top;
                  i = t + (-r.getBoundingClientRect().top + i);
                  scrollIt(t, i);
                  break;
    
                case "sp-sp-gobottom":
                  scrollIt(window.scrollY, Math.max(document.documentElement.scrollHeight, document.body.scrollHeight));
              }
            }
    
            function windowscroll(fn = ()=>{}) {
              safeWaitFunc(() => document.documentElement, () => {
                var beforeScrollTop = document.documentElement.scrollTop
                setTimeout(function () { // 延时执行,避免刚载入到页面就触发翻页事件
                  window.addEventListener("scroll", function (e) {
                    var afterScrollTop = document.documentElement.scrollTop,
                        delta = afterScrollTop - beforeScrollTop;
                    if (delta === 0) return false;
                    fn(delta > 0 ? "down" : "up", e);
                    beforeScrollTop = afterScrollTop;
                  }, false);
                }, 1000)
              })
            }
    
            windowscroll(function (direction, e) {
              if (direction === "down") { // 下滑才准备翻页
                let spl = document.querySelector("#sp-fw-a_enable");
                // 开启后,且在非(suprepreloader启用)时均可
                if (ACConfig.isAutopage === true && !(spl && spl.checked === true)) {
                  var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;
                  let scrollDelta = 666;
                  if (curSite.SiteTypeID === SiteType.GOOGLE) scrollDelta = 1024; // 毕竟谷歌加载缓慢的问题
                  if (document.documentElement.scrollHeight <= document.documentElement.clientHeight + scrollTop + scrollDelta && curSite.pageLoading === false) {
                    curSite.pageLoading = true;
                    if (curSite.SiteTypeID === SiteType.DUCK) { // 可以用已有的方法来实现了
                      if (!ACConfig.normalizeDuck || +ACConfig.duck.AdsStyleMode >= 3) {  // 如果没有开启,那么手动翻页 || 如果是双列的时候,似乎并不会自动触发翻页效果
                        document.querySelector("#links .result--more a").click();
                        setTimeout(function () {
                          curSite.pageLoading = false;
                        }, 5000);
                      }
                    } else {
                      ShowPager.loadMorePage();
                      if(curSite.pager && curSite.pager.stylish) {
                        AC_addStyle(curSite.pager.stylish, "AC-pager-stylish")
                      }
                    }
                  }
                }
              }
            });
            var ShowPager = {
              getFullHref: function (e) {
                if(e === null) return '';
                "string" != typeof e && (e = e.getAttribute("href"));
                var t = this.getFullHref.a;
                return t || (this.getFullHref.a = t = document.createElement("a")), t.href = e, t.href;
              },
              createDocumentByString: function (e) {
                if (e) {
                  if ("HTML" !== document.documentElement.nodeName) return (new DOMParser).parseFromString(e, "application/xhtml+xml");
                  var t;
                  try {
                    t = (new DOMParser).parseFromString(e, "text/html");
                  } catch (e) {
                  }
                  if (t) return t;
                  if (document.implementation.createHTMLDocument) t = document.implementation.createHTMLDocument("ADocument"); else try {
                    (t = document.cloneNode(!1)).appendChild(t.importNode(document.documentElement, !1)),
                      t.documentElement.appendChild(t.createElement("head")), t.documentElement.appendChild(t.createElement("body"));
                  } catch (e) {
                  }
                  if (t) {
                    var r = document.createRange();
                    r.selectNodeContents(document.body);
                    var n = r.createContextualFragment(e);
                    t.body.appendChild(n);
                    for (var a, o = {
                      TITLE: !0,
                      META: !0,
                      LINK: !0,
                      STYLE: !0,
                      BASE: !0
                    }, i = t.body, s = i.childNodes, c = s.length - 1; c >= 0; c--) o[(a = s[c]).nodeName] && i.removeChild(a);
                    return t;
                  }
                } else console.error("[AC-Script]", "没有找到要转成DOM的字符串");
              },
              loadMorePage: function () {
                if (curSite.pager) {
                  let curPageEle = getElementByXpath(curSite.pager.nextLink);
                  var url = this.getFullHref(curPageEle);
                  if(curSite.SiteTypeID === SiteType.GOOGLE ) {
                    if(navigator.userAgent.toLowerCase().includes('macintosh')) {
                      // MARK 为了兼容百度在safari下的
                      url = url.replace('https://', 'http://');
                    }
                  }
                  if(url === '') return;
                  var sepImgs = {
                    top: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAWtJREFUeNrclE0rRGEUx8c1GUpRJIVIZGdhZCVr38GGhaI0ZXwCkliglChZEcvJxhdgYWOjLEUpm/EyiLzze+o8dTzdO3PljoVTv7rPc8/5d+6555xYrEhWop6boda5+6l9wjWcWpF+WIbqCJJ9hFRcDr3QAIkIhKugz5PDfkSixkphz5aiAnqgE8rgWRxGoSOPyBkswQuUwyscw4HrmFCZL8Kt/JAg7mEFPEmo4FdPwk0BUcsdzIap0TQ8qMAPuICcEjLnd+VjSjcfJNgIc/DkZGSymYGsnK9EZMrxe4MFaNGiZjC2fT5zQ3p7QDK1dR2GSljziclAvRUe8nHYVA4jjvC43NfAuk/smB2QNqcsWxKcLbAKTFnS0hWD6n27Fd6FLqiDI5iQmQ9jpiVT0sNJ6aYd7dAE3QHBbinSAX5JWWaxuLo8F35jh/bBK9Y+/r/Cl6pLcnna8NvuDGMnslpbZRpXZYT/3r4EGACZL3ZL2afNFAAAAABJRU5ErkJggg==",
                    bottom: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAXFJREFUeNrM1c8rBGEcx/FdtCEkLqYtpdwkKSUHUhxwITdK+Z3yM2cOLnJ39Cc44SgHScmJwlFxsIdlCScO6/2t76Onp52dXTtbnno1M8+Pz84+zzMzkcg/KA3oRTzM0A4cI4VTdIUVPIM3pPGO5aABJTkGx1BqjYmFFZxW7nnBwXmXogWX6bEGc2jEIU7+kNWDUSSwZyqndSvJ3N1g2Bm0oLtB2j+w7rQP4MpqXzRT0YRaPW/BthMedYLs60HsoE2vq9BsPwAJa8XFLUa0fUrvROo/saT1Q9adGimdlt8yj6TT6Q6d2vaida9YRbtP6EqmBZC5fHA6X+AAz1bwEc6cfk9+oaZM4NoZJL70+J2hTaZtNpet041zK8yP/Mgl+rOF1emr0UM1xnAfEPyISd0Jno6vtx+QuM6PZ22lpO7dbEV2Siv6rPeIjNs1HdYC7ixfG+YBqdTVDqPIv6iIWvO7iXGUFxAqi72PraJ9IH8EGACQcYjYRd5GHwAAAABJRU5ErkJggg==",
                    pre: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAASlJREFUeNpiYBjOoBiIrwJxFRAzUsvQViD+CMT/gfgTEPdRy9BPUENh+AsQ91JiaAuSS9HxZ3INb8Hi0v+UurwF6qL/ROBvQNxDrKFfkTT+A+JnQPwBKfJA/L9Ian7ic7kMEHcC8Q80F3UAcRsQv4by30INaUJT9weaWhSQDRUB4uVYvLkYiAWAOBopvEFBlArEPEA8G4ue9UAsATM4EYuCJUgKMtAMLoSKCwPxXCx6c1igClTQgmUZVPNrHMEGy3mgYCkCYiYgTkCSV4UZvA2IjYBYDIgvQbPvOyJTECid5wHxbyA2BuL3QLwRWYEsEJvg0IweFEU41IEMlgcxWJAEH0MxJeAsjMFEq6Jw+Br8BimVfMCTDEkG7EBcA8T3oWUJx4DVYwABBgCannnSzbgwIQAAAABJRU5ErkJggg==",
                    next: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAT1JREFUeNrc1b1KA0EYheEl/iARFFEkKl6D0UK8CrEVrCwEexFCtBIlRWIjsfEiLL0FKzs7QUWxM2piFMUkvhPOwLAs2TGuCn7wkNll5jC7+w0Jgv9avdjAObbQn1TwCu7QwhWW4xakPIOHMKzxGCaSCm6ioXHLZ0Hqpz7KrwRPIvvNvBlM2zYyNY8cMjhDHo9fCBzErnIqKNjgRSxpvIABbOLes2MKWHfuXdhXcR2avKrJ4zGhI9gLhQbq9XaZgGO1kutIOzIHpKp7NawhjYOINSeY6lFwHacw17P6NTWHd4xqnNbcS83LObtsaCPbEW+gXUW8ODswC27xoOsn3ODDmfOGss9XLuE54jGjvPqGuuG1mFDzZIfdNHynnde7DbW1r5DwTstJHP2iE55YqD36ebXZDvr+7L/sU4ABAIpVZWnoA5GkAAAAAElFTkSuQmCC",
                    next_gray: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAtxJREFUeNrclc9L2mEcx7/6NbVZqRVj7pIOlIUuZ1HMgv0BDcqT7JrskH13ELPBF7eTvz10HznWQBlBRIfBXIfBLmqXscvYZWPKrMNIU9Apmrr34/w6i0ovMZjw+H0+z/N8Xt+Pn/fn80hR/+WHYRhBIpFwRKPRz/F4/KnD4RB28xH0Ah4cHHyoUCjsIpFIIZPJHkml0m9Yfn2ZD78XcL1eH6rValIMCmMUtqKbD7/HbNQxaq15oxcH/lXpcmXgtnh2u/2mXC6/DqE+sSxLlUqlniE0TVPBYJAqFot6+GV9Pt+PJthms80sLS2xEonkhlgs/jgwMOBcXV3N5fP5rlCcp9bX1yWLi4uecrk8U6lUshDY3wRbLJYFGKZsNksq4N78/LwY9hOn05k5Ojqi+PzTGePxeFwZUl6vd8hkMvkPDg6sZJ2M5eXlr1wqUu2kA5JOpy2IAO+oO9fW1n5mMpk2nDjmcjkKNU25XC652Wx2pVIp65mXJ2nyjUPpqakpNZxuA8Y5T87OzsobjcYHpVKpGhsbe1CtVkXYqxQKhTdqtfqL1Wr1JpPJxxyU5Lq/vz8aCoX8TTDatYiFhF6vxx5tAJwm8OPj48m5ubmKSqUaAWwSa9eQw6JGo/luNBoNh4eHbAe0JhAINsLh8LNAIJCiudhxB+Qh2ludTifDAQLvI3AIch+Rkl8jJlrhCbOqgfoLmDepOF/BfGNra2sFFZFtvqgzMbFYjAiyp9Vqh4VC4cTJyYmQ90epIQJtHRO1bA5aRhAvdnZ2GI/H87cEz5YPgeOS2RsfHx9B7u+gOi68yQAtYX9zd3eXgZCna/s8By5ypGUUzhOISHgO9BfWXwG6chZ6IbiVc6LwnsFgGIVAepLzjk4rYW1ze3ubcbvd53fjZV2FaqGQ63fT09PDMO9i9BEoon0J9Rm/339xm3dr2f39fVLX7wFvoMVvoYWfRyIRFndD/Z/8nf0WYAA8EC1Z/ZNm4gAAAABJRU5ErkJggg==",
                    pre_gray: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAslJREFUeNrclTtMWmEUxz/uvTzlIUhpNMR0aGNjrNHSmHTqRJyadujQDbSGRwJUaYCmDizqUEw6ODVNGgbpYCfSpFINCQzFR9oyMXRsXFCsAXkIKNL/R7gGWxOsSdPEk5zc3O+e87vn+59zv0vIpbSJiQmyubn5LBKJpNbX11+4XC5Buxy2XYDNZiMOh2OW4ziPTCbTi8XikeHh4SsSieQTXnIxsN1uJ1ardVYgEDgPDw+V9Xqd1Go1Mcuyg7AuuVy+sra29ndgVEnGx8dnhEKhs1qtKgE/eXZ8fCzC+q3+/n6tSqVaSSQS5wM7nU5iMplmsF1XpVI5BeXt6OhIBFkGAe9SKpV/wNmzKjWbzRT6tFwuK86CUqPrkIVWPjQwMKBWKBSn4Ozv0LGxsRmRSDSFSjua0Do8TRWAS+B5+B68g/IhixCNvQPN1WjuieZsS/f1aNQ0wzBuaCqlUCQRtVr9Es1K4kVDWJNhrQjAIiqMlkqle804FnkjBoOhEzv4vrGxkW2ALRaLFrq+QoAV2nE8tLe3dzEYDE5vb2939vX1PcBkiKVSaQ1jForFYq+NRqMum83ebsYzmJq7sGu4xhkKxsDfB/AxnO860ev1oeXlZU8gEMgmk0kFqmw8o9dUKiWfn58vhMPh54h7S+OpQXNSLBYfejyeR1yzw9dbRon09PS8W11dnfL5fJl8Pk+0Wi3hk5vyCNBY4vV6f0Im9+joKJNOp818o8G70ah4aWnpIzSKYCa/dXd3B+PxuHNycjKzs7NzAms1+qFQy+VydDRz0WjUpdPp3tB8TFM0FAqFGxXPzc19plJrNJqraMoXt9tNt3Suc+Tg4ICeJfmFhQVLoVAwoKG7fr//B8cHAL6Fy9ZFDinaG/r5w77ya8y/OhEvKRhjtIup2YMTeBb3mXY53HnAmNkP+/v7NzHTTwAO4f79f/ud/RJgAOLcRNZqLojMAAAAAElFTkSuQmCC",
                  };
                  AC_addStyle(".sp-separator{line-height:1.8 !important;opacity:1 !important;position:relative !important;float:none !important;top:0 !important;left:0 !important;min-width:366px;width:auto;text-align:center !important;font-size:14px !important;display:block !important;padding:3px 0 !important;margin:5px 10px 8px;clear:both !important;border-style:solid !important;border-color:#cccccc !important;border-width:1px !important;-moz-border-radius:30px !important;border-radius:30px !important;background-color:#ffffff !important;}.sp-separator:hover{box-shadow:0 0 11px rgba(33,33,33,0.2);}#sp-separator-hover{display:none;}.sp-separator:hover #sp-separator-hover{display:block;}.sp-separator .sp-someinfo{position:absolute !important;right:10px !important;font-size:12px !important;font-style:italic !important;background:none !important;}.sp-separator span{vertical-align: middle;cursor: pointer;padding: 0;margin: 0 5px;display: inline-block; width:22px;height:22px;}.sp-separator a{margin:0 20px 0 -6px !important;display:inline !important;text-shadow:#fff 0 1px 0 !important;background:none !important;color:#595959 !important;}.sp-separator input{padding:0 !important;line-height:23px !important;}.sp-separator .sp-md-span{font-weight:bold !important;margin:0 20px !important;}#sp-sp-md-number{width:6ch !important;vertical-align:middle !important;display:inline-block !important;text-align:left !important;}" +
                    `.ac_sp_top{background-image:url('${sepImgs.top}')}` +
                    `.ac_sp_pre{background-image:url('${sepImgs.pre}')}` +
                    `.ac_sp_next{background-image:url('${sepImgs.next}')}` +
                    `.ac_sp_bottom{background-image:url('${sepImgs.bottom}')}` +
                    `.ac_sp_next_gray{background-image:url('${sepImgs.next_gray}')}` +
                    `.ac_sp_pre_gray{background-image:url('${sepImgs.pre_gray}')}`,
                    "AC-Preload")
                  if (curSite.pageUrl === url) {
                    console.error("[AC-Script]", "翻页到达底部了 - 或者异常 - 出现异常请直接反馈作者修改");
                    return;
                  }// 不会重复加载相同的页面
                  console.log("加载翻页地址:" + url)
                  curSite.pageUrl = url;
                  // 对url的数据进行读取
                  curSite.pager.startFilter && curSite.pager.startFilter();
                  GM_xmlhttpRequest({
                    url: url,
                    method: "GET",
                    timeout: 5000,
                    onload: function (response) {
                      try {
                        var newBody = ShowPager.createDocumentByString(response.responseText);
                        // xx.evaluate(xpath, xx)
                        let pageElems = getAllElements(curSite.pager.pageElement, newBody, newBody);
                        const scriptElems = getAllElements('//script', newBody, newBody);
    
                        let toElement = getAllElements(curSite.pager.HT_insert[0])[0];
                        if (pageElems.length >= 0) {
                          // 处理最后一个翻页按钮
                          let nextEs = document.querySelectorAll("#sp-sp-gonext");
                          if (nextEs.length > 0) {
                            let lastE = nextEs[nextEs.length - 1];
                            lastE.classList.replace("ac_sp_next_gray", "ac_sp_next");
                          }
                          // 插入翻页按钮元素
                          curSite.pageNum++;
                          let addTo = "beforeend";
                          if (curSite.pager.HT_insert[1] === 1) addTo = "beforebegin";
                          toElement.insertAdjacentHTML(addTo, `<div class='sp-separator AC' id='sp-separator-ACX'>
                              <a class='sp-sp-nextlink' target='_blank'><b>第 <span style='color:#595959!important;'>ACX</span> 页</b></a>
                              <span id="sp-sp-gotop" class='ac_sp_top' title='去到顶部'></span>
                              <span id="sp-sp-gopre" class='${curSite.pageNum <= 2 ? "ac_sp_pre_gray" : "ac_sp_pre"}' title='上滚一页' ></span>
                              <span id="sp-sp-gonext" class='ac_sp_next_gray' title='下滚一页'></span>
                              <span id="sp-sp-gobottom" class='ac_sp_bottom' title='去到底部' ></span></div>`
                          .replace(/ACX/gm, curSite.pageNum));
                          // 插入新页面元素
                          pageElems.forEach(function (one) {
                            toElement.insertAdjacentElement(addTo, one);
                          });
                          document.querySelectorAll(".sp-separator.AC:not([bind])").forEach(function (per) {
                            per.setAttribute("bind", 1);
                            per.addEventListener("click", ac_spfunc);
                          });
    
                          // 插入scripts & style - 保证js加载
                          if(curSite.SiteTypeID === SiteType.GOOGLE) {
                            var scriptText = "";
                            scriptElems.forEach((one) => {
                              scriptText += one.innerHTML;
                            });
    
                            const scriptNode = document.createElement("script");
                            scriptNode.innerHTML = scriptText;
                            toElement.appendChild(scriptNode)
                          }
    
                          // 替换待替换元素
                          try {
                            let oriE = getAllElements(curSite.pager.replaceE);
                            let repE = getAllElements(curSite.pager.replaceE, newBody, newBody);
                            if (oriE.length === repE.length) {
                              if(oriE.length === 0) {
                                throw "翻页-替换翻页元素 'replaceE' 失效";
                              }
                              for (var i = 0; i < oriE.length; i++) {
                                oriE[i].outerHTML = repE[i].outerHTML;
                              }
                            }
                          } catch (e) {
                            console.log(e);
                          }
                        }
                      } catch (e) {
                        console.log(e);
                      }
                      curSite.pageLoading = false;
                    },
                    onerror: function () {
                      curSite.pageLoading = false;
                    }
                  });
                }
              },
            };
    
            function AddCustomStyle() {
              if (ACConfig.isUserStyleEnable) {
                AC_addStyle(ACConfig.UserStyleText, "AC-userStyle");// 用户自定义的样式表
              } else {
                // 为了方便调整样式和查看效果,暂时不移除
                // safeRemove("style[class='AC-userStyle']")
              }
              AC_addStyle(
                ".opr-recommends-merge-imgtext{display:none!important;}" + // 移除百度浏览器推广
                ".res_top_banner{display:none!important;}" + // 移除可能的百度HTTPS劫持显示问题
                ".headBlock, body>div.result-op{display:none;}" // 移除百度的搜索结果顶部一条的建议文字 & 移除可能出现的白屏现象
                , "AC-special-BAIDU"
              );
              /*"自定义"按钮效果*/
              AC_addStyle(".achide{display:none;} .newFuncHighLight{color:red;font-weight: 100;background-color: yellow;font-weight: 600;}#sp-ac-container label{display:inline;}#u{width:319px}#u #myuser{display:inline-block;margin: 13px -10px 0 24px;}.site-wrapper #myuser,.sogou-set-box #myuser,#gbw #myuser{margin-right:15px;} #myuser,#myuser .myuserconfig{padding:0;margin:0}#myuser{display:inline-block;}#myuser .myuserconfig{display:inline-block;line-height:1.5;background:#4e6ef2;color:#fff;font-weight:700;text-align:center;padding:6px;border:2px solid #E5E5E5;}#myuser .myuserconfig{box-shadow:0 0 10px 3px rgba(0,0,0,.1);border-radius: 6px}#myuser .myuserconfig:hover{background:#4662d9 !important;color:#fff;cursor:pointer;border:2px solid #73A6F8;}body[doge] #header{max-width: unset;}body[doge] #myuser{position: absolute;right: 40px;}",
                "AC-MENU_Btn");
              /*自定义页面内容效果*/
              AC_addStyle('body[baidu] #sp-ac-container .container-label:not([class*="baidu"])>label:not([class="label_hide"]),\n' +
                '  body[google] #sp-ac-container .container-label:not([class*="google"])>label:not([class="label_hide"]),\n' +
                '  body[bing] #sp-ac-container .container-label:not([class*="bing"])>label:not([class="label_hide"]),\n' +
                '  body[sogou] #sp-ac-container .container-label:not([class*="sogou"])>label:not([class="label_hide"]),\n' +
                '  body[duck] #sp-ac-container .container-label:not([class*="duck"])>label:not([class="label_hide"]),\n' +
                '  body[doge] #sp-ac-container .container-label:not([class*="doge"])>label:not([class="label_hide"]),\n' +
                '  body[baidu] #sp-ac-container .container-label:not([class*="baidu"])>br,\n' +
                '  body[google] #sp-ac-container .container-label:not([class*="google"])>br,\n' +
                '  body[bing] #sp-ac-container .container-label:not([class*="bing"])>br,\n' +
                '  body[duck] #sp-ac-container .container-label:not([class*="duck"])>br,\n' +
                '  body[doge] #sp-ac-container .container-label:not([class*="doge"])>br,\n' +
                '  body[sogou] #sp-ac-container .container-label:not([class*="sogou"])>br,\n' +
                '  body[baidu] #sp-ac-container .container-label[class*="baidu"]>.label_hide,\n' +
                '  body[google] #sp-ac-container .container-label[class*="google"]>.label_hide,\n' +
                '  body[bing] #sp-ac-container .container-label[class*="bing"]>.label_hide,\n' +
                '  body[sogou] #sp-ac-container .container-label[class*="sogou"]>.label_hide,\n' +
                '  body[duck] #sp-ac-container .container-label[class*="duck"]>.label_hide,\n' +
                '  body[doge] #sp-ac-container .container-label[class*="doge"]>.label_hide\n' + // 注意尾部逗号
                '{' +
                'display:none;\n' +
                '}#sp-ac-container .label_hide{cursor:pointer;margin-left:8%;color:blue}#sp-ac-container .linkhref,#sp-ac-container .label_hide:hover{color:red}#sp-ac-container .linkhref:hover{font-weight:bold}#sp-ac-container label.menu-box-small{max-width:16px;max-height:16px;cursor:pointer;display:inline-block}.AC-CounterT{background:#FD9999}body  #sp-ac-container{position:fixed;top:3.9vw;right:8.8vw}#sp-ac-container{z-index:999999;text-align:left;background-color:white}#sp-ac-container *{font-size:13px;color:black;float:none}#sp-ac-main-head{position:relative;top:0;left:0}#sp-ac-span-info{position:absolute;right:1px;top:0;font-size:10px;line-height:10px;background:none;font-style:italic;color:#5a5a5a;text-shadow:white 0px 1px 1px}#sp-ac-container input{vertical-align:middle;display:inline-block;outline:none;height:auto;padding:0px;margin-bottom:0px;margin-top:0px}#sp-ac-container input[type="number"]{width:50px;text-align:left}#sp-ac-container input[type="checkbox"]{border:1px solid #B4B4B4;padding:1px;margin:3px;width:13px;height:13px;background:none;cursor:pointer;visibility:visible;position:static}#sp-ac-container input[type="button"]{border:1px solid #ccc;cursor:pointer;background:none;width:auto;height:auto}#sp-ac-container li{list-style:none;margin:3px 0;border:none;float:none;cursor:default;}#sp-ac-container fieldset{border:2px groove #ccc;-moz-border-radius:3px;border-radius:3px;padding:4px 9px 6px 9px;margin:2px;display:block;width:auto;height:auto}#sp-ac-container legend{line-height:20px;margin-bottom:0px}#sp-ac-container fieldset > ul{padding:0;margin:0}#sp-ac-container ul#sp-ac-a_useiframe-extend{padding-left:40px}#sp-ac-rect{position:relative;top:0;left:0;float:right;height:10px;width:10px;padding:0;margin:0;-moz-border-radius:3px;border-radius:3px;border:1px solid white;-webkit-box-shadow:inset 0 5px 0 rgba(255,255,255,0.3),0 0 3px rgba(0,0,0,0.8);-moz-box-shadow:inset 0 5px 0 rgba(255,255,255,0.3),0 0 3px rgba(0,0,0,0.8);box-shadow:inset 0 5px 0 rgba(255,255,255,0.3),0 0 3px rgba(0,0,0,0.8);opacity:0.8}#sp-ac-dot,#sp-ac-cur-mode{position:absolute;z-index:9999;width:5px;height:5px;padding:0;-moz-border-radius:3px;border-radius:3px;border:1px solid white;opacity:1;-webkit-box-shadow:inset 0 -2px 1px rgba(0,0,0,0.3),inset 0 2px 1px rgba(255,255,255,0.3),0px 1px 2px rgba(0,0,0,0.9);-moz-box-shadow:inset 0 -2px 1px rgba(0,0,0,0.3),inset 0 2px 1px rgba(255,255,255,0.3),0px 1px 2px rgba(0,0,0,0.9);box-shadow:inset 0 -2px 1px rgba(0,0,0,0.3),inset 0 2px 1px rgba(255,255,255,0.3),0px 1px 2px rgba(0,0,0,0.9)}#sp-ac-dot{right:-3px;top:-3px}#sp-ac-cur-mode{left:-3px;top:-3px;width:6px;height:6px}#sp-ac-content{padding:0;margin:0px;-moz-border-radius:3px;border-radius:3px;border:1px solid #A0A0A0;-webkit-box-shadow:-2px 2px 5px rgba(0,0,0,0.3);-moz-box-shadow:-2px 2px 5px rgba(0,0,0,0.3);box-shadow:-2px 2px 5px rgba(0,0,0,0.3)}#sp-ac-main{padding:5px;border:1px solid white;-moz-border-radius:3px;border-radius:3px;background-color:#F2F2F7;background:-moz-linear-gradient(top,#FCFCFC,#F2F2F7 100%);background:-webkit-gradient(linear,0 0,0 100%,from(#FCFCFC),to(#F2F2F7))}#sp-ac-foot{position:relative;left:0;right:0;min-height:20px}#sp-ac-savebutton{position:absolute;top:0;right:2px}#sp-ac-container .endbutton{margin-top:8px}#sp-ac-container .sp-ac-spanbutton{border:1px solid #ccc;-moz-border-radius:3px;border-radius:3px;padding:2px 3px;cursor:pointer;background-color:#F9F9F9;-webkit-box-shadow:inset 0 10px 5px white;-moz-box-shadow:inset 0 10px 5px white;box-shadow:inset 0 10px 5px white}#sp-ac-container .sp-ac-spanbutton:hover{background-color:#DDD}label[class="newFunc"]{color:blue}',
                "AC-MENU_Page");
            }
    
            AddCustomStyle();
            try {
              GM_registerMenuCommand('AC-重定向脚本设置', function () {
                document.querySelector("#sp-ac-content").style.display = 'block';
              });
            } catch (e) {
            }
    
            /**这东西以后会用上**/
            function getSearchValue() {
              let kvl = location.search.substr(1).split("&");
              let searchV = "";
              for (let i = 0; i < kvl.length; i++) {
                let value = kvl[i].replace(/^(wd|query|q)=/, "");
                if (value !== kvl[i]) {
                  searchV = value;
                }
              }
              //  '+' 百度、搜狗、必应、谷歌、好搜
              searchV = searchV.replace("+", " ");
              return searchV;
            }
    
            function rapidDeal() {
              try {
                if (insertLocked === false && curSite.SiteTypeID !== SiteType.OTHERS) {
                  insertLocked = true;
                  ACHandle(); // 处理主重定向
                  if (ACConfig.isFaviconEnable && typeof(curSite.FaviconType) !== 'undefined') { // 显示favicon图标
                    AC_addStyle("h3::before, h2::before {content: ' ';display:inline-block}", "AC-Style-Favicon", "head");
                    addFavicon(document.querySelectorAll(curSite.FaviconType)); // 添加Favicon显示
                  }else{
                    safeRemove("img.AC-faviconT");
                    document.querySelectorAll(curSite.FaviconType).forEach((one) => {
                      one.removeAttribute("ac_faviconstatus");
                    })
                  }
                  // 动态下划线
                  if (!ACConfig.isALineEnable) {
                    AC_addStyle("a,a em{text-decoration:none !important}", "AC-NoLine", "body");// 移除这些个下划线
                  } else{
                    safeRemove("style[class='AC-NoLine']")
                  }
                  if (ACConfig.isAdsEnable) { // 移除多余的广告内容
                    removeAD_baidu_sogou();
                  }
                  if (ACConfig.isCounterEnable) { // 显示计数器
                    addCounter(document.querySelectorAll(curSite.CounterType));
                  }else{
                    document.querySelectorAll(".AC-CounterT").forEach(one => {
                      one.parentElement.removeAttribute('SortIndex');
                      one.remove()
                    })
                  }
                  if (ACConfig.doDisableSug) { // 不启用移动预测[默认]
                    acSetCookie("ORIGIN", 2, "www.baidu.com");
                    acSetCookie("ISSW", 1);
                    acSetCookie("ISSW", 1, "www.baidu.com");
                  }
                  // if(CONST.useItem.HuYanMode === false && document.querySelector("style[class*='darkreader']") != null) {
                  //   CONST.useItem.HuYanMode = true;
                  // }
                  if (ACConfig.isBlockEnable && curSite.SiteTypeID !== SiteType.SOGOU) { // 启用屏蔽功能- 对每一个新增的地址都要处理
                    SiteBlock.initStyle();
                    SiteBlock.init();
                  }
                  if(document.body){
                    if (!ACConfig.isRightDisplayEnable) { // 右侧栏显示
                      document.body.classList.remove("showRight")
                    } else {
                      document.body.classList.add("showRight")
                    }
                  }
                  if (curSite.SiteTypeID === SiteType.GOOGLE) {
                    let nodeList = document.querySelectorAll("#rso")
                    const isSpecial = document.querySelector("#rso>.g") !== null // 存在一个节点即为special
                    if(isSpecial !== CONST.isGoogleSpecial && CONST.isGoogleSpecial === false) {
                        CONST.isGoogleSpecial = true
                        safeRemove("style[class='AC-TwoPageExStyle'],style[class='AC-ThreePageExStyle'],style[class='AC-FourPageExStyle']");
                        acCssLoadFlag = false;
                        CONST.StyleManger.init();
                    }
                    if(nodeList.length > 0) {
                      nodeList.forEach((node) => {
                        if (CONST.isGoogleSpecial) {
                          node.style.display !== 'grid' ? node.style.display = 'grid': ''
                        } else {
                          node.style.display !== 'unset' ? node.style.display = 'unset': ''
                        }
                      })
                    }
    
                    // 特殊元素一行处理
                    document.querySelectorAll("#rso>div:not(.g)>div[jsmodel]").forEach(one => {
                      one.parentNode.style.display = "unset"
                    })
                  }
                  setTimeout(function () {
                    insertLocked = false;
                  }, 200);
                }
              } catch (e) {
                console.log(e);
              }
            }
    
            function acSetCookie(cname, cvalue, domain, exdays) {
              try{
                exdays = exdays || 30;
                let d = new Date();
                domain = (domain ? "domain=" + domain : "") + ";";
                d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
                let expires = "expires=" + d.toUTCString();
                document.cookie = cname + "=" + cvalue + "; " + domain + expires + ";path=/";
              }catch(e){}
            }
            function getNodeHost(sitetpNode) {
              if(sitetpNode instanceof HTMLAnchorElement){
                return {curHost: sitetpNode.host, curUrl: sitetpNode.href};
              }
              if (curSite.SiteTypeID === SiteType.BAIDU) {
                var href = null;
                if (sitetpNode instanceof HTMLElement) {
                  href = sitetpNode.getAttribute("href")
                }
                if (href != null && href.includes("baidu.com/link")) {
                  // 已经解析出来了
                  return  {curHost: getTextHost(href), curUrl: href};
                }
              }
              return {curHost: getTextHost(sitetpNode.innerText || sitetpNode.textContent), curUrl: null};
            }
    
            function ACHandle() {
              // 处理主重定向
              if (curSite.SiteTypeID === SiteType.OTHERS || curSite.SiteTypeID === SiteType.SOGOU) return;
              if (ACConfig.isRedirectEnable) {
                if (curSite.Stype_Normal !== null && curSite.Stype_Normal !== "") {
                  // 百度搜狗去重定向-普通模式【注意不能为document.query..】
                  resetURLNormal(document.querySelectorAll(curSite.Stype_Normal));
                  if (checkISBaiduMain()) {
                    document.querySelectorAll(".s_form .index-logo-src[src*='gif'], .s_form .index-logo-srcnew[src*='gif']").forEach(function (per) {
                      per.src = "https://pic.rmb.bdstatic.com/c86255e8028696139d3e3e4bb44c047b.png";
                      // 神奇的百度百家号
                      // https://imgsa.baidu.com/fex/pic/item/8718367adab44aedcc91ab2bbe1c8701a08bfb26.jpg
                      // https://baidu.ntaow.com/newcss/baidu.png
                    });
                  }
                }
                if (curSite.SiteTypeID === SiteType.GOOGLE) removeOnMouseDownFunc(); // 移除onMouseDown事件,谷歌去重定向
                if (curSite.SiteTypeID === SiteType.MBAIDU) removeMobileBaiduDirectLink(); // 处理百度手机版本的重定向地址
                removeRedirectLinkTarget(); // 只移除知乎的重定向问题 & 百度学术重定向问题
                safeRemove(".res_top_banner"); // 移除百度可能显示的劫持
              }
    
              try { // 放入异常捕获,防止由于html插入过慢导致的js终止
                if (!document.querySelector("#sp-ac-style").checked) {
                  document.querySelectorAll("input[name*='sp-ac-a_force_style_']").forEach(per => {
                    per.setAttribute("disabled", "disabled");
                    per.parentNode.setAttribute("title", "请开启自定义样式")
                  });
                } else {
                  document.querySelectorAll("input[name*='sp-ac-a_force_style_']").forEach(per => {
                    per.removeAttribute("disabled");
                    per.parentNode.setAttribute("title", "AC-自定义样式内容")
                  });
                }
                if (!document.querySelector("#sp-ac-block").checked) {
                  document.querySelectorAll("#sp-ac-removeBlock, #sp-ac-blockBtnDisplay").forEach(per => {
                    per.setAttribute("disabled", "disabled");
                    per.parentNode.setAttribute("title", "请开启自定义样式")
                  });
                } else {
                  document.querySelectorAll("#sp-ac-removeBlock, #sp-ac-blockBtnDisplay").forEach(per => {
                    per.removeAttribute("disabled");
                    per.parentNode.setAttribute("title", "AC-自主拦截功能")
                  });
                }
              } catch (e) {
              }
            }
    
            function ACtoggleSettingDisplay(e) {
              e.stopPropagation();
              // 显示?隐藏设置界面
              if (document.querySelector(".iframe-father iframe") === null) {
                document.querySelector(".iframe-father").insertAdjacentHTML("beforeend", "<iframe src='https://ghbtns.com/github-btn.html?user=langren1353&repo=GM_script&type=star&count=true' frameborder='0' scrolling='0' style='height: 20px;max-width: 108px;padding-left:5px;box-sizing: border-box;margin-bottom: -5px;display:unset !important;'></iframe>");
              }
              setTimeout(function () {
                if (document.querySelector("#sp-ac-content").style.display === 'block') {
                  document.querySelector("#sp-ac-content").style.display = 'none';
                } else {
                  DBConfig.oldVersion = ACConfig.oldVersion = GM_info.script.version; // 只需要写出一部分的关键数据即可
                  ACSetValue("Config", JSON.stringify(DBConfig));
                  document.querySelector(".ac-newversionDisplay").style.display = 'none';
                  document.querySelector("#sp-ac-content").style.display = 'block';
                }
              }, 100);
              return false;
            }
    
            function ShowSetting() {
              if (curSite.SiteTypeID === SiteType.OTHERS) return;
              // 如果不存在的话,那么自己创建一个-copy from superPreload
              if (document.body !== null && document.querySelector("#sp-ac-container") === null) {
                let Container = document.createElement('div');
                Container.id = "sp-ac-container";
                Container.innerHTML =
                  `<div id="sp-ac-content" style="display: none;" xmlns="http://www.w3.org/1999/html">
                    <div id="sp-ac-main">
                      <fieldset id="sp-ac-autopager-field" style="display:block;">
                        <legend class="iframe-father">
                           <a class="linkhref" href="https://www.ntaow.com/aboutscript.html" target="_blank" v-text="lan.use.fieldset_panel.panel_title"></a>
                        </legend>
                        <ul class="setting-main" v-show="other.curTab === 1">
                          <li>
                            <label :title="lan.use.fieldset_panel.setting_panel.redirect_title">
                              <input id="sp-ac-redirect" name="sp-ac-a_separator" type="checkbox"  v-model="ACConfig.isRedirectEnable">
                              {{ lan.use.fieldset_panel.setting_panel.redirect_text }}
                            </label>
                            <label>
                              <input id="sp-ac-isEnLang" name="sp-ac-a_force" type="checkbox" v-model="ACConfig.isEnLang">
                              {{ lan.use.fieldset_panel.setting_panel.useEn_text }}
                            </label>
                            <span id="sp-ac-savebutton" @click="saveConfig" class="sp-ac-spanbutton endbutton" :title="lan.use.fieldset_panel.setting_panel.okBtn_text" style="position: relative;float: right;margin-top: -6px;" v-text="lan.use.fieldset_panel.setting_panel.okBtn_text"></span>
                            <span id="sp-ac-resetbutton" @click="changeResetText" @dblclick="resetConfig" class="sp-ac-spanbutton endbutton" :title="lan.use.fieldset_panel.setting_panel.resetBtn_text" style="position: relative;float: right;margin-top: -6px;" v-text="lan.use.fieldset_panel.setting_panel.resetBtn_text"></span>
                          </li>
                          <li>
                            <label :title="lan.use.fieldset_panel.setting_panel.ads_title">
                              <input id="sp-ac-ads" name="sp-ac-a_force" type="checkbox" v-model="ACConfig.isAdsEnable">
                              {{ lan.use.fieldset_panel.setting_panel.ads_text }}
                            </label>
                            <label :title="lan.use.fieldset_panel.setting_panel.autopage_title" class="">
                              <input id="sp-ac-isAutopage" name="sp-ac-a_force" type="checkbox" v-model="ACConfig.isAutopage">
                              {{ lan.use.fieldset_panel.setting_panel.autopage_text }}
                            </label>
                          </li>
                          <li>
                            <label title="lan.use.fieldset_panel.setting_panel.blockenable_title">
                              <input id="sp-ac-block" name="sp-ac-a_force" type="checkbox" v-model="ACConfig.isBlockEnable">
                              {{ lan.use.fieldset_panel.setting_panel.blockenable_text }}
                            </label>
                            <span id="sp-ac-blockdiybutton" class="sp-ac-spanbutton" @click="other.curTab = 2" :title="lan.use.fieldset_panel.setting_panel.blockDiyBtn_title" style="margin-left: 5px;color: #888888;" v-text="lan.use.fieldset_panel.setting_panel.blockDiyBtn_text"></span>
                            <label :title="lan.use.fieldset_panel.setting_panel.blockenable_text">
                              <input :title="lan.use.fieldset_panel.setting_panel.blockAutoRemove_title" v-model="ACConfig.isBlockDisplay" id="sp-ac-removeBlock" type="checkbox">
                              {{ lan.use.fieldset_panel.setting_panel.blockAutoRemove_text }}
                            </label>
                            <label :title="lan.use.fieldset_panel.setting_panel.blockBtnShow_title">
                              <input :title="lan.use.fieldset_panel.setting_panel.blockBtnShow_title"  v-model="ACConfig.isBlockBtnNotDisplay" id="sp-ac-blockBtnDisplay" type="checkbox">
                              {{ lan.use.fieldset_panel.setting_panel.blockBtnShow_text }}
                            </label>
                          </li>
                          <li>
                            <label :title="lan.use.fieldset_panel.setting_panel.userStyle_text">
                              <input id="sp-ac-style" name="sp-ac-a_force" type="checkbox" v-model="ACConfig.AdsStyleEnable">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_text }}
                            </label>
                          </li>
                          <li>
                            <!------------百度样式-------------->
                            <label class="container-label baidu">
                              <label class="label_hide" v-text="lan.use.fieldset_panel.setting_panel.userStyle_baidu_lable" @click="labelShowHideEnv"></label>
                              <label style="margin-left:20px"><input name="sp-ac-a_force_style_baidu" value="0" v-model="ACConfig.baidu.AdsStyleMode" type="radio">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_baidu_origin }}
                              </label>
                              <label>
                              <input  name='sp-ac-huyan_style_baidu' type='checkbox' v-model="ACConfig.baidu.HuYanMode">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_baidu_huyan }}
                              </label>
                              <label class=""><input name="sp-ac-a_force_style_baidulite" type="checkbox" v-model="ACConfig.Style_BaiduLite">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_baidu_baiduLite }}
                              </label>
                              <br>
                              <label style="margin-left:20px"><input name="sp-ac-a_force_style_baidu" value="1" v-model="ACConfig.baidu.AdsStyleMode" type="radio">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_baidu_1line }}
                              </label>
                              <label><input name="sp-ac-a_force_style_baidu" value="2" type="radio" v-model="ACConfig.baidu.AdsStyleMode">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_baidu_1line_enter }}
                              </label>
                              <label><input name="sp-ac-a_force_style_baidu" value="3" type="radio" v-model="ACConfig.baidu.AdsStyleMode">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_baidu_2line }}
                              </label>
                              <label><input name="sp-ac-a_force_style_baidu" value="4" type="radio" v-model="ACConfig.baidu.AdsStyleMode">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_baidu_3line }}
                              </label>
                              <label><input name="sp-ac-a_force_style_baidu" value="5" type="radio" v-model="ACConfig.baidu.AdsStyleMode">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_baidu_4line }}
                              </label>
                              <br>
                            </label>
                            <!------------百度样式-------------->
                            <div style="height: 1px;width:267px;margin-left:25px;background-color:#d8d8d8;margin-top:1px;"></div>
                            <!------------谷歌样式-------------->
                            <label class="container-label google">
                              <label class="label_hide" v-text="lan.use.fieldset_panel.setting_panel.userStyle_google_lable" @click="labelShowHideEnv"></label>
                              <label style="margin-left:20px">
                              <input name="sp-ac-a_force_style_google" value="0" type="radio" v-model="ACConfig.google.AdsStyleMode">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_google_origin }}
                              </label>
                              <label :title="lan.use.fieldset_panel.setting_panel.userStyle_google_huyan"><input name="sp-ac-huyan_style_google" v-model="ACConfig.google.HuYanMode" type="checkbox">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_google_huyan }}
                              </label>
                              <label :title="lan.use.fieldset_panel.setting_panel.userStyle_google_googleLite" style=""><input name="sp-ac-google_in_baidumode" v-model="ACConfig.isGooleInBaiduModeEnable" type="checkbox">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_google_googleLite }}
                              </label>
                              <br>
                              <label style="margin-left:20px"><input name="sp-ac-a_force_style_google" value="1" v-model="ACConfig.google.AdsStyleMode" type="radio">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_google_1line }}
                              </label>
                              <label><input name="sp-ac-a_force_style_google" value="2" v-model="ACConfig.google.AdsStyleMode" type="radio" checked="">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_google_1line_enter }}
                              </label>
                              <label><input name="sp-ac-a_force_style_google" value="3" v-model="ACConfig.google.AdsStyleMode" type="radio">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_google_2line }}
                              </label>
                              <label><input name="sp-ac-a_force_style_google" value="4" v-model="ACConfig.google.AdsStyleMode" type="radio">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_google_3line }}
                              </label>
                              <label><input name="sp-ac-a_force_style_google" value="5" v-model="ACConfig.google.AdsStyleMode" type="radio">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_google_4line }}
                              </label>
                              <br>
                            </label>
                            <!------------谷歌样式-------------->
                            <div style="height: 1px;width:267px;margin-left:25px;background-color:#d8d8d8;margin-top:1px;"></div>
                            <!------------必应样式-------------->
                            <label class="container-label bing">
                              <label class="label_hide" v-text="lan.use.fieldset_panel.setting_panel.userStyle_bing_lable" @click="labelShowHideEnv"></label>
                              <label style="margin-left:20px"><input name="sp-ac-a_force_style_bing" v-model="ACConfig.bing.AdsStyleMode" value="0" type="radio">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_bing_origin }}
                              </label>
                              <label :title="lan.use.fieldset_panel.setting_panel.userStyle_bing_huyan"><input name="sp-ac-huyan_style_bing" v-model="ACConfig.bing.HuYanMode" type="checkbox">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_bing_huyan }}
                              </label>
                              <br>
                              <label style="margin-left:20px"><input name="sp-ac-a_force_style_bing" v-model="ACConfig.bing.AdsStyleMode" value="1" type="radio">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_bing_1line }}
                              </label>
                              <label><input name="sp-ac-a_force_style_bing" value="2" v-model="ACConfig.bing.AdsStyleMode" type="radio">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_bing_1line_enter }}
                              </label>
                              <label><input name="sp-ac-a_force_style_bing" value="3" v-model="ACConfig.bing.AdsStyleMode" type="radio" checked="">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_bing_2line }}
                              </label>
                              <label><input name="sp-ac-a_force_style_bing" value="4" v-model="ACConfig.bing.AdsStyleMode" type="radio">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_bing_3line }}
                              </label>
                              <label><input name="sp-ac-a_force_style_bing" value="5" v-model="ACConfig.bing.AdsStyleMode" type="radio">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_bing_4line }}
                              </label>
                            </label>
                            <!------------必应样式-------------->
    <!--                        <div style="height: 1px;width:267px;margin-left:25px;background-color:#d8d8d8;margin-top:1px;"></div>-->
    <!--                        &lt;!&ndash;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;搜狗样式&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&ndash;&gt;-->
    <!--                        <label class="container-label sogou">-->
    <!--                          <label class="label_hide" v-text="lan.use.fieldset_panel.setting_panel.userStyle_sogou_lable" @click="labelShowHideEnv"></label>-->
    <!--                          <label style="margin-left:20px"><input name="sp-ac-a_force_style_sogou" v-model="ACConfig.sogou.AdsStyleMode" value="0" type="radio">-->
    <!--                          {{ lan.use.fieldset_panel.setting_panel.userStyle_sogou_origin }}-->
    <!--                          </label>-->
    <!--                          <label :title="lan.use.fieldset_panel.setting_panel.userStyle_sogou_huyan"><input name="sp-ac-huyan_style_sogou" v-model="ACConfig.sogou.HuYanMode" type="checkbox">-->
    <!--                          {{ lan.use.fieldset_panel.setting_panel.userStyle_sogou_huyan }}-->
    <!--                          </label>-->
    <!--                          <br>-->
    <!--                          <label style="margin-left:20px">-->
    <!--                          <input name="sp-ac-a_force_style_sogou" value="1" v-model="ACConfig.sogou.AdsStyleMode" type="radio">-->
    <!--                          {{ lan.use.fieldset_panel.setting_panel.userStyle_sogou_1line }}-->
    <!--                          </label>-->
    <!--                          <label><input name="sp-ac-a_force_style_sogou" value="2" v-model="ACConfig.sogou.AdsStyleMode" type="radio">-->
    <!--                          {{ lan.use.fieldset_panel.setting_panel.userStyle_sogou_1line_enter }}-->
    <!--                          </label>-->
    <!--                          <label><input name="sp-ac-a_force_style_sogou" value="3" v-model="ACConfig.sogou.AdsStyleMode" type="radio" checked="">-->
    <!--                          {{ lan.use.fieldset_panel.setting_panel.userStyle_sogou_2line }}-->
    <!--                          </label>-->
    <!--                          <label><input name="sp-ac-a_force_style_sogou" value="4" v-model="ACConfig.sogou.AdsStyleMode" type="radio">-->
    <!--                          {{ lan.use.fieldset_panel.setting_panel.userStyle_sogou_3line }}-->
    <!--                          </label>-->
    <!--                          <label><input name="sp-ac-a_force_style_sogou" value="5" v-model="ACConfig.sogou.AdsStyleMode" type="radio">-->
    <!--                          {{ lan.use.fieldset_panel.setting_panel.userStyle_sogou_4line }}-->
    <!--                          </label>-->
    <!--                        </label>-->
    <!--                        &lt;!&ndash;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;搜狗样式&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&ndash;&gt;-->
                            <div style="height: 1px;width:267px;margin-left:25px;background-color:#d8d8d8;margin-top:1px;"></div>
                            <!------------鸭鸭搜样式-------------->
                            <label class="container-label duck">
                              <label class="label_hide" v-text="lan.use.fieldset_panel.setting_panel.userStyle_duck_lable" @click="labelShowHideEnv"></label>
                              <label style="margin-left:20px"><input name="sp-ac-a_force_style_duck" v-model="ACConfig.duck.AdsStyleMode" value="0" type="radio">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_duck_origin }}
                              </label>
                              <label :title="lan.use.fieldset_panel.setting_panel.userStyle_duck_huyan"><input name="sp-ac-huyan_style_duck" v-model="ACConfig.duck.HuYanMode" type="checkbox">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_duck_huyan }}
                              </label>
                               <label :title="lan.use.fieldset_panel.setting_panel.userStyle_duck_normal" style=""><input v-model="ACConfig.normalizeDuck" type="checkbox">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_duck_normal }}
                              </label>
                              <br>
                              <label style="margin-left:20px">
                              <input name="sp-ac-a_force_style_duck" value="1" v-model="ACConfig.duck.AdsStyleMode" type="radio">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_duck_1line }}
                              </label>
                              <label><input name="sp-ac-a_force_style_duck" value="2" v-model="ACConfig.duck.AdsStyleMode" type="radio">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_duck_1line_enter }}
                              </label>
                              <label><input name="sp-ac-a_force_style_duck" value="3" v-model="ACConfig.duck.AdsStyleMode" type="radio" checked="">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_duck_2line }}
                              </label>
                              <label><input name="sp-ac-a_force_style_duck" value="4" v-model="ACConfig.duck.AdsStyleMode" type="radio">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_duck_3line }}
                              </label>
                              <label><input name="sp-ac-a_force_style_duck" value="5" v-model="ACConfig.duck.AdsStyleMode" type="radio">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_duck_4line }}
                              </label>
                            </label>
                            <!------------鸭鸭搜样式-------------->
                            <div style="height: 1px;width:267px;margin-left:25px;background-color:#d8d8d8;margin-top:1px;"></div>
                            <!------------多吉样式-------------->
                            <label class="container-label doge">
                              <label class="label_hide" v-text="lan.use.fieldset_panel.setting_panel.userStyle_doge_lable" @click="labelShowHideEnv"></label>
                              <label style="margin-left:20px"><input name="sp-ac-a_force_style_doge" v-model="ACConfig.doge.AdsStyleMode" value="0" type="radio">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_doge_origin }}
                              </label>
                              <label :title="lan.use.fieldset_panel.setting_panel.userStyle_doge_huyan"><input name="sp-ac-huyan_style_doge" v-model="ACConfig.doge.HuYanMode" type="checkbox">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_doge_huyan }}
                              </label>
                               <label :title="lan.use.fieldset_panel.setting_panel.userStyle_doge_normal" style=""><input v-model="ACConfig.normalizeDoge" type="checkbox">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_doge_normal }}
                              </label>
                              <br>
                              <label style="margin-left:20px">
                              <input name="sp-ac-a_force_style_doge" value="1" v-model="ACConfig.doge.AdsStyleMode" type="radio">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_doge_1line }}
                              </label>
                              <label><input name="sp-ac-a_force_style_doge" value="2" v-model="ACConfig.doge.AdsStyleMode" type="radio">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_doge_1line_enter }}
                              </label>
                              <label><input name="sp-ac-a_force_style_doge" value="3" v-model="ACConfig.doge.AdsStyleMode" type="radio" checked="">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_doge_2line }}
                              </label>
                              <label><input name="sp-ac-a_force_style_doge" value="4" v-model="ACConfig.doge.AdsStyleMode" type="radio">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_doge_3line }}
                              </label>
                              <label><input name="sp-ac-a_force_style_doge" value="5" v-model="ACConfig.doge.AdsStyleMode" type="radio">
                              {{ lan.use.fieldset_panel.setting_panel.userStyle_doge_4line }}
                              </label>
                            </label>
                          <!------------多吉样式-------------->
                          </li>
                          <!------------护眼模式设置-------------->
                          <li>
                            <label :title="lan.use.fieldset_panel.setting_panel.huyanMode_title">
                              <input id="sp-ac-usercolor" v-model="ACConfig.isUserColorEnable" name="sp-ac-a_force" type="checkbox" checked="">
                              {{ lan.use.fieldset_panel.setting_panel.huyanMode_text }}
                            </label>
                          </li>
                          <li>
                            <label class="menu-box-container" :title="lan.use.fieldset_panel.setting_panel.huyanMode_title">
                              <label style="margin-left:20px;" v-text="lan.use.fieldset_panel.setting_panel.huyanColor_text"></label>
                              <input class="sp-ac-menuhuyanColor" @input.stop="useThisHuyanColor" v-model="ACConfig.defaultHuYanColor" type="color" :title="lan.use.fieldset_panel.setting_panel.huyanColor_title" style="cursor: pointer;margin-top:-0.05rem;height:23px;">
                              <label class="menu-box-small" data-value="#DEF1EF" @click.stop="useThisHuyanColor" style="background-color:#DEF1EF;">&nbsp;&nbsp;&nbsp;&nbsp;</label>
                              <label class="menu-box-small" data-value="#F3F2EE" @click.stop="useThisHuyanColor" style="background-color:#F3F2EE;">&nbsp;&nbsp;&nbsp;&nbsp;</label>
                              <label class="menu-box-small" data-value="#E5E5E5" @click.stop="useThisHuyanColor" style="background-color:#E5E5E5;">&nbsp;&nbsp;&nbsp;&nbsp;</label>
                              <label class="linkhref" data-href="https://www.ntaow.com/colorpicker.html" style="cursor:pointer;margin-right: 10px;" onclick="window.open(this.dataset.href)" v-text="lan.use.fieldset_panel.setting_panel.huyanColorMore_text"></label>
                            </label>
                          </li>
                          <!------------Favicon图标设置-------------->
                          <li>
                            <label>
                              <input :title="lan.use.fieldset_panel.setting_panel.favicon_title" v-model="ACConfig.isFaviconEnable" id="sp-ac-favicon" name="sp-ac-a_force" type="checkbox" checked="">
                              {{ lan.use.fieldset_panel.setting_panel.favicon_text }}
                            </label>
                          </li>
                          <li>
                            <label>
                              <label style="margin-left:20px;" v-text="lan.use.fieldset_panel.setting_panel.favicon_defaultIcon_text"></label>
                              <input id="sp-ac-faviconUrl" name="sp-ac-a_force" v-model="ACConfig.defaultFaviconUrl" value="https://ae01.alicdn.com/kf/HTB1dRY0X8OD3KVjSZFFq6An9pXay.jpg" style="width:55%;margin-top:-0.3em;" type="input">
                            </label>
                          </li>
                          <!------------移除百度搜索预测-------------->
                          <li>
                            <label>
                              <input :title="lan.use.fieldset_panel.setting_panel.searchOrigin_title" v-model="ACConfig.doDisableSug" id="sp-ac-sug_origin" name="sp-ac-a_force" type="checkbox" checked="">
                              {{ lan.use.fieldset_panel.setting_panel.searchOrigin_text }}
                            </label>
                          </li>
                          <!------------附加7、8、9-------------->
                          <li>
                            <label>
                              <input id="sp-ac-right" v-model="ACConfig.isRightDisplayEnable" type="checkbox">
                              {{ lan.use.fieldset_panel.setting_panel.showRight_text }}
                            </label>
                            <label>
                              <input id="sp-ac-counter" v-model="ACConfig.isCounterEnable" name="sp-ac-a_force" type="checkbox">
                              <span :title="lan.use.fieldset_panel.setting_panel.hintShowCounter_text">{{ lan.use.fieldset_panel.setting_panel.showCounter_text }}</span>
                            </label>
                            <label>
                              <input id="sp-ac-aline" v-model="ACConfig.isALineEnable" name="sp-ac-a_force" type="checkbox">
                              {{ lan.use.fieldset_panel.setting_panel.showALine_text }}
                            </label>
                          </li>
                          <!------------自定义样式内容-------------->
                          <li>
                            <label>
                              <input id="sp-ac-userstyle" v-model="ACConfig.isUserStyleEnable" name="sp-ac-a_force" type="checkbox">
                              {{ lan.use.fieldset_panel.setting_panel.showUserStyle_text }}
                            </label>
                            <label v-if="LiveConfig.css_has_error" style="color: red; font-weight: bold;">error</label>
                            <span class="sp-ac-spanbutton" @click="resetCSS" title="Reset CSS" v-text="resetCSS_text"></span>
                          </li>
                          <li>
                            <textarea id="sp-ac-userstyleTEXT" v-model="ACConfig.UserStyleText" @keyup="loadCustomStyle" @change="loadCustomStyle" @paste="loadCustomStyle" name="sp-ac-a_force" style="width:85%;height: 66px;margin-left:30px;" type="input" ></textarea>
                          </li>
                          <li>
                            <a class="linkhref" target="_blank" :href="lan.use.fieldset_panel.setting_panel.contactMe_url" v-text="lan.use.fieldset_panel.setting_panel.contactMe_text"></a>
                          </li>
                        </ul>
                        <!------------拦截域名设置panel-------------->
                        <ul class="setting-second" v-show="other.curTab === 2">
                          <li style='margin-bottom: 8px !important;'>
                            <label>
                              <span id='sp-ac-blockdiybutton-back' @click="other.curTab=1,other.showBlockListArea = false" class='sp-ac-spanbutton'>{{ lan.use.fieldset_panel.setting_panel.setting_panel_second.backBtn_text }}</span>
                            </label>
                            {{ lan.use.fieldset_panel.setting_panel.setting_panel_second.blockLabel_text }}}
                          </li>
                          <li style='margin-bottom: 8px !important;'>
                            <span id='sp-ac-blockdiybutton-diylist' class='sp-ac-spanbutton' @click="other.showBlockListArea = !other.showBlockListArea" v-text="cal_diyBlockListBtn"></span>
                          </li>
                          <li class='ac-blockList' @click="removeABlockListItem" style='max-height:60vh;overflow-y: scroll;'>
                            <ul v-show="!other.showBlockListArea" v-html="getBlockList"></ul>
                          </li>
                          <li class='ac-blockBoxCon' style='max-height: 60vh;text-align: center;margin-left: 26px;'>
                            <textarea v-show="other.showBlockListArea"  @keyup="syncToBlockList" @change="syncToBlockList" @paste="syncToBlockList" rows="20" v-text="ACConfig.UserBlockList.join('\\n')"></textarea>
                          </li>
                          <li>
                            {{ lan.use.fieldset_panel.setting_panel.setting_panel_second.addBlockLabel_text }}<input class="sp-ac-addRuleOne" @keyup.enter="ckAddRule" v-model="other.addBlockItem" style='width:55%;'>
                            <span id='sp-ac-addRulebutton' class='sp-ac-spanbutton endbutton' @click="ckAddRule" style='position: relative !important;line-height: 17px;' v-text="lan.use.fieldset_panel.setting_panel.setting_panel_second.addBtnLabel_text">新增</span>
                          </li>
                        </ul>
                        <ul v-show="other.curTab === 3" style="width: 300px">
                          <li>
                            <div class="dialog-body">
                              <label>
                                <span id='sp-ac-blockdiybutton-back' @click="other.curTab=1" class='sp-ac-spanbutton'>返回</span>
                              </label>
                              <div>
                                <div>使用说明:</div>
                                <div>-</div>
                                <p>1. 本脚本不包含任何广告内容,也无意于破坏网站现有功能的完整性,仅希望通过一些显示效果的变更能更好的留存对应网站现有的用户,一定程度上更好地保证了目标网站的日活。</p>
                                <p>
                                  2. 同时本脚本中所有功能均为学习和研究web前端技术的发展而开发,希望为学习前端技术的研究人员提供一个更好的参考代码,促进web前端技术的发展,便于技术的学习和交流,本脚本不涉及对网站源码的调试和修改,因使用本脚本进行非法用途与本脚本无关。
                                </p>
                              </div>
                            </div>
                          </li>
                        </ul>
                        <!------------保存、取消按钮-------------->
                        <span id="sp-ac-cancelbutton" class="sp-ac-spanbutton endbutton" @click="closePanel" :title="lan.use.fieldset_panel.setting_panel.cancelBtn_text" style="position: relative;float: left;" v-text="lan.use.fieldset_panel.setting_panel.cancelBtn_text"></span>
                        <span id="sp-ac-savebutton" ref="bottomSaveButton" @click="saveConfig" class="sp-ac-spanbutton endbutton" :title="lan.use.fieldset_panel.setting_panel.okBtn_text" style="position: relative;float: right;" v-text="lan.use.fieldset_panel.setting_panel.okBtn_text"></span>
                      </fieldset>
                    </div>
                  </div>`;
                try {
                  document.body.appendChild(Container);
                } catch (e) {
                  console.log(e);
                }
              }
              let allNodes = document.querySelectorAll(".AC-faviconT, .AC-CounterT");
              for (let i = 0; i < allNodes.length; i++) {
                if (allNodes[i].getAttribute('acClick') === null) {
                  allNodes[i].setAttribute('acClick', '1');
                  try {
                    allNodes[i].addEventListener('click', function (e) {
                      return ACtoggleSettingDisplay(e);
                    }, true);
                  } catch (e) {
                    console.log(e);
                  }
                }
              }
              try {
                document.querySelector("body #sp-ac-container").addEventListener('click', function (e) {
                  e.stopPropagation(); // 阻止点击自身的时候关闭
                }, false);
                document.querySelector("body").addEventListener('click', function (e) {
                  safeFunction( () => {
                    document.querySelector("#sp-ac-content").style.display = 'none';
                  })
                }, false);
              } catch (e) {
              }
    
            }
    
            function isElementVisible(dom) {
              const scrTop = document.documentElement.scrollTop || document.body.scrollTop;
              return !(scrTop > (dom.offsetTop + dom.offsetHeight) || (scrTop + window.innerHeight) < dom.offsetTop);
            }
    
            function removeMobileBaiduDirectLink() {
              let nodes = document.querySelectorAll("#page #page-bd #results .result:not([ac_redirectStatus])");
              for (let i = 0; i < nodes.length; i++) {
                let curNode = nodes[i];
                safeFunction(function () {
                  let curData = JSON.parse(curNode.dataset.log.replace(/'/gm, "\""));
                  let trueLink = curData.mu;
                  curNode.querySelector("article").setAttribute("rl-link-href", trueLink);
                  curNode.querySelectorAll("a").forEach(function (per) {
                    per.setAttribute("href", trueLink);
                  });
                });
                curNode.setAttribute("ac_redirectStatus", "1");
              }
            }
    
            function removeOnMouseDownFunc() {
              try {
                let resultNodes = document.querySelectorAll(".g .rc a, #rs, #rso .g a");
                for (let i = 0; i < resultNodes.length; i++) {
                  let one = resultNodes[i];
                  one.setAttribute("onmousedown", ""); // 谷歌去重定向干扰
                  one.setAttribute("target", "_blank"); // 谷歌链接新标签打开
                }
              } catch (e) {
                console.log(e);
              }
            }
    
            function removeRedirectLinkTarget() {
              if (curSite.SiteTypeID === SiteType.ZHIHU) {
                let nodes = document.querySelectorAll(".RichText a[href*='//link.zhihu.com/?target']");
                for (let i = 0; i < nodes.length; i++) {
                  let url = decodeURIComponent(nodes[i].href.replace(/https?:\/\/link\.zhihu\.com\/\?target=/, ""));
                  nodes[i].href = url;
                }
              } else if (curSite.SiteTypeID === SiteType.BAIDU_XUESHU) {
                let xnodes = document.querySelectorAll("a[href*='sc_vurl=http']");
                for (let j = 0; i < xnodes.length; j++) {
                  let xurl = getUrlAttribute(xnodes[j].href, "sc_vurl", true);
                  xnodes[j].href = xurl;
                }
              }
            }
    
            // 提取url元素的参数值
            function getUrlAttribute(url, attribute, needDecode) {
              let searchValueS = (url.substr(1) + "").split("&");
              for (let i = 0; i < searchValueS.length; i++) {
                let key_value = searchValueS[i].split("=");
                let reg = new RegExp("^" + attribute + "$");
                if (reg.test(key_value[0])) {
                  let searchWords = key_value[1];
                  return needDecode ? decodeURIComponent(searchWords) : searchWords;
                }
              }
            }
    
            function resetURLNormal(list) {
              // 注意有重复的地址,尽量对重复地址进行去重
              var hasDealHrefSet = new Set();
              for (var i = 0; i < list.length; i++) {
                // 此方法是异步,故在结束的时候使用i会出问题-严重!
                // 采用闭包的方法来进行数据的传递
                let curNode = list[i];
                let curhref = curNode.href;
                if (list[i] !== null && list[i].getAttribute("ac_redirectStatus") === null) {
                  list[i].setAttribute("ac_redirectStatus", "0");
                  let len1 = hasDealHrefSet.size;
                  hasDealHrefSet.add(curhref);
                  let len2 = hasDealHrefSet.size;
                  if (len1 === len2) continue; // 说明数据已经处理过,存在相同的记录
                  if (curhref.includes("www.baidu.com/link") ||
                    curhref.includes("m.baidu.com/from") ||
                    curhref.includes("www.sogou.com/link") ||
                    curhref.includes("so.com/link")) {
                    (function (c_curnode, c_curhref) {
                      let url = c_curhref.replace(/^http:/, "https:");
                      if (curSite.SiteTypeID === SiteType.BAIDU && !url.includes("eqid")) {
                        // 如果是百度,并且没有带有解析参数,那么手动带上
                        url = url + "&wd=&eqid=";
                      }
                      let gmRequestNode = GM_xmlhttpRequest({
                        // from: "acxhr",
                        extData: c_curhref, // 用于扩展
                        url: url,
                        headers: {"Accept": "*/*", "Referer": c_curhref.replace(/^http:/, "https:")},
                        method: "GET",
                        timeout: 8000,
                        onreadystatechange: function (response) { // MARK 有时候这个函数根本不进来 - 调试的问题 - timeout
                          if(response.responseText || response.responseHeaders) {
                            // 由于是特殊返回-并且好搜-搜狗-百度都是这个格式,故提出
                            DealRedirect(gmRequestNode, c_curhref, response.responseText, "URL='([^']+)'")
                            // 这个是在上面无法处理的情况下,备用的 tm-finalurldhdg  tm-finalurlmfdh
    
                            if (response.responseHeaders.includes("tm-finalurl")) {
                              let relURL = Reg_Get(response.responseHeaders, "tm-finalurl\\w+: ([^\\s]+)");
                              if (relURL === null || relURL === "" || relURL.includes("www.baidu.com/search/error")) return;
                              DealRedirect(gmRequestNode, c_curhref, relURL);
                            }
                          }
                        }
                      });
                    })(curNode, curhref); //传递旧的网址过去,读作c_curhref
                  }
                  // curNode.addEventListener("mouseover", ()=> {
                  //   const ABKey = RedirectMap.get(curNode.href); // 原始 -> 之后的链接
                  //   if(ABKey) curNode.href = ABKey;
                  // })
                  // curNode.addEventListener("mouseout", ()=> {
                  //   const BAKey = RedirectMap.get(curNode.href); // 之后的连接 -> 原始
                  //   if(BAKey) curNode.href = BAKey;
                  // })
                }
              }
              if (hasDealHrefSet.size > 0 && list.length - hasDealHrefSet.size > 0) console.log("丢弃掉", list.length - hasDealHrefSet.size, "个重复链接");
            }
    
            var DealRedirect = function (request, curNodeHref, respText, RegText) {
              if (respText === null || typeof (respText) === "undefined") return;
              let resultResponseUrl = "";
              if (RegText != null) {
                resultResponseUrl = Reg_Get(respText, RegText);
              } else {
                resultResponseUrl = respText;
              }
              if (resultResponseUrl !== null && resultResponseUrl !== "" && !resultResponseUrl.includes("www.baidu.com/link")) {
                try {
                  if (curSite.SiteTypeID === SiteType.SOGOU) curNodeHref = curNodeHref.replace(/^https:\/\/www.sogou.com/, "");
                  let host = getTextHost(resultResponseUrl);
                  // RedirectMap.set(curNodeHref, resultResponseUrl); // 进行一个数据关联
                  // RedirectMap.set(resultResponseUrl, curNodeHref); // 进行一个数据关联
                  document.querySelectorAll("*[href*='" + curNodeHref + "']").forEach( per => {
                    let changeNode = per;
    
                    changeNode.setAttribute("ac_redirectStatus", "2");
                    changeNode.href = resultResponseUrl;
                    // changeNode.setAttribute("data-orihref", changeNode.href);
                    if (changeNode.hasAttribute("meta")) {
                      changeNode.setAttribute("meta", host);
                      changeNode.dataset.host = host;
                    }
                    if (changeNode.text && changeNode.text.length < 10 && !changeNode.text.includes(host)
                      // 不能是redirect url 不能是h2\h3下直属链接
                      && !changeNode.parentElement.tagName.toLowerCase().includes("h")) {
                      changeNode.insertAdjacentHTML("beforeEnd", "&nbsp;-&nbsp;" + host);
                    }
                  })
    
                  otherData.other.curHosts.acpush(host + "###" + resultResponseUrl);
                  request.abort();
                } catch (e) {
                  // console.log(e);
                }
              }
            };
    
            function removeAD_baidu_sogou() { // 移除网站自有广告
              if (curSite.SiteTypeID === SiteType.BAIDU) {
    
                // 移除shadowDOM广告;搜索关键字:淘宝;然后点击搜索框,广告会多次重现shadowdom
                safeFunction(function () {
                  $('.c-container >>> .c-container').has('.f13>span:starts-with("广告")').remove();
                });
    
                // 移除右侧栏广告
                safeRemove_xpath("id('content_right')/div[.//a[starts-with(text(), '广告')]]");
                // 移除标准广告
                safeRemove_xpath("id('content_left')/div[.//span[contains(text(), '广告')]]");
                // 移除标准广告 - 新
                safeRemove_xpath("id('content_left')/div[.//a[text()='广告']]");
                // 移除右侧栏顶部-底部无用广告
                safeRemove_xpath("id('content_right')/br");
                safeRemove_xpath("id('content_right')/div[not(@id)]");
                // 移除顶部可能出现的 "为您推荐"
                safeRemove_xpath("id('content_left')//div[contains(@class, '_rs')]");
    
              } else if (curSite.SiteTypeID === SiteType.MBAIDU) {
                /****移除手机模式上的部分广告****/
                safeRemove_xpath("id('page-bd')/div[not(contains(@class, 'result'))]");
                safeRemove_xpath("id('page-bd')/div[not(@class)]");
                safeRemove_xpath("//div[@class='na-like-container']");
                // safeFunction(function () {
                //   $('#page-bd #results>div:not([class*="result"])').remove();
                // });
                // safeFunction(function () {
                //   $('#page-bd #results>div:not([class])').remove();
                // });
              } else if (curSite.SiteTypeID === SiteType.SO) {
                safeRemove("#so_kw-ad");
                safeRemove("#m-spread-left");
                // 移除搜索中底部广告
                safeRemove("#m-spread-bottom");
                // 移除右侧栏顶部广告
                safeRemove_xpath("id('righttop_box')//li[.//span[contains(text(), '广告')]]");
              } else if (curSite.SiteTypeID === SiteType.BING) {
                safeRemove(".b_ad");
                safeRemove_xpath("id('b_results')/li[./div[@class='ad_fls']]", true);
              } else if (curSite.SiteTypeID === SiteType.GOOGLE) {
                safeRemove("#bottomads");
                safeFunction(function () {
                  $('div[aria-label="广告"]').remove();
                });
              }
            }
    
            function addCounter(citeList) {
              let cssText = "position:relative;z-index:1;margin-right:4px;display:inline-block;color:white;font-family:'微软雅黑';font-size:16px;text-align:center;width:22px;line-height:22px;border-radius:50%;";
              let div = document.createElement('div');
              for (let i = 0; i < citeList.length; i++) {
                let cur = citeList[i]
                const index = cur.getAttribute('SortIndex');
                if (index === null || typeof (index) === "undefined") {
                  cur.setAttribute('SortIndex', CONST.sortIndex);
                  cur.inner = cur.innerHTML;
                  div.innerHTML = "<em class='AC-CounterT' style=" + cssText + ">" + CONST.sortIndex + "</em>";
                  cur.innerHTML = div.innerHTML + cur.inner;
                  CONST.sortIndex++;
                } else {
                  const curCounter = cur.querySelector(".AC-CounterT")
                  const oriIndex = curCounter.innerText
                  const checkValue = (i + 1) % 100;
                  // 数据值不同
                  // 数据没有被翻译
                  if (+index !== checkValue && !/^\d+$/.test(oriIndex)) { // 按需更新
                    curCounter.innerText =checkValue;
                    cur.setAttribute('SortIndex', checkValue);
                  }
                }
              }
            }
    
            var HostReg = new RegExp(/(https?:\/\/)?([^/\s]+)/i);
    
            function getTextHost(sbefore) {
              sbefore = (sbefore && sbefore.trim()).replace(/\s-\s\d{4}-\d{1,2}-\d{1,2}/, "") || "";
              let send;
              let result = sbefore.split('-');
              // --搜狗百度专用;如果第一个是中文的话,地址就是第二个
              if ((result.length > 1 && new RegExp("[\\u4E00-\\u9FFF]+", "g").test(sbefore)) && (curSite.SiteTypeID === SiteType.BAIDU || curSite.SiteTypeID === SiteType.SOGOU)) {
                sbefore = result[1];
              }
              // 此时sbefore几乎是等于网址了,但是有时候会有多的空格,多的内容,多的前缀http,多余的路径
              let res = HostReg.exec(sbefore);
              send = (res && res[2].trim()) || "";
              // send = sbefore.replace(/(\/[^/]*|\s*)/, "").replace(/<[^>]*>/g, "").replace(/https?:\/\//g, "").replace(/<\/?strong>/g, "").replace(/<\/?b>/g, "").replace(/<?>?/g, "").replace(/( |\/).*/g, "").replace(/\.\..*/, "");
              if (send === "") return null;
              if (send.indexOf(".") < 0) return null;
              if (send.indexOf("↵") >= 0) return null;
              return send.trim();
            }
    
            function addFavicon(citeList) {
              if (curSite.SiteTypeID !== SiteType.DOGE) {
                for (let index = 0; index < citeList.length; index++) {
                  if (null === citeList[index].getAttribute("ac_faviconStatus")) {
                    let curNode = citeList[index];
                    let targetNode = curNode;
                    let { curHost, curUrl } = getNodeHost(targetNode);
                    if (curHost === null || (curUrl && curUrl.includes("www.baidu.com/link"))) { // 跳过baidu.click
                      continue;
                    } else {
                      otherData.other.curHosts.acpush(curHost + "###" + curUrl);
                    }
                    let faviconUrl = curHost;
                    let II = 0;
                    for (; II <= 5; II++) {
                      targetNode = targetNode.parentNode;
                      if (targetNode != null && targetNode.querySelector(curSite.FaviconAddTo) != null) {
                        break;
                      }
                    }
                    if(targetNode.parentNode.hasAttribute('tpl') && targetNode.parentNode.getAttribute('tpl').includes('stock')) {
                      curNode.setAttribute("ac_faviconStatus", "-3");
                      continue
                    }
                    //console.log(index+"."+faviconUrl+"--"+II);
                    if (II <= 5) {
                      // 先用父节点判断一下是否存在img
                      let tmpHTML = targetNode.innerHTML;
                      let pos = tmpHTML.indexOf("fav-url")
                        & tmpHTML.indexOf("wr_fav")
                        & tmpHTML.indexOf("favurl")
                        & tmpHTML.indexOf("tit-ico")
                        & tmpHTML.indexOf("img_fav rms_img")
                        & tmpHTML.indexOf("c-tool-")
                        & tmpHTML.indexOf("span class=\"c-icon c-icon-")
                        & tmpHTML.indexOf("img class=\"xA33Gc");
                      //他自己已经做了favicon了
                      if (pos > -1) {
                        // console.log("已有图片:");
                        curNode.setAttribute("ac_faviconStatus", "-2");
                        continue;
                      }
                      targetNode = targetNode.querySelector(curSite.FaviconAddTo);
                      // 特殊处理BING
                      // if (curSite.SiteTypeID === SiteType.BING) curNode = curNode.querySelector("h2");
                      //https://api.byi.pw/favicon/?url=???? 不稳定
                      //http://"+faviconUrl+"/cdn.ico?defaulticon=http://soz.im/favicon.ico 不稳定
                      //https://www.xtwind.com/api/index.php?url=???? 挂了。。。
                      //https://statics.dnspod.cn/proxy_favicon/_/favicon?domain=sina.cn
                      //www.google.com/s2/favicons?domain=764350177.lofter.com
                      //如果地址不正确,那么丢弃
                      let host = faviconUrl.replace(/[^.]+\.([^.]+)\.([^.]+)/, "$1.$2");
                      if (targetNode.querySelector(".AC-faviconT") === null && host.length > 3) {
                        let insNode = document.createElement("img");
                        // curNode = curNode.children[0] || curNode.firstChild ; // firstChild容易遇到text对象
                        curNode.setAttribute("ac_faviconStatus", "1");
                        // curNode.insertBefore(insNode, curNode.firstChild);
                        insNode.className = "AC-faviconT";
                        insNode.setAttribute("referrerpolicy", "no-referrer");
                        insNode.style = "position:relative;z-index:1;vertical-align:sub;height:16px;width:16px;margin-right:5px;margin-bottom: 2px;user-select:none;";
    
                        insNode.src = "https://favicon.yandex.net/favicon/v2/" + (curNode.href || host); // MARK yandex支持这种查询规则
                        insNode.setAttribute("faviconID", "0");
                        insNode.setAttribute("ondragstart", "return false;") // 禁止拖动图片-避免拖错了
                        // curNode.innerHTML = insNode.outerHTML + curNode.innerHTML;
                        // curNode.insertAdjacentHTML("afterEnd", insNode.innerHTML);
                        let beforeIndex = 0;
                        if (targetNode.childNodes[beforeIndex].className === "AC-CounterT") {
                          beforeIndex = 1;
                        }
                        targetNode.insertBefore(insNode, targetNode.childNodes[beforeIndex]);
                        (function (xcur) {
                          insNode.onload = function (env) {
                            let imgNode = xcur.querySelector(".AC-faviconT");
                            if ((imgNode || {}).naturalWidth < 10) {
                              imgNode.setAttribute("old-src", imgNode.src);
                              imgNode.src = ACConfig.defaultFaviconUrl;
                            }
                            imgNode.onload = "javascript:void(0);";
                          };
                        })(targetNode);
                      }
                    }
                  }
                }
              } else {
                var checkNodes = document.querySelectorAll("#links_wrapper #links .results_links_deep");
                for (let faNode of checkNodes) {
                  let faviconNode = faNode.querySelector(".result__icon img");
                  let beforeNode = faNode.querySelector(".result__title a");
                  if(faviconNode && beforeNode){
                    faviconNode.style = "vertical-align:middle;margin-right:5px;";
                    beforeNode.parentNode.insertBefore(faviconNode, beforeNode);
                  }
                }
              }
            }
    
            function InsertSettingMenu() {
              if ((curSite.SiteTypeID !== SiteType.OTHERS) && document.querySelector("#myuser") === null) {
                try {
                  let parent = document.querySelector("#u, #gb>div>div>div, #b_header>#id_h, .top-bar .sogou-set-box, #header_wrapper .js-hl-button, body[doge] #header_wrapper #header"); //baidu; google; bing; 搜狗
                  parent.style = "width: auto;";
                  let userAdiv = document.createElement("div");
                  userAdiv.id = "myuser";
                  userAdiv.innerHTML = `<input type='submit' class='myuserconfig' value='${AllData.lan.use.menu_text}'/><span class='ac-newversionDisplay' style='background-color: red;float: left;height: 8px;width: 8px;border-radius: 4px;display:${(CONST.hasNewFuncNeedDisplay ? "unset" : "none")}'>&nbsp;</span>`;
                  parent.insertBefore(userAdiv, parent.childNodes[0]);
                  document.querySelector("#myuser .myuserconfig").addEventListener("click", function (e) {
                    return ACtoggleSettingDisplay(e);
                  }, true);
                } catch (e) {
                }
              }
            }
          }(); // 读取个人设置信息
          /**
           * @param callback 回调函数,需要返回是否结束True、False、否则相当于定时器
           * callback return:
           *  true = 倒计时
           *  false = 计时器
           *  none = 计时器
           * @param period 周期,如:200ms
           * @param runNow 立即执行
           */
          function RAFInterval(callback, period, runNow) {
            // 一秒60次,对应1秒1000ms
            const needCount = period / 1000 * 60;
            let times = 0; // 已经计数的数量
    
            if(runNow === true){ // 对于立即执行函数的立即判定,否则进行
              const shouldFinish = callback();
              if(shouldFinish) return;
            }
    
            function step() {
              if(times < needCount){
                // 计数未结束-继续计数
                times++;
                requestAnimationFrame(step)
              }else{
                // 计数结束-停止计数,判定结果
                const shouldFinish = callback() || false;
                if(!shouldFinish){
                  // 返回值为false,重启计数器
                  times = 0;
                  requestAnimationFrame(step)
                }else{
                  // 返回值为true,结束计数器
                  return
                }
              }
            }
            requestAnimationFrame(step);
          }
    
          function safeFunction(func) {
            try {
              func();
            } catch (e) {
            }
          }
    
          function safeWaitFunc(selector, callbackFunc, time, notClear) {
            time = time || 50;
            notClear = notClear || false;
            let doClear = !notClear;
            RAFInterval(function () {
              if ((typeof (selector) === "string" && document.querySelector(selector) != null)) {
                callbackFunc(document.querySelector(selector));
                if (doClear) return true;
              } else if (typeof (selector) === "function" && (selector() != null || (selector() || []).length > 0)) {
                callbackFunc(selector()[0]);
                if (doClear) return true;
              }
            }, time, true);
          }
    
          function AC_addStyle(css, className, addToTarget, isReload, initType) { // 添加CSS代码,不考虑文本载入时间,只执行一次-无论成功与否,带有className
            RAFInterval(function () {
              /**
               * addToTarget这里不要使用head标签,head标签的css会在html载入时加载,
               * html加载后似乎不会再次加载,body会自动加载
               * **/
              let addTo = document.querySelector(addToTarget);
              if (typeof (addToTarget) === "undefined")
                addTo = (document.head || document.body || document.documentElement);
              isReload = isReload || false; // 默认是非加载型
              initType = initType || "text/css";
              // 如果没有目标节点(则直接加) || 有目标节点且找到了节点(进行新增)
              if (typeof (addToTarget) === "undefined" || (typeof (addToTarget) != "undefined" && document.querySelector(addToTarget) != null)) {
                // clearInterval(tout);
                // 如果true 强行覆盖,不管有没有--先删除
                // 如果false,不覆盖,但是如果有的话,要退出,不存在则新增--无需删除
                if (isReload === true) {
                  safeRemove("." + className);
                } else if (isReload === false && document.querySelector("." + className) != null) {
                  // 节点存在 && 不准备覆盖
                  return true;
                }
                let cssNode = document.createElement("style");
                if (className != null) cssNode.className = className;
                cssNode.setAttribute("type", initType);
                cssNode.innerHTML = css;
                try {
                  addTo.appendChild(cssNode);
                } catch (e) {
                  console.log(e.message);
                }
                return true;
              }
            }, 20, true);
          }
    
          function safeRemove(cssSelector) {
            safeFunction(() => {
              let removeNodes = document.querySelectorAll(cssSelector);
              for (let i = 0; i < removeNodes.length; i++)
                removeNodes[i].remove();
            })
          }
    
          function hideNode(node) {
            if(node.hasAttribute('ac-ad-hide')) return
            node.setAttribute('ac-ad-hide', '1')
            node.style = 'display: none !important;'
          }
    
          function safeRemove_xpath(xpathSelector, isHide=false) {
            safeFunction(() => {
              let removeNodes = getAllElements(xpathSelector);
              if(isHide) {
                for (let i = 0; i < removeNodes.length; i++){
                  hideNode(removeNodes[i])
                }
              } else {
                for (let i = 0; i < removeNodes.length; i++){
                  removeNodes[i].remove();
                }
              }
            })
          }
    
          function checkISBaiduMain() { // 首页=true;非首页=false
            // 如果是百度 &&  没有(百度搜索结果的标志-[存在]百度的内容) return;
            return !(curSite.SiteTypeID === SiteType.BAIDU && !(location.href.replace(/(&|\?)(wd|word)=/, "") !== location.href || document.querySelector("#content_left") ||
                ((document.querySelector("#kw") && document.querySelector("#kw").getAttribute("value")) || "") !== "")
            )
          }
    
          /**
           * 检查document的子节点是否含有元素
           * @param nodeClass 待检查元素
           * @returns {boolean} T|F
           */
          function checkDocmentHasNode(nodeClass) {
            for (let i = 0; i < document.childNodes.length; i++) {
              if (document.childNodes[i].data && document.childNodes[i].data.indexOf(nodeClass) > 0)
                return {res: true, node: document.childNodes[i]};
            }
            return {res: false, node: null};
          }
    
          function FSBaidu() { // thanks for code from 浮生@未歇 @page https://greasyfork.org/zh-TW/scripts/31642
            // debug("初始化FSBAIDU");
    
            CONST.StyleManger = {
              /**
               * 导入css内容为【文本格式】!!!
               * @param data css内容
               * @param toClassName 预期的类名
               */
              importStyle: function (data, toClassName, useNormalCSS, mustLoad) {
                if (typeof (data) === "undefined" || data === null) {
                  // 这个居然在VM上出问题了,很奇怪
                  console.error("GM_getResourceText获取内容数据异常");
                  return
                }
                useNormalCSS = useNormalCSS || false;
                mustLoad = mustLoad || false;
                // 普通浏览器模式--但是似乎样式加载的优先级低于head中的style优先级
                if (!useNormalCSS && curSite.SiteTypeID !== SiteType.DUCK) {
                  // 通过must参数来判定style是否加载
                  // data = data.replace(/baidu.com#\$#/igm, '');
                  if (data.indexOf("http") !== 0) data = "data:text/css;utf-8," + encodeURIComponent(data);
                  var {res,} = checkDocmentHasNode(toClassName);
                  if (!res) {
                    let pi = document.createProcessingInstruction(
                      "xml-stylesheet",
                      `type="text/css" must="${mustLoad}" class="${toClassName}" href="${data}"`
                    ); // 注意必须要双引号
                    document.insertBefore(pi, document.documentElement);
                  }
                } else {
                  /* **********多重样式-兼容edge && 黑夜脚本************ */
                  AC_addStyle(data, toClassName, "head", false, "text/css");
                  /* **********多重样式-兼容edge && 黑夜脚本************ */
                }
              },
              //加载普通样式
              loadCommonStyle: function () {
                this.loadStyle(CONST.useItem.name + "CommonStyle", CONST.useItem.name + "CommonStyle");
              },
              loadBaiduLiteStyle: function () {
                CONST.StyleManger.loadStyle("baiduLiteStyle", "baiduLiteStyle", null, false, true);
                CONST.StyleManger.loadPlainToCSS("baiduLiteStyle");
              },
              loadStyle: async function (styleName, insClassName, setUrl, useNormalCSS, mustLoad) {
                // 全部采用text/css的内容来载入
                // 如果是debug模式。或者是gm模式
                if (isLocalDebug) {
                  debug("本地-加载样式:" + insClassName);
                  setUrl = setUrl || "http://127.0.0.1/" + styleName + ".css";
                  this.importStyle(setUrl, "AC-" + insClassName, useNormalCSS, mustLoad);
                } else if (isNewGM === true) {
                  // 仅用于GreaseMonkey4.0+
                  debug("特殊模式-加载样式:" + insClassName);
                  setUrl = setUrl || "https://sync.tujidu.com/newcss/" + styleName + ".css";
                  this.importStyle(setUrl, "AC-" + insClassName, useNormalCSS, mustLoad);
                } else {
                  debug("加载样式:" + insClassName);
                  // TamperMonkey + GreaseMonkey < 4.0 + ViolentMonkey (4.0GreaseMonkey不支持GetResource方法)
                  this.importStyle(await GM_getResourceText(styleName), "AC-" + insClassName, useNormalCSS, mustLoad);
                }
              },
              //加载护眼模式样式
              loadHuYanStyle: function (color) {
                let style = "body[baidu],#wrapper #head,#wrapper #s_tab,form.fm .s_ipt_wr.bg{background-color:#fff}#container #content_left .result-op,#container #content_left .result,#container #rs,#container #content_right{background-color:#aaa;border:1px double #a2d7d4;border-radius:0}#container #content_left .result-op:hover,#container #content_left .result:hover{background-color:#ccc!important}#container #content_left .result-op h3,#container #content_left .c-container h3,#container #rs .tt{background-color:#bbb}.na_cnt .nws_itm,.nws_itmb,#b_content #b_results li,body #b_header{background-color:#aaa;border:1px double #a2d7d4;border-radius:0}#b_content #b_results li:hover{background-color:#ccc!important}#b_content #b_results li h2{background-color:#bbb}#rso .g,.bkWMgd>.g,.bkWMgd g-inner-card,#rhscol #rhs,#rhscol #rhs .g>div,.c2xzTb .g,.ruTcId .g,.fm06If .g,.cUnQKe .g,.HanQmf .g{background-color:#aaa;border:1px double #a2d7d4;border-radius:0}#rso .g:hover,.bkWMgd>.g:hover{background-color:#ccc!important}.bkWMgd .g div.r,#rso .g h3{background-color:#bbb}";
                if (ACConfig.isUserColorEnable) {
                  color = color || ACConfig.defaultHuYanColor || "#FFFFFF";
                } else {
                  color = color || "#FFFFFF";
                }
                if (color.indexOf("#") !== 0 || color.length < 7) return;
                if (isNewGM === false) {
                  style = GM_getResourceText("MainHuYanStyle");
                }
                style = style
                .replace(/#aaa(a*)/igm, color)
                .replace(/#bbb(b*)/igm, this.Lighter(color, -40))
                .replace(/#ccc(c*)/igm, this.Lighter(color, 45));
                AC_addStyle(style, "AC-" + CONST.useItem.name + "HuYanStyle" + (isNewGM ? "" : "-File"), "head", true); // 需要修改的,所以为true
              },
              clip255: function (value) {
                if (value > 255) return 255;
                if (value < 0) return 0;
                return value;
              },
              Lighter: function (oriRGB, deltaY) {
                // 按比例缩放 + 1/deltaY
                // HEX 2 RGB
                let rgb = oriRGB.replace("#", "");
                let R = parseInt("0x" + rgb.substr(0, 2));
                let G = parseInt("0x" + rgb.substr(2, 2));
                let B = parseInt("0x" + rgb.substr(4, 2));
                // RGB 2 YUV
                let Y = ((66 * R + 129 * G + 25 * B + 128) >> 8) + 16;
                let U = ((-38 * R - 74 * G + 112 * B + 128) >> 8) + 128;
                let V = ((112 * R - 94 * G - 18 * B + 128) >> 8) + 128;
                Y = Y * (1 + 1.0 / deltaY);// 提高亮度
                // YUV 2 RGB
                R = this.clip255((298 * (Y - 16) + 409 * (V - 128) + 128) >> 8);
                G = this.clip255((298 * (Y - 16) - 100 * (U - 128) - 208 * (V - 128) + 128) >> 8);
                B = this.clip255((298 * (Y - 16) + 516 * (U - 128) + 128) >> 8);
                return "#" + ((R << 16) + (G << 8) + B).toString(16);
              },
              //加载单页样式
              loadOnePageStyle: function () {
                this.loadStyle(CONST.useItem.name + "OnePageStyle", CONST.useItem.name + "OnePageStyle");
              },
              //加载双页样式
              loadTwoPageStyle: function () {
                this.loadStyle(CONST.useItem.name + "TwoPageStyle", CONST.useItem.name + "TwoPageStyle");
                let cssHead = "";
                if (curSite.SiteTypeID === SiteType.BAIDU || curSite.SiteTypeID === SiteType.MBAIDU) cssHead = "#container #content_left, body[news] #container #content_left>div:not([class]):not([id])";
                if (curSite.SiteTypeID === SiteType.GOOGLE) CONST.isGoogleSpecial ? cssHead = ".srg, #rso" : cssHead = ".srg, #rso>div:not(.g)";
                if (curSite.SiteTypeID === SiteType.BING) cssHead = "#b_content #b_results";
                if (curSite.SiteTypeID === SiteType.SOGOU) cssHead = "#main .results";
                if (curSite.SiteTypeID === SiteType.DUCK) cssHead = "#links_wrapper .results--main #links";
                if (curSite.SiteTypeID === SiteType.DOGE) cssHead = "#links_wrapper .results--main #links";
                AC_addStyle(cssHead + "{grid-template-columns: repeat(2, minmax(50%,1fr));grid-template-areas:'xmain xmain';grid-column-gap: 1px;}.AC.sp-separator{grid-column-start: 1;grid-column-end: xmain-end;}",
                  "AC-TwoPageExStyle", "head");
              },
              // 加载三列样式
              loadThreePageStyle: function () {
                let cssHead = "";
                if (curSite.SiteTypeID === SiteType.BAIDU || curSite.SiteTypeID === SiteType.MBAIDU) cssHead = "#container #content_left, body[news] #container #content_left>div:not([class]):not([id])";
                if (curSite.SiteTypeID === SiteType.GOOGLE) CONST.isGoogleSpecial ? cssHead = ".srg, #rso" : cssHead = ".srg, #rso>div:not(.g)";
                if (curSite.SiteTypeID === SiteType.BING) cssHead = "#b_content #b_results";
                if (curSite.SiteTypeID === SiteType.SOGOU) cssHead = "#main .results";
                if (curSite.SiteTypeID === SiteType.DUCK) cssHead = "#links_wrapper .results--main #links";
                if (curSite.SiteTypeID === SiteType.DOGE) cssHead = "#links_wrapper .results--main #links";
                AC_addStyle(cssHead + "{grid-template-columns: repeat(3, minmax(33.3%,1fr));grid-template-areas:'xmain xmain xmain';grid-column-gap: 10px;}",
                  "AC-ThreePageExStyle", "head");
              },
              // 加载四列样式
              loadFourPageStyle: function () {
                let cssHead = "";
                if (curSite.SiteTypeID === SiteType.BAIDU || curSite.SiteTypeID === SiteType.MBAIDU) cssHead = "#container #content_left, body[news] #container #content_left>div:not([class]):not([id])";
                if (curSite.SiteTypeID === SiteType.GOOGLE) CONST.isGoogleSpecial ? cssHead = ".srg, #rso" : cssHead = ".srg, #rso>div:not(.g)";
                if (curSite.SiteTypeID === SiteType.BING) cssHead = "#b_content #b_results";
                if (curSite.SiteTypeID === SiteType.SOGOU) cssHead = "#main .results";
                if (curSite.SiteTypeID === SiteType.DOGE) cssHead = "#links_wrapper .results--main #links";
                if (curSite.SiteTypeID === SiteType.DOGE) cssHead = "#links_wrapper .results--main #links";
                AC_addStyle(cssHead + "{grid-template-columns: repeat(4, minmax(25%,1fr));grid-template-areas:'xmain xmain xmain xmain';grid-column-gap: 1px;}",
                  "AC-FourPageExStyle", "head");
              },
              loadPlainToCSS: function () {
                for (let i = 0; i < document.childNodes.length; i++) {
                  let curNode = document.childNodes[i];
                  if (curNode.del) curNode.remove();
                }
                safeRemove("style[class*='AC'][del='1']");
              },
              // 禁止独立的样式加载
              loadCSSToPlain: function () {
                for (let i = 0; i < document.childNodes.length; i++) {
                  let curNode = document.childNodes[i];
                  // 如果是存在css, 且非必须数据
                  if (curNode.target === "xml-stylesheet" && curNode.data.indexOf("must=\"true") < 0) {
                    curNode.data = "";
                    curNode.del = true;
    
                    // 对于edge和safari都特殊处理一下吧
                    if (navigator.userAgent.toLowerCase().indexOf("edge") > 0 || navigator.userAgent.toLowerCase().indexOf("safari") > 0) {
                      curNode.remove();
                    }
                  }
                }
              },
              init() {
                ControlManager.init();
              }
            };
            var ControlManager = {
              //居中显示 --- 必须是百度和谷歌的搜索结果页面,其他页面不能加载的--已经通过脚本include标签限制了一部分
              centerDisplay: function () {
                // 如果是百度 && ((地址替换->包含wd关键词[替换之后不等-是百度结果页面]) || 有右边栏-肯定是百度搜索结果页 || value中存在搜索内容) return;
                if (!checkISBaiduMain()) {
                  CONST.StyleManger.loadCSSToPlain();
                  return;
                }
                AC_addStyle(".minidiv #logo img{width: 100px;height: unset;margin-top: 0.3rem;}", "AC-style-logo", "head");
                let result = parseInt(CONST.useItem.AdsStyleMode || -1);
                if (acCssLoadFlag === false && document.querySelector(".ACExtension") === null) {
                  debug("in样式即将加载:" + result);
                  let expandStyle = "#wrapper #rs, #wrapper #content_left .result, #wrapper #content_left .c-container{min-width:670px;}.c-span18{width:78%!important;min-width:550px;}.c-span24{width: auto!important;}";
                  if (result === 1) {
                    AC_addStyle(expandStyle, "AC-Style-expand", "head");
                    CONST.StyleManger.loadCommonStyle();
                  } else if (result === 2) {//单页居中
                    AC_addStyle(expandStyle, "AC-Style-expand", "head");
                    CONST.StyleManger.loadCommonStyle();
                    CONST.StyleManger.loadOnePageStyle();
                  } else if (result === 3) { //双页居中
                    CONST.StyleManger.loadCommonStyle();
                    CONST.StyleManger.loadTwoPageStyle();
                  } else if (result === 4) { // 三列
                    CONST.StyleManger.loadCommonStyle();
                    CONST.StyleManger.loadTwoPageStyle();
                    CONST.StyleManger.loadThreePageStyle();
                  } else if (result === 5) { // 四列
                    CONST.StyleManger.loadCommonStyle();
                    CONST.StyleManger.loadTwoPageStyle();
                    CONST.StyleManger.loadFourPageStyle();
                  }
                  acCssLoadFlag = true;
                  debug("in样式运行结束");
                  if (curSite.SiteTypeID === SiteType.BAIDU && ACConfig.Style_BaiduLite === true) {
                    AC_addStyle(GM_getResourceText("baiduLiteStyle"), "AC-baiduLiteStyle", "head")
                    CONST.StyleManger.loadBaiduLiteStyle();
                  }
                }
                if (curSite.SiteTypeID !== SiteType.BAIDU && curSite.SiteTypeID !== SiteType.BAIDU_XUESHU && curSite.SiteTypeID !== SiteType.GOOGLE && curSite.SiteTypeID !== SiteType.BING && curSite.SiteTypeID !== SiteType.SOGOU && curSite.SiteTypeID !== SiteType.DUCK && curSite.SiteTypeID !== SiteType.DOGE) return;
    
                // 如果是谷歌 && (地址替换->是谷歌图像页面 || 是地图页面)[替换要变] return;
                if (curSite.SiteTypeID === SiteType.GOOGLE && location.href.replace(/tbm=(isch|lcl|shop|flm)/, "") !== location.href) {
                  CONST.StyleManger.loadCSSToPlain();
                  return;
                }
                /**护眼Style最后载入**/
                if (CONST.useItem.HuYanMode === true || document.querySelector("style[class*='darkreader']") != null) CONST.StyleManger.loadHuYanStyle();
    
                CONST.StyleManger.loadPlainToCSS();
              },
              init: function () {
                if (CONST.isGoogleImageUrl) return;
                this.centerDisplay();
              }
            };
            // debug("调用加载自定义css");
            ControlManager.init();
            return CONST.StyleManger;
          }
        }
      })();
    }();
    p0 availability Stay 2.0.3+ 
    opened by shenruisi 2
  • It's impossible to use Stay on iPadOS

    It's impossible to use Stay on iPadOS

    This is how extension is look like usually: 3CF95A74-F6F4-4CEF-8AA3-453B2D0A3B14 This is how extension is look like at first launch Safari: 4AF5853A-26BA-41CE-BE22-3D05D7EBE269 This is how extension is look like in multitasking: 103D21A1-B384-4589-8F50-7FE09216F08A An adaptation for iPadOS would be appreciated!

    bug report p0 
    opened by GamerPlayer888 2
  • csdn会跳转

    csdn会跳转

    1.在安装了csdn客户端的情况下,点击链接会跳转(同类型的 某100扩展 也是会跳) 2.此扩展似乎只能作用在百度的搜索页面下,其他的搜索引擎就会失效,全都会跳转。(这种情况在 某look浏览器 下也一样会出现)

    btw:要说防跳转的话,感觉夸克做的好,几乎是100%防跳转了。很好奇夸克是怎么做到的。。难道也是用js??

    bug report new feat request 
    opened by KangMz 2
  • [Embed Script Request]: Bilibili-Evolved

    [Embed Script Request]: Bilibili-Evolved

    Role

    Collector

    Description

    Bilibili 增强脚本

    Script content

    https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/dist/bilibili-evolved.user.js

    Source page

    https://github.com/the1812/Bilibili-Evolved

    embed script request 
    opened by SongzhouYang 1
  • 知乎脚本

    知乎脚本

    https://greasyfork.org/zh-CN/scripts/407967-%E7%9F%A5%E4%B9%8E%E6%89%8B%E6%9C%BA%E7%BD%91%E9%A1%B5%E7%89%88%E6%94%B9%E8%BF%9B

    另外建议能够支持导入js文件,新建脚本还要复制文本,好麻烦呀

    new feat request p1 
    opened by AlanDinkle 1
  • [Embed Script Request]:

    [Embed Script Request]:

    Role

    Collector

    Description

    Sci-hub button 在文献页面上添加 Sci-hub 按钮,可以直接跳转到下载页面

    Script content

    D4870B80-D1E7-4C77-9567-64A36480E3A8

    Source page

    https://greasyfork.org/scripts/370246-sci-hub-button/code/Sci-hub%20button.user.js

    embed script request 
    opened by bytxk 1
  • 请求增加内置网易脚本

    请求增加内置网易脚本

    Discussed in https://github.com/shenruisi/Stay/discussions/24

    Originally posted by nb5p January 11, 2022

    脚本功能

    • 支持对网易文章自动展开全文
    • 支持解锁 App 阅读文章,使其可网页访问

    已知问题

    • 会导致网易首页文章列表的部分文章预览图无法加载
    • Stay 不支持 GM_addStyle,故在脚本内实现该方法

    脚本内容

    // ==UserScript==
    // @name         网易@AutoExpend
    // @namespace    http://stay.app/
    // @version      0.0.1
    // @description  自动展开网易文章,解除仅 App 阅读限制
    // @author       Stay²
    // @match        *://3g.163.com/*
    // @grant        GM_addStyle
    // @run-at       document-start
    // ==/UserScript==
    
    ;(function () {
        if (typeof GM_addStyle == "undefined") {
            function GM_addStyle(css) {
                let style = document.createElement("style");
                style.appendChild(document.createTextNode(css));
                (document.querySelector("head") || document.documentElement).appendChild(style);
            }
        };
        GM_addStyle(`\
    .footer {
        display: none !important;
    }
    article {
        height: auto !important;
        max-height: none !important;
        overflow: visible !important;
    }
    article .content .page {
        display: block !important;
    }`
        );
        window.addEventListener("load", () => {
            document.querySelectorAll('a[class^="newsapp-model-"]').forEach(_ => _.outerHTML = _.outerHTML);
            document.querySelectorAll('.to-app').forEach(_ => _.remove())
        });
    })();
    
    approved 
    opened by shenruisi 1
  • [Embed Script Request]: Remove Google Redirection

    [Embed Script Request]: Remove Google Redirection

    Role

    Collector

    Description

    Remove Google Redirection

    Script content

    // ==UserScript==
    // @name           Remove Google Redirection
    // @namespace      http://kodango.com
    // @description    Remove Google Redirection
    // @author         tuantuan
    // @version        1.1.0
    // @match          *://*.google.com/*
    // @run-at         document-end
    // ==/UserScript==
    
    /*
     * Let the user scripts or content scripts running in an annoymous function,
     * that is more safer.
     */
    (function (window) {
        "use strict";
    
        /*
         * Inject the function into current document and run it
         */
        function injectFunction(func) {
            var ele = document.createElement('script');
           var s = document.getElementsByTagName('script')[0];
    
            ele.type = 'text/javascript';
            ele.textContent = '(' + func + ')();';
    
            s.parentNode.insertBefore(ele, s);
        }
    
        /*
         * Disable the url rewrite function
         */
        function disableURLRewrite() {
            function inject_init() {
                /* Define the url rewrite function */
                Object.defineProperty(window, 'rwt', {
                    value: function() { return true; },
                    writable: false, // set the property to read-only
                    configurable: false
                });
            }
    
            injectFunction(inject_init);
        }
    
        /*
         * Clean the link, no track and no url redirection
         */
        function cleanTheLink(a) {
            if (a.dataset['cleaned'] == 1) // Already cleaned
                return;
    
            /* Set clean flag */
            var need_clean = false;
    
            /* Find the original url */
            var result = /\/(?:url|imgres).*[&?](?:url|q|imgurl)=([^&]+)/i.exec(a.href);
    
            if (result) {
                need_clean = true;
                a.href = result[1]; // Restore url to original one
            }
    
            /* Remove the onmousedown attribute if found */
            var val = a.getAttribute('onmousedown') || '';
    
            if (val.indexOf('return rwt(') != -1) {
                need_clean = true;
                a.removeAttribute('onmousedown');
            }
    
            /* FIXME: check the link class name */
            var cls = a.className || '';
    
            if (cls.indexOf('irc_') != -1) need_clean = true;
    
            /*
             * Remove all event listener added to this link
             */ 
            if (need_clean) {
                var clone = a.cloneNode(true);
                a.parentNode.replaceChild(clone, a);
                clone.dataset['cleaned'] = 1;
            }
        }
    
        /*
         * The main entry
         */
        function main()
        {
            disableURLRewrite();
    
            document.addEventListener('mouseover', function (event) {
                var a = event.target, depth = 1;
    
                /* Found the target link, and try to clean it */
                while (a && a.tagName != 'A' && depth-- > 0)
                    a = a.parentNode;
    
                if (a && a.tagName == 'A')
                    cleanTheLink(a);
            }, true);
        }
    
        main();
    })(window);
    

    Source page

    https://github.com/kodango/Remove-Google-Redirection

    embed script request approved 
    opened by mlyxshi 0
  • [Embed Script Request]: Block Youtube ads

    [Embed Script Request]: Block Youtube ads

    Role

    Collector

    Description

    block youtube 4 safari

    Script content

    EA9D96DA-DD06-4D1B-BCAD-94C8177E8CE4

    Source page

    https://github.com/AdguardTeam/BlockYouTubeAdsShortcut/blob/master/dist/block-youtube-ads.user.js

    embed script request approved 
    opened by shenlong616 0
  • Unsupport grant api GM_getMetadata

    Unsupport grant api GM_getMetadata

    this script will not work on the app

    https://github.com/reek/anti-adblock-killer#anti-adblock-killer--reek

    031A5266-3454-4363-AA9D-762E497BE231

    I’m open to the subscription if that’s necessary?

    opened by malicerainbow 0
  • Unsupport grant api GM_getMetadata

    Unsupport grant api GM_getMetadata

    Role

    Collector

    Description

    To prevent websites on iOS safari from detecting my Adguard Adblocker

    Script content

    https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js

    2755EE06-AF5B-400F-9F80-F7CFECBBB201

    Source page

    https://github.com/reek/anti-adblock-killer#anti-adblock-killer--reek

    embed script request 
    opened by malicerainbow 0
  • [Embed Script Request]: https://raw.githubusercontent.com/Anarios/return-youtube-dislike/main/Extensions/UserScript/Return%20Youtube%20Dislike.user.js

    [Embed Script Request]: https://raw.githubusercontent.com/Anarios/return-youtube-dislike/main/Extensions/UserScript/Return%20Youtube%20Dislike.user.js

    Role

    Collector

    Description

    Returns the YouTube dislike

    Script content

    I can’t find any tutorial videos or instructions on how to use the app I tried to use the app and it didn’t do the script

    // ==UserScript== // @name Return YouTube Dislike // @namespace https://www.returnyoutubedislike.com/ // @homepage https://www.returnyoutubedislike.com/ // @version 3.0.1 // @encoding utf-8 // @description Return of the YouTube Dislike, Based off https://www.returnyoutubedislike.com/ // @icon https://github.com/Anarios/return-youtube-dislike/raw/main/Icons/Return%20Youtube%20Dislike%20-%20Transparent.png // @author Anarios & JRWR // @match ://.youtube.com/* // @exclude ://music.youtube.com/ // @exclude ://.music.youtube.com/* // @compatible chrome // @compatible firefox // @compatible opera // @compatible safari // @compatible edge // @downloadURL https://github.com/Anarios/return-youtube-dislike/raw/main/Extensions/UserScript/Return%20Youtube%20Dislike.user.js // @updateURL https://github.com/Anarios/return-youtube-dislike/raw/main/Extensions/UserScript/Return%20Youtube%20Dislike.user.js // @grant GM.xmlHttpRequest // @connect youtube.com // @grant GM_addStyle // @run-at document-end // ==/UserScript==

    const extConfig = { // BEGIN USER OPTIONS // You may change the following variables to allowed values listed in the corresponding brackets (* means default). Keep the style and keywords intact. showUpdatePopup: false, // [true, false*] Show a popup tab after extension update (See what's new) disableVoteSubmission: false, // [true, false*] Disable like/dislike submission (Stops counting your likes and dislikes) coloredThumbs: false, // [true, false*] Colorize thumbs (Use custom colors for thumb icons) coloredBar: false, // [true, false*] Colorize ratio bar (Use custom colors for ratio bar) colorTheme: "classic", // [classic*, accessible, neon] Color theme (red/green, blue/yellow, pink/cyan) numberDisplayFormat: "compactShort", // [compactShort*, compactLong, standard] Number format (For non-English locale users, you may be able to improve appearance with a different option. Please file a feature request if your locale is not covered) numberDisplayRoundDown: true, // [true*, false] Round down numbers (Show rounded down numbers) tooltipPercentageMode: "none", // [none*, dash_like, dash_dislike, both, only_like, only_dislike] Mode of showing percentage in like/dislike bar tooltip. numberDisplayReformatLikes: false, // [true, false*] Re-format like numbers (Make likes and dislikes format consistent) // END USER OPTIONS };

    const LIKED_STATE = "LIKED_STATE"; const DISLIKED_STATE = "DISLIKED_STATE"; const NEUTRAL_STATE = "NEUTRAL_STATE"; let previousState = 3; //1=LIKED, 2=DISLIKED, 3=NEUTRAL let likesvalue = 0; let dislikesvalue = 0;

    let isMobile = location.hostname == "m.youtube.com"; let isShorts = () => location.pathname.startsWith("/shorts"); let mobileDislikes = 0; function cLog(text, subtext = "") { subtext = subtext.trim() === "" ? "" : (${subtext}); console.log([Return YouTube Dislikes] ${text} ${subtext}); }

    function isInViewport(element) { const rect = element.getBoundingClientRect(); const height = innerHeight || document.documentElement.clientHeight; const width = innerWidth || document.documentElement.clientWidth; return ( // When short (channel) is ignored, the element (like/dislike AND short itself) is // hidden with a 0 DOMRect. In this case, consider it outside of Viewport !(rect.top == 0 && rect.left == 0 && rect.bottom == 0 && rect.right == 0) && rect.top >= 0 && rect.left >= 0 && rect.bottom <= height && rect.right <= width ); }

    function getButtons() { if (isShorts()) { let elements = document.querySelectorAll( isMobile ? "ytm-like-button-renderer" : "#like-button > ytd-like-button-renderer" ); for (let element of elements) { if (isInViewport(element)) { return element; } } } if (isMobile) { return document.querySelector(".slim-video-action-bar-actions"); } if (document.getElementById("menu-container")?.offsetParent === null) { return document.querySelector("ytd-menu-renderer.ytd-watch-metadata > div"); } else { return document .getElementById("menu-container") ?.querySelector("#top-level-buttons-computed"); } }

    function getLikeButton() { return getButtons().children[0]; }

    function getLikeTextContainer() { return ( getLikeButton().querySelector("#text") ?? getLikeButton().getElementsByTagName("yt-formatted-string")[0] ?? getLikeButton().querySelector("span[role='text']") ); }

    function getDislikeButton() { return getButtons().children[1]; }

    function getDislikeTextContainer() { return ( getDislikeButton().querySelector("#text") ?? getDislikeButton().getElementsByTagName("yt-formatted-string")[0] ); }

    let mutationObserver = new Object();

    if (isShorts() && mutationObserver.exists !== true) { cLog("initializing mutation observer"); mutationObserver.options = { childList: false, attributes: true, subtree: false, }; mutationObserver.exists = true; mutationObserver.observer = new MutationObserver(function ( mutationList, observer ) { mutationList.forEach((mutation) => { if ( mutation.type === "attributes" && mutation.target.nodeName === "TP-YT-PAPER-BUTTON" && mutation.target.id === "button" ) { cLog("Short thumb button status changed"); if (mutation.target.getAttribute("aria-pressed") === "true") { mutation.target.style.color = mutation.target.parentElement.parentElement.id === "like-button" ? getColorFromTheme(true) : getColorFromTheme(false); } else { mutation.target.style.color = "unset"; } return; } cLog( "unexpected mutation observer event: " + mutation.target + mutation.type ); }); }); }

    function isVideoLiked() { if (isMobile) { return ( getLikeButton().querySelector("button").getAttribute("aria-label") == "true" ); } return getLikeButton().classList.contains("style-default-active"); }

    function isVideoDisliked() { if (isMobile) { return ( getDislikeButton().querySelector("button").getAttribute("aria-label") == "true" ); } return getDislikeButton().classList.contains("style-default-active"); }

    function isVideoNotLiked() { if (isMobile) { return !isVideoLiked(); } return getLikeButton().classList.contains("style-text"); }

    function isVideoNotDisliked() { if (isMobile) { return !isVideoDisliked(); } return getDislikeButton().classList.contains("style-text"); }

    function checkForUserAvatarButton() { if (isMobile) { return; } if (document.querySelector("#avatar-btn")) { return true; } else { return false; } }

    function getState() { if (isVideoLiked()) { return LIKED_STATE; } if (isVideoDisliked()) { return DISLIKED_STATE; } return NEUTRAL_STATE; }

    function setLikes(likesCount) { if (isMobile) { getButtons().children[0].querySelector(".button-renderer-text").innerText = likesCount; return; } getLikeTextContainer().innerText = likesCount; }

    function setDislikes(dislikesCount) { if (isMobile) { mobileDislikes = dislikesCount; return; } getDislikeTextContainer()?.removeAttribute('is-empty'); getDislikeTextContainer().innerText = dislikesCount; }

    function getLikeCountFromButton() { try { if (isShorts()) { //Youtube Shorts don't work with this query. It's not necessary; we can skip it and still see the results. //It should be possible to fix this function, but it's not critical to showing the dislike count. return false; } let likeButton = getLikeButton() .querySelector("yt-formatted-string#text") ?? getLikeButton().querySelector("button");

    let likesStr = likeButton.getAttribute("aria-label")
    .replace(/\D/g, "");
    return likesStr.length > 0 ? parseInt(likesStr) : false;
    

    } catch { return false; }

    }

    (typeof GM_addStyle != "undefined" ? GM_addStyle : (styles) => { let styleNode = document.createElement("style"); styleNode.type = "text/css"; styleNode.innerText = styles; document.head.appendChild(styleNode); })(` #return-youtube-dislike-bar-container { background: var(--yt-spec-icon-disabled); border-radius: 2px; }

    #return-youtube-dislike-bar {
      background: var(--yt-spec-text-primary);
      border-radius: 2px;
      transition: all 0.15s ease-in-out;
    }
    
    .ryd-tooltip {
      position: relative;
      display: block;
      height: 2px;
      top: 9px;
    }
    
    .ryd-tooltip-bar-container {
      width: 100%;
      height: 2px;
      position: absolute;
      padding-top: 6px;
      padding-bottom: 28px;
      top: -6px;
    }
    

    `);

    function createRateBar(likes, dislikes) { if (isMobile) { return; } let rateBar = document.getElementById("return-youtube-dislike-bar-container");

    const widthPx = getButtons().children[0].clientWidth + getButtons().children[1].clientWidth + 8;

    const widthPercent = likes + dislikes > 0 ? (likes / (likes + dislikes)) * 100 : 50;

    var likePercentage = parseFloat(widthPercent.toFixed(1)); const dislikePercentage = (100 - likePercentage).toLocaleString(); likePercentage = likePercentage.toLocaleString();

    var tooltipInnerHTML; switch (extConfig.tooltipPercentageMode) { case "dash_like": tooltipInnerHTML = ${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}&nbsp;&nbsp;-&nbsp;&nbsp;${likePercentage}%; break; case "dash_dislike": tooltipInnerHTML = ${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}&nbsp;&nbsp;-&nbsp;&nbsp;${dislikePercentage}%; break; case "both": tooltipInnerHTML = ${likePercentage}%&nbsp;/&nbsp;${dislikePercentage}%; break; case "only_like": tooltipInnerHTML = ${likePercentage}%; break; case "only_dislike": tooltipInnerHTML = ${dislikePercentage}%; break; default: tooltipInnerHTML = ${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}; }

    if (!rateBar && !isMobile) { let colorLikeStyle = ""; let colorDislikeStyle = ""; if (extConfig.coloredBar) { colorLikeStyle = "; background-color: " + getColorFromTheme(true); colorDislikeStyle = "; background-color: " + getColorFromTheme(false); }

    document.getElementById("menu-container").insertAdjacentHTML(
      "beforeend",
      `
        <div class="ryd-tooltip" style="width: ${widthPx}px">
        <div class="ryd-tooltip-bar-container">
           <div
              id="return-youtube-dislike-bar-container"
              style="width: 100%; height: 2px;${colorDislikeStyle}"
              >
              <div
                 id="return-youtube-dislike-bar"
                 style="width: ${widthPercent}%; height: 100%${colorDislikeStyle}"
                 ></div>
           </div>
        </div>
        <tp-yt-paper-tooltip position="top" id="ryd-dislike-tooltip" class="style-scope ytd-sentiment-bar-renderer" role="tooltip" tabindex="-1">
           <!--css-build:shady-->${tooltipInnerHTML}
        </tp-yt-paper-tooltip>
        </div>
    

    ` ); } else { document.getElementById( "return-youtube-dislike-bar-container" ).style.width = widthPx + "px"; document.getElementById("return-youtube-dislike-bar").style.width = widthPercent + "%";

    document.querySelector("#ryd-dislike-tooltip > #tooltip").innerHTML =
      tooltipInnerHTML;
    
    if (extConfig.coloredBar) {
      document.getElementById(
        "return-youtube-dislike-bar-container"
      ).style.backgroundColor = getColorFromTheme(false);
      document.getElementById(
        "return-youtube-dislike-bar"
      ).style.backgroundColor = getColorFromTheme(true);
    }
    

    } }

    function setState() { cLog("Fetching votes..."); let statsSet = false;

    fetch( https://returnyoutubedislikeapi.com/votes?videoId=${getVideoId()} ).then((response) => { response.json().then((json) => { if (json && !("traceId" in response) && !statsSet) { const { dislikes, likes } = json; cLog(Received count: ${dislikes}); likesvalue = likes; dislikesvalue = dislikes; setDislikes(numberFormat(dislikes)); if (extConfig.numberDisplayReformatLikes === true) { const nativeLikes = getLikeCountFromButton(); if (nativeLikes !== false) { setLikes(numberFormat(nativeLikes)); } } createRateBar(likes, dislikes); if (extConfig.coloredThumbs === true) { if (isShorts()) { // for shorts, leave deactived buttons in default color let shortLikeButton = getLikeButton().querySelector( "tp-yt-paper-button#button" ); let shortDislikeButton = getDislikeButton().querySelector( "tp-yt-paper-button#button" ); if (shortLikeButton.getAttribute("aria-pressed") === "true") { shortLikeButton.style.color = getColorFromTheme(true); } if (shortDislikeButton.getAttribute("aria-pressed") === "true") { shortDislikeButton.style.color = getColorFromTheme(false); } mutationObserver.observer.observe( shortLikeButton, mutationObserver.options ); mutationObserver.observer.observe( shortDislikeButton, mutationObserver.options ); } else { getLikeButton().style.color = getColorFromTheme(true); getDislikeButton().style.color = getColorFromTheme(false); } } } }); }); }

    function likeClicked() { if (checkForUserAvatarButton() == true) { if (previousState == 1) { likesvalue--; createRateBar(likesvalue, dislikesvalue); setDislikes(numberFormat(dislikesvalue)); previousState = 3; } else if (previousState == 2) { likesvalue++; dislikesvalue--; setDislikes(numberFormat(dislikesvalue)); createRateBar(likesvalue, dislikesvalue); previousState = 1; } else if (previousState == 3) { likesvalue++; createRateBar(likesvalue, dislikesvalue); previousState = 1; } if (extConfig.numberDisplayReformatLikes === true) { const nativeLikes = getLikeCountFromButton(); if (nativeLikes !== false) { setLikes(numberFormat(nativeLikes)); } } } }

    function dislikeClicked() { if (checkForUserAvatarButton() == true) { if (previousState == 3) { dislikesvalue++; setDislikes(numberFormat(dislikesvalue)); createRateBar(likesvalue, dislikesvalue); previousState = 2; } else if (previousState == 2) { dislikesvalue--; setDislikes(numberFormat(dislikesvalue)); createRateBar(likesvalue, dislikesvalue); previousState = 3; } else if (previousState == 1) { likesvalue--; dislikesvalue++; setDislikes(numberFormat(dislikesvalue)); createRateBar(likesvalue, dislikesvalue); previousState = 2; if (extConfig.numberDisplayReformatLikes === true) { const nativeLikes = getLikeCountFromButton(); if (nativeLikes !== false) { setLikes(numberFormat(nativeLikes)); } } } } }

    function setInitialState() { setState(); }

    function getVideoId() { const urlObject = new URL(window.location.href); const pathname = urlObject.pathname; if (pathname.startsWith("/clip")) { return document.querySelector("meta[itemprop='videoId']").content; } else { if (pathname.startsWith("/shorts")) { return pathname.slice(8); } return urlObject.searchParams.get("v"); } }

    function isVideoLoaded() { if (isMobile) { return document.getElementById("player").getAttribute("loading") == "false"; } const videoId = getVideoId();

    return ( document.querySelector(ytd-watch-flexy[video-id='${videoId}']) !== null ); }

    function roundDown(num) { if (num < 1000) return num; const int = Math.floor(Math.log10(num) - 2); const decimal = int + (int % 3 ? 1 : 0); const value = Math.floor(num / 10 ** decimal); return value * 10 ** decimal; }

    function numberFormat(numberState) { let numberDisplay; if (extConfig.numberDisplayRoundDown === false) { numberDisplay = numberState; } else { numberDisplay = roundDown(numberState); } return getNumberFormatter(extConfig.numberDisplayFormat).format( numberDisplay ); }

    function getNumberFormatter(optionSelect) { let userLocales; if (document.documentElement.lang) { userLocales = document.documentElement.lang; } else if (navigator.language) { userLocales = navigator.language; } else { try { userLocales = new URL( Array.from(document.querySelectorAll("head > link[rel='search']")) ?.find((n) => n?.getAttribute("href")?.includes("?locale=")) ?.getAttribute("href") )?.searchParams?.get("locale"); } catch { cLog( "Cannot find browser locale. Use en as default for number formatting." ); userLocales = "en"; } }

    let formatterNotation; let formatterCompactDisplay; switch (optionSelect) { case "compactLong": formatterNotation = "compact"; formatterCompactDisplay = "long"; break; case "standard": formatterNotation = "standard"; formatterCompactDisplay = "short"; break; case "compactShort": default: formatterNotation = "compact"; formatterCompactDisplay = "short"; }

    const formatter = Intl.NumberFormat(userLocales, { notation: formatterNotation, compactDisplay: formatterCompactDisplay, }); return formatter; }

    function getColorFromTheme(voteIsLike) { let colorString; switch (extConfig.colorTheme) { case "accessible": if (voteIsLike === true) { colorString = "dodgerblue"; } else { colorString = "gold"; } break; case "neon": if (voteIsLike === true) { colorString = "aqua"; } else { colorString = "magenta"; } break; case "classic": default: if (voteIsLike === true) { colorString = "lime"; } else { colorString = "red"; } } return colorString; }

    function setEventListeners(evt) { let jsInitChecktimer;

    function checkForJS_Finish() { console.log(); if (isShorts() || (getButtons()?.offsetParent && isVideoLoaded())) { const buttons = getButtons();

      if (!window.returnDislikeButtonlistenersSet) {
        cLog("Registering button listeners...");
        try {
          buttons.children[0].addEventListener("click", likeClicked);
          buttons.children[1].addEventListener("click", dislikeClicked);
          buttons.children[0].addEventListener("touchstart", likeClicked);
          buttons.children[1].addEventListener("touchstart", dislikeClicked);
        } catch {
          return;
        } //Don't spam errors into the console
        window.returnDislikeButtonlistenersSet = true;
      }
      setInitialState();
      clearInterval(jsInitChecktimer);
    }
    

    }

    cLog("Setting up..."); jsInitChecktimer = setInterval(checkForJS_Finish, 111); }

    (function () { "use strict"; window.addEventListener("yt-navigate-finish", setEventListeners, true); setEventListeners(); })(); if (isMobile) { let originalPush = history.pushState; history.pushState = function (...args) { window.returnDislikeButtonlistenersSet = false; setEventListeners(args[2]); return originalPush.apply(history, args); }; setInterval(() => { getDislikeButton().querySelector(".button-renderer-text").innerText = mobileDislikes; }, 1000); }

    Source page

    https://www.returnyoutubedislike.com/

    embed script request 
    opened by ghost 0
  • Comments in user script being removed

    Comments in user script being removed

    This is really strange. Comments in my script seem to be getting removed. For example:

    // test1
    /* test2 */
    let s = `"use strict";
    // test3
    /* test4 */
    foo();
    `;
    
    console.log(s);
    

    This prints:

    "use strict"
    /* test4 */
    foo();
    

    The string "s" is missing the "// test3" line, and viewing it in the debugger, "// test1" is also missing.

    This makes debugging harder (my comments are missing), and it breaks console logs and many debugger features since it strips out my sourceURLs. Any idea what's happening?

    (iPhone 14, iOS 16.1, version 2.3.4)

    bug report 
    opened by ppixiv 1
  • [Bug] TwitchAdSolutions (vaft) userscript not working

    [Bug] TwitchAdSolutions (vaft) userscript not working

    This userscript, TwitchAdSolutions (vaft), does not work with the Stay extension but it works with a different userscript extension. It is a userscript that blocks ads on Twitch.tv. If you can make this userscript work, that would great. Thank you

    Source link: https://raw.githubusercontent.com/pixeltris/TwitchAdSolutions/master/vaft/vaft.user.js

    compatible 
    opened by korboybeats 2
Releases(v2.1.0)
  • v2.1.0(Jun 1, 2022)

    • 【特性】: 新的资料库UI和脚本广场Tab
    • 【特性】: 手动更新脚本
    • 【特性】: 从Safari安装脚本
    • 【特性】: 优化脚本匹配和性能
    Source code(tar.gz)
    Source code(zip)
  • v2.0.6(Apr 28, 2022)

    • [特性]:支持导入脚本文件。
    • [特性]:支持GM_unregisterCommandMenu。
    • [修复]:unsafeWindow情况下部分脚本运行异常。
    • [修复]:部分脚本匹配异常。
    • [特性]:支持更多的脚本。
    Source code(tar.gz)
    Source code(zip)
  • v2.0.4(Apr 6, 2022)

  • v2.0.3(Mar 29, 2022)

    • [特性]:支持GM./GM_getResourceURL
    • [特性]:支持GM./GM_getResourceText
    • [特性]:支持GM./GM_xmlhttpRejuest
    • [特性]:支持GM./GM_openInTab
    • [特性]:支持GM_info
    • [特性]:支持Meta block resource
    • [特性]:支持Meta block require
    • [特性]:支持Meta block icon
    • [特性]:支持Meta block note
    Source code(tar.gz)
    Source code(zip)
  • v2.0.2(Jan 31, 2022)

  • v2.0.1(Jan 8, 2022)

  • v2.0.0(Jan 1, 2022)

  • v1.0.3(Nov 26, 2021)

  • v1.0.2(Nov 10, 2021)

    • [功能] 支持zhihu桌面浏览模式。
    • [新网站] google.com。
    • [新网站] 新浪新闻(news.sina.cn)。
    • [新网站] 腾讯新闻( xw.qq.com)。
    • [优化] 贴吧浏览体验。
    Source code(tar.gz)
    Source code(zip)
Gesture Control for Safari on iOS and iPadOS

Svadilfari Svadilfari brings Gesture Control for Safari on iPhone/iPad. Features Control Safari with Gestures 10+ Customizable Actions Select Patterns

Shun Kashiwa 52 Dec 13, 2022
iOS Safari extension for forwarding away from AMP websites

iOS Safari extension for forwarding away from AMP websites

Eric Jacobsen 0 Oct 12, 2022
An iOS app/Safari extension to automagically redirect AMP links to their normal counterpart. Comes with a trusty dog.

Amplosion ⚡️ Amplosion is an iOS 15 and greater app that automagically redirects AMP links to their normal counterpart. AMP links can be super annoyin

Michael Pauley 31 Nov 20, 2022
A Hello World safari iOS extension

Hello_world_extension This is a Hello World chrome/ios_safari extension. How it works: When we click on the extension, it pop up a textarea prompt. In

Monika Kumari 0 Nov 18, 2021
Free and open source manga reader for iOS and iPadOS.

Aidoku A free and open source manga reading application for iOS and iPadOS. Features Ad free Robust WASM source system Online reading through external

null 421 Jan 2, 2023
An IPFS client/api Swift Package, with the ability to add and pin any data on iOS/iPadOS/macOS

An IPFS client/api Swift Package, with the ability to add and pin any data on iOS/iPadOS/macOS. Originally bundled with GraniteUI, pulled out for independant use by any party.

Kala 4 Dec 8, 2022
Tofu - A simple Todo app built with SwiftUI, a REST API, and a local Realm cache

Tofu A simple Todo app built with SwiftUI, a REST API, and a local Realm cache.

Brianna Zamora 1 Feb 23, 2022
ConfettiKit is a custom framework used to add Confetti on your iOS/iPadOS projects.

ConfettiKit is a custom framework used to add Confetti on your iOS/iPadOS projects. The kit provides variety of customisations inorder to design a confetti which matches your project's UI. ConfettiKit makes your work of adding Confetti on your project with just one line of code.

Gokul Nair 14 Sep 27, 2022
a playground app using `MultipeerConnectivity` to transfor data wirelessly between iOS / iPadOS

README An example app using MultipeerConnectivity to transfor data wirelessly between iOS / iPadOS. Both using Data and Stream to transfer data are su

null 3 Aug 6, 2022
Multiple Arcade Machine Emulator for iOS, iPadOS, tvOS, macOS (Catalyst)

MAME4iOS Original Author: David Valdeita (Seleuco) This is a port of MAME for iOS, iPadOS, tvOS and macOS. MAME4iOS is designed to run for modern iOS

null 438 Jan 4, 2023
A simple project that shows a list of local coffee shop reviews

Project This is a simple project that shows a list of local coffee shop reviews Details Please use git and commit often with meaningful commit message

null 0 Oct 16, 2021
Respresso is a centralized resource manager for shared Android, iOS and Web frontend projects

Introduction Respresso is a centralized resource manager for shared Android, iOS and Web frontend projects. It allows you to simply import the latest

Respresso 10 Nov 8, 2022
Kotlin Multiplatform sample with SwiftUI and Compose (Desktop and Android) clients. Heavily inspired by Wordle game.

WordMasterKMP Kotlin Multiplatform sample heavily inspired by Wordle game and also Word Master and wordle-solver samples. The main game logic/state is

John O'Reilly 56 Oct 4, 2022
Manager the window of the mac.

WindowManager For developping WindowManager please clone the repostority. For cloing

Md Ruman Islam 2 Feb 20, 2022
macOS SwiftUI manager new window's life

WindowManager macOS swiftUI manager window's life cycle Usage // open DocumentsView WindowUtil.makeWindow(MyDocumentsView.self, viewType: .document)

Daniel 4 Oct 26, 2022
GraphQL based Jetpack Compose, Wear Compose and SwiftUI Kotlin Multiplatform sample

GraphQL based Jetpack Compose, Wear Compose and SwiftUI Kotlin Multiplatform sample

John O'Reilly 151 Jan 3, 2023
Sample iOS integration project

Sample integration of SweeprMobile SDK To quickly build the app: Fill-in the URLs and passwords inside env-default file Generate BuildConfig.swift bas

null 0 Jan 7, 2022
A sample app demonstrates how to use Atlantis on Swift Playground (iOS/macOS)

Atlantis with Swift Playground A sample app demonstrates how to use Atlantis on

Proxyman 3 Dec 22, 2021
A sample app that implements MVVM architecture using Swift, ViewModel, Alamofire

MVVM Architecture Android: Template This repository contains a sample app that implements MVVM architecture using Swift, ViewModel, Alamofire, and etc

null 0 Oct 19, 2021