Replacer

replace words

2024/12/20のページです。最新版はこちら。

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @name         Replacer
// @namespace    http://tampermonkey.net/
// @version      2.0
// @license MIT
// @description  replace words
// @author       Shuraken007
// @include https://*/*
// @include http://*/*
// ==/UserScript==

/* jshint esversion: 9 */
'use strict';

const config = {
   "json_url": "https://api.npoint.io/97ef86b1e99dfc26c72d",
   "traditional_to_simple_chinese": true,
   "delay_scroll_on_reload": 5000,
   "default_priority_level": 1,
};

const script_start = Date.now();

const loader_modes = {
   restore: 'restore_json_data_from_localStorage',
   norestore: 'always_load',
};

class ConfigLoader {
   constructor() {
      this.mode = loader_modes.restore;
      this.loaded_urls = {};
      this.is_data_updated = false;
      this.is_restored = false;
   }

   async load(url) {
      let data;
      if (this.mode == loader_modes.restore) {
         data = await localStorage.getItem(url);
      }
      if (data) {
         this.is_restored = true
         this.loaded_urls[url] = data;
         return data
      }

      data = await ConfigLoader.loadFile(url);
      // console.log(data);
      localStorage.setItem(url, data);

      if (!this.mode === loader_modes.norestore) return data;
      if (!this.loaded_urls[url]) return data;
      if (this.loaded_urls[url] !== data) {
         console.log('config updated');
         this.is_data_updated = true;
      }
      return data
   }

   static async loadFile(url) {
      let response = await fetch(url);
      if (response.status == 200) {
         return response.text();
      } else {
         let msg =
            `loading: ${url}
            status: ${response.status}
            response: ${response.response}
            `;

         throw Error(msg);
      }
   }

   resetOnError(err) {
      for (const k of Object.keys(this.loaded_urls)) {
         localStorage.removeItem(k);
         console.log(`storage with key ${k} removed`);
      }
      throw err
   }
}

const types = {
   Array: 'Array',
   Dict: 'Dict',
   String: 'String',
   Int: 'Int',
   Unknown: 'Unknown',
};

const known_keys = {
   urls: '__urls',
   include: '__include',
   level: '__level',
   contains: function (key) {
      return Object.values(this).includes(key);
   }
};

function get_type(x) {
   if (x instanceof Array) return types.Array;
   if (typeof x == 'object') return types.Dict;
   if (typeof x === 'string' || x instanceof String) return types.String;
   if (!Number.isNaN(x) && Number.isInteger(x)) return types.Int;

   return types.Unknown;
}

class ConfigBuilder {
   constructor(config_loader) {
      this.url = window.location.href;
      this.config_loader = config_loader;
   }

   async build(url) {
      let data = await this.config_loader.load(url);
      var json = JSON.parse(data);
      let known_nodes_map = new Map();
      this.collect_names(json, known_nodes_map);

      let replacements_by_priority_level = {};
      await this.collect_replacements(
         json,
         replacements_by_priority_level,
         known_nodes_map,
         config.default_priority_level
      );
      // console.log(replacements_by_priority_level)

      let replacements = this.union_replacements_by_level(replacements_by_priority_level);
      console.log(replacements)
      return replacements;
   }

   collect_names(node, known_nodes_map) {
      for (const [k, v] of Object.entries(node)) {
         if (known_keys.contains(k)) continue;
         if (get_type(v) !== types.Dict) continue;
         this.collect_names(v, known_nodes_map);
         if (known_nodes_map.has(k)) {
            console.log(`key ${k} already added`);
         }
         known_nodes_map.set(k, v);
      }
   }

   check_url(pattern_arr) {
      let obj_type = get_type(pattern_arr);
      if (obj_type != types.Array) {
         throw new Error(`field ${known_keys.urls} exptect to be Array, got ${obj_type}`);
      }
      for (const url_pattern of pattern_arr) {
         let url_token = tokenToRegex(url_pattern, true);
         if (!url_token.test(this.url)) continue;
         return true;
      }
      return false;
   }

   validate_lvl(lvl, root) {
      let lvl_type = get_type(lvl);
      if (lvl_type !== types.Int) {
         console.log(`field ${known_keys.level} must be number, got ${lvl_type}
            root: ${root}`);
         return false;
      }
      return true;
   }

   validate_include(include, known_nodes_map, root) {
      if (include.includes('http')) return false;
      if (!known_nodes_map.has(include)) {
         console.log(`include '${include}' not founded
            root: ${root}`);
         return false;
      }
      if (root.hasOwnProperty(include)) {
         console.log(`current node already has key '${include}'
            root: ${root}`);
         return false;
      }
      return true;
   }

   isValidHttpUrl(string) {
      let url;

      try {
         url = new URL(string);
      } catch (_) {
         return false;
      }

      return url.protocol === "http:" || url.protocol === "https:";
   }

   async add_include(node_name, include, known_nodes_map, root) {
      let data;
      if (this.validate_include(include, known_nodes_map, root)) {
         data = known_nodes_map.get(include);
      } else if (this.isValidHttpUrl(include)) {
         try {
            data = await this.config_loader.load(include);
            data = JSON.parse(data);
         } catch (err) {
            localStorage.removeItem(include);
            console.log(`error on loading url include ${include}`)
            return;
         }
      }
      if (!data) return;
      root[node_name] = data;
   }

   async collect_replacements(node, collection_by_lvl, known_nodes_map, priority_lvl, is_matched = false) {
      let urls = node[known_keys.urls];
      if (urls) {
         if (!this.check_url(urls)) return;
         is_matched = true;
      }
      let lvl = node[known_keys.level];
      if (lvl !== undefined) {
         if (this.validate_lvl(lvl, node)) priority_lvl = lvl;
      }
      let includes = node[known_keys.include];
      if (includes) {
         for (const [node_name, include] of Object.entries(includes)) {
            await this.add_include(node_name, include, known_nodes_map, node);
         }
      }
      for (const [k, v] of Object.entries(node)) {
         if (known_keys.contains(k)) continue;
         let val_type = get_type(v);
         if (val_type == types.Array) {
            this.add_random_entity(k, v, collection_by_lvl, priority_lvl);
         } else if (val_type == types.Dict) {
            await this.collect_replacements(v, collection_by_lvl, known_nodes_map, priority_lvl, is_matched);
         } else if (val_type === types.String) {
            this.add_basic_entity(k, v, collection_by_lvl, priority_lvl);
         }
      }
   }

   add_random_entity(key, value, collection_by_lvl, priority_lvl) {
      if (get_type(value) != types.Array) {
         throw Error(
            `value expected to be Array, got ${get_type(value)}
            value: ${value}`
         );
      }
      if (config.traditional_to_simple_chinese) {
         key = t2s(key);
         value = value.map(e => t2s(e));
      }
      key = tokenToRegex(key);
      this.add_replacement_to_collection(key, value, collection_by_lvl, priority_lvl);
   }

   add_basic_entity(key, value, collection_by_lvl, priority_lvl) {
      if (get_type(value) != types.String) {
         throw Error(
            `value expected to be str, got ${get_type(value)}
            value: ${value}`
         );
      }
      if (config.traditional_to_simple_chinese) {
         key = t2s(key);
         value = t2s(value);
      }
      key = tokenToRegex(key);
      this.add_replacement_to_collection(key, value, collection_by_lvl, priority_lvl);
   }

