Iwara Download Tool

Download videos from iwara.tv

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name              Iwara Download Tool
// @description       Download videos from iwara.tv
// @name:ja           Iwara バッチダウンローダー
// @description:ja    Iwara 動画バッチをダウンロード
// @name:zh-CN        Iwara 批量下载工具
// @description:zh-CN 批量下载 Iwara 视频
// @icon              https://www.google.com/s2/favicons?sz=64&domain=iwara.tv
// @namespace         https://github.com/dawn-lc/
// @author            dawn-lc
// @license           Apache-2.0
// @copyright         2025, Dawnlc (https://dawnlc.me/)
// @source            https://github.com/dawn-lc/IwaraDownloadTool
// @supportURL        https://github.com/dawn-lc/IwaraDownloadTool/issues
// @connect           iwara.tv
// @connect           *.iwara.*
// @connect           mmdfans.net
// @connect           *.mmdfans.net
// @connect           localhost
// @connect           127.0.0.1
// @connect           *
// @include           *://*.iwara.*/*
// @grant             GM_getValue
// @grant             GM_setValue
// @grant             GM_listValues
// @grant             GM_deleteValue
// @grant             GM_addValueChangeListener
// @grant             GM_addStyle
// @grant             GM_setClipboard
// @grant             GM_download
// @grant             GM_xmlhttpRequest
// @grant             GM_openInTab
// @grant             GM_info
// @grant             unsafeWindow
// @grant             window.close
// @run-at            document-start
// @version           3.3.62
// ==/UserScript==
"use strict";
(() => {
  var __create = Object.create;
  var __defProp = Object.defineProperty;
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
  var __getOwnPropNames = Object.getOwnPropertyNames;
  var __getProtoOf = Object.getPrototypeOf;
  var __hasOwnProp = Object.prototype.hasOwnProperty;
  var __commonJS = (cb, mod) => function __require() {
    return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
  };
  var __copyProps = (to, from, except, desc) => {
    if (from && typeof from === "object" || typeof from === "function") {
      for (let key of __getOwnPropNames(from))
        if (!__hasOwnProp.call(to, key) && key !== except)
          __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
    }
    return to;
  };
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
    isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
    mod
  ));
  var require_dayjs_min = __commonJS({
    "node_modules/dayjs/dayjs.min.js"(exports, module) {
      "use strict";
      (function(T2, g4) {
        typeof exports == "object" && typeof module < "u" ? module.exports = g4() : typeof define == "function" && define.amd ? define(g4) : (T2 = typeof globalThis < "u" ? globalThis : T2 || self).dayjs = g4();
      })(exports, (function() {
        "use strict";
        var T2 = 1e3, g4 = 6e4, U = 36e5, A2 = "millisecond", w2 = "second", O2 = "minute", b2 = "hour", M2 = "day", L2 = "week", m2 = "month", F2 = "quarter", y2 = "year", _ = "date", J = "Invalid Date", V2 = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/, q = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g, B2 = { name: "en", weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), months: "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), ordinal: function(i3) {
          var n5 = ["th", "st", "nd", "rd"], t2 = i3 % 100;
          return "[" + i3 + (n5[(t2 - 20) % 10] || n5[t2] || n5[0]) + "]";
        } }, I2 = function(i3, n5, t2) {
          var r2 = String(i3);
          return !r2 || r2.length >= n5 ? i3 : "" + Array(n5 + 1 - r2.length).join(t2) + i3;
        }, E2 = { s: I2, z: function(i3) {
          var n5 = -i3.utcOffset(), t2 = Math.abs(n5), r2 = Math.floor(t2 / 60), e = t2 % 60;
          return (n5 <= 0 ? "+" : "-") + I2(r2, 2, "0") + ":" + I2(e, 2, "0");
        }, m: function i3(n5, t2) {
          if (n5.date() < t2.date()) return -i3(t2, n5);
          var r2 = 12 * (t2.year() - n5.year()) + (t2.month() - n5.month()), e = n5.clone().add(r2, m2), s = t2 - e < 0, u3 = n5.clone().add(r2 + (s ? -1 : 1), m2);
          return +(-(r2 + (t2 - e) / (s ? e - u3 : u3 - e)) || 0);
        }, a: function(i3) {
          return i3 < 0 ? Math.ceil(i3) || 0 : Math.floor(i3);
        }, p: function(i3) {
          return { M: m2, y: y2, w: L2, d: M2, D: _, h: b2, m: O2, s: w2, ms: A2, Q: F2 }[i3] || String(i3 || "").toLowerCase().replace(/s$/, "");
        }, u: function(i3) {
          return i3 === void 0;
        } }, Y = "en", D2 = {};
        D2[Y] = B2;
        var Z = "$isDayjsObject", N = function(i3) {
          return i3 instanceof C2 || !(!i3 || !i3[Z]);
        }, W2 = function i3(n5, t2, r2) {
          var e;
          if (!n5) return Y;
          if (typeof n5 == "string") {
            var s = n5.toLowerCase();
            D2[s] && (e = s), t2 && (D2[s] = t2, e = s);
            var u3 = n5.split("-");
            if (!e && u3.length > 1) return i3(u3[0]);
          } else {
            var o = n5.name;
            D2[o] = n5, e = o;
          }
          return !r2 && e && (Y = e), e || !r2 && Y;
        }, f2 = function(i3, n5) {
          if (N(i3)) return i3.clone();
          var t2 = typeof n5 == "object" ? n5 : {};
          return t2.date = i3, t2.args = arguments, new C2(t2);
        }, a3 = E2;
        a3.l = W2, a3.i = N, a3.w = function(i3, n5) {
          return f2(i3, { locale: n5.$L, utc: n5.$u, x: n5.$x, $offset: n5.$offset });
        };
        var C2 = (function() {
          function i3(t2) {
            this.$L = W2(t2.locale, null, true), this.parse(t2), this.$x = this.$x || t2.x || {}, this[Z] = true;
          }
          var n5 = i3.prototype;
          return n5.parse = function(t2) {
            this.$d = (function(r2) {
              var e = r2.date, s = r2.utc;
              if (e === null) return new Date(NaN);
              if (a3.u(e)) return new Date();
              if (e instanceof Date) return new Date(e);
              if (typeof e == "string" && !/Z$/i.test(e)) {
                var u3 = e.match(V2);
                if (u3) {
                  var o = u3[2] - 1 || 0, c2 = (u3[7] || "0").substring(0, 3);
                  return s ? new Date(Date.UTC(u3[1], o, u3[3] || 1, u3[4] || 0, u3[5] || 0, u3[6] || 0, c2)) : new Date(u3[1], o, u3[3] || 1, u3[4] || 0, u3[5] || 0, u3[6] || 0, c2);
                }
              }
              return new Date(e);
            })(t2), this.init();
          }, n5.init = function() {
            var t2 = this.$d;
            this.$y = t2.getFullYear(), this.$M = t2.getMonth(), this.$D = t2.getDate(), this.$W = t2.getDay(), this.$H = t2.getHours(), this.$m = t2.getMinutes(), this.$s = t2.getSeconds(), this.$ms = t2.getMilliseconds();
          }, n5.$utils = function() {
            return a3;
          }, n5.isValid = function() {
            return this.$d.toString() !== J;
          }, n5.isSame = function(t2, r2) {
            var e = f2(t2);
            return this.startOf(r2) <= e && e <= this.endOf(r2);
          }, n5.isAfter = function(t2, r2) {
            return f2(t2) < this.startOf(r2);
          }, n5.isBefore = function(t2, r2) {
            return this.endOf(r2) < f2(t2);
          }, n5.$g = function(t2, r2, e) {
            return a3.u(t2) ? this[r2] : this.set(e, t2);
          }, n5.unix = function() {
            return Math.floor(this.valueOf() / 1e3);
          }, n5.valueOf = function() {
            return this.$d.getTime();
          }, n5.startOf = function(t2, r2) {
            var e = this, s = !!a3.u(r2) || r2, u3 = a3.p(t2), o = function(S2, $) {
              var v2 = a3.w(e.$u ? Date.UTC(e.$y, $, S2) : new Date(e.$y, $, S2), e);
              return s ? v2 : v2.endOf(M2);
            }, c2 = function(S2, $) {
              return a3.w(e.toDate()[S2].apply(e.toDate("s"), (s ? [0, 0, 0, 0] : [23, 59, 59, 999]).slice($)), e);
            }, h2 = this.$W, d = this.$M, l2 = this.$D, k2 = "set" + (this.$u ? "UTC" : "");
            switch (u3) {
              case y2:
                return s ? o(1, 0) : o(31, 11);
              case m2:
                return s ? o(1, d) : o(0, d + 1);
              case L2:
                var p3 = this.$locale().weekStart || 0, H = (h2 < p3 ? h2 + 7 : h2) - p3;
                return o(s ? l2 - H : l2 + (6 - H), d);
              case M2:
              case _:
                return c2(k2 + "Hours", 0);
              case b2:
                return c2(k2 + "Minutes", 1);
              case O2:
                return c2(k2 + "Seconds", 2);
              case w2:
                return c2(k2 + "Milliseconds", 3);
              default:
                return this.clone();
            }
          }, n5.endOf = function(t2) {
            return this.startOf(t2, false);
          }, n5.$set = function(t2, r2) {
            var e, s = a3.p(t2), u3 = "set" + (this.$u ? "UTC" : ""), o = (e = {}, e[M2] = u3 + "Date", e[_] = u3 + "Date", e[m2] = u3 + "Month", e[y2] = u3 + "FullYear", e[b2] = u3 + "Hours", e[O2] = u3 + "Minutes", e[w2] = u3 + "Seconds", e[A2] = u3 + "Milliseconds", e)[s], c2 = s === M2 ? this.$D + (r2 - this.$W) : r2;
            if (s === m2 || s === y2) {
              var h2 = this.clone().set(_, 1);
              h2.$d[o](c2), h2.init(), this.$d = h2.set(_, Math.min(this.$D, h2.daysInMonth())).$d;
            } else o && this.$d[o](c2);
            return this.init(), this;
          }, n5.set = function(t2, r2) {
            return this.clone().$set(t2, r2);
          }, n5.get = function(t2) {
            return this[a3.p(t2)]();
          }, n5.add = function(t2, r2) {
            var e, s = this;
            t2 = Number(t2);
            var u3 = a3.p(r2), o = function(d) {
              var l2 = f2(s);
              return a3.w(l2.date(l2.date() + Math.round(d * t2)), s);
            };
            if (u3 === m2) return this.set(m2, this.$M + t2);
            if (u3 === y2) return this.set(y2, this.$y + t2);
            if (u3 === M2) return o(1);
            if (u3 === L2) return o(7);
            var c2 = (e = {}, e[O2] = g4, e[b2] = U, e[w2] = T2, e)[u3] || 1, h2 = this.$d.getTime() + t2 * c2;
            return a3.w(h2, this);
          }, n5.subtract = function(t2, r2) {
            return this.add(-1 * t2, r2);
          }, n5.format = function(t2) {
            var r2 = this, e = this.$locale();
            if (!this.isValid()) return e.invalidDate || J;
            var s = t2 || "YYYY-MM-DDTHH:mm:ssZ", u3 = a3.z(this), o = this.$H, c2 = this.$m, h2 = this.$M, d = e.weekdays, l2 = e.months, k2 = e.meridiem, p3 = function($, v2, x2, j2) {
              return $ && ($[v2] || $(r2, s)) || x2[v2].slice(0, j2);
            }, H = function($) {
              return a3.s(o % 12 || 12, $, "0");
            }, S2 = k2 || function($, v2, x2) {
              var j2 = $ < 12 ? "AM" : "PM";
              return x2 ? j2.toLowerCase() : j2;
            };
            return s.replace(q, (function($, v2) {
              return v2 || (function(x2) {
                switch (x2) {
                  case "YY":
                    return String(r2.$y).slice(-2);
                  case "YYYY":
                    return a3.s(r2.$y, 4, "0");
                  case "M":
                    return h2 + 1;
                  case "MM":
                    return a3.s(h2 + 1, 2, "0");
                  case "MMM":
                    return p3(e.monthsShort, h2, l2, 3);
                  case "MMMM":
                    return p3(l2, h2);
                  case "D":
                    return r2.$D;
                  case "DD":
                    return a3.s(r2.$D, 2, "0");
                  case "d":
                    return String(r2.$W);
                  case "dd":
                    return p3(e.weekdaysMin, r2.$W, d, 2);
                  case "ddd":
                    return p3(e.weekdaysShort, r2.$W, d, 3);
                  case "dddd":
                    return d[r2.$W];
                  case "H":
                    return String(o);
                  case "HH":
                    return a3.s(o, 2, "0");
                  case "h":
                    return H(1);
                  case "hh":
                    return H(2);
                  case "a":
                    return S2(o, c2, true);
                  case "A":
                    return S2(o, c2, false);
                  case "m":
                    return String(c2);
                  case "mm":
                    return a3.s(c2, 2, "0");
                  case "s":
                    return String(r2.$s);
                  case "ss":
                    return a3.s(r2.$s, 2, "0");
                  case "SSS":
                    return a3.s(r2.$ms, 3, "0");
                  case "Z":
                    return u3;
                }
                return null;
              })($) || u3.replace(":", "");
            }));
          }, n5.utcOffset = function() {
            return 15 * -Math.round(this.$d.getTimezoneOffset() / 15);
          }, n5.diff = function(t2, r2, e) {
            var s, u3 = this, o = a3.p(r2), c2 = f2(t2), h2 = (c2.utcOffset() - this.utcOffset()) * g4, d = this - c2, l2 = function() {
              return a3.m(u3, c2);
            };
            switch (o) {
              case y2:
                s = l2() / 12;
                break;
              case m2:
                s = l2();
                break;
              case F2:
                s = l2() / 3;
                break;
              case L2:
                s = (d - h2) / 6048e5;
                break;
              case M2:
                s = (d - h2) / 864e5;
                break;
              case b2:
                s = d / U;
                break;
              case O2:
                s = d / g4;
                break;
              case w2:
                s = d / T2;
                break;
              default:
                s = d;
            }
            return e ? s : a3.a(s);
          }, n5.daysInMonth = function() {
            return this.endOf(m2).$D;
          }, n5.$locale = function() {
            return D2[this.$L];
          }, n5.locale = function(t2, r2) {
            if (!t2) return this.$L;
            var e = this.clone(), s = W2(t2, r2, true);
            return s && (e.$L = s), e;
          }, n5.clone = function() {
            return a3.w(this.$d, this);
          }, n5.toDate = function() {
            return new Date(this.valueOf());
          }, n5.toJSON = function() {
            return this.isValid() ? this.toISOString() : null;
          }, n5.toISOString = function() {
            return this.$d.toISOString();
          }, n5.toString = function() {
            return this.$d.toUTCString();
          }, i3;
        })(), z = C2.prototype;
        return f2.prototype = z, [["$ms", A2], ["$s", w2], ["$m", O2], ["$H", b2], ["$W", M2], ["$M", m2], ["$y", y2], ["$D", _]].forEach((function(i3) {
          z[i3[1]] = function(n5) {
            return this.$g(n5, i3[0], i3[1]);
          };
        })), f2.extend = function(i3, n5) {
          return i3.$i || (i3(n5, C2, f2), i3.$i = true), f2;
        }, f2.locale = W2, f2.isDayjs = N, f2.unix = function(i3) {
          return f2(1e3 * i3);
        }, f2.en = D2[Y], f2.Ls = D2, f2.p = {}, f2;
      }));
    }
  });
  var ConvertibleNumber = Symbol("ConvertibleNumber");
  var PositiveInteger = Symbol("PositiveInteger");
  var NegativeInteger = Symbol("NegativeInteger");
  var PositiveFloat = Symbol("PositiveFloat");
  var NegativeFloat = Symbol("NegativeFloat");
  var emojiSeq = String.raw`(?:\p{Emoji}\uFE0F\u20E3?|\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation})`;
  var emojiSTags = String.raw`\u{E0061}-\u{E007A}`;
  var emojiRegex = new RegExp(String.raw`[\u{1F1E6}-\u{1F1FF}]{2}|\u{1F3F4}[${emojiSTags}]{2}[\u{E0030}-\u{E0039}${emojiSTags}]{1,3}\u{E007F}|${emojiSeq}(?:\u200D${emojiSeq})*`, "gu");
  var isNull = (obj) => obj === null;
  var isUndefined = (obj) => typeof obj === "undefined";
  var isNullOrUndefined = (obj) => isUndefined(obj) || isNull(obj);
  var isObject = (obj) => !isNullOrUndefined(obj) && typeof obj === "object" && !Array.isArray(obj);
  var isString = (obj) => !isNullOrUndefined(obj) && typeof obj === "string";
  var isNumber = (obj) => !isNullOrUndefined(obj) && typeof obj === "number";
  var isArray = (obj) => Array.isArray(obj);
  var isElement = (obj) => !isNullOrUndefined(obj) && obj instanceof Element;
  var isNode = (obj) => !isNullOrUndefined(obj) && obj instanceof Node;
  var isNotEmpty = (obj) => {
    if (isNullOrUndefined(obj)) {
      return false;
    }
    if (Array.isArray(obj)) {
      return obj.some(isNotEmpty);
    }
    if (isString(obj)) {
      return !obj.isEmpty();
    }
    if (isNumber(obj)) {
      return !Number.isNaN(obj);
    }
    if (isElement(obj) || isNode(obj)) {
      return true;
    }
    if (isObject(obj)) {
      return Object.values(obj).some(isNotEmpty);
    }
    return true;
  };
  var isVideoInfo = (obj) => {
    if (obj === null || typeof obj !== "object") return false;
    const info = obj;
    return isInitVideoInfo(info) || isFullVideoInfo(info) || isPartialVideoInfo(info) || isCacheVideoInfo(info) || isFailVideoInfo(info);
  };
  var hasValidID = (info) => isString(info.ID) && isNotEmpty(info.ID);
  var isInitVideoInfo = (info) => !isNullOrUndefined(info) && info.Type === "init" && hasValidID(info);
  var isFullVideoInfo = (info) => !isNullOrUndefined(info) && info.Type === "full" && hasValidID(info) && isNumber(info.UploadTime) && isString(info.Title) && isNotEmpty(info.Title) && isString(info.FileName) && isNotEmpty(info.FileName) && isNumber(info.Size) && isArray(info.Tags) && typeof info.Liked === "boolean" && typeof info.Following === "boolean" && typeof info.Friend === "boolean" && isString(info.Author) && isNotEmpty(info.Author) && isString(info.AuthorID) && isNotEmpty(info.AuthorID) && typeof info.Private === "boolean" && typeof info.Unlisted === "boolean" && isString(info.DownloadQuality) && typeof info.External === "boolean" && isString(info.DownloadUrl) && isNotEmpty(info.DownloadUrl) && isObject(info.RAW);
  var isPartialVideoInfo = (info) => !isNullOrUndefined(info) && info.Type === "partial" && hasValidID(info) && isNumber(info.UploadTime) && isString(info.Title) && isNotEmpty(info.Title) && isArray(info.Tags) && typeof info.Liked === "boolean" && isString(info.Author) && isNotEmpty(info.Author) && isString(info.AuthorID) && isNotEmpty(info.AuthorID) && typeof info.Private === "boolean" && typeof info.Unlisted === "boolean" && typeof info.External === "boolean" && isObject(info.RAW);
  var isCacheVideoInfo = (info) => !isNullOrUndefined(info) && info.Type === "cache" && hasValidID(info) && isObject(info.RAW);
  var isFailVideoInfo = (info) => !isNullOrUndefined(info) && info.Type === "fail" && hasValidID(info);
  var assertVideoInfoType = (info) => {
    switch (info.Type) {
      case "init":
        return info;
      case "full":
        return info;
      case "partial":
        return info;
      case "cache":
        return info;
      case "fail":
        return info;
      default:
        throw new Error(`未知的 VideoInfo 类型: ${info.Type}`);
    }
  };
  function isConvertibleToNumber(obj, includeInfinity = false) {
    if (isNullOrUndefined(obj)) {
      return false;
    }
    if (isString(obj)) {
      return obj.isConvertibleToNumber(includeInfinity);
    }
    if (isNumber(obj)) {
      return isNaN(obj) ? false : includeInfinity ? true : isFinite(obj);
    }
    return false;
  }
  Number.isConvertibleNumber = (value, includeInfinity = false) => {
    if (isNullOrUndefined(value)) {
      return false;
    }
    if (isString(value)) {
      return value.isConvertibleToNumber(includeInfinity);
    }
    if (isNumber(value)) {
      return isNaN(value) ? false : includeInfinity ? true : isFinite(value);
    }
    return false;
  };
  Number.isPositiveInteger = (value) => typeof value === "number" && Number.isInteger(value) && value > 0;
  Number.isNegativeInteger = (value) => typeof value === "number" && Number.isInteger(value) && value < 0;
  Number.isPositiveFloat = (value) => typeof value === "number" && !Number.isInteger(value) && value > 0;
  Number.isNegativeFloat = (value) => typeof value === "number" && !Number.isInteger(value) && value < 0;
  Number.toPositiveInteger = (value) => {
    if (!Number.isPositiveInteger(value)) {
      throw new Error("值必须为正整数");
    }
    return value;
  };
  Number.toNegativeInteger = (value) => {
    if (!Number.isNegativeInteger(value)) {
      throw new Error("值必须为负整数");
    }
    return value;
  };
  Number.toPositiveFloat = (value) => {
    if (!Number.isPositiveFloat(value)) {
      throw new Error("值必须为正浮点数");
    }
    return value;
  };
  Number.toNegativeFloat = (value) => {
    if (!Number.isNegativeFloat(value)) {
      throw new Error("值必须为负浮点数");
    }
    return value;
  };
  Array.prototype.any = function() {
    return this.filter((i3) => !isNullOrUndefined(i3)).length > 0;
  };
  Array.prototype.unique = function(prop) {
    if (isNullOrUndefined(prop)) {
      const seen = new Set();
      return this.filter((item) => {
        if (seen.has(item)) return false;
        seen.add(item);
        return true;
      });
    } else {
      const seen = new Map();
      const nanSymbol = Symbol();
      return this.filter((item) => {
        const rawKey = item[prop];
        const key = isNumber(rawKey) && Number.isNaN(rawKey) ? nanSymbol : rawKey;
        if (seen.has(key)) return false;
        seen.set(key, true);
        return true;
      });
    }
  };
  Array.prototype.union = function(that, prop) {
    return [...this, ...that].unique(prop);
  };
  Array.prototype.intersect = function(that, prop) {
    return this.filter(
      (item) => that.some((t2) => isNullOrUndefined(prop) ? t2 === item : t2[prop] === item[prop])
    ).unique(prop);
  };
  Array.prototype.difference = function(that, prop) {
    return this.filter(
      (item) => !that.some((t2) => isNullOrUndefined(prop) ? t2 === item : t2[prop] === item[prop])
    ).unique(prop);
  };
  Array.prototype.complement = function(that, prop) {
    return this.union(that, prop).difference(this.intersect(that, prop), prop);
  };
  String.prototype.isEmpty = function() {
    return !isNullOrUndefined(this) && this.length === 0;
  };
  String.prototype.isConvertibleToNumber = function(includeInfinity = false) {
    const trimmed = this.trim();
    if (trimmed === "") return false;
    return Number.isConvertibleNumber(Number(trimmed), includeInfinity);
  };
  String.prototype.reversed = function() {
    const segmenter = new Intl.Segmenter(navigator.language, { granularity: "grapheme" });
    return [...segmenter.segment(this.toString())].reverse().join("");
  };
  String.prototype.among = function(start, end, greedy = false, reverse = false) {
    if (this.isEmpty() || start.isEmpty() || end.isEmpty()) return "";
    if (!reverse) {
      const startIndex = this.indexOf(start);
      if (startIndex === -1) return "";
      const adjustedStartIndex = startIndex + start.length;
      const endIndex = greedy ? this.lastIndexOf(end) : this.indexOf(end, adjustedStartIndex);
      if (endIndex === -1 || endIndex < adjustedStartIndex) return "";
      return this.slice(adjustedStartIndex, endIndex);
    } else {
      const endIndex = this.lastIndexOf(end);
      if (endIndex === -1) return "";
      const adjustedEndIndex = endIndex - end.length;
      const startIndex = greedy ? this.indexOf(start) : this.lastIndexOf(start, adjustedEndIndex);
      if (startIndex === -1 || startIndex + start.length > adjustedEndIndex) return "";
      return this.slice(startIndex + start.length, endIndex);
    }
  };
  String.prototype.splitLimit = function(separator, limit) {
    if (this.isEmpty() || isNullOrUndefined(separator)) {
      throw new Error("Empty");
    }
    let body = this.split(separator);
    return limit ? body.slice(0, limit).concat(body.slice(limit).join(separator)) : body;
  };
  String.prototype.truncate = function(maxLength) {
    return this.length > maxLength ? this.substring(0, maxLength) : this.toString();
  };
  String.prototype.trimHead = function(prefix) {
    return this.startsWith(prefix) ? this.slice(prefix.length) : this.toString();
  };
  String.prototype.trimTail = function(suffix) {
    return this.endsWith(suffix) ? this.slice(0, -suffix.length) : this.toString();
  };
  String.prototype.replaceEmojis = function(replace) {
    return this.replaceAll(emojiRegex, replace ?? "");
  };
  String.prototype.toURL = function() {
    try {
      return new URL(this.toString());
    } catch (error) {
      if (error instanceof TypeError && this.toString().startsWith("//")) {
        return new URL(unsafeWindow.location.protocol + this.toString());
      }
      throw error;
    }
  };
  Date.prototype.add = function({
    years = 0,
    months = 0,
    days = 0,
    hours = 0,
    minutes = 0,
    seconds = 0,
    ms = 0
  } = {}) {
    const newDate = new Date(this.getTime());
    if (years) newDate.setFullYear(newDate.getFullYear() + years);
    if (months) newDate.setMonth(newDate.getMonth() + months);
    if (days) newDate.setDate(newDate.getDate() + days);
    if (hours) newDate.setHours(newDate.getHours() + hours);
    if (minutes) newDate.setMinutes(newDate.getMinutes() + minutes);
    if (seconds) newDate.setSeconds(newDate.getSeconds() + seconds);
    if (ms) newDate.setMilliseconds(newDate.getMilliseconds() + ms);
    return newDate;
  };
  Date.prototype.sub = function({
    years = 0,
    months = 0,
    days = 0,
    hours = 0,
    minutes = 0,
    seconds = 0,
    ms = 0
  } = {}) {
    const newDate = new Date(this.getTime());
    if (years) newDate.setFullYear(newDate.getFullYear() - years);
    if (months) newDate.setMonth(newDate.getMonth() - months);
    if (days) newDate.setDate(newDate.getDate() - days);
    if (hours) newDate.setHours(newDate.getHours() - hours);
    if (minutes) newDate.setMinutes(newDate.getMinutes() - minutes);
    if (seconds) newDate.setSeconds(newDate.getSeconds() - seconds);
    if (ms) newDate.setMilliseconds(newDate.getMilliseconds() - ms);
    return newDate;
  };
  function throttle(fn, delay2, { leading = true, trailing = true } = {}) {
    let lastCall = 0;
    let timer = null;
    const throttled = function(...args) {
      const now = Date.now();
      if (!lastCall && !leading) {
        lastCall = now;
      }
      const remaining = delay2 - (now - lastCall);
      if (remaining <= 0) {
        if (timer) {
          clearTimeout(timer);
          timer = null;
        }
        lastCall = now;
        fn.apply(this, args);
      } else if (trailing && !timer) {
        timer = setTimeout(() => {
          lastCall = leading ? Date.now() : 0;
          timer = null;
          fn.apply(this, args);
        }, remaining);
      }
    };
    throttled.cancel = () => {
      if (timer) {
        clearTimeout(timer);
        timer = null;
      }
      lastCall = 0;
    };
    return throttled;
  }
  function debounce(fn, delay2, { immediate = false } = {}) {
    let timer = null;
    const debounced = function(...args) {
      const callNow = immediate && !timer;
      if (timer) {
        clearTimeout(timer);
      }
      timer = setTimeout(() => {
        timer = null;
        if (!immediate) {
          fn.apply(this, args);
        }
      }, delay2);
      if (callNow) {
        fn.apply(this, args);
      }
    };
    debounced.cancel = () => {
      if (timer) {
        clearTimeout(timer);
        timer = null;
      }
    };
    return debounced;
  }
  function delay(time) {
    return new Promise((resolve) => setTimeout(resolve, time));
  }
  function hasProperty(element, property) {
    return property in element;
  }
  function hasOwnProperty(element, prop) {
    return prop in element;
  }
  function hasFunction(obj, method) {
    return isObject(obj) && method in obj && typeof obj[method] === "function";
  }
  ;
  function UUID() {
    return isNullOrUndefined(crypto) ? Array.from({ length: 8 }, () => ((1 + Math.random()) * 65536 | 0).toString(16).substring(1)).join("") : crypto.randomUUID().replaceAll("-", "");
  }
  function stringify(data) {
    switch (typeof data) {
      case "undefined":
        return "undefined";
      case "boolean":
        return data ? "true" : "false";
      case "number":
        return String(data);
      case "string":
        return data;
      case "symbol":
        return data.toString();
      case "function":
        return data.toString();
      case "object":
        if (isNull(data)) {
          return "null";
        }
        if (data instanceof Error) {
          return data.toString();
        }
        if (data instanceof Date) {
          return data.toISOString();
        }
        return JSON.stringify(data, null, 2);
      default:
        return "unknown";
    }
  }
  function prune(data) {
    if (isElement(data) || isNode(data)) {
      return data;
    }
    if (Array.isArray(data)) {
      return data.map((item) => prune(item)).filter(isNotEmpty);
    }
    if (isObject(data)) {
      const result = Object.fromEntries(
        Object.entries(data).filter(([, v2]) => isNotEmpty(v2)).map(([k2, v2]) => [k2, prune(v2)]).filter(([, v2]) => isNotEmpty(v2))
      );
      return result;
    }
    return data;
  }
  String.prototype.replaceVariable = function(replacements, prefix = "%#", suffix = "#%") {
    function escapeRegex(str) {
      return str.replace(/[\.\*\+\?\^\$\{\}\(\)\|\[\]\\]/g, "\\$&");
    }
    let current = this.toString();
    prefix = escapeRegex(prefix);
    suffix = escapeRegex(suffix);
    const seen = new Set();
    const patterns = Object.keys(replacements).map((key) => {
      const escKey = escapeRegex(key);
      return {
        value: replacements[key],
        placeholderRegex: new RegExp(`${prefix}${escKey}(?=(?::.*?${suffix}|${suffix}))(?::.*?)?${suffix}`, "gs"),
        placeholderFormatRegex: new RegExp(`(?<=${prefix}${escKey}(?=(?::.*?${suffix}|${suffix})):).*?(?=${suffix})`, "gs")
      };
    });
    while (true) {
      if (seen.has(current)) {
        console.warn("检测到循环替换!", `终止于: ${current}`);
        break;
      }
      seen.add(current);
      let next = current;
      for (const { value, placeholderRegex, placeholderFormatRegex } of patterns) {
        if (placeholderRegex.test(next)) {
          let format = next.match(placeholderFormatRegex);
          if (!isNullOrUndefined(format) && format.any() && !format[0].isEmpty() && hasFunction(value, "format")) {
            next = next.replace(placeholderRegex, stringify(value.format(format[0])));
          } else {
            next = next.replace(placeholderRegex, stringify(value instanceof Date ? value.format("YYYY-MM-DD") : value));
          }
        }
      }
      if (current === next) break;
      current = next;
    }
    return current;
  };
  var zh_cn_default = {
    appName: "Iwara 批量下载工具",
    language: "语言: ",
    downloadPriority: "下载画质: ",
    downloadPath: "下载到: ",
    downloadProxy: "下载代理: ",
    downloadProxyUsername: "下载代理用户名: ",
    downloadProxyPassword: "下载代理密码: ",
    aria2Path: "Aria2 RPC: ",
    aria2Token: "Aria2 密钥: ",
    iwaradlPath: "iwaradl RPC: ",
    iwaradlToken: "iwaradl 密钥: ",
    experimentalFeatures: "实验性功能",
    enableUnsafeMode: "激进模式(风险自行承担)",
    rename: "重命名",
    save: "保存",
    reset: "重置",
    ok: "确定",
    on: "开启",
    off: "关闭",
    delete: "删除",
    deleteSucceed: "删除成功!",
    isDebug: "调试模式",
    downloadType: "下载方式",
    browserDownload: "浏览器下载",
    iwaradlDownload: "iwaradl下载",
    autoFollow: "自动关注选中的视频作者",
    autoLike: "自动点赞选中的视频",
    addUnlistedAndPrivate: "不公开和私有视频强制显示(需关注作者)",
    checkDownloadLink: "第三方网盘下载地址检查",
    checkPriority: "下载画质检查",
    autoDownloadMetadata: "自动下载视频元数据",
    filterLikedVideos: "过滤时间线上的已喜欢视频",
    videoMetadata: "视频元数据",
    autoInjectCheckbox: "自动注入选择框",
    notOfficialWarning: "警告,此网站不是Iwara官方网站,请勿填写任何敏感信息!\n继续浏览该网站?",
    autoCopySaveFileName: "自动复制根据规则生成的文件名",
    configurationIncompatible: "初始化或配置文件不兼容,请重新配置!",
    browserDownloadNotEnabled: "未启用下载功能!",
    browserDownloadNotWhitelisted: "请求的文件扩展名未列入白名单!",
    browserDownloadNotPermitted: "下载功能已启用,但未授予下载权限!",
    browserDownloadNotSupported: "目前浏览器/版本不支持下载功能!",
    browserDownloadNotSucceeded: "下载未开始或失败!",
    browserDownloadUnknownError: "未知错误,有可能是下载时提供的参数存在问题,请检查文件名是否合法!",
    browserDownloadTimeout: "下载超时,请检查网络环境是否正常!",
    variable: "→ 查看可用变量 ←",
    downloadTime: "下载时间 ",
    uploadTime: "发布时间 ",
    example: "示例: ",
    result: "结果: ",
    loadingCompleted: "加载完成",
    settings: "打开设置",
    downloadThis: "下载当前视频",
    manualDownload: "手动下载指定",
    aria2TaskCheck: "Aria2任务重启",
    reverseSelect: "本页反向选中",
    deselectThis: "取消本页选中",
    deselectAll: "取消所有选中",
    selectThis: "本页全部选中",
    parseUnlistedAndPrivate: "解析近期隐藏或私有的视频",
    downloadSelected: "下载所选",
    selected: "已选中",
    downloadingSelected: "正在下载所选,请稍后...",
    injectCheckbox: "开关选择框",
    configError: "脚本配置中存在错误,请修改。",
    alreadyKnowHowToUse: "我已知晓如何使用!!!(此页面仅显示一次)",
    notice: [
      "加载完成",
      {
        nodeType: "br"
      },
      "公告: ",
      {
        nodeType: "br"
      },
      "解决了批量选中或取消选择时多标签页不同步的问题。",
      {
        nodeType: "br"
      },
      "添加隐藏时间线上已喜欢的视频功能。"
    ],
    useHelpForBase: [
      "请认真阅读使用指南!",
      {
        nodeType: "br"
      },
      "点击网页侧边的灰色侧栏展开脚本菜单,根据需求点击菜单中的功能。"
    ],
    useHelpForInjectCheckbox: "打开任意存在视频卡片的页面,脚本会在视频卡片上注入复选框,点击复选框或鼠标悬浮在视频卡片上按空格将会勾选此视频。",
    useHelpForCheckDownloadLink: "开启“%#checkDownloadLink#%”功能会在下载视频前会检查视频简介以及评论,如果在其中发现疑似第三方网盘下载链接,将会弹出提示,您可以点击提示打开视频页面。",
    useHelpForManualDownload: [
      "使用手动下载功能需要提供视频ID,如需批量手动下载请提供使用“|”分割的视频ID。",
      {
        nodeType: "br"
      },
      "例如: AeGUIRO2D5vQ6F|qQsUMJa19LcK3L",
      {
        nodeType: "br"
      },
      "或提供符合以下格式对象的数组json字符串",
      {
        nodeType: "br"
      },
      "[ ID: string, { Title?: string, Alias?: string, Author?: string } ] ",
      {
        nodeType: "br"
      },
      "例如: ",
      {
        nodeType: "br"
      },
      '[["AeGUIRO2D5vQ6F", { Title: "237知更鸟", Alias: "骑着牛儿追织女", Author: "user1528210" }],["qQsUMJa19LcK3L", { Title: "Mika Automotive Extradimensional", Alias: "Temptation’s_Symphony", Author: "temptations_symphony" }]]'
    ],
    useHelpForBugreport: [
      "反馈遇到的BUG、使用问题等请前往: ",
      {
        nodeType: "a",
        childs: "Github",
        attributes: {
          href: "https://github.com/dawn-lc/IwaraDownloadTool/"
        }
      }
    ],
    tryRestartingDownload: "→ 点击此处重新下载 ←",
    tryReparseDownload: "→ 点击此处重新解析 ←",
    cdnCacheFinded: "→ 进入 MMD Fans 缓存页面 ←",
    openVideoLink: "→ 进入视频页面 ←",
    copySucceed: "复制成功!",
    pushTaskSucceed: "推送下载任务成功!",
    exportConfig: "导出配置",
    exportConfigSucceed: "配置已导出至剪切板!",
    connectionTest: "连接测试",
    settingsCheck: "配置检查",
    createTask: "创建任务",
    downloadPathError: "下载路径错误!",
    browserDownloadModeError: "请启用脚本管理器的浏览器API下载模式!",
    downloadQualityError: "未找到指定的画质下载地址!",
    findedDownloadLink: "发现疑似第三方网盘下载地址!",
    allCompleted: "全部解析完成!",
    parsing: "预解析中...",
    following: "已关注",
    parsingProgress: "解析进度: ",
    manualDownloadTips: '单独下载请直接在此处输入视频ID, 批量下载请提供使用“|”分割的视频ID, 例如: AeGUIRO2D5vQ6F|qQsUMJa19LcK3L\r\n或提供符合以下格式对象的数组json字符串\r\n{ key: string, value: { Title?: string, Alias?: string, Author?: string } }\r\n例如: \r\n[{ key: "AeGUIRO2D5vQ6F", value: { Title: "237知更鸟", Alias: "骑着牛儿追织女", Author: "user1528210" } },{ key: "qQsUMJa19LcK3L", value: { Title: "Mika Automotive Extradimensional", Alias: "Temptation’s_Symphony", Author: "temptations_symphony" } }]',
    externalVideo: "非本站视频",
    noAvailableVideoSource: "没有可供下载的视频源",
    videoSourceNotAvailable: "视频源地址不可用",
    getVideoSourceFailed: "获取视频源失败",
    downloadFailed: "下载失败!",
    downloadThisFailed: "未找到可供下载的视频!",
    pushTaskFailed: "推送下载任务失败!",
    parsingFailed: "视频信息解析失败!",
    autoFollowFailed: "自动关注视频作者失败!",
    autoLikeFailed: "自动点赞视频失败!"
  };
  var en_default = {
    appName: "Iwara Download Tool",
    language: "Language: ",
    downloadPriority: "Download Quality: ",
    downloadPath: "Download Path: ",
    downloadProxy: "Download Proxy: ",
    downloadProxyUsername: "Download Proxy Username: ",
    downloadProxyPassword: "Download Proxy Password: ",
    aria2Path: "Aria2 RPC: ",
    aria2Token: "Aria2 Token: ",
    iwaradlPath: "iwaradl RPC: ",
    iwaradlToken: "iwaradl Token: ",
    experimentalFeatures: "Experimental Features",
    enableUnsafeMode: "Unsafe Mode (Use at your own risk)",
    rename: "Rename",
    save: "Save",
    reset: "Reset",
    ok: "OK",
    on: "On",
    off: "Off",
    delete: "Delete",
    deleteSucceed: "Deletion successful!",
    isDebug: "Debug Mode",
    downloadType: "Download Type",
    browserDownload: "Browser Download",
    iwaradlDownload: "iwaradl Download",
    autoFollow: "Automatically follow the selected video author",
    autoLike: "Automatically like the selected videos",
    addUnlistedAndPrivate: "Force display unlisted and private videos (requires following the author)",
    parseUnlistedAndPrivate: "Parse recent unlisted and private videos",
    checkDownloadLink: "Check third-party cloud storage download links",
    notOfficialWarning: "Warning: This website is not the official Iwara website. Do not enter any sensitive information!\nContinue browsing this website?",
    checkPriority: "Check download quality",
    autoDownloadMetadata: "Auto-download metadata",
    filterLikedVideos: "Filter liked videos on timeline",
    videoMetadata: "Video Metadata",
    autoInjectCheckbox: "Automatically inject selection box",
    autoCopySaveFileName: "Automatically copy the filename generated by rules",
    configurationIncompatible: "Initialization or configuration file incompatible, please reconfigure!",
    browserDownloadNotEnabled: "Download feature not enabled!",
    browserDownloadNotWhitelisted: "Requested file extension not whitelisted!",
    browserDownloadNotPermitted: "Download feature enabled, but permission not granted!",
    browserDownloadNotSupported: "Current browser/version does not support download functionality!",
    browserDownloadNotSucceeded: "Download did not start or failed!",
    browserDownloadUnknownError: "Unknown error, possibly due to invalid download parameters. Please check if the filename is valid!",
    browserDownloadTimeout: "Download timed out. Please check your network connection!",
    variable: "View available variables",
    downloadTime: "Download Time ",
    uploadTime: "Upload Time ",
    example: "Example: ",
    result: "Result: ",
    loadingCompleted: "Loading completed",
    settings: "Open Settings",
    downloadThis: "Download current video",
    manualDownload: "Manually specify download",
    aria2TaskCheck: "Aria2 Task Restart",
    reverseSelect: "Reverse selection on this page",
    deselectThis: "Deselect on this page",
    deselectAll: "Deselect all",
    selectThis: "Select all on this page",
    selected: "Selected",
    downloadSelected: "Download selected",
    downloadingSelected: "Downloading selected, please wait...",
    injectCheckbox: "Toggle selection box",
    configError: "There is an error in the script configuration. Please modify.",
    alreadyKnowHowToUse: "I already know how to use it!!!",
    notice: [
      "Loading Complete",
      {
        nodeType: "br"
      },
      "Notice: ",
      {
        nodeType: "br"
      },
      "Fixed the issue of batch selection or deselection not synchronizing across multiple tabs.",
      {
        nodeType: "br"
      },
      "Added security checks. This script will refuse to load functional modules on risky websites."
    ],
    useHelpForBase: [
      "Please read the usage guide carefully!",
      {
        nodeType: "br"
      },
      "Click the gray sidebar on the webpage to expand the script menu, then click the functions in the menu according to your needs."
    ],
    useHelpForInjectCheckbox: "Open any page with video cards, and the script will inject checkboxes on the video cards. Click the checkbox or hover over the video card and press space to select this video.",
    useHelpForCheckDownloadLink: 'Enabling "%#checkDownloadLink#%" will check the video description and comments before downloading. If third-party cloud storage links are found, a prompt will appear allowing you to visit the video page.',
    useHelpForManualDownload: [
      'To use manual download, provide the video ID. For batch manual download, use "|" to separate video IDs.',
      {
        nodeType: "br"
      },
      "Example: AeGUIRO2D5vQ6F|qQsUMJa19LcK3L",
      {
        nodeType: "br"
      },
      "Or provide an array of objects in JSON format matching the following structure:",
      {
        nodeType: "br"
      },
      "[ ID: string, { Title?: string, Alias?: string, Author?: string } ]",
      {
        nodeType: "br"
      },
      "Example: ",
      {
        nodeType: "br"
      },
      `[["AeGUIRO2D5vQ6F", { Title: "237 Robin", Alias: "Riding Cow Chasing Weaving Maiden", Author: "user1528210" }],["qQsUMJa19LcK3L", { Title: "Mika Automotive Extradimensional", Alias: "Temptation's Symphony", Author: "temptations_symphony" }]]`
    ],
    useHelpForBugreport: [
      "To report bugs or usage issues, please visit: ",
      {
        nodeType: "a",
        childs: "Github",
        attributes: {
          href: "https://github.com/dawn-lc/IwaraDownloadTool/"
        }
      }
    ],
    tryRestartingDownload: "→ Click here to restart download ←",
    tryReparseDownload: "→ Click here to reparse ←",
    cdnCacheFinded: "→ Visit MMD Fans Cache Page ←",
    openVideoLink: "→ Visit Video Page ←",
    copySucceed: "Copy succeeded!",
    pushTaskSucceed: "Task pushed successfully!",
    exportConfig: "Export Configuration",
    exportConfigSucceed: "Configuration exported to clipboard!",
    connectionTest: "Connection Test",
    settingsCheck: "Settings Check",
    createTask: "Create Task",
    downloadPathError: "Download path error!",
    browserDownloadModeError: "Please enable the browser API download mode in the script manager!",
    downloadQualityError: "Specified quality download URL not found!",
    findedDownloadLink: "Possible third-party cloud storage link found!",
    allCompleted: "All parsing completed!",
    parsing: "Parsing...",
    following: "Following",
    parsingProgress: "Parsing Progress: ",
    manualDownloadTips: `For individual downloads, input the video ID here. For batch downloads, separate video IDs with "|". Example: AeGUIRO2D5vQ6F|qQsUMJa19LcK3L\r
Or provide an array of objects in JSON format matching the following structure:\r
{ key: string, value: { Title?: string, Alias?: string, Author?: string } }\r
Example: \r
[{ key: "AeGUIRO2D5vQ6F", value: { Title: "237 Robin", Alias: "Riding Cow Chasing Weaving Maiden", Author: "user1528210" } },{ key: "qQsUMJa19LcK3L", value: { Title: "Mika Automotive Extradimensional", Alias: "Temptation's Symphony", Author: "temptations_symphony" } }]`,
    externalVideo: "External Video",
    noAvailableVideoSource: "No available video sources",
    videoSourceNotAvailable: "Video source URL unavailable",
    getVideoSourceFailed: "Failed to get video source",
    downloadFailed: "Download failed!",
    downloadThisFailed: "No downloadable video found!",
    pushTaskFailed: "Failed to push download task!",
    parsingFailed: "Failed to parse video information!",
    autoFollowFailed: "Failed to auto-follow the video author!",
    autoLikeFailed: "Failed to auto-like the video!"
  };
  var ja_default = {
    appName: "Iwara バッチダウンロードツール",
    language: "言語: ",
    downloadPriority: "ダウンロード画質: ",
    downloadPath: "ダウンロード先: ",
    downloadProxy: "ダウンロードプロキシ: ",
    downloadProxyUsername: "ダウンロードプロキシユーザー名: ",
    downloadProxyPassword: "ダウンロードプロキシパスワード: ",
    aria2Path: "Aria2 RPC: ",
    aria2Token: "Aria2 トークン: ",
    iwaradlPath: "iwaradl RPC: ",
    iwaradlToken: "iwaradl トークン: ",
    experimentalFeatures: "実験的機能",
    enableUnsafeMode: "アンセーフモード(自己責任で使用)",
    rename: "名前変更",
    save: "保存",
    reset: "リセット",
    ok: "OK",
    on: "オン",
    off: "オフ",
    delete: "削除",
    deleteSucceed: "削除成功!",
    isDebug: "デバッグモード",
    downloadType: "ダウンロード方式",
    browserDownload: "ブラウザダウンロード",
    iwaradlDownload: "iwaradlダウンロード",
    autoFollow: "選択した動画の作者を自動フォロー",
    autoLike: "選択した動画を自動いいね",
    addUnlistedAndPrivate: "非公開・限定公開動画を強制表示(作者のフォローが必要)",
    parseUnlistedAndPrivate: "最近の非公開・限定公開動画を解析",
    checkDownloadLink: "サードパーティクラウドストレージのダウンロードリンクをチェック",
    notOfficialWarning: "警告:このサイトはIwara公式サイトではありません。個人情報を入力しないでください!\nこのサイトを閲覧しますか?",
    checkPriority: "ダウンロード画質チェック",
    autoDownloadMetadata: "動画メタデータを自動ダウンロード",
    filterLikedVideos: "タイムライン上のいいね済み動画をフィルタリング",
    videoMetadata: "動画メタデータ",
    autoInjectCheckbox: "選択ボックスを自動注入",
    autoCopySaveFileName: "ルールに基づいて生成されたファイル名を自動コピー",
    configurationIncompatible: "初期化または設定ファイルが互換性がありません。再設定してください!",
    browserDownloadNotEnabled: "ダウンロード機能が有効になっていません!",
    browserDownloadNotWhitelisted: "要求されたファイル拡張子がホワイトリストに登録されていません!",
    browserDownloadNotPermitted: "ダウンロード機能は有効ですが、権限が付与されていません!",
    browserDownloadNotSupported: "現在のブラウザ/バージョンはダウンロード機能をサポートしていません!",
    browserDownloadNotSucceeded: "ダウンロードが開始されなかったか失敗しました!",
    browserDownloadUnknownError: "不明なエラー。ダウンロード時に提供されたパラメータに問題がある可能性があります。ファイル名が有効か確認してください!",
    browserDownloadTimeout: "ダウンロードがタイムアウトしました。ネットワーク環境を確認してください!",
    variable: "→ 利用可能な変数を表示 ←",
    downloadTime: "ダウンロード時間 ",
    uploadTime: "公開時間 ",
    example: "例: ",
    result: "結果: ",
    loadingCompleted: "読み込み完了",
    settings: "設定を開く",
    downloadThis: "現在の動画をダウンロード",
    manualDownload: "手動で指定ダウンロード",
    aria2TaskCheck: "Aria2タスク再起動",
    reverseSelect: "このページで選択を反転",
    deselectThis: "このページの選択を解除",
    deselectAll: "すべての選択を解除",
    selectThis: "このページをすべて選択",
    selected: "選択済み",
    downloadSelected: "選択したものをダウンロード",
    downloadingSelected: "選択したものをダウンロード中、しばらくお待ちください...",
    injectCheckbox: "選択ボックスを切り替え",
    configError: "スクリプト設定にエラーがあります。修正してください。",
    alreadyKnowHowToUse: "使用方法を理解しました!!!(このページは一度だけ表示されます)",
    notice: [
      "読み込み完了",
      {
        nodeType: "br"
      },
      "お知らせ: ",
      {
        nodeType: "br"
      },
      "バッチ選択または選択解除時の複数タブ間の同期問題を解決しました。",
      {
        nodeType: "br"
      },
      "セキュリティチェックを追加。このスクリプトはリスクのあるサイトでは機能モジュールの読み込みを拒否します。"
    ],
    useHelpForBase: [
      "使用ガイドをよくお読みください!",
      {
        nodeType: "br"
      },
      "ウェブページのサイドにある灰色のサイドバーをクリックしてスクリプトメニューを展開し、必要に応じてメニューの機能をクリックしてください。"
    ],
    useHelpForInjectCheckbox: "動画カードがある任意のページを開くと、スクリプトは動画カードにチェックボックスを注入します。チェックボックスをクリックするか、動画カードにマウスをホバーしてスペースキーを押すと、この動画が選択されます。",
    useHelpForCheckDownloadLink: '"%#checkDownloadLink#%"機能を有効にすると、動画をダウンロードする前に動画の説明とコメントをチェックします。サードパーティクラウドストレージのダウンロードリンクが見つかった場合、プロンプトが表示され、動画ページを開くことができます。',
    useHelpForManualDownload: [
      "手動ダウンロード機能を使用するには、動画IDを提供する必要があります。バッチ手動ダウンロードの場合は、「|」で区切った動画IDを提供してください。",
      {
        nodeType: "br"
      },
      "例: AeGUIRO2D5vQ6F|qQsUMJa19LcK3L",
      {
        nodeType: "br"
      },
      "または、以下の形式のオブジェクトの配列をJSON文字列で提供してください",
      {
        nodeType: "br"
      },
      "[ ID: string, { Title?: string, Alias?: string, Author?: string } ] ",
      {
        nodeType: "br"
      },
      "例: ",
      {
        nodeType: "br"
      },
      `[["AeGUIRO2D5vQ6F", { Title: "237知更鳥", Alias: "骑着牛儿追织女", Author: "user1528210" }],["qQsUMJa19LcK3L", { Title: "Mika Automotive Extradimensional", Alias: "Temptation's Symphony", Author: "temptations_symphony" }]]`
    ],
    useHelpForBugreport: [
      "バグや使用上の問題を報告する場合は、以下にアクセスしてください: ",
      {
        nodeType: "a",
        childs: "Github",
        attributes: {
          href: "https://github.com/dawn-lc/IwaraDownloadTool/"
        }
      }
    ],
    tryRestartingDownload: "→ ここをクリックしてダウンロードを再開 ←",
    tryReparseDownload: "→ ここをクリックして再解析 ←",
    cdnCacheFinded: "→ MMD Fans キャッシュページへ ←",
    openVideoLink: "→ 動画ページへ ←",
    copySucceed: "コピー成功!",
    pushTaskSucceed: "ダウンロードタスクのプッシュ成功!",
    exportConfig: "設定をエクスポート",
    exportConfigSucceed: "設定がクリップボードにエクスポートされました!",
    connectionTest: "接続テスト",
    settingsCheck: "設定チェック",
    createTask: "タスク作成",
    downloadPathError: "ダウンロードパスエラー!",
    browserDownloadModeError: "スクリプトマネージャーのブラウザAPIダウンロードモードを有効にしてください!",
    downloadQualityError: "指定された画質のダウンロードURLが見つかりません!",
    findedDownloadLink: "サードパーティクラウドストレージのダウンロードリンクを発見!",
    allCompleted: "すべての解析完了!",
    parsing: "解析中...",
    following: "フォロー中",
    parsingProgress: "解析進捗: ",
    manualDownloadTips: `個別ダウンロードはここに動画IDを直接入力してください。バッチダウンロードは「|」で区切った動画IDを提供してください。例: AeGUIRO2D5vQ6F|qQsUMJa19LcK3L\r
または、以下の形式のオブジェクトの配列をJSON文字列で提供してください\r
{ key: string, value: { Title?: string, Alias?: string, Author?: string } }\r
例: \r
[{ key: "AeGUIRO2D5vQ6F", value: { Title: "237知更鳥", Alias: "骑着牛儿追织女", Author: "user1528210" } },{ key: "qQsUMJa19LcK3L", value: { Title: "Mika Automotive Extradimensional", Alias: "Temptation's Symphony", Author: "temptations_symphony" } }]`,
    externalVideo: "外部動画",
    noAvailableVideoSource: "利用可能な動画ソースがありません",
    videoSourceNotAvailable: "動画ソースURLが利用できません",
    getVideoSourceFailed: "動画ソースの取得に失敗しました",
    downloadFailed: "ダウンロード失敗!",
    downloadThisFailed: "ダウンロード可能な動画が見つかりません!",
    pushTaskFailed: "ダウンロードタスクのプッシュに失敗!",
    parsingFailed: "動画情報の解析に失敗!",
    autoFollowFailed: "動画作者の自動フォローに失敗!",
    autoLikeFailed: "動画の自動いいねに失敗!"
  };
  var i18nList = {
    zh: zh_cn_default,
    en: en_default,
    ja: ja_default
  };
  var originalFetch = unsafeWindow.fetch;
  var originalHistoryPushState = unsafeWindow.history.pushState;
  var originalHistoryReplaceState = unsafeWindow.history.replaceState;
  var originalNodeAppendChild = unsafeWindow.Node.prototype.appendChild;
  var originalNodeRemoveChild = unsafeWindow.Node.prototype.removeChild;
  var originalElementRemove = unsafeWindow.Element.prototype.remove;
  var originalAddEventListener = unsafeWindow.EventTarget.prototype.addEventListener;
  var originalRemoveEventListener = unsafeWindow.EventTarget.prototype.removeEventListener;
  var originalStorageSetItem = unsafeWindow.Storage.prototype.setItem;
  var originalStorageRemoveItem = unsafeWindow.Storage.prototype.removeItem;
  var originalStorageClear = unsafeWindow.Storage.prototype.clear;
  var originalConsole = {
    log: unsafeWindow.console.log.bind(unsafeWindow.console),
    info: unsafeWindow.console.info.bind(unsafeWindow.console),
    warn: unsafeWindow.console.warn.bind(unsafeWindow.console),
    error: unsafeWindow.console.error.bind(unsafeWindow.console),
    debug: unsafeWindow.console.debug.bind(unsafeWindow.console),
    trace: unsafeWindow.console.trace.bind(unsafeWindow.console),
    dir: unsafeWindow.console.dir.bind(unsafeWindow.console),
    table: unsafeWindow.console.table?.bind(unsafeWindow.console)
  };
  var DownloadType = ((DownloadType2) => {
    DownloadType2[DownloadType2["Aria2"] = 0] = "Aria2";
    DownloadType2[DownloadType2["Iwaradl"] = 1] = "Iwaradl";
    DownloadType2[DownloadType2["Browser"] = 2] = "Browser";
    DownloadType2[DownloadType2["Others"] = 3] = "Others";
    return DownloadType2;
  })(DownloadType || {});
  var PageType = ((PageType2) => {
    PageType2["Video"] = "video";
    PageType2["Image"] = "image";
    PageType2["VideoList"] = "videoList";
    PageType2["ImageList"] = "imageList";
    PageType2["Forum"] = "forum";
    PageType2["ForumSection"] = "forumSection";
    PageType2["ForumThread"] = "forumThread";
    PageType2["Page"] = "page";
    PageType2["Home"] = "home";
    PageType2["Profile"] = "profile";
    PageType2["Subscriptions"] = "subscriptions";
    PageType2["Playlist"] = "playlist";
    PageType2["Favorites"] = "favorites";
    PageType2["Search"] = "search";
    PageType2["Account"] = "account";
    return PageType2;
  })(PageType || {});
  var ToastType = ((ToastType2) => {
    ToastType2[ToastType2["Log"] = 0] = "Log";
    ToastType2[ToastType2["Info"] = 1] = "Info";
    ToastType2[ToastType2["Warn"] = 2] = "Warn";
    ToastType2[ToastType2["Error"] = 3] = "Error";
    return ToastType2;
  })(ToastType || {});
  var MessageType = ((MessageType2) => {
    MessageType2[MessageType2["Close"] = 0] = "Close";
    MessageType2[MessageType2["Request"] = 1] = "Request";
    MessageType2[MessageType2["Receive"] = 2] = "Receive";
    MessageType2[MessageType2["Set"] = 3] = "Set";
    MessageType2[MessageType2["Del"] = 4] = "Del";
    return MessageType2;
  })(MessageType || {});
  var VersionState = ((VersionState2) => {
    VersionState2[VersionState2["Low"] = 0] = "Low";
    VersionState2[VersionState2["Equal"] = 1] = "Equal";
    VersionState2[VersionState2["High"] = 2] = "High";
    return VersionState2;
  })(VersionState || {});
  var DEFAULT_CONFIG = {
    language: "zh_cn",
    autoFollow: false,
    autoLike: false,
    autoCopySaveFileName: false,
    autoDownloadMetadata: false,
    enableUnsafeMode: false,
    experimentalFeatures: false,
    autoInjectCheckbox: true,
    checkDownloadLink: false,
    filterLikedVideos: false,
    checkPriority: true,
    addUnlistedAndPrivate: false,
    downloadPriority: "Source",
    downloadType: 3,
    downloadPath: "/Iwara/%#AUTHOR#%/%#TITLE#%[%#ID#%].mp4",
    downloadProxy: "",
    downloadProxyUsername: "",
    downloadProxyPassword: "",
    aria2Path: "http://127.0.0.1:6800/jsonrpc",
    aria2Token: "",
    iwaraDownloaderPath: "http://127.0.0.1:6800/jsonrpc",
    iwaraDownloaderToken: "",
    priority: {
      "Source": 100,
      "540": 99,
      "360": 98,
      "preview": 1
    }
  };
  var Config = class _Config {
    static instance;
    configChange;
    language;
    autoFollow;
    autoLike;
    autoDownloadMetadata;
    addUnlistedAndPrivate;
    enableUnsafeMode;
    experimentalFeatures;
    autoInjectCheckbox;
    autoCopySaveFileName;
    filterLikedVideos;
    checkDownloadLink;
    checkPriority;
    downloadPriority;
    downloadType;
    downloadPath;
    downloadProxy;
    downloadProxyUsername;
    downloadProxyPassword;
    aria2Path;
    aria2Token;
    iwaraDownloaderPath;
    iwaraDownloaderToken;
    authorization;
    priority;
    constructor() {
      this.language = DEFAULT_CONFIG.language;
      this.autoFollow = DEFAULT_CONFIG.autoFollow;
      this.autoLike = DEFAULT_CONFIG.autoLike;
      this.autoCopySaveFileName = DEFAULT_CONFIG.autoCopySaveFileName;
      this.experimentalFeatures = DEFAULT_CONFIG.experimentalFeatures;
      this.enableUnsafeMode = DEFAULT_CONFIG.enableUnsafeMode;
      this.autoInjectCheckbox = DEFAULT_CONFIG.autoInjectCheckbox;
      this.filterLikedVideos = DEFAULT_CONFIG.filterLikedVideos;
      this.checkDownloadLink = DEFAULT_CONFIG.checkDownloadLink;
      this.checkPriority = DEFAULT_CONFIG.checkPriority;
      this.addUnlistedAndPrivate = DEFAULT_CONFIG.addUnlistedAndPrivate;
      this.downloadPriority = DEFAULT_CONFIG.downloadPriority;
      this.downloadType = DEFAULT_CONFIG.downloadType;
      this.downloadPath = DEFAULT_CONFIG.downloadPath;
      this.downloadProxy = DEFAULT_CONFIG.downloadProxy;
      this.downloadProxyUsername = DEFAULT_CONFIG.downloadProxyUsername;
      this.downloadProxyPassword = DEFAULT_CONFIG.downloadProxyPassword;
      this.aria2Path = DEFAULT_CONFIG.aria2Path;
      this.aria2Token = DEFAULT_CONFIG.aria2Token;
      this.iwaraDownloaderPath = DEFAULT_CONFIG.iwaraDownloaderPath;
      this.iwaraDownloaderToken = DEFAULT_CONFIG.iwaraDownloaderToken;
      this.priority = DEFAULT_CONFIG.priority;
      this.autoDownloadMetadata = DEFAULT_CONFIG.autoDownloadMetadata;
      let body = new Proxy(this, {
        get: function(target, property) {
          if (property === "configChange") {
            return target.configChange;
          }
          let value = GM_getValue(property, target[property]);
          if (property === "language") {
            return _Config.getLanguage(value);
          }
          GM_getValue("isDebug") && originalConsole.debug(`[Debug] get: ${property} ${/password/i.test(property) || /token/i.test(property) || /authorization/i.test(property) ? "凭证已隐藏" : stringify(value)}`);
          return value;
        },
        set: function(target, property, value) {
          if (property === "configChange") {
            target.configChange = value;
            return true;
          }
          GM_setValue(property, value);
          GM_getValue("isDebug") && originalConsole.debug(`[Debug] set: ${property} ${/password/i.test(property) || /token/i.test(property) || /authorization/i.test(property) ? "凭证已隐藏" : stringify(value)}`);
          if (!isNullOrUndefined(target.configChange)) target.configChange(property);
          return true;
        }
      });
      for (const item in body) {
        GM_addValueChangeListener(
          item,
          (name, old_value, new_value, remote) => {
            if (remote && !isNullOrUndefined(body.configChange)) body.configChange(name);
          }
        );
      }
      return body;
    }
    static getLanguage(value) {
      function formatLanguage(value2) {
        return value2.replace("-", "_").toLowerCase();
      }
      function getMainLanguage(value2) {
        return value2.split("_").shift();
      }
      let custom = formatLanguage(value ?? DEFAULT_CONFIG.language);
      if (!isNullOrUndefined(custom)) {
        if (!isNullOrUndefined(i18nList[custom])) {
          return custom;
        } else {
          let customMain = getMainLanguage(custom);
          if (!isNullOrUndefined(i18nList[customMain])) {
            return customMain;
          }
        }
      }
      let env = formatLanguage(navigator.language ?? navigator.languages[0] ?? DEFAULT_CONFIG.language);
      if (!isNullOrUndefined(i18nList[env])) {
        return env;
      } else {
        let main2 = getMainLanguage(env);
        if (!isNullOrUndefined(i18nList[main2])) {
          return main2;
        }
      }
      return DEFAULT_CONFIG.language;
    }
    static getInstance() {
      if (isNullOrUndefined(_Config.instance)) _Config.instance = new _Config();
      return _Config.instance;
    }
    static destroyInstance() {
      _Config.instance = void 0;
    }
  };
  var config = Config.getInstance();
  var Path = class {
    fullPath;
    directory;
    fullName;
    type;
    extension;
    baseName;
    constructor(inputPath) {
      if (inputPath === "") {
        throw new Error("路径不能为空");
      }
      if (this.isUNC(inputPath)) {
        throw new Error("不接受UNC路径");
      }
      const detectedType = this.detectPathType(inputPath);
      this.validatePath(inputPath, detectedType);
      const normalized = this.normalizePath(inputPath, detectedType);
      const directory = this.extractDirectory(normalized, detectedType);
      const fileName = this.extractFileName(normalized, detectedType);
      const { baseName, extension } = this.extractBaseAndExtension(fileName);
      this.type = detectedType;
      this.fullPath = normalized;
      this.directory = directory;
      this.fullName = fileName;
      this.baseName = baseName;
      this.extension = extension;
    }
    isUNC(path) {
      return path.startsWith("\\\\");
    }
    detectPathType(path) {
      if (/^[A-Za-z]:[\\/]/.test(path)) {
        return "Windows";
      }
      if (path.startsWith("/")) {
        return "Unix";
      }
      return "Relative";
    }
    validatePath(path, type) {
      const invalidChars = /[<>:"|?*]/;
      if (type === "Windows") {
        if (!/^[A-Za-z]:[\\/]/.test(path)) {
          throw new Error("无效的Windows路径格式");
        }
        const segments = path.split(/[\\/]/);
        for (let i3 = 1; i3 < segments.length; i3++) {
          let segment = segments[i3];
          let variables = [...segment.matchAll(/%#(.*?)#%/g)].map((match) => {
            let variable = match[1].split(":");
            if (variable.length > 1) {
              if (invalidChars.test(variable[1])) {
                throw new Error(`路径变量格式化参数 "${variable[1]}" 含有非法字符`);
              }
            }
            return match[1];
          });
          for (let index = 0; index < variables.length; index++) {
            const variable = variables[index];
            segment = segment.replaceAll(variable, "");
          }
          if (invalidChars.test(segment)) {
            throw new Error(`路径段 "${segments[i3]}" 含有非法字符`);
          }
        }
      } else if (type === "Unix") {
        if (path.indexOf("\0") !== -1) {
          throw new Error("路径中包含非法空字符");
        }
      } else if (type === "Relative") {
        if (path.indexOf("\0") !== -1) {
          throw new Error("路径中包含非法空字符");
        }
        if (invalidChars.test(path)) {
          throw new Error("路径含有非法字符");
        }
      }
    }
    normalizePath(path, type) {
      const sep = type === "Windows" ? "\\" : "/";
      if (type === "Windows") {
        path = path.replace(/\//g, "\\");
        path = path.replace(/\\+/g, "\\");
      } else {
        path = path.replace(/\\/g, "/");
        path = path.replace(/\/+/g, "/");
      }
      let segments;
      if (type === "Windows") {
        segments = path.split("\\");
      } else {
        segments = path.split("/");
      }
      let isAbsolute = false;
      let prefix = "";
      if (type === "Windows") {
        if (/^[A-Za-z]:$/.test(segments[0])) {
          isAbsolute = true;
          prefix = segments[0];
          segments = segments.slice(1);
        }
      } else if (type === "Unix") {
        if (path.startsWith("/")) {
          isAbsolute = true;
          if (segments[0] === "") {
            segments = segments.slice(1);
          }
        }
      } else {
        isAbsolute = false;
      }
      const resolvedSegments = this.resolveSegments(segments, isAbsolute);
      let normalized = "";
      if (type === "Windows") {
        normalized = prefix ? prefix + sep + resolvedSegments.join(sep) : resolvedSegments.join(sep);
        if (prefix && normalized === prefix) {
          normalized += sep;
        }
      } else if (type === "Unix") {
        normalized = (isAbsolute ? sep : "") + resolvedSegments.join(sep);
        if (isAbsolute && normalized === "") {
          normalized = sep;
        }
      } else {
        normalized = resolvedSegments.join(sep);
      }
      return normalized;
    }
    resolveSegments(segments, isAbsolute) {
      const stack = [];
      for (const segment of segments) {
        if (segment === "" || segment === ".") continue;
        if (segment === "..") {
          if (stack.length > 0 && stack[stack.length - 1] !== "..") {
            stack.pop();
          } else {
            if (isAbsolute) {
              throw new Error("绝对路径不能越界");
            } else {
              stack.push("..");
            }
          }
        } else {
          stack.push(segment);
        }
      }
      return stack;
    }
    extractDirectory(path, type) {
      const sep = type === "Windows" ? "\\" : "/";
      if (type === "Windows" && /^[A-Za-z]:\\$/.test(path)) {
        return path;
      }
      if (type === "Unix" && path === "/") {
        return path;
      }
      const lastIndex = path.lastIndexOf(sep);
      return lastIndex === -1 ? "" : path.substring(0, lastIndex);
    }
    extractFileName(path, type) {
      const sep = type === "Windows" ? "\\" : "/";
      const lastIndex = path.lastIndexOf(sep);
      return lastIndex === -1 ? path : path.substring(lastIndex + 1);
    }
    extractBaseAndExtension(fileName) {
      const lastDot = fileName.lastIndexOf(".");
      if (lastDot <= 0) {
        return { baseName: fileName, extension: "" };
      }
      const baseName = fileName.substring(0, lastDot);
      const extension = fileName.substring(lastDot + 1);
      return { baseName, extension };
    }
  };
  var Version = class _Version {
    major;
    minor;
    patch;
    preRelease;
    buildMetadata;
    constructor(versionString) {
      if (!versionString || typeof versionString !== "string") {
        throw new Error("Invalid version string");
      }
      const [version, preRelease, buildMetadata] = versionString.split(/[-+]/);
      const versionParts = version.split(".").map(Number);
      if (versionParts.some(isNaN)) {
        throw new Error("Version string contains invalid numbers");
      }
      this.major = versionParts[0] || 0;
      this.minor = versionParts.length > 1 ? versionParts[1] : 0;
      this.patch = versionParts.length > 2 ? versionParts[2] : 0;
      this.preRelease = preRelease ? preRelease.split(".") : [];
      this.buildMetadata = buildMetadata || "";
    }
    static compareValues(a3, b2) {
      if (a3 < b2) return 0;
      if (a3 > b2) return 2;
      return 1;
    }
    compare(other) {
      let state = _Version.compareValues(this.major, other.major);
      if (state !== 1) return state;
      state = _Version.compareValues(this.minor, other.minor);
      if (state !== 1) return state;
      state = _Version.compareValues(this.patch, other.patch);
      if (state !== 1) return state;
      for (let i3 = 0; i3 < Math.max(this.preRelease.length, other.preRelease.length); i3++) {
        const pre1 = this.preRelease[i3] ?? "";
        const pre2 = other.preRelease[i3] ?? "";
        state = _Version.compareValues(
          isNaN(+pre1) ? pre1 : +pre1,
          isNaN(+pre2) ? pre2 : +pre2
        );
        if (state !== 1) return state;
      }
      return 1;
    }
    toString() {
      const version = `${this.major}.${this.minor}.${this.patch}`;
      const preRelease = this.preRelease.length ? `-${this.preRelease.join(".")}` : "";
      const buildMetadata = this.buildMetadata ? `+${this.buildMetadata}` : "";
      return `${version}${preRelease}${buildMetadata}`;
    }
  };
  var Dictionary = class extends Map {
    constructor(data = []) {
      super(data);
    }
    toArray() {
      return Array.from(this);
    }
    keysArray() {
      return Array.from(this.keys());
    }
    valuesArray() {
      return Array.from(this.values());
    }
  };
  var GMSyncDictionary = class _GMSyncDictionary extends Dictionary {
    onSet;
    onDel;
    onSync;
    name;
    listenerId = null;
    static BATCH_THRESHOLD = 10;
    constructor(name, initial = []) {
      let stored = initial.any() ? initial : GM_getValue(name, initial);
      try {
        super(stored.filter(([_, info]) => isVideoInfo(info)));
      } catch (error) {
        super();
      }
      this.name = name;
      this.saveToStorage();
      this.setupValueChangeListener();
    }
    setupValueChangeListener() {
      if (this.listenerId !== null) {
        GM_removeValueChangeListener(this.listenerId);
      }
      this.listenerId = GM_addValueChangeListener(
        this.name,
        (key, oldValue, newValue, remote) => {
          if (key === this.name && remote) {
            this.handleRemoteChange(newValue);
          }
        }
      );
    }
    handleRemoteChange(newValue) {
      if (isNullOrUndefined(newValue)) {
        super.clear();
        this.onSync?.();
        return;
      }
      const currentKeys = new Set(this.keys());
      const addedOrUpdated = [];
      const deleted = [];
      for (const [key, value] of newValue) {
        if (!currentKeys.has(key)) {
          addedOrUpdated.push([key, value]);
        } else {
          const currentValue = this.get(key);
          if (currentValue !== value) {
            addedOrUpdated.push([key, value]);
          }
          currentKeys.delete(key);
        }
      }
      for (const key of currentKeys) {
        deleted.push(key);
      }
      const totalChanges = addedOrUpdated.length + deleted.length;
      if (totalChanges > _GMSyncDictionary.BATCH_THRESHOLD) {
        super.clear();
        for (const [key, value] of newValue) {
          super.set(key, value);
        }
        this.onSync?.();
      } else {
        for (const [key, value] of addedOrUpdated) {
          super.set(key, value);
          this.onSet?.(key, value);
        }
        for (const key of deleted) {
          super.delete(key);
          this.onDel?.(key);
        }
      }
    }
    saveToStorage() {
      GM_setValue(this.name, this.toArray());
    }
    set(key, value) {
      super.set(key, value);
      this.saveToStorage();
      this.onSet?.(key, value);
      return this;
    }
    delete(key) {
      const result = super.delete(key);
      if (result) {
        this.saveToStorage();
        this.onDel?.(key);
      }
      return result;
    }
    clear() {
      super.clear();
      this.saveToStorage();
      this.onSync?.();
    }
    get(key) {
      return super.get(key);
    }
    has(key) {
      return super.has(key);
    }
    get size() {
      return super.size;
    }
    destroy() {
      if (this.listenerId !== null) {
        GM_removeValueChangeListener(this.listenerId);
        this.listenerId = null;
      }
    }
  };
  var SyncDictionary = class extends Dictionary {
    onSet;
    onDel;
    onSync;
    timestamp;
    lifetime;
    id;
    channel;
    constructor(channelName, initial = []) {
      const hasInitial = prune(initial).any();
      super(hasInitial ? initial : void 0);
      this.timestamp = hasInitial ? Date.now() : 0;
      this.lifetime = hasInitial ? performance.now() : 0;
      this.id = UUID();
      this.channel = new BroadcastChannel(channelName);
      this.channel.onmessage = ({ data: msg }) => this.handleMessage(msg);
      this.channel.postMessage({ type: "sync", id: this.id, timestamp: this.timestamp, lifetime: this.lifetime });
    }
    setTimestamp(timestamp) {
      this.timestamp = timestamp ?? Date.now();
      this.lifetime = performance.now();
    }
    set(key, value) {
      this.setTimestamp();
      super.set(key, value);
      this.channel.postMessage({ type: "set", key, value, timestamp: this.timestamp, lifetime: this.lifetime, id: this.id });
      this.onSet?.(key, value);
      return this;
    }
    delete(key) {
      this.setTimestamp();
      const existed = super.delete(key);
      if (existed) {
        this.onDel?.(key);
        this.channel.postMessage({ type: "delete", key, timestamp: this.timestamp, lifetime: this.lifetime, id: this.id });
      }
      return existed;
    }
    clear() {
      this.setTimestamp();
      super.clear();
      this.channel.postMessage({ timestamp: this.timestamp, lifetime: this.lifetime, id: this.id, type: "state", state: super.toArray() });
      this.onSync?.();
    }
    handleMessage(msg) {
      if (msg.id === this.id) return;
      if (msg.type === "sync") {
        this.channel.postMessage({ timestamp: this.timestamp, lifetime: this.lifetime, id: this.id, type: "state", state: super.toArray() });
        return;
      }
      if (msg.timestamp === this.timestamp && msg.lifetime === this.lifetime) return;
      if (msg.timestamp < this.timestamp || msg.lifetime < this.lifetime) return;
      switch (msg.type) {
        case "state": {
          super.clear();
          for (let index = 0; index < msg.state.length; index++) {
            const [key, value] = msg.state[index];
            super.set(key, value);
          }
          this.setTimestamp(msg.timestamp);
          this.onSync?.();
          break;
        }
        case "set": {
          const { key, value } = msg;
          super.set(key, value);
          this.setTimestamp(msg.timestamp);
          this.onSet?.(key, value);
          break;
        }
        case "delete": {
          const { key } = msg;
          if (super.delete(key)) {
            this.setTimestamp(msg.timestamp);
            this.onDel?.(key);
          }
          break;
        }
      }
    }
  };
  var MultiPage = class {
    pageId;
    onLastPage;
    onPageJoin;
    onPageLeave;
    channel;
    beforeUnloadHandler;
    constructor() {
      this.pageId = UUID();
      GM_saveTab({ id: this.pageId });
      this.channel = new BroadcastChannel("page-status-channel");
      this.channel.onmessage = (event) => this.handleMessage(event.data);
      this.channel.postMessage({ type: "join", id: this.pageId });
      this.beforeUnloadHandler = () => {
        this.channel.postMessage({ type: "leave", id: this.pageId });
        originalRemoveEventListener.call(unsafeWindow.document, "beforeunload", this.beforeUnloadHandler);
      };
      originalAddEventListener.call(unsafeWindow.document, "beforeunload", this.beforeUnloadHandler);
    }
    suicide() {
      this.channel.postMessage({ type: "suicide", id: this.pageId });
    }
    handleMessage(message) {
      switch (message.type) {
        case "suicide":
          if (this.pageId !== message.id) unsafeWindow.close();
          break;
        case "join":
          this.onPageJoin?.(message.id);
          break;
        case "leave":
          this.onPageLeave?.(message.id);
          GM_getTabs((tabs) => {
            if (Object.keys(tabs).length > 1) return;
            this.onLastPage?.();
          });
          break;
      }
    }
  };
  var D = (e, n5) => n5.some((t2) => e instanceof t2);
  var w, b;
  function C() {
    return w || (w = [IDBDatabase, IDBObjectStore, IDBIndex, IDBCursor, IDBTransaction]);
  }
  function x() {
    return b || (b = [IDBCursor.prototype.advance, IDBCursor.prototype.continue, IDBCursor.prototype.continuePrimaryKey]);
  }
  var I = new WeakMap(), l = new WeakMap(), f = new WeakMap();
  function V(e) {
    const n5 = new Promise((t2, r2) => {
      const i3 = () => {
        e.removeEventListener("success", c2), e.removeEventListener("error", o);
      }, c2 = () => {
        t2(a(e.result)), i3();
      }, o = () => {
        r2(e.error), i3();
      };
      e.addEventListener("success", c2), e.addEventListener("error", o);
    });
    return f.set(n5, e), n5;
  }
  function S(e) {
    if (I.has(e)) return;
    const n5 = new Promise((t2, r2) => {
      const i3 = () => {
        e.removeEventListener("complete", c2), e.removeEventListener("error", o), e.removeEventListener("abort", o);
      }, c2 = () => {
        t2(), i3();
      }, o = () => {
        r2(e.error || new DOMException("AbortError", "AbortError")), i3();
      };
      e.addEventListener("complete", c2), e.addEventListener("error", o), e.addEventListener("abort", o);
    });
    I.set(e, n5);
  }
  var y = { get(e, n5, t2) {
    if (e instanceof IDBTransaction) {
      if (n5 === "done") return I.get(e);
      if (n5 === "store") return t2.objectStoreNames[1] ? void 0 : t2.objectStore(t2.objectStoreNames[0]);
    }
    return a(e[n5]);
  }, set(e, n5, t2) {
    return e[n5] = t2, true;
  }, has(e, n5) {
    return e instanceof IDBTransaction && (n5 === "done" || n5 === "store") ? true : n5 in e;
  } };
  function E(e) {
    y = e(y);
  }
  function T(e) {
    return x().includes(e) ? function(...n5) {
      return e.apply(h(this), n5), a(this.request);
    } : function(...n5) {
      return a(e.apply(h(this), n5));
    };
  }
  function j(e) {
    return typeof e == "function" ? T(e) : (e instanceof IDBTransaction && S(e), D(e, C()) ? new Proxy(e, y) : e);
  }
  function a(e) {
    if (e instanceof IDBRequest) return V(e);
    if (l.has(e)) return l.get(e);
    const n5 = j(e);
    return n5 !== e && (l.set(e, n5), f.set(n5, e)), n5;
  }
  var h = (e) => f.get(e);
  function A(e, n5, { blocked: t2, upgrade: r2, blocking: i3, terminated: c2 } = {}) {
    const o = indexedDB.open(e, n5), d = a(o);
    return r2 && o.addEventListener("upgradeneeded", (s) => {
      r2(a(o.result), s.oldVersion, s.newVersion, a(o.transaction), s);
    }), t2 && o.addEventListener("blocked", (s) => t2(s.oldVersion, s.newVersion, s)), d.then((s) => {
      c2 && s.addEventListener("close", () => c2()), i3 && s.addEventListener("versionchange", (u3) => i3(u3.oldVersion, u3.newVersion, u3));
    }).catch(() => {
    }), d;
  }
  function O(e, { blocked: n5 } = {}) {
    const t2 = indexedDB.deleteDatabase(e);
    return n5 && t2.addEventListener("blocked", (r2) => n5(r2.oldVersion, r2)), a(t2).then(() => {
    });
  }
  var v = ["get", "getKey", "getAll", "getAllKeys", "count"], W = ["put", "add", "delete", "clear"], m = new Map();
  function M(e, n5) {
    if (!(e instanceof IDBDatabase && !(n5 in e) && typeof n5 == "string")) return;
    if (m.get(n5)) return m.get(n5);
    const t2 = n5.replace(/FromIndex$/, ""), r2 = n5 !== t2, i3 = W.includes(t2);
    if (!(t2 in (r2 ? IDBIndex : IDBObjectStore).prototype) || !(i3 || v.includes(t2))) return;
    const c2 = async function(o, ...d) {
      const s = this.transaction(o, i3 ? "readwrite" : "readonly");
      let u3 = s.store;
      return r2 && (u3 = u3.index(d.shift())), (await Promise.all([u3[t2](...d), i3 && s.done]))[0];
    };
    return m.set(n5, c2), c2;
  }
  E((e) => ({ ...e, get: (n5, t2, r2) => M(n5, t2) || e.get(n5, t2, r2), has: (n5, t2) => !!M(n5, t2) || e.has(n5, t2) }));
  var p = ["continue", "continuePrimaryKey", "advance"], P = {}, B = new WeakMap(), L = new WeakMap(), F = { get(e, n5) {
    if (!p.includes(n5)) return e[n5];
    let t2 = P[n5];
    return t2 || (t2 = P[n5] = function(...r2) {
      B.set(this, L.get(this)[n5](...r2));
    }), t2;
  } };
  async function* k(...e) {
    let n5 = this;
    if (n5 instanceof IDBCursor || (n5 = await n5.openCursor(...e)), !n5) return;
    n5 = n5;
    const t2 = new Proxy(n5, F);
    for (L.set(t2, n5), f.set(t2, h(n5)); n5; ) yield t2, n5 = await (B.get(t2) || n5.continue()), B.delete(t2);
  }
  function g(e, n5) {
    return n5 === Symbol.asyncIterator && D(e, [IDBIndex, IDBObjectStore, IDBCursor]) || n5 === "iterate" && D(e, [IDBIndex, IDBObjectStore]);
  }
  E((e) => ({ ...e, get(n5, t2, r2) {
    return g(n5, t2) ? k : e.get(n5, t2, r2);
  }, has(n5, t2) {
    return g(n5, t2) || e.has(n5, t2);
  } }));
  var Database = class _Database {
    static instance;
    dbPromise;
    constructor() {
      this.dbPromise = A("IwaraDownloadTool", 20, {
        upgrade(db2, oldVersion, newVersion, transaction) {
          if (!db2.objectStoreNames.contains("follows")) {
            const followsStore = db2.createObjectStore("follows", { keyPath: "id" });
            followsStore.createIndex("id", "id", { unique: true });
            followsStore.createIndex("username", "username", { unique: true });
            followsStore.createIndex("name", "name");
            followsStore.createIndex("friend", "friend");
            followsStore.createIndex("following", "following");
            followsStore.createIndex("followedBy", "followedBy");
          }
          if (!db2.objectStoreNames.contains("friends")) {
            const friendsStore = db2.createObjectStore("friends", { keyPath: "id" });
            friendsStore.createIndex("id", "id", { unique: true });
            friendsStore.createIndex("username", "username", { unique: true });
            friendsStore.createIndex("name", "name");
            friendsStore.createIndex("friend", "friend");
            friendsStore.createIndex("following", "following");
            friendsStore.createIndex("followedBy", "followedBy");
          }
          if (!db2.objectStoreNames.contains("videos")) {
            const videosStore = db2.createObjectStore("videos", { keyPath: "ID" });
            videosStore.createIndex("ID", "ID", { unique: true });
            videosStore.createIndex("UploadTime", "UploadTime");
            videosStore.createIndex("Private", "Private");
            videosStore.createIndex("Unlisted", "Unlisted");
            videosStore.createIndex("Type", "Type");
          }
          if (!db2.objectStoreNames.contains("caches")) {
            const cachesStore = db2.createObjectStore("caches", { keyPath: "ID" });
            cachesStore.createIndex("ID", "ID", { unique: true });
          }
        }
      });
    }
    async getDB() {
      return this.dbPromise;
    }
    async follows() {
      const db2 = await this.getDB();
      return db2.transaction("follows", "readwrite").objectStore("follows");
    }
    async friends() {
      const db2 = await this.getDB();
      return db2.transaction("friends", "readwrite").objectStore("friends");
    }
    async videos() {
      const db2 = await this.getDB();
      return db2.transaction("videos", "readwrite").objectStore("videos");
    }
    async caches() {
      const db2 = await this.getDB();
      return db2.transaction("caches", "readwrite").objectStore("caches");
    }
    async getFollows() {
      const store = await this.follows();
      return store.getAll();
    }
    async getFriends() {
      const store = await this.friends();
      return store.getAll();
    }
    async getVideos() {
      const store = await this.videos();
      return store.getAll();
    }
    async getCaches() {
      const store = await this.caches();
      return store.getAll();
    }
    async getFollowByUsername(username) {
      const db2 = await this.getDB();
      const tx = db2.transaction("follows", "readonly");
      const index = tx.store.index("username");
      return index.get(username);
    }
    async getFollowById(id) {
      const db2 = await this.getDB();
      return db2.get("follows", id);
    }
    async getVideoById(id) {
      const db2 = await this.getDB();
      return db2.get("videos", id);
    }
    async getVideosByIds(ids) {
      const db2 = await this.getDB();
      const tx = db2.transaction("videos", "readonly");
      const store = tx.store;
      const results = [];
      for (const id of ids) {
        const video = await store.get(id);
        if (video) {
          results.push(video);
        }
      }
      return results;
    }
    async putVideo(video) {
      const db2 = await this.getDB();
      await db2.put("videos", video);
    }
    async bulkPutVideos(videos) {
      const db2 = await this.getDB();
      const tx = db2.transaction("videos", "readwrite");
      const store = tx.store;
      for (const video of videos) {
        await store.put(video);
      }
      await tx.done;
    }
    async putFollow(user) {
      const db2 = await this.getDB();
      await db2.put("follows", user);
    }
    async putFriend(user) {
      const db2 = await this.getDB();
      await db2.put("friends", user);
    }
    async deleteFollow(id) {
      const db2 = await this.getDB();
      await db2.delete("follows", id);
    }
    async deleteFriend(id) {
      const db2 = await this.getDB();
      await db2.delete("friends", id);
    }
    async getFilteredVideos(startTime, endTime) {
      if (isNullOrUndefined(startTime) || isNullOrUndefined(endTime)) return [];
      const db2 = await this.getDB();
      const tx = db2.transaction("videos", "readonly");
      const store = tx.store;
      const index = store.index("UploadTime");
      const allVideos = [];
      let cursor = await index.openCursor(IDBKeyRange.bound(startTime, endTime, true, true));
      while (cursor) {
        const video = cursor.value;
        if ((video.Type === "partial" || video.Type === "full") && (video.Private || video.Unlisted) && !isNullOrUndefined(video.RAW)) {
          allVideos.push(video);
        }
        cursor = await cursor.continue();
      }
      return allVideos;
    }
    static getInstance() {
      if (isNullOrUndefined(_Database.instance)) {
        _Database.instance = new _Database();
      }
      return _Database.instance;
    }
    static destroyInstance() {
      _Database.instance = void 0;
    }
    async delete() {
      const db2 = await this.getDB();
      db2.close();
      await O("IwaraDownloadTool");
    }
  };
  var db = Database.getInstance();
  var import_dayjs = __toESM(require_dayjs_min(), 1);
  Date.prototype.format = function(format) {
    return (0, import_dayjs.default)(this).format(format);
  };
  var unlimitedFetch = async (input, init = {}, options) => {
    const {
      force = false,
      retry = false,
      maxRetries = 3,
      retryDelay = 3e3,
      successStatus = [200, 201],
      failStatuses = [403, 404],
      onFail,
      onRetry
    } = options || {};
    const successStatuses = Array.isArray(successStatus) ? successStatus : [successStatus];
    const failStatusList = Array.isArray(failStatuses) ? failStatuses : [failStatuses];
    const url = typeof input === "string" ? input : input.url;
    const isCrossOrigin = force || new URL(url).hostname !== unsafeWindow.location.hostname;
    const doFetch = async () => {
      if (isCrossOrigin) {
        return new Promise((resolve, reject) => {
          GM_xmlhttpRequest({
            method: init.method,
            url,
            headers: init.headers || {},
            data: init.body || void 0,
            onload: (response) => {
              resolve(new Response(response.responseText, {
                status: response.status,
                statusText: response.statusText
              }));
            },
            onerror: reject
          });
        });
      } else {
        return originalFetch(input, init);
      }
    };
    if (!retry) return doFetch();
    let lastResponse = await doFetch();
    let attempts = 1;
    while (attempts < maxRetries) {
      if (successStatuses.includes(lastResponse.status)) return lastResponse;
      if (failStatusList.includes(lastResponse.status)) break;
      attempts++;
      if (onRetry) await onRetry(lastResponse);
      await delay(retryDelay);
      lastResponse = await doFetch();
    }
    if (onFail) await onFail(lastResponse);
    return lastResponse;
  };
  var findElement = (element, condition) => {
    while (!isNullOrUndefined(element) && !element.matches(condition)) {
      if (isNullOrUndefined(element.parentElement)) return void 0;
      element = element.parentElement;
    }
    return element.querySelectorAll(condition).length > 1 ? void 0 : element;
  };
  var renderNode = (renderCode) => {
    let code = prune(renderCode);
    if (isNullOrUndefined(code)) throw new Error("RenderCode null");
    if (typeof code === "string") {
      return document.createTextNode(code.replaceVariable(i18nList[config.language]));
    }
    if (renderCode instanceof Node) {
      return code;
    }
    if (typeof renderCode !== "object" || !renderCode.nodeType) {
      throw new Error("Invalid arguments");
    }
    const { nodeType, attributes, events, className, childs } = renderCode;
    const node = document.createElement(nodeType);
    if (!isNullOrUndefined(events) && Object.keys(events).length > 0) {
      Object.entries(events).forEach(([eventName, eventHandler]) => originalAddEventListener.call(node, eventName, eventHandler));
    }
    if (!isNullOrUndefined(attributes) && Object.keys(attributes).length > 0) {
      Object.entries(attributes).forEach(([key, value]) => {
        node.setAttribute(key, value);
        node[key] = value;
      });
    }
    if (!isNullOrUndefined(className) && className.length > 0) {
      node.classList.add(...typeof className === "string" ? [className] : className);
    }
    if (!isNullOrUndefined(childs)) {
      node.append(...(isArray(childs) ? childs : [childs]).filter((child) => !isNullOrUndefined(child)).map(renderNode));
    }
    return node;
  };
  var activeToasts = new Dictionary();
  var toastTimeouts = new Map();
  var toastIntervals = new Map();
  var toastContainers = new Map();
  var offscreenContainer = document.createElement("div");
  offscreenContainer.classList.add("offscreen-container");
  var getContainer = (gravity, position) => {
    const containerId = `toast-container-${gravity}-${position}`;
    if (!toastContainers.has(containerId)) {
      const container = document.createElement("div");
      container.id = containerId;
      container.classList.add(
        "toast-container",
        `toast-${gravity}`,
        `toast-${position}`
      );
      document.body.appendChild(container);
      toastContainers.set(containerId, container);
    }
    return toastContainers.get(containerId);
  };
  var addTimeout = (toast, callback) => {
    if (isNullOrUndefined(toast.options.duration)) return;
    delTimeout(toast);
    const duration = toast.options.duration;
    const timeoutId = window.setTimeout(() => {
      callback();
      delTimeout(toast);
    }, duration);
    toastTimeouts.set(toast, timeoutId);
    if (!toast.showProgress) return;
    if (isNullOrUndefined(toast.progress)) return;
    const startTime = Date.now();
    const updateRemainingTime = () => {
      if (isNullOrUndefined(toast.progress)) return;
      const elapsed = Date.now() - startTime;
      const remaining = Math.max(0, duration - elapsed);
      toast.progress.style.setProperty("--toast-progress", `${remaining / duration}`);
    };
    toast.progress.style.setProperty("--toast-progress", `1`);
    const intervalId = window.setInterval(updateRemainingTime, 20);
    toastIntervals.set(toast, intervalId);
  };
  var delTimeout = (toast) => {
    const timeoutId = toastTimeouts.get(toast);
    if (!isNullOrUndefined(timeoutId)) {
      clearTimeout(timeoutId);
      toastTimeouts.delete(toast);
    }
    if (!toast.showProgress) return;
    const intervalId = toastIntervals.get(toast);
    if (!isNullOrUndefined(intervalId)) {
      clearInterval(intervalId);
      toastIntervals.delete(toast);
    }
    if (!isNullOrUndefined(toast.progress)) {
      toast.progress.style.removeProperty("--toast-progress");
    }
  };
  var Toast = class _Toast {
    static defaults = {
      id: UUID(),
      gravity: "top",
      position: "left",
      stopOnFocus: true,
      oldestFirst: true,
      showProgress: false
    };
    id;
    options;
    root;
    element;
    gravity;
    position;
    oldestFirst;
    stopOnFocus;
    showProgress;
    content;
    progress;
    mouseOverHandler;
    mouseLeaveHandler;
    closeButtonHandler;
    animationEndHandler;
    clickHandler;
    closeButton;
    constructor(options) {
      this.options = {
        ..._Toast.defaults,
        ...options
      };
      this.id = this.options.id;
      this.root = getContainer(this.options.gravity, this.options.position);
      this.gravity = this.options.gravity;
      this.position = this.options.position;
      this.stopOnFocus = this.options.stopOnFocus;
      this.oldestFirst = this.options.oldestFirst;
      this.showProgress = this.options.showProgress;
      this.element = document.createElement("div");
      this.applyBaseStyles().addCloseButton().createContent().ensureCloseMethod().bindEvents();
      activeToasts.set(this.id, this);
    }
    applyBaseStyles() {
      this.element.classList.add("toast");
      if (this.options.className) {
        const classes = Array.isArray(this.options.className) ? this.options.className : [this.options.className];
        classes.forEach((cls) => this.element.classList.add(cls));
      }
      return this;
    }
    createContent() {
      this.content = document.createElement("div");
      this.content.classList.add("toast-content");
      if (this.options.text) {
        this.content.textContent = this.options.text;
      }
      if (this.options.node) {
        this.content.appendChild(this.options.node);
      }
      if (this.options.style) {
        this.applyStyles(this.content, this.options.style);
      }
      if (this.options.showProgress) {
        this.progress = document.createElement("div");
        this.progress.classList.add("toast-progress");
        this.content.appendChild(this.progress);
      }
      this.element.appendChild(this.content);
      return this;
    }
    addCloseButton() {
      if (this.options.close) {
        this.closeButton = document.createElement("span");
        this.closeButton.className = "toast-close";
        this.closeButton.textContent = "🗙";
        this.closeButtonHandler = () => this.hide("close-button");
        this.closeButton.addEventListener("click", this.closeButtonHandler);
        this.element.appendChild(this.closeButton);
      }
      return this;
    }
    setToastRect() {
      if (!this.element.classList.contains("show")) offscreenContainer.appendChild(this.element);
      this.element.style.removeProperty("--toast-height");
      this.element.style.removeProperty("--toast-width");
      this.element.style.setProperty("max-height", "none", "important");
      this.element.style.setProperty("max-width", `${this.root.getBoundingClientRect().width}px`, "important");
      const { height, width } = this.element.getBoundingClientRect();
      this.element.style.setProperty("--toast-height", `${height}px`);
      this.element.style.setProperty("--toast-width", `${width}px`);
      this.element.style.removeProperty("max-height");
      this.element.style.removeProperty("max-width");
      if (!this.element.classList.contains("show")) offscreenContainer.removeChild(this.element);
      return this;
    }
    ensureCloseMethod() {
      if (isNullOrUndefined(this.options.duration) && isNullOrUndefined(this.options.close) && isNullOrUndefined(this.options.onClick)) {
        this.options.onClick = () => this.hide("other");
      }
      return this;
    }
    bindEvents() {
      if (this.stopOnFocus && !isNullOrUndefined(this.options.duration) && this.options.duration > 0) {
        this.mouseOverHandler = () => delTimeout(this);
        this.mouseLeaveHandler = () => addTimeout(this, () => this.hide("timeout"));
        this.element.addEventListener("mouseover", this.mouseOverHandler);
        this.element.addEventListener("mouseleave", this.mouseLeaveHandler);
      }
      if (!isNullOrUndefined(this.options.onClick)) {
        this.clickHandler = this.options.onClick.bind(this);
        this.element.addEventListener("click", this.clickHandler);
      }
      return this;
    }
    applyStyles(element, styles) {
      function camelToKebab(str) {
        return str.replace(/([A-Z])/g, "-$1").toLowerCase();
      }
      for (const key in styles) {
        const value = styles[key];
        const property = camelToKebab(key);
        if (isNullOrUndefined(value)) {
          element.style.removeProperty(property);
          continue;
        }
        const important = value.includes("!important");
        const cleanValue = value.replace(/\s*!important\s*/, "").trim();
        element.style.setProperty(property, cleanValue, important ? "important" : "");
      }
    }
    toggleAnimationState(animation) {
      if (!this.element.classList.replace(animation ? "hide" : "show", animation ? "show" : "hide")) {
        this.element.classList.add(animation ? "show" : "hide");
      }
      return this;
    }
    insertToastElement() {
      if (this.oldestFirst) {
        this.root.insertBefore(this.element, this.root.firstChild);
      } else {
        if (this.root.lastChild) {
          this.root.insertBefore(this.element, this.root.lastChild.nextSibling);
        } else {
          this.root.appendChild(this.element);
        }
      }
      return this;
    }
    setupAutoHide() {
      if (!isNullOrUndefined(this.options.duration) && this.options.duration > 0) {
        addTimeout(this, () => this.hide("timeout"));
      }
      return this;
    }
    show() {
      this.setToastRect().insertToastElement().toggleAnimationState(true).setupAutoHide();
      return this;
    }
    showToast() {
      return this.show();
    }
    removeEventListeners() {
      if (this.mouseOverHandler) {
        this.element.removeEventListener("mouseover", this.mouseOverHandler);
      }
      if (this.mouseLeaveHandler) {
        this.element.removeEventListener("mouseleave", this.mouseLeaveHandler);
      }
      if (this.clickHandler) {
        this.element.removeEventListener("click", this.clickHandler);
      }
      if (this.options.close && this.closeButton && this.closeButtonHandler) {
        this.closeButton.removeEventListener("click", this.closeButtonHandler);
      }
      return this;
    }
    hide(reason = "other") {
      if (!this.element) return;
      delTimeout(this);
      activeToasts.delete(this.id);
      this.animationEndHandler = (e) => {
        if (e.animationName.startsWith("toast-out")) {
          this.element.removeEventListener("animationend", this.animationEndHandler);
          this.element.remove();
          this.options.onClose?.call(this, new CustomEvent("toast-close", {
            detail: { reason }
          }));
        }
      };
      this.element.addEventListener("animationend", this.animationEndHandler);
      this.removeEventListeners().toggleAnimationState(false);
    }
    hideToast() {
      this.hide("other");
    }
  };
  function createToast(options) {
    return new Toast(options);
  }
  globalThis.Toast = createToast;
  globalThis.Toastify = createToast;
  (document.body ?? document.documentElement).appendChild(offscreenContainer);
  window.addEventListener("resize", debounce(() => {
    for (const [_, toast] of activeToasts) {
      toast.setToastRect();
    }
  }, 100));
  async function refreshToken() {
    const { authorization } = config;
    if (!isLoggedIn()) throw new Error(`Refresh token failed: Not logged in`);
    const refreshToken2 = localStorage.getItem("token") ?? authorization;
    if (isNullOrUndefined(refreshToken2) || refreshToken2.isEmpty()) {
      throw new Error(`Refresh token failed: no refresh token`);
    }
    const oldAccessToken = localStorage.getItem("accessToken");
    try {
      const res = await unlimitedFetch(
        "https://api.iwara.tv/user/token",
        {
          method: "POST",
          headers: {
            Authorization: `Bearer ${refreshToken2}`
          }
        }
      );
      if (!res.ok) {
        throw new Error(`Refresh token failed with status: ${res.status}`);
      }
      const { accessToken } = await res.json();
      if (!accessToken) {
        throw new Error(`No access token in response`);
      }
      if (!oldAccessToken || oldAccessToken !== accessToken) {
        localStorage.setItem("accessToken", accessToken);
      }
      return accessToken;
    } catch (error) {
      originalConsole.warn("Failed to refresh token:", error);
      if (!oldAccessToken?.trim()) {
        throw new Error(`Refresh token failed and no valid access token available`);
      }
      return oldAccessToken;
    }
  }
  async function getAuth(url) {
    return prune({
      "Accept": "application/json",
      "Cooike": unsafeWindow.document.cookie,
      "Authorization": isLoggedIn() ? `Bearer ${localStorage.getItem("accessToken") ?? await refreshToken()}` : void 0,
      "X-Version": !isNullOrUndefined(url) && !url.isEmpty() ? await getXVersion(url) : void 0
    });
  }
  function checkIsHaveDownloadLink(comment) {
    if (!config.checkDownloadLink || isNullOrUndefined(comment) || comment.isEmpty()) {
      return false;
    }
    return [
      "iwara.zip",
      "pan.baidu",
      "/s/",
      "mega.nz",
      "drive.google.com",
      "aliyundrive",
      "uploadgig",
      "katfile",
      "storex",
      "subyshare",
      "rapidgator",
      "filebe",
      "filespace",
      "mexa.sh",
      "mexashare",
      "mx-sh.net",
      "icerbox",
      "alfafile",
      "1drv.ms",
      "onedrive.",
      "gofile.io",
      "workupload.com",
      "pixeldrain.",
      "dailyuploads.net",
      "katfile.com",
      "fikper.com",
      "frdl.io",
      "rg.to",
      "gigafile.nu"
    ].filter((i3) => comment.toLowerCase().includes(i3)).any();
  }
  function toastNode(body, title) {
    return renderNode({
      nodeType: "div",
      childs: [
        !isNullOrUndefined(title) && !title.isEmpty() ? {
          nodeType: "h3",
          childs: `%#appName#% - ${title}`
        } : {
          nodeType: "h3",
          childs: "%#appName#%"
        },
        {
          nodeType: "p",
          childs: body
        }
      ]
    });
  }
  function getTextNode(node) {
    return node.nodeType === Node.TEXT_NODE ? node.textContent || "" : node.nodeType === Node.ELEMENT_NODE ? Array.from(node.childNodes).map(getTextNode).join("") : "";
  }
  function newToast(type, params) {
    const logFunc = {
      [2]: originalConsole.warn,
      [3]: originalConsole.error,
      [0]: originalConsole.log,
      [1]: originalConsole.info
    }[type] || originalConsole.log;
    if (isNullOrUndefined(params)) params = {};
    if (!isNullOrUndefined(params.id) && activeToasts.has(params.id)) activeToasts.get(params.id)?.hide();
    switch (type) {
      case 1:
        params = Object.assign({
          duration: 2e3,
          style: {
            background: "linear-gradient(-30deg, rgb(0, 108, 215), rgb(0, 180, 255))"
          }
        }, params);
      case 2:
        params = Object.assign({
          duration: -1,
          style: {
            background: "linear-gradient(-30deg, rgb(119, 76, 0), rgb(255, 165, 0))"
          }
        }, params);
        break;
      case 3:
        params = Object.assign({
          duration: -1,
          style: {
            background: "linear-gradient(-30deg, rgb(108, 0, 0), rgb(215, 0, 0))"
          }
        }, params);
      default:
        break;
    }
    if (!isNullOrUndefined(params.text)) {
      params.text = params.text.replaceVariable(i18nList[config.language]).toString();
    }
    logFunc((!isNullOrUndefined(params.text) ? params.text : !isNullOrUndefined(params.node) ? getTextNode(params.node) : "undefined").replaceVariable(i18nList[config.language]));
    return new Toast(params);
  }
  function getDownloadPath(videoInfo) {
    return analyzeLocalPath(
      config.downloadPath.trim().replaceVariable({
        NowTime: new Date(),
        UploadTime: new Date(videoInfo.UploadTime),
        AUTHOR: videoInfo.Author,
        ID: videoInfo.ID,
        TITLE: videoInfo.Title.normalize("NFKC").replaceAll(new RegExp("(\\P{Mark})(\\p{Mark}+)", "gu"), "_").replace(/^\.|[\\\\/:*?\"<>|]/img, "_").truncate(72),
        ALIAS: videoInfo.Alias.normalize("NFKC").replaceAll(new RegExp("(\\P{Mark})(\\p{Mark}+)", "gu"), "_").replace(/^\.|[\\\\/:*?\"<>|]/img, "_").truncate(64),
        QUALITY: videoInfo.DownloadQuality
      })
    );
  }
  function analyzeLocalPath(path) {
    try {
      return new Path(path);
    } catch (error) {
      let toast = newToast(
        3,
        {
          node: toastNode([
            `%#downloadPathError#%`,
            { nodeType: "br" },
            stringify(error)
          ], "%#settingsCheck#%"),
          position: "center",
          onClick() {
            toast.hide();
          }
        }
      );
      toast.show();
      throw new Error(`%#downloadPathError#% ["${path}"]`);
    }
  }
  async function EnvCheck() {
    try {
      if (GM_info.scriptHandler !== "ScriptCat" && GM_info.downloadMode !== "browser") {
        GM_getValue("isDebug") && originalConsole.debug("[Debug]", GM_info);
        throw new Error("%#browserDownloadModeError#%");
      }
    } catch (error) {
      let toast = newToast(
        3,
        {
          node: toastNode([
            `%#configError#%`,
            { nodeType: "br" },
            stringify(error)
          ], "%#settingsCheck#%"),
          position: "center",
          onClick() {
            toast.hide();
          }
        }
      );
      toast.show();
      return false;
    }
    return true;
  }
  async function localPathCheck() {
    try {
      let pathTest = analyzeLocalPath(config.downloadPath.replaceVariable({
        NowTime: new Date(),
        UploadTime: new Date(),
        AUTHOR: "test",
        ID: "test",
        TITLE: "test",
        ALIAS: "test",
        QUALITY: "test"
      }));
      if (isNullOrUndefined(pathTest)) throw "analyzeLocalPath error";
      if (pathTest.fullPath.isEmpty()) throw "analyzeLocalPath isEmpty";
    } catch (error) {
      let toast = newToast(
        3,
        {
          node: toastNode([
            `%#downloadPathError#%`,
            { nodeType: "br" },
            stringify(error)
          ], "%#settingsCheck#%"),
          position: "center",
          onClick() {
            toast.hide();
          }
        }
      );
      toast.show();
      return false;
    }
    return true;
  }
  async function aria2Check() {
    try {
      let res = await (await unlimitedFetch(config.aria2Path, {
        method: "POST",
        headers: {
          "accept": "application/json",
          "content-type": "application/json"
        },
        body: JSON.stringify({
          "jsonrpc": "2.0",
          "method": "aria2.tellActive",
          "id": UUID(),
          "params": ["token:" + config.aria2Token]
        })
      })).json();
      if (res.error) {
        throw new Error(res.error.message);
      }
    } catch (error) {
      let toast = newToast(
        3,
        {
          node: toastNode([
            `Aria2 RPC %#connectionTest#%`,
            { nodeType: "br" },
            stringify(error)
          ], "%#settingsCheck#%"),
          position: "center",
          onClick() {
            toast.hide();
          }
        }
      );
      toast.show();
      return false;
    }
    return true;
  }
  async function iwaradlCheck() {
    try {
      let res = await (await unlimitedFetch(config.iwaradlPath, {
        method: "POST",
        headers: {
          "accept": "application/json",
          "content-type": "application/json"
        },
        body: JSON.stringify(prune({
          "ver": GM_getValue("version", "0.0.0").split(".").map((i3) => Number(i3)),
          "code": "State",
          "token": config.iwaradlToken
        }))
      })).json();
      if (res.code !== 0) {
        throw new Error(res.msg);
      }
    } catch (error) {
      let toast = newToast(
        3,
        {
          node: toastNode([
            `iwaradl RPC %#connectionTest#%`,
            { nodeType: "br" },
            stringify(error)
          ], "%#settingsCheck#%"),
          position: "center",
          onClick() {
            toast.hide();
          }
        }
      );
      toast.show();
      return false;
    }
    return true;
  }
  function aria2Download(videoInfo) {
    (async function(videoInfo2) {
      let localPath = getDownloadPath(videoInfo2);
      let downloadUrl = videoInfo2.DownloadUrl.toURL();
      downloadUrl.searchParams.set("videoid", videoInfo2.ID);
      downloadUrl.searchParams.set("download", localPath.fullName);
      let params = [
        [downloadUrl.href],
        prune({
          "all-proxy": config.downloadProxy,
          "all-proxy-passwd": !config.downloadProxy.isEmpty() ? config.downloadProxyPassword : void 0,
          "all-proxy-user": !config.downloadProxy.isEmpty() ? config.downloadProxyUsername : void 0,
          "out": localPath.fullName,
          "dir": localPath.directory,
          "referer": window.location.hostname,
          "header": [
            "Cookie:" + unsafeWindow.document.cookie
          ]
        })
      ];
      let res = await aria2API("aria2.addUri", params);
      originalConsole.log(`Aria2 ${videoInfo2.Title} ${JSON.stringify(res)}`);
      newToast(
        1,
        {
          gravity: "bottom",
          node: toastNode(`${videoInfo2.Title}[${videoInfo2.ID}] %#pushTaskSucceed#%`)
        }
      ).show();
    })(videoInfo);
  }
  function iwaradlDownload(videoInfo) {
    (async function(videoInfo2) {
      let r2 = await (await unlimitedFetch(config.iwaradlPath, {
        method: "POST",
        headers: {
          "accept": "application/json",
          "content-type": "application/json"
        },
        body: JSON.stringify(prune({
          "ver": GM_getValue("version", "0.0.0").split(".").map((i3) => Number(i3)),
          "code": "add",
          "token": config.iwaradlToken,
          "data": {
            "info": {
              "title": videoInfo2.Title,
              "url": videoInfo2.DownloadUrl,
              "size": videoInfo2.Size,
              "source": videoInfo2.ID,
              "alias": videoInfo2.Alias,
              "author": videoInfo2.Author,
              "uploadTime": videoInfo2.UploadTime,
              "comments": videoInfo2.Comments,
              "tags": videoInfo2.Tags,
              "quality": videoInfo2.DownloadQuality,
              "path": config.downloadPath.replaceVariable(
                {
                  NowTime: new Date(),
                  UploadTime: videoInfo2.UploadTime,
                  AUTHOR: videoInfo2.Author,
                  ID: videoInfo2.ID,
                  TITLE: videoInfo2.Title,
                  ALIAS: videoInfo2.Alias,
                  QUALITY: videoInfo2.DownloadQuality
                }
              )
            },
            "option": {
              "proxy": config.downloadProxy,
              "cookies": unsafeWindow.document.cookie
            }
          }
        }))
      })).json();
      if (r2.code === 0) {
        originalConsole.log(`${videoInfo2.Title} %#pushTaskSucceed#% ${r2}`);
        newToast(
          1,
          {
            node: toastNode(`${videoInfo2.Title}[${videoInfo2.ID}] %#pushTaskSucceed#%`)
          }
        ).show();
      } else {
        let toast = newToast(
          3,
          {
            node: toastNode([
              `${videoInfo2.Title}[${videoInfo2.ID}] %#pushTaskFailed#% `,
              { nodeType: "br" },
              r2.msg
            ], "%#iwaradlDownload#%"),
            onClick() {
              toast.hide();
            }
          }
        );
        toast.show();
      }
    })(videoInfo);
  }
  function othersDownload(videoInfo) {
    (async function(DownloadUrl) {
      DownloadUrl.searchParams.set("download", getDownloadPath(videoInfo).fullName);
      GM_openInTab(DownloadUrl.href, { active: false, insert: true, setParent: true });
    })(videoInfo.DownloadUrl.toURL());
  }
  function browserDownloadErrorParse(error) {
    let errorInfo = stringify(error);
    if (!(error instanceof Error)) {
      errorInfo = {
        "not_enabled": `%#browserDownloadNotEnabled#%`,
        "not_whitelisted": `%#browserDownloadNotWhitelisted#%`,
        "not_permitted": `%#browserDownloadNotPermitted#%`,
        "not_supported": `%#browserDownloadNotSupported#%`,
        "not_succeeded": `%#browserDownloadNotSucceeded#% ${isNullOrUndefined(error.details) ? "UnknownError" : error.details}`
      }[error.error] || `%#browserDownloadUnknownError#%`;
    }
    return errorInfo;
  }
  function browserDownload(videoInfo) {
    (async function(videoInfo2) {
      function toastError(error) {
        let toast = newToast(
          3,
          {
            node: toastNode([
              `${videoInfo2.Title}[${videoInfo2.ID}] %#downloadFailed#%`,
              { nodeType: "br" },
              browserDownloadErrorParse(error),
              { nodeType: "br" },
              `%#tryRestartingDownload#%`
            ], "%#browserDownload#%"),
            async onClick() {
              toast.hide();
              await pushDownloadTask(videoInfo2);
            }
          }
        );
        toast.show();
      }
      GM_download({
        url: videoInfo2.DownloadUrl,
        saveAs: false,
        name: getDownloadPath(videoInfo2).fullPath,
        onerror: (err) => toastError(err),
        ontimeout: () => toastError(new Error("%#browserDownloadTimeout#%"))
      });
    })(videoInfo);
  }
  async function aria2API(method, params) {
    return await (await unlimitedFetch(config.aria2Path, {
      headers: {
        "accept": "application/json",
        "content-type": "application/json"
      },
      body: JSON.stringify({
        jsonrpc: "2.0",
        method,
        id: UUID(),
        params: [`token:${config.aria2Token}`, ...params]
      }),
      method: "POST"
    })).json();
  }
  function aria2TaskExtractVideoID(task) {
    try {
      if (isNullOrUndefined(task.files) || task.files.length !== 1) return;
      const file = task.files[0];
      if (isNullOrUndefined(file)) return;
      if (file.uris.length < 1) return;
      let downloadUrl = file.uris[0].uri.toURL();
      if (isNullOrUndefined(downloadUrl)) return;
      let videoID;
      if (downloadUrl.searchParams.has("videoid")) videoID = downloadUrl.searchParams.get("videoid");
      if (!isNullOrUndefined(videoID) && !videoID.isEmpty()) return videoID;
      if (isNullOrUndefined(file.path) || file.path.isEmpty()) return;
      let path = analyzeLocalPath(file.path);
      if (isNullOrUndefined(path.fullName) || path.fullName.isEmpty()) return;
      videoID = path.fullName.toLowerCase().among("[", "].mp4", false, true);
      if (videoID.isEmpty()) return;
      return videoID;
    } catch (error) {
      GM_getValue("isDebug") && originalConsole.debug(`[Debug] check aria2 task file fail! ${stringify(task)}`);
      return;
    }
  }
  async function aria2TaskCheckAndRestart() {
    let stoped = prune(
      (await aria2API(
        "aria2.tellStopped",
        [
          0,
          4096,
          [
            "gid",
            "status",
            "files",
            "errorCode",
            "bittorrent"
          ]
        ]
      )).result.filter(
        (task) => isNullOrUndefined(task.bittorrent)
      ).map(
        (task) => {
          let ID = aria2TaskExtractVideoID(task);
          if (!isNullOrUndefined(ID) && !ID.isEmpty()) {
            return {
              id: ID,
              data: task
            };
          }
        }
      )
    );
    let active = prune(
      (await aria2API(
        "aria2.tellActive",
        [
          [
            "gid",
            "status",
            "files",
            "downloadSpeed",
            "bittorrent"
          ]
        ]
      )).result.filter(
        (task) => isNullOrUndefined(task.bittorrent)
      ).map(
        (task) => {
          let ID = aria2TaskExtractVideoID(task);
          if (!isNullOrUndefined(ID) && !ID.isEmpty()) {
            return {
              id: ID,
              data: task
            };
          }
        }
      )
    );
    let downloadNormalTasks = active.filter(
      (task) => isConvertibleToNumber(task.data.downloadSpeed) && Number(task.data.downloadSpeed) >= 512
    ).unique("id");
    let downloadCompleted = stoped.filter(
      (task) => task.data.status === "complete"
    ).unique("id");
    let downloadUncompleted = stoped.difference(downloadCompleted, "id").difference(downloadNormalTasks, "id");
    let downloadToSlowTasks = active.filter(
      (task) => isConvertibleToNumber(task.data.downloadSpeed) && Number(task.data.downloadSpeed) <= 512
    ).unique("id");
    let needRestart = downloadUncompleted.union(downloadToSlowTasks, "id");
    if (needRestart.length !== 0) {
      newToast(
        2,
        {
          id: "aria2TaskCheckAndRestart",
          node: toastNode(
            [
              `发现 ${needRestart.length} 个需要重启的下载任务!`,
              { nodeType: "br" },
              "%#tryRestartingDownload#%"
            ],
            "%#aria2TaskCheck#%"
          ),
          async onClick() {
            this.hide();
            for (let i3 = 0; i3 < needRestart.length; i3++) {
              const task = needRestart[i3];
              await pushDownloadTask(await parseVideoInfo({
                Type: "init",
                ID: task.id
              }), true);
              let activeTasks = active.filter(
                (activeTask) => activeTask.id === task.id
              );
              for (let t2 = 0; t2 < activeTasks.length; t2++) {
                const element = activeTasks[t2];
                await aria2API("aria2.forceRemove", [element.data.gid]);
              }
            }
          }
        }
      ).show();
    } else {
      newToast(1, {
        id: "aria2TaskCheckAndRestart",
        duration: 1e4,
        node: toastNode(
          `未发现需要重启的下载任务!`
        )
      }).show();
    }
  }
  function getPlayload(authorization) {
    return JSON.parse(decodeURIComponent(encodeURIComponent(window.atob(authorization.split(" ").pop().split(".")[1]))));
  }
  async function check() {
    if (await localPathCheck()) {
      switch (config.downloadType) {
        case 0:
          return await aria2Check();
        case 1:
          return await iwaradlCheck();
        case 2:
          return await EnvCheck();
        default:
          break;
      }
      return true;
    } else {
      return false;
    }
  }
  async function getXVersion(urlString) {
    let url = urlString.toURL();
    const data = new TextEncoder().encode([url.pathname.split("/").pop(), url.searchParams.get("expires"), "5nFp9kmbNnHdAFhaqMvt"].join("_"));
    const hashBuffer = await crypto.subtle.digest("SHA-1", data);
    return Array.from(new Uint8Array(hashBuffer)).map((b2) => b2.toString(16).padStart(2, "0")).join("");
  }
  async function getCommentData(id, commentID, page = 0) {
    return await (await unlimitedFetch(`https://api.iwara.tv/video/${id}/comments?page=${page}${!isNullOrUndefined(commentID) && !commentID.isEmpty() ? "&parent=" + commentID : ""}`, { headers: await getAuth() })).json();
  }
  async function getCommentDatas(id, commentID) {
    let comments = [];
    let base = await getCommentData(id, commentID);
    comments.push(...base.results);
    for (let page = 1; page < Math.ceil(base.count / base.limit); page++) {
      comments.push(...(await getCommentData(id, commentID, page)).results);
    }
    let replies = [];
    for (let index = 0; index < comments.length; index++) {
      const comment = comments[index];
      if (comment.numReplies > 0) {
        replies.push(...await getCommentDatas(id, comment.id));
      }
    }
    comments.push(...replies);
    return comments;
  }
  async function parseVideoInfo(info) {
    let ID = info.ID;
    let Type = info.Type;
    let RAW = info.RAW;
    try {
      switch (info.Type) {
        case "cache":
          RAW = info.RAW;
          ID = RAW.id;
          Type = "partial";
          break;
        case "init":
        case "fail":
        case "partial":
        case "full":
          GM_getValue("isDebug") && originalConsole.debug(`[debug] try parse full source`);
          let sourceResult = await (await unlimitedFetch(
            `https://api.iwara.tv/video/${info.ID}`,
            {
              headers: await getAuth()
            },
            {
              retry: true,
              maxRetries: 3,
              failStatuses: [403, 404],
              retryDelay: 1e3,
              onRetry: async () => {
                await refreshToken();
              }
            }
          )).json();
          if (isNullOrUndefined(sourceResult.id)) {
            Type = "fail";
            return {
              ID,
              Type,
              RAW,
              Msg: sourceResult.message ?? stringify(sourceResult)
            };
          }
          RAW = sourceResult;
          ID = RAW.id;
          Type = "full";
          break;
        default:
          Type = "fail";
          return {
            ID,
            Type,
            RAW,
            Msg: "Unknown type"
          };
      }
    } catch (error) {
      newToast(
        3,
        {
          node: toastNode([
            `${info.RAW?.title}[${ID}] %#parsingFailed#%`
          ], "%#createTask#%"),
          async onClick() {
            await parseVideoInfo({ Type: "init", ID, RAW, UploadTime: 0 });
            this.hide();
          }
        }
      ).show();
      Type = "fail";
      return {
        ID,
        Type,
        RAW,
        Msg: stringify(error)
      };
    }
    let FileName;
    let Size;
    let External;
    let ExternalUrl;
    let Description;
    let DownloadQuality;
    let DownloadUrl;
    let Comments;
    let UploadTime;
    let Title;
    let Tags;
    let Liked;
    let Alias;
    let Author;
    let AuthorID;
    let Private;
    let Unlisted;
    let Following;
    let Friend;
    UploadTime = new Date(RAW.createdAt ?? 0).getTime();
    Title = RAW.title;
    Tags = RAW.tags;
    Liked = RAW.liked;
    Alias = RAW.user.name;
    Author = RAW.user.username;
    AuthorID = RAW.user.id;
    Private = RAW.private;
    Unlisted = RAW.unlisted;
    External = !isNullOrUndefined(RAW.embedUrl) && !RAW.embedUrl.isEmpty();
    ExternalUrl = RAW.embedUrl;
    if (External) {
      Type = "fail";
      return {
        Type,
        RAW,
        ID,
        Alias,
        Author,
        AuthorID,
        Private,
        UploadTime,
        Title,
        Tags,
        Liked,
        External,
        ExternalUrl,
        Description,
        Unlisted,
        Msg: "external Video"
      };
    }
    try {
      switch (Type) {
        case "full":
          Following = RAW.user.following;
          Friend = RAW.user.friend;
          if (Following) {
            await db.putFollow(RAW.user);
          } else {
            await db.deleteFollow(AuthorID);
          }
          if (Friend) {
            await db.putFriend(RAW.user);
          } else {
            await db.deleteFriend(AuthorID);
          }
          Description = RAW.body;
          FileName = RAW.file.name;
          Size = RAW.file.size;
          let VideoFileSource = (await (await unlimitedFetch(RAW.fileUrl, { headers: await getAuth(RAW.fileUrl) })).json()).sort((a3, b2) => (!isNullOrUndefined(config.priority[b2.name]) ? config.priority[b2.name] : 0) - (!isNullOrUndefined(config.priority[a3.name]) ? config.priority[a3.name] : 0));
          if (isNullOrUndefined(VideoFileSource) || !(VideoFileSource instanceof Array) || VideoFileSource.length < 1) throw new Error(i18nList[config.language].getVideoSourceFailed.toString());
          if (VideoFileSource.some((x2) => x2.src.download.toURL().host === "mikoto.iwara.tv" || x2.src.view.toURL().host === "mikoto.iwara.tv")) {
            VideoFileSource.forEach((item) => {
              if (item.src.download.toURL().host === "mikoto.iwara.tv") {
                item.src.download = item.src.download.replace("mikoto.iwara.tv", "hime.iwara.tv");
              }
              if (item.src.view.toURL().host === "mikoto.iwara.tv") {
                item.src.view = item.src.view.replace("mikoto.iwara.tv", "hime.iwara.tv");
              }
            });
          }
          DownloadQuality = config.checkPriority ? config.downloadPriority : VideoFileSource[0].name;
          let fileList = VideoFileSource.filter((x2) => x2.name === DownloadQuality);
          if (!fileList.any()) throw new Error(i18nList[config.language].noAvailableVideoSource.toString());
          let Source = fileList[Math.floor(Math.random() * fileList.length)].src.download;
          if (isNullOrUndefined(Source) || Source.isEmpty()) throw new Error(i18nList[config.language].videoSourceNotAvailable.toString());
          DownloadUrl = decodeURIComponent(`https:${Source}`);
          GM_getValue("isDebug") && originalConsole.debug(`[debug] try parse all comment`);
          Comments = `${(await getCommentDatas(ID)).map((i3) => i3.body).join("\n")}`.normalize("NFKC");
          return {
            Type,
            RAW,
            ID,
            Alias,
            Author,
            AuthorID,
            Private,
            UploadTime,
            Title,
            Tags,
            Liked,
            External,
            FileName,
            DownloadQuality,
            ExternalUrl,
            Description,
            Comments,
            DownloadUrl,
            Size,
            Following,
            Unlisted,
            Friend
          };
        case "partial":
          return {
            Type,
            RAW,
            ID,
            Alias,
            Author,
            AuthorID,
            UploadTime,
            Title,
            Tags,
            Liked,
            External,
            ExternalUrl,
            Unlisted,
            Private
          };
        default:
          Type = "fail";
          return {
            Type,
            RAW,
            ID,
            Alias,
            Author,
            AuthorID,
            Private,
            UploadTime,
            Title,
            Tags,
            Liked,
            External,
            ExternalUrl,
            Description,
            Unlisted,
            Msg: "Unknown type"
          };
      }
    } catch (error) {
      Type = "fail";
      return {
        Type,
        RAW,
        ID,
        Alias,
        Author,
        AuthorID,
        Private,
        UploadTime,
        Title,
        Tags,
        Liked,
        External,
        ExternalUrl,
        Description,
        Unlisted,
        Msg: stringify(error)
      };
    }
  }
  function generateMatadataURL(videoInfo) {
    const metadataContent = generateMetadataContent(videoInfo);
    const blob = new Blob([metadataContent], { type: "text/plain" });
    return URL.createObjectURL(blob);
  }
  function getMatadataPath(videoInfo) {
    const videoPath = getDownloadPath(videoInfo);
    return `${videoPath.directory}/${videoPath.baseName}.json`;
  }
  function generateMetadataContent(videoInfo) {
    const metadata = Object.assign(videoInfo, {
      DownloadPath: getDownloadPath(videoInfo).fullPath,
      MetaDataVersion: GM_info.script.version
    });
    return JSON.stringify(metadata, (key, value) => {
      if (value instanceof Date) {
        return value.toISOString();
      }
      return value;
    }, 2);
  }
  function browserDownloadMetadata(videoInfo) {
    const url = generateMatadataURL(videoInfo);
    function toastError(error) {
      newToast(
        3,
        {
          node: toastNode([
            `${videoInfo.Title}[${videoInfo.ID}] %#videoMetadata#% %#downloadFailed#%`,
            { nodeType: "br" },
            browserDownloadErrorParse(error)
          ], "%#browserDownload#%"),
          close: true
        }
      ).show();
    }
    GM_download({
      url,
      saveAs: false,
      name: getMatadataPath(videoInfo),
      onerror: (err) => toastError(err),
      ontimeout: () => toastError(new Error("%#browserDownloadTimeout#%")),
      onload: () => URL.revokeObjectURL(url)
    });
  }
  function othersDownloadMetadata(videoInfo) {
    const url = generateMatadataURL(videoInfo);
    const metadataFile = analyzeLocalPath(getMatadataPath(videoInfo)).fullName;
    const downloadHandle = renderNode({
      nodeType: "a",
      attributes: {
        href: url,
        download: metadataFile
      }
    });
    downloadHandle.click();
    downloadHandle.remove();
    URL.revokeObjectURL(url);
  }
  async function addDownloadTask() {
    let textArea = renderNode({
      nodeType: "textarea",
      attributes: {
        placeholder: i18nList[config.language].manualDownloadTips,
        style: "margin-bottom: 10px;",
        rows: "16",
        cols: "96"
      }
    });
    let body = renderNode({
      nodeType: "div",
      attributes: {
        id: "pluginOverlay"
      },
      childs: [
        textArea,
        {
          nodeType: "button",
          events: {
            click: (e) => {
              if (!isNullOrUndefined(textArea.value) && !textArea.value.isEmpty()) {
                let list = [];
                try {
                  const parsed = JSON.parse(textArea.value);
                  if (Array.isArray(parsed)) {
                    list = parsed.map((item) => {
                      if (Array.isArray(item) && isString(item[0]) && !item[0].isEmpty()) {
                        if (!isVideoInfo(item[1])) {
                          item[1].Type = "init";
                          item[1].ID = item[1].ID ?? item[0];
                          item[1].UpdateTime = item[1].UpdateTime ?? Date.now();
                        }
                      }
                      return [...item];
                    });
                  } else {
                    throw new Error("解析结果不是符合预期的列表");
                  }
                } catch (error) {
                  list = textArea.value.split("|").map((ID) => [ID.trim(), {
                    Type: "init",
                    ID: ID.trim(),
                    UpdateTime: Date.now()
                  }]);
                }
                if (list.length > 0) {
                  analyzeDownloadTask(new Dictionary(list));
                }
              }
              body.remove();
            }
          },
          childs: i18nList[config.language].ok
        }
      ]
    });
    unsafeWindow.document.body.appendChild(body);
  }
  async function downloadTaskUnique(taskList) {
    let stoped = prune(
      (await aria2API(
        "aria2.tellStopped",
        [
          0,
          4096,
          [
            "gid",
            "status",
            "files",
            "errorCode",
            "bittorrent"
          ]
        ]
      )).result.filter(
        (task) => isNullOrUndefined(task.bittorrent)
      ).map(
        (task) => {
          let ID = aria2TaskExtractVideoID(task);
          if (!isNullOrUndefined(ID) && !ID.isEmpty()) {
            return {
              id: ID,
              data: task
            };
          }
        }
      )
    );
    let active = prune(
      (await aria2API(
        "aria2.tellActive",
        [
          [
            "gid",
            "status",
            "files",
            "downloadSpeed",
            "bittorrent"
          ]
        ]
      )).result.filter(
        (task) => isNullOrUndefined(task.bittorrent)
      ).map(
        (task) => {
          let ID = aria2TaskExtractVideoID(task);
          if (!isNullOrUndefined(ID) && !ID.isEmpty()) {
            return {
              id: ID,
              data: task
            };
          }
        }
      )
    );
    let downloadCompleted = stoped.filter(
      (task) => task.data.status === "complete"
    ).unique("id");
    let startedAndCompleted = [...active, ...downloadCompleted].map((i3) => i3.id);
    for (let key of taskList.keysArray().intersect(startedAndCompleted)) {
      taskList.delete(key);
    }
  }
  async function analyzeDownloadTask(taskList = selectList) {
    let size = taskList.size;
    let node = renderNode({
      nodeType: "p",
      childs: `${i18nList[config.language].parsingProgress}[${taskList.size}/${size}]`
    });
    let parsingProgressToast = newToast(1, {
      node,
      duration: -1
    });
    function updateParsingProgress() {
      node.firstChild.textContent = `${i18nList[config.language].parsingProgress}[${taskList.size}/${size}]`;
    }
    parsingProgressToast.show();
    if (config.experimentalFeatures && config.downloadType === 0) {
      await downloadTaskUnique(taskList);
      updateParsingProgress();
    }
    for (let [id, info] of taskList) {
      await pushDownloadTask(await parseVideoInfo(info));
      taskList.delete(id);
      updateParsingProgress();
      !config.enableUnsafeMode && await delay(3e3);
    }
    parsingProgressToast.hide();
    newToast(
      1,
      {
        text: `%#allCompleted#%`,
        duration: -1,
        close: true,
        onClick() {
          this.hide();
        }
      }
    ).show();
  }
  async function pushDownloadTask(videoInfo, bypass = false) {
    switch (videoInfo.Type) {
      case "full":
        await db.putVideo(videoInfo);
        if (!bypass) {
          const authorInfo = await db.getFollowById(videoInfo.AuthorID);
          if (config.autoFollow && (!authorInfo?.following || !videoInfo.Following)) {
            await unlimitedFetch(
              `https://api.iwara.tv/user/${videoInfo.AuthorID}/followers`,
              {
                method: "POST",
                headers: await getAuth()
              },
              {
                retry: true,
                successStatus: 201,
                failStatuses: [404],
                onFail: async (res) => {
                  newToast(2, {
                    text: `${videoInfo.Alias} %#autoFollowFailed#% ${res.status}`,
                    close: true,
                    onClick() {
                      this.hide();
                    }
                  }).show();
                },
                onRetry: async () => {
                  await refreshToken();
                }
              }
            );
          }
          if (config.autoLike && !videoInfo.Liked) {
            await unlimitedFetch(
              `https://api.iwara.tv/video/${videoInfo.ID}/like`,
              {
                method: "POST",
                headers: await getAuth()
              },
              {
                retry: true,
                successStatus: 201,
                failStatuses: [404],
                onFail: async (res) => {
                  newToast(2, {
                    text: `${videoInfo.Alias} %#autoLikeFailed#% ${res.status}`,
                    close: true,
                    onClick() {
                      this.hide();
                    }
                  }).show();
                },
                onRetry: async () => {
                  await refreshToken();
                }
              }
            );
          }
          if (config.checkDownloadLink && checkIsHaveDownloadLink(`${videoInfo.Description} ${videoInfo.Comments}`)) {
            let toastBody = toastNode([
              `${videoInfo.Title}[${videoInfo.ID}] %#findedDownloadLink#%`,
              { nodeType: "br" },
              `%#openVideoLink#%`
            ], "%#createTask#%");
            newToast(
              2,
              {
                node: toastBody,
                close: config.autoCopySaveFileName,
                onClick() {
                  GM_openInTab(`https://www.iwara.tv/video/${videoInfo.ID}`, { active: false, insert: true, setParent: true });
                  if (config.autoCopySaveFileName) {
                    GM_setClipboard(getDownloadPath(videoInfo).fullName, "text");
                    toastBody.appendChild(renderNode({
                      nodeType: "p",
                      childs: "%#copySucceed#%"
                    }));
                  } else {
                    this.hide();
                  }
                }
              }
            ).show();
            return;
          }
        }
        if (config.checkPriority && videoInfo.DownloadQuality !== config.downloadPriority) {
          newToast(
            2,
            {
              node: toastNode([
                `${videoInfo.Title.truncate(64)}[${videoInfo.ID}] %#downloadQualityError#%`,
                { nodeType: "br" },
                `%#tryReparseDownload#%`
              ], "%#createTask#%"),
              async onClick() {
                this.hide();
                await pushDownloadTask(await parseVideoInfo(videoInfo));
              }
            }
          ).show();
          return;
        }
        switch (config.downloadType) {
          case 0:
            aria2Download(videoInfo);
            break;
          case 1:
            iwaradlDownload(videoInfo);
            break;
          case 2:
            browserDownload(videoInfo);
            break;
          default:
            othersDownload(videoInfo);
            break;
        }
        if (config.autoDownloadMetadata) {
          switch (config.downloadType) {
            case 3:
              othersDownloadMetadata(videoInfo);
              break;
            case 2:
              browserDownloadMetadata(videoInfo);
              break;
            default:
              break;
          }
          GM_getValue("isDebug") && originalConsole.debug("[Debug] Download task pushed:", videoInfo);
        }
        selectList.delete(videoInfo.ID);
        break;
      case "partial":
        const partialCache = await db.getVideoById(videoInfo.ID);
        if (!isNullOrUndefined(partialCache) && partialCache.Type !== "full") await db.putVideo(videoInfo);
      case "cache":
      case "init":
        return await pushDownloadTask(await parseVideoInfo(videoInfo));
      case "fail":
        const cache = await db.getVideoById(videoInfo.ID);
        newToast(
          3,
          {
            close: true,
            node: toastNode([
              `${videoInfo.Title ?? videoInfo.RAW?.title ?? cache?.RAW?.title}[${videoInfo.ID}] %#parsingFailed#%`,
              { nodeType: "br" },
              videoInfo.Msg,
              { nodeType: "br" },
              videoInfo.External ? `%#openVideoLink#%` : `%#tryReparseDownload#%`
            ], "%#createTask#%"),
            async onClick() {
              this.hide();
              if (videoInfo.External && !isNullOrUndefined(videoInfo.ExternalUrl) && !videoInfo.ExternalUrl.isEmpty()) {
                GM_openInTab(videoInfo.ExternalUrl, { active: false, insert: true, setParent: true });
              } else {
                await pushDownloadTask(await parseVideoInfo({ Type: "init", ID: videoInfo.ID, RAW: videoInfo.RAW ?? cache?.RAW }));
              }
            }
          }
        ).show();
        break;
      default:
        GM_getValue("isDebug") && originalConsole.debug("[Debug] Unknown type:", videoInfo);
        break;
    }
  }
  function uninjectCheckbox(element) {
    if (element instanceof HTMLElement) {
      if (element instanceof HTMLInputElement && element.classList.contains("selectButton")) {
        element.hasAttribute("videoID") && pageSelectButtons.delete(element.getAttribute("videoID"));
      }
      if (element.querySelector("input.selectButton")) {
        element.querySelectorAll(".selectButton").forEach((i3) => i3.hasAttribute("videoID") && pageSelectButtons.delete(i3.getAttribute("videoID")));
      }
    }
  }
  async function injectCheckbox(element) {
    let ID = element.querySelector("a.videoTeaser__thumbnail").href.toURL().pathname.split("/")[2];
    if (isNullOrUndefined(ID)) return;
    let info = await db.getVideoById(ID);
    let Title = info?.Type === "full" || info?.Type === "partial" ? info?.Title : info?.RAW?.title ?? element.querySelector(".videoTeaser__title")?.getAttribute("title") ?? void 0;
    let Alias = info?.Type === "full" || info?.Type === "partial" ? info?.Alias : info?.RAW?.user.name ?? element.querySelector("a.username")?.getAttribute("title") ?? void 0;
    let Author = info?.Type === "full" || info?.Type === "partial" ? info?.Author : info?.RAW?.user.username ?? element.querySelector("a.username")?.href.toURL().pathname.split("/").pop();
    let UploadTime = info?.Type === "full" || info?.Type === "partial" ? info?.UploadTime : new Date(info?.RAW?.updatedAt ?? 0).getTime();
    let button = renderNode({
      nodeType: "input",
      attributes: {
        type: "checkbox",
        videoID: ID,
        checked: selectList.has(ID) ? true : void 0,
        videoName: Title,
        videoAlias: Alias,
        videoAuthor: Author,
        videoUploadTime: UploadTime
      },
      className: "selectButton",
      events: {
        click: (event) => {
          event.target.checked ? selectList.set(ID, {
            Type: "init",
            ID,
            Title,
            Alias,
            Author,
            UploadTime
          }) : selectList.delete(ID);
          event.stopPropagation();
          event.stopImmediatePropagation();
          return false;
        }
      }
    });
    let item = element.querySelector(".videoTeaser__thumbnail")?.parentElement;
    item?.style.setProperty("position", "relative");
    pageSelectButtons.set(ID, button);
    originalNodeAppendChild.call(item, button);
    if (!isNullOrUndefined(Author)) {
      const AuthorInfo = await db.getFollowByUsername(Author);
      if (AuthorInfo?.following && element.querySelector(".videoTeaser__thumbnail")?.querySelector(".follow") === null) {
        originalNodeAppendChild.call(element.querySelector(".videoTeaser__thumbnail"), renderNode(
          {
            nodeType: "div",
            className: "follow",
            childs: {
              nodeType: "div",
              className: ["text", "text--white", "text--tiny", "text--bold"],
              childs: "%#following#%"
            }
          }
        ));
      }
    }
    if (getPageType() === "playlist") {
      let deletePlaylistItme = renderNode({
        nodeType: "button",
        attributes: {
          videoID: ID
        },
        childs: "%#delete#%",
        className: "deleteButton",
        events: {
          click: async (event) => {
            if ((await unlimitedFetch(`https://api.iwara.tv/playlist/${unsafeWindow.location.pathname.split("/")[2]}/${ID}`, {
              method: "DELETE",
              headers: await getAuth()
            })).ok) {
              newToast(1, { text: `${Title} %#deleteSucceed#%`, close: true }).show();
              deletePlaylistItme.remove();
            }
            event.preventDefault();
            event.stopPropagation();
            event.stopImmediatePropagation();
            return false;
          }
        }
      });
      originalNodeAppendChild.call(item, deletePlaylistItme);
    }
  }
  var configEdit = class {
    source;
    target;
    interfacePage;
    interface;
    constructor(config2) {
      this.target = config2;
      this.target.configChange = (item) => {
        this.configChange.call(this, item);
      };
      this.interfacePage = renderNode({
        nodeType: "p"
      });
      let save = renderNode({
        nodeType: "button",
        childs: "%#save#%",
        attributes: {
          title: i18nList[config2.language].save
        },
        events: {
          click: async () => {
            save.disabled = !save.disabled;
            if (await check()) {
              unsafeWindow.location.reload();
            }
            save.disabled = !save.disabled;
          }
        }
      });
      let reset = renderNode({
        nodeType: "button",
        childs: "%#reset#%",
        attributes: {
          title: i18nList[config2.language].reset
        },
        events: {
          click: () => {
            GM_setValue("isFirstRun", true);
            unsafeWindow.location.reload();
          }
        }
      });
      this.interface = renderNode({
        nodeType: "div",
        attributes: {
          id: "pluginConfig"
        },
        childs: [
          {
            nodeType: "div",
            className: "main",
            childs: [
              {
                nodeType: "h2",
                childs: "%#appName#%"
              },
              {
                nodeType: "label",
                childs: [
                  "%#language#% ",
                  {
                    nodeType: "input",
                    className: "inputRadioLine",
                    attributes: {
                      name: "language",
                      type: "text",
                      value: this.target.language
                    },
                    events: {
                      change: (event) => {
                        this.target.language = event.target.value;
                      }
                    }
                  }
                ]
              },
              this.downloadTypeSelect(),
              this.interfacePage,
              this.switchButton("checkPriority"),
              this.switchButton("checkDownloadLink"),
              this.switchButton("autoFollow"),
              this.switchButton("autoLike"),
              this.switchButton("filterLikedVideos"),
              this.switchButton("autoInjectCheckbox"),
              this.switchButton("autoDownloadMetadata"),
              this.switchButton("autoCopySaveFileName"),
              this.switchButton("addUnlistedAndPrivate"),
              this.switchButton("experimentalFeatures"),
              this.switchButton("enableUnsafeMode"),
              this.switchButton("isDebug", GM_getValue, (name, e) => {
                GM_setValue(name, e.target.checked);
                unsafeWindow.location.reload();
              }, false)
            ]
          },
          {
            nodeType: "p",
            className: "buttonList",
            childs: [
              reset,
              save
            ]
          }
        ]
      });
    }
    switchButton(name, get, set, defaultValue) {
      return renderNode({
        nodeType: "p",
        className: "inputRadioLine",
        childs: [
          {
            nodeType: "label",
            childs: `%#${name}#%`,
            attributes: {
              for: name
            }
          },
          {
            nodeType: "input",
            className: "switch",
            attributes: {
              type: "checkbox",
              name,
              checked: get !== void 0 ? get(name, defaultValue) : this.target[name] ?? defaultValue ?? false
            },
            events: {
              change: (e) => {
                if (set !== void 0) {
                  set(name, e);
                  return;
                } else {
                  this.target[name] = e.target.checked;
                }
              }
            }
          }
        ]
      });
    }
    inputComponent(name, type, help, get, set) {
      return renderNode({
        nodeType: "label",
        childs: [
          {
            nodeType: "span",
            childs: [
              `%#${name}#%`,
              help
            ]
          },
          {
            nodeType: "input",
            attributes: {
              name,
              type: type ?? "text",
              value: get !== void 0 ? get(name) : this.target[name]
            },
            events: {
              change: (e) => {
                if (set !== void 0) {
                  set(name, e);
                  return;
                } else {
                  this.target[name] = e.target.value;
                }
              }
            }
          }
        ]
      });
    }
    downloadTypeSelect() {
      return renderNode({
        nodeType: "fieldset",
        childs: [
          {
            nodeType: "legend",
            childs: "%#downloadType#%"
          },
          ...Object.keys(DownloadType).filter((i3) => isNaN(Number(i3))).map(
            (type, index) => renderNode({
              nodeType: "label",
              childs: [
                {
                  nodeType: "input",
                  attributes: {
                    type: "radio",
                    name: "downloadType",
                    value: index,
                    checked: index === Number(this.target.downloadType)
                  },
                  events: {
                    change: (e) => {
                      this.target.downloadType = Number(e.target.value);
                    }
                  }
                },
                type
              ]
            })
          )
        ]
      });
    }
    configChange(item) {
      switch (item) {
        case "downloadType":
          const radios = this.interface.querySelectorAll(`[name=${item}]`);
          radios.forEach((radio) => {
            radio.checked = Number(radio.value) === Number(this.target.downloadType);
          });
          this.pageChange();
          break;
        case "checkPriority":
          this.pageChange();
          break;
        default:
          let element = this.interface.querySelector(`[name=${item}]`);
          if (element) {
            switch (element.type) {
              case "radio":
                element.value = this.target[item];
                break;
              case "checkbox":
                element.checked = this.target[item];
                break;
              case "text":
              case "password":
                element.value = this.target[item];
                break;
              default:
                break;
            }
          }
          break;
      }
    }
    pageChange() {
      while (this.interfacePage.hasChildNodes()) {
        this.interfacePage.removeChild(this.interfacePage.firstChild);
      }
      let downloadConfigInput = [
        this.inputComponent("downloadPath", "text", renderNode({
          nodeType: "a",
          childs: "%#variable#%",
          className: "rainbow-text",
          attributes: {
            style: "float: inline-end;",
            href: "https://github.com/dawn-lc/IwaraDownloadTool/wiki/路径可用变量"
          }
        }))
      ];
      let proxyConfigInput = [
        this.inputComponent("downloadProxy"),
        this.inputComponent("downloadProxyUsername"),
        this.inputComponent("downloadProxyPassword", "password")
      ];
      let aria2ConfigInput = [
        this.inputComponent("aria2Path"),
        this.inputComponent("aria2Token", "password"),
        ...proxyConfigInput
      ];
      let iwaradlConfigInput = [
        this.inputComponent("iwaradlPath"),
        this.inputComponent("iwaradlToken", "password"),
        ...proxyConfigInput
      ];
      switch (this.target.downloadType) {
        case 0:
          downloadConfigInput.map((i3) => originalNodeAppendChild.call(this.interfacePage, i3));
          aria2ConfigInput.map((i3) => originalNodeAppendChild.call(this.interfacePage, i3));
          break;
        case 1:
          downloadConfigInput.map((i3) => originalNodeAppendChild.call(this.interfacePage, i3));
          iwaradlConfigInput.map((i3) => originalNodeAppendChild.call(this.interfacePage, i3));
          break;
        default:
          downloadConfigInput.map((i3) => originalNodeAppendChild.call(this.interfacePage, i3));
          break;
      }
      if (this.target.checkPriority) {
        originalNodeAppendChild.call(this.interfacePage, this.inputComponent("downloadPriority"));
      }
    }
    inject() {
      if (!unsafeWindow.document.querySelector("#pluginConfig")) {
        originalNodeAppendChild.call(unsafeWindow.document.body, this.interface);
        this.configChange("downloadType");
      }
    }
  };
  var menu = class {
    observer;
    pageType;
    interface;
    interfacePage;
    constructor() {
      let body = new Proxy(this, {
        set: (target, prop, value) => {
          if (prop === "pageType") {
            if (isNullOrUndefined(value) || this.pageType === value) return true;
            target[prop] = value;
            this.pageChange();
            GM_getValue("isDebug") && originalConsole.debug(`[Debug] Page change to ${this.pageType}`);
            return true;
          }
          return target[prop] = value;
        }
      });
      body.interfacePage = renderNode({
        nodeType: "ul"
      });
      body.interface = renderNode({
        nodeType: "div",
        attributes: {
          id: "pluginMenu"
        },
        childs: body.interfacePage
      });
      let mouseoutTimer = null;
      originalAddEventListener.call(body.interface, "mouseover", (event) => {
        if (mouseoutTimer !== null) {
          clearTimeout(mouseoutTimer);
          mouseoutTimer = null;
        }
        body.interface.classList.add("expanded");
      });
      originalAddEventListener.call(body.interface, "mouseout", (event) => {
        const e = event;
        const relatedTarget = e.relatedTarget;
        if (relatedTarget && body.interface.contains(relatedTarget)) {
          return;
        }
        mouseoutTimer = setTimeout(() => {
          body.interface.classList.remove("expanded");
          mouseoutTimer = null;
        }, 300);
      });
      originalAddEventListener.call(body.interface, "click", (event) => {
        if (event.target === body.interface) {
          body.interface.classList.toggle("expanded");
        }
      });
      body.observer = new MutationObserver((mutationsList) => body.pageType = getPageType(mutationsList) ?? body.pageType);
      body.pageType = "page";
      return body;
    }
    button(name, click) {
      return renderNode({
        nodeType: "li",
        childs: `%#${name}#%`,
        events: {
          click: (event) => {
            !isNullOrUndefined(click) && click(name, event);
            event.stopPropagation();
            return false;
          }
        }
      });
    }
    async parseUnlistedAndPrivate() {
      if (!isLoggedIn()) return;
      const lastMonthTimestamp = Date.now() - 30 * 24 * 60 * 60 * 1e3;
      const thisMonthUnlistedAndPrivateVideos = await db.getFilteredVideos(lastMonthTimestamp, Infinity);
      let parseUnlistedAndPrivateVideos = [];
      let pageCount = 0;
      const MAX_FIND_PAGES = 64;
      GM_getValue("isDebug") && originalConsole.debug(`[Debug] Starting fetch loop. MAX_PAGES=${MAX_FIND_PAGES}`);
      while (pageCount < MAX_FIND_PAGES) {
        GM_getValue("isDebug") && originalConsole.debug(`[Debug] Fetching page ${pageCount}.`);
        const response = await unlimitedFetch(
          `https://api.iwara.tv/videos?subscribed=true&limit=50&rating=${rating()}&page=${pageCount}`,
          { method: "GET", headers: await getAuth() },
          {
            retry: true,
            retryDelay: 1e3,
            onRetry: async () => {
              await refreshToken();
            }
          }
        );
        GM_getValue("isDebug") && originalConsole.debug("[Debug] Received response, parsing JSON.");
        const data = (await response.json()).results;
        GM_getValue("isDebug") && originalConsole.debug(`[Debug] Page ${pageCount} returned ${data.length} videos.`);
        data.forEach((info) => info.user.following = true);
        const videoPromises = data.map((info) => parseVideoInfo({
          Type: "cache",
          ID: info.id,
          RAW: info
        }));
        GM_getValue("isDebug") && originalConsole.debug("[Debug] Initializing VideoInfo promises.");
        const videoInfos = await Promise.all(videoPromises);
        parseUnlistedAndPrivateVideos.push(...videoInfos);
        let test = videoInfos.filter((i3) => i3.Type === "partial" && (i3.Private || i3.Unlisted)).any();
        GM_getValue("isDebug") && originalConsole.debug("[Debug] All VideoInfo objects initialized.");
        if (test && thisMonthUnlistedAndPrivateVideos.intersect(videoInfos, "ID").any()) {
          GM_getValue("isDebug") && originalConsole.debug(`[Debug] Found private video on page ${pageCount}.`);
          break;
        }
        GM_getValue("isDebug") && originalConsole.debug(`[Debug] Latest private video not found on page ${pageCount}, continuing.`);
        pageCount++;
        GM_getValue("isDebug") && originalConsole.debug(`[Debug] Incremented page to ${pageCount}, delaying next fetch.`);
        await delay(100);
      }
      GM_getValue("isDebug") && originalConsole.debug("[Debug] Fetch loop ended. Start updating the database");
      const existingVideos = await db.getVideosByIds(parseUnlistedAndPrivateVideos.map((v2) => v2.ID));
      const toUpdate = parseUnlistedAndPrivateVideos.difference(
        existingVideos.filter((v2) => v2.Type === "full"),
        "ID"
      );
      if (toUpdate.any()) {
        GM_getValue("isDebug") && originalConsole.debug(`[Debug] Need to update ${toUpdate.length} pieces of data.`);
        await db.bulkPutVideos(toUpdate);
        GM_getValue("isDebug") && originalConsole.debug(`[Debug] Update Completed.`);
      } else {
        GM_getValue("isDebug") && originalConsole.debug(`[Debug] No need to update data.`);
      }
    }
    async pageChange() {
      while (this.interfacePage.hasChildNodes()) {
        this.interfacePage.removeChild(this.interfacePage.firstChild);
      }
      let manualDownloadButton = this.button("manualDownload", (name, event) => {
        addDownloadTask();
      });
      let settingsButton = this.button("settings", (name, event) => {
        editConfig.inject();
      });
      let exportConfigButton = this.button("exportConfig", (name, event) => {
        GM_setClipboard(stringify(config));
        newToast(
          1,
          {
            node: toastNode(i18nList[config.language].exportConfigSucceed),
            duration: 3e3,
            gravity: "bottom",
            position: "center",
            onClick() {
              this.hide();
            }
          }
        ).show();
      });
      let baseButtons = [
        manualDownloadButton,
        exportConfigButton,
        settingsButton
      ];
      let injectCheckboxButton = this.button("injectCheckbox", (name, event) => {
        if (unsafeWindow.document.querySelector(".selectButton")) {
          unsafeWindow.document.querySelectorAll(".selectButton").forEach((element) => {
            element.remove();
          });
        } else {
          unsafeWindow.document.querySelectorAll(`.videoTeaser`).forEach((element) => {
            injectCheckbox(element);
          });
        }
      });
      let deselectAllButton = this.button("deselectAll", (name, event) => {
        for (const id of selectList.keys()) {
          selectList.delete(id);
        }
      });
      let reverseSelectButton = this.button("reverseSelect", (name, event) => {
        unsafeWindow.document.querySelectorAll(".selectButton").forEach((element) => {
          element.click();
        });
      });
      let selectThisButton = this.button("selectThis", (name, event) => {
        unsafeWindow.document.querySelectorAll(".selectButton").forEach((element) => {
          let button = element;
          !button.checked && button.click();
        });
      });
      let deselectThisButton = this.button("deselectThis", (name, event) => {
        unsafeWindow.document.querySelectorAll(".selectButton").forEach((element) => {
          let button = element;
          button.checked && button.click();
        });
      });
      let downloadSelectedButton = this.button("downloadSelected", (name, event) => {
        analyzeDownloadTask();
        newToast(1, {
          text: `%#${name}#%`,
          close: true
        }).show();
      });
      let selectButtons = [
        injectCheckboxButton,
        deselectAllButton,
        reverseSelectButton,
        selectThisButton,
        deselectThisButton,
        downloadSelectedButton
      ];
      let downloadThisButton = this.button("downloadThis", async (name, event) => {
        let ID = unsafeWindow.location.href.toURL().pathname.split("/")[2];
        await pushDownloadTask(await parseVideoInfo({
          Type: "init",
          ID
        }), true);
      });
      let aria2TaskCheckButton = this.button("aria2TaskCheck", (name, event) => {
        aria2TaskCheckAndRestart();
      });
      config.experimentalFeatures && originalNodeAppendChild.call(this.interfacePage, aria2TaskCheckButton);
      switch (this.pageType) {
        case "video":
          originalNodeAppendChild.call(this.interfacePage, downloadThisButton);
          selectButtons.map((i3) => originalNodeAppendChild.call(this.interfacePage, i3));
          baseButtons.map((i3) => originalNodeAppendChild.call(this.interfacePage, i3));
          break;
        case "search":
        case "profile":
        case "home":
        case "videoList":
        case "subscriptions":
        case "playlist":
        case "favorites":
        case "account":
          selectButtons.map((i3) => originalNodeAppendChild.call(this.interfacePage, i3));
          baseButtons.map((i3) => originalNodeAppendChild.call(this.interfacePage, i3));
          break;
        case "page":
        case "forum":
        case "image":
        case "imageList":
        case "forumSection":
        case "forumThread":
        default:
          baseButtons.map((i3) => originalNodeAppendChild.call(this.interfacePage, i3));
          break;
      }
      if (config.addUnlistedAndPrivate && this.pageType === "videoList") {
        this.parseUnlistedAndPrivate();
      } else {
        GM_getValue("isDebug") && originalConsole.debug("[Debug] Conditions not met: addUnlistedAndPrivate or pageType mismatch.");
      }
    }
    inject() {
      this.observer.observe(unsafeWindow.document.getElementById("app"), { childList: true, subtree: true });
      if (!unsafeWindow.document.querySelector("#pluginMenu")) {
        originalNodeAppendChild.call(unsafeWindow.document.body, this.interface);
        this.pageType = getPageType() ?? this.pageType;
      }
    }
  };
  var waterMark = class {
    debugSwitchCount = 0;
    selected = renderNode({
      nodeType: "span",
      childs: ` %#selected#% ${selectList.size} `
    });
    debugFlag = renderNode({
      nodeType: "span",
      childs: `${GM_getValue("isDebug") ? `${i18nList[config.language].isDebug} ${GM_info.scriptHandler}` : ""}`
    });
    bdoy = renderNode({
      nodeType: "p",
      className: "fixed-bottom-right",
      childs: [
        `%#appName#% ${GM_getValue("version")} `,
        this.selected,
        this.debugFlag
      ],
      events: {
        click: (e) => {
          if (GM_getValue("isDebug")) return;
          if (this.debugSwitchCount < 5) {
            this.debugSwitchCount++;
            return;
          } else {
            GM_setValue("isDebug", true);
            this.debugFlag.textContent = `${GM_getValue("isDebug") ? i18nList[config.language].isDebug : ""}`;
            unsafeWindow.location.reload();
          }
        }
      }
    });
    constructor() {
      originalNodeAppendChild.call(unsafeWindow.document.body, this.bdoy);
      return this;
    }
  };
  function handleAuthorizationHeader(init) {
    if (!init || !init.headers) return;
    let authorization = null;
    if (init.headers instanceof Headers) {
      authorization = init.headers.has("Authorization") ? init.headers.get("Authorization") : null;
    } else if (Array.isArray(init.headers)) {
      const index = init.headers.findIndex(([key]) => key.toLowerCase() === "authorization");
      if (index >= 0) authorization = init.headers[index][1];
    } else if (typeof init.headers === "object") {
      for (const key in init.headers) {
        if (key.toLowerCase() === "authorization") {
          authorization = init.headers[key];
          break;
        }
      }
    }
    if (!authorization) return;
    const payload = getPlayload(authorization);
    const token = authorization.split(" ").pop();
    if (payload["type"] === "refresh_token" && !isUndefined(token)) {
      localStorage.setItem("token", token);
      config.authorization = token;
      GM_getValue("isDebug") && originalConsole.debug(`[Debug] refresh_token: 凭证已隐藏`);
    }
  }
  async function handleUserTokenResponse(response) {
    const cloneResponse = response.clone();
    if (!cloneResponse.ok) return;
    const { accessToken } = await cloneResponse.json();
    const token = localStorage.getItem("accessToken");
    if (isNull(token) || token !== accessToken) {
      localStorage.setItem("accessToken", accessToken);
    }
  }
  async function handleVideosResponse(response, url) {
    const cloneResponse = response.clone();
    if (!cloneResponse.ok) return response;
    const cloneBody = await cloneResponse.json();
    const rawVideos = cloneBody.results;
    const parsePromises = rawVideos.map(
      (info) => parseVideoInfo({ Type: "cache", ID: info.id, RAW: info })
    );
    const settled = await Promise.allSettled(parsePromises);
    const list = settled.filter((i3) => i3.status === "fulfilled").map((i3) => i3.value).filter((i3) => i3.Type === "partial" || i3.Type === "full");
    const ids = list.map((v2) => v2.ID);
    const existing = await db.getVideosByIds(ids);
    const fullVideos = existing.filter((v2) => v2.Type === "full");
    const toUpdate = list.difference(fullVideos, "ID");
    if (toUpdate.any()) {
      await db.bulkPutVideos(toUpdate);
    }
    if (config.filterLikedVideos) {
      cloneBody.results = rawVideos.filter((i3) => !i3.liked);
    }
    if (!config.addUnlistedAndPrivate) return response;
    if (url.searchParams.has("user")) return response;
    if (url.searchParams.has("subscribed")) return response;
    if (url.searchParams.has("sort") && url.searchParams.get("sort") !== "date") return response;
    const sortedList = list.sort((a3, b2) => a3.UploadTime - b2.UploadTime);
    if (sortedList.length === 0) return response;
    const minTime = sortedList[0].UploadTime;
    const maxTime = sortedList[sortedList.length - 1].UploadTime;
    const startTime = new Date(minTime).sub({ hours: 4 }).getTime();
    const endTime = new Date(maxTime).add({ hours: 4 }).getTime();
    const cacheVideos = (await db.getFilteredVideos(startTime, endTime)).filter((i3) => i3.Type === "partial" || i3.Type === "full").sort((a3, b2) => b2.UploadTime - a3.UploadTime).map((i3) => i3.RAW);
    cloneBody.results.push(...cacheVideos);
    cloneBody.count += cacheVideos.length;
    cloneBody.limit += cacheVideos.length;
    return new Response(JSON.stringify(cloneBody), {
      status: cloneResponse.status,
      statusText: cloneResponse.statusText,
      headers: Object.fromEntries(cloneResponse.headers.entries())
    });
  }
  async function handleVideoFileResponse(response) {
    const cloneResponse = response.clone();
    if (!cloneResponse.ok) return response;
    const cloneBody = await cloneResponse.json();
    if (cloneBody.some((x2) => x2.src.download.toURL().host === "mikoto.iwara.tv" || x2.src.view.toURL().host === "mikoto.iwara.tv")) {
      cloneBody.forEach((item) => {
        if (item.src.download.toURL().host === "mikoto.iwara.tv") {
          item.src.download = item.src.download.replace("mikoto.iwara.tv", "hime.iwara.tv");
        }
        if (item.src.view.toURL().host === "mikoto.iwara.tv") {
          item.src.view = item.src.view.replace("mikoto.iwara.tv", "hime.iwara.tv");
        }
      });
    }
    return new Response(JSON.stringify(cloneBody), {
      status: cloneResponse.status,
      statusText: cloneResponse.statusText,
      headers: Object.fromEntries(cloneResponse.headers.entries())
    });
  }
  function createInterceptedFetch() {
    return async function(input, init) {
      GM_getValue("isDebug") && originalConsole.debug(`[Debug] Fetch ${input}`);
      const url = (input instanceof Request ? input.url : input instanceof URL ? input.href : input).toURL();
      if (!isUndefined(init) && init.headers) {
        handleAuthorizationHeader(init);
      }
      return new Promise(
        (resolve, reject) => originalFetch(input, init).then(async (response) => {
          if (!url.pathname.isEmpty()) {
            const path = url.pathname.toLowerCase().split("/").slice(1);
            if (url.hostname === "files.iwara.tv") {
              switch (path[0]) {
                case "file":
                  return resolve(await handleVideoFileResponse(response));
                default:
                  break;
              }
            }
            if (url.hostname === "api.iwara.tv") {
              switch (path[0]) {
                case "user":
                  if (path[1] === "token") await handleUserTokenResponse(response);
                  break;
                case "videos":
                  return resolve(await handleVideosResponse(response, url));
                default:
                  break;
              }
            }
          }
          return resolve(response);
        }).catch((err) => reject(err))
      );
    };
  }
  var main_default = '@keyframes rainbow-horizontal{0%{background-position:0% 0%}to{background-position:200% 0%}}@keyframes rainbow-vertical{0%{background-position:0% 0%}to{background-position:0% 200%}}.rainbow-text{background-image:linear-gradient(to right,#ff4040,#ffff40,#40ff40,#40ffff,#4040ff,#ff40ff,#ff4040);background-size:200% 100%;background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent;animation:rainbow-horizontal .8s infinite linear;font-weight:700}#pluginMenu{z-index:2147483644;position:fixed;top:50%;right:0;padding:10px 26px;background-color:var(--body-dark);border:1px solid var(--text);border-radius:5px;box-shadow:0 0 10px var(--text);transform:translate(calc(100% - 26px)) translateY(-50%);transition:transform .3s ease-in-out}#pluginMenu:not(.expanded){overflow:visible}#pluginMenu:not(.expanded):before{content:"";mask:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgLTk2MCA5NjAgOTYwIj48cGF0aCBkPSJNNTYwLTI0MCAzMjAtNDgwbDI0MC0yNDAgNTYgNTYtMTg0IDE4NCAxODQgMTg0LTU2IDU2WiIvPjwvc3ZnPg==) no-repeat center;-webkit-mask:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgLTk2MCA5NjAgOTYwIj48cGF0aCBkPSJNNTYwLTI0MCAzMjAtNDgwbDI0MC0yNDAgNTYgNTYtMTg0IDE4NCAxODQgMTg0LTU2IDU2WiIvPjwvc3ZnPg==) no-repeat center;background-color:var(--text);width:24px;height:24px;position:absolute;left:0;top:50%;line-height:0;transform:translateY(-50%)}#pluginMenu.expanded{transform:translate(0) translateY(-50%)}#pluginMenu ul{list-style:none;margin:0;padding:0}#pluginMenu li{padding:5px 10px;cursor:pointer;text-align:center;user-select:none;color:var(--text)}#pluginMenu li:hover{background-color:var(--primary-dark);border-radius:3px}#pluginConfig{color:var(--text);position:fixed;top:0;left:0;width:100%;height:100%;background-color:#000000bf;z-index:2147483646;display:flex;flex-direction:column;align-items:center;justify-content:center}#pluginConfig .main{background-color:var(--body);padding:24px;margin:10px;overflow-y:auto;width:480px}#pluginConfig .buttonList{display:flex;flex-direction:row;justify-content:center}@media(max-width:640px){#pluginConfig .main{width:100%;height:80%}}#pluginConfig button{background-color:var(--primary);margin:0 20px;padding:10px 20px;color:var(--primary-text);font-size:18px;border:none;border-radius:4px;cursor:pointer}#pluginConfig button{background-color:var(--primary)}#pluginConfig button[disabled]{background-color:var(--muted);cursor:not-allowed}#pluginConfig p{display:flex;flex-direction:column;margin-top:10px;margin-bottom:0}#pluginConfig fieldset{border:none;margin:10px 0 0;padding:0;display:flex;justify-content:space-between;flex-wrap:nowrap}#pluginConfig fieldset>legend{margin:0 0 5px;padding:0}#pluginConfig fieldset>label{text-align:center}#pluginConfig p label{display:flex;flex-direction:column;margin:5px 0 0}#pluginConfig .inputRadioLine{display:flex;align-items:center;flex-direction:row;justify-content:space-between}#pluginConfig input[type=text],#pluginConfig input[type=password]{outline:none;border-top:none;border-right:none;border-left:none;border-image:initial;border-bottom:1px solid var(--muted);line-height:1;height:30px;box-sizing:border-box;width:100%;background-color:var(--body);color:var(--text)}#pluginConfig input[type=checkbox].switch{outline:none;appearance:none;-webkit-appearance:none;-moz-appearance:none;position:relative;width:40px;height:20px;background:var(--muted);border-radius:10px;transition:border-color .2s,background-color .2s}#pluginConfig input[type=checkbox].switch:after{content:"";display:inline-block;width:40%;height:80%;border-radius:50%;background:var(--white);box-shadow:0,0,2px,var(--muted);transition:.2s;top:2px;position:absolute;right:55%}#pluginConfig input[type=checkbox].switch:checked{background:var(--success)}#pluginConfig input[type=checkbox].switch:checked:after{content:"";position:absolute;right:2px;top:2px}#pluginOverlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#000000bf;z-index:2147483645;display:flex;flex-direction:column;align-items:center;justify-content:center}#pluginOverlay .main{color:var(--text);font-size:24px;width:60%;background-color:var(--body);padding:24px;margin:10px;overflow-y:auto}@media(max-width:640px){#pluginOverlay .main{width:100%}}#pluginOverlay button{padding:10px 20px;color:var(--primary-text);font-size:18px;border:none;border-radius:4px;cursor:pointer}#pluginOverlay button{background-color:var(--primary)}#pluginOverlay button[disabled]{background-color:var(--muted);cursor:not-allowed}#pluginOverlay .checkbox{width:32px;height:32px;margin:0 4px 0 0;padding:0}#pluginOverlay .checkbox-container{display:flex;align-items:center;margin:0 0 10px}#pluginOverlay .checkbox-label{color:var(--text);font-size:32px;font-weight:700;margin-left:10px;display:flex;align-items:center}.fixed-bottom-right{position:fixed;bottom:0;right:0;background-color:var(--body);color:var(--text);border-top:1px solid var(--primary);border-left:1px solid var(--primary);border-top-left-radius:6px;padding:2px 5px;margin:0;user-select:none;z-index:102}.follow{bottom:24px;right:2px;border-radius:2px;position:absolute;padding:3px 5px;background-color:#000c;pointer-events:none}.selectButton{accent-color:var(--primary);position:absolute;width:38px;height:38px;right:0;cursor:pointer;z-index:102;top:22px}.deleteButton{accent-color:var(--danger);position:absolute;width:38px;height:38px;left:0;cursor:pointer;z-index:101;border:none;padding:0;margin:3px;top:22px}.toast h3{margin:0 0 10px}.toast p{margin:0}.offscreen-container{position:absolute;visibility:hidden;pointer-events:none;max-width:480px}.toast-container{isolation:isolate;position:fixed;z-index:2147483647;display:flex;flex-direction:column;box-sizing:border-box;transition:transform calc(.6 * var(--toast-rate) * 1s) ease,opacity calc(.6 * var(--toast-rate) * 1s) ease}.toast-container.toast-top{top:0}.toast-container.toast-bottom{bottom:0}.toast-container.toast-left{left:0;align-items:flex-start}.toast-container.toast-center{left:50%;transform:translate(-50%);align-items:center}.toast-container.toast-right{right:0;align-items:flex-end}#toast-container-top-left .toast{margin:10px 0 0 10px;transform-origin:left center}#toast-container-top-center .toast{margin:10px 0 0;transform-origin:top}#toast-container-top-right .toast{margin:10px 10px 0 0;transform-origin:right center}#toast-container-bottom-left .toast{margin:0 0 10px 10px;transform-origin:left center}#toast-container-bottom-center .toast{margin:0 0 10px;transform-origin:bottom}#toast-container-bottom-right .toast{margin:0 10px 10px 0;transform-origin:right center}.toast{--toast-rate: 1;--toast-translate: 0;--toast-scale: 1;position:relative;transition:transform calc(.4s * var(--toast-rate)) cubic-bezier(.34,1.56,.64,1),opacity calc(.3s * var(--toast-rate)) ease;transform:translate3d(0,var(--toast-translate),0) scale(var(--toast-scale));max-width:480px;max-height:0px;will-change:transform,opacity;backface-visibility:hidden;contain:content;border-radius:6px;box-shadow:0 4px 8px #00000040}.toast-close{position:absolute;color:var(--text);top:5px;right:5px;cursor:pointer;font-size:12px;line-height:12px;z-index:2147483648;transform-origin:center center}.toast-content{border-radius:6px;padding:14px 18px;max-width:100%;box-sizing:border-box;background:var(--primary);color:var(--primary-text);cursor:pointer;white-space:normal;word-break:break-all;overflow:hidden;position:relative}.toast-progress{position:absolute;bottom:0;left:0;right:0;height:4px;background:#fffc;transform:scaleX(var(--toast-progress, 0));transition:transform calc(.05s * var(--toast-rate)) linear;will-change:transform;backface-visibility:hidden}.toast:hover{z-index:2147483648;--toast-scale: 1.15}.toast-container.toast-left .toast .toast-content .toast-progress{transform-origin:left}.toast-container.toast-center .toast .toast-content .toast-progress{transform-origin:center}.toast-container.toast-right .toast .toast-content .toast-progress{transform-origin:right}.toast-container.toast-top .toast.show{animation:toast-in-top calc(.3 * var(--toast-rate) * 1s) ease-in-out forwards}.toast-container.toast-bottom .toast.show{animation:toast-in-bottom calc(.3 * var(--toast-rate) * 1s) ease-in-out forwards}.toast-container.toast-top .toast.hide{animation:toast-out-top calc(.3 * var(--toast-rate) * 1s) ease-in-out forwards}.toast-container.toast-bottom .toast.hide{animation:toast-out-bottom calc(.3 * var(--toast-rate) * 1s) ease-in-out forwards}@keyframes toast-in-top{0%{opacity:0;max-height:0px}to{max-height:var(--toast-height)}}@keyframes toast-in-bottom{0%{opacity:0;max-height:0px}to{max-height:var(--toast-height)}}@keyframes toast-out-top{0%{max-height:var(--toast-height)}to{opacity:0;max-height:0px}}@keyframes toast-out-bottom{0%{max-height:var(--toast-height)}to{opacity:0;max-height:0px}}\n';
  function r(t2, n5) {
    return t2.endsWith(n5) ? t2.length === n5.length || t2[t2.length - n5.length - 1] === "." : false;
  }
  function u(t2, n5) {
    const l2 = t2.length - n5.length - 2, i3 = t2.lastIndexOf(".", l2);
    return i3 === -1 ? t2 : t2.slice(i3 + 1);
  }
  function g2(t2, n5, l2) {
    if (l2.validHosts !== null) {
      const f2 = l2.validHosts;
      for (const e of f2) if (r(n5, e)) return e;
    }
    let i3 = 0;
    if (n5.startsWith(".")) for (; i3 < n5.length && n5[i3] === "."; ) i3 += 1;
    return t2.length === n5.length - i3 ? null : u(n5, t2);
  }
  function i(t2, e) {
    return t2.slice(0, -e.length - 1);
  }
  function g3(t2, x2) {
    let e = 0, o = t2.length, l2 = false;
    if (!x2) {
      if (t2.startsWith("data:")) return null;
      for (; e < t2.length && t2.charCodeAt(e) <= 32; ) e += 1;
      for (; o > e + 1 && t2.charCodeAt(o - 1) <= 32; ) o -= 1;
      if (t2.charCodeAt(e) === 47 && t2.charCodeAt(e + 1) === 47) e += 2;
      else {
        const c2 = t2.indexOf(":/", e);
        if (c2 !== -1) {
          const i3 = c2 - e, a3 = t2.charCodeAt(e), d = t2.charCodeAt(e + 1), r2 = t2.charCodeAt(e + 2), w2 = t2.charCodeAt(e + 3), O2 = t2.charCodeAt(e + 4);
          if (!(i3 === 5 && a3 === 104 && d === 116 && r2 === 116 && w2 === 112 && O2 === 115)) {
            if (!(i3 === 4 && a3 === 104 && d === 116 && r2 === 116 && w2 === 112)) {
              if (!(i3 === 3 && a3 === 119 && d === 115 && r2 === 115)) {
                if (!(i3 === 2 && a3 === 119 && d === 115)) for (let C2 = e; C2 < c2; C2 += 1) {
                  const n5 = t2.charCodeAt(C2) | 32;
                  if (!(n5 >= 97 && n5 <= 122 || n5 >= 48 && n5 <= 57 || n5 === 46 || n5 === 45 || n5 === 43)) return null;
                }
              }
            }
          }
          for (e = c2 + 2; t2.charCodeAt(e) === 47; ) e += 1;
        }
      }
      let s = -1, h2 = -1, f2 = -1;
      for (let c2 = e; c2 < o; c2 += 1) {
        const i3 = t2.charCodeAt(c2);
        if (i3 === 35 || i3 === 47 || i3 === 63) {
          o = c2;
          break;
        } else i3 === 64 ? s = c2 : i3 === 93 ? h2 = c2 : i3 === 58 ? f2 = c2 : i3 >= 65 && i3 <= 90 && (l2 = true);
      }
      if (s !== -1 && s > e && s < o && (e = s + 1), t2.charCodeAt(e) === 91) return h2 !== -1 ? t2.slice(e + 1, h2).toLowerCase() : null;
      f2 !== -1 && f2 > e && f2 < o && (o = f2);
    }
    for (; o > e + 1 && t2.charCodeAt(o - 1) === 46; ) o -= 1;
    const A2 = e !== 0 || o !== t2.length ? t2.slice(e, o) : t2;
    return l2 ? A2.toLowerCase() : A2;
  }
  function i2(e) {
    if (e.length < 7 || e.length > 15) return false;
    let t2 = 0;
    for (let r2 = 0; r2 < e.length; r2 += 1) {
      const f2 = e.charCodeAt(r2);
      if (f2 === 46) t2 += 1;
      else if (f2 < 48 || f2 > 57) return false;
    }
    return t2 === 3 && e.charCodeAt(0) !== 46 && e.charCodeAt(e.length - 1) !== 46;
  }
  function n(e) {
    if (e.length < 3) return false;
    let t2 = e.startsWith("[") ? 1 : 0, r2 = e.length;
    if (e[r2 - 1] === "]" && (r2 -= 1), r2 - t2 > 39) return false;
    let f2 = false;
    for (; t2 < r2; t2 += 1) {
      const l2 = e.charCodeAt(t2);
      if (l2 === 58) f2 = true;
      else if (!(l2 >= 48 && l2 <= 57 || l2 >= 97 && l2 <= 102 || l2 >= 65 && l2 <= 90)) return false;
    }
    return f2;
  }
  function u2(e) {
    return n(e) || i2(e);
  }
  function n2(r2) {
    return r2 >= 97 && r2 <= 122 || r2 >= 48 && r2 <= 57 || r2 > 127;
  }
  function is_valid_default(r2) {
    if (r2.length > 255 || r2.length === 0 || !n2(r2.charCodeAt(0)) && r2.charCodeAt(0) !== 46 && r2.charCodeAt(0) !== 95) return false;
    let f2 = -1, e = -1;
    const i3 = r2.length;
    for (let t2 = 0; t2 < i3; t2 += 1) {
      const l2 = r2.charCodeAt(t2);
      if (l2 === 46) {
        if (t2 - f2 > 64 || e === 46 || e === 45 || e === 95) return false;
        f2 = t2;
      } else if (!(n2(l2) || l2 === 45 || l2 === 95)) return false;
      e = l2;
    }
    return i3 - f2 - 1 <= 63 && e !== 45;
  }
  function t({ allowIcannDomains: e = true, allowPrivateDomains: u3 = false, detectIp: r2 = true, extractHostname: n5 = true, mixedInputs: f2 = true, validHosts: l2 = null, validateHostname: s = true }) {
    return { allowIcannDomains: e, allowPrivateDomains: u3, detectIp: r2, extractHostname: n5, mixedInputs: f2, validHosts: l2, validateHostname: s };
  }
  var a2 = t({});
  function setDefaults(e) {
    return e === void 0 ? a2 : t(e);
  }
  function n3(e, t2) {
    return t2.length === e.length ? "" : e.slice(0, -t2.length - 1);
  }
  function getEmptyResult() {
    return { domain: null, domainWithoutSuffix: null, hostname: null, isIcann: null, isIp: null, isPrivate: null, publicSuffix: null, subdomain: null };
  }
  function resetResult(i3) {
    i3.domain = null, i3.domainWithoutSuffix = null, i3.hostname = null, i3.isIcann = null, i3.isIp = null, i3.isPrivate = null, i3.publicSuffix = null, i3.subdomain = null;
  }
  function parseImpl(i3, m2, t2, p3, n5) {
    const o = setDefaults(p3);
    return typeof i3 != "string" || (o.extractHostname ? o.mixedInputs ? n5.hostname = g3(i3, is_valid_default(i3)) : n5.hostname = g3(i3, false) : n5.hostname = i3, o.detectIp && n5.hostname !== null && (n5.isIp = u2(n5.hostname), n5.isIp)) ? n5 : o.validateHostname && o.extractHostname && n5.hostname !== null && !is_valid_default(n5.hostname) ? (n5.hostname = null, n5) : (m2 === 0 || n5.hostname === null || (t2(n5.hostname, o, n5), m2 === 2 || n5.publicSuffix === null) || (n5.domain = g2(n5.publicSuffix, n5.hostname, o), m2 === 3 || n5.domain === null) || (n5.subdomain = n3(n5.hostname, n5.domain), m2 === 4) || (n5.domainWithoutSuffix = i(n5.domain, n5.publicSuffix)), n5);
  }
  function fast_path_default(i3, l2, e) {
    if (!l2.allowPrivateDomains && i3.length > 3) {
      const n5 = i3.length - 1, r2 = i3.charCodeAt(n5), f2 = i3.charCodeAt(n5 - 1), c2 = i3.charCodeAt(n5 - 2), s = i3.charCodeAt(n5 - 3);
      if (r2 === 109 && f2 === 111 && c2 === 99 && s === 46) return e.isIcann = true, e.isPrivate = false, e.publicSuffix = "com", true;
      if (r2 === 103 && f2 === 114 && c2 === 111 && s === 46) return e.isIcann = true, e.isPrivate = false, e.publicSuffix = "org", true;
      if (r2 === 117 && f2 === 100 && c2 === 101 && s === 46) return e.isIcann = true, e.isPrivate = false, e.publicSuffix = "edu", true;
      if (r2 === 118 && f2 === 111 && c2 === 103 && s === 46) return e.isIcann = true, e.isPrivate = false, e.publicSuffix = "gov", true;
      if (r2 === 116 && f2 === 101 && c2 === 110 && s === 46) return e.isIcann = true, e.isPrivate = false, e.publicSuffix = "net", true;
      if (r2 === 101 && f2 === 100 && c2 === 46) return e.isIcann = true, e.isPrivate = false, e.publicSuffix = "de", true;
    }
    return false;
  }
  var exceptions = (function() {
    const a3 = [1, {}], o = [0, { city: a3 }];
    return [0, { ck: [0, { www: a3 }], jp: [0, { kawasaki: o, kitakyushu: o, kobe: o, nagoya: o, sapporo: o, sendai: o, yokohama: o }] }];
  })(), rules = (function() {
    const a3 = [1, {}], o = [2, {}], m2 = [1, { com: a3, edu: a3, gov: a3, net: a3, org: a3 }], w2 = [1, { com: a3, edu: a3, gov: a3, mil: a3, net: a3, org: a3 }], e = [0, { "*": o }], M2 = [2, { s: e }], N = [0, { relay: o }], C2 = [2, { id: o }], c2 = [1, { gov: a3 }], n5 = [0, { airflow: e, "lambda-url": o, "transfer-webapp": o }], l2 = [0, { airflow: e, "transfer-webapp": o }], O2 = [0, { "transfer-webapp": o, "transfer-webapp-fips": o }], u3 = [0, { notebook: o, studio: o }], d = [0, { labeling: o, notebook: o, studio: o }], P2 = [0, { notebook: o }], x2 = [0, { labeling: o, notebook: o, "notebook-fips": o, studio: o }], Q = [0, { notebook: o, "notebook-fips": o, studio: o, "studio-fips": o }], D2 = [0, { shop: o }], r2 = [0, { "*": a3 }], y2 = [1, { co: o }], R = [0, { objects: o }], E2 = [2, { nodes: o }], S2 = [0, { my: o }], k2 = [0, { s3: o, "s3-accesspoint": o, "s3-website": o }], T2 = [0, { s3: o, "s3-accesspoint": o }], U = [0, { direct: o }], g4 = [0, { "webview-assets": o }], h2 = [0, { vfs: o, "webview-assets": o }], v2 = [0, { "execute-api": o, "emrappui-prod": o, "emrnotebooks-prod": o, "emrstudio-prod": o, dualstack: k2, s3: o, "s3-accesspoint": o, "s3-object-lambda": o, "s3-website": o, "aws-cloud9": g4, cloud9: h2 }], z = [0, { "execute-api": o, "emrappui-prod": o, "emrnotebooks-prod": o, "emrstudio-prod": o, dualstack: T2, s3: o, "s3-accesspoint": o, "s3-object-lambda": o, "s3-website": o, "aws-cloud9": g4, cloud9: h2 }], p3 = [0, { "execute-api": o, "emrappui-prod": o, "emrnotebooks-prod": o, "emrstudio-prod": o, dualstack: k2, s3: o, "s3-accesspoint": o, "s3-object-lambda": o, "s3-website": o, "analytics-gateway": o, "aws-cloud9": g4, cloud9: h2 }], b2 = [0, { "execute-api": o, "emrappui-prod": o, "emrnotebooks-prod": o, "emrstudio-prod": o, dualstack: k2, s3: o, "s3-accesspoint": o, "s3-object-lambda": o, "s3-website": o }], j2 = [0, { s3: o, "s3-accesspoint": o, "s3-accesspoint-fips": o, "s3-fips": o, "s3-website": o }], V2 = [0, { "execute-api": o, "emrappui-prod": o, "emrnotebooks-prod": o, "emrstudio-prod": o, dualstack: j2, s3: o, "s3-accesspoint": o, "s3-accesspoint-fips": o, "s3-fips": o, "s3-object-lambda": o, "s3-website": o, "aws-cloud9": g4, cloud9: h2 }], W2 = [0, { "execute-api": o, "emrappui-prod": o, "emrnotebooks-prod": o, "emrstudio-prod": o, dualstack: j2, s3: o, "s3-accesspoint": o, "s3-accesspoint-fips": o, "s3-deprecated": o, "s3-fips": o, "s3-object-lambda": o, "s3-website": o, "analytics-gateway": o, "aws-cloud9": g4, cloud9: h2 }], ca = [0, { s3: o, "s3-accesspoint": o, "s3-accesspoint-fips": o, "s3-fips": o }], X = [0, { "execute-api": o, "emrappui-prod": o, "emrnotebooks-prod": o, "emrstudio-prod": o, dualstack: ca, s3: o, "s3-accesspoint": o, "s3-accesspoint-fips": o, "s3-fips": o, "s3-object-lambda": o, "s3-website": o }], s = [0, { auth: o }], q = [0, { auth: o, "auth-fips": o }], Y = [0, { "auth-fips": o }], Z = [0, { apps: o }], F2 = [0, { paas: o }], $ = [2, { eu: o }], G = [0, { app: o }], H = [0, { site: o }], _ = [1, { com: a3, edu: a3, net: a3, org: a3 }], I2 = [0, { j: o }], aa = [0, { dyn: o }], oa = [2, { web: o }], ea = [1, { co: a3, com: a3, edu: a3, gov: a3, net: a3, org: a3 }], ia = [0, { p: o }], sa = [0, { user: o }], f2 = [0, { cdn: o }], na = [2, { raw: e }], J = [0, { cust: o, reservd: o }], ta = [0, { cust: o }], K = [0, { s3: o }], ra = [1, { biz: a3, com: a3, edu: a3, gov: a3, info: a3, net: a3, org: a3 }], L2 = [0, { ipfs: o }], A2 = [1, { framer: o }], ua = [0, { forgot: o }], t2 = [1, { gs: a3 }], ma = [0, { nes: a3 }], i3 = [1, { k12: a3, cc: a3, lib: a3 }], la = [1, { cc: a3 }], B2 = [1, { cc: a3, lib: a3 }];
    return [0, { ac: [1, { com: a3, edu: a3, gov: a3, mil: a3, net: a3, org: a3, drr: o, feedback: o, forms: o }], ad: a3, ae: [1, { ac: a3, co: a3, gov: a3, mil: a3, net: a3, org: a3, sch: a3 }], aero: [1, { airline: a3, airport: a3, "accident-investigation": a3, "accident-prevention": a3, aerobatic: a3, aeroclub: a3, aerodrome: a3, agents: a3, "air-surveillance": a3, "air-traffic-control": a3, aircraft: a3, airtraffic: a3, ambulance: a3, association: a3, author: a3, ballooning: a3, broker: a3, caa: a3, cargo: a3, catering: a3, certification: a3, championship: a3, charter: a3, civilaviation: a3, club: a3, conference: a3, consultant: a3, consulting: a3, control: a3, council: a3, crew: a3, design: a3, dgca: a3, educator: a3, emergency: a3, engine: a3, engineer: a3, entertainment: a3, equipment: a3, exchange: a3, express: a3, federation: a3, flight: a3, freight: a3, fuel: a3, gliding: a3, government: a3, groundhandling: a3, group: a3, hanggliding: a3, homebuilt: a3, insurance: a3, journal: a3, journalist: a3, leasing: a3, logistics: a3, magazine: a3, maintenance: a3, marketplace: a3, media: a3, microlight: a3, modelling: a3, navigation: a3, parachuting: a3, paragliding: a3, "passenger-association": a3, pilot: a3, press: a3, production: a3, recreation: a3, repbody: a3, res: a3, research: a3, rotorcraft: a3, safety: a3, scientist: a3, services: a3, show: a3, skydiving: a3, software: a3, student: a3, taxi: a3, trader: a3, trading: a3, trainer: a3, union: a3, workinggroup: a3, works: a3 }], af: m2, ag: [1, { co: a3, com: a3, net: a3, nom: a3, org: a3, obj: o }], ai: [1, { com: a3, net: a3, off: a3, org: a3, uwu: o, framer: o }], al: w2, am: [1, { co: a3, com: a3, commune: a3, net: a3, org: a3, radio: o }], ao: [1, { co: a3, ed: a3, edu: a3, gov: a3, gv: a3, it: a3, og: a3, org: a3, pb: a3 }], aq: a3, ar: [1, { bet: a3, com: a3, coop: a3, edu: a3, gob: a3, gov: a3, int: a3, mil: a3, musica: a3, mutual: a3, net: a3, org: a3, seg: a3, senasa: a3, tur: a3 }], arpa: [1, { e164: a3, home: a3, "in-addr": a3, ip6: a3, iris: a3, uri: a3, urn: a3 }], as: c2, asia: [1, { cloudns: o, daemon: o, dix: o }], at: [1, { 4: o, ac: [1, { sth: a3 }], co: a3, gv: a3, or: a3, funkfeuer: [0, { wien: o }], futurecms: [0, { "*": o, ex: e, in: e }], futurehosting: o, futuremailing: o, ortsinfo: [0, { ex: e, kunden: e }], biz: o, info: o, "123webseite": o, priv: o, my: o, myspreadshop: o, "12hp": o, "2ix": o, "4lima": o, "lima-city": o }], au: [1, { asn: a3, com: [1, { cloudlets: [0, { mel: o }], myspreadshop: o }], edu: [1, { act: a3, catholic: a3, nsw: a3, nt: a3, qld: a3, sa: a3, tas: a3, vic: a3, wa: a3 }], gov: [1, { qld: a3, sa: a3, tas: a3, vic: a3, wa: a3 }], id: a3, net: a3, org: a3, conf: a3, oz: a3, act: a3, nsw: a3, nt: a3, qld: a3, sa: a3, tas: a3, vic: a3, wa: a3, hrsn: [0, { vps: o }] }], aw: [1, { com: a3 }], ax: a3, az: [1, { biz: a3, co: a3, com: a3, edu: a3, gov: a3, info: a3, int: a3, mil: a3, name: a3, net: a3, org: a3, pp: a3, pro: a3 }], ba: [1, { com: a3, edu: a3, gov: a3, mil: a3, net: a3, org: a3, brendly: D2, rs: o }], bb: [1, { biz: a3, co: a3, com: a3, edu: a3, gov: a3, info: a3, net: a3, org: a3, store: a3, tv: a3 }], bd: [1, { ac: a3, ai: a3, co: a3, com: a3, edu: a3, gov: a3, id: a3, info: a3, it: a3, mil: a3, net: a3, org: a3, sch: a3, tv: a3 }], be: [1, { ac: a3, cloudns: o, webhosting: o, interhostsolutions: [0, { cloud: o }], kuleuven: [0, { ezproxy: o }], "123website": o, myspreadshop: o, transurl: e }], bf: c2, bg: [1, { 0: a3, 1: a3, 2: a3, 3: a3, 4: a3, 5: a3, 6: a3, 7: a3, 8: a3, 9: a3, a: a3, b: a3, c: a3, d: a3, e: a3, f: a3, g: a3, h: a3, i: a3, j: a3, k: a3, l: a3, m: a3, n: a3, o: a3, p: a3, q: a3, r: a3, s: a3, t: a3, u: a3, v: a3, w: a3, x: a3, y: a3, z: a3, barsy: o }], bh: m2, bi: [1, { co: a3, com: a3, edu: a3, or: a3, org: a3 }], biz: [1, { activetrail: o, "cloud-ip": o, cloudns: o, jozi: o, dyndns: o, "for-better": o, "for-more": o, "for-some": o, "for-the": o, selfip: o, webhop: o, orx: o, mmafan: o, myftp: o, "no-ip": o, dscloud: o }], bj: [1, { africa: a3, agro: a3, architectes: a3, assur: a3, avocats: a3, co: a3, com: a3, eco: a3, econo: a3, edu: a3, info: a3, loisirs: a3, money: a3, net: a3, org: a3, ote: a3, restaurant: a3, resto: a3, tourism: a3, univ: a3 }], bm: m2, bn: [1, { com: a3, edu: a3, gov: a3, net: a3, org: a3, co: o }], bo: [1, { com: a3, edu: a3, gob: a3, int: a3, mil: a3, net: a3, org: a3, tv: a3, web: a3, academia: a3, agro: a3, arte: a3, blog: a3, bolivia: a3, ciencia: a3, cooperativa: a3, democracia: a3, deporte: a3, ecologia: a3, economia: a3, empresa: a3, indigena: a3, industria: a3, info: a3, medicina: a3, movimiento: a3, musica: a3, natural: a3, nombre: a3, noticias: a3, patria: a3, plurinacional: a3, politica: a3, profesional: a3, pueblo: a3, revista: a3, salud: a3, tecnologia: a3, tksat: a3, transporte: a3, wiki: a3 }], br: [1, { "9guacu": a3, abc: a3, adm: a3, adv: a3, agr: a3, aju: a3, am: a3, anani: a3, aparecida: a3, api: a3, app: a3, arq: a3, art: a3, ato: a3, b: a3, barueri: a3, belem: a3, bet: a3, bhz: a3, bib: a3, bio: a3, blog: a3, bmd: a3, boavista: a3, bsb: a3, campinagrande: a3, campinas: a3, caxias: a3, cim: a3, cng: a3, cnt: a3, com: [1, { simplesite: o }], contagem: a3, coop: a3, coz: a3, cri: a3, cuiaba: a3, curitiba: a3, def: a3, des: a3, det: a3, dev: a3, ecn: a3, eco: a3, edu: a3, emp: a3, enf: a3, eng: a3, esp: a3, etc: a3, eti: a3, far: a3, feira: a3, flog: a3, floripa: a3, fm: a3, fnd: a3, fortal: a3, fot: a3, foz: a3, fst: a3, g12: a3, geo: a3, ggf: a3, goiania: a3, gov: [1, { ac: a3, al: a3, am: a3, ap: a3, ba: a3, ce: a3, df: a3, es: a3, go: a3, ma: a3, mg: a3, ms: a3, mt: a3, pa: a3, pb: a3, pe: a3, pi: a3, pr: a3, rj: a3, rn: a3, ro: a3, rr: a3, rs: a3, sc: a3, se: a3, sp: a3, to: a3 }], gru: a3, ia: a3, imb: a3, ind: a3, inf: a3, jab: a3, jampa: a3, jdf: a3, joinville: a3, jor: a3, jus: a3, leg: [1, { ac: o, al: o, am: o, ap: o, ba: o, ce: o, df: o, es: o, go: o, ma: o, mg: o, ms: o, mt: o, pa: o, pb: o, pe: o, pi: o, pr: o, rj: o, rn: o, ro: o, rr: o, rs: o, sc: o, se: o, sp: o, to: o }], leilao: a3, lel: a3, log: a3, londrina: a3, macapa: a3, maceio: a3, manaus: a3, maringa: a3, mat: a3, med: a3, mil: a3, morena: a3, mp: a3, mus: a3, natal: a3, net: a3, niteroi: a3, nom: r2, not: a3, ntr: a3, odo: a3, ong: a3, org: a3, osasco: a3, palmas: a3, poa: a3, ppg: a3, pro: a3, psc: a3, psi: a3, pvh: a3, qsl: a3, radio: a3, rec: a3, recife: a3, rep: a3, ribeirao: a3, rio: a3, riobranco: a3, riopreto: a3, salvador: a3, sampa: a3, santamaria: a3, santoandre: a3, saobernardo: a3, saogonca: a3, seg: a3, sjc: a3, slg: a3, slz: a3, social: a3, sorocaba: a3, srv: a3, taxi: a3, tc: a3, tec: a3, teo: a3, the: a3, tmp: a3, trd: a3, tur: a3, tv: a3, udi: a3, vet: a3, vix: a3, vlog: a3, wiki: a3, xyz: a3, zlg: a3, tche: o }], bs: [1, { com: a3, edu: a3, gov: a3, net: a3, org: a3, we: o }], bt: m2, bv: a3, bw: [1, { ac: a3, co: a3, gov: a3, net: a3, org: a3 }], by: [1, { gov: a3, mil: a3, com: a3, of: a3, mediatech: o }], bz: [1, { co: a3, com: a3, edu: a3, gov: a3, net: a3, org: a3, za: o, mydns: o, gsj: o }], ca: [1, { ab: a3, bc: a3, mb: a3, nb: a3, nf: a3, nl: a3, ns: a3, nt: a3, nu: a3, on: a3, pe: a3, qc: a3, sk: a3, yk: a3, gc: a3, barsy: o, awdev: e, co: o, "no-ip": o, onid: o, myspreadshop: o, box: o }], cat: a3, cc: [1, { cleverapps: o, "cloud-ip": o, cloudns: o, ftpaccess: o, "game-server": o, myphotos: o, scrapping: o, twmail: o, csx: o, fantasyleague: o, spawn: [0, { instances: o }] }], cd: c2, cf: a3, cg: a3, ch: [1, { square7: o, cloudns: o, cloudscale: [0, { cust: o, lpg: R, rma: R }], objectstorage: [0, { lpg: o, rma: o }], flow: [0, { ae: [0, { alp1: o }], appengine: o }], "linkyard-cloud": o, gotdns: o, dnsking: o, "123website": o, myspreadshop: o, firenet: [0, { "*": o, svc: e }], "12hp": o, "2ix": o, "4lima": o, "lima-city": o }], ci: [1, { ac: a3, "xn--aroport-bya": a3, aéroport: a3, asso: a3, co: a3, com: a3, ed: a3, edu: a3, go: a3, gouv: a3, int: a3, net: a3, or: a3, org: a3 }], ck: r2, cl: [1, { co: a3, gob: a3, gov: a3, mil: a3, cloudns: o }], cm: [1, { co: a3, com: a3, gov: a3, net: a3 }], cn: [1, { ac: a3, com: [1, { amazonaws: [0, { "cn-north-1": [0, { "execute-api": o, "emrappui-prod": o, "emrnotebooks-prod": o, "emrstudio-prod": o, rds: e, dualstack: k2, s3: o, "s3-accesspoint": o, "s3-deprecated": o, "s3-object-lambda": o, "s3-website": o }], "cn-northwest-1": [0, { "execute-api": o, "emrappui-prod": o, "emrnotebooks-prod": o, "emrstudio-prod": o, rds: e, dualstack: T2, s3: o, "s3-accesspoint": o, "s3-object-lambda": o, "s3-website": o }], compute: e, airflow: [0, { "cn-north-1": e, "cn-northwest-1": e }], eb: [0, { "cn-north-1": o, "cn-northwest-1": o }], elb: e }], amazonwebservices: [0, { on: [0, { "cn-north-1": l2, "cn-northwest-1": l2 }] }], sagemaker: [0, { "cn-north-1": u3, "cn-northwest-1": u3 }] }], edu: a3, gov: a3, mil: a3, net: a3, org: a3, "xn--55qx5d": a3, 公司: a3, "xn--od0alg": a3, 網絡: a3, "xn--io0a7i": a3, 网络: a3, ah: a3, bj: a3, cq: a3, fj: a3, gd: a3, gs: a3, gx: a3, gz: a3, ha: a3, hb: a3, he: a3, hi: a3, hk: a3, hl: a3, hn: a3, jl: a3, js: a3, jx: a3, ln: a3, mo: a3, nm: a3, nx: a3, qh: a3, sc: a3, sd: a3, sh: [1, { as: o }], sn: a3, sx: a3, tj: a3, tw: a3, xj: a3, xz: a3, yn: a3, zj: a3, "canva-apps": o, canvasite: S2, myqnapcloud: o, quickconnect: U }], co: [1, { com: a3, edu: a3, gov: a3, mil: a3, net: a3, nom: a3, org: a3, carrd: o, crd: o, otap: e, hidns: o, leadpages: o, lpages: o, mypi: o, xmit: e, firewalledreplit: C2, repl: C2, supabase: [2, { realtime: o, storage: o }], umso: o }], com: [1, { a2hosted: o, cpserver: o, adobeaemcloud: [2, { dev: e }], africa: o, aivencloud: o, alibabacloudcs: o, kasserver: o, amazonaws: [0, { "af-south-1": v2, "ap-east-1": z, "ap-northeast-1": p3, "ap-northeast-2": p3, "ap-northeast-3": v2, "ap-south-1": p3, "ap-south-2": b2, "ap-southeast-1": p3, "ap-southeast-2": p3, "ap-southeast-3": b2, "ap-southeast-4": b2, "ap-southeast-5": [0, { "execute-api": o, dualstack: k2, s3: o, "s3-accesspoint": o, "s3-deprecated": o, "s3-object-lambda": o, "s3-website": o }], "ca-central-1": V2, "ca-west-1": [0, { "execute-api": o, "emrappui-prod": o, "emrnotebooks-prod": o, "emrstudio-prod": o, dualstack: j2, s3: o, "s3-accesspoint": o, "s3-accesspoint-fips": o, "s3-fips": o, "s3-object-lambda": o, "s3-website": o }], "eu-central-1": p3, "eu-central-2": b2, "eu-north-1": z, "eu-south-1": v2, "eu-south-2": b2, "eu-west-1": [0, { "execute-api": o, "emrappui-prod": o, "emrnotebooks-prod": o, "emrstudio-prod": o, dualstack: k2, s3: o, "s3-accesspoint": o, "s3-deprecated": o, "s3-object-lambda": o, "s3-website": o, "analytics-gateway": o, "aws-cloud9": g4, cloud9: h2 }], "eu-west-2": z, "eu-west-3": v2, "il-central-1": [0, { "execute-api": o, "emrappui-prod": o, "emrnotebooks-prod": o, "emrstudio-prod": o, dualstack: k2, s3: o, "s3-accesspoint": o, "s3-object-lambda": o, "s3-website": o, "aws-cloud9": g4, cloud9: [0, { vfs: o }] }], "me-central-1": b2, "me-south-1": z, "sa-east-1": v2, "us-east-1": [2, { "execute-api": o, "emrappui-prod": o, "emrnotebooks-prod": o, "emrstudio-prod": o, dualstack: j2, s3: o, "s3-accesspoint": o, "s3-accesspoint-fips": o, "s3-deprecated": o, "s3-fips": o, "s3-object-lambda": o, "s3-website": o, "analytics-gateway": o, "aws-cloud9": g4, cloud9: h2 }], "us-east-2": W2, "us-gov-east-1": X, "us-gov-west-1": X, "us-west-1": V2, "us-west-2": W2, compute: e, "compute-1": e, airflow: [0, { "af-south-1": e, "ap-east-1": e, "ap-northeast-1": e, "ap-northeast-2": e, "ap-northeast-3": e, "ap-south-1": e, "ap-south-2": e, "ap-southeast-1": e, "ap-southeast-2": e, "ap-southeast-3": e, "ap-southeast-4": e, "ap-southeast-5": e, "ap-southeast-7": e, "ca-central-1": e, "ca-west-1": e, "eu-central-1": e, "eu-central-2": e, "eu-north-1": e, "eu-south-1": e, "eu-south-2": e, "eu-west-1": e, "eu-west-2": e, "eu-west-3": e, "il-central-1": e, "me-central-1": e, "me-south-1": e, "sa-east-1": e, "us-east-1": e, "us-east-2": e, "us-west-1": e, "us-west-2": e }], rds: [0, { "af-south-1": e, "ap-east-1": e, "ap-east-2": e, "ap-northeast-1": e, "ap-northeast-2": e, "ap-northeast-3": e, "ap-south-1": e, "ap-south-2": e, "ap-southeast-1": e, "ap-southeast-2": e, "ap-southeast-3": e, "ap-southeast-4": e, "ap-southeast-5": e, "ap-southeast-6": e, "ap-southeast-7": e, "ca-central-1": e, "ca-west-1": e, "eu-central-1": e, "eu-central-2": e, "eu-west-1": e, "eu-west-2": e, "eu-west-3": e, "il-central-1": e, "me-central-1": e, "me-south-1": e, "mx-central-1": e, "sa-east-1": e, "us-east-1": e, "us-east-2": e, "us-gov-east-1": e, "us-gov-west-1": e, "us-northeast-1": e, "us-west-1": e, "us-west-2": e }], s3: o, "s3-1": o, "s3-ap-east-1": o, "s3-ap-northeast-1": o, "s3-ap-northeast-2": o, "s3-ap-northeast-3": o, "s3-ap-south-1": o, "s3-ap-southeast-1": o, "s3-ap-southeast-2": o, "s3-ca-central-1": o, "s3-eu-central-1": o, "s3-eu-north-1": o, "s3-eu-west-1": o, "s3-eu-west-2": o, "s3-eu-west-3": o, "s3-external-1": o, "s3-fips-us-gov-east-1": o, "s3-fips-us-gov-west-1": o, "s3-global": [0, { accesspoint: [0, { mrap: o }] }], "s3-me-south-1": o, "s3-sa-east-1": o, "s3-us-east-2": o, "s3-us-gov-east-1": o, "s3-us-gov-west-1": o, "s3-us-west-1": o, "s3-us-west-2": o, "s3-website-ap-northeast-1": o, "s3-website-ap-southeast-1": o, "s3-website-ap-southeast-2": o, "s3-website-eu-west-1": o, "s3-website-sa-east-1": o, "s3-website-us-east-1": o, "s3-website-us-gov-west-1": o, "s3-website-us-west-1": o, "s3-website-us-west-2": o, elb: e }], amazoncognito: [0, { "af-south-1": s, "ap-east-1": s, "ap-northeast-1": s, "ap-northeast-2": s, "ap-northeast-3": s, "ap-south-1": s, "ap-south-2": s, "ap-southeast-1": s, "ap-southeast-2": s, "ap-southeast-3": s, "ap-southeast-4": s, "ap-southeast-5": s, "ap-southeast-7": s, "ca-central-1": s, "ca-west-1": s, "eu-central-1": s, "eu-central-2": s, "eu-north-1": s, "eu-south-1": s, "eu-south-2": s, "eu-west-1": s, "eu-west-2": s, "eu-west-3": s, "il-central-1": s, "me-central-1": s, "me-south-1": s, "mx-central-1": s, "sa-east-1": s, "us-east-1": q, "us-east-2": q, "us-gov-east-1": Y, "us-gov-west-1": Y, "us-west-1": q, "us-west-2": q }], amplifyapp: o, awsapprunner: e, awsapps: o, elasticbeanstalk: [2, { "af-south-1": o, "ap-east-1": o, "ap-northeast-1": o, "ap-northeast-2": o, "ap-northeast-3": o, "ap-south-1": o, "ap-southeast-1": o, "ap-southeast-2": o, "ap-southeast-3": o, "ap-southeast-5": o, "ap-southeast-7": o, "ca-central-1": o, "eu-central-1": o, "eu-north-1": o, "eu-south-1": o, "eu-south-2": o, "eu-west-1": o, "eu-west-2": o, "eu-west-3": o, "il-central-1": o, "me-central-1": o, "me-south-1": o, "sa-east-1": o, "us-east-1": o, "us-east-2": o, "us-gov-east-1": o, "us-gov-west-1": o, "us-west-1": o, "us-west-2": o }], awsglobalaccelerator: o, siiites: o, appspacehosted: o, appspaceusercontent: o, "on-aptible": o, myasustor: o, "balena-devices": o, boutir: o, bplaced: o, cafjs: o, "canva-apps": o, "canva-hosted-embed": o, canvacode: o, "rice-labs": o, "cdn77-storage": o, br: o, cn: o, de: o, eu: o, jpn: o, mex: o, ru: o, sa: o, uk: o, us: o, za: o, "clever-cloud": [0, { services: e }], abrdns: o, dnsabr: o, "ip-ddns": o, jdevcloud: o, wpdevcloud: o, "cf-ipfs": o, "cloudflare-ipfs": o, trycloudflare: o, co: o, devinapps: e, builtwithdark: o, datadetect: [0, { demo: o, instance: o }], dattolocal: o, dattorelay: o, dattoweb: o, mydatto: o, digitaloceanspaces: e, discordsays: o, discordsez: o, drayddns: o, dreamhosters: o, durumis: o, blogdns: o, cechire: o, dnsalias: o, dnsdojo: o, doesntexist: o, dontexist: o, doomdns: o, "dyn-o-saur": o, dynalias: o, "dyndns-at-home": o, "dyndns-at-work": o, "dyndns-blog": o, "dyndns-free": o, "dyndns-home": o, "dyndns-ip": o, "dyndns-mail": o, "dyndns-office": o, "dyndns-pics": o, "dyndns-remote": o, "dyndns-server": o, "dyndns-web": o, "dyndns-wiki": o, "dyndns-work": o, "est-a-la-maison": o, "est-a-la-masion": o, "est-le-patron": o, "est-mon-blogueur": o, "from-ak": o, "from-al": o, "from-ar": o, "from-ca": o, "from-ct": o, "from-dc": o, "from-de": o, "from-fl": o, "from-ga": o, "from-hi": o, "from-ia": o, "from-id": o, "from-il": o, "from-in": o, "from-ks": o, "from-ky": o, "from-ma": o, "from-md": o, "from-mi": o, "from-mn": o, "from-mo": o, "from-ms": o, "from-mt": o, "from-nc": o, "from-nd": o, "from-ne": o, "from-nh": o, "from-nj": o, "from-nm": o, "from-nv": o, "from-oh": o, "from-ok": o, "from-or": o, "from-pa": o, "from-pr": o, "from-ri": o, "from-sc": o, "from-sd": o, "from-tn": o, "from-tx": o, "from-ut": o, "from-va": o, "from-vt": o, "from-wa": o, "from-wi": o, "from-wv": o, "from-wy": o, getmyip: o, gotdns: o, "hobby-site": o, homelinux: o, homeunix: o, iamallama: o, "is-a-anarchist": o, "is-a-blogger": o, "is-a-bookkeeper": o, "is-a-bulls-fan": o, "is-a-caterer": o, "is-a-chef": o, "is-a-conservative": o, "is-a-cpa": o, "is-a-cubicle-slave": o, "is-a-democrat": o, "is-a-designer": o, "is-a-doctor": o, "is-a-financialadvisor": o, "is-a-geek": o, "is-a-green": o, "is-a-guru": o, "is-a-hard-worker": o, "is-a-hunter": o, "is-a-landscaper": o, "is-a-lawyer": o, "is-a-liberal": o, "is-a-libertarian": o, "is-a-llama": o, "is-a-musician": o, "is-a-nascarfan": o, "is-a-nurse": o, "is-a-painter": o, "is-a-personaltrainer": o, "is-a-photographer": o, "is-a-player": o, "is-a-republican": o, "is-a-rockstar": o, "is-a-socialist": o, "is-a-student": o, "is-a-teacher": o, "is-a-techie": o, "is-a-therapist": o, "is-an-accountant": o, "is-an-actor": o, "is-an-actress": o, "is-an-anarchist": o, "is-an-artist": o, "is-an-engineer": o, "is-an-entertainer": o, "is-certified": o, "is-gone": o, "is-into-anime": o, "is-into-cars": o, "is-into-cartoons": o, "is-into-games": o, "is-leet": o, "is-not-certified": o, "is-slick": o, "is-uberleet": o, "is-with-theband": o, "isa-geek": o, "isa-hockeynut": o, issmarterthanyou: o, "likes-pie": o, likescandy: o, "neat-url": o, "saves-the-whales": o, selfip: o, "sells-for-less": o, "sells-for-u": o, servebbs: o, "simple-url": o, "space-to-rent": o, "teaches-yoga": o, writesthisblog: o, ddnsfree: o, ddnsgeek: o, giize: o, gleeze: o, kozow: o, loseyourip: o, ooguy: o, theworkpc: o, mytuleap: o, "tuleap-partners": o, encoreapi: o, evennode: [0, { "eu-1": o, "eu-2": o, "eu-3": o, "eu-4": o, "us-1": o, "us-2": o, "us-3": o, "us-4": o }], onfabrica: o, "fastly-edge": o, "fastly-terrarium": o, "fastvps-server": o, mydobiss: o, firebaseapp: o, fldrv: o, forgeblocks: o, framercanvas: o, "freebox-os": o, freeboxos: o, freemyip: o, aliases121: o, gentapps: o, gentlentapis: o, githubusercontent: o, "0emm": e, appspot: [2, { r: e }], blogspot: o, codespot: o, googleapis: o, googlecode: o, pagespeedmobilizer: o, withgoogle: o, withyoutube: o, grayjayleagues: o, hatenablog: o, hatenadiary: o, herokuapp: o, gr: o, smushcdn: o, wphostedmail: o, wpmucdn: o, pixolino: o, "apps-1and1": o, "live-website": o, "webspace-host": o, dopaas: o, "hosted-by-previder": F2, hosteur: [0, { "rag-cloud": o, "rag-cloud-ch": o }], "ik-server": [0, { jcloud: o, "jcloud-ver-jpc": o }], jelastic: [0, { demo: o }], massivegrid: F2, wafaicloud: [0, { jed: o, ryd: o }], "eu1-plenit": o, "la1-plenit": o, "us1-plenit": o, webadorsite: o, joyent: [0, { cns: e }], "on-forge": o, "on-vapor": o, lpusercontent: o, linode: [0, { members: o, nodebalancer: e }], linodeobjects: e, linodeusercontent: [0, { ip: o }], localtonet: o, lovableproject: o, barsycenter: o, barsyonline: o, lutrausercontent: e, modelscape: o, mwcloudnonprod: o, polyspace: o, mazeplay: o, miniserver: o, atmeta: o, fbsbx: Z, meteorapp: $, routingthecloud: o, "same-app": o, "same-preview": o, mydbserver: o, mochausercontent: o, hostedpi: o, "mythic-beasts": [0, { caracal: o, customer: o, fentiger: o, lynx: o, ocelot: o, oncilla: o, onza: o, sphinx: o, vs: o, x: o, yali: o }], nospamproxy: [0, { cloud: [2, { o365: o }] }], "4u": o, nfshost: o, "3utilities": o, blogsyte: o, ciscofreak: o, damnserver: o, ddnsking: o, ditchyourip: o, dnsiskinky: o, dynns: o, geekgalaxy: o, "health-carereform": o, homesecuritymac: o, homesecuritypc: o, myactivedirectory: o, mysecuritycamera: o, myvnc: o, "net-freaks": o, onthewifi: o, point2this: o, quicksytes: o, securitytactics: o, servebeer: o, servecounterstrike: o, serveexchange: o, serveftp: o, servegame: o, servehalflife: o, servehttp: o, servehumour: o, serveirc: o, servemp3: o, servep2p: o, servepics: o, servequake: o, servesarcasm: o, stufftoread: o, unusualperson: o, workisboring: o, myiphost: o, observableusercontent: [0, { static: o }], simplesite: o, oaiusercontent: e, orsites: o, operaunite: o, "customer-oci": [0, { "*": o, oci: e, ocp: e, ocs: e }], oraclecloudapps: e, oraclegovcloudapps: e, "authgear-staging": o, authgearapps: o, skygearapp: o, outsystemscloud: o, ownprovider: o, pgfog: o, pagexl: o, gotpantheon: o, paywhirl: e, upsunapp: o, "postman-echo": o, prgmr: [0, { xen: o }], "project-study": [0, { dev: o }], pythonanywhere: $, qa2: o, "alpha-myqnapcloud": o, "dev-myqnapcloud": o, mycloudnas: o, mynascloud: o, myqnapcloud: o, qualifioapp: o, ladesk: o, qualyhqpartner: e, qualyhqportal: e, qbuser: o, quipelements: e, rackmaze: o, "readthedocs-hosted": o, rhcloud: o, onrender: o, render: G, "subsc-pay": o, "180r": o, dojin: o, sakuratan: o, sakuraweb: o, x0: o, code: [0, { builder: e, "dev-builder": e, "stg-builder": e }], salesforce: [0, { platform: [0, { "code-builder-stg": [0, { test: [0, { "001": e }] }] }] }], logoip: o, scrysec: o, "firewall-gateway": o, myshopblocks: o, myshopify: o, shopitsite: o, "1kapp": o, appchizi: o, applinzi: o, sinaapp: o, vipsinaapp: o, streamlitapp: o, "try-snowplow": o, "playstation-cloud": o, myspreadshop: o, "w-corp-staticblitz": o, "w-credentialless-staticblitz": o, "w-staticblitz": o, "stackhero-network": o, stdlib: [0, { api: o }], strapiapp: [2, { media: o }], "streak-link": o, streaklinks: o, streakusercontent: o, "temp-dns": o, dsmynas: o, familyds: o, mytabit: o, taveusercontent: o, "tb-hosting": H, reservd: o, thingdustdata: o, "townnews-staging": o, typeform: [0, { pro: o }], hk: o, it: o, "deus-canvas": o, vultrobjects: e, wafflecell: o, hotelwithflight: o, "reserve-online": o, cprapid: o, pleskns: o, remotewd: o, wiardweb: [0, { pages: o }], wixsite: o, wixstudio: o, messwithdns: o, "woltlab-demo": o, wpenginepowered: [2, { js: o }], xnbay: [2, { u2: o, "u2-local": o }], yolasite: o }], coop: a3, cr: [1, { ac: a3, co: a3, ed: a3, fi: a3, go: a3, or: a3, sa: a3 }], cu: [1, { com: a3, edu: a3, gob: a3, inf: a3, nat: a3, net: a3, org: a3 }], cv: [1, { com: a3, edu: a3, id: a3, int: a3, net: a3, nome: a3, org: a3, publ: a3 }], cw: _, cx: [1, { gov: a3, cloudns: o, ath: o, info: o, assessments: o, calculators: o, funnels: o, paynow: o, quizzes: o, researched: o, tests: o }], cy: [1, { ac: a3, biz: a3, com: [1, { scaleforce: I2 }], ekloges: a3, gov: a3, ltd: a3, mil: a3, net: a3, org: a3, press: a3, pro: a3, tm: a3 }], cz: [1, { gov: a3, contentproxy9: [0, { rsc: o }], realm: o, e4: o, co: o, metacentrum: [0, { cloud: e, custom: o }], muni: [0, { cloud: [0, { flt: o, usr: o }] }] }], de: [1, { bplaced: o, square7: o, com: o, cosidns: aa, dnsupdater: o, "dynamisches-dns": o, "internet-dns": o, "l-o-g-i-n": o, ddnss: [2, { dyn: o, dyndns: o }], "dyn-ip24": o, dyndns1: o, "home-webserver": [2, { dyn: o }], "myhome-server": o, dnshome: o, fuettertdasnetz: o, isteingeek: o, istmein: o, lebtimnetz: o, leitungsen: o, traeumtgerade: o, frusky: e, goip: o, "xn--gnstigbestellen-zvb": o, günstigbestellen: o, "xn--gnstigliefern-wob": o, günstigliefern: o, "hs-heilbronn": [0, { it: [0, { pages: o, "pages-research": o }] }], "dyn-berlin": o, "in-berlin": o, "in-brb": o, "in-butter": o, "in-dsl": o, "in-vpn": o, iservschule: o, "mein-iserv": o, schuldock: o, schulplattform: o, schulserver: o, "test-iserv": o, keymachine: o, co: o, "git-repos": o, "lcube-server": o, "svn-repos": o, barsy: o, webspaceconfig: o, "123webseite": o, rub: o, "ruhr-uni-bochum": [2, { noc: [0, { io: o }] }], logoip: o, "firewall-gateway": o, "my-gateway": o, "my-router": o, spdns: o, my: o, speedpartner: [0, { customer: o }], myspreadshop: o, "taifun-dns": o, "12hp": o, "2ix": o, "4lima": o, "lima-city": o, "dd-dns": o, "dray-dns": o, draydns: o, "dyn-vpn": o, dynvpn: o, "mein-vigor": o, "my-vigor": o, "my-wan": o, "syno-ds": o, "synology-diskstation": o, "synology-ds": o, "virtual-user": o, virtualuser: o, "community-pro": o, diskussionsbereich: o, xenonconnect: e }], dj: a3, dk: [1, { biz: o, co: o, firm: o, reg: o, store: o, "123hjemmeside": o, myspreadshop: o }], dm: ea, do: [1, { art: a3, com: a3, edu: a3, gob: a3, gov: a3, mil: a3, net: a3, org: a3, sld: a3, web: a3 }], dz: [1, { art: a3, asso: a3, com: a3, edu: a3, gov: a3, net: a3, org: a3, pol: a3, soc: a3, tm: a3 }], ec: [1, { abg: a3, adm: a3, agron: a3, arqt: a3, art: a3, bar: a3, chef: a3, com: a3, cont: a3, cpa: a3, cue: a3, dent: a3, dgn: a3, disco: a3, doc: a3, edu: a3, eng: a3, esm: a3, fin: a3, fot: a3, gal: a3, gob: a3, gov: a3, gye: a3, ibr: a3, info: a3, k12: a3, lat: a3, loj: a3, med: a3, mil: a3, mktg: a3, mon: a3, net: a3, ntr: a3, odont: a3, org: a3, pro: a3, prof: a3, psic: a3, psiq: a3, pub: a3, rio: a3, rrpp: a3, sal: a3, tech: a3, tul: a3, tur: a3, uio: a3, vet: a3, xxx: a3, base: o, official: o }], edu: [1, { rit: [0, { "git-pages": o }] }], ee: [1, { aip: a3, com: a3, edu: a3, fie: a3, gov: a3, lib: a3, med: a3, org: a3, pri: a3, riik: a3 }], eg: [1, { ac: a3, com: a3, edu: a3, eun: a3, gov: a3, info: a3, me: a3, mil: a3, name: a3, net: a3, org: a3, sci: a3, sport: a3, tv: a3 }], er: r2, es: [1, { com: a3, edu: a3, gob: a3, nom: a3, org: a3, "123miweb": o, myspreadshop: o }], et: [1, { biz: a3, com: a3, edu: a3, gov: a3, info: a3, name: a3, net: a3, org: a3 }], eu: [1, { cloudns: o, prvw: o, dogado: [0, { jelastic: o }], barsy: o, spdns: o, nxa: e, directwp: o, transurl: e, diskstation: o }], fi: [1, { aland: a3, dy: o, "xn--hkkinen-5wa": o, häkkinen: o, iki: o, cloudplatform: [0, { fi: o }], datacenter: [0, { demo: o, paas: o }], kapsi: o, "123kotisivu": o, myspreadshop: o }], fj: [1, { ac: a3, biz: a3, com: a3, edu: a3, gov: a3, id: a3, info: a3, mil: a3, name: a3, net: a3, org: a3, pro: a3 }], fk: r2, fm: [1, { com: a3, edu: a3, net: a3, org: a3, radio: o, user: e }], fo: a3, fr: [1, { asso: a3, com: a3, gouv: a3, nom: a3, prd: a3, tm: a3, avoues: a3, cci: a3, greta: a3, "huissier-justice": a3, "en-root": o, "fbx-os": o, fbxos: o, "freebox-os": o, freeboxos: o, goupile: o, "123siteweb": o, "on-web": o, "chirurgiens-dentistes-en-france": o, dedibox: o, aeroport: o, avocat: o, chambagri: o, "chirurgiens-dentistes": o, "experts-comptables": o, medecin: o, notaires: o, pharmacien: o, port: o, veterinaire: o, myspreadshop: o, ynh: o }], ga: a3, gb: a3, gd: [1, { edu: a3, gov: a3 }], ge: [1, { com: a3, edu: a3, gov: a3, net: a3, org: a3, pvt: a3, school: a3 }], gf: a3, gg: [1, { co: a3, net: a3, org: a3, ply: [0, { at: e, d6: o }], botdash: o, kaas: o, stackit: o, panel: [2, { daemon: o }] }], gh: [1, { biz: a3, com: a3, edu: a3, gov: a3, mil: a3, net: a3, org: a3 }], gi: [1, { com: a3, edu: a3, gov: a3, ltd: a3, mod: a3, org: a3 }], gl: [1, { co: a3, com: a3, edu: a3, net: a3, org: a3 }], gm: a3, gn: [1, { ac: a3, com: a3, edu: a3, gov: a3, net: a3, org: a3 }], gov: a3, gp: [1, { asso: a3, com: a3, edu: a3, mobi: a3, net: a3, org: a3 }], gq: a3, gr: [1, { com: a3, edu: a3, gov: a3, net: a3, org: a3, barsy: o, simplesite: o }], gs: a3, gt: [1, { com: a3, edu: a3, gob: a3, ind: a3, mil: a3, net: a3, org: a3 }], gu: [1, { com: a3, edu: a3, gov: a3, guam: a3, info: a3, net: a3, org: a3, web: a3 }], gw: [1, { nx: o }], gy: ea, hk: [1, { com: a3, edu: a3, gov: a3, idv: a3, net: a3, org: a3, "xn--ciqpn": a3, 个人: a3, "xn--gmqw5a": a3, 個人: a3, "xn--55qx5d": a3, 公司: a3, "xn--mxtq1m": a3, 政府: a3, "xn--lcvr32d": a3, 敎育: a3, "xn--wcvs22d": a3, 教育: a3, "xn--gmq050i": a3, 箇人: a3, "xn--uc0atv": a3, 組織: a3, "xn--uc0ay4a": a3, 組织: a3, "xn--od0alg": a3, 網絡: a3, "xn--zf0avx": a3, 網络: a3, "xn--mk0axi": a3, 组織: a3, "xn--tn0ag": a3, 组织: a3, "xn--od0aq3b": a3, 网絡: a3, "xn--io0a7i": a3, 网络: a3, inc: o, ltd: o }], hm: a3, hn: [1, { com: a3, edu: a3, gob: a3, mil: a3, net: a3, org: a3 }], hr: [1, { com: a3, from: a3, iz: a3, name: a3, brendly: D2 }], ht: [1, { adult: a3, art: a3, asso: a3, com: a3, coop: a3, edu: a3, firm: a3, gouv: a3, info: a3, med: a3, net: a3, org: a3, perso: a3, pol: a3, pro: a3, rel: a3, shop: a3, rt: o }], hu: [1, { 2e3: a3, agrar: a3, bolt: a3, casino: a3, city: a3, co: a3, erotica: a3, erotika: a3, film: a3, forum: a3, games: a3, hotel: a3, info: a3, ingatlan: a3, jogasz: a3, konyvelo: a3, lakas: a3, media: a3, news: a3, org: a3, priv: a3, reklam: a3, sex: a3, shop: a3, sport: a3, suli: a3, szex: a3, tm: a3, tozsde: a3, utazas: a3, video: a3 }], id: [1, { ac: a3, biz: a3, co: a3, desa: a3, go: a3, kop: a3, mil: a3, my: a3, net: a3, or: a3, ponpes: a3, sch: a3, web: a3, e: o, zone: o }], ie: [1, { gov: a3, myspreadshop: o }], il: [1, { ac: a3, co: [1, { ravpage: o, mytabit: o, tabitorder: o }], gov: a3, idf: a3, k12: a3, muni: a3, net: a3, org: a3 }], "xn--4dbrk0ce": [1, { "xn--4dbgdty6c": a3, "xn--5dbhl8d": a3, "xn--8dbq2a": a3, "xn--hebda8b": a3 }], ישראל: [1, { אקדמיה: a3, ישוב: a3, צהל: a3, ממשל: a3 }], im: [1, { ac: a3, co: [1, { ltd: a3, plc: a3 }], com: a3, net: a3, org: a3, tt: a3, tv: a3 }], in: [1, { "5g": a3, "6g": a3, ac: a3, ai: a3, am: a3, bank: a3, bihar: a3, biz: a3, business: a3, ca: a3, cn: a3, co: a3, com: a3, coop: a3, cs: a3, delhi: a3, dr: a3, edu: a3, er: a3, fin: a3, firm: a3, gen: a3, gov: a3, gujarat: a3, ind: a3, info: a3, int: a3, internet: a3, io: a3, me: a3, mil: a3, net: a3, nic: a3, org: a3, pg: a3, post: a3, pro: a3, res: a3, travel: a3, tv: a3, uk: a3, up: a3, us: a3, cloudns: o, barsy: o, web: o, supabase: o }], info: [1, { cloudns: o, "dynamic-dns": o, "barrel-of-knowledge": o, "barrell-of-knowledge": o, dyndns: o, "for-our": o, "groks-the": o, "groks-this": o, "here-for-more": o, knowsitall: o, selfip: o, webhop: o, barsy: o, mayfirst: o, mittwald: o, mittwaldserver: o, typo3server: o, dvrcam: o, ilovecollege: o, "no-ip": o, forumz: o, nsupdate: o, dnsupdate: o, "v-info": o }], int: [1, { eu: a3 }], io: [1, { 2038: o, co: a3, com: a3, edu: a3, gov: a3, mil: a3, net: a3, nom: a3, org: a3, "on-acorn": e, myaddr: o, apigee: o, "b-data": o, beagleboard: o, bitbucket: o, bluebite: o, boxfuse: o, brave: M2, browsersafetymark: o, bubble: f2, bubbleapps: o, bigv: [0, { uk0: o }], cleverapps: o, cloudbeesusercontent: o, dappnode: [0, { dyndns: o }], darklang: o, definima: o, dedyn: o, icp0: na, icp1: na, qzz: o, "fh-muenster": o, shw: o, forgerock: [0, { id: o }], gitbook: o, github: o, gitlab: o, lolipop: o, "hasura-app": o, hostyhosting: o, hypernode: o, moonscale: e, beebyte: F2, beebyteapp: [0, { sekd1: o }], jele: o, webthings: o, loginline: o, barsy: o, azurecontainer: e, ngrok: [2, { ap: o, au: o, eu: o, in: o, jp: o, sa: o, us: o }], nodeart: [0, { stage: o }], pantheonsite: o, pstmn: [2, { mock: o }], protonet: o, qcx: [2, { sys: e }], qoto: o, vaporcloud: o, myrdbx: o, "rb-hosting": H, "on-k3s": e, "on-rio": e, readthedocs: o, resindevice: o, resinstaging: [0, { devices: o }], hzc: o, sandcats: o, scrypted: [0, { client: o }], "mo-siemens": o, lair: Z, stolos: e, musician: o, utwente: o, edugit: o, telebit: o, thingdust: [0, { dev: J, disrec: J, prod: ta, testing: J }], tickets: o, webflow: o, webflowtest: o, editorx: o, wixstudio: o, basicserver: o, virtualserver: o }], iq: w2, ir: [1, { ac: a3, co: a3, gov: a3, id: a3, net: a3, org: a3, sch: a3, "xn--mgba3a4f16a": a3, ایران: a3, "xn--mgba3a4fra": a3, ايران: a3, arvanedge: o, vistablog: o }], is: a3, it: [1, { edu: a3, gov: a3, abr: a3, abruzzo: a3, "aosta-valley": a3, aostavalley: a3, bas: a3, basilicata: a3, cal: a3, calabria: a3, cam: a3, campania: a3, "emilia-romagna": a3, emiliaromagna: a3, emr: a3, "friuli-v-giulia": a3, "friuli-ve-giulia": a3, "friuli-vegiulia": a3, "friuli-venezia-giulia": a3, "friuli-veneziagiulia": a3, "friuli-vgiulia": a3, "friuliv-giulia": a3, "friulive-giulia": a3, friulivegiulia: a3, "friulivenezia-giulia": a3, friuliveneziagiulia: a3, friulivgiulia: a3, fvg: a3, laz: a3, lazio: a3, lig: a3, liguria: a3, lom: a3, lombardia: a3, lombardy: a3, lucania: a3, mar: a3, marche: a3, mol: a3, molise: a3, piedmont: a3, piemonte: a3, pmn: a3, pug: a3, puglia: a3, sar: a3, sardegna: a3, sardinia: a3, sic: a3, sicilia: a3, sicily: a3, taa: a3, tos: a3, toscana: a3, "trentin-sud-tirol": a3, "xn--trentin-sd-tirol-rzb": a3, "trentin-süd-tirol": a3, "trentin-sudtirol": a3, "xn--trentin-sdtirol-7vb": a3, "trentin-südtirol": a3, "trentin-sued-tirol": a3, "trentin-suedtirol": a3, trentino: a3, "trentino-a-adige": a3, "trentino-aadige": a3, "trentino-alto-adige": a3, "trentino-altoadige": a3, "trentino-s-tirol": a3, "trentino-stirol": a3, "trentino-sud-tirol": a3, "xn--trentino-sd-tirol-c3b": a3, "trentino-süd-tirol": a3, "trentino-sudtirol": a3, "xn--trentino-sdtirol-szb": a3, "trentino-südtirol": a3, "trentino-sued-tirol": a3, "trentino-suedtirol": a3, "trentinoa-adige": a3, trentinoaadige: a3, "trentinoalto-adige": a3, trentinoaltoadige: a3, "trentinos-tirol": a3, trentinostirol: a3, "trentinosud-tirol": a3, "xn--trentinosd-tirol-rzb": a3, "trentinosüd-tirol": a3, trentinosudtirol: a3, "xn--trentinosdtirol-7vb": a3, trentinosüdtirol: a3, "trentinosued-tirol": a3, trentinosuedtirol: a3, "trentinsud-tirol": a3, "xn--trentinsd-tirol-6vb": a3, "trentinsüd-tirol": a3, trentinsudtirol: a3, "xn--trentinsdtirol-nsb": a3, trentinsüdtirol: a3, "trentinsued-tirol": a3, trentinsuedtirol: a3, tuscany: a3, umb: a3, umbria: a3, "val-d-aosta": a3, "val-daosta": a3, "vald-aosta": a3, valdaosta: a3, "valle-aosta": a3, "valle-d-aosta": a3, "valle-daosta": a3, valleaosta: a3, "valled-aosta": a3, valledaosta: a3, "vallee-aoste": a3, "xn--valle-aoste-ebb": a3, "vallée-aoste": a3, "vallee-d-aoste": a3, "xn--valle-d-aoste-ehb": a3, "vallée-d-aoste": a3, valleeaoste: a3, "xn--valleaoste-e7a": a3, valléeaoste: a3, valleedaoste: a3, "xn--valledaoste-ebb": a3, valléedaoste: a3, vao: a3, vda: a3, ven: a3, veneto: a3, ag: a3, agrigento: a3, al: a3, alessandria: a3, "alto-adige": a3, altoadige: a3, an: a3, ancona: a3, "andria-barletta-trani": a3, "andria-trani-barletta": a3, andriabarlettatrani: a3, andriatranibarletta: a3, ao: a3, aosta: a3, aoste: a3, ap: a3, aq: a3, aquila: a3, ar: a3, arezzo: a3, "ascoli-piceno": a3, ascolipiceno: a3, asti: a3, at: a3, av: a3, avellino: a3, ba: a3, balsan: a3, "balsan-sudtirol": a3, "xn--balsan-sdtirol-nsb": a3, "balsan-südtirol": a3, "balsan-suedtirol": a3, bari: a3, "barletta-trani-andria": a3, barlettatraniandria: a3, belluno: a3, benevento: a3, bergamo: a3, bg: a3, bi: a3, biella: a3, bl: a3, bn: a3, bo: a3, bologna: a3, bolzano: a3, "bolzano-altoadige": a3, bozen: a3, "bozen-sudtirol": a3, "xn--bozen-sdtirol-2ob": a3, "bozen-südtirol": a3, "bozen-suedtirol": a3, br: a3, brescia: a3, brindisi: a3, bs: a3, bt: a3, bulsan: a3, "bulsan-sudtirol": a3, "xn--bulsan-sdtirol-nsb": a3, "bulsan-südtirol": a3, "bulsan-suedtirol": a3, bz: a3, ca: a3, cagliari: a3, caltanissetta: a3, "campidano-medio": a3, campidanomedio: a3, campobasso: a3, "carbonia-iglesias": a3, carboniaiglesias: a3, "carrara-massa": a3, carraramassa: a3, caserta: a3, catania: a3, catanzaro: a3, cb: a3, ce: a3, "cesena-forli": a3, "xn--cesena-forl-mcb": a3, "cesena-forlì": a3, cesenaforli: a3, "xn--cesenaforl-i8a": a3, cesenaforlì: a3, ch: a3, chieti: a3, ci: a3, cl: a3, cn: a3, co: a3, como: a3, cosenza: a3, cr: a3, cremona: a3, crotone: a3, cs: a3, ct: a3, cuneo: a3, cz: a3, "dell-ogliastra": a3, dellogliastra: a3, en: a3, enna: a3, fc: a3, fe: a3, fermo: a3, ferrara: a3, fg: a3, fi: a3, firenze: a3, florence: a3, fm: a3, foggia: a3, "forli-cesena": a3, "xn--forl-cesena-fcb": a3, "forlì-cesena": a3, forlicesena: a3, "xn--forlcesena-c8a": a3, forlìcesena: a3, fr: a3, frosinone: a3, ge: a3, genoa: a3, genova: a3, go: a3, gorizia: a3, gr: a3, grosseto: a3, "iglesias-carbonia": a3, iglesiascarbonia: a3, im: a3, imperia: a3, is: a3, isernia: a3, kr: a3, "la-spezia": a3, laquila: a3, laspezia: a3, latina: a3, lc: a3, le: a3, lecce: a3, lecco: a3, li: a3, livorno: a3, lo: a3, lodi: a3, lt: a3, lu: a3, lucca: a3, macerata: a3, mantova: a3, "massa-carrara": a3, massacarrara: a3, matera: a3, mb: a3, mc: a3, me: a3, "medio-campidano": a3, mediocampidano: a3, messina: a3, mi: a3, milan: a3, milano: a3, mn: a3, mo: a3, modena: a3, monza: a3, "monza-brianza": a3, "monza-e-della-brianza": a3, monzabrianza: a3, monzaebrianza: a3, monzaedellabrianza: a3, ms: a3, mt: a3, na: a3, naples: a3, napoli: a3, no: a3, novara: a3, nu: a3, nuoro: a3, og: a3, ogliastra: a3, "olbia-tempio": a3, olbiatempio: a3, or: a3, oristano: a3, ot: a3, pa: a3, padova: a3, padua: a3, palermo: a3, parma: a3, pavia: a3, pc: a3, pd: a3, pe: a3, perugia: a3, "pesaro-urbino": a3, pesarourbino: a3, pescara: a3, pg: a3, pi: a3, piacenza: a3, pisa: a3, pistoia: a3, pn: a3, po: a3, pordenone: a3, potenza: a3, pr: a3, prato: a3, pt: a3, pu: a3, pv: a3, pz: a3, ra: a3, ragusa: a3, ravenna: a3, rc: a3, re: a3, "reggio-calabria": a3, "reggio-emilia": a3, reggiocalabria: a3, reggioemilia: a3, rg: a3, ri: a3, rieti: a3, rimini: a3, rm: a3, rn: a3, ro: a3, roma: a3, rome: a3, rovigo: a3, sa: a3, salerno: a3, sassari: a3, savona: a3, si: a3, siena: a3, siracusa: a3, so: a3, sondrio: a3, sp: a3, sr: a3, ss: a3, "xn--sdtirol-n2a": a3, südtirol: a3, suedtirol: a3, sv: a3, ta: a3, taranto: a3, te: a3, "tempio-olbia": a3, tempioolbia: a3, teramo: a3, terni: a3, tn: a3, to: a3, torino: a3, tp: a3, tr: a3, "trani-andria-barletta": a3, "trani-barletta-andria": a3, traniandriabarletta: a3, tranibarlettaandria: a3, trapani: a3, trento: a3, treviso: a3, trieste: a3, ts: a3, turin: a3, tv: a3, ud: a3, udine: a3, "urbino-pesaro": a3, urbinopesaro: a3, va: a3, varese: a3, vb: a3, vc: a3, ve: a3, venezia: a3, venice: a3, verbania: a3, vercelli: a3, verona: a3, vi: a3, "vibo-valentia": a3, vibovalentia: a3, vicenza: a3, viterbo: a3, vr: a3, vs: a3, vt: a3, vv: a3, "12chars": o, ibxos: o, iliadboxos: o, neen: [0, { jc: o }], "123homepage": o, "16-b": o, "32-b": o, "64-b": o, myspreadshop: o, syncloud: o }], je: [1, { co: a3, net: a3, org: a3, of: o }], jm: r2, jo: [1, { agri: a3, ai: a3, com: a3, edu: a3, eng: a3, fm: a3, gov: a3, mil: a3, net: a3, org: a3, per: a3, phd: a3, sch: a3, tv: a3 }], jobs: a3, jp: [1, { ac: a3, ad: a3, co: a3, ed: a3, go: a3, gr: a3, lg: a3, ne: [1, { aseinet: sa, gehirn: o, ivory: o, "mail-box": o, mints: o, mokuren: o, opal: o, sakura: o, sumomo: o, topaz: o }], or: a3, aichi: [1, { aisai: a3, ama: a3, anjo: a3, asuke: a3, chiryu: a3, chita: a3, fuso: a3, gamagori: a3, handa: a3, hazu: a3, hekinan: a3, higashiura: a3, ichinomiya: a3, inazawa: a3, inuyama: a3, isshiki: a3, iwakura: a3, kanie: a3, kariya: a3, kasugai: a3, kira: a3, kiyosu: a3, komaki: a3, konan: a3, kota: a3, mihama: a3, miyoshi: a3, nishio: a3, nisshin: a3, obu: a3, oguchi: a3, oharu: a3, okazaki: a3, owariasahi: a3, seto: a3, shikatsu: a3, shinshiro: a3, shitara: a3, tahara: a3, takahama: a3, tobishima: a3, toei: a3, togo: a3, tokai: a3, tokoname: a3, toyoake: a3, toyohashi: a3, toyokawa: a3, toyone: a3, toyota: a3, tsushima: a3, yatomi: a3 }], akita: [1, { akita: a3, daisen: a3, fujisato: a3, gojome: a3, hachirogata: a3, happou: a3, higashinaruse: a3, honjo: a3, honjyo: a3, ikawa: a3, kamikoani: a3, kamioka: a3, katagami: a3, kazuno: a3, kitaakita: a3, kosaka: a3, kyowa: a3, misato: a3, mitane: a3, moriyoshi: a3, nikaho: a3, noshiro: a3, odate: a3, oga: a3, ogata: a3, semboku: a3, yokote: a3, yurihonjo: a3 }], aomori: [1, { aomori: a3, gonohe: a3, hachinohe: a3, hashikami: a3, hiranai: a3, hirosaki: a3, itayanagi: a3, kuroishi: a3, misawa: a3, mutsu: a3, nakadomari: a3, noheji: a3, oirase: a3, owani: a3, rokunohe: a3, sannohe: a3, shichinohe: a3, shingo: a3, takko: a3, towada: a3, tsugaru: a3, tsuruta: a3 }], chiba: [1, { abiko: a3, asahi: a3, chonan: a3, chosei: a3, choshi: a3, chuo: a3, funabashi: a3, futtsu: a3, hanamigawa: a3, ichihara: a3, ichikawa: a3, ichinomiya: a3, inzai: a3, isumi: a3, kamagaya: a3, kamogawa: a3, kashiwa: a3, katori: a3, katsuura: a3, kimitsu: a3, kisarazu: a3, kozaki: a3, kujukuri: a3, kyonan: a3, matsudo: a3, midori: a3, mihama: a3, minamiboso: a3, mobara: a3, mutsuzawa: a3, nagara: a3, nagareyama: a3, narashino: a3, narita: a3, noda: a3, oamishirasato: a3, omigawa: a3, onjuku: a3, otaki: a3, sakae: a3, sakura: a3, shimofusa: a3, shirako: a3, shiroi: a3, shisui: a3, sodegaura: a3, sosa: a3, tako: a3, tateyama: a3, togane: a3, tohnosho: a3, tomisato: a3, urayasu: a3, yachimata: a3, yachiyo: a3, yokaichiba: a3, yokoshibahikari: a3, yotsukaido: a3 }], ehime: [1, { ainan: a3, honai: a3, ikata: a3, imabari: a3, iyo: a3, kamijima: a3, kihoku: a3, kumakogen: a3, masaki: a3, matsuno: a3, matsuyama: a3, namikata: a3, niihama: a3, ozu: a3, saijo: a3, seiyo: a3, shikokuchuo: a3, tobe: a3, toon: a3, uchiko: a3, uwajima: a3, yawatahama: a3 }], fukui: [1, { echizen: a3, eiheiji: a3, fukui: a3, ikeda: a3, katsuyama: a3, mihama: a3, minamiechizen: a3, obama: a3, ohi: a3, ono: a3, sabae: a3, sakai: a3, takahama: a3, tsuruga: a3, wakasa: a3 }], fukuoka: [1, { ashiya: a3, buzen: a3, chikugo: a3, chikuho: a3, chikujo: a3, chikushino: a3, chikuzen: a3, chuo: a3, dazaifu: a3, fukuchi: a3, hakata: a3, higashi: a3, hirokawa: a3, hisayama: a3, iizuka: a3, inatsuki: a3, kaho: a3, kasuga: a3, kasuya: a3, kawara: a3, keisen: a3, koga: a3, kurate: a3, kurogi: a3, kurume: a3, minami: a3, miyako: a3, miyama: a3, miyawaka: a3, mizumaki: a3, munakata: a3, nakagawa: a3, nakama: a3, nishi: a3, nogata: a3, ogori: a3, okagaki: a3, okawa: a3, oki: a3, omuta: a3, onga: a3, onojo: a3, oto: a3, saigawa: a3, sasaguri: a3, shingu: a3, shinyoshitomi: a3, shonai: a3, soeda: a3, sue: a3, tachiarai: a3, tagawa: a3, takata: a3, toho: a3, toyotsu: a3, tsuiki: a3, ukiha: a3, umi: a3, usui: a3, yamada: a3, yame: a3, yanagawa: a3, yukuhashi: a3 }], fukushima: [1, { aizubange: a3, aizumisato: a3, aizuwakamatsu: a3, asakawa: a3, bandai: a3, date: a3, fukushima: a3, furudono: a3, futaba: a3, hanawa: a3, higashi: a3, hirata: a3, hirono: a3, iitate: a3, inawashiro: a3, ishikawa: a3, iwaki: a3, izumizaki: a3, kagamiishi: a3, kaneyama: a3, kawamata: a3, kitakata: a3, kitashiobara: a3, koori: a3, koriyama: a3, kunimi: a3, miharu: a3, mishima: a3, namie: a3, nango: a3, nishiaizu: a3, nishigo: a3, okuma: a3, omotego: a3, ono: a3, otama: a3, samegawa: a3, shimogo: a3, shirakawa: a3, showa: a3, soma: a3, sukagawa: a3, taishin: a3, tamakawa: a3, tanagura: a3, tenei: a3, yabuki: a3, yamato: a3, yamatsuri: a3, yanaizu: a3, yugawa: a3 }], gifu: [1, { anpachi: a3, ena: a3, gifu: a3, ginan: a3, godo: a3, gujo: a3, hashima: a3, hichiso: a3, hida: a3, higashishirakawa: a3, ibigawa: a3, ikeda: a3, kakamigahara: a3, kani: a3, kasahara: a3, kasamatsu: a3, kawaue: a3, kitagata: a3, mino: a3, minokamo: a3, mitake: a3, mizunami: a3, motosu: a3, nakatsugawa: a3, ogaki: a3, sakahogi: a3, seki: a3, sekigahara: a3, shirakawa: a3, tajimi: a3, takayama: a3, tarui: a3, toki: a3, tomika: a3, wanouchi: a3, yamagata: a3, yaotsu: a3, yoro: a3 }], gunma: [1, { annaka: a3, chiyoda: a3, fujioka: a3, higashiagatsuma: a3, isesaki: a3, itakura: a3, kanna: a3, kanra: a3, katashina: a3, kawaba: a3, kiryu: a3, kusatsu: a3, maebashi: a3, meiwa: a3, midori: a3, minakami: a3, naganohara: a3, nakanojo: a3, nanmoku: a3, numata: a3, oizumi: a3, ora: a3, ota: a3, shibukawa: a3, shimonita: a3, shinto: a3, showa: a3, takasaki: a3, takayama: a3, tamamura: a3, tatebayashi: a3, tomioka: a3, tsukiyono: a3, tsumagoi: a3, ueno: a3, yoshioka: a3 }], hiroshima: [1, { asaminami: a3, daiwa: a3, etajima: a3, fuchu: a3, fukuyama: a3, hatsukaichi: a3, higashihiroshima: a3, hongo: a3, jinsekikogen: a3, kaita: a3, kui: a3, kumano: a3, kure: a3, mihara: a3, miyoshi: a3, naka: a3, onomichi: a3, osakikamijima: a3, otake: a3, saka: a3, sera: a3, seranishi: a3, shinichi: a3, shobara: a3, takehara: a3 }], hokkaido: [1, { abashiri: a3, abira: a3, aibetsu: a3, akabira: a3, akkeshi: a3, asahikawa: a3, ashibetsu: a3, ashoro: a3, assabu: a3, atsuma: a3, bibai: a3, biei: a3, bifuka: a3, bihoro: a3, biratori: a3, chippubetsu: a3, chitose: a3, date: a3, ebetsu: a3, embetsu: a3, eniwa: a3, erimo: a3, esan: a3, esashi: a3, fukagawa: a3, fukushima: a3, furano: a3, furubira: a3, haboro: a3, hakodate: a3, hamatonbetsu: a3, hidaka: a3, higashikagura: a3, higashikawa: a3, hiroo: a3, hokuryu: a3, hokuto: a3, honbetsu: a3, horokanai: a3, horonobe: a3, ikeda: a3, imakane: a3, ishikari: a3, iwamizawa: a3, iwanai: a3, kamifurano: a3, kamikawa: a3, kamishihoro: a3, kamisunagawa: a3, kamoenai: a3, kayabe: a3, kembuchi: a3, kikonai: a3, kimobetsu: a3, kitahiroshima: a3, kitami: a3, kiyosato: a3, koshimizu: a3, kunneppu: a3, kuriyama: a3, kuromatsunai: a3, kushiro: a3, kutchan: a3, kyowa: a3, mashike: a3, matsumae: a3, mikasa: a3, minamifurano: a3, mombetsu: a3, moseushi: a3, mukawa: a3, muroran: a3, naie: a3, nakagawa: a3, nakasatsunai: a3, nakatombetsu: a3, nanae: a3, nanporo: a3, nayoro: a3, nemuro: a3, niikappu: a3, niki: a3, nishiokoppe: a3, noboribetsu: a3, numata: a3, obihiro: a3, obira: a3, oketo: a3, okoppe: a3, otaru: a3, otobe: a3, otofuke: a3, otoineppu: a3, oumu: a3, ozora: a3, pippu: a3, rankoshi: a3, rebun: a3, rikubetsu: a3, rishiri: a3, rishirifuji: a3, saroma: a3, sarufutsu: a3, shakotan: a3, shari: a3, shibecha: a3, shibetsu: a3, shikabe: a3, shikaoi: a3, shimamaki: a3, shimizu: a3, shimokawa: a3, shinshinotsu: a3, shintoku: a3, shiranuka: a3, shiraoi: a3, shiriuchi: a3, sobetsu: a3, sunagawa: a3, taiki: a3, takasu: a3, takikawa: a3, takinoue: a3, teshikaga: a3, tobetsu: a3, tohma: a3, tomakomai: a3, tomari: a3, toya: a3, toyako: a3, toyotomi: a3, toyoura: a3, tsubetsu: a3, tsukigata: a3, urakawa: a3, urausu: a3, uryu: a3, utashinai: a3, wakkanai: a3, wassamu: a3, yakumo: a3, yoichi: a3 }], hyogo: [1, { aioi: a3, akashi: a3, ako: a3, amagasaki: a3, aogaki: a3, asago: a3, ashiya: a3, awaji: a3, fukusaki: a3, goshiki: a3, harima: a3, himeji: a3, ichikawa: a3, inagawa: a3, itami: a3, kakogawa: a3, kamigori: a3, kamikawa: a3, kasai: a3, kasuga: a3, kawanishi: a3, miki: a3, minamiawaji: a3, nishinomiya: a3, nishiwaki: a3, ono: a3, sanda: a3, sannan: a3, sasayama: a3, sayo: a3, shingu: a3, shinonsen: a3, shiso: a3, sumoto: a3, taishi: a3, taka: a3, takarazuka: a3, takasago: a3, takino: a3, tamba: a3, tatsuno: a3, toyooka: a3, yabu: a3, yashiro: a3, yoka: a3, yokawa: a3 }], ibaraki: [1, { ami: a3, asahi: a3, bando: a3, chikusei: a3, daigo: a3, fujishiro: a3, hitachi: a3, hitachinaka: a3, hitachiomiya: a3, hitachiota: a3, ibaraki: a3, ina: a3, inashiki: a3, itako: a3, iwama: a3, joso: a3, kamisu: a3, kasama: a3, kashima: a3, kasumigaura: a3, koga: a3, miho: a3, mito: a3, moriya: a3, naka: a3, namegata: a3, oarai: a3, ogawa: a3, omitama: a3, ryugasaki: a3, sakai: a3, sakuragawa: a3, shimodate: a3, shimotsuma: a3, shirosato: a3, sowa: a3, suifu: a3, takahagi: a3, tamatsukuri: a3, tokai: a3, tomobe: a3, tone: a3, toride: a3, tsuchiura: a3, tsukuba: a3, uchihara: a3, ushiku: a3, yachiyo: a3, yamagata: a3, yawara: a3, yuki: a3 }], ishikawa: [1, { anamizu: a3, hakui: a3, hakusan: a3, kaga: a3, kahoku: a3, kanazawa: a3, kawakita: a3, komatsu: a3, nakanoto: a3, nanao: a3, nomi: a3, nonoichi: a3, noto: a3, shika: a3, suzu: a3, tsubata: a3, tsurugi: a3, uchinada: a3, wajima: a3 }], iwate: [1, { fudai: a3, fujisawa: a3, hanamaki: a3, hiraizumi: a3, hirono: a3, ichinohe: a3, ichinoseki: a3, iwaizumi: a3, iwate: a3, joboji: a3, kamaishi: a3, kanegasaki: a3, karumai: a3, kawai: a3, kitakami: a3, kuji: a3, kunohe: a3, kuzumaki: a3, miyako: a3, mizusawa: a3, morioka: a3, ninohe: a3, noda: a3, ofunato: a3, oshu: a3, otsuchi: a3, rikuzentakata: a3, shiwa: a3, shizukuishi: a3, sumita: a3, tanohata: a3, tono: a3, yahaba: a3, yamada: a3 }], kagawa: [1, { ayagawa: a3, higashikagawa: a3, kanonji: a3, kotohira: a3, manno: a3, marugame: a3, mitoyo: a3, naoshima: a3, sanuki: a3, tadotsu: a3, takamatsu: a3, tonosho: a3, uchinomi: a3, utazu: a3, zentsuji: a3 }], kagoshima: [1, { akune: a3, amami: a3, hioki: a3, isa: a3, isen: a3, izumi: a3, kagoshima: a3, kanoya: a3, kawanabe: a3, kinko: a3, kouyama: a3, makurazaki: a3, matsumoto: a3, minamitane: a3, nakatane: a3, nishinoomote: a3, satsumasendai: a3, soo: a3, tarumizu: a3, yusui: a3 }], kanagawa: [1, { aikawa: a3, atsugi: a3, ayase: a3, chigasaki: a3, ebina: a3, fujisawa: a3, hadano: a3, hakone: a3, hiratsuka: a3, isehara: a3, kaisei: a3, kamakura: a3, kiyokawa: a3, matsuda: a3, minamiashigara: a3, miura: a3, nakai: a3, ninomiya: a3, odawara: a3, oi: a3, oiso: a3, sagamihara: a3, samukawa: a3, tsukui: a3, yamakita: a3, yamato: a3, yokosuka: a3, yugawara: a3, zama: a3, zushi: a3 }], kochi: [1, { aki: a3, geisei: a3, hidaka: a3, higashitsuno: a3, ino: a3, kagami: a3, kami: a3, kitagawa: a3, kochi: a3, mihara: a3, motoyama: a3, muroto: a3, nahari: a3, nakamura: a3, nankoku: a3, nishitosa: a3, niyodogawa: a3, ochi: a3, okawa: a3, otoyo: a3, otsuki: a3, sakawa: a3, sukumo: a3, susaki: a3, tosa: a3, tosashimizu: a3, toyo: a3, tsuno: a3, umaji: a3, yasuda: a3, yusuhara: a3 }], kumamoto: [1, { amakusa: a3, arao: a3, aso: a3, choyo: a3, gyokuto: a3, kamiamakusa: a3, kikuchi: a3, kumamoto: a3, mashiki: a3, mifune: a3, minamata: a3, minamioguni: a3, nagasu: a3, nishihara: a3, oguni: a3, ozu: a3, sumoto: a3, takamori: a3, uki: a3, uto: a3, yamaga: a3, yamato: a3, yatsushiro: a3 }], kyoto: [1, { ayabe: a3, fukuchiyama: a3, higashiyama: a3, ide: a3, ine: a3, joyo: a3, kameoka: a3, kamo: a3, kita: a3, kizu: a3, kumiyama: a3, kyotamba: a3, kyotanabe: a3, kyotango: a3, maizuru: a3, minami: a3, minamiyamashiro: a3, miyazu: a3, muko: a3, nagaokakyo: a3, nakagyo: a3, nantan: a3, oyamazaki: a3, sakyo: a3, seika: a3, tanabe: a3, uji: a3, ujitawara: a3, wazuka: a3, yamashina: a3, yawata: a3 }], mie: [1, { asahi: a3, inabe: a3, ise: a3, kameyama: a3, kawagoe: a3, kiho: a3, kisosaki: a3, kiwa: a3, komono: a3, kumano: a3, kuwana: a3, matsusaka: a3, meiwa: a3, mihama: a3, minamiise: a3, misugi: a3, miyama: a3, nabari: a3, shima: a3, suzuka: a3, tado: a3, taiki: a3, taki: a3, tamaki: a3, toba: a3, tsu: a3, udono: a3, ureshino: a3, watarai: a3, yokkaichi: a3 }], miyagi: [1, { furukawa: a3, higashimatsushima: a3, ishinomaki: a3, iwanuma: a3, kakuda: a3, kami: a3, kawasaki: a3, marumori: a3, matsushima: a3, minamisanriku: a3, misato: a3, murata: a3, natori: a3, ogawara: a3, ohira: a3, onagawa: a3, osaki: a3, rifu: a3, semine: a3, shibata: a3, shichikashuku: a3, shikama: a3, shiogama: a3, shiroishi: a3, tagajo: a3, taiwa: a3, tome: a3, tomiya: a3, wakuya: a3, watari: a3, yamamoto: a3, zao: a3 }], miyazaki: [1, { aya: a3, ebino: a3, gokase: a3, hyuga: a3, kadogawa: a3, kawaminami: a3, kijo: a3, kitagawa: a3, kitakata: a3, kitaura: a3, kobayashi: a3, kunitomi: a3, kushima: a3, mimata: a3, miyakonojo: a3, miyazaki: a3, morotsuka: a3, nichinan: a3, nishimera: a3, nobeoka: a3, saito: a3, shiiba: a3, shintomi: a3, takaharu: a3, takanabe: a3, takazaki: a3, tsuno: a3 }], nagano: [1, { achi: a3, agematsu: a3, anan: a3, aoki: a3, asahi: a3, azumino: a3, chikuhoku: a3, chikuma: a3, chino: a3, fujimi: a3, hakuba: a3, hara: a3, hiraya: a3, iida: a3, iijima: a3, iiyama: a3, iizuna: a3, ikeda: a3, ikusaka: a3, ina: a3, karuizawa: a3, kawakami: a3, kiso: a3, kisofukushima: a3, kitaaiki: a3, komagane: a3, komoro: a3, matsukawa: a3, matsumoto: a3, miasa: a3, minamiaiki: a3, minamimaki: a3, minamiminowa: a3, minowa: a3, miyada: a3, miyota: a3, mochizuki: a3, nagano: a3, nagawa: a3, nagiso: a3, nakagawa: a3, nakano: a3, nozawaonsen: a3, obuse: a3, ogawa: a3, okaya: a3, omachi: a3, omi: a3, ookuwa: a3, ooshika: a3, otaki: a3, otari: a3, sakae: a3, sakaki: a3, saku: a3, sakuho: a3, shimosuwa: a3, shinanomachi: a3, shiojiri: a3, suwa: a3, suzaka: a3, takagi: a3, takamori: a3, takayama: a3, tateshina: a3, tatsuno: a3, togakushi: a3, togura: a3, tomi: a3, ueda: a3, wada: a3, yamagata: a3, yamanouchi: a3, yasaka: a3, yasuoka: a3 }], nagasaki: [1, { chijiwa: a3, futsu: a3, goto: a3, hasami: a3, hirado: a3, iki: a3, isahaya: a3, kawatana: a3, kuchinotsu: a3, matsuura: a3, nagasaki: a3, obama: a3, omura: a3, oseto: a3, saikai: a3, sasebo: a3, seihi: a3, shimabara: a3, shinkamigoto: a3, togitsu: a3, tsushima: a3, unzen: a3 }], nara: [1, { ando: a3, gose: a3, heguri: a3, higashiyoshino: a3, ikaruga: a3, ikoma: a3, kamikitayama: a3, kanmaki: a3, kashiba: a3, kashihara: a3, katsuragi: a3, kawai: a3, kawakami: a3, kawanishi: a3, koryo: a3, kurotaki: a3, mitsue: a3, miyake: a3, nara: a3, nosegawa: a3, oji: a3, ouda: a3, oyodo: a3, sakurai: a3, sango: a3, shimoichi: a3, shimokitayama: a3, shinjo: a3, soni: a3, takatori: a3, tawaramoto: a3, tenkawa: a3, tenri: a3, uda: a3, yamatokoriyama: a3, yamatotakada: a3, yamazoe: a3, yoshino: a3 }], niigata: [1, { aga: a3, agano: a3, gosen: a3, itoigawa: a3, izumozaki: a3, joetsu: a3, kamo: a3, kariwa: a3, kashiwazaki: a3, minamiuonuma: a3, mitsuke: a3, muika: a3, murakami: a3, myoko: a3, nagaoka: a3, niigata: a3, ojiya: a3, omi: a3, sado: a3, sanjo: a3, seiro: a3, seirou: a3, sekikawa: a3, shibata: a3, tagami: a3, tainai: a3, tochio: a3, tokamachi: a3, tsubame: a3, tsunan: a3, uonuma: a3, yahiko: a3, yoita: a3, yuzawa: a3 }], oita: [1, { beppu: a3, bungoono: a3, bungotakada: a3, hasama: a3, hiji: a3, himeshima: a3, hita: a3, kamitsue: a3, kokonoe: a3, kuju: a3, kunisaki: a3, kusu: a3, oita: a3, saiki: a3, taketa: a3, tsukumi: a3, usa: a3, usuki: a3, yufu: a3 }], okayama: [1, { akaiwa: a3, asakuchi: a3, bizen: a3, hayashima: a3, ibara: a3, kagamino: a3, kasaoka: a3, kibichuo: a3, kumenan: a3, kurashiki: a3, maniwa: a3, misaki: a3, nagi: a3, niimi: a3, nishiawakura: a3, okayama: a3, satosho: a3, setouchi: a3, shinjo: a3, shoo: a3, soja: a3, takahashi: a3, tamano: a3, tsuyama: a3, wake: a3, yakage: a3 }], okinawa: [1, { aguni: a3, ginowan: a3, ginoza: a3, gushikami: a3, haebaru: a3, higashi: a3, hirara: a3, iheya: a3, ishigaki: a3, ishikawa: a3, itoman: a3, izena: a3, kadena: a3, kin: a3, kitadaito: a3, kitanakagusuku: a3, kumejima: a3, kunigami: a3, minamidaito: a3, motobu: a3, nago: a3, naha: a3, nakagusuku: a3, nakijin: a3, nanjo: a3, nishihara: a3, ogimi: a3, okinawa: a3, onna: a3, shimoji: a3, taketomi: a3, tarama: a3, tokashiki: a3, tomigusuku: a3, tonaki: a3, urasoe: a3, uruma: a3, yaese: a3, yomitan: a3, yonabaru: a3, yonaguni: a3, zamami: a3 }], osaka: [1, { abeno: a3, chihayaakasaka: a3, chuo: a3, daito: a3, fujiidera: a3, habikino: a3, hannan: a3, higashiosaka: a3, higashisumiyoshi: a3, higashiyodogawa: a3, hirakata: a3, ibaraki: a3, ikeda: a3, izumi: a3, izumiotsu: a3, izumisano: a3, kadoma: a3, kaizuka: a3, kanan: a3, kashiwara: a3, katano: a3, kawachinagano: a3, kishiwada: a3, kita: a3, kumatori: a3, matsubara: a3, minato: a3, minoh: a3, misaki: a3, moriguchi: a3, neyagawa: a3, nishi: a3, nose: a3, osakasayama: a3, sakai: a3, sayama: a3, sennan: a3, settsu: a3, shijonawate: a3, shimamoto: a3, suita: a3, tadaoka: a3, taishi: a3, tajiri: a3, takaishi: a3, takatsuki: a3, tondabayashi: a3, toyonaka: a3, toyono: a3, yao: a3 }], saga: [1, { ariake: a3, arita: a3, fukudomi: a3, genkai: a3, hamatama: a3, hizen: a3, imari: a3, kamimine: a3, kanzaki: a3, karatsu: a3, kashima: a3, kitagata: a3, kitahata: a3, kiyama: a3, kouhoku: a3, kyuragi: a3, nishiarita: a3, ogi: a3, omachi: a3, ouchi: a3, saga: a3, shiroishi: a3, taku: a3, tara: a3, tosu: a3, yoshinogari: a3 }], saitama: [1, { arakawa: a3, asaka: a3, chichibu: a3, fujimi: a3, fujimino: a3, fukaya: a3, hanno: a3, hanyu: a3, hasuda: a3, hatogaya: a3, hatoyama: a3, hidaka: a3, higashichichibu: a3, higashimatsuyama: a3, honjo: a3, ina: a3, iruma: a3, iwatsuki: a3, kamiizumi: a3, kamikawa: a3, kamisato: a3, kasukabe: a3, kawagoe: a3, kawaguchi: a3, kawajima: a3, kazo: a3, kitamoto: a3, koshigaya: a3, kounosu: a3, kuki: a3, kumagaya: a3, matsubushi: a3, minano: a3, misato: a3, miyashiro: a3, miyoshi: a3, moroyama: a3, nagatoro: a3, namegawa: a3, niiza: a3, ogano: a3, ogawa: a3, ogose: a3, okegawa: a3, omiya: a3, otaki: a3, ranzan: a3, ryokami: a3, saitama: a3, sakado: a3, satte: a3, sayama: a3, shiki: a3, shiraoka: a3, soka: a3, sugito: a3, toda: a3, tokigawa: a3, tokorozawa: a3, tsurugashima: a3, urawa: a3, warabi: a3, yashio: a3, yokoze: a3, yono: a3, yorii: a3, yoshida: a3, yoshikawa: a3, yoshimi: a3 }], shiga: [1, { aisho: a3, gamo: a3, higashiomi: a3, hikone: a3, koka: a3, konan: a3, kosei: a3, koto: a3, kusatsu: a3, maibara: a3, moriyama: a3, nagahama: a3, nishiazai: a3, notogawa: a3, omihachiman: a3, otsu: a3, ritto: a3, ryuoh: a3, takashima: a3, takatsuki: a3, torahime: a3, toyosato: a3, yasu: a3 }], shimane: [1, { akagi: a3, ama: a3, gotsu: a3, hamada: a3, higashiizumo: a3, hikawa: a3, hikimi: a3, izumo: a3, kakinoki: a3, masuda: a3, matsue: a3, misato: a3, nishinoshima: a3, ohda: a3, okinoshima: a3, okuizumo: a3, shimane: a3, tamayu: a3, tsuwano: a3, unnan: a3, yakumo: a3, yasugi: a3, yatsuka: a3 }], shizuoka: [1, { arai: a3, atami: a3, fuji: a3, fujieda: a3, fujikawa: a3, fujinomiya: a3, fukuroi: a3, gotemba: a3, haibara: a3, hamamatsu: a3, higashiizu: a3, ito: a3, iwata: a3, izu: a3, izunokuni: a3, kakegawa: a3, kannami: a3, kawanehon: a3, kawazu: a3, kikugawa: a3, kosai: a3, makinohara: a3, matsuzaki: a3, minamiizu: a3, mishima: a3, morimachi: a3, nishiizu: a3, numazu: a3, omaezaki: a3, shimada: a3, shimizu: a3, shimoda: a3, shizuoka: a3, susono: a3, yaizu: a3, yoshida: a3 }], tochigi: [1, { ashikaga: a3, bato: a3, haga: a3, ichikai: a3, iwafune: a3, kaminokawa: a3, kanuma: a3, karasuyama: a3, kuroiso: a3, mashiko: a3, mibu: a3, moka: a3, motegi: a3, nasu: a3, nasushiobara: a3, nikko: a3, nishikata: a3, nogi: a3, ohira: a3, ohtawara: a3, oyama: a3, sakura: a3, sano: a3, shimotsuke: a3, shioya: a3, takanezawa: a3, tochigi: a3, tsuga: a3, ujiie: a3, utsunomiya: a3, yaita: a3 }], tokushima: [1, { aizumi: a3, anan: a3, ichiba: a3, itano: a3, kainan: a3, komatsushima: a3, matsushige: a3, mima: a3, minami: a3, miyoshi: a3, mugi: a3, nakagawa: a3, naruto: a3, sanagochi: a3, shishikui: a3, tokushima: a3, wajiki: a3 }], tokyo: [1, { adachi: a3, akiruno: a3, akishima: a3, aogashima: a3, arakawa: a3, bunkyo: a3, chiyoda: a3, chofu: a3, chuo: a3, edogawa: a3, fuchu: a3, fussa: a3, hachijo: a3, hachioji: a3, hamura: a3, higashikurume: a3, higashimurayama: a3, higashiyamato: a3, hino: a3, hinode: a3, hinohara: a3, inagi: a3, itabashi: a3, katsushika: a3, kita: a3, kiyose: a3, kodaira: a3, koganei: a3, kokubunji: a3, komae: a3, koto: a3, kouzushima: a3, kunitachi: a3, machida: a3, meguro: a3, minato: a3, mitaka: a3, mizuho: a3, musashimurayama: a3, musashino: a3, nakano: a3, nerima: a3, ogasawara: a3, okutama: a3, ome: a3, oshima: a3, ota: a3, setagaya: a3, shibuya: a3, shinagawa: a3, shinjuku: a3, suginami: a3, sumida: a3, tachikawa: a3, taito: a3, tama: a3, toshima: a3 }], tottori: [1, { chizu: a3, hino: a3, kawahara: a3, koge: a3, kotoura: a3, misasa: a3, nanbu: a3, nichinan: a3, sakaiminato: a3, tottori: a3, wakasa: a3, yazu: a3, yonago: a3 }], toyama: [1, { asahi: a3, fuchu: a3, fukumitsu: a3, funahashi: a3, himi: a3, imizu: a3, inami: a3, johana: a3, kamiichi: a3, kurobe: a3, nakaniikawa: a3, namerikawa: a3, nanto: a3, nyuzen: a3, oyabe: a3, taira: a3, takaoka: a3, tateyama: a3, toga: a3, tonami: a3, toyama: a3, unazuki: a3, uozu: a3, yamada: a3 }], wakayama: [1, { arida: a3, aridagawa: a3, gobo: a3, hashimoto: a3, hidaka: a3, hirogawa: a3, inami: a3, iwade: a3, kainan: a3, kamitonda: a3, katsuragi: a3, kimino: a3, kinokawa: a3, kitayama: a3, koya: a3, koza: a3, kozagawa: a3, kudoyama: a3, kushimoto: a3, mihama: a3, misato: a3, nachikatsuura: a3, shingu: a3, shirahama: a3, taiji: a3, tanabe: a3, wakayama: a3, yuasa: a3, yura: a3 }], yamagata: [1, { asahi: a3, funagata: a3, higashine: a3, iide: a3, kahoku: a3, kaminoyama: a3, kaneyama: a3, kawanishi: a3, mamurogawa: a3, mikawa: a3, murayama: a3, nagai: a3, nakayama: a3, nanyo: a3, nishikawa: a3, obanazawa: a3, oe: a3, oguni: a3, ohkura: a3, oishida: a3, sagae: a3, sakata: a3, sakegawa: a3, shinjo: a3, shirataka: a3, shonai: a3, takahata: a3, tendo: a3, tozawa: a3, tsuruoka: a3, yamagata: a3, yamanobe: a3, yonezawa: a3, yuza: a3 }], yamaguchi: [1, { abu: a3, hagi: a3, hikari: a3, hofu: a3, iwakuni: a3, kudamatsu: a3, mitou: a3, nagato: a3, oshima: a3, shimonoseki: a3, shunan: a3, tabuse: a3, tokuyama: a3, toyota: a3, ube: a3, yuu: a3 }], yamanashi: [1, { chuo: a3, doshi: a3, fuefuki: a3, fujikawa: a3, fujikawaguchiko: a3, fujiyoshida: a3, hayakawa: a3, hokuto: a3, ichikawamisato: a3, kai: a3, kofu: a3, koshu: a3, kosuge: a3, "minami-alps": a3, minobu: a3, nakamichi: a3, nanbu: a3, narusawa: a3, nirasaki: a3, nishikatsura: a3, oshino: a3, otsuki: a3, showa: a3, tabayama: a3, tsuru: a3, uenohara: a3, yamanakako: a3, yamanashi: a3 }], "xn--ehqz56n": a3, 三重: a3, "xn--1lqs03n": a3, 京都: a3, "xn--qqqt11m": a3, 佐賀: a3, "xn--f6qx53a": a3, 兵庫: a3, "xn--djrs72d6uy": a3, 北海道: a3, "xn--mkru45i": a3, 千葉: a3, "xn--0trq7p7nn": a3, 和歌山: a3, "xn--5js045d": a3, 埼玉: a3, "xn--kbrq7o": a3, 大分: a3, "xn--pssu33l": a3, 大阪: a3, "xn--ntsq17g": a3, 奈良: a3, "xn--uisz3g": a3, 宮城: a3, "xn--6btw5a": a3, 宮崎: a3, "xn--1ctwo": a3, 富山: a3, "xn--6orx2r": a3, 山口: a3, "xn--rht61e": a3, 山形: a3, "xn--rht27z": a3, 山梨: a3, "xn--nit225k": a3, 岐阜: a3, "xn--rht3d": a3, 岡山: a3, "xn--djty4k": a3, 岩手: a3, "xn--klty5x": a3, 島根: a3, "xn--kltx9a": a3, 広島: a3, "xn--kltp7d": a3, 徳島: a3, "xn--c3s14m": a3, 愛媛: a3, "xn--vgu402c": a3, 愛知: a3, "xn--efvn9s": a3, 新潟: a3, "xn--1lqs71d": a3, 東京: a3, "xn--4pvxs": a3, 栃木: a3, "xn--uuwu58a": a3, 沖縄: a3, "xn--zbx025d": a3, 滋賀: a3, "xn--8pvr4u": a3, 熊本: a3, "xn--5rtp49c": a3, 石川: a3, "xn--ntso0iqx3a": a3, 神奈川: a3, "xn--elqq16h": a3, 福井: a3, "xn--4it168d": a3, 福岡: a3, "xn--klt787d": a3, 福島: a3, "xn--rny31h": a3, 秋田: a3, "xn--7t0a264c": a3, 群馬: a3, "xn--uist22h": a3, 茨城: a3, "xn--8ltr62k": a3, 長崎: a3, "xn--2m4a15e": a3, 長野: a3, "xn--32vp30h": a3, 青森: a3, "xn--4it797k": a3, 静岡: a3, "xn--5rtq34k": a3, 香川: a3, "xn--k7yn95e": a3, 高知: a3, "xn--tor131o": a3, 鳥取: a3, "xn--d5qv7z876c": a3, 鹿児島: a3, kawasaki: r2, kitakyushu: r2, kobe: r2, nagoya: r2, sapporo: r2, sendai: r2, yokohama: r2, buyshop: o, fashionstore: o, handcrafted: o, kawaiishop: o, supersale: o, theshop: o, "0am": o, "0g0": o, "0j0": o, "0t0": o, mydns: o, pgw: o, wjg: o, usercontent: o, angry: o, babyblue: o, babymilk: o, backdrop: o, bambina: o, bitter: o, blush: o, boo: o, boy: o, boyfriend: o, but: o, candypop: o, capoo: o, catfood: o, cheap: o, chicappa: o, chillout: o, chips: o, chowder: o, chu: o, ciao: o, cocotte: o, coolblog: o, cranky: o, cutegirl: o, daa: o, deca: o, deci: o, digick: o, egoism: o, fakefur: o, fem: o, flier: o, floppy: o, fool: o, frenchkiss: o, girlfriend: o, girly: o, gloomy: o, gonna: o, greater: o, hacca: o, heavy: o, her: o, hiho: o, hippy: o, holy: o, hungry: o, icurus: o, itigo: o, jellybean: o, kikirara: o, kill: o, kilo: o, kuron: o, littlestar: o, lolipopmc: o, lolitapunk: o, lomo: o, lovepop: o, lovesick: o, main: o, mods: o, mond: o, mongolian: o, moo: o, namaste: o, nikita: o, nobushi: o, noor: o, oops: o, parallel: o, parasite: o, pecori: o, peewee: o, penne: o, pepper: o, perma: o, pigboat: o, pinoko: o, punyu: o, pupu: o, pussycat: o, pya: o, raindrop: o, readymade: o, sadist: o, schoolbus: o, secret: o, staba: o, stripper: o, sub: o, sunnyday: o, thick: o, tonkotsu: o, under: o, upper: o, velvet: o, verse: o, versus: o, vivian: o, watson: o, weblike: o, whitesnow: o, zombie: o, hateblo: o, hatenablog: o, hatenadiary: o, "2-d": o, bona: o, crap: o, daynight: o, eek: o, flop: o, halfmoon: o, jeez: o, matrix: o, mimoza: o, netgamers: o, nyanta: o, o0o0: o, rdy: o, rgr: o, rulez: o, sakurastorage: [0, { isk01: K, isk02: K }], saloon: o, sblo: o, skr: o, tank: o, "uh-oh": o, undo: o, webaccel: [0, { rs: o, user: o }], websozai: o, xii: o }], ke: [1, { ac: a3, co: a3, go: a3, info: a3, me: a3, mobi: a3, ne: a3, or: a3, sc: a3 }], kg: [1, { com: a3, edu: a3, gov: a3, mil: a3, net: a3, org: a3, us: o, xx: o }], kh: r2, ki: ra, km: [1, { ass: a3, com: a3, edu: a3, gov: a3, mil: a3, nom: a3, org: a3, prd: a3, tm: a3, asso: a3, coop: a3, gouv: a3, medecin: a3, notaires: a3, pharmaciens: a3, presse: a3, veterinaire: a3 }], kn: [1, { edu: a3, gov: a3, net: a3, org: a3 }], kp: [1, { com: a3, edu: a3, gov: a3, org: a3, rep: a3, tra: a3 }], kr: [1, { ac: a3, ai: a3, co: a3, es: a3, go: a3, hs: a3, io: a3, it: a3, kg: a3, me: a3, mil: a3, ms: a3, ne: a3, or: a3, pe: a3, re: a3, sc: a3, busan: a3, chungbuk: a3, chungnam: a3, daegu: a3, daejeon: a3, gangwon: a3, gwangju: a3, gyeongbuk: a3, gyeonggi: a3, gyeongnam: a3, incheon: a3, jeju: a3, jeonbuk: a3, jeonnam: a3, seoul: a3, ulsan: a3, c01: o, "eliv-cdn": o, "eliv-dns": o, mmv: o, vki: o }], kw: [1, { com: a3, edu: a3, emb: a3, gov: a3, ind: a3, net: a3, org: a3 }], ky: _, kz: [1, { com: a3, edu: a3, gov: a3, mil: a3, net: a3, org: a3, jcloud: o }], la: [1, { com: a3, edu: a3, gov: a3, info: a3, int: a3, net: a3, org: a3, per: a3, bnr: o }], lb: m2, lc: [1, { co: a3, com: a3, edu: a3, gov: a3, net: a3, org: a3, oy: o }], li: a3, lk: [1, { ac: a3, assn: a3, com: a3, edu: a3, gov: a3, grp: a3, hotel: a3, int: a3, ltd: a3, net: a3, ngo: a3, org: a3, sch: a3, soc: a3, web: a3 }], lr: m2, ls: [1, { ac: a3, biz: a3, co: a3, edu: a3, gov: a3, info: a3, net: a3, org: a3, sc: a3 }], lt: c2, lu: [1, { "123website": o }], lv: [1, { asn: a3, com: a3, conf: a3, edu: a3, gov: a3, id: a3, mil: a3, net: a3, org: a3 }], ly: [1, { com: a3, edu: a3, gov: a3, id: a3, med: a3, net: a3, org: a3, plc: a3, sch: a3 }], ma: [1, { ac: a3, co: a3, gov: a3, net: a3, org: a3, press: a3 }], mc: [1, { asso: a3, tm: a3 }], md: [1, { ir: o }], me: [1, { ac: a3, co: a3, edu: a3, gov: a3, its: a3, net: a3, org: a3, priv: a3, c66: o, craft: o, edgestack: o, filegear: o, "filegear-sg": o, lohmus: o, barsy: o, mcdir: o, brasilia: o, ddns: o, dnsfor: o, hopto: o, loginto: o, noip: o, webhop: o, soundcast: o, tcp4: o, vp4: o, diskstation: o, dscloud: o, i234: o, myds: o, synology: o, transip: H, nohost: o }], mg: [1, { co: a3, com: a3, edu: a3, gov: a3, mil: a3, nom: a3, org: a3, prd: a3 }], mh: a3, mil: a3, mk: [1, { com: a3, edu: a3, gov: a3, inf: a3, name: a3, net: a3, org: a3 }], ml: [1, { ac: a3, art: a3, asso: a3, com: a3, edu: a3, gouv: a3, gov: a3, info: a3, inst: a3, net: a3, org: a3, pr: a3, presse: a3 }], mm: r2, mn: [1, { edu: a3, gov: a3, org: a3, nyc: o }], mo: m2, mobi: [1, { barsy: o, dscloud: o }], mp: [1, { ju: o }], mq: a3, mr: c2, ms: [1, { com: a3, edu: a3, gov: a3, net: a3, org: a3, minisite: o }], mt: _, mu: [1, { ac: a3, co: a3, com: a3, gov: a3, net: a3, or: a3, org: a3 }], museum: a3, mv: [1, { aero: a3, biz: a3, com: a3, coop: a3, edu: a3, gov: a3, info: a3, int: a3, mil: a3, museum: a3, name: a3, net: a3, org: a3, pro: a3 }], mw: [1, { ac: a3, biz: a3, co: a3, com: a3, coop: a3, edu: a3, gov: a3, int: a3, net: a3, org: a3 }], mx: [1, { com: a3, edu: a3, gob: a3, net: a3, org: a3 }], my: [1, { biz: a3, com: a3, edu: a3, gov: a3, mil: a3, name: a3, net: a3, org: a3 }], mz: [1, { ac: a3, adv: a3, co: a3, edu: a3, gov: a3, mil: a3, net: a3, org: a3 }], na: [1, { alt: a3, co: a3, com: a3, gov: a3, net: a3, org: a3 }], name: [1, { her: ua, his: ua, ispmanager: o }], nc: [1, { asso: a3, nom: a3 }], ne: a3, net: [1, { adobeaemcloud: o, "adobeio-static": o, adobeioruntime: o, akadns: o, akamai: o, "akamai-staging": o, akamaiedge: o, "akamaiedge-staging": o, akamaihd: o, "akamaihd-staging": o, akamaiorigin: o, "akamaiorigin-staging": o, akamaized: o, "akamaized-staging": o, edgekey: o, "edgekey-staging": o, edgesuite: o, "edgesuite-staging": o, alwaysdata: o, myamaze: o, cloudfront: o, appudo: o, "atlassian-dev": [0, { prod: f2 }], myfritz: o, onavstack: o, shopselect: o, blackbaudcdn: o, boomla: o, bplaced: o, square7: o, cdn77: [0, { r: o }], "cdn77-ssl": o, gb: o, hu: o, jp: o, se: o, uk: o, clickrising: o, "ddns-ip": o, "dns-cloud": o, "dns-dynamic": o, cloudaccess: o, cloudflare: [2, { cdn: o }], cloudflareanycast: f2, cloudflarecn: f2, cloudflareglobal: f2, ctfcloud: o, "feste-ip": o, "knx-server": o, "static-access": o, cryptonomic: e, dattolocal: o, mydatto: o, debian: o, definima: o, deno: o, icp: e, de5: o, "at-band-camp": o, blogdns: o, "broke-it": o, buyshouses: o, dnsalias: o, dnsdojo: o, "does-it": o, dontexist: o, dynalias: o, dynathome: o, endofinternet: o, "from-az": o, "from-co": o, "from-la": o, "from-ny": o, "gets-it": o, "ham-radio-op": o, homeftp: o, homeip: o, homelinux: o, homeunix: o, "in-the-band": o, "is-a-chef": o, "is-a-geek": o, "isa-geek": o, "kicks-ass": o, "office-on-the": o, podzone: o, "scrapper-site": o, selfip: o, "sells-it": o, servebbs: o, serveftp: o, thruhere: o, webhop: o, casacam: o, dynu: o, dynv6: o, twmail: o, ru: o, channelsdvr: [2, { u: o }], fastly: [0, { freetls: o, map: o, prod: [0, { a: o, global: o }], ssl: [0, { a: o, b: o, global: o }] }], fastlylb: [2, { map: o }], edgeapp: o, "keyword-on": o, "live-on": o, "server-on": o, "cdn-edges": o, heteml: o, cloudfunctions: o, "grafana-dev": o, iobb: o, moonscale: o, "in-dsl": o, "in-vpn": o, oninferno: o, botdash: o, "apps-1and1": o, ipifony: o, cloudjiffy: [2, { "fra1-de": o, "west1-us": o }], elastx: [0, { "jls-sto1": o, "jls-sto2": o, "jls-sto3": o }], massivegrid: [0, { paas: [0, { "fr-1": o, "lon-1": o, "lon-2": o, "ny-1": o, "ny-2": o, "sg-1": o }] }], saveincloud: [0, { jelastic: o, "nordeste-idc": o }], scaleforce: I2, kinghost: o, uni5: o, krellian: o, ggff: o, localto: e, barsy: o, luyani: o, memset: o, "azure-api": o, "azure-mobile": o, azureedge: o, azurefd: o, azurestaticapps: [2, { 1: o, 2: o, 3: o, 4: o, 5: o, 6: o, 7: o, centralus: o, eastasia: o, eastus2: o, westeurope: o, westus2: o }], azurewebsites: o, cloudapp: o, trafficmanager: o, windows: [0, { core: [0, { blob: o }], servicebus: o }], mynetname: [0, { sn: o }], routingthecloud: o, bounceme: o, ddns: o, "eating-organic": o, mydissent: o, myeffect: o, mymediapc: o, mypsx: o, mysecuritycamera: o, nhlfan: o, "no-ip": o, pgafan: o, privatizehealthinsurance: o, redirectme: o, serveblog: o, serveminecraft: o, sytes: o, dnsup: o, hicam: o, "now-dns": o, ownip: o, vpndns: o, cloudycluster: o, ovh: [0, { hosting: e, webpaas: e }], rackmaze: o, myradweb: o, in: o, "subsc-pay": o, squares: o, schokokeks: o, "firewall-gateway": o, seidat: o, senseering: o, siteleaf: o, mafelo: o, myspreadshop: o, "vps-host": [2, { jelastic: [0, { atl: o, njs: o, ric: o }] }], srcf: [0, { soc: o, user: o }], supabase: o, dsmynas: o, familyds: o, ts: [2, { c: e }], torproject: [2, { pages: o }], tunnelmole: o, vusercontent: o, "reserve-online": o, localcert: o, "community-pro": o, meinforum: o, yandexcloud: [2, { storage: o, website: o }], za: o, zabc: o }], nf: [1, { arts: a3, com: a3, firm: a3, info: a3, net: a3, other: a3, per: a3, rec: a3, store: a3, web: a3 }], ng: [1, { com: a3, edu: a3, gov: a3, i: a3, mil: a3, mobi: a3, name: a3, net: a3, org: a3, sch: a3, biz: [2, { co: o, dl: o, go: o, lg: o, on: o }], col: o, firm: o, gen: o, ltd: o, ngo: o, plc: o }], ni: [1, { ac: a3, biz: a3, co: a3, com: a3, edu: a3, gob: a3, in: a3, info: a3, int: a3, mil: a3, net: a3, nom: a3, org: a3, web: a3 }], nl: [1, { co: o, "hosting-cluster": o, gov: o, khplay: o, "123website": o, myspreadshop: o, transurl: e, cistron: o, demon: o }], no: [1, { fhs: a3, folkebibl: a3, fylkesbibl: a3, idrett: a3, museum: a3, priv: a3, vgs: a3, dep: a3, herad: a3, kommune: a3, mil: a3, stat: a3, aa: t2, ah: t2, bu: t2, fm: t2, hl: t2, hm: t2, "jan-mayen": t2, mr: t2, nl: t2, nt: t2, of: t2, ol: t2, oslo: t2, rl: t2, sf: t2, st: t2, svalbard: t2, tm: t2, tr: t2, va: t2, vf: t2, akrehamn: a3, "xn--krehamn-dxa": a3, åkrehamn: a3, algard: a3, "xn--lgrd-poac": a3, ålgård: a3, arna: a3, bronnoysund: a3, "xn--brnnysund-m8ac": a3, brønnøysund: a3, brumunddal: a3, bryne: a3, drobak: a3, "xn--drbak-wua": a3, drøbak: a3, egersund: a3, fetsund: a3, floro: a3, "xn--flor-jra": a3, florø: a3, fredrikstad: a3, hokksund: a3, honefoss: a3, "xn--hnefoss-q1a": a3, hønefoss: a3, jessheim: a3, jorpeland: a3, "xn--jrpeland-54a": a3, jørpeland: a3, kirkenes: a3, kopervik: a3, krokstadelva: a3, langevag: a3, "xn--langevg-jxa": a3, langevåg: a3, leirvik: a3, mjondalen: a3, "xn--mjndalen-64a": a3, mjøndalen: a3, "mo-i-rana": a3, mosjoen: a3, "xn--mosjen-eya": a3, mosjøen: a3, nesoddtangen: a3, orkanger: a3, osoyro: a3, "xn--osyro-wua": a3, osøyro: a3, raholt: a3, "xn--rholt-mra": a3, råholt: a3, sandnessjoen: a3, "xn--sandnessjen-ogb": a3, sandnessjøen: a3, skedsmokorset: a3, slattum: a3, spjelkavik: a3, stathelle: a3, stavern: a3, stjordalshalsen: a3, "xn--stjrdalshalsen-sqb": a3, stjørdalshalsen: a3, tananger: a3, tranby: a3, vossevangen: a3, aarborte: a3, aejrie: a3, afjord: a3, "xn--fjord-lra": a3, åfjord: a3, agdenes: a3, akershus: ma, aknoluokta: a3, "xn--koluokta-7ya57h": a3, ákŋoluokta: a3, al: a3, "xn--l-1fa": a3, ål: a3, alaheadju: a3, "xn--laheadju-7ya": a3, álaheadju: a3, alesund: a3, "xn--lesund-hua": a3, ålesund: a3, alstahaug: a3, alta: a3, "xn--lt-liac": a3, áltá: a3, alvdal: a3, amli: a3, "xn--mli-tla": a3, åmli: a3, amot: a3, "xn--mot-tla": a3, åmot: a3, andasuolo: a3, andebu: a3, andoy: a3, "xn--andy-ira": a3, andøy: a3, ardal: a3, "xn--rdal-poa": a3, årdal: a3, aremark: a3, arendal: a3, "xn--s-1fa": a3, ås: a3, aseral: a3, "xn--seral-lra": a3, åseral: a3, asker: a3, askim: a3, askoy: a3, "xn--asky-ira": a3, askøy: a3, askvoll: a3, asnes: a3, "xn--snes-poa": a3, åsnes: a3, audnedaln: a3, aukra: a3, aure: a3, aurland: a3, "aurskog-holand": a3, "xn--aurskog-hland-jnb": a3, "aurskog-høland": a3, austevoll: a3, austrheim: a3, averoy: a3, "xn--avery-yua": a3, averøy: a3, badaddja: a3, "xn--bdddj-mrabd": a3, bådåddjå: a3, "xn--brum-voa": a3, bærum: a3, bahcavuotna: a3, "xn--bhcavuotna-s4a": a3, báhcavuotna: a3, bahccavuotna: a3, "xn--bhccavuotna-k7a": a3, báhccavuotna: a3, baidar: a3, "xn--bidr-5nac": a3, báidár: a3, bajddar: a3, "xn--bjddar-pta": a3, bájddar: a3, balat: a3, "xn--blt-elab": a3, bálát: a3, balestrand: a3, ballangen: a3, balsfjord: a3, bamble: a3, bardu: a3, barum: a3, batsfjord: a3, "xn--btsfjord-9za": a3, båtsfjord: a3, bearalvahki: a3, "xn--bearalvhki-y4a": a3, bearalváhki: a3, beardu: a3, beiarn: a3, berg: a3, bergen: a3, berlevag: a3, "xn--berlevg-jxa": a3, berlevåg: a3, bievat: a3, "xn--bievt-0qa": a3, bievát: a3, bindal: a3, birkenes: a3, bjerkreim: a3, bjugn: a3, bodo: a3, "xn--bod-2na": a3, bodø: a3, bokn: a3, bomlo: a3, "xn--bmlo-gra": a3, bømlo: a3, bremanger: a3, bronnoy: a3, "xn--brnny-wuac": a3, brønnøy: a3, budejju: a3, buskerud: ma, bygland: a3, bykle: a3, cahcesuolo: a3, "xn--hcesuolo-7ya35b": a3, čáhcesuolo: a3, davvenjarga: a3, "xn--davvenjrga-y4a": a3, davvenjárga: a3, davvesiida: a3, deatnu: a3, dielddanuorri: a3, divtasvuodna: a3, divttasvuotna: a3, donna: a3, "xn--dnna-gra": a3, dønna: a3, dovre: a3, drammen: a3, drangedal: a3, dyroy: a3, "xn--dyry-ira": a3, dyrøy: a3, eid: a3, eidfjord: a3, eidsberg: a3, eidskog: a3, eidsvoll: a3, eigersund: a3, elverum: a3, enebakk: a3, engerdal: a3, etne: a3, etnedal: a3, evenassi: a3, "xn--eveni-0qa01ga": a3, evenášši: a3, evenes: a3, "evje-og-hornnes": a3, farsund: a3, fauske: a3, fedje: a3, fet: a3, finnoy: a3, "xn--finny-yua": a3, finnøy: a3, fitjar: a3, fjaler: a3, fjell: a3, fla: a3, "xn--fl-zia": a3, flå: a3, flakstad: a3, flatanger: a3, flekkefjord: a3, flesberg: a3, flora: a3, folldal: a3, forde: a3, "xn--frde-gra": a3, førde: a3, forsand: a3, fosnes: a3, "xn--frna-woa": a3, fræna: a3, frana: a3, frei: a3, frogn: a3, froland: a3, frosta: a3, froya: a3, "xn--frya-hra": a3, frøya: a3, fuoisku: a3, fuossko: a3, fusa: a3, fyresdal: a3, gaivuotna: a3, "xn--givuotna-8ya": a3, gáivuotna: a3, galsa: a3, "xn--gls-elac": a3, gálsá: a3, gamvik: a3, gangaviika: a3, "xn--ggaviika-8ya47h": a3, gáŋgaviika: a3, gaular: a3, gausdal: a3, giehtavuoatna: a3, gildeskal: a3, "xn--gildeskl-g0a": a3, gildeskål: a3, giske: a3, gjemnes: a3, gjerdrum: a3, gjerstad: a3, gjesdal: a3, gjovik: a3, "xn--gjvik-wua": a3, gjøvik: a3, gloppen: a3, gol: a3, gran: a3, grane: a3, granvin: a3, gratangen: a3, grimstad: a3, grong: a3, grue: a3, gulen: a3, guovdageaidnu: a3, ha: a3, "xn--h-2fa": a3, hå: a3, habmer: a3, "xn--hbmer-xqa": a3, hábmer: a3, hadsel: a3, "xn--hgebostad-g3a": a3, hægebostad: a3, hagebostad: a3, halden: a3, halsa: a3, hamar: a3, hamaroy: a3, hammarfeasta: a3, "xn--hmmrfeasta-s4ac": a3, hámmárfeasta: a3, hammerfest: a3, hapmir: a3, "xn--hpmir-xqa": a3, hápmir: a3, haram: a3, hareid: a3, harstad: a3, hasvik: a3, hattfjelldal: a3, haugesund: a3, hedmark: [0, { os: a3, valer: a3, "xn--vler-qoa": a3, våler: a3 }], hemne: a3, hemnes: a3, hemsedal: a3, hitra: a3, hjartdal: a3, hjelmeland: a3, hobol: a3, "xn--hobl-ira": a3, hobøl: a3, hof: a3, hol: a3, hole: a3, holmestrand: a3, holtalen: a3, "xn--holtlen-hxa": a3, holtålen: a3, hordaland: [0, { os: a3 }], hornindal: a3, horten: a3, hoyanger: a3, "xn--hyanger-q1a": a3, høyanger: a3, hoylandet: a3, "xn--hylandet-54a": a3, høylandet: a3, hurdal: a3, hurum: a3, hvaler: a3, hyllestad: a3, ibestad: a3, inderoy: a3, "xn--indery-fya": a3, inderøy: a3, iveland: a3, ivgu: a3, jevnaker: a3, jolster: a3, "xn--jlster-bya": a3, jølster: a3, jondal: a3, kafjord: a3, "xn--kfjord-iua": a3, kåfjord: a3, karasjohka: a3, "xn--krjohka-hwab49j": a3, kárášjohka: a3, karasjok: a3, karlsoy: a3, karmoy: a3, "xn--karmy-yua": a3, karmøy: a3, kautokeino: a3, klabu: a3, "xn--klbu-woa": a3, klæbu: a3, klepp: a3, kongsberg: a3, kongsvinger: a3, kraanghke: a3, "xn--kranghke-b0a": a3, kråanghke: a3, kragero: a3, "xn--krager-gya": a3, kragerø: a3, kristiansand: a3, kristiansund: a3, krodsherad: a3, "xn--krdsherad-m8a": a3, krødsherad: a3, "xn--kvfjord-nxa": a3, kvæfjord: a3, "xn--kvnangen-k0a": a3, kvænangen: a3, kvafjord: a3, kvalsund: a3, kvam: a3, kvanangen: a3, kvinesdal: a3, kvinnherad: a3, kviteseid: a3, kvitsoy: a3, "xn--kvitsy-fya": a3, kvitsøy: a3, laakesvuemie: a3, "xn--lrdal-sra": a3, lærdal: a3, lahppi: a3, "xn--lhppi-xqa": a3, láhppi: a3, lardal: a3, larvik: a3, lavagis: a3, lavangen: a3, leangaviika: a3, "xn--leagaviika-52b": a3, leaŋgaviika: a3, lebesby: a3, leikanger: a3, leirfjord: a3, leka: a3, leksvik: a3, lenvik: a3, lerdal: a3, lesja: a3, levanger: a3, lier: a3, lierne: a3, lillehammer: a3, lillesand: a3, lindas: a3, "xn--linds-pra": a3, lindås: a3, lindesnes: a3, loabat: a3, "xn--loabt-0qa": a3, loabát: a3, lodingen: a3, "xn--ldingen-q1a": a3, lødingen: a3, lom: a3, loppa: a3, lorenskog: a3, "xn--lrenskog-54a": a3, lørenskog: a3, loten: a3, "xn--lten-gra": a3, løten: a3, lund: a3, lunner: a3, luroy: a3, "xn--lury-ira": a3, lurøy: a3, luster: a3, lyngdal: a3, lyngen: a3, malatvuopmi: a3, "xn--mlatvuopmi-s4a": a3, málatvuopmi: a3, malselv: a3, "xn--mlselv-iua": a3, målselv: a3, malvik: a3, mandal: a3, marker: a3, marnardal: a3, masfjorden: a3, masoy: a3, "xn--msy-ula0h": a3, måsøy: a3, "matta-varjjat": a3, "xn--mtta-vrjjat-k7af": a3, "mátta-várjjat": a3, meland: a3, meldal: a3, melhus: a3, meloy: a3, "xn--mely-ira": a3, meløy: a3, meraker: a3, "xn--merker-kua": a3, meråker: a3, midsund: a3, "midtre-gauldal": a3, moareke: a3, "xn--moreke-jua": a3, moåreke: a3, modalen: a3, modum: a3, molde: a3, "more-og-romsdal": [0, { heroy: a3, sande: a3 }], "xn--mre-og-romsdal-qqb": [0, { "xn--hery-ira": a3, sande: a3 }], "møre-og-romsdal": [0, { herøy: a3, sande: a3 }], moskenes: a3, moss: a3, muosat: a3, "xn--muost-0qa": a3, muosát: a3, naamesjevuemie: a3, "xn--nmesjevuemie-tcba": a3, nååmesjevuemie: a3, "xn--nry-yla5g": a3, nærøy: a3, namdalseid: a3, namsos: a3, namsskogan: a3, nannestad: a3, naroy: a3, narviika: a3, narvik: a3, naustdal: a3, navuotna: a3, "xn--nvuotna-hwa": a3, návuotna: a3, "nedre-eiker": a3, nesna: a3, nesodden: a3, nesseby: a3, nesset: a3, nissedal: a3, nittedal: a3, "nord-aurdal": a3, "nord-fron": a3, "nord-odal": a3, norddal: a3, nordkapp: a3, nordland: [0, { bo: a3, "xn--b-5ga": a3, bø: a3, heroy: a3, "xn--hery-ira": a3, herøy: a3 }], "nordre-land": a3, nordreisa: a3, "nore-og-uvdal": a3, notodden: a3, notteroy: a3, "xn--nttery-byae": a3, nøtterøy: a3, odda: a3, oksnes: a3, "xn--ksnes-uua": a3, øksnes: a3, omasvuotna: a3, oppdal: a3, oppegard: a3, "xn--oppegrd-ixa": a3, oppegård: a3, orkdal: a3, orland: a3, "xn--rland-uua": a3, ørland: a3, orskog: a3, "xn--rskog-uua": a3, ørskog: a3, orsta: a3, "xn--rsta-fra": a3, ørsta: a3, osen: a3, osteroy: a3, "xn--ostery-fya": a3, osterøy: a3, ostfold: [0, { valer: a3 }], "xn--stfold-9xa": [0, { "xn--vler-qoa": a3 }], østfold: [0, { våler: a3 }], "ostre-toten": a3, "xn--stre-toten-zcb": a3, "østre-toten": a3, overhalla: a3, "ovre-eiker": a3, "xn--vre-eiker-k8a": a3, "øvre-eiker": a3, oyer: a3, "xn--yer-zna": a3, øyer: a3, oygarden: a3, "xn--ygarden-p1a": a3, øygarden: a3, "oystre-slidre": a3, "xn--ystre-slidre-ujb": a3, "øystre-slidre": a3, porsanger: a3, porsangu: a3, "xn--porsgu-sta26f": a3, porsáŋgu: a3, porsgrunn: a3, rade: a3, "xn--rde-ula": a3, råde: a3, radoy: a3, "xn--rady-ira": a3, radøy: a3, "xn--rlingen-mxa": a3, rælingen: a3, rahkkeravju: a3, "xn--rhkkervju-01af": a3, ráhkkerávju: a3, raisa: a3, "xn--risa-5na": a3, ráisa: a3, rakkestad: a3, ralingen: a3, rana: a3, randaberg: a3, rauma: a3, rendalen: a3, rennebu: a3, rennesoy: a3, "xn--rennesy-v1a": a3, rennesøy: a3, rindal: a3, ringebu: a3, ringerike: a3, ringsaker: a3, risor: a3, "xn--risr-ira": a3, risør: a3, rissa: a3, roan: a3, rodoy: a3, "xn--rdy-0nab": a3, rødøy: a3, rollag: a3, romsa: a3, romskog: a3, "xn--rmskog-bya": a3, rømskog: a3, roros: a3, "xn--rros-gra": a3, røros: a3, rost: a3, "xn--rst-0na": a3, røst: a3, royken: a3, "xn--ryken-vua": a3, røyken: a3, royrvik: a3, "xn--ryrvik-bya": a3, røyrvik: a3, ruovat: a3, rygge: a3, salangen: a3, salat: a3, "xn--slat-5na": a3, sálat: a3, "xn--slt-elab": a3, sálát: a3, saltdal: a3, samnanger: a3, sandefjord: a3, sandnes: a3, sandoy: a3, "xn--sandy-yua": a3, sandøy: a3, sarpsborg: a3, sauda: a3, sauherad: a3, sel: a3, selbu: a3, selje: a3, seljord: a3, siellak: a3, sigdal: a3, siljan: a3, sirdal: a3, skanit: a3, "xn--sknit-yqa": a3, skánit: a3, skanland: a3, "xn--sknland-fxa": a3, skånland: a3, skaun: a3, skedsmo: a3, ski: a3, skien: a3, skierva: a3, "xn--skierv-uta": a3, skiervá: a3, skiptvet: a3, skjak: a3, "xn--skjk-soa": a3, skjåk: a3, skjervoy: a3, "xn--skjervy-v1a": a3, skjervøy: a3, skodje: a3, smola: a3, "xn--smla-hra": a3, smøla: a3, snaase: a3, "xn--snase-nra": a3, snåase: a3, snasa: a3, "xn--snsa-roa": a3, snåsa: a3, snillfjord: a3, snoasa: a3, sogndal: a3, sogne: a3, "xn--sgne-gra": a3, søgne: a3, sokndal: a3, sola: a3, solund: a3, somna: a3, "xn--smna-gra": a3, sømna: a3, "sondre-land": a3, "xn--sndre-land-0cb": a3, "søndre-land": a3, songdalen: a3, "sor-aurdal": a3, "xn--sr-aurdal-l8a": a3, "sør-aurdal": a3, "sor-fron": a3, "xn--sr-fron-q1a": a3, "sør-fron": a3, "sor-odal": a3, "xn--sr-odal-q1a": a3, "sør-odal": a3, "sor-varanger": a3, "xn--sr-varanger-ggb": a3, "sør-varanger": a3, sorfold: a3, "xn--srfold-bya": a3, sørfold: a3, sorreisa: a3, "xn--srreisa-q1a": a3, sørreisa: a3, sortland: a3, sorum: a3, "xn--srum-gra": a3, sørum: a3, spydeberg: a3, stange: a3, stavanger: a3, steigen: a3, steinkjer: a3, stjordal: a3, "xn--stjrdal-s1a": a3, stjørdal: a3, stokke: a3, "stor-elvdal": a3, stord: a3, stordal: a3, storfjord: a3, strand: a3, stranda: a3, stryn: a3, sula: a3, suldal: a3, sund: a3, sunndal: a3, surnadal: a3, sveio: a3, svelvik: a3, sykkylven: a3, tana: a3, telemark: [0, { bo: a3, "xn--b-5ga": a3, bø: a3 }], time: a3, tingvoll: a3, tinn: a3, tjeldsund: a3, tjome: a3, "xn--tjme-hra": a3, tjøme: a3, tokke: a3, tolga: a3, tonsberg: a3, "xn--tnsberg-q1a": a3, tønsberg: a3, torsken: a3, "xn--trna-woa": a3, træna: a3, trana: a3, tranoy: a3, "xn--trany-yua": a3, tranøy: a3, troandin: a3, trogstad: a3, "xn--trgstad-r1a": a3, trøgstad: a3, tromsa: a3, tromso: a3, "xn--troms-zua": a3, tromsø: a3, trondheim: a3, trysil: a3, tvedestrand: a3, tydal: a3, tynset: a3, tysfjord: a3, tysnes: a3, "xn--tysvr-vra": a3, tysvær: a3, tysvar: a3, ullensaker: a3, ullensvang: a3, ulvik: a3, unjarga: a3, "xn--unjrga-rta": a3, unjárga: a3, utsira: a3, vaapste: a3, vadso: a3, "xn--vads-jra": a3, vadsø: a3, "xn--vry-yla5g": a3, værøy: a3, vaga: a3, "xn--vg-yiab": a3, vågå: a3, vagan: a3, "xn--vgan-qoa": a3, vågan: a3, vagsoy: a3, "xn--vgsy-qoa0j": a3, vågsøy: a3, vaksdal: a3, valle: a3, vang: a3, vanylven: a3, vardo: a3, "xn--vard-jra": a3, vardø: a3, varggat: a3, "xn--vrggt-xqad": a3, várggát: a3, varoy: a3, vefsn: a3, vega: a3, vegarshei: a3, "xn--vegrshei-c0a": a3, vegårshei: a3, vennesla: a3, verdal: a3, verran: a3, vestby: a3, vestfold: [0, { sande: a3 }], vestnes: a3, "vestre-slidre": a3, "vestre-toten": a3, vestvagoy: a3, "xn--vestvgy-ixa6o": a3, vestvågøy: a3, vevelstad: a3, vik: a3, vikna: a3, vindafjord: a3, voagat: a3, volda: a3, voss: a3, co: o, "123hjemmeside": o, myspreadshop: o }], np: r2, nr: ra, nu: [1, { merseine: o, mine: o, shacknet: o, enterprisecloud: o }], nz: [1, { ac: a3, co: a3, cri: a3, geek: a3, gen: a3, govt: a3, health: a3, iwi: a3, kiwi: a3, maori: a3, "xn--mori-qsa": a3, māori: a3, mil: a3, net: a3, org: a3, parliament: a3, school: a3, cloudns: o }], om: [1, { co: a3, com: a3, edu: a3, gov: a3, med: a3, museum: a3, net: a3, org: a3, pro: a3 }], onion: a3, org: [1, { altervista: o, pimienta: o, poivron: o, potager: o, sweetpepper: o, cdn77: [0, { c: o, rsc: o }], "cdn77-secure": [0, { origin: [0, { ssl: o }] }], ae: o, cloudns: o, "ip-dynamic": o, ddnss: o, dpdns: o, duckdns: o, tunk: o, blogdns: o, blogsite: o, boldlygoingnowhere: o, dnsalias: o, dnsdojo: o, doesntexist: o, dontexist: o, doomdns: o, dvrdns: o, dynalias: o, dyndns: [2, { go: o, home: o }], endofinternet: o, endoftheinternet: o, "from-me": o, "game-host": o, gotdns: o, "hobby-site": o, homedns: o, homeftp: o, homelinux: o, homeunix: o, "is-a-bruinsfan": o, "is-a-candidate": o, "is-a-celticsfan": o, "is-a-chef": o, "is-a-geek": o, "is-a-knight": o, "is-a-linux-user": o, "is-a-patsfan": o, "is-a-soxfan": o, "is-found": o, "is-lost": o, "is-saved": o, "is-very-bad": o, "is-very-evil": o, "is-very-good": o, "is-very-nice": o, "is-very-sweet": o, "isa-geek": o, "kicks-ass": o, misconfused: o, podzone: o, readmyblog: o, selfip: o, sellsyourhome: o, servebbs: o, serveftp: o, servegame: o, "stuff-4-sale": o, webhop: o, accesscam: o, camdvr: o, freeddns: o, mywire: o, webredirect: o, twmail: o, eu: [2, { al: o, asso: o, at: o, au: o, be: o, bg: o, ca: o, cd: o, ch: o, cn: o, cy: o, cz: o, de: o, dk: o, edu: o, ee: o, es: o, fi: o, fr: o, gr: o, hr: o, hu: o, ie: o, il: o, in: o, int: o, is: o, it: o, jp: o, kr: o, lt: o, lu: o, lv: o, me: o, mk: o, mt: o, my: o, net: o, ng: o, nl: o, no: o, nz: o, pl: o, pt: o, ro: o, ru: o, se: o, si: o, sk: o, tr: o, uk: o, us: o }], fedorainfracloud: o, fedorapeople: o, fedoraproject: [0, { cloud: o, os: G, stg: [0, { os: G }] }], freedesktop: o, hatenadiary: o, hepforge: o, "in-dsl": o, "in-vpn": o, js: o, barsy: o, mayfirst: o, routingthecloud: o, bmoattachments: o, "cable-modem": o, collegefan: o, couchpotatofries: o, hopto: o, mlbfan: o, myftp: o, mysecuritycamera: o, nflfan: o, "no-ip": o, "read-books": o, ufcfan: o, zapto: o, dynserv: o, "now-dns": o, "is-local": o, httpbin: o, pubtls: o, jpn: o, "my-firewall": o, myfirewall: o, spdns: o, "small-web": o, dsmynas: o, familyds: o, teckids: K, tuxfamily: o, diskstation: o, hk: o, us: o, toolforge: o, wmcloud: [2, { beta: o }], wmflabs: o, za: o }], pa: [1, { abo: a3, ac: a3, com: a3, edu: a3, gob: a3, ing: a3, med: a3, net: a3, nom: a3, org: a3, sld: a3 }], pe: [1, { com: a3, edu: a3, gob: a3, mil: a3, net: a3, nom: a3, org: a3 }], pf: [1, { com: a3, edu: a3, org: a3 }], pg: r2, ph: [1, { com: a3, edu: a3, gov: a3, i: a3, mil: a3, net: a3, ngo: a3, org: a3, cloudns: o }], pk: [1, { ac: a3, biz: a3, com: a3, edu: a3, fam: a3, gkp: a3, gob: a3, gog: a3, gok: a3, gop: a3, gos: a3, gov: a3, net: a3, org: a3, web: a3 }], pl: [1, { com: a3, net: a3, org: a3, agro: a3, aid: a3, atm: a3, auto: a3, biz: a3, edu: a3, gmina: a3, gsm: a3, info: a3, mail: a3, media: a3, miasta: a3, mil: a3, nieruchomosci: a3, nom: a3, pc: a3, powiat: a3, priv: a3, realestate: a3, rel: a3, sex: a3, shop: a3, sklep: a3, sos: a3, szkola: a3, targi: a3, tm: a3, tourism: a3, travel: a3, turystyka: a3, gov: [1, { ap: a3, griw: a3, ic: a3, is: a3, kmpsp: a3, konsulat: a3, kppsp: a3, kwp: a3, kwpsp: a3, mup: a3, mw: a3, oia: a3, oirm: a3, oke: a3, oow: a3, oschr: a3, oum: a3, pa: a3, pinb: a3, piw: a3, po: a3, pr: a3, psp: a3, psse: a3, pup: a3, rzgw: a3, sa: a3, sdn: a3, sko: a3, so: a3, sr: a3, starostwo: a3, ug: a3, ugim: a3, um: a3, umig: a3, upow: a3, uppo: a3, us: a3, uw: a3, uzs: a3, wif: a3, wiih: a3, winb: a3, wios: a3, witd: a3, wiw: a3, wkz: a3, wsa: a3, wskr: a3, wsse: a3, wuoz: a3, wzmiuw: a3, zp: a3, zpisdn: a3 }], augustow: a3, "babia-gora": a3, bedzin: a3, beskidy: a3, bialowieza: a3, bialystok: a3, bielawa: a3, bieszczady: a3, boleslawiec: a3, bydgoszcz: a3, bytom: a3, cieszyn: a3, czeladz: a3, czest: a3, dlugoleka: a3, elblag: a3, elk: a3, glogow: a3, gniezno: a3, gorlice: a3, grajewo: a3, ilawa: a3, jaworzno: a3, "jelenia-gora": a3, jgora: a3, kalisz: a3, karpacz: a3, kartuzy: a3, kaszuby: a3, katowice: a3, "kazimierz-dolny": a3, kepno: a3, ketrzyn: a3, klodzko: a3, kobierzyce: a3, kolobrzeg: a3, konin: a3, konskowola: a3, kutno: a3, lapy: a3, lebork: a3, legnica: a3, lezajsk: a3, limanowa: a3, lomza: a3, lowicz: a3, lubin: a3, lukow: a3, malbork: a3, malopolska: a3, mazowsze: a3, mazury: a3, mielec: a3, mielno: a3, mragowo: a3, naklo: a3, nowaruda: a3, nysa: a3, olawa: a3, olecko: a3, olkusz: a3, olsztyn: a3, opoczno: a3, opole: a3, ostroda: a3, ostroleka: a3, ostrowiec: a3, ostrowwlkp: a3, pila: a3, pisz: a3, podhale: a3, podlasie: a3, polkowice: a3, pomorskie: a3, pomorze: a3, prochowice: a3, pruszkow: a3, przeworsk: a3, pulawy: a3, radom: a3, "rawa-maz": a3, rybnik: a3, rzeszow: a3, sanok: a3, sejny: a3, skoczow: a3, slask: a3, slupsk: a3, sosnowiec: a3, "stalowa-wola": a3, starachowice: a3, stargard: a3, suwalki: a3, swidnica: a3, swiebodzin: a3, swinoujscie: a3, szczecin: a3, szczytno: a3, tarnobrzeg: a3, tgory: a3, turek: a3, tychy: a3, ustka: a3, walbrzych: a3, warmia: a3, warszawa: a3, waw: a3, wegrow: a3, wielun: a3, wlocl: a3, wloclawek: a3, wodzislaw: a3, wolomin: a3, wroclaw: a3, zachpomor: a3, zagan: a3, zarow: a3, zgora: a3, zgorzelec: a3, art: o, gliwice: o, krakow: o, poznan: o, wroc: o, zakopane: o, beep: o, "ecommerce-shop": o, cfolks: o, dfirma: o, dkonto: o, you2: o, shoparena: o, homesklep: o, sdscloud: o, unicloud: o, lodz: o, pabianice: o, plock: o, sieradz: o, skierniewice: o, zgierz: o, krasnik: o, leczna: o, lubartow: o, lublin: o, poniatowa: o, swidnik: o, co: o, torun: o, simplesite: o, myspreadshop: o, gda: o, gdansk: o, gdynia: o, med: o, sopot: o, bielsko: o }], pm: [1, { own: o, name: o }], pn: [1, { co: a3, edu: a3, gov: a3, net: a3, org: a3 }], post: a3, pr: [1, { biz: a3, com: a3, edu: a3, gov: a3, info: a3, isla: a3, name: a3, net: a3, org: a3, pro: a3, ac: a3, est: a3, prof: a3 }], pro: [1, { aaa: a3, aca: a3, acct: a3, avocat: a3, bar: a3, cpa: a3, eng: a3, jur: a3, law: a3, med: a3, recht: a3, "12chars": o, cloudns: o, barsy: o, ngrok: o }], ps: [1, { com: a3, edu: a3, gov: a3, net: a3, org: a3, plo: a3, sec: a3 }], pt: [1, { com: a3, edu: a3, gov: a3, int: a3, net: a3, nome: a3, org: a3, publ: a3, "123paginaweb": o }], pw: [1, { gov: a3, cloudns: o, x443: o }], py: [1, { com: a3, coop: a3, edu: a3, gov: a3, mil: a3, net: a3, org: a3 }], qa: [1, { com: a3, edu: a3, gov: a3, mil: a3, name: a3, net: a3, org: a3, sch: a3 }], re: [1, { asso: a3, com: a3, netlib: o, can: o }], ro: [1, { arts: a3, com: a3, firm: a3, info: a3, nom: a3, nt: a3, org: a3, rec: a3, store: a3, tm: a3, www: a3, co: o, shop: o, barsy: o }], rs: [1, { ac: a3, co: a3, edu: a3, gov: a3, in: a3, org: a3, brendly: D2, barsy: o, ox: o }], ru: [1, { ac: o, edu: o, gov: o, int: o, mil: o, eurodir: o, adygeya: o, bashkiria: o, bir: o, cbg: o, com: o, dagestan: o, grozny: o, kalmykia: o, kustanai: o, marine: o, mordovia: o, msk: o, mytis: o, nalchik: o, nov: o, pyatigorsk: o, spb: o, vladikavkaz: o, vladimir: o, na4u: o, mircloud: o, myjino: [2, { hosting: e, landing: e, spectrum: e, vps: e }], cldmail: [0, { hb: o }], mcdir: [2, { vps: o }], mcpre: o, net: o, org: o, pp: o, lk3: o, ras: o }], rw: [1, { ac: a3, co: a3, coop: a3, gov: a3, mil: a3, net: a3, org: a3 }], sa: [1, { com: a3, edu: a3, gov: a3, med: a3, net: a3, org: a3, pub: a3, sch: a3 }], sb: m2, sc: m2, sd: [1, { com: a3, edu: a3, gov: a3, info: a3, med: a3, net: a3, org: a3, tv: a3 }], se: [1, { a: a3, ac: a3, b: a3, bd: a3, brand: a3, c: a3, d: a3, e: a3, f: a3, fh: a3, fhsk: a3, fhv: a3, g: a3, h: a3, i: a3, k: a3, komforb: a3, kommunalforbund: a3, komvux: a3, l: a3, lanbib: a3, m: a3, n: a3, naturbruksgymn: a3, o: a3, org: a3, p: a3, parti: a3, pp: a3, press: a3, r: a3, s: a3, t: a3, tm: a3, u: a3, w: a3, x: a3, y: a3, z: a3, com: o, iopsys: o, "123minsida": o, itcouldbewor: o, myspreadshop: o }], sg: [1, { com: a3, edu: a3, gov: a3, net: a3, org: a3, enscaled: o }], sh: [1, { com: a3, gov: a3, mil: a3, net: a3, org: a3, hashbang: o, botda: o, lovable: o, platform: [0, { ent: o, eu: o, us: o }], teleport: o, now: o }], si: [1, { f5: o, gitapp: o, gitpage: o }], sj: a3, sk: a3, sl: m2, sm: a3, sn: [1, { art: a3, com: a3, edu: a3, gouv: a3, org: a3, perso: a3, univ: a3 }], so: [1, { com: a3, edu: a3, gov: a3, me: a3, net: a3, org: a3, surveys: o }], sr: a3, ss: [1, { biz: a3, co: a3, com: a3, edu: a3, gov: a3, me: a3, net: a3, org: a3, sch: a3 }], st: [1, { co: a3, com: a3, consulado: a3, edu: a3, embaixada: a3, mil: a3, net: a3, org: a3, principe: a3, saotome: a3, store: a3, helioho: o, kirara: o, noho: o }], su: [1, { abkhazia: o, adygeya: o, aktyubinsk: o, arkhangelsk: o, armenia: o, ashgabad: o, azerbaijan: o, balashov: o, bashkiria: o, bryansk: o, bukhara: o, chimkent: o, dagestan: o, "east-kazakhstan": o, exnet: o, georgia: o, grozny: o, ivanovo: o, jambyl: o, kalmykia: o, kaluga: o, karacol: o, karaganda: o, karelia: o, khakassia: o, krasnodar: o, kurgan: o, kustanai: o, lenug: o, mangyshlak: o, mordovia: o, msk: o, murmansk: o, nalchik: o, navoi: o, "north-kazakhstan": o, nov: o, obninsk: o, penza: o, pokrovsk: o, sochi: o, spb: o, tashkent: o, termez: o, togliatti: o, troitsk: o, tselinograd: o, tula: o, tuva: o, vladikavkaz: o, vladimir: o, vologda: o }], sv: [1, { com: a3, edu: a3, gob: a3, org: a3, red: a3 }], sx: c2, sy: w2, sz: [1, { ac: a3, co: a3, org: a3 }], tc: a3, td: a3, tel: a3, tf: [1, { sch: o }], tg: a3, th: [1, { ac: a3, co: a3, go: a3, in: a3, mi: a3, net: a3, or: a3, online: o, shop: o }], tj: [1, { ac: a3, biz: a3, co: a3, com: a3, edu: a3, go: a3, gov: a3, int: a3, mil: a3, name: a3, net: a3, nic: a3, org: a3, test: a3, web: a3 }], tk: a3, tl: c2, tm: [1, { co: a3, com: a3, edu: a3, gov: a3, mil: a3, net: a3, nom: a3, org: a3 }], tn: [1, { com: a3, ens: a3, fin: a3, gov: a3, ind: a3, info: a3, intl: a3, mincom: a3, nat: a3, net: a3, org: a3, perso: a3, tourism: a3, orangecloud: o }], to: [1, { 611: o, com: a3, edu: a3, gov: a3, mil: a3, net: a3, org: a3, oya: o, x0: o, quickconnect: U, vpnplus: o }], tr: [1, { av: a3, bbs: a3, bel: a3, biz: a3, com: a3, dr: a3, edu: a3, gen: a3, gov: a3, info: a3, k12: a3, kep: a3, mil: a3, name: a3, net: a3, org: a3, pol: a3, tel: a3, tsk: a3, tv: a3, web: a3, nc: c2 }], tt: [1, { biz: a3, co: a3, com: a3, edu: a3, gov: a3, info: a3, mil: a3, name: a3, net: a3, org: a3, pro: a3 }], tv: [1, { "better-than": o, dyndns: o, "on-the-web": o, "worse-than": o, from: o, sakura: o }], tw: [1, { club: a3, com: [1, { mymailer: o }], ebiz: a3, edu: a3, game: a3, gov: a3, idv: a3, mil: a3, net: a3, org: a3, url: o, mydns: o }], tz: [1, { ac: a3, co: a3, go: a3, hotel: a3, info: a3, me: a3, mil: a3, mobi: a3, ne: a3, or: a3, sc: a3, tv: a3 }], ua: [1, { com: a3, edu: a3, gov: a3, in: a3, net: a3, org: a3, cherkassy: a3, cherkasy: a3, chernigov: a3, chernihiv: a3, chernivtsi: a3, chernovtsy: a3, ck: a3, cn: a3, cr: a3, crimea: a3, cv: a3, dn: a3, dnepropetrovsk: a3, dnipropetrovsk: a3, donetsk: a3, dp: a3, if: a3, "ivano-frankivsk": a3, kh: a3, kharkiv: a3, kharkov: a3, kherson: a3, khmelnitskiy: a3, khmelnytskyi: a3, kiev: a3, kirovograd: a3, km: a3, kr: a3, kropyvnytskyi: a3, krym: a3, ks: a3, kv: a3, kyiv: a3, lg: a3, lt: a3, lugansk: a3, luhansk: a3, lutsk: a3, lv: a3, lviv: a3, mk: a3, mykolaiv: a3, nikolaev: a3, od: a3, odesa: a3, odessa: a3, pl: a3, poltava: a3, rivne: a3, rovno: a3, rv: a3, sb: a3, sebastopol: a3, sevastopol: a3, sm: a3, sumy: a3, te: a3, ternopil: a3, uz: a3, uzhgorod: a3, uzhhorod: a3, vinnica: a3, vinnytsia: a3, vn: a3, volyn: a3, yalta: a3, zakarpattia: a3, zaporizhzhe: a3, zaporizhzhia: a3, zhitomir: a3, zhytomyr: a3, zp: a3, zt: a3, cc: o, inf: o, ltd: o, cx: o, biz: o, co: o, pp: o, v: o }], ug: [1, { ac: a3, co: a3, com: a3, edu: a3, go: a3, gov: a3, mil: a3, ne: a3, or: a3, org: a3, sc: a3, us: a3 }], uk: [1, { ac: a3, co: [1, { bytemark: [0, { dh: o, vm: o }], layershift: I2, barsy: o, barsyonline: o, retrosnub: ta, "nh-serv": o, "no-ip": o, adimo: o, myspreadshop: o }], gov: [1, { api: o, campaign: o, service: o }], ltd: a3, me: a3, net: a3, nhs: a3, org: [1, { glug: o, lug: o, lugs: o, affinitylottery: o, raffleentry: o, weeklylottery: o }], plc: a3, police: a3, sch: r2, conn: o, copro: o, hosp: o, "independent-commission": o, "independent-inquest": o, "independent-inquiry": o, "independent-panel": o, "independent-review": o, "public-inquiry": o, "royal-commission": o, pymnt: o, barsy: o, nimsite: o, oraclegovcloudapps: e }], us: [1, { dni: a3, isa: a3, nsn: a3, ak: i3, al: i3, ar: i3, as: i3, az: i3, ca: i3, co: i3, ct: i3, dc: i3, de: la, fl: i3, ga: i3, gu: i3, hi: B2, ia: i3, id: i3, il: i3, in: i3, ks: i3, ky: i3, la: i3, ma: [1, { k12: [1, { chtr: a3, paroch: a3, pvt: a3 }], cc: a3, lib: a3 }], md: i3, me: i3, mi: [1, { k12: a3, cc: a3, lib: a3, "ann-arbor": a3, cog: a3, dst: a3, eaton: a3, gen: a3, mus: a3, tec: a3, washtenaw: a3 }], mn: i3, mo: i3, ms: [1, { k12: a3, cc: a3 }], mt: i3, nc: i3, nd: B2, ne: i3, nh: i3, nj: i3, nm: i3, nv: i3, ny: i3, oh: i3, ok: i3, or: i3, pa: i3, pr: i3, ri: B2, sc: i3, sd: B2, tn: i3, tx: i3, ut: i3, va: i3, vi: i3, vt: i3, wa: i3, wi: i3, wv: la, wy: i3, cloudns: o, "is-by": o, "land-4-sale": o, "stuff-4-sale": o, heliohost: o, enscaled: [0, { phx: o }], mircloud: o, ngo: o, golffan: o, noip: o, pointto: o, freeddns: o, srv: [2, { gh: o, gl: o }], platterp: o, servername: o }], uy: [1, { com: a3, edu: a3, gub: a3, mil: a3, net: a3, org: a3 }], uz: [1, { co: a3, com: a3, net: a3, org: a3 }], va: a3, vc: [1, { com: a3, edu: a3, gov: a3, mil: a3, net: a3, org: a3, gv: [2, { d: o }], "0e": e, mydns: o }], ve: [1, { arts: a3, bib: a3, co: a3, com: a3, e12: a3, edu: a3, emprende: a3, firm: a3, gob: a3, gov: a3, ia: a3, info: a3, int: a3, mil: a3, net: a3, nom: a3, org: a3, rar: a3, rec: a3, store: a3, tec: a3, web: a3 }], vg: [1, { edu: a3 }], vi: [1, { co: a3, com: a3, k12: a3, net: a3, org: a3 }], vn: [1, { ac: a3, ai: a3, biz: a3, com: a3, edu: a3, gov: a3, health: a3, id: a3, info: a3, int: a3, io: a3, name: a3, net: a3, org: a3, pro: a3, angiang: a3, bacgiang: a3, backan: a3, baclieu: a3, bacninh: a3, "baria-vungtau": a3, bentre: a3, binhdinh: a3, binhduong: a3, binhphuoc: a3, binhthuan: a3, camau: a3, cantho: a3, caobang: a3, daklak: a3, daknong: a3, danang: a3, dienbien: a3, dongnai: a3, dongthap: a3, gialai: a3, hagiang: a3, haiduong: a3, haiphong: a3, hanam: a3, hanoi: a3, hatinh: a3, haugiang: a3, hoabinh: a3, hungyen: a3, khanhhoa: a3, kiengiang: a3, kontum: a3, laichau: a3, lamdong: a3, langson: a3, laocai: a3, longan: a3, namdinh: a3, nghean: a3, ninhbinh: a3, ninhthuan: a3, phutho: a3, phuyen: a3, quangbinh: a3, quangnam: a3, quangngai: a3, quangninh: a3, quangtri: a3, soctrang: a3, sonla: a3, tayninh: a3, thaibinh: a3, thainguyen: a3, thanhhoa: a3, thanhphohochiminh: a3, thuathienhue: a3, tiengiang: a3, travinh: a3, tuyenquang: a3, vinhlong: a3, vinhphuc: a3, yenbai: a3 }], vu: _, wf: [1, { biz: o, sch: o }], ws: [1, { com: a3, edu: a3, gov: a3, net: a3, org: a3, advisor: e, cloud66: o, dyndns: o, mypets: o }], yt: [1, { org: o }], "xn--mgbaam7a8h": a3, امارات: a3, "xn--y9a3aq": a3, հայ: a3, "xn--54b7fta0cc": a3, বাংলা: a3, "xn--90ae": a3, бг: a3, "xn--mgbcpq6gpa1a": a3, البحرين: a3, "xn--90ais": a3, бел: a3, "xn--fiqs8s": a3, 中国: a3, "xn--fiqz9s": a3, 中國: a3, "xn--lgbbat1ad8j": a3, الجزائر: a3, "xn--wgbh1c": a3, مصر: a3, "xn--e1a4c": a3, ею: a3, "xn--qxa6a": a3, ευ: a3, "xn--mgbah1a3hjkrd": a3, موريتانيا: a3, "xn--node": a3, გე: a3, "xn--qxam": a3, ελ: a3, "xn--j6w193g": [1, { "xn--gmqw5a": a3, "xn--55qx5d": a3, "xn--mxtq1m": a3, "xn--wcvs22d": a3, "xn--uc0atv": a3, "xn--od0alg": a3 }], 香港: [1, { 個人: a3, 公司: a3, 政府: a3, 教育: a3, 組織: a3, 網絡: a3 }], "xn--2scrj9c": a3, ಭಾರತ: a3, "xn--3hcrj9c": a3, ଭାରତ: a3, "xn--45br5cyl": a3, ভাৰত: a3, "xn--h2breg3eve": a3, भारतम्: a3, "xn--h2brj9c8c": a3, भारोत: a3, "xn--mgbgu82a": a3, ڀارت: a3, "xn--rvc1e0am3e": a3, ഭാരതം: a3, "xn--h2brj9c": a3, भारत: a3, "xn--mgbbh1a": a3, بارت: a3, "xn--mgbbh1a71e": a3, بھارت: a3, "xn--fpcrj9c3d": a3, భారత్: a3, "xn--gecrj9c": a3, ભારત: a3, "xn--s9brj9c": a3, ਭਾਰਤ: a3, "xn--45brj9c": a3, ভারত: a3, "xn--xkc2dl3a5ee0h": a3, இந்தியா: a3, "xn--mgba3a4f16a": a3, ایران: a3, "xn--mgba3a4fra": a3, ايران: a3, "xn--mgbtx2b": a3, عراق: a3, "xn--mgbayh7gpa": a3, الاردن: a3, "xn--3e0b707e": a3, 한국: a3, "xn--80ao21a": a3, қаз: a3, "xn--q7ce6a": a3, ລາວ: a3, "xn--fzc2c9e2c": a3, ලංකා: a3, "xn--xkc2al3hye2a": a3, இலங்கை: a3, "xn--mgbc0a9azcg": a3, المغرب: a3, "xn--d1alf": a3, мкд: a3, "xn--l1acc": a3, мон: a3, "xn--mix891f": a3, 澳門: a3, "xn--mix082f": a3, 澳门: a3, "xn--mgbx4cd0ab": a3, مليسيا: a3, "xn--mgb9awbf": a3, عمان: a3, "xn--mgbai9azgqp6j": a3, پاکستان: a3, "xn--mgbai9a5eva00b": a3, پاكستان: a3, "xn--ygbi2ammx": a3, فلسطين: a3, "xn--90a3ac": [1, { "xn--80au": a3, "xn--90azh": a3, "xn--d1at": a3, "xn--c1avg": a3, "xn--o1ac": a3, "xn--o1ach": a3 }], срб: [1, { ак: a3, обр: a3, од: a3, орг: a3, пр: a3, упр: a3 }], "xn--p1ai": a3, рф: a3, "xn--wgbl6a": a3, قطر: a3, "xn--mgberp4a5d4ar": a3, السعودية: a3, "xn--mgberp4a5d4a87g": a3, السعودیة: a3, "xn--mgbqly7c0a67fbc": a3, السعودیۃ: a3, "xn--mgbqly7cvafr": a3, السعوديه: a3, "xn--mgbpl2fh": a3, سودان: a3, "xn--yfro4i67o": a3, 新加坡: a3, "xn--clchc0ea0b2g2a9gcd": a3, சிங்கப்பூர்: a3, "xn--ogbpf8fl": a3, سورية: a3, "xn--mgbtf8fl": a3, سوريا: a3, "xn--o3cw4h": [1, { "xn--o3cyx2a": a3, "xn--12co0c3b4eva": a3, "xn--m3ch0j3a": a3, "xn--h3cuzk1di": a3, "xn--12c1fe0br": a3, "xn--12cfi8ixb8l": a3 }], ไทย: [1, { ทหาร: a3, ธุรกิจ: a3, เน็ต: a3, รัฐบาล: a3, ศึกษา: a3, องค์กร: a3 }], "xn--pgbs0dh": a3, تونس: a3, "xn--kpry57d": a3, 台灣: a3, "xn--kprw13d": a3, 台湾: a3, "xn--nnx388a": a3, 臺灣: a3, "xn--j1amh": a3, укр: a3, "xn--mgb2ddes": a3, اليمن: a3, xxx: a3, ye: w2, za: [0, { ac: a3, agric: a3, alt: a3, co: a3, edu: a3, gov: a3, grondar: a3, law: a3, mil: a3, net: a3, ngo: a3, nic: a3, nis: a3, nom: a3, org: a3, school: a3, tm: a3, web: a3 }], zm: [1, { ac: a3, biz: a3, co: a3, com: a3, edu: a3, gov: a3, info: a3, mil: a3, net: a3, org: a3, sch: a3 }], zw: [1, { ac: a3, co: a3, gov: a3, mil: a3, org: a3 }], aaa: a3, aarp: a3, abb: a3, abbott: a3, abbvie: a3, abc: a3, able: a3, abogado: a3, abudhabi: a3, academy: [1, { official: o }], accenture: a3, accountant: a3, accountants: a3, aco: a3, actor: a3, ads: a3, adult: a3, aeg: a3, aetna: a3, afl: a3, africa: a3, agakhan: a3, agency: a3, aig: a3, airbus: a3, airforce: a3, airtel: a3, akdn: a3, alibaba: a3, alipay: a3, allfinanz: a3, allstate: a3, ally: a3, alsace: a3, alstom: a3, amazon: a3, americanexpress: a3, americanfamily: a3, amex: a3, amfam: a3, amica: a3, amsterdam: a3, analytics: a3, android: a3, anquan: a3, anz: a3, aol: a3, apartments: a3, app: [1, { adaptable: o, aiven: o, beget: e, brave: M2, clerk: o, clerkstage: o, cloudflare: o, wnext: o, csb: [2, { preview: o }], convex: o, deta: o, ondigitalocean: o, easypanel: o, encr: [2, { frontend: o }], evervault: N, expo: [2, { staging: o }], edgecompute: o, "on-fleek": o, flutterflow: o, e2b: o, framer: o, github: o, hosted: e, run: [0, { "*": o, mtls: e }], web: o, hackclub: o, hasura: o, botdash: o, leapcell: o, loginline: o, lovable: o, luyani: o, medusajs: o, messerli: o, mocha: o, netlify: o, ngrok: o, "ngrok-free": o, developer: e, noop: o, northflank: e, upsun: e, railway: [0, { up: o }], replit: C2, nyat: o, snowflake: [0, { "*": o, privatelink: e }], streamlit: o, storipress: o, telebit: o, typedream: o, vercel: o, wal: o, wasmer: o, bookonline: o, windsurf: o, zeabur: o, zerops: e }], apple: a3, aquarelle: a3, arab: a3, aramco: a3, archi: a3, army: a3, art: a3, arte: a3, asda: a3, associates: a3, athleta: a3, attorney: a3, auction: a3, audi: a3, audible: a3, audio: a3, auspost: a3, author: a3, auto: a3, autos: a3, aws: [1, { on: [0, { "af-south-1": n5, "ap-east-1": n5, "ap-northeast-1": n5, "ap-northeast-2": n5, "ap-northeast-3": n5, "ap-south-1": n5, "ap-south-2": l2, "ap-southeast-1": n5, "ap-southeast-2": n5, "ap-southeast-3": n5, "ap-southeast-4": l2, "ap-southeast-5": l2, "ca-central-1": n5, "ca-west-1": l2, "eu-central-1": n5, "eu-central-2": l2, "eu-north-1": n5, "eu-south-1": n5, "eu-south-2": l2, "eu-west-1": n5, "eu-west-2": n5, "eu-west-3": n5, "il-central-1": l2, "me-central-1": l2, "me-south-1": n5, "sa-east-1": n5, "us-east-1": n5, "us-east-2": n5, "us-west-1": n5, "us-west-2": n5, "us-gov-east-1": O2, "us-gov-west-1": O2 }], sagemaker: [0, { "ap-northeast-1": d, "ap-northeast-2": d, "ap-south-1": d, "ap-southeast-1": d, "ap-southeast-2": d, "ca-central-1": x2, "eu-central-1": d, "eu-west-1": d, "eu-west-2": d, "us-east-1": x2, "us-east-2": x2, "us-west-2": x2, "af-south-1": u3, "ap-east-1": u3, "ap-northeast-3": u3, "ap-south-2": P2, "ap-southeast-3": u3, "ap-southeast-4": P2, "ca-west-1": [0, { notebook: o, "notebook-fips": o }], "eu-central-2": u3, "eu-north-1": u3, "eu-south-1": u3, "eu-south-2": u3, "eu-west-3": u3, "il-central-1": u3, "me-central-1": u3, "me-south-1": u3, "sa-east-1": u3, "us-gov-east-1": Q, "us-gov-west-1": Q, "us-west-1": [0, { notebook: o, "notebook-fips": o, studio: o }], experiments: e }], repost: [0, { private: e }] }], axa: a3, azure: a3, baby: a3, baidu: a3, banamex: a3, band: a3, bank: a3, bar: a3, barcelona: a3, barclaycard: a3, barclays: a3, barefoot: a3, bargains: a3, baseball: a3, basketball: [1, { aus: o, nz: o }], bauhaus: a3, bayern: a3, bbc: a3, bbt: a3, bbva: a3, bcg: a3, bcn: a3, beats: a3, beauty: a3, beer: a3, berlin: a3, best: a3, bestbuy: a3, bet: a3, bharti: a3, bible: a3, bid: a3, bike: a3, bing: a3, bingo: a3, bio: a3, black: a3, blackfriday: a3, blockbuster: a3, blog: a3, bloomberg: a3, blue: a3, bms: a3, bmw: a3, bnpparibas: a3, boats: a3, boehringer: a3, bofa: a3, bom: a3, bond: a3, boo: a3, book: a3, booking: a3, bosch: a3, bostik: a3, boston: a3, bot: a3, boutique: a3, box: a3, bradesco: a3, bridgestone: a3, broadway: a3, broker: a3, brother: a3, brussels: a3, build: [1, { v0: o, windsurf: o }], builders: [1, { cloudsite: o }], business: y2, buy: a3, buzz: a3, bzh: a3, cab: a3, cafe: a3, cal: a3, call: a3, calvinklein: a3, cam: a3, camera: a3, camp: [1, { emf: [0, { at: o }] }], canon: a3, capetown: a3, capital: a3, capitalone: a3, car: a3, caravan: a3, cards: a3, care: a3, career: a3, careers: a3, cars: a3, casa: [1, { nabu: [0, { ui: o }] }], case: a3, cash: a3, casino: a3, catering: a3, catholic: a3, cba: a3, cbn: a3, cbre: a3, center: a3, ceo: a3, cern: a3, cfa: a3, cfd: a3, chanel: a3, channel: a3, charity: a3, chase: a3, chat: a3, cheap: a3, chintai: a3, christmas: a3, chrome: a3, church: a3, cipriani: a3, circle: a3, cisco: a3, citadel: a3, citi: a3, citic: a3, city: a3, claims: a3, cleaning: a3, click: a3, clinic: a3, clinique: a3, clothing: a3, cloud: [1, { convex: o, elementor: o, emergent: o, encoway: [0, { eu: o }], statics: e, ravendb: o, axarnet: [0, { "es-1": o }], diadem: o, jelastic: [0, { vip: o }], jele: o, "jenv-aruba": [0, { aruba: [0, { eur: [0, { it1: o }] }], it1: o }], keliweb: [2, { cs: o }], oxa: [2, { tn: o, uk: o }], primetel: [2, { uk: o }], reclaim: [0, { ca: o, uk: o, us: o }], trendhosting: [0, { ch: o, de: o }], jote: o, jotelulu: o, kuleuven: o, laravel: o, linkyard: o, magentosite: e, matlab: o, observablehq: o, perspecta: o, vapor: o, "on-rancher": e, scw: [0, { baremetal: [0, { "fr-par-1": o, "fr-par-2": o, "nl-ams-1": o }], "fr-par": [0, { cockpit: o, ddl: o, dtwh: o, fnc: [2, { functions: o }], ifr: o, k8s: E2, kafk: o, mgdb: o, rdb: o, s3: o, "s3-website": o, scbl: o, whm: o }], instances: [0, { priv: o, pub: o }], k8s: o, "nl-ams": [0, { cockpit: o, ddl: o, dtwh: o, ifr: o, k8s: E2, kafk: o, mgdb: o, rdb: o, s3: o, "s3-website": o, scbl: o, whm: o }], "pl-waw": [0, { cockpit: o, ddl: o, dtwh: o, ifr: o, k8s: E2, kafk: o, mgdb: o, rdb: o, s3: o, "s3-website": o, scbl: o }], scalebook: o, smartlabeling: o }], servebolt: o, onstackit: [0, { runs: o }], trafficplex: o, "unison-services": o, urown: o, voorloper: o, zap: o }], club: [1, { cloudns: o, jele: o, barsy: o }], clubmed: a3, coach: a3, codes: [1, { owo: e }], coffee: a3, college: a3, cologne: a3, commbank: a3, community: [1, { nog: o, ravendb: o, myforum: o }], company: a3, compare: a3, computer: a3, comsec: a3, condos: a3, construction: a3, consulting: a3, contact: a3, contractors: a3, cooking: a3, cool: [1, { elementor: o, de: o }], corsica: a3, country: a3, coupon: a3, coupons: a3, courses: a3, cpa: a3, credit: a3, creditcard: a3, creditunion: a3, cricket: a3, crown: a3, crs: a3, cruise: a3, cruises: a3, cuisinella: a3, cymru: a3, cyou: a3, dad: a3, dance: a3, data: a3, date: a3, dating: a3, datsun: a3, day: a3, dclk: a3, dds: a3, deal: a3, dealer: a3, deals: a3, degree: a3, delivery: a3, dell: a3, deloitte: a3, delta: a3, democrat: a3, dental: a3, dentist: a3, desi: a3, design: [1, { graphic: o, bss: o }], dev: [1, { "12chars": o, myaddr: o, panel: o, bearblog: o, lcl: e, lclstage: e, stg: e, stgstage: e, pages: o, r2: o, workers: o, deno: o, "deno-staging": o, deta: o, lp: [2, { api: o, objects: o }], evervault: N, fly: o, githubpreview: o, gateway: e, botdash: o, inbrowser: e, "is-a-good": o, iserv: o, leapcell: o, runcontainers: o, localcert: [0, { user: e }], loginline: o, barsy: o, mediatech: o, "mocha-sandbox": o, modx: o, ngrok: o, "ngrok-free": o, "is-a-fullstack": o, "is-cool": o, "is-not-a": o, localplayer: o, xmit: o, "platter-app": o, replit: [2, { archer: o, bones: o, canary: o, global: o, hacker: o, id: o, janeway: o, kim: o, kira: o, kirk: o, odo: o, paris: o, picard: o, pike: o, prerelease: o, reed: o, riker: o, sisko: o, spock: o, staging: o, sulu: o, tarpit: o, teams: o, tucker: o, wesley: o, worf: o }], crm: [0, { d: e, w: e, wa: e, wb: e, wc: e, wd: e, we: e, wf: e }], erp: oa, vercel: o, webhare: e, hrsn: o, "is-a": o }], dhl: a3, diamonds: a3, diet: a3, digital: [1, { cloudapps: [2, { london: o }] }], direct: [1, { libp2p: o }], directory: a3, discount: a3, discover: a3, dish: a3, diy: a3, dnp: a3, docs: a3, doctor: a3, dog: a3, domains: a3, dot: a3, download: a3, drive: a3, dtv: a3, dubai: a3, dupont: a3, durban: a3, dvag: a3, dvr: a3, earth: a3, eat: a3, eco: a3, edeka: a3, education: y2, email: [1, { crisp: [0, { on: o }], tawk: ia, tawkto: ia }], emerck: a3, energy: a3, engineer: a3, engineering: a3, enterprises: a3, epson: a3, equipment: a3, ericsson: a3, erni: a3, esq: a3, estate: [1, { compute: e }], eurovision: a3, eus: [1, { party: sa }], events: [1, { koobin: o, co: o }], exchange: a3, expert: a3, exposed: a3, express: a3, extraspace: a3, fage: a3, fail: a3, fairwinds: a3, faith: a3, family: a3, fan: a3, fans: a3, farm: [1, { storj: o }], farmers: a3, fashion: a3, fast: a3, fedex: a3, feedback: a3, ferrari: a3, ferrero: a3, fidelity: a3, fido: a3, film: a3, final: a3, finance: a3, financial: y2, fire: a3, firestone: a3, firmdale: a3, fish: a3, fishing: a3, fit: a3, fitness: a3, flickr: a3, flights: a3, flir: a3, florist: a3, flowers: a3, fly: a3, foo: a3, food: a3, football: a3, ford: a3, forex: a3, forsale: a3, forum: a3, foundation: a3, fox: a3, free: a3, fresenius: a3, frl: a3, frogans: a3, frontier: a3, ftr: a3, fujitsu: a3, fun: a3, fund: a3, furniture: a3, futbol: a3, fyi: a3, gal: a3, gallery: a3, gallo: a3, gallup: a3, game: a3, games: [1, { pley: o, sheezy: o }], gap: a3, garden: a3, gay: [1, { pages: o }], gbiz: a3, gdn: [1, { cnpy: o }], gea: a3, gent: a3, genting: a3, george: a3, ggee: a3, gift: a3, gifts: a3, gives: a3, giving: a3, glass: a3, gle: a3, global: [1, { appwrite: o }], globo: a3, gmail: a3, gmbh: a3, gmo: a3, gmx: a3, godaddy: a3, gold: a3, goldpoint: a3, golf: a3, goo: a3, goodyear: a3, goog: [1, { cloud: o, translate: o, usercontent: e }], google: a3, gop: a3, got: a3, grainger: a3, graphics: a3, gratis: a3, green: a3, gripe: a3, grocery: a3, group: [1, { discourse: o }], gucci: a3, guge: a3, guide: a3, guitars: a3, guru: a3, hair: a3, hamburg: a3, hangout: a3, haus: a3, hbo: a3, hdfc: a3, hdfcbank: a3, health: [1, { hra: o }], healthcare: a3, help: a3, helsinki: a3, here: a3, hermes: a3, hiphop: a3, hisamitsu: a3, hitachi: a3, hiv: a3, hkt: a3, hockey: a3, holdings: a3, holiday: a3, homedepot: a3, homegoods: a3, homes: a3, homesense: a3, honda: a3, horse: a3, hospital: a3, host: [1, { cloudaccess: o, freesite: o, easypanel: o, emergent: o, fastvps: o, myfast: o, tempurl: o, wpmudev: o, iserv: o, jele: o, mircloud: o, bolt: o, wp2: o, half: o }], hosting: [1, { opencraft: o }], hot: a3, hotel: a3, hotels: a3, hotmail: a3, house: a3, how: a3, hsbc: a3, hughes: a3, hyatt: a3, hyundai: a3, ibm: a3, icbc: a3, ice: a3, icu: a3, ieee: a3, ifm: a3, ikano: a3, imamat: a3, imdb: a3, immo: a3, immobilien: a3, inc: a3, industries: a3, infiniti: a3, ing: a3, ink: a3, institute: a3, insurance: a3, insure: a3, international: a3, intuit: a3, investments: a3, ipiranga: a3, irish: a3, ismaili: a3, ist: a3, istanbul: a3, itau: a3, itv: a3, jaguar: a3, java: a3, jcb: a3, jeep: a3, jetzt: a3, jewelry: a3, jio: a3, jll: a3, jmp: a3, jnj: a3, joburg: a3, jot: a3, joy: a3, jpmorgan: a3, jprs: a3, juegos: a3, juniper: a3, kaufen: a3, kddi: a3, kerryhotels: a3, kerryproperties: a3, kfh: a3, kia: a3, kids: a3, kim: a3, kindle: a3, kitchen: a3, kiwi: a3, koeln: a3, komatsu: a3, kosher: a3, kpmg: a3, kpn: a3, krd: [1, { co: o, edu: o }], kred: a3, kuokgroup: a3, kyoto: a3, lacaixa: a3, lamborghini: a3, lamer: a3, land: a3, landrover: a3, lanxess: a3, lasalle: a3, lat: a3, latino: a3, latrobe: a3, law: a3, lawyer: a3, lds: a3, lease: a3, leclerc: a3, lefrak: a3, legal: a3, lego: a3, lexus: a3, lgbt: a3, lidl: a3, life: a3, lifeinsurance: a3, lifestyle: a3, lighting: a3, like: a3, lilly: a3, limited: a3, limo: a3, lincoln: a3, link: [1, { myfritz: o, cyon: o, joinmc: o, dweb: e, inbrowser: e, nftstorage: L2, mypep: o, storacha: L2, w3s: L2 }], live: [1, { aem: o, hlx: o, ewp: e }], living: a3, llc: a3, llp: a3, loan: a3, loans: a3, locker: a3, locus: a3, lol: [1, { omg: o }], london: a3, lotte: a3, lotto: a3, love: a3, lpl: a3, lplfinancial: a3, ltd: a3, ltda: a3, lundbeck: a3, luxe: a3, luxury: a3, madrid: a3, maif: a3, maison: a3, makeup: a3, man: a3, management: a3, mango: a3, map: a3, market: a3, marketing: a3, markets: a3, marriott: a3, marshalls: a3, mattel: a3, mba: a3, mckinsey: a3, med: a3, media: A2, meet: a3, melbourne: a3, meme: a3, memorial: a3, men: a3, menu: [1, { barsy: o, barsyonline: o }], merck: a3, merckmsd: a3, miami: a3, microsoft: a3, mini: a3, mint: a3, mit: a3, mitsubishi: a3, mlb: a3, mls: a3, mma: a3, mobile: a3, moda: a3, moe: a3, moi: a3, mom: a3, monash: a3, money: a3, monster: a3, mormon: a3, mortgage: a3, moscow: a3, moto: a3, motorcycles: a3, mov: a3, movie: a3, msd: a3, mtn: a3, mtr: a3, music: a3, nab: a3, nagoya: a3, navy: a3, nba: a3, nec: a3, netbank: a3, netflix: a3, network: [1, { aem: o, alces: e, co: o, arvo: o, azimuth: o, tlon: o }], neustar: a3, new: a3, news: [1, { noticeable: o }], next: a3, nextdirect: a3, nexus: a3, nfl: a3, ngo: a3, nhk: a3, nico: a3, nike: a3, nikon: a3, ninja: a3, nissan: a3, nissay: a3, nokia: a3, norton: a3, now: a3, nowruz: a3, nowtv: a3, nra: a3, nrw: a3, ntt: a3, nyc: a3, obi: a3, observer: a3, office: a3, okinawa: a3, olayan: a3, olayangroup: a3, ollo: a3, omega: a3, one: [1, { kin: e, service: o, website: o }], ong: [1, { obl: o }], onl: a3, online: [1, { eero: o, "eero-stage": o, websitebuilder: o, leapcell: o, barsy: o }], ooo: a3, open: a3, oracle: a3, orange: [1, { tech: o }], organic: a3, origins: a3, osaka: a3, otsuka: a3, ott: a3, ovh: [1, { nerdpol: o }], page: [1, { aem: o, hlx: o, translated: o, codeberg: o, heyflow: o, prvcy: o, rocky: o, statichost: o, pdns: o, plesk: o }], panasonic: a3, paris: a3, pars: a3, partners: a3, parts: a3, party: a3, pay: a3, pccw: a3, pet: a3, pfizer: a3, pharmacy: a3, phd: a3, philips: a3, phone: a3, photo: a3, photography: a3, photos: A2, physio: a3, pics: a3, pictet: a3, pictures: [1, { 1337: o }], pid: a3, pin: a3, ping: a3, pink: a3, pioneer: a3, pizza: [1, { ngrok: o }], place: y2, play: a3, playstation: a3, plumbing: a3, plus: [1, { playit: [2, { at: e, with: o }] }], pnc: a3, pohl: a3, poker: a3, politie: a3, porn: a3, praxi: a3, press: a3, prime: a3, prod: a3, productions: a3, prof: a3, progressive: a3, promo: a3, properties: a3, property: a3, protection: a3, pru: a3, prudential: a3, pub: [1, { id: e, kin: e, barsy: o }], pwc: a3, qpon: a3, quebec: a3, quest: a3, racing: a3, radio: a3, read: a3, realestate: a3, realtor: a3, realty: a3, recipes: a3, red: a3, redumbrella: a3, rehab: a3, reise: a3, reisen: a3, reit: a3, reliance: a3, ren: a3, rent: a3, rentals: a3, repair: a3, report: a3, republican: a3, rest: a3, restaurant: a3, review: a3, reviews: [1, { aem: o }], rexroth: a3, rich: a3, richardli: a3, ricoh: a3, ril: a3, rio: a3, rip: [1, { clan: o }], rocks: [1, { myddns: o, stackit: o, "lima-city": o, webspace: o }], rodeo: a3, rogers: a3, room: a3, rsvp: a3, rugby: a3, ruhr: a3, run: [1, { appwrite: e, canva: o, development: o, ravendb: o, liara: [2, { iran: o }], lovable: o, needle: o, build: e, code: e, database: e, migration: e, onporter: o, repl: o, stackit: o, val: oa, vercel: o, wix: o }], rwe: a3, ryukyu: a3, saarland: a3, safe: a3, safety: a3, sakura: a3, sale: a3, salon: a3, samsclub: a3, samsung: a3, sandvik: a3, sandvikcoromant: a3, sanofi: a3, sap: a3, sarl: a3, sas: a3, save: a3, saxo: a3, sbi: a3, sbs: a3, scb: a3, schaeffler: a3, schmidt: a3, scholarships: a3, school: a3, schule: a3, schwarz: a3, science: a3, scot: [1, { gov: [2, { service: o }] }], search: a3, seat: a3, secure: a3, security: a3, seek: a3, select: a3, sener: a3, services: [1, { loginline: o }], seven: a3, sew: a3, sex: a3, sexy: a3, sfr: a3, shangrila: a3, sharp: a3, shell: a3, shia: a3, shiksha: a3, shoes: a3, shop: [1, { base: o, hoplix: o, barsy: o, barsyonline: o, shopware: o }], shopping: a3, shouji: a3, show: a3, silk: a3, sina: a3, singles: a3, site: [1, { square: o, canva: S2, cloudera: e, convex: o, cyon: o, caffeine: o, fastvps: o, figma: o, "figma-gov": o, preview: o, heyflow: o, jele: o, jouwweb: o, loginline: o, barsy: o, co: o, notion: o, omniwe: o, opensocial: o, madethis: o, support: o, platformsh: e, tst: e, byen: o, srht: o, novecore: o, cpanel: o, wpsquared: o, sourcecraft: o }], ski: a3, skin: a3, sky: a3, skype: a3, sling: a3, smart: a3, smile: a3, sncf: a3, soccer: a3, social: a3, softbank: a3, software: a3, sohu: a3, solar: a3, solutions: a3, song: a3, sony: a3, soy: a3, spa: a3, space: [1, { myfast: o, heiyu: o, hf: [2, { static: o }], "app-ionos": o, project: o, uber: o, xs4all: o }], sport: a3, spot: a3, srl: a3, stada: a3, staples: a3, star: a3, statebank: a3, statefarm: a3, stc: a3, stcgroup: a3, stockholm: a3, storage: a3, store: [1, { barsy: o, sellfy: o, shopware: o, storebase: o }], stream: a3, studio: a3, study: a3, style: a3, sucks: a3, supplies: a3, supply: a3, support: [1, { barsy: o }], surf: a3, surgery: a3, suzuki: a3, swatch: a3, swiss: a3, sydney: a3, systems: [1, { knightpoint: o }], tab: a3, taipei: a3, talk: a3, taobao: a3, target: a3, tatamotors: a3, tatar: a3, tattoo: a3, tax: a3, taxi: a3, tci: a3, tdk: a3, team: [1, { discourse: o, jelastic: o }], tech: [1, { cleverapps: o }], technology: y2, temasek: a3, tennis: a3, teva: a3, thd: a3, theater: a3, theatre: a3, tiaa: a3, tickets: a3, tienda: a3, tips: a3, tires: a3, tirol: a3, tjmaxx: a3, tjx: a3, tkmaxx: a3, tmall: a3, today: [1, { prequalifyme: o }], tokyo: a3, tools: [1, { addr: aa, myaddr: o }], top: [1, { ntdll: o, wadl: e }], toray: a3, toshiba: a3, total: a3, tours: a3, town: a3, toyota: a3, toys: a3, trade: a3, trading: a3, training: a3, travel: a3, travelers: a3, travelersinsurance: a3, trust: a3, trv: a3, tube: a3, tui: a3, tunes: a3, tushu: a3, tvs: a3, ubank: a3, ubs: a3, unicom: a3, university: a3, uno: a3, uol: a3, ups: a3, vacations: a3, vana: a3, vanguard: a3, vegas: a3, ventures: a3, verisign: a3, versicherung: a3, vet: a3, viajes: a3, video: a3, vig: a3, viking: a3, villas: a3, vin: a3, vip: [1, { hidns: o }], virgin: a3, visa: a3, vision: a3, viva: a3, vivo: a3, vlaanderen: a3, vodka: a3, volvo: a3, vote: a3, voting: a3, voto: a3, voyage: a3, wales: a3, walmart: a3, walter: a3, wang: a3, wanggou: a3, watch: a3, watches: a3, weather: a3, weatherchannel: a3, webcam: a3, weber: a3, website: A2, wed: a3, wedding: a3, weibo: a3, weir: a3, whoswho: a3, wien: a3, wiki: A2, williamhill: a3, win: a3, windows: a3, wine: a3, winners: a3, wme: a3, wolterskluwer: a3, woodside: a3, work: a3, works: a3, world: a3, wow: a3, wtc: a3, wtf: a3, xbox: a3, xerox: a3, xihuan: a3, xin: a3, "xn--11b4c3d": a3, कॉम: a3, "xn--1ck2e1b": a3, セール: a3, "xn--1qqw23a": a3, 佛山: a3, "xn--30rr7y": a3, 慈善: a3, "xn--3bst00m": a3, 集团: a3, "xn--3ds443g": a3, 在线: a3, "xn--3pxu8k": a3, 点看: a3, "xn--42c2d9a": a3, คอม: a3, "xn--45q11c": a3, 八卦: a3, "xn--4gbrim": a3, موقع: a3, "xn--55qw42g": a3, 公益: a3, "xn--55qx5d": a3, 公司: a3, "xn--5su34j936bgsg": a3, 香格里拉: a3, "xn--5tzm5g": a3, 网站: a3, "xn--6frz82g": a3, 移动: a3, "xn--6qq986b3xl": a3, 我爱你: a3, "xn--80adxhks": a3, москва: a3, "xn--80aqecdr1a": a3, католик: a3, "xn--80asehdb": a3, онлайн: a3, "xn--80aswg": a3, сайт: a3, "xn--8y0a063a": a3, 联通: a3, "xn--9dbq2a": a3, קום: a3, "xn--9et52u": a3, 时尚: a3, "xn--9krt00a": a3, 微博: a3, "xn--b4w605ferd": a3, 淡马锡: a3, "xn--bck1b9a5dre4c": a3, ファッション: a3, "xn--c1avg": a3, орг: a3, "xn--c2br7g": a3, नेट: a3, "xn--cck2b3b": a3, ストア: a3, "xn--cckwcxetd": a3, アマゾン: a3, "xn--cg4bki": a3, 삼성: a3, "xn--czr694b": a3, 商标: a3, "xn--czrs0t": a3, 商店: a3, "xn--czru2d": a3, 商城: a3, "xn--d1acj3b": a3, дети: a3, "xn--eckvdtc9d": a3, ポイント: a3, "xn--efvy88h": a3, 新闻: a3, "xn--fct429k": a3, 家電: a3, "xn--fhbei": a3, كوم: a3, "xn--fiq228c5hs": a3, 中文网: a3, "xn--fiq64b": a3, 中信: a3, "xn--fjq720a": a3, 娱乐: a3, "xn--flw351e": a3, 谷歌: a3, "xn--fzys8d69uvgm": a3, 電訊盈科: a3, "xn--g2xx48c": a3, 购物: a3, "xn--gckr3f0f": a3, クラウド: a3, "xn--gk3at1e": a3, 通販: a3, "xn--hxt814e": a3, 网店: a3, "xn--i1b6b1a6a2e": a3, संगठन: a3, "xn--imr513n": a3, 餐厅: a3, "xn--io0a7i": a3, 网络: a3, "xn--j1aef": a3, ком: a3, "xn--jlq480n2rg": a3, 亚马逊: a3, "xn--jvr189m": a3, 食品: a3, "xn--kcrx77d1x4a": a3, 飞利浦: a3, "xn--kput3i": a3, 手机: a3, "xn--mgba3a3ejt": a3, ارامكو: a3, "xn--mgba7c0bbn0a": a3, العليان: a3, "xn--mgbab2bd": a3, بازار: a3, "xn--mgbca7dzdo": a3, ابوظبي: a3, "xn--mgbi4ecexp": a3, كاثوليك: a3, "xn--mgbt3dhd": a3, همراه: a3, "xn--mk1bu44c": a3, 닷컴: a3, "xn--mxtq1m": a3, 政府: a3, "xn--ngbc5azd": a3, شبكة: a3, "xn--ngbe9e0a": a3, بيتك: a3, "xn--ngbrx": a3, عرب: a3, "xn--nqv7f": a3, 机构: a3, "xn--nqv7fs00ema": a3, 组织机构: a3, "xn--nyqy26a": a3, 健康: a3, "xn--otu796d": a3, 招聘: a3, "xn--p1acf": [1, { "xn--90amc": o, "xn--j1aef": o, "xn--j1ael8b": o, "xn--h1ahn": o, "xn--j1adp": o, "xn--c1avg": o, "xn--80aaa0cvac": o, "xn--h1aliz": o, "xn--90a1af": o, "xn--41a": o }], рус: [1, { биз: o, ком: o, крым: o, мир: o, мск: o, орг: o, самара: o, сочи: o, спб: o, я: o }], "xn--pssy2u": a3, 大拿: a3, "xn--q9jyb4c": a3, みんな: a3, "xn--qcka1pmc": a3, グーグル: a3, "xn--rhqv96g": a3, 世界: a3, "xn--rovu88b": a3, 書籍: a3, "xn--ses554g": a3, 网址: a3, "xn--t60b56a": a3, 닷넷: a3, "xn--tckwe": a3, コム: a3, "xn--tiq49xqyj": a3, 天主教: a3, "xn--unup4y": a3, 游戏: a3, "xn--vermgensberater-ctb": a3, vermögensberater: a3, "xn--vermgensberatung-pwb": a3, vermögensberatung: a3, "xn--vhquv": a3, 企业: a3, "xn--vuq861b": a3, 信息: a3, "xn--w4r85el8fhu5dnra": a3, 嘉里大酒店: a3, "xn--w4rs40l": a3, 嘉里: a3, "xn--xhq521b": a3, 广东: a3, "xn--zfr164b": a3, 政务: a3, xyz: [1, { caffeine: o, botdash: o, telebit: e }], yachts: a3, yahoo: a3, yamaxun: a3, yandex: a3, yodobashi: a3, yoga: a3, yokohama: a3, you: a3, youtube: a3, yun: a3, zappos: a3, zara: a3, zero: a3, zip: a3, zone: [1, { triton: e, stackit: o, lima: o }], zuerich: a3 }];
  })();
  function c(a3, s, i3, r2) {
    let n5 = null, e = s;
    for (; e !== void 0 && ((e[0] & r2) !== 0 && (n5 = { index: i3 + 1, isIcann: e[0] === 1, isPrivate: e[0] === 2 }), i3 !== -1); ) {
      const l2 = e[1];
      e = Object.prototype.hasOwnProperty.call(l2, a3[i3]) ? l2[a3[i3]] : l2["*"], i3 -= 1;
    }
    return n5;
  }
  function p2(a3, s, i3) {
    var r2;
    if (fast_path_default(a3, s, i3)) return;
    const n5 = a3.split("."), e = (s.allowPrivateDomains ? 2 : 0) | (s.allowIcannDomains ? 1 : 0), l2 = c(n5, exceptions, n5.length - 1, e);
    if (l2 !== null) {
      i3.isIcann = l2.isIcann, i3.isPrivate = l2.isPrivate, i3.publicSuffix = n5.slice(l2.index + 1).join(".");
      return;
    }
    const t2 = c(n5, rules, n5.length - 1, e);
    if (t2 !== null) {
      i3.isIcann = t2.isIcann, i3.isPrivate = t2.isPrivate, i3.publicSuffix = n5.slice(t2.index).join(".");
      return;
    }
    i3.isIcann = false, i3.isPrivate = false, i3.publicSuffix = (r2 = n5[n5.length - 1]) !== null && r2 !== void 0 ? r2 : null;
  }
  var n4 = getEmptyResult();
  function parse(t2, o = {}) {
    return parseImpl(t2, 5, p2, o, getEmptyResult());
  }
  function getHostname(t2, o = {}) {
    return resetResult(n4), parseImpl(t2, 0, p2, o, n4).hostname;
  }
  function getPublicSuffix(t2, o = {}) {
    return resetResult(n4), parseImpl(t2, 2, p2, o, n4).publicSuffix;
  }
  function getDomain(t2, o = {}) {
    return resetResult(n4), parseImpl(t2, 3, p2, o, n4).domain;
  }
  function getSubdomain(t2, o = {}) {
    return resetResult(n4), parseImpl(t2, 4, p2, o, n4).subdomain;
  }
  function getDomainWithoutSuffix(t2, o = {}) {
    return resetResult(n4), parseImpl(t2, 5, p2, o, n4).domainWithoutSuffix;
  }
  if (unsafeWindow.IwaraDownloadTool) {
    throw `Script is already running`;
  }
  unsafeWindow.IwaraDownloadTool = true;
  GM_addStyle(main_default);
  var officialWhiteList = ["iwara.tv", "iwara.zip", "iwara.shop"];
  var domain = getDomain(unsafeWindow.location.href) ?? "";
  if (!officialWhiteList.includes(domain) && unsafeWindow.location.hostname.includes("iwara")) {
    XMLHttpRequest.prototype.open = void 0;
    unsafeWindow.fetch = void 0;
    unsafeWindow.WebSocket = void 0;
    if (!confirm(stringify(i18nList[config.language].notOfficialWarning))) {
      unsafeWindow.location.href = "about:blank";
      unsafeWindow.close();
    } else {
      throw "Not official";
    }
  }
  if (domain !== "iwara.tv") {
    throw "Not target";
  }
  switch (GM_info.scriptHandler) {
    case "Via":
    case "Tampermonkey":
    case "ScriptCat":
      break;
    default:
      throw `Not support ${GM_info.scriptHandler}`;
  }
  if (GM_getValue("isDebug")) {
    debugger;
    originalConsole.debug(stringify(GM_info));
  }
  unsafeWindow.fetch = createInterceptedFetch();
  var isPageType = (type) => new Set(Object.values(PageType)).has(type);
  var isLoggedIn = () => !(unsafeWindow.localStorage.getItem("token") ?? "").isEmpty();
  var rating = () => localStorage.getItem("rating") ?? "all";
  var selectList = new GMSyncDictionary("selectList");
  var pageSelectButtons = new Dictionary();
  var mouseTarget = null;
  var watermark = new waterMark();
  var pluginMenu = new menu();
  var editConfig = new configEdit(config);
  selectList.onSet = (key) => {
    updateButtonState(key);
    updateSelected();
  };
  selectList.onDel = (key) => {
    updateButtonState(key);
    updateSelected();
  };
  selectList.onSync = () => {
    pageSelectButtons.forEach((value, key) => {
      updateButtonState(key);
    });
    updateSelected();
  };
  function getSelectButton(id) {
    return pageSelectButtons.has(id) ? pageSelectButtons.get(id) : unsafeWindow.document.querySelector(`input.selectButton[videoid="${id}"]`);
  }
  function getPageType(mutationsList) {
    if (unsafeWindow.location.pathname.toLowerCase().endsWith("/search")) {
      return "search";
    }
    const extractPageType = (page) => {
      if (isNullOrUndefined(page)) return void 0;
      if (page.classList.length < 2) return "page";
      const pageClass = page.classList[1]?.split("-").pop();
      return !isNullOrUndefined(pageClass) && isPageType(pageClass) ? pageClass : "page";
    };
    if (isNullOrUndefined(mutationsList)) {
      return extractPageType(unsafeWindow.document.querySelector(".page"));
    }
    for (const mutation of mutationsList) {
      if (mutation.type === "childList" && mutation.addedNodes.length > 0) {
        return extractPageType(Array.from(mutation.addedNodes).find((node) => node instanceof Element && node.classList.contains("page")));
      }
    }
  }
  function pageChange() {
    pluginMenu.pageType = getPageType() ?? pluginMenu.pageType;
    GM_getValue("isDebug") && originalConsole.debug("[Debug]", pageSelectButtons);
  }
  function updateSelected() {
    watermark.selected.textContent = ` ${i18nList[config.language].selected} ${selectList.size} `;
  }
  function updateButtonState(videoID) {
    const selectButton = getSelectButton(videoID);
    if (selectButton) selectButton.checked = selectList.has(videoID);
  }
  function hijackAddEventListener() {
    unsafeWindow.EventTarget.prototype.addEventListener = function(type, listener, options) {
      originalAddEventListener.call(this, type, listener, options);
    };
  }
  function hijackNodeAppendChild() {
    Node.prototype.appendChild = function(node) {
      if (node instanceof HTMLElement && node.classList.contains("videoTeaser")) {
        injectCheckbox(node);
      }
      return originalNodeAppendChild.call(this, node);
    };
  }
  function hijackNodeRemoveChild() {
    Node.prototype.removeChild = function(child) {
      uninjectCheckbox(child);
      return originalNodeRemoveChild.apply(this, [child]);
    };
  }
  function hijackElementRemove() {
    Element.prototype.remove = function() {
      uninjectCheckbox(this);
      return originalElementRemove.apply(this);
    };
  }
  function hijackHistoryPushState() {
    unsafeWindow.history.pushState = function(...args) {
      originalHistoryPushState.apply(this, args);
      pageChange();
    };
  }
  function hijackHistoryReplaceState() {
    unsafeWindow.history.replaceState = function(...args) {
      originalHistoryReplaceState.apply(this, args);
      pageChange();
    };
  }
  function hijackStorage() {
    unsafeWindow.Storage.prototype.setItem = function(key, value) {
      originalStorageSetItem.call(this, key, value);
      if (key === "token") pluginMenu.pageChange();
    };
    unsafeWindow.Storage.prototype.removeItem = function(key) {
      originalStorageRemoveItem.call(this, key);
      if (key === "token") pluginMenu.pageChange();
    };
    unsafeWindow.Storage.prototype.clear = function() {
      originalStorageClear.call(this);
      pluginMenu.pageChange();
    };
  }
  function firstRun() {
    GM_listValues().forEach((i3) => GM_deleteValue(i3));
    Config.destroyInstance();
    editConfig = new configEdit(config);
    let confirmButton = renderNode({
      nodeType: "button",
      attributes: {
        disabled: true,
        title: i18nList[config.language].ok
      },
      childs: "%#ok#%",
      events: {
        click: () => {
          GM_setValue("isFirstRun", false);
          GM_setValue("version", GM_info.script.version);
          unsafeWindow.document.querySelector("#pluginOverlay")?.remove();
          editConfig.inject();
        }
      }
    });
    originalNodeAppendChild.call(unsafeWindow.document.body, renderNode({
      nodeType: "div",
      attributes: {
        id: "pluginOverlay"
      },
      childs: [
        {
          nodeType: "div",
          className: "main",
          childs: [
            { nodeType: "p", childs: i18nList[config.language].useHelpForBase },
            { nodeType: "p", childs: "%#useHelpForInjectCheckbox#%" },
            { nodeType: "p", childs: "%#useHelpForCheckDownloadLink#%" },
            { nodeType: "p", childs: i18nList[config.language].useHelpForManualDownload },
            { nodeType: "p", childs: i18nList[config.language].useHelpForBugreport }
          ]
        },
        {
          nodeType: "div",
          className: "checkbox-container",
          childs: {
            nodeType: "label",
            className: ["checkbox-label", "rainbow-text"],
            childs: [
              {
                nodeType: "input",
                className: "checkbox",
                attributes: {
                  type: "checkbox",
                  name: "agree-checkbox"
                },
                events: {
                  change: (event) => {
                    confirmButton.disabled = !event.target.checked;
                  }
                }
              },
              "%#alreadyKnowHowToUse#%"
            ]
          }
        },
        confirmButton
      ]
    }));
  }
  async function main() {
    if (new Version(GM_getValue("version", "0.0.0")).compare(new Version("3.3.0")) === 0) {
      GM_setValue("isFirstRun", true);
      alert(i18nList[config.language].configurationIncompatible);
    }
    if (GM_getValue("isFirstRun", true)) {
      firstRun();
      return;
    }
    if (new Version(GM_getValue("version", "0.0.0")).compare(new Version("3.3.22")) === 0) {
      alert(i18nList[config.language].configurationIncompatible);
      try {
        selectList.clear();
        GM_deleteValue("selectList");
        await db.delete();
        GM_setValue("version", GM_info.script.version);
        unsafeWindow.location.reload();
      } catch (error) {
        originalConsole.error(error);
      }
      return;
    }
    if (!await check()) {
      newToast(1, {
        text: `%#configError#%`,
        duration: 60 * 1e3
      }).show();
      editConfig.inject();
      return;
    }
    GM_setValue("version", GM_info.script.version);
    hijackAddEventListener();
    if (config.autoInjectCheckbox) hijackNodeAppendChild();
    hijackNodeRemoveChild();
    hijackElementRemove();
    hijackStorage();
    hijackHistoryPushState();
    hijackHistoryReplaceState();
    originalAddEventListener("mouseover", (event) => {
      mouseTarget = event.target instanceof Element ? event.target : null;
    });
    originalAddEventListener("keydown", (event) => {
      const keyboardEvent = event;
      if (keyboardEvent.code === "Space" && !isNullOrUndefined(mouseTarget)) {
        let element = findElement(mouseTarget, ".videoTeaser");
        let button = element && (element.matches(".selectButton") ? element : element.querySelector(".selectButton"));
        button && button.click();
        button && keyboardEvent.preventDefault();
      }
    });
    new MutationObserver(async (m2, o) => {
      if (m2.some((m3) => m3.type === "childList" && unsafeWindow.document.getElementById("app"))) {
        pluginMenu.inject();
        o.disconnect();
      }
    }).observe(unsafeWindow.document.body, { childList: true, subtree: true });
    if (isLoggedIn()) {
      let localUser = (await (await unlimitedFetch("https://api.iwara.tv/user", {
        method: "GET",
        headers: await getAuth()
      })).json()).user;
      let authorProfile = (await (await unlimitedFetch("https://api.iwara.tv/profile/dawn", {
        method: "GET",
        headers: await getAuth()
      })).json()).user;
      if (localUser.id !== authorProfile.id) {
        if (!authorProfile.following) {
          unlimitedFetch(`https://api.iwara.tv/user/${authorProfile.id}/followers`, {
            method: "POST",
            headers: await getAuth()
          });
        }
        if (!authorProfile.friend) {
          unlimitedFetch(`https://api.iwara.tv/user/${authorProfile.id}/friends`, {
            method: "POST",
            headers: await getAuth()
          });
        }
      }
    }
    newToast(
      1,
      {
        node: toastNode(i18nList[config.language].notice),
        duration: 1e4,
        gravity: "bottom",
        position: "center",
        onClick() {
          this.hide();
        }
      }
    ).show();
  }
  (unsafeWindow.document.body ? Promise.resolve() : new Promise((resolve) => originalAddEventListener.call(unsafeWindow.document, "DOMContentLoaded", resolve))).then(main);
})();