   add_replacement_to_collection(key, value, collection_by_lvl, priority_lvl) {
      if (!collection_by_lvl.hasOwnProperty(priority_lvl)) {
         collection_by_lvl[priority_lvl] = [];
      }
      let collection_arr = collection_by_lvl[priority_lvl];

      for (let i = 0; i < collection_arr.length; i++) {
         let k = collection_arr[i][0];
         let k_as_str = k.toString().replace(/^\//, "").replace(/\/$/, "");
         let key_as_str = key.toString().replace(/^\//, "").replace(/\/\w*?$/, "");
         if (key_as_str == k_as_str) {
            console.log(`key: ${key} was added earlier, overriding`);
            collection_arr.splice(i, 1);
         }
         if (key_as_str.includes(k_as_str)) {
            // console.log(`replacement ${key} contains earlier added ${k}, moving up`);
            collection_arr.splice(i, 0, [key, value]);
            return;
         }
      }
      collection_arr.push([key, value]);
   }

   sort_str_keys_as_numbers(a, b) {
      let x = Number(a);
      let y = Number(b);
      if (x < y) return -1;
      if (x > y) return 1;
      return 0;
   }

   union_replacements_by_level(collection_by_lvl) {
      let replacements = [];

      let keys = Object.keys(collection_by_lvl);
      for (let key of keys.sort(this.sort_str_keys_as_numbers)) {
         replacements.push(...collection_by_lvl[key]);
      }
      return replacements;
   }

}

function run_mutations(mutations, replacements) {
   try {
      mutations.forEach(mutation => {
         if (mutation.type === "childList") {
            mutation.addedNodes.forEach(node => {
               replaceText(node, replacements);
            });
         }
      });
   } catch (err) {
      // wrong config
      config_loader.resetOnError(err);
   }
}

function replaceText(node, replacements) {
   // catch script from google analitics here
   // node.type: 'application/json'
   // type for other nodes not defined
   if (node.type && node.type === 'application/json') return;
   switch (node.nodeType) {
      case Node.ELEMENT_NODE:
         node.childNodes.forEach(n => replaceText(n, replacements));
         break;
      case Node.TEXT_NODE: {
         let text = node.textContent;
         if (!text.trim()) break;
         // console.log(node.nodeType, node.nodeValue)
         let new_text = make_replacements(text, replacements);
         if (text != new_text) {
            node.textContent = new_text;
            // console.log(new_text);
         }
         break;
      }
      case Node.DOCUMENT_NODE:
         node.childNodes.forEach(n => replaceText(n, replacements));
   }
}

function get_random(list) {
   return list[Math.floor((Math.random() * list.length))];
}

function make_replacements(text, replacements) {
   var are_letters_inserted = false;
   if (config.traditional_to_simple_chinese) {
      text = t2s(text);
   }
   for (let [regex, replacement] of replacements) {
      if (replacement instanceof Array) {
         replacement = get_random(replacement);
      }
      let not_glyph_letter_in_replacement = isLetter(replacement.charAt(0)) || isLetter(replacement.slice(-1));
      if (are_letters_inserted && not_glyph_letter_in_replacement) {
         text = replaceAllRespectSpaces(text, regex, replacement);
      } else {
         var new_text = text.replaceAll(regex, replacement);
         if (!are_letters_inserted && new_text != text && not_glyph_letter_in_replacement) {
            are_letters_inserted = true;
         }
         text = new_text;
      }
   }
   return text;
}

// prepareRegex by JoeSimmons
// used to take a string and ready it for use in new RegExp()
function prepareRegex(string) {
   // escape: []^&$.()?/\+{}|
   string = string.replace(/([\[\]\^\&\$\.\(\)\?\/\\\+\{\}\|])/g, '\\$1');
   // '*' -> '[^ ]*', but '\*' -> '*'
   string = string.replace(/\\?\*/g, function (fullMatch) {
      return fullMatch === '\\*' ? '*' : '[^ ]*';
   });
   return string;
}

function getRegFromString(string) {
   var a = string.split("/");
   let modifiers = a.pop();
   a.shift();
   let pattern = a.join("/");
   if (!modifiers.includes('g')) {
      modifiers += 'g';
   }
   // console.log(`pattern: ${pattern}, modifiers: ${modifiers}`)
   return new RegExp(pattern, modifiers);
}

const rIsRegexp = /^\/(.+)\/(\w+)?$/;
function tokenToRegex(string, is_prepared = false) {
   if (config.traditional_to_simple_chinese) {
      string = t2s(string);
   }
   if (string.match(rIsRegexp)) {
      // console.log(`user_regexp: ${string}`)
      return getRegFromString(string);
   }
   if (is_prepared) {
      string = prepareRegex(string);
      return new RegExp(string);
   }
   return string;
}

function isLetter(c) {
   return c.toLowerCase() != c.toUpperCase();
}

function is_space_required(text, index) {
   if (index == 0) { return false; }
   if (!isLetter(text.charAt(index - 1))) { return false; }
   return true;
}

function replaceAllRespectSpaces(text, re, replacement) {
   if (!isLetter(replacement.charAt(0))) { return text; }
   if (typeof re === 'string' || re instanceof String) {
      re = new RegExp(re);
   } else if (re instanceof RegExp && re.global) {
      re = new RegExp(re.source, re.flags.replace('g', ''));
   }
   var match;
   while (match = re.exec(text)) {
      if (is_space_required(text, match.index)) {
         text = text.replace(match, " " + replacement);
      } else {
         text = text.replace(match, replacement);
      }
   }
   return text;
}

// https://github.com/jyt0532/ChineseConverter/blob/master/transform.js
// added more hieroglyphs to t2sArray from issue
// added rIsChinese, change replacement to text.replace
const t2sArray = { "梦": "梦", "缘": "缘", "丢": "丢", "并": "并", "采": "采", "乱": "乱", "亘": "亘", "亚": "亚", "亸": "亸", "来": "来", "仑": "仑", "侣": "侣", "俣": "俣", "侠": "侠", "伥": "伥", "俩": "俩", "仓": "仓", "个": "个", "们": "们", "伦": "伦", "伟": "伟", "侧": "侧", "侦": "侦", "伪": "伪", "杰": "杰", "伧": "伧", "伞": "伞", "备": "备", "佣": "佣", "传": "传", "伛": "伛", "债": "债", "伤": "伤", "倾": "倾", "偻": "偻", "仅": "仅", "佥": "佥", "侨": "侨", "仆": "仆", "侥": "侥", "偾": "偾", "雇": "雇", "价": "价", "仪": "仪", "侬": "侬", "亿": "亿", "当": "当", "侩": "侩", "俭": "俭", "傧": "傧", "俦": "俦", "侪": "侪", "尽": "尽", "偿": "偿", "优": "优", "储": "储", "俪": "俪", "罗": "罗", "攒": "攒", "傩": "傩", "傥": "傥", "俨": "俨", "凶": "凶", "兑": "兑", "儿": "儿", "兖": "兖", "内": "内", "两": "两", "册": "册", "涂": "涂", "冻": "冻", "凛": "凛", "渎": "渎", "处": "处", "凯": "凯", "凭": "凭", "别": "别", "删": "删", "刬": "刬", "刭": "刭", "则": "则", "刚": "刚", "剥": "剥", "剐": "剐", "剀": "剀", "创": "创", "铲": "铲", "划": "划", "剧": "剧", "刘": "刘", "刽": "刽", "刿": "刿", "剑": "剑", "剂": "剂", "劲": "劲", "动": "动", "务": "务", "勚": "勚", "勋": "勋", "胜": "胜", "劳": "劳", "势": "势", "绩": "绩", "劢": "劢", "励": "励", "劝": "劝", "匀": "匀", "匦": "匦", "汇": "汇", "匮": "匮", "奁": "奁", "椟": "椟", "区": "区", "协": "协", "却": "却", "厍": "厍", "厅": "厅", "厕": "厕", "厌": "厌", "厂": "厂", "厉": "厉", "厣": "厣", "参": "参", "叆": "叆", "叇": "叇", "丛": "丛", "吴": "吴", "吕": "吕", "呙": "呙", "员": "员", "呗": "呗", "吣": "吣", "唝": "唝", "唡": "唡", "问": "问", "启": "启", "哑": "哑", "衔": "衔", "啰": "啰", "啴": "啴", "唤": "唤", "丧": "丧", "乔": "乔", "单": "单", "哟": "哟", "呛": "呛", "啬": "啬", "吗": "吗", "呜": "呜", "唢": "唢", "哔": "哔", "叹": "叹", "喽": "喽", "呕": "呕", "啧": "啧", "尝": "尝", "唛": "唛", "哗": "哗", "唠": "唠", "啸": "啸", "叽": "叽", "哓": "哓", "呒": "呒", "咴": "咴", "嘘": "嘘", "咝": "咝", "哒": "哒", "哝": "哝", "哕": "哕", "嗳": "嗳", "哙": "哙", "喷": "喷", "吨": "吨", "咛": "咛", "吓": "吓", "哜": "哜", "噜": "噜", "啮": "啮", "呖": "呖", "咙": "咙", "响": "响", "喾": "喾", "严": "严", "嘤": "嘤", "啭": "啭", "嗫": "嗫", "冁": "冁", "呓": "呓", "苏": "苏", "嘱": "嘱", "国": "国", "囵": "囵", "围": "围", "园": "园", "圆": "圆", "图": "图", "团": "团", "垧": "垧", "垯": "垯", "垱": "垱", "埯": "埯", "坝": "坝", "垭": "垭", "执": "执", "坚": "坚", "垩": "垩", "垴": "垴", "埚": "埚", "阶": "阶", "尧": "尧", "报": "报", "场": "场", "塆": "塆", "块": "块", "茔": "茔", "垲": "垲", "埘": "埘", "坞": "坞", "埙": "埙", "尘": "尘", "堑": "堑", "砖": "砖", "垫": "垫", "坠": "坠", "硗": "硗", "堕": "堕", "坛": "坛", "坟": "坟", "墙": "墙", "垦": "垦", "压": "压", "垒": "垒", "圹": "圹", "垆": "垆", "坏": "坏", "垄": "垄", "坜": "坜", "壮": "壮", "壸": "壸", "壶": "壶", "寿": "寿", "够": "够", "夹": "夹", "奂": "奂", "奥": "奥", "夺": "夺", "奋": "奋", "妆": "妆", "姗": "姗", "奸": "奸", "侄": "侄", "娱": "娱", "妩": "妩", "娄": "娄", "妇": "妇", "娅": "娅", "婳": "婳", "娲": "娲", "妫": "妫", "媪": "媪", "妈": "妈", "袅": "袅", "妪": "妪", "娴": "娴", "娆": "娆", "婵": "婵", "娇": "娇", "嫱": "嫱", "嫒": "嫒", "嬷": "嬷", "嫔": "嫔", "婴": "婴", "婶": "婶", "懒": "懒", "娈": "娈", "孙": "孙", "学": "学", "孪": "孪", "宫": "宫", "寝": "寝", "实": "实", "宁": "宁", "审": "审", "写": "写", "宽": "宽", "宠": "宠", "宝": "宝", "将": "将", "专": "专", "寻": "寻", "对": "对", "导": "导", "尴": "尴", "屃": "屃", "届": "届", "尸": "尸", "屉": "屉", "屡": "屡", "层": "层", "屦": "屦", "属": "属", "冈": "冈", "峃": "峃", "峣": "峣", "岘": "岘", "岛": "岛", "峡": "峡", "崄": "崄", "崃": "崃", "岗": "岗", "岽": "岽", "峥": "峥", "嵛": "嵛", "岚": "岚", "岁": "岁", "嵚": "嵚", "嵝": "嵝", "崭": "崭", "岖": "岖", "崂": "崂", "峤": "峤", "峄": "峄", "岙": "岙", "嵘": "嵘", "岭": "岭", "屿": "屿", "岿": "岿", "峦": "峦", "巅": "巅", "巯": "巯", "卺": "卺", "帅": "帅", "师": "师", "帐": "帐", "带": "带", "帧": "帧", "帏": "帏", "帼": "帼", "帻": "帻", "帜": "帜", "币": "币", "帮": "帮", "帱": "帱", "襕": "襕", "干": "干", "几": "几", "库": "库", "庼": "庼", "厢": "厢", "厦": "厦", "荫": "荫", "厨": "厨", "厮": "厮", "庙": "庙", "庑": "庑", "废": "废", "广": "广", "廪": "廪", "庐": "庐", "弪": "弪", "张": "张", "强": "强", "弹": "弹", "弥": "弥", "弯": "弯", "彟": "彟", "彦": "彦", "雕": "雕", "径": "径", "从": "从", "徕": "徕", "复": "复", "征": "征", "彻": "彻", "恒": "恒", "悦": "悦", "怅": "怅", "闷": "闷", "凄": "凄", "恼": "恼", "恽": "恽", "恻": "恻", "爱": "爱", "惬": "惬", "悫": "悫", "怆": "怆", "恺": "恺", "忾": "忾", "态": "态", "愠": "愠", "惨": "惨", "惭": "惭", "恸": "恸", "惯": "惯", "怄": "怄", "怂": "怂", "慭": "慭", "虑": "虑", "悭": "悭", "慑": "慑", "庆": "庆", "忧": "忧", "惫": "惫", "怜": "怜", "愦": "愦", "惮": "惮", "愤": "愤", "悯": "悯", "怃": "怃", "宪": "宪", "忆": "忆", "恳": "恳", "应": "应", "怿": "怿", "懔": "懔", "恹": "恹", "怼": "怼", "懑": "懑", "惩": "惩", "怀": "怀", "悬": "悬", "忏": "忏", "惧": "惧", "欢": "欢", "恋": "恋", "戆": "戆", "戋": "戋", "戗": "戗", "戬": "戬", "戏": "戏", "战": "战", "户": "户", "抛": "抛", "挜": "挜", "挦": "挦", "挟": "挟", "扪": "扪", "扫": "扫", "抡": "抡", "挣": "挣", "挂": "挂", "拣": "拣", "扬": "扬", "换": "换", "挥": "挥", "构": "构", "揿": "揿", "损": "损", "摇": "摇", "捣": "捣", "抢": "抢", "掴": "掴", "掼": "掼", "搂": "搂", "挚": "挚", "抠": "抠", "抟": "抟", "掺": "掺", "捞": "捞", "撑": "撑", "挠": "挠", "挢": "挢", "掸": "掸", "拨": "拨", "抚": "抚", "扑": "扑", "挞": "挞", "挝": "挝", "捡": "捡", "拥": "拥", "掳": "掳", "择": "择", "击": "击", "挡": "挡", "担": "担", "携": "携", "据": "据", "挤": "挤", "举": "举", "拟": "拟", "摈": "摈", "拧": "拧", "搁": "搁", "掷": "掷", "扩": "扩", "撷": "撷", "摆": "摆", "擞": "擞", "撸": "撸", "扰": "扰", "摅": "摅", "撵": "撵", "拢": "拢", "拦": "拦", "撄": "撄", "搀": "搀", "撺": "撺", "摄": "摄", "挛": "挛", "摊": "摊", "搅": "搅", "揽": "揽", "叙": "叙", "败": "败", "敌": "敌", "数": "数", "驱": "驱", "敛": "敛", "毙": "毙", "斓": "斓", "斩": "斩", "断": "断", "旸": "旸", "昽": "昽", "时": "时", "晋": "晋", "昼": "昼", "晕": "晕", "晖": "晖", "畅": "畅", "暂": "暂", "昵": "昵", "晔": "晔", "昙": "昙", "晓": "晓", "暧": "暧", "旷": "旷", "叠": "叠", "晒": "晒", "书": "书", "会": "会", "胧": "胧", "东": "东", "栅": "栅", "杆": "杆", "栀": "栀", "枧": "枧", "条": "条", "枭": "枭", "梼": "梼", "梾": "梾", "弃": "弃", "枨": "枨", "枣": "枣", "栋": "栋", "栈": "栈", "桊": "桊", "栖": "栖", "桠": "桠", "杨": "杨", "枫": "枫", "桢": "桢", "业": "业", "极": "极", "杩": "杩", "荣": "荣", "桤": "桤", "盘": "盘", "枪": "枪", "杠": "杠", "槚": "槚", "椠": "椠", "椁": "椁", "桨": "桨", "规": "规", "桩": "桩", "乐": "乐", "枞": "枞", "楼": "楼", "标": "标", "枢": "枢", "样": "样", "朴": "朴", "树": "树", "桦": "桦", "桡": "桡", "桥": "桥", "机": "机", "椭": "椭", "横": "横", "槔": "槔", "檩": "檩", "柽": "柽", "档": "档", "桧": "桧", "检": "检", "樯": "樯", "槟": "槟", "柠": "柠", "槛": "槛", "苘": "苘", "柜": "柜", "橹": "橹", "榈": "榈", "栉": "栉", "橼": "橼", "栎": "栎", "橱": "橱", "槠": "槠", "栌": "栌", "枥": "枥", "橥": "橥", "榇": "榇", "栊": "栊", "榉": "榉", "棂": "棂", "樱": "樱", "栏": "栏", "权": "权", "椤": "椤", "栾": "栾", "榄": "榄", "钦": "钦", "欧": "欧", "欤": "欤", "归": "归", "殁": "殁", "残": "残", "殒": "殒", "殇": "殇", "殚": "殚", "殓": "殓", "殡": "殡", "歼": "歼", "杀": "杀", "壳": "壳", "毁": "毁", "殴": "殴", "医": "医", "绒": "绒", "毵": "毵", "牦": "牦", "毡": "毡", "氇": "氇", "气": "气", "氢": "氢", "氩": "氩", "氲": "氲", "凼": "凼", "决": "决", "冱": "冱", "没": "没", "冲": "冲", "沨": "沨", "沵": "沵", "况": "况", "泄": "泄", "汹": "汹", "浉": "浉", "浐": "浐", "浕": "浕", "浃": "浃", "泾": "泾", "涢": "涢", "凉": "凉", "泪": "泪", "渌": "渌", "净": "净", "凌": "凌", "沦": "沦", "渊": "渊", "涞": "涞", "浅": "浅", "涣": "涣", "减": "减", "涡": "涡", "测": "测", "浑": "浑", "凑": "凑", "浈": "浈", "愍": "愍", "涌": "涌", "汤": "汤", "溇": "溇", "沩": "沩", "准": "准", "沟": "沟", "温": "温", "湿": "湿", "沧": "沧", "灭": "灭", "涤": "涤", "荥": "荥", "滪": "滪", "沪": "沪", "滞": "滞", "渗": "渗", "卤": "卤", "浒": "浒", "滚": "滚", "满": "满", "渔": "渔", "沤": "沤", "汉": "汉", "涟": "涟", "渍": "渍", "涨": "涨", "溆": "溆", "渐": "渐", "浆": "浆", "颍": "颍", "泼": "泼", "洁": "洁", "潜": "潜", "润": "润", "浔": "浔", "溃": "溃", "滗": "滗", "涠": "涠", "涩": "涩", "浇": "浇", "涝": "涝", "涧": "涧", "渑": "渑", "泽": "泽", "泶": "泶", "浍": "浍", "淀": "淀", "浊": "浊", "浓": "浓", "泞": "泞", "济": "济", "涛": "涛", "滥": "滥", "潍": "潍", "滨": "滨", "阔": "阔", "溅": "溅", "泺": "泺", "滤": "滤", "滢": "滢", "泻": "泻", "渖": "渖", "浏": "浏", "濒": "濒", "泸": "泸", "沥": "沥", "潇": "潇", "潆": "潆", "潴": "潴", "泷": "泷", "濑": "濑", "潋": "潋", "澜": "澜", "沣": "沣", "滠": "滠", "洒": "洒", "漓": "漓", "滩": "滩", "灏": "灏", "湾": "湾", "滦": "滦", "滟": "滟", "灾": "灾", "为": "为", "乌": "乌", "烃": "烃", "无": "无", "煅": "煅", "辉": "辉", "炼": "炼", "炜": "炜", "烟": "烟", "茕": "茕", "焕": "焕", "烦": "烦", "炀": "炀", "荧": "荧", "炝": "炝", "热": "热", "颎": "颎", "炽": "炽", "烨": "烨", "焰": "焰", "灯": "灯", "炖": "炖", "烧": "烧", "烫": "烫", "焖": "焖", "营": "营", "灿": "灿", "烛": "烛", "烩": "烩", "熏": "熏", "烬": "烬", "焘": "焘", "耀": "耀", "烁": "烁", "炉": "炉", "烂": "烂", "争": "争", "爷": "爷", "尔": "尔", "床": "床", "笺": "笺", "闸": "闸", "牍": "牍", "牵": "牵", "荦": "荦", "犊": "犊", "牺": "牺", "状": "状", "狝": "狝", "狭": "狭", "狈": "狈", "狰": "狰", "犹": "犹", "狲": "狲", "犸": "犸", "呆": "呆", "狱": "狱", "狮": "狮", "奖": "奖", "独": "独", "狯": "狯", "猃": "猃", "狞": "狞", "获": "获", "猎": "猎", "犷": "犷", "兽": "兽", "獭": "獭", "献": "献", "猕": "猕", "猡": "猡", "兹": "兹", "玙": "玙", "玚": "玚", "珏": "珏", "玱": "玱", "珰": "珰", "现": "现", "琎": "琎", "珲": "珲", "珉": "珉", "玮": "玮", "琐": "琐", "瑶": "瑶", "莹": "莹", "玛": "玛", "琏": "琏", "玑": "玑", "瑷": "瑷", "环": "环", "玺": "玺", "琼": "琼", "珑": "珑", "璎": "璎", "瓒": "瓒", "瓯": "瓯", "罂": "罂", "产": "产", "亩": "亩", "毕": "毕", "画": "画", "异": "异", "畴": "畴", "痉": "痉", "痖": "痖", "瘆": "瘆", "疯": "疯", "疡": "疡", "痪": "痪", "瘗": "瘗", "疮": "疮", "疟": "疟", "瘘": "瘘", "疗": "疗", "痨": "痨", "痫": "痫", "瘅": "瘅", "疠": "疠", "瘪": "瘪", "痴": "痴", "痒": "痒", "疖": "疖", "症": "症", "疬": "疬", "癞": "癞", "癣": "癣", "瘿": "瘿", "瘾": "瘾", "痈": "痈", "瘫": "瘫", "癫": "癫", "发": "发", "皑": "皑", "皲": "皲", "皱": "皱", "蔼": "蔼", "碍": "碍", "袄": "袄", "罢": "罢", "颁": "颁", "办": "办", "绊": "绊", "绑": "绑", "镑": "镑", "谤": "谤", "盗": "盗", "盏": "盏", "监": "监", "卢": "卢", "荡": "荡", "视": "视", "眬": "眬", "众": "众", "睁": "睁", "饱": "饱", "鲍": "鲍", "辈": "辈", "贝": "贝", "钡": "钡", "绷": "绷", "笔": "笔", "闭": "闭", "边": "边", "编": "编", "贬": "贬", "变": "变", "辩": "辩", "辫": "辫", "鳖": "鳖", "宾": "宾", "饼": "饼", "睐": "睐", "眍": "眍", "瞒": "瞒", "睑": "睑", "瞩": "瞩", "钵": "钵", "铂": "铂", "驳": "驳", "补": "补", "财": "财", "蚕": "蚕", "苍": "苍", "舱": "舱", "诧": "诧", "蝉": "蝉", "馋": "馋", "谗": "谗", "缠": "缠", "阐": "阐", "颤": "颤", "矫": "矫", "硁": "硁", "硙": "硙", "硚": "硚", "硖": "硖", "砗": "砗", "砚": "砚", "碜": "碜", "长": "长", "肠": "肠", "钞": "钞", "车": "车", "陈": "陈", "衬": "衬", "称": "称", "诚": "诚", "骋": "骋", "迟": "迟", "驰": "驰", "齿": "齿", "虫": "虫", "踌": "踌", "筹": "筹", "绸": "绸", "丑": "丑", "锄": "锄", "雏": "雏", "硕": "硕", "砀": "砀", "砜": "砜", "确": "确", "码": "码", "碛": "碛", "矶": "矶", "础": "础", "触": "触", "闯": "闯", "锤": "锤", "纯": "纯", "绰": "绰", "辞": "辞", "词": "词", "赐": "赐", "聪": "聪", "葱": "葱", "蹿": "蹿", "窜": "窜", "错": "错", "达": "达", "贷": "贷", "矿": "矿", "砺": "砺", "砾": "砾", "矾": "矾", "砻": "砻", "祎": "祎", "禄": "禄", "祸": "祸", "祯": "祯", "郸": "郸", "胆": "胆", "诞": "诞", "党": "党", "祷": "祷", "邓": "邓", "递": "递", "缔": "缔", "颠": "颠", "点": "点", "电": "电", "钓": "钓", "调": "调", "谍": "谍", "御": "御", "禅": "禅", "礼": "礼", "祢": "祢", "秃": "秃", "秾": "秾", "税": "税", "秆": "秆", "棱": "棱", "钉": "钉", "顶": "顶", "锭": "锭", "订": "订", "斗": "斗", "读": "读", "赌": "赌", "镀": "镀", "锻": "锻", "缎": "缎", "队": "队", "顿": "顿", "钝": "钝", "鹅": "鹅", "额": "额", "讹": "讹", "饿": "饿", "饵": "饵", "禀": "禀", "种": "种", "谷": "谷", "稣": "稣", "积": "积", "颖": "颖", "穑": "穑", "秽": "秽", "颓": "颓", "稳": "稳", "稆": "稆", "贰": "贰", "罚": "罚", "阀": "阀", "钒": "钒", "范": "范", "贩": "贩", "饭": "饭", "访": "访", "纺": "纺", "飞": "飞", "诽": "诽", "费": "费", "纷": "纷", "粪": "粪", "丰": "丰", "锋": "锋", "风": "风", "冯": "冯", "缝": "缝", "讽": "讽", "凤": "凤", "肤": "肤", "辐": "辐", "窝": "窝", "洼": "洼", "穷": "穷", "窑": "窑", "窭": "窭", "窥": "窥", "窍": "窍", "窦": "窦", "窃": "窃", "竖": "竖", "竞": "竞", "辅": "辅", "赋": "赋", "负": "负", "讣": "讣", "缚": "缚", "该": "该", "钙": "钙", "盖": "盖", "赶": "赶", "赣": "赣", "钢": "钢", "纲": "纲", "镐": "镐", "鸽": "鸽", "阁": "阁", "铬": "铬", "给": "给", "笋": "笋", "筜": "筜", "笕": "笕", "筝": "筝", "箓": "箓", "节": "节", "龚": "龚", "巩": "巩", "贡": "贡", "钩": "钩", "购": "购", "蛊": "蛊", "顾": "顾", "关": "关", "观": "观", "馆": "馆", "贯": "贯", "龟": "龟", "闺": "闺", "轨": "轨", "诡": "诡", "贵": "贵", "辊": "辊", "锅": "锅", "过": "过", "筑": "筑", "箧": "箧", "筱": "筱", "笃": "笃", "筛": "筛", "筚": "筚", "箦": "箦", "篓": "篓", "蓑": "蓑", "箪": "箪", "简": "简", "篑": "篑", "箫": "箫", "檐": "檐", "签": "签", "帘": "帘", "骇": "骇", "韩": "韩", "号": "号", "阂": "阂", "鹤": "鹤", "贺": "贺", "轰": "轰", "鸿": "鸿", "红": "红", "后": "后", "篮": "篮", "藤": "藤", "箨": "箨", "籁": "籁", "笼": "笼", "钥": "钥", "笾": "笾", "簖": "簖", "篱": "篱", "箩": "箩", "吁": "吁", "粤": "粤", "护": "护", "华": "华", "话": "话", "还": "还", "缓": "缓", "黄": "黄", "谎": "谎", "贿": "贿", "讳": "讳", "诲": "诲", "绘": "绘", "荤": "荤", "伙": "伙", "货": "货", "糁": "糁", "模": "模", "粮": "粮", "粝": "粝", "籴": "籴", "粜": "粜", "纠": "纠", "纪": "纪", "纣": "纣", "约": "约", "纡": "纡", "纥": "纥", "纨": "纨", "纫": "纫", "纹": "纹", "纳": "纳", "纽": "纽", "纾": "纾", "纰": "纰", "纼": "纼", "纱": "纱", "纮": "纮", "纸": "纸", "级": "级", "纭": "纭", "纴": "纴", "细": "细", "绂": "绂", "绁": "绁", "绅": "绅", "纻": "纻", "饥": "饥", "迹": "迹", "讥": "讥", "鸡": "鸡", "缉": "缉", "辑": "辑", "蓟": "蓟", "计": "计", "记": "记", "际": "际", "继": "继", "荚": "荚", "颊": "颊", "贾": "贾", "钾": "钾", "驾": "驾", "间": "间", "艰": "艰", "缄": "缄", "茧": "茧", "荐": "荐", "鉴": "鉴", "践": "践", "贱": "贱", "见": "见", "键": "键", "绍": "绍", "绀": "绀", "绋": "绋", "绐": "绐", "绌": "绌", "终": "终", "组": "组", "绗": "绗", "结": "结", "绝": "绝", "绦": "绦", "绔": "绔", "绞": "绞", "络": "络", "绚": "绚", "绖": "绖", "统": "统", "丝": "丝", "绛": "绛", "绢": "绢", "绡": "绡", "绠": "绠", "绨": "绨", "绣": "绣", "绤": "绤", "绥": "绥", "经": "经", "舰": "舰", "饯": "饯", "蒋": "蒋", "讲": "讲", "酱": "酱", "胶": "胶", "骄": "骄", "铰": "铰", "脚": "脚", "饺": "饺", "缴": "缴", "轿": "轿", "较": "较", "诫": "诫", "紧": "紧", "锦": "锦", "谨": "谨", "进": "进", "综": "综", "缍": "缍", "绿": "绿", "绻": "绻", "绶": "绶", "维": "维", "绹": "绹", "绾": "绾", "网": "网", "缀": "缀", "纶": "纶", "绺": "绺", "绮": "绮", "绽": "绽", "绫": "绫", "绵": "绵", "绲": "绲", "缁": "缁", "绯": "绯", "缗": "缗", "绪": "绪", "绬": "绬", "绱": "绱", "缃": "缃", "缂": "缂", "缌": "缌", "缅": "缅", "纬": "纬", "缑": "缑", "缈": "缈", "练": "练", "缏": "缏", "缇": "缇", "荆": "荆", "茎": "茎", "鲸": "鲸", "惊": "惊", "颈": "颈", "静": "静", "镜": "镜", "旧": "旧", "驹": "驹", "锯": "锯", "鹃": "鹃", "觉": "觉", "诀": "诀", "钧": "钧", "军": "军", "缊": "缊", "总": "总", "萦": "萦", "缙": "缙", "缢": "缢", "缒": "缒", "绉": "绉", "缣": "缣", "缞": "缞", "缜": "缜", "缟": "缟", "缛": "缛", "县": "县", "缡": "缡", "缩": "缩", "纵": "纵", "缧": "缧", "纤": "纤", "缦": "缦", "絷": "絷", "缕": "缕", "缥": "缥", "缫": "缫", "缪": "缪", "襁": "襁", "缯": "缯", "织": "织", "缮": "缮", "缭": "缭", "骏": "骏", "开": "开", "颗": "颗", "课": "课", "裤": "裤", "夸": "夸", "亏": "亏", "绕": "绕", "缋": "缋", "绳": "绳", "缰": "缰", "缳": "缳", "缲": "缲", "绎": "绎", "缤": "缤", "缱": "缱", "颣": "颣", "缬": "缬", "纩": "纩", "续": "续", "缨": "缨", "缵": "缵", "缆": "缆", "馈": "馈", "蜡": "蜡", "腊": "腊", "莱": "莱", "赖": "赖", "蓝": "蓝", "阑": "阑", "兰": "兰", "谰": "谰", "览": "览", "镭": "镭", "类": "类", "离": "离", "鲤": "鲤", "丽": "丽", "骂": "骂", "罴": "罴", "羁": "羁", "芈": "芈", "羟": "羟", "羡": "羡", "义": "义", "习": "习", "翙": "翙", "翚": "翚", "隶": "隶", "联": "联", "莲": "莲", "连": "连", "镰": "镰", "脸": "脸", "链": "链", "辆": "辆", "谅": "谅", "辽": "辽", "镣": "镣", "临": "临", "邻": "邻", "鳞": "鳞", "赁": "赁", "龄": "龄", "铃": "铃", "灵": "灵", "领": "领", "馏": "馏", "龙": "龙", "聋": "聋", "翘": "翘", "翱": "翱", "耧": "耧", "耢": "耢", "圣": "圣", "闻": "闻", "声": "声", "耸": "耸", "聩": "聩", "聂": "聂", "职": "职", "聍": "聍", "听": "听", "陇": "陇", "芦": "芦", "颅": "颅", "虏": "虏", "鲁": "鲁", "赂": "赂", "录": "录", "陆": "陆", "驴": "驴", "铝": "铝", "轮": "轮", "论": "论", "萝": "萝", "逻": "逻", "锣": "锣", "骡": "骡", "骆": "骆", "蚂": "蚂", "马": "马", "买": "买", "麦": "麦", "卖": "卖", "迈": "迈", "脉": "脉", "馒": "馒", "蛮": "蛮", "肃": "肃", "胁": "胁", "胫": "胫", "脱": "脱", "胀": "胀", "谩": "谩", "猫": "猫", "锚": "锚", "铆": "铆", "贸": "贸", "么": "么", "镁": "镁", "门": "门", "锰": "锰", "谜": "谜", "觅": "觅", "闽": "闽", "鸣": "鸣", "铭": "铭", "谬": "谬", "肾": "肾", "胨": "胨", "腘": "腘", "脶": "脶", "脑": "脑", "肿": "肿", "肷": "肷", "腽": "腽", "腻": "腻", "脍": "脍", "脓": "脓", "脐": "脐", "膑": "膑", "癯": "癯", "谋": "谋", "钠": "钠", "难": "难", "闹": "闹", "馁": "馁", "酿": "酿", "鸟": "鸟", "镊": "镊", "镍": "镍", "胪": "胪", "臜": "臜", "脏": "脏", "脔": "脔", "卧": "卧", "皋": "皋", "与": "与", "兴": "兴", "铺": "铺", "舣": "舣", "钮": "钮", "农": "农", "诺": "诺", "鸥": "鸥", "庞": "庞", "赔": "赔", "鹏": "鹏", "舻": "舻", "艳": "艳", "艹": "艹", "刍": "刍", "苎": "苎", "骗": "骗", "飘": "飘", "频": "频", "贫": "贫", "苹": "苹", "评": "评", "颇": "颇", "谱": "谱", "齐": "齐", "骑": "骑", "岂": "岂", "讫": "讫", "荙": "荙", "庄": "庄", "苋": "苋", "钎": "钎", "铅": "铅", "迁": "迁", "谦": "谦", "钱": "钱", "钳": "钳", "谴": "谴", "蔷": "蔷", "锹": "锹", "亲": "亲", "轻": "轻", "顷": "顷", "请": "请", "趋": "趋", "躯": "躯", "苌": "苌", "萚": "萚", "万": "万", "莴": "莴", "叶": "叶", "荭": "荭", "荮": "荮", "苇": "苇", "药": "药", "龋": "龋", "颧": "颧", "鹊": "鹊", "让": "让", "饶": "饶", "韧": "韧", "认": "认", "软": "软", "锐": "锐", "闰": "闰", "萨": "萨", "鳃": "鳃", "赛": "赛", "莼": "莼", "莳": "莳", "荪": "荪", "莜": "莜", "苁": "苁", "荜": "荜", "骚": "骚", "闪": "闪", "陕": "陕", "赡": "赡", "赏": "赏", "赊": "赊", "设": "设", "蒌": "蒌", "茑": "茑", "荨": "荨", "蒇": "蒇", "荞": "荞", "荬": "荬", "芸": "芸", "莸": "莸", "荛": "荛", "蒉": "蒉", "芜": "芜", "萧": "萧", "蓣": "蓣", "诗": "诗", "蚀": "蚀", "识": "识", "驶": "驶", "适": "适", "释": "释", "饰": "饰", "试": "试", "输": "输", "赎": "赎", "术": "术", "荟": "荟", "芗": "芗", "姜": "姜", "莶": "莶", "荠": "荠", "荩": "荩", "艺": "艺", "薮": "薮", "苈": "苈", "双": "双", "谁": "谁", "顺": "顺", "说": "说", "饲": "饲", "颂": "颂", "讼": "讼", "诵": "诵", "诉": "诉", "虽": "虽", "随": "随", "锁": "锁", "蔺": "蔺", "蕲": "蕲", "蕴": "蕴", "藓": "藓", "蔹": "蔹", "茏": "茏", "蓠": "蓠", "虚": "虚", "贪": "贪", "谭": "谭", "谈": "谈", "讨": "讨", "腾": "腾", "誊": "誊", "锑": "锑", "题": "题", "体": "体", "贴": "贴", "铁": "铁", "蛱": "蛱", "蜕": "蜕", "蚬": "蚬", "铜": "铜", "头": "头", "鸵": "鸵", "驮": "驮", "驼": "驼", "袜": "袜", "顽": "顽", "猬": "猬", "虾": "虾", "虱": "虱", "蜗": "蜗", "螀": "螀", "蛳": "蛳", "蚁": "蚁", "萤": "萤", "韦": "韦", "违": "违", "谓": "谓", "卫": "卫", "钨": "钨", "诬": "诬", "雾": "雾", "误": "误", "锡": "锡", "蝼": "蝼", "蛰": "蛰", "蝈": "蝈", "螨": "螨", "蟏": "蟏", "虮": "虮", "蛲": "蛲", "蛏": "蛏", "蝇": "蝇", "虿": "虿", "蝎": "蝎", "蛴": "蛴", "蝾": "蝾", "蛎": "蛎", "袭": "袭", "铣": "铣", "辖": "辖", "锨": "锨", "鲜": "鲜", "咸": "咸", "贤": "贤", "闲": "闲", "显": "显", "险": "险", "馅": "馅", "镶": "镶", "乡": "乡", "详": "详", "响": "响", "项": "项", "销": "销", "蔑": "蔑", "袆": "袆", "衮": "衮", "谐": "谐", "谢": "谢", "锌": "锌", "衅": "衅", "锈": "锈", "须": "须", "许": "许", "轩": "轩", "袯": "袯", "裈": "裈", "装": "装", "裢": "裢", "选": "选", "询": "询", "驯": "驯", "训": "训", "讯": "讯", "逊": "逊", "鸦": "鸦", "鸭": "鸭", "讶": "讶", "阉": "阉", "盐": "盐", "颜": "颜", "阎": "阎", "谚": "谚", "验": "验", "鸯": "鸯", "阳": "阳", "养": "养", "褛": "褛", "亵": "亵", "幞": "幞", "裥": "裥", "杂": "杂", "裣": "裣", "裆": "裆", "褴": "褴", "觃": "觃", "觇": "觇", "觋": "觋", "遥": "遥", "谣": "谣", "页": "页", "铱": "铱", "颐": "颐", "遗": "遗", "诣": "诣", "议": "议", "谊": "谊", "译": "译", "阴": "阴", "银": "银", "饮": "饮", "隐": "隐", "觍": "觍", "觎": "觎", "觊": "觊", "觏": "觏", "觑": "觑", "觐": "觐", "觌": "觌", "觞": "觞", "觯": "觯", "讠": "讠", "讧": "讧", "讦": "讦", "讱": "讱", "讪": "讪", "鹰": "鹰", "赢": "赢", "踊": "踊", "咏": "咏", "邮": "邮", "铀": "铀", "诱": "诱", "舆": "舆", "鱼": "鱼", "语": "语", "誉": "誉", "讷": "讷", "谌": "谌", "讻": "讻", "诃": "诃", "诊": "诊", "注": "注", "证": "证", "诂": "诂", "诋": "诋", "讵": "讵", "诈": "诈", "诒": "诒", "诏": "诏", "诐": "诐", "诇": "诇", "诎": "诎", "诅": "诅", "詟": "詟", "诩": "诩", "诟": "诟", "诠": "诠", "诘": "诘", "诜": "诜", "诙": "诙", "诖": "诖", "预": "预", "驭": "驭", "鸳": "鸳", "辕": "辕", "远": "远", "愿": "愿", "跃": "跃", "阅": "阅", "云": "云", "郧": "郧", "陨": "陨", "运": "运", "酝": "酝", "韵": "韵", "载": "载", "赞": "赞", "赃": "赃", "凿": "凿", "责": "责", "贼": "贼", "赠": "赠", "轧": "轧", "诔": "诔", "诛": "诛", "诓": "诓", "诳": "诳", "诶": "诶", "诮": "诮", "诰": "诰", "谇": "谇", "谄": "谄", "谆": "谆", "诿": "诿", "诤": "诤", "诹": "诹", "诼": "诼", "谂": "谂", "谀": "谀", "谞": "谞", "谝": "谝", "谥": "谥", "诨": "诨", "铡": "铡", "斋": "斋", "辗": "辗", "账": "账", "赵": "赵", "辙": "辙", "锗": "锗", "这": "这", "贞": "贞", "针": "针", "镇": "镇", "阵": "阵", "谔": "谔", "谛": "谛", "谏": "谏", "谕": "谕", "谙": "谙", "诸": "诸", "谖": "谖", "谒": "谒", "诌": "诌", "谧": "谧", "谑": "谑", "谡": "谡", "谟": "谟", "谪": "谪", "讴": "讴", "郑": "郑", "质": "质", "钟": "钟", "轴": "轴", "骤": "骤", "猪": "猪", "着": "着", "贮": "贮", "铸": "铸", "谲": "谲", "谮": "谮", "谯": "谯", "谵": "谵", "诪": "诪", "谫": "谫", "雠": "雠", "谶": "谶", "谠": "谠", "谳": "谳", "驻": "驻", "转": "转", "赚": "赚", "锥": "锥", "赘": "赘", "资": "资", "踪": "踪", "邹": "邹", "钻": "钻", "豮": "豮", "狸": "狸", "贠": "贠", "鼗": "鼗", "靥": "靥", "赝": "赝", "赜": "赜", "贳": "贳", "赀": "赀", "贶": "贶", "贻": "贻", "贲": "贲", "赅": "赅", "赈": "赈", "赇": "赇", "赒": "赒", "赉": "赉", "赓": "赓", "赕": "赕", "赍": "赍", "赆": "赆", "赗": "赗", "赙": "赙", "贽": "贽", "赟": "赟", "黉": "黉", "凫": "凫", "赑": "赑", "赪": "赪", "趱": "趱", "陉": "陉", "陧": "陧", "邝": "邝", "邬": "邬", "邺": "邺", "跶": "跶", "蜷": "蜷", "跄": "跄", "跸": "跸", "跖": "跖", "蹒": "蹒", "郏": "郏", "郐": "郐", "郄": "郄", "郓": "郓", "郦": "郦", "跷": "跷", "趸": "趸", "跻": "跻", "踯": "踯", "跞": "跞", "踬": "踬", "蹰": "蹰", "跹": "跹", "蹑": "蹑", "躜": "躜", "躏": "躏", "轪": "轪", "轫": "轫", "轭": "轭", "轷": "轷", "轸": "轸", "轱": "轱", "轵": "轵", "轺": "轺", "轲": "轲", "轶": "轶", "轼": "轼", "辂": "辂", "辁": "辁", "辀": "辀", "轾": "轾", "辄": "辄", "辎": "辎", "辋": "辋", "辍": "辍", "辇": "辇", "辌": "辌", "辏": "辏", "辒": "辒", "毂": "毂", "莺": "莺", "蓦": "蓦", "蓥": "蓥", "辘": "辘", "辚": "辚", "辔": "辔", "轹": "轹", "轳": "轳", "迩": "迩", "逦": "逦", "酦": "酦", "酾": "酾", "酽": "酽", "钆": "钆", "钇": "钇", "钌": "钌", "钊": "钊", "钋": "钋", "钐": "钐", "狍": "狍", "钏": "钏", "钗": "钗", "钍": "钍", "钕": "钕", "钯": "钯", "钫": "钫", "钘": "钘", "钭": "钭", "钚": "钚", "钤": "钤", "钣": "钣", "钑": "钑", "钬": "钬", "钛": "钛", "钪": "钪", "铌": "铌", "铈": "铈", "钶": "钶", "钴": "钴", "钹": "钹", "铍": "铍", "钰": "钰", "钸": "钸", "钿": "钿", "饧": "饧", "饨": "饨", "饩": "饩", "饪": "饪", "饫": "饫", "饬": "饬", "饴": "饴", "饷": "饷", "饽": "饽", "余": "余", "馄": "馄", "馇": "馇", "馊": "馊", "馍": "馍", "馐": "馐", "馑": "馑", "馓": "馓", "馔": "馔", "馕": "馕", "铊": "铊", "铉": "铉", "铋": "铋", "钷": "钷", "钺": "钺", "钲": "钲", "钼": "钼", "钽": "钽", "锎": "锎", "铏": "铏", "铒": "铒", "铪": "铪", "铳": "铳", "铚": "铚", "铨": "铨", "铢": "铢", "铫": "铫", "铦": "铦", "铑": "铑", "铷": "铷", "铟": "铟", "闩": "闩", "闫": "闫", "闱": "闱", "闳": "闳", "闵": "闵", "闶": "闶", "闼": "闼", "闾": "闾", "阃": "阃", "阄": "阄", "阆": "阆", "阈": "阈", "阊": "阊", "阋": "阋", "阌": "阌", "阍": "阍", "阏": "阏", "阒": "阒", "阕": "阕", "阖": "阖", "阗": "阗", "阙": "阙", "阚": "阚", "丬": "丬", "铵": "铵", "铥": "铥", "铕": "铕", "铯": "铯", "铐": "铐", "铞": "铞", "锉": "锉", "镅": "镅", "锒": "锒", "铤": "铤", "铗": "铗", "铻": "铻", "镯": "镯", "锊": "锊", "锓": "锓", "铘": "铘", "锃": "锃", "锔": "锔", "锇": "锇", "铓": "铓", "铖": "铖", "锆": "锆", "锂": "锂", "铽": "铽", "锍": "锍", "锞": "锞", "锖": "锖", "锫": "锫", "锩": "锩", "铔": "铔", "锕": "锕", "锟": "锟", "锱": "锱", "铮": "铮", "锛": "锛", "锬": "锬", "锜": "锜", "锠": "锠", "锢": "锢", "铼": "铼", "镎": "镎", "锝": "锝", "锪": "锪", "钔": "钔", "锴": "锴", "锳": "锳", "锷": "锷", "钖": "钖", "锽": "锽", "锸": "锸", "锲": "锲", "锘": "锘", "骞": "骞", "锾": "锾", "锶": "锶", "锿": "锿", "镕": "镕", "镉": "镉", "镈": "镈", "镃": "镃", "镏": "镏", "铠": "铠", "铩": "铩", "锼": "锼", "镒": "镒", "镋": "镋", "镓": "镓", "镌": "镌", "镞": "镞", "镟": "镟", "镆": "镆", "镙": "镙", "驵": "驵", "驷": "驷", "驸": "驸", "驺": "驺", "驿": "驿", "驽": "驽", "骀": "骀", "骁": "骁", "骅": "骅", "骈": "骈", "骊": "骊", "骐": "骐", "骒": "骒", "骓": "骓", "骖": "骖", "骘": "骘", "骛": "骛", "骜": "骜", "骝": "骝", "骟": "骟", "骠": "骠", "骢": "骢", "骣": "骣", "骥": "骥", "骧": "骧", "纟": "纟", "镠": "镠", "镝": "镝", "铿": "铿", "锵": "锵", "镗": "镗", "镘": "镘", "镛": "镛", "镖": "镖", "镂": "镂", "錾": "錾", "镚": "镚", "铧": "铧", "镤": "镤", "镪": "镪", "铙": "铙", "铴": "铴", "铹": "铹", "镦": "镦", "镡": "镡", "镫": "镫", "镢": "镢", "镨": "镨", "锏": "锏", "镄": "镄", "顼": "顼", "镮": "镮", "铎": "铎", "铛": "铛", "镱": "镱", "镬": "镬", "镔": "镔", "镲": "镲", "锧": "锧", "镴": "镴", "铄": "铄", "镳": "镳", "镥": "镥", "镧": "镧", "镵": "镵", "镩": "镩", "銮": "銮", "韪": "韪", "韫": "韫", "韬": "韬", "闬": "闬", "阇": "阇", "阘": "阘", "闿": "闿", "阓": "阓", "阛": "阛", "腼": "腼", "霁": "霁", "雳": "雳", "霭": "霭", "靓": "靓", "飑": "飑", "飒": "飒", "飓": "飓", "飕": "飕", "飙": "飙", "齑": "齑", "于": "于", "鞒": "鞒", "鞑": "鞑", "鞯": "鞯", "韨": "韨", "鞴": "鞴", "顸": "顸", "颀": "颀", "龛": "龛", "颃": "颃", "颌": "颌", "颉": "颉", "颏": "颏", "颒": "颒", "颋": "颋", "颕": "颕", "颔": "颔", "颚": "颚", "颙": "颙", "颛": "颛", "颡": "颡", "颟": "颟", "颢": "颢", "颥": "颥", "颦": "颦", "颞": "颞", "飐": "飐", "飔": "飔", "飖": "飖", "飗": "飗", "饤": "饤", "饦": "饦", "饳": "饳", "饸": "饸", "饹": "饹", "饻": "饻", "馂": "馂", "饾": "饾", "肴": "肴", "馃": "馃", "馉": "馉", "馎": "馎", "馌": "馌", "飨": "飨", "餍": "餍", "鸠": "鸠", "鸢": "鸢", "鸨": "鸨", "鸩": "鸩", "鸪": "鸪", "鸫": "鸫", "鸬": "鸬", "鸲": "鸲", "鸱": "鸱", "鸶": "鸶", "鸸": "鸸", "鸷": "鸷", "鸹": "鸹", "鸺": "鸺", "鸾": "鸾", "鹁": "鹁", "鹂": "鹂", "鹄": "鹄", "鹆": "鹆", "鹇": "鹇", "鹈": "鹈", "鹉": "鹉", "鹋": "鹋", "鹌": "鹌", "鹎": "鹎", "鹑": "鹑", "鹕": "鹕", "鹗": "鹗", "鹚": "鹚", "鹛": "鹛", "鹜": "鹜", "鹞": "鹞", "鹣": "鹣", "鹦": "鹦", "鹧": "鹧", "鹨": "鹨", "鹩": "鹩", "鹪": "鹪", "鹫": "鹫", "鹬": "鹬", "鹱": "鹱", "鹭": "鹭", "鹳": "鹳", "驲": "驲", "骃": "骃", "骎": "骎", "骍": "骍", "骔": "骔", "骙": "骙", "骕": "骕", "骦": "骦", "骉": "骉", "鲠": "鲠", "髅": "髅", "髌": "髌", "髋": "髋", "鬓": "鬓", "郁": "郁", "魉": "魉", "魇": "魇", "鱽": "鱽", "鱾": "鱾", "鲀": "鲀", "鲂": "鲂", "鱿": "鱿", "鲄": "鲄", "麸": "麸", "鲅": "鲅", "鲆": "鲆", "鲌": "鲌", "鲉": "鲉", "鲧": "鲧", "鲏": "鲏", "鲇": "鲇", "鲐": "鲐", "鲋": "鲋", "鲊": "鲊", "鲒": "鲒", "鲘": "鲘", "鲕": "鲕", "鲖": "鲖", "鲔": "鲔", "鲛": "鲛", "鲑": "鲑", "鲓": "鲓", "鲪": "鲪", "鳀": "鳀", "鲝": "鲝", "鲩": "鲩", "鲨": "鲨", "鲬": "鲬", "鲻": "鲻", "鲯": "鲯", "鲭": "鲭", "鲞": "鲞", "鲷": "鲷", "酰": "酰", "鹾": "鹾", "鲴": "鲴", "鲱": "鲱", "鲵": "鲵", "鲲": "鲲", "鲳": "鲳", "鲮": "鲮", "鲰": "鲰", "鲶": "鲶", "鲺": "鲺", "鲹": "鲹", "鲫": "鲫", "鳊": "鳊", "鳈": "鳈", "鲗": "鲗", "鳂": "鳂", "鲽": "鲽", "鳇": "鳇", "鳅": "鳅", "鲾": "鲾", "鳄": "鳄", "鳆": "鳆", "鳁": "鳁", "鳒": "鳒", "鳑": "鳑", "鳋": "鳋", "鲥": "鲥", "鳏": "鳏", "鳎": "鳎", "鳐": "鳐", "鳍": "鳍", "鲢": "鲢", "鳌": "鳌", "鳓": "鳓", "鳘": "鳘", "鲦": "鲦", "鲣": "鲣", "鳗": "鳗", "龀": "龀", "龃": "龃", "龅": "龅", "龆": "龆", "龇": "龇", "龈": "龈", "龉": "龉", "龊": "龊", "龌": "龌", "黾": "黾", "鼋": "鼋", "鼍": "鼍", "鲈": "鲈", "鲎": "鲎", "鲚": "鲚", "鲟": "鲟", "鲡": "鲡", "鲼": "鲼", "鳛": "鳛", "鳔": "鳔", "鳉": "鳉", "鳙": "鳙", "鳕": "鳕", "鳟": "鳟", "鳝": "鳝", "鳜": "鳜", "鲙": "鲙", "鳣": "鳣", "鳡": "鳡", "鳢": "鳢", "鲿": "鲿", "鳠": "鳠", "鹘": "鹘", "黩": "黩", "黪": "黪", "鼹": "鼹", "齄": "齄", "鸤": "鸤", "鸰": "鸰", "鸮": "鸮", "鸴": "鸴", "鸻": "鸻", "鸼": "鸼", "鹀": "鹀", "鹐": "鹐", "鹓": "鹓", "鹍": "鹍", "鹒": "鹒", "鹙": "鹙", "鹖": "鹖", "鸧": "鸧", "鹟": "鹟", "鹠": "鹠", "鹡": "鹡", "鹢": "鹢", "鹝": "鹝", "鹥": "鹥", "鹔": "鹔", "鹯": "鹯", "鹲": "鹲", "鹴": "鹴", "黡": "黡", "鼌": "鼌", "龁": "龁", "龂": "龂", "飚": "飚", "村": "村", "钜": "钜", "㖞": "㖞", "㧑": "㧑", "㧟": "㧟", "㱮": "㱮", "䁖": "䁖", "䇲": "䇲", "䌶": "䌶", "䌷": "䌷", "䌸": "䌸", "䌹": "䌹", "䌺": "䌺", "䍁": "䍁", "䞍": "䞍", "䴓": "䴓", "䴔": "䴔", "䴕": "䴕", "䴖": "䴖", "䴗": "䴗", "䴘": "䴘", "䴙": "䴙", "伣": "伣", "俫": "俫", "刹": "刹", "厐": "厐", "叁": "叁", "呐": "呐", "垅": "垅", "姹": "姹", "弑": "弑", "悮": "悮", "戯": "戯", "捝": "捝", "揾": "揾", "梿": "梿", "棁": "棁", "榅": "榅", "煴": "煴", "疭": "疭", "瞆": "瞆", "祃": "祃", "窎": "窎", "筼": "筼", "肮": "肮", "蔂": "蔂", "蕰": "蕰", "訚": "訚", "迳": "迳", "酂": "酂", "钅": "钅", "锺": "锺", "霡": "霡", "飏": "飏", "饣": "饣", "鲃": "鲃", "鳚": "鳚", "硷": "硷", "耻": "耻", "囱": "囱", "恶": "恶", "珐": "珐", "厩": "厩", "扦": "扦", "瓮": "瓮", "嚣": "嚣", "扎": "扎", "伫": "伫", "谘": "谘", "藁": "藁", "腌": "腌", "腭": "腭", "沓": "沓", "蚝": "蚝", "籼": "籼", "糇": "糇", "隽": "隽", "线": "线", "莅": "莅", "讬": "讬", "䜣": "䜣", "铇": "铇", "眦": "眦", "碱": "碱", "里": "里", "板": "板", "为": "为", "众": "众", "伪": "伪", "偬": "偬", "凄": "凄", "勋": "勋", "卤": "卤", "历": "历", "叠": "叠", "咤": "咤", "哗": "哗", "啮": "啮", "坂": "坂", "埙": "埙", "复": "复", "妫": "妫", "娴": "娴", "岳": "岳", "幂": "幂", "棂": "棂", "沩": "沩", "游": "游", "湿": "湿", "滟": "滟", "疱": "疱", "疴": "疴", "签": "签", "纟": "纟", "绦": "绦", "绱": "绱", "缰": "缰", "艳": "艳", "莼": "莼", "虬": "虬", "袅": "袅", "裥": "裥", "赍": "赍", "里": "里", "鉴": "鉴", "钵": "钵", "锏": "锏", "锨": "锨", "闲": "闲", "霉": "霉", "饥": "饥", "鸴": "鸴", "松": "松", "尝": "尝" };

const rIsChinese = /\p{sc=Han}/u;
function t2s(textStr) {
   if (!config.traditional_to_simple_chinese) {
      return textStr;
   } else if (typeof textStr === "undefined") {
      throw new Error("no input");
   } else if (typeof textStr != "string") {
      throw new Error("input is not string");
   } else if (!textStr.match(rIsChinese)) {
      return textStr;
   }
   var new_textStr = textStr.replace(/\p{sc=Han}/ug, function (m) {
      return t2sArray[m] || m;
   });
   // if (textStr != new_textStr) {
   //    console.log(`${textStr} -> ${new_textStr}`)
   // }
   return new_textStr;
}

function remember_scroll_pos() {
   if (script_initiate_reload) return;
   localStorage.setItem("yPos", window.scrollY);
   localStorage.setItem("last_url", window.location.href);
}

async function restore_scroll_pos() {
   // if (window.scrollY > 0) return;
   let prev_url = localStorage.getItem("last_url", window.location.href);
   if (!prev_url || prev_url !== window.location.href) return;
   let yPos = localStorage.getItem("yPos", window.scrollY);
   if (!yPos || yPos == 0) return;
   window.scrollTo(0, yPos);
}

async function main() {
   let replacements = await promised_replacements
      .catch(err => { config_loader.resetOnError(err) });
   // console.log(`main started in: ${Date.now() - script_start}`);

   let d = config.delay_scroll_on_reload;
   if (d && d >= 0) {
      setTimeout(restore_scroll_pos, config.delay_scroll_on_reload);
   }
   console.log("config loaded!");
   if (!replacements || replacements.size == 0) {
      console.log("no replacements for this site!");
      return;
   }

   observer = new MutationObserver((mutations) => { run_mutations(mutations, replacements); });
   observer.observe(document.body, { childList: true, subtree: true });

   try {
      replaceText(document.body, replacements);
   } catch (err) {
      config_loader.resetOnError(err);
   }

   // earlier we restore jsons from browser storage for fastloading
   if (!config_loader.is_restored) return;
   // if they restored - probably they changed
   config_loader.mode = loader_modes.norestore;
   await builder.build(config.json_url)
      .catch(err => { config_loader.resetOnError(err) });
   if (!config_loader.is_data_updated) return;
   script_initiate_reload = true;
   // if jsons changed - better reload page to start everything again
   location.reload();
}

let config_loader = new ConfigLoader();
let builder = new ConfigBuilder(config_loader);
let promised_replacements = builder.build(config.json_url);
let observer = null;
let script_initiate_reload = false;

function prevent_memory_leak() {
   config_loader = null;
   builder = null;
   promised_replacements = null;
   observer = null;
   script_initiate_reload = null;
}

document.readyState !== 'loading'
   ? main()
   : addEventListener("DOMContentLoaded", main);

addEventListener("beforeunload", prevent_memory_leak);
addEventListener("beforeunload", remember_scroll_pos